diff --git a/dist-extensions/fabric-extensions.min.js b/dist-extensions/fabric-extensions.min.js index 764c9968f20..988eeca2fa7 100644 --- a/dist-extensions/fabric-extensions.min.js +++ b/dist-extensions/fabric-extensions.min.js @@ -1,2 +1,2 @@ -!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports,require("fabric")):"function"==typeof define&&define.amd?define(["exports","fabric"],e):e((t="undefined"!=typeof globalThis?globalThis:t||self).fabricExtensions={},t.fabric)}(this,function(t,e){"use strict";const n={margin:4,width:1,color:"rgb(255,0,0,0.9)"};function o(t,e){return Math.abs(t-e)}const r=["left","center","right"],i=["top","center","bottom"];function c(t){var e,o;const i=n.margin,{activeObject:c,isScale:s,index:f,point:l,list:d}=t,{dis:u,arr:g}=a(l,d,"x");if(u>i/(null!==(e=null===(o=c.canvas)||void 0===o?void 0:o.getZoom())&&void 0!==e?e:1))return[];let x=g[g.length-1].x-l.x;const h=0==f||3==f?-1:1;x*=h;const{width:p,scaleX:y,left:m}=c,b=c._getTransformedDimensions(),v=(x+b.x)/b.x;s?c.set("scaleX",y*v):c.set("width",p*v);const O=[0,x/2*h,x*h];h<0&&O.reverse();const j=O[r.indexOf(c.originX)];return c.set("left",m+j),c.setCoords(),g.map(t=>({x:t.x,y1:t.y,y2:l.y}))}function s(t){var e,o;const r=n.margin,{activeObject:c,isScale:s,index:f,point:l,list:d}=t,{dis:u,arr:g}=a(l,d,"y");if(u>r/(null!==(e=null===(o=c.canvas)||void 0===o?void 0:o.getZoom())&&void 0!==e?e:1))return[];let x=g[g.length-1].y-l.y;const h=f<2?-1:1;x*=h;const{height:p,scaleY:y,top:m}=c,b=c._getTransformedDimensions(),v=(x+b.y)/b.y;s?c.set("scaleY",y*v):c.set("height",p*v);const O=[0,x/2*h,x*h];h<0&&O.reverse();const j=O[i.indexOf(c.originY)];return c.set("top",m+j),c.setCoords(),g.map(t=>({y:t.y,x1:t.x,x2:l.x}))}function a(t,e,n){let r=1/0,i=[];for(const c of e){const e=o(t[n],c[n]);r>e&&(i=[],r=e),r==e&&i.push(c)}return{dis:r,arr:i}}function f(t,e,o){const{width:r,color:i}=n,c=t.getSelectionContext(),s=t.viewportTransform,a=t.getZoom();c.save(),c.transform(...s),c.lineWidth=r/a,c.strokeStyle=i,c.beginPath(),c.moveTo(e.x,e.y),c.lineTo(o.x,o.y),c.stroke(),d(c,a,e),d(c,a,o),c.restore()}const l=2.4;function d(t,e,n){const o=l/e;t.save(),t.translate(n.x,n.y),t.beginPath(),t.moveTo(-o,-o),t.lineTo(o,o),t.moveTo(o,-o),t.lineTo(-o,o),t.stroke(),t.restore()}function u(t,o){!function(t,e){const{width:o,color:r}=n,i=t.getSelectionContext(),c=t.viewportTransform,s=t.getZoom();i.save(),i.transform(...c),i.lineWidth=o/s,i.strokeStyle=r;for(const t of e)d(i,s,t);i.restore()}(t,o.map(t=>{const n="y2"in t,o=n?t.x:t.x1,r=n?t.y1:t.y;return new e.Point(o,r)}))}function g(t,n){const o=n.x;f(t,new e.Point(o,n.y1),new e.Point(o,n.y2))}function x(t,n){const o=n.y;f(t,new e.Point(n.x1,o),new e.Point(n.x2,o))}function h(t){const n=new Set,o=t.canvas;if(!o)return n;const r=t instanceof e.ActiveSelection?t.getObjects():[t];return o.forEachObject(t=>{t.isOnScreen()&&t.visible&&(t.constructor!=e.Group?n.add(t):y(n,t))}),p(n,r),n}function p(t,n){for(const o of n)o.constructor==e.Group?p(t,o.getObjects()):t.delete(o)}function y(t,n){const o=n.getObjects();for(const n of o)n.visible&&(n.constructor!=e.Group?t.add(n):y(t,n))}function m(t){var e,o;const r=n.margin,{activeObject:i,activeObjectRect:c,objectRect:s}=t,a={target:i,list:v(s),aList:v(c),margin:r/(null!==(e=null===(o=i.canvas)||void 0===o?void 0:o.getZoom())&&void 0!==e?e:1)},f=function(t){const{target:e,list:n,aList:o,margin:r}=t,i=o.map(t=>b(t,n,"x")),c=Math.min(...i.map(t=>t.dis));if(c>r)return[];const s=[],a=o[0].x2-o[0].x,f=o[0].y2-o[0].y;let l=!1;for(let t=0;tt.x-=p)}}return s}(a),l=function(t){const{target:e,list:n,aList:o,margin:r}=t,i=o.map(t=>b(t,n,"y")),c=Math.min(...i.map(t=>t.dis));if(c>r)return[];const s=[],a=o[0].x2-o[0].x,f=o[0].y2-o[0].y;let l=!1;for(let t=0;tt.y-=p)}}return s}(a);return{vLines:f,hLines:l}}function b(t,e,n){let r=1/0,i=-1,c=1;for(let s=0;sa&&(i=s,r=a,c=t[n]>e[s][n]?1:-1)}return{dis:r,index:i,dir:c}}function v(t){const{left:e,top:n,width:o,height:r}=t,i=e+o/2,c=n+r/2;return[{x:e,y:n,x2:e+o,y2:n+r},{x:i,y:c,x2:i,y2:c},{x:e+o,x2:e,y:n+r,y2:n}]}function O(t){const{target:n,centerX:o,centerY:r,width:i,height:c,dir:s}=t;let{x:a,y:f}=t;a-=o*i/2,f-=r*c/2,function(t,e,n){const o=t.translateToCenterPoint(e,"center","center"),r=t.translateToOriginPoint(o,t.originX,t.originY);"x"==n?t.setX(r.x):t.setY(r.y)}(n,new e.Point(a,f),s),n.setCoords()}const j=function(t){let n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"left",o=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"top";return async function(r){const{originX:i=n,originY:c=o}=r;delete r.originX,delete r.originY;for(var s=arguments.length,a=new Array(s>1?s-1:0),f=1;fasync function(n){const{colorStops:o}=n,r=null==o?void 0:o.map(t=>{let{color:n,opacity:o,offset:r}=t;if(void 0===o||1===o)return{color:n,offset:r};return{color:new e.Color(n).setAlpha(o).toRgba(),offset:r}});return await t.call(this,{...n,colorStops:r})},t.initAligningGuidelines=function(t){let o=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};Object.assign(n,o);const r=new Set,i=new Set;let a=!1;const f=new Map,l=t=>{const n=[t.calcTransformMatrix().toString(),t.width,t.height].join(),o=f.get(n);if(o)return o;const r=t.getCoords(),i=[e.util.makeBoundingBoxFromPoints(r),r];return f.set(n,i),i};function d(t){const e=t.target;e.setCoords(),a=!1,i.clear(),r.clear();const n=h(e),o=e.getBoundingRect();for(const t of n){const n=l(t)[0],{vLines:c,hLines:s}=m({activeObject:e,activeObjectRect:o,objectRect:n});c.forEach(t=>{i.add(JSON.stringify(t))}),s.forEach(t=>{r.add(JSON.stringify(t))})}}function p(t){const n=t.target;n.setCoords();const o=String(t.transform.action).startsWith("scale");i.clear(),r.clear();const f=h(n);let d=t.transform.corner;n.flipX&&(d=d.replace("l","r").replace("r","l")),n.flipY&&(d=d.replace("t","b").replace("b","t"));let u=["tl","tr","br","bl","mt","mr","mb","ml"].indexOf(d);if(-1==u)return;if(a=u>3,a){if(n.getTotalAngle()%90!=0)return;u-=4}let g=n.getCoords()[u];for(const t of f){const[a,f]=l(t),d={activeObject:n,point:g,list:[...f,new e.Point(a.left+a.width/2,a.top+a.height/2)],isScale:o,index:u},x=c(d),h=s(d);x.forEach(t=>{i.add(JSON.stringify(t))}),h.forEach(t=>{r.add(JSON.stringify(t))}),(x.length||h.length)&&(g=n.getCoords()[u])}}function y(){t.clearContext(t.contextTop)}function b(){if(a){const e=[];for(const t of i)e.push(JSON.parse(t));for(const t of r)e.push(JSON.parse(t));u(t,e)}else{for(const e of i)g(t,JSON.parse(e));for(const e of r)x(t,JSON.parse(e))}}function v(){i.clear(),r.clear(),f.clear(),t.requestRenderAll()}return t.on("object:resizing",p),t.on("object:scaling",p),t.on("object:moving",d),t.on("before:render",y),t.on("after:render",b),t.on("mouse:up",v),()=>{t.off("object:resizing",p),t.off("object:scaling",p),t.off("object:moving",d),t.off("before:render",y),t.off("after:render",b),t.off("mouse:up",v)}},t.installOriginWrapperUpdater=(t,n)=>{e.BaseFabricObject._fromObject=j(e.BaseFabricObject._fromObject,t,n),e.FabricImage.fromObject=j(e.FabricImage.fromObject,t,n),e.Group.fromObject=j(e.Group.fromObject,t,n)},t.originUpdaterWrapper=j}); +!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports,require("fabric")):"function"==typeof define&&define.amd?define(["exports","fabric"],e):e((t="undefined"!=typeof globalThis?globalThis:t||self).fabricExtensions={},t.fabric)}(this,function(t,e){"use strict";const n={margin:4,width:1,color:"rgb(255,0,0,0.9)"};function o(t,e){return Math.abs(t-e)}const r=["left","center","right"],i=["top","center","bottom"];function c(t){var e,o;const i=n.margin,{activeObject:c,isScale:s,index:f,point:l,list:d}=t,{dis:u,arr:g}=a(l,d,"x");if(u>i/(null!==(e=null===(o=c.canvas)||void 0===o?void 0:o.getZoom())&&void 0!==e?e:1))return[];let x=g[g.length-1].x-l.x;const h=0==f||3==f?-1:1;x*=h;const{width:p,scaleX:m,left:y}=c,b=c._getTransformedDimensions(),v=(x+b.x)/b.x;s?c.set("scaleX",m*v):c.set("width",p*v);const O=[0,x/2*h,x*h];h<0&&O.reverse();const j=O[r.indexOf(c.originX)];return c.set("left",y+j),c.setCoords(),g.map(t=>({x:t.x,y1:t.y,y2:l.y}))}function s(t){var e,o;const r=n.margin,{activeObject:c,isScale:s,index:f,point:l,list:d}=t,{dis:u,arr:g}=a(l,d,"y");if(u>r/(null!==(e=null===(o=c.canvas)||void 0===o?void 0:o.getZoom())&&void 0!==e?e:1))return[];let x=g[g.length-1].y-l.y;const h=f<2?-1:1;x*=h;const{height:p,scaleY:m,top:y}=c,b=c._getTransformedDimensions(),v=(x+b.y)/b.y;s?c.set("scaleY",m*v):c.set("height",p*v);const O=[0,x/2*h,x*h];h<0&&O.reverse();const j=O[i.indexOf(c.originY)];return c.set("top",y+j),c.setCoords(),g.map(t=>({y:t.y,x1:t.x,x2:l.x}))}function a(t,e,n){let r=1/0,i=[];for(const c of e){const e=o(t[n],c[n]);r>e&&(i=[],r=e),r==e&&i.push(c)}return{dis:r,arr:i}}function f(t,e,o){const{width:r,color:i}=n,c=t.getSelectionContext(),s=t.viewportTransform,a=t.getZoom();c.save(),c.transform(...s),c.lineWidth=r/a,c.strokeStyle=i,c.beginPath(),c.moveTo(e.x,e.y),c.lineTo(o.x,o.y),c.stroke(),d(c,a,e),d(c,a,o),c.restore()}const l=2.4;function d(t,e,n){const o=l/e;t.save(),t.translate(n.x,n.y),t.beginPath(),t.moveTo(-o,-o),t.lineTo(o,o),t.moveTo(o,-o),t.lineTo(-o,o),t.stroke(),t.restore()}function u(t,o){!function(t,e){const{width:o,color:r}=n,i=t.getSelectionContext(),c=t.viewportTransform,s=t.getZoom();i.save(),i.transform(...c),i.lineWidth=o/s,i.strokeStyle=r;for(const t of e)d(i,s,t);i.restore()}(t,o.map(t=>{const n="y2"in t,o=n?t.x:t.x1,r=n?t.y1:t.y;return new e.Point(o,r)}))}function g(t,n){const o=n.x;f(t,new e.Point(o,n.y1),new e.Point(o,n.y2))}function x(t,n){const o=n.y;f(t,new e.Point(n.x1,o),new e.Point(n.x2,o))}function h(t){const n=new Set,o=t.canvas;if(!o)return n;const r=t instanceof e.ActiveSelection?t.getObjects():[t];return o.forEachObject(t=>{t.isOnScreen()&&t.visible&&(t.constructor!=e.Group?n.add(t):m(n,t))}),p(n,r),n}function p(t,n){for(const o of n)o.constructor==e.Group?p(t,o.getObjects()):t.delete(o)}function m(t,n){const o=n.getObjects();for(const n of o)n.visible&&(n.constructor!=e.Group?t.add(n):m(t,n))}function y(t){var e,o;const r=n.margin,{activeObject:i,activeObjectRect:c,objectRect:s}=t,a={target:i,list:v(s),aList:v(c),margin:r/(null!==(e=null===(o=i.canvas)||void 0===o?void 0:o.getZoom())&&void 0!==e?e:1)},f=function(t){const{target:e,list:n,aList:o,margin:r}=t,i=o.map(t=>b(t,n,"x")),c=Math.min(...i.map(t=>t.dis));if(c>r)return[];const s=[],a=o[0].x2-o[0].x,f=o[0].y2-o[0].y;let l=!1;for(let t=0;tt.x-=p)}}return s}(a),l=function(t){const{target:e,list:n,aList:o,margin:r}=t,i=o.map(t=>b(t,n,"y")),c=Math.min(...i.map(t=>t.dis));if(c>r)return[];const s=[],a=o[0].x2-o[0].x,f=o[0].y2-o[0].y;let l=!1;for(let t=0;tt.y-=p)}}return s}(a);return{vLines:f,hLines:l}}function b(t,e,n){let r=1/0,i=-1,c=1;for(let s=0;sa&&(i=s,r=a,c=t[n]>e[s][n]?1:-1)}return{dis:r,index:i,dir:c}}function v(t){const{left:e,top:n,width:o,height:r}=t,i=e+o/2,c=n+r/2;return[{x:e,y:n,x2:e+o,y2:n+r},{x:i,y:c,x2:i,y2:c},{x:e+o,x2:e,y:n+r,y2:n}]}function O(t){const{target:n,centerX:o,centerY:r,width:i,height:c,dir:s}=t;let{x:a,y:f}=t;a-=o*i/2,f-=r*c/2,function(t,e,n){const o=t.translateToCenterPoint(e,"center","center"),r=t.translateToOriginPoint(o,t.originX,t.originY);"x"==n?t.setX(r.x):t.setY(r.y)}(n,new e.Point(a,f),s),n.setCoords()}const j=function(t){let n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"left",o=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"top";return async function(r){const{originX:i=n,originY:c=o}=r;delete r.originX,delete r.originY;for(var s=arguments.length,a=new Array(s>1?s-1:0),f=1;fasync function(n){const{colorStops:o}=n,r=null==o?void 0:o.map(t=>{let{color:n,opacity:o,offset:r}=t;if(void 0===o||1===o)return{color:n,offset:r};return{color:new e.Color(n).setAlpha(o).toRgba(),offset:r}});return await t.call(this,{...n,colorStops:r})};t.gradientUpdaterWrapper=w,t.initAligningGuidelines=function(t){let o=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};Object.assign(n,o);const r=new Set,i=new Set;let a=!1;const f=new Map,l=t=>{const n=[t.calcTransformMatrix().toString(),t.width,t.height].join(),o=f.get(n);if(o)return o;const r=t.getCoords(),i=[e.util.makeBoundingBoxFromPoints(r),r];return f.set(n,i),i};function d(t){const e=t.target;e.setCoords(),a=!1,i.clear(),r.clear();const n=h(e),o=e.getBoundingRect();for(const t of n){const n=l(t)[0],{vLines:c,hLines:s}=y({activeObject:e,activeObjectRect:o,objectRect:n});c.forEach(t=>{i.add(JSON.stringify(t))}),s.forEach(t=>{r.add(JSON.stringify(t))})}}function p(t){const n=t.target;n.setCoords();const o=String(t.transform.action).startsWith("scale");i.clear(),r.clear();const f=h(n);let d=t.transform.corner;n.flipX&&(d=d.replace("l","r").replace("r","l")),n.flipY&&(d=d.replace("t","b").replace("b","t"));let u=["tl","tr","br","bl","mt","mr","mb","ml"].indexOf(d);if(-1==u)return;if(a=u>3,a){if(n.getTotalAngle()%90!=0)return;u-=4}let g=n.getCoords()[u];for(const t of f){const[a,f]=l(t),d={activeObject:n,point:g,list:[...f,new e.Point(a.left+a.width/2,a.top+a.height/2)],isScale:o,index:u},x=c(d),h=s(d);x.forEach(t=>{i.add(JSON.stringify(t))}),h.forEach(t=>{r.add(JSON.stringify(t))}),(x.length||h.length)&&(g=n.getCoords()[u])}}function m(){t.clearContext(t.contextTop)}function b(){if(a){const e=[];for(const t of i)e.push(JSON.parse(t));for(const t of r)e.push(JSON.parse(t));u(t,e)}else{for(const e of i)g(t,JSON.parse(e));for(const e of r)x(t,JSON.parse(e))}}function v(){i.clear(),r.clear(),f.clear(),t.requestRenderAll()}return t.on("object:resizing",p),t.on("object:scaling",p),t.on("object:moving",d),t.on("before:render",m),t.on("after:render",b),t.on("mouse:up",v),()=>{t.off("object:resizing",p),t.off("object:scaling",p),t.off("object:moving",d),t.off("before:render",m),t.off("after:render",b),t.off("mouse:up",v)}},t.installGradientUpdater=()=>{e.Gradient.fromObject=w(e.Gradient.fromObject)},t.installOriginWrapperUpdater=(t,n)=>{e.BaseFabricObject._fromObject=j(e.BaseFabricObject._fromObject,t,n),e.FabricImage.fromObject=j(e.FabricImage.fromObject,t,n),e.Group.fromObject=j(e.Group.fromObject,t,n)},t.originUpdaterWrapper=j}); //# sourceMappingURL=fabric-extensions.min.js.map diff --git a/dist-extensions/fabric-extensions.min.js.map b/dist-extensions/fabric-extensions.min.js.map index 7d8023d7062..743d0dac386 100644 --- a/dist-extensions/fabric-extensions.min.js.map +++ b/dist-extensions/fabric-extensions.min.js.map @@ -1 +1 @@ -{"version":3,"file":"fabric-extensions.min.js","sources":["../extensions/aligning_guidelines/constant.ts","../extensions/aligning_guidelines/util/basic.ts","../extensions/aligning_guidelines/util/collect-point.ts","../extensions/aligning_guidelines/util/draw.ts","../extensions/aligning_guidelines/util/get-objects-by-target.ts","../extensions/aligning_guidelines/util/collect-line.ts","../extensions/data_updaters/origins/index.ts","../extensions/data_updaters/gradient/index.ts","../extensions/aligning_guidelines/index.ts"],"sourcesContent":["import type { AligningLineConfig } from './typedefs';\n\nexport const aligningLineConfig: AligningLineConfig = {\n /** At what distance from the shape does alignment begin? */\n margin: 4,\n /** Aligning line dimensions */\n width: 1,\n /** Aligning line color */\n color: 'rgb(255,0,0,0.9)',\n};\n","import type { FabricObject, Point } from 'fabric';\n\nexport function getDistance(a: number, b: number) {\n return Math.abs(a - b);\n}\n\nexport function setPositionDir(\n target: FabricObject,\n pos: Point,\n dir: 'x' | 'y',\n) {\n const center = target.translateToCenterPoint(pos, 'center', 'center');\n const position = target.translateToOriginPoint(\n center,\n target.originX,\n target.originY,\n );\n if (dir == 'x') target.setX(position.x);\n else target.setY(position.y);\n}\n","import type { FabricObject, Point, TOriginX, TOriginY } from 'fabric';\nimport { aligningLineConfig } from '../constant';\nimport { getDistance } from './basic';\n\ntype CollectPointProps = {\n activeObject: FabricObject;\n point: Point;\n list: Point[];\n isScale: boolean;\n index: number;\n};\nconst originXArr: TOriginX[] = ['left', 'center', 'right'];\nconst originYArr: TOriginY[] = ['top', 'center', 'bottom'];\n\nexport function collectVerticalPoint(props: CollectPointProps) {\n const aligningLineMargin = aligningLineConfig.margin;\n const { activeObject, isScale, index, point, list } = props;\n const { dis, arr } = getDistanceList(point, list, 'x');\n const margin = aligningLineMargin / (activeObject.canvas?.getZoom() ?? 1);\n if (dis > margin) return [];\n let v = arr[arr.length - 1].x - point.x;\n const dir = index == 0 || index == 3 ? -1 : 1;\n v *= dir;\n\n const { width, scaleX, left } = activeObject;\n const dim = activeObject._getTransformedDimensions();\n const sx = (v + dim.x) / dim.x;\n if (isScale) activeObject.set('scaleX', scaleX * sx);\n else activeObject.set('width', width * sx);\n const dArr = [0, (v / 2) * dir, v * dir];\n if (dir < 0) dArr.reverse();\n const d = dArr[originXArr.indexOf(activeObject.originX)];\n activeObject.set('left', left + d);\n activeObject.setCoords();\n return arr.map((item) => ({\n x: item.x,\n y1: item.y,\n y2: point.y,\n }));\n}\n\nexport function collectHorizontalPoint(props: CollectPointProps) {\n const aligningLineMargin = aligningLineConfig.margin;\n const { activeObject, isScale, index, point, list } = props;\n const { dis, arr } = getDistanceList(point, list, 'y');\n const margin = aligningLineMargin / (activeObject.canvas?.getZoom() ?? 1);\n if (dis > margin) return [];\n let v = arr[arr.length - 1].y - point.y;\n const dir = index < 2 ? -1 : 1;\n v *= dir;\n\n const { height, scaleY, top } = activeObject;\n const dim = activeObject._getTransformedDimensions();\n const sy = (v + dim.y) / dim.y;\n if (isScale) activeObject.set('scaleY', scaleY * sy);\n else activeObject.set('height', height * sy);\n const dArr = [0, (v / 2) * dir, v * dir];\n if (dir < 0) dArr.reverse();\n const d = dArr[originYArr.indexOf(activeObject.originY)];\n activeObject.set('top', top + d);\n activeObject.setCoords();\n return arr.map((item) => ({\n y: item.y,\n x1: item.x,\n x2: point.x,\n }));\n}\n\nfunction getDistanceList(point: Point, list: Point[], type: 'x' | 'y') {\n let dis = Infinity;\n let arr: Point[] = [];\n for (const item of list) {\n const v = getDistance(point[type], item[type]);\n if (dis > v) {\n arr = [];\n dis = v;\n }\n if (dis == v) {\n arr.push(item);\n }\n }\n return { dis, arr };\n}\n","import type { Canvas } from 'fabric';\nimport { Point } from 'fabric';\nimport type { HorizontalLine, VerticalLine } from '../typedefs';\nimport { aligningLineConfig } from '../constant';\n\nfunction drawLine(canvas: Canvas, origin: Point, target: Point) {\n const { width, color } = aligningLineConfig;\n const ctx = canvas.getSelectionContext();\n const viewportTransform = canvas.viewportTransform;\n const zoom = canvas.getZoom();\n ctx.save();\n ctx.transform(...viewportTransform);\n ctx.lineWidth = width / zoom;\n ctx.strokeStyle = color;\n ctx.beginPath();\n ctx.moveTo(origin.x, origin.y);\n ctx.lineTo(target.x, target.y);\n ctx.stroke();\n drawX(ctx, zoom, origin);\n drawX(ctx, zoom, target);\n ctx.restore();\n}\n\nconst xSize = 2.4;\nfunction drawX(ctx: CanvasRenderingContext2D, zoom: number, point: Point) {\n const size = xSize / zoom;\n ctx.save();\n ctx.translate(point.x, point.y);\n ctx.beginPath();\n ctx.moveTo(-size, -size);\n ctx.lineTo(size, size);\n ctx.moveTo(size, -size);\n ctx.lineTo(-size, size);\n ctx.stroke();\n ctx.restore();\n}\nfunction drawPoint(canvas: Canvas, arr: Point[]) {\n const { width, color } = aligningLineConfig;\n const ctx = canvas.getSelectionContext();\n const viewportTransform = canvas.viewportTransform;\n const zoom = canvas.getZoom();\n ctx.save();\n ctx.transform(...viewportTransform);\n ctx.lineWidth = width / zoom;\n ctx.strokeStyle = color;\n for (const item of arr) drawX(ctx, zoom, item);\n ctx.restore();\n}\nexport function drawPointList(\n canvas: Canvas,\n list: Array,\n) {\n const arr = list.map((item) => {\n const isVertical = 'y2' in item;\n const x = isVertical ? item.x : item.x1;\n const y = isVertical ? item.y1 : item.y;\n return new Point(x, y);\n });\n drawPoint(canvas, arr);\n}\n\nexport function drawVerticalLine(canvas: Canvas, coords: VerticalLine) {\n const x = coords.x;\n const origin = new Point(x, coords.y1);\n const target = new Point(x, coords.y2);\n drawLine(canvas, origin, target);\n}\n\nexport function drawHorizontalLine(canvas: Canvas, coords: HorizontalLine) {\n const y = coords.y;\n const origin = new Point(coords.x1, y);\n const target = new Point(coords.x2, y);\n drawLine(canvas, origin, target);\n}\n","import type { FabricObject } from 'fabric';\nimport { ActiveSelection, Group } from 'fabric';\n\nexport function getObjectsByTarget(target: FabricObject) {\n const objects = new Set();\n const canvas = target.canvas;\n if (!canvas) return objects;\n const children =\n target instanceof ActiveSelection ? target.getObjects() : [target];\n\n canvas.forEachObject((o) => {\n if (!o.isOnScreen()) return;\n if (!o.visible) return;\n if (o.constructor == Group) {\n collectObjectsByGroup(objects, o);\n return;\n }\n objects.add(o);\n });\n\n deleteObjectsByList(objects, children);\n return objects;\n}\n\nfunction deleteObjectsByList(objects: Set, list: FabricObject[]) {\n for (const target of list) {\n if (target.constructor == Group) {\n deleteObjectsByList(objects, (target as Group).getObjects());\n } else {\n objects.delete(target);\n }\n }\n}\n\nfunction collectObjectsByGroup(objects: Set, g: Group) {\n const children = g.getObjects();\n for (const child of children) {\n if (!child.visible) continue;\n if (child.constructor == Group) {\n collectObjectsByGroup(objects, child);\n continue;\n }\n objects.add(child);\n }\n}\n","import type { FabricObject, TBBox } from 'fabric';\nimport { Point } from 'fabric';\nimport type { HorizontalLine, VerticalLine } from '../typedefs';\nimport { aligningLineConfig } from '../constant';\nimport { getDistance, setPositionDir } from './basic';\n\ntype CollectLineProps = {\n activeObject: FabricObject;\n activeObjectRect: TBBox;\n objectRect: TBBox;\n};\n\nexport function collectLine(props: CollectLineProps) {\n const aligningLineMargin = aligningLineConfig.margin;\n const { activeObject, activeObjectRect, objectRect } = props;\n const list = makeLineByRect(objectRect);\n const aList = makeLineByRect(activeObjectRect);\n const margin = aligningLineMargin / (activeObject.canvas?.getZoom() ?? 1);\n const opts = { target: activeObject, list, aList, margin };\n const vLines = collectVerticalLine(opts);\n const hLines = collectHorizontalLine(opts);\n\n return { vLines, hLines };\n}\n\ntype CollectItemLineProps = {\n target: FabricObject;\n list: LineProps[];\n aList: LineProps[];\n margin: number;\n};\nfunction collectVerticalLine(props: CollectItemLineProps) {\n const { target, list, aList, margin } = props;\n\n const arr = aList.map((x) => getDistanceLine(x, list, 'x'));\n const min = Math.min(...arr.map((x) => x.dis));\n if (min > margin) return [];\n const lines: VerticalLine[] = [];\n const width = aList[0].x2 - aList[0].x;\n const height = aList[0].y2 - aList[0].y;\n let b = false;\n for (let i = 0; i < arr.length; i++) {\n const item = arr[i];\n if (min == item.dis) {\n const line = list[item.index];\n const aLine = aList[item.index];\n const x = line.x;\n const y = aLine.y;\n\n const y1 = Math.min(line.y, line.y2, y, aLine.y2);\n const y2 = Math.max(line.y, line.y2, y, aLine.y2);\n // 参考线可画多条\n lines.push({ x, y1, y2 });\n if (b) continue;\n b = true;\n // 对齐只进行一次\n setPos({\n target,\n x,\n y,\n centerX: i - 1,\n centerY: item.index - 1,\n width,\n height,\n dir: 'x',\n });\n const dis = min * item.dir;\n aList.forEach((x) => (x.x -= dis));\n }\n }\n return lines;\n}\n\nfunction collectHorizontalLine(props: CollectItemLineProps) {\n const { target, list, aList, margin } = props;\n\n const arr = aList.map((x) => getDistanceLine(x, list, 'y'));\n const min = Math.min(...arr.map((x) => x.dis));\n if (min > margin) return [];\n const lines: HorizontalLine[] = [];\n const width = aList[0].x2 - aList[0].x;\n const height = aList[0].y2 - aList[0].y;\n let b = false;\n for (let i = 0; i < arr.length; i++) {\n const item = arr[i];\n if (min == item.dis) {\n const line = list[item.index];\n const aLine = aList[item.index];\n const y = line.y;\n const x = aLine.x;\n\n const x1 = Math.min(line.x, line.x2, x, aLine.x2);\n const x2 = Math.max(line.x, line.x2, x, aLine.x2);\n // 参考线可画多条\n lines.push({ y, x1, x2 });\n if (b) continue;\n b = true;\n // 对齐只进行一次\n setPos({\n target,\n x,\n y,\n centerX: item.index - 1,\n centerY: i - 1,\n width,\n height,\n dir: 'y',\n });\n const dis = min * item.dir;\n aList.forEach((x) => (x.y -= dis));\n }\n }\n return lines;\n}\n\ntype LineProps = {\n x: number;\n y: number;\n x2: number;\n y2: number;\n};\nfunction getDistanceLine(\n target: LineProps,\n list: LineProps[],\n type: 'x' | 'y',\n) {\n let dis = Infinity;\n let index = -1;\n /** 1正值 -1负值 */\n let dir = 1;\n for (let i = 0; i < list.length; i++) {\n const v = getDistance(target[type], list[i][type]);\n if (dis > v) {\n index = i;\n dis = v;\n dir = target[type] > list[i][type] ? 1 : -1;\n }\n }\n return { dis, index, dir };\n}\n\nfunction makeLineByRect(rect: TBBox) {\n const { left, top, width, height } = rect;\n const a = { x: left, y: top, x2: left + width, y2: top + height };\n const x = left + width / 2;\n const y = top + height / 2;\n const b = { x, y, x2: x, y2: y };\n const c = { x: left + width, x2: left, y: top + height, y2: top };\n\n return [a, b, c];\n}\n\ntype SnapToPixelProps = {\n target: FabricObject;\n x: number;\n y: number;\n /** -1 0 1 */\n centerX: number;\n /** -1 0 1 */\n centerY: number;\n width: number;\n height: number;\n dir: 'x' | 'y';\n};\nfunction setPos(props: SnapToPixelProps) {\n const { target, centerX, centerY, width, height, dir } = props;\n let { x, y } = props;\n x -= (centerX * width) / 2;\n y -= (centerY * height) / 2;\n setPositionDir(target, new Point(x, y), dir);\n target.setCoords();\n}\n","import {\n Point,\n FabricImage,\n Group,\n BaseFabricObject,\n type FabricObject,\n type TOriginX,\n type TOriginY,\n} from 'fabric';\n\n/**\n * Updates the fromObject function of a class to return a version that can restore old data\n * with values of originX and originY that are different from 'center', 'center'\n * Used to upgrade from fabric 6 to fabric 7\n * @param originalFn the original fromObject function of an object,\n * @param defaultOriginX optional default value for non exported originX,\n * @param defaultOriginY optional default value for non exported originY,\n * @returns a wrapped fromObject function for the object\n */\nexport const originUpdaterWrapper = (\n originalFn: (...args: any[]) => Promise,\n defaultOriginX: TOriginX = 'left',\n defaultOriginY: TOriginY = 'top',\n): ((...args: any[]) => Promise) =>\n async function (this: T, serializedObject, ...args) {\n // we default to left and top because those are defaults before deprecation\n const { originX = defaultOriginX, originY = defaultOriginY } =\n serializedObject;\n // and we do not want to pass those properties on the object anymore\n delete serializedObject.originX;\n delete serializedObject.originY;\n const originalObject = await originalFn.call(\n this,\n serializedObject,\n ...args,\n );\n const actualPosition = new Point(originalObject.left, originalObject.top);\n originalObject.setPositionByOrigin(actualPosition, originX, originY);\n return originalObject;\n };\n\n/**\n * Wraps and override the current fabricJS fromObject static functions\n * Used to upgrade from fabric 7 to fabric 8\n * If you used to export with includeDefaultValues = false, you have to specify\n * which were yours default origins values\n * @param originX optional default value for non exported originX,\n * @param originY optional default value for non exported originY,\n */\nexport const installOriginWrapperUpdater = (\n originX?: TOriginX,\n originY?: TOriginY,\n) => {\n // @ts-expect-error the _fromObject parameter could be instantiated differently\n BaseFabricObject._fromObject = originUpdaterWrapper(\n BaseFabricObject._fromObject,\n originX,\n originY,\n );\n // FabricImage and Group do not use _fromObject\n FabricImage.fromObject = originUpdaterWrapper(\n FabricImage.fromObject,\n originX,\n originY,\n );\n Group.fromObject = originUpdaterWrapper(\n Group.fromObject,\n originX,\n originY,\n );\n};\n","import type { GradientOptions, ColorStop } from 'fabric';\nimport { Color, Gradient } from 'fabric';\n\n/**\n * Updates the fromObject function of a Gradient to return a version that can restore old data\n * with opactiy in color Stops\n * Used to upgrade from fabric 6 to fabric 7\n * @param originalFn the original fromObject function of an object,\n * @returns a wrapped fromObject function for the object\n */\n\ntype OldColorStop = ColorStop & {\n opacity?: number;\n};\n\nexport const gradientUpdaterWrapper = = Gradient>(\n originalFn: (\n options: GradientOptions<'linear'> | GradientOptions<'radial'>,\n ) => Promise,\n): ((\n options: GradientOptions<'linear'> | GradientOptions<'radial'>,\n) => Promise) =>\n async function (this: T, serializedGradient) {\n // we default to left and top because those are defaults before deprecation\n const { colorStops } = serializedGradient;\n // and we do not want to pass those properties on the object anymore\n const newColorStops: ColorStop[] = (\n colorStops as OldColorStop[]\n )?.map(({ color, opacity, offset }) => {\n if (opacity === undefined || opacity === 1) {\n return {\n color,\n offset,\n };\n }\n const col = new Color(color).setAlpha(opacity).toRgba();\n return {\n color: col,\n offset,\n };\n });\n const gradient = await originalFn.call(this, {\n ...serializedGradient,\n colorStops: newColorStops,\n });\n return gradient;\n };\n\n/**\n * Wraps and override the current fabricJS fromObject static functions\n * Used to upgrade from fabric 7 to fabric 8\n * If you used to export with includeDefaultValues = false, you have to specify\n * which were yours default origins values\n */\nexport const installGradientUpdater = () => {\n // @ts-expect-error untypable\n Gradient.fromObject = gradientUpdaterWrapper(Gradient.fromObject);\n};\n","import type {\n BasicTransformEvent,\n Canvas,\n FabricObject,\n TBBox,\n TPointerEvent,\n} from 'fabric';\nimport { Point, util } from 'fabric';\nimport {\n collectHorizontalPoint,\n collectVerticalPoint,\n} from './util/collect-point';\nimport {\n drawHorizontalLine,\n drawPointList,\n drawVerticalLine,\n} from './util/draw';\nimport { getObjectsByTarget } from './util/get-objects-by-target';\nimport { collectLine } from './util/collect-line';\nimport type {\n AligningLineConfig,\n HorizontalLine,\n VerticalLine,\n} from './typedefs';\nimport { aligningLineConfig } from './constant';\n\ntype TransformEvent = BasicTransformEvent & {\n target: FabricObject;\n};\n\nexport type { AligningLineConfig } from './typedefs';\n\nexport function initAligningGuidelines(\n canvas: Canvas,\n options: Partial = {},\n) {\n Object.assign(aligningLineConfig, options);\n\n const horizontalLines = new Set();\n const verticalLines = new Set();\n let onlyDrawPoint = false;\n const cacheMap = new Map();\n\n const getCaCheMapValue = (object: FabricObject) => {\n const cacheKey = [\n object.calcTransformMatrix().toString(),\n object.width,\n object.height,\n ].join();\n const cacheValue = cacheMap.get(cacheKey);\n if (cacheValue) return cacheValue;\n const coords = object.getCoords();\n const rect = util.makeBoundingBoxFromPoints(coords);\n const value: [TBBox, Point[]] = [rect, coords];\n cacheMap.set(cacheKey, value);\n return value;\n };\n\n function moving(e: TransformEvent) {\n const activeObject = e.target;\n activeObject.setCoords();\n onlyDrawPoint = false;\n verticalLines.clear();\n horizontalLines.clear();\n\n const objects = getObjectsByTarget(activeObject);\n const activeObjectRect = activeObject.getBoundingRect();\n\n for (const object of objects) {\n const objectRect = getCaCheMapValue(object)[0];\n const { vLines, hLines } = collectLine({\n activeObject,\n activeObjectRect,\n objectRect,\n });\n vLines.forEach((o) => {\n verticalLines.add(JSON.stringify(o));\n });\n hLines.forEach((o) => {\n horizontalLines.add(JSON.stringify(o));\n });\n }\n }\n\n function scalingOrResizing(e: TransformEvent) {\n // br bl tr tl mb ml mt mr\n const activeObject = e.target;\n activeObject.setCoords();\n const isScale = String(e.transform.action).startsWith('scale');\n verticalLines.clear();\n horizontalLines.clear();\n\n const objects = getObjectsByTarget(activeObject);\n let corner = e.transform.corner;\n if (activeObject.flipX) corner = corner.replace('l', 'r').replace('r', 'l');\n if (activeObject.flipY) corner = corner.replace('t', 'b').replace('b', 't');\n let index = ['tl', 'tr', 'br', 'bl', 'mt', 'mr', 'mb', 'ml'].indexOf(\n corner,\n );\n if (index == -1) return;\n onlyDrawPoint = index > 3;\n if (onlyDrawPoint) {\n const angle = activeObject.getTotalAngle();\n if (angle % 90 != 0) return;\n index -= 4;\n }\n let point = activeObject.getCoords()[index];\n for (const object of objects) {\n const [rect, coords] = getCaCheMapValue(object);\n const center = new Point(\n rect.left + rect.width / 2,\n rect.top + rect.height / 2,\n );\n const list = [...coords, center];\n const props = { activeObject, point, list, isScale, index };\n const vLines = collectVerticalPoint(props);\n const hLines = collectHorizontalPoint(props);\n vLines.forEach((o) => {\n verticalLines.add(JSON.stringify(o));\n });\n hLines.forEach((o) => {\n horizontalLines.add(JSON.stringify(o));\n });\n if (vLines.length || hLines.length)\n point = activeObject.getCoords()[index];\n }\n }\n\n function beforeRender() {\n canvas.clearContext(canvas.contextTop);\n }\n function afterRender() {\n if (onlyDrawPoint) {\n const list: Array = [];\n for (const v of verticalLines) list.push(JSON.parse(v));\n for (const h of horizontalLines) list.push(JSON.parse(h));\n drawPointList(canvas, list);\n } else {\n for (const v of verticalLines) drawVerticalLine(canvas, JSON.parse(v));\n for (const h of horizontalLines)\n drawHorizontalLine(canvas, JSON.parse(h));\n }\n }\n function mouseUp() {\n verticalLines.clear();\n horizontalLines.clear();\n cacheMap.clear();\n canvas.requestRenderAll();\n }\n\n canvas.on('object:resizing', scalingOrResizing);\n canvas.on('object:scaling', scalingOrResizing);\n canvas.on('object:moving', moving);\n canvas.on('before:render', beforeRender);\n canvas.on('after:render', afterRender);\n canvas.on('mouse:up', mouseUp);\n\n return () => {\n canvas.off('object:resizing', scalingOrResizing);\n canvas.off('object:scaling', scalingOrResizing);\n canvas.off('object:moving', moving);\n canvas.off('before:render', beforeRender);\n canvas.off('after:render', afterRender);\n canvas.off('mouse:up', mouseUp);\n };\n}\n"],"names":["aligningLineConfig","margin","width","color","getDistance","a","b","Math","abs","originXArr","originYArr","collectVerticalPoint","props","_activeObject$canvas$","_activeObject$canvas","aligningLineMargin","activeObject","isScale","index","point","list","dis","arr","getDistanceList","canvas","getZoom","v","length","x","dir","scaleX","left","dim","_getTransformedDimensions","sx","set","dArr","reverse","d","indexOf","originX","setCoords","map","item","y1","y","y2","collectHorizontalPoint","_activeObject$canvas$2","_activeObject$canvas2","height","scaleY","top","sy","originY","x1","x2","type","Infinity","push","drawLine","origin","target","ctx","getSelectionContext","viewportTransform","zoom","save","transform","lineWidth","strokeStyle","beginPath","moveTo","lineTo","stroke","drawX","restore","xSize","size","translate","drawPointList","drawPoint","isVertical","Point","drawVerticalLine","coords","drawHorizontalLine","getObjectsByTarget","objects","Set","children","ActiveSelection","getObjects","forEachObject","o","isOnScreen","visible","constructor","Group","add","collectObjectsByGroup","deleteObjectsByList","delete","g","child","collectLine","activeObjectRect","objectRect","opts","makeLineByRect","aList","vLines","getDistanceLine","min","lines","i","line","aLine","max","setPos","centerX","centerY","forEach","collectVerticalLine","hLines","collectHorizontalLine","rect","pos","center","translateToCenterPoint","position","translateToOriginPoint","setX","setY","setPositionDir","originUpdaterWrapper","originalFn","defaultOriginX","arguments","undefined","defaultOriginY","async","serializedObject","_len","args","Array","_key","originalObject","call","this","actualPosition","setPositionByOrigin","serializedGradient","colorStops","newColorStops","_ref","opacity","offset","Color","setAlpha","toRgba","options","Object","assign","horizontalLines","verticalLines","onlyDrawPoint","cacheMap","Map","getCaCheMapValue","object","cacheKey","calcTransformMatrix","toString","join","cacheValue","get","getCoords","value","util","makeBoundingBoxFromPoints","moving","e","clear","getBoundingRect","JSON","stringify","scalingOrResizing","String","action","startsWith","corner","flipX","replace","flipY","getTotalAngle","beforeRender","clearContext","contextTop","afterRender","parse","h","mouseUp","requestRenderAll","on","off","installOriginWrapperUpdater","BaseFabricObject","_fromObject","FabricImage","fromObject"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"fabric-extensions.min.js","sources":["../extensions/aligning_guidelines/constant.ts","../extensions/aligning_guidelines/util/basic.ts","../extensions/aligning_guidelines/util/collect-point.ts","../extensions/aligning_guidelines/util/draw.ts","../extensions/aligning_guidelines/util/get-objects-by-target.ts","../extensions/aligning_guidelines/util/collect-line.ts","../extensions/data_updaters/origins/index.ts","../extensions/data_updaters/gradient/index.ts","../extensions/aligning_guidelines/index.ts"],"sourcesContent":["import type { AligningLineConfig } from './typedefs';\n\nexport const aligningLineConfig: AligningLineConfig = {\n /** At what distance from the shape does alignment begin? */\n margin: 4,\n /** Aligning line dimensions */\n width: 1,\n /** Aligning line color */\n color: 'rgb(255,0,0,0.9)',\n};\n","import type { FabricObject, Point } from 'fabric';\n\nexport function getDistance(a: number, b: number) {\n return Math.abs(a - b);\n}\n\nexport function setPositionDir(\n target: FabricObject,\n pos: Point,\n dir: 'x' | 'y',\n) {\n const center = target.translateToCenterPoint(pos, 'center', 'center');\n const position = target.translateToOriginPoint(\n center,\n target.originX,\n target.originY,\n );\n if (dir == 'x') target.setX(position.x);\n else target.setY(position.y);\n}\n","import type { FabricObject, Point, TOriginX, TOriginY } from 'fabric';\nimport { aligningLineConfig } from '../constant';\nimport { getDistance } from './basic';\n\ntype CollectPointProps = {\n activeObject: FabricObject;\n point: Point;\n list: Point[];\n isScale: boolean;\n index: number;\n};\nconst originXArr: TOriginX[] = ['left', 'center', 'right'];\nconst originYArr: TOriginY[] = ['top', 'center', 'bottom'];\n\nexport function collectVerticalPoint(props: CollectPointProps) {\n const aligningLineMargin = aligningLineConfig.margin;\n const { activeObject, isScale, index, point, list } = props;\n const { dis, arr } = getDistanceList(point, list, 'x');\n const margin = aligningLineMargin / (activeObject.canvas?.getZoom() ?? 1);\n if (dis > margin) return [];\n let v = arr[arr.length - 1].x - point.x;\n const dir = index == 0 || index == 3 ? -1 : 1;\n v *= dir;\n\n const { width, scaleX, left } = activeObject;\n const dim = activeObject._getTransformedDimensions();\n const sx = (v + dim.x) / dim.x;\n if (isScale) activeObject.set('scaleX', scaleX * sx);\n else activeObject.set('width', width * sx);\n const dArr = [0, (v / 2) * dir, v * dir];\n if (dir < 0) dArr.reverse();\n const d = dArr[originXArr.indexOf(activeObject.originX)];\n activeObject.set('left', left + d);\n activeObject.setCoords();\n return arr.map((item) => ({\n x: item.x,\n y1: item.y,\n y2: point.y,\n }));\n}\n\nexport function collectHorizontalPoint(props: CollectPointProps) {\n const aligningLineMargin = aligningLineConfig.margin;\n const { activeObject, isScale, index, point, list } = props;\n const { dis, arr } = getDistanceList(point, list, 'y');\n const margin = aligningLineMargin / (activeObject.canvas?.getZoom() ?? 1);\n if (dis > margin) return [];\n let v = arr[arr.length - 1].y - point.y;\n const dir = index < 2 ? -1 : 1;\n v *= dir;\n\n const { height, scaleY, top } = activeObject;\n const dim = activeObject._getTransformedDimensions();\n const sy = (v + dim.y) / dim.y;\n if (isScale) activeObject.set('scaleY', scaleY * sy);\n else activeObject.set('height', height * sy);\n const dArr = [0, (v / 2) * dir, v * dir];\n if (dir < 0) dArr.reverse();\n const d = dArr[originYArr.indexOf(activeObject.originY)];\n activeObject.set('top', top + d);\n activeObject.setCoords();\n return arr.map((item) => ({\n y: item.y,\n x1: item.x,\n x2: point.x,\n }));\n}\n\nfunction getDistanceList(point: Point, list: Point[], type: 'x' | 'y') {\n let dis = Infinity;\n let arr: Point[] = [];\n for (const item of list) {\n const v = getDistance(point[type], item[type]);\n if (dis > v) {\n arr = [];\n dis = v;\n }\n if (dis == v) {\n arr.push(item);\n }\n }\n return { dis, arr };\n}\n","import type { Canvas } from 'fabric';\nimport { Point } from 'fabric';\nimport type { HorizontalLine, VerticalLine } from '../typedefs';\nimport { aligningLineConfig } from '../constant';\n\nfunction drawLine(canvas: Canvas, origin: Point, target: Point) {\n const { width, color } = aligningLineConfig;\n const ctx = canvas.getSelectionContext();\n const viewportTransform = canvas.viewportTransform;\n const zoom = canvas.getZoom();\n ctx.save();\n ctx.transform(...viewportTransform);\n ctx.lineWidth = width / zoom;\n ctx.strokeStyle = color;\n ctx.beginPath();\n ctx.moveTo(origin.x, origin.y);\n ctx.lineTo(target.x, target.y);\n ctx.stroke();\n drawX(ctx, zoom, origin);\n drawX(ctx, zoom, target);\n ctx.restore();\n}\n\nconst xSize = 2.4;\nfunction drawX(ctx: CanvasRenderingContext2D, zoom: number, point: Point) {\n const size = xSize / zoom;\n ctx.save();\n ctx.translate(point.x, point.y);\n ctx.beginPath();\n ctx.moveTo(-size, -size);\n ctx.lineTo(size, size);\n ctx.moveTo(size, -size);\n ctx.lineTo(-size, size);\n ctx.stroke();\n ctx.restore();\n}\nfunction drawPoint(canvas: Canvas, arr: Point[]) {\n const { width, color } = aligningLineConfig;\n const ctx = canvas.getSelectionContext();\n const viewportTransform = canvas.viewportTransform;\n const zoom = canvas.getZoom();\n ctx.save();\n ctx.transform(...viewportTransform);\n ctx.lineWidth = width / zoom;\n ctx.strokeStyle = color;\n for (const item of arr) drawX(ctx, zoom, item);\n ctx.restore();\n}\nexport function drawPointList(\n canvas: Canvas,\n list: Array,\n) {\n const arr = list.map((item) => {\n const isVertical = 'y2' in item;\n const x = isVertical ? item.x : item.x1;\n const y = isVertical ? item.y1 : item.y;\n return new Point(x, y);\n });\n drawPoint(canvas, arr);\n}\n\nexport function drawVerticalLine(canvas: Canvas, coords: VerticalLine) {\n const x = coords.x;\n const origin = new Point(x, coords.y1);\n const target = new Point(x, coords.y2);\n drawLine(canvas, origin, target);\n}\n\nexport function drawHorizontalLine(canvas: Canvas, coords: HorizontalLine) {\n const y = coords.y;\n const origin = new Point(coords.x1, y);\n const target = new Point(coords.x2, y);\n drawLine(canvas, origin, target);\n}\n","import type { FabricObject } from 'fabric';\nimport { ActiveSelection, Group } from 'fabric';\n\nexport function getObjectsByTarget(target: FabricObject) {\n const objects = new Set();\n const canvas = target.canvas;\n if (!canvas) return objects;\n const children =\n target instanceof ActiveSelection ? target.getObjects() : [target];\n\n canvas.forEachObject((o) => {\n if (!o.isOnScreen()) return;\n if (!o.visible) return;\n if (o.constructor == Group) {\n collectObjectsByGroup(objects, o);\n return;\n }\n objects.add(o);\n });\n\n deleteObjectsByList(objects, children);\n return objects;\n}\n\nfunction deleteObjectsByList(objects: Set, list: FabricObject[]) {\n for (const target of list) {\n if (target.constructor == Group) {\n deleteObjectsByList(objects, (target as Group).getObjects());\n } else {\n objects.delete(target);\n }\n }\n}\n\nfunction collectObjectsByGroup(objects: Set, g: Group) {\n const children = g.getObjects();\n for (const child of children) {\n if (!child.visible) continue;\n if (child.constructor == Group) {\n collectObjectsByGroup(objects, child);\n continue;\n }\n objects.add(child);\n }\n}\n","import type { FabricObject, TBBox } from 'fabric';\nimport { Point } from 'fabric';\nimport type { HorizontalLine, VerticalLine } from '../typedefs';\nimport { aligningLineConfig } from '../constant';\nimport { getDistance, setPositionDir } from './basic';\n\ntype CollectLineProps = {\n activeObject: FabricObject;\n activeObjectRect: TBBox;\n objectRect: TBBox;\n};\n\nexport function collectLine(props: CollectLineProps) {\n const aligningLineMargin = aligningLineConfig.margin;\n const { activeObject, activeObjectRect, objectRect } = props;\n const list = makeLineByRect(objectRect);\n const aList = makeLineByRect(activeObjectRect);\n const margin = aligningLineMargin / (activeObject.canvas?.getZoom() ?? 1);\n const opts = { target: activeObject, list, aList, margin };\n const vLines = collectVerticalLine(opts);\n const hLines = collectHorizontalLine(opts);\n\n return { vLines, hLines };\n}\n\ntype CollectItemLineProps = {\n target: FabricObject;\n list: LineProps[];\n aList: LineProps[];\n margin: number;\n};\nfunction collectVerticalLine(props: CollectItemLineProps) {\n const { target, list, aList, margin } = props;\n\n const arr = aList.map((x) => getDistanceLine(x, list, 'x'));\n const min = Math.min(...arr.map((x) => x.dis));\n if (min > margin) return [];\n const lines: VerticalLine[] = [];\n const width = aList[0].x2 - aList[0].x;\n const height = aList[0].y2 - aList[0].y;\n let b = false;\n for (let i = 0; i < arr.length; i++) {\n const item = arr[i];\n if (min == item.dis) {\n const line = list[item.index];\n const aLine = aList[item.index];\n const x = line.x;\n const y = aLine.y;\n\n const y1 = Math.min(line.y, line.y2, y, aLine.y2);\n const y2 = Math.max(line.y, line.y2, y, aLine.y2);\n // Multiple reference lines can be drawn\n lines.push({ x, y1, y2 });\n if (b) continue;\n b = true;\n // Alignment is performed only once\n setPos({\n target,\n x,\n y,\n centerX: i - 1,\n centerY: item.index - 1,\n width,\n height,\n dir: 'x',\n });\n const dis = min * item.dir;\n aList.forEach((x) => (x.x -= dis));\n }\n }\n return lines;\n}\n\nfunction collectHorizontalLine(props: CollectItemLineProps) {\n const { target, list, aList, margin } = props;\n\n const arr = aList.map((x) => getDistanceLine(x, list, 'y'));\n const min = Math.min(...arr.map((x) => x.dis));\n if (min > margin) return [];\n const lines: HorizontalLine[] = [];\n const width = aList[0].x2 - aList[0].x;\n const height = aList[0].y2 - aList[0].y;\n let b = false;\n for (let i = 0; i < arr.length; i++) {\n const item = arr[i];\n if (min == item.dis) {\n const line = list[item.index];\n const aLine = aList[item.index];\n const y = line.y;\n const x = aLine.x;\n\n const x1 = Math.min(line.x, line.x2, x, aLine.x2);\n const x2 = Math.max(line.x, line.x2, x, aLine.x2);\n // Multiple reference lines can be drawn\n lines.push({ y, x1, x2 });\n if (b) continue;\n b = true;\n // Alignment is performed only once\n setPos({\n target,\n x,\n y,\n centerX: item.index - 1,\n centerY: i - 1,\n width,\n height,\n dir: 'y',\n });\n const dis = min * item.dir;\n aList.forEach((x) => (x.y -= dis));\n }\n }\n return lines;\n}\n\ntype LineProps = {\n x: number;\n y: number;\n x2: number;\n y2: number;\n};\nfunction getDistanceLine(\n target: LineProps,\n list: LineProps[],\n type: 'x' | 'y',\n) {\n let dis = Infinity;\n let index = -1;\n /** 1 for positive value, -1 for negative value */\n let dir = 1;\n for (let i = 0; i < list.length; i++) {\n const v = getDistance(target[type], list[i][type]);\n if (dis > v) {\n index = i;\n dis = v;\n dir = target[type] > list[i][type] ? 1 : -1;\n }\n }\n return { dis, index, dir };\n}\n\nfunction makeLineByRect(rect: TBBox) {\n const { left, top, width, height } = rect;\n const a = { x: left, y: top, x2: left + width, y2: top + height };\n const x = left + width / 2;\n const y = top + height / 2;\n const b = { x, y, x2: x, y2: y };\n const c = { x: left + width, x2: left, y: top + height, y2: top };\n\n return [a, b, c];\n}\n\ntype SnapToPixelProps = {\n target: FabricObject;\n x: number;\n y: number;\n /** -1 0 1 */\n centerX: number;\n /** -1 0 1 */\n centerY: number;\n width: number;\n height: number;\n dir: 'x' | 'y';\n};\nfunction setPos(props: SnapToPixelProps) {\n const { target, centerX, centerY, width, height, dir } = props;\n let { x, y } = props;\n x -= (centerX * width) / 2;\n y -= (centerY * height) / 2;\n setPositionDir(target, new Point(x, y), dir);\n target.setCoords();\n}\n","import {\n Point,\n FabricImage,\n Group,\n BaseFabricObject,\n type FabricObject,\n type TOriginX,\n type TOriginY,\n} from 'fabric';\n\n/**\n * Updates the fromObject function of a class to return a version that can restore old data\n * with values of originX and originY that are different from 'center', 'center'\n * Used to upgrade from fabric 6 to fabric 7\n * @param originalFn the original fromObject function of an object,\n * @param defaultOriginX optional default value for non exported originX,\n * @param defaultOriginY optional default value for non exported originY,\n * @returns a wrapped fromObject function for the object\n */\nexport const originUpdaterWrapper = (\n originalFn: (...args: any[]) => Promise,\n defaultOriginX: TOriginX = 'left',\n defaultOriginY: TOriginY = 'top',\n): ((...args: any[]) => Promise) =>\n async function (this: T, serializedObject, ...args) {\n // we default to left and top because those are defaults before deprecation\n const { originX = defaultOriginX, originY = defaultOriginY } =\n serializedObject;\n // and we do not want to pass those properties on the object anymore\n delete serializedObject.originX;\n delete serializedObject.originY;\n const originalObject = await originalFn.call(\n this,\n serializedObject,\n ...args,\n );\n const actualPosition = new Point(originalObject.left, originalObject.top);\n originalObject.setPositionByOrigin(actualPosition, originX, originY);\n return originalObject;\n };\n\n/**\n * Wraps and override the current fabricJS fromObject static functions\n * Used to upgrade from fabric 7 to fabric 8\n * If you used to export with includeDefaultValues = false, you have to specify\n * which were yours default origins values\n * @param originX optional default value for non exported originX,\n * @param originY optional default value for non exported originY,\n */\nexport const installOriginWrapperUpdater = (\n originX?: TOriginX,\n originY?: TOriginY,\n) => {\n // @ts-expect-error the _fromObject parameter could be instantiated differently\n BaseFabricObject._fromObject = originUpdaterWrapper(\n BaseFabricObject._fromObject,\n originX,\n originY,\n );\n // FabricImage and Group do not use _fromObject\n FabricImage.fromObject = originUpdaterWrapper(\n FabricImage.fromObject,\n originX,\n originY,\n );\n Group.fromObject = originUpdaterWrapper(\n Group.fromObject,\n originX,\n originY,\n );\n};\n","import type { GradientOptions, ColorStop } from 'fabric';\nimport { Color, Gradient } from 'fabric';\n\n/**\n * Updates the fromObject function of a Gradient to return a version that can restore old data\n * with opactiy in color Stops\n * Used to upgrade from fabric 6 to fabric 7\n * @param originalFn the original fromObject function of an object,\n * @returns a wrapped fromObject function for the object\n */\n\ntype OldColorStop = ColorStop & {\n opacity?: number;\n};\n\nexport const gradientUpdaterWrapper = = Gradient>(\n originalFn: (\n options: GradientOptions<'linear'> | GradientOptions<'radial'>,\n ) => Promise,\n): ((\n options: GradientOptions<'linear'> | GradientOptions<'radial'>,\n) => Promise) =>\n async function (this: T, serializedGradient) {\n // we default to left and top because those are defaults before deprecation\n const { colorStops } = serializedGradient;\n // and we do not want to pass those properties on the object anymore\n const newColorStops: ColorStop[] = (\n colorStops as OldColorStop[]\n )?.map(({ color, opacity, offset }) => {\n if (opacity === undefined || opacity === 1) {\n return {\n color,\n offset,\n };\n }\n const col = new Color(color).setAlpha(opacity).toRgba();\n return {\n color: col,\n offset,\n };\n });\n const gradient = await originalFn.call(this, {\n ...serializedGradient,\n colorStops: newColorStops,\n });\n return gradient;\n };\n\n/**\n * Wraps and override the current fabricJS fromObject static functions\n * Used to upgrade from fabric 7 to fabric 8\n * If you used to export with includeDefaultValues = false, you have to specify\n * which were yours default origins values\n */\nexport const installGradientUpdater = () => {\n // @ts-expect-error untypable\n Gradient.fromObject = gradientUpdaterWrapper(Gradient.fromObject);\n};\n","import type {\n BasicTransformEvent,\n Canvas,\n FabricObject,\n TBBox,\n TPointerEvent,\n} from 'fabric';\nimport { Point, util } from 'fabric';\nimport {\n collectHorizontalPoint,\n collectVerticalPoint,\n} from './util/collect-point';\nimport {\n drawHorizontalLine,\n drawPointList,\n drawVerticalLine,\n} from './util/draw';\nimport { getObjectsByTarget } from './util/get-objects-by-target';\nimport { collectLine } from './util/collect-line';\nimport type {\n AligningLineConfig,\n HorizontalLine,\n VerticalLine,\n} from './typedefs';\nimport { aligningLineConfig } from './constant';\n\ntype TransformEvent = BasicTransformEvent & {\n target: FabricObject;\n};\n\nexport type { AligningLineConfig } from './typedefs';\n\nexport function initAligningGuidelines(\n canvas: Canvas,\n options: Partial = {},\n) {\n Object.assign(aligningLineConfig, options);\n\n const horizontalLines = new Set();\n const verticalLines = new Set();\n let onlyDrawPoint = false;\n const cacheMap = new Map();\n\n const getCaCheMapValue = (object: FabricObject) => {\n const cacheKey = [\n object.calcTransformMatrix().toString(),\n object.width,\n object.height,\n ].join();\n const cacheValue = cacheMap.get(cacheKey);\n if (cacheValue) return cacheValue;\n const coords = object.getCoords();\n const rect = util.makeBoundingBoxFromPoints(coords);\n const value: [TBBox, Point[]] = [rect, coords];\n cacheMap.set(cacheKey, value);\n return value;\n };\n\n function moving(e: TransformEvent) {\n const activeObject = e.target;\n activeObject.setCoords();\n onlyDrawPoint = false;\n verticalLines.clear();\n horizontalLines.clear();\n\n const objects = getObjectsByTarget(activeObject);\n const activeObjectRect = activeObject.getBoundingRect();\n\n for (const object of objects) {\n const objectRect = getCaCheMapValue(object)[0];\n const { vLines, hLines } = collectLine({\n activeObject,\n activeObjectRect,\n objectRect,\n });\n vLines.forEach((o) => {\n verticalLines.add(JSON.stringify(o));\n });\n hLines.forEach((o) => {\n horizontalLines.add(JSON.stringify(o));\n });\n }\n }\n\n function scalingOrResizing(e: TransformEvent) {\n // br bl tr tl mb ml mt mr\n const activeObject = e.target;\n activeObject.setCoords();\n const isScale = String(e.transform.action).startsWith('scale');\n verticalLines.clear();\n horizontalLines.clear();\n\n const objects = getObjectsByTarget(activeObject);\n let corner = e.transform.corner;\n if (activeObject.flipX) corner = corner.replace('l', 'r').replace('r', 'l');\n if (activeObject.flipY) corner = corner.replace('t', 'b').replace('b', 't');\n let index = ['tl', 'tr', 'br', 'bl', 'mt', 'mr', 'mb', 'ml'].indexOf(\n corner,\n );\n if (index == -1) return;\n onlyDrawPoint = index > 3;\n if (onlyDrawPoint) {\n const angle = activeObject.getTotalAngle();\n if (angle % 90 != 0) return;\n index -= 4;\n }\n let point = activeObject.getCoords()[index];\n for (const object of objects) {\n const [rect, coords] = getCaCheMapValue(object);\n const center = new Point(\n rect.left + rect.width / 2,\n rect.top + rect.height / 2,\n );\n const list = [...coords, center];\n const props = { activeObject, point, list, isScale, index };\n const vLines = collectVerticalPoint(props);\n const hLines = collectHorizontalPoint(props);\n vLines.forEach((o) => {\n verticalLines.add(JSON.stringify(o));\n });\n hLines.forEach((o) => {\n horizontalLines.add(JSON.stringify(o));\n });\n if (vLines.length || hLines.length)\n point = activeObject.getCoords()[index];\n }\n }\n\n function beforeRender() {\n canvas.clearContext(canvas.contextTop);\n }\n function afterRender() {\n if (onlyDrawPoint) {\n const list: Array = [];\n for (const v of verticalLines) list.push(JSON.parse(v));\n for (const h of horizontalLines) list.push(JSON.parse(h));\n drawPointList(canvas, list);\n } else {\n for (const v of verticalLines) drawVerticalLine(canvas, JSON.parse(v));\n for (const h of horizontalLines)\n drawHorizontalLine(canvas, JSON.parse(h));\n }\n }\n function mouseUp() {\n verticalLines.clear();\n horizontalLines.clear();\n cacheMap.clear();\n canvas.requestRenderAll();\n }\n\n canvas.on('object:resizing', scalingOrResizing);\n canvas.on('object:scaling', scalingOrResizing);\n canvas.on('object:moving', moving);\n canvas.on('before:render', beforeRender);\n canvas.on('after:render', afterRender);\n canvas.on('mouse:up', mouseUp);\n\n return () => {\n canvas.off('object:resizing', scalingOrResizing);\n canvas.off('object:scaling', scalingOrResizing);\n canvas.off('object:moving', moving);\n canvas.off('before:render', beforeRender);\n canvas.off('after:render', afterRender);\n canvas.off('mouse:up', mouseUp);\n };\n}\n"],"names":["aligningLineConfig","margin","width","color","getDistance","a","b","Math","abs","originXArr","originYArr","collectVerticalPoint","props","_activeObject$canvas$","_activeObject$canvas","aligningLineMargin","activeObject","isScale","index","point","list","dis","arr","getDistanceList","canvas","getZoom","v","length","x","dir","scaleX","left","dim","_getTransformedDimensions","sx","set","dArr","reverse","d","indexOf","originX","setCoords","map","item","y1","y","y2","collectHorizontalPoint","_activeObject$canvas$2","_activeObject$canvas2","height","scaleY","top","sy","originY","x1","x2","type","Infinity","push","drawLine","origin","target","ctx","getSelectionContext","viewportTransform","zoom","save","transform","lineWidth","strokeStyle","beginPath","moveTo","lineTo","stroke","drawX","restore","xSize","size","translate","drawPointList","drawPoint","isVertical","Point","drawVerticalLine","coords","drawHorizontalLine","getObjectsByTarget","objects","Set","children","ActiveSelection","getObjects","forEachObject","o","isOnScreen","visible","constructor","Group","add","collectObjectsByGroup","deleteObjectsByList","delete","g","child","collectLine","activeObjectRect","objectRect","opts","makeLineByRect","aList","vLines","getDistanceLine","min","lines","i","line","aLine","max","setPos","centerX","centerY","forEach","collectVerticalLine","hLines","collectHorizontalLine","rect","pos","center","translateToCenterPoint","position","translateToOriginPoint","setX","setY","setPositionDir","originUpdaterWrapper","originalFn","defaultOriginX","arguments","undefined","defaultOriginY","async","serializedObject","_len","args","Array","_key","originalObject","call","this","actualPosition","setPositionByOrigin","gradientUpdaterWrapper","serializedGradient","colorStops","newColorStops","_ref","opacity","offset","Color","setAlpha","toRgba","options","Object","assign","horizontalLines","verticalLines","onlyDrawPoint","cacheMap","Map","getCaCheMapValue","object","cacheKey","calcTransformMatrix","toString","join","cacheValue","get","getCoords","value","util","makeBoundingBoxFromPoints","moving","e","clear","getBoundingRect","JSON","stringify","scalingOrResizing","String","action","startsWith","corner","flipX","replace","flipY","getTotalAngle","beforeRender","clearContext","contextTop","afterRender","parse","h","mouseUp","requestRenderAll","on","off","installGradientUpdater","Gradient","fromObject","installOriginWrapperUpdater","BaseFabricObject","_fromObject","FabricImage"],"mappings":"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"} \ No newline at end of file diff --git a/dist/index.min.js b/dist/index.min.js index 87a93844ea7..f3fc1cb5d13 100644 --- a/dist/index.min.js +++ b/dist/index.min.js @@ -1,2 +1,2 @@ -!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports):"function"==typeof define&&define.amd?define(["exports"],e):e((t="undefined"!=typeof globalThis?globalThis:t||self).fabric={})}(this,function(t){"use strict";function e(t,e,s){return(e=function(t){var e=function(t,e){if("object"!=typeof t||!t)return t;var s=t[Symbol.toPrimitive];if(void 0!==s){var i=s.call(t,e);if("object"!=typeof i)return i;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===e?String:Number)(t)}(t,"string");return"symbol"==typeof e?e:e+""}(e))in t?Object.defineProperty(t,e,{value:s,enumerable:!0,configurable:!0,writable:!0}):t[e]=s,t}class s{constructor(){e(this,"browserShadowBlurConstant",1),e(this,"DPI",96),e(this,"devicePixelRatio","undefined"!=typeof window?window.devicePixelRatio:1),e(this,"perfLimitSizeTotal",2097152),e(this,"maxCacheSideLimit",4096),e(this,"minCacheSideLimit",256),e(this,"disableStyleCopyPaste",!1),e(this,"enableGLFiltering",!0),e(this,"textureSize",4096),e(this,"forceGLPutImageData",!1),e(this,"cachesBoundsOfCurve",!1),e(this,"fontPaths",{}),e(this,"NUM_FRACTION_DIGITS",4)}}const i=new class extends s{constructor(t){super(),this.configure(t)}configure(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};Object.assign(this,t)}addFonts(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};this.fontPaths={...this.fontPaths,...t}}removeFonts(){(arguments.length>0&&void 0!==arguments[0]?arguments[0]:[]).forEach(t=>{delete this.fontPaths[t]})}clearFonts(){this.fontPaths={}}restoreDefaults(t){const e=new s,i=(null==t?void 0:t.reduce((t,s)=>(t[s]=e[s],t),{}))||e;this.configure(i)}},r=function(t){for(var e=arguments.length,s=new Array(e>1?e-1:0),i=1;ithis.testPrecision(e,t)),e.getExtension("WEBGL_lose_context").loseContext(),r("log",`WebGL: max texture size ${this.maxTextureSize}`))}isSupported(t){return!!this.maxTextureSize&&this.maxTextureSize>=t}}const l={};let c;const u=()=>c||(c={document:document,window:window,isTouchSupported:"ontouchstart"in window||"ontouchstart"in document||window&&window.navigator&&window.navigator.maxTouchPoints>0,WebGLProbe:new h,dispose(){},copyPasteData:l}),d=()=>u().document,g=()=>u().window,f=()=>{var t;return Math.max(null!==(t=i.devicePixelRatio)&&void 0!==t?t:g().devicePixelRatio,1)};const p=new class{constructor(){e(this,"charWidthsCache",{}),e(this,"boundsOfCurveCache",{})}getFontCache(t){let{fontFamily:e,fontStyle:s,fontWeight:i}=t;e=e.toLowerCase(),this.charWidthsCache[e]||(this.charWidthsCache[e]={});const r=this.charWidthsCache[e],n=`${s.toLowerCase()}_${(i+"").toLowerCase()}`;return r[n]||(r[n]={}),r[n]}clearFontCache(t){(t=(t||"").toLowerCase())?this.charWidthsCache[t]&&delete this.charWidthsCache[t]:this.charWidthsCache={}}limitDimsByArea(t){const{perfLimitSizeTotal:e}=i,s=Math.sqrt(e*t);return[Math.floor(s),Math.floor(e/s)]}};const m="7.0.0-beta1";function v(){}const y=Math.PI/2,_=Math.PI/4,x=2*Math.PI,C=Math.PI/180,b=Object.freeze([1,0,0,1,0,0]),S=16,w=.4477152502,T="center",O="left",k="top",D="bottom",M="right",P="none",E=/\r?\n/,A="moving",j="scaling",F="rotating",L="rotate",R="skewing",I="resizing",B="modifyPoly",$="modifyPath",X="changed",Y="scale",W="scaleX",V="scaleY",G="skewX",z="skewY",H="fill",N="stroke",U="modified",q="json",K="svg";const J=new class{constructor(){this[q]=new Map,this[K]=new Map}has(t){return this[q].has(t)}getClass(t){const e=this[q].get(t);if(!e)throw new n(`No class registered for ${t}`);return e}setClass(t,e){e?this[q].set(e,t):(this[q].set(t.type,t),this[q].set(t.type.toLowerCase(),t))}getSVGClass(t){return this[K].get(t)}setSVGClass(t,e){this[K].set(null!=e?e:t.type.toLowerCase(),t)}};const Q=new class extends Array{remove(t){const e=this.indexOf(t);e>-1&&this.splice(e,1)}cancelAll(){const t=this.splice(0);return t.forEach(t=>t.abort()),t}cancelByCanvas(t){if(!t)return[];const e=this.filter(e=>{var s;return e.target===t||"object"==typeof e.target&&(null===(s=e.target)||void 0===s?void 0:s.canvas)===t});return e.forEach(t=>t.abort()),e}cancelByTarget(t){if(!t)return[];const e=this.filter(e=>e.target===t);return e.forEach(t=>t.abort()),e}};class Z{constructor(){e(this,"__eventListeners",{})}on(t,e){if(this.__eventListeners||(this.__eventListeners={}),"object"==typeof t)return Object.entries(t).forEach(t=>{let[e,s]=t;this.on(e,s)}),()=>this.off(t);if(e){const s=t;return this.__eventListeners[s]||(this.__eventListeners[s]=[]),this.__eventListeners[s].push(e),()=>this.off(s,e)}return()=>!1}once(t,e){if("object"==typeof t){const e=[];return Object.entries(t).forEach(t=>{let[s,i]=t;e.push(this.once(s,i))}),()=>e.forEach(t=>t())}if(e){const s=this.on(t,function(){for(var t=arguments.length,i=new Array(t),r=0;r!1}_removeEventListener(t,e){if(this.__eventListeners[t])if(e){const s=this.__eventListeners[t],i=s.indexOf(e);i>-1&&s.splice(i,1)}else this.__eventListeners[t]=[]}off(t,e){if(this.__eventListeners)if(void 0===t)for(const t in this.__eventListeners)this._removeEventListener(t);else"object"==typeof t?Object.entries(t).forEach(t=>{let[e,s]=t;this._removeEventListener(e,s)}):this._removeEventListener(t,e)}fire(t,e){var s;if(!this.__eventListeners)return;const i=null===(s=this.__eventListeners[t])||void 0===s?void 0:s.concat();if(i)for(let t=0;t{const s=t.indexOf(e);return-1!==s&&t.splice(s,1),t},et=t=>{if(0===t)return 1;switch(Math.abs(t)/y){case 1:case 3:return 0;case 2:return-1}return Math.cos(t)},st=t=>{if(0===t)return 0;const e=t/y,s=Math.sign(t);switch(e){case 1:return s;case 2:return 0;case 3:return-s}return Math.sin(t)};class it{constructor(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0,e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0;"object"==typeof t?(this.x=t.x,this.y=t.y):(this.x=t,this.y=e)}add(t){return new it(this.x+t.x,this.y+t.y)}addEquals(t){return this.x+=t.x,this.y+=t.y,this}scalarAdd(t){return new it(this.x+t,this.y+t)}scalarAddEquals(t){return this.x+=t,this.y+=t,this}subtract(t){return new it(this.x-t.x,this.y-t.y)}subtractEquals(t){return this.x-=t.x,this.y-=t.y,this}scalarSubtract(t){return new it(this.x-t,this.y-t)}scalarSubtractEquals(t){return this.x-=t,this.y-=t,this}multiply(t){return new it(this.x*t.x,this.y*t.y)}scalarMultiply(t){return new it(this.x*t,this.y*t)}scalarMultiplyEquals(t){return this.x*=t,this.y*=t,this}divide(t){return new it(this.x/t.x,this.y/t.y)}scalarDivide(t){return new it(this.x/t,this.y/t)}scalarDivideEquals(t){return this.x/=t,this.y/=t,this}eq(t){return this.x===t.x&&this.y===t.y}lt(t){return this.xt.x&&this.y>t.y}gte(t){return this.x>=t.x&&this.y>=t.y}lerp(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:.5;return e=Math.max(Math.min(1,e),0),new it(this.x+(t.x-this.x)*e,this.y+(t.y-this.y)*e)}distanceFrom(t){const e=this.x-t.x,s=this.y-t.y;return Math.sqrt(e*e+s*s)}midPointFrom(t){return this.lerp(t)}min(t){return new it(Math.min(this.x,t.x),Math.min(this.y,t.y))}max(t){return new it(Math.max(this.x,t.x),Math.max(this.y,t.y))}toString(){return`${this.x},${this.y}`}setXY(t,e){return this.x=t,this.y=e,this}setX(t){return this.x=t,this}setY(t){return this.y=t,this}setFromPoint(t){return this.x=t.x,this.y=t.y,this}swap(t){const e=this.x,s=this.y;this.x=t.x,this.y=t.y,t.x=e,t.y=s}clone(){return new it(this.x,this.y)}rotate(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:rt;const s=st(t),i=et(t),r=this.subtract(e);return new it(r.x*i-r.y*s,r.x*s+r.y*i).add(e)}transform(t){let e=arguments.length>1&&void 0!==arguments[1]&&arguments[1];return new it(t[0]*this.x+t[2]*this.y+(e?0:t[4]),t[1]*this.x+t[3]*this.y+(e?0:t[5]))}}const rt=new it(0,0),nt=t=>!!t&&Array.isArray(t._objects);function ot(t){class s extends t{constructor(){super(...arguments),e(this,"_objects",[])}_onObjectAdded(t){}_onObjectRemoved(t){}_onStackOrderChanged(t){}add(){for(var t=arguments.length,e=new Array(t),s=0;sthis._onObjectAdded(t)),i}insertAt(t){for(var e=arguments.length,s=new Array(e>1?e-1:0),i=1;ithis._onObjectAdded(t)),this._objects.length}remove(){const t=this._objects,e=[];for(var s=arguments.length,i=new Array(s),r=0;r{const i=t.indexOf(s);-1!==i&&(t.splice(i,1),e.push(s),this._onObjectRemoved(s))}),e}forEachObject(t){this.getObjects().forEach((e,s,i)=>t(e,s,i))}getObjects(){for(var t=arguments.length,e=new Array(t),s=0;st.isType(...e))}item(t){return this._objects[t]}isEmpty(){return 0===this._objects.length}size(){return this._objects.length}contains(t,e){return!!this._objects.includes(t)||!!e&&this._objects.some(e=>e instanceof s&&e.contains(t,!0))}complexity(){return this._objects.reduce((t,e)=>t+=e.complexity?e.complexity():0,0)}sendObjectToBack(t){return!(!t||t===this._objects[0])&&(tt(this._objects,t),this._objects.unshift(t),this._onStackOrderChanged(t),!0)}bringObjectToFront(t){return!(!t||t===this._objects[this._objects.length-1])&&(tt(this._objects,t),this._objects.push(t),this._onStackOrderChanged(t),!0)}sendObjectBackwards(t,e){if(!t)return!1;const s=this._objects.indexOf(t);if(0!==s){const i=this.findNewLowerIndex(t,s,e);return tt(this._objects,t),this._objects.splice(i,0,t),this._onStackOrderChanged(t),!0}return!1}bringObjectForward(t,e){if(!t)return!1;const s=this._objects.indexOf(t);if(s!==this._objects.length-1){const i=this.findNewUpperIndex(t,s,e);return tt(this._objects,t),this._objects.splice(i,0,t),this._onStackOrderChanged(t),!0}return!1}moveObjectTo(t,e){return t!==this._objects[e]&&(tt(this._objects,t),this._objects.splice(e,0,t),this._onStackOrderChanged(t),!0)}findNewLowerIndex(t,e,s){let i;if(s){i=e;for(let s=e-1;s>=0;--s)if(t.isOverlapping(this._objects[s])){i=s;break}}else i=e-1;return i}findNewUpperIndex(t,e,s){let i;if(s){i=e;for(let s=e+1;s1&&void 0!==arguments[1]?arguments[1]:{};const o=[],a=new it(e,s),h=a.add(new it(i,r));for(let t=this._objects.length-1;t>=0;t--){const e=this._objects[t];e.selectable&&e.visible&&(n&&e.intersectsWithRect(a,h)||e.isContainedWithinRect(a,h)||n&&e.containsPoint(a)||n&&e.containsPoint(h))&&o.push(e)}return o}}return s}class at extends Z{_setOptions(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};for(const e in t)this.set(e,t[e])}_setObject(t){for(const e in t)this._set(e,t[e])}set(t,e){return"object"==typeof t?this._setObject(t):this._set(t,e),this}_set(t,e){this[t]=e}toggle(t){const e=this.get(t);return"boolean"==typeof e&&this.set(t,!e),this}get(t){return this[t]}}function ht(t){return g().requestAnimationFrame(t)}function lt(t){return g().cancelAnimationFrame(t)}let ct=0;const ut=()=>ct++,dt=()=>{const t=d().createElement("canvas");if(!t||void 0===t.getContext)throw new n("Failed to create `canvas` element");return t},gt=()=>d().createElement("img"),ft=t=>{const e=dt();return e.width=t.width,e.height=t.height,e},pt=(t,e,s)=>t.toDataURL(`image/${e}`,s),mt=(t,e,s)=>new Promise((i,r)=>{t.toBlob(i,`image/${e}`,s)}),vt=t=>t*C,yt=t=>t/C,_t=t=>t.every((t,e)=>t===b[e]),xt=(t,e,s)=>new it(t).transform(e,s),Ct=t=>{const e=1/(t[0]*t[3]-t[1]*t[2]),s=[e*t[3],-e*t[1],-e*t[2],e*t[0],0,0],{x:i,y:r}=new it(t[4],t[5]).transform(s,!0);return s[4]=-i,s[5]=-r,s},bt=(t,e,s)=>[t[0]*e[0]+t[2]*e[1],t[1]*e[0]+t[3]*e[1],t[0]*e[2]+t[2]*e[3],t[1]*e[2]+t[3]*e[3],s?0:t[0]*e[4]+t[2]*e[5]+t[4],s?0:t[1]*e[4]+t[3]*e[5]+t[5]],St=(t,e)=>t.reduceRight((t,s)=>s&&t?bt(s,t,e):s||t,void 0)||b.concat(),wt=t=>{let[e,s]=t;return Math.atan2(s,e)},Tt=t=>{const e=wt(t),s=Math.pow(t[0],2)+Math.pow(t[1],2),i=Math.sqrt(s),r=(t[0]*t[3]-t[2]*t[1])/i,n=Math.atan2(t[0]*t[2]+t[1]*t[3],s);return{angle:yt(e),scaleX:i,scaleY:r,skewX:yt(n),skewY:0,translateX:t[4]||0,translateY:t[5]||0}},Ot=function(t){return[1,0,0,1,t,arguments.length>1&&void 0!==arguments[1]?arguments[1]:0]};function kt(){let{angle:t=0}=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},{x:e=0,y:s=0}=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};const i=vt(t),r=et(i),n=st(i);return[r,n,-n,r,e?e-(r*e-n*s):0,s?s-(n*e+r*s):0]}const Dt=function(t){return[t,0,0,arguments.length>1&&void 0!==arguments[1]?arguments[1]:t,0,0]},Mt=t=>Math.tan(vt(t)),Pt=t=>[1,0,Mt(t),1,0,0],Et=t=>[1,Mt(t),0,1,0,0],At=t=>{let{scaleX:e=1,scaleY:s=1,flipX:i=!1,flipY:r=!1,skewX:n=0,skewY:o=0}=t,a=Dt(i?-e:e,r?-s:s);return n&&(a=bt(a,Pt(n),!0)),o&&(a=bt(a,Et(o),!0)),a},jt=t=>{const{translateX:e=0,translateY:s=0,angle:i=0}=t;let r=Ot(e,s);i&&(r=bt(r,kt({angle:i})));const n=At(t);return _t(n)||(r=bt(r,n)),r},Ft=function(t){let{signal:e,crossOrigin:s=null}=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return new Promise(function(i,r){if(e&&e.aborted)return r(new o("loadImage"));const a=gt();let h;e&&(h=function(t){a.src="",r(t)},e.addEventListener("abort",h,{once:!0}));const l=function(){a.onload=a.onerror=null,h&&(null==e||e.removeEventListener("abort",h)),i(a)};t?(a.onload=l,a.onerror=function(){h&&(null==e||e.removeEventListener("abort",h)),r(new n(`Error loading ${a.src}`))},s&&(a.crossOrigin=s),a.src=t):l()})},Lt=function(t){let{signal:e,reviver:s=v}=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return new Promise((i,r)=>{const n=[];e&&e.addEventListener("abort",r,{once:!0}),Promise.all(t.map(t=>J.getClass(t.type).fromObject(t,{signal:e}).then(e=>(s(t,e),n.push(e),e)))).then(i).catch(t=>{n.forEach(t=>{t.dispose&&t.dispose()}),r(t)}).finally(()=>{e&&e.removeEventListener("abort",r)})})},Rt=function(t){let{signal:e}=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return new Promise((s,i)=>{const r=[];e&&e.addEventListener("abort",i,{once:!0});const n=Object.values(t).map(t=>t&&t.type&&J.has(t.type)?Lt([t],{signal:e}).then(t=>{let[e]=t;return r.push(e),e}):t),o=Object.keys(t);Promise.all(n).then(t=>t.reduce((t,e,s)=>(t[o[s]]=e,t),{})).then(s).catch(t=>{r.forEach(t=>{t.dispose&&t.dispose()}),i(t)}).finally(()=>{e&&e.removeEventListener("abort",i)})})},It=function(t){return(arguments.length>1&&void 0!==arguments[1]?arguments[1]:[]).reduce((e,s)=>(s in t&&(e[s]=t[s]),e),{})},Bt=(t,e)=>Object.keys(t).reduce((s,i)=>(e(t[i],i,t)&&(s[i]=t[i]),s),{}),$t=(t,e)=>parseFloat(Number(t).toFixed(e)),Xt=t=>"matrix("+t.map(t=>$t(t,i.NUM_FRACTION_DIGITS)).join(" ")+")",Yt=t=>!!t&&void 0!==t.toLive,Wt=t=>!!t&&"function"==typeof t.toObject,Vt=t=>!!t&&void 0!==t.offsetX&&"source"in t,Gt=t=>!!t&&"multiSelectionStacking"in t;function zt(t){const e=t&&Ht(t);let s=0,i=0;if(!t||!e)return{left:s,top:i};let r=t;const n=e.documentElement,o=e.body||{scrollLeft:0,scrollTop:0};for(;r&&(r.parentNode||r.host)&&(r=r.parentNode||r.host,r===e?(s=o.scrollLeft||n.scrollLeft||0,i=o.scrollTop||n.scrollTop||0):(s+=r.scrollLeft||0,i+=r.scrollTop||0),1!==r.nodeType||"fixed"!==r.style.position););return{left:s,top:i}}const Ht=t=>t.ownerDocument||null,Nt=t=>{var e;return(null===(e=t.ownerDocument)||void 0===e?void 0:e.defaultView)||null},Ut=function(t,e,s){let{width:i,height:r}=s,n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:1;t.width=i,t.height=r,n>1&&(t.setAttribute("width",(i*n).toString()),t.setAttribute("height",(r*n).toString()),e.scale(n,n))},qt=(t,e)=>{let{width:s,height:i}=e;s&&(t.style.width="number"==typeof s?`${s}px`:s),i&&(t.style.height="number"==typeof i?`${i}px`:i)};function Kt(t){return void 0!==t.onselectstart&&(t.onselectstart=()=>!1),t.style.userSelect=P,t}class Jt{constructor(t){e(this,"_originalCanvasStyle",void 0),e(this,"lower",void 0);const s=this.createLowerCanvas(t);this.lower={el:s,ctx:s.getContext("2d")}}createLowerCanvas(t){const e=(s=t)&&void 0!==s.getContext?t:t&&d().getElementById(t)||dt();var s;if(e.hasAttribute("data-fabric"))throw new n("Trying to initialize a canvas that has already been initialized. Did you forget to dispose the canvas?");return this._originalCanvasStyle=e.style.cssText,e.setAttribute("data-fabric","main"),e.classList.add("lower-canvas"),e}cleanupDOM(t){let{width:e,height:s}=t;const{el:i}=this.lower;i.classList.remove("lower-canvas"),i.removeAttribute("data-fabric"),i.setAttribute("width",`${e}`),i.setAttribute("height",`${s}`),i.style.cssText=this._originalCanvasStyle||"",this._originalCanvasStyle=void 0}setDimensions(t,e){const{el:s,ctx:i}=this.lower;Ut(s,i,t,e)}setCSSDimensions(t){qt(this.lower.el,t)}calcOffset(){return function(t){var e;const s=t&&Ht(t),i={left:0,top:0};if(!s)return i;const r=(null===(e=Nt(t))||void 0===e?void 0:e.getComputedStyle(t,null))||{};i.left+=parseInt(r.borderLeftWidth,10)||0,i.top+=parseInt(r.borderTopWidth,10)||0,i.left+=parseInt(r.paddingLeft,10)||0,i.top+=parseInt(r.paddingTop,10)||0;let n={left:0,top:0};const o=s.documentElement;void 0!==t.getBoundingClientRect&&(n=t.getBoundingClientRect());const a=zt(t);return{left:n.left+a.left-(o.clientLeft||0)+i.left,top:n.top+a.top-(o.clientTop||0)+i.top}}(this.lower.el)}dispose(){u().dispose(this.lower.el),delete this.lower}}const Qt={backgroundVpt:!0,backgroundColor:"",overlayVpt:!0,overlayColor:"",includeDefaultValues:!0,svgViewportTransformation:!0,renderOnAddRemove:!0,skipOffscreen:!0,enableRetinaScaling:!0,imageSmoothingEnabled:!0,controlsAboveOverlay:!1,allowTouchScrolling:!1,viewportTransform:[...b]};class Zt extends(ot(at)){get lowerCanvasEl(){var t;return null===(t=this.elements.lower)||void 0===t?void 0:t.el}get contextContainer(){var t;return null===(t=this.elements.lower)||void 0===t?void 0:t.ctx}static getDefaults(){return Zt.ownDefaults}constructor(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};super(),Object.assign(this,this.constructor.getDefaults()),this.set(e),this.initElements(t),this._setDimensionsImpl({width:this.width||this.elements.lower.el.width||0,height:this.height||this.elements.lower.el.height||0}),this.skipControlsDrawing=!1,this.viewportTransform=[...this.viewportTransform],this.calcViewportBoundaries()}initElements(t){this.elements=new Jt(t)}add(){const t=super.add(...arguments);return arguments.length>0&&this.renderOnAddRemove&&this.requestRenderAll(),t}insertAt(t){for(var e=arguments.length,s=new Array(e>1?e-1:0),i=1;i0&&this.renderOnAddRemove&&this.requestRenderAll(),r}remove(){const t=super.remove(...arguments);return t.length>0&&this.renderOnAddRemove&&this.requestRenderAll(),t}_onObjectAdded(t){t.canvas&&t.canvas!==this&&(r("warn","Canvas is trying to add an object that belongs to a different canvas.\nResulting to default behavior: removing object from previous canvas and adding to new canvas"),t.canvas.remove(t)),t._set("canvas",this),t.setCoords(),this.fire("object:added",{target:t}),t.fire("added",{target:this})}_onObjectRemoved(t){t._set("canvas",void 0),this.fire("object:removed",{target:t}),t.fire("removed",{target:this})}_onStackOrderChanged(){this.renderOnAddRemove&&this.requestRenderAll()}getRetinaScaling(){return this.enableRetinaScaling?f():1}calcOffset(){return this._offset=this.elements.calcOffset()}getWidth(){return this.width}getHeight(){return this.height}_setDimensionsImpl(t){let{cssOnly:e=!1,backstoreOnly:s=!1}=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if(!e){const e={width:this.width,height:this.height,...t};this.elements.setDimensions(e,this.getRetinaScaling()),this.hasLostContext=!0,this.width=e.width,this.height=e.height}s||this.elements.setCSSDimensions(t),this.calcOffset()}setDimensions(t,e){this._setDimensionsImpl(t,e),e&&e.cssOnly||this.requestRenderAll()}getZoom(){return this.viewportTransform[0]}setViewportTransform(t){this.viewportTransform=t,this.calcViewportBoundaries(),this.renderOnAddRemove&&this.requestRenderAll()}zoomToPoint(t,e){const s=t,i=[...this.viewportTransform],r=xt(t,Ct(i));i[0]=e,i[3]=e;const n=xt(r,i);i[4]+=s.x-n.x,i[5]+=s.y-n.y,this.setViewportTransform(i)}setZoom(t){this.zoomToPoint(new it(0,0),t)}absolutePan(t){const e=[...this.viewportTransform];return e[4]=-t.x,e[5]=-t.y,this.setViewportTransform(e)}relativePan(t){return this.absolutePan(new it(-t.x-this.viewportTransform[4],-t.y-this.viewportTransform[5]))}getElement(){return this.elements.lower.el}clearContext(t){t.clearRect(0,0,this.width,this.height)}getContext(){return this.elements.lower.ctx}clear(){this.remove(...this.getObjects()),this.backgroundImage=void 0,this.overlayImage=void 0,this.backgroundColor="",this.overlayColor="",this.clearContext(this.getContext()),this.fire("canvas:cleared"),this.renderOnAddRemove&&this.requestRenderAll()}renderAll(){this.cancelRequestedRender(),this.destroyed||this.renderCanvas(this.getContext(),this._objects)}renderAndReset(){this.nextRenderHandle=0,this.renderAll()}requestRenderAll(){this.nextRenderHandle||this.disposed||this.destroyed||(this.nextRenderHandle=ht(()=>this.renderAndReset()))}calcViewportBoundaries(){const t=this.width,e=this.height,s=Ct(this.viewportTransform),i=xt({x:0,y:0},s),r=xt({x:t,y:e},s),n=i.min(r),o=i.max(r);return this.vptCoords={tl:n,tr:new it(o.x,n.y),bl:new it(n.x,o.y),br:o}}cancelRequestedRender(){this.nextRenderHandle&&(lt(this.nextRenderHandle),this.nextRenderHandle=0)}drawControls(t){}renderCanvas(t,e){if(this.destroyed)return;const s=this.viewportTransform,i=this.clipPath;this.calcViewportBoundaries(),this.clearContext(t),t.imageSmoothingEnabled=this.imageSmoothingEnabled,t.patternQuality="best",this.fire("before:render",{ctx:t}),this._renderBackground(t),t.save(),t.transform(s[0],s[1],s[2],s[3],s[4],s[5]),this._renderObjects(t,e),t.restore(),this.controlsAboveOverlay||this.skipControlsDrawing||this.drawControls(t),i&&(i._set("canvas",this),i.shouldCache(),i._transformDone=!0,i.renderCache({forClipping:!0}),this.drawClipPathOnCanvas(t,i)),this._renderOverlay(t),this.controlsAboveOverlay&&!this.skipControlsDrawing&&this.drawControls(t),this.fire("after:render",{ctx:t}),this.__cleanupTask&&(this.__cleanupTask(),this.__cleanupTask=void 0)}drawClipPathOnCanvas(t,e){const s=this.viewportTransform;t.save(),t.transform(...s),t.globalCompositeOperation="destination-in",e.transform(t),t.scale(1/e.zoomX,1/e.zoomY),t.drawImage(e._cacheCanvas,-e.cacheTranslationX,-e.cacheTranslationY),t.restore()}_renderObjects(t,e){for(let s=0,i=e.length;s!t.excludeFromExport).map(s=>this._toObject(s,t,e)),...this.__serializeBgOverlay(t,e),...i?{clipPath:i}:null}}_toObject(t,e,s){let i;this.includeDefaultValues||(i=t.includeDefaultValues,t.includeDefaultValues=!1);const r=t[e](s);return this.includeDefaultValues||(t.includeDefaultValues=!!i),r}__serializeBgOverlay(t,e){const s={},i=this.backgroundImage,r=this.overlayImage,n=this.backgroundColor,o=this.overlayColor;return Yt(n)?n.excludeFromExport||(s.background=n.toObject(e)):n&&(s.background=n),Yt(o)?o.excludeFromExport||(s.overlay=o.toObject(e)):o&&(s.overlay=o),i&&!i.excludeFromExport&&(s.backgroundImage=this._toObject(i,t,e)),r&&!r.excludeFromExport&&(s.overlayImage=this._toObject(r,t,e)),s}toSVG(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},e=arguments.length>1?arguments[1]:void 0;t.reviver=e;const s=[];return this._setSVGPreamble(s,t),this._setSVGHeader(s,t),this.clipPath&&s.push(`\n`),this._setSVGBgOverlayColor(s,"background"),this._setSVGBgOverlayImage(s,"backgroundImage",e),this._setSVGObjects(s,e),this.clipPath&&s.push("\n"),this._setSVGBgOverlayColor(s,"overlay"),this._setSVGBgOverlayImage(s,"overlayImage",e),s.push(""),s.join("")}_setSVGPreamble(t,e){e.suppressPreamble||t.push('\n','\n')}_setSVGHeader(t,e){const s=e.width||`${this.width}`,r=e.height||`${this.height}`,n=i.NUM_FRACTION_DIGITS,o=e.viewBox;let a;if(o)a=`viewBox="${o.x} ${o.y} ${o.width} ${o.height}" `;else if(this.svgViewportTransformation){const t=this.viewportTransform;a=`viewBox="${$t(-t[4]/t[0],n)} ${$t(-t[5]/t[3],n)} ${$t(this.width/t[0],n)} ${$t(this.height/t[3],n)}" `}else a=`viewBox="0 0 ${this.width} ${this.height}" `;t.push("\n',"Created with Fabric.js ",m,"\n","\n",this.createSVGFontFacesMarkup(),this.createSVGRefElementsMarkup(),this.createSVGClipPathMarkup(e),"\n")}createSVGClipPathMarkup(t){const e=this.clipPath;return e?(e.clipPathId=`CLIPPATH_${ut()}`,`\n${e.toClipPathSVG(t.reviver)}\n`):""}createSVGRefElementsMarkup(){return["background","overlay"].map(t=>{const e=this[`${t}Color`];if(Yt(e)){const s=this[`${t}Vpt`],i=this.viewportTransform,r={isType:()=>!1,width:this.width/(s?i[0]:1),height:this.height/(s?i[3]:1)};return e.toSVG(r,{additionalTransform:s?Xt(i):""})}}).join("")}createSVGFontFacesMarkup(){const t=[],e={},s=i.fontPaths;this._objects.forEach(function e(s){t.push(s),nt(s)&&s._objects.forEach(e)}),t.forEach(t=>{if(!(i=t)||"function"!=typeof i._renderText)return;var i;const{styles:r,fontFamily:n}=t;!e[n]&&s[n]&&(e[n]=!0,r&&Object.values(r).forEach(t=>{Object.values(t).forEach(t=>{let{fontFamily:i=""}=t;!e[i]&&s[i]&&(e[i]=!0)})}))});const r=Object.keys(e).map(t=>`\t\t@font-face {\n\t\t\tfont-family: '${t}';\n\t\t\tsrc: url('${s[t]}');\n\t\t}\n`).join("");return r?`\t\n`:""}_setSVGObjects(t,e){this.forEachObject(s=>{s.excludeFromExport||this._setSVGObject(t,s,e)})}_setSVGObject(t,e,s){t.push(e.toSVG(s))}_setSVGBgOverlayImage(t,e,s){const i=this[e];i&&!i.excludeFromExport&&i.toSVG&&t.push(i.toSVG(s))}_setSVGBgOverlayColor(t,e){const s=this[`${e}Color`];if(s)if(Yt(s)){const i=s.repeat||"",r=this.width,n=this.height,o=this[`${e}Vpt`]?Xt(Ct(this.viewportTransform)):"";t.push(`\n`)}else t.push('\n")}loadFromJSON(t,e){let{signal:s}=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};if(!t)return Promise.reject(new n("`json` is undefined"));const i="string"==typeof t?JSON.parse(t):t,{objects:r=[],backgroundImage:o,background:a,overlayImage:h,overlay:l,clipPath:c}=i,u=this.renderOnAddRemove;return this.renderOnAddRemove=!1,Promise.all([Lt(r,{reviver:e,signal:s}),Rt({backgroundImage:o,backgroundColor:a,overlayImage:h,overlayColor:l,clipPath:c},{signal:s})]).then(t=>{let[e,s]=t;return this.clear(),this.add(...e),this.set(i),this.set(s),this.renderOnAddRemove=u,this})}clone(t){const e=this.toObject(t);return this.cloneWithoutData().loadFromJSON(e)}cloneWithoutData(){const t=ft(this);return new this.constructor(t)}toDataURL(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};const{format:e="png",quality:s=1,multiplier:i=1,enableRetinaScaling:r=!1}=t,n=i*(r?this.getRetinaScaling():1);return pt(this.toCanvasElement(n,t),e,s)}toBlob(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};const{format:e="png",quality:s=1,multiplier:i=1,enableRetinaScaling:r=!1}=t,n=i*(r?this.getRetinaScaling():1);return mt(this.toCanvasElement(n,t),e,s)}toCanvasElement(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:1,{width:e,height:s,left:i,top:r,filter:n}=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};const o=(e||this.width)*t,a=(s||this.height)*t,h=this.getZoom(),l=this.width,c=this.height,u=this.skipControlsDrawing,d=h*t,g=this.viewportTransform,f=[d,0,0,d,(g[4]-(i||0))*t,(g[5]-(r||0))*t],p=this.enableRetinaScaling,m=ft({width:o,height:a}),v=n?this._objects.filter(t=>n(t)):this._objects;return this.enableRetinaScaling=!1,this.viewportTransform=f,this.width=o,this.height=a,this.skipControlsDrawing=!0,this.calcViewportBoundaries(),this.renderCanvas(m.getContext("2d"),v),this.viewportTransform=g,this.width=l,this.height=c,this.calcViewportBoundaries(),this.enableRetinaScaling=p,this.skipControlsDrawing=u,m}dispose(){return!this.disposed&&this.elements.cleanupDOM({width:this.width,height:this.height}),Q.cancelByCanvas(this),this.disposed=!0,new Promise((t,e)=>{const s=()=>{this.destroy(),t(!0)};s.kill=e,this.__cleanupTask&&this.__cleanupTask.kill("aborted"),this.destroyed?t(!1):this.nextRenderHandle?this.__cleanupTask=s:s()})}destroy(){this.destroyed=!0,this.cancelRequestedRender(),this.forEachObject(t=>t.dispose()),this._objects=[],this.backgroundImage&&this.backgroundImage.dispose(),this.backgroundImage=void 0,this.overlayImage&&this.overlayImage.dispose(),this.overlayImage=void 0,this.elements.dispose()}toString(){return`#`}}e(Zt,"ownDefaults",Qt);const te=["touchstart","touchmove","touchend"];const ee=t=>{const e=zt(t.target),s=function(t){const e=t.changedTouches;return e&&e[0]?e[0]:t}(t);return new it(s.clientX+e.left,s.clientY+e.top)},se=t=>te.includes(t.type)||"touch"===t.pointerType,ie=t=>{t.preventDefault(),t.stopPropagation()},re=t=>{let e=0,s=0,i=0,r=0;for(let n=0,o=t.length;ni||!n)&&(i=o),(or||!n)&&(r=a),(aoe(t,bt(e,t.calcOwnMatrix())),oe=(t,e)=>{const{translateX:s,translateY:i,scaleX:r,scaleY:n,...o}=Tt(e),a=new it(s,i);t.flipX=!1,t.flipY=!1,Object.assign(t,o),t.set({scaleX:r,scaleY:n}),t.setPositionByOrigin(a,T,T)},ae=t=>{t.scaleX=1,t.scaleY=1,t.skewX=0,t.skewY=0,t.flipX=!1,t.flipY=!1,t.rotate(0)},he=t=>({scaleX:t.scaleX,scaleY:t.scaleY,skewX:t.skewX,skewY:t.skewY,angle:t.angle,left:t.left,flipX:t.flipX,flipY:t.flipY,top:t.top}),le=(t,e,s)=>{const i=t/2,r=e/2,n=[new it(-i,-r),new it(i,-r),new it(-i,r),new it(i,r)].map(t=>t.transform(s)),o=re(n);return new it(o.width,o.height)},ce=function(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:b;return bt(Ct(arguments.length>1&&void 0!==arguments[1]?arguments[1]:b),t)},ue=function(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:b,s=arguments.length>2&&void 0!==arguments[2]?arguments[2]:b;return t.transform(ce(e,s))},de=function(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:b,s=arguments.length>2&&void 0!==arguments[2]?arguments[2]:b;return t.transform(ce(e,s),!0)},ge=(t,e,s)=>{const i=ce(e,s);return oe(t,bt(i,t.calcOwnMatrix())),i},fe=(t,e)=>{var s;const{transform:{target:i}}=e;null===(s=i.canvas)||void 0===s||s.fire(`object:${t}`,{...e,target:i}),i.fire(t,e)},pe={left:-.5,top:-.5,center:0,bottom:.5,right:.5},me=t=>"string"==typeof t?pe[t]:t-.5,ve=new it(1,0),ye=new it,_e=(t,e)=>t.rotate(e),xe=(t,e)=>new it(e).subtract(t),Ce=t=>t.distanceFrom(ye),be=(t,e)=>Math.atan2(Oe(t,e),ke(t,e)),Se=t=>be(ve,t),we=t=>t.eq(ye)?t:t.scalarDivide(Ce(t)),Te=function(t){let e=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];return we(new it(-t.y,t.x).scalarMultiply(e?1:-1))},Oe=(t,e)=>t.x*e.y-t.y*e.x,ke=(t,e)=>t.x*e.x+t.y*e.y,De=(t,e,s)=>{if(t.eq(e)||t.eq(s))return!0;const i=Oe(e,s),r=Oe(e,t),n=Oe(s,t);return i>=0?r>=0&&n<=0:!(r<=0&&n>=0)},Me="not-allowed";function Pe(t){return me(t.originX)===me(T)&&me(t.originY)===me(T)}function Ee(t){return.5-me(t)}const Ae=(t,e)=>t[e],je=(t,e,s,i)=>({e:t,transform:e,pointer:new it(s,i)});function Fe(t,e,s){const i=s,r=ue(t.getCenterPoint(),t.canvas.viewportTransform,void 0),n=Se(xe(r,i))+x;return Math.round(n%x/_)}function Le(t,e,s,i,r){var n;let{target:o,corner:a}=t;const h=o.controls[a],l=(null===(n=o.canvas)||void 0===n?void 0:n.getZoom())||1,c=o.padding/l,u=function(t,e,s,i){const r=t.getRelativeCenterPoint(),n=void 0!==s&&void 0!==i?t.translateToGivenOrigin(r,T,T,s,i):new it(t.left,t.top);return(t.angle?e.rotate(-vt(t.angle),r):e).subtract(n)}(o,new it(i,r),e,s);return u.x>=c&&(u.x-=c),u.x<=-c&&(u.x+=c),u.y>=c&&(u.y-=c),u.y<=c&&(u.y+=c),u.x-=h.offsetX,u.y-=h.offsetY,u}const Re=(t,e,s,i)=>{const{target:r,offsetX:n,offsetY:o}=e,a=s-n,h=i-o,l=!Ae(r,"lockMovementX")&&r.left!==a,c=!Ae(r,"lockMovementY")&&r.top!==h;return l&&r.set(O,a),c&&r.set(k,h),(l||c)&&fe(A,je(t,e,s,i)),l||c},Ie={aliceblue:"#F0F8FF",antiquewhite:"#FAEBD7",aqua:"#0FF",aquamarine:"#7FFFD4",azure:"#F0FFFF",beige:"#F5F5DC",bisque:"#FFE4C4",black:"#000",blanchedalmond:"#FFEBCD",blue:"#00F",blueviolet:"#8A2BE2",brown:"#A52A2A",burlywood:"#DEB887",cadetblue:"#5F9EA0",chartreuse:"#7FFF00",chocolate:"#D2691E",coral:"#FF7F50",cornflowerblue:"#6495ED",cornsilk:"#FFF8DC",crimson:"#DC143C",cyan:"#0FF",darkblue:"#00008B",darkcyan:"#008B8B",darkgoldenrod:"#B8860B",darkgray:"#A9A9A9",darkgrey:"#A9A9A9",darkgreen:"#006400",darkkhaki:"#BDB76B",darkmagenta:"#8B008B",darkolivegreen:"#556B2F",darkorange:"#FF8C00",darkorchid:"#9932CC",darkred:"#8B0000",darksalmon:"#E9967A",darkseagreen:"#8FBC8F",darkslateblue:"#483D8B",darkslategray:"#2F4F4F",darkslategrey:"#2F4F4F",darkturquoise:"#00CED1",darkviolet:"#9400D3",deeppink:"#FF1493",deepskyblue:"#00BFFF",dimgray:"#696969",dimgrey:"#696969",dodgerblue:"#1E90FF",firebrick:"#B22222",floralwhite:"#FFFAF0",forestgreen:"#228B22",fuchsia:"#F0F",gainsboro:"#DCDCDC",ghostwhite:"#F8F8FF",gold:"#FFD700",goldenrod:"#DAA520",gray:"#808080",grey:"#808080",green:"#008000",greenyellow:"#ADFF2F",honeydew:"#F0FFF0",hotpink:"#FF69B4",indianred:"#CD5C5C",indigo:"#4B0082",ivory:"#FFFFF0",khaki:"#F0E68C",lavender:"#E6E6FA",lavenderblush:"#FFF0F5",lawngreen:"#7CFC00",lemonchiffon:"#FFFACD",lightblue:"#ADD8E6",lightcoral:"#F08080",lightcyan:"#E0FFFF",lightgoldenrodyellow:"#FAFAD2",lightgray:"#D3D3D3",lightgrey:"#D3D3D3",lightgreen:"#90EE90",lightpink:"#FFB6C1",lightsalmon:"#FFA07A",lightseagreen:"#20B2AA",lightskyblue:"#87CEFA",lightslategray:"#789",lightslategrey:"#789",lightsteelblue:"#B0C4DE",lightyellow:"#FFFFE0",lime:"#0F0",limegreen:"#32CD32",linen:"#FAF0E6",magenta:"#F0F",maroon:"#800000",mediumaquamarine:"#66CDAA",mediumblue:"#0000CD",mediumorchid:"#BA55D3",mediumpurple:"#9370DB",mediumseagreen:"#3CB371",mediumslateblue:"#7B68EE",mediumspringgreen:"#00FA9A",mediumturquoise:"#48D1CC",mediumvioletred:"#C71585",midnightblue:"#191970",mintcream:"#F5FFFA",mistyrose:"#FFE4E1",moccasin:"#FFE4B5",navajowhite:"#FFDEAD",navy:"#000080",oldlace:"#FDF5E6",olive:"#808000",olivedrab:"#6B8E23",orange:"#FFA500",orangered:"#FF4500",orchid:"#DA70D6",palegoldenrod:"#EEE8AA",palegreen:"#98FB98",paleturquoise:"#AFEEEE",palevioletred:"#DB7093",papayawhip:"#FFEFD5",peachpuff:"#FFDAB9",peru:"#CD853F",pink:"#FFC0CB",plum:"#DDA0DD",powderblue:"#B0E0E6",purple:"#800080",rebeccapurple:"#639",red:"#F00",rosybrown:"#BC8F8F",royalblue:"#4169E1",saddlebrown:"#8B4513",salmon:"#FA8072",sandybrown:"#F4A460",seagreen:"#2E8B57",seashell:"#FFF5EE",sienna:"#A0522D",silver:"#C0C0C0",skyblue:"#87CEEB",slateblue:"#6A5ACD",slategray:"#708090",slategrey:"#708090",snow:"#FFFAFA",springgreen:"#00FF7F",steelblue:"#4682B4",tan:"#D2B48C",teal:"#008080",thistle:"#D8BFD8",tomato:"#FF6347",turquoise:"#40E0D0",violet:"#EE82EE",wheat:"#F5DEB3",white:"#FFF",whitesmoke:"#F5F5F5",yellow:"#FF0",yellowgreen:"#9ACD32"},Be=(t,e,s)=>(s<0&&(s+=1),s>1&&(s-=1),s<1/6?t+6*(e-t)*s:s<.5?e:s<2/3?t+(e-t)*(2/3-s)*6:t),$e=(t,e,s,i)=>{t/=255,e/=255,s/=255;const r=Math.max(t,e,s),n=Math.min(t,e,s);let o,a;const h=(r+n)/2;if(r===n)o=a=0;else{const i=r-n;switch(a=h>.5?i/(2-r-n):i/(r+n),r){case t:o=(e-s)/i+(e0&&void 0!==arguments[0]?arguments[0]:"1";return parseFloat(t)/(t.endsWith("%")?100:1)},Ye=t=>Math.min(Math.round(t),255).toString(16).toUpperCase().padStart(2,"0"),We=t=>{let[e,s,i,r=1]=t;const n=Math.round(.3*e+.59*s+.11*i);return[n,n,n,r]};class Ve{constructor(t){if(e(this,"isUnrecognised",!1),t)if(t instanceof Ve)this.setSource([...t._source]);else if(Array.isArray(t)){const[e,s,i,r=1]=t;this.setSource([e,s,i,r])}else this.setSource(this._tryParsingColor(t));else this.setSource([0,0,0,1])}_tryParsingColor(t){return(t=t.toLowerCase())in Ie&&(t=Ie[t]),"transparent"===t?[255,255,255,0]:Ve.sourceFromHex(t)||Ve.sourceFromRgb(t)||Ve.sourceFromHsl(t)||(this.isUnrecognised=!0)&&[0,0,0,1]}getSource(){return this._source}setSource(t){this._source=t}toRgb(){const[t,e,s]=this.getSource();return`rgb(${t},${e},${s})`}toRgba(){return`rgba(${this.getSource().join(",")})`}toHsl(){const[t,e,s]=$e(...this.getSource());return`hsl(${t},${e}%,${s}%)`}toHsla(){const[t,e,s,i]=$e(...this.getSource());return`hsla(${t},${e}%,${s}%,${i})`}toHex(){return this.toHexa().slice(0,6)}toHexa(){const[t,e,s,i]=this.getSource();return`${Ye(t)}${Ye(e)}${Ye(s)}${Ye(Math.round(255*i))}`}getAlpha(){return this.getSource()[3]}setAlpha(t){return this._source[3]=t,this}toGrayscale(){return this.setSource(We(this.getSource())),this}toBlackWhite(t){const[e,,,s]=We(this.getSource()),i=e<(t||127)?0:255;return this.setSource([i,i,i,s]),this}overlayWith(t){t instanceof Ve||(t=new Ve(t));const e=this.getSource(),s=t.getSource(),[i,r,n]=e.map((t,e)=>Math.round(.5*t+.5*s[e]));return this.setSource([i,r,n,e[3]]),this}static fromRgb(t){return Ve.fromRgba(t)}static fromRgba(t){return new Ve(Ve.sourceFromRgb(t))}static sourceFromRgb(t){const e=t.match(/^rgba?\(\s*(\d{0,3}(?:\.\d+)?%?)\s*[\s|,]\s*(\d{0,3}(?:\.\d+)?%?)\s*[\s|,]\s*(\d{0,3}(?:\.\d+)?%?)\s*(?:\s*[,/]\s*(\d{0,3}(?:\.\d+)?%?)\s*)?\)$/i);if(e){const[t,s,i]=e.slice(1,4).map(t=>{const e=parseFloat(t);return t.endsWith("%")?Math.round(2.55*e):e});return[t,s,i,Xe(e[4])]}}static fromHsl(t){return Ve.fromHsla(t)}static fromHsla(t){return new Ve(Ve.sourceFromHsl(t))}static sourceFromHsl(t){const e=t.match(/^hsla?\(\s*([+-]?\d{0,3}(?:\.\d+)?(?:deg|turn|rad)?)\s*[\s|,]\s*(\d{0,3}(?:\.\d+)?%?)\s*[\s|,]\s*(\d{0,3}(?:\.\d+)?%?)\s*(?:\s*[,/]\s*(\d*(?:\.\d+)?%?)\s*)?\)$/i);if(!e)return;const s=(Ve.parseAngletoDegrees(e[1])%360+360)%360/360,i=parseFloat(e[2])/100,r=parseFloat(e[3])/100;let n,o,a;if(0===i)n=o=a=r;else{const t=r<=.5?r*(i+1):r+i-r*i,e=2*r-t;n=Be(e,t,s+1/3),o=Be(e,t,s),a=Be(e,t,s-1/3)}return[Math.round(255*n),Math.round(255*o),Math.round(255*a),Xe(e[4])]}static fromHex(t){return new Ve(Ve.sourceFromHex(t))}static sourceFromHex(t){if(t.match(/^#?(([0-9a-f]){3,4}|([0-9a-f]{2}){3,4})$/i)){const e=t.slice(t.indexOf("#")+1);let s;s=e.length<=4?e.split("").map(t=>t+t):e.match(/.{2}/g);const[i,r,n,o=255]=s.map(t=>parseInt(t,16));return[i,r,n,o/255]}}static parseAngletoDegrees(t){const e=t.toLowerCase(),s=parseFloat(e);return e.includes("rad")?yt(s):e.includes("turn")?360*s:s}}const Ge=function(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:S;const s=/\D{0,2}$/.exec(t),r=parseFloat(t),n=i.DPI;switch(null==s?void 0:s[0]){case"mm":return r*n/25.4;case"cm":return r*n/2.54;case"in":return r*n;case"pt":return r*n/72;case"pc":return r*n/72*12;case"em":return r*e;default:return r}},ze=t=>{const[e,s]=t.trim().split(" "),[i,r]=(n=e)&&n!==P?[n.slice(1,4),n.slice(5,8)]:n===P?[n,n]:["Mid","Mid"];var n;return{meetOrSlice:s||"meet",alignX:i,alignY:r}},He=function(t,e){let s,i,r=!(arguments.length>2&&void 0!==arguments[2])||arguments[2];if(e)if(e.toLive)s=`url(#SVGID_${e.id})`;else{const t=new Ve(e),r=t.getAlpha();s=t.toRgb(),1!==r&&(i=r.toString())}else s="none";return r?`${t}: ${s}; ${i?`${t}-opacity: ${i}; `:""}`:`${t}="${s}" ${i?`${t}-opacity="${i}" `:""}`};class Ne{getSvgStyles(t){const e=this.fillRule?this.fillRule:"nonzero",s=this.strokeWidth?this.strokeWidth:"0",i=this.strokeDashArray?this.strokeDashArray.join(" "):P,r=this.strokeDashOffset?this.strokeDashOffset:"0",n=this.strokeLineCap?this.strokeLineCap:"butt",o=this.strokeLineJoin?this.strokeLineJoin:"miter",a=this.strokeMiterLimit?this.strokeMiterLimit:"4",h=void 0!==this.opacity?this.opacity:"1",l=this.visible?"":" visibility: hidden;",c=t?"":this.getSvgFilter(),u=He(H,this.fill);return[He(N,this.stroke),"stroke-width: ",s,"; ","stroke-dasharray: ",i,"; ","stroke-linecap: ",n,"; ","stroke-dashoffset: ",r,"; ","stroke-linejoin: ",o,"; ","stroke-miterlimit: ",a,"; ",u,"fill-rule: ",e,"; ","opacity: ",h,";",c,l].join("")}getSvgFilter(){return this.shadow?`filter: url(#SVGID_${this.shadow.id});`:""}getSvgCommons(){return[this.id?`id="${this.id}" `:"",this.clipPath?`clip-path="url(#${this.clipPath.clipPathId})" `:""].join("")}getSvgTransform(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"";const s=t?this.calcTransformMatrix():this.calcOwnMatrix();return`${`transform="${Xt(s)}`}${e}" `}_toSVG(t){return[""]}toSVG(t){return this._createBaseSVGMarkup(this._toSVG(t),{reviver:t})}toClipPathSVG(t){return"\t"+this._createBaseClipPathSVGMarkup(this._toSVG(t),{reviver:t})}_createBaseClipPathSVGMarkup(t){let{reviver:e,additionalTransform:s=""}=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};const i=[this.getSvgTransform(!0,s),this.getSvgCommons()].join(""),r=t.indexOf("COMMON_PARTS");return t[r]=i,e?e(t.join("")):t.join("")}_createBaseSVGMarkup(t){let{noStyle:e,reviver:s,withShadow:i,additionalTransform:r}=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};const n=e?"":`style="${this.getSvgStyles()}" `,o=i?`style="${this.getSvgFilter()}" `:"",a=this.clipPath,h=this.strokeUniform?'vector-effect="non-scaling-stroke" ':"",l=a&&a.absolutePositioned,c=this.stroke,u=this.fill,d=this.shadow,g=[],f=t.indexOf("COMMON_PARTS");let p;a&&(a.clipPathId=`CLIPPATH_${ut()}`,p=`\n${a.toClipPathSVG(s)}\n`),l&&g.push("\n"),g.push("\n");const m=[n,h,e?"":this.addPaintOrder()," ",r?`transform="${r}" `:""].join("");return t[f]=m,Yt(u)&&g.push(u.toSVG(this)),Yt(c)&&g.push(c.toSVG(this)),d&&g.push(d.toSVG(this)),a&&g.push(p),g.push(t.join("")),g.push("\n"),l&&g.push("\n"),s?s(g.join("")):g.join("")}addPaintOrder(){return this.paintFirst!==H?` paint-order="${this.paintFirst}" `:""}}function Ue(t){return new RegExp("^("+t.join("|")+")\\b","i")}const qe="textDecorationThickness",Ke=["fontSize","fontWeight","fontFamily","fontStyle"],Je=["underline","overline","linethrough"],Qe=[...Ke,"lineHeight","text","charSpacing","textAlign","styles","path","pathStartOffset","pathSide","pathAlign"],Ze=[...Qe,...Je,"textBackgroundColor","direction",qe],ts=[...Ke,...Je,N,"strokeWidth",H,"deltaY","textBackgroundColor",qe],es={_reNewline:E,_reSpacesAndTabs:/[ \t\r]/g,_reSpaceAndTab:/[ \t\r]/,_reWords:/\S+/g,fontSize:40,fontWeight:"normal",fontFamily:"Times New Roman",underline:!1,overline:!1,linethrough:!1,textAlign:O,fontStyle:"normal",lineHeight:1.16,textBackgroundColor:"",stroke:null,shadow:null,path:void 0,pathStartOffset:0,pathSide:O,pathAlign:"baseline",charSpacing:0,deltaY:0,direction:"ltr",CACHE_FONT_SIZE:400,MIN_TEXT_WIDTH:2,superscript:{size:.6,baseline:-.35},subscript:{size:.6,baseline:.11},_fontSizeFraction:.222,offsets:{underline:.1,linethrough:-.28167,overline:-.81333},_fontSizeMult:1.13,[qe]:66.667},ss="justify",is="justify-left",rs="justify-right",ns="justify-center",os=String.raw`[-+]?(?:\d*\.\d+|\d+\.?)(?:[eE][-+]?\d+)?`,as=String.raw`(?:\s*,?\s+|\s*,\s*)`,hs="http://www.w3.org/2000/svg",ls=new RegExp("(normal|italic)?\\s*(normal|small-caps)?\\s*(normal|bold|bolder|lighter|100|200|300|400|500|600|700|800|900)?\\s*("+os+"(?:px|cm|mm|em|pt|pc|in)*)(?:\\/(normal|"+os+"))?\\s+(.*)"),cs={cx:O,x:O,r:"radius",cy:k,y:k,display:"visible",visibility:"visible",transform:"transformMatrix","fill-opacity":"fillOpacity","fill-rule":"fillRule","font-family":"fontFamily","font-size":"fontSize","font-style":"fontStyle","font-weight":"fontWeight","letter-spacing":"charSpacing","paint-order":"paintFirst","stroke-dasharray":"strokeDashArray","stroke-dashoffset":"strokeDashOffset","stroke-linecap":"strokeLineCap","stroke-linejoin":"strokeLineJoin","stroke-miterlimit":"strokeMiterLimit","stroke-opacity":"strokeOpacity","stroke-width":"strokeWidth","text-decoration":"textDecoration","text-anchor":"textAnchor",opacity:"opacity","clip-path":"clipPath","clip-rule":"clipRule","vector-effect":"strokeUniform","image-rendering":"imageSmoothing","text-decoration-thickness":qe},us="font-size",ds="clip-path",gs=Ue(["path","circle","polygon","polyline","ellipse","rect","line","image","text"]),fs=Ue(["symbol","image","marker","pattern","view","svg"]),ps=Ue(["symbol","g","a","svg","clipPath","defs"]),ms=new RegExp(String.raw`^\s*(${os})${as}(${os})${as}(${os})${as}(${os})\s*$`),vs="(-?\\d+(?:\\.\\d*)?(?:px)?(?:\\s?|$))?",ys=new RegExp("(?:\\s|^)"+vs+vs+"("+os+"?(?:px)?)?(?:\\s?|$)(?:$|\\s)");class _s{constructor(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};const e="string"==typeof t?_s.parseShadow(t):t;Object.assign(this,_s.ownDefaults,e),this.id=ut()}static parseShadow(t){const e=t.trim(),[,s=0,i=0,r=0]=(ys.exec(e)||[]).map(t=>parseFloat(t)||0);return{color:(e.replace(ys,"")||"rgb(0,0,0)").trim(),offsetX:s,offsetY:i,blur:r}}toString(){return[this.offsetX,this.offsetY,this.blur,this.color].join("px ")}toSVG(t){const e=_e(new it(this.offsetX,this.offsetY),vt(-t.angle)),s=new Ve(this.color);let r=40,n=40;return t.width&&t.height&&(r=100*$t((Math.abs(e.x)+this.blur)/t.width,i.NUM_FRACTION_DIGITS)+20,n=100*$t((Math.abs(e.y)+this.blur)/t.height,i.NUM_FRACTION_DIGITS)+20),t.flipX&&(e.x*=-1),t.flipY&&(e.y*=-1),`\n\t\n\t\n\t\n\t\n\t\n\t\t\n\t\t\n\t\n\n`}toObject(){const t={color:this.color,blur:this.blur,offsetX:this.offsetX,offsetY:this.offsetY,affectStroke:this.affectStroke,nonScaling:this.nonScaling,type:this.constructor.type},e=_s.ownDefaults;return this.includeDefaultValues?t:Bt(t,(t,s)=>t!==e[s])}static async fromObject(t){return new this(t)}}e(_s,"ownDefaults",{color:"rgb(0,0,0)",blur:0,offsetX:0,offsetY:0,affectStroke:!1,includeDefaultValues:!0,nonScaling:!1}),e(_s,"type","shadow"),J.setClass(_s,"shadow");const xs=(t,e,s)=>Math.max(t,Math.min(e,s)),Cs=[k,O,W,V,"flipX","flipY","originX","originY","angle","opacity","globalCompositeOperation","shadow","visible",G,z],bs=[H,N,"strokeWidth","strokeDashArray","width","height","paintFirst","strokeUniform","strokeLineCap","strokeDashOffset","strokeLineJoin","strokeMiterLimit","backgroundColor","clipPath"],Ss={top:0,left:0,width:0,height:0,angle:0,flipX:!1,flipY:!1,scaleX:1,scaleY:1,minScaleLimit:0,skewX:0,skewY:0,originX:O,originY:k,strokeWidth:1,strokeUniform:!1,padding:0,opacity:1,paintFirst:H,fill:"rgb(0,0,0)",fillRule:"nonzero",stroke:null,strokeDashArray:null,strokeDashOffset:0,strokeLineCap:"butt",strokeLineJoin:"miter",strokeMiterLimit:4,globalCompositeOperation:"source-over",backgroundColor:"",shadow:null,visible:!0,includeDefaultValues:!0,excludeFromExport:!1,objectCaching:!0,clipPath:void 0,inverted:!1,absolutePositioned:!1,centeredRotation:!0,centeredScaling:!1,dirty:!0},ws=(t,e,s,i)=>(tt*Math.pow(2,10*(i-=1))*Math.sin((i*r-e)*x/s),Os=(t,e,s,i)=>-s*Math.cos(t/i*y)+s+e,ks=(t,e,s,i)=>(t/=i)<1/2.75?s*(7.5625*t*t)+e:t<2/2.75?s*(7.5625*(t-=1.5/2.75)*t+.75)+e:t<2.5/2.75?s*(7.5625*(t-=2.25/2.75)*t+.9375)+e:s*(7.5625*(t-=2.625/2.75)*t+.984375)+e,Ds=(t,e,s,i)=>s-ks(i-t,0,s,i)+e;var Ms=Object.freeze({__proto__:null,defaultEasing:Os,easeInBack:function(t,e,s,i){let r=arguments.length>4&&void 0!==arguments[4]?arguments[4]:1.70158;return s*(t/=i)*t*((r+1)*t-r)+e},easeInBounce:Ds,easeInCirc:(t,e,s,i)=>-s*(Math.sqrt(1-(t/=i)*t)-1)+e,easeInCubic:(t,e,s,i)=>s*(t/i)**3+e,easeInElastic:(t,e,s,i)=>{const r=s;let n=0;if(0===t)return e;if(1===(t/=i))return e+s;n||(n=.3*i);const{a:o,s:a,p:h}=ws(r,s,n,1.70158);return-Ts(o,a,h,t,i)+e},easeInExpo:(t,e,s,i)=>0===t?e:s*2**(10*(t/i-1))+e,easeInOutBack:function(t,e,s,i){let r=arguments.length>4&&void 0!==arguments[4]?arguments[4]:1.70158;return(t/=i/2)<1?s/2*(t*t*((1+(r*=1.525))*t-r))+e:s/2*((t-=2)*t*((1+(r*=1.525))*t+r)+2)+e},easeInOutBounce:(t,e,s,i)=>t(t/=i/2)<1?-s/2*(Math.sqrt(1-t**2)-1)+e:s/2*(Math.sqrt(1-(t-=2)*t)+1)+e,easeInOutCubic:(t,e,s,i)=>(t/=i/2)<1?s/2*t**3+e:s/2*((t-2)**3+2)+e,easeInOutElastic:(t,e,s,i)=>{const r=s;let n=0;if(0===t)return e;if(2===(t/=i/2))return e+s;n||(n=i*(.3*1.5));const{a:o,s:a,p:h,c:l}=ws(r,s,n,1.70158);return t<1?-.5*Ts(o,a,h,t,i)+e:o*Math.pow(2,-10*(t-=1))*Math.sin((t*i-a)*x/h)*.5+l+e},easeInOutExpo:(t,e,s,i)=>0===t?e:t===i?e+s:(t/=i/2)<1?s/2*2**(10*(t-1))+e:s/2*-(2**(-10*--t)+2)+e,easeInOutQuad:(t,e,s,i)=>(t/=i/2)<1?s/2*t**2+e:-s/2*(--t*(t-2)-1)+e,easeInOutQuart:(t,e,s,i)=>(t/=i/2)<1?s/2*t**4+e:-s/2*((t-=2)*t**3-2)+e,easeInOutQuint:(t,e,s,i)=>(t/=i/2)<1?s/2*t**5+e:s/2*((t-2)**5+2)+e,easeInOutSine:(t,e,s,i)=>-s/2*(Math.cos(Math.PI*t/i)-1)+e,easeInQuad:(t,e,s,i)=>s*(t/=i)*t+e,easeInQuart:(t,e,s,i)=>s*(t/=i)*t**3+e,easeInQuint:(t,e,s,i)=>s*(t/i)**5+e,easeInSine:(t,e,s,i)=>-s*Math.cos(t/i*y)+s+e,easeOutBack:function(t,e,s,i){let r=arguments.length>4&&void 0!==arguments[4]?arguments[4]:1.70158;return s*((t=t/i-1)*t*((r+1)*t+r)+1)+e},easeOutBounce:ks,easeOutCirc:(t,e,s,i)=>s*Math.sqrt(1-(t=t/i-1)*t)+e,easeOutCubic:(t,e,s,i)=>s*((t/i-1)**3+1)+e,easeOutElastic:(t,e,s,i)=>{const r=s;let n=0;if(0===t)return e;if(1===(t/=i))return e+s;n||(n=.3*i);const{a:o,s:a,p:h,c:l}=ws(r,s,n,1.70158);return o*2**(-10*t)*Math.sin((t*i-a)*x/h)+l+e},easeOutExpo:(t,e,s,i)=>t===i?e+s:s*-(2**(-10*t/i)+1)+e,easeOutQuad:(t,e,s,i)=>-s*(t/=i)*(t-2)+e,easeOutQuart:(t,e,s,i)=>-s*((t=t/i-1)*t**3-1)+e,easeOutQuint:(t,e,s,i)=>s*((t/i-1)**5+1)+e,easeOutSine:(t,e,s,i)=>s*Math.sin(t/i*y)+e});const Ps=()=>!1;class Es{constructor(t){let{startValue:s,byValue:i,duration:r=500,delay:n=0,easing:o=Os,onStart:a=v,onChange:h=v,onComplete:l=v,abort:c=Ps,target:u}=t;e(this,"_state","pending"),e(this,"durationProgress",0),e(this,"valueProgress",0),this.tick=this.tick.bind(this),this.duration=r,this.delay=n,this.easing=o,this._onStart=a,this._onChange=h,this._onComplete=l,this._abort=c,this.target=u,this.startValue=s,this.byValue=i,this.value=this.startValue,this.endValue=Object.freeze(this.calculate(this.duration).value)}get state(){return this._state}isDone(){return"aborted"===this._state||"completed"===this._state}start(){const t=t=>{"pending"===this._state&&(this.startTime=t||+new Date,this._state="running",this._onStart(),this.tick(this.startTime))};this.register(),this.delay>0?setTimeout(()=>ht(t),this.delay):ht(t)}tick(t){const e=(t||+new Date)-this.startTime,s=Math.min(e,this.duration);this.durationProgress=s/this.duration;const{value:i,valueProgress:r}=this.calculate(s);this.value=Object.freeze(i),this.valueProgress=r,"aborted"!==this._state&&(this._abort(this.value,this.valueProgress,this.durationProgress)?(this._state="aborted",this.unregister()):e>=this.duration?(this.durationProgress=this.valueProgress=1,this._onChange(this.endValue,this.valueProgress,this.durationProgress),this._state="completed",this._onComplete(this.endValue,this.valueProgress,this.durationProgress),this.unregister()):(this._onChange(this.value,this.valueProgress,this.durationProgress),ht(this.tick)))}register(){Q.push(this)}unregister(){Q.remove(this)}abort(){this._state="aborted",this.unregister()}}class As extends Es{constructor(t){let{startValue:e=0,endValue:s=100,...i}=t;super({...i,startValue:e,byValue:s-e})}calculate(t){const e=this.easing(t,this.startValue,this.byValue,this.duration);return{value:e,valueProgress:Math.abs((e-this.startValue)/this.byValue)}}}class js extends Es{constructor(t){let{startValue:e=[0],endValue:s=[100],...i}=t;super({...i,startValue:e,byValue:s.map((t,s)=>t-e[s])})}calculate(t){const e=this.startValue.map((e,s)=>this.easing(t,e,this.byValue[s],this.duration,s));return{value:e,valueProgress:Math.abs((e[0]-this.startValue[0])/this.byValue[0])}}}const Fs=(t,e,s,i)=>e+s*(1-Math.cos(t/i*y)),Ls=t=>t&&((e,s,i)=>t(new Ve(e).toRgba(),s,i));class Rs extends Es{constructor(t){let{startValue:e,endValue:s,easing:i=Fs,onChange:r,onComplete:n,abort:o,...a}=t;const h=new Ve(e).getSource(),l=new Ve(s).getSource();super({...a,startValue:h,byValue:l.map((t,e)=>t-h[e]),easing:i,onChange:Ls(r),onComplete:Ls(n),abort:Ls(o)})}calculate(t){const[e,s,i,r]=this.startValue.map((e,s)=>this.easing(t,e,this.byValue[s],this.duration,s)),n=[...[e,s,i].map(Math.round),xs(0,r,1)];return{value:n,valueProgress:n.map((t,e)=>0!==this.byValue[e]?Math.abs((t-this.startValue[e])/this.byValue[e]):0).find(t=>0!==t)||0}}}function Is(t){const e=(t=>Array.isArray(t.startValue)||Array.isArray(t.endValue))(t)?new js(t):new As(t);return e.start(),e}function Bs(t){const e=new Rs(t);return e.start(),e}class $s{constructor(t){this.status=t,this.points=[]}includes(t){return this.points.some(e=>e.eq(t))}append(){for(var t=arguments.length,e=new Array(t),s=0;s!this.includes(t))),this}static isPointContained(t,e,s){let i=arguments.length>3&&void 0!==arguments[3]&&arguments[3];if(e.eq(s))return t.eq(e);if(e.x===s.x)return t.x===e.x&&(i||t.y>=Math.min(e.y,s.y)&&t.y<=Math.max(e.y,s.y));if(e.y===s.y)return t.y===e.y&&(i||t.x>=Math.min(e.x,s.x)&&t.x<=Math.max(e.x,s.x));{const r=xe(e,s),n=xe(e,t).divide(r);return i?Math.abs(n.x)===Math.abs(n.y):n.x===n.y&&n.x>=0&&n.x<=1}}static isPointInPolygon(t,e){const s=new it(t).setX(Math.min(t.x-1,...e.map(t=>t.x)));let i=0;for(let r=0;r4&&void 0!==arguments[4])||arguments[4],n=!(arguments.length>5&&void 0!==arguments[5])||arguments[5];const o=e.x-t.x,a=e.y-t.y,h=i.x-s.x,l=i.y-s.y,c=t.x-s.x,u=t.y-s.y,d=h*u-l*c,g=o*u-a*c,f=l*o-h*a;if(0!==f){const e=d/f,s=g/f;return(r||0<=e&&e<=1)&&(n||0<=s&&s<=1)?new $s("Intersection").append(new it(t.x+e*o,t.y+e*a)):new $s}if(0===d||0===g){const o=r||n||$s.isPointContained(t,s,i)||$s.isPointContained(e,s,i)||$s.isPointContained(s,t,e)||$s.isPointContained(i,t,e);return new $s(o?"Coincident":void 0)}return new $s("Parallel")}static intersectSegmentLine(t,e,s,i){return $s.intersectLineLine(t,e,s,i,!1,!0)}static intersectSegmentSegment(t,e,s,i){return $s.intersectLineLine(t,e,s,i,!1,!1)}static intersectLinePolygon(t,e,s){let i=!(arguments.length>3&&void 0!==arguments[3])||arguments[3];const r=new $s,n=s.length;for(let o,a,h,l=0;l0&&(r.status="Intersection"),r}static intersectSegmentPolygon(t,e,s){return $s.intersectLinePolygon(t,e,s,!1)}static intersectPolygonPolygon(t,e){const s=new $s,i=t.length,r=[];for(let n=0;n0&&r.length===t.length?new $s("Coincident"):(s.points.length>0&&(s.status="Intersection"),s)}static intersectPolygonRectangle(t,e,s){const i=e.min(s),r=e.max(s),n=new it(r.x,i.y),o=new it(i.x,r.y);return $s.intersectPolygonPolygon(t,[i,n,r,o])}}class Xs extends at{getX(){return this.getXY().x}setX(t){this.setXY(this.getXY().setX(t))}getY(){return this.getXY().y}setY(t){this.setXY(this.getXY().setY(t))}getRelativeX(){return this.left}setRelativeX(t){this.left=t}getRelativeY(){return this.top}setRelativeY(t){this.top=t}getXY(){const t=this.getRelativeXY();return this.group?xt(t,this.group.calcTransformMatrix()):t}setXY(t,e,s){this.group&&(t=xt(t,Ct(this.group.calcTransformMatrix()))),this.setRelativeXY(t,e,s)}getRelativeXY(){return new it(this.left,this.top)}setRelativeXY(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:this.originX,s=arguments.length>2&&void 0!==arguments[2]?arguments[2]:this.originY;this.setPositionByOrigin(t,e,s)}isStrokeAccountedForInDimensions(){return!1}getCoords(){const{tl:t,tr:e,br:s,bl:i}=this.aCoords||(this.aCoords=this.calcACoords()),r=[t,e,s,i];if(this.group){const t=this.group.calcTransformMatrix();return r.map(e=>xt(e,t))}return r}intersectsWithRect(t,e){return"Intersection"===$s.intersectPolygonRectangle(this.getCoords(),t,e).status}intersectsWithObject(t){const e=$s.intersectPolygonPolygon(this.getCoords(),t.getCoords());return"Intersection"===e.status||"Coincident"===e.status||t.isContainedWithinObject(this)||this.isContainedWithinObject(t)}isContainedWithinObject(t){return this.getCoords().every(e=>t.containsPoint(e))}isContainedWithinRect(t,e){const{left:s,top:i,width:r,height:n}=this.getBoundingRect();return s>=t.x&&s+r<=e.x&&i>=t.y&&i+n<=e.y}isOverlapping(t){return this.intersectsWithObject(t)||this.isContainedWithinObject(t)||t.isContainedWithinObject(this)}containsPoint(t){return $s.isPointInPolygon(t,this.getCoords())}isOnScreen(){if(!this.canvas)return!1;const{tl:t,br:e}=this.canvas.vptCoords;return!!this.getCoords().some(s=>s.x<=e.x&&s.x>=t.x&&s.y<=e.y&&s.y>=t.y)||(!!this.intersectsWithRect(t,e)||this.containsPoint(t.midPointFrom(e)))}isPartiallyOnScreen(){if(!this.canvas)return!1;const{tl:t,br:e}=this.canvas.vptCoords;if(this.intersectsWithRect(t,e))return!0;return this.getCoords().every(s=>(s.x>=e.x||s.x<=t.x)&&(s.y>=e.y||s.y<=t.y))&&this.containsPoint(t.midPointFrom(e))}getBoundingRect(){return re(this.getCoords())}getScaledWidth(){return this._getTransformedDimensions().x}getScaledHeight(){return this._getTransformedDimensions().y}scale(t){this._set(W,t),this._set(V,t),this.setCoords()}scaleToWidth(t){const e=this.getBoundingRect().width/this.getScaledWidth();return this.scale(t/this.width/e)}scaleToHeight(t){const e=this.getBoundingRect().height/this.getScaledHeight();return this.scale(t/this.height/e)}getCanvasRetinaScaling(){var t;return(null===(t=this.canvas)||void 0===t?void 0:t.getRetinaScaling())||1}getTotalAngle(){return this.group?yt(wt(this.calcTransformMatrix())):this.angle}getViewportTransform(){var t;return(null===(t=this.canvas)||void 0===t?void 0:t.viewportTransform)||b.concat()}calcACoords(){const t=kt({angle:this.angle}),{x:e,y:s}=this.getRelativeCenterPoint(),i=Ot(e,s),r=bt(i,t),n=this._getTransformedDimensions(),o=n.x/2,a=n.y/2;return{tl:xt({x:-o,y:-a},r),tr:xt({x:o,y:-a},r),bl:xt({x:-o,y:a},r),br:xt({x:o,y:a},r)}}setCoords(){this.aCoords=this.calcACoords()}transformMatrixKey(){let t=arguments.length>0&&void 0!==arguments[0]&&arguments[0],e=[];return!t&&this.group&&(e=this.group.transformMatrixKey(t)),e.push(this.top,this.left,this.width,this.height,this.scaleX,this.scaleY,this.angle,this.strokeWidth,this.skewX,this.skewY,+this.flipX,+this.flipY,me(this.originX),me(this.originY)),e}calcTransformMatrix(){let t=arguments.length>0&&void 0!==arguments[0]&&arguments[0],e=this.calcOwnMatrix();if(t||!this.group)return e;const s=this.transformMatrixKey(t),i=this.matrixCache;return i&&i.key.every((t,e)=>t===s[e])?i.value:(this.group&&(e=bt(this.group.calcTransformMatrix(!1),e)),this.matrixCache={key:s,value:e},e)}calcOwnMatrix(){const t=this.transformMatrixKey(!0),e=this.ownMatrixCache;if(e&&e.key===t)return e.value;const s=this.getRelativeCenterPoint(),i={angle:this.angle,translateX:s.x,translateY:s.y,scaleX:this.scaleX,scaleY:this.scaleY,skewX:this.skewX,skewY:this.skewY,flipX:this.flipX,flipY:this.flipY},r=jt(i);return this.ownMatrixCache={key:t,value:r},r}_getNonTransformedDimensions(){return new it(this.width,this.height).scalarAdd(this.strokeWidth)}_calculateCurrentDimensions(t){return this._getTransformedDimensions(t).transform(this.getViewportTransform(),!0).scalarAdd(2*this.padding)}_getTransformedDimensions(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};const e={scaleX:this.scaleX,scaleY:this.scaleY,skewX:this.skewX,skewY:this.skewY,width:this.width,height:this.height,strokeWidth:this.strokeWidth,...t},s=e.strokeWidth;let i=s,r=0;this.strokeUniform&&(i=0,r=s);const n=e.width+i,o=e.height+i;let a;return a=0===e.skewX&&0===e.skewY?new it(n*e.scaleX,o*e.scaleY):le(n,o,At(e)),a.scalarAdd(r)}translateToGivenOrigin(t,e,s,i,r){let n=t.x,o=t.y;const a=me(i)-me(e),h=me(r)-me(s);if(a||h){const t=this._getTransformedDimensions();n+=a*t.x,o+=h*t.y}return new it(n,o)}translateToCenterPoint(t,e,s){if(e===T&&s===T)return t;const i=this.translateToGivenOrigin(t,e,s,T,T);return this.angle?i.rotate(vt(this.angle),t):i}translateToOriginPoint(t,e,s){const i=this.translateToGivenOrigin(t,T,T,e,s);return this.angle?i.rotate(vt(this.angle),t):i}getCenterPoint(){const t=this.getRelativeCenterPoint();return this.group?xt(t,this.group.calcTransformMatrix()):t}getRelativeCenterPoint(){return this.translateToCenterPoint(new it(this.left,this.top),this.originX,this.originY)}getPointByOrigin(t,e){return this.translateToOriginPoint(this.getRelativeCenterPoint(),t,e)}setPositionByOrigin(t,e,s){const i=this.translateToCenterPoint(t,e,s),r=this.translateToOriginPoint(i,this.originX,this.originY);this.set({left:r.x,top:r.y})}_getLeftTopCoords(){return this.translateToOriginPoint(this.getRelativeCenterPoint(),O,k)}}let Ys=class t extends Xs{static getDefaults(){return t.ownDefaults}get type(){const t=this.constructor.type;return"FabricObject"===t?"object":t.toLowerCase()}set type(t){r("warn","Setting type has no effect",t)}constructor(s){super(),e(this,"_cacheContext",null),Object.assign(this,t.ownDefaults),this.setOptions(s)}_createCacheCanvas(){this._cacheCanvas=dt(),this._cacheContext=this._cacheCanvas.getContext("2d"),this._updateCacheCanvas(),this.dirty=!0}_limitCacheSize(t){const e=t.width,s=t.height,r=i.maxCacheSideLimit,n=i.minCacheSideLimit;if(e<=r&&s<=r&&e*s<=i.perfLimitSizeTotal)return el&&(t.zoomX/=e/l,t.width=l,t.capped=!0),s>c&&(t.zoomY/=s/c,t.height=c,t.capped=!0),t}_getCacheCanvasDimensions(){const t=this.getTotalObjectScaling(),e=this._getTransformedDimensions({skewX:0,skewY:0}),s=e.x*t.x/this.scaleX,i=e.y*t.y/this.scaleY;return{width:Math.ceil(s+2),height:Math.ceil(i+2),zoomX:t.x,zoomY:t.y,x:s,y:i}}_updateCacheCanvas(){const t=this._cacheCanvas,e=this._cacheContext,{width:s,height:i,zoomX:r,zoomY:n,x:o,y:a}=this._limitCacheSize(this._getCacheCanvasDimensions()),h=s!==t.width||i!==t.height,l=this.zoomX!==r||this.zoomY!==n;if(!t||!e)return!1;if(h||l){s!==t.width||i!==t.height?(t.width=s,t.height=i):(e.setTransform(1,0,0,1,0,0),e.clearRect(0,0,t.width,t.height));const h=o/2,l=a/2;return this.cacheTranslationX=Math.round(t.width/2-h)+h,this.cacheTranslationY=Math.round(t.height/2-l)+l,e.translate(this.cacheTranslationX,this.cacheTranslationY),e.scale(r,n),this.zoomX=r,this.zoomY=n,!0}return!1}setOptions(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};this._setOptions(t)}transform(t){const e=this.group&&!this.group._transformDone||this.group&&this.canvas&&t===this.canvas.contextTop,s=this.calcTransformMatrix(!e);t.transform(s[0],s[1],s[2],s[3],s[4],s[5])}getObjectScaling(){if(!this.group)return new it(Math.abs(this.scaleX),Math.abs(this.scaleY));const t=Tt(this.calcTransformMatrix());return new it(Math.abs(t.scaleX),Math.abs(t.scaleY))}getTotalObjectScaling(){const t=this.getObjectScaling();if(this.canvas){const e=this.canvas.getZoom(),s=this.getCanvasRetinaScaling();return t.scalarMultiply(e*s)}return t}getObjectOpacity(){let t=this.opacity;return this.group&&(t*=this.group.getObjectOpacity()),t}_constrainScale(t){return Math.abs(t){t.transform(i)}),e.parentClipPaths.push(t),t.absolutePositioned){const t=Ct(this.calcTransformMatrix());i.transform(t[0],t[1],t[2],t[3],t[4],t[5])}return t.transform(i),t.drawObject(i,!0,e),s}_drawClipPath(t,e,s){if(!e)return;e._transformDone=!0;const i=this.createClipPathLayer(e,s);this.drawClipPathOnCache(t,e,i)}drawCacheOnCanvas(t){t.scale(1/this.zoomX,1/this.zoomY),t.drawImage(this._cacheCanvas,-this.cacheTranslationX,-this.cacheTranslationY)}isCacheDirty(){let t=arguments.length>0&&void 0!==arguments[0]&&arguments[0];if(this.isNotVisible())return!1;const e=this._cacheCanvas,s=this._cacheContext;return!(!e||!s||t||!this._updateCacheCanvas())||!!(this.dirty||this.clipPath&&this.clipPath.absolutePositioned)&&(e&&s&&!t&&(s.save(),s.setTransform(1,0,0,1,0,0),s.clearRect(0,0,e.width,e.height),s.restore()),!0)}_renderBackground(t){if(!this.backgroundColor)return;const e=this._getNonTransformedDimensions();t.fillStyle=this.backgroundColor,t.fillRect(-e.x/2,-e.y/2,e.x,e.y),this._removeShadow(t)}_setOpacity(t){this.group&&!this.group._transformDone?t.globalAlpha=this.getObjectOpacity():t.globalAlpha*=this.opacity}_setStrokeStyles(t,e){const s=e.stroke;s&&(t.lineWidth=e.strokeWidth,t.lineCap=e.strokeLineCap,t.lineDashOffset=e.strokeDashOffset,t.lineJoin=e.strokeLineJoin,t.miterLimit=e.strokeMiterLimit,Yt(s)?"percentage"===s.gradientUnits||s.gradientTransform||s.patternTransform?this._applyPatternForTransformedGradient(t,s):(t.strokeStyle=s.toLive(t),this._applyPatternGradientTransform(t,s)):t.strokeStyle=e.stroke)}_setFillStyles(t,e){let{fill:s}=e;s&&(Yt(s)?(t.fillStyle=s.toLive(t),this._applyPatternGradientTransform(t,s)):t.fillStyle=s)}_setClippingProperties(t){t.globalAlpha=1,t.strokeStyle="transparent",t.fillStyle="#000000"}_setLineDash(t,e){e&&0!==e.length&&t.setLineDash(e)}_setShadow(t){if(!this.shadow)return;const e=this.shadow,s=this.canvas,r=this.getCanvasRetinaScaling(),[n,,,o]=(null==s?void 0:s.viewportTransform)||b,a=n*r,h=o*r,l=e.nonScaling?new it(1,1):this.getObjectScaling();t.shadowColor=e.color,t.shadowBlur=e.blur*i.browserShadowBlurConstant*(a+h)*(l.x+l.y)/4,t.shadowOffsetX=e.offsetX*a*l.x,t.shadowOffsetY=e.offsetY*h*l.y}_removeShadow(t){this.shadow&&(t.shadowColor="",t.shadowBlur=t.shadowOffsetX=t.shadowOffsetY=0)}_applyPatternGradientTransform(t,e){if(!Yt(e))return{offsetX:0,offsetY:0};const s=e.gradientTransform||e.patternTransform,i=-this.width/2+e.offsetX||0,r=-this.height/2+e.offsetY||0;return"percentage"===e.gradientUnits?t.transform(this.width,0,0,this.height,i,r):t.transform(1,0,0,1,i,r),s&&t.transform(s[0],s[1],s[2],s[3],s[4],s[5]),{offsetX:i,offsetY:r}}_renderPaintInOrder(t){this.paintFirst===N?(this._renderStroke(t),this._renderFill(t)):(this._renderFill(t),this._renderStroke(t))}_render(t){}_renderFill(t){this.fill&&(t.save(),this._setFillStyles(t,this),"evenodd"===this.fillRule?t.fill("evenodd"):t.fill(),t.restore())}_renderStroke(t){if(this.stroke&&0!==this.strokeWidth){if(this.shadow&&!this.shadow.affectStroke&&this._removeShadow(t),t.save(),this.strokeUniform){const e=this.getObjectScaling();t.scale(1/e.x,1/e.y)}this._setLineDash(t,this.strokeDashArray),this._setStrokeStyles(t,this),t.stroke(),t.restore()}}_applyPatternForTransformedGradient(t,e){var s;const i=this._limitCacheSize(this._getCacheCanvasDimensions()),r=this.getCanvasRetinaScaling(),n=i.x/this.scaleX/r,o=i.y/this.scaleY/r,a=ft({width:Math.ceil(n),height:Math.ceil(o)}),h=a.getContext("2d");h&&(h.beginPath(),h.moveTo(0,0),h.lineTo(n,0),h.lineTo(n,o),h.lineTo(0,o),h.closePath(),h.translate(n/2,o/2),h.scale(i.zoomX/this.scaleX/r,i.zoomY/this.scaleY/r),this._applyPatternGradientTransform(h,e),h.fillStyle=e.toLive(t),h.fill(),t.translate(-this.width/2-this.strokeWidth/2,-this.height/2-this.strokeWidth/2),t.scale(r*this.scaleX/i.zoomX,r*this.scaleY/i.zoomY),t.strokeStyle=null!==(s=h.createPattern(a,"no-repeat"))&&void 0!==s?s:"")}_findCenterFromElement(){return new it(this.left+this.width/2,this.top+this.height/2)}clone(t){const e=this.toObject(t);return this.constructor.fromObject(e)}cloneAsImage(t){const e=this.toCanvasElement(t);return new(J.getClass("image"))(e)}toCanvasElement(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};const e=he(this),s=this.group,i=this.shadow,r=Math.abs,n=t.enableRetinaScaling?f():1,o=(t.multiplier||1)*n,a=t.canvasProvider||(t=>new Zt(t,{enableRetinaScaling:!1,renderOnAddRemove:!1,skipOffscreen:!1}));delete this.group,t.withoutTransform&&ae(this),t.withoutShadow&&(this.shadow=null),t.viewportTransform&&ge(this,this.getViewportTransform()),this.setCoords();const h=dt(),l=this.getBoundingRect(),c=this.shadow,u=new it;if(c){const t=c.blur,e=c.nonScaling?new it(1,1):this.getObjectScaling();u.x=2*Math.round(r(c.offsetX)+t)*r(e.x),u.y=2*Math.round(r(c.offsetY)+t)*r(e.y)}const d=l.width+u.x,g=l.height+u.y;h.width=Math.ceil(d),h.height=Math.ceil(g);const p=a(h);"jpeg"===t.format&&(p.backgroundColor="#fff"),this.setPositionByOrigin(new it(p.width/2,p.height/2),T,T);const m=this.canvas;p._objects=[this],this.set("canvas",p),this.setCoords();const v=p.toCanvasElement(o||1,t);return this.set("canvas",m),this.shadow=i,s&&(this.group=s),this.set(e),this.setCoords(),p._objects=[],p.destroy(),v}toDataURL(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};return pt(this.toCanvasElement(t),t.format||"png",t.quality||1)}toBlob(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};return mt(this.toCanvasElement(t),t.format||"png",t.quality||1)}isType(){for(var t=arguments.length,e=new Array(t),s=0;s{let[i,r]=s;return t[i]=this._animate(i,r,e),t},{})}_animate(t,e){let s=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};const i=t.split("."),r=this.constructor.colorProperties.includes(i[i.length-1]),{abort:n,startValue:o,onChange:a,onComplete:h}=s,l={...s,target:this,startValue:null!=o?o:i.reduce((t,e)=>t[e],this),endValue:e,abort:null==n?void 0:n.bind(this),onChange:(t,e,s)=>{i.reduce((e,s,r)=>(r===i.length-1&&(e[s]=t),e[s]),this),a&&a(t,e,s)},onComplete:(t,e,s)=>{this.setCoords(),h&&h(t,e,s)}};return r?Bs(l):Is(l)}isDescendantOf(t){const{parent:e,group:s}=this;return e===t||s===t||!!e&&e.isDescendantOf(t)||!!s&&s!==e&&s.isDescendantOf(t)}getAncestors(){const t=[];let e=this;do{e=e.parent,e&&t.push(e)}while(e);return t}findCommonAncestors(t){if(this===t)return{fork:[],otherFork:[],common:[this,...this.getAncestors()]};const e=this.getAncestors(),s=t.getAncestors();if(0===e.length&&s.length>0&&this===s[s.length-1])return{fork:[],otherFork:[t,...s.slice(0,s.length-1)],common:[this]};for(let i,r=0;r-1&&n>o}toObject(){const e=(arguments.length>0&&void 0!==arguments[0]?arguments[0]:[]).concat(t.customProperties,this.constructor.customProperties||[]);let s;const r=i.NUM_FRACTION_DIGITS,{clipPath:n,fill:o,stroke:a,shadow:h,strokeDashArray:l,left:c,top:u,originX:d,originY:g,width:f,height:p,strokeWidth:v,strokeLineCap:y,strokeDashOffset:_,strokeLineJoin:x,strokeUniform:C,strokeMiterLimit:b,scaleX:S,scaleY:w,angle:T,flipX:O,flipY:k,opacity:D,visible:M,backgroundColor:P,fillRule:E,paintFirst:A,globalCompositeOperation:j,skewX:F,skewY:L}=this;n&&!n.excludeFromExport&&(s=n.toObject(e.concat("inverted","absolutePositioned")));const R=t=>$t(t,r),I={...It(this,e),type:this.constructor.type,version:m,originX:d,originY:g,left:R(c),top:R(u),width:R(f),height:R(p),fill:Wt(o)?o.toObject():o,stroke:Wt(a)?a.toObject():a,strokeWidth:R(v),strokeDashArray:l?l.concat():l,strokeLineCap:y,strokeDashOffset:_,strokeLineJoin:x,strokeUniform:C,strokeMiterLimit:R(b),scaleX:R(S),scaleY:R(w),angle:R(T),flipX:O,flipY:k,opacity:R(D),shadow:h?h.toObject():h,visible:M,backgroundColor:P,fillRule:E,paintFirst:A,globalCompositeOperation:j,skewX:R(F),skewY:R(L),...s?{clipPath:s}:null};return this.includeDefaultValues?I:this._removeDefaultValues(I)}toDatalessObject(t){return this.toObject(t)}_removeDefaultValues(t){const e=this.constructor.getDefaults(),s=Object.keys(e).length>0?e:Object.getPrototypeOf(this);return Bt(t,(t,e)=>{if(e===O||e===k||"type"===e)return!0;const i=s[e];return t!==i&&!(Array.isArray(t)&&Array.isArray(i)&&0===t.length&&0===i.length)})}toString(){return`#<${this.constructor.type}>`}static _fromObject(t){let{type:e,...s}=t,{extraParam:i,...r}=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return Rt(s,r).then(t=>i?(delete t[i],new this(s[i],t)):new this(t))}static fromObject(t,e){return this._fromObject(t,e)}};e(Ys,"stateProperties",Cs),e(Ys,"cacheProperties",bs),e(Ys,"ownDefaults",Ss),e(Ys,"type","FabricObject"),e(Ys,"colorProperties",[H,N,"backgroundColor"]),e(Ys,"customProperties",[]),J.setClass(Ys),J.setClass(Ys,"object");const Ws=(t,e,s)=>(i,r,n,o)=>{const a=e(i,r,n,o);return a&&fe(t,{...je(i,r,n,o),...s}),a};function Vs(t){return(e,s,i,r)=>{const{target:n,originX:o,originY:a}=s,h=n.getRelativeCenterPoint(),l=n.translateToOriginPoint(h,o,a),c=t(e,s,i,r);return n.setPositionByOrigin(l,s.originX,s.originY),c}}const Gs=Ws(I,Vs((t,e,s,i)=>{const r=Le(e,e.originX,e.originY,s,i);if(me(e.originX)===me(T)||me(e.originX)===me(M)&&r.x<0||me(e.originX)===me(O)&&r.x>0){const{target:t}=e,s=t.strokeWidth/(t.strokeUniform?t.scaleX:1),i=Pe(e)?2:1,n=t.width,o=Math.abs(r.x*i/t.scaleX)-s;return t.set("width",Math.max(o,1)),n!==t.width}return!1}));function zs(t,e,s,i,r){i=i||{};const n=this.sizeX||i.cornerSize||r.cornerSize,o=this.sizeY||i.cornerSize||r.cornerSize,a=void 0!==i.transparentCorners?i.transparentCorners:r.transparentCorners,h=a?N:H,l=!a&&(i.cornerStrokeColor||r.cornerStrokeColor);let c,u=e,d=s;t.save(),t.fillStyle=i.cornerColor||r.cornerColor||"",t.strokeStyle=i.cornerStrokeColor||r.cornerStrokeColor||"",n>o?(c=n,t.scale(1,o/n),d=s*n/o):o>n?(c=o,t.scale(n/o,1),u=e*o/n):c=n,t.beginPath(),t.arc(u,d,c/2,0,x,!1),t[h](),l&&t.stroke(),t.restore()}function Hs(t,e,s,i,r){i=i||{};const n=this.sizeX||i.cornerSize||r.cornerSize,o=this.sizeY||i.cornerSize||r.cornerSize,a=void 0!==i.transparentCorners?i.transparentCorners:r.transparentCorners,h=a?N:H,l=!a&&(i.cornerStrokeColor||r.cornerStrokeColor),c=n/2,u=o/2;t.save(),t.fillStyle=i.cornerColor||r.cornerColor||"",t.strokeStyle=i.cornerStrokeColor||r.cornerStrokeColor||"",t.translate(e,s);const d=r.getTotalAngle();t.rotate(vt(d)),t[`${h}Rect`](-c,-u,n,o),l&&t.strokeRect(-c,-u,n,o),t.restore()}class Ns{constructor(t){e(this,"visible",!0),e(this,"actionName",Y),e(this,"angle",0),e(this,"x",0),e(this,"y",0),e(this,"offsetX",0),e(this,"offsetY",0),e(this,"sizeX",0),e(this,"sizeY",0),e(this,"touchSizeX",0),e(this,"touchSizeY",0),e(this,"cursorStyle","crosshair"),e(this,"withConnection",!1),Object.assign(this,t)}shouldActivate(t,e,s,i){var r;let{tl:n,tr:o,br:a,bl:h}=i;return(null===(r=e.canvas)||void 0===r?void 0:r.getActiveObject())===e&&e.isControlVisible(t)&&$s.isPointInPolygon(s,[n,o,a,h])}getActionHandler(t,e,s){return this.actionHandler}getMouseDownHandler(t,e,s){return this.mouseDownHandler}getMouseUpHandler(t,e,s){return this.mouseUpHandler}cursorStyleHandler(t,e,s,i){return e.cursorStyle}getActionName(t,e,s){return e.actionName}getVisibility(t,e){var s,i;return null!==(s=null===(i=t._controlsVisibility)||void 0===i?void 0:i[e])&&void 0!==s?s:this.visible}setVisibility(t,e,s){this.visible=t}positionHandler(t,e,s,i){return new it(this.x*t.x+this.offsetX,this.y*t.y+this.offsetY).transform(e)}calcCornerCoords(t,e,s,i,r,n){const o=St([Ot(s,i),kt({angle:t}),Dt((r?this.touchSizeX:this.sizeX)||e,(r?this.touchSizeY:this.sizeY)||e)]);return{tl:new it(-.5,-.5).transform(o),tr:new it(.5,-.5).transform(o),br:new it(.5,.5).transform(o),bl:new it(-.5,.5).transform(o)}}render(t,e,s,i,r){if("circle"===((i=i||{}).cornerStyle||r.cornerStyle))zs.call(this,t,e,s,i,r);else Hs.call(this,t,e,s,i,r)}}const Us=(t,e,s)=>s.lockRotation?Me:e.cursorStyle,qs=Ws(F,Vs((t,e,s,i)=>{let{target:r,ex:n,ey:o,theta:a,originX:h,originY:l}=e;const c=r.translateToOriginPoint(r.getRelativeCenterPoint(),h,l);if(Ae(r,"lockRotation"))return!1;const u=Math.atan2(o-c.y,n-c.x),d=Math.atan2(i-c.y,s-c.x);let g=yt(d-u+a);if(r.snapAngle&&r.snapAngle>0){const t=r.snapAngle,e=r.snapThreshold||t,s=Math.ceil(g/t)*t,i=Math.floor(g/t)*t;Math.abs(g-i){const r=Ks(t,s);if(Js(s,0!==e.x&&0===e.y?"x":0===e.x&&0!==e.y?"y":"",r))return Me;const n=Fe(s,0,i);return`${Qs[n]}-resize`};function ti(t,e,s,i){let r=arguments.length>4&&void 0!==arguments[4]?arguments[4]:{};const n=e.target,o=r.by,a=Ks(t,n);let h,l,c,u,d,g;if(Js(n,o,a))return!1;if(e.gestureScale)l=e.scaleX*e.gestureScale,c=e.scaleY*e.gestureScale;else{if(h=Le(e,e.originX,e.originY,s,i),d="y"!==o?Math.sign(h.x||e.signX||1):1,g="x"!==o?Math.sign(h.y||e.signY||1):1,e.signX||(e.signX=d),e.signY||(e.signY=g),Ae(n,"lockScalingFlip")&&(e.signX!==d||e.signY!==g))return!1;if(u=n._getTransformedDimensions(),a&&!o){const t=Math.abs(h.x)+Math.abs(h.y),{original:s}=e,i=t/(Math.abs(u.x*s.scaleX/n.scaleX)+Math.abs(u.y*s.scaleY/n.scaleY));l=s.scaleX*i,c=s.scaleY*i}else l=Math.abs(h.x*n.scaleX/u.x),c=Math.abs(h.y*n.scaleY/u.y);Pe(e)&&(l*=2,c*=2),e.signX!==d&&"y"!==o&&(e.originX=Ee(e.originX),l*=-1,e.signX=d),e.signY!==g&&"x"!==o&&(e.originY=Ee(e.originY),c*=-1,e.signY=g)}const f=n.scaleX,p=n.scaleY;return o?("x"===o&&n.set(W,l),"y"===o&&n.set(V,c)):(!Ae(n,"lockScalingX")&&n.set(W,l),!Ae(n,"lockScalingY")&&n.set(V,c)),f!==n.scaleX||p!==n.scaleY}const ei=Ws(j,Vs((t,e,s,i)=>ti(t,e,s,i))),si=Ws(j,Vs((t,e,s,i)=>ti(t,e,s,i,{by:"x"}))),ii=Ws(j,Vs((t,e,s,i)=>ti(t,e,s,i,{by:"y"}))),ri={x:{counterAxis:"y",scale:W,skew:G,lockSkewing:"lockSkewingX",origin:"originX",flip:"flipX"},y:{counterAxis:"x",scale:V,skew:z,lockSkewing:"lockSkewingY",origin:"originY",flip:"flipY"}},ni=["ns","nesw","ew","nwse"],oi=(t,e,s,i)=>{if(0!==e.x&&Ae(s,"lockSkewingY"))return Me;if(0!==e.y&&Ae(s,"lockSkewingX"))return Me;const r=Fe(s,0,i)%4;return`${ni[r]}-resize`};function ai(t,e,s,i,r){const{target:n}=s,{counterAxis:o,origin:a,lockSkewing:h,skew:l,flip:c}=ri[t];if(Ae(n,h))return!1;const{origin:u,flip:d}=ri[o],g=me(s[u])*(n[d]?-1:1),f=-Math.sign(g)*(n[c]?-1:1),p=.5*-((0===n[l]&&Le(s,T,T,i,r)[t]>0||n[l]>0?1:-1)*f)+.5,m=Ws(R,Vs((e,s,i,r)=>function(t,e,s){let{target:i,ex:r,ey:n,skewingSide:o,...a}=e;const{skew:h}=ri[t],l=s.subtract(new it(r,n)).divide(new it(i.scaleX,i.scaleY))[t],c=i[h],u=a[h],d=Math.tan(vt(u)),g="y"===t?i._getTransformedDimensions({scaleX:1,scaleY:1,skewX:0}).x:i._getTransformedDimensions({scaleX:1,scaleY:1}).y,f=2*l*o/Math.max(g,1)+d,p=yt(Math.atan(f));i.set(h,p);const m=c!==i[h];if(m&&"y"===t){const{skewX:t,scaleX:e}=i,s=i._getTransformedDimensions({skewY:c}),r=i._getTransformedDimensions(),n=0!==t?s.x/r.x:1;1!==n&&i.set(W,n*e)}return m}(t,s,new it(i,r))));return m(e,{...s,[a]:p,skewingSide:f},i,r)}const hi=(t,e,s,i)=>ai("x",t,e,s,i),li=(t,e,s,i)=>ai("y",t,e,s,i);function ci(t,e){return t[e.canvas.altActionKey]}const ui=(t,e,s)=>{const i=ci(t,s);return 0===e.x?i?G:V:0===e.y?i?z:W:""},di=(t,e,s,i)=>ci(t,s)?oi(0,e,s,i):Zs(t,e,s,i),gi=(t,e,s,i)=>ci(t,e.target)?li(t,e,s,i):si(t,e,s,i),fi=(t,e,s,i)=>ci(t,e.target)?hi(t,e,s,i):ii(t,e,s,i),pi=()=>({ml:new Ns({x:-.5,y:0,cursorStyleHandler:di,actionHandler:gi,getActionName:ui}),mr:new Ns({x:.5,y:0,cursorStyleHandler:di,actionHandler:gi,getActionName:ui}),mb:new Ns({x:0,y:.5,cursorStyleHandler:di,actionHandler:fi,getActionName:ui}),mt:new Ns({x:0,y:-.5,cursorStyleHandler:di,actionHandler:fi,getActionName:ui}),tl:new Ns({x:-.5,y:-.5,cursorStyleHandler:Zs,actionHandler:ei}),tr:new Ns({x:.5,y:-.5,cursorStyleHandler:Zs,actionHandler:ei}),bl:new Ns({x:-.5,y:.5,cursorStyleHandler:Zs,actionHandler:ei}),br:new Ns({x:.5,y:.5,cursorStyleHandler:Zs,actionHandler:ei}),mtr:new Ns({x:0,y:-.5,actionHandler:qs,cursorStyleHandler:Us,offsetY:-40,withConnection:!0,actionName:L})}),mi=()=>({mr:new Ns({x:.5,y:0,actionHandler:Gs,cursorStyleHandler:di,actionName:I}),ml:new Ns({x:-.5,y:0,actionHandler:Gs,cursorStyleHandler:di,actionName:I})}),vi=()=>({...pi(),...mi()});class yi extends Ys{static getDefaults(){return{...super.getDefaults(),...yi.ownDefaults}}constructor(t){super(),Object.assign(this,this.constructor.createControls(),yi.ownDefaults),this.setOptions(t)}static createControls(){return{controls:pi()}}_updateCacheCanvas(){const t=this.canvas;if(this.noScaleCache&&t&&t._currentTransform){const e=t._currentTransform,s=e.target,i=e.action;if(this===s&&i&&i.startsWith(Y))return!1}return super._updateCacheCanvas()}getActiveControl(){const t=this.__corner;return t?{key:t,control:this.controls[t],coord:this.oCoords[t]}:void 0}findControl(t){let e=arguments.length>1&&void 0!==arguments[1]&&arguments[1];if(!this.hasControls||!this.canvas)return;this.__corner=void 0;const s=Object.entries(this.oCoords);for(let i=s.length-1;i>=0;i--){const[r,n]=s[i],o=this.controls[r];if(o.shouldActivate(r,this,t,e?n.touchCorner:n.corner))return this.__corner=r,{key:r,control:o,coord:this.oCoords[r]}}}calcOCoords(){const t=this.getViewportTransform(),e=this.getCenterPoint(),s=Ot(e.x,e.y),i=kt({angle:this.getTotalAngle()-(this.group&&this.flipX?180:0)}),r=bt(s,i),n=bt(t,r),o=bt(n,[1/t[0],0,0,1/t[3],0,0]),a=this.group?Tt(this.calcTransformMatrix()):void 0;a&&(a.scaleX=Math.abs(a.scaleX),a.scaleY=Math.abs(a.scaleY));const h=this._calculateCurrentDimensions(a),l={};return this.forEachControl((t,e)=>{const s=t.positionHandler(h,o,this,t);l[e]=Object.assign(s,this._calcCornerCoords(t,s))}),l}_calcCornerCoords(t,e){const s=this.getTotalAngle();return{corner:t.calcCornerCoords(s,this.cornerSize,e.x,e.y,!1,this),touchCorner:t.calcCornerCoords(s,this.touchCornerSize,e.x,e.y,!0,this)}}setCoords(){super.setCoords(),this.canvas&&(this.oCoords=this.calcOCoords())}forEachControl(t){for(const e in this.controls)t(this.controls[e],e,this)}drawSelectionBackground(t){if(!this.selectionBackgroundColor||this.canvas&&this.canvas._activeObject!==this)return;t.save();const e=this.getRelativeCenterPoint(),s=this._calculateCurrentDimensions(),i=this.getViewportTransform();t.translate(e.x,e.y),t.scale(1/i[0],1/i[3]),t.rotate(vt(this.angle)),t.fillStyle=this.selectionBackgroundColor,t.fillRect(-s.x/2,-s.y/2,s.x,s.y),t.restore()}strokeBorders(t,e){t.strokeRect(-e.x/2,-e.y/2,e.x,e.y)}_drawBorders(t,e){let s=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};const i={hasControls:this.hasControls,borderColor:this.borderColor,borderDashArray:this.borderDashArray,...s};t.save(),t.strokeStyle=i.borderColor,this._setLineDash(t,i.borderDashArray),this.strokeBorders(t,e),i.hasControls&&this.drawControlsConnectingLines(t,e),t.restore()}_renderControls(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};const{hasBorders:s,hasControls:i}=this,r={hasBorders:s,hasControls:i,...e},n=this.getViewportTransform(),o=r.hasBorders,a=r.hasControls,h=bt(n,this.calcTransformMatrix()),l=Tt(h);t.save(),t.translate(l.translateX,l.translateY),t.lineWidth=this.borderScaleFactor,this.group===this.parent&&(t.globalAlpha=this.isMoving?this.borderOpacityWhenMoving:1),this.flipX&&(l.angle-=180),t.rotate(vt(this.group?l.angle:this.angle)),o&&this.drawBorders(t,l,e),a&&this.drawControls(t,e),t.restore()}drawBorders(t,e,s){let i;if(s&&s.forActiveSelection||this.group){const t=le(this.width,this.height,At(e)),s=this.isStrokeAccountedForInDimensions()?rt:(this.strokeUniform?(new it).scalarAdd(this.canvas?this.canvas.getZoom():1):new it(e.scaleX,e.scaleY)).scalarMultiply(this.strokeWidth);i=t.add(s).scalarAdd(this.borderScaleFactor).scalarAdd(2*this.padding)}else i=this._calculateCurrentDimensions().scalarAdd(this.borderScaleFactor);this._drawBorders(t,i,s)}drawControlsConnectingLines(t,e){let s=!1;t.beginPath(),this.forEachControl((i,r)=>{i.withConnection&&i.getVisibility(this,r)&&(s=!0,t.moveTo(i.x*e.x,i.y*e.y),t.lineTo(i.x*e.x+i.offsetX,i.y*e.y+i.offsetY))}),s&&t.stroke()}drawControls(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};t.save();const s=this.getCanvasRetinaScaling(),{cornerStrokeColor:i,cornerDashArray:r,cornerColor:n}=this,o={cornerStrokeColor:i,cornerDashArray:r,cornerColor:n,...e};t.setTransform(s,0,0,s,0,0),t.strokeStyle=t.fillStyle=o.cornerColor,this.transparentCorners||(t.strokeStyle=o.cornerStrokeColor),this._setLineDash(t,o.cornerDashArray),this.forEachControl((e,s)=>{if(e.getVisibility(this,s)){const i=this.oCoords[s];e.render(t,i.x,i.y,o,this)}}),t.restore()}isControlVisible(t){return this.controls[t]&&this.controls[t].getVisibility(this,t)}setControlVisible(t,e){this._controlsVisibility||(this._controlsVisibility={}),this._controlsVisibility[t]=e}setControlsVisibility(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};Object.entries(t).forEach(t=>{let[e,s]=t;return this.setControlVisible(e,s)})}clearContextTop(t){if(!this.canvas)return;const e=this.canvas.contextTop;if(!e)return;const s=this.canvas.viewportTransform;e.save(),e.transform(s[0],s[1],s[2],s[3],s[4],s[5]),this.transform(e);const i=this.width+4,r=this.height+4;return e.clearRect(-i/2,-r/2,i,r),t||e.restore(),e}onDeselect(t){return!1}onSelect(t){return!1}shouldStartDragging(t){return!1}onDragStart(t){return!1}canDrop(t){return!1}renderDragSourceEffect(t){}renderDropTargetEffect(t){}}function _i(t,e){return e.forEach(e=>{Object.getOwnPropertyNames(e.prototype).forEach(s=>{"constructor"!==s&&Object.defineProperty(t.prototype,s,Object.getOwnPropertyDescriptor(e.prototype,s)||Object.create(null))})}),t}e(yi,"ownDefaults",{noScaleCache:!0,lockMovementX:!1,lockMovementY:!1,lockRotation:!1,lockScalingX:!1,lockScalingY:!1,lockSkewingX:!1,lockSkewingY:!1,lockScalingFlip:!1,cornerSize:13,touchCornerSize:24,transparentCorners:!0,cornerColor:"rgb(178,204,255)",cornerStrokeColor:"",cornerStyle:"rect",cornerDashArray:null,hasControls:!0,borderColor:"rgb(178,204,255)",borderDashArray:null,borderOpacityWhenMoving:.4,borderScaleFactor:1,hasBorders:!0,selectionBackgroundColor:"",selectable:!0,evented:!0,perPixelTargetFind:!1,activeOn:"down",hoverCursor:null,moveCursor:null});class xi extends yi{}_i(xi,[Ne]),J.setClass(xi),J.setClass(xi,"object");const Ci=(t,e,s,i)=>{const r=2*(i=Math.round(i))+1,{data:n}=t.getImageData(e-i,s-i,r,r);for(let t=3;t0)return!1}return!0};class bi{constructor(t){this.options=t,this.strokeProjectionMagnitude=this.options.strokeWidth/2,this.scale=new it(this.options.scaleX,this.options.scaleY),this.strokeUniformScalar=this.options.strokeUniform?new it(1/this.options.scaleX,1/this.options.scaleY):new it(1,1)}createSideVector(t,e){const s=xe(t,e);return this.options.strokeUniform?s.multiply(this.scale):s}projectOrthogonally(t,e,s){return this.applySkew(t.add(this.calcOrthogonalProjection(t,e,s)))}isSkewed(){return 0!==this.options.skewX||0!==this.options.skewY}applySkew(t){const e=new it(t);return e.y+=e.x*Math.tan(vt(this.options.skewY)),e.x+=e.y*Math.tan(vt(this.options.skewX)),e}scaleUnitVector(t,e){return t.multiply(this.strokeUniformScalar).scalarMultiply(e)}}const Si=new it;class wi extends bi{static getOrthogonalRotationFactor(t,e){const s=e?be(t,e):Se(t);return Math.abs(s)2&&void 0!==arguments[2]?arguments[2]:this.strokeProjectionMagnitude;const i=this.createSideVector(t,e),r=Te(i),n=wi.getOrthogonalRotationFactor(r,this.bisector);return this.scaleUnitVector(r,s*n)}projectBevel(){const t=[];return(this.alpha%x===0?[this.B]:[this.B,this.C]).forEach(e=>{t.push(this.projectOrthogonally(this.A,e)),t.push(this.projectOrthogonally(this.A,e,-this.strokeProjectionMagnitude))}),t}projectMiter(){const t=[],e=Math.abs(this.alpha),s=1/Math.sin(e/2),i=this.scaleUnitVector(this.bisector,-this.strokeProjectionMagnitude*s),r=this.options.strokeUniform?Ce(this.scaleUnitVector(this.bisector,this.options.strokeMiterLimit)):this.options.strokeMiterLimit;return Ce(i)/this.strokeProjectionMagnitude<=r&&t.push(this.applySkew(this.A.add(i))),t.push(...this.projectBevel()),t}projectRoundNoSkew(t,e){const s=[],i=new it(wi.getOrthogonalRotationFactor(this.bisector),wi.getOrthogonalRotationFactor(new it(this.bisector.y,this.bisector.x)));return[new it(1,0).scalarMultiply(this.strokeProjectionMagnitude).multiply(this.strokeUniformScalar).multiply(i),new it(0,1).scalarMultiply(this.strokeProjectionMagnitude).multiply(this.strokeUniformScalar).multiply(i)].forEach(i=>{De(i,t,e)&&s.push(this.A.add(i))}),s}projectRoundWithSkew(t,e){const s=[],{skewX:i,skewY:r,scaleX:n,scaleY:o,strokeUniform:a}=this.options,h=new it(Math.tan(vt(i)),Math.tan(vt(r))),l=this.strokeProjectionMagnitude,c=a?l/o/Math.sqrt(1/o**2+1/n**2*h.y**2):l/Math.sqrt(1+h.y**2),u=new it(Math.sqrt(Math.max(l**2-c**2,0)),c),d=a?l/Math.sqrt(1+h.x**2*(1/o)**2/(1/n+1/n*h.x*h.y)**2):l/Math.sqrt(1+h.x**2/(1+h.x*h.y)**2),g=new it(d,Math.sqrt(Math.max(l**2-d**2,0)));return[g,g.scalarMultiply(-1),u,u.scalarMultiply(-1)].map(t=>this.applySkew(a?t.multiply(this.strokeUniformScalar):t)).forEach(i=>{De(i,t,e)&&s.push(this.applySkew(this.A).add(i))}),s}projectRound(){const t=[];t.push(...this.projectBevel());const e=this.alpha%x===0,s=this.applySkew(this.A),i=t[e?0:2].subtract(s),r=t[e?1:0].subtract(s),n=e?this.applySkew(this.AB.scalarMultiply(-1)):this.applySkew(this.bisector.multiply(this.strokeUniformScalar).scalarMultiply(-1)),o=Oe(i,n)>0,a=o?i:r,h=o?r:i;return this.isSkewed()?t.push(...this.projectRoundWithSkew(a,h)):t.push(...this.projectRoundNoSkew(a,h)),t}projectPoints(){switch(this.options.strokeLineJoin){case"miter":return this.projectMiter();case"round":return this.projectRound();default:return this.projectBevel()}}project(){return this.projectPoints().map(t=>({originPoint:this.A,projectedPoint:t,angle:this.alpha,bisector:this.bisector}))}}class Ti extends bi{constructor(t,e,s){super(s),this.A=new it(t),this.T=new it(e)}calcOrthogonalProjection(t,e){let s=arguments.length>2&&void 0!==arguments[2]?arguments[2]:this.strokeProjectionMagnitude;const i=this.createSideVector(t,e);return this.scaleUnitVector(Te(i),s)}projectButt(){return[this.projectOrthogonally(this.A,this.T,this.strokeProjectionMagnitude),this.projectOrthogonally(this.A,this.T,-this.strokeProjectionMagnitude)]}projectRound(){const t=[];if(!this.isSkewed()&&this.A.eq(this.T)){const e=new it(1,1).scalarMultiply(this.strokeProjectionMagnitude).multiply(this.strokeUniformScalar);t.push(this.applySkew(this.A.add(e)),this.applySkew(this.A.subtract(e)))}else t.push(...new wi(this.A,this.T,this.T,this.options).projectRound());return t}projectSquare(){const t=[];if(this.A.eq(this.T)){const e=new it(1,1).scalarMultiply(this.strokeProjectionMagnitude).multiply(this.strokeUniformScalar);t.push(this.A.add(e),this.A.subtract(e))}else{const e=this.calcOrthogonalProjection(this.A,this.T,this.strokeProjectionMagnitude),s=this.scaleUnitVector(we(this.createSideVector(this.A,this.T)),-this.strokeProjectionMagnitude),i=this.A.add(s);t.push(i.add(e),i.subtract(e))}return t.map(t=>this.applySkew(t))}projectPoints(){switch(this.options.strokeLineCap){case"round":return this.projectRound();case"square":return this.projectSquare();default:return this.projectButt()}}project(){return this.projectPoints().map(t=>({originPoint:this.A,projectedPoint:t}))}}const Oi=function(t,e){let s=arguments.length>2&&void 0!==arguments[2]&&arguments[2];const i=[];if(0===t.length)return i;const r=t.reduce((t,e)=>(t[t.length-1].eq(e)||t.push(new it(e)),t),[new it(t[0])]);if(1===r.length)s=!0;else if(!s){const t=r[0],e=((t,e)=>{for(let s=t.length-1;s>=0;s--)if(e(t[s],s,t))return s;return-1})(r,e=>!e.eq(t));r.splice(e+1)}return r.forEach((t,r,n)=>{let o,a;0===r?(a=n[1],o=s?t:n[n.length-1]):r===n.length-1?(o=n[r-1],a=s?t:n[0]):(o=n[r-1],a=n[r+1]),s&&1===n.length?i.push(...new Ti(t,t,e).project()):!s||0!==r&&r!==n.length-1?i.push(...new wi(t,o,a,e).project()):i.push(...new Ti(t,0===r?a:o,e).project())}),i},ki=t=>{const e={};return Object.keys(t).forEach(s=>{e[s]={},Object.keys(t[s]).forEach(i=>{e[s][i]={...t[s][i]}})}),e},Di=t=>t.replace(/&/g,"&").replace(/"/g,""").replace(/'/g,"'").replace(//g,">");let Mi;const Pi=t=>{if(Mi||Mi||(Mi="Intl"in g()&&"Segmenter"in Intl&&new Intl.Segmenter(void 0,{granularity:"grapheme"})),Mi){const e=Mi.segment(t);return Array.from(e).map(t=>{let{segment:e}=t;return e})}return Ei(t)},Ei=t=>{const e=[];for(let s,i=0;i{const s=t.charCodeAt(e);if(isNaN(s))return"";if(s<55296||s>57343)return t.charAt(e);if(55296<=s&&s<=56319){if(t.length<=e+1)throw"High surrogate without following low surrogate";const s=t.charCodeAt(e+1);if(56320>s||s>57343)throw"High surrogate without following low surrogate";return t.charAt(e)+t.charAt(e+1)}if(0===e)throw"Low surrogate without preceding high surrogate";const i=t.charCodeAt(e-1);if(55296>i||i>56319)throw"Low surrogate without preceding high surrogate";return!1};var ji=Object.freeze({__proto__:null,capitalize:function(t){let e=arguments.length>1&&void 0!==arguments[1]&&arguments[1];return`${t.charAt(0).toUpperCase()}${e?t.slice(1):t.slice(1).toLowerCase()}`},escapeXml:Di,graphemeSplit:Pi});const Fi=function(t,e){let s=arguments.length>2&&void 0!==arguments[2]&&arguments[2];return t.fill!==e.fill||t.stroke!==e.stroke||t.strokeWidth!==e.strokeWidth||t.fontSize!==e.fontSize||t.fontFamily!==e.fontFamily||t.fontWeight!==e.fontWeight||t.fontStyle!==e.fontStyle||t.textDecorationThickness!==e.textDecorationThickness||t.textBackgroundColor!==e.textBackgroundColor||t.deltaY!==e.deltaY||s&&(t.overline!==e.overline||t.underline!==e.underline||t.linethrough!==e.linethrough)},Li=(t,e)=>{const s=e.split("\n"),i=[];let r=-1,n={};t=ki(t);for(let e=0;e0&&(Fi(n,o,!0)?i.push({start:r,end:r+1,style:o}):i[i.length-1].end++),n=o||{}}else r+=o.length,n={}}return i},Ri=(t,e)=>{if(!Array.isArray(t))return ki(t);const s=e.split(E),i={};let r=-1,n=0;for(let e=0;e1&&void 0!==arguments[1]?arguments[1]:{},s={};for(const i in e)$i(t,i.split(" "))&&(s={...s,...e[i]});return s}const Yi=t=>{var e;return null!==(e=cs[t])&&void 0!==e?e:t},Wi=new RegExp(`(${os})`,"gi"),Vi=`(${os})`,Gi=String.raw`(skewX)\(${Vi}\)`,zi=String.raw`(skewY)\(${Vi}\)`,Hi=String.raw`(rotate)\(${Vi}(?: ${Vi} ${Vi})?\)`,Ni=String.raw`(scale)\(${Vi}(?: ${Vi})?\)`,Ui=String.raw`(translate)\(${Vi}(?: ${Vi})?\)`,qi=`(?:${String.raw`(matrix)\(${Vi} ${Vi} ${Vi} ${Vi} ${Vi} ${Vi}\)`}|${Ui}|${Hi}|${Ni}|${Gi}|${zi})`,Ki=`(?:${qi}*)`,Ji=String.raw`^\s*(?:${Ki}?)\s*$`,Qi=new RegExp(Ji),Zi=new RegExp(qi),tr=new RegExp(qi,"g");function er(t){const e=[];if(!(t=(t=>t.replace(Wi," $1 ").replace(/,/gi," ").replace(/\s+/gi," "))(t).replace(/\s*([()])\s*/gi,"$1"))||t&&!Qi.test(t))return[...b];for(const s of t.matchAll(tr)){const t=Zi.exec(s[0]);if(!t)continue;let i=b;const r=t.filter(t=>!!t),[,n,...o]=r,[a,h,l,c,u,d]=o.map(t=>parseFloat(t));switch(n){case"translate":i=Ot(a,h);break;case L:i=kt({angle:a},{x:h,y:l});break;case Y:i=Dt(a,h);break;case G:i=Pt(a);break;case z:i=Et(a);break;case"matrix":i=[a,h,l,c,u,d]}e.push(i)}return St(e)}function sr(t,e,s,i){const r=Array.isArray(e);let n,o=e;if(t!==H&&t!==N||e!==P){if("strokeUniform"===t)return"non-scaling-stroke"===e;if("strokeDashArray"===t)o=e===P?null:e.replace(/,/g," ").split(/\s+/).map(parseFloat);else if("transformMatrix"===t)o=s&&s.transformMatrix?bt(s.transformMatrix,er(e)):er(e);else if("visible"===t)o=e!==P&&"hidden"!==e,s&&!1===s.visible&&(o=!1);else if("opacity"===t)o=parseFloat(e),s&&void 0!==s.opacity&&(o*=s.opacity);else if("textAnchor"===t)o="start"===e?O:"end"===e?M:T;else if("charSpacing"===t||t===qe)n=Ge(e,i)/i*1e3;else if("paintFirst"===t){const t=e.indexOf(H),s=e.indexOf(N);o=H,(t>-1&&s>-1&&s-1)&&(o=N)}else{if("href"===t||"xlink:href"===t||"font"===t||"id"===t)return e;if("imageSmoothing"===t)return"optimizeQuality"===e;n=r?e.map(Ge):Ge(e,i)}}else o="";return!r&&isNaN(n)?o:n}function ir(t,e){t.replace(/;\s*$/,"").split(";").forEach(t=>{if(!t)return;const[s,i]=t.split(":");e[s.trim().toLowerCase()]=i.trim()})}function rr(t){const e={},s=t.getAttribute("style");return s?("string"==typeof s?ir(s,e):function(t,e){Object.entries(t).forEach(t=>{let[s,i]=t;void 0!==i&&(e[s.toLowerCase()]=i)})}(s,e),e):e}const nr={stroke:"strokeOpacity",fill:"fillOpacity"};function or(t,e,s){if(!t)return{};let i,r={},n=S;t.parentNode&&ps.test(t.parentNode.nodeName)&&(r=or(t.parentElement,e,s),r.fontSize&&(i=n=Ge(r.fontSize)));const o={...e.reduce((e,s)=>{const i=t.getAttribute(s);return i&&(e[s]=i),e},{}),...Xi(t,s),...rr(t)};o[ds]&&t.setAttribute(ds,o[ds]),o[us]&&(i=Ge(o[us],n),o[us]=`${i}`);const a={};for(const t in o){const e=Yi(t),s=sr(e,o[t],r,i);a[e]=s}a&&a.font&&function(t,e){const s=t.match(ls);if(!s)return;const i=s[1],r=s[3],n=s[4],o=s[5],a=s[6];i&&(e.fontStyle=i),r&&(e.fontWeight=isNaN(parseFloat(r))?r:parseFloat(r)),n&&(e.fontSize=Ge(n)),a&&(e.fontFamily=a),o&&(e.lineHeight="normal"===o?1:o)}(a.font,a);const h={...r,...a};return ps.test(t.nodeName)?h:function(t){const e=xi.getDefaults();return Object.entries(nr).forEach(s=>{let[i,r]=s;if(void 0===t[r]||""===t[i])return;if(void 0===t[i]){if(!e[i])return;t[i]=e[i]}if(0===t[i].indexOf("url("))return;const n=new Ve(t[i]);t[i]=n.setAlpha($t(n.getAlpha()*t[r],2)).toRgba()}),t}(h)}const ar=["rx","ry"];class hr extends xi{static getDefaults(){return{...super.getDefaults(),...hr.ownDefaults}}constructor(t){super(),Object.assign(this,hr.ownDefaults),this.setOptions(t),this._initRxRy()}_initRxRy(){const{rx:t,ry:e}=this;t&&!e?this.ry=t:e&&!t&&(this.rx=e)}_render(t){const{width:e,height:s}=this,i=-e/2,r=-s/2,n=this.rx?Math.min(this.rx,e/2):0,o=this.ry?Math.min(this.ry,s/2):0,a=0!==n||0!==o;t.beginPath(),t.moveTo(i+n,r),t.lineTo(i+e-n,r),a&&t.bezierCurveTo(i+e-w*n,r,i+e,r+w*o,i+e,r+o),t.lineTo(i+e,r+s-o),a&&t.bezierCurveTo(i+e,r+s-w*o,i+e-w*n,r+s,i+e-n,r+s),t.lineTo(i+n,r+s),a&&t.bezierCurveTo(i+w*n,r+s,i,r+s-w*o,i,r+s-o),t.lineTo(i,r+o),a&&t.bezierCurveTo(i,r+w*o,i+w*n,r,i+n,r),t.closePath(),this._renderPaintInOrder(t)}toObject(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[];return super.toObject([...ar,...t])}_toSVG(){const{width:t,height:e,rx:s,ry:i}=this;return["\n`]}static async fromElement(t,e,s){const{left:i=0,top:r=0,width:n=0,height:o=0,visible:a=!0,...h}=or(t,this.ATTRIBUTE_NAMES,s);return new this({...e,...h,left:i,top:r,width:n,height:o,visible:Boolean(a&&n&&o)})}}e(hr,"type","Rect"),e(hr,"cacheProperties",[...bs,...ar]),e(hr,"ownDefaults",{rx:0,ry:0}),e(hr,"ATTRIBUTE_NAMES",[...Ii,"x","y","rx","ry","width","height"]),J.setClass(hr),J.setSVGClass(hr);const lr="initialization",cr="added",ur="removed",dr="imperative",gr=(t,e)=>{const{strokeUniform:s,strokeWidth:i,width:r,height:n,group:o}=e,a=o&&o!==t?ce(o.calcTransformMatrix(),t.calcTransformMatrix()):null,h=a?e.getRelativeCenterPoint().transform(a):e.getRelativeCenterPoint(),l=!e.isStrokeAccountedForInDimensions(),c=s&&l?de(new it(i,i),void 0,t.calcTransformMatrix()):rt,u=!s&&l?i:0,d=le(r+u,n+u,St([a,e.calcOwnMatrix()],!0)).add(c).scalarDivide(2);return[h.subtract(d),h.add(d)]};class fr{calcLayoutResult(t,e){if(this.shouldPerformLayout(t))return this.calcBoundingBox(e,t)}shouldPerformLayout(t){let{type:e,prevStrategy:s,strategy:i}=t;return e===lr||e===dr||!!s&&i!==s}shouldLayoutClipPath(t){let{type:e,target:{clipPath:s}}=t;return e!==lr&&s&&!s.absolutePositioned}getInitialSize(t,e){return e.size}calcBoundingBox(t,e){const{type:s,target:i}=e;if(s===dr&&e.overrides)return e.overrides;if(0===t.length)return;const{left:r,top:n,width:o,height:a}=re(t.map(t=>gr(i,t)).reduce((t,e)=>t.concat(e),[])),h=new it(o,a),l=new it(r,n).add(h.scalarDivide(2));if(s===lr){const t=this.getInitialSize(e,{size:h,center:l});return{center:l,relativeCorrection:new it(0,0),size:t}}return{center:l.transform(i.calcOwnMatrix()),size:h}}}e(fr,"type","strategy");class pr extends fr{shouldPerformLayout(t){return!0}}e(pr,"type","fit-content"),J.setClass(pr);const mr="layoutManager";class vr{constructor(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:new pr;e(this,"strategy",void 0),this.strategy=t,this._subscriptions=new Map}performLayout(t){const e={bubbles:!0,strategy:this.strategy,...t,prevStrategy:this._prevLayoutStrategy,stopPropagation(){this.bubbles=!1}};this.onBeforeLayout(e);const s=this.getLayoutResult(e);s&&this.commitLayout(e,s),this.onAfterLayout(e,s),this._prevLayoutStrategy=e.strategy}attachHandlers(t,e){const{target:s}=e;return[U,A,I,F,j,R,X,B,$].map(e=>t.on(e,t=>this.performLayout(e===U?{type:"object_modified",trigger:e,e:t,target:s}:{type:"object_modifying",trigger:e,e:t,target:s})))}subscribe(t,e){this.unsubscribe(t,e);const s=this.attachHandlers(t,e);this._subscriptions.set(t,s)}unsubscribe(t,e){(this._subscriptions.get(t)||[]).forEach(t=>t()),this._subscriptions.delete(t)}unsubscribeTargets(t){t.targets.forEach(e=>this.unsubscribe(e,t))}subscribeTargets(t){t.targets.forEach(e=>this.subscribe(e,t))}onBeforeLayout(t){const{target:e,type:s}=t,{canvas:i}=e;if(s===lr||s===cr?this.subscribeTargets(t):s===ur&&this.unsubscribeTargets(t),e.fire("layout:before",{context:t}),i&&i.fire("object:layout:before",{target:e,context:t}),s===dr&&t.deep){const{strategy:s,...i}=t;e.forEachObject(t=>t.layoutManager&&t.layoutManager.performLayout({...i,bubbles:!1,target:t}))}}getLayoutResult(t){const{target:e,strategy:s,type:i}=t,r=s.calcLayoutResult(t,e.getObjects());if(!r)return;const n=i===lr?new it:e.getRelativeCenterPoint(),{center:o,correction:a=new it,relativeCorrection:h=new it}=r,l=n.subtract(o).add(a).transform(i===lr?b:Ct(e.calcOwnMatrix()),!0).add(h);return{result:r,prevCenter:n,nextCenter:o,offset:l}}commitLayout(t,e){const{target:s}=t,{result:{size:i},nextCenter:r}=e;var n,o;(s.set({width:i.x,height:i.y}),this.layoutObjects(t,e),t.type===lr)?s.set({left:null!==(n=t.x)&&void 0!==n?n:r.x+i.x*me(s.originX),top:null!==(o=t.y)&&void 0!==o?o:r.y+i.y*me(s.originY)}):(s.setPositionByOrigin(r,T,T),s.setCoords(),s.set("dirty",!0))}layoutObjects(t,e){const{target:s}=t;s.forEachObject(i=>{i.group===s&&this.layoutObject(t,e,i)}),t.strategy.shouldLayoutClipPath(t)&&this.layoutObject(t,e,s.clipPath)}layoutObject(t,e,s){let{offset:i}=e;s.set({left:s.left+i.x,top:s.top+i.y})}onAfterLayout(t,e){const{target:s,strategy:i,bubbles:r,prevStrategy:n,...o}=t,{canvas:a}=s;s.fire("layout:after",{context:t,result:e}),a&&a.fire("object:layout:after",{context:t,result:e,target:s});const h=s.parent;r&&null!=h&&h.layoutManager&&((o.path||(o.path=[])).push(s),h.layoutManager.performLayout({...o,target:h})),s.set("dirty",!0)}dispose(){const{_subscriptions:t}=this;t.forEach(t=>t.forEach(t=>t())),t.clear()}toObject(){return{type:mr,strategy:this.strategy.constructor.type}}toJSON(){return this.toObject()}}J.setClass(vr,mr);class yr extends vr{performLayout(){}}class _r extends(ot(xi)){static getDefaults(){return{...super.getDefaults(),..._r.ownDefaults}}constructor(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[],s=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};super(),e(this,"_activeObjects",[]),e(this,"__objectSelectionTracker",void 0),e(this,"__objectSelectionDisposer",void 0),Object.assign(this,_r.ownDefaults),this.setOptions(s),this.groupInit(t,s)}groupInit(t,e){var s;this._objects=[...t],this.__objectSelectionTracker=this.__objectSelectionMonitor.bind(this,!0),this.__objectSelectionDisposer=this.__objectSelectionMonitor.bind(this,!1),this.forEachObject(t=>{this.enterGroup(t,!1)}),this.layoutManager=null!==(s=e.layoutManager)&&void 0!==s?s:new vr,this.layoutManager.performLayout({type:lr,target:this,targets:[...t],x:e.left,y:e.top})}canEnterGroup(t){return t===this||this.isDescendantOf(t)?(r("error","Group: circular object trees are not supported, this call has no effect"),!1):-1===this._objects.indexOf(t)||(r("error","Group: duplicate objects are not supported inside group, this call has no effect"),!1)}_filterObjectsBeforeEnteringGroup(t){return t.filter((t,e,s)=>this.canEnterGroup(t)&&s.indexOf(t)===e)}add(){for(var t=arguments.length,e=new Array(t),s=0;s1?e-1:0),i=1;i{s._set(t,e)}),this}_shouldSetNestedCoords(){return this.subTargetCheck}removeAll(){return this._activeObjects=[],this.remove(...this._objects)}__objectSelectionMonitor(t,e){let{target:s}=e;const i=this._activeObjects;if(t)i.push(s),this._set("dirty",!0);else if(i.length>0){const t=i.indexOf(s);t>-1&&(i.splice(t,1),this._set("dirty",!0))}}_watchObject(t,e){t&&this._watchObject(!1,e),t?(e.on("selected",this.__objectSelectionTracker),e.on("deselected",this.__objectSelectionDisposer)):(e.off("selected",this.__objectSelectionTracker),e.off("deselected",this.__objectSelectionDisposer))}enterGroup(t,e){t.group&&t.group.remove(t),t._set("parent",this),this._enterGroup(t,e)}_enterGroup(t,e){e&&oe(t,bt(Ct(this.calcTransformMatrix()),t.calcTransformMatrix())),this._shouldSetNestedCoords()&&t.setCoords(),t._set("group",this),t._set("canvas",this.canvas),this._watchObject(!0,t);const s=this.canvas&&this.canvas.getActiveObject&&this.canvas.getActiveObject();s&&(s===t||t.isDescendantOf(s))&&this._activeObjects.push(t)}exitGroup(t,e){this._exitGroup(t,e),t._set("parent",void 0),t._set("canvas",void 0)}_exitGroup(t,e){t._set("group",void 0),e||(oe(t,bt(this.calcTransformMatrix(),t.calcTransformMatrix())),t.setCoords()),this._watchObject(!1,t);const s=this._activeObjects.length>0?this._activeObjects.indexOf(t):-1;s>-1&&this._activeObjects.splice(s,1)}shouldCache(){const t=xi.prototype.shouldCache.call(this);if(t)for(let t=0;tt.setCoords())}triggerLayout(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};this.layoutManager.performLayout({target:this,type:dr,...t})}render(t){this._transformDone=!0,super.render(t),this._transformDone=!1}__serializeObjects(t,e){const s=this.includeDefaultValues;return this._objects.filter(function(t){return!t.excludeFromExport}).map(function(i){const r=i.includeDefaultValues;i.includeDefaultValues=s;const n=i[t||"toObject"](e);return i.includeDefaultValues=r,n})}toObject(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[];const e=this.layoutManager.toObject();return{...super.toObject(["subTargetCheck","interactive",...t]),..."fit-content"!==e.strategy||this.includeDefaultValues?{layoutManager:e}:{},objects:this.__serializeObjects("toObject",t)}}toString(){return`#`}dispose(){this.layoutManager.unsubscribeTargets({targets:this.getObjects(),target:this}),this._activeObjects=[],this.forEachObject(t=>{this._watchObject(!1,t),t.dispose()}),super.dispose()}_createSVGBgRect(t){if(!this.backgroundColor)return"";const e=hr.prototype._toSVG.call(this),s=e.indexOf("COMMON_PARTS");e[s]='for="group" ';const i=e.join("");return t?t(i):i}_toSVG(t){const e=["\n"],s=this._createSVGBgRect(t);s&&e.push("\t\t",s);for(let s=0;s\n"),e}getSvgStyles(){const t=void 0!==this.opacity&&1!==this.opacity?`opacity: ${this.opacity};`:"",e=this.visible?"":" visibility: hidden;";return[t,this.getSvgFilter(),e].join("")}toClipPathSVG(t){const e=[],s=this._createSVGBgRect(t);s&&e.push("\t",s);for(let s=0;s{let[e,s]=t;const i=new this(e,{...n,...s,layoutManager:new yr});if(r){const t=J.getClass(r.type),e=J.getClass(r.strategy);i.layoutManager=new t(new e)}else i.layoutManager=new vr;return i.layoutManager.subscribeTargets({type:lr,target:i,targets:i.getObjects()}),i.setCoords(),i})}}e(_r,"type","Group"),e(_r,"ownDefaults",{strokeWidth:0,subTargetCheck:!1,interactive:!1}),J.setClass(_r);const xr=(t,e)=>Math.min(e.width/t.width,e.height/t.height),Cr=(t,e)=>Math.max(e.width/t.width,e.height/t.height),br="\\s*,?\\s*",Sr=`${br}(${os})`,wr=`${Sr}${Sr}${Sr}${br}([01])${br}([01])${Sr}${Sr}`,Tr={m:"l",M:"L"},Or=(t,e,s,i,r,n,o,a,h,l,c)=>{const u=et(t),d=st(t),g=et(e),f=st(e),p=s*r*g-i*n*f+o,m=i*r*g+s*n*f+a;return["C",l+h*(-s*r*d-i*n*u),c+h*(-i*r*d+s*n*u),p+h*(s*r*f+i*n*g),m+h*(i*r*f-s*n*g),p,m]},kr=(t,e,s,i)=>{const r=Math.atan2(e,t),n=Math.atan2(i,s);return n>=r?n-r:2*Math.PI-(r-n)};function Dr(t,e,s,r,n,o,a,h){let l;if(i.cachesBoundsOfCurve&&(l=[...arguments].join(),p.boundsOfCurveCache[l]))return p.boundsOfCurveCache[l];const c=Math.sqrt,u=Math.abs,d=[],g=[[0,0],[0,0]];let f=6*t-12*s+6*n,m=-3*t+9*s-9*n+3*a,v=3*s-3*t;for(let t=0;t<2;++t){if(t>0&&(f=6*e-12*r+6*o,m=-3*e+9*r-9*o+3*h,v=3*r-3*e),u(m)<1e-12){if(u(f)<1e-12)continue;const t=-v/f;0{let[i,r,n,o,a,h,l,c]=s;const u=((t,e,s,i,r,n,o)=>{if(0===s||0===i)return[];let a=0,h=0,l=0;const c=Math.PI,u=o*C,d=st(u),g=et(u),f=.5*(-g*t-d*e),p=.5*(-g*e+d*t),m=s**2,v=i**2,y=p**2,_=f**2,x=m*v-m*y-v*_;let b=Math.abs(s),S=Math.abs(i);if(x<0){const t=Math.sqrt(1-x/(m*v));b*=t,S*=t}else l=(r===n?-1:1)*Math.sqrt(x/(m*y+v*_));const w=l*b*p/S,T=-l*S*f/b,O=g*w-d*T+.5*t,k=d*w+g*T+.5*e;let D=kr(1,0,(f-w)/b,(p-T)/S),M=kr((f-w)/b,(p-T)/S,(-f-w)/b,(-p-T)/S);0===n&&M>0?M-=2*c:1===n&&M<0&&(M+=2*c);const P=Math.ceil(Math.abs(M/c*2)),E=[],A=M/P,j=8/3*Math.sin(A/4)*Math.sin(A/4)/Math.sin(A/2);let F=D+A;for(let t=0;t{let e=0,s=0,i=0,r=0;const n=[];let o,a=0,h=0;for(const l of t){const t=[...l];let c;switch(t[0]){case"l":t[1]+=e,t[2]+=s;case"L":e=t[1],s=t[2],c=["L",e,s];break;case"h":t[1]+=e;case"H":e=t[1],c=["L",e,s];break;case"v":t[1]+=s;case"V":s=t[1],c=["L",e,s];break;case"m":t[1]+=e,t[2]+=s;case"M":e=t[1],s=t[2],i=t[1],r=t[2],c=["M",e,s];break;case"c":t[1]+=e,t[2]+=s,t[3]+=e,t[4]+=s,t[5]+=e,t[6]+=s;case"C":a=t[3],h=t[4],e=t[5],s=t[6],c=["C",t[1],t[2],a,h,e,s];break;case"s":t[1]+=e,t[2]+=s,t[3]+=e,t[4]+=s;case"S":"C"===o?(a=2*e-a,h=2*s-h):(a=e,h=s),e=t[3],s=t[4],c=["C",a,h,t[1],t[2],e,s],a=c[3],h=c[4];break;case"q":t[1]+=e,t[2]+=s,t[3]+=e,t[4]+=s;case"Q":a=t[1],h=t[2],e=t[3],s=t[4],c=["Q",a,h,e,s];break;case"t":t[1]+=e,t[2]+=s;case"T":"Q"===o?(a=2*e-a,h=2*s-h):(a=e,h=s),e=t[1],s=t[2],c=["Q",a,h,e,s];break;case"a":t[6]+=e,t[7]+=s;case"A":Mr(e,s,t).forEach(t=>n.push(t)),e=t[6],s=t[7];break;case"z":case"Z":e=i,s=r,c=["Z"]}c?(n.push(c),o=c[0]):o=""}return n},Er=(t,e,s,i)=>Math.sqrt((s-t)**2+(i-e)**2),Ar=(t,e,s,i,r,n,o,a)=>h=>{const l=h**3,c=(t=>3*t**2*(1-t))(h),u=(t=>3*t*(1-t)**2)(h),d=(t=>(1-t)**3)(h);return new it(o*l+r*c+s*u+t*d,a*l+n*c+i*u+e*d)},jr=t=>t**2,Fr=t=>2*t*(1-t),Lr=t=>(1-t)**2,Rr=(t,e,s,i,r,n,o,a)=>h=>{const l=jr(h),c=Fr(h),u=Lr(h),d=3*(u*(s-t)+c*(r-s)+l*(o-r)),g=3*(u*(i-e)+c*(n-i)+l*(a-n));return Math.atan2(g,d)},Ir=(t,e,s,i,r,n)=>o=>{const a=jr(o),h=Fr(o),l=Lr(o);return new it(r*a+s*h+t*l,n*a+i*h+e*l)},Br=(t,e,s,i,r,n)=>o=>{const a=1-o,h=2*(a*(s-t)+o*(r-s)),l=2*(a*(i-e)+o*(n-i));return Math.atan2(l,h)},$r=(t,e,s)=>{let i=new it(e,s),r=0;for(let e=1;e<=100;e+=1){const s=t(e/100);r+=Er(i.x,i.y,s.x,s.y),i=s}return r},Xr=(t,e)=>{let s,i=0,r=0,n={x:t.x,y:t.y},o={...n},a=.01,h=0;const l=t.iterator,c=t.angleFinder;for(;r1e-4;)o=l(i),h=i,s=Er(n.x,n.y,o.x,o.y),s+r>e?(i-=a,a/=2):(n=o,i+=a,r+=s);return{...o,angle:c(h)}},Yr=t=>{let e,s,i=0,r=0,n=0,o=0,a=0;const h=[];for(const l of t){const t={x:r,y:n,command:l[0],length:0};switch(l[0]){case"M":s=t,s.x=o=r=l[1],s.y=a=n=l[2];break;case"L":s=t,s.length=Er(r,n,l[1],l[2]),r=l[1],n=l[2];break;case"C":e=Ar(r,n,l[1],l[2],l[3],l[4],l[5],l[6]),s=t,s.iterator=e,s.angleFinder=Rr(r,n,l[1],l[2],l[3],l[4],l[5],l[6]),s.length=$r(e,r,n),r=l[5],n=l[6];break;case"Q":e=Ir(r,n,l[1],l[2],l[3],l[4]),s=t,s.iterator=e,s.angleFinder=Br(r,n,l[1],l[2],l[3],l[4]),s.length=$r(e,r,n),r=l[3],n=l[4];break;case"Z":s=t,s.destX=o,s.destY=a,s.length=Er(r,n,o,a),r=o,n=a}i+=s.length,h.push(s)}return h.push({length:i,x:r,y:n}),h},Wr=function(t,e){let s=arguments.length>2&&void 0!==arguments[2]?arguments[2]:Yr(t),i=0;for(;e-s[i].length>0&&i{var e;const s=[],i=null!==(e=t.match(Vr))&&void 0!==e?e:[];for(const t of i){const e=t[0];if("z"===e||"Z"===e){s.push([e]);continue}const i=Hr[e.toLowerCase()];let r=[];if("a"===e||"A"===e){Gr.lastIndex=0;for(let e=null;e=Gr.exec(t);)r.push(...e.slice(1))}else r=t.match(zr)||[];for(let t=0;t0&&o?o:e;for(let e=0;e1&&void 0!==arguments[1]?arguments[1]:0,s=new it(t[0]),i=new it(t[1]),r=1,n=0;const o=[],a=t.length,h=a>2;let l;for(h&&(r=t[2].xt[l-2].x?1:s.x===t[l-2].x?0:-1,n=s.y>t[l-2].y?1:s.y===t[l-2].y?0:-1),o.push(["L",s.x+r*e,s.y+n*e]),o},qr=(t,e)=>t.map(t=>t.map((t,s)=>0===s||void 0===e?t:$t(t,e)).join(" ")).join(" "),Kr=(t,e)=>Math.floor(Math.random()*(e-t+1))+t,Jr=(t,e)=>{let s=t._findCenterFromElement();t.transformMatrix&&((t=>{if(t.transformMatrix){const{scaleX:e,scaleY:s,angle:i,skewX:r}=Tt(t.transformMatrix);t.flipX=!1,t.flipY=!1,t.set(W,e),t.set(V,s),t.angle=i,t.skewX=r,t.skewY=0}})(t),s=s.transform(t.transformMatrix)),delete t.transformMatrix,e&&(t.scaleX*=e.scaleX,t.scaleY*=e.scaleY,t.cropX=e.cropX,t.cropY=e.cropY,s.x+=e.offsetLeft,s.y+=e.offsetTop,t.width=e.width,t.height=e.height),t.setPositionByOrigin(s,T,T)};var Qr=Object.freeze({__proto__:null,addTransformToObject:ne,animate:Is,animateColor:Bs,applyTransformToObject:oe,calcAngleBetweenVectors:be,calcDimensionsMatrix:At,calcPlaneChangeMatrix:ce,calcVectorRotation:Se,cancelAnimFrame:lt,capValue:xs,composeMatrix:jt,copyCanvasElement:t=>{var e;const s=ft(t);return null===(e=s.getContext("2d"))||void 0===e||e.drawImage(t,0,0),s},cos:et,createCanvasElement:dt,createImage:gt,createRotateMatrix:kt,createScaleMatrix:Dt,createSkewXMatrix:Pt,createSkewYMatrix:Et,createTranslateMatrix:Ot,createVector:xe,crossProduct:Oe,degreesToRadians:vt,dotProduct:ke,ease:Ms,enlivenObjectEnlivables:Rt,enlivenObjects:Lt,findScaleToCover:Cr,findScaleToFit:xr,getBoundsOfCurve:Dr,getOrthonormalVector:Te,getPathSegmentsInfo:Yr,getPointOnPath:Wr,getPointer:ee,getRandomInt:Kr,getRegularPolygonPath:(t,e)=>{const s=2*Math.PI/t;let i=-y;t%2==0&&(i+=s/2);const r=new Array(t+1);for(let n=0;n{const e=["instantiated_by_use","style","id","class"];switch(t){case"linearGradient":return e.concat(["x1","y1","x2","y2","gradientUnits","gradientTransform"]);case"radialGradient":return e.concat(["gradientUnits","gradientTransform","cx","cy","r","fx","fy","fr"]);case"stop":return e.concat(["offset","stop-color","stop-opacity"])}return e},getUnitVector:we,groupSVGElements:(t,e)=>t&&1===t.length?t[0]:new _r(t,e),hasStyleChanged:Fi,invertTransform:Ct,isBetweenVectors:De,isIdentityMatrix:_t,isTouchEvent:se,isTransparent:Ci,joinPath:qr,loadImage:Ft,magnitude:Ce,makeBoundingBoxFromPoints:re,makePathSimpler:Pr,matrixToSVG:Xt,mergeClipPaths:(t,e)=>{var s;let i=t,r=e;i.inverted&&!r.inverted&&(i=e,r=t),ge(r,null===(s=r.group)||void 0===s?void 0:s.calcTransformMatrix(),i.calcTransformMatrix());const n=i.inverted&&r.inverted;return n&&(i.inverted=r.inverted=!1),new _r([i],{clipPath:r,inverted:n})},multiplyTransformMatrices:bt,multiplyTransformMatrixArray:St,parsePath:Nr,parsePreserveAspectRatioAttribute:ze,parseUnit:Ge,pick:It,projectStrokeOnPoints:Oi,qrDecompose:Tt,radiansToDegrees:yt,removeFromArray:tt,removeTransformFromObject:(t,e)=>{const s=Ct(e),i=bt(s,t.calcOwnMatrix());oe(t,i)},removeTransformMatrixForSvgParsing:Jr,requestAnimFrame:ht,resetObjectTransform:ae,rotateVector:_e,saveObjectTransform:he,sendObjectToPlane:ge,sendPointToPlane:ue,sendVectorToPlane:de,sin:st,sizeAfterTransform:le,string:ji,stylesFromArray:Ri,stylesToArray:Li,toBlob:mt,toDataURL:pt,toFixed:$t,transformPath:(t,e,s)=>(s&&(e=bt(e,[1,0,0,1,-s.x,-s.y])),t.map(t=>{const s=[...t];for(let i=1;i{let[e,i]=t;return s.setProperty(e,i)})}class tn extends Jt{constructor(t){let{allowTouchScrolling:s=!1,containerClass:i=""}=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};super(t),e(this,"upper",void 0),e(this,"container",void 0);const{el:r}=this.lower,n=this.createUpperCanvas();this.upper={el:n,ctx:n.getContext("2d")},this.applyCanvasStyle(r,{allowTouchScrolling:s}),this.applyCanvasStyle(n,{allowTouchScrolling:s,styles:{position:"absolute",left:"0",top:"0"}});const o=this.createContainerElement();o.classList.add(i),r.parentNode&&r.parentNode.replaceChild(o,r),o.append(r,n),this.container=o}createUpperCanvas(){const{el:t}=this.lower,e=dt();return e.className=t.className,e.classList.remove("lower-canvas"),e.classList.add("upper-canvas"),e.setAttribute("data-fabric","top"),e.style.cssText=t.style.cssText,e.setAttribute("draggable","true"),e}createContainerElement(){const t=d().createElement("div");return t.setAttribute("data-fabric","wrapper"),Zr(t,{position:"relative"}),Kt(t),t}applyCanvasStyle(t,e){const{styles:s,allowTouchScrolling:i}=e;Zr(t,{...s,"touch-action":i?"manipulation":P}),Kt(t)}setDimensions(t,e){super.setDimensions(t,e);const{el:s,ctx:i}=this.upper;Ut(s,i,t,e)}setCSSDimensions(t){super.setCSSDimensions(t),qt(this.upper.el,t),qt(this.container,t)}cleanupDOM(t){const e=this.container,{el:s}=this.lower,{el:i}=this.upper;super.cleanupDOM(t),e.removeChild(i),e.removeChild(s),e.parentNode&&e.parentNode.replaceChild(s,e)}dispose(){super.dispose(),u().dispose(this.upper.el),delete this.upper,delete this.container}}class en extends Zt{constructor(){super(...arguments),e(this,"_hoveredTargets",[]),e(this,"_objectsToRender",void 0),e(this,"_currentTransform",null),e(this,"_groupSelector",null),e(this,"contextTopDirty",!1)}static getDefaults(){return{...super.getDefaults(),...en.ownDefaults}}get upperCanvasEl(){var t;return null===(t=this.elements.upper)||void 0===t?void 0:t.el}get contextTop(){var t;return null===(t=this.elements.upper)||void 0===t?void 0:t.ctx}get wrapperEl(){return this.elements.container}initElements(t){this.elements=new tn(t,{allowTouchScrolling:this.allowTouchScrolling,containerClass:this.containerClass}),this._createCacheCanvas()}_onObjectAdded(t){this._objectsToRender=void 0,super._onObjectAdded(t)}_onObjectRemoved(t){this._objectsToRender=void 0,t===this._activeObject&&(this.fire("before:selection:cleared",{deselected:[t]}),this._discardActiveObject(),this.fire("selection:cleared",{deselected:[t]}),t.fire("deselected",{target:t})),t===this._hoveredTarget&&(this._hoveredTarget=void 0,this._hoveredTargets=[]),super._onObjectRemoved(t)}_onStackOrderChanged(){this._objectsToRender=void 0,super._onStackOrderChanged()}_chooseObjectsToRender(){const t=this._activeObject;return!this.preserveObjectStacking&&t?this._objects.filter(e=>!e.group&&e!==t).concat(t):this._objects}renderAll(){this.cancelRequestedRender(),this.destroyed||(!this.contextTopDirty||this._groupSelector||this.isDrawingMode||(this.clearContext(this.contextTop),this.contextTopDirty=!1),this.hasLostContext&&(this.renderTopLayer(this.contextTop),this.hasLostContext=!1),!this._objectsToRender&&(this._objectsToRender=this._chooseObjectsToRender()),this.renderCanvas(this.getContext(),this._objectsToRender))}renderTopLayer(t){t.save(),this.isDrawingMode&&this._isCurrentlyDrawing&&(this.freeDrawingBrush&&this.freeDrawingBrush._render(),this.contextTopDirty=!0),this.selection&&this._groupSelector&&(this._drawSelection(t),this.contextTopDirty=!0),t.restore()}renderTop(){const t=this.contextTop;this.clearContext(t),this.renderTopLayer(t),this.fire("after:render",{ctx:t})}setTargetFindTolerance(t){t=Math.round(t),this.targetFindTolerance=t;const e=this.getRetinaScaling(),s=Math.ceil((2*t+1)*e);this.pixelFindCanvasEl.width=this.pixelFindCanvasEl.height=s,this.pixelFindContext.scale(e,e)}isTargetTransparent(t,e,s){const i=this.targetFindTolerance,r=this.pixelFindContext;this.clearContext(r),r.save(),r.translate(-e+i,-s+i),r.transform(...this.viewportTransform);const n=t.selectionBackgroundColor;t.selectionBackgroundColor="",t.render(r),t.selectionBackgroundColor=n,r.restore();const o=Math.round(i*this.getRetinaScaling());return Ci(r,o,o,o)}_isSelectionKeyPressed(t){const e=this.selectionKey;return!!e&&(Array.isArray(e)?!!e.find(e=>!!e&&!0===t[e]):t[e])}_shouldClearSelection(t,e){const s=this.getActiveObjects(),i=this._activeObject;return!!(!e||e&&i&&s.length>1&&-1===s.indexOf(e)&&i!==e&&!this._isSelectionKeyPressed(t)||e&&!e.evented||e&&!e.selectable&&i&&i!==e)}_shouldCenterTransform(t,e,s){if(!t)return;let i;return e===Y||e===W||e===V||e===I?i=this.centeredScaling||t.centeredScaling:e===L&&(i=this.centeredRotation||t.centeredRotation),i?!s:s}_getOriginFromCorner(t,e){const s={x:t.originX,y:t.originY};return e?(["ml","tl","bl"].includes(e)?s.x=M:["mr","tr","br"].includes(e)&&(s.x=O),["tl","mt","tr"].includes(e)?s.y=D:["bl","mb","br"].includes(e)&&(s.y=k),s):s}_setupCurrentTransform(t,e,s){var i;const r=e.group?ue(this.getScenePoint(t),void 0,e.group.calcTransformMatrix()):this.getScenePoint(t),{key:n="",control:o}=e.getActiveControl()||{},a=s&&o?null===(i=o.getActionHandler(t,e,o))||void 0===i?void 0:i.bind(o):Re,h=((t,e,s,i)=>{if(!e||!t)return"drag";const r=i.controls[e];return r.getActionName(s,r,i)})(s,n,t,e),l=t[this.centeredKey],c=this._shouldCenterTransform(e,h,l)?{x:T,y:T}:this._getOriginFromCorner(e,n),u={target:e,action:h,actionHandler:a,actionPerformed:!1,corner:n,scaleX:e.scaleX,scaleY:e.scaleY,skewX:e.skewX,skewY:e.skewY,offsetX:r.x-e.left,offsetY:r.y-e.top,originX:c.x,originY:c.y,ex:r.x,ey:r.y,lastX:r.x,lastY:r.y,theta:vt(e.angle),width:e.width,height:e.height,shiftKey:t.shiftKey,altKey:l,original:{...he(e),originX:c.x,originY:c.y}};this._currentTransform=u,this.fire("before:transform",{e:t,transform:u})}setCursor(t){this.upperCanvasEl.style.cursor=t}_drawSelection(t){const{x:e,y:s,deltaX:i,deltaY:r}=this._groupSelector,n=new it(e,s).transform(this.viewportTransform),o=new it(e+i,s+r).transform(this.viewportTransform),a=this.selectionLineWidth/2;let h=Math.min(n.x,o.x),l=Math.min(n.y,o.y),c=Math.max(n.x,o.x),u=Math.max(n.y,o.y);this.selectionColor&&(t.fillStyle=this.selectionColor,t.fillRect(h,l,c-h,u-l)),this.selectionLineWidth&&this.selectionBorderColor&&(t.lineWidth=this.selectionLineWidth,t.strokeStyle=this.selectionBorderColor,h+=a,l+=a,c-=a,u-=a,xi.prototype._setLineDash.call(this,t,this.selectionDashArray),t.strokeRect(h,l,c-h,u-l))}findTarget(t){if(this._targetInfo)return this._targetInfo;if(this.skipTargetFind)return{subTargets:[],currentSubTargets:[]};const e=this.getScenePoint(t),s=this._activeObject,i=this.getActiveObjects(),r=this.searchPossibleTargets(this._objects,e),{subTargets:n,container:o,target:a}=r,h={...r,currentSubTargets:n,currentContainer:o,currentTarget:a};if(!s)return h;const l={...this.searchPossibleTargets([s],e),currentSubTargets:n,currentContainer:o,currentTarget:a};if(s.findControl(this.getViewportPoint(t),se(t)))return{...l,target:s};if(l.target){if(i.length>1)return l;if(!this.preserveObjectStacking)return l;if(this.preserveObjectStacking&&t[this.altSelectionKey])return l}return h}_pointIsInObjectSelectionArea(t,e){let s=t.getCoords();const i=this.getZoom(),r=t.padding/i;if(r){const[t,e,i,n]=s,o=Math.atan2(e.y-t.y,e.x-t.x),a=et(o)*r,h=st(o)*r,l=a+h,c=a-h;s=[new it(t.x-c,t.y-l),new it(e.x+l,e.y-c),new it(i.x+c,i.y+l),new it(n.x-l,n.y+c)]}return $s.isPointInPolygon(e,s)}_checkTarget(t,e){if(t&&t.visible&&t.evented&&this._pointIsInObjectSelectionArea(t,e)){if(!this.perPixelTargetFind&&!t.perPixelTargetFind||t.isEditing)return!0;{const s=e.transform(this.viewportTransform);if(!this.isTargetTransparent(t,s.x,s.y))return!0}}return!1}_searchPossibleTargets(t,e,s){let i=t.length;for(;i--;){const r=t[i];if(this._checkTarget(r,e)){if(nt(r)&&r.subTargetCheck){const{target:t}=this._searchPossibleTargets(r._objects,e,s);t&&s.push(t)}return{target:r,subTargets:s}}}return{subTargets:[]}}searchPossibleTargets(t,e){const s=this._searchPossibleTargets(t,e,[]);s.container=s.target;const{container:i,subTargets:r}=s;if(i&&nt(i)&&i.interactive&&r[0]){for(let t=r.length-1;t>0;t--){const e=r[t];if(!nt(e)||!e.interactive)return s.target=e,s}return s.target=r[0],s}return s}getViewportPoint(t){return this._viewportPoint?this._viewportPoint:this._getPointerImpl(t,!0)}getScenePoint(t){return this._scenePoint?this._scenePoint:this._getPointerImpl(t)}_getPointerImpl(t){let e=arguments.length>1&&void 0!==arguments[1]&&arguments[1];const s=this.upperCanvasEl,i=s.getBoundingClientRect();let r=ee(t),n=i.width||0,o=i.height||0;n&&o||(k in i&&D in i&&(o=Math.abs(i.top-i.bottom)),M in i&&O in i&&(n=Math.abs(i.right-i.left))),this.calcOffset(),r.x=r.x-this._offset.left,r.y=r.y-this._offset.top,e||(r=ue(r,void 0,this.viewportTransform));const a=this.getRetinaScaling();1!==a&&(r.x/=a,r.y/=a);const h=0===n||0===o?new it(1,1):new it(s.width/n,s.height/o);return r.multiply(h)}_setDimensionsImpl(t,e){this._resetTransformEventData(),super._setDimensionsImpl(t,e),this._isCurrentlyDrawing&&this.freeDrawingBrush&&this.freeDrawingBrush._setBrushStyles(this.contextTop)}_createCacheCanvas(){this.pixelFindCanvasEl=dt(),this.pixelFindContext=this.pixelFindCanvasEl.getContext("2d",{willReadFrequently:!0}),this.setTargetFindTolerance(this.targetFindTolerance)}getTopContext(){return this.elements.upper.ctx}getSelectionContext(){return this.elements.upper.ctx}getSelectionElement(){return this.elements.upper.el}getActiveObject(){return this._activeObject}getActiveObjects(){const t=this._activeObject;return Gt(t)?t.getObjects():t?[t]:[]}_fireSelectionEvents(t,e){let s=!1,i=!1;const r=this.getActiveObjects(),n=[],o=[];t.forEach(t=>{r.includes(t)||(s=!0,t.fire("deselected",{e:e,target:t}),o.push(t))}),r.forEach(i=>{t.includes(i)||(s=!0,i.fire("selected",{e:e,target:i}),n.push(i))}),t.length>0&&r.length>0?(i=!0,s&&this.fire("selection:updated",{e:e,selected:n,deselected:o})):r.length>0?(i=!0,this.fire("selection:created",{e:e,selected:n})):t.length>0&&(i=!0,this.fire("selection:cleared",{e:e,deselected:o})),i&&(this._objectsToRender=void 0)}setActiveObject(t,e){const s=this.getActiveObjects(),i=this._setActiveObject(t,e);return this._fireSelectionEvents(s,e),i}_setActiveObject(t,e){const s=this._activeObject;return s!==t&&(!(!this._discardActiveObject(e,t)&&this._activeObject)&&(!t.onSelect({e:e})&&(this._activeObject=t,Gt(t)&&s!==t&&t.set("canvas",this),t.setCoords(),!0)))}_discardActiveObject(t,e){const s=this._activeObject;return!!s&&(!s.onDeselect({e:t,object:e})&&(this._currentTransform&&this._currentTransform.target===s&&this.endCurrentTransform(t),Gt(s)&&s===this._hoveredTarget&&(this._hoveredTarget=void 0),this._activeObject=void 0,!0))}discardActiveObject(t){const e=this.getActiveObjects(),s=this.getActiveObject();e.length&&this.fire("before:selection:cleared",{e:t,deselected:[s]});const i=this._discardActiveObject(t);return this._fireSelectionEvents(e,t),i}endCurrentTransform(t){const e=this._currentTransform;this._finalizeCurrentTransform(t),e&&e.target&&(e.target.isMoving=!1),this._currentTransform=null}_finalizeCurrentTransform(t){const e=this._currentTransform,s=e.target,i={e:t,target:s,transform:e,action:e.action};s._scaling&&(s._scaling=!1),s.setCoords(),e.actionPerformed&&(this.fire("object:modified",i),s.fire(U,i))}setViewportTransform(t){super.setViewportTransform(t);const e=this._activeObject;e&&e.setCoords()}destroy(){const t=this._activeObject;Gt(t)&&(t.removeAll(),t.dispose()),delete this._activeObject,super.destroy(),this.pixelFindContext=null,this.pixelFindCanvasEl=void 0}clear(){this.discardActiveObject(),this._activeObject=void 0,this.clearContext(this.contextTop),super.clear()}drawControls(t){const e=this._activeObject;e&&e._renderControls(t)}_toObject(t,e,s){const i=this._realizeGroupTransformOnObject(t),r=super._toObject(t,e,s);return t.set(i),r}_realizeGroupTransformOnObject(t){const{group:e}=t;if(e&&Gt(e)&&this._activeObject===e){const s=It(t,["angle","flipX","flipY",O,W,V,G,z,k]);return ne(t,e.calcOwnMatrix()),s}return{}}_setSVGObject(t,e,s){const i=this._realizeGroupTransformOnObject(e);super._setSVGObject(t,e,s),e.set(i)}}e(en,"ownDefaults",{uniformScaling:!0,uniScaleKey:"shiftKey",centeredScaling:!1,centeredRotation:!1,centeredKey:"altKey",altActionKey:"shiftKey",selection:!0,selectionKey:"shiftKey",selectionColor:"rgba(100, 100, 255, 0.3)",selectionDashArray:[],selectionBorderColor:"rgba(255, 255, 255, 0.3)",selectionLineWidth:1,selectionFullyContained:!1,hoverCursor:"move",moveCursor:"move",defaultCursor:"default",freeDrawingCursor:"crosshair",notAllowedCursor:"not-allowed",perPixelTargetFind:!1,targetFindTolerance:0,skipTargetFind:!1,stopContextMenu:!1,fireRightClick:!1,fireMiddleClick:!1,enablePointerEvents:!1,containerClass:"canvas-container",preserveObjectStacking:!0});class sn{constructor(t){e(this,"targets",[]),e(this,"__disposer",void 0);const s=()=>{const{hiddenTextarea:e}=t.getActiveObject()||{};e&&e.focus()},i=t.upperCanvasEl;i.addEventListener("click",s),this.__disposer=()=>i.removeEventListener("click",s)}exitTextEditing(){this.target=void 0,this.targets.forEach(t=>{t.isEditing&&t.exitEditing()})}add(t){this.targets.push(t)}remove(t){this.unregister(t),tt(this.targets,t)}register(t){this.target=t}unregister(t){t===this.target&&(this.target=void 0)}onMouseMove(t){var e;(null===(e=this.target)||void 0===e?void 0:e.isEditing)&&this.target.updateSelectionOnMouseMove(t)}clear(){this.targets=[],this.target=void 0}dispose(){this.clear(),this.__disposer(),delete this.__disposer}}const rn={passive:!1},nn=(t,e)=>({viewportPoint:t.getViewportPoint(e),scenePoint:t.getScenePoint(e)}),on=function(t){for(var e=arguments.length,s=new Array(e>1?e-1:0),i=1;i1?e-1:0),i=1;i1&&void 0!==arguments[1]?arguments[1]:{}),e(this,"_isClick",void 0),e(this,"textEditingManager",new sn(this)),["_onMouseDown","_onTouchStart","_onMouseMove","_onMouseUp","_onTouchEnd","_onResize","_onMouseWheel","_onMouseOut","_onMouseEnter","_onContextMenu","_onClick","_onDragStart","_onDragEnd","_onDragProgress","_onDragOver","_onDragEnter","_onDragLeave","_onDrop"].forEach(t=>{this[t]=this[t].bind(this)}),this.addOrRemove(on,"add")}_getEventPrefix(){return this.enablePointerEvents?"pointer":"mouse"}addOrRemove(t,e){const s=this.upperCanvasEl,i=this._getEventPrefix();t(Nt(s),"resize",this._onResize),t(s,i+"down",this._onMouseDown),t(s,`${i}move`,this._onMouseMove,rn),t(s,`${i}out`,this._onMouseOut),t(s,`${i}enter`,this._onMouseEnter),t(s,"wheel",this._onMouseWheel),t(s,"contextmenu",this._onContextMenu),t(s,"click",this._onClick),t(s,"dblclick",this._onClick),t(s,"dragstart",this._onDragStart),t(s,"dragend",this._onDragEnd),t(s,"dragover",this._onDragOver),t(s,"dragenter",this._onDragEnter),t(s,"dragleave",this._onDragLeave),t(s,"drop",this._onDrop),this.enablePointerEvents||t(s,"touchstart",this._onTouchStart,rn)}removeListeners(){this.addOrRemove(an,"remove");const t=this._getEventPrefix(),e=Ht(this.upperCanvasEl);an(e,`${t}up`,this._onMouseUp),an(e,"touchend",this._onTouchEnd,rn),an(e,`${t}move`,this._onMouseMove,rn),an(e,"touchmove",this._onMouseMove,rn),clearTimeout(this._willAddMouseDown)}_onMouseWheel(t){this._cacheTransformEventData(t),this._handleEvent(t,"wheel"),this._resetTransformEventData()}_onMouseOut(t){const e=this._hoveredTarget,s={e:t,...nn(this,t)};this.fire("mouse:out",{...s,target:e}),this._hoveredTarget=void 0,e&&e.fire("mouseout",{...s}),this._hoveredTargets.forEach(t=>{this.fire("mouse:out",{...s,target:t}),t&&t.fire("mouseout",{...s})}),this._hoveredTargets=[]}_onMouseEnter(t){const{target:e}=this.findTarget(t);this._currentTransform||e||(this.fire("mouse:over",{e:t,...nn(this,t)}),this._hoveredTarget=void 0,this._hoveredTargets=[])}_onDragStart(t){this._isClick=!1;const e=this.getActiveObject();if(e&&e.onDragStart(t)){this._dragSource=e;const s={e:t,target:e};return this.fire("dragstart",s),e.fire("dragstart",s),void on(this.upperCanvasEl,"drag",this._onDragProgress)}ie(t)}_renderDragEffects(t,e,s){let i=!1;const r=this._dropTarget;r&&r!==e&&r!==s&&(r.clearContextTop(),i=!0),null==e||e.clearContextTop(),s!==e&&(null==s||s.clearContextTop());const n=this.contextTop;n.save(),n.transform(...this.viewportTransform),e&&(n.save(),e.transform(n),e.renderDragSourceEffect(t),n.restore(),i=!0),s&&(n.save(),s.transform(n),s.renderDropTargetEffect(t),n.restore(),i=!0),n.restore(),i&&(this.contextTopDirty=!0)}_onDragEnd(t){const{currentSubTargets:e}=this.findTarget(t),s=!!t.dataTransfer&&t.dataTransfer.dropEffect!==P,i=s?this._activeObject:void 0,r={e:t,target:this._dragSource,subTargets:e,dragSource:this._dragSource,didDrop:s,dropTarget:i};an(this.upperCanvasEl,"drag",this._onDragProgress),this.fire("dragend",r),this._dragSource&&this._dragSource.fire("dragend",r),delete this._dragSource,this._onMouseUp(t)}_onDragProgress(t){const e={e:t,target:this._dragSource,dragSource:this._dragSource,dropTarget:this._draggedoverTarget};this.fire("drag",e),this._dragSource&&this._dragSource.fire("drag",e)}_onDragOver(t){const e="dragover",{currentContainer:s,currentSubTargets:i}=this.findTarget(t),r=this._dragSource,n={e:t,target:s,subTargets:i,dragSource:r,canDrop:!1,dropTarget:void 0};let o;this.fire(e,n),this._fireEnterLeaveEvents(t,s,n),s&&(s.canDrop(t)&&(o=s),s.fire(e,n));for(let s=0;s3||e<2||(this._cacheTransformEventData(t),2==e&&"dblclick"===t.type&&this._handleEvent(t,"dblclick"),3==e&&this._handleEvent(t,"tripleclick"),this._resetTransformEventData())}getPointerId(t){const e=t.changedTouches;return e?e[0]&&e[0].identifier:this.enablePointerEvents?t.pointerId:-1}_isMainEvent(t){return!0===t.isPrimary||!1!==t.isPrimary&&("touchend"===t.type&&0===t.touches.length||(!t.changedTouches||t.changedTouches[0].identifier===this.mainTouchId))}_onTouchStart(t){this._cacheTransformEventData(t);let e=!this.allowTouchScrolling;const s=this._activeObject;void 0===this.mainTouchId&&(this.mainTouchId=this.getPointerId(t)),this.__onMouseDown(t);const{target:i}=this.findTarget(t);(this.isDrawingMode||s&&i===s)&&(e=!0),e&&t.preventDefault();const r=this.upperCanvasEl,n=this._getEventPrefix(),o=Ht(r);on(o,"touchend",this._onTouchEnd,rn),e&&on(o,"touchmove",this._onMouseMove,rn),an(r,`${n}down`,this._onMouseDown),this._resetTransformEventData()}_onMouseDown(t){this._cacheTransformEventData(t),this.__onMouseDown(t);const e=this.upperCanvasEl,s=this._getEventPrefix();an(e,`${s}move`,this._onMouseMove,rn);const i=Ht(e);on(i,`${s}up`,this._onMouseUp),on(i,`${s}move`,this._onMouseMove,rn),this._resetTransformEventData()}_onTouchEnd(t){if(t.touches.length>0)return;this._cacheTransformEventData(t),this.__onMouseUp(t),this._resetTransformEventData(),delete this.mainTouchId;const e=this._getEventPrefix(),s=Ht(this.upperCanvasEl);an(s,"touchend",this._onTouchEnd,rn),an(s,"touchmove",this._onMouseMove,rn),this._willAddMouseDown&&clearTimeout(this._willAddMouseDown),this._willAddMouseDown=setTimeout(()=>{on(this.upperCanvasEl,`${e}down`,this._onMouseDown),this._willAddMouseDown=0},400)}_onMouseUp(t){this._cacheTransformEventData(t),this.__onMouseUp(t);const e=this.upperCanvasEl,s=this._getEventPrefix();if(this._isMainEvent(t)){const t=Ht(this.upperCanvasEl);an(t,`${s}up`,this._onMouseUp),an(t,`${s}move`,this._onMouseMove,rn),on(e,`${s}move`,this._onMouseMove,rn)}this._resetTransformEventData()}_onMouseMove(t){this._cacheTransformEventData(t);const e=this.getActiveObject();!this.allowTouchScrolling&&(!e||!e.shouldStartDragging(t))&&t.preventDefault&&t.preventDefault(),this.__onMouseMove(t),this._resetTransformEventData()}_onResize(){this.calcOffset(),this._resetTransformEventData()}_shouldRender(t){const e=this.getActiveObject();return!!e!=!!t||e&&t&&e!==t}__onMouseUp(t){var e;this._handleEvent(t,"up:before");const s=this._currentTransform,i=this._isClick,{target:r}=this.findTarget(t),{button:n}=t;if(n)return void((this.fireMiddleClick&&1===n||this.fireRightClick&&2===n)&&this._handleEvent(t,"up"));if(this.isDrawingMode&&this._isCurrentlyDrawing)return void this._onMouseUpInDrawingMode(t);if(!this._isMainEvent(t))return;let o,a,h=!1;if(s&&(this._finalizeCurrentTransform(t),h=s.actionPerformed),!i){const e=r===this._activeObject;this.handleSelection(t),h||(h=this._shouldRender(r)||!e&&r===this._activeObject)}if(r){const e=r.findControl(this.getViewportPoint(t),se(t)),{key:i,control:n}=e||{};if(a=i,r.selectable&&r!==this._activeObject&&"up"===r.activeOn)this.setActiveObject(r,t),h=!0;else if(n){const e=n.getMouseUpHandler(t,r,n);e&&(o=this.getScenePoint(t),e.call(n,t,s,o.x,o.y))}r.isMoving=!1}if(s&&(s.target!==r||s.corner!==a)){const e=s.target&&s.target.controls[s.corner],i=e&&e.getMouseUpHandler(t,s.target,e);o=o||this.getScenePoint(t),i&&i.call(e,t,s,o.x,o.y)}this._setCursorFromEvent(t,r),this._handleEvent(t,"up"),this._groupSelector=null,this._currentTransform=null,r&&(r.__corner=void 0),h?this.requestRenderAll():i||null!==(e=this._activeObject)&&void 0!==e&&e.isEditing||this.renderTop()}_basicEventHandler(t,e){const{target:s,subTargets:i=[]}=e;this.fire(t,e),s&&s.fire(t,e);for(let r=0;r{s=t.hoverCursor||s})}this.setCursor(s)}}handleMultiSelection(t,e){const s=this._activeObject,i=Gt(s);if(s&&this._isSelectionKeyPressed(t)&&this.selection&&e&&e.selectable&&(s!==e||i)&&(i||!e.isDescendantOf(s)&&!s.isDescendantOf(e))&&!e.onSelect({e:t})&&!s.getActiveControl()){if(i){const i=s.getObjects();let r=[];if(e===s){const s=this.getScenePoint(t);let n=this.searchPossibleTargets(i,s);if(n.target?(e=n.target,r=n.subTargets):(n=this.searchPossibleTargets(this._objects,s),e=n.target,r=n.subTargets),!e||!e.selectable)return!1}e.group===s?(s.remove(e),this._hoveredTarget=e,this._hoveredTargets=r,1===s.size()&&this._setActiveObject(s.item(0),t)):(s.multiSelectAdd(e),this._hoveredTarget=s,this._hoveredTargets=r),this._fireSelectionEvents(i,t)}else{s.isEditing&&s.exitEditing();const i=new(J.getClass("ActiveSelection"))([],{canvas:this});i.multiSelectAdd(s,e),this._hoveredTarget=i,this._setActiveObject(i,t),this._fireSelectionEvents([s],t)}return!0}return!1}handleSelection(t){if(!this.selection||!this._groupSelector)return!1;const{x:e,y:s,deltaX:i,deltaY:r}=this._groupSelector,n=new it(e,s),o=n.add(new it(i,r)),a=n.min(o),h=n.max(o).subtract(a),l=this.collectObjects({left:a.x,top:a.y,width:h.x,height:h.y},{includeIntersecting:!this.selectionFullyContained}),c=n.eq(o)?l[0]?[l[0]]:[]:l.length>1?l.filter(e=>!e.onSelect({e:t})).reverse():l;if(1===c.length)this.setActiveObject(c[0],t);else if(c.length>1){const e=J.getClass("ActiveSelection");this.setActiveObject(new e(c,{canvas:this}),t)}return this._groupSelector=null,!0}clear(){this.textEditingManager.clear(),super.clear()}destroy(){this.removeListeners(),this.textEditingManager.dispose(),super.destroy()}}const cn={x1:0,y1:0,x2:0,y2:0},un={...cn,r1:0,r2:0},dn=(t,e)=>isNaN(t)&&"number"==typeof e?e:t,gn=/^(\d+\.\d+)%|(\d+)%$/;function fn(t){return t&&gn.test(t)}function pn(t,e){const s="number"==typeof t?t:"string"==typeof t?parseFloat(t)/(fn(t)?100:1):NaN;return xs(0,dn(s,e),1)}const mn=/\s*;\s*/,vn=/\s*:\s*/;function yn(t,e){let s,i;const r=t.getAttribute("style");if(r){const t=r.split(mn);""===t[t.length-1]&&t.pop();for(let e=t.length;e--;){const[r,n]=t[e].split(vn).map(t=>t.trim());"stop-color"===r?s=n:"stop-opacity"===r&&(i=n)}}s=s||t.getAttribute("stop-color")||"rgb(0,0,0)",i=dn(parseFloat(i||t.getAttribute("stop-opacity")||""),1);const n=new Ve(s);return n.setAlpha(n.getAlpha()*i*e),{offset:pn(t.getAttribute("offset"),0),color:n.toRgba()}}function _n(t,e){const s=[],i=t.getElementsByTagName("stop"),r=pn(e,1);for(let t=i.length;t--;)s.push(yn(i[t],r));return s}function xn(t){return"linearGradient"===t.nodeName||"LINEARGRADIENT"===t.nodeName?"linear":"radial"}function Cn(t){return"userSpaceOnUse"===t.getAttribute("gradientUnits")?"pixels":"percentage"}function bn(t,e){return t.getAttribute(e)}function Sn(t,e){return function(t,e){let s,{width:i,height:r,gradientUnits:n}=e;return Object.keys(t).reduce((e,o)=>{const a=t[o];return"Infinity"===a?s=1:"-Infinity"===a?s=0:(s="string"==typeof a?parseFloat(a):a,"string"==typeof a&&fn(a)&&(s*=.01,"pixels"===n&&("x1"!==o&&"x2"!==o&&"r2"!==o||(s*=i),"y1"!==o&&"y2"!==o||(s*=r)))),e[o]=s,e},{})}("linear"===xn(t)?function(t){return{x1:bn(t,"x1")||0,y1:bn(t,"y1")||0,x2:bn(t,"x2")||"100%",y2:bn(t,"y2")||0}}(t):function(t){return{x1:bn(t,"fx")||bn(t,"cx")||"50%",y1:bn(t,"fy")||bn(t,"cy")||"50%",r1:0,x2:bn(t,"cx")||"50%",y2:bn(t,"cy")||"50%",r2:bn(t,"r")||"50%"}}(t),{...e,gradientUnits:Cn(t)})}class wn{constructor(t){const{type:e="linear",gradientUnits:s="pixels",coords:i={},colorStops:r=[],offsetX:n=0,offsetY:o=0,gradientTransform:a,id:h}=t||{};Object.assign(this,{type:e,gradientUnits:s,coords:{..."radial"===e?un:cn,...i},colorStops:r,offsetX:n,offsetY:o,gradientTransform:a,id:h?`${h}_${ut()}`:ut()})}addColorStop(t){for(const e in t)this.colorStops.push({offset:parseFloat(e),color:t[e]});return this}toObject(t){return{...It(this,t),type:this.type,coords:{...this.coords},colorStops:this.colorStops.map(t=>({...t})),offsetX:this.offsetX,offsetY:this.offsetY,gradientUnits:this.gradientUnits,gradientTransform:this.gradientTransform?[...this.gradientTransform]:void 0}}toSVG(t){let{additionalTransform:e}=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};const s=[],i=this.gradientTransform?this.gradientTransform.concat():b.concat(),r="pixels"===this.gradientUnits?"userSpaceOnUse":"objectBoundingBox",n=this.colorStops.map(t=>({...t})).sort((t,e)=>t.offset-e.offset);let o=-this.offsetX,a=-this.offsetY;var h;"objectBoundingBox"===r?(o/=t.width,a/=t.height):(o+=t.width/2,a+=t.height/2),(h=t)&&"function"==typeof h._renderPathCommands&&"percentage"!==this.gradientUnits&&(o-=t.pathOffset.x,a-=t.pathOffset.y),i[4]-=o,i[5]-=a;const l=[`id="SVGID_${this.id}"`,`gradientUnits="${r}"`,`gradientTransform="${e?e+" ":""}${Xt(i)}"`,""].join(" ");if("linear"===this.type){const{x1:t,y1:e,x2:i,y2:r}=this.coords;s.push("\n')}else if("radial"===this.type){const{x1:t,y1:e,x2:i,y2:r,r1:o,r2:a}=this.coords,h=o>a;s.push("\n'),h&&(n.reverse(),n.forEach(t=>{t.offset=1-t.offset}));const c=Math.min(o,a);if(c>0){const t=c/Math.max(o,a);n.forEach(e=>{e.offset+=t*(1-e.offset)})}}return n.forEach(t=>{let{color:e,offset:i}=t;s.push(`\n`)}),s.push("linear"===this.type?"":"","\n"),s.join("")}toLive(t){const{x1:e,y1:s,x2:i,y2:r,r1:n,r2:o}=this.coords,a="linear"===this.type?t.createLinearGradient(e,s,i,r):t.createRadialGradient(e,s,n,i,r,o);return this.colorStops.forEach(t=>{let{color:e,offset:s}=t;a.addColorStop(s,e)}),a}static async fromObject(t){const{colorStops:e,gradientTransform:s}=t;return new this({...t,colorStops:e?e.map(t=>({...t})):void 0,gradientTransform:s?[...s]:void 0})}static fromElement(t,e,s){const i=Cn(t),r=e._findCenterFromElement();return new this({id:t.getAttribute("id")||void 0,type:xn(t),coords:Sn(t,{width:s.viewBoxWidth||s.width,height:s.viewBoxHeight||s.height}),colorStops:_n(t,s.opacity),gradientUnits:i,gradientTransform:er(t.getAttribute("gradientTransform")||""),..."pixels"===i?{offsetX:e.width/2-r.x,offsetY:e.height/2-r.y}:{offsetX:0,offsetY:0}})}}e(wn,"type","Gradient"),J.setClass(wn,"gradient"),J.setClass(wn,"linear"),J.setClass(wn,"radial");class Tn{get type(){return"pattern"}set type(t){r("warn","Setting type has no effect",t)}constructor(t){e(this,"repeat","repeat"),e(this,"offsetX",0),e(this,"offsetY",0),e(this,"crossOrigin",""),this.id=ut(),Object.assign(this,t)}isImageSource(){return!!this.source&&"string"==typeof this.source.src}isCanvasSource(){return!!this.source&&!!this.source.toDataURL}sourceToString(){return this.isImageSource()?this.source.src:this.isCanvasSource()?this.source.toDataURL():""}toLive(t){return this.source&&(!this.isImageSource()||this.source.complete&&0!==this.source.naturalWidth&&0!==this.source.naturalHeight)?t.createPattern(this.source,this.repeat):null}toObject(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[];const{repeat:e,crossOrigin:s}=this;return{...It(this,t),type:"pattern",source:this.sourceToString(),repeat:e,crossOrigin:s,offsetX:$t(this.offsetX,i.NUM_FRACTION_DIGITS),offsetY:$t(this.offsetY,i.NUM_FRACTION_DIGITS),patternTransform:this.patternTransform?[...this.patternTransform]:null}}toSVG(t){let{width:e,height:s}=t;const{source:i,repeat:r,id:n}=this,o=dn(this.offsetX/e,0),a=dn(this.offsetY/s,0);return[``,``,"",""].join("\n")}static async fromObject(t,e){let{type:s,source:i,patternTransform:r,...n}=t;const o=await Ft(i,{...e,crossOrigin:n.crossOrigin});return new this({...n,patternTransform:r&&r.slice(0),source:o})}}e(Tn,"type","Pattern"),J.setClass(Tn),J.setClass(Tn,"pattern");class On{constructor(t){e(this,"color","rgb(0, 0, 0)"),e(this,"width",1),e(this,"shadow",null),e(this,"strokeLineCap","round"),e(this,"strokeLineJoin","round"),e(this,"strokeMiterLimit",10),e(this,"strokeDashArray",null),e(this,"limitedToCanvasSize",!1),this.canvas=t}_setBrushStyles(t){t.strokeStyle=this.color,t.lineWidth=this.width,t.lineCap=this.strokeLineCap,t.miterLimit=this.strokeMiterLimit,t.lineJoin=this.strokeLineJoin,t.setLineDash(this.strokeDashArray||[])}_saveAndTransform(t){const e=this.canvas.viewportTransform;t.save(),t.transform(e[0],e[1],e[2],e[3],e[4],e[5])}needsFullRender(){return new Ve(this.color).getAlpha()<1||!!this.shadow}_setShadow(){if(!this.shadow||!this.canvas)return;const t=this.canvas,e=this.shadow,s=t.contextTop,i=t.getZoom()*t.getRetinaScaling();s.shadowColor=e.color,s.shadowBlur=e.blur*i,s.shadowOffsetX=e.offsetX*i,s.shadowOffsetY=e.offsetY*i}_resetShadow(){const t=this.canvas.contextTop;t.shadowColor="",t.shadowBlur=t.shadowOffsetX=t.shadowOffsetY=0}_isOutSideCanvas(t){return t.x<0||t.x>this.canvas.getWidth()||t.y<0||t.y>this.canvas.getHeight()}}class kn extends xi{constructor(t){let{path:e,left:s,top:i,...r}=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};super(),Object.assign(this,kn.ownDefaults),this.setOptions(r),this._setPath(t||[],!0),"number"==typeof s&&this.set(O,s),"number"==typeof i&&this.set(k,i)}_setPath(t,e){this.path=Pr(Array.isArray(t)?t:Nr(t)),this.setBoundingBox(e)}_findCenterFromElement(){const t=this._calcBoundsFromPath();return new it(t.left+t.width/2,t.top+t.height/2)}_renderPathCommands(t){const e=-this.pathOffset.x,s=-this.pathOffset.y;t.beginPath();for(const i of this.path)switch(i[0]){case"L":t.lineTo(i[1]+e,i[2]+s);break;case"M":t.moveTo(i[1]+e,i[2]+s);break;case"C":t.bezierCurveTo(i[1]+e,i[2]+s,i[3]+e,i[4]+s,i[5]+e,i[6]+s);break;case"Q":t.quadraticCurveTo(i[1]+e,i[2]+s,i[3]+e,i[4]+s);break;case"Z":t.closePath()}}_render(t){this._renderPathCommands(t),this._renderPaintInOrder(t)}toString(){return`#`}toObject(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[];return{...super.toObject(t),path:this.path.map(t=>t.slice())}}toDatalessObject(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[];const e=this.toObject(t);return this.sourcePath&&(delete e.path,e.sourcePath=this.sourcePath),e}_toSVG(){return["\n`]}_getOffsetTransform(){const t=i.NUM_FRACTION_DIGITS;return` translate(${$t(-this.pathOffset.x,t)}, ${$t(-this.pathOffset.y,t)})`}toClipPathSVG(t){const e=this._getOffsetTransform();return"\t"+this._createBaseClipPathSVGMarkup(this._toSVG(),{reviver:t,additionalTransform:e})}toSVG(t){const e=this._getOffsetTransform();return this._createBaseSVGMarkup(this._toSVG(),{reviver:t,additionalTransform:e})}complexity(){return this.path.length}setDimensions(){this.setBoundingBox()}setBoundingBox(t){const{width:e,height:s,pathOffset:i}=this._calcDimensions();this.set({width:e,height:s,pathOffset:i}),t&&this.setPositionByOrigin(i,T,T)}_calcBoundsFromPath(){const t=[];let e=0,s=0,i=0,r=0;for(const n of this.path)switch(n[0]){case"L":i=n[1],r=n[2],t.push({x:e,y:s},{x:i,y:r});break;case"M":i=n[1],r=n[2],e=i,s=r;break;case"C":t.push(...Dr(i,r,n[1],n[2],n[3],n[4],n[5],n[6])),i=n[5],r=n[6];break;case"Q":t.push(...Dr(i,r,n[1],n[2],n[1],n[2],n[3],n[4])),i=n[3],r=n[4];break;case"Z":i=e,r=s}return re(t)}_calcDimensions(){const t=this._calcBoundsFromPath();return{...t,pathOffset:new it(t.left+t.width/2,t.top+t.height/2)}}static fromObject(t){return this._fromObject(t,{extraParam:"path"})}static async fromElement(t,e,s){const{d:i,...r}=or(t,this.ATTRIBUTE_NAMES,s);return new this(i,{...r,...e,left:void 0,top:void 0})}}e(kn,"type","Path"),e(kn,"cacheProperties",[...bs,"path","fillRule"]),e(kn,"ATTRIBUTE_NAMES",[...Ii,"d"]),J.setClass(kn),J.setSVGClass(kn);class Dn extends On{constructor(t){super(t),e(this,"decimate",.4),e(this,"drawStraightLine",!1),e(this,"straightLineKey","shiftKey"),this._points=[],this._hasStraightLine=!1}needsFullRender(){return super.needsFullRender()||this._hasStraightLine}static drawSegment(t,e,s){const i=e.midPointFrom(s);return t.quadraticCurveTo(e.x,e.y,i.x,i.y),i}onMouseDown(t,e){let{e:s}=e;this.canvas._isMainEvent(s)&&(this.drawStraightLine=!!this.straightLineKey&&s[this.straightLineKey],this._prepareForDrawing(t),this._addPoint(t),this._render())}onMouseMove(t,e){let{e:s}=e;if(this.canvas._isMainEvent(s)&&(this.drawStraightLine=!!this.straightLineKey&&s[this.straightLineKey],(!0!==this.limitedToCanvasSize||!this._isOutSideCanvas(t))&&this._addPoint(t)&&this._points.length>1))if(this.needsFullRender())this.canvas.clearContext(this.canvas.contextTop),this._render();else{const t=this._points,e=t.length,s=this.canvas.contextTop;this._saveAndTransform(s),this.oldEnd&&(s.beginPath(),s.moveTo(this.oldEnd.x,this.oldEnd.y)),this.oldEnd=Dn.drawSegment(s,t[e-2],t[e-1]),s.stroke(),s.restore()}}onMouseUp(t){let{e:e}=t;return!this.canvas._isMainEvent(e)||(this.drawStraightLine=!1,this.oldEnd=void 0,this._finalizeAndAddPath(),!1)}_prepareForDrawing(t){this._reset(),this._addPoint(t),this.canvas.contextTop.moveTo(t.x,t.y)}_addPoint(t){return!(this._points.length>1&&t.eq(this._points[this._points.length-1]))&&(this.drawStraightLine&&this._points.length>1&&(this._hasStraightLine=!0,this._points.pop()),this._points.push(t),!0)}_reset(){this._points=[],this._setBrushStyles(this.canvas.contextTop),this._setShadow(),this._hasStraightLine=!1}_render(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.canvas.contextTop,e=this._points[0],s=this._points[1];if(this._saveAndTransform(t),t.beginPath(),2===this._points.length&&e.x===s.x&&e.y===s.y){const t=this.width/1e3;e.x-=t,s.x+=t}t.moveTo(e.x,e.y);for(let i=1;i=n&&(i=t[e],a.push(i));return a.push(t[o]),a}_finalizeAndAddPath(){this.canvas.contextTop.closePath(),this.decimate&&(this._points=this.decimatePoints(this._points,this.decimate));const t=this.convertPointsToSVGPath(this._points);if(function(t){return"M 0 0 Q 0 0 0 0 L 0 0"===qr(t)}(t))return void this.canvas.requestRenderAll();const e=this.createPath(t);this.canvas.clearContext(this.canvas.contextTop),this.canvas.fire("before:path:created",{path:e}),this.canvas.add(e),this.canvas.requestRenderAll(),e.setCoords(),this._resetShadow(),this.canvas.fire("path:created",{path:e})}}const Mn=["radius","startAngle","endAngle","counterClockwise"];class Pn extends xi{static getDefaults(){return{...super.getDefaults(),...Pn.ownDefaults}}constructor(t){super(),Object.assign(this,Pn.ownDefaults),this.setOptions(t)}_set(t,e){return super._set(t,e),"radius"===t&&this.setRadius(e),this}_render(t){t.beginPath(),t.arc(0,0,this.radius,vt(this.startAngle),vt(this.endAngle),this.counterClockwise),this._renderPaintInOrder(t)}getRadiusX(){return this.get("radius")*this.get(W)}getRadiusY(){return this.get("radius")*this.get(V)}setRadius(t){this.radius=t,this.set({width:2*t,height:2*t})}toObject(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[];return super.toObject([...Mn,...t])}_toSVG(){const t=(this.endAngle-this.startAngle)%360;if(0===t)return["\n'];{const{radius:e}=this,s=vt(this.startAngle),i=vt(this.endAngle),r=et(s)*e,n=st(s)*e,o=et(i)*e,a=st(i)*e;return[`\n"]}}static async fromElement(t,e,s){const{left:i=0,top:r=0,radius:n=0,...o}=or(t,this.ATTRIBUTE_NAMES,s);return new this({...o,radius:n,left:i-n,top:r-n})}static fromObject(t){return super._fromObject(t)}}e(Pn,"type","Circle"),e(Pn,"cacheProperties",[...bs,...Mn]),e(Pn,"ownDefaults",{radius:0,startAngle:0,endAngle:360,counterClockwise:!1}),e(Pn,"ATTRIBUTE_NAMES",["cx","cy","r",...Ii]),J.setClass(Pn),J.setSVGClass(Pn);const En=["x1","x2","y1","y2"];class An extends xi{constructor(){let[t,e,s,i]=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[0,0,0,0],r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};super(),Object.assign(this,An.ownDefaults),this.setOptions(r),this.x1=t,this.x2=s,this.y1=e,this.y2=i,this._setWidthHeight();const{left:n,top:o}=r;"number"==typeof n&&this.set(O,n),"number"==typeof o&&this.set(k,o)}_setWidthHeight(){const{x1:t,y1:e,x2:s,y2:i}=this;this.width=Math.abs(s-t),this.height=Math.abs(i-e);const{left:r,top:n,width:o,height:a}=re([{x:t,y:e},{x:s,y:i}]),h=new it(r+o/2,n+a/2);this.setPositionByOrigin(h,T,T)}_set(t,e){return super._set(t,e),En.includes(t)&&this._setWidthHeight(),this}_render(t){t.beginPath();const e=this.calcLinePoints();t.moveTo(e.x1,e.y1),t.lineTo(e.x2,e.y2),t.lineWidth=this.strokeWidth;const s=t.strokeStyle;var i;Yt(this.stroke)?t.strokeStyle=this.stroke.toLive(t):t.strokeStyle=null!==(i=this.stroke)&&void 0!==i?i:t.fillStyle;this.stroke&&this._renderStroke(t),t.strokeStyle=s}_findCenterFromElement(){return new it((this.x1+this.x2)/2,(this.y1+this.y2)/2)}toObject(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[];return{...super.toObject(t),...this.calcLinePoints()}}_getNonTransformedDimensions(){const t=super._getNonTransformedDimensions();return"butt"===this.strokeLineCap&&(0===this.width&&(t.y-=this.strokeWidth),0===this.height&&(t.x-=this.strokeWidth)),t}calcLinePoints(){const{x1:t,x2:e,y1:s,y2:i,width:r,height:n}=this,o=t<=e?-1:1,a=s<=i?-1:1;return{x1:o*r/2,x2:o*-r/2,y1:a*n/2,y2:a*-n/2}}_toSVG(){const{x1:t,x2:e,y1:s,y2:i}=this.calcLinePoints();return["\n`]}static async fromElement(t,e,s){const{x1:i=0,y1:r=0,x2:n=0,y2:o=0,...a}=or(t,this.ATTRIBUTE_NAMES,s);return new this([i,r,n,o],a)}static fromObject(t){let{x1:e,y1:s,x2:i,y2:r,...n}=t;return this._fromObject({...n,points:[e,s,i,r]},{extraParam:"points"})}}e(An,"type","Line"),e(An,"cacheProperties",[...bs,...En]),e(An,"ATTRIBUTE_NAMES",Ii.concat(En)),J.setClass(An),J.setSVGClass(An);class jn extends xi{static getDefaults(){return{...super.getDefaults(),...jn.ownDefaults}}constructor(t){super(),Object.assign(this,jn.ownDefaults),this.setOptions(t)}_render(t){const e=this.width/2,s=this.height/2;t.beginPath(),t.moveTo(-e,s),t.lineTo(0,-s),t.lineTo(e,s),t.closePath(),this._renderPaintInOrder(t)}_toSVG(){const t=this.width/2,e=this.height/2;return["']}}e(jn,"type","Triangle"),e(jn,"ownDefaults",{width:100,height:100}),J.setClass(jn),J.setSVGClass(jn);const Fn=["rx","ry"];class Ln extends xi{static getDefaults(){return{...super.getDefaults(),...Ln.ownDefaults}}constructor(t){super(),Object.assign(this,Ln.ownDefaults),this.setOptions(t)}_set(t,e){switch(super._set(t,e),t){case"rx":this.rx=e,this.set("width",2*e);break;case"ry":this.ry=e,this.set("height",2*e)}return this}getRx(){return this.get("rx")*this.get(W)}getRy(){return this.get("ry")*this.get(V)}toObject(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[];return super.toObject([...Fn,...t])}_toSVG(){return["\n`]}_render(t){t.beginPath(),t.save(),t.transform(1,0,0,this.ry/this.rx,0,0),t.arc(0,0,this.rx,0,x,!1),t.restore(),this._renderPaintInOrder(t)}static async fromElement(t,e,s){const i=or(t,this.ATTRIBUTE_NAMES,s);return i.left=(i.left||0)-i.rx,i.top=(i.top||0)-i.ry,new this(i)}}e(Ln,"type","Ellipse"),e(Ln,"cacheProperties",[...bs,...Fn]),e(Ln,"ownDefaults",{rx:0,ry:0}),e(Ln,"ATTRIBUTE_NAMES",[...Ii,"cx","cy","rx","ry"]),J.setClass(Ln),J.setSVGClass(Ln);const Rn={exactBoundingBox:!1};class In extends xi{static getDefaults(){return{...super.getDefaults(),...In.ownDefaults}}constructor(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[],s=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};super(),e(this,"strokeDiff",void 0),Object.assign(this,In.ownDefaults),this.setOptions(s),this.points=t;const{left:i,top:r}=s;this.initialized=!0,this.setBoundingBox(!0),"number"==typeof i&&this.set(O,i),"number"==typeof r&&this.set(k,r)}isOpen(){return!0}_projectStrokeOnPoints(t){return Oi(this.points,t,this.isOpen())}_calcDimensions(t){t={scaleX:this.scaleX,scaleY:this.scaleY,skewX:this.skewX,skewY:this.skewY,strokeLineCap:this.strokeLineCap,strokeLineJoin:this.strokeLineJoin,strokeMiterLimit:this.strokeMiterLimit,strokeUniform:this.strokeUniform,strokeWidth:this.strokeWidth,...t||{}};const e=this.exactBoundingBox?this._projectStrokeOnPoints(t).map(t=>t.projectedPoint):this.points;if(0===e.length)return{left:0,top:0,width:0,height:0,pathOffset:new it,strokeOffset:new it,strokeDiff:new it};const s=re(e),i=At({...t,scaleX:1,scaleY:1}),r=re(this.points.map(t=>xt(t,i,!0))),n=new it(this.scaleX,this.scaleY);let o=s.left+s.width/2,a=s.top+s.height/2;return this.exactBoundingBox&&(o-=a*Math.tan(vt(this.skewX)),a-=o*Math.tan(vt(this.skewY))),{...s,pathOffset:new it(o,a),strokeOffset:new it(r.left,r.top).subtract(new it(s.left,s.top)).multiply(n),strokeDiff:new it(s.width,s.height).subtract(new it(r.width,r.height)).multiply(n)}}_findCenterFromElement(){const t=re(this.points);return new it(t.left+t.width/2,t.top+t.height/2)}setDimensions(){this.setBoundingBox()}setBoundingBox(t){const{left:e,top:s,width:i,height:r,pathOffset:n,strokeOffset:o,strokeDiff:a}=this._calcDimensions();this.set({width:i,height:r,pathOffset:n,strokeOffset:o,strokeDiff:a}),t&&this.setPositionByOrigin(new it(e+i/2,s+r/2),T,T)}isStrokeAccountedForInDimensions(){return this.exactBoundingBox}_getNonTransformedDimensions(){return this.exactBoundingBox?new it(this.width,this.height):super._getNonTransformedDimensions()}_getTransformedDimensions(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};if(this.exactBoundingBox){let n;if(Object.keys(t).some(t=>this.strokeUniform||this.constructor.layoutProperties.includes(t))){var e,s;const{width:i,height:r}=this._calcDimensions(t);n=new it(null!==(e=t.width)&&void 0!==e?e:i,null!==(s=t.height)&&void 0!==s?s:r)}else{var i,r;n=new it(null!==(i=t.width)&&void 0!==i?i:this.width,null!==(r=t.height)&&void 0!==r?r:this.height)}return n.multiply(new it(t.scaleX||this.scaleX,t.scaleY||this.scaleY))}return super._getTransformedDimensions(t)}_set(t,e){const s=this.initialized&&this[t]!==e,i=super._set(t,e);return this.exactBoundingBox&&s&&((t===W||t===V)&&this.strokeUniform&&this.constructor.layoutProperties.includes("strokeUniform")||this.constructor.layoutProperties.includes(t))&&this.setDimensions(),i}toObject(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[];return{...super.toObject(t),points:this.points.map(t=>{let{x:e,y:s}=t;return{x:e,y:s}})}}_toSVG(){const t=[],e=this.pathOffset.x,s=this.pathOffset.y,r=i.NUM_FRACTION_DIGITS;for(let i=0,n=this.points.length;i\n`]}_render(t){const e=this.points.length,s=this.pathOffset.x,i=this.pathOffset.y;if(e&&!isNaN(this.points[e-1].y)){t.beginPath(),t.moveTo(this.points[0].x-s,this.points[0].y-i);for(let r=0;rvoid 0!==t);this._setStyleDeclaration(s,i,r)}getSelectionStyles(t,e,s){const i=[];for(let r=t;r<(e||t);r++)i.push(this.getStyleAtPosition(r,s));return i}getStyleAtPosition(t,e){const{lineIndex:s,charIndex:i}=this.get2DCursorLocation(t);return e?this.getCompleteStyleDeclaration(s,i):this._getStyleDeclaration(s,i)}setSelectionStyles(t,e,s){for(let i=e;i<(s||e);i++)this._extendStyles(i,t);this._forceClearCache=!0}_getStyleDeclaration(t,e){var s;const i=this.styles&&this.styles[t];return i&&null!==(s=i[e])&&void 0!==s?s:{}}getCompleteStyleDeclaration(t,e){return{...It(this,this.constructor._styleProperties),...this._getStyleDeclaration(t,e)}}_setStyleDeclaration(t,e,s){this.styles[t][e]=s}_deleteStyleDeclaration(t,e){delete this.styles[t][e]}_getLineStyle(t){return!!this.styles[t]}_setLineStyle(t){this.styles[t]={}}_deleteLineStyle(t){delete this.styles[t]}}e($n,"_styleProperties",ts);const Xn=/ +/g,Yn=/"/g;function Wn(t,e,s,r,n){return`\t\t${function(t,e){let{left:s,top:r,width:n,height:o}=e,a=arguments.length>2&&void 0!==arguments[2]?arguments[2]:i.NUM_FRACTION_DIGITS;const h=He(H,t,!1),[l,c,u,d]=[s,r,n,o].map(t=>$t(t,a));return``}(t,{left:e,top:s,width:r,height:n})}\n`}let Vn;class Gn extends $n{static getDefaults(){return{...super.getDefaults(),...Gn.ownDefaults}}constructor(t,s){super(),e(this,"__charBounds",[]),Object.assign(this,Gn.ownDefaults),this.setOptions(s),this.styles||(this.styles={}),this.text=t,this.initialized=!0,this.path&&this.setPathInfo(),this.initDimensions(),this.setCoords()}setPathInfo(){const t=this.path;t&&(t.segmentsInfo=Yr(t.path))}_splitText(){const t=this._splitTextIntoLines(this.text);return this.textLines=t.lines,this._textLines=t.graphemeLines,this._unwrappedTextLines=t._unwrappedLines,this._text=t.graphemeText,t}initDimensions(){this._splitText(),this._clearCache(),this.dirty=!0,this.path?(this.width=this.path.width,this.height=this.path.height):(this.width=this.calcTextWidth()||this.cursorWidth||this.MIN_TEXT_WIDTH,this.height=this.calcTextHeight()),this.textAlign.includes(ss)&&this.enlargeSpaces()}enlargeSpaces(){let t,e,s,i,r,n,o;for(let a=0,h=this._textLines.length;a`}_getCacheCanvasDimensions(){const t=super._getCacheCanvasDimensions(),e=this.fontSize;return t.width+=e*t.zoomX,t.height+=e*t.zoomY,t}_render(t){const e=this.path;e&&!e.isNotVisible()&&e._render(t),this._setTextStyles(t),this._renderTextLinesBackground(t),this._renderTextDecoration(t,"underline"),this._renderText(t),this._renderTextDecoration(t,"overline"),this._renderTextDecoration(t,"linethrough")}_renderText(t){this.paintFirst===N?(this._renderTextStroke(t),this._renderTextFill(t)):(this._renderTextFill(t),this._renderTextStroke(t))}_setTextStyles(t,e,s){if(t.textBaseline="alphabetic",this.path)switch(this.pathAlign){case T:t.textBaseline="middle";break;case"ascender":t.textBaseline=k;break;case"descender":t.textBaseline=D}t.font=this._getFontDeclaration(e,s)}calcTextWidth(){let t=this.getLineWidth(0);for(let e=1,s=this._textLines.length;et&&(t=s)}return t}_renderTextLine(t,e,s,i,r,n){this._renderChars(t,e,s,i,r,n)}_renderTextLinesBackground(t){if(!this.textBackgroundColor&&!this.styleHas("textBackgroundColor"))return;const e=t.fillStyle,s=this._getLeftOffset();let i=this._getTopOffset();for(let e=0,r=this._textLines.length;e=0:ie?t%=e:t<0&&(t+=e),this._setGraphemeOnPath(t,s),t+=s.kernedWidth}return{width:i,numOfSpaces:0}}_setGraphemeOnPath(t,e){const s=t+e.kernedWidth/2,i=this.path,r=Wr(i.path,s,i.segmentsInfo);e.renderLeft=r.x-i.pathOffset.x,e.renderTop=r.y-i.pathOffset.y,e.angle=r.angle+(this.pathSide===M?Math.PI:0)}_getGraphemeBox(t,e,s,i,r){const n=this.getCompleteStyleDeclaration(e,s),o=i?this.getCompleteStyleDeclaration(e,s-1):{},a=this._measureChar(t,n,i,o);let h,l=a.kernedWidth,c=a.width;0!==this.charSpacing&&(h=this._getWidthOfCharSpacing(),c+=h,l+=h);const u={width:c,left:0,height:n.fontSize,kernedWidth:l,deltaY:n.deltaY};if(s>0&&!r){const t=this.__charBounds[e][s-1];u.left=t.left+t.width+a.kernedWidth-a.width}return u}getHeightOfLine(t){if(this.__lineHeights[t])return this.__lineHeights[t];let e=this.getHeightOfChar(t,0);for(let s=1,i=this._textLines[t].length;s0){const e=this.fontSize*v/1e3;let s=i+d+g;"rtl"===this.direction&&(s=this.width-s-f),p&&m&&v&&(t.fillStyle=m,t.fillRect(s,C+a*b+S-o*e,f,e)),g=n.left,f=n.width,p=y,v=x,m=_,b=l,S=c}else f+=n.kernedWidth}let w=i+d+g;"rtl"===this.direction&&(w=this.width-w-f),t.fillStyle=_;const T=this.fontSize*x/1e3;y&&_&&x&&t.fillRect(w,C+a*b+S-o*T,f-n,T),s+=l}this._removeShadow(t)}_getFontDeclaration(){let{fontFamily:t=this.fontFamily,fontStyle:e=this.fontStyle,fontWeight:s=this.fontWeight,fontSize:i=this.fontSize}=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},r=arguments.length>1?arguments[1]:void 0;const n=t.includes("'")||t.includes('"')||t.includes(",")||Gn.genericFonts.includes(t.toLowerCase())?t:`"${t}"`;return[e,s,`${r?this.CACHE_FONT_SIZE:i}px`,n].join(" ")}render(t){this.visible&&(this.canvas&&this.canvas.skipOffscreen&&!this.group&&!this.isOnScreen()||(this._forceClearCache&&this.initDimensions(),super.render(t)))}graphemeSplit(t){return Pi(t)}_splitTextIntoLines(t){const e=t.split(this._reNewline),s=new Array(e.length),i=["\n"];let r=[];for(let t=0;t0&&void 0!==arguments[0]?arguments[0]:[];return{...super.toObject([...Ze,...t]),styles:Li(this.styles,this.text),...this.path?{path:this.path.toObject()}:{}}}set(t,e){const{textLayoutProperties:s}=this.constructor;super.set(t,e);let i=!1,r=!1;if("object"==typeof t)for(const e in t)"path"===e&&this.setPathInfo(),i=i||s.includes(e),r=r||"path"===e;else i=s.includes(t),r="path"===t;return r&&this.setPathInfo(),i&&this.initialized&&(this.initDimensions(),this.setCoords()),this}complexity(){return 1}static async fromElement(t,e,s){const i=or(t,Gn.ATTRIBUTE_NAMES,s),{textAnchor:r=O,textDecoration:n="",dx:o=0,dy:a=0,top:h=0,left:l=0,fontSize:c=S,strokeWidth:u=1,...d}={...e,...i},g=new this((t.textContent||"").replace(/^\s+|\s+$|\n+/g,"").replace(/\s+/g," "),{left:l+o,top:h+a,underline:n.includes("underline"),overline:n.includes("overline"),linethrough:n.includes("line-through"),strokeWidth:0,fontSize:c,...d}),f=g.getScaledHeight()/g.height,p=((g.height+g.strokeWidth)*g.lineHeight-g.height)*f,m=g.getScaledHeight()+p;let v=0;return r===T&&(v=g.getScaledWidth()/2),r===M&&(v=g.getScaledWidth()),g.set({left:g.left-v,top:g.top-(m-g.fontSize*(.07+g._fontSizeFraction))/g.lineHeight,strokeWidth:u}),g}static fromObject(t){return this._fromObject({...t,styles:Ri(t.styles||{},t.text)},{extraParam:"text"})}}e(Gn,"textLayoutProperties",Qe),e(Gn,"cacheProperties",[...bs,...Ze]),e(Gn,"ownDefaults",es),e(Gn,"type","Text"),e(Gn,"genericFonts",["serif","sans-serif","monospace","cursive","fantasy","system-ui","ui-serif","ui-sans-serif","ui-monospace","ui-rounded","math","emoji","fangsong"]),e(Gn,"ATTRIBUTE_NAMES",Ii.concat("x","y","dx","dy","font-family","font-style","font-weight","font-size","letter-spacing","text-decoration","text-anchor")),_i(Gn,[class extends Ne{_toSVG(){const t=this._getSVGLeftTopOffsets(),e=this._getSVGTextAndBg(t.textTop,t.textLeft);return this._wrapSVGTextAndBg(e)}toSVG(t){const e=this._createBaseSVGMarkup(this._toSVG(),{reviver:t,noStyle:!0,withShadow:!0}),s=this.path;return s?e+s._createBaseSVGMarkup(s._toSVG(),{reviver:t,withShadow:!0,additionalTransform:Xt(this.calcOwnMatrix())}):e}_getSVGLeftTopOffsets(){return{textLeft:-this.width/2,textTop:-this.height/2,lineTop:this.getHeightOfLine(0)}}_wrapSVGTextAndBg(t){let{textBgRects:e,textSpans:s}=t;const i=this.getSvgTextDecoration(this);return[e.join(""),'\t\t",s.join(""),"\n"]}_getSVGTextAndBg(t,e){const s=[],i=[];let r,n=t;this.backgroundColor&&i.push(...Wn(this.backgroundColor,-this.width/2,-this.height/2,this.width,this.height));for(let t=0,o=this._textLines.length;t${Di(t)}`}_setSVGTextLineText(t,e,s,i){const r=this.getHeightOfLine(e),n=this.textAlign.includes(ss),o=this._textLines[e];let a,h,l,c,u,d="",g=0;i+=r*(1-this._fontSizeFraction)/this.lineHeight;for(let r=0,f=o.length-1;r<=f;r++)u=r===f||this.charSpacing||this.path,d+=o[r],l=this.__charBounds[e][r],0===g?(s+=l.kernedWidth-l.width,g+=l.width):g+=l.kernedWidth,n&&!u&&this._reSpaceAndTab.test(o[r])&&(u=!0),u||(a=a||this.getCompleteStyleDeclaration(e,r),h=this.getCompleteStyleDeclaration(e,r+1),u=Fi(a,h,!0)),u&&(c=this._getStyleDeclaration(e,r),t.push(this._createTextCharSpan(d,c,s,i,l)),d="",a=h,"rtl"===this.direction?s-=g:s+=g,g=0)}_setSVGTextLineBg(t,e,s,i){const r=this._textLines[e],n=this.getHeightOfLine(e)/this.lineHeight;let o,a=0,h=0,l=this.getValueOfPropertyAt(e,0,"textBackgroundColor");for(let c=0;ct[e.replace("-","")]).join(" ")}}]),J.setClass(Gn),J.setSVGClass(Gn);class zn{constructor(t){e(this,"target",void 0),e(this,"__mouseDownInPlace",!1),e(this,"__dragStartFired",!1),e(this,"__isDraggingOver",!1),e(this,"__dragStartSelection",void 0),e(this,"__dragImageDisposer",void 0),e(this,"_dispose",void 0),this.target=t;const s=[this.target.on("dragenter",this.dragEnterHandler.bind(this)),this.target.on("dragover",this.dragOverHandler.bind(this)),this.target.on("dragleave",this.dragLeaveHandler.bind(this)),this.target.on("dragend",this.dragEndHandler.bind(this)),this.target.on("drop",this.dropHandler.bind(this))];this._dispose=()=>{s.forEach(t=>t()),this._dispose=void 0}}isPointerOverSelection(t){const e=this.target,s=e.getSelectionStartFromPointer(t);return e.isEditing&&s>=e.selectionStart&&s<=e.selectionEnd&&e.selectionStart{_.remove()},Ht(t.target||this.target.hiddenTextarea).body.appendChild(_),null===(s=t.dataTransfer)||void 0===s||s.setDragImage(_,p.x,p.y)}onDragStart(t){this.__dragStartFired=!0;const e=this.target,s=this.isActive();if(s&&t.dataTransfer){const s=this.__dragStartSelection={selectionStart:e.selectionStart,selectionEnd:e.selectionEnd},i=e._text.slice(s.selectionStart,s.selectionEnd).join(""),r={text:e.text,value:i,...s};t.dataTransfer.setData("text/plain",i),t.dataTransfer.setData("application/fabric",JSON.stringify({value:i,styles:e.getSelectionStyles(s.selectionStart,s.selectionEnd,!0)})),t.dataTransfer.effectAllowed="copyMove",this.setDragImage(t,r)}return e.abortCursorAnimation(),s}canDrop(t){if(this.target.editable&&!this.target.getActiveControl()&&!t.defaultPrevented){if(this.isActive()&&this.__dragStartSelection){const e=this.target.getSelectionStartFromPointer(t),s=this.__dragStartSelection;return es.selectionEnd}return!0}return!1}targetCanDrop(t){return this.target.canDrop(t)}dragEnterHandler(t){let{e:e}=t;const s=this.targetCanDrop(e);!this.__isDraggingOver&&s&&(this.__isDraggingOver=!0)}dragOverHandler(t){const{e:e}=t,s=this.targetCanDrop(e);!this.__isDraggingOver&&s?this.__isDraggingOver=!0:this.__isDraggingOver&&!s&&(this.__isDraggingOver=!1),this.__isDraggingOver&&(e.preventDefault(),t.canDrop=!0,t.dropTarget=this.target)}dragLeaveHandler(){(this.__isDraggingOver||this.isActive())&&(this.__isDraggingOver=!1)}dropHandler(t){var e;const{e:s}=t,i=s.defaultPrevented;this.__isDraggingOver=!1,s.preventDefault();let r=null===(e=s.dataTransfer)||void 0===e?void 0:e.getData("text/plain");if(r&&!i){const e=this.target,i=e.canvas;let n=e.getSelectionStartFromPointer(s);const{styles:o}=s.dataTransfer.types.includes("application/fabric")?JSON.parse(s.dataTransfer.getData("application/fabric")):{},a=r[Math.max(0,r.length-1)],h=0;if(this.__dragStartSelection){const t=this.__dragStartSelection.selectionStart,s=this.__dragStartSelection.selectionEnd;n>t&&n<=s?n=t:n>s&&(n-=s-t),e.removeChars(t,s),delete this.__dragStartSelection}e._reNewline.test(a)&&(e._reNewline.test(e._text[n])||n===e._text.length)&&(r=r.trimEnd()),t.didDrop=!0,t.dropTarget=e,e.insertChars(r,o,n),i.setActiveObject(e),e.enterEditing(s),e.selectionStart=Math.min(n+h,e._text.length),e.selectionEnd=Math.min(e.selectionStart+r.length,e._text.length),e.hiddenTextarea.value=e.text,e._updateTextarea(),e.hiddenTextarea.focus(),e.fire(X,{index:n+h,action:"drop"}),i.fire("text:changed",{target:e}),i.contextTopDirty=!0,i.requestRenderAll()}}dragEndHandler(t){let{e:e}=t;if(this.isActive()&&this.__dragStartFired&&this.__dragStartSelection){var s;const t=this.target,i=this.target.canvas,{selectionStart:r,selectionEnd:n}=this.__dragStartSelection,o=(null===(s=e.dataTransfer)||void 0===s?void 0:s.dropEffect)||P;o===P?(t.selectionStart=r,t.selectionEnd=n,t._updateTextarea(),t.hiddenTextarea.focus()):(t.clearContextTop(),"move"===o&&(t.removeChars(r,n),t.selectionStart=t.selectionEnd=r,t.hiddenTextarea&&(t.hiddenTextarea.value=t.text),t._updateTextarea(),t.fire(X,{index:r,action:"dragend"}),i.fire("text:changed",{target:t}),i.requestRenderAll()),t.exitEditing())}this.__dragImageDisposer&&this.__dragImageDisposer(),delete this.__dragImageDisposer,delete this.__dragStartSelection,this.__isDraggingOver=!1}dispose(){this._dispose&&this._dispose()}}const Hn=/[ \n\.,;!\?\-]/;class Nn extends Gn{constructor(){super(...arguments),e(this,"_currentCursorOpacity",1)}initBehavior(){this._tick=this._tick.bind(this),this._onTickComplete=this._onTickComplete.bind(this),this.updateSelectionOnMouseMove=this.updateSelectionOnMouseMove.bind(this)}onDeselect(t){return this.isEditing&&this.exitEditing(),this.selected=!1,super.onDeselect(t)}_animateCursor(t){let{toValue:e,duration:s,delay:i,onComplete:r}=t;return Is({startValue:this._currentCursorOpacity,endValue:e,duration:s,delay:i,onComplete:r,abort:()=>!this.canvas||this.selectionStart!==this.selectionEnd,onChange:t=>{this._currentCursorOpacity=t,this.renderCursorOrSelection()}})}_tick(t){this._currentTickState=this._animateCursor({toValue:0,duration:this.cursorDuration/2,delay:Math.max(t||0,100),onComplete:this._onTickComplete})}_onTickComplete(){var t;null===(t=this._currentTickCompleteState)||void 0===t||t.abort(),this._currentTickCompleteState=this._animateCursor({toValue:1,duration:this.cursorDuration,onComplete:this._tick})}initDelayedCursor(t){this.abortCursorAnimation(),this._tick(t?0:this.cursorDelay)}abortCursorAnimation(){let t=!1;[this._currentTickState,this._currentTickCompleteState].forEach(e=>{e&&!e.isDone()&&(t=!0,e.abort())}),this._currentCursorOpacity=1,t&&this.clearContextTop()}restartCursorIfNeeded(){[this._currentTickState,this._currentTickCompleteState].some(t=>!t||t.isDone())&&this.initDelayedCursor()}selectAll(){return this.selectionStart=0,this.selectionEnd=this._text.length,this._fireSelectionChanged(),this._updateTextarea(),this}cmdAll(){this.selectAll(),this.renderCursorOrSelection()}getSelectedText(){return this._text.slice(this.selectionStart,this.selectionEnd).join("")}findWordBoundaryLeft(t){let e=0,s=t-1;if(this._reSpace.test(this._text[s]))for(;this._reSpace.test(this._text[s]);)e++,s--;for(;/\S/.test(this._text[s])&&s>-1;)e++,s--;return t-e}findWordBoundaryRight(t){let e=0,s=t;if(this._reSpace.test(this._text[s]))for(;this._reSpace.test(this._text[s]);)e++,s++;for(;/\S/.test(this._text[s])&&s-1;)e++,s--;return t-e}findLineBoundaryRight(t){let e=0,s=t;for(;!/\n/.test(this._text[s])&&s0&&this._reSpace.test(s[t])&&(-1===e||!E.test(s[t-1]))?t-1:t,r=s[i];for(;i>0&&ithis.__selectionStartOnMouseDown?(this.selectionStart=this.__selectionStartOnMouseDown,this.selectionEnd=s):(this.selectionStart=s,this.selectionEnd=this.__selectionStartOnMouseDown),this.selectionStart===i&&this.selectionEnd===r||(this._fireSelectionChanged(),this._updateTextarea(),this.renderCursorOrSelection()))}_setEditingProps(){this.hoverCursor="text",this.canvas&&(this.canvas.defaultCursor=this.canvas.moveCursor="text"),this.borderColor=this.editingBorderColor,this.hasControls=this.selectable=!1,this.lockMovementX=this.lockMovementY=!0}fromStringToGraphemeSelection(t,e,s){const i=s.slice(0,t),r=this.graphemeSplit(i).length;if(t===e)return{selectionStart:r,selectionEnd:r};const n=s.slice(t,e);return{selectionStart:r,selectionEnd:r+this.graphemeSplit(n).length}}fromGraphemeToStringSelection(t,e,s){const i=s.slice(0,t).join("").length;if(t===e)return{selectionStart:i,selectionEnd:i};return{selectionStart:i,selectionEnd:i+s.slice(t,e).join("").length}}_updateTextarea(){if(this.cursorOffsetCache={},this.hiddenTextarea){if(!this.inCompositionMode){const t=this.fromGraphemeToStringSelection(this.selectionStart,this.selectionEnd,this._text);this.hiddenTextarea.selectionStart=t.selectionStart,this.hiddenTextarea.selectionEnd=t.selectionEnd}this.updateTextareaPosition()}}updateFromTextArea(){if(!this.hiddenTextarea)return;this.cursorOffsetCache={};const t=this.hiddenTextarea;this.text=t.value,this.set("dirty",!0),this.initDimensions(),this.setCoords();const e=this.fromStringToGraphemeSelection(t.selectionStart,t.selectionEnd,t.value);this.selectionEnd=this.selectionStart=e.selectionEnd,this.inCompositionMode||(this.selectionStart=e.selectionStart),this.updateTextareaPosition()}updateTextareaPosition(){if(this.selectionStart===this.selectionEnd){const t=this._calcTextareaPosition();this.hiddenTextarea.style.left=t.left,this.hiddenTextarea.style.top=t.top}}_calcTextareaPosition(){if(!this.canvas)return{left:"1px",top:"1px"};const t=this.inCompositionMode?this.compositionStart:this.selectionStart,e=this._getCursorBoundaries(t),s=this.get2DCursorLocation(t),i=s.lineIndex,r=s.charIndex,n=this.getValueOfPropertyAt(i,r,"fontSize")*this.lineHeight,o=e.leftOffset,a=this.getCanvasRetinaScaling(),h=this.canvas.upperCanvasEl,l=h.width/a,c=h.height/a,u=l-n,d=c-n,g=new it(e.left+o,e.top+e.topOffset+n).transform(this.calcTransformMatrix()).transform(this.canvas.viewportTransform).multiply(new it(h.clientWidth/l,h.clientHeight/c));return g.x<0&&(g.x=0),g.x>u&&(g.x=u),g.y<0&&(g.y=0),g.y>d&&(g.y=d),g.x+=this.canvas._offset.left,g.y+=this.canvas._offset.top,{left:`${g.x}px`,top:`${g.y}px`,fontSize:`${n}px`,charHeight:n}}_saveEditingProps(){this._savedProps={hasControls:this.hasControls,borderColor:this.borderColor,lockMovementX:this.lockMovementX,lockMovementY:this.lockMovementY,hoverCursor:this.hoverCursor,selectable:this.selectable,defaultCursor:this.canvas&&this.canvas.defaultCursor,moveCursor:this.canvas&&this.canvas.moveCursor}}_restoreEditingProps(){this._savedProps&&(this.hoverCursor=this._savedProps.hoverCursor,this.hasControls=this._savedProps.hasControls,this.borderColor=this._savedProps.borderColor,this.selectable=this._savedProps.selectable,this.lockMovementX=this._savedProps.lockMovementX,this.lockMovementY=this._savedProps.lockMovementY,this.canvas&&(this.canvas.defaultCursor=this._savedProps.defaultCursor||this.canvas.defaultCursor,this.canvas.moveCursor=this._savedProps.moveCursor||this.canvas.moveCursor),delete this._savedProps)}exitEditingImpl(){const t=this.hiddenTextarea;this.selected=!1,this.isEditing=!1,t&&(t.blur&&t.blur(),t.parentNode&&t.parentNode.removeChild(t)),this.hiddenTextarea=null,this.abortCursorAnimation(),this.selectionStart!==this.selectionEnd&&this.clearContextTop(),this.selectionEnd=this.selectionStart,this._restoreEditingProps(),this._forceClearCache&&(this.initDimensions(),this.setCoords())}exitEditing(){const t=this._textBeforeEdit!==this.text;return this.exitEditingImpl(),this.fire("editing:exited"),t&&this.fire(U),this.canvas&&(this.canvas.fire("text:editing:exited",{target:this}),t&&this.canvas.fire("object:modified",{target:this})),this}_removeExtraneousStyles(){for(const t in this.styles)this._textLines[t]||delete this.styles[t]}removeStyleFromTo(t,e){const{lineIndex:s,charIndex:i}=this.get2DCursorLocation(t,!0),{lineIndex:r,charIndex:n}=this.get2DCursorLocation(e,!0);if(s!==r){if(this.styles[s])for(let t=i;t=n&&(t[s-e]=t[i],delete t[i])}}}shiftLineStyles(t,e){const s=Object.assign({},this.styles);for(const i in this.styles){const r=parseInt(i,10);r>t&&(this.styles[r+e]=s[r],s[r-e]||delete this.styles[r])}}insertNewlineStyleObject(t,e,s,i){const r={},n=this._unwrappedTextLines[t].length,o=n===e;let a=!1;s||(s=1),this.shiftLineStyles(t,s);const h=this.styles[t]?this.styles[t][0===e?e:e-1]:void 0;for(const s in this.styles[t]){const i=parseInt(s,10);i>=e&&(a=!0,r[i-e]=this.styles[t][s],o&&0===e||delete this.styles[t][s])}let l=!1;for(a&&!o&&(this.styles[t+s]=r,l=!0),(l||n>e)&&s--;s>0;)i&&i[s-1]?this.styles[t+s]={0:{...i[s-1]}}:h?this.styles[t+s]={0:{...h}}:delete this.styles[t+s],s--;this._forceClearCache=!0}insertCharStyleObject(t,e,s,i){this.styles||(this.styles={});const r=this.styles[t],n=r?{...r}:{};s||(s=1);for(const t in n){const i=parseInt(t,10);i>=e&&(r[i+s]=n[i],n[i-s]||delete r[i])}if(this._forceClearCache=!0,i){for(;s--;)Object.keys(i[s]).length&&(this.styles[t]||(this.styles[t]={}),this.styles[t][e+s]={...i[s]});return}if(!r)return;const o=r[e?e-1:1];for(;o&&s--;)this.styles[t][e+s]={...o}}insertNewStyleBlock(t,e,s){const i=this.get2DCursorLocation(e,!0),r=[0];let n,o=0;for(let e=0;e0&&(this.insertCharStyleObject(i.lineIndex,i.charIndex,r[0],s),s=s&&s.slice(r[0]+1)),o&&this.insertNewlineStyleObject(i.lineIndex,i.charIndex+r[0],o),n=1;n0?this.insertCharStyleObject(i.lineIndex+n,0,r[n],s):s&&this.styles[i.lineIndex+n]&&s[0]&&(this.styles[i.lineIndex+n][0]=s[0]),s=s&&s.slice(r[n]+1);r[n]>0&&this.insertCharStyleObject(i.lineIndex+n,0,r[n],s)}removeChars(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:t+1;this.removeStyleFromTo(t,e),this._text.splice(t,e-t),this.text=this._text.join(""),this.set("dirty",!0),this.initDimensions(),this.setCoords(),this._removeExtraneousStyles()}insertChars(t,e,s){let i=arguments.length>3&&void 0!==arguments[3]?arguments[3]:s;i>s&&this.removeStyleFromTo(s,i);const r=this.graphemeSplit(t);this.insertNewStyleBlock(r,s,e),this._text=[...this._text.slice(0,s),...r,...this._text.slice(i)],this.text=this._text.join(""),this.set("dirty",!0),this.initDimensions(),this.setCoords(),this._removeExtraneousStyles()}setSelectionStartEndWithShift(t,e,s){s<=t?(e===t?this._selectionDirection=O:this._selectionDirection===M&&(this._selectionDirection=O,this.selectionEnd=t),this.selectionStart=s):s>t&&s{let[s,i]=t;return e.setAttribute(s,i)});const{top:s,left:i,fontSize:r}=this._calcTextareaPosition();e.style.cssText=`position: absolute; top: ${s}; left: ${i}; z-index: -999; opacity: 0; width: 1px; height: 1px; font-size: 1px; padding-top: ${r};`,(this.hiddenTextareaContainer||t.body).appendChild(e),Object.entries({blur:"blur",keydown:"onKeyDown",keyup:"onKeyUp",input:"onInput",copy:"copy",cut:"copy",paste:"paste",compositionstart:"onCompositionStart",compositionupdate:"onCompositionUpdate",compositionend:"onCompositionEnd"}).map(t=>{let[s,i]=t;return e.addEventListener(s,this[i].bind(this))}),this.hiddenTextarea=e}blur(){this.abortCursorAnimation()}onKeyDown(t){if(!this.isEditing)return;const e="rtl"===this.direction?this.keysMapRtl:this.keysMap;if(t.keyCode in e)this[e[t.keyCode]](t);else{if(!(t.keyCode in this.ctrlKeysMapDown)||!t.ctrlKey&&!t.metaKey)return;this[this.ctrlKeysMapDown[t.keyCode]](t)}t.stopImmediatePropagation(),t.preventDefault(),t.keyCode>=33&&t.keyCode<=40?(this.inCompositionMode=!1,this.clearContextTop(),this.renderCursorOrSelection()):this.canvas&&this.canvas.requestRenderAll()}onKeyUp(t){!this.isEditing||this._copyDone||this.inCompositionMode?this._copyDone=!1:t.keyCode in this.ctrlKeysMapUp&&(t.ctrlKey||t.metaKey)&&(this[this.ctrlKeysMapUp[t.keyCode]](t),t.stopImmediatePropagation(),t.preventDefault(),this.canvas&&this.canvas.requestRenderAll())}onInput(t){const e=this.fromPaste,{value:s,selectionStart:r,selectionEnd:n}=this.hiddenTextarea;if(this.fromPaste=!1,t&&t.stopPropagation(),!this.isEditing)return;const o=()=>{this.updateFromTextArea(),this.fire(X),this.canvas&&(this.canvas.fire("text:changed",{target:this}),this.canvas.requestRenderAll())};if(""===this.hiddenTextarea.value)return this.styles={},void o();const a=this._splitTextIntoLines(s).graphemeText,h=this._text.length,l=a.length,c=this.selectionStart,d=this.selectionEnd,g=c!==d;let f,p,m,v,y=l-h;const _=this.fromStringToGraphemeSelection(r,n,s),x=c>_.selectionStart;g?(p=this._text.slice(c,d),y+=d-c):lf[0])),g?(m=c,v=d):x?(m=d-p.length,v=d):(m=d,v=d+p.length),this.removeStyleFromTo(m,v)),C.length){const{copyPasteData:t}=u();e&&C.join("")===t.copiedText&&!i.disableStyleCopyPaste&&(f=t.copiedTextStyle),this.insertNewStyleBlock(C,c,f)}o()}onCompositionStart(){this.inCompositionMode=!0}onCompositionEnd(){this.inCompositionMode=!1}onCompositionUpdate(t){let{target:e}=t;const{selectionStart:s,selectionEnd:i}=e;this.compositionStart=s,this.compositionEnd=i,this.updateTextareaPosition()}copy(){if(this.selectionStart===this.selectionEnd)return;const{copyPasteData:t}=u();t.copiedText=this.getSelectedText(),i.disableStyleCopyPaste?t.copiedTextStyle=void 0:t.copiedTextStyle=this.getSelectionStyles(this.selectionStart,this.selectionEnd,!0),this._copyDone=!0}paste(){this.fromPaste=!0}_getWidthBeforeCursor(t,e){let s,i=this._getLineLeftOffset(t);return e>0&&(s=this.__charBounds[t][e-1],i+=s.left+s.width),i}getDownCursorOffset(t,e){const s=this._getSelectionForOffset(t,e),i=this.get2DCursorLocation(s),r=i.lineIndex;if(r===this._textLines.length-1||t.metaKey||34===t.keyCode)return this._text.length-s;const n=i.charIndex,o=this._getWidthBeforeCursor(r,n),a=this._getIndexOnLine(r+1,o);return this._textLines[r].slice(n).length+a+1+this.missingNewlineOffset(r)}_getSelectionForOffset(t,e){return t.shiftKey&&this.selectionStart!==this.selectionEnd&&e?this.selectionEnd:this.selectionStart}getUpCursorOffset(t,e){const s=this._getSelectionForOffset(t,e),i=this.get2DCursorLocation(s),r=i.lineIndex;if(0===r||t.metaKey||33===t.keyCode)return-s;const n=i.charIndex,o=this._getWidthBeforeCursor(r,n),a=this._getIndexOnLine(r-1,o),h=this._textLines[r].slice(0,n),l=this.missingNewlineOffset(r-1);return-this._textLines[r-1].length+a-h.length+(1-l)}_getIndexOnLine(t,e){const s=this._textLines[t];let i,r,n=this._getLineLeftOffset(t),o=0;for(let a=0,h=s.length;ae){r=!0;const t=n-i,s=n,h=Math.abs(t-e);o=Math.abs(s-e)=this._text.length&&this.selectionEnd>=this._text.length||this._moveCursorUpOrDown("Down",t)}moveCursorUp(t){0===this.selectionStart&&0===this.selectionEnd||this._moveCursorUpOrDown("Up",t)}_moveCursorUpOrDown(t,e){const s=this[`get${t}CursorOffset`](e,this._selectionDirection===M);if(e.shiftKey?this.moveCursorWithShift(s):this.moveCursorWithoutShift(s),0!==s){const t=this.text.length;this.selectionStart=xs(0,this.selectionStart,t),this.selectionEnd=xs(0,this.selectionEnd,t),this.abortCursorAnimation(),this.initDelayedCursor(),this._fireSelectionChanged(),this._updateTextarea()}}moveCursorWithShift(t){const e=this._selectionDirection===O?this.selectionStart+t:this.selectionEnd+t;return this.setSelectionStartEndWithShift(this.selectionStart,this.selectionEnd,e),0!==t}moveCursorWithoutShift(t){return t<0?(this.selectionStart+=t,this.selectionEnd=this.selectionStart):(this.selectionEnd+=t,this.selectionStart=this.selectionEnd),0!==t}moveCursorLeft(t){0===this.selectionStart&&0===this.selectionEnd||this._moveCursorLeftOrRight("Left",t)}_move(t,e,s){let i;if(t.altKey)i=this[`findWordBoundary${s}`](this[e]);else{if(!t.metaKey&&35!==t.keyCode&&36!==t.keyCode)return this[e]+="Left"===s?-1:1,!0;i=this[`findLineBoundary${s}`](this[e])}return void 0!==i&&this[e]!==i&&(this[e]=i,!0)}_moveLeft(t,e){return this._move(t,e,"Left")}_moveRight(t,e){return this._move(t,e,"Right")}moveCursorLeftWithoutShift(t){let e=!0;return this._selectionDirection=O,this.selectionEnd===this.selectionStart&&0!==this.selectionStart&&(e=this._moveLeft(t,"selectionStart")),this.selectionEnd=this.selectionStart,e}moveCursorLeftWithShift(t){return this._selectionDirection===M&&this.selectionStart!==this.selectionEnd?this._moveLeft(t,"selectionEnd"):0!==this.selectionStart?(this._selectionDirection=O,this._moveLeft(t,"selectionStart")):void 0}moveCursorRight(t){this.selectionStart>=this._text.length&&this.selectionEnd>=this._text.length||this._moveCursorLeftOrRight("Right",t)}_moveCursorLeftOrRight(t,e){const s=`moveCursor${t}${e.shiftKey?"WithShift":"WithoutShift"}`;this._currentCursorOpacity=1,this[s](e)&&(this.abortCursorAnimation(),this.initDelayedCursor(),this._fireSelectionChanged(),this._updateTextarea())}moveCursorRightWithShift(t){return this._selectionDirection===O&&this.selectionStart!==this.selectionEnd?this._moveRight(t,"selectionStart"):this.selectionEnd!==this._text.length?(this._selectionDirection=M,this._moveRight(t,"selectionEnd")):void 0}moveCursorRightWithoutShift(t){let e=!0;return this._selectionDirection=M,this.selectionStart===this.selectionEnd?(e=this._moveRight(t,"selectionStart"),this.selectionEnd=this.selectionStart):this.selectionStart=this.selectionEnd,e}}const qn=t=>!!t.button;class Kn extends Un{constructor(){super(...arguments),e(this,"draggableTextDelegate",void 0)}initBehavior(){this.on("mousedown",this._mouseDownHandler),this.on("mouseup",this.mouseUpHandler),this.on("mousedblclick",this.doubleClickHandler),this.on("mousetripleclick",this.tripleClickHandler),this.draggableTextDelegate=new zn(this),super.initBehavior()}shouldStartDragging(){return this.draggableTextDelegate.isActive()}onDragStart(t){return this.draggableTextDelegate.onDragStart(t)}canDrop(t){return this.draggableTextDelegate.canDrop(t)}doubleClickHandler(t){this.isEditing&&(this.selectWord(this.getSelectionStartFromPointer(t.e)),this.renderCursorOrSelection())}tripleClickHandler(t){this.isEditing&&(this.selectLine(this.getSelectionStartFromPointer(t.e)),this.renderCursorOrSelection())}_mouseDownHandler(t){let{e:e,alreadySelected:s}=t;this.canvas&&this.editable&&!qn(e)&&!this.getActiveControl()&&(this.draggableTextDelegate.start(e)||(this.canvas.textEditingManager.register(this),s&&(this.inCompositionMode=!1,this.setCursorByClick(e)),this.isEditing&&(this.__selectionStartOnMouseDown=this.selectionStart,this.selectionStart===this.selectionEnd&&this.abortCursorAnimation(),this.renderCursorOrSelection()),this.selected||(this.selected=s||this.isEditing)))}mouseUpHandler(t){let{e:e,transform:s}=t;const i=this.draggableTextDelegate.end(e);if(this.canvas){this.canvas.textEditingManager.unregister(this);const t=this.canvas._activeObject;if(t&&t!==this)return}!this.editable||this.group&&!this.group.interactive||s&&s.actionPerformed||qn(e)||i||this.selected&&!this.getActiveControl()&&(this.enterEditing(e),this.selectionStart===this.selectionEnd?this.initDelayedCursor(!0):this.renderCursorOrSelection())}setCursorByClick(t){const e=this.getSelectionStartFromPointer(t),s=this.selectionStart,i=this.selectionEnd;t.shiftKey?this.setSelectionStartEndWithShift(s,i,e):(this.selectionStart=e,this.selectionEnd=e),this.isEditing&&(this._fireSelectionChanged(),this._updateTextarea())}getSelectionStartFromPointer(t){const e=this.canvas.getScenePoint(t).transform(Ct(this.calcTransformMatrix())).add(new it(-this._getLeftOffset(),-this._getTopOffset()));let s=0,i=0,r=0;for(let t=0;t0&&(i+=this._textLines[t-1].length+this.missingNewlineOffset(t-1));let n=Math.abs(this._getLineLeftOffset(r));const o=this._textLines[r].length,a=this.__charBounds[r];for(let t=0;t{const s=e.getRetinaScaling();t.setTransform(s,0,0,s,0,0);const i=e.viewportTransform;t.transform(i[0],i[1],i[2],i[3],i[4],i[5])},io={selectionStart:0,selectionEnd:0,selectionColor:"rgba(17,119,255,0.3)",isEditing:!1,editable:!0,editingBorderColor:"rgba(102,153,255,0.25)",cursorWidth:2,cursorColor:"",cursorDelay:1e3,cursorDuration:600,caching:!0,hiddenTextareaContainer:null,keysMap:{9:eo,27:eo,33:Jn,34:Qn,35:to,36:Zn,37:Zn,38:Jn,39:to,40:Qn},keysMapRtl:{9:eo,27:eo,33:Jn,34:Qn,35:Zn,36:to,37:to,38:Jn,39:Zn,40:Qn},ctrlKeysMapDown:{65:"cmdAll"},ctrlKeysMapUp:{67:"copy",88:"cut"},_selectionDirection:null,_reSpace:/\s|\r?\n/,inCompositionMode:!1};class ro extends Kn{static getDefaults(){return{...super.getDefaults(),...ro.ownDefaults}}get type(){const t=super.type;return"itext"===t?"i-text":t}constructor(t,e){super(t,{...ro.ownDefaults,...e}),this.initBehavior()}_set(t,e){return this.isEditing&&this._savedProps&&t in this._savedProps?(this._savedProps[t]=e,this):("canvas"===t&&(this.canvas instanceof ln&&this.canvas.textEditingManager.remove(this),e instanceof ln&&e.textEditingManager.add(this)),super._set(t,e))}setSelectionStart(t){t=Math.max(t,0),this._updateAndFire("selectionStart",t)}setSelectionEnd(t){t=Math.min(t,this.text.length),this._updateAndFire("selectionEnd",t)}_updateAndFire(t,e){this[t]!==e&&(this._fireSelectionChanged(),this[t]=e),this._updateTextarea()}_fireSelectionChanged(){this.fire("selection:changed"),this.canvas&&this.canvas.fire("text:selection:changed",{target:this})}initDimensions(){this.isEditing&&this.initDelayedCursor(),super.initDimensions()}getSelectionStyles(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.selectionStart||0,e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:this.selectionEnd,s=arguments.length>2?arguments[2]:void 0;return super.getSelectionStyles(t,e,s)}setSelectionStyles(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:this.selectionStart||0,s=arguments.length>2&&void 0!==arguments[2]?arguments[2]:this.selectionEnd;return super.setSelectionStyles(t,e,s)}get2DCursorLocation(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.selectionStart,e=arguments.length>1?arguments[1]:void 0;return super.get2DCursorLocation(t,e)}render(t){super.render(t),this.cursorOffsetCache={},this.renderCursorOrSelection()}toCanvasElement(t){const e=this.isEditing;this.isEditing=!1;const s=super.toCanvasElement(t);return this.isEditing=e,s}renderCursorOrSelection(){if(!this.isEditing||!this.canvas)return;const t=this.clearContextTop(!0);if(!t)return;const e=this._getCursorBoundaries(),s=this.findAncestorsWithClipPath(),i=s.length>0;let r,n=t;if(i){r=ft(t.canvas),n=r.getContext("2d"),so(n,this.canvas);const e=this.calcTransformMatrix();n.transform(e[0],e[1],e[2],e[3],e[4],e[5])}if(this.selectionStart!==this.selectionEnd||this.inCompositionMode?this.renderSelection(n,e):this.renderCursor(n,e),i)for(const e of s){const s=e.clipPath,i=ft(t.canvas),r=i.getContext("2d");if(so(r,this.canvas),!s.absolutePositioned){const t=e.calcTransformMatrix();r.transform(t[0],t[1],t[2],t[3],t[4],t[5])}s.transform(r),s.drawObject(r,!0,{}),this.drawClipPathOnCache(n,s,i)}i&&(t.setTransform(1,0,0,1,0,0),t.drawImage(r,0,0)),this.canvas.contextTopDirty=!0,t.restore()}findAncestorsWithClipPath(){const t=[];let e=this;for(;e;)e.clipPath&&t.push(e),e=e.parent;return t}_getCursorBoundaries(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.selectionStart,e=arguments.length>1?arguments[1]:void 0;const s=this._getLeftOffset(),i=this._getTopOffset(),r=this._getCursorBoundariesOffsets(t,e);return{left:s,top:i,leftOffset:r.left,topOffset:r.top}}_getCursorBoundariesOffsets(t,e){return e?this.__getCursorBoundariesOffsets(t):this.cursorOffsetCache&&"top"in this.cursorOffsetCache?this.cursorOffsetCache:this.cursorOffsetCache=this.__getCursorBoundariesOffsets(t)}__getCursorBoundariesOffsets(t){let e=0,s=0;const{charIndex:i,lineIndex:r}=this.get2DCursorLocation(t);for(let t=0;t0?s:0)};return"rtl"===this.direction&&(this.textAlign===M||this.textAlign===ss||this.textAlign===rs?a.left*=-1:this.textAlign===O||this.textAlign===is?a.left=n-(s>0?s:0):this.textAlign!==T&&this.textAlign!==ns||(a.left=n-(s>0?s:0))),a}renderCursorAt(t){this._renderCursor(this.canvas.contextTop,this._getCursorBoundaries(t,!0),t)}renderCursor(t,e){this._renderCursor(t,e,this.selectionStart)}getCursorRenderingData(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.selectionStart,e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:this._getCursorBoundaries(t);const s=this.get2DCursorLocation(t),i=s.lineIndex,r=s.charIndex>0?s.charIndex-1:0,n=this.getValueOfPropertyAt(i,r,"fontSize"),o=this.getObjectScaling().x*this.canvas.getZoom(),a=this.cursorWidth/o,h=this.getValueOfPropertyAt(i,r,"deltaY"),l=e.topOffset+(1-this._fontSizeFraction)*this.getHeightOfLine(i)/this.lineHeight-n*(1-this._fontSizeFraction);return{color:this.cursorColor||this.getValueOfPropertyAt(i,r,"fill"),opacity:this._currentCursorOpacity,left:e.left+e.leftOffset-a/2,top:l+e.top+h,width:a,height:n}}_renderCursor(t,e,s){const{color:i,opacity:r,left:n,top:o,width:a,height:h}=this.getCursorRenderingData(s,e);t.fillStyle=i,t.globalAlpha=r,t.fillRect(n,o,a,h)}renderSelection(t,e){const s={selectionStart:this.inCompositionMode?this.hiddenTextarea.selectionStart:this.selectionStart,selectionEnd:this.inCompositionMode?this.hiddenTextarea.selectionEnd:this.selectionEnd};this._renderSelection(t,s,e)}renderDragSourceEffect(){const t=this.draggableTextDelegate.getDragStartSelection();this._renderSelection(this.canvas.contextTop,t,this._getCursorBoundaries(t.selectionStart,!0))}renderDropTargetEffect(t){const e=this.getSelectionStartFromPointer(t);this.renderCursorAt(e)}_renderSelection(t,e,s){const i=e.selectionStart,r=e.selectionEnd,n=this.textAlign.includes(ss),o=this.get2DCursorLocation(i),a=this.get2DCursorLocation(r),h=o.lineIndex,l=a.lineIndex,c=o.charIndex<0?0:o.charIndex,u=a.charIndex<0?0:a.charIndex;for(let e=h;e<=l;e++){const i=this._getLineLeftOffset(e)||0;let r=this.getHeightOfLine(e),o=0,a=0,d=0;if(e===h&&(a=this.__charBounds[h][c].left),e>=h&&e1)&&(r/=this.lineHeight);let g=s.left+i+a,f=r,p=0;const m=d-a;this.inCompositionMode?(t.fillStyle=this.compositionColor||"black",f=1,p=r):t.fillStyle=this.selectionColor,"rtl"===this.direction&&(this.textAlign===M||this.textAlign===ss||this.textAlign===rs?g=this.width-g-m:this.textAlign===O||this.textAlign===is?g=s.left+i-d:this.textAlign!==T&&this.textAlign!==ns||(g=s.left+i-d)),t.fillRect(g,s.top+s.topOffset+p,m,f),s.topOffset+=o}}getCurrentCharFontSize(){const t=this._getCurrentCharIndex();return this.getValueOfPropertyAt(t.l,t.c,"fontSize")}getCurrentCharColor(){const t=this._getCurrentCharIndex();return this.getValueOfPropertyAt(t.l,t.c,H)}_getCurrentCharIndex(){const t=this.get2DCursorLocation(this.selectionStart,!0),e=t.charIndex>0?t.charIndex-1:0;return{l:t.lineIndex,c:e}}dispose(){this.exitEditingImpl(),this.draggableTextDelegate.dispose(),super.dispose()}}e(ro,"ownDefaults",io),e(ro,"type","IText"),J.setClass(ro),J.setClass(ro,"i-text");class no extends ro{static getDefaults(){return{...super.getDefaults(),...no.ownDefaults}}constructor(t,e){super(t,{...no.ownDefaults,...e})}static createControls(){return{controls:vi()}}initDimensions(){this.initialized&&(this.isEditing&&this.initDelayedCursor(),this._clearCache(),this.dynamicMinWidth=0,this._styleMap=this._generateStyleMap(this._splitText()),this.dynamicMinWidth>this.width&&this._set("width",this.dynamicMinWidth),this.textAlign.includes(ss)&&this.enlargeSpaces(),this.height=this.calcTextHeight())}_generateStyleMap(t){let e=0,s=0,i=0;const r={};for(let n=0;n0?(s=0,i++,e++):!this.splitByGrapheme&&this._reSpaceAndTab.test(t.graphemeText[i])&&n>0&&(s++,i++),r[n]={line:e,offset:s},i+=t.graphemeLines[n].length,s+=t.graphemeLines[n].length;return r}styleHas(t,e){if(this._styleMap&&!this.isWrapping){const t=this._styleMap[e];t&&(e=t.line)}return super.styleHas(t,e)}isEmptyStyles(t){if(!this.styles)return!0;let e,s=0,i=t+1,r=!1;const n=this._styleMap[t],o=this._styleMap[t+1];n&&(t=n.line,s=n.offset),o&&(i=o.line,r=i===t,e=o.offset);const a=void 0===t?this.styles:{line:this.styles[t]};for(const t in a)for(const i in a[t]){const n=parseInt(i,10);if(n>=s&&(!r||n{let n=0;const o=e?this.graphemeSplit(t):this.wordSplit(t);return 0===o.length?[{word:[],width:0}]:o.map(t=>{const o=e?[t]:this.graphemeSplit(t),a=this._measureWord(o,r,n);return i=Math.max(a,i),n+=o.length+s.length,{word:o,width:a}})}),largestWordWidth:i}}_measureWord(t,e){let s,i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:0,r=0;for(let n=0,o=t.length;n3&&void 0!==arguments[3]?arguments[3]:0;const o=this._getWidthOfCharSpacing(),a=this.splitByGrapheme,h=[],l=a?"":" ";let c=0,u=[],d=0,g=0,f=!0;e-=n;const p=Math.max(e,i,this.dynamicMinWidth),m=r[t];let v;for(d=0,v=0;vp&&!f?(h.push(u),u=[],c=s,f=!0):c+=o,f||a||u.push(l),u=u.concat(e),g=a?0:this._measureWord([l],t,d),d++,f=!1}return v&&h.push(u),i+n>this.dynamicMinWidth&&(this.dynamicMinWidth=i-o+n),h}isEndOfWrapping(t){return!this._styleMap[t+1]||this._styleMap[t+1].line!==this._styleMap[t].line}missingNewlineOffset(t,e){return this.splitByGrapheme&&!e?this.isEndOfWrapping(t)?1:0:1}_splitTextIntoLines(t){const e=super._splitTextIntoLines(t),s=this._wrapText(e.lines,this.width),i=new Array(s.length);for(let t=0;t0&&void 0!==arguments[0]?arguments[0]:[];return super.toObject(["minWidth","splitByGrapheme",...t])}}e(no,"type","Textbox"),e(no,"textLayoutProperties",[...ro.textLayoutProperties,"width"]),e(no,"ownDefaults",{minWidth:20,dynamicMinWidth:2,lockScalingFlip:!0,noScaleCache:!1,_wordJoiners:/[ \t\r]/,splitByGrapheme:!1}),J.setClass(no);class oo extends fr{shouldPerformLayout(t){return!!t.target.clipPath&&super.shouldPerformLayout(t)}shouldLayoutClipPath(){return!1}calcLayoutResult(t,e){const{target:s}=t,{clipPath:i,group:r}=s;if(!i||!this.shouldPerformLayout(t))return;const{width:n,height:o}=re(gr(s,i)),a=new it(n,o);if(i.absolutePositioned){return{center:ue(i.getRelativeCenterPoint(),void 0,r?r.calcTransformMatrix():void 0),size:a}}{const r=i.getRelativeCenterPoint().transform(s.calcOwnMatrix(),!0);if(this.shouldPerformLayout(t)){const{center:s=new it,correction:i=new it}=this.calcBoundingBox(e,t)||{};return{center:s.add(r),correction:i.subtract(r),size:a}}return{center:s.getRelativeCenterPoint().add(r),size:a}}}}e(oo,"type","clip-path"),J.setClass(oo);class ao extends fr{getInitialSize(t,e){let{target:s}=t,{size:i}=e;return new it(s.width||i.x,s.height||i.y)}}e(ao,"type","fixed"),J.setClass(ao);class ho extends vr{subscribeTargets(t){const e=t.target;t.targets.reduce((t,e)=>(e.parent&&t.add(e.parent),t),new Set).forEach(t=>{t.layoutManager.subscribeTargets({target:t,targets:[e]})})}unsubscribeTargets(t){const e=t.target,s=e.getObjects();t.targets.reduce((t,e)=>(e.parent&&t.add(e.parent),t),new Set).forEach(t=>{!s.some(e=>e.parent===t)&&t.layoutManager.unsubscribeTargets({target:t,targets:[e]})})}}class lo extends _r{static getDefaults(){return{...super.getDefaults(),...lo.ownDefaults}}constructor(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[],e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};super(),Object.assign(this,lo.ownDefaults),this.setOptions(e);const{left:s,top:i,layoutManager:r}=e;this.groupInit(t,{left:s,top:i,layoutManager:null!=r?r:new ho})}_shouldSetNestedCoords(){return!0}__objectSelectionMonitor(){}multiSelectAdd(){for(var t=arguments.length,e=new Array(t),s=0;s{const e=this._objects.findIndex(e=>e.isInFrontOf(t)),s=-1===e?this.size():e;this.insertAt(s,t)})}canEnterGroup(t){return this.getObjects().some(e=>e.isDescendantOf(t)||t.isDescendantOf(e))?(r("error","ActiveSelection: circular object trees are not supported, this call has no effect"),!1):super.canEnterGroup(t)}enterGroup(t,e){t.parent&&t.parent===t.group?t.parent._exitGroup(t):t.group&&t.parent!==t.group&&t.group.remove(t),this._enterGroup(t,e)}exitGroup(t,e){this._exitGroup(t,e),t.parent&&t.parent._enterGroup(t,!0)}_onAfterObjectsChange(t,e){super._onAfterObjectsChange(t,e);const s=new Set;e.forEach(t=>{const{parent:e}=t;e&&s.add(e)}),t===ur?s.forEach(t=>{t._onAfterObjectsChange(cr,e)}):s.forEach(t=>{t._set("dirty",!0)})}onDeselect(){return this.removeAll(),!1}toString(){return`#`}shouldCache(){return!1}isOnACache(){return!1}_renderControls(t,e,s){t.save(),t.globalAlpha=this.isMoving?this.borderOpacityWhenMoving:1;const i={hasControls:!1,...s,forActiveSelection:!0};for(let e=0;e{t.applyTo(o)});const{imageData:a}=o;return a.width===s&&a.height===i||(r.width=a.width,r.height=a.height),n.putImageData(a,0,0),o}}class uo{constructor(){let{tileSize:t=i.textureSize}=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};e(this,"aPosition",new Float32Array([0,0,0,1,1,0,1,1])),e(this,"resources",{}),this.tileSize=t,this.setupGLContext(t,t),this.captureGPUInfo()}setupGLContext(t,e){this.dispose(),this.createWebGLCanvas(t,e)}createWebGLCanvas(t,e){const s=ft({width:t,height:e}),i=s.getContext("webgl",{alpha:!0,premultipliedAlpha:!1,depth:!1,stencil:!1,antialias:!1});i&&(i.clearColor(0,0,0,0),this.canvas=s,this.gl=i)}applyFilters(t,e,s,i,r,n){const o=this.gl,a=r.getContext("2d");if(!o||!a)return;let h;n&&(h=this.getCachedTexture(n,e));const l={originalWidth:e.width||e.naturalWidth||0,originalHeight:e.height||e.naturalHeight||0,sourceWidth:s,sourceHeight:i,destinationWidth:s,destinationHeight:i,context:o,sourceTexture:this.createTexture(o,s,i,h?void 0:e),targetTexture:this.createTexture(o,s,i),originalTexture:h||this.createTexture(o,s,i,h?void 0:e),passes:t.length,webgl:!0,aPosition:this.aPosition,programCache:this.programCache,pass:0,filterBackend:this,targetCanvas:r},c=o.createFramebuffer();return o.bindFramebuffer(o.FRAMEBUFFER,c),t.forEach(t=>{t&&t.applyTo(l)}),function(t){const e=t.targetCanvas,s=e.width,i=e.height,r=t.destinationWidth,n=t.destinationHeight;s===r&&i===n||(e.width=r,e.height=n)}(l),this.copyGLTo2D(o,l),o.bindTexture(o.TEXTURE_2D,null),o.deleteTexture(l.sourceTexture),o.deleteTexture(l.targetTexture),o.deleteFramebuffer(c),a.setTransform(1,0,0,1,0,0),l}dispose(){this.canvas&&(this.canvas=null,this.gl=null),this.clearWebGLCaches()}clearWebGLCaches(){this.programCache={},this.textureCache={}}createTexture(t,e,s,i,r){const{NEAREST:n,TEXTURE_2D:o,RGBA:a,UNSIGNED_BYTE:h,CLAMP_TO_EDGE:l,TEXTURE_MAG_FILTER:c,TEXTURE_MIN_FILTER:u,TEXTURE_WRAP_S:d,TEXTURE_WRAP_T:g}=t,f=t.createTexture();return t.bindTexture(o,f),t.texParameteri(o,c,r||n),t.texParameteri(o,u,r||n),t.texParameteri(o,d,l),t.texParameteri(o,g,l),i?t.texImage2D(o,0,a,a,h,i):t.texImage2D(o,0,a,e,s,0,a,h,null),f}getCachedTexture(t,e,s){const{textureCache:i}=this;if(i[t])return i[t];{const r=this.createTexture(this.gl,e.width,e.height,e,s);return r&&(i[t]=r),r}}evictCachesForKey(t){this.textureCache[t]&&(this.gl.deleteTexture(this.textureCache[t]),delete this.textureCache[t])}copyGLTo2D(t,e){const s=t.canvas,i=e.targetCanvas,r=i.getContext("2d");if(!r)return;r.translate(0,i.height),r.scale(1,-1);const n=s.height-i.height;r.drawImage(s,0,n,i.width,i.height,0,0,i.width,i.height)}copyGLTo2DPutImageData(t,e){const s=e.targetCanvas.getContext("2d"),i=e.destinationWidth,r=e.destinationHeight,n=i*r*4;if(!s)return;const o=new Uint8Array(this.imageBuffer,0,n),a=new Uint8ClampedArray(this.imageBuffer,0,n);t.readPixels(0,0,i,r,t.RGBA,t.UNSIGNED_BYTE,o);const h=new ImageData(a,i,r);s.putImageData(h,0,0)}captureGPUInfo(){if(this.gpuInfo)return this.gpuInfo;const t=this.gl,e={renderer:"",vendor:""};if(!t)return e;const s=t.getExtension("WEBGL_debug_renderer_info");if(s){const i=t.getParameter(s.UNMASKED_RENDERER_WEBGL),r=t.getParameter(s.UNMASKED_VENDOR_WEBGL);i&&(e.renderer=i.toLowerCase()),r&&(e.vendor=r.toLowerCase())}return this.gpuInfo=e,e}}let go;function fo(){const{WebGLProbe:t}=u();return t.queryWebGL(dt()),i.enableGLFiltering&&t.isSupported(i.textureSize)?new uo({tileSize:i.textureSize}):new co}function po(){return!go&&(!(arguments.length>0&&void 0!==arguments[0])||arguments[0])&&(go=fo()),go}const mo=["cropX","cropY"];class vo extends xi{static getDefaults(){return{...super.getDefaults(),...vo.ownDefaults}}constructor(t,s){super(),e(this,"_lastScaleX",1),e(this,"_lastScaleY",1),e(this,"_filterScalingX",1),e(this,"_filterScalingY",1),this.filters=[],Object.assign(this,vo.ownDefaults),this.setOptions(s),this.cacheKey=`texture${ut()}`,this.setElement("string"==typeof t?(this.canvas&&Ht(this.canvas.getElement())||d()).getElementById(t):t,s)}getElement(){return this._element}setElement(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};this.removeTexture(this.cacheKey),this.removeTexture(`${this.cacheKey}_filtered`),this._element=t,this._originalElement=t,this._setWidthHeight(e),0!==this.filters.length&&this.applyFilters(),this.resizeFilter&&this.applyResizeFilters()}removeTexture(t){const e=po(!1);e instanceof uo&&e.evictCachesForKey(t)}dispose(){super.dispose(),this.removeTexture(this.cacheKey),this.removeTexture(`${this.cacheKey}_filtered`),this._cacheContext=null,["_originalElement","_element","_filteredEl","_cacheCanvas"].forEach(t=>{const e=this[t];e&&u().dispose(e),this[t]=void 0})}getCrossOrigin(){return this._originalElement&&(this._originalElement.crossOrigin||null)}getOriginalSize(){const t=this.getElement();return t?{width:t.naturalWidth||t.width,height:t.naturalHeight||t.height}:{width:0,height:0}}_stroke(t){if(!this.stroke||0===this.strokeWidth)return;const e=this.width/2,s=this.height/2;t.beginPath(),t.moveTo(-e,-s),t.lineTo(e,-s),t.lineTo(e,s),t.lineTo(-e,s),t.lineTo(-e,-s),t.closePath()}toObject(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[];const e=[];return this.filters.forEach(t=>{t&&e.push(t.toObject())}),{...super.toObject([...mo,...t]),src:this.getSrc(),crossOrigin:this.getCrossOrigin(),filters:e,...this.resizeFilter?{resizeFilter:this.resizeFilter.toObject()}:{}}}hasCrop(){return!!this.cropX||!!this.cropY||this.width\n','\t\n',"\n"),o=' clip-path="url(#imageCrop_'+t+')" '}if(this.imageSmoothing||(a=' image-rendering="optimizeSpeed"'),t.push("\t\n`),this.stroke||this.strokeDashArray){const t=this.fill;this.fill=null,n=[`\t\n`],this.fill=t}return r=this.paintFirst!==H?r.concat(n,t):r.concat(t,n),r}getSrc(t){const e=t?this._element:this._originalElement;return e?e.toDataURL?e.toDataURL():this.srcFromAttribute?e.getAttribute("src")||"":e.src:this.src||""}getSvgSrc(t){return this.getSrc(t)}setSrc(t){let{crossOrigin:e,signal:s}=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return Ft(t,{crossOrigin:e,signal:s}).then(t=>{void 0!==e&&this.set({crossOrigin:e}),this.setElement(t)})}toString(){return`#`}applyResizeFilters(){const t=this.resizeFilter,e=this.minimumScaleTrigger,s=this.getTotalObjectScaling(),i=s.x,r=s.y,n=this._filteredEl||this._originalElement;if(this.group&&this.set("dirty",!0),!t||i>e&&r>e)return this._element=n,this._filterScalingX=1,this._filterScalingY=1,this._lastScaleX=i,void(this._lastScaleY=r);const o=ft(n),{width:a,height:h}=n;this._element=o,this._lastScaleX=t.scaleX=i,this._lastScaleY=t.scaleY=r,po().applyFilters([t],n,a,h,this._element),this._filterScalingX=o.width/this._originalElement.width,this._filterScalingY=o.height/this._originalElement.height}applyFilters(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.filters||[];if(t=t.filter(t=>t&&!t.isNeutralState()),this.set("dirty",!0),this.removeTexture(`${this.cacheKey}_filtered`),0===t.length)return this._element=this._originalElement,this._filteredEl=void 0,this._filterScalingX=1,void(this._filterScalingY=1);const e=this._originalElement,s=e.naturalWidth||e.width,i=e.naturalHeight||e.height;if(this._element===this._originalElement){const t=ft({width:s,height:i});this._element=t,this._filteredEl=t}else this._filteredEl&&(this._element=this._filteredEl,this._filteredEl.getContext("2d").clearRect(0,0,s,i),this._lastScaleX=1,this._lastScaleY=1);po().applyFilters(t,this._originalElement,s,i,this._element,this.cacheKey),this._originalElement.width===this._element.width&&this._originalElement.height===this._element.height||(this._filterScalingX=this._element.width/this._originalElement.width,this._filterScalingY=this._element.height/this._originalElement.height)}_render(t){t.imageSmoothingEnabled=this.imageSmoothing,!0!==this.isMoving&&this.resizeFilter&&this._needsResize()&&this.applyResizeFilters(),this._stroke(t),this._renderPaintInOrder(t)}drawCacheOnCanvas(t){t.imageSmoothingEnabled=this.imageSmoothing,super.drawCacheOnCanvas(t)}shouldCache(){return this.needsItsOwnCache()}_renderFill(t){const e=this._element;if(!e)return;const s=this._filterScalingX,i=this._filterScalingY,r=this.width,n=this.height,o=Math.max(this.cropX,0),a=Math.max(this.cropY,0),h=e.naturalWidth||e.width,l=e.naturalHeight||e.height,c=o*s,u=a*i,d=Math.min(r*s,h-c),g=Math.min(n*i,l-u),f=-r/2,p=-n/2,m=Math.min(r,h/s-o),v=Math.min(n,l/i-a);e&&t.drawImage(e,c,u,d,g,f,p,m,v)}_needsResize(){const t=this.getTotalObjectScaling();return t.x!==this._lastScaleX||t.y!==this._lastScaleY}_resetWidthHeight(){this.set(this.getOriginalSize())}_setWidthHeight(){let{width:t,height:e}=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};const s=this.getOriginalSize();this.width=t||s.width,this.height=e||s.height}parsePreserveAspectRatioAttribute(){const t=ze(this.preserveAspectRatio||""),e=this.width,s=this.height,i={width:e,height:s};let r,n=this._element.width,o=this._element.height,a=1,h=1,l=0,c=0,u=0,d=0;return!t||t.alignX===P&&t.alignY===P?(a=e/n,h=s/o):("meet"===t.meetOrSlice&&(a=h=xr(this._element,i),r=(e-n*a)/2,"Min"===t.alignX&&(l=-r),"Max"===t.alignX&&(l=r),r=(s-o*h)/2,"Min"===t.alignY&&(c=-r),"Max"===t.alignY&&(c=r)),"slice"===t.meetOrSlice&&(a=h=Cr(this._element,i),r=n-e/a,"Mid"===t.alignX&&(u=r/2),"Max"===t.alignX&&(u=r),r=o-s/h,"Mid"===t.alignY&&(d=r/2),"Max"===t.alignY&&(d=r),n=e/a,o=s/h)),{width:n,height:o,scaleX:a,scaleY:h,offsetLeft:l,offsetTop:c,cropX:u,cropY:d}}static fromObject(t,e){let{filters:s,resizeFilter:i,src:r,crossOrigin:n,type:o,...a}=t;return Promise.all([Ft(r,{...e,crossOrigin:n}),s&&Lt(s,e),i?Lt([i],e):[],Rt(a,e)]).then(t=>{let[e,s=[],[i],n={}]=t;return new this(e,{...a,src:r,filters:s,resizeFilter:i,...n})})}static fromURL(t){let{crossOrigin:e=null,signal:s}=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},i=arguments.length>2?arguments[2]:void 0;return Ft(t,{crossOrigin:e,signal:s}).then(t=>new this(t,i))}static async fromElement(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},s=arguments.length>2?arguments[2]:void 0;const i=or(t,this.ATTRIBUTE_NAMES,s);return this.fromURL(i["xlink:href"]||i.href,e,i).catch(t=>(r("log","Unable to parse Image",t),null))}}function yo(t){if(!fs.test(t.nodeName))return{};const e=t.getAttribute("viewBox");let s,i,r=1,n=1,o=0,a=0;const h=t.getAttribute("width"),l=t.getAttribute("height"),c=t.getAttribute("x")||0,u=t.getAttribute("y")||0,d=!(e&&ms.test(e)),g=!h||!l||"100%"===h||"100%"===l;let f="",p=0,m=0;if(d&&(c||u)&&t.parentNode&&"#document"!==t.parentNode.nodeName&&(f=" translate("+Ge(c||"0")+" "+Ge(u||"0")+") ",s=(t.getAttribute("transform")||"")+f,t.setAttribute("transform",s),t.removeAttribute("x"),t.removeAttribute("y")),d&&g)return{width:0,height:0};const v={width:0,height:0};if(d)return v.width=Ge(h),v.height=Ge(l),v;const y=e.match(ms);o=-parseFloat(y[1]),a=-parseFloat(y[2]);const _=parseFloat(y[3]),x=parseFloat(y[4]);v.minX=o,v.minY=a,v.viewBoxWidth=_,v.viewBoxHeight=x,g?(v.width=_,v.height=x):(v.width=Ge(h),v.height=Ge(l),r=v.width/_,n=v.height/x);const C=ze(t.getAttribute("preserveAspectRatio")||"");if(C.alignX!==P&&("meet"===C.meetOrSlice&&(n=r=r>n?n:r),"slice"===C.meetOrSlice&&(n=r=r>n?r:n),p=v.width-_*r,m=v.height-x*r,"Mid"===C.alignX&&(p/=2),"Mid"===C.alignY&&(m/=2),"Min"===C.alignX&&(p=0),"Min"===C.alignY&&(m=0)),1===r&&1===n&&0===o&&0===a&&0===c&&0===u)return v;if((c||u)&&"#document"!==t.parentNode.nodeName&&(f=" translate("+Ge(c||"0")+" "+Ge(u||"0")+") "),s=f+" matrix("+r+" 0 0 "+n+" "+(o*r+p)+" "+(a*n+m)+") ","svg"===t.nodeName){for(i=t.ownerDocument.createElementNS(hs,"g");t.firstChild;)i.appendChild(t.firstChild);t.appendChild(i)}else i=t,i.removeAttribute("x"),i.removeAttribute("y"),s=i.getAttribute("transform")+s;return i.setAttribute("transform",s),v}e(vo,"type","Image"),e(vo,"cacheProperties",[...bs,...mo]),e(vo,"ownDefaults",{strokeWidth:0,srcFromAttribute:!1,minimumScaleTrigger:.5,cropX:0,cropY:0,imageSmoothing:!0}),e(vo,"ATTRIBUTE_NAMES",[...Ii,"x","y","width","height","preserveAspectRatio","xlink:href","href","crossOrigin","image-rendering"]),J.setClass(vo),J.setSVGClass(vo);const _o=t=>t.tagName.replace("svg:",""),xo=Ue(["pattern","defs","symbol","metadata","clipPath","mask","desc"]);function Co(t,e){let s,i,r,n,o=[];for(r=0,n=e.length;r{const s=r.getAttribute(t);!e.hasAttribute(t)&&s&&e.setAttribute(t,s)}),!e.children.length)){const t=r.cloneNode(!0);for(;t.firstChild;)e.appendChild(t.firstChild)}e.removeAttribute(So)}const To=["linearGradient","radialGradient","svg:linearGradient","svg:radialGradient"];const Oo=t=>J.getSVGClass(_o(t).toLowerCase());class ko{constructor(t,e,s,i,r){this.elements=t,this.options=e,this.reviver=s,this.regexUrl=/^url\(['"]?#([^'"]+)['"]?\)/g,this.doc=i,this.clipPaths=r,this.gradientDefs=function(t){const e=Co(t,To),s={};let i=e.length;for(;i--;){const r=e[i];r.getAttribute("xlink:href")&&wo(t,r);const n=r.getAttribute("id");n&&(s[n]=r)}return s}(i),this.cssRules=function(t){const e=t.getElementsByTagName("style"),s={};for(let t=0;ts.length>1&&t.trim()).forEach(t=>{if((t.match(/{/g)||[]).length>1&&t.trim().startsWith("@"))return;const e=t.split("{"),i={},r=e[1].trim().split(";").filter(function(t){return t.trim()});for(let t=0;t{""!==(t=t.replace(/^svg/i,"").trim())&&(s[t]={...s[t]||{},...i})})})}return s}(i)}parse(){return Promise.all(this.elements.map(t=>this.createObject(t)))}async createObject(t){const e=Oo(t);if(e){const s=await e.fromElement(t,this.options,this.cssRules);return this.resolveGradient(s,t,H),this.resolveGradient(s,t,N),s instanceof vo&&s._originalElement?Jr(s,s.parsePreserveAspectRatioAttribute()):Jr(s),await this.resolveClipPath(s,t),this.reviver&&this.reviver(t,s),s}return null}extractPropertyDefinition(t,e,s){const i=t[e],r=this.regexUrl;if(!r.test(i))return;r.lastIndex=0;const n=r.exec(i)[1];return r.lastIndex=0,s[n]}resolveGradient(t,e,s){const i=this.extractPropertyDefinition(t,s,this.gradientDefs);if(i){const r=e.getAttribute(s+"-opacity"),n=wn.fromElement(i,t,{...this.options,opacity:r});t.set(s,n)}}async resolveClipPath(t,e,s){const i=this.extractPropertyDefinition(t,"clipPath",this.clipPaths);if(i){const r=Ct(t.calcTransformMatrix()),n=i[0].parentElement;let o=e;for(;!s&&o.parentElement&&o.getAttribute("clip-path")!==t.clipPath;)o=o.parentElement;o.parentElement.appendChild(n);const a=er(`${o.getAttribute("transform")||""} ${n.getAttribute("originalTransform")||""}`);n.setAttribute("transform",`matrix(${a.join(",")})`);const h=await Promise.all(i.map(t=>Oo(t).fromElement(t,this.options,this.cssRules).then(t=>(Jr(t),t.fillRule=t.clipRule,delete t.clipRule,t)))),l=1===h.length?h[0]:new _r(h),c=bt(r,l.calcTransformMatrix());l.clipPath&&await this.resolveClipPath(l,o,n.getAttribute("clip-path")?o:void 0);const{scaleX:u,scaleY:d,angle:g,skewX:f,translateX:p,translateY:m}=Tt(c);l.set({flipX:!1,flipY:!1}),l.set({scaleX:u,scaleY:d,angle:g,skewX:f,skewY:0}),l.setPositionByOrigin(new it(p,m),T,T),t.clipPath=l}else delete t.clipPath}}const Do=t=>gs.test(_o(t));async function Mo(t,e){let{crossOrigin:s,signal:i}=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};if(i&&i.aborted)return r("log",new o("parseSVGDocument")),{objects:[],elements:[],options:{},allElements:[]};const n=t.documentElement;!function(t){const e=Co(t,["use","svg:use"]),s=["x","y","xlink:href","href","transform"];for(const i of e){const e=i.attributes,r={};for(const t of e)t.value&&(r[t.name]=t.value);const n=(r["xlink:href"]||r.href||"").slice(1);if(""===n)return;const o=t.getElementById(n);if(null===o)return;let a=o.cloneNode(!0);const h=a.attributes,l={};for(const t of h)t.value&&(l[t.name]=t.value);const{x:c=0,y:u=0,transform:d=""}=r,g=`${d} ${l.transform||""} translate(${c}, ${u})`;if(yo(a),/^svg$/i.test(a.nodeName)){const t=a.ownerDocument.createElementNS(hs,"g");Object.entries(l).forEach(e=>{let[s,i]=e;return t.setAttributeNS(hs,s,i)}),t.append(...a.childNodes),a=t}for(const t of e){if(!t)continue;const{name:e,value:i}=t;if(!s.includes(e))if("style"===e){const t={};ir(i,t),Object.entries(l).forEach(e=>{let[s,i]=e;t[s]=i}),ir(l.style||"",t);const s=Object.entries(t).map(t=>t.join(":")).join(";");a.setAttribute(e,s)}else!l[e]&&a.setAttribute(e,i)}a.setAttribute("transform",g),a.setAttribute("instantiated_by_use","1"),a.removeAttribute("id"),i.parentNode.replaceChild(a,i)}}(t);const a=Array.from(n.getElementsByTagName("*")),h={...yo(n),crossOrigin:s,signal:i},l=a.filter(t=>(yo(t),Do(t)&&!function(t){let e=t;for(;e&&(e=e.parentElement);)if(e&&e.nodeName&&xo.test(_o(e))&&!e.getAttribute("instantiated_by_use"))return!0;return!1}(t)));if(!l||l&&!l.length)return{objects:[],elements:[],options:{},allElements:[],options:h,allElements:a};const c={};a.filter(t=>"clipPath"===_o(t)).forEach(t=>{t.setAttribute("originalTransform",t.getAttribute("transform")||"");const e=t.getAttribute("id");c[e]=Array.from(t.getElementsByTagName("*")).filter(t=>Do(t))});const u=new ko(l,h,e,t,c);return{objects:await u.parse(),elements:l,options:h,allElements:a}}function Po(t,e,s){return Mo((new(g().DOMParser)).parseFromString(t.trim(),"text/xml"),e,s)}const Eo=B,Ao=t=>function(e,s,i){const{points:r,pathOffset:n}=i;return new it(r[t]).subtract(n).transform(bt(i.getViewportTransform(),i.calcTransformMatrix()))},jo=(t,e,s,i)=>{const{target:r,pointIndex:n}=e,o=r,a=ue(new it(s,i),void 0,o.calcOwnMatrix());return o.points[n]=a.add(o.pathOffset),o.setDimensions(),o.set("dirty",!0),!0},Fo=(t,e)=>function(s,i,r,n){const o=i.target,a=new it(o.points[(t>0?t:o.points.length)-1]),h=a.subtract(o.pathOffset).transform(o.calcOwnMatrix()),l=e(s,{...i,pointIndex:t},r,n),c=a.subtract(o.pathOffset).transform(o.calcOwnMatrix()).subtract(h);return o.left-=c.x,o.top-=c.y,l},Lo=t=>Ws(Eo,Fo(t,jo));const Ro=(t,e,s)=>{const{path:i,pathOffset:r}=t,n=i[e];return new it(n[s]-r.x,n[s+1]-r.y).transform(bt(t.getViewportTransform(),t.calcTransformMatrix()))};function Io(t,e,s){const{commandIndex:i,pointIndex:r}=this;return Ro(s,i,r)}function Bo(t,e,s,i){const{target:r}=e,{commandIndex:n,pointIndex:o}=this,a=((t,e,s,i,r)=>{const{path:n,pathOffset:o}=t,a=n[(i>0?i:n.length)-1],h=new it(a[r],a[r+1]),l=h.subtract(o).transform(t.calcOwnMatrix()),c=ue(new it(e,s),void 0,t.calcOwnMatrix());n[i][r]=c.x+o.x,n[i][r+1]=c.y+o.y,t.setDimensions();const u=h.subtract(t.pathOffset).transform(t.calcOwnMatrix()).subtract(l);return t.left-=u.x,t.top-=u.y,t.set("dirty",!0),!0})(r,s,i,n,o);return fe(this.actionName,{...je(t,e,s,i),commandIndex:n,pointIndex:o}),a}class $o extends Ns{constructor(t){super(t)}render(t,e,s,i,r){const n={...i,cornerColor:this.controlFill,cornerStrokeColor:this.controlStroke,transparentCorners:!this.controlFill};super.render(t,e,s,n,r)}}class Xo extends $o{constructor(t){super(t)}render(t,e,s,i,r){const{path:n}=r,{commandIndex:o,pointIndex:a,connectToCommandIndex:h,connectToPointIndex:l}=this;t.save(),t.strokeStyle=this.controlStroke,this.connectionDashArray&&t.setLineDash(this.connectionDashArray);const[c]=n[o],u=Ro(r,h,l);if("Q"===c){const i=Ro(r,o,a+2);t.moveTo(i.x,i.y),t.lineTo(e,s)}else t.moveTo(e,s);t.lineTo(u.x,u.y),t.stroke(),t.restore(),super.render(t,e,s,i,r)}}const Yo=(t,e,s,i,r,n)=>new(s?Xo:$o)({commandIndex:t,pointIndex:e,actionName:"modifyPath",positionHandler:Io,actionHandler:Bo,connectToCommandIndex:r,connectToPointIndex:n,...i,...s?i.controlPointStyle:i.pointStyle});var Wo=Object.freeze({__proto__:null,changeWidth:Gs,createObjectDefaultControls:pi,createPathControls:function(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};const s={};let i="M";return t.path.forEach((t,r)=>{const n=t[0];switch("Z"!==n&&(s[`c_${r}_${n}`]=Yo(r,t.length-2,!1,e)),n){case"C":s[`c_${r}_C_CP_1`]=Yo(r,1,!0,e,r-1,(t=>"C"===t?5:"Q"===t?3:1)(i)),s[`c_${r}_C_CP_2`]=Yo(r,3,!0,e,r,5);break;case"Q":s[`c_${r}_Q_CP_1`]=Yo(r,1,!0,e,r,3)}i=n}),s},createPolyActionHandler:Lo,createPolyControls:function(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};const s={};for(let i=0;i<("number"==typeof t?t:t.points.length);i++)s[`p${i}`]=new Ns({actionName:Eo,positionHandler:Ao(i),actionHandler:Lo(i),...e});return s},createPolyPositionHandler:Ao,createResizeControls:mi,createTextboxDefaultControls:vi,dragHandler:Re,factoryPolyActionHandler:Fo,getLocalPoint:Le,polyActionHandler:jo,renderCircleControl:zs,renderSquareControl:Hs,rotationStyleHandler:Us,rotationWithSnapping:qs,scaleCursorStyleHandler:Zs,scaleOrSkewActionName:ui,scaleSkewCursorStyleHandler:di,scalingEqually:ei,scalingX:si,scalingXOrSkewingY:gi,scalingY:ii,scalingYOrSkewingX:fi,skewCursorStyleHandler:oi,skewHandlerX:hi,skewHandlerY:li,wrapWithFireEvent:Ws,wrapWithFixedAnchor:Vs});const Vo=t=>void 0!==t.webgl,Go="precision highp float",zo=`\n ${Go};\n varying vec2 vTexCoord;\n uniform sampler2D uTexture;\n void main() {\n gl_FragColor = texture2D(uTexture, vTexCoord);\n }`,Ho=new RegExp(Go,"g");class No{get type(){return this.constructor.type}constructor(){let{type:t,...e}=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};Object.assign(this,this.constructor.defaults,e)}getFragmentSource(){return zo}getVertexSource(){return"\n attribute vec2 aPosition;\n varying vec2 vTexCoord;\n void main() {\n vTexCoord = aPosition;\n gl_Position = vec4(aPosition * 2.0 - 1.0, 0.0, 1.0);\n }"}createProgram(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:this.getFragmentSource(),s=arguments.length>2&&void 0!==arguments[2]?arguments[2]:this.getVertexSource();const{WebGLProbe:{GLPrecision:i="highp"}}=u();"highp"!==i&&(e=e.replace(Ho,Go.replace("highp",i)));const r=t.createShader(t.VERTEX_SHADER),o=t.createShader(t.FRAGMENT_SHADER),a=t.createProgram();if(!r||!o||!a)throw new n("Vertex, fragment shader or program creation error");if(t.shaderSource(r,s),t.compileShader(r),!t.getShaderParameter(r,t.COMPILE_STATUS))throw new n(`Vertex shader compile error for ${this.type}: ${t.getShaderInfoLog(r)}`);if(t.shaderSource(o,e),t.compileShader(o),!t.getShaderParameter(o,t.COMPILE_STATUS))throw new n(`Fragment shader compile error for ${this.type}: ${t.getShaderInfoLog(o)}`);if(t.attachShader(a,r),t.attachShader(a,o),t.linkProgram(a),!t.getProgramParameter(a,t.LINK_STATUS))throw new n(`Shader link error for "${this.type}" ${t.getProgramInfoLog(a)}`);const h=this.getUniformLocations(t,a)||{};return h.uStepW=t.getUniformLocation(a,"uStepW"),h.uStepH=t.getUniformLocation(a,"uStepH"),{program:a,attributeLocations:this.getAttributeLocations(t,a),uniformLocations:h}}getAttributeLocations(t,e){return{aPosition:t.getAttribLocation(e,"aPosition")}}getUniformLocations(t,e){const s=this.constructor.uniformLocations,i={};for(let r=0;r1){const s=t.destinationWidth,i=t.destinationHeight;t.sourceWidth===s&&t.sourceHeight===i||(e.deleteTexture(t.targetTexture),t.targetTexture=t.filterBackend.createTexture(e,s,i)),e.framebufferTexture2D(e.FRAMEBUFFER,e.COLOR_ATTACHMENT0,e.TEXTURE_2D,t.targetTexture,0)}else e.bindFramebuffer(e.FRAMEBUFFER,null),e.finish()}_swapTextures(t){t.passes--,t.pass++;const e=t.targetTexture;t.targetTexture=t.sourceTexture,t.sourceTexture=e}isNeutralState(t){return!1}applyTo(t){Vo(t)?(this._setupFrameBuffer(t),this.applyToWebGL(t),this._swapTextures(t)):this.applyTo2d(t)}applyTo2d(t){}getCacheKey(){return this.type}retrieveShader(t){const e=this.getCacheKey();return t.programCache[e]||(t.programCache[e]=this.createProgram(t.context)),t.programCache[e]}applyToWebGL(t){const e=t.context,s=this.retrieveShader(t);0===t.pass&&t.originalTexture?e.bindTexture(e.TEXTURE_2D,t.originalTexture):e.bindTexture(e.TEXTURE_2D,t.sourceTexture),e.useProgram(s.program),this.sendAttributeData(e,s.attributeLocations,t.aPosition),e.uniform1f(s.uniformLocations.uStepW,1/t.sourceWidth),e.uniform1f(s.uniformLocations.uStepH,1/t.sourceHeight),this.sendUniformData(e,s.uniformLocations),e.viewport(0,0,t.destinationWidth,t.destinationHeight),e.drawArrays(e.TRIANGLE_STRIP,0,4)}bindAdditionalTexture(t,e,s){t.activeTexture(s),t.bindTexture(t.TEXTURE_2D,e),t.activeTexture(t.TEXTURE0)}unbindAdditionalTexture(t,e){t.activeTexture(e),t.bindTexture(t.TEXTURE_2D,null),t.activeTexture(t.TEXTURE0)}sendUniformData(t,e){}createHelpLayer(t){if(!t.helpLayer){const{sourceWidth:e,sourceHeight:s}=t,i=ft({width:e,height:s});t.helpLayer=i}}toObject(){const t=Object.keys(this.constructor.defaults||{});return{type:this.type,...t.reduce((t,e)=>(t[e]=this[e],t),{})}}toJSON(){return this.toObject()}static async fromObject(t,e){let{type:s,...i}=t;return new this(i)}}e(No,"type","BaseFilter"),e(No,"uniformLocations",[]);const Uo={multiply:"gl_FragColor.rgb *= uColor.rgb;\n",screen:"gl_FragColor.rgb = 1.0 - (1.0 - gl_FragColor.rgb) * (1.0 - uColor.rgb);\n",add:"gl_FragColor.rgb += uColor.rgb;\n",difference:"gl_FragColor.rgb = abs(gl_FragColor.rgb - uColor.rgb);\n",subtract:"gl_FragColor.rgb -= uColor.rgb;\n",lighten:"gl_FragColor.rgb = max(gl_FragColor.rgb, uColor.rgb);\n",darken:"gl_FragColor.rgb = min(gl_FragColor.rgb, uColor.rgb);\n",exclusion:"gl_FragColor.rgb += uColor.rgb - 2.0 * (uColor.rgb * gl_FragColor.rgb);\n",overlay:"\n if (uColor.r < 0.5) {\n gl_FragColor.r *= 2.0 * uColor.r;\n } else {\n gl_FragColor.r = 1.0 - 2.0 * (1.0 - gl_FragColor.r) * (1.0 - uColor.r);\n }\n if (uColor.g < 0.5) {\n gl_FragColor.g *= 2.0 * uColor.g;\n } else {\n gl_FragColor.g = 1.0 - 2.0 * (1.0 - gl_FragColor.g) * (1.0 - uColor.g);\n }\n if (uColor.b < 0.5) {\n gl_FragColor.b *= 2.0 * uColor.b;\n } else {\n gl_FragColor.b = 1.0 - 2.0 * (1.0 - gl_FragColor.b) * (1.0 - uColor.b);\n }\n ",tint:"\n gl_FragColor.rgb *= (1.0 - uColor.a);\n gl_FragColor.rgb += uColor.rgb;\n "};class qo extends No{getCacheKey(){return`${this.type}_${this.mode}`}getFragmentSource(){return`\n precision highp float;\n uniform sampler2D uTexture;\n uniform vec4 uColor;\n varying vec2 vTexCoord;\n void main() {\n vec4 color = texture2D(uTexture, vTexCoord);\n gl_FragColor = color;\n if (color.a > 0.0) {\n ${Uo[this.mode]}\n }\n }\n `}applyTo2d(t){let{imageData:{data:e}}=t;const s=new Ve(this.color).getSource(),i=this.alpha,r=s[0]*i,n=s[1]*i,o=s[2]*i,a=1-i;for(let t=0;tnew this({...r,image:t}))}}e(Jo,"type","BlendImage"),e(Jo,"defaults",{mode:"multiply",alpha:1}),e(Jo,"uniformLocations",["uTransformMatrix","uImage"]),J.setClass(Jo);class Qo extends No{getFragmentSource(){return"\n precision highp float;\n uniform sampler2D uTexture;\n uniform vec2 uDelta;\n varying vec2 vTexCoord;\n const float nSamples = 15.0;\n vec3 v3offset = vec3(12.9898, 78.233, 151.7182);\n float random(vec3 scale) {\n /* use the fragment position for a different seed per-pixel */\n return fract(sin(dot(gl_FragCoord.xyz, scale)) * 43758.5453);\n }\n void main() {\n vec4 color = vec4(0.0);\n float totalC = 0.0;\n float totalA = 0.0;\n float offset = random(v3offset);\n for (float t = -nSamples; t <= nSamples; t++) {\n float percent = (t + offset - 0.5) / nSamples;\n vec4 sample = texture2D(uTexture, vTexCoord + uDelta * percent);\n float weight = 1.0 - abs(percent);\n float alpha = weight * sample.a;\n color.rgb += sample.rgb * alpha;\n color.a += alpha;\n totalA += weight;\n totalC += alpha;\n }\n gl_FragColor.rgb = color.rgb / totalC;\n gl_FragColor.a = color.a / totalA;\n }\n "}applyTo(t){Vo(t)?(this.aspectRatio=t.sourceWidth/t.sourceHeight,t.passes++,this._setupFrameBuffer(t),this.horizontal=!0,this.applyToWebGL(t),this._swapTextures(t),this._setupFrameBuffer(t),this.horizontal=!1,this.applyToWebGL(t),this._swapTextures(t)):this.applyTo2d(t)}applyTo2d(t){let{imageData:{data:e,width:s,height:i}}=t;this.aspectRatio=s/i,this.horizontal=!0;let r=this.getBlurValue()*s;const n=new Uint8ClampedArray(e),o=15,a=4*s;for(let t=0;td&&(p=d);const m=e[p+3]*f;s+=e[p]*m,i+=e[p+1]*m,h+=e[p+2]*m,l+=m,c+=f}n[t]=s/l,n[t+1]=i/l,n[t+2]=h/l,n[t+3]=l/c}this.horizontal=!1,r=this.getBlurValue()*i;for(let t=0;td&&(m=d);const v=n[m+3]*p;s+=n[m]*v,i+=n[m+1]*v,h+=n[m+2]*v,l+=v,c+=p}e[t]=s/l,e[t+1]=i/l,e[t+2]=h/l,e[t+3]=l/c}}sendUniformData(t,e){const s=this.chooseRightDelta();t.uniform2fv(e.uDelta,s)}isNeutralState(){return 0===this.blur}getBlurValue(){let t=1;const{horizontal:e,aspectRatio:s}=this;return e?s>1&&(t=1/s):s<1&&(t=s),t*this.blur*.12}chooseRightDelta(){const t=this.getBlurValue();return this.horizontal?[t,0]:[0,t]}}e(Qo,"type","Blur"),e(Qo,"defaults",{blur:0}),e(Qo,"uniformLocations",["uDelta"]),J.setClass(Qo);class Zo extends No{getFragmentSource(){return"\n precision highp float;\n uniform sampler2D uTexture;\n uniform float uBrightness;\n varying vec2 vTexCoord;\n void main() {\n vec4 color = texture2D(uTexture, vTexCoord);\n color.rgb += uBrightness;\n gl_FragColor = color;\n }\n"}applyTo2d(t){let{imageData:{data:e}}=t;const s=Math.round(255*this.brightness);for(let t=0;t0&&void 0!==arguments[0]?arguments[0]:{};super(t),this.subFilters=t.subFilters||[]}applyTo(t){Vo(t)&&(t.passes+=this.subFilters.length-1),this.subFilters.forEach(e=>{e.applyTo(t)})}toObject(){return{type:this.type,subFilters:this.subFilters.map(t=>t.toObject())}}isNeutralState(){return!this.subFilters.some(t=>!t.isNeutralState())}static fromObject(t,e){return Promise.all((t.subFilters||[]).map(t=>J.getClass(t.type).fromObject(t,e))).then(t=>new this({subFilters:t}))}}e(ca,"type","Composed"),J.setClass(ca);class ua extends No{getFragmentSource(){return"\n precision highp float;\n uniform sampler2D uTexture;\n uniform float uContrast;\n varying vec2 vTexCoord;\n void main() {\n vec4 color = texture2D(uTexture, vTexCoord);\n float contrastF = 1.015 * (uContrast + 1.0) / (1.0 * (1.015 - uContrast));\n color.rgb = contrastF * (color.rgb - 0.5) + 0.5;\n gl_FragColor = color;\n }"}isNeutralState(){return 0===this.contrast}applyTo2d(t){let{imageData:{data:e}}=t;const s=Math.floor(255*this.contrast),i=259*(s+255)/(255*(259-s));for(let t=0;t=a||m<0||m>=o||(y=4*(v*o+m),_=i[S*r+b],u+=s[y]*_,d+=s[y+1]*_,g+=s[y+2]*_,c||(f+=s[y+3]*_));l[p]=u,l[p+1]=d,l[p+2]=g,l[p+3]=c?s[p+3]:f}t.imageData=h}sendUniformData(t,e){t.uniform1fv(e.uMatrix,this.matrix)}toObject(){return{...super.toObject(),opaque:this.opaque,matrix:[...this.matrix]}}}e(ga,"type","Convolute"),e(ga,"defaults",{opaque:!1,matrix:[0,0,0,0,1,0,0,0,0]}),e(ga,"uniformLocations",["uMatrix","uOpaque","uHalfSize","uSize"]),J.setClass(ga);const fa="Gamma";class pa extends No{getFragmentSource(){return"\n precision highp float;\n uniform sampler2D uTexture;\n uniform vec3 uGamma;\n varying vec2 vTexCoord;\n void main() {\n vec4 color = texture2D(uTexture, vTexCoord);\n vec3 correction = (1.0 / uGamma);\n color.r = pow(color.r, correction.r);\n color.g = pow(color.g, correction.g);\n color.b = pow(color.b, correction.b);\n gl_FragColor = color;\n gl_FragColor.rgb *= color.a;\n }\n"}constructor(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};super(t),this.gamma=t.gamma||this.constructor.defaults.gamma.concat()}applyTo2d(t){let{imageData:{data:e}}=t;const s=this.gamma,i=1/s[0],r=1/s[1],n=1/s[2];this.rgbValues||(this.rgbValues={r:new Uint8Array(256),g:new Uint8Array(256),b:new Uint8Array(256)});const o=this.rgbValues;for(let t=0;t<256;t++)o.r[t]=255*Math.pow(t/255,i),o.g[t]=255*Math.pow(t/255,r),o.b[t]=255*Math.pow(t/255,n);for(let t=0;tr[0]&&i>r[1]&&o>r[2]&&s`\n color += texture2D(uTexture, vTexCoord + ${t}) * uTaps[${e}] + texture2D(uTexture, vTexCoord - ${t}) * uTaps[${e}];\n sum += 2.0 * uTaps[${e}];\n `).join("\n")}\n gl_FragColor = color / sum;\n }\n `}applyToForWebgl(t){t.passes++,this.width=t.sourceWidth,this.horizontal=!0,this.dW=Math.round(this.width*this.scaleX),this.dH=t.sourceHeight,this.tempScale=this.dW/this.width,this.taps=this.getTaps(),t.destinationWidth=this.dW,super.applyTo(t),t.sourceWidth=t.destinationWidth,this.height=t.sourceHeight,this.horizontal=!1,this.dH=Math.round(this.height*this.scaleY),this.tempScale=this.dH/this.height,this.taps=this.getTaps(),t.destinationHeight=this.dH,super.applyTo(t),t.sourceHeight=t.destinationHeight}applyTo(t){Vo(t)?this.applyToForWebgl(t):this.applyTo2d(t)}isNeutralState(){return 1===this.scaleX&&1===this.scaleY}lanczosCreate(t){return e=>{if(e>=t||e<=-t)return 0;if(e<1.1920929e-7&&e>-1.1920929e-7)return 1;const s=(e*=Math.PI)/t;return Math.sin(e)/e*Math.sin(s)/s}}applyTo2d(t){const e=t.imageData,s=this.scaleX,i=this.scaleY;this.rcpScaleX=1/s,this.rcpScaleY=1/i;const r=e.width,n=e.height,o=Math.round(r*s),a=Math.round(n*i);let h;h="sliceHack"===this.resizeType?this.sliceByTwo(t,r,n,o,a):"hermite"===this.resizeType?this.hermiteFastResize(t,r,n,o,a):"bilinear"===this.resizeType?this.bilinearFiltering(t,r,n,o,a):"lanczos"===this.resizeType?this.lanczosResize(t,r,n,o,a):new ImageData(o,a),t.imageData=h}sliceByTwo(t,e,s,i,r){const n=t.imageData,o=.5;let a=!1,h=!1,l=e*o,c=s*o;const u=t.filterBackend.resources;let d=0,g=0;const f=e;let p=0;u.sliceByTwo||(u.sliceByTwo=dt());const m=u.sliceByTwo;(m.width<1.5*e||m.height=e)){D=Math.floor(1e3*Math.abs(x-m.x)),p[D]||(p[D]={});for(let t=v.y-f;t<=v.y+f;t++)t<0||t>=s||(M=Math.floor(1e3*Math.abs(t-m.y)),p[D][M]||(p[D][M]=h(Math.sqrt(Math.pow(D*u,2)+Math.pow(M*d,2))/1e3)),C=p[D][M],C>0&&(b=4*(t*e+x),S+=C,w+=C*n[b],T+=C*n[b+1],O+=C*n[b+2],k+=C*n[b+3]))}b=4*(_*i+y),a[b]=w/S,a[b+1]=T/S,a[b+2]=O/S,a[b+3]=k/S}return++y1&&n<-1||(c=2*n*n*n-3*n*n+1,c>0&&(s=4*(t+i*e),v+=c*l[s+3],g+=c,l[s+3]<255&&(c=c*l[s+3]/250),f+=c*l[s],p+=c*l[s+1],m+=c*l[s+2],d+=c))}}u[r]=f/d,u[r+1]=p/d,u[r+2]=m/d,u[r+3]=v/g}return c}}e(wa,"type","Resize"),e(wa,"defaults",{resizeType:"hermite",scaleX:1,scaleY:1,lanczosLobes:3}),e(wa,"uniformLocations",["uDelta","uTaps"]),J.setClass(wa);class Ta extends No{getFragmentSource(){return"\n precision highp float;\n uniform sampler2D uTexture;\n uniform float uSaturation;\n varying vec2 vTexCoord;\n void main() {\n vec4 color = texture2D(uTexture, vTexCoord);\n float rgMax = max(color.r, color.g);\n float rgbMax = max(rgMax, color.b);\n color.r += rgbMax != color.r ? (rgbMax - color.r) * uSaturation : 0.00;\n color.g += rgbMax != color.g ? (rgbMax - color.g) * uSaturation : 0.00;\n color.b += rgbMax != color.b ? (rgbMax - color.b) * uSaturation : 0.00;\n gl_FragColor = color;\n }\n"}applyTo2d(t){let{imageData:{data:e}}=t;const s=-this.saturation;for(let t=0;t{const s=ft({width:t,height:e}),i=dt().getContext("webgl"),r={imageBuffer:new ArrayBuffer(t*e*4)},n={destinationWidth:t,destinationHeight:e,targetCanvas:s};let o;o=g().performance.now(),uo.prototype.copyGLTo2D.call(r,i,n);const a=g().performance.now()-o;o=g().performance.now(),uo.prototype.copyGLTo2DPutImageData.call(r,i,n);return a>g().performance.now()-o},t.isWebGLPipelineState=Vo,t.loadSVGFromString=Po,t.loadSVGFromURL=function(t,e){let s=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};return fetch(t.replace(/^\n\s*/,"").trim(),{signal:s.signal}).then(t=>{if(!t.ok)throw new n(`HTTP error! status: ${t.status}`);return t.text()}).then(t=>Po(t,e,s)).catch(()=>({objects:[],elements:[],options:{},allElements:[]}))},t.parseSVGDocument=Mo,t.runningAnimations=Q,t.setEnv=t=>{c=t},t.setFilterBackend=function(t){go=t},t.util=Qr,t.version=m}); +!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports):"function"==typeof define&&define.amd?define(["exports"],e):e((t="undefined"!=typeof globalThis?globalThis:t||self).fabric={})}(this,function(t){"use strict";function e(t,e,s){return(e=function(t){var e=function(t,e){if("object"!=typeof t||!t)return t;var s=t[Symbol.toPrimitive];if(void 0!==s){var i=s.call(t,e);if("object"!=typeof i)return i;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===e?String:Number)(t)}(t,"string");return"symbol"==typeof e?e:e+""}(e))in t?Object.defineProperty(t,e,{value:s,enumerable:!0,configurable:!0,writable:!0}):t[e]=s,t}class s{constructor(){e(this,"browserShadowBlurConstant",1),e(this,"DPI",96),e(this,"devicePixelRatio","undefined"!=typeof window?window.devicePixelRatio:1),e(this,"perfLimitSizeTotal",2097152),e(this,"maxCacheSideLimit",4096),e(this,"minCacheSideLimit",256),e(this,"disableStyleCopyPaste",!1),e(this,"enableGLFiltering",!0),e(this,"textureSize",4096),e(this,"forceGLPutImageData",!1),e(this,"cachesBoundsOfCurve",!1),e(this,"fontPaths",{}),e(this,"NUM_FRACTION_DIGITS",4)}}const i=new class extends s{constructor(t){super(),this.configure(t)}configure(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};Object.assign(this,t)}addFonts(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};this.fontPaths={...this.fontPaths,...t}}removeFonts(){(arguments.length>0&&void 0!==arguments[0]?arguments[0]:[]).forEach(t=>{delete this.fontPaths[t]})}clearFonts(){this.fontPaths={}}restoreDefaults(t){const e=new s,i=(null==t?void 0:t.reduce((t,s)=>(t[s]=e[s],t),{}))||e;this.configure(i)}},r=function(t){for(var e=arguments.length,s=new Array(e>1?e-1:0),i=1;ithis.testPrecision(e,t)),e.getExtension("WEBGL_lose_context").loseContext(),r("log",`WebGL: max texture size ${this.maxTextureSize}`))}isSupported(t){return!!this.maxTextureSize&&this.maxTextureSize>=t}}const l={};let c;const u=()=>c||(c={document:document,window:window,isTouchSupported:"ontouchstart"in window||"ontouchstart"in document||window&&window.navigator&&window.navigator.maxTouchPoints>0,WebGLProbe:new h,dispose(){},copyPasteData:l}),d=()=>u().document,g=()=>u().window,f=()=>{var t;return Math.max(null!==(t=i.devicePixelRatio)&&void 0!==t?t:g().devicePixelRatio,1)};const p=new class{constructor(){e(this,"charWidthsCache",{}),e(this,"boundsOfCurveCache",{})}getFontCache(t){let{fontFamily:e,fontStyle:s,fontWeight:i}=t;e=e.toLowerCase(),this.charWidthsCache[e]||(this.charWidthsCache[e]={});const r=this.charWidthsCache[e],n=`${s.toLowerCase()}_${(i+"").toLowerCase()}`;return r[n]||(r[n]={}),r[n]}clearFontCache(t){(t=(t||"").toLowerCase())?this.charWidthsCache[t]&&delete this.charWidthsCache[t]:this.charWidthsCache={}}limitDimsByArea(t){const{perfLimitSizeTotal:e}=i,s=Math.sqrt(e*t);return[Math.floor(s),Math.floor(e/s)]}};const m="7.0.0-beta1";function v(){}const y=Math.PI/2,_=Math.PI/4,x=2*Math.PI,C=Math.PI/180,b=Object.freeze([1,0,0,1,0,0]),S=16,w=.4477152502,T="center",O="left",k="top",D="bottom",M="right",P="none",E=/\r?\n/,A="moving",j="scaling",F="rotating",L="rotate",I="skewing",R="resizing",B="modifyPoly",$="modifyPath",X="changed",Y="scale",W="scaleX",V="scaleY",G="skewX",z="skewY",H="fill",N="stroke",U="modified",q="json",K="svg";const J=new class{constructor(){this[q]=new Map,this[K]=new Map}has(t){return this[q].has(t)}getClass(t){const e=this[q].get(t);if(!e)throw new n(`No class registered for ${t}`);return e}setClass(t,e){e?this[q].set(e,t):(this[q].set(t.type,t),this[q].set(t.type.toLowerCase(),t))}getSVGClass(t){return this[K].get(t)}setSVGClass(t,e){this[K].set(null!=e?e:t.type.toLowerCase(),t)}};const Q=new class extends Array{remove(t){const e=this.indexOf(t);e>-1&&this.splice(e,1)}cancelAll(){const t=this.splice(0);return t.forEach(t=>t.abort()),t}cancelByCanvas(t){if(!t)return[];const e=this.filter(e=>{var s;return e.target===t||"object"==typeof e.target&&(null===(s=e.target)||void 0===s?void 0:s.canvas)===t});return e.forEach(t=>t.abort()),e}cancelByTarget(t){if(!t)return[];const e=this.filter(e=>e.target===t);return e.forEach(t=>t.abort()),e}};class Z{constructor(){e(this,"__eventListeners",{})}on(t,e){if(this.__eventListeners||(this.__eventListeners={}),"object"==typeof t)return Object.entries(t).forEach(t=>{let[e,s]=t;this.on(e,s)}),()=>this.off(t);if(e){const s=t;return this.__eventListeners[s]||(this.__eventListeners[s]=[]),this.__eventListeners[s].push(e),()=>this.off(s,e)}return()=>!1}once(t,e){if("object"==typeof t){const e=[];return Object.entries(t).forEach(t=>{let[s,i]=t;e.push(this.once(s,i))}),()=>e.forEach(t=>t())}if(e){const s=this.on(t,function(){for(var t=arguments.length,i=new Array(t),r=0;r!1}_removeEventListener(t,e){if(this.__eventListeners[t])if(e){const s=this.__eventListeners[t],i=s.indexOf(e);i>-1&&s.splice(i,1)}else this.__eventListeners[t]=[]}off(t,e){if(this.__eventListeners)if(void 0===t)for(const t in this.__eventListeners)this._removeEventListener(t);else"object"==typeof t?Object.entries(t).forEach(t=>{let[e,s]=t;this._removeEventListener(e,s)}):this._removeEventListener(t,e)}fire(t,e){var s;if(!this.__eventListeners)return;const i=null===(s=this.__eventListeners[t])||void 0===s?void 0:s.concat();if(i)for(let t=0;t{const s=t.indexOf(e);return-1!==s&&t.splice(s,1),t},et=t=>{if(0===t)return 1;switch(Math.abs(t)/y){case 1:case 3:return 0;case 2:return-1}return Math.cos(t)},st=t=>{if(0===t)return 0;const e=t/y,s=Math.sign(t);switch(e){case 1:return s;case 2:return 0;case 3:return-s}return Math.sin(t)};class it{constructor(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0,e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0;"object"==typeof t?(this.x=t.x,this.y=t.y):(this.x=t,this.y=e)}add(t){return new it(this.x+t.x,this.y+t.y)}addEquals(t){return this.x+=t.x,this.y+=t.y,this}scalarAdd(t){return new it(this.x+t,this.y+t)}scalarAddEquals(t){return this.x+=t,this.y+=t,this}subtract(t){return new it(this.x-t.x,this.y-t.y)}subtractEquals(t){return this.x-=t.x,this.y-=t.y,this}scalarSubtract(t){return new it(this.x-t,this.y-t)}scalarSubtractEquals(t){return this.x-=t,this.y-=t,this}multiply(t){return new it(this.x*t.x,this.y*t.y)}scalarMultiply(t){return new it(this.x*t,this.y*t)}scalarMultiplyEquals(t){return this.x*=t,this.y*=t,this}divide(t){return new it(this.x/t.x,this.y/t.y)}scalarDivide(t){return new it(this.x/t,this.y/t)}scalarDivideEquals(t){return this.x/=t,this.y/=t,this}eq(t){return this.x===t.x&&this.y===t.y}lt(t){return this.xt.x&&this.y>t.y}gte(t){return this.x>=t.x&&this.y>=t.y}lerp(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:.5;return e=Math.max(Math.min(1,e),0),new it(this.x+(t.x-this.x)*e,this.y+(t.y-this.y)*e)}distanceFrom(t){const e=this.x-t.x,s=this.y-t.y;return Math.sqrt(e*e+s*s)}midPointFrom(t){return this.lerp(t)}min(t){return new it(Math.min(this.x,t.x),Math.min(this.y,t.y))}max(t){return new it(Math.max(this.x,t.x),Math.max(this.y,t.y))}toString(){return`${this.x},${this.y}`}setXY(t,e){return this.x=t,this.y=e,this}setX(t){return this.x=t,this}setY(t){return this.y=t,this}setFromPoint(t){return this.x=t.x,this.y=t.y,this}swap(t){const e=this.x,s=this.y;this.x=t.x,this.y=t.y,t.x=e,t.y=s}clone(){return new it(this.x,this.y)}rotate(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:rt;const s=st(t),i=et(t),r=this.subtract(e);return new it(r.x*i-r.y*s,r.x*s+r.y*i).add(e)}transform(t){let e=arguments.length>1&&void 0!==arguments[1]&&arguments[1];return new it(t[0]*this.x+t[2]*this.y+(e?0:t[4]),t[1]*this.x+t[3]*this.y+(e?0:t[5]))}}const rt=new it(0,0),nt=t=>!!t&&Array.isArray(t._objects);function ot(t){class s extends t{constructor(){super(...arguments),e(this,"_objects",[])}_onObjectAdded(t){}_onObjectRemoved(t){}_onStackOrderChanged(t){}add(){for(var t=arguments.length,e=new Array(t),s=0;sthis._onObjectAdded(t)),i}insertAt(t){for(var e=arguments.length,s=new Array(e>1?e-1:0),i=1;ithis._onObjectAdded(t)),this._objects.length}remove(){const t=this._objects,e=[];for(var s=arguments.length,i=new Array(s),r=0;r{const i=t.indexOf(s);-1!==i&&(t.splice(i,1),e.push(s),this._onObjectRemoved(s))}),e}forEachObject(t){this.getObjects().forEach((e,s,i)=>t(e,s,i))}getObjects(){for(var t=arguments.length,e=new Array(t),s=0;st.isType(...e))}item(t){return this._objects[t]}isEmpty(){return 0===this._objects.length}size(){return this._objects.length}contains(t,e){return!!this._objects.includes(t)||!!e&&this._objects.some(e=>e instanceof s&&e.contains(t,!0))}complexity(){return this._objects.reduce((t,e)=>t+=e.complexity?e.complexity():0,0)}sendObjectToBack(t){return!(!t||t===this._objects[0])&&(tt(this._objects,t),this._objects.unshift(t),this._onStackOrderChanged(t),!0)}bringObjectToFront(t){return!(!t||t===this._objects[this._objects.length-1])&&(tt(this._objects,t),this._objects.push(t),this._onStackOrderChanged(t),!0)}sendObjectBackwards(t,e){if(!t)return!1;const s=this._objects.indexOf(t);if(0!==s){const i=this.findNewLowerIndex(t,s,e);return tt(this._objects,t),this._objects.splice(i,0,t),this._onStackOrderChanged(t),!0}return!1}bringObjectForward(t,e){if(!t)return!1;const s=this._objects.indexOf(t);if(s!==this._objects.length-1){const i=this.findNewUpperIndex(t,s,e);return tt(this._objects,t),this._objects.splice(i,0,t),this._onStackOrderChanged(t),!0}return!1}moveObjectTo(t,e){return t!==this._objects[e]&&(tt(this._objects,t),this._objects.splice(e,0,t),this._onStackOrderChanged(t),!0)}findNewLowerIndex(t,e,s){let i;if(s){i=e;for(let s=e-1;s>=0;--s)if(t.isOverlapping(this._objects[s])){i=s;break}}else i=e-1;return i}findNewUpperIndex(t,e,s){let i;if(s){i=e;for(let s=e+1;s1&&void 0!==arguments[1]?arguments[1]:{};const o=[],a=new it(e,s),h=a.add(new it(i,r));for(let t=this._objects.length-1;t>=0;t--){const e=this._objects[t];e.selectable&&e.visible&&(n&&e.intersectsWithRect(a,h)||e.isContainedWithinRect(a,h)||n&&e.containsPoint(a)||n&&e.containsPoint(h))&&o.push(e)}return o}}return s}class at extends Z{_setOptions(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};for(const e in t)this.set(e,t[e])}_setObject(t){for(const e in t)this._set(e,t[e])}set(t,e){return"object"==typeof t?this._setObject(t):this._set(t,e),this}_set(t,e){this[t]=e}toggle(t){const e=this.get(t);return"boolean"==typeof e&&this.set(t,!e),this}get(t){return this[t]}}function ht(t){return g().requestAnimationFrame(t)}function lt(t){return g().cancelAnimationFrame(t)}let ct=0;const ut=()=>ct++,dt=()=>{const t=d().createElement("canvas");if(!t||void 0===t.getContext)throw new n("Failed to create `canvas` element");return t},gt=()=>d().createElement("img"),ft=t=>{const e=dt();return e.width=t.width,e.height=t.height,e},pt=(t,e,s)=>t.toDataURL(`image/${e}`,s),mt=(t,e,s)=>new Promise((i,r)=>{t.toBlob(i,`image/${e}`,s)}),vt=t=>t*C,yt=t=>t/C,_t=t=>t.every((t,e)=>t===b[e]),xt=(t,e,s)=>new it(t).transform(e,s),Ct=t=>{const e=1/(t[0]*t[3]-t[1]*t[2]),s=[e*t[3],-e*t[1],-e*t[2],e*t[0],0,0],{x:i,y:r}=new it(t[4],t[5]).transform(s,!0);return s[4]=-i,s[5]=-r,s},bt=(t,e,s)=>[t[0]*e[0]+t[2]*e[1],t[1]*e[0]+t[3]*e[1],t[0]*e[2]+t[2]*e[3],t[1]*e[2]+t[3]*e[3],s?0:t[0]*e[4]+t[2]*e[5]+t[4],s?0:t[1]*e[4]+t[3]*e[5]+t[5]],St=(t,e)=>t.reduceRight((t,s)=>s&&t?bt(s,t,e):s||t,void 0)||b.concat(),wt=t=>{let[e,s]=t;return Math.atan2(s,e)},Tt=t=>{const e=wt(t),s=Math.pow(t[0],2)+Math.pow(t[1],2),i=Math.sqrt(s),r=(t[0]*t[3]-t[2]*t[1])/i,n=Math.atan2(t[0]*t[2]+t[1]*t[3],s);return{angle:yt(e),scaleX:i,scaleY:r,skewX:yt(n),skewY:0,translateX:t[4]||0,translateY:t[5]||0}},Ot=function(t){return[1,0,0,1,t,arguments.length>1&&void 0!==arguments[1]?arguments[1]:0]};function kt(){let{angle:t=0}=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},{x:e=0,y:s=0}=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};const i=vt(t),r=et(i),n=st(i);return[r,n,-n,r,e?e-(r*e-n*s):0,s?s-(n*e+r*s):0]}const Dt=function(t){return[t,0,0,arguments.length>1&&void 0!==arguments[1]?arguments[1]:t,0,0]},Mt=t=>Math.tan(vt(t)),Pt=t=>[1,0,Mt(t),1,0,0],Et=t=>[1,Mt(t),0,1,0,0],At=t=>{let{scaleX:e=1,scaleY:s=1,flipX:i=!1,flipY:r=!1,skewX:n=0,skewY:o=0}=t,a=Dt(i?-e:e,r?-s:s);return n&&(a=bt(a,Pt(n),!0)),o&&(a=bt(a,Et(o),!0)),a},jt=t=>{const{translateX:e=0,translateY:s=0,angle:i=0}=t;let r=Ot(e,s);i&&(r=bt(r,kt({angle:i})));const n=At(t);return _t(n)||(r=bt(r,n)),r},Ft=function(t){let{signal:e,crossOrigin:s=null}=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return new Promise(function(i,r){if(e&&e.aborted)return r(new o("loadImage"));const a=gt();let h;e&&(h=function(t){a.src="",r(t)},e.addEventListener("abort",h,{once:!0}));const l=function(){a.onload=a.onerror=null,h&&(null==e||e.removeEventListener("abort",h)),i(a)};t?(a.onload=l,a.onerror=function(){h&&(null==e||e.removeEventListener("abort",h)),r(new n(`Error loading ${a.src}`))},s&&(a.crossOrigin=s),a.src=t):l()})},Lt=function(t){let{signal:e,reviver:s=v}=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return new Promise((i,r)=>{const n=[];e&&e.addEventListener("abort",r,{once:!0}),Promise.all(t.map(t=>J.getClass(t.type).fromObject(t,{signal:e}).then(e=>(s(t,e),n.push(e),e)))).then(i).catch(t=>{n.forEach(t=>{t.dispose&&t.dispose()}),r(t)}).finally(()=>{e&&e.removeEventListener("abort",r)})})},It=function(t){let{signal:e}=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return new Promise((s,i)=>{const r=[];e&&e.addEventListener("abort",i,{once:!0});const n=Object.values(t).map(t=>t&&t.type&&J.has(t.type)?Lt([t],{signal:e}).then(t=>{let[e]=t;return r.push(e),e}):t),o=Object.keys(t);Promise.all(n).then(t=>t.reduce((t,e,s)=>(t[o[s]]=e,t),{})).then(s).catch(t=>{r.forEach(t=>{t.dispose&&t.dispose()}),i(t)}).finally(()=>{e&&e.removeEventListener("abort",i)})})},Rt=function(t){return(arguments.length>1&&void 0!==arguments[1]?arguments[1]:[]).reduce((e,s)=>(s in t&&(e[s]=t[s]),e),{})},Bt=(t,e)=>Object.keys(t).reduce((s,i)=>(e(t[i],i,t)&&(s[i]=t[i]),s),{}),$t=(t,e)=>parseFloat(Number(t).toFixed(e)),Xt=t=>"matrix("+t.map(t=>$t(t,i.NUM_FRACTION_DIGITS)).join(" ")+")",Yt=t=>!!t&&void 0!==t.toLive,Wt=t=>!!t&&"function"==typeof t.toObject,Vt=t=>!!t&&void 0!==t.offsetX&&"source"in t,Gt=t=>!!t&&"multiSelectionStacking"in t;function zt(t){const e=t&&Ht(t);let s=0,i=0;if(!t||!e)return{left:s,top:i};let r=t;const n=e.documentElement,o=e.body||{scrollLeft:0,scrollTop:0};for(;r&&(r.parentNode||r.host)&&(r=r.parentNode||r.host,r===e?(s=o.scrollLeft||n.scrollLeft||0,i=o.scrollTop||n.scrollTop||0):(s+=r.scrollLeft||0,i+=r.scrollTop||0),1!==r.nodeType||"fixed"!==r.style.position););return{left:s,top:i}}const Ht=t=>t.ownerDocument||null,Nt=t=>{var e;return(null===(e=t.ownerDocument)||void 0===e?void 0:e.defaultView)||null},Ut=function(t,e,s){let{width:i,height:r}=s,n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:1;t.width=i,t.height=r,n>1&&(t.setAttribute("width",(i*n).toString()),t.setAttribute("height",(r*n).toString()),e.scale(n,n))},qt=(t,e)=>{let{width:s,height:i}=e;s&&(t.style.width="number"==typeof s?`${s}px`:s),i&&(t.style.height="number"==typeof i?`${i}px`:i)};function Kt(t){return void 0!==t.onselectstart&&(t.onselectstart=()=>!1),t.style.userSelect=P,t}class Jt{constructor(t){e(this,"_originalCanvasStyle",void 0),e(this,"lower",void 0);const s=this.createLowerCanvas(t);this.lower={el:s,ctx:s.getContext("2d")}}createLowerCanvas(t){const e=(s=t)&&void 0!==s.getContext?t:t&&d().getElementById(t)||dt();var s;if(e.hasAttribute("data-fabric"))throw new n("Trying to initialize a canvas that has already been initialized. Did you forget to dispose the canvas?");return this._originalCanvasStyle=e.style.cssText,e.setAttribute("data-fabric","main"),e.classList.add("lower-canvas"),e}cleanupDOM(t){let{width:e,height:s}=t;const{el:i}=this.lower;i.classList.remove("lower-canvas"),i.removeAttribute("data-fabric"),i.setAttribute("width",`${e}`),i.setAttribute("height",`${s}`),i.style.cssText=this._originalCanvasStyle||"",this._originalCanvasStyle=void 0}setDimensions(t,e){const{el:s,ctx:i}=this.lower;Ut(s,i,t,e)}setCSSDimensions(t){qt(this.lower.el,t)}calcOffset(){return function(t){var e;const s=t&&Ht(t),i={left:0,top:0};if(!s)return i;const r=(null===(e=Nt(t))||void 0===e?void 0:e.getComputedStyle(t,null))||{};i.left+=parseInt(r.borderLeftWidth,10)||0,i.top+=parseInt(r.borderTopWidth,10)||0,i.left+=parseInt(r.paddingLeft,10)||0,i.top+=parseInt(r.paddingTop,10)||0;let n={left:0,top:0};const o=s.documentElement;void 0!==t.getBoundingClientRect&&(n=t.getBoundingClientRect());const a=zt(t);return{left:n.left+a.left-(o.clientLeft||0)+i.left,top:n.top+a.top-(o.clientTop||0)+i.top}}(this.lower.el)}dispose(){u().dispose(this.lower.el),delete this.lower}}const Qt={backgroundVpt:!0,backgroundColor:"",overlayVpt:!0,overlayColor:"",includeDefaultValues:!0,svgViewportTransformation:!0,renderOnAddRemove:!0,skipOffscreen:!0,enableRetinaScaling:!0,imageSmoothingEnabled:!0,controlsAboveOverlay:!1,allowTouchScrolling:!1,viewportTransform:[...b]};class Zt extends(ot(at)){get lowerCanvasEl(){var t;return null===(t=this.elements.lower)||void 0===t?void 0:t.el}get contextContainer(){var t;return null===(t=this.elements.lower)||void 0===t?void 0:t.ctx}static getDefaults(){return Zt.ownDefaults}constructor(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};super(),Object.assign(this,this.constructor.getDefaults()),this.set(e),this.initElements(t),this._setDimensionsImpl({width:this.width||this.elements.lower.el.width||0,height:this.height||this.elements.lower.el.height||0}),this.skipControlsDrawing=!1,this.viewportTransform=[...this.viewportTransform],this.calcViewportBoundaries()}initElements(t){this.elements=new Jt(t)}add(){const t=super.add(...arguments);return arguments.length>0&&this.renderOnAddRemove&&this.requestRenderAll(),t}insertAt(t){for(var e=arguments.length,s=new Array(e>1?e-1:0),i=1;i0&&this.renderOnAddRemove&&this.requestRenderAll(),r}remove(){const t=super.remove(...arguments);return t.length>0&&this.renderOnAddRemove&&this.requestRenderAll(),t}_onObjectAdded(t){t.canvas&&t.canvas!==this&&(r("warn","Canvas is trying to add an object that belongs to a different canvas.\nResulting to default behavior: removing object from previous canvas and adding to new canvas"),t.canvas.remove(t)),t._set("canvas",this),t.setCoords(),this.fire("object:added",{target:t}),t.fire("added",{target:this})}_onObjectRemoved(t){t._set("canvas",void 0),this.fire("object:removed",{target:t}),t.fire("removed",{target:this})}_onStackOrderChanged(){this.renderOnAddRemove&&this.requestRenderAll()}getRetinaScaling(){return this.enableRetinaScaling?f():1}calcOffset(){return this._offset=this.elements.calcOffset()}getWidth(){return this.width}getHeight(){return this.height}_setDimensionsImpl(t){let{cssOnly:e=!1,backstoreOnly:s=!1}=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if(!e){const e={width:this.width,height:this.height,...t};this.elements.setDimensions(e,this.getRetinaScaling()),this.hasLostContext=!0,this.width=e.width,this.height=e.height}s||this.elements.setCSSDimensions(t),this.calcOffset()}setDimensions(t,e){this._setDimensionsImpl(t,e),e&&e.cssOnly||this.requestRenderAll()}getZoom(){return this.viewportTransform[0]}setViewportTransform(t){this.viewportTransform=t,this.calcViewportBoundaries(),this.renderOnAddRemove&&this.requestRenderAll()}zoomToPoint(t,e){const s=t,i=[...this.viewportTransform],r=xt(t,Ct(i));i[0]=e,i[3]=e;const n=xt(r,i);i[4]+=s.x-n.x,i[5]+=s.y-n.y,this.setViewportTransform(i)}setZoom(t){this.zoomToPoint(new it(0,0),t)}absolutePan(t){const e=[...this.viewportTransform];return e[4]=-t.x,e[5]=-t.y,this.setViewportTransform(e)}relativePan(t){return this.absolutePan(new it(-t.x-this.viewportTransform[4],-t.y-this.viewportTransform[5]))}getElement(){return this.elements.lower.el}clearContext(t){t.clearRect(0,0,this.width,this.height)}getContext(){return this.elements.lower.ctx}clear(){this.remove(...this.getObjects()),this.backgroundImage=void 0,this.overlayImage=void 0,this.backgroundColor="",this.overlayColor="",this.clearContext(this.getContext()),this.fire("canvas:cleared"),this.renderOnAddRemove&&this.requestRenderAll()}renderAll(){this.cancelRequestedRender(),this.destroyed||this.renderCanvas(this.getContext(),this._objects)}renderAndReset(){this.nextRenderHandle=0,this.renderAll()}requestRenderAll(){this.nextRenderHandle||this.disposed||this.destroyed||(this.nextRenderHandle=ht(()=>this.renderAndReset()))}calcViewportBoundaries(){const t=this.width,e=this.height,s=Ct(this.viewportTransform),i=xt({x:0,y:0},s),r=xt({x:t,y:e},s),n=i.min(r),o=i.max(r);return this.vptCoords={tl:n,tr:new it(o.x,n.y),bl:new it(n.x,o.y),br:o}}cancelRequestedRender(){this.nextRenderHandle&&(lt(this.nextRenderHandle),this.nextRenderHandle=0)}drawControls(t){}renderCanvas(t,e){if(this.destroyed)return;const s=this.viewportTransform,i=this.clipPath;this.calcViewportBoundaries(),this.clearContext(t),t.imageSmoothingEnabled=this.imageSmoothingEnabled,t.patternQuality="best",this.fire("before:render",{ctx:t}),this._renderBackground(t),t.save(),t.transform(s[0],s[1],s[2],s[3],s[4],s[5]),this._renderObjects(t,e),t.restore(),this.controlsAboveOverlay||this.skipControlsDrawing||this.drawControls(t),i&&(i._set("canvas",this),i.shouldCache(),i._transformDone=!0,i.renderCache({forClipping:!0}),this.drawClipPathOnCanvas(t,i)),this._renderOverlay(t),this.controlsAboveOverlay&&!this.skipControlsDrawing&&this.drawControls(t),this.fire("after:render",{ctx:t}),this.__cleanupTask&&(this.__cleanupTask(),this.__cleanupTask=void 0)}drawClipPathOnCanvas(t,e){const s=this.viewportTransform;t.save(),t.transform(...s),t.globalCompositeOperation="destination-in",e.transform(t),t.scale(1/e.zoomX,1/e.zoomY),t.drawImage(e._cacheCanvas,-e.cacheTranslationX,-e.cacheTranslationY),t.restore()}_renderObjects(t,e){for(let s=0,i=e.length;s!t.excludeFromExport).map(s=>this._toObject(s,t,e)),...this.__serializeBgOverlay(t,e),...i?{clipPath:i}:null}}_toObject(t,e,s){let i;this.includeDefaultValues||(i=t.includeDefaultValues,t.includeDefaultValues=!1);const r=t[e](s);return this.includeDefaultValues||(t.includeDefaultValues=!!i),r}__serializeBgOverlay(t,e){const s={},i=this.backgroundImage,r=this.overlayImage,n=this.backgroundColor,o=this.overlayColor;return Yt(n)?n.excludeFromExport||(s.background=n.toObject(e)):n&&(s.background=n),Yt(o)?o.excludeFromExport||(s.overlay=o.toObject(e)):o&&(s.overlay=o),i&&!i.excludeFromExport&&(s.backgroundImage=this._toObject(i,t,e)),r&&!r.excludeFromExport&&(s.overlayImage=this._toObject(r,t,e)),s}toSVG(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},e=arguments.length>1?arguments[1]:void 0;t.reviver=e;const s=[];return this._setSVGPreamble(s,t),this._setSVGHeader(s,t),this.clipPath&&s.push(`\n`),this._setSVGBgOverlayColor(s,"background"),this._setSVGBgOverlayImage(s,"backgroundImage",e),this._setSVGObjects(s,e),this.clipPath&&s.push("\n"),this._setSVGBgOverlayColor(s,"overlay"),this._setSVGBgOverlayImage(s,"overlayImage",e),s.push(""),s.join("")}_setSVGPreamble(t,e){e.suppressPreamble||t.push('\n','\n')}_setSVGHeader(t,e){const s=e.width||`${this.width}`,r=e.height||`${this.height}`,n=i.NUM_FRACTION_DIGITS,o=e.viewBox;let a;if(o)a=`viewBox="${o.x} ${o.y} ${o.width} ${o.height}" `;else if(this.svgViewportTransformation){const t=this.viewportTransform;a=`viewBox="${$t(-t[4]/t[0],n)} ${$t(-t[5]/t[3],n)} ${$t(this.width/t[0],n)} ${$t(this.height/t[3],n)}" `}else a=`viewBox="0 0 ${this.width} ${this.height}" `;t.push("\n',"Created with Fabric.js ",m,"\n","\n",this.createSVGFontFacesMarkup(),this.createSVGRefElementsMarkup(),this.createSVGClipPathMarkup(e),"\n")}createSVGClipPathMarkup(t){const e=this.clipPath;return e?(e.clipPathId=`CLIPPATH_${ut()}`,`\n${e.toClipPathSVG(t.reviver)}\n`):""}createSVGRefElementsMarkup(){return["background","overlay"].map(t=>{const e=this[`${t}Color`];if(Yt(e)){const s=this[`${t}Vpt`],i=this.viewportTransform,r={isType:()=>!1,width:this.width/(s?i[0]:1),height:this.height/(s?i[3]:1)};return e.toSVG(r,{additionalTransform:s?Xt(i):""})}}).join("")}createSVGFontFacesMarkup(){const t=[],e={},s=i.fontPaths;this._objects.forEach(function e(s){t.push(s),nt(s)&&s._objects.forEach(e)}),t.forEach(t=>{if(!(i=t)||"function"!=typeof i._renderText)return;var i;const{styles:r,fontFamily:n}=t;!e[n]&&s[n]&&(e[n]=!0,r&&Object.values(r).forEach(t=>{Object.values(t).forEach(t=>{let{fontFamily:i=""}=t;!e[i]&&s[i]&&(e[i]=!0)})}))});const r=Object.keys(e).map(t=>`\t\t@font-face {\n\t\t\tfont-family: '${t}';\n\t\t\tsrc: url('${s[t]}');\n\t\t}\n`).join("");return r?`\t\n`:""}_setSVGObjects(t,e){this.forEachObject(s=>{s.excludeFromExport||this._setSVGObject(t,s,e)})}_setSVGObject(t,e,s){t.push(e.toSVG(s))}_setSVGBgOverlayImage(t,e,s){const i=this[e];i&&!i.excludeFromExport&&i.toSVG&&t.push(i.toSVG(s))}_setSVGBgOverlayColor(t,e){const s=this[`${e}Color`];if(s)if(Yt(s)){const i=s.repeat||"",r=this.width,n=this.height,o=this[`${e}Vpt`]?Xt(Ct(this.viewportTransform)):"";t.push(`\n`)}else t.push('\n")}loadFromJSON(t,e){let{signal:s}=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};if(!t)return Promise.reject(new n("`json` is undefined"));const{objects:i=[],...r}="string"==typeof t?JSON.parse(t):t,{backgroundImage:o,background:a,overlayImage:h,overlay:l,clipPath:c}=r,u=this.renderOnAddRemove;return this.renderOnAddRemove=!1,Promise.all([Lt(i,{reviver:e,signal:s}),It({backgroundImage:o,backgroundColor:a,overlayImage:h,overlayColor:l,clipPath:c},{signal:s})]).then(t=>{let[e,s]=t;return this.clear(),this.add(...e),this.set(r),this.set(s),this.renderOnAddRemove=u,this})}clone(t){const e=this.toObject(t);return this.cloneWithoutData().loadFromJSON(e)}cloneWithoutData(){const t=ft(this);return new this.constructor(t)}toDataURL(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};const{format:e="png",quality:s=1,multiplier:i=1,enableRetinaScaling:r=!1}=t,n=i*(r?this.getRetinaScaling():1);return pt(this.toCanvasElement(n,t),e,s)}toBlob(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};const{format:e="png",quality:s=1,multiplier:i=1,enableRetinaScaling:r=!1}=t,n=i*(r?this.getRetinaScaling():1);return mt(this.toCanvasElement(n,t),e,s)}toCanvasElement(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:1,{width:e,height:s,left:i,top:r,filter:n}=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};const o=(e||this.width)*t,a=(s||this.height)*t,h=this.getZoom(),l=this.width,c=this.height,u=this.skipControlsDrawing,d=h*t,g=this.viewportTransform,f=[d,0,0,d,(g[4]-(i||0))*t,(g[5]-(r||0))*t],p=this.enableRetinaScaling,m=ft({width:o,height:a}),v=n?this._objects.filter(t=>n(t)):this._objects;return this.enableRetinaScaling=!1,this.viewportTransform=f,this.width=o,this.height=a,this.skipControlsDrawing=!0,this.calcViewportBoundaries(),this.renderCanvas(m.getContext("2d"),v),this.viewportTransform=g,this.width=l,this.height=c,this.calcViewportBoundaries(),this.enableRetinaScaling=p,this.skipControlsDrawing=u,m}dispose(){return!this.disposed&&this.elements.cleanupDOM({width:this.width,height:this.height}),Q.cancelByCanvas(this),this.disposed=!0,new Promise((t,e)=>{const s=()=>{this.destroy(),t(!0)};s.kill=e,this.__cleanupTask&&this.__cleanupTask.kill("aborted"),this.destroyed?t(!1):this.nextRenderHandle?this.__cleanupTask=s:s()})}destroy(){this.destroyed=!0,this.cancelRequestedRender(),this.forEachObject(t=>t.dispose()),this._objects=[],this.backgroundImage&&this.backgroundImage.dispose(),this.backgroundImage=void 0,this.overlayImage&&this.overlayImage.dispose(),this.overlayImage=void 0,this.elements.dispose()}toString(){return`#`}}e(Zt,"ownDefaults",Qt);const te=["touchstart","touchmove","touchend"];const ee=t=>{const e=zt(t.target),s=function(t){const e=t.changedTouches;return e&&e[0]?e[0]:t}(t);return new it(s.clientX+e.left,s.clientY+e.top)},se=t=>te.includes(t.type)||"touch"===t.pointerType,ie=t=>{t.preventDefault(),t.stopPropagation()},re=t=>{let e=0,s=0,i=0,r=0;for(let n=0,o=t.length;ni||!n)&&(i=o),(or||!n)&&(r=a),(aoe(t,bt(e,t.calcOwnMatrix())),oe=(t,e)=>{const{translateX:s,translateY:i,scaleX:r,scaleY:n,...o}=Tt(e),a=new it(s,i);t.flipX=!1,t.flipY=!1,Object.assign(t,o),t.set({scaleX:r,scaleY:n}),t.setPositionByOrigin(a,T,T)},ae=t=>{t.scaleX=1,t.scaleY=1,t.skewX=0,t.skewY=0,t.flipX=!1,t.flipY=!1,t.rotate(0)},he=t=>({scaleX:t.scaleX,scaleY:t.scaleY,skewX:t.skewX,skewY:t.skewY,angle:t.angle,left:t.left,flipX:t.flipX,flipY:t.flipY,top:t.top}),le=(t,e,s)=>{const i=t/2,r=e/2,n=[new it(-i,-r),new it(i,-r),new it(-i,r),new it(i,r)].map(t=>t.transform(s)),o=re(n);return new it(o.width,o.height)},ce=function(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:b;return bt(Ct(arguments.length>1&&void 0!==arguments[1]?arguments[1]:b),t)},ue=function(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:b,s=arguments.length>2&&void 0!==arguments[2]?arguments[2]:b;return t.transform(ce(e,s))},de=function(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:b,s=arguments.length>2&&void 0!==arguments[2]?arguments[2]:b;return t.transform(ce(e,s),!0)},ge=(t,e,s)=>{const i=ce(e,s);return oe(t,bt(i,t.calcOwnMatrix())),i},fe=(t,e)=>{var s;const{transform:{target:i}}=e;null===(s=i.canvas)||void 0===s||s.fire(`object:${t}`,{...e,target:i}),i.fire(t,e)},pe={left:-.5,top:-.5,center:0,bottom:.5,right:.5},me=t=>"string"==typeof t?pe[t]:t-.5,ve=new it(1,0),ye=new it,_e=(t,e)=>t.rotate(e),xe=(t,e)=>new it(e).subtract(t),Ce=t=>t.distanceFrom(ye),be=(t,e)=>Math.atan2(Oe(t,e),ke(t,e)),Se=t=>be(ve,t),we=t=>t.eq(ye)?t:t.scalarDivide(Ce(t)),Te=function(t){let e=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];return we(new it(-t.y,t.x).scalarMultiply(e?1:-1))},Oe=(t,e)=>t.x*e.y-t.y*e.x,ke=(t,e)=>t.x*e.x+t.y*e.y,De=(t,e,s)=>{if(t.eq(e)||t.eq(s))return!0;const i=Oe(e,s),r=Oe(e,t),n=Oe(s,t);return i>=0?r>=0&&n<=0:!(r<=0&&n>=0)},Me="not-allowed";function Pe(t){return me(t.originX)===me(T)&&me(t.originY)===me(T)}function Ee(t){return.5-me(t)}const Ae=(t,e)=>t[e],je=(t,e,s,i)=>({e:t,transform:e,pointer:new it(s,i)});function Fe(t,e,s){const i=s,r=ue(t.getCenterPoint(),t.canvas.viewportTransform,void 0),n=Se(xe(r,i))+x;return Math.round(n%x/_)}function Le(t,e,s,i,r){var n;let{target:o,corner:a}=t;const h=o.controls[a],l=(null===(n=o.canvas)||void 0===n?void 0:n.getZoom())||1,c=o.padding/l,u=function(t,e,s,i){const r=t.getRelativeCenterPoint(),n=void 0!==s&&void 0!==i?t.translateToGivenOrigin(r,T,T,s,i):new it(t.left,t.top);return(t.angle?e.rotate(-vt(t.angle),r):e).subtract(n)}(o,new it(i,r),e,s);return u.x>=c&&(u.x-=c),u.x<=-c&&(u.x+=c),u.y>=c&&(u.y-=c),u.y<=c&&(u.y+=c),u.x-=h.offsetX,u.y-=h.offsetY,u}const Ie=(t,e,s,i)=>{const{target:r,offsetX:n,offsetY:o}=e,a=s-n,h=i-o,l=!Ae(r,"lockMovementX")&&r.left!==a,c=!Ae(r,"lockMovementY")&&r.top!==h;return l&&r.set(O,a),c&&r.set(k,h),(l||c)&&fe(A,je(t,e,s,i)),l||c},Re={aliceblue:"#F0F8FF",antiquewhite:"#FAEBD7",aqua:"#0FF",aquamarine:"#7FFFD4",azure:"#F0FFFF",beige:"#F5F5DC",bisque:"#FFE4C4",black:"#000",blanchedalmond:"#FFEBCD",blue:"#00F",blueviolet:"#8A2BE2",brown:"#A52A2A",burlywood:"#DEB887",cadetblue:"#5F9EA0",chartreuse:"#7FFF00",chocolate:"#D2691E",coral:"#FF7F50",cornflowerblue:"#6495ED",cornsilk:"#FFF8DC",crimson:"#DC143C",cyan:"#0FF",darkblue:"#00008B",darkcyan:"#008B8B",darkgoldenrod:"#B8860B",darkgray:"#A9A9A9",darkgrey:"#A9A9A9",darkgreen:"#006400",darkkhaki:"#BDB76B",darkmagenta:"#8B008B",darkolivegreen:"#556B2F",darkorange:"#FF8C00",darkorchid:"#9932CC",darkred:"#8B0000",darksalmon:"#E9967A",darkseagreen:"#8FBC8F",darkslateblue:"#483D8B",darkslategray:"#2F4F4F",darkslategrey:"#2F4F4F",darkturquoise:"#00CED1",darkviolet:"#9400D3",deeppink:"#FF1493",deepskyblue:"#00BFFF",dimgray:"#696969",dimgrey:"#696969",dodgerblue:"#1E90FF",firebrick:"#B22222",floralwhite:"#FFFAF0",forestgreen:"#228B22",fuchsia:"#F0F",gainsboro:"#DCDCDC",ghostwhite:"#F8F8FF",gold:"#FFD700",goldenrod:"#DAA520",gray:"#808080",grey:"#808080",green:"#008000",greenyellow:"#ADFF2F",honeydew:"#F0FFF0",hotpink:"#FF69B4",indianred:"#CD5C5C",indigo:"#4B0082",ivory:"#FFFFF0",khaki:"#F0E68C",lavender:"#E6E6FA",lavenderblush:"#FFF0F5",lawngreen:"#7CFC00",lemonchiffon:"#FFFACD",lightblue:"#ADD8E6",lightcoral:"#F08080",lightcyan:"#E0FFFF",lightgoldenrodyellow:"#FAFAD2",lightgray:"#D3D3D3",lightgrey:"#D3D3D3",lightgreen:"#90EE90",lightpink:"#FFB6C1",lightsalmon:"#FFA07A",lightseagreen:"#20B2AA",lightskyblue:"#87CEFA",lightslategray:"#789",lightslategrey:"#789",lightsteelblue:"#B0C4DE",lightyellow:"#FFFFE0",lime:"#0F0",limegreen:"#32CD32",linen:"#FAF0E6",magenta:"#F0F",maroon:"#800000",mediumaquamarine:"#66CDAA",mediumblue:"#0000CD",mediumorchid:"#BA55D3",mediumpurple:"#9370DB",mediumseagreen:"#3CB371",mediumslateblue:"#7B68EE",mediumspringgreen:"#00FA9A",mediumturquoise:"#48D1CC",mediumvioletred:"#C71585",midnightblue:"#191970",mintcream:"#F5FFFA",mistyrose:"#FFE4E1",moccasin:"#FFE4B5",navajowhite:"#FFDEAD",navy:"#000080",oldlace:"#FDF5E6",olive:"#808000",olivedrab:"#6B8E23",orange:"#FFA500",orangered:"#FF4500",orchid:"#DA70D6",palegoldenrod:"#EEE8AA",palegreen:"#98FB98",paleturquoise:"#AFEEEE",palevioletred:"#DB7093",papayawhip:"#FFEFD5",peachpuff:"#FFDAB9",peru:"#CD853F",pink:"#FFC0CB",plum:"#DDA0DD",powderblue:"#B0E0E6",purple:"#800080",rebeccapurple:"#639",red:"#F00",rosybrown:"#BC8F8F",royalblue:"#4169E1",saddlebrown:"#8B4513",salmon:"#FA8072",sandybrown:"#F4A460",seagreen:"#2E8B57",seashell:"#FFF5EE",sienna:"#A0522D",silver:"#C0C0C0",skyblue:"#87CEEB",slateblue:"#6A5ACD",slategray:"#708090",slategrey:"#708090",snow:"#FFFAFA",springgreen:"#00FF7F",steelblue:"#4682B4",tan:"#D2B48C",teal:"#008080",thistle:"#D8BFD8",tomato:"#FF6347",turquoise:"#40E0D0",violet:"#EE82EE",wheat:"#F5DEB3",white:"#FFF",whitesmoke:"#F5F5F5",yellow:"#FF0",yellowgreen:"#9ACD32"},Be=(t,e,s)=>(s<0&&(s+=1),s>1&&(s-=1),s<1/6?t+6*(e-t)*s:s<.5?e:s<2/3?t+(e-t)*(2/3-s)*6:t),$e=(t,e,s,i)=>{t/=255,e/=255,s/=255;const r=Math.max(t,e,s),n=Math.min(t,e,s);let o,a;const h=(r+n)/2;if(r===n)o=a=0;else{const i=r-n;switch(a=h>.5?i/(2-r-n):i/(r+n),r){case t:o=(e-s)/i+(e0&&void 0!==arguments[0]?arguments[0]:"1";return parseFloat(t)/(t.endsWith("%")?100:1)},Ye=t=>Math.min(Math.round(t),255).toString(16).toUpperCase().padStart(2,"0"),We=t=>{let[e,s,i,r=1]=t;const n=Math.round(.3*e+.59*s+.11*i);return[n,n,n,r]};class Ve{constructor(t){if(e(this,"isUnrecognised",!1),t)if(t instanceof Ve)this.setSource([...t._source]);else if(Array.isArray(t)){const[e,s,i,r=1]=t;this.setSource([e,s,i,r])}else this.setSource(this._tryParsingColor(t));else this.setSource([0,0,0,1])}_tryParsingColor(t){return(t=t.toLowerCase())in Re&&(t=Re[t]),"transparent"===t?[255,255,255,0]:Ve.sourceFromHex(t)||Ve.sourceFromRgb(t)||Ve.sourceFromHsl(t)||(this.isUnrecognised=!0)&&[0,0,0,1]}getSource(){return this._source}setSource(t){this._source=t}toRgb(){const[t,e,s]=this.getSource();return`rgb(${t},${e},${s})`}toRgba(){return`rgba(${this.getSource().join(",")})`}toHsl(){const[t,e,s]=$e(...this.getSource());return`hsl(${t},${e}%,${s}%)`}toHsla(){const[t,e,s,i]=$e(...this.getSource());return`hsla(${t},${e}%,${s}%,${i})`}toHex(){return this.toHexa().slice(0,6)}toHexa(){const[t,e,s,i]=this.getSource();return`${Ye(t)}${Ye(e)}${Ye(s)}${Ye(Math.round(255*i))}`}getAlpha(){return this.getSource()[3]}setAlpha(t){return this._source[3]=t,this}toGrayscale(){return this.setSource(We(this.getSource())),this}toBlackWhite(t){const[e,,,s]=We(this.getSource()),i=e<(t||127)?0:255;return this.setSource([i,i,i,s]),this}overlayWith(t){t instanceof Ve||(t=new Ve(t));const e=this.getSource(),s=t.getSource(),[i,r,n]=e.map((t,e)=>Math.round(.5*t+.5*s[e]));return this.setSource([i,r,n,e[3]]),this}static fromRgb(t){return Ve.fromRgba(t)}static fromRgba(t){return new Ve(Ve.sourceFromRgb(t))}static sourceFromRgb(t){const e=t.match(/^rgba?\(\s*(\d{0,3}(?:\.\d+)?%?)\s*[\s|,]\s*(\d{0,3}(?:\.\d+)?%?)\s*[\s|,]\s*(\d{0,3}(?:\.\d+)?%?)\s*(?:\s*[,/]\s*(\d{0,3}(?:\.\d+)?%?)\s*)?\)$/i);if(e){const[t,s,i]=e.slice(1,4).map(t=>{const e=parseFloat(t);return t.endsWith("%")?Math.round(2.55*e):e});return[t,s,i,Xe(e[4])]}}static fromHsl(t){return Ve.fromHsla(t)}static fromHsla(t){return new Ve(Ve.sourceFromHsl(t))}static sourceFromHsl(t){const e=t.match(/^hsla?\(\s*([+-]?\d{0,3}(?:\.\d+)?(?:deg|turn|rad)?)\s*[\s|,]\s*(\d{0,3}(?:\.\d+)?%?)\s*[\s|,]\s*(\d{0,3}(?:\.\d+)?%?)\s*(?:\s*[,/]\s*(\d*(?:\.\d+)?%?)\s*)?\)$/i);if(!e)return;const s=(Ve.parseAngletoDegrees(e[1])%360+360)%360/360,i=parseFloat(e[2])/100,r=parseFloat(e[3])/100;let n,o,a;if(0===i)n=o=a=r;else{const t=r<=.5?r*(i+1):r+i-r*i,e=2*r-t;n=Be(e,t,s+1/3),o=Be(e,t,s),a=Be(e,t,s-1/3)}return[Math.round(255*n),Math.round(255*o),Math.round(255*a),Xe(e[4])]}static fromHex(t){return new Ve(Ve.sourceFromHex(t))}static sourceFromHex(t){if(t.match(/^#?(([0-9a-f]){3,4}|([0-9a-f]{2}){3,4})$/i)){const e=t.slice(t.indexOf("#")+1);let s;s=e.length<=4?e.split("").map(t=>t+t):e.match(/.{2}/g);const[i,r,n,o=255]=s.map(t=>parseInt(t,16));return[i,r,n,o/255]}}static parseAngletoDegrees(t){const e=t.toLowerCase(),s=parseFloat(e);return e.includes("rad")?yt(s):e.includes("turn")?360*s:s}}const Ge=function(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:S;const s=/\D{0,2}$/.exec(t),r=parseFloat(t),n=i.DPI;switch(null==s?void 0:s[0]){case"mm":return r*n/25.4;case"cm":return r*n/2.54;case"in":return r*n;case"pt":return r*n/72;case"pc":return r*n/72*12;case"em":return r*e;default:return r}},ze=t=>{const[e,s]=t.trim().split(" "),[i,r]=(n=e)&&n!==P?[n.slice(1,4),n.slice(5,8)]:n===P?[n,n]:["Mid","Mid"];var n;return{meetOrSlice:s||"meet",alignX:i,alignY:r}},He=function(t,e){let s,i,r=!(arguments.length>2&&void 0!==arguments[2])||arguments[2];if(e)if(e.toLive)s=`url(#SVGID_${e.id})`;else{const t=new Ve(e),r=t.getAlpha();s=t.toRgb(),1!==r&&(i=r.toString())}else s="none";return r?`${t}: ${s}; ${i?`${t}-opacity: ${i}; `:""}`:`${t}="${s}" ${i?`${t}-opacity="${i}" `:""}`};class Ne{getSvgStyles(t){const e=this.fillRule?this.fillRule:"nonzero",s=this.strokeWidth?this.strokeWidth:"0",i=this.strokeDashArray?this.strokeDashArray.join(" "):P,r=this.strokeDashOffset?this.strokeDashOffset:"0",n=this.strokeLineCap?this.strokeLineCap:"butt",o=this.strokeLineJoin?this.strokeLineJoin:"miter",a=this.strokeMiterLimit?this.strokeMiterLimit:"4",h=void 0!==this.opacity?this.opacity:"1",l=this.visible?"":" visibility: hidden;",c=t?"":this.getSvgFilter(),u=He(H,this.fill);return[He(N,this.stroke),"stroke-width: ",s,"; ","stroke-dasharray: ",i,"; ","stroke-linecap: ",n,"; ","stroke-dashoffset: ",r,"; ","stroke-linejoin: ",o,"; ","stroke-miterlimit: ",a,"; ",u,"fill-rule: ",e,"; ","opacity: ",h,";",c,l].join("")}getSvgFilter(){return this.shadow?`filter: url(#SVGID_${this.shadow.id});`:""}getSvgCommons(){return[this.id?`id="${this.id}" `:"",this.clipPath?`clip-path="url(#${this.clipPath.clipPathId})" `:""].join("")}getSvgTransform(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"";const s=t?this.calcTransformMatrix():this.calcOwnMatrix();return`${`transform="${Xt(s)}`}${e}" `}_toSVG(t){return[""]}toSVG(t){return this._createBaseSVGMarkup(this._toSVG(t),{reviver:t})}toClipPathSVG(t){return"\t"+this._createBaseClipPathSVGMarkup(this._toSVG(t),{reviver:t})}_createBaseClipPathSVGMarkup(t){let{reviver:e,additionalTransform:s=""}=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};const i=[this.getSvgTransform(!0,s),this.getSvgCommons()].join(""),r=t.indexOf("COMMON_PARTS");return t[r]=i,e?e(t.join("")):t.join("")}_createBaseSVGMarkup(t){let{noStyle:e,reviver:s,withShadow:i,additionalTransform:r}=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};const n=e?"":`style="${this.getSvgStyles()}" `,o=i?`style="${this.getSvgFilter()}" `:"",a=this.clipPath,h=this.strokeUniform?'vector-effect="non-scaling-stroke" ':"",l=a&&a.absolutePositioned,c=this.stroke,u=this.fill,d=this.shadow,g=[],f=t.indexOf("COMMON_PARTS");let p;a&&(a.clipPathId=`CLIPPATH_${ut()}`,p=`\n${a.toClipPathSVG(s)}\n`),l&&g.push("\n"),g.push("\n");const m=[n,h,e?"":this.addPaintOrder()," ",r?`transform="${r}" `:""].join("");return t[f]=m,Yt(u)&&g.push(u.toSVG(this)),Yt(c)&&g.push(c.toSVG(this)),d&&g.push(d.toSVG(this)),a&&g.push(p),g.push(t.join("")),g.push("\n"),l&&g.push("\n"),s?s(g.join("")):g.join("")}addPaintOrder(){return this.paintFirst!==H?` paint-order="${this.paintFirst}" `:""}}function Ue(t){return new RegExp("^("+t.join("|")+")\\b","i")}const qe="textDecorationThickness",Ke=["fontSize","fontWeight","fontFamily","fontStyle"],Je=["underline","overline","linethrough"],Qe=[...Ke,"lineHeight","text","charSpacing","textAlign","styles","path","pathStartOffset","pathSide","pathAlign"],Ze=[...Qe,...Je,"textBackgroundColor","direction",qe],ts=[...Ke,...Je,N,"strokeWidth",H,"deltaY","textBackgroundColor",qe],es={_reNewline:E,_reSpacesAndTabs:/[ \t\r]/g,_reSpaceAndTab:/[ \t\r]/,_reWords:/\S+/g,fontSize:40,fontWeight:"normal",fontFamily:"Times New Roman",underline:!1,overline:!1,linethrough:!1,textAlign:O,fontStyle:"normal",lineHeight:1.16,textBackgroundColor:"",stroke:null,shadow:null,path:void 0,pathStartOffset:0,pathSide:O,pathAlign:"baseline",charSpacing:0,deltaY:0,direction:"ltr",CACHE_FONT_SIZE:400,MIN_TEXT_WIDTH:2,superscript:{size:.6,baseline:-.35},subscript:{size:.6,baseline:.11},_fontSizeFraction:.222,offsets:{underline:.1,linethrough:-.28167,overline:-.81333},_fontSizeMult:1.13,[qe]:66.667},ss="justify",is="justify-left",rs="justify-right",ns="justify-center",os=String.raw`[-+]?(?:\d*\.\d+|\d+\.?)(?:[eE][-+]?\d+)?`,as=String.raw`(?:\s*,?\s+|\s*,\s*)`,hs="http://www.w3.org/2000/svg",ls=new RegExp("(normal|italic)?\\s*(normal|small-caps)?\\s*(normal|bold|bolder|lighter|100|200|300|400|500|600|700|800|900)?\\s*("+os+"(?:px|cm|mm|em|pt|pc|in)*)(?:\\/(normal|"+os+"))?\\s+(.*)"),cs={cx:O,x:O,r:"radius",cy:k,y:k,display:"visible",visibility:"visible",transform:"transformMatrix","fill-opacity":"fillOpacity","fill-rule":"fillRule","font-family":"fontFamily","font-size":"fontSize","font-style":"fontStyle","font-weight":"fontWeight","letter-spacing":"charSpacing","paint-order":"paintFirst","stroke-dasharray":"strokeDashArray","stroke-dashoffset":"strokeDashOffset","stroke-linecap":"strokeLineCap","stroke-linejoin":"strokeLineJoin","stroke-miterlimit":"strokeMiterLimit","stroke-opacity":"strokeOpacity","stroke-width":"strokeWidth","text-decoration":"textDecoration","text-anchor":"textAnchor",opacity:"opacity","clip-path":"clipPath","clip-rule":"clipRule","vector-effect":"strokeUniform","image-rendering":"imageSmoothing","text-decoration-thickness":qe},us="font-size",ds="clip-path",gs=Ue(["path","circle","polygon","polyline","ellipse","rect","line","image","text"]),fs=Ue(["symbol","image","marker","pattern","view","svg"]),ps=Ue(["symbol","g","a","svg","clipPath","defs"]),ms=new RegExp(String.raw`^\s*(${os})${as}(${os})${as}(${os})${as}(${os})\s*$`),vs="(-?\\d+(?:\\.\\d*)?(?:px)?(?:\\s?|$))?",ys=new RegExp("(?:\\s|^)"+vs+vs+"("+os+"?(?:px)?)?(?:\\s?|$)(?:$|\\s)");class _s{constructor(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};const e="string"==typeof t?_s.parseShadow(t):t;Object.assign(this,_s.ownDefaults,e),this.id=ut()}static parseShadow(t){const e=t.trim(),[,s=0,i=0,r=0]=(ys.exec(e)||[]).map(t=>parseFloat(t)||0);return{color:(e.replace(ys,"")||"rgb(0,0,0)").trim(),offsetX:s,offsetY:i,blur:r}}toString(){return[this.offsetX,this.offsetY,this.blur,this.color].join("px ")}toSVG(t){const e=_e(new it(this.offsetX,this.offsetY),vt(-t.angle)),s=new Ve(this.color);let r=40,n=40;return t.width&&t.height&&(r=100*$t((Math.abs(e.x)+this.blur)/t.width,i.NUM_FRACTION_DIGITS)+20,n=100*$t((Math.abs(e.y)+this.blur)/t.height,i.NUM_FRACTION_DIGITS)+20),t.flipX&&(e.x*=-1),t.flipY&&(e.y*=-1),`\n\t\n\t\n\t\n\t\n\t\n\t\t\n\t\t\n\t\n\n`}toObject(){const t={color:this.color,blur:this.blur,offsetX:this.offsetX,offsetY:this.offsetY,affectStroke:this.affectStroke,nonScaling:this.nonScaling,type:this.constructor.type},e=_s.ownDefaults;return this.includeDefaultValues?t:Bt(t,(t,s)=>t!==e[s])}static async fromObject(t){return new this(t)}}e(_s,"ownDefaults",{color:"rgb(0,0,0)",blur:0,offsetX:0,offsetY:0,affectStroke:!1,includeDefaultValues:!0,nonScaling:!1}),e(_s,"type","shadow"),J.setClass(_s,"shadow");const xs=(t,e,s)=>Math.max(t,Math.min(e,s)),Cs=[k,O,W,V,"flipX","flipY","originX","originY","angle","opacity","globalCompositeOperation","shadow","visible",G,z],bs=[H,N,"strokeWidth","strokeDashArray","width","height","paintFirst","strokeUniform","strokeLineCap","strokeDashOffset","strokeLineJoin","strokeMiterLimit","backgroundColor","clipPath"],Ss={top:0,left:0,width:0,height:0,angle:0,flipX:!1,flipY:!1,scaleX:1,scaleY:1,minScaleLimit:0,skewX:0,skewY:0,originX:O,originY:k,strokeWidth:1,strokeUniform:!1,padding:0,opacity:1,paintFirst:H,fill:"rgb(0,0,0)",fillRule:"nonzero",stroke:null,strokeDashArray:null,strokeDashOffset:0,strokeLineCap:"butt",strokeLineJoin:"miter",strokeMiterLimit:4,globalCompositeOperation:"source-over",backgroundColor:"",shadow:null,visible:!0,includeDefaultValues:!0,excludeFromExport:!1,objectCaching:!0,clipPath:void 0,inverted:!1,absolutePositioned:!1,centeredRotation:!0,centeredScaling:!1,dirty:!0},ws=(t,e,s,i)=>(tt*Math.pow(2,10*(i-=1))*Math.sin((i*r-e)*x/s),Os=(t,e,s,i)=>-s*Math.cos(t/i*y)+s+e,ks=(t,e,s,i)=>(t/=i)<1/2.75?s*(7.5625*t*t)+e:t<2/2.75?s*(7.5625*(t-=1.5/2.75)*t+.75)+e:t<2.5/2.75?s*(7.5625*(t-=2.25/2.75)*t+.9375)+e:s*(7.5625*(t-=2.625/2.75)*t+.984375)+e,Ds=(t,e,s,i)=>s-ks(i-t,0,s,i)+e;var Ms=Object.freeze({__proto__:null,defaultEasing:Os,easeInBack:function(t,e,s,i){let r=arguments.length>4&&void 0!==arguments[4]?arguments[4]:1.70158;return s*(t/=i)*t*((r+1)*t-r)+e},easeInBounce:Ds,easeInCirc:(t,e,s,i)=>-s*(Math.sqrt(1-(t/=i)*t)-1)+e,easeInCubic:(t,e,s,i)=>s*(t/i)**3+e,easeInElastic:(t,e,s,i)=>{const r=s;let n=0;if(0===t)return e;if(1===(t/=i))return e+s;n||(n=.3*i);const{a:o,s:a,p:h}=ws(r,s,n,1.70158);return-Ts(o,a,h,t,i)+e},easeInExpo:(t,e,s,i)=>0===t?e:s*2**(10*(t/i-1))+e,easeInOutBack:function(t,e,s,i){let r=arguments.length>4&&void 0!==arguments[4]?arguments[4]:1.70158;return(t/=i/2)<1?s/2*(t*t*((1+(r*=1.525))*t-r))+e:s/2*((t-=2)*t*((1+(r*=1.525))*t+r)+2)+e},easeInOutBounce:(t,e,s,i)=>t(t/=i/2)<1?-s/2*(Math.sqrt(1-t**2)-1)+e:s/2*(Math.sqrt(1-(t-=2)*t)+1)+e,easeInOutCubic:(t,e,s,i)=>(t/=i/2)<1?s/2*t**3+e:s/2*((t-2)**3+2)+e,easeInOutElastic:(t,e,s,i)=>{const r=s;let n=0;if(0===t)return e;if(2===(t/=i/2))return e+s;n||(n=i*(.3*1.5));const{a:o,s:a,p:h,c:l}=ws(r,s,n,1.70158);return t<1?-.5*Ts(o,a,h,t,i)+e:o*Math.pow(2,-10*(t-=1))*Math.sin((t*i-a)*x/h)*.5+l+e},easeInOutExpo:(t,e,s,i)=>0===t?e:t===i?e+s:(t/=i/2)<1?s/2*2**(10*(t-1))+e:s/2*-(2**(-10*--t)+2)+e,easeInOutQuad:(t,e,s,i)=>(t/=i/2)<1?s/2*t**2+e:-s/2*(--t*(t-2)-1)+e,easeInOutQuart:(t,e,s,i)=>(t/=i/2)<1?s/2*t**4+e:-s/2*((t-=2)*t**3-2)+e,easeInOutQuint:(t,e,s,i)=>(t/=i/2)<1?s/2*t**5+e:s/2*((t-2)**5+2)+e,easeInOutSine:(t,e,s,i)=>-s/2*(Math.cos(Math.PI*t/i)-1)+e,easeInQuad:(t,e,s,i)=>s*(t/=i)*t+e,easeInQuart:(t,e,s,i)=>s*(t/=i)*t**3+e,easeInQuint:(t,e,s,i)=>s*(t/i)**5+e,easeInSine:(t,e,s,i)=>-s*Math.cos(t/i*y)+s+e,easeOutBack:function(t,e,s,i){let r=arguments.length>4&&void 0!==arguments[4]?arguments[4]:1.70158;return s*((t=t/i-1)*t*((r+1)*t+r)+1)+e},easeOutBounce:ks,easeOutCirc:(t,e,s,i)=>s*Math.sqrt(1-(t=t/i-1)*t)+e,easeOutCubic:(t,e,s,i)=>s*((t/i-1)**3+1)+e,easeOutElastic:(t,e,s,i)=>{const r=s;let n=0;if(0===t)return e;if(1===(t/=i))return e+s;n||(n=.3*i);const{a:o,s:a,p:h,c:l}=ws(r,s,n,1.70158);return o*2**(-10*t)*Math.sin((t*i-a)*x/h)+l+e},easeOutExpo:(t,e,s,i)=>t===i?e+s:s*-(2**(-10*t/i)+1)+e,easeOutQuad:(t,e,s,i)=>-s*(t/=i)*(t-2)+e,easeOutQuart:(t,e,s,i)=>-s*((t=t/i-1)*t**3-1)+e,easeOutQuint:(t,e,s,i)=>s*((t/i-1)**5+1)+e,easeOutSine:(t,e,s,i)=>s*Math.sin(t/i*y)+e});const Ps=()=>!1;class Es{constructor(t){let{startValue:s,byValue:i,duration:r=500,delay:n=0,easing:o=Os,onStart:a=v,onChange:h=v,onComplete:l=v,abort:c=Ps,target:u}=t;e(this,"_state","pending"),e(this,"durationProgress",0),e(this,"valueProgress",0),this.tick=this.tick.bind(this),this.duration=r,this.delay=n,this.easing=o,this._onStart=a,this._onChange=h,this._onComplete=l,this._abort=c,this.target=u,this.startValue=s,this.byValue=i,this.value=this.startValue,this.endValue=Object.freeze(this.calculate(this.duration).value)}get state(){return this._state}isDone(){return"aborted"===this._state||"completed"===this._state}start(){const t=t=>{"pending"===this._state&&(this.startTime=t||+new Date,this._state="running",this._onStart(),this.tick(this.startTime))};this.register(),this.delay>0?setTimeout(()=>ht(t),this.delay):ht(t)}tick(t){const e=(t||+new Date)-this.startTime,s=Math.min(e,this.duration);this.durationProgress=s/this.duration;const{value:i,valueProgress:r}=this.calculate(s);this.value=Object.freeze(i),this.valueProgress=r,"aborted"!==this._state&&(this._abort(this.value,this.valueProgress,this.durationProgress)?(this._state="aborted",this.unregister()):e>=this.duration?(this.durationProgress=this.valueProgress=1,this._onChange(this.endValue,this.valueProgress,this.durationProgress),this._state="completed",this._onComplete(this.endValue,this.valueProgress,this.durationProgress),this.unregister()):(this._onChange(this.value,this.valueProgress,this.durationProgress),ht(this.tick)))}register(){Q.push(this)}unregister(){Q.remove(this)}abort(){this._state="aborted",this.unregister()}}class As extends Es{constructor(t){let{startValue:e=0,endValue:s=100,...i}=t;super({...i,startValue:e,byValue:s-e})}calculate(t){const e=this.easing(t,this.startValue,this.byValue,this.duration);return{value:e,valueProgress:Math.abs((e-this.startValue)/this.byValue)}}}class js extends Es{constructor(t){let{startValue:e=[0],endValue:s=[100],...i}=t;super({...i,startValue:e,byValue:s.map((t,s)=>t-e[s])})}calculate(t){const e=this.startValue.map((e,s)=>this.easing(t,e,this.byValue[s],this.duration,s));return{value:e,valueProgress:Math.abs((e[0]-this.startValue[0])/this.byValue[0])}}}const Fs=(t,e,s,i)=>e+s*(1-Math.cos(t/i*y)),Ls=t=>t&&((e,s,i)=>t(new Ve(e).toRgba(),s,i));class Is extends Es{constructor(t){let{startValue:e,endValue:s,easing:i=Fs,onChange:r,onComplete:n,abort:o,...a}=t;const h=new Ve(e).getSource(),l=new Ve(s).getSource();super({...a,startValue:h,byValue:l.map((t,e)=>t-h[e]),easing:i,onChange:Ls(r),onComplete:Ls(n),abort:Ls(o)})}calculate(t){const[e,s,i,r]=this.startValue.map((e,s)=>this.easing(t,e,this.byValue[s],this.duration,s)),n=[...[e,s,i].map(Math.round),xs(0,r,1)];return{value:n,valueProgress:n.map((t,e)=>0!==this.byValue[e]?Math.abs((t-this.startValue[e])/this.byValue[e]):0).find(t=>0!==t)||0}}}function Rs(t){const e=(t=>Array.isArray(t.startValue)||Array.isArray(t.endValue))(t)?new js(t):new As(t);return e.start(),e}function Bs(t){const e=new Is(t);return e.start(),e}class $s{constructor(t){this.status=t,this.points=[]}includes(t){return this.points.some(e=>e.eq(t))}append(){for(var t=arguments.length,e=new Array(t),s=0;s!this.includes(t))),this}static isPointContained(t,e,s){let i=arguments.length>3&&void 0!==arguments[3]&&arguments[3];if(e.eq(s))return t.eq(e);if(e.x===s.x)return t.x===e.x&&(i||t.y>=Math.min(e.y,s.y)&&t.y<=Math.max(e.y,s.y));if(e.y===s.y)return t.y===e.y&&(i||t.x>=Math.min(e.x,s.x)&&t.x<=Math.max(e.x,s.x));{const r=xe(e,s),n=xe(e,t).divide(r);return i?Math.abs(n.x)===Math.abs(n.y):n.x===n.y&&n.x>=0&&n.x<=1}}static isPointInPolygon(t,e){const s=new it(t).setX(Math.min(t.x-1,...e.map(t=>t.x)));let i=0;for(let r=0;r4&&void 0!==arguments[4])||arguments[4],n=!(arguments.length>5&&void 0!==arguments[5])||arguments[5];const o=e.x-t.x,a=e.y-t.y,h=i.x-s.x,l=i.y-s.y,c=t.x-s.x,u=t.y-s.y,d=h*u-l*c,g=o*u-a*c,f=l*o-h*a;if(0!==f){const e=d/f,s=g/f;return(r||0<=e&&e<=1)&&(n||0<=s&&s<=1)?new $s("Intersection").append(new it(t.x+e*o,t.y+e*a)):new $s}if(0===d||0===g){const o=r||n||$s.isPointContained(t,s,i)||$s.isPointContained(e,s,i)||$s.isPointContained(s,t,e)||$s.isPointContained(i,t,e);return new $s(o?"Coincident":void 0)}return new $s("Parallel")}static intersectSegmentLine(t,e,s,i){return $s.intersectLineLine(t,e,s,i,!1,!0)}static intersectSegmentSegment(t,e,s,i){return $s.intersectLineLine(t,e,s,i,!1,!1)}static intersectLinePolygon(t,e,s){let i=!(arguments.length>3&&void 0!==arguments[3])||arguments[3];const r=new $s,n=s.length;for(let o,a,h,l=0;l0&&(r.status="Intersection"),r}static intersectSegmentPolygon(t,e,s){return $s.intersectLinePolygon(t,e,s,!1)}static intersectPolygonPolygon(t,e){const s=new $s,i=t.length,r=[];for(let n=0;n0&&r.length===t.length?new $s("Coincident"):(s.points.length>0&&(s.status="Intersection"),s)}static intersectPolygonRectangle(t,e,s){const i=e.min(s),r=e.max(s),n=new it(r.x,i.y),o=new it(i.x,r.y);return $s.intersectPolygonPolygon(t,[i,n,r,o])}}class Xs extends at{getX(){return this.getXY().x}setX(t){this.setXY(this.getXY().setX(t))}getY(){return this.getXY().y}setY(t){this.setXY(this.getXY().setY(t))}getRelativeX(){return this.left}setRelativeX(t){this.left=t}getRelativeY(){return this.top}setRelativeY(t){this.top=t}getXY(){const t=this.getRelativeXY();return this.group?xt(t,this.group.calcTransformMatrix()):t}setXY(t,e,s){this.group&&(t=xt(t,Ct(this.group.calcTransformMatrix()))),this.setRelativeXY(t,e,s)}getRelativeXY(){return new it(this.left,this.top)}setRelativeXY(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:this.originX,s=arguments.length>2&&void 0!==arguments[2]?arguments[2]:this.originY;this.setPositionByOrigin(t,e,s)}isStrokeAccountedForInDimensions(){return!1}getCoords(){const{tl:t,tr:e,br:s,bl:i}=this.aCoords||(this.aCoords=this.calcACoords()),r=[t,e,s,i];if(this.group){const t=this.group.calcTransformMatrix();return r.map(e=>xt(e,t))}return r}intersectsWithRect(t,e){return"Intersection"===$s.intersectPolygonRectangle(this.getCoords(),t,e).status}intersectsWithObject(t){const e=$s.intersectPolygonPolygon(this.getCoords(),t.getCoords());return"Intersection"===e.status||"Coincident"===e.status||t.isContainedWithinObject(this)||this.isContainedWithinObject(t)}isContainedWithinObject(t){return this.getCoords().every(e=>t.containsPoint(e))}isContainedWithinRect(t,e){const{left:s,top:i,width:r,height:n}=this.getBoundingRect();return s>=t.x&&s+r<=e.x&&i>=t.y&&i+n<=e.y}isOverlapping(t){return this.intersectsWithObject(t)||this.isContainedWithinObject(t)||t.isContainedWithinObject(this)}containsPoint(t){return $s.isPointInPolygon(t,this.getCoords())}isOnScreen(){if(!this.canvas)return!1;const{tl:t,br:e}=this.canvas.vptCoords;return!!this.getCoords().some(s=>s.x<=e.x&&s.x>=t.x&&s.y<=e.y&&s.y>=t.y)||(!!this.intersectsWithRect(t,e)||this.containsPoint(t.midPointFrom(e)))}isPartiallyOnScreen(){if(!this.canvas)return!1;const{tl:t,br:e}=this.canvas.vptCoords;if(this.intersectsWithRect(t,e))return!0;return this.getCoords().every(s=>(s.x>=e.x||s.x<=t.x)&&(s.y>=e.y||s.y<=t.y))&&this.containsPoint(t.midPointFrom(e))}getBoundingRect(){return re(this.getCoords())}getScaledWidth(){return this._getTransformedDimensions().x}getScaledHeight(){return this._getTransformedDimensions().y}scale(t){this._set(W,t),this._set(V,t),this.setCoords()}scaleToWidth(t){const e=this.getBoundingRect().width/this.getScaledWidth();return this.scale(t/this.width/e)}scaleToHeight(t){const e=this.getBoundingRect().height/this.getScaledHeight();return this.scale(t/this.height/e)}getCanvasRetinaScaling(){var t;return(null===(t=this.canvas)||void 0===t?void 0:t.getRetinaScaling())||1}getTotalAngle(){return this.group?yt(wt(this.calcTransformMatrix())):this.angle}getViewportTransform(){var t;return(null===(t=this.canvas)||void 0===t?void 0:t.viewportTransform)||b.concat()}calcACoords(){const t=kt({angle:this.angle}),{x:e,y:s}=this.getRelativeCenterPoint(),i=Ot(e,s),r=bt(i,t),n=this._getTransformedDimensions(),o=n.x/2,a=n.y/2;return{tl:xt({x:-o,y:-a},r),tr:xt({x:o,y:-a},r),bl:xt({x:-o,y:a},r),br:xt({x:o,y:a},r)}}setCoords(){this.aCoords=this.calcACoords()}transformMatrixKey(){let t=arguments.length>0&&void 0!==arguments[0]&&arguments[0],e=[];return!t&&this.group&&(e=this.group.transformMatrixKey(t)),e.push(this.top,this.left,this.width,this.height,this.scaleX,this.scaleY,this.angle,this.strokeWidth,this.skewX,this.skewY,+this.flipX,+this.flipY,me(this.originX),me(this.originY)),e}calcTransformMatrix(){let t=arguments.length>0&&void 0!==arguments[0]&&arguments[0],e=this.calcOwnMatrix();if(t||!this.group)return e;const s=this.transformMatrixKey(t),i=this.matrixCache;return i&&i.key.every((t,e)=>t===s[e])?i.value:(this.group&&(e=bt(this.group.calcTransformMatrix(!1),e)),this.matrixCache={key:s,value:e},e)}calcOwnMatrix(){const t=this.transformMatrixKey(!0),e=this.ownMatrixCache;if(e&&e.key===t)return e.value;const s=this.getRelativeCenterPoint(),i={angle:this.angle,translateX:s.x,translateY:s.y,scaleX:this.scaleX,scaleY:this.scaleY,skewX:this.skewX,skewY:this.skewY,flipX:this.flipX,flipY:this.flipY},r=jt(i);return this.ownMatrixCache={key:t,value:r},r}_getNonTransformedDimensions(){return new it(this.width,this.height).scalarAdd(this.strokeWidth)}_calculateCurrentDimensions(t){return this._getTransformedDimensions(t).transform(this.getViewportTransform(),!0).scalarAdd(2*this.padding)}_getTransformedDimensions(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};const e={scaleX:this.scaleX,scaleY:this.scaleY,skewX:this.skewX,skewY:this.skewY,width:this.width,height:this.height,strokeWidth:this.strokeWidth,...t},s=e.strokeWidth;let i=s,r=0;this.strokeUniform&&(i=0,r=s);const n=e.width+i,o=e.height+i;let a;return a=0===e.skewX&&0===e.skewY?new it(n*e.scaleX,o*e.scaleY):le(n,o,At(e)),a.scalarAdd(r)}translateToGivenOrigin(t,e,s,i,r){let n=t.x,o=t.y;const a=me(i)-me(e),h=me(r)-me(s);if(a||h){const t=this._getTransformedDimensions();n+=a*t.x,o+=h*t.y}return new it(n,o)}translateToCenterPoint(t,e,s){if(e===T&&s===T)return t;const i=this.translateToGivenOrigin(t,e,s,T,T);return this.angle?i.rotate(vt(this.angle),t):i}translateToOriginPoint(t,e,s){const i=this.translateToGivenOrigin(t,T,T,e,s);return this.angle?i.rotate(vt(this.angle),t):i}getCenterPoint(){const t=this.getRelativeCenterPoint();return this.group?xt(t,this.group.calcTransformMatrix()):t}getRelativeCenterPoint(){return this.translateToCenterPoint(new it(this.left,this.top),this.originX,this.originY)}getPointByOrigin(t,e){return this.translateToOriginPoint(this.getRelativeCenterPoint(),t,e)}setPositionByOrigin(t,e,s){const i=this.translateToCenterPoint(t,e,s),r=this.translateToOriginPoint(i,this.originX,this.originY);this.set({left:r.x,top:r.y})}_getLeftTopCoords(){return this.translateToOriginPoint(this.getRelativeCenterPoint(),O,k)}}let Ys=class t extends Xs{static getDefaults(){return t.ownDefaults}get type(){const t=this.constructor.type;return"FabricObject"===t?"object":t.toLowerCase()}set type(t){r("warn","Setting type has no effect",t)}constructor(s){super(),e(this,"_cacheContext",null),Object.assign(this,t.ownDefaults),this.setOptions(s)}_createCacheCanvas(){this._cacheCanvas=dt(),this._cacheContext=this._cacheCanvas.getContext("2d"),this._updateCacheCanvas(),this.dirty=!0}_limitCacheSize(t){const e=t.width,s=t.height,r=i.maxCacheSideLimit,n=i.minCacheSideLimit;if(e<=r&&s<=r&&e*s<=i.perfLimitSizeTotal)return el&&(t.zoomX/=e/l,t.width=l,t.capped=!0),s>c&&(t.zoomY/=s/c,t.height=c,t.capped=!0),t}_getCacheCanvasDimensions(){const t=this.getTotalObjectScaling(),e=this._getTransformedDimensions({skewX:0,skewY:0}),s=e.x*t.x/this.scaleX,i=e.y*t.y/this.scaleY;return{width:Math.ceil(s+2),height:Math.ceil(i+2),zoomX:t.x,zoomY:t.y,x:s,y:i}}_updateCacheCanvas(){const t=this._cacheCanvas,e=this._cacheContext,{width:s,height:i,zoomX:r,zoomY:n,x:o,y:a}=this._limitCacheSize(this._getCacheCanvasDimensions()),h=s!==t.width||i!==t.height,l=this.zoomX!==r||this.zoomY!==n;if(!t||!e)return!1;if(h||l){s!==t.width||i!==t.height?(t.width=s,t.height=i):(e.setTransform(1,0,0,1,0,0),e.clearRect(0,0,t.width,t.height));const h=o/2,l=a/2;return this.cacheTranslationX=Math.round(t.width/2-h)+h,this.cacheTranslationY=Math.round(t.height/2-l)+l,e.translate(this.cacheTranslationX,this.cacheTranslationY),e.scale(r,n),this.zoomX=r,this.zoomY=n,!0}return!1}setOptions(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};this._setOptions(t)}transform(t){const e=this.group&&!this.group._transformDone||this.group&&this.canvas&&t===this.canvas.contextTop,s=this.calcTransformMatrix(!e);t.transform(s[0],s[1],s[2],s[3],s[4],s[5])}getObjectScaling(){if(!this.group)return new it(Math.abs(this.scaleX),Math.abs(this.scaleY));const t=Tt(this.calcTransformMatrix());return new it(Math.abs(t.scaleX),Math.abs(t.scaleY))}getTotalObjectScaling(){const t=this.getObjectScaling();if(this.canvas){const e=this.canvas.getZoom(),s=this.getCanvasRetinaScaling();return t.scalarMultiply(e*s)}return t}getObjectOpacity(){let t=this.opacity;return this.group&&(t*=this.group.getObjectOpacity()),t}_constrainScale(t){return Math.abs(t){t.transform(i)}),e.parentClipPaths.push(t),t.absolutePositioned){const t=Ct(this.calcTransformMatrix());i.transform(t[0],t[1],t[2],t[3],t[4],t[5])}return t.transform(i),t.drawObject(i,!0,e),s}_drawClipPath(t,e,s){if(!e)return;e._transformDone=!0;const i=this.createClipPathLayer(e,s);this.drawClipPathOnCache(t,e,i)}drawCacheOnCanvas(t){t.scale(1/this.zoomX,1/this.zoomY),t.drawImage(this._cacheCanvas,-this.cacheTranslationX,-this.cacheTranslationY)}isCacheDirty(){let t=arguments.length>0&&void 0!==arguments[0]&&arguments[0];if(this.isNotVisible())return!1;const e=this._cacheCanvas,s=this._cacheContext;return!(!e||!s||t||!this._updateCacheCanvas())||!!(this.dirty||this.clipPath&&this.clipPath.absolutePositioned)&&(e&&s&&!t&&(s.save(),s.setTransform(1,0,0,1,0,0),s.clearRect(0,0,e.width,e.height),s.restore()),!0)}_renderBackground(t){if(!this.backgroundColor)return;const e=this._getNonTransformedDimensions();t.fillStyle=this.backgroundColor,t.fillRect(-e.x/2,-e.y/2,e.x,e.y),this._removeShadow(t)}_setOpacity(t){this.group&&!this.group._transformDone?t.globalAlpha=this.getObjectOpacity():t.globalAlpha*=this.opacity}_setStrokeStyles(t,e){const s=e.stroke;s&&(t.lineWidth=e.strokeWidth,t.lineCap=e.strokeLineCap,t.lineDashOffset=e.strokeDashOffset,t.lineJoin=e.strokeLineJoin,t.miterLimit=e.strokeMiterLimit,Yt(s)?"percentage"===s.gradientUnits||s.gradientTransform||s.patternTransform?this._applyPatternForTransformedGradient(t,s):(t.strokeStyle=s.toLive(t),this._applyPatternGradientTransform(t,s)):t.strokeStyle=e.stroke)}_setFillStyles(t,e){let{fill:s}=e;s&&(Yt(s)?(t.fillStyle=s.toLive(t),this._applyPatternGradientTransform(t,s)):t.fillStyle=s)}_setClippingProperties(t){t.globalAlpha=1,t.strokeStyle="transparent",t.fillStyle="#000000"}_setLineDash(t,e){e&&0!==e.length&&t.setLineDash(e)}_setShadow(t){if(!this.shadow)return;const e=this.shadow,s=this.canvas,r=this.getCanvasRetinaScaling(),[n,,,o]=(null==s?void 0:s.viewportTransform)||b,a=n*r,h=o*r,l=e.nonScaling?new it(1,1):this.getObjectScaling();t.shadowColor=e.color,t.shadowBlur=e.blur*i.browserShadowBlurConstant*(a+h)*(l.x+l.y)/4,t.shadowOffsetX=e.offsetX*a*l.x,t.shadowOffsetY=e.offsetY*h*l.y}_removeShadow(t){this.shadow&&(t.shadowColor="",t.shadowBlur=t.shadowOffsetX=t.shadowOffsetY=0)}_applyPatternGradientTransform(t,e){if(!Yt(e))return{offsetX:0,offsetY:0};const s=e.gradientTransform||e.patternTransform,i=-this.width/2+e.offsetX||0,r=-this.height/2+e.offsetY||0;return"percentage"===e.gradientUnits?t.transform(this.width,0,0,this.height,i,r):t.transform(1,0,0,1,i,r),s&&t.transform(s[0],s[1],s[2],s[3],s[4],s[5]),{offsetX:i,offsetY:r}}_renderPaintInOrder(t){this.paintFirst===N?(this._renderStroke(t),this._renderFill(t)):(this._renderFill(t),this._renderStroke(t))}_render(t){}_renderFill(t){this.fill&&(t.save(),this._setFillStyles(t,this),"evenodd"===this.fillRule?t.fill("evenodd"):t.fill(),t.restore())}_renderStroke(t){if(this.stroke&&0!==this.strokeWidth){if(this.shadow&&!this.shadow.affectStroke&&this._removeShadow(t),t.save(),this.strokeUniform){const e=this.getObjectScaling();t.scale(1/e.x,1/e.y)}this._setLineDash(t,this.strokeDashArray),this._setStrokeStyles(t,this),t.stroke(),t.restore()}}_applyPatternForTransformedGradient(t,e){var s;const i=this._limitCacheSize(this._getCacheCanvasDimensions()),r=this.getCanvasRetinaScaling(),n=i.x/this.scaleX/r,o=i.y/this.scaleY/r,a=ft({width:Math.ceil(n),height:Math.ceil(o)}),h=a.getContext("2d");h&&(h.beginPath(),h.moveTo(0,0),h.lineTo(n,0),h.lineTo(n,o),h.lineTo(0,o),h.closePath(),h.translate(n/2,o/2),h.scale(i.zoomX/this.scaleX/r,i.zoomY/this.scaleY/r),this._applyPatternGradientTransform(h,e),h.fillStyle=e.toLive(t),h.fill(),t.translate(-this.width/2-this.strokeWidth/2,-this.height/2-this.strokeWidth/2),t.scale(r*this.scaleX/i.zoomX,r*this.scaleY/i.zoomY),t.strokeStyle=null!==(s=h.createPattern(a,"no-repeat"))&&void 0!==s?s:"")}_findCenterFromElement(){return new it(this.left+this.width/2,this.top+this.height/2)}clone(t){const e=this.toObject(t);return this.constructor.fromObject(e)}cloneAsImage(t){const e=this.toCanvasElement(t);return new(J.getClass("image"))(e)}toCanvasElement(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};const e=he(this),s=this.group,i=this.shadow,r=Math.abs,n=t.enableRetinaScaling?f():1,o=(t.multiplier||1)*n,a=t.canvasProvider||(t=>new Zt(t,{enableRetinaScaling:!1,renderOnAddRemove:!1,skipOffscreen:!1}));delete this.group,t.withoutTransform&&ae(this),t.withoutShadow&&(this.shadow=null),t.viewportTransform&&ge(this,this.getViewportTransform()),this.setCoords();const h=dt(),l=this.getBoundingRect(),c=this.shadow,u=new it;if(c){const t=c.blur,e=c.nonScaling?new it(1,1):this.getObjectScaling();u.x=2*Math.round(r(c.offsetX)+t)*r(e.x),u.y=2*Math.round(r(c.offsetY)+t)*r(e.y)}const d=l.width+u.x,g=l.height+u.y;h.width=Math.ceil(d),h.height=Math.ceil(g);const p=a(h);"jpeg"===t.format&&(p.backgroundColor="#fff"),this.setPositionByOrigin(new it(p.width/2,p.height/2),T,T);const m=this.canvas;p._objects=[this],this.set("canvas",p),this.setCoords();const v=p.toCanvasElement(o||1,t);return this.set("canvas",m),this.shadow=i,s&&(this.group=s),this.set(e),this.setCoords(),p._objects=[],p.destroy(),v}toDataURL(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};return pt(this.toCanvasElement(t),t.format||"png",t.quality||1)}toBlob(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};return mt(this.toCanvasElement(t),t.format||"png",t.quality||1)}isType(){for(var t=arguments.length,e=new Array(t),s=0;s{let[i,r]=s;return t[i]=this._animate(i,r,e),t},{})}_animate(t,e){let s=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};const i=t.split("."),r=this.constructor.colorProperties.includes(i[i.length-1]),{abort:n,startValue:o,onChange:a,onComplete:h}=s,l={...s,target:this,startValue:null!=o?o:i.reduce((t,e)=>t[e],this),endValue:e,abort:null==n?void 0:n.bind(this),onChange:(t,e,s)=>{i.reduce((e,s,r)=>(r===i.length-1&&(e[s]=t),e[s]),this),a&&a(t,e,s)},onComplete:(t,e,s)=>{this.setCoords(),h&&h(t,e,s)}};return r?Bs(l):Rs(l)}isDescendantOf(t){const{parent:e,group:s}=this;return e===t||s===t||!!e&&e.isDescendantOf(t)||!!s&&s!==e&&s.isDescendantOf(t)}getAncestors(){const t=[];let e=this;do{e=e.parent,e&&t.push(e)}while(e);return t}findCommonAncestors(t){if(this===t)return{fork:[],otherFork:[],common:[this,...this.getAncestors()]};const e=this.getAncestors(),s=t.getAncestors();if(0===e.length&&s.length>0&&this===s[s.length-1])return{fork:[],otherFork:[t,...s.slice(0,s.length-1)],common:[this]};for(let i,r=0;r-1&&n>o}toObject(){const e=(arguments.length>0&&void 0!==arguments[0]?arguments[0]:[]).concat(t.customProperties,this.constructor.customProperties||[]);let s;const r=i.NUM_FRACTION_DIGITS,{clipPath:n,fill:o,stroke:a,shadow:h,strokeDashArray:l,left:c,top:u,originX:d,originY:g,width:f,height:p,strokeWidth:v,strokeLineCap:y,strokeDashOffset:_,strokeLineJoin:x,strokeUniform:C,strokeMiterLimit:b,scaleX:S,scaleY:w,angle:T,flipX:O,flipY:k,opacity:D,visible:M,backgroundColor:P,fillRule:E,paintFirst:A,globalCompositeOperation:j,skewX:F,skewY:L}=this;n&&!n.excludeFromExport&&(s=n.toObject(e.concat("inverted","absolutePositioned")));const I=t=>$t(t,r),R={...Rt(this,e),type:this.constructor.type,version:m,originX:d,originY:g,left:I(c),top:I(u),width:I(f),height:I(p),fill:Wt(o)?o.toObject():o,stroke:Wt(a)?a.toObject():a,strokeWidth:I(v),strokeDashArray:l?l.concat():l,strokeLineCap:y,strokeDashOffset:_,strokeLineJoin:x,strokeUniform:C,strokeMiterLimit:I(b),scaleX:I(S),scaleY:I(w),angle:I(T),flipX:O,flipY:k,opacity:I(D),shadow:h?h.toObject():h,visible:M,backgroundColor:P,fillRule:E,paintFirst:A,globalCompositeOperation:j,skewX:I(F),skewY:I(L),...s?{clipPath:s}:null};return this.includeDefaultValues?R:this._removeDefaultValues(R)}toDatalessObject(t){return this.toObject(t)}_removeDefaultValues(t){const e=this.constructor.getDefaults(),s=Object.keys(e).length>0?e:Object.getPrototypeOf(this);return Bt(t,(t,e)=>{if(e===O||e===k||"type"===e)return!0;const i=s[e];return t!==i&&!(Array.isArray(t)&&Array.isArray(i)&&0===t.length&&0===i.length)})}toString(){return`#<${this.constructor.type}>`}static _fromObject(t){let{type:e,...s}=t,{extraParam:i,...r}=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return It(s,r).then(t=>i?(delete t[i],new this(s[i],t)):new this(t))}static fromObject(t,e){return this._fromObject(t,e)}};e(Ys,"stateProperties",Cs),e(Ys,"cacheProperties",bs),e(Ys,"ownDefaults",Ss),e(Ys,"type","FabricObject"),e(Ys,"colorProperties",[H,N,"backgroundColor"]),e(Ys,"customProperties",[]),J.setClass(Ys),J.setClass(Ys,"object");const Ws=(t,e,s)=>(i,r,n,o)=>{const a=e(i,r,n,o);return a&&fe(t,{...je(i,r,n,o),...s}),a};function Vs(t){return(e,s,i,r)=>{const{target:n,originX:o,originY:a}=s,h=n.getRelativeCenterPoint(),l=n.translateToOriginPoint(h,o,a),c=t(e,s,i,r);return n.setPositionByOrigin(l,s.originX,s.originY),c}}const Gs=Ws(R,Vs((t,e,s,i)=>{const r=Le(e,e.originX,e.originY,s,i);if(me(e.originX)===me(T)||me(e.originX)===me(M)&&r.x<0||me(e.originX)===me(O)&&r.x>0){const{target:t}=e,s=t.strokeWidth/(t.strokeUniform?t.scaleX:1),i=Pe(e)?2:1,n=t.width,o=Math.abs(r.x*i/t.scaleX)-s;return t.set("width",Math.max(o,1)),n!==t.width}return!1}));function zs(t,e,s,i,r){i=i||{};const n=this.sizeX||i.cornerSize||r.cornerSize,o=this.sizeY||i.cornerSize||r.cornerSize,a=void 0!==i.transparentCorners?i.transparentCorners:r.transparentCorners,h=a?N:H,l=!a&&(i.cornerStrokeColor||r.cornerStrokeColor);let c,u=e,d=s;t.save(),t.fillStyle=i.cornerColor||r.cornerColor||"",t.strokeStyle=i.cornerStrokeColor||r.cornerStrokeColor||"",n>o?(c=n,t.scale(1,o/n),d=s*n/o):o>n?(c=o,t.scale(n/o,1),u=e*o/n):c=n,t.beginPath(),t.arc(u,d,c/2,0,x,!1),t[h](),l&&t.stroke(),t.restore()}function Hs(t,e,s,i,r){i=i||{};const n=this.sizeX||i.cornerSize||r.cornerSize,o=this.sizeY||i.cornerSize||r.cornerSize,a=void 0!==i.transparentCorners?i.transparentCorners:r.transparentCorners,h=a?N:H,l=!a&&(i.cornerStrokeColor||r.cornerStrokeColor),c=n/2,u=o/2;t.save(),t.fillStyle=i.cornerColor||r.cornerColor||"",t.strokeStyle=i.cornerStrokeColor||r.cornerStrokeColor||"",t.translate(e,s);const d=r.getTotalAngle();t.rotate(vt(d)),t[`${h}Rect`](-c,-u,n,o),l&&t.strokeRect(-c,-u,n,o),t.restore()}class Ns{constructor(t){e(this,"visible",!0),e(this,"actionName",Y),e(this,"angle",0),e(this,"x",0),e(this,"y",0),e(this,"offsetX",0),e(this,"offsetY",0),e(this,"sizeX",0),e(this,"sizeY",0),e(this,"touchSizeX",0),e(this,"touchSizeY",0),e(this,"cursorStyle","crosshair"),e(this,"withConnection",!1),Object.assign(this,t)}shouldActivate(t,e,s,i){var r;let{tl:n,tr:o,br:a,bl:h}=i;return(null===(r=e.canvas)||void 0===r?void 0:r.getActiveObject())===e&&e.isControlVisible(t)&&$s.isPointInPolygon(s,[n,o,a,h])}getActionHandler(t,e,s){return this.actionHandler}getMouseDownHandler(t,e,s){return this.mouseDownHandler}getMouseUpHandler(t,e,s){return this.mouseUpHandler}cursorStyleHandler(t,e,s,i){return e.cursorStyle}getActionName(t,e,s){return e.actionName}getVisibility(t,e){var s,i;return null!==(s=null===(i=t._controlsVisibility)||void 0===i?void 0:i[e])&&void 0!==s?s:this.visible}setVisibility(t,e,s){this.visible=t}positionHandler(t,e,s,i){return new it(this.x*t.x+this.offsetX,this.y*t.y+this.offsetY).transform(e)}calcCornerCoords(t,e,s,i,r,n){const o=St([Ot(s,i),kt({angle:t}),Dt((r?this.touchSizeX:this.sizeX)||e,(r?this.touchSizeY:this.sizeY)||e)]);return{tl:new it(-.5,-.5).transform(o),tr:new it(.5,-.5).transform(o),br:new it(.5,.5).transform(o),bl:new it(-.5,.5).transform(o)}}render(t,e,s,i,r){if("circle"===((i=i||{}).cornerStyle||r.cornerStyle))zs.call(this,t,e,s,i,r);else Hs.call(this,t,e,s,i,r)}}const Us=(t,e,s)=>s.lockRotation?Me:e.cursorStyle,qs=Ws(F,Vs((t,e,s,i)=>{let{target:r,ex:n,ey:o,theta:a,originX:h,originY:l}=e;const c=r.translateToOriginPoint(r.getRelativeCenterPoint(),h,l);if(Ae(r,"lockRotation"))return!1;const u=Math.atan2(o-c.y,n-c.x),d=Math.atan2(i-c.y,s-c.x);let g=yt(d-u+a);if(r.snapAngle&&r.snapAngle>0){const t=r.snapAngle,e=r.snapThreshold||t,s=Math.ceil(g/t)*t,i=Math.floor(g/t)*t;Math.abs(g-i){const r=Ks(t,s);if(Js(s,0!==e.x&&0===e.y?"x":0===e.x&&0!==e.y?"y":"",r))return Me;const n=Fe(s,0,i);return`${Qs[n]}-resize`};function ti(t,e,s,i){let r=arguments.length>4&&void 0!==arguments[4]?arguments[4]:{};const n=e.target,o=r.by,a=Ks(t,n);let h,l,c,u,d,g;if(Js(n,o,a))return!1;if(e.gestureScale)l=e.scaleX*e.gestureScale,c=e.scaleY*e.gestureScale;else{if(h=Le(e,e.originX,e.originY,s,i),d="y"!==o?Math.sign(h.x||e.signX||1):1,g="x"!==o?Math.sign(h.y||e.signY||1):1,e.signX||(e.signX=d),e.signY||(e.signY=g),Ae(n,"lockScalingFlip")&&(e.signX!==d||e.signY!==g))return!1;if(u=n._getTransformedDimensions(),a&&!o){const t=Math.abs(h.x)+Math.abs(h.y),{original:s}=e,i=t/(Math.abs(u.x*s.scaleX/n.scaleX)+Math.abs(u.y*s.scaleY/n.scaleY));l=s.scaleX*i,c=s.scaleY*i}else l=Math.abs(h.x*n.scaleX/u.x),c=Math.abs(h.y*n.scaleY/u.y);Pe(e)&&(l*=2,c*=2),e.signX!==d&&"y"!==o&&(e.originX=Ee(e.originX),l*=-1,e.signX=d),e.signY!==g&&"x"!==o&&(e.originY=Ee(e.originY),c*=-1,e.signY=g)}const f=n.scaleX,p=n.scaleY;return o?("x"===o&&n.set(W,l),"y"===o&&n.set(V,c)):(!Ae(n,"lockScalingX")&&n.set(W,l),!Ae(n,"lockScalingY")&&n.set(V,c)),f!==n.scaleX||p!==n.scaleY}const ei=Ws(j,Vs((t,e,s,i)=>ti(t,e,s,i))),si=Ws(j,Vs((t,e,s,i)=>ti(t,e,s,i,{by:"x"}))),ii=Ws(j,Vs((t,e,s,i)=>ti(t,e,s,i,{by:"y"}))),ri={x:{counterAxis:"y",scale:W,skew:G,lockSkewing:"lockSkewingX",origin:"originX",flip:"flipX"},y:{counterAxis:"x",scale:V,skew:z,lockSkewing:"lockSkewingY",origin:"originY",flip:"flipY"}},ni=["ns","nesw","ew","nwse"],oi=(t,e,s,i)=>{if(0!==e.x&&Ae(s,"lockSkewingY"))return Me;if(0!==e.y&&Ae(s,"lockSkewingX"))return Me;const r=Fe(s,0,i)%4;return`${ni[r]}-resize`};function ai(t,e,s,i,r){const{target:n}=s,{counterAxis:o,origin:a,lockSkewing:h,skew:l,flip:c}=ri[t];if(Ae(n,h))return!1;const{origin:u,flip:d}=ri[o],g=me(s[u])*(n[d]?-1:1),f=-Math.sign(g)*(n[c]?-1:1),p=.5*-((0===n[l]&&Le(s,T,T,i,r)[t]>0||n[l]>0?1:-1)*f)+.5,m=Ws(I,Vs((e,s,i,r)=>function(t,e,s){let{target:i,ex:r,ey:n,skewingSide:o,...a}=e;const{skew:h}=ri[t],l=s.subtract(new it(r,n)).divide(new it(i.scaleX,i.scaleY))[t],c=i[h],u=a[h],d=Math.tan(vt(u)),g="y"===t?i._getTransformedDimensions({scaleX:1,scaleY:1,skewX:0}).x:i._getTransformedDimensions({scaleX:1,scaleY:1}).y,f=2*l*o/Math.max(g,1)+d,p=yt(Math.atan(f));i.set(h,p);const m=c!==i[h];if(m&&"y"===t){const{skewX:t,scaleX:e}=i,s=i._getTransformedDimensions({skewY:c}),r=i._getTransformedDimensions(),n=0!==t?s.x/r.x:1;1!==n&&i.set(W,n*e)}return m}(t,s,new it(i,r))));return m(e,{...s,[a]:p,skewingSide:f},i,r)}const hi=(t,e,s,i)=>ai("x",t,e,s,i),li=(t,e,s,i)=>ai("y",t,e,s,i);function ci(t,e){return t[e.canvas.altActionKey]}const ui=(t,e,s)=>{const i=ci(t,s);return 0===e.x?i?G:V:0===e.y?i?z:W:""},di=(t,e,s,i)=>ci(t,s)?oi(0,e,s,i):Zs(t,e,s,i),gi=(t,e,s,i)=>ci(t,e.target)?li(t,e,s,i):si(t,e,s,i),fi=(t,e,s,i)=>ci(t,e.target)?hi(t,e,s,i):ii(t,e,s,i),pi=()=>({ml:new Ns({x:-.5,y:0,cursorStyleHandler:di,actionHandler:gi,getActionName:ui}),mr:new Ns({x:.5,y:0,cursorStyleHandler:di,actionHandler:gi,getActionName:ui}),mb:new Ns({x:0,y:.5,cursorStyleHandler:di,actionHandler:fi,getActionName:ui}),mt:new Ns({x:0,y:-.5,cursorStyleHandler:di,actionHandler:fi,getActionName:ui}),tl:new Ns({x:-.5,y:-.5,cursorStyleHandler:Zs,actionHandler:ei}),tr:new Ns({x:.5,y:-.5,cursorStyleHandler:Zs,actionHandler:ei}),bl:new Ns({x:-.5,y:.5,cursorStyleHandler:Zs,actionHandler:ei}),br:new Ns({x:.5,y:.5,cursorStyleHandler:Zs,actionHandler:ei}),mtr:new Ns({x:0,y:-.5,actionHandler:qs,cursorStyleHandler:Us,offsetY:-40,withConnection:!0,actionName:L})}),mi=()=>({mr:new Ns({x:.5,y:0,actionHandler:Gs,cursorStyleHandler:di,actionName:R}),ml:new Ns({x:-.5,y:0,actionHandler:Gs,cursorStyleHandler:di,actionName:R})}),vi=()=>({...pi(),...mi()});class yi extends Ys{static getDefaults(){return{...super.getDefaults(),...yi.ownDefaults}}constructor(t){super(),Object.assign(this,this.constructor.createControls(),yi.ownDefaults),this.setOptions(t)}static createControls(){return{controls:pi()}}_updateCacheCanvas(){const t=this.canvas;if(this.noScaleCache&&t&&t._currentTransform){const e=t._currentTransform,s=e.target,i=e.action;if(this===s&&i&&i.startsWith(Y))return!1}return super._updateCacheCanvas()}getActiveControl(){const t=this.__corner;return t?{key:t,control:this.controls[t],coord:this.oCoords[t]}:void 0}findControl(t){let e=arguments.length>1&&void 0!==arguments[1]&&arguments[1];if(!this.hasControls||!this.canvas)return;this.__corner=void 0;const s=Object.entries(this.oCoords);for(let i=s.length-1;i>=0;i--){const[r,n]=s[i],o=this.controls[r];if(o.shouldActivate(r,this,t,e?n.touchCorner:n.corner))return this.__corner=r,{key:r,control:o,coord:this.oCoords[r]}}}calcOCoords(){const t=this.getViewportTransform(),e=this.getCenterPoint(),s=Ot(e.x,e.y),i=kt({angle:this.getTotalAngle()-(this.group&&this.flipX?180:0)}),r=bt(s,i),n=bt(t,r),o=bt(n,[1/t[0],0,0,1/t[3],0,0]),a=this.group?Tt(this.calcTransformMatrix()):void 0;a&&(a.scaleX=Math.abs(a.scaleX),a.scaleY=Math.abs(a.scaleY));const h=this._calculateCurrentDimensions(a),l={};return this.forEachControl((t,e)=>{const s=t.positionHandler(h,o,this,t);l[e]=Object.assign(s,this._calcCornerCoords(t,s))}),l}_calcCornerCoords(t,e){const s=this.getTotalAngle();return{corner:t.calcCornerCoords(s,this.cornerSize,e.x,e.y,!1,this),touchCorner:t.calcCornerCoords(s,this.touchCornerSize,e.x,e.y,!0,this)}}setCoords(){super.setCoords(),this.canvas&&(this.oCoords=this.calcOCoords())}forEachControl(t){for(const e in this.controls)t(this.controls[e],e,this)}drawSelectionBackground(t){if(!this.selectionBackgroundColor||this.canvas&&this.canvas._activeObject!==this)return;t.save();const e=this.getRelativeCenterPoint(),s=this._calculateCurrentDimensions(),i=this.getViewportTransform();t.translate(e.x,e.y),t.scale(1/i[0],1/i[3]),t.rotate(vt(this.angle)),t.fillStyle=this.selectionBackgroundColor,t.fillRect(-s.x/2,-s.y/2,s.x,s.y),t.restore()}strokeBorders(t,e){t.strokeRect(-e.x/2,-e.y/2,e.x,e.y)}_drawBorders(t,e){let s=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};const i={hasControls:this.hasControls,borderColor:this.borderColor,borderDashArray:this.borderDashArray,...s};t.save(),t.strokeStyle=i.borderColor,this._setLineDash(t,i.borderDashArray),this.strokeBorders(t,e),i.hasControls&&this.drawControlsConnectingLines(t,e),t.restore()}_renderControls(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};const{hasBorders:s,hasControls:i}=this,r={hasBorders:s,hasControls:i,...e},n=this.getViewportTransform(),o=r.hasBorders,a=r.hasControls,h=bt(n,this.calcTransformMatrix()),l=Tt(h);t.save(),t.translate(l.translateX,l.translateY),t.lineWidth=this.borderScaleFactor,this.group===this.parent&&(t.globalAlpha=this.isMoving?this.borderOpacityWhenMoving:1),this.flipX&&(l.angle-=180),t.rotate(vt(this.group?l.angle:this.angle)),o&&this.drawBorders(t,l,e),a&&this.drawControls(t,e),t.restore()}drawBorders(t,e,s){let i;if(s&&s.forActiveSelection||this.group){const t=le(this.width,this.height,At(e)),s=this.isStrokeAccountedForInDimensions()?rt:(this.strokeUniform?(new it).scalarAdd(this.canvas?this.canvas.getZoom():1):new it(e.scaleX,e.scaleY)).scalarMultiply(this.strokeWidth);i=t.add(s).scalarAdd(this.borderScaleFactor).scalarAdd(2*this.padding)}else i=this._calculateCurrentDimensions().scalarAdd(this.borderScaleFactor);this._drawBorders(t,i,s)}drawControlsConnectingLines(t,e){let s=!1;t.beginPath(),this.forEachControl((i,r)=>{i.withConnection&&i.getVisibility(this,r)&&(s=!0,t.moveTo(i.x*e.x,i.y*e.y),t.lineTo(i.x*e.x+i.offsetX,i.y*e.y+i.offsetY))}),s&&t.stroke()}drawControls(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};t.save();const s=this.getCanvasRetinaScaling(),{cornerStrokeColor:i,cornerDashArray:r,cornerColor:n}=this,o={cornerStrokeColor:i,cornerDashArray:r,cornerColor:n,...e};t.setTransform(s,0,0,s,0,0),t.strokeStyle=t.fillStyle=o.cornerColor,this.transparentCorners||(t.strokeStyle=o.cornerStrokeColor),this._setLineDash(t,o.cornerDashArray),this.forEachControl((e,s)=>{if(e.getVisibility(this,s)){const i=this.oCoords[s];e.render(t,i.x,i.y,o,this)}}),t.restore()}isControlVisible(t){return this.controls[t]&&this.controls[t].getVisibility(this,t)}setControlVisible(t,e){this._controlsVisibility||(this._controlsVisibility={}),this._controlsVisibility[t]=e}setControlsVisibility(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};Object.entries(t).forEach(t=>{let[e,s]=t;return this.setControlVisible(e,s)})}clearContextTop(t){if(!this.canvas)return;const e=this.canvas.contextTop;if(!e)return;const s=this.canvas.viewportTransform;e.save(),e.transform(s[0],s[1],s[2],s[3],s[4],s[5]),this.transform(e);const i=this.width+4,r=this.height+4;return e.clearRect(-i/2,-r/2,i,r),t||e.restore(),e}onDeselect(t){return!1}onSelect(t){return!1}shouldStartDragging(t){return!1}onDragStart(t){return!1}canDrop(t){return!1}renderDragSourceEffect(t){}renderDropTargetEffect(t){}}function _i(t,e){return e.forEach(e=>{Object.getOwnPropertyNames(e.prototype).forEach(s=>{"constructor"!==s&&Object.defineProperty(t.prototype,s,Object.getOwnPropertyDescriptor(e.prototype,s)||Object.create(null))})}),t}e(yi,"ownDefaults",{noScaleCache:!0,lockMovementX:!1,lockMovementY:!1,lockRotation:!1,lockScalingX:!1,lockScalingY:!1,lockSkewingX:!1,lockSkewingY:!1,lockScalingFlip:!1,cornerSize:13,touchCornerSize:24,transparentCorners:!0,cornerColor:"rgb(178,204,255)",cornerStrokeColor:"",cornerStyle:"rect",cornerDashArray:null,hasControls:!0,borderColor:"rgb(178,204,255)",borderDashArray:null,borderOpacityWhenMoving:.4,borderScaleFactor:1,hasBorders:!0,selectionBackgroundColor:"",selectable:!0,evented:!0,perPixelTargetFind:!1,activeOn:"down",hoverCursor:null,moveCursor:null});class xi extends yi{}_i(xi,[Ne]),J.setClass(xi),J.setClass(xi,"object");const Ci=(t,e,s,i)=>{const r=2*(i=Math.round(i))+1,{data:n}=t.getImageData(e-i,s-i,r,r);for(let t=3;t0)return!1}return!0};class bi{constructor(t){this.options=t,this.strokeProjectionMagnitude=this.options.strokeWidth/2,this.scale=new it(this.options.scaleX,this.options.scaleY),this.strokeUniformScalar=this.options.strokeUniform?new it(1/this.options.scaleX,1/this.options.scaleY):new it(1,1)}createSideVector(t,e){const s=xe(t,e);return this.options.strokeUniform?s.multiply(this.scale):s}projectOrthogonally(t,e,s){return this.applySkew(t.add(this.calcOrthogonalProjection(t,e,s)))}isSkewed(){return 0!==this.options.skewX||0!==this.options.skewY}applySkew(t){const e=new it(t);return e.y+=e.x*Math.tan(vt(this.options.skewY)),e.x+=e.y*Math.tan(vt(this.options.skewX)),e}scaleUnitVector(t,e){return t.multiply(this.strokeUniformScalar).scalarMultiply(e)}}const Si=new it;class wi extends bi{static getOrthogonalRotationFactor(t,e){const s=e?be(t,e):Se(t);return Math.abs(s)2&&void 0!==arguments[2]?arguments[2]:this.strokeProjectionMagnitude;const i=this.createSideVector(t,e),r=Te(i),n=wi.getOrthogonalRotationFactor(r,this.bisector);return this.scaleUnitVector(r,s*n)}projectBevel(){const t=[];return(this.alpha%x===0?[this.B]:[this.B,this.C]).forEach(e=>{t.push(this.projectOrthogonally(this.A,e)),t.push(this.projectOrthogonally(this.A,e,-this.strokeProjectionMagnitude))}),t}projectMiter(){const t=[],e=Math.abs(this.alpha),s=1/Math.sin(e/2),i=this.scaleUnitVector(this.bisector,-this.strokeProjectionMagnitude*s),r=this.options.strokeUniform?Ce(this.scaleUnitVector(this.bisector,this.options.strokeMiterLimit)):this.options.strokeMiterLimit;return Ce(i)/this.strokeProjectionMagnitude<=r&&t.push(this.applySkew(this.A.add(i))),t.push(...this.projectBevel()),t}projectRoundNoSkew(t,e){const s=[],i=new it(wi.getOrthogonalRotationFactor(this.bisector),wi.getOrthogonalRotationFactor(new it(this.bisector.y,this.bisector.x)));return[new it(1,0).scalarMultiply(this.strokeProjectionMagnitude).multiply(this.strokeUniformScalar).multiply(i),new it(0,1).scalarMultiply(this.strokeProjectionMagnitude).multiply(this.strokeUniformScalar).multiply(i)].forEach(i=>{De(i,t,e)&&s.push(this.A.add(i))}),s}projectRoundWithSkew(t,e){const s=[],{skewX:i,skewY:r,scaleX:n,scaleY:o,strokeUniform:a}=this.options,h=new it(Math.tan(vt(i)),Math.tan(vt(r))),l=this.strokeProjectionMagnitude,c=a?l/o/Math.sqrt(1/o**2+1/n**2*h.y**2):l/Math.sqrt(1+h.y**2),u=new it(Math.sqrt(Math.max(l**2-c**2,0)),c),d=a?l/Math.sqrt(1+h.x**2*(1/o)**2/(1/n+1/n*h.x*h.y)**2):l/Math.sqrt(1+h.x**2/(1+h.x*h.y)**2),g=new it(d,Math.sqrt(Math.max(l**2-d**2,0)));return[g,g.scalarMultiply(-1),u,u.scalarMultiply(-1)].map(t=>this.applySkew(a?t.multiply(this.strokeUniformScalar):t)).forEach(i=>{De(i,t,e)&&s.push(this.applySkew(this.A).add(i))}),s}projectRound(){const t=[];t.push(...this.projectBevel());const e=this.alpha%x===0,s=this.applySkew(this.A),i=t[e?0:2].subtract(s),r=t[e?1:0].subtract(s),n=e?this.applySkew(this.AB.scalarMultiply(-1)):this.applySkew(this.bisector.multiply(this.strokeUniformScalar).scalarMultiply(-1)),o=Oe(i,n)>0,a=o?i:r,h=o?r:i;return this.isSkewed()?t.push(...this.projectRoundWithSkew(a,h)):t.push(...this.projectRoundNoSkew(a,h)),t}projectPoints(){switch(this.options.strokeLineJoin){case"miter":return this.projectMiter();case"round":return this.projectRound();default:return this.projectBevel()}}project(){return this.projectPoints().map(t=>({originPoint:this.A,projectedPoint:t,angle:this.alpha,bisector:this.bisector}))}}class Ti extends bi{constructor(t,e,s){super(s),this.A=new it(t),this.T=new it(e)}calcOrthogonalProjection(t,e){let s=arguments.length>2&&void 0!==arguments[2]?arguments[2]:this.strokeProjectionMagnitude;const i=this.createSideVector(t,e);return this.scaleUnitVector(Te(i),s)}projectButt(){return[this.projectOrthogonally(this.A,this.T,this.strokeProjectionMagnitude),this.projectOrthogonally(this.A,this.T,-this.strokeProjectionMagnitude)]}projectRound(){const t=[];if(!this.isSkewed()&&this.A.eq(this.T)){const e=new it(1,1).scalarMultiply(this.strokeProjectionMagnitude).multiply(this.strokeUniformScalar);t.push(this.applySkew(this.A.add(e)),this.applySkew(this.A.subtract(e)))}else t.push(...new wi(this.A,this.T,this.T,this.options).projectRound());return t}projectSquare(){const t=[];if(this.A.eq(this.T)){const e=new it(1,1).scalarMultiply(this.strokeProjectionMagnitude).multiply(this.strokeUniformScalar);t.push(this.A.add(e),this.A.subtract(e))}else{const e=this.calcOrthogonalProjection(this.A,this.T,this.strokeProjectionMagnitude),s=this.scaleUnitVector(we(this.createSideVector(this.A,this.T)),-this.strokeProjectionMagnitude),i=this.A.add(s);t.push(i.add(e),i.subtract(e))}return t.map(t=>this.applySkew(t))}projectPoints(){switch(this.options.strokeLineCap){case"round":return this.projectRound();case"square":return this.projectSquare();default:return this.projectButt()}}project(){return this.projectPoints().map(t=>({originPoint:this.A,projectedPoint:t}))}}const Oi=function(t,e){let s=arguments.length>2&&void 0!==arguments[2]&&arguments[2];const i=[];if(0===t.length)return i;const r=t.reduce((t,e)=>(t[t.length-1].eq(e)||t.push(new it(e)),t),[new it(t[0])]);if(1===r.length)s=!0;else if(!s){const t=r[0],e=((t,e)=>{for(let s=t.length-1;s>=0;s--)if(e(t[s],s,t))return s;return-1})(r,e=>!e.eq(t));r.splice(e+1)}return r.forEach((t,r,n)=>{let o,a;0===r?(a=n[1],o=s?t:n[n.length-1]):r===n.length-1?(o=n[r-1],a=s?t:n[0]):(o=n[r-1],a=n[r+1]),s&&1===n.length?i.push(...new Ti(t,t,e).project()):!s||0!==r&&r!==n.length-1?i.push(...new wi(t,o,a,e).project()):i.push(...new Ti(t,0===r?a:o,e).project())}),i},ki=t=>{const e={};return Object.keys(t).forEach(s=>{e[s]={},Object.keys(t[s]).forEach(i=>{e[s][i]={...t[s][i]}})}),e},Di=t=>t.replace(/&/g,"&").replace(/"/g,""").replace(/'/g,"'").replace(//g,">");let Mi;const Pi=t=>{if(Mi||Mi||(Mi="Intl"in g()&&"Segmenter"in Intl&&new Intl.Segmenter(void 0,{granularity:"grapheme"})),Mi){const e=Mi.segment(t);return Array.from(e).map(t=>{let{segment:e}=t;return e})}return Ei(t)},Ei=t=>{const e=[];for(let s,i=0;i{const s=t.charCodeAt(e);if(isNaN(s))return"";if(s<55296||s>57343)return t.charAt(e);if(55296<=s&&s<=56319){if(t.length<=e+1)throw"High surrogate without following low surrogate";const s=t.charCodeAt(e+1);if(56320>s||s>57343)throw"High surrogate without following low surrogate";return t.charAt(e)+t.charAt(e+1)}if(0===e)throw"Low surrogate without preceding high surrogate";const i=t.charCodeAt(e-1);if(55296>i||i>56319)throw"Low surrogate without preceding high surrogate";return!1};var ji=Object.freeze({__proto__:null,capitalize:function(t){let e=arguments.length>1&&void 0!==arguments[1]&&arguments[1];return`${t.charAt(0).toUpperCase()}${e?t.slice(1):t.slice(1).toLowerCase()}`},escapeXml:Di,graphemeSplit:Pi});const Fi=function(t,e){let s=arguments.length>2&&void 0!==arguments[2]&&arguments[2];return t.fill!==e.fill||t.stroke!==e.stroke||t.strokeWidth!==e.strokeWidth||t.fontSize!==e.fontSize||t.fontFamily!==e.fontFamily||t.fontWeight!==e.fontWeight||t.fontStyle!==e.fontStyle||t.textDecorationThickness!==e.textDecorationThickness||t.textBackgroundColor!==e.textBackgroundColor||t.deltaY!==e.deltaY||s&&(t.overline!==e.overline||t.underline!==e.underline||t.linethrough!==e.linethrough)},Li=(t,e)=>{const s=e.split("\n"),i=[];let r=-1,n={};t=ki(t);for(let e=0;e0&&(Fi(n,o,!0)?i.push({start:r,end:r+1,style:o}):i[i.length-1].end++),n=o||{}}else r+=o.length,n={}}return i},Ii=(t,e)=>{if(!Array.isArray(t))return ki(t);const s=e.split(E),i={};let r=-1,n=0;for(let e=0;e1&&void 0!==arguments[1]?arguments[1]:{},s={};for(const i in e)$i(t,i.split(" "))&&(s={...s,...e[i]});return s}const Yi=t=>{var e;return null!==(e=cs[t])&&void 0!==e?e:t},Wi=new RegExp(`(${os})`,"gi"),Vi=`(${os})`,Gi=String.raw`(skewX)\(${Vi}\)`,zi=String.raw`(skewY)\(${Vi}\)`,Hi=String.raw`(rotate)\(${Vi}(?: ${Vi} ${Vi})?\)`,Ni=String.raw`(scale)\(${Vi}(?: ${Vi})?\)`,Ui=String.raw`(translate)\(${Vi}(?: ${Vi})?\)`,qi=`(?:${String.raw`(matrix)\(${Vi} ${Vi} ${Vi} ${Vi} ${Vi} ${Vi}\)`}|${Ui}|${Hi}|${Ni}|${Gi}|${zi})`,Ki=`(?:${qi}*)`,Ji=String.raw`^\s*(?:${Ki}?)\s*$`,Qi=new RegExp(Ji),Zi=new RegExp(qi),tr=new RegExp(qi,"g");function er(t){const e=[];if(!(t=(t=>t.replace(Wi," $1 ").replace(/,/gi," ").replace(/\s+/gi," "))(t).replace(/\s*([()])\s*/gi,"$1"))||t&&!Qi.test(t))return[...b];for(const s of t.matchAll(tr)){const t=Zi.exec(s[0]);if(!t)continue;let i=b;const r=t.filter(t=>!!t),[,n,...o]=r,[a,h,l,c,u,d]=o.map(t=>parseFloat(t));switch(n){case"translate":i=Ot(a,h);break;case L:i=kt({angle:a},{x:h,y:l});break;case Y:i=Dt(a,h);break;case G:i=Pt(a);break;case z:i=Et(a);break;case"matrix":i=[a,h,l,c,u,d]}e.push(i)}return St(e)}function sr(t,e,s,i){const r=Array.isArray(e);let n,o=e;if(t!==H&&t!==N||e!==P){if("strokeUniform"===t)return"non-scaling-stroke"===e;if("strokeDashArray"===t)o=e===P?null:e.replace(/,/g," ").split(/\s+/).map(parseFloat);else if("transformMatrix"===t)o=s&&s.transformMatrix?bt(s.transformMatrix,er(e)):er(e);else if("visible"===t)o=e!==P&&"hidden"!==e,s&&!1===s.visible&&(o=!1);else if("opacity"===t)o=parseFloat(e),s&&void 0!==s.opacity&&(o*=s.opacity);else if("textAnchor"===t)o="start"===e?O:"end"===e?M:T;else if("charSpacing"===t||t===qe)n=Ge(e,i)/i*1e3;else if("paintFirst"===t){const t=e.indexOf(H),s=e.indexOf(N);o=H,(t>-1&&s>-1&&s-1)&&(o=N)}else{if("href"===t||"xlink:href"===t||"font"===t||"id"===t)return e;if("imageSmoothing"===t)return"optimizeQuality"===e;n=r?e.map(Ge):Ge(e,i)}}else o="";return!r&&isNaN(n)?o:n}function ir(t,e){t.replace(/;\s*$/,"").split(";").forEach(t=>{if(!t)return;const[s,i]=t.split(":");e[s.trim().toLowerCase()]=i.trim()})}function rr(t){const e={},s=t.getAttribute("style");return s?("string"==typeof s?ir(s,e):function(t,e){Object.entries(t).forEach(t=>{let[s,i]=t;void 0!==i&&(e[s.toLowerCase()]=i)})}(s,e),e):e}const nr={stroke:"strokeOpacity",fill:"fillOpacity"};function or(t,e,s){if(!t)return{};let i,r={},n=S;t.parentNode&&ps.test(t.parentNode.nodeName)&&(r=or(t.parentElement,e,s),r.fontSize&&(i=n=Ge(r.fontSize)));const o={...e.reduce((e,s)=>{const i=t.getAttribute(s);return i&&(e[s]=i),e},{}),...Xi(t,s),...rr(t)};o[ds]&&t.setAttribute(ds,o[ds]),o[us]&&(i=Ge(o[us],n),o[us]=`${i}`);const a={};for(const t in o){const e=Yi(t),s=sr(e,o[t],r,i);a[e]=s}a&&a.font&&function(t,e){const s=t.match(ls);if(!s)return;const i=s[1],r=s[3],n=s[4],o=s[5],a=s[6];i&&(e.fontStyle=i),r&&(e.fontWeight=isNaN(parseFloat(r))?r:parseFloat(r)),n&&(e.fontSize=Ge(n)),a&&(e.fontFamily=a),o&&(e.lineHeight="normal"===o?1:o)}(a.font,a);const h={...r,...a};return ps.test(t.nodeName)?h:function(t){const e=xi.getDefaults();return Object.entries(nr).forEach(s=>{let[i,r]=s;if(void 0===t[r]||""===t[i])return;if(void 0===t[i]){if(!e[i])return;t[i]=e[i]}if(0===t[i].indexOf("url("))return;const n=new Ve(t[i]);t[i]=n.setAlpha($t(n.getAlpha()*t[r],2)).toRgba()}),t}(h)}const ar=["rx","ry"];class hr extends xi{static getDefaults(){return{...super.getDefaults(),...hr.ownDefaults}}constructor(t){super(),Object.assign(this,hr.ownDefaults),this.setOptions(t),this._initRxRy()}_initRxRy(){const{rx:t,ry:e}=this;t&&!e?this.ry=t:e&&!t&&(this.rx=e)}_render(t){const{width:e,height:s}=this,i=-e/2,r=-s/2,n=this.rx?Math.min(this.rx,e/2):0,o=this.ry?Math.min(this.ry,s/2):0,a=0!==n||0!==o;t.beginPath(),t.moveTo(i+n,r),t.lineTo(i+e-n,r),a&&t.bezierCurveTo(i+e-w*n,r,i+e,r+w*o,i+e,r+o),t.lineTo(i+e,r+s-o),a&&t.bezierCurveTo(i+e,r+s-w*o,i+e-w*n,r+s,i+e-n,r+s),t.lineTo(i+n,r+s),a&&t.bezierCurveTo(i+w*n,r+s,i,r+s-w*o,i,r+s-o),t.lineTo(i,r+o),a&&t.bezierCurveTo(i,r+w*o,i+w*n,r,i+n,r),t.closePath(),this._renderPaintInOrder(t)}toObject(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[];return super.toObject([...ar,...t])}_toSVG(){const{width:t,height:e,rx:s,ry:i}=this;return["\n`]}static async fromElement(t,e,s){const{left:i=0,top:r=0,width:n=0,height:o=0,visible:a=!0,...h}=or(t,this.ATTRIBUTE_NAMES,s);return new this({...e,...h,left:i,top:r,width:n,height:o,visible:Boolean(a&&n&&o)})}}e(hr,"type","Rect"),e(hr,"cacheProperties",[...bs,...ar]),e(hr,"ownDefaults",{rx:0,ry:0}),e(hr,"ATTRIBUTE_NAMES",[...Ri,"x","y","rx","ry","width","height"]),J.setClass(hr),J.setSVGClass(hr);const lr="initialization",cr="added",ur="removed",dr="imperative",gr=(t,e)=>{const{strokeUniform:s,strokeWidth:i,width:r,height:n,group:o}=e,a=o&&o!==t?ce(o.calcTransformMatrix(),t.calcTransformMatrix()):null,h=a?e.getRelativeCenterPoint().transform(a):e.getRelativeCenterPoint(),l=!e.isStrokeAccountedForInDimensions(),c=s&&l?de(new it(i,i),void 0,t.calcTransformMatrix()):rt,u=!s&&l?i:0,d=le(r+u,n+u,St([a,e.calcOwnMatrix()],!0)).add(c).scalarDivide(2);return[h.subtract(d),h.add(d)]};class fr{calcLayoutResult(t,e){if(this.shouldPerformLayout(t))return this.calcBoundingBox(e,t)}shouldPerformLayout(t){let{type:e,prevStrategy:s,strategy:i}=t;return e===lr||e===dr||!!s&&i!==s}shouldLayoutClipPath(t){let{type:e,target:{clipPath:s}}=t;return e!==lr&&s&&!s.absolutePositioned}getInitialSize(t,e){return e.size}calcBoundingBox(t,e){const{type:s,target:i}=e;if(s===dr&&e.overrides)return e.overrides;if(0===t.length)return;const{left:r,top:n,width:o,height:a}=re(t.map(t=>gr(i,t)).reduce((t,e)=>t.concat(e),[])),h=new it(o,a),l=new it(r,n).add(h.scalarDivide(2));if(s===lr){const t=this.getInitialSize(e,{size:h,center:l});return{center:l,relativeCorrection:new it(0,0),size:t}}return{center:l.transform(i.calcOwnMatrix()),size:h}}}e(fr,"type","strategy");class pr extends fr{shouldPerformLayout(t){return!0}}e(pr,"type","fit-content"),J.setClass(pr);const mr="layoutManager";class vr{constructor(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:new pr;e(this,"strategy",void 0),this.strategy=t,this._subscriptions=new Map}performLayout(t){const e={bubbles:!0,strategy:this.strategy,...t,prevStrategy:this._prevLayoutStrategy,stopPropagation(){this.bubbles=!1}};this.onBeforeLayout(e);const s=this.getLayoutResult(e);s&&this.commitLayout(e,s),this.onAfterLayout(e,s),this._prevLayoutStrategy=e.strategy}attachHandlers(t,e){const{target:s}=e;return[U,A,R,F,j,I,X,B,$].map(e=>t.on(e,t=>this.performLayout(e===U?{type:"object_modified",trigger:e,e:t,target:s}:{type:"object_modifying",trigger:e,e:t,target:s})))}subscribe(t,e){this.unsubscribe(t,e);const s=this.attachHandlers(t,e);this._subscriptions.set(t,s)}unsubscribe(t,e){(this._subscriptions.get(t)||[]).forEach(t=>t()),this._subscriptions.delete(t)}unsubscribeTargets(t){t.targets.forEach(e=>this.unsubscribe(e,t))}subscribeTargets(t){t.targets.forEach(e=>this.subscribe(e,t))}onBeforeLayout(t){const{target:e,type:s}=t,{canvas:i}=e;if(s===lr||s===cr?this.subscribeTargets(t):s===ur&&this.unsubscribeTargets(t),e.fire("layout:before",{context:t}),i&&i.fire("object:layout:before",{target:e,context:t}),s===dr&&t.deep){const{strategy:s,...i}=t;e.forEachObject(t=>t.layoutManager&&t.layoutManager.performLayout({...i,bubbles:!1,target:t}))}}getLayoutResult(t){const{target:e,strategy:s,type:i}=t,r=s.calcLayoutResult(t,e.getObjects());if(!r)return;const n=i===lr?new it:e.getRelativeCenterPoint(),{center:o,correction:a=new it,relativeCorrection:h=new it}=r,l=n.subtract(o).add(a).transform(i===lr?b:Ct(e.calcOwnMatrix()),!0).add(h);return{result:r,prevCenter:n,nextCenter:o,offset:l}}commitLayout(t,e){const{target:s}=t,{result:{size:i},nextCenter:r}=e;var n,o;(s.set({width:i.x,height:i.y}),this.layoutObjects(t,e),t.type===lr)?s.set({left:null!==(n=t.x)&&void 0!==n?n:r.x+i.x*me(s.originX),top:null!==(o=t.y)&&void 0!==o?o:r.y+i.y*me(s.originY)}):(s.setPositionByOrigin(r,T,T),s.setCoords(),s.set("dirty",!0))}layoutObjects(t,e){const{target:s}=t;s.forEachObject(i=>{i.group===s&&this.layoutObject(t,e,i)}),t.strategy.shouldLayoutClipPath(t)&&this.layoutObject(t,e,s.clipPath)}layoutObject(t,e,s){let{offset:i}=e;s.set({left:s.left+i.x,top:s.top+i.y})}onAfterLayout(t,e){const{target:s,strategy:i,bubbles:r,prevStrategy:n,...o}=t,{canvas:a}=s;s.fire("layout:after",{context:t,result:e}),a&&a.fire("object:layout:after",{context:t,result:e,target:s});const h=s.parent;r&&null!=h&&h.layoutManager&&((o.path||(o.path=[])).push(s),h.layoutManager.performLayout({...o,target:h})),s.set("dirty",!0)}dispose(){const{_subscriptions:t}=this;t.forEach(t=>t.forEach(t=>t())),t.clear()}toObject(){return{type:mr,strategy:this.strategy.constructor.type}}toJSON(){return this.toObject()}}J.setClass(vr,mr);class yr extends vr{performLayout(){}}class _r extends(ot(xi)){static getDefaults(){return{...super.getDefaults(),..._r.ownDefaults}}constructor(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[],s=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};super(),e(this,"_activeObjects",[]),e(this,"__objectSelectionTracker",void 0),e(this,"__objectSelectionDisposer",void 0),Object.assign(this,_r.ownDefaults),this.setOptions(s),this.groupInit(t,s)}groupInit(t,e){var s;this._objects=[...t],this.__objectSelectionTracker=this.__objectSelectionMonitor.bind(this,!0),this.__objectSelectionDisposer=this.__objectSelectionMonitor.bind(this,!1),this.forEachObject(t=>{this.enterGroup(t,!1)}),this.layoutManager=null!==(s=e.layoutManager)&&void 0!==s?s:new vr,this.layoutManager.performLayout({type:lr,target:this,targets:[...t],x:e.left,y:e.top})}canEnterGroup(t){return t===this||this.isDescendantOf(t)?(r("error","Group: circular object trees are not supported, this call has no effect"),!1):-1===this._objects.indexOf(t)||(r("error","Group: duplicate objects are not supported inside group, this call has no effect"),!1)}_filterObjectsBeforeEnteringGroup(t){return t.filter((t,e,s)=>this.canEnterGroup(t)&&s.indexOf(t)===e)}add(){for(var t=arguments.length,e=new Array(t),s=0;s1?e-1:0),i=1;i{s._set(t,e)}),this}_shouldSetNestedCoords(){return this.subTargetCheck}removeAll(){return this._activeObjects=[],this.remove(...this._objects)}__objectSelectionMonitor(t,e){let{target:s}=e;const i=this._activeObjects;if(t)i.push(s),this._set("dirty",!0);else if(i.length>0){const t=i.indexOf(s);t>-1&&(i.splice(t,1),this._set("dirty",!0))}}_watchObject(t,e){t&&this._watchObject(!1,e),t?(e.on("selected",this.__objectSelectionTracker),e.on("deselected",this.__objectSelectionDisposer)):(e.off("selected",this.__objectSelectionTracker),e.off("deselected",this.__objectSelectionDisposer))}enterGroup(t,e){t.group&&t.group.remove(t),t._set("parent",this),this._enterGroup(t,e)}_enterGroup(t,e){e&&oe(t,bt(Ct(this.calcTransformMatrix()),t.calcTransformMatrix())),this._shouldSetNestedCoords()&&t.setCoords(),t._set("group",this),t._set("canvas",this.canvas),this._watchObject(!0,t);const s=this.canvas&&this.canvas.getActiveObject&&this.canvas.getActiveObject();s&&(s===t||t.isDescendantOf(s))&&this._activeObjects.push(t)}exitGroup(t,e){this._exitGroup(t,e),t._set("parent",void 0),t._set("canvas",void 0)}_exitGroup(t,e){t._set("group",void 0),e||(oe(t,bt(this.calcTransformMatrix(),t.calcTransformMatrix())),t.setCoords()),this._watchObject(!1,t);const s=this._activeObjects.length>0?this._activeObjects.indexOf(t):-1;s>-1&&this._activeObjects.splice(s,1)}shouldCache(){const t=xi.prototype.shouldCache.call(this);if(t)for(let t=0;tt.setCoords())}triggerLayout(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};this.layoutManager.performLayout({target:this,type:dr,...t})}render(t){this._transformDone=!0,super.render(t),this._transformDone=!1}__serializeObjects(t,e){const s=this.includeDefaultValues;return this._objects.filter(function(t){return!t.excludeFromExport}).map(function(i){const r=i.includeDefaultValues;i.includeDefaultValues=s;const n=i[t||"toObject"](e);return i.includeDefaultValues=r,n})}toObject(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[];const e=this.layoutManager.toObject();return{...super.toObject(["subTargetCheck","interactive",...t]),..."fit-content"!==e.strategy||this.includeDefaultValues?{layoutManager:e}:{},objects:this.__serializeObjects("toObject",t)}}toString(){return`#`}dispose(){this.layoutManager.unsubscribeTargets({targets:this.getObjects(),target:this}),this._activeObjects=[],this.forEachObject(t=>{this._watchObject(!1,t),t.dispose()}),super.dispose()}_createSVGBgRect(t){if(!this.backgroundColor)return"";const e=hr.prototype._toSVG.call(this),s=e.indexOf("COMMON_PARTS");e[s]='for="group" ';const i=e.join("");return t?t(i):i}_toSVG(t){const e=["\n"],s=this._createSVGBgRect(t);s&&e.push("\t\t",s);for(let s=0;s\n"),e}getSvgStyles(){const t=void 0!==this.opacity&&1!==this.opacity?`opacity: ${this.opacity};`:"",e=this.visible?"":" visibility: hidden;";return[t,this.getSvgFilter(),e].join("")}toClipPathSVG(t){const e=[],s=this._createSVGBgRect(t);s&&e.push("\t",s);for(let s=0;s{let[e,s]=t;const i=new this(e,{...n,...s,layoutManager:new yr});if(r){const t=J.getClass(r.type),e=J.getClass(r.strategy);i.layoutManager=new t(new e)}else i.layoutManager=new vr;return i.layoutManager.subscribeTargets({type:lr,target:i,targets:i.getObjects()}),i.setCoords(),i})}}e(_r,"type","Group"),e(_r,"ownDefaults",{strokeWidth:0,subTargetCheck:!1,interactive:!1}),J.setClass(_r);const xr=(t,e)=>Math.min(e.width/t.width,e.height/t.height),Cr=(t,e)=>Math.max(e.width/t.width,e.height/t.height),br="\\s*,?\\s*",Sr=`${br}(${os})`,wr=`${Sr}${Sr}${Sr}${br}([01])${br}([01])${Sr}${Sr}`,Tr={m:"l",M:"L"},Or=(t,e,s,i,r,n,o,a,h,l,c)=>{const u=et(t),d=st(t),g=et(e),f=st(e),p=s*r*g-i*n*f+o,m=i*r*g+s*n*f+a;return["C",l+h*(-s*r*d-i*n*u),c+h*(-i*r*d+s*n*u),p+h*(s*r*f+i*n*g),m+h*(i*r*f-s*n*g),p,m]},kr=(t,e,s,i)=>{const r=Math.atan2(e,t),n=Math.atan2(i,s);return n>=r?n-r:2*Math.PI-(r-n)};function Dr(t,e,s,r,n,o,a,h){let l;if(i.cachesBoundsOfCurve&&(l=[...arguments].join(),p.boundsOfCurveCache[l]))return p.boundsOfCurveCache[l];const c=Math.sqrt,u=Math.abs,d=[],g=[[0,0],[0,0]];let f=6*t-12*s+6*n,m=-3*t+9*s-9*n+3*a,v=3*s-3*t;for(let t=0;t<2;++t){if(t>0&&(f=6*e-12*r+6*o,m=-3*e+9*r-9*o+3*h,v=3*r-3*e),u(m)<1e-12){if(u(f)<1e-12)continue;const t=-v/f;0{let[i,r,n,o,a,h,l,c]=s;const u=((t,e,s,i,r,n,o)=>{if(0===s||0===i)return[];let a=0,h=0,l=0;const c=Math.PI,u=o*C,d=st(u),g=et(u),f=.5*(-g*t-d*e),p=.5*(-g*e+d*t),m=s**2,v=i**2,y=p**2,_=f**2,x=m*v-m*y-v*_;let b=Math.abs(s),S=Math.abs(i);if(x<0){const t=Math.sqrt(1-x/(m*v));b*=t,S*=t}else l=(r===n?-1:1)*Math.sqrt(x/(m*y+v*_));const w=l*b*p/S,T=-l*S*f/b,O=g*w-d*T+.5*t,k=d*w+g*T+.5*e;let D=kr(1,0,(f-w)/b,(p-T)/S),M=kr((f-w)/b,(p-T)/S,(-f-w)/b,(-p-T)/S);0===n&&M>0?M-=2*c:1===n&&M<0&&(M+=2*c);const P=Math.ceil(Math.abs(M/c*2)),E=[],A=M/P,j=8/3*Math.sin(A/4)*Math.sin(A/4)/Math.sin(A/2);let F=D+A;for(let t=0;t{let e=0,s=0,i=0,r=0;const n=[];let o,a=0,h=0;for(const l of t){const t=[...l];let c;switch(t[0]){case"l":t[1]+=e,t[2]+=s;case"L":e=t[1],s=t[2],c=["L",e,s];break;case"h":t[1]+=e;case"H":e=t[1],c=["L",e,s];break;case"v":t[1]+=s;case"V":s=t[1],c=["L",e,s];break;case"m":t[1]+=e,t[2]+=s;case"M":e=t[1],s=t[2],i=t[1],r=t[2],c=["M",e,s];break;case"c":t[1]+=e,t[2]+=s,t[3]+=e,t[4]+=s,t[5]+=e,t[6]+=s;case"C":a=t[3],h=t[4],e=t[5],s=t[6],c=["C",t[1],t[2],a,h,e,s];break;case"s":t[1]+=e,t[2]+=s,t[3]+=e,t[4]+=s;case"S":"C"===o?(a=2*e-a,h=2*s-h):(a=e,h=s),e=t[3],s=t[4],c=["C",a,h,t[1],t[2],e,s],a=c[3],h=c[4];break;case"q":t[1]+=e,t[2]+=s,t[3]+=e,t[4]+=s;case"Q":a=t[1],h=t[2],e=t[3],s=t[4],c=["Q",a,h,e,s];break;case"t":t[1]+=e,t[2]+=s;case"T":"Q"===o?(a=2*e-a,h=2*s-h):(a=e,h=s),e=t[1],s=t[2],c=["Q",a,h,e,s];break;case"a":t[6]+=e,t[7]+=s;case"A":Mr(e,s,t).forEach(t=>n.push(t)),e=t[6],s=t[7];break;case"z":case"Z":e=i,s=r,c=["Z"]}c?(n.push(c),o=c[0]):o=""}return n},Er=(t,e,s,i)=>Math.sqrt((s-t)**2+(i-e)**2),Ar=(t,e,s,i,r,n,o,a)=>h=>{const l=h**3,c=(t=>3*t**2*(1-t))(h),u=(t=>3*t*(1-t)**2)(h),d=(t=>(1-t)**3)(h);return new it(o*l+r*c+s*u+t*d,a*l+n*c+i*u+e*d)},jr=t=>t**2,Fr=t=>2*t*(1-t),Lr=t=>(1-t)**2,Ir=(t,e,s,i,r,n,o,a)=>h=>{const l=jr(h),c=Fr(h),u=Lr(h),d=3*(u*(s-t)+c*(r-s)+l*(o-r)),g=3*(u*(i-e)+c*(n-i)+l*(a-n));return Math.atan2(g,d)},Rr=(t,e,s,i,r,n)=>o=>{const a=jr(o),h=Fr(o),l=Lr(o);return new it(r*a+s*h+t*l,n*a+i*h+e*l)},Br=(t,e,s,i,r,n)=>o=>{const a=1-o,h=2*(a*(s-t)+o*(r-s)),l=2*(a*(i-e)+o*(n-i));return Math.atan2(l,h)},$r=(t,e,s)=>{let i=new it(e,s),r=0;for(let e=1;e<=100;e+=1){const s=t(e/100);r+=Er(i.x,i.y,s.x,s.y),i=s}return r},Xr=(t,e)=>{let s,i=0,r=0,n={x:t.x,y:t.y},o={...n},a=.01,h=0;const l=t.iterator,c=t.angleFinder;for(;r1e-4;)o=l(i),h=i,s=Er(n.x,n.y,o.x,o.y),s+r>e?(i-=a,a/=2):(n=o,i+=a,r+=s);return{...o,angle:c(h)}},Yr=t=>{let e,s,i=0,r=0,n=0,o=0,a=0;const h=[];for(const l of t){const t={x:r,y:n,command:l[0],length:0};switch(l[0]){case"M":s=t,s.x=o=r=l[1],s.y=a=n=l[2];break;case"L":s=t,s.length=Er(r,n,l[1],l[2]),r=l[1],n=l[2];break;case"C":e=Ar(r,n,l[1],l[2],l[3],l[4],l[5],l[6]),s=t,s.iterator=e,s.angleFinder=Ir(r,n,l[1],l[2],l[3],l[4],l[5],l[6]),s.length=$r(e,r,n),r=l[5],n=l[6];break;case"Q":e=Rr(r,n,l[1],l[2],l[3],l[4]),s=t,s.iterator=e,s.angleFinder=Br(r,n,l[1],l[2],l[3],l[4]),s.length=$r(e,r,n),r=l[3],n=l[4];break;case"Z":s=t,s.destX=o,s.destY=a,s.length=Er(r,n,o,a),r=o,n=a}i+=s.length,h.push(s)}return h.push({length:i,x:r,y:n}),h},Wr=function(t,e){let s=arguments.length>2&&void 0!==arguments[2]?arguments[2]:Yr(t),i=0;for(;e-s[i].length>0&&i{var e;const s=[],i=null!==(e=t.match(Vr))&&void 0!==e?e:[];for(const t of i){const e=t[0];if("z"===e||"Z"===e){s.push([e]);continue}const i=Hr[e.toLowerCase()];let r=[];if("a"===e||"A"===e){Gr.lastIndex=0;for(let e=null;e=Gr.exec(t);)r.push(...e.slice(1))}else r=t.match(zr)||[];for(let t=0;t0&&o?o:e;for(let e=0;e1&&void 0!==arguments[1]?arguments[1]:0,s=new it(t[0]),i=new it(t[1]),r=1,n=0;const o=[],a=t.length,h=a>2;let l;for(h&&(r=t[2].xt[l-2].x?1:s.x===t[l-2].x?0:-1,n=s.y>t[l-2].y?1:s.y===t[l-2].y?0:-1),o.push(["L",s.x+r*e,s.y+n*e]),o},qr=(t,e)=>t.map(t=>t.map((t,s)=>0===s||void 0===e?t:$t(t,e)).join(" ")).join(" "),Kr=(t,e)=>Math.floor(Math.random()*(e-t+1))+t,Jr=(t,e)=>{let s=t._findCenterFromElement();t.transformMatrix&&((t=>{if(t.transformMatrix){const{scaleX:e,scaleY:s,angle:i,skewX:r}=Tt(t.transformMatrix);t.flipX=!1,t.flipY=!1,t.set(W,e),t.set(V,s),t.angle=i,t.skewX=r,t.skewY=0}})(t),s=s.transform(t.transformMatrix)),delete t.transformMatrix,e&&(t.scaleX*=e.scaleX,t.scaleY*=e.scaleY,t.cropX=e.cropX,t.cropY=e.cropY,s.x+=e.offsetLeft,s.y+=e.offsetTop,t.width=e.width,t.height=e.height),t.setPositionByOrigin(s,T,T)};var Qr=Object.freeze({__proto__:null,addTransformToObject:ne,animate:Rs,animateColor:Bs,applyTransformToObject:oe,calcAngleBetweenVectors:be,calcDimensionsMatrix:At,calcPlaneChangeMatrix:ce,calcVectorRotation:Se,cancelAnimFrame:lt,capValue:xs,composeMatrix:jt,copyCanvasElement:t=>{var e;const s=ft(t);return null===(e=s.getContext("2d"))||void 0===e||e.drawImage(t,0,0),s},cos:et,createCanvasElement:dt,createImage:gt,createRotateMatrix:kt,createScaleMatrix:Dt,createSkewXMatrix:Pt,createSkewYMatrix:Et,createTranslateMatrix:Ot,createVector:xe,crossProduct:Oe,degreesToRadians:vt,dotProduct:ke,ease:Ms,enlivenObjectEnlivables:It,enlivenObjects:Lt,findScaleToCover:Cr,findScaleToFit:xr,getBoundsOfCurve:Dr,getOrthonormalVector:Te,getPathSegmentsInfo:Yr,getPointOnPath:Wr,getPointer:ee,getRandomInt:Kr,getRegularPolygonPath:(t,e)=>{const s=2*Math.PI/t;let i=-y;t%2==0&&(i+=s/2);const r=new Array(t+1);for(let n=0;n{const e=["instantiated_by_use","style","id","class"];switch(t){case"linearGradient":return e.concat(["x1","y1","x2","y2","gradientUnits","gradientTransform"]);case"radialGradient":return e.concat(["gradientUnits","gradientTransform","cx","cy","r","fx","fy","fr"]);case"stop":return e.concat(["offset","stop-color","stop-opacity"])}return e},getUnitVector:we,groupSVGElements:(t,e)=>t&&1===t.length?t[0]:new _r(t,e),hasStyleChanged:Fi,invertTransform:Ct,isBetweenVectors:De,isIdentityMatrix:_t,isTouchEvent:se,isTransparent:Ci,joinPath:qr,loadImage:Ft,magnitude:Ce,makeBoundingBoxFromPoints:re,makePathSimpler:Pr,matrixToSVG:Xt,mergeClipPaths:(t,e)=>{var s;let i=t,r=e;i.inverted&&!r.inverted&&(i=e,r=t),ge(r,null===(s=r.group)||void 0===s?void 0:s.calcTransformMatrix(),i.calcTransformMatrix());const n=i.inverted&&r.inverted;return n&&(i.inverted=r.inverted=!1),new _r([i],{clipPath:r,inverted:n})},multiplyTransformMatrices:bt,multiplyTransformMatrixArray:St,parsePath:Nr,parsePreserveAspectRatioAttribute:ze,parseUnit:Ge,pick:Rt,projectStrokeOnPoints:Oi,qrDecompose:Tt,radiansToDegrees:yt,removeFromArray:tt,removeTransformFromObject:(t,e)=>{const s=Ct(e),i=bt(s,t.calcOwnMatrix());oe(t,i)},removeTransformMatrixForSvgParsing:Jr,requestAnimFrame:ht,resetObjectTransform:ae,rotateVector:_e,saveObjectTransform:he,sendObjectToPlane:ge,sendPointToPlane:ue,sendVectorToPlane:de,sin:st,sizeAfterTransform:le,string:ji,stylesFromArray:Ii,stylesToArray:Li,toBlob:mt,toDataURL:pt,toFixed:$t,transformPath:(t,e,s)=>(s&&(e=bt(e,[1,0,0,1,-s.x,-s.y])),t.map(t=>{const s=[...t];for(let i=1;i{let[e,i]=t;return s.setProperty(e,i)})}class tn extends Jt{constructor(t){let{allowTouchScrolling:s=!1,containerClass:i=""}=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};super(t),e(this,"upper",void 0),e(this,"container",void 0);const{el:r}=this.lower,n=this.createUpperCanvas();this.upper={el:n,ctx:n.getContext("2d")},this.applyCanvasStyle(r,{allowTouchScrolling:s}),this.applyCanvasStyle(n,{allowTouchScrolling:s,styles:{position:"absolute",left:"0",top:"0"}});const o=this.createContainerElement();o.classList.add(i),r.parentNode&&r.parentNode.replaceChild(o,r),o.append(r,n),this.container=o}createUpperCanvas(){const{el:t}=this.lower,e=dt();return e.className=t.className,e.classList.remove("lower-canvas"),e.classList.add("upper-canvas"),e.setAttribute("data-fabric","top"),e.style.cssText=t.style.cssText,e.setAttribute("draggable","true"),e}createContainerElement(){const t=d().createElement("div");return t.setAttribute("data-fabric","wrapper"),Zr(t,{position:"relative"}),Kt(t),t}applyCanvasStyle(t,e){const{styles:s,allowTouchScrolling:i}=e;Zr(t,{...s,"touch-action":i?"manipulation":P}),Kt(t)}setDimensions(t,e){super.setDimensions(t,e);const{el:s,ctx:i}=this.upper;Ut(s,i,t,e)}setCSSDimensions(t){super.setCSSDimensions(t),qt(this.upper.el,t),qt(this.container,t)}cleanupDOM(t){const e=this.container,{el:s}=this.lower,{el:i}=this.upper;super.cleanupDOM(t),e.removeChild(i),e.removeChild(s),e.parentNode&&e.parentNode.replaceChild(s,e)}dispose(){super.dispose(),u().dispose(this.upper.el),delete this.upper,delete this.container}}class en extends Zt{constructor(){super(...arguments),e(this,"isolatedObject",void 0),e(this,"_searchTargets",void 0),e(this,"_hoveredTargets",[]),e(this,"_currentTransform",null),e(this,"_groupSelector",null),e(this,"contextTopDirty",!1)}static getDefaults(){return{...super.getDefaults(),...en.ownDefaults}}get upperCanvasEl(){var t;return null===(t=this.elements.upper)||void 0===t?void 0:t.el}get contextTop(){var t;return null===(t=this.elements.upper)||void 0===t?void 0:t.ctx}get wrapperEl(){return this.elements.container}initElements(t){this.elements=new tn(t,{allowTouchScrolling:this.allowTouchScrolling,containerClass:this.containerClass}),this._createCacheCanvas()}_onObjectAdded(t){this._objectsToRender=void 0,super._onObjectAdded(t)}_onObjectRemoved(t){this._objectsToRender=void 0,t===this._activeObject&&(this.fire("before:selection:cleared",{deselected:[t]}),this._discardActiveObject(),this.fire("selection:cleared",{deselected:[t]}),t.fire("deselected",{target:t})),t===this._hoveredTarget&&(this._hoveredTarget=void 0,this._hoveredTargets=[]),super._onObjectRemoved(t)}_onStackOrderChanged(){this._objectsToRender=void 0,super._onStackOrderChanged()}_chooseObjectsToRender(){const t=this._activeObject;return!this.preserveObjectStacking&&t?this._objects.filter(e=>!e.group&&e!==t).concat(t):this._objects}renderAll(){this.cancelRequestedRender(),this.destroyed||(!this.contextTopDirty||this._groupSelector||this.isDrawingMode||(this.clearContext(this.contextTop),this.contextTopDirty=!1),this.hasLostContext&&(this.renderTopLayer(this.contextTop),this.hasLostContext=!1),!this._objectsToRender&&(this._objectsToRender=this._chooseObjectsToRender()),this.renderCanvas(this.getContext(),this._objectsToRender))}renderTopLayer(t){t.save(),this.isDrawingMode&&this._isCurrentlyDrawing&&(this.freeDrawingBrush&&this.freeDrawingBrush._render(),this.contextTopDirty=!0),this.selection&&this._groupSelector&&(this._drawSelection(t),this.contextTopDirty=!0),t.restore()}renderTop(){const t=this.contextTop;this.clearContext(t),this.renderTopLayer(t),this.fire("after:render",{ctx:t})}setTargetFindTolerance(t){t=Math.round(t),this.targetFindTolerance=t;const e=this.getRetinaScaling(),s=Math.ceil((2*t+1)*e);this.pixelFindCanvasEl.width=this.pixelFindCanvasEl.height=s,this.pixelFindContext.scale(e,e)}isTargetTransparent(t,e,s){const i=this.targetFindTolerance,r=this.pixelFindContext;this.clearContext(r),r.save(),r.translate(-e+i,-s+i),r.transform(...this.viewportTransform);const n=t.selectionBackgroundColor;t.selectionBackgroundColor="",t.render(r),t.selectionBackgroundColor=n,r.restore();const o=Math.round(i*this.getRetinaScaling());return Ci(r,o,o,o)}_isSelectionKeyPressed(t){const e=this.selectionKey;return!!e&&(Array.isArray(e)?!!e.find(e=>!!e&&!0===t[e]):t[e])}_shouldClearSelection(t,e){const s=this.getActiveObjects(),i=this._activeObject;return!!(!e||e&&i&&s.length>1&&-1===s.indexOf(e)&&i!==e&&!this._isSelectionKeyPressed(t)||e&&!e.evented||e&&!e.selectable&&i&&i!==e)}_shouldCenterTransform(t,e,s){if(!t)return;let i;return e===Y||e===W||e===V||e===R?i=this.centeredScaling||t.centeredScaling:e===L&&(i=this.centeredRotation||t.centeredRotation),i?!s:s}_getOriginFromCorner(t,e){const s={x:t.originX,y:t.originY};return e?(["ml","tl","bl"].includes(e)?s.x=M:["mr","tr","br"].includes(e)&&(s.x=O),["tl","mt","tr"].includes(e)?s.y=D:["bl","mb","br"].includes(e)&&(s.y=k),s):s}_setupCurrentTransform(t,e,s){var i;const r=e.group?ue(this.getScenePoint(t),void 0,e.group.calcTransformMatrix()):this.getScenePoint(t),{key:n="",control:o}=e.getActiveControl()||{},a=s&&o?null===(i=o.getActionHandler(t,e,o))||void 0===i?void 0:i.bind(o):Ie,h=((t,e,s,i)=>{if(!e||!t)return"drag";const r=i.controls[e];return r.getActionName(s,r,i)})(s,n,t,e),l=t[this.centeredKey],c=this._shouldCenterTransform(e,h,l)?{x:T,y:T}:this._getOriginFromCorner(e,n),u={target:e,action:h,actionHandler:a,actionPerformed:!1,corner:n,scaleX:e.scaleX,scaleY:e.scaleY,skewX:e.skewX,skewY:e.skewY,offsetX:r.x-e.left,offsetY:r.y-e.top,originX:c.x,originY:c.y,ex:r.x,ey:r.y,lastX:r.x,lastY:r.y,theta:vt(e.angle),width:e.width,height:e.height,shiftKey:t.shiftKey,altKey:l,original:{...he(e),originX:c.x,originY:c.y}};this._currentTransform=u,this.fire("before:transform",{e:t,transform:u})}setCursor(t){this.upperCanvasEl.style.cursor=t}_drawSelection(t){const{x:e,y:s,deltaX:i,deltaY:r}=this._groupSelector,n=new it(e,s).transform(this.viewportTransform),o=new it(e+i,s+r).transform(this.viewportTransform),a=this.selectionLineWidth/2;let h=Math.min(n.x,o.x),l=Math.min(n.y,o.y),c=Math.max(n.x,o.x),u=Math.max(n.y,o.y);this.selectionColor&&(t.fillStyle=this.selectionColor,t.fillRect(h,l,c-h,u-l)),this.selectionLineWidth&&this.selectionBorderColor&&(t.lineWidth=this.selectionLineWidth,t.strokeStyle=this.selectionBorderColor,h+=a,l+=a,c-=a,u-=a,xi.prototype._setLineDash.call(this,t,this.selectionDashArray),t.strokeRect(h,l,c-h,u-l))}dblClickLock(t){if(this.dblClickIsolateObject){const e=this.getScenePoint(t),s=this.isolatedObject?this.isolatedObject.getObjects():this.getObjects(),i=this.searchPossibleTargets(s,e);if(i.target){if(!(i.target instanceof _r))return!1;this.isolatedObject=i.target,this.discardActiveObject(),i.target._objects.forEach(t=>{t.setCoords()})}else this.isolatedObject=null,this.discardActiveObject();return!0}return!1}setSearchTargets(t){this._searchTargets=t}getSearchTargets(){return this._searchTargets||(this.isolatedObject?this.isolatedObject._objects:this._objects)}findTarget(t){if(this._targetInfo)return this._targetInfo;if(this.skipTargetFind)return{subTargets:[],currentSubTargets:[]};const e=this.getScenePoint(t),s=this._activeObject,i=this.getActiveObjects(),r=this.searchPossibleTargets(this.getSearchTargets(),e),{subTargets:n,container:o,target:a}=r,h={...r,currentSubTargets:n,currentContainer:o,currentTarget:a};if(!s)return h;const l={...this.searchPossibleTargets([s],e),currentSubTargets:n,currentContainer:o,currentTarget:a};if(s.findControl(this.getViewportPoint(t),se(t)))return{...l,target:s};if(l.target){if(i.length>1)return l;if(!this.preserveObjectStacking)return l;if(this.preserveObjectStacking&&t[this.altSelectionKey])return l}return h}_pointIsInObjectSelectionArea(t,e){let s=t.getCoords();const i=this.getZoom(),r=t.padding/i;if(r){const[t,e,i,n]=s,o=Math.atan2(e.y-t.y,e.x-t.x),a=et(o)*r,h=st(o)*r,l=a+h,c=a-h;s=[new it(t.x-c,t.y-l),new it(e.x+l,e.y-c),new it(i.x+c,i.y+l),new it(n.x-l,n.y+c)]}return $s.isPointInPolygon(e,s)}_checkTarget(t,e){if(t&&t.visible&&t.evented&&this._pointIsInObjectSelectionArea(t,e)){if(!this.perPixelTargetFind&&!t.perPixelTargetFind||t.isEditing)return!0;{const s=e.transform(this.viewportTransform);if(!this.isTargetTransparent(t,s.x,s.y))return!0}}return!1}_searchPossibleTargets(t,e,s){let i=t.length;for(;i--;){const r=t[i];if(this._checkTarget(r,e)){if(!this.dblClickIsolateObject&&nt(r)&&r.subTargetCheck){const{target:t}=this._searchPossibleTargets(r._objects,e,s);t&&s.push(t)}return{target:r,subTargets:s}}}return{subTargets:[]}}searchPossibleTargets(t,e){const s=this._searchPossibleTargets(t,e,[]);s.container=s.target;const{container:i,subTargets:r}=s;if(i&&nt(i)&&i.interactive&&r[0]){for(let t=r.length-1;t>0;t--){const e=r[t];if(!nt(e)||!e.interactive)return s.target=e,s}return s.target=r[0],s}return s}getViewportPoint(t){return this._viewportPoint?this._viewportPoint:this._getPointerImpl(t,!0)}getScenePoint(t){return this._scenePoint?this._scenePoint:this._getPointerImpl(t)}_getPointerImpl(t){let e=arguments.length>1&&void 0!==arguments[1]&&arguments[1];const s=this.upperCanvasEl,i=s.getBoundingClientRect();let r=ee(t),n=i.width||0,o=i.height||0;n&&o||(k in i&&D in i&&(o=Math.abs(i.top-i.bottom)),M in i&&O in i&&(n=Math.abs(i.right-i.left))),this.calcOffset(),r.x=r.x-this._offset.left,r.y=r.y-this._offset.top,e||(r=ue(r,void 0,this.viewportTransform));const a=this.getRetinaScaling();1!==a&&(r.x/=a,r.y/=a);const h=0===n||0===o?new it(1,1):new it(s.width/n,s.height/o);return r.multiply(h)}_setDimensionsImpl(t,e){this._resetTransformEventData(),super._setDimensionsImpl(t,e),this._isCurrentlyDrawing&&this.freeDrawingBrush&&this.freeDrawingBrush._setBrushStyles(this.contextTop)}_createCacheCanvas(){this.pixelFindCanvasEl=dt(),this.pixelFindContext=this.pixelFindCanvasEl.getContext("2d",{willReadFrequently:!0}),this.setTargetFindTolerance(this.targetFindTolerance)}getTopContext(){return this.elements.upper.ctx}getSelectionContext(){return this.elements.upper.ctx}getSelectionElement(){return this.elements.upper.el}getActiveObject(){return this._activeObject}getActiveObjects(){const t=this._activeObject;return Gt(t)?t.getObjects():t?[t]:[]}_fireSelectionEvents(t,e){let s=!1,i=!1;const r=this.getActiveObjects(),n=[],o=[];t.forEach(t=>{r.includes(t)||(s=!0,t.fire("deselected",{e:e,target:t}),o.push(t))}),r.forEach(i=>{t.includes(i)||(s=!0,i.fire("selected",{e:e,target:i}),n.push(i))}),t.length>0&&r.length>0?(i=!0,s&&this.fire("selection:updated",{e:e,selected:n,deselected:o})):r.length>0?(i=!0,this.fire("selection:created",{e:e,selected:n})):t.length>0&&(i=!0,this.fire("selection:cleared",{e:e,deselected:o})),i&&(this._objectsToRender=void 0)}setActiveObject(t,e){const s=this.getActiveObjects(),i=this._setActiveObject(t,e);return this._fireSelectionEvents(s,e),i}_setActiveObject(t,e){const s=this._activeObject;return s!==t&&(!(!this._discardActiveObject(e,t)&&this._activeObject)&&(!t.onSelect({e:e})&&(this._activeObject=t,Gt(t)&&s!==t&&t.set("canvas",this),t.setCoords(),!0)))}_discardActiveObject(t,e){const s=this._activeObject;return!!s&&(!s.onDeselect({e:t,object:e})&&(this._currentTransform&&this._currentTransform.target===s&&this.endCurrentTransform(t),Gt(s)&&s===this._hoveredTarget&&(this._hoveredTarget=void 0),this._activeObject=void 0,!0))}discardActiveObject(t){const e=this.getActiveObjects(),s=this.getActiveObject();e.length&&this.fire("before:selection:cleared",{e:t,deselected:[s]});const i=this._discardActiveObject(t);return this._fireSelectionEvents(e,t),i}endCurrentTransform(t){const e=this._currentTransform;this._finalizeCurrentTransform(t),e&&e.target&&(e.target.isMoving=!1),this._currentTransform=null}_finalizeCurrentTransform(t){const e=this._currentTransform,s=e.target,i={e:t,target:s,transform:e,action:e.action};s._scaling&&(s._scaling=!1),s.setCoords(),e.actionPerformed&&(this.fire("object:modified",i),s.fire(U,i))}setViewportTransform(t){super.setViewportTransform(t);const e=this._activeObject;e&&e.setCoords()}destroy(){const t=this._activeObject;Gt(t)&&(t.removeAll(),t.dispose()),delete this._activeObject,super.destroy(),this.pixelFindContext=null,this.pixelFindCanvasEl=void 0}clear(){this.discardActiveObject(),this._activeObject=void 0,this.clearContext(this.contextTop),super.clear()}drawControls(t){const e=this._activeObject;e&&e._renderControls(t)}_toObject(t,e,s){const i=this._realizeGroupTransformOnObject(t),r=super._toObject(t,e,s);return t.set(i),r}_realizeGroupTransformOnObject(t){const{group:e}=t;if(e&&Gt(e)&&this._activeObject===e){const s=Rt(t,["angle","flipX","flipY",O,W,V,G,z,k]);return ne(t,e.calcOwnMatrix()),s}return{}}_setSVGObject(t,e,s){const i=this._realizeGroupTransformOnObject(e);super._setSVGObject(t,e,s),e.set(i)}}e(en,"ownDefaults",{uniformScaling:!0,uniScaleKey:"shiftKey",centeredScaling:!1,centeredRotation:!1,centeredKey:"altKey",altActionKey:"shiftKey",selection:!0,selectionKey:"shiftKey",selectionColor:"rgba(100, 100, 255, 0.3)",selectionDashArray:[],selectionBorderColor:"rgba(255, 255, 255, 0.3)",selectionLineWidth:1,selectionFullyContained:!1,hoverCursor:"move",moveCursor:"move",defaultCursor:"default",freeDrawingCursor:"crosshair",notAllowedCursor:"not-allowed",perPixelTargetFind:!1,targetFindTolerance:0,skipTargetFind:!1,stopContextMenu:!0,fireRightClick:!0,fireMiddleClick:!0,enablePointerEvents:!1,containerClass:"canvas-container",preserveObjectStacking:!0});class sn{constructor(t){e(this,"targets",[]),e(this,"__disposer",void 0);const s=()=>{const{hiddenTextarea:e}=t.getActiveObject()||{};e&&e.focus()},i=t.upperCanvasEl;i.addEventListener("click",s),this.__disposer=()=>i.removeEventListener("click",s)}exitTextEditing(){this.target=void 0,this.targets.forEach(t=>{t.isEditing&&t.exitEditing()})}add(t){this.targets.push(t)}remove(t){this.unregister(t),tt(this.targets,t)}register(t){this.target=t}unregister(t){t===this.target&&(this.target=void 0)}onMouseMove(t){var e;(null===(e=this.target)||void 0===e?void 0:e.isEditing)&&this.target.updateSelectionOnMouseMove(t)}clear(){this.targets=[],this.target=void 0}dispose(){this.clear(),this.__disposer(),delete this.__disposer}}const rn={passive:!1},nn=(t,e)=>({viewportPoint:t.getViewportPoint(e),scenePoint:t.getScenePoint(e)}),on=function(t){for(var e=arguments.length,s=new Array(e>1?e-1:0),i=1;i1?e-1:0),i=1;i1&&void 0!==arguments[1]?arguments[1]:{}),e(this,"_isClick",void 0),e(this,"textEditingManager",new sn(this)),["_onMouseDown","_onTouchStart","_onMouseMove","_onMouseUp","_onTouchEnd","_onResize","_onMouseWheel","_onMouseOut","_onMouseEnter","_onContextMenu","_onClick","_onDragStart","_onDragEnd","_onDragProgress","_onDragOver","_onDragEnter","_onDragLeave","_onDrop"].forEach(t=>{this[t]=this[t].bind(this)}),this.addOrRemove(on,"add")}_getEventPrefix(){return this.enablePointerEvents?"pointer":"mouse"}addOrRemove(t,e){const s=this.upperCanvasEl,i=this._getEventPrefix();t(Nt(s),"resize",this._onResize),t(s,i+"down",this._onMouseDown),t(s,`${i}move`,this._onMouseMove,rn),t(s,`${i}out`,this._onMouseOut),t(s,`${i}enter`,this._onMouseEnter),t(s,"wheel",this._onMouseWheel,{passive:!1}),t(s,"contextmenu",this._onContextMenu),t(s,"click",this._onClick),t(s,"dblclick",this._onClick),t(s,"dragstart",this._onDragStart),t(s,"dragend",this._onDragEnd),t(s,"dragover",this._onDragOver),t(s,"dragenter",this._onDragEnter),t(s,"dragleave",this._onDragLeave),t(s,"drop",this._onDrop),this.enablePointerEvents||t(s,"touchstart",this._onTouchStart,rn)}removeListeners(){this.addOrRemove(an,"remove");const t=this._getEventPrefix(),e=Ht(this.upperCanvasEl);an(e,`${t}up`,this._onMouseUp),an(e,"touchend",this._onTouchEnd,rn),an(e,`${t}move`,this._onMouseMove,rn),an(e,"touchmove",this._onMouseMove,rn),clearTimeout(this._willAddMouseDown)}_onMouseWheel(t){this._cacheTransformEventData(t),this._handleEvent(t,"wheel"),this._resetTransformEventData()}_onMouseOut(t){const e=this._hoveredTarget,s={e:t,...nn(this,t)};this.fire("mouse:out",{...s,target:e}),this._hoveredTarget=void 0,e&&e.fire("mouseout",{...s}),this._hoveredTargets.forEach(t=>{this.fire("mouse:out",{...s,target:t}),t&&t.fire("mouseout",{...s})}),this._hoveredTargets=[]}_onMouseEnter(t){const{target:e}=this.findTarget(t);this._currentTransform||e||(this.fire("mouse:over",{e:t,...nn(this,t)}),this._hoveredTarget=void 0,this._hoveredTargets=[])}_onDragStart(t){this._isClick=!1;const e=this.getActiveObject();if(e&&e.onDragStart(t)){this._dragSource=e;const s={e:t,target:e};return this.fire("dragstart",s),e.fire("dragstart",s),void on(this.upperCanvasEl,"drag",this._onDragProgress)}ie(t)}_renderDragEffects(t,e,s){let i=!1;const r=this._dropTarget;r&&r!==e&&r!==s&&(r.clearContextTop(),i=!0),null==e||e.clearContextTop(),s!==e&&(null==s||s.clearContextTop());const n=this.contextTop;n.save(),n.transform(...this.viewportTransform),e&&(n.save(),e.transform(n),e.renderDragSourceEffect(t),n.restore(),i=!0),s&&(n.save(),s.transform(n),s.renderDropTargetEffect(t),n.restore(),i=!0),n.restore(),i&&(this.contextTopDirty=!0)}_onDragEnd(t){const{currentSubTargets:e}=this.findTarget(t),s=!!t.dataTransfer&&t.dataTransfer.dropEffect!==P,i=s?this._activeObject:void 0,r={e:t,target:this._dragSource,subTargets:e,dragSource:this._dragSource,didDrop:s,dropTarget:i};an(this.upperCanvasEl,"drag",this._onDragProgress),this.fire("dragend",r),this._dragSource&&this._dragSource.fire("dragend",r),delete this._dragSource,this._onMouseUp(t)}_onDragProgress(t){const e={e:t,target:this._dragSource,dragSource:this._dragSource,dropTarget:this._draggedoverTarget};this.fire("drag",e),this._dragSource&&this._dragSource.fire("drag",e)}_onDragOver(t){const e="dragover",{currentContainer:s,currentSubTargets:i}=this.findTarget(t),r=this._dragSource,n={e:t,target:s,subTargets:i,dragSource:r,canDrop:!1,dropTarget:void 0};let o;this.fire(e,n),this._fireEnterLeaveEvents(t,s,n),s&&(s.canDrop(t)&&(o=s),s.fire(e,n));for(let s=0;s3||e<2||(this._cacheTransformEventData(t),2==e&&"dblclick"===t.type&&this._onDblClick(t),3==e&&this._handleEvent(t,"tripleclick"),this._resetTransformEventData())}_onDblClick(t){if(this.dblClickLock(t))return this._resetTransformEventData(),this.__onMouseDown(t),void this.__onMouseUp(t);this._handleEvent(t,"dblclick")}getPointerId(t){const e=t.changedTouches;return e?e[0]&&e[0].identifier:this.enablePointerEvents?t.pointerId:-1}_isMainEvent(t){return!0===t.isPrimary||!1!==t.isPrimary&&("touchend"===t.type&&0===t.touches.length||(!t.changedTouches||t.changedTouches[0].identifier===this.mainTouchId))}_onTouchStart(t){this._cacheTransformEventData(t);let e=!this.allowTouchScrolling;const s=this._activeObject;void 0===this.mainTouchId&&(this.mainTouchId=this.getPointerId(t)),this.__onMouseDown(t);const{target:i}=this.findTarget(t);(this.isDrawingMode||s&&i===s)&&(e=!0),e&&t.preventDefault();const r=this.upperCanvasEl,n=this._getEventPrefix(),o=Ht(r);on(o,"touchend",this._onTouchEnd,rn),e&&on(o,"touchmove",this._onMouseMove,rn),an(r,`${n}down`,this._onMouseDown),this._resetTransformEventData()}_onMouseDown(t){this._cacheTransformEventData(t),this.__onMouseDown(t);const e=this.upperCanvasEl,s=this._getEventPrefix();an(e,`${s}move`,this._onMouseMove,rn);const i=Ht(e);on(i,`${s}up`,this._onMouseUp),on(i,`${s}move`,this._onMouseMove,rn),this._resetTransformEventData()}_onTouchEnd(t){if(t.touches.length>0)return;this._cacheTransformEventData(t),this.__onMouseUp(t),this._resetTransformEventData(),delete this.mainTouchId;const e=this._getEventPrefix(),s=Ht(this.upperCanvasEl);an(s,"touchend",this._onTouchEnd,rn),an(s,"touchmove",this._onMouseMove,rn),this._willAddMouseDown&&clearTimeout(this._willAddMouseDown),this._willAddMouseDown=setTimeout(()=>{on(this.upperCanvasEl,`${e}down`,this._onMouseDown),this._willAddMouseDown=0},400)}_onMouseUp(t){this._cacheTransformEventData(t),this.__onMouseUp(t);const e=this.upperCanvasEl,s=this._getEventPrefix();if(this._isMainEvent(t)){const t=Ht(this.upperCanvasEl);an(t,`${s}up`,this._onMouseUp),an(t,`${s}move`,this._onMouseMove,rn),on(e,`${s}move`,this._onMouseMove,rn)}this._resetTransformEventData()}_onMouseMove(t){this._cacheTransformEventData(t);const e=this.getActiveObject();!this.allowTouchScrolling&&(!e||!e.shouldStartDragging(t))&&t.preventDefault&&t.preventDefault(),this.__onMouseMove(t),this._resetTransformEventData()}_onResize(){this.calcOffset(),this._resetTransformEventData()}_shouldRender(t){const e=this.getActiveObject();return!!e!=!!t||e&&t&&e!==t}__onMouseUp(t){var e;this._handleEvent(t,"up:before");const s=this._currentTransform,i=this._isClick,{target:r}=this.findTarget(t),{button:n}=t;if(n)return void((this.fireMiddleClick&&1===n||this.fireRightClick&&2===n)&&this._handleEvent(t,"up"));if(this.isDrawingMode&&this._isCurrentlyDrawing)return void this._onMouseUpInDrawingMode(t);if(!this._isMainEvent(t))return;let o,a,h=!1;if(s&&(this._finalizeCurrentTransform(t),h=s.actionPerformed),!i){const e=r===this._activeObject;this.handleSelection(t),h||(h=this._shouldRender(r)||!e&&r===this._activeObject)}if(r){const e=r.findControl(this.getViewportPoint(t),se(t)),{key:i,control:n}=e||{};if(a=i,r.selectable&&r!==this._activeObject&&"up"===r.activeOn)this.setActiveObject(r,t),h=!0;else if(n){const e=n.getMouseUpHandler(t,r,n);e&&(o=this.getScenePoint(t),e.call(n,t,s,o.x,o.y))}r.isMoving=!1}if(s&&(s.target!==r||s.corner!==a)){const e=s.target&&s.target.controls[s.corner],i=e&&e.getMouseUpHandler(t,s.target,e);o=o||this.getScenePoint(t),i&&i.call(e,t,s,o.x,o.y)}this._setCursorFromEvent(t,r),this._handleEvent(t,"up"),this._groupSelector=null,this._currentTransform=null,r&&(r.__corner=void 0),h?this.requestRenderAll():i||null!==(e=this._activeObject)&&void 0!==e&&e.isEditing||this.renderTop()}_basicEventHandler(t,e){const{target:s,subTargets:i=[]}=e;this.fire(t,e),s&&s.fire(t,e);for(let r=0;r{s=t.hoverCursor||s})}this.setCursor(s)}}handleMultiSelection(t,e){const s=this._activeObject,i=Gt(s);if(s&&this._isSelectionKeyPressed(t)&&this.selection&&e&&e.selectable&&(s!==e||i)&&(i||!e.isDescendantOf(s)&&!s.isDescendantOf(e))&&!e.onSelect({e:t})&&!s.getActiveControl()){if(i){const i=s.getObjects();let r=[];if(e===s){const s=this.getScenePoint(t);let n=this.searchPossibleTargets(i,s);if(n.target?(e=n.target,r=n.subTargets):(n=this.searchPossibleTargets(this._objects,s),e=n.target,r=n.subTargets),!e||!e.selectable)return!1}e.group===s?(s.remove(e),this._hoveredTarget=e,this._hoveredTargets=r,1===s.size()&&this._setActiveObject(s.item(0),t)):(s.multiSelectAdd(e),this._hoveredTarget=s,this._hoveredTargets=r),this._fireSelectionEvents(i,t)}else{s.isEditing&&s.exitEditing();const i=new(J.getClass("ActiveSelection"))([],{canvas:this});i.multiSelectAdd(s,e),this._hoveredTarget=i,this._setActiveObject(i,t),this._fireSelectionEvents([s],t)}return!0}return!1}handleSelection(t){if(!this.selection||!this._groupSelector)return!1;const{x:e,y:s,deltaX:i,deltaY:r}=this._groupSelector,n=new it(e,s),o=n.add(new it(i,r)),a=n.min(o),h=n.max(o).subtract(a),l=this.collectObjects({left:a.x,top:a.y,width:h.x,height:h.y},{includeIntersecting:!this.selectionFullyContained}),c=n.eq(o)?l[0]?[l[0]]:[]:l.length>1?l.filter(e=>!e.onSelect({e:t})).reverse():l;if(1===c.length)this.setActiveObject(c[0],t);else if(c.length>1){const e=J.getClass("ActiveSelection");this.setActiveObject(new e(c,{canvas:this}),t)}return this._groupSelector=null,!0}clear(){this.textEditingManager.clear(),super.clear()}destroy(){this.removeListeners(),this.textEditingManager.dispose(),super.destroy()}}const cn={x1:0,y1:0,x2:0,y2:0},un={...cn,r1:0,r2:0},dn=(t,e)=>isNaN(t)&&"number"==typeof e?e:t,gn=/^(\d+\.\d+)%|(\d+)%$/;function fn(t){return t&&gn.test(t)}function pn(t,e){const s="number"==typeof t?t:"string"==typeof t?parseFloat(t)/(fn(t)?100:1):NaN;return xs(0,dn(s,e),1)}const mn=/\s*;\s*/,vn=/\s*:\s*/;function yn(t,e){let s,i;const r=t.getAttribute("style");if(r){const t=r.split(mn);""===t[t.length-1]&&t.pop();for(let e=t.length;e--;){const[r,n]=t[e].split(vn).map(t=>t.trim());"stop-color"===r?s=n:"stop-opacity"===r&&(i=n)}}s=s||t.getAttribute("stop-color")||"rgb(0,0,0)",i=dn(parseFloat(i||t.getAttribute("stop-opacity")||""),1);const n=new Ve(s);return n.setAlpha(n.getAlpha()*i*e),{offset:pn(t.getAttribute("offset"),0),color:n.toRgba()}}function _n(t,e){const s=[],i=t.getElementsByTagName("stop"),r=pn(e,1);for(let t=i.length;t--;)s.push(yn(i[t],r));return s}function xn(t){return"linearGradient"===t.nodeName||"LINEARGRADIENT"===t.nodeName?"linear":"radial"}function Cn(t){return"userSpaceOnUse"===t.getAttribute("gradientUnits")?"pixels":"percentage"}function bn(t,e){return t.getAttribute(e)}function Sn(t,e){return function(t,e){let s,{width:i,height:r,gradientUnits:n}=e;return Object.keys(t).reduce((e,o)=>{const a=t[o];return"Infinity"===a?s=1:"-Infinity"===a?s=0:(s="string"==typeof a?parseFloat(a):a,"string"==typeof a&&fn(a)&&(s*=.01,"pixels"===n&&("x1"!==o&&"x2"!==o&&"r2"!==o||(s*=i),"y1"!==o&&"y2"!==o||(s*=r)))),e[o]=s,e},{})}("linear"===xn(t)?function(t){return{x1:bn(t,"x1")||0,y1:bn(t,"y1")||0,x2:bn(t,"x2")||"100%",y2:bn(t,"y2")||0}}(t):function(t){return{x1:bn(t,"fx")||bn(t,"cx")||"50%",y1:bn(t,"fy")||bn(t,"cy")||"50%",r1:0,x2:bn(t,"cx")||"50%",y2:bn(t,"cy")||"50%",r2:bn(t,"r")||"50%"}}(t),{...e,gradientUnits:Cn(t)})}class wn{constructor(t){const{type:e="linear",gradientUnits:s="pixels",coords:i={},colorStops:r=[],offsetX:n=0,offsetY:o=0,gradientTransform:a,id:h}=t||{};Object.assign(this,{type:e,gradientUnits:s,coords:{..."radial"===e?un:cn,...i},colorStops:r,offsetX:n,offsetY:o,gradientTransform:a,id:h?`${h}_${ut()}`:ut()})}addColorStop(t){for(const e in t)this.colorStops.push({offset:parseFloat(e),color:t[e]});return this}toObject(t){return{...Rt(this,t),type:this.type,coords:{...this.coords},colorStops:this.colorStops.map(t=>({...t})),offsetX:this.offsetX,offsetY:this.offsetY,gradientUnits:this.gradientUnits,gradientTransform:this.gradientTransform?[...this.gradientTransform]:void 0}}toSVG(t){let{additionalTransform:e}=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};const s=[],i=this.gradientTransform?this.gradientTransform.concat():b.concat(),r="pixels"===this.gradientUnits?"userSpaceOnUse":"objectBoundingBox",n=this.colorStops.map(t=>({...t})).sort((t,e)=>t.offset-e.offset);let o=-this.offsetX,a=-this.offsetY;var h;"objectBoundingBox"===r?(o/=t.width,a/=t.height):(o+=t.width/2,a+=t.height/2),(h=t)&&"function"==typeof h._renderPathCommands&&"percentage"!==this.gradientUnits&&(o-=t.pathOffset.x,a-=t.pathOffset.y),i[4]-=o,i[5]-=a;const l=[`id="SVGID_${this.id}"`,`gradientUnits="${r}"`,`gradientTransform="${e?e+" ":""}${Xt(i)}"`,""].join(" ");if("linear"===this.type){const{x1:t,y1:e,x2:i,y2:r}=this.coords;s.push("\n')}else if("radial"===this.type){const{x1:t,y1:e,x2:i,y2:r,r1:o,r2:a}=this.coords,h=o>a;s.push("\n'),h&&(n.reverse(),n.forEach(t=>{t.offset=1-t.offset}));const c=Math.min(o,a);if(c>0){const t=c/Math.max(o,a);n.forEach(e=>{e.offset+=t*(1-e.offset)})}}return n.forEach(t=>{let{color:e,offset:i}=t;s.push(`\n`)}),s.push("linear"===this.type?"":"","\n"),s.join("")}toLive(t){const{x1:e,y1:s,x2:i,y2:r,r1:n,r2:o}=this.coords,a="linear"===this.type?t.createLinearGradient(e,s,i,r):t.createRadialGradient(e,s,n,i,r,o);return this.colorStops.forEach(t=>{let{color:e,offset:s}=t;a.addColorStop(s,e)}),a}static async fromObject(t){const{colorStops:e,gradientTransform:s}=t;return new this({...t,colorStops:e?e.map(t=>({...t})):void 0,gradientTransform:s?[...s]:void 0})}static fromElement(t,e,s){const i=Cn(t),r=e._findCenterFromElement();return new this({id:t.getAttribute("id")||void 0,type:xn(t),coords:Sn(t,{width:s.viewBoxWidth||s.width,height:s.viewBoxHeight||s.height}),colorStops:_n(t,s.opacity),gradientUnits:i,gradientTransform:er(t.getAttribute("gradientTransform")||""),..."pixels"===i?{offsetX:e.width/2-r.x,offsetY:e.height/2-r.y}:{offsetX:0,offsetY:0}})}}e(wn,"type","Gradient"),J.setClass(wn,"gradient"),J.setClass(wn,"linear"),J.setClass(wn,"radial");class Tn{get type(){return"pattern"}set type(t){r("warn","Setting type has no effect",t)}constructor(t){e(this,"repeat","repeat"),e(this,"offsetX",0),e(this,"offsetY",0),e(this,"crossOrigin",""),this.id=ut(),Object.assign(this,t)}isImageSource(){return!!this.source&&"string"==typeof this.source.src}isCanvasSource(){return!!this.source&&!!this.source.toDataURL}sourceToString(){return this.isImageSource()?this.source.src:this.isCanvasSource()?this.source.toDataURL():""}toLive(t){return this.source&&(!this.isImageSource()||this.source.complete&&0!==this.source.naturalWidth&&0!==this.source.naturalHeight)?t.createPattern(this.source,this.repeat):null}toObject(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[];const{repeat:e,crossOrigin:s}=this;return{...Rt(this,t),type:"pattern",source:this.sourceToString(),repeat:e,crossOrigin:s,offsetX:$t(this.offsetX,i.NUM_FRACTION_DIGITS),offsetY:$t(this.offsetY,i.NUM_FRACTION_DIGITS),patternTransform:this.patternTransform?[...this.patternTransform]:null}}toSVG(t){let{width:e,height:s}=t;const{source:i,repeat:r,id:n}=this,o=dn(this.offsetX/e,0),a=dn(this.offsetY/s,0);return[``,``,"",""].join("\n")}static async fromObject(t,e){let{type:s,source:i,patternTransform:r,...n}=t;const o=await Ft(i,{...e,crossOrigin:n.crossOrigin});return new this({...n,patternTransform:r&&r.slice(0),source:o})}}e(Tn,"type","Pattern"),J.setClass(Tn),J.setClass(Tn,"pattern");class On{constructor(t){e(this,"color","rgb(0, 0, 0)"),e(this,"width",1),e(this,"shadow",null),e(this,"strokeLineCap","round"),e(this,"strokeLineJoin","round"),e(this,"strokeMiterLimit",10),e(this,"strokeDashArray",null),e(this,"limitedToCanvasSize",!1),this.canvas=t}_setBrushStyles(t){t.strokeStyle=this.color,t.lineWidth=this.width,t.lineCap=this.strokeLineCap,t.miterLimit=this.strokeMiterLimit,t.lineJoin=this.strokeLineJoin,t.setLineDash(this.strokeDashArray||[])}_saveAndTransform(t){const e=this.canvas.viewportTransform;t.save(),t.transform(e[0],e[1],e[2],e[3],e[4],e[5])}needsFullRender(){return new Ve(this.color).getAlpha()<1||!!this.shadow}_setShadow(){if(!this.shadow||!this.canvas)return;const t=this.canvas,e=this.shadow,s=t.contextTop,i=t.getZoom()*t.getRetinaScaling();s.shadowColor=e.color,s.shadowBlur=e.blur*i,s.shadowOffsetX=e.offsetX*i,s.shadowOffsetY=e.offsetY*i}_resetShadow(){const t=this.canvas.contextTop;t.shadowColor="",t.shadowBlur=t.shadowOffsetX=t.shadowOffsetY=0}_isOutSideCanvas(t){return t.x<0||t.x>this.canvas.getWidth()||t.y<0||t.y>this.canvas.getHeight()}}class kn extends xi{constructor(t){let{path:e,left:s,top:i,...r}=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};super(),Object.assign(this,kn.ownDefaults),this.setOptions(r),this._setPath(t||[],!0),"number"==typeof s&&this.set(O,s),"number"==typeof i&&this.set(k,i)}_setPath(t,e){this.path=Pr(Array.isArray(t)?t:Nr(t)),this.setBoundingBox(e)}_findCenterFromElement(){const t=this._calcBoundsFromPath();return new it(t.left+t.width/2,t.top+t.height/2)}_renderPathCommands(t){const e=-this.pathOffset.x,s=-this.pathOffset.y;t.beginPath();for(const i of this.path)switch(i[0]){case"L":t.lineTo(i[1]+e,i[2]+s);break;case"M":t.moveTo(i[1]+e,i[2]+s);break;case"C":t.bezierCurveTo(i[1]+e,i[2]+s,i[3]+e,i[4]+s,i[5]+e,i[6]+s);break;case"Q":t.quadraticCurveTo(i[1]+e,i[2]+s,i[3]+e,i[4]+s);break;case"Z":t.closePath()}}_render(t){this._renderPathCommands(t),this._renderPaintInOrder(t)}toString(){return`#`}toObject(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[];return{...super.toObject(t),path:this.path.map(t=>t.slice())}}toDatalessObject(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[];const e=this.toObject(t);return this.sourcePath&&(delete e.path,e.sourcePath=this.sourcePath),e}_toSVG(){return["\n`]}_getOffsetTransform(){const t=i.NUM_FRACTION_DIGITS;return` translate(${$t(-this.pathOffset.x,t)}, ${$t(-this.pathOffset.y,t)})`}toClipPathSVG(t){const e=this._getOffsetTransform();return"\t"+this._createBaseClipPathSVGMarkup(this._toSVG(),{reviver:t,additionalTransform:e})}toSVG(t){const e=this._getOffsetTransform();return this._createBaseSVGMarkup(this._toSVG(),{reviver:t,additionalTransform:e})}complexity(){return this.path.length}setDimensions(){this.setBoundingBox()}setBoundingBox(t){const{width:e,height:s,pathOffset:i}=this._calcDimensions();this.set({width:e,height:s,pathOffset:i}),t&&this.setPositionByOrigin(i,T,T)}_calcBoundsFromPath(){const t=[];let e=0,s=0,i=0,r=0;for(const n of this.path)switch(n[0]){case"L":i=n[1],r=n[2],t.push({x:e,y:s},{x:i,y:r});break;case"M":i=n[1],r=n[2],e=i,s=r;break;case"C":t.push(...Dr(i,r,n[1],n[2],n[3],n[4],n[5],n[6])),i=n[5],r=n[6];break;case"Q":t.push(...Dr(i,r,n[1],n[2],n[1],n[2],n[3],n[4])),i=n[3],r=n[4];break;case"Z":i=e,r=s}return re(t)}_calcDimensions(){const t=this._calcBoundsFromPath();return{...t,pathOffset:new it(t.left+t.width/2,t.top+t.height/2)}}static fromObject(t){return this._fromObject(t,{extraParam:"path"})}static async fromElement(t,e,s){const{d:i,...r}=or(t,this.ATTRIBUTE_NAMES,s);return new this(i,{...r,...e,left:void 0,top:void 0})}}e(kn,"type","Path"),e(kn,"cacheProperties",[...bs,"path","fillRule"]),e(kn,"ATTRIBUTE_NAMES",[...Ri,"d"]),J.setClass(kn),J.setSVGClass(kn);class Dn extends On{constructor(t){super(t),e(this,"decimate",.4),e(this,"drawStraightLine",!1),e(this,"straightLineKey","shiftKey"),this._points=[],this._hasStraightLine=!1}needsFullRender(){return super.needsFullRender()||this._hasStraightLine}static drawSegment(t,e,s){const i=e.midPointFrom(s);return t.quadraticCurveTo(e.x,e.y,i.x,i.y),i}onMouseDown(t,e){let{e:s}=e;this.canvas._isMainEvent(s)&&(this.drawStraightLine=!!this.straightLineKey&&s[this.straightLineKey],this._prepareForDrawing(t),this._addPoint(t),this._render())}onMouseMove(t,e){let{e:s}=e;if(this.canvas._isMainEvent(s)&&(this.drawStraightLine=!!this.straightLineKey&&s[this.straightLineKey],(!0!==this.limitedToCanvasSize||!this._isOutSideCanvas(t))&&this._addPoint(t)&&this._points.length>1))if(this.needsFullRender())this.canvas.clearContext(this.canvas.contextTop),this._render();else{const t=this._points,e=t.length,s=this.canvas.contextTop;this._saveAndTransform(s),this.oldEnd&&(s.beginPath(),s.moveTo(this.oldEnd.x,this.oldEnd.y)),this.oldEnd=Dn.drawSegment(s,t[e-2],t[e-1]),s.stroke(),s.restore()}}onMouseUp(t){let{e:e}=t;return!this.canvas._isMainEvent(e)||(this.drawStraightLine=!1,this.oldEnd=void 0,this._finalizeAndAddPath(),!1)}_prepareForDrawing(t){this._reset(),this._addPoint(t),this.canvas.contextTop.moveTo(t.x,t.y)}_addPoint(t){return!(this._points.length>1&&t.eq(this._points[this._points.length-1]))&&(this.drawStraightLine&&this._points.length>1&&(this._hasStraightLine=!0,this._points.pop()),this._points.push(t),!0)}_reset(){this._points=[],this._setBrushStyles(this.canvas.contextTop),this._setShadow(),this._hasStraightLine=!1}_render(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.canvas.contextTop,e=this._points[0],s=this._points[1];if(this._saveAndTransform(t),t.beginPath(),2===this._points.length&&e.x===s.x&&e.y===s.y){const t=this.width/1e3;e.x-=t,s.x+=t}t.moveTo(e.x,e.y);for(let i=1;i=n&&(i=t[e],a.push(i));return a.push(t[o]),a}_finalizeAndAddPath(){this.canvas.contextTop.closePath(),this.decimate&&(this._points=this.decimatePoints(this._points,this.decimate));const t=this.convertPointsToSVGPath(this._points);if(function(t){return"M 0 0 Q 0 0 0 0 L 0 0"===qr(t)}(t))return void this.canvas.requestRenderAll();const e=this.createPath(t);this.canvas.clearContext(this.canvas.contextTop),this.canvas.fire("before:path:created",{path:e}),this.canvas.add(e),this.canvas.requestRenderAll(),e.setCoords(),this._resetShadow(),this.canvas.fire("path:created",{path:e})}}const Mn=["radius","startAngle","endAngle","counterClockwise"];class Pn extends xi{static getDefaults(){return{...super.getDefaults(),...Pn.ownDefaults}}constructor(t){super(),Object.assign(this,Pn.ownDefaults),this.setOptions(t)}_set(t,e){return super._set(t,e),"radius"===t&&this.setRadius(e),this}_render(t){t.beginPath(),t.arc(0,0,this.radius,vt(this.startAngle),vt(this.endAngle),this.counterClockwise),this._renderPaintInOrder(t)}getRadiusX(){return this.get("radius")*this.get(W)}getRadiusY(){return this.get("radius")*this.get(V)}setRadius(t){this.radius=t,this.set({width:2*t,height:2*t})}toObject(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[];return super.toObject([...Mn,...t])}_toSVG(){const t=(this.endAngle-this.startAngle)%360;if(0===t)return["\n'];{const{radius:e}=this,s=vt(this.startAngle),i=vt(this.endAngle),r=et(s)*e,n=st(s)*e,o=et(i)*e,a=st(i)*e;return[`\n"]}}static async fromElement(t,e,s){const{left:i=0,top:r=0,radius:n=0,...o}=or(t,this.ATTRIBUTE_NAMES,s);return new this({...o,radius:n,left:i-n,top:r-n})}static fromObject(t){return super._fromObject(t)}}e(Pn,"type","Circle"),e(Pn,"cacheProperties",[...bs,...Mn]),e(Pn,"ownDefaults",{radius:0,startAngle:0,endAngle:360,counterClockwise:!1}),e(Pn,"ATTRIBUTE_NAMES",["cx","cy","r",...Ri]),J.setClass(Pn),J.setSVGClass(Pn);const En=["x1","x2","y1","y2"];class An extends xi{constructor(){let[t,e,s,i]=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[0,0,0,0],r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};super(),Object.assign(this,An.ownDefaults),this.setOptions(r),this.x1=t,this.x2=s,this.y1=e,this.y2=i,this._setWidthHeight();const{left:n,top:o}=r;"number"==typeof n&&this.set(O,n),"number"==typeof o&&this.set(k,o)}_setWidthHeight(){const{x1:t,y1:e,x2:s,y2:i}=this;this.width=Math.abs(s-t),this.height=Math.abs(i-e);const{left:r,top:n,width:o,height:a}=re([{x:t,y:e},{x:s,y:i}]),h=new it(r+o/2,n+a/2);this.setPositionByOrigin(h,T,T)}_set(t,e){return super._set(t,e),En.includes(t)&&this._setWidthHeight(),this}_render(t){t.beginPath();const e=this.calcLinePoints();t.moveTo(e.x1,e.y1),t.lineTo(e.x2,e.y2),t.lineWidth=this.strokeWidth;const s=t.strokeStyle;var i;Yt(this.stroke)?t.strokeStyle=this.stroke.toLive(t):t.strokeStyle=null!==(i=this.stroke)&&void 0!==i?i:t.fillStyle;this.stroke&&this._renderStroke(t),t.strokeStyle=s}_findCenterFromElement(){return new it((this.x1+this.x2)/2,(this.y1+this.y2)/2)}toObject(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[];return{...super.toObject(t),...this.calcLinePoints()}}_getNonTransformedDimensions(){const t=super._getNonTransformedDimensions();return"butt"===this.strokeLineCap&&(0===this.width&&(t.y-=this.strokeWidth),0===this.height&&(t.x-=this.strokeWidth)),t}calcLinePoints(){const{x1:t,x2:e,y1:s,y2:i,width:r,height:n}=this,o=t<=e?-1:1,a=s<=i?-1:1;return{x1:o*r/2,x2:o*-r/2,y1:a*n/2,y2:a*-n/2}}_toSVG(){const{x1:t,x2:e,y1:s,y2:i}=this.calcLinePoints();return["\n`]}static async fromElement(t,e,s){const{x1:i=0,y1:r=0,x2:n=0,y2:o=0,...a}=or(t,this.ATTRIBUTE_NAMES,s);return new this([i,r,n,o],a)}static fromObject(t){let{x1:e,y1:s,x2:i,y2:r,...n}=t;return this._fromObject({...n,points:[e,s,i,r]},{extraParam:"points"})}}e(An,"type","Line"),e(An,"cacheProperties",[...bs,...En]),e(An,"ATTRIBUTE_NAMES",Ri.concat(En)),J.setClass(An),J.setSVGClass(An);class jn extends xi{static getDefaults(){return{...super.getDefaults(),...jn.ownDefaults}}constructor(t){super(),Object.assign(this,jn.ownDefaults),this.setOptions(t)}_render(t){const e=this.width/2,s=this.height/2;t.beginPath(),t.moveTo(-e,s),t.lineTo(0,-s),t.lineTo(e,s),t.closePath(),this._renderPaintInOrder(t)}_toSVG(){const t=this.width/2,e=this.height/2;return["']}}e(jn,"type","Triangle"),e(jn,"ownDefaults",{width:100,height:100}),J.setClass(jn),J.setSVGClass(jn);const Fn=["rx","ry"];class Ln extends xi{static getDefaults(){return{...super.getDefaults(),...Ln.ownDefaults}}constructor(t){super(),Object.assign(this,Ln.ownDefaults),this.setOptions(t)}_set(t,e){switch(super._set(t,e),t){case"rx":this.rx=e,this.set("width",2*e);break;case"ry":this.ry=e,this.set("height",2*e)}return this}getRx(){return this.get("rx")*this.get(W)}getRy(){return this.get("ry")*this.get(V)}toObject(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[];return super.toObject([...Fn,...t])}_toSVG(){return["\n`]}_render(t){t.beginPath(),t.save(),t.transform(1,0,0,this.ry/this.rx,0,0),t.arc(0,0,this.rx,0,x,!1),t.restore(),this._renderPaintInOrder(t)}static async fromElement(t,e,s){const i=or(t,this.ATTRIBUTE_NAMES,s);return i.left=(i.left||0)-i.rx,i.top=(i.top||0)-i.ry,new this(i)}}e(Ln,"type","Ellipse"),e(Ln,"cacheProperties",[...bs,...Fn]),e(Ln,"ownDefaults",{rx:0,ry:0}),e(Ln,"ATTRIBUTE_NAMES",[...Ri,"cx","cy","rx","ry"]),J.setClass(Ln),J.setSVGClass(Ln);const In={exactBoundingBox:!1};class Rn extends xi{static getDefaults(){return{...super.getDefaults(),...Rn.ownDefaults}}constructor(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[],s=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};super(),e(this,"strokeDiff",void 0),Object.assign(this,Rn.ownDefaults),this.setOptions(s),this.points=t;const{left:i,top:r}=s;this.initialized=!0,this.setBoundingBox(!0),"number"==typeof i&&this.set(O,i),"number"==typeof r&&this.set(k,r)}isOpen(){return!0}_projectStrokeOnPoints(t){return Oi(this.points,t,this.isOpen())}_calcDimensions(t){t={scaleX:this.scaleX,scaleY:this.scaleY,skewX:this.skewX,skewY:this.skewY,strokeLineCap:this.strokeLineCap,strokeLineJoin:this.strokeLineJoin,strokeMiterLimit:this.strokeMiterLimit,strokeUniform:this.strokeUniform,strokeWidth:this.strokeWidth,...t||{}};const e=this.exactBoundingBox?this._projectStrokeOnPoints(t).map(t=>t.projectedPoint):this.points;if(0===e.length)return{left:0,top:0,width:0,height:0,pathOffset:new it,strokeOffset:new it,strokeDiff:new it};const s=re(e),i=At({...t,scaleX:1,scaleY:1}),r=re(this.points.map(t=>xt(t,i,!0))),n=new it(this.scaleX,this.scaleY);let o=s.left+s.width/2,a=s.top+s.height/2;return this.exactBoundingBox&&(o-=a*Math.tan(vt(this.skewX)),a-=o*Math.tan(vt(this.skewY))),{...s,pathOffset:new it(o,a),strokeOffset:new it(r.left,r.top).subtract(new it(s.left,s.top)).multiply(n),strokeDiff:new it(s.width,s.height).subtract(new it(r.width,r.height)).multiply(n)}}_findCenterFromElement(){const t=re(this.points);return new it(t.left+t.width/2,t.top+t.height/2)}setDimensions(){this.setBoundingBox()}setBoundingBox(t){const{left:e,top:s,width:i,height:r,pathOffset:n,strokeOffset:o,strokeDiff:a}=this._calcDimensions();this.set({width:i,height:r,pathOffset:n,strokeOffset:o,strokeDiff:a}),t&&this.setPositionByOrigin(new it(e+i/2,s+r/2),T,T)}isStrokeAccountedForInDimensions(){return this.exactBoundingBox}_getNonTransformedDimensions(){return this.exactBoundingBox?new it(this.width,this.height):super._getNonTransformedDimensions()}_getTransformedDimensions(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};if(this.exactBoundingBox){let n;if(Object.keys(t).some(t=>this.strokeUniform||this.constructor.layoutProperties.includes(t))){var e,s;const{width:i,height:r}=this._calcDimensions(t);n=new it(null!==(e=t.width)&&void 0!==e?e:i,null!==(s=t.height)&&void 0!==s?s:r)}else{var i,r;n=new it(null!==(i=t.width)&&void 0!==i?i:this.width,null!==(r=t.height)&&void 0!==r?r:this.height)}return n.multiply(new it(t.scaleX||this.scaleX,t.scaleY||this.scaleY))}return super._getTransformedDimensions(t)}_set(t,e){const s=this.initialized&&this[t]!==e,i=super._set(t,e);return this.exactBoundingBox&&s&&((t===W||t===V)&&this.strokeUniform&&this.constructor.layoutProperties.includes("strokeUniform")||this.constructor.layoutProperties.includes(t))&&this.setDimensions(),i}toObject(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[];return{...super.toObject(t),points:this.points.map(t=>{let{x:e,y:s}=t;return{x:e,y:s}})}}_toSVG(){const t=[],e=this.pathOffset.x,s=this.pathOffset.y,r=i.NUM_FRACTION_DIGITS;for(let i=0,n=this.points.length;i\n`]}_render(t){const e=this.points.length,s=this.pathOffset.x,i=this.pathOffset.y;if(e&&!isNaN(this.points[e-1].y)){t.beginPath(),t.moveTo(this.points[0].x-s,this.points[0].y-i);for(let r=0;rvoid 0!==t);this._setStyleDeclaration(s,i,r)}getSelectionStyles(t,e,s){const i=[];for(let r=t;r<(e||t);r++)i.push(this.getStyleAtPosition(r,s));return i}getStyleAtPosition(t,e){const{lineIndex:s,charIndex:i}=this.get2DCursorLocation(t);return e?this.getCompleteStyleDeclaration(s,i):this._getStyleDeclaration(s,i)}setSelectionStyles(t,e,s){for(let i=e;i<(s||e);i++)this._extendStyles(i,t);this._forceClearCache=!0}_getStyleDeclaration(t,e){var s;const i=this.styles&&this.styles[t];return i&&null!==(s=i[e])&&void 0!==s?s:{}}getCompleteStyleDeclaration(t,e){return{...Rt(this,this.constructor._styleProperties),...this._getStyleDeclaration(t,e)}}_setStyleDeclaration(t,e,s){this.styles[t][e]=s}_deleteStyleDeclaration(t,e){delete this.styles[t][e]}_getLineStyle(t){return!!this.styles[t]}_setLineStyle(t){this.styles[t]={}}_deleteLineStyle(t){delete this.styles[t]}}e($n,"_styleProperties",ts);const Xn=/ +/g,Yn=/"/g;function Wn(t,e,s,r,n){return`\t\t${function(t,e){let{left:s,top:r,width:n,height:o}=e,a=arguments.length>2&&void 0!==arguments[2]?arguments[2]:i.NUM_FRACTION_DIGITS;const h=He(H,t,!1),[l,c,u,d]=[s,r,n,o].map(t=>$t(t,a));return``}(t,{left:e,top:s,width:r,height:n})}\n`}let Vn;class Gn extends $n{static getDefaults(){return{...super.getDefaults(),...Gn.ownDefaults}}constructor(t,s){super(),e(this,"__charBounds",[]),Object.assign(this,Gn.ownDefaults),this.setOptions(s),this.styles||(this.styles={}),this.text=t,this.initialized=!0,this.path&&this.setPathInfo(),this.initDimensions(),this.setCoords()}setPathInfo(){const t=this.path;t&&(t.segmentsInfo=Yr(t.path))}_splitText(){const t=this._splitTextIntoLines(this.text);return this.textLines=t.lines,this._textLines=t.graphemeLines,this._unwrappedTextLines=t._unwrappedLines,this._text=t.graphemeText,t}initDimensions(){this._splitText(),this._clearCache(),this.dirty=!0,this.path?(this.width=this.path.width,this.height=this.path.height):(this.width=this.calcTextWidth()||this.cursorWidth||this.MIN_TEXT_WIDTH,this.height=this.calcTextHeight()),this.textAlign.includes(ss)&&this.enlargeSpaces()}enlargeSpaces(){let t,e,s,i,r,n,o;for(let a=0,h=this._textLines.length;a`}_getCacheCanvasDimensions(){const t=super._getCacheCanvasDimensions(),e=this.fontSize;return t.width+=e*t.zoomX,t.height+=e*t.zoomY,t}_render(t){const e=this.path;e&&!e.isNotVisible()&&e._render(t),this._setTextStyles(t),this._renderTextLinesBackground(t),this._renderTextDecoration(t,"underline"),this._renderText(t),this._renderTextDecoration(t,"overline"),this._renderTextDecoration(t,"linethrough")}_renderText(t){this.paintFirst===N?(this._renderTextStroke(t),this._renderTextFill(t)):(this._renderTextFill(t),this._renderTextStroke(t))}_setTextStyles(t,e,s){if(t.textBaseline="alphabetic",this.path)switch(this.pathAlign){case T:t.textBaseline="middle";break;case"ascender":t.textBaseline=k;break;case"descender":t.textBaseline=D}t.font=this._getFontDeclaration(e,s)}calcTextWidth(){let t=this.getLineWidth(0);for(let e=1,s=this._textLines.length;et&&(t=s)}return t}_renderTextLine(t,e,s,i,r,n){this._renderChars(t,e,s,i,r,n)}_renderTextLinesBackground(t){if(!this.textBackgroundColor&&!this.styleHas("textBackgroundColor"))return;const e=t.fillStyle,s=this._getLeftOffset();let i=this._getTopOffset();for(let e=0,r=this._textLines.length;e=0:ie?t%=e:t<0&&(t+=e),this._setGraphemeOnPath(t,s),t+=s.kernedWidth}return{width:i,numOfSpaces:0}}_setGraphemeOnPath(t,e){const s=t+e.kernedWidth/2,i=this.path,r=Wr(i.path,s,i.segmentsInfo);e.renderLeft=r.x-i.pathOffset.x,e.renderTop=r.y-i.pathOffset.y,e.angle=r.angle+(this.pathSide===M?Math.PI:0)}_getGraphemeBox(t,e,s,i,r){const n=this.getCompleteStyleDeclaration(e,s),o=i?this.getCompleteStyleDeclaration(e,s-1):{},a=this._measureChar(t,n,i,o);let h,l=a.kernedWidth,c=a.width;0!==this.charSpacing&&(h=this._getWidthOfCharSpacing(),c+=h,l+=h);const u={width:c,left:0,height:n.fontSize,kernedWidth:l,deltaY:n.deltaY};if(s>0&&!r){const t=this.__charBounds[e][s-1];u.left=t.left+t.width+a.kernedWidth-a.width}return u}getHeightOfLine(t){if(this.__lineHeights[t])return this.__lineHeights[t];let e=this.getHeightOfChar(t,0);for(let s=1,i=this._textLines[t].length;s0){const e=this.fontSize*v/1e3;let s=i+d+g;"rtl"===this.direction&&(s=this.width-s-f),p&&m&&v&&(t.fillStyle=m,t.fillRect(s,C+a*b+S-o*e,f,e)),g=n.left,f=n.width,p=y,v=x,m=_,b=l,S=c}else f+=n.kernedWidth}let w=i+d+g;"rtl"===this.direction&&(w=this.width-w-f),t.fillStyle=_;const T=this.fontSize*x/1e3;y&&_&&x&&t.fillRect(w,C+a*b+S-o*T,f-n,T),s+=l}this._removeShadow(t)}_getFontDeclaration(){let{fontFamily:t=this.fontFamily,fontStyle:e=this.fontStyle,fontWeight:s=this.fontWeight,fontSize:i=this.fontSize}=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},r=arguments.length>1?arguments[1]:void 0;const n=t.includes("'")||t.includes('"')||t.includes(",")||Gn.genericFonts.includes(t.toLowerCase())?t:`"${t}"`;return[e,s,`${r?this.CACHE_FONT_SIZE:i}px`,n].join(" ")}render(t){this.visible&&(this.canvas&&this.canvas.skipOffscreen&&!this.group&&!this.isOnScreen()||(this._forceClearCache&&this.initDimensions(),super.render(t)))}graphemeSplit(t){return Pi(t)}_splitTextIntoLines(t){const e=t.split(this._reNewline),s=new Array(e.length),i=["\n"];let r=[];for(let t=0;t0&&void 0!==arguments[0]?arguments[0]:[];return{...super.toObject([...Ze,...t]),styles:Li(this.styles,this.text),...this.path?{path:this.path.toObject()}:{}}}set(t,e){const{textLayoutProperties:s}=this.constructor;super.set(t,e);let i=!1,r=!1;if("object"==typeof t)for(const e in t)"path"===e&&this.setPathInfo(),i=i||s.includes(e),r=r||"path"===e;else i=s.includes(t),r="path"===t;return r&&this.setPathInfo(),i&&this.initialized&&(this.initDimensions(),this.setCoords()),this}complexity(){return 1}static async fromElement(t,e,s){const i=or(t,Gn.ATTRIBUTE_NAMES,s),{textAnchor:r=O,textDecoration:n="",dx:o=0,dy:a=0,top:h=0,left:l=0,fontSize:c=S,strokeWidth:u=1,...d}={...e,...i},g=new this((t.textContent||"").replace(/^\s+|\s+$|\n+/g,"").replace(/\s+/g," "),{left:l+o,top:h+a,underline:n.includes("underline"),overline:n.includes("overline"),linethrough:n.includes("line-through"),strokeWidth:0,fontSize:c,...d}),f=g.getScaledHeight()/g.height,p=((g.height+g.strokeWidth)*g.lineHeight-g.height)*f,m=g.getScaledHeight()+p;let v=0;return r===T&&(v=g.getScaledWidth()/2),r===M&&(v=g.getScaledWidth()),g.set({left:g.left-v,top:g.top-(m-g.fontSize*(.07+g._fontSizeFraction))/g.lineHeight,strokeWidth:u}),g}static fromObject(t){return this._fromObject({...t,styles:Ii(t.styles||{},t.text)},{extraParam:"text"})}}e(Gn,"textLayoutProperties",Qe),e(Gn,"cacheProperties",[...bs,...Ze]),e(Gn,"ownDefaults",es),e(Gn,"type","Text"),e(Gn,"genericFonts",["serif","sans-serif","monospace","cursive","fantasy","system-ui","ui-serif","ui-sans-serif","ui-monospace","ui-rounded","math","emoji","fangsong"]),e(Gn,"ATTRIBUTE_NAMES",Ri.concat("x","y","dx","dy","font-family","font-style","font-weight","font-size","letter-spacing","text-decoration","text-anchor")),_i(Gn,[class extends Ne{_toSVG(){const t=this._getSVGLeftTopOffsets(),e=this._getSVGTextAndBg(t.textTop,t.textLeft);return this._wrapSVGTextAndBg(e)}toSVG(t){const e=this._createBaseSVGMarkup(this._toSVG(),{reviver:t,noStyle:!0,withShadow:!0}),s=this.path;return s?e+s._createBaseSVGMarkup(s._toSVG(),{reviver:t,withShadow:!0,additionalTransform:Xt(this.calcOwnMatrix())}):e}_getSVGLeftTopOffsets(){return{textLeft:-this.width/2,textTop:-this.height/2,lineTop:this.getHeightOfLine(0)}}_wrapSVGTextAndBg(t){let{textBgRects:e,textSpans:s}=t;const i=this.getSvgTextDecoration(this);return[e.join(""),'\t\t",s.join(""),"\n"]}_getSVGTextAndBg(t,e){const s=[],i=[];let r,n=t;this.backgroundColor&&i.push(...Wn(this.backgroundColor,-this.width/2,-this.height/2,this.width,this.height));for(let t=0,o=this._textLines.length;t${Di(t)}`}_setSVGTextLineText(t,e,s,i){const r=this.getHeightOfLine(e),n=this.textAlign.includes(ss),o=this._textLines[e];let a,h,l,c,u,d="",g=0;i+=r*(1-this._fontSizeFraction)/this.lineHeight;for(let r=0,f=o.length-1;r<=f;r++)u=r===f||this.charSpacing||this.path,d+=o[r],l=this.__charBounds[e][r],0===g?(s+=l.kernedWidth-l.width,g+=l.width):g+=l.kernedWidth,n&&!u&&this._reSpaceAndTab.test(o[r])&&(u=!0),u||(a=a||this.getCompleteStyleDeclaration(e,r),h=this.getCompleteStyleDeclaration(e,r+1),u=Fi(a,h,!0)),u&&(c=this._getStyleDeclaration(e,r),t.push(this._createTextCharSpan(d,c,s,i,l)),d="",a=h,"rtl"===this.direction?s-=g:s+=g,g=0)}_setSVGTextLineBg(t,e,s,i){const r=this._textLines[e],n=this.getHeightOfLine(e)/this.lineHeight;let o,a=0,h=0,l=this.getValueOfPropertyAt(e,0,"textBackgroundColor");for(let c=0;ct[e.replace("-","")]).join(" ")}}]),J.setClass(Gn),J.setSVGClass(Gn);class zn{constructor(t){e(this,"target",void 0),e(this,"__mouseDownInPlace",!1),e(this,"__dragStartFired",!1),e(this,"__isDraggingOver",!1),e(this,"__dragStartSelection",void 0),e(this,"__dragImageDisposer",void 0),e(this,"_dispose",void 0),this.target=t;const s=[this.target.on("dragenter",this.dragEnterHandler.bind(this)),this.target.on("dragover",this.dragOverHandler.bind(this)),this.target.on("dragleave",this.dragLeaveHandler.bind(this)),this.target.on("dragend",this.dragEndHandler.bind(this)),this.target.on("drop",this.dropHandler.bind(this))];this._dispose=()=>{s.forEach(t=>t()),this._dispose=void 0}}isPointerOverSelection(t){const e=this.target,s=e.getSelectionStartFromPointer(t);return e.isEditing&&s>=e.selectionStart&&s<=e.selectionEnd&&e.selectionStart{_.remove()},Ht(t.target||this.target.hiddenTextarea).body.appendChild(_),null===(s=t.dataTransfer)||void 0===s||s.setDragImage(_,p.x,p.y)}onDragStart(t){this.__dragStartFired=!0;const e=this.target,s=this.isActive();if(s&&t.dataTransfer){const s=this.__dragStartSelection={selectionStart:e.selectionStart,selectionEnd:e.selectionEnd},i=e._text.slice(s.selectionStart,s.selectionEnd).join(""),r={text:e.text,value:i,...s};t.dataTransfer.setData("text/plain",i),t.dataTransfer.setData("application/fabric",JSON.stringify({value:i,styles:e.getSelectionStyles(s.selectionStart,s.selectionEnd,!0)})),t.dataTransfer.effectAllowed="copyMove",this.setDragImage(t,r)}return e.abortCursorAnimation(),s}canDrop(t){if(this.target.editable&&!this.target.getActiveControl()&&!t.defaultPrevented){if(this.isActive()&&this.__dragStartSelection){const e=this.target.getSelectionStartFromPointer(t),s=this.__dragStartSelection;return es.selectionEnd}return!0}return!1}targetCanDrop(t){return this.target.canDrop(t)}dragEnterHandler(t){let{e:e}=t;const s=this.targetCanDrop(e);!this.__isDraggingOver&&s&&(this.__isDraggingOver=!0)}dragOverHandler(t){const{e:e}=t,s=this.targetCanDrop(e);!this.__isDraggingOver&&s?this.__isDraggingOver=!0:this.__isDraggingOver&&!s&&(this.__isDraggingOver=!1),this.__isDraggingOver&&(e.preventDefault(),t.canDrop=!0,t.dropTarget=this.target)}dragLeaveHandler(){(this.__isDraggingOver||this.isActive())&&(this.__isDraggingOver=!1)}dropHandler(t){var e;const{e:s}=t,i=s.defaultPrevented;this.__isDraggingOver=!1,s.preventDefault();let r=null===(e=s.dataTransfer)||void 0===e?void 0:e.getData("text/plain");if(r&&!i){const e=this.target,i=e.canvas;let n=e.getSelectionStartFromPointer(s);const{styles:o}=s.dataTransfer.types.includes("application/fabric")?JSON.parse(s.dataTransfer.getData("application/fabric")):{},a=r[Math.max(0,r.length-1)],h=0;if(this.__dragStartSelection){const t=this.__dragStartSelection.selectionStart,s=this.__dragStartSelection.selectionEnd;n>t&&n<=s?n=t:n>s&&(n-=s-t),e.removeChars(t,s),delete this.__dragStartSelection}e._reNewline.test(a)&&(e._reNewline.test(e._text[n])||n===e._text.length)&&(r=r.trimEnd()),t.didDrop=!0,t.dropTarget=e,e.insertChars(r,o,n),i.setActiveObject(e),e.enterEditing(s),e.selectionStart=Math.min(n+h,e._text.length),e.selectionEnd=Math.min(e.selectionStart+r.length,e._text.length),e.hiddenTextarea.value=e.text,e._updateTextarea(),e.hiddenTextarea.focus(),e.fire(X,{index:n+h,action:"drop"}),i.fire("text:changed",{target:e}),i.contextTopDirty=!0,i.requestRenderAll()}}dragEndHandler(t){let{e:e}=t;if(this.isActive()&&this.__dragStartFired&&this.__dragStartSelection){var s;const t=this.target,i=this.target.canvas,{selectionStart:r,selectionEnd:n}=this.__dragStartSelection,o=(null===(s=e.dataTransfer)||void 0===s?void 0:s.dropEffect)||P;o===P?(t.selectionStart=r,t.selectionEnd=n,t._updateTextarea(),t.hiddenTextarea.focus()):(t.clearContextTop(),"move"===o&&(t.removeChars(r,n),t.selectionStart=t.selectionEnd=r,t.hiddenTextarea&&(t.hiddenTextarea.value=t.text),t._updateTextarea(),t.fire(X,{index:r,action:"dragend"}),i.fire("text:changed",{target:t}),i.requestRenderAll()),t.exitEditing())}this.__dragImageDisposer&&this.__dragImageDisposer(),delete this.__dragImageDisposer,delete this.__dragStartSelection,this.__isDraggingOver=!1}dispose(){this._dispose&&this._dispose()}}const Hn=/[ \n\.,;!\?\-]/;class Nn extends Gn{constructor(){super(...arguments),e(this,"_currentCursorOpacity",1)}initBehavior(){this._tick=this._tick.bind(this),this._onTickComplete=this._onTickComplete.bind(this),this.updateSelectionOnMouseMove=this.updateSelectionOnMouseMove.bind(this)}onDeselect(t){return this.isEditing&&this.exitEditing(),this.selected=!1,super.onDeselect(t)}_animateCursor(t){let{toValue:e,duration:s,delay:i,onComplete:r}=t;return Rs({startValue:this._currentCursorOpacity,endValue:e,duration:s,delay:i,onComplete:r,abort:()=>!this.canvas||this.selectionStart!==this.selectionEnd,onChange:t=>{this._currentCursorOpacity=t,this.renderCursorOrSelection()}})}_tick(t){this._currentTickState=this._animateCursor({toValue:0,duration:this.cursorDuration/2,delay:Math.max(t||0,100),onComplete:this._onTickComplete})}_onTickComplete(){var t;null===(t=this._currentTickCompleteState)||void 0===t||t.abort(),this._currentTickCompleteState=this._animateCursor({toValue:1,duration:this.cursorDuration,onComplete:this._tick})}initDelayedCursor(t){this.abortCursorAnimation(),this._tick(t?0:this.cursorDelay)}abortCursorAnimation(){let t=!1;[this._currentTickState,this._currentTickCompleteState].forEach(e=>{e&&!e.isDone()&&(t=!0,e.abort())}),this._currentCursorOpacity=1,t&&this.clearContextTop()}restartCursorIfNeeded(){[this._currentTickState,this._currentTickCompleteState].some(t=>!t||t.isDone())&&this.initDelayedCursor()}selectAll(){return this.selectionStart=0,this.selectionEnd=this._text.length,this._fireSelectionChanged(),this._updateTextarea(),this}cmdAll(){this.selectAll(),this.renderCursorOrSelection()}getSelectedText(){return this._text.slice(this.selectionStart,this.selectionEnd).join("")}findWordBoundaryLeft(t){let e=0,s=t-1;if(this._reSpace.test(this._text[s]))for(;this._reSpace.test(this._text[s]);)e++,s--;for(;/\S/.test(this._text[s])&&s>-1;)e++,s--;return t-e}findWordBoundaryRight(t){let e=0,s=t;if(this._reSpace.test(this._text[s]))for(;this._reSpace.test(this._text[s]);)e++,s++;for(;/\S/.test(this._text[s])&&s-1;)e++,s--;return t-e}findLineBoundaryRight(t){let e=0,s=t;for(;!/\n/.test(this._text[s])&&s0&&this._reSpace.test(s[t])&&(-1===e||!E.test(s[t-1]))?t-1:t,r=s[i];for(;i>0&&ithis.__selectionStartOnMouseDown?(this.selectionStart=this.__selectionStartOnMouseDown,this.selectionEnd=s):(this.selectionStart=s,this.selectionEnd=this.__selectionStartOnMouseDown),this.selectionStart===i&&this.selectionEnd===r||(this._fireSelectionChanged(),this._updateTextarea(),this.renderCursorOrSelection()))}_setEditingProps(){this.hoverCursor="text",this.canvas&&(this.canvas.defaultCursor=this.canvas.moveCursor="text"),this.borderColor=this.editingBorderColor,this.hasControls=this.selectable=!1,this.lockMovementX=this.lockMovementY=!0}fromStringToGraphemeSelection(t,e,s){const i=s.slice(0,t),r=this.graphemeSplit(i).length;if(t===e)return{selectionStart:r,selectionEnd:r};const n=s.slice(t,e);return{selectionStart:r,selectionEnd:r+this.graphemeSplit(n).length}}fromGraphemeToStringSelection(t,e,s){const i=s.slice(0,t).join("").length;if(t===e)return{selectionStart:i,selectionEnd:i};return{selectionStart:i,selectionEnd:i+s.slice(t,e).join("").length}}_updateTextarea(){if(this.cursorOffsetCache={},this.hiddenTextarea){if(!this.inCompositionMode){const t=this.fromGraphemeToStringSelection(this.selectionStart,this.selectionEnd,this._text);this.hiddenTextarea.selectionStart=t.selectionStart,this.hiddenTextarea.selectionEnd=t.selectionEnd}this.updateTextareaPosition()}}updateFromTextArea(){if(!this.hiddenTextarea)return;this.cursorOffsetCache={};const t=this.hiddenTextarea;this.text=t.value,this.set("dirty",!0),this.initDimensions(),this.setCoords();const e=this.fromStringToGraphemeSelection(t.selectionStart,t.selectionEnd,t.value);this.selectionEnd=this.selectionStart=e.selectionEnd,this.inCompositionMode||(this.selectionStart=e.selectionStart),this.updateTextareaPosition()}updateTextareaPosition(){if(this.selectionStart===this.selectionEnd){const t=this._calcTextareaPosition();this.hiddenTextarea.style.left=t.left,this.hiddenTextarea.style.top=t.top}}_calcTextareaPosition(){if(!this.canvas)return{left:"1px",top:"1px"};const t=this.inCompositionMode?this.compositionStart:this.selectionStart,e=this._getCursorBoundaries(t),s=this.get2DCursorLocation(t),i=s.lineIndex,r=s.charIndex,n=this.getValueOfPropertyAt(i,r,"fontSize")*this.lineHeight,o=e.leftOffset,a=this.getCanvasRetinaScaling(),h=this.canvas.upperCanvasEl,l=h.width/a,c=h.height/a,u=l-n,d=c-n,g=new it(e.left+o,e.top+e.topOffset+n).transform(this.calcTransformMatrix()).transform(this.canvas.viewportTransform).multiply(new it(h.clientWidth/l,h.clientHeight/c));return g.x<0&&(g.x=0),g.x>u&&(g.x=u),g.y<0&&(g.y=0),g.y>d&&(g.y=d),g.x+=this.canvas._offset.left,g.y+=this.canvas._offset.top,{left:`${g.x}px`,top:`${g.y}px`,fontSize:`${n}px`,charHeight:n}}_saveEditingProps(){this._savedProps={hasControls:this.hasControls,borderColor:this.borderColor,lockMovementX:this.lockMovementX,lockMovementY:this.lockMovementY,hoverCursor:this.hoverCursor,selectable:this.selectable,defaultCursor:this.canvas&&this.canvas.defaultCursor,moveCursor:this.canvas&&this.canvas.moveCursor}}_restoreEditingProps(){this._savedProps&&(this.hoverCursor=this._savedProps.hoverCursor,this.hasControls=this._savedProps.hasControls,this.borderColor=this._savedProps.borderColor,this.selectable=this._savedProps.selectable,this.lockMovementX=this._savedProps.lockMovementX,this.lockMovementY=this._savedProps.lockMovementY,this.canvas&&(this.canvas.defaultCursor=this._savedProps.defaultCursor||this.canvas.defaultCursor,this.canvas.moveCursor=this._savedProps.moveCursor||this.canvas.moveCursor),delete this._savedProps)}exitEditingImpl(){const t=this.hiddenTextarea;this.selected=!1,this.isEditing=!1,t&&(t.blur&&t.blur(),t.parentNode&&t.parentNode.removeChild(t)),this.hiddenTextarea=null,this.abortCursorAnimation(),this.selectionStart!==this.selectionEnd&&this.clearContextTop(),this.selectionEnd=this.selectionStart,this._restoreEditingProps(),this._forceClearCache&&(this.initDimensions(),this.setCoords())}exitEditing(){const t=this._textBeforeEdit!==this.text;return this.exitEditingImpl(),this.fire("editing:exited"),t&&this.fire(U),this.canvas&&(this.canvas.fire("text:editing:exited",{target:this}),t&&this.canvas.fire("object:modified",{target:this})),this}_removeExtraneousStyles(){for(const t in this.styles)this._textLines[t]||delete this.styles[t]}removeStyleFromTo(t,e){const{lineIndex:s,charIndex:i}=this.get2DCursorLocation(t,!0),{lineIndex:r,charIndex:n}=this.get2DCursorLocation(e,!0);if(s!==r){if(this.styles[s])for(let t=i;t=n&&(t[s-e]=t[i],delete t[i])}}}shiftLineStyles(t,e){const s=Object.assign({},this.styles);for(const i in this.styles){const r=parseInt(i,10);r>t&&(this.styles[r+e]=s[r],s[r-e]||delete this.styles[r])}}insertNewlineStyleObject(t,e,s,i){const r={},n=this._unwrappedTextLines[t].length,o=n===e;let a=!1;s||(s=1),this.shiftLineStyles(t,s);const h=this.styles[t]?this.styles[t][0===e?e:e-1]:void 0;for(const s in this.styles[t]){const i=parseInt(s,10);i>=e&&(a=!0,r[i-e]=this.styles[t][s],o&&0===e||delete this.styles[t][s])}let l=!1;for(a&&!o&&(this.styles[t+s]=r,l=!0),(l||n>e)&&s--;s>0;)i&&i[s-1]?this.styles[t+s]={0:{...i[s-1]}}:h?this.styles[t+s]={0:{...h}}:delete this.styles[t+s],s--;this._forceClearCache=!0}insertCharStyleObject(t,e,s,i){this.styles||(this.styles={});const r=this.styles[t],n=r?{...r}:{};s||(s=1);for(const t in n){const i=parseInt(t,10);i>=e&&(r[i+s]=n[i],n[i-s]||delete r[i])}if(this._forceClearCache=!0,i){for(;s--;)Object.keys(i[s]).length&&(this.styles[t]||(this.styles[t]={}),this.styles[t][e+s]={...i[s]});return}if(!r)return;const o=r[e?e-1:1];for(;o&&s--;)this.styles[t][e+s]={...o}}insertNewStyleBlock(t,e,s){const i=this.get2DCursorLocation(e,!0),r=[0];let n,o=0;for(let e=0;e0&&(this.insertCharStyleObject(i.lineIndex,i.charIndex,r[0],s),s=s&&s.slice(r[0]+1)),o&&this.insertNewlineStyleObject(i.lineIndex,i.charIndex+r[0],o),n=1;n0?this.insertCharStyleObject(i.lineIndex+n,0,r[n],s):s&&this.styles[i.lineIndex+n]&&s[0]&&(this.styles[i.lineIndex+n][0]=s[0]),s=s&&s.slice(r[n]+1);r[n]>0&&this.insertCharStyleObject(i.lineIndex+n,0,r[n],s)}removeChars(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:t+1;this.removeStyleFromTo(t,e),this._text.splice(t,e-t),this.text=this._text.join(""),this.set("dirty",!0),this.initDimensions(),this.setCoords(),this._removeExtraneousStyles()}insertChars(t,e,s){let i=arguments.length>3&&void 0!==arguments[3]?arguments[3]:s;i>s&&this.removeStyleFromTo(s,i);const r=this.graphemeSplit(t);this.insertNewStyleBlock(r,s,e),this._text=[...this._text.slice(0,s),...r,...this._text.slice(i)],this.text=this._text.join(""),this.set("dirty",!0),this.initDimensions(),this.setCoords(),this._removeExtraneousStyles()}setSelectionStartEndWithShift(t,e,s){s<=t?(e===t?this._selectionDirection=O:this._selectionDirection===M&&(this._selectionDirection=O,this.selectionEnd=t),this.selectionStart=s):s>t&&s{let[s,i]=t;return e.setAttribute(s,i)});const{top:s,left:i,fontSize:r}=this._calcTextareaPosition();e.style.cssText=`position: absolute; top: ${s}; left: ${i}; z-index: -999; opacity: 0; width: 1px; height: 1px; font-size: 1px; padding-top: ${r};`,(this.hiddenTextareaContainer||t.body).appendChild(e),Object.entries({blur:"blur",keydown:"onKeyDown",keyup:"onKeyUp",input:"onInput",copy:"copy",cut:"copy",paste:"paste",compositionstart:"onCompositionStart",compositionupdate:"onCompositionUpdate",compositionend:"onCompositionEnd"}).map(t=>{let[s,i]=t;return e.addEventListener(s,this[i].bind(this))}),this.hiddenTextarea=e}blur(){this.abortCursorAnimation()}onKeyDown(t){if(!this.isEditing)return;const e="rtl"===this.direction?this.keysMapRtl:this.keysMap;if(t.keyCode in e)this[e[t.keyCode]](t);else{if(!(t.keyCode in this.ctrlKeysMapDown)||!t.ctrlKey&&!t.metaKey)return;this[this.ctrlKeysMapDown[t.keyCode]](t)}t.stopImmediatePropagation(),t.preventDefault(),t.keyCode>=33&&t.keyCode<=40?(this.inCompositionMode=!1,this.clearContextTop(),this.renderCursorOrSelection()):this.canvas&&this.canvas.requestRenderAll()}onKeyUp(t){!this.isEditing||this._copyDone||this.inCompositionMode?this._copyDone=!1:t.keyCode in this.ctrlKeysMapUp&&(t.ctrlKey||t.metaKey)&&(this[this.ctrlKeysMapUp[t.keyCode]](t),t.stopImmediatePropagation(),t.preventDefault(),this.canvas&&this.canvas.requestRenderAll())}onInput(t){const e=this.fromPaste,{value:s,selectionStart:r,selectionEnd:n}=this.hiddenTextarea;if(this.fromPaste=!1,t&&t.stopPropagation(),!this.isEditing)return;const o=()=>{this.updateFromTextArea(),this.fire(X),this.canvas&&(this.canvas.fire("text:changed",{target:this}),this.canvas.requestRenderAll())};if(""===this.hiddenTextarea.value)return this.styles={},void o();const a=this._splitTextIntoLines(s).graphemeText,h=this._text.length,l=a.length,c=this.selectionStart,d=this.selectionEnd,g=c!==d;let f,p,m,v,y=l-h;const _=this.fromStringToGraphemeSelection(r,n,s),x=c>_.selectionStart;g?(p=this._text.slice(c,d),y+=d-c):lf[0])),g?(m=c,v=d):x?(m=d-p.length,v=d):(m=d,v=d+p.length),this.removeStyleFromTo(m,v)),C.length){const{copyPasteData:t}=u();e&&C.join("")===t.copiedText&&!i.disableStyleCopyPaste&&(f=t.copiedTextStyle),this.insertNewStyleBlock(C,c,f)}o()}onCompositionStart(){this.inCompositionMode=!0}onCompositionEnd(){this.inCompositionMode=!1}onCompositionUpdate(t){let{target:e}=t;const{selectionStart:s,selectionEnd:i}=e;this.compositionStart=s,this.compositionEnd=i,this.updateTextareaPosition()}copy(){if(this.selectionStart===this.selectionEnd)return;const{copyPasteData:t}=u();t.copiedText=this.getSelectedText(),i.disableStyleCopyPaste?t.copiedTextStyle=void 0:t.copiedTextStyle=this.getSelectionStyles(this.selectionStart,this.selectionEnd,!0),this._copyDone=!0}paste(){this.fromPaste=!0}_getWidthBeforeCursor(t,e){let s,i=this._getLineLeftOffset(t);return e>0&&(s=this.__charBounds[t][e-1],i+=s.left+s.width),i}getDownCursorOffset(t,e){const s=this._getSelectionForOffset(t,e),i=this.get2DCursorLocation(s),r=i.lineIndex;if(r===this._textLines.length-1||t.metaKey||34===t.keyCode)return this._text.length-s;const n=i.charIndex,o=this._getWidthBeforeCursor(r,n),a=this._getIndexOnLine(r+1,o);return this._textLines[r].slice(n).length+a+1+this.missingNewlineOffset(r)}_getSelectionForOffset(t,e){return t.shiftKey&&this.selectionStart!==this.selectionEnd&&e?this.selectionEnd:this.selectionStart}getUpCursorOffset(t,e){const s=this._getSelectionForOffset(t,e),i=this.get2DCursorLocation(s),r=i.lineIndex;if(0===r||t.metaKey||33===t.keyCode)return-s;const n=i.charIndex,o=this._getWidthBeforeCursor(r,n),a=this._getIndexOnLine(r-1,o),h=this._textLines[r].slice(0,n),l=this.missingNewlineOffset(r-1);return-this._textLines[r-1].length+a-h.length+(1-l)}_getIndexOnLine(t,e){const s=this._textLines[t];let i,r,n=this._getLineLeftOffset(t),o=0;for(let a=0,h=s.length;ae){r=!0;const t=n-i,s=n,h=Math.abs(t-e);o=Math.abs(s-e)=this._text.length&&this.selectionEnd>=this._text.length||this._moveCursorUpOrDown("Down",t)}moveCursorUp(t){0===this.selectionStart&&0===this.selectionEnd||this._moveCursorUpOrDown("Up",t)}_moveCursorUpOrDown(t,e){const s=this[`get${t}CursorOffset`](e,this._selectionDirection===M);if(e.shiftKey?this.moveCursorWithShift(s):this.moveCursorWithoutShift(s),0!==s){const t=this.text.length;this.selectionStart=xs(0,this.selectionStart,t),this.selectionEnd=xs(0,this.selectionEnd,t),this.abortCursorAnimation(),this.initDelayedCursor(),this._fireSelectionChanged(),this._updateTextarea()}}moveCursorWithShift(t){const e=this._selectionDirection===O?this.selectionStart+t:this.selectionEnd+t;return this.setSelectionStartEndWithShift(this.selectionStart,this.selectionEnd,e),0!==t}moveCursorWithoutShift(t){return t<0?(this.selectionStart+=t,this.selectionEnd=this.selectionStart):(this.selectionEnd+=t,this.selectionStart=this.selectionEnd),0!==t}moveCursorLeft(t){0===this.selectionStart&&0===this.selectionEnd||this._moveCursorLeftOrRight("Left",t)}_move(t,e,s){let i;if(t.altKey)i=this[`findWordBoundary${s}`](this[e]);else{if(!t.metaKey&&35!==t.keyCode&&36!==t.keyCode)return this[e]+="Left"===s?-1:1,!0;i=this[`findLineBoundary${s}`](this[e])}return void 0!==i&&this[e]!==i&&(this[e]=i,!0)}_moveLeft(t,e){return this._move(t,e,"Left")}_moveRight(t,e){return this._move(t,e,"Right")}moveCursorLeftWithoutShift(t){let e=!0;return this._selectionDirection=O,this.selectionEnd===this.selectionStart&&0!==this.selectionStart&&(e=this._moveLeft(t,"selectionStart")),this.selectionEnd=this.selectionStart,e}moveCursorLeftWithShift(t){return this._selectionDirection===M&&this.selectionStart!==this.selectionEnd?this._moveLeft(t,"selectionEnd"):0!==this.selectionStart?(this._selectionDirection=O,this._moveLeft(t,"selectionStart")):void 0}moveCursorRight(t){this.selectionStart>=this._text.length&&this.selectionEnd>=this._text.length||this._moveCursorLeftOrRight("Right",t)}_moveCursorLeftOrRight(t,e){const s=`moveCursor${t}${e.shiftKey?"WithShift":"WithoutShift"}`;this._currentCursorOpacity=1,this[s](e)&&(this.abortCursorAnimation(),this.initDelayedCursor(),this._fireSelectionChanged(),this._updateTextarea())}moveCursorRightWithShift(t){return this._selectionDirection===O&&this.selectionStart!==this.selectionEnd?this._moveRight(t,"selectionStart"):this.selectionEnd!==this._text.length?(this._selectionDirection=M,this._moveRight(t,"selectionEnd")):void 0}moveCursorRightWithoutShift(t){let e=!0;return this._selectionDirection=M,this.selectionStart===this.selectionEnd?(e=this._moveRight(t,"selectionStart"),this.selectionEnd=this.selectionStart):this.selectionStart=this.selectionEnd,e}}const qn=t=>!!t.button;class Kn extends Un{constructor(){super(...arguments),e(this,"draggableTextDelegate",void 0)}initBehavior(){this.on("mousedown",this._mouseDownHandler),this.on("mouseup",this.mouseUpHandler),this.on("mousedblclick",this.doubleClickHandler),this.on("mousetripleclick",this.tripleClickHandler),this.draggableTextDelegate=new zn(this),super.initBehavior()}shouldStartDragging(){return this.draggableTextDelegate.isActive()}onDragStart(t){return this.draggableTextDelegate.onDragStart(t)}canDrop(t){return this.draggableTextDelegate.canDrop(t)}doubleClickHandler(t){this.isEditing&&(this.selectWord(this.getSelectionStartFromPointer(t.e)),this.renderCursorOrSelection())}tripleClickHandler(t){this.isEditing&&(this.selectLine(this.getSelectionStartFromPointer(t.e)),this.renderCursorOrSelection())}_mouseDownHandler(t){let{e:e,alreadySelected:s}=t;this.canvas&&this.editable&&!qn(e)&&!this.getActiveControl()&&(this.draggableTextDelegate.start(e)||(this.canvas.textEditingManager.register(this),s&&(this.inCompositionMode=!1,this.setCursorByClick(e)),this.isEditing&&(this.__selectionStartOnMouseDown=this.selectionStart,this.selectionStart===this.selectionEnd&&this.abortCursorAnimation(),this.renderCursorOrSelection()),this.selected||(this.selected=s||this.isEditing)))}mouseUpHandler(t){let{e:e,transform:s}=t;const i=this.draggableTextDelegate.end(e);if(this.canvas){this.canvas.textEditingManager.unregister(this);const t=this.canvas._activeObject;if(t&&t!==this)return}!this.editable||this.group&&!this.group.interactive||s&&s.actionPerformed||qn(e)||i||this.selected&&!this.getActiveControl()&&(this.enterEditing(e),this.selectionStart===this.selectionEnd?this.initDelayedCursor(!0):this.renderCursorOrSelection())}setCursorByClick(t){const e=this.getSelectionStartFromPointer(t),s=this.selectionStart,i=this.selectionEnd;t.shiftKey?this.setSelectionStartEndWithShift(s,i,e):(this.selectionStart=e,this.selectionEnd=e),this.isEditing&&(this._fireSelectionChanged(),this._updateTextarea())}getSelectionStartFromPointer(t){const e=this.canvas.getScenePoint(t).transform(Ct(this.calcTransformMatrix())).add(new it(-this._getLeftOffset(),-this._getTopOffset()));let s=0,i=0,r=0;for(let t=0;t0&&(i+=this._textLines[t-1].length+this.missingNewlineOffset(t-1));let n=Math.abs(this._getLineLeftOffset(r));const o=this._textLines[r].length,a=this.__charBounds[r];for(let t=0;t{const s=e.getRetinaScaling();t.setTransform(s,0,0,s,0,0);const i=e.viewportTransform;t.transform(i[0],i[1],i[2],i[3],i[4],i[5])},io={selectionStart:0,selectionEnd:0,selectionColor:"rgba(17,119,255,0.3)",isEditing:!1,editable:!0,editingBorderColor:"rgba(102,153,255,0.25)",cursorWidth:2,cursorColor:"",cursorDelay:1e3,cursorDuration:600,caching:!0,hiddenTextareaContainer:null,keysMap:{9:eo,27:eo,33:Jn,34:Qn,35:to,36:Zn,37:Zn,38:Jn,39:to,40:Qn},keysMapRtl:{9:eo,27:eo,33:Jn,34:Qn,35:Zn,36:to,37:to,38:Jn,39:Zn,40:Qn},ctrlKeysMapDown:{65:"cmdAll"},ctrlKeysMapUp:{67:"copy",88:"cut"},_selectionDirection:null,_reSpace:/\s|\r?\n/,inCompositionMode:!1};class ro extends Kn{static getDefaults(){return{...super.getDefaults(),...ro.ownDefaults}}get type(){const t=super.type;return"itext"===t?"i-text":t}constructor(t,e){super(t,{...ro.ownDefaults,...e}),this.initBehavior()}_set(t,e){return this.isEditing&&this._savedProps&&t in this._savedProps?(this._savedProps[t]=e,this):("canvas"===t&&(this.canvas instanceof ln&&this.canvas.textEditingManager.remove(this),e instanceof ln&&e.textEditingManager.add(this)),super._set(t,e))}setSelectionStart(t){t=Math.max(t,0),this._updateAndFire("selectionStart",t)}setSelectionEnd(t){t=Math.min(t,this.text.length),this._updateAndFire("selectionEnd",t)}_updateAndFire(t,e){this[t]!==e&&(this._fireSelectionChanged(),this[t]=e),this._updateTextarea()}_fireSelectionChanged(){this.fire("selection:changed"),this.canvas&&this.canvas.fire("text:selection:changed",{target:this})}initDimensions(){this.isEditing&&this.initDelayedCursor(),super.initDimensions()}getSelectionStyles(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.selectionStart||0,e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:this.selectionEnd,s=arguments.length>2?arguments[2]:void 0;return super.getSelectionStyles(t,e,s)}setSelectionStyles(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:this.selectionStart||0,s=arguments.length>2&&void 0!==arguments[2]?arguments[2]:this.selectionEnd;return super.setSelectionStyles(t,e,s)}get2DCursorLocation(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.selectionStart,e=arguments.length>1?arguments[1]:void 0;return super.get2DCursorLocation(t,e)}render(t){super.render(t),this.cursorOffsetCache={},this.renderCursorOrSelection()}toCanvasElement(t){const e=this.isEditing;this.isEditing=!1;const s=super.toCanvasElement(t);return this.isEditing=e,s}renderCursorOrSelection(){if(!this.isEditing||!this.canvas)return;const t=this.clearContextTop(!0);if(!t)return;const e=this._getCursorBoundaries(),s=this.findAncestorsWithClipPath(),i=s.length>0;let r,n=t;if(i){r=ft(t.canvas),n=r.getContext("2d"),so(n,this.canvas);const e=this.calcTransformMatrix();n.transform(e[0],e[1],e[2],e[3],e[4],e[5])}if(this.selectionStart!==this.selectionEnd||this.inCompositionMode?this.renderSelection(n,e):this.renderCursor(n,e),i)for(const e of s){const s=e.clipPath,i=ft(t.canvas),r=i.getContext("2d");if(so(r,this.canvas),!s.absolutePositioned){const t=e.calcTransformMatrix();r.transform(t[0],t[1],t[2],t[3],t[4],t[5])}s.transform(r),s.drawObject(r,!0,{}),this.drawClipPathOnCache(n,s,i)}i&&(t.setTransform(1,0,0,1,0,0),t.drawImage(r,0,0)),this.canvas.contextTopDirty=!0,t.restore()}findAncestorsWithClipPath(){const t=[];let e=this;for(;e;)e.clipPath&&t.push(e),e=e.parent;return t}_getCursorBoundaries(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.selectionStart,e=arguments.length>1?arguments[1]:void 0;const s=this._getLeftOffset(),i=this._getTopOffset(),r=this._getCursorBoundariesOffsets(t,e);return{left:s,top:i,leftOffset:r.left,topOffset:r.top}}_getCursorBoundariesOffsets(t,e){return e?this.__getCursorBoundariesOffsets(t):this.cursorOffsetCache&&"top"in this.cursorOffsetCache?this.cursorOffsetCache:this.cursorOffsetCache=this.__getCursorBoundariesOffsets(t)}__getCursorBoundariesOffsets(t){let e=0,s=0;const{charIndex:i,lineIndex:r}=this.get2DCursorLocation(t);for(let t=0;t0?s:0)};return"rtl"===this.direction&&(this.textAlign===M||this.textAlign===ss||this.textAlign===rs?a.left*=-1:this.textAlign===O||this.textAlign===is?a.left=n-(s>0?s:0):this.textAlign!==T&&this.textAlign!==ns||(a.left=n-(s>0?s:0))),a}renderCursorAt(t){this._renderCursor(this.canvas.contextTop,this._getCursorBoundaries(t,!0),t)}renderCursor(t,e){this._renderCursor(t,e,this.selectionStart)}getCursorRenderingData(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.selectionStart,e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:this._getCursorBoundaries(t);const s=this.get2DCursorLocation(t),i=s.lineIndex,r=s.charIndex>0?s.charIndex-1:0,n=this.getValueOfPropertyAt(i,r,"fontSize"),o=this.getObjectScaling().x*this.canvas.getZoom(),a=this.cursorWidth/o,h=this.getValueOfPropertyAt(i,r,"deltaY"),l=e.topOffset+(1-this._fontSizeFraction)*this.getHeightOfLine(i)/this.lineHeight-n*(1-this._fontSizeFraction);return{color:this.cursorColor||this.getValueOfPropertyAt(i,r,"fill"),opacity:this._currentCursorOpacity,left:e.left+e.leftOffset-a/2,top:l+e.top+h,width:a,height:n}}_renderCursor(t,e,s){const{color:i,opacity:r,left:n,top:o,width:a,height:h}=this.getCursorRenderingData(s,e);t.fillStyle=i,t.globalAlpha=r,t.fillRect(n,o,a,h)}renderSelection(t,e){const s={selectionStart:this.inCompositionMode?this.hiddenTextarea.selectionStart:this.selectionStart,selectionEnd:this.inCompositionMode?this.hiddenTextarea.selectionEnd:this.selectionEnd};this._renderSelection(t,s,e)}renderDragSourceEffect(){const t=this.draggableTextDelegate.getDragStartSelection();this._renderSelection(this.canvas.contextTop,t,this._getCursorBoundaries(t.selectionStart,!0))}renderDropTargetEffect(t){const e=this.getSelectionStartFromPointer(t);this.renderCursorAt(e)}_renderSelection(t,e,s){const i=e.selectionStart,r=e.selectionEnd,n=this.textAlign.includes(ss),o=this.get2DCursorLocation(i),a=this.get2DCursorLocation(r),h=o.lineIndex,l=a.lineIndex,c=o.charIndex<0?0:o.charIndex,u=a.charIndex<0?0:a.charIndex;for(let e=h;e<=l;e++){const i=this._getLineLeftOffset(e)||0;let r=this.getHeightOfLine(e),o=0,a=0,d=0;if(e===h&&(a=this.__charBounds[h][c].left),e>=h&&e1)&&(r/=this.lineHeight);let g=s.left+i+a,f=r,p=0;const m=d-a;this.inCompositionMode?(t.fillStyle=this.compositionColor||"black",f=1,p=r):t.fillStyle=this.selectionColor,"rtl"===this.direction&&(this.textAlign===M||this.textAlign===ss||this.textAlign===rs?g=this.width-g-m:this.textAlign===O||this.textAlign===is?g=s.left+i-d:this.textAlign!==T&&this.textAlign!==ns||(g=s.left+i-d)),t.fillRect(g,s.top+s.topOffset+p,m,f),s.topOffset+=o}}getCurrentCharFontSize(){const t=this._getCurrentCharIndex();return this.getValueOfPropertyAt(t.l,t.c,"fontSize")}getCurrentCharColor(){const t=this._getCurrentCharIndex();return this.getValueOfPropertyAt(t.l,t.c,H)}_getCurrentCharIndex(){const t=this.get2DCursorLocation(this.selectionStart,!0),e=t.charIndex>0?t.charIndex-1:0;return{l:t.lineIndex,c:e}}dispose(){this.exitEditingImpl(),this.draggableTextDelegate.dispose(),super.dispose()}}e(ro,"ownDefaults",io),e(ro,"type","IText"),J.setClass(ro),J.setClass(ro,"i-text");class no extends ro{static getDefaults(){return{...super.getDefaults(),...no.ownDefaults}}constructor(t,e){super(t,{...no.ownDefaults,...e})}static createControls(){return{controls:vi()}}initDimensions(){this.initialized&&(this.isEditing&&this.initDelayedCursor(),this._clearCache(),this.dynamicMinWidth=0,this._styleMap=this._generateStyleMap(this._splitText()),this.dynamicMinWidth>this.width&&this._set("width",this.dynamicMinWidth),this.textAlign.includes(ss)&&this.enlargeSpaces(),this.height=this.calcTextHeight())}_generateStyleMap(t){let e=0,s=0,i=0;const r={};for(let n=0;n0?(s=0,i++,e++):!this.splitByGrapheme&&this._reSpaceAndTab.test(t.graphemeText[i])&&n>0&&(s++,i++),r[n]={line:e,offset:s},i+=t.graphemeLines[n].length,s+=t.graphemeLines[n].length;return r}styleHas(t,e){if(this._styleMap&&!this.isWrapping){const t=this._styleMap[e];t&&(e=t.line)}return super.styleHas(t,e)}isEmptyStyles(t){if(!this.styles)return!0;let e,s=0,i=t+1,r=!1;const n=this._styleMap[t],o=this._styleMap[t+1];n&&(t=n.line,s=n.offset),o&&(i=o.line,r=i===t,e=o.offset);const a=void 0===t?this.styles:{line:this.styles[t]};for(const t in a)for(const i in a[t]){const n=parseInt(i,10);if(n>=s&&(!r||n{let n=0;const o=e?this.graphemeSplit(t):this.wordSplit(t);return 0===o.length?[{word:[],width:0}]:o.map(t=>{const o=e?[t]:this.graphemeSplit(t),a=this._measureWord(o,r,n);return i=Math.max(a,i),n+=o.length+s.length,{word:o,width:a}})}),largestWordWidth:i}}_measureWord(t,e){let s,i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:0,r=0;for(let n=0,o=t.length;n3&&void 0!==arguments[3]?arguments[3]:0;const o=this._getWidthOfCharSpacing(),a=this.splitByGrapheme,h=[],l=a?"":" ";let c=0,u=[],d=0,g=0,f=!0;e-=n;const p=Math.max(e,i,this.dynamicMinWidth),m=r[t];let v;for(d=0,v=0;vp&&!f?(h.push(u),u=[],c=s,f=!0):c+=o,f||a||u.push(l),u=u.concat(e),g=a?0:this._measureWord([l],t,d),d++,f=!1}return v&&h.push(u),i+n>this.dynamicMinWidth&&(this.dynamicMinWidth=i-o+n),h}isEndOfWrapping(t){return!this._styleMap[t+1]||this._styleMap[t+1].line!==this._styleMap[t].line}missingNewlineOffset(t,e){return this.splitByGrapheme&&!e?this.isEndOfWrapping(t)?1:0:1}_splitTextIntoLines(t){const e=super._splitTextIntoLines(t),s=this._wrapText(e.lines,this.width),i=new Array(s.length);for(let t=0;t0&&void 0!==arguments[0]?arguments[0]:[];return super.toObject(["minWidth","splitByGrapheme",...t])}}e(no,"type","Textbox"),e(no,"textLayoutProperties",[...ro.textLayoutProperties,"width"]),e(no,"ownDefaults",{minWidth:20,dynamicMinWidth:2,lockScalingFlip:!0,noScaleCache:!1,_wordJoiners:/[ \t\r]/,splitByGrapheme:!1}),J.setClass(no);class oo extends fr{shouldPerformLayout(t){return!!t.target.clipPath&&super.shouldPerformLayout(t)}shouldLayoutClipPath(){return!1}calcLayoutResult(t,e){const{target:s}=t,{clipPath:i,group:r}=s;if(!i||!this.shouldPerformLayout(t))return;const{width:n,height:o}=re(gr(s,i)),a=new it(n,o);if(i.absolutePositioned){return{center:ue(i.getRelativeCenterPoint(),void 0,r?r.calcTransformMatrix():void 0),size:a}}{const r=i.getRelativeCenterPoint().transform(s.calcOwnMatrix(),!0);if(this.shouldPerformLayout(t)){const{center:s=new it,correction:i=new it}=this.calcBoundingBox(e,t)||{};return{center:s.add(r),correction:i.subtract(r),size:a}}return{center:s.getRelativeCenterPoint().add(r),size:a}}}}e(oo,"type","clip-path"),J.setClass(oo);class ao extends fr{getInitialSize(t,e){let{target:s}=t,{size:i}=e;return new it(s.width||i.x,s.height||i.y)}}e(ao,"type","fixed"),J.setClass(ao);class ho extends vr{subscribeTargets(t){const e=t.target;t.targets.reduce((t,e)=>(e.parent&&t.add(e.parent),t),new Set).forEach(t=>{t.layoutManager.subscribeTargets({target:t,targets:[e]})})}unsubscribeTargets(t){const e=t.target,s=e.getObjects();t.targets.reduce((t,e)=>(e.parent&&t.add(e.parent),t),new Set).forEach(t=>{!s.some(e=>e.parent===t)&&t.layoutManager.unsubscribeTargets({target:t,targets:[e]})})}}class lo extends _r{static getDefaults(){return{...super.getDefaults(),...lo.ownDefaults}}constructor(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[],e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};super(),Object.assign(this,lo.ownDefaults),this.setOptions(e);const{left:s,top:i,layoutManager:r}=e;this.groupInit(t,{left:s,top:i,layoutManager:null!=r?r:new ho})}_shouldSetNestedCoords(){return!0}__objectSelectionMonitor(){}multiSelectAdd(){for(var t=arguments.length,e=new Array(t),s=0;s{const e=this._objects.findIndex(e=>e.isInFrontOf(t)),s=-1===e?this.size():e;this.insertAt(s,t)})}canEnterGroup(t){return this.getObjects().some(e=>e.isDescendantOf(t)||t.isDescendantOf(e))?(r("error","ActiveSelection: circular object trees are not supported, this call has no effect"),!1):super.canEnterGroup(t)}enterGroup(t,e){t.parent&&t.parent===t.group?t.parent._exitGroup(t):t.group&&t.parent!==t.group&&t.group.remove(t),this._enterGroup(t,e)}exitGroup(t,e){this._exitGroup(t,e),t.parent&&t.parent._enterGroup(t,!0)}_onAfterObjectsChange(t,e){super._onAfterObjectsChange(t,e);const s=new Set;e.forEach(t=>{const{parent:e}=t;e&&s.add(e)}),t===ur?s.forEach(t=>{t._onAfterObjectsChange(cr,e)}):s.forEach(t=>{t._set("dirty",!0)})}onDeselect(){return this.removeAll(),!1}toString(){return`#`}shouldCache(){return!1}isOnACache(){return!1}_renderControls(t,e,s){t.save(),t.globalAlpha=this.isMoving?this.borderOpacityWhenMoving:1;const i={hasControls:!1,...s,forActiveSelection:!0};for(let e=0;e{t.applyTo(o)});const{imageData:a}=o;return a.width===s&&a.height===i||(r.width=a.width,r.height=a.height),n.putImageData(a,0,0),o}}class uo{constructor(){let{tileSize:t=i.textureSize}=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};e(this,"aPosition",new Float32Array([0,0,0,1,1,0,1,1])),e(this,"resources",{}),this.tileSize=t,this.setupGLContext(t,t),this.captureGPUInfo()}setupGLContext(t,e){this.dispose(),this.createWebGLCanvas(t,e)}createWebGLCanvas(t,e){const s=ft({width:t,height:e}),i=s.getContext("webgl",{alpha:!0,premultipliedAlpha:!1,depth:!1,stencil:!1,antialias:!1});i&&(i.clearColor(0,0,0,0),this.canvas=s,this.gl=i)}applyFilters(t,e,s,i,r,n){const o=this.gl,a=r.getContext("2d");if(!o||!a)return;let h;n&&(h=this.getCachedTexture(n,e));const l={originalWidth:e.width||e.naturalWidth||0,originalHeight:e.height||e.naturalHeight||0,sourceWidth:s,sourceHeight:i,destinationWidth:s,destinationHeight:i,context:o,sourceTexture:this.createTexture(o,s,i,h?void 0:e),targetTexture:this.createTexture(o,s,i),originalTexture:h||this.createTexture(o,s,i,h?void 0:e),passes:t.length,webgl:!0,aPosition:this.aPosition,programCache:this.programCache,pass:0,filterBackend:this,targetCanvas:r},c=o.createFramebuffer();return o.bindFramebuffer(o.FRAMEBUFFER,c),t.forEach(t=>{t&&t.applyTo(l)}),function(t){const e=t.targetCanvas,s=e.width,i=e.height,r=t.destinationWidth,n=t.destinationHeight;s===r&&i===n||(e.width=r,e.height=n)}(l),this.copyGLTo2D(o,l),o.bindTexture(o.TEXTURE_2D,null),o.deleteTexture(l.sourceTexture),o.deleteTexture(l.targetTexture),o.deleteFramebuffer(c),a.setTransform(1,0,0,1,0,0),l}dispose(){this.canvas&&(this.canvas=null,this.gl=null),this.clearWebGLCaches()}clearWebGLCaches(){this.programCache={},this.textureCache={}}createTexture(t,e,s,i,r){const{NEAREST:n,TEXTURE_2D:o,RGBA:a,UNSIGNED_BYTE:h,CLAMP_TO_EDGE:l,TEXTURE_MAG_FILTER:c,TEXTURE_MIN_FILTER:u,TEXTURE_WRAP_S:d,TEXTURE_WRAP_T:g}=t,f=t.createTexture();return t.bindTexture(o,f),t.texParameteri(o,c,r||n),t.texParameteri(o,u,r||n),t.texParameteri(o,d,l),t.texParameteri(o,g,l),i?t.texImage2D(o,0,a,a,h,i):t.texImage2D(o,0,a,e,s,0,a,h,null),f}getCachedTexture(t,e,s){const{textureCache:i}=this;if(i[t])return i[t];{const r=this.createTexture(this.gl,e.width,e.height,e,s);return r&&(i[t]=r),r}}evictCachesForKey(t){this.textureCache[t]&&(this.gl.deleteTexture(this.textureCache[t]),delete this.textureCache[t])}copyGLTo2D(t,e){const s=t.canvas,i=e.targetCanvas,r=i.getContext("2d");if(!r)return;r.translate(0,i.height),r.scale(1,-1);const n=s.height-i.height;r.drawImage(s,0,n,i.width,i.height,0,0,i.width,i.height)}copyGLTo2DPutImageData(t,e){const s=e.targetCanvas.getContext("2d"),i=e.destinationWidth,r=e.destinationHeight,n=i*r*4;if(!s)return;const o=new Uint8Array(this.imageBuffer,0,n),a=new Uint8ClampedArray(this.imageBuffer,0,n);t.readPixels(0,0,i,r,t.RGBA,t.UNSIGNED_BYTE,o);const h=new ImageData(a,i,r);s.putImageData(h,0,0)}captureGPUInfo(){if(this.gpuInfo)return this.gpuInfo;const t=this.gl,e={renderer:"",vendor:""};if(!t)return e;const s=t.getExtension("WEBGL_debug_renderer_info");if(s){const i=t.getParameter(s.UNMASKED_RENDERER_WEBGL),r=t.getParameter(s.UNMASKED_VENDOR_WEBGL);i&&(e.renderer=i.toLowerCase()),r&&(e.vendor=r.toLowerCase())}return this.gpuInfo=e,e}}let go;function fo(){const{WebGLProbe:t}=u();return t.queryWebGL(dt()),i.enableGLFiltering&&t.isSupported(i.textureSize)?new uo({tileSize:i.textureSize}):new co}function po(){return!go&&(!(arguments.length>0&&void 0!==arguments[0])||arguments[0])&&(go=fo()),go}const mo=["cropX","cropY"];class vo extends xi{static getDefaults(){return{...super.getDefaults(),...vo.ownDefaults}}constructor(t,s){super(),e(this,"_lastScaleX",1),e(this,"_lastScaleY",1),e(this,"_filterScalingX",1),e(this,"_filterScalingY",1),this.filters=[],Object.assign(this,vo.ownDefaults),this.setOptions(s),this.cacheKey=`texture${ut()}`,this.setElement("string"==typeof t?(this.canvas&&Ht(this.canvas.getElement())||d()).getElementById(t):t,s)}getElement(){return this._element}setElement(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};this.removeTexture(this.cacheKey),this.removeTexture(`${this.cacheKey}_filtered`),this._element=t,this._originalElement=t,this._setWidthHeight(e),0!==this.filters.length&&this.applyFilters(),this.resizeFilter&&this.applyResizeFilters()}removeTexture(t){const e=po(!1);e instanceof uo&&e.evictCachesForKey(t)}dispose(){super.dispose(),this.removeTexture(this.cacheKey),this.removeTexture(`${this.cacheKey}_filtered`),this._cacheContext=null,["_originalElement","_element","_filteredEl","_cacheCanvas"].forEach(t=>{const e=this[t];e&&u().dispose(e),this[t]=void 0})}getCrossOrigin(){return this._originalElement&&(this._originalElement.crossOrigin||null)}getOriginalSize(){const t=this.getElement();return t?{width:t.naturalWidth||t.width,height:t.naturalHeight||t.height}:{width:0,height:0}}_stroke(t){if(!this.stroke||0===this.strokeWidth)return;const e=this.width/2,s=this.height/2;t.beginPath(),t.moveTo(-e,-s),t.lineTo(e,-s),t.lineTo(e,s),t.lineTo(-e,s),t.lineTo(-e,-s),t.closePath()}toObject(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[];const e=[];return this.filters.forEach(t=>{t&&e.push(t.toObject())}),{...super.toObject([...mo,...t]),src:this.getSrc(),crossOrigin:this.getCrossOrigin(),filters:e,...this.resizeFilter?{resizeFilter:this.resizeFilter.toObject()}:{}}}hasCrop(){return!!this.cropX||!!this.cropY||this.width\n','\t\n',"\n"),o=' clip-path="url(#imageCrop_'+t+')" '}if(this.imageSmoothing||(a=' image-rendering="optimizeSpeed"'),t.push("\t\n`),this.stroke||this.strokeDashArray){const t=this.fill;this.fill=null,n=[`\t\n`],this.fill=t}return r=this.paintFirst!==H?r.concat(n,t):r.concat(t,n),r}getSrc(t){const e=t?this._element:this._originalElement;return e?e.toDataURL?e.toDataURL():this.srcFromAttribute?e.getAttribute("src")||"":e.src:this.src||""}getSvgSrc(t){return this.getSrc(t)}setSrc(t){let{crossOrigin:e,signal:s}=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return Ft(t,{crossOrigin:e,signal:s}).then(t=>{void 0!==e&&this.set({crossOrigin:e}),this.setElement(t)})}toString(){return`#`}applyResizeFilters(){const t=this.resizeFilter,e=this.minimumScaleTrigger,s=this.getTotalObjectScaling(),i=s.x,r=s.y,n=this._filteredEl||this._originalElement;if(this.group&&this.set("dirty",!0),!t||i>e&&r>e)return this._element=n,this._filterScalingX=1,this._filterScalingY=1,this._lastScaleX=i,void(this._lastScaleY=r);const o=ft(n),{width:a,height:h}=n;this._element=o,this._lastScaleX=t.scaleX=i,this._lastScaleY=t.scaleY=r,po().applyFilters([t],n,a,h,this._element),this._filterScalingX=o.width/this._originalElement.width,this._filterScalingY=o.height/this._originalElement.height}applyFilters(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.filters||[];if(t=t.filter(t=>t&&!t.isNeutralState()),this.set("dirty",!0),this.removeTexture(`${this.cacheKey}_filtered`),0===t.length)return this._element=this._originalElement,this._filteredEl=void 0,this._filterScalingX=1,void(this._filterScalingY=1);const e=this._originalElement,s=e.naturalWidth||e.width,i=e.naturalHeight||e.height;if(this._element===this._originalElement){const t=ft({width:s,height:i});this._element=t,this._filteredEl=t}else this._filteredEl&&(this._element=this._filteredEl,this._filteredEl.getContext("2d").clearRect(0,0,s,i),this._lastScaleX=1,this._lastScaleY=1);po().applyFilters(t,this._originalElement,s,i,this._element,this.cacheKey),this._originalElement.width===this._element.width&&this._originalElement.height===this._element.height||(this._filterScalingX=this._element.width/this._originalElement.width,this._filterScalingY=this._element.height/this._originalElement.height)}_render(t){t.imageSmoothingEnabled=this.imageSmoothing,!0!==this.isMoving&&this.resizeFilter&&this._needsResize()&&this.applyResizeFilters(),this._stroke(t),this._renderPaintInOrder(t)}drawCacheOnCanvas(t){t.imageSmoothingEnabled=this.imageSmoothing,super.drawCacheOnCanvas(t)}shouldCache(){return this.needsItsOwnCache()}_renderFill(t){const e=this._element;if(!e)return;const s=this._filterScalingX,i=this._filterScalingY,r=this.width,n=this.height,o=Math.max(this.cropX,0),a=Math.max(this.cropY,0),h=e.naturalWidth||e.width,l=e.naturalHeight||e.height,c=o*s,u=a*i,d=Math.min(r*s,h-c),g=Math.min(n*i,l-u),f=-r/2,p=-n/2,m=Math.min(r,h/s-o),v=Math.min(n,l/i-a);e&&t.drawImage(e,c,u,d,g,f,p,m,v)}_needsResize(){const t=this.getTotalObjectScaling();return t.x!==this._lastScaleX||t.y!==this._lastScaleY}_resetWidthHeight(){this.set(this.getOriginalSize())}_setWidthHeight(){let{width:t,height:e}=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};const s=this.getOriginalSize();this.width=t||s.width,this.height=e||s.height}parsePreserveAspectRatioAttribute(){const t=ze(this.preserveAspectRatio||""),e=this.width,s=this.height,i={width:e,height:s};let r,n=this._element.width,o=this._element.height,a=1,h=1,l=0,c=0,u=0,d=0;return!t||t.alignX===P&&t.alignY===P?(a=e/n,h=s/o):("meet"===t.meetOrSlice&&(a=h=xr(this._element,i),r=(e-n*a)/2,"Min"===t.alignX&&(l=-r),"Max"===t.alignX&&(l=r),r=(s-o*h)/2,"Min"===t.alignY&&(c=-r),"Max"===t.alignY&&(c=r)),"slice"===t.meetOrSlice&&(a=h=Cr(this._element,i),r=n-e/a,"Mid"===t.alignX&&(u=r/2),"Max"===t.alignX&&(u=r),r=o-s/h,"Mid"===t.alignY&&(d=r/2),"Max"===t.alignY&&(d=r),n=e/a,o=s/h)),{width:n,height:o,scaleX:a,scaleY:h,offsetLeft:l,offsetTop:c,cropX:u,cropY:d}}static fromObject(t,e){let{filters:s,resizeFilter:i,src:r,crossOrigin:n,type:o,...a}=t;return Promise.all([Ft(r,{...e,crossOrigin:n}),s&&Lt(s,e),i?Lt([i],e):[],It(a,e)]).then(t=>{let[e,s=[],[i],n={}]=t;return new this(e,{...a,src:r,filters:s,resizeFilter:i,...n})})}static fromURL(t){let{crossOrigin:e=null,signal:s}=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},i=arguments.length>2?arguments[2]:void 0;return Ft(t,{crossOrigin:e,signal:s}).then(t=>new this(t,i))}static async fromElement(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},s=arguments.length>2?arguments[2]:void 0;const i=or(t,this.ATTRIBUTE_NAMES,s);return this.fromURL(i["xlink:href"]||i.href,e,i).catch(t=>(r("log","Unable to parse Image",t),null))}}function yo(t){if(!fs.test(t.nodeName))return{};const e=t.getAttribute("viewBox");let s,i,r=1,n=1,o=0,a=0;const h=t.getAttribute("width"),l=t.getAttribute("height"),c=t.getAttribute("x")||0,u=t.getAttribute("y")||0,d=!(e&&ms.test(e)),g=!h||!l||"100%"===h||"100%"===l;let f="",p=0,m=0;if(d&&(c||u)&&t.parentNode&&"#document"!==t.parentNode.nodeName&&(f=" translate("+Ge(c||"0")+" "+Ge(u||"0")+") ",s=(t.getAttribute("transform")||"")+f,t.setAttribute("transform",s),t.removeAttribute("x"),t.removeAttribute("y")),d&&g)return{width:0,height:0};const v={width:0,height:0};if(d)return v.width=Ge(h),v.height=Ge(l),v;const y=e.match(ms);o=-parseFloat(y[1]),a=-parseFloat(y[2]);const _=parseFloat(y[3]),x=parseFloat(y[4]);v.minX=o,v.minY=a,v.viewBoxWidth=_,v.viewBoxHeight=x,g?(v.width=_,v.height=x):(v.width=Ge(h),v.height=Ge(l),r=v.width/_,n=v.height/x);const C=ze(t.getAttribute("preserveAspectRatio")||"");if(C.alignX!==P&&("meet"===C.meetOrSlice&&(n=r=r>n?n:r),"slice"===C.meetOrSlice&&(n=r=r>n?r:n),p=v.width-_*r,m=v.height-x*r,"Mid"===C.alignX&&(p/=2),"Mid"===C.alignY&&(m/=2),"Min"===C.alignX&&(p=0),"Min"===C.alignY&&(m=0)),1===r&&1===n&&0===o&&0===a&&0===c&&0===u)return v;if((c||u)&&"#document"!==t.parentNode.nodeName&&(f=" translate("+Ge(c||"0")+" "+Ge(u||"0")+") "),s=f+" matrix("+r+" 0 0 "+n+" "+(o*r+p)+" "+(a*n+m)+") ","svg"===t.nodeName){for(i=t.ownerDocument.createElementNS(hs,"g");t.firstChild;)i.appendChild(t.firstChild);t.appendChild(i)}else i=t,i.removeAttribute("x"),i.removeAttribute("y"),s=i.getAttribute("transform")+s;return i.setAttribute("transform",s),v}e(vo,"type","Image"),e(vo,"cacheProperties",[...bs,...mo]),e(vo,"ownDefaults",{strokeWidth:0,srcFromAttribute:!1,minimumScaleTrigger:.5,cropX:0,cropY:0,imageSmoothing:!0}),e(vo,"ATTRIBUTE_NAMES",[...Ri,"x","y","width","height","preserveAspectRatio","xlink:href","href","crossOrigin","image-rendering"]),J.setClass(vo),J.setSVGClass(vo);const _o=t=>t.tagName.replace("svg:",""),xo=Ue(["pattern","defs","symbol","metadata","clipPath","mask","desc"]);function Co(t,e){let s,i,r,n,o=[];for(r=0,n=e.length;r{const s=r.getAttribute(t);!e.hasAttribute(t)&&s&&e.setAttribute(t,s)}),!e.children.length)){const t=r.cloneNode(!0);for(;t.firstChild;)e.appendChild(t.firstChild)}e.removeAttribute(So)}const To=["linearGradient","radialGradient","svg:linearGradient","svg:radialGradient"];const Oo=t=>J.getSVGClass(_o(t).toLowerCase());class ko{constructor(t,e,s,i,r){this.elements=t,this.options=e,this.reviver=s,this.regexUrl=/^url\(['"]?#([^'"]+)['"]?\)/g,this.doc=i,this.clipPaths=r,this.gradientDefs=function(t){const e=Co(t,To),s={};let i=e.length;for(;i--;){const r=e[i];r.getAttribute("xlink:href")&&wo(t,r);const n=r.getAttribute("id");n&&(s[n]=r)}return s}(i),this.cssRules=function(t){const e=t.getElementsByTagName("style"),s={};for(let t=0;ts.length>1&&t.trim()).forEach(t=>{if((t.match(/{/g)||[]).length>1&&t.trim().startsWith("@"))return;const e=t.split("{"),i={},r=e[1].trim().split(";").filter(function(t){return t.trim()});for(let t=0;t{""!==(t=t.replace(/^svg/i,"").trim())&&(s[t]={...s[t]||{},...i})})})}return s}(i)}parse(){return Promise.all(this.elements.map(t=>this.createObject(t)))}async createObject(t){const e=Oo(t);if(e){const s=await e.fromElement(t,this.options,this.cssRules);return this.resolveGradient(s,t,H),this.resolveGradient(s,t,N),s instanceof vo&&s._originalElement?Jr(s,s.parsePreserveAspectRatioAttribute()):Jr(s),await this.resolveClipPath(s,t),this.reviver&&this.reviver(t,s),s}return null}extractPropertyDefinition(t,e,s){const i=t[e],r=this.regexUrl;if(!r.test(i))return;r.lastIndex=0;const n=r.exec(i)[1];return r.lastIndex=0,s[n]}resolveGradient(t,e,s){const i=this.extractPropertyDefinition(t,s,this.gradientDefs);if(i){const r=e.getAttribute(s+"-opacity"),n=wn.fromElement(i,t,{...this.options,opacity:r});t.set(s,n)}}async resolveClipPath(t,e,s){const i=this.extractPropertyDefinition(t,"clipPath",this.clipPaths);if(i){const r=Ct(t.calcTransformMatrix()),n=i[0].parentElement;let o=e;for(;!s&&o.parentElement&&o.getAttribute("clip-path")!==t.clipPath;)o=o.parentElement;o.parentElement.appendChild(n);const a=er(`${o.getAttribute("transform")||""} ${n.getAttribute("originalTransform")||""}`);n.setAttribute("transform",`matrix(${a.join(",")})`);const h=await Promise.all(i.map(t=>Oo(t).fromElement(t,this.options,this.cssRules).then(t=>(Jr(t),t.fillRule=t.clipRule,delete t.clipRule,t)))),l=1===h.length?h[0]:new _r(h),c=bt(r,l.calcTransformMatrix());l.clipPath&&await this.resolveClipPath(l,o,n.getAttribute("clip-path")?o:void 0);const{scaleX:u,scaleY:d,angle:g,skewX:f,translateX:p,translateY:m}=Tt(c);l.set({flipX:!1,flipY:!1}),l.set({scaleX:u,scaleY:d,angle:g,skewX:f,skewY:0}),l.setPositionByOrigin(new it(p,m),T,T),t.clipPath=l}else delete t.clipPath}}const Do=t=>gs.test(_o(t));async function Mo(t,e){let{crossOrigin:s,signal:i}=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};if(i&&i.aborted)return r("log",new o("parseSVGDocument")),{objects:[],elements:[],options:{},allElements:[]};const n=t.documentElement;!function(t){const e=Co(t,["use","svg:use"]),s=["x","y","xlink:href","href","transform"];for(const i of e){const e=i.attributes,r={};for(const t of e)t.value&&(r[t.name]=t.value);const n=(r["xlink:href"]||r.href||"").slice(1);if(""===n)return;const o=t.getElementById(n);if(null===o)return;let a=o.cloneNode(!0);const h=a.attributes,l={};for(const t of h)t.value&&(l[t.name]=t.value);const{x:c=0,y:u=0,transform:d=""}=r,g=`${d} ${l.transform||""} translate(${c}, ${u})`;if(yo(a),/^svg$/i.test(a.nodeName)){const t=a.ownerDocument.createElementNS(hs,"g");Object.entries(l).forEach(e=>{let[s,i]=e;return t.setAttributeNS(hs,s,i)}),t.append(...a.childNodes),a=t}for(const t of e){if(!t)continue;const{name:e,value:i}=t;if(!s.includes(e))if("style"===e){const t={};ir(i,t),Object.entries(l).forEach(e=>{let[s,i]=e;t[s]=i}),ir(l.style||"",t);const s=Object.entries(t).map(t=>t.join(":")).join(";");a.setAttribute(e,s)}else!l[e]&&a.setAttribute(e,i)}a.setAttribute("transform",g),a.setAttribute("instantiated_by_use","1"),a.removeAttribute("id"),i.parentNode.replaceChild(a,i)}}(t);const a=Array.from(n.getElementsByTagName("*")),h={...yo(n),crossOrigin:s,signal:i},l=a.filter(t=>(yo(t),Do(t)&&!function(t){let e=t;for(;e&&(e=e.parentElement);)if(e&&e.nodeName&&xo.test(_o(e))&&!e.getAttribute("instantiated_by_use"))return!0;return!1}(t)));if(!l||l&&!l.length)return{objects:[],elements:[],options:{},allElements:[],options:h,allElements:a};const c={};a.filter(t=>"clipPath"===_o(t)).forEach(t=>{t.setAttribute("originalTransform",t.getAttribute("transform")||"");const e=t.getAttribute("id");c[e]=Array.from(t.getElementsByTagName("*")).filter(t=>Do(t))});const u=new ko(l,h,e,t,c);return{objects:await u.parse(),elements:l,options:h,allElements:a}}function Po(t,e,s){return Mo((new(g().DOMParser)).parseFromString(t.trim(),"text/xml"),e,s)}const Eo=B,Ao=t=>function(e,s,i){const{points:r,pathOffset:n}=i;return new it(r[t]).subtract(n).transform(bt(i.getViewportTransform(),i.calcTransformMatrix()))},jo=(t,e,s,i)=>{const{target:r,pointIndex:n}=e,o=r,a=ue(new it(s,i),void 0,o.calcOwnMatrix());return o.points[n]=a.add(o.pathOffset),o.setDimensions(),o.set("dirty",!0),!0},Fo=(t,e)=>function(s,i,r,n){const o=i.target,a=new it(o.points[(t>0?t:o.points.length)-1]),h=a.subtract(o.pathOffset).transform(o.calcOwnMatrix()),l=e(s,{...i,pointIndex:t},r,n),c=a.subtract(o.pathOffset).transform(o.calcOwnMatrix()).subtract(h);return o.left-=c.x,o.top-=c.y,l},Lo=t=>Ws(Eo,Fo(t,jo));const Io=(t,e,s)=>{const{path:i,pathOffset:r}=t,n=i[e];return new it(n[s]-r.x,n[s+1]-r.y).transform(bt(t.getViewportTransform(),t.calcTransformMatrix()))};function Ro(t,e,s){const{commandIndex:i,pointIndex:r}=this;return Io(s,i,r)}function Bo(t,e,s,i){const{target:r}=e,{commandIndex:n,pointIndex:o}=this,a=((t,e,s,i,r)=>{const{path:n,pathOffset:o}=t,a=n[(i>0?i:n.length)-1],h=new it(a[r],a[r+1]),l=h.subtract(o).transform(t.calcOwnMatrix()),c=ue(new it(e,s),void 0,t.calcOwnMatrix());n[i][r]=c.x+o.x,n[i][r+1]=c.y+o.y,t.setDimensions();const u=h.subtract(t.pathOffset).transform(t.calcOwnMatrix()).subtract(l);return t.left-=u.x,t.top-=u.y,t.set("dirty",!0),!0})(r,s,i,n,o);return fe(this.actionName,{...je(t,e,s,i),commandIndex:n,pointIndex:o}),a}class $o extends Ns{constructor(t){super(t)}render(t,e,s,i,r){const n={...i,cornerColor:this.controlFill,cornerStrokeColor:this.controlStroke,transparentCorners:!this.controlFill};super.render(t,e,s,n,r)}}class Xo extends $o{constructor(t){super(t)}render(t,e,s,i,r){const{path:n}=r,{commandIndex:o,pointIndex:a,connectToCommandIndex:h,connectToPointIndex:l}=this;t.save(),t.strokeStyle=this.controlStroke,this.connectionDashArray&&t.setLineDash(this.connectionDashArray);const[c]=n[o],u=Io(r,h,l);if("Q"===c){const i=Io(r,o,a+2);t.moveTo(i.x,i.y),t.lineTo(e,s)}else t.moveTo(e,s);t.lineTo(u.x,u.y),t.stroke(),t.restore(),super.render(t,e,s,i,r)}}const Yo=(t,e,s,i,r,n)=>new(s?Xo:$o)({commandIndex:t,pointIndex:e,actionName:"modifyPath",positionHandler:Ro,actionHandler:Bo,connectToCommandIndex:r,connectToPointIndex:n,...i,...s?i.controlPointStyle:i.pointStyle});var Wo=Object.freeze({__proto__:null,changeWidth:Gs,createObjectDefaultControls:pi,createPathControls:function(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};const s={};let i="M";return t.path.forEach((t,r)=>{const n=t[0];switch("Z"!==n&&(s[`c_${r}_${n}`]=Yo(r,t.length-2,!1,e)),n){case"C":s[`c_${r}_C_CP_1`]=Yo(r,1,!0,e,r-1,(t=>"C"===t?5:"Q"===t?3:1)(i)),s[`c_${r}_C_CP_2`]=Yo(r,3,!0,e,r,5);break;case"Q":s[`c_${r}_Q_CP_1`]=Yo(r,1,!0,e,r,3)}i=n}),s},createPolyActionHandler:Lo,createPolyControls:function(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};const s={};for(let i=0;i<("number"==typeof t?t:t.points.length);i++)s[`p${i}`]=new Ns({actionName:Eo,positionHandler:Ao(i),actionHandler:Lo(i),...e});return s},createPolyPositionHandler:Ao,createResizeControls:mi,createTextboxDefaultControls:vi,dragHandler:Ie,factoryPolyActionHandler:Fo,getLocalPoint:Le,polyActionHandler:jo,renderCircleControl:zs,renderSquareControl:Hs,rotationStyleHandler:Us,rotationWithSnapping:qs,scaleCursorStyleHandler:Zs,scaleOrSkewActionName:ui,scaleSkewCursorStyleHandler:di,scalingEqually:ei,scalingX:si,scalingXOrSkewingY:gi,scalingY:ii,scalingYOrSkewingX:fi,skewCursorStyleHandler:oi,skewHandlerX:hi,skewHandlerY:li,wrapWithFireEvent:Ws,wrapWithFixedAnchor:Vs});const Vo=t=>void 0!==t.webgl,Go="precision highp float",zo=`\n ${Go};\n varying vec2 vTexCoord;\n uniform sampler2D uTexture;\n void main() {\n gl_FragColor = texture2D(uTexture, vTexCoord);\n }`,Ho=new RegExp(Go,"g");class No{get type(){return this.constructor.type}constructor(){let{type:t,...e}=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};Object.assign(this,this.constructor.defaults,e)}getFragmentSource(){return zo}getVertexSource(){return"\n attribute vec2 aPosition;\n varying vec2 vTexCoord;\n void main() {\n vTexCoord = aPosition;\n gl_Position = vec4(aPosition * 2.0 - 1.0, 0.0, 1.0);\n }"}createProgram(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:this.getFragmentSource(),s=arguments.length>2&&void 0!==arguments[2]?arguments[2]:this.getVertexSource();const{WebGLProbe:{GLPrecision:i="highp"}}=u();"highp"!==i&&(e=e.replace(Ho,Go.replace("highp",i)));const r=t.createShader(t.VERTEX_SHADER),o=t.createShader(t.FRAGMENT_SHADER),a=t.createProgram();if(!r||!o||!a)throw new n("Vertex, fragment shader or program creation error");if(t.shaderSource(r,s),t.compileShader(r),!t.getShaderParameter(r,t.COMPILE_STATUS))throw new n(`Vertex shader compile error for ${this.type}: ${t.getShaderInfoLog(r)}`);if(t.shaderSource(o,e),t.compileShader(o),!t.getShaderParameter(o,t.COMPILE_STATUS))throw new n(`Fragment shader compile error for ${this.type}: ${t.getShaderInfoLog(o)}`);if(t.attachShader(a,r),t.attachShader(a,o),t.linkProgram(a),!t.getProgramParameter(a,t.LINK_STATUS))throw new n(`Shader link error for "${this.type}" ${t.getProgramInfoLog(a)}`);const h=this.getUniformLocations(t,a)||{};return h.uStepW=t.getUniformLocation(a,"uStepW"),h.uStepH=t.getUniformLocation(a,"uStepH"),{program:a,attributeLocations:this.getAttributeLocations(t,a),uniformLocations:h}}getAttributeLocations(t,e){return{aPosition:t.getAttribLocation(e,"aPosition")}}getUniformLocations(t,e){const s=this.constructor.uniformLocations,i={};for(let r=0;r1){const s=t.destinationWidth,i=t.destinationHeight;t.sourceWidth===s&&t.sourceHeight===i||(e.deleteTexture(t.targetTexture),t.targetTexture=t.filterBackend.createTexture(e,s,i)),e.framebufferTexture2D(e.FRAMEBUFFER,e.COLOR_ATTACHMENT0,e.TEXTURE_2D,t.targetTexture,0)}else e.bindFramebuffer(e.FRAMEBUFFER,null),e.finish()}_swapTextures(t){t.passes--,t.pass++;const e=t.targetTexture;t.targetTexture=t.sourceTexture,t.sourceTexture=e}isNeutralState(t){return!1}applyTo(t){Vo(t)?(this._setupFrameBuffer(t),this.applyToWebGL(t),this._swapTextures(t)):this.applyTo2d(t)}applyTo2d(t){}getCacheKey(){return this.type}retrieveShader(t){const e=this.getCacheKey();return t.programCache[e]||(t.programCache[e]=this.createProgram(t.context)),t.programCache[e]}applyToWebGL(t){const e=t.context,s=this.retrieveShader(t);0===t.pass&&t.originalTexture?e.bindTexture(e.TEXTURE_2D,t.originalTexture):e.bindTexture(e.TEXTURE_2D,t.sourceTexture),e.useProgram(s.program),this.sendAttributeData(e,s.attributeLocations,t.aPosition),e.uniform1f(s.uniformLocations.uStepW,1/t.sourceWidth),e.uniform1f(s.uniformLocations.uStepH,1/t.sourceHeight),this.sendUniformData(e,s.uniformLocations),e.viewport(0,0,t.destinationWidth,t.destinationHeight),e.drawArrays(e.TRIANGLE_STRIP,0,4)}bindAdditionalTexture(t,e,s){t.activeTexture(s),t.bindTexture(t.TEXTURE_2D,e),t.activeTexture(t.TEXTURE0)}unbindAdditionalTexture(t,e){t.activeTexture(e),t.bindTexture(t.TEXTURE_2D,null),t.activeTexture(t.TEXTURE0)}sendUniformData(t,e){}createHelpLayer(t){if(!t.helpLayer){const{sourceWidth:e,sourceHeight:s}=t,i=ft({width:e,height:s});t.helpLayer=i}}toObject(){const t=Object.keys(this.constructor.defaults||{});return{type:this.type,...t.reduce((t,e)=>(t[e]=this[e],t),{})}}toJSON(){return this.toObject()}static async fromObject(t,e){let{type:s,...i}=t;return new this(i)}}e(No,"type","BaseFilter"),e(No,"uniformLocations",[]);const Uo={multiply:"gl_FragColor.rgb *= uColor.rgb;\n",screen:"gl_FragColor.rgb = 1.0 - (1.0 - gl_FragColor.rgb) * (1.0 - uColor.rgb);\n",add:"gl_FragColor.rgb += uColor.rgb;\n",difference:"gl_FragColor.rgb = abs(gl_FragColor.rgb - uColor.rgb);\n",subtract:"gl_FragColor.rgb -= uColor.rgb;\n",lighten:"gl_FragColor.rgb = max(gl_FragColor.rgb, uColor.rgb);\n",darken:"gl_FragColor.rgb = min(gl_FragColor.rgb, uColor.rgb);\n",exclusion:"gl_FragColor.rgb += uColor.rgb - 2.0 * (uColor.rgb * gl_FragColor.rgb);\n",overlay:"\n if (uColor.r < 0.5) {\n gl_FragColor.r *= 2.0 * uColor.r;\n } else {\n gl_FragColor.r = 1.0 - 2.0 * (1.0 - gl_FragColor.r) * (1.0 - uColor.r);\n }\n if (uColor.g < 0.5) {\n gl_FragColor.g *= 2.0 * uColor.g;\n } else {\n gl_FragColor.g = 1.0 - 2.0 * (1.0 - gl_FragColor.g) * (1.0 - uColor.g);\n }\n if (uColor.b < 0.5) {\n gl_FragColor.b *= 2.0 * uColor.b;\n } else {\n gl_FragColor.b = 1.0 - 2.0 * (1.0 - gl_FragColor.b) * (1.0 - uColor.b);\n }\n ",tint:"\n gl_FragColor.rgb *= (1.0 - uColor.a);\n gl_FragColor.rgb += uColor.rgb;\n "};class qo extends No{getCacheKey(){return`${this.type}_${this.mode}`}getFragmentSource(){return`\n precision highp float;\n uniform sampler2D uTexture;\n uniform vec4 uColor;\n varying vec2 vTexCoord;\n void main() {\n vec4 color = texture2D(uTexture, vTexCoord);\n gl_FragColor = color;\n if (color.a > 0.0) {\n ${Uo[this.mode]}\n }\n }\n `}applyTo2d(t){let{imageData:{data:e}}=t;const s=new Ve(this.color).getSource(),i=this.alpha,r=s[0]*i,n=s[1]*i,o=s[2]*i,a=1-i;for(let t=0;tnew this({...r,image:t}))}}e(Jo,"type","BlendImage"),e(Jo,"defaults",{mode:"multiply",alpha:1}),e(Jo,"uniformLocations",["uTransformMatrix","uImage"]),J.setClass(Jo);class Qo extends No{getFragmentSource(){return"\n precision highp float;\n uniform sampler2D uTexture;\n uniform vec2 uDelta;\n varying vec2 vTexCoord;\n const float nSamples = 15.0;\n vec3 v3offset = vec3(12.9898, 78.233, 151.7182);\n float random(vec3 scale) {\n /* use the fragment position for a different seed per-pixel */\n return fract(sin(dot(gl_FragCoord.xyz, scale)) * 43758.5453);\n }\n void main() {\n vec4 color = vec4(0.0);\n float totalC = 0.0;\n float totalA = 0.0;\n float offset = random(v3offset);\n for (float t = -nSamples; t <= nSamples; t++) {\n float percent = (t + offset - 0.5) / nSamples;\n vec4 sample = texture2D(uTexture, vTexCoord + uDelta * percent);\n float weight = 1.0 - abs(percent);\n float alpha = weight * sample.a;\n color.rgb += sample.rgb * alpha;\n color.a += alpha;\n totalA += weight;\n totalC += alpha;\n }\n gl_FragColor.rgb = color.rgb / totalC;\n gl_FragColor.a = color.a / totalA;\n }\n "}applyTo(t){Vo(t)?(this.aspectRatio=t.sourceWidth/t.sourceHeight,t.passes++,this._setupFrameBuffer(t),this.horizontal=!0,this.applyToWebGL(t),this._swapTextures(t),this._setupFrameBuffer(t),this.horizontal=!1,this.applyToWebGL(t),this._swapTextures(t)):this.applyTo2d(t)}applyTo2d(t){let{imageData:{data:e,width:s,height:i}}=t;this.aspectRatio=s/i,this.horizontal=!0;let r=this.getBlurValue()*s;const n=new Uint8ClampedArray(e),o=15,a=4*s;for(let t=0;td&&(p=d);const m=e[p+3]*f;s+=e[p]*m,i+=e[p+1]*m,h+=e[p+2]*m,l+=m,c+=f}n[t]=s/l,n[t+1]=i/l,n[t+2]=h/l,n[t+3]=l/c}this.horizontal=!1,r=this.getBlurValue()*i;for(let t=0;td&&(m=d);const v=n[m+3]*p;s+=n[m]*v,i+=n[m+1]*v,h+=n[m+2]*v,l+=v,c+=p}e[t]=s/l,e[t+1]=i/l,e[t+2]=h/l,e[t+3]=l/c}}sendUniformData(t,e){const s=this.chooseRightDelta();t.uniform2fv(e.uDelta,s)}isNeutralState(){return 0===this.blur}getBlurValue(){let t=1;const{horizontal:e,aspectRatio:s}=this;return e?s>1&&(t=1/s):s<1&&(t=s),t*this.blur*.12}chooseRightDelta(){const t=this.getBlurValue();return this.horizontal?[t,0]:[0,t]}}e(Qo,"type","Blur"),e(Qo,"defaults",{blur:0}),e(Qo,"uniformLocations",["uDelta"]),J.setClass(Qo);class Zo extends No{getFragmentSource(){return"\n precision highp float;\n uniform sampler2D uTexture;\n uniform float uBrightness;\n varying vec2 vTexCoord;\n void main() {\n vec4 color = texture2D(uTexture, vTexCoord);\n color.rgb += uBrightness;\n gl_FragColor = color;\n }\n"}applyTo2d(t){let{imageData:{data:e}}=t;const s=Math.round(255*this.brightness);for(let t=0;t0&&void 0!==arguments[0]?arguments[0]:{};super(t),this.subFilters=t.subFilters||[]}applyTo(t){Vo(t)&&(t.passes+=this.subFilters.length-1),this.subFilters.forEach(e=>{e.applyTo(t)})}toObject(){return{type:this.type,subFilters:this.subFilters.map(t=>t.toObject())}}isNeutralState(){return!this.subFilters.some(t=>!t.isNeutralState())}static fromObject(t,e){return Promise.all((t.subFilters||[]).map(t=>J.getClass(t.type).fromObject(t,e))).then(t=>new this({subFilters:t}))}}e(ca,"type","Composed"),J.setClass(ca);class ua extends No{getFragmentSource(){return"\n precision highp float;\n uniform sampler2D uTexture;\n uniform float uContrast;\n varying vec2 vTexCoord;\n void main() {\n vec4 color = texture2D(uTexture, vTexCoord);\n float contrastF = 1.015 * (uContrast + 1.0) / (1.0 * (1.015 - uContrast));\n color.rgb = contrastF * (color.rgb - 0.5) + 0.5;\n gl_FragColor = color;\n }"}isNeutralState(){return 0===this.contrast}applyTo2d(t){let{imageData:{data:e}}=t;const s=Math.floor(255*this.contrast),i=259*(s+255)/(255*(259-s));for(let t=0;t=a||m<0||m>=o||(y=4*(v*o+m),_=i[S*r+b],u+=s[y]*_,d+=s[y+1]*_,g+=s[y+2]*_,c||(f+=s[y+3]*_));l[p]=u,l[p+1]=d,l[p+2]=g,l[p+3]=c?s[p+3]:f}t.imageData=h}sendUniformData(t,e){t.uniform1fv(e.uMatrix,this.matrix)}toObject(){return{...super.toObject(),opaque:this.opaque,matrix:[...this.matrix]}}}e(ga,"type","Convolute"),e(ga,"defaults",{opaque:!1,matrix:[0,0,0,0,1,0,0,0,0]}),e(ga,"uniformLocations",["uMatrix","uOpaque","uHalfSize","uSize"]),J.setClass(ga);const fa="Gamma";class pa extends No{getFragmentSource(){return"\n precision highp float;\n uniform sampler2D uTexture;\n uniform vec3 uGamma;\n varying vec2 vTexCoord;\n void main() {\n vec4 color = texture2D(uTexture, vTexCoord);\n vec3 correction = (1.0 / uGamma);\n color.r = pow(color.r, correction.r);\n color.g = pow(color.g, correction.g);\n color.b = pow(color.b, correction.b);\n gl_FragColor = color;\n gl_FragColor.rgb *= color.a;\n }\n"}constructor(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};super(t),this.gamma=t.gamma||this.constructor.defaults.gamma.concat()}applyTo2d(t){let{imageData:{data:e}}=t;const s=this.gamma,i=1/s[0],r=1/s[1],n=1/s[2];this.rgbValues||(this.rgbValues={r:new Uint8Array(256),g:new Uint8Array(256),b:new Uint8Array(256)});const o=this.rgbValues;for(let t=0;t<256;t++)o.r[t]=255*Math.pow(t/255,i),o.g[t]=255*Math.pow(t/255,r),o.b[t]=255*Math.pow(t/255,n);for(let t=0;tr[0]&&i>r[1]&&o>r[2]&&s`\n color += texture2D(uTexture, vTexCoord + ${t}) * uTaps[${e}] + texture2D(uTexture, vTexCoord - ${t}) * uTaps[${e}];\n sum += 2.0 * uTaps[${e}];\n `).join("\n")}\n gl_FragColor = color / sum;\n }\n `}applyToForWebgl(t){t.passes++,this.width=t.sourceWidth,this.horizontal=!0,this.dW=Math.round(this.width*this.scaleX),this.dH=t.sourceHeight,this.tempScale=this.dW/this.width,this.taps=this.getTaps(),t.destinationWidth=this.dW,super.applyTo(t),t.sourceWidth=t.destinationWidth,this.height=t.sourceHeight,this.horizontal=!1,this.dH=Math.round(this.height*this.scaleY),this.tempScale=this.dH/this.height,this.taps=this.getTaps(),t.destinationHeight=this.dH,super.applyTo(t),t.sourceHeight=t.destinationHeight}applyTo(t){Vo(t)?this.applyToForWebgl(t):this.applyTo2d(t)}isNeutralState(){return 1===this.scaleX&&1===this.scaleY}lanczosCreate(t){return e=>{if(e>=t||e<=-t)return 0;if(e<1.1920929e-7&&e>-1.1920929e-7)return 1;const s=(e*=Math.PI)/t;return Math.sin(e)/e*Math.sin(s)/s}}applyTo2d(t){const e=t.imageData,s=this.scaleX,i=this.scaleY;this.rcpScaleX=1/s,this.rcpScaleY=1/i;const r=e.width,n=e.height,o=Math.round(r*s),a=Math.round(n*i);let h;h="sliceHack"===this.resizeType?this.sliceByTwo(t,r,n,o,a):"hermite"===this.resizeType?this.hermiteFastResize(t,r,n,o,a):"bilinear"===this.resizeType?this.bilinearFiltering(t,r,n,o,a):"lanczos"===this.resizeType?this.lanczosResize(t,r,n,o,a):new ImageData(o,a),t.imageData=h}sliceByTwo(t,e,s,i,r){const n=t.imageData,o=.5;let a=!1,h=!1,l=e*o,c=s*o;const u=t.filterBackend.resources;let d=0,g=0;const f=e;let p=0;u.sliceByTwo||(u.sliceByTwo=dt());const m=u.sliceByTwo;(m.width<1.5*e||m.height=e)){D=Math.floor(1e3*Math.abs(x-m.x)),p[D]||(p[D]={});for(let t=v.y-f;t<=v.y+f;t++)t<0||t>=s||(M=Math.floor(1e3*Math.abs(t-m.y)),p[D][M]||(p[D][M]=h(Math.sqrt(Math.pow(D*u,2)+Math.pow(M*d,2))/1e3)),C=p[D][M],C>0&&(b=4*(t*e+x),S+=C,w+=C*n[b],T+=C*n[b+1],O+=C*n[b+2],k+=C*n[b+3]))}b=4*(_*i+y),a[b]=w/S,a[b+1]=T/S,a[b+2]=O/S,a[b+3]=k/S}return++y1&&n<-1||(c=2*n*n*n-3*n*n+1,c>0&&(s=4*(t+i*e),v+=c*l[s+3],g+=c,l[s+3]<255&&(c=c*l[s+3]/250),f+=c*l[s],p+=c*l[s+1],m+=c*l[s+2],d+=c))}}u[r]=f/d,u[r+1]=p/d,u[r+2]=m/d,u[r+3]=v/g}return c}}e(wa,"type","Resize"),e(wa,"defaults",{resizeType:"hermite",scaleX:1,scaleY:1,lanczosLobes:3}),e(wa,"uniformLocations",["uDelta","uTaps"]),J.setClass(wa);class Ta extends No{getFragmentSource(){return"\n precision highp float;\n uniform sampler2D uTexture;\n uniform float uSaturation;\n varying vec2 vTexCoord;\n void main() {\n vec4 color = texture2D(uTexture, vTexCoord);\n float rgMax = max(color.r, color.g);\n float rgbMax = max(rgMax, color.b);\n color.r += rgbMax != color.r ? (rgbMax - color.r) * uSaturation : 0.00;\n color.g += rgbMax != color.g ? (rgbMax - color.g) * uSaturation : 0.00;\n color.b += rgbMax != color.b ? (rgbMax - color.b) * uSaturation : 0.00;\n gl_FragColor = color;\n }\n"}applyTo2d(t){let{imageData:{data:e}}=t;const s=-this.saturation;for(let t=0;t{const s=ft({width:t,height:e}),i=dt().getContext("webgl"),r={imageBuffer:new ArrayBuffer(t*e*4)},n={destinationWidth:t,destinationHeight:e,targetCanvas:s};let o;o=g().performance.now(),uo.prototype.copyGLTo2D.call(r,i,n);const a=g().performance.now()-o;o=g().performance.now(),uo.prototype.copyGLTo2DPutImageData.call(r,i,n);return a>g().performance.now()-o},t.isWebGLPipelineState=Vo,t.loadSVGFromString=Po,t.loadSVGFromURL=function(t,e){let s=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};return fetch(t.replace(/^\n\s*/,"").trim(),{signal:s.signal}).then(t=>{if(!t.ok)throw new n(`HTTP error! status: ${t.status}`);return t.text()}).then(t=>Po(t,e,s)).catch(()=>({objects:[],elements:[],options:{},allElements:[]}))},t.parseSVGDocument=Mo,t.runningAnimations=Q,t.setEnv=t=>{c=t},t.setFilterBackend=function(t){go=t},t.util=Qr,t.version=m}); //# sourceMappingURL=index.min.js.map diff --git a/dist/index.min.js.map b/dist/index.min.js.map index f721e429639..ec0689ea8e4 100644 --- a/dist/index.min.js.map +++ b/dist/index.min.js.map @@ -1 +1 @@ -{"version":3,"file":"index.min.js","sources":["../src/config.ts","../src/util/internals/console.ts","../src/filters/GLProbes/GLProbe.ts","../src/filters/GLProbes/WebGLProbe.ts","../src/env/browser.ts","../src/env/index.ts","../src/cache.ts","../src/constants.ts","../src/ClassRegistry.ts","../src/util/animation/AnimationRegistry.ts","../src/Observable.ts","../src/util/internals/removeFromArray.ts","../src/util/misc/cos.ts","../src/util/misc/sin.ts","../src/Point.ts","../src/Collection.ts","../src/CommonMethods.ts","../src/util/animation/AnimationFrameProvider.ts","../src/util/internals/uid.ts","../src/util/misc/dom.ts","../src/util/misc/radiansDegreesConversion.ts","../src/util/misc/matrix.ts","../src/util/misc/objectEnlive.ts","../src/util/misc/pick.ts","../src/util/misc/toFixed.ts","../src/util/misc/svgExport.ts","../src/util/typeAssertions.ts","../src/util/dom_misc.ts","../src/canvas/DOMManagers/util.ts","../src/canvas/DOMManagers/StaticCanvasDOMManager.ts","../src/canvas/StaticCanvasOptions.ts","../src/canvas/StaticCanvas.ts","../src/util/dom_event.ts","../src/util/misc/boundingBoxFromPoints.ts","../src/util/misc/objectTransforms.ts","../src/util/misc/planeChange.ts","../src/controls/fireEvent.ts","../src/util/misc/resolveOrigin.ts","../src/util/misc/vectors.ts","../src/controls/util.ts","../src/controls/drag.ts","../src/color/color_map.ts","../src/color/util.ts","../src/color/Color.ts","../src/color/constants.ts","../src/util/misc/svgParsing.ts","../src/shapes/Object/FabricObjectSVGExportMixin.ts","../src/parser/getSvgRegex.ts","../src/shapes/Text/constants.ts","../src/parser/constants.ts","../src/Shadow.ts","../src/util/misc/capValue.ts","../src/shapes/Object/defaultValues.ts","../src/util/animation/easing.ts","../src/util/animation/AnimationBase.ts","../src/util/animation/ValueAnimation.ts","../src/util/animation/ArrayAnimation.ts","../src/util/animation/ColorAnimation.ts","../src/util/animation/animate.ts","../src/Intersection.ts","../src/shapes/Object/ObjectGeometry.ts","../src/shapes/Object/Object.ts","../src/controls/wrapWithFireEvent.ts","../src/controls/wrapWithFixedAnchor.ts","../src/controls/changeWidth.ts","../src/controls/controlRendering.ts","../src/controls/Control.ts","../src/controls/rotate.ts","../src/controls/scale.ts","../src/controls/skew.ts","../src/controls/scaleSkew.ts","../src/controls/commonControls.ts","../src/shapes/Object/InteractiveObject.ts","../src/util/applyMixins.ts","../src/shapes/Object/FabricObject.ts","../src/util/misc/isTransparent.ts","../src/util/misc/projectStroke/StrokeProjectionsBase.ts","../src/util/misc/projectStroke/StrokeLineJoinProjections.ts","../src/util/misc/projectStroke/StrokeLineCapProjections.ts","../src/util/misc/projectStroke/index.ts","../src/util/internals/findRight.ts","../src/util/internals/cloneStyles.ts","../src/util/lang_string.ts","../src/util/misc/textStyles.ts","../src/parser/attributes.ts","../src/parser/selectorMatches.ts","../src/parser/elementMatchesRule.ts","../src/parser/doesSomeParentMatch.ts","../src/parser/getGlobalStylesForElement.ts","../src/parser/normalizeAttr.ts","../src/util/internals/cleanupSvgAttribute.ts","../src/parser/parseTransformAttribute.ts","../src/parser/normalizeValue.ts","../src/parser/parseStyleString.ts","../src/parser/parseStyleAttribute.ts","../src/parser/parseStyleObject.ts","../src/parser/setStrokeFillOpacity.ts","../src/parser/parseAttributes.ts","../src/parser/parseFontDeclaration.ts","../src/shapes/Rect.ts","../src/LayoutManager/constants.ts","../src/LayoutManager/LayoutStrategies/utils.ts","../src/LayoutManager/LayoutStrategies/LayoutStrategy.ts","../src/LayoutManager/LayoutStrategies/FitContentLayout.ts","../src/LayoutManager/LayoutManager.ts","../src/shapes/Group.ts","../src/util/misc/groupSVGElements.ts","../src/util/misc/findScaleTo.ts","../src/util/path/regex.ts","../src/util/path/index.ts","../src/util/internals/getRandomInt.ts","../src/util/transform_matrix_removal.ts","../src/util/misc/mergeClipPaths.ts","../src/util/internals/dom_style.ts","../src/canvas/DOMManagers/CanvasDOMManager.ts","../src/canvas/SelectableCanvas.ts","../src/canvas/CanvasOptions.ts","../src/canvas/TextEditingManager.ts","../src/canvas/Canvas.ts","../src/gradient/constants.ts","../src/util/internals/ifNaN.ts","../src/parser/percent.ts","../src/gradient/parser/parseColorStops.ts","../src/gradient/parser/misc.ts","../src/gradient/parser/parseCoords.ts","../src/gradient/Gradient.ts","../src/Pattern/Pattern.ts","../src/brushes/BaseBrush.ts","../src/shapes/Path.ts","../src/brushes/PencilBrush.ts","../src/shapes/Circle.ts","../src/shapes/Line.ts","../src/shapes/Triangle.ts","../src/shapes/Ellipse.ts","../src/shapes/Polyline.ts","../src/parser/parsePointsAttribute.ts","../src/shapes/Polygon.ts","../src/shapes/Text/StyledText.ts","../src/shapes/Text/TextSVGExportMixin.ts","../src/shapes/Text/Text.ts","../src/shapes/IText/DraggableTextDelegate.ts","../src/shapes/IText/ITextBehavior.ts","../src/shapes/IText/ITextKeyBehavior.ts","../src/shapes/IText/ITextClickBehavior.ts","../src/shapes/IText/constants.ts","../src/util/internals/applyCanvasTransform.ts","../src/shapes/IText/IText.ts","../src/shapes/Textbox.ts","../src/LayoutManager/LayoutStrategies/ClipPathLayout.ts","../src/LayoutManager/LayoutStrategies/FixedLayout.ts","../src/LayoutManager/ActiveSelectionLayoutManager.ts","../src/shapes/ActiveSelection.ts","../src/filters/Canvas2dFilterBackend.ts","../src/filters/WebGLFilterBackend.ts","../src/filters/FilterBackend.ts","../src/shapes/Image.ts","../src/parser/applyViewboxTransform.ts","../src/parser/getTagName.ts","../src/parser/hasInvalidAncestor.ts","../src/parser/getMultipleNodes.ts","../src/parser/recursivelyParseGradientsXlink.ts","../src/parser/getGradientDefs.ts","../src/parser/elements_parser.ts","../src/parser/getCSSRules.ts","../src/parser/parseSVGDocument.ts","../src/parser/parseUseDirectives.ts","../src/parser/loadSVGFromString.ts","../src/controls/polyControl.ts","../src/controls/pathControl.ts","../src/filters/utils.ts","../src/filters/shaders/baseFilter.ts","../src/filters/BaseFilter.ts","../src/filters/shaders/blendColor.ts","../src/filters/BlendColor.ts","../src/filters/shaders/blendImage.ts","../src/filters/BlendImage.ts","../src/filters/Blur.ts","../src/filters/shaders/blur.ts","../src/filters/Brightness.ts","../src/filters/shaders/brightness.ts","../src/filters/shaders/colorMatrix.ts","../src/filters/ColorMatrix.ts","../src/filters/ColorMatrixFilters.ts","../src/filters/Composed.ts","../src/filters/Contrast.ts","../src/filters/shaders/constrast.ts","../src/filters/shaders/convolute.ts","../src/filters/Convolute.ts","../src/filters/shaders/gamma.ts","../src/filters/Gamma.ts","../src/filters/shaders/grayscale.ts","../src/filters/Grayscale.ts","../src/filters/HueRotation.ts","../src/filters/Invert.ts","../src/filters/shaders/invert.ts","../src/filters/Noise.ts","../src/filters/shaders/noise.ts","../src/filters/Pixelate.ts","../src/filters/shaders/pixelate.ts","../src/filters/RemoveColor.ts","../src/filters/shaders/removeColor.ts","../src/filters/Resize.ts","../src/filters/Saturation.ts","../src/filters/shaders/saturation.ts","../src/filters/Vibrance.ts","../src/filters/shaders/vibrance.ts","../src/brushes/CircleBrush.ts","../src/brushes/PatternBrush.ts","../src/brushes/SprayBrush.ts","../src/parser/loadSVGFromURL.ts"],"sourcesContent":["export type TConfiguration = Partial;\n\nclass BaseConfiguration {\n /**\n * Browser-specific constant to adjust CanvasRenderingContext2D.shadowBlur value,\n * which is unitless and not rendered equally across browsers.\n *\n * Values that work quite well (as of October 2017) are:\n * - Chrome: 1.5\n * - Edge: 1.75\n * - Firefox: 0.9\n * - Safari: 0.95\n *\n * @since 2.0.0\n * @type Number\n * @default 1\n */\n browserShadowBlurConstant = 1;\n\n /**\n * Pixel per Inch as a default value set to 96. Can be changed for more realistic conversion.\n */\n DPI = 96;\n\n /**\n * Device Pixel Ratio\n * @see https://developer.apple.com/library/safari/documentation/AudioVideo/Conceptual/HTML-canvas-guide/SettingUptheCanvas/SettingUptheCanvas.html\n */\n devicePixelRatio =\n typeof window !== 'undefined' ? window.devicePixelRatio : 1; // eslint-disable-line no-restricted-globals\n\n /**\n * Pixel limit for cache canvases. 1Mpx , 4Mpx should be fine.\n * @since 1.7.14\n * @type Number\n */\n perfLimitSizeTotal = 2097152;\n\n /**\n * Pixel limit for cache canvases width or height. IE fixes the maximum at 5000\n * @since 1.7.14\n * @type Number\n */\n maxCacheSideLimit = 4096;\n\n /**\n * Lowest pixel limit for cache canvases, set at 256PX\n * @since 1.7.14\n * @type Number\n */\n minCacheSideLimit = 256;\n\n /**\n * When 'true', style information is not retained when copy/pasting text, making\n * pasted text use destination style.\n * Defaults to 'false'.\n * @type Boolean\n * @deprecated\n */\n disableStyleCopyPaste = false;\n\n /**\n * Enable webgl for filtering picture is available\n * A filtering backend will be initialized, this will both take memory and\n * time since a default 2048x2048 canvas will be created for the gl context\n * @since 2.0.0\n * @type Boolean\n */\n enableGLFiltering = true;\n\n /**\n * if webgl is enabled and available, textureSize will determine the size\n * of the canvas backend\n *\n * In order to support old hardware set to `2048` to avoid OOM\n *\n * @since 2.0.0\n * @type Number\n */\n textureSize = 4096;\n\n /**\n * Skip performance testing of setupGLContext and force the use of putImageData that seems to be the one that works best on\n * Chrome + old hardware. if your users are experiencing empty images after filtering you may try to force this to true\n * this has to be set before instantiating the filtering backend ( before filtering the first image )\n * @type Boolean\n * @default false\n */\n forceGLPutImageData = false;\n\n /**\n * If disabled boundsOfCurveCache is not used. For apps that make heavy usage of pencil drawing probably disabling it is better\n * With the standard behaviour of fabric to translate all curves in absolute commands and by not subtracting the starting point from\n * the curve is very hard to hit any cache.\n * Enable only if you know why it could be useful.\n * Candidate for removal/simplification\n * @default false\n */\n cachesBoundsOfCurve = false;\n\n /**\n * Map of font files\n * Map of font files\n */\n fontPaths: Record = {};\n\n /**\n * Defines the number of fraction digits to use when serializing object values.\n * Used in exporting methods (`toObject`, `toJSON`, `toSVG`)\n * You can use it to increase/decrease precision of such values like left, top, scaleX, scaleY, etc.\n */\n NUM_FRACTION_DIGITS = 4;\n}\n\nexport class Configuration extends BaseConfiguration {\n constructor(config?: TConfiguration) {\n super();\n this.configure(config);\n }\n\n configure(config: TConfiguration = {}) {\n Object.assign(this, config);\n }\n\n /**\n * Map of font files\n */\n addFonts(\n paths: Record = {},\n ) {\n this.fontPaths = {\n ...this.fontPaths,\n ...paths,\n };\n }\n\n removeFonts(fontFamilys: string[] = []) {\n fontFamilys.forEach((fontFamily) => {\n delete this.fontPaths[fontFamily];\n });\n }\n\n clearFonts() {\n this.fontPaths = {};\n }\n\n restoreDefaults(keys?: (keyof T)[]) {\n const defaults = new BaseConfiguration() as T;\n const config =\n keys?.reduce((acc, key) => {\n acc[key] = defaults[key];\n return acc;\n }, {} as T) || defaults;\n this.configure(config);\n }\n}\n\nexport const config = new Configuration();\n","export const log = (\n severity: 'log' | 'warn' | 'error',\n ...optionalParams: any[]\n) =>\n // eslint-disable-next-line no-restricted-syntax\n console[severity]('fabric', ...optionalParams);\n\nexport class FabricError extends Error {\n constructor(message?: string, options?: ErrorOptions) {\n super(`fabric: ${message}`, options);\n }\n}\n\nexport class SignalAbortedError extends FabricError {\n constructor(context: string) {\n super(`${context} 'options.signal' is in 'aborted' state`);\n }\n}\n","export type GLPrecision = 'lowp' | 'mediump' | 'highp';\n\nexport abstract class GLProbe {\n declare GLPrecision: GLPrecision | undefined;\n abstract queryWebGL(canvas: HTMLCanvasElement): void;\n abstract isSupported(textureSize: number): boolean;\n}\n","import { log } from '../../util/internals/console';\nimport { GLProbe } from './GLProbe';\nimport type { GLPrecision } from './GLProbe';\n\n/**\n * Lazy initialize WebGL constants\n */\nexport class WebGLProbe extends GLProbe {\n declare maxTextureSize?: number;\n\n /**\n * Tests if webgl supports certain precision\n * @param {WebGL} Canvas WebGL context to test on\n * @param {GLPrecision} Precision to test can be any of following\n * @returns {Boolean} Whether the user's browser WebGL supports given precision.\n */\n private testPrecision(\n gl: WebGLRenderingContext,\n precision: GLPrecision,\n ): boolean {\n const fragmentSource = `precision ${precision} float;\\nvoid main(){}`;\n const fragmentShader = gl.createShader(gl.FRAGMENT_SHADER);\n if (!fragmentShader) {\n return false;\n }\n gl.shaderSource(fragmentShader, fragmentSource);\n gl.compileShader(fragmentShader);\n return !!gl.getShaderParameter(fragmentShader, gl.COMPILE_STATUS);\n }\n\n /**\n * query browser for WebGL\n */\n queryWebGL(canvas: HTMLCanvasElement) {\n const gl = canvas.getContext('webgl');\n if (gl) {\n this.maxTextureSize = gl.getParameter(gl.MAX_TEXTURE_SIZE);\n this.GLPrecision = (['highp', 'mediump', 'lowp'] as const).find(\n (precision) => this.testPrecision(gl, precision),\n );\n gl.getExtension('WEBGL_lose_context')!.loseContext();\n log('log', `WebGL: max texture size ${this.maxTextureSize}`);\n }\n }\n\n isSupported(textureSize: number) {\n return !!this.maxTextureSize && this.maxTextureSize >= textureSize;\n }\n}\n","/* eslint-disable no-restricted-globals */\nimport { WebGLProbe } from '../filters/GLProbes/WebGLProbe';\nimport type { TCopyPasteData, TFabricEnv } from './types';\n\nconst copyPasteData: TCopyPasteData = {};\n\nexport const getEnv = (): TFabricEnv => {\n return {\n document,\n window,\n isTouchSupported:\n 'ontouchstart' in window ||\n 'ontouchstart' in document ||\n (window && window.navigator && window.navigator.maxTouchPoints > 0),\n WebGLProbe: new WebGLProbe(),\n dispose() {\n // noop\n },\n copyPasteData,\n };\n};\n","/**\n * This file is consumed by fabric.\n * The `./node` and `./browser` files define the env variable that is used by this module.\n * The `./browser` module is defined to be the default env and doesn't set the env at all.\n * This is done in order to support isomorphic usage for browser and node applications\n * since window and document aren't defined at time of import in SSR, we can't set env so we avoid it by deferring to the default env.\n */\n\nimport { config } from '../config';\nimport { getEnv as getBrowserEnv } from './browser';\nimport type { TFabricEnv } from './types';\nimport type { DOMWindow } from 'jsdom';\n\nlet env: TFabricEnv;\n\n/**\n * Sets the environment variables used by fabric.\\\n * This is exposed for special cases, such as configuring a test environment, and should be used with care.\n *\n * **CAUTION**: Must be called before using the package.\n *\n * @example\n * Passing `window` and `document` objects to fabric (in case they are mocked or something)\n * import { getEnv, setEnv } from 'fabric';\n * // we want fabric to use the `window` and `document` objects exposed by the environment we are running in.\n * setEnv({ ...getEnv(), window, document });\n * // done with setup, using fabric is now safe\n */\nexport const setEnv = (value: TFabricEnv) => {\n env = value;\n};\n\n/**\n * In order to support SSR we **MUST** access the browser env only after the window has loaded\n */\nexport const getEnv = () => env || (env = getBrowserEnv());\n\nexport const getFabricDocument = (): Document => getEnv().document;\n\nexport const getFabricWindow = (): (Window & typeof globalThis) | DOMWindow =>\n getEnv().window;\n\n/**\n * @returns the config value if defined, fallbacks to the environment value\n */\nexport const getDevicePixelRatio = () =>\n Math.max(config.devicePixelRatio ?? getFabricWindow().devicePixelRatio, 1);\n","import { config } from './config';\nimport type { TRectBounds } from './typedefs';\n\nexport class Cache {\n /**\n * Cache of widths of chars in text rendering.\n */\n charWidthsCache: Record<\n /** fontFamily */ string,\n Record<\n /** fontStyleCacheKey */ string,\n Record\n >\n > = {};\n\n /**\n * @return {Object} reference to cache\n */\n getFontCache({\n fontFamily,\n fontStyle,\n fontWeight,\n }: {\n fontFamily: string;\n fontStyle: string;\n fontWeight: string | number;\n }) {\n fontFamily = fontFamily.toLowerCase();\n if (!this.charWidthsCache[fontFamily]) {\n this.charWidthsCache[fontFamily] = {};\n }\n const fontCache = this.charWidthsCache[fontFamily];\n const cacheKey = `${fontStyle.toLowerCase()}_${(\n fontWeight + ''\n ).toLowerCase()}`;\n if (!fontCache[cacheKey]) {\n fontCache[cacheKey] = {};\n }\n return fontCache[cacheKey];\n }\n\n /**\n * Clear char widths cache for the given font family or all the cache if no\n * fontFamily is specified.\n * Use it if you know you are loading fonts in a lazy way and you are not waiting\n * for custom fonts to load properly when adding text objects to the canvas.\n * If a text object is added when its own font is not loaded yet, you will get wrong\n * measurement and so wrong bounding boxes.\n * After the font cache is cleared, either change the textObject text content or call\n * initDimensions() to trigger a recalculation\n * @param {String} [fontFamily] font family to clear\n */\n clearFontCache(fontFamily?: string) {\n fontFamily = (fontFamily || '').toLowerCase();\n if (!fontFamily) {\n this.charWidthsCache = {};\n } else if (this.charWidthsCache[fontFamily]) {\n delete this.charWidthsCache[fontFamily];\n }\n }\n\n /**\n * Given current aspect ratio, determines the max width and height that can\n * respect the total allowed area for the cache.\n * @param {number} ar aspect ratio\n * @return {number[]} Limited dimensions X and Y\n */\n limitDimsByArea(ar: number) {\n const { perfLimitSizeTotal } = config;\n const roughWidth = Math.sqrt(perfLimitSizeTotal * ar);\n // we are not returning a point on purpose, to avoid circular dependencies\n // this is an internal utility\n return [\n Math.floor(roughWidth),\n Math.floor(perfLimitSizeTotal / roughWidth),\n ];\n }\n\n /**\n * This object keeps the results of the boundsOfCurve calculation mapped by the joined arguments necessary to calculate it.\n * It does speed up calculation, if you parse and add always the same paths, but in case of heavy usage of freedrawing\n * you do not get any speed benefit and you get a big object in memory.\n * The object was a private variable before, while now is appended to the lib so that you have access to it and you\n * can eventually clear it.\n * It was an internal variable, is accessible since version 2.3.4\n */\n boundsOfCurveCache: Record = {};\n}\n\nexport const cache = new Cache();\n","import type { TMat2D } from './typedefs';\n// use this syntax so babel plugin see this import here\nimport { version } from '../package.json';\n\nexport const VERSION = version;\n// eslint-disable-next-line @typescript-eslint/no-empty-function\nexport function noop() {}\n\nexport const halfPI = Math.PI / 2;\nexport const quarterPI = Math.PI / 4;\nexport const twoMathPi = Math.PI * 2;\nexport const PiBy180 = Math.PI / 180;\n\nexport const iMatrix = Object.freeze([1, 0, 0, 1, 0, 0]) as TMat2D;\nexport const DEFAULT_SVG_FONT_SIZE = 16;\nexport const ALIASING_LIMIT = 2;\n\n/* \"magic number\" for bezier approximations of arcs (http://itc.ktu.lt/itc354/Riskus354.pdf) */\nexport const kRect = 1 - 0.5522847498;\n\nexport const CENTER = 'center';\nexport const LEFT = 'left';\nexport const TOP = 'top';\nexport const BOTTOM = 'bottom';\nexport const RIGHT = 'right';\nexport const NONE = 'none';\n\nexport const reNewline = /\\r?\\n/;\n\nexport const MOVING = 'moving';\nexport const SCALING = 'scaling';\nexport const ROTATING = 'rotating';\nexport const ROTATE = 'rotate';\nexport const SKEWING = 'skewing';\nexport const RESIZING = 'resizing';\nexport const MODIFY_POLY = 'modifyPoly';\nexport const MODIFY_PATH = 'modifyPath';\nexport const CHANGED = 'changed';\nexport const SCALE = 'scale';\nexport const SCALE_X = 'scaleX';\nexport const SCALE_Y = 'scaleY';\nexport const SKEW_X = 'skewX';\nexport const SKEW_Y = 'skewY';\nexport const FILL = 'fill';\nexport const STROKE = 'stroke';\nexport const MODIFIED = 'modified';\n","import { FabricError } from './util/internals/console';\n\n/*\n * This Map connects the objects type value with their\n * class implementation. It used from any object to understand which are\n * the classes to enlive when requesting a object.type = 'path' for example.\n * Objects uses it for clipPath, Canvas uses it for everything.\n * This is necessary for generic code to run and enlive instances from serialized representation.\n * You can customize which classes get enlived from SVG parsing using this classRegistry.\n * The Registry start empty and gets filled in depending which files you import.\n * If you want to be able to parse arbitrary SVGs or JSON representation of canvases, coming from\n * different sources you will need to import all fabric because you may need all classes.\n */\n\nexport const JSON = 'json';\nexport const SVG = 'svg';\n\nexport class ClassRegistry {\n declare [JSON]: Map;\n declare [SVG]: Map;\n\n constructor() {\n this[JSON] = new Map();\n this[SVG] = new Map();\n }\n\n has(classType: string): boolean {\n return this[JSON].has(classType);\n }\n\n getClass(classType: string): T {\n const constructor = this[JSON].get(classType);\n if (!constructor) {\n throw new FabricError(`No class registered for ${classType}`);\n }\n return constructor;\n }\n\n setClass(classConstructor: any, classType?: string) {\n if (classType) {\n this[JSON].set(classType, classConstructor);\n } else {\n this[JSON].set(classConstructor.type, classConstructor);\n // legacy\n // @TODO: needs to be removed in fabric 7 or 8\n this[JSON].set(classConstructor.type.toLowerCase(), classConstructor);\n }\n }\n\n getSVGClass(SVGTagName: string): any {\n return this[SVG].get(SVGTagName);\n }\n\n setSVGClass(classConstructor: any, SVGTagName?: string) {\n this[SVG].set(\n SVGTagName ?? classConstructor.type.toLowerCase(),\n classConstructor,\n );\n }\n}\n\nexport const classRegistry = new ClassRegistry();\n","import type { StaticCanvas } from '../../canvas/StaticCanvas';\nimport type { FabricObject } from '../../shapes/Object/FabricObject';\nimport type { AnimationBase } from './AnimationBase';\n\n/**\n * Array holding all running animations\n */\nclass AnimationRegistry extends Array {\n /**\n * Remove a single animation using an animation context\n * @param {AnimationBase} context\n */\n remove(context: AnimationBase) {\n const index = this.indexOf(context);\n index > -1 && this.splice(index, 1);\n }\n\n /**\n * Cancel all running animations on the next frame\n */\n cancelAll() {\n const animations = this.splice(0);\n animations.forEach((animation) => animation.abort());\n return animations;\n }\n\n /**\n * Cancel all running animations attached to a canvas on the next frame\n * @param {StaticCanvas} canvas\n */\n cancelByCanvas(canvas: StaticCanvas) {\n if (!canvas) {\n return [];\n }\n const animations = this.filter(\n (animation) =>\n animation.target === canvas ||\n (typeof animation.target === 'object' &&\n (animation.target as FabricObject)?.canvas === canvas),\n );\n animations.forEach((animation) => animation.abort());\n return animations;\n }\n\n /**\n * Cancel all running animations for target on the next frame\n * @param target\n */\n cancelByTarget(target: AnimationBase['target']) {\n if (!target) {\n return [];\n }\n const animations = this.filter((animation) => animation.target === target);\n animations.forEach((animation) => animation.abort());\n return animations;\n }\n}\n\nexport const runningAnimations = new AnimationRegistry();\n","export type TEventCallback = (options: T) => any;\n\ntype EventRegistryObject = {\n [K in keyof E]?: TEventCallback;\n};\n\n/**\n * @tutorial {@link http://fabricjs.com/fabric-intro-part-2#events}\n * @see {@link http://fabricjs.com/events|Events demo}\n */\nexport class Observable {\n private __eventListeners: Record =\n {} as Record;\n\n /**\n * Observes specified event\n * @alias on\n * @param {string} eventName Event name (eg. 'after:render')\n * @param {EventRegistryObject} handlers key/value pairs (eg. {'after:render': handler, 'selection:cleared': handler})\n * @param {Function} handler Function that receives a notification when an event of the specified type occurs\n * @return {Function} disposer\n */\n on(\n eventName: K,\n handler: TEventCallback,\n ): VoidFunction;\n on(handlers: EventRegistryObject): VoidFunction;\n on(\n arg0: K | EventRegistryObject,\n handler?: TEventCallback,\n ): VoidFunction {\n if (!this.__eventListeners) {\n this.__eventListeners = {} as Record;\n }\n if (typeof arg0 === 'object') {\n // one object with key/value pairs was passed\n Object.entries(arg0).forEach(([eventName, handler]) => {\n this.on(eventName as K, handler as TEventCallback);\n });\n return () => this.off(arg0);\n } else if (handler) {\n const eventName = arg0;\n if (!this.__eventListeners[eventName]) {\n this.__eventListeners[eventName] = [];\n }\n this.__eventListeners[eventName].push(handler);\n return () => this.off(eventName, handler);\n } else {\n // noop\n return () => false;\n }\n }\n\n /**\n * Observes specified event **once**\n * @alias once\n * @param {string} eventName Event name (eg. 'after:render')\n * @param {EventRegistryObject} handlers key/value pairs (eg. {'after:render': handler, 'selection:cleared': handler})\n * @param {Function} handler Function that receives a notification when an event of the specified type occurs\n * @return {Function} disposer\n */\n once(\n eventName: K,\n handler: TEventCallback,\n ): VoidFunction;\n once(handlers: EventRegistryObject): VoidFunction;\n once(\n arg0: K | EventRegistryObject,\n handler?: TEventCallback,\n ): VoidFunction {\n if (typeof arg0 === 'object') {\n // one object with key/value pairs was passed\n const disposers: VoidFunction[] = [];\n Object.entries(arg0).forEach(([eventName, handler]) => {\n disposers.push(this.once(eventName as K, handler as TEventCallback));\n });\n return () => disposers.forEach((d) => d());\n } else if (handler) {\n const disposer = this.on(\n arg0,\n function onceHandler(this: Observable, ...args) {\n handler.call(this, ...args);\n disposer();\n },\n );\n return disposer;\n } else {\n // noop\n return () => false;\n }\n }\n\n /**\n * @private\n * @param {string} eventName\n * @param {Function} [handler]\n */\n private _removeEventListener(\n eventName: K,\n handler?: TEventCallback,\n ) {\n if (!this.__eventListeners[eventName]) {\n return;\n }\n\n if (handler) {\n const eventListener = this.__eventListeners[eventName];\n const index = eventListener.indexOf(handler);\n index > -1 && eventListener.splice(index, 1);\n } else {\n this.__eventListeners[eventName] = [];\n }\n }\n\n /**\n * Unsubscribe all event listeners for eventname.\n * Do not use this pattern. You could kill internal fabricJS events.\n * We know we should have protected events for internal flows, but we don't have yet\n * @deprecated\n * @param {string} eventName event name (eg. 'after:render')\n */\n off(eventName: K): void;\n /**\n * unsubscribe an event listener\n * @param {string} eventName event name (eg. 'after:render')\n * @param {TEventCallback} handler event listener to unsubscribe\n */\n off(eventName: K, handler: TEventCallback): void;\n /**\n * unsubscribe event listeners\n * @param handlers handlers key/value pairs (eg. {'after:render': handler, 'selection:cleared': handler})\n */\n off(handlers: EventRegistryObject): void;\n /**\n * unsubscribe all event listeners\n */\n off(): void;\n off(\n arg0?: K | EventRegistryObject,\n handler?: TEventCallback,\n ) {\n if (!this.__eventListeners) {\n return;\n }\n\n // remove all key/value pairs (event name -> event handler)\n if (typeof arg0 === 'undefined') {\n for (const eventName in this.__eventListeners) {\n this._removeEventListener(eventName);\n }\n }\n // one object with key/value pairs was passed\n else if (typeof arg0 === 'object') {\n Object.entries(arg0).forEach(([eventName, handler]) => {\n this._removeEventListener(eventName as K, handler as TEventCallback);\n });\n } else {\n this._removeEventListener(arg0, handler);\n }\n }\n\n /**\n * Fires event with an optional options object\n * @param {String} eventName Event name to fire\n * @param {Object} [options] Options object\n */\n fire(eventName: K, options?: EventSpec[K]) {\n if (!this.__eventListeners) {\n return;\n }\n\n const listenersForEvent = this.__eventListeners[eventName]?.concat();\n if (listenersForEvent) {\n for (let i = 0; i < listenersForEvent.length; i++) {\n listenersForEvent[i].call(this, options || {});\n }\n }\n }\n}\n","/**\n * Removes value from an array.\n * Presence of value (and its position in an array) is determined via `Array.prototype.indexOf`\n * @param {Array} array\n * @param {*} value\n * @return {Array} original array\n */\nexport const removeFromArray = (array: T[], value: T): T[] => {\n const idx = array.indexOf(value);\n if (idx !== -1) {\n array.splice(idx, 1);\n }\n return array;\n};\n","import type { TRadian } from '../../typedefs';\nimport { halfPI } from '../../constants';\n\n/**\n * Calculate the cos of an angle, avoiding returning floats for known results\n * This function is here just to avoid getting 0.999999999999999 when dealing\n * with numbers that are really 1 or 0.\n * @param {TRadian} angle the angle\n * @return {Number} the cosin value for angle.\n */\nexport const cos = (angle: TRadian): number => {\n if (angle === 0) {\n return 1;\n }\n const angleSlice = Math.abs(angle) / halfPI;\n switch (angleSlice) {\n case 1:\n case 3:\n return 0;\n case 2:\n return -1;\n }\n return Math.cos(angle);\n};\n","import type { TRadian } from '../../typedefs';\nimport { halfPI } from '../../constants';\n\n/**\n * Calculate the cos of an angle, avoiding returning floats for known results\n * This function is here just to avoid getting 0.999999999999999 when dealing\n * with numbers that are really 1 or 0.\n * @param {TRadian} angle the angle\n * @return {Number} the sin value for angle.\n */\nexport const sin = (angle: TRadian): number => {\n if (angle === 0) {\n return 0;\n }\n const angleSlice = angle / halfPI;\n const value = Math.sign(angle);\n switch (angleSlice) {\n case 1:\n return value;\n case 2:\n return 0;\n case 3:\n return -value;\n }\n return Math.sin(angle);\n};\n","import type { TMat2D, TRadian } from './typedefs';\nimport { cos } from './util/misc/cos';\nimport { sin } from './util/misc/sin';\n\nexport interface XY {\n x: number;\n y: number;\n}\n\n/**\n * Adaptation of work of Kevin Lindsey(kevin@kevlindev.com)\n */\nexport class Point implements XY {\n declare x: number;\n\n declare y: number;\n\n constructor();\n constructor(x: number, y: number);\n constructor(point?: XY);\n constructor(arg0: number | XY = 0, y = 0) {\n if (typeof arg0 === 'object') {\n this.x = arg0.x;\n this.y = arg0.y;\n } else {\n this.x = arg0;\n this.y = y;\n }\n }\n\n /**\n * Adds another point to this one and returns a new one with the sum\n * @param {XY} that\n * @return {Point} new Point instance with added values\n */\n add(that: XY): Point {\n return new Point(this.x + that.x, this.y + that.y);\n }\n\n /**\n * Adds another point to this one\n * @param {XY} that\n * @return {Point} thisArg\n * @chainable\n * @deprecated\n */\n addEquals(that: XY): Point {\n this.x += that.x;\n this.y += that.y;\n return this;\n }\n\n /**\n * Adds value to this point and returns a new one\n * @param {Number} scalar\n * @return {Point} new Point with added value\n */\n scalarAdd(scalar: number): Point {\n return new Point(this.x + scalar, this.y + scalar);\n }\n\n /**\n * Adds value to this point\n * @param {Number} scalar\n * @return {Point} thisArg\n * @chainable\n * @deprecated\n */\n scalarAddEquals(scalar: number): Point {\n this.x += scalar;\n this.y += scalar;\n return this;\n }\n\n /**\n * Subtracts another point from this point and returns a new one\n * @param {XY} that\n * @return {Point} new Point object with subtracted values\n */\n subtract(that: XY): Point {\n return new Point(this.x - that.x, this.y - that.y);\n }\n\n /**\n * Subtracts another point from this point\n * @param {XY} that\n * @return {Point} thisArg\n * @chainable\n * @deprecated\n */\n subtractEquals(that: XY): Point {\n this.x -= that.x;\n this.y -= that.y;\n return this;\n }\n\n /**\n * Subtracts value from this point and returns a new one\n * @param {Number} scalar\n * @return {Point}\n */\n scalarSubtract(scalar: number): Point {\n return new Point(this.x - scalar, this.y - scalar);\n }\n\n /**\n * Subtracts value from this point\n * @param {Number} scalar\n * @return {Point} thisArg\n * @chainable\n * @deprecated\n */\n scalarSubtractEquals(scalar: number): Point {\n this.x -= scalar;\n this.y -= scalar;\n return this;\n }\n\n /**\n * Multiplies this point by another value and returns a new one\n * @param {XY} that\n * @return {Point}\n */\n multiply(that: XY): Point {\n return new Point(this.x * that.x, this.y * that.y);\n }\n\n /**\n * Multiplies this point by a value and returns a new one\n * @param {Number} scalar\n * @return {Point}\n */\n scalarMultiply(scalar: number): Point {\n return new Point(this.x * scalar, this.y * scalar);\n }\n\n /**\n * Multiplies this point by a value\n * @param {Number} scalar\n * @return {Point} thisArg\n * @chainable\n * @deprecated\n */\n scalarMultiplyEquals(scalar: number): Point {\n this.x *= scalar;\n this.y *= scalar;\n return this;\n }\n\n /**\n * Divides this point by another and returns a new one\n * @param {XY} that\n * @return {Point}\n */\n divide(that: XY): Point {\n return new Point(this.x / that.x, this.y / that.y);\n }\n\n /**\n * Divides this point by a value and returns a new one\n * @param {Number} scalar\n * @return {Point}\n */\n scalarDivide(scalar: number): Point {\n return new Point(this.x / scalar, this.y / scalar);\n }\n\n /**\n * Divides this point by a value\n * @param {Number} scalar\n * @return {Point} thisArg\n * @chainable\n * @deprecated\n */\n scalarDivideEquals(scalar: number): Point {\n this.x /= scalar;\n this.y /= scalar;\n return this;\n }\n\n /**\n * Returns true if this point is equal to another one\n * @param {XY} that\n * @return {Boolean}\n */\n eq(that: XY): boolean {\n return this.x === that.x && this.y === that.y;\n }\n\n /**\n * Returns true if this point is less than another one\n * @param {XY} that\n * @return {Boolean}\n */\n lt(that: XY): boolean {\n return this.x < that.x && this.y < that.y;\n }\n\n /**\n * Returns true if this point is less than or equal to another one\n * @param {XY} that\n * @return {Boolean}\n */\n lte(that: XY): boolean {\n return this.x <= that.x && this.y <= that.y;\n }\n\n /**\n\n * Returns true if this point is greater another one\n * @param {XY} that\n * @return {Boolean}\n */\n gt(that: XY): boolean {\n return this.x > that.x && this.y > that.y;\n }\n\n /**\n * Returns true if this point is greater than or equal to another one\n * @param {XY} that\n * @return {Boolean}\n */\n gte(that: XY): boolean {\n return this.x >= that.x && this.y >= that.y;\n }\n\n /**\n * Returns new point which is the result of linear interpolation with this one and another one\n * @param {XY} that\n * @param {Number} t , position of interpolation, between 0 and 1 default 0.5\n * @return {Point}\n */\n lerp(that: XY, t = 0.5): Point {\n t = Math.max(Math.min(1, t), 0);\n return new Point(\n this.x + (that.x - this.x) * t,\n this.y + (that.y - this.y) * t,\n );\n }\n\n /**\n * Returns distance from this point and another one\n * @param {XY} that\n * @return {Number}\n */\n distanceFrom(that: XY): number {\n const dx = this.x - that.x,\n dy = this.y - that.y;\n return Math.sqrt(dx * dx + dy * dy);\n }\n\n /**\n * Returns the point between this point and another one\n * @param {XY} that\n * @return {Point}\n */\n midPointFrom(that: XY): Point {\n return this.lerp(that);\n }\n\n /**\n * Returns a new point which is the min of this and another one\n * @param {XY} that\n * @return {Point}\n */\n min(that: XY): Point {\n return new Point(Math.min(this.x, that.x), Math.min(this.y, that.y));\n }\n\n /**\n * Returns a new point which is the max of this and another one\n * @param {XY} that\n * @return {Point}\n */\n max(that: XY): Point {\n return new Point(Math.max(this.x, that.x), Math.max(this.y, that.y));\n }\n\n /**\n * Returns string representation of this point\n * @return {String}\n */\n toString(): string {\n return `${this.x},${this.y}`;\n }\n\n /**\n * Sets x/y of this point\n * @param {Number} x\n * @param {Number} y\n * @chainable\n */\n setXY(x: number, y: number) {\n this.x = x;\n this.y = y;\n return this;\n }\n\n /**\n * Sets x of this point\n * @param {Number} x\n * @chainable\n */\n setX(x: number) {\n this.x = x;\n return this;\n }\n\n /**\n * Sets y of this point\n * @param {Number} y\n * @chainable\n */\n setY(y: number) {\n this.y = y;\n return this;\n }\n\n /**\n * Sets x/y of this point from another point\n * @param {XY} that\n * @chainable\n */\n setFromPoint(that: XY) {\n this.x = that.x;\n this.y = that.y;\n return this;\n }\n\n /**\n * Swaps x/y of this point and another point\n * @param {XY} that\n */\n swap(that: XY) {\n const x = this.x,\n y = this.y;\n this.x = that.x;\n this.y = that.y;\n that.x = x;\n that.y = y;\n }\n\n /**\n * return a cloned instance of the point\n * @return {Point}\n */\n clone(): Point {\n return new Point(this.x, this.y);\n }\n\n /**\n * Rotates `point` around `origin` with `radians`\n * @param {XY} origin The origin of the rotation\n * @param {TRadian} radians The radians of the angle for the rotation\n * @return {Point} The new rotated point\n */\n rotate(radians: TRadian, origin: XY = ZERO): Point {\n // TODO benchmark and verify the add and subtract how much cost\n // and then in case early return if no origin is passed\n const sinus = sin(radians),\n cosinus = cos(radians);\n const p = this.subtract(origin);\n const rotated = new Point(\n p.x * cosinus - p.y * sinus,\n p.x * sinus + p.y * cosinus,\n );\n return rotated.add(origin);\n }\n\n /**\n * Apply transform t to point p\n * @param {TMat2D} t The transform\n * @param {Boolean} [ignoreOffset] Indicates that the offset should not be applied\n * @return {Point} The transformed point\n */\n transform(t: TMat2D, ignoreOffset = false): Point {\n return new Point(\n t[0] * this.x + t[2] * this.y + (ignoreOffset ? 0 : t[4]),\n t[1] * this.x + t[3] * this.y + (ignoreOffset ? 0 : t[5]),\n );\n }\n}\n\nexport const ZERO = new Point(0, 0);\n","import type { Constructor, TBBox } from './typedefs';\nimport { removeFromArray } from './util/internals/removeFromArray';\nimport { Point } from './Point';\nimport type { ActiveSelection } from './shapes/ActiveSelection';\nimport type { Group } from './shapes/Group';\nimport type { InteractiveFabricObject } from './shapes/Object/InteractiveObject';\nimport type { FabricObject } from './shapes/Object/FabricObject';\n\nexport const isCollection = (\n fabricObject?: FabricObject,\n): fabricObject is Group | ActiveSelection => {\n return !!fabricObject && Array.isArray((fabricObject as Group)._objects);\n};\n\nexport function createCollectionMixin(Base: TBase) {\n class Collection extends Base {\n /**\n * @type {FabricObject[]}\n * @TODO needs to end up in the constructor too\n */\n _objects: FabricObject[] = [];\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n _onObjectAdded(object: FabricObject) {\n // subclasses should override this method\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n _onObjectRemoved(object: FabricObject) {\n // subclasses should override this method\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n _onStackOrderChanged(object: FabricObject) {\n // subclasses should override this method\n }\n\n /**\n * Adds objects to collection\n * Objects should be instances of (or inherit from) FabricObject\n * @param {...FabricObject[]} objects to add\n * @returns {number} new array length\n */\n add(...objects: FabricObject[]): number {\n const size = this._objects.push(...objects);\n objects.forEach((object) => this._onObjectAdded(object));\n return size;\n }\n\n /**\n * Inserts an object into collection at specified index\n * @param {number} index Index to insert object at\n * @param {...FabricObject[]} objects Object(s) to insert\n * @returns {number} new array length\n */\n insertAt(index: number, ...objects: FabricObject[]) {\n this._objects.splice(index, 0, ...objects);\n objects.forEach((object) => this._onObjectAdded(object));\n return this._objects.length;\n }\n\n /**\n * Removes objects from a collection, then renders canvas (if `renderOnAddRemove` is not `false`)\n * @private\n * @param {...FabricObject[]} objects objects to remove\n * @returns {FabricObject[]} removed objects\n */\n remove(...objects: FabricObject[]) {\n const array = this._objects,\n removed: FabricObject[] = [];\n objects.forEach((object) => {\n const index = array.indexOf(object);\n // only call onObjectRemoved if an object was actually removed\n if (index !== -1) {\n array.splice(index, 1);\n removed.push(object);\n this._onObjectRemoved(object);\n }\n });\n return removed;\n }\n\n /**\n * Executes given function for each object in this group\n * A simple shortcut for getObjects().forEach, before es6 was more complicated,\n * now is just a shortcut.\n * @param {Function} callback\n * Callback invoked with current object as first argument,\n * index - as second and an array of all objects - as third.\n */\n forEachObject(\n callback: (\n object: FabricObject,\n index: number,\n array: FabricObject[],\n ) => any,\n ) {\n this.getObjects().forEach((object, index, objects) =>\n callback(object, index, objects),\n );\n }\n\n /**\n * Returns an array of children objects of this instance\n * @param {...String} [types] When specified, only objects of these types are returned\n * @return {Array}\n */\n getObjects(...types: string[]) {\n if (types.length === 0) {\n return [...this._objects];\n }\n return this._objects.filter((o) => o.isType(...types));\n }\n\n /**\n * Returns object at specified index\n * @param {Number} index\n * @return {Object} object at index\n */\n item(index: number) {\n return this._objects[index];\n }\n\n /**\n * Returns true if collection contains no objects\n * @return {Boolean} true if collection is empty\n */\n isEmpty() {\n return this._objects.length === 0;\n }\n\n /**\n * Returns a size of a collection (i.e: length of an array containing its objects)\n * @return {Number} Collection size\n */\n size() {\n return this._objects.length;\n }\n\n /**\n * Returns true if collection contains an object.\\\n * **Prefer using {@link FabricObject#isDescendantOf} for performance reasons**\n * instead of `a.contains(b)` use `b.isDescendantOf(a)`\n * @param {Object} object Object to check against\n * @param {Boolean} [deep=false] `true` to check all descendants, `false` to check only `_objects`\n * @return {Boolean} `true` if collection contains an object\n */\n contains(object: FabricObject, deep?: boolean): boolean {\n if (this._objects.includes(object)) {\n return true;\n } else if (deep) {\n return this._objects.some(\n (obj) =>\n obj instanceof Collection &&\n (obj as unknown as Collection).contains(object, true),\n );\n }\n return false;\n }\n\n /**\n * Returns number representation of a collection complexity\n * @return {Number} complexity\n */\n complexity() {\n return this._objects.reduce((memo, current) => {\n memo += current.complexity ? current.complexity() : 0;\n return memo;\n }, 0);\n }\n\n /**\n * Moves an object or the objects of a multiple selection\n * to the bottom of the stack of drawn objects\n * @param {fabric.Object} object Object to send to back\n * @returns {boolean} true if change occurred\n */\n sendObjectToBack(object: FabricObject) {\n if (!object || object === this._objects[0]) {\n return false;\n }\n removeFromArray(this._objects, object);\n this._objects.unshift(object);\n this._onStackOrderChanged(object);\n return true;\n }\n\n /**\n * Moves an object or the objects of a multiple selection\n * to the top of the stack of drawn objects\n * @param {fabric.Object} object Object to send\n * @returns {boolean} true if change occurred\n */\n bringObjectToFront(object: FabricObject) {\n if (!object || object === this._objects[this._objects.length - 1]) {\n return false;\n }\n removeFromArray(this._objects, object);\n this._objects.push(object);\n this._onStackOrderChanged(object);\n return true;\n }\n\n /**\n * Moves an object or a selection down in stack of drawn objects\n * An optional parameter, `intersecting` allows to move the object in behind\n * the first intersecting object. Where intersection is calculated with\n * bounding box. If no intersection is found, there will not be change in the\n * stack.\n * @param {fabric.Object} object Object to send\n * @param {boolean} [intersecting] If `true`, send object behind next lower intersecting object\n * @returns {boolean} true if change occurred\n */\n sendObjectBackwards(object: FabricObject, intersecting?: boolean) {\n if (!object) {\n return false;\n }\n const idx = this._objects.indexOf(object);\n if (idx !== 0) {\n // if object is not on the bottom of stack\n const newIdx = this.findNewLowerIndex(object, idx, intersecting);\n removeFromArray(this._objects, object);\n this._objects.splice(newIdx, 0, object);\n this._onStackOrderChanged(object);\n return true;\n }\n return false;\n }\n\n /**\n * Moves an object or a selection up in stack of drawn objects\n * An optional parameter, intersecting allows to move the object in front\n * of the first intersecting object. Where intersection is calculated with\n * bounding box. If no intersection is found, there will not be change in the\n * stack.\n * @param {fabric.Object} object Object to send\n * @param {boolean} [intersecting] If `true`, send object in front of next upper intersecting object\n * @returns {boolean} true if change occurred\n */\n bringObjectForward(object: FabricObject, intersecting?: boolean) {\n if (!object) {\n return false;\n }\n const idx = this._objects.indexOf(object);\n if (idx !== this._objects.length - 1) {\n // if object is not on top of stack (last item in an array)\n const newIdx = this.findNewUpperIndex(object, idx, intersecting);\n removeFromArray(this._objects, object);\n this._objects.splice(newIdx, 0, object);\n this._onStackOrderChanged(object);\n return true;\n }\n return false;\n }\n\n /**\n * Moves an object to specified level in stack of drawn objects\n * @param {fabric.Object} object Object to send\n * @param {number} index Position to move to\n * @returns {boolean} true if change occurred\n */\n moveObjectTo(object: FabricObject, index: number) {\n if (object === this._objects[index]) {\n return false;\n }\n removeFromArray(this._objects, object);\n this._objects.splice(index, 0, object);\n this._onStackOrderChanged(object);\n return true;\n }\n\n findNewLowerIndex(\n object: FabricObject,\n idx: number,\n intersecting?: boolean,\n ) {\n let newIdx;\n\n if (intersecting) {\n newIdx = idx;\n // traverse down the stack looking for the nearest intersecting object\n for (let i = idx - 1; i >= 0; --i) {\n if (object.isOverlapping(this._objects[i])) {\n newIdx = i;\n break;\n }\n }\n } else {\n newIdx = idx - 1;\n }\n\n return newIdx;\n }\n\n findNewUpperIndex(\n object: FabricObject,\n idx: number,\n intersecting?: boolean,\n ) {\n let newIdx;\n\n if (intersecting) {\n newIdx = idx;\n // traverse up the stack looking for the nearest intersecting object\n for (let i = idx + 1; i < this._objects.length; ++i) {\n if (object.isOverlapping(this._objects[i])) {\n newIdx = i;\n break;\n }\n }\n } else {\n newIdx = idx + 1;\n }\n\n return newIdx;\n }\n\n /**\n * Given a bounding box, return all the objects of the collection that are contained in the bounding box.\n * If `includeIntersecting` is true, return also the objects that intersect the bounding box as well.\n * This is meant to work with selection. Is not a generic method.\n * @param {TBBox} bbox a bounding box in scene coordinates\n * @param {{ includeIntersecting?: boolean }} options an object with includeIntersecting\n * @returns array of objects contained in the bounding box, ordered from top to bottom stacking wise\n */\n collectObjects(\n { left, top, width, height }: TBBox,\n { includeIntersecting = true }: { includeIntersecting?: boolean } = {},\n ) {\n const objects: InteractiveFabricObject[] = [],\n tl = new Point(left, top),\n br = tl.add(new Point(width, height));\n\n // we iterate reverse order to collect top first in case of click.\n for (let i = this._objects.length - 1; i >= 0; i--) {\n const object = this._objects[i] as unknown as InteractiveFabricObject;\n if (\n object.selectable &&\n object.visible &&\n ((includeIntersecting && object.intersectsWithRect(tl, br)) ||\n object.isContainedWithinRect(tl, br) ||\n (includeIntersecting && object.containsPoint(tl)) ||\n (includeIntersecting && object.containsPoint(br)))\n ) {\n objects.push(object);\n }\n }\n\n return objects;\n }\n }\n\n // https://github.com/microsoft/TypeScript/issues/32080\n return Collection;\n}\n","import { Observable } from './Observable';\n\nexport class CommonMethods extends Observable {\n /**\n * Sets object's properties from options, for initialization only\n * @protected\n * @param {Object} [options] Options object\n */\n protected _setOptions(options: any = {}) {\n for (const prop in options) {\n this.set(prop, options[prop]);\n }\n }\n\n /**\n * @private\n */\n _setObject(obj: Record) {\n for (const prop in obj) {\n this._set(prop, obj[prop]);\n }\n }\n\n /**\n * Sets property to a given value. When changing position/dimension -related properties (left, top, scale, angle, etc.) `set` does not update position of object's borders/controls. If you need to update those, call `setCoords()`.\n * @param {String|Object} key Property name or object (if object, iterate over the object properties)\n * @param {Object|Function} value Property value (if function, the value is passed into it and its return value is used as a new one)\n */\n set(key: string | Record, value?: any) {\n if (typeof key === 'object') {\n this._setObject(key);\n } else {\n this._set(key, value);\n }\n return this;\n }\n\n _set(key: string, value: any) {\n this[key as keyof this] = value;\n }\n\n /**\n * Toggles specified property from `true` to `false` or from `false` to `true`\n * @param {String} property Property to toggle\n */\n toggle(property: string) {\n const value = this.get(property);\n if (typeof value === 'boolean') {\n this.set(property, !value);\n }\n return this;\n }\n\n /**\n * Basic getter\n * @param {String} property Property name\n * @return {*} value of a property\n */\n get(property: string): any {\n return this[property as keyof this];\n }\n}\n","import { getFabricWindow } from '../../env';\n\nexport function requestAnimFrame(callback: FrameRequestCallback): number {\n return getFabricWindow().requestAnimationFrame(callback);\n}\n\nexport function cancelAnimFrame(handle: number): void {\n return getFabricWindow().cancelAnimationFrame(handle);\n}\n","let id = 0;\n\nexport const uid = () => id++;\n","import { getFabricDocument } from '../../env';\nimport type { ImageFormat, TSize } from '../../typedefs';\nimport { FabricError } from '../internals/console';\n/**\n * Creates canvas element\n * @return {CanvasElement} initialized canvas element\n */\nexport const createCanvasElement = (): HTMLCanvasElement => {\n const element = getFabricDocument().createElement('canvas');\n if (!element || typeof element.getContext === 'undefined') {\n throw new FabricError('Failed to create `canvas` element');\n }\n return element;\n};\n\n/**\n * Creates image element (works on client and node)\n * @return {HTMLImageElement} HTML image element\n */\nexport const createImage = (): HTMLImageElement =>\n getFabricDocument().createElement('img');\n\n/**\n * Creates a canvas element that is a copy of another and is also painted\n * @param {CanvasElement} canvas to copy size and content of\n * @return {CanvasElement} initialized canvas element\n */\nexport const copyCanvasElement = (\n canvas: HTMLCanvasElement,\n): HTMLCanvasElement => {\n const newCanvas = createCanvasElementFor(canvas);\n newCanvas.getContext('2d')?.drawImage(canvas, 0, 0);\n return newCanvas;\n};\n\n/**\n * Creates a canvas element as big as another\n * @param {CanvasElement} canvas to copy size and content of\n * @return {CanvasElement} initialized canvas element\n */\nexport const createCanvasElementFor = (\n canvas: HTMLCanvasElement | ImageData | HTMLImageElement | TSize,\n): HTMLCanvasElement => {\n const newCanvas = createCanvasElement();\n newCanvas.width = canvas.width;\n newCanvas.height = canvas.height;\n return newCanvas;\n};\n\n/**\n * since 2.6.0 moved from canvas instance to utility.\n * possibly useless\n * @param {CanvasElement} canvasEl to copy size and content of\n * @param {String} format 'jpeg' or 'png', in some browsers 'webp' is ok too\n * @param {number} quality <= 1 and > 0\n * @return {String} data url\n */\nexport const toDataURL = (\n canvasEl: HTMLCanvasElement,\n format: ImageFormat,\n quality: number,\n) => canvasEl.toDataURL(`image/${format}`, quality);\n\nexport const isHTMLCanvas = (\n canvas?: HTMLCanvasElement | string,\n): canvas is HTMLCanvasElement => {\n return !!canvas && (canvas as HTMLCanvasElement).getContext !== undefined;\n};\n\nexport const toBlob = (\n canvasEl: HTMLCanvasElement,\n format?: ImageFormat,\n quality?: number,\n): Promise =>\n new Promise((resolve, _) => {\n canvasEl.toBlob(resolve, `image/${format}`, quality);\n });\n","import type { TRadian, TDegree } from '../../typedefs';\nimport { PiBy180 } from '../../constants';\n\n/**\n * Transforms degrees to radians.\n * @param {TDegree} degrees value in degrees\n * @return {TRadian} value in radians\n */\nexport const degreesToRadians = (degrees: TDegree): TRadian =>\n (degrees * PiBy180) as TRadian;\n\n/**\n * Transforms radians to degrees.\n * @param {TRadian} radians value in radians\n * @return {TDegree} value in degrees\n */\nexport const radiansToDegrees = (radians: TRadian): TDegree =>\n (radians / PiBy180) as TDegree;\n","import { iMatrix } from '../../constants';\nimport type { XY } from '../../Point';\nimport { Point } from '../../Point';\nimport type { TDegree, TRadian, TMat2D } from '../../typedefs';\nimport { cos } from './cos';\nimport { degreesToRadians, radiansToDegrees } from './radiansDegreesConversion';\nimport { sin } from './sin';\n\nexport type TRotateMatrixArgs = {\n angle?: TDegree;\n};\n\nexport type TTranslateMatrixArgs = {\n translateX?: number;\n translateY?: number;\n};\n\nexport type TScaleMatrixArgs = {\n scaleX?: number;\n scaleY?: number;\n flipX?: boolean;\n flipY?: boolean;\n skewX?: TDegree;\n skewY?: TDegree;\n};\n\nexport type TComposeMatrixArgs = TTranslateMatrixArgs &\n TRotateMatrixArgs &\n TScaleMatrixArgs;\n\nexport type TQrDecomposeOut = Required<\n Omit\n>;\n\nexport const isIdentityMatrix = (mat: TMat2D) =>\n mat.every((value, index) => value === iMatrix[index]);\n\n/**\n * Apply transform t to point p\n * @deprecated use {@link Point#transform}\n * @param {Point | XY} p The point to transform\n * @param {Array} t The transform\n * @param {Boolean} [ignoreOffset] Indicates that the offset should not be applied\n * @return {Point} The transformed point\n */\nexport const transformPoint = (\n p: XY,\n t: TMat2D,\n ignoreOffset?: boolean,\n): Point => new Point(p).transform(t, ignoreOffset);\n\n/**\n * Invert transformation t\n * @param {Array} t The transform\n * @return {Array} The inverted transform\n */\nexport const invertTransform = (t: TMat2D): TMat2D => {\n const a = 1 / (t[0] * t[3] - t[1] * t[2]),\n r = [a * t[3], -a * t[1], -a * t[2], a * t[0], 0, 0] as TMat2D,\n { x, y } = new Point(t[4], t[5]).transform(r, true);\n r[4] = -x;\n r[5] = -y;\n return r;\n};\n\n/**\n * Multiply matrix A by matrix B to nest transformations\n * @param {TMat2D} a First transformMatrix\n * @param {TMat2D} b Second transformMatrix\n * @param {Boolean} is2x2 flag to multiply matrices as 2x2 matrices\n * @return {TMat2D} The product of the two transform matrices\n */\nexport const multiplyTransformMatrices = (\n a: TMat2D,\n b: TMat2D,\n is2x2?: boolean,\n): TMat2D =>\n [\n a[0] * b[0] + a[2] * b[1],\n a[1] * b[0] + a[3] * b[1],\n a[0] * b[2] + a[2] * b[3],\n a[1] * b[2] + a[3] * b[3],\n is2x2 ? 0 : a[0] * b[4] + a[2] * b[5] + a[4],\n is2x2 ? 0 : a[1] * b[4] + a[3] * b[5] + a[5],\n ] as TMat2D;\n\n/**\n * Multiplies {@link matrices} such that a matrix defines the plane for the rest of the matrices **after** it\n *\n * `multiplyTransformMatrixArray([A, B, C, D])` is equivalent to `A(B(C(D)))`\n *\n * @param matrices an array of matrices\n * @param [is2x2] flag to multiply matrices as 2x2 matrices\n * @returns the multiplication product\n */\nexport const multiplyTransformMatrixArray = (\n matrices: (TMat2D | undefined | null | false)[],\n is2x2?: boolean,\n) =>\n matrices.reduceRight(\n (product: TMat2D, curr) =>\n curr && product\n ? multiplyTransformMatrices(curr, product, is2x2)\n : curr || product,\n undefined as unknown as TMat2D,\n ) || iMatrix.concat();\n\nexport const calcPlaneRotation = ([a, b]: TMat2D) =>\n Math.atan2(b, a) as TRadian;\n\n/**\n * Decomposes standard 2x3 matrix into transform components\n * @param {TMat2D} a transformMatrix\n * @return {Object} Components of transform\n */\nexport const qrDecompose = (a: TMat2D): TQrDecomposeOut => {\n const angle = calcPlaneRotation(a),\n denom = Math.pow(a[0], 2) + Math.pow(a[1], 2),\n scaleX = Math.sqrt(denom),\n scaleY = (a[0] * a[3] - a[2] * a[1]) / scaleX,\n skewX = Math.atan2(a[0] * a[2] + a[1] * a[3], denom);\n return {\n angle: radiansToDegrees(angle),\n scaleX,\n scaleY,\n skewX: radiansToDegrees(skewX),\n skewY: 0 as TDegree,\n translateX: a[4] || 0,\n translateY: a[5] || 0,\n };\n};\n\n/**\n * Generate a translation matrix\n *\n * A translation matrix in the form of\n * [ 1 0 x ]\n * [ 0 1 y ]\n * [ 0 0 1 ]\n *\n * See @link https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/transform#translate for more details\n *\n * @param {number} x translation on X axis\n * @param {number} [y] translation on Y axis\n * @returns {TMat2D} matrix\n */\nexport const createTranslateMatrix = (x: number, y = 0): TMat2D => [\n 1,\n 0,\n 0,\n 1,\n x,\n y,\n];\n\n/**\n * Generate a rotation matrix around around a point (x,y), defaulting to (0,0)\n *\n * A matrix in the form of\n * [cos(a) -sin(a) -x*cos(a)+y*sin(a)+x]\n * [sin(a) cos(a) -x*sin(a)-y*cos(a)+y]\n * [0 0 1 ]\n *\n *\n * @param {TDegree} angle rotation in degrees\n * @param {XY} [pivotPoint] pivot point to rotate around\n * @returns {TMat2D} matrix\n */\nexport function createRotateMatrix(\n { angle = 0 }: TRotateMatrixArgs = {},\n { x = 0, y = 0 }: Partial = {},\n): TMat2D {\n const angleRadiant = degreesToRadians(angle),\n cosValue = cos(angleRadiant),\n sinValue = sin(angleRadiant);\n return [\n cosValue,\n sinValue,\n -sinValue,\n cosValue,\n x ? x - (cosValue * x - sinValue * y) : 0,\n y ? y - (sinValue * x + cosValue * y) : 0,\n ];\n}\n\n/**\n * Generate a scale matrix around the point (0,0)\n *\n * A matrix in the form of\n * [x 0 0]\n * [0 y 0]\n * [0 0 1]\n *\n * @link https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/transform#scale\n *\n * @param {number} x scale on X axis\n * @param {number} [y] scale on Y axis\n * @returns {TMat2D} matrix\n */\nexport const createScaleMatrix = (x: number, y: number = x): TMat2D => [\n x,\n 0,\n 0,\n y,\n 0,\n 0,\n];\n\nexport const angleToSkew = (angle: TDegree) =>\n Math.tan(degreesToRadians(angle));\n\nexport const skewToAngle = (value: TRadian) =>\n radiansToDegrees(Math.atan(value));\n\n/**\n * Generate a skew matrix for the X axis\n *\n * A matrix in the form of\n * [1 x 0]\n * [0 1 0]\n * [0 0 1]\n *\n * @link https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/transform#skewx\n *\n * @param {TDegree} skewValue translation on X axis\n * @returns {TMat2D} matrix\n */\nexport const createSkewXMatrix = (skewValue: TDegree): TMat2D => [\n 1,\n 0,\n angleToSkew(skewValue),\n 1,\n 0,\n 0,\n];\n\n/**\n * Generate a skew matrix for the Y axis\n *\n * A matrix in the form of\n * [1 0 0]\n * [y 1 0]\n * [0 0 1]\n *\n * @link https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/transform#skewy\n *\n * @param {TDegree} skewValue translation on Y axis\n * @returns {TMat2D} matrix\n */\nexport const createSkewYMatrix = (skewValue: TDegree): TMat2D => [\n 1,\n angleToSkew(skewValue),\n 0,\n 1,\n 0,\n 0,\n];\n\n/**\n * Returns a transform matrix starting from an object of the same kind of\n * the one returned from qrDecompose, useful also if you want to calculate some\n * transformations from an object that is not enlived yet.\n * is called DimensionsTransformMatrix because those properties are the one that influence\n * the size of the resulting box of the object.\n * @param {Object} options\n * @param {Number} [options.scaleX]\n * @param {Number} [options.scaleY]\n * @param {Boolean} [options.flipX]\n * @param {Boolean} [options.flipY]\n * @param {Number} [options.skewX]\n * @param {Number} [options.skewY]\n * @return {Number[]} transform matrix\n */\nexport const calcDimensionsMatrix = ({\n scaleX = 1,\n scaleY = 1,\n flipX = false,\n flipY = false,\n skewX = 0 as TDegree,\n skewY = 0 as TDegree,\n}: TScaleMatrixArgs) => {\n let matrix = createScaleMatrix(\n flipX ? -scaleX : scaleX,\n flipY ? -scaleY : scaleY,\n );\n if (skewX) {\n matrix = multiplyTransformMatrices(matrix, createSkewXMatrix(skewX), true);\n }\n if (skewY) {\n matrix = multiplyTransformMatrices(matrix, createSkewYMatrix(skewY), true);\n }\n return matrix;\n};\n\n/**\n * Returns a transform matrix starting from an object of the same kind of\n * the one returned from qrDecompose, useful also if you want to calculate some\n * transformations from an object that is not enlived yet\n * Before changing this function look at: src/benchmarks/calcTransformMatrix.mjs\n * @param {Object} options\n * @param {Number} [options.angle]\n * @param {Number} [options.scaleX]\n * @param {Number} [options.scaleY]\n * @param {Boolean} [options.flipX]\n * @param {Boolean} [options.flipY]\n * @param {Number} [options.skewX]\n * @param {Number} [options.skewY]\n * @param {Number} [options.translateX]\n * @param {Number} [options.translateY]\n * @return {Number[]} transform matrix\n */\nexport const composeMatrix = (options: TComposeMatrixArgs): TMat2D => {\n const { translateX = 0, translateY = 0, angle = 0 as TDegree } = options;\n let matrix = createTranslateMatrix(translateX, translateY);\n if (angle) {\n matrix = multiplyTransformMatrices(matrix, createRotateMatrix({ angle }));\n }\n const scaleMatrix = calcDimensionsMatrix(options);\n if (!isIdentityMatrix(scaleMatrix)) {\n matrix = multiplyTransformMatrices(matrix, scaleMatrix);\n }\n return matrix;\n};\n","import { noop } from '../../constants';\nimport type { FabricObject } from '../../shapes/Object/FabricObject';\nimport type {\n Abortable,\n Constructor,\n TCrossOrigin,\n TFiller,\n} from '../../typedefs';\nimport { createImage } from './dom';\nimport { classRegistry } from '../../ClassRegistry';\nimport type { BaseFilter } from '../../filters/BaseFilter';\nimport type { FabricObject as BaseFabricObject } from '../../shapes/Object/Object';\nimport { FabricError, SignalAbortedError } from '../internals/console';\nimport type { Shadow } from '../../Shadow';\n\nexport type LoadImageOptions = Abortable & {\n /**\n * cors value for the image loading, default to anonymous\n */\n crossOrigin?: TCrossOrigin;\n};\n\n/**\n * Loads image element from given url and resolve it, or catch.\n * @param {String} url URL representing an image\n * @param {LoadImageOptions} [options] image loading options\n * @returns {Promise} the loaded image.\n */\nexport const loadImage = (\n url: string,\n { signal, crossOrigin = null }: LoadImageOptions = {},\n) =>\n new Promise(function (resolve, reject) {\n if (signal && signal.aborted) {\n return reject(new SignalAbortedError('loadImage'));\n }\n const img = createImage();\n let abort: EventListenerOrEventListenerObject;\n if (signal) {\n abort = function (err: Event) {\n img.src = '';\n reject(err);\n };\n signal.addEventListener('abort', abort, { once: true });\n }\n const done = function () {\n img.onload = img.onerror = null;\n abort && signal?.removeEventListener('abort', abort);\n resolve(img);\n };\n if (!url) {\n done();\n return;\n }\n img.onload = done;\n img.onerror = function () {\n abort && signal?.removeEventListener('abort', abort);\n reject(new FabricError(`Error loading ${img.src}`));\n };\n crossOrigin && (img.crossOrigin = crossOrigin);\n img.src = url;\n });\n\nexport type EnlivenObjectOptions = Abortable & {\n /**\n * Method for further parsing of object elements,\n * called after each fabric object created.\n */\n reviver?: <\n T extends\n | BaseFabricObject\n | FabricObject\n | BaseFilter\n | Shadow\n | TFiller,\n >(\n serializedObj: Record,\n instance: T,\n ) => void;\n};\n\n/**\n * @TODO type this correctly.\n * Creates corresponding fabric instances from their object representations\n * @param {Object[]} objects Objects to enliven\n * @param {EnlivenObjectOptions} [options]\n * @param {(serializedObj: object, instance: FabricObject) => any} [options.reviver] Method for further parsing of object elements,\n * called after each fabric object created.\n * @param {AbortSignal} [options.signal] handle aborting, see https://developer.mozilla.org/en-US/docs/Web/API/AbortController/signal\n * @returns {Promise}\n */\nexport const enlivenObjects = <\n T extends\n | BaseFabricObject\n | FabricObject\n | BaseFilter\n | Shadow\n | TFiller,\n>(\n objects: any[],\n { signal, reviver = noop }: EnlivenObjectOptions = {},\n) =>\n new Promise((resolve, reject) => {\n const instances: T[] = [];\n signal && signal.addEventListener('abort', reject, { once: true });\n Promise.all(\n objects.map((obj) =>\n classRegistry\n .getClass<\n Constructor & {\n fromObject(options: any, context: Abortable): Promise;\n }\n >(obj.type)\n .fromObject(obj, { signal })\n .then((fabricInstance) => {\n reviver(obj, fabricInstance);\n instances.push(fabricInstance);\n return fabricInstance;\n }),\n ),\n )\n .then(resolve)\n .catch((error) => {\n // cleanup\n instances.forEach((instance) => {\n (instance as FabricObject).dispose &&\n (instance as FabricObject).dispose();\n });\n reject(error);\n })\n .finally(() => {\n signal && signal.removeEventListener('abort', reject);\n });\n });\n\n/**\n * Creates corresponding fabric instances residing in an object, e.g. `clipPath`\n * @param {Object} object with properties to enlive ( fill, stroke, clipPath, path )\n * @param {object} [options]\n * @param {AbortSignal} [options.signal] handle aborting, see https://developer.mozilla.org/en-US/docs/Web/API/AbortController/signal\n * @returns {Promise>} the input object with enlived values\n */\nexport const enlivenObjectEnlivables = <\n R = Record,\n>(\n serializedObject: any,\n { signal }: Abortable = {},\n) =>\n new Promise((resolve, reject) => {\n const instances: (FabricObject | TFiller | Shadow)[] = [];\n signal && signal.addEventListener('abort', reject, { once: true });\n // enlive every possible property\n const promises = Object.values(serializedObject).map((value: any) => {\n if (!value) {\n return value;\n }\n /**\n * clipPath or shadow or gradient or text on a path or a pattern,\n * or the backgroundImage or overlayImage of canvas\n * If we have a type and there is a classe registered for it, we enlive it.\n * If there is no class registered for it we return the value as is\n * */\n if (value.type && classRegistry.has(value.type)) {\n return enlivenObjects([value], {\n signal,\n }).then(([enlived]) => {\n instances.push(enlived);\n return enlived;\n });\n }\n return value;\n });\n const keys = Object.keys(serializedObject);\n Promise.all(promises)\n .then((enlived) => {\n return enlived.reduce((acc, instance, index) => {\n acc[keys[index]] = instance;\n return acc;\n }, {});\n })\n .then(resolve)\n .catch((error) => {\n // cleanup\n instances.forEach((instance: any) => {\n instance.dispose && instance.dispose();\n });\n reject(error);\n })\n .finally(() => {\n signal && signal.removeEventListener('abort', reject);\n });\n });\n","/**\n * Populates an object with properties of another object\n * @param {Object} source Source object\n * @param {string[]} properties Properties names to include\n * @returns object populated with the picked keys\n */\nexport const pick = >(\n source: T,\n keys: (keyof T)[] = [],\n) => {\n return keys.reduce((o, key) => {\n if (key in source) {\n o[key] = source[key];\n }\n return o;\n }, {} as Partial);\n};\n\nexport const pickBy = >(\n source: T,\n predicate: (value: T[K], key: K, collection: T) => boolean,\n) => {\n return (Object.keys(source) as (keyof T)[]).reduce((o, key) => {\n if (predicate(source[key], key, source)) {\n o[key] = source[key];\n }\n return o;\n }, {} as Partial);\n};\n","/**\n * A wrapper around Number#toFixed, which contrary to native method returns number, not string.\n * @param {number|string} number number to operate on\n * @param {number} fractionDigits number of fraction digits to \"leave\"\n * @return {number}\n */\nexport const toFixed = (number: number | string, fractionDigits: number) =>\n parseFloat(Number(number).toFixed(fractionDigits));\n","import type { TMat2D } from '../../typedefs';\nimport { toFixed } from './toFixed';\nimport { config } from '../../config';\n\n/**\n * given an array of 6 number returns something like `\"matrix(...numbers)\"`\n * @param {TMat2D} transform an array with 6 numbers\n * @return {String} transform matrix for svg\n */\nexport const matrixToSVG = (transform: TMat2D) =>\n 'matrix(' +\n transform\n .map((value) => toFixed(value, config.NUM_FRACTION_DIGITS))\n .join(' ') +\n ')';\n","import type { FabricObject } from '../shapes/Object/Object';\nimport type { TFiller } from '../typedefs';\nimport type { FabricText } from '../shapes/Text/Text';\nimport type { Pattern } from '../Pattern';\nimport type { Path } from '../shapes/Path';\nimport type { ActiveSelection } from '../shapes/ActiveSelection';\n\nexport const isFiller = (\n filler: TFiller | string | null,\n): filler is TFiller => {\n return !!filler && (filler as TFiller).toLive !== undefined;\n};\n\nexport const isSerializableFiller = (\n filler: TFiller | string | null,\n): filler is TFiller => {\n return !!filler && typeof (filler as TFiller).toObject === 'function';\n};\n\nexport const isPattern = (filler: TFiller): filler is Pattern => {\n return (\n !!filler && (filler as Pattern).offsetX !== undefined && 'source' in filler\n );\n};\n\nexport const isTextObject = (\n fabricObject?: FabricObject,\n): fabricObject is FabricText => {\n return (\n !!fabricObject &&\n typeof (fabricObject as FabricText)._renderText === 'function'\n );\n};\n\nexport const isPath = (fabricObject?: FabricObject): fabricObject is Path => {\n // we could use instanceof but that would mean pulling in Text code for a simple check\n // @todo discuss what to do and how to do\n return (\n !!fabricObject &&\n typeof (fabricObject as Path)._renderPathCommands === 'function'\n );\n};\n\nexport const isActiveSelection = (\n fabricObject?: FabricObject,\n): fabricObject is ActiveSelection =>\n !!fabricObject && 'multiSelectionStacking' in fabricObject;\n","/**\n * Returns element scroll offsets\n * @param {HTMLElement} element Element to operate on\n * @return {Object} Object with left/top values\n */\nexport function getScrollLeftTop(element: HTMLElement | null) {\n const doc = element && getDocumentFromElement(element);\n let left = 0,\n top = 0;\n if (!element || !doc) {\n return { left, top };\n }\n let elementLoop: HTMLElement | Document | ShadowRoot = element;\n const docElement = doc.documentElement,\n body = doc.body || {\n scrollLeft: 0,\n scrollTop: 0,\n };\n // While loop checks (and then sets element to) .parentNode OR .host\n // to account for ShadowDOM. We still want to traverse up out of ShadowDOM,\n // but the .parentNode of a root ShadowDOM node will always be null, instead\n // it should be accessed through .host. See http://stackoverflow.com/a/24765528/4383938\n while (\n elementLoop &&\n (elementLoop.parentNode || (elementLoop as unknown as ShadowRoot).host)\n ) {\n elementLoop = (elementLoop.parentNode ||\n (elementLoop as unknown as ShadowRoot).host) as\n | HTMLElement\n | Document\n | ShadowRoot;\n if (elementLoop === doc) {\n left = body.scrollLeft || docElement.scrollLeft || 0;\n top = body.scrollTop || docElement.scrollTop || 0;\n } else {\n left += (elementLoop as HTMLElement).scrollLeft || 0;\n top += (elementLoop as HTMLElement).scrollTop || 0;\n }\n\n if (\n elementLoop.nodeType === 1 &&\n (elementLoop as HTMLElement).style.position === 'fixed'\n ) {\n break;\n }\n }\n\n return { left, top };\n}\n\nexport const getDocumentFromElement = (el: HTMLElement) =>\n el.ownerDocument || null;\n\nexport const getWindowFromElement = (el: HTMLElement) =>\n el.ownerDocument?.defaultView || null;\n","import { NONE } from '../../constants';\nimport type { TSize } from '../../typedefs';\nimport {\n getDocumentFromElement,\n getWindowFromElement,\n getScrollLeftTop,\n} from '../../util/dom_misc';\n\nexport const setCanvasDimensions = (\n el: HTMLCanvasElement,\n ctx: CanvasRenderingContext2D,\n { width, height }: TSize,\n retinaScaling = 1,\n) => {\n el.width = width;\n el.height = height;\n if (retinaScaling > 1) {\n el.setAttribute('width', (width * retinaScaling).toString());\n el.setAttribute('height', (height * retinaScaling).toString());\n ctx.scale(retinaScaling, retinaScaling);\n }\n};\n\nexport type CSSDimensions = {\n width: number | string;\n height: number | string;\n};\n\nexport const setCSSDimensions = (\n el: HTMLElement,\n { width, height }: Partial,\n) => {\n width && (el.style.width = typeof width === 'number' ? `${width}px` : width);\n height &&\n (el.style.height = typeof height === 'number' ? `${height}px` : height);\n};\n\n/**\n * Returns offset for a given element\n * @param {HTMLElement} element Element to get offset for\n * @return {Object} Object with \"left\" and \"top\" properties\n */\nexport function getElementOffset(element: HTMLElement) {\n const doc = element && getDocumentFromElement(element),\n offset = { left: 0, top: 0 };\n\n if (!doc) {\n return offset;\n }\n const elemStyle: CSSStyleDeclaration =\n getWindowFromElement(element)?.getComputedStyle(element, null) ||\n ({} as CSSStyleDeclaration);\n offset.left += parseInt(elemStyle.borderLeftWidth, 10) || 0;\n offset.top += parseInt(elemStyle.borderTopWidth, 10) || 0;\n offset.left += parseInt(elemStyle.paddingLeft, 10) || 0;\n offset.top += parseInt(elemStyle.paddingTop, 10) || 0;\n\n let box = { left: 0, top: 0 };\n\n const docElem = doc.documentElement;\n if (typeof element.getBoundingClientRect !== 'undefined') {\n box = element.getBoundingClientRect();\n }\n\n const scrollLeftTop = getScrollLeftTop(element);\n\n return {\n left:\n box.left + scrollLeftTop.left - (docElem.clientLeft || 0) + offset.left,\n top: box.top + scrollLeftTop.top - (docElem.clientTop || 0) + offset.top,\n };\n}\n\n/**\n * Makes element unselectable\n * @param {HTMLElement} element Element to make unselectable\n * @return {HTMLElement} Element that was passed in\n */\nexport function makeElementUnselectable(element: HTMLElement) {\n if (typeof element.onselectstart !== 'undefined') {\n element.onselectstart = () => false;\n }\n element.style.userSelect = NONE;\n return element;\n}\n","import { getEnv, getFabricDocument } from '../../env';\nimport type { TSize } from '../../typedefs';\nimport type { CSSDimensions } from './util';\nimport { setCSSDimensions, getElementOffset } from './util';\nimport { createCanvasElement, isHTMLCanvas } from '../../util/misc/dom';\nimport { setCanvasDimensions } from './util';\nimport { FabricError } from '../../util/internals/console';\n\nexport type CanvasItem = {\n el: HTMLCanvasElement;\n ctx: CanvasRenderingContext2D;\n};\n\nexport class StaticCanvasDOMManager {\n /**\n * Keeps a copy of the canvas style before setting retina scaling and other potions\n * in order to return it to original state on dispose\n * @type string\n */\n private _originalCanvasStyle?: string;\n\n lower: CanvasItem;\n\n constructor(arg0?: string | HTMLCanvasElement) {\n const el = this.createLowerCanvas(arg0);\n this.lower = { el, ctx: el.getContext('2d')! };\n }\n\n protected createLowerCanvas(arg0?: HTMLCanvasElement | string) {\n // canvasEl === 'HTMLCanvasElement' does not work on jsdom/node\n const el = isHTMLCanvas(arg0)\n ? arg0\n : (arg0 &&\n (getFabricDocument().getElementById(arg0) as HTMLCanvasElement)) ||\n createCanvasElement();\n if (el.hasAttribute('data-fabric')) {\n throw new FabricError(\n 'Trying to initialize a canvas that has already been initialized. Did you forget to dispose the canvas?',\n );\n }\n this._originalCanvasStyle = el.style.cssText;\n el.setAttribute('data-fabric', 'main');\n el.classList.add('lower-canvas');\n return el;\n }\n\n cleanupDOM({ width, height }: TSize) {\n const { el } = this.lower;\n // restore canvas style and attributes\n el.classList.remove('lower-canvas');\n el.removeAttribute('data-fabric');\n // restore canvas size to original size in case retina scaling was applied\n el.setAttribute('width', `${width}`);\n el.setAttribute('height', `${height}`);\n el.style.cssText = this._originalCanvasStyle || '';\n this._originalCanvasStyle = undefined;\n }\n\n setDimensions(size: TSize, retinaScaling: number) {\n const { el, ctx } = this.lower;\n setCanvasDimensions(el, ctx, size, retinaScaling);\n }\n\n setCSSDimensions(size: Partial) {\n setCSSDimensions(this.lower.el, size);\n }\n\n /**\n * Calculates canvas element offset relative to the document\n */\n calcOffset() {\n return getElementOffset(this.lower.el);\n }\n\n dispose() {\n getEnv().dispose(this.lower.el);\n // @ts-expect-error disposing\n delete this.lower;\n }\n}\n","import { iMatrix } from '../constants';\nimport type { FabricObject } from '../shapes/Object/FabricObject';\nimport type { TFiller, TMat2D, TOptions } from '../typedefs';\n\ninterface CanvasDrawableOptions {\n /**\n * if set to false background image is not affected by viewport transform\n * @since 1.6.3\n * @type Boolean\n * @todo we should really find a different way to do this\n */\n backgroundVpt: boolean;\n\n /**\n * Background color of canvas instance.\n * @type {(String|TFiller)}\n */\n backgroundColor: TFiller | string;\n\n /**\n * Background image of canvas instance.\n * since 2.4.0 image caching is active, please when putting an image as background, add to the\n * canvas property a reference to the canvas it is on. Otherwise the image cannot detect the zoom\n * vale. As an alternative you can disable image objectCaching\n * @type FabricObject\n */\n backgroundImage?: FabricObject;\n\n /**\n * if set to false overlay image is not affected by viewport transform\n * @since 1.6.3\n * @type Boolean\n * @todo we should really find a different way to do this\n */\n overlayVpt: boolean;\n\n /**\n * Overlay color of canvas instance.\n * @since 1.3.9\n * @type {(String|TFiller)}\n */\n overlayColor: TFiller | string;\n\n /**\n * Overlay image of canvas instance.\n * since 2.4.0 image caching is active, please when putting an image as overlay, add to the\n * canvas property a reference to the canvas it is on. Otherwise the image cannot detect the zoom\n * vale. As an alternative you can disable image objectCaching\n * @type FabricObject\n */\n overlayImage?: FabricObject;\n}\n\ninterface CanvasRenderingOptions {\n /**\n * Indicates whether {@link StaticCanvas#add}, {@link StaticCanvas#insertAt} and {@link StaticCanvas#remove},\n * {@link StaticCanvas#moveTo}, {@link StaticCanvas#clear} and many more, should also re-render canvas.\n * Disabling this option will not give a performance boost when adding/removing a lot of objects to/from canvas at once\n * since the renders are queued and executed one per frame.\n * Disabling is suggested anyway and managing the renders of the app manually is not a big effort ( canvas.requestRenderAll() )\n * Left default to true to do not break documentation and old app, fiddles.\n * @type Boolean\n */\n renderOnAddRemove: boolean;\n\n /**\n * Based on vptCoords and object.aCoords, skip rendering of objects that\n * are not included in current viewport.\n * May greatly help in applications with crowded canvas and use of zoom/pan\n * If One of the corner of the bounding box of the object is on the canvas\n * the objects get rendered.\n * @type Boolean\n * @default true\n */\n skipOffscreen: boolean;\n\n /**\n * When true, canvas is scaled by devicePixelRatio for better rendering on retina screens\n * @type Boolean\n */\n enableRetinaScaling: boolean;\n\n /**\n * Indicates whether this canvas will use image smoothing, this is on by default in browsers\n * @type Boolean\n */\n imageSmoothingEnabled: boolean;\n\n /**\n * a fabricObject that, without stroke define a clipping area with their shape. filled in black\n * the clipPath object gets used when the canvas has rendered, and the context is placed in the\n * top left corner of the canvas.\n * clipPath will clip away controls, if you do not want this to happen use controlsAboveOverlay = true\n * @type FabricObject\n */\n clipPath?: FabricObject;\n}\n\nexport interface CanvasExportOptions {\n /**\n * Indicates whether toObject/toDatalessObject should include default values\n * if set to false, takes precedence over the object value.\n * @type Boolean\n */\n includeDefaultValues: boolean;\n\n /**\n * When true, getSvgTransform() will apply the StaticCanvas.viewportTransform to the SVG transformation. When true,\n * a zoomed canvas will then produce zoomed SVG output.\n * @type Boolean\n */\n svgViewportTransformation: boolean;\n}\n\nexport interface StaticCanvasOptions\n extends CanvasDrawableOptions,\n CanvasRenderingOptions,\n CanvasExportOptions {\n /**\n * Width in virtual/logical pixels of the canvas.\n * The canvas can be larger than width if retina scaling is active\n * @type number\n */\n width: number;\n\n /**\n * Height in virtual/logical pixels of the canvas.\n * The canvas can be taller than width if retina scaling is active\n * @type height\n */\n height: number;\n\n /**\n * Indicates whether object controls (borders/controls) are rendered above overlay image\n * @type Boolean\n *\n * @todo move to Canvas\n */\n controlsAboveOverlay: boolean;\n\n /**\n * Indicates whether the browser can be scrolled when using a touchscreen and dragging on the canvas\n * It gives PRIORITY to DOM scrolling, it doesn't make it always possible.\n * If is true, when using a touch event on the canvas, the canvas will scroll if scroll is possible.\n * If we are in drawing mode or if we are selecting an object the canvas preventDefault and so it won't scroll\n * @type Boolean\n *\n * @todo move to Canvas\n */\n allowTouchScrolling: boolean;\n\n /**\n * The transformation (a Canvas 2D API transform matrix) which focuses the viewport\n * @type Array\n * @example Default transform\n * canvas.viewportTransform = [1, 0, 0, 1, 0, 0];\n * @example Scale by 70% and translate toward bottom-right by 50, without skewing\n * canvas.viewportTransform = [0.7, 0, 0, 0.7, 50, 50];\n */\n viewportTransform: TMat2D;\n}\n\nexport const staticCanvasDefaults: TOptions = {\n backgroundVpt: true,\n backgroundColor: '',\n overlayVpt: true,\n overlayColor: '',\n\n includeDefaultValues: true,\n svgViewportTransformation: true,\n\n renderOnAddRemove: true,\n skipOffscreen: true,\n enableRetinaScaling: true,\n imageSmoothingEnabled: true,\n\n /**\n * @todo move to Canvas\n */\n controlsAboveOverlay: false,\n /**\n * @todo move to Canvas\n */\n allowTouchScrolling: false,\n\n viewportTransform: [...iMatrix],\n};\n","import { config } from '../config';\nimport { CENTER, VERSION } from '../constants';\nimport type { CanvasEvents, StaticCanvasEvents } from '../EventTypeDefs';\nimport type { Gradient } from '../gradient/Gradient';\nimport { createCollectionMixin, isCollection } from '../Collection';\nimport { CommonMethods } from '../CommonMethods';\nimport type { Pattern } from '../Pattern';\nimport { Point } from '../Point';\nimport type { TCachedFabricObject } from '../shapes/Object/Object';\nimport type {\n Abortable,\n Constructor,\n TCornerPoint,\n TDataUrlOptions,\n TFiller,\n TMat2D,\n TSize,\n TSVGReviver,\n TToCanvasElementOptions,\n TValidToObjectMethod,\n TOptions,\n} from '../typedefs';\nimport {\n cancelAnimFrame,\n requestAnimFrame,\n} from '../util/animation/AnimationFrameProvider';\nimport { runningAnimations } from '../util/animation/AnimationRegistry';\nimport { uid } from '../util/internals/uid';\nimport { createCanvasElementFor, toBlob, toDataURL } from '../util/misc/dom';\nimport { invertTransform, transformPoint } from '../util/misc/matrix';\nimport type { EnlivenObjectOptions } from '../util/misc/objectEnlive';\nimport {\n enlivenObjectEnlivables,\n enlivenObjects,\n} from '../util/misc/objectEnlive';\nimport { pick } from '../util/misc/pick';\nimport { matrixToSVG } from '../util/misc/svgExport';\nimport { toFixed } from '../util/misc/toFixed';\nimport { isFiller, isPattern, isTextObject } from '../util/typeAssertions';\nimport { StaticCanvasDOMManager } from './DOMManagers/StaticCanvasDOMManager';\nimport type { CSSDimensions } from './DOMManagers/util';\nimport type { FabricObject } from '../shapes/Object/FabricObject';\nimport type { StaticCanvasOptions } from './StaticCanvasOptions';\nimport { staticCanvasDefaults } from './StaticCanvasOptions';\nimport { log, FabricError } from '../util/internals/console';\nimport { getDevicePixelRatio } from '../env';\n\n/**\n * Having both options in TCanvasSizeOptions set to true transform the call in a calcOffset\n * Better try to restrict with types to avoid confusion.\n */\nexport type TCanvasSizeOptions =\n | {\n backstoreOnly?: true;\n cssOnly?: false;\n }\n | {\n backstoreOnly?: false;\n cssOnly?: true;\n };\n\nexport type TSVGExportOptions = {\n suppressPreamble?: boolean;\n viewBox?: {\n x: number;\n y: number;\n width: number;\n height: number;\n };\n encoding?: 'UTF-8'; // test Encoding type and see what happens\n width?: string;\n height?: string;\n reviver?: TSVGReviver;\n};\n\n/**\n * Static canvas class\n * @see {@link http://fabricjs.com/static_canvas|StaticCanvas demo}\n * @fires before:render\n * @fires after:render\n * @fires canvas:cleared\n * @fires object:added\n * @fires object:removed\n */\n// TODO: fix `EventSpec` inheritance https://github.com/microsoft/TypeScript/issues/26154#issuecomment-1366616260\nexport class StaticCanvas<\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n EventSpec extends StaticCanvasEvents = StaticCanvasEvents,\n >\n extends createCollectionMixin(CommonMethods)\n implements StaticCanvasOptions\n{\n declare width: number;\n declare height: number;\n\n // background\n declare backgroundVpt: boolean;\n declare backgroundColor: TFiller | string;\n declare backgroundImage?: FabricObject;\n // overlay\n declare overlayVpt: boolean;\n declare overlayColor: TFiller | string;\n declare overlayImage?: FabricObject;\n\n declare clipPath?: FabricObject;\n\n declare includeDefaultValues: boolean;\n\n // rendering config\n declare renderOnAddRemove: boolean;\n declare skipOffscreen: boolean;\n declare enableRetinaScaling: boolean;\n declare imageSmoothingEnabled: boolean;\n\n /**\n * @todo move to Canvas\n */\n declare controlsAboveOverlay: boolean;\n\n /**\n * @todo move to Canvas\n */\n declare allowTouchScrolling: boolean;\n\n declare viewportTransform: TMat2D;\n\n /**\n * The viewport bounding box in scene plane coordinates, see {@link calcViewportBoundaries}\n */\n declare vptCoords: TCornerPoint;\n\n /**\n * A reference to the canvas actual HTMLCanvasElement.\n * Can be use to read the raw pixels, but never write or manipulate\n * @type HTMLCanvasElement\n */\n get lowerCanvasEl() {\n return this.elements.lower?.el;\n }\n\n get contextContainer() {\n return this.elements.lower?.ctx;\n }\n\n /**\n * If true the Canvas is in the process or has been disposed/destroyed.\n * No more rendering operation will be executed on this canvas.\n * @type boolean\n */\n declare destroyed?: boolean;\n\n /**\n * Started the process of disposing but not done yet.\n * WIll likely complete the render cycle already scheduled but stopping adding more.\n * @type boolean\n */\n declare disposed?: boolean;\n\n declare _offset: { left: number; top: number };\n declare protected hasLostContext: boolean;\n declare protected nextRenderHandle: number;\n\n declare elements: StaticCanvasDOMManager;\n\n /**\n * When true control drawing is skipped.\n * This boolean is used to avoid toDataURL to export controls.\n * Usage of this boolean to build up other flows and features is not supported\n * @type Boolean\n * @default false\n */\n declare protected skipControlsDrawing: boolean;\n\n static ownDefaults = staticCanvasDefaults;\n\n // reference to\n declare protected __cleanupTask?: {\n (): void;\n kill: (reason?: any) => void;\n };\n\n static getDefaults(): Record {\n return StaticCanvas.ownDefaults;\n }\n\n constructor(\n el?: string | HTMLCanvasElement,\n options: TOptions = {},\n ) {\n super();\n Object.assign(\n this,\n (this.constructor as typeof StaticCanvas).getDefaults(),\n );\n this.set(options);\n this.initElements(el);\n this._setDimensionsImpl({\n width: this.width || this.elements.lower.el.width || 0,\n height: this.height || this.elements.lower.el.height || 0,\n });\n this.skipControlsDrawing = false;\n this.viewportTransform = [...this.viewportTransform];\n this.calcViewportBoundaries();\n }\n\n protected initElements(el?: string | HTMLCanvasElement) {\n this.elements = new StaticCanvasDOMManager(el);\n }\n\n add(...objects: FabricObject[]) {\n const size = super.add(...objects);\n objects.length > 0 && this.renderOnAddRemove && this.requestRenderAll();\n return size;\n }\n\n insertAt(index: number, ...objects: FabricObject[]) {\n const size = super.insertAt(index, ...objects);\n objects.length > 0 && this.renderOnAddRemove && this.requestRenderAll();\n return size;\n }\n\n remove(...objects: FabricObject[]) {\n const removed = super.remove(...objects);\n removed.length > 0 && this.renderOnAddRemove && this.requestRenderAll();\n return removed;\n }\n\n _onObjectAdded(obj: FabricObject) {\n if (obj.canvas && (obj.canvas as StaticCanvas) !== this) {\n log(\n 'warn',\n 'Canvas is trying to add an object that belongs to a different canvas.\\n' +\n 'Resulting to default behavior: removing object from previous canvas and adding to new canvas',\n );\n obj.canvas.remove(obj);\n }\n obj._set('canvas', this);\n obj.setCoords();\n this.fire('object:added', { target: obj });\n obj.fire('added', { target: this });\n }\n\n _onObjectRemoved(obj: FabricObject) {\n obj._set('canvas', undefined);\n this.fire('object:removed', { target: obj });\n obj.fire('removed', { target: this });\n }\n\n _onStackOrderChanged() {\n this.renderOnAddRemove && this.requestRenderAll();\n }\n\n /**\n * @private\n * @see https://developer.apple.com/library/safari/documentation/AudioVideo/Conceptual/HTML-canvas-guide/SettingUptheCanvas/SettingUptheCanvas.html\n * @return {Number} retinaScaling if applied, otherwise 1;\n */\n getRetinaScaling() {\n return this.enableRetinaScaling ? getDevicePixelRatio() : 1;\n }\n\n /**\n * Calculates canvas element offset relative to the document\n * This method is also attached as \"resize\" event handler of window\n */\n calcOffset() {\n return (this._offset = this.elements.calcOffset());\n }\n\n /**\n * Returns canvas width (in px)\n * @return {Number}\n */\n getWidth(): number {\n return this.width;\n }\n\n /**\n * Returns canvas height (in px)\n * @return {Number}\n */\n getHeight(): number {\n return this.height;\n }\n\n /**\n * Internal use only\n * @protected\n */\n protected _setDimensionsImpl(\n dimensions: Partial,\n { cssOnly = false, backstoreOnly = false }: TCanvasSizeOptions = {},\n ) {\n if (!cssOnly) {\n const size = {\n width: this.width,\n height: this.height,\n ...(dimensions as Partial),\n };\n this.elements.setDimensions(size, this.getRetinaScaling());\n this.hasLostContext = true;\n this.width = size.width;\n this.height = size.height;\n }\n if (!backstoreOnly) {\n this.elements.setCSSDimensions(dimensions);\n }\n\n this.calcOffset();\n }\n\n /**\n * Sets dimensions (width, height) of this canvas instance. when options.cssOnly flag active you should also supply the unit of measure (px/%/em)\n * @param {Object} dimensions Object with width/height properties\n * @param {Number|String} [dimensions.width] Width of canvas element\n * @param {Number|String} [dimensions.height] Height of canvas element\n * @param {Object} [options] Options object\n * @param {Boolean} [options.backstoreOnly=false] Set the given dimensions only as canvas backstore dimensions\n * @param {Boolean} [options.cssOnly=false] Set the given dimensions only as css dimensions\n */\n setDimensions(\n dimensions: Partial,\n options?: { cssOnly?: true; backstoreOnly?: false },\n ): void;\n setDimensions(\n dimensions: Partial,\n options?: { backstoreOnly?: true; cssOnly?: false },\n ): void;\n setDimensions(dimensions: Partial, options?: never): void;\n setDimensions(\n dimensions: Partial,\n options?: TCanvasSizeOptions,\n ) {\n this._setDimensionsImpl(dimensions, options);\n if (!options || !options.cssOnly) {\n this.requestRenderAll();\n }\n }\n\n /**\n * Returns canvas zoom level\n * @return {Number}\n */\n getZoom() {\n return this.viewportTransform[0];\n }\n\n /**\n * Sets viewport transformation of this canvas instance\n * @param {Array} vpt a Canvas 2D API transform matrix\n */\n setViewportTransform(vpt: TMat2D) {\n this.viewportTransform = vpt;\n this.calcViewportBoundaries();\n this.renderOnAddRemove && this.requestRenderAll();\n }\n\n /**\n * Sets zoom level of this canvas instance, the zoom centered around point\n * meaning that following zoom to point with the same point will have the visual\n * effect of the zoom originating from that point. The point won't move.\n * It has nothing to do with canvas center or visual center of the viewport.\n * @param {Point} point to zoom with respect to\n * @param {Number} value to set zoom to, less than 1 zooms out\n */\n zoomToPoint(point: Point, value: number) {\n // TODO: just change the scale, preserve other transformations\n const before = point,\n vpt: TMat2D = [...this.viewportTransform];\n const newPoint = transformPoint(point, invertTransform(vpt));\n vpt[0] = value;\n vpt[3] = value;\n const after = transformPoint(newPoint, vpt);\n vpt[4] += before.x - after.x;\n vpt[5] += before.y - after.y;\n this.setViewportTransform(vpt);\n }\n\n /**\n * Sets zoom level of this canvas instance\n * @param {Number} value to set zoom to, less than 1 zooms out\n */\n setZoom(value: number) {\n this.zoomToPoint(new Point(0, 0), value);\n }\n\n /**\n * Pan viewport so as to place point at top left corner of canvas\n * @param {Point} point to move to\n */\n absolutePan(point: Point) {\n const vpt: TMat2D = [...this.viewportTransform];\n vpt[4] = -point.x;\n vpt[5] = -point.y;\n return this.setViewportTransform(vpt);\n }\n\n /**\n * Pans viewpoint relatively\n * @param {Point} point (position vector) to move by\n */\n relativePan(point: Point) {\n return this.absolutePan(\n new Point(\n -point.x - this.viewportTransform[4],\n -point.y - this.viewportTransform[5],\n ),\n );\n }\n\n /**\n * Returns <canvas> element corresponding to this instance\n * @return {HTMLCanvasElement}\n */\n getElement(): HTMLCanvasElement {\n return this.elements.lower.el;\n }\n\n /**\n * Clears specified context of canvas element\n * @param {CanvasRenderingContext2D} ctx Context to clear\n */\n clearContext(ctx: CanvasRenderingContext2D) {\n ctx.clearRect(0, 0, this.width, this.height);\n }\n\n /**\n * Returns context of canvas where objects are drawn\n * @return {CanvasRenderingContext2D}\n */\n getContext(): CanvasRenderingContext2D {\n return this.elements.lower.ctx;\n }\n\n /**\n * Clears all contexts (background, main, top) of an instance\n */\n clear() {\n this.remove(...this.getObjects());\n this.backgroundImage = undefined;\n this.overlayImage = undefined;\n this.backgroundColor = '';\n this.overlayColor = '';\n this.clearContext(this.getContext());\n this.fire('canvas:cleared');\n this.renderOnAddRemove && this.requestRenderAll();\n }\n\n /**\n * Renders the canvas\n */\n renderAll() {\n this.cancelRequestedRender();\n if (this.destroyed) {\n return;\n }\n this.renderCanvas(this.getContext(), this._objects);\n }\n\n /**\n * Function created to be instance bound at initialization\n * used in requestAnimationFrame rendering\n * Let the fabricJS call it. If you call it manually you could have more\n * animationFrame stacking on to of each other\n * for an imperative rendering, use canvas.renderAll\n * @private\n */\n renderAndReset() {\n this.nextRenderHandle = 0;\n this.renderAll();\n }\n\n /**\n * Append a renderAll request to next animation frame.\n * unless one is already in progress, in that case nothing is done\n * a boolean flag will avoid appending more.\n */\n requestRenderAll() {\n if (!this.nextRenderHandle && !this.disposed && !this.destroyed) {\n this.nextRenderHandle = requestAnimFrame(() => this.renderAndReset());\n }\n }\n\n /**\n * Calculate the position of the 4 corner of canvas with current viewportTransform.\n * helps to determinate when an object is in the current rendering viewport\n */\n calcViewportBoundaries(): TCornerPoint {\n const width = this.width,\n height = this.height,\n iVpt = invertTransform(this.viewportTransform),\n a = transformPoint({ x: 0, y: 0 }, iVpt),\n b = transformPoint({ x: width, y: height }, iVpt),\n // we don't support vpt flipping\n // but the code is robust enough to mostly work with flipping\n min = a.min(b),\n max = a.max(b);\n return (this.vptCoords = {\n tl: min,\n tr: new Point(max.x, min.y),\n bl: new Point(min.x, max.y),\n br: max,\n });\n }\n\n cancelRequestedRender() {\n if (this.nextRenderHandle) {\n cancelAnimFrame(this.nextRenderHandle);\n this.nextRenderHandle = 0;\n }\n }\n\n drawControls(_ctx: CanvasRenderingContext2D) {\n // Static canvas has no controls\n }\n\n /**\n * Renders background, objects, overlay and controls.\n * @param {CanvasRenderingContext2D} ctx\n * @param {Array} objects to render\n */\n renderCanvas(ctx: CanvasRenderingContext2D, objects: FabricObject[]) {\n if (this.destroyed) {\n return;\n }\n\n const v = this.viewportTransform,\n path = this.clipPath;\n this.calcViewportBoundaries();\n this.clearContext(ctx);\n ctx.imageSmoothingEnabled = this.imageSmoothingEnabled;\n // @ts-expect-error node-canvas stuff\n ctx.patternQuality = 'best';\n this.fire('before:render', { ctx });\n this._renderBackground(ctx);\n\n ctx.save();\n //apply viewport transform once for all rendering process\n ctx.transform(v[0], v[1], v[2], v[3], v[4], v[5]);\n this._renderObjects(ctx, objects);\n ctx.restore();\n if (!this.controlsAboveOverlay && !this.skipControlsDrawing) {\n this.drawControls(ctx);\n }\n if (path) {\n path._set('canvas', this);\n // needed to setup a couple of variables\n // todo migrate to the newer one\n path.shouldCache();\n path._transformDone = true;\n (path as TCachedFabricObject).renderCache({ forClipping: true });\n this.drawClipPathOnCanvas(ctx, path as TCachedFabricObject);\n }\n this._renderOverlay(ctx);\n if (this.controlsAboveOverlay && !this.skipControlsDrawing) {\n this.drawControls(ctx);\n }\n this.fire('after:render', { ctx });\n\n if (this.__cleanupTask) {\n this.__cleanupTask();\n this.__cleanupTask = undefined;\n }\n }\n\n /**\n * Paint the cached clipPath on the lowerCanvasEl\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n drawClipPathOnCanvas(\n ctx: CanvasRenderingContext2D,\n clipPath: TCachedFabricObject,\n ) {\n const v = this.viewportTransform;\n ctx.save();\n ctx.transform(...v);\n // DEBUG: uncomment this line, comment the following\n // ctx.globalAlpha = 0.4;\n ctx.globalCompositeOperation = 'destination-in';\n clipPath.transform(ctx);\n ctx.scale(1 / clipPath.zoomX, 1 / clipPath.zoomY);\n ctx.drawImage(\n clipPath._cacheCanvas,\n -clipPath.cacheTranslationX,\n -clipPath.cacheTranslationY,\n );\n ctx.restore();\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n * @param {Array} objects to render\n */\n _renderObjects(ctx: CanvasRenderingContext2D, objects: FabricObject[]) {\n for (let i = 0, len = objects.length; i < len; ++i) {\n objects[i] && objects[i].render(ctx);\n }\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n * @param {string} property 'background' or 'overlay'\n */\n _renderBackgroundOrOverlay(\n ctx: CanvasRenderingContext2D,\n property: 'background' | 'overlay',\n ) {\n const fill = this[`${property}Color`],\n object = this[`${property}Image`],\n v = this.viewportTransform,\n needsVpt = this[`${property}Vpt`];\n if (!fill && !object) {\n return;\n }\n const isAFiller = isFiller(fill);\n if (fill) {\n ctx.save();\n ctx.beginPath();\n ctx.moveTo(0, 0);\n ctx.lineTo(this.width, 0);\n ctx.lineTo(this.width, this.height);\n ctx.lineTo(0, this.height);\n ctx.closePath();\n ctx.fillStyle = isAFiller ? fill.toLive(ctx /* this */)! : fill;\n if (needsVpt) {\n ctx.transform(...v);\n }\n if (isAFiller) {\n ctx.transform(1, 0, 0, 1, fill.offsetX || 0, fill.offsetY || 0);\n const m = ((fill as Gradient<'linear'>).gradientTransform ||\n (fill as Pattern).patternTransform) as TMat2D;\n m && ctx.transform(...m);\n }\n ctx.fill();\n ctx.restore();\n }\n if (object) {\n ctx.save();\n const { skipOffscreen } = this;\n // if the object doesn't move with the viewport,\n // the offscreen concept does not apply;\n this.skipOffscreen = needsVpt;\n if (needsVpt) {\n ctx.transform(...v);\n }\n object.render(ctx);\n this.skipOffscreen = skipOffscreen;\n ctx.restore();\n }\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _renderBackground(ctx: CanvasRenderingContext2D) {\n this._renderBackgroundOrOverlay(ctx, 'background');\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _renderOverlay(ctx: CanvasRenderingContext2D) {\n this._renderBackgroundOrOverlay(ctx, 'overlay');\n }\n\n /**\n * Returns coordinates of a center of canvas.\n * @return {Point}\n */\n getCenterPoint() {\n return new Point(this.width / 2, this.height / 2);\n }\n\n /**\n * Centers object horizontally in the canvas\n */\n centerObjectH(object: FabricObject) {\n return this._centerObject(\n object,\n new Point(this.getCenterPoint().x, object.getCenterPoint().y),\n );\n }\n\n /**\n * Centers object vertically in the canvas\n * @param {FabricObject} object Object to center vertically\n */\n centerObjectV(object: FabricObject) {\n return this._centerObject(\n object,\n new Point(object.getCenterPoint().x, this.getCenterPoint().y),\n );\n }\n\n /**\n * Centers object vertically and horizontally in the canvas\n * @param {FabricObject} object Object to center vertically and horizontally\n */\n centerObject(object: FabricObject) {\n return this._centerObject(object, this.getCenterPoint());\n }\n\n /**\n * Centers object vertically and horizontally in the viewport\n * @param {FabricObject} object Object to center vertically and horizontally\n */\n viewportCenterObject(object: FabricObject) {\n return this._centerObject(object, this.getVpCenter());\n }\n\n /**\n * Centers object horizontally in the viewport, object.top is unchanged\n * @param {FabricObject} object Object to center vertically and horizontally\n */\n viewportCenterObjectH(object: FabricObject) {\n return this._centerObject(\n object,\n new Point(this.getVpCenter().x, object.getCenterPoint().y),\n );\n }\n\n /**\n * Centers object Vertically in the viewport, object.top is unchanged\n * @param {FabricObject} object Object to center vertically and horizontally\n */\n viewportCenterObjectV(object: FabricObject) {\n return this._centerObject(\n object,\n new Point(object.getCenterPoint().x, this.getVpCenter().y),\n );\n }\n\n /**\n * Calculate the point in canvas that correspond to the center of actual viewport.\n * @return {Point} vpCenter, viewport center\n */\n getVpCenter(): Point {\n return transformPoint(\n this.getCenterPoint(),\n invertTransform(this.viewportTransform),\n );\n }\n\n /**\n * @private\n * @param {FabricObject} object Object to center\n * @param {Point} center Center point\n */\n _centerObject(object: FabricObject, center: Point) {\n object.setXY(center, CENTER, CENTER);\n object.setCoords();\n this.renderOnAddRemove && this.requestRenderAll();\n }\n\n /**\n * Returns dataless JSON representation of canvas\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {String} json string\n */\n toDatalessJSON(propertiesToInclude?: string[]) {\n return this.toDatalessObject(propertiesToInclude);\n }\n\n /**\n * Returns object representation of canvas\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} object representation of an instance\n */\n toObject(propertiesToInclude?: string[]) {\n return this._toObjectMethod('toObject', propertiesToInclude);\n }\n\n /**\n * Returns Object representation of canvas\n * this alias is provided because if you call JSON.stringify on an instance,\n * the toJSON object will be invoked if it exists.\n * Having a toJSON method means you can do JSON.stringify(myCanvas)\n * JSON does not support additional properties because toJSON has its own signature\n * @return {Object} JSON compatible object\n * @tutorial {@link http://fabricjs.com/fabric-intro-part-3#serialization}\n * @see {@link http://jsfiddle.net/fabricjs/pec86/|jsFiddle demo}\n * @example JSON representation of canvas \n * const json = canvas.toJSON();\n * @example JSON representation of canvas \n * const json = JSON.stringify(canvas);\n */\n toJSON() {\n return this.toObject();\n }\n\n /**\n * Returns dataless object representation of canvas\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} object representation of an instance\n */\n toDatalessObject(propertiesToInclude?: string[]) {\n return this._toObjectMethod('toDatalessObject', propertiesToInclude);\n }\n\n /**\n * @private\n */\n _toObjectMethod(\n methodName: TValidToObjectMethod,\n propertiesToInclude?: string[],\n ) {\n const clipPath = this.clipPath;\n const clipPathData =\n clipPath && !clipPath.excludeFromExport\n ? this._toObject(clipPath, methodName, propertiesToInclude)\n : null;\n return {\n version: VERSION,\n ...pick(this, propertiesToInclude as (keyof this)[]),\n objects: this._objects\n .filter((object) => !object.excludeFromExport)\n .map((instance) =>\n this._toObject(instance, methodName, propertiesToInclude),\n ),\n ...this.__serializeBgOverlay(methodName, propertiesToInclude),\n ...(clipPathData ? { clipPath: clipPathData } : null),\n };\n }\n\n /**\n * @private\n */\n protected _toObject(\n instance: FabricObject,\n methodName: TValidToObjectMethod,\n propertiesToInclude?: string[],\n ) {\n let originalValue;\n\n if (!this.includeDefaultValues) {\n originalValue = instance.includeDefaultValues;\n instance.includeDefaultValues = false;\n }\n\n const object = instance[methodName](propertiesToInclude);\n if (!this.includeDefaultValues) {\n instance.includeDefaultValues = !!originalValue;\n }\n return object;\n }\n\n /**\n * @private\n */\n __serializeBgOverlay(\n methodName: TValidToObjectMethod,\n propertiesToInclude?: string[],\n ) {\n const data: any = {},\n bgImage = this.backgroundImage,\n overlayImage = this.overlayImage,\n bgColor = this.backgroundColor,\n overlayColor = this.overlayColor;\n\n if (isFiller(bgColor)) {\n if (!bgColor.excludeFromExport) {\n data.background = bgColor.toObject(propertiesToInclude);\n }\n } else if (bgColor) {\n data.background = bgColor;\n }\n\n if (isFiller(overlayColor)) {\n if (!overlayColor.excludeFromExport) {\n data.overlay = overlayColor.toObject(propertiesToInclude);\n }\n } else if (overlayColor) {\n data.overlay = overlayColor;\n }\n\n if (bgImage && !bgImage.excludeFromExport) {\n data.backgroundImage = this._toObject(\n bgImage,\n methodName,\n propertiesToInclude,\n );\n }\n if (overlayImage && !overlayImage.excludeFromExport) {\n data.overlayImage = this._toObject(\n overlayImage,\n methodName,\n propertiesToInclude,\n );\n }\n\n return data;\n }\n\n /* _TO_SVG_START_ */\n\n declare svgViewportTransformation: boolean;\n\n /**\n * Returns SVG representation of canvas\n * @function\n * @param {Object} [options] Options object for SVG output\n * @param {Boolean} [options.suppressPreamble=false] If true xml tag is not included\n * @param {Object} [options.viewBox] SVG viewbox object\n * @param {Number} [options.viewBox.x] x-coordinate of viewbox\n * @param {Number} [options.viewBox.y] y-coordinate of viewbox\n * @param {Number} [options.viewBox.width] Width of viewbox\n * @param {Number} [options.viewBox.height] Height of viewbox\n * @param {String} [options.encoding=UTF-8] Encoding of SVG output\n * @param {String} [options.width] desired width of svg with or without units\n * @param {String} [options.height] desired height of svg with or without units\n * @param {Function} [reviver] Method for further parsing of svg elements, called after each fabric object converted into svg representation.\n * @return {String} SVG string\n * @tutorial {@link http://fabricjs.com/fabric-intro-part-3#serialization}\n * @see {@link http://jsfiddle.net/fabricjs/jQ3ZZ/|jsFiddle demo}\n * @example Normal SVG output\n * var svg = canvas.toSVG();\n * @example SVG output without preamble (without <?xml ../>)\n * var svg = canvas.toSVG({suppressPreamble: true});\n * @example SVG output with viewBox attribute\n * var svg = canvas.toSVG({\n * viewBox: {\n * x: 100,\n * y: 100,\n * width: 200,\n * height: 300\n * }\n * });\n * @example SVG output with different encoding (default: UTF-8)\n * var svg = canvas.toSVG({encoding: 'ISO-8859-1'});\n * @example Modify SVG output with reviver function\n * var svg = canvas.toSVG(null, function(svg) {\n * return svg.replace('stroke-dasharray: ; stroke-linecap: butt; stroke-linejoin: miter; stroke-miterlimit: 10; ', '');\n * });\n */\n toSVG(options: TSVGExportOptions = {}, reviver?: TSVGReviver) {\n options.reviver = reviver;\n const markup: string[] = [];\n\n this._setSVGPreamble(markup, options);\n this._setSVGHeader(markup, options);\n if (this.clipPath) {\n markup.push(`\\n`);\n }\n this._setSVGBgOverlayColor(markup, 'background');\n this._setSVGBgOverlayImage(markup, 'backgroundImage', reviver);\n this._setSVGObjects(markup, reviver);\n if (this.clipPath) {\n markup.push('\\n');\n }\n this._setSVGBgOverlayColor(markup, 'overlay');\n this._setSVGBgOverlayImage(markup, 'overlayImage', reviver);\n\n markup.push('');\n\n return markup.join('');\n }\n\n /**\n * @private\n */\n _setSVGPreamble(markup: string[], options: TSVGExportOptions): void {\n if (options.suppressPreamble) {\n return;\n }\n markup.push(\n '\\n',\n '\\n',\n );\n }\n\n /**\n * @private\n */\n _setSVGHeader(markup: string[], options: TSVGExportOptions): void {\n const width = options.width || `${this.width}`,\n height = options.height || `${this.height}`,\n NUM_FRACTION_DIGITS = config.NUM_FRACTION_DIGITS,\n optViewBox = options.viewBox;\n let viewBox: string;\n if (optViewBox) {\n viewBox = `viewBox=\"${optViewBox.x} ${optViewBox.y} ${optViewBox.width} ${optViewBox.height}\" `;\n } else if (this.svgViewportTransformation) {\n const vpt = this.viewportTransform;\n viewBox = `viewBox=\"${toFixed(\n -vpt[4] / vpt[0],\n NUM_FRACTION_DIGITS,\n )} ${toFixed(-vpt[5] / vpt[3], NUM_FRACTION_DIGITS)} ${toFixed(\n this.width / vpt[0],\n NUM_FRACTION_DIGITS,\n )} ${toFixed(this.height / vpt[3], NUM_FRACTION_DIGITS)}\" `;\n } else {\n viewBox = `viewBox=\"0 0 ${this.width} ${this.height}\" `;\n }\n\n markup.push(\n '\\n',\n 'Created with Fabric.js ',\n VERSION,\n '\\n',\n '\\n',\n this.createSVGFontFacesMarkup(),\n this.createSVGRefElementsMarkup(),\n this.createSVGClipPathMarkup(options),\n '\\n',\n );\n }\n\n createSVGClipPathMarkup(options: TSVGExportOptions): string {\n const clipPath = this.clipPath;\n if (clipPath) {\n clipPath.clipPathId = `CLIPPATH_${uid()}`;\n return `\\n${clipPath.toClipPathSVG(\n options.reviver,\n )}\\n`;\n }\n return '';\n }\n\n /**\n * Creates markup containing SVG referenced elements like patterns, gradients etc.\n * @return {String}\n */\n createSVGRefElementsMarkup(): string {\n return (['background', 'overlay'] as const)\n .map((prop) => {\n const fill = this[`${prop}Color`];\n if (isFiller(fill)) {\n const shouldTransform = this[`${prop}Vpt`],\n vpt = this.viewportTransform,\n object = {\n // otherwise circular dependency\n isType: () => false,\n width: this.width / (shouldTransform ? vpt[0] : 1),\n height: this.height / (shouldTransform ? vpt[3] : 1),\n };\n return fill.toSVG(object as FabricObject, {\n additionalTransform: shouldTransform ? matrixToSVG(vpt) : '',\n });\n }\n })\n .join('');\n }\n\n /**\n * Creates markup containing SVG font faces,\n * font URLs for font faces must be collected by developers\n * and are not extracted from the DOM by fabricjs\n * @param {Array} objects Array of fabric objects\n * @return {String}\n */\n createSVGFontFacesMarkup(): string {\n const objects: FabricObject[] = [],\n fontList: Record = {},\n fontPaths = config.fontPaths;\n\n this._objects.forEach(function add(object) {\n objects.push(object);\n if (isCollection(object)) {\n object._objects.forEach(add);\n }\n });\n\n objects.forEach((obj) => {\n if (!isTextObject(obj)) {\n return;\n }\n const { styles, fontFamily } = obj;\n if (fontList[fontFamily] || !fontPaths[fontFamily]) {\n return;\n }\n fontList[fontFamily] = true;\n if (!styles) {\n return;\n }\n Object.values(styles).forEach((styleRow) => {\n Object.values(styleRow).forEach(({ fontFamily = '' }) => {\n if (!fontList[fontFamily] && fontPaths[fontFamily]) {\n fontList[fontFamily] = true;\n }\n });\n });\n });\n\n const fontListMarkup = Object.keys(fontList)\n .map(\n (fontFamily) =>\n `\\t\\t@font-face {\\n\\t\\t\\tfont-family: '${fontFamily}';\\n\\t\\t\\tsrc: url('${fontPaths[fontFamily]}');\\n\\t\\t}\\n`,\n )\n .join('');\n\n if (fontListMarkup) {\n return `\\t\\n`;\n }\n return '';\n }\n\n /**\n * @private\n */\n _setSVGObjects(markup: string[], reviver?: TSVGReviver) {\n this.forEachObject((fabricObject) => {\n if (fabricObject.excludeFromExport) {\n return;\n }\n this._setSVGObject(markup, fabricObject, reviver);\n });\n }\n\n /**\n * This is its own function because the Canvas ( non static ) requires extra code here\n * @private\n */\n _setSVGObject(\n markup: string[],\n instance: FabricObject,\n reviver?: TSVGReviver,\n ) {\n markup.push(instance.toSVG(reviver));\n }\n\n /**\n * @private\n */\n _setSVGBgOverlayImage(\n markup: string[],\n property: 'overlayImage' | 'backgroundImage',\n reviver?: TSVGReviver,\n ) {\n const bgOrOverlay = this[property];\n if (bgOrOverlay && !bgOrOverlay.excludeFromExport && bgOrOverlay.toSVG) {\n markup.push(bgOrOverlay.toSVG(reviver));\n }\n }\n\n /**\n * @TODO this seems to handle patterns but fail at gradients.\n * @private\n */\n _setSVGBgOverlayColor(markup: string[], property: 'background' | 'overlay') {\n const filler = this[`${property}Color`];\n if (!filler) {\n return;\n }\n if (isFiller(filler)) {\n const repeat = (filler as Pattern).repeat || '',\n finalWidth = this.width,\n finalHeight = this.height,\n shouldInvert = this[`${property}Vpt`],\n additionalTransform = shouldInvert\n ? matrixToSVG(invertTransform(this.viewportTransform))\n : '';\n markup.push(\n `\\n`,\n );\n } else {\n markup.push(\n '\\n',\n );\n }\n }\n /* _TO_SVG_END_ */\n\n /**\n * Populates canvas with data from the specified JSON.\n * JSON format must conform to the one of {@link fabric.Canvas#toJSON}\n *\n * **IMPORTANT**: It is recommended to abort loading tasks before calling this method to prevent race conditions and unnecessary networking\n *\n * @param {String|Object} json JSON string or object\n * @param {Function} [reviver] Method for further parsing of JSON elements, called after each fabric object created.\n * @param {Object} [options] options\n * @param {AbortSignal} [options.signal] see https://developer.mozilla.org/en-US/docs/Web/API/AbortController/signal\n * @return {Promise} instance\n * @tutorial {@link http://fabricjs.com/fabric-intro-part-3#deserialization}\n * @see {@link http://jsfiddle.net/fabricjs/fmgXt/|jsFiddle demo}\n * @example loadFromJSON\n * canvas.loadFromJSON(json).then((canvas) => canvas.requestRenderAll());\n * @example loadFromJSON with reviver\n * canvas.loadFromJSON(json, function(o, object) {\n * // `o` = json object\n * // `object` = fabric.Object instance\n * // ... do some stuff ...\n * }).then((canvas) => {\n * ... canvas is restored, add your code.\n * });\n *\n */\n loadFromJSON(\n json: string | Record,\n reviver?: EnlivenObjectOptions['reviver'],\n { signal }: Abortable = {},\n ): Promise {\n if (!json) {\n return Promise.reject(new FabricError('`json` is undefined'));\n }\n\n // parse json if it wasn't already\n const serialized = typeof json === 'string' ? JSON.parse(json) : json;\n const {\n objects = [],\n backgroundImage,\n background,\n overlayImage,\n overlay,\n clipPath,\n } = serialized;\n const renderOnAddRemove = this.renderOnAddRemove;\n this.renderOnAddRemove = false;\n\n return Promise.all([\n enlivenObjects(objects, {\n reviver,\n signal,\n }),\n enlivenObjectEnlivables(\n {\n backgroundImage,\n backgroundColor: background,\n overlayImage,\n overlayColor: overlay,\n clipPath,\n },\n { signal },\n ),\n ]).then(([enlived, enlivedMap]) => {\n this.clear();\n this.add(...enlived);\n this.set(serialized);\n this.set(enlivedMap);\n this.renderOnAddRemove = renderOnAddRemove;\n return this;\n });\n }\n\n /**\n * Clones canvas instance\n * @param {string[]} [properties] Array of properties to include in the cloned canvas and children\n */\n clone(properties: string[]) {\n const data = this.toObject(properties);\n const canvas = this.cloneWithoutData();\n return canvas.loadFromJSON(data);\n }\n\n /**\n * Clones canvas instance without cloning existing data.\n * This essentially copies canvas dimensions since loadFromJSON does not affect canvas size.\n */\n cloneWithoutData() {\n const el = createCanvasElementFor(this);\n return new (this.constructor as Constructor)(el);\n }\n\n /**\n * Exports canvas element to a dataurl image. Note that when multiplier is used, cropping is scaled appropriately\n * @param {Object} [options] Options object\n * @param {String} [options.format=png] The format of the output image. Either \"jpeg\" or \"png\"\n * @param {Number} [options.quality=1] Quality level (0..1). Only used for jpeg.\n * @param {Number} [options.multiplier=1] Multiplier to scale by, to have consistent\n * @param {Number} [options.left] Cropping left offset. Introduced in v1.2.14\n * @param {Number} [options.top] Cropping top offset. Introduced in v1.2.14\n * @param {Number} [options.width] Cropping width. Introduced in v1.2.14\n * @param {Number} [options.height] Cropping height. Introduced in v1.2.14\n * @param {Boolean} [options.enableRetinaScaling] Enable retina scaling for clone image. Introduce in 2.0.0\n * @param {(object: fabric.Object) => boolean} [options.filter] Function to filter objects.\n * @return {String} Returns a data: URL containing a representation of the object in the format specified by options.format\n * @see {@link https://jsfiddle.net/xsjua1rd/ demo}\n * @example Generate jpeg dataURL with lower quality\n * var dataURL = canvas.toDataURL({\n * format: 'jpeg',\n * quality: 0.8\n * });\n * @example Generate cropped png dataURL (clipping of canvas)\n * var dataURL = canvas.toDataURL({\n * format: 'png',\n * left: 100,\n * top: 100,\n * width: 200,\n * height: 200\n * });\n * @example Generate double scaled png dataURL\n * var dataURL = canvas.toDataURL({\n * format: 'png',\n * multiplier: 2\n * });\n * @example Generate dataURL with objects that overlap a specified object\n * var myObject;\n * var dataURL = canvas.toDataURL({\n * filter: (object) => object.isContainedWithinObject(myObject) || object.intersectsWithObject(myObject)\n * });\n */\n toDataURL(options = {} as TDataUrlOptions): string {\n const {\n format = 'png',\n quality = 1,\n multiplier = 1,\n enableRetinaScaling = false,\n } = options;\n const finalMultiplier =\n multiplier * (enableRetinaScaling ? this.getRetinaScaling() : 1);\n\n return toDataURL(\n this.toCanvasElement(finalMultiplier, options),\n format,\n quality,\n );\n }\n toBlob(options = {} as TDataUrlOptions): Promise {\n const {\n format = 'png',\n quality = 1,\n multiplier = 1,\n enableRetinaScaling = false,\n } = options;\n const finalMultiplier =\n multiplier * (enableRetinaScaling ? this.getRetinaScaling() : 1);\n\n return toBlob(\n this.toCanvasElement(finalMultiplier, options),\n format,\n quality,\n );\n }\n\n /**\n * Create a new HTMLCanvas element painted with the current canvas content.\n * No need to resize the actual one or repaint it.\n * Will transfer object ownership to a new canvas, paint it, and set everything back.\n * This is an intermediary step used to get to a dataUrl but also it is useful to\n * create quick image copies of a canvas without passing for the dataUrl string\n * @param {Number} [multiplier] a zoom factor.\n * @param {Object} [options] Cropping informations\n * @param {Number} [options.left] Cropping left offset.\n * @param {Number} [options.top] Cropping top offset.\n * @param {Number} [options.width] Cropping width.\n * @param {Number} [options.height] Cropping height.\n * @param {(object: fabric.Object) => boolean} [options.filter] Function to filter objects.\n */\n toCanvasElement(\n multiplier = 1,\n { width, height, left, top, filter } = {} as TToCanvasElementOptions,\n ): HTMLCanvasElement {\n const scaledWidth = (width || this.width) * multiplier,\n scaledHeight = (height || this.height) * multiplier,\n zoom = this.getZoom(),\n originalWidth = this.width,\n originalHeight = this.height,\n originalSkipControlsDrawing = this.skipControlsDrawing,\n newZoom = zoom * multiplier,\n vp = this.viewportTransform,\n translateX = (vp[4] - (left || 0)) * multiplier,\n translateY = (vp[5] - (top || 0)) * multiplier,\n newVp = [newZoom, 0, 0, newZoom, translateX, translateY] as TMat2D,\n originalRetina = this.enableRetinaScaling,\n canvasEl = createCanvasElementFor({\n width: scaledWidth,\n height: scaledHeight,\n }),\n objectsToRender = filter\n ? this._objects.filter((obj) => filter(obj))\n : this._objects;\n this.enableRetinaScaling = false;\n this.viewportTransform = newVp;\n this.width = scaledWidth;\n this.height = scaledHeight;\n this.skipControlsDrawing = true;\n this.calcViewportBoundaries();\n this.renderCanvas(canvasEl.getContext('2d')!, objectsToRender);\n this.viewportTransform = vp;\n this.width = originalWidth;\n this.height = originalHeight;\n this.calcViewportBoundaries();\n this.enableRetinaScaling = originalRetina;\n this.skipControlsDrawing = originalSkipControlsDrawing;\n return canvasEl;\n }\n\n /**\n * Waits until rendering has settled to destroy the canvas\n * @returns {Promise} a promise resolving to `true` once the canvas has been destroyed or to `false` if the canvas has was already destroyed\n * @throws if aborted by a consequent call\n */\n dispose() {\n !this.disposed &&\n this.elements.cleanupDOM({ width: this.width, height: this.height });\n runningAnimations.cancelByCanvas(this);\n this.disposed = true;\n return new Promise((resolve, reject) => {\n const task = () => {\n this.destroy();\n resolve(true);\n };\n task.kill = reject;\n if (this.__cleanupTask) {\n this.__cleanupTask.kill('aborted');\n }\n\n if (this.destroyed) {\n resolve(false);\n } else if (this.nextRenderHandle) {\n this.__cleanupTask = task;\n } else {\n task();\n }\n });\n }\n\n /**\n * Clears the canvas element, disposes objects and frees resources.\n *\n * Invoked as part of the **async** operation of {@link dispose}.\n *\n * **CAUTION**:\n *\n * This method is **UNSAFE**.\n * You may encounter a race condition using it if there's a requested render.\n * Call this method only if you are sure rendering has settled.\n * Consider using {@link dispose} as it is **SAFE**\n *\n * @private\n */\n destroy() {\n this.destroyed = true;\n this.cancelRequestedRender();\n this.forEachObject((object) => object.dispose());\n this._objects = [];\n if (this.backgroundImage) {\n this.backgroundImage.dispose();\n }\n this.backgroundImage = undefined;\n if (this.overlayImage) {\n this.overlayImage.dispose();\n }\n this.overlayImage = undefined;\n this.elements.dispose();\n }\n\n /**\n * Returns a string representation of an instance\n * @return {String} string representation of an instance\n */\n toString() {\n return `#`;\n }\n}\n","import type { TPointerEvent } from '../EventTypeDefs';\nimport { Point } from '../Point';\nimport { getScrollLeftTop } from './dom_misc';\n\nconst touchEvents = ['touchstart', 'touchmove', 'touchend'];\n\nfunction getTouchInfo(event: TouchEvent | MouseEvent): MouseEvent | Touch {\n const touchProp = (event as TouchEvent).changedTouches;\n if (touchProp && touchProp[0]) {\n return touchProp[0];\n }\n return event as MouseEvent;\n}\n\nexport const getPointer = (event: TPointerEvent): Point => {\n const element = event.target as HTMLElement,\n scroll = getScrollLeftTop(element),\n _evt = getTouchInfo(event);\n return new Point(_evt.clientX + scroll.left, _evt.clientY + scroll.top);\n};\n\nexport const isTouchEvent = (event: TPointerEvent) =>\n touchEvents.includes(event.type) ||\n (event as PointerEvent).pointerType === 'touch';\n\nexport const stopEvent = (e: Event) => {\n e.preventDefault();\n e.stopPropagation();\n};\n","import type { XY } from '../../Point';\nimport type { TBBox } from '../../typedefs';\n\n/**\n * Calculates bounding box (left, top, width, height) from given `points`\n * @param {XY[]} points\n * @return {Object} Object with left, top, width, height properties\n */\nexport const makeBoundingBoxFromPoints = (points: XY[]): TBBox => {\n let left = 0,\n top = 0,\n width = 0,\n height = 0;\n\n for (let i = 0, len = points.length; i < len; i++) {\n const { x, y } = points[i];\n if (x > width || !i) width = x;\n if (x < left || !i) left = x;\n if (y > height || !i) height = y;\n if (y < top || !i) top = y;\n }\n\n return {\n left,\n top,\n width: width - left,\n height: height - top,\n };\n};\n","import { Point } from '../../Point';\nimport { CENTER } from '../../constants';\nimport type { FabricObject } from '../../shapes/Object/Object';\nimport type { TMat2D } from '../../typedefs';\nimport { makeBoundingBoxFromPoints } from './boundingBoxFromPoints';\nimport {\n invertTransform,\n multiplyTransformMatrices,\n qrDecompose,\n} from './matrix';\n\n/**\n * given an object and a transform, apply the inverse transform to the object,\n * this is equivalent to remove from that object that transformation, so that\n * added in a space with the removed transform, the object will be the same as before.\n * Removing from an object a transform that scale by 2 is like scaling it by 1/2.\n * Removing from an object a transform that rotate by 30deg is like rotating by 30deg\n * in the opposite direction.\n * This util is used to add objects inside transformed groups or nested groups.\n * @param {FabricObject} object the object you want to transform\n * @param {TMat2D} transform the destination transform\n */\nexport const removeTransformFromObject = (\n object: FabricObject,\n transform: TMat2D,\n) => {\n const inverted = invertTransform(transform),\n finalTransform = multiplyTransformMatrices(\n inverted,\n object.calcOwnMatrix(),\n );\n applyTransformToObject(object, finalTransform);\n};\n\n/**\n * given an object and a transform, apply the transform to the object.\n * this is equivalent to change the space where the object is drawn.\n * Adding to an object a transform that scale by 2 is like scaling it by 2.\n * This is used when removing an object from an active selection for example.\n * @param {FabricObject} object the object you want to transform\n * @param {Array} transform the destination transform\n */\nexport const addTransformToObject = (object: FabricObject, transform: TMat2D) =>\n applyTransformToObject(\n object,\n multiplyTransformMatrices(transform, object.calcOwnMatrix()),\n );\n\n/**\n * discard an object transform state and apply the one from the matrix.\n * @param {FabricObject} object the object you want to transform\n * @param {Array} transform the destination transform\n */\nexport const applyTransformToObject = (\n object: FabricObject,\n transform: TMat2D,\n) => {\n const { translateX, translateY, scaleX, scaleY, ...otherOptions } =\n qrDecompose(transform),\n center = new Point(translateX, translateY);\n object.flipX = false;\n object.flipY = false;\n Object.assign(object, otherOptions);\n object.set({ scaleX, scaleY });\n object.setPositionByOrigin(center, CENTER, CENTER);\n};\n/**\n * reset an object transform state to neutral. Top and left are not accounted for\n * @param {FabricObject} target object to transform\n */\nexport const resetObjectTransform = (target: FabricObject) => {\n target.scaleX = 1;\n target.scaleY = 1;\n target.skewX = 0;\n target.skewY = 0;\n target.flipX = false;\n target.flipY = false;\n target.rotate(0);\n};\n\n/**\n * Extract Object transform values\n * @param {FabricObject} target object to read from\n * @return {Object} Components of transform\n */\nexport const saveObjectTransform = (target: FabricObject) => ({\n scaleX: target.scaleX,\n scaleY: target.scaleY,\n skewX: target.skewX,\n skewY: target.skewY,\n angle: target.angle,\n left: target.left,\n flipX: target.flipX,\n flipY: target.flipY,\n top: target.top,\n});\n\n/**\n * given a width and height, return the size of the bounding box\n * that can contains the box with width/height with applied transform.\n * Use to calculate the boxes around objects for controls.\n * @param {Number} width\n * @param {Number} height\n * @param {TMat2D} t\n * @returns {Point} size\n */\nexport const sizeAfterTransform = (\n width: number,\n height: number,\n t: TMat2D,\n) => {\n const dimX = width / 2,\n dimY = height / 2,\n points = [\n new Point(-dimX, -dimY),\n new Point(dimX, -dimY),\n new Point(-dimX, dimY),\n new Point(dimX, dimY),\n ].map((p) => p.transform(t)),\n bbox = makeBoundingBoxFromPoints(points);\n return new Point(bbox.width, bbox.height);\n};\n","import { iMatrix } from '../../constants';\nimport type { Point } from '../../Point';\nimport type { FabricObject } from '../../shapes/Object/Object';\nimport type { TMat2D } from '../../typedefs';\nimport { invertTransform, multiplyTransformMatrices } from './matrix';\nimport { applyTransformToObject } from './objectTransforms';\n\n/**\n * We are actually looking for the transformation from the destination plane to the source plane (change of basis matrix)\\\n * The object will exist on the destination plane and we want it to seem unchanged by it so we invert the destination matrix (`to`) and then apply the source matrix (`from`)\n * @param [from]\n * @param [to]\n * @returns\n */\nexport const calcPlaneChangeMatrix = (\n from: TMat2D = iMatrix,\n to: TMat2D = iMatrix,\n) => multiplyTransformMatrices(invertTransform(to), from);\n\n/**\n * Sends a point from the source coordinate plane to the destination coordinate plane.\\\n * From the canvas/viewer's perspective the point remains unchanged.\n *\n * @example Send point from canvas plane to group plane\n * var obj = new Rect({ left: 20, top: 20, width: 60, height: 60, strokeWidth: 0 });\n * var group = new Group([obj], { strokeWidth: 0 });\n * var sentPoint1 = sendPointToPlane(new Point(50, 50), undefined, group.calcTransformMatrix());\n * var sentPoint2 = sendPointToPlane(new Point(50, 50), iMatrix, group.calcTransformMatrix());\n * console.log(sentPoint1, sentPoint2) // both points print (0,0) which is the center of group\n *\n * @param {Point} point\n * @param {TMat2D} [from] plane matrix containing object. Passing `undefined` is equivalent to passing the identity matrix, which means `point` exists in the canvas coordinate plane.\n * @param {TMat2D} [to] destination plane matrix to contain object. Passing `undefined` means `point` should be sent to the canvas coordinate plane.\n * @returns {Point} transformed point\n */\nexport const sendPointToPlane = (\n point: Point,\n from: TMat2D = iMatrix,\n to: TMat2D = iMatrix,\n): Point => point.transform(calcPlaneChangeMatrix(from, to));\n\n/**\n * See {@link sendPointToPlane}\n */\nexport const sendVectorToPlane = (\n point: Point,\n from: TMat2D = iMatrix,\n to: TMat2D = iMatrix,\n): Point => point.transform(calcPlaneChangeMatrix(from, to), true);\n\n/**\n *\n * A util that abstracts applying transform to objects.\\\n * Sends `object` to the destination coordinate plane by applying the relevant transformations.\\\n * Changes the space/plane where `object` is drawn.\\\n * From the canvas/viewer's perspective `object` remains unchanged.\n *\n * @example Move clip path from one object to another while preserving it's appearance as viewed by canvas/viewer\n * let obj, obj2;\n * let clipPath = new Circle({ radius: 50 });\n * obj.clipPath = clipPath;\n * // render\n * sendObjectToPlane(clipPath, obj.calcTransformMatrix(), obj2.calcTransformMatrix());\n * obj.clipPath = undefined;\n * obj2.clipPath = clipPath;\n * // render, clipPath now clips obj2 but seems unchanged from the eyes of the viewer\n *\n * @example Clip an object's clip path with an existing object\n * let obj, existingObj;\n * let clipPath = new Circle({ radius: 50 });\n * obj.clipPath = clipPath;\n * let transformTo = multiplyTransformMatrices(obj.calcTransformMatrix(), clipPath.calcTransformMatrix());\n * sendObjectToPlane(existingObj, existingObj.group?.calcTransformMatrix(), transformTo);\n * clipPath.clipPath = existingObj;\n *\n * @param {FabricObject} object\n * @param {Matrix} [from] plane matrix containing object. Passing `undefined` is equivalent to passing the identity matrix, which means `object` is a direct child of canvas.\n * @param {Matrix} [to] destination plane matrix to contain object. Passing `undefined` means `object` should be sent to the canvas coordinate plane.\n * @returns {Matrix} the transform matrix that was applied to `object`\n */\nexport const sendObjectToPlane = (\n object: FabricObject,\n from?: TMat2D,\n to?: TMat2D,\n): TMat2D => {\n const t = calcPlaneChangeMatrix(from, to);\n applyTransformToObject(\n object,\n multiplyTransformMatrices(t, object.calcOwnMatrix()),\n );\n return t;\n};\n","import type {\n ObjectModificationEvents,\n TModificationEvents,\n} from '../EventTypeDefs';\n\nexport const fireEvent = (\n eventName: TModificationEvents,\n options: ObjectModificationEvents[typeof eventName],\n) => {\n const {\n transform: { target },\n } = options;\n target.canvas?.fire(`object:${eventName}`, {\n ...options,\n target,\n });\n target.fire(eventName, options);\n};\n","import type { TOriginX, TOriginY } from '../../typedefs';\n\nconst originOffset = {\n left: -0.5,\n top: -0.5,\n center: 0,\n bottom: 0.5,\n right: 0.5,\n};\n/**\n * Resolves origin value relative to center\n * @private\n * @param {TOriginX | TOriginY} originValue originX / originY\n * @returns number\n */\n\nexport const resolveOrigin = (\n originValue: TOriginX | TOriginY | number,\n): number =>\n typeof originValue === 'string'\n ? originOffset[originValue]\n : originValue - 0.5;\n","import type { XY } from '../../Point';\nimport { Point } from '../../Point';\nimport type { TRadian } from '../../typedefs';\n\nconst unitVectorX = new Point(1, 0);\nconst zero = new Point();\n\n/**\n * Rotates `vector` with `radians`\n * @param {Point} vector The vector to rotate (x and y)\n * @param {Number} radians The radians of the angle for the rotation\n * @return {Point} The new rotated point\n */\nexport const rotateVector = (vector: Point, radians: TRadian) =>\n vector.rotate(radians);\n\n/**\n * Creates a vector from points represented as a point\n *\n * @param {Point} from\n * @param {Point} to\n * @returns {Point} vector\n */\nexport const createVector = (from: XY, to: XY): Point =>\n new Point(to).subtract(from);\n\n/**\n * return the magnitude of a vector\n * @return {number}\n */\nexport const magnitude = (point: Point) => point.distanceFrom(zero);\n\n/**\n * Calculates the angle between 2 vectors\n * @param {Point} a\n * @param {Point} b\n * @returns the angle in radians from `a` to `b`\n */\nexport const calcAngleBetweenVectors = (a: Point, b: Point): TRadian =>\n Math.atan2(crossProduct(a, b), dotProduct(a, b)) as TRadian;\n\n/**\n * Calculates the angle between the x axis and the vector\n * @param {Point} v\n * @returns the angle in radians of `v`\n */\nexport const calcVectorRotation = (v: Point) =>\n calcAngleBetweenVectors(unitVectorX, v);\n\n/**\n * @param {Point} v\n * @returns {Point} vector representing the unit vector pointing to the direction of `v`\n */\nexport const getUnitVector = (v: Point): Point =>\n v.eq(zero) ? v : v.scalarDivide(magnitude(v));\n\n/**\n * @param {Point} v\n * @param {Boolean} [counterClockwise] the direction of the orthogonal vector, defaults to `true`\n * @returns {Point} the unit orthogonal vector\n */\nexport const getOrthonormalVector = (\n v: Point,\n counterClockwise = true,\n): Point =>\n getUnitVector(new Point(-v.y, v.x).scalarMultiply(counterClockwise ? 1 : -1));\n\n/**\n * Cross product of two vectors in 2D\n * @param {Point} a\n * @param {Point} b\n * @returns {number} the magnitude of Z vector\n */\nexport const crossProduct = (a: Point, b: Point): number =>\n a.x * b.y - a.y * b.x;\n\n/**\n * Dot product of two vectors in 2D\n * @param {Point} a\n * @param {Point} b\n * @returns {number}\n */\nexport const dotProduct = (a: Point, b: Point): number => a.x * b.x + a.y * b.y;\n\n/**\n * Checks if the vector is between two others. It is considered\n * to be inside when the vector to be tested is between the\n * initial vector and the final vector (included) in a counterclockwise direction.\n * @param {Point} t vector to be tested\n * @param {Point} a initial vector\n * @param {Point} b final vector\n * @returns {boolean} true if the vector is among the others\n */\nexport const isBetweenVectors = (t: Point, a: Point, b: Point): boolean => {\n if (t.eq(a) || t.eq(b)) return true;\n const AxB = crossProduct(a, b),\n AxT = crossProduct(a, t),\n BxT = crossProduct(b, t);\n return AxB >= 0 ? AxT >= 0 && BxT <= 0 : !(AxT <= 0 && BxT >= 0);\n};\n","import type {\n TPointerEvent,\n Transform,\n TransformAction,\n BasicTransformEvent,\n} from '../EventTypeDefs';\nimport { resolveOrigin } from '../util/misc/resolveOrigin';\nimport { Point } from '../Point';\nimport type { FabricObject } from '../shapes/Object/FabricObject';\nimport type { TOriginX, TOriginY } from '../typedefs';\nimport { degreesToRadians } from '../util/misc/radiansDegreesConversion';\nimport type { Control } from './Control';\nimport { CENTER, quarterPI, twoMathPi } from '../constants';\nimport { calcVectorRotation, createVector } from '../util/misc/vectors';\nimport type { TOCoord } from '../shapes/Object/InteractiveObject';\nimport { sendPointToPlane } from '../util/misc/planeChange';\n\nexport const NOT_ALLOWED_CURSOR = 'not-allowed';\n\n/**\n * @param {Boolean} alreadySelected true if target is already selected\n * @param {String} corner a string representing the corner ml, mr, tl ...\n * @param {Event} e Event object\n * @param {FabricObject} [target] inserted back to help overriding. Unused\n */\nexport const getActionFromCorner = (\n alreadySelected: boolean,\n corner: string | undefined,\n e: TPointerEvent,\n target: FabricObject,\n) => {\n if (!corner || !alreadySelected) {\n return 'drag';\n }\n const control = target.controls[corner];\n return control.getActionName(e, control, target);\n};\n\n/**\n * Checks if transform is centered\n * @param {Object} transform transform data\n * @return {Boolean} true if transform is centered\n */\nexport function isTransformCentered(transform: Transform) {\n return (\n resolveOrigin(transform.originX) === resolveOrigin(CENTER) &&\n resolveOrigin(transform.originY) === resolveOrigin(CENTER)\n );\n}\n\nexport function invertOrigin(origin: TOriginX | TOriginY) {\n return -resolveOrigin(origin) + 0.5;\n}\n\nexport const isLocked = (\n target: FabricObject,\n lockingKey:\n | 'lockMovementX'\n | 'lockMovementY'\n | 'lockRotation'\n | 'lockScalingX'\n | 'lockScalingY'\n | 'lockSkewingX'\n | 'lockSkewingY'\n | 'lockScalingFlip',\n) => target[lockingKey];\n\nexport const commonEventInfo: TransformAction<\n Transform,\n BasicTransformEvent\n> = (eventData, transform, x, y) => {\n return {\n e: eventData,\n transform,\n pointer: new Point(x, y),\n };\n};\n\n/**\n * Combine control position and object angle to find the control direction compared\n * to the object center.\n * @param {FabricObject} fabricObject the fabric object for which we are rendering controls\n * @param {Control} control the control class\n * @return {Number} 0 - 7 a quadrant number\n */\nexport function findCornerQuadrant(\n fabricObject: FabricObject,\n control: Control,\n coord: TOCoord,\n): number {\n const target = coord;\n const center = sendPointToPlane(\n fabricObject.getCenterPoint(),\n fabricObject.canvas!.viewportTransform,\n undefined,\n );\n const angle = calcVectorRotation(createVector(center, target)) + twoMathPi;\n return Math.round((angle % twoMathPi) / quarterPI);\n}\n\n/**\n * @returns the normalized point (rotated relative to center) in local coordinates\n */\nfunction normalizePoint(\n target: FabricObject,\n point: Point,\n originX: TOriginX,\n originY: TOriginY,\n): Point {\n const center = target.getRelativeCenterPoint(),\n p =\n typeof originX !== 'undefined' && typeof originY !== 'undefined'\n ? target.translateToGivenOrigin(\n center,\n CENTER,\n CENTER,\n originX,\n originY,\n )\n : new Point(target.left, target.top),\n p2 = target.angle\n ? point.rotate(-degreesToRadians(target.angle), center)\n : point;\n return p2.subtract(p);\n}\n\n/**\n * Transforms a point to the offset from the given origin\n * @param {Object} transform\n * @param {String} originX\n * @param {String} originY\n * @param {number} x\n * @param {number} y\n * @return {Fabric.Point} the normalized point\n */\nexport function getLocalPoint(\n { target, corner }: Transform,\n originX: TOriginX,\n originY: TOriginY,\n x: number,\n y: number,\n) {\n const control = target.controls[corner],\n zoom = target.canvas?.getZoom() || 1,\n padding = target.padding / zoom,\n localPoint = normalizePoint(target, new Point(x, y), originX, originY);\n if (localPoint.x >= padding) {\n localPoint.x -= padding;\n }\n if (localPoint.x <= -padding) {\n localPoint.x += padding;\n }\n if (localPoint.y >= padding) {\n localPoint.y -= padding;\n }\n if (localPoint.y <= padding) {\n localPoint.y += padding;\n }\n localPoint.x -= control.offsetX;\n localPoint.y -= control.offsetY;\n return localPoint;\n}\n","import type { TransformActionHandler } from '../EventTypeDefs';\nimport { LEFT, TOP, MOVING } from '../constants';\nimport { fireEvent } from './fireEvent';\nimport { commonEventInfo, isLocked } from './util';\n\n/**\n * Action handler\n * @private\n * @param {Event} eventData javascript event that is doing the transform\n * @param {Object} transform javascript object containing a series of information around the current transform\n * @param {number} x current mouse x position, canvas normalized\n * @param {number} y current mouse y position, canvas normalized\n * @return {Boolean} true if the translation occurred\n */\nexport const dragHandler: TransformActionHandler = (\n eventData,\n transform,\n x,\n y,\n) => {\n const { target, offsetX, offsetY } = transform,\n newLeft = x - offsetX,\n newTop = y - offsetY,\n moveX = !isLocked(target, 'lockMovementX') && target.left !== newLeft,\n moveY = !isLocked(target, 'lockMovementY') && target.top !== newTop;\n moveX && target.set(LEFT, newLeft);\n moveY && target.set(TOP, newTop);\n if (moveX || moveY) {\n fireEvent(MOVING, commonEventInfo(eventData, transform, x, y));\n }\n return moveX || moveY;\n};\n","/**\n * Map of the 148 color names with HEX code\n * @see: https://www.w3.org/TR/css3-color/#svg-color\n */\nexport const ColorNameMap = {\n aliceblue: '#F0F8FF',\n antiquewhite: '#FAEBD7',\n aqua: '#0FF',\n aquamarine: '#7FFFD4',\n azure: '#F0FFFF',\n beige: '#F5F5DC',\n bisque: '#FFE4C4',\n black: '#000',\n blanchedalmond: '#FFEBCD',\n blue: '#00F',\n blueviolet: '#8A2BE2',\n brown: '#A52A2A',\n burlywood: '#DEB887',\n cadetblue: '#5F9EA0',\n chartreuse: '#7FFF00',\n chocolate: '#D2691E',\n coral: '#FF7F50',\n cornflowerblue: '#6495ED',\n cornsilk: '#FFF8DC',\n crimson: '#DC143C',\n cyan: '#0FF',\n darkblue: '#00008B',\n darkcyan: '#008B8B',\n darkgoldenrod: '#B8860B',\n darkgray: '#A9A9A9',\n darkgrey: '#A9A9A9',\n darkgreen: '#006400',\n darkkhaki: '#BDB76B',\n darkmagenta: '#8B008B',\n darkolivegreen: '#556B2F',\n darkorange: '#FF8C00',\n darkorchid: '#9932CC',\n darkred: '#8B0000',\n darksalmon: '#E9967A',\n darkseagreen: '#8FBC8F',\n darkslateblue: '#483D8B',\n darkslategray: '#2F4F4F',\n darkslategrey: '#2F4F4F',\n darkturquoise: '#00CED1',\n darkviolet: '#9400D3',\n deeppink: '#FF1493',\n deepskyblue: '#00BFFF',\n dimgray: '#696969',\n dimgrey: '#696969',\n dodgerblue: '#1E90FF',\n firebrick: '#B22222',\n floralwhite: '#FFFAF0',\n forestgreen: '#228B22',\n fuchsia: '#F0F',\n gainsboro: '#DCDCDC',\n ghostwhite: '#F8F8FF',\n gold: '#FFD700',\n goldenrod: '#DAA520',\n gray: '#808080',\n grey: '#808080',\n green: '#008000',\n greenyellow: '#ADFF2F',\n honeydew: '#F0FFF0',\n hotpink: '#FF69B4',\n indianred: '#CD5C5C',\n indigo: '#4B0082',\n ivory: '#FFFFF0',\n khaki: '#F0E68C',\n lavender: '#E6E6FA',\n lavenderblush: '#FFF0F5',\n lawngreen: '#7CFC00',\n lemonchiffon: '#FFFACD',\n lightblue: '#ADD8E6',\n lightcoral: '#F08080',\n lightcyan: '#E0FFFF',\n lightgoldenrodyellow: '#FAFAD2',\n lightgray: '#D3D3D3',\n lightgrey: '#D3D3D3',\n lightgreen: '#90EE90',\n lightpink: '#FFB6C1',\n lightsalmon: '#FFA07A',\n lightseagreen: '#20B2AA',\n lightskyblue: '#87CEFA',\n lightslategray: '#789',\n lightslategrey: '#789',\n lightsteelblue: '#B0C4DE',\n lightyellow: '#FFFFE0',\n lime: '#0F0',\n limegreen: '#32CD32',\n linen: '#FAF0E6',\n magenta: '#F0F',\n maroon: '#800000',\n mediumaquamarine: '#66CDAA',\n mediumblue: '#0000CD',\n mediumorchid: '#BA55D3',\n mediumpurple: '#9370DB',\n mediumseagreen: '#3CB371',\n mediumslateblue: '#7B68EE',\n mediumspringgreen: '#00FA9A',\n mediumturquoise: '#48D1CC',\n mediumvioletred: '#C71585',\n midnightblue: '#191970',\n mintcream: '#F5FFFA',\n mistyrose: '#FFE4E1',\n moccasin: '#FFE4B5',\n navajowhite: '#FFDEAD',\n navy: '#000080',\n oldlace: '#FDF5E6',\n olive: '#808000',\n olivedrab: '#6B8E23',\n orange: '#FFA500',\n orangered: '#FF4500',\n orchid: '#DA70D6',\n palegoldenrod: '#EEE8AA',\n palegreen: '#98FB98',\n paleturquoise: '#AFEEEE',\n palevioletred: '#DB7093',\n papayawhip: '#FFEFD5',\n peachpuff: '#FFDAB9',\n peru: '#CD853F',\n pink: '#FFC0CB',\n plum: '#DDA0DD',\n powderblue: '#B0E0E6',\n purple: '#800080',\n rebeccapurple: '#639',\n red: '#F00',\n rosybrown: '#BC8F8F',\n royalblue: '#4169E1',\n saddlebrown: '#8B4513',\n salmon: '#FA8072',\n sandybrown: '#F4A460',\n seagreen: '#2E8B57',\n seashell: '#FFF5EE',\n sienna: '#A0522D',\n silver: '#C0C0C0',\n skyblue: '#87CEEB',\n slateblue: '#6A5ACD',\n slategray: '#708090',\n slategrey: '#708090',\n snow: '#FFFAFA',\n springgreen: '#00FF7F',\n steelblue: '#4682B4',\n tan: '#D2B48C',\n teal: '#008080',\n thistle: '#D8BFD8',\n tomato: '#FF6347',\n turquoise: '#40E0D0',\n violet: '#EE82EE',\n wheat: '#F5DEB3',\n white: '#FFF',\n whitesmoke: '#F5F5F5',\n yellow: '#FF0',\n yellowgreen: '#9ACD32',\n};\n","import type { TRGBAColorSource } from './typedefs';\n\n/**\n * @param {Number} p\n * @param {Number} q\n * @param {Number} t\n * @return {Number}\n */\nexport const hue2rgb = (p: number, q: number, t: number): number => {\n if (t < 0) {\n t += 1;\n }\n if (t > 1) {\n t -= 1;\n }\n if (t < 1 / 6) {\n return p + (q - p) * 6 * t;\n }\n if (t < 1 / 2) {\n return q;\n }\n if (t < 2 / 3) {\n return p + (q - p) * (2 / 3 - t) * 6;\n }\n return p;\n};\n\n/**\n * Adapted from {@link https://gist.github.com/mjackson/5311256 https://gist.github.com/mjackson}\n * @param {Number} r Red color value\n * @param {Number} g Green color value\n * @param {Number} b Blue color value\n * @param {Number} a Alpha color value pass through\n * @return {TRGBColorSource} Hsl color\n */\nexport const rgb2Hsl = (\n r: number,\n g: number,\n b: number,\n a: number,\n): TRGBAColorSource => {\n r /= 255;\n g /= 255;\n b /= 255;\n const maxValue = Math.max(r, g, b),\n minValue = Math.min(r, g, b);\n\n let h!: number, s: number;\n const l = (maxValue + minValue) / 2;\n\n if (maxValue === minValue) {\n h = s = 0; // achromatic\n } else {\n const d = maxValue - minValue;\n s = l > 0.5 ? d / (2 - maxValue - minValue) : d / (maxValue + minValue);\n switch (maxValue) {\n case r:\n h = (g - b) / d + (g < b ? 6 : 0);\n break;\n case g:\n h = (b - r) / d + 2;\n break;\n case b:\n h = (r - g) / d + 4;\n break;\n }\n h /= 6;\n }\n\n return [Math.round(h * 360), Math.round(s * 100), Math.round(l * 100), a];\n};\n\nexport const fromAlphaToFloat = (value = '1') =>\n parseFloat(value) / (value.endsWith('%') ? 100 : 1);\n\n/**\n * Convert a value in the inclusive range [0, 255] to hex\n */\nexport const hexify = (value: number) =>\n Math.min(Math.round(value), 255).toString(16).toUpperCase().padStart(2, '0');\n\n/**\n * Calculate the grey average value for rgb and pass through alpha\n */\nexport const greyAverage = ([\n r,\n g,\n b,\n a = 1,\n]: TRGBAColorSource): TRGBAColorSource => {\n const avg = Math.round(r * 0.3 + g * 0.59 + b * 0.11);\n return [avg, avg, avg, a];\n};\n","import { radiansToDegrees } from '../util/misc/radiansDegreesConversion';\nimport { ColorNameMap } from './color_map';\nimport { reHSLa, reHex, reRGBa } from './constants';\nimport type { TRGBAColorSource, TColorArg } from './typedefs';\nimport {\n hue2rgb,\n hexify,\n rgb2Hsl,\n fromAlphaToFloat,\n greyAverage,\n} from './util';\n\n/**\n * @class Color common color operations\n * @tutorial {@link http://fabricjs.com/fabric-intro-part-2/#colors colors}\n */\nexport class Color {\n declare private _source: TRGBAColorSource;\n isUnrecognised = false;\n\n /**\n *\n * @param {string} [color] optional in hex or rgb(a) or hsl format or from known color list\n */\n constructor(color?: TColorArg) {\n if (!color) {\n // we default to black as canvas does\n this.setSource([0, 0, 0, 1]);\n } else if (color instanceof Color) {\n this.setSource([...color._source]);\n } else if (Array.isArray(color)) {\n const [r, g, b, a = 1] = color;\n this.setSource([r, g, b, a]);\n } else {\n this.setSource(this._tryParsingColor(color));\n }\n }\n\n /**\n * @private\n * @param {string} [color] Color value to parse\n * @returns {TRGBAColorSource}\n */\n protected _tryParsingColor(color: string) {\n color = color.toLowerCase();\n if (color in ColorNameMap) {\n color = ColorNameMap[color as keyof typeof ColorNameMap];\n }\n return color === 'transparent'\n ? ([255, 255, 255, 0] as TRGBAColorSource)\n : Color.sourceFromHex(color) ||\n Color.sourceFromRgb(color) ||\n Color.sourceFromHsl(color) ||\n // color is not recognized\n // we default to black as canvas does\n // eslint-disable-next-line no-constant-binary-expression\n ((this.isUnrecognised = true) && ([0, 0, 0, 1] as TRGBAColorSource));\n }\n\n /**\n * Returns source of this color (where source is an array representation; ex: [200, 200, 100, 1])\n * @return {TRGBAColorSource}\n */\n getSource() {\n return this._source;\n }\n\n /**\n * Sets source of this color (where source is an array representation; ex: [200, 200, 100, 1])\n * @param {TRGBAColorSource} source\n */\n setSource(source: TRGBAColorSource) {\n this._source = source;\n }\n\n /**\n * Returns color representation in RGB format\n * @return {String} ex: rgb(0-255,0-255,0-255)\n */\n toRgb() {\n const [r, g, b] = this.getSource();\n return `rgb(${r},${g},${b})`;\n }\n\n /**\n * Returns color representation in RGBA format\n * @return {String} ex: rgba(0-255,0-255,0-255,0-1)\n */\n toRgba() {\n return `rgba(${this.getSource().join(',')})`;\n }\n\n /**\n * Returns color representation in HSL format\n * @return {String} ex: hsl(0-360,0%-100%,0%-100%)\n */\n toHsl() {\n const [h, s, l] = rgb2Hsl(...this.getSource());\n return `hsl(${h},${s}%,${l}%)`;\n }\n\n /**\n * Returns color representation in HSLA format\n * @return {String} ex: hsla(0-360,0%-100%,0%-100%,0-1)\n */\n toHsla() {\n const [h, s, l, a] = rgb2Hsl(...this.getSource());\n return `hsla(${h},${s}%,${l}%,${a})`;\n }\n\n /**\n * Returns color representation in HEX format\n * @return {String} ex: FF5555\n */\n toHex() {\n const fullHex = this.toHexa();\n return fullHex.slice(0, 6);\n }\n\n /**\n * Returns color representation in HEXA format\n * @return {String} ex: FF5555CC\n */\n toHexa() {\n const [r, g, b, a] = this.getSource();\n return `${hexify(r)}${hexify(g)}${hexify(b)}${hexify(Math.round(a * 255))}`;\n }\n\n /**\n * Gets value of alpha channel for this color\n * @return {Number} 0-1\n */\n getAlpha() {\n return this.getSource()[3];\n }\n\n /**\n * Sets value of alpha channel for this color\n * @param {Number} alpha Alpha value 0-1\n * @return {Color} thisArg\n */\n setAlpha(alpha: number) {\n this._source[3] = alpha;\n return this;\n }\n\n /**\n * Transforms color to its grayscale representation\n * @return {Color} thisArg\n */\n toGrayscale() {\n this.setSource(greyAverage(this.getSource()));\n return this;\n }\n\n /**\n * Transforms color to its black and white representation\n * @param {Number} threshold\n * @return {Color} thisArg\n */\n toBlackWhite(threshold: number) {\n const [average, , , a] = greyAverage(this.getSource()),\n bOrW = average < (threshold || 127) ? 0 : 255;\n this.setSource([bOrW, bOrW, bOrW, a]);\n return this;\n }\n\n /**\n * Overlays color with another color\n * @param {String|Color} otherColor\n * @return {Color} thisArg\n */\n overlayWith(otherColor: string | Color) {\n if (!(otherColor instanceof Color)) {\n otherColor = new Color(otherColor);\n }\n\n const source = this.getSource(),\n otherAlpha = 0.5,\n otherSource = otherColor.getSource(),\n [R, G, B] = source.map((value, index) =>\n Math.round(value * (1 - otherAlpha) + otherSource[index] * otherAlpha),\n );\n\n this.setSource([R, G, B, source[3]]);\n return this;\n }\n\n /**\n * Returns new color object, when given a color in RGB format\n * @param {String} color Color value ex: rgb(0-255,0-255,0-255)\n * @return {Color}\n */\n static fromRgb(color: string): Color {\n return Color.fromRgba(color);\n }\n\n /**\n * Returns new color object, when given a color in RGBA format\n * @function\n * @param {String} color\n * @return {Color}\n */\n static fromRgba(color: string): Color {\n return new Color(Color.sourceFromRgb(color));\n }\n\n /**\n * Returns array representation (ex: [100, 100, 200, 1]) of a color that's in RGB or RGBA format\n * @param {String} color Color value ex: rgb(0-255,0-255,0-255), rgb(0%-100%,0%-100%,0%-100%)\n * @return {TRGBAColorSource | undefined} source\n */\n static sourceFromRgb(color: string): TRGBAColorSource | undefined {\n const match = color.match(reRGBa());\n if (match) {\n const [r, g, b] = match.slice(1, 4).map((value) => {\n const parsedValue = parseFloat(value);\n return value.endsWith('%')\n ? Math.round(parsedValue * 2.55)\n : parsedValue;\n });\n return [r, g, b, fromAlphaToFloat(match[4])];\n }\n }\n\n /**\n * Returns new color object, when given a color in HSL format\n * @param {String} color Color value ex: hsl(0-260,0%-100%,0%-100%)\n * @return {Color}\n */\n static fromHsl(color: string): Color {\n return Color.fromHsla(color);\n }\n\n /**\n * Returns new color object, when given a color in HSLA format\n * @function\n * @param {String} color\n * @return {Color}\n */\n static fromHsla(color: string): Color {\n return new Color(Color.sourceFromHsl(color));\n }\n\n /**\n * Returns array representation (ex: [100, 100, 200, 1]) of a color that's in HSL or HSLA format.\n * Adapted from https://github.com/mjijackson\n * @param {String} color Color value ex: hsl(0-360,0%-100%,0%-100%) or hsla(0-360,0%-100%,0%-100%, 0-1)\n * @return {TRGBAColorSource | undefined} source\n * @see http://http://www.w3.org/TR/css3-color/#hsl-color\n */\n static sourceFromHsl(color: string): TRGBAColorSource | undefined {\n const match = color.match(reHSLa());\n if (!match) {\n return;\n }\n const match1degrees = Color.parseAngletoDegrees(match[1]);\n\n const h = (((match1degrees % 360) + 360) % 360) / 360,\n s = parseFloat(match[2]) / 100,\n l = parseFloat(match[3]) / 100;\n let r: number, g: number, b: number;\n\n if (s === 0) {\n r = g = b = l;\n } else {\n const q = l <= 0.5 ? l * (s + 1) : l + s - l * s,\n p = l * 2 - q;\n\n r = hue2rgb(p, q, h + 1 / 3);\n g = hue2rgb(p, q, h);\n b = hue2rgb(p, q, h - 1 / 3);\n }\n\n return [\n Math.round(r * 255),\n Math.round(g * 255),\n Math.round(b * 255),\n fromAlphaToFloat(match[4]),\n ];\n }\n\n /**\n * Returns new color object, when given a color in HEX format\n * @param {String} color Color value ex: FF5555\n * @return {Color}\n */\n static fromHex(color: string): Color {\n return new Color(Color.sourceFromHex(color));\n }\n\n /**\n * Returns array representation (ex: [100, 100, 200, 1]) of a color that's in HEX format\n * @param {String} color ex: FF5555 or FF5544CC (RGBa)\n * @return {TRGBAColorSource | undefined} source\n */\n static sourceFromHex(color: string): TRGBAColorSource | undefined {\n if (color.match(reHex())) {\n const value = color.slice(color.indexOf('#') + 1),\n isShortNotation = value.length <= 4;\n let expandedValue: string[];\n if (isShortNotation) {\n expandedValue = value.split('').map((hex) => hex + hex);\n } else {\n expandedValue = value.match(/.{2}/g)!;\n }\n const [r, g, b, a = 255] = expandedValue.map((hexCouple) =>\n parseInt(hexCouple, 16),\n );\n return [r, g, b, a / 255];\n }\n }\n\n /**\n * Converts a string that could be any angle notation (50deg, 0.5turn, 2rad)\n * into degrees without the 'deg' suffix\n * @param {String} value ex: 0deg, 0.5turn, 2rad\n * @return {Number} number in degrees or NaN if inputs are invalid\n */\n static parseAngletoDegrees(value: string): number {\n const lowercase = value.toLowerCase();\n const numeric = parseFloat(lowercase);\n\n if (lowercase.includes('rad')) {\n return radiansToDegrees(numeric);\n }\n\n if (lowercase.includes('turn')) {\n return numeric * 360;\n }\n\n // Value is probably just a number already in degrees eg '50'\n return numeric;\n }\n}\n","/**\n * Regex matching color in RGB or RGBA formats (ex: `rgb(0, 0, 0)`, `rgba(255, 100, 10, 0.5)`, `rgba( 255 , 100 , 10 , 0.5 )`, `rgb(1,1,1)`, `rgba(100%, 60%, 10%, 0.5)`)\n * Also matching rgba(r g b / a) as per new specs\n * https://developer.mozilla.org/en-US/docs/Web/CSS/color_value/rgb\n * Formal syntax at the time of writing:\n * =\n * rgb( [ | none ]{3} [ / [ | none ] ]? ) |\n * rgb( [ | none ]{3} [ / [ | none ] ]? )\n * = | \n *\n * For learners this is how you can read this regex\n * Regular expression for matching an rgba or rgb CSS color value\n *\n * /^ # Beginning of the string\n * rgba? # \"rgb\" or \"rgba\"\n * \\(\\s* # Opening parenthesis and optional whitespace\n * (\\d{0,3} # 0 to three digits R channel\n * (?:\\.\\d+)? # Optional decimal with one or more digits\n * ) # End of capturing group for the first color component\n * %? # Optional percent sign after the first color component\n * \\s* # Optional whitespace\n * [\\s|,] # Separator between color components can be a space or comma\n * \\s* # Optional whitespace\n * (\\d{0,3} # 0 to three digits G channel\n * (?:\\.\\d+)? # Optional decimal with one or more digits\n * ) # End of capturing group for the second color component\n * %? # Optional percent sign after the second color component\n * \\s* # Optional whitespace\n * [\\s|,] # Separator between color components can be a space or comma\n * \\s* # Optional whitespace\n * (\\d{0,3} # 0 to three digits B channel\n * (?:\\.\\d+)? # Optional decimal with one or more digits\n * ) # End of capturing group for the third color component\n * %? # Optional percent sign after the third color component\n * \\s* # Optional whitespace\n * (?: # Beginning of non-capturing group for alpha value\n * \\s* # Optional whitespace\n * [,/] # Comma or slash separator for alpha value\n * \\s* # Optional whitespace\n * (\\d{0,3} # Zero to three digits\n * (?:\\.\\d+)? # Optional decimal with one or more digits\n * ) # End of capturing group for alpha value\n * %? # Optional percent sign after alpha value\n * \\s* # Optional whitespace\n * )? # End of non-capturing group for alpha value (optional)\n * \\) # Closing parenthesis\n * $ # End of the string\n *\n * The alpha channel can be in the format 0.4 .7 or 1 or 73%\n *\n * WARNING this regex doesn't fail on off spec colors. it matches everything that could be a color.\n * So the spec does not allow for `rgba(30 , 45% 35, 49%)` but this will work anyways for us\n */\nexport const reRGBa = () =>\n /^rgba?\\(\\s*(\\d{0,3}(?:\\.\\d+)?%?)\\s*[\\s|,]\\s*(\\d{0,3}(?:\\.\\d+)?%?)\\s*[\\s|,]\\s*(\\d{0,3}(?:\\.\\d+)?%?)\\s*(?:\\s*[,/]\\s*(\\d{0,3}(?:\\.\\d+)?%?)\\s*)?\\)$/i;\n\n/**\n * Regex matching color in HSL or HSLA formats (ex: hsl(0, 0, 0), rgba(255, 100, 10, 0.5), rgba( 255 , 100 , 10 , 0.5 ), rgb(1,1,1), rgba(100%, 60%, 10%, 0.5))\n * Also matching rgba(r g b / a) as per new specs\n * https://developer.mozilla.org/en-US/docs/Web/CSS/color_value/hsl\n * Formal syntax at the time of writing:\n * =\n * hsl( [ | none ] [ | none ] [ | none ] [ / [ | none ] ]? )\n *\n * =\n * |\n * \n *\n * =\n * |\n * \n *\n * For learners this is how you can read this regex\n * Regular expression for matching an hsla or hsl CSS color value\n *\n * /^hsla?\\( // Matches the beginning of the string and the opening parenthesis of \"hsl\" or \"hsla\"\n * \\s* // Matches any whitespace characters (space, tab, etc.) zero or more times\n * (\\d{0,3} // Hue: 0 to three digits - start capture in a group\n * (?:\\.\\d+)? // Hue: Optional (non capture group) decimal with one or more digits.\n * (?:deg|turn|rad)? // Hue: Optionally include suffix deg or turn or rad\n * ) // Hue: End capture group\n * \\s* // Matches any whitespace characters zero or more times\n * [\\s|,] // Matches a space, tab or comma\n * \\s* // Matches any whitespace characters zero or more times\n * (\\d{0,3} // Saturation: 0 to three digits - start capture in a group\n * (?:\\.\\d+)? // Saturation: Optional decimal with one or more digits in a non-capturing group\n * %?) // Saturation: match optional % character and end capture group\n * \\s* // Matches any whitespace characters zero or more times\n * [\\s|,] // Matches a space, tab or comma\n * \\s* // Matches any whitespace characters zero or more times\n * (\\d{0,3} // Lightness: 0 to three digits - start capture in a group\n * (?:\\.\\d+)? // Lightness: Optional decimal with one or more digits in a non-capturing group\n * %?) // Lightness: match % character and end capture group\n * \\s* // Matches any whitespace characters zero or more times\n * (?: // Alpha: Begins a non-capturing group for the alpha value\n * \\s* // Matches any whitespace characters zero or more times\n * [,/] // Matches a comma or forward slash\n * \\s* // Matches any whitespace characters zero or more times\n * (\\d*(?:\\.\\d+)?%?) // Matches zero or more digits, optionally followed by a decimal point and one or more digits, followed by an optional percentage sign and captures it in a group\n * \\s* // Matches any whitespace characters zero or more times\n * )? // Makes the alpha value group optional\n * \\) // Matches the closing parenthesis\n * $/i // Matches the end of the string and sets the regular expression to case-insensitive mode\n *\n * WARNING this regex doesn't fail on off spec colors. It matches everything that could be a color.\n * So the spec does not allow `hsl(30 , 45% 35, 49%)` but this will work anyways for us.\n */\nexport const reHSLa = () =>\n /^hsla?\\(\\s*([+-]?\\d{0,3}(?:\\.\\d+)?(?:deg|turn|rad)?)\\s*[\\s|,]\\s*(\\d{0,3}(?:\\.\\d+)?%?)\\s*[\\s|,]\\s*(\\d{0,3}(?:\\.\\d+)?%?)\\s*(?:\\s*[,/]\\s*(\\d*(?:\\.\\d+)?%?)\\s*)?\\)$/i;\n\n/**\n * Regex matching color in HEX format (ex: #FF5544CC, #FF5555, 010155, aff)\n */\nexport const reHex = () => /^#?(([0-9a-f]){3,4}|([0-9a-f]{2}){3,4})$/i;\n","import { Color } from '../../color/Color';\nimport { config } from '../../config';\nimport { DEFAULT_SVG_FONT_SIZE, FILL, NONE } from '../../constants';\nimport type { TBBox, SVGElementName, SupportedSVGUnit } from '../../typedefs';\nimport { toFixed } from './toFixed';\n\n/**\n * Returns array of attributes for given svg that fabric parses\n * @param {SVGElementName} type Type of svg element (eg. 'circle')\n * @return {Array} string names of supported attributes\n */\nexport const getSvgAttributes = (type: SVGElementName) => {\n const commonAttributes = ['instantiated_by_use', 'style', 'id', 'class'];\n switch (type) {\n case 'linearGradient':\n return commonAttributes.concat([\n 'x1',\n 'y1',\n 'x2',\n 'y2',\n 'gradientUnits',\n 'gradientTransform',\n ]);\n case 'radialGradient':\n return commonAttributes.concat([\n 'gradientUnits',\n 'gradientTransform',\n 'cx',\n 'cy',\n 'r',\n 'fx',\n 'fy',\n 'fr',\n ]);\n case 'stop':\n return commonAttributes.concat(['offset', 'stop-color', 'stop-opacity']);\n }\n return commonAttributes;\n};\n\n/**\n * Converts from attribute value to pixel value if applicable.\n * Returns converted pixels or original value not converted.\n * @param {string} value number to operate on\n * @param {number} fontSize\n * @return {number}\n */\nexport const parseUnit = (value: string, fontSize = DEFAULT_SVG_FONT_SIZE) => {\n const unit = /\\D{0,2}$/.exec(value),\n number = parseFloat(value);\n const dpi = config.DPI;\n switch (unit?.[0] as SupportedSVGUnit) {\n case 'mm':\n return (number * dpi) / 25.4;\n\n case 'cm':\n return (number * dpi) / 2.54;\n\n case 'in':\n return number * dpi;\n\n case 'pt':\n return (number * dpi) / 72; // or * 4 / 3\n\n case 'pc':\n return ((number * dpi) / 72) * 12; // or * 16\n\n case 'em':\n return number * fontSize;\n\n default:\n return number;\n }\n};\n\nexport type MeetOrSlice = 'meet' | 'slice';\n\nexport type MinMidMax = 'Min' | 'Mid' | 'Max' | 'none';\n\nexport type TPreserveArParsed = {\n meetOrSlice: MeetOrSlice;\n alignX: MinMidMax;\n alignY: MinMidMax;\n};\n\n// align can be either none or undefined or a combination of mid/max\nconst parseAlign = (align: string): MinMidMax[] => {\n //divide align in alignX and alignY\n if (align && align !== NONE) {\n return [align.slice(1, 4) as MinMidMax, align.slice(5, 8) as MinMidMax];\n } else if (align === NONE) {\n return [align, align];\n }\n return ['Mid', 'Mid'];\n};\n\n/**\n * Parse preserveAspectRatio attribute from element\n * https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/preserveAspectRatio\n * @param {string} attribute to be parsed\n * @return {Object} an object containing align and meetOrSlice attribute\n */\nexport const parsePreserveAspectRatioAttribute = (\n attribute: string,\n): TPreserveArParsed => {\n const [firstPart, secondPart] = attribute.trim().split(' ') as [\n MinMidMax,\n MeetOrSlice | undefined,\n ];\n const [alignX, alignY] = parseAlign(firstPart);\n return {\n meetOrSlice: secondPart || 'meet',\n alignX,\n alignY,\n };\n};\n\n/**\n * Adobe Illustrator (at least CS5) is unable to render rgba()-based fill values\n * we work around it by \"moving\" alpha channel into opacity attribute and setting fill's alpha to 1\n * @param prop\n * @param value\n * @param {boolean} inlineStyle The default is inline style, the separator used is \":\", The other is \"=\"\n * @returns\n */\nexport const colorPropToSVG = (\n prop: string,\n value?: any,\n inlineStyle = true,\n) => {\n let colorValue;\n let opacityValue;\n if (!value) {\n colorValue = 'none';\n } else if (value.toLive) {\n colorValue = `url(#SVGID_${value.id})`;\n } else {\n const color = new Color(value),\n opacity = color.getAlpha();\n\n colorValue = color.toRgb();\n if (opacity !== 1) {\n opacityValue = opacity.toString();\n }\n }\n if (inlineStyle) {\n return `${prop}: ${colorValue}; ${\n opacityValue ? `${prop}-opacity: ${opacityValue}; ` : ''\n }`;\n } else {\n return `${prop}=\"${colorValue}\" ${\n opacityValue ? `${prop}-opacity=\"${opacityValue}\" ` : ''\n }`;\n }\n};\n\nexport const createSVGRect = (\n color: string,\n { left, top, width, height }: TBBox,\n precision = config.NUM_FRACTION_DIGITS,\n) => {\n const svgColor = colorPropToSVG(FILL, color, false);\n const [x, y, w, h] = [left, top, width, height].map((value) =>\n toFixed(value, precision),\n );\n return ``;\n};\n","import type { TSVGReviver } from '../../typedefs';\nimport { uid } from '../../util/internals/uid';\nimport { colorPropToSVG } from '../../util/misc/svgParsing';\nimport { FILL, NONE, STROKE } from '../../constants';\nimport type { FabricObject } from './FabricObject';\nimport { isFiller } from '../../util/typeAssertions';\nimport { matrixToSVG } from '../../util/misc/svgExport';\n\nexport class FabricObjectSVGExportMixin {\n /**\n * When an object is being exported as SVG as a clippath, a reference inside the SVG is needed.\n * This reference is a UID in the fabric namespace and is temporary stored here.\n * @type {String}\n */\n declare clipPathId?: string;\n\n /**\n * Returns styles-string for svg-export\n * @param {Boolean} skipShadow a boolean to skip shadow filter output\n * @return {String}\n */\n getSvgStyles(\n this: FabricObjectSVGExportMixin & FabricObject,\n skipShadow?: boolean,\n ) {\n const fillRule = this.fillRule ? this.fillRule : 'nonzero',\n strokeWidth = this.strokeWidth ? this.strokeWidth : '0',\n strokeDashArray = this.strokeDashArray\n ? this.strokeDashArray.join(' ')\n : NONE,\n strokeDashOffset = this.strokeDashOffset ? this.strokeDashOffset : '0',\n strokeLineCap = this.strokeLineCap ? this.strokeLineCap : 'butt',\n strokeLineJoin = this.strokeLineJoin ? this.strokeLineJoin : 'miter',\n strokeMiterLimit = this.strokeMiterLimit ? this.strokeMiterLimit : '4',\n opacity = typeof this.opacity !== 'undefined' ? this.opacity : '1',\n visibility = this.visible ? '' : ' visibility: hidden;',\n filter = skipShadow ? '' : this.getSvgFilter(),\n fill = colorPropToSVG(FILL, this.fill),\n stroke = colorPropToSVG(STROKE, this.stroke);\n\n return [\n stroke,\n 'stroke-width: ',\n strokeWidth,\n '; ',\n 'stroke-dasharray: ',\n strokeDashArray,\n '; ',\n 'stroke-linecap: ',\n strokeLineCap,\n '; ',\n 'stroke-dashoffset: ',\n strokeDashOffset,\n '; ',\n 'stroke-linejoin: ',\n strokeLineJoin,\n '; ',\n 'stroke-miterlimit: ',\n strokeMiterLimit,\n '; ',\n fill,\n 'fill-rule: ',\n fillRule,\n '; ',\n 'opacity: ',\n opacity,\n ';',\n filter,\n visibility,\n ].join('');\n }\n\n /**\n * Returns filter for svg shadow\n * @return {String}\n */\n getSvgFilter(this: FabricObjectSVGExportMixin & FabricObject) {\n return this.shadow ? `filter: url(#SVGID_${this.shadow.id});` : '';\n }\n\n /**\n * Returns id attribute for svg output\n * @return {String}\n */\n getSvgCommons(\n this: FabricObjectSVGExportMixin & FabricObject & { id?: string },\n ) {\n return [\n this.id ? `id=\"${this.id}\" ` : '',\n this.clipPath\n ? `clip-path=\"url(#${\n (this.clipPath as FabricObjectSVGExportMixin & FabricObject)\n .clipPathId\n })\" `\n : '',\n ].join('');\n }\n\n /**\n * Returns transform-string for svg-export\n * @param {Boolean} use the full transform or the single object one.\n * @return {String}\n */\n getSvgTransform(\n this: FabricObjectSVGExportMixin & FabricObject,\n full?: boolean,\n additionalTransform = '',\n ) {\n const transform = full ? this.calcTransformMatrix() : this.calcOwnMatrix(),\n svgTransform = `transform=\"${matrixToSVG(transform)}`;\n return `${svgTransform}${additionalTransform}\" `;\n }\n\n /**\n * Returns svg representation of an instance\n * This function is implemented in each subclass\n * This is just because typescript otherwise cryies all the time\n * @return {Array} an array of strings with the specific svg representation\n * of the instance\n */\n _toSVG(_reviver?: TSVGReviver): string[] {\n return [''];\n }\n\n /**\n * Returns svg representation of an instance\n * @param {TSVGReviver} [reviver] Method for further parsing of svg representation.\n * @return {String} svg representation of an instance\n */\n toSVG(\n this: FabricObjectSVGExportMixin & FabricObject,\n reviver?: TSVGReviver,\n ) {\n return this._createBaseSVGMarkup(this._toSVG(reviver), {\n reviver,\n });\n }\n\n /**\n * Returns svg clipPath representation of an instance\n * @param {TSVGReviver} [reviver] Method for further parsing of svg representation.\n * @return {String} svg representation of an instance\n */\n toClipPathSVG(\n this: FabricObjectSVGExportMixin & FabricObject,\n reviver?: TSVGReviver,\n ) {\n return (\n '\\t' +\n this._createBaseClipPathSVGMarkup(this._toSVG(reviver), {\n reviver,\n })\n );\n }\n\n /**\n * @private\n */\n _createBaseClipPathSVGMarkup(\n this: FabricObjectSVGExportMixin & FabricObject,\n objectMarkup: string[],\n {\n reviver,\n additionalTransform = '',\n }: { reviver?: TSVGReviver; additionalTransform?: string } = {},\n ) {\n const commonPieces = [\n this.getSvgTransform(true, additionalTransform),\n this.getSvgCommons(),\n ].join(''),\n // insert commons in the markup, style and svgCommons\n index = objectMarkup.indexOf('COMMON_PARTS');\n objectMarkup[index] = commonPieces;\n return reviver ? reviver(objectMarkup.join('')) : objectMarkup.join('');\n }\n\n /**\n * @private\n */\n _createBaseSVGMarkup(\n this: FabricObjectSVGExportMixin & FabricObject,\n objectMarkup: string[],\n {\n noStyle,\n reviver,\n withShadow,\n additionalTransform,\n }: {\n noStyle?: boolean;\n reviver?: TSVGReviver;\n withShadow?: boolean;\n additionalTransform?: string;\n } = {},\n ): string {\n const styleInfo = noStyle ? '' : `style=\"${this.getSvgStyles()}\" `,\n shadowInfo = withShadow ? `style=\"${this.getSvgFilter()}\" ` : '',\n clipPath = this.clipPath as FabricObjectSVGExportMixin & FabricObject,\n vectorEffect = this.strokeUniform\n ? 'vector-effect=\"non-scaling-stroke\" '\n : '',\n absoluteClipPath = clipPath && clipPath.absolutePositioned,\n stroke = this.stroke,\n fill = this.fill,\n shadow = this.shadow,\n markup = [],\n // insert commons in the markup, style and svgCommons\n index = objectMarkup.indexOf('COMMON_PARTS');\n let clipPathMarkup;\n if (clipPath) {\n clipPath.clipPathId = `CLIPPATH_${uid()}`;\n clipPathMarkup = `\\n${clipPath.toClipPathSVG(reviver)}\\n`;\n }\n if (absoluteClipPath) {\n markup.push('\\n');\n }\n markup.push(\n '\\n',\n );\n const commonPieces = [\n styleInfo,\n vectorEffect,\n noStyle ? '' : this.addPaintOrder(),\n ' ',\n additionalTransform ? `transform=\"${additionalTransform}\" ` : '',\n ].join('');\n objectMarkup[index] = commonPieces;\n if (isFiller(fill)) {\n markup.push(fill.toSVG(this));\n }\n if (isFiller(stroke)) {\n markup.push(stroke.toSVG(this));\n }\n if (shadow) {\n markup.push(shadow.toSVG(this));\n }\n if (clipPath) {\n markup.push(clipPathMarkup);\n }\n markup.push(objectMarkup.join(''));\n markup.push('\\n');\n absoluteClipPath && markup.push('\\n');\n return reviver ? reviver(markup.join('')) : markup.join('');\n }\n\n addPaintOrder(this: FabricObjectSVGExportMixin & FabricObject) {\n return this.paintFirst !== FILL ? ` paint-order=\"${this.paintFirst}\" ` : '';\n }\n}\n","export function getSvgRegex(arr: string[]) {\n return new RegExp('^(' + arr.join('|') + ')\\\\b', 'i');\n}\n","import { FILL, LEFT, STROKE, reNewline } from '../../constants';\nimport type { TClassProperties } from '../../typedefs';\nimport type { FabricText } from './Text';\n\nexport const TEXT_DECORATION_THICKNESS = 'textDecorationThickness';\n\nconst fontProperties = [\n 'fontSize',\n 'fontWeight',\n 'fontFamily',\n 'fontStyle',\n] as const;\n\nexport const textDecorationProperties = [\n 'underline',\n 'overline',\n 'linethrough',\n] as const;\n\nexport const textLayoutProperties: string[] = [\n ...fontProperties,\n 'lineHeight',\n 'text',\n 'charSpacing',\n 'textAlign',\n 'styles',\n 'path',\n 'pathStartOffset',\n 'pathSide',\n 'pathAlign',\n];\n\nexport const additionalProps = [\n ...textLayoutProperties,\n ...textDecorationProperties,\n 'textBackgroundColor',\n 'direction',\n TEXT_DECORATION_THICKNESS,\n] as const;\n\nexport type StylePropertiesType =\n | 'fill'\n | 'stroke'\n | 'strokeWidth'\n | 'fontSize'\n | 'fontFamily'\n | 'fontWeight'\n | 'fontStyle'\n | 'textBackgroundColor'\n | 'deltaY'\n | 'overline'\n | 'underline'\n | 'linethrough'\n | typeof TEXT_DECORATION_THICKNESS;\n\nexport const styleProperties: Readonly = [\n ...fontProperties,\n ...textDecorationProperties,\n STROKE,\n 'strokeWidth',\n FILL,\n 'deltaY',\n 'textBackgroundColor',\n TEXT_DECORATION_THICKNESS,\n] as const;\n\n// @TODO: Many things here are configuration related and shouldn't be on the class nor prototype\n// regexes, list of properties that are not suppose to change by instances, magic consts.\n// this will be a separated effort\nexport const textDefaultValues: Partial> = {\n _reNewline: reNewline,\n _reSpacesAndTabs: /[ \\t\\r]/g,\n _reSpaceAndTab: /[ \\t\\r]/,\n _reWords: /\\S+/g,\n fontSize: 40,\n fontWeight: 'normal',\n fontFamily: 'Times New Roman',\n underline: false,\n overline: false,\n linethrough: false,\n textAlign: LEFT,\n fontStyle: 'normal',\n lineHeight: 1.16,\n textBackgroundColor: '',\n stroke: null,\n shadow: null,\n path: undefined,\n pathStartOffset: 0,\n pathSide: LEFT,\n pathAlign: 'baseline',\n charSpacing: 0,\n deltaY: 0,\n direction: 'ltr',\n CACHE_FONT_SIZE: 400,\n MIN_TEXT_WIDTH: 2,\n // Text magic numbers\n superscript: {\n size: 0.6, // fontSize factor\n baseline: -0.35, // baseline-shift factor (upwards)\n },\n subscript: {\n size: 0.6, // fontSize factor\n baseline: 0.11, // baseline-shift factor (downwards)\n },\n _fontSizeFraction: 0.222,\n offsets: {\n underline: 0.1,\n linethrough: -0.28167, // added 1/30 to original number\n overline: -0.81333, // added 1/15 to original number\n },\n _fontSizeMult: 1.13,\n [TEXT_DECORATION_THICKNESS]: 66.667, // before implementation was 1/15\n};\n\nexport const JUSTIFY = 'justify';\nexport const JUSTIFY_LEFT = 'justify-left';\nexport const JUSTIFY_RIGHT = 'justify-right';\nexport const JUSTIFY_CENTER = 'justify-center';\n","import { getSvgRegex } from './getSvgRegex';\nimport { LEFT, TOP } from '../constants';\nimport { TEXT_DECORATION_THICKNESS } from '../shapes/Text/constants';\n\n// matches, e.g.: +14.56e-12, etc.\nexport const reNum = String.raw`[-+]?(?:\\d*\\.\\d+|\\d+\\.?)(?:[eE][-+]?\\d+)?`;\nexport const viewportSeparator = String.raw`(?:\\s*,?\\s+|\\s*,\\s*)`;\n\nexport const svgNS = 'http://www.w3.org/2000/svg';\n\nexport const reFontDeclaration = new RegExp(\n '(normal|italic)?\\\\s*(normal|small-caps)?\\\\s*' +\n '(normal|bold|bolder|lighter|100|200|300|400|500|600|700|800|900)?\\\\s*(' +\n reNum +\n '(?:px|cm|mm|em|pt|pc|in)*)(?:\\\\/(normal|' +\n reNum +\n '))?\\\\s+(.*)',\n);\n\nexport const svgValidTagNames = [\n 'path',\n 'circle',\n 'polygon',\n 'polyline',\n 'ellipse',\n 'rect',\n 'line',\n 'image',\n 'text',\n ],\n svgViewBoxElements = ['symbol', 'image', 'marker', 'pattern', 'view', 'svg'],\n svgInvalidAncestors = [\n 'pattern',\n 'defs',\n 'symbol',\n 'metadata',\n 'clipPath',\n 'mask',\n 'desc',\n ],\n svgValidParents = ['symbol', 'g', 'a', 'svg', 'clipPath', 'defs'],\n attributesMap = {\n cx: LEFT,\n x: LEFT,\n r: 'radius',\n cy: TOP,\n y: TOP,\n display: 'visible',\n visibility: 'visible',\n transform: 'transformMatrix',\n 'fill-opacity': 'fillOpacity',\n 'fill-rule': 'fillRule',\n 'font-family': 'fontFamily',\n 'font-size': 'fontSize',\n 'font-style': 'fontStyle',\n 'font-weight': 'fontWeight',\n 'letter-spacing': 'charSpacing',\n 'paint-order': 'paintFirst',\n 'stroke-dasharray': 'strokeDashArray',\n 'stroke-dashoffset': 'strokeDashOffset',\n 'stroke-linecap': 'strokeLineCap',\n 'stroke-linejoin': 'strokeLineJoin',\n 'stroke-miterlimit': 'strokeMiterLimit',\n 'stroke-opacity': 'strokeOpacity',\n 'stroke-width': 'strokeWidth',\n 'text-decoration': 'textDecoration',\n 'text-anchor': 'textAnchor',\n opacity: 'opacity',\n 'clip-path': 'clipPath',\n 'clip-rule': 'clipRule',\n 'vector-effect': 'strokeUniform',\n 'image-rendering': 'imageSmoothing',\n 'text-decoration-thickness': TEXT_DECORATION_THICKNESS,\n },\n fSize = 'font-size',\n cPath = 'clip-path';\n\nexport const svgValidTagNamesRegEx = getSvgRegex(svgValidTagNames);\n\nexport const svgViewBoxElementsRegEx = getSvgRegex(svgViewBoxElements);\n\nexport const svgValidParentsRegEx = getSvgRegex(svgValidParents);\n\n// http://www.w3.org/TR/SVG/coords.html#ViewBoxAttribute\n\nexport const reViewBoxAttrValue = new RegExp(\n String.raw`^\\s*(${reNum})${viewportSeparator}(${reNum})${viewportSeparator}(${reNum})${viewportSeparator}(${reNum})\\s*$`,\n);\n","import { classRegistry } from './ClassRegistry';\nimport { Color } from './color/Color';\nimport { config } from './config';\nimport { reNum } from './parser/constants';\nimport { Point } from './Point';\nimport type { FabricObject } from './shapes/Object/FabricObject';\nimport type { TClassProperties } from './typedefs';\nimport { uid } from './util/internals/uid';\nimport { pickBy } from './util/misc/pick';\nimport { degreesToRadians } from './util/misc/radiansDegreesConversion';\nimport { toFixed } from './util/misc/toFixed';\nimport { rotateVector } from './util/misc/vectors';\n\n/**\n * Regex matching shadow offsetX, offsetY and blur (ex: \"2px 2px 10px rgba(0,0,0,0.2)\", \"rgb(0,255,0) 2px 2px\")\n * - (?:\\s|^): This part captures either a whitespace character (\\s) or the beginning of a line (^). It's non-capturing (due to (?:...)), meaning it doesn't create a capturing group.\n * - (-?\\d+(?:\\.\\d*)?(?:px)?(?:\\s?|$))?: This captures the first component of the shadow, which is the horizontal offset. Breaking it down:\n * - (-?\\d+): Captures an optional minus sign followed by one or more digits (integer part of the number).\n * - (?:\\.\\d*)?: Optionally captures a decimal point followed by zero or more digits (decimal part of the number).\n * - (?:px)?: Optionally captures the \"px\" unit.\n * - (?:\\s?|$): Captures either an optional whitespace or the end of the line. This whole part is wrapped in a non-capturing group and marked as optional with ?.\n * - (-?\\d+(?:\\.\\d*)?(?:px)?(?:\\s?|$))?: Similar to the previous step, this captures the vertical offset.\n\n(\\d+(?:\\.\\d*)?(?:px)?)?: This captures the blur radius. It's similar to the horizontal offset but without the optional minus sign.\n\n(?:\\s+(-?\\d+(?:\\.\\d*)?(?:px)?(?:\\s?|$))?){0,1}: This captures an optional part for the color. It allows for whitespace followed by a component with an optional minus sign, digits, decimal point, and \"px\" unit.\n\n(?:$|\\s): This captures either the end of the line or a whitespace character. It ensures that the match ends either at the end of the string or with a whitespace character.\n */\n// eslint-disable-next-line max-len\n\nconst shadowOffsetRegex = '(-?\\\\d+(?:\\\\.\\\\d*)?(?:px)?(?:\\\\s?|$))?';\n\nconst reOffsetsAndBlur = new RegExp(\n '(?:\\\\s|^)' +\n shadowOffsetRegex +\n shadowOffsetRegex +\n '(' +\n reNum +\n '?(?:px)?)?(?:\\\\s?|$)(?:$|\\\\s)',\n);\n\nexport const shadowDefaultValues: Partial> = {\n color: 'rgb(0,0,0)',\n blur: 0,\n offsetX: 0,\n offsetY: 0,\n affectStroke: false,\n includeDefaultValues: true,\n nonScaling: false,\n};\n\nexport type SerializedShadowOptions = {\n color: string;\n blur: number;\n offsetX: number;\n offsetY: number;\n affectStroke: boolean;\n nonScaling: boolean;\n type: string;\n};\n\nexport class Shadow {\n /**\n * Shadow color\n * @type String\n */\n declare color: string;\n\n /**\n * Shadow blur\n * @type Number\n */\n declare blur: number;\n\n /**\n * Shadow horizontal offset\n * @type Number\n */\n declare offsetX: number;\n\n /**\n * Shadow vertical offset\n * @type Number\n */\n declare offsetY: number;\n\n /**\n * Whether the shadow should affect stroke operations\n * @type Boolean\n */\n declare affectStroke: boolean;\n\n /**\n * Indicates whether toObject should include default values\n * @type Boolean\n */\n declare includeDefaultValues: boolean;\n\n /**\n * When `false`, the shadow will scale with the object.\n * When `true`, the shadow's offsetX, offsetY, and blur will not be affected by the object's scale.\n * default to false\n * @type Boolean\n */\n declare nonScaling: boolean;\n\n declare id: number;\n\n static ownDefaults = shadowDefaultValues;\n\n static type = 'shadow';\n\n /**\n * @see {@link http://fabricjs.com/shadows|Shadow demo}\n * @param {Object|String} [options] Options object with any of color, blur, offsetX, offsetY properties or string (e.g. \"rgba(0,0,0,0.2) 2px 2px 10px\")\n */\n constructor(options?: Partial>);\n constructor(svgAttribute: string);\n constructor(arg0: string | Partial> = {}) {\n const options: Partial> =\n typeof arg0 === 'string' ? Shadow.parseShadow(arg0) : arg0;\n Object.assign(this, Shadow.ownDefaults, options);\n this.id = uid();\n }\n\n /**\n * @param {String} value Shadow value to parse\n * @return {Object} Shadow object with color, offsetX, offsetY and blur\n */\n static parseShadow(value: string) {\n const shadowStr = value.trim(),\n [, offsetX = 0, offsetY = 0, blur = 0] = (\n reOffsetsAndBlur.exec(shadowStr) || []\n ).map((value) => parseFloat(value) || 0),\n color = (shadowStr.replace(reOffsetsAndBlur, '') || 'rgb(0,0,0)').trim();\n\n return {\n color,\n offsetX,\n offsetY,\n blur,\n };\n }\n\n /**\n * Returns a string representation of an instance\n * @see http://www.w3.org/TR/css-text-decor-3/#text-shadow\n * @return {String} Returns CSS3 text-shadow declaration\n */\n toString() {\n return [this.offsetX, this.offsetY, this.blur, this.color].join('px ');\n }\n\n /**\n * Returns SVG representation of a shadow\n * @param {FabricObject} object\n * @return {String} SVG representation of a shadow\n */\n toSVG(object: FabricObject) {\n const offset = rotateVector(\n new Point(this.offsetX, this.offsetY),\n degreesToRadians(-object.angle),\n ),\n BLUR_BOX = 20,\n color = new Color(this.color);\n let fBoxX = 40,\n fBoxY = 40;\n\n if (object.width && object.height) {\n //http://www.w3.org/TR/SVG/filters.html#FilterEffectsRegion\n // we add some extra space to filter box to contain the blur ( 20 )\n fBoxX =\n toFixed(\n (Math.abs(offset.x) + this.blur) / object.width,\n config.NUM_FRACTION_DIGITS,\n ) *\n 100 +\n BLUR_BOX;\n fBoxY =\n toFixed(\n (Math.abs(offset.y) + this.blur) / object.height,\n config.NUM_FRACTION_DIGITS,\n ) *\n 100 +\n BLUR_BOX;\n }\n if (object.flipX) {\n offset.x *= -1;\n }\n if (object.flipY) {\n offset.y *= -1;\n }\n\n return `\\n\\t\\n\\t\\n\\t\\n\\t\\n\\t\\n\\t\\t\\n\\t\\t\\n\\t\\n\\n`;\n }\n\n /**\n * Returns object representation of a shadow\n * @return {Object} Object representation of a shadow instance\n */\n toObject() {\n const data: SerializedShadowOptions = {\n color: this.color,\n blur: this.blur,\n offsetX: this.offsetX,\n offsetY: this.offsetY,\n affectStroke: this.affectStroke,\n nonScaling: this.nonScaling,\n type: (this.constructor as typeof Shadow).type,\n };\n const defaults = Shadow.ownDefaults as SerializedShadowOptions;\n return !this.includeDefaultValues\n ? pickBy(data, (value, key) => value !== defaults[key])\n : data;\n }\n\n static async fromObject(options: Partial>) {\n return new this(options);\n }\n}\n\nclassRegistry.setClass(Shadow, 'shadow');\n","export const capValue = (min: number, value: number, max: number) =>\n Math.max(min, Math.min(value, max));\n","import {\n TOP,\n LEFT,\n SCALE_Y,\n SCALE_X,\n SKEW_X,\n SKEW_Y,\n FILL,\n STROKE,\n} from '../../constants';\nimport type { TClassProperties } from '../../typedefs';\nimport type { InteractiveFabricObject } from './InteractiveObject';\nimport type { FabricObject } from './Object';\n\nexport const stateProperties = [\n TOP,\n LEFT,\n SCALE_X,\n SCALE_Y,\n 'flipX',\n 'flipY',\n 'originX',\n 'originY',\n 'angle',\n 'opacity',\n 'globalCompositeOperation',\n 'shadow',\n 'visible',\n SKEW_X,\n SKEW_Y,\n];\n\nexport const cacheProperties = [\n FILL,\n STROKE,\n 'strokeWidth',\n 'strokeDashArray',\n 'width',\n 'height',\n 'paintFirst',\n 'strokeUniform',\n 'strokeLineCap',\n 'strokeDashOffset',\n 'strokeLineJoin',\n 'strokeMiterLimit',\n 'backgroundColor',\n 'clipPath',\n];\n\nexport const fabricObjectDefaultValues: Partial<\n TClassProperties\n> = {\n // see composeMatrix() to see order of transforms. First defaults listed based on this\n top: 0,\n left: 0,\n width: 0,\n height: 0,\n angle: 0,\n flipX: false,\n flipY: false,\n scaleX: 1,\n scaleY: 1,\n minScaleLimit: 0,\n skewX: 0,\n skewY: 0,\n originX: LEFT,\n originY: TOP,\n strokeWidth: 1,\n strokeUniform: false,\n padding: 0,\n opacity: 1,\n paintFirst: FILL,\n fill: 'rgb(0,0,0)',\n fillRule: 'nonzero',\n stroke: null,\n strokeDashArray: null,\n strokeDashOffset: 0,\n strokeLineCap: 'butt',\n strokeLineJoin: 'miter',\n strokeMiterLimit: 4,\n globalCompositeOperation: 'source-over',\n backgroundColor: '',\n shadow: null,\n visible: true,\n includeDefaultValues: true,\n excludeFromExport: false,\n objectCaching: true,\n clipPath: undefined,\n inverted: false,\n absolutePositioned: false,\n centeredRotation: true,\n centeredScaling: false,\n dirty: true,\n} as const;\n\nexport const interactiveObjectDefaultValues: Partial<\n TClassProperties\n> = {\n noScaleCache: true,\n lockMovementX: false,\n lockMovementY: false,\n lockRotation: false,\n lockScalingX: false,\n lockScalingY: false,\n lockSkewingX: false,\n lockSkewingY: false,\n lockScalingFlip: false,\n cornerSize: 13,\n touchCornerSize: 24,\n transparentCorners: true,\n cornerColor: 'rgb(178,204,255)',\n cornerStrokeColor: '',\n cornerStyle: 'rect',\n cornerDashArray: null,\n hasControls: true,\n borderColor: 'rgb(178,204,255)',\n borderDashArray: null,\n borderOpacityWhenMoving: 0.4,\n borderScaleFactor: 1,\n hasBorders: true,\n selectionBackgroundColor: '',\n selectable: true,\n evented: true,\n perPixelTargetFind: false,\n activeOn: 'down',\n hoverCursor: null,\n moveCursor: null,\n};\n","/**\n * Easing functions\n * @see {@link http://gizma.com/easing/ Easing Equations by Robert Penner}\n */\n\nimport { twoMathPi, halfPI } from '../../constants';\nimport type { TEasingFunction } from './types';\n\nconst normalize = (a: number, c: number, p: number, s: number) => {\n if (a < Math.abs(c)) {\n a = c;\n s = p / 4;\n } else {\n //handle the 0/0 case:\n if (c === 0 && a === 0) {\n s = (p / twoMathPi) * Math.asin(1);\n } else {\n s = (p / twoMathPi) * Math.asin(c / a);\n }\n }\n return { a, c, p, s };\n};\n\nconst elastic = (\n a: number,\n s: number,\n p: number,\n t: number,\n d: number,\n): number =>\n a * Math.pow(2, 10 * (t -= 1)) * Math.sin(((t * d - s) * twoMathPi) / p);\n\n/**\n * Default sinusoidal easing\n */\nexport const defaultEasing: TEasingFunction = (t, b, c, d) =>\n -c * Math.cos((t / d) * halfPI) + c + b;\n\n/**\n * Cubic easing in\n */\nexport const easeInCubic: TEasingFunction = (t, b, c, d) =>\n c * (t / d) ** 3 + b;\n\n/**\n * Cubic easing out\n */\nexport const easeOutCubic: TEasingFunction = (t, b, c, d) =>\n c * ((t / d - 1) ** 3 + 1) + b;\n\n/**\n * Cubic easing in and out\n */\nexport const easeInOutCubic: TEasingFunction = (t, b, c, d) => {\n t /= d / 2;\n if (t < 1) {\n return (c / 2) * t ** 3 + b;\n }\n return (c / 2) * ((t - 2) ** 3 + 2) + b;\n};\n\n/**\n * Quartic easing in\n */\nexport const easeInQuart: TEasingFunction = (t, b, c, d) =>\n c * (t /= d) * t ** 3 + b;\n\n/**\n * Quartic easing out\n */\nexport const easeOutQuart: TEasingFunction = (t, b, c, d) =>\n -c * ((t = t / d - 1) * t ** 3 - 1) + b;\n\n/**\n * Quartic easing in and out\n */\nexport const easeInOutQuart: TEasingFunction = (t, b, c, d) => {\n t /= d / 2;\n if (t < 1) {\n return (c / 2) * t ** 4 + b;\n }\n return (-c / 2) * ((t -= 2) * t ** 3 - 2) + b;\n};\n\n/**\n * Quintic easing in\n */\nexport const easeInQuint: TEasingFunction = (t, b, c, d) =>\n c * (t / d) ** 5 + b;\n\n/**\n * Quintic easing out\n */\nexport const easeOutQuint: TEasingFunction = (t, b, c, d) =>\n c * ((t / d - 1) ** 5 + 1) + b;\n\n/**\n * Quintic easing in and out\n */\nexport const easeInOutQuint: TEasingFunction = (t, b, c, d) => {\n t /= d / 2;\n if (t < 1) {\n return (c / 2) * t ** 5 + b;\n }\n return (c / 2) * ((t - 2) ** 5 + 2) + b;\n};\n\n/**\n * Sinusoidal easing in\n */\nexport const easeInSine: TEasingFunction = (t, b, c, d) =>\n -c * Math.cos((t / d) * halfPI) + c + b;\n\n/**\n * Sinusoidal easing out\n */\nexport const easeOutSine: TEasingFunction = (t, b, c, d) =>\n c * Math.sin((t / d) * halfPI) + b;\n\n/**\n * Sinusoidal easing in and out\n */\nexport const easeInOutSine: TEasingFunction = (t, b, c, d) =>\n (-c / 2) * (Math.cos((Math.PI * t) / d) - 1) + b;\n\n/**\n * Exponential easing in\n */\nexport const easeInExpo: TEasingFunction = (t, b, c, d) =>\n t === 0 ? b : c * 2 ** (10 * (t / d - 1)) + b;\n\n/**\n * Exponential easing out\n */\nexport const easeOutExpo: TEasingFunction = (t, b, c, d) =>\n t === d ? b + c : c * -(2 ** ((-10 * t) / d) + 1) + b;\n\n/**\n * Exponential easing in and out\n */\nexport const easeInOutExpo: TEasingFunction = (t, b, c, d) => {\n if (t === 0) {\n return b;\n }\n if (t === d) {\n return b + c;\n }\n t /= d / 2;\n if (t < 1) {\n return (c / 2) * 2 ** (10 * (t - 1)) + b;\n }\n return (c / 2) * -(2 ** (-10 * --t) + 2) + b;\n};\n\n/**\n * Circular easing in\n */\nexport const easeInCirc: TEasingFunction = (t, b, c, d) =>\n -c * (Math.sqrt(1 - (t /= d) * t) - 1) + b;\n\n/**\n * Circular easing out\n */\nexport const easeOutCirc: TEasingFunction = (t, b, c, d) =>\n c * Math.sqrt(1 - (t = t / d - 1) * t) + b;\n\n/**\n * Circular easing in and out\n */\nexport const easeInOutCirc: TEasingFunction = (t, b, c, d) => {\n t /= d / 2;\n if (t < 1) {\n return (-c / 2) * (Math.sqrt(1 - t ** 2) - 1) + b;\n }\n return (c / 2) * (Math.sqrt(1 - (t -= 2) * t) + 1) + b;\n};\n\n/**\n * Elastic easing in\n */\nexport const easeInElastic: TEasingFunction = (t, b, c, d) => {\n const s = 1.70158,\n a = c;\n let p = 0;\n if (t === 0) {\n return b;\n }\n t /= d;\n if (t === 1) {\n return b + c;\n }\n if (!p) {\n p = d * 0.3;\n }\n const { a: normA, s: normS, p: normP } = normalize(a, c, p, s);\n return -elastic(normA, normS, normP, t, d) + b;\n};\n\n/**\n * Elastic easing out\n */\nexport const easeOutElastic: TEasingFunction = (t, b, c, d) => {\n const s = 1.70158,\n a = c;\n let p = 0;\n if (t === 0) {\n return b;\n }\n t /= d;\n if (t === 1) {\n return b + c;\n }\n if (!p) {\n p = d * 0.3;\n }\n const { a: normA, s: normS, p: normP, c: normC } = normalize(a, c, p, s);\n return (\n normA * 2 ** (-10 * t) * Math.sin(((t * d - normS) * twoMathPi) / normP) +\n normC +\n b\n );\n};\n\n/**\n * Elastic easing in and out\n */\nexport const easeInOutElastic: TEasingFunction = (t, b, c, d) => {\n const s = 1.70158,\n a = c;\n let p = 0;\n if (t === 0) {\n return b;\n }\n t /= d / 2;\n if (t === 2) {\n return b + c;\n }\n if (!p) {\n p = d * (0.3 * 1.5);\n }\n const { a: normA, s: normS, p: normP, c: normC } = normalize(a, c, p, s);\n if (t < 1) {\n return -0.5 * elastic(normA, normS, normP, t, d) + b;\n }\n return (\n normA *\n Math.pow(2, -10 * (t -= 1)) *\n Math.sin(((t * d - normS) * twoMathPi) / normP) *\n 0.5 +\n normC +\n b\n );\n};\n\n/**\n * Backwards easing in\n */\nexport const easeInBack: TEasingFunction = (t, b, c, d, s = 1.70158) =>\n c * (t /= d) * t * ((s + 1) * t - s) + b;\n\n/**\n * Backwards easing out\n */\nexport const easeOutBack: TEasingFunction = (t, b, c, d, s = 1.70158) =>\n c * ((t = t / d - 1) * t * ((s + 1) * t + s) + 1) + b;\n\n/**\n * Backwards easing in and out\n */\nexport const easeInOutBack: TEasingFunction = (t, b, c, d, s = 1.70158) => {\n t /= d / 2;\n if (t < 1) {\n return (c / 2) * (t * t * (((s *= 1.525) + 1) * t - s)) + b;\n }\n return (c / 2) * ((t -= 2) * t * (((s *= 1.525) + 1) * t + s) + 2) + b;\n};\n\n/**\n * Bouncing easing out\n */\nexport const easeOutBounce: TEasingFunction = (t, b, c, d) => {\n if ((t /= d) < 1 / 2.75) {\n return c * (7.5625 * t * t) + b;\n } else if (t < 2 / 2.75) {\n return c * (7.5625 * (t -= 1.5 / 2.75) * t + 0.75) + b;\n } else if (t < 2.5 / 2.75) {\n return c * (7.5625 * (t -= 2.25 / 2.75) * t + 0.9375) + b;\n } else {\n return c * (7.5625 * (t -= 2.625 / 2.75) * t + 0.984375) + b;\n }\n};\n\n/**\n * Bouncing easing in\n */\nexport const easeInBounce: TEasingFunction = (t, b, c, d) =>\n c - easeOutBounce(d - t, 0, c, d) + b;\n\n/**\n * Bouncing easing in and out\n */\nexport const easeInOutBounce: TEasingFunction = (t, b, c, d) =>\n t < d / 2\n ? easeInBounce(t * 2, 0, c, d) * 0.5 + b\n : easeOutBounce(t * 2 - d, 0, c, d) * 0.5 + c * 0.5 + b;\n\n/**\n * Quadratic easing in\n */\nexport const easeInQuad: TEasingFunction = (t, b, c, d) => c * (t /= d) * t + b;\n\n/**\n * Quadratic easing out\n */\nexport const easeOutQuad: TEasingFunction = (t, b, c, d) =>\n -c * (t /= d) * (t - 2) + b;\n\n/**\n * Quadratic easing in and out\n */\nexport const easeInOutQuad: TEasingFunction = (t, b, c, d) => {\n t /= d / 2;\n if (t < 1) {\n return (c / 2) * t ** 2 + b;\n }\n return (-c / 2) * (--t * (t - 2) - 1) + b;\n};\n","import { noop } from '../../constants';\nimport { requestAnimFrame } from './AnimationFrameProvider';\nimport { runningAnimations } from './AnimationRegistry';\nimport { defaultEasing } from './easing';\nimport type {\n AnimationState,\n TAbortCallback,\n TBaseAnimationOptions,\n TEasingFunction,\n TOnAnimationChangeCallback,\n} from './types';\n\nconst defaultAbort = () => false;\n\nexport abstract class AnimationBase<\n T extends number | number[] = number | number[],\n> {\n declare readonly startValue: T;\n declare readonly endValue: T;\n declare readonly duration: number;\n declare readonly delay: number;\n\n declare protected readonly byValue: T;\n declare protected readonly easing: TEasingFunction;\n\n declare private readonly _onStart: VoidFunction;\n declare private readonly _onChange: TOnAnimationChangeCallback;\n declare private readonly _onComplete: TOnAnimationChangeCallback;\n declare private readonly _abort: TAbortCallback;\n\n /**\n * Used to register the animation to a target object\n * so that it can be cancelled within the object context\n */\n declare readonly target?: unknown;\n\n private _state: AnimationState = 'pending';\n /**\n * Time %, or the ratio of `timeElapsed / duration`\n * @see tick\n */\n durationProgress = 0;\n /**\n * Value %, or the ratio of `(currentValue - startValue) / (endValue - startValue)`\n */\n valueProgress = 0;\n /**\n * Current value\n */\n declare value: T;\n /**\n * Animation start time ms\n */\n declare private startTime: number;\n\n constructor({\n startValue,\n byValue,\n duration = 500,\n delay = 0,\n easing = defaultEasing,\n onStart = noop,\n onChange = noop,\n onComplete = noop,\n abort = defaultAbort,\n target,\n }: TBaseAnimationOptions) {\n this.tick = this.tick.bind(this);\n\n this.duration = duration;\n this.delay = delay;\n this.easing = easing;\n this._onStart = onStart;\n this._onChange = onChange;\n this._onComplete = onComplete;\n this._abort = abort;\n this.target = target;\n\n this.startValue = startValue;\n this.byValue = byValue;\n this.value = this.startValue;\n this.endValue = Object.freeze(this.calculate(this.duration).value);\n }\n\n get state() {\n return this._state;\n }\n\n isDone() {\n return this._state === 'aborted' || this._state === 'completed';\n }\n\n /**\n * Calculate the current value based on the easing parameters\n * @param timeElapsed in ms\n * @protected\n */\n protected abstract calculate(timeElapsed: number): {\n value: T;\n valueProgress: number;\n };\n\n start() {\n const firstTick: FrameRequestCallback = (timestamp) => {\n if (this._state !== 'pending') return;\n this.startTime = timestamp || +new Date();\n this._state = 'running';\n this._onStart();\n this.tick(this.startTime);\n };\n\n this.register();\n\n // setTimeout(cb, 0) will run cb on the next frame, causing a delay\n // we don't want that\n if (this.delay > 0) {\n setTimeout(() => requestAnimFrame(firstTick), this.delay);\n } else {\n requestAnimFrame(firstTick);\n }\n }\n\n private tick(t: number) {\n const durationMs = (t || +new Date()) - this.startTime;\n const boundDurationMs = Math.min(durationMs, this.duration);\n this.durationProgress = boundDurationMs / this.duration;\n const { value, valueProgress } = this.calculate(boundDurationMs);\n this.value = Object.freeze(value);\n this.valueProgress = valueProgress;\n\n if (this._state === 'aborted') {\n return;\n } else if (\n this._abort(this.value, this.valueProgress, this.durationProgress)\n ) {\n this._state = 'aborted';\n this.unregister();\n } else if (durationMs >= this.duration) {\n this.durationProgress = this.valueProgress = 1;\n this._onChange(this.endValue, this.valueProgress, this.durationProgress);\n this._state = 'completed';\n this._onComplete(\n this.endValue,\n this.valueProgress,\n this.durationProgress,\n );\n this.unregister();\n } else {\n this._onChange(this.value, this.valueProgress, this.durationProgress);\n requestAnimFrame(this.tick);\n }\n }\n\n private register() {\n runningAnimations.push(this as unknown as AnimationBase);\n }\n\n private unregister() {\n runningAnimations.remove(this as unknown as AnimationBase);\n }\n\n abort() {\n this._state = 'aborted';\n this.unregister();\n }\n}\n","import { AnimationBase } from './AnimationBase';\nimport type { ValueAnimationOptions } from './types';\n\nexport class ValueAnimation extends AnimationBase {\n constructor({\n startValue = 0,\n endValue = 100,\n ...otherOptions\n }: ValueAnimationOptions) {\n super({\n ...otherOptions,\n startValue,\n byValue: endValue - startValue,\n });\n }\n\n protected calculate(timeElapsed: number) {\n const value = this.easing(\n timeElapsed,\n this.startValue,\n this.byValue,\n this.duration,\n );\n return {\n value,\n valueProgress: Math.abs((value - this.startValue) / this.byValue),\n };\n }\n}\n","import { AnimationBase } from './AnimationBase';\nimport type { ArrayAnimationOptions } from './types';\n\nexport class ArrayAnimation extends AnimationBase {\n constructor({\n startValue = [0],\n endValue = [100],\n ...options\n }: ArrayAnimationOptions) {\n super({\n ...options,\n startValue,\n byValue: endValue.map((value, i) => value - startValue[i]),\n });\n }\n protected calculate(timeElapsed: number) {\n const values = this.startValue.map((value, i) =>\n this.easing(timeElapsed, value, this.byValue[i], this.duration, i),\n );\n return {\n value: values,\n valueProgress: Math.abs(\n (values[0] - this.startValue[0]) / this.byValue[0],\n ),\n };\n }\n}\n","import { Color } from '../../color/Color';\nimport type { TRGBAColorSource } from '../../color/typedefs';\nimport { halfPI } from '../../constants';\nimport { capValue } from '../misc/capValue';\nimport { AnimationBase } from './AnimationBase';\nimport type {\n ColorAnimationOptions,\n TEasingFunction,\n TOnAnimationChangeCallback,\n} from './types';\n\nconst defaultColorEasing: TEasingFunction = (\n timeElapsed,\n startValue,\n byValue,\n duration,\n) => {\n const durationProgress = 1 - Math.cos((timeElapsed / duration) * halfPI);\n return startValue + byValue * durationProgress;\n};\n\nconst wrapColorCallback = (\n callback?: TOnAnimationChangeCallback,\n) =>\n callback &&\n ((rgba: TRGBAColorSource, valueProgress: number, durationProgress: number) =>\n callback(new Color(rgba).toRgba(), valueProgress, durationProgress));\n\nexport class ColorAnimation extends AnimationBase {\n constructor({\n startValue,\n endValue,\n easing = defaultColorEasing,\n onChange,\n onComplete,\n abort,\n ...options\n }: ColorAnimationOptions) {\n const startColor = new Color(startValue).getSource();\n const endColor = new Color(endValue).getSource();\n super({\n ...options,\n startValue: startColor,\n byValue: endColor.map(\n (value, i) => value - startColor[i],\n ) as TRGBAColorSource,\n easing,\n onChange: wrapColorCallback(onChange),\n onComplete: wrapColorCallback(onComplete),\n abort: wrapColorCallback(abort),\n });\n }\n protected calculate(timeElapsed: number) {\n const [r, g, b, a] = this.startValue.map((value, i) =>\n this.easing(timeElapsed, value, this.byValue[i], this.duration, i),\n ) as TRGBAColorSource;\n const value = [\n ...[r, g, b].map(Math.round),\n capValue(0, a, 1),\n ] as TRGBAColorSource;\n return {\n value,\n valueProgress:\n // to correctly calculate the change ratio we must find a changed value\n value\n .map((p, i) =>\n this.byValue[i] !== 0\n ? Math.abs((p - this.startValue[i]) / this.byValue[i])\n : 0,\n )\n .find((p) => p !== 0) || 0,\n };\n }\n}\n","import { ValueAnimation } from './ValueAnimation';\nimport { ArrayAnimation } from './ArrayAnimation';\nimport { ColorAnimation } from './ColorAnimation';\nimport type {\n ValueAnimationOptions,\n ArrayAnimationOptions,\n ColorAnimationOptions,\n} from './types';\nimport type { TColorArg } from '../../color/typedefs';\n\nexport type TAnimation =\n T extends TColorArg\n ? ColorAnimation\n : T extends number[]\n ? ArrayAnimation\n : ValueAnimation;\n\nconst isArrayAnimation = (\n options: ArrayAnimationOptions | ValueAnimationOptions,\n): options is ArrayAnimationOptions => {\n return Array.isArray(options.startValue) || Array.isArray(options.endValue);\n};\n\n/**\n * Changes value(s) from startValue to endValue within a certain period of time,\n * invoking callbacks as the value(s) change.\n *\n * @example\n * animate({\n * startValue: 1,\n * endValue: 0,\n * onChange: (v) => {\n * obj.set('opacity', v);\n * // since we are running in a requested frame we should call `renderAll` and not `requestRenderAll`\n * canvas.renderAll();\n * }\n * });\n *\n * @example Using lists:\n * animate({\n * startValue: [1, 2, 3],\n * endValue: [2, 4, 6],\n * onChange: ([x, y, zoom]) => {\n * canvas.zoomToPoint(new Point(x, y), zoom);\n * canvas.renderAll();\n * }\n * });\n *\n */\nexport function animate(options: ArrayAnimationOptions): ArrayAnimation;\nexport function animate(options: ValueAnimationOptions): ValueAnimation;\nexport function animate<\n T extends ValueAnimationOptions | ArrayAnimationOptions,\n>(\n options: T,\n): T extends ArrayAnimationOptions ? ArrayAnimation : ValueAnimation;\nexport function animate<\n T extends ValueAnimationOptions | ArrayAnimationOptions,\n R extends T extends ArrayAnimationOptions ? ArrayAnimation : ValueAnimation,\n>(options: T): R {\n const animation = (\n isArrayAnimation(options)\n ? new ArrayAnimation(options)\n : new ValueAnimation(options)\n ) as R;\n animation.start();\n return animation;\n}\n\nexport function animateColor(options: ColorAnimationOptions) {\n const animation = new ColorAnimation(options);\n animation.start();\n return animation;\n}\n","import { Point } from './Point';\nimport { createVector } from './util/misc/vectors';\n\n/* Adaptation of work of Kevin Lindsey (kevin@kevlindev.com) */\n\nexport type IntersectionType = 'Intersection' | 'Coincident' | 'Parallel';\n\nexport class Intersection {\n declare points: Point[];\n\n declare status?: IntersectionType;\n\n constructor(status?: IntersectionType) {\n this.status = status;\n this.points = [];\n }\n\n /**\n * Used to verify if a point is alredy in the collection\n * @param {Point} point\n * @returns {boolean}\n */\n private includes(point: Point): boolean {\n return this.points.some((p) => p.eq(point));\n }\n\n /**\n * Appends points of intersection\n * @param {...Point[]} points\n * @return {Intersection} thisArg\n * @chainable\n */\n private append(...points: Point[]): Intersection {\n this.points = this.points.concat(\n points.filter((point) => {\n return !this.includes(point);\n }),\n );\n return this;\n }\n\n /**\n * check if point T is on the segment or line defined between A and B\n *\n * @param {Point} T the point we are checking for\n * @param {Point} A one extremity of the segment\n * @param {Point} B the other extremity of the segment\n * @param [infinite] if true checks if `T` is on the line defined by `A` and `B`\n * @returns true if `T` is contained\n */\n static isPointContained(T: Point, A: Point, B: Point, infinite = false) {\n if (A.eq(B)) {\n // Edge case: the segment is a point, we check for coincidence,\n // infinite param has no meaning because there are infinite lines to consider\n return T.eq(A);\n } else if (A.x === B.x) {\n // Edge case: horizontal line.\n // we first check if T.x has the same value, and then if T.y is contained between A.y and B.y\n return (\n T.x === A.x &&\n (infinite || (T.y >= Math.min(A.y, B.y) && T.y <= Math.max(A.y, B.y)))\n );\n } else if (A.y === B.y) {\n // Edge case: vertical line.\n // we first check if T.y has the same value, and then if T.x is contained between A.x and B.x\n return (\n T.y === A.y &&\n (infinite || (T.x >= Math.min(A.x, B.x) && T.x <= Math.max(A.x, B.x)))\n );\n } else {\n // Generic case: sloped line.\n // we check that AT has the same slope as AB\n // for the segment case we need both the vectors to have the same direction and for AT to be lte AB in size\n // for the infinite case we check the absolute value of the slope, since direction is meaningless\n const AB = createVector(A, B);\n const AT = createVector(A, T);\n const s = AT.divide(AB);\n return infinite\n ? Math.abs(s.x) === Math.abs(s.y)\n : s.x === s.y && s.x >= 0 && s.x <= 1;\n }\n }\n\n /**\n * Use the ray casting algorithm to determine if {@link point} is in the polygon defined by {@link points}\n * @see https://en.wikipedia.org/wiki/Point_in_polygon\n * @param point\n * @param points polygon points\n * @returns\n */\n static isPointInPolygon(point: Point, points: Point[]) {\n const other = new Point(point).setX(\n Math.min(point.x - 1, ...points.map((p) => p.x)),\n );\n let hits = 0;\n for (let index = 0; index < points.length; index++) {\n const inter = this.intersectSegmentSegment(\n // polygon side\n points[index],\n points[(index + 1) % points.length],\n // ray\n point,\n other,\n );\n if (inter.includes(point)) {\n // point is on the polygon side\n return true;\n }\n hits += Number(inter.status === 'Intersection');\n }\n return hits % 2 === 1;\n }\n\n /**\n * Checks if a line intersects another\n * @see {@link https://en.wikipedia.org/wiki/Line%E2%80%93line_intersection line intersection}\n * @see {@link https://en.wikipedia.org/wiki/Cramer%27s_rule Cramer's rule}\n * @param {Point} a1\n * @param {Point} a2\n * @param {Point} b1\n * @param {Point} b2\n * @param {boolean} [aInfinite=true] check segment intersection by passing `false`\n * @param {boolean} [bInfinite=true] check segment intersection by passing `false`\n * @return {Intersection}\n */\n static intersectLineLine(\n a1: Point,\n a2: Point,\n b1: Point,\n b2: Point,\n aInfinite = true,\n bInfinite = true,\n ): Intersection {\n const a2xa1x = a2.x - a1.x,\n a2ya1y = a2.y - a1.y,\n b2xb1x = b2.x - b1.x,\n b2yb1y = b2.y - b1.y,\n a1xb1x = a1.x - b1.x,\n a1yb1y = a1.y - b1.y,\n uaT = b2xb1x * a1yb1y - b2yb1y * a1xb1x,\n ubT = a2xa1x * a1yb1y - a2ya1y * a1xb1x,\n uB = b2yb1y * a2xa1x - b2xb1x * a2ya1y;\n if (uB !== 0) {\n const ua = uaT / uB,\n ub = ubT / uB;\n if (\n (aInfinite || (0 <= ua && ua <= 1)) &&\n (bInfinite || (0 <= ub && ub <= 1))\n ) {\n return new Intersection('Intersection').append(\n new Point(a1.x + ua * a2xa1x, a1.y + ua * a2ya1y),\n );\n } else {\n return new Intersection();\n }\n } else {\n if (uaT === 0 || ubT === 0) {\n const segmentsCoincide =\n aInfinite ||\n bInfinite ||\n Intersection.isPointContained(a1, b1, b2) ||\n Intersection.isPointContained(a2, b1, b2) ||\n Intersection.isPointContained(b1, a1, a2) ||\n Intersection.isPointContained(b2, a1, a2);\n return new Intersection(segmentsCoincide ? 'Coincident' : undefined);\n } else {\n return new Intersection('Parallel');\n }\n }\n }\n\n /**\n * Checks if a segment intersects a line\n * @see {@link intersectLineLine} for line intersection\n * @param {Point} s1 boundary point of segment\n * @param {Point} s2 other boundary point of segment\n * @param {Point} l1 point on line\n * @param {Point} l2 other point on line\n * @return {Intersection}\n */\n static intersectSegmentLine(\n s1: Point,\n s2: Point,\n l1: Point,\n l2: Point,\n ): Intersection {\n return Intersection.intersectLineLine(s1, s2, l1, l2, false, true);\n }\n\n /**\n * Checks if a segment intersects another\n * @see {@link intersectLineLine} for line intersection\n * @param {Point} a1 boundary point of segment\n * @param {Point} a2 other boundary point of segment\n * @param {Point} b1 boundary point of segment\n * @param {Point} b2 other boundary point of segment\n * @return {Intersection}\n */\n static intersectSegmentSegment(\n a1: Point,\n a2: Point,\n b1: Point,\n b2: Point,\n ): Intersection {\n return Intersection.intersectLineLine(a1, a2, b1, b2, false, false);\n }\n\n /**\n * Checks if line intersects polygon\n *\n * @todo account for stroke\n *\n * @see {@link intersectSegmentPolygon} for segment intersection\n * @param {Point} a1 point on line\n * @param {Point} a2 other point on line\n * @param {Point[]} points polygon points\n * @param {boolean} [infinite=true] check segment intersection by passing `false`\n * @return {Intersection}\n */\n static intersectLinePolygon(\n a1: Point,\n a2: Point,\n points: Point[],\n infinite = true,\n ): Intersection {\n const result = new Intersection();\n const length = points.length;\n\n for (let i = 0, b1, b2, inter; i < length; i++) {\n b1 = points[i];\n b2 = points[(i + 1) % length];\n inter = Intersection.intersectLineLine(a1, a2, b1, b2, infinite, false);\n if (inter.status === 'Coincident') {\n return inter;\n }\n result.append(...inter.points);\n }\n\n if (result.points.length > 0) {\n result.status = 'Intersection';\n }\n\n return result;\n }\n\n /**\n * Checks if segment intersects polygon\n * @see {@link intersectLinePolygon} for line intersection\n * @param {Point} a1 boundary point of segment\n * @param {Point} a2 other boundary point of segment\n * @param {Point[]} points polygon points\n * @return {Intersection}\n */\n static intersectSegmentPolygon(\n a1: Point,\n a2: Point,\n points: Point[],\n ): Intersection {\n return Intersection.intersectLinePolygon(a1, a2, points, false);\n }\n\n /**\n * Checks if polygon intersects another polygon\n *\n * @todo account for stroke\n *\n * @param {Point[]} points1\n * @param {Point[]} points2\n * @return {Intersection}\n */\n static intersectPolygonPolygon(\n points1: Point[],\n points2: Point[],\n ): Intersection {\n const result = new Intersection(),\n length = points1.length;\n const coincidences: Intersection[] = [];\n\n for (let i = 0; i < length; i++) {\n const a1 = points1[i],\n a2 = points1[(i + 1) % length],\n inter = Intersection.intersectSegmentPolygon(a1, a2, points2);\n if (inter.status === 'Coincident') {\n coincidences.push(inter);\n result.append(a1, a2);\n } else {\n result.append(...inter.points);\n }\n }\n\n if (coincidences.length > 0 && coincidences.length === points1.length) {\n return new Intersection('Coincident');\n } else if (result.points.length > 0) {\n result.status = 'Intersection';\n }\n\n return result;\n }\n\n /**\n * Checks if polygon intersects rectangle\n * @see {@link intersectPolygonPolygon} for polygon intersection\n * @param {Point[]} points polygon points\n * @param {Point} r1 top left point of rect\n * @param {Point} r2 bottom right point of rect\n * @return {Intersection}\n */\n static intersectPolygonRectangle(\n points: Point[],\n r1: Point,\n r2: Point,\n ): Intersection {\n const min = r1.min(r2),\n max = r1.max(r2),\n topRight = new Point(max.x, min.y),\n bottomLeft = new Point(min.x, max.y);\n\n return Intersection.intersectPolygonPolygon(points, [\n min,\n topRight,\n max,\n bottomLeft,\n ]);\n }\n}\n","import type {\n TBBox,\n TCornerPoint,\n TDegree,\n TMat2D,\n TOriginX,\n TOriginY,\n} from '../../typedefs';\nimport { SCALE_X, SCALE_Y, iMatrix } from '../../constants';\nimport { Intersection } from '../../Intersection';\nimport { Point } from '../../Point';\nimport { makeBoundingBoxFromPoints } from '../../util/misc/boundingBoxFromPoints';\nimport {\n createRotateMatrix,\n createTranslateMatrix,\n composeMatrix,\n invertTransform,\n multiplyTransformMatrices,\n transformPoint,\n calcPlaneRotation,\n} from '../../util/misc/matrix';\nimport { radiansToDegrees } from '../../util/misc/radiansDegreesConversion';\nimport type { Canvas } from '../../canvas/Canvas';\nimport type { StaticCanvas } from '../../canvas/StaticCanvas';\nimport type { ObjectEvents } from '../../EventTypeDefs';\nimport type { ControlProps } from './types/ControlProps';\nimport { resolveOrigin } from '../../util/misc/resolveOrigin';\nimport type { Group } from '../Group';\nimport { calcDimensionsMatrix } from '../../util/misc/matrix';\nimport { sizeAfterTransform } from '../../util/misc/objectTransforms';\nimport { degreesToRadians } from '../../util/misc/radiansDegreesConversion';\nimport { CommonMethods } from '../../CommonMethods';\nimport type { BaseProps } from './types/BaseProps';\nimport type { FillStrokeProps } from './types/FillStrokeProps';\nimport { CENTER, LEFT, TOP } from '../../constants';\n\ntype TMatrixCache = {\n key: number[];\n value: TMat2D;\n};\n\ntype TACoords = TCornerPoint;\n\nexport class ObjectGeometry\n extends CommonMethods\n implements\n Pick,\n BaseProps,\n Pick\n{\n // #region Geometry\n\n declare padding: number;\n\n /**\n * Describe object's corner position in scene coordinates.\n * The coordinates are derived from the following:\n * left, top, width, height, scaleX, scaleY, skewX, skewY, angle, strokeWidth.\n * The coordinates do not depend on viewport changes.\n * The coordinates get updated with {@link setCoords}.\n * You can calculate them without updating with {@link calcACoords()}\n */\n declare aCoords: TACoords;\n\n /**\n * storage cache for object transform matrix\n */\n declare ownMatrixCache?: TMatrixCache;\n\n /**\n * storage cache for object full transform matrix\n */\n declare matrixCache?: TMatrixCache;\n\n /**\n * A Reference of the Canvas where the object is actually added\n * @type StaticCanvas | Canvas;\n * @default undefined\n * @private\n */\n declare canvas?: StaticCanvas | Canvas;\n\n /**\n * @returns {number} x position according to object's {@link originX} property in canvas coordinate plane\n */\n getX(): number {\n return this.getXY().x;\n }\n\n /**\n * @param {number} value x position according to object's {@link originX} property in canvas coordinate plane\n */\n setX(value: number) {\n this.setXY(this.getXY().setX(value));\n }\n\n /**\n * @returns {number} y position according to object's {@link originY} property in canvas coordinate plane\n */\n getY(): number {\n return this.getXY().y;\n }\n\n /**\n * @param {number} value y position according to object's {@link originY} property in canvas coordinate plane\n */\n setY(value: number) {\n this.setXY(this.getXY().setY(value));\n }\n\n /**\n * @returns {number} x position according to object's {@link originX} property in parent's coordinate plane\\\n * if parent is canvas then this property is identical to {@link getX}\n */\n getRelativeX(): number {\n return this.left;\n }\n\n /**\n * @param {number} value x position according to object's {@link originX} property in parent's coordinate plane\\\n * if parent is canvas then this method is identical to {@link setX}\n */\n setRelativeX(value: number) {\n this.left = value;\n }\n\n /**\n * @returns {number} y position according to object's {@link originY} property in parent's coordinate plane\\\n * if parent is canvas then this property is identical to {@link getY}\n */\n getRelativeY(): number {\n return this.top;\n }\n\n /**\n * @param {number} value y position according to object's {@link originY} property in parent's coordinate plane\\\n * if parent is canvas then this property is identical to {@link setY}\n */\n setRelativeY(value: number) {\n this.top = value;\n }\n\n /**\n * @returns {Point} x position according to object's {@link originX} {@link originY} properties in canvas coordinate plane\n */\n getXY(): Point {\n const relativePosition = this.getRelativeXY();\n return this.group\n ? transformPoint(relativePosition, this.group.calcTransformMatrix())\n : relativePosition;\n }\n\n /**\n * Set an object position to a particular point, the point is intended in absolute ( canvas ) coordinate.\n * You can specify {@link originX} and {@link originY} values,\n * that otherwise are the object's current values.\n * @example Set object's bottom left corner to point (5,5) on canvas\n * object.setXY(new Point(5, 5), 'left', 'bottom').\n * @param {Point} point position in scene coordinate plane\n * @param {TOriginX} [originX] Horizontal origin: 'left', 'center' or 'right'\n * @param {TOriginY} [originY] Vertical origin: 'top', 'center' or 'bottom'\n */\n setXY(point: Point, originX?: TOriginX, originY?: TOriginY) {\n if (this.group) {\n point = transformPoint(\n point,\n invertTransform(this.group.calcTransformMatrix()),\n );\n }\n this.setRelativeXY(point, originX, originY);\n }\n\n /**\n * @returns {Point} x,y position according to object's {@link originX} {@link originY} properties in parent's coordinate plane\n */\n getRelativeXY(): Point {\n return new Point(this.left, this.top);\n }\n\n /**\n * As {@link setXY}, but in current parent's coordinate plane (the current group if any or the canvas)\n * @param {Point} point position according to object's {@link originX} {@link originY} properties in parent's coordinate plane\n * @param {TOriginX} [originX] Horizontal origin: 'left', 'center' or 'right'\n * @param {TOriginY} [originY] Vertical origin: 'top', 'center' or 'bottom'\n */\n setRelativeXY(\n point: Point,\n originX: TOriginX = this.originX,\n originY: TOriginY = this.originY,\n ) {\n this.setPositionByOrigin(point, originX, originY);\n }\n\n /**\n * @deprecated intermidiate method to be removed, do not use\n */\n protected isStrokeAccountedForInDimensions() {\n return false;\n }\n\n /**\n * @return {Point[]} [tl, tr, br, bl] in the scene plane\n */\n getCoords(): Point[] {\n const { tl, tr, br, bl } =\n this.aCoords || (this.aCoords = this.calcACoords());\n const coords = [tl, tr, br, bl];\n if (this.group) {\n const t = this.group.calcTransformMatrix();\n return coords.map((p) => transformPoint(p, t));\n }\n return coords;\n }\n\n /**\n * Checks if object intersects with the scene rect formed by {@link tl} and {@link br}\n */\n intersectsWithRect(tl: Point, br: Point): boolean {\n const intersection = Intersection.intersectPolygonRectangle(\n this.getCoords(),\n tl,\n br,\n );\n return intersection.status === 'Intersection';\n }\n\n /**\n * Checks if object intersects with another object\n * @param {Object} other Object to test\n * @return {Boolean} true if object intersects with another object\n */\n intersectsWithObject(other: ObjectGeometry): boolean {\n const intersection = Intersection.intersectPolygonPolygon(\n this.getCoords(),\n other.getCoords(),\n );\n\n return (\n intersection.status === 'Intersection' ||\n intersection.status === 'Coincident' ||\n other.isContainedWithinObject(this) ||\n this.isContainedWithinObject(other)\n );\n }\n\n /**\n * Checks if object is fully contained within area of another object\n * @param {Object} other Object to test\n * @return {Boolean} true if object is fully contained within area of another object\n */\n isContainedWithinObject(other: ObjectGeometry): boolean {\n const points = this.getCoords();\n return points.every((point) => other.containsPoint(point));\n }\n\n /**\n * Checks if object is fully contained within the scene rect formed by {@link tl} and {@link br}\n */\n isContainedWithinRect(tl: Point, br: Point): boolean {\n const { left, top, width, height } = this.getBoundingRect();\n return (\n left >= tl.x &&\n left + width <= br.x &&\n top >= tl.y &&\n top + height <= br.y\n );\n }\n\n isOverlapping(other: T): boolean {\n return (\n this.intersectsWithObject(other) ||\n this.isContainedWithinObject(other) ||\n other.isContainedWithinObject(this)\n );\n }\n\n /**\n * Checks if point is inside the object\n * @param {Point} point Point to check against\n * @return {Boolean} true if point is inside the object\n */\n containsPoint(point: Point): boolean {\n return Intersection.isPointInPolygon(point, this.getCoords());\n }\n\n /**\n * Checks if object is contained within the canvas with current viewportTransform\n * the check is done stopping at first point that appears on screen\n * @return {Boolean} true if object is fully or partially contained within canvas\n */\n isOnScreen(): boolean {\n if (!this.canvas) {\n return false;\n }\n const { tl, br } = this.canvas.vptCoords;\n const points = this.getCoords();\n // if some point is on screen, the object is on screen.\n if (\n points.some(\n (point) =>\n point.x <= br.x &&\n point.x >= tl.x &&\n point.y <= br.y &&\n point.y >= tl.y,\n )\n ) {\n return true;\n }\n // no points on screen, check intersection with absolute coordinates\n if (this.intersectsWithRect(tl, br)) {\n return true;\n }\n // check if the object is so big that it contains the entire viewport\n return this.containsPoint(tl.midPointFrom(br));\n }\n\n /**\n * Checks if object is partially contained within the canvas with current viewportTransform\n * @return {Boolean} true if object is partially contained within canvas\n */\n isPartiallyOnScreen(): boolean {\n if (!this.canvas) {\n return false;\n }\n const { tl, br } = this.canvas.vptCoords;\n if (this.intersectsWithRect(tl, br)) {\n return true;\n }\n const allPointsAreOutside = this.getCoords().every(\n (point) =>\n (point.x >= br.x || point.x <= tl.x) &&\n (point.y >= br.y || point.y <= tl.y),\n );\n // check if the object is so big that it contains the entire viewport\n return allPointsAreOutside && this.containsPoint(tl.midPointFrom(br));\n }\n\n /**\n * Returns coordinates of object's bounding rectangle (left, top, width, height)\n * the box is intended as aligned to axis of canvas.\n * @return {Object} Object with left, top, width, height properties\n */\n getBoundingRect(): TBBox {\n return makeBoundingBoxFromPoints(this.getCoords());\n }\n\n /**\n * Returns width of an object's bounding box counting transformations\n * @todo shouldn't this account for group transform and return the actual size in canvas coordinate plane?\n * @return {Number} width value\n */\n getScaledWidth(): number {\n return this._getTransformedDimensions().x;\n }\n\n /**\n * Returns height of an object bounding box counting transformations\n * @todo shouldn't this account for group transform and return the actual size in canvas coordinate plane?\n * @return {Number} height value\n */\n getScaledHeight(): number {\n return this._getTransformedDimensions().y;\n }\n\n /**\n * Scales an object (equally by x and y)\n * @param {Number} value Scale factor\n * @return {void}\n */\n scale(value: number): void {\n this._set(SCALE_X, value);\n this._set(SCALE_Y, value);\n this.setCoords();\n }\n\n /**\n * Scales an object to a given width, with respect to bounding box (scaling by x/y equally)\n * @param {Number} value New width value\n * @return {void}\n */\n scaleToWidth(value: number) {\n // adjust to bounding rect factor so that rotated shapes would fit as well\n const boundingRectFactor =\n this.getBoundingRect().width / this.getScaledWidth();\n return this.scale(value / this.width / boundingRectFactor);\n }\n\n /**\n * Scales an object to a given height, with respect to bounding box (scaling by x/y equally)\n * @param {Number} value New height value\n * @return {void}\n */\n scaleToHeight(value: number) {\n // adjust to bounding rect factor so that rotated shapes would fit as well\n const boundingRectFactor =\n this.getBoundingRect().height / this.getScaledHeight();\n return this.scale(value / this.height / boundingRectFactor);\n }\n\n getCanvasRetinaScaling() {\n return this.canvas?.getRetinaScaling() || 1;\n }\n\n /**\n * Returns the object angle relative to canvas counting also the group property\n * @returns {TDegree}\n */\n getTotalAngle(): TDegree {\n return this.group\n ? radiansToDegrees(calcPlaneRotation(this.calcTransformMatrix()))\n : this.angle;\n }\n\n /**\n * Retrieves viewportTransform from Object's canvas if available\n * @return {TMat2D}\n */\n getViewportTransform(): TMat2D {\n return this.canvas?.viewportTransform || (iMatrix.concat() as TMat2D);\n }\n\n /**\n * Calculates the coordinates of the 4 corner of the bbox, in absolute coordinates.\n * those never change with zoom or viewport changes.\n * @return {TCornerPoint}\n */\n calcACoords(): TCornerPoint {\n const rotateMatrix = createRotateMatrix({ angle: this.angle }),\n { x, y } = this.getRelativeCenterPoint(),\n tMatrix = createTranslateMatrix(x, y),\n finalMatrix = multiplyTransformMatrices(tMatrix, rotateMatrix),\n dim = this._getTransformedDimensions(),\n w = dim.x / 2,\n h = dim.y / 2;\n return {\n // corners\n tl: transformPoint({ x: -w, y: -h }, finalMatrix),\n tr: transformPoint({ x: w, y: -h }, finalMatrix),\n bl: transformPoint({ x: -w, y: h }, finalMatrix),\n br: transformPoint({ x: w, y: h }, finalMatrix),\n };\n }\n\n /**\n * Sets corner and controls position coordinates based on current angle, width and height, left and top.\n * aCoords are used to quickly find an object on the canvas.\n * See {@link https://github.com/fabricjs/fabric.js/wiki/When-to-call-setCoords} and {@link http://fabricjs.com/fabric-gotchas}\n */\n setCoords(): void {\n this.aCoords = this.calcACoords();\n }\n\n transformMatrixKey(skipGroup = false): number[] {\n let prefix: number[] = [];\n if (!skipGroup && this.group) {\n prefix = this.group.transformMatrixKey(skipGroup);\n }\n prefix.push(\n this.top,\n this.left,\n this.width,\n this.height,\n this.scaleX,\n this.scaleY,\n this.angle,\n this.strokeWidth,\n this.skewX,\n this.skewY,\n +this.flipX,\n +this.flipY,\n resolveOrigin(this.originX),\n resolveOrigin(this.originY),\n );\n\n return prefix;\n }\n\n /**\n * calculate transform matrix that represents the current transformations from the\n * object's properties.\n * @param {Boolean} [skipGroup] return transform matrix for object not counting parent transformations\n * There are some situation in which this is useful to avoid the fake rotation.\n * @return {TMat2D} transform matrix for the object\n */\n calcTransformMatrix(skipGroup = false): TMat2D {\n let matrix = this.calcOwnMatrix();\n if (skipGroup || !this.group) {\n return matrix;\n }\n const key = this.transformMatrixKey(skipGroup),\n cache = this.matrixCache;\n if (cache && cache.key.every((x, i) => x === key[i])) {\n return cache.value;\n }\n if (this.group) {\n matrix = multiplyTransformMatrices(\n this.group.calcTransformMatrix(false),\n matrix,\n );\n }\n this.matrixCache = {\n key,\n value: matrix,\n };\n return matrix;\n }\n\n /**\n * calculate transform matrix that represents the current transformations from the\n * object's properties, this matrix does not include the group transformation\n * @return {TMat2D} transform matrix for the object\n */\n calcOwnMatrix(): TMat2D {\n const key = this.transformMatrixKey(true),\n cache = this.ownMatrixCache;\n if (cache && cache.key === key) {\n return cache.value;\n }\n const center = this.getRelativeCenterPoint(),\n options = {\n angle: this.angle,\n translateX: center.x,\n translateY: center.y,\n scaleX: this.scaleX,\n scaleY: this.scaleY,\n skewX: this.skewX,\n skewY: this.skewY,\n flipX: this.flipX,\n flipY: this.flipY,\n },\n value = composeMatrix(options);\n this.ownMatrixCache = {\n key,\n value,\n };\n return value;\n }\n\n /**\n * Calculate object dimensions from its properties\n * @private\n * @returns {Point} dimensions\n */\n _getNonTransformedDimensions(): Point {\n return new Point(this.width, this.height).scalarAdd(this.strokeWidth);\n }\n\n /**\n * Calculate object dimensions for controls box, including padding and canvas zoom.\n * and active selection\n * @private\n * @param {object} [options] transform options\n * @returns {Point} dimensions\n */\n _calculateCurrentDimensions(options?: any): Point {\n return this._getTransformedDimensions(options)\n .transform(this.getViewportTransform(), true)\n .scalarAdd(2 * this.padding);\n }\n\n // #region Origin\n\n declare top: number;\n declare left: number;\n declare width: number;\n declare height: number;\n declare flipX: boolean;\n declare flipY: boolean;\n declare scaleX: number;\n declare scaleY: number;\n declare skewX: number;\n declare skewY: number;\n /**\n * @deprecated please use 'center' as value in new projects\n * */\n declare originX: TOriginX;\n /**\n * @deprecated please use 'center' as value in new projects\n * */\n declare originY: TOriginY;\n declare angle: TDegree;\n declare strokeWidth: number;\n declare strokeUniform: boolean;\n\n /**\n * Object containing this object.\n * can influence its size and position\n */\n declare group?: Group;\n\n /**\n * Calculate object bounding box dimensions from its properties scale, skew.\n * This bounding box is aligned with object angle and not with canvas axis or screen.\n * @param {Object} [options]\n * @param {Number} [options.scaleX]\n * @param {Number} [options.scaleY]\n * @param {Number} [options.skewX]\n * @param {Number} [options.skewY]\n * @private\n * @returns {Point} dimensions\n */\n _getTransformedDimensions(options: any = {}): Point {\n const dimOptions = {\n // if scaleX or scaleY are negative numbers,\n // this will return dimensions that are negative.\n // and this will break assumptions around the codebase\n scaleX: this.scaleX,\n scaleY: this.scaleY,\n skewX: this.skewX,\n skewY: this.skewY,\n width: this.width,\n height: this.height,\n strokeWidth: this.strokeWidth,\n // TODO remove this spread. is visible in the performance inspection\n ...options,\n };\n // stroke is applied before/after transformations are applied according to `strokeUniform`\n const strokeWidth = dimOptions.strokeWidth;\n let preScalingStrokeValue = strokeWidth,\n postScalingStrokeValue = 0;\n\n if (this.strokeUniform) {\n preScalingStrokeValue = 0;\n postScalingStrokeValue = strokeWidth;\n }\n const dimX = dimOptions.width + preScalingStrokeValue,\n dimY = dimOptions.height + preScalingStrokeValue,\n noSkew = dimOptions.skewX === 0 && dimOptions.skewY === 0;\n let finalDimensions;\n if (noSkew) {\n finalDimensions = new Point(\n dimX * dimOptions.scaleX,\n dimY * dimOptions.scaleY,\n );\n } else {\n finalDimensions = sizeAfterTransform(\n dimX,\n dimY,\n calcDimensionsMatrix(dimOptions),\n );\n }\n\n return finalDimensions.scalarAdd(postScalingStrokeValue);\n }\n\n /**\n * Translates the coordinates from a set of origin to another (based on the object's dimensions)\n * @param {Point} point The point which corresponds to the originX and originY params\n * @param {TOriginX} fromOriginX Horizontal origin: 'left', 'center' or 'right'\n * @param {TOriginY} fromOriginY Vertical origin: 'top', 'center' or 'bottom'\n * @param {TOriginX} toOriginX Horizontal origin: 'left', 'center' or 'right'\n * @param {TOriginY} toOriginY Vertical origin: 'top', 'center' or 'bottom'\n * @return {Point}\n */\n translateToGivenOrigin(\n point: Point,\n fromOriginX: TOriginX,\n fromOriginY: TOriginY,\n toOriginX: TOriginX,\n toOriginY: TOriginY,\n ): Point {\n let x = point.x,\n y = point.y;\n const offsetX = resolveOrigin(toOriginX) - resolveOrigin(fromOriginX),\n offsetY = resolveOrigin(toOriginY) - resolveOrigin(fromOriginY);\n\n if (offsetX || offsetY) {\n const dim = this._getTransformedDimensions();\n x += offsetX * dim.x;\n y += offsetY * dim.y;\n }\n\n return new Point(x, y);\n }\n\n /**\n * Translates the coordinates from origin to center coordinates (based on the object's dimensions)\n * @param {Point} point The point which corresponds to the originX and originY params\n * @param {TOriginX} originX Horizontal origin: 'left', 'center' or 'right'\n * @param {TOriginY} originY Vertical origin: 'top', 'center' or 'bottom'\n * @return {Point}\n */\n translateToCenterPoint(\n point: Point,\n originX: TOriginX,\n originY: TOriginY,\n ): Point {\n if (originX === CENTER && originY === CENTER) {\n return point;\n }\n const p = this.translateToGivenOrigin(\n point,\n originX,\n originY,\n CENTER,\n CENTER,\n );\n if (this.angle) {\n return p.rotate(degreesToRadians(this.angle), point);\n }\n return p;\n }\n\n /**\n * Translates the coordinates from center to origin coordinates (based on the object's dimensions)\n * @param {Point} center The point which corresponds to center of the object\n * @param {OriginX} originX Horizontal origin: 'left', 'center' or 'right'\n * @param {OriginY} originY Vertical origin: 'top', 'center' or 'bottom'\n * @return {Point}\n */\n translateToOriginPoint(\n center: Point,\n originX: TOriginX,\n originY: TOriginY,\n ): Point {\n const p = this.translateToGivenOrigin(\n center,\n CENTER,\n CENTER,\n originX,\n originY,\n );\n if (this.angle) {\n return p.rotate(degreesToRadians(this.angle), center);\n }\n return p;\n }\n\n /**\n * Returns the center coordinates of the object relative to canvas\n * @return {Point}\n */\n getCenterPoint(): Point {\n const relCenter = this.getRelativeCenterPoint();\n return this.group\n ? transformPoint(relCenter, this.group.calcTransformMatrix())\n : relCenter;\n }\n\n /**\n * Returns the center coordinates of the object relative to it's parent\n * @return {Point}\n */\n getRelativeCenterPoint(): Point {\n return this.translateToCenterPoint(\n new Point(this.left, this.top),\n this.originX,\n this.originY,\n );\n }\n\n /**\n * Returns the position of the object as if it has a different origin.\n * Take an object that has left, top set to 100, 100 with origin 'left', 'top'.\n * Return the values of left top ( wrapped in a point ) that you would need to keep\n * the same position if origin where different.\n * Alternatively you can use this to also find which point in the parent plane is a specific origin\n * ( where is the bottom right corner of my object? )\n * @param {TOriginX} originX Horizontal origin: 'left', 'center' or 'right'\n * @param {TOriginY} originY Vertical origin: 'top', 'center' or 'bottom'\n * @return {Point}\n */\n getPointByOrigin(originX: TOriginX, originY: TOriginY): Point {\n return this.translateToOriginPoint(\n this.getRelativeCenterPoint(),\n originX,\n originY,\n );\n }\n\n /**\n * Sets the position of the object taking into consideration the object's origin\n * @param {Point} pos The new position of the object\n * @param {TOriginX} originX Horizontal origin: 'left', 'center' or 'right'\n * @param {TOriginY} originY Vertical origin: 'top', 'center' or 'bottom'\n * @return {void}\n */\n setPositionByOrigin(pos: Point, originX: TOriginX, originY: TOriginY) {\n const center = this.translateToCenterPoint(pos, originX, originY),\n position = this.translateToOriginPoint(\n center,\n this.originX,\n this.originY,\n );\n this.set({ left: position.x, top: position.y });\n }\n\n /**\n * @private\n */\n _getLeftTopCoords() {\n return this.translateToOriginPoint(\n this.getRelativeCenterPoint(),\n LEFT,\n TOP,\n );\n }\n}\n","import { cache } from '../../cache';\nimport { config } from '../../config';\nimport {\n ALIASING_LIMIT,\n CENTER,\n iMatrix,\n LEFT,\n SCALE_X,\n SCALE_Y,\n STROKE,\n FILL,\n TOP,\n VERSION,\n} from '../../constants';\nimport type { ObjectEvents } from '../../EventTypeDefs';\nimport { Point } from '../../Point';\nimport { Shadow } from '../../Shadow';\nimport type {\n TDegree,\n TFiller,\n TSize,\n TCacheCanvasDimensions,\n Abortable,\n TOptions,\n ImageFormat,\n} from '../../typedefs';\nimport { classRegistry } from '../../ClassRegistry';\nimport { runningAnimations } from '../../util/animation/AnimationRegistry';\nimport { capValue } from '../../util/misc/capValue';\nimport {\n createCanvasElement,\n createCanvasElementFor,\n toDataURL,\n toBlob,\n} from '../../util/misc/dom';\nimport { invertTransform, qrDecompose } from '../../util/misc/matrix';\nimport { enlivenObjectEnlivables } from '../../util/misc/objectEnlive';\nimport {\n resetObjectTransform,\n saveObjectTransform,\n} from '../../util/misc/objectTransforms';\nimport { sendObjectToPlane } from '../../util/misc/planeChange';\nimport { pick, pickBy } from '../../util/misc/pick';\nimport { toFixed } from '../../util/misc/toFixed';\nimport type { Group } from '../Group';\nimport { StaticCanvas } from '../../canvas/StaticCanvas';\nimport { isFiller, isSerializableFiller } from '../../util/typeAssertions';\nimport type { FabricImage } from '../Image';\nimport {\n cacheProperties,\n fabricObjectDefaultValues,\n stateProperties,\n} from './defaultValues';\nimport type { Gradient } from '../../gradient/Gradient';\nimport type { Pattern } from '../../Pattern';\nimport type { Canvas } from '../../canvas/Canvas';\nimport type { SerializedObjectProps } from './types/SerializedObjectProps';\nimport type { ObjectProps } from './types/ObjectProps';\nimport { getDevicePixelRatio, getEnv } from '../../env';\nimport { log } from '../../util/internals/console';\nimport type { TColorArg } from '../../color/typedefs';\nimport type { TAnimation } from '../../util/animation/animate';\nimport { animate, animateColor } from '../../util/animation/animate';\nimport type {\n AnimationOptions,\n ArrayAnimationOptions,\n ColorAnimationOptions,\n ValueAnimationOptions,\n} from '../../util/animation/types';\nimport { ObjectGeometry } from './ObjectGeometry';\n\ntype TAncestor = FabricObject;\ntype TCollection = Group;\n\nexport type Ancestors =\n | [FabricObject | Group]\n | [FabricObject | Group, ...Group[]]\n | Group[];\n\nexport type AncestryComparison = {\n /**\n * common ancestors of `this` and`other`(may include`this` | `other`)\n */\n common: Ancestors;\n /**\n * ancestors that are of `this` only\n */\n fork: Ancestors;\n /**\n * ancestors that are of `other` only\n */\n otherFork: Ancestors;\n};\n\nexport type TCachedFabricObject = T &\n Required<\n Pick<\n T,\n | 'zoomX'\n | 'zoomY'\n | '_cacheCanvas'\n | '_cacheContext'\n | 'cacheTranslationX'\n | 'cacheTranslationY'\n >\n > & {\n _cacheContext: CanvasRenderingContext2D;\n };\n\nexport type ObjectToCanvasElementOptions = {\n format?: ImageFormat;\n /** Multiplier to scale by */\n multiplier?: number;\n /** Cropping left offset. Introduced in v1.2.14 */\n left?: number;\n /** Cropping top offset. Introduced in v1.2.14 */\n top?: number;\n /** Cropping width. Introduced in v1.2.14 */\n width?: number;\n /** Cropping height. Introduced in v1.2.14 */\n height?: number;\n /** Enable retina scaling for clone image. Introduce in 1.6.4 */\n enableRetinaScaling?: boolean;\n /** Remove current object transform ( no scale , no angle, no flip, no skew ). Introduced in 2.3.4 */\n withoutTransform?: boolean;\n /** Remove current object shadow. Introduced in 2.4.2 */\n withoutShadow?: boolean;\n /** Account for canvas viewport transform */\n viewportTransform?: boolean;\n /** Function to create the output canvas to export onto */\n canvasProvider?: (el?: HTMLCanvasElement) => T;\n};\n\ntype toDataURLOptions = ObjectToCanvasElementOptions & {\n quality?: number;\n};\n\nexport type DrawContext =\n | {\n parentClipPaths: FabricObject[];\n width: number;\n height: number;\n cacheTranslationX: number;\n cacheTranslationY: number;\n zoomX: number;\n zoomY: number;\n }\n | Record;\n\n/**\n * Root object class from which all 2d shape classes inherit from\n * @tutorial {@link http://fabricjs.com/fabric-intro-part-1#objects}\n *\n * @fires added\n * @fires removed\n *\n * @fires selected\n * @fires deselected\n *\n * @fires rotating\n * @fires scaling\n * @fires moving\n * @fires skewing\n * @fires modified\n *\n * @fires mousedown\n * @fires mouseup\n * @fires mouseover\n * @fires mouseout\n * @fires mousewheel\n * @fires mousedblclick\n *\n * @fires dragover\n * @fires dragenter\n * @fires dragleave\n * @fires drop\n */\nexport class FabricObject<\n Props extends TOptions = Partial,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n SProps extends SerializedObjectProps = SerializedObjectProps,\n EventSpec extends ObjectEvents = ObjectEvents,\n >\n extends ObjectGeometry\n implements ObjectProps\n{\n declare minScaleLimit: number;\n\n declare opacity: number;\n\n declare paintFirst: 'fill' | 'stroke';\n declare fill: string | TFiller | null;\n declare fillRule: CanvasFillRule;\n declare stroke: string | TFiller | null;\n declare strokeDashArray: number[] | null;\n declare strokeDashOffset: number;\n declare strokeLineCap: CanvasLineCap;\n declare strokeLineJoin: CanvasLineJoin;\n declare strokeMiterLimit: number;\n\n declare globalCompositeOperation: GlobalCompositeOperation;\n declare backgroundColor: string;\n\n declare shadow: Shadow | null;\n\n declare visible: boolean;\n\n declare includeDefaultValues: boolean;\n declare excludeFromExport: boolean;\n\n declare objectCaching: boolean;\n\n declare clipPath?: FabricObject;\n declare inverted: boolean;\n declare absolutePositioned: boolean;\n declare centeredRotation: boolean;\n declare centeredScaling: boolean;\n\n /**\n * This list of properties is used to check if the state of an object is changed.\n * This state change now is only used for children of groups to understand if a group\n * needs its cache regenerated during a .set call\n * @type Array\n */\n static stateProperties: string[] = stateProperties;\n\n /**\n * List of properties to consider when checking if cache needs refresh\n * Those properties are checked by\n * calls to Object.set(key, value). If the key is in this list, the object is marked as dirty\n * and refreshed at the next render\n * @type Array\n */\n static cacheProperties: string[] = cacheProperties;\n\n /**\n * When set to `true`, object's cache will be rerendered next render call.\n * since 1.7.0\n * @type Boolean\n * @default true\n */\n declare dirty: boolean;\n\n /**\n * Quick access for the _cacheCanvas rendering context\n * This is part of the objectCaching feature\n * since 1.7.0\n * @type boolean\n * @default undefined\n * @private\n */\n _cacheContext: CanvasRenderingContext2D | null = null;\n\n /**\n * A reference to the HTMLCanvasElement that is used to contain the cache of the object\n * this canvas element is resized and cleared as needed\n * Is marked private, you can read it, don't use it since it is handled by fabric\n * since 1.7.0\n * @type HTMLCanvasElement\n * @default undefined\n * @private\n */\n declare _cacheCanvas?: HTMLCanvasElement;\n\n /**\n * zoom level used on the cacheCanvas to draw the cache, X axe\n * since 1.7.0\n * @type number\n * @default undefined\n * @private\n */\n declare zoomX?: number;\n\n /**\n * zoom level used on the cacheCanvas to draw the cache, Y axe\n * since 1.7.0\n * @type number\n * @default undefined\n * @private\n */\n declare zoomY?: number;\n\n /**\n * zoom level used on the cacheCanvas to draw the cache, Y axe\n * since 1.7.0\n * @type number\n * @default undefined\n * @private\n */\n declare cacheTranslationX?: number;\n\n /**\n * translation of the cacheCanvas away from the center, for subpixel accuracy and crispness\n * since 1.7.0\n * @type number\n * @default undefined\n * @private\n */\n declare cacheTranslationY?: number;\n\n /**\n * A reference to the parent of the object, usually a Group\n * @type number\n * @default undefined\n * @private\n */\n declare group?: Group;\n\n /**\n * Indicate if the object is sitting on a cache dedicated to it\n * or is part of a larger cache for many object ( a group for example)\n * @type number\n * @default undefined\n * @private\n */\n declare ownCaching?: boolean;\n\n /**\n * Private. indicates if the object inside a group is on a transformed context or not\n * or is part of a larger cache for many object ( a group for example)\n * @type boolean\n * @default undefined\n * @private\n */\n declare _transformDone?: boolean;\n\n static ownDefaults = fabricObjectDefaultValues;\n\n static getDefaults(): Record {\n return FabricObject.ownDefaults;\n }\n\n /**\n * The class type.\n * This is used for serialization and deserialization purposes and internally it can be used\n * to identify classes.\n * When we transform a class in a plain JS object we need a way to recognize which class it was,\n * and the type is the way we do that. It has no other purposes and you should not give one.\n * Hard to reach on instances and please do not use to drive instance's logic (this.constructor.type).\n * To idenfity a class use instanceof class ( instanceof Rect ).\n * We do not do that in fabricJS code because we want to try to have code splitting possible.\n */\n static type = 'FabricObject';\n\n /**\n * Legacy identifier of the class. Prefer using utils like isType or instanceOf\n * Will be removed in fabric 7 or 8.\n * The setter exists to avoid type errors in old code and possibly current deserialization code.\n * DO NOT build new code around this type value\n * @TODO add sustainable warning message\n * @type string\n * @deprecated\n */\n get type() {\n const name = (this.constructor as typeof FabricObject).type;\n if (name === 'FabricObject') {\n return 'object';\n }\n return name.toLowerCase();\n }\n\n set type(value) {\n log('warn', 'Setting type has no effect', value);\n }\n\n /**\n * Constructor\n * @param {Object} [options] Options object\n */\n constructor(options?: Props) {\n super();\n Object.assign(this, FabricObject.ownDefaults);\n this.setOptions(options);\n }\n\n /**\n * Create a the canvas used to keep the cached copy of the object\n * @private\n */\n _createCacheCanvas() {\n this._cacheCanvas = createCanvasElement();\n this._cacheContext = this._cacheCanvas.getContext('2d');\n this._updateCacheCanvas();\n // if canvas gets created, is empty, so dirty.\n this.dirty = true;\n }\n\n /**\n * Limit the cache dimensions so that X * Y do not cross config.perfLimitSizeTotal\n * and each side do not cross fabric.cacheSideLimit\n * those numbers are configurable so that you can get as much detail as you want\n * making bargain with performances.\n * It mutates the input object dims.\n * @param {TCacheCanvasDimensions} dims\n * @return {TCacheCanvasDimensions} dims\n */\n _limitCacheSize(\n dims: TCacheCanvasDimensions & { capped?: boolean },\n ): TCacheCanvasDimensions & { capped?: boolean } {\n const width = dims.width,\n height = dims.height,\n max = config.maxCacheSideLimit,\n min = config.minCacheSideLimit;\n if (\n width <= max &&\n height <= max &&\n width * height <= config.perfLimitSizeTotal\n ) {\n if (width < min) {\n dims.width = min;\n }\n if (height < min) {\n dims.height = min;\n }\n return dims;\n }\n const ar = width / height,\n [limX, limY] = cache.limitDimsByArea(ar),\n x = capValue(min, limX, max),\n y = capValue(min, limY, max);\n if (width > x) {\n dims.zoomX /= width / x;\n dims.width = x;\n dims.capped = true;\n }\n if (height > y) {\n dims.zoomY /= height / y;\n dims.height = y;\n dims.capped = true;\n }\n return dims;\n }\n\n /**\n * Return the dimension and the zoom level needed to create a cache canvas\n * big enough to host the object to be cached.\n * @private\n * @return {TCacheCanvasDimensions} Informations about the object to be cached\n */\n _getCacheCanvasDimensions(): TCacheCanvasDimensions {\n const objectScale = this.getTotalObjectScaling(),\n // calculate dimensions without skewing\n dim = this._getTransformedDimensions({ skewX: 0, skewY: 0 }),\n neededX = (dim.x * objectScale.x) / this.scaleX,\n neededY = (dim.y * objectScale.y) / this.scaleY;\n return {\n // for sure this ALIASING_LIMIT is slightly creating problem\n // in situation in which the cache canvas gets an upper limit\n // also objectScale contains already scaleX and scaleY\n width: Math.ceil(neededX + ALIASING_LIMIT),\n height: Math.ceil(neededY + ALIASING_LIMIT),\n zoomX: objectScale.x,\n zoomY: objectScale.y,\n x: neededX,\n y: neededY,\n };\n }\n\n /**\n * Update width and height of the canvas for cache\n * returns true or false if canvas needed resize.\n * @private\n * @return {Boolean} true if the canvas has been resized\n */\n _updateCacheCanvas() {\n const canvas = this._cacheCanvas!,\n context = this._cacheContext,\n { width, height, zoomX, zoomY, x, y } = this._limitCacheSize(\n this._getCacheCanvasDimensions(),\n ),\n dimensionsChanged = width !== canvas.width || height !== canvas.height,\n zoomChanged = this.zoomX !== zoomX || this.zoomY !== zoomY;\n\n if (!canvas || !context) {\n return false;\n }\n\n const shouldRedraw = dimensionsChanged || zoomChanged;\n\n if (shouldRedraw) {\n if (width !== canvas.width || height !== canvas.height) {\n canvas.width = width;\n canvas.height = height;\n } else {\n context.setTransform(1, 0, 0, 1, 0, 0);\n context.clearRect(0, 0, canvas.width, canvas.height);\n }\n const drawingWidth = x / 2;\n const drawingHeight = y / 2;\n this.cacheTranslationX =\n Math.round(canvas.width / 2 - drawingWidth) + drawingWidth;\n this.cacheTranslationY =\n Math.round(canvas.height / 2 - drawingHeight) + drawingHeight;\n context.translate(this.cacheTranslationX, this.cacheTranslationY);\n context.scale(zoomX, zoomY);\n this.zoomX = zoomX;\n this.zoomY = zoomY;\n return true;\n }\n return false;\n }\n\n /**\n * Sets object's properties from options, for class constructor only.\n * Needs to be overridden for different defaults.\n * @protected\n * @param {Object} [options] Options object\n */\n protected setOptions(options: Record = {}) {\n this._setOptions(options);\n }\n\n /**\n * Transforms context when rendering an object\n * @param {CanvasRenderingContext2D} ctx Context\n */\n transform(ctx: CanvasRenderingContext2D) {\n const needFullTransform =\n (this.group && !this.group._transformDone) ||\n (this.group && this.canvas && ctx === (this.canvas as Canvas).contextTop);\n const m = this.calcTransformMatrix(!needFullTransform);\n ctx.transform(m[0], m[1], m[2], m[3], m[4], m[5]);\n }\n\n /**\n * Return the object scale factor counting also the group scaling\n * @return {Point}\n */\n getObjectScaling() {\n // if the object is a top level one, on the canvas, we go for simple aritmetic\n // otherwise the complex method with angles will return approximations and decimals\n // and will likely kill the cache when not needed\n // https://github.com/fabricjs/fabric.js/issues/7157\n if (!this.group) {\n return new Point(Math.abs(this.scaleX), Math.abs(this.scaleY));\n }\n // if we are inside a group total zoom calculation is complex, we defer to generic matrices\n const options = qrDecompose(this.calcTransformMatrix());\n return new Point(Math.abs(options.scaleX), Math.abs(options.scaleY));\n }\n\n /**\n * Return the object scale factor counting also the group scaling, zoom and retina\n * @return {Object} object with scaleX and scaleY properties\n */\n getTotalObjectScaling() {\n const scale = this.getObjectScaling();\n if (this.canvas) {\n const zoom = this.canvas.getZoom();\n const retina = this.getCanvasRetinaScaling();\n return scale.scalarMultiply(zoom * retina);\n }\n return scale;\n }\n\n /**\n * Return the object opacity counting also the group property\n * @return {Number}\n */\n getObjectOpacity() {\n let opacity = this.opacity;\n if (this.group) {\n opacity *= this.group.getObjectOpacity();\n }\n return opacity;\n }\n\n /**\n * Makes sure the scale is valid and modifies it if necessary\n * @todo: this is a control action issue, not a geometry one\n * @private\n * @param {Number} value, unconstrained\n * @return {Number} constrained value;\n */\n _constrainScale(value: number): number {\n if (Math.abs(value) < this.minScaleLimit) {\n if (value < 0) {\n return -this.minScaleLimit;\n } else {\n return this.minScaleLimit;\n }\n } else if (value === 0) {\n return 0.0001;\n }\n return value;\n }\n\n /**\n * Handles setting values on the instance and handling internal side effects\n * @protected\n * @param {String} key\n * @param {*} value\n */\n _set(key: string, value: any) {\n if (key === SCALE_X || key === SCALE_Y) {\n value = this._constrainScale(value);\n }\n if (key === SCALE_X && value < 0) {\n this.flipX = !this.flipX;\n value *= -1;\n } else if (key === 'scaleY' && value < 0) {\n this.flipY = !this.flipY;\n value *= -1;\n // i don't like this automatic initialization here\n } else if (key === 'shadow' && value && !(value instanceof Shadow)) {\n value = new Shadow(value);\n }\n\n const isChanged = this[key as keyof this] !== value;\n this[key as keyof this] = value;\n\n // invalidate caches\n if (\n isChanged &&\n (this.constructor as typeof FabricObject).cacheProperties.includes(key)\n ) {\n this.dirty = true;\n }\n // a dirty child makes the parent dirty.\n // but a non dirty child does not make the parent not dirty.\n // the parent could be dirty for some other reason.\n this.parent &&\n (this.dirty ||\n (isChanged &&\n (this.constructor as typeof FabricObject).stateProperties.includes(\n key,\n ))) &&\n this.parent._set('dirty', true);\n\n return this;\n }\n\n /**\n * return if the object would be visible in rendering\n * @return {Boolean}\n */\n isNotVisible() {\n return (\n this.opacity === 0 ||\n (!this.width && !this.height && this.strokeWidth === 0) ||\n !this.visible\n );\n }\n\n /**\n * Renders an object on a specified context\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n render(ctx: CanvasRenderingContext2D) {\n // do not render if width/height are zeros or object is not visible\n if (this.isNotVisible()) {\n return;\n }\n if (\n this.canvas &&\n this.canvas.skipOffscreen &&\n !this.group &&\n !this.isOnScreen()\n ) {\n return;\n }\n ctx.save();\n this._setupCompositeOperation(ctx);\n this.drawSelectionBackground(ctx);\n this.transform(ctx);\n this._setOpacity(ctx);\n this._setShadow(ctx);\n if (this.shouldCache()) {\n (this as TCachedFabricObject).renderCache();\n (this as TCachedFabricObject).drawCacheOnCanvas(ctx);\n } else {\n this._removeCacheCanvas();\n this.drawObject(ctx, false, {});\n this.dirty = false;\n }\n ctx.restore();\n }\n\n drawSelectionBackground(_ctx: CanvasRenderingContext2D) {\n /* no op */\n }\n\n renderCache(this: TCachedFabricObject, options?: any) {\n options = options || {};\n if (!this._cacheCanvas || !this._cacheContext) {\n this._createCacheCanvas();\n }\n if (this.isCacheDirty() && this._cacheContext) {\n const { zoomX, zoomY, cacheTranslationX, cacheTranslationY } = this;\n const { width, height } = this._cacheCanvas;\n this.drawObject(this._cacheContext, options.forClipping, {\n zoomX,\n zoomY,\n cacheTranslationX,\n cacheTranslationY,\n width,\n height,\n parentClipPaths: [],\n });\n this.dirty = false;\n }\n }\n\n /**\n * Remove cacheCanvas and its dimensions from the objects\n */\n _removeCacheCanvas() {\n this._cacheCanvas = undefined;\n this._cacheContext = null;\n }\n\n /**\n * return true if the object will draw a stroke\n * Does not consider text styles. This is just a shortcut used at rendering time\n * We want it to be an approximation and be fast.\n * wrote to avoid extra caching, it has to return true when stroke happens,\n * can guess when it will not happen at 100% chance, does not matter if it misses\n * some use case where the stroke is invisible.\n * @since 3.0.0\n * @returns Boolean\n */\n hasStroke(): boolean {\n return (\n !!this.stroke && this.stroke !== 'transparent' && this.strokeWidth !== 0\n );\n }\n\n /**\n * return true if the object will draw a fill\n * Does not consider text styles. This is just a shortcut used at rendering time\n * We want it to be an approximation and be fast.\n * wrote to avoid extra caching, it has to return true when fill happens,\n * can guess when it will not happen at 100% chance, does not matter if it misses\n * some use case where the fill is invisible.\n * @since 3.0.0\n * @returns Boolean\n */\n hasFill(): boolean {\n return !!this.fill && this.fill !== 'transparent';\n }\n\n /**\n * When returns `true`, force the object to have its own cache, even if it is inside a group\n * it may be needed when your object behave in a particular way on the cache and always needs\n * its own isolated canvas to render correctly.\n * Created to be overridden\n * since 1.7.12\n * @returns Boolean\n */\n needsItsOwnCache() {\n // TODO re-evaluate this shadow condition\n if (\n this.paintFirst === STROKE &&\n this.hasFill() &&\n this.hasStroke() &&\n !!this.shadow\n ) {\n return true;\n }\n if (this.clipPath) {\n return true;\n }\n return false;\n }\n\n /**\n * Decide if the object should cache or not. Create its own cache level\n * objectCaching is a global flag, wins over everything\n * needsItsOwnCache should be used when the object drawing method requires\n * a cache step.\n * Generally you do not cache objects in groups because the group outside is cached.\n * Read as: cache if is needed, or if the feature is enabled but we are not already caching.\n * @return {Boolean}\n */\n shouldCache() {\n this.ownCaching =\n (this.objectCaching && (!this.parent || !this.parent.isOnACache())) ||\n this.needsItsOwnCache();\n return this.ownCaching;\n }\n\n /**\n * Check if this object will cast a shadow with an offset.\n * used by Group.shouldCache to know if child has a shadow recursively\n * @return {Boolean}\n * @deprecated\n */\n willDrawShadow() {\n return (\n !!this.shadow && (this.shadow.offsetX !== 0 || this.shadow.offsetY !== 0)\n );\n }\n\n /**\n * Execute the drawing operation for an object clipPath\n * @param {CanvasRenderingContext2D} ctx Context to render on\n * @param {FabricObject} clipPath\n */\n drawClipPathOnCache(\n ctx: CanvasRenderingContext2D,\n clipPath: FabricObject,\n canvasWithClipPath: HTMLCanvasElement,\n ) {\n ctx.save();\n // DEBUG: uncomment this line, comment the following\n // ctx.globalAlpha = 0.4\n if (clipPath.inverted) {\n ctx.globalCompositeOperation = 'destination-out';\n } else {\n ctx.globalCompositeOperation = 'destination-in';\n }\n ctx.setTransform(1, 0, 0, 1, 0, 0);\n ctx.drawImage(canvasWithClipPath, 0, 0);\n ctx.restore();\n }\n\n /**\n * Execute the drawing operation for an object on a specified context\n * @param {CanvasRenderingContext2D} ctx Context to render on\n * @param {boolean} forClipping apply clipping styles\n * @param {DrawContext} context additional context for rendering\n */\n drawObject(\n ctx: CanvasRenderingContext2D,\n forClipping: boolean | undefined,\n context: DrawContext,\n ) {\n const originalFill = this.fill,\n originalStroke = this.stroke;\n if (forClipping) {\n this.fill = 'black';\n this.stroke = '';\n this._setClippingProperties(ctx);\n } else {\n this._renderBackground(ctx);\n }\n this._render(ctx);\n this._drawClipPath(ctx, this.clipPath, context);\n this.fill = originalFill;\n this.stroke = originalStroke;\n }\n\n private createClipPathLayer(\n this: TCachedFabricObject,\n clipPath: FabricObject,\n context: DrawContext,\n ) {\n const canvas = createCanvasElementFor(context as TSize);\n const ctx = canvas.getContext('2d')!;\n ctx.translate(context.cacheTranslationX, context.cacheTranslationY);\n ctx.scale(context.zoomX, context.zoomY);\n clipPath._cacheCanvas = canvas;\n context.parentClipPaths.forEach((prevClipPath) => {\n prevClipPath.transform(ctx);\n });\n context.parentClipPaths.push(clipPath);\n if (clipPath.absolutePositioned) {\n const m = invertTransform(this.calcTransformMatrix());\n ctx.transform(m[0], m[1], m[2], m[3], m[4], m[5]);\n }\n clipPath.transform(ctx);\n clipPath.drawObject(ctx, true, context);\n return canvas;\n }\n\n /**\n * Prepare clipPath state and cache and draw it on instance's cache\n * @param {CanvasRenderingContext2D} ctx\n * @param {FabricObject} clipPath\n */\n _drawClipPath(\n ctx: CanvasRenderingContext2D,\n clipPath: FabricObject | undefined,\n context: DrawContext,\n ) {\n if (!clipPath) {\n return;\n }\n // needed to setup _transformDone\n // TODO find a better solution?\n clipPath._transformDone = true;\n const canvas = (this as TCachedFabricObject).createClipPathLayer(\n clipPath,\n context,\n );\n this.drawClipPathOnCache(ctx, clipPath, canvas);\n }\n\n /**\n * Paint the cached copy of the object on the target context.\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n drawCacheOnCanvas(this: TCachedFabricObject, ctx: CanvasRenderingContext2D) {\n ctx.scale(1 / this.zoomX, 1 / this.zoomY);\n ctx.drawImage(\n this._cacheCanvas,\n -this.cacheTranslationX,\n -this.cacheTranslationY,\n );\n }\n\n /**\n * Check if cache is dirty and if is dirty clear the context.\n * This check has a big side effect, it changes the underlying cache canvas if necessary.\n * Do not call this method on your own to check if the cache is dirty, because if it is,\n * it is also going to wipe the cache. This is badly designed and needs to be fixed.\n * @param {Boolean} skipCanvas skip canvas checks because this object is painted\n * on parent canvas.\n */\n isCacheDirty(skipCanvas = false) {\n if (this.isNotVisible()) {\n return false;\n }\n const canvas = this._cacheCanvas;\n const ctx = this._cacheContext;\n if (canvas && ctx && !skipCanvas && this._updateCacheCanvas()) {\n // in this case the context is already cleared.\n return true;\n } else {\n if (this.dirty || (this.clipPath && this.clipPath.absolutePositioned)) {\n if (canvas && ctx && !skipCanvas) {\n ctx.save();\n ctx.setTransform(1, 0, 0, 1, 0, 0);\n ctx.clearRect(0, 0, canvas.width, canvas.height);\n ctx.restore();\n }\n return true;\n }\n }\n return false;\n }\n\n /**\n * Draws a background for the object big as its untransformed dimensions\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _renderBackground(ctx: CanvasRenderingContext2D) {\n if (!this.backgroundColor) {\n return;\n }\n const dim = this._getNonTransformedDimensions();\n ctx.fillStyle = this.backgroundColor;\n\n ctx.fillRect(-dim.x / 2, -dim.y / 2, dim.x, dim.y);\n // if there is background color no other shadows\n // should be casted\n this._removeShadow(ctx);\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _setOpacity(ctx: CanvasRenderingContext2D) {\n if (this.group && !this.group._transformDone) {\n ctx.globalAlpha = this.getObjectOpacity();\n } else {\n ctx.globalAlpha *= this.opacity;\n }\n }\n\n _setStrokeStyles(\n ctx: CanvasRenderingContext2D,\n decl: Pick<\n this,\n | 'stroke'\n | 'strokeWidth'\n | 'strokeLineCap'\n | 'strokeDashOffset'\n | 'strokeLineJoin'\n | 'strokeMiterLimit'\n >,\n ) {\n const stroke = decl.stroke;\n if (stroke) {\n ctx.lineWidth = decl.strokeWidth;\n ctx.lineCap = decl.strokeLineCap;\n ctx.lineDashOffset = decl.strokeDashOffset;\n ctx.lineJoin = decl.strokeLineJoin;\n ctx.miterLimit = decl.strokeMiterLimit;\n if (isFiller(stroke)) {\n if (\n (stroke as Gradient<'linear'>).gradientUnits === 'percentage' ||\n (stroke as Gradient<'linear'>).gradientTransform ||\n (stroke as Pattern).patternTransform\n ) {\n // need to transform gradient in a pattern.\n // this is a slow process. If you are hitting this codepath, and the object\n // is not using caching, you should consider switching it on.\n // we need a canvas as big as the current object caching canvas.\n this._applyPatternForTransformedGradient(ctx, stroke);\n } else {\n // is a simple gradient or pattern\n ctx.strokeStyle = stroke.toLive(ctx)!;\n this._applyPatternGradientTransform(ctx, stroke);\n }\n } else {\n // is a color\n ctx.strokeStyle = decl.stroke as string;\n }\n }\n }\n\n _setFillStyles(ctx: CanvasRenderingContext2D, { fill }: Pick) {\n if (fill) {\n if (isFiller(fill)) {\n ctx.fillStyle = fill.toLive(ctx)!;\n this._applyPatternGradientTransform(ctx, fill);\n } else {\n ctx.fillStyle = fill;\n }\n }\n }\n\n _setClippingProperties(ctx: CanvasRenderingContext2D) {\n ctx.globalAlpha = 1;\n ctx.strokeStyle = 'transparent';\n ctx.fillStyle = '#000000';\n }\n\n /**\n * @private\n * Sets line dash\n * @param {CanvasRenderingContext2D} ctx Context to set the dash line on\n * @param {Array} dashArray array representing dashes\n */\n _setLineDash(ctx: CanvasRenderingContext2D, dashArray?: number[] | null) {\n if (!dashArray || dashArray.length === 0) {\n return;\n }\n ctx.setLineDash(dashArray);\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _setShadow(ctx: CanvasRenderingContext2D) {\n if (!this.shadow) {\n return;\n }\n\n const shadow = this.shadow,\n canvas = this.canvas,\n retinaScaling = this.getCanvasRetinaScaling(),\n [sx, , , sy] = canvas?.viewportTransform || iMatrix,\n multX = sx * retinaScaling,\n multY = sy * retinaScaling,\n scaling = shadow.nonScaling ? new Point(1, 1) : this.getObjectScaling();\n ctx.shadowColor = shadow.color;\n ctx.shadowBlur =\n (shadow.blur *\n config.browserShadowBlurConstant *\n (multX + multY) *\n (scaling.x + scaling.y)) /\n 4;\n ctx.shadowOffsetX = shadow.offsetX * multX * scaling.x;\n ctx.shadowOffsetY = shadow.offsetY * multY * scaling.y;\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _removeShadow(ctx: CanvasRenderingContext2D) {\n if (!this.shadow) {\n return;\n }\n\n ctx.shadowColor = '';\n ctx.shadowBlur = ctx.shadowOffsetX = ctx.shadowOffsetY = 0;\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n * @param {TFiller} filler {@link Pattern} or {@link Gradient}\n */\n _applyPatternGradientTransform(\n ctx: CanvasRenderingContext2D,\n filler: TFiller,\n ) {\n if (!isFiller(filler)) {\n return { offsetX: 0, offsetY: 0 };\n }\n const t =\n (filler as Gradient<'linear'>).gradientTransform ||\n (filler as Pattern).patternTransform;\n const offsetX = -this.width / 2 + filler.offsetX || 0,\n offsetY = -this.height / 2 + filler.offsetY || 0;\n\n if ((filler as Gradient<'linear'>).gradientUnits === 'percentage') {\n ctx.transform(this.width, 0, 0, this.height, offsetX, offsetY);\n } else {\n ctx.transform(1, 0, 0, 1, offsetX, offsetY);\n }\n if (t) {\n ctx.transform(t[0], t[1], t[2], t[3], t[4], t[5]);\n }\n return { offsetX: offsetX, offsetY: offsetY };\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _renderPaintInOrder(ctx: CanvasRenderingContext2D) {\n if (this.paintFirst === STROKE) {\n this._renderStroke(ctx);\n this._renderFill(ctx);\n } else {\n this._renderFill(ctx);\n this._renderStroke(ctx);\n }\n }\n\n /**\n * @private\n * function that actually render something on the context.\n * empty here to allow Obects to work on tests to benchmark fabric functionalites\n * not related to rendering\n * @param {CanvasRenderingContext2D} _ctx Context to render on\n */\n _render(_ctx: CanvasRenderingContext2D) {\n // placeholder to be overridden\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _renderFill(ctx: CanvasRenderingContext2D) {\n if (!this.fill) {\n return;\n }\n\n ctx.save();\n this._setFillStyles(ctx, this);\n if (this.fillRule === 'evenodd') {\n ctx.fill('evenodd');\n } else {\n ctx.fill();\n }\n ctx.restore();\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _renderStroke(ctx: CanvasRenderingContext2D) {\n if (!this.stroke || this.strokeWidth === 0) {\n return;\n }\n\n if (this.shadow && !this.shadow.affectStroke) {\n this._removeShadow(ctx);\n }\n\n ctx.save();\n if (this.strokeUniform) {\n const scaling = this.getObjectScaling();\n ctx.scale(1 / scaling.x, 1 / scaling.y);\n }\n this._setLineDash(ctx, this.strokeDashArray);\n this._setStrokeStyles(ctx, this);\n ctx.stroke();\n ctx.restore();\n }\n\n /**\n * This function try to patch the missing gradientTransform on canvas gradients.\n * transforming a context to transform the gradient, is going to transform the stroke too.\n * we want to transform the gradient but not the stroke operation, so we create\n * a transformed gradient on a pattern and then we use the pattern instead of the gradient.\n * this method has drawbacks: is slow, is in low resolution, needs a patch for when the size\n * is limited.\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n * @param {Gradient} filler\n */\n _applyPatternForTransformedGradient(\n ctx: CanvasRenderingContext2D,\n filler: TFiller,\n ) {\n const dims = this._limitCacheSize(this._getCacheCanvasDimensions()),\n retinaScaling = this.getCanvasRetinaScaling(),\n width = dims.x / this.scaleX / retinaScaling,\n height = dims.y / this.scaleY / retinaScaling,\n pCanvas = createCanvasElementFor({\n // in case width and height are less than 1px, we have to round up.\n // since the pattern is no-repeat, this is fine\n width: Math.ceil(width),\n height: Math.ceil(height),\n });\n\n const pCtx = pCanvas.getContext('2d');\n if (!pCtx) {\n return;\n }\n pCtx.beginPath();\n pCtx.moveTo(0, 0);\n pCtx.lineTo(width, 0);\n pCtx.lineTo(width, height);\n pCtx.lineTo(0, height);\n pCtx.closePath();\n pCtx.translate(width / 2, height / 2);\n pCtx.scale(\n dims.zoomX / this.scaleX / retinaScaling,\n dims.zoomY / this.scaleY / retinaScaling,\n );\n this._applyPatternGradientTransform(pCtx, filler);\n pCtx.fillStyle = filler.toLive(ctx)!;\n pCtx.fill();\n ctx.translate(\n -this.width / 2 - this.strokeWidth / 2,\n -this.height / 2 - this.strokeWidth / 2,\n );\n ctx.scale(\n (retinaScaling * this.scaleX) / dims.zoomX,\n (retinaScaling * this.scaleY) / dims.zoomY,\n );\n ctx.strokeStyle = pCtx.createPattern(pCanvas, 'no-repeat') ?? '';\n }\n\n /**\n * This function is an helper for svg import. it returns the center of the object in the svg\n * untransformed coordinates\n * @private\n * @return {Point} center point from element coordinates\n */\n _findCenterFromElement() {\n return new Point(this.left + this.width / 2, this.top + this.height / 2);\n }\n\n /**\n * Clones an instance.\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @returns {Promise}\n */\n clone(propertiesToInclude?: string[]): Promise {\n const objectForm = this.toObject(propertiesToInclude);\n return (this.constructor as typeof FabricObject).fromObject(\n objectForm,\n ) as unknown as Promise;\n }\n\n /**\n * Creates an instance of Image out of an object\n * makes use of toCanvasElement.\n * Once this method was based on toDataUrl and loadImage, so it also had a quality\n * and format option. toCanvasElement is faster and produce no loss of quality.\n * If you need to get a real Jpeg or Png from an object, using toDataURL is the right way to do it.\n * toCanvasElement and then toBlob from the obtained canvas is also a good option.\n * @todo fix the export type, it could not be Image but the type that getClass return for 'image'.\n * @param {ObjectToCanvasElementOptions} [options] for clone as image, passed to toDataURL\n * @param {Number} [options.multiplier=1] Multiplier to scale by\n * @param {Number} [options.left] Cropping left offset. Introduced in v1.2.14\n * @param {Number} [options.top] Cropping top offset. Introduced in v1.2.14\n * @param {Number} [options.width] Cropping width. Introduced in v1.2.14\n * @param {Number} [options.height] Cropping height. Introduced in v1.2.14\n * @param {Boolean} [options.enableRetinaScaling] Enable retina scaling for clone image. Introduce in 1.6.4\n * @param {Boolean} [options.withoutTransform] Remove current object transform ( no scale , no angle, no flip, no skew ). Introduced in 2.3.4\n * @param {Boolean} [options.withoutShadow] Remove current object shadow. Introduced in 2.4.2\n * @return {FabricImage} Object cloned as image.\n */\n cloneAsImage(options: ObjectToCanvasElementOptions): FabricImage {\n const canvasEl = this.toCanvasElement(options);\n // TODO: how to import Image w/o an import cycle?\n const ImageClass = classRegistry.getClass('image');\n return new ImageClass(canvasEl);\n }\n\n /**\n * Converts an object into a HTMLCanvas element\n * @param {ObjectToCanvasElementOptions} options Options object\n * @param {Number} [options.multiplier=1] Multiplier to scale by\n * @param {Number} [options.left] Cropping left offset. Introduced in v1.2.14\n * @param {Number} [options.top] Cropping top offset. Introduced in v1.2.14\n * @param {Number} [options.width] Cropping width. Introduced in v1.2.14\n * @param {Number} [options.height] Cropping height. Introduced in v1.2.14\n * @param {Boolean} [options.enableRetinaScaling] Enable retina scaling for clone image. Introduce in 1.6.4\n * @param {Boolean} [options.withoutTransform] Remove current object transform ( no scale , no angle, no flip, no skew ). Introduced in 2.3.4\n * @param {Boolean} [options.withoutShadow] Remove current object shadow. Introduced in 2.4.2\n * @param {Boolean} [options.viewportTransform] Account for canvas viewport transform\n * @param {(el?: HTMLCanvasElement) => StaticCanvas} [options.canvasProvider] Create the output canvas\n * @return {HTMLCanvasElement} Returns DOM element with the FabricObject\n */\n toCanvasElement(options: ObjectToCanvasElementOptions = {}) {\n const origParams = saveObjectTransform(this),\n originalGroup = this.group,\n originalShadow = this.shadow,\n abs = Math.abs,\n retinaScaling = options.enableRetinaScaling ? getDevicePixelRatio() : 1,\n multiplier = (options.multiplier || 1) * retinaScaling,\n canvasProvider: (el: HTMLCanvasElement) => StaticCanvas =\n options.canvasProvider ||\n ((el: HTMLCanvasElement) =>\n new StaticCanvas(el, {\n enableRetinaScaling: false,\n renderOnAddRemove: false,\n skipOffscreen: false,\n }));\n delete this.group;\n if (options.withoutTransform) {\n resetObjectTransform(this);\n }\n if (options.withoutShadow) {\n this.shadow = null;\n }\n if (options.viewportTransform) {\n sendObjectToPlane(this, this.getViewportTransform());\n }\n\n this.setCoords();\n const el = createCanvasElement(),\n boundingRect = this.getBoundingRect(),\n shadow = this.shadow,\n shadowOffset = new Point();\n\n if (shadow) {\n const shadowBlur = shadow.blur;\n const scaling = shadow.nonScaling\n ? new Point(1, 1)\n : this.getObjectScaling();\n // consider non scaling shadow.\n shadowOffset.x =\n 2 * Math.round(abs(shadow.offsetX) + shadowBlur) * abs(scaling.x);\n shadowOffset.y =\n 2 * Math.round(abs(shadow.offsetY) + shadowBlur) * abs(scaling.y);\n }\n const width = boundingRect.width + shadowOffset.x,\n height = boundingRect.height + shadowOffset.y;\n // if the current width/height is not an integer\n // we need to make it so.\n el.width = Math.ceil(width);\n el.height = Math.ceil(height);\n const canvas = canvasProvider(el);\n if (options.format === 'jpeg') {\n canvas.backgroundColor = '#fff';\n }\n this.setPositionByOrigin(\n new Point(canvas.width / 2, canvas.height / 2),\n CENTER,\n CENTER,\n );\n const originalCanvas = this.canvas;\n // static canvas and canvas have both an array of InteractiveObjects\n // @ts-expect-error this needs to be fixed somehow, or ignored globally\n canvas._objects = [this];\n this.set('canvas', canvas);\n this.setCoords();\n const canvasEl = canvas.toCanvasElement(multiplier || 1, options);\n this.set('canvas', originalCanvas);\n this.shadow = originalShadow;\n if (originalGroup) {\n this.group = originalGroup;\n }\n this.set(origParams);\n this.setCoords();\n // canvas.dispose will call image.dispose that will nullify the elements\n // since this canvas is a simple element for the process, we remove references\n // to objects in this way in order to avoid object trashing.\n canvas._objects = [];\n // since render has settled it is safe to destroy canvas\n canvas.destroy();\n return canvasEl;\n }\n\n /**\n * Converts an object into a data-url-like string\n * @param {Object} options Options object\n * @param {String} [options.format=png] The format of the output image. Either \"jpeg\" or \"png\"\n * @param {Number} [options.quality=1] Quality level (0..1). Only used for jpeg.\n * @param {Number} [options.multiplier=1] Multiplier to scale by\n * @param {Number} [options.left] Cropping left offset. Introduced in v1.2.14\n * @param {Number} [options.top] Cropping top offset. Introduced in v1.2.14\n * @param {Number} [options.width] Cropping width. Introduced in v1.2.14\n * @param {Number} [options.height] Cropping height. Introduced in v1.2.14\n * @param {Boolean} [options.enableRetinaScaling] Enable retina scaling for clone image. Introduce in 1.6.4\n * @param {Boolean} [options.withoutTransform] Remove current object transform ( no scale , no angle, no flip, no skew ). Introduced in 2.3.4\n * @param {Boolean} [options.withoutShadow] Remove current object shadow. Introduced in 2.4.2\n * @return {String} Returns a data: URL containing a representation of the object in the format specified by options.format\n */\n toDataURL(options: toDataURLOptions = {}) {\n return toDataURL(\n this.toCanvasElement(options),\n options.format || 'png',\n options.quality || 1,\n );\n }\n toBlob(options: toDataURLOptions = {}) {\n return toBlob(\n this.toCanvasElement(options),\n options.format || 'png',\n options.quality || 1,\n );\n }\n\n /**\n * Checks if the instance is of any of the specified types.\n * We use this to filter a list of objects for the `getObjects` function.\n *\n * For detecting an instance type `instanceOf` is a better check,\n * but to avoid to make specific classes a dependency of generic code\n * internally we use this.\n *\n * This compares both the static class `type` and the instance's own `type` property\n * against the provided list of types.\n *\n * @param types - A list of type strings to check against.\n * @returns `true` if the object's type or class type matches any in the list, otherwise `false`.\n */\n isType(...types: string[]) {\n return (\n types.includes((this.constructor as typeof FabricObject).type) ||\n types.includes(this.type)\n );\n }\n\n /**\n * Returns complexity of an instance\n * @return {Number} complexity of this instance (is 1 unless subclassed)\n */\n complexity() {\n return 1;\n }\n\n /**\n * Returns a JSON representation of an instance\n * @return {Object} JSON\n */\n toJSON() {\n // delegate, not alias\n return this.toObject();\n }\n\n /**\n * Sets \"angle\" of an instance with centered rotation\n * @param {TDegree} angle Angle value (in degrees)\n */\n rotate(angle: TDegree) {\n const { centeredRotation, originX, originY } = this;\n\n if (centeredRotation) {\n const { x, y } = this.getRelativeCenterPoint();\n this.originX = CENTER;\n this.originY = CENTER;\n this.left = x;\n this.top = y;\n }\n\n this.set('angle', angle);\n\n if (centeredRotation) {\n const { x, y } = this.translateToOriginPoint(\n this.getRelativeCenterPoint(),\n originX,\n originY,\n );\n this.left = x;\n this.top = y;\n this.originX = originX;\n this.originY = originY;\n }\n }\n\n /**\n * This callback function is called by the parent group of an object every\n * time a non-delegated property changes on the group. It is passed the key\n * and value as parameters. Not adding in this function's signature to avoid\n * Travis build error about unused variables.\n */\n setOnGroup() {\n // implemented by sub-classes, as needed.\n }\n\n /**\n * Sets canvas globalCompositeOperation for specific object\n * custom composition operation for the particular object can be specified using globalCompositeOperation property\n * @param {CanvasRenderingContext2D} ctx Rendering canvas context\n */\n _setupCompositeOperation(ctx: CanvasRenderingContext2D) {\n if (this.globalCompositeOperation) {\n ctx.globalCompositeOperation = this.globalCompositeOperation;\n }\n }\n\n /**\n * cancel instance's running animations\n * override if necessary to dispose artifacts such as `clipPath`\n */\n dispose() {\n runningAnimations.cancelByTarget(this);\n this.off();\n this._set('canvas', undefined);\n // clear caches\n this._cacheCanvas && getEnv().dispose(this._cacheCanvas);\n this._cacheCanvas = undefined;\n this._cacheContext = null;\n }\n\n // #region Animation methods\n /**\n * List of properties to consider for animating colors.\n * @type String[]\n */\n static colorProperties: string[] = [FILL, STROKE, 'backgroundColor'];\n\n /**\n * Animates object's properties\n * @param {Record} animatable map of keys and end values\n * @param {Partial>} options\n * @tutorial {@link http://fabricjs.com/fabric-intro-part-2#animation}\n * @return {Record>} map of animation contexts\n *\n * As object — multiple properties\n *\n * object.animate({ left: ..., top: ... });\n * object.animate({ left: ..., top: ... }, { duration: ... });\n */\n animate(\n animatable: Record,\n options?: Partial>,\n ): Record> {\n return Object.entries(animatable).reduce(\n (acc, [key, endValue]) => {\n acc[key] = this._animate(key, endValue, options);\n return acc;\n },\n {} as Record>,\n );\n }\n\n /**\n * @private\n * @param {String} key Property to animate\n * @param {String} to Value to animate to\n * @param {Object} [options] Options object\n */\n _animate(\n key: string,\n endValue: T,\n options: Partial> = {},\n ): TAnimation {\n const path = key.split('.');\n const propIsColor = (\n this.constructor as typeof FabricObject\n ).colorProperties.includes(path[path.length - 1]);\n const { abort, startValue, onChange, onComplete } = options;\n const animationOptions = {\n ...options,\n target: this,\n // path.reduce... is the current value in case start value isn't provided\n startValue:\n startValue ?? path.reduce((deep: any, key) => deep[key], this),\n endValue,\n abort: abort?.bind(this),\n onChange: (\n value: number | number[] | string,\n valueProgress: number,\n durationProgress: number,\n ) => {\n path.reduce((deep: Record, key, index) => {\n if (index === path.length - 1) {\n deep[key] = value;\n }\n return deep[key];\n }, this);\n onChange &&\n // @ts-expect-error generic callback arg0 is wrong\n onChange(value, valueProgress, durationProgress);\n },\n onComplete: (\n value: number | number[] | string,\n valueProgress: number,\n durationProgress: number,\n ) => {\n this.setCoords();\n onComplete &&\n // @ts-expect-error generic callback arg0 is wrong\n onComplete(value, valueProgress, durationProgress);\n },\n } as AnimationOptions;\n\n return (\n propIsColor\n ? animateColor(animationOptions as ColorAnimationOptions)\n : animate(\n animationOptions as ValueAnimationOptions | ArrayAnimationOptions,\n )\n ) as TAnimation;\n }\n\n // #region Object stacking methods\n\n /**\n * A reference to the parent of the object\n * Used to keep the original parent ref when the object has been added to an ActiveSelection, hence loosing the `group` ref\n */\n declare parent?: Group;\n\n /**\n * Checks if object is descendant of target\n * Should be used instead of {@link Group.contains} or {@link StaticCanvas.contains} for performance reasons\n * @param {TAncestor} target\n * @returns {boolean}\n */\n isDescendantOf(target: TAncestor): boolean {\n const { parent, group } = this;\n return (\n parent === target ||\n group === target ||\n // walk up\n (!!parent && parent.isDescendantOf(target)) ||\n (!!group && group !== parent && group.isDescendantOf(target))\n );\n }\n\n /**\n * @returns {Ancestors} ancestors (excluding `ActiveSelection`) from bottom to top\n */\n getAncestors(): Ancestors {\n const ancestors: TAncestor[] = [];\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n let parent: TAncestor | undefined = this;\n do {\n parent = parent.parent;\n parent && ancestors.push(parent);\n } while (parent);\n return ancestors as Ancestors;\n }\n\n /**\n * Compare ancestors\n *\n * @param {StackedObject} other\n * @returns {AncestryComparison} an object that represent the ancestry situation.\n */\n findCommonAncestors(other: T): AncestryComparison {\n if (this === other) {\n return {\n fork: [],\n otherFork: [],\n common: [this, ...this.getAncestors()],\n } as AncestryComparison;\n }\n const ancestors = this.getAncestors();\n const otherAncestors = other.getAncestors();\n // if `this` has no ancestors and `this` is top ancestor of `other` we must handle the following case\n if (\n ancestors.length === 0 &&\n otherAncestors.length > 0 &&\n this === otherAncestors[otherAncestors.length - 1]\n ) {\n return {\n fork: [],\n otherFork: [\n other,\n ...otherAncestors.slice(0, otherAncestors.length - 1),\n ],\n common: [this],\n } as AncestryComparison;\n }\n // compare ancestors\n for (let i = 0, ancestor; i < ancestors.length; i++) {\n ancestor = ancestors[i];\n if (ancestor === other) {\n return {\n fork: [this, ...ancestors.slice(0, i)],\n otherFork: [],\n common: ancestors.slice(i),\n } as AncestryComparison;\n }\n for (let j = 0; j < otherAncestors.length; j++) {\n if (this === otherAncestors[j]) {\n return {\n fork: [],\n otherFork: [other, ...otherAncestors.slice(0, j)],\n common: [this, ...ancestors],\n } as AncestryComparison;\n }\n if (ancestor === otherAncestors[j]) {\n return {\n fork: [this, ...ancestors.slice(0, i)],\n otherFork: [other, ...otherAncestors.slice(0, j)],\n common: ancestors.slice(i),\n } as AncestryComparison;\n }\n }\n }\n // nothing shared\n return {\n fork: [this, ...ancestors],\n otherFork: [other, ...otherAncestors],\n common: [],\n } as AncestryComparison;\n }\n\n /**\n *\n * @param {StackedObject} other\n * @returns {boolean}\n */\n hasCommonAncestors(other: T): boolean {\n const commonAncestors = this.findCommonAncestors(other);\n return commonAncestors && !!commonAncestors.common.length;\n }\n\n /**\n *\n * @param {FabricObject} other object to compare against\n * @returns {boolean | undefined} if objects do not share a common ancestor or they are strictly equal it is impossible to determine which is in front of the other; in such cases the function returns `undefined`\n */\n isInFrontOf(other: T): boolean | undefined {\n if (this === other) {\n return undefined;\n }\n const ancestorData = this.findCommonAncestors(other);\n\n if (ancestorData.fork.includes(other as any)) {\n return true;\n }\n if (ancestorData.otherFork.includes(this as any)) {\n return false;\n }\n // if there isn't a common ancestor, we take the canvas.\n // if there is no canvas, there is nothing to compare\n const firstCommonAncestor = ancestorData.common[0] || this.canvas;\n if (!firstCommonAncestor) {\n return undefined;\n }\n const headOfFork = ancestorData.fork.pop(),\n headOfOtherFork = ancestorData.otherFork.pop(),\n thisIndex = (firstCommonAncestor as TCollection)._objects.indexOf(\n headOfFork as any,\n ),\n otherIndex = (firstCommonAncestor as TCollection)._objects.indexOf(\n headOfOtherFork as any,\n );\n return thisIndex > -1 && thisIndex > otherIndex;\n }\n\n // #region Serialization\n /**\n * Define a list of custom properties that will be serialized when\n * instance.toObject() gets called\n */\n static customProperties: string[] = [];\n\n /**\n * Returns an object representation of an instance\n * @param {string[]} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} Object representation of an instance\n */\n toObject(propertiesToInclude: any[] = []): any {\n const propertiesToSerialize = propertiesToInclude.concat(\n FabricObject.customProperties,\n (this.constructor as typeof FabricObject).customProperties || [],\n );\n let clipPathData: Partial | undefined;\n const NUM_FRACTION_DIGITS = config.NUM_FRACTION_DIGITS;\n const {\n clipPath,\n fill,\n stroke,\n shadow,\n strokeDashArray,\n left,\n top,\n originX,\n originY,\n width,\n height,\n strokeWidth,\n strokeLineCap,\n strokeDashOffset,\n strokeLineJoin,\n strokeUniform,\n strokeMiterLimit,\n scaleX,\n scaleY,\n angle,\n flipX,\n flipY,\n opacity,\n visible,\n backgroundColor,\n fillRule,\n paintFirst,\n globalCompositeOperation,\n skewX,\n skewY,\n } = this;\n if (clipPath && !clipPath.excludeFromExport) {\n clipPathData = clipPath.toObject(\n propertiesToSerialize.concat('inverted', 'absolutePositioned'),\n );\n }\n const toFixedBound = (val: number) => toFixed(val, NUM_FRACTION_DIGITS);\n const object = {\n ...pick(this, propertiesToSerialize as (keyof this)[]),\n type: (this.constructor as typeof FabricObject).type,\n version: VERSION,\n originX,\n originY,\n left: toFixedBound(left),\n top: toFixedBound(top),\n width: toFixedBound(width),\n height: toFixedBound(height),\n fill: isSerializableFiller(fill) ? fill.toObject() : fill,\n stroke: isSerializableFiller(stroke) ? stroke.toObject() : stroke,\n strokeWidth: toFixedBound(strokeWidth),\n strokeDashArray: strokeDashArray\n ? strokeDashArray.concat()\n : strokeDashArray,\n strokeLineCap,\n strokeDashOffset,\n strokeLineJoin,\n strokeUniform,\n strokeMiterLimit: toFixedBound(strokeMiterLimit),\n scaleX: toFixedBound(scaleX),\n scaleY: toFixedBound(scaleY),\n angle: toFixedBound(angle),\n flipX,\n flipY,\n opacity: toFixedBound(opacity),\n shadow: shadow ? shadow.toObject() : shadow,\n visible,\n backgroundColor,\n fillRule,\n paintFirst,\n globalCompositeOperation,\n skewX: toFixedBound(skewX),\n skewY: toFixedBound(skewY),\n ...(clipPathData ? { clipPath: clipPathData } : null),\n };\n\n return !this.includeDefaultValues\n ? this._removeDefaultValues(object)\n : object;\n }\n\n /**\n * Returns (dataless) object representation of an instance\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} Object representation of an instance\n */\n toDatalessObject(propertiesToInclude?: any[]): any {\n // will be overwritten by subclasses\n return this.toObject(propertiesToInclude);\n }\n\n /**\n * @private\n * @param {Object} object\n */\n _removeDefaultValues(object: T): Partial {\n // getDefaults() ( get from static ownDefaults ) should win over prototype since anyway they get assigned to instance\n // ownDefault vs prototype is swappable only if you change all the fabric objects consistently.\n const defaults = (this.constructor as typeof FabricObject).getDefaults();\n const hasStaticDefaultValues = Object.keys(defaults).length > 0;\n const baseValues = hasStaticDefaultValues\n ? defaults\n : Object.getPrototypeOf(this);\n\n return pickBy(object, (value, key) => {\n if (key === LEFT || key === TOP || key === 'type') {\n return true;\n }\n const baseValue = baseValues[key];\n return (\n value !== baseValue &&\n // basically a check for [] === []\n !(\n Array.isArray(value) &&\n Array.isArray(baseValue) &&\n value.length === 0 &&\n baseValue.length === 0\n )\n );\n });\n }\n\n /**\n * Returns a string representation of an instance\n * @return {String}\n */\n toString() {\n return `#<${(this.constructor as typeof FabricObject).type}>`;\n }\n\n /**\n *\n * @param {Function} klass\n * @param {object} object\n * @param {object} [options]\n * @param {string} [options.extraParam] property to pass as first argument to the constructor\n * @param {AbortSignal} [options.signal] handle aborting, see https://developer.mozilla.org/en-US/docs/Web/API/AbortController/signal\n * @returns {Promise}\n */\n static _fromObject(\n { type, ...serializedObjectOptions }: Record,\n { extraParam, ...options }: Abortable & { extraParam?: string } = {},\n ): Promise {\n return enlivenObjectEnlivables(serializedObjectOptions, options).then(\n (enlivedObjectOptions) => {\n // from the resulting enlived options, extract options.extraParam to arg0\n // to avoid accidental overrides later\n if (extraParam) {\n delete enlivedObjectOptions[extraParam];\n return new this(\n serializedObjectOptions[extraParam],\n // @ts-expect-error different signature\n enlivedObjectOptions,\n );\n } else {\n return new this(enlivedObjectOptions);\n }\n },\n ) as Promise;\n }\n\n /**\n *\n * @param {object} object\n * @param {object} [options]\n * @param {AbortSignal} [options.signal] handle aborting, see https://developer.mozilla.org/en-US/docs/Web/API/AbortController/signal\n * @returns {Promise}\n */\n static fromObject>(\n object: T,\n options?: Abortable,\n ) {\n return this._fromObject(object, options);\n }\n}\n\nclassRegistry.setClass(FabricObject);\nclassRegistry.setClass(FabricObject, 'object');\n","import type {\n TModificationEvents,\n Transform,\n TransformActionHandler,\n} from '../EventTypeDefs';\nimport { fireEvent } from './fireEvent';\nimport { commonEventInfo } from './util';\n\n/**\n * Wrap an action handler with firing an event if the action is performed\n * @param {TModificationEvents} eventName the event we want to fire\n * @param {TransformActionHandler} actionHandler the function to wrap\n * @param {object} extraEventInfo extra information to pas to the event handler\n * @return {TransformActionHandler} a function with an action handler signature\n */\nexport const wrapWithFireEvent = <\n T extends Transform,\n P extends object = Record,\n>(\n eventName: TModificationEvents,\n actionHandler: TransformActionHandler,\n extraEventInfo?: P,\n) => {\n return ((eventData, transform, x, y) => {\n const actionPerformed = actionHandler(eventData, transform, x, y);\n if (actionPerformed) {\n fireEvent(eventName, {\n ...commonEventInfo(eventData, transform, x, y),\n ...extraEventInfo,\n });\n }\n return actionPerformed;\n }) as TransformActionHandler;\n};\n","import type { Transform, TransformActionHandler } from '../EventTypeDefs';\n\n/**\n * Wrap an action handler with saving/restoring object position on the transform.\n * this is the code that permits to objects to keep their position while transforming.\n * @param {Function} actionHandler the function to wrap\n * @return {Function} a function with an action handler signature\n */\nexport function wrapWithFixedAnchor(\n actionHandler: TransformActionHandler,\n) {\n return ((eventData, transform, x, y) => {\n const { target, originX, originY } = transform,\n centerPoint = target.getRelativeCenterPoint(),\n constraint = target.translateToOriginPoint(centerPoint, originX, originY),\n actionPerformed = actionHandler(eventData, transform, x, y);\n // flipping requires to change the transform origin, so we read from the mutated transform\n // instead of leveraging the one destructured before\n target.setPositionByOrigin(\n constraint,\n transform.originX,\n transform.originY,\n );\n return actionPerformed;\n }) as TransformActionHandler;\n}\n","import type { TransformActionHandler } from '../EventTypeDefs';\nimport { CENTER, LEFT, RESIZING, RIGHT } from '../constants';\nimport { resolveOrigin } from '../util/misc/resolveOrigin';\nimport { getLocalPoint, isTransformCentered } from './util';\nimport { wrapWithFireEvent } from './wrapWithFireEvent';\nimport { wrapWithFixedAnchor } from './wrapWithFixedAnchor';\n\n/**\n * Action handler to change object's width\n * Needs to be wrapped with `wrapWithFixedAnchor` to be effective\n * @param {Event} eventData javascript event that is doing the transform\n * @param {Object} transform javascript object containing a series of information around the current transform\n * @param {number} x current mouse x position, canvas normalized\n * @param {number} y current mouse y position, canvas normalized\n * @return {Boolean} true if some change happened\n */\nexport const changeObjectWidth: TransformActionHandler = (\n eventData,\n transform,\n x,\n y,\n) => {\n const localPoint = getLocalPoint(\n transform,\n transform.originX,\n transform.originY,\n x,\n y,\n );\n // make sure the control changes width ONLY from it's side of target\n if (\n resolveOrigin(transform.originX) === resolveOrigin(CENTER) ||\n (resolveOrigin(transform.originX) === resolveOrigin(RIGHT) &&\n localPoint.x < 0) ||\n (resolveOrigin(transform.originX) === resolveOrigin(LEFT) &&\n localPoint.x > 0)\n ) {\n const { target } = transform,\n strokePadding =\n target.strokeWidth / (target.strokeUniform ? target.scaleX : 1),\n multiplier = isTransformCentered(transform) ? 2 : 1,\n oldWidth = target.width,\n newWidth =\n Math.abs((localPoint.x * multiplier) / target.scaleX) - strokePadding;\n target.set('width', Math.max(newWidth, 1));\n // check against actual target width in case `newWidth` was rejected\n return oldWidth !== target.width;\n }\n return false;\n};\n\nexport const changeWidth = wrapWithFireEvent(\n RESIZING,\n wrapWithFixedAnchor(changeObjectWidth),\n);\n","import { FILL, STROKE, twoMathPi } from '../constants';\nimport type { InteractiveFabricObject } from '../shapes/Object/InteractiveObject';\nimport { degreesToRadians } from '../util/misc/radiansDegreesConversion';\nimport type { Control } from './Control';\n\nexport type ControlRenderingStyleOverride = Partial<\n Pick<\n InteractiveFabricObject,\n | 'cornerStyle'\n | 'cornerSize'\n | 'cornerColor'\n | 'cornerStrokeColor'\n | 'cornerDashArray'\n | 'transparentCorners'\n >\n>;\n\nexport type ControlRenderer<\n O extends InteractiveFabricObject = InteractiveFabricObject,\n> = (\n ctx: CanvasRenderingContext2D,\n left: number,\n top: number,\n styleOverride: ControlRenderingStyleOverride,\n fabricObject: O,\n) => void;\n\n/**\n * Render a round control, as per fabric features.\n * This function is written to respect object properties like transparentCorners, cornerSize\n * cornerColor, cornerStrokeColor\n * plus the addition of offsetY and offsetX.\n * @param {CanvasRenderingContext2D} ctx context to render on\n * @param {Number} left x coordinate where the control center should be\n * @param {Number} top y coordinate where the control center should be\n * @param {Object} styleOverride override for FabricObject controls style\n * @param {FabricObject} fabricObject the fabric object for which we are rendering controls\n */\nexport function renderCircleControl(\n this: Control,\n ctx: CanvasRenderingContext2D,\n left: number,\n top: number,\n styleOverride: ControlRenderingStyleOverride,\n fabricObject: InteractiveFabricObject,\n) {\n styleOverride = styleOverride || {};\n const xSize =\n this.sizeX || styleOverride.cornerSize || fabricObject.cornerSize,\n ySize = this.sizeY || styleOverride.cornerSize || fabricObject.cornerSize,\n transparentCorners =\n typeof styleOverride.transparentCorners !== 'undefined'\n ? styleOverride.transparentCorners\n : fabricObject.transparentCorners,\n methodName = transparentCorners ? STROKE : FILL,\n stroke =\n !transparentCorners &&\n (styleOverride.cornerStrokeColor || fabricObject.cornerStrokeColor);\n let myLeft = left,\n myTop = top,\n size;\n ctx.save();\n ctx.fillStyle = styleOverride.cornerColor || fabricObject.cornerColor || '';\n ctx.strokeStyle =\n styleOverride.cornerStrokeColor || fabricObject.cornerStrokeColor || '';\n // TODO: use proper ellipse code.\n if (xSize > ySize) {\n size = xSize;\n ctx.scale(1.0, ySize / xSize);\n myTop = (top * xSize) / ySize;\n } else if (ySize > xSize) {\n size = ySize;\n ctx.scale(xSize / ySize, 1.0);\n myLeft = (left * ySize) / xSize;\n } else {\n size = xSize;\n }\n ctx.beginPath();\n ctx.arc(myLeft, myTop, size / 2, 0, twoMathPi, false);\n ctx[methodName]();\n if (stroke) {\n ctx.stroke();\n }\n ctx.restore();\n}\n\n/**\n * Render a square control, as per fabric features.\n * This function is written to respect object properties like transparentCorners, cornerSize\n * cornerColor, cornerStrokeColor\n * plus the addition of offsetY and offsetX.\n * @param {CanvasRenderingContext2D} ctx context to render on\n * @param {Number} left x coordinate where the control center should be\n * @param {Number} top y coordinate where the control center should be\n * @param {Object} styleOverride override for FabricObject controls style\n * @param {FabricObject} fabricObject the fabric object for which we are rendering controls\n */\nexport function renderSquareControl(\n this: Control,\n ctx: CanvasRenderingContext2D,\n left: number,\n top: number,\n styleOverride: ControlRenderingStyleOverride,\n fabricObject: InteractiveFabricObject,\n) {\n styleOverride = styleOverride || {};\n const xSize =\n this.sizeX || styleOverride.cornerSize || fabricObject.cornerSize,\n ySize = this.sizeY || styleOverride.cornerSize || fabricObject.cornerSize,\n transparentCorners =\n typeof styleOverride.transparentCorners !== 'undefined'\n ? styleOverride.transparentCorners\n : fabricObject.transparentCorners,\n methodName = transparentCorners ? STROKE : FILL,\n stroke =\n !transparentCorners &&\n (styleOverride.cornerStrokeColor || fabricObject.cornerStrokeColor),\n xSizeBy2 = xSize / 2,\n ySizeBy2 = ySize / 2;\n ctx.save();\n ctx.fillStyle = styleOverride.cornerColor || fabricObject.cornerColor || '';\n ctx.strokeStyle =\n styleOverride.cornerStrokeColor || fabricObject.cornerStrokeColor || '';\n ctx.translate(left, top);\n // angle is relative to canvas plane\n const angle = fabricObject.getTotalAngle();\n ctx.rotate(degreesToRadians(angle));\n // this does not work, and fixed with ( && ) does not make sense.\n // to have real transparent corners we need the controls on upperCanvas\n // transparentCorners || ctx.clearRect(-xSizeBy2, -ySizeBy2, xSize, ySize);\n ctx[`${methodName}Rect`](-xSizeBy2, -ySizeBy2, xSize, ySize);\n if (stroke) {\n ctx.strokeRect(-xSizeBy2, -ySizeBy2, xSize, ySize);\n }\n ctx.restore();\n}\n","/* eslint-disable @typescript-eslint/no-unused-vars */\nimport type {\n ControlActionHandler,\n TPointerEvent,\n TransformActionHandler,\n} from '../EventTypeDefs';\nimport { Intersection } from '../Intersection';\nimport { Point } from '../Point';\nimport { SCALE } from '../constants';\nimport type {\n InteractiveFabricObject,\n TOCoord,\n} from '../shapes/Object/InteractiveObject';\nimport type { TCornerPoint, TDegree, TMat2D } from '../typedefs';\nimport {\n createRotateMatrix,\n createScaleMatrix,\n createTranslateMatrix,\n multiplyTransformMatrixArray,\n} from '../util/misc/matrix';\nimport type { ControlRenderingStyleOverride } from './controlRendering';\nimport { renderCircleControl, renderSquareControl } from './controlRendering';\n\nexport class Control {\n /**\n * keep track of control visibility.\n * mainly for backward compatibility.\n * if you do not want to see a control, you can remove it\n * from the control set.\n * @type {Boolean}\n * @default true\n */\n visible = true;\n\n /**\n * Name of the action that the control will likely execute.\n * This is optional. FabricJS uses to identify what the user is doing for some\n * extra optimizations. If you are writing a custom control and you want to know\n * somewhere else in the code what is going on, you can use this string here.\n * you can also provide a custom getActionName if your control run multiple actions\n * depending on some external state.\n * default to scale since is the most common, used on 4 corners by default\n * @type {String}\n * @default 'scale'\n */\n actionName = SCALE;\n\n /**\n * Drawing angle of the control.\n * NOT used for now, but name marked as needed for internal logic\n * example: to reuse the same drawing function for different rotated controls\n * @type {Number}\n * @default 0\n */\n angle = 0;\n\n /**\n * Relative position of the control. X\n * 0,0 is the center of the Object, while -0.5 (left) or 0.5 (right) are the extremities\n * of the bounding box.\n * @type {Number}\n * @default 0\n */\n x = 0;\n\n /**\n * Relative position of the control. Y\n * 0,0 is the center of the Object, while -0.5 (top) or 0.5 (bottom) are the extremities\n * of the bounding box.\n * @type {Number}\n * @default 0\n */\n y = 0;\n\n /**\n * Horizontal offset of the control from the defined position. In pixels\n * Positive offset moves the control to the right, negative to the left.\n * It used when you want to have position of control that does not scale with\n * the bounding box. Example: rotation control is placed at x:0, y: 0.5 on\n * the boundind box, with an offset of 30 pixels vertically. Those 30 pixels will\n * stay 30 pixels no matter how the object is big. Another example is having 2\n * controls in the corner, that stay in the same position when the object scale.\n * of the bounding box.\n * @type {Number}\n * @default 0\n */\n offsetX = 0;\n\n /**\n * Vertical offset of the control from the defined position. In pixels\n * Positive offset moves the control to the bottom, negative to the top.\n * @type {Number}\n * @default 0\n */\n offsetY = 0;\n\n /**\n * Sets the length of the control. If null, defaults to object's cornerSize.\n * Expects both sizeX and sizeY to be set when set.\n * @type {?Number}\n * @default null\n */\n sizeX = 0;\n\n /**\n * Sets the height of the control. If null, defaults to object's cornerSize.\n * Expects both sizeX and sizeY to be set when set.\n * @type {?Number}\n * @default null\n */\n sizeY = 0;\n\n /**\n * Sets the length of the touch area of the control. If null, defaults to object's touchCornerSize.\n * Expects both touchSizeX and touchSizeY to be set when set.\n * @type {?Number}\n * @default null\n */\n touchSizeX = 0;\n\n /**\n * Sets the height of the touch area of the control. If null, defaults to object's touchCornerSize.\n * Expects both touchSizeX and touchSizeY to be set when set.\n * @type {?Number}\n * @default null\n */\n touchSizeY = 0;\n\n /**\n * Css cursor style to display when the control is hovered.\n * if the method `cursorStyleHandler` is provided, this property is ignored.\n * @type {String}\n * @default 'crosshair'\n */\n cursorStyle = 'crosshair';\n\n /**\n * If controls has an offsetY or offsetX, draw a line that connects\n * the control to the bounding box\n * @type {Boolean}\n * @default false\n */\n withConnection = false;\n\n constructor(options?: Partial) {\n Object.assign(this, options);\n }\n\n /**\n * The control actionHandler, provide one to handle action ( control being moved )\n * @param {Event} eventData the native mouse event\n * @param {Transform} transformData properties of the current transform\n * @param {Number} x x position of the cursor\n * @param {Number} y y position of the cursor\n * @return {Boolean} true if the action/event modified the object\n */\n declare actionHandler: TransformActionHandler;\n\n /**\n * The control handler for mouse down, provide one to handle mouse down on control\n * @param {Event} eventData the native mouse event\n * @param {Transform} transformData properties of the current transform\n * @param {Number} x x position of the cursor\n * @param {Number} y y position of the cursor\n * @return {Boolean} true if the action/event modified the object\n */\n declare mouseDownHandler?: ControlActionHandler;\n\n /**\n * The control mouseUpHandler, provide one to handle an effect on mouse up.\n * @param {Event} eventData the native mouse event\n * @param {Transform} transformData properties of the current transform\n * @param {Number} x x position of the cursor\n * @param {Number} y y position of the cursor\n * @return {Boolean} true if the action/event modified the object\n */\n declare mouseUpHandler?: ControlActionHandler;\n\n shouldActivate(\n controlKey: string,\n fabricObject: InteractiveFabricObject,\n pointer: Point,\n { tl, tr, br, bl }: TCornerPoint,\n ) {\n // TODO: locking logic can be handled here instead of in the control handler logic\n return (\n fabricObject.canvas?.getActiveObject() === fabricObject &&\n fabricObject.isControlVisible(controlKey) &&\n Intersection.isPointInPolygon(pointer, [tl, tr, br, bl])\n );\n }\n\n /**\n * Returns control actionHandler\n * @param {Event} eventData the native mouse event\n * @param {FabricObject} fabricObject on which the control is displayed\n * @param {Control} control control for which the action handler is being asked\n * @return {Function} the action handler\n */\n getActionHandler(\n eventData: TPointerEvent,\n fabricObject: InteractiveFabricObject,\n control: Control,\n ): TransformActionHandler | undefined {\n return this.actionHandler;\n }\n\n /**\n * Returns control mouseDown handler\n * @param {Event} eventData the native mouse event\n * @param {FabricObject} fabricObject on which the control is displayed\n * @param {Control} control control for which the action handler is being asked\n * @return {Function} the action handler\n */\n getMouseDownHandler(\n eventData: TPointerEvent,\n fabricObject: InteractiveFabricObject,\n control: Control,\n ): ControlActionHandler | undefined {\n return this.mouseDownHandler;\n }\n\n /**\n * Returns control mouseUp handler.\n * During actions the fabricObject or the control can be of different obj\n * @param {Event} eventData the native mouse event\n * @param {FabricObject} fabricObject on which the control is displayed\n * @param {Control} control control for which the action handler is being asked\n * @return {Function} the action handler\n */\n getMouseUpHandler(\n eventData: TPointerEvent,\n fabricObject: InteractiveFabricObject,\n control: Control,\n ): ControlActionHandler | undefined {\n return this.mouseUpHandler;\n }\n\n /**\n * Returns control cursorStyle for css using cursorStyle. If you need a more elaborate\n * function you can pass one in the constructor\n * the cursorStyle property\n * @param {Event} eventData the native mouse event\n * @param {Control} control the current control ( likely this)\n * @param {FabricObject} object on which the control is displayed\n * @return {String}\n */\n cursorStyleHandler(\n eventData: TPointerEvent,\n control: Control,\n fabricObject: InteractiveFabricObject,\n coord: TOCoord,\n ) {\n return control.cursorStyle;\n }\n\n /**\n * Returns the action name. The basic implementation just return the actionName property.\n * @param {Event} eventData the native mouse event\n * @param {Control} control the current control ( likely this)\n * @param {FabricObject} object on which the control is displayed\n * @return {String}\n */\n getActionName(\n eventData: TPointerEvent,\n control: Control,\n fabricObject: InteractiveFabricObject,\n ) {\n return control.actionName;\n }\n\n /**\n * Returns controls visibility\n * @param {FabricObject} object on which the control is displayed\n * @param {String} controlKey key where the control is memorized on the\n * @return {Boolean}\n */\n getVisibility(fabricObject: InteractiveFabricObject, controlKey: string) {\n return fabricObject._controlsVisibility?.[controlKey] ?? this.visible;\n }\n\n /**\n * Sets controls visibility\n * @param {Boolean} visibility for the object\n * @return {Void}\n */\n setVisibility(\n visibility: boolean,\n name?: string,\n fabricObject?: InteractiveFabricObject,\n ) {\n this.visible = visibility;\n }\n\n positionHandler(\n dim: Point,\n finalMatrix: TMat2D,\n fabricObject: InteractiveFabricObject,\n currentControl: Control,\n ) {\n return new Point(\n this.x * dim.x + this.offsetX,\n this.y * dim.y + this.offsetY,\n ).transform(finalMatrix);\n }\n\n /**\n * Returns the coords for this control based on object values.\n * @param {Number} objectAngle angle from the fabric object holding the control\n * @param {Number} objectCornerSize cornerSize from the fabric object holding the control (or touchCornerSize if\n * isTouch is true)\n * @param {Number} centerX x coordinate where the control center should be\n * @param {Number} centerY y coordinate where the control center should be\n * @param {boolean} isTouch true if touch corner, false if normal corner\n */\n calcCornerCoords(\n angle: TDegree,\n objectCornerSize: number,\n centerX: number,\n centerY: number,\n isTouch: boolean,\n fabricObject: InteractiveFabricObject,\n ) {\n const t = multiplyTransformMatrixArray([\n createTranslateMatrix(centerX, centerY),\n createRotateMatrix({ angle }),\n createScaleMatrix(\n (isTouch ? this.touchSizeX : this.sizeX) || objectCornerSize,\n (isTouch ? this.touchSizeY : this.sizeY) || objectCornerSize,\n ),\n ]);\n return {\n tl: new Point(-0.5, -0.5).transform(t),\n tr: new Point(0.5, -0.5).transform(t),\n br: new Point(0.5, 0.5).transform(t),\n bl: new Point(-0.5, 0.5).transform(t),\n };\n }\n\n /**\n * Render function for the control.\n * When this function runs the context is unscaled. unrotate. Just retina scaled.\n * all the functions will have to translate to the point left,top before starting Drawing\n * if they want to draw a control where the position is detected.\n * left and top are the result of the positionHandler function\n * @param {RenderingContext2D} ctx the context where the control will be drawn\n * @param {Number} left position of the canvas where we are about to render the control.\n * @param {Number} top position of the canvas where we are about to render the control.\n * @param {Object} styleOverride\n * @param {FabricObject} fabricObject the object where the control is about to be rendered\n */\n render(\n ctx: CanvasRenderingContext2D,\n left: number,\n top: number,\n styleOverride: ControlRenderingStyleOverride | undefined,\n fabricObject: InteractiveFabricObject,\n ) {\n styleOverride = styleOverride || {};\n switch (styleOverride.cornerStyle || fabricObject.cornerStyle) {\n case 'circle':\n renderCircleControl.call(\n this,\n ctx,\n left,\n top,\n styleOverride,\n fabricObject,\n );\n break;\n default:\n renderSquareControl.call(\n this,\n ctx,\n left,\n top,\n styleOverride,\n fabricObject,\n );\n }\n }\n}\n","import type {\n ControlCursorCallback,\n TransformActionHandler,\n} from '../EventTypeDefs';\nimport { ROTATING } from '../constants';\nimport { radiansToDegrees } from '../util/misc/radiansDegreesConversion';\nimport { isLocked, NOT_ALLOWED_CURSOR } from './util';\nimport { wrapWithFireEvent } from './wrapWithFireEvent';\nimport { wrapWithFixedAnchor } from './wrapWithFixedAnchor';\n\n/**\n * Find the correct style for the control that is used for rotation.\n * this function is very simple and it just take care of not-allowed or standard cursor\n * @param {Event} eventData the javascript event that is causing the scale\n * @param {Control} control the control that is interested in the action\n * @param {FabricObject} fabricObject the fabric object that is interested in the action\n * @return {String} a valid css string for the cursor\n */\nexport const rotationStyleHandler: ControlCursorCallback = (\n eventData,\n control,\n fabricObject,\n) => {\n if (fabricObject.lockRotation) {\n return NOT_ALLOWED_CURSOR;\n }\n return control.cursorStyle;\n};\n\n/**\n * Action handler for rotation and snapping, without anchor point.\n * Needs to be wrapped with `wrapWithFixedAnchor` to be effective\n * @param {Event} eventData javascript event that is doing the transform\n * @param {Object} transform javascript object containing a series of information around the current transform\n * @param {number} x current mouse x position, canvas normalized\n * @param {number} y current mouse y position, canvas normalized\n * @return {Boolean} true if some change happened\n * @private\n */\nconst rotateObjectWithSnapping: TransformActionHandler = (\n eventData,\n { target, ex, ey, theta, originX, originY },\n x,\n y,\n) => {\n const pivotPoint = target.translateToOriginPoint(\n target.getRelativeCenterPoint(),\n originX,\n originY,\n );\n\n if (isLocked(target, 'lockRotation')) {\n return false;\n }\n\n const lastAngle = Math.atan2(ey - pivotPoint.y, ex - pivotPoint.x),\n curAngle = Math.atan2(y - pivotPoint.y, x - pivotPoint.x);\n let angle = radiansToDegrees(curAngle - lastAngle + theta);\n\n if (target.snapAngle && target.snapAngle > 0) {\n const snapAngle = target.snapAngle,\n snapThreshold = target.snapThreshold || snapAngle,\n rightAngleLocked = Math.ceil(angle / snapAngle) * snapAngle,\n leftAngleLocked = Math.floor(angle / snapAngle) * snapAngle;\n\n if (Math.abs(angle - leftAngleLocked) < snapThreshold) {\n angle = leftAngleLocked;\n } else if (Math.abs(angle - rightAngleLocked) < snapThreshold) {\n angle = rightAngleLocked;\n }\n }\n\n // normalize angle to positive value\n if (angle < 0) {\n angle = 360 + angle;\n }\n angle %= 360;\n\n const hasRotated = target.angle !== angle;\n // TODO: why aren't we using set?\n target.angle = angle;\n return hasRotated;\n};\n\nexport const rotationWithSnapping = wrapWithFireEvent(\n ROTATING,\n wrapWithFixedAnchor(rotateObjectWithSnapping),\n);\n","import type {\n ControlCursorCallback,\n TPointerEvent,\n Transform,\n TransformActionHandler,\n} from '../EventTypeDefs';\nimport type { FabricObject } from '../shapes/Object/FabricObject';\nimport type { TAxis } from '../typedefs';\nimport type { Canvas } from '../canvas/Canvas';\nimport {\n findCornerQuadrant,\n getLocalPoint,\n invertOrigin,\n isLocked,\n isTransformCentered,\n NOT_ALLOWED_CURSOR,\n} from './util';\nimport { wrapWithFireEvent } from './wrapWithFireEvent';\nimport { wrapWithFixedAnchor } from './wrapWithFixedAnchor';\nimport { SCALE_X, SCALE_Y, SCALING } from '../constants';\n\ntype ScaleTransform = Transform & {\n gestureScale?: number;\n signX?: number;\n signY?: number;\n};\n\ntype ScaleBy = TAxis | 'equally' | '' | undefined;\n\n/**\n * Inspect event and fabricObject properties to understand if the scaling action\n * @param {Event} eventData from the user action\n * @param {FabricObject} fabricObject the fabric object about to scale\n * @return {Boolean} true if scale is proportional\n */\nexport function scaleIsProportional(\n eventData: TPointerEvent,\n fabricObject: FabricObject,\n): boolean {\n const canvas = fabricObject.canvas as Canvas,\n uniformIsToggled = eventData[canvas.uniScaleKey!];\n return (\n (canvas.uniformScaling && !uniformIsToggled) ||\n (!canvas.uniformScaling && uniformIsToggled)\n );\n}\n\n/**\n * Inspect fabricObject to understand if the current scaling action is allowed\n * @param {FabricObject} fabricObject the fabric object about to scale\n * @param {String} by 'x' or 'y' or ''\n * @param {Boolean} scaleProportionally true if we are trying to scale proportionally\n * @return {Boolean} true if scaling is not allowed at current conditions\n */\nexport function scalingIsForbidden(\n fabricObject: FabricObject,\n by: ScaleBy,\n scaleProportionally: boolean,\n) {\n const lockX = isLocked(fabricObject, 'lockScalingX'),\n lockY = isLocked(fabricObject, 'lockScalingY');\n if (lockX && lockY) {\n return true;\n }\n if (!by && (lockX || lockY) && scaleProportionally) {\n return true;\n }\n if (lockX && by === 'x') {\n return true;\n }\n if (lockY && by === 'y') {\n return true;\n }\n // code crashes because of a division by 0 if a 0 sized object is scaled\n // forbid to prevent scaling to happen. ISSUE-9475\n const { width, height, strokeWidth } = fabricObject;\n if (width === 0 && strokeWidth === 0 && by !== 'y') {\n return true;\n }\n if (height === 0 && strokeWidth === 0 && by !== 'x') {\n return true;\n }\n return false;\n}\n\nconst scaleMap = ['e', 'se', 's', 'sw', 'w', 'nw', 'n', 'ne', 'e'];\n\n/**\n * return the correct cursor style for the scale action\n * @param {Event} eventData the javascript event that is causing the scale\n * @param {Control} control the control that is interested in the action\n * @param {FabricObject} fabricObject the fabric object that is interested in the action\n * @return {String} a valid css string for the cursor\n */\nexport const scaleCursorStyleHandler: ControlCursorCallback = (\n eventData,\n control,\n fabricObject,\n coord,\n) => {\n const scaleProportionally = scaleIsProportional(eventData, fabricObject),\n by =\n control.x !== 0 && control.y === 0\n ? 'x'\n : control.x === 0 && control.y !== 0\n ? 'y'\n : '';\n if (scalingIsForbidden(fabricObject, by, scaleProportionally)) {\n return NOT_ALLOWED_CURSOR;\n }\n const n = findCornerQuadrant(fabricObject, control, coord);\n return `${scaleMap[n]}-resize`;\n};\n\n/**\n * Basic scaling logic, reused with different constrain for scaling X,Y, freely or equally.\n * Needs to be wrapped with `wrapWithFixedAnchor` to be effective\n * @param {Event} eventData javascript event that is doing the transform\n * @param {Object} transform javascript object containing a series of information around the current transform\n * @param {number} x current mouse x position, canvas normalized\n * @param {number} y current mouse y position, canvas normalized\n * @param {Object} options additional information for scaling\n * @param {String} options.by 'x', 'y', 'equally' or '' to indicate type of scaling\n * @return {Boolean} true if some change happened\n * @private\n */\nfunction scaleObject(\n eventData: TPointerEvent,\n transform: ScaleTransform,\n x: number,\n y: number,\n options: { by?: ScaleBy } = {},\n) {\n const target = transform.target,\n by = options.by,\n scaleProportionally = scaleIsProportional(eventData, target),\n forbidScaling = scalingIsForbidden(target, by, scaleProportionally);\n let newPoint, scaleX, scaleY, dim, signX, signY;\n\n if (forbidScaling) {\n return false;\n }\n if (transform.gestureScale) {\n scaleX = transform.scaleX * transform.gestureScale;\n scaleY = transform.scaleY * transform.gestureScale;\n } else {\n newPoint = getLocalPoint(\n transform,\n transform.originX,\n transform.originY,\n x,\n y,\n );\n // use of sign: We use sign to detect change of direction of an action. sign usually change when\n // we cross the origin point with the mouse. So a scale flip for example. There is an issue when scaling\n // by center and scaling using one middle control ( default: mr, mt, ml, mb), the mouse movement can easily\n // cross many time the origin point and flip the object. so we need a way to filter out the noise.\n // This ternary here should be ok to filter out X scaling when we want Y only and vice versa.\n signX = by !== 'y' ? Math.sign(newPoint.x || transform.signX || 1) : 1;\n signY = by !== 'x' ? Math.sign(newPoint.y || transform.signY || 1) : 1;\n if (!transform.signX) {\n transform.signX = signX;\n }\n if (!transform.signY) {\n transform.signY = signY;\n }\n\n if (\n isLocked(target, 'lockScalingFlip') &&\n (transform.signX !== signX || transform.signY !== signY)\n ) {\n return false;\n }\n\n dim = target._getTransformedDimensions();\n // missing detection of flip and logic to switch the origin\n if (scaleProportionally && !by) {\n // uniform scaling\n const distance = Math.abs(newPoint.x) + Math.abs(newPoint.y),\n { original } = transform,\n originalDistance =\n Math.abs((dim.x * original.scaleX) / target.scaleX) +\n Math.abs((dim.y * original.scaleY) / target.scaleY),\n scale = distance / originalDistance;\n scaleX = original.scaleX * scale;\n scaleY = original.scaleY * scale;\n } else {\n scaleX = Math.abs((newPoint.x * target.scaleX) / dim.x);\n scaleY = Math.abs((newPoint.y * target.scaleY) / dim.y);\n }\n // if we are scaling by center, we need to double the scale\n if (isTransformCentered(transform)) {\n scaleX *= 2;\n scaleY *= 2;\n }\n if (transform.signX !== signX && by !== 'y') {\n transform.originX = invertOrigin(transform.originX);\n scaleX *= -1;\n transform.signX = signX;\n }\n if (transform.signY !== signY && by !== 'x') {\n transform.originY = invertOrigin(transform.originY);\n scaleY *= -1;\n transform.signY = signY;\n }\n }\n // minScale is taken care of in the setter.\n const oldScaleX = target.scaleX,\n oldScaleY = target.scaleY;\n if (!by) {\n !isLocked(target, 'lockScalingX') && target.set(SCALE_X, scaleX);\n !isLocked(target, 'lockScalingY') && target.set(SCALE_Y, scaleY);\n } else {\n // forbidden cases already handled on top here.\n by === 'x' && target.set(SCALE_X, scaleX);\n by === 'y' && target.set(SCALE_Y, scaleY);\n }\n return oldScaleX !== target.scaleX || oldScaleY !== target.scaleY;\n}\n\n/**\n * Generic scaling logic, to scale from corners either equally or freely.\n * Needs to be wrapped with `wrapWithFixedAnchor` to be effective\n * @param {Event} eventData javascript event that is doing the transform\n * @param {Object} transform javascript object containing a series of information around the current transform\n * @param {number} x current mouse x position, canvas normalized\n * @param {number} y current mouse y position, canvas normalized\n * @return {Boolean} true if some change happened\n */\nexport const scaleObjectFromCorner: TransformActionHandler = (\n eventData,\n transform,\n x,\n y,\n) => {\n return scaleObject(eventData, transform, x, y);\n};\n\n/**\n * Scaling logic for the X axis.\n * Needs to be wrapped with `wrapWithFixedAnchor` to be effective\n * @param {Event} eventData javascript event that is doing the transform\n * @param {Object} transform javascript object containing a series of information around the current transform\n * @param {number} x current mouse x position, canvas normalized\n * @param {number} y current mouse y position, canvas normalized\n * @return {Boolean} true if some change happened\n */\nconst scaleObjectX: TransformActionHandler = (\n eventData,\n transform,\n x,\n y,\n) => {\n return scaleObject(eventData, transform, x, y, { by: 'x' });\n};\n\n/**\n * Scaling logic for the Y axis.\n * Needs to be wrapped with `wrapWithFixedAnchor` to be effective\n * @param {Event} eventData javascript event that is doing the transform\n * @param {Object} transform javascript object containing a series of information around the current transform\n * @param {number} x current mouse x position, canvas normalized\n * @param {number} y current mouse y position, canvas normalized\n * @return {Boolean} true if some change happened\n */\nconst scaleObjectY: TransformActionHandler = (\n eventData,\n transform,\n x,\n y,\n) => {\n return scaleObject(eventData, transform, x, y, { by: 'y' });\n};\n\nexport const scalingEqually = wrapWithFireEvent(\n SCALING,\n wrapWithFixedAnchor(scaleObjectFromCorner),\n);\n\nexport const scalingX = wrapWithFireEvent(\n SCALING,\n wrapWithFixedAnchor(scaleObjectX),\n);\n\nexport const scalingY = wrapWithFireEvent(\n SCALING,\n wrapWithFixedAnchor(scaleObjectY),\n);\n","import type {\n ControlCursorCallback,\n TPointerEvent,\n Transform,\n TransformActionHandler,\n} from '../EventTypeDefs';\nimport { resolveOrigin } from '../util/misc/resolveOrigin';\nimport { Point } from '../Point';\nimport type { TAxis, TAxisKey } from '../typedefs';\nimport {\n degreesToRadians,\n radiansToDegrees,\n} from '../util/misc/radiansDegreesConversion';\nimport {\n findCornerQuadrant,\n getLocalPoint,\n isLocked,\n NOT_ALLOWED_CURSOR,\n} from './util';\nimport { wrapWithFireEvent } from './wrapWithFireEvent';\nimport { wrapWithFixedAnchor } from './wrapWithFixedAnchor';\nimport {\n CENTER,\n SCALE_X,\n SCALE_Y,\n SKEWING,\n SKEW_X,\n SKEW_Y,\n} from '../constants';\n\nexport type SkewTransform = Transform & { skewingSide: -1 | 1 };\n\nconst AXIS_KEYS: Record<\n TAxis,\n {\n counterAxis: TAxis;\n scale: TAxisKey<'scale'>;\n skew: TAxisKey<'skew'>;\n lockSkewing: TAxisKey<'lockSkewing'>;\n origin: TAxisKey<'origin'>;\n flip: TAxisKey<'flip'>;\n }\n> = {\n x: {\n counterAxis: 'y',\n scale: SCALE_X,\n skew: SKEW_X,\n lockSkewing: 'lockSkewingX',\n origin: 'originX',\n flip: 'flipX',\n },\n y: {\n counterAxis: 'x',\n scale: SCALE_Y,\n skew: SKEW_Y,\n lockSkewing: 'lockSkewingY',\n origin: 'originY',\n flip: 'flipY',\n },\n};\n\nconst skewMap = ['ns', 'nesw', 'ew', 'nwse'];\n\n/**\n * return the correct cursor style for the skew action\n * @param {Event} eventData the javascript event that is causing the scale\n * @param {Control} control the control that is interested in the action\n * @param {FabricObject} fabricObject the fabric object that is interested in the action\n * @return {String} a valid css string for the cursor\n */\nexport const skewCursorStyleHandler: ControlCursorCallback = (\n eventData,\n control,\n fabricObject,\n coord,\n) => {\n if (control.x !== 0 && isLocked(fabricObject, 'lockSkewingY')) {\n return NOT_ALLOWED_CURSOR;\n }\n if (control.y !== 0 && isLocked(fabricObject, 'lockSkewingX')) {\n return NOT_ALLOWED_CURSOR;\n }\n const n = findCornerQuadrant(fabricObject, control, coord) % 4;\n return `${skewMap[n]}-resize`;\n};\n\n/**\n * Since skewing is applied before scaling, calculations are done in a scaleless plane\n * @see https://github.com/fabricjs/fabric.js/pull/8380\n */\nfunction skewObject(\n axis: TAxis,\n { target, ex, ey, skewingSide, ...transform }: SkewTransform,\n pointer: Point,\n) {\n const { skew: skewKey } = AXIS_KEYS[axis],\n offset = pointer\n .subtract(new Point(ex, ey))\n .divide(new Point(target.scaleX, target.scaleY))[axis],\n skewingBefore = target[skewKey],\n skewingStart = transform[skewKey],\n shearingStart = Math.tan(degreesToRadians(skewingStart)),\n // let a, b be the size of target\n // let a' be the value of a after applying skewing\n // then:\n // a' = a + b * skewA => skewA = (a' - a) / b\n // the value b is tricky since skewY is applied before skewX\n b =\n axis === 'y'\n ? target._getTransformedDimensions({\n scaleX: 1,\n scaleY: 1,\n // since skewY is applied before skewX, b (=width) is not affected by skewX\n skewX: 0,\n }).x\n : target._getTransformedDimensions({\n scaleX: 1,\n scaleY: 1,\n }).y;\n\n const shearing =\n (2 * offset * skewingSide) /\n // we max out fractions to safeguard from asymptotic behavior\n Math.max(b, 1) +\n // add starting state\n shearingStart;\n\n const skewing = radiansToDegrees(Math.atan(shearing));\n\n target.set(skewKey, skewing);\n const changed = skewingBefore !== target[skewKey];\n\n if (changed && axis === 'y') {\n // we don't want skewing to affect scaleX\n // so we factor it by the inverse skewing diff to make it seem unchanged to the viewer\n const { skewX, scaleX } = target,\n dimBefore = target._getTransformedDimensions({ skewY: skewingBefore }),\n dimAfter = target._getTransformedDimensions(),\n compensationFactor = skewX !== 0 ? dimBefore.x / dimAfter.x : 1;\n compensationFactor !== 1 &&\n target.set(SCALE_X, compensationFactor * scaleX);\n }\n\n return changed;\n}\n\n/**\n * Wrapped Action handler for skewing on a given axis, takes care of the\n * skew direction and determines the correct transform origin for the anchor point\n * @param {Event} eventData javascript event that is doing the transform\n * @param {Object} transform javascript object containing a series of information around the current transform\n * @param {number} x current mouse x position, canvas normalized\n * @param {number} y current mouse y position, canvas normalized\n * @return {Boolean} true if some change happened\n */\nfunction skewHandler(\n axis: TAxis,\n eventData: TPointerEvent,\n transform: Transform,\n x: number,\n y: number,\n) {\n const { target } = transform,\n {\n counterAxis,\n origin: originKey,\n lockSkewing: lockSkewingKey,\n skew: skewKey,\n flip: flipKey,\n } = AXIS_KEYS[axis];\n if (isLocked(target, lockSkewingKey)) {\n return false;\n }\n\n const { origin: counterOriginKey, flip: counterFlipKey } =\n AXIS_KEYS[counterAxis],\n counterOriginFactor =\n resolveOrigin(transform[counterOriginKey]) *\n (target[counterFlipKey] ? -1 : 1),\n // if the counter origin is top/left (= -0.5) then we are skewing x/y values on the bottom/right side of target respectively.\n // if the counter origin is bottom/right (= 0.5) then we are skewing x/y values on the top/left side of target respectively.\n // skewing direction on the top/left side of target is OPPOSITE to the direction of the movement of the pointer,\n // so we factor skewing direction by this value.\n skewingSide = (-Math.sign(counterOriginFactor) *\n (target[flipKey] ? -1 : 1)) as 1 | -1,\n skewingDirection =\n ((target[skewKey] === 0 &&\n // in case skewing equals 0 we use the pointer offset from target center to determine the direction of skewing\n getLocalPoint(transform, CENTER, CENTER, x, y)[axis] > 0) ||\n // in case target has skewing we use that as the direction\n target[skewKey] > 0\n ? 1\n : -1) * skewingSide,\n // anchor to the opposite side of the skewing direction\n // normalize value from [-1, 1] to origin value [0, 1]\n origin = -skewingDirection * 0.5 + 0.5;\n\n const finalHandler = wrapWithFireEvent(\n SKEWING,\n wrapWithFixedAnchor((eventData, transform, x, y) =>\n skewObject(axis, transform, new Point(x, y)),\n ),\n );\n\n return finalHandler(\n eventData,\n {\n ...transform,\n [originKey]: origin,\n skewingSide,\n },\n x,\n y,\n );\n}\n\n/**\n * Wrapped Action handler for skewing on the X axis, takes care of the\n * skew direction and determines the correct transform origin for the anchor point\n * @param {Event} eventData javascript event that is doing the transform\n * @param {Object} transform javascript object containing a series of information around the current transform\n * @param {number} x current mouse x position, canvas normalized\n * @param {number} y current mouse y position, canvas normalized\n * @return {Boolean} true if some change happened\n */\nexport const skewHandlerX: TransformActionHandler = (\n eventData,\n transform,\n x,\n y,\n) => {\n return skewHandler('x', eventData, transform, x, y);\n};\n\n/**\n * Wrapped Action handler for skewing on the Y axis, takes care of the\n * skew direction and determines the correct transform origin for the anchor point\n * @param {Event} eventData javascript event that is doing the transform\n * @param {Object} transform javascript object containing a series of information around the current transform\n * @param {number} x current mouse x position, canvas normalized\n * @param {number} y current mouse y position, canvas normalized\n * @return {Boolean} true if some change happened\n */\nexport const skewHandlerY: TransformActionHandler = (\n eventData,\n transform,\n x,\n y,\n) => {\n return skewHandler('y', eventData, transform, x, y);\n};\n","import type {\n ControlCallback,\n ControlCursorCallback,\n TPointerEvent,\n TransformActionHandler,\n} from '../EventTypeDefs';\nimport { SCALE_X, SCALE_Y, SKEW_X, SKEW_Y } from '../constants';\nimport type { FabricObject } from '../shapes/Object/FabricObject';\nimport type { TAxisKey } from '../typedefs';\nimport { scaleCursorStyleHandler, scalingX, scalingY } from './scale';\nimport { skewCursorStyleHandler, skewHandlerX, skewHandlerY } from './skew';\n\nfunction isAltAction(eventData: TPointerEvent, target: FabricObject) {\n return eventData[target.canvas!.altActionKey!];\n}\n\n/**\n * Inspect event, control and fabricObject to return the correct action name\n * @param {Event} eventData the javascript event that is causing the scale\n * @param {Control} control the control that is interested in the action\n * @param {FabricObject} fabricObject the fabric object that is interested in the action\n * @return {String} an action name\n */\nexport const scaleOrSkewActionName: ControlCallback<\n TAxisKey<'skew' | 'scale'> | ''\n> = (eventData, control, fabricObject) => {\n const isAlternative = isAltAction(eventData, fabricObject);\n if (control.x === 0) {\n // then is scaleY or skewX\n return isAlternative ? SKEW_X : SCALE_Y;\n }\n if (control.y === 0) {\n // then is scaleY or skewX\n return isAlternative ? SKEW_Y : SCALE_X;\n }\n return '';\n};\n\n/**\n * Combine skew and scale style handlers to cover fabric standard use case\n * @param {Event} eventData the javascript event that is causing the scale\n * @param {Control} control the control that is interested in the action\n * @param {FabricObject} fabricObject the fabric object that is interested in the action\n * @return {String} a valid css string for the cursor\n */\nexport const scaleSkewCursorStyleHandler: ControlCursorCallback = (\n eventData,\n control,\n fabricObject,\n coord,\n) => {\n return isAltAction(eventData, fabricObject)\n ? skewCursorStyleHandler(eventData, control, fabricObject, coord)\n : scaleCursorStyleHandler(eventData, control, fabricObject, coord);\n};\n/**\n * Composed action handler to either scale X or skew Y\n * Needs to be wrapped with `wrapWithFixedAnchor` to be effective\n * @param {Event} eventData javascript event that is doing the transform\n * @param {Object} transform javascript object containing a series of information around the current transform\n * @param {number} x current mouse x position, canvas normalized\n * @param {number} y current mouse y position, canvas normalized\n * @return {Boolean} true if some change happened\n */\nexport const scalingXOrSkewingY: TransformActionHandler = (\n eventData,\n transform,\n x,\n y,\n) => {\n return isAltAction(eventData, transform.target)\n ? skewHandlerY(eventData, transform, x, y)\n : scalingX(eventData, transform, x, y);\n};\n\n/**\n * Composed action handler to either scale Y or skew X\n * Needs to be wrapped with `wrapWithFixedAnchor` to be effective\n * @param {Event} eventData javascript event that is doing the transform\n * @param {Object} transform javascript object containing a series of information around the current transform\n * @param {number} x current mouse x position, canvas normalized\n * @param {number} y current mouse y position, canvas normalized\n * @return {Boolean} true if some change happened\n */\nexport const scalingYOrSkewingX: TransformActionHandler = (\n eventData,\n transform,\n x,\n y,\n) => {\n return isAltAction(eventData, transform.target)\n ? skewHandlerX(eventData, transform, x, y)\n : scalingY(eventData, transform, x, y);\n};\n","import { RESIZING, ROTATE } from '../constants';\nimport { changeWidth } from './changeWidth';\nimport { Control } from './Control';\nimport { rotationStyleHandler, rotationWithSnapping } from './rotate';\nimport { scaleCursorStyleHandler, scalingEqually } from './scale';\nimport {\n scaleOrSkewActionName,\n scaleSkewCursorStyleHandler,\n scalingXOrSkewingY,\n scalingYOrSkewingX,\n} from './scaleSkew';\n\n// use this function if you want to generate new controls for every instance\nexport const createObjectDefaultControls = () => ({\n ml: new Control({\n x: -0.5,\n y: 0,\n cursorStyleHandler: scaleSkewCursorStyleHandler,\n actionHandler: scalingXOrSkewingY,\n getActionName: scaleOrSkewActionName,\n }),\n\n mr: new Control({\n x: 0.5,\n y: 0,\n cursorStyleHandler: scaleSkewCursorStyleHandler,\n actionHandler: scalingXOrSkewingY,\n getActionName: scaleOrSkewActionName,\n }),\n\n mb: new Control({\n x: 0,\n y: 0.5,\n cursorStyleHandler: scaleSkewCursorStyleHandler,\n actionHandler: scalingYOrSkewingX,\n getActionName: scaleOrSkewActionName,\n }),\n\n mt: new Control({\n x: 0,\n y: -0.5,\n cursorStyleHandler: scaleSkewCursorStyleHandler,\n actionHandler: scalingYOrSkewingX,\n getActionName: scaleOrSkewActionName,\n }),\n\n tl: new Control({\n x: -0.5,\n y: -0.5,\n cursorStyleHandler: scaleCursorStyleHandler,\n actionHandler: scalingEqually,\n }),\n\n tr: new Control({\n x: 0.5,\n y: -0.5,\n cursorStyleHandler: scaleCursorStyleHandler,\n actionHandler: scalingEqually,\n }),\n\n bl: new Control({\n x: -0.5,\n y: 0.5,\n cursorStyleHandler: scaleCursorStyleHandler,\n actionHandler: scalingEqually,\n }),\n\n br: new Control({\n x: 0.5,\n y: 0.5,\n cursorStyleHandler: scaleCursorStyleHandler,\n actionHandler: scalingEqually,\n }),\n\n mtr: new Control({\n x: 0,\n y: -0.5,\n actionHandler: rotationWithSnapping,\n cursorStyleHandler: rotationStyleHandler,\n offsetY: -40,\n withConnection: true,\n actionName: ROTATE,\n }),\n});\n\nexport const createResizeControls = () => ({\n mr: new Control({\n x: 0.5,\n y: 0,\n actionHandler: changeWidth,\n cursorStyleHandler: scaleSkewCursorStyleHandler,\n actionName: RESIZING,\n }),\n ml: new Control({\n x: -0.5,\n y: 0,\n actionHandler: changeWidth,\n cursorStyleHandler: scaleSkewCursorStyleHandler,\n actionName: RESIZING,\n }),\n});\n\nexport const createTextboxDefaultControls = () => ({\n ...createObjectDefaultControls(),\n ...createResizeControls(),\n});\n","import { Point, ZERO } from '../../Point';\nimport type { TCornerPoint, TDegree } from '../../typedefs';\nimport { FabricObject } from './Object';\nimport { degreesToRadians } from '../../util/misc/radiansDegreesConversion';\nimport type { TQrDecomposeOut } from '../../util/misc/matrix';\nimport {\n calcDimensionsMatrix,\n createRotateMatrix,\n createTranslateMatrix,\n multiplyTransformMatrices,\n qrDecompose,\n} from '../../util/misc/matrix';\nimport type { Control } from '../../controls/Control';\nimport { sizeAfterTransform } from '../../util/misc/objectTransforms';\nimport type { ObjectEvents, TPointerEvent } from '../../EventTypeDefs';\nimport type { Canvas } from '../../canvas/Canvas';\nimport type { ControlRenderingStyleOverride } from '../../controls/controlRendering';\nimport type { FabricObjectProps } from './types/FabricObjectProps';\nimport type { TFabricObjectProps, SerializedObjectProps } from './types';\nimport { createObjectDefaultControls } from '../../controls/commonControls';\nimport { interactiveObjectDefaultValues } from './defaultValues';\nimport { SCALE } from '../../constants';\n\nexport type TOCoord = Point & {\n corner: TCornerPoint;\n touchCorner: TCornerPoint;\n};\n\nexport type TControlSet = Record;\n\nexport type TBorderRenderingStyleOverride = Partial<\n Pick\n>;\n\nexport type TStyleOverride = ControlRenderingStyleOverride &\n TBorderRenderingStyleOverride &\n Partial<\n Pick & {\n forActiveSelection: boolean;\n }\n >;\n\nexport class InteractiveFabricObject<\n Props extends TFabricObjectProps = Partial,\n SProps extends SerializedObjectProps = SerializedObjectProps,\n EventSpec extends ObjectEvents = ObjectEvents,\n >\n extends FabricObject\n implements FabricObjectProps\n{\n declare noScaleCache: boolean;\n\n declare snapAngle?: TDegree;\n declare snapThreshold?: TDegree;\n\n declare lockMovementX: boolean;\n declare lockMovementY: boolean;\n declare lockRotation: boolean;\n declare lockScalingX: boolean;\n declare lockScalingY: boolean;\n declare lockSkewingX: boolean;\n declare lockSkewingY: boolean;\n declare lockScalingFlip: boolean;\n\n declare cornerSize: number;\n declare touchCornerSize: number;\n declare transparentCorners: boolean;\n declare cornerColor: string;\n declare cornerStrokeColor: string;\n declare cornerStyle: 'rect' | 'circle';\n declare cornerDashArray: number[] | null;\n declare hasControls: boolean;\n\n declare borderColor: string;\n declare borderDashArray: number[] | null;\n declare borderOpacityWhenMoving: number;\n declare borderScaleFactor: number;\n declare hasBorders: boolean;\n declare selectionBackgroundColor: string;\n\n declare selectable: boolean;\n declare evented: boolean;\n declare perPixelTargetFind: boolean;\n declare activeOn: 'down' | 'up';\n\n declare hoverCursor: CSSStyleDeclaration['cursor'] | null;\n declare moveCursor: CSSStyleDeclaration['cursor'] | null;\n\n /**\n * The object's controls' position in viewport coordinates\n * Calculated by {@link Control#positionHandler} and {@link Control#calcCornerCoords}, depending on {@link padding}.\n * `corner/touchCorner` describe the 4 points forming the interactive area of the corner.\n * Used to draw and locate controls.\n */\n declare oCoords: Record;\n\n /**\n * keeps the value of the last hovered corner during mouse move.\n * 0 is no corner, or 'mt', 'ml', 'mtr' etc..\n * It should be private, but there is no harm in using it as\n * a read-only property.\n * this isn't cleaned automatically. Non selected objects may have wrong values\n * @type [string]\n */\n declare __corner?: string;\n\n /**\n * a map of control visibility for this object.\n * this was left when controls were introduced to not break the api too much\n * this takes priority over the generic control visibility\n */\n declare _controlsVisibility: Record;\n\n /**\n * holds the controls for the object.\n * controls are added by default_controls.js\n */\n declare controls: TControlSet;\n\n /**\n * internal boolean to signal the code that the object is\n * part of the move action.\n */\n declare isMoving?: boolean;\n\n /**\n * A boolean used from the gesture module to keep tracking of a scaling\n * action when there is no scaling transform in place.\n * This is an edge case and is used twice in all codebase.\n * Probably added to keep track of some performance issues\n * @TODO use git blame to investigate why it was added\n * DON'T USE IT. WE WILL TRY TO REMOVE IT\n */\n declare _scaling?: boolean;\n\n declare canvas?: Canvas;\n\n static ownDefaults = interactiveObjectDefaultValues;\n\n static getDefaults(): Record {\n return {\n ...super.getDefaults(),\n ...InteractiveFabricObject.ownDefaults,\n };\n }\n\n /**\n * Constructor\n * @param {Object} [options] Options object\n */\n constructor(options?: Props) {\n super();\n Object.assign(\n this,\n (this.constructor as typeof InteractiveFabricObject).createControls(),\n InteractiveFabricObject.ownDefaults,\n );\n this.setOptions(options);\n }\n\n /**\n * Creates the default control object.\n * If you prefer to have on instance of controls shared among all objects\n * make this function return an empty object and add controls to the ownDefaults\n * @param {Object} [options] Options object\n */\n static createControls(): { controls: Record } {\n return { controls: createObjectDefaultControls() };\n }\n\n /**\n * Update width and height of the canvas for cache\n * returns true or false if canvas needed resize.\n * @private\n * @return {Boolean} true if the canvas has been resized\n */\n _updateCacheCanvas() {\n const targetCanvas = this.canvas;\n if (this.noScaleCache && targetCanvas && targetCanvas._currentTransform) {\n const transform = targetCanvas._currentTransform,\n target = transform.target,\n action = transform.action;\n if (\n this === (target as unknown as this) &&\n action &&\n action.startsWith(SCALE)\n ) {\n return false;\n }\n }\n return super._updateCacheCanvas();\n }\n\n getActiveControl() {\n const key = this.__corner;\n return key\n ? {\n key,\n control: this.controls[key],\n coord: this.oCoords[key],\n }\n : undefined;\n }\n\n /**\n * Determines which corner is under the mouse cursor, represented by `pointer`.\n * This function returns a corner only if the object is the active one.\n * This is done to avoid selecting corner of non active object and activating transformations\n * rather than drag action. The default behavior of fabricJS is that if you want to transform\n * an object, first you select it to show the control set\n * @private\n * @param {Object} pointer The pointer indicating the mouse position\n * @param {boolean} forTouch indicates if we are looking for interaction area with a touch action\n * @return {String|Boolean} corner code (tl, tr, bl, br, etc.), or 0 if nothing is found.\n */\n findControl(\n pointer: Point,\n forTouch = false,\n ): { key: string; control: Control; coord: TOCoord } | undefined {\n if (!this.hasControls || !this.canvas) {\n return undefined;\n }\n\n this.__corner = undefined;\n const cornerEntries = Object.entries(this.oCoords);\n for (let i = cornerEntries.length - 1; i >= 0; i--) {\n const [key, corner] = cornerEntries[i];\n const control = this.controls[key];\n\n if (\n control.shouldActivate(\n key,\n this,\n pointer,\n forTouch ? corner.touchCorner : corner.corner,\n )\n ) {\n // this.canvas.contextTop.fillRect(pointer.x - 1, pointer.y - 1, 2, 2);\n this.__corner = key;\n\n return { key, control, coord: this.oCoords[key] };\n }\n }\n\n return undefined;\n }\n\n /**\n * Calculates the coordinates of the center of each control plus the corners of the control itself\n * This basically just delegates to each control positionHandler\n * WARNING: changing what is passed to positionHandler is a breaking change, since position handler\n * is a public api and should be done just if extremely necessary\n * @return {Record}\n */\n calcOCoords(): Record {\n const vpt = this.getViewportTransform(),\n center = this.getCenterPoint(),\n tMatrix = createTranslateMatrix(center.x, center.y),\n rMatrix = createRotateMatrix({\n angle: this.getTotalAngle() - (!!this.group && this.flipX ? 180 : 0),\n }),\n positionMatrix = multiplyTransformMatrices(tMatrix, rMatrix),\n startMatrix = multiplyTransformMatrices(vpt, positionMatrix),\n finalMatrix = multiplyTransformMatrices(startMatrix, [\n 1 / vpt[0],\n 0,\n 0,\n 1 / vpt[3],\n 0,\n 0,\n ]),\n transformOptions = this.group\n ? qrDecompose(this.calcTransformMatrix())\n : undefined;\n // decomposing could bring negative scaling and `_calculateCurrentDimensions` can't take it\n if (transformOptions) {\n transformOptions.scaleX = Math.abs(transformOptions.scaleX);\n transformOptions.scaleY = Math.abs(transformOptions.scaleY);\n }\n const dim = this._calculateCurrentDimensions(transformOptions),\n coords: Record = {};\n\n this.forEachControl((control, key) => {\n const position = control.positionHandler(dim, finalMatrix, this, control);\n // coords[key] are sometimes used as points. Those are points to which we add\n // the property corner and touchCorner from `_calcCornerCoords`.\n // don't remove this assign for an object spread.\n coords[key] = Object.assign(\n position,\n this._calcCornerCoords(control, position),\n );\n });\n\n // debug code\n /*\n const canvas = this.canvas;\n setTimeout(function () {\n if (!canvas) return;\n canvas.contextTop.clearRect(0, 0, 700, 700);\n canvas.contextTop.fillStyle = 'green';\n Object.keys(coords).forEach(function(key) {\n const control = coords[key];\n canvas.contextTop.fillRect(control.x, control.y, 3, 3);\n });\n } 50);\n */\n return coords;\n }\n\n /**\n * Sets the coordinates that determine the interaction area of each control\n * note: if we would switch to ROUND corner area, all of this would disappear.\n * everything would resolve to a single point and a pythagorean theorem for the distance\n * @todo evaluate simplification of code switching to circle interaction area at runtime\n * @private\n */\n private _calcCornerCoords(control: Control, position: Point) {\n const angle = this.getTotalAngle();\n const corner = control.calcCornerCoords(\n angle,\n this.cornerSize,\n position.x,\n position.y,\n false,\n this,\n );\n const touchCorner = control.calcCornerCoords(\n angle,\n this.touchCornerSize,\n position.x,\n position.y,\n true,\n this,\n );\n return { corner, touchCorner };\n }\n\n /**\n * @override set controls' coordinates as well\n * See {@link https://github.com/fabricjs/fabric.js/wiki/When-to-call-setCoords} and {@link http://fabricjs.com/fabric-gotchas}\n * @return {void}\n */\n setCoords(): void {\n super.setCoords();\n this.canvas && (this.oCoords = this.calcOCoords());\n }\n\n /**\n * Calls a function for each control. The function gets called,\n * with the control, the control's key and the object that is calling the iterator\n * @param {Function} fn function to iterate over the controls over\n */\n forEachControl(\n fn: (\n control: Control,\n key: string,\n fabricObject: InteractiveFabricObject,\n ) => any,\n ) {\n for (const i in this.controls) {\n fn(this.controls[i], i, this);\n }\n }\n\n /**\n * Draws a colored layer behind the object, inside its selection borders.\n * Requires public options: padding, selectionBackgroundColor\n * this function is called when the context is transformed\n * has checks to be skipped when the object is on a staticCanvas\n * @todo evaluate if make this disappear in favor of a pre-render hook for objects\n * this was added by Andrea Bogazzi to make possible some feature for work reasons\n * it seemed a good option, now is an edge case\n * @param {CanvasRenderingContext2D} ctx Context to draw on\n */\n drawSelectionBackground(ctx: CanvasRenderingContext2D): void {\n if (\n !this.selectionBackgroundColor ||\n (this.canvas && (this.canvas._activeObject as unknown as this) !== this)\n ) {\n return;\n }\n ctx.save();\n const center = this.getRelativeCenterPoint(),\n wh = this._calculateCurrentDimensions(),\n vpt = this.getViewportTransform();\n ctx.translate(center.x, center.y);\n ctx.scale(1 / vpt[0], 1 / vpt[3]);\n ctx.rotate(degreesToRadians(this.angle));\n ctx.fillStyle = this.selectionBackgroundColor;\n ctx.fillRect(-wh.x / 2, -wh.y / 2, wh.x, wh.y);\n ctx.restore();\n }\n\n /**\n * @public override this function in order to customize the drawing of the control box, e.g. rounded corners, different border style.\n * @param {CanvasRenderingContext2D} ctx ctx is rotated and translated so that (0,0) is at object's center\n * @param {Point} size the control box size used\n */\n strokeBorders(ctx: CanvasRenderingContext2D, size: Point): void {\n ctx.strokeRect(-size.x / 2, -size.y / 2, size.x, size.y);\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to draw on\n * @param {Point} size\n * @param {TStyleOverride} styleOverride object to override the object style\n */\n _drawBorders(\n ctx: CanvasRenderingContext2D,\n size: Point,\n styleOverride: TStyleOverride = {},\n ): void {\n const options = {\n hasControls: this.hasControls,\n borderColor: this.borderColor,\n borderDashArray: this.borderDashArray,\n ...styleOverride,\n };\n ctx.save();\n ctx.strokeStyle = options.borderColor;\n this._setLineDash(ctx, options.borderDashArray);\n this.strokeBorders(ctx, size);\n options.hasControls && this.drawControlsConnectingLines(ctx, size);\n ctx.restore();\n }\n\n /**\n * Renders controls and borders for the object\n * the context here is not transformed\n * @todo move to interactivity\n * @param {CanvasRenderingContext2D} ctx Context to render on\n * @param {TStyleOverride} [styleOverride] properties to override the object style\n */\n _renderControls(\n ctx: CanvasRenderingContext2D,\n styleOverride: TStyleOverride = {},\n ) {\n const { hasBorders, hasControls } = this;\n const styleOptions = {\n hasBorders,\n hasControls,\n ...styleOverride,\n };\n const vpt = this.getViewportTransform(),\n shouldDrawBorders = styleOptions.hasBorders,\n shouldDrawControls = styleOptions.hasControls;\n const matrix = multiplyTransformMatrices(vpt, this.calcTransformMatrix());\n const options = qrDecompose(matrix);\n ctx.save();\n ctx.translate(options.translateX, options.translateY);\n ctx.lineWidth = this.borderScaleFactor; // 1 * this.borderScaleFactor;\n // since interactive groups have been introduced, an object could be inside a group and needing controls\n // the following equality check `this.group === this.parent` covers:\n // object without a group ( undefined === undefined )\n // object inside a group\n // excludes object inside a group but multi selected since group and parent will differ in value\n if (this.group === this.parent) {\n ctx.globalAlpha = this.isMoving ? this.borderOpacityWhenMoving : 1;\n }\n if (this.flipX) {\n options.angle -= 180;\n }\n ctx.rotate(degreesToRadians(this.group ? options.angle : this.angle));\n shouldDrawBorders && this.drawBorders(ctx, options, styleOverride);\n shouldDrawControls && this.drawControls(ctx, styleOverride);\n ctx.restore();\n }\n\n /**\n * Draws borders of an object's bounding box.\n * Requires public properties: width, height\n * Requires public options: padding, borderColor\n * @param {CanvasRenderingContext2D} ctx Context to draw on\n * @param {object} options object representing current object parameters\n * @param {TStyleOverride} [styleOverride] object to override the object style\n */\n drawBorders(\n ctx: CanvasRenderingContext2D,\n options: TQrDecomposeOut,\n styleOverride: TStyleOverride,\n ): void {\n let size;\n if ((styleOverride && styleOverride.forActiveSelection) || this.group) {\n const bbox = sizeAfterTransform(\n this.width,\n this.height,\n calcDimensionsMatrix(options),\n ),\n stroke = !this.isStrokeAccountedForInDimensions()\n ? (this.strokeUniform\n ? new Point().scalarAdd(this.canvas ? this.canvas.getZoom() : 1)\n : // this is extremely confusing. options comes from the upper function\n // and is the qrDecompose of a matrix that takes in account zoom too\n new Point(options.scaleX, options.scaleY)\n ).scalarMultiply(this.strokeWidth)\n : ZERO;\n size = bbox\n .add(stroke)\n .scalarAdd(this.borderScaleFactor)\n .scalarAdd(this.padding * 2);\n } else {\n size = this._calculateCurrentDimensions().scalarAdd(\n this.borderScaleFactor,\n );\n }\n this._drawBorders(ctx, size, styleOverride);\n }\n\n /**\n * Draws lines from a borders of an object's bounding box to controls that have `withConnection` property set.\n * Requires public properties: width, height\n * Requires public options: padding, borderColor\n * @param {CanvasRenderingContext2D} ctx Context to draw on\n * @param {Point} size object size x = width, y = height\n */\n drawControlsConnectingLines(\n ctx: CanvasRenderingContext2D,\n size: Point,\n ): void {\n let shouldStroke = false;\n\n ctx.beginPath();\n this.forEachControl((control, key) => {\n // in this moment, the ctx is centered on the object.\n // width and height of the above function are the size of the bbox.\n if (control.withConnection && control.getVisibility(this, key)) {\n // reset movement for each control\n shouldStroke = true;\n ctx.moveTo(control.x * size.x, control.y * size.y);\n ctx.lineTo(\n control.x * size.x + control.offsetX,\n control.y * size.y + control.offsetY,\n );\n }\n });\n shouldStroke && ctx.stroke();\n }\n\n /**\n * Draws corners of an object's bounding box.\n * Requires public properties: width, height\n * Requires public options: cornerSize, padding\n * Be aware that since fabric 6.0 this function does not call setCoords anymore.\n * setCoords needs to be called manually if the object of which we are rendering controls\n * is outside the standard selection and transform process.\n * @param {CanvasRenderingContext2D} ctx Context to draw on\n * @param {ControlRenderingStyleOverride} styleOverride object to override the object style\n */\n drawControls(\n ctx: CanvasRenderingContext2D,\n styleOverride: ControlRenderingStyleOverride = {},\n ) {\n ctx.save();\n const retinaScaling = this.getCanvasRetinaScaling();\n const { cornerStrokeColor, cornerDashArray, cornerColor } = this;\n const options = {\n cornerStrokeColor,\n cornerDashArray,\n cornerColor,\n ...styleOverride,\n };\n ctx.setTransform(retinaScaling, 0, 0, retinaScaling, 0, 0);\n ctx.strokeStyle = ctx.fillStyle = options.cornerColor;\n if (!this.transparentCorners) {\n ctx.strokeStyle = options.cornerStrokeColor;\n }\n this._setLineDash(ctx, options.cornerDashArray);\n this.forEachControl((control, key) => {\n if (control.getVisibility(this, key)) {\n const p = this.oCoords[key];\n control.render(ctx, p.x, p.y, options, this);\n }\n });\n ctx.restore();\n }\n\n /**\n * Returns true if the specified control is visible, false otherwise.\n * @param {string} controlKey The key of the control. Possible values are usually 'tl', 'tr', 'br', 'bl', 'ml', 'mt', 'mr', 'mb', 'mtr',\n * but since the control api allow for any control name, can be any string.\n * @returns {boolean} true if the specified control is visible, false otherwise\n */\n isControlVisible(controlKey: string): boolean {\n return (\n this.controls[controlKey] &&\n this.controls[controlKey].getVisibility(this, controlKey)\n );\n }\n\n /**\n * Sets the visibility of the specified control.\n * please do not use.\n * @param {String} controlKey The key of the control. Possible values are 'tl', 'tr', 'br', 'bl', 'ml', 'mt', 'mr', 'mb', 'mtr'.\n * but since the control api allow for any control name, can be any string.\n * @param {Boolean} visible true to set the specified control visible, false otherwise\n * @todo discuss this overlap of priority here with the team. Andrea Bogazzi for details\n */\n setControlVisible(controlKey: string, visible: boolean) {\n if (!this._controlsVisibility) {\n this._controlsVisibility = {};\n }\n this._controlsVisibility[controlKey] = visible;\n }\n\n /**\n * Sets the visibility state of object controls, this is just a bulk option for setControlVisible;\n * @param {Record} [options] with an optional key per control\n * example: {Boolean} [options.bl] true to enable the bottom-left control, false to disable it\n */\n setControlsVisibility(options: Record = {}) {\n Object.entries(options).forEach(([controlKey, visibility]) =>\n this.setControlVisible(controlKey, visibility),\n );\n }\n\n /**\n * Clears the canvas.contextTop in a specific area that corresponds to the object's bounding box\n * that is in the canvas.contextContainer.\n * This function is used to clear pieces of contextTop where we render ephemeral effects on top of the object.\n * Example: blinking cursor text selection, drag effects.\n * @todo discuss swapping restoreManually with a renderCallback, but think of async issues\n * @param {Boolean} [restoreManually] When true won't restore the context after clear, in order to draw something else.\n * @return {CanvasRenderingContext2D|undefined} canvas.contextTop that is either still transformed\n * with the object transformMatrix, or restored to neutral transform\n */\n clearContextTop(\n restoreManually?: boolean,\n ): CanvasRenderingContext2D | undefined {\n if (!this.canvas) {\n return;\n }\n const ctx = this.canvas.contextTop;\n if (!ctx) {\n return;\n }\n const v = this.canvas.viewportTransform;\n ctx.save();\n ctx.transform(v[0], v[1], v[2], v[3], v[4], v[5]);\n this.transform(ctx);\n // we add 4 pixel, to be sure to do not leave any pixel out\n const width = this.width + 4,\n height = this.height + 4;\n ctx.clearRect(-width / 2, -height / 2, width, height);\n\n restoreManually || ctx.restore();\n return ctx;\n }\n\n /**\n * This callback function is called every time _discardActiveObject or _setActiveObject\n * try to to deselect this object. If the function returns true, the process is cancelled\n * @param {Object} [_options] options sent from the upper functions\n * @param {TPointerEvent} [options.e] event if the process is generated by an event\n * @param {FabricObject} [options.object] next object we are setting as active, and reason why\n * this is being deselected\n */\n onDeselect(_options?: {\n e?: TPointerEvent;\n object?: InteractiveFabricObject;\n }): boolean {\n // implemented by sub-classes, as needed.\n return false;\n }\n\n /**\n * This callback function is called every time _discardActiveObject or _setActiveObject\n * try to to select this object. If the function returns true, the process is cancelled\n * @param {Object} [_options] options sent from the upper functions\n * @param {Event} [_options.e] event if the process is generated by an event\n */\n onSelect(_options?: { e?: TPointerEvent }): boolean {\n // implemented by sub-classes, as needed.\n return false;\n }\n\n /**\n * Override to customize Drag behavior\n * Fired from {@link Canvas#_onMouseMove}\n * @returns true in order for the window to start a drag session\n */\n shouldStartDragging(_e: TPointerEvent) {\n return false;\n }\n\n /**\n * Override to customize Drag behavior\\\n * Fired once a drag session has started\n * @returns true to handle the drag event\n */\n onDragStart(_e: DragEvent) {\n return false;\n }\n\n /**\n * Override to customize drag and drop behavior\n * @public\n * @param {DragEvent} _e\n * @returns {boolean} true if the object currently dragged can be dropped on the target\n */\n canDrop(_e: DragEvent): boolean {\n return false;\n }\n\n /**\n * Override to customize drag and drop behavior\n * render a specific effect when an object is the source of a drag event\n * example: render the selection status for the part of text that is being dragged from a text object\n * @public\n * @param {DragEvent} _e\n */\n renderDragSourceEffect(_e: DragEvent) {\n // for subclasses\n }\n\n /**\n * Override to customize drag and drop behavior\n * render a specific effect when an object is the target of a drag event\n * used to show that the underly object can receive a drop, or to show how the\n * object will change when dropping. example: show the cursor where the text is about to be dropped\n * @public\n * @param {DragEvent} _e\n */\n renderDropTargetEffect(_e: DragEvent) {\n // for subclasses\n }\n}\n","import type { Constructor } from '../typedefs';\n\n/***\n * https://www.typescriptlang.org/docs/handbook/mixins.html#alternative-pattern\n */\nexport function applyMixins(\n derivedCtor: T,\n constructors: S[],\n) {\n constructors.forEach((baseCtor) => {\n Object.getOwnPropertyNames(baseCtor.prototype).forEach((name) => {\n name !== 'constructor' &&\n Object.defineProperty(\n derivedCtor.prototype,\n name,\n Object.getOwnPropertyDescriptor(baseCtor.prototype, name) ||\n Object.create(null),\n );\n });\n });\n return derivedCtor as T & { prototype: InstanceType };\n}\n","import type { ObjectEvents } from '../../EventTypeDefs';\nimport { FabricObjectSVGExportMixin } from './FabricObjectSVGExportMixin';\nimport { InteractiveFabricObject } from './InteractiveObject';\nimport { applyMixins } from '../../util/applyMixins';\nimport type { FabricObjectProps } from './types/FabricObjectProps';\nimport type { TFabricObjectProps, SerializedObjectProps } from './types';\nimport { classRegistry } from '../../ClassRegistry';\n\n// TODO somehow we have to make a tree-shakeable import\n\n// eslint-disable-next-line @typescript-eslint/no-empty-object-type\nexport interface FabricObject<\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n Props extends TFabricObjectProps = Partial,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n SProps extends SerializedObjectProps = SerializedObjectProps,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n EventSpec extends ObjectEvents = ObjectEvents,\n> extends FabricObjectSVGExportMixin {}\n\n// eslint-disable-next-line @typescript-eslint/no-unsafe-declaration-merging\nexport class FabricObject<\n Props extends TFabricObjectProps = Partial,\n SProps extends SerializedObjectProps = SerializedObjectProps,\n EventSpec extends ObjectEvents = ObjectEvents,\n> extends InteractiveFabricObject {}\n\napplyMixins(FabricObject, [FabricObjectSVGExportMixin]);\n\nclassRegistry.setClass(FabricObject);\nclassRegistry.setClass(FabricObject, 'object');\n\nexport { cacheProperties } from './defaultValues';\n","/**\n * Returns true if context has transparent pixel\n * at specified location (taking tolerance into account)\n * @param {CanvasRenderingContext2D} ctx context\n * @param {Number} x x coordinate in canvasElementCoordinate, not fabric space. integer\n * @param {Number} y y coordinate in canvasElementCoordinate, not fabric space. integer\n * @param {Number} tolerance Tolerance pixels around the point, not alpha tolerance, integer\n * @return {boolean} true if transparent\n */\nexport const isTransparent = (\n ctx: CanvasRenderingContext2D,\n x: number,\n y: number,\n tolerance: number,\n): boolean => {\n tolerance = Math.round(tolerance);\n const size = tolerance * 2 + 1;\n const { data } = ctx.getImageData(x - tolerance, y - tolerance, size, size);\n\n // Split image data - for tolerance > 1, pixelDataSize = 4;\n for (let i = 3; i < data.length; i += 4) {\n const alphaChannel = data[i];\n if (alphaChannel > 0) {\n return false;\n }\n }\n return true;\n};\n","import type { XY } from '../../../Point';\nimport { Point } from '../../../Point';\nimport { degreesToRadians } from '../radiansDegreesConversion';\nimport { createVector } from '../vectors';\nimport type { TProjectStrokeOnPointsOptions, TProjection } from './types';\n\n/**\n * @see https://github.com/fabricjs/fabric.js/pull/8344\n * @todo consider removing skewing from points before calculating stroke projection,\n * see https://github.com/fabricjs/fabric.js/commit/494a10ee2f8c2278ae9a55b20bf50cf6ee25b064#commitcomment-94751537\n */\nexport abstract class StrokeProjectionsBase {\n declare options: TProjectStrokeOnPointsOptions;\n declare scale: Point;\n declare strokeUniformScalar: Point;\n declare strokeProjectionMagnitude: number;\n\n constructor(options: TProjectStrokeOnPointsOptions) {\n this.options = options;\n this.strokeProjectionMagnitude = this.options.strokeWidth / 2;\n this.scale = new Point(this.options.scaleX, this.options.scaleY);\n this.strokeUniformScalar = this.options.strokeUniform\n ? new Point(1 / this.options.scaleX, 1 / this.options.scaleY)\n : new Point(1, 1);\n }\n\n /**\n * When the stroke is uniform, scaling affects the arrangement of points. So we must take it into account.\n */\n protected createSideVector(from: XY, to: XY) {\n const v = createVector(from, to);\n return this.options.strokeUniform ? v.multiply(this.scale) : v;\n }\n\n protected abstract calcOrthogonalProjection(\n from: Point,\n to: Point,\n magnitude?: number,\n ): Point;\n\n protected projectOrthogonally(from: Point, to: Point, magnitude?: number) {\n return this.applySkew(\n from.add(this.calcOrthogonalProjection(from, to, magnitude)),\n );\n }\n\n protected isSkewed() {\n return this.options.skewX !== 0 || this.options.skewY !== 0;\n }\n\n protected applySkew(point: Point) {\n const p = new Point(point);\n // skewY must be applied before skewX as this distortion affects skewX calculation\n p.y += p.x * Math.tan(degreesToRadians(this.options.skewY));\n p.x += p.y * Math.tan(degreesToRadians(this.options.skewX));\n return p;\n }\n\n protected scaleUnitVector(unitVector: Point, scalar: number) {\n return unitVector.multiply(this.strokeUniformScalar).scalarMultiply(scalar);\n }\n\n protected abstract projectPoints(): Point[];\n\n public abstract project(): TProjection[];\n}\n","import type { XY } from '../../../Point';\nimport { Point } from '../../../Point';\nimport { halfPI, twoMathPi } from '../../../constants';\nimport type { TRadian } from '../../../typedefs';\nimport { degreesToRadians } from '../radiansDegreesConversion';\nimport {\n calcAngleBetweenVectors,\n calcVectorRotation,\n crossProduct,\n getOrthonormalVector,\n getUnitVector,\n isBetweenVectors,\n magnitude,\n rotateVector,\n} from '../vectors';\nimport { StrokeProjectionsBase } from './StrokeProjectionsBase';\nimport type { TProjection, TProjectStrokeOnPointsOptions } from './types';\n\nconst zeroVector = new Point();\n\n/**\n * class in charge of finding projections for each type of line join\n * @see {@link [Closed path projections at #8344](https://github.com/fabricjs/fabric.js/pull/8344#2-closed-path)}\n *\n * - MDN:\n * - https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/lineJoin\n * - https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/stroke-linejoin\n * - Spec: https://svgwg.org/svg2-draft/painting.html#StrokeLinejoinProperty\n * - Playground to understand how the line joins works: https://hypertolosana.github.io/efficient-webgl-stroking/index.html\n * - View the calculated projections for each of the control points: https://codesandbox.io/s/project-stroke-points-with-context-to-trace-b8jc4j?file=/src/index.js\n *\n */\nexport class StrokeLineJoinProjections extends StrokeProjectionsBase {\n /**\n * The point being projected (the angle ∠BAC)\n */\n declare A: Point;\n /**\n * The point before A\n */\n declare B: Point;\n /**\n * The point after A\n */\n declare C: Point;\n /**\n * The AB vector\n */\n AB: Point;\n /**\n * The AC vector\n */\n AC: Point;\n /**\n * The angle of A (∠BAC)\n */\n alpha: TRadian;\n /**\n * The bisector of A (∠BAC)\n */\n bisector: Point;\n\n static getOrthogonalRotationFactor(vector1: Point, vector2?: Point) {\n const angle = vector2\n ? calcAngleBetweenVectors(vector1, vector2)\n : calcVectorRotation(vector1);\n return Math.abs(angle) < halfPI ? -1 : 1;\n }\n\n constructor(A: XY, B: XY, C: XY, options: TProjectStrokeOnPointsOptions) {\n super(options);\n this.A = new Point(A);\n this.B = new Point(B);\n this.C = new Point(C);\n this.AB = this.createSideVector(this.A, this.B);\n this.AC = this.createSideVector(this.A, this.C);\n this.alpha = calcAngleBetweenVectors(this.AB, this.AC);\n this.bisector = getUnitVector(\n // if AC is also the zero vector nothing will be projected\n // in that case the next point will handle the projection\n rotateVector(this.AB.eq(zeroVector) ? this.AC : this.AB, this.alpha / 2),\n );\n }\n\n calcOrthogonalProjection(\n from: Point,\n to: Point,\n magnitude: number = this.strokeProjectionMagnitude,\n ) {\n const vector = this.createSideVector(from, to);\n const orthogonalProjection = getOrthonormalVector(vector);\n const correctSide = StrokeLineJoinProjections.getOrthogonalRotationFactor(\n orthogonalProjection,\n this.bisector,\n );\n return this.scaleUnitVector(orthogonalProjection, magnitude * correctSide);\n }\n\n /**\n * BEVEL\n * Calculation: the projection points are formed by the vector orthogonal to the vertex.\n *\n * @see https://github.com/fabricjs/fabric.js/pull/8344#2-2-bevel\n */\n projectBevel() {\n const projections: Point[] = [];\n // if `alpha` equals 0 or 2*PI, the projections are the same for `B` and `C`\n (this.alpha % twoMathPi === 0 ? [this.B] : [this.B, this.C]).forEach(\n (to) => {\n projections.push(this.projectOrthogonally(this.A, to));\n projections.push(\n this.projectOrthogonally(this.A, to, -this.strokeProjectionMagnitude),\n );\n },\n );\n return projections;\n }\n\n /**\n * MITER\n * Calculation: the corner is formed by extending the outer edges of the stroke\n * at the tangents of the path segments until they intersect.\n *\n * @see https://github.com/fabricjs/fabric.js/pull/8344#2-1-miter\n */\n projectMiter() {\n const projections: Point[] = [],\n alpha = Math.abs(this.alpha),\n hypotUnitScalar = 1 / Math.sin(alpha / 2),\n miterVector = this.scaleUnitVector(\n this.bisector,\n -this.strokeProjectionMagnitude * hypotUnitScalar,\n );\n\n // When two line segments meet at a sharp angle, it is possible for the join to extend,\n // far beyond the thickness of the line stroking the path. The stroke-miterlimit imposes\n // a limit on the extent of the line join.\n // MDN: https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/stroke-miterlimit\n // When the stroke is uniform, scaling changes the arrangement of points, this changes the miter-limit\n const strokeMiterLimit = this.options.strokeUniform\n ? magnitude(\n this.scaleUnitVector(this.bisector, this.options.strokeMiterLimit),\n )\n : this.options.strokeMiterLimit;\n\n if (\n magnitude(miterVector) / this.strokeProjectionMagnitude <=\n strokeMiterLimit\n ) {\n projections.push(this.applySkew(this.A.add(miterVector)));\n }\n /* when the miter-limit is reached, the stroke line join becomes of type bevel.\n We always need two orthogonal projections which are basically bevel-type projections,\n so regardless of whether the miter-limit was reached or not, we include these projections.\n */\n projections.push(...this.projectBevel());\n\n return projections;\n }\n\n /**\n * ROUND (without skew)\n * Calculation: the projections are the two vectors parallel to X and Y axes\n *\n * @see https://github.com/fabricjs/fabric.js/pull/8344#2-3-1-round-without-skew\n */\n private projectRoundNoSkew(startCircle: Point, endCircle: Point) {\n const projections: Point[] = [],\n // correctSide is used to only consider projecting for the outer side\n correctSide = new Point(\n StrokeLineJoinProjections.getOrthogonalRotationFactor(this.bisector),\n StrokeLineJoinProjections.getOrthogonalRotationFactor(\n new Point(this.bisector.y, this.bisector.x),\n ),\n ),\n radiusOnAxisX = new Point(1, 0)\n .scalarMultiply(this.strokeProjectionMagnitude)\n .multiply(this.strokeUniformScalar)\n .multiply(correctSide),\n radiusOnAxisY = new Point(0, 1)\n .scalarMultiply(this.strokeProjectionMagnitude)\n .multiply(this.strokeUniformScalar)\n .multiply(correctSide);\n\n [radiusOnAxisX, radiusOnAxisY].forEach((vector) => {\n if (isBetweenVectors(vector, startCircle, endCircle)) {\n projections.push(this.A.add(vector));\n }\n });\n return projections;\n }\n\n /**\n * ROUND (with skew)\n * Calculation: the projections are the points furthest from the vertex in\n * the direction of the X and Y axes after distortion.\n *\n * @see https://github.com/fabricjs/fabric.js/pull/8344#2-3-2-round-skew\n */\n private projectRoundWithSkew(startCircle: Point, endCircle: Point) {\n const projections: Point[] = [];\n\n const { skewX, skewY, scaleX, scaleY, strokeUniform } = this.options,\n shearing = new Point(\n Math.tan(degreesToRadians(skewX)),\n Math.tan(degreesToRadians(skewY)),\n );\n // The points furthest from the vertex in the direction of the X and Y axes after distortion\n const circleRadius = this.strokeProjectionMagnitude,\n newY = strokeUniform\n ? circleRadius /\n scaleY /\n Math.sqrt(1 / scaleY ** 2 + (1 / scaleX ** 2) * shearing.y ** 2)\n : circleRadius / Math.sqrt(1 + shearing.y ** 2),\n furthestY = new Point(\n // Safe guard due to floating point precision. In some situations the square root\n // was returning NaN because of a negative number close to zero.\n Math.sqrt(Math.max(circleRadius ** 2 - newY ** 2, 0)),\n newY,\n ),\n newX = strokeUniform\n ? circleRadius /\n Math.sqrt(\n 1 +\n (shearing.x ** 2 * (1 / scaleY) ** 2) /\n (1 / scaleX + (1 / scaleX) * shearing.x * shearing.y) ** 2,\n )\n : circleRadius /\n Math.sqrt(1 + shearing.x ** 2 / (1 + shearing.x * shearing.y) ** 2),\n furthestX = new Point(\n newX,\n Math.sqrt(Math.max(circleRadius ** 2 - newX ** 2, 0)),\n );\n\n [\n furthestX,\n furthestX.scalarMultiply(-1),\n furthestY,\n furthestY.scalarMultiply(-1),\n ]\n // We need to skew the vector here as this information is used to check if\n // it is between the start and end of the circle segment\n .map((vector) =>\n this.applySkew(\n strokeUniform ? vector.multiply(this.strokeUniformScalar) : vector,\n ),\n )\n .forEach((vector) => {\n if (isBetweenVectors(vector, startCircle, endCircle)) {\n projections.push(this.applySkew(this.A).add(vector));\n }\n });\n\n return projections;\n }\n\n projectRound() {\n const projections: Point[] = [];\n /* Include the start and end points of the circle segment, so that only\n the projections contained within it are included */\n // add the orthogonal projections (start and end points of circle segment)\n projections.push(...this.projectBevel());\n // let's determines which one of the orthogonal projection is the beginning and end of the circle segment.\n // when `alpha` equals 0 or 2*PI, we have a straight line, so the way to find the start/end is different.\n const isStraightLine = this.alpha % twoMathPi === 0,\n // change the origin of the projections to point A\n // so that the cross product calculation is correct\n newOrigin = this.applySkew(this.A),\n proj0 = projections[isStraightLine ? 0 : 2].subtract(newOrigin),\n proj1 = projections[isStraightLine ? 1 : 0].subtract(newOrigin),\n // when `isStraightLine` === true, we compare with the vector opposite AB, otherwise we compare with the bisector.\n comparisonVector = isStraightLine\n ? this.applySkew(this.AB.scalarMultiply(-1))\n : this.applySkew(\n this.bisector.multiply(this.strokeUniformScalar).scalarMultiply(-1),\n ),\n // the beginning of the circle segment is always to the right of the comparison vector (cross product > 0)\n isProj0Start = crossProduct(proj0, comparisonVector) > 0,\n startCircle = isProj0Start ? proj0 : proj1,\n endCircle = isProj0Start ? proj1 : proj0;\n if (!this.isSkewed()) {\n projections.push(...this.projectRoundNoSkew(startCircle, endCircle));\n } else {\n projections.push(...this.projectRoundWithSkew(startCircle, endCircle));\n }\n return projections;\n }\n\n /**\n * Project stroke width on points returning projections for each point as follows:\n * - `miter`: 1 point corresponding to the outer boundary. If the miter limit is exceeded, it will be 2 points (becomes bevel)\n * - `bevel`: 2 points corresponding to the bevel possible boundaries, orthogonal to the stroke.\n * - `round`: same as `bevel` when it has no skew, with skew are 4 points.\n */\n protected projectPoints() {\n switch (this.options.strokeLineJoin) {\n case 'miter':\n return this.projectMiter();\n case 'round':\n return this.projectRound();\n default:\n return this.projectBevel();\n }\n }\n\n public project(): TProjection[] {\n return this.projectPoints().map((point) => ({\n originPoint: this.A,\n projectedPoint: point,\n angle: this.alpha,\n bisector: this.bisector,\n }));\n }\n}\n","import type { XY } from '../../../Point';\nimport { Point } from '../../../Point';\nimport { getOrthonormalVector, getUnitVector } from '../vectors';\nimport { StrokeLineJoinProjections } from './StrokeLineJoinProjections';\nimport { StrokeProjectionsBase } from './StrokeProjectionsBase';\nimport type { TProjection, TProjectStrokeOnPointsOptions } from './types';\n\n/**\n * class in charge of finding projections for each type of line cap for start/end of an open path\n * @see {@link [Open path projections at #8344](https://github.com/fabricjs/fabric.js/pull/8344#1-open-path)}\n *\n * Reference:\n * - MDN:\n * - https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/lineCap\n * - https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/stroke-linecap\n * - Spec: https://html.spec.whatwg.org/multipage/canvas.html#dom-context-2d-linecap-dev\n * - Playground to understand how the line joins works: https://hypertolosana.github.io/efficient-webgl-stroking/index.html\n * - View the calculated projections for each of the control points: https://codesandbox.io/s/project-stroke-points-with-context-to-trace-b8jc4j?file=/src/index.js\n */\nexport class StrokeLineCapProjections extends StrokeProjectionsBase {\n /**\n * edge point\n */\n declare A: Point;\n /**\n * point next to edge point\n */\n declare T: Point;\n\n constructor(A: XY, T: XY, options: TProjectStrokeOnPointsOptions) {\n super(options);\n this.A = new Point(A);\n this.T = new Point(T);\n }\n\n calcOrthogonalProjection(\n from: Point,\n to: Point,\n magnitude: number = this.strokeProjectionMagnitude,\n ) {\n const vector = this.createSideVector(from, to);\n return this.scaleUnitVector(getOrthonormalVector(vector), magnitude);\n }\n\n /**\n * OPEN PATH START/END - Line cap: Butt\n * Calculation: to find the projections, just find the points orthogonal to the stroke\n *\n * @see https://github.com/fabricjs/fabric.js/pull/8344#1-1-butt\n */\n projectButt() {\n return [\n this.projectOrthogonally(this.A, this.T, this.strokeProjectionMagnitude),\n this.projectOrthogonally(this.A, this.T, -this.strokeProjectionMagnitude),\n ];\n }\n\n /**\n * OPEN PATH START/END - Line cap: Round\n * Calculation: same as stroke line join `round`\n *\n * @see https://github.com/fabricjs/fabric.js/pull/8344#1-2-round\n */\n projectRound() {\n const projections: Point[] = [];\n\n if (!this.isSkewed() && this.A.eq(this.T)) {\n /* 1 point case without `skew`\n When `strokeUniform` is true, scaling has no effect.\n So we divide by scale, to remove its effect.\n */\n const projection = new Point(1, 1)\n .scalarMultiply(this.strokeProjectionMagnitude)\n .multiply(this.strokeUniformScalar);\n projections.push(\n this.applySkew(this.A.add(projection)),\n this.applySkew(this.A.subtract(projection)),\n );\n } else {\n projections.push(\n ...new StrokeLineJoinProjections(\n this.A,\n this.T,\n this.T,\n this.options,\n ).projectRound(),\n );\n }\n\n return projections;\n }\n\n /**\n * OPEN PATH START/END - Line cap: Square\n * Calculation: project a rectangle of points on the stroke in the opposite direction of the vector `AT`\n *\n * @see https://github.com/fabricjs/fabric.js/pull/8344#1-3-square\n */\n projectSquare() {\n const projections: Point[] = [];\n\n if (this.A.eq(this.T)) {\n /* 1 point case without `skew`\n When `strokeUniform` is true, scaling has no effect.\n So we divide by scale, to remove its effect.\n */\n const projection = new Point(1, 1)\n .scalarMultiply(this.strokeProjectionMagnitude)\n .multiply(this.strokeUniformScalar);\n projections.push(this.A.add(projection), this.A.subtract(projection));\n } else {\n const orthogonalProjection = this.calcOrthogonalProjection(\n this.A,\n this.T,\n this.strokeProjectionMagnitude,\n );\n const strokePointingOut = this.scaleUnitVector(\n getUnitVector(this.createSideVector(this.A, this.T)),\n -this.strokeProjectionMagnitude,\n );\n const projectedA = this.A.add(strokePointingOut);\n projections.push(\n projectedA.add(orthogonalProjection),\n projectedA.subtract(orthogonalProjection),\n );\n }\n\n return projections.map((p) => this.applySkew(p));\n }\n\n protected projectPoints() {\n switch (this.options.strokeLineCap) {\n case 'round':\n return this.projectRound();\n case 'square':\n return this.projectSquare();\n default:\n return this.projectButt();\n }\n }\n\n public project(): TProjection[] {\n return this.projectPoints().map((point) => ({\n originPoint: this.A,\n projectedPoint: point,\n }));\n }\n}\n","import { Point, type XY } from '../../../Point';\nimport { findIndexRight } from '../../internals/findRight';\nimport { StrokeLineCapProjections } from './StrokeLineCapProjections';\nimport { StrokeLineJoinProjections } from './StrokeLineJoinProjections';\nimport type { TProjection, TProjectStrokeOnPointsOptions } from './types';\n\nexport type * from './types';\n\n/**\n *\n * Used to calculate object's bounding box\n *\n * @see https://github.com/fabricjs/fabric.js/pull/8344\n *\n */\nexport const projectStrokeOnPoints = (\n points: XY[],\n options: TProjectStrokeOnPointsOptions,\n openPath = false,\n): TProjection[] => {\n const projections: TProjection[] = [];\n\n if (points.length === 0) {\n return projections;\n }\n\n // first we remove duplicate neighboring points\n const reduced = points.reduce(\n (reduced, point) => {\n if (!reduced[reduced.length - 1].eq(point)) {\n reduced.push(new Point(point));\n }\n return reduced;\n },\n [new Point(points[0])],\n );\n\n if (reduced.length === 1) {\n openPath = true;\n } else if (!openPath) {\n // remove points from end in case they equal the first point\n // in order to correctly project the first point\n const start = reduced[0];\n const index = findIndexRight(reduced, (point) => !point.eq(start));\n reduced.splice(index + 1);\n }\n\n reduced.forEach((A, index, points) => {\n let B: XY, C: XY;\n if (index === 0) {\n C = points[1];\n B = openPath ? A : points[points.length - 1];\n } else if (index === points.length - 1) {\n B = points[index - 1];\n C = openPath ? A : points[0];\n } else {\n B = points[index - 1];\n C = points[index + 1];\n }\n\n if (openPath && points.length === 1) {\n projections.push(\n ...new StrokeLineCapProjections(A, A, options).project(),\n );\n } else if (openPath && (index === 0 || index === points.length - 1)) {\n projections.push(\n ...new StrokeLineCapProjections(\n A,\n index === 0 ? C : B,\n options,\n ).project(),\n );\n } else {\n projections.push(\n ...new StrokeLineJoinProjections(A, B, C, options).project(),\n );\n }\n });\n\n return projections;\n};\n","export const findIndexRight = (\n array: T[],\n predicate: (value: T, index: number, array: T[]) => boolean,\n) => {\n for (let index = array.length - 1; index >= 0; index--) {\n if (predicate(array[index], index, array)) {\n return index;\n }\n }\n return -1;\n};\n","import type { TextStyle } from '../../shapes/Text/StyledText';\n\nexport const cloneStyles = (style: TextStyle): TextStyle => {\n const newObj: TextStyle = {};\n Object.keys(style).forEach((key) => {\n newObj[key] = {};\n Object.keys(style[key]).forEach((keyInner) => {\n newObj[key][keyInner] = { ...style[key][keyInner] };\n });\n });\n return newObj;\n};\n","import { getFabricWindow } from '../env';\n\n/**\n * Capitalizes a string\n * @param {String} string String to capitalize\n * @param {Boolean} [firstLetterOnly] If true only first letter is capitalized\n * and other letters stay untouched, if false first letter is capitalized\n * and other letters are converted to lowercase.\n * @return {String} Capitalized version of a string\n */\nexport const capitalize = (string: string, firstLetterOnly = false): string =>\n `${string.charAt(0).toUpperCase()}${\n firstLetterOnly ? string.slice(1) : string.slice(1).toLowerCase()\n }`;\n\n/**\n * Escapes XML in a string\n * @param {String} string String to escape\n * @return {String} Escaped version of a string\n */\nexport const escapeXml = (string: string): string =>\n string\n .replace(/&/g, '&')\n .replace(/\"/g, '"')\n .replace(/'/g, ''')\n .replace(//g, '>');\n\nlet segmenter: Intl.Segmenter | false;\n\nconst getSegmenter = () => {\n if (!segmenter) {\n segmenter =\n 'Intl' in getFabricWindow() &&\n 'Segmenter' in Intl &&\n new Intl.Segmenter(undefined, {\n granularity: 'grapheme',\n });\n }\n return segmenter;\n};\n\n/**\n * Divide a string in the user perceived single units\n * @param {String} textstring String to escape\n * @return {Array} array containing the graphemes\n */\nexport const graphemeSplit = (textstring: string): string[] => {\n segmenter || getSegmenter();\n if (segmenter) {\n const segments = segmenter.segment(textstring);\n return Array.from(segments).map(({ segment }) => segment);\n }\n\n //Fallback\n return graphemeSplitImpl(textstring);\n};\n\nconst graphemeSplitImpl = (textstring: string): string[] => {\n const graphemes: string[] = [];\n for (let i = 0, chr; i < textstring.length; i++) {\n if ((chr = getWholeChar(textstring, i)) === false) {\n continue;\n }\n graphemes.push(chr);\n }\n return graphemes;\n};\n\n// taken from mdn in the charAt doc page.\nconst getWholeChar = (str: string, i: number): string | false => {\n const code = str.charCodeAt(i);\n if (isNaN(code)) {\n return ''; // Position not found\n }\n if (code < 0xd800 || code > 0xdfff) {\n return str.charAt(i);\n }\n\n // High surrogate (could change last hex to 0xDB7F to treat high private\n // surrogates as single characters)\n if (0xd800 <= code && code <= 0xdbff) {\n if (str.length <= i + 1) {\n throw 'High surrogate without following low surrogate';\n }\n const next = str.charCodeAt(i + 1);\n if (0xdc00 > next || next > 0xdfff) {\n throw 'High surrogate without following low surrogate';\n }\n return str.charAt(i) + str.charAt(i + 1);\n }\n // Low surrogate (0xDC00 <= code && code <= 0xDFFF)\n if (i === 0) {\n throw 'Low surrogate without preceding high surrogate';\n }\n const prev = str.charCodeAt(i - 1);\n\n // (could change last hex to 0xDB7F to treat high private\n // surrogates as single characters)\n if (0xd800 > prev || prev > 0xdbff) {\n throw 'Low surrogate without preceding high surrogate';\n }\n // We can pass over low surrogates now as the second component\n // in a pair which we have already processed\n return false;\n};\n","import { reNewline } from '../../constants';\nimport type {\n TextStyle,\n TextStyleDeclaration,\n} from '../../shapes/Text/StyledText';\nimport { cloneStyles } from '../internals/cloneStyles';\nimport { graphemeSplit } from '../lang_string';\n\nexport type TextStyleArray = {\n start: number;\n end: number;\n style: TextStyleDeclaration;\n}[];\n\n/**\n * @param {Object} prevStyle first style to compare\n * @param {Object} thisStyle second style to compare\n * @param {boolean} forTextSpans whether to check overline, underline, and line-through properties\n * @return {boolean} true if the style changed\n */\nexport const hasStyleChanged = (\n prevStyle: TextStyleDeclaration,\n thisStyle: TextStyleDeclaration,\n forTextSpans = false,\n) =>\n prevStyle.fill !== thisStyle.fill ||\n prevStyle.stroke !== thisStyle.stroke ||\n prevStyle.strokeWidth !== thisStyle.strokeWidth ||\n prevStyle.fontSize !== thisStyle.fontSize ||\n prevStyle.fontFamily !== thisStyle.fontFamily ||\n prevStyle.fontWeight !== thisStyle.fontWeight ||\n prevStyle.fontStyle !== thisStyle.fontStyle ||\n prevStyle.textDecorationThickness !== thisStyle.textDecorationThickness ||\n prevStyle.textBackgroundColor !== thisStyle.textBackgroundColor ||\n prevStyle.deltaY !== thisStyle.deltaY ||\n (forTextSpans &&\n (prevStyle.overline !== thisStyle.overline ||\n prevStyle.underline !== thisStyle.underline ||\n prevStyle.linethrough !== thisStyle.linethrough));\n\n/**\n * Returns the array form of a text object's inline styles property with styles grouped in ranges\n * rather than per character. This format is less verbose, and is better suited for storage\n * so it is used in serialization (not during runtime).\n * @param {object} styles per character styles for a text object\n * @param {String} text the text string that the styles are applied to\n * @return {{start: number, end: number, style: object}[]}\n */\nexport const stylesToArray = (\n styles: TextStyle,\n text: string,\n): TextStyleArray => {\n const textLines = text.split('\\n'),\n stylesArray = [];\n let charIndex = -1,\n prevStyle = {};\n // clone style structure to prevent mutation\n styles = cloneStyles(styles);\n\n //loop through each textLine\n for (let i = 0; i < textLines.length; i++) {\n const chars = graphemeSplit(textLines[i]);\n if (!styles[i]) {\n //no styles exist for this line, so add the line's length to the charIndex total and reset prevStyle\n charIndex += chars.length;\n prevStyle = {};\n continue;\n }\n //loop through each character of the current line\n for (let c = 0; c < chars.length; c++) {\n charIndex++;\n const thisStyle = styles[i][c];\n //check if style exists for this character\n if (thisStyle && Object.keys(thisStyle).length > 0) {\n if (hasStyleChanged(prevStyle, thisStyle, true)) {\n stylesArray.push({\n start: charIndex,\n end: charIndex + 1,\n style: thisStyle,\n });\n } else {\n //if style is the same as previous character, increase end index\n stylesArray[stylesArray.length - 1].end++;\n }\n }\n prevStyle = thisStyle || {};\n }\n }\n return stylesArray;\n};\n\n/**\n * Returns the object form of the styles property with styles that are assigned per\n * character rather than grouped by range. This format is more verbose, and is\n * only used during runtime (not for serialization/storage)\n * @param {Array} styles the serialized form of a text object's styles\n * @param {String} text the text string that the styles are applied to\n * @return {Object}\n */\nexport const stylesFromArray = (\n styles: TextStyleArray | TextStyle,\n text: string,\n): TextStyle => {\n if (!Array.isArray(styles)) {\n // clone to prevent mutation\n return cloneStyles(styles);\n }\n const textLines = text.split(reNewline),\n stylesObject: TextStyle = {};\n let charIndex = -1,\n styleIndex = 0;\n //loop through each textLine\n for (let i = 0; i < textLines.length; i++) {\n const chars = graphemeSplit(textLines[i]);\n\n //loop through each character of the current line\n for (let c = 0; c < chars.length; c++) {\n charIndex++;\n //check if there's a style collection that includes the current character\n if (\n styles[styleIndex] &&\n styles[styleIndex].start <= charIndex &&\n charIndex < styles[styleIndex].end\n ) {\n //create object for line index if it doesn't exist\n stylesObject[i] = stylesObject[i] || {};\n //assign a style at this character's index\n stylesObject[i][c] = { ...styles[styleIndex].style };\n //if character is at the end of the current style collection, move to the next\n if (charIndex === styles[styleIndex].end - 1) {\n styleIndex++;\n }\n }\n }\n }\n return stylesObject;\n};\n","import { FILL, STROKE } from '../constants';\n\n/**\n * Attributes parsed from all SVG elements\n * @type array\n */\nexport const SHARED_ATTRIBUTES = [\n 'display',\n 'transform',\n FILL,\n 'fill-opacity',\n 'fill-rule',\n 'opacity',\n STROKE,\n 'stroke-dasharray',\n 'stroke-linecap',\n 'stroke-dashoffset',\n 'stroke-linejoin',\n 'stroke-miterlimit',\n 'stroke-opacity',\n 'stroke-width',\n 'id',\n 'paint-order',\n 'vector-effect',\n 'instantiated_by_use',\n 'clip-path',\n];\n","export function selectorMatches(\n element: HTMLElement | SVGElement,\n selector: string,\n) {\n const nodeName = element.nodeName;\n const classNames = element.getAttribute('class');\n const id = element.getAttribute('id');\n const azAz = '(?![a-zA-Z\\\\-]+)';\n let matcher;\n // i check if a selector matches slicing away part from it.\n // if i get empty string i should match\n matcher = new RegExp('^' + nodeName, 'i');\n selector = selector.replace(matcher, '');\n if (id && selector.length) {\n matcher = new RegExp('#' + id + azAz, 'i');\n selector = selector.replace(matcher, '');\n }\n if (classNames && selector.length) {\n const splitClassNames = classNames.split(' ');\n for (let i = splitClassNames.length; i--; ) {\n matcher = new RegExp('\\\\.' + splitClassNames[i] + azAz, 'i');\n selector = selector.replace(matcher, '');\n }\n }\n return selector.length === 0;\n}\n","import { selectorMatches } from './selectorMatches';\nimport { doesSomeParentMatch } from './doesSomeParentMatch';\n\n/**\n * @private\n */\n\nexport function elementMatchesRule(\n element: HTMLElement | SVGElement,\n selectors: string[],\n) {\n let parentMatching = true;\n // start from rightmost selector.\n const firstMatching = selectorMatches(element, selectors.pop()!);\n if (firstMatching && selectors.length) {\n parentMatching = doesSomeParentMatch(element, selectors);\n }\n return firstMatching && parentMatching && selectors.length === 0;\n}\n","import { selectorMatches } from './selectorMatches';\n\nexport function doesSomeParentMatch(\n element: HTMLElement | SVGElement,\n selectors: string[],\n) {\n let selector: string,\n parentMatching = true;\n while (\n element.parentElement &&\n element.parentElement.nodeType === 1 &&\n selectors.length\n ) {\n if (parentMatching) {\n selector = selectors.pop()!;\n }\n element = element.parentElement;\n parentMatching = selectorMatches(element, selector!);\n }\n return selectors.length === 0;\n}\n","import { elementMatchesRule } from './elementMatchesRule';\nimport type { CSSRules } from './typedefs';\n\n/**\n * @private\n */\n\nexport function getGlobalStylesForElement(\n element: HTMLElement | SVGElement,\n cssRules: CSSRules = {},\n) {\n let styles: Record = {};\n for (const rule in cssRules) {\n if (elementMatchesRule(element, rule.split(' '))) {\n styles = {\n ...styles,\n ...cssRules[rule],\n };\n }\n }\n return styles;\n}\n","import { attributesMap } from './constants';\n\nexport const normalizeAttr = (\n attr: keyof typeof attributesMap | string,\n): string => attributesMap[attr as keyof typeof attributesMap] ?? attr;\n","import { reNum } from '../../parser/constants';\n\nconst regex = new RegExp(`(${reNum})`, 'gi');\n\nexport const cleanupSvgAttribute = (attributeValue: string) =>\n attributeValue\n .replace(regex, ' $1 ')\n // replace annoying commas and arbitrary whitespace with single spaces\n .replace(/,/gi, ' ')\n .replace(/\\s+/gi, ' ');\n","import { ROTATE, SCALE, SKEW_X, SKEW_Y, iMatrix } from '../constants';\nimport { reNum } from './constants';\nimport type { TMat2D } from '../typedefs';\nimport { cleanupSvgAttribute } from '../util/internals/cleanupSvgAttribute';\nimport {\n createRotateMatrix,\n createScaleMatrix,\n createSkewXMatrix,\n createSkewYMatrix,\n createTranslateMatrix,\n multiplyTransformMatrixArray,\n} from '../util/misc/matrix';\n\n// == begin transform regexp\nconst p = `(${reNum})`;\nconst skewX = String.raw`(skewX)\\(${p}\\)`;\nconst skewY = String.raw`(skewY)\\(${p}\\)`;\nconst rotate = String.raw`(rotate)\\(${p}(?: ${p} ${p})?\\)`;\nconst scale = String.raw`(scale)\\(${p}(?: ${p})?\\)`;\nconst translate = String.raw`(translate)\\(${p}(?: ${p})?\\)`;\nconst matrix = String.raw`(matrix)\\(${p} ${p} ${p} ${p} ${p} ${p}\\)`;\nconst transform = `(?:${matrix}|${translate}|${rotate}|${scale}|${skewX}|${skewY})`;\nconst transforms = `(?:${transform}*)`;\nconst transformList = String.raw`^\\s*(?:${transforms}?)\\s*$`;\n// http://www.w3.org/TR/SVG/coords.html#TransformAttribute\nconst reTransformList = new RegExp(transformList);\nconst reTransform = new RegExp(transform);\nconst reTransformAll = new RegExp(transform, 'g');\n// == end transform regexp\n\n/**\n * Parses \"transform\" attribute, returning an array of values\n * @static\n * @function\n * @param {String} attributeValue String containing attribute value\n * @return {TTransformMatrix} Array of 6 elements representing transformation matrix\n */\nexport function parseTransformAttribute(attributeValue: string): TMat2D {\n // first we clean the string\n attributeValue = cleanupSvgAttribute(attributeValue)\n // remove spaces around front parentheses\n .replace(/\\s*([()])\\s*/gi, '$1');\n\n // start with identity matrix\n const matrices: TMat2D[] = [];\n\n // return if no argument was given or\n // an argument does not match transform attribute regexp\n if (\n !attributeValue ||\n (attributeValue && !reTransformList.test(attributeValue))\n ) {\n return [...iMatrix];\n }\n\n for (const match of attributeValue.matchAll(reTransformAll)) {\n const transformMatch = reTransform.exec(match[0]);\n if (!transformMatch) {\n continue;\n }\n let matrix: TMat2D = iMatrix;\n const matchedParams = transformMatch.filter((m) => !!m);\n const [, operation, ...rawArgs] = matchedParams;\n const [arg0, arg1, arg2, arg3, arg4, arg5] = rawArgs.map((arg) =>\n parseFloat(arg),\n );\n\n switch (operation) {\n case 'translate':\n matrix = createTranslateMatrix(arg0, arg1);\n break;\n case ROTATE:\n matrix = createRotateMatrix({ angle: arg0 }, { x: arg1, y: arg2 });\n break;\n case SCALE:\n matrix = createScaleMatrix(arg0, arg1);\n break;\n case SKEW_X:\n matrix = createSkewXMatrix(arg0);\n break;\n case SKEW_Y:\n matrix = createSkewYMatrix(arg0);\n break;\n case 'matrix':\n matrix = [arg0, arg1, arg2, arg3, arg4, arg5];\n break;\n }\n\n // snapshot current matrix into matrices array\n matrices.push(matrix);\n }\n\n return multiplyTransformMatrixArray(matrices);\n}\n","import { multiplyTransformMatrices } from '../util/misc/matrix';\nimport { parseUnit } from '../util/misc/svgParsing';\nimport { parseTransformAttribute } from './parseTransformAttribute';\nimport { CENTER, LEFT, RIGHT, NONE, FILL, STROKE } from '../constants';\nimport { TEXT_DECORATION_THICKNESS } from '../shapes/Text/constants';\n\nexport function normalizeValue(\n attr: string,\n value: any,\n parentAttributes: Record,\n fontSize: number,\n): string | null | boolean | number[] | number {\n const isArray = Array.isArray(value);\n let parsed: number | number[];\n let ouputValue: string | null | boolean | number[] | number = value;\n if ((attr === FILL || attr === STROKE) && value === NONE) {\n ouputValue = '';\n } else if (attr === 'strokeUniform') {\n return value === 'non-scaling-stroke';\n } else if (attr === 'strokeDashArray') {\n if (value === NONE) {\n ouputValue = null;\n } else {\n ouputValue = value.replace(/,/g, ' ').split(/\\s+/).map(parseFloat);\n }\n } else if (attr === 'transformMatrix') {\n if (parentAttributes && parentAttributes.transformMatrix) {\n ouputValue = multiplyTransformMatrices(\n parentAttributes.transformMatrix,\n parseTransformAttribute(value),\n );\n } else {\n ouputValue = parseTransformAttribute(value);\n }\n } else if (attr === 'visible') {\n ouputValue = value !== NONE && value !== 'hidden';\n // display=none on parent element always takes precedence over child element\n if (parentAttributes && parentAttributes.visible === false) {\n ouputValue = false;\n }\n } else if (attr === 'opacity') {\n ouputValue = parseFloat(value);\n if (parentAttributes && typeof parentAttributes.opacity !== 'undefined') {\n ouputValue *= parentAttributes.opacity as number;\n }\n } else if (attr === 'textAnchor' /* text-anchor */) {\n ouputValue = value === 'start' ? LEFT : value === 'end' ? RIGHT : CENTER;\n } else if (attr === 'charSpacing' || attr === TEXT_DECORATION_THICKNESS) {\n // parseUnit returns px and we convert it to em\n parsed = (parseUnit(value, fontSize) / fontSize) * 1000;\n } else if (attr === 'paintFirst') {\n const fillIndex = value.indexOf(FILL);\n const strokeIndex = value.indexOf(STROKE);\n ouputValue = FILL;\n if (fillIndex > -1 && strokeIndex > -1 && strokeIndex < fillIndex) {\n ouputValue = STROKE;\n } else if (fillIndex === -1 && strokeIndex > -1) {\n ouputValue = STROKE;\n }\n } else if (\n attr === 'href' ||\n attr === 'xlink:href' ||\n attr === 'font' ||\n attr === 'id'\n ) {\n return value;\n } else if (attr === 'imageSmoothing') {\n return value === 'optimizeQuality';\n } else {\n parsed = isArray\n ? (value as string[]).map(parseUnit)\n : parseUnit(value, fontSize);\n }\n\n return !isArray && isNaN(parsed! as number) ? ouputValue : parsed!;\n}\n","/**\n * Takes a style string and parses it in one that has only defined values\n * and lowercases properties\n * @param style\n * @param oStyle\n */\nexport function parseStyleString(\n style: string,\n oStyle: Record,\n): void {\n style\n .replace(/;\\s*$/, '')\n .split(';')\n .forEach((chunk) => {\n if (!chunk) return;\n const [attr, value] = chunk.split(':');\n oStyle[attr.trim().toLowerCase()] = value.trim();\n });\n}\n","import { parseStyleObject } from './parseStyleObject';\nimport { parseStyleString } from './parseStyleString';\n\n/**\n * Parses \"style\" attribute, retuning an object with values\n * @static\n * @param {SVGElement} element Element to parse\n * @return {Object} Objects with values parsed from style attribute of an element\n */\nexport function parseStyleAttribute(\n element: HTMLElement | SVGElement,\n): Record {\n const oStyle: Record = {},\n style = element.getAttribute('style');\n\n if (!style) {\n return oStyle;\n }\n\n if (typeof style === 'string') {\n parseStyleString(style, oStyle);\n } else {\n parseStyleObject(style, oStyle);\n }\n\n return oStyle;\n}\n","/**\n * Takes a style object and parses it in one that has only defined values\n * and lowercases properties\n * @param style\n * @param oStyle\n */\nexport function parseStyleObject(\n style: Record,\n oStyle: Record,\n): void {\n Object.entries(style).forEach(([prop, value]) => {\n if (value === undefined) {\n return;\n }\n oStyle[prop.toLowerCase()] = value;\n });\n}\n","import { Color } from '../color/Color';\nimport { toFixed } from '../util/misc/toFixed';\nimport { FabricObject } from '../shapes/Object/FabricObject';\n\nconst colorAttributesMap = {\n stroke: 'strokeOpacity',\n fill: 'fillOpacity',\n};\n\n/**\n * @private\n * @param {Object} attributes Array of attributes to parse\n */\n\nexport function setStrokeFillOpacity(\n attributes: Record,\n): Record {\n const defaults = FabricObject.getDefaults();\n Object.entries(colorAttributesMap).forEach(([attr, colorAttr]) => {\n if (\n typeof attributes[colorAttr] === 'undefined' ||\n attributes[attr] === ''\n ) {\n return;\n }\n if (typeof attributes[attr] === 'undefined') {\n if (!defaults[attr]) {\n return;\n }\n attributes[attr] = defaults[attr];\n }\n if (attributes[attr].indexOf('url(') === 0) {\n return;\n }\n const color = new Color(attributes[attr]);\n attributes[attr] = color\n .setAlpha(toFixed(color.getAlpha() * attributes[colorAttr], 2))\n .toRgba();\n });\n return attributes;\n}\n","import { DEFAULT_SVG_FONT_SIZE } from '../constants';\nimport { parseUnit } from '../util/misc/svgParsing';\nimport { cPath, fSize, svgValidParentsRegEx } from './constants';\nimport { getGlobalStylesForElement } from './getGlobalStylesForElement';\nimport { normalizeAttr } from './normalizeAttr';\nimport { normalizeValue } from './normalizeValue';\nimport { parseFontDeclaration } from './parseFontDeclaration';\nimport { parseStyleAttribute } from './parseStyleAttribute';\nimport { setStrokeFillOpacity } from './setStrokeFillOpacity';\nimport type { CSSRules } from './typedefs';\n\n/**\n * Returns an object of attributes' name/value, given element and an array of attribute names;\n * Parses parent \"g\" nodes recursively upwards.\n * @param {SVGElement | HTMLElement} element Element to parse\n * @param {Array} attributes Array of attributes to parse\n * @return {Object} object containing parsed attributes' names/values\n */\nexport function parseAttributes(\n element: HTMLElement | SVGElement | null,\n attributes: string[],\n cssRules?: CSSRules,\n): Record {\n if (!element) {\n return {};\n }\n\n let parentAttributes: Record = {},\n fontSize: number,\n parentFontSize = DEFAULT_SVG_FONT_SIZE;\n\n // if there's a parent container (`g` or `a` or `symbol` node), parse its attributes recursively upwards\n if (\n element.parentNode &&\n svgValidParentsRegEx.test(element.parentNode.nodeName)\n ) {\n parentAttributes = parseAttributes(\n element.parentElement,\n attributes,\n cssRules,\n );\n if (parentAttributes.fontSize) {\n fontSize = parentFontSize = parseUnit(parentAttributes.fontSize);\n }\n }\n\n const ownAttributes: Record = {\n ...attributes.reduce>((memo, attr) => {\n const value = element.getAttribute(attr);\n if (value) {\n memo[attr] = value;\n }\n return memo;\n }, {}),\n // add values parsed from style, which take precedence over attributes\n // (see: http://www.w3.org/TR/SVG/styling.html#UsingPresentationAttributes)\n ...getGlobalStylesForElement(element, cssRules),\n ...parseStyleAttribute(element),\n };\n\n if (ownAttributes[cPath]) {\n element.setAttribute(cPath, ownAttributes[cPath]);\n }\n if (ownAttributes[fSize]) {\n // looks like the minimum should be 9px when dealing with ems. this is what looks like in browsers.\n fontSize = parseUnit(ownAttributes[fSize], parentFontSize);\n ownAttributes[fSize] = `${fontSize}`;\n }\n\n // this should have its own complex type\n const normalizedStyle: Record<\n string,\n string | boolean | number | number[] | null\n > = {};\n for (const attr in ownAttributes) {\n const normalizedAttr = normalizeAttr(attr);\n const normalizedValue = normalizeValue(\n normalizedAttr,\n ownAttributes[attr],\n parentAttributes,\n fontSize!,\n );\n normalizedStyle[normalizedAttr] = normalizedValue;\n }\n if (normalizedStyle && normalizedStyle.font) {\n parseFontDeclaration(normalizedStyle.font as string, normalizedStyle);\n }\n const mergedAttrs = { ...parentAttributes, ...normalizedStyle };\n return svgValidParentsRegEx.test(element.nodeName)\n ? mergedAttrs\n : setStrokeFillOpacity(mergedAttrs);\n}\n","import { parseUnit } from '../util/misc/svgParsing';\nimport { reFontDeclaration } from './constants';\n\n/**\n * Parses a short font declaration, building adding its properties to a style object\n * @static\n * @function\n * @param {String} value font declaration\n * @param {Object} oStyle definition\n */\nexport function parseFontDeclaration(\n value: string,\n oStyle: Record,\n): void {\n const match = value.match(reFontDeclaration);\n\n if (!match) {\n return;\n }\n const fontStyle = match[1],\n // font variant is not used\n // fontVariant = match[2],\n fontWeight = match[3],\n fontSize = match[4],\n lineHeight = match[5],\n fontFamily = match[6];\n\n if (fontStyle) {\n oStyle.fontStyle = fontStyle;\n }\n if (fontWeight) {\n oStyle.fontWeight = isNaN(parseFloat(fontWeight))\n ? fontWeight\n : parseFloat(fontWeight);\n }\n if (fontSize) {\n oStyle.fontSize = parseUnit(fontSize);\n }\n if (fontFamily) {\n oStyle.fontFamily = fontFamily;\n }\n if (lineHeight) {\n oStyle.lineHeight = lineHeight === 'normal' ? 1 : lineHeight;\n }\n}\n","import { kRect } from '../constants';\nimport { SHARED_ATTRIBUTES } from '../parser/attributes';\nimport { parseAttributes } from '../parser/parseAttributes';\nimport type { Abortable, TClassProperties, TOptions } from '../typedefs';\nimport { classRegistry } from '../ClassRegistry';\nimport { FabricObject, cacheProperties } from './Object/FabricObject';\nimport type { FabricObjectProps, SerializedObjectProps } from './Object/types';\nimport type { ObjectEvents } from '../EventTypeDefs';\nimport type { CSSRules } from '../parser/typedefs';\n\nexport const rectDefaultValues: Partial> = {\n rx: 0,\n ry: 0,\n};\n\ninterface UniqueRectProps {\n rx: number;\n ry: number;\n}\n\nexport interface SerializedRectProps\n extends SerializedObjectProps,\n UniqueRectProps {}\n\nexport interface RectProps extends FabricObjectProps, UniqueRectProps {}\n\nconst RECT_PROPS = ['rx', 'ry'] as const;\n\nexport class Rect<\n Props extends TOptions = Partial,\n SProps extends SerializedRectProps = SerializedRectProps,\n EventSpec extends ObjectEvents = ObjectEvents,\n >\n extends FabricObject\n implements RectProps\n{\n /**\n * Horizontal border radius\n * @type Number\n */\n declare rx: number;\n\n /**\n * Vertical border radius\n * @type Number\n */\n declare ry: number;\n\n static type = 'Rect';\n\n static cacheProperties = [...cacheProperties, ...RECT_PROPS];\n\n static ownDefaults = rectDefaultValues;\n\n static getDefaults(): Record {\n return {\n ...super.getDefaults(),\n ...Rect.ownDefaults,\n };\n }\n\n /**\n * Constructor\n * @param {Object} [options] Options object\n */\n constructor(options?: Props) {\n super();\n Object.assign(this, Rect.ownDefaults);\n this.setOptions(options);\n this._initRxRy();\n }\n /**\n * Initializes rx/ry attributes\n * @private\n */\n _initRxRy() {\n const { rx, ry } = this;\n if (rx && !ry) {\n this.ry = rx;\n } else if (ry && !rx) {\n this.rx = ry;\n }\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _render(ctx: CanvasRenderingContext2D) {\n const { width: w, height: h } = this;\n const x = -w / 2;\n const y = -h / 2;\n const rx = this.rx ? Math.min(this.rx, w / 2) : 0;\n const ry = this.ry ? Math.min(this.ry, h / 2) : 0;\n const isRounded = rx !== 0 || ry !== 0;\n\n ctx.beginPath();\n\n ctx.moveTo(x + rx, y);\n\n ctx.lineTo(x + w - rx, y);\n isRounded &&\n ctx.bezierCurveTo(\n x + w - kRect * rx,\n y,\n x + w,\n y + kRect * ry,\n x + w,\n y + ry,\n );\n\n ctx.lineTo(x + w, y + h - ry);\n isRounded &&\n ctx.bezierCurveTo(\n x + w,\n y + h - kRect * ry,\n x + w - kRect * rx,\n y + h,\n x + w - rx,\n y + h,\n );\n\n ctx.lineTo(x + rx, y + h);\n isRounded &&\n ctx.bezierCurveTo(\n x + kRect * rx,\n y + h,\n x,\n y + h - kRect * ry,\n x,\n y + h - ry,\n );\n\n ctx.lineTo(x, y + ry);\n isRounded &&\n ctx.bezierCurveTo(x, y + kRect * ry, x + kRect * rx, y, x + rx, y);\n\n ctx.closePath();\n\n this._renderPaintInOrder(ctx);\n }\n\n /**\n * Returns object representation of an instance\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} object representation of an instance\n */\n toObject<\n T extends Omit, keyof SProps>,\n K extends keyof T = never,\n >(propertiesToInclude: K[] = []): Pick & SProps {\n return super.toObject([...RECT_PROPS, ...propertiesToInclude]);\n }\n\n /**\n * Returns svg representation of an instance\n * @return {Array} an array of strings with the specific svg representation\n * of the instance\n */\n _toSVG() {\n const { width, height, rx, ry } = this;\n return [\n '\\n`,\n ];\n }\n\n /**\n * List of attribute names to account for when parsing SVG element (used by `Rect.fromElement`)\n * @see: http://www.w3.org/TR/SVG/shapes.html#RectElement\n */\n static ATTRIBUTE_NAMES = [\n ...SHARED_ATTRIBUTES,\n 'x',\n 'y',\n 'rx',\n 'ry',\n 'width',\n 'height',\n ];\n\n /* _FROM_SVG_START_ */\n\n /**\n * Returns {@link Rect} instance from an SVG element\n * @param {HTMLElement} element Element to parse\n * @param {Object} [options] Options object\n */\n static async fromElement(\n element: HTMLElement | SVGElement,\n options?: Abortable,\n cssRules?: CSSRules,\n ) {\n const {\n left = 0,\n top = 0,\n width = 0,\n height = 0,\n visible = true,\n ...restOfparsedAttributes\n } = parseAttributes(element, this.ATTRIBUTE_NAMES, cssRules);\n\n return new this({\n ...options,\n ...restOfparsedAttributes,\n left,\n top,\n width,\n height,\n visible: Boolean(visible && width && height),\n });\n }\n\n /* _FROM_SVG_END_ */\n}\n\nclassRegistry.setClass(Rect);\nclassRegistry.setSVGClass(Rect);\n","export const LAYOUT_TYPE_INITIALIZATION = 'initialization';\nexport const LAYOUT_TYPE_ADDED = 'added';\nexport const LAYOUT_TYPE_REMOVED = 'removed';\nexport const LAYOUT_TYPE_IMPERATIVE = 'imperative';\nexport const LAYOUT_TYPE_OBJECT_MODIFIED = 'object_modified';\nexport const LAYOUT_TYPE_OBJECT_MODIFYING = 'object_modifying';\n","import { Point, ZERO } from '../../Point';\nimport type { Group } from '../../shapes/Group';\nimport type { FabricObject } from '../../shapes/Object/FabricObject';\nimport { multiplyTransformMatrixArray } from '../../util/misc/matrix';\nimport { sizeAfterTransform } from '../../util/misc/objectTransforms';\nimport {\n calcPlaneChangeMatrix,\n sendVectorToPlane,\n} from '../../util/misc/planeChange';\n\n/**\n * @returns 2 points, the tl and br corners of the non rotated bounding box of an object\n * in the {@link group} plane, taking into account objects that {@link group} is their parent\n * but also belong to the active selection.\n */\nexport const getObjectBounds = (\n destinationGroup: Group,\n object: FabricObject,\n): Point[] => {\n const {\n strokeUniform,\n strokeWidth,\n width,\n height,\n group: currentGroup,\n } = object;\n const t =\n currentGroup && currentGroup !== destinationGroup\n ? calcPlaneChangeMatrix(\n currentGroup.calcTransformMatrix(),\n destinationGroup.calcTransformMatrix(),\n )\n : null;\n const objectCenter = t\n ? object.getRelativeCenterPoint().transform(t)\n : object.getRelativeCenterPoint();\n const accountForStroke = !object['isStrokeAccountedForInDimensions']();\n const strokeUniformVector =\n strokeUniform && accountForStroke\n ? sendVectorToPlane(\n new Point(strokeWidth, strokeWidth),\n undefined,\n destinationGroup.calcTransformMatrix(),\n )\n : ZERO;\n const scalingStrokeWidth =\n !strokeUniform && accountForStroke ? strokeWidth : 0;\n const sizeVector = sizeAfterTransform(\n width + scalingStrokeWidth,\n height + scalingStrokeWidth,\n multiplyTransformMatrixArray([t, object.calcOwnMatrix()], true),\n )\n .add(strokeUniformVector)\n .scalarDivide(2);\n return [objectCenter.subtract(sizeVector), objectCenter.add(sizeVector)];\n};\n","import { Point } from '../../Point';\nimport type { FabricObject } from '../../shapes/Object/FabricObject';\nimport { makeBoundingBoxFromPoints } from '../../util/misc/boundingBoxFromPoints';\nimport {\n LAYOUT_TYPE_INITIALIZATION,\n LAYOUT_TYPE_IMPERATIVE,\n} from '../constants';\nimport type {\n InitializationLayoutContext,\n LayoutStrategyResult,\n StrictLayoutContext,\n} from '../types';\nimport { getObjectBounds } from './utils';\n\n/**\n * Exposes a main public method {@link calcLayoutResult} that is used by the `LayoutManager` to perform layout.\n * Returning `undefined` signals the `LayoutManager` to skip the layout.\n *\n * In charge of calculating the bounding box of the passed objects.\n */\nexport abstract class LayoutStrategy {\n /**\n * override by subclass for persistence (TS does not support `static abstract`)\n */\n static type = 'strategy';\n\n /**\n * Used by the `LayoutManager` to perform layout\n * @TODO/fix: if this method is calcResult, should calc unconditionally.\n * the condition to not calc should be evaluated by the layoutManager.\n * @returns layout result **OR** `undefined` to skip layout\n */\n public calcLayoutResult(\n context: StrictLayoutContext,\n objects: FabricObject[],\n ): LayoutStrategyResult | undefined {\n if (this.shouldPerformLayout(context)) {\n return this.calcBoundingBox(objects, context);\n }\n }\n\n shouldPerformLayout({ type, prevStrategy, strategy }: StrictLayoutContext) {\n return (\n type === LAYOUT_TYPE_INITIALIZATION ||\n type === LAYOUT_TYPE_IMPERATIVE ||\n (!!prevStrategy && strategy !== prevStrategy)\n );\n }\n\n shouldLayoutClipPath({ type, target: { clipPath } }: StrictLayoutContext) {\n return (\n type !== LAYOUT_TYPE_INITIALIZATION &&\n clipPath &&\n !clipPath.absolutePositioned\n );\n }\n\n getInitialSize(\n context: StrictLayoutContext & InitializationLayoutContext,\n result: Pick,\n ) {\n return result.size;\n }\n\n /**\n * Override this method to customize layout.\n */\n calcBoundingBox(\n objects: FabricObject[],\n context: StrictLayoutContext,\n ): LayoutStrategyResult | undefined {\n const { type, target } = context;\n if (type === LAYOUT_TYPE_IMPERATIVE && context.overrides) {\n return context.overrides;\n }\n if (objects.length === 0) {\n return;\n }\n const { left, top, width, height } = makeBoundingBoxFromPoints(\n objects\n .map((object) => getObjectBounds(target, object))\n .reduce((coords, curr) => coords.concat(curr), []),\n );\n const bboxSize = new Point(width, height);\n const bboxLeftTop = new Point(left, top);\n const bboxCenter = bboxLeftTop.add(bboxSize.scalarDivide(2));\n\n if (type === LAYOUT_TYPE_INITIALIZATION) {\n const actualSize = this.getInitialSize(context, {\n size: bboxSize,\n center: bboxCenter,\n });\n return {\n // in `initialization` we do not account for target's transformation matrix\n center: bboxCenter,\n // TODO: investigate if this is still necessary\n relativeCorrection: new Point(0, 0),\n size: actualSize,\n };\n } else {\n // we send `relativeCenter` up to group's containing plane\n const center = bboxCenter.transform(target.calcOwnMatrix());\n return {\n center,\n size: bboxSize,\n };\n }\n }\n}\n","import type { StrictLayoutContext } from '../types';\nimport { LayoutStrategy } from './LayoutStrategy';\nimport { classRegistry } from '../../ClassRegistry';\n\n/**\n * Layout will adjust the bounding box to fit target's objects.\n */\nexport class FitContentLayout extends LayoutStrategy {\n static readonly type = 'fit-content';\n\n /**\n * @override layout on all triggers\n * Override at will\n */\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n shouldPerformLayout(context: StrictLayoutContext) {\n return true;\n }\n}\n\nclassRegistry.setClass(FitContentLayout);\n","import { Point } from '../Point';\nimport {\n CENTER,\n CHANGED,\n MODIFIED,\n MODIFY_PATH,\n MODIFY_POLY,\n MOVING,\n RESIZING,\n ROTATING,\n SCALING,\n SKEWING,\n iMatrix,\n} from '../constants';\nimport type { Group } from '../shapes/Group';\nimport type { FabricObject } from '../shapes/Object/FabricObject';\nimport { invertTransform } from '../util/misc/matrix';\nimport { resolveOrigin } from '../util/misc/resolveOrigin';\nimport { FitContentLayout } from './LayoutStrategies/FitContentLayout';\nimport type { LayoutStrategy } from './LayoutStrategies/LayoutStrategy';\nimport {\n LAYOUT_TYPE_INITIALIZATION,\n LAYOUT_TYPE_ADDED,\n LAYOUT_TYPE_REMOVED,\n LAYOUT_TYPE_IMPERATIVE,\n LAYOUT_TYPE_OBJECT_MODIFIED,\n LAYOUT_TYPE_OBJECT_MODIFYING,\n} from './constants';\nimport type {\n LayoutContext,\n LayoutResult,\n RegistrationContext,\n StrictLayoutContext,\n} from './types';\nimport { classRegistry } from '../ClassRegistry';\nimport type { TModificationEvents } from '../EventTypeDefs';\n\nconst LAYOUT_MANAGER = 'layoutManager';\n\nexport type SerializedLayoutManager = {\n type: string;\n strategy: string;\n};\n\nexport class LayoutManager {\n declare private _prevLayoutStrategy?: LayoutStrategy;\n declare protected _subscriptions: Map;\n\n strategy: LayoutStrategy;\n\n constructor(strategy: LayoutStrategy = new FitContentLayout()) {\n this.strategy = strategy;\n this._subscriptions = new Map();\n }\n\n public performLayout(context: LayoutContext) {\n const strictContext: StrictLayoutContext = {\n bubbles: true,\n strategy: this.strategy,\n ...context,\n prevStrategy: this._prevLayoutStrategy,\n stopPropagation() {\n this.bubbles = false;\n },\n };\n\n this.onBeforeLayout(strictContext);\n\n const layoutResult = this.getLayoutResult(strictContext);\n if (layoutResult) {\n this.commitLayout(strictContext, layoutResult);\n }\n\n this.onAfterLayout(strictContext, layoutResult);\n this._prevLayoutStrategy = strictContext.strategy;\n }\n\n /**\n * Attach handlers for events that we know will invalidate the layout when\n * performed on child objects ( general transforms ).\n * Returns the disposers for later unsubscribing and cleanup\n * @param {FabricObject} object\n * @param {RegistrationContext & Partial} context\n * @returns {VoidFunction[]} disposers remove the handlers\n */\n protected attachHandlers(\n object: FabricObject,\n context: RegistrationContext & Partial,\n ): VoidFunction[] {\n const { target } = context;\n return (\n [\n MODIFIED,\n MOVING,\n RESIZING,\n ROTATING,\n SCALING,\n SKEWING,\n CHANGED,\n MODIFY_POLY,\n MODIFY_PATH,\n ] as (TModificationEvents & 'modified')[]\n ).map((key) =>\n object.on(key, (e) =>\n this.performLayout(\n key === MODIFIED\n ? {\n type: LAYOUT_TYPE_OBJECT_MODIFIED,\n trigger: key,\n e,\n target,\n }\n : {\n type: LAYOUT_TYPE_OBJECT_MODIFYING,\n trigger: key,\n e,\n target,\n },\n ),\n ),\n );\n }\n\n /**\n * Subscribe an object to transform events that will trigger a layout change on the parent\n * This is important only for interactive groups.\n * @param object\n * @param context\n */\n protected subscribe(\n object: FabricObject,\n context: RegistrationContext & Partial,\n ) {\n this.unsubscribe(object, context);\n const disposers = this.attachHandlers(object, context);\n this._subscriptions.set(object, disposers);\n }\n\n /**\n * unsubscribe object layout triggers\n */\n protected unsubscribe(\n object: FabricObject,\n _context?: RegistrationContext & Partial,\n ) {\n (this._subscriptions.get(object) || []).forEach((d) => d());\n this._subscriptions.delete(object);\n }\n\n unsubscribeTargets(\n context: RegistrationContext & Partial,\n ) {\n context.targets.forEach((object) => this.unsubscribe(object, context));\n }\n\n subscribeTargets(\n context: RegistrationContext & Partial,\n ) {\n context.targets.forEach((object) => this.subscribe(object, context));\n }\n\n protected onBeforeLayout(context: StrictLayoutContext) {\n const { target, type } = context;\n const { canvas } = target;\n // handle layout triggers subscription\n // @TODO: gate the registration when the group is interactive\n if (type === LAYOUT_TYPE_INITIALIZATION || type === LAYOUT_TYPE_ADDED) {\n this.subscribeTargets(context);\n } else if (type === LAYOUT_TYPE_REMOVED) {\n this.unsubscribeTargets(context);\n }\n // fire layout event (event will fire only for layouts after initialization layout)\n target.fire('layout:before', {\n context,\n });\n canvas &&\n canvas.fire('object:layout:before', {\n target,\n context,\n });\n\n if (type === LAYOUT_TYPE_IMPERATIVE && context.deep) {\n const { strategy: _, ...tricklingContext } = context;\n // traverse the tree\n target.forEachObject(\n (object) =>\n (object as Group).layoutManager &&\n (object as Group).layoutManager.performLayout({\n ...tricklingContext,\n bubbles: false,\n target: object as Group,\n }),\n );\n }\n }\n\n protected getLayoutResult(\n context: StrictLayoutContext,\n ): Required | undefined {\n const { target, strategy, type } = context;\n\n const result = strategy.calcLayoutResult(context, target.getObjects());\n\n if (!result) {\n return;\n }\n\n const prevCenter =\n type === LAYOUT_TYPE_INITIALIZATION\n ? new Point()\n : target.getRelativeCenterPoint();\n\n const {\n center: nextCenter,\n correction = new Point(),\n relativeCorrection = new Point(),\n } = result;\n const offset = prevCenter\n .subtract(nextCenter)\n .add(correction)\n .transform(\n // in `initialization` we do not account for target's transformation matrix\n type === LAYOUT_TYPE_INITIALIZATION\n ? iMatrix\n : invertTransform(target.calcOwnMatrix()),\n true,\n )\n .add(relativeCorrection);\n\n return {\n result,\n prevCenter,\n nextCenter,\n offset,\n };\n }\n\n protected commitLayout(\n context: StrictLayoutContext,\n layoutResult: Required,\n ) {\n const { target } = context;\n const {\n result: { size },\n nextCenter,\n } = layoutResult;\n // set dimensions\n target.set({ width: size.x, height: size.y });\n // layout descendants\n this.layoutObjects(context, layoutResult);\n // set position\n // in `initialization` we do not account for target's transformation matrix\n if (context.type === LAYOUT_TYPE_INITIALIZATION) {\n // TODO: what about strokeWidth?\n target.set({\n left:\n context.x ?? nextCenter.x + size.x * resolveOrigin(target.originX),\n top: context.y ?? nextCenter.y + size.y * resolveOrigin(target.originY),\n });\n } else {\n target.setPositionByOrigin(nextCenter, CENTER, CENTER);\n // invalidate\n target.setCoords();\n target.set('dirty', true);\n }\n }\n\n protected layoutObjects(\n context: StrictLayoutContext,\n layoutResult: Required,\n ) {\n const { target } = context;\n // adjust objects to account for new center\n target.forEachObject((object) => {\n object.group === target &&\n this.layoutObject(context, layoutResult, object);\n });\n // adjust clip path to account for new center\n context.strategy.shouldLayoutClipPath(context) &&\n this.layoutObject(context, layoutResult, target.clipPath as FabricObject);\n }\n\n /**\n * @param {FabricObject} object\n * @param {Point} offset\n */\n protected layoutObject(\n context: StrictLayoutContext,\n { offset }: Required,\n object: FabricObject,\n ) {\n // TODO: this is here for cache invalidation.\n // verify if this is necessary since we have explicit\n // cache invalidation at the end of commitLayout\n object.set({\n left: object.left + offset.x,\n top: object.top + offset.y,\n });\n }\n\n protected onAfterLayout(\n context: StrictLayoutContext,\n layoutResult?: LayoutResult,\n ) {\n const {\n target,\n strategy,\n bubbles,\n prevStrategy: _,\n ...bubblingContext\n } = context;\n const { canvas } = target;\n\n // fire layout event (event will fire only for layouts after initialization layout)\n target.fire('layout:after', {\n context,\n result: layoutResult,\n });\n canvas &&\n canvas.fire('object:layout:after', {\n context,\n result: layoutResult,\n target,\n });\n\n // bubble\n const parent = target.parent;\n if (bubbles && parent?.layoutManager) {\n // add target to context#path\n (bubblingContext.path || (bubblingContext.path = [])).push(target);\n // all parents should invalidate their layout\n parent.layoutManager.performLayout({\n ...bubblingContext,\n target: parent,\n });\n }\n target.set('dirty', true);\n }\n\n dispose() {\n const { _subscriptions } = this;\n _subscriptions.forEach((disposers) => disposers.forEach((d) => d()));\n _subscriptions.clear();\n }\n\n toObject() {\n return {\n type: LAYOUT_MANAGER,\n strategy: (this.strategy.constructor as typeof LayoutStrategy).type,\n };\n }\n\n toJSON() {\n return this.toObject();\n }\n}\n\nclassRegistry.setClass(LayoutManager, LAYOUT_MANAGER);\n","import type { CollectionEvents, ObjectEvents } from '../EventTypeDefs';\nimport { createCollectionMixin } from '../Collection';\nimport type {\n TClassProperties,\n TSVGReviver,\n TOptions,\n Abortable,\n} from '../typedefs';\nimport {\n invertTransform,\n multiplyTransformMatrices,\n} from '../util/misc/matrix';\nimport {\n enlivenObjectEnlivables,\n enlivenObjects,\n} from '../util/misc/objectEnlive';\nimport { applyTransformToObject } from '../util/misc/objectTransforms';\nimport { FabricObject } from './Object/FabricObject';\nimport { Rect } from './Rect';\nimport { classRegistry } from '../ClassRegistry';\nimport type { FabricObjectProps, SerializedObjectProps } from './Object/types';\nimport { log } from '../util/internals/console';\nimport type {\n ImperativeLayoutOptions,\n LayoutBeforeEvent,\n LayoutAfterEvent,\n} from '../LayoutManager/types';\nimport { LayoutManager } from '../LayoutManager/LayoutManager';\nimport {\n LAYOUT_TYPE_ADDED,\n LAYOUT_TYPE_IMPERATIVE,\n LAYOUT_TYPE_INITIALIZATION,\n LAYOUT_TYPE_REMOVED,\n} from '../LayoutManager/constants';\nimport type { SerializedLayoutManager } from '../LayoutManager/LayoutManager';\nimport type { FitContentLayout } from '../LayoutManager';\nimport type { DrawContext } from './Object/Object';\n\n/**\n * This class handles the specific case of creating a group using {@link Group#fromObject} and is not meant to be used in any other case.\n * We could have used a boolean in the constructor, as we did previously, but we think the boolean\n * would stay in the group's constructor interface and create confusion, therefore it was removed.\n * This layout manager doesn't do anything and therefore keeps the exact layout the group had when {@link Group#toObject} was called.\n */\nclass NoopLayoutManager extends LayoutManager {\n performLayout() {}\n}\n\nexport interface GroupEvents extends ObjectEvents, CollectionEvents {\n 'layout:before': LayoutBeforeEvent;\n 'layout:after': LayoutAfterEvent;\n}\n\nexport interface GroupOwnProps {\n subTargetCheck: boolean;\n interactive: boolean;\n}\n\nexport interface SerializedGroupProps\n extends SerializedObjectProps,\n GroupOwnProps {\n objects: SerializedObjectProps[];\n layoutManager: SerializedLayoutManager;\n}\n\nexport interface GroupProps extends FabricObjectProps, GroupOwnProps {\n layoutManager: LayoutManager;\n}\n\nexport const groupDefaultValues: Partial> = {\n strokeWidth: 0,\n subTargetCheck: false,\n interactive: false,\n};\n\n/**\n * @fires object:added\n * @fires object:removed\n * @fires layout:before\n * @fires layout:after\n */\nexport class Group\n extends createCollectionMixin(\n FabricObject,\n )\n implements GroupProps\n{\n /**\n * Used to optimize performance\n * set to `false` if you don't need contained objects to be targets of events\n * @type boolean\n */\n declare subTargetCheck: boolean;\n\n /**\n * Used to allow targeting of object inside groups.\n * set to true if you want to select an object inside a group.\\\n * **REQUIRES** `subTargetCheck` set to true\n * This will be not removed but slowly replaced with a method setInteractive\n * that will take care of enabling subTargetCheck and necessary object events.\n * There is too much attached to group interactivity to just be evaluated by a\n * boolean in the code\n * @deprecated\n * @type boolean\n */\n declare interactive: boolean;\n\n declare layoutManager: LayoutManager;\n\n /**\n * Used internally to optimize performance\n * Once an object is selected, instance is rendered without the selected object.\n * This way instance is cached only once for the entire interaction with the selected object.\n * @private\n */\n protected _activeObjects: FabricObject[] = [];\n\n static type = 'Group';\n\n static ownDefaults: Record = groupDefaultValues;\n private __objectSelectionTracker: (ev: ObjectEvents['selected']) => void;\n private __objectSelectionDisposer: (ev: ObjectEvents['deselected']) => void;\n\n static getDefaults(): Record {\n return {\n ...super.getDefaults(),\n ...Group.ownDefaults,\n };\n }\n\n /**\n * Constructor\n *\n * @param {FabricObject[]} [objects] instance objects\n * @param {Object} [options] Options object\n */\n constructor(objects: FabricObject[] = [], options: Partial = {}) {\n super();\n Object.assign(this, Group.ownDefaults);\n this.setOptions(options);\n this.groupInit(objects, options);\n }\n\n /**\n * Shared code between group and active selection\n * Meant to be used by the constructor.\n */\n protected groupInit(\n objects: FabricObject[],\n options: {\n layoutManager?: LayoutManager;\n top?: number;\n left?: number;\n },\n ) {\n this._objects = [...objects]; // Avoid unwanted mutations of Collection to affect the caller\n\n this.__objectSelectionTracker = this.__objectSelectionMonitor.bind(\n this,\n true,\n );\n this.__objectSelectionDisposer = this.__objectSelectionMonitor.bind(\n this,\n false,\n );\n\n this.forEachObject((object) => {\n this.enterGroup(object, false);\n });\n\n // perform initial layout\n this.layoutManager = options.layoutManager ?? new LayoutManager();\n this.layoutManager.performLayout({\n type: LAYOUT_TYPE_INITIALIZATION,\n target: this,\n targets: [...objects],\n // @TODO remove this concept from the layout manager.\n // Layout manager will calculate the correct position,\n // group options can override it later.\n x: options.left,\n y: options.top,\n });\n }\n\n /**\n * Checks if object can enter group and logs relevant warnings\n * @private\n * @param {FabricObject} object\n * @returns\n */\n canEnterGroup(object: FabricObject) {\n if (object === this || this.isDescendantOf(object)) {\n // prevent circular object tree\n log(\n 'error',\n 'Group: circular object trees are not supported, this call has no effect',\n );\n return false;\n } else if (this._objects.indexOf(object) !== -1) {\n // is already in the objects array\n log(\n 'error',\n 'Group: duplicate objects are not supported inside group, this call has no effect',\n );\n return false;\n }\n return true;\n }\n\n /**\n * Override this method to enhance performance (for groups with a lot of objects).\n * If Overriding, be sure not pass illegal objects to group - it will break your app.\n * @private\n */\n protected _filterObjectsBeforeEnteringGroup(objects: FabricObject[]) {\n return objects.filter((object, index, array) => {\n // can enter AND is the first occurrence of the object in the passed args (to prevent adding duplicates)\n return this.canEnterGroup(object) && array.indexOf(object) === index;\n });\n }\n\n /**\n * Add objects\n * @param {...FabricObject[]} objects\n */\n add(...objects: FabricObject[]) {\n const allowedObjects = this._filterObjectsBeforeEnteringGroup(objects);\n const size = super.add(...allowedObjects);\n this._onAfterObjectsChange(LAYOUT_TYPE_ADDED, allowedObjects);\n return size;\n }\n\n /**\n * Inserts an object into collection at specified index\n * @param {FabricObject[]} objects Object to insert\n * @param {Number} index Index to insert object at\n */\n insertAt(index: number, ...objects: FabricObject[]) {\n const allowedObjects = this._filterObjectsBeforeEnteringGroup(objects);\n const size = super.insertAt(index, ...allowedObjects);\n this._onAfterObjectsChange(LAYOUT_TYPE_ADDED, allowedObjects);\n return size;\n }\n\n /**\n * Remove objects\n * @param {...FabricObject[]} objects\n * @returns {FabricObject[]} removed objects\n */\n remove(...objects: FabricObject[]) {\n const removed = super.remove(...objects);\n this._onAfterObjectsChange(LAYOUT_TYPE_REMOVED, removed);\n return removed;\n }\n\n _onObjectAdded(object: FabricObject) {\n this.enterGroup(object, true);\n this.fire('object:added', { target: object });\n object.fire('added', { target: this });\n }\n\n /**\n * @private\n * @param {FabricObject} object\n * @param {boolean} [removeParentTransform] true if object should exit group without applying group's transform to it\n */\n _onObjectRemoved(object: FabricObject, removeParentTransform?: boolean) {\n this.exitGroup(object, removeParentTransform);\n this.fire('object:removed', { target: object });\n object.fire('removed', { target: this });\n }\n\n /**\n * @private\n * @param {'added'|'removed'} type\n * @param {FabricObject[]} targets\n */\n _onAfterObjectsChange(type: 'added' | 'removed', targets: FabricObject[]) {\n this.layoutManager.performLayout({\n type,\n targets,\n target: this,\n });\n }\n\n _onStackOrderChanged() {\n this._set('dirty', true);\n }\n\n /**\n * @private\n * @param {string} key\n * @param {*} value\n */\n _set(key: string, value: any) {\n const prev = this[key as keyof this];\n super._set(key, value);\n if (key === 'canvas' && prev !== value) {\n (this._objects || []).forEach((object) => {\n object._set(key, value);\n });\n }\n return this;\n }\n\n /**\n * @private\n */\n _shouldSetNestedCoords() {\n return this.subTargetCheck;\n }\n\n /**\n * Remove all objects\n * @returns {FabricObject[]} removed objects\n */\n removeAll() {\n this._activeObjects = [];\n return this.remove(...this._objects);\n }\n\n /**\n * keeps track of the selected objects\n * @private\n */\n __objectSelectionMonitor(\n selected: T,\n {\n target: object,\n }: ObjectEvents[T extends true ? 'selected' : 'deselected'],\n ) {\n const activeObjects = this._activeObjects;\n if (selected) {\n activeObjects.push(object);\n this._set('dirty', true);\n } else if (activeObjects.length > 0) {\n const index = activeObjects.indexOf(object);\n if (index > -1) {\n activeObjects.splice(index, 1);\n this._set('dirty', true);\n }\n }\n }\n\n /**\n * @private\n * @param {boolean} watch\n * @param {FabricObject} object\n */\n _watchObject(watch: boolean, object: FabricObject) {\n // make sure we listen only once\n watch && this._watchObject(false, object);\n if (watch) {\n object.on('selected', this.__objectSelectionTracker);\n object.on('deselected', this.__objectSelectionDisposer);\n } else {\n object.off('selected', this.__objectSelectionTracker);\n object.off('deselected', this.__objectSelectionDisposer);\n }\n }\n\n /**\n * @private\n * @param {FabricObject} object\n * @param {boolean} [removeParentTransform] true if object is in canvas coordinate plane\n */\n enterGroup(object: FabricObject, removeParentTransform?: boolean) {\n object.group && object.group.remove(object);\n object._set('parent', this);\n this._enterGroup(object, removeParentTransform);\n }\n\n /**\n * @private\n * @param {FabricObject} object\n * @param {boolean} [removeParentTransform] true if object is in canvas coordinate plane\n */\n _enterGroup(object: FabricObject, removeParentTransform?: boolean) {\n if (removeParentTransform) {\n // can this be converted to utils (sendObjectToPlane)?\n applyTransformToObject(\n object,\n multiplyTransformMatrices(\n invertTransform(this.calcTransformMatrix()),\n object.calcTransformMatrix(),\n ),\n );\n }\n this._shouldSetNestedCoords() && object.setCoords();\n object._set('group', this);\n object._set('canvas', this.canvas);\n this._watchObject(true, object);\n const activeObject =\n this.canvas &&\n this.canvas.getActiveObject &&\n this.canvas.getActiveObject();\n // if we are adding the activeObject in a group\n if (\n activeObject &&\n (activeObject === object || object.isDescendantOf(activeObject))\n ) {\n this._activeObjects.push(object);\n }\n }\n\n /**\n * @private\n * @param {FabricObject} object\n * @param {boolean} [removeParentTransform] true if object should exit group without applying group's transform to it\n */\n exitGroup(object: FabricObject, removeParentTransform?: boolean) {\n this._exitGroup(object, removeParentTransform);\n object._set('parent', undefined);\n object._set('canvas', undefined);\n }\n\n /**\n * Executes the inner fabric logic of exiting a group.\n * - Stop watching the object\n * - Remove the object from the optimization map this._activeObjects\n * - unset the group property of the object\n * @protected\n * @param {FabricObject} object\n * @param {boolean} [removeParentTransform] true if object should exit group without applying group's transform to it\n */\n _exitGroup(object: FabricObject, removeParentTransform?: boolean) {\n object._set('group', undefined);\n if (!removeParentTransform) {\n applyTransformToObject(\n object,\n multiplyTransformMatrices(\n this.calcTransformMatrix(),\n object.calcTransformMatrix(),\n ),\n );\n object.setCoords();\n }\n this._watchObject(false, object);\n const index =\n this._activeObjects.length > 0 ? this._activeObjects.indexOf(object) : -1;\n if (index > -1) {\n this._activeObjects.splice(index, 1);\n }\n }\n\n /**\n * Decide if the group should cache or not. Create its own cache level\n * needsItsOwnCache should be used when the object drawing method requires\n * a cache step.\n * Generally you do not cache objects in groups because the group is already cached.\n * @return {Boolean}\n */\n shouldCache() {\n const ownCache = FabricObject.prototype.shouldCache.call(this);\n if (ownCache) {\n for (let i = 0; i < this._objects.length; i++) {\n if (this._objects[i].willDrawShadow()) {\n this.ownCaching = false;\n return false;\n }\n }\n }\n return ownCache;\n }\n\n /**\n * Check if this object or a child object will cast a shadow\n * @return {Boolean}\n */\n willDrawShadow() {\n if (super.willDrawShadow()) {\n return true;\n }\n for (let i = 0; i < this._objects.length; i++) {\n if (this._objects[i].willDrawShadow()) {\n return true;\n }\n }\n return false;\n }\n\n /**\n * Check if instance or its group are caching, recursively up\n * @return {Boolean}\n */\n isOnACache(): boolean {\n return this.ownCaching || (!!this.parent && this.parent.isOnACache());\n }\n\n /**\n * Execute the drawing operation for an object on a specified context\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n drawObject(\n ctx: CanvasRenderingContext2D,\n forClipping: boolean | undefined,\n context: DrawContext,\n ) {\n this._renderBackground(ctx);\n for (let i = 0; i < this._objects.length; i++) {\n const obj = this._objects[i];\n // TODO: handle rendering edge case somehow\n if (this.canvas?.preserveObjectStacking && obj.group !== this) {\n ctx.save();\n ctx.transform(...invertTransform(this.calcTransformMatrix()));\n obj.render(ctx);\n ctx.restore();\n } else if (obj.group === this) {\n obj.render(ctx);\n }\n }\n this._drawClipPath(ctx, this.clipPath, context);\n }\n\n /**\n * @override\n * @return {Boolean}\n */\n setCoords() {\n super.setCoords();\n this._shouldSetNestedCoords() &&\n this.forEachObject((object) => object.setCoords());\n }\n\n triggerLayout(options: ImperativeLayoutOptions = {}) {\n this.layoutManager.performLayout({\n target: this,\n type: LAYOUT_TYPE_IMPERATIVE,\n ...options,\n });\n }\n\n /**\n * Renders instance on a given context\n * @param {CanvasRenderingContext2D} ctx context to render instance on\n */\n render(ctx: CanvasRenderingContext2D) {\n this._transformDone = true;\n super.render(ctx);\n this._transformDone = false;\n }\n\n /**\n *\n * @private\n * @param {'toObject'|'toDatalessObject'} [method]\n * @param {string[]} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @returns {FabricObject[]} serialized objects\n */\n __serializeObjects(\n method: 'toObject' | 'toDatalessObject',\n propertiesToInclude?: string[],\n ) {\n const _includeDefaultValues = this.includeDefaultValues;\n return this._objects\n .filter(function (obj) {\n return !obj.excludeFromExport;\n })\n .map(function (obj) {\n const originalDefaults = obj.includeDefaultValues;\n obj.includeDefaultValues = _includeDefaultValues;\n const data = obj[method || 'toObject'](propertiesToInclude);\n obj.includeDefaultValues = originalDefaults;\n // delete data.version;\n return data;\n });\n }\n\n /**\n * Returns object representation of an instance\n * @param {string[]} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} object representation of an instance\n */\n toObject<\n T extends Omit<\n GroupProps & TClassProperties,\n keyof SerializedGroupProps\n >,\n K extends keyof T = never,\n >(propertiesToInclude: K[] = []): Pick & SerializedGroupProps {\n const layoutManager = this.layoutManager.toObject();\n\n return {\n ...super.toObject([\n 'subTargetCheck',\n 'interactive',\n ...propertiesToInclude,\n ]),\n ...(layoutManager.strategy !== 'fit-content' || this.includeDefaultValues\n ? { layoutManager }\n : {}),\n objects: this.__serializeObjects(\n 'toObject',\n propertiesToInclude as string[],\n ),\n };\n }\n\n toString() {\n return `#`;\n }\n\n dispose() {\n this.layoutManager.unsubscribeTargets({\n targets: this.getObjects(),\n target: this,\n });\n this._activeObjects = [];\n this.forEachObject((object) => {\n this._watchObject(false, object);\n object.dispose();\n });\n super.dispose();\n }\n\n /**\n * @private\n */\n _createSVGBgRect(reviver?: TSVGReviver) {\n if (!this.backgroundColor) {\n return '';\n }\n const fillStroke = Rect.prototype._toSVG.call(this);\n const commons = fillStroke.indexOf('COMMON_PARTS');\n fillStroke[commons] = 'for=\"group\" ';\n const markup = fillStroke.join('');\n return reviver ? reviver(markup) : markup;\n }\n\n /**\n * Returns svg representation of an instance\n * @param {TSVGReviver} [reviver] Method for further parsing of svg representation.\n * @return {String} svg representation of an instance\n */\n _toSVG(reviver?: TSVGReviver) {\n const svgString = ['\\n'];\n const bg = this._createSVGBgRect(reviver);\n bg && svgString.push('\\t\\t', bg);\n for (let i = 0; i < this._objects.length; i++) {\n svgString.push('\\t\\t', this._objects[i].toSVG(reviver));\n }\n svgString.push('\\n');\n return svgString;\n }\n\n /**\n * Returns styles-string for svg-export, specific version for group\n * @return {String}\n */\n getSvgStyles(): string {\n const opacity =\n typeof this.opacity !== 'undefined' && this.opacity !== 1\n ? `opacity: ${this.opacity};`\n : '',\n visibility = this.visible ? '' : ' visibility: hidden;';\n return [opacity, this.getSvgFilter(), visibility].join('');\n }\n\n /**\n * Returns svg clipPath representation of an instance\n * @param {Function} [reviver] Method for further parsing of svg representation.\n * @return {String} svg representation of an instance\n */\n toClipPathSVG(reviver?: TSVGReviver): string {\n const svgString = [];\n const bg = this._createSVGBgRect(reviver);\n bg && svgString.push('\\t', bg);\n for (let i = 0; i < this._objects.length; i++) {\n svgString.push('\\t', this._objects[i].toClipPathSVG(reviver));\n }\n return this._createBaseClipPathSVGMarkup(svgString, {\n reviver,\n });\n }\n\n /**\n * @todo support loading from svg\n * @private\n * @param {Object} object Object to create a group from\n * @returns {Promise}\n */\n static fromObject>(\n { type, objects = [], layoutManager, ...options }: T,\n abortable?: Abortable,\n ) {\n return Promise.all([\n enlivenObjects(objects, abortable),\n enlivenObjectEnlivables(options, abortable),\n ]).then(([objects, hydratedOptions]) => {\n const group = new this(objects, {\n ...options,\n ...hydratedOptions,\n layoutManager: new NoopLayoutManager(),\n });\n if (layoutManager) {\n const layoutClass = classRegistry.getClass(\n layoutManager.type,\n );\n const strategyClass = classRegistry.getClass(\n layoutManager.strategy,\n );\n group.layoutManager = new layoutClass(new strategyClass());\n } else {\n group.layoutManager = new LayoutManager();\n }\n group.layoutManager.subscribeTargets({\n type: LAYOUT_TYPE_INITIALIZATION,\n target: group,\n targets: group.getObjects(),\n });\n group.setCoords();\n return group;\n });\n }\n}\n\nclassRegistry.setClass(Group);\n","import type { GroupProps } from '../../shapes/Group';\nimport { Group } from '../../shapes/Group';\nimport type { FabricObject } from '../../shapes/Object/FabricObject';\n\n/**\n * TODO experiment with different layout manager and svg results ( fixed fit content )\n * Groups SVG elements (usually those retrieved from SVG document)\n * @static\n * @param {FabricObject[]} elements FabricObject(s) parsed from svg, to group\n * @return {FabricObject | Group}\n */\nexport const groupSVGElements = (\n elements: FabricObject[],\n options?: Partial,\n) => {\n if (elements && elements.length === 1) {\n return elements[0];\n }\n return new Group(elements, options);\n};\n","import type { TSize } from '../../typedefs';\n\n/**\n * Finds the scale for the object source to fit inside the object destination,\n * keeping aspect ratio intact.\n * respect the total allowed area for the cache.\n * @param {TSize} source natural unscaled size of the object\n * @param {TSize} destination natural unscaled size of the object\n * @return {Number} scale factor to apply to source to fit into destination\n */\nexport const findScaleToFit = (source: TSize, destination: TSize) =>\n Math.min(\n destination.width / source.width,\n destination.height / source.height,\n );\n\n/**\n * Finds the scale for the object source to cover entirely the object destination,\n * keeping aspect ratio intact.\n * respect the total allowed area for the cache.\n * @param {TSize} source natural unscaled size of the object\n * @param {TSize} destination natural unscaled size of the object\n * @return {Number} scale factor to apply to source to cover destination\n */\nexport const findScaleToCover = (source: TSize, destination: TSize) =>\n Math.max(\n destination.width / source.width,\n destination.height / source.height,\n );\n","import { reNum } from '../../parser/constants';\n\nconst commaWsp = `\\\\s*,?\\\\s*`;\n\n/**\n * p for param\n * using \"bad naming\" here because it makes the regex much easier to read\n * p is a number that is preceded by an arbitary number of spaces, maybe 0,\n * a comma or not, and then possibly more spaces or not.\n */\nconst p = `${commaWsp}(${reNum})`;\n\n// const reMoveToCommand = `(M) ?(?:${p}${p} ?)+`;\n\n// const reLineCommand = `(L) ?(?:${p}${p} ?)+`;\n\n// const reHorizontalLineCommand = `(H) ?(?:${p} ?)+`;\n\n// const reVerticalLineCommand = `(V) ?(?:${p} ?)+`;\n\n// const reClosePathCommand = String.raw`(Z)\\s*`;\n\n// const reCubicCurveCommand = `(C) ?(?:${p}${p}${p}${p}${p}${p} ?)+`;\n\n// const reCubicCurveShortcutCommand = `(S) ?(?:${p}${p}${p}${p} ?)+`;\n\n// const reQuadraticCurveCommand = `(Q) ?(?:${p}${p}${p}${p} ?)+`;\n\n// const reQuadraticCurveShortcutCommand = `(T) ?(?:${p}${p} ?)+`;\n\nexport const reArcCommandPoints = `${p}${p}${p}${commaWsp}([01])${commaWsp}([01])${p}${p}`;\n// const reArcCommand = `(A) ?(?:${reArcCommandPoints} ?)+`;\n\n// export const rePathCommandGroups =\n// `(?:(?:${reMoveToCommand})` +\n// `|(?:${reLineCommand})` +\n// `|(?:${reHorizontalLineCommand})` +\n// `|(?:${reVerticalLineCommand})` +\n// `|(?:${reClosePathCommand})` +\n// `|(?:${reCubicCurveCommand})` +\n// `|(?:${reCubicCurveShortcutCommand})` +\n// `|(?:${reQuadraticCurveCommand})` +\n// `|(?:${reQuadraticCurveShortcutCommand})` +\n// `|(?:${reArcCommand}))`;\n\nexport const rePathCommand = '[mzlhvcsqta][^mzlhvcsqta]*';\n","import { cache } from '../../cache';\nimport { config } from '../../config';\nimport { halfPI, PiBy180 } from '../../constants';\nimport type { TMat2D, TRadian, TRectBounds } from '../../typedefs';\nimport { cos } from '../misc/cos';\nimport { multiplyTransformMatrices, transformPoint } from '../misc/matrix';\nimport { sin } from '../misc/sin';\nimport { toFixed } from '../misc/toFixed';\nimport type {\n TCurveInfo,\n TComplexPathData,\n TParsedAbsoluteCubicCurveCommand,\n TPathSegmentInfo,\n TPointAngle,\n TSimpleParsedCommand,\n TSimplePathData,\n TPathSegmentCommandInfo,\n TComplexParsedCommand,\n TPathSegmentInfoCommon,\n TEndPathInfo,\n TParsedArcCommand,\n TComplexParsedCommandType,\n} from './typedefs';\nimport type { XY } from '../../Point';\nimport { Point } from '../../Point';\nimport { reArcCommandPoints, rePathCommand } from './regex';\nimport { reNum } from '../../parser/constants';\n\n/**\n * Commands that may be repeated\n */\nconst repeatedCommands: Record = {\n m: 'l',\n M: 'L',\n};\n\n/**\n * Convert an arc of a rotated ellipse to a Bezier Curve\n * @param {TRadian} theta1 start of the arc\n * @param {TRadian} theta2 end of the arc\n * @param cosTh cosine of the angle of rotation\n * @param sinTh sine of the angle of rotation\n * @param rx x-axis radius (before rotation)\n * @param ry y-axis radius (before rotation)\n * @param cx1 center x of the ellipse\n * @param cy1 center y of the ellipse\n * @param mT\n * @param fromX starting point of arc x\n * @param fromY starting point of arc y\n */\nconst segmentToBezier = (\n theta1: TRadian,\n theta2: TRadian,\n cosTh: number,\n sinTh: number,\n rx: number,\n ry: number,\n cx1: number,\n cy1: number,\n mT: number,\n fromX: number,\n fromY: number,\n): TParsedAbsoluteCubicCurveCommand => {\n const costh1 = cos(theta1),\n sinth1 = sin(theta1),\n costh2 = cos(theta2),\n sinth2 = sin(theta2),\n toX = cosTh * rx * costh2 - sinTh * ry * sinth2 + cx1,\n toY = sinTh * rx * costh2 + cosTh * ry * sinth2 + cy1,\n cp1X = fromX + mT * (-cosTh * rx * sinth1 - sinTh * ry * costh1),\n cp1Y = fromY + mT * (-sinTh * rx * sinth1 + cosTh * ry * costh1),\n cp2X = toX + mT * (cosTh * rx * sinth2 + sinTh * ry * costh2),\n cp2Y = toY + mT * (sinTh * rx * sinth2 - cosTh * ry * costh2);\n\n return ['C', cp1X, cp1Y, cp2X, cp2Y, toX, toY];\n};\n\n/**\n * Adapted from {@link http://dxr.mozilla.org/mozilla-central/source/dom/svg/SVGPathDataParser.cpp}\n * by Andrea Bogazzi code is under MPL. if you don't have a copy of the license you can take it here\n * http://mozilla.org/MPL/2.0/\n * @param toX\n * @param toY\n * @param rx\n * @param ry\n * @param {number} large 0 or 1 flag\n * @param {number} sweep 0 or 1 flag\n * @param rotateX\n */\nconst arcToSegments = (\n toX: number,\n toY: number,\n rx: number,\n ry: number,\n large: number,\n sweep: number,\n rotateX: TRadian,\n): TParsedAbsoluteCubicCurveCommand[] => {\n if (rx === 0 || ry === 0) {\n return [];\n }\n let fromX = 0,\n fromY = 0,\n root = 0;\n const PI = Math.PI,\n theta = rotateX * PiBy180,\n sinTheta = sin(theta),\n cosTh = cos(theta),\n px = 0.5 * (-cosTh * toX - sinTheta * toY),\n py = 0.5 * (-cosTh * toY + sinTheta * toX),\n rx2 = rx ** 2,\n ry2 = ry ** 2,\n py2 = py ** 2,\n px2 = px ** 2,\n pl = rx2 * ry2 - rx2 * py2 - ry2 * px2;\n let _rx = Math.abs(rx);\n let _ry = Math.abs(ry);\n\n if (pl < 0) {\n const s = Math.sqrt(1 - pl / (rx2 * ry2));\n _rx *= s;\n _ry *= s;\n } else {\n root =\n (large === sweep ? -1.0 : 1.0) * Math.sqrt(pl / (rx2 * py2 + ry2 * px2));\n }\n\n const cx = (root * _rx * py) / _ry,\n cy = (-root * _ry * px) / _rx,\n cx1 = cosTh * cx - sinTheta * cy + toX * 0.5,\n cy1 = sinTheta * cx + cosTh * cy + toY * 0.5;\n let mTheta = calcVectorAngle(1, 0, (px - cx) / _rx, (py - cy) / _ry);\n let dtheta = calcVectorAngle(\n (px - cx) / _rx,\n (py - cy) / _ry,\n (-px - cx) / _rx,\n (-py - cy) / _ry,\n );\n\n if (sweep === 0 && dtheta > 0) {\n dtheta -= 2 * PI;\n } else if (sweep === 1 && dtheta < 0) {\n dtheta += 2 * PI;\n }\n\n // Convert into cubic bezier segments <= 90deg\n const segments = Math.ceil(Math.abs((dtheta / PI) * 2)),\n result = [],\n mDelta = dtheta / segments,\n mT =\n ((8 / 3) * Math.sin(mDelta / 4) * Math.sin(mDelta / 4)) /\n Math.sin(mDelta / 2);\n let th3 = mTheta + mDelta;\n\n for (let i = 0; i < segments; i++) {\n result[i] = segmentToBezier(\n mTheta,\n th3,\n cosTh,\n sinTheta,\n _rx,\n _ry,\n cx1,\n cy1,\n mT,\n fromX,\n fromY,\n );\n fromX = result[i][5];\n fromY = result[i][6];\n mTheta = th3;\n th3 += mDelta;\n }\n return result;\n};\n\n/**\n * @private\n * Calculate the angle between two vectors\n * @param ux u endpoint x\n * @param uy u endpoint y\n * @param vx v endpoint x\n * @param vy v endpoint y\n */\nconst calcVectorAngle = (\n ux: number,\n uy: number,\n vx: number,\n vy: number,\n): TRadian => {\n const ta = Math.atan2(uy, ux),\n tb = Math.atan2(vy, vx);\n if (tb >= ta) {\n return tb - ta;\n } else {\n return 2 * Math.PI - (ta - tb);\n }\n};\n\n// functions for the Cubic beizer\n// taken from: https://github.com/konvajs/konva/blob/7.0.5/src/shapes/Path.ts#L350\nconst CB1 = (t: number) => t ** 3;\nconst CB2 = (t: number) => 3 * t ** 2 * (1 - t);\nconst CB3 = (t: number) => 3 * t * (1 - t) ** 2;\nconst CB4 = (t: number) => (1 - t) ** 3;\n\n/**\n * Calculate bounding box of a cubic Bezier curve\n * Taken from http://jsbin.com/ivomiq/56/edit (no credits available)\n * TODO: can we normalize this with the starting points set at 0 and then translated the bbox?\n * @param {number} begx starting point\n * @param {number} begy\n * @param {number} cp1x first control point\n * @param {number} cp1y\n * @param {number} cp2x second control point\n * @param {number} cp2y\n * @param {number} endx end of bezier\n * @param {number} endy\n * @return {TRectBounds} the rectangular bounds\n */\nexport function getBoundsOfCurve(\n begx: number,\n begy: number,\n cp1x: number,\n cp1y: number,\n cp2x: number,\n cp2y: number,\n endx: number,\n endy: number,\n): TRectBounds {\n let argsString: string;\n if (config.cachesBoundsOfCurve) {\n // eslint-disable-next-line\n argsString = [...arguments].join();\n if (cache.boundsOfCurveCache[argsString]) {\n return cache.boundsOfCurveCache[argsString];\n }\n }\n\n const sqrt = Math.sqrt,\n abs = Math.abs,\n tvalues = [],\n bounds: [[x: number, y: number], [x: number, y: number]] = [\n [0, 0],\n [0, 0],\n ];\n\n let b = 6 * begx - 12 * cp1x + 6 * cp2x;\n let a = -3 * begx + 9 * cp1x - 9 * cp2x + 3 * endx;\n let c = 3 * cp1x - 3 * begx;\n\n for (let i = 0; i < 2; ++i) {\n if (i > 0) {\n b = 6 * begy - 12 * cp1y + 6 * cp2y;\n a = -3 * begy + 9 * cp1y - 9 * cp2y + 3 * endy;\n c = 3 * cp1y - 3 * begy;\n }\n\n if (abs(a) < 1e-12) {\n if (abs(b) < 1e-12) {\n continue;\n }\n const t = -c / b;\n if (0 < t && t < 1) {\n tvalues.push(t);\n }\n continue;\n }\n const b2ac = b * b - 4 * c * a;\n if (b2ac < 0) {\n continue;\n }\n const sqrtb2ac = sqrt(b2ac);\n const t1 = (-b + sqrtb2ac) / (2 * a);\n if (0 < t1 && t1 < 1) {\n tvalues.push(t1);\n }\n const t2 = (-b - sqrtb2ac) / (2 * a);\n if (0 < t2 && t2 < 1) {\n tvalues.push(t2);\n }\n }\n\n let j = tvalues.length;\n const jlen = j;\n const iterator = getPointOnCubicBezierIterator(\n begx,\n begy,\n cp1x,\n cp1y,\n cp2x,\n cp2y,\n endx,\n endy,\n );\n while (j--) {\n const { x, y } = iterator(tvalues[j]);\n bounds[0][j] = x;\n bounds[1][j] = y;\n }\n\n bounds[0][jlen] = begx;\n bounds[1][jlen] = begy;\n bounds[0][jlen + 1] = endx;\n bounds[1][jlen + 1] = endy;\n const result: TRectBounds = [\n new Point(Math.min(...bounds[0]), Math.min(...bounds[1])),\n new Point(Math.max(...bounds[0]), Math.max(...bounds[1])),\n ];\n if (config.cachesBoundsOfCurve) {\n cache.boundsOfCurveCache[argsString!] = result;\n }\n return result;\n}\n\n/**\n * Converts arc to a bunch of cubic Bezier curves\n * @param {number} fx starting point x\n * @param {number} fy starting point y\n * @param {TParsedArcCommand} coords Arc command\n */\nexport const fromArcToBeziers = (\n fx: number,\n fy: number,\n [_, rx, ry, rot, large, sweep, tx, ty]: TParsedArcCommand,\n): TParsedAbsoluteCubicCurveCommand[] => {\n const segsNorm = arcToSegments(tx - fx, ty - fy, rx, ry, large, sweep, rot);\n\n for (let i = 0, len = segsNorm.length; i < len; i++) {\n segsNorm[i][1] += fx;\n segsNorm[i][2] += fy;\n segsNorm[i][3] += fx;\n segsNorm[i][4] += fy;\n segsNorm[i][5] += fx;\n segsNorm[i][6] += fy;\n }\n return segsNorm;\n};\n\n/**\n * This function takes a parsed SVG path and makes it simpler for fabricJS logic.\n * Simplification consist of:\n * - All commands converted to absolute (lowercase to uppercase)\n * - S converted to C\n * - T converted to Q\n * - A converted to C\n * @param {TComplexPathData} path the array of commands of a parsed SVG path for `Path`\n * @return {TSimplePathData} the simplified array of commands of a parsed SVG path for `Path`\n * TODO: figure out how to remove the type assertions in a nice way\n */\nexport const makePathSimpler = (path: TComplexPathData): TSimplePathData => {\n // x and y represent the last point of the path, AKA the previous command point.\n // we add them to each relative command to make it an absolute comment.\n // we also swap the v V h H with L, because are easier to transform.\n let x = 0,\n y = 0;\n // x1 and y1 represent the last point of the subpath. the subpath is started with\n // m or M command. When a z or Z command is drawn, x and y need to be resetted to\n // the last x1 and y1.\n let x1 = 0,\n y1 = 0;\n // previous will host the letter of the previous command, to handle S and T.\n // controlX and controlY will host the previous reflected control point\n const destinationPath: TSimplePathData = [];\n let previous,\n // placeholders\n controlX = 0,\n controlY = 0;\n for (const parsedCommand of path) {\n const current: TComplexParsedCommand = [...parsedCommand];\n let converted: TSimpleParsedCommand | undefined;\n switch (\n current[0] // first letter\n ) {\n case 'l': // lineto, relative\n current[1] += x;\n current[2] += y;\n // falls through\n case 'L':\n x = current[1];\n y = current[2];\n converted = ['L', x, y];\n break;\n case 'h': // horizontal lineto, relative\n current[1] += x;\n // falls through\n case 'H':\n x = current[1];\n converted = ['L', x, y];\n break;\n case 'v': // vertical lineto, relative\n current[1] += y;\n // falls through\n case 'V':\n y = current[1];\n converted = ['L', x, y];\n break;\n case 'm': // moveTo, relative\n current[1] += x;\n current[2] += y;\n // falls through\n case 'M':\n x = current[1];\n y = current[2];\n x1 = current[1];\n y1 = current[2];\n converted = ['M', x, y];\n break;\n case 'c': // bezierCurveTo, relative\n current[1] += x;\n current[2] += y;\n current[3] += x;\n current[4] += y;\n current[5] += x;\n current[6] += y;\n // falls through\n case 'C':\n controlX = current[3];\n controlY = current[4];\n x = current[5];\n y = current[6];\n converted = ['C', current[1], current[2], controlX, controlY, x, y];\n break;\n case 's': // shorthand cubic bezierCurveTo, relative\n current[1] += x;\n current[2] += y;\n current[3] += x;\n current[4] += y;\n // falls through\n case 'S':\n // would be sScC but since we are swapping sSc for C, we check just that.\n if (previous === 'C') {\n // calculate reflection of previous control points\n controlX = 2 * x - controlX;\n controlY = 2 * y - controlY;\n } else {\n // If there is no previous command or if the previous command was not a C, c, S, or s,\n // the control point is coincident with the current point\n controlX = x;\n controlY = y;\n }\n x = current[3];\n y = current[4];\n converted = ['C', controlX, controlY, current[1], current[2], x, y];\n // converted[3] and converted[4] are NOW the second control point.\n // we keep it for the next reflection.\n controlX = converted[3];\n controlY = converted[4];\n break;\n case 'q': // quadraticCurveTo, relative\n current[1] += x;\n current[2] += y;\n current[3] += x;\n current[4] += y;\n // falls through\n case 'Q':\n controlX = current[1];\n controlY = current[2];\n x = current[3];\n y = current[4];\n converted = ['Q', controlX, controlY, x, y];\n break;\n case 't': // shorthand quadraticCurveTo, relative\n current[1] += x;\n current[2] += y;\n // falls through\n case 'T':\n if (previous === 'Q') {\n // calculate reflection of previous control point\n controlX = 2 * x - controlX;\n controlY = 2 * y - controlY;\n } else {\n // If there is no previous command or if the previous command was not a Q, q, T or t,\n // assume the control point is coincident with the current point\n controlX = x;\n controlY = y;\n }\n x = current[1];\n y = current[2];\n converted = ['Q', controlX, controlY, x, y];\n break;\n case 'a':\n current[6] += x;\n current[7] += y;\n // falls through\n case 'A':\n fromArcToBeziers(x, y, current).forEach((b) => destinationPath.push(b));\n x = current[6];\n y = current[7];\n break;\n case 'z':\n case 'Z':\n x = x1;\n y = y1;\n converted = ['Z'];\n break;\n default:\n }\n if (converted) {\n destinationPath.push(converted);\n previous = converted[0];\n } else {\n previous = '';\n }\n }\n return destinationPath;\n};\n\n// todo verify if we can just use the point class here\n/**\n * Calc length from point x1,y1 to x2,y2\n * @param {number} x1 starting point x\n * @param {number} y1 starting point y\n * @param {number} x2 starting point x\n * @param {number} y2 starting point y\n * @return {number} length of segment\n */\nconst calcLineLength = (\n x1: number,\n y1: number,\n x2: number,\n y2: number,\n): number => Math.sqrt((x2 - x1) ** 2 + (y2 - y1) ** 2);\n\n/**\n * Get an iterator that takes a percentage and returns a point\n * @param {number} begx\n * @param {number} begy\n * @param {number} cp1x\n * @param {number} cp1y\n * @param {number} cp2x\n * @param {number} cp2y\n * @param {number} endx\n * @param {number} endy\n */\nconst getPointOnCubicBezierIterator =\n (\n begx: number,\n begy: number,\n cp1x: number,\n cp1y: number,\n cp2x: number,\n cp2y: number,\n endx: number,\n endy: number,\n ) =>\n (pct: number) => {\n const c1 = CB1(pct),\n c2 = CB2(pct),\n c3 = CB3(pct),\n c4 = CB4(pct);\n return new Point(\n endx * c1 + cp2x * c2 + cp1x * c3 + begx * c4,\n endy * c1 + cp2y * c2 + cp1y * c3 + begy * c4,\n );\n };\n\nconst QB1 = (t: number) => t ** 2;\nconst QB2 = (t: number) => 2 * t * (1 - t);\nconst QB3 = (t: number) => (1 - t) ** 2;\n\nconst getTangentCubicIterator =\n (\n p1x: number,\n p1y: number,\n p2x: number,\n p2y: number,\n p3x: number,\n p3y: number,\n p4x: number,\n p4y: number,\n ) =>\n (pct: number) => {\n const qb1 = QB1(pct),\n qb2 = QB2(pct),\n qb3 = QB3(pct),\n tangentX =\n 3 * (qb3 * (p2x - p1x) + qb2 * (p3x - p2x) + qb1 * (p4x - p3x)),\n tangentY =\n 3 * (qb3 * (p2y - p1y) + qb2 * (p3y - p2y) + qb1 * (p4y - p3y));\n return Math.atan2(tangentY, tangentX);\n };\n\nconst getPointOnQuadraticBezierIterator =\n (\n p1x: number,\n p1y: number,\n p2x: number,\n p2y: number,\n p3x: number,\n p3y: number,\n ) =>\n (pct: number) => {\n const c1 = QB1(pct),\n c2 = QB2(pct),\n c3 = QB3(pct);\n return new Point(\n p3x * c1 + p2x * c2 + p1x * c3,\n p3y * c1 + p2y * c2 + p1y * c3,\n );\n };\n\nconst getTangentQuadraticIterator =\n (\n p1x: number,\n p1y: number,\n p2x: number,\n p2y: number,\n p3x: number,\n p3y: number,\n ) =>\n (pct: number) => {\n const invT = 1 - pct,\n tangentX = 2 * (invT * (p2x - p1x) + pct * (p3x - p2x)),\n tangentY = 2 * (invT * (p2y - p1y) + pct * (p3y - p2y));\n return Math.atan2(tangentY, tangentX);\n };\n\n// this will run over a path segment (a cubic or quadratic segment) and approximate it\n// with 100 segments. This will good enough to calculate the length of the curve\nconst pathIterator = (\n iterator: (pct: number) => Point,\n x1: number,\n y1: number,\n) => {\n let tempP = new Point(x1, y1),\n tmpLen = 0;\n for (let perc = 1; perc <= 100; perc += 1) {\n const p = iterator(perc / 100);\n tmpLen += calcLineLength(tempP.x, tempP.y, p.x, p.y);\n tempP = p;\n }\n return tmpLen;\n};\n\n/**\n * Given a pathInfo, and a distance in pixels, find the percentage from 0 to 1\n * that correspond to that pixels run over the path.\n * The percentage will be then used to find the correct point on the canvas for the path.\n * @param {Array} segInfo fabricJS collection of information on a parsed path\n * @param {number} distance from starting point, in pixels.\n * @return {TPointAngle} info object with x and y ( the point on canvas ) and angle, the tangent on that point;\n */\nconst findPercentageForDistance = (\n segInfo: TCurveInfo<'Q' | 'C'>,\n distance: number,\n): TPointAngle => {\n let perc = 0,\n tmpLen = 0,\n tempP: XY = { x: segInfo.x, y: segInfo.y },\n p: XY = { ...tempP },\n nextLen: number,\n nextStep = 0.01,\n lastPerc = 0;\n // nextStep > 0.0001 covers 0.00015625 that 1/64th of 1/100\n // the path\n const iterator = segInfo.iterator,\n angleFinder = segInfo.angleFinder;\n while (tmpLen < distance && nextStep > 0.0001) {\n p = iterator(perc);\n lastPerc = perc;\n nextLen = calcLineLength(tempP.x, tempP.y, p.x, p.y);\n // compare tmpLen each cycle with distance, decide next perc to test.\n if (nextLen + tmpLen > distance) {\n // we discard this step and we make smaller steps.\n perc -= nextStep;\n nextStep /= 2;\n } else {\n tempP = p;\n perc += nextStep;\n tmpLen += nextLen;\n }\n }\n return { ...p, angle: angleFinder(lastPerc) };\n};\n\n/**\n * Run over a parsed and simplified path and extract some information (length of each command and starting point)\n * @param {TSimplePathData} path parsed path commands\n * @return {TPathSegmentInfo[]} path commands information\n */\nexport const getPathSegmentsInfo = (\n path: TSimplePathData,\n): TPathSegmentInfo[] => {\n let totalLength = 0,\n //x2 and y2 are the coords of segment start\n //x1 and y1 are the coords of the current point\n x1 = 0,\n y1 = 0,\n x2 = 0,\n y2 = 0,\n iterator,\n tempInfo: TPathSegmentInfo;\n const info: TPathSegmentInfo[] = [];\n for (const current of path) {\n const basicInfo: TPathSegmentInfoCommon = {\n x: x1,\n y: y1,\n command: current[0],\n length: 0,\n };\n switch (\n current[0] //first letter\n ) {\n case 'M':\n tempInfo = >basicInfo;\n tempInfo.x = x2 = x1 = current[1];\n tempInfo.y = y2 = y1 = current[2];\n break;\n case 'L':\n tempInfo = >basicInfo;\n tempInfo.length = calcLineLength(x1, y1, current[1], current[2]);\n x1 = current[1];\n y1 = current[2];\n break;\n case 'C':\n iterator = getPointOnCubicBezierIterator(\n x1,\n y1,\n current[1],\n current[2],\n current[3],\n current[4],\n current[5],\n current[6],\n );\n tempInfo = >basicInfo;\n tempInfo.iterator = iterator;\n tempInfo.angleFinder = getTangentCubicIterator(\n x1,\n y1,\n current[1],\n current[2],\n current[3],\n current[4],\n current[5],\n current[6],\n );\n tempInfo.length = pathIterator(iterator, x1, y1);\n\n x1 = current[5];\n y1 = current[6];\n break;\n case 'Q':\n iterator = getPointOnQuadraticBezierIterator(\n x1,\n y1,\n current[1],\n current[2],\n current[3],\n current[4],\n );\n tempInfo = >basicInfo;\n tempInfo.iterator = iterator;\n tempInfo.angleFinder = getTangentQuadraticIterator(\n x1,\n y1,\n current[1],\n current[2],\n current[3],\n current[4],\n );\n tempInfo.length = pathIterator(iterator, x1, y1);\n x1 = current[3];\n y1 = current[4];\n break;\n case 'Z':\n // we add those in order to ease calculations later\n tempInfo = basicInfo;\n tempInfo.destX = x2;\n tempInfo.destY = y2;\n tempInfo.length = calcLineLength(x1, y1, x2, y2);\n x1 = x2;\n y1 = y2;\n break;\n }\n totalLength += tempInfo.length;\n info.push(tempInfo);\n }\n info.push({ length: totalLength, x: x1, y: y1 });\n return info;\n};\n\n/**\n * Get the point on the path that is distance along the path\n * @param path\n * @param distance\n * @param infos\n */\nexport const getPointOnPath = (\n path: TSimplePathData,\n distance: number,\n infos: TPathSegmentInfo[] = getPathSegmentsInfo(path),\n): TPointAngle | undefined => {\n let i = 0;\n while (distance - infos[i].length > 0 && i < infos.length - 2) {\n distance -= infos[i].length;\n i++;\n }\n const segInfo = infos[i],\n segPercent = distance / segInfo.length,\n segment = path[i];\n\n switch (segInfo.command) {\n case 'M':\n return { x: segInfo.x, y: segInfo.y, angle: 0 };\n case 'Z':\n return {\n ...new Point(segInfo.x, segInfo.y).lerp(\n new Point(segInfo.destX, segInfo.destY),\n segPercent,\n ),\n angle: Math.atan2(segInfo.destY - segInfo.y, segInfo.destX - segInfo.x),\n };\n case 'L':\n return {\n ...new Point(segInfo.x, segInfo.y).lerp(\n new Point(segment[1]!, segment[2]!),\n segPercent,\n ),\n angle: Math.atan2(segment[2]! - segInfo.y, segment[1]! - segInfo.x),\n };\n case 'C':\n return findPercentageForDistance(segInfo, distance);\n case 'Q':\n return findPercentageForDistance(segInfo, distance);\n default:\n // throw Error('Invalid command');\n }\n};\n\nconst rePathCmdAll = new RegExp(rePathCommand, 'gi');\nconst regExpArcCommandPoints = new RegExp(reArcCommandPoints, 'g');\nconst reMyNum = new RegExp(reNum, 'gi');\nconst commandLengths = {\n m: 2,\n l: 2,\n h: 1,\n v: 1,\n c: 6,\n s: 4,\n q: 4,\n t: 2,\n a: 7,\n} as const;\n/**\n *\n * @param {string} pathString\n * @return {TComplexPathData} An array of SVG path commands\n * @example Usage\n * parsePath('M 3 4 Q 3 5 2 1 4 0 Q 9 12 2 1 4 0') === [\n * ['M', 3, 4],\n * ['Q', 3, 5, 2, 1, 4, 0],\n * ['Q', 9, 12, 2, 1, 4, 0],\n * ];\n */\nexport const parsePath = (pathString: string): TComplexPathData => {\n const chain: TComplexPathData = [];\n const all = pathString.match(rePathCmdAll) ?? [];\n for (const matchStr of all) {\n // take match string and save the first letter as the command\n const commandLetter = matchStr[0] as TComplexParsedCommandType;\n // in case of Z we have very little to do\n if (commandLetter === 'z' || commandLetter === 'Z') {\n chain.push([commandLetter]);\n continue;\n }\n const commandLength =\n commandLengths[\n commandLetter.toLowerCase() as keyof typeof commandLengths\n ];\n\n let paramArr = [];\n if (commandLetter === 'a' || commandLetter === 'A') {\n // the arc command ha some peculariaties that requires a special regex other than numbers\n // it is possible to avoid using a space between the sweep and large arc flags, making them either\n // 00, 01, 10 or 11, making them identical to a plain number for the regex reMyNum\n // reset the regexp\n regExpArcCommandPoints.lastIndex = 0;\n for (let out = null; (out = regExpArcCommandPoints.exec(matchStr)); ) {\n paramArr.push(...out.slice(1));\n }\n } else {\n paramArr = matchStr.match(reMyNum) || [];\n }\n\n // inspect the length of paramArr, if is longer than commandLength\n // we are dealing with repeated commands\n for (let i = 0; i < paramArr.length; i += commandLength) {\n const newCommand = new Array(commandLength) as TComplexParsedCommand;\n const transformedCommand = repeatedCommands[commandLetter];\n newCommand[0] =\n i > 0 && transformedCommand ? transformedCommand : commandLetter;\n for (let j = 0; j < commandLength; j++) {\n newCommand[j + 1] = parseFloat(paramArr[i + j]);\n }\n chain.push(newCommand);\n }\n }\n return chain;\n};\n\n/**\n *\n * Converts points to a smooth SVG path\n * @param {XY[]} points Array of points\n * @param {number} [correction] Apply a correction to the path (usually we use `width / 1000`). If value is undefined 0 is used as the correction value.\n * @return {(string|number)[][]} An array of SVG path commands\n */\nexport const getSmoothPathFromPoints = (\n points: Point[],\n correction = 0,\n): TSimplePathData => {\n let p1 = new Point(points[0]),\n p2 = new Point(points[1]),\n multSignX = 1,\n multSignY = 0;\n const path: TSimplePathData = [],\n len = points.length,\n manyPoints = len > 2;\n\n if (manyPoints) {\n multSignX = points[2].x < p2.x ? -1 : points[2].x === p2.x ? 0 : 1;\n multSignY = points[2].y < p2.y ? -1 : points[2].y === p2.y ? 0 : 1;\n }\n path.push([\n 'M',\n p1.x - multSignX * correction,\n p1.y - multSignY * correction,\n ]);\n let i;\n for (i = 1; i < len; i++) {\n if (!p1.eq(p2)) {\n const midPoint = p1.midPointFrom(p2);\n // p1 is our bezier control point\n // midpoint is our endpoint\n // start point is p(i-1) value.\n path.push(['Q', p1.x, p1.y, midPoint.x, midPoint.y]);\n }\n p1 = points[i];\n if (i + 1 < points.length) {\n p2 = points[i + 1];\n }\n }\n if (manyPoints) {\n multSignX = p1.x > points[i - 2].x ? 1 : p1.x === points[i - 2].x ? 0 : -1;\n multSignY = p1.y > points[i - 2].y ? 1 : p1.y === points[i - 2].y ? 0 : -1;\n }\n path.push([\n 'L',\n p1.x + multSignX * correction,\n p1.y + multSignY * correction,\n ]);\n return path;\n};\n\n/**\n * Transform a path by transforming each segment.\n * it has to be a simplified path or it won't work.\n * WARNING: this depends from pathOffset for correct operation\n * @param {TSimplePathData} path fabricJS parsed and simplified path commands\n * @param {TMat2D} transform matrix that represent the transformation\n * @param {Point} [pathOffset] `Path.pathOffset`\n * @returns {TSimplePathData} the transformed path\n */\nexport const transformPath = (\n path: TSimplePathData,\n transform: TMat2D,\n pathOffset: Point,\n): TSimplePathData => {\n if (pathOffset) {\n transform = multiplyTransformMatrices(transform, [\n 1,\n 0,\n 0,\n 1,\n -pathOffset.x,\n -pathOffset.y,\n ]);\n }\n return path.map((pathSegment) => {\n const newSegment: TSimpleParsedCommand = [...pathSegment];\n for (let i = 1; i < pathSegment.length - 1; i += 2) {\n // TODO: is there a way to get around casting to any?\n const { x, y } = transformPoint(\n {\n x: pathSegment[i] as number,\n y: pathSegment[i + 1] as number,\n },\n transform,\n );\n newSegment[i] = x;\n newSegment[i + 1] = y;\n }\n return newSegment;\n });\n};\n\n/**\n * Returns an array of path commands to create a regular polygon\n * @param {number} numVertexes\n * @param {number} radius\n * @returns {TSimplePathData} An array of SVG path commands\n */\nexport const getRegularPolygonPath = (\n numVertexes: number,\n radius: number,\n): TSimplePathData => {\n const interiorAngle = (Math.PI * 2) / numVertexes;\n // rotationAdjustment rotates the path by 1/2 the interior angle so that the polygon always has a flat side on the bottom\n // This isn't strictly necessary, but it's how we tend to think of and expect polygons to be drawn\n let rotationAdjustment = -halfPI;\n if (numVertexes % 2 === 0) {\n rotationAdjustment += interiorAngle / 2;\n }\n const d = new Array(numVertexes + 1);\n for (let i = 0; i < numVertexes; i++) {\n const rad = i * interiorAngle + rotationAdjustment;\n const { x, y } = new Point(cos(rad), sin(rad)).scalarMultiply(radius);\n d[i] = [i === 0 ? 'M' : 'L', x, y];\n }\n d[numVertexes] = ['Z'];\n return d;\n};\n\n/**\n * Join path commands to go back to svg format\n * @param {TSimplePathData} pathData fabricJS parsed path commands\n * @param {number} fractionDigits number of fraction digits to \"leave\"\n * @return {String} joined path 'M 0 0 L 20 30'\n */\nexport const joinPath = (pathData: TSimplePathData, fractionDigits?: number) =>\n pathData\n .map((segment) => {\n return segment\n .map((arg, i) => {\n if (i === 0) return arg;\n return fractionDigits === undefined\n ? arg\n : toFixed(arg, fractionDigits);\n })\n .join(' ');\n })\n .join(' ');\n","/**\n * Returns random number between 2 specified ones.\n * @param {Number} min lower limit\n * @param {Number} max upper limit\n * @return {Number} random value (between min and max)\n */\nexport const getRandomInt = (min: number, max: number): number =>\n Math.floor(Math.random() * (max - min + 1)) + min;\n","import { CENTER, SCALE_X, SCALE_Y } from '../constants';\nimport type { FabricImage } from '../shapes/Image';\nimport type { FabricObject } from '../shapes/Object/FabricObject';\nimport type { TMat2D } from '../typedefs';\nimport { qrDecompose } from './misc/matrix';\n\ntype FabricObjectWithTransformMatrix = FabricObject & {\n transformMatrix?: TMat2D;\n};\n\n/**\n * This function is an helper for svg import. it decompose the transformMatrix\n * and assign properties to object.\n * untransformed coordinates\n * @private\n */\nconst _assignTransformMatrixProps = (\n object: FabricObjectWithTransformMatrix,\n) => {\n if (object.transformMatrix) {\n const { scaleX, scaleY, angle, skewX } = qrDecompose(\n object.transformMatrix,\n );\n object.flipX = false;\n object.flipY = false;\n object.set(SCALE_X, scaleX);\n object.set(SCALE_Y, scaleY);\n object.angle = angle;\n object.skewX = skewX;\n object.skewY = 0;\n }\n};\n\n/**\n * This function is an helper for svg import. it removes the transform matrix\n * and set to object properties that fabricjs can handle\n * @private\n * @param {Object} preserveAspectRatioOptions\n */\nexport const removeTransformMatrixForSvgParsing = (\n object: FabricObjectWithTransformMatrix,\n preserveAspectRatioOptions?: any,\n) => {\n let center = object._findCenterFromElement();\n if (object.transformMatrix) {\n _assignTransformMatrixProps(object);\n center = center.transform(object.transformMatrix);\n }\n delete object.transformMatrix;\n if (preserveAspectRatioOptions) {\n object.scaleX *= preserveAspectRatioOptions.scaleX;\n object.scaleY *= preserveAspectRatioOptions.scaleY;\n (object as FabricImage).cropX = preserveAspectRatioOptions.cropX;\n (object as FabricImage).cropY = preserveAspectRatioOptions.cropY;\n center.x += preserveAspectRatioOptions.offsetLeft;\n center.y += preserveAspectRatioOptions.offsetTop;\n object.width = preserveAspectRatioOptions.width;\n object.height = preserveAspectRatioOptions.height;\n }\n object.setPositionByOrigin(center, CENTER, CENTER);\n};\n","import type { FabricObject } from '../../shapes/Object/FabricObject';\nimport { sendObjectToPlane } from './planeChange';\nimport { Group } from '../../shapes/Group';\n/**\n * Merges 2 clip paths into one visually equal clip path\n *\n * **IMPORTANT**:\\\n * Does **NOT** clone the arguments, clone them proir if necessary.\n *\n * Creates a wrapper (group) that contains one clip path and is clipped by the other so content is kept where both overlap.\n * Use this method if both the clip paths may have nested clip paths of their own, so assigning one to the other's clip path property is not possible.\n *\n * In order to handle the `inverted` property we follow logic described in the following cases:\\\n * **(1)** both clip paths are inverted - the clip paths pass the inverted prop to the wrapper and loose it themselves.\\\n * **(2)** one is inverted and the other isn't - the wrapper shouldn't become inverted and the inverted clip path must clip the non inverted one to produce an identical visual effect.\\\n * **(3)** both clip paths are not inverted - wrapper and clip paths remain unchanged.\n *\n * @param {fabric.Object} c1\n * @param {fabric.Object} c2\n * @returns {fabric.Object} merged clip path\n */\nexport const mergeClipPaths = (c1: FabricObject, c2: FabricObject) => {\n let a = c1,\n b = c2;\n if (a.inverted && !b.inverted) {\n // case (2)\n a = c2;\n b = c1;\n }\n // `b` becomes `a`'s clip path so we transform `b` to `a` coordinate plane\n sendObjectToPlane(b, b.group?.calcTransformMatrix(), a.calcTransformMatrix());\n // assign the `inverted` prop to the wrapping group\n const inverted = a.inverted && b.inverted;\n if (inverted) {\n // case (1)\n a.inverted = b.inverted = false;\n }\n return new Group([a], { clipPath: b, inverted });\n};\n","// TODO this file needs to go away, cross browser style support is not fabricjs domain.\n\n/**\n * wrapper for setting element's style\n * @param {HTMLElement} element an HTMLElement\n * @param {Object} styles to apply to element\n */\nexport function setStyle(element: HTMLElement, styles: Record) {\n const elementStyle = element.style;\n if (!elementStyle) {\n return;\n }\n Object.entries(styles).forEach(([property, value]) =>\n elementStyle.setProperty(property, value),\n );\n}\n","import { getEnv, getFabricDocument } from '../../env';\nimport type { TSize } from '../../typedefs';\nimport { createCanvasElement } from '../../util/misc/dom';\nimport { setStyle } from '../../util/internals/dom_style';\nimport type { CSSDimensions } from './util';\nimport { makeElementUnselectable, setCSSDimensions } from './util';\nimport type { CanvasItem } from './StaticCanvasDOMManager';\nimport { StaticCanvasDOMManager } from './StaticCanvasDOMManager';\nimport { setCanvasDimensions } from './util';\nimport { NONE } from '../../constants';\n\nexport class CanvasDOMManager extends StaticCanvasDOMManager {\n upper: CanvasItem;\n container: HTMLDivElement;\n\n constructor(\n arg0?: string | HTMLCanvasElement,\n {\n allowTouchScrolling = false,\n containerClass = '',\n }: {\n allowTouchScrolling?: boolean;\n /**\n * @deprecated here only for backward compatibility\n */\n containerClass?: string;\n } = {},\n ) {\n super(arg0);\n const { el: lowerCanvasEl } = this.lower;\n const upperCanvasEl = this.createUpperCanvas();\n this.upper = { el: upperCanvasEl, ctx: upperCanvasEl.getContext('2d')! };\n this.applyCanvasStyle(lowerCanvasEl, {\n allowTouchScrolling,\n });\n this.applyCanvasStyle(upperCanvasEl, {\n allowTouchScrolling,\n styles: {\n position: 'absolute',\n left: '0',\n top: '0',\n },\n });\n const container = this.createContainerElement();\n container.classList.add(containerClass);\n if (lowerCanvasEl.parentNode) {\n lowerCanvasEl.parentNode.replaceChild(container, lowerCanvasEl);\n }\n container.append(lowerCanvasEl, upperCanvasEl);\n this.container = container;\n }\n\n protected createUpperCanvas() {\n const { el: lowerCanvasEl } = this.lower;\n const el = createCanvasElement();\n // we assign the same classname of the lowerCanvas\n el.className = lowerCanvasEl.className;\n // but then we remove the lower-canvas specific className\n el.classList.remove('lower-canvas');\n // we add the specific upper-canvas class\n el.classList.add('upper-canvas');\n el.setAttribute('data-fabric', 'top');\n el.style.cssText = lowerCanvasEl.style.cssText;\n el.setAttribute('draggable', 'true');\n return el;\n }\n\n protected createContainerElement() {\n const container = getFabricDocument().createElement('div');\n container.setAttribute('data-fabric', 'wrapper');\n setStyle(container, {\n position: 'relative',\n });\n makeElementUnselectable(container);\n return container;\n }\n\n /**\n * @private\n * @param {HTMLCanvasElement} element canvas element to apply styles on\n */\n protected applyCanvasStyle(\n element: HTMLCanvasElement,\n options: {\n allowTouchScrolling?: boolean;\n styles?: Record;\n },\n ) {\n const { styles, allowTouchScrolling } = options;\n setStyle(element, {\n ...styles,\n 'touch-action': allowTouchScrolling ? 'manipulation' : NONE,\n });\n makeElementUnselectable(element);\n }\n\n setDimensions(size: TSize, retinaScaling: number) {\n super.setDimensions(size, retinaScaling);\n const { el, ctx } = this.upper;\n setCanvasDimensions(el, ctx, size, retinaScaling);\n }\n\n setCSSDimensions(size: Partial): void {\n super.setCSSDimensions(size);\n setCSSDimensions(this.upper.el, size);\n setCSSDimensions(this.container, size);\n }\n\n cleanupDOM(size: TSize) {\n const container = this.container,\n { el: lowerCanvasEl } = this.lower,\n { el: upperCanvasEl } = this.upper;\n super.cleanupDOM(size);\n container.removeChild(upperCanvasEl);\n container.removeChild(lowerCanvasEl);\n if (container.parentNode) {\n container.parentNode.replaceChild(lowerCanvasEl, container);\n }\n }\n\n dispose() {\n super.dispose();\n getEnv().dispose(this.upper.el);\n // @ts-expect-error disposing\n delete this.upper;\n // @ts-expect-error disposing\n delete this.container;\n }\n}\n","import { dragHandler } from '../controls/drag';\nimport { getActionFromCorner } from '../controls/util';\nimport { Point } from '../Point';\nimport { FabricObject } from '../shapes/Object/FabricObject';\nimport type {\n CanvasEvents,\n ModifierKey,\n TOptionalModifierKey,\n TPointerEvent,\n Transform,\n} from '../EventTypeDefs';\nimport {\n addTransformToObject,\n saveObjectTransform,\n} from '../util/misc/objectTransforms';\nimport type { TCanvasSizeOptions } from './StaticCanvas';\nimport { StaticCanvas } from './StaticCanvas';\nimport { isCollection } from '../Collection';\nimport { isTransparent } from '../util/misc/isTransparent';\nimport type {\n TMat2D,\n TOriginX,\n TOriginY,\n TSize,\n TSVGReviver,\n} from '../typedefs';\nimport { degreesToRadians } from '../util/misc/radiansDegreesConversion';\nimport { getPointer, isTouchEvent } from '../util/dom_event';\nimport type { IText } from '../shapes/IText/IText';\nimport type { BaseBrush } from '../brushes/BaseBrush';\nimport { pick } from '../util/misc/pick';\nimport { sendPointToPlane } from '../util/misc/planeChange';\nimport { cos, createCanvasElement, sin } from '../util';\nimport { CanvasDOMManager } from './DOMManagers/CanvasDOMManager';\nimport {\n BOTTOM,\n CENTER,\n LEFT,\n MODIFIED,\n RESIZING,\n RIGHT,\n ROTATE,\n SCALE,\n SCALE_X,\n SCALE_Y,\n SKEW_X,\n SKEW_Y,\n TOP,\n} from '../constants';\nimport type { CanvasOptions } from './CanvasOptions';\nimport { canvasDefaults } from './CanvasOptions';\nimport { Intersection } from '../Intersection';\nimport { isActiveSelection } from '../util/typeAssertions';\n\nexport type TargetsInfo = {\n target?: FabricObject;\n subTargets: FabricObject[];\n};\n\nexport type TargetsInfoWithContainer = {\n // the target we think is the most continuing the selection action.\n // could be hoveredTarget or the currently selected object\n target?: FabricObject;\n // the nested targets under the pointer for container\n subTargets: FabricObject[];\n // the container for target, or target itself if there are no selectable nested targets\n container?: FabricObject;\n};\n\nexport type FullTargetsInfoWithContainer = TargetsInfoWithContainer & {\n // hoveredTarget\n currentTarget?: FabricObject;\n // the container for hoveredTarget, or container itself\n currentContainer?: FabricObject;\n // nested targets of current container\n currentSubTargets: FabricObject[];\n};\n\n/**\n * Canvas class\n * @class Canvas\n * @extends StaticCanvas\n * @tutorial {@link http://fabricjs.com/fabric-intro-part-1#canvas}\n *\n * @fires object:modified at the end of a transform\n * @fires object:rotating while an object is being rotated from the control\n * @fires object:scaling while an object is being scaled by controls\n * @fires object:moving while an object is being dragged\n * @fires object:skewing while an object is being skewed from the controls\n *\n * @fires before:transform before a transform is is started\n * @fires before:selection:cleared\n * @fires selection:cleared\n * @fires selection:updated\n * @fires selection:created\n *\n * @fires path:created after a drawing operation ends and the path is added\n * @fires mouse:down\n * @fires mouse:move\n * @fires mouse:up\n * @fires mouse:down:before on mouse down, before the inner fabric logic runs\n * @fires mouse:move:before on mouse move, before the inner fabric logic runs\n * @fires mouse:up:before on mouse up, before the inner fabric logic runs\n * @fires mouse:over\n * @fires mouse:out\n * @fires mouse:dblclick whenever a native dbl click event fires on the canvas.\n *\n * @fires dragover\n * @fires dragenter\n * @fires dragleave\n * @fires drag:enter object drag enter\n * @fires drag:leave object drag leave\n * @fires drop:before before drop event. Prepare for the drop event (same native event).\n * @fires drop\n * @fires drop:after after drop event. Run logic on canvas after event has been accepted/declined (same native event).\n * @example\n * let a: fabric.Object, b: fabric.Object;\n * let flag = false;\n * canvas.add(a, b);\n * a.on('drop:before', opt => {\n * // we want a to accept the drop even though it's below b in the stack\n * flag = this.canDrop(opt.e);\n * });\n * b.canDrop = function(e) {\n * !flag && this.draggableTextDelegate.canDrop(e);\n * }\n * b.on('dragover', opt => b.set('fill', opt.dropTarget === b ? 'pink' : 'black'));\n * a.on('drop', opt => {\n * opt.e.defaultPrevented // drop occurred\n * opt.didDrop // drop occurred on canvas\n * opt.target // drop target\n * opt.target !== a && a.set('text', 'I lost');\n * });\n * canvas.on('drop:after', opt => {\n * // inform user who won\n * if(!opt.e.defaultPrevented) {\n * // no winners\n * }\n * else if(!opt.didDrop) {\n * // my objects didn't win, some other lucky object\n * }\n * else {\n * // we have a winner it's opt.target!!\n * }\n * })\n *\n * @fires after:render at the end of the render process, receives the context in the callback\n * @fires before:render at start the render process, receives the context in the callback\n *\n * @fires contextmenu:before\n * @fires contextmenu\n * @example\n * let handler;\n * targets.forEach(target => {\n * target.on('contextmenu:before', opt => {\n * // decide which target should handle the event before canvas hijacks it\n * if (someCaseHappens && opt.targets.includes(target)) {\n * handler = target;\n * }\n * });\n * target.on('contextmenu', opt => {\n * // do something fantastic\n * });\n * });\n * canvas.on('contextmenu', opt => {\n * if (!handler) {\n * // no one takes responsibility, it's always left to me\n * // let's show them how it's done!\n * }\n * });\n *\n */\nexport class SelectableCanvas\n extends StaticCanvas\n implements Omit\n{\n declare _objects: FabricObject[];\n\n // transform config\n declare uniformScaling: boolean;\n declare uniScaleKey: TOptionalModifierKey;\n declare centeredScaling: boolean;\n declare centeredRotation: boolean;\n declare centeredKey: TOptionalModifierKey;\n declare altActionKey: TOptionalModifierKey;\n\n // selection config\n declare selection: boolean;\n declare selectionKey: TOptionalModifierKey | ModifierKey[];\n declare altSelectionKey: TOptionalModifierKey;\n declare selectionColor: string;\n declare selectionDashArray: number[];\n declare selectionBorderColor: string;\n declare selectionLineWidth: number;\n declare selectionFullyContained: boolean;\n\n // cursors\n declare hoverCursor: CSSStyleDeclaration['cursor'];\n declare moveCursor: CSSStyleDeclaration['cursor'];\n declare defaultCursor: CSSStyleDeclaration['cursor'];\n declare freeDrawingCursor: CSSStyleDeclaration['cursor'];\n declare notAllowedCursor: CSSStyleDeclaration['cursor'];\n\n declare containerClass: string;\n\n // target find config\n declare perPixelTargetFind: boolean;\n declare targetFindTolerance: number;\n declare skipTargetFind: boolean;\n\n /**\n * When true, mouse events on canvas (mousedown/mousemove/mouseup) result in free drawing.\n * After mousedown, mousemove creates a shape,\n * and then mouseup finalizes it and adds an instance of `fabric.Path` onto canvas.\n * @tutorial {@link http://fabricjs.com/fabric-intro-part-4#free_drawing}\n * @type Boolean\n */\n declare isDrawingMode: boolean;\n\n declare preserveObjectStacking: boolean;\n\n // event config\n declare stopContextMenu: boolean;\n declare fireRightClick: boolean;\n declare fireMiddleClick: boolean;\n\n /**\n * Keep track of the hovered target\n * @type FabricObject | null\n * @private\n */\n declare _hoveredTarget?: FabricObject;\n\n /**\n * hold the list of nested targets hovered\n * @type FabricObject[]\n * @private\n */\n _hoveredTargets: FabricObject[] = [];\n\n /**\n * hold the list of objects to render\n * @type FabricObject[]\n * @private\n */\n _objectsToRender?: FabricObject[];\n\n /**\n * hold a reference to a data structure that contains information\n * on the current on going transform\n * @type\n * @private\n */\n _currentTransform: Transform | null = null;\n\n /**\n * hold a reference to a data structure used to track the selection\n * box on canvas drag\n * on the current on going transform\n * x, y, deltaX and deltaY are in scene plane\n * @type\n * @private\n */\n protected _groupSelector: {\n x: number;\n y: number;\n deltaX: number;\n deltaY: number;\n } | null = null;\n\n /**\n * internal flag used to understand if the context top requires a cleanup\n * in case this is true, the contextTop will be cleared at the next render\n * @type boolean\n * @private\n */\n contextTopDirty = false;\n\n /**\n * During a mouse event we may need the pointer multiple times in multiple functions.\n * _scenePoint holds a reference to the pointer in fabricCanvas/design coordinates that is valid for the event\n * lifespan. Every fabricJS mouse event create and delete the cache every time\n * We do this because there are some HTML DOM inspection functions to get the actual pointer coordinates\n * @type {Point}\n */\n declare protected _scenePoint?: Point;\n\n /**\n * During a mouse event we may need the pointer multiple times in multiple functions.\n * _viewportPoint holds a reference to the pointer in html coordinates that is valid for the event\n * lifespan. Every fabricJS mouse event create and delete the cache every time\n * We do this because there are some HTML DOM inspection functions to get the actual pointer coordinates\n * @type {Point}\n */\n declare protected _viewportPoint?: Point;\n\n /**\n * Holds the informations we cache during an event lifespan\n * This data is needed many times during an event and we want to avoid to recalculate it\n * multuple times.\n */\n declare protected _targetInfo: FullTargetsInfoWithContainer | undefined;\n\n static ownDefaults = canvasDefaults;\n\n static getDefaults(): Record {\n return { ...super.getDefaults(), ...SelectableCanvas.ownDefaults };\n }\n\n declare elements: CanvasDOMManager;\n get upperCanvasEl() {\n return this.elements.upper?.el;\n }\n get contextTop() {\n return this.elements.upper?.ctx;\n }\n get wrapperEl() {\n return this.elements.container;\n }\n declare private pixelFindCanvasEl: HTMLCanvasElement;\n declare private pixelFindContext: CanvasRenderingContext2D;\n\n declare protected _isCurrentlyDrawing: boolean;\n declare freeDrawingBrush?: BaseBrush;\n declare _activeObject?: FabricObject;\n\n protected initElements(el?: string | HTMLCanvasElement) {\n this.elements = new CanvasDOMManager(el, {\n allowTouchScrolling: this.allowTouchScrolling,\n containerClass: this.containerClass,\n });\n this._createCacheCanvas();\n }\n\n /**\n * @private\n * @param {FabricObject} obj Object that was added\n */\n _onObjectAdded(obj: FabricObject) {\n this._objectsToRender = undefined;\n super._onObjectAdded(obj);\n }\n\n /**\n * @private\n * @param {FabricObject} obj Object that was removed\n */\n _onObjectRemoved(obj: FabricObject) {\n this._objectsToRender = undefined;\n // removing active object should fire \"selection:cleared\" events\n if (obj === this._activeObject) {\n this.fire('before:selection:cleared', { deselected: [obj] });\n this._discardActiveObject();\n this.fire('selection:cleared', { deselected: [obj] });\n obj.fire('deselected', {\n target: obj,\n });\n }\n if (obj === this._hoveredTarget) {\n this._hoveredTarget = undefined;\n this._hoveredTargets = [];\n }\n super._onObjectRemoved(obj);\n }\n\n _onStackOrderChanged() {\n this._objectsToRender = undefined;\n super._onStackOrderChanged();\n }\n\n /**\n * Divides objects in two groups, one to render immediately\n * and one to render as activeGroup.\n * @return {Array} objects to render immediately and pushes the other in the activeGroup.\n */\n _chooseObjectsToRender(): FabricObject[] {\n const activeObject = this._activeObject;\n return !this.preserveObjectStacking && activeObject\n ? this._objects\n .filter((object) => !object.group && object !== activeObject)\n .concat(activeObject)\n : this._objects;\n }\n\n /**\n * Renders both the top canvas and the secondary container canvas.\n */\n renderAll() {\n this.cancelRequestedRender();\n if (this.destroyed) {\n return;\n }\n if (this.contextTopDirty && !this._groupSelector && !this.isDrawingMode) {\n this.clearContext(this.contextTop);\n this.contextTopDirty = false;\n }\n if (this.hasLostContext) {\n this.renderTopLayer(this.contextTop);\n this.hasLostContext = false;\n }\n !this._objectsToRender &&\n (this._objectsToRender = this._chooseObjectsToRender());\n this.renderCanvas(this.getContext(), this._objectsToRender);\n }\n\n /**\n * text selection is rendered by the active text instance during the rendering cycle\n */\n renderTopLayer(ctx: CanvasRenderingContext2D): void {\n ctx.save();\n if (this.isDrawingMode && this._isCurrentlyDrawing) {\n this.freeDrawingBrush && this.freeDrawingBrush._render();\n this.contextTopDirty = true;\n }\n // we render the top context - last object\n if (this.selection && this._groupSelector) {\n this._drawSelection(ctx);\n this.contextTopDirty = true;\n }\n ctx.restore();\n }\n\n /**\n * Method to render only the top canvas.\n * Also used to render the group selection box.\n * Does not render text selection.\n */\n renderTop() {\n const ctx = this.contextTop;\n this.clearContext(ctx);\n this.renderTopLayer(ctx);\n // todo: how do i know if the after:render is for the top or normal contex?\n this.fire('after:render', { ctx });\n }\n\n /**\n * Set the canvas tolerance value for pixel taret find.\n * Use only integer numbers.\n * @private\n */\n setTargetFindTolerance(value: number) {\n value = Math.round(value);\n this.targetFindTolerance = value;\n const retina = this.getRetinaScaling();\n const size = Math.ceil((value * 2 + 1) * retina);\n this.pixelFindCanvasEl.width = this.pixelFindCanvasEl.height = size;\n this.pixelFindContext.scale(retina, retina);\n }\n\n /**\n * Returns true if object is transparent at a certain location\n * Clarification: this is `is target transparent at location X or are controls there`\n * @TODO this seems dumb that we treat controls with transparency. we can find controls\n * programmatically without painting them, the cache canvas optimization is always valid\n * @param {FabricObject} target Object to check\n * @param {Number} x Left coordinate in viewport space\n * @param {Number} y Top coordinate in viewport space\n * @return {Boolean}\n */\n isTargetTransparent(target: FabricObject, x: number, y: number): boolean {\n const tolerance = this.targetFindTolerance;\n const ctx = this.pixelFindContext;\n this.clearContext(ctx);\n ctx.save();\n ctx.translate(-x + tolerance, -y + tolerance);\n ctx.transform(...this.viewportTransform);\n const selectionBgc = target.selectionBackgroundColor;\n target.selectionBackgroundColor = '';\n target.render(ctx);\n target.selectionBackgroundColor = selectionBgc;\n ctx.restore();\n // our canvas is square, and made around tolerance.\n // so tolerance in this case also represent the center of the canvas.\n const enhancedTolerance = Math.round(tolerance * this.getRetinaScaling());\n return isTransparent(\n ctx,\n enhancedTolerance,\n enhancedTolerance,\n enhancedTolerance,\n );\n }\n\n /**\n * takes an event and determines if selection key has been pressed\n * @private\n * @param {TPointerEvent} e Event object\n */\n _isSelectionKeyPressed(e: TPointerEvent): boolean {\n const sKey = this.selectionKey;\n if (!sKey) {\n return false;\n }\n if (Array.isArray(sKey)) {\n return !!sKey.find((key) => !!key && e[key] === true);\n } else {\n return e[sKey];\n }\n }\n\n /**\n * @private\n * @param {TPointerEvent} e Event object\n * @param {FabricObject} target\n */\n _shouldClearSelection(\n e: TPointerEvent,\n target?: FabricObject,\n ): target is undefined {\n const activeObjects = this.getActiveObjects(),\n activeObject = this._activeObject;\n\n return !!(\n !target ||\n (target &&\n activeObject &&\n activeObjects.length > 1 &&\n activeObjects.indexOf(target) === -1 &&\n activeObject !== target &&\n !this._isSelectionKeyPressed(e)) ||\n (target && !target.evented) ||\n (target && !target.selectable && activeObject && activeObject !== target)\n );\n }\n\n /**\n * This method will take in consideration a modifier key pressed and the control we are\n * about to drag, and try to guess the anchor point ( origin ) of the transormation.\n * This should be really in the realm of controls, and we should remove specific code for legacy\n * embedded actions.\n * @TODO this probably deserve discussion/rediscovery and change/refactor\n * @private\n * @deprecated\n * @param {FabricObject} target\n * @param {string} action\n * @param {boolean} altKey\n * @returns {boolean} true if the transformation should be centered\n */\n private _shouldCenterTransform(\n target: FabricObject,\n action: string,\n modifierKeyPressed: boolean,\n ) {\n if (!target) {\n return;\n }\n\n let centerTransform;\n\n if (\n action === SCALE ||\n action === SCALE_X ||\n action === SCALE_Y ||\n action === RESIZING\n ) {\n centerTransform = this.centeredScaling || target.centeredScaling;\n } else if (action === ROTATE) {\n centerTransform = this.centeredRotation || target.centeredRotation;\n }\n\n return centerTransform ? !modifierKeyPressed : modifierKeyPressed;\n }\n\n /**\n * Given the control clicked, determine the origin of the transform.\n * This is bad because controls can totally have custom names\n * should disappear before release 4.0\n * @private\n * @deprecated\n */\n _getOriginFromCorner(\n target: FabricObject,\n controlName: string,\n ): { x: TOriginX; y: TOriginY } {\n const origin = {\n x: target.originX,\n y: target.originY,\n };\n\n if (!controlName) {\n return origin;\n }\n\n // is a left control ?\n if (['ml', 'tl', 'bl'].includes(controlName)) {\n origin.x = RIGHT;\n // is a right control ?\n } else if (['mr', 'tr', 'br'].includes(controlName)) {\n origin.x = LEFT;\n }\n // is a top control ?\n if (['tl', 'mt', 'tr'].includes(controlName)) {\n origin.y = BOTTOM;\n // is a bottom control ?\n } else if (['bl', 'mb', 'br'].includes(controlName)) {\n origin.y = TOP;\n }\n return origin;\n }\n\n /**\n * @private\n * @param {Event} e Event object\n * @param {FabricObject} target\n * @param {boolean} [alreadySelected] pass true to setup the active control\n */\n _setupCurrentTransform(\n e: TPointerEvent,\n target: FabricObject,\n alreadySelected: boolean,\n ): void {\n const pointer = target.group\n ? // transform pointer to target's containing coordinate plane\n sendPointToPlane(\n this.getScenePoint(e),\n undefined,\n target.group.calcTransformMatrix(),\n )\n : this.getScenePoint(e);\n const { key: corner = '', control } = target.getActiveControl() || {},\n actionHandler =\n alreadySelected && control\n ? control.getActionHandler(e, target, control)?.bind(control)\n : dragHandler,\n action = getActionFromCorner(alreadySelected, corner, e, target),\n altKey = e[this.centeredKey as ModifierKey],\n origin = this._shouldCenterTransform(target, action, altKey)\n ? ({ x: CENTER, y: CENTER } as const)\n : this._getOriginFromCorner(target, corner),\n /**\n * relative to target's containing coordinate plane\n * both agree on every point\n **/\n transform: Transform = {\n target: target,\n action,\n actionHandler,\n actionPerformed: false,\n corner,\n scaleX: target.scaleX,\n scaleY: target.scaleY,\n skewX: target.skewX,\n skewY: target.skewY,\n offsetX: pointer.x - target.left,\n offsetY: pointer.y - target.top,\n originX: origin.x,\n originY: origin.y,\n ex: pointer.x,\n ey: pointer.y,\n lastX: pointer.x,\n lastY: pointer.y,\n theta: degreesToRadians(target.angle),\n width: target.width,\n height: target.height,\n shiftKey: e.shiftKey,\n altKey,\n original: {\n ...saveObjectTransform(target),\n originX: origin.x,\n originY: origin.y,\n },\n };\n\n this._currentTransform = transform;\n\n this.fire('before:transform', {\n e,\n transform,\n });\n }\n\n /**\n * Set the cursor type of the canvas element\n * @param {String} value Cursor type of the canvas element.\n * @see http://www.w3.org/TR/css3-ui/#cursor\n */\n setCursor(value: CSSStyleDeclaration['cursor']): void {\n this.upperCanvasEl.style.cursor = value;\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx to draw the selection on\n */\n _drawSelection(ctx: CanvasRenderingContext2D): void {\n const { x, y, deltaX, deltaY } = this._groupSelector!,\n start = new Point(x, y).transform(this.viewportTransform),\n extent = new Point(x + deltaX, y + deltaY).transform(\n this.viewportTransform,\n ),\n strokeOffset = this.selectionLineWidth / 2;\n let minX = Math.min(start.x, extent.x),\n minY = Math.min(start.y, extent.y),\n maxX = Math.max(start.x, extent.x),\n maxY = Math.max(start.y, extent.y);\n\n if (this.selectionColor) {\n ctx.fillStyle = this.selectionColor;\n ctx.fillRect(minX, minY, maxX - minX, maxY - minY);\n }\n\n if (!this.selectionLineWidth || !this.selectionBorderColor) {\n return;\n }\n ctx.lineWidth = this.selectionLineWidth;\n ctx.strokeStyle = this.selectionBorderColor;\n\n minX += strokeOffset;\n minY += strokeOffset;\n maxX -= strokeOffset;\n maxY -= strokeOffset;\n // selection border\n // @TODO: is _setLineDash still necessary on modern canvas?\n FabricObject.prototype._setLineDash.call(\n this,\n ctx,\n this.selectionDashArray,\n );\n ctx.strokeRect(minX, minY, maxX - minX, maxY - minY);\n }\n\n /**\n * This function is in charge of deciding which is the object that is the current target of an interaction event.\n * For interaction event we mean a pointer related action on the canvas.\n * Which is the\n * 11/09/2018 TODO: would be cool if findTarget could discern between being a full target\n * or the outside part of the corner.\n * @param {Event} e mouse event\n * @return {TargetsInfoWithContainer} the target found\n */\n findTarget(e: TPointerEvent): FullTargetsInfoWithContainer {\n // this._targetInfo is cached by _cacheTransformEventData\n // and destroyed by _resetTransformEventData\n if (this._targetInfo) {\n return this._targetInfo;\n }\n\n if (this.skipTargetFind) {\n return {\n subTargets: [],\n currentSubTargets: [],\n };\n }\n\n const pointer = this.getScenePoint(e),\n activeObject = this._activeObject,\n aObjects = this.getActiveObjects(),\n targetInfo = this.searchPossibleTargets(this._objects, pointer);\n\n const {\n subTargets: currentSubTargets,\n container: currentContainer,\n target: currentTarget,\n } = targetInfo;\n\n const fullTargetInfo: FullTargetsInfoWithContainer = {\n ...targetInfo,\n currentSubTargets,\n currentContainer,\n currentTarget,\n };\n\n // simplest case no active object, return a new target\n if (!activeObject) {\n return fullTargetInfo;\n }\n\n // check pointer is over active selection and possibly perform `subTargetCheck`\n const activeObjectTargetInfo: FullTargetsInfoWithContainer = {\n ...this.searchPossibleTargets([activeObject], pointer),\n currentSubTargets,\n currentContainer,\n currentTarget,\n };\n\n const activeObjectControl = activeObject.findControl(\n this.getViewportPoint(e),\n isTouchEvent(e),\n );\n\n // we are clicking exactly the control of an active object, shortcut to that object.\n if (activeObjectControl) {\n return {\n ...activeObjectTargetInfo,\n target: activeObject, // we override target in case we are in the outside part of the corner.\n };\n }\n\n // in case we are over the active object\n if (activeObjectTargetInfo.target) {\n if (aObjects.length > 1) {\n // in case of active selection and target hit over the activeSelection, just exit\n // TODO Verify if we need to override target with container\n return activeObjectTargetInfo;\n }\n // from here onward not an active selection, just an activeOject that maybe is a group\n\n // preserveObjectStacking is false, so activeObject is drawn on top, just return activeObject\n if (!this.preserveObjectStacking) {\n // TODO Verify if we need to override target with container\n return activeObjectTargetInfo;\n }\n\n // In case we are in preserveObjectStacking ( selection in stack )\n // there is the possibility to force with `altSelectionKey` to return the activeObject\n // from any point in the stack, even if we have another object completely on top of it.\n if (\n this.preserveObjectStacking &&\n e[this.altSelectionKey as ModifierKey]\n ) {\n // TODO Verify if we need to override target with container\n return activeObjectTargetInfo;\n }\n }\n\n // we have an active object, but we ruled out it being our target in any way.\n return fullTargetInfo;\n }\n\n /**\n * Checks if the point is inside the object selection area including padding\n * @param {FabricObject} obj Object to test against\n * @param {Object} [pointer] point in scene coordinates\n * @return {Boolean} true if point is contained within an area of given object\n * @private\n */\n private _pointIsInObjectSelectionArea(obj: FabricObject, point: Point) {\n // getCoords will already take care of group de-nesting\n let coords = obj.getCoords();\n const viewportZoom = this.getZoom();\n const padding = obj.padding / viewportZoom;\n if (padding) {\n const [tl, tr, br, bl] = coords;\n // what is the angle of the object?\n // we could use getTotalAngle, but is way easier to look at it\n // from how coords are oriented, since if something went wrong\n // at least we are consistent.\n const angleRadians = Math.atan2(tr.y - tl.y, tr.x - tl.x),\n cosP = cos(angleRadians) * padding,\n sinP = sin(angleRadians) * padding,\n cosPSinP = cosP + sinP,\n cosPMinusSinP = cosP - sinP;\n\n coords = [\n new Point(tl.x - cosPMinusSinP, tl.y - cosPSinP),\n new Point(tr.x + cosPSinP, tr.y - cosPMinusSinP),\n new Point(br.x + cosPMinusSinP, br.y + cosPSinP),\n new Point(bl.x - cosPSinP, bl.y + cosPMinusSinP),\n ];\n // in case of padding we calculate the new coords on the fly.\n // otherwise we have to maintain 2 sets of coordinates for everything.\n // we can reiterate on storing them.\n // if this is slow, for now the semplification is large and doesn't impact\n // rendering.\n // the idea behind this is that outside target check we don't need ot know\n // where those coords are\n }\n return Intersection.isPointInPolygon(point, coords);\n }\n\n /**\n * Checks point is inside the object selection condition. Either area with padding\n * or over pixels if perPixelTargetFind is enabled\n * @param {FabricObject} obj Object to test against\n * @param {Point} pointer point from scene.\n * @return {Boolean} true if point is contained within an area of given object\n * @private\n */\n _checkTarget(obj: FabricObject, pointer: Point): boolean {\n if (\n obj &&\n obj.visible &&\n obj.evented &&\n this._pointIsInObjectSelectionArea(obj, pointer)\n ) {\n if (\n (this.perPixelTargetFind || obj.perPixelTargetFind) &&\n !(obj as unknown as IText).isEditing\n ) {\n const viewportPoint = pointer.transform(this.viewportTransform);\n if (!this.isTargetTransparent(obj, viewportPoint.x, viewportPoint.y)) {\n return true;\n }\n } else {\n return true;\n }\n }\n return false;\n }\n\n /**\n * Given an array of objects search possible targets under the pointer position\n * Returns an\n * @param {Array} objects objects array to look into\n * @param {Object} pointer x,y object of point of scene coordinates we want to check.\n * @param {Object} subTargets If passed, subtargets will be collected inside the array\n * @return {TargetsInfo} **top most object from given `objects`** that contains pointer\n * @private\n */\n _searchPossibleTargets(\n objects: FabricObject[],\n pointer: Point,\n subTargets: FabricObject[],\n ): TargetsInfo {\n let i = objects.length;\n // Do not check for currently grouped objects, since we check the parent group itself.\n // until we call this function specifically to search inside the activeGroup\n while (i--) {\n const target = objects[i];\n if (this._checkTarget(target, pointer)) {\n if (isCollection(target) && target.subTargetCheck) {\n const { target: subTarget } = this._searchPossibleTargets(\n target._objects,\n pointer,\n subTargets,\n );\n subTarget && subTargets.push(subTarget);\n }\n return {\n target,\n subTargets,\n };\n }\n }\n return {\n subTargets: [],\n };\n }\n\n /**\n * Search inside an objects array the fiurst object that contains pointer\n * Collect subTargets of that object inside the subTargets array passed as parameter\n * @param {FabricObject[]} objects objects array to look into\n * @param {Point} pointer coordinates from viewport to check.\n * @return {FabricObject} **top most object on screen** that contains pointer\n */\n searchPossibleTargets(\n objects: FabricObject[],\n pointer: Point,\n ): TargetsInfoWithContainer {\n const targetInfo: TargetsInfoWithContainer = this._searchPossibleTargets(\n objects,\n pointer,\n [],\n );\n\n // outermost target is the container.\n targetInfo.container = targetInfo.target;\n const { container, subTargets } = targetInfo;\n\n if (\n container &&\n isCollection(container) &&\n container.interactive &&\n subTargets[0]\n ) {\n /** subTargets[0] is the innermost nested target, but it could be inside non interactive groups\n * and so not a possible selection target.\n * We loop the array from the end that is outermost innertarget.\n */\n for (let i = subTargets.length - 1; i > 0; i--) {\n const t = subTargets[i];\n if (!(isCollection(t) && t.interactive)) {\n // one of the subtargets was not interactive. that is the last subtarget we can return.\n // we can't dig more deep;\n targetInfo.target = t;\n return targetInfo;\n }\n }\n targetInfo.target = subTargets[0];\n return targetInfo;\n }\n\n return targetInfo;\n }\n\n /**\n * @returns point existing in the same plane as the {@link HTMLCanvasElement},\n * `(0, 0)` being the top left corner of the {@link HTMLCanvasElement}.\n * This means that changes to the {@link viewportTransform} do not change the values of the point\n * and it remains unchanged from the viewer's perspective.\n *\n * @example\n * const scenePoint = sendPointToPlane(\n * this.getViewportPoint(e),\n * undefined,\n * canvas.viewportTransform\n * );\n *\n */\n getViewportPoint(e: TPointerEvent) {\n if (this._viewportPoint) {\n return this._viewportPoint;\n }\n return this._getPointerImpl(e, true);\n }\n\n /**\n * @returns point existing in the scene (the same plane as the plane {@link FabricObject#getCenterPoint} exists in).\n * This means that changes to the {@link viewportTransform} do not change the values of the point,\n * however, from the viewer's perspective, the point is changed.\n *\n * @example\n * const viewportPoint = sendPointToPlane(\n * this.getScenePoint(e),\n * canvas.viewportTransform\n * );\n *\n */\n getScenePoint(e: TPointerEvent) {\n if (this._scenePoint) {\n return this._scenePoint;\n }\n return this._getPointerImpl(e);\n }\n\n /**\n * Returns pointer relative to canvas.\n *\n * Use {@link getViewportPoint} or {@link getScenePoint} instead.\n *\n * @param {Event} e\n * @param {Boolean} [fromViewport] whether to return the point from the viewport or in the scene\n * @return {Point}\n */\n protected _getPointerImpl(e: TPointerEvent, fromViewport = false): Point {\n const upperCanvasEl = this.upperCanvasEl,\n bounds = upperCanvasEl.getBoundingClientRect();\n let pointer = getPointer(e),\n boundsWidth = bounds.width || 0,\n boundsHeight = bounds.height || 0;\n\n if (!boundsWidth || !boundsHeight) {\n if (TOP in bounds && BOTTOM in bounds) {\n boundsHeight = Math.abs(bounds.top - bounds.bottom);\n }\n if (RIGHT in bounds && LEFT in bounds) {\n boundsWidth = Math.abs(bounds.right - bounds.left);\n }\n }\n\n this.calcOffset();\n pointer.x = pointer.x - this._offset.left;\n pointer.y = pointer.y - this._offset.top;\n if (!fromViewport) {\n pointer = sendPointToPlane(pointer, undefined, this.viewportTransform);\n }\n\n const retinaScaling = this.getRetinaScaling();\n if (retinaScaling !== 1) {\n pointer.x /= retinaScaling;\n pointer.y /= retinaScaling;\n }\n\n // If bounds are not available (i.e. not visible), do not apply scale.\n const cssScale =\n boundsWidth === 0 || boundsHeight === 0\n ? new Point(1, 1)\n : new Point(\n upperCanvasEl.width / boundsWidth,\n upperCanvasEl.height / boundsHeight,\n );\n\n return pointer.multiply(cssScale);\n }\n\n /**\n * Internal use only\n * @protected\n */\n protected _setDimensionsImpl(\n dimensions: TSize,\n options?: TCanvasSizeOptions,\n ) {\n // @ts-expect-error this method exists in the subclass - should be moved or declared as abstract\n this._resetTransformEventData();\n super._setDimensionsImpl(dimensions, options);\n if (this._isCurrentlyDrawing) {\n this.freeDrawingBrush &&\n this.freeDrawingBrush._setBrushStyles(this.contextTop);\n }\n }\n\n protected _createCacheCanvas() {\n this.pixelFindCanvasEl = createCanvasElement();\n this.pixelFindContext = this.pixelFindCanvasEl.getContext('2d', {\n willReadFrequently: true,\n })!;\n this.setTargetFindTolerance(this.targetFindTolerance);\n }\n\n /**\n * Returns context of top canvas where interactions are drawn\n * @returns {CanvasRenderingContext2D}\n */\n getTopContext(): CanvasRenderingContext2D {\n return this.elements.upper.ctx;\n }\n\n /**\n * Returns context of canvas where object selection is drawn\n * @alias\n * @return {CanvasRenderingContext2D}\n */\n getSelectionContext(): CanvasRenderingContext2D {\n return this.elements.upper.ctx;\n }\n\n /**\n * Returns <canvas> element on which object selection is drawn\n * @return {HTMLCanvasElement}\n */\n getSelectionElement(): HTMLCanvasElement {\n return this.elements.upper.el;\n }\n\n /**\n * Returns currently active object\n * @return {FabricObject | null} active object\n */\n getActiveObject(): FabricObject | undefined {\n return this._activeObject;\n }\n\n /**\n * Returns an array with the current selected objects\n * @return {FabricObject[]} active objects array\n */\n getActiveObjects(): FabricObject[] {\n const active = this._activeObject;\n return isActiveSelection(active)\n ? active.getObjects()\n : active\n ? [active]\n : [];\n }\n\n /**\n * @private\n * Compares the old activeObject with the current one and fires correct events\n * @param {FabricObject[]} oldObjects old activeObject\n * @param {TPointerEvent} e mouse event triggering the selection events\n */\n _fireSelectionEvents(oldObjects: FabricObject[], e?: TPointerEvent) {\n let somethingChanged = false,\n invalidate = false;\n const objects = this.getActiveObjects(),\n added: FabricObject[] = [],\n removed: FabricObject[] = [];\n\n oldObjects.forEach((target) => {\n if (!objects.includes(target)) {\n somethingChanged = true;\n target.fire('deselected', {\n e,\n target,\n });\n removed.push(target);\n }\n });\n\n objects.forEach((target) => {\n if (!oldObjects.includes(target)) {\n somethingChanged = true;\n target.fire('selected', {\n e,\n target,\n });\n added.push(target);\n }\n });\n\n if (oldObjects.length > 0 && objects.length > 0) {\n invalidate = true;\n somethingChanged &&\n this.fire('selection:updated', {\n e,\n selected: added,\n deselected: removed,\n });\n } else if (objects.length > 0) {\n invalidate = true;\n this.fire('selection:created', {\n e,\n selected: added,\n });\n } else if (oldObjects.length > 0) {\n invalidate = true;\n this.fire('selection:cleared', {\n e,\n deselected: removed,\n });\n }\n invalidate && (this._objectsToRender = undefined);\n }\n\n /**\n * Sets given object as the only active object on canvas\n * @param {FabricObject} object Object to set as an active one\n * @param {TPointerEvent} [e] Event (passed along when firing \"object:selected\")\n * @return {Boolean} true if the object has been selected\n */\n setActiveObject(object: FabricObject, e?: TPointerEvent) {\n // we can't inline this, since _setActiveObject will change what getActiveObjects returns\n const currentActives = this.getActiveObjects();\n const selected = this._setActiveObject(object, e);\n this._fireSelectionEvents(currentActives, e);\n return selected;\n }\n\n /**\n * This is supposed to be equivalent to setActiveObject but without firing\n * any event. There is commitment to have this stay this way.\n * This is the functional part of setActiveObject.\n * @param {Object} object to set as active\n * @param {Event} [e] Event (passed along when firing \"object:selected\")\n * @return {Boolean} true if the object has been selected\n */\n _setActiveObject(object: FabricObject, e?: TPointerEvent) {\n const prevActiveObject = this._activeObject;\n if (prevActiveObject === object) {\n return false;\n }\n // after calling this._discardActiveObject, this,_activeObject could be undefined\n if (!this._discardActiveObject(e, object) && this._activeObject) {\n // refused to deselect\n return false;\n }\n if (object.onSelect({ e })) {\n return false;\n }\n\n this._activeObject = object;\n\n if (isActiveSelection(object) && prevActiveObject !== object) {\n object.set('canvas', this);\n }\n object.setCoords();\n\n return true;\n }\n\n /**\n * This is supposed to be equivalent to discardActiveObject but without firing\n * any selection events ( can still fire object transformation events ). There is commitment to have this stay this way.\n * This is the functional part of discardActiveObject.\n * @param {Event} [e] Event (passed along when firing \"object:deselected\")\n * @param {Object} object the next object to set as active, reason why we are discarding this\n * @return {Boolean} true if the active object has been discarded\n */\n _discardActiveObject(\n e?: TPointerEvent,\n object?: FabricObject,\n ): this is { _activeObject: undefined } {\n const obj = this._activeObject;\n if (obj) {\n // onDeselect return TRUE to cancel selection;\n if (obj.onDeselect({ e, object })) {\n return false;\n }\n if (this._currentTransform && this._currentTransform.target === obj) {\n this.endCurrentTransform(e);\n }\n if (isActiveSelection(obj) && obj === this._hoveredTarget) {\n this._hoveredTarget = undefined;\n }\n this._activeObject = undefined;\n return true;\n }\n return false;\n }\n\n /**\n * Discards currently active object and fire events. If the function is called by fabric\n * as a consequence of a mouse event, the event is passed as a parameter and\n * sent to the fire function for the custom events. When used as a method the\n * e param does not have any application.\n * @param {event} e\n * @return {Boolean} true if the active object has been discarded\n */\n discardActiveObject(e?: TPointerEvent): this is { _activeObject: undefined } {\n const currentActives = this.getActiveObjects(),\n activeObject = this.getActiveObject();\n if (currentActives.length) {\n this.fire('before:selection:cleared', {\n e,\n deselected: [activeObject!],\n });\n }\n const discarded = this._discardActiveObject(e);\n this._fireSelectionEvents(currentActives, e);\n return discarded;\n }\n\n /**\n * End the current transform.\n * You don't usually need to call this method unless you are interrupting a user initiated transform\n * because of some other event ( a press of key combination, or something that block the user UX )\n * @param {Event} [e] send the mouse event that generate the finalize down, so it can be used in the event\n */\n endCurrentTransform(e?: TPointerEvent) {\n const transform = this._currentTransform;\n this._finalizeCurrentTransform(e);\n if (transform && transform.target) {\n // this could probably go inside _finalizeCurrentTransform\n transform.target.isMoving = false;\n }\n this._currentTransform = null;\n }\n\n /**\n * @private\n * @param {Event} e send the mouse event that generate the finalize down, so it can be used in the event\n */\n _finalizeCurrentTransform(e?: TPointerEvent) {\n const transform = this._currentTransform!,\n target = transform.target,\n options = {\n e,\n target,\n transform,\n action: transform.action,\n };\n\n if (target._scaling) {\n target._scaling = false;\n }\n\n target.setCoords();\n\n if (transform.actionPerformed) {\n this.fire('object:modified', options);\n target.fire(MODIFIED, options);\n }\n }\n\n /**\n * Sets viewport transformation of this canvas instance\n * @param {Array} vpt a Canvas 2D API transform matrix\n */\n setViewportTransform(vpt: TMat2D) {\n super.setViewportTransform(vpt);\n const activeObject = this._activeObject;\n if (activeObject) {\n activeObject.setCoords();\n }\n }\n\n /**\n * @override clears active selection ref and interactive canvas elements and contexts\n */\n destroy() {\n // dispose of active selection\n const activeObject = this._activeObject;\n if (isActiveSelection(activeObject)) {\n activeObject.removeAll();\n activeObject.dispose();\n }\n\n delete this._activeObject;\n\n super.destroy();\n\n // free resources\n\n // pixel find canvas\n // @ts-expect-error disposing\n this.pixelFindContext = null;\n // @ts-expect-error disposing\n this.pixelFindCanvasEl = undefined;\n }\n\n /**\n * Clears all contexts (background, main, top) of an instance\n */\n clear() {\n // discard active object and fire events\n this.discardActiveObject();\n // make sure we clear the active object in case it refused to be discarded\n this._activeObject = undefined;\n this.clearContext(this.contextTop);\n super.clear();\n }\n\n /**\n * Draws objects' controls (borders/controls)\n * @param {CanvasRenderingContext2D} ctx Context to render controls on\n */\n drawControls(ctx: CanvasRenderingContext2D) {\n const activeObject = this._activeObject;\n\n if (activeObject) {\n activeObject._renderControls(ctx);\n }\n }\n\n /**\n * @private\n */\n protected _toObject(\n instance: FabricObject,\n methodName: 'toObject' | 'toDatalessObject',\n propertiesToInclude: string[],\n ): Record {\n // If the object is part of the current selection group, it should\n // be transformed appropriately\n // i.e. it should be serialised as it would appear if the selection group\n // were to be destroyed.\n const originalProperties = this._realizeGroupTransformOnObject(instance),\n object = super._toObject(instance, methodName, propertiesToInclude);\n //Undo the damage we did by changing all of its properties\n instance.set(originalProperties);\n return object;\n }\n\n /**\n * Realizes an object's group transformation on it\n * @private\n * @param {FabricObject} [instance] the object to transform (gets mutated)\n * @returns the original values of instance which were changed\n */\n private _realizeGroupTransformOnObject(\n instance: FabricObject,\n ): Partial {\n const { group } = instance;\n if (group && isActiveSelection(group) && this._activeObject === group) {\n const layoutProps = [\n 'angle',\n 'flipX',\n 'flipY',\n LEFT,\n SCALE_X,\n SCALE_Y,\n SKEW_X,\n SKEW_Y,\n TOP,\n ] as (keyof typeof instance)[];\n const originalValues = pick(instance, layoutProps);\n addTransformToObject(instance, group.calcOwnMatrix());\n return originalValues;\n } else {\n return {};\n }\n }\n\n /**\n * @private\n */\n _setSVGObject(\n markup: string[],\n instance: FabricObject,\n reviver?: TSVGReviver,\n ) {\n // If the object is in a selection group, simulate what would happen to that\n // object when the group is deselected\n const originalProperties = this._realizeGroupTransformOnObject(instance);\n super._setSVGObject(markup, instance, reviver);\n instance.set(originalProperties);\n }\n}\n","import type { ModifierKey, TOptionalModifierKey } from '../EventTypeDefs';\nimport type { TOptions } from '../typedefs';\nimport type { StaticCanvasOptions } from './StaticCanvasOptions';\n\nexport interface CanvasTransformOptions {\n /**\n * When true, objects can be transformed by one side (unproportionately)\n * when dragged on the corners that normally would not do that.\n * @type Boolean\n * @since fabric 4.0 // changed name and default value\n */\n uniformScaling: boolean;\n\n /**\n * Indicates which key switches uniform scaling.\n * values: 'altKey', 'shiftKey', 'ctrlKey'.\n * If `null` or 'none' or any other string that is not a modifier key\n * feature is disabled.\n * totally wrong named. this sounds like `uniform scaling`\n * if Canvas.uniformScaling is true, pressing this will set it to false\n * and viceversa.\n * @since 1.6.2\n * @type ModifierKey\n */\n uniScaleKey: TOptionalModifierKey;\n\n /**\n * When true, objects use center point as the origin of scale transformation.\n * Backwards incompatibility note: This property replaces \"centerTransform\" (Boolean).\n * @since 1.3.4\n * @type Boolean\n */\n centeredScaling: boolean;\n\n /**\n * When true, objects use center point as the origin of rotate transformation.\n * Backwards incompatibility note: This property replaces \"centerTransform\" (Boolean).\n * @since 1.3.4\n * @type Boolean\n */\n centeredRotation: boolean;\n\n /**\n * Indicates which key enable centered Transform\n * values: 'altKey', 'shiftKey', 'ctrlKey'.\n * If `null` or 'none' or any other string that is not a modifier key\n * feature is disabled feature disabled.\n * @since 1.6.2\n * @type ModifierKey\n */\n centeredKey: TOptionalModifierKey;\n\n /**\n * Indicates which key enable alternate action on corner\n * values: 'altKey', 'shiftKey', 'ctrlKey'.\n * If `null` or 'none' or any other string that is not a modifier key\n * feature is disabled feature disabled.\n * @since 1.6.2\n * @type ModifierKey\n */\n altActionKey: TOptionalModifierKey;\n}\n\nexport interface CanvasSelectionOptions {\n /**\n * Indicates whether group selection should be enabled\n * @type Boolean\n */\n selection: boolean;\n\n /**\n * Indicates which key or keys enable multiple click selection\n * Pass value as a string or array of strings\n * values: 'altKey', 'shiftKey', 'ctrlKey'.\n * If `null` or empty or containing any other string that is not a modifier key\n * feature is disabled.\n * @since 1.6.2\n * @type ModifierKey|ModifierKey[]\n */\n selectionKey: TOptionalModifierKey | ModifierKey[];\n\n /**\n * Indicates which key enable alternative selection\n * in case of a target overlapping with active object and we don't want to loose the\n * active selection, we can press this modifier key and continue selecting the current\n * selected object also when is covered by another or many valid targets for selection.\n * values: 'altKey', 'shiftKey', 'ctrlKey'.\n * For a series of reason that come from the general expectations on how\n * things should work, this feature works only for preserveObjectStacking true.\n * If `null` or 'none' or any other string that is not a modifier key\n * feature is disabled.\n * @since 1.6.5\n * @type null|ModifierKey\n */\n altSelectionKey: TOptionalModifierKey;\n\n /**\n * Color of selection\n * @type String\n */\n selectionColor: string;\n\n /**\n * Default dash array pattern\n * If not empty the selection border is dashed\n * @type Array\n */\n selectionDashArray: number[];\n\n /**\n * Color of the border of selection (usually slightly darker than color of selection itself)\n * @type String\n */\n selectionBorderColor: string;\n\n /**\n * Width of a line used in object/group selection\n * @type Number\n */\n selectionLineWidth: number;\n\n /**\n * Select only shapes that are fully contained in the dragged selection rectangle.\n * @type Boolean\n */\n selectionFullyContained: boolean;\n}\n\nexport interface CanvasCursorOptions {\n /**\n * Default cursor value used when hovering over an object on canvas\n * @type CSSStyleDeclaration['cursor']\n * @default move\n */\n hoverCursor: CSSStyleDeclaration['cursor'];\n\n /**\n * Default cursor value used when moving an object on canvas\n * @type CSSStyleDeclaration['cursor']\n * @default move\n */\n moveCursor: CSSStyleDeclaration['cursor'];\n\n /**\n * Default cursor value used for the entire canvas\n * @type String\n * @default default\n */\n defaultCursor: CSSStyleDeclaration['cursor'];\n\n /**\n * Cursor value used during free drawing\n * @type String\n * @default crosshair\n */\n freeDrawingCursor: CSSStyleDeclaration['cursor'];\n\n /**\n * Cursor value used for disabled elements ( corners with disabled action )\n * @type String\n * @since 2.0.0\n * @default not-allowed\n */\n notAllowedCursor: CSSStyleDeclaration['cursor'];\n}\n\nexport interface TargetFindOptions {\n /**\n * When true, object detection happens on per-pixel basis rather than on per-bounding-box\n * @type Boolean\n */\n perPixelTargetFind: boolean;\n\n /**\n * Number of pixels around target pixel to tolerate (consider active) during object detection\n * @type Number\n */\n targetFindTolerance: number;\n\n /**\n * When true, target detection is skipped. Target detection will return always undefined.\n * click selection won't work anymore, events will fire with no targets.\n * if something is selected before setting it to true, it will be deselected at the first click.\n * area selection will still work. check the `selection` property too.\n * if you deactivate both, you should look into staticCanvas.\n * @type Boolean\n */\n skipTargetFind: boolean;\n}\n\nexport interface CanvasEventsOptions {\n /**\n * Indicates if the right click on canvas can output the context menu or not\n * @type Boolean\n * @since 1.6.5\n */\n stopContextMenu: boolean;\n\n /**\n * Indicates if the canvas can fire right click events\n * @type Boolean\n * @since 1.6.5\n */\n fireRightClick: boolean;\n\n /**\n * Indicates if the canvas can fire middle click events\n * @type Boolean\n * @since 1.7.8\n */\n fireMiddleClick: boolean;\n\n /**\n * When the option is enabled, PointerEvent is used instead of TPointerEvent.\n * @type Boolean\n */\n enablePointerEvents: boolean;\n}\n\nexport interface CanvasOptions\n extends StaticCanvasOptions,\n CanvasTransformOptions,\n CanvasSelectionOptions,\n CanvasCursorOptions,\n TargetFindOptions,\n CanvasEventsOptions {\n /**\n * Default element class that's given to wrapper (div) element of canvas\n * @type String\n * @deprecated customize {@link CanvasDOMManager} instead or access {@link elements} directly\n */\n containerClass: string;\n\n /**\n * Indicates whether objects should remain in current stack position when selected.\n * When false objects are brought to top and rendered as part of the selection group\n * @type Boolean\n * @default true\n */\n preserveObjectStacking: boolean;\n}\n\nexport type TCanvasOptions = TOptions;\n\nexport const canvasDefaults: TOptions = {\n uniformScaling: true,\n uniScaleKey: 'shiftKey',\n centeredScaling: false,\n centeredRotation: false,\n centeredKey: 'altKey',\n altActionKey: 'shiftKey',\n\n selection: true,\n selectionKey: 'shiftKey',\n selectionColor: 'rgba(100, 100, 255, 0.3)',\n selectionDashArray: [],\n selectionBorderColor: 'rgba(255, 255, 255, 0.3)',\n selectionLineWidth: 1,\n selectionFullyContained: false,\n\n hoverCursor: 'move',\n moveCursor: 'move',\n defaultCursor: 'default',\n freeDrawingCursor: 'crosshair',\n notAllowedCursor: 'not-allowed',\n\n perPixelTargetFind: false,\n targetFindTolerance: 0,\n skipTargetFind: false,\n\n stopContextMenu: false,\n fireRightClick: false,\n fireMiddleClick: false,\n enablePointerEvents: false,\n\n containerClass: 'canvas-container',\n preserveObjectStacking: true,\n};\n","import type { TPointerEvent } from '../EventTypeDefs';\nimport type { ITextBehavior } from '../shapes/IText/ITextBehavior';\nimport { removeFromArray } from '../util/internals/removeFromArray';\nimport type { Canvas } from './Canvas';\n\n/**\n * In charge of synchronizing all interactive text instances of a canvas\n */\nexport class TextEditingManager {\n private targets: ITextBehavior[] = [];\n declare private target?: ITextBehavior;\n private __disposer: VoidFunction;\n\n constructor(canvas: Canvas) {\n const cb = () => {\n const { hiddenTextarea } =\n (canvas.getActiveObject() as ITextBehavior) || {};\n hiddenTextarea && hiddenTextarea.focus();\n };\n const el = canvas.upperCanvasEl;\n el.addEventListener('click', cb);\n this.__disposer = () => el.removeEventListener('click', cb);\n }\n\n exitTextEditing() {\n this.target = undefined;\n this.targets.forEach((target) => {\n if (target.isEditing) {\n target.exitEditing();\n }\n });\n }\n\n add(target: ITextBehavior) {\n this.targets.push(target);\n }\n\n remove(target: ITextBehavior) {\n this.unregister(target);\n removeFromArray(this.targets, target);\n }\n\n register(target: ITextBehavior) {\n this.target = target;\n }\n\n unregister(target: ITextBehavior) {\n if (target === this.target) {\n this.target = undefined;\n }\n }\n\n onMouseMove(e: TPointerEvent) {\n this.target?.isEditing && this.target.updateSelectionOnMouseMove(e);\n }\n\n clear() {\n this.targets = [];\n this.target = undefined;\n }\n\n dispose() {\n this.clear();\n this.__disposer();\n // @ts-expect-error disposing\n delete this.__disposer;\n }\n}\n","import { classRegistry } from '../ClassRegistry';\nimport { NONE } from '../constants';\nimport type {\n CanvasEvents,\n DragEventData,\n ObjectEvents,\n TEventsExtraData,\n TPointerEvent,\n TPointerEventNames,\n Transform,\n} from '../EventTypeDefs';\nimport { Point } from '../Point';\nimport type { ActiveSelection } from '../shapes/ActiveSelection';\nimport type { Group } from '../shapes/Group';\nimport type { IText } from '../shapes/IText/IText';\nimport type { FabricObject } from '../shapes/Object/FabricObject';\nimport { isTouchEvent, stopEvent } from '../util/dom_event';\nimport { getDocumentFromElement, getWindowFromElement } from '../util/dom_misc';\nimport { sendPointToPlane } from '../util/misc/planeChange';\nimport { isActiveSelection } from '../util/typeAssertions';\nimport type { CanvasOptions, TCanvasOptions } from './CanvasOptions';\nimport { SelectableCanvas } from './SelectableCanvas';\nimport { TextEditingManager } from './TextEditingManager';\n\nconst addEventOptions = { passive: false } as EventListenerOptions;\n\nconst getEventPoints = (canvas: Canvas, e: TPointerEvent) => {\n const viewportPoint = canvas.getViewportPoint(e);\n const scenePoint = canvas.getScenePoint(e);\n return {\n viewportPoint,\n scenePoint,\n };\n};\n\n// just to be clear, the utils are now deprecated and those are here exactly as minifier helpers\n// because el.addEventListener can't me be minified while a const yes and we use it 47 times in this file.\n// few bytes but why give it away.\nconst addListener = (\n el: HTMLElement | Document,\n ...args: Parameters\n) => el.addEventListener(...args);\nconst removeListener = (\n el: HTMLElement | Document,\n ...args: Parameters\n) => el.removeEventListener(...args);\n\nconst syntheticEventConfig = {\n mouse: {\n in: 'over',\n out: 'out',\n targetIn: 'mouseover',\n targetOut: 'mouseout',\n canvasIn: 'mouse:over',\n canvasOut: 'mouse:out',\n },\n drag: {\n in: 'enter',\n out: 'leave',\n targetIn: 'dragenter',\n targetOut: 'dragleave',\n canvasIn: 'drag:enter',\n canvasOut: 'drag:leave',\n },\n} as const;\n\ntype TSyntheticEventContext = {\n mouse: { e: TPointerEvent };\n drag: DragEventData;\n};\n\nexport class Canvas extends SelectableCanvas implements CanvasOptions {\n /**\n * Contains the id of the touch event that owns the fabric transform\n * @type Number\n * @private\n */\n declare mainTouchId?: number;\n\n declare enablePointerEvents: boolean;\n\n /**\n * Holds a reference to a setTimeout timer for event synchronization\n * @type number\n * @private\n */\n declare private _willAddMouseDown: number;\n\n /**\n * Holds a reference to an object on the canvas that is receiving the drag over event.\n * @type FabricObject\n * @private\n */\n declare private _draggedoverTarget?: FabricObject;\n\n /**\n * Holds a reference to an object on the canvas from where the drag operation started\n * @type FabricObject\n * @private\n */\n declare private _dragSource?: FabricObject;\n\n /**\n * Holds a reference to an object on the canvas that is the current drop target\n * May differ from {@link _draggedoverTarget}\n * @todo inspect whether {@link _draggedoverTarget} and {@link _dropTarget} should be merged somehow\n * @type FabricObject\n * @private\n */\n declare private _dropTarget: FabricObject | undefined;\n\n /**\n * a boolean that keeps track of the click state during a cycle of mouse down/up.\n * If a mouse move occurs it becomes false.\n * Is true by default, turns false on mouse move.\n * Used to determine if a mouseUp is a click\n */\n private _isClick: boolean;\n\n textEditingManager = new TextEditingManager(this);\n\n constructor(el?: string | HTMLCanvasElement, options: TCanvasOptions = {}) {\n super(el, options);\n // bind event handlers\n (\n [\n '_onMouseDown',\n '_onTouchStart',\n '_onMouseMove',\n '_onMouseUp',\n '_onTouchEnd',\n '_onResize',\n // '_onGesture',\n // '_onDrag',\n // '_onShake',\n // '_onLongPress',\n // '_onOrientationChange',\n '_onMouseWheel',\n '_onMouseOut',\n '_onMouseEnter',\n '_onContextMenu',\n '_onClick',\n '_onDragStart',\n '_onDragEnd',\n '_onDragProgress',\n '_onDragOver',\n '_onDragEnter',\n '_onDragLeave',\n '_onDrop',\n ] as (keyof this)[]\n ).forEach((eventHandler) => {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-function-type\n this[eventHandler] = (this[eventHandler] as Function).bind(this);\n });\n // register event handlers\n this.addOrRemove(addListener, 'add');\n }\n\n /**\n * return an event prefix pointer or mouse.\n * @private\n */\n private _getEventPrefix() {\n return this.enablePointerEvents ? 'pointer' : 'mouse';\n }\n\n addOrRemove(functor: any, _eventjsFunctor: 'add' | 'remove') {\n const canvasElement = this.upperCanvasEl,\n eventTypePrefix = this._getEventPrefix();\n functor(getWindowFromElement(canvasElement), 'resize', this._onResize);\n functor(canvasElement, eventTypePrefix + 'down', this._onMouseDown);\n functor(\n canvasElement,\n `${eventTypePrefix}move`,\n this._onMouseMove,\n addEventOptions,\n );\n functor(canvasElement, `${eventTypePrefix}out`, this._onMouseOut);\n functor(canvasElement, `${eventTypePrefix}enter`, this._onMouseEnter);\n functor(canvasElement, 'wheel', this._onMouseWheel);\n functor(canvasElement, 'contextmenu', this._onContextMenu);\n functor(canvasElement, 'click', this._onClick);\n // decide if to remove in fabric 7.0\n functor(canvasElement, 'dblclick', this._onClick);\n functor(canvasElement, 'dragstart', this._onDragStart);\n functor(canvasElement, 'dragend', this._onDragEnd);\n functor(canvasElement, 'dragover', this._onDragOver);\n functor(canvasElement, 'dragenter', this._onDragEnter);\n functor(canvasElement, 'dragleave', this._onDragLeave);\n functor(canvasElement, 'drop', this._onDrop);\n if (!this.enablePointerEvents) {\n functor(canvasElement, 'touchstart', this._onTouchStart, addEventOptions);\n }\n // if (typeof eventjs !== 'undefined' && eventjsFunctor in eventjs) {\n // eventjs[eventjsFunctor](canvasElement, 'gesture', this._onGesture);\n // eventjs[eventjsFunctor](canvasElement, 'drag', this._onDrag);\n // eventjs[eventjsFunctor](\n // canvasElement,\n // 'orientation',\n // this._onOrientationChange\n // );\n // eventjs[eventjsFunctor](canvasElement, 'shake', this._onShake);\n // eventjs[eventjsFunctor](canvasElement, 'longpress', this._onLongPress);\n // }\n }\n\n /**\n * Removes all event listeners, used when disposing the instance\n */\n removeListeners() {\n this.addOrRemove(removeListener, 'remove');\n // if you dispose on a mouseDown, before mouse up, you need to clean document to...\n const eventTypePrefix = this._getEventPrefix();\n const doc = getDocumentFromElement(this.upperCanvasEl);\n removeListener(\n doc,\n `${eventTypePrefix}up`,\n this._onMouseUp as EventListener,\n );\n removeListener(\n doc,\n 'touchend',\n this._onTouchEnd as EventListener,\n addEventOptions,\n );\n removeListener(\n doc,\n `${eventTypePrefix}move`,\n this._onMouseMove as EventListener,\n addEventOptions,\n );\n removeListener(\n doc,\n 'touchmove',\n this._onMouseMove as EventListener,\n addEventOptions,\n );\n clearTimeout(this._willAddMouseDown);\n }\n\n /**\n * @private\n * @param {Event} [e] Event object fired on wheel event\n */\n private _onMouseWheel(e: MouseEvent) {\n this._cacheTransformEventData(e);\n this._handleEvent(e, 'wheel');\n this._resetTransformEventData();\n }\n\n /**\n * @private\n * @param {Event} e Event object fired on mousedown\n */\n private _onMouseOut(e: TPointerEvent) {\n const target = this._hoveredTarget;\n const shared = {\n e,\n ...getEventPoints(this, e),\n };\n this.fire('mouse:out', { ...shared, target });\n this._hoveredTarget = undefined;\n target && target.fire('mouseout', { ...shared });\n this._hoveredTargets.forEach((nestedTarget) => {\n this.fire('mouse:out', { ...shared, target: nestedTarget });\n nestedTarget && nestedTarget.fire('mouseout', { ...shared });\n });\n this._hoveredTargets = [];\n }\n\n /**\n * @private\n * Used when the mouse cursor enter the canvas from outside\n * @param {Event} e Event object fired on mouseenter\n */\n private _onMouseEnter(e: TPointerEvent) {\n // This find target and consequent 'mouse:over' is used to\n // clear old instances on hovered target.\n // calling findTarget has the side effect of killing target.__corner.\n // as a short term fix we are not firing this if we are currently transforming.\n // as a long term fix we need to separate the action of finding a target with the\n // side effects we added to it.\n const { target } = this.findTarget(e);\n // we fire the event only when there is no target, if there is a target, the specific\n // target event will fire.\n if (!this._currentTransform && !target) {\n this.fire('mouse:over', {\n e,\n ...getEventPoints(this, e),\n });\n this._hoveredTarget = undefined;\n this._hoveredTargets = [];\n }\n }\n\n /**\n * supports native like text dragging\n * @private\n * @param {DragEvent} e\n */\n private _onDragStart(e: DragEvent) {\n this._isClick = false;\n const activeObject = this.getActiveObject();\n if (activeObject && activeObject.onDragStart(e)) {\n this._dragSource = activeObject;\n const options = { e, target: activeObject };\n this.fire('dragstart', options);\n activeObject.fire('dragstart', options);\n addListener(\n this.upperCanvasEl,\n 'drag',\n this._onDragProgress as EventListener,\n );\n return;\n }\n stopEvent(e);\n }\n\n /**\n * First we clear top context where the effects are being rendered.\n * Then we render the effects.\n * Doing so will render the correct effect for all cases including an overlap between `source` and `target`.\n * @private\n */\n private _renderDragEffects(\n e: DragEvent,\n source?: FabricObject,\n target?: FabricObject,\n ) {\n let dirty = false;\n // clear top context\n const dropTarget = this._dropTarget;\n if (dropTarget && dropTarget !== source && dropTarget !== target) {\n dropTarget.clearContextTop();\n dirty = true;\n }\n source?.clearContextTop();\n target !== source && target?.clearContextTop();\n // render effects\n const ctx = this.contextTop;\n ctx.save();\n ctx.transform(...this.viewportTransform);\n if (source) {\n ctx.save();\n source.transform(ctx);\n source.renderDragSourceEffect(e);\n ctx.restore();\n dirty = true;\n }\n if (target) {\n ctx.save();\n target.transform(ctx);\n target.renderDropTargetEffect(e);\n ctx.restore();\n dirty = true;\n }\n ctx.restore();\n dirty && (this.contextTopDirty = true);\n }\n\n /**\n * supports native like text dragging\n * https://developer.mozilla.org/en-US/docs/Web/API/HTML_Drag_and_Drop_API/Drag_operations#finishing_a_drag\n * @private\n * @param {DragEvent} e\n */\n private _onDragEnd(e: DragEvent) {\n const { currentSubTargets } = this.findTarget(e);\n const didDrop = !!e.dataTransfer && e.dataTransfer.dropEffect !== NONE,\n dropTarget = didDrop ? this._activeObject : undefined,\n options = {\n e,\n target: this._dragSource as FabricObject,\n subTargets: currentSubTargets,\n dragSource: this._dragSource as FabricObject,\n didDrop,\n dropTarget: dropTarget as FabricObject,\n };\n removeListener(\n this.upperCanvasEl,\n 'drag',\n this._onDragProgress as EventListener,\n );\n this.fire('dragend', options);\n this._dragSource && this._dragSource.fire('dragend', options);\n delete this._dragSource;\n // we need to call mouse up synthetically because the browser won't\n this._onMouseUp(e);\n }\n\n /**\n * fire `drag` event on canvas and drag source\n * @private\n * @param {DragEvent} e\n */\n private _onDragProgress(e: DragEvent) {\n const options = {\n e,\n target: this._dragSource,\n dragSource: this._dragSource,\n dropTarget: this._draggedoverTarget as FabricObject,\n };\n this.fire('drag', options);\n this._dragSource && this._dragSource.fire('drag', options);\n }\n\n /**\n * prevent default to allow drop event to be fired\n * https://developer.mozilla.org/en-US/docs/Web/API/HTML_Drag_and_Drop_API/Drag_operations#specifying_drop_targets\n * @private\n * @param {DragEvent} [e] Event object fired on Event.js shake\n */\n private _onDragOver(e: DragEvent) {\n const eventType = 'dragover';\n const { currentContainer: target, currentSubTargets } = this.findTarget(e);\n const dragSource = this._dragSource as FabricObject;\n const options = {\n e,\n target,\n subTargets: currentSubTargets,\n dragSource,\n canDrop: false,\n dropTarget: undefined,\n };\n let dropTarget;\n // fire on canvas\n this.fire(eventType, options);\n // make sure we fire dragenter events before dragover\n // if dragleave is needed, object will not fire dragover so we don't need to trouble ourselves with it\n this._fireEnterLeaveEvents(e, target, options);\n if (target) {\n if (target.canDrop(e)) {\n dropTarget = target;\n }\n target.fire(eventType, options);\n }\n // propagate the event to subtargets\n for (let i = 0; i < currentSubTargets.length; i++) {\n const subTarget = currentSubTargets[i];\n // accept event only if previous targets didn't (the accepting target calls `preventDefault` to inform that the event is taken)\n // TODO: verify if those should loop in inverse order then?\n // what is the order of subtargets?\n if (subTarget.canDrop(e)) {\n dropTarget = subTarget;\n }\n subTarget.fire(eventType, options);\n }\n // render drag effects now that relations between source and target is clear\n this._renderDragEffects(e, dragSource, dropTarget);\n this._dropTarget = dropTarget;\n }\n\n /**\n * fire `dragleave` on `dragover` targets\n * @private\n * @param {Event} [e] Event object fired on Event.js shake\n */\n private _onDragEnter(e: DragEvent) {\n const { currentContainer, currentSubTargets } = this.findTarget(e);\n const options = {\n e,\n target: currentContainer,\n subTargets: currentSubTargets,\n dragSource: this._dragSource,\n };\n this.fire('dragenter', options);\n // fire dragenter on targets\n this._fireEnterLeaveEvents(e, currentContainer, options);\n }\n\n /**\n * fire `dragleave` on `dragover` targets\n * @private\n * @param {Event} [e] Event object fired on Event.js shake\n */\n private _onDragLeave(e: DragEvent) {\n const { currentSubTargets } = this.findTarget(e);\n const options = {\n e,\n target: this._draggedoverTarget,\n subTargets: currentSubTargets,\n dragSource: this._dragSource,\n };\n this.fire('dragleave', options);\n\n // fire dragleave on targets\n this._fireEnterLeaveEvents(e, undefined, options);\n this._renderDragEffects(e, this._dragSource);\n this._dropTarget = undefined;\n this._hoveredTargets = [];\n }\n\n /**\n * `drop:before` is a an event that allows you to schedule logic\n * before the `drop` event. Prefer `drop` event always, but if you need\n * to run some drop-disabling logic on an event, since there is no way\n * to handle event handlers ordering, use `drop:before`\n * @private\n * @param {Event} e\n */\n private _onDrop(e: DragEvent) {\n const { currentContainer, currentSubTargets } = this.findTarget(e);\n const options = this._basicEventHandler('drop:before', {\n e,\n target: currentContainer,\n subTargets: currentSubTargets,\n dragSource: this._dragSource,\n ...getEventPoints(this, e),\n });\n // will be set by the drop target\n options.didDrop = false;\n // will be set by the drop target, used in case options.target refuses the drop\n options.dropTarget = undefined;\n // fire `drop`\n this._basicEventHandler('drop', options);\n // inform canvas of the drop\n // we do this because canvas was unaware of what happened at the time the `drop` event was fired on it\n // use for side effects\n this.fire('drop:after', options);\n }\n\n /**\n * @private\n * @param {Event} e Event object fired on mousedown\n */\n private _onContextMenu(e: TPointerEvent): false {\n const { target, subTargets } = this.findTarget(e);\n const options = this._basicEventHandler('contextmenu:before', {\n e,\n target,\n subTargets,\n });\n // TODO: this line is silly because the dev can subscribe to the event and prevent it themselves\n this.stopContextMenu && stopEvent(e);\n this._basicEventHandler('contextmenu', options);\n return false;\n }\n\n /**\n * @private\n * @param {Event} e Event object fired on mousedown\n */\n private _onClick(e: TPointerEvent) {\n const clicks = e.detail;\n if (clicks > 3 || clicks < 2) return;\n this._cacheTransformEventData(e);\n clicks == 2 && e.type === 'dblclick' && this._handleEvent(e, 'dblclick');\n clicks == 3 && this._handleEvent(e, 'tripleclick');\n this._resetTransformEventData();\n }\n\n /**\n * Return a the id of an event.\n * returns either the pointerId or the identifier or 0 for the mouse event\n * @private\n * @param {Event} evt Event object\n */\n getPointerId(evt: TouchEvent | PointerEvent): number {\n const changedTouches = (evt as TouchEvent).changedTouches;\n\n if (changedTouches) {\n return changedTouches[0] && changedTouches[0].identifier;\n }\n\n if (this.enablePointerEvents) {\n return (evt as PointerEvent).pointerId;\n }\n\n return -1;\n }\n\n /**\n * Determines if an event has the id of the event that is considered main\n * @private\n * @param {evt} event Event object\n */\n _isMainEvent(evt: TPointerEvent): boolean {\n if ((evt as PointerEvent).isPrimary === true) {\n return true;\n }\n if ((evt as PointerEvent).isPrimary === false) {\n return false;\n }\n if (evt.type === 'touchend' && (evt as TouchEvent).touches.length === 0) {\n return true;\n }\n if ((evt as TouchEvent).changedTouches) {\n return (\n (evt as TouchEvent).changedTouches[0].identifier === this.mainTouchId\n );\n }\n return true;\n }\n\n /**\n * @private\n * @param {Event} e Event object fired on mousedown\n */\n _onTouchStart(e: TouchEvent) {\n this._cacheTransformEventData(e);\n // we will prevent scrolling if allowTouchScrolling is not enabled and\n let shouldPreventScrolling = !this.allowTouchScrolling;\n const currentActiveObject = this._activeObject;\n if (this.mainTouchId === undefined) {\n this.mainTouchId = this.getPointerId(e);\n }\n this.__onMouseDown(e);\n const { target } = this.findTarget(e);\n // after executing fabric logic for mouse down let's see\n // if we didn't change target or if we are drawing\n // we want to prevent scrolling anyway\n if (\n this.isDrawingMode ||\n (currentActiveObject && target === currentActiveObject)\n ) {\n shouldPreventScrolling = true;\n }\n // prevent default, will block scrolling from start\n shouldPreventScrolling && e.preventDefault();\n const canvasElement = this.upperCanvasEl,\n eventTypePrefix = this._getEventPrefix();\n const doc = getDocumentFromElement(canvasElement);\n addListener(\n doc,\n 'touchend',\n this._onTouchEnd as EventListener,\n addEventOptions,\n );\n // if we scroll don't register the touch move event\n shouldPreventScrolling &&\n addListener(\n doc,\n 'touchmove',\n this._onMouseMove as EventListener,\n addEventOptions,\n );\n // Unbind mousedown to prevent double triggers from touch devices\n removeListener(\n canvasElement,\n `${eventTypePrefix}down`,\n this._onMouseDown as EventListener,\n );\n this._resetTransformEventData();\n }\n\n /**\n * @private\n * @param {Event} e Event object fired on mousedown\n */\n _onMouseDown(e: TPointerEvent) {\n this._cacheTransformEventData(e);\n this.__onMouseDown(e);\n const canvasElement = this.upperCanvasEl,\n eventTypePrefix = this._getEventPrefix();\n // switch from moving on the canvas element to moving on the document\n removeListener(\n canvasElement,\n `${eventTypePrefix}move`,\n this._onMouseMove as EventListener,\n addEventOptions,\n );\n const doc = getDocumentFromElement(canvasElement);\n addListener(doc, `${eventTypePrefix}up`, this._onMouseUp as EventListener);\n addListener(\n doc,\n `${eventTypePrefix}move`,\n this._onMouseMove as EventListener,\n addEventOptions,\n );\n this._resetTransformEventData();\n }\n\n /**\n * @private\n * @param {Event} e Event object fired on mousedown\n */\n _onTouchEnd(e: TouchEvent) {\n if (e.touches.length > 0) {\n // if there are still touches stop here\n return;\n }\n this._cacheTransformEventData(e);\n this.__onMouseUp(e);\n this._resetTransformEventData();\n delete this.mainTouchId;\n const eventTypePrefix = this._getEventPrefix();\n const doc = getDocumentFromElement(this.upperCanvasEl);\n removeListener(\n doc,\n 'touchend',\n this._onTouchEnd as EventListener,\n addEventOptions,\n );\n removeListener(\n doc,\n 'touchmove',\n this._onMouseMove as EventListener,\n addEventOptions,\n );\n if (this._willAddMouseDown) {\n clearTimeout(this._willAddMouseDown);\n }\n this._willAddMouseDown = setTimeout(() => {\n // Wait 400ms before rebinding mousedown to prevent double triggers\n // from touch devices\n addListener(\n this.upperCanvasEl,\n `${eventTypePrefix}down`,\n this._onMouseDown as EventListener,\n );\n this._willAddMouseDown = 0;\n }, 400) as unknown as number;\n }\n\n /**\n * @private\n * @param {Event} e Event object fired on mouseup\n */\n _onMouseUp(e: TPointerEvent) {\n this._cacheTransformEventData(e);\n this.__onMouseUp(e);\n const canvasElement = this.upperCanvasEl,\n eventTypePrefix = this._getEventPrefix();\n if (this._isMainEvent(e)) {\n const doc = getDocumentFromElement(this.upperCanvasEl);\n removeListener(\n doc,\n `${eventTypePrefix}up`,\n this._onMouseUp as EventListener,\n );\n removeListener(\n doc,\n `${eventTypePrefix}move`,\n this._onMouseMove as EventListener,\n addEventOptions,\n );\n addListener(\n canvasElement,\n `${eventTypePrefix}move`,\n this._onMouseMove as EventListener,\n addEventOptions,\n );\n }\n this._resetTransformEventData();\n }\n\n /**\n * @private\n * @param {Event} e Event object fired on mousemove\n */\n _onMouseMove(e: TPointerEvent) {\n this._cacheTransformEventData(e);\n\n const activeObject = this.getActiveObject();\n !this.allowTouchScrolling &&\n (!activeObject ||\n // a drag event sequence is started by the active object flagging itself on mousedown / mousedown:before\n // we must not prevent the event's default behavior in order for the window to start dragging\n !activeObject.shouldStartDragging(e)) &&\n e.preventDefault &&\n e.preventDefault();\n this.__onMouseMove(e);\n this._resetTransformEventData();\n }\n\n /**\n * @private\n */\n _onResize() {\n this.calcOffset();\n this._resetTransformEventData();\n }\n\n /**\n * Decides whether the canvas should be redrawn in mouseup and mousedown events.\n * @private\n * @param {Object} target\n */\n _shouldRender(target: FabricObject | undefined) {\n const activeObject = this.getActiveObject();\n // if just one of them is available or if they are both but are different objects\n // this covers: switch of target, from target to no target, selection of target\n // multiSelection with key and mouse\n return (\n !!activeObject !== !!target ||\n (activeObject && target && activeObject !== target)\n );\n }\n\n /**\n * Method that defines the actions when mouse is released on canvas.\n * The method resets the currentTransform parameters, store the image corner\n * position in the image object and render the canvas on top.\n * @private\n * @param {Event} e Event object fired on mouseup\n */\n __onMouseUp(e: TPointerEvent) {\n this._handleEvent(e, 'up:before');\n\n const transform = this._currentTransform;\n const isClick = this._isClick;\n const { target } = this.findTarget(e);\n\n // if right/middle click just fire events and return\n // target undefined will make the _handleEvent search the target\n const { button } = e as MouseEvent;\n if (button) {\n ((this.fireMiddleClick && button === 1) ||\n (this.fireRightClick && button === 2)) &&\n this._handleEvent(e, 'up');\n return;\n }\n\n if (this.isDrawingMode && this._isCurrentlyDrawing) {\n this._onMouseUpInDrawingMode(e);\n return;\n }\n\n if (!this._isMainEvent(e)) {\n return;\n }\n let shouldRender = false;\n if (transform) {\n this._finalizeCurrentTransform(e);\n shouldRender = transform.actionPerformed;\n }\n if (!isClick) {\n const targetWasActive = target === this._activeObject;\n this.handleSelection(e);\n if (!shouldRender) {\n shouldRender =\n this._shouldRender(target) ||\n (!targetWasActive && target === this._activeObject);\n }\n }\n let pointer, corner;\n if (target) {\n const found = target.findControl(\n this.getViewportPoint(e),\n isTouchEvent(e),\n );\n const { key, control } = found || {};\n corner = key;\n if (\n target.selectable &&\n target !== this._activeObject &&\n target.activeOn === 'up'\n ) {\n this.setActiveObject(target, e);\n shouldRender = true;\n } else if (control) {\n const mouseUpHandler = control.getMouseUpHandler(e, target, control);\n if (mouseUpHandler) {\n pointer = this.getScenePoint(e);\n mouseUpHandler.call(control, e, transform!, pointer.x, pointer.y);\n }\n }\n target.isMoving = false;\n }\n // if we are ending up a transform on a different control or a new object\n // fire the original mouse up from the corner that started the transform\n if (\n transform &&\n (transform.target !== target || transform.corner !== corner)\n ) {\n const originalControl =\n transform.target && transform.target.controls[transform.corner],\n originalMouseUpHandler =\n originalControl &&\n originalControl.getMouseUpHandler(\n e,\n transform.target,\n originalControl,\n );\n pointer = pointer || this.getScenePoint(e);\n originalMouseUpHandler &&\n originalMouseUpHandler.call(\n originalControl,\n e,\n transform,\n pointer.x,\n pointer.y,\n );\n }\n this._setCursorFromEvent(e, target);\n this._handleEvent(e, 'up');\n this._groupSelector = null;\n this._currentTransform = null;\n // reset the target information about which corner is selected\n target && (target.__corner = undefined);\n if (shouldRender) {\n this.requestRenderAll();\n } else if (!isClick && !(this._activeObject as IText)?.isEditing) {\n this.renderTop();\n }\n }\n\n _basicEventHandler(\n eventType: T,\n options: (CanvasEvents & ObjectEvents)[T],\n ) {\n const { target, subTargets = [] } = options as {\n target?: FabricObject;\n subTargets: FabricObject[];\n };\n this.fire(eventType, options);\n target && target.fire(eventType, options);\n for (let i = 0; i < subTargets.length; i++) {\n subTargets[i] !== target && subTargets[i].fire(eventType, options);\n }\n return options;\n }\n\n /**\n * @private\n * Handle event firing for target and subtargets\n * @param {TPointerEvent} e event from mouse\n * @param {TPointerEventNames} eventType\n */\n _handleEvent(\n e: TPointerEvent,\n eventType: T,\n extraData?: TEventsExtraData[T],\n ) {\n const { target, subTargets } = this.findTarget(e),\n options: CanvasEvents[`mouse:${T}`] = {\n e,\n target,\n subTargets,\n ...getEventPoints(this, e),\n transform: this._currentTransform,\n ...(eventType === 'down:before' || eventType === 'down'\n ? extraData\n : {}),\n } as CanvasEvents[`mouse:${T}`];\n if (eventType === 'up:before' || eventType === 'up') {\n (options as CanvasEvents[`mouse:up`]).isClick = this._isClick;\n }\n this.fire(`mouse:${eventType}`, options);\n // this may be a little be more complicated of what we want to handle\n target && target.fire(`mouse${eventType}`, options);\n for (let i = 0; i < subTargets.length; i++) {\n subTargets[i] !== target &&\n subTargets[i].fire(`mouse${eventType}`, options);\n }\n }\n\n /**\n * @private\n * @param {Event} e Event object fired on mousedown\n */\n _onMouseDownInDrawingMode(e: TPointerEvent) {\n this._isCurrentlyDrawing = true;\n if (this.getActiveObject()) {\n this.discardActiveObject(e);\n this.requestRenderAll();\n }\n // TODO: this is a scene point so it should be renamed\n const pointer = this.getScenePoint(e);\n this.freeDrawingBrush &&\n this.freeDrawingBrush.onMouseDown(pointer, { e, pointer });\n this._handleEvent(e, 'down', { alreadySelected: false });\n }\n\n /**\n * @private\n * @param {Event} e Event object fired on mousemove\n */\n _onMouseMoveInDrawingMode(e: TPointerEvent) {\n if (this._isCurrentlyDrawing) {\n const pointer = this.getScenePoint(e);\n this.freeDrawingBrush &&\n this.freeDrawingBrush.onMouseMove(pointer, {\n e,\n // this is an absolute pointer, the naming is wrong\n pointer,\n });\n }\n this.setCursor(this.freeDrawingCursor);\n this._handleEvent(e, 'move');\n }\n\n /**\n * @private\n * @param {Event} e Event object fired on mouseup\n */\n _onMouseUpInDrawingMode(e: TPointerEvent) {\n const pointer = this.getScenePoint(e);\n if (this.freeDrawingBrush) {\n this._isCurrentlyDrawing = !!this.freeDrawingBrush.onMouseUp({\n e: e,\n // this is an absolute pointer, the naming is wrong\n pointer,\n });\n } else {\n this._isCurrentlyDrawing = false;\n }\n this._handleEvent(e, 'up');\n }\n\n /**\n * Method that defines the actions when mouse is clicked on canvas.\n * The method inits the currentTransform parameters and renders all the\n * canvas so the current image can be placed on the top canvas and the rest\n * in on the container one.\n * @private\n * @param {Event} e Event object fired on mousedown\n */\n __onMouseDown(e: TPointerEvent) {\n this._isClick = true;\n this._handleEvent(e, 'down:before');\n\n let { target } = this.findTarget(e);\n let alreadySelected = !!target && target === this._activeObject;\n // if right/middle click just fire events\n const { button } = e as MouseEvent;\n if (button) {\n ((this.fireMiddleClick && button === 1) ||\n (this.fireRightClick && button === 2)) &&\n this._handleEvent(e, 'down', {\n alreadySelected,\n });\n return;\n }\n\n if (this.isDrawingMode) {\n this._onMouseDownInDrawingMode(e);\n return;\n }\n\n if (!this._isMainEvent(e)) {\n return;\n }\n\n // ignore if some object is being transformed at this moment\n if (this._currentTransform) {\n return;\n }\n\n let shouldRender = this._shouldRender(target);\n let grouped = false;\n if (this.handleMultiSelection(e, target)) {\n // active object might have changed while grouping\n target = this._activeObject;\n grouped = true;\n shouldRender = true;\n } else if (this._shouldClearSelection(e, target)) {\n this.discardActiveObject(e);\n }\n // we start a group selector rectangle if\n // selection is enabled\n // and there is no target, or the following 3 conditions are satisfied:\n // target is not selectable ( otherwise we selected it )\n // target is not editing\n // target is not already selected ( otherwise we drag )\n if (\n this.selection &&\n (!target ||\n (!target.selectable &&\n !(target as IText).isEditing &&\n target !== this._activeObject))\n ) {\n const p = this.getScenePoint(e);\n this._groupSelector = {\n x: p.x,\n y: p.y,\n deltaY: 0,\n deltaX: 0,\n };\n }\n\n // check again because things could have changed\n alreadySelected = !!target && target === this._activeObject;\n if (target) {\n if (target.selectable && target.activeOn === 'down') {\n this.setActiveObject(target, e);\n }\n const handle = target.findControl(\n this.getViewportPoint(e),\n isTouchEvent(e),\n );\n if (target === this._activeObject && (handle || !grouped)) {\n this._setupCurrentTransform(e, target, alreadySelected);\n const control = handle ? handle.control : undefined,\n pointer = this.getScenePoint(e),\n mouseDownHandler =\n control && control.getMouseDownHandler(e, target, control);\n mouseDownHandler &&\n mouseDownHandler.call(\n control,\n e,\n this._currentTransform!,\n pointer.x,\n pointer.y,\n );\n }\n }\n // we clear `_objectsToRender` in case of a change in order to repopulate it at rendering\n // run before firing the `down` event to give the dev a chance to populate it themselves\n shouldRender && (this._objectsToRender = undefined);\n this._handleEvent(e, 'down', { alreadySelected: alreadySelected });\n // we must renderAll so that we update the visuals\n shouldRender && this.requestRenderAll();\n }\n\n /**\n * reset cache form common information needed during event processing\n * @private\n */\n _resetTransformEventData() {\n this._targetInfo = this._viewportPoint = this._scenePoint = undefined;\n }\n\n /**\n * Cache common information needed during event processing\n * @private\n * @param {Event} e Event object fired on event\n */\n _cacheTransformEventData(e: TPointerEvent) {\n // reset in order to avoid stale caching\n this._resetTransformEventData();\n this._viewportPoint = this.getViewportPoint(e);\n this._scenePoint = sendPointToPlane(\n this._viewportPoint,\n undefined,\n this.viewportTransform,\n );\n this._targetInfo = this.findTarget(e);\n // TODO: investigate better if this can be made less implicit in the code\n if (this._currentTransform) {\n this._targetInfo.target = this._currentTransform.target;\n }\n }\n\n /**\n * Method that defines the actions when mouse is hovering the canvas.\n * The currentTransform parameter will define whether the user is rotating/scaling/translating\n * an image or neither of them (only hovering). A group selection is also possible and would cancel\n * all any other type of action.\n * In case of an image transformation only the top canvas will be rendered.\n * @private\n * @param {Event} e Event object fired on mousemove\n */\n __onMouseMove(e: TPointerEvent) {\n this._isClick = false;\n this._handleEvent(e, 'move:before');\n\n if (this.isDrawingMode) {\n this._onMouseMoveInDrawingMode(e);\n return;\n }\n\n if (!this._isMainEvent(e)) {\n return;\n }\n\n const groupSelector = this._groupSelector;\n\n // We initially clicked in an empty area, so we draw a box for multiple selection\n if (groupSelector) {\n const pointer = this.getScenePoint(e);\n\n groupSelector.deltaX = pointer.x - groupSelector.x;\n groupSelector.deltaY = pointer.y - groupSelector.y;\n\n this.renderTop();\n } else if (!this._currentTransform) {\n const { target } = this.findTarget(e);\n this._setCursorFromEvent(e, target);\n this._fireOverOutEvents(e, target);\n } else {\n this._transformObject(e);\n }\n this.textEditingManager.onMouseMove(e);\n this._handleEvent(e, 'move');\n }\n\n /**\n * Manage the mouseout, mouseover events for the fabric object on the canvas\n * @param {Fabric.Object} target the target where the target from the mousemove event\n * @param {Event} e Event object fired on mousemove\n * @private\n */\n _fireOverOutEvents(e: TPointerEvent, target?: FabricObject) {\n const _hoveredTarget = this._hoveredTarget,\n _hoveredTargets = this._hoveredTargets,\n { subTargets } = this.findTarget(e),\n length = Math.max(_hoveredTargets.length, subTargets.length);\n\n this.fireSyntheticInOutEvents('mouse', {\n e,\n target,\n oldTarget: _hoveredTarget,\n fireCanvas: true,\n });\n for (let i = 0; i < length; i++) {\n this.fireSyntheticInOutEvents('mouse', {\n e,\n target: subTargets[i],\n oldTarget: _hoveredTargets[i],\n });\n }\n this._hoveredTarget = target;\n this._hoveredTargets = subTargets;\n }\n\n /**\n * Manage the dragEnter, dragLeave events for the fabric objects on the canvas\n * @param {Fabric.Object} target the target where the target from the onDrag event\n * @param {Object} data Event object fired on dragover\n * @private\n */\n _fireEnterLeaveEvents(\n e: TPointerEvent,\n target: FabricObject | undefined,\n data: DragEventData,\n ) {\n const draggedoverTarget = this._draggedoverTarget,\n _hoveredTargets = this._hoveredTargets,\n { subTargets } = this.findTarget(e),\n length = Math.max(_hoveredTargets.length, subTargets.length);\n\n this.fireSyntheticInOutEvents('drag', {\n ...data,\n target,\n oldTarget: draggedoverTarget,\n fireCanvas: true,\n });\n for (let i = 0; i < length; i++) {\n this.fireSyntheticInOutEvents('drag', {\n ...data,\n target: subTargets[i],\n oldTarget: _hoveredTargets[i],\n });\n }\n this._draggedoverTarget = target;\n }\n\n /**\n * Manage the synthetic in/out events for the fabric objects on the canvas\n * @param {Fabric.Object} target the target where the target from the supported events\n * @param {Object} data Event object fired\n * @param {Object} config configuration for the function to work\n * @param {String} config.targetName property on the canvas where the old target is stored\n * @param {String} [config.canvasEvtOut] name of the event to fire at canvas level for out\n * @param {String} config.evtOut name of the event to fire for out\n * @param {String} [config.canvasEvtIn] name of the event to fire at canvas level for in\n * @param {String} config.evtIn name of the event to fire for in\n * @private\n */\n fireSyntheticInOutEvents(\n type: T,\n {\n target,\n oldTarget,\n fireCanvas,\n e,\n ...data\n }: TSyntheticEventContext[T] & {\n target?: FabricObject;\n oldTarget?: FabricObject;\n fireCanvas?: boolean;\n },\n ) {\n const { targetIn, targetOut, canvasIn, canvasOut } =\n syntheticEventConfig[type];\n const targetChanged = oldTarget !== target;\n\n if (oldTarget && targetChanged) {\n const outOpt: CanvasEvents[typeof canvasOut] = {\n ...data,\n e,\n target: oldTarget,\n nextTarget: target,\n ...getEventPoints(this, e),\n };\n fireCanvas && this.fire(canvasOut, outOpt);\n oldTarget.fire(targetOut, outOpt);\n }\n if (target && targetChanged) {\n const inOpt: CanvasEvents[typeof canvasIn] = {\n ...data,\n e,\n target,\n previousTarget: oldTarget,\n ...getEventPoints(this, e),\n };\n fireCanvas && this.fire(canvasIn, inOpt);\n target.fire(targetIn, inOpt);\n }\n }\n\n /**\n * @private\n * @param {Event} e Event fired on mousemove\n */\n _transformObject(e: TPointerEvent) {\n const scenePoint = this.getScenePoint(e),\n transform = this._currentTransform!,\n target = transform.target,\n // transform pointer to target's containing coordinate plane\n // both pointer and object should agree on every point\n localPointer = target.group\n ? sendPointToPlane(\n scenePoint,\n undefined,\n target.group.calcTransformMatrix(),\n )\n : scenePoint;\n transform.shiftKey = e.shiftKey;\n transform.altKey = !!this.centeredKey && e[this.centeredKey];\n\n this._performTransformAction(e, transform, localPointer);\n transform.actionPerformed && this.requestRenderAll();\n }\n\n /**\n * @private\n */\n _performTransformAction(\n e: TPointerEvent,\n transform: Transform,\n pointer: Point,\n ) {\n const { action, actionHandler, target } = transform;\n\n const actionPerformed =\n !!actionHandler && actionHandler(e, transform, pointer.x, pointer.y);\n actionPerformed && target.setCoords();\n\n // this object could be created from the function in the control handlers\n if (action === 'drag' && actionPerformed) {\n transform.target.isMoving = true;\n this.setCursor(transform.target.moveCursor || this.moveCursor);\n }\n transform.actionPerformed = transform.actionPerformed || actionPerformed;\n }\n\n /**\n * Sets the cursor depending on where the canvas is being hovered.\n * Note: very buggy in Opera\n * @param {Event} e Event object\n * @param {Object} target Object that the mouse is hovering, if so.\n */\n _setCursorFromEvent(e: TPointerEvent, target?: FabricObject) {\n if (!target) {\n this.setCursor(this.defaultCursor);\n return;\n }\n let hoverCursor = target.hoverCursor || this.hoverCursor;\n const activeSelection = isActiveSelection(this._activeObject)\n ? this._activeObject\n : null,\n // only show proper corner when group selection is not active\n corner =\n (!activeSelection || target.group !== activeSelection) &&\n // here we call findTargetCorner always with undefined for the touch parameter.\n // we assume that if you are using a cursor you do not need to interact with\n // the bigger touch area.\n target.findControl(this.getViewportPoint(e));\n\n if (!corner) {\n if ((target as Group).subTargetCheck) {\n // hoverCursor should come from top-most subTarget,\n // so we walk the array backwards\n const { subTargets } = this.findTarget(e);\n subTargets\n .concat()\n .reverse()\n .forEach((_target) => {\n hoverCursor = _target.hoverCursor || hoverCursor;\n });\n }\n this.setCursor(hoverCursor);\n } else {\n const { control, coord } = corner;\n this.setCursor(control.cursorStyleHandler(e, control, target, coord));\n }\n }\n\n /**\n * ## Handles multiple selection\n * - toggles `target` selection (selects/deselects `target` if it isn't/is selected respectively)\n * - sets the active object in case it is not set or in case there is a single active object left under active selection.\n * ---\n * - If the active object is the active selection we add/remove `target` from it\n * - If not, add the active object and `target` to the active selection and make it the active object.\n * @TODO rewrite this after find target is refactored\n * @private\n * @param {TPointerEvent} e Event object\n * @param {FabricObject} target target of event to select/deselect\n * @returns true if grouping occurred\n */\n protected handleMultiSelection(e: TPointerEvent, target?: FabricObject) {\n const activeObject = this._activeObject;\n const isAS = isActiveSelection(activeObject);\n if (\n // check if an active object exists on canvas and if the user is pressing the `selectionKey` while canvas supports multi selection.\n !!activeObject &&\n this._isSelectionKeyPressed(e) &&\n this.selection &&\n // on top of that the user also has to hit a target that is selectable.\n !!target &&\n target.selectable &&\n // group target and active object only if they are different objects\n // else we try to find a subtarget of `ActiveSelection`\n (activeObject !== target || isAS) &&\n // make sure `activeObject` and `target` aren't ancestors of each other in case `activeObject` is not `ActiveSelection`\n // if it is then we want to remove `target` from it\n (isAS ||\n (!target.isDescendantOf(activeObject) &&\n !activeObject.isDescendantOf(target))) &&\n // target accepts selection\n !target.onSelect({ e }) &&\n // make sure we are not on top of a control\n !activeObject.getActiveControl()\n ) {\n if (isAS) {\n const prevActiveObjects = activeObject.getObjects();\n let subTargets: FabricObject[] = [];\n // const { subTargets: testSubTargets } = this.findTarget(e);\n if (target === activeObject) {\n const pointer = this.getScenePoint(e);\n let targetInfo = this.searchPossibleTargets(\n prevActiveObjects,\n pointer,\n );\n // console.log(testSubTargets.includes(targetInfo.target));\n if (targetInfo.target) {\n target = targetInfo.target;\n subTargets = targetInfo.subTargets;\n } else {\n targetInfo = this.searchPossibleTargets(this._objects, pointer);\n target = targetInfo.target;\n subTargets = targetInfo.subTargets;\n }\n // if nothing is found bail out\n if (!target || !target.selectable) {\n return false;\n }\n }\n if (target.group === activeObject) {\n // `target` is part of active selection => remove it\n activeObject.remove(target);\n this._hoveredTarget = target;\n this._hoveredTargets = subTargets;\n // if after removing an object we are left with one only...\n if (activeObject.size() === 1) {\n // activate last remaining object\n // deselecting the active selection will remove the remaining object from it\n this._setActiveObject(activeObject.item(0), e);\n }\n } else {\n // `target` isn't part of active selection => add it\n activeObject.multiSelectAdd(target);\n this._hoveredTarget = activeObject;\n this._hoveredTargets = subTargets;\n }\n this._fireSelectionEvents(prevActiveObjects, e);\n } else {\n (activeObject as IText).isEditing &&\n (activeObject as IText).exitEditing();\n // add the active object and the target to the active selection and set it as the active object\n const klass =\n classRegistry.getClass('ActiveSelection');\n const newActiveSelection = new klass([], {\n /**\n * it is crucial to pass the canvas ref before calling {@link ActiveSelection#multiSelectAdd}\n * since it uses {@link FabricObject#isInFrontOf} which relies on the canvas ref\n */\n canvas: this,\n });\n newActiveSelection.multiSelectAdd(activeObject, target);\n this._hoveredTarget = newActiveSelection;\n // ISSUE 4115: should we consider subTargets here?\n // this._hoveredTargets = [];\n // this._hoveredTargets = this.targets.concat();\n this._setActiveObject(newActiveSelection, e);\n this._fireSelectionEvents([activeObject], e);\n }\n return true;\n }\n return false;\n }\n\n /**\n * ## Handles selection\n * - selects objects that are contained in (and possibly intersecting) the selection bounding box\n * - sets the active object\n * ---\n * runs on mouse up after a mouse move\n */\n protected handleSelection(e: TPointerEvent) {\n if (!this.selection || !this._groupSelector) {\n return false;\n }\n const { x, y, deltaX, deltaY } = this._groupSelector,\n point1 = new Point(x, y),\n point2 = point1.add(new Point(deltaX, deltaY)),\n tl = point1.min(point2),\n br = point1.max(point2),\n size = br.subtract(tl);\n\n const collectedObjects = this.collectObjects(\n {\n left: tl.x,\n top: tl.y,\n width: size.x,\n height: size.y,\n },\n { includeIntersecting: !this.selectionFullyContained },\n ) as FabricObject[];\n\n const objects =\n // though this method runs only after mouse move the pointer could do a mouse up on the same position as mouse down\n // should it be handled as is?\n point1.eq(point2)\n ? collectedObjects[0]\n ? [collectedObjects[0]]\n : []\n : collectedObjects.length > 1\n ? collectedObjects\n .filter((object) => !object.onSelect({ e }))\n .reverse()\n : // `setActiveObject` will call `onSelect(collectedObjects[0])` in this case\n collectedObjects;\n\n // set active object\n if (objects.length === 1) {\n // set as active object\n this.setActiveObject(objects[0], e);\n } else if (objects.length > 1) {\n // add to active selection and make it the active object\n const klass =\n classRegistry.getClass('ActiveSelection');\n this.setActiveObject(new klass(objects, { canvas: this }), e);\n }\n\n // cleanup\n this._groupSelector = null;\n return true;\n }\n\n /**\n * @override clear {@link textEditingManager}\n */\n clear() {\n this.textEditingManager.clear();\n super.clear();\n }\n\n /**\n * @override clear {@link textEditingManager}\n */\n destroy() {\n this.removeListeners();\n this.textEditingManager.dispose();\n super.destroy();\n }\n}\n","export const linearDefaultCoords = {\n x1: 0,\n y1: 0,\n x2: 0,\n y2: 0,\n};\n\nexport const radialDefaultCoords = {\n ...linearDefaultCoords,\n r1: 0,\n r2: 0,\n};\n","/**\n *\n * @param value value to check if NaN\n * @param [valueIfNaN]\n * @returns `fallback` is `value is NaN\n */\nexport const ifNaN = (value: number, valueIfNaN?: number) => {\n return isNaN(value) && typeof valueIfNaN === 'number' ? valueIfNaN : value;\n};\n","import { ifNaN } from '../util/internals/ifNaN';\nimport { capValue } from '../util/misc/capValue';\n\nconst RE_PERCENT = /^(\\d+\\.\\d+)%|(\\d+)%$/;\n\nexport function isPercent(value: string | null) {\n return value && RE_PERCENT.test(value);\n}\n\n/**\n *\n * @param value\n * @param valueIfNaN\n * @returns ∈ [0, 1]\n */\nexport function parsePercent(\n value: string | number | null | undefined,\n valueIfNaN?: number,\n) {\n const parsed =\n typeof value === 'number'\n ? value\n : typeof value === 'string'\n ? parseFloat(value) / (isPercent(value) ? 100 : 1)\n : NaN;\n return capValue(0, ifNaN(parsed, valueIfNaN), 1);\n}\n","import { Color } from '../../color/Color';\nimport { parsePercent } from '../../parser/percent';\nimport { ifNaN } from '../../util/internals/ifNaN';\nimport type { ColorStop } from '../typedefs';\n\nconst RE_KEY_VALUE_PAIRS = /\\s*;\\s*/;\nconst RE_KEY_VALUE = /\\s*:\\s*/;\n\nfunction parseColorStop(el: SVGStopElement, opacityMultiplier: number) {\n let colorValue, opacityValue;\n const style = el.getAttribute('style');\n if (style) {\n const keyValuePairs = style.split(RE_KEY_VALUE_PAIRS);\n\n if (keyValuePairs[keyValuePairs.length - 1] === '') {\n keyValuePairs.pop();\n }\n\n for (let i = keyValuePairs.length; i--; ) {\n const [key, value] = keyValuePairs[i]\n .split(RE_KEY_VALUE)\n .map((s) => s.trim());\n if (key === 'stop-color') {\n colorValue = value;\n } else if (key === 'stop-opacity') {\n opacityValue = value;\n }\n }\n }\n\n colorValue = colorValue || el.getAttribute('stop-color') || 'rgb(0,0,0)';\n opacityValue = ifNaN(\n parseFloat(opacityValue || el.getAttribute('stop-opacity') || ''),\n 1,\n );\n\n const color = new Color(colorValue);\n\n color.setAlpha(color.getAlpha() * opacityValue * opacityMultiplier);\n\n return {\n offset: parsePercent(el.getAttribute('offset'), 0),\n color: color.toRgba(),\n };\n}\n\nexport function parseColorStops(\n el: SVGGradientElement,\n opacityAttr: string | null,\n) {\n const colorStops: ColorStop[] = [],\n colorStopEls = el.getElementsByTagName('stop'),\n multiplier = parsePercent(opacityAttr, 1);\n for (let i = colorStopEls.length; i--; ) {\n colorStops.push(parseColorStop(colorStopEls[i], multiplier));\n }\n return colorStops;\n}\n","import type { GradientType, GradientUnits } from '../typedefs';\n\nexport function parseType(el: SVGGradientElement): GradientType {\n return el.nodeName === 'linearGradient' || el.nodeName === 'LINEARGRADIENT'\n ? 'linear'\n : 'radial';\n}\n\nexport function parseGradientUnits(el: SVGGradientElement): GradientUnits {\n return el.getAttribute('gradientUnits') === 'userSpaceOnUse'\n ? 'pixels'\n : 'percentage';\n}\n","import { isPercent } from '../../parser/percent';\nimport type { TSize } from '../../typedefs';\nimport type { GradientCoords, GradientType, GradientUnits } from '../typedefs';\nimport { parseGradientUnits, parseType } from './misc';\n\nfunction convertPercentUnitsToValues<\n T extends GradientType,\n K extends keyof GradientCoords,\n>(\n valuesToConvert: Record,\n { width, height, gradientUnits }: TSize & { gradientUnits: GradientUnits },\n) {\n let finalValue;\n return (Object.keys(valuesToConvert) as K[]).reduce(\n (acc, prop) => {\n const propValue = valuesToConvert[prop];\n if (propValue === 'Infinity') {\n finalValue = 1;\n } else if (propValue === '-Infinity') {\n finalValue = 0;\n } else {\n finalValue =\n typeof propValue === 'string' ? parseFloat(propValue) : propValue;\n if (typeof propValue === 'string' && isPercent(propValue)) {\n finalValue *= 0.01;\n if (gradientUnits === 'pixels') {\n // then we need to fix those percentages here in svg parsing\n if (prop === 'x1' || prop === 'x2' || prop === 'r2') {\n finalValue *= width;\n }\n if (prop === 'y1' || prop === 'y2') {\n finalValue *= height;\n }\n }\n }\n }\n acc[prop] = finalValue;\n return acc;\n },\n {} as Record,\n );\n}\n\nfunction getValue(el: SVGGradientElement, key: string) {\n return el.getAttribute(key);\n}\n\nexport function parseLinearCoords(el: SVGGradientElement) {\n return {\n x1: getValue(el, 'x1') || 0,\n y1: getValue(el, 'y1') || 0,\n x2: getValue(el, 'x2') || '100%',\n y2: getValue(el, 'y2') || 0,\n };\n}\n\nexport function parseRadialCoords(el: SVGGradientElement) {\n return {\n x1: getValue(el, 'fx') || getValue(el, 'cx') || '50%',\n y1: getValue(el, 'fy') || getValue(el, 'cy') || '50%',\n r1: 0,\n x2: getValue(el, 'cx') || '50%',\n y2: getValue(el, 'cy') || '50%',\n r2: getValue(el, 'r') || '50%',\n };\n}\n\nexport function parseCoords(el: SVGGradientElement, size: TSize) {\n return convertPercentUnitsToValues(\n parseType(el) === 'linear' ? parseLinearCoords(el) : parseRadialCoords(el),\n {\n ...size,\n gradientUnits: parseGradientUnits(el),\n },\n );\n}\n","import { iMatrix } from '../constants';\nimport { parseTransformAttribute } from '../parser/parseTransformAttribute';\nimport type { FabricObject } from '../shapes/Object/FabricObject';\nimport type { TMat2D } from '../typedefs';\nimport { uid } from '../util/internals/uid';\nimport { pick } from '../util/misc/pick';\nimport { matrixToSVG } from '../util/misc/svgExport';\nimport { linearDefaultCoords, radialDefaultCoords } from './constants';\nimport { parseColorStops } from './parser/parseColorStops';\nimport { parseCoords } from './parser/parseCoords';\nimport { parseType, parseGradientUnits } from './parser/misc';\nimport type {\n ColorStop,\n GradientCoords,\n GradientOptions,\n GradientType,\n GradientUnits,\n SVGOptions,\n SerializedGradientProps,\n} from './typedefs';\nimport { classRegistry } from '../ClassRegistry';\nimport { isPath } from '../util/typeAssertions';\n\n/**\n * Gradient class\n * @class Gradient\n * @tutorial {@link http://fabricjs.com/fabric-intro-part-2#gradients}\n */\nexport class Gradient<\n S,\n T extends GradientType = S extends GradientType ? S : 'linear',\n> {\n /**\n * Horizontal offset for aligning gradients coming from SVG when outside pathgroups\n * @type Number\n * @default 0\n */\n declare offsetX: number;\n\n /**\n * Vertical offset for aligning gradients coming from SVG when outside pathgroups\n * @type Number\n * @default 0\n */\n declare offsetY: number;\n\n /**\n * A transform matrix to apply to the gradient before painting.\n * Imported from svg gradients, is not applied with the current transform in the center.\n * Before this transform is applied, the origin point is at the top left corner of the object\n * plus the addition of offsetY and offsetX.\n * @type Number[]\n * @default null\n */\n declare gradientTransform?: TMat2D;\n\n /**\n * coordinates units for coords.\n * If `pixels`, the number of coords are in the same unit of width / height.\n * If set as `percentage` the coords are still a number, but 1 means 100% of width\n * for the X and 100% of the height for the y. It can be bigger than 1 and negative.\n * allowed values pixels or percentage.\n * @type GradientUnits\n * @default 'pixels'\n */\n declare gradientUnits: GradientUnits;\n\n /**\n * Gradient type linear or radial\n * @type GradientType\n * @default 'linear'\n */\n declare type: T;\n\n /**\n * Defines how the gradient is located in space and spread\n * @type GradientCoords\n */\n declare coords: GradientCoords;\n\n /**\n * Defines how many colors a gradient has and how they are located on the axis\n * defined by coords\n * @type GradientCoords\n */\n declare colorStops: ColorStop[];\n\n /**\n * If true, this object will not be exported during the serialization of a canvas\n * @type boolean\n */\n declare excludeFromExport?: boolean;\n\n /**\n * ID used for SVG export functionalities\n * @type number | string\n */\n declare readonly id: string | number;\n\n static type = 'Gradient';\n\n constructor(options: GradientOptions) {\n const {\n type = 'linear' as T,\n gradientUnits = 'pixels',\n coords = {},\n colorStops = [],\n offsetX = 0,\n offsetY = 0,\n gradientTransform,\n id,\n } = options || {};\n Object.assign(this, {\n type,\n gradientUnits,\n coords: {\n ...(type === 'radial' ? radialDefaultCoords : linearDefaultCoords),\n ...coords,\n },\n colorStops,\n offsetX,\n offsetY,\n gradientTransform,\n id: id ? `${id}_${uid()}` : uid(),\n });\n }\n\n /**\n * Adds another colorStop\n * @param {Record} colorStop Object with offset and color\n * @return {Gradient} thisArg\n */\n addColorStop(colorStops: Record) {\n for (const position in colorStops) {\n this.colorStops.push({\n offset: parseFloat(position),\n color: colorStops[position],\n });\n }\n return this;\n }\n\n /**\n * Returns object representation of a gradient\n * @param {string[]} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {object}\n */\n toObject(\n propertiesToInclude?: (keyof this | string)[],\n ): SerializedGradientProps {\n return {\n ...pick(this, propertiesToInclude as (keyof this)[]),\n type: this.type,\n coords: { ...this.coords },\n colorStops: this.colorStops.map((colorStop) => ({ ...colorStop })),\n offsetX: this.offsetX,\n offsetY: this.offsetY,\n gradientUnits: this.gradientUnits,\n gradientTransform: this.gradientTransform\n ? [...this.gradientTransform]\n : undefined,\n };\n }\n\n /* _TO_SVG_START_ */\n /**\n * Returns SVG representation of an gradient\n * @param {FabricObject} object Object to create a gradient for\n * @return {String} SVG representation of an gradient (linear/radial)\n */\n toSVG(\n object: FabricObject,\n {\n additionalTransform: preTransform,\n }: { additionalTransform?: string } = {},\n ) {\n const markup = [],\n transform = (\n this.gradientTransform\n ? this.gradientTransform.concat()\n : iMatrix.concat()\n ) as TMat2D,\n gradientUnits =\n this.gradientUnits === 'pixels'\n ? 'userSpaceOnUse'\n : 'objectBoundingBox';\n // colorStops must be sorted ascending, and guarded against deep mutations\n const colorStops = this.colorStops\n .map((colorStop) => ({ ...colorStop }))\n .sort((a, b) => {\n return a.offset - b.offset;\n });\n\n let offsetX = -this.offsetX,\n offsetY = -this.offsetY;\n if (gradientUnits === 'objectBoundingBox') {\n offsetX /= object.width;\n offsetY /= object.height;\n } else {\n offsetX += object.width / 2;\n offsetY += object.height / 2;\n }\n // todo what about polygon/polyline?\n if (isPath(object) && this.gradientUnits !== 'percentage') {\n offsetX -= object.pathOffset.x;\n offsetY -= object.pathOffset.y;\n }\n transform[4] -= offsetX;\n transform[5] -= offsetY;\n\n const commonAttributes = [\n `id=\"SVGID_${this.id}\"`,\n `gradientUnits=\"${gradientUnits}\"`,\n `gradientTransform=\"${\n preTransform ? preTransform + ' ' : ''\n }${matrixToSVG(transform)}\"`,\n '',\n ].join(' ');\n\n if (this.type === 'linear') {\n const { x1, y1, x2, y2 } = this.coords;\n markup.push(\n '\\n',\n );\n } else if (this.type === 'radial') {\n const { x1, y1, x2, y2, r1, r2 } = this\n .coords as GradientCoords<'radial'>;\n const needsSwap = r1 > r2;\n // svg radial gradient has just 1 radius. the biggest.\n markup.push(\n '\\n',\n );\n if (needsSwap) {\n // svg goes from internal to external radius. if radius are inverted, swap color stops.\n colorStops.reverse(); // mutates array\n colorStops.forEach((colorStop) => {\n colorStop.offset = 1 - colorStop.offset;\n });\n }\n const minRadius = Math.min(r1, r2);\n if (minRadius > 0) {\n // i have to shift all colorStops and add new one in 0.\n const maxRadius = Math.max(r1, r2),\n percentageShift = minRadius / maxRadius;\n colorStops.forEach((colorStop) => {\n colorStop.offset += percentageShift * (1 - colorStop.offset);\n });\n }\n }\n\n colorStops.forEach(({ color, offset }) => {\n markup.push(\n `\\n`,\n );\n });\n\n markup.push(\n this.type === 'linear' ? '' : '',\n '\\n',\n );\n\n return markup.join('');\n }\n /* _TO_SVG_END_ */\n\n /**\n * Returns an instance of CanvasGradient\n * @param {CanvasRenderingContext2D} ctx Context to render on\n * @return {CanvasGradient}\n */\n toLive(ctx: CanvasRenderingContext2D): CanvasGradient {\n const { x1, y1, x2, y2, r1, r2 } = this.coords as GradientCoords<'radial'>;\n const gradient =\n this.type === 'linear'\n ? ctx.createLinearGradient(x1, y1, x2, y2)\n : ctx.createRadialGradient(x1, y1, r1, x2, y2, r2);\n\n this.colorStops.forEach(({ color, offset }) => {\n gradient.addColorStop(offset, color);\n });\n\n return gradient;\n }\n\n static async fromObject(\n options: GradientOptions<'linear'>,\n ): Promise>;\n static async fromObject(\n options: GradientOptions<'radial'>,\n ): Promise>;\n static async fromObject(\n options: GradientOptions<'linear'> | GradientOptions<'radial'>,\n ) {\n const { colorStops, gradientTransform } = options;\n return new this({\n ...options,\n colorStops: colorStops\n ? colorStops.map((colorStop) => ({ ...colorStop }))\n : undefined,\n gradientTransform: gradientTransform ? [...gradientTransform] : undefined,\n });\n }\n\n /* _FROM_SVG_START_ */\n /**\n * Returns {@link Gradient} instance from an SVG element\n * @param {SVGGradientElement} el SVG gradient element\n * @param {FabricObject} instance\n * @param {String} opacity A fill-opacity or stroke-opacity attribute to multiply to each stop's opacity.\n * @param {SVGOptions} svgOptions an object containing the size of the SVG in order to parse correctly gradients\n * that uses gradientUnits as 'userSpaceOnUse' and percentages.\n * @return {Gradient} Gradient instance\n * @see http://www.w3.org/TR/SVG/pservers.html#LinearGradientElement\n * @see http://www.w3.org/TR/SVG/pservers.html#RadialGradientElement\n *\n * @example\n *\n * \n * \n * \n * \n *\n * OR\n *\n * \n * \n * \n * \n *\n * OR\n *\n * \n * \n * \n * \n * \n *\n * OR\n *\n * \n * \n * \n * \n * \n *\n */\n static fromElement(\n el: SVGGradientElement,\n instance: FabricObject,\n svgOptions: SVGOptions,\n ): Gradient {\n const gradientUnits = parseGradientUnits(el);\n const center = instance._findCenterFromElement();\n return new this({\n id: el.getAttribute('id') || undefined,\n type: parseType(el),\n coords: parseCoords(el, {\n width: svgOptions.viewBoxWidth || svgOptions.width,\n height: svgOptions.viewBoxHeight || svgOptions.height,\n }),\n colorStops: parseColorStops(el, svgOptions.opacity),\n gradientUnits,\n gradientTransform: parseTransformAttribute(\n el.getAttribute('gradientTransform') || '',\n ),\n ...(gradientUnits === 'pixels'\n ? {\n offsetX: instance.width / 2 - center.x,\n offsetY: instance.height / 2 - center.y,\n }\n : {\n offsetX: 0,\n offsetY: 0,\n }),\n });\n }\n /* _FROM_SVG_END_ */\n}\n\nclassRegistry.setClass(Gradient, 'gradient');\nclassRegistry.setClass(Gradient, 'linear');\nclassRegistry.setClass(Gradient, 'radial');\n","import { config } from '../config';\nimport type { Abortable, TCrossOrigin, TMat2D, TSize } from '../typedefs';\nimport { ifNaN } from '../util/internals/ifNaN';\nimport { uid } from '../util/internals/uid';\nimport { loadImage } from '../util/misc/objectEnlive';\nimport { pick } from '../util/misc/pick';\nimport { toFixed } from '../util/misc/toFixed';\nimport { classRegistry } from '../ClassRegistry';\nimport type {\n PatternRepeat,\n PatternOptions,\n SerializedPatternOptions,\n} from './types';\nimport { log } from '../util/internals/console';\n\n/**\n * @see {@link http://fabricjs.com/patterns demo}\n * @see {@link http://fabricjs.com/dynamic-patterns demo}\n */\nexport class Pattern {\n static type = 'Pattern';\n\n /**\n * Legacy identifier of the class. Prefer using this.constructor.type 'Pattern'\n * or utils like isPattern, or instance of to indentify a pattern in your code.\n * Will be removed in future versiones\n * @TODO add sustainable warning message\n * @type string\n * @deprecated\n */\n get type() {\n return 'pattern';\n }\n\n set type(value) {\n log('warn', 'Setting type has no effect', value);\n }\n\n /**\n * @type PatternRepeat\n * @defaults\n */\n repeat: PatternRepeat = 'repeat';\n\n /**\n * Pattern horizontal offset from object's left/top corner\n * @type Number\n */\n offsetX = 0;\n\n /**\n * Pattern vertical offset from object's left/top corner\n * @type Number\n */\n offsetY = 0;\n\n /**\n * @type TCrossOrigin\n */\n crossOrigin: TCrossOrigin = '';\n\n /**\n * transform matrix to change the pattern, imported from svgs.\n * @todo verify if using the identity matrix as default makes the rest of the code more easy\n * @type Array\n */\n declare patternTransform?: TMat2D;\n\n /**\n * The actual pixel source of the pattern\n */\n declare source: CanvasImageSource;\n\n /**\n * If true, this object will not be exported during the serialization of a canvas\n * @type boolean\n */\n declare excludeFromExport?: boolean;\n\n /**\n * ID used for SVG export functionalities\n * @type number\n */\n declare readonly id: number;\n\n /**\n * Constructor\n * @param {Object} [options] Options object\n * @param {option.source} [source] the pattern source, eventually empty or a drawable\n */\n constructor(options: PatternOptions) {\n this.id = uid();\n Object.assign(this, options);\n }\n\n /**\n * @returns true if {@link source} is an element\n */\n isImageSource(): this is { source: HTMLImageElement } {\n return (\n !!this.source && typeof (this.source as HTMLImageElement).src === 'string'\n );\n }\n\n /**\n * @returns true if {@link source} is a element\n */\n isCanvasSource(): this is { source: HTMLCanvasElement } {\n return !!this.source && !!(this.source as HTMLCanvasElement).toDataURL;\n }\n\n sourceToString(): string {\n return this.isImageSource()\n ? this.source.src\n : this.isCanvasSource()\n ? this.source.toDataURL()\n : '';\n }\n\n /**\n * Returns an instance of CanvasPattern\n * @param {CanvasRenderingContext2D} ctx Context to create pattern\n * @return {CanvasPattern}\n */\n toLive(ctx: CanvasRenderingContext2D): CanvasPattern | null {\n if (\n // if the image failed to load, return, and allow rest to continue loading\n !this.source ||\n // if an image\n (this.isImageSource() &&\n (!this.source.complete ||\n this.source.naturalWidth === 0 ||\n this.source.naturalHeight === 0))\n ) {\n return null;\n }\n\n return ctx.createPattern(this.source, this.repeat)!;\n }\n\n /**\n * Returns object representation of a pattern\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {object} Object representation of a pattern instance\n */\n toObject(propertiesToInclude: string[] = []): Record {\n const { repeat, crossOrigin } = this;\n return {\n ...pick(this, propertiesToInclude as (keyof this)[]),\n type: 'pattern',\n source: this.sourceToString(),\n repeat,\n crossOrigin,\n offsetX: toFixed(this.offsetX, config.NUM_FRACTION_DIGITS),\n offsetY: toFixed(this.offsetY, config.NUM_FRACTION_DIGITS),\n patternTransform: this.patternTransform\n ? [...this.patternTransform]\n : null,\n };\n }\n\n /* _TO_SVG_START_ */\n /**\n * Returns SVG representation of a pattern\n */\n toSVG({ width, height }: TSize): string {\n const { source: patternSource, repeat, id } = this,\n patternOffsetX = ifNaN(this.offsetX / width, 0),\n patternOffsetY = ifNaN(this.offsetY / height, 0),\n patternWidth =\n repeat === 'repeat-y' || repeat === 'no-repeat'\n ? 1 + Math.abs(patternOffsetX || 0)\n : ifNaN((patternSource as HTMLImageElement).width / width, 0),\n patternHeight =\n repeat === 'repeat-x' || repeat === 'no-repeat'\n ? 1 + Math.abs(patternOffsetY || 0)\n : ifNaN((patternSource as HTMLImageElement).height / height, 0);\n\n return [\n ``,\n ``,\n ``,\n '',\n ].join('\\n');\n }\n /* _TO_SVG_END_ */\n\n static async fromObject(\n {\n type,\n source,\n patternTransform,\n ...otherOptions\n }: SerializedPatternOptions,\n options?: Abortable,\n ): Promise {\n const img = await loadImage(source, {\n ...options,\n crossOrigin: otherOptions.crossOrigin,\n });\n return new this({\n ...otherOptions,\n patternTransform:\n patternTransform && (patternTransform.slice(0) as TMat2D),\n source: img,\n });\n }\n}\n\nclassRegistry.setClass(Pattern);\n// kept for compatibility reason\nclassRegistry.setClass(Pattern, 'pattern');\n","import { Color } from '../color/Color';\nimport type { Point } from '../Point';\nimport type { Shadow } from '../Shadow';\nimport type { Canvas } from '../canvas/Canvas';\nimport type { TBrushEventData } from './typedefs';\n\n/**\n * @see {@link http://fabricjs.com/freedrawing|Freedrawing demo}\n */\nexport abstract class BaseBrush {\n /**\n * Color of a brush\n * @type String\n */\n color = 'rgb(0, 0, 0)';\n\n /**\n * Width of a brush, has to be a Number, no string literals\n * @type Number\n */\n width = 1;\n\n /**\n * Shadow object representing shadow of this shape.\n * Backwards incompatibility note: This property replaces \"shadowColor\" (String), \"shadowOffsetX\" (Number),\n * \"shadowOffsetY\" (Number) and \"shadowBlur\" (Number) since v1.2.12\n * @type Shadow\n */\n shadow: Shadow | null = null;\n\n /**\n * Line endings style of a brush (one of \"butt\", \"round\", \"square\")\n * @type String\n */\n strokeLineCap: CanvasLineCap = 'round';\n\n /**\n * Corner style of a brush (one of \"bevel\", \"round\", \"miter\")\n * @type String\n */\n strokeLineJoin: CanvasLineJoin = 'round';\n\n /**\n * Maximum miter length (used for strokeLineJoin = \"miter\") of a brush's\n * @type Number\n */\n strokeMiterLimit = 10;\n\n /**\n * Stroke Dash Array.\n * @type Array\n */\n strokeDashArray: number[] | null = null;\n\n /**\n * When `true`, the free drawing is limited to the whiteboard size. Default to false.\n * @type Boolean\n * @default false\n */\n\n limitedToCanvasSize = false;\n\n /**\n * @todo add type\n */\n declare canvas: Canvas;\n\n constructor(canvas: Canvas) {\n this.canvas = canvas;\n }\n\n abstract _render(): void;\n abstract onMouseDown(pointer: Point, ev: TBrushEventData): void;\n abstract onMouseMove(pointer: Point, ev: TBrushEventData): void;\n /**\n * @returns true if brush should continue blocking interaction\n */\n abstract onMouseUp(ev: TBrushEventData): boolean | void;\n\n /**\n * Sets brush styles\n * @private\n * @param {CanvasRenderingContext2D} ctx\n */\n _setBrushStyles(ctx: CanvasRenderingContext2D) {\n ctx.strokeStyle = this.color;\n ctx.lineWidth = this.width;\n ctx.lineCap = this.strokeLineCap;\n ctx.miterLimit = this.strokeMiterLimit;\n ctx.lineJoin = this.strokeLineJoin;\n ctx.setLineDash(this.strokeDashArray || []);\n }\n\n /**\n * Sets the transformation on given context\n * @param {CanvasRenderingContext2D} ctx context to render on\n * @private\n */\n protected _saveAndTransform(ctx: CanvasRenderingContext2D) {\n const v = this.canvas.viewportTransform;\n ctx.save();\n ctx.transform(v[0], v[1], v[2], v[3], v[4], v[5]);\n }\n\n protected needsFullRender() {\n const color = new Color(this.color);\n return color.getAlpha() < 1 || !!this.shadow;\n }\n\n /**\n * Sets brush shadow styles\n * @private\n */\n protected _setShadow() {\n if (!this.shadow || !this.canvas) {\n return;\n }\n\n const canvas = this.canvas,\n shadow = this.shadow,\n ctx = canvas.contextTop,\n zoom = canvas.getZoom() * canvas.getRetinaScaling();\n\n ctx.shadowColor = shadow.color;\n ctx.shadowBlur = shadow.blur * zoom;\n ctx.shadowOffsetX = shadow.offsetX * zoom;\n ctx.shadowOffsetY = shadow.offsetY * zoom;\n }\n\n /**\n * Removes brush shadow styles\n * @private\n */\n protected _resetShadow() {\n const ctx = this.canvas.contextTop;\n\n ctx.shadowColor = '';\n ctx.shadowBlur = ctx.shadowOffsetX = ctx.shadowOffsetY = 0;\n }\n\n /**\n * Check is pointer is outside canvas boundaries\n * @param {Object} pointer\n * @private\n */\n protected _isOutSideCanvas(pointer: Point) {\n return (\n pointer.x < 0 ||\n pointer.x > this.canvas.getWidth() ||\n pointer.y < 0 ||\n pointer.y > this.canvas.getHeight()\n );\n }\n}\n","import { config } from '../config';\nimport { SHARED_ATTRIBUTES } from '../parser/attributes';\nimport { parseAttributes } from '../parser/parseAttributes';\nimport type { XY } from '../Point';\nimport { Point } from '../Point';\nimport { makeBoundingBoxFromPoints } from '../util/misc/boundingBoxFromPoints';\nimport { toFixed } from '../util/misc/toFixed';\nimport {\n getBoundsOfCurve,\n joinPath,\n makePathSimpler,\n parsePath,\n} from '../util/path';\nimport { classRegistry } from '../ClassRegistry';\nimport { FabricObject, cacheProperties } from './Object/FabricObject';\nimport type {\n TComplexPathData,\n TPathSegmentInfo,\n TSimplePathData,\n} from '../util/path/typedefs';\nimport type { FabricObjectProps, SerializedObjectProps } from './Object/types';\nimport type { ObjectEvents } from '../EventTypeDefs';\nimport type {\n TBBox,\n TClassProperties,\n TSVGReviver,\n TOptions,\n} from '../typedefs';\nimport { CENTER, LEFT, TOP } from '../constants';\nimport type { CSSRules } from '../parser/typedefs';\n\ninterface UniquePathProps {\n sourcePath?: string;\n path?: TSimplePathData;\n}\n\nexport interface SerializedPathProps\n extends SerializedObjectProps,\n UniquePathProps {}\n\nexport interface PathProps extends FabricObjectProps, UniquePathProps {}\n\nexport interface IPathBBox extends TBBox {\n left: number;\n top: number;\n pathOffset: Point;\n}\n\nexport class Path<\n Props extends TOptions = Partial,\n SProps extends SerializedPathProps = SerializedPathProps,\n EventSpec extends ObjectEvents = ObjectEvents,\n> extends FabricObject {\n /**\n * Array of path points\n * @type Array\n */\n declare path: TSimplePathData;\n\n declare pathOffset: Point;\n\n declare sourcePath?: string;\n\n declare segmentsInfo?: TPathSegmentInfo[];\n\n static type = 'Path';\n\n static cacheProperties = [...cacheProperties, 'path', 'fillRule'];\n\n /**\n * Constructor\n * @param {TComplexPathData} path Path data (sequence of coordinates and corresponding \"command\" tokens)\n * @param {Partial} [options] Options object\n * @return {Path} thisArg\n */\n constructor(\n path: TComplexPathData | string,\n // todo: evaluate this spread here\n { path: _, left, top, ...options }: Partial = {},\n ) {\n super();\n Object.assign(this, Path.ownDefaults);\n this.setOptions(options);\n this._setPath(path || [], true);\n typeof left === 'number' && this.set(LEFT, left);\n typeof top === 'number' && this.set(TOP, top);\n }\n\n /**\n * @private\n * @param {TComplexPathData | string} path Path data (sequence of coordinates and corresponding \"command\" tokens)\n * @param {boolean} [adjustPosition] pass true to reposition the object according to the bounding box\n * @returns {Point} top left position of the bounding box, useful for complementary positioning\n */\n _setPath(path: TComplexPathData | string, adjustPosition?: boolean) {\n this.path = makePathSimpler(Array.isArray(path) ? path : parsePath(path));\n this.setBoundingBox(adjustPosition);\n }\n\n /**\n * This function is an helper for svg import. it returns the center of the object in the svg\n * untransformed coordinates, by look at the polyline/polygon points.\n * @private\n * @return {Point} center point from element coordinates\n */\n _findCenterFromElement(): Point {\n const bbox = this._calcBoundsFromPath();\n return new Point(bbox.left + bbox.width / 2, bbox.top + bbox.height / 2);\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx context to render path on\n */\n _renderPathCommands(ctx: CanvasRenderingContext2D) {\n const l = -this.pathOffset.x,\n t = -this.pathOffset.y;\n\n ctx.beginPath();\n\n for (const command of this.path) {\n switch (\n command[0] // first letter\n ) {\n case 'L': // lineto, absolute\n ctx.lineTo(command[1] + l, command[2] + t);\n break;\n\n case 'M': // moveTo, absolute\n ctx.moveTo(command[1] + l, command[2] + t);\n break;\n\n case 'C': // bezierCurveTo, absolute\n ctx.bezierCurveTo(\n command[1] + l,\n command[2] + t,\n command[3] + l,\n command[4] + t,\n command[5] + l,\n command[6] + t,\n );\n break;\n\n case 'Q': // quadraticCurveTo, absolute\n ctx.quadraticCurveTo(\n command[1] + l,\n command[2] + t,\n command[3] + l,\n command[4] + t,\n );\n break;\n\n case 'Z':\n ctx.closePath();\n break;\n }\n }\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx context to render path on\n */\n _render(ctx: CanvasRenderingContext2D) {\n this._renderPathCommands(ctx);\n this._renderPaintInOrder(ctx);\n }\n\n /**\n * Returns string representation of an instance\n * @return {string} string representation of an instance\n */\n toString() {\n return `#`;\n }\n\n /**\n * Returns object representation of an instance\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} object representation of an instance\n */\n toObject<\n T extends Omit, keyof SProps>,\n K extends keyof T = never,\n >(propertiesToInclude: K[] = []): Pick & SProps {\n return {\n ...super.toObject(propertiesToInclude),\n path: this.path.map((pathCmd) => pathCmd.slice()),\n };\n }\n\n /**\n * Returns dataless object representation of an instance\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} object representation of an instance\n */\n toDatalessObject<\n T extends Omit, keyof SProps>,\n K extends keyof T = never,\n >(propertiesToInclude: K[] = []): Pick & SProps {\n const o = this.toObject(propertiesToInclude);\n if (this.sourcePath) {\n delete o.path;\n o.sourcePath = this.sourcePath;\n }\n return o;\n }\n\n /**\n * Returns svg representation of an instance\n * @return {Array} an array of strings with the specific svg representation\n * of the instance\n */\n _toSVG() {\n const path = joinPath(this.path, config.NUM_FRACTION_DIGITS);\n return [\n '\\n`,\n ];\n }\n\n /**\n * @private\n * @return the path command's translate transform attribute\n */\n _getOffsetTransform() {\n const digits = config.NUM_FRACTION_DIGITS;\n return ` translate(${toFixed(-this.pathOffset.x, digits)}, ${toFixed(\n -this.pathOffset.y,\n digits,\n )})`;\n }\n\n /**\n * Returns svg clipPath representation of an instance\n * @param {Function} [reviver] Method for further parsing of svg representation.\n * @return {string} svg representation of an instance\n */\n toClipPathSVG(reviver?: TSVGReviver): string {\n const additionalTransform = this._getOffsetTransform();\n return (\n '\\t' +\n this._createBaseClipPathSVGMarkup(this._toSVG(), {\n reviver,\n additionalTransform: additionalTransform,\n })\n );\n }\n\n /**\n * Returns svg representation of an instance\n * @param {Function} [reviver] Method for further parsing of svg representation.\n * @return {string} svg representation of an instance\n */\n toSVG(reviver?: TSVGReviver): string {\n const additionalTransform = this._getOffsetTransform();\n return this._createBaseSVGMarkup(this._toSVG(), {\n reviver,\n additionalTransform: additionalTransform,\n });\n }\n\n /**\n * Returns number representation of an instance complexity\n * @return {number} complexity of this instance\n */\n complexity() {\n return this.path.length;\n }\n\n setDimensions() {\n this.setBoundingBox();\n }\n\n setBoundingBox(adjustPosition?: boolean) {\n const { width, height, pathOffset } = this._calcDimensions();\n this.set({ width, height, pathOffset });\n // using pathOffset because it match the use case.\n // if pathOffset change here we need to use left + width/2 , top + height/2\n adjustPosition && this.setPositionByOrigin(pathOffset, CENTER, CENTER);\n }\n\n _calcBoundsFromPath(): TBBox {\n const bounds: XY[] = [];\n let subpathStartX = 0,\n subpathStartY = 0,\n x = 0, // current x\n y = 0; // current y\n\n for (const command of this.path) {\n // current instruction\n switch (\n command[0] // first letter\n ) {\n case 'L': // lineto, absolute\n x = command[1];\n y = command[2];\n bounds.push({ x: subpathStartX, y: subpathStartY }, { x, y });\n break;\n\n case 'M': // moveTo, absolute\n x = command[1];\n y = command[2];\n subpathStartX = x;\n subpathStartY = y;\n break;\n\n case 'C': // bezierCurveTo, absolute\n bounds.push(\n ...getBoundsOfCurve(\n x,\n y,\n command[1],\n command[2],\n command[3],\n command[4],\n command[5],\n command[6],\n ),\n );\n x = command[5];\n y = command[6];\n break;\n\n case 'Q': // quadraticCurveTo, absolute\n bounds.push(\n ...getBoundsOfCurve(\n x,\n y,\n command[1],\n command[2],\n command[1],\n command[2],\n command[3],\n command[4],\n ),\n );\n x = command[3];\n y = command[4];\n break;\n\n case 'Z':\n x = subpathStartX;\n y = subpathStartY;\n break;\n }\n }\n return makeBoundingBoxFromPoints(bounds);\n }\n\n /**\n * @private\n */\n _calcDimensions(): IPathBBox {\n const bbox = this._calcBoundsFromPath();\n\n return {\n ...bbox,\n pathOffset: new Point(\n bbox.left + bbox.width / 2,\n bbox.top + bbox.height / 2,\n ),\n };\n }\n\n /**\n * List of attribute names to account for when parsing SVG element (used by `Path.fromElement`)\n * @see http://www.w3.org/TR/SVG/paths.html#PathElement\n */\n static ATTRIBUTE_NAMES = [...SHARED_ATTRIBUTES, 'd'];\n\n /**\n * Creates an instance of Path from an object\n * @param {Object} object\n * @returns {Promise}\n */\n static fromObject>(object: T) {\n return this._fromObject(object, {\n extraParam: 'path',\n });\n }\n\n /**\n * Creates an instance of Path from an SVG element\n * @param {HTMLElement} element to parse\n * @param {Partial} [options] Options object\n */\n static async fromElement(\n element: HTMLElement | SVGElement,\n options?: Partial,\n cssRules?: CSSRules,\n ) {\n const { d, ...parsedAttributes } = parseAttributes(\n element,\n this.ATTRIBUTE_NAMES,\n cssRules,\n );\n return new this(d, {\n ...parsedAttributes,\n ...options,\n // we pass undefined to instruct the constructor to position the object using the bbox\n left: undefined,\n top: undefined,\n });\n }\n}\n\nclassRegistry.setClass(Path);\nclassRegistry.setSVGClass(Path);\n\n/* _FROM_SVG_START_ */\n","import type { ModifierKey, TEvent } from '../EventTypeDefs';\nimport type { Point } from '../Point';\nimport { Shadow } from '../Shadow';\nimport { Path } from '../shapes/Path';\nimport { getSmoothPathFromPoints, joinPath } from '../util/path';\nimport type { Canvas } from '../canvas/Canvas';\nimport { BaseBrush } from './BaseBrush';\nimport type { TSimplePathData } from '../util/path/typedefs';\n\n/**\n * @private\n * @param {TSimplePathData} pathData SVG path commands\n * @returns {boolean}\n */\nfunction isEmptySVGPath(pathData: TSimplePathData): boolean {\n return joinPath(pathData) === 'M 0 0 Q 0 0 0 0 L 0 0';\n}\n\nexport class PencilBrush extends BaseBrush {\n /**\n * Discard points that are less than `decimate` pixel distant from each other\n * @type Number\n * @default 0.4\n */\n decimate = 0.4;\n\n /**\n * Draws a straight line between last recorded point to current pointer\n * Used for `shift` functionality\n *\n * @type boolean\n * @default false\n */\n drawStraightLine = false;\n\n /**\n * The event modifier key that makes the brush draw a straight line.\n * If `null` or 'none' or any other string that is not a modifier key the feature is disabled.\n * @type {ModifierKey | undefined | null}\n */\n straightLineKey: ModifierKey | undefined | null = 'shiftKey';\n\n declare protected _points: Point[];\n declare protected _hasStraightLine: boolean;\n declare protected oldEnd?: Point;\n\n constructor(canvas: Canvas) {\n super(canvas);\n this._points = [];\n this._hasStraightLine = false;\n }\n\n needsFullRender() {\n return super.needsFullRender() || this._hasStraightLine;\n }\n\n static drawSegment(ctx: CanvasRenderingContext2D, p1: Point, p2: Point) {\n const midPoint = p1.midPointFrom(p2);\n ctx.quadraticCurveTo(p1.x, p1.y, midPoint.x, midPoint.y);\n return midPoint;\n }\n\n /**\n * Invoked on mouse down\n * @param {Point} pointer\n */\n onMouseDown(pointer: Point, { e }: TEvent) {\n if (!this.canvas._isMainEvent(e)) {\n return;\n }\n this.drawStraightLine = !!this.straightLineKey && e[this.straightLineKey];\n this._prepareForDrawing(pointer);\n // capture coordinates immediately\n // this allows to draw dots (when movement never occurs)\n this._addPoint(pointer);\n this._render();\n }\n\n /**\n * Invoked on mouse move\n * @param {Point} pointer\n */\n onMouseMove(pointer: Point, { e }: TEvent) {\n if (!this.canvas._isMainEvent(e)) {\n return;\n }\n this.drawStraightLine = !!this.straightLineKey && e[this.straightLineKey];\n if (this.limitedToCanvasSize === true && this._isOutSideCanvas(pointer)) {\n return;\n }\n if (this._addPoint(pointer) && this._points.length > 1) {\n if (this.needsFullRender()) {\n // redraw curve\n // clear top canvas\n this.canvas.clearContext(this.canvas.contextTop);\n this._render();\n } else {\n const points = this._points,\n length = points.length,\n ctx = this.canvas.contextTop;\n // draw the curve update\n this._saveAndTransform(ctx);\n if (this.oldEnd) {\n ctx.beginPath();\n ctx.moveTo(this.oldEnd.x, this.oldEnd.y);\n }\n this.oldEnd = PencilBrush.drawSegment(\n ctx,\n points[length - 2],\n points[length - 1],\n );\n ctx.stroke();\n ctx.restore();\n }\n }\n }\n\n /**\n * Invoked on mouse up\n */\n onMouseUp({ e }: TEvent) {\n if (!this.canvas._isMainEvent(e)) {\n return true;\n }\n this.drawStraightLine = false;\n this.oldEnd = undefined;\n this._finalizeAndAddPath();\n\n return false;\n }\n\n /**\n * @private\n * @param {Point} pointer Actual mouse position related to the canvas.\n */\n _prepareForDrawing(pointer: Point) {\n this._reset();\n this._addPoint(pointer);\n this.canvas.contextTop.moveTo(pointer.x, pointer.y);\n }\n\n /**\n * @private\n * @param {Point} point Point to be added to points array\n */\n _addPoint(point: Point) {\n if (\n this._points.length > 1 &&\n point.eq(this._points[this._points.length - 1])\n ) {\n return false;\n }\n if (this.drawStraightLine && this._points.length > 1) {\n this._hasStraightLine = true;\n this._points.pop();\n }\n this._points.push(point);\n return true;\n }\n\n /**\n * Clear points array and set contextTop canvas style.\n * @private\n */\n _reset() {\n this._points = [];\n this._setBrushStyles(this.canvas.contextTop);\n this._setShadow();\n this._hasStraightLine = false;\n }\n\n /**\n * Draw a smooth path on the topCanvas using quadraticCurveTo\n * @private\n * @param {CanvasRenderingContext2D} [ctx]\n */\n _render(ctx: CanvasRenderingContext2D = this.canvas.contextTop) {\n let p1 = this._points[0],\n p2 = this._points[1];\n this._saveAndTransform(ctx);\n ctx.beginPath();\n //if we only have 2 points in the path and they are the same\n //it means that the user only clicked the canvas without moving the mouse\n //then we should be drawing a dot. A path isn't drawn between two identical dots\n //that's why we set them apart a bit\n if (this._points.length === 2 && p1.x === p2.x && p1.y === p2.y) {\n const width = this.width / 1000;\n p1.x -= width;\n p2.x += width;\n }\n ctx.moveTo(p1.x, p1.y);\n\n for (let i = 1; i < this._points.length; i++) {\n // we pick the point between pi + 1 & pi + 2 as the\n // end point and p1 as our control point.\n PencilBrush.drawSegment(ctx, p1, p2);\n p1 = this._points[i];\n p2 = this._points[i + 1];\n }\n // Draw last line as a straight line while\n // we wait for the next point to be able to calculate\n // the bezier control point\n ctx.lineTo(p1.x, p1.y);\n ctx.stroke();\n ctx.restore();\n }\n\n /**\n * Converts points to SVG path\n * @param {Point[]} points Array of points\n * @return {TSimplePathData} SVG path commands\n */\n convertPointsToSVGPath(points: Point[]): TSimplePathData {\n const correction = this.width / 1000;\n return getSmoothPathFromPoints(points, correction);\n }\n\n /**\n * Creates a Path object to add on canvas\n * @param {TSimplePathData} pathData Path data\n * @return {Path} Path to add on canvas\n */\n createPath(pathData: TSimplePathData): Path {\n const path = new Path(pathData, {\n fill: null,\n stroke: this.color,\n strokeWidth: this.width,\n strokeLineCap: this.strokeLineCap,\n strokeMiterLimit: this.strokeMiterLimit,\n strokeLineJoin: this.strokeLineJoin,\n strokeDashArray: this.strokeDashArray,\n });\n if (this.shadow) {\n this.shadow.affectStroke = true;\n path.shadow = new Shadow(this.shadow);\n }\n\n return path;\n }\n\n /**\n * Decimate points array with the decimate value\n */\n decimatePoints(points: Point[], distance: number) {\n if (points.length <= 2) {\n return points;\n }\n let lastPoint = points[0],\n cDistance;\n const zoom = this.canvas.getZoom(),\n adjustedDistance = Math.pow(distance / zoom, 2),\n l = points.length - 1,\n newPoints = [lastPoint];\n // TODO investigate why this is not i < l\n for (let i = 1; i < l - 1; i++) {\n cDistance =\n Math.pow(lastPoint.x - points[i].x, 2) +\n Math.pow(lastPoint.y - points[i].y, 2);\n if (cDistance >= adjustedDistance) {\n lastPoint = points[i];\n newPoints.push(lastPoint);\n }\n }\n // Add the last point from the original line to the end of the array.\n // This ensures decimate doesn't delete the last point on the line, and ensures the line is > 1 point.\n newPoints.push(points[l]);\n return newPoints;\n }\n\n /**\n * On mouseup after drawing the path on contextTop canvas\n * we use the points captured to create an new Path object\n * and add it to the canvas.\n */\n _finalizeAndAddPath() {\n const ctx = this.canvas.contextTop;\n ctx.closePath();\n if (this.decimate) {\n this._points = this.decimatePoints(this._points, this.decimate);\n }\n const pathData = this.convertPointsToSVGPath(this._points);\n if (isEmptySVGPath(pathData)) {\n // do not create 0 width/height paths, as they are\n // rendered inconsistently across browsers\n // Firefox 4, for example, renders a dot,\n // whereas Chrome 10 renders nothing\n this.canvas.requestRenderAll();\n return;\n }\n\n const path = this.createPath(pathData);\n this.canvas.clearContext(this.canvas.contextTop);\n this.canvas.fire('before:path:created', { path: path });\n this.canvas.add(path);\n this.canvas.requestRenderAll();\n path.setCoords();\n this._resetShadow();\n\n // fire event 'path' created\n this.canvas.fire('path:created', { path: path });\n }\n}\n","import type { ObjectEvents } from '../EventTypeDefs';\nimport { SHARED_ATTRIBUTES } from '../parser/attributes';\nimport { parseAttributes } from '../parser/parseAttributes';\nimport { cos } from '../util/misc/cos';\nimport { degreesToRadians } from '../util/misc/radiansDegreesConversion';\nimport { sin } from '../util/misc/sin';\nimport { classRegistry } from '../ClassRegistry';\nimport { FabricObject, cacheProperties } from './Object/FabricObject';\nimport type { Abortable, TClassProperties, TOptions } from '../typedefs';\nimport type { FabricObjectProps, SerializedObjectProps } from './Object/types';\nimport type { CSSRules } from '../parser/typedefs';\nimport { SCALE_X, SCALE_Y } from '../constants';\n\ninterface UniqueCircleProps {\n /**\n * Radius of this circle\n * @type Number\n * @default 0\n */\n radius: number;\n\n /**\n * Angle for the start of the circle, in degrees.\n * @type TDegree 0 - 359\n * @default 0\n */\n startAngle: number;\n\n /**\n * Angle for the end of the circle, in degrees\n * @type TDegree 1 - 360\n * @default 360\n */\n endAngle: number;\n\n /**\n * Orientation for the direction of the circle.\n * Setting to true will switch the arc of the circle to traverse from startAngle to endAngle in a counter-clockwise direction.\n * Note: this will only change how the circle is drawn, and does not affect rotational transformation.\n * @default false\n */\n counterClockwise: boolean;\n}\n\nexport interface SerializedCircleProps\n extends SerializedObjectProps,\n UniqueCircleProps {}\n\nexport interface CircleProps extends FabricObjectProps, UniqueCircleProps {}\n\nconst CIRCLE_PROPS = [\n 'radius',\n 'startAngle',\n 'endAngle',\n 'counterClockwise',\n] as const;\n\nexport const circleDefaultValues: Partial> = {\n radius: 0,\n startAngle: 0,\n endAngle: 360,\n counterClockwise: false,\n};\n\nexport class Circle<\n Props extends TOptions = Partial,\n SProps extends SerializedCircleProps = SerializedCircleProps,\n EventSpec extends ObjectEvents = ObjectEvents,\n >\n extends FabricObject\n implements UniqueCircleProps\n{\n declare radius: number;\n declare startAngle: number;\n declare endAngle: number;\n declare counterClockwise: boolean;\n\n static type = 'Circle';\n\n static cacheProperties = [...cacheProperties, ...CIRCLE_PROPS];\n\n static ownDefaults = circleDefaultValues;\n\n static getDefaults(): Record {\n return {\n ...super.getDefaults(),\n ...Circle.ownDefaults,\n };\n }\n\n /**\n * Constructor\n * @param {Object} [options] Options object\n */\n constructor(options?: Props) {\n super();\n Object.assign(this, Circle.ownDefaults);\n this.setOptions(options);\n }\n\n /**\n * @private\n * @param {String} key\n * @param {*} value\n */\n _set(key: string, value: any) {\n super._set(key, value);\n\n if (key === 'radius') {\n this.setRadius(value);\n }\n\n return this;\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx context to render on\n */\n _render(ctx: CanvasRenderingContext2D) {\n ctx.beginPath();\n ctx.arc(\n 0,\n 0,\n this.radius,\n degreesToRadians(this.startAngle),\n degreesToRadians(this.endAngle),\n this.counterClockwise,\n );\n this._renderPaintInOrder(ctx);\n }\n\n /**\n * Returns horizontal radius of an object (according to how an object is scaled)\n * @return {Number}\n */\n getRadiusX(): number {\n return this.get('radius') * this.get(SCALE_X);\n }\n\n /**\n * Returns vertical radius of an object (according to how an object is scaled)\n * @return {Number}\n */\n getRadiusY(): number {\n return this.get('radius') * this.get(SCALE_Y);\n }\n\n /**\n * Sets radius of an object (and updates width accordingly)\n */\n setRadius(value: number) {\n this.radius = value;\n this.set({ width: value * 2, height: value * 2 });\n }\n\n /**\n * Returns object representation of an instance\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} object representation of an instance\n */\n toObject<\n T extends Omit, keyof SProps>,\n K extends keyof T = never,\n >(propertiesToInclude: K[] = []): Pick & SProps {\n return super.toObject([...CIRCLE_PROPS, ...propertiesToInclude]);\n }\n\n /* _TO_SVG_START_ */\n\n /**\n * Returns svg representation of an instance\n * @return {Array} an array of strings with the specific svg representation\n * of the instance\n */\n _toSVG(): string[] {\n const angle = (this.endAngle - this.startAngle) % 360;\n\n if (angle === 0) {\n return [\n '\\n',\n ];\n } else {\n const { radius } = this;\n const start = degreesToRadians(this.startAngle),\n end = degreesToRadians(this.endAngle),\n startX = cos(start) * radius,\n startY = sin(start) * radius,\n endX = cos(end) * radius,\n endY = sin(end) * radius,\n largeFlag = angle > 180 ? 1 : 0,\n sweepFlag = this.counterClockwise ? 0 : 1;\n return [\n `\\n',\n ];\n }\n }\n /* _TO_SVG_END_ */\n\n /* _FROM_SVG_START_ */\n /**\n * List of attribute names to account for when parsing SVG element (used by {@link Circle.fromElement})\n * @see: http://www.w3.org/TR/SVG/shapes.html#CircleElement\n */\n static ATTRIBUTE_NAMES = ['cx', 'cy', 'r', ...SHARED_ATTRIBUTES];\n\n /**\n * Returns {@link Circle} instance from an SVG element\n * @param {HTMLElement} element Element to parse\n * @param {Object} [options] Partial Circle object to default missing properties on the element.\n * @throws {Error} If value of `r` attribute is missing or invalid\n */\n static async fromElement(\n element: HTMLElement,\n options: Abortable,\n cssRules?: CSSRules,\n ): Promise {\n const {\n left = 0,\n top = 0,\n radius = 0,\n ...otherParsedAttributes\n } = parseAttributes(\n element,\n this.ATTRIBUTE_NAMES,\n cssRules,\n ) as Partial;\n\n // this probably requires to be fixed for default origins not being top/left.\n\n return new this({\n ...otherParsedAttributes,\n radius,\n left: left - radius,\n top: top - radius,\n });\n }\n\n /* _FROM_SVG_END_ */\n\n /**\n * @todo how do we declare this??\n */\n static fromObject>(object: T) {\n return super._fromObject(object);\n }\n}\n\nclassRegistry.setClass(Circle);\nclassRegistry.setSVGClass(Circle);\n","import { SHARED_ATTRIBUTES } from '../parser/attributes';\nimport { parseAttributes } from '../parser/parseAttributes';\nimport type { Abortable, TClassProperties, TOptions } from '../typedefs';\nimport { classRegistry } from '../ClassRegistry';\nimport { FabricObject, cacheProperties } from './Object/FabricObject';\nimport { Point } from '../Point';\nimport { isFiller } from '../util/typeAssertions';\nimport type { FabricObjectProps, SerializedObjectProps } from './Object/types';\nimport type { ObjectEvents } from '../EventTypeDefs';\nimport { makeBoundingBoxFromPoints } from '../util';\nimport { CENTER, LEFT, TOP } from '../constants';\nimport type { CSSRules } from '../parser/typedefs';\n\n// @TODO this code is terrible and Line should be a special case of polyline.\n\nconst coordProps = ['x1', 'x2', 'y1', 'y2'] as const;\n\ninterface UniqueLineProps {\n x1: number;\n x2: number;\n y1: number;\n y2: number;\n}\n\nexport interface SerializedLineProps\n extends SerializedObjectProps,\n UniqueLineProps {}\n\n/**\n * A Class to draw a line\n * A bunch of methods will be added to Polyline to handle the line case\n * The line class is very strange to work with, is all special, it hardly aligns\n * to what a developer want everytime there is an angle\n * @deprecated\n */\nexport class Line<\n Props extends TOptions = Partial,\n SProps extends SerializedLineProps = SerializedLineProps,\n EventSpec extends ObjectEvents = ObjectEvents,\n >\n extends FabricObject\n implements UniqueLineProps\n{\n /**\n * x value or first line edge\n * @type number\n */\n declare x1: number;\n\n /**\n * y value or first line edge\n * @type number\n */\n declare y1: number;\n\n /**\n * x value or second line edge\n * @type number\n */\n declare x2: number;\n\n /**\n * y value or second line edge\n * @type number\n */\n declare y2: number;\n\n static type = 'Line';\n\n static cacheProperties = [...cacheProperties, ...coordProps];\n /**\n * Constructor\n * @param {Array} [points] Array of points\n * @param {Object} [options] Options object\n * @return {Line} thisArg\n */\n constructor([x1, y1, x2, y2] = [0, 0, 0, 0], options: Partial = {}) {\n super();\n Object.assign(this, Line.ownDefaults);\n this.setOptions(options);\n this.x1 = x1;\n this.x2 = x2;\n this.y1 = y1;\n this.y2 = y2;\n this._setWidthHeight();\n const { left, top } = options;\n typeof left === 'number' && this.set(LEFT, left);\n typeof top === 'number' && this.set(TOP, top);\n }\n\n /**\n * @private\n * @param {Object} [options] Options\n */\n _setWidthHeight() {\n const { x1, y1, x2, y2 } = this;\n this.width = Math.abs(x2 - x1);\n this.height = Math.abs(y2 - y1);\n const { left, top, width, height } = makeBoundingBoxFromPoints([\n { x: x1, y: y1 },\n { x: x2, y: y2 },\n ]);\n const position = new Point(left + width / 2, top + height / 2);\n this.setPositionByOrigin(position, CENTER, CENTER);\n }\n\n /**\n * @private\n * @param {String} key\n * @param {*} value\n */\n _set(key: string, value: any) {\n super._set(key, value);\n if (coordProps.includes(key as keyof UniqueLineProps)) {\n // this doesn't make sense very much, since setting x1 when top or left\n // are already set, is just going to show a strange result since the\n // line will move way more than the developer expect.\n // in fabric5 it worked only when the line didn't have extra transformations,\n // in fabric6 too. With extra transform they behave bad in different ways.\n // This needs probably a good rework or a tutorial if you have to create a dynamic line\n this._setWidthHeight();\n }\n return this;\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _render(ctx: CanvasRenderingContext2D) {\n ctx.beginPath();\n\n const p = this.calcLinePoints();\n ctx.moveTo(p.x1, p.y1);\n ctx.lineTo(p.x2, p.y2);\n\n ctx.lineWidth = this.strokeWidth;\n\n // TODO: test this\n // make sure setting \"fill\" changes color of a line\n // (by copying fillStyle to strokeStyle, since line is stroked, not filled)\n const origStrokeStyle = ctx.strokeStyle;\n if (isFiller(this.stroke)) {\n ctx.strokeStyle = this.stroke.toLive(ctx)!;\n } else {\n ctx.strokeStyle = this.stroke ?? ctx.fillStyle;\n }\n this.stroke && this._renderStroke(ctx);\n ctx.strokeStyle = origStrokeStyle;\n }\n\n /**\n * This function is an helper for svg import. it returns the center of the object in the svg\n * untransformed coordinates\n * @private\n * @return {Point} center point from element coordinates\n */\n _findCenterFromElement(): Point {\n return new Point((this.x1 + this.x2) / 2, (this.y1 + this.y2) / 2);\n }\n\n /**\n * Returns object representation of an instance\n * @method toObject\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} object representation of an instance\n */\n toObject<\n T extends Omit, keyof SProps>,\n K extends keyof T = never,\n >(propertiesToInclude: K[] = []): Pick & SProps {\n return {\n ...super.toObject(propertiesToInclude),\n ...this.calcLinePoints(),\n };\n }\n\n /*\n * Calculate object dimensions from its properties\n * @private\n */\n _getNonTransformedDimensions(): Point {\n const dim = super._getNonTransformedDimensions();\n if (this.strokeLineCap === 'butt') {\n if (this.width === 0) {\n dim.y -= this.strokeWidth;\n }\n if (this.height === 0) {\n dim.x -= this.strokeWidth;\n }\n }\n return dim;\n }\n\n /**\n * Recalculates line points given width and height\n * Those points are simply placed around the center,\n * This is not useful outside internal render functions and svg output\n * Is not meant to be for the developer.\n * @private\n */\n calcLinePoints(): UniqueLineProps {\n const { x1: _x1, x2: _x2, y1: _y1, y2: _y2, width, height } = this;\n const xMult = _x1 <= _x2 ? -1 : 1,\n yMult = _y1 <= _y2 ? -1 : 1,\n x1 = (xMult * width) / 2,\n y1 = (yMult * height) / 2,\n x2 = (xMult * -width) / 2,\n y2 = (yMult * -height) / 2;\n\n return {\n x1,\n x2,\n y1,\n y2,\n };\n }\n\n /* _FROM_SVG_START_ */\n\n /**\n * Returns svg representation of an instance\n * @return {Array} an array of strings with the specific svg representation\n * of the instance\n */\n _toSVG() {\n const { x1, x2, y1, y2 } = this.calcLinePoints();\n return [\n '\\n`,\n ];\n }\n\n /**\n * List of attribute names to account for when parsing SVG element (used by {@link Line.fromElement})\n * @see http://www.w3.org/TR/SVG/shapes.html#LineElement\n */\n static ATTRIBUTE_NAMES = SHARED_ATTRIBUTES.concat(coordProps);\n\n /**\n * Returns Line instance from an SVG element\n * @param {HTMLElement} element Element to parse\n * @param {Object} [options] Options object\n * @param {Function} [callback] callback function invoked after parsing\n */\n static async fromElement(\n element: HTMLElement,\n options?: Abortable,\n cssRules?: CSSRules,\n ) {\n const {\n x1 = 0,\n y1 = 0,\n x2 = 0,\n y2 = 0,\n ...parsedAttributes\n } = parseAttributes(element, this.ATTRIBUTE_NAMES, cssRules);\n return new this([x1, y1, x2, y2], parsedAttributes);\n }\n\n /* _FROM_SVG_END_ */\n\n /**\n * Returns Line instance from an object representation\n * @param {Object} object Object to create an instance from\n * @returns {Promise}\n */\n static fromObject>({\n x1,\n y1,\n x2,\n y2,\n ...object\n }: T) {\n return this._fromObject(\n {\n ...object,\n points: [x1, y1, x2, y2],\n },\n {\n extraParam: 'points',\n },\n );\n }\n}\n\nclassRegistry.setClass(Line);\nclassRegistry.setSVGClass(Line);\n","import { classRegistry } from '../ClassRegistry';\nimport { FabricObject } from './Object/FabricObject';\nimport type { FabricObjectProps, SerializedObjectProps } from './Object/types';\nimport type { TClassProperties, TOptions } from '../typedefs';\nimport type { ObjectEvents } from '../EventTypeDefs';\n\nexport const triangleDefaultValues: Partial> = {\n width: 100,\n height: 100,\n};\n\nexport class Triangle<\n Props extends TOptions = Partial,\n SProps extends SerializedObjectProps = SerializedObjectProps,\n EventSpec extends ObjectEvents = ObjectEvents,\n >\n extends FabricObject\n implements FabricObjectProps\n{\n static type = 'Triangle';\n\n static ownDefaults = triangleDefaultValues;\n\n static getDefaults(): Record {\n return { ...super.getDefaults(), ...Triangle.ownDefaults };\n }\n\n /**\n * Constructor\n * @param {Object} [options] Options object\n */\n constructor(options?: Props) {\n super();\n Object.assign(this, Triangle.ownDefaults);\n this.setOptions(options);\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _render(ctx: CanvasRenderingContext2D) {\n const widthBy2 = this.width / 2,\n heightBy2 = this.height / 2;\n\n ctx.beginPath();\n ctx.moveTo(-widthBy2, heightBy2);\n ctx.lineTo(0, -heightBy2);\n ctx.lineTo(widthBy2, heightBy2);\n ctx.closePath();\n\n this._renderPaintInOrder(ctx);\n }\n\n /**\n * Returns svg representation of an instance\n * @return {Array} an array of strings with the specific svg representation\n * of the instance\n */\n _toSVG() {\n const widthBy2 = this.width / 2,\n heightBy2 = this.height / 2,\n points = `${-widthBy2} ${heightBy2},0 ${-heightBy2},${widthBy2} ${heightBy2}`;\n return [''];\n }\n}\n\nclassRegistry.setClass(Triangle);\nclassRegistry.setSVGClass(Triangle);\n","import { SCALE_X, SCALE_Y, twoMathPi } from '../constants';\nimport { SHARED_ATTRIBUTES } from '../parser/attributes';\nimport { parseAttributes } from '../parser/parseAttributes';\nimport type { Abortable, TClassProperties, TOptions } from '../typedefs';\nimport { classRegistry } from '../ClassRegistry';\nimport { FabricObject, cacheProperties } from './Object/FabricObject';\nimport type { FabricObjectProps, SerializedObjectProps } from './Object/types';\nimport type { ObjectEvents } from '../EventTypeDefs';\nimport type { CSSRules } from '../parser/typedefs';\n\nexport const ellipseDefaultValues: Partial> = {\n rx: 0,\n ry: 0,\n};\n\ninterface UniqueEllipseProps {\n rx: number;\n ry: number;\n}\n\nexport interface SerializedEllipseProps\n extends SerializedObjectProps,\n UniqueEllipseProps {}\n\nexport interface EllipseProps extends FabricObjectProps, UniqueEllipseProps {}\n\nconst ELLIPSE_PROPS = ['rx', 'ry'] as const;\n\nexport class Ellipse<\n Props extends TOptions = Partial,\n SProps extends SerializedEllipseProps = SerializedEllipseProps,\n EventSpec extends ObjectEvents = ObjectEvents,\n >\n extends FabricObject\n implements EllipseProps\n{\n /**\n * Horizontal radius\n * @type Number\n */\n declare rx: number;\n\n /**\n * Vertical radius\n * @type Number\n */\n declare ry: number;\n\n static type = 'Ellipse';\n\n static cacheProperties = [...cacheProperties, ...ELLIPSE_PROPS];\n\n static ownDefaults = ellipseDefaultValues;\n\n static getDefaults(): Record {\n return {\n ...super.getDefaults(),\n ...Ellipse.ownDefaults,\n };\n }\n\n /**\n * Constructor\n * @param {Object} [options] Options object\n */\n constructor(options?: Props) {\n super();\n Object.assign(this, Ellipse.ownDefaults);\n this.setOptions(options);\n }\n\n /**\n * @private\n * @param {String} key\n * @param {*} value\n * @return {Ellipse} thisArg\n */\n _set(key: string, value: any) {\n super._set(key, value);\n switch (key) {\n case 'rx':\n this.rx = value;\n this.set('width', value * 2);\n break;\n\n case 'ry':\n this.ry = value;\n this.set('height', value * 2);\n break;\n }\n return this;\n }\n\n /**\n * Returns horizontal radius of an object (according to how an object is scaled)\n * @return {Number}\n */\n getRx() {\n return this.get('rx') * this.get(SCALE_X);\n }\n\n /**\n * Returns Vertical radius of an object (according to how an object is scaled)\n * @return {Number}\n */\n getRy() {\n return this.get('ry') * this.get(SCALE_Y);\n }\n\n /**\n * Returns object representation of an instance\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} object representation of an instance\n */\n toObject<\n T extends Omit, keyof SProps>,\n K extends keyof T = never,\n >(propertiesToInclude: K[] = []): Pick & SProps {\n return super.toObject([...ELLIPSE_PROPS, ...propertiesToInclude]);\n }\n\n /**\n * Returns svg representation of an instance\n * @return {Array} an array of strings with the specific svg representation\n * of the instance\n */\n _toSVG(): string[] {\n return [\n '\\n`,\n ];\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx context to render on\n */\n _render(ctx: CanvasRenderingContext2D) {\n ctx.beginPath();\n ctx.save();\n ctx.transform(1, 0, 0, this.ry / this.rx, 0, 0);\n ctx.arc(0, 0, this.rx, 0, twoMathPi, false);\n ctx.restore();\n this._renderPaintInOrder(ctx);\n }\n\n /* _FROM_SVG_START_ */\n\n /**\n * List of attribute names to account for when parsing SVG element (used by {@link Ellipse.fromElement})\n * @see http://www.w3.org/TR/SVG/shapes.html#EllipseElement\n */\n static ATTRIBUTE_NAMES = [...SHARED_ATTRIBUTES, 'cx', 'cy', 'rx', 'ry'];\n\n /**\n * Returns {@link Ellipse} instance from an SVG element\n * @param {HTMLElement} element Element to parse\n * @return {Ellipse}\n */\n static async fromElement(\n element: HTMLElement,\n options?: Abortable,\n cssRules?: CSSRules,\n ) {\n const parsedAttributes = parseAttributes(\n element,\n this.ATTRIBUTE_NAMES,\n cssRules,\n );\n\n parsedAttributes.left = (parsedAttributes.left || 0) - parsedAttributes.rx;\n parsedAttributes.top = (parsedAttributes.top || 0) - parsedAttributes.ry;\n return new this(parsedAttributes);\n }\n\n /* _FROM_SVG_END_ */\n}\n\nclassRegistry.setClass(Ellipse);\nclassRegistry.setSVGClass(Ellipse);\n","import { config } from '../config';\nimport { SHARED_ATTRIBUTES } from '../parser/attributes';\nimport { parseAttributes } from '../parser/parseAttributes';\nimport { parsePointsAttribute } from '../parser/parsePointsAttribute';\nimport type { XY } from '../Point';\nimport { Point } from '../Point';\nimport type { Abortable, TClassProperties, TOptions } from '../typedefs';\nimport { classRegistry } from '../ClassRegistry';\nimport { makeBoundingBoxFromPoints } from '../util/misc/boundingBoxFromPoints';\nimport { calcDimensionsMatrix, transformPoint } from '../util/misc/matrix';\nimport { projectStrokeOnPoints } from '../util/misc/projectStroke';\nimport type { TProjectStrokeOnPointsOptions } from '../util/misc/projectStroke/types';\nimport { degreesToRadians } from '../util/misc/radiansDegreesConversion';\nimport { toFixed } from '../util/misc/toFixed';\nimport { FabricObject, cacheProperties } from './Object/FabricObject';\nimport type { FabricObjectProps, SerializedObjectProps } from './Object/types';\nimport type { ObjectEvents } from '../EventTypeDefs';\nimport {\n CENTER,\n LEFT,\n SCALE_X,\n SCALE_Y,\n SKEW_X,\n SKEW_Y,\n TOP,\n} from '../constants';\nimport type { CSSRules } from '../parser/typedefs';\n\nexport const polylineDefaultValues: Partial> = {\n /**\n * @deprecated transient option soon to be removed in favor of a different design\n */\n exactBoundingBox: false,\n};\n\nexport interface SerializedPolylineProps extends SerializedObjectProps {\n points: XY[];\n}\n\nexport class Polyline<\n Props extends TOptions = Partial,\n SProps extends SerializedPolylineProps = SerializedPolylineProps,\n EventSpec extends ObjectEvents = ObjectEvents,\n> extends FabricObject {\n /**\n * Points array\n * @type Array\n */\n declare points: XY[];\n\n /**\n * WARNING: Feature in progress\n * Calculate the exact bounding box taking in account strokeWidth on acute angles\n * this will be turned to true by default on fabric 6.0\n * maybe will be left in as an optimization since calculations may be slow\n * @deprecated transient option soon to be removed in favor of a different design\n * @type Boolean\n * @default false\n */\n declare exactBoundingBox: boolean;\n\n declare private initialized: true | undefined;\n\n static ownDefaults = polylineDefaultValues;\n\n static type = 'Polyline';\n\n static getDefaults(): Record {\n return {\n ...super.getDefaults(),\n ...Polyline.ownDefaults,\n };\n }\n\n /**\n * A list of properties that if changed trigger a recalculation of dimensions\n * @todo check if you really need to recalculate for all cases\n */\n static layoutProperties: (keyof Polyline)[] = [\n SKEW_X,\n SKEW_Y,\n 'strokeLineCap',\n 'strokeLineJoin',\n 'strokeMiterLimit',\n 'strokeWidth',\n 'strokeUniform',\n 'points',\n ];\n\n declare pathOffset: Point;\n\n declare strokeOffset: Point;\n\n static cacheProperties = [...cacheProperties, 'points'];\n\n strokeDiff: Point;\n\n /**\n * Constructor\n * @param {Array} points Array of points (where each point is an object with x and y)\n * @param {Object} [options] Options object\n * @return {Polyline} thisArg\n * @example\n * var poly = new Polyline([\n * { x: 10, y: 10 },\n * { x: 50, y: 30 },\n * { x: 40, y: 70 },\n * { x: 60, y: 50 },\n * { x: 100, y: 150 },\n * { x: 40, y: 100 }\n * ], {\n * stroke: 'red',\n * left: 100,\n * top: 100\n * });\n */\n constructor(points: XY[] = [], options: Props = {} as Props) {\n super();\n Object.assign(this, Polyline.ownDefaults);\n this.setOptions(options);\n this.points = points;\n const { left, top } = options;\n this.initialized = true;\n this.setBoundingBox(true);\n typeof left === 'number' && this.set(LEFT, left);\n typeof top === 'number' && this.set(TOP, top);\n }\n\n protected isOpen() {\n return true;\n }\n\n private _projectStrokeOnPoints(options: TProjectStrokeOnPointsOptions) {\n return projectStrokeOnPoints(this.points, options, this.isOpen());\n }\n\n /**\n * Calculate the polygon bounding box\n * @private\n */\n _calcDimensions(options?: Partial) {\n options = {\n scaleX: this.scaleX,\n scaleY: this.scaleY,\n skewX: this.skewX,\n skewY: this.skewY,\n strokeLineCap: this.strokeLineCap,\n strokeLineJoin: this.strokeLineJoin,\n strokeMiterLimit: this.strokeMiterLimit,\n strokeUniform: this.strokeUniform,\n strokeWidth: this.strokeWidth,\n ...(options || {}),\n };\n const points = this.exactBoundingBox\n ? this._projectStrokeOnPoints(\n options as TProjectStrokeOnPointsOptions,\n ).map((projection) => projection.projectedPoint)\n : this.points;\n if (points.length === 0) {\n return {\n left: 0,\n top: 0,\n width: 0,\n height: 0,\n pathOffset: new Point(),\n strokeOffset: new Point(),\n strokeDiff: new Point(),\n };\n }\n const bbox = makeBoundingBoxFromPoints(points),\n // Remove scale effect, since it's applied after\n matrix = calcDimensionsMatrix({ ...options, scaleX: 1, scaleY: 1 }),\n bboxNoStroke = makeBoundingBoxFromPoints(\n this.points.map((p) => transformPoint(p, matrix, true)),\n ),\n scale = new Point(this.scaleX, this.scaleY);\n let offsetX = bbox.left + bbox.width / 2,\n offsetY = bbox.top + bbox.height / 2;\n if (this.exactBoundingBox) {\n offsetX = offsetX - offsetY * Math.tan(degreesToRadians(this.skewX));\n // Order of those assignments is important.\n // offsetY relies on offsetX being already changed by the line above\n offsetY = offsetY - offsetX * Math.tan(degreesToRadians(this.skewY));\n }\n\n return {\n ...bbox,\n pathOffset: new Point(offsetX, offsetY),\n strokeOffset: new Point(bboxNoStroke.left, bboxNoStroke.top)\n .subtract(new Point(bbox.left, bbox.top))\n .multiply(scale),\n strokeDiff: new Point(bbox.width, bbox.height)\n .subtract(new Point(bboxNoStroke.width, bboxNoStroke.height))\n .multiply(scale),\n };\n }\n\n /**\n * This function is an helper for svg import. it returns the center of the object in the svg\n * untransformed coordinates, by look at the polyline/polygon points.\n * @private\n * @return {Point} center point from element coordinates\n */\n _findCenterFromElement(): Point {\n const bbox = makeBoundingBoxFromPoints(this.points);\n return new Point(bbox.left + bbox.width / 2, bbox.top + bbox.height / 2);\n }\n\n setDimensions() {\n this.setBoundingBox();\n }\n\n setBoundingBox(adjustPosition?: boolean) {\n const { left, top, width, height, pathOffset, strokeOffset, strokeDiff } =\n this._calcDimensions();\n this.set({ width, height, pathOffset, strokeOffset, strokeDiff });\n adjustPosition &&\n this.setPositionByOrigin(\n new Point(left + width / 2, top + height / 2),\n CENTER,\n CENTER,\n );\n }\n\n /**\n * @deprecated intermidiate method to be removed, do not use\n */\n protected isStrokeAccountedForInDimensions() {\n return this.exactBoundingBox;\n }\n\n /**\n * @override stroke is taken in account in size\n */\n _getNonTransformedDimensions() {\n return this.exactBoundingBox\n ? // TODO: fix this\n new Point(this.width, this.height)\n : super._getNonTransformedDimensions();\n }\n\n /**\n * @override stroke and skewing are taken into account when projecting stroke on points,\n * therefore we don't want the default calculation to account for skewing as well.\n * Though it is possible to pass `width` and `height` in `options`, doing so is very strange, use with discretion.\n *\n * @private\n */\n _getTransformedDimensions(options: any = {}) {\n if (this.exactBoundingBox) {\n let size: Point;\n /* When `strokeUniform = true`, any changes to the properties require recalculating the `width` and `height` because\n the stroke projections are affected.\n When `strokeUniform = false`, we don't need to recalculate for scale transformations, as the effect of scale on\n projections follows a linear function (e.g. scaleX of 2 just multiply width by 2)*/\n if (\n Object.keys(options).some(\n (key) =>\n this.strokeUniform ||\n (this.constructor as typeof Polyline).layoutProperties.includes(\n key as keyof TProjectStrokeOnPointsOptions,\n ),\n )\n ) {\n const { width, height } = this._calcDimensions(options);\n size = new Point(options.width ?? width, options.height ?? height);\n } else {\n size = new Point(\n options.width ?? this.width,\n options.height ?? this.height,\n );\n }\n return size.multiply(\n new Point(options.scaleX || this.scaleX, options.scaleY || this.scaleY),\n );\n } else {\n return super._getTransformedDimensions(options);\n }\n }\n\n /**\n * Recalculates dimensions when changing skew and scale\n * @private\n */\n _set(key: string, value: any) {\n const changed = this.initialized && this[key as keyof this] !== value;\n const output = super._set(key, value);\n if (\n this.exactBoundingBox &&\n changed &&\n (((key === SCALE_X || key === SCALE_Y) &&\n this.strokeUniform &&\n (this.constructor as typeof Polyline).layoutProperties.includes(\n 'strokeUniform',\n )) ||\n (this.constructor as typeof Polyline).layoutProperties.includes(\n key as keyof Polyline,\n ))\n ) {\n this.setDimensions();\n }\n return output;\n }\n\n /**\n * Returns object representation of an instance\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} Object representation of an instance\n */\n toObject<\n T extends Omit, keyof SProps>,\n K extends keyof T = never,\n >(propertiesToInclude: K[] = []): Pick & SProps {\n return {\n ...super.toObject(propertiesToInclude),\n points: this.points.map(({ x, y }) => ({ x, y })),\n };\n }\n\n /**\n * Returns svg representation of an instance\n * @return {Array} an array of strings with the specific svg representation\n * of the instance\n */\n _toSVG() {\n const points = [],\n diffX = this.pathOffset.x,\n diffY = this.pathOffset.y,\n NUM_FRACTION_DIGITS = config.NUM_FRACTION_DIGITS;\n\n for (let i = 0, len = this.points.length; i < len; i++) {\n points.push(\n toFixed(this.points[i].x - diffX, NUM_FRACTION_DIGITS),\n ',',\n toFixed(this.points[i].y - diffY, NUM_FRACTION_DIGITS),\n ' ',\n );\n }\n return [\n `<${\n (this.constructor as typeof Polyline).type.toLowerCase() as\n | 'polyline'\n | 'polygon'\n } `,\n 'COMMON_PARTS',\n `points=\"${points.join('')}\" />\\n`,\n ];\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _render(ctx: CanvasRenderingContext2D) {\n const len = this.points.length,\n x = this.pathOffset.x,\n y = this.pathOffset.y;\n\n if (!len || isNaN(this.points[len - 1].y)) {\n // do not draw if no points or odd points\n // NaN comes from parseFloat of a empty string in parser\n return;\n }\n ctx.beginPath();\n ctx.moveTo(this.points[0].x - x, this.points[0].y - y);\n for (let i = 0; i < len; i++) {\n const point = this.points[i];\n ctx.lineTo(point.x - x, point.y - y);\n }\n !this.isOpen() && ctx.closePath();\n this._renderPaintInOrder(ctx);\n }\n\n /**\n * Returns complexity of an instance\n * @return {Number} complexity of this instance\n */\n complexity(): number {\n return this.points.length;\n }\n\n /* _FROM_SVG_START_ */\n\n /**\n * List of attribute names to account for when parsing SVG element (used by {@link Polyline.fromElement})\n * @see: http://www.w3.org/TR/SVG/shapes.html#PolylineElement\n */\n static ATTRIBUTE_NAMES = [...SHARED_ATTRIBUTES];\n\n /**\n * Returns Polyline instance from an SVG element\n * @param {HTMLElement} element Element to parser\n * @param {Object} [options] Options object\n */\n static async fromElement(\n element: HTMLElement | SVGElement,\n options?: Abortable,\n cssRules?: CSSRules,\n ) {\n const points = parsePointsAttribute(element.getAttribute('points')),\n // we omit left and top to instruct the constructor to position the object using the bbox\n\n { left, top, ...parsedAttributes } = parseAttributes(\n element,\n this.ATTRIBUTE_NAMES,\n cssRules,\n );\n return new this(points, {\n ...parsedAttributes,\n ...options,\n });\n }\n\n /* _FROM_SVG_END_ */\n\n /**\n * Returns Polyline instance from an object representation\n * @param {Object} object Object to create an instance from\n * @returns {Promise}\n */\n static fromObject>(object: T) {\n return this._fromObject(object, {\n extraParam: 'points',\n });\n }\n}\n\nclassRegistry.setClass(Polyline);\nclassRegistry.setSVGClass(Polyline);\n","import type { XY } from '../Point';\n\n/**\n * Parses \"points\" attribute, returning an array of values\n * @static\n * @param {String} points points attribute string\n * @return {Array} array of points\n */\nexport function parsePointsAttribute(points: string | null): XY[] {\n // points attribute is required and must not be empty\n if (!points) {\n return [];\n }\n\n // replace commas with whitespace and remove bookending whitespace\n const pointsSplit: string[] = points.replace(/,/g, ' ').trim().split(/\\s+/);\n\n const parsedPoints = [];\n\n for (let i = 0; i < pointsSplit.length; i += 2) {\n parsedPoints.push({\n x: parseFloat(pointsSplit[i]),\n y: parseFloat(pointsSplit[i + 1]),\n });\n }\n\n // odd number of points is an error\n // if (parsedPoints.length % 2 !== 0) {\n // return null;\n // }\n return parsedPoints;\n}\n","import { classRegistry } from '../ClassRegistry';\nimport { Polyline, polylineDefaultValues } from './Polyline';\n\nexport class Polygon extends Polyline {\n static ownDefaults = polylineDefaultValues;\n\n static type = 'Polygon';\n\n protected isOpen() {\n return false;\n }\n}\n\nclassRegistry.setClass(Polygon);\nclassRegistry.setSVGClass(Polygon);\n","import type { ObjectEvents } from '../../EventTypeDefs';\nimport type { FabricObjectProps, SerializedObjectProps } from '../Object/types';\nimport type { TOptions } from '../../typedefs';\nimport { FabricObject } from '../Object/FabricObject';\nimport { styleProperties } from './constants';\nimport type { StylePropertiesType } from './constants';\nimport type { FabricText } from './Text';\nimport { pick } from '../../util';\nimport { pickBy } from '../../util/misc/pick';\n\nexport type CompleteTextStyleDeclaration = Pick<\n FabricText,\n StylePropertiesType\n>;\n\nexport type TextStyleDeclaration = Partial;\n\nexport type TextStyle = {\n [line: number | string]: { [char: number | string]: TextStyleDeclaration };\n};\n\nexport abstract class StyledText<\n Props extends TOptions = Partial,\n SProps extends SerializedObjectProps = SerializedObjectProps,\n EventSpec extends ObjectEvents = ObjectEvents,\n> extends FabricObject {\n declare abstract styles: TextStyle;\n declare protected abstract _textLines: string[][];\n declare protected _forceClearCache: boolean;\n static _styleProperties: Readonly = styleProperties;\n abstract get2DCursorLocation(\n selectionStart: number,\n skipWrapping?: boolean,\n ): { charIndex: number; lineIndex: number };\n\n /**\n * Returns true if object has no styling or no styling in a line\n * @param {Number} lineIndex , lineIndex is on wrapped lines.\n * @return {Boolean}\n */\n isEmptyStyles(lineIndex?: number): boolean {\n if (!this.styles) {\n return true;\n }\n if (typeof lineIndex !== 'undefined' && !this.styles[lineIndex]) {\n return true;\n }\n const obj =\n typeof lineIndex === 'undefined'\n ? this.styles\n : { line: this.styles[lineIndex] };\n for (const p1 in obj) {\n for (const p2 in obj[p1]) {\n // eslint-disable-next-line no-unused-vars\n for (const p3 in obj[p1][p2]) {\n return false;\n }\n }\n }\n return true;\n }\n\n /**\n * Returns true if object has a style property or has it ina specified line\n * This function is used to detect if a text will use a particular property or not.\n * @param {String} property to check for\n * @param {Number} lineIndex to check the style on\n * @return {Boolean}\n */\n styleHas(property: keyof TextStyleDeclaration, lineIndex?: number): boolean {\n if (!this.styles) {\n return false;\n }\n if (typeof lineIndex !== 'undefined' && !this.styles[lineIndex]) {\n return false;\n }\n const obj =\n typeof lineIndex === 'undefined'\n ? this.styles\n : { 0: this.styles[lineIndex] };\n // eslint-disable-next-line\n for (const p1 in obj) {\n // eslint-disable-next-line\n for (const p2 in obj[p1]) {\n if (typeof obj[p1][p2][property] !== 'undefined') {\n return true;\n }\n }\n }\n return false;\n }\n\n /**\n * Check if characters in a text have a value for a property\n * whose value matches the textbox's value for that property. If so,\n * the character-level property is deleted. If the character\n * has no other properties, then it is also deleted. Finally,\n * if the line containing that character has no other characters\n * then it also is deleted.\n */\n cleanStyle(property: keyof TextStyleDeclaration) {\n if (!this.styles) {\n return false;\n }\n const obj = this.styles;\n let stylesCount = 0,\n letterCount,\n stylePropertyValue,\n allStyleObjectPropertiesMatch = true,\n graphemeCount = 0;\n for (const p1 in obj) {\n letterCount = 0;\n for (const p2 in obj[p1]) {\n const styleObject = obj[p1][p2] || {},\n stylePropertyHasBeenSet = styleObject[property] !== undefined;\n\n stylesCount++;\n\n if (stylePropertyHasBeenSet) {\n if (!stylePropertyValue) {\n stylePropertyValue = styleObject[property];\n } else if (styleObject[property] !== stylePropertyValue) {\n allStyleObjectPropertiesMatch = false;\n }\n\n if (styleObject[property] === this[property as keyof this]) {\n delete styleObject[property];\n }\n } else {\n allStyleObjectPropertiesMatch = false;\n }\n\n if (Object.keys(styleObject).length !== 0) {\n letterCount++;\n } else {\n delete obj[p1][p2];\n }\n }\n\n if (letterCount === 0) {\n delete obj[p1];\n }\n }\n // if every grapheme has the same style set then\n // delete those styles and set it on the parent\n for (let i = 0; i < this._textLines.length; i++) {\n graphemeCount += this._textLines[i].length;\n }\n if (allStyleObjectPropertiesMatch && stylesCount === graphemeCount) {\n this[property as keyof this] = stylePropertyValue as any;\n this.removeStyle(property);\n }\n }\n\n /**\n * Remove a style property or properties from all individual character styles\n * in a text object. Deletes the character style object if it contains no other style\n * props. Deletes a line style object if it contains no other character styles.\n *\n * @param {String} props The property to remove from character styles.\n */\n removeStyle(property: keyof TextStyleDeclaration) {\n if (!this.styles) {\n return;\n }\n const obj = this.styles;\n let line, lineNum, charNum;\n for (lineNum in obj) {\n line = obj[lineNum];\n for (charNum in line) {\n delete line[charNum][property];\n if (Object.keys(line[charNum]).length === 0) {\n delete line[charNum];\n }\n }\n if (Object.keys(line).length === 0) {\n delete obj[lineNum];\n }\n }\n }\n\n private _extendStyles(index: number, style: TextStyleDeclaration): void {\n const { lineIndex, charIndex } = this.get2DCursorLocation(index);\n\n if (!this._getLineStyle(lineIndex)) {\n this._setLineStyle(lineIndex);\n }\n\n const newStyle = pickBy(\n {\n // first create a new object that is a merge of existing and new\n ...this._getStyleDeclaration(lineIndex, charIndex),\n ...style,\n // use the predicate to discard undefined values\n },\n (value) => value !== undefined,\n );\n\n // finally assign to the old position the new style\n this._setStyleDeclaration(lineIndex, charIndex, newStyle);\n }\n\n /**\n * Gets style of a current selection/cursor (at the start position)\n * @param {Number} startIndex Start index to get styles at\n * @param {Number} endIndex End index to get styles at, if not specified startIndex + 1\n * @param {Boolean} [complete] get full style or not\n * @return {Array} styles an array with one, zero or more Style objects\n */\n getSelectionStyles(\n startIndex: number,\n endIndex?: number,\n complete?: boolean,\n ): TextStyleDeclaration[] {\n const styles: TextStyleDeclaration[] = [];\n for (let i = startIndex; i < (endIndex || startIndex); i++) {\n styles.push(this.getStyleAtPosition(i, complete));\n }\n return styles;\n }\n\n /**\n * Gets style of a current selection/cursor position\n * @param {Number} position to get styles at\n * @param {Boolean} [complete] full style if true\n * @return {Object} style Style object at a specified index\n * @private\n */\n getStyleAtPosition(position: number, complete?: boolean) {\n const { lineIndex, charIndex } = this.get2DCursorLocation(position);\n return complete\n ? this.getCompleteStyleDeclaration(lineIndex, charIndex)\n : this._getStyleDeclaration(lineIndex, charIndex);\n }\n\n /**\n * Sets style of a current selection, if no selection exist, do not set anything.\n * @param {Object} styles Styles object\n * @param {Number} startIndex Start index to get styles at\n * @param {Number} [endIndex] End index to get styles at, if not specified startIndex + 1\n */\n setSelectionStyles(styles: object, startIndex: number, endIndex?: number) {\n for (let i = startIndex; i < (endIndex || startIndex); i++) {\n this._extendStyles(i, styles);\n }\n /* not included in _extendStyles to avoid clearing cache more than once */\n this._forceClearCache = true;\n }\n\n /**\n * Get a reference, not a clone, to the style object for a given character,\n * if no style is set for a line or char, return a new empty object.\n * This is tricky and confusing because when you get an empty object you can't\n * determine if it is a reference or a new one.\n * @TODO this should always return a reference or always a clone or undefined when necessary.\n * @protected\n * @param {Number} lineIndex\n * @param {Number} charIndex\n * @return {TextStyleDeclaration} a style object reference to the existing one or a new empty object when undefined\n */\n _getStyleDeclaration(\n lineIndex: number,\n charIndex: number,\n ): TextStyleDeclaration {\n const lineStyle = this.styles && this.styles[lineIndex];\n return lineStyle ? (lineStyle[charIndex] ?? {}) : {};\n }\n\n /**\n * return a new object that contains all the style property for a character\n * the object returned is newly created\n * @param {Number} lineIndex of the line where the character is\n * @param {Number} charIndex position of the character on the line\n * @return {Object} style object\n */\n getCompleteStyleDeclaration(\n lineIndex: number,\n charIndex: number,\n ): CompleteTextStyleDeclaration {\n return {\n ...pick(\n this,\n (this.constructor as typeof StyledText)\n ._styleProperties as (keyof this)[],\n ),\n ...this._getStyleDeclaration(lineIndex, charIndex),\n } as CompleteTextStyleDeclaration;\n }\n\n /**\n * @param {Number} lineIndex\n * @param {Number} charIndex\n * @param {Object} style\n * @private\n */\n protected _setStyleDeclaration(\n lineIndex: number,\n charIndex: number,\n style: object,\n ) {\n this.styles[lineIndex][charIndex] = style;\n }\n\n /**\n *\n * @param {Number} lineIndex\n * @param {Number} charIndex\n * @private\n */\n protected _deleteStyleDeclaration(lineIndex: number, charIndex: number) {\n delete this.styles[lineIndex][charIndex];\n }\n\n /**\n * @param {Number} lineIndex\n * @return {Boolean} if the line exists or not\n * @private\n */\n protected _getLineStyle(lineIndex: number): boolean {\n return !!this.styles[lineIndex];\n }\n\n /**\n * Set the line style to an empty object so that is initialized\n * @param {Number} lineIndex\n * @private\n */\n protected _setLineStyle(lineIndex: number) {\n this.styles[lineIndex] = {};\n }\n\n protected _deleteLineStyle(lineIndex: number) {\n delete this.styles[lineIndex];\n }\n}\n","import { config } from '../../config';\nimport type { TSVGReviver } from '../../typedefs';\nimport { escapeXml } from '../../util/lang_string';\nimport { colorPropToSVG, createSVGRect } from '../../util/misc/svgParsing';\nimport { hasStyleChanged } from '../../util/misc/textStyles';\nimport { toFixed } from '../../util/misc/toFixed';\nimport { FabricObjectSVGExportMixin } from '../Object/FabricObjectSVGExportMixin';\nimport { type TextStyleDeclaration } from './StyledText';\nimport { JUSTIFY } from '../Text/constants';\nimport type { FabricText, GraphemeBBox } from './Text';\nimport { STROKE, FILL } from '../../constants';\nimport { createRotateMatrix } from '../../util/misc/matrix';\nimport { radiansToDegrees } from '../../util/misc/radiansDegreesConversion';\nimport { Point } from '../../Point';\nimport { matrixToSVG } from '../../util/misc/svgExport';\n\nconst multipleSpacesRegex = / +/g;\nconst dblQuoteRegex = /\"/g;\n\nfunction createSVGInlineRect(\n color: string,\n left: number,\n top: number,\n width: number,\n height: number,\n) {\n return `\\t\\t${createSVGRect(color, { left, top, width, height })}\\n`;\n}\n\nexport class TextSVGExportMixin extends FabricObjectSVGExportMixin {\n _toSVG(this: TextSVGExportMixin & FabricText): string[] {\n const offsets = this._getSVGLeftTopOffsets(),\n textAndBg = this._getSVGTextAndBg(offsets.textTop, offsets.textLeft);\n return this._wrapSVGTextAndBg(textAndBg);\n }\n\n toSVG(this: TextSVGExportMixin & FabricText, reviver?: TSVGReviver): string {\n const textSvg = this._createBaseSVGMarkup(this._toSVG(), {\n reviver,\n noStyle: true,\n withShadow: true,\n }),\n path = this.path;\n if (path) {\n return (\n textSvg +\n path._createBaseSVGMarkup(path._toSVG(), {\n reviver,\n withShadow: true,\n additionalTransform: matrixToSVG(this.calcOwnMatrix()),\n })\n );\n }\n return textSvg;\n }\n\n private _getSVGLeftTopOffsets(this: TextSVGExportMixin & FabricText) {\n return {\n textLeft: -this.width / 2,\n textTop: -this.height / 2,\n lineTop: this.getHeightOfLine(0),\n };\n }\n\n private _wrapSVGTextAndBg(\n this: TextSVGExportMixin & FabricText,\n {\n textBgRects,\n textSpans,\n }: {\n textSpans: string[];\n textBgRects: string[];\n },\n ) {\n const noShadow = true,\n textDecoration = this.getSvgTextDecoration(this);\n return [\n textBgRects.join(''),\n '\\t\\t',\n textSpans.join(''),\n '\\n',\n ];\n }\n\n /**\n * @private\n * @param {Number} textTopOffset Text top offset\n * @param {Number} textLeftOffset Text left offset\n * @return {Object}\n */\n private _getSVGTextAndBg(\n this: TextSVGExportMixin & FabricText,\n textTopOffset: number,\n textLeftOffset: number,\n ) {\n const textSpans: string[] = [],\n textBgRects: string[] = [];\n let height = textTopOffset,\n lineOffset;\n\n // bounding-box background\n this.backgroundColor &&\n textBgRects.push(\n ...createSVGInlineRect(\n this.backgroundColor,\n -this.width / 2,\n -this.height / 2,\n this.width,\n this.height,\n ),\n );\n\n // text and text-background\n for (let i = 0, len = this._textLines.length; i < len; i++) {\n lineOffset = this._getLineLeftOffset(i);\n if (this.direction === 'rtl') {\n lineOffset += this.width;\n }\n if (this.textBackgroundColor || this.styleHas('textBackgroundColor', i)) {\n this._setSVGTextLineBg(\n textBgRects,\n i,\n textLeftOffset + lineOffset,\n height,\n );\n }\n this._setSVGTextLineText(\n textSpans,\n i,\n textLeftOffset + lineOffset,\n height,\n );\n height += this.getHeightOfLine(i);\n }\n\n return {\n textSpans,\n textBgRects,\n };\n }\n\n private _createTextCharSpan(\n this: TextSVGExportMixin & FabricText,\n char: string,\n styleDecl: TextStyleDeclaration,\n left: number,\n top: number,\n charBox: GraphemeBBox,\n ) {\n const numFractionDigit = config.NUM_FRACTION_DIGITS;\n const styleProps = this.getSvgSpanStyles(\n styleDecl,\n char !== char.trim() || !!char.match(multipleSpacesRegex),\n ),\n fillStyles = styleProps ? `style=\"${styleProps}\"` : '',\n dy = styleDecl.deltaY,\n dySpan = dy ? ` dy=\"${toFixed(dy, numFractionDigit)}\" ` : '',\n { angle, renderLeft, renderTop, width } = charBox;\n let angleAttr = '';\n if (renderLeft !== undefined) {\n const wBy2 = width / 2;\n angle &&\n (angleAttr = ` rotate=\"${toFixed(radiansToDegrees(angle), numFractionDigit)}\"`);\n const m = createRotateMatrix({ angle: radiansToDegrees(angle!) });\n m[4] = renderLeft!;\n m[5] = renderTop!;\n const renderPoint = new Point(-wBy2, 0).transform(m);\n left = renderPoint.x;\n top = renderPoint.y;\n }\n\n return `${escapeXml(char)}`;\n }\n\n private _setSVGTextLineText(\n this: TextSVGExportMixin & FabricText,\n textSpans: string[],\n lineIndex: number,\n textLeftOffset: number,\n textTopOffset: number,\n ) {\n const lineHeight = this.getHeightOfLine(lineIndex),\n isJustify = this.textAlign.includes(JUSTIFY),\n line = this._textLines[lineIndex];\n let actualStyle,\n nextStyle,\n charsToRender = '',\n charBox,\n style,\n boxWidth = 0,\n timeToRender;\n\n textTopOffset +=\n (lineHeight * (1 - this._fontSizeFraction)) / this.lineHeight;\n for (let i = 0, len = line.length - 1; i <= len; i++) {\n timeToRender = i === len || this.charSpacing || this.path;\n charsToRender += line[i];\n charBox = this.__charBounds[lineIndex][i];\n if (boxWidth === 0) {\n textLeftOffset += charBox.kernedWidth - charBox.width;\n boxWidth += charBox.width;\n } else {\n boxWidth += charBox.kernedWidth;\n }\n if (isJustify && !timeToRender) {\n if (this._reSpaceAndTab.test(line[i])) {\n timeToRender = true;\n }\n }\n if (!timeToRender) {\n // if we have charSpacing or a path, we render char by char\n actualStyle =\n actualStyle || this.getCompleteStyleDeclaration(lineIndex, i);\n nextStyle = this.getCompleteStyleDeclaration(lineIndex, i + 1);\n timeToRender = hasStyleChanged(actualStyle, nextStyle, true);\n }\n if (timeToRender) {\n style = this._getStyleDeclaration(lineIndex, i);\n textSpans.push(\n this._createTextCharSpan(\n charsToRender,\n style,\n textLeftOffset,\n textTopOffset,\n charBox,\n ),\n );\n charsToRender = '';\n actualStyle = nextStyle;\n if (this.direction === 'rtl') {\n textLeftOffset -= boxWidth;\n } else {\n textLeftOffset += boxWidth;\n }\n boxWidth = 0;\n }\n }\n }\n\n private _setSVGTextLineBg(\n this: TextSVGExportMixin & FabricText,\n textBgRects: (string | number)[],\n i: number,\n leftOffset: number,\n textTopOffset: number,\n ) {\n const line = this._textLines[i],\n heightOfLine = this.getHeightOfLine(i) / this.lineHeight;\n let boxWidth = 0,\n boxStart = 0,\n currentColor,\n lastColor = this.getValueOfPropertyAt(i, 0, 'textBackgroundColor');\n for (let j = 0; j < line.length; j++) {\n const { left, width, kernedWidth } = this.__charBounds[i][j];\n currentColor = this.getValueOfPropertyAt(i, j, 'textBackgroundColor');\n if (currentColor !== lastColor) {\n lastColor &&\n textBgRects.push(\n ...createSVGInlineRect(\n lastColor,\n leftOffset + boxStart,\n textTopOffset,\n boxWidth,\n heightOfLine,\n ),\n );\n boxStart = left;\n boxWidth = width;\n lastColor = currentColor;\n } else {\n boxWidth += kernedWidth;\n }\n }\n currentColor &&\n textBgRects.push(\n ...createSVGInlineRect(\n lastColor,\n leftOffset + boxStart,\n textTopOffset,\n boxWidth,\n heightOfLine,\n ),\n );\n }\n\n /**\n * Returns styles-string for svg-export\n * @param {Boolean} skipShadow a boolean to skip shadow filter output\n * @return {String}\n */\n getSvgStyles(this: TextSVGExportMixin & FabricText, skipShadow?: boolean) {\n return `${super.getSvgStyles(skipShadow)} text-decoration-thickness: ${toFixed((this.textDecorationThickness * this.getObjectScaling().y) / 10, config.NUM_FRACTION_DIGITS)}%; white-space: pre;`;\n }\n\n /**\n * Returns styles-string for svg-export\n * @param {Object} style the object from which to retrieve style properties\n * @param {Boolean} useWhiteSpace a boolean to include an additional attribute in the style.\n * @return {String}\n */\n getSvgSpanStyles(\n this: TextSVGExportMixin & FabricText,\n style: TextStyleDeclaration,\n useWhiteSpace?: boolean,\n ) {\n const {\n fontFamily,\n strokeWidth,\n stroke,\n fill,\n fontSize,\n fontStyle,\n fontWeight,\n deltaY,\n textDecorationThickness,\n linethrough,\n overline,\n underline,\n } = style;\n\n const textDecoration = this.getSvgTextDecoration({\n underline: underline ?? this.underline,\n overline: overline ?? this.overline,\n linethrough: linethrough ?? this.linethrough,\n });\n const thickness = textDecorationThickness || this.textDecorationThickness;\n return [\n stroke ? colorPropToSVG(STROKE, stroke) : '',\n strokeWidth ? `stroke-width: ${strokeWidth}; ` : '',\n fontFamily\n ? `font-family: ${\n !fontFamily.includes(\"'\") && !fontFamily.includes('\"')\n ? `'${fontFamily}'`\n : fontFamily\n }; `\n : '',\n fontSize ? `font-size: ${fontSize}px; ` : '',\n fontStyle ? `font-style: ${fontStyle}; ` : '',\n fontWeight ? `font-weight: ${fontWeight}; ` : '',\n textDecoration\n ? `text-decoration: ${textDecoration}; text-decoration-thickness: ${toFixed((thickness * this.getObjectScaling().y) / 10, config.NUM_FRACTION_DIGITS)}%; `\n : '',\n fill ? colorPropToSVG(FILL, fill) : '',\n deltaY ? `baseline-shift: ${-deltaY}; ` : '',\n useWhiteSpace ? 'white-space: pre; ' : '',\n ].join('');\n }\n\n /**\n * Returns text-decoration property for svg-export\n * @param {Object} style the object from which to retrieve style properties\n * @return {String}\n */\n getSvgTextDecoration(\n this: TextSVGExportMixin & FabricText,\n style: TextStyleDeclaration,\n ) {\n return (['overline', 'underline', 'line-through'] as const)\n .filter(\n (decoration) =>\n style[\n decoration.replace('-', '') as\n | 'overline'\n | 'underline'\n | 'linethrough'\n ],\n )\n .join(' ');\n }\n}\n","import { cache } from '../../cache';\nimport { DEFAULT_SVG_FONT_SIZE, FILL, STROKE } from '../../constants';\nimport type { ObjectEvents } from '../../EventTypeDefs';\nimport type {\n CompleteTextStyleDeclaration,\n TextStyle,\n TextStyleDeclaration,\n} from './StyledText';\nimport { StyledText } from './StyledText';\nimport { SHARED_ATTRIBUTES } from '../../parser/attributes';\nimport { parseAttributes } from '../../parser/parseAttributes';\nimport type {\n Abortable,\n TCacheCanvasDimensions,\n TClassProperties,\n TFiller,\n TOptions,\n} from '../../typedefs';\nimport { classRegistry } from '../../ClassRegistry';\nimport { graphemeSplit } from '../../util/lang_string';\nimport { createCanvasElementFor } from '../../util/misc/dom';\nimport type { TextStyleArray } from '../../util/misc/textStyles';\nimport {\n hasStyleChanged,\n stylesFromArray,\n stylesToArray,\n} from '../../util/misc/textStyles';\nimport { getPathSegmentsInfo, getPointOnPath } from '../../util/path';\nimport { cacheProperties } from '../Object/FabricObject';\nimport type { Path } from '../Path';\nimport { TextSVGExportMixin } from './TextSVGExportMixin';\nimport { applyMixins } from '../../util/applyMixins';\nimport type { FabricObjectProps, SerializedObjectProps } from '../Object/types';\nimport type { StylePropertiesType } from './constants';\nimport {\n additionalProps,\n textDefaultValues,\n textLayoutProperties,\n JUSTIFY,\n JUSTIFY_CENTER,\n JUSTIFY_LEFT,\n JUSTIFY_RIGHT,\n TEXT_DECORATION_THICKNESS,\n} from './constants';\nimport { CENTER, LEFT, RIGHT, TOP, BOTTOM } from '../../constants';\nimport { isFiller } from '../../util/typeAssertions';\nimport type { Gradient } from '../../gradient/Gradient';\nimport type { Pattern } from '../../Pattern';\nimport type { CSSRules } from '../../parser/typedefs';\n\nlet measuringContext: CanvasRenderingContext2D | null;\n\n/**\n * Return a context for measurement of text string.\n * if created it gets stored for reuse\n */\nfunction getMeasuringContext() {\n if (!measuringContext) {\n const canvas = createCanvasElementFor({\n width: 0,\n height: 0,\n });\n measuringContext = canvas.getContext('2d');\n }\n return measuringContext;\n}\n\nexport type TPathSide = 'left' | 'right';\n\nexport type TPathAlign = 'baseline' | 'center' | 'ascender' | 'descender';\n\nexport type TextLinesInfo = {\n lines: string[];\n graphemeLines: string[][];\n graphemeText: string[];\n _unwrappedLines: string[][];\n};\n\n/**\n * Measure and return the info of a single grapheme.\n * needs the the info of previous graphemes already filled\n * Override to customize measuring\n */\nexport type GraphemeBBox = {\n width: number;\n height: number;\n kernedWidth: number;\n left: number;\n deltaY: number;\n renderLeft?: number;\n renderTop?: number;\n angle?: number;\n};\n\n// @TODO this is not complete\ninterface UniqueTextProps {\n charSpacing: number;\n lineHeight: number;\n fontSize: number;\n fontWeight: string | number;\n fontFamily: string;\n fontStyle: string;\n pathSide: TPathSide;\n pathAlign: TPathAlign;\n underline: boolean;\n overline: boolean;\n linethrough: boolean;\n textAlign: string;\n direction: CanvasDirection;\n path?: Path;\n textDecorationThickness: number;\n}\n\nexport interface SerializedTextProps\n extends SerializedObjectProps,\n UniqueTextProps {\n styles: TextStyleArray | TextStyle;\n}\n\nexport interface TextProps extends FabricObjectProps, UniqueTextProps {\n styles: TextStyle;\n}\n\n/**\n * Text class\n * @tutorial {@link http://fabricjs.com/fabric-intro-part-2#text}\n */\nexport class FabricText<\n Props extends TOptions = Partial,\n SProps extends SerializedTextProps = SerializedTextProps,\n EventSpec extends ObjectEvents = ObjectEvents,\n >\n extends StyledText\n implements UniqueTextProps\n{\n /**\n * Properties that requires a text layout recalculation when changed\n * @type string[]\n * @protected\n */\n static textLayoutProperties: string[] = textLayoutProperties;\n\n /**\n * @private\n */\n declare _reNewline: RegExp;\n\n /**\n * Use this regular expression to filter for whitespaces that is not a new line.\n * Mostly used when text is 'justify' aligned.\n * @private\n */\n declare _reSpacesAndTabs: RegExp;\n\n /**\n * Use this regular expression to filter for whitespace that is not a new line.\n * Mostly used when text is 'justify' aligned.\n * @private\n */\n declare _reSpaceAndTab: RegExp;\n\n /**\n * Use this regular expression to filter consecutive groups of non spaces.\n * Mostly used when text is 'justify' aligned.\n * @private\n */\n declare _reWords: RegExp;\n\n declare text: string;\n\n /**\n * Font size (in pixels)\n * @type Number\n */\n declare fontSize: number;\n\n /**\n * Font weight (e.g. bold, normal, 400, 600, 800)\n * @type {(Number|String)}\n */\n declare fontWeight: string | number;\n\n /**\n * Font family\n * @type String\n */\n declare fontFamily: string;\n\n /**\n * Text decoration underline.\n * @type Boolean\n */\n declare underline: boolean;\n\n /**\n * Text decoration overline.\n * @type Boolean\n */\n declare overline: boolean;\n\n /**\n * Text decoration linethrough.\n * @type Boolean\n */\n declare linethrough: boolean;\n\n /**\n * Text alignment. Possible values: \"left\", \"center\", \"right\", \"justify\",\n * \"justify-left\", \"justify-center\" or \"justify-right\".\n * @type String\n */\n declare textAlign: string;\n\n /**\n * Font style . Possible values: \"\", \"normal\", \"italic\" or \"oblique\".\n * @type String\n */\n declare fontStyle: string;\n\n /**\n * Line height\n * @type Number\n */\n declare lineHeight: number;\n\n /**\n * Superscript schema object (minimum overlap)\n */\n declare superscript: {\n /**\n * fontSize factor\n * @default 0.6\n */\n size: number;\n /**\n * baseline-shift factor (upwards)\n * @default -0.35\n */\n baseline: number;\n };\n\n /**\n * Subscript schema object (minimum overlap)\n */\n declare subscript: {\n /**\n * fontSize factor\n * @default 0.6\n */\n size: number;\n /**\n * baseline-shift factor (downwards)\n * @default 0.11\n */\n baseline: number;\n };\n\n /**\n * Background color of text lines\n * @type String\n */\n declare textBackgroundColor: string;\n\n declare styles: TextStyle;\n\n /**\n * Path that the text should follow.\n * since 4.6.0 the path will be drawn automatically.\n * if you want to make the path visible, give it a stroke and strokeWidth or fill value\n * if you want it to be hidden, assign visible = false to the path.\n * This feature is in BETA, and SVG import/export is not yet supported.\n * @type Path\n * @example\n * const textPath = new Text('Text on a path', {\n * top: 150,\n * left: 150,\n * textAlign: 'center',\n * charSpacing: -50,\n * path: new Path('M 0 0 C 50 -100 150 -100 200 0', {\n * strokeWidth: 1,\n * visible: false\n * }),\n * pathSide: 'left',\n * pathStartOffset: 0\n * });\n */\n declare path?: Path;\n\n /**\n * The text decoration tickness for underline, overline and strikethrough\n * The tickness is expressed in thousandths of fontSize ( em ).\n * The original value was 1/15 that translates to 66.6667 thousandths.\n * The choice of unit of measure is to align with charSpacing.\n * You can slim the tickness without issues, while large underline or overline may end up\n * outside the bounding box of the text. In order to fix that a bigger refactor of the code\n * is needed and is out of scope for now. If you need such large overline on the first line\n * of text or large underline on the last line of text, consider disabling caching as a\n * workaround\n * @default 66.667\n */\n declare textDecorationThickness: number;\n\n /**\n * Offset amount for text path starting position\n * Only used when text has a path\n */\n declare pathStartOffset: number;\n\n /**\n * Which side of the path the text should be drawn on.\n * Only used when text has a path\n * @type {TPathSide} 'left|right'\n */\n declare pathSide: TPathSide;\n\n /**\n * How text is aligned to the path. This property determines\n * the perpendicular position of each character relative to the path.\n * (one of \"baseline\", \"center\", \"ascender\", \"descender\")\n * This feature is in BETA, and its behavior may change\n * @type TPathAlign\n */\n declare pathAlign: TPathAlign;\n\n /**\n * @private\n */\n declare _fontSizeFraction: number;\n\n /**\n * @private\n */\n declare offsets: { underline: number; linethrough: number; overline: number };\n\n /**\n * Text Line proportion to font Size (in pixels)\n * @type Number\n */\n declare _fontSizeMult: number;\n\n /**\n * additional space between characters\n * expressed in thousands of em unit\n * @type Number\n */\n declare charSpacing: number;\n\n /**\n * Baseline shift, styles only, keep at 0 for the main text object\n * @type {Number}\n */\n declare deltaY: number;\n\n /**\n * WARNING: EXPERIMENTAL. NOT SUPPORTED YET\n * determine the direction of the text.\n * This has to be set manually together with textAlign and originX for proper\n * experience.\n * some interesting link for the future\n * https://www.w3.org/International/questions/qa-bidi-unicode-controls\n * @since 4.5.0\n * @type {CanvasDirection} 'ltr|rtl'\n */\n declare direction: CanvasDirection;\n\n /**\n * contains characters bounding boxes\n * This variable is considered to be protected.\n * But for how mixins are implemented right now, we can't leave it private\n * @protected\n */\n __charBounds: GraphemeBBox[][] = [];\n\n /**\n * use this size when measuring text. To avoid IE11 rounding errors\n * @type {Number}\n * @readonly\n * @private\n */\n declare CACHE_FONT_SIZE: number;\n\n /**\n * contains the min text width to avoid getting 0\n * @type {Number}\n */\n declare MIN_TEXT_WIDTH: number;\n\n /**\n * contains the the text of the object, divided in lines as they are displayed\n * on screen. Wrapping will divide the text independently of line breaks\n * @type {string[]}\n */\n declare textLines: string[];\n\n /**\n * same as textlines, but each line is an array of graphemes as split by splitByGrapheme\n * @type {string[]}\n */\n declare _textLines: string[][];\n\n declare _unwrappedTextLines: string[][];\n declare _text: string[];\n declare cursorWidth: number;\n declare __lineHeights: number[];\n declare __lineWidths: number[];\n declare initialized?: true;\n\n static cacheProperties = [...cacheProperties, ...additionalProps];\n\n static ownDefaults = textDefaultValues;\n\n static type = 'Text';\n\n static getDefaults(): Record {\n return { ...super.getDefaults(), ...FabricText.ownDefaults };\n }\n\n constructor(text: string, options?: Props) {\n super();\n Object.assign(this, FabricText.ownDefaults);\n this.setOptions(options);\n if (!this.styles) {\n this.styles = {};\n }\n this.text = text;\n this.initialized = true;\n if (this.path) {\n this.setPathInfo();\n }\n this.initDimensions();\n this.setCoords();\n }\n\n /**\n * If text has a path, it will add the extra information needed\n * for path and text calculations\n */\n setPathInfo() {\n const path = this.path;\n if (path) {\n path.segmentsInfo = getPathSegmentsInfo(path.path);\n }\n }\n\n /**\n * @private\n * Divides text into lines of text and lines of graphemes.\n */\n _splitText(): TextLinesInfo {\n const newLines = this._splitTextIntoLines(this.text);\n this.textLines = newLines.lines;\n this._textLines = newLines.graphemeLines;\n this._unwrappedTextLines = newLines._unwrappedLines;\n this._text = newLines.graphemeText;\n return newLines;\n }\n\n /**\n * Initialize or update text dimensions.\n * Updates this.width and this.height with the proper values.\n * Does not return dimensions.\n */\n initDimensions() {\n this._splitText();\n this._clearCache();\n this.dirty = true;\n if (this.path) {\n this.width = this.path.width;\n this.height = this.path.height;\n } else {\n this.width =\n this.calcTextWidth() || this.cursorWidth || this.MIN_TEXT_WIDTH;\n this.height = this.calcTextHeight();\n }\n if (this.textAlign.includes(JUSTIFY)) {\n // once text is measured we need to make space fatter to make justified text.\n this.enlargeSpaces();\n }\n }\n\n /**\n * Enlarge space boxes and shift the others\n */\n enlargeSpaces() {\n let diffSpace,\n currentLineWidth,\n numberOfSpaces,\n accumulatedSpace,\n line,\n charBound,\n spaces;\n for (let i = 0, len = this._textLines.length; i < len; i++) {\n if (\n this.textAlign !== JUSTIFY &&\n (i === len - 1 || this.isEndOfWrapping(i))\n ) {\n continue;\n }\n accumulatedSpace = 0;\n line = this._textLines[i];\n currentLineWidth = this.getLineWidth(i);\n if (\n currentLineWidth < this.width &&\n (spaces = this.textLines[i].match(this._reSpacesAndTabs))\n ) {\n numberOfSpaces = spaces.length;\n diffSpace = (this.width - currentLineWidth) / numberOfSpaces;\n for (let j = 0; j <= line.length; j++) {\n charBound = this.__charBounds[i][j];\n if (this._reSpaceAndTab.test(line[j])) {\n charBound.width += diffSpace;\n charBound.kernedWidth += diffSpace;\n charBound.left += accumulatedSpace;\n accumulatedSpace += diffSpace;\n } else {\n charBound.left += accumulatedSpace;\n }\n }\n }\n }\n }\n\n /**\n * Detect if the text line is ended with an hard break\n * text and itext do not have wrapping, return false\n * @return {Boolean}\n */\n isEndOfWrapping(lineIndex: number): boolean {\n return lineIndex === this._textLines.length - 1;\n }\n\n /**\n * Detect if a line has a linebreak and so we need to account for it when moving\n * and counting style.\n * It return always 1 for text and Itext. Textbox has its own implementation\n * @return Number\n */\n missingNewlineOffset(lineIndex: number, skipWrapping?: boolean): 0 | 1;\n missingNewlineOffset(_lineIndex: number): 1 {\n return 1;\n }\n\n /**\n * Returns 2d representation (lineIndex and charIndex) of cursor\n * @param {Number} selectionStart\n * @param {Boolean} [skipWrapping] consider the location for unwrapped lines. useful to manage styles.\n */\n get2DCursorLocation(selectionStart: number, skipWrapping?: boolean) {\n const lines = skipWrapping ? this._unwrappedTextLines : this._textLines;\n let i: number;\n for (i = 0; i < lines.length; i++) {\n if (selectionStart <= lines[i].length) {\n return {\n lineIndex: i,\n charIndex: selectionStart,\n };\n }\n selectionStart -=\n lines[i].length + this.missingNewlineOffset(i, skipWrapping);\n }\n return {\n lineIndex: i - 1,\n charIndex:\n lines[i - 1].length < selectionStart\n ? lines[i - 1].length\n : selectionStart,\n };\n }\n\n /**\n * Returns string representation of an instance\n * @return {String} String representation of text object\n */\n toString(): string {\n return `#`;\n }\n\n /**\n * Return the dimension and the zoom level needed to create a cache canvas\n * big enough to host the object to be cached.\n * @private\n * @param {Object} dim.x width of object to be cached\n * @param {Object} dim.y height of object to be cached\n * @return {Object}.width width of canvas\n * @return {Object}.height height of canvas\n * @return {Object}.zoomX zoomX zoom value to unscale the canvas before drawing cache\n * @return {Object}.zoomY zoomY zoom value to unscale the canvas before drawing cache\n */\n _getCacheCanvasDimensions(): TCacheCanvasDimensions {\n const dims = super._getCacheCanvasDimensions();\n const fontSize = this.fontSize;\n dims.width += fontSize * dims.zoomX;\n dims.height += fontSize * dims.zoomY;\n return dims;\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _render(ctx: CanvasRenderingContext2D) {\n const path = this.path;\n path && !path.isNotVisible() && path._render(ctx);\n this._setTextStyles(ctx);\n this._renderTextLinesBackground(ctx);\n this._renderTextDecoration(ctx, 'underline');\n this._renderText(ctx);\n this._renderTextDecoration(ctx, 'overline');\n this._renderTextDecoration(ctx, 'linethrough');\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _renderText(ctx: CanvasRenderingContext2D) {\n if (this.paintFirst === STROKE) {\n this._renderTextStroke(ctx);\n this._renderTextFill(ctx);\n } else {\n this._renderTextFill(ctx);\n this._renderTextStroke(ctx);\n }\n }\n\n /**\n * Set the font parameter of the context with the object properties or with charStyle\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n * @param {Object} [charStyle] object with font style properties\n * @param {String} [charStyle.fontFamily] Font Family\n * @param {Number} [charStyle.fontSize] Font size in pixels. ( without px suffix )\n * @param {String} [charStyle.fontWeight] Font weight\n * @param {String} [charStyle.fontStyle] Font style (italic|normal)\n */\n _setTextStyles(\n ctx: CanvasRenderingContext2D,\n charStyle?: any,\n forMeasuring?: boolean,\n ) {\n ctx.textBaseline = 'alphabetic';\n if (this.path) {\n switch (this.pathAlign) {\n case CENTER:\n ctx.textBaseline = 'middle';\n break;\n case 'ascender':\n ctx.textBaseline = TOP;\n break;\n case 'descender':\n ctx.textBaseline = BOTTOM;\n break;\n }\n }\n ctx.font = this._getFontDeclaration(charStyle, forMeasuring);\n }\n\n /**\n * calculate and return the text Width measuring each line.\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n * @return {Number} Maximum width of Text object\n */\n calcTextWidth(): number {\n let maxWidth = this.getLineWidth(0);\n\n for (let i = 1, len = this._textLines.length; i < len; i++) {\n const currentLineWidth = this.getLineWidth(i);\n if (currentLineWidth > maxWidth) {\n maxWidth = currentLineWidth;\n }\n }\n return maxWidth;\n }\n\n /**\n * @private\n * @param {String} method Method name (\"fillText\" or \"strokeText\")\n * @param {CanvasRenderingContext2D} ctx Context to render on\n * @param {String} line Text to render\n * @param {Number} left Left position of text\n * @param {Number} top Top position of text\n * @param {Number} lineIndex Index of a line in a text\n */\n _renderTextLine(\n method: 'fillText' | 'strokeText',\n ctx: CanvasRenderingContext2D,\n line: string[],\n left: number,\n top: number,\n lineIndex: number,\n ) {\n this._renderChars(method, ctx, line, left, top, lineIndex);\n }\n\n /**\n * Renders the text background for lines, taking care of style\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _renderTextLinesBackground(ctx: CanvasRenderingContext2D) {\n if (!this.textBackgroundColor && !this.styleHas('textBackgroundColor')) {\n return;\n }\n const originalFill = ctx.fillStyle,\n leftOffset = this._getLeftOffset();\n let lineTopOffset = this._getTopOffset();\n\n for (let i = 0, len = this._textLines.length; i < len; i++) {\n const heightOfLine = this.getHeightOfLine(i);\n if (\n !this.textBackgroundColor &&\n !this.styleHas('textBackgroundColor', i)\n ) {\n lineTopOffset += heightOfLine;\n continue;\n }\n const jlen = this._textLines[i].length;\n const lineLeftOffset = this._getLineLeftOffset(i);\n let boxWidth = 0;\n let boxStart = 0;\n let drawStart;\n let currentColor;\n let lastColor = this.getValueOfPropertyAt(i, 0, 'textBackgroundColor');\n for (let j = 0; j < jlen; j++) {\n // at this point charbox are either standard or full with pathInfo if there is a path.\n const charBox = this.__charBounds[i][j] as Required;\n currentColor = this.getValueOfPropertyAt(i, j, 'textBackgroundColor');\n if (this.path) {\n ctx.save();\n ctx.translate(charBox.renderLeft, charBox.renderTop);\n ctx.rotate(charBox.angle);\n ctx.fillStyle = currentColor;\n currentColor &&\n ctx.fillRect(\n -charBox.width / 2,\n (-heightOfLine / this.lineHeight) * (1 - this._fontSizeFraction),\n charBox.width,\n heightOfLine / this.lineHeight,\n );\n ctx.restore();\n } else if (currentColor !== lastColor) {\n drawStart = leftOffset + lineLeftOffset + boxStart;\n if (this.direction === 'rtl') {\n drawStart = this.width - drawStart - boxWidth;\n }\n ctx.fillStyle = lastColor;\n lastColor &&\n ctx.fillRect(\n drawStart,\n lineTopOffset,\n boxWidth,\n heightOfLine / this.lineHeight,\n );\n boxStart = charBox.left;\n boxWidth = charBox.width;\n lastColor = currentColor;\n } else {\n boxWidth += charBox.kernedWidth;\n }\n }\n if (currentColor && !this.path) {\n drawStart = leftOffset + lineLeftOffset + boxStart;\n if (this.direction === 'rtl') {\n drawStart = this.width - drawStart - boxWidth;\n }\n ctx.fillStyle = currentColor;\n ctx.fillRect(\n drawStart,\n lineTopOffset,\n boxWidth,\n heightOfLine / this.lineHeight,\n );\n }\n lineTopOffset += heightOfLine;\n }\n ctx.fillStyle = originalFill;\n // if there is text background color no\n // other shadows should be casted\n this._removeShadow(ctx);\n }\n\n /**\n * measure and return the width of a single character.\n * possibly overridden to accommodate different measure logic or\n * to hook some external lib for character measurement\n * @private\n * @param {String} _char, char to be measured\n * @param {Object} charStyle style of char to be measured\n * @param {String} [previousChar] previous char\n * @param {Object} [prevCharStyle] style of previous char\n */\n _measureChar(\n _char: string,\n charStyle: CompleteTextStyleDeclaration,\n previousChar: string | undefined,\n prevCharStyle: CompleteTextStyleDeclaration | Record,\n ) {\n const fontCache = cache.getFontCache(charStyle),\n fontDeclaration = this._getFontDeclaration(charStyle),\n couple = previousChar + _char,\n stylesAreEqual =\n previousChar &&\n fontDeclaration === this._getFontDeclaration(prevCharStyle),\n fontMultiplier = charStyle.fontSize / this.CACHE_FONT_SIZE;\n let width: number | undefined,\n coupleWidth: number | undefined,\n previousWidth: number | undefined,\n kernedWidth: number | undefined;\n\n if (previousChar && fontCache[previousChar] !== undefined) {\n previousWidth = fontCache[previousChar];\n }\n if (fontCache[_char] !== undefined) {\n kernedWidth = width = fontCache[_char];\n }\n if (stylesAreEqual && fontCache[couple] !== undefined) {\n coupleWidth = fontCache[couple];\n kernedWidth = coupleWidth - previousWidth!;\n }\n if (\n width === undefined ||\n previousWidth === undefined ||\n coupleWidth === undefined\n ) {\n const ctx = getMeasuringContext()!;\n // send a TRUE to specify measuring font size CACHE_FONT_SIZE\n this._setTextStyles(ctx, charStyle, true);\n if (width === undefined) {\n kernedWidth = width = ctx.measureText(_char).width;\n fontCache[_char] = width;\n }\n if (previousWidth === undefined && stylesAreEqual && previousChar) {\n previousWidth = ctx.measureText(previousChar).width;\n fontCache[previousChar] = previousWidth;\n }\n if (stylesAreEqual && coupleWidth === undefined) {\n // we can measure the kerning couple and subtract the width of the previous character\n coupleWidth = ctx.measureText(couple).width;\n fontCache[couple] = coupleWidth;\n // safe to use the non-null since if undefined we defined it before.\n kernedWidth = coupleWidth - previousWidth!;\n }\n }\n return {\n width: width * fontMultiplier,\n kernedWidth: kernedWidth! * fontMultiplier,\n };\n }\n\n /**\n * Computes height of character at given position\n * @param {Number} line the line index number\n * @param {Number} _char the character index number\n * @return {Number} fontSize of the character\n */\n getHeightOfChar(line: number, _char: number): number {\n return this.getValueOfPropertyAt(line, _char, 'fontSize');\n }\n\n /**\n * measure a text line measuring all characters.\n * @param {Number} lineIndex line number\n */\n measureLine(lineIndex: number) {\n const lineInfo = this._measureLine(lineIndex);\n if (this.charSpacing !== 0) {\n lineInfo.width -= this._getWidthOfCharSpacing();\n }\n if (lineInfo.width < 0) {\n lineInfo.width = 0;\n }\n return lineInfo;\n }\n\n /**\n * measure every grapheme of a line, populating __charBounds\n * @param {Number} lineIndex\n * @return {Object} object.width total width of characters\n * @return {Object} object.numOfSpaces length of chars that match this._reSpacesAndTabs\n */\n _measureLine(lineIndex: number) {\n let width = 0,\n prevGrapheme: string | undefined,\n graphemeInfo: GraphemeBBox | undefined;\n\n const reverse = this.pathSide === RIGHT,\n path = this.path,\n line = this._textLines[lineIndex],\n llength = line.length,\n lineBounds = new Array(llength);\n\n this.__charBounds[lineIndex] = lineBounds;\n for (let i = 0; i < llength; i++) {\n const grapheme = line[i];\n graphemeInfo = this._getGraphemeBox(grapheme, lineIndex, i, prevGrapheme);\n lineBounds[i] = graphemeInfo;\n width += graphemeInfo.kernedWidth;\n prevGrapheme = grapheme;\n }\n // this latest bound box represent the last character of the line\n // to simplify cursor handling in interactive mode.\n lineBounds[llength] = {\n left: graphemeInfo ? graphemeInfo.left + graphemeInfo.width : 0,\n width: 0,\n kernedWidth: 0,\n height: this.fontSize,\n deltaY: 0,\n } as GraphemeBBox;\n if (path && path.segmentsInfo) {\n let positionInPath = 0;\n const totalPathLength =\n path.segmentsInfo[path.segmentsInfo.length - 1].length;\n switch (this.textAlign) {\n case LEFT:\n positionInPath = reverse ? totalPathLength - width : 0;\n break;\n case CENTER:\n positionInPath = (totalPathLength - width) / 2;\n break;\n case RIGHT:\n positionInPath = reverse ? 0 : totalPathLength - width;\n break;\n //todo - add support for justify\n }\n positionInPath += this.pathStartOffset * (reverse ? -1 : 1);\n for (\n let i = reverse ? llength - 1 : 0;\n reverse ? i >= 0 : i < llength;\n reverse ? i-- : i++\n ) {\n graphemeInfo = lineBounds[i];\n if (positionInPath > totalPathLength) {\n positionInPath %= totalPathLength;\n } else if (positionInPath < 0) {\n positionInPath += totalPathLength;\n }\n // it would probably much faster to send all the grapheme position for a line\n // and calculate path position/angle at once.\n this._setGraphemeOnPath(positionInPath, graphemeInfo);\n positionInPath += graphemeInfo.kernedWidth;\n }\n }\n return { width: width, numOfSpaces: 0 };\n }\n\n /**\n * Calculate the angle and the left,top position of the char that follow a path.\n * It appends it to graphemeInfo to be reused later at rendering\n * @private\n * @param {Number} positionInPath to be measured\n * @param {GraphemeBBox} graphemeInfo current grapheme box information\n * @param {Object} startingPoint position of the point\n */\n _setGraphemeOnPath(positionInPath: number, graphemeInfo: GraphemeBBox) {\n const centerPosition = positionInPath + graphemeInfo.kernedWidth / 2,\n path = this.path!;\n\n // we are at currentPositionOnPath. we want to know what point on the path is.\n const info = getPointOnPath(path.path, centerPosition, path.segmentsInfo)!;\n graphemeInfo.renderLeft = info.x - path.pathOffset.x;\n graphemeInfo.renderTop = info.y - path.pathOffset.y;\n graphemeInfo.angle = info.angle + (this.pathSide === RIGHT ? Math.PI : 0);\n }\n\n /**\n *\n * @param {String} grapheme to be measured\n * @param {Number} lineIndex index of the line where the char is\n * @param {Number} charIndex position in the line\n * @param {String} [prevGrapheme] character preceding the one to be measured\n * @returns {GraphemeBBox} grapheme bbox\n */\n _getGraphemeBox(\n grapheme: string,\n lineIndex: number,\n charIndex: number,\n prevGrapheme?: string,\n skipLeft?: boolean,\n ): GraphemeBBox {\n const style = this.getCompleteStyleDeclaration(lineIndex, charIndex),\n prevStyle = prevGrapheme\n ? this.getCompleteStyleDeclaration(lineIndex, charIndex - 1)\n : {},\n info = this._measureChar(grapheme, style, prevGrapheme, prevStyle);\n let kernedWidth = info.kernedWidth,\n width = info.width,\n charSpacing;\n\n if (this.charSpacing !== 0) {\n charSpacing = this._getWidthOfCharSpacing();\n width += charSpacing;\n kernedWidth += charSpacing;\n }\n\n const box: GraphemeBBox = {\n width,\n left: 0,\n height: style.fontSize,\n kernedWidth,\n deltaY: style.deltaY,\n };\n if (charIndex > 0 && !skipLeft) {\n const previousBox = this.__charBounds[lineIndex][charIndex - 1];\n box.left =\n previousBox.left + previousBox.width + info.kernedWidth - info.width;\n }\n return box;\n }\n\n /**\n * Calculate height of line at 'lineIndex'\n * @param {Number} lineIndex index of line to calculate\n * @return {Number}\n */\n getHeightOfLine(lineIndex: number): number {\n if (this.__lineHeights[lineIndex]) {\n return this.__lineHeights[lineIndex];\n }\n\n // char 0 is measured before the line cycle because it needs to char\n // emptylines\n let maxHeight = this.getHeightOfChar(lineIndex, 0);\n for (let i = 1, len = this._textLines[lineIndex].length; i < len; i++) {\n maxHeight = Math.max(this.getHeightOfChar(lineIndex, i), maxHeight);\n }\n\n return (this.__lineHeights[lineIndex] =\n maxHeight * this.lineHeight * this._fontSizeMult);\n }\n\n /**\n * Calculate text box height\n */\n calcTextHeight() {\n let lineHeight,\n height = 0;\n for (let i = 0, len = this._textLines.length; i < len; i++) {\n lineHeight = this.getHeightOfLine(i);\n height += i === len - 1 ? lineHeight / this.lineHeight : lineHeight;\n }\n return height;\n }\n\n /**\n * @private\n * @return {Number} Left offset\n */\n _getLeftOffset(): number {\n return this.direction === 'ltr' ? -this.width / 2 : this.width / 2;\n }\n\n /**\n * @private\n * @return {Number} Top offset\n */\n _getTopOffset(): number {\n return -this.height / 2;\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n * @param {String} method Method name (\"fillText\" or \"strokeText\")\n */\n _renderTextCommon(\n ctx: CanvasRenderingContext2D,\n method: 'fillText' | 'strokeText',\n ) {\n ctx.save();\n let lineHeights = 0;\n const left = this._getLeftOffset(),\n top = this._getTopOffset();\n for (let i = 0, len = this._textLines.length; i < len; i++) {\n const heightOfLine = this.getHeightOfLine(i),\n maxHeight = heightOfLine / this.lineHeight,\n leftOffset = this._getLineLeftOffset(i);\n this._renderTextLine(\n method,\n ctx,\n this._textLines[i],\n left + leftOffset,\n top + lineHeights + maxHeight,\n i,\n );\n lineHeights += heightOfLine;\n }\n ctx.restore();\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _renderTextFill(ctx: CanvasRenderingContext2D) {\n if (!this.fill && !this.styleHas(FILL)) {\n return;\n }\n\n this._renderTextCommon(ctx, 'fillText');\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _renderTextStroke(ctx: CanvasRenderingContext2D) {\n if ((!this.stroke || this.strokeWidth === 0) && this.isEmptyStyles()) {\n return;\n }\n\n if (this.shadow && !this.shadow.affectStroke) {\n this._removeShadow(ctx);\n }\n\n ctx.save();\n this._setLineDash(ctx, this.strokeDashArray);\n ctx.beginPath();\n this._renderTextCommon(ctx, 'strokeText');\n ctx.closePath();\n ctx.restore();\n }\n\n /**\n * @private\n * @param {String} method fillText or strokeText.\n * @param {CanvasRenderingContext2D} ctx Context to render on\n * @param {Array} line Content of the line, splitted in an array by grapheme\n * @param {Number} left\n * @param {Number} top\n * @param {Number} lineIndex\n */\n _renderChars(\n method: 'fillText' | 'strokeText',\n ctx: CanvasRenderingContext2D,\n line: Array,\n left: number,\n top: number,\n lineIndex: number,\n ) {\n const lineHeight = this.getHeightOfLine(lineIndex),\n isJustify = this.textAlign.includes(JUSTIFY),\n path = this.path,\n shortCut =\n !isJustify &&\n this.charSpacing === 0 &&\n this.isEmptyStyles(lineIndex) &&\n !path,\n isLtr = this.direction === 'ltr',\n sign = this.direction === 'ltr' ? 1 : -1,\n // this was changed in the PR #7674\n // currentDirection = ctx.canvas.getAttribute('dir');\n currentDirection = ctx.direction;\n\n let actualStyle,\n nextStyle,\n charsToRender = '',\n charBox,\n boxWidth = 0,\n timeToRender,\n drawingLeft;\n\n ctx.save();\n if (currentDirection !== this.direction) {\n ctx.canvas.setAttribute('dir', isLtr ? 'ltr' : 'rtl');\n ctx.direction = isLtr ? 'ltr' : 'rtl';\n ctx.textAlign = isLtr ? LEFT : RIGHT;\n }\n top -= (lineHeight * this._fontSizeFraction) / this.lineHeight;\n if (shortCut) {\n // render all the line in one pass without checking\n // drawingLeft = isLtr ? left : left - this.getLineWidth(lineIndex);\n this._renderChar(method, ctx, lineIndex, 0, line.join(''), left, top);\n ctx.restore();\n return;\n }\n for (let i = 0, len = line.length - 1; i <= len; i++) {\n timeToRender = i === len || this.charSpacing || path;\n charsToRender += line[i];\n charBox = this.__charBounds[lineIndex][i] as Required;\n if (boxWidth === 0) {\n left += sign * (charBox.kernedWidth - charBox.width);\n boxWidth += charBox.width;\n } else {\n boxWidth += charBox.kernedWidth;\n }\n if (isJustify && !timeToRender) {\n if (this._reSpaceAndTab.test(line[i])) {\n timeToRender = true;\n }\n }\n if (!timeToRender) {\n // if we have charSpacing, we render char by char\n actualStyle =\n actualStyle || this.getCompleteStyleDeclaration(lineIndex, i);\n nextStyle = this.getCompleteStyleDeclaration(lineIndex, i + 1);\n timeToRender = hasStyleChanged(actualStyle, nextStyle, false);\n }\n if (timeToRender) {\n if (path) {\n ctx.save();\n ctx.translate(charBox.renderLeft, charBox.renderTop);\n ctx.rotate(charBox.angle);\n this._renderChar(\n method,\n ctx,\n lineIndex,\n i,\n charsToRender,\n -boxWidth / 2,\n 0,\n );\n ctx.restore();\n } else {\n drawingLeft = left;\n this._renderChar(\n method,\n ctx,\n lineIndex,\n i,\n charsToRender,\n drawingLeft,\n top,\n );\n }\n charsToRender = '';\n actualStyle = nextStyle;\n left += sign * boxWidth;\n boxWidth = 0;\n }\n }\n ctx.restore();\n }\n\n /**\n * This function try to patch the missing gradientTransform on canvas gradients.\n * transforming a context to transform the gradient, is going to transform the stroke too.\n * we want to transform the gradient but not the stroke operation, so we create\n * a transformed gradient on a pattern and then we use the pattern instead of the gradient.\n * this method has drawbacks: is slow, is in low resolution, needs a patch for when the size\n * is limited.\n * @private\n * @param {TFiller} filler a fabric gradient instance\n * @return {CanvasPattern} a pattern to use as fill/stroke style\n */\n _applyPatternGradientTransformText(filler: TFiller) {\n // TODO: verify compatibility with strokeUniform\n const width = this.width + this.strokeWidth,\n height = this.height + this.strokeWidth,\n pCanvas = createCanvasElementFor({\n width,\n height,\n }),\n pCtx = pCanvas.getContext('2d')!;\n pCanvas.width = width;\n pCanvas.height = height;\n pCtx.beginPath();\n pCtx.moveTo(0, 0);\n pCtx.lineTo(width, 0);\n pCtx.lineTo(width, height);\n pCtx.lineTo(0, height);\n pCtx.closePath();\n pCtx.translate(width / 2, height / 2);\n pCtx.fillStyle = filler.toLive(pCtx)!;\n this._applyPatternGradientTransform(pCtx, filler);\n pCtx.fill();\n return pCtx.createPattern(pCanvas, 'no-repeat')!;\n }\n\n handleFiller(\n ctx: CanvasRenderingContext2D,\n property: `${T}Style`,\n filler: TFiller | string,\n ): { offsetX: number; offsetY: number } {\n let offsetX: number, offsetY: number;\n if (isFiller(filler)) {\n if (\n (filler as Gradient<'linear'>).gradientUnits === 'percentage' ||\n (filler as Gradient<'linear'>).gradientTransform ||\n (filler as Pattern).patternTransform\n ) {\n // need to transform gradient in a pattern.\n // this is a slow process. If you are hitting this codepath, and the object\n // is not using caching, you should consider switching it on.\n // we need a canvas as big as the current object caching canvas.\n offsetX = -this.width / 2;\n offsetY = -this.height / 2;\n ctx.translate(offsetX, offsetY);\n ctx[property] = this._applyPatternGradientTransformText(filler);\n return { offsetX, offsetY };\n } else {\n // is a simple gradient or pattern\n ctx[property] = filler.toLive(ctx)!;\n return this._applyPatternGradientTransform(ctx, filler);\n }\n } else {\n // is a color\n ctx[property] = filler;\n }\n return { offsetX: 0, offsetY: 0 };\n }\n\n /**\n * This function prepare the canvas for a stroke style, and stroke and strokeWidth\n * need to be sent in as defined\n * @param {CanvasRenderingContext2D} ctx\n * @param {CompleteTextStyleDeclaration} style with stroke and strokeWidth defined\n * @returns\n */\n _setStrokeStyles(\n ctx: CanvasRenderingContext2D,\n {\n stroke,\n strokeWidth,\n }: Pick,\n ) {\n ctx.lineWidth = strokeWidth;\n ctx.lineCap = this.strokeLineCap;\n ctx.lineDashOffset = this.strokeDashOffset;\n ctx.lineJoin = this.strokeLineJoin;\n ctx.miterLimit = this.strokeMiterLimit;\n return this.handleFiller(ctx, 'strokeStyle', stroke!);\n }\n\n /**\n * This function prepare the canvas for a ill style, and fill\n * need to be sent in as defined\n * @param {CanvasRenderingContext2D} ctx\n * @param {CompleteTextStyleDeclaration} style with ill defined\n * @returns\n */\n _setFillStyles(ctx: CanvasRenderingContext2D, { fill }: Pick) {\n return this.handleFiller(ctx, 'fillStyle', fill!);\n }\n\n /**\n * @private\n * @param {String} method\n * @param {CanvasRenderingContext2D} ctx Context to render on\n * @param {Number} lineIndex\n * @param {Number} charIndex\n * @param {String} _char\n * @param {Number} left Left coordinate\n * @param {Number} top Top coordinate\n * @param {Number} lineHeight Height of the line\n */\n _renderChar(\n method: 'fillText' | 'strokeText',\n ctx: CanvasRenderingContext2D,\n lineIndex: number,\n charIndex: number,\n _char: string,\n left: number,\n top: number,\n ) {\n const decl = this._getStyleDeclaration(lineIndex, charIndex),\n fullDecl = this.getCompleteStyleDeclaration(lineIndex, charIndex),\n shouldFill = method === 'fillText' && fullDecl.fill,\n shouldStroke =\n method === 'strokeText' && fullDecl.stroke && fullDecl.strokeWidth;\n\n if (!shouldStroke && !shouldFill) {\n return;\n }\n ctx.save();\n\n ctx.font = this._getFontDeclaration(fullDecl);\n\n if (decl.textBackgroundColor) {\n this._removeShadow(ctx);\n }\n if (decl.deltaY) {\n top += decl.deltaY;\n }\n\n if (shouldFill) {\n const fillOffsets = this._setFillStyles(ctx, fullDecl);\n ctx.fillText(\n _char,\n left - fillOffsets.offsetX,\n top - fillOffsets.offsetY,\n );\n }\n\n if (shouldStroke) {\n const strokeOffsets = this._setStrokeStyles(ctx, fullDecl);\n ctx.strokeText(\n _char,\n left - strokeOffsets.offsetX,\n top - strokeOffsets.offsetY,\n );\n }\n\n ctx.restore();\n }\n\n /**\n * Turns the character into a 'superior figure' (i.e. 'superscript')\n * @param {Number} start selection start\n * @param {Number} end selection end\n */\n setSuperscript(start: number, end: number) {\n this._setScript(start, end, this.superscript);\n }\n\n /**\n * Turns the character into an 'inferior figure' (i.e. 'subscript')\n * @param {Number} start selection start\n * @param {Number} end selection end\n */\n setSubscript(start: number, end: number) {\n this._setScript(start, end, this.subscript);\n }\n\n /**\n * Applies 'schema' at given position\n * @private\n * @param {Number} start selection start\n * @param {Number} end selection end\n * @param {Number} schema\n */\n protected _setScript(\n start: number,\n end: number,\n schema: {\n size: number;\n baseline: number;\n },\n ) {\n const loc = this.get2DCursorLocation(start, true),\n fontSize = this.getValueOfPropertyAt(\n loc.lineIndex,\n loc.charIndex,\n 'fontSize',\n ),\n dy = this.getValueOfPropertyAt(loc.lineIndex, loc.charIndex, 'deltaY'),\n style = {\n fontSize: fontSize * schema.size,\n deltaY: dy + fontSize * schema.baseline,\n };\n this.setSelectionStyles(style, start, end);\n }\n\n /**\n * @private\n * @param {Number} lineIndex index text line\n * @return {Number} Line left offset\n */\n _getLineLeftOffset(lineIndex: number): number {\n const lineWidth = this.getLineWidth(lineIndex),\n lineDiff = this.width - lineWidth,\n textAlign = this.textAlign,\n direction = this.direction,\n isEndOfWrapping = this.isEndOfWrapping(lineIndex);\n let leftOffset = 0;\n if (\n textAlign === JUSTIFY ||\n (textAlign === JUSTIFY_CENTER && !isEndOfWrapping) ||\n (textAlign === JUSTIFY_RIGHT && !isEndOfWrapping) ||\n (textAlign === JUSTIFY_LEFT && !isEndOfWrapping)\n ) {\n return 0;\n }\n if (textAlign === CENTER) {\n leftOffset = lineDiff / 2;\n }\n if (textAlign === RIGHT) {\n leftOffset = lineDiff;\n }\n if (textAlign === JUSTIFY_CENTER) {\n leftOffset = lineDiff / 2;\n }\n if (textAlign === JUSTIFY_RIGHT) {\n leftOffset = lineDiff;\n }\n if (direction === 'rtl') {\n if (\n textAlign === RIGHT ||\n textAlign === JUSTIFY ||\n textAlign === JUSTIFY_RIGHT\n ) {\n leftOffset = 0;\n } else if (textAlign === LEFT || textAlign === JUSTIFY_LEFT) {\n leftOffset = -lineDiff;\n } else if (textAlign === CENTER || textAlign === JUSTIFY_CENTER) {\n leftOffset = -lineDiff / 2;\n }\n }\n return leftOffset;\n }\n\n /**\n * @private\n */\n _clearCache() {\n this._forceClearCache = false;\n this.__lineWidths = [];\n this.__lineHeights = [];\n this.__charBounds = [];\n }\n\n /**\n * Measure a single line given its index. Used to calculate the initial\n * text bounding box. The values are calculated and stored in __lineWidths cache.\n * @private\n * @param {Number} lineIndex line number\n * @return {Number} Line width\n */\n getLineWidth(lineIndex: number): number {\n if (this.__lineWidths[lineIndex] !== undefined) {\n return this.__lineWidths[lineIndex];\n }\n\n const { width } = this.measureLine(lineIndex);\n this.__lineWidths[lineIndex] = width;\n return width;\n }\n\n _getWidthOfCharSpacing() {\n if (this.charSpacing !== 0) {\n return (this.fontSize * this.charSpacing) / 1000;\n }\n return 0;\n }\n\n /**\n * Retrieves the value of property at given character position\n * @param {Number} lineIndex the line number\n * @param {Number} charIndex the character number\n * @param {String} property the property name\n * @returns the value of 'property'\n */\n getValueOfPropertyAt(\n lineIndex: number,\n charIndex: number,\n property: T,\n ): this[T] {\n const charStyle = this._getStyleDeclaration(lineIndex, charIndex);\n return (charStyle[property] ?? this[property]) as this[T];\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _renderTextDecoration(\n ctx: CanvasRenderingContext2D,\n type: 'underline' | 'linethrough' | 'overline',\n ) {\n if (!this[type] && !this.styleHas(type)) {\n return;\n }\n let topOffset = this._getTopOffset();\n const leftOffset = this._getLeftOffset(),\n path = this.path,\n charSpacing = this._getWidthOfCharSpacing(),\n offsetAligner =\n type === 'linethrough' ? 0.5 : type === 'overline' ? 1 : 0,\n offsetY = this.offsets[type];\n for (let i = 0, len = this._textLines.length; i < len; i++) {\n const heightOfLine = this.getHeightOfLine(i);\n if (!this[type] && !this.styleHas(type, i)) {\n topOffset += heightOfLine;\n continue;\n }\n const line = this._textLines[i];\n const maxHeight = heightOfLine / this.lineHeight;\n const lineLeftOffset = this._getLineLeftOffset(i);\n let boxStart = 0;\n let boxWidth = 0;\n let lastDecoration = this.getValueOfPropertyAt(i, 0, type);\n let lastFill = this.getValueOfPropertyAt(i, 0, FILL);\n let lastTickness = this.getValueOfPropertyAt(\n i,\n 0,\n TEXT_DECORATION_THICKNESS,\n );\n let currentDecoration = lastDecoration;\n let currentFill = lastFill;\n let currentTickness = lastTickness;\n const top = topOffset + maxHeight * (1 - this._fontSizeFraction);\n let size = this.getHeightOfChar(i, 0);\n let dy = this.getValueOfPropertyAt(i, 0, 'deltaY');\n for (let j = 0, jlen = line.length; j < jlen; j++) {\n const charBox = this.__charBounds[i][j] as Required;\n currentDecoration = this.getValueOfPropertyAt(i, j, type);\n currentFill = this.getValueOfPropertyAt(i, j, FILL);\n currentTickness = this.getValueOfPropertyAt(\n i,\n j,\n TEXT_DECORATION_THICKNESS,\n );\n const currentSize = this.getHeightOfChar(i, j);\n const currentDy = this.getValueOfPropertyAt(i, j, 'deltaY');\n if (path && currentDecoration && currentFill) {\n const finalTickness = (this.fontSize * currentTickness) / 1000;\n ctx.save();\n // bug? verify lastFill is a valid fill here.\n ctx.fillStyle = lastFill as string;\n ctx.translate(charBox.renderLeft, charBox.renderTop);\n ctx.rotate(charBox.angle);\n ctx.fillRect(\n -charBox.kernedWidth / 2,\n offsetY * currentSize + currentDy - offsetAligner * finalTickness,\n charBox.kernedWidth,\n finalTickness,\n );\n ctx.restore();\n } else if (\n (currentDecoration !== lastDecoration ||\n currentFill !== lastFill ||\n currentSize !== size ||\n currentTickness !== lastTickness ||\n currentDy !== dy) &&\n boxWidth > 0\n ) {\n const finalTickness = (this.fontSize * lastTickness) / 1000;\n let drawStart = leftOffset + lineLeftOffset + boxStart;\n if (this.direction === 'rtl') {\n drawStart = this.width - drawStart - boxWidth;\n }\n if (lastDecoration && lastFill && lastTickness) {\n // bug? verify lastFill is a valid fill here.\n ctx.fillStyle = lastFill as string;\n ctx.fillRect(\n drawStart,\n top + offsetY * size + dy - offsetAligner * finalTickness,\n boxWidth,\n finalTickness,\n );\n }\n boxStart = charBox.left;\n boxWidth = charBox.width;\n lastDecoration = currentDecoration;\n lastTickness = currentTickness;\n lastFill = currentFill;\n size = currentSize;\n dy = currentDy;\n } else {\n boxWidth += charBox.kernedWidth;\n }\n }\n let drawStart = leftOffset + lineLeftOffset + boxStart;\n if (this.direction === 'rtl') {\n drawStart = this.width - drawStart - boxWidth;\n }\n ctx.fillStyle = currentFill as string;\n const finalTickness = (this.fontSize * currentTickness) / 1000;\n currentDecoration &&\n currentFill &&\n currentTickness &&\n ctx.fillRect(\n drawStart,\n top + offsetY * size + dy - offsetAligner * finalTickness,\n boxWidth - charSpacing,\n finalTickness,\n );\n topOffset += heightOfLine;\n }\n // if there is text background color no\n // other shadows should be casted\n this._removeShadow(ctx);\n }\n\n /**\n * return font declaration string for canvas context\n * @param {Object} [styleObject] object\n * @returns {String} font declaration formatted for canvas context.\n */\n _getFontDeclaration(\n {\n fontFamily = this.fontFamily,\n fontStyle = this.fontStyle,\n fontWeight = this.fontWeight,\n fontSize = this.fontSize,\n }: Partial<\n Pick<\n TextStyleDeclaration,\n 'fontFamily' | 'fontStyle' | 'fontWeight' | 'fontSize'\n >\n > = {},\n forMeasuring?: boolean,\n ): string {\n const parsedFontFamily =\n fontFamily.includes(\"'\") ||\n fontFamily.includes('\"') ||\n fontFamily.includes(',') ||\n FabricText.genericFonts.includes(fontFamily.toLowerCase())\n ? fontFamily\n : `\"${fontFamily}\"`;\n return [\n fontStyle,\n fontWeight,\n `${forMeasuring ? this.CACHE_FONT_SIZE : fontSize}px`,\n parsedFontFamily,\n ].join(' ');\n }\n\n /**\n * Renders text instance on a specified context\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n render(ctx: CanvasRenderingContext2D) {\n if (!this.visible) {\n return;\n }\n if (\n this.canvas &&\n this.canvas.skipOffscreen &&\n !this.group &&\n !this.isOnScreen()\n ) {\n return;\n }\n if (this._forceClearCache) {\n this.initDimensions();\n }\n super.render(ctx);\n }\n\n /**\n * Override this method to customize grapheme splitting\n * @todo the util `graphemeSplit` needs to be injectable in some way.\n * is more comfortable to inject the correct util rather than having to override text\n * in the middle of the prototype chain\n * @param {string} value\n * @returns {string[]} array of graphemes\n */\n graphemeSplit(value: string): string[] {\n return graphemeSplit(value);\n }\n\n /**\n * Returns the text as an array of lines.\n * @param {String} text text to split\n * @returns Lines in the text\n */\n _splitTextIntoLines(text: string): TextLinesInfo {\n const lines = text.split(this._reNewline),\n newLines = new Array(lines.length),\n newLine = ['\\n'];\n let newText: string[] = [];\n for (let i = 0; i < lines.length; i++) {\n newLines[i] = this.graphemeSplit(lines[i]);\n newText = newText.concat(newLines[i], newLine);\n }\n newText.pop();\n return {\n _unwrappedLines: newLines,\n lines: lines,\n graphemeText: newText,\n graphemeLines: newLines,\n };\n }\n\n /**\n * Returns object representation of an instance\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} Object representation of an instance\n */\n toObject<\n T extends Omit, keyof SProps>,\n K extends keyof T = never,\n >(propertiesToInclude: K[] = []): Pick & SProps {\n return {\n ...super.toObject([...additionalProps, ...propertiesToInclude] as K[]),\n styles: stylesToArray(this.styles, this.text),\n ...(this.path ? { path: this.path.toObject() } : {}),\n };\n }\n\n set(key: string | any, value?: any) {\n const { textLayoutProperties } = this.constructor as typeof FabricText;\n super.set(key, value);\n let needsDims = false;\n let isAddingPath = false;\n if (typeof key === 'object') {\n for (const _key in key) {\n if (_key === 'path') {\n this.setPathInfo();\n }\n needsDims = needsDims || textLayoutProperties.includes(_key);\n isAddingPath = isAddingPath || _key === 'path';\n }\n } else {\n needsDims = textLayoutProperties.includes(key);\n isAddingPath = key === 'path';\n }\n if (isAddingPath) {\n this.setPathInfo();\n }\n if (needsDims && this.initialized) {\n this.initDimensions();\n this.setCoords();\n }\n return this;\n }\n\n /**\n * Returns complexity of an instance\n * @return {Number} complexity\n */\n complexity(): number {\n return 1;\n }\n\n /**\n * List of generic font families\n * @see https://developer.mozilla.org/en-US/docs/Web/CSS/font-family#generic-name\n */\n static genericFonts = [\n 'serif',\n 'sans-serif',\n 'monospace',\n 'cursive',\n 'fantasy',\n 'system-ui',\n 'ui-serif',\n 'ui-sans-serif',\n 'ui-monospace',\n 'ui-rounded',\n 'math',\n 'emoji',\n 'fangsong',\n ];\n\n /* _FROM_SVG_START_ */\n\n /**\n * List of attribute names to account for when parsing SVG element (used by {@link FabricText.fromElement})\n * @see: http://www.w3.org/TR/SVG/text.html#TextElement\n */\n static ATTRIBUTE_NAMES = SHARED_ATTRIBUTES.concat(\n 'x',\n 'y',\n 'dx',\n 'dy',\n 'font-family',\n 'font-style',\n 'font-weight',\n 'font-size',\n 'letter-spacing',\n 'text-decoration',\n 'text-anchor',\n );\n\n /**\n * Returns FabricText instance from an SVG element (not yet implemented)\n * @param {HTMLElement} element Element to parse\n * @param {Object} [options] Options object\n */\n static async fromElement(\n element: HTMLElement | SVGElement,\n options?: Abortable,\n cssRules?: CSSRules,\n ) {\n const parsedAttributes = parseAttributes(\n element,\n FabricText.ATTRIBUTE_NAMES,\n cssRules,\n );\n\n const {\n textAnchor = LEFT as typeof LEFT | typeof CENTER | typeof RIGHT,\n textDecoration = '',\n dx = 0,\n dy = 0,\n top = 0,\n left = 0,\n fontSize = DEFAULT_SVG_FONT_SIZE,\n strokeWidth = 1,\n ...restOfOptions\n } = { ...options, ...parsedAttributes };\n\n const textContent = (element.textContent || '')\n .replace(/^\\s+|\\s+$|\\n+/g, '')\n .replace(/\\s+/g, ' ');\n\n // this code here is probably the usual issue for SVG center find\n // this can later looked at again and probably removed.\n\n const text = new this(textContent, {\n left: left + dx,\n top: top + dy,\n underline: textDecoration.includes('underline'),\n overline: textDecoration.includes('overline'),\n linethrough: textDecoration.includes('line-through'),\n // we initialize this as 0\n strokeWidth: 0,\n fontSize,\n ...restOfOptions,\n }),\n textHeightScaleFactor = text.getScaledHeight() / text.height,\n lineHeightDiff =\n (text.height + text.strokeWidth) * text.lineHeight - text.height,\n scaledDiff = lineHeightDiff * textHeightScaleFactor,\n textHeight = text.getScaledHeight() + scaledDiff;\n\n let offX = 0;\n /*\n Adjust positioning:\n x/y attributes in SVG correspond to the bottom-left corner of text bounding box\n fabric output by default at top, left.\n */\n if (textAnchor === CENTER) {\n offX = text.getScaledWidth() / 2;\n }\n if (textAnchor === RIGHT) {\n offX = text.getScaledWidth();\n }\n text.set({\n left: text.left - offX,\n top:\n text.top -\n (textHeight - text.fontSize * (0.07 + text._fontSizeFraction)) /\n text.lineHeight,\n strokeWidth,\n });\n return text;\n }\n\n /* _FROM_SVG_END_ */\n\n /**\n * Returns FabricText instance from an object representation\n * @param {Object} object plain js Object to create an instance from\n * @returns {Promise}\n */\n static fromObject<\n T extends TOptions,\n S extends FabricText,\n >(object: T) {\n return this._fromObject(\n {\n ...object,\n styles: stylesFromArray(object.styles || {}, object.text),\n },\n {\n extraParam: 'text',\n },\n );\n }\n}\n\napplyMixins(FabricText, [TextSVGExportMixin]);\nclassRegistry.setClass(FabricText);\nclassRegistry.setSVGClass(FabricText);\n","import type {\n DragEventData,\n DropEventData,\n TPointerEvent,\n} from '../../EventTypeDefs';\nimport { Point } from '../../Point';\nimport type { IText } from './IText';\nimport { setStyle } from '../../util/internals/dom_style';\nimport { cloneStyles } from '../../util/internals/cloneStyles';\nimport type { TextStyleDeclaration } from '../Text/StyledText';\nimport { getDocumentFromElement } from '../../util/dom_misc';\nimport { CHANGED, NONE } from '../../constants';\n\n/**\n * #### Dragging IText/Textbox Lifecycle\n * - {@link start} is called from `mousedown` {@link IText#_mouseDownHandler} and determines if dragging should start by testing {@link isPointerOverSelection}\n * - if true `mousedown` {@link IText#_mouseDownHandler} is blocked to keep selection\n * - if the pointer moves, canvas fires numerous mousemove {@link Canvas#_onMouseMove} that we make sure **aren't** prevented ({@link IText#shouldStartDragging}) in order for the window to start a drag session\n * - once/if the session starts canvas calls {@link onDragStart} on the active object to determine if dragging should occur\n * - canvas fires relevant drag events that are handled by the handlers defined in this scope\n * - {@link end} is called from `mouseup` {@link IText#mouseUpHandler}, blocking IText default click behavior\n * - in case the drag session didn't occur, {@link end} handles a click, since logic to do so was blocked during `mousedown`\n */\nexport class DraggableTextDelegate {\n readonly target: IText;\n private __mouseDownInPlace = false;\n private __dragStartFired = false;\n private __isDraggingOver = false;\n private __dragStartSelection?: {\n selectionStart: number;\n selectionEnd: number;\n };\n private __dragImageDisposer?: VoidFunction;\n private _dispose?: () => void;\n\n constructor(target: IText) {\n this.target = target;\n const disposers = [\n this.target.on('dragenter', this.dragEnterHandler.bind(this)),\n this.target.on('dragover', this.dragOverHandler.bind(this)),\n this.target.on('dragleave', this.dragLeaveHandler.bind(this)),\n this.target.on('dragend', this.dragEndHandler.bind(this)),\n this.target.on('drop', this.dropHandler.bind(this)),\n ];\n this._dispose = () => {\n disposers.forEach((d) => d());\n this._dispose = undefined;\n };\n }\n\n isPointerOverSelection(e: TPointerEvent) {\n const target = this.target;\n const newSelection = target.getSelectionStartFromPointer(e);\n return (\n target.isEditing &&\n newSelection >= target.selectionStart &&\n newSelection <= target.selectionEnd &&\n target.selectionStart < target.selectionEnd\n );\n }\n\n /**\n * @public override this method to disable dragging and default to mousedown logic\n */\n start(e: TPointerEvent) {\n return (this.__mouseDownInPlace = this.isPointerOverSelection(e));\n }\n\n /**\n * @public override this method to disable dragging without discarding selection\n */\n isActive() {\n return this.__mouseDownInPlace;\n }\n\n /**\n * Ends interaction and sets cursor in case of a click\n * @returns true if was active\n */\n end(e: TPointerEvent) {\n const active = this.isActive();\n if (active && !this.__dragStartFired) {\n // mousedown has been blocked since `active` is true => cursor has not been set.\n // `__dragStartFired` is false => dragging didn't occur, pointer didn't move and is over selection.\n // meaning this is actually a click, `active` is a false positive.\n this.target.setCursorByClick(e);\n this.target.initDelayedCursor(true);\n }\n this.__mouseDownInPlace = false;\n this.__dragStartFired = false;\n this.__isDraggingOver = false;\n return active;\n }\n\n getDragStartSelection() {\n return this.__dragStartSelection;\n }\n\n /**\n * Override to customize the drag image\n * https://developer.mozilla.org/en-US/docs/Web/API/DataTransfer/setDragImage\n */\n setDragImage(\n e: DragEvent,\n {\n selectionStart,\n selectionEnd,\n }: {\n selectionStart: number;\n selectionEnd: number;\n },\n ) {\n const target = this.target;\n const canvas = target.canvas!;\n const flipFactor = new Point(target.flipX ? -1 : 1, target.flipY ? -1 : 1);\n const boundaries = target._getCursorBoundaries(selectionStart);\n const selectionPosition = new Point(\n boundaries.left + boundaries.leftOffset,\n boundaries.top + boundaries.topOffset,\n ).multiply(flipFactor);\n const pos = selectionPosition.transform(target.calcTransformMatrix());\n const pointer = canvas.getScenePoint(e);\n const diff = pointer.subtract(pos);\n const retinaScaling = target.getCanvasRetinaScaling();\n const bbox = target.getBoundingRect();\n const correction = pos.subtract(new Point(bbox.left, bbox.top));\n const vpt = canvas.viewportTransform;\n const offset = correction.add(diff).transform(vpt, true);\n // prepare instance for drag image snapshot by making all non selected text invisible\n const bgc = target.backgroundColor;\n const styles = cloneStyles(target.styles);\n target.backgroundColor = '';\n const styleOverride = {\n stroke: 'transparent',\n fill: 'transparent',\n textBackgroundColor: 'transparent',\n };\n target.setSelectionStyles(styleOverride, 0, selectionStart);\n target.setSelectionStyles(styleOverride, selectionEnd, target.text.length);\n target.dirty = true;\n const dragImage = target.toCanvasElement({\n enableRetinaScaling: canvas.enableRetinaScaling,\n viewportTransform: true,\n });\n // restore values\n target.backgroundColor = bgc;\n target.styles = styles;\n target.dirty = true;\n // position drag image offscreen\n setStyle(dragImage, {\n position: 'fixed',\n left: `${-dragImage.width}px`,\n border: NONE,\n width: `${dragImage.width / retinaScaling}px`,\n height: `${dragImage.height / retinaScaling}px`,\n });\n this.__dragImageDisposer && this.__dragImageDisposer();\n this.__dragImageDisposer = () => {\n dragImage.remove();\n };\n getDocumentFromElement(\n (e.target || this.target.hiddenTextarea)! as HTMLElement,\n ).body.appendChild(dragImage);\n e.dataTransfer?.setDragImage(dragImage, offset.x, offset.y);\n }\n\n /**\n * @returns {boolean} determines whether {@link target} should/shouldn't become a drag source\n */\n onDragStart(e: DragEvent): boolean {\n this.__dragStartFired = true;\n const target = this.target;\n const active = this.isActive();\n if (active && e.dataTransfer) {\n const selection = (this.__dragStartSelection = {\n selectionStart: target.selectionStart,\n selectionEnd: target.selectionEnd,\n });\n const value = target._text\n .slice(selection.selectionStart, selection.selectionEnd)\n .join('');\n const data = { text: target.text, value, ...selection };\n e.dataTransfer.setData('text/plain', value);\n e.dataTransfer.setData(\n 'application/fabric',\n JSON.stringify({\n value: value,\n styles: target.getSelectionStyles(\n selection.selectionStart,\n selection.selectionEnd,\n true,\n ),\n }),\n );\n e.dataTransfer.effectAllowed = 'copyMove';\n this.setDragImage(e, data);\n }\n target.abortCursorAnimation();\n return active;\n }\n\n /**\n * use {@link targetCanDrop} to respect overriding\n * @returns {boolean} determines whether {@link target} should/shouldn't become a drop target\n */\n canDrop(e: DragEvent): boolean {\n if (\n this.target.editable &&\n !this.target.getActiveControl() &&\n !e.defaultPrevented\n ) {\n if (this.isActive() && this.__dragStartSelection) {\n // drag source trying to drop over itself\n // allow dropping only outside of drag start selection\n const index = this.target.getSelectionStartFromPointer(e);\n const dragStartSelection = this.__dragStartSelection;\n return (\n index < dragStartSelection.selectionStart ||\n index > dragStartSelection.selectionEnd\n );\n }\n return true;\n }\n return false;\n }\n\n /**\n * in order to respect overriding {@link IText#canDrop} we call that instead of calling {@link canDrop} directly\n */\n protected targetCanDrop(e: DragEvent) {\n return this.target.canDrop(e);\n }\n\n dragEnterHandler({ e }: DragEventData) {\n const canDrop = this.targetCanDrop(e);\n if (!this.__isDraggingOver && canDrop) {\n this.__isDraggingOver = true;\n }\n }\n\n dragOverHandler(ev: DragEventData) {\n const { e } = ev;\n const canDrop = this.targetCanDrop(e);\n if (!this.__isDraggingOver && canDrop) {\n this.__isDraggingOver = true;\n } else if (this.__isDraggingOver && !canDrop) {\n // drop state has changed\n this.__isDraggingOver = false;\n }\n if (this.__isDraggingOver) {\n // can be dropped, inform browser\n e.preventDefault();\n // inform event subscribers\n ev.canDrop = true;\n ev.dropTarget = this.target;\n }\n }\n\n dragLeaveHandler() {\n if (this.__isDraggingOver || this.isActive()) {\n this.__isDraggingOver = false;\n }\n }\n\n /**\n * Override the `text/plain | application/fabric` types of {@link DragEvent#dataTransfer}\n * in order to change the drop value or to customize styling respectively, by listening to the `drop:before` event\n * https://developer.mozilla.org/en-US/docs/Web/API/HTML_Drag_and_Drop_API/Drag_operations#performing_a_drop\n */\n dropHandler(ev: DropEventData) {\n const { e } = ev;\n const didDrop = e.defaultPrevented;\n this.__isDraggingOver = false;\n // inform browser that the drop has been accepted\n e.preventDefault();\n let insert = e.dataTransfer?.getData('text/plain');\n if (insert && !didDrop) {\n const target = this.target;\n const canvas = target.canvas!;\n let insertAt = target.getSelectionStartFromPointer(e);\n const { styles } = (\n e.dataTransfer!.types.includes('application/fabric')\n ? JSON.parse(e.dataTransfer!.getData('application/fabric'))\n : {}\n ) as { styles: TextStyleDeclaration[] };\n const trailing = insert[Math.max(0, insert.length - 1)];\n const selectionStartOffset = 0;\n // drag and drop in same instance\n if (this.__dragStartSelection) {\n const selectionStart = this.__dragStartSelection.selectionStart;\n const selectionEnd = this.__dragStartSelection.selectionEnd;\n if (insertAt > selectionStart && insertAt <= selectionEnd) {\n insertAt = selectionStart;\n } else if (insertAt > selectionEnd) {\n insertAt -= selectionEnd - selectionStart;\n }\n target.removeChars(selectionStart, selectionEnd);\n // prevent `dragend` from handling event\n delete this.__dragStartSelection;\n }\n // remove redundant line break\n if (\n target._reNewline.test(trailing) &&\n (target._reNewline.test(target._text[insertAt]) ||\n insertAt === target._text.length)\n ) {\n insert = insert.trimEnd();\n }\n // inform subscribers\n ev.didDrop = true;\n ev.dropTarget = target;\n // finalize\n target.insertChars(insert, styles, insertAt);\n // can this part be moved in an outside event? andrea to check.\n canvas.setActiveObject(target);\n target.enterEditing(e);\n target.selectionStart = Math.min(\n insertAt + selectionStartOffset,\n target._text.length,\n );\n target.selectionEnd = Math.min(\n target.selectionStart + insert.length,\n target._text.length,\n );\n target.hiddenTextarea!.value = target.text;\n target._updateTextarea();\n target.hiddenTextarea!.focus();\n target.fire(CHANGED, {\n index: insertAt + selectionStartOffset,\n action: 'drop',\n });\n canvas.fire('text:changed', { target });\n canvas.contextTopDirty = true;\n canvas.requestRenderAll();\n }\n }\n\n /**\n * fired only on the drag source after drop (if occurred)\n * handle changes to the drag source in case of a drop on another object or a cancellation\n * https://developer.mozilla.org/en-US/docs/Web/API/HTML_Drag_and_Drop_API/Drag_operations#finishing_a_drag\n */\n dragEndHandler({ e }: DragEventData) {\n if (this.isActive() && this.__dragStartFired) {\n // once the drop event finishes we check if we need to change the drag source\n // if the drag source received the drop we bail out since the drop handler has already handled logic\n if (this.__dragStartSelection) {\n const target = this.target;\n const canvas = this.target.canvas!;\n const { selectionStart, selectionEnd } = this.__dragStartSelection;\n const dropEffect = e.dataTransfer?.dropEffect || NONE;\n if (dropEffect === NONE) {\n // pointer is back over selection\n target.selectionStart = selectionStart;\n target.selectionEnd = selectionEnd;\n target._updateTextarea();\n target.hiddenTextarea!.focus();\n } else {\n target.clearContextTop();\n if (dropEffect === 'move') {\n target.removeChars(selectionStart, selectionEnd);\n target.selectionStart = target.selectionEnd = selectionStart;\n target.hiddenTextarea &&\n (target.hiddenTextarea.value = target.text);\n target._updateTextarea();\n target.fire(CHANGED, {\n index: selectionStart,\n action: 'dragend',\n });\n canvas.fire('text:changed', { target });\n canvas.requestRenderAll();\n }\n target.exitEditing();\n }\n }\n }\n\n this.__dragImageDisposer && this.__dragImageDisposer();\n delete this.__dragImageDisposer;\n delete this.__dragStartSelection;\n this.__isDraggingOver = false;\n }\n\n dispose() {\n this._dispose && this._dispose();\n }\n}\n","import type { ObjectEvents, TPointerEvent } from '../../EventTypeDefs';\nimport { Point } from '../../Point';\nimport type { FabricObject } from '../Object/FabricObject';\nimport { FabricText } from '../Text/Text';\nimport { animate } from '../../util/animation/animate';\nimport type { TOnAnimationChangeCallback } from '../../util/animation/types';\nimport type { ValueAnimation } from '../../util/animation/ValueAnimation';\nimport type { TextStyleDeclaration } from '../Text/StyledText';\nimport type { SerializedTextProps, TextProps } from '../Text/Text';\nimport type { TOptions } from '../../typedefs';\nimport { getDocumentFromElement } from '../../util/dom_misc';\nimport { LEFT, MODIFIED, RIGHT, reNewline } from '../../constants';\nimport type { IText } from './IText';\n\n/**\n * extend this regex to support non english languages\n *\n * - ` ` Matches a SPACE character (char code 32).\n * - `\\n` Matches a LINE FEED character (char code 10).\n * - `\\.` Matches a \".\" character (char code 46).\n * - `,` Matches a \",\" character (char code 44).\n * - `;` Matches a \";\" character (char code 59).\n * - `!` Matches a \"!\" character (char code 33).\n * - `\\?` Matches a \"?\" character (char code 63).\n * - `\\-` Matches a \"-\" character (char code 45).\n */\n// eslint-disable-next-line no-useless-escape\nconst reNonWord = /[ \\n\\.,;!\\?\\-]/;\n\nexport type ITextEvents = ObjectEvents & {\n 'selection:changed': never;\n changed: never | { index: number; action: string };\n 'editing:entered': never | { e: TPointerEvent };\n 'editing:exited': never;\n};\n\nexport abstract class ITextBehavior<\n Props extends TOptions = Partial,\n SProps extends SerializedTextProps = SerializedTextProps,\n EventSpec extends ITextEvents = ITextEvents,\n> extends FabricText {\n declare abstract isEditing: boolean;\n declare abstract cursorDelay: number;\n declare abstract selectionStart: number;\n declare abstract selectionEnd: number;\n declare abstract cursorDuration: number;\n declare abstract editable: boolean;\n declare abstract editingBorderColor: string;\n\n declare abstract compositionStart: number;\n declare abstract compositionEnd: number;\n\n declare abstract hiddenTextarea: HTMLTextAreaElement | null;\n\n /**\n * Helps determining when the text is in composition, so that the cursor\n * rendering is altered.\n */\n declare protected inCompositionMode: boolean;\n\n declare protected _reSpace: RegExp;\n declare private _currentTickState?: ValueAnimation;\n declare private _currentTickCompleteState?: ValueAnimation;\n protected _currentCursorOpacity = 1;\n declare private _textBeforeEdit: string;\n declare protected __selectionStartOnMouseDown: number;\n\n /**\n * Keeps track if the IText object was selected before the actual click.\n * This because we want to delay enter editing by a click.\n */\n declare protected selected: boolean;\n declare protected cursorOffsetCache: { left?: number; top?: number };\n declare protected _savedProps?: {\n hasControls: boolean;\n borderColor: string;\n lockMovementX: boolean;\n lockMovementY: boolean;\n selectable: boolean;\n hoverCursor: CSSStyleDeclaration['cursor'] | null;\n defaultCursor?: CSSStyleDeclaration['cursor'];\n moveCursor?: CSSStyleDeclaration['cursor'];\n };\n declare protected _selectionDirection: 'left' | 'right' | null;\n\n abstract initHiddenTextarea(): void;\n abstract _fireSelectionChanged(): void;\n abstract renderCursorOrSelection(): void;\n abstract getSelectionStartFromPointer(e: TPointerEvent): number;\n abstract _getCursorBoundaries(\n index: number,\n skipCaching?: boolean,\n ): {\n left: number;\n top: number;\n leftOffset: number;\n topOffset: number;\n };\n\n /**\n * Initializes all the interactive behavior of IText\n */\n initBehavior() {\n this._tick = this._tick.bind(this);\n this._onTickComplete = this._onTickComplete.bind(this);\n this.updateSelectionOnMouseMove =\n this.updateSelectionOnMouseMove.bind(this);\n }\n\n onDeselect(options?: { e?: TPointerEvent; object?: FabricObject }) {\n this.isEditing && this.exitEditing();\n this.selected = false;\n return super.onDeselect(options);\n }\n\n /**\n * @private\n */\n _animateCursor({\n toValue,\n duration,\n delay,\n onComplete,\n }: {\n toValue: number;\n duration: number;\n delay?: number;\n onComplete?: TOnAnimationChangeCallback;\n }) {\n return animate({\n startValue: this._currentCursorOpacity,\n endValue: toValue,\n duration,\n delay,\n onComplete,\n abort: () =>\n !this.canvas ||\n // we do not want to animate a selection, only cursor\n this.selectionStart !== this.selectionEnd,\n onChange: (value) => {\n this._currentCursorOpacity = value;\n this.renderCursorOrSelection();\n },\n });\n }\n\n /**\n * changes the cursor from visible to invisible\n */\n private _tick(delay?: number) {\n this._currentTickState = this._animateCursor({\n toValue: 0,\n duration: this.cursorDuration / 2,\n delay: Math.max(delay || 0, 100),\n onComplete: this._onTickComplete,\n });\n }\n\n /**\n * Changes the cursor from invisible to visible\n */\n private _onTickComplete() {\n this._currentTickCompleteState?.abort();\n this._currentTickCompleteState = this._animateCursor({\n toValue: 1,\n duration: this.cursorDuration,\n onComplete: this._tick,\n });\n }\n\n /**\n * Initializes delayed cursor\n */\n initDelayedCursor(restart?: boolean) {\n this.abortCursorAnimation();\n this._tick(restart ? 0 : this.cursorDelay);\n }\n\n /**\n * Aborts cursor animation, clears all timeouts and clear textarea context if necessary\n */\n abortCursorAnimation() {\n let shouldClear = false;\n [this._currentTickState, this._currentTickCompleteState].forEach(\n (cursorAnimation) => {\n if (cursorAnimation && !cursorAnimation.isDone()) {\n shouldClear = true;\n cursorAnimation.abort();\n }\n },\n );\n\n this._currentCursorOpacity = 1;\n\n // make sure we clear context even if instance is not editing\n if (shouldClear) {\n this.clearContextTop();\n }\n }\n\n /**\n * Restart tue cursor animation if either is in complete state ( between animations )\n * or if it never started before\n */\n restartCursorIfNeeded() {\n if (\n [this._currentTickState, this._currentTickCompleteState].some(\n (cursorAnimation) => !cursorAnimation || cursorAnimation.isDone(),\n )\n ) {\n this.initDelayedCursor();\n }\n }\n\n /**\n * Selects entire text\n */\n selectAll() {\n this.selectionStart = 0;\n this.selectionEnd = this._text.length;\n this._fireSelectionChanged();\n this._updateTextarea();\n return this;\n }\n\n /**\n * Selects entire text and updates the visual state\n */\n cmdAll() {\n this.selectAll();\n this.renderCursorOrSelection();\n }\n\n /**\n * Returns selected text\n * @return {String}\n */\n getSelectedText(): string {\n return this._text.slice(this.selectionStart, this.selectionEnd).join('');\n }\n\n /**\n * Find new selection index representing start of current word according to current selection index\n * @param {Number} startFrom Current selection index\n * @return {Number} New selection index\n */\n findWordBoundaryLeft(startFrom: number): number {\n let offset = 0,\n index = startFrom - 1;\n\n // remove space before cursor first\n if (this._reSpace.test(this._text[index])) {\n while (this._reSpace.test(this._text[index])) {\n offset++;\n index--;\n }\n }\n while (/\\S/.test(this._text[index]) && index > -1) {\n offset++;\n index--;\n }\n\n return startFrom - offset;\n }\n\n /**\n * Find new selection index representing end of current word according to current selection index\n * @param {Number} startFrom Current selection index\n * @return {Number} New selection index\n */\n findWordBoundaryRight(startFrom: number): number {\n let offset = 0,\n index = startFrom;\n\n // remove space after cursor first\n if (this._reSpace.test(this._text[index])) {\n while (this._reSpace.test(this._text[index])) {\n offset++;\n index++;\n }\n }\n while (/\\S/.test(this._text[index]) && index < this._text.length) {\n offset++;\n index++;\n }\n\n return startFrom + offset;\n }\n\n /**\n * Find new selection index representing start of current line according to current selection index\n * @param {Number} startFrom Current selection index\n * @return {Number} New selection index\n */\n findLineBoundaryLeft(startFrom: number): number {\n let offset = 0,\n index = startFrom - 1;\n\n while (!/\\n/.test(this._text[index]) && index > -1) {\n offset++;\n index--;\n }\n\n return startFrom - offset;\n }\n\n /**\n * Find new selection index representing end of current line according to current selection index\n * @param {Number} startFrom Current selection index\n * @return {Number} New selection index\n */\n findLineBoundaryRight(startFrom: number): number {\n let offset = 0,\n index = startFrom;\n\n while (!/\\n/.test(this._text[index]) && index < this._text.length) {\n offset++;\n index++;\n }\n\n return startFrom + offset;\n }\n\n /**\n * Finds index corresponding to beginning or end of a word\n * @param {Number} selectionStart Index of a character\n * @param {Number} direction 1 or -1\n * @return {Number} Index of the beginning or end of a word\n */\n searchWordBoundary(selectionStart: number, direction: 1 | -1): number {\n const text = this._text;\n // if we land on a space we move the cursor backwards\n // if we are searching boundary end we move the cursor backwards ONLY if we don't land on a line break\n let index =\n selectionStart > 0 &&\n this._reSpace.test(text[selectionStart]) &&\n (direction === -1 || !reNewline.test(text[selectionStart - 1]))\n ? selectionStart - 1\n : selectionStart,\n _char = text[index];\n while (index > 0 && index < text.length && !reNonWord.test(_char)) {\n index += direction;\n _char = text[index];\n }\n if (direction === -1 && reNonWord.test(_char)) {\n index++;\n }\n return index;\n }\n\n /**\n * Selects the word that contains the char at index selectionStart\n * @param {Number} selectionStart Index of a character\n */\n selectWord(selectionStart?: number) {\n selectionStart = selectionStart ?? this.selectionStart;\n // search backwards\n const newSelectionStart = this.searchWordBoundary(selectionStart, -1),\n // search forward\n newSelectionEnd = Math.max(\n newSelectionStart,\n this.searchWordBoundary(selectionStart, 1),\n );\n\n this.selectionStart = newSelectionStart;\n this.selectionEnd = newSelectionEnd;\n this._fireSelectionChanged();\n this._updateTextarea();\n // remove next major, for now it renders twice :(\n this.renderCursorOrSelection();\n }\n\n /**\n * Selects the line that contains selectionStart\n * @param {Number} selectionStart Index of a character\n */\n selectLine(selectionStart?: number) {\n selectionStart = selectionStart ?? this.selectionStart;\n const newSelectionStart = this.findLineBoundaryLeft(selectionStart),\n newSelectionEnd = this.findLineBoundaryRight(selectionStart);\n\n this.selectionStart = newSelectionStart;\n this.selectionEnd = newSelectionEnd;\n this._fireSelectionChanged();\n this._updateTextarea();\n }\n\n /**\n * Enters editing state\n */\n enterEditing(e?: TPointerEvent) {\n if (this.isEditing || !this.editable) {\n return;\n }\n this.enterEditingImpl();\n this.fire('editing:entered', e ? { e } : undefined);\n this._fireSelectionChanged();\n if (this.canvas) {\n this.canvas.fire('text:editing:entered', {\n target: this as unknown as IText,\n e,\n });\n this.canvas.requestRenderAll();\n }\n }\n\n /**\n * runs the actual logic that enter from editing state, see {@link enterEditing}\n */\n enterEditingImpl() {\n if (this.canvas) {\n this.canvas.calcOffset();\n this.canvas.textEditingManager.exitTextEditing();\n }\n\n this.isEditing = true;\n\n this.initHiddenTextarea();\n this.hiddenTextarea!.focus();\n this.hiddenTextarea!.value = this.text;\n this._updateTextarea();\n this._saveEditingProps();\n this._setEditingProps();\n this._textBeforeEdit = this.text;\n\n this._tick();\n }\n\n /**\n * called by {@link Canvas#textEditingManager}\n */\n updateSelectionOnMouseMove(e: TPointerEvent) {\n if (this.getActiveControl()) {\n return;\n }\n\n const el = this.hiddenTextarea!;\n // regain focus\n getDocumentFromElement(el).activeElement !== el && el.focus();\n\n const newSelectionStart = this.getSelectionStartFromPointer(e),\n currentStart = this.selectionStart,\n currentEnd = this.selectionEnd;\n if (\n (newSelectionStart !== this.__selectionStartOnMouseDown ||\n currentStart === currentEnd) &&\n (currentStart === newSelectionStart || currentEnd === newSelectionStart)\n ) {\n return;\n }\n if (newSelectionStart > this.__selectionStartOnMouseDown) {\n this.selectionStart = this.__selectionStartOnMouseDown;\n this.selectionEnd = newSelectionStart;\n } else {\n this.selectionStart = newSelectionStart;\n this.selectionEnd = this.__selectionStartOnMouseDown;\n }\n if (\n this.selectionStart !== currentStart ||\n this.selectionEnd !== currentEnd\n ) {\n this._fireSelectionChanged();\n this._updateTextarea();\n this.renderCursorOrSelection();\n }\n }\n\n /**\n * @private\n */\n _setEditingProps() {\n this.hoverCursor = 'text';\n\n if (this.canvas) {\n this.canvas.defaultCursor = this.canvas.moveCursor = 'text';\n }\n\n this.borderColor = this.editingBorderColor;\n this.hasControls = this.selectable = false;\n this.lockMovementX = this.lockMovementY = true;\n }\n\n /**\n * convert from textarea to grapheme indexes\n */\n fromStringToGraphemeSelection(start: number, end: number, text: string) {\n const smallerTextStart = text.slice(0, start),\n graphemeStart = this.graphemeSplit(smallerTextStart).length;\n if (start === end) {\n return { selectionStart: graphemeStart, selectionEnd: graphemeStart };\n }\n const smallerTextEnd = text.slice(start, end),\n graphemeEnd = this.graphemeSplit(smallerTextEnd).length;\n return {\n selectionStart: graphemeStart,\n selectionEnd: graphemeStart + graphemeEnd,\n };\n }\n\n /**\n * convert from fabric to textarea values\n */\n fromGraphemeToStringSelection(\n start: number,\n end: number,\n graphemes: string[],\n ) {\n const smallerTextStart = graphemes.slice(0, start),\n graphemeStart = smallerTextStart.join('').length;\n if (start === end) {\n return { selectionStart: graphemeStart, selectionEnd: graphemeStart };\n }\n const smallerTextEnd = graphemes.slice(start, end),\n graphemeEnd = smallerTextEnd.join('').length;\n return {\n selectionStart: graphemeStart,\n selectionEnd: graphemeStart + graphemeEnd,\n };\n }\n\n /**\n * @private\n */\n _updateTextarea() {\n this.cursorOffsetCache = {};\n if (!this.hiddenTextarea) {\n return;\n }\n if (!this.inCompositionMode) {\n const newSelection = this.fromGraphemeToStringSelection(\n this.selectionStart,\n this.selectionEnd,\n this._text,\n );\n this.hiddenTextarea.selectionStart = newSelection.selectionStart;\n this.hiddenTextarea.selectionEnd = newSelection.selectionEnd;\n }\n this.updateTextareaPosition();\n }\n\n /**\n * @private\n */\n updateFromTextArea() {\n if (!this.hiddenTextarea) {\n return;\n }\n this.cursorOffsetCache = {};\n const textarea = this.hiddenTextarea;\n this.text = textarea.value;\n this.set('dirty', true);\n this.initDimensions();\n this.setCoords();\n const newSelection = this.fromStringToGraphemeSelection(\n textarea.selectionStart,\n textarea.selectionEnd,\n textarea.value,\n );\n this.selectionEnd = this.selectionStart = newSelection.selectionEnd;\n if (!this.inCompositionMode) {\n this.selectionStart = newSelection.selectionStart;\n }\n this.updateTextareaPosition();\n }\n\n /**\n * @private\n */\n updateTextareaPosition() {\n if (this.selectionStart === this.selectionEnd) {\n const style = this._calcTextareaPosition();\n this.hiddenTextarea!.style.left = style.left;\n this.hiddenTextarea!.style.top = style.top;\n }\n }\n\n /**\n * @private\n * @return {Object} style contains style for hiddenTextarea\n */\n _calcTextareaPosition() {\n if (!this.canvas) {\n return { left: '1px', top: '1px' };\n }\n const desiredPosition = this.inCompositionMode\n ? this.compositionStart\n : this.selectionStart,\n boundaries = this._getCursorBoundaries(desiredPosition),\n cursorLocation = this.get2DCursorLocation(desiredPosition),\n lineIndex = cursorLocation.lineIndex,\n charIndex = cursorLocation.charIndex,\n charHeight =\n this.getValueOfPropertyAt(lineIndex, charIndex, 'fontSize') *\n this.lineHeight,\n leftOffset = boundaries.leftOffset,\n retinaScaling = this.getCanvasRetinaScaling(),\n upperCanvas = this.canvas.upperCanvasEl,\n upperCanvasWidth = upperCanvas.width / retinaScaling,\n upperCanvasHeight = upperCanvas.height / retinaScaling,\n maxWidth = upperCanvasWidth - charHeight,\n maxHeight = upperCanvasHeight - charHeight;\n\n const p = new Point(\n boundaries.left + leftOffset,\n boundaries.top + boundaries.topOffset + charHeight,\n )\n .transform(this.calcTransformMatrix())\n .transform(this.canvas.viewportTransform)\n .multiply(\n new Point(\n upperCanvas.clientWidth / upperCanvasWidth,\n upperCanvas.clientHeight / upperCanvasHeight,\n ),\n );\n\n if (p.x < 0) {\n p.x = 0;\n }\n if (p.x > maxWidth) {\n p.x = maxWidth;\n }\n if (p.y < 0) {\n p.y = 0;\n }\n if (p.y > maxHeight) {\n p.y = maxHeight;\n }\n\n // add canvas offset on document\n p.x += this.canvas._offset.left;\n p.y += this.canvas._offset.top;\n\n return {\n left: `${p.x}px`,\n top: `${p.y}px`,\n fontSize: `${charHeight}px`,\n charHeight: charHeight,\n };\n }\n\n /**\n * @private\n */\n _saveEditingProps() {\n this._savedProps = {\n hasControls: this.hasControls,\n borderColor: this.borderColor,\n lockMovementX: this.lockMovementX,\n lockMovementY: this.lockMovementY,\n hoverCursor: this.hoverCursor,\n selectable: this.selectable,\n defaultCursor: this.canvas && this.canvas.defaultCursor,\n moveCursor: this.canvas && this.canvas.moveCursor,\n };\n }\n\n /**\n * @private\n */\n _restoreEditingProps() {\n if (!this._savedProps) {\n return;\n }\n\n this.hoverCursor = this._savedProps.hoverCursor;\n this.hasControls = this._savedProps.hasControls;\n this.borderColor = this._savedProps.borderColor;\n this.selectable = this._savedProps.selectable;\n this.lockMovementX = this._savedProps.lockMovementX;\n this.lockMovementY = this._savedProps.lockMovementY;\n\n if (this.canvas) {\n this.canvas.defaultCursor =\n this._savedProps.defaultCursor || this.canvas.defaultCursor;\n this.canvas.moveCursor =\n this._savedProps.moveCursor || this.canvas.moveCursor;\n }\n\n delete this._savedProps;\n }\n\n /**\n * runs the actual logic that exits from editing state, see {@link exitEditing}\n * But it does not fire events\n */\n exitEditingImpl() {\n const hiddenTextarea = this.hiddenTextarea;\n this.selected = false;\n this.isEditing = false;\n\n if (hiddenTextarea) {\n hiddenTextarea.blur && hiddenTextarea.blur();\n hiddenTextarea.parentNode &&\n hiddenTextarea.parentNode.removeChild(hiddenTextarea);\n }\n this.hiddenTextarea = null;\n this.abortCursorAnimation();\n this.selectionStart !== this.selectionEnd && this.clearContextTop();\n this.selectionEnd = this.selectionStart;\n this._restoreEditingProps();\n if (this._forceClearCache) {\n this.initDimensions();\n this.setCoords();\n }\n }\n\n /**\n * Exits from editing state and fires relevant events\n */\n exitEditing() {\n const isTextChanged = this._textBeforeEdit !== this.text;\n this.exitEditingImpl();\n\n this.fire('editing:exited');\n isTextChanged && this.fire(MODIFIED);\n if (this.canvas) {\n this.canvas.fire('text:editing:exited', {\n target: this as unknown as IText,\n });\n // todo: evaluate add an action to this event\n isTextChanged && this.canvas.fire('object:modified', { target: this });\n }\n return this;\n }\n\n /**\n * @private\n */\n _removeExtraneousStyles() {\n for (const prop in this.styles) {\n if (!this._textLines[prop as unknown as number]) {\n delete this.styles[prop];\n }\n }\n }\n\n /**\n * remove and reflow a style block from start to end.\n * @param {Number} start linear start position for removal (included in removal)\n * @param {Number} end linear end position for removal ( excluded from removal )\n */\n removeStyleFromTo(start: number, end: number) {\n const { lineIndex: lineStart, charIndex: charStart } =\n this.get2DCursorLocation(start, true),\n { lineIndex: lineEnd, charIndex: charEnd } = this.get2DCursorLocation(\n end,\n true,\n );\n if (lineStart !== lineEnd) {\n // step1 remove the trailing of lineStart\n if (this.styles[lineStart]) {\n for (\n let i = charStart;\n i < this._unwrappedTextLines[lineStart].length;\n i++\n ) {\n delete this.styles[lineStart][i];\n }\n }\n // step2 move the trailing of lineEnd to lineStart if needed\n if (this.styles[lineEnd]) {\n for (\n let i = charEnd;\n i < this._unwrappedTextLines[lineEnd].length;\n i++\n ) {\n const styleObj = this.styles[lineEnd][i];\n if (styleObj) {\n this.styles[lineStart] || (this.styles[lineStart] = {});\n this.styles[lineStart][charStart + i - charEnd] = styleObj;\n }\n }\n }\n // step3 detects lines will be completely removed.\n for (let i = lineStart + 1; i <= lineEnd; i++) {\n delete this.styles[i];\n }\n // step4 shift remaining lines.\n this.shiftLineStyles(lineEnd, lineStart - lineEnd);\n } else {\n // remove and shift left on the same line\n if (this.styles[lineStart]) {\n const styleObj = this.styles[lineStart];\n const diff = charEnd - charStart;\n for (let i = charStart; i < charEnd; i++) {\n delete styleObj[i];\n }\n for (const char in this.styles[lineStart]) {\n const numericChar = parseInt(char, 10);\n if (numericChar >= charEnd) {\n styleObj[numericChar - diff] = styleObj[char];\n delete styleObj[char];\n }\n }\n }\n }\n }\n\n /**\n * Shifts line styles up or down\n * @param {Number} lineIndex Index of a line\n * @param {Number} offset Can any number?\n */\n shiftLineStyles(lineIndex: number, offset: number) {\n const clonedStyles = Object.assign({}, this.styles);\n for (const line in this.styles) {\n const numericLine = parseInt(line, 10);\n if (numericLine > lineIndex) {\n this.styles[numericLine + offset] = clonedStyles[numericLine];\n if (!clonedStyles[numericLine - offset]) {\n delete this.styles[numericLine];\n }\n }\n }\n }\n\n /**\n * Handle insertion of more consecutive style lines for when one or more\n * newlines gets added to the text. Since current style needs to be shifted\n * first we shift the current style of the number lines needed, then we add\n * new lines from the last to the first.\n * @param {Number} lineIndex Index of a line\n * @param {Number} charIndex Index of a char\n * @param {Number} qty number of lines to add\n * @param {Array} copiedStyle Array of objects styles\n */\n insertNewlineStyleObject(\n lineIndex: number,\n charIndex: number,\n qty: number,\n copiedStyle?: { [index: number]: TextStyleDeclaration },\n ) {\n const newLineStyles: { [index: number]: TextStyleDeclaration } = {};\n const originalLineLength = this._unwrappedTextLines[lineIndex].length;\n const isEndOfLine = originalLineLength === charIndex;\n\n let someStyleIsCarryingOver = false;\n qty || (qty = 1);\n this.shiftLineStyles(lineIndex, qty);\n const currentCharStyle = this.styles[lineIndex]\n ? this.styles[lineIndex][charIndex === 0 ? charIndex : charIndex - 1]\n : undefined;\n\n // we clone styles of all chars\n // after cursor onto the current line\n for (const index in this.styles[lineIndex]) {\n const numIndex = parseInt(index, 10);\n if (numIndex >= charIndex) {\n someStyleIsCarryingOver = true;\n newLineStyles[numIndex - charIndex] = this.styles[lineIndex][index];\n // remove lines from the previous line since they're on a new line now\n if (!(isEndOfLine && charIndex === 0)) {\n delete this.styles[lineIndex][index];\n }\n }\n }\n let styleCarriedOver = false;\n if (someStyleIsCarryingOver && !isEndOfLine) {\n // if is end of line, the extra style we copied\n // is probably not something we want\n this.styles[lineIndex + qty] = newLineStyles;\n styleCarriedOver = true;\n }\n if (styleCarriedOver || originalLineLength > charIndex) {\n // skip the last line of since we already prepared it.\n // or contains text without style that we don't want to style\n // just because it changed lines\n qty--;\n }\n // for the all the lines or all the other lines\n // we clone current char style onto the next (otherwise empty) line\n while (qty > 0) {\n if (copiedStyle && copiedStyle[qty - 1]) {\n this.styles[lineIndex + qty] = {\n 0: { ...copiedStyle[qty - 1] },\n };\n } else if (currentCharStyle) {\n this.styles[lineIndex + qty] = {\n 0: { ...currentCharStyle },\n };\n } else {\n delete this.styles[lineIndex + qty];\n }\n qty--;\n }\n this._forceClearCache = true;\n }\n\n /**\n * Inserts style object for a given line/char index\n * @param {Number} lineIndex Index of a line\n * @param {Number} charIndex Index of a char\n * @param {Number} quantity number Style object to insert, if given\n * @param {Array} copiedStyle array of style objects\n */\n insertCharStyleObject(\n lineIndex: number,\n charIndex: number,\n quantity: number,\n copiedStyle?: TextStyleDeclaration[],\n ) {\n if (!this.styles) {\n this.styles = {};\n }\n const currentLineStyles = this.styles[lineIndex],\n currentLineStylesCloned = currentLineStyles\n ? { ...currentLineStyles }\n : {};\n\n quantity || (quantity = 1);\n // shift all char styles by quantity forward\n // 0,1,2,3 -> (charIndex=2) -> 0,1,3,4 -> (insert 2) -> 0,1,2,3,4\n for (const index in currentLineStylesCloned) {\n const numericIndex = parseInt(index, 10);\n if (numericIndex >= charIndex) {\n currentLineStyles[numericIndex + quantity] =\n currentLineStylesCloned[numericIndex];\n // only delete the style if there was nothing moved there\n if (!currentLineStylesCloned[numericIndex - quantity]) {\n delete currentLineStyles[numericIndex];\n }\n }\n }\n this._forceClearCache = true;\n if (copiedStyle) {\n while (quantity--) {\n if (!Object.keys(copiedStyle[quantity]).length) {\n continue;\n }\n if (!this.styles[lineIndex]) {\n this.styles[lineIndex] = {};\n }\n this.styles[lineIndex][charIndex + quantity] = {\n ...copiedStyle[quantity],\n };\n }\n return;\n }\n if (!currentLineStyles) {\n return;\n }\n const newStyle = currentLineStyles[charIndex ? charIndex - 1 : 1];\n while (newStyle && quantity--) {\n this.styles[lineIndex][charIndex + quantity] = { ...newStyle };\n }\n }\n\n /**\n * Inserts style object(s)\n * @param {Array} insertedText Characters at the location where style is inserted\n * @param {Number} start cursor index for inserting style\n * @param {Array} [copiedStyle] array of style objects to insert.\n */\n insertNewStyleBlock(\n insertedText: string[],\n start: number,\n copiedStyle?: TextStyleDeclaration[],\n ) {\n const cursorLoc = this.get2DCursorLocation(start, true),\n addedLines = [0];\n let linesLength = 0;\n // get an array of how many char per lines are being added.\n for (let i = 0; i < insertedText.length; i++) {\n if (insertedText[i] === '\\n') {\n linesLength++;\n addedLines[linesLength] = 0;\n } else {\n addedLines[linesLength]++;\n }\n }\n // for the first line copy the style from the current char position.\n if (addedLines[0] > 0) {\n this.insertCharStyleObject(\n cursorLoc.lineIndex,\n cursorLoc.charIndex,\n addedLines[0],\n copiedStyle,\n );\n copiedStyle = copiedStyle && copiedStyle.slice(addedLines[0] + 1);\n }\n linesLength &&\n this.insertNewlineStyleObject(\n cursorLoc.lineIndex,\n cursorLoc.charIndex + addedLines[0],\n linesLength,\n );\n let i;\n for (i = 1; i < linesLength; i++) {\n if (addedLines[i] > 0) {\n this.insertCharStyleObject(\n cursorLoc.lineIndex + i,\n 0,\n addedLines[i],\n copiedStyle,\n );\n } else if (copiedStyle) {\n // this test is required in order to close #6841\n // when a pasted buffer begins with a newline then\n // this.styles[cursorLoc.lineIndex + i] and copiedStyle[0]\n // may be undefined for some reason\n if (this.styles[cursorLoc.lineIndex + i] && copiedStyle[0]) {\n this.styles[cursorLoc.lineIndex + i][0] = copiedStyle[0];\n }\n }\n copiedStyle = copiedStyle && copiedStyle.slice(addedLines[i] + 1);\n }\n if (addedLines[i] > 0) {\n this.insertCharStyleObject(\n cursorLoc.lineIndex + i,\n 0,\n addedLines[i],\n copiedStyle,\n );\n }\n }\n\n /**\n * Removes characters from start/end\n * start/end ar per grapheme position in _text array.\n *\n * @param {Number} start\n * @param {Number} end default to start + 1\n */\n removeChars(start: number, end: number = start + 1) {\n this.removeStyleFromTo(start, end);\n this._text.splice(start, end - start);\n this.text = this._text.join('');\n this.set('dirty', true);\n this.initDimensions();\n this.setCoords();\n this._removeExtraneousStyles();\n }\n\n /**\n * insert characters at start position, before start position.\n * start equal 1 it means the text get inserted between actual grapheme 0 and 1\n * if style array is provided, it must be as the same length of text in graphemes\n * if end is provided and is bigger than start, old text is replaced.\n * start/end ar per grapheme position in _text array.\n *\n * @param {String} text text to insert\n * @param {Array} style array of style objects\n * @param {Number} start\n * @param {Number} end default to start + 1\n */\n insertChars(\n text: string,\n style: TextStyleDeclaration[] | undefined,\n start: number,\n end: number = start,\n ) {\n if (end > start) {\n this.removeStyleFromTo(start, end);\n }\n const graphemes = this.graphemeSplit(text);\n this.insertNewStyleBlock(graphemes, start, style);\n this._text = [\n ...this._text.slice(0, start),\n ...graphemes,\n ...this._text.slice(end),\n ];\n this.text = this._text.join('');\n this.set('dirty', true);\n this.initDimensions();\n this.setCoords();\n this._removeExtraneousStyles();\n }\n\n /**\n * Set the selectionStart and selectionEnd according to the new position of cursor\n * mimic the key - mouse navigation when shift is pressed.\n */\n setSelectionStartEndWithShift(\n start: number,\n end: number,\n newSelection: number,\n ) {\n if (newSelection <= start) {\n if (end === start) {\n this._selectionDirection = LEFT;\n } else if (this._selectionDirection === RIGHT) {\n this._selectionDirection = LEFT;\n this.selectionEnd = start;\n }\n this.selectionStart = newSelection;\n } else if (newSelection > start && newSelection < end) {\n if (this._selectionDirection === RIGHT) {\n this.selectionEnd = newSelection;\n } else {\n this.selectionStart = newSelection;\n }\n } else {\n // newSelection is > selection start and end\n if (end === start) {\n this._selectionDirection = RIGHT;\n } else if (this._selectionDirection === LEFT) {\n this._selectionDirection = RIGHT;\n this.selectionStart = end;\n }\n this.selectionEnd = newSelection;\n }\n }\n}\n","import { config } from '../../config';\nimport { getFabricDocument, getEnv } from '../../env';\nimport { capValue } from '../../util/misc/capValue';\nimport type { ITextEvents } from './ITextBehavior';\nimport { ITextBehavior } from './ITextBehavior';\nimport type { TKeyMapIText } from './constants';\nimport type { TOptions } from '../../typedefs';\nimport type { TextProps, SerializedTextProps } from '../Text/Text';\nimport { getDocumentFromElement } from '../../util/dom_misc';\nimport { CHANGED, LEFT, RIGHT } from '../../constants';\nimport type { IText } from './IText';\nimport type { TextStyleDeclaration } from '../Text/StyledText';\n\nexport abstract class ITextKeyBehavior<\n Props extends TOptions = Partial,\n SProps extends SerializedTextProps = SerializedTextProps,\n EventSpec extends ITextEvents = ITextEvents,\n> extends ITextBehavior {\n /**\n * For functionalities on keyDown\n * Map a special key to a function of the instance/prototype\n * If you need different behavior for ESC or TAB or arrows, you have to change\n * this map setting the name of a function that you build on the IText or\n * your prototype.\n * the map change will affect all Instances unless you need for only some text Instances\n * in that case you have to clone this object and assign your Instance.\n * this.keysMap = Object.assign({}, this.keysMap);\n * The function must be in IText.prototype.myFunction And will receive event as args[0]\n */\n declare keysMap: TKeyMapIText;\n\n declare keysMapRtl: TKeyMapIText;\n\n /**\n * For functionalities on keyUp + ctrl || cmd\n */\n declare ctrlKeysMapUp: TKeyMapIText;\n\n /**\n * For functionalities on keyDown + ctrl || cmd\n */\n declare ctrlKeysMapDown: TKeyMapIText;\n\n declare hiddenTextarea: HTMLTextAreaElement | null;\n\n /**\n * DOM container to append the hiddenTextarea.\n * An alternative to attaching to the document.body.\n * Useful to reduce laggish redraw of the full document.body tree and\n * also with modals event capturing that won't let the textarea take focus.\n * @type HTMLElement\n */\n declare hiddenTextareaContainer?: HTMLElement | null;\n\n declare private _clickHandlerInitialized: boolean;\n declare private _copyDone: boolean;\n declare private fromPaste: boolean;\n\n /**\n * Initializes hidden textarea (needed to bring up keyboard in iOS)\n */\n initHiddenTextarea() {\n const doc =\n (this.canvas && getDocumentFromElement(this.canvas.getElement())) ||\n getFabricDocument();\n const textarea = doc.createElement('textarea');\n Object.entries({\n autocapitalize: 'off',\n autocorrect: 'off',\n autocomplete: 'off',\n spellcheck: 'false',\n 'data-fabric': 'textarea',\n wrap: 'off',\n }).map(([attribute, value]) => textarea.setAttribute(attribute, value));\n const { top, left, fontSize } = this._calcTextareaPosition();\n // line-height: 1px; was removed from the style to fix this:\n // https://bugs.chromium.org/p/chromium/issues/detail?id=870966\n textarea.style.cssText = `position: absolute; top: ${top}; left: ${left}; z-index: -999; opacity: 0; width: 1px; height: 1px; font-size: 1px; padding-top: ${fontSize};`;\n\n (this.hiddenTextareaContainer || doc.body).appendChild(textarea);\n\n Object.entries({\n blur: 'blur',\n keydown: 'onKeyDown',\n keyup: 'onKeyUp',\n input: 'onInput',\n copy: 'copy',\n cut: 'copy',\n paste: 'paste',\n compositionstart: 'onCompositionStart',\n compositionupdate: 'onCompositionUpdate',\n compositionend: 'onCompositionEnd',\n } as Record).map(([eventName, handler]) =>\n textarea.addEventListener(\n eventName,\n (this[handler] as EventListener).bind(this),\n ),\n );\n this.hiddenTextarea = textarea;\n }\n\n /**\n * Override this method to customize cursor behavior on textbox blur\n */\n blur() {\n this.abortCursorAnimation();\n }\n\n /**\n * Handles keydown event\n * only used for arrows and combination of modifier keys.\n * @param {KeyboardEvent} e Event object\n */\n onKeyDown(e: KeyboardEvent) {\n if (!this.isEditing) {\n return;\n }\n const keyMap = this.direction === 'rtl' ? this.keysMapRtl : this.keysMap;\n if (e.keyCode in keyMap) {\n (this[keyMap[e.keyCode] as keyof this] as (arg: KeyboardEvent) => void)(\n e,\n );\n } else if (e.keyCode in this.ctrlKeysMapDown && (e.ctrlKey || e.metaKey)) {\n (\n this[this.ctrlKeysMapDown[e.keyCode] as keyof this] as (\n arg: KeyboardEvent,\n ) => void\n )(e);\n } else {\n return;\n }\n e.stopImmediatePropagation();\n e.preventDefault();\n if (e.keyCode >= 33 && e.keyCode <= 40) {\n // if i press an arrow key just update selection\n this.inCompositionMode = false;\n this.clearContextTop();\n this.renderCursorOrSelection();\n } else {\n this.canvas && this.canvas.requestRenderAll();\n }\n }\n\n /**\n * Handles keyup event\n * We handle KeyUp because ie11 and edge have difficulties copy/pasting\n * if a copy/cut event fired, keyup is dismissed\n * @param {KeyboardEvent} e Event object\n */\n onKeyUp(e: KeyboardEvent) {\n if (!this.isEditing || this._copyDone || this.inCompositionMode) {\n this._copyDone = false;\n return;\n }\n if (e.keyCode in this.ctrlKeysMapUp && (e.ctrlKey || e.metaKey)) {\n (\n this[this.ctrlKeysMapUp[e.keyCode] as keyof this] as (\n arg: KeyboardEvent,\n ) => void\n )(e);\n } else {\n return;\n }\n e.stopImmediatePropagation();\n e.preventDefault();\n this.canvas && this.canvas.requestRenderAll();\n }\n\n /**\n * Handles onInput event\n * @param {Event} e Event object\n */\n onInput(this: this & { hiddenTextarea: HTMLTextAreaElement }, e: Event) {\n const fromPaste = this.fromPaste;\n const { value, selectionStart, selectionEnd } = this.hiddenTextarea;\n this.fromPaste = false;\n e && e.stopPropagation();\n if (!this.isEditing) {\n return;\n }\n const updateAndFire = () => {\n this.updateFromTextArea();\n this.fire(CHANGED);\n if (this.canvas) {\n this.canvas.fire('text:changed', { target: this as unknown as IText });\n this.canvas.requestRenderAll();\n }\n };\n if (this.hiddenTextarea.value === '') {\n this.styles = {};\n updateAndFire();\n return;\n }\n // decisions about style changes.\n const nextText = this._splitTextIntoLines(value).graphemeText,\n charCount = this._text.length,\n nextCharCount = nextText.length,\n _selectionStart = this.selectionStart,\n _selectionEnd = this.selectionEnd,\n selection = _selectionStart !== _selectionEnd;\n let copiedStyle: TextStyleDeclaration[] | undefined,\n removedText,\n charDiff = nextCharCount - charCount,\n removeFrom,\n removeTo;\n\n const textareaSelection = this.fromStringToGraphemeSelection(\n selectionStart,\n selectionEnd,\n value,\n );\n const backDelete = _selectionStart > textareaSelection.selectionStart;\n\n if (selection) {\n removedText = this._text.slice(_selectionStart, _selectionEnd);\n charDiff += _selectionEnd - _selectionStart;\n } else if (nextCharCount < charCount) {\n if (backDelete) {\n removedText = this._text.slice(_selectionEnd + charDiff, _selectionEnd);\n } else {\n removedText = this._text.slice(\n _selectionStart,\n _selectionStart - charDiff,\n );\n }\n }\n const insertedText = nextText.slice(\n textareaSelection.selectionEnd - charDiff,\n textareaSelection.selectionEnd,\n );\n if (removedText && removedText.length) {\n if (insertedText.length) {\n // let's copy some style before deleting.\n // we want to copy the style before the cursor OR the style at the cursor if selection\n // is bigger than 0.\n copiedStyle = this.getSelectionStyles(\n _selectionStart,\n _selectionStart + 1,\n false,\n );\n // now duplicate the style one for each inserted text.\n copiedStyle = insertedText.map(\n () =>\n // this return an array of references, but that is fine since we are\n // copying the style later.\n copiedStyle![0],\n );\n }\n if (selection) {\n removeFrom = _selectionStart;\n removeTo = _selectionEnd;\n } else if (backDelete) {\n // detect differences between forwardDelete and backDelete\n removeFrom = _selectionEnd - removedText.length;\n removeTo = _selectionEnd;\n } else {\n removeFrom = _selectionEnd;\n removeTo = _selectionEnd + removedText.length;\n }\n this.removeStyleFromTo(removeFrom, removeTo);\n }\n if (insertedText.length) {\n const { copyPasteData } = getEnv();\n if (\n fromPaste &&\n insertedText.join('') === copyPasteData.copiedText &&\n !config.disableStyleCopyPaste\n ) {\n copiedStyle = copyPasteData.copiedTextStyle;\n }\n this.insertNewStyleBlock(insertedText, _selectionStart, copiedStyle);\n }\n updateAndFire();\n }\n\n /**\n * Composition start\n */\n onCompositionStart() {\n this.inCompositionMode = true;\n }\n\n /**\n * Composition end\n */\n onCompositionEnd() {\n this.inCompositionMode = false;\n }\n\n onCompositionUpdate({ target }: CompositionEvent) {\n const { selectionStart, selectionEnd } = target as HTMLTextAreaElement;\n this.compositionStart = selectionStart;\n this.compositionEnd = selectionEnd;\n this.updateTextareaPosition();\n }\n\n /**\n * Copies selected text\n */\n copy() {\n if (this.selectionStart === this.selectionEnd) {\n //do not cut-copy if no selection\n return;\n }\n const { copyPasteData } = getEnv();\n copyPasteData.copiedText = this.getSelectedText();\n if (!config.disableStyleCopyPaste) {\n copyPasteData.copiedTextStyle = this.getSelectionStyles(\n this.selectionStart,\n this.selectionEnd,\n true,\n );\n } else {\n copyPasteData.copiedTextStyle = undefined;\n }\n this._copyDone = true;\n }\n\n /**\n * Pastes text\n */\n paste() {\n this.fromPaste = true;\n }\n\n /**\n * Finds the width in pixels before the cursor on the same line\n * @private\n * @param {Number} lineIndex\n * @param {Number} charIndex\n * @return {Number} widthBeforeCursor width before cursor\n */\n _getWidthBeforeCursor(lineIndex: number, charIndex: number): number {\n let widthBeforeCursor = this._getLineLeftOffset(lineIndex),\n bound;\n\n if (charIndex > 0) {\n bound = this.__charBounds[lineIndex][charIndex - 1];\n widthBeforeCursor += bound.left + bound.width;\n }\n return widthBeforeCursor;\n }\n\n /**\n * Gets start offset of a selection\n * @param {KeyboardEvent} e Event object\n * @param {Boolean} isRight\n * @return {Number}\n */\n getDownCursorOffset(e: KeyboardEvent, isRight: boolean): number {\n const selectionProp = this._getSelectionForOffset(e, isRight),\n cursorLocation = this.get2DCursorLocation(selectionProp),\n lineIndex = cursorLocation.lineIndex;\n // if on last line, down cursor goes to end of line\n if (\n lineIndex === this._textLines.length - 1 ||\n e.metaKey ||\n e.keyCode === 34\n ) {\n // move to the end of a text\n return this._text.length - selectionProp;\n }\n const charIndex = cursorLocation.charIndex,\n widthBeforeCursor = this._getWidthBeforeCursor(lineIndex, charIndex),\n indexOnOtherLine = this._getIndexOnLine(lineIndex + 1, widthBeforeCursor),\n textAfterCursor = this._textLines[lineIndex].slice(charIndex);\n return (\n textAfterCursor.length +\n indexOnOtherLine +\n 1 +\n this.missingNewlineOffset(lineIndex)\n );\n }\n\n /**\n * private\n * Helps finding if the offset should be counted from Start or End\n * @param {KeyboardEvent} e Event object\n * @param {Boolean} isRight\n * @return {Number}\n */\n _getSelectionForOffset(e: KeyboardEvent, isRight: boolean): number {\n if (e.shiftKey && this.selectionStart !== this.selectionEnd && isRight) {\n return this.selectionEnd;\n } else {\n return this.selectionStart;\n }\n }\n\n /**\n * @param {KeyboardEvent} e Event object\n * @param {Boolean} isRight\n * @return {Number}\n */\n getUpCursorOffset(e: KeyboardEvent, isRight: boolean): number {\n const selectionProp = this._getSelectionForOffset(e, isRight),\n cursorLocation = this.get2DCursorLocation(selectionProp),\n lineIndex = cursorLocation.lineIndex;\n if (lineIndex === 0 || e.metaKey || e.keyCode === 33) {\n // if on first line, up cursor goes to start of line\n return -selectionProp;\n }\n const charIndex = cursorLocation.charIndex,\n widthBeforeCursor = this._getWidthBeforeCursor(lineIndex, charIndex),\n indexOnOtherLine = this._getIndexOnLine(lineIndex - 1, widthBeforeCursor),\n textBeforeCursor = this._textLines[lineIndex].slice(0, charIndex),\n missingNewlineOffset = this.missingNewlineOffset(lineIndex - 1);\n // return a negative offset\n return (\n -this._textLines[lineIndex - 1].length +\n indexOnOtherLine -\n textBeforeCursor.length +\n (1 - missingNewlineOffset)\n );\n }\n\n /**\n * for a given width it founds the matching character.\n * @private\n */\n _getIndexOnLine(lineIndex: number, width: number) {\n const line = this._textLines[lineIndex],\n lineLeftOffset = this._getLineLeftOffset(lineIndex);\n let widthOfCharsOnLine = lineLeftOffset,\n indexOnLine = 0,\n charWidth,\n foundMatch;\n\n for (let j = 0, jlen = line.length; j < jlen; j++) {\n charWidth = this.__charBounds[lineIndex][j].width;\n widthOfCharsOnLine += charWidth;\n if (widthOfCharsOnLine > width) {\n foundMatch = true;\n const leftEdge = widthOfCharsOnLine - charWidth,\n rightEdge = widthOfCharsOnLine,\n offsetFromLeftEdge = Math.abs(leftEdge - width),\n offsetFromRightEdge = Math.abs(rightEdge - width);\n\n indexOnLine = offsetFromRightEdge < offsetFromLeftEdge ? j : j - 1;\n break;\n }\n }\n\n // reached end\n if (!foundMatch) {\n indexOnLine = line.length - 1;\n }\n\n return indexOnLine;\n }\n\n /**\n * Moves cursor down\n * @param {KeyboardEvent} e Event object\n */\n moveCursorDown(e: KeyboardEvent) {\n if (\n this.selectionStart >= this._text.length &&\n this.selectionEnd >= this._text.length\n ) {\n return;\n }\n this._moveCursorUpOrDown('Down', e);\n }\n\n /**\n * Moves cursor up\n * @param {KeyboardEvent} e Event object\n */\n moveCursorUp(e: KeyboardEvent) {\n if (this.selectionStart === 0 && this.selectionEnd === 0) {\n return;\n }\n this._moveCursorUpOrDown('Up', e);\n }\n\n /**\n * Moves cursor up or down, fires the events\n * @param {String} direction 'Up' or 'Down'\n * @param {KeyboardEvent} e Event object\n */\n _moveCursorUpOrDown(direction: 'Up' | 'Down', e: KeyboardEvent) {\n const offset = this[`get${direction}CursorOffset`](\n e,\n this._selectionDirection === RIGHT,\n );\n if (e.shiftKey) {\n this.moveCursorWithShift(offset);\n } else {\n this.moveCursorWithoutShift(offset);\n }\n if (offset !== 0) {\n const max = this.text.length;\n this.selectionStart = capValue(0, this.selectionStart, max);\n this.selectionEnd = capValue(0, this.selectionEnd, max);\n // TODO fix: abort and init should be an alternative depending\n // on selectionStart/End being equal or different\n this.abortCursorAnimation();\n this.initDelayedCursor();\n this._fireSelectionChanged();\n this._updateTextarea();\n }\n }\n\n /**\n * Moves cursor with shift\n * @param {Number} offset\n */\n moveCursorWithShift(offset: number) {\n const newSelection =\n this._selectionDirection === LEFT\n ? this.selectionStart + offset\n : this.selectionEnd + offset;\n this.setSelectionStartEndWithShift(\n this.selectionStart,\n this.selectionEnd,\n newSelection,\n );\n return offset !== 0;\n }\n\n /**\n * Moves cursor up without shift\n * @param {Number} offset\n */\n moveCursorWithoutShift(offset: number) {\n if (offset < 0) {\n this.selectionStart += offset;\n this.selectionEnd = this.selectionStart;\n } else {\n this.selectionEnd += offset;\n this.selectionStart = this.selectionEnd;\n }\n return offset !== 0;\n }\n\n /**\n * Moves cursor left\n * @param {KeyboardEvent} e Event object\n */\n moveCursorLeft(e: KeyboardEvent) {\n if (this.selectionStart === 0 && this.selectionEnd === 0) {\n return;\n }\n this._moveCursorLeftOrRight('Left', e);\n }\n\n /**\n * @private\n * @return {Boolean} true if a change happened\n *\n * @todo refactor not to use method name composition\n */\n _move(\n e: KeyboardEvent,\n prop: 'selectionStart' | 'selectionEnd',\n direction: 'Left' | 'Right',\n ): boolean {\n let newValue: number | undefined;\n if (e.altKey) {\n newValue = this[`findWordBoundary${direction}`](this[prop]);\n } else if (e.metaKey || e.keyCode === 35 || e.keyCode === 36) {\n newValue = this[`findLineBoundary${direction}`](this[prop]);\n } else {\n this[prop] += direction === 'Left' ? -1 : 1;\n return true;\n }\n if (typeof newValue !== 'undefined' && this[prop] !== newValue) {\n this[prop] = newValue;\n return true;\n }\n return false;\n }\n\n /**\n * @private\n */\n _moveLeft(e: KeyboardEvent, prop: 'selectionStart' | 'selectionEnd') {\n return this._move(e, prop, 'Left');\n }\n\n /**\n * @private\n */\n _moveRight(e: KeyboardEvent, prop: 'selectionStart' | 'selectionEnd') {\n return this._move(e, prop, 'Right');\n }\n\n /**\n * Moves cursor left without keeping selection\n * @param {KeyboardEvent} e\n */\n moveCursorLeftWithoutShift(e: KeyboardEvent) {\n let change = true;\n this._selectionDirection = LEFT;\n\n // only move cursor when there is no selection,\n // otherwise we discard it, and leave cursor on same place\n if (\n this.selectionEnd === this.selectionStart &&\n this.selectionStart !== 0\n ) {\n change = this._moveLeft(e, 'selectionStart');\n }\n this.selectionEnd = this.selectionStart;\n return change;\n }\n\n /**\n * Moves cursor left while keeping selection\n * @param {KeyboardEvent} e\n */\n moveCursorLeftWithShift(e: KeyboardEvent) {\n if (\n this._selectionDirection === RIGHT &&\n this.selectionStart !== this.selectionEnd\n ) {\n return this._moveLeft(e, 'selectionEnd');\n } else if (this.selectionStart !== 0) {\n this._selectionDirection = LEFT;\n return this._moveLeft(e, 'selectionStart');\n }\n }\n\n /**\n * Moves cursor right\n * @param {KeyboardEvent} e Event object\n */\n moveCursorRight(e: KeyboardEvent) {\n if (\n this.selectionStart >= this._text.length &&\n this.selectionEnd >= this._text.length\n ) {\n return;\n }\n this._moveCursorLeftOrRight('Right', e);\n }\n\n /**\n * Moves cursor right or Left, fires event\n * @param {String} direction 'Left', 'Right'\n * @param {KeyboardEvent} e Event object\n */\n _moveCursorLeftOrRight(direction: 'Left' | 'Right', e: KeyboardEvent) {\n const actionName = `moveCursor${direction}${\n e.shiftKey ? 'WithShift' : 'WithoutShift'\n }` as const;\n this._currentCursorOpacity = 1;\n if (this[actionName](e)) {\n // TODO fix: abort and init should be an alternative depending\n // on selectionStart/End being equal or different\n this.abortCursorAnimation();\n this.initDelayedCursor();\n this._fireSelectionChanged();\n this._updateTextarea();\n }\n }\n\n /**\n * Moves cursor right while keeping selection\n * @param {KeyboardEvent} e\n */\n moveCursorRightWithShift(e: KeyboardEvent) {\n if (\n this._selectionDirection === LEFT &&\n this.selectionStart !== this.selectionEnd\n ) {\n return this._moveRight(e, 'selectionStart');\n } else if (this.selectionEnd !== this._text.length) {\n this._selectionDirection = RIGHT;\n return this._moveRight(e, 'selectionEnd');\n }\n }\n\n /**\n * Moves cursor right without keeping selection\n * @param {KeyboardEvent} e Event object\n */\n moveCursorRightWithoutShift(e: KeyboardEvent) {\n let changed = true;\n this._selectionDirection = RIGHT;\n\n if (this.selectionStart === this.selectionEnd) {\n changed = this._moveRight(e, 'selectionStart');\n this.selectionEnd = this.selectionStart;\n } else {\n this.selectionStart = this.selectionEnd;\n }\n return changed;\n }\n}\n","import type {\n ObjectPointerEvents,\n TPointerEvent,\n TPointerEventInfo,\n} from '../../EventTypeDefs';\nimport { Point } from '../../Point';\nimport { invertTransform } from '../../util/misc/matrix';\nimport { DraggableTextDelegate } from './DraggableTextDelegate';\nimport type { ITextEvents } from './ITextBehavior';\nimport { ITextKeyBehavior } from './ITextKeyBehavior';\nimport type { TOptions } from '../../typedefs';\nimport type { TextProps, SerializedTextProps } from '../Text/Text';\nimport type { IText } from './IText';\n/**\n * `LEFT_CLICK === 0`\n */\nconst notALeftClick = (e: Event) => !!(e as MouseEvent).button;\n\nexport abstract class ITextClickBehavior<\n Props extends TOptions = Partial,\n SProps extends SerializedTextProps = SerializedTextProps,\n EventSpec extends ITextEvents = ITextEvents,\n> extends ITextKeyBehavior {\n protected draggableTextDelegate: DraggableTextDelegate;\n\n initBehavior() {\n // Initializes event handlers related to cursor or selection\n this.on('mousedown', this._mouseDownHandler);\n this.on('mouseup', this.mouseUpHandler);\n this.on('mousedblclick', this.doubleClickHandler);\n this.on('mousetripleclick', this.tripleClickHandler);\n\n this.draggableTextDelegate = new DraggableTextDelegate(\n this as unknown as IText,\n );\n\n super.initBehavior();\n }\n\n /**\n * If this method returns true a mouse move operation over a text selection\n * will not prevent the native mouse event allowing the browser to start a drag operation.\n * shouldStartDragging can be read 'do not prevent default for mouse move event'\n * To prevent drag and drop between objects both shouldStartDragging and onDragStart should return false\n * @returns\n */\n shouldStartDragging() {\n return this.draggableTextDelegate.isActive();\n }\n\n /**\n * @public override this method to control whether instance should/shouldn't become a drag source,\n * @see also {@link DraggableTextDelegate#isActive}\n * To prevent drag and drop between objects both shouldStartDragging and onDragStart should return false\n * @returns {boolean} should handle event\n */\n onDragStart(e: DragEvent) {\n return this.draggableTextDelegate.onDragStart(e);\n }\n\n /**\n * @public override this method to control whether instance should/shouldn't become a drop target\n */\n canDrop(e: DragEvent) {\n return this.draggableTextDelegate.canDrop(e);\n }\n\n /**\n * Default handler for double click, select a word\n */\n doubleClickHandler(options: TPointerEventInfo) {\n if (!this.isEditing) {\n return;\n }\n this.selectWord(this.getSelectionStartFromPointer(options.e));\n this.renderCursorOrSelection();\n }\n\n /**\n * Default handler for triple click, select a line\n */\n tripleClickHandler(options: TPointerEventInfo) {\n if (!this.isEditing) {\n return;\n }\n this.selectLine(this.getSelectionStartFromPointer(options.e));\n this.renderCursorOrSelection();\n }\n\n /**\n * Default event handler for the basic functionalities needed on _mouseDown\n * can be overridden to do something different.\n * Scope of this implementation is: find the click position, set selectionStart\n * find selectionEnd, initialize the drawing of either cursor or selection area\n * initializing a mousedDown on a text area will cancel fabricjs knowledge of\n * current compositionMode. It will be set to false.\n */\n _mouseDownHandler({ e, alreadySelected }: ObjectPointerEvents['mousedown']) {\n if (\n !this.canvas ||\n !this.editable ||\n notALeftClick(e) ||\n this.getActiveControl()\n ) {\n return;\n }\n\n if (this.draggableTextDelegate.start(e)) {\n return;\n }\n\n this.canvas.textEditingManager.register(this);\n\n if (alreadySelected) {\n this.inCompositionMode = false;\n this.setCursorByClick(e);\n }\n\n if (this.isEditing) {\n this.__selectionStartOnMouseDown = this.selectionStart;\n if (this.selectionStart === this.selectionEnd) {\n this.abortCursorAnimation();\n }\n this.renderCursorOrSelection();\n }\n this.selected ||= alreadySelected || this.isEditing;\n }\n\n /**\n * standard handler for mouse up, overridable\n * @private\n */\n mouseUpHandler({ e, transform }: ObjectPointerEvents['mouseup']) {\n const didDrag = this.draggableTextDelegate.end(e);\n\n if (this.canvas) {\n this.canvas.textEditingManager.unregister(this);\n\n const activeObject = this.canvas._activeObject;\n if (activeObject && activeObject !== this) {\n // avoid running this logic when there is an active object\n // this because is possible with shift click and fast clicks,\n // to rapidly deselect and reselect this object and trigger an enterEdit\n return;\n }\n }\n\n if (\n !this.editable ||\n (this.group && !this.group.interactive) ||\n (transform && transform.actionPerformed) ||\n notALeftClick(e) ||\n didDrag\n ) {\n return;\n }\n\n if (this.selected && !this.getActiveControl()) {\n this.enterEditing(e);\n if (this.selectionStart === this.selectionEnd) {\n this.initDelayedCursor(true);\n } else {\n this.renderCursorOrSelection();\n }\n }\n }\n\n /**\n * Changes cursor location in a text depending on passed pointer (x/y) object\n * @param {TPointerEvent} e Event object\n */\n setCursorByClick(e: TPointerEvent) {\n const newSelection = this.getSelectionStartFromPointer(e),\n start = this.selectionStart,\n end = this.selectionEnd;\n if (e.shiftKey) {\n this.setSelectionStartEndWithShift(start, end, newSelection);\n } else {\n this.selectionStart = newSelection;\n this.selectionEnd = newSelection;\n }\n if (this.isEditing) {\n this._fireSelectionChanged();\n this._updateTextarea();\n }\n }\n\n /**\n * Returns index of a character corresponding to where an object was clicked\n * @param {TPointerEvent} e Event object\n * @return {Number} Index of a character\n */\n getSelectionStartFromPointer(e: TPointerEvent): number {\n const mouseOffset = this.canvas!.getScenePoint(e)\n .transform(invertTransform(this.calcTransformMatrix()))\n .add(new Point(-this._getLeftOffset(), -this._getTopOffset()));\n let height = 0,\n charIndex = 0,\n lineIndex = 0;\n\n for (let i = 0; i < this._textLines.length; i++) {\n if (height <= mouseOffset.y) {\n height += this.getHeightOfLine(i);\n lineIndex = i;\n if (i > 0) {\n charIndex +=\n this._textLines[i - 1].length + this.missingNewlineOffset(i - 1);\n }\n } else {\n break;\n }\n }\n const lineLeftOffset = Math.abs(this._getLineLeftOffset(lineIndex));\n let width = lineLeftOffset;\n const charLength = this._textLines[lineIndex].length;\n const chars = this.__charBounds[lineIndex];\n for (let j = 0; j < charLength; j++) {\n // i removed something about flipX here, check.\n const charWidth = chars[j].kernedWidth;\n const widthAfter = width + charWidth;\n if (mouseOffset.x <= widthAfter) {\n // if the pointer is closer to the end of the char we increment charIndex\n // in order to position the cursor after the char\n if (\n Math.abs(mouseOffset.x - widthAfter) <=\n Math.abs(mouseOffset.x - width)\n ) {\n charIndex++;\n }\n break;\n }\n width = widthAfter;\n charIndex++;\n }\n\n return Math.min(\n // if object is horizontally flipped, mirror cursor location from the end\n this.flipX ? charLength - charIndex : charIndex,\n this._text.length,\n );\n }\n}\n","export type TKeyMapIText = Record<\n KeyboardEvent['keyCode'],\n CursorHandlingMethods\n>;\n\nexport type CursorHandlingMethods =\n | 'moveCursorUp'\n | 'moveCursorDown'\n | 'moveCursorLeft'\n | 'moveCursorRight'\n | 'exitEditing'\n | 'copy'\n | 'cut'\n | 'cmdAll';\n\nconst MOVE_CURSOR_UP: CursorHandlingMethods = 'moveCursorUp';\nconst MOVE_CURSOR_DOWN: CursorHandlingMethods = 'moveCursorDown';\nconst MOVE_CURSOR_LEFT: CursorHandlingMethods = 'moveCursorLeft';\nconst MOVE_CURSOR_RIGHT: CursorHandlingMethods = 'moveCursorRight';\nconst EXIT_EDITING: CursorHandlingMethods = 'exitEditing';\n\n// @TODO look into import { Key } from 'ts-key-enum';\n// and transition from keyCode to Key\n// also reduce string duplication\nexport const keysMap: TKeyMapIText = {\n 9: EXIT_EDITING,\n 27: EXIT_EDITING,\n 33: MOVE_CURSOR_UP,\n 34: MOVE_CURSOR_DOWN,\n 35: MOVE_CURSOR_RIGHT,\n 36: MOVE_CURSOR_LEFT,\n 37: MOVE_CURSOR_LEFT,\n 38: MOVE_CURSOR_UP,\n 39: MOVE_CURSOR_RIGHT,\n 40: MOVE_CURSOR_DOWN,\n};\n\nexport const keysMapRtl: TKeyMapIText = {\n 9: EXIT_EDITING,\n 27: EXIT_EDITING,\n 33: MOVE_CURSOR_UP,\n 34: MOVE_CURSOR_DOWN,\n 35: MOVE_CURSOR_LEFT,\n 36: MOVE_CURSOR_RIGHT,\n 37: MOVE_CURSOR_RIGHT,\n 38: MOVE_CURSOR_UP,\n 39: MOVE_CURSOR_LEFT,\n 40: MOVE_CURSOR_DOWN,\n};\n\n/**\n * For functionalities on keyUp + ctrl || cmd\n */\nexport const ctrlKeysMapUp: TKeyMapIText = {\n 67: 'copy',\n // there was a reason this wasn't deleted. for now leave it here\n 88: 'cut',\n};\n\n/**\n * For functionalities on keyDown + ctrl || cmd\n */\nexport const ctrlKeysMapDown: TKeyMapIText = {\n 65: 'cmdAll',\n};\n","import type { StaticCanvas } from '../../canvas/StaticCanvas';\n\n/**\n * Set the transform of the passed context to the same of a specific Canvas or StaticCanvas.\n * setTransform is used since this utility will RESET the ctx transform to the basic value\n * of retina scaling and viewport transform\n * It is not meant to be added to other transforms, it is used internally to preapre canvases to draw\n * @param ctx\n * @param canvas\n */\nexport const applyCanvasTransform = (\n ctx: CanvasRenderingContext2D,\n canvas: StaticCanvas,\n) => {\n const scale = canvas.getRetinaScaling();\n ctx.setTransform(scale, 0, 0, scale, 0, 0);\n const v = canvas.viewportTransform;\n ctx.transform(v[0], v[1], v[2], v[3], v[4], v[5]);\n};\n","import { Canvas } from '../../canvas/Canvas';\nimport type { ITextEvents } from './ITextBehavior';\nimport { ITextClickBehavior } from './ITextClickBehavior';\nimport {\n ctrlKeysMapDown,\n ctrlKeysMapUp,\n keysMap,\n keysMapRtl,\n} from './constants';\nimport type { TClassProperties, TFiller, TOptions } from '../../typedefs';\nimport { classRegistry } from '../../ClassRegistry';\nimport type { SerializedTextProps, TextProps } from '../Text/Text';\nimport {\n JUSTIFY,\n JUSTIFY_CENTER,\n JUSTIFY_LEFT,\n JUSTIFY_RIGHT,\n} from '../Text/constants';\nimport { CENTER, FILL, LEFT, RIGHT } from '../../constants';\nimport type { ObjectToCanvasElementOptions } from '../Object/Object';\nimport type { FabricObject } from '../Object/FabricObject';\nimport { createCanvasElementFor } from '../../util/misc/dom';\nimport { applyCanvasTransform } from '../../util/internals/applyCanvasTransform';\n\nexport type CursorBoundaries = {\n left: number;\n top: number;\n leftOffset: number;\n topOffset: number;\n};\n\nexport type CursorRenderingData = {\n color: string;\n opacity: number;\n left: number;\n top: number;\n width: number;\n height: number;\n};\n\n// Declare IText protected properties to workaround TS\nconst protectedDefaultValues = {\n _selectionDirection: null,\n _reSpace: /\\s|\\r?\\n/,\n inCompositionMode: false,\n};\n\nexport const iTextDefaultValues: Partial> = {\n selectionStart: 0,\n selectionEnd: 0,\n selectionColor: 'rgba(17,119,255,0.3)',\n isEditing: false,\n editable: true,\n editingBorderColor: 'rgba(102,153,255,0.25)',\n cursorWidth: 2,\n cursorColor: '',\n cursorDelay: 1000,\n cursorDuration: 600,\n caching: true,\n hiddenTextareaContainer: null,\n keysMap,\n keysMapRtl,\n ctrlKeysMapDown,\n ctrlKeysMapUp,\n ...protectedDefaultValues,\n};\n\n// @TODO this is not complete\ninterface UniqueITextProps {\n selectionStart: number;\n selectionEnd: number;\n}\n\nexport interface SerializedITextProps\n extends SerializedTextProps,\n UniqueITextProps {}\n\nexport interface ITextProps extends TextProps, UniqueITextProps {}\n\n/**\n * @fires changed\n * @fires selection:changed\n * @fires editing:entered\n * @fires editing:exited\n * @fires dragstart\n * @fires drag drag event firing on the drag source\n * @fires dragend\n * @fires copy\n * @fires cut\n * @fires paste\n *\n * #### Supported key combinations\n * ```\n * Move cursor: left, right, up, down\n * Select character: shift + left, shift + right\n * Select text vertically: shift + up, shift + down\n * Move cursor by word: alt + left, alt + right\n * Select words: shift + alt + left, shift + alt + right\n * Move cursor to line start/end: cmd + left, cmd + right or home, end\n * Select till start/end of line: cmd + shift + left, cmd + shift + right or shift + home, shift + end\n * Jump to start/end of text: cmd + up, cmd + down\n * Select till start/end of text: cmd + shift + up, cmd + shift + down or shift + pgUp, shift + pgDown\n * Delete character: backspace\n * Delete word: alt + backspace\n * Delete line: cmd + backspace\n * Forward delete: delete\n * Copy text: ctrl/cmd + c\n * Paste text: ctrl/cmd + v\n * Cut text: ctrl/cmd + x\n * Select entire text: ctrl/cmd + a\n * Quit editing tab or esc\n * ```\n *\n * #### Supported mouse/touch combination\n * ```\n * Position cursor: click/touch\n * Create selection: click/touch & drag\n * Create selection: click & shift + click\n * Select word: double click\n * Select line: triple click\n * ```\n */\nexport class IText<\n Props extends TOptions = Partial,\n SProps extends SerializedITextProps = SerializedITextProps,\n EventSpec extends ITextEvents = ITextEvents,\n >\n extends ITextClickBehavior\n implements UniqueITextProps\n{\n /**\n * Index where text selection starts (or where cursor is when there is no selection)\n * @type Number\n */\n declare selectionStart: number;\n\n /**\n * Index where text selection ends\n * @type Number\n */\n declare selectionEnd: number;\n\n declare compositionStart: number;\n\n declare compositionEnd: number;\n\n /**\n * Color of text selection\n * @type String\n */\n declare selectionColor: string;\n\n /**\n * Indicates whether text is in editing mode\n * @type Boolean\n */\n declare isEditing: boolean;\n\n /**\n * Indicates whether a text can be edited\n * @type Boolean\n */\n declare editable: boolean;\n\n /**\n * Border color of text object while it's in editing mode\n * @type String\n */\n declare editingBorderColor: string;\n\n /**\n * Width of cursor (in px)\n * @type Number\n */\n declare cursorWidth: number;\n\n /**\n * Color of text cursor color in editing mode.\n * if not set (default) will take color from the text.\n * if set to a color value that fabric can understand, it will\n * be used instead of the color of the text at the current position.\n * @type String\n */\n declare cursorColor: string;\n\n /**\n * Delay between cursor blink (in ms)\n * @type Number\n */\n declare cursorDelay: number;\n\n /**\n * Duration of cursor fade in (in ms)\n * @type Number\n */\n declare cursorDuration: number;\n\n declare compositionColor: string;\n\n /**\n * Indicates whether internal text char widths can be cached\n * @type Boolean\n */\n declare caching: boolean;\n\n static ownDefaults = iTextDefaultValues;\n\n static getDefaults(): Record {\n return { ...super.getDefaults(), ...IText.ownDefaults };\n }\n\n static type = 'IText';\n\n get type() {\n const type = super.type;\n // backward compatibility\n return type === 'itext' ? 'i-text' : type;\n }\n\n /**\n * Constructor\n * @param {String} text Text string\n * @param {Object} [options] Options object\n */\n constructor(text: string, options?: Props) {\n super(text, { ...IText.ownDefaults, ...options } as Props);\n this.initBehavior();\n }\n\n /**\n * While editing handle differently\n * @private\n * @param {string} key\n * @param {*} value\n */\n _set(key: string, value: any) {\n if (this.isEditing && this._savedProps && key in this._savedProps) {\n // @ts-expect-error irritating TS\n this._savedProps[key] = value;\n return this;\n }\n if (key === 'canvas') {\n this.canvas instanceof Canvas &&\n this.canvas.textEditingManager.remove(this);\n value instanceof Canvas && value.textEditingManager.add(this);\n }\n return super._set(key, value);\n }\n\n /**\n * Sets selection start (left boundary of a selection)\n * @param {Number} index Index to set selection start to\n */\n setSelectionStart(index: number) {\n index = Math.max(index, 0);\n this._updateAndFire('selectionStart', index);\n }\n\n /**\n * Sets selection end (right boundary of a selection)\n * @param {Number} index Index to set selection end to\n */\n setSelectionEnd(index: number) {\n index = Math.min(index, this.text.length);\n this._updateAndFire('selectionEnd', index);\n }\n\n /**\n * @private\n * @param {String} property 'selectionStart' or 'selectionEnd'\n * @param {Number} index new position of property\n */\n protected _updateAndFire(\n property: 'selectionStart' | 'selectionEnd',\n index: number,\n ) {\n if (this[property] !== index) {\n this._fireSelectionChanged();\n this[property] = index;\n }\n this._updateTextarea();\n }\n\n /**\n * Fires the even of selection changed\n * @private\n */\n _fireSelectionChanged() {\n this.fire('selection:changed');\n this.canvas && this.canvas.fire('text:selection:changed', { target: this });\n }\n\n /**\n * Initialize text dimensions. Render all text on given context\n * or on a offscreen canvas to get the text width with measureText.\n * Updates this.width and this.height with the proper values.\n * Does not return dimensions.\n * @private\n */\n initDimensions() {\n this.isEditing && this.initDelayedCursor();\n super.initDimensions();\n }\n\n /**\n * Gets style of a current selection/cursor (at the start position)\n * if startIndex or endIndex are not provided, selectionStart or selectionEnd will be used.\n * @param {Number} startIndex Start index to get styles at\n * @param {Number} endIndex End index to get styles at, if not specified selectionEnd or startIndex + 1\n * @param {Boolean} [complete] get full style or not\n * @return {Array} styles an array with one, zero or more Style objects\n */\n getSelectionStyles(\n startIndex: number = this.selectionStart || 0,\n endIndex: number = this.selectionEnd,\n complete?: boolean,\n ) {\n return super.getSelectionStyles(startIndex, endIndex, complete);\n }\n\n /**\n * Sets style of a current selection, if no selection exist, do not set anything.\n * @param {Object} [styles] Styles object\n * @param {Number} [startIndex] Start index to get styles at\n * @param {Number} [endIndex] End index to get styles at, if not specified selectionEnd or startIndex + 1\n */\n setSelectionStyles(\n styles: object,\n startIndex: number = this.selectionStart || 0,\n endIndex: number = this.selectionEnd,\n ) {\n return super.setSelectionStyles(styles, startIndex, endIndex);\n }\n\n /**\n * Returns 2d representation (lineIndex and charIndex) of cursor (or selection start)\n * @param {Number} [selectionStart] Optional index. When not given, current selectionStart is used.\n * @param {Boolean} [skipWrapping] consider the location for unwrapped lines. useful to manage styles.\n */\n get2DCursorLocation(\n selectionStart = this.selectionStart,\n skipWrapping?: boolean,\n ) {\n return super.get2DCursorLocation(selectionStart, skipWrapping);\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n render(ctx: CanvasRenderingContext2D) {\n super.render(ctx);\n // clear the cursorOffsetCache, so we ensure to calculate once per renderCursor\n // the correct position but not at every cursor animation.\n this.cursorOffsetCache = {};\n this.renderCursorOrSelection();\n }\n\n /**\n * @override block cursor/selection logic while rendering the exported canvas\n * @todo this workaround should be replaced with a more robust solution\n */\n toCanvasElement(options?: ObjectToCanvasElementOptions): HTMLCanvasElement {\n const isEditing = this.isEditing;\n this.isEditing = false;\n const canvas = super.toCanvasElement(options);\n this.isEditing = isEditing;\n return canvas;\n }\n\n /**\n * Renders cursor or selection (depending on what exists)\n * it does on the contextTop. If contextTop is not available, do nothing.\n */\n renderCursorOrSelection() {\n if (!this.isEditing || !this.canvas) {\n return;\n }\n const ctx = this.clearContextTop(true);\n if (!ctx) {\n return;\n }\n const boundaries = this._getCursorBoundaries();\n\n const ancestors = this.findAncestorsWithClipPath();\n const hasAncestorsWithClipping = ancestors.length > 0;\n let drawingCtx: CanvasRenderingContext2D = ctx;\n let drawingCanvas: HTMLCanvasElement | undefined = undefined;\n if (hasAncestorsWithClipping) {\n // we have some clipPath, we need to draw the selection on an intermediate layer.\n drawingCanvas = createCanvasElementFor(ctx.canvas);\n drawingCtx = drawingCanvas.getContext('2d')!;\n applyCanvasTransform(drawingCtx, this.canvas);\n const m = this.calcTransformMatrix();\n drawingCtx.transform(m[0], m[1], m[2], m[3], m[4], m[5]);\n }\n\n if (this.selectionStart === this.selectionEnd && !this.inCompositionMode) {\n this.renderCursor(drawingCtx, boundaries);\n } else {\n this.renderSelection(drawingCtx, boundaries);\n }\n\n if (hasAncestorsWithClipping) {\n // we need a neutral context.\n // this won't work for nested clippaths in which a clippath\n // has its own clippath\n for (const ancestor of ancestors) {\n const clipPath = ancestor.clipPath!;\n const clippingCanvas = createCanvasElementFor(ctx.canvas);\n const clippingCtx = clippingCanvas.getContext('2d')!;\n applyCanvasTransform(clippingCtx, this.canvas);\n // position the ctx in the center of the outer ancestor\n if (!clipPath.absolutePositioned) {\n const m = ancestor.calcTransformMatrix();\n clippingCtx.transform(m[0], m[1], m[2], m[3], m[4], m[5]);\n }\n clipPath.transform(clippingCtx);\n // we assign an empty drawing context, we don't plan to have this working for nested clippaths for now\n clipPath.drawObject(clippingCtx, true, {});\n this.drawClipPathOnCache(drawingCtx, clipPath, clippingCanvas);\n }\n }\n\n if (hasAncestorsWithClipping) {\n ctx.setTransform(1, 0, 0, 1, 0, 0);\n ctx.drawImage(drawingCanvas!, 0, 0);\n }\n\n this.canvas.contextTopDirty = true;\n ctx.restore();\n }\n\n /**\n * Finds and returns an array of clip paths that are applied to the parent\n * group(s) of the current FabricObject instance. The object's hierarchy is\n * traversed upwards (from the current object towards the root of the canvas),\n * checking each parent object for the presence of a `clipPath` that is not\n * absolutely positioned.\n */\n findAncestorsWithClipPath(): FabricObject[] {\n const clipPathAncestors: FabricObject[] = [];\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n let obj: FabricObject | undefined = this;\n while (obj) {\n if (obj.clipPath) {\n clipPathAncestors.push(obj);\n }\n obj = obj.parent;\n }\n\n return clipPathAncestors;\n }\n\n /**\n * Returns cursor boundaries (left, top, leftOffset, topOffset)\n * left/top are left/top of entire text box\n * leftOffset/topOffset are offset from that left/top point of a text box\n * @private\n * @param {number} [index] index from start\n * @param {boolean} [skipCaching]\n */\n _getCursorBoundaries(\n index: number = this.selectionStart,\n skipCaching?: boolean,\n ): CursorBoundaries {\n const left = this._getLeftOffset(),\n top = this._getTopOffset(),\n offsets = this._getCursorBoundariesOffsets(index, skipCaching);\n return {\n left: left,\n top: top,\n leftOffset: offsets.left,\n topOffset: offsets.top,\n };\n }\n\n /**\n * Caches and returns cursor left/top offset relative to instance's center point\n * @private\n * @param {number} index index from start\n * @param {boolean} [skipCaching]\n */\n _getCursorBoundariesOffsets(\n index: number,\n skipCaching?: boolean,\n ): { left: number; top: number } {\n if (skipCaching) {\n return this.__getCursorBoundariesOffsets(index);\n }\n if (this.cursorOffsetCache && 'top' in this.cursorOffsetCache) {\n return this.cursorOffsetCache as { left: number; top: number };\n }\n return (this.cursorOffsetCache = this.__getCursorBoundariesOffsets(index));\n }\n\n /**\n * Calculates cursor left/top offset relative to instance's center point\n * @private\n * @param {number} index index from start\n */\n __getCursorBoundariesOffsets(index: number) {\n let topOffset = 0,\n leftOffset = 0;\n const { charIndex, lineIndex } = this.get2DCursorLocation(index);\n\n for (let i = 0; i < lineIndex; i++) {\n topOffset += this.getHeightOfLine(i);\n }\n const lineLeftOffset = this._getLineLeftOffset(lineIndex);\n const bound = this.__charBounds[lineIndex][charIndex];\n bound && (leftOffset = bound.left);\n if (\n this.charSpacing !== 0 &&\n charIndex === this._textLines[lineIndex].length\n ) {\n leftOffset -= this._getWidthOfCharSpacing();\n }\n const boundaries = {\n top: topOffset,\n left: lineLeftOffset + (leftOffset > 0 ? leftOffset : 0),\n };\n if (this.direction === 'rtl') {\n if (\n this.textAlign === RIGHT ||\n this.textAlign === JUSTIFY ||\n this.textAlign === JUSTIFY_RIGHT\n ) {\n boundaries.left *= -1;\n } else if (this.textAlign === LEFT || this.textAlign === JUSTIFY_LEFT) {\n boundaries.left = lineLeftOffset - (leftOffset > 0 ? leftOffset : 0);\n } else if (\n this.textAlign === CENTER ||\n this.textAlign === JUSTIFY_CENTER\n ) {\n boundaries.left = lineLeftOffset - (leftOffset > 0 ? leftOffset : 0);\n }\n }\n return boundaries;\n }\n\n /**\n * Renders cursor on context Top, outside the animation cycle, on request\n * Used for the drag/drop effect.\n * If contextTop is not available, do nothing.\n */\n renderCursorAt(selectionStart: number) {\n this._renderCursor(\n this.canvas!.contextTop,\n this._getCursorBoundaries(selectionStart, true),\n selectionStart,\n );\n }\n\n /**\n * Renders cursor\n * @param {Object} boundaries\n * @param {CanvasRenderingContext2D} ctx transformed context to draw on\n */\n renderCursor(ctx: CanvasRenderingContext2D, boundaries: CursorBoundaries) {\n this._renderCursor(ctx, boundaries, this.selectionStart);\n }\n\n /**\n * Return the data needed to render the cursor for given selection start\n * The left,top are relative to the object, while width and height are prescaled\n * to look think with canvas zoom and object scaling,\n * so they depend on canvas and object scaling\n */\n getCursorRenderingData(\n selectionStart: number = this.selectionStart,\n boundaries: CursorBoundaries = this._getCursorBoundaries(selectionStart),\n ): CursorRenderingData {\n const cursorLocation = this.get2DCursorLocation(selectionStart),\n lineIndex = cursorLocation.lineIndex,\n charIndex =\n cursorLocation.charIndex > 0 ? cursorLocation.charIndex - 1 : 0,\n charHeight = this.getValueOfPropertyAt(lineIndex, charIndex, 'fontSize'),\n multiplier = this.getObjectScaling().x * this.canvas!.getZoom(),\n cursorWidth = this.cursorWidth / multiplier,\n dy = this.getValueOfPropertyAt(lineIndex, charIndex, 'deltaY'),\n topOffset =\n boundaries.topOffset +\n ((1 - this._fontSizeFraction) * this.getHeightOfLine(lineIndex)) /\n this.lineHeight -\n charHeight * (1 - this._fontSizeFraction);\n\n return {\n color:\n this.cursorColor ||\n (this.getValueOfPropertyAt(lineIndex, charIndex, 'fill') as string),\n opacity: this._currentCursorOpacity,\n left: boundaries.left + boundaries.leftOffset - cursorWidth / 2,\n top: topOffset + boundaries.top + dy,\n width: cursorWidth,\n height: charHeight,\n };\n }\n\n /**\n * Render the cursor at the given selectionStart.\n * @param {CanvasRenderingContext2D} ctx transformed context to draw on\n */\n _renderCursor(\n ctx: CanvasRenderingContext2D,\n boundaries: CursorBoundaries,\n selectionStart: number,\n ) {\n const { color, opacity, left, top, width, height } =\n this.getCursorRenderingData(selectionStart, boundaries);\n ctx.fillStyle = color;\n ctx.globalAlpha = opacity;\n ctx.fillRect(left, top, width, height);\n }\n\n /**\n * Renders text selection\n * @param {Object} boundaries Object with left/top/leftOffset/topOffset\n * @param {CanvasRenderingContext2D} ctx transformed context to draw on\n */\n renderSelection(ctx: CanvasRenderingContext2D, boundaries: CursorBoundaries) {\n const selection = {\n selectionStart: this.inCompositionMode\n ? this.hiddenTextarea!.selectionStart\n : this.selectionStart,\n selectionEnd: this.inCompositionMode\n ? this.hiddenTextarea!.selectionEnd\n : this.selectionEnd,\n };\n this._renderSelection(ctx, selection, boundaries);\n }\n\n /**\n * Renders drag start text selection\n */\n renderDragSourceEffect() {\n const dragStartSelection =\n this.draggableTextDelegate.getDragStartSelection()!;\n this._renderSelection(\n this.canvas!.contextTop,\n dragStartSelection,\n this._getCursorBoundaries(dragStartSelection.selectionStart, true),\n );\n }\n\n renderDropTargetEffect(e: DragEvent) {\n const dragSelection = this.getSelectionStartFromPointer(e);\n this.renderCursorAt(dragSelection);\n }\n\n /**\n * Renders text selection\n * @private\n * @param {{ selectionStart: number, selectionEnd: number }} selection\n * @param {Object} boundaries Object with left/top/leftOffset/topOffset\n * @param {CanvasRenderingContext2D} ctx transformed context to draw on\n */\n _renderSelection(\n ctx: CanvasRenderingContext2D,\n selection: { selectionStart: number; selectionEnd: number },\n boundaries: CursorBoundaries,\n ) {\n const selectionStart = selection.selectionStart,\n selectionEnd = selection.selectionEnd,\n isJustify = this.textAlign.includes(JUSTIFY),\n start = this.get2DCursorLocation(selectionStart),\n end = this.get2DCursorLocation(selectionEnd),\n startLine = start.lineIndex,\n endLine = end.lineIndex,\n startChar = start.charIndex < 0 ? 0 : start.charIndex,\n endChar = end.charIndex < 0 ? 0 : end.charIndex;\n\n for (let i = startLine; i <= endLine; i++) {\n const lineOffset = this._getLineLeftOffset(i) || 0;\n let lineHeight = this.getHeightOfLine(i),\n realLineHeight = 0,\n boxStart = 0,\n boxEnd = 0;\n\n if (i === startLine) {\n boxStart = this.__charBounds[startLine][startChar].left;\n }\n if (i >= startLine && i < endLine) {\n boxEnd =\n isJustify && !this.isEndOfWrapping(i)\n ? this.width\n : this.getLineWidth(i) || 5; // WTF is this 5?\n } else if (i === endLine) {\n if (endChar === 0) {\n boxEnd = this.__charBounds[endLine][endChar].left;\n } else {\n const charSpacing = this._getWidthOfCharSpacing();\n boxEnd =\n this.__charBounds[endLine][endChar - 1].left +\n this.__charBounds[endLine][endChar - 1].width -\n charSpacing;\n }\n }\n realLineHeight = lineHeight;\n if (this.lineHeight < 1 || (i === endLine && this.lineHeight > 1)) {\n lineHeight /= this.lineHeight;\n }\n let drawStart = boundaries.left + lineOffset + boxStart,\n drawHeight = lineHeight,\n extraTop = 0;\n const drawWidth = boxEnd - boxStart;\n if (this.inCompositionMode) {\n ctx.fillStyle = this.compositionColor || 'black';\n drawHeight = 1;\n extraTop = lineHeight;\n } else {\n ctx.fillStyle = this.selectionColor;\n }\n if (this.direction === 'rtl') {\n if (\n this.textAlign === RIGHT ||\n this.textAlign === JUSTIFY ||\n this.textAlign === JUSTIFY_RIGHT\n ) {\n drawStart = this.width - drawStart - drawWidth;\n } else if (this.textAlign === LEFT || this.textAlign === JUSTIFY_LEFT) {\n drawStart = boundaries.left + lineOffset - boxEnd;\n } else if (\n this.textAlign === CENTER ||\n this.textAlign === JUSTIFY_CENTER\n ) {\n drawStart = boundaries.left + lineOffset - boxEnd;\n }\n }\n ctx.fillRect(\n drawStart,\n boundaries.top + boundaries.topOffset + extraTop,\n drawWidth,\n drawHeight,\n );\n boundaries.topOffset += realLineHeight;\n }\n }\n\n /**\n * High level function to know the height of the cursor.\n * the currentChar is the one that precedes the cursor\n * Returns fontSize of char at the current cursor\n * Unused from the library, is for the end user\n * @return {Number} Character font size\n */\n getCurrentCharFontSize(): number {\n const cp = this._getCurrentCharIndex();\n return this.getValueOfPropertyAt(cp.l, cp.c, 'fontSize');\n }\n\n /**\n * High level function to know the color of the cursor.\n * the currentChar is the one that precedes the cursor\n * Returns color (fill) of char at the current cursor\n * if the text object has a pattern or gradient for filler, it will return that.\n * Unused by the library, is for the end user\n * @return {String | TFiller} Character color (fill)\n */\n getCurrentCharColor(): string | TFiller | null {\n const cp = this._getCurrentCharIndex();\n return this.getValueOfPropertyAt(cp.l, cp.c, FILL);\n }\n\n /**\n * Returns the cursor position for the getCurrent.. functions\n * @private\n */\n _getCurrentCharIndex() {\n const cursorPosition = this.get2DCursorLocation(this.selectionStart, true),\n charIndex =\n cursorPosition.charIndex > 0 ? cursorPosition.charIndex - 1 : 0;\n return { l: cursorPosition.lineIndex, c: charIndex };\n }\n\n dispose() {\n this.exitEditingImpl();\n this.draggableTextDelegate.dispose();\n super.dispose();\n }\n}\n\nclassRegistry.setClass(IText);\n// legacy\nclassRegistry.setClass(IText, 'i-text');\n","import type { TClassProperties, TOptions } from '../typedefs';\nimport { IText } from './IText/IText';\nimport { classRegistry } from '../ClassRegistry';\nimport { createTextboxDefaultControls } from '../controls/commonControls';\nimport { JUSTIFY } from './Text/constants';\nimport type { TextStyleDeclaration } from './Text/StyledText';\nimport type { SerializedITextProps, ITextProps } from './IText/IText';\nimport type { ITextEvents } from './IText/ITextBehavior';\nimport type { TextLinesInfo } from './Text/Text';\nimport type { Control } from '../controls/Control';\n\n// @TODO: Many things here are configuration related and shouldn't be on the class nor prototype\n// regexes, list of properties that are not suppose to change by instances, magic consts.\n// this will be a separated effort\nexport const textboxDefaultValues: Partial> = {\n minWidth: 20,\n dynamicMinWidth: 2,\n lockScalingFlip: true,\n noScaleCache: false,\n _wordJoiners: /[ \\t\\r]/,\n splitByGrapheme: false,\n};\n\nexport type GraphemeData = {\n wordsData: {\n word: string[];\n width: number;\n }[][];\n largestWordWidth: number;\n};\n\nexport type StyleMap = Record;\n\n// @TODO this is not complete\ninterface UniqueTextboxProps {\n minWidth: number;\n splitByGrapheme: boolean;\n dynamicMinWidth: number;\n _wordJoiners: RegExp;\n}\n\nexport interface SerializedTextboxProps\n extends SerializedITextProps,\n Pick {}\n\nexport interface TextboxProps extends ITextProps, UniqueTextboxProps {}\n\n/**\n * Textbox class, based on IText, allows the user to resize the text rectangle\n * and wraps lines automatically. Textboxes have their Y scaling locked, the\n * user can only change width. Height is adjusted automatically based on the\n * wrapping of lines.\n */\nexport class Textbox<\n Props extends TOptions = Partial,\n SProps extends SerializedTextboxProps = SerializedTextboxProps,\n EventSpec extends ITextEvents = ITextEvents,\n >\n extends IText\n implements UniqueTextboxProps\n{\n /**\n * Minimum width of textbox, in pixels.\n * @type Number\n */\n declare minWidth: number;\n\n /**\n * Minimum calculated width of a textbox, in pixels.\n * fixed to 2 so that an empty textbox cannot go to 0\n * and is still selectable without text.\n * @type Number\n */\n declare dynamicMinWidth: number;\n\n /**\n * Use this boolean property in order to split strings that have no white space concept.\n * this is a cheap way to help with chinese/japanese\n * @type Boolean\n * @since 2.6.0\n */\n declare splitByGrapheme: boolean;\n\n declare _wordJoiners: RegExp;\n\n declare _styleMap: StyleMap;\n\n declare isWrapping: boolean;\n\n static type = 'Textbox';\n\n static textLayoutProperties = [...IText.textLayoutProperties, 'width'];\n\n static ownDefaults = textboxDefaultValues;\n\n static getDefaults(): Record {\n return {\n ...super.getDefaults(),\n ...Textbox.ownDefaults,\n };\n }\n\n /**\n * Constructor\n * @param {String} text Text string\n * @param {Object} [options] Options object\n */\n constructor(text: string, options?: Props) {\n super(text, { ...Textbox.ownDefaults, ...options } as Props);\n }\n\n /**\n * Creates the default control object.\n * If you prefer to have on instance of controls shared among all objects\n * make this function return an empty object and add controls to the ownDefaults object\n */\n static createControls(): { controls: Record } {\n return { controls: createTextboxDefaultControls() };\n }\n\n /**\n * Unlike superclass's version of this function, Textbox does not update\n * its width.\n * @private\n * @override\n */\n initDimensions() {\n if (!this.initialized) {\n return;\n }\n this.isEditing && this.initDelayedCursor();\n this._clearCache();\n // clear dynamicMinWidth as it will be different after we re-wrap line\n this.dynamicMinWidth = 0;\n // wrap lines\n this._styleMap = this._generateStyleMap(this._splitText());\n // if after wrapping, the width is smaller than dynamicMinWidth, change the width and re-wrap\n if (this.dynamicMinWidth > this.width) {\n this._set('width', this.dynamicMinWidth);\n }\n if (this.textAlign.includes(JUSTIFY)) {\n // once text is measured we need to make space fatter to make justified text.\n this.enlargeSpaces();\n }\n // clear cache and re-calculate height\n this.height = this.calcTextHeight();\n }\n\n /**\n * Generate an object that translates the style object so that it is\n * broken up by visual lines (new lines and automatic wrapping).\n * The original text styles object is broken up by actual lines (new lines only),\n * which is only sufficient for Text / IText\n * @private\n */\n _generateStyleMap(textInfo: TextLinesInfo): StyleMap {\n let realLineCount = 0,\n realLineCharCount = 0,\n charCount = 0;\n const map: StyleMap = {};\n\n for (let i = 0; i < textInfo.graphemeLines.length; i++) {\n if (textInfo.graphemeText[charCount] === '\\n' && i > 0) {\n realLineCharCount = 0;\n charCount++;\n realLineCount++;\n } else if (\n !this.splitByGrapheme &&\n this._reSpaceAndTab.test(textInfo.graphemeText[charCount]) &&\n i > 0\n ) {\n // this case deals with space's that are removed from end of lines when wrapping\n realLineCharCount++;\n charCount++;\n }\n\n map[i] = { line: realLineCount, offset: realLineCharCount };\n\n charCount += textInfo.graphemeLines[i].length;\n realLineCharCount += textInfo.graphemeLines[i].length;\n }\n\n return map;\n }\n\n /**\n * Returns true if object has a style property or has it on a specified line\n * @param {Number} lineIndex\n * @return {Boolean}\n */\n styleHas(property: keyof TextStyleDeclaration, lineIndex: number): boolean {\n if (this._styleMap && !this.isWrapping) {\n const map = this._styleMap[lineIndex];\n if (map) {\n lineIndex = map.line;\n }\n }\n return super.styleHas(property, lineIndex);\n }\n\n /**\n * Returns true if object has no styling or no styling in a line\n * @param {Number} lineIndex , lineIndex is on wrapped lines.\n * @return {Boolean}\n */\n isEmptyStyles(lineIndex: number): boolean {\n if (!this.styles) {\n return true;\n }\n let offset = 0,\n nextLineIndex = lineIndex + 1,\n nextOffset: number,\n shouldLimit = false;\n const map = this._styleMap[lineIndex],\n mapNextLine = this._styleMap[lineIndex + 1];\n if (map) {\n lineIndex = map.line;\n offset = map.offset;\n }\n if (mapNextLine) {\n nextLineIndex = mapNextLine.line;\n shouldLimit = nextLineIndex === lineIndex;\n nextOffset = mapNextLine.offset;\n }\n const obj =\n typeof lineIndex === 'undefined'\n ? this.styles\n : { line: this.styles[lineIndex] };\n for (const p1 in obj) {\n for (const p2 in obj[p1]) {\n const p2Number = parseInt(p2, 10);\n if (p2Number >= offset && (!shouldLimit || p2Number < nextOffset!)) {\n for (const p3 in obj[p1][p2]) {\n return false;\n }\n }\n }\n }\n return true;\n }\n\n /**\n * @protected\n * @param {Number} lineIndex\n * @param {Number} charIndex\n * @return {TextStyleDeclaration} a style object reference to the existing one or a new empty object when undefined\n */\n _getStyleDeclaration(\n lineIndex: number,\n charIndex: number,\n ): TextStyleDeclaration {\n if (this._styleMap && !this.isWrapping) {\n const map = this._styleMap[lineIndex];\n if (!map) {\n return {};\n }\n lineIndex = map.line;\n charIndex = map.offset + charIndex;\n }\n return super._getStyleDeclaration(lineIndex, charIndex);\n }\n\n /**\n * @param {Number} lineIndex\n * @param {Number} charIndex\n * @param {Object} style\n * @private\n */\n protected _setStyleDeclaration(\n lineIndex: number,\n charIndex: number,\n style: object,\n ) {\n const map = this._styleMap[lineIndex];\n super._setStyleDeclaration(map.line, map.offset + charIndex, style);\n }\n\n /**\n * @param {Number} lineIndex\n * @param {Number} charIndex\n * @private\n */\n protected _deleteStyleDeclaration(lineIndex: number, charIndex: number) {\n const map = this._styleMap[lineIndex];\n super._deleteStyleDeclaration(map.line, map.offset + charIndex);\n }\n\n /**\n * probably broken need a fix\n * Returns the real style line that correspond to the wrapped lineIndex line\n * Used just to verify if the line does exist or not.\n * @param {Number} lineIndex\n * @returns {Boolean} if the line exists or not\n * @private\n */\n protected _getLineStyle(lineIndex: number): boolean {\n const map = this._styleMap[lineIndex];\n return !!this.styles[map.line];\n }\n\n /**\n * Set the line style to an empty object so that is initialized\n * @param {Number} lineIndex\n * @param {Object} style\n * @private\n */\n protected _setLineStyle(lineIndex: number) {\n const map = this._styleMap[lineIndex];\n super._setLineStyle(map.line);\n }\n\n /**\n * Wraps text using the 'width' property of Textbox. First this function\n * splits text on newlines, so we preserve newlines entered by the user.\n * Then it wraps each line using the width of the Textbox by calling\n * _wrapLine().\n * @param {Array} lines The string array of text that is split into lines\n * @param {Number} desiredWidth width you want to wrap to\n * @returns {Array} Array of lines\n */\n _wrapText(lines: string[], desiredWidth: number): string[][] {\n this.isWrapping = true;\n // extract all thewords and the widths to optimally wrap lines.\n const data = this.getGraphemeDataForRender(lines);\n const wrapped: string[][] = [];\n for (let i = 0; i < data.wordsData.length; i++) {\n wrapped.push(...this._wrapLine(i, desiredWidth, data));\n }\n this.isWrapping = false;\n return wrapped;\n }\n\n /**\n * For each line of text terminated by an hard line stop,\n * measure each word width and extract the largest word from all.\n * The returned words here are the one that at the end will be rendered.\n * @param {string[]} lines the lines we need to measure\n *\n */\n getGraphemeDataForRender(lines: string[]): GraphemeData {\n const splitByGrapheme = this.splitByGrapheme,\n infix = splitByGrapheme ? '' : ' ';\n\n let largestWordWidth = 0;\n\n const data = lines.map((line, lineIndex) => {\n let offset = 0;\n const wordsOrGraphemes = splitByGrapheme\n ? this.graphemeSplit(line)\n : this.wordSplit(line);\n\n if (wordsOrGraphemes.length === 0) {\n return [{ word: [], width: 0 }];\n }\n\n return wordsOrGraphemes.map((word: string) => {\n // if using splitByGrapheme words are already in graphemes.\n const graphemeArray = splitByGrapheme\n ? [word]\n : this.graphemeSplit(word);\n const width = this._measureWord(graphemeArray, lineIndex, offset);\n largestWordWidth = Math.max(width, largestWordWidth);\n offset += graphemeArray.length + infix.length;\n return { word: graphemeArray, width };\n });\n });\n\n return {\n wordsData: data,\n largestWordWidth,\n };\n }\n\n /**\n * Helper function to measure a string of text, given its lineIndex and charIndex offset\n * It gets called when charBounds are not available yet.\n * Override if necessary\n * Use with {@link Textbox#wordSplit}\n *\n * @param {CanvasRenderingContext2D} ctx\n * @param {String} text\n * @param {number} lineIndex\n * @param {number} charOffset\n * @returns {number}\n */\n _measureWord(word: string[], lineIndex: number, charOffset = 0): number {\n let width = 0,\n prevGrapheme;\n const skipLeft = true;\n for (let i = 0, len = word.length; i < len; i++) {\n const box = this._getGraphemeBox(\n word[i],\n lineIndex,\n i + charOffset,\n prevGrapheme,\n skipLeft,\n );\n width += box.kernedWidth;\n prevGrapheme = word[i];\n }\n return width;\n }\n\n /**\n * Override this method to customize word splitting\n * Use with {@link Textbox#_measureWord}\n * @param {string} value\n * @returns {string[]} array of words\n */\n wordSplit(value: string): string[] {\n return value.split(this._wordJoiners);\n }\n\n /**\n * Wraps a line of text using the width of the Textbox as desiredWidth\n * and leveraging the known width o words from GraphemeData\n * @private\n * @param {Number} lineIndex\n * @param {Number} desiredWidth width you want to wrap the line to\n * @param {GraphemeData} graphemeData an object containing all the lines' words width.\n * @param {Number} reservedSpace space to remove from wrapping for custom functionalities\n * @returns {Array} Array of line(s) into which the given text is wrapped\n * to.\n */\n _wrapLine(\n lineIndex: number,\n desiredWidth: number,\n { largestWordWidth, wordsData }: GraphemeData,\n reservedSpace = 0,\n ): string[][] {\n const additionalSpace = this._getWidthOfCharSpacing(),\n splitByGrapheme = this.splitByGrapheme,\n graphemeLines = [],\n infix = splitByGrapheme ? '' : ' ';\n\n let lineWidth = 0,\n line: string[] = [],\n // spaces in different languages?\n offset = 0,\n infixWidth = 0,\n lineJustStarted = true;\n\n desiredWidth -= reservedSpace;\n\n const maxWidth = Math.max(\n desiredWidth,\n largestWordWidth,\n this.dynamicMinWidth,\n );\n // layout words\n const data = wordsData[lineIndex];\n offset = 0;\n let i;\n for (i = 0; i < data.length; i++) {\n const { word, width: wordWidth } = data[i];\n offset += word.length;\n\n lineWidth += infixWidth + wordWidth - additionalSpace;\n if (lineWidth > maxWidth && !lineJustStarted) {\n graphemeLines.push(line);\n line = [];\n lineWidth = wordWidth;\n lineJustStarted = true;\n } else {\n lineWidth += additionalSpace;\n }\n\n if (!lineJustStarted && !splitByGrapheme) {\n line.push(infix);\n }\n line = line.concat(word);\n\n infixWidth = splitByGrapheme\n ? 0\n : this._measureWord([infix], lineIndex, offset);\n offset++;\n lineJustStarted = false;\n }\n\n i && graphemeLines.push(line);\n\n // TODO: this code is probably not necessary anymore.\n // it can be moved out of this function since largestWordWidth is now\n // known in advance\n if (largestWordWidth + reservedSpace > this.dynamicMinWidth) {\n this.dynamicMinWidth = largestWordWidth - additionalSpace + reservedSpace;\n }\n return graphemeLines;\n }\n\n /**\n * Detect if the text line is ended with an hard break\n * text and itext do not have wrapping, return false\n * @param {Number} lineIndex text to split\n * @return {Boolean}\n */\n isEndOfWrapping(lineIndex: number): boolean {\n if (!this._styleMap[lineIndex + 1]) {\n // is last line, return true;\n return true;\n }\n if (this._styleMap[lineIndex + 1].line !== this._styleMap[lineIndex].line) {\n // this is last line before a line break, return true;\n return true;\n }\n return false;\n }\n\n /**\n * Detect if a line has a linebreak and so we need to account for it when moving\n * and counting style.\n * This is important only for splitByGrapheme at the end of wrapping.\n * If we are not wrapping the offset is always 1\n * @return Number\n */\n missingNewlineOffset(lineIndex: number, skipWrapping?: boolean): 0 | 1 {\n if (this.splitByGrapheme && !skipWrapping) {\n return this.isEndOfWrapping(lineIndex) ? 1 : 0;\n }\n return 1;\n }\n\n /**\n * Gets lines of text to render in the Textbox. This function calculates\n * text wrapping on the fly every time it is called.\n * @param {String} text text to split\n * @returns {Array} Array of lines in the Textbox.\n * @override\n */\n _splitTextIntoLines(text: string) {\n const newText = super._splitTextIntoLines(text),\n graphemeLines = this._wrapText(newText.lines, this.width),\n lines = new Array(graphemeLines.length);\n for (let i = 0; i < graphemeLines.length; i++) {\n lines[i] = graphemeLines[i].join('');\n }\n newText.lines = lines;\n newText.graphemeLines = graphemeLines;\n return newText;\n }\n\n getMinWidth() {\n return Math.max(this.minWidth, this.dynamicMinWidth);\n }\n\n _removeExtraneousStyles() {\n const linesToKeep = new Map();\n for (const prop in this._styleMap) {\n const propNumber = parseInt(prop, 10);\n if (this._textLines[propNumber]) {\n const lineIndex = this._styleMap[prop].line;\n linesToKeep.set(`${lineIndex}`, true);\n }\n }\n for (const prop in this.styles) {\n if (!linesToKeep.has(prop)) {\n delete this.styles[prop];\n }\n }\n }\n\n /**\n * Returns object representation of an instance\n * @method toObject\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} object representation of an instance\n */\n toObject<\n T extends Omit, keyof SProps>,\n K extends keyof T = never,\n >(propertiesToInclude: K[] = []): Pick & SProps {\n return super.toObject([\n 'minWidth',\n 'splitByGrapheme',\n ...propertiesToInclude,\n ] as K[]);\n }\n}\n\nclassRegistry.setClass(Textbox);\n","import { Point } from '../../Point';\nimport type { FabricObject } from '../../shapes/Object/FabricObject';\nimport { makeBoundingBoxFromPoints } from '../../util/misc/boundingBoxFromPoints';\nimport { sendPointToPlane } from '../../util/misc/planeChange';\nimport type { LayoutStrategyResult, StrictLayoutContext } from '../types';\nimport { LayoutStrategy } from './LayoutStrategy';\nimport { getObjectBounds } from './utils';\nimport { classRegistry } from '../../ClassRegistry';\n\n/**\n * Layout will adjust the bounding box to match the clip path bounding box.\n */\nexport class ClipPathLayout extends LayoutStrategy {\n static readonly type = 'clip-path';\n\n shouldPerformLayout(context: StrictLayoutContext): boolean {\n return !!context.target.clipPath && super.shouldPerformLayout(context);\n }\n\n shouldLayoutClipPath() {\n return false;\n }\n\n calcLayoutResult(\n context: StrictLayoutContext,\n objects: FabricObject[],\n ): LayoutStrategyResult | undefined {\n const { target } = context;\n const { clipPath, group } = target;\n if (!clipPath || !this.shouldPerformLayout(context)) {\n return;\n }\n // TODO: remove stroke calculation from this case\n const { width, height } = makeBoundingBoxFromPoints(\n getObjectBounds(target, clipPath as FabricObject),\n );\n const size = new Point(width, height);\n if (clipPath.absolutePositioned) {\n // we want the center point to exist in group's containing plane\n const clipPathCenter = sendPointToPlane(\n clipPath.getRelativeCenterPoint(),\n undefined,\n group ? group.calcTransformMatrix() : undefined,\n );\n return {\n center: clipPathCenter,\n size,\n };\n } else {\n // we want the center point to exist in group's containing plane, so we send it upwards\n const clipPathCenter = clipPath\n .getRelativeCenterPoint()\n .transform(target.calcOwnMatrix(), true);\n if (this.shouldPerformLayout(context)) {\n // the clip path is positioned relative to the group's center which is affected by the bbox\n // so we first calculate the bbox\n const { center = new Point(), correction = new Point() } =\n this.calcBoundingBox(objects, context) || {};\n return {\n center: center.add(clipPathCenter),\n correction: correction.subtract(clipPathCenter),\n size,\n };\n } else {\n return {\n center: target.getRelativeCenterPoint().add(clipPathCenter),\n size,\n };\n }\n }\n }\n}\n\nclassRegistry.setClass(ClipPathLayout);\n","import { Point } from '../../Point';\nimport type {\n InitializationLayoutContext,\n LayoutStrategyResult,\n StrictLayoutContext,\n} from '../types';\nimport { LayoutStrategy } from './LayoutStrategy';\nimport { classRegistry } from '../../ClassRegistry';\n\n/**\n * Layout will keep target's initial size.\n */\nexport class FixedLayout extends LayoutStrategy {\n static readonly type = 'fixed';\n\n /**\n * @override respect target's initial size\n */\n getInitialSize(\n { target }: StrictLayoutContext & InitializationLayoutContext,\n { size }: Pick,\n ): Point {\n return new Point(target.width || size.x, target.height || size.y);\n }\n}\n\nclassRegistry.setClass(FixedLayout);\n","import { LayoutManager } from './LayoutManager';\nimport type { RegistrationContext, StrictLayoutContext } from './types';\nimport type { Group } from '../shapes/Group';\n\n/**\n * Today the LayoutManager class also takes care of subscribing event handlers\n * to update the group layout when the group is interactive and a transform is applied\n * to a child object.\n * The ActiveSelection is never interactive, but it could contain objects from\n * groups that are.\n * The standard LayoutManager would subscribe the children of the activeSelection to\n * perform layout changes to the active selection itself, what we need instead is that\n * the transformation applied to the active selection will trigger changes to the\n * original group of the children ( the one referenced under the parent property )\n * This subclass of the LayoutManager has a single duty to fill the gap of this difference.`\n */\nexport class ActiveSelectionLayoutManager extends LayoutManager {\n subscribeTargets(\n context: RegistrationContext & Partial,\n ): void {\n const activeSelection = context.target;\n const parents = context.targets.reduce((parents, target) => {\n target.parent && parents.add(target.parent);\n return parents;\n }, new Set());\n parents.forEach((parent) => {\n parent.layoutManager.subscribeTargets({\n target: parent,\n targets: [activeSelection],\n });\n });\n }\n\n /**\n * unsubscribe from parent only if all its children were deselected\n */\n unsubscribeTargets(\n context: RegistrationContext & Partial,\n ): void {\n const activeSelection = context.target;\n const selectedObjects = activeSelection.getObjects();\n const parents = context.targets.reduce((parents, target) => {\n target.parent && parents.add(target.parent);\n return parents;\n }, new Set());\n parents.forEach((parent) => {\n !selectedObjects.some((object) => object.parent === parent) &&\n parent.layoutManager.unsubscribeTargets({\n target: parent,\n targets: [activeSelection],\n });\n });\n }\n}\n","import type { ControlRenderingStyleOverride } from '../controls/controlRendering';\nimport { classRegistry } from '../ClassRegistry';\nimport type { GroupProps } from './Group';\nimport { Group } from './Group';\nimport type { FabricObject } from './Object/FabricObject';\nimport {\n LAYOUT_TYPE_ADDED,\n LAYOUT_TYPE_REMOVED,\n} from '../LayoutManager/constants';\nimport type { TClassProperties } from '../typedefs';\nimport { log } from '../util/internals/console';\nimport { ActiveSelectionLayoutManager } from '../LayoutManager/ActiveSelectionLayoutManager';\n\nexport type MultiSelectionStacking = 'canvas-stacking' | 'selection-order';\n\nexport interface ActiveSelectionOptions extends GroupProps {\n multiSelectionStacking: MultiSelectionStacking;\n}\n\nconst activeSelectionDefaultValues: Partial> =\n {\n multiSelectionStacking: 'canvas-stacking',\n };\n\n/**\n * Used by Canvas to manage selection.\n *\n * @example\n * class MyActiveSelection extends ActiveSelection {\n * ...\n * }\n *\n * // override the default `ActiveSelection` class\n * classRegistry.setClass(MyActiveSelection)\n */\nexport class ActiveSelection extends Group {\n static type = 'ActiveSelection';\n\n static ownDefaults: Record = activeSelectionDefaultValues;\n\n static getDefaults(): Record {\n return { ...super.getDefaults(), ...ActiveSelection.ownDefaults };\n }\n\n /**\n * The ActiveSelection needs to use the ActiveSelectionLayoutManager\n * or selections on interactive groups may be broken\n */\n declare layoutManager: ActiveSelectionLayoutManager;\n\n /**\n * controls how selected objects are added during a multiselection event\n * - `canvas-stacking` adds the selected object to the active selection while respecting canvas object stacking order\n * - `selection-order` adds the selected object to the top of the stack,\n * meaning that the stack is ordered by the order in which objects were selected\n * @default `canvas-stacking`\n */\n declare multiSelectionStacking: MultiSelectionStacking;\n\n constructor(\n objects: FabricObject[] = [],\n options: Partial = {},\n ) {\n super();\n Object.assign(this, ActiveSelection.ownDefaults);\n this.setOptions(options);\n const { left, top, layoutManager } = options;\n this.groupInit(objects, {\n left,\n top,\n layoutManager: layoutManager ?? new ActiveSelectionLayoutManager(),\n });\n }\n\n /**\n * @private\n */\n _shouldSetNestedCoords() {\n return true;\n }\n\n /**\n * @private\n * @override we don't want the selection monitor to be active\n */\n __objectSelectionMonitor() {\n // noop\n }\n\n /**\n * Adds objects with respect to {@link multiSelectionStacking}\n * @param targets object to add to selection\n */\n multiSelectAdd(...targets: FabricObject[]) {\n if (this.multiSelectionStacking === 'selection-order') {\n this.add(...targets);\n } else {\n // respect object stacking as it is on canvas\n // perf enhancement for large ActiveSelection: consider a binary search of `isInFrontOf`\n targets.forEach((target) => {\n const index = this._objects.findIndex((obj) => obj.isInFrontOf(target));\n const insertAt =\n index === -1\n ? // `target` is in front of all other objects\n this.size()\n : index;\n this.insertAt(insertAt, target);\n });\n }\n }\n\n /**\n * @override block ancestors/descendants of selected objects from being selected to prevent a circular object tree\n */\n canEnterGroup(object: FabricObject) {\n if (\n this.getObjects().some(\n (o) => o.isDescendantOf(object) || object.isDescendantOf(o),\n )\n ) {\n // prevent circular object tree\n log(\n 'error',\n 'ActiveSelection: circular object trees are not supported, this call has no effect',\n );\n return false;\n }\n\n return super.canEnterGroup(object);\n }\n\n /**\n * Change an object so that it can be part of an active selection.\n * this method is called by multiselectAdd from canvas code.\n * @private\n * @param {FabricObject} object\n * @param {boolean} [removeParentTransform] true if object is in canvas coordinate plane\n */\n enterGroup(object: FabricObject, removeParentTransform?: boolean) {\n // This condition check that the object has currently a group, and the group\n // is also its parent, meaning that is not in an active selection, but is\n // in a normal group.\n if (object.parent && object.parent === object.group) {\n // Disconnect the object from the group functionalities, but keep the ref parent intact\n // for later re-enter\n object.parent._exitGroup(object);\n // in this case the object is probably inside an active selection.\n } else if (object.group && object.parent !== object.group) {\n // in this case group.remove will also clear the old parent reference.\n object.group.remove(object);\n }\n // enter the active selection from a render perspective\n // the object will be in the objects array of both the ActiveSelection and the Group\n // but referenced in the group's _activeObjects so that it won't be rendered twice.\n this._enterGroup(object, removeParentTransform);\n }\n\n /**\n * we want objects to retain their canvas ref when exiting instance\n * @private\n * @param {FabricObject} object\n * @param {boolean} [removeParentTransform] true if object should exit group without applying group's transform to it\n */\n exitGroup(object: FabricObject, removeParentTransform?: boolean) {\n this._exitGroup(object, removeParentTransform);\n // return to parent\n object.parent && object.parent._enterGroup(object, true);\n }\n\n /**\n * @private\n * @param {'added'|'removed'} type\n * @param {FabricObject[]} targets\n */\n _onAfterObjectsChange(type: 'added' | 'removed', targets: FabricObject[]) {\n super._onAfterObjectsChange(type, targets);\n const groups = new Set();\n targets.forEach((object) => {\n const { parent } = object;\n parent && groups.add(parent);\n });\n if (type === LAYOUT_TYPE_REMOVED) {\n // invalidate groups' layout and mark as dirty\n groups.forEach((group) => {\n group._onAfterObjectsChange(LAYOUT_TYPE_ADDED, targets);\n });\n } else {\n // mark groups as dirty\n groups.forEach((group) => {\n group._set('dirty', true);\n });\n }\n }\n\n /**\n * @override remove all objects\n */\n onDeselect() {\n this.removeAll();\n return false;\n }\n\n /**\n * Returns string representation of a group\n * @return {String}\n */\n toString() {\n return `#`;\n }\n\n /**\n * Decide if the object should cache or not. The Active selection never caches\n * @return {Boolean}\n */\n shouldCache() {\n return false;\n }\n\n /**\n * Check if this group or its parent group are caching, recursively up\n * @return {Boolean}\n */\n isOnACache() {\n return false;\n }\n\n /**\n * Renders controls and borders for the object\n * @param {CanvasRenderingContext2D} ctx Context to render on\n * @param {Object} [styleOverride] properties to override the object style\n * @param {Object} [childrenOverride] properties to override the children overrides\n */\n _renderControls(\n ctx: CanvasRenderingContext2D,\n styleOverride?: ControlRenderingStyleOverride,\n childrenOverride?: ControlRenderingStyleOverride,\n ) {\n ctx.save();\n ctx.globalAlpha = this.isMoving ? this.borderOpacityWhenMoving : 1;\n const options = {\n hasControls: false,\n ...childrenOverride,\n forActiveSelection: true,\n };\n for (let i = 0; i < this._objects.length; i++) {\n this._objects[i]._renderControls(ctx, options);\n }\n super._renderControls(ctx, styleOverride);\n ctx.restore();\n }\n}\n\nclassRegistry.setClass(ActiveSelection);\nclassRegistry.setClass(ActiveSelection, 'activeSelection');\n","/**\n * Canvas 2D filter backend.\n */\nimport type { BaseFilter } from './BaseFilter';\nimport type { T2DPipelineState, TPipelineResources } from './typedefs';\n\nexport class Canvas2dFilterBackend {\n /**\n * Experimental. This object is a sort of repository of help layers used to avoid\n * of recreating them during frequent filtering. If you are previewing a filter with\n * a slider you probably do not want to create help layers every filter step.\n * in this object there will be appended some canvases, created once, resized sometimes\n * cleared never. Clearing is left to the developer.\n **/\n resources: TPipelineResources = {};\n\n /**\n * Apply a set of filters against a source image and draw the filtered output\n * to the provided destination canvas.\n *\n * @param {EnhancedFilter} filters The filter to apply.\n * @param {HTMLImageElement|HTMLCanvasElement} sourceElement The source to be filtered.\n * @param {Number} sourceWidth The width of the source input.\n * @param {Number} sourceHeight The height of the source input.\n * @param {HTMLCanvasElement} targetCanvas The destination for filtered output to be drawn.\n */\n applyFilters(\n filters: BaseFilter>[],\n sourceElement: CanvasImageSource,\n sourceWidth: number,\n sourceHeight: number,\n targetCanvas: HTMLCanvasElement,\n ): T2DPipelineState | void {\n const ctx = targetCanvas.getContext('2d', {\n willReadFrequently: true,\n desynchronized: true,\n });\n if (!ctx) {\n return;\n }\n ctx.drawImage(sourceElement, 0, 0, sourceWidth, sourceHeight);\n const imageData = ctx.getImageData(0, 0, sourceWidth, sourceHeight);\n const originalImageData = ctx.getImageData(0, 0, sourceWidth, sourceHeight);\n const pipelineState: T2DPipelineState = {\n sourceWidth,\n sourceHeight,\n imageData,\n originalEl: sourceElement,\n originalImageData,\n canvasEl: targetCanvas,\n ctx,\n filterBackend: this,\n };\n filters.forEach((filter) => {\n filter.applyTo(pipelineState);\n });\n const { imageData: imageDataPostFilter } = pipelineState;\n if (\n imageDataPostFilter.width !== sourceWidth ||\n imageDataPostFilter.height !== sourceHeight\n ) {\n targetCanvas.width = imageDataPostFilter.width;\n targetCanvas.height = imageDataPostFilter.height;\n }\n ctx.putImageData(imageDataPostFilter, 0, 0);\n return pipelineState;\n }\n}\n","import { config } from '../config';\nimport { createCanvasElementFor } from '../util/misc/dom';\nimport type {\n TWebGLPipelineState,\n TProgramCache,\n TTextureCache,\n TPipelineResources,\n} from './typedefs';\nimport type { BaseFilter } from './BaseFilter';\n\nexport class WebGLFilterBackend {\n declare tileSize: number;\n\n /**\n * Define ...\n **/\n aPosition: Float32Array = new Float32Array([0, 0, 0, 1, 1, 0, 1, 1]);\n\n /**\n * If GLPut data is the fastest operation, or if forced, this buffer will be used\n * to transfer the data back in the 2d logic\n **/\n declare imageBuffer?: ArrayBuffer;\n\n declare canvas: HTMLCanvasElement;\n\n /**\n * The Webgl context that will execute the operations for filtering\n **/\n declare gl: WebGLRenderingContext;\n\n /**\n * Keyed map for shader cache\n **/\n declare programCache: TProgramCache;\n\n /**\n * Keyed map for texture cache\n **/\n declare textureCache: TTextureCache;\n\n /**\n * Contains GPU info for debug\n **/\n declare gpuInfo: any;\n\n /**\n * Experimental. This object is a sort of repository of help layers used to avoid\n * of recreating them during frequent filtering. If you are previewing a filter with\n * a slider you probably do not want to create help layers every filter step.\n * in this object there will be appended some canvases, created once, resized sometimes\n * cleared never. Clearing is left to the developer.\n **/\n resources: TPipelineResources = {};\n\n constructor({ tileSize = config.textureSize } = {}) {\n this.tileSize = tileSize;\n this.setupGLContext(tileSize, tileSize);\n this.captureGPUInfo();\n }\n\n /**\n * Setup a WebGL context suitable for filtering, and bind any needed event handlers.\n */\n setupGLContext(width: number, height: number): void {\n this.dispose();\n this.createWebGLCanvas(width, height);\n }\n\n /**\n * Create a canvas element and associated WebGL context and attaches them as\n * class properties to the GLFilterBackend class.\n */\n createWebGLCanvas(width: number, height: number): void {\n const canvas = createCanvasElementFor({ width, height });\n const glOptions = {\n alpha: true,\n premultipliedAlpha: false,\n depth: false,\n stencil: false,\n antialias: false,\n },\n gl = canvas.getContext('webgl', glOptions) as WebGLRenderingContext;\n\n if (!gl) {\n return;\n }\n gl.clearColor(0, 0, 0, 0);\n // this canvas can fire webglcontextlost and webglcontextrestored\n this.canvas = canvas;\n this.gl = gl;\n }\n\n /**\n * Attempts to apply the requested filters to the source provided, drawing the filtered output\n * to the provided target canvas.\n *\n * @param {Array} filters The filters to apply.\n * @param {TexImageSource} source The source to be filtered.\n * @param {Number} width The width of the source input.\n * @param {Number} height The height of the source input.\n * @param {HTMLCanvasElement} targetCanvas The destination for filtered output to be drawn.\n * @param {String|undefined} cacheKey A key used to cache resources related to the source. If\n * omitted, caching will be skipped.\n */\n applyFilters(\n filters: BaseFilter>[],\n source: TexImageSource,\n width: number,\n height: number,\n targetCanvas: HTMLCanvasElement,\n cacheKey?: string,\n ): TWebGLPipelineState | undefined {\n const gl = this.gl;\n const ctx = targetCanvas.getContext('2d');\n if (!gl || !ctx) {\n return;\n }\n let cachedTexture;\n if (cacheKey) {\n cachedTexture = this.getCachedTexture(cacheKey, source);\n }\n const pipelineState: TWebGLPipelineState = {\n originalWidth:\n (source as HTMLImageElement).width ||\n (source as HTMLImageElement).naturalWidth ||\n 0,\n originalHeight:\n (source as HTMLImageElement).height ||\n (source as HTMLImageElement).naturalHeight ||\n 0,\n sourceWidth: width,\n sourceHeight: height,\n destinationWidth: width,\n destinationHeight: height,\n context: gl,\n sourceTexture: this.createTexture(\n gl,\n width,\n height,\n !cachedTexture ? source : undefined,\n ),\n targetTexture: this.createTexture(gl, width, height),\n originalTexture:\n cachedTexture ||\n this.createTexture(\n gl,\n width,\n height,\n !cachedTexture ? source : undefined,\n ),\n passes: filters.length,\n webgl: true,\n aPosition: this.aPosition,\n programCache: this.programCache,\n pass: 0,\n filterBackend: this,\n targetCanvas: targetCanvas,\n };\n const tempFbo = gl.createFramebuffer();\n gl.bindFramebuffer(gl.FRAMEBUFFER, tempFbo);\n filters.forEach((filter: any) => {\n filter && filter.applyTo(pipelineState);\n });\n resizeCanvasIfNeeded(pipelineState);\n this.copyGLTo2D(gl, pipelineState);\n gl.bindTexture(gl.TEXTURE_2D, null);\n gl.deleteTexture(pipelineState.sourceTexture);\n gl.deleteTexture(pipelineState.targetTexture);\n gl.deleteFramebuffer(tempFbo);\n ctx.setTransform(1, 0, 0, 1, 0, 0);\n return pipelineState;\n }\n\n /**\n * Detach event listeners, remove references, and clean up caches.\n */\n dispose() {\n if (this.canvas) {\n // we are disposing, we don't care about the fact\n // that the canvas shouldn't be null.\n // @ts-expect-error disposing\n this.canvas = null;\n // @ts-expect-error disposing\n this.gl = null;\n }\n this.clearWebGLCaches();\n }\n\n /**\n * Wipe out WebGL-related caches.\n */\n clearWebGLCaches() {\n this.programCache = {};\n this.textureCache = {};\n }\n\n /**\n * Create a WebGL texture object.\n *\n * Accepts specific dimensions to initialize the texture to or a source image.\n *\n * @param {WebGLRenderingContext} gl The GL context to use for creating the texture.\n * @param {number} width The width to initialize the texture at.\n * @param {number} height The height to initialize the texture.\n * @param {TexImageSource} textureImageSource A source for the texture data.\n * @param {number} filter gl.NEAREST default or gl.LINEAR filters for the texture.\n * This filter is very useful for LUTs filters. If you need interpolation use gl.LINEAR\n * @returns {WebGLTexture}\n */\n createTexture(\n gl: WebGLRenderingContext,\n width: number,\n height: number,\n textureImageSource?: TexImageSource,\n filter?:\n | WebGLRenderingContextBase['NEAREST']\n | WebGLRenderingContextBase['LINEAR'],\n ) {\n const {\n NEAREST,\n TEXTURE_2D,\n RGBA,\n UNSIGNED_BYTE,\n CLAMP_TO_EDGE,\n TEXTURE_MAG_FILTER,\n TEXTURE_MIN_FILTER,\n TEXTURE_WRAP_S,\n TEXTURE_WRAP_T,\n } = gl;\n const texture = gl.createTexture();\n gl.bindTexture(TEXTURE_2D, texture);\n gl.texParameteri(TEXTURE_2D, TEXTURE_MAG_FILTER, filter || NEAREST);\n gl.texParameteri(TEXTURE_2D, TEXTURE_MIN_FILTER, filter || NEAREST);\n gl.texParameteri(TEXTURE_2D, TEXTURE_WRAP_S, CLAMP_TO_EDGE);\n gl.texParameteri(TEXTURE_2D, TEXTURE_WRAP_T, CLAMP_TO_EDGE);\n if (textureImageSource) {\n gl.texImage2D(\n TEXTURE_2D,\n 0,\n RGBA,\n RGBA,\n UNSIGNED_BYTE,\n textureImageSource,\n );\n } else {\n gl.texImage2D(\n TEXTURE_2D,\n 0,\n RGBA,\n width,\n height,\n 0,\n RGBA,\n UNSIGNED_BYTE,\n null,\n );\n }\n return texture;\n }\n\n /**\n * Can be optionally used to get a texture from the cache array\n *\n * If an existing texture is not found, a new texture is created and cached.\n *\n * @param {String} uniqueId A cache key to use to find an existing texture.\n * @param {HTMLImageElement|HTMLCanvasElement} textureImageSource A source to use to create the\n * texture cache entry if one does not already exist.\n */\n getCachedTexture(\n uniqueId: string,\n textureImageSource: TexImageSource,\n filter?:\n | WebGLRenderingContextBase['NEAREST']\n | WebGLRenderingContextBase['LINEAR'],\n ): WebGLTexture | null {\n const { textureCache } = this;\n if (textureCache[uniqueId]) {\n return textureCache[uniqueId];\n } else {\n const texture = this.createTexture(\n this.gl,\n (textureImageSource as HTMLImageElement).width,\n (textureImageSource as HTMLImageElement).height,\n textureImageSource,\n filter,\n );\n if (texture) {\n textureCache[uniqueId] = texture;\n }\n return texture;\n }\n }\n\n /**\n * Clear out cached resources related to a source image that has been\n * filtered previously.\n *\n * @param {String} cacheKey The cache key provided when the source image was filtered.\n */\n evictCachesForKey(cacheKey: string) {\n if (this.textureCache[cacheKey]) {\n this.gl.deleteTexture(this.textureCache[cacheKey]);\n delete this.textureCache[cacheKey];\n }\n }\n\n /**\n * Copy an input WebGL canvas on to an output 2D canvas.\n *\n * The WebGL canvas is assumed to be upside down, with the top-left pixel of the\n * desired output image appearing in the bottom-left corner of the WebGL canvas.\n *\n * @param {WebGLRenderingContext} sourceContext The WebGL context to copy from.\n * @param {Object} pipelineState The 2D target canvas to copy on to.\n */\n copyGLTo2D(gl: WebGLRenderingContext, pipelineState: TWebGLPipelineState) {\n const glCanvas = gl.canvas,\n targetCanvas = pipelineState.targetCanvas,\n ctx = targetCanvas.getContext('2d');\n if (!ctx) {\n return;\n }\n ctx.translate(0, targetCanvas.height); // move it down again\n ctx.scale(1, -1); // vertical flip\n // where is my image on the big glcanvas?\n const sourceY = glCanvas.height - targetCanvas.height;\n ctx.drawImage(\n glCanvas,\n 0,\n sourceY,\n targetCanvas.width,\n targetCanvas.height,\n 0,\n 0,\n targetCanvas.width,\n targetCanvas.height,\n );\n }\n\n /**\n * Copy an input WebGL canvas on to an output 2D canvas using 2d canvas' putImageData\n * API. Measurably faster than using ctx.drawImage in Firefox (version 54 on OSX Sierra).\n *\n * @param {WebGLRenderingContext} sourceContext The WebGL context to copy from.\n * @param {HTMLCanvasElement} targetCanvas The 2D target canvas to copy on to.\n * @param {Object} pipelineState The 2D target canvas to copy on to.\n */\n copyGLTo2DPutImageData(\n this: Required,\n gl: WebGLRenderingContext,\n pipelineState: TWebGLPipelineState,\n ) {\n const targetCanvas = pipelineState.targetCanvas,\n ctx = targetCanvas.getContext('2d'),\n dWidth = pipelineState.destinationWidth,\n dHeight = pipelineState.destinationHeight,\n numBytes = dWidth * dHeight * 4;\n if (!ctx) {\n return;\n }\n const u8 = new Uint8Array(this.imageBuffer, 0, numBytes);\n const u8Clamped = new Uint8ClampedArray(this.imageBuffer, 0, numBytes);\n\n gl.readPixels(0, 0, dWidth, dHeight, gl.RGBA, gl.UNSIGNED_BYTE, u8);\n const imgData = new ImageData(u8Clamped, dWidth, dHeight);\n ctx.putImageData(imgData, 0, 0);\n }\n\n /**\n * Attempt to extract GPU information strings from a WebGL context.\n *\n * Useful information when debugging or blacklisting specific GPUs.\n *\n * @returns {Object} A GPU info object with renderer and vendor strings.\n */\n captureGPUInfo() {\n if (this.gpuInfo) {\n return this.gpuInfo;\n }\n const gl = this.gl,\n gpuInfo = { renderer: '', vendor: '' };\n if (!gl) {\n return gpuInfo;\n }\n const ext = gl.getExtension('WEBGL_debug_renderer_info');\n if (ext) {\n const renderer = gl.getParameter(ext.UNMASKED_RENDERER_WEBGL);\n const vendor = gl.getParameter(ext.UNMASKED_VENDOR_WEBGL);\n if (renderer) {\n gpuInfo.renderer = renderer.toLowerCase();\n }\n if (vendor) {\n gpuInfo.vendor = vendor.toLowerCase();\n }\n }\n this.gpuInfo = gpuInfo;\n return gpuInfo;\n }\n}\n\nfunction resizeCanvasIfNeeded(pipelineState: TWebGLPipelineState): void {\n const targetCanvas = pipelineState.targetCanvas,\n width = targetCanvas.width,\n height = targetCanvas.height,\n dWidth = pipelineState.destinationWidth,\n dHeight = pipelineState.destinationHeight;\n\n if (width !== dWidth || height !== dHeight) {\n targetCanvas.width = dWidth;\n targetCanvas.height = dHeight;\n }\n}\n","import { config } from '../config';\nimport { getEnv } from '../env';\nimport { createCanvasElement } from '../util/misc/dom';\nimport { Canvas2dFilterBackend } from './Canvas2dFilterBackend';\nimport { WebGLFilterBackend } from './WebGLFilterBackend';\n\nexport type FilterBackend = WebGLFilterBackend | Canvas2dFilterBackend;\n\nlet filterBackend: FilterBackend;\n\n/**\n * Verifies if it is possible to initialize webgl or fallback on a canvas2d filtering backend\n */\nexport function initFilterBackend(): FilterBackend {\n const { WebGLProbe } = getEnv();\n WebGLProbe.queryWebGL(createCanvasElement());\n if (config.enableGLFiltering && WebGLProbe.isSupported(config.textureSize)) {\n return new WebGLFilterBackend({ tileSize: config.textureSize });\n } else {\n return new Canvas2dFilterBackend();\n }\n}\n\n/**\n * Get the current fabricJS filter backend or initialize one if not available yet\n * @param [strict] pass `true` to create the backend if it wasn't created yet (default behavior),\n * pass `false` to get the backend ref without mutating it\n */\nexport function getFilterBackend(strict = true): FilterBackend {\n if (!filterBackend && strict) {\n filterBackend = initFilterBackend();\n }\n return filterBackend;\n}\n\nexport function setFilterBackend(backend: FilterBackend) {\n filterBackend = backend;\n}\n","import { getFabricDocument, getEnv } from '../env';\nimport type { BaseFilter } from '../filters/BaseFilter';\nimport { getFilterBackend } from '../filters/FilterBackend';\nimport { SHARED_ATTRIBUTES } from '../parser/attributes';\nimport { parseAttributes } from '../parser/parseAttributes';\nimport type {\n TClassProperties,\n TCrossOrigin,\n TSize,\n Abortable,\n TOptions,\n} from '../typedefs';\nimport { uid } from '../util/internals/uid';\nimport { createCanvasElementFor } from '../util/misc/dom';\nimport { findScaleToCover, findScaleToFit } from '../util/misc/findScaleTo';\nimport type { LoadImageOptions } from '../util/misc/objectEnlive';\nimport {\n enlivenObjectEnlivables,\n enlivenObjects,\n loadImage,\n} from '../util/misc/objectEnlive';\nimport { parsePreserveAspectRatioAttribute } from '../util/misc/svgParsing';\nimport { classRegistry } from '../ClassRegistry';\nimport { FabricObject, cacheProperties } from './Object/FabricObject';\nimport type { FabricObjectProps, SerializedObjectProps } from './Object/types';\nimport type { ObjectEvents } from '../EventTypeDefs';\nimport { WebGLFilterBackend } from '../filters/WebGLFilterBackend';\nimport { FILL, NONE } from '../constants';\nimport { getDocumentFromElement } from '../util/dom_misc';\nimport type { CSSRules } from '../parser/typedefs';\nimport type { Resize, ResizeSerializedProps } from '../filters/Resize';\nimport type { TCachedFabricObject } from './Object/Object';\nimport { log } from '../util/internals/console';\n\n// @todo Would be nice to have filtering code not imported directly.\n\nexport type ImageSource =\n | HTMLImageElement\n | HTMLVideoElement\n | HTMLCanvasElement;\n\ninterface UniqueImageProps {\n srcFromAttribute: boolean;\n minimumScaleTrigger: number;\n cropX: number;\n cropY: number;\n imageSmoothing: boolean;\n filters: BaseFilter>[];\n resizeFilter?: Resize;\n}\n\nexport const imageDefaultValues: Partial> = {\n strokeWidth: 0,\n srcFromAttribute: false,\n minimumScaleTrigger: 0.5,\n cropX: 0,\n cropY: 0,\n imageSmoothing: true,\n};\n\nexport interface SerializedImageProps extends SerializedObjectProps {\n src: string;\n crossOrigin: TCrossOrigin;\n filters: any[];\n resizeFilter?: ResizeSerializedProps;\n cropX: number;\n cropY: number;\n}\n\nexport interface ImageProps extends FabricObjectProps, UniqueImageProps {}\n\nconst IMAGE_PROPS = ['cropX', 'cropY'] as const;\n\n/**\n * @tutorial {@link http://fabricjs.com/fabric-intro-part-1#images}\n */\nexport class FabricImage<\n Props extends TOptions = Partial,\n SProps extends SerializedImageProps = SerializedImageProps,\n EventSpec extends ObjectEvents = ObjectEvents,\n >\n extends FabricObject\n implements ImageProps\n{\n /**\n * When calling {@link FabricImage.getSrc}, return value from element src with `element.getAttribute('src')`.\n * This allows for relative urls as image src.\n * @since 2.7.0\n * @type Boolean\n * @default false\n */\n declare srcFromAttribute: boolean;\n\n /**\n * private\n * contains last value of scaleX to detect\n * if the Image got resized after the last Render\n * @type Number\n */\n protected _lastScaleX = 1;\n\n /**\n * private\n * contains last value of scaleY to detect\n * if the Image got resized after the last Render\n * @type Number\n */\n protected _lastScaleY = 1;\n\n /**\n * private\n * contains last value of scaling applied by the apply filter chain\n * @type Number\n */\n protected _filterScalingX = 1;\n\n /**\n * private\n * contains last value of scaling applied by the apply filter chain\n * @type Number\n */\n protected _filterScalingY = 1;\n\n /**\n * minimum scale factor under which any resizeFilter is triggered to resize the image\n * 0 will disable the automatic resize. 1 will trigger automatically always.\n * number bigger than 1 are not implemented yet.\n * @type Number\n */\n declare minimumScaleTrigger: number;\n\n /**\n * key used to retrieve the texture representing this image\n * @since 2.0.0\n * @type String\n */\n declare cacheKey: string;\n\n /**\n * Image crop in pixels from original image size.\n * @since 2.0.0\n * @type Number\n */\n declare cropX: number;\n\n /**\n * Image crop in pixels from original image size.\n * @since 2.0.0\n * @type Number\n */\n declare cropY: number;\n\n /**\n * Indicates whether this canvas will use image smoothing when painting this image.\n * Also influence if the cacheCanvas for this image uses imageSmoothing\n * @since 4.0.0-beta.11\n * @type Boolean\n */\n declare imageSmoothing: boolean;\n\n declare preserveAspectRatio: string;\n\n declare protected src: string;\n\n declare filters: BaseFilter>[];\n declare resizeFilter: Resize;\n\n declare _element: ImageSource;\n declare _filteredEl?: HTMLCanvasElement;\n declare _originalElement: ImageSource;\n\n static type = 'Image';\n\n static cacheProperties = [...cacheProperties, ...IMAGE_PROPS];\n\n static ownDefaults = imageDefaultValues;\n\n static getDefaults(): Record {\n return {\n ...super.getDefaults(),\n ...FabricImage.ownDefaults,\n };\n }\n /**\n * Constructor\n * Image can be initialized with any canvas drawable or a string.\n * The string should be a url and will be loaded as an image.\n * Canvas and Image element work out of the box, while videos require extra code to work.\n * Please check video element events for seeking.\n * @param {ImageSource | string} element Image element\n * @param {Object} [options] Options object\n */\n constructor(elementId: string, options?: Props);\n constructor(element: ImageSource, options?: Props);\n constructor(arg0: ImageSource | string, options?: Props) {\n super();\n this.filters = [];\n Object.assign(this, FabricImage.ownDefaults);\n this.setOptions(options);\n this.cacheKey = `texture${uid()}`;\n this.setElement(\n typeof arg0 === 'string'\n ? ((\n (this.canvas && getDocumentFromElement(this.canvas.getElement())) ||\n getFabricDocument()\n ).getElementById(arg0) as ImageSource)\n : arg0,\n options,\n );\n }\n\n /**\n * Returns image element which this instance if based on\n */\n getElement() {\n return this._element;\n }\n\n /**\n * Sets image element for this instance to a specified one.\n * If filters defined they are applied to new image.\n * You might need to call `canvas.renderAll` and `object.setCoords` after replacing, to render new image and update controls area.\n * @param {HTMLImageElement} element\n * @param {Partial} [size] Options object\n */\n setElement(element: ImageSource, size: Partial = {}) {\n this.removeTexture(this.cacheKey);\n this.removeTexture(`${this.cacheKey}_filtered`);\n this._element = element;\n this._originalElement = element;\n this._setWidthHeight(size);\n if (this.filters.length !== 0) {\n this.applyFilters();\n }\n // resizeFilters work on the already filtered copy.\n // we need to apply resizeFilters AFTER normal filters.\n // applyResizeFilters is run more often than normal filters\n // and is triggered by user interactions rather than dev code\n if (this.resizeFilter) {\n this.applyResizeFilters();\n }\n }\n\n /**\n * Delete a single texture if in webgl mode\n */\n removeTexture(key: string) {\n const backend = getFilterBackend(false);\n if (backend instanceof WebGLFilterBackend) {\n backend.evictCachesForKey(key);\n }\n }\n\n /**\n * Delete textures, reference to elements and eventually JSDOM cleanup\n */\n dispose() {\n super.dispose();\n this.removeTexture(this.cacheKey);\n this.removeTexture(`${this.cacheKey}_filtered`);\n this._cacheContext = null;\n (\n ['_originalElement', '_element', '_filteredEl', '_cacheCanvas'] as const\n ).forEach((elementKey) => {\n const el = this[elementKey];\n el && getEnv().dispose(el);\n // @ts-expect-error disposing\n this[elementKey] = undefined;\n });\n }\n\n /**\n * Get the crossOrigin value (of the corresponding image element)\n */\n getCrossOrigin(): string | null {\n return (\n this._originalElement &&\n ((this._originalElement as any).crossOrigin || null)\n );\n }\n\n /**\n * Returns original size of an image\n */\n getOriginalSize() {\n const element = this.getElement() as any;\n if (!element) {\n return {\n width: 0,\n height: 0,\n };\n }\n return {\n width: element.naturalWidth || element.width,\n height: element.naturalHeight || element.height,\n };\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _stroke(ctx: CanvasRenderingContext2D) {\n if (!this.stroke || this.strokeWidth === 0) {\n return;\n }\n const w = this.width / 2,\n h = this.height / 2;\n ctx.beginPath();\n ctx.moveTo(-w, -h);\n ctx.lineTo(w, -h);\n ctx.lineTo(w, h);\n ctx.lineTo(-w, h);\n ctx.lineTo(-w, -h);\n ctx.closePath();\n }\n\n /**\n * Returns object representation of an instance\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} Object representation of an instance\n */\n toObject<\n T extends Omit, keyof SProps>,\n K extends keyof T = never,\n >(propertiesToInclude: K[] = []): Pick & SProps {\n const filters: Record[] = [];\n this.filters.forEach((filterObj) => {\n filterObj && filters.push(filterObj.toObject());\n });\n return {\n ...super.toObject([...IMAGE_PROPS, ...propertiesToInclude]),\n src: this.getSrc(),\n crossOrigin: this.getCrossOrigin(),\n filters,\n ...(this.resizeFilter\n ? { resizeFilter: this.resizeFilter.toObject() }\n : {}),\n };\n }\n\n /**\n * Returns true if an image has crop applied, inspecting values of cropX,cropY,width,height.\n * @return {Boolean}\n */\n hasCrop() {\n return (\n !!this.cropX ||\n !!this.cropY ||\n this.width < this._element.width ||\n this.height < this._element.height\n );\n }\n\n /**\n * Returns svg representation of an instance\n * @return {string[]} an array of strings with the specific svg representation\n * of the instance\n */\n _toSVG() {\n const imageMarkup: string[] = [],\n element = this._element,\n x = -this.width / 2,\n y = -this.height / 2;\n let svgString: string[] = [],\n strokeSvg: string[] = [],\n clipPath = '',\n imageRendering = '';\n if (!element) {\n return [];\n }\n if (this.hasCrop()) {\n const clipPathId = uid();\n svgString.push(\n '\\n',\n '\\t\\n',\n '\\n',\n );\n clipPath = ' clip-path=\"url(#imageCrop_' + clipPathId + ')\" ';\n }\n if (!this.imageSmoothing) {\n imageRendering = ' image-rendering=\"optimizeSpeed\"';\n }\n imageMarkup.push(\n '\\t element with actual transformation, then offsetting object to the top/left\n // so that object's center aligns with container's left/top\n }\" width=\"${\n element.width || (element as HTMLImageElement).naturalWidth\n }\" height=\"${\n element.height || (element as HTMLImageElement).naturalHeight\n }\"${imageRendering}${clipPath}>\\n`,\n );\n\n if (this.stroke || this.strokeDashArray) {\n const origFill = this.fill;\n this.fill = null;\n strokeSvg = [\n `\\t\\n`,\n ];\n this.fill = origFill;\n }\n if (this.paintFirst !== FILL) {\n svgString = svgString.concat(strokeSvg, imageMarkup);\n } else {\n svgString = svgString.concat(imageMarkup, strokeSvg);\n }\n return svgString;\n }\n\n /**\n * Returns source of an image\n * @param {Boolean} filtered indicates if the src is needed for svg\n * @return {String} Source of an image\n */\n getSrc(filtered?: boolean): string {\n const element = filtered ? this._element : this._originalElement;\n if (element) {\n if ((element as HTMLCanvasElement).toDataURL) {\n return (element as HTMLCanvasElement).toDataURL();\n }\n\n if (this.srcFromAttribute) {\n return element.getAttribute('src') || '';\n } else {\n return (element as HTMLImageElement).src;\n }\n } else {\n return this.src || '';\n }\n }\n\n /**\n * Alias for getSrc\n * @param filtered\n * @deprecated\n */\n getSvgSrc(filtered?: boolean) {\n return this.getSrc(filtered);\n }\n\n /**\n * Loads and sets source of an image\\\n * **IMPORTANT**: It is recommended to abort loading tasks before calling this method to prevent race conditions and unnecessary networking\n * @param {String} src Source string (URL)\n * @param {LoadImageOptions} [options] Options object\n */\n setSrc(src: string, { crossOrigin, signal }: LoadImageOptions = {}) {\n return loadImage(src, { crossOrigin, signal }).then((img) => {\n typeof crossOrigin !== 'undefined' && this.set({ crossOrigin });\n this.setElement(img);\n });\n }\n\n /**\n * Returns string representation of an instance\n * @return {String} String representation of an instance\n */\n toString() {\n return `#`;\n }\n\n applyResizeFilters() {\n const filter = this.resizeFilter,\n minimumScale = this.minimumScaleTrigger,\n objectScale = this.getTotalObjectScaling(),\n scaleX = objectScale.x,\n scaleY = objectScale.y,\n elementToFilter = this._filteredEl || this._originalElement;\n if (this.group) {\n this.set('dirty', true);\n }\n if (!filter || (scaleX > minimumScale && scaleY > minimumScale)) {\n this._element = elementToFilter;\n this._filterScalingX = 1;\n this._filterScalingY = 1;\n this._lastScaleX = scaleX;\n this._lastScaleY = scaleY;\n return;\n }\n const canvasEl = createCanvasElementFor(elementToFilter),\n { width, height } = elementToFilter;\n this._element = canvasEl;\n this._lastScaleX = filter.scaleX = scaleX;\n this._lastScaleY = filter.scaleY = scaleY;\n getFilterBackend().applyFilters(\n [filter],\n elementToFilter,\n width,\n height,\n this._element,\n );\n this._filterScalingX = canvasEl.width / this._originalElement.width;\n this._filterScalingY = canvasEl.height / this._originalElement.height;\n }\n\n /**\n * Applies filters assigned to this image (from \"filters\" array) or from filter param\n * @method applyFilters\n * @param {Array} filters to be applied\n * @param {Boolean} forResizing specify if the filter operation is a resize operation\n */\n applyFilters(\n filters: BaseFilter>[] = this.filters || [],\n ) {\n filters = filters.filter((filter) => filter && !filter.isNeutralState());\n this.set('dirty', true);\n\n // needs to clear out or WEBGL will not resize correctly\n this.removeTexture(`${this.cacheKey}_filtered`);\n\n if (filters.length === 0) {\n this._element = this._originalElement;\n // this is unsafe and needs to be rethinkend\n this._filteredEl = undefined;\n this._filterScalingX = 1;\n this._filterScalingY = 1;\n return;\n }\n\n const imgElement = this._originalElement,\n sourceWidth =\n (imgElement as HTMLImageElement).naturalWidth || imgElement.width,\n sourceHeight =\n (imgElement as HTMLImageElement).naturalHeight || imgElement.height;\n\n if (this._element === this._originalElement) {\n // if the _element a reference to _originalElement\n // we need to create a new element to host the filtered pixels\n const canvasEl = createCanvasElementFor({\n width: sourceWidth,\n height: sourceHeight,\n });\n this._element = canvasEl;\n this._filteredEl = canvasEl;\n } else if (this._filteredEl) {\n // if the _element is it own element,\n // and we also have a _filteredEl, then we clean up _filteredEl\n // and we assign it to _element.\n // in this way we invalidate the eventual old resize filtered element\n this._element = this._filteredEl;\n this._filteredEl\n .getContext('2d')!\n .clearRect(0, 0, sourceWidth, sourceHeight);\n // we also need to resize again at next renderAll, so remove saved _lastScaleX/Y\n this._lastScaleX = 1;\n this._lastScaleY = 1;\n }\n getFilterBackend().applyFilters(\n filters,\n this._originalElement,\n sourceWidth,\n sourceHeight,\n this._element as HTMLCanvasElement,\n this.cacheKey,\n );\n if (\n this._originalElement.width !== this._element.width ||\n this._originalElement.height !== this._element.height\n ) {\n this._filterScalingX = this._element.width / this._originalElement.width;\n this._filterScalingY =\n this._element.height / this._originalElement.height;\n }\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _render(ctx: CanvasRenderingContext2D) {\n ctx.imageSmoothingEnabled = this.imageSmoothing;\n if (this.isMoving !== true && this.resizeFilter && this._needsResize()) {\n this.applyResizeFilters();\n }\n this._stroke(ctx);\n this._renderPaintInOrder(ctx);\n }\n\n /**\n * Paint the cached copy of the object on the target context.\n * it will set the imageSmoothing for the draw operation\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n drawCacheOnCanvas(\n this: TCachedFabricObject,\n ctx: CanvasRenderingContext2D,\n ) {\n ctx.imageSmoothingEnabled = this.imageSmoothing;\n super.drawCacheOnCanvas(ctx);\n }\n\n /**\n * Decide if the FabricImage should cache or not. Create its own cache level\n * needsItsOwnCache should be used when the object drawing method requires\n * a cache step.\n * Generally you do not cache objects in groups because the group outside is cached.\n * This is the special Image version where we would like to avoid caching where possible.\n * Essentially images do not benefit from caching. They may require caching, and in that\n * case we do it. Also caching an image usually ends in a loss of details.\n * A full performance audit should be done.\n * @return {Boolean}\n */\n shouldCache() {\n return this.needsItsOwnCache();\n }\n\n _renderFill(ctx: CanvasRenderingContext2D) {\n const elementToDraw = this._element;\n if (!elementToDraw) {\n return;\n }\n const scaleX = this._filterScalingX,\n scaleY = this._filterScalingY,\n w = this.width,\n h = this.height,\n // crop values cannot be lesser than 0.\n cropX = Math.max(this.cropX, 0),\n cropY = Math.max(this.cropY, 0),\n elWidth =\n (elementToDraw as HTMLImageElement).naturalWidth || elementToDraw.width,\n elHeight =\n (elementToDraw as HTMLImageElement).naturalHeight ||\n elementToDraw.height,\n sX = cropX * scaleX,\n sY = cropY * scaleY,\n // the width height cannot exceed element width/height, starting from the crop offset.\n sW = Math.min(w * scaleX, elWidth - sX),\n sH = Math.min(h * scaleY, elHeight - sY),\n x = -w / 2,\n y = -h / 2,\n maxDestW = Math.min(w, elWidth / scaleX - cropX),\n maxDestH = Math.min(h, elHeight / scaleY - cropY);\n\n elementToDraw &&\n ctx.drawImage(elementToDraw, sX, sY, sW, sH, x, y, maxDestW, maxDestH);\n }\n\n /**\n * needed to check if image needs resize\n * @private\n */\n _needsResize() {\n const scale = this.getTotalObjectScaling();\n return scale.x !== this._lastScaleX || scale.y !== this._lastScaleY;\n }\n\n /**\n * @private\n * @deprecated unused\n */\n _resetWidthHeight() {\n this.set(this.getOriginalSize());\n }\n\n /**\n * @private\n * Set the width and the height of the image object, using the element or the\n * options.\n */\n _setWidthHeight({ width, height }: Partial = {}) {\n const size = this.getOriginalSize();\n this.width = width || size.width;\n this.height = height || size.height;\n }\n\n /**\n * Calculate offset for center and scale factor for the image in order to respect\n * the preserveAspectRatio attribute\n * @private\n */\n parsePreserveAspectRatioAttribute() {\n const pAR = parsePreserveAspectRatioAttribute(\n this.preserveAspectRatio || '',\n ),\n pWidth = this.width,\n pHeight = this.height,\n parsedAttributes = { width: pWidth, height: pHeight };\n let rWidth = this._element.width,\n rHeight = this._element.height,\n scaleX = 1,\n scaleY = 1,\n offsetLeft = 0,\n offsetTop = 0,\n cropX = 0,\n cropY = 0,\n offset;\n\n if (pAR && (pAR.alignX !== NONE || pAR.alignY !== NONE)) {\n if (pAR.meetOrSlice === 'meet') {\n scaleX = scaleY = findScaleToFit(this._element, parsedAttributes);\n offset = (pWidth - rWidth * scaleX) / 2;\n if (pAR.alignX === 'Min') {\n offsetLeft = -offset;\n }\n if (pAR.alignX === 'Max') {\n offsetLeft = offset;\n }\n offset = (pHeight - rHeight * scaleY) / 2;\n if (pAR.alignY === 'Min') {\n offsetTop = -offset;\n }\n if (pAR.alignY === 'Max') {\n offsetTop = offset;\n }\n }\n if (pAR.meetOrSlice === 'slice') {\n scaleX = scaleY = findScaleToCover(this._element, parsedAttributes);\n offset = rWidth - pWidth / scaleX;\n if (pAR.alignX === 'Mid') {\n cropX = offset / 2;\n }\n if (pAR.alignX === 'Max') {\n cropX = offset;\n }\n offset = rHeight - pHeight / scaleY;\n if (pAR.alignY === 'Mid') {\n cropY = offset / 2;\n }\n if (pAR.alignY === 'Max') {\n cropY = offset;\n }\n rWidth = pWidth / scaleX;\n rHeight = pHeight / scaleY;\n }\n } else {\n scaleX = pWidth / rWidth;\n scaleY = pHeight / rHeight;\n }\n return {\n width: rWidth,\n height: rHeight,\n scaleX,\n scaleY,\n offsetLeft,\n offsetTop,\n cropX,\n cropY,\n };\n }\n\n /**\n * List of attribute names to account for when parsing SVG element (used by {@link FabricImage.fromElement})\n * @see {@link http://www.w3.org/TR/SVG/struct.html#ImageElement}\n */\n static ATTRIBUTE_NAMES = [\n ...SHARED_ATTRIBUTES,\n 'x',\n 'y',\n 'width',\n 'height',\n 'preserveAspectRatio',\n 'xlink:href',\n 'href',\n 'crossOrigin',\n 'image-rendering',\n ];\n\n /**\n * Creates an instance of FabricImage from its object representation\n * @param {Object} object Object to create an instance from\n * @param {object} [options] Options object\n * @param {AbortSignal} [options.signal] handle aborting, see https://developer.mozilla.org/en-US/docs/Web/API/AbortController/signal\n * @returns {Promise}\n */\n static fromObject>(\n { filters: f, resizeFilter: rf, src, crossOrigin, type, ...object }: T,\n options?: Abortable,\n ) {\n return Promise.all([\n loadImage(src!, { ...options, crossOrigin }),\n f && enlivenObjects>(f, options),\n // redundant - handled by enlivenObjectEnlivables, but nicely explicit\n rf ? enlivenObjects([rf], options) : [],\n enlivenObjectEnlivables(object, options),\n ]).then(([el, filters = [], [resizeFilter], hydratedProps = {}]) => {\n return new this(el, {\n ...object,\n // TODO: passing src creates a difference between image creation and restoring from JSON\n src,\n filters,\n resizeFilter,\n ...hydratedProps,\n });\n });\n }\n\n /**\n * Creates an instance of Image from an URL string\n * @param {String} url URL to create an image from\n * @param {LoadImageOptions} [options] Options object\n * @returns {Promise}\n */\n static fromURL>(\n url: string,\n { crossOrigin = null, signal }: LoadImageOptions = {},\n imageOptions?: T,\n ): Promise {\n return loadImage(url, { crossOrigin, signal }).then(\n (img) => new this(img, imageOptions),\n );\n }\n\n /**\n * Returns {@link FabricImage} instance from an SVG element\n * @param {HTMLElement} element Element to parse\n * @param {Object} [options] Options object\n * @param {AbortSignal} [options.signal] handle aborting, see https://developer.mozilla.org/en-US/docs/Web/API/AbortController/signal\n * @param {Function} callback Callback to execute when Image object is created\n */\n static async fromElement(\n element: HTMLElement,\n options: Abortable = {},\n cssRules?: CSSRules,\n ) {\n const parsedAttributes = parseAttributes(\n element,\n this.ATTRIBUTE_NAMES,\n cssRules,\n );\n return this.fromURL(\n parsedAttributes['xlink:href'] || parsedAttributes['href'],\n options,\n parsedAttributes,\n ).catch((err) => {\n log('log', 'Unable to parse Image', err);\n return null;\n });\n }\n}\n\nclassRegistry.setClass(FabricImage);\nclassRegistry.setSVGClass(FabricImage);\n","import { svgNS } from './constants';\nimport {\n parsePreserveAspectRatioAttribute,\n parseUnit,\n} from '../util/misc/svgParsing';\nimport { svgViewBoxElementsRegEx, reViewBoxAttrValue } from './constants';\nimport { NONE } from '../constants';\n\nexport type ParsedViewboxTransform = Partial<{\n width: number;\n height: number;\n minX: number;\n minY: number;\n viewBoxWidth: number;\n viewBoxHeight: number;\n}>;\n\n/**\n * Add a element that envelop all child elements and makes the viewbox transformMatrix descend on all elements\n */\nexport function applyViewboxTransform(\n element: Element,\n): ParsedViewboxTransform {\n if (!svgViewBoxElementsRegEx.test(element.nodeName)) {\n return {};\n }\n const viewBoxAttr: string | null = element.getAttribute('viewBox');\n let scaleX = 1;\n let scaleY = 1;\n let minX = 0;\n let minY = 0;\n let matrix;\n let el;\n const widthAttr = element.getAttribute('width');\n const heightAttr = element.getAttribute('height');\n const x = element.getAttribute('x') || 0;\n const y = element.getAttribute('y') || 0;\n const goodViewbox = viewBoxAttr && reViewBoxAttrValue.test(viewBoxAttr);\n const missingViewBox = !goodViewbox;\n const missingDimAttr =\n !widthAttr || !heightAttr || widthAttr === '100%' || heightAttr === '100%';\n\n let translateMatrix = '';\n let widthDiff = 0;\n let heightDiff = 0;\n\n if (missingViewBox) {\n if (\n (x || y) &&\n element.parentNode &&\n element.parentNode.nodeName !== '#document'\n ) {\n translateMatrix =\n ' translate(' + parseUnit(x || '0') + ' ' + parseUnit(y || '0') + ') ';\n matrix = (element.getAttribute('transform') || '') + translateMatrix;\n element.setAttribute('transform', matrix);\n element.removeAttribute('x');\n element.removeAttribute('y');\n }\n }\n\n if (missingViewBox && missingDimAttr) {\n return {\n width: 0,\n height: 0,\n };\n }\n\n const parsedDim: ParsedViewboxTransform = {\n width: 0,\n height: 0,\n };\n\n if (missingViewBox) {\n parsedDim.width = parseUnit(widthAttr!);\n parsedDim.height = parseUnit(heightAttr!);\n // set a transform for elements that have x y and are inner(only) SVGs\n return parsedDim;\n }\n\n const pasedViewBox = viewBoxAttr.match(reViewBoxAttrValue)!;\n minX = -parseFloat(pasedViewBox[1]);\n minY = -parseFloat(pasedViewBox[2]);\n const viewBoxWidth = parseFloat(pasedViewBox[3]);\n const viewBoxHeight = parseFloat(pasedViewBox[4]);\n parsedDim.minX = minX;\n parsedDim.minY = minY;\n parsedDim.viewBoxWidth = viewBoxWidth;\n parsedDim.viewBoxHeight = viewBoxHeight;\n if (!missingDimAttr) {\n parsedDim.width = parseUnit(widthAttr);\n parsedDim.height = parseUnit(heightAttr);\n scaleX = parsedDim.width / viewBoxWidth;\n scaleY = parsedDim.height / viewBoxHeight;\n } else {\n parsedDim.width = viewBoxWidth;\n parsedDim.height = viewBoxHeight;\n }\n\n // default is to preserve aspect ratio\n const preserveAspectRatio = parsePreserveAspectRatioAttribute(\n element.getAttribute('preserveAspectRatio') || '',\n );\n if (preserveAspectRatio.alignX !== NONE) {\n //translate all container for the effect of Mid, Min, Max\n if (preserveAspectRatio.meetOrSlice === 'meet') {\n scaleY = scaleX = scaleX > scaleY ? scaleY : scaleX;\n // calculate additional translation to move the viewbox\n }\n if (preserveAspectRatio.meetOrSlice === 'slice') {\n scaleY = scaleX = scaleX > scaleY ? scaleX : scaleY;\n // calculate additional translation to move the viewbox\n }\n widthDiff = parsedDim.width - viewBoxWidth * scaleX;\n heightDiff = parsedDim.height - viewBoxHeight * scaleX;\n if (preserveAspectRatio.alignX === 'Mid') {\n widthDiff /= 2;\n }\n if (preserveAspectRatio.alignY === 'Mid') {\n heightDiff /= 2;\n }\n if (preserveAspectRatio.alignX === 'Min') {\n widthDiff = 0;\n }\n if (preserveAspectRatio.alignY === 'Min') {\n heightDiff = 0;\n }\n }\n\n if (\n scaleX === 1 &&\n scaleY === 1 &&\n minX === 0 &&\n minY === 0 &&\n x === 0 &&\n y === 0\n ) {\n return parsedDim;\n }\n if ((x || y) && element.parentNode!.nodeName !== '#document') {\n translateMatrix =\n ' translate(' + parseUnit(x || '0') + ' ' + parseUnit(y || '0') + ') ';\n }\n\n matrix =\n translateMatrix +\n ' matrix(' +\n scaleX +\n ' 0' +\n ' 0 ' +\n scaleY +\n ' ' +\n (minX * scaleX + widthDiff) +\n ' ' +\n (minY * scaleY + heightDiff) +\n ') ';\n // seems unused.\n // parsedDim.viewboxTransform = parseTransformAttribute(matrix);\n if (element.nodeName === 'svg') {\n el = element.ownerDocument.createElementNS(svgNS, 'g');\n // element.firstChild != null\n while (element.firstChild) {\n el.appendChild(element.firstChild);\n }\n element.appendChild(el);\n } else {\n el = element;\n el.removeAttribute('x');\n el.removeAttribute('y');\n matrix = el.getAttribute('transform') + matrix;\n }\n el.setAttribute('transform', matrix);\n return parsedDim;\n}\n","export const getTagName = (node: Element) => node.tagName.replace('svg:', '');\n","import { svgInvalidAncestors } from './constants';\nimport { getSvgRegex } from './getSvgRegex';\nimport { getTagName } from './getTagName';\n\nconst svgInvalidAncestorsRegEx = getSvgRegex(svgInvalidAncestors);\n\nexport function hasInvalidAncestor(element: Element) {\n let _element: Element | null = element;\n while (_element && (_element = _element.parentElement)) {\n if (\n _element &&\n _element.nodeName &&\n svgInvalidAncestorsRegEx.test(getTagName(_element)) &&\n !_element.getAttribute('instantiated_by_use')\n ) {\n return true;\n }\n }\n return false;\n}\n","export function getMultipleNodes(\n doc: Document,\n nodeNames: string[],\n): Element[] {\n let nodeName,\n nodeArray: Element[] = [],\n nodeList,\n i,\n len;\n for (i = 0, len = nodeNames.length; i < len; i++) {\n nodeName = nodeNames[i];\n nodeList = doc.getElementsByTagNameNS(\n 'http://www.w3.org/2000/svg',\n nodeName,\n );\n nodeArray = nodeArray.concat(Array.from(nodeList));\n }\n return nodeArray;\n}\n","const gradientsAttrs = [\n 'gradientTransform',\n 'x1',\n 'x2',\n 'y1',\n 'y2',\n 'gradientUnits',\n 'cx',\n 'cy',\n 'r',\n 'fx',\n 'fy',\n];\nconst xlinkAttr = 'xlink:href';\n\nexport function recursivelyParseGradientsXlink(\n doc: Document,\n gradient: Element,\n) {\n const xLink = gradient.getAttribute(xlinkAttr)?.slice(1) || '',\n referencedGradient = doc.getElementById(xLink);\n if (referencedGradient && referencedGradient.getAttribute(xlinkAttr)) {\n recursivelyParseGradientsXlink(doc, referencedGradient as Element);\n }\n if (referencedGradient) {\n gradientsAttrs.forEach((attr) => {\n const value = referencedGradient.getAttribute(attr);\n if (!gradient.hasAttribute(attr) && value) {\n gradient.setAttribute(attr, value);\n }\n });\n if (!gradient.children.length) {\n const referenceClone = referencedGradient.cloneNode(true);\n while (referenceClone.firstChild) {\n gradient.appendChild(referenceClone.firstChild);\n }\n }\n }\n gradient.removeAttribute(xlinkAttr);\n}\n","import { getMultipleNodes } from './getMultipleNodes';\nimport { recursivelyParseGradientsXlink } from './recursivelyParseGradientsXlink';\n\nconst tagArray = [\n 'linearGradient',\n 'radialGradient',\n 'svg:linearGradient',\n 'svg:radialGradient',\n];\n\n/**\n * Parses an SVG document, returning all of the gradient declarations found in it\n * @param {SVGDocument} doc SVG document to parse\n * @return {Object} Gradient definitions; key corresponds to element id, value -- to gradient definition element\n */\nexport function getGradientDefs(\n doc: Document,\n): Record {\n const elList = getMultipleNodes(doc, tagArray);\n const gradientDefs: Record = {};\n let j = elList.length;\n while (j--) {\n const el = elList[j];\n if (el.getAttribute('xlink:href')) {\n recursivelyParseGradientsXlink(doc, el);\n }\n const id = el.getAttribute('id');\n if (id) {\n gradientDefs[id] = el as SVGGradientElement;\n }\n }\n return gradientDefs;\n}\n","import { Gradient } from '../gradient/Gradient';\nimport { Group } from '../shapes/Group';\nimport { FabricImage } from '../shapes/Image';\nimport { classRegistry } from '../ClassRegistry';\nimport {\n invertTransform,\n multiplyTransformMatrices,\n qrDecompose,\n} from '../util/misc/matrix';\nimport { removeTransformMatrixForSvgParsing } from '../util/transform_matrix_removal';\nimport type { FabricObject } from '../shapes/Object/FabricObject';\nimport { Point } from '../Point';\nimport { CENTER, FILL, STROKE } from '../constants';\nimport { getGradientDefs } from './getGradientDefs';\nimport { getCSSRules } from './getCSSRules';\nimport type { LoadImageOptions } from '../util';\nimport type { CSSRules, TSvgReviverCallback } from './typedefs';\nimport type { ParsedViewboxTransform } from './applyViewboxTransform';\nimport type { SVGOptions } from '../gradient';\nimport { getTagName } from './getTagName';\nimport { parseTransformAttribute } from './parseTransformAttribute';\n\nconst findTag = (el: Element) =>\n classRegistry.getSVGClass(getTagName(el).toLowerCase());\n\ntype StorageType = {\n fill: SVGGradientElement;\n stroke: SVGGradientElement;\n clipPath: Element[];\n};\n\ntype NotParsedFabricObject = FabricObject & {\n fill: string;\n stroke: string;\n clipPath?: string;\n clipRule?: CanvasFillRule;\n};\n\nexport class ElementsParser {\n declare elements: Element[];\n declare options: LoadImageOptions & ParsedViewboxTransform;\n declare reviver?: TSvgReviverCallback;\n declare regexUrl: RegExp;\n declare doc: Document;\n declare clipPaths: Record;\n declare gradientDefs: Record;\n declare cssRules: CSSRules;\n\n constructor(\n elements: Element[],\n options: LoadImageOptions & ParsedViewboxTransform,\n reviver: TSvgReviverCallback | undefined,\n doc: Document,\n clipPaths: Record,\n ) {\n this.elements = elements;\n this.options = options;\n this.reviver = reviver;\n this.regexUrl = /^url\\(['\"]?#([^'\"]+)['\"]?\\)/g;\n this.doc = doc;\n this.clipPaths = clipPaths;\n this.gradientDefs = getGradientDefs(doc);\n this.cssRules = getCSSRules(doc);\n }\n\n parse(): Promise> {\n return Promise.all(\n this.elements.map((element) => this.createObject(element)),\n );\n }\n\n async createObject(el: Element): Promise {\n const klass = findTag(el);\n if (klass) {\n const obj: NotParsedFabricObject = await klass.fromElement(\n el,\n this.options,\n this.cssRules,\n );\n this.resolveGradient(obj, el, FILL);\n this.resolveGradient(obj, el, STROKE);\n if (obj instanceof FabricImage && obj._originalElement) {\n removeTransformMatrixForSvgParsing(\n obj,\n obj.parsePreserveAspectRatioAttribute(),\n );\n } else {\n removeTransformMatrixForSvgParsing(obj);\n }\n await this.resolveClipPath(obj, el);\n this.reviver && this.reviver(el, obj);\n return obj;\n }\n return null;\n }\n\n extractPropertyDefinition(\n obj: NotParsedFabricObject,\n property: 'fill' | 'stroke' | 'clipPath',\n storage: Record,\n ): StorageType[typeof property] | undefined {\n const value = obj[property]!,\n regex = this.regexUrl;\n if (!regex.test(value)) {\n return undefined;\n }\n // verify: can we remove the 'g' flag? and remove lastIndex changes?\n regex.lastIndex = 0;\n // we passed the regex test, so we know is not null;\n const id = regex.exec(value)![1];\n regex.lastIndex = 0;\n // @todo fix this\n return storage[id];\n }\n\n resolveGradient(\n obj: NotParsedFabricObject,\n el: Element,\n property: 'fill' | 'stroke',\n ) {\n const gradientDef = this.extractPropertyDefinition(\n obj,\n property,\n this.gradientDefs,\n ) as SVGGradientElement;\n if (gradientDef) {\n const opacityAttr = el.getAttribute(property + '-opacity');\n const gradient = Gradient.fromElement(gradientDef, obj, {\n ...this.options,\n opacity: opacityAttr,\n } as SVGOptions);\n obj.set(property, gradient);\n }\n }\n\n // TODO: resolveClipPath could be run once per clippath with minor work per object.\n // is a refactor that i m not sure is worth on this code\n async resolveClipPath(\n obj: NotParsedFabricObject,\n usingElement: Element,\n exactOwner?: Element,\n ) {\n const clipPathElements = this.extractPropertyDefinition(\n obj,\n 'clipPath',\n this.clipPaths,\n ) as Element[];\n if (clipPathElements) {\n const objTransformInv = invertTransform(obj.calcTransformMatrix());\n const clipPathTag = clipPathElements[0].parentElement!;\n let clipPathOwner = usingElement;\n while (\n !exactOwner &&\n clipPathOwner.parentElement &&\n clipPathOwner.getAttribute('clip-path') !== obj.clipPath\n ) {\n clipPathOwner = clipPathOwner.parentElement;\n }\n // move the clipPath tag as sibling to the real element that is using it\n clipPathOwner.parentElement!.appendChild(clipPathTag);\n\n // this multiplication order could be opposite.\n // but i don't have an svg to test it\n // at the first SVG that has a transform on both places and is misplaced\n // try to invert this multiplication order\n const finalTransform = parseTransformAttribute(\n `${clipPathOwner.getAttribute('transform') || ''} ${\n clipPathTag.getAttribute('originalTransform') || ''\n }`,\n );\n\n clipPathTag.setAttribute(\n 'transform',\n `matrix(${finalTransform.join(',')})`,\n );\n\n const container = await Promise.all(\n clipPathElements.map((clipPathElement) => {\n return findTag(clipPathElement)\n .fromElement(clipPathElement, this.options, this.cssRules)\n .then((enlivedClippath: NotParsedFabricObject) => {\n removeTransformMatrixForSvgParsing(enlivedClippath);\n enlivedClippath.fillRule = enlivedClippath.clipRule!;\n delete enlivedClippath.clipRule;\n return enlivedClippath;\n });\n }),\n );\n const clipPath =\n container.length === 1 ? container[0] : new Group(container);\n const gTransform = multiplyTransformMatrices(\n objTransformInv,\n clipPath.calcTransformMatrix(),\n );\n if (clipPath.clipPath) {\n await this.resolveClipPath(\n clipPath,\n clipPathOwner,\n // this is tricky.\n // it tries to differentiate from when clipPaths are inherited by outside groups\n // or when are really clipPaths referencing other clipPaths\n clipPathTag.getAttribute('clip-path') ? clipPathOwner : undefined,\n );\n }\n const { scaleX, scaleY, angle, skewX, translateX, translateY } =\n qrDecompose(gTransform);\n clipPath.set({\n flipX: false,\n flipY: false,\n });\n clipPath.set({\n scaleX,\n scaleY,\n angle,\n skewX,\n skewY: 0,\n });\n clipPath.setPositionByOrigin(\n new Point(translateX, translateY),\n CENTER,\n CENTER,\n );\n obj.clipPath = clipPath;\n } else {\n // if clip-path does not resolve to any element, delete the property.\n delete obj.clipPath;\n return;\n }\n }\n}\n","import type { CSSRules } from './typedefs';\n\n/**\n * Returns CSS rules for a given SVG document\n * @param {HTMLElement} doc SVG document to parse\n * @return {Object} CSS rules of this document\n */\nexport function getCSSRules(doc: Document) {\n const styles = doc.getElementsByTagName('style');\n const allRules: CSSRules = {};\n\n // very crude parsing of style contents\n for (let i = 0; i < styles.length; i++) {\n const styleContents = (styles[i].textContent || '').replace(\n // remove comments\n /\\/\\*[\\s\\S]*?\\*\\//g,\n '',\n );\n\n if (styleContents.trim() === '') {\n continue;\n }\n // recovers all the rule in this form `body { style code... }`\n // rules = styleContents.match(/[^{]*\\{[\\s\\S]*?\\}/g);\n styleContents\n .split('}')\n // remove empty rules and remove everything if we didn't split in at least 2 pieces\n .filter((rule, index, array) => array.length > 1 && rule.trim())\n // at this point we have hopefully an array of rules `body { style code... `\n .forEach((rule) => {\n // if there is more than one opening bracket and the rule starts with '@', it is likely\n // a nested at-rule like @media, @supports, @scope, etc. Ignore these as the code below\n // can not handle it.\n if (\n (rule.match(/{/g) || []).length > 1 &&\n rule.trim().startsWith('@')\n ) {\n return;\n }\n\n const match = rule.split('{'),\n ruleObj: Record = {},\n declaration = match[1].trim(),\n propertyValuePairs = declaration.split(';').filter(function (pair) {\n return pair.trim();\n });\n\n for (let j = 0; j < propertyValuePairs.length; j++) {\n const pair = propertyValuePairs[j].split(':'),\n property = pair[0].trim(),\n value = pair[1].trim();\n ruleObj[property] = value;\n }\n rule = match[0].trim();\n rule.split(',').forEach((_rule) => {\n _rule = _rule.replace(/^svg/i, '').trim();\n if (_rule === '') {\n return;\n }\n allRules[_rule] = {\n ...(allRules[_rule] || {}),\n ...ruleObj,\n };\n });\n });\n }\n return allRules;\n}\n","import { applyViewboxTransform } from './applyViewboxTransform';\nimport { svgValidTagNamesRegEx } from './constants';\nimport { hasInvalidAncestor } from './hasInvalidAncestor';\nimport { parseUseDirectives } from './parseUseDirectives';\nimport type { SVGParsingOutput, TSvgReviverCallback } from './typedefs';\nimport type { LoadImageOptions } from '../util/misc/objectEnlive';\nimport { ElementsParser } from './elements_parser';\nimport { log, SignalAbortedError } from '../util/internals/console';\nimport { getTagName } from './getTagName';\n\nconst isValidSvgTag = (el: Element) =>\n svgValidTagNamesRegEx.test(getTagName(el));\n\nexport const createEmptyResponse = (): SVGParsingOutput => ({\n objects: [],\n elements: [],\n options: {},\n allElements: [],\n});\n\n/**\n * Parses an SVG document, converts it to an array of corresponding fabric.* instances and passes them to a callback\n * @static\n * @function\n * @param {HTMLElement} doc SVG document to parse\n * @param {TSvgParsedCallback} callback Invoked when the parsing is done, with null if parsing wasn't possible with the list of svg nodes.\n * @param {TSvgReviverCallback} [reviver] Extra callback for further parsing of SVG elements, called after each fabric object has been created.\n * Takes as input the original svg element and the generated `FabricObject` as arguments. Used to inspect extra properties not parsed by fabric,\n * or extra custom manipulation\n * @param {Object} [options] Object containing options for parsing\n * @param {String} [options.crossOrigin] crossOrigin setting to use for external resources\n * @param {AbortSignal} [options.signal] handle aborting, see https://developer.mozilla.org/en-US/docs/Web/API/AbortController/signal\n * @return {SVGParsingOutput}\n * {@link SVGParsingOutput} also receives `allElements` array as the last argument. This is the full list of svg nodes available in the document.\n * You may want to use it if you are trying to regroup the objects as they were originally grouped in the SVG. ( This was the reason why it was added )\n */\nexport async function parseSVGDocument(\n doc: Document,\n reviver?: TSvgReviverCallback,\n { crossOrigin, signal }: LoadImageOptions = {},\n): Promise {\n if (signal && signal.aborted) {\n log('log', new SignalAbortedError('parseSVGDocument'));\n // this is an unhappy path, we dont care about speed\n return createEmptyResponse();\n }\n const documentElement = doc.documentElement;\n parseUseDirectives(doc);\n\n const descendants = Array.from(documentElement.getElementsByTagName('*')),\n options = {\n ...applyViewboxTransform(documentElement),\n crossOrigin,\n signal,\n };\n const elements = descendants.filter((el) => {\n applyViewboxTransform(el);\n return isValidSvgTag(el) && !hasInvalidAncestor(el); // http://www.w3.org/TR/SVG/struct.html#DefsElement\n });\n if (!elements || (elements && !elements.length)) {\n return {\n ...createEmptyResponse(),\n options,\n allElements: descendants,\n };\n }\n const localClipPaths: Record = {};\n descendants\n .filter((el) => getTagName(el) === 'clipPath')\n .forEach((el) => {\n el.setAttribute('originalTransform', el.getAttribute('transform') || '');\n const id = el.getAttribute('id')!;\n localClipPaths[id] = Array.from(el.getElementsByTagName('*')).filter(\n (el) => isValidSvgTag(el),\n );\n });\n\n // Precedence of rules: style > class > attribute\n const elementParser = new ElementsParser(\n elements,\n options,\n reviver,\n doc,\n localClipPaths,\n );\n\n const instances = await elementParser.parse();\n\n return {\n objects: instances,\n elements,\n options,\n allElements: descendants,\n };\n}\n","import { svgNS } from './constants';\nimport { getMultipleNodes } from './getMultipleNodes';\nimport { applyViewboxTransform } from './applyViewboxTransform';\nimport { parseStyleString } from './parseStyleString';\n\nexport function parseUseDirectives(doc: Document) {\n const nodelist = getMultipleNodes(doc, ['use', 'svg:use']);\n const skipAttributes = ['x', 'y', 'xlink:href', 'href', 'transform'];\n\n for (const useElement of nodelist) {\n const useAttributes: NamedNodeMap = useElement.attributes;\n\n const useAttrMap: Record = {};\n for (const attr of useAttributes) {\n attr.value && (useAttrMap[attr.name] = attr.value);\n }\n\n const xlink = (useAttrMap['xlink:href'] || useAttrMap.href || '').slice(1);\n\n if (xlink === '') {\n return;\n }\n const referencedElement = doc.getElementById(xlink);\n if (referencedElement === null) {\n // if we can't find the target of the xlink, consider this use tag bad, similar to no xlink\n return;\n }\n let clonedOriginal = referencedElement.cloneNode(true) as Element;\n\n const originalAttributes: NamedNodeMap = clonedOriginal.attributes;\n\n const originalAttrMap: Record = {};\n for (const attr of originalAttributes) {\n attr.value && (originalAttrMap[attr.name] = attr.value);\n }\n\n // Transform attribute needs to be merged in a particular way\n const { x = 0, y = 0, transform = '' } = useAttrMap;\n const currentTrans = `${transform} ${\n originalAttrMap.transform || ''\n } translate(${x}, ${y})`;\n\n applyViewboxTransform(clonedOriginal);\n\n if (/^svg$/i.test(clonedOriginal.nodeName)) {\n // if is an SVG, create a group and apply all the attributes on top of it\n const el3 = clonedOriginal.ownerDocument.createElementNS(svgNS, 'g');\n Object.entries(originalAttrMap).forEach(([name, value]) =>\n el3.setAttributeNS(svgNS, name, value),\n );\n el3.append(...clonedOriginal.childNodes);\n clonedOriginal = el3;\n }\n\n for (const attr of useAttributes) {\n if (!attr) {\n continue;\n }\n const { name, value } = attr;\n if (skipAttributes.includes(name)) {\n continue;\n }\n\n if (name === 'style') {\n // when use has a style, merge the two styles, with the ref being priority (not use)\n // priority is by feature. an attribute for fill on the original element\n // will overwrite the fill in style or attribute for tha use\n const styleRecord: Record = {};\n parseStyleString(value, styleRecord);\n // cleanup styleRecord from attributes of original\n Object.entries(originalAttrMap).forEach(([name, value]) => {\n styleRecord[name] = value;\n });\n // now we can put in the style of the original that will overwrite the original attributes\n parseStyleString(originalAttrMap.style || '', styleRecord);\n const mergedStyles = Object.entries(styleRecord)\n .map((entry) => entry.join(':'))\n .join(';');\n clonedOriginal.setAttribute(name, mergedStyles);\n } else {\n // set the attribute from use element only if the original does not have it already\n !originalAttrMap[name] && clonedOriginal.setAttribute(name, value);\n }\n }\n\n clonedOriginal.setAttribute('transform', currentTrans);\n clonedOriginal.setAttribute('instantiated_by_use', '1');\n clonedOriginal.removeAttribute('id');\n useElement.parentNode!.replaceChild(clonedOriginal, useElement);\n }\n}\n","import { getFabricWindow } from '../env';\nimport type { LoadImageOptions } from '../util/misc/objectEnlive';\nimport { parseSVGDocument } from './parseSVGDocument';\nimport type { SVGParsingOutput, TSvgReviverCallback } from './typedefs';\n\n/**\n * Takes string corresponding to an SVG document, and parses it into a set of fabric objects\n * @param {String} string representing the svg\n * @param {TSvgParsedCallback} callback Invoked when the parsing is done, with null if parsing wasn't possible with the list of svg nodes.\n * {@link TSvgParsedCallback} also receives `allElements` array as the last argument. This is the full list of svg nodes available in the document.\n * You may want to use it if you are trying to regroup the objects as they were originally grouped in the SVG. ( This was the reason why it was added )\n * @param {TSvgReviverCallback} [reviver] Extra callback for further parsing of SVG elements, called after each fabric object has been created.\n * Takes as input the original svg element and the generated `FabricObject` as arguments. Used to inspect extra properties not parsed by fabric,\n * or extra custom manipulation\n * @param {Object} [options] Object containing options for parsing\n * @param {String} [options.crossOrigin] crossOrigin setting to use for external resources\n * @param {AbortSignal} [options.signal] handle aborting, see https://developer.mozilla.org/en-US/docs/Web/API/AbortController/signal\n */\nexport function loadSVGFromString(\n string: string,\n reviver?: TSvgReviverCallback,\n options?: LoadImageOptions,\n): Promise {\n const parser = new (getFabricWindow().DOMParser)(),\n // should we use `image/svg+xml` here?\n doc = parser.parseFromString(string.trim(), 'text/xml');\n return parseSVGDocument(doc, reviver, options);\n}\n","import { Point } from '../Point';\nimport { Control } from './Control';\nimport type { TMat2D } from '../typedefs';\nimport type { Polyline } from '../shapes/Polyline';\nimport { multiplyTransformMatrices } from '../util/misc/matrix';\nimport type {\n TModificationEvents,\n TPointerEvent,\n Transform,\n TransformActionHandler,\n} from '../EventTypeDefs';\nimport { wrapWithFireEvent } from './wrapWithFireEvent';\nimport { sendPointToPlane } from '../util/misc/planeChange';\nimport { MODIFY_POLY } from '../constants';\n\nconst ACTION_NAME: TModificationEvents = MODIFY_POLY;\n\ntype TTransformAnchor = Transform & { pointIndex: number };\n\n/**\n * This function locates the controls.\n * It'll be used both for drawing and for interaction.\n */\nexport const createPolyPositionHandler = (pointIndex: number) => {\n return function (dim: Point, finalMatrix: TMat2D, polyObject: Polyline) {\n const { points, pathOffset } = polyObject;\n return new Point(points[pointIndex])\n .subtract(pathOffset)\n .transform(\n multiplyTransformMatrices(\n polyObject.getViewportTransform(),\n polyObject.calcTransformMatrix(),\n ),\n );\n };\n};\n\n/**\n * This function defines what the control does.\n * It'll be called on every mouse move after a control has been clicked and is being dragged.\n * The function receives as argument the mouse event, the current transform object\n * and the current position in canvas coordinate `transform.target` is a reference to the\n * current object being transformed.\n */\nexport const polyActionHandler = (\n eventData: TPointerEvent,\n transform: TTransformAnchor,\n x: number,\n y: number,\n) => {\n const { target, pointIndex } = transform;\n const poly = target as Polyline;\n const mouseLocalPosition = sendPointToPlane(\n new Point(x, y),\n undefined,\n poly.calcOwnMatrix(),\n );\n\n poly.points[pointIndex] = mouseLocalPosition.add(poly.pathOffset);\n poly.setDimensions();\n poly.set('dirty', true);\n return true;\n};\n\n/**\n * Keep the polygon in the same position when we change its `width`/`height`/`top`/`left`.\n */\nexport const factoryPolyActionHandler = (\n pointIndex: number,\n fn: TransformActionHandler,\n) => {\n return function (\n eventData: TPointerEvent,\n transform: Transform,\n x: number,\n y: number,\n ) {\n const poly = transform.target as Polyline,\n anchorPoint = new Point(\n poly.points[(pointIndex > 0 ? pointIndex : poly.points.length) - 1],\n ),\n anchorPointInParentPlane = anchorPoint\n .subtract(poly.pathOffset)\n .transform(poly.calcOwnMatrix()),\n actionPerformed = fn(eventData, { ...transform, pointIndex }, x, y);\n\n const newAnchorPointInParentPlane = anchorPoint\n .subtract(poly.pathOffset)\n .transform(poly.calcOwnMatrix());\n\n const diff = newAnchorPointInParentPlane.subtract(anchorPointInParentPlane);\n poly.left -= diff.x;\n poly.top -= diff.y;\n\n return actionPerformed;\n };\n};\n\nexport const createPolyActionHandler = (pointIndex: number) =>\n wrapWithFireEvent(\n ACTION_NAME,\n factoryPolyActionHandler(pointIndex, polyActionHandler),\n );\n\nexport function createPolyControls(\n poly: Polyline,\n options?: Partial,\n): Record;\nexport function createPolyControls(\n numOfControls: number,\n options?: Partial,\n): Record;\nexport function createPolyControls(\n arg0: number | Polyline,\n options: Partial = {},\n) {\n const controls = {} as Record;\n for (\n let idx = 0;\n idx < (typeof arg0 === 'number' ? arg0 : arg0.points.length);\n idx++\n ) {\n controls[`p${idx}`] = new Control({\n actionName: ACTION_NAME,\n positionHandler: createPolyPositionHandler(idx),\n actionHandler: createPolyActionHandler(idx),\n ...options,\n });\n }\n return controls;\n}\n","import { Point } from '../Point';\nimport { Control } from './Control';\nimport type { TMat2D } from '../typedefs';\nimport type { Path } from '../shapes/Path';\nimport { multiplyTransformMatrices } from '../util/misc/matrix';\nimport type {\n TModificationEvents,\n TPointerEvent,\n Transform,\n} from '../EventTypeDefs';\nimport { sendPointToPlane } from '../util/misc/planeChange';\nimport type { TSimpleParseCommandType } from '../util/path/typedefs';\nimport type { ControlRenderingStyleOverride } from './controlRendering';\nimport { fireEvent } from './fireEvent';\nimport { commonEventInfo } from './util';\n\nconst ACTION_NAME: TModificationEvents = 'modifyPath' as const;\n\ntype TTransformAnchor = Transform;\n\nexport type PathPointControlStyle = {\n controlFill?: string;\n controlStroke?: string;\n connectionDashArray?: number[];\n};\n\nconst calcPathPointPosition = (\n pathObject: Path,\n commandIndex: number,\n pointIndex: number,\n) => {\n const { path, pathOffset } = pathObject;\n const command = path[commandIndex];\n return new Point(\n (command[pointIndex] as number) - pathOffset.x,\n (command[pointIndex + 1] as number) - pathOffset.y,\n ).transform(\n multiplyTransformMatrices(\n pathObject.getViewportTransform(),\n pathObject.calcTransformMatrix(),\n ),\n );\n};\n\nconst movePathPoint = (\n pathObject: Path,\n x: number,\n y: number,\n commandIndex: number,\n pointIndex: number,\n) => {\n const { path, pathOffset } = pathObject;\n\n const anchorCommand =\n path[(commandIndex > 0 ? commandIndex : path.length) - 1];\n const anchorPoint = new Point(\n anchorCommand[pointIndex] as number,\n anchorCommand[pointIndex + 1] as number,\n );\n\n const anchorPointInParentPlane = anchorPoint\n .subtract(pathOffset)\n .transform(pathObject.calcOwnMatrix());\n\n const mouseLocalPosition = sendPointToPlane(\n new Point(x, y),\n undefined,\n pathObject.calcOwnMatrix(),\n );\n\n path[commandIndex][pointIndex] = mouseLocalPosition.x + pathOffset.x;\n path[commandIndex][pointIndex + 1] = mouseLocalPosition.y + pathOffset.y;\n pathObject.setDimensions();\n\n const newAnchorPointInParentPlane = anchorPoint\n .subtract(pathObject.pathOffset)\n .transform(pathObject.calcOwnMatrix());\n\n const diff = newAnchorPointInParentPlane.subtract(anchorPointInParentPlane);\n pathObject.left -= diff.x;\n pathObject.top -= diff.y;\n pathObject.set('dirty', true);\n return true;\n};\n\n/**\n * This function locates the controls.\n * It'll be used both for drawing and for interaction.\n */\nfunction pathPositionHandler(\n this: PathPointControl,\n dim: Point,\n finalMatrix: TMat2D,\n pathObject: Path,\n) {\n const { commandIndex, pointIndex } = this;\n return calcPathPointPosition(pathObject, commandIndex, pointIndex);\n}\n\n/**\n * This function defines what the control does.\n * It'll be called on every mouse move after a control has been clicked and is being dragged.\n * The function receives as argument the mouse event, the current transform object\n * and the current position in canvas coordinate `transform.target` is a reference to the\n * current object being transformed.\n */\nfunction pathActionHandler(\n this: PathPointControl,\n eventData: TPointerEvent,\n transform: TTransformAnchor,\n x: number,\n y: number,\n) {\n const { target } = transform;\n const { commandIndex, pointIndex } = this;\n const actionPerformed = movePathPoint(\n target as Path,\n x,\n y,\n commandIndex,\n pointIndex,\n );\n if (actionPerformed) {\n fireEvent(this.actionName as TModificationEvents, {\n ...commonEventInfo(eventData, transform, x, y),\n commandIndex,\n pointIndex,\n });\n }\n return actionPerformed;\n}\n\nconst indexFromPrevCommand = (previousCommandType: TSimpleParseCommandType) =>\n previousCommandType === 'C' ? 5 : previousCommandType === 'Q' ? 3 : 1;\n\nclass PathPointControl extends Control {\n declare commandIndex: number;\n declare pointIndex: number;\n declare controlFill: string;\n declare controlStroke: string;\n constructor(options?: Partial) {\n super(options);\n }\n\n render(\n ctx: CanvasRenderingContext2D,\n left: number,\n top: number,\n styleOverride: ControlRenderingStyleOverride | undefined,\n fabricObject: Path,\n ) {\n const overrides: ControlRenderingStyleOverride = {\n ...styleOverride,\n cornerColor: this.controlFill,\n cornerStrokeColor: this.controlStroke,\n transparentCorners: !this.controlFill,\n };\n super.render(ctx, left, top, overrides, fabricObject);\n }\n}\n\nclass PathControlPointControl extends PathPointControl {\n declare connectionDashArray?: number[];\n declare connectToCommandIndex: number;\n declare connectToPointIndex: number;\n constructor(options?: Partial) {\n super(options);\n }\n\n render(\n this: PathControlPointControl,\n ctx: CanvasRenderingContext2D,\n left: number,\n top: number,\n styleOverride: ControlRenderingStyleOverride | undefined,\n fabricObject: Path,\n ) {\n const { path } = fabricObject;\n const {\n commandIndex,\n pointIndex,\n connectToCommandIndex,\n connectToPointIndex,\n } = this;\n ctx.save();\n ctx.strokeStyle = this.controlStroke;\n if (this.connectionDashArray) {\n ctx.setLineDash(this.connectionDashArray);\n }\n const [commandType] = path[commandIndex];\n const point = calcPathPointPosition(\n fabricObject,\n connectToCommandIndex,\n connectToPointIndex,\n );\n\n if (commandType === 'Q') {\n // one control point connects to 2 points\n const point2 = calcPathPointPosition(\n fabricObject,\n commandIndex,\n pointIndex + 2,\n );\n ctx.moveTo(point2.x, point2.y);\n ctx.lineTo(left, top);\n } else {\n ctx.moveTo(left, top);\n }\n ctx.lineTo(point.x, point.y);\n ctx.stroke();\n ctx.restore();\n\n super.render(ctx, left, top, styleOverride, fabricObject);\n }\n}\n\nconst createControl = (\n commandIndexPos: number,\n pointIndexPos: number,\n isControlPoint: boolean,\n options: Partial & {\n controlPointStyle?: PathPointControlStyle;\n pointStyle?: PathPointControlStyle;\n },\n connectToCommandIndex?: number,\n connectToPointIndex?: number,\n) =>\n new (isControlPoint ? PathControlPointControl : PathPointControl)({\n commandIndex: commandIndexPos,\n pointIndex: pointIndexPos,\n actionName: ACTION_NAME,\n positionHandler: pathPositionHandler,\n actionHandler: pathActionHandler,\n connectToCommandIndex,\n connectToPointIndex,\n ...options,\n ...(isControlPoint ? options.controlPointStyle : options.pointStyle),\n } as Partial);\n\nexport function createPathControls(\n path: Path,\n options: Partial & {\n controlPointStyle?: PathPointControlStyle;\n pointStyle?: PathPointControlStyle;\n } = {},\n): Record {\n const controls = {} as Record;\n let previousCommandType: TSimpleParseCommandType = 'M';\n path.path.forEach((command, commandIndex) => {\n const commandType = command[0];\n\n if (commandType !== 'Z') {\n controls[`c_${commandIndex}_${commandType}`] = createControl(\n commandIndex,\n command.length - 2,\n false,\n options,\n );\n }\n switch (commandType) {\n case 'C':\n controls[`c_${commandIndex}_C_CP_1`] = createControl(\n commandIndex,\n 1,\n true,\n options,\n commandIndex - 1,\n indexFromPrevCommand(previousCommandType),\n );\n controls[`c_${commandIndex}_C_CP_2`] = createControl(\n commandIndex,\n 3,\n true,\n options,\n commandIndex,\n 5,\n );\n break;\n case 'Q':\n controls[`c_${commandIndex}_Q_CP_1`] = createControl(\n commandIndex,\n 1,\n true,\n options,\n commandIndex,\n 3,\n );\n break;\n }\n previousCommandType = commandType;\n });\n return controls;\n}\n","import { getFabricWindow } from '../env';\nimport { createCanvasElement, createCanvasElementFor } from '../util/misc/dom';\nimport { WebGLFilterBackend } from './WebGLFilterBackend';\nimport type { TWebGLPipelineState, T2DPipelineState } from './typedefs';\n\nexport const isWebGLPipelineState = (\n options: TWebGLPipelineState | T2DPipelineState,\n): options is TWebGLPipelineState => {\n return (options as TWebGLPipelineState).webgl !== undefined;\n};\n\n/**\n * Pick a method to copy data from GL context to 2d canvas. In some browsers using\n * drawImage should be faster, but is also bugged for a small combination of old hardware\n * and drivers.\n * putImageData is faster than drawImage for that specific operation.\n */\nexport const isPutImageFaster = (width: number, height: number): boolean => {\n const targetCanvas = createCanvasElementFor({ width, height });\n const sourceCanvas = createCanvasElement();\n const gl = sourceCanvas.getContext('webgl')!;\n // eslint-disable-next-line no-undef\n const imageBuffer = new ArrayBuffer(width * height * 4);\n\n const testContext = {\n imageBuffer: imageBuffer,\n } as unknown as Required;\n const testPipelineState = {\n destinationWidth: width,\n destinationHeight: height,\n targetCanvas: targetCanvas,\n } as unknown as TWebGLPipelineState;\n let startTime;\n\n startTime = getFabricWindow().performance.now();\n WebGLFilterBackend.prototype.copyGLTo2D.call(\n testContext,\n gl,\n testPipelineState,\n );\n const drawImageTime = getFabricWindow().performance.now() - startTime;\n\n startTime = getFabricWindow().performance.now();\n WebGLFilterBackend.prototype.copyGLTo2DPutImageData.call(\n testContext,\n gl,\n testPipelineState,\n );\n const putImageDataTime = getFabricWindow().performance.now() - startTime;\n\n return drawImageTime > putImageDataTime;\n};\n","export const highPsourceCode = `precision highp float`;\n\nexport const identityFragmentShader = `\n ${highPsourceCode};\n varying vec2 vTexCoord;\n uniform sampler2D uTexture;\n void main() {\n gl_FragColor = texture2D(uTexture, vTexCoord);\n }`;\n\nexport const vertexSource = `\n attribute vec2 aPosition;\n varying vec2 vTexCoord;\n void main() {\n vTexCoord = aPosition;\n gl_Position = vec4(aPosition * 2.0 - 1.0, 0.0, 1.0);\n }`;\n","import { getEnv } from '../env';\nimport type {\n T2DPipelineState,\n TWebGLAttributeLocationMap,\n TWebGLPipelineState,\n TWebGLProgramCacheItem,\n TWebGLUniformLocationMap,\n} from './typedefs';\nimport { isWebGLPipelineState } from './utils';\nimport {\n highPsourceCode,\n identityFragmentShader,\n vertexSource,\n} from './shaders/baseFilter';\nimport type { Abortable } from '../typedefs';\nimport { FabricError } from '../util/internals/console';\nimport { createCanvasElementFor } from '../util/misc/dom';\n\nconst regex = new RegExp(highPsourceCode, 'g');\n\nexport class BaseFilter<\n Name extends string,\n OwnProps extends Record = object,\n SerializedProps extends Record = OwnProps,\n> {\n /**\n * Filter type\n */\n get type(): Name {\n return (this.constructor as typeof BaseFilter).type as Name;\n }\n\n /**\n * The class type. Used to identify which class this is.\n * This is used for serialization purposes and internally it can be used\n * to identify classes. As a developer you could use `instance of Class`\n * but to avoid importing all the code and blocking tree shaking we try\n * to avoid doing that.\n */\n static type = 'BaseFilter';\n\n /**\n * Contains the uniform locations for the fragment shader.\n * uStepW and uStepH are handled by the BaseFilter, each filter class\n * needs to specify all the one that are needed\n */\n static uniformLocations: string[] = [];\n\n declare static defaults: Record;\n\n /**\n * Constructor\n * @param {Object} [options] Options object\n */\n constructor({\n type,\n ...options\n }: { type?: never } & Partial & Record = {}) {\n Object.assign(\n this,\n (this.constructor as typeof BaseFilter).defaults,\n options,\n );\n }\n\n protected getFragmentSource(): string {\n return identityFragmentShader;\n }\n\n getVertexSource(): string {\n return vertexSource;\n }\n\n /**\n * Compile this filter's shader program.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context to use for shader compilation.\n * @param {String} fragmentSource fragmentShader source for compilation\n * @param {String} vertexSource vertexShader source for compilation\n */\n createProgram(\n gl: WebGLRenderingContext,\n fragmentSource: string = this.getFragmentSource(),\n vertexSource: string = this.getVertexSource(),\n ) {\n const {\n WebGLProbe: { GLPrecision = 'highp' },\n } = getEnv();\n if (GLPrecision !== 'highp') {\n fragmentSource = fragmentSource.replace(\n regex,\n highPsourceCode.replace('highp', GLPrecision),\n );\n }\n const vertexShader = gl.createShader(gl.VERTEX_SHADER);\n const fragmentShader = gl.createShader(gl.FRAGMENT_SHADER);\n const program = gl.createProgram();\n\n if (!vertexShader || !fragmentShader || !program) {\n throw new FabricError(\n 'Vertex, fragment shader or program creation error',\n );\n }\n gl.shaderSource(vertexShader, vertexSource);\n gl.compileShader(vertexShader);\n if (!gl.getShaderParameter(vertexShader, gl.COMPILE_STATUS)) {\n throw new FabricError(\n `Vertex shader compile error for ${this.type}: ${gl.getShaderInfoLog(\n vertexShader,\n )}`,\n );\n }\n\n gl.shaderSource(fragmentShader, fragmentSource);\n gl.compileShader(fragmentShader);\n if (!gl.getShaderParameter(fragmentShader, gl.COMPILE_STATUS)) {\n throw new FabricError(\n `Fragment shader compile error for ${this.type}: ${gl.getShaderInfoLog(\n fragmentShader,\n )}`,\n );\n }\n\n gl.attachShader(program, vertexShader);\n gl.attachShader(program, fragmentShader);\n gl.linkProgram(program);\n if (!gl.getProgramParameter(program, gl.LINK_STATUS)) {\n throw new FabricError(\n `Shader link error for \"${this.type}\" ${gl.getProgramInfoLog(program)}`,\n );\n }\n\n const uniformLocations = this.getUniformLocations(gl, program) || {};\n uniformLocations.uStepW = gl.getUniformLocation(program, 'uStepW');\n uniformLocations.uStepH = gl.getUniformLocation(program, 'uStepH');\n\n return {\n program,\n attributeLocations: this.getAttributeLocations(gl, program),\n uniformLocations,\n };\n }\n\n /**\n * Return a map of attribute names to WebGLAttributeLocation objects.\n *\n * @param {WebGLRenderingContext} gl The canvas context used to compile the shader program.\n * @param {WebGLShaderProgram} program The shader program from which to take attribute locations.\n * @returns {Object} A map of attribute names to attribute locations.\n */\n getAttributeLocations(\n gl: WebGLRenderingContext,\n program: WebGLProgram,\n ): TWebGLAttributeLocationMap {\n return {\n aPosition: gl.getAttribLocation(program, 'aPosition'),\n };\n }\n\n /**\n * Return a map of uniform names to WebGLUniformLocation objects.\n *\n * @param {WebGLRenderingContext} gl The canvas context used to compile the shader program.\n * @param {WebGLShaderProgram} program The shader program from which to take uniform locations.\n * @returns {Object} A map of uniform names to uniform locations.\n */\n getUniformLocations(\n gl: WebGLRenderingContext,\n program: WebGLProgram,\n ): TWebGLUniformLocationMap {\n const locations = (this.constructor as unknown as typeof BaseFilter)\n .uniformLocations;\n\n const uniformLocations: Record = {};\n for (let i = 0; i < locations.length; i++) {\n uniformLocations[locations[i]] = gl.getUniformLocation(\n program,\n locations[i],\n );\n }\n return uniformLocations;\n }\n\n /**\n * Send attribute data from this filter to its shader program on the GPU.\n *\n * @param {WebGLRenderingContext} gl The canvas context used to compile the shader program.\n * @param {Object} attributeLocations A map of shader attribute names to their locations.\n */\n sendAttributeData(\n gl: WebGLRenderingContext,\n attributeLocations: Record,\n aPositionData: Float32Array,\n ) {\n const attributeLocation = attributeLocations.aPosition;\n const buffer = gl.createBuffer();\n gl.bindBuffer(gl.ARRAY_BUFFER, buffer);\n gl.enableVertexAttribArray(attributeLocation);\n gl.vertexAttribPointer(attributeLocation, 2, gl.FLOAT, false, 0, 0);\n gl.bufferData(gl.ARRAY_BUFFER, aPositionData, gl.STATIC_DRAW);\n }\n\n _setupFrameBuffer(options: TWebGLPipelineState) {\n const gl = options.context;\n if (options.passes > 1) {\n const width = options.destinationWidth;\n const height = options.destinationHeight;\n if (options.sourceWidth !== width || options.sourceHeight !== height) {\n gl.deleteTexture(options.targetTexture);\n options.targetTexture = options.filterBackend.createTexture(\n gl,\n width,\n height,\n );\n }\n gl.framebufferTexture2D(\n gl.FRAMEBUFFER,\n gl.COLOR_ATTACHMENT0,\n gl.TEXTURE_2D,\n options.targetTexture,\n 0,\n );\n } else {\n // draw last filter on canvas and not to framebuffer.\n gl.bindFramebuffer(gl.FRAMEBUFFER, null);\n gl.finish();\n }\n }\n\n _swapTextures(options: TWebGLPipelineState) {\n options.passes--;\n options.pass++;\n const temp = options.targetTexture;\n options.targetTexture = options.sourceTexture;\n options.sourceTexture = temp;\n }\n\n /**\n * Generic isNeutral implementation for one parameter based filters.\n * Used only in image applyFilters to discard filters that will not have an effect\n * on the image\n * Other filters may need their own version ( ColorMatrix, HueRotation, gamma, ComposedFilter )\n * @param {Object} options\n **/\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n isNeutralState(options?: any): boolean {\n return false;\n }\n\n /**\n * Apply this filter to the input image data provided.\n *\n * Determines whether to use WebGL or Canvas2D based on the options.webgl flag.\n *\n * @param {Object} options\n * @param {Number} options.passes The number of filters remaining to be executed\n * @param {Boolean} options.webgl Whether to use webgl to render the filter.\n * @param {WebGLTexture} options.sourceTexture The texture setup as the source to be filtered.\n * @param {WebGLTexture} options.targetTexture The texture where filtered output should be drawn.\n * @param {WebGLRenderingContext} options.context The GL context used for rendering.\n * @param {Object} options.programCache A map of compiled shader programs, keyed by filter type.\n */\n applyTo(options: TWebGLPipelineState | T2DPipelineState) {\n if (isWebGLPipelineState(options)) {\n this._setupFrameBuffer(options);\n this.applyToWebGL(options);\n this._swapTextures(options);\n } else {\n this.applyTo2d(options);\n }\n }\n\n applyTo2d(_options: T2DPipelineState): void {\n // override by subclass\n }\n\n /**\n * Returns a string that represent the current selected shader code for the filter.\n * Used to force recompilation when parameters change or to retrieve the shader from cache\n * @type string\n **/\n getCacheKey(): string {\n return this.type;\n }\n\n /**\n * Retrieves the cached shader.\n * @param {Object} options\n * @param {WebGLRenderingContext} options.context The GL context used for rendering.\n * @param {Object} options.programCache A map of compiled shader programs, keyed by filter type.\n * @return {WebGLProgram} the compiled program shader\n */\n retrieveShader(options: TWebGLPipelineState): TWebGLProgramCacheItem {\n const key = this.getCacheKey();\n if (!options.programCache[key]) {\n options.programCache[key] = this.createProgram(options.context);\n }\n return options.programCache[key];\n }\n\n /**\n * Apply this filter using webgl.\n *\n * @param {Object} options\n * @param {Number} options.passes The number of filters remaining to be executed\n * @param {Boolean} options.webgl Whether to use webgl to render the filter.\n * @param {WebGLTexture} options.originalTexture The texture of the original input image.\n * @param {WebGLTexture} options.sourceTexture The texture setup as the source to be filtered.\n * @param {WebGLTexture} options.targetTexture The texture where filtered output should be drawn.\n * @param {WebGLRenderingContext} options.context The GL context used for rendering.\n * @param {Object} options.programCache A map of compiled shader programs, keyed by filter type.\n */\n applyToWebGL(options: TWebGLPipelineState) {\n const gl = options.context;\n const shader = this.retrieveShader(options);\n if (options.pass === 0 && options.originalTexture) {\n gl.bindTexture(gl.TEXTURE_2D, options.originalTexture);\n } else {\n gl.bindTexture(gl.TEXTURE_2D, options.sourceTexture);\n }\n gl.useProgram(shader.program);\n this.sendAttributeData(gl, shader.attributeLocations, options.aPosition);\n\n gl.uniform1f(shader.uniformLocations.uStepW, 1 / options.sourceWidth);\n gl.uniform1f(shader.uniformLocations.uStepH, 1 / options.sourceHeight);\n\n this.sendUniformData(gl, shader.uniformLocations);\n gl.viewport(0, 0, options.destinationWidth, options.destinationHeight);\n gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4);\n }\n\n bindAdditionalTexture(\n gl: WebGLRenderingContext,\n texture: WebGLTexture,\n textureUnit: number,\n ) {\n gl.activeTexture(textureUnit);\n gl.bindTexture(gl.TEXTURE_2D, texture);\n // reset active texture to 0 as usual\n gl.activeTexture(gl.TEXTURE0);\n }\n\n unbindAdditionalTexture(gl: WebGLRenderingContext, textureUnit: number) {\n gl.activeTexture(textureUnit);\n gl.bindTexture(gl.TEXTURE_2D, null);\n gl.activeTexture(gl.TEXTURE0);\n }\n\n /**\n * Send uniform data from this filter to its shader program on the GPU.\n *\n * Intended to be overridden by subclasses.\n *\n * @param {WebGLRenderingContext} _gl The canvas context used to compile the shader program.\n * @param {Object} _uniformLocations A map of shader uniform names to their locations.\n */\n sendUniformData(\n _gl: WebGLRenderingContext,\n _uniformLocations: TWebGLUniformLocationMap,\n ): void {\n // override by subclass\n }\n\n /**\n * If needed by a 2d filter, this functions can create an helper canvas to be used\n * remember that options.targetCanvas is available for use till end of chain.\n */\n createHelpLayer(options: T2DPipelineState) {\n if (!options.helpLayer) {\n const { sourceWidth, sourceHeight } = options;\n const helpLayer = createCanvasElementFor({\n width: sourceWidth,\n height: sourceHeight,\n });\n options.helpLayer = helpLayer;\n }\n }\n\n /**\n * Returns object representation of an instance\n * It will automatically export the default values of a filter,\n * stored in the static defaults property.\n * @return {Object} Object representation of an instance\n */\n toObject(): { type: Name } & SerializedProps {\n const defaultKeys = Object.keys(\n (this.constructor as typeof BaseFilter).defaults || {},\n ) as (keyof SerializedProps)[];\n\n return {\n type: this.type,\n ...defaultKeys.reduce((acc, key) => {\n acc[key] = this[\n key as keyof this\n ] as unknown as (typeof acc)[typeof key];\n return acc;\n }, {} as SerializedProps),\n };\n }\n\n /**\n * Returns a JSON representation of an instance\n * @return {Object} JSON\n */\n toJSON() {\n // delegate, not alias\n return this.toObject();\n }\n\n static async fromObject(\n { type, ...filterOptions }: Record,\n _options?: Abortable,\n ): Promise> {\n return new this(filterOptions);\n }\n}\n","export const blendColorFragmentSource = {\n multiply: 'gl_FragColor.rgb *= uColor.rgb;\\n',\n screen:\n 'gl_FragColor.rgb = 1.0 - (1.0 - gl_FragColor.rgb) * (1.0 - uColor.rgb);\\n',\n add: 'gl_FragColor.rgb += uColor.rgb;\\n',\n difference: 'gl_FragColor.rgb = abs(gl_FragColor.rgb - uColor.rgb);\\n',\n subtract: 'gl_FragColor.rgb -= uColor.rgb;\\n',\n lighten: 'gl_FragColor.rgb = max(gl_FragColor.rgb, uColor.rgb);\\n',\n darken: 'gl_FragColor.rgb = min(gl_FragColor.rgb, uColor.rgb);\\n',\n exclusion:\n 'gl_FragColor.rgb += uColor.rgb - 2.0 * (uColor.rgb * gl_FragColor.rgb);\\n',\n overlay: `\n if (uColor.r < 0.5) {\n gl_FragColor.r *= 2.0 * uColor.r;\n } else {\n gl_FragColor.r = 1.0 - 2.0 * (1.0 - gl_FragColor.r) * (1.0 - uColor.r);\n }\n if (uColor.g < 0.5) {\n gl_FragColor.g *= 2.0 * uColor.g;\n } else {\n gl_FragColor.g = 1.0 - 2.0 * (1.0 - gl_FragColor.g) * (1.0 - uColor.g);\n }\n if (uColor.b < 0.5) {\n gl_FragColor.b *= 2.0 * uColor.b;\n } else {\n gl_FragColor.b = 1.0 - 2.0 * (1.0 - gl_FragColor.b) * (1.0 - uColor.b);\n }\n `,\n tint: `\n gl_FragColor.rgb *= (1.0 - uColor.a);\n gl_FragColor.rgb += uColor.rgb;\n `,\n} as const;\n","import { Color } from '../color/Color';\nimport { BaseFilter } from './BaseFilter';\nimport type { T2DPipelineState, TWebGLUniformLocationMap } from './typedefs';\nimport { classRegistry } from '../ClassRegistry';\nimport { blendColorFragmentSource } from './shaders/blendColor';\n\nexport type TBlendMode =\n | 'multiply'\n | 'add'\n | 'difference'\n | 'screen'\n | 'subtract'\n | 'darken'\n | 'lighten'\n | 'overlay'\n | 'exclusion'\n | 'tint';\n\ntype BlendColorOwnProps = {\n color: string;\n mode: TBlendMode;\n alpha: number;\n};\n\nexport const blendColorDefaultValues: BlendColorOwnProps = {\n color: '#F95C63',\n mode: 'multiply',\n alpha: 1,\n};\n\n/**\n * Color Blend filter class\n * @example\n * const filter = new BlendColor({\n * color: '#000',\n * mode: 'multiply'\n * });\n *\n * const filter = new BlendImage({\n * image: fabricImageObject,\n * mode: 'multiply'\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n * canvas.renderAll();\n */\nexport class BlendColor extends BaseFilter<'BlendColor', BlendColorOwnProps> {\n /**\n * Color to make the blend operation with. default to a reddish color since black or white\n * gives always strong result.\n * @type String\n **/\n declare color: BlendColorOwnProps['color'];\n\n /**\n * Blend mode for the filter: one of multiply, add, difference, screen, subtract,\n * darken, lighten, overlay, exclusion, tint.\n * @type String\n **/\n declare mode: BlendColorOwnProps['mode'];\n /**\n * alpha value. represent the strength of the blend color operation.\n * @type Number\n **/\n declare alpha: BlendColorOwnProps['alpha'];\n\n static defaults = blendColorDefaultValues;\n\n static type = 'BlendColor';\n\n static uniformLocations = ['uColor'];\n\n getCacheKey() {\n return `${this.type}_${this.mode}`;\n }\n\n protected getFragmentSource(): string {\n return `\n precision highp float;\n uniform sampler2D uTexture;\n uniform vec4 uColor;\n varying vec2 vTexCoord;\n void main() {\n vec4 color = texture2D(uTexture, vTexCoord);\n gl_FragColor = color;\n if (color.a > 0.0) {\n ${blendColorFragmentSource[this.mode]}\n }\n }\n `;\n }\n\n /**\n * Apply the Blend operation to a Uint8ClampedArray representing the pixels of an image.\n *\n * @param {Object} options\n * @param {ImageData} options.imageData The Uint8ClampedArray to be filtered.\n */\n applyTo2d({ imageData: { data } }: T2DPipelineState) {\n const source = new Color(this.color).getSource();\n const alpha = this.alpha;\n const tr = source[0] * alpha;\n const tg = source[1] * alpha;\n const tb = source[2] * alpha;\n const alpha1 = 1 - alpha;\n\n for (let i = 0; i < data.length; i += 4) {\n const r = data[i];\n const g = data[i + 1];\n const b = data[i + 2];\n let oR, oG, oB;\n switch (this.mode) {\n case 'multiply':\n oR = (r * tr) / 255;\n oG = (g * tg) / 255;\n oB = (b * tb) / 255;\n break;\n case 'screen':\n oR = 255 - ((255 - r) * (255 - tr)) / 255;\n oG = 255 - ((255 - g) * (255 - tg)) / 255;\n oB = 255 - ((255 - b) * (255 - tb)) / 255;\n break;\n case 'add':\n oR = r + tr;\n oG = g + tg;\n oB = b + tb;\n break;\n case 'difference':\n oR = Math.abs(r - tr);\n oG = Math.abs(g - tg);\n oB = Math.abs(b - tb);\n break;\n case 'subtract':\n oR = r - tr;\n oG = g - tg;\n oB = b - tb;\n break;\n case 'darken':\n oR = Math.min(r, tr);\n oG = Math.min(g, tg);\n oB = Math.min(b, tb);\n break;\n case 'lighten':\n oR = Math.max(r, tr);\n oG = Math.max(g, tg);\n oB = Math.max(b, tb);\n break;\n case 'overlay':\n oR =\n tr < 128\n ? (2 * r * tr) / 255\n : 255 - (2 * (255 - r) * (255 - tr)) / 255;\n oG =\n tg < 128\n ? (2 * g * tg) / 255\n : 255 - (2 * (255 - g) * (255 - tg)) / 255;\n oB =\n tb < 128\n ? (2 * b * tb) / 255\n : 255 - (2 * (255 - b) * (255 - tb)) / 255;\n break;\n case 'exclusion':\n oR = tr + r - (2 * tr * r) / 255;\n oG = tg + g - (2 * tg * g) / 255;\n oB = tb + b - (2 * tb * b) / 255;\n break;\n case 'tint':\n oR = tr + r * alpha1;\n oG = tg + g * alpha1;\n oB = tb + b * alpha1;\n }\n data[i] = oR;\n data[i + 1] = oG;\n data[i + 2] = oB;\n }\n }\n\n /**\n * Send data from this filter to its shader program's uniforms.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n */\n sendUniformData(\n gl: WebGLRenderingContext,\n uniformLocations: TWebGLUniformLocationMap,\n ) {\n const source = new Color(this.color).getSource();\n source[0] = (this.alpha * source[0]) / 255;\n source[1] = (this.alpha * source[1]) / 255;\n source[2] = (this.alpha * source[2]) / 255;\n source[3] = this.alpha;\n gl.uniform4fv(uniformLocations.uColor, source);\n }\n}\n\nclassRegistry.setClass(BlendColor);\n","import type { TBlendImageMode } from '../BlendImage';\n\nexport const fragmentSource: Record = {\n multiply: `\n precision highp float;\n uniform sampler2D uTexture;\n uniform sampler2D uImage;\n uniform vec4 uColor;\n varying vec2 vTexCoord;\n varying vec2 vTexCoord2;\n void main() {\n vec4 color = texture2D(uTexture, vTexCoord);\n vec4 color2 = texture2D(uImage, vTexCoord2);\n color.rgba *= color2.rgba;\n gl_FragColor = color;\n }\n `,\n mask: `\n precision highp float;\n uniform sampler2D uTexture;\n uniform sampler2D uImage;\n uniform vec4 uColor;\n varying vec2 vTexCoord;\n varying vec2 vTexCoord2;\n void main() {\n vec4 color = texture2D(uTexture, vTexCoord);\n vec4 color2 = texture2D(uImage, vTexCoord2);\n color.a = color2.a;\n gl_FragColor = color;\n }\n `,\n} as const;\n\nexport const vertexSource = `\n attribute vec2 aPosition;\n varying vec2 vTexCoord;\n varying vec2 vTexCoord2;\n uniform mat3 uTransformMatrix;\n void main() {\n vTexCoord = aPosition;\n vTexCoord2 = (uTransformMatrix * vec3(aPosition, 1.0)).xy;\n gl_Position = vec4(aPosition * 2.0 - 1.0, 0.0, 1.0);\n }\n ` as const;\n","import { FabricImage } from '../shapes/Image';\nimport { createCanvasElement } from '../util/misc/dom';\nimport { BaseFilter } from './BaseFilter';\nimport type {\n T2DPipelineState,\n TWebGLPipelineState,\n TWebGLUniformLocationMap,\n} from './typedefs';\nimport type { WebGLFilterBackend } from './WebGLFilterBackend';\nimport { classRegistry } from '../ClassRegistry';\nimport { fragmentSource, vertexSource } from './shaders/blendImage';\n\nexport type TBlendImageMode = 'multiply' | 'mask';\n\ntype BlendImageOwnProps = {\n mode: TBlendImageMode;\n alpha: number;\n};\n\nexport const blendImageDefaultValues: BlendImageOwnProps = {\n mode: 'multiply',\n alpha: 1,\n};\n\n/**\n * Image Blend filter class\n * @example\n * const filter = new filters.BlendColor({\n * color: '#000',\n * mode: 'multiply'\n * });\n *\n * const filter = new BlendImage({\n * image: fabricImageObject,\n * mode: 'multiply'\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n * canvas.renderAll();\n */\nexport class BlendImage extends BaseFilter<'BlendImage', BlendImageOwnProps> {\n /**\n * Image to make the blend operation with.\n **/\n declare image: FabricImage;\n\n /**\n * Blend mode for the filter: either 'multiply' or 'mask'. 'multiply' will\n * multiply the values of each channel (R, G, B, and A) of the filter image by\n * their corresponding values in the base image. 'mask' will only look at the\n * alpha channel of the filter image, and apply those values to the base\n * image's alpha channel.\n * @type String\n **/\n declare mode: BlendImageOwnProps['mode'];\n\n /**\n * alpha value. represent the strength of the blend image operation.\n * not implemented.\n **/\n declare alpha: BlendImageOwnProps['alpha'];\n\n static type = 'BlendImage';\n\n static defaults = blendImageDefaultValues;\n\n static uniformLocations = ['uTransformMatrix', 'uImage'];\n\n getCacheKey() {\n return `${this.type}_${this.mode}`;\n }\n\n getFragmentSource(): string {\n return fragmentSource[this.mode];\n }\n\n getVertexSource(): string {\n return vertexSource;\n }\n\n applyToWebGL(options: TWebGLPipelineState) {\n const gl = options.context,\n texture = this.createTexture(options.filterBackend, this.image);\n this.bindAdditionalTexture(gl, texture!, gl.TEXTURE1);\n super.applyToWebGL(options);\n this.unbindAdditionalTexture(gl, gl.TEXTURE1);\n }\n\n createTexture(backend: WebGLFilterBackend, image: FabricImage) {\n return backend.getCachedTexture(image.cacheKey, image.getElement());\n }\n\n /**\n * Calculate a transformMatrix to adapt the image to blend over\n * @param {Object} options\n * @param {WebGLRenderingContext} options.context The GL context used for rendering.\n * @param {Object} options.programCache A map of compiled shader programs, keyed by filter type.\n */\n calculateMatrix() {\n const image = this.image,\n { width, height } = image.getElement();\n return [\n 1 / image.scaleX,\n 0,\n 0,\n 0,\n 1 / image.scaleY,\n 0,\n -image.left / width,\n -image.top / height,\n 1,\n ];\n }\n\n /**\n * Apply the Blend operation to a Uint8ClampedArray representing the pixels of an image.\n *\n * @param {Object} options\n * @param {ImageData} options.imageData The Uint8ClampedArray to be filtered.\n */\n applyTo2d({\n imageData: { data, width, height },\n filterBackend: { resources },\n }: T2DPipelineState) {\n const image = this.image;\n if (!resources.blendImage) {\n resources.blendImage = createCanvasElement();\n }\n const canvas1 = resources.blendImage;\n const context = canvas1.getContext('2d')!;\n if (canvas1.width !== width || canvas1.height !== height) {\n canvas1.width = width;\n canvas1.height = height;\n } else {\n context.clearRect(0, 0, width, height);\n }\n context.setTransform(\n image.scaleX,\n 0,\n 0,\n image.scaleY,\n image.left,\n image.top,\n );\n context.drawImage(image.getElement(), 0, 0, width, height);\n const blendData = context.getImageData(0, 0, width, height).data;\n for (let i = 0; i < data.length; i += 4) {\n const r = data[i];\n const g = data[i + 1];\n const b = data[i + 2];\n const a = data[i + 3];\n\n const tr = blendData[i];\n const tg = blendData[i + 1];\n const tb = blendData[i + 2];\n const ta = blendData[i + 3];\n\n switch (this.mode) {\n case 'multiply':\n data[i] = (r * tr) / 255;\n data[i + 1] = (g * tg) / 255;\n data[i + 2] = (b * tb) / 255;\n data[i + 3] = (a * ta) / 255;\n break;\n case 'mask':\n data[i + 3] = ta;\n break;\n }\n }\n }\n\n /**\n * Send data from this filter to its shader program's uniforms.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n */\n sendUniformData(\n gl: WebGLRenderingContext,\n uniformLocations: TWebGLUniformLocationMap,\n ) {\n const matrix = this.calculateMatrix();\n gl.uniform1i(uniformLocations.uImage, 1); // texture unit 1.\n gl.uniformMatrix3fv(uniformLocations.uTransformMatrix, false, matrix);\n }\n\n /**\n * Returns object representation of an instance\n * TODO: Handle the possibility of missing image better.\n * As of now a BlendImage filter without image can't be used with fromObject\n * @return {Object} Object representation of an instance\n */\n toObject(): {\n type: 'BlendImage';\n image: ReturnType;\n } & BlendImageOwnProps {\n return {\n ...super.toObject(),\n image: this.image && this.image.toObject(),\n };\n }\n\n /**\n * Create filter instance from an object representation\n * @param {object} object Object to create an instance from\n * @param {object} [options]\n * @param {AbortSignal} [options.signal] handle aborting image loading, see https://developer.mozilla.org/en-US/docs/Web/API/AbortController/signal\n * @returns {Promise}\n */\n static async fromObject(\n { type, image, ...filterOptions }: Record,\n options: { signal: AbortSignal },\n ): Promise> {\n return FabricImage.fromObject(image, options).then(\n (enlivedImage) => new this({ ...filterOptions, image: enlivedImage }),\n );\n }\n}\n\nclassRegistry.setClass(BlendImage);\n","import { BaseFilter } from './BaseFilter';\nimport type {\n TWebGLPipelineState,\n T2DPipelineState,\n TWebGLUniformLocationMap,\n} from './typedefs';\nimport { isWebGLPipelineState } from './utils';\nimport { classRegistry } from '../ClassRegistry';\nimport { fragmentSource } from './shaders/blur';\n\ntype BlurOwnProps = {\n blur: number;\n};\n\nexport const blurDefaultValues: BlurOwnProps = {\n blur: 0,\n};\n\n/**\n * Blur filter class\n * @example\n * const filter = new Blur({\n * blur: 0.5\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n * canvas.renderAll();\n */\nexport class Blur extends BaseFilter<'Blur', BlurOwnProps> {\n /**\n * blur value, in percentage of image dimensions.\n * specific to keep the image blur constant at different resolutions\n * range between 0 and 1.\n * @type Number\n */\n declare blur: BlurOwnProps['blur'];\n\n declare horizontal: boolean;\n declare aspectRatio: number;\n\n static type = 'Blur';\n\n static defaults = blurDefaultValues;\n\n static uniformLocations = ['uDelta'];\n\n getFragmentSource(): string {\n return fragmentSource;\n }\n\n applyTo(options: TWebGLPipelineState | T2DPipelineState) {\n if (isWebGLPipelineState(options)) {\n // this aspectRatio is used to give the same blur to vertical and horizontal\n this.aspectRatio = options.sourceWidth / options.sourceHeight;\n options.passes++;\n this._setupFrameBuffer(options);\n this.horizontal = true;\n this.applyToWebGL(options);\n this._swapTextures(options);\n this._setupFrameBuffer(options);\n this.horizontal = false;\n this.applyToWebGL(options);\n this._swapTextures(options);\n } else {\n this.applyTo2d(options);\n }\n }\n\n applyTo2d({ imageData: { data, width, height } }: T2DPipelineState) {\n // this code mimic the shader for output consistency\n // it samples 31 pixels across the image over a distance that depends from the blur value.\n this.aspectRatio = width / height;\n this.horizontal = true;\n let blurValue = this.getBlurValue() * width;\n const imageData = new Uint8ClampedArray(data);\n const samples = 15;\n const bytesInRow = 4 * width;\n for (let i = 0; i < data.length; i += 4) {\n let r = 0.0,\n g = 0.0,\n b = 0.0,\n a = 0.0,\n totalA = 0;\n const minIRow = i - (i % bytesInRow);\n const maxIRow = minIRow + bytesInRow;\n // for now let's keep noise out of the way\n // let pixelOffset = 0;\n // const offset = Math.random() * 3;\n // if (offset > 2) {\n // pixelOffset = 4;\n // } else if (offset < 1) {\n // pixelOffset = -4;\n // }\n for (let j = -samples + 1; j < samples; j++) {\n const percent = j / samples;\n const distance = Math.floor(blurValue * percent) * 4;\n const weight = 1 - Math.abs(percent);\n let sampledPixel = i + distance; // + pixelOffset;\n // try to implement edge mirroring\n if (sampledPixel < minIRow) {\n sampledPixel = minIRow;\n } else if (sampledPixel > maxIRow) {\n sampledPixel = maxIRow;\n }\n const localAlpha = data[sampledPixel + 3] * weight;\n r += data[sampledPixel] * localAlpha;\n g += data[sampledPixel + 1] * localAlpha;\n b += data[sampledPixel + 2] * localAlpha;\n a += localAlpha;\n totalA += weight;\n }\n imageData[i] = r / a;\n imageData[i + 1] = g / a;\n imageData[i + 2] = b / a;\n imageData[i + 3] = a / totalA;\n }\n this.horizontal = false;\n blurValue = this.getBlurValue() * height;\n for (let i = 0; i < imageData.length; i += 4) {\n let r = 0.0,\n g = 0.0,\n b = 0.0,\n a = 0.0,\n totalA = 0;\n const minIRow = i % bytesInRow;\n const maxIRow = imageData.length - bytesInRow + minIRow;\n // for now let's keep noise out of the way\n // let pixelOffset = 0;\n // const offset = Math.random() * 3;\n // if (offset > 2) {\n // pixelOffset = bytesInRow;\n // } else if (offset < 1) {\n // pixelOffset = -bytesInRow;\n // }\n for (let j = -samples + 1; j < samples; j++) {\n const percent = j / samples;\n const distance = Math.floor(blurValue * percent) * bytesInRow;\n const weight = 1 - Math.abs(percent);\n let sampledPixel = i + distance; // + pixelOffset;\n // try to implement edge mirroring\n if (sampledPixel < minIRow) {\n sampledPixel = minIRow;\n } else if (sampledPixel > maxIRow) {\n sampledPixel = maxIRow;\n }\n const localAlpha = imageData[sampledPixel + 3] * weight;\n r += imageData[sampledPixel] * localAlpha;\n g += imageData[sampledPixel + 1] * localAlpha;\n b += imageData[sampledPixel + 2] * localAlpha;\n a += localAlpha;\n totalA += weight;\n }\n data[i] = r / a;\n data[i + 1] = g / a;\n data[i + 2] = b / a;\n data[i + 3] = a / totalA;\n }\n }\n\n /**\n * Send data from this filter to its shader program's uniforms.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n */\n sendUniformData(\n gl: WebGLRenderingContext,\n uniformLocations: TWebGLUniformLocationMap,\n ) {\n const delta = this.chooseRightDelta();\n gl.uniform2fv(uniformLocations.uDelta, delta);\n }\n\n isNeutralState() {\n return this.blur === 0;\n }\n\n getBlurValue(): number {\n let blurScale = 1;\n const { horizontal, aspectRatio } = this;\n if (horizontal) {\n if (aspectRatio > 1) {\n // image is wide, i want to shrink radius horizontal\n blurScale = 1 / aspectRatio;\n }\n } else {\n if (aspectRatio < 1) {\n // image is tall, i want to shrink radius vertical\n blurScale = aspectRatio;\n }\n }\n return blurScale * this.blur * 0.12;\n }\n\n /**\n * choose right value of image percentage to blur with\n * @returns {Array} a numeric array with delta values\n */\n chooseRightDelta() {\n const blur = this.getBlurValue();\n return this.horizontal ? [blur, 0] : [0, blur];\n }\n}\n\nclassRegistry.setClass(Blur);\n","export const fragmentSource = `\n precision highp float;\n uniform sampler2D uTexture;\n uniform vec2 uDelta;\n varying vec2 vTexCoord;\n const float nSamples = 15.0;\n vec3 v3offset = vec3(12.9898, 78.233, 151.7182);\n float random(vec3 scale) {\n /* use the fragment position for a different seed per-pixel */\n return fract(sin(dot(gl_FragCoord.xyz, scale)) * 43758.5453);\n }\n void main() {\n vec4 color = vec4(0.0);\n float totalC = 0.0;\n float totalA = 0.0;\n float offset = random(v3offset);\n for (float t = -nSamples; t <= nSamples; t++) {\n float percent = (t + offset - 0.5) / nSamples;\n vec4 sample = texture2D(uTexture, vTexCoord + uDelta * percent);\n float weight = 1.0 - abs(percent);\n float alpha = weight * sample.a;\n color.rgb += sample.rgb * alpha;\n color.a += alpha;\n totalA += weight;\n totalC += alpha;\n }\n gl_FragColor.rgb = color.rgb / totalC;\n gl_FragColor.a = color.a / totalA;\n }\n ` as const;\n","import { BaseFilter } from './BaseFilter';\nimport type { T2DPipelineState, TWebGLUniformLocationMap } from './typedefs';\nimport { classRegistry } from '../ClassRegistry';\nimport { fragmentSource } from './shaders/brightness';\n\ntype BrightnessOwnProps = {\n brightness: number;\n};\n\nexport const brightnessDefaultValues: BrightnessOwnProps = {\n brightness: 0,\n};\n\n/**\n * Brightness filter class\n * @example\n * const filter = new Brightness({\n * brightness: 0.05\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n */\nexport class Brightness extends BaseFilter<'Brightness', BrightnessOwnProps> {\n /**\n * Brightness value, from -1 to 1.\n * translated to -255 to 255 for 2d\n * 0.0039215686 is the part of 1 that get translated to 1 in 2d\n * @param {Number} brightness\n */\n declare brightness: BrightnessOwnProps['brightness'];\n\n static type = 'Brightness';\n\n static defaults = brightnessDefaultValues;\n\n static uniformLocations = ['uBrightness'];\n\n getFragmentSource() {\n return fragmentSource;\n }\n\n /**\n * Apply the Brightness operation to a Uint8ClampedArray representing the pixels of an image.\n *\n * @param {Object} options\n * @param {ImageData} options.imageData The Uint8ClampedArray to be filtered.\n */\n applyTo2d({ imageData: { data } }: T2DPipelineState) {\n const brightness = Math.round(this.brightness * 255);\n for (let i = 0; i < data.length; i += 4) {\n data[i] += brightness;\n data[i + 1] += brightness;\n data[i + 2] += brightness;\n }\n }\n\n isNeutralState() {\n return this.brightness === 0;\n }\n\n /**\n * Send data from this filter to its shader program's uniforms.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n */\n sendUniformData(\n gl: WebGLRenderingContext,\n uniformLocations: TWebGLUniformLocationMap,\n ) {\n gl.uniform1f(uniformLocations.uBrightness, this.brightness);\n }\n}\n\nclassRegistry.setClass(Brightness);\n","export const fragmentSource = `\n precision highp float;\n uniform sampler2D uTexture;\n uniform float uBrightness;\n varying vec2 vTexCoord;\n void main() {\n vec4 color = texture2D(uTexture, vTexCoord);\n color.rgb += uBrightness;\n gl_FragColor = color;\n }\n`;\n","export const fragmentSource = `\n precision highp float;\n uniform sampler2D uTexture;\n varying vec2 vTexCoord;\n uniform mat4 uColorMatrix;\n uniform vec4 uConstants;\n void main() {\n vec4 color = texture2D(uTexture, vTexCoord);\n color *= uColorMatrix;\n color += uConstants;\n gl_FragColor = color;\n }`;\n","import { BaseFilter } from './BaseFilter';\nimport type {\n T2DPipelineState,\n TMatColorMatrix,\n TWebGLUniformLocationMap,\n} from './typedefs';\nimport { classRegistry } from '../ClassRegistry';\nimport { fragmentSource } from './shaders/colorMatrix';\n\nexport type ColorMatrixOwnProps = {\n matrix: TMatColorMatrix;\n colorsOnly: boolean;\n};\n\nexport const colorMatrixDefaultValues: ColorMatrixOwnProps = {\n matrix: [1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0],\n colorsOnly: true,\n};\n\n/**\n * Color Matrix filter class\n * @see {@link http://fabricjs.com/image-filters|ImageFilters demo}\n * @see {@Link http://phoboslab.org/log/2013/11/fast-image-filters-with-webgl demo}\n * @example Kodachrome filter\n * const filter = new ColorMatrix({\n * matrix: [\n 1.1285582396593525, -0.3967382283601348, -0.03992559172921793, 0, 63.72958762196502,\n -0.16404339962244616, 1.0835251566291304, -0.05498805115633132, 0, 24.732407896706203,\n -0.16786010706155763, -0.5603416277695248, 1.6014850761964943, 0, 35.62982807460946,\n 0, 0, 0, 1, 0\n ]\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n */\nexport class ColorMatrix<\n Name extends string = 'ColorMatrix',\n OwnProps extends object = ColorMatrixOwnProps,\n SerializedProps extends object = ColorMatrixOwnProps,\n> extends BaseFilter {\n /**\n * Colormatrix for pixels.\n * array of 20 floats. Numbers in positions 4, 9, 14, 19 loose meaning\n * outside the -1, 1 range.\n * 0.0039215686 is the part of 1 that get translated to 1 in 2d\n * @param {Array} matrix array of 20 numbers.\n */\n declare matrix: ColorMatrixOwnProps['matrix'];\n\n /**\n * Lock the colormatrix on the color part, skipping alpha, mainly for non webgl scenario\n * to save some calculation\n * @type Boolean\n * @default true\n */\n declare colorsOnly: ColorMatrixOwnProps['colorsOnly'];\n\n static type = 'ColorMatrix';\n\n static defaults = colorMatrixDefaultValues;\n\n static uniformLocations = ['uColorMatrix', 'uConstants'];\n\n getFragmentSource(): string {\n return fragmentSource;\n }\n\n /**\n * Apply the ColorMatrix operation to a Uint8Array representing the pixels of an image.\n *\n * @param {Object} options\n * @param {ImageData} options.imageData The Uint8Array to be filtered.\n */\n applyTo2d(options: T2DPipelineState) {\n const imageData = options.imageData,\n data = imageData.data,\n m = this.matrix,\n colorsOnly = this.colorsOnly;\n\n for (let i = 0; i < data.length; i += 4) {\n const r = data[i];\n const g = data[i + 1];\n const b = data[i + 2];\n\n data[i] = r * m[0] + g * m[1] + b * m[2] + m[4] * 255;\n data[i + 1] = r * m[5] + g * m[6] + b * m[7] + m[9] * 255;\n data[i + 2] = r * m[10] + g * m[11] + b * m[12] + m[14] * 255;\n if (!colorsOnly) {\n const a = data[i + 3];\n data[i] += a * m[3];\n data[i + 1] += a * m[8];\n data[i + 2] += a * m[13];\n data[i + 3] =\n r * m[15] + g * m[16] + b * m[17] + a * m[18] + m[19] * 255;\n }\n }\n }\n\n /**\n * Send data from this filter to its shader program's uniforms.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n */\n sendUniformData(\n gl: WebGLRenderingContext,\n uniformLocations: TWebGLUniformLocationMap,\n ) {\n const m = this.matrix,\n matrix = [\n m[0],\n m[1],\n m[2],\n m[3],\n m[5],\n m[6],\n m[7],\n m[8],\n m[10],\n m[11],\n m[12],\n m[13],\n m[15],\n m[16],\n m[17],\n m[18],\n ],\n constants = [m[4], m[9], m[14], m[19]];\n gl.uniformMatrix4fv(uniformLocations.uColorMatrix, false, matrix);\n gl.uniform4fv(uniformLocations.uConstants, constants);\n }\n\n toObject(): { type: Name } & SerializedProps {\n return {\n ...super.toObject(),\n matrix: [...this.matrix] as TMatColorMatrix,\n };\n }\n}\n\nclassRegistry.setClass(ColorMatrix);\n","import { ColorMatrix } from './ColorMatrix';\nimport { classRegistry } from '../ClassRegistry';\nimport type { TMatColorMatrix } from './typedefs';\n\ntype FixedFiltersOwnProps = {\n colorsOnly: boolean;\n};\n\nexport function createColorMatrixFilter(key: string, matrix: TMatColorMatrix) {\n const newClass = class extends ColorMatrix<\n typeof key,\n FixedFiltersOwnProps,\n FixedFiltersOwnProps\n > {\n static type = key;\n\n static defaults = {\n colorsOnly: false,\n matrix,\n };\n\n toObject(): { type: string } & FixedFiltersOwnProps {\n return { type: this.type, colorsOnly: this.colorsOnly };\n }\n };\n classRegistry.setClass(newClass, key);\n return newClass as typeof ColorMatrix;\n}\n\nexport const Brownie = createColorMatrixFilter(\n 'Brownie',\n [\n 0.5997, 0.34553, -0.27082, 0, 0.186, -0.0377, 0.86095, 0.15059, 0, -0.1449,\n 0.24113, -0.07441, 0.44972, 0, -0.02965, 0, 0, 0, 1, 0,\n ],\n);\n\nexport const Vintage = createColorMatrixFilter(\n 'Vintage',\n [\n 0.62793, 0.32021, -0.03965, 0, 0.03784, 0.02578, 0.64411, 0.03259, 0,\n 0.02926, 0.0466, -0.08512, 0.52416, 0, 0.02023, 0, 0, 0, 1, 0,\n ],\n);\n\nexport const Kodachrome = createColorMatrixFilter(\n 'Kodachrome',\n [\n 1.12855, -0.39673, -0.03992, 0, 0.24991, -0.16404, 1.08352, -0.05498, 0,\n 0.09698, -0.16786, -0.56034, 1.60148, 0, 0.13972, 0, 0, 0, 1, 0,\n ],\n);\n\nexport const Technicolor = createColorMatrixFilter(\n 'Technicolor',\n [\n 1.91252, -0.85453, -0.09155, 0, 0.04624, -0.30878, 1.76589, -0.10601, 0,\n -0.27589, -0.2311, -0.75018, 1.84759, 0, 0.12137, 0, 0, 0, 1, 0,\n ],\n);\n\nexport const Polaroid = createColorMatrixFilter(\n 'Polaroid',\n [\n 1.438, -0.062, -0.062, 0, 0, -0.122, 1.378, -0.122, 0, 0, -0.016, -0.016,\n 1.483, 0, 0, 0, 0, 0, 1, 0,\n ],\n);\n\nexport const Sepia = createColorMatrixFilter(\n 'Sepia',\n [\n 0.393, 0.769, 0.189, 0, 0, 0.349, 0.686, 0.168, 0, 0, 0.272, 0.534, 0.131,\n 0, 0, 0, 0, 0, 1, 0,\n ],\n);\n\nexport const BlackWhite = createColorMatrixFilter(\n 'BlackWhite',\n [\n 1.5, 1.5, 1.5, 0, -1, 1.5, 1.5, 1.5, 0, -1, 1.5, 1.5, 1.5, 0, -1, 0, 0, 0,\n 1, 0,\n ],\n);\n","import { BaseFilter } from './BaseFilter';\nimport type { T2DPipelineState, TWebGLPipelineState } from './typedefs';\nimport { isWebGLPipelineState } from './utils';\nimport { classRegistry } from '../ClassRegistry';\n\ntype ComposedOwnProps = {\n subFilters: BaseFilter[];\n};\n\ntype ComposedSerializedProps = {\n subFilters: Record[];\n};\n\n/**\n * A container class that knows how to apply a sequence of filters to an input image.\n */\nexport class Composed extends BaseFilter<\n 'Composed',\n ComposedOwnProps,\n ComposedSerializedProps\n> {\n /**\n * A non sparse array of filters to apply\n */\n declare subFilters: ComposedOwnProps['subFilters'];\n\n static type = 'Composed';\n\n constructor(\n options: { subFilters?: BaseFilter[] } & Record = {},\n ) {\n super(options);\n this.subFilters = options.subFilters || [];\n }\n\n /**\n * Apply this container's filters to the input image provided.\n *\n * @param {Object} options\n * @param {Number} options.passes The number of filters remaining to be applied.\n */\n applyTo(options: TWebGLPipelineState | T2DPipelineState) {\n if (isWebGLPipelineState(options)) {\n options.passes += this.subFilters.length - 1;\n }\n this.subFilters.forEach((filter) => {\n filter.applyTo(options);\n });\n }\n\n /**\n * Serialize this filter into JSON.\n * @returns {Object} A JSON representation of this filter.\n */\n toObject() {\n return {\n type: this.type,\n subFilters: this.subFilters.map((filter) => filter.toObject()),\n };\n }\n\n isNeutralState() {\n return !this.subFilters.some((filter) => !filter.isNeutralState());\n }\n\n /**\n * Deserialize a JSON definition of a ComposedFilter into a concrete instance.\n * @param {oject} object Object to create an instance from\n * @param {object} [options]\n * @param {AbortSignal} [options.signal] handle aborting `BlendImage` filter loading, see https://developer.mozilla.org/en-US/docs/Web/API/AbortController/signal\n * @returns {Promise}\n */\n static fromObject(\n object: Record,\n options?: { signal: AbortSignal },\n ): Promise {\n return Promise.all(\n ((object.subFilters || []) as BaseFilter[]).map((filter) =>\n classRegistry\n .getClass(filter.type)\n .fromObject(filter, options),\n ),\n ).then((enlivedFilters) => new this({ subFilters: enlivedFilters }));\n }\n}\n\nclassRegistry.setClass(Composed);\n","import { BaseFilter } from './BaseFilter';\nimport type { T2DPipelineState, TWebGLUniformLocationMap } from './typedefs';\nimport { classRegistry } from '../ClassRegistry';\nimport { fragmentSource } from './shaders/constrast';\n\ntype ContrastOwnProps = {\n contrast: number;\n};\n\nexport const contrastDefaultValues: ContrastOwnProps = {\n contrast: 0,\n};\n\n/**\n * Contrast filter class\n * @example\n * const filter = new Contrast({\n * contrast: 0.25\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n */\nexport class Contrast extends BaseFilter<'Contrast', ContrastOwnProps> {\n /**\n * contrast value, range from -1 to 1.\n * @param {Number} contrast\n * @default 0\n */\n declare contrast: ContrastOwnProps['contrast'];\n\n static type = 'Contrast';\n\n static defaults = contrastDefaultValues;\n\n static uniformLocations = ['uContrast'];\n\n getFragmentSource() {\n return fragmentSource;\n }\n\n isNeutralState() {\n return this.contrast === 0;\n }\n\n /**\n * Apply the Contrast operation to a Uint8Array representing the pixels of an image.\n *\n * @param {Object} options\n * @param {ImageData} options.imageData The Uint8Array to be filtered.\n */\n applyTo2d({ imageData: { data } }: T2DPipelineState) {\n const contrast = Math.floor(this.contrast * 255),\n contrastF = (259 * (contrast + 255)) / (255 * (259 - contrast));\n\n for (let i = 0; i < data.length; i += 4) {\n data[i] = contrastF * (data[i] - 128) + 128;\n data[i + 1] = contrastF * (data[i + 1] - 128) + 128;\n data[i + 2] = contrastF * (data[i + 2] - 128) + 128;\n }\n }\n\n /**\n * Send data from this filter to its shader program's uniforms.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n */\n sendUniformData(\n gl: WebGLRenderingContext,\n uniformLocations: TWebGLUniformLocationMap,\n ) {\n gl.uniform1f(uniformLocations.uContrast, this.contrast);\n }\n}\n\nclassRegistry.setClass(Contrast);\n","export const fragmentSource = `\n precision highp float;\n uniform sampler2D uTexture;\n uniform float uContrast;\n varying vec2 vTexCoord;\n void main() {\n vec4 color = texture2D(uTexture, vTexCoord);\n float contrastF = 1.015 * (uContrast + 1.0) / (1.0 * (1.015 - uContrast));\n color.rgb = contrastF * (color.rgb - 0.5) + 0.5;\n gl_FragColor = color;\n }`;\n","export const fragmentSource = {\n Convolute_3_1: `\n precision highp float;\n uniform sampler2D uTexture;\n uniform float uMatrix[9];\n uniform float uStepW;\n uniform float uStepH;\n varying vec2 vTexCoord;\n void main() {\n vec4 color = vec4(0, 0, 0, 0);\n for (float h = 0.0; h < 3.0; h+=1.0) {\n for (float w = 0.0; w < 3.0; w+=1.0) {\n vec2 matrixPos = vec2(uStepW * (w - 1), uStepH * (h - 1));\n color += texture2D(uTexture, vTexCoord + matrixPos) * uMatrix[int(h * 3.0 + w)];\n }\n }\n gl_FragColor = color;\n }\n `,\n Convolute_3_0: `\n precision highp float;\n uniform sampler2D uTexture;\n uniform float uMatrix[9];\n uniform float uStepW;\n uniform float uStepH;\n varying vec2 vTexCoord;\n void main() {\n vec4 color = vec4(0, 0, 0, 1);\n for (float h = 0.0; h < 3.0; h+=1.0) {\n for (float w = 0.0; w < 3.0; w+=1.0) {\n vec2 matrixPos = vec2(uStepW * (w - 1.0), uStepH * (h - 1.0));\n color.rgb += texture2D(uTexture, vTexCoord + matrixPos).rgb * uMatrix[int(h * 3.0 + w)];\n }\n }\n float alpha = texture2D(uTexture, vTexCoord).a;\n gl_FragColor = color;\n gl_FragColor.a = alpha;\n }\n `,\n Convolute_5_1: `\n precision highp float;\n uniform sampler2D uTexture;\n uniform float uMatrix[25];\n uniform float uStepW;\n uniform float uStepH;\n varying vec2 vTexCoord;\n void main() {\n vec4 color = vec4(0, 0, 0, 0);\n for (float h = 0.0; h < 5.0; h+=1.0) {\n for (float w = 0.0; w < 5.0; w+=1.0) {\n vec2 matrixPos = vec2(uStepW * (w - 2.0), uStepH * (h - 2.0));\n color += texture2D(uTexture, vTexCoord + matrixPos) * uMatrix[int(h * 5.0 + w)];\n }\n }\n gl_FragColor = color;\n }\n `,\n Convolute_5_0: `\n precision highp float;\n uniform sampler2D uTexture;\n uniform float uMatrix[25];\n uniform float uStepW;\n uniform float uStepH;\n varying vec2 vTexCoord;\n void main() {\n vec4 color = vec4(0, 0, 0, 1);\n for (float h = 0.0; h < 5.0; h+=1.0) {\n for (float w = 0.0; w < 5.0; w+=1.0) {\n vec2 matrixPos = vec2(uStepW * (w - 2.0), uStepH * (h - 2.0));\n color.rgb += texture2D(uTexture, vTexCoord + matrixPos).rgb * uMatrix[int(h * 5.0 + w)];\n }\n }\n float alpha = texture2D(uTexture, vTexCoord).a;\n gl_FragColor = color;\n gl_FragColor.a = alpha;\n }\n `,\n Convolute_7_1: `\n precision highp float;\n uniform sampler2D uTexture;\n uniform float uMatrix[49];\n uniform float uStepW;\n uniform float uStepH;\n varying vec2 vTexCoord;\n void main() {\n vec4 color = vec4(0, 0, 0, 0);\n for (float h = 0.0; h < 7.0; h+=1.0) {\n for (float w = 0.0; w < 7.0; w+=1.0) {\n vec2 matrixPos = vec2(uStepW * (w - 3.0), uStepH * (h - 3.0));\n color += texture2D(uTexture, vTexCoord + matrixPos) * uMatrix[int(h * 7.0 + w)];\n }\n }\n gl_FragColor = color;\n }\n `,\n Convolute_7_0: `\n precision highp float;\n uniform sampler2D uTexture;\n uniform float uMatrix[49];\n uniform float uStepW;\n uniform float uStepH;\n varying vec2 vTexCoord;\n void main() {\n vec4 color = vec4(0, 0, 0, 1);\n for (float h = 0.0; h < 7.0; h+=1.0) {\n for (float w = 0.0; w < 7.0; w+=1.0) {\n vec2 matrixPos = vec2(uStepW * (w - 3.0), uStepH * (h - 3.0));\n color.rgb += texture2D(uTexture, vTexCoord + matrixPos).rgb * uMatrix[int(h * 7.0 + w)];\n }\n }\n float alpha = texture2D(uTexture, vTexCoord).a;\n gl_FragColor = color;\n gl_FragColor.a = alpha;\n }\n `,\n Convolute_9_1: `\n precision highp float;\n uniform sampler2D uTexture;\n uniform float uMatrix[81];\n uniform float uStepW;\n uniform float uStepH;\n varying vec2 vTexCoord;\n void main() {\n vec4 color = vec4(0, 0, 0, 0);\n for (float h = 0.0; h < 9.0; h+=1.0) {\n for (float w = 0.0; w < 9.0; w+=1.0) {\n vec2 matrixPos = vec2(uStepW * (w - 4.0), uStepH * (h - 4.0));\n color += texture2D(uTexture, vTexCoord + matrixPos) * uMatrix[int(h * 9.0 + w)];\n }\n }\n gl_FragColor = color;\n }\n `,\n Convolute_9_0: `\n precision highp float;\n uniform sampler2D uTexture;\n uniform float uMatrix[81];\n uniform float uStepW;\n uniform float uStepH;\n varying vec2 vTexCoord;\n void main() {\n vec4 color = vec4(0, 0, 0, 1);\n for (float h = 0.0; h < 9.0; h+=1.0) {\n for (float w = 0.0; w < 9.0; w+=1.0) {\n vec2 matrixPos = vec2(uStepW * (w - 4.0), uStepH * (h - 4.0));\n color.rgb += texture2D(uTexture, vTexCoord + matrixPos).rgb * uMatrix[int(h * 9.0 + w)];\n }\n }\n float alpha = texture2D(uTexture, vTexCoord).a;\n gl_FragColor = color;\n gl_FragColor.a = alpha;\n }\n `,\n};\n","import { BaseFilter } from './BaseFilter';\nimport type { T2DPipelineState, TWebGLUniformLocationMap } from './typedefs';\nimport { classRegistry } from '../ClassRegistry';\nimport { fragmentSource } from './shaders/convolute';\n\nexport type ConvoluteOwnProps = {\n opaque: boolean;\n matrix: number[];\n};\n\nexport const convoluteDefaultValues: ConvoluteOwnProps = {\n opaque: false,\n matrix: [0, 0, 0, 0, 1, 0, 0, 0, 0],\n};\n\n/**\n * Adapted from html5rocks article\n * @example Sharpen filter\n * const filter = new Convolute({\n * matrix: [ 0, -1, 0,\n * -1, 5, -1,\n * 0, -1, 0 ]\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n * canvas.renderAll();\n * @example Blur filter\n * const filter = new Convolute({\n * matrix: [ 1/9, 1/9, 1/9,\n * 1/9, 1/9, 1/9,\n * 1/9, 1/9, 1/9 ]\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n * canvas.renderAll();\n * @example Emboss filter\n * const filter = new Convolute({\n * matrix: [ 1, 1, 1,\n * 1, 0.7, -1,\n * -1, -1, -1 ]\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n * canvas.renderAll();\n * @example Emboss filter with opaqueness\n * const filter = new Convolute({\n * opaque: true,\n * matrix: [ 1, 1, 1,\n * 1, 0.7, -1,\n * -1, -1, -1 ]\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n * canvas.renderAll();\n */\nexport class Convolute extends BaseFilter<'Convolute', ConvoluteOwnProps> {\n /*\n * Opaque value (true/false)\n */\n declare opaque: ConvoluteOwnProps['opaque'];\n\n /*\n * matrix for the filter, max 9x9\n */\n declare matrix: ConvoluteOwnProps['matrix'];\n\n static type = 'Convolute';\n\n static defaults = convoluteDefaultValues;\n\n static uniformLocations = ['uMatrix', 'uOpaque', 'uHalfSize', 'uSize'];\n\n getCacheKey() {\n return `${this.type}_${Math.sqrt(this.matrix.length)}_${\n this.opaque ? 1 : 0\n }` as keyof typeof fragmentSource;\n }\n\n getFragmentSource() {\n return fragmentSource[this.getCacheKey()];\n }\n\n /**\n * Apply the Brightness operation to a Uint8ClampedArray representing the pixels of an image.\n *\n * @param {Object} options\n * @param {ImageData} options.imageData The Uint8ClampedArray to be filtered.\n */\n applyTo2d(options: T2DPipelineState) {\n const imageData = options.imageData,\n data = imageData.data,\n weights = this.matrix,\n side = Math.round(Math.sqrt(weights.length)),\n halfSide = Math.floor(side / 2),\n sw = imageData.width,\n sh = imageData.height,\n output = options.ctx.createImageData(sw, sh),\n dst = output.data,\n // go through the destination image pixels\n alphaFac = this.opaque ? 1 : 0;\n let r, g, b, a, dstOff, scx, scy, srcOff, wt, x, y, cx, cy;\n\n for (y = 0; y < sh; y++) {\n for (x = 0; x < sw; x++) {\n dstOff = (y * sw + x) * 4;\n // calculate the weighed sum of the source image pixels that\n // fall under the convolution matrix\n r = 0;\n g = 0;\n b = 0;\n a = 0;\n\n for (cy = 0; cy < side; cy++) {\n for (cx = 0; cx < side; cx++) {\n scy = y + cy - halfSide;\n scx = x + cx - halfSide;\n\n // eslint-disable-next-line max-depth\n if (scy < 0 || scy >= sh || scx < 0 || scx >= sw) {\n continue;\n }\n\n srcOff = (scy * sw + scx) * 4;\n wt = weights[cy * side + cx];\n\n r += data[srcOff] * wt;\n g += data[srcOff + 1] * wt;\n b += data[srcOff + 2] * wt;\n // eslint-disable-next-line max-depth\n if (!alphaFac) {\n a += data[srcOff + 3] * wt;\n }\n }\n }\n dst[dstOff] = r;\n dst[dstOff + 1] = g;\n dst[dstOff + 2] = b;\n if (!alphaFac) {\n dst[dstOff + 3] = a;\n } else {\n dst[dstOff + 3] = data[dstOff + 3];\n }\n }\n }\n options.imageData = output;\n }\n\n /**\n * Send data from this filter to its shader program's uniforms.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n */\n sendUniformData(\n gl: WebGLRenderingContext,\n uniformLocations: TWebGLUniformLocationMap,\n ) {\n gl.uniform1fv(uniformLocations.uMatrix, this.matrix);\n }\n\n /**\n * Returns object representation of an instance\n * @return {Object} Object representation of an instance\n */\n toObject() {\n return {\n ...super.toObject(),\n opaque: this.opaque,\n matrix: [...this.matrix],\n };\n }\n}\n\nclassRegistry.setClass(Convolute);\n","export const fragmentSource = `\n precision highp float;\n uniform sampler2D uTexture;\n uniform vec3 uGamma;\n varying vec2 vTexCoord;\n void main() {\n vec4 color = texture2D(uTexture, vTexCoord);\n vec3 correction = (1.0 / uGamma);\n color.r = pow(color.r, correction.r);\n color.g = pow(color.g, correction.g);\n color.b = pow(color.b, correction.b);\n gl_FragColor = color;\n gl_FragColor.rgb *= color.a;\n }\n`;\n","import { BaseFilter } from './BaseFilter';\nimport { classRegistry } from '../ClassRegistry';\nimport { fragmentSource } from './shaders/gamma';\nimport type { T2DPipelineState, TWebGLUniformLocationMap } from './typedefs';\n\nconst GAMMA = 'Gamma' as const;\n\nexport type GammaInput = [number, number, number];\n\nexport type GammaOwnProps = {\n gamma: GammaInput;\n};\n\nexport const gammaDefaultValues: GammaOwnProps = {\n gamma: [1, 1, 1],\n};\n\n/**\n * Gamma filter class\n * @example\n * const filter = new Gamma({\n * gamma: [1, 0.5, 2.1]\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n */\nexport class Gamma extends BaseFilter {\n /**\n * Gamma array value, from 0.01 to 2.2.\n * @param {Array} gamma\n */\n declare gamma: GammaOwnProps['gamma'];\n declare rgbValues?: {\n r: Uint8Array;\n g: Uint8Array;\n b: Uint8Array;\n };\n\n static type = GAMMA;\n\n static defaults = gammaDefaultValues;\n\n static uniformLocations = ['uGamma'];\n\n getFragmentSource() {\n return fragmentSource;\n }\n\n constructor(options: { gamma?: GammaInput } = {}) {\n super(options);\n this.gamma =\n options.gamma ||\n ((\n this.constructor as typeof Gamma\n ).defaults.gamma.concat() as GammaInput);\n }\n\n /**\n * Apply the Gamma operation to a Uint8Array representing the pixels of an image.\n *\n * @param {Object} options\n * @param {ImageData} options.imageData The Uint8Array to be filtered.\n */\n applyTo2d({ imageData: { data } }: T2DPipelineState) {\n const gamma = this.gamma,\n rInv = 1 / gamma[0],\n gInv = 1 / gamma[1],\n bInv = 1 / gamma[2];\n\n if (!this.rgbValues) {\n this.rgbValues = {\n r: new Uint8Array(256),\n g: new Uint8Array(256),\n b: new Uint8Array(256),\n };\n }\n\n // This is an optimization - pre-compute a look-up table for each color channel\n // instead of performing these pow calls for each pixel in the image.\n const rgb = this.rgbValues;\n for (let i = 0; i < 256; i++) {\n rgb.r[i] = Math.pow(i / 255, rInv) * 255;\n rgb.g[i] = Math.pow(i / 255, gInv) * 255;\n rgb.b[i] = Math.pow(i / 255, bInv) * 255;\n }\n for (let i = 0; i < data.length; i += 4) {\n data[i] = rgb.r[data[i]];\n data[i + 1] = rgb.g[data[i + 1]];\n data[i + 2] = rgb.b[data[i + 2]];\n }\n }\n\n /**\n * Send data from this filter to its shader program's uniforms.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n */\n sendUniformData(\n gl: WebGLRenderingContext,\n uniformLocations: TWebGLUniformLocationMap,\n ) {\n gl.uniform3fv(uniformLocations.uGamma, this.gamma);\n }\n\n isNeutralState() {\n const { gamma } = this;\n return gamma[0] === 1 && gamma[1] === 1 && gamma[2] === 1;\n }\n\n toObject(): { type: typeof GAMMA; gamma: GammaInput } {\n return {\n type: GAMMA,\n gamma: this.gamma.concat() as GammaInput,\n };\n }\n}\n\nclassRegistry.setClass(Gamma);\n","import type { TGrayscaleMode } from '../Grayscale';\n\nexport const fragmentSource: Record = {\n average: `\n precision highp float;\n uniform sampler2D uTexture;\n varying vec2 vTexCoord;\n void main() {\n vec4 color = texture2D(uTexture, vTexCoord);\n float average = (color.r + color.b + color.g) / 3.0;\n gl_FragColor = vec4(average, average, average, color.a);\n }\n `,\n lightness: `\n precision highp float;\n uniform sampler2D uTexture;\n uniform int uMode;\n varying vec2 vTexCoord;\n void main() {\n vec4 col = texture2D(uTexture, vTexCoord);\n float average = (max(max(col.r, col.g),col.b) + min(min(col.r, col.g),col.b)) / 2.0;\n gl_FragColor = vec4(average, average, average, col.a);\n }\n `,\n luminosity: `\n precision highp float;\n uniform sampler2D uTexture;\n uniform int uMode;\n varying vec2 vTexCoord;\n void main() {\n vec4 col = texture2D(uTexture, vTexCoord);\n float average = 0.21 * col.r + 0.72 * col.g + 0.07 * col.b;\n gl_FragColor = vec4(average, average, average, col.a);\n }\n `,\n};\n","import { BaseFilter } from './BaseFilter';\nimport type { T2DPipelineState, TWebGLUniformLocationMap } from './typedefs';\nimport { classRegistry } from '../ClassRegistry';\nimport { fragmentSource } from './shaders/grayscale';\n\nexport type TGrayscaleMode = 'average' | 'lightness' | 'luminosity';\n\ntype GrayscaleOwnProps = {\n mode: TGrayscaleMode;\n};\n\nexport const grayscaleDefaultValues: GrayscaleOwnProps = {\n mode: 'average',\n};\n\n/**\n * Grayscale image filter class\n * @example\n * const filter = new Grayscale();\n * object.filters.push(filter);\n * object.applyFilters();\n */\nexport class Grayscale extends BaseFilter<'Grayscale', GrayscaleOwnProps> {\n declare mode: TGrayscaleMode;\n\n static type = 'Grayscale';\n\n static defaults = grayscaleDefaultValues;\n\n static uniformLocations = ['uMode'];\n\n /**\n * Apply the Grayscale operation to a Uint8Array representing the pixels of an image.\n *\n * @param {Object} options\n * @param {ImageData} options.imageData The Uint8Array to be filtered.\n */\n applyTo2d({ imageData: { data } }: T2DPipelineState) {\n for (let i = 0, value: number; i < data.length; i += 4) {\n const r = data[i];\n const g = data[i + 1];\n const b = data[i + 2];\n switch (this.mode) {\n case 'average':\n value = (r + g + b) / 3;\n break;\n case 'lightness':\n value = (Math.min(r, g, b) + Math.max(r, g, b)) / 2;\n break;\n case 'luminosity':\n value = 0.21 * r + 0.72 * g + 0.07 * b;\n break;\n }\n\n data[i + 2] = data[i + 1] = data[i] = value;\n }\n }\n\n getCacheKey() {\n return `${this.type}_${this.mode}`;\n }\n\n getFragmentSource() {\n return fragmentSource[this.mode];\n }\n\n /**\n * Send data from this filter to its shader program's uniforms.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n */\n sendUniformData(\n gl: WebGLRenderingContext,\n uniformLocations: TWebGLUniformLocationMap,\n ) {\n const mode = 1;\n gl.uniform1i(uniformLocations.uMode, mode);\n }\n\n /**\n * Grayscale filter isNeutralState implementation\n * The filter is never neutral\n * on the image\n **/\n isNeutralState() {\n return false;\n }\n}\n\nclassRegistry.setClass(Grayscale);\n","import { cos } from '../util/misc/cos';\nimport { sin } from '../util/misc/sin';\nimport {\n ColorMatrix,\n type ColorMatrixOwnProps,\n colorMatrixDefaultValues,\n} from './ColorMatrix';\nimport type { TWebGLPipelineState, T2DPipelineState } from './typedefs';\nimport { classRegistry } from '../ClassRegistry';\n\nexport type HueRotationOwnProps = ColorMatrixOwnProps & {\n rotation: number;\n};\n\nexport type HueRotationSerializedProps = {\n rotation: number;\n};\n\nexport const hueRotationDefaultValues: HueRotationOwnProps = {\n ...colorMatrixDefaultValues,\n rotation: 0,\n};\n\n/**\n * HueRotation filter class\n * @example\n * const filter = new HueRotation({\n * rotation: -0.5\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n */\nexport class HueRotation extends ColorMatrix<\n 'HueRotation',\n HueRotationOwnProps,\n HueRotationSerializedProps\n> {\n /**\n * HueRotation value, from -1 to 1.\n */\n declare rotation: HueRotationOwnProps['rotation'];\n\n static type = 'HueRotation';\n\n static defaults = hueRotationDefaultValues;\n\n calculateMatrix() {\n const rad = this.rotation * Math.PI,\n cosine = cos(rad),\n sine = sin(rad),\n aThird = 1 / 3,\n aThirdSqtSin = Math.sqrt(aThird) * sine,\n OneMinusCos = 1 - cosine;\n this.matrix = [\n cosine + OneMinusCos / 3,\n aThird * OneMinusCos - aThirdSqtSin,\n aThird * OneMinusCos + aThirdSqtSin,\n 0,\n 0,\n aThird * OneMinusCos + aThirdSqtSin,\n cosine + aThird * OneMinusCos,\n aThird * OneMinusCos - aThirdSqtSin,\n 0,\n 0,\n aThird * OneMinusCos - aThirdSqtSin,\n aThird * OneMinusCos + aThirdSqtSin,\n cosine + aThird * OneMinusCos,\n 0,\n 0,\n 0,\n 0,\n 0,\n 1,\n 0,\n ];\n }\n\n isNeutralState() {\n return this.rotation === 0;\n }\n\n applyTo(options: TWebGLPipelineState | T2DPipelineState) {\n this.calculateMatrix();\n super.applyTo(options);\n }\n\n toObject() {\n return {\n type: this.type,\n rotation: this.rotation,\n };\n }\n}\n\nclassRegistry.setClass(HueRotation);\n","import { BaseFilter } from './BaseFilter';\nimport type { T2DPipelineState, TWebGLUniformLocationMap } from './typedefs';\nimport { classRegistry } from '../ClassRegistry';\nimport { fragmentSource } from './shaders/invert';\n\nexport type InvertOwnProps = {\n alpha: boolean;\n invert: boolean;\n};\n\nexport const invertDefaultValues: InvertOwnProps = {\n alpha: false,\n invert: true,\n};\n\n/**\n * @example\n * const filter = new Invert();\n * object.filters.push(filter);\n * object.applyFilters(canvas.renderAll.bind(canvas));\n */\nexport class Invert extends BaseFilter<'Invert', InvertOwnProps> {\n /**\n * Invert also alpha.\n * @param {Boolean} alpha\n **/\n declare alpha: InvertOwnProps['alpha'];\n\n /**\n * Filter invert. if false, does nothing\n * @param {Boolean} invert\n */\n declare invert: InvertOwnProps['invert'];\n\n static type = 'Invert';\n\n static defaults = invertDefaultValues;\n\n static uniformLocations = ['uInvert', 'uAlpha'];\n\n /**\n * Apply the Invert operation to a Uint8Array representing the pixels of an image.\n *\n * @param {Object} options\n * @param {ImageData} options.imageData The Uint8Array to be filtered.\n */\n applyTo2d({ imageData: { data } }: T2DPipelineState) {\n for (let i = 0; i < data.length; i += 4) {\n data[i] = 255 - data[i];\n data[i + 1] = 255 - data[i + 1];\n data[i + 2] = 255 - data[i + 2];\n\n if (this.alpha) {\n data[i + 3] = 255 - data[i + 3];\n }\n }\n }\n\n protected getFragmentSource(): string {\n return fragmentSource;\n }\n\n /**\n * Invert filter isNeutralState implementation\n * Used only in image applyFilters to discard filters that will not have an effect\n * on the image\n * @param {Object} options\n **/\n isNeutralState() {\n return !this.invert;\n }\n\n /**\n * Send data from this filter to its shader program's uniforms.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n */\n sendUniformData(\n gl: WebGLRenderingContext,\n uniformLocations: TWebGLUniformLocationMap,\n ) {\n gl.uniform1i(uniformLocations.uInvert, Number(this.invert));\n gl.uniform1i(uniformLocations.uAlpha, Number(this.alpha));\n }\n}\n\nclassRegistry.setClass(Invert);\n","export const fragmentSource = `\n precision highp float;\n uniform sampler2D uTexture;\n uniform int uInvert;\n uniform int uAlpha;\n varying vec2 vTexCoord;\n void main() {\n vec4 color = texture2D(uTexture, vTexCoord);\n if (uInvert == 1) {\n if (uAlpha == 1) {\n gl_FragColor = vec4(1.0 - color.r,1.0 -color.g,1.0 -color.b,1.0 -color.a);\n } else {\n gl_FragColor = vec4(1.0 - color.r,1.0 -color.g,1.0 -color.b,color.a);\n }\n } else {\n gl_FragColor = color;\n }\n }\n`;\n","import { BaseFilter } from './BaseFilter';\nimport type { T2DPipelineState, TWebGLUniformLocationMap } from './typedefs';\nimport { classRegistry } from '../ClassRegistry';\nimport { fragmentSource } from './shaders/noise';\n\nexport type NoiseOwnProps = {\n noise: number;\n};\n\nexport const noiseDefaultValues: NoiseOwnProps = {\n noise: 0,\n};\n\n/**\n * Noise filter class\n * @example\n * const filter = new Noise({\n * noise: 700\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n * canvas.renderAll();\n */\nexport class Noise extends BaseFilter<'Noise', NoiseOwnProps> {\n /**\n * Noise value, from\n * @param {Number} noise\n */\n declare noise: NoiseOwnProps['noise'];\n\n static type = 'Noise';\n\n static defaults = noiseDefaultValues;\n\n static uniformLocations = ['uNoise', 'uSeed'];\n\n getFragmentSource() {\n return fragmentSource;\n }\n\n /**\n * Apply the Brightness operation to a Uint8ClampedArray representing the pixels of an image.\n *\n * @param {Object} options\n * @param {ImageData} options.imageData The Uint8ClampedArray to be filtered.\n */\n applyTo2d({ imageData: { data } }: T2DPipelineState) {\n const noise = this.noise;\n for (let i = 0; i < data.length; i += 4) {\n const rand = (0.5 - Math.random()) * noise;\n data[i] += rand;\n data[i + 1] += rand;\n data[i + 2] += rand;\n }\n }\n\n /**\n * Send data from this filter to its shader program's uniforms.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n */\n sendUniformData(\n gl: WebGLRenderingContext,\n uniformLocations: TWebGLUniformLocationMap,\n ) {\n gl.uniform1f(uniformLocations.uNoise, this.noise / 255);\n gl.uniform1f(uniformLocations.uSeed, Math.random());\n }\n\n isNeutralState() {\n return this.noise === 0;\n }\n}\n\nclassRegistry.setClass(Noise);\n","export const fragmentSource = `\n precision highp float;\n uniform sampler2D uTexture;\n uniform float uStepH;\n uniform float uNoise;\n uniform float uSeed;\n varying vec2 vTexCoord;\n float rand(vec2 co, float seed, float vScale) {\n return fract(sin(dot(co.xy * vScale ,vec2(12.9898 , 78.233))) * 43758.5453 * (seed + 0.01) / 2.0);\n }\n void main() {\n vec4 color = texture2D(uTexture, vTexCoord);\n color.rgb += (0.5 - rand(vTexCoord, uSeed, 0.1 / uStepH)) * uNoise;\n gl_FragColor = color;\n }\n`;\n","import { BaseFilter } from './BaseFilter';\nimport type { T2DPipelineState, TWebGLUniformLocationMap } from './typedefs';\nimport { classRegistry } from '../ClassRegistry';\nimport { fragmentSource } from './shaders/pixelate';\n\nexport type PixelateOwnProps = {\n blocksize: number;\n};\n\nexport const pixelateDefaultValues: PixelateOwnProps = {\n blocksize: 4,\n};\n\n/**\n * Pixelate filter class\n * @example\n * const filter = new Pixelate({\n * blocksize: 8\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n */\nexport class Pixelate extends BaseFilter<'Pixelate', PixelateOwnProps> {\n declare blocksize: PixelateOwnProps['blocksize'];\n\n static type = 'Pixelate';\n\n static defaults = pixelateDefaultValues;\n\n static uniformLocations = ['uBlocksize'];\n\n /**\n * Apply the Pixelate operation to a Uint8ClampedArray representing the pixels of an image.\n *\n * @param {Object} options\n * @param {ImageData} options.imageData The Uint8ClampedArray to be filtered.\n */\n applyTo2d({ imageData: { data, width, height } }: T2DPipelineState) {\n for (let i = 0; i < height; i += this.blocksize) {\n for (let j = 0; j < width; j += this.blocksize) {\n const index = i * 4 * width + j * 4;\n const r = data[index];\n const g = data[index + 1];\n const b = data[index + 2];\n const a = data[index + 3];\n\n for (let _i = i; _i < Math.min(i + this.blocksize, height); _i++) {\n for (let _j = j; _j < Math.min(j + this.blocksize, width); _j++) {\n const index = _i * 4 * width + _j * 4;\n data[index] = r;\n data[index + 1] = g;\n data[index + 2] = b;\n data[index + 3] = a;\n }\n }\n }\n }\n }\n\n /**\n * Indicate when the filter is not gonna apply changes to the image\n **/\n isNeutralState() {\n return this.blocksize === 1;\n }\n\n protected getFragmentSource(): string {\n return fragmentSource;\n }\n\n /**\n * Send data from this filter to its shader program's uniforms.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n */\n sendUniformData(\n gl: WebGLRenderingContext,\n uniformLocations: TWebGLUniformLocationMap,\n ) {\n gl.uniform1f(uniformLocations.uBlocksize, this.blocksize);\n }\n}\n\nclassRegistry.setClass(Pixelate);\n","export const fragmentSource = `\n precision highp float;\n uniform sampler2D uTexture;\n uniform float uBlocksize;\n uniform float uStepW;\n uniform float uStepH;\n varying vec2 vTexCoord;\n void main() {\n float blockW = uBlocksize * uStepW;\n float blockH = uBlocksize * uStepH;\n int posX = int(vTexCoord.x / blockW);\n int posY = int(vTexCoord.y / blockH);\n float fposX = float(posX);\n float fposY = float(posY);\n vec2 squareCoords = vec2(fposX * blockW, fposY * blockH);\n vec4 color = texture2D(uTexture, squareCoords);\n gl_FragColor = color;\n }\n`;\n","import { classRegistry } from '../ClassRegistry';\nimport { Color } from '../color/Color';\nimport { BaseFilter } from './BaseFilter';\nimport { fragmentShader } from './shaders/removeColor';\nimport type { T2DPipelineState, TWebGLUniformLocationMap } from './typedefs';\n\nexport type RemoveColorOwnProps = {\n color: string;\n distance: number;\n useAlpha: boolean;\n};\n\nexport const removeColorDefaultValues: RemoveColorOwnProps = {\n color: '#FFFFFF',\n distance: 0.02,\n useAlpha: false,\n};\n\n/**\n * Remove white filter class\n * @example\n * const filter = new RemoveColor({\n * threshold: 0.2,\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n * canvas.renderAll();\n */\nexport class RemoveColor extends BaseFilter<\n 'RemoveColor',\n RemoveColorOwnProps\n> {\n /**\n * Color to remove, in any format understood by {@link Color}.\n */\n declare color: RemoveColorOwnProps['color'];\n\n /**\n * distance to actual color, as value up or down from each r,g,b\n * between 0 and 1\n **/\n declare distance: RemoveColorOwnProps['distance'];\n\n /**\n * For color to remove inside distance, use alpha channel for a smoother deletion\n * NOT IMPLEMENTED YET\n **/\n declare useAlpha: RemoveColorOwnProps['useAlpha'];\n\n static type = 'RemoveColor';\n\n static defaults = removeColorDefaultValues;\n\n static uniformLocations = ['uLow', 'uHigh'];\n\n getFragmentSource() {\n return fragmentShader;\n }\n\n /**\n * Applies filter to canvas element\n * @param {Object} canvasEl Canvas element to apply filter to\n */\n applyTo2d({ imageData: { data } }: T2DPipelineState) {\n const distance = this.distance * 255,\n source = new Color(this.color).getSource(),\n lowC = [source[0] - distance, source[1] - distance, source[2] - distance],\n highC = [\n source[0] + distance,\n source[1] + distance,\n source[2] + distance,\n ];\n\n for (let i = 0; i < data.length; i += 4) {\n const r = data[i];\n const g = data[i + 1];\n const b = data[i + 2];\n\n if (\n r > lowC[0] &&\n g > lowC[1] &&\n b > lowC[2] &&\n r < highC[0] &&\n g < highC[1] &&\n b < highC[2]\n ) {\n data[i + 3] = 0;\n }\n }\n }\n\n /**\n * Send data from this filter to its shader program's uniforms.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n */\n sendUniformData(\n gl: WebGLRenderingContext,\n uniformLocations: TWebGLUniformLocationMap,\n ) {\n const source = new Color(this.color).getSource(),\n distance = this.distance,\n lowC = [\n 0 + source[0] / 255 - distance,\n 0 + source[1] / 255 - distance,\n 0 + source[2] / 255 - distance,\n 1,\n ],\n highC = [\n source[0] / 255 + distance,\n source[1] / 255 + distance,\n source[2] / 255 + distance,\n 1,\n ];\n gl.uniform4fv(uniformLocations.uLow, lowC);\n gl.uniform4fv(uniformLocations.uHigh, highC);\n }\n}\n\nclassRegistry.setClass(RemoveColor);\n","export const fragmentShader = `\nprecision highp float;\nuniform sampler2D uTexture;\nuniform vec4 uLow;\nuniform vec4 uHigh;\nvarying vec2 vTexCoord;\nvoid main() {\n gl_FragColor = texture2D(uTexture, vTexCoord);\n if(all(greaterThan(gl_FragColor.rgb,uLow.rgb)) && all(greaterThan(uHigh.rgb,gl_FragColor.rgb))) {\n gl_FragColor.a = 0.0;\n }\n}\n`;\n","import { BaseFilter } from './BaseFilter';\nimport type {\n T2DPipelineState,\n TWebGLPipelineState,\n TWebGLUniformLocationMap,\n} from './typedefs';\nimport { isWebGLPipelineState } from './utils';\nimport { classRegistry } from '../ClassRegistry';\nimport { createCanvasElement } from '../util/misc/dom';\nimport type { XY } from '../Point';\n\nexport type TResizeType = 'bilinear' | 'hermite' | 'sliceHack' | 'lanczos';\n\nexport type ResizeOwnProps = {\n resizeType: TResizeType;\n scaleX: number;\n scaleY: number;\n lanczosLobes: number;\n};\n\nexport type ResizeSerializedProps = ResizeOwnProps;\n\nexport const resizeDefaultValues: ResizeOwnProps = {\n resizeType: 'hermite',\n scaleX: 1,\n scaleY: 1,\n lanczosLobes: 3,\n};\n\ntype ResizeDuring2DResize = Resize & {\n rcpScaleX: number;\n rcpScaleY: number;\n};\n\ntype ResizeDuringWEBGLResize = Resize & {\n rcpScaleX: number;\n rcpScaleY: number;\n horizontal: boolean;\n width: number;\n height: number;\n taps: number[];\n tempScale: number;\n dH: number;\n dW: number;\n};\n\n/**\n * Resize image filter class\n * @example\n * const filter = new Resize();\n * object.filters.push(filter);\n * object.applyFilters(canvas.renderAll.bind(canvas));\n */\nexport class Resize extends BaseFilter<'Resize', ResizeOwnProps> {\n /**\n * Resize type\n * for webgl resizeType is just lanczos, for canvas2d can be:\n * bilinear, hermite, sliceHack, lanczos.\n */\n declare resizeType: ResizeOwnProps['resizeType'];\n\n /**\n * Scale factor for resizing, x axis\n * @param {Number} scaleX\n */\n declare scaleX: ResizeOwnProps['scaleX'];\n\n /**\n * Scale factor for resizing, y axis\n * @param {Number} scaleY\n */\n declare scaleY: ResizeOwnProps['scaleY'];\n\n /**\n * LanczosLobes parameter for lanczos filter, valid for resizeType lanczos\n * @param {Number} lanczosLobes\n */\n declare lanczosLobes: ResizeOwnProps['lanczosLobes'];\n\n static type = 'Resize';\n\n static defaults = resizeDefaultValues;\n\n static uniformLocations = ['uDelta', 'uTaps'];\n\n /**\n * Send data from this filter to its shader program's uniforms.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n */\n sendUniformData(\n this: ResizeDuringWEBGLResize,\n gl: WebGLRenderingContext,\n uniformLocations: TWebGLUniformLocationMap,\n ) {\n gl.uniform2fv(\n uniformLocations.uDelta,\n this.horizontal ? [1 / this.width, 0] : [0, 1 / this.height],\n );\n gl.uniform1fv(uniformLocations.uTaps, this.taps);\n }\n\n getFilterWindow(this: ResizeDuringWEBGLResize) {\n const scale = this.tempScale;\n return Math.ceil(this.lanczosLobes / scale);\n }\n\n getCacheKey(this: ResizeDuringWEBGLResize): string {\n const filterWindow = this.getFilterWindow();\n return `${this.type}_${filterWindow}`;\n }\n\n getFragmentSource(this: ResizeDuringWEBGLResize): string {\n const filterWindow = this.getFilterWindow();\n return this.generateShader(filterWindow);\n }\n\n getTaps(this: ResizeDuringWEBGLResize) {\n const lobeFunction = this.lanczosCreate(this.lanczosLobes),\n scale = this.tempScale,\n filterWindow = this.getFilterWindow(),\n taps = new Array(filterWindow);\n for (let i = 1; i <= filterWindow; i++) {\n taps[i - 1] = lobeFunction(i * scale);\n }\n return taps;\n }\n\n /**\n * Generate vertex and shader sources from the necessary steps numbers\n * @param {Number} filterWindow\n */\n generateShader(filterWindow: number) {\n const offsets = new Array(filterWindow);\n for (let i = 1; i <= filterWindow; i++) {\n offsets[i - 1] = `${i}.0 * uDelta`;\n }\n return `\n precision highp float;\n uniform sampler2D uTexture;\n uniform vec2 uDelta;\n varying vec2 vTexCoord;\n uniform float uTaps[${filterWindow}];\n void main() {\n vec4 color = texture2D(uTexture, vTexCoord);\n float sum = 1.0;\n ${offsets\n .map(\n (offset, i) => `\n color += texture2D(uTexture, vTexCoord + ${offset}) * uTaps[${i}] + texture2D(uTexture, vTexCoord - ${offset}) * uTaps[${i}];\n sum += 2.0 * uTaps[${i}];\n `,\n )\n .join('\\n')}\n gl_FragColor = color / sum;\n }\n `;\n }\n\n applyToForWebgl(this: ResizeDuringWEBGLResize, options: TWebGLPipelineState) {\n options.passes++;\n this.width = options.sourceWidth;\n this.horizontal = true;\n this.dW = Math.round(this.width * this.scaleX);\n this.dH = options.sourceHeight;\n this.tempScale = this.dW / this.width;\n this.taps = this.getTaps();\n options.destinationWidth = this.dW;\n super.applyTo(options);\n options.sourceWidth = options.destinationWidth;\n\n this.height = options.sourceHeight;\n this.horizontal = false;\n this.dH = Math.round(this.height * this.scaleY);\n this.tempScale = this.dH / this.height;\n this.taps = this.getTaps();\n options.destinationHeight = this.dH;\n super.applyTo(options);\n options.sourceHeight = options.destinationHeight;\n }\n\n /**\n * Apply the resize filter to the image\n * Determines whether to use WebGL or Canvas2D based on the options.webgl flag.\n *\n * @param {Object} options\n * @param {Number} options.passes The number of filters remaining to be executed\n * @param {Boolean} options.webgl Whether to use webgl to render the filter.\n * @param {WebGLTexture} options.sourceTexture The texture setup as the source to be filtered.\n * @param {WebGLTexture} options.targetTexture The texture where filtered output should be drawn.\n * @param {WebGLRenderingContext} options.context The GL context used for rendering.\n * @param {Object} options.programCache A map of compiled shader programs, keyed by filter type.\n */\n applyTo(options: TWebGLPipelineState | T2DPipelineState) {\n if (isWebGLPipelineState(options)) {\n (this as unknown as ResizeDuringWEBGLResize).applyToForWebgl(options);\n } else {\n (this as unknown as ResizeDuring2DResize).applyTo2d(options);\n }\n }\n\n isNeutralState() {\n return this.scaleX === 1 && this.scaleY === 1;\n }\n\n lanczosCreate(lobes: number) {\n return (x: number) => {\n if (x >= lobes || x <= -lobes) {\n return 0.0;\n }\n if (x < 1.1920929e-7 && x > -1.1920929e-7) {\n return 1.0;\n }\n x *= Math.PI;\n const xx = x / lobes;\n return ((Math.sin(x) / x) * Math.sin(xx)) / xx;\n };\n }\n\n applyTo2d(this: ResizeDuring2DResize, options: T2DPipelineState) {\n const imageData = options.imageData,\n scaleX = this.scaleX,\n scaleY = this.scaleY;\n\n this.rcpScaleX = 1 / scaleX;\n this.rcpScaleY = 1 / scaleY;\n\n const oW = imageData.width;\n const oH = imageData.height;\n const dW = Math.round(oW * scaleX);\n const dH = Math.round(oH * scaleY);\n let newData: ImageData;\n\n if (this.resizeType === 'sliceHack') {\n newData = this.sliceByTwo(options, oW, oH, dW, dH);\n } else if (this.resizeType === 'hermite') {\n newData = this.hermiteFastResize(options, oW, oH, dW, dH);\n } else if (this.resizeType === 'bilinear') {\n newData = this.bilinearFiltering(options, oW, oH, dW, dH);\n } else if (this.resizeType === 'lanczos') {\n newData = this.lanczosResize(options, oW, oH, dW, dH);\n } else {\n // this should never trigger, is here just for safety net.\n newData = new ImageData(dW, dH);\n }\n options.imageData = newData;\n }\n\n /**\n * Filter sliceByTwo\n * @param {Object} canvasEl Canvas element to apply filter to\n * @param {Number} oW Original Width\n * @param {Number} oH Original Height\n * @param {Number} dW Destination Width\n * @param {Number} dH Destination Height\n * @returns {ImageData}\n */\n sliceByTwo(\n options: T2DPipelineState,\n oW: number,\n oH: number,\n dW: number,\n dH: number,\n ) {\n const imageData = options.imageData;\n const mult = 0.5;\n let doneW = false;\n let doneH = false;\n let stepW = oW * mult;\n let stepH = oH * mult;\n const resources = options.filterBackend.resources;\n let sX = 0;\n let sY = 0;\n const dX = oW;\n let dY = 0;\n if (!resources.sliceByTwo) {\n resources.sliceByTwo = createCanvasElement();\n }\n const tmpCanvas = resources.sliceByTwo;\n if (tmpCanvas.width < oW * 1.5 || tmpCanvas.height < oH) {\n tmpCanvas.width = oW * 1.5;\n tmpCanvas.height = oH;\n }\n const ctx = tmpCanvas.getContext('2d')!;\n ctx.clearRect(0, 0, oW * 1.5, oH);\n ctx.putImageData(imageData, 0, 0);\n\n dW = Math.floor(dW);\n dH = Math.floor(dH);\n\n while (!doneW || !doneH) {\n oW = stepW;\n oH = stepH;\n if (dW < Math.floor(stepW * mult)) {\n stepW = Math.floor(stepW * mult);\n } else {\n stepW = dW;\n doneW = true;\n }\n if (dH < Math.floor(stepH * mult)) {\n stepH = Math.floor(stepH * mult);\n } else {\n stepH = dH;\n doneH = true;\n }\n ctx.drawImage(tmpCanvas, sX, sY, oW, oH, dX, dY, stepW, stepH);\n sX = dX;\n sY = dY;\n dY += stepH;\n }\n return ctx.getImageData(sX, sY, dW, dH);\n }\n\n /**\n * Filter lanczosResize\n * @param {Object} canvasEl Canvas element to apply filter to\n * @param {Number} oW Original Width\n * @param {Number} oH Original Height\n * @param {Number} dW Destination Width\n * @param {Number} dH Destination Height\n * @returns {ImageData}\n */\n lanczosResize(\n this: ResizeDuring2DResize,\n options: T2DPipelineState,\n oW: number,\n oH: number,\n dW: number,\n dH: number,\n ): ImageData {\n function process(u: number): ImageData {\n let v, i, weight, idx, a, red, green, blue, alpha, fX, fY;\n center.x = (u + 0.5) * ratioX;\n icenter.x = Math.floor(center.x);\n for (v = 0; v < dH; v++) {\n center.y = (v + 0.5) * ratioY;\n icenter.y = Math.floor(center.y);\n a = 0;\n red = 0;\n green = 0;\n blue = 0;\n alpha = 0;\n for (i = icenter.x - range2X; i <= icenter.x + range2X; i++) {\n if (i < 0 || i >= oW) {\n continue;\n }\n fX = Math.floor(1000 * Math.abs(i - center.x));\n if (!cacheLanc[fX]) {\n cacheLanc[fX] = {};\n }\n for (let j = icenter.y - range2Y; j <= icenter.y + range2Y; j++) {\n if (j < 0 || j >= oH) {\n continue;\n }\n fY = Math.floor(1000 * Math.abs(j - center.y));\n if (!cacheLanc[fX][fY]) {\n cacheLanc[fX][fY] = lanczos(\n Math.sqrt(\n Math.pow(fX * rcpRatioX, 2) + Math.pow(fY * rcpRatioY, 2),\n ) / 1000,\n );\n }\n weight = cacheLanc[fX][fY];\n if (weight > 0) {\n idx = (j * oW + i) * 4;\n a += weight;\n red += weight * srcData[idx];\n green += weight * srcData[idx + 1];\n blue += weight * srcData[idx + 2];\n alpha += weight * srcData[idx + 3];\n }\n }\n }\n idx = (v * dW + u) * 4;\n destData[idx] = red / a;\n destData[idx + 1] = green / a;\n destData[idx + 2] = blue / a;\n destData[idx + 3] = alpha / a;\n }\n\n if (++u < dW) {\n return process(u);\n } else {\n return destImg;\n }\n }\n\n const srcData = options.imageData.data,\n destImg = options.ctx.createImageData(dW, dH),\n destData = destImg.data,\n lanczos = this.lanczosCreate(this.lanczosLobes),\n ratioX = this.rcpScaleX,\n ratioY = this.rcpScaleY,\n rcpRatioX = 2 / this.rcpScaleX,\n rcpRatioY = 2 / this.rcpScaleY,\n range2X = Math.ceil((ratioX * this.lanczosLobes) / 2),\n range2Y = Math.ceil((ratioY * this.lanczosLobes) / 2),\n cacheLanc: Record> = {},\n center: XY = { x: 0, y: 0 },\n icenter: XY = { x: 0, y: 0 };\n\n return process(0);\n }\n\n /**\n * bilinearFiltering\n * @param {Object} canvasEl Canvas element to apply filter to\n * @param {Number} oW Original Width\n * @param {Number} oH Original Height\n * @param {Number} dW Destination Width\n * @param {Number} dH Destination Height\n * @returns {ImageData}\n */\n bilinearFiltering(\n this: ResizeDuring2DResize,\n options: T2DPipelineState,\n oW: number,\n oH: number,\n dW: number,\n dH: number,\n ) {\n let a;\n let b;\n let c;\n let d;\n let x;\n let y;\n let i;\n let j;\n let xDiff;\n let yDiff;\n let chnl;\n let color;\n let offset = 0;\n let origPix;\n const ratioX = this.rcpScaleX;\n const ratioY = this.rcpScaleY;\n const w4 = 4 * (oW - 1);\n const img = options.imageData;\n const pixels = img.data;\n const destImage = options.ctx.createImageData(dW, dH);\n const destPixels = destImage.data;\n for (i = 0; i < dH; i++) {\n for (j = 0; j < dW; j++) {\n x = Math.floor(ratioX * j);\n y = Math.floor(ratioY * i);\n xDiff = ratioX * j - x;\n yDiff = ratioY * i - y;\n origPix = 4 * (y * oW + x);\n\n for (chnl = 0; chnl < 4; chnl++) {\n a = pixels[origPix + chnl];\n b = pixels[origPix + 4 + chnl];\n c = pixels[origPix + w4 + chnl];\n d = pixels[origPix + w4 + 4 + chnl];\n color =\n a * (1 - xDiff) * (1 - yDiff) +\n b * xDiff * (1 - yDiff) +\n c * yDiff * (1 - xDiff) +\n d * xDiff * yDiff;\n destPixels[offset++] = color;\n }\n }\n }\n return destImage;\n }\n\n /**\n * hermiteFastResize\n * @param {Object} canvasEl Canvas element to apply filter to\n * @param {Number} oW Original Width\n * @param {Number} oH Original Height\n * @param {Number} dW Destination Width\n * @param {Number} dH Destination Height\n * @returns {ImageData}\n */\n hermiteFastResize(\n this: ResizeDuring2DResize,\n options: T2DPipelineState,\n oW: number,\n oH: number,\n dW: number,\n dH: number,\n ) {\n const ratioW = this.rcpScaleX,\n ratioH = this.rcpScaleY,\n ratioWHalf = Math.ceil(ratioW / 2),\n ratioHHalf = Math.ceil(ratioH / 2),\n img = options.imageData,\n data = img.data,\n img2 = options.ctx.createImageData(dW, dH),\n data2 = img2.data;\n for (let j = 0; j < dH; j++) {\n for (let i = 0; i < dW; i++) {\n const x2 = (i + j * dW) * 4;\n let weight = 0;\n let weights = 0;\n let weightsAlpha = 0;\n let gxR = 0;\n let gxG = 0;\n let gxB = 0;\n let gxA = 0;\n const centerY = (j + 0.5) * ratioH;\n for (let yy = Math.floor(j * ratioH); yy < (j + 1) * ratioH; yy++) {\n const dy = Math.abs(centerY - (yy + 0.5)) / ratioHHalf,\n centerX = (i + 0.5) * ratioW,\n w0 = dy * dy;\n for (let xx = Math.floor(i * ratioW); xx < (i + 1) * ratioW; xx++) {\n let dx = Math.abs(centerX - (xx + 0.5)) / ratioWHalf;\n const w = Math.sqrt(w0 + dx * dx);\n /* eslint-disable max-depth */\n if (w > 1 && w < -1) {\n continue;\n }\n //hermite filter\n weight = 2 * w * w * w - 3 * w * w + 1;\n if (weight > 0) {\n dx = 4 * (xx + yy * oW);\n //alpha\n gxA += weight * data[dx + 3];\n weightsAlpha += weight;\n //colors\n if (data[dx + 3] < 255) {\n weight = (weight * data[dx + 3]) / 250;\n }\n gxR += weight * data[dx];\n gxG += weight * data[dx + 1];\n gxB += weight * data[dx + 2];\n weights += weight;\n }\n /* eslint-enable max-depth */\n }\n }\n data2[x2] = gxR / weights;\n data2[x2 + 1] = gxG / weights;\n data2[x2 + 2] = gxB / weights;\n data2[x2 + 3] = gxA / weightsAlpha;\n }\n }\n return img2;\n }\n}\n\nclassRegistry.setClass(Resize);\n","import { BaseFilter } from './BaseFilter';\nimport type { T2DPipelineState, TWebGLUniformLocationMap } from './typedefs';\nimport { classRegistry } from '../ClassRegistry';\nimport { fragmentSource } from './shaders/saturation';\n\nexport type SaturationOwnProps = {\n saturation: number;\n};\n\nexport const saturationDefaultValues: SaturationOwnProps = {\n saturation: 0,\n};\n\n/**\n * Saturate filter class\n * @example\n * const filter = new Saturation({\n * saturation: 1\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n */\nexport class Saturation extends BaseFilter<'Saturation', SaturationOwnProps> {\n /**\n * Saturation value, from -1 to 1.\n * Increases/decreases the color saturation.\n * A value of 0 has no effect.\n *\n * @param {Number} saturation\n */\n declare saturation: SaturationOwnProps['saturation'];\n\n static type = 'Saturation';\n\n static defaults = saturationDefaultValues;\n\n static uniformLocations = ['uSaturation'];\n\n getFragmentSource() {\n return fragmentSource;\n }\n\n /**\n * Apply the Saturation operation to a Uint8ClampedArray representing the pixels of an image.\n *\n * @param {Object} options\n * @param {ImageData} options.imageData The Uint8ClampedArray to be filtered.\n */\n applyTo2d({ imageData: { data } }: T2DPipelineState) {\n const adjust = -this.saturation;\n for (let i = 0; i < data.length; i += 4) {\n const r = data[i];\n const g = data[i + 1];\n const b = data[i + 2];\n const max = Math.max(r, g, b);\n data[i] += max !== r ? (max - r) * adjust : 0;\n data[i + 1] += max !== g ? (max - g) * adjust : 0;\n data[i + 2] += max !== b ? (max - b) * adjust : 0;\n }\n }\n\n /**\n * Send data from this filter to its shader program's uniforms.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n */\n sendUniformData(\n gl: WebGLRenderingContext,\n uniformLocations: TWebGLUniformLocationMap,\n ) {\n gl.uniform1f(uniformLocations.uSaturation, -this.saturation);\n }\n\n isNeutralState() {\n return this.saturation === 0;\n }\n}\n\nclassRegistry.setClass(Saturation);\n","export const fragmentSource = `\n precision highp float;\n uniform sampler2D uTexture;\n uniform float uSaturation;\n varying vec2 vTexCoord;\n void main() {\n vec4 color = texture2D(uTexture, vTexCoord);\n float rgMax = max(color.r, color.g);\n float rgbMax = max(rgMax, color.b);\n color.r += rgbMax != color.r ? (rgbMax - color.r) * uSaturation : 0.00;\n color.g += rgbMax != color.g ? (rgbMax - color.g) * uSaturation : 0.00;\n color.b += rgbMax != color.b ? (rgbMax - color.b) * uSaturation : 0.00;\n gl_FragColor = color;\n }\n`;\n","import { BaseFilter } from './BaseFilter';\nimport type { T2DPipelineState, TWebGLUniformLocationMap } from './typedefs';\nimport { classRegistry } from '../ClassRegistry';\nimport { fragmentSource } from './shaders/vibrance';\n\nexport type VibranceOwnProps = {\n vibrance: number;\n};\n\nexport const vibranceDefaultValues: VibranceOwnProps = {\n vibrance: 0,\n};\n\n/**\n * Vibrance filter class\n * @example\n * const filter = new Vibrance({\n * vibrance: 1\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n */\nexport class Vibrance extends BaseFilter<'Vibrance', VibranceOwnProps> {\n /**\n * Vibrance value, from -1 to 1.\n * Increases/decreases the saturation of more muted colors with less effect on saturated colors.\n * A value of 0 has no effect.\n *\n * @param {Number} vibrance\n */\n declare vibrance: VibranceOwnProps['vibrance'];\n\n static type = 'Vibrance';\n\n static defaults = vibranceDefaultValues;\n\n static uniformLocations = ['uVibrance'];\n\n getFragmentSource() {\n return fragmentSource;\n }\n\n /**\n * Apply the Vibrance operation to a Uint8ClampedArray representing the pixels of an image.\n *\n * @param {Object} options\n * @param {ImageData} options.imageData The Uint8ClampedArray to be filtered.\n */\n applyTo2d({ imageData: { data } }: T2DPipelineState) {\n const adjust = -this.vibrance;\n for (let i = 0; i < data.length; i += 4) {\n const r = data[i];\n const g = data[i + 1];\n const b = data[i + 2];\n const max = Math.max(r, g, b);\n const avg = (r + g + b) / 3;\n const amt = ((Math.abs(max - avg) * 2) / 255) * adjust;\n data[i] += max !== r ? (max - r) * amt : 0;\n data[i + 1] += max !== g ? (max - g) * amt : 0;\n data[i + 2] += max !== b ? (max - b) * amt : 0;\n }\n }\n\n /**\n * Send data from this filter to its shader program's uniforms.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {TWebGLUniformLocationMap} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n */\n sendUniformData(\n gl: WebGLRenderingContext,\n uniformLocations: TWebGLUniformLocationMap,\n ) {\n gl.uniform1f(uniformLocations.uVibrance, -this.vibrance);\n }\n\n isNeutralState() {\n return this.vibrance === 0;\n }\n}\n\nclassRegistry.setClass(Vibrance);\n","export const fragmentSource = `\n precision highp float;\n uniform sampler2D uTexture;\n uniform float uVibrance;\n varying vec2 vTexCoord;\n void main() {\n vec4 color = texture2D(uTexture, vTexCoord);\n float max = max(color.r, max(color.g, color.b));\n float avg = (color.r + color.g + color.b) / 3.0;\n float amt = (abs(max - avg) * 2.0) * uVibrance;\n color.r += max != color.r ? (max - color.r) * amt : 0.00;\n color.g += max != color.g ? (max - color.g) * amt : 0.00;\n color.b += max != color.b ? (max - color.b) * amt : 0.00;\n gl_FragColor = color;\n }\n`;\n","import { Color } from '../color/Color';\nimport type { Point } from '../Point';\nimport { Shadow } from '../Shadow';\nimport { Circle } from '../shapes/Circle';\nimport { Group } from '../shapes/Group';\nimport { getRandomInt } from '../util/internals/getRandomInt';\nimport type { Canvas } from '../canvas/Canvas';\nimport { BaseBrush } from './BaseBrush';\nimport type { CircleBrushPoint } from './typedefs';\nimport { CENTER } from '../constants';\n\nexport class CircleBrush extends BaseBrush {\n /**\n * Width of a brush\n * @type Number\n */\n width = 10;\n\n declare points: CircleBrushPoint[];\n\n constructor(canvas: Canvas) {\n super(canvas);\n this.points = [];\n }\n\n /**\n * Invoked inside on mouse down and mouse move\n * @param {Point} pointer\n */\n drawDot(pointer: Point) {\n const point = this.addPoint(pointer),\n ctx = this.canvas.contextTop;\n this._saveAndTransform(ctx);\n this.dot(ctx, point);\n ctx.restore();\n }\n\n dot(ctx: CanvasRenderingContext2D, point: CircleBrushPoint) {\n ctx.fillStyle = point.fill;\n ctx.beginPath();\n ctx.arc(point.x, point.y, point.radius, 0, Math.PI * 2, false);\n ctx.closePath();\n ctx.fill();\n }\n\n /**\n * Invoked on mouse down\n */\n onMouseDown(pointer: Point) {\n this.points = [];\n this.canvas.clearContext(this.canvas.contextTop);\n this._setShadow();\n this.drawDot(pointer);\n }\n\n /**\n * Render the full state of the brush\n * @private\n */\n _render() {\n const ctx = this.canvas.contextTop,\n points = this.points;\n this._saveAndTransform(ctx);\n for (let i = 0; i < points.length; i++) {\n this.dot(ctx, points[i]);\n }\n ctx.restore();\n }\n\n /**\n * Invoked on mouse move\n * @param {Point} pointer\n */\n onMouseMove(pointer: Point) {\n if (this.limitedToCanvasSize === true && this._isOutSideCanvas(pointer)) {\n return;\n }\n if (this.needsFullRender()) {\n this.canvas.clearContext(this.canvas.contextTop);\n this.addPoint(pointer);\n this._render();\n } else {\n this.drawDot(pointer);\n }\n }\n\n /**\n * Invoked on mouse up\n */\n onMouseUp() {\n const originalRenderOnAddRemove = this.canvas.renderOnAddRemove;\n this.canvas.renderOnAddRemove = false;\n\n const circles: Circle[] = [];\n\n for (let i = 0; i < this.points.length; i++) {\n const point = this.points[i],\n circle = new Circle({\n radius: point.radius,\n left: point.x,\n top: point.y,\n originX: CENTER,\n originY: CENTER,\n fill: point.fill,\n });\n\n this.shadow && (circle.shadow = new Shadow(this.shadow));\n\n circles.push(circle);\n }\n const group = new Group(circles, { canvas: this.canvas });\n\n this.canvas.fire('before:path:created', { path: group });\n this.canvas.add(group);\n this.canvas.fire('path:created', { path: group });\n\n this.canvas.clearContext(this.canvas.contextTop);\n this._resetShadow();\n this.canvas.renderOnAddRemove = originalRenderOnAddRemove;\n this.canvas.requestRenderAll();\n }\n\n /**\n * @param {Object} pointer\n * @return {Point} Just added pointer point\n */\n addPoint({ x, y }: Point) {\n const pointerPoint: CircleBrushPoint = {\n x,\n y,\n radius: getRandomInt(Math.max(0, this.width - 20), this.width + 20) / 2,\n fill: new Color(this.color).setAlpha(getRandomInt(0, 100) / 100).toRgba(),\n };\n\n this.points.push(pointerPoint);\n\n return pointerPoint;\n }\n}\n","import { Pattern } from '../Pattern';\nimport { createCanvasElement } from '../util/misc/dom';\nimport type { Canvas } from '../canvas/Canvas';\nimport { PencilBrush } from './PencilBrush';\nimport type { TSimplePathData } from '../util/path/typedefs';\n\nexport class PatternBrush extends PencilBrush {\n declare source?: CanvasImageSource;\n\n constructor(canvas: Canvas) {\n super(canvas);\n }\n\n getPatternSrc() {\n const dotWidth = 20,\n dotDistance = 5,\n patternCanvas = createCanvasElement(),\n patternCtx = patternCanvas.getContext('2d');\n\n patternCanvas.width = patternCanvas.height = dotWidth + dotDistance;\n if (patternCtx) {\n patternCtx.fillStyle = this.color;\n patternCtx.beginPath();\n patternCtx.arc(\n dotWidth / 2,\n dotWidth / 2,\n dotWidth / 2,\n 0,\n Math.PI * 2,\n false,\n );\n patternCtx.closePath();\n patternCtx.fill();\n }\n return patternCanvas;\n }\n\n /**\n * Creates \"pattern\" instance property\n * @param {CanvasRenderingContext2D} ctx\n */\n getPattern(ctx: CanvasRenderingContext2D) {\n return ctx.createPattern(this.source || this.getPatternSrc(), 'repeat');\n }\n\n /**\n * Sets brush styles\n * @param {CanvasRenderingContext2D} ctx\n */\n _setBrushStyles(ctx: CanvasRenderingContext2D) {\n super._setBrushStyles(ctx);\n const pattern = this.getPattern(ctx);\n pattern && (ctx.strokeStyle = pattern);\n }\n\n /**\n * Creates path\n */\n createPath(pathData: TSimplePathData) {\n const path = super.createPath(pathData),\n topLeft = path._getLeftTopCoords().scalarAdd(path.strokeWidth / 2);\n\n path.stroke = new Pattern({\n source: this.source || this.getPatternSrc(),\n offsetX: -topLeft.x,\n offsetY: -topLeft.y,\n });\n return path;\n }\n}\n","import type { Point } from '../Point';\nimport { Group } from '../shapes/Group';\nimport { Shadow } from '../Shadow';\nimport { Rect } from '../shapes/Rect';\nimport { getRandomInt } from '../util/internals/getRandomInt';\nimport type { Canvas } from '../canvas/Canvas';\nimport { BaseBrush } from './BaseBrush';\nimport type { SprayBrushPoint } from './typedefs';\nimport { CENTER } from '../constants';\n\n/**\n *\n * @param rects\n * @returns\n */\nfunction getUniqueRects(rects: Rect[]) {\n const uniqueRects: Record = {};\n const uniqueRectsArray: Rect[] = [];\n\n for (let i = 0, key: string; i < rects.length; i++) {\n key = `${rects[i].left}${rects[i].top}`;\n if (!uniqueRects[key]) {\n uniqueRects[key] = true;\n uniqueRectsArray.push(rects[i]);\n }\n }\n\n return uniqueRectsArray;\n}\n\nexport class SprayBrush extends BaseBrush {\n /**\n * Width of a spray\n * @type Number\n */\n width = 10;\n\n /**\n * Density of a spray (number of dots per chunk)\n * @type Number\n */\n density = 20;\n\n /**\n * Width of spray dots\n * @type Number\n */\n dotWidth = 1;\n\n /**\n * Width variance of spray dots\n * @type Number\n */\n dotWidthVariance = 1;\n\n /**\n * Whether opacity of a dot should be random\n * @type Boolean\n */\n randomOpacity = false;\n\n /**\n * Whether overlapping dots (rectangles) should be removed (for performance reasons)\n * @type Boolean\n */\n optimizeOverlapping = true;\n\n declare private sprayChunks: SprayBrushPoint[][];\n\n declare private sprayChunk: SprayBrushPoint[];\n\n /**\n * Constructor\n * @param {Canvas} canvas\n * @return {SprayBrush} Instance of a spray brush\n */\n constructor(canvas: Canvas) {\n super(canvas);\n this.sprayChunks = [];\n this.sprayChunk = [];\n }\n\n /**\n * Invoked on mouse down\n * @param {Point} pointer\n */\n onMouseDown(pointer: Point) {\n this.sprayChunks = [];\n this.canvas.clearContext(this.canvas.contextTop);\n this._setShadow();\n\n this.addSprayChunk(pointer);\n this.renderChunck(this.sprayChunk);\n }\n\n /**\n * Invoked on mouse move\n * @param {Point} pointer\n */\n onMouseMove(pointer: Point) {\n if (this.limitedToCanvasSize === true && this._isOutSideCanvas(pointer)) {\n return;\n }\n this.addSprayChunk(pointer);\n this.renderChunck(this.sprayChunk);\n }\n\n /**\n * Invoked on mouse up\n */\n onMouseUp() {\n const originalRenderOnAddRemove = this.canvas.renderOnAddRemove;\n this.canvas.renderOnAddRemove = false;\n\n const rects: Rect[] = [];\n\n for (let i = 0; i < this.sprayChunks.length; i++) {\n const sprayChunk = this.sprayChunks[i];\n for (let j = 0; j < sprayChunk.length; j++) {\n const chunck = sprayChunk[j];\n const rect = new Rect({\n width: chunck.width,\n height: chunck.width,\n left: chunck.x + 1,\n top: chunck.y + 1,\n originX: CENTER,\n originY: CENTER,\n fill: this.color,\n });\n rects.push(rect);\n }\n }\n\n const group = new Group(\n this.optimizeOverlapping ? getUniqueRects(rects) : rects,\n {\n objectCaching: true,\n subTargetCheck: false,\n interactive: false,\n },\n );\n this.shadow && group.set('shadow', new Shadow(this.shadow));\n this.canvas.fire('before:path:created', { path: group });\n this.canvas.add(group);\n this.canvas.fire('path:created', { path: group });\n\n this.canvas.clearContext(this.canvas.contextTop);\n this._resetShadow();\n this.canvas.renderOnAddRemove = originalRenderOnAddRemove;\n this.canvas.requestRenderAll();\n }\n\n renderChunck(sprayChunck: SprayBrushPoint[]) {\n const ctx = this.canvas.contextTop;\n ctx.fillStyle = this.color;\n\n this._saveAndTransform(ctx);\n\n for (let i = 0; i < sprayChunck.length; i++) {\n const point = sprayChunck[i];\n ctx.globalAlpha = point.opacity;\n ctx.fillRect(point.x, point.y, point.width, point.width);\n }\n\n ctx.restore();\n }\n\n /**\n * Render all spray chunks\n */\n _render() {\n const ctx = this.canvas.contextTop;\n ctx.fillStyle = this.color;\n\n this._saveAndTransform(ctx);\n\n for (let i = 0; i < this.sprayChunks.length; i++) {\n this.renderChunck(this.sprayChunks[i]);\n }\n ctx.restore();\n }\n\n /**\n * @param {Point} pointer\n */\n addSprayChunk(pointer: Point) {\n this.sprayChunk = [];\n const radius = this.width / 2;\n\n for (let i = 0; i < this.density; i++) {\n this.sprayChunk.push({\n x: getRandomInt(pointer.x - radius, pointer.x + radius),\n y: getRandomInt(pointer.y - radius, pointer.y + radius),\n width: this.dotWidthVariance\n ? getRandomInt(\n // bottom clamp width to 1\n Math.max(1, this.dotWidth - this.dotWidthVariance),\n this.dotWidth + this.dotWidthVariance,\n )\n : this.dotWidth,\n opacity: this.randomOpacity ? getRandomInt(0, 100) / 100 : 1,\n });\n }\n\n this.sprayChunks.push(this.sprayChunk);\n }\n}\n","import { createEmptyResponse } from './parseSVGDocument';\nimport { loadSVGFromString } from './loadSVGFromString';\nimport type { SVGParsingOutput, TSvgReviverCallback } from './typedefs';\nimport type { LoadImageOptions } from '../util/misc/objectEnlive';\nimport { FabricError } from '../util/internals/console';\n\n/**\n * Takes url corresponding to an SVG document, and parses it into a set of fabric objects.\n * Note that SVG is fetched via fetch API, so it needs to conform to SOP (Same Origin Policy)\n * @param {string} url where the SVG is\n * @param {TSvgParsedCallback} callback Invoked when the parsing is done, with null if parsing wasn't possible with the list of svg nodes.\n * {@link TSvgParsedCallback} also receives `allElements` array as the last argument. This is the full list of svg nodes available in the document.\n * You may want to use it if you are trying to regroup the objects as they were originally grouped in the SVG. ( This was the reason why it was added )\n * @param {TSvgReviverCallback} [reviver] Extra callback for further parsing of SVG elements, called after each fabric object has been created.\n * Takes as input the original svg element and the generated `FabricObject` as arguments. Used to inspect extra properties not parsed by fabric,\n * or extra custom manipulation\n * @param {Object} [options] Object containing options for parsing\n * @param {String} [options.crossOrigin] crossOrigin setting to use for external resources\n * @param {AbortSignal} [options.signal] handle aborting, see https://developer.mozilla.org/en-US/docs/Web/API/AbortController/signal\n */\nexport function loadSVGFromURL(\n url: string,\n reviver?: TSvgReviverCallback,\n options: LoadImageOptions = {},\n): Promise {\n return fetch(url.replace(/^\\n\\s*/, '').trim(), {\n signal: options.signal,\n })\n .then((response) => {\n if (!response.ok) {\n throw new FabricError(`HTTP error! status: ${response.status}`);\n }\n return response.text();\n })\n .then((svgText) => {\n return loadSVGFromString(svgText, reviver, options);\n })\n .catch(() => {\n // this is an unhappy path, we dont care about speed\n return createEmptyResponse();\n });\n}\n"],"names":["BaseConfiguration","constructor","_defineProperty","this","window","devicePixelRatio","config","super","configure","arguments","length","undefined","Object","assign","addFonts","paths","fontPaths","removeFonts","forEach","fontFamily","clearFonts","restoreDefaults","keys","defaults","reduce","acc","key","log","severity","_len","optionalParams","Array","_key","console","FabricError","Error","message","options","SignalAbortedError","context","GLProbe","WebGLProbe","testPrecision","gl","precision","fragmentSource","fragmentShader","createShader","FRAGMENT_SHADER","shaderSource","compileShader","getShaderParameter","COMPILE_STATUS","queryWebGL","canvas","getContext","maxTextureSize","getParameter","MAX_TEXTURE_SIZE","GLPrecision","find","getExtension","loseContext","isSupported","textureSize","copyPasteData","env","getEnv","document","isTouchSupported","navigator","maxTouchPoints","dispose","getFabricDocument","getFabricWindow","getDevicePixelRatio","_config$devicePixelRa","Math","max","cache","getFontCache","_ref","fontStyle","fontWeight","toLowerCase","charWidthsCache","fontCache","cacheKey","clearFontCache","limitDimsByArea","ar","perfLimitSizeTotal","roughWidth","sqrt","floor","VERSION","noop","halfPI","PI","quarterPI","twoMathPi","PiBy180","iMatrix","freeze","DEFAULT_SVG_FONT_SIZE","kRect","CENTER","LEFT","TOP","BOTTOM","RIGHT","NONE","reNewline","MOVING","SCALING","ROTATING","ROTATE","SKEWING","RESIZING","MODIFY_POLY","MODIFY_PATH","CHANGED","SCALE","SCALE_X","SCALE_Y","SKEW_X","SKEW_Y","FILL","STROKE","MODIFIED","JSON","SVG","classRegistry","Map","has","classType","getClass","get","setClass","classConstructor","set","type","getSVGClass","SVGTagName","setSVGClass","runningAnimations","remove","index","indexOf","splice","cancelAll","animations","animation","abort","cancelByCanvas","filter","_animation$target","target","cancelByTarget","Observable","on","arg0","handler","__eventListeners","entries","eventName","off","push","once","disposers","_ref2","d","disposer","args","call","_removeEventListener","eventListener","_ref3","fire","_this$__eventListener","listenersForEvent","concat","i","removeFromArray","array","value","idx","cos","angle","abs","sin","angleSlice","sign","Point","y","x","add","that","addEquals","scalarAdd","scalar","scalarAddEquals","subtract","subtractEquals","scalarSubtract","scalarSubtractEquals","multiply","scalarMultiply","scalarMultiplyEquals","divide","scalarDivide","scalarDivideEquals","eq","lt","lte","gt","gte","lerp","t","min","distanceFrom","dx","dy","midPointFrom","toString","setXY","setX","setY","setFromPoint","swap","clone","rotate","radians","origin","ZERO","sinus","cosinus","p","transform","ignoreOffset","isCollection","fabricObject","isArray","_objects","createCollectionMixin","Base","Collection","_onObjectAdded","object","_onObjectRemoved","_onStackOrderChanged","objects","size","insertAt","_len2","_key2","removed","_len3","_key3","forEachObject","callback","getObjects","_len4","types","_key4","o","isType","item","isEmpty","contains","deep","includes","some","obj","complexity","memo","current","sendObjectToBack","unshift","bringObjectToFront","sendObjectBackwards","intersecting","newIdx","findNewLowerIndex","bringObjectForward","findNewUpperIndex","moveObjectTo","isOverlapping","collectObjects","left","top","width","height","includeIntersecting","tl","br","selectable","visible","intersectsWithRect","isContainedWithinRect","containsPoint","CommonMethods","_setOptions","prop","_setObject","_set","toggle","property","requestAnimFrame","requestAnimationFrame","cancelAnimFrame","handle","cancelAnimationFrame","id","uid","createCanvasElement","element","createElement","createImage","createCanvasElementFor","newCanvas","toDataURL","canvasEl","format","quality","toBlob","Promise","resolve","_","degreesToRadians","degrees","radiansToDegrees","isIdentityMatrix","mat","every","transformPoint","invertTransform","a","r","multiplyTransformMatrices","b","is2x2","multiplyTransformMatrixArray","matrices","reduceRight","product","curr","calcPlaneRotation","atan2","qrDecompose","denom","pow","scaleX","scaleY","skewX","skewY","translateX","translateY","createTranslateMatrix","createRotateMatrix","angleRadiant","cosValue","sinValue","createScaleMatrix","angleToSkew","tan","createSkewXMatrix","skewValue","createSkewYMatrix","calcDimensionsMatrix","flipX","flipY","matrix","composeMatrix","scaleMatrix","loadImage","url","signal","crossOrigin","reject","aborted","img","err","src","addEventListener","done","onload","onerror","removeEventListener","enlivenObjects","reviver","instances","all","map","fromObject","then","fabricInstance","catch","error","instance","finally","enlivenObjectEnlivables","serializedObject","promises","values","enlived","pick","source","pickBy","predicate","toFixed","number","fractionDigits","parseFloat","Number","matrixToSVG","NUM_FRACTION_DIGITS","join","isFiller","filler","toLive","isSerializableFiller","toObject","isPattern","offsetX","isActiveSelection","getScrollLeftTop","doc","getDocumentFromElement","elementLoop","docElement","documentElement","body","scrollLeft","scrollTop","parentNode","host","nodeType","style","position","el","ownerDocument","getWindowFromElement","_el$ownerDocument","defaultView","setCanvasDimensions","ctx","retinaScaling","setAttribute","scale","setCSSDimensions","makeElementUnselectable","onselectstart","userSelect","StaticCanvasDOMManager","createLowerCanvas","lower","getElementById","hasAttribute","_originalCanvasStyle","cssText","classList","cleanupDOM","removeAttribute","setDimensions","calcOffset","_getWindowFromElement","offset","elemStyle","getComputedStyle","parseInt","borderLeftWidth","borderTopWidth","paddingLeft","paddingTop","box","docElem","getBoundingClientRect","scrollLeftTop","clientLeft","clientTop","getElementOffset","staticCanvasDefaults","backgroundVpt","backgroundColor","overlayVpt","overlayColor","includeDefaultValues","svgViewportTransformation","renderOnAddRemove","skipOffscreen","enableRetinaScaling","imageSmoothingEnabled","controlsAboveOverlay","allowTouchScrolling","viewportTransform","StaticCanvas","lowerCanvasEl","_this$elements$lower","elements","contextContainer","_this$elements$lower2","getDefaults","ownDefaults","initElements","_setDimensionsImpl","skipControlsDrawing","calcViewportBoundaries","requestRenderAll","setCoords","getRetinaScaling","_offset","getWidth","getHeight","dimensions","cssOnly","backstoreOnly","hasLostContext","getZoom","setViewportTransform","vpt","zoomToPoint","point","before","newPoint","after","setZoom","absolutePan","relativePan","getElement","clearContext","clearRect","clear","backgroundImage","overlayImage","renderAll","cancelRequestedRender","destroyed","renderCanvas","renderAndReset","nextRenderHandle","disposed","iVpt","vptCoords","tr","bl","drawControls","_ctx","v","path","clipPath","patternQuality","_renderBackground","save","_renderObjects","restore","shouldCache","_transformDone","renderCache","forClipping","drawClipPathOnCanvas","_renderOverlay","__cleanupTask","globalCompositeOperation","zoomX","zoomY","drawImage","_cacheCanvas","cacheTranslationX","cacheTranslationY","len","render","_renderBackgroundOrOverlay","fill","needsVpt","isAFiller","beginPath","moveTo","lineTo","closePath","fillStyle","offsetY","m","gradientTransform","patternTransform","getCenterPoint","centerObjectH","_centerObject","centerObjectV","centerObject","viewportCenterObject","getVpCenter","viewportCenterObjectH","viewportCenterObjectV","center","toDatalessJSON","propertiesToInclude","toDatalessObject","_toObjectMethod","toJSON","methodName","clipPathData","excludeFromExport","_toObject","version","__serializeBgOverlay","originalValue","data","bgImage","bgColor","background","overlay","toSVG","markup","_setSVGPreamble","_setSVGHeader","clipPathId","_setSVGBgOverlayColor","_setSVGBgOverlayImage","_setSVGObjects","suppressPreamble","encoding","optViewBox","viewBox","createSVGFontFacesMarkup","createSVGRefElementsMarkup","createSVGClipPathMarkup","toClipPathSVG","shouldTransform","additionalTransform","fontList","_renderText","styles","styleRow","fontListMarkup","_setSVGObject","bgOrOverlay","repeat","finalWidth","finalHeight","loadFromJSON","json","serialized","parse","enlivedMap","properties","cloneWithoutData","multiplier","finalMultiplier","toCanvasElement","scaledWidth","scaledHeight","zoom","originalWidth","originalHeight","originalSkipControlsDrawing","newZoom","vp","newVp","originalRetina","objectsToRender","task","destroy","kill","touchEvents","getPointer","event","scroll","_evt","touchProp","changedTouches","getTouchInfo","clientX","clientY","isTouchEvent","pointerType","stopEvent","e","preventDefault","stopPropagation","makeBoundingBoxFromPoints","points","addTransformToObject","applyTransformToObject","calcOwnMatrix","otherOptions","setPositionByOrigin","resetObjectTransform","saveObjectTransform","sizeAfterTransform","dimX","dimY","bbox","calcPlaneChangeMatrix","from","sendPointToPlane","to","sendVectorToPlane","sendObjectToPlane","fireEvent","_target$canvas","originOffset","bottom","right","resolveOrigin","originValue","unitVectorX","zero","rotateVector","vector","createVector","magnitude","calcAngleBetweenVectors","crossProduct","dotProduct","calcVectorRotation","getUnitVector","getOrthonormalVector","counterClockwise","isBetweenVectors","AxB","AxT","BxT","NOT_ALLOWED_CURSOR","isTransformCentered","originX","originY","invertOrigin","isLocked","lockingKey","commonEventInfo","eventData","pointer","findCornerQuadrant","control","coord","round","getLocalPoint","corner","controls","padding","localPoint","getRelativeCenterPoint","translateToGivenOrigin","normalizePoint","dragHandler","newLeft","newTop","moveX","moveY","ColorNameMap","aliceblue","antiquewhite","aqua","aquamarine","azure","beige","bisque","black","blanchedalmond","blue","blueviolet","brown","burlywood","cadetblue","chartreuse","chocolate","coral","cornflowerblue","cornsilk","crimson","cyan","darkblue","darkcyan","darkgoldenrod","darkgray","darkgrey","darkgreen","darkkhaki","darkmagenta","darkolivegreen","darkorange","darkorchid","darkred","darksalmon","darkseagreen","darkslateblue","darkslategray","darkslategrey","darkturquoise","darkviolet","deeppink","deepskyblue","dimgray","dimgrey","dodgerblue","firebrick","floralwhite","forestgreen","fuchsia","gainsboro","ghostwhite","gold","goldenrod","gray","grey","green","greenyellow","honeydew","hotpink","indianred","indigo","ivory","khaki","lavender","lavenderblush","lawngreen","lemonchiffon","lightblue","lightcoral","lightcyan","lightgoldenrodyellow","lightgray","lightgrey","lightgreen","lightpink","lightsalmon","lightseagreen","lightskyblue","lightslategray","lightslategrey","lightsteelblue","lightyellow","lime","limegreen","linen","magenta","maroon","mediumaquamarine","mediumblue","mediumorchid","mediumpurple","mediumseagreen","mediumslateblue","mediumspringgreen","mediumturquoise","mediumvioletred","midnightblue","mintcream","mistyrose","moccasin","navajowhite","navy","oldlace","olive","olivedrab","orange","orangered","orchid","palegoldenrod","palegreen","paleturquoise","palevioletred","papayawhip","peachpuff","peru","pink","plum","powderblue","purple","rebeccapurple","red","rosybrown","royalblue","saddlebrown","salmon","sandybrown","seagreen","seashell","sienna","silver","skyblue","slateblue","slategray","slategrey","snow","springgreen","steelblue","teal","thistle","tomato","turquoise","violet","wheat","white","whitesmoke","yellow","yellowgreen","hue2rgb","q","rgb2Hsl","g","maxValue","minValue","h","s","l","fromAlphaToFloat","endsWith","hexify","toUpperCase","padStart","greyAverage","avg","Color","color","setSource","_source","_tryParsingColor","sourceFromHex","sourceFromRgb","sourceFromHsl","isUnrecognised","getSource","toRgb","toRgba","toHsl","toHsla","toHex","toHexa","slice","getAlpha","setAlpha","alpha","toGrayscale","toBlackWhite","threshold","average","bOrW","overlayWith","otherColor","otherSource","R","G","B","fromRgb","fromRgba","match","parsedValue","fromHsl","fromHsla","parseAngletoDegrees","fromHex","expandedValue","split","hex","hexCouple","lowercase","numeric","parseUnit","fontSize","unit","exec","dpi","DPI","parsePreserveAspectRatioAttribute","attribute","firstPart","secondPart","trim","alignX","alignY","align","meetOrSlice","colorPropToSVG","colorValue","opacityValue","inlineStyle","opacity","FabricObjectSVGExportMixin","getSvgStyles","skipShadow","fillRule","strokeWidth","strokeDashArray","strokeDashOffset","strokeLineCap","strokeLineJoin","strokeMiterLimit","visibility","getSvgFilter","stroke","shadow","getSvgCommons","getSvgTransform","full","calcTransformMatrix","_toSVG","_reviver","_createBaseSVGMarkup","_createBaseClipPathSVGMarkup","objectMarkup","commonPieces","noStyle","withShadow","styleInfo","shadowInfo","vectorEffect","strokeUniform","absoluteClipPath","absolutePositioned","clipPathMarkup","addPaintOrder","paintFirst","getSvgRegex","arr","RegExp","TEXT_DECORATION_THICKNESS","fontProperties","textDecorationProperties","textLayoutProperties","additionalProps","styleProperties","textDefaultValues","_reNewline","_reSpacesAndTabs","_reSpaceAndTab","_reWords","underline","overline","linethrough","textAlign","lineHeight","textBackgroundColor","pathStartOffset","pathSide","pathAlign","charSpacing","deltaY","direction","CACHE_FONT_SIZE","MIN_TEXT_WIDTH","superscript","baseline","subscript","_fontSizeFraction","offsets","_fontSizeMult","JUSTIFY","JUSTIFY_LEFT","JUSTIFY_RIGHT","JUSTIFY_CENTER","reNum","String","raw","viewportSeparator","svgNS","reFontDeclaration","attributesMap","cx","cy","display","fSize","cPath","svgValidTagNamesRegEx","svgViewBoxElementsRegEx","svgValidParentsRegEx","reViewBoxAttrValue","shadowOffsetRegex","reOffsetsAndBlur","Shadow","parseShadow","shadowStr","blur","replace","fBoxX","fBoxY","affectStroke","nonScaling","capValue","stateProperties","cacheProperties","fabricObjectDefaultValues","minScaleLimit","objectCaching","inverted","centeredRotation","centeredScaling","dirty","normalize","c","asin","elastic","defaultEasing","easeOutBounce","easeInBounce","easeInCirc","easeInCubic","easeInElastic","normA","normS","normP","easeInExpo","easeInOutBounce","easeInOutCirc","easeInOutCubic","easeInOutElastic","normC","easeInOutExpo","easeInOutQuad","easeInOutQuart","easeInOutQuint","easeInOutSine","easeInQuad","easeInQuart","easeInQuint","easeInSine","easeOutCirc","easeOutCubic","easeOutElastic","easeOutExpo","easeOutQuad","easeOutQuart","easeOutQuint","easeOutSine","defaultAbort","AnimationBase","startValue","byValue","duration","delay","easing","onStart","onChange","onComplete","tick","bind","_onStart","_onChange","_onComplete","_abort","endValue","calculate","state","_state","isDone","start","firstTick","timestamp","startTime","Date","register","setTimeout","durationMs","boundDurationMs","durationProgress","valueProgress","unregister","ValueAnimation","timeElapsed","ArrayAnimation","defaultColorEasing","wrapColorCallback","rgba","ColorAnimation","startColor","endColor","animate","isArrayAnimation","animateColor","Intersection","status","append","isPointContained","T","A","infinite","AB","isPointInPolygon","other","hits","inter","intersectSegmentSegment","intersectLineLine","a1","a2","b1","b2","aInfinite","bInfinite","a2xa1x","a2ya1y","b2xb1x","b2yb1y","a1xb1x","a1yb1y","uaT","ubT","uB","ua","ub","segmentsCoincide","intersectSegmentLine","s1","s2","l1","l2","intersectLinePolygon","result","intersectSegmentPolygon","intersectPolygonPolygon","points1","points2","coincidences","intersectPolygonRectangle","r1","r2","topRight","bottomLeft","ObjectGeometry","getX","getXY","getY","getRelativeX","setRelativeX","getRelativeY","setRelativeY","relativePosition","getRelativeXY","group","setRelativeXY","isStrokeAccountedForInDimensions","getCoords","aCoords","calcACoords","coords","intersectsWithObject","intersection","isContainedWithinObject","getBoundingRect","isOnScreen","isPartiallyOnScreen","getScaledWidth","_getTransformedDimensions","getScaledHeight","scaleToWidth","boundingRectFactor","scaleToHeight","getCanvasRetinaScaling","_this$canvas","getTotalAngle","getViewportTransform","_this$canvas2","rotateMatrix","tMatrix","finalMatrix","dim","w","transformMatrixKey","skipGroup","prefix","matrixCache","ownMatrixCache","_getNonTransformedDimensions","_calculateCurrentDimensions","dimOptions","preScalingStrokeValue","postScalingStrokeValue","finalDimensions","fromOriginX","fromOriginY","toOriginX","toOriginY","translateToCenterPoint","translateToOriginPoint","relCenter","getPointByOrigin","pos","_getLeftTopCoords","FabricObject","name","setOptions","_createCacheCanvas","_cacheContext","_updateCacheCanvas","_limitCacheSize","dims","maxCacheSideLimit","minCacheSideLimit","limX","limY","capped","_getCacheCanvasDimensions","objectScale","getTotalObjectScaling","neededX","neededY","ceil","dimensionsChanged","zoomChanged","setTransform","drawingWidth","drawingHeight","translate","needFullTransform","contextTop","getObjectScaling","retina","getObjectOpacity","_constrainScale","isChanged","parent","isNotVisible","_setupCompositeOperation","drawSelectionBackground","_setOpacity","_setShadow","drawCacheOnCanvas","_removeCacheCanvas","drawObject","isCacheDirty","parentClipPaths","hasStroke","hasFill","needsItsOwnCache","ownCaching","isOnACache","willDrawShadow","drawClipPathOnCache","canvasWithClipPath","originalFill","originalStroke","_setClippingProperties","_render","_drawClipPath","createClipPathLayer","prevClipPath","skipCanvas","fillRect","_removeShadow","globalAlpha","_setStrokeStyles","decl","lineWidth","lineCap","lineDashOffset","lineJoin","miterLimit","gradientUnits","_applyPatternForTransformedGradient","strokeStyle","_applyPatternGradientTransform","_setFillStyles","_setLineDash","dashArray","setLineDash","sx","sy","multX","multY","scaling","shadowColor","shadowBlur","browserShadowBlurConstant","shadowOffsetX","shadowOffsetY","_renderPaintInOrder","_renderStroke","_renderFill","_pCtx$createPattern","pCanvas","pCtx","createPattern","_findCenterFromElement","objectForm","cloneAsImage","origParams","originalGroup","originalShadow","canvasProvider","withoutTransform","withoutShadow","boundingRect","shadowOffset","originalCanvas","setOnGroup","animatable","_animate","propIsColor","colorProperties","animationOptions","isDescendantOf","getAncestors","ancestors","findCommonAncestors","fork","otherFork","common","otherAncestors","ancestor","j","hasCommonAncestors","commonAncestors","isInFrontOf","ancestorData","firstCommonAncestor","headOfFork","pop","headOfOtherFork","thisIndex","otherIndex","propertiesToSerialize","customProperties","toFixedBound","val","_removeDefaultValues","baseValues","getPrototypeOf","baseValue","_fromObject","serializedObjectOptions","extraParam","enlivedObjectOptions","wrapWithFireEvent","actionHandler","extraEventInfo","actionPerformed","wrapWithFixedAnchor","centerPoint","constraint","changeWidth","changeObjectWidth","strokePadding","oldWidth","newWidth","renderCircleControl","styleOverride","xSize","sizeX","cornerSize","ySize","sizeY","transparentCorners","cornerStrokeColor","myLeft","myTop","cornerColor","arc","renderSquareControl","xSizeBy2","ySizeBy2","strokeRect","Control","shouldActivate","controlKey","_fabricObject$canvas","getActiveObject","isControlVisible","getActionHandler","getMouseDownHandler","mouseDownHandler","getMouseUpHandler","mouseUpHandler","cursorStyleHandler","cursorStyle","getActionName","actionName","getVisibility","_fabricObject$_contro","_fabricObject$_contro2","_controlsVisibility","setVisibility","positionHandler","currentControl","calcCornerCoords","objectCornerSize","centerX","centerY","isTouch","touchSizeX","touchSizeY","cornerStyle","rotationStyleHandler","lockRotation","rotationWithSnapping","rotateObjectWithSnapping","ex","ey","theta","pivotPoint","lastAngle","curAngle","snapAngle","snapThreshold","rightAngleLocked","leftAngleLocked","hasRotated","scaleIsProportional","uniformIsToggled","uniScaleKey","uniformScaling","scalingIsForbidden","by","scaleProportionally","lockX","lockY","scaleMap","scaleCursorStyleHandler","n","scaleObject","signX","signY","gestureScale","distance","original","oldScaleX","oldScaleY","scalingEqually","scaleObjectFromCorner","scalingX","scaleObjectX","scalingY","scaleObjectY","AXIS_KEYS","counterAxis","skew","lockSkewing","flip","skewMap","skewCursorStyleHandler","skewHandler","axis","originKey","lockSkewingKey","skewKey","flipKey","counterOriginKey","counterFlipKey","counterOriginFactor","skewingSide","finalHandler","skewingBefore","skewingStart","shearingStart","shearing","skewing","atan","changed","dimBefore","dimAfter","compensationFactor","skewObject","skewHandlerX","skewHandlerY","isAltAction","altActionKey","scaleOrSkewActionName","isAlternative","scaleSkewCursorStyleHandler","scalingXOrSkewingY","scalingYOrSkewingX","createObjectDefaultControls","ml","mr","mb","mt","mtr","withConnection","createResizeControls","createTextboxDefaultControls","InteractiveFabricObject","createControls","targetCanvas","noScaleCache","_currentTransform","action","startsWith","getActiveControl","__corner","oCoords","findControl","forTouch","hasControls","cornerEntries","touchCorner","calcOCoords","rMatrix","positionMatrix","startMatrix","transformOptions","forEachControl","_calcCornerCoords","touchCornerSize","fn","selectionBackgroundColor","_activeObject","wh","strokeBorders","_drawBorders","borderColor","borderDashArray","drawControlsConnectingLines","_renderControls","hasBorders","styleOptions","shouldDrawBorders","shouldDrawControls","borderScaleFactor","isMoving","borderOpacityWhenMoving","drawBorders","forActiveSelection","shouldStroke","cornerDashArray","setControlVisible","setControlsVisibility","clearContextTop","restoreManually","onDeselect","_options","onSelect","shouldStartDragging","_e","onDragStart","canDrop","renderDragSourceEffect","renderDropTargetEffect","applyMixins","derivedCtor","constructors","baseCtor","getOwnPropertyNames","prototype","defineProperty","getOwnPropertyDescriptor","create","lockMovementX","lockMovementY","lockScalingX","lockScalingY","lockSkewingX","lockSkewingY","lockScalingFlip","evented","perPixelTargetFind","activeOn","hoverCursor","moveCursor","isTransparent","tolerance","getImageData","StrokeProjectionsBase","strokeProjectionMagnitude","strokeUniformScalar","createSideVector","projectOrthogonally","applySkew","calcOrthogonalProjection","isSkewed","scaleUnitVector","unitVector","zeroVector","StrokeLineJoinProjections","getOrthogonalRotationFactor","vector1","vector2","C","AC","bisector","orthogonalProjection","correctSide","projectBevel","projections","projectMiter","hypotUnitScalar","miterVector","projectRoundNoSkew","startCircle","endCircle","projectRoundWithSkew","circleRadius","newY","furthestY","newX","furthestX","projectRound","isStraightLine","newOrigin","proj0","proj1","comparisonVector","isProj0Start","projectPoints","project","originPoint","projectedPoint","StrokeLineCapProjections","projectButt","projection","projectSquare","strokePointingOut","projectedA","projectStrokeOnPoints","openPath","reduced","findIndexRight","cloneStyles","newObj","keyInner","escapeXml","string","segmenter","graphemeSplit","textstring","Intl","Segmenter","granularity","segments","segment","graphemeSplitImpl","graphemes","chr","getWholeChar","str","code","charCodeAt","isNaN","charAt","next","prev","firstLetterOnly","hasStyleChanged","prevStyle","thisStyle","forTextSpans","textDecorationThickness","stylesToArray","text","textLines","stylesArray","charIndex","chars","end","stylesFromArray","stylesObject","styleIndex","SHARED_ATTRIBUTES","selectorMatches","selector","nodeName","classNames","getAttribute","azAz","matcher","splitClassNames","elementMatchesRule","selectors","parentMatching","firstMatching","parentElement","doesSomeParentMatch","getGlobalStylesForElement","cssRules","rule","normalizeAttr","attr","_attributesMap","regex","transforms","transformList","reTransformList","reTransform","reTransformAll","parseTransformAttribute","attributeValue","cleanupSvgAttribute","test","matchAll","transformMatch","matchedParams","operation","rawArgs","arg1","arg2","arg3","arg4","arg5","arg","normalizeValue","parentAttributes","parsed","ouputValue","transformMatrix","fillIndex","strokeIndex","parseStyleString","oStyle","chunk","parseStyleAttribute","parseStyleObject","colorAttributesMap","parseAttributes","attributes","parentFontSize","ownAttributes","normalizedStyle","normalizedAttr","normalizedValue","font","parseFontDeclaration","mergedAttrs","colorAttr","setStrokeFillOpacity","RECT_PROPS","Rect","_initRxRy","rx","ry","isRounded","bezierCurveTo","fromElement","restOfparsedAttributes","ATTRIBUTE_NAMES","Boolean","LAYOUT_TYPE_INITIALIZATION","LAYOUT_TYPE_ADDED","LAYOUT_TYPE_REMOVED","LAYOUT_TYPE_IMPERATIVE","getObjectBounds","destinationGroup","currentGroup","objectCenter","accountForStroke","strokeUniformVector","scalingStrokeWidth","sizeVector","LayoutStrategy","calcLayoutResult","shouldPerformLayout","calcBoundingBox","prevStrategy","strategy","shouldLayoutClipPath","getInitialSize","overrides","bboxSize","bboxCenter","actualSize","relativeCorrection","FitContentLayout","LAYOUT_MANAGER","LayoutManager","_subscriptions","performLayout","strictContext","bubbles","_prevLayoutStrategy","onBeforeLayout","layoutResult","getLayoutResult","commitLayout","onAfterLayout","attachHandlers","trigger","subscribe","unsubscribe","_context","delete","unsubscribeTargets","targets","subscribeTargets","tricklingContext","layoutManager","prevCenter","nextCenter","correction","_context$x","_context$y","layoutObjects","layoutObject","bubblingContext","NoopLayoutManager","Group","groupInit","_options$layoutManage","__objectSelectionTracker","__objectSelectionMonitor","__objectSelectionDisposer","enterGroup","canEnterGroup","_filterObjectsBeforeEnteringGroup","allowedObjects","_onAfterObjectsChange","removeParentTransform","exitGroup","_shouldSetNestedCoords","subTargetCheck","removeAll","_activeObjects","selected","activeObjects","_watchObject","watch","_enterGroup","activeObject","_exitGroup","ownCache","preserveObjectStacking","triggerLayout","__serializeObjects","method","_includeDefaultValues","originalDefaults","_createSVGBgRect","fillStroke","commons","svgString","bg","abortable","hydratedOptions","layoutClass","strategyClass","interactive","findScaleToFit","destination","findScaleToCover","commaWsp","reArcCommandPoints","repeatedCommands","M","segmentToBezier","theta1","theta2","cosTh","sinTh","cx1","cy1","mT","fromX","fromY","costh1","sinth1","costh2","sinth2","toX","toY","calcVectorAngle","ux","uy","vx","vy","ta","tb","getBoundsOfCurve","begx","begy","cp1x","cp1y","cp2x","cp2y","endx","endy","argsString","cachesBoundsOfCurve","boundsOfCurveCache","tvalues","bounds","b2ac","sqrtb2ac","t1","t2","jlen","iterator","getPointOnCubicBezierIterator","fromArcToBeziers","fx","fy","rot","large","sweep","tx","ty","segsNorm","arcToSegments","rotateX","root","sinTheta","px","py","rx2","ry2","py2","px2","pl","_rx","_ry","mTheta","dtheta","mDelta","th3","makePathSimpler","x1","y1","destinationPath","previous","controlX","controlY","parsedCommand","converted","calcLineLength","x2","y2","pct","c1","c2","CB2","c3","CB3","c4","CB4","QB1","QB2","QB3","getTangentCubicIterator","p1x","p1y","p2x","p2y","p3x","p3y","p4x","p4y","qb1","qb2","qb3","tangentX","tangentY","getPointOnQuadraticBezierIterator","getTangentQuadraticIterator","invT","pathIterator","tempP","tmpLen","perc","findPercentageForDistance","segInfo","nextLen","nextStep","lastPerc","angleFinder","getPathSegmentsInfo","tempInfo","totalLength","info","basicInfo","command","destX","destY","getPointOnPath","infos","segPercent","rePathCmdAll","regExpArcCommandPoints","reMyNum","commandLengths","parsePath","pathString","_pathString$match","chain","matchStr","commandLetter","commandLength","paramArr","lastIndex","out","newCommand","transformedCommand","getSmoothPathFromPoints","p1","p2","multSignX","multSignY","manyPoints","midPoint","joinPath","pathData","getRandomInt","random","removeTransformMatrixForSvgParsing","preserveAspectRatioOptions","_assignTransformMatrixProps","cropX","cropY","offsetLeft","offsetTop","_newCanvas$getContext","getRegularPolygonPath","numVertexes","radius","interiorAngle","rotationAdjustment","rad","commonAttributes","groupSVGElements","mergeClipPaths","_b$group","removeTransformFromObject","finalTransform","transformPath","pathOffset","pathSegment","newSegment","setStyle","elementStyle","setProperty","CanvasDOMManager","containerClass","upperCanvasEl","createUpperCanvas","upper","applyCanvasStyle","container","createContainerElement","replaceChild","className","removeChild","SelectableCanvas","_this$elements$upper","_this$elements$upper2","wrapperEl","_objectsToRender","deselected","_discardActiveObject","_hoveredTarget","_hoveredTargets","_chooseObjectsToRender","contextTopDirty","_groupSelector","isDrawingMode","renderTopLayer","_isCurrentlyDrawing","freeDrawingBrush","selection","_drawSelection","renderTop","setTargetFindTolerance","targetFindTolerance","pixelFindCanvasEl","pixelFindContext","isTargetTransparent","selectionBgc","enhancedTolerance","_isSelectionKeyPressed","sKey","selectionKey","_shouldClearSelection","getActiveObjects","_shouldCenterTransform","modifierKeyPressed","centerTransform","_getOriginFromCorner","controlName","_setupCurrentTransform","alreadySelected","_control$getActionHan","getScenePoint","getActionFromCorner","altKey","centeredKey","lastX","lastY","shiftKey","setCursor","cursor","deltaX","extent","strokeOffset","selectionLineWidth","minX","minY","maxX","maxY","selectionColor","selectionBorderColor","selectionDashArray","findTarget","_targetInfo","skipTargetFind","subTargets","currentSubTargets","aObjects","targetInfo","searchPossibleTargets","currentContainer","currentTarget","fullTargetInfo","activeObjectTargetInfo","getViewportPoint","altSelectionKey","_pointIsInObjectSelectionArea","viewportZoom","angleRadians","cosP","sinP","cosPSinP","cosPMinusSinP","_checkTarget","isEditing","viewportPoint","_searchPossibleTargets","subTarget","_viewportPoint","_getPointerImpl","_scenePoint","fromViewport","boundsWidth","boundsHeight","cssScale","_resetTransformEventData","_setBrushStyles","willReadFrequently","getTopContext","getSelectionContext","getSelectionElement","active","_fireSelectionEvents","oldObjects","somethingChanged","invalidate","added","setActiveObject","currentActives","_setActiveObject","prevActiveObject","endCurrentTransform","discardActiveObject","discarded","_finalizeCurrentTransform","_scaling","originalProperties","_realizeGroupTransformOnObject","originalValues","selectionFullyContained","defaultCursor","freeDrawingCursor","notAllowedCursor","stopContextMenu","fireRightClick","fireMiddleClick","enablePointerEvents","TextEditingManager","cb","hiddenTextarea","focus","__disposer","exitTextEditing","exitEditing","onMouseMove","_this$target","updateSelectionOnMouseMove","addEventOptions","passive","getEventPoints","scenePoint","addListener","removeListener","syntheticEventConfig","mouse","in","targetIn","targetOut","canvasIn","canvasOut","drag","Canvas","eventHandler","addOrRemove","_getEventPrefix","functor","_eventjsFunctor","canvasElement","eventTypePrefix","_onResize","_onMouseDown","_onMouseMove","_onMouseOut","_onMouseEnter","_onMouseWheel","_onContextMenu","_onClick","_onDragStart","_onDragEnd","_onDragOver","_onDragEnter","_onDragLeave","_onDrop","_onTouchStart","removeListeners","_onMouseUp","_onTouchEnd","clearTimeout","_willAddMouseDown","_cacheTransformEventData","_handleEvent","shared","nestedTarget","_isClick","_dragSource","_onDragProgress","_renderDragEffects","dropTarget","_dropTarget","didDrop","dataTransfer","dropEffect","dragSource","_draggedoverTarget","eventType","_fireEnterLeaveEvents","_basicEventHandler","clicks","detail","getPointerId","evt","identifier","pointerId","_isMainEvent","isPrimary","touches","mainTouchId","shouldPreventScrolling","currentActiveObject","__onMouseDown","__onMouseUp","__onMouseMove","_shouldRender","_this$_activeObject","isClick","button","_onMouseUpInDrawingMode","shouldRender","targetWasActive","handleSelection","found","originalControl","originalMouseUpHandler","_setCursorFromEvent","extraData","_onMouseDownInDrawingMode","onMouseDown","_onMouseMoveInDrawingMode","onMouseUp","grouped","handleMultiSelection","groupSelector","_transformObject","_fireOverOutEvents","textEditingManager","fireSyntheticInOutEvents","oldTarget","fireCanvas","draggedoverTarget","targetChanged","outOpt","nextTarget","inOpt","previousTarget","localPointer","_performTransformAction","activeSelection","reverse","_target","isAS","prevActiveObjects","multiSelectAdd","newActiveSelection","point1","point2","collectedObjects","klass","linearDefaultCoords","radialDefaultCoords","ifNaN","valueIfNaN","RE_PERCENT","isPercent","parsePercent","NaN","RE_KEY_VALUE_PAIRS","RE_KEY_VALUE","parseColorStop","opacityMultiplier","keyValuePairs","parseColorStops","opacityAttr","colorStops","colorStopEls","getElementsByTagName","parseType","parseGradientUnits","getValue","parseCoords","valuesToConvert","finalValue","propValue","convertPercentUnitsToValues","parseLinearCoords","parseRadialCoords","Gradient","addColorStop","colorStop","preTransform","sort","_renderPathCommands","needsSwap","minRadius","percentageShift","gradient","createLinearGradient","createRadialGradient","svgOptions","viewBoxWidth","viewBoxHeight","Pattern","isImageSource","isCanvasSource","sourceToString","complete","naturalWidth","naturalHeight","patternSource","patternOffsetX","patternOffsetY","BaseBrush","_saveAndTransform","needsFullRender","_resetShadow","_isOutSideCanvas","Path","_setPath","adjustPosition","setBoundingBox","_calcBoundsFromPath","quadraticCurveTo","pathCmd","sourcePath","_getOffsetTransform","digits","_calcDimensions","subpathStartX","subpathStartY","parsedAttributes","PencilBrush","_points","_hasStraightLine","drawSegment","drawStraightLine","straightLineKey","_prepareForDrawing","_addPoint","limitedToCanvasSize","oldEnd","_finalizeAndAddPath","_reset","convertPointsToSVGPath","createPath","decimatePoints","cDistance","lastPoint","adjustedDistance","newPoints","decimate","isEmptySVGPath","CIRCLE_PROPS","Circle","setRadius","startAngle","endAngle","getRadiusX","getRadiusY","startX","startY","endX","endY","otherParsedAttributes","coordProps","Line","_setWidthHeight","calcLinePoints","origStrokeStyle","_this$stroke","_x1","_x2","_y1","_y2","xMult","yMult","Triangle","widthBy2","heightBy2","ELLIPSE_PROPS","Ellipse","getRx","getRy","polylineDefaultValues","exactBoundingBox","Polyline","initialized","isOpen","_projectStrokeOnPoints","strokeDiff","bboxNoStroke","layoutProperties","_options$width","_options$height","_options$width2","_options$height2","output","diffX","diffY","pointsSplit","parsedPoints","parsePointsAttribute","Polygon","StyledText","isEmptyStyles","lineIndex","line","p3","styleHas","cleanStyle","letterCount","stylePropertyValue","stylesCount","allStyleObjectPropertiesMatch","graphemeCount","styleObject","_textLines","removeStyle","lineNum","charNum","_extendStyles","get2DCursorLocation","_getLineStyle","_setLineStyle","newStyle","_getStyleDeclaration","_setStyleDeclaration","getSelectionStyles","startIndex","endIndex","getStyleAtPosition","getCompleteStyleDeclaration","setSelectionStyles","_forceClearCache","_lineStyle$charIndex","lineStyle","_styleProperties","_deleteStyleDeclaration","_deleteLineStyle","multipleSpacesRegex","dblQuoteRegex","createSVGInlineRect","svgColor","createSVGRect","measuringContext","FabricText","setPathInfo","initDimensions","segmentsInfo","_splitText","newLines","_splitTextIntoLines","lines","graphemeLines","_unwrappedTextLines","_unwrappedLines","_text","graphemeText","_clearCache","calcTextWidth","cursorWidth","calcTextHeight","enlargeSpaces","diffSpace","currentLineWidth","numberOfSpaces","accumulatedSpace","charBound","spaces","isEndOfWrapping","getLineWidth","__charBounds","kernedWidth","missingNewlineOffset","_lineIndex","selectionStart","skipWrapping","_setTextStyles","_renderTextLinesBackground","_renderTextDecoration","_renderTextStroke","_renderTextFill","charStyle","forMeasuring","textBaseline","_getFontDeclaration","maxWidth","_renderTextLine","_renderChars","leftOffset","_getLeftOffset","lineTopOffset","_getTopOffset","heightOfLine","getHeightOfLine","lineLeftOffset","_getLineLeftOffset","drawStart","currentColor","boxWidth","boxStart","lastColor","getValueOfPropertyAt","charBox","renderLeft","_measureChar","_char","previousChar","prevCharStyle","fontDeclaration","couple","stylesAreEqual","fontMultiplier","coupleWidth","previousWidth","getMeasuringContext","measureText","getHeightOfChar","measureLine","lineInfo","_measureLine","_getWidthOfCharSpacing","prevGrapheme","graphemeInfo","llength","lineBounds","grapheme","_getGraphemeBox","positionInPath","totalPathLength","_setGraphemeOnPath","numOfSpaces","centerPosition","skipLeft","previousBox","__lineHeights","maxHeight","_renderTextCommon","lineHeights","isJustify","shortCut","isLtr","currentDirection","actualStyle","nextStyle","timeToRender","drawingLeft","charsToRender","_renderChar","_applyPatternGradientTransformText","handleFiller","fullDecl","shouldFill","fillOffsets","fillText","strokeOffsets","strokeText","setSuperscript","_setScript","setSubscript","schema","loc","lineDiff","__lineWidths","_charStyle$property","topOffset","offsetAligner","lastDecoration","lastFill","lastTickness","currentDecoration","currentFill","currentTickness","currentSize","currentDy","finalTickness","parsedFontFamily","genericFonts","newLine","newText","needsDims","isAddingPath","textAnchor","textDecoration","restOfOptions","textContent","textHeightScaleFactor","scaledDiff","textHeight","offX","_getSVGLeftTopOffsets","textAndBg","_getSVGTextAndBg","textTop","textLeft","_wrapSVGTextAndBg","textSvg","lineTop","textBgRects","textSpans","getSvgTextDecoration","textTopOffset","textLeftOffset","lineOffset","_setSVGTextLineBg","_setSVGTextLineText","_createTextCharSpan","char","styleDecl","numFractionDigit","styleProps","getSvgSpanStyles","fillStyles","dySpan","angleAttr","wBy2","renderPoint","useWhiteSpace","thickness","decoration","DraggableTextDelegate","dragEnterHandler","dragOverHandler","dragLeaveHandler","dragEndHandler","dropHandler","_dispose","isPointerOverSelection","newSelection","getSelectionStartFromPointer","selectionEnd","__mouseDownInPlace","isActive","__dragStartFired","setCursorByClick","initDelayedCursor","__isDraggingOver","getDragStartSelection","__dragStartSelection","setDragImage","_e$dataTransfer","flipFactor","boundaries","_getCursorBoundaries","diff","bgc","dragImage","border","__dragImageDisposer","appendChild","setData","stringify","effectAllowed","abortCursorAnimation","editable","defaultPrevented","dragStartSelection","targetCanDrop","ev","_e$dataTransfer2","insert","getData","trailing","selectionStartOffset","removeChars","trimEnd","insertChars","enterEditing","_updateTextarea","_e$dataTransfer3","reNonWord","ITextBehavior","initBehavior","_tick","_onTickComplete","_animateCursor","toValue","_currentCursorOpacity","renderCursorOrSelection","_currentTickState","cursorDuration","_this$_currentTickCom","_currentTickCompleteState","restart","cursorDelay","shouldClear","cursorAnimation","restartCursorIfNeeded","selectAll","_fireSelectionChanged","cmdAll","getSelectedText","findWordBoundaryLeft","startFrom","_reSpace","findWordBoundaryRight","findLineBoundaryLeft","findLineBoundaryRight","searchWordBoundary","selectWord","newSelectionStart","newSelectionEnd","selectLine","enterEditingImpl","initHiddenTextarea","_saveEditingProps","_setEditingProps","_textBeforeEdit","activeElement","currentStart","currentEnd","__selectionStartOnMouseDown","editingBorderColor","fromStringToGraphemeSelection","smallerTextStart","graphemeStart","smallerTextEnd","fromGraphemeToStringSelection","cursorOffsetCache","inCompositionMode","updateTextareaPosition","updateFromTextArea","textarea","_calcTextareaPosition","desiredPosition","compositionStart","cursorLocation","charHeight","upperCanvas","upperCanvasWidth","upperCanvasHeight","clientWidth","clientHeight","_savedProps","_restoreEditingProps","exitEditingImpl","isTextChanged","_removeExtraneousStyles","removeStyleFromTo","lineStart","charStart","lineEnd","charEnd","styleObj","shiftLineStyles","numericChar","clonedStyles","numericLine","insertNewlineStyleObject","qty","copiedStyle","newLineStyles","originalLineLength","isEndOfLine","someStyleIsCarryingOver","currentCharStyle","numIndex","styleCarriedOver","insertCharStyleObject","quantity","currentLineStyles","currentLineStylesCloned","numericIndex","insertNewStyleBlock","insertedText","cursorLoc","addedLines","linesLength","setSelectionStartEndWithShift","_selectionDirection","ITextKeyBehavior","autocapitalize","autocorrect","autocomplete","spellcheck","wrap","hiddenTextareaContainer","keydown","keyup","input","copy","cut","paste","compositionstart","compositionupdate","compositionend","onKeyDown","keyMap","keysMapRtl","keysMap","keyCode","ctrlKeysMapDown","ctrlKey","metaKey","stopImmediatePropagation","onKeyUp","_copyDone","ctrlKeysMapUp","onInput","fromPaste","updateAndFire","nextText","charCount","nextCharCount","_selectionStart","_selectionEnd","removedText","removeFrom","removeTo","charDiff","textareaSelection","backDelete","copiedText","disableStyleCopyPaste","copiedTextStyle","onCompositionStart","onCompositionEnd","onCompositionUpdate","compositionEnd","_getWidthBeforeCursor","bound","widthBeforeCursor","getDownCursorOffset","isRight","selectionProp","_getSelectionForOffset","indexOnOtherLine","_getIndexOnLine","getUpCursorOffset","textBeforeCursor","charWidth","foundMatch","widthOfCharsOnLine","indexOnLine","leftEdge","rightEdge","offsetFromLeftEdge","moveCursorDown","_moveCursorUpOrDown","moveCursorUp","moveCursorWithShift","moveCursorWithoutShift","moveCursorLeft","_moveCursorLeftOrRight","_move","newValue","_moveLeft","_moveRight","moveCursorLeftWithoutShift","change","moveCursorLeftWithShift","moveCursorRight","moveCursorRightWithShift","moveCursorRightWithoutShift","notALeftClick","ITextClickBehavior","_mouseDownHandler","doubleClickHandler","tripleClickHandler","draggableTextDelegate","didDrag","mouseOffset","charLength","widthAfter","MOVE_CURSOR_UP","MOVE_CURSOR_DOWN","MOVE_CURSOR_LEFT","MOVE_CURSOR_RIGHT","EXIT_EDITING","applyCanvasTransform","iTextDefaultValues","cursorColor","caching","IText","setSelectionStart","_updateAndFire","setSelectionEnd","findAncestorsWithClipPath","hasAncestorsWithClipping","drawingCanvas","drawingCtx","renderSelection","renderCursor","clippingCanvas","clippingCtx","clipPathAncestors","skipCaching","_getCursorBoundariesOffsets","__getCursorBoundariesOffsets","renderCursorAt","_renderCursor","getCursorRenderingData","_renderSelection","dragSelection","startLine","endLine","startChar","endChar","realLineHeight","boxEnd","drawHeight","extraTop","drawWidth","compositionColor","getCurrentCharFontSize","cp","_getCurrentCharIndex","getCurrentCharColor","cursorPosition","Textbox","dynamicMinWidth","_styleMap","_generateStyleMap","textInfo","realLineCount","realLineCharCount","splitByGrapheme","isWrapping","nextOffset","nextLineIndex","shouldLimit","mapNextLine","p2Number","_wrapText","desiredWidth","getGraphemeDataForRender","wrapped","wordsData","_wrapLine","infix","largestWordWidth","wordsOrGraphemes","wordSplit","word","graphemeArray","_measureWord","charOffset","_wordJoiners","reservedSpace","additionalSpace","infixWidth","lineJustStarted","wordWidth","getMinWidth","minWidth","linesToKeep","propNumber","ClipPathLayout","clipPathCenter","FixedLayout","ActiveSelectionLayoutManager","parents","Set","selectedObjects","ActiveSelection","multiSelectionStacking","findIndex","groups","childrenOverride","Canvas2dFilterBackend","applyFilters","filters","sourceElement","sourceWidth","sourceHeight","desynchronized","pipelineState","imageData","originalEl","originalImageData","filterBackend","applyTo","imageDataPostFilter","putImageData","WebGLFilterBackend","tileSize","Float32Array","setupGLContext","captureGPUInfo","createWebGLCanvas","premultipliedAlpha","depth","stencil","antialias","clearColor","cachedTexture","getCachedTexture","destinationWidth","destinationHeight","sourceTexture","createTexture","targetTexture","originalTexture","passes","webgl","aPosition","programCache","pass","tempFbo","createFramebuffer","bindFramebuffer","FRAMEBUFFER","dWidth","dHeight","resizeCanvasIfNeeded","copyGLTo2D","bindTexture","TEXTURE_2D","deleteTexture","deleteFramebuffer","clearWebGLCaches","textureCache","textureImageSource","NEAREST","RGBA","UNSIGNED_BYTE","CLAMP_TO_EDGE","TEXTURE_MAG_FILTER","TEXTURE_MIN_FILTER","TEXTURE_WRAP_S","TEXTURE_WRAP_T","texture","texParameteri","texImage2D","uniqueId","evictCachesForKey","glCanvas","sourceY","copyGLTo2DPutImageData","numBytes","u8","Uint8Array","imageBuffer","u8Clamped","Uint8ClampedArray","readPixels","imgData","ImageData","gpuInfo","renderer","vendor","ext","UNMASKED_RENDERER_WEBGL","UNMASKED_VENDOR_WEBGL","initFilterBackend","enableGLFiltering","getFilterBackend","IMAGE_PROPS","FabricImage","setElement","_element","removeTexture","_originalElement","resizeFilter","applyResizeFilters","backend","elementKey","getCrossOrigin","getOriginalSize","_stroke","filterObj","getSrc","hasCrop","imageMarkup","strokeSvg","imageRendering","imageSmoothing","getSvgSrc","origFill","filtered","srcFromAttribute","setSrc","minimumScale","minimumScaleTrigger","elementToFilter","_filteredEl","_filterScalingX","_filterScalingY","_lastScaleX","_lastScaleY","isNeutralState","imgElement","_needsResize","elementToDraw","elWidth","elHeight","sX","sY","sW","sH","maxDestW","maxDestH","_resetWidthHeight","pAR","preserveAspectRatio","pWidth","pHeight","rWidth","rHeight","f","rf","hydratedProps","fromURL","imageOptions","applyViewboxTransform","viewBoxAttr","widthAttr","heightAttr","missingViewBox","missingDimAttr","translateMatrix","widthDiff","heightDiff","parsedDim","pasedViewBox","createElementNS","firstChild","getTagName","node","tagName","svgInvalidAncestorsRegEx","getMultipleNodes","nodeNames","nodeList","nodeArray","getElementsByTagNameNS","gradientsAttrs","xlinkAttr","recursivelyParseGradientsXlink","_gradient$getAttribut","xLink","referencedGradient","children","referenceClone","cloneNode","tagArray","findTag","ElementsParser","clipPaths","regexUrl","gradientDefs","elList","getGradientDefs","allRules","styleContents","ruleObj","propertyValuePairs","pair","_rule","getCSSRules","createObject","resolveGradient","resolveClipPath","extractPropertyDefinition","storage","gradientDef","usingElement","exactOwner","clipPathElements","objTransformInv","clipPathTag","clipPathOwner","clipPathElement","enlivedClippath","clipRule","gTransform","isValidSvgTag","async","parseSVGDocument","createEmptyResponse","allElements","nodelist","skipAttributes","useElement","useAttributes","useAttrMap","xlink","href","referencedElement","clonedOriginal","originalAttributes","originalAttrMap","currentTrans","el3","setAttributeNS","childNodes","styleRecord","mergedStyles","entry","parseUseDirectives","descendants","hasInvalidAncestor","localClipPaths","elementParser","loadSVGFromString","parseFromString","ACTION_NAME","createPolyPositionHandler","pointIndex","polyObject","polyActionHandler","poly","mouseLocalPosition","factoryPolyActionHandler","anchorPoint","anchorPointInParentPlane","createPolyActionHandler","calcPathPointPosition","pathObject","commandIndex","pathPositionHandler","pathActionHandler","movePathPoint","anchorCommand","PathPointControl","controlFill","controlStroke","PathControlPointControl","connectToCommandIndex","connectToPointIndex","connectionDashArray","commandType","createControl","commandIndexPos","pointIndexPos","isControlPoint","controlPointStyle","pointStyle","previousCommandType","indexFromPrevCommand","isWebGLPipelineState","highPsourceCode","identityFragmentShader","BaseFilter","getFragmentSource","getVertexSource","createProgram","vertexSource","vertexShader","VERTEX_SHADER","program","getShaderInfoLog","attachShader","linkProgram","getProgramParameter","LINK_STATUS","getProgramInfoLog","uniformLocations","getUniformLocations","uStepW","getUniformLocation","uStepH","attributeLocations","getAttributeLocations","getAttribLocation","locations","sendAttributeData","aPositionData","attributeLocation","buffer","createBuffer","bindBuffer","ARRAY_BUFFER","enableVertexAttribArray","vertexAttribPointer","FLOAT","bufferData","STATIC_DRAW","_setupFrameBuffer","framebufferTexture2D","COLOR_ATTACHMENT0","finish","_swapTextures","temp","applyToWebGL","applyTo2d","getCacheKey","retrieveShader","shader","useProgram","uniform1f","sendUniformData","viewport","drawArrays","TRIANGLE_STRIP","bindAdditionalTexture","textureUnit","activeTexture","TEXTURE0","unbindAdditionalTexture","_gl","_uniformLocations","createHelpLayer","helpLayer","defaultKeys","filterOptions","blendColorFragmentSource","screen","difference","lighten","darken","exclusion","tint","BlendColor","mode","tg","alpha1","oR","oG","oB","uniform4fv","uColor","mask","BlendImage","image","TEXTURE1","calculateMatrix","resources","blendImage","canvas1","blendData","uniform1i","uImage","uniformMatrix3fv","uTransformMatrix","enlivedImage","Blur","aspectRatio","horizontal","blurValue","getBlurValue","samples","bytesInRow","totalA","minIRow","maxIRow","percent","weight","sampledPixel","localAlpha","delta","chooseRightDelta","uniform2fv","uDelta","blurScale","Brightness","brightness","uBrightness","colorMatrixDefaultValues","colorsOnly","ColorMatrix","constants","uniformMatrix4fv","uColorMatrix","uConstants","createColorMatrixFilter","_Class","newClass","Brownie","Vintage","Kodachrome","Technicolor","Polaroid","Sepia","BlackWhite","Composed","subFilters","enlivedFilters","Contrast","contrast","contrastF","uContrast","Convolute_3_1","Convolute_3_0","Convolute_5_1","Convolute_5_0","Convolute_7_1","Convolute_7_0","Convolute_9_1","Convolute_9_0","Convolute","opaque","weights","side","halfSide","sw","sh","createImageData","dst","alphaFac","dstOff","scx","scy","srcOff","wt","uniform1fv","uMatrix","GAMMA","Gamma","gamma","rInv","gInv","bInv","rgbValues","rgb","uniform3fv","uGamma","lightness","luminosity","Grayscale","uMode","hueRotationDefaultValues","rotation","HueRotation","cosine","sine","aThird","aThirdSqtSin","OneMinusCos","Invert","invert","uInvert","uAlpha","Noise","noise","rand","uNoise","uSeed","Pixelate","blocksize","_i","_j","uBlocksize","RemoveColor","lowC","highC","uLow","uHigh","useAlpha","Resize","uTaps","taps","getFilterWindow","tempScale","lanczosLobes","filterWindow","generateShader","getTaps","lobeFunction","lanczosCreate","applyToForWebgl","dW","dH","lobes","xx","rcpScaleX","rcpScaleY","oW","oH","newData","resizeType","sliceByTwo","hermiteFastResize","bilinearFiltering","lanczosResize","mult","doneW","doneH","stepW","stepH","dX","dY","tmpCanvas","srcData","destImg","destData","lanczos","ratioX","ratioY","rcpRatioX","rcpRatioY","range2X","range2Y","cacheLanc","icenter","process","u","fX","fY","xDiff","yDiff","chnl","origPix","w4","pixels","destImage","destPixels","ratioW","ratioH","ratioWHalf","ratioHHalf","img2","data2","weightsAlpha","gxR","gxG","gxB","gxA","yy","w0","Saturation","adjust","saturation","uSaturation","Vibrance","vibrance","amt","uVibrance","drawDot","addPoint","dot","originalRenderOnAddRemove","circles","circle","pointerPoint","getPatternSrc","patternCanvas","patternCtx","dotWidth","getPattern","pattern","topLeft","sprayChunks","sprayChunk","addSprayChunk","renderChunck","rects","chunck","rect","optimizeOverlapping","uniqueRects","uniqueRectsArray","getUniqueRects","sprayChunck","density","dotWidthVariance","randomOpacity","isPutImageFaster","testContext","ArrayBuffer","testPipelineState","performance","now","drawImageTime","fetch","response","ok","svgText"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"index.min.js","sources":["../src/config.ts","../src/util/internals/console.ts","../src/filters/GLProbes/GLProbe.ts","../src/filters/GLProbes/WebGLProbe.ts","../src/env/browser.ts","../src/env/index.ts","../src/cache.ts","../src/constants.ts","../src/ClassRegistry.ts","../src/util/animation/AnimationRegistry.ts","../src/Observable.ts","../src/util/internals/removeFromArray.ts","../src/util/misc/cos.ts","../src/util/misc/sin.ts","../src/Point.ts","../src/Collection.ts","../src/CommonMethods.ts","../src/util/animation/AnimationFrameProvider.ts","../src/util/internals/uid.ts","../src/util/misc/dom.ts","../src/util/misc/radiansDegreesConversion.ts","../src/util/misc/matrix.ts","../src/util/misc/objectEnlive.ts","../src/util/misc/pick.ts","../src/util/misc/toFixed.ts","../src/util/misc/svgExport.ts","../src/util/typeAssertions.ts","../src/util/dom_misc.ts","../src/canvas/DOMManagers/util.ts","../src/canvas/DOMManagers/StaticCanvasDOMManager.ts","../src/canvas/StaticCanvasOptions.ts","../src/canvas/StaticCanvas.ts","../src/util/dom_event.ts","../src/util/misc/boundingBoxFromPoints.ts","../src/util/misc/objectTransforms.ts","../src/util/misc/planeChange.ts","../src/controls/fireEvent.ts","../src/util/misc/resolveOrigin.ts","../src/util/misc/vectors.ts","../src/controls/util.ts","../src/controls/drag.ts","../src/color/color_map.ts","../src/color/util.ts","../src/color/Color.ts","../src/color/constants.ts","../src/util/misc/svgParsing.ts","../src/shapes/Object/FabricObjectSVGExportMixin.ts","../src/parser/getSvgRegex.ts","../src/shapes/Text/constants.ts","../src/parser/constants.ts","../src/Shadow.ts","../src/util/misc/capValue.ts","../src/shapes/Object/defaultValues.ts","../src/util/animation/easing.ts","../src/util/animation/AnimationBase.ts","../src/util/animation/ValueAnimation.ts","../src/util/animation/ArrayAnimation.ts","../src/util/animation/ColorAnimation.ts","../src/util/animation/animate.ts","../src/Intersection.ts","../src/shapes/Object/ObjectGeometry.ts","../src/shapes/Object/Object.ts","../src/controls/wrapWithFireEvent.ts","../src/controls/wrapWithFixedAnchor.ts","../src/controls/changeWidth.ts","../src/controls/controlRendering.ts","../src/controls/Control.ts","../src/controls/rotate.ts","../src/controls/scale.ts","../src/controls/skew.ts","../src/controls/scaleSkew.ts","../src/controls/commonControls.ts","../src/shapes/Object/InteractiveObject.ts","../src/util/applyMixins.ts","../src/shapes/Object/FabricObject.ts","../src/util/misc/isTransparent.ts","../src/util/misc/projectStroke/StrokeProjectionsBase.ts","../src/util/misc/projectStroke/StrokeLineJoinProjections.ts","../src/util/misc/projectStroke/StrokeLineCapProjections.ts","../src/util/misc/projectStroke/index.ts","../src/util/internals/findRight.ts","../src/util/internals/cloneStyles.ts","../src/util/lang_string.ts","../src/util/misc/textStyles.ts","../src/parser/attributes.ts","../src/parser/selectorMatches.ts","../src/parser/elementMatchesRule.ts","../src/parser/doesSomeParentMatch.ts","../src/parser/getGlobalStylesForElement.ts","../src/parser/normalizeAttr.ts","../src/util/internals/cleanupSvgAttribute.ts","../src/parser/parseTransformAttribute.ts","../src/parser/normalizeValue.ts","../src/parser/parseStyleString.ts","../src/parser/parseStyleAttribute.ts","../src/parser/parseStyleObject.ts","../src/parser/setStrokeFillOpacity.ts","../src/parser/parseAttributes.ts","../src/parser/parseFontDeclaration.ts","../src/shapes/Rect.ts","../src/LayoutManager/constants.ts","../src/LayoutManager/LayoutStrategies/utils.ts","../src/LayoutManager/LayoutStrategies/LayoutStrategy.ts","../src/LayoutManager/LayoutStrategies/FitContentLayout.ts","../src/LayoutManager/LayoutManager.ts","../src/shapes/Group.ts","../src/util/misc/groupSVGElements.ts","../src/util/misc/findScaleTo.ts","../src/util/path/regex.ts","../src/util/path/index.ts","../src/util/internals/getRandomInt.ts","../src/util/transform_matrix_removal.ts","../src/util/misc/mergeClipPaths.ts","../src/util/internals/dom_style.ts","../src/canvas/DOMManagers/CanvasDOMManager.ts","../src/canvas/SelectableCanvas.ts","../src/canvas/CanvasOptions.ts","../src/canvas/TextEditingManager.ts","../src/canvas/Canvas.ts","../src/gradient/constants.ts","../src/util/internals/ifNaN.ts","../src/parser/percent.ts","../src/gradient/parser/parseColorStops.ts","../src/gradient/parser/misc.ts","../src/gradient/parser/parseCoords.ts","../src/gradient/Gradient.ts","../src/Pattern/Pattern.ts","../src/brushes/BaseBrush.ts","../src/shapes/Path.ts","../src/brushes/PencilBrush.ts","../src/shapes/Circle.ts","../src/shapes/Line.ts","../src/shapes/Triangle.ts","../src/shapes/Ellipse.ts","../src/shapes/Polyline.ts","../src/parser/parsePointsAttribute.ts","../src/shapes/Polygon.ts","../src/shapes/Text/StyledText.ts","../src/shapes/Text/TextSVGExportMixin.ts","../src/shapes/Text/Text.ts","../src/shapes/IText/DraggableTextDelegate.ts","../src/shapes/IText/ITextBehavior.ts","../src/shapes/IText/ITextKeyBehavior.ts","../src/shapes/IText/ITextClickBehavior.ts","../src/shapes/IText/constants.ts","../src/util/internals/applyCanvasTransform.ts","../src/shapes/IText/IText.ts","../src/shapes/Textbox.ts","../src/LayoutManager/LayoutStrategies/ClipPathLayout.ts","../src/LayoutManager/LayoutStrategies/FixedLayout.ts","../src/LayoutManager/ActiveSelectionLayoutManager.ts","../src/shapes/ActiveSelection.ts","../src/filters/Canvas2dFilterBackend.ts","../src/filters/WebGLFilterBackend.ts","../src/filters/FilterBackend.ts","../src/shapes/Image.ts","../src/parser/applyViewboxTransform.ts","../src/parser/getTagName.ts","../src/parser/hasInvalidAncestor.ts","../src/parser/getMultipleNodes.ts","../src/parser/recursivelyParseGradientsXlink.ts","../src/parser/getGradientDefs.ts","../src/parser/elements_parser.ts","../src/parser/getCSSRules.ts","../src/parser/parseSVGDocument.ts","../src/parser/parseUseDirectives.ts","../src/parser/loadSVGFromString.ts","../src/controls/polyControl.ts","../src/controls/pathControl.ts","../src/filters/utils.ts","../src/filters/shaders/baseFilter.ts","../src/filters/BaseFilter.ts","../src/filters/shaders/blendColor.ts","../src/filters/BlendColor.ts","../src/filters/shaders/blendImage.ts","../src/filters/BlendImage.ts","../src/filters/Blur.ts","../src/filters/shaders/blur.ts","../src/filters/Brightness.ts","../src/filters/shaders/brightness.ts","../src/filters/shaders/colorMatrix.ts","../src/filters/ColorMatrix.ts","../src/filters/ColorMatrixFilters.ts","../src/filters/Composed.ts","../src/filters/Contrast.ts","../src/filters/shaders/constrast.ts","../src/filters/shaders/convolute.ts","../src/filters/Convolute.ts","../src/filters/shaders/gamma.ts","../src/filters/Gamma.ts","../src/filters/shaders/grayscale.ts","../src/filters/Grayscale.ts","../src/filters/HueRotation.ts","../src/filters/Invert.ts","../src/filters/shaders/invert.ts","../src/filters/Noise.ts","../src/filters/shaders/noise.ts","../src/filters/Pixelate.ts","../src/filters/shaders/pixelate.ts","../src/filters/RemoveColor.ts","../src/filters/shaders/removeColor.ts","../src/filters/Resize.ts","../src/filters/Saturation.ts","../src/filters/shaders/saturation.ts","../src/filters/Vibrance.ts","../src/filters/shaders/vibrance.ts","../src/brushes/CircleBrush.ts","../src/brushes/PatternBrush.ts","../src/brushes/SprayBrush.ts","../src/parser/loadSVGFromURL.ts"],"sourcesContent":["export type TConfiguration = Partial;\n\nclass BaseConfiguration {\n /**\n * Browser-specific constant to adjust CanvasRenderingContext2D.shadowBlur value,\n * which is unitless and not rendered equally across browsers.\n *\n * Values that work quite well (as of October 2017) are:\n * - Chrome: 1.5\n * - Edge: 1.75\n * - Firefox: 0.9\n * - Safari: 0.95\n *\n * @since 2.0.0\n * @type Number\n * @default 1\n */\n browserShadowBlurConstant = 1;\n\n /**\n * Pixel per Inch as a default value set to 96. Can be changed for more realistic conversion.\n */\n DPI = 96;\n\n /**\n * Device Pixel Ratio\n * @see https://developer.apple.com/library/safari/documentation/AudioVideo/Conceptual/HTML-canvas-guide/SettingUptheCanvas/SettingUptheCanvas.html\n */\n devicePixelRatio =\n typeof window !== 'undefined' ? window.devicePixelRatio : 1; // eslint-disable-line no-restricted-globals\n\n /**\n * Pixel limit for cache canvases. 1Mpx , 4Mpx should be fine.\n * @since 1.7.14\n * @type Number\n */\n perfLimitSizeTotal = 2097152;\n\n /**\n * Pixel limit for cache canvases width or height. IE fixes the maximum at 5000\n * @since 1.7.14\n * @type Number\n */\n maxCacheSideLimit = 4096;\n\n /**\n * Lowest pixel limit for cache canvases, set at 256PX\n * @since 1.7.14\n * @type Number\n */\n minCacheSideLimit = 256;\n\n /**\n * When 'true', style information is not retained when copy/pasting text, making\n * pasted text use destination style.\n * Defaults to 'false'.\n * @type Boolean\n * @deprecated\n */\n disableStyleCopyPaste = false;\n\n /**\n * Enable webgl for filtering picture is available\n * A filtering backend will be initialized, this will both take memory and\n * time since a default 2048x2048 canvas will be created for the gl context\n * @since 2.0.0\n * @type Boolean\n */\n enableGLFiltering = true;\n\n /**\n * if webgl is enabled and available, textureSize will determine the size\n * of the canvas backend\n *\n * In order to support old hardware set to `2048` to avoid OOM\n *\n * @since 2.0.0\n * @type Number\n */\n textureSize = 4096;\n\n /**\n * Skip performance testing of setupGLContext and force the use of putImageData that seems to be the one that works best on\n * Chrome + old hardware. if your users are experiencing empty images after filtering you may try to force this to true\n * this has to be set before instantiating the filtering backend ( before filtering the first image )\n * @type Boolean\n * @default false\n */\n forceGLPutImageData = false;\n\n /**\n * If disabled boundsOfCurveCache is not used. For apps that make heavy usage of pencil drawing probably disabling it is better\n * With the standard behaviour of fabric to translate all curves in absolute commands and by not subtracting the starting point from\n * the curve is very hard to hit any cache.\n * Enable only if you know why it could be useful.\n * Candidate for removal/simplification\n * @default false\n */\n cachesBoundsOfCurve = false;\n\n /**\n * Map of font files\n * Map of font files\n */\n fontPaths: Record = {};\n\n /**\n * Defines the number of fraction digits to use when serializing object values.\n * Used in exporting methods (`toObject`, `toJSON`, `toSVG`)\n * You can use it to increase/decrease precision of such values like left, top, scaleX, scaleY, etc.\n */\n NUM_FRACTION_DIGITS = 4;\n}\n\nexport class Configuration extends BaseConfiguration {\n constructor(config?: TConfiguration) {\n super();\n this.configure(config);\n }\n\n configure(config: TConfiguration = {}) {\n Object.assign(this, config);\n }\n\n /**\n * Map of font files\n */\n addFonts(\n paths: Record = {},\n ) {\n this.fontPaths = {\n ...this.fontPaths,\n ...paths,\n };\n }\n\n removeFonts(fontFamilys: string[] = []) {\n fontFamilys.forEach((fontFamily) => {\n delete this.fontPaths[fontFamily];\n });\n }\n\n clearFonts() {\n this.fontPaths = {};\n }\n\n restoreDefaults(keys?: (keyof T)[]) {\n const defaults = new BaseConfiguration() as T;\n const config =\n keys?.reduce((acc, key) => {\n acc[key] = defaults[key];\n return acc;\n }, {} as T) || defaults;\n this.configure(config);\n }\n}\n\nexport const config = new Configuration();\n","export const log = (\n severity: 'log' | 'warn' | 'error',\n ...optionalParams: any[]\n) =>\n // eslint-disable-next-line no-restricted-syntax\n console[severity]('fabric', ...optionalParams);\n\nexport class FabricError extends Error {\n constructor(message?: string, options?: ErrorOptions) {\n super(`fabric: ${message}`, options);\n }\n}\n\nexport class SignalAbortedError extends FabricError {\n constructor(context: string) {\n super(`${context} 'options.signal' is in 'aborted' state`);\n }\n}\n","export type GLPrecision = 'lowp' | 'mediump' | 'highp';\n\nexport abstract class GLProbe {\n declare GLPrecision: GLPrecision | undefined;\n abstract queryWebGL(canvas: HTMLCanvasElement): void;\n abstract isSupported(textureSize: number): boolean;\n}\n","import { log } from '../../util/internals/console';\nimport { GLProbe } from './GLProbe';\nimport type { GLPrecision } from './GLProbe';\n\n/**\n * Lazy initialize WebGL constants\n */\nexport class WebGLProbe extends GLProbe {\n declare maxTextureSize?: number;\n\n /**\n * Tests if webgl supports certain precision\n * @param {WebGL} Canvas WebGL context to test on\n * @param {GLPrecision} Precision to test can be any of following\n * @returns {Boolean} Whether the user's browser WebGL supports given precision.\n */\n private testPrecision(\n gl: WebGLRenderingContext,\n precision: GLPrecision,\n ): boolean {\n const fragmentSource = `precision ${precision} float;\\nvoid main(){}`;\n const fragmentShader = gl.createShader(gl.FRAGMENT_SHADER);\n if (!fragmentShader) {\n return false;\n }\n gl.shaderSource(fragmentShader, fragmentSource);\n gl.compileShader(fragmentShader);\n return !!gl.getShaderParameter(fragmentShader, gl.COMPILE_STATUS);\n }\n\n /**\n * query browser for WebGL\n */\n queryWebGL(canvas: HTMLCanvasElement) {\n const gl = canvas.getContext('webgl');\n if (gl) {\n this.maxTextureSize = gl.getParameter(gl.MAX_TEXTURE_SIZE);\n this.GLPrecision = (['highp', 'mediump', 'lowp'] as const).find(\n (precision) => this.testPrecision(gl, precision),\n );\n gl.getExtension('WEBGL_lose_context')!.loseContext();\n log('log', `WebGL: max texture size ${this.maxTextureSize}`);\n }\n }\n\n isSupported(textureSize: number) {\n return !!this.maxTextureSize && this.maxTextureSize >= textureSize;\n }\n}\n","/* eslint-disable no-restricted-globals */\nimport { WebGLProbe } from '../filters/GLProbes/WebGLProbe';\nimport type { TCopyPasteData, TFabricEnv } from './types';\n\nconst copyPasteData: TCopyPasteData = {};\n\nexport const getEnv = (): TFabricEnv => {\n return {\n document,\n window,\n isTouchSupported:\n 'ontouchstart' in window ||\n 'ontouchstart' in document ||\n (window && window.navigator && window.navigator.maxTouchPoints > 0),\n WebGLProbe: new WebGLProbe(),\n dispose() {\n // noop\n },\n copyPasteData,\n };\n};\n","/**\n * This file is consumed by fabric.\n * The `./node` and `./browser` files define the env variable that is used by this module.\n * The `./browser` module is defined to be the default env and doesn't set the env at all.\n * This is done in order to support isomorphic usage for browser and node applications\n * since window and document aren't defined at time of import in SSR, we can't set env so we avoid it by deferring to the default env.\n */\n\nimport { config } from '../config';\nimport { getEnv as getBrowserEnv } from './browser';\nimport type { TFabricEnv } from './types';\nimport type { DOMWindow } from 'jsdom';\n\nlet env: TFabricEnv;\n\n/**\n * Sets the environment variables used by fabric.\\\n * This is exposed for special cases, such as configuring a test environment, and should be used with care.\n *\n * **CAUTION**: Must be called before using the package.\n *\n * @example\n * Passing `window` and `document` objects to fabric (in case they are mocked or something)\n * import { getEnv, setEnv } from 'fabric';\n * // we want fabric to use the `window` and `document` objects exposed by the environment we are running in.\n * setEnv({ ...getEnv(), window, document });\n * // done with setup, using fabric is now safe\n */\nexport const setEnv = (value: TFabricEnv) => {\n env = value;\n};\n\n/**\n * In order to support SSR we **MUST** access the browser env only after the window has loaded\n */\nexport const getEnv = () => env || (env = getBrowserEnv());\n\nexport const getFabricDocument = (): Document => getEnv().document;\n\nexport const getFabricWindow = (): (Window & typeof globalThis) | DOMWindow =>\n getEnv().window;\n\n/**\n * @returns the config value if defined, fallbacks to the environment value\n */\nexport const getDevicePixelRatio = () =>\n Math.max(config.devicePixelRatio ?? getFabricWindow().devicePixelRatio, 1);\n","import { config } from './config';\nimport type { TRectBounds } from './typedefs';\n\nexport class Cache {\n /**\n * Cache of widths of chars in text rendering.\n */\n charWidthsCache: Record<\n /** fontFamily */ string,\n Record<\n /** fontStyleCacheKey */ string,\n Record\n >\n > = {};\n\n /**\n * @return {Object} reference to cache\n */\n getFontCache({\n fontFamily,\n fontStyle,\n fontWeight,\n }: {\n fontFamily: string;\n fontStyle: string;\n fontWeight: string | number;\n }) {\n fontFamily = fontFamily.toLowerCase();\n if (!this.charWidthsCache[fontFamily]) {\n this.charWidthsCache[fontFamily] = {};\n }\n const fontCache = this.charWidthsCache[fontFamily];\n const cacheKey = `${fontStyle.toLowerCase()}_${(\n fontWeight + ''\n ).toLowerCase()}`;\n if (!fontCache[cacheKey]) {\n fontCache[cacheKey] = {};\n }\n return fontCache[cacheKey];\n }\n\n /**\n * Clear char widths cache for the given font family or all the cache if no\n * fontFamily is specified.\n * Use it if you know you are loading fonts in a lazy way and you are not waiting\n * for custom fonts to load properly when adding text objects to the canvas.\n * If a text object is added when its own font is not loaded yet, you will get wrong\n * measurement and so wrong bounding boxes.\n * After the font cache is cleared, either change the textObject text content or call\n * initDimensions() to trigger a recalculation\n * @param {String} [fontFamily] font family to clear\n */\n clearFontCache(fontFamily?: string) {\n fontFamily = (fontFamily || '').toLowerCase();\n if (!fontFamily) {\n this.charWidthsCache = {};\n } else if (this.charWidthsCache[fontFamily]) {\n delete this.charWidthsCache[fontFamily];\n }\n }\n\n /**\n * Given current aspect ratio, determines the max width and height that can\n * respect the total allowed area for the cache.\n * @param {number} ar aspect ratio\n * @return {number[]} Limited dimensions X and Y\n */\n limitDimsByArea(ar: number) {\n const { perfLimitSizeTotal } = config;\n const roughWidth = Math.sqrt(perfLimitSizeTotal * ar);\n // we are not returning a point on purpose, to avoid circular dependencies\n // this is an internal utility\n return [\n Math.floor(roughWidth),\n Math.floor(perfLimitSizeTotal / roughWidth),\n ];\n }\n\n /**\n * This object keeps the results of the boundsOfCurve calculation mapped by the joined arguments necessary to calculate it.\n * It does speed up calculation, if you parse and add always the same paths, but in case of heavy usage of freedrawing\n * you do not get any speed benefit and you get a big object in memory.\n * The object was a private variable before, while now is appended to the lib so that you have access to it and you\n * can eventually clear it.\n * It was an internal variable, is accessible since version 2.3.4\n */\n boundsOfCurveCache: Record = {};\n}\n\nexport const cache = new Cache();\n","import type { TMat2D } from './typedefs';\n// use this syntax so babel plugin see this import here\nimport { version } from '../package.json';\n\nexport const VERSION = version;\n// eslint-disable-next-line @typescript-eslint/no-empty-function\nexport function noop() {}\n\nexport const halfPI = Math.PI / 2;\nexport const quarterPI = Math.PI / 4;\nexport const twoMathPi = Math.PI * 2;\nexport const PiBy180 = Math.PI / 180;\n\nexport const iMatrix = Object.freeze([1, 0, 0, 1, 0, 0]) as TMat2D;\nexport const DEFAULT_SVG_FONT_SIZE = 16;\nexport const ALIASING_LIMIT = 2;\n\n/* \"magic number\" for bezier approximations of arcs (http://itc.ktu.lt/itc354/Riskus354.pdf) */\nexport const kRect = 1 - 0.5522847498;\n\nexport const CENTER = 'center';\nexport const LEFT = 'left';\nexport const TOP = 'top';\nexport const BOTTOM = 'bottom';\nexport const RIGHT = 'right';\nexport const NONE = 'none';\n\nexport const reNewline = /\\r?\\n/;\n\nexport const MOVING = 'moving';\nexport const SCALING = 'scaling';\nexport const ROTATING = 'rotating';\nexport const ROTATE = 'rotate';\nexport const SKEWING = 'skewing';\nexport const RESIZING = 'resizing';\nexport const MODIFY_POLY = 'modifyPoly';\nexport const MODIFY_PATH = 'modifyPath';\nexport const CHANGED = 'changed';\nexport const SCALE = 'scale';\nexport const SCALE_X = 'scaleX';\nexport const SCALE_Y = 'scaleY';\nexport const SKEW_X = 'skewX';\nexport const SKEW_Y = 'skewY';\nexport const FILL = 'fill';\nexport const STROKE = 'stroke';\nexport const MODIFIED = 'modified';\n","import { FabricError } from './util/internals/console';\n\n/*\n * This Map connects the objects type value with their\n * class implementation. It used from any object to understand which are\n * the classes to enlive when requesting a object.type = 'path' for example.\n * Objects uses it for clipPath, Canvas uses it for everything.\n * This is necessary for generic code to run and enlive instances from serialized representation.\n * You can customize which classes get enlived from SVG parsing using this classRegistry.\n * The Registry start empty and gets filled in depending which files you import.\n * If you want to be able to parse arbitrary SVGs or JSON representation of canvases, coming from\n * different sources you will need to import all fabric because you may need all classes.\n */\n\nexport const JSON = 'json';\nexport const SVG = 'svg';\n\nexport class ClassRegistry {\n declare [JSON]: Map;\n declare [SVG]: Map;\n\n constructor() {\n this[JSON] = new Map();\n this[SVG] = new Map();\n }\n\n has(classType: string): boolean {\n return this[JSON].has(classType);\n }\n\n getClass(classType: string): T {\n const constructor = this[JSON].get(classType);\n if (!constructor) {\n throw new FabricError(`No class registered for ${classType}`);\n }\n return constructor;\n }\n\n setClass(classConstructor: any, classType?: string) {\n if (classType) {\n this[JSON].set(classType, classConstructor);\n } else {\n this[JSON].set(classConstructor.type, classConstructor);\n // legacy\n // @TODO: needs to be removed in fabric 7 or 8\n this[JSON].set(classConstructor.type.toLowerCase(), classConstructor);\n }\n }\n\n getSVGClass(SVGTagName: string): any {\n return this[SVG].get(SVGTagName);\n }\n\n setSVGClass(classConstructor: any, SVGTagName?: string) {\n this[SVG].set(\n SVGTagName ?? classConstructor.type.toLowerCase(),\n classConstructor,\n );\n }\n}\n\nexport const classRegistry = new ClassRegistry();\n","import type { StaticCanvas } from '../../canvas/StaticCanvas';\nimport type { FabricObject } from '../../shapes/Object/FabricObject';\nimport type { AnimationBase } from './AnimationBase';\n\n/**\n * Array holding all running animations\n */\nclass AnimationRegistry extends Array {\n /**\n * Remove a single animation using an animation context\n * @param {AnimationBase} context\n */\n remove(context: AnimationBase) {\n const index = this.indexOf(context);\n index > -1 && this.splice(index, 1);\n }\n\n /**\n * Cancel all running animations on the next frame\n */\n cancelAll() {\n const animations = this.splice(0);\n animations.forEach((animation) => animation.abort());\n return animations;\n }\n\n /**\n * Cancel all running animations attached to a canvas on the next frame\n * @param {StaticCanvas} canvas\n */\n cancelByCanvas(canvas: StaticCanvas) {\n if (!canvas) {\n return [];\n }\n const animations = this.filter(\n (animation) =>\n animation.target === canvas ||\n (typeof animation.target === 'object' &&\n (animation.target as FabricObject)?.canvas === canvas),\n );\n animations.forEach((animation) => animation.abort());\n return animations;\n }\n\n /**\n * Cancel all running animations for target on the next frame\n * @param target\n */\n cancelByTarget(target: AnimationBase['target']) {\n if (!target) {\n return [];\n }\n const animations = this.filter((animation) => animation.target === target);\n animations.forEach((animation) => animation.abort());\n return animations;\n }\n}\n\nexport const runningAnimations = new AnimationRegistry();\n","export type TEventCallback = (options: T) => any;\n\ntype EventRegistryObject = {\n [K in keyof E]?: TEventCallback;\n};\n\n/**\n * @see {@link http://fabric5.fabricjs.com/fabric-intro-part-2#events}\n * @see {@link http://fabric5.fabricjs.com/events|Events demo}\n */\nexport class Observable {\n private __eventListeners: Record =\n {} as Record;\n\n /**\n * Observes specified event\n * @alias on\n * @param {string} eventName Event name (eg. 'after:render')\n * @param {EventRegistryObject} handlers key/value pairs (eg. {'after:render': handler, 'selection:cleared': handler})\n * @param {Function} handler Function that receives a notification when an event of the specified type occurs\n * @return {Function} disposer\n */\n on(\n eventName: K,\n handler: TEventCallback,\n ): VoidFunction;\n on(handlers: EventRegistryObject): VoidFunction;\n on(\n arg0: K | EventRegistryObject,\n handler?: TEventCallback,\n ): VoidFunction {\n if (!this.__eventListeners) {\n this.__eventListeners = {} as Record;\n }\n if (typeof arg0 === 'object') {\n // one object with key/value pairs was passed\n Object.entries(arg0).forEach(([eventName, handler]) => {\n this.on(eventName as K, handler as TEventCallback);\n });\n return () => this.off(arg0);\n } else if (handler) {\n const eventName = arg0;\n if (!this.__eventListeners[eventName]) {\n this.__eventListeners[eventName] = [];\n }\n this.__eventListeners[eventName].push(handler);\n return () => this.off(eventName, handler);\n } else {\n // noop\n return () => false;\n }\n }\n\n /**\n * Observes specified event **once**\n * @alias once\n * @param {string} eventName Event name (eg. 'after:render')\n * @param {EventRegistryObject} handlers key/value pairs (eg. {'after:render': handler, 'selection:cleared': handler})\n * @param {Function} handler Function that receives a notification when an event of the specified type occurs\n * @return {Function} disposer\n */\n once(\n eventName: K,\n handler: TEventCallback,\n ): VoidFunction;\n once(handlers: EventRegistryObject): VoidFunction;\n once(\n arg0: K | EventRegistryObject,\n handler?: TEventCallback,\n ): VoidFunction {\n if (typeof arg0 === 'object') {\n // one object with key/value pairs was passed\n const disposers: VoidFunction[] = [];\n Object.entries(arg0).forEach(([eventName, handler]) => {\n disposers.push(this.once(eventName as K, handler as TEventCallback));\n });\n return () => disposers.forEach((d) => d());\n } else if (handler) {\n const disposer = this.on(\n arg0,\n function onceHandler(this: Observable, ...args) {\n handler.call(this, ...args);\n disposer();\n },\n );\n return disposer;\n } else {\n // noop\n return () => false;\n }\n }\n\n /**\n * @private\n * @param {string} eventName\n * @param {Function} [handler]\n */\n private _removeEventListener(\n eventName: K,\n handler?: TEventCallback,\n ) {\n if (!this.__eventListeners[eventName]) {\n return;\n }\n\n if (handler) {\n const eventListener = this.__eventListeners[eventName];\n const index = eventListener.indexOf(handler);\n index > -1 && eventListener.splice(index, 1);\n } else {\n this.__eventListeners[eventName] = [];\n }\n }\n\n /**\n * Unsubscribe all event listeners for eventname.\n * Do not use this pattern. You could kill internal fabricJS events.\n * We know we should have protected events for internal flows, but we don't have yet\n * @deprecated\n * @param {string} eventName event name (eg. 'after:render')\n */\n off(eventName: K): void;\n /**\n * unsubscribe an event listener\n * @param {string} eventName event name (eg. 'after:render')\n * @param {TEventCallback} handler event listener to unsubscribe\n */\n off(eventName: K, handler: TEventCallback): void;\n /**\n * unsubscribe event listeners\n * @param handlers handlers key/value pairs (eg. {'after:render': handler, 'selection:cleared': handler})\n */\n off(handlers: EventRegistryObject): void;\n /**\n * unsubscribe all event listeners\n */\n off(): void;\n off(\n arg0?: K | EventRegistryObject,\n handler?: TEventCallback,\n ) {\n if (!this.__eventListeners) {\n return;\n }\n\n // remove all key/value pairs (event name -> event handler)\n if (typeof arg0 === 'undefined') {\n for (const eventName in this.__eventListeners) {\n this._removeEventListener(eventName);\n }\n }\n // one object with key/value pairs was passed\n else if (typeof arg0 === 'object') {\n Object.entries(arg0).forEach(([eventName, handler]) => {\n this._removeEventListener(eventName as K, handler as TEventCallback);\n });\n } else {\n this._removeEventListener(arg0, handler);\n }\n }\n\n /**\n * Fires event with an optional options object\n * @param {String} eventName Event name to fire\n * @param {Object} [options] Options object\n */\n fire(eventName: K, options?: EventSpec[K]) {\n if (!this.__eventListeners) {\n return;\n }\n\n const listenersForEvent = this.__eventListeners[eventName]?.concat();\n if (listenersForEvent) {\n for (let i = 0; i < listenersForEvent.length; i++) {\n listenersForEvent[i].call(this, options || {});\n }\n }\n }\n}\n","/**\n * Removes value from an array.\n * Presence of value (and its position in an array) is determined via `Array.prototype.indexOf`\n * @param {Array} array\n * @param {*} value\n * @return {Array} original array\n */\nexport const removeFromArray = (array: T[], value: T): T[] => {\n const idx = array.indexOf(value);\n if (idx !== -1) {\n array.splice(idx, 1);\n }\n return array;\n};\n","import type { TRadian } from '../../typedefs';\nimport { halfPI } from '../../constants';\n\n/**\n * Calculate the cos of an angle, avoiding returning floats for known results\n * This function is here just to avoid getting 0.999999999999999 when dealing\n * with numbers that are really 1 or 0.\n * @param {TRadian} angle the angle\n * @return {Number} the cosin value for angle.\n */\nexport const cos = (angle: TRadian): number => {\n if (angle === 0) {\n return 1;\n }\n const angleSlice = Math.abs(angle) / halfPI;\n switch (angleSlice) {\n case 1:\n case 3:\n return 0;\n case 2:\n return -1;\n }\n return Math.cos(angle);\n};\n","import type { TRadian } from '../../typedefs';\nimport { halfPI } from '../../constants';\n\n/**\n * Calculate the cos of an angle, avoiding returning floats for known results\n * This function is here just to avoid getting 0.999999999999999 when dealing\n * with numbers that are really 1 or 0.\n * @param {TRadian} angle the angle\n * @return {Number} the sin value for angle.\n */\nexport const sin = (angle: TRadian): number => {\n if (angle === 0) {\n return 0;\n }\n const angleSlice = angle / halfPI;\n const value = Math.sign(angle);\n switch (angleSlice) {\n case 1:\n return value;\n case 2:\n return 0;\n case 3:\n return -value;\n }\n return Math.sin(angle);\n};\n","import type { TMat2D, TRadian } from './typedefs';\nimport { cos } from './util/misc/cos';\nimport { sin } from './util/misc/sin';\n\nexport interface XY {\n x: number;\n y: number;\n}\n\n/**\n * Adaptation of work of Kevin Lindsey(kevin@kevlindev.com)\n */\nexport class Point implements XY {\n declare x: number;\n\n declare y: number;\n\n constructor();\n constructor(x: number, y: number);\n constructor(point?: XY);\n constructor(arg0: number | XY = 0, y = 0) {\n if (typeof arg0 === 'object') {\n this.x = arg0.x;\n this.y = arg0.y;\n } else {\n this.x = arg0;\n this.y = y;\n }\n }\n\n /**\n * Adds another point to this one and returns a new one with the sum\n * @param {XY} that\n * @return {Point} new Point instance with added values\n */\n add(that: XY): Point {\n return new Point(this.x + that.x, this.y + that.y);\n }\n\n /**\n * Adds another point to this one\n * @param {XY} that\n * @return {Point} thisArg\n * @deprecated\n */\n addEquals(that: XY): Point {\n this.x += that.x;\n this.y += that.y;\n return this;\n }\n\n /**\n * Adds value to this point and returns a new one\n * @param {Number} scalar\n * @return {Point} new Point with added value\n */\n scalarAdd(scalar: number): Point {\n return new Point(this.x + scalar, this.y + scalar);\n }\n\n /**\n * Adds value to this point\n * @param {Number} scalar\n * @return {Point} thisArg\n * @deprecated\n */\n scalarAddEquals(scalar: number): Point {\n this.x += scalar;\n this.y += scalar;\n return this;\n }\n\n /**\n * Subtracts another point from this point and returns a new one\n * @param {XY} that\n * @return {Point} new Point object with subtracted values\n */\n subtract(that: XY): Point {\n return new Point(this.x - that.x, this.y - that.y);\n }\n\n /**\n * Subtracts another point from this point\n * @param {XY} that\n * @return {Point} thisArg\n * @deprecated\n */\n subtractEquals(that: XY): Point {\n this.x -= that.x;\n this.y -= that.y;\n return this;\n }\n\n /**\n * Subtracts value from this point and returns a new one\n * @param {Number} scalar\n * @return {Point}\n */\n scalarSubtract(scalar: number): Point {\n return new Point(this.x - scalar, this.y - scalar);\n }\n\n /**\n * Subtracts value from this point\n * @param {Number} scalar\n * @return {Point} thisArg\n * @deprecated\n */\n scalarSubtractEquals(scalar: number): Point {\n this.x -= scalar;\n this.y -= scalar;\n return this;\n }\n\n /**\n * Multiplies this point by another value and returns a new one\n * @param {XY} that\n * @return {Point}\n */\n multiply(that: XY): Point {\n return new Point(this.x * that.x, this.y * that.y);\n }\n\n /**\n * Multiplies this point by a value and returns a new one\n * @param {Number} scalar\n * @return {Point}\n */\n scalarMultiply(scalar: number): Point {\n return new Point(this.x * scalar, this.y * scalar);\n }\n\n /**\n * Multiplies this point by a value\n * @param {Number} scalar\n * @return {Point} thisArg\n * @deprecated\n */\n scalarMultiplyEquals(scalar: number): Point {\n this.x *= scalar;\n this.y *= scalar;\n return this;\n }\n\n /**\n * Divides this point by another and returns a new one\n * @param {XY} that\n * @return {Point}\n */\n divide(that: XY): Point {\n return new Point(this.x / that.x, this.y / that.y);\n }\n\n /**\n * Divides this point by a value and returns a new one\n * @param {Number} scalar\n * @return {Point}\n */\n scalarDivide(scalar: number): Point {\n return new Point(this.x / scalar, this.y / scalar);\n }\n\n /**\n * Divides this point by a value\n * @param {Number} scalar\n * @return {Point} thisArg\n * @deprecated\n */\n scalarDivideEquals(scalar: number): Point {\n this.x /= scalar;\n this.y /= scalar;\n return this;\n }\n\n /**\n * Returns true if this point is equal to another one\n * @param {XY} that\n * @return {Boolean}\n */\n eq(that: XY): boolean {\n return this.x === that.x && this.y === that.y;\n }\n\n /**\n * Returns true if this point is less than another one\n * @param {XY} that\n * @return {Boolean}\n */\n lt(that: XY): boolean {\n return this.x < that.x && this.y < that.y;\n }\n\n /**\n * Returns true if this point is less than or equal to another one\n * @param {XY} that\n * @return {Boolean}\n */\n lte(that: XY): boolean {\n return this.x <= that.x && this.y <= that.y;\n }\n\n /**\n\n * Returns true if this point is greater another one\n * @param {XY} that\n * @return {Boolean}\n */\n gt(that: XY): boolean {\n return this.x > that.x && this.y > that.y;\n }\n\n /**\n * Returns true if this point is greater than or equal to another one\n * @param {XY} that\n * @return {Boolean}\n */\n gte(that: XY): boolean {\n return this.x >= that.x && this.y >= that.y;\n }\n\n /**\n * Returns new point which is the result of linear interpolation with this one and another one\n * @param {XY} that\n * @param {Number} t , position of interpolation, between 0 and 1 default 0.5\n * @return {Point}\n */\n lerp(that: XY, t = 0.5): Point {\n t = Math.max(Math.min(1, t), 0);\n return new Point(\n this.x + (that.x - this.x) * t,\n this.y + (that.y - this.y) * t,\n );\n }\n\n /**\n * Returns distance from this point and another one\n * @param {XY} that\n * @return {Number}\n */\n distanceFrom(that: XY): number {\n const dx = this.x - that.x,\n dy = this.y - that.y;\n return Math.sqrt(dx * dx + dy * dy);\n }\n\n /**\n * Returns the point between this point and another one\n * @param {XY} that\n * @return {Point}\n */\n midPointFrom(that: XY): Point {\n return this.lerp(that);\n }\n\n /**\n * Returns a new point which is the min of this and another one\n * @param {XY} that\n * @return {Point}\n */\n min(that: XY): Point {\n return new Point(Math.min(this.x, that.x), Math.min(this.y, that.y));\n }\n\n /**\n * Returns a new point which is the max of this and another one\n * @param {XY} that\n * @return {Point}\n */\n max(that: XY): Point {\n return new Point(Math.max(this.x, that.x), Math.max(this.y, that.y));\n }\n\n /**\n * Returns string representation of this point\n * @return {String}\n */\n toString(): string {\n return `${this.x},${this.y}`;\n }\n\n /**\n * Sets x/y of this point\n * @param {Number} x\n * @param {Number} y\n */\n setXY(x: number, y: number) {\n this.x = x;\n this.y = y;\n return this;\n }\n\n /**\n * Sets x of this point\n * @param {Number} x\n */\n setX(x: number) {\n this.x = x;\n return this;\n }\n\n /**\n * Sets y of this point\n * @param {Number} y\n */\n setY(y: number) {\n this.y = y;\n return this;\n }\n\n /**\n * Sets x/y of this point from another point\n * @param {XY} that\n */\n setFromPoint(that: XY) {\n this.x = that.x;\n this.y = that.y;\n return this;\n }\n\n /**\n * Swaps x/y of this point and another point\n * @param {XY} that\n */\n swap(that: XY) {\n const x = this.x,\n y = this.y;\n this.x = that.x;\n this.y = that.y;\n that.x = x;\n that.y = y;\n }\n\n /**\n * return a cloned instance of the point\n * @return {Point}\n */\n clone(): Point {\n return new Point(this.x, this.y);\n }\n\n /**\n * Rotates `point` around `origin` with `radians`\n * @param {XY} origin The origin of the rotation\n * @param {TRadian} radians The radians of the angle for the rotation\n * @return {Point} The new rotated point\n */\n rotate(radians: TRadian, origin: XY = ZERO): Point {\n // TODO benchmark and verify the add and subtract how much cost\n // and then in case early return if no origin is passed\n const sinus = sin(radians),\n cosinus = cos(radians);\n const p = this.subtract(origin);\n const rotated = new Point(\n p.x * cosinus - p.y * sinus,\n p.x * sinus + p.y * cosinus,\n );\n return rotated.add(origin);\n }\n\n /**\n * Apply transform t to point p\n * @param {TMat2D} t The transform\n * @param {Boolean} [ignoreOffset] Indicates that the offset should not be applied\n * @return {Point} The transformed point\n */\n transform(t: TMat2D, ignoreOffset = false): Point {\n return new Point(\n t[0] * this.x + t[2] * this.y + (ignoreOffset ? 0 : t[4]),\n t[1] * this.x + t[3] * this.y + (ignoreOffset ? 0 : t[5]),\n );\n }\n}\n\nexport const ZERO = new Point(0, 0);\n","import type { Constructor, TBBox } from './typedefs';\nimport { removeFromArray } from './util/internals/removeFromArray';\nimport { Point } from './Point';\nimport type { ActiveSelection } from './shapes/ActiveSelection';\nimport type { Group } from './shapes/Group';\nimport type { InteractiveFabricObject } from './shapes/Object/InteractiveObject';\nimport type { FabricObject } from './shapes/Object/FabricObject';\n\nexport const isCollection = (\n fabricObject?: FabricObject,\n): fabricObject is Group | ActiveSelection => {\n return !!fabricObject && Array.isArray((fabricObject as Group)._objects);\n};\n\nexport function createCollectionMixin(Base: TBase) {\n class Collection extends Base {\n /**\n * @type {FabricObject[]}\n * @TODO needs to end up in the constructor too\n */\n _objects: FabricObject[] = [];\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n _onObjectAdded(object: FabricObject) {\n // subclasses should override this method\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n _onObjectRemoved(object: FabricObject) {\n // subclasses should override this method\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n _onStackOrderChanged(object: FabricObject) {\n // subclasses should override this method\n }\n\n /**\n * Adds objects to collection\n * Objects should be instances of (or inherit from) FabricObject\n * @param {...FabricObject[]} objects to add\n * @returns {number} new array length\n */\n add(...objects: FabricObject[]): number {\n const size = this._objects.push(...objects);\n objects.forEach((object) => this._onObjectAdded(object));\n return size;\n }\n\n /**\n * Inserts an object into collection at specified index\n * @param {number} index Index to insert object at\n * @param {...FabricObject[]} objects Object(s) to insert\n * @returns {number} new array length\n */\n insertAt(index: number, ...objects: FabricObject[]) {\n this._objects.splice(index, 0, ...objects);\n objects.forEach((object) => this._onObjectAdded(object));\n return this._objects.length;\n }\n\n /**\n * Removes objects from a collection, then renders canvas (if `renderOnAddRemove` is not `false`)\n * @private\n * @param {...FabricObject[]} objects objects to remove\n * @returns {FabricObject[]} removed objects\n */\n remove(...objects: FabricObject[]) {\n const array = this._objects,\n removed: FabricObject[] = [];\n objects.forEach((object) => {\n const index = array.indexOf(object);\n // only call onObjectRemoved if an object was actually removed\n if (index !== -1) {\n array.splice(index, 1);\n removed.push(object);\n this._onObjectRemoved(object);\n }\n });\n return removed;\n }\n\n /**\n * Executes given function for each object in this group\n * A simple shortcut for getObjects().forEach, before es6 was more complicated,\n * now is just a shortcut.\n * @param {Function} callback\n * Callback invoked with current object as first argument,\n * index - as second and an array of all objects - as third.\n */\n forEachObject(\n callback: (\n object: FabricObject,\n index: number,\n array: FabricObject[],\n ) => any,\n ) {\n this.getObjects().forEach((object, index, objects) =>\n callback(object, index, objects),\n );\n }\n\n /**\n * Returns an array of children objects of this instance\n * @param {...String} [types] When specified, only objects of these types are returned\n * @return {Array}\n */\n getObjects(...types: string[]) {\n if (types.length === 0) {\n return [...this._objects];\n }\n return this._objects.filter((o) => o.isType(...types));\n }\n\n /**\n * Returns object at specified index\n * @param {Number} index\n * @return {Object} object at index\n */\n item(index: number) {\n return this._objects[index];\n }\n\n /**\n * Returns true if collection contains no objects\n * @return {Boolean} true if collection is empty\n */\n isEmpty() {\n return this._objects.length === 0;\n }\n\n /**\n * Returns a size of a collection (i.e: length of an array containing its objects)\n * @return {Number} Collection size\n */\n size() {\n return this._objects.length;\n }\n\n /**\n * Returns true if collection contains an object.\\\n * **Prefer using {@link FabricObject#isDescendantOf} for performance reasons**\n * instead of `a.contains(b)` use `b.isDescendantOf(a)`\n * @param {Object} object Object to check against\n * @param {Boolean} [deep=false] `true` to check all descendants, `false` to check only `_objects`\n * @return {Boolean} `true` if collection contains an object\n */\n contains(object: FabricObject, deep?: boolean): boolean {\n if (this._objects.includes(object)) {\n return true;\n } else if (deep) {\n return this._objects.some(\n (obj) =>\n obj instanceof Collection &&\n (obj as unknown as Collection).contains(object, true),\n );\n }\n return false;\n }\n\n /**\n * Returns number representation of a collection complexity\n * @return {Number} complexity\n */\n complexity() {\n return this._objects.reduce((memo, current) => {\n memo += current.complexity ? current.complexity() : 0;\n return memo;\n }, 0);\n }\n\n /**\n * Moves an object or the objects of a multiple selection\n * to the bottom of the stack of drawn objects\n * @param {fabric.Object} object Object to send to back\n * @returns {boolean} true if change occurred\n */\n sendObjectToBack(object: FabricObject) {\n if (!object || object === this._objects[0]) {\n return false;\n }\n removeFromArray(this._objects, object);\n this._objects.unshift(object);\n this._onStackOrderChanged(object);\n return true;\n }\n\n /**\n * Moves an object or the objects of a multiple selection\n * to the top of the stack of drawn objects\n * @param {fabric.Object} object Object to send\n * @returns {boolean} true if change occurred\n */\n bringObjectToFront(object: FabricObject) {\n if (!object || object === this._objects[this._objects.length - 1]) {\n return false;\n }\n removeFromArray(this._objects, object);\n this._objects.push(object);\n this._onStackOrderChanged(object);\n return true;\n }\n\n /**\n * Moves an object or a selection down in stack of drawn objects\n * An optional parameter, `intersecting` allows to move the object in behind\n * the first intersecting object. Where intersection is calculated with\n * bounding box. If no intersection is found, there will not be change in the\n * stack.\n * @param {fabric.Object} object Object to send\n * @param {boolean} [intersecting] If `true`, send object behind next lower intersecting object\n * @returns {boolean} true if change occurred\n */\n sendObjectBackwards(object: FabricObject, intersecting?: boolean) {\n if (!object) {\n return false;\n }\n const idx = this._objects.indexOf(object);\n if (idx !== 0) {\n // if object is not on the bottom of stack\n const newIdx = this.findNewLowerIndex(object, idx, intersecting);\n removeFromArray(this._objects, object);\n this._objects.splice(newIdx, 0, object);\n this._onStackOrderChanged(object);\n return true;\n }\n return false;\n }\n\n /**\n * Moves an object or a selection up in stack of drawn objects\n * An optional parameter, intersecting allows to move the object in front\n * of the first intersecting object. Where intersection is calculated with\n * bounding box. If no intersection is found, there will not be change in the\n * stack.\n * @param {fabric.Object} object Object to send\n * @param {boolean} [intersecting] If `true`, send object in front of next upper intersecting object\n * @returns {boolean} true if change occurred\n */\n bringObjectForward(object: FabricObject, intersecting?: boolean) {\n if (!object) {\n return false;\n }\n const idx = this._objects.indexOf(object);\n if (idx !== this._objects.length - 1) {\n // if object is not on top of stack (last item in an array)\n const newIdx = this.findNewUpperIndex(object, idx, intersecting);\n removeFromArray(this._objects, object);\n this._objects.splice(newIdx, 0, object);\n this._onStackOrderChanged(object);\n return true;\n }\n return false;\n }\n\n /**\n * Moves an object to specified level in stack of drawn objects\n * @param {fabric.Object} object Object to send\n * @param {number} index Position to move to\n * @returns {boolean} true if change occurred\n */\n moveObjectTo(object: FabricObject, index: number) {\n if (object === this._objects[index]) {\n return false;\n }\n removeFromArray(this._objects, object);\n this._objects.splice(index, 0, object);\n this._onStackOrderChanged(object);\n return true;\n }\n\n findNewLowerIndex(\n object: FabricObject,\n idx: number,\n intersecting?: boolean,\n ) {\n let newIdx;\n\n if (intersecting) {\n newIdx = idx;\n // traverse down the stack looking for the nearest intersecting object\n for (let i = idx - 1; i >= 0; --i) {\n if (object.isOverlapping(this._objects[i])) {\n newIdx = i;\n break;\n }\n }\n } else {\n newIdx = idx - 1;\n }\n\n return newIdx;\n }\n\n findNewUpperIndex(\n object: FabricObject,\n idx: number,\n intersecting?: boolean,\n ) {\n let newIdx;\n\n if (intersecting) {\n newIdx = idx;\n // traverse up the stack looking for the nearest intersecting object\n for (let i = idx + 1; i < this._objects.length; ++i) {\n if (object.isOverlapping(this._objects[i])) {\n newIdx = i;\n break;\n }\n }\n } else {\n newIdx = idx + 1;\n }\n\n return newIdx;\n }\n\n /**\n * Given a bounding box, return all the objects of the collection that are contained in the bounding box.\n * If `includeIntersecting` is true, return also the objects that intersect the bounding box as well.\n * This is meant to work with selection. Is not a generic method.\n * @param {TBBox} bbox a bounding box in scene coordinates\n * @param {{ includeIntersecting?: boolean }} options an object with includeIntersecting\n * @returns array of objects contained in the bounding box, ordered from top to bottom stacking wise\n */\n collectObjects(\n { left, top, width, height }: TBBox,\n { includeIntersecting = true }: { includeIntersecting?: boolean } = {},\n ) {\n const objects: InteractiveFabricObject[] = [],\n tl = new Point(left, top),\n br = tl.add(new Point(width, height));\n\n // we iterate reverse order to collect top first in case of click.\n for (let i = this._objects.length - 1; i >= 0; i--) {\n const object = this._objects[i] as unknown as InteractiveFabricObject;\n if (\n object.selectable &&\n object.visible &&\n ((includeIntersecting && object.intersectsWithRect(tl, br)) ||\n object.isContainedWithinRect(tl, br) ||\n (includeIntersecting && object.containsPoint(tl)) ||\n (includeIntersecting && object.containsPoint(br)))\n ) {\n objects.push(object);\n }\n }\n\n return objects;\n }\n }\n\n // https://github.com/microsoft/TypeScript/issues/32080\n return Collection;\n}\n","import { Observable } from './Observable';\n\nexport class CommonMethods extends Observable {\n /**\n * Sets object's properties from options, for initialization only\n * @protected\n * @param {Object} [options] Options object\n */\n protected _setOptions(options: any = {}) {\n for (const prop in options) {\n this.set(prop, options[prop]);\n }\n }\n\n /**\n * @private\n */\n _setObject(obj: Record) {\n for (const prop in obj) {\n this._set(prop, obj[prop]);\n }\n }\n\n /**\n * Sets property to a given value. When changing position/dimension -related properties (left, top, scale, angle, etc.) `set` does not update position of object's borders/controls. If you need to update those, call `setCoords()`.\n * @param {String|Object} key Property name or object (if object, iterate over the object properties)\n * @param {Object|Function} value Property value (if function, the value is passed into it and its return value is used as a new one)\n */\n set(key: string | Record, value?: any) {\n if (typeof key === 'object') {\n this._setObject(key);\n } else {\n this._set(key, value);\n }\n return this;\n }\n\n _set(key: string, value: any) {\n this[key as keyof this] = value;\n }\n\n /**\n * Toggles specified property from `true` to `false` or from `false` to `true`\n * @param {String} property Property to toggle\n */\n toggle(property: string) {\n const value = this.get(property);\n if (typeof value === 'boolean') {\n this.set(property, !value);\n }\n return this;\n }\n\n /**\n * Basic getter\n * @param {String} property Property name\n * @return {*} value of a property\n */\n get(property: string): any {\n return this[property as keyof this];\n }\n}\n","import { getFabricWindow } from '../../env';\n\nexport function requestAnimFrame(callback: FrameRequestCallback): number {\n return getFabricWindow().requestAnimationFrame(callback);\n}\n\nexport function cancelAnimFrame(handle: number): void {\n return getFabricWindow().cancelAnimationFrame(handle);\n}\n","let id = 0;\n\nexport const uid = () => id++;\n","import { getFabricDocument } from '../../env';\nimport type { ImageFormat, TSize } from '../../typedefs';\nimport { FabricError } from '../internals/console';\n/**\n * Creates canvas element\n * @return {CanvasElement} initialized canvas element\n */\nexport const createCanvasElement = (): HTMLCanvasElement => {\n const element = getFabricDocument().createElement('canvas');\n if (!element || typeof element.getContext === 'undefined') {\n throw new FabricError('Failed to create `canvas` element');\n }\n return element;\n};\n\n/**\n * Creates image element (works on client and node)\n * @return {HTMLImageElement} HTML image element\n */\nexport const createImage = (): HTMLImageElement =>\n getFabricDocument().createElement('img');\n\n/**\n * Creates a canvas element that is a copy of another and is also painted\n * @param {CanvasElement} canvas to copy size and content of\n * @return {CanvasElement} initialized canvas element\n */\nexport const copyCanvasElement = (\n canvas: HTMLCanvasElement,\n): HTMLCanvasElement => {\n const newCanvas = createCanvasElementFor(canvas);\n newCanvas.getContext('2d')?.drawImage(canvas, 0, 0);\n return newCanvas;\n};\n\n/**\n * Creates a canvas element as big as another\n * @param {CanvasElement} canvas to copy size and content of\n * @return {CanvasElement} initialized canvas element\n */\nexport const createCanvasElementFor = (\n canvas: HTMLCanvasElement | ImageData | HTMLImageElement | TSize,\n): HTMLCanvasElement => {\n const newCanvas = createCanvasElement();\n newCanvas.width = canvas.width;\n newCanvas.height = canvas.height;\n return newCanvas;\n};\n\n/**\n * since 2.6.0 moved from canvas instance to utility.\n * possibly useless\n * @param {CanvasElement} canvasEl to copy size and content of\n * @param {String} format 'jpeg' or 'png', in some browsers 'webp' is ok too\n * @param {number} quality <= 1 and > 0\n * @return {String} data url\n */\nexport const toDataURL = (\n canvasEl: HTMLCanvasElement,\n format: ImageFormat,\n quality: number,\n) => canvasEl.toDataURL(`image/${format}`, quality);\n\nexport const isHTMLCanvas = (\n canvas?: HTMLCanvasElement | string,\n): canvas is HTMLCanvasElement => {\n return !!canvas && (canvas as HTMLCanvasElement).getContext !== undefined;\n};\n\nexport const toBlob = (\n canvasEl: HTMLCanvasElement,\n format?: ImageFormat,\n quality?: number,\n): Promise =>\n new Promise((resolve, _) => {\n canvasEl.toBlob(resolve, `image/${format}`, quality);\n });\n","import type { TRadian, TDegree } from '../../typedefs';\nimport { PiBy180 } from '../../constants';\n\n/**\n * Transforms degrees to radians.\n * @param {TDegree} degrees value in degrees\n * @return {TRadian} value in radians\n */\nexport const degreesToRadians = (degrees: TDegree): TRadian =>\n (degrees * PiBy180) as TRadian;\n\n/**\n * Transforms radians to degrees.\n * @param {TRadian} radians value in radians\n * @return {TDegree} value in degrees\n */\nexport const radiansToDegrees = (radians: TRadian): TDegree =>\n (radians / PiBy180) as TDegree;\n","import { iMatrix } from '../../constants';\nimport type { XY } from '../../Point';\nimport { Point } from '../../Point';\nimport type { TDegree, TRadian, TMat2D } from '../../typedefs';\nimport { cos } from './cos';\nimport { degreesToRadians, radiansToDegrees } from './radiansDegreesConversion';\nimport { sin } from './sin';\n\nexport type TRotateMatrixArgs = {\n angle?: TDegree;\n};\n\nexport type TTranslateMatrixArgs = {\n translateX?: number;\n translateY?: number;\n};\n\nexport type TScaleMatrixArgs = {\n scaleX?: number;\n scaleY?: number;\n flipX?: boolean;\n flipY?: boolean;\n skewX?: TDegree;\n skewY?: TDegree;\n};\n\nexport type TComposeMatrixArgs = TTranslateMatrixArgs &\n TRotateMatrixArgs &\n TScaleMatrixArgs;\n\nexport type TQrDecomposeOut = Required<\n Omit\n>;\n\nexport const isIdentityMatrix = (mat: TMat2D) =>\n mat.every((value, index) => value === iMatrix[index]);\n\n/**\n * Apply transform t to point p\n * @deprecated use {@link Point#transform}\n * @param {Point | XY} p The point to transform\n * @param {Array} t The transform\n * @param {Boolean} [ignoreOffset] Indicates that the offset should not be applied\n * @return {Point} The transformed point\n */\nexport const transformPoint = (\n p: XY,\n t: TMat2D,\n ignoreOffset?: boolean,\n): Point => new Point(p).transform(t, ignoreOffset);\n\n/**\n * Invert transformation t\n * @param {Array} t The transform\n * @return {Array} The inverted transform\n */\nexport const invertTransform = (t: TMat2D): TMat2D => {\n const a = 1 / (t[0] * t[3] - t[1] * t[2]),\n r = [a * t[3], -a * t[1], -a * t[2], a * t[0], 0, 0] as TMat2D,\n { x, y } = new Point(t[4], t[5]).transform(r, true);\n r[4] = -x;\n r[5] = -y;\n return r;\n};\n\n/**\n * Multiply matrix A by matrix B to nest transformations\n * @param {TMat2D} a First transformMatrix\n * @param {TMat2D} b Second transformMatrix\n * @param {Boolean} is2x2 flag to multiply matrices as 2x2 matrices\n * @return {TMat2D} The product of the two transform matrices\n */\nexport const multiplyTransformMatrices = (\n a: TMat2D,\n b: TMat2D,\n is2x2?: boolean,\n): TMat2D =>\n [\n a[0] * b[0] + a[2] * b[1],\n a[1] * b[0] + a[3] * b[1],\n a[0] * b[2] + a[2] * b[3],\n a[1] * b[2] + a[3] * b[3],\n is2x2 ? 0 : a[0] * b[4] + a[2] * b[5] + a[4],\n is2x2 ? 0 : a[1] * b[4] + a[3] * b[5] + a[5],\n ] as TMat2D;\n\n/**\n * Multiplies the matrices array such that a matrix defines the plane for the rest of the matrices **after** it\n *\n * `multiplyTransformMatrixArray([A, B, C, D])` is equivalent to `A(B(C(D)))`\n *\n * @param matrices an array of matrices\n * @param [is2x2] flag to multiply matrices as 2x2 matrices\n * @returns the multiplication product\n */\nexport const multiplyTransformMatrixArray = (\n matrices: (TMat2D | undefined | null | false)[],\n is2x2?: boolean,\n) =>\n matrices.reduceRight(\n (product: TMat2D, curr) =>\n curr && product\n ? multiplyTransformMatrices(curr, product, is2x2)\n : curr || product,\n undefined as unknown as TMat2D,\n ) || iMatrix.concat();\n\nexport const calcPlaneRotation = ([a, b]: TMat2D) =>\n Math.atan2(b, a) as TRadian;\n\n/**\n * Decomposes standard 2x3 matrix into transform components\n * @param {TMat2D} a transformMatrix\n * @return {Object} Components of transform\n */\nexport const qrDecompose = (a: TMat2D): TQrDecomposeOut => {\n const angle = calcPlaneRotation(a),\n denom = Math.pow(a[0], 2) + Math.pow(a[1], 2),\n scaleX = Math.sqrt(denom),\n scaleY = (a[0] * a[3] - a[2] * a[1]) / scaleX,\n skewX = Math.atan2(a[0] * a[2] + a[1] * a[3], denom);\n return {\n angle: radiansToDegrees(angle),\n scaleX,\n scaleY,\n skewX: radiansToDegrees(skewX),\n skewY: 0 as TDegree,\n translateX: a[4] || 0,\n translateY: a[5] || 0,\n };\n};\n\n/**\n * Generate a translation matrix\n *\n * A translation matrix in the form of\n * [ 1 0 x ]\n * [ 0 1 y ]\n * [ 0 0 1 ]\n *\n * See {@link https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/transform#translate} for more details\n *\n * @param {number} x translation on X axis\n * @param {number} [y] translation on Y axis\n * @returns {TMat2D} matrix\n */\nexport const createTranslateMatrix = (x: number, y = 0): TMat2D => [\n 1,\n 0,\n 0,\n 1,\n x,\n y,\n];\n\n/**\n * Generate a rotation matrix around around a point (x,y), defaulting to (0,0)\n *\n * A matrix in the form of\n * [cos(a) -sin(a) -x*cos(a)+y*sin(a)+x]\n * [sin(a) cos(a) -x*sin(a)-y*cos(a)+y]\n * [0 0 1 ]\n *\n *\n * @param {TDegree} angle rotation in degrees\n * @param {XY} [pivotPoint] pivot point to rotate around\n * @returns {TMat2D} matrix\n */\nexport function createRotateMatrix(\n { angle = 0 }: TRotateMatrixArgs = {},\n { x = 0, y = 0 }: Partial = {},\n): TMat2D {\n const angleRadiant = degreesToRadians(angle),\n cosValue = cos(angleRadiant),\n sinValue = sin(angleRadiant);\n return [\n cosValue,\n sinValue,\n -sinValue,\n cosValue,\n x ? x - (cosValue * x - sinValue * y) : 0,\n y ? y - (sinValue * x + cosValue * y) : 0,\n ];\n}\n\n/**\n * Generate a scale matrix around the point (0,0)\n *\n * A matrix in the form of\n * [x 0 0]\n * [0 y 0]\n * [0 0 1]\n *\n * {@link https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/transform#scale}\n *\n * @param {number} x scale on X axis\n * @param {number} [y] scale on Y axis\n * @returns {TMat2D} matrix\n */\nexport const createScaleMatrix = (x: number, y: number = x): TMat2D => [\n x,\n 0,\n 0,\n y,\n 0,\n 0,\n];\n\nexport const angleToSkew = (angle: TDegree) =>\n Math.tan(degreesToRadians(angle));\n\nexport const skewToAngle = (value: TRadian) =>\n radiansToDegrees(Math.atan(value));\n\n/**\n * Generate a skew matrix for the X axis\n *\n * A matrix in the form of\n * [1 x 0]\n * [0 1 0]\n * [0 0 1]\n *\n * {@link https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/transform#skewx}\n *\n * @param {TDegree} skewValue translation on X axis\n * @returns {TMat2D} matrix\n */\nexport const createSkewXMatrix = (skewValue: TDegree): TMat2D => [\n 1,\n 0,\n angleToSkew(skewValue),\n 1,\n 0,\n 0,\n];\n\n/**\n * Generate a skew matrix for the Y axis\n *\n * A matrix in the form of\n * [1 0 0]\n * [y 1 0]\n * [0 0 1]\n *\n * {@link https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/transform#skewy}\n *\n * @param {TDegree} skewValue translation on Y axis\n * @returns {TMat2D} matrix\n */\nexport const createSkewYMatrix = (skewValue: TDegree): TMat2D => [\n 1,\n angleToSkew(skewValue),\n 0,\n 1,\n 0,\n 0,\n];\n\n/**\n * Returns a transform matrix starting from an object of the same kind of\n * the one returned from qrDecompose, useful also if you want to calculate some\n * transformations from an object that is not enlived yet.\n * is called DimensionsTransformMatrix because those properties are the one that influence\n * the size of the resulting box of the object.\n * @param {Object} options\n * @param {Number} [options.scaleX]\n * @param {Number} [options.scaleY]\n * @param {Boolean} [options.flipX]\n * @param {Boolean} [options.flipY]\n * @param {Number} [options.skewX]\n * @param {Number} [options.skewY]\n * @return {Number[]} transform matrix\n */\nexport const calcDimensionsMatrix = ({\n scaleX = 1,\n scaleY = 1,\n flipX = false,\n flipY = false,\n skewX = 0 as TDegree,\n skewY = 0 as TDegree,\n}: TScaleMatrixArgs) => {\n let matrix = createScaleMatrix(\n flipX ? -scaleX : scaleX,\n flipY ? -scaleY : scaleY,\n );\n if (skewX) {\n matrix = multiplyTransformMatrices(matrix, createSkewXMatrix(skewX), true);\n }\n if (skewY) {\n matrix = multiplyTransformMatrices(matrix, createSkewYMatrix(skewY), true);\n }\n return matrix;\n};\n\n/**\n * Returns a transform matrix starting from an object of the same kind of\n * the one returned from qrDecompose, useful also if you want to calculate some\n * transformations from an object that is not enlived yet\n * Before changing this function look at: src/benchmarks/calcTransformMatrix.mjs\n * @param {Object} options\n * @param {Number} [options.angle]\n * @param {Number} [options.scaleX]\n * @param {Number} [options.scaleY]\n * @param {Boolean} [options.flipX]\n * @param {Boolean} [options.flipY]\n * @param {Number} [options.skewX]\n * @param {Number} [options.skewY]\n * @param {Number} [options.translateX]\n * @param {Number} [options.translateY]\n * @return {Number[]} transform matrix\n */\nexport const composeMatrix = (options: TComposeMatrixArgs): TMat2D => {\n const { translateX = 0, translateY = 0, angle = 0 as TDegree } = options;\n let matrix = createTranslateMatrix(translateX, translateY);\n if (angle) {\n matrix = multiplyTransformMatrices(matrix, createRotateMatrix({ angle }));\n }\n const scaleMatrix = calcDimensionsMatrix(options);\n if (!isIdentityMatrix(scaleMatrix)) {\n matrix = multiplyTransformMatrices(matrix, scaleMatrix);\n }\n return matrix;\n};\n","import { noop } from '../../constants';\nimport type { FabricObject } from '../../shapes/Object/FabricObject';\nimport type {\n Abortable,\n Constructor,\n TCrossOrigin,\n TFiller,\n} from '../../typedefs';\nimport { createImage } from './dom';\nimport { classRegistry } from '../../ClassRegistry';\nimport type { BaseFilter } from '../../filters/BaseFilter';\nimport type { FabricObject as BaseFabricObject } from '../../shapes/Object/Object';\nimport { FabricError, SignalAbortedError } from '../internals/console';\nimport type { Shadow } from '../../Shadow';\n\nexport type LoadImageOptions = Abortable & {\n /**\n * cors value for the image loading, default to anonymous\n */\n crossOrigin?: TCrossOrigin;\n};\n\n/**\n * Loads image element from given url and resolve it, or catch.\n * @param {String} url URL representing an image\n * @param {LoadImageOptions} [options] image loading options\n * @returns {Promise} the loaded image.\n */\nexport const loadImage = (\n url: string,\n { signal, crossOrigin = null }: LoadImageOptions = {},\n) =>\n new Promise(function (resolve, reject) {\n if (signal && signal.aborted) {\n return reject(new SignalAbortedError('loadImage'));\n }\n const img = createImage();\n let abort: EventListenerOrEventListenerObject;\n if (signal) {\n abort = function (err: Event) {\n img.src = '';\n reject(err);\n };\n signal.addEventListener('abort', abort, { once: true });\n }\n const done = function () {\n img.onload = img.onerror = null;\n abort && signal?.removeEventListener('abort', abort);\n resolve(img);\n };\n if (!url) {\n done();\n return;\n }\n img.onload = done;\n img.onerror = function () {\n abort && signal?.removeEventListener('abort', abort);\n reject(new FabricError(`Error loading ${img.src}`));\n };\n crossOrigin && (img.crossOrigin = crossOrigin);\n img.src = url;\n });\n\nexport type EnlivenObjectOptions = Abortable & {\n /**\n * Method for further parsing of object elements,\n * called after each fabric object created.\n */\n reviver?: <\n T extends\n | BaseFabricObject\n | FabricObject\n | BaseFilter\n | Shadow\n | TFiller,\n >(\n serializedObj: Record,\n instance: T,\n ) => void;\n};\n\n/**\n * @TODO type this correctly.\n * Creates corresponding fabric instances from their object representations\n * @param {Object[]} objects Objects to enliven\n * @param {EnlivenObjectOptions} [options]\n * @param {(serializedObj: object, instance: FabricObject) => any} [options.reviver] Method for further parsing of object elements,\n * called after each fabric object created.\n * @param {AbortSignal} [options.signal] handle aborting, see https://developer.mozilla.org/en-US/docs/Web/API/AbortController/signal\n * @returns {Promise}\n */\nexport const enlivenObjects = <\n T extends\n | BaseFabricObject\n | FabricObject\n | BaseFilter\n | Shadow\n | TFiller,\n>(\n objects: any[],\n { signal, reviver = noop }: EnlivenObjectOptions = {},\n) =>\n new Promise((resolve, reject) => {\n const instances: T[] = [];\n signal && signal.addEventListener('abort', reject, { once: true });\n Promise.all(\n objects.map((obj) =>\n classRegistry\n .getClass<\n Constructor & {\n fromObject(options: any, context: Abortable): Promise;\n }\n >(obj.type)\n .fromObject(obj, { signal })\n .then((fabricInstance) => {\n reviver(obj, fabricInstance);\n instances.push(fabricInstance);\n return fabricInstance;\n }),\n ),\n )\n .then(resolve)\n .catch((error) => {\n // cleanup\n instances.forEach((instance) => {\n (instance as FabricObject).dispose &&\n (instance as FabricObject).dispose();\n });\n reject(error);\n })\n .finally(() => {\n signal && signal.removeEventListener('abort', reject);\n });\n });\n\n/**\n * Creates corresponding fabric instances residing in an object, e.g. `clipPath`\n * @param {Object} object with properties to enlive ( fill, stroke, clipPath, path )\n * @param {object} [options]\n * @param {AbortSignal} [options.signal] handle aborting, see https://developer.mozilla.org/en-US/docs/Web/API/AbortController/signal\n * @returns {Promise>} the input object with enlived values\n */\nexport const enlivenObjectEnlivables = <\n R = Record,\n>(\n serializedObject: any,\n { signal }: Abortable = {},\n) =>\n new Promise((resolve, reject) => {\n const instances: (FabricObject | TFiller | Shadow)[] = [];\n signal && signal.addEventListener('abort', reject, { once: true });\n // enlive every possible property\n const promises = Object.values(serializedObject).map((value: any) => {\n if (!value) {\n return value;\n }\n /**\n * clipPath or shadow or gradient or text on a path or a pattern,\n * or the backgroundImage or overlayImage of canvas\n * If we have a type and there is a classe registered for it, we enlive it.\n * If there is no class registered for it we return the value as is\n * */\n if (value.type && classRegistry.has(value.type)) {\n return enlivenObjects([value], {\n signal,\n }).then(([enlived]) => {\n instances.push(enlived);\n return enlived;\n });\n }\n return value;\n });\n const keys = Object.keys(serializedObject);\n Promise.all(promises)\n .then((enlived) => {\n return enlived.reduce((acc, instance, index) => {\n acc[keys[index]] = instance;\n return acc;\n }, {});\n })\n .then(resolve)\n .catch((error) => {\n // cleanup\n instances.forEach((instance: any) => {\n instance.dispose && instance.dispose();\n });\n reject(error);\n })\n .finally(() => {\n signal && signal.removeEventListener('abort', reject);\n });\n });\n","/**\n * Populates an object with properties of another object\n * @param {Object} source Source object\n * @param {string[]} properties Properties names to include\n * @returns object populated with the picked keys\n */\nexport const pick = >(\n source: T,\n keys: (keyof T)[] = [],\n) => {\n return keys.reduce((o, key) => {\n if (key in source) {\n o[key] = source[key];\n }\n return o;\n }, {} as Partial);\n};\n\nexport const pickBy = >(\n source: T,\n predicate: (value: T[K], key: K, collection: T) => boolean,\n) => {\n return (Object.keys(source) as (keyof T)[]).reduce((o, key) => {\n if (predicate(source[key], key, source)) {\n o[key] = source[key];\n }\n return o;\n }, {} as Partial);\n};\n","/**\n * A wrapper around Number#toFixed, which contrary to native method returns number, not string.\n * @param {number|string} number number to operate on\n * @param {number} fractionDigits number of fraction digits to \"leave\"\n * @return {number}\n */\nexport const toFixed = (number: number | string, fractionDigits: number) =>\n parseFloat(Number(number).toFixed(fractionDigits));\n","import type { TMat2D } from '../../typedefs';\nimport { toFixed } from './toFixed';\nimport { config } from '../../config';\n\n/**\n * given an array of 6 number returns something like `\"matrix(...numbers)\"`\n * @param {TMat2D} transform an array with 6 numbers\n * @return {String} transform matrix for svg\n */\nexport const matrixToSVG = (transform: TMat2D) =>\n 'matrix(' +\n transform\n .map((value) => toFixed(value, config.NUM_FRACTION_DIGITS))\n .join(' ') +\n ')';\n","import type { FabricObject } from '../shapes/Object/Object';\nimport type { TFiller } from '../typedefs';\nimport type { FabricText } from '../shapes/Text/Text';\nimport type { Pattern } from '../Pattern';\nimport type { Path } from '../shapes/Path';\nimport type { ActiveSelection } from '../shapes/ActiveSelection';\n\nexport const isFiller = (\n filler: TFiller | string | null,\n): filler is TFiller => {\n return !!filler && (filler as TFiller).toLive !== undefined;\n};\n\nexport const isSerializableFiller = (\n filler: TFiller | string | null,\n): filler is TFiller => {\n return !!filler && typeof (filler as TFiller).toObject === 'function';\n};\n\nexport const isPattern = (filler: TFiller): filler is Pattern => {\n return (\n !!filler && (filler as Pattern).offsetX !== undefined && 'source' in filler\n );\n};\n\nexport const isTextObject = (\n fabricObject?: FabricObject,\n): fabricObject is FabricText => {\n return (\n !!fabricObject &&\n typeof (fabricObject as FabricText)._renderText === 'function'\n );\n};\n\nexport const isPath = (fabricObject?: FabricObject): fabricObject is Path => {\n // we could use instanceof but that would mean pulling in Text code for a simple check\n // @todo discuss what to do and how to do\n return (\n !!fabricObject &&\n typeof (fabricObject as Path)._renderPathCommands === 'function'\n );\n};\n\nexport const isActiveSelection = (\n fabricObject?: FabricObject,\n): fabricObject is ActiveSelection =>\n !!fabricObject && 'multiSelectionStacking' in fabricObject;\n","/**\n * Returns element scroll offsets\n * @param {HTMLElement} element Element to operate on\n * @return {Object} Object with left/top values\n */\nexport function getScrollLeftTop(element: HTMLElement | null) {\n const doc = element && getDocumentFromElement(element);\n let left = 0,\n top = 0;\n if (!element || !doc) {\n return { left, top };\n }\n let elementLoop: HTMLElement | Document | ShadowRoot = element;\n const docElement = doc.documentElement,\n body = doc.body || {\n scrollLeft: 0,\n scrollTop: 0,\n };\n // While loop checks (and then sets element to) .parentNode OR .host\n // to account for ShadowDOM. We still want to traverse up out of ShadowDOM,\n // but the .parentNode of a root ShadowDOM node will always be null, instead\n // it should be accessed through .host. See http://stackoverflow.com/a/24765528/4383938\n while (\n elementLoop &&\n (elementLoop.parentNode || (elementLoop as unknown as ShadowRoot).host)\n ) {\n elementLoop = (elementLoop.parentNode ||\n (elementLoop as unknown as ShadowRoot).host) as\n | HTMLElement\n | Document\n | ShadowRoot;\n if (elementLoop === doc) {\n left = body.scrollLeft || docElement.scrollLeft || 0;\n top = body.scrollTop || docElement.scrollTop || 0;\n } else {\n left += (elementLoop as HTMLElement).scrollLeft || 0;\n top += (elementLoop as HTMLElement).scrollTop || 0;\n }\n\n if (\n elementLoop.nodeType === 1 &&\n (elementLoop as HTMLElement).style.position === 'fixed'\n ) {\n break;\n }\n }\n\n return { left, top };\n}\n\nexport const getDocumentFromElement = (el: HTMLElement) =>\n el.ownerDocument || null;\n\nexport const getWindowFromElement = (el: HTMLElement) =>\n el.ownerDocument?.defaultView || null;\n","import { NONE } from '../../constants';\nimport type { TSize } from '../../typedefs';\nimport {\n getDocumentFromElement,\n getWindowFromElement,\n getScrollLeftTop,\n} from '../../util/dom_misc';\n\nexport const setCanvasDimensions = (\n el: HTMLCanvasElement,\n ctx: CanvasRenderingContext2D,\n { width, height }: TSize,\n retinaScaling = 1,\n) => {\n el.width = width;\n el.height = height;\n if (retinaScaling > 1) {\n el.setAttribute('width', (width * retinaScaling).toString());\n el.setAttribute('height', (height * retinaScaling).toString());\n ctx.scale(retinaScaling, retinaScaling);\n }\n};\n\nexport type CSSDimensions = {\n width: number | string;\n height: number | string;\n};\n\nexport const setCSSDimensions = (\n el: HTMLElement,\n { width, height }: Partial,\n) => {\n width && (el.style.width = typeof width === 'number' ? `${width}px` : width);\n height &&\n (el.style.height = typeof height === 'number' ? `${height}px` : height);\n};\n\n/**\n * Returns offset for a given element\n * @param {HTMLElement} element Element to get offset for\n * @return {Object} Object with \"left\" and \"top\" properties\n */\nexport function getElementOffset(element: HTMLElement) {\n const doc = element && getDocumentFromElement(element),\n offset = { left: 0, top: 0 };\n\n if (!doc) {\n return offset;\n }\n const elemStyle: CSSStyleDeclaration =\n getWindowFromElement(element)?.getComputedStyle(element, null) ||\n ({} as CSSStyleDeclaration);\n offset.left += parseInt(elemStyle.borderLeftWidth, 10) || 0;\n offset.top += parseInt(elemStyle.borderTopWidth, 10) || 0;\n offset.left += parseInt(elemStyle.paddingLeft, 10) || 0;\n offset.top += parseInt(elemStyle.paddingTop, 10) || 0;\n\n let box = { left: 0, top: 0 };\n\n const docElem = doc.documentElement;\n if (typeof element.getBoundingClientRect !== 'undefined') {\n box = element.getBoundingClientRect();\n }\n\n const scrollLeftTop = getScrollLeftTop(element);\n\n return {\n left:\n box.left + scrollLeftTop.left - (docElem.clientLeft || 0) + offset.left,\n top: box.top + scrollLeftTop.top - (docElem.clientTop || 0) + offset.top,\n };\n}\n\n/**\n * Makes element unselectable\n * @param {HTMLElement} element Element to make unselectable\n * @return {HTMLElement} Element that was passed in\n */\nexport function makeElementUnselectable(element: HTMLElement) {\n if (typeof element.onselectstart !== 'undefined') {\n element.onselectstart = () => false;\n }\n element.style.userSelect = NONE;\n return element;\n}\n","import { getEnv, getFabricDocument } from '../../env';\nimport type { TSize } from '../../typedefs';\nimport type { CSSDimensions } from './util';\nimport { setCSSDimensions, getElementOffset } from './util';\nimport { createCanvasElement, isHTMLCanvas } from '../../util/misc/dom';\nimport { setCanvasDimensions } from './util';\nimport { FabricError } from '../../util/internals/console';\n\nexport type CanvasItem = {\n el: HTMLCanvasElement;\n ctx: CanvasRenderingContext2D;\n};\n\nexport class StaticCanvasDOMManager {\n /**\n * Keeps a copy of the canvas style before setting retina scaling and other potions\n * in order to return it to original state on dispose\n * @type string\n */\n private _originalCanvasStyle?: string;\n\n lower: CanvasItem;\n\n constructor(arg0?: string | HTMLCanvasElement) {\n const el = this.createLowerCanvas(arg0);\n this.lower = { el, ctx: el.getContext('2d')! };\n }\n\n protected createLowerCanvas(arg0?: HTMLCanvasElement | string) {\n // canvasEl === 'HTMLCanvasElement' does not work on jsdom/node\n const el = isHTMLCanvas(arg0)\n ? arg0\n : (arg0 &&\n (getFabricDocument().getElementById(arg0) as HTMLCanvasElement)) ||\n createCanvasElement();\n if (el.hasAttribute('data-fabric')) {\n throw new FabricError(\n 'Trying to initialize a canvas that has already been initialized. Did you forget to dispose the canvas?',\n );\n }\n this._originalCanvasStyle = el.style.cssText;\n el.setAttribute('data-fabric', 'main');\n el.classList.add('lower-canvas');\n return el;\n }\n\n cleanupDOM({ width, height }: TSize) {\n const { el } = this.lower;\n // restore canvas style and attributes\n el.classList.remove('lower-canvas');\n el.removeAttribute('data-fabric');\n // restore canvas size to original size in case retina scaling was applied\n el.setAttribute('width', `${width}`);\n el.setAttribute('height', `${height}`);\n el.style.cssText = this._originalCanvasStyle || '';\n this._originalCanvasStyle = undefined;\n }\n\n setDimensions(size: TSize, retinaScaling: number) {\n const { el, ctx } = this.lower;\n setCanvasDimensions(el, ctx, size, retinaScaling);\n }\n\n setCSSDimensions(size: Partial) {\n setCSSDimensions(this.lower.el, size);\n }\n\n /**\n * Calculates canvas element offset relative to the document\n */\n calcOffset() {\n return getElementOffset(this.lower.el);\n }\n\n dispose() {\n getEnv().dispose(this.lower.el);\n // @ts-expect-error disposing\n delete this.lower;\n }\n}\n","import { iMatrix } from '../constants';\nimport type { FabricObject } from '../shapes/Object/FabricObject';\nimport type { TFiller, TMat2D, TOptions } from '../typedefs';\n\ninterface CanvasDrawableOptions {\n /**\n * if set to false background image is not affected by viewport transform\n * @since 1.6.3\n * @type Boolean\n * @todo we should really find a different way to do this\n */\n backgroundVpt: boolean;\n\n /**\n * Background color of canvas instance.\n * @type {(String|TFiller)}\n */\n backgroundColor: TFiller | string;\n\n /**\n * Background image of canvas instance.\n * since 2.4.0 image caching is active, please when putting an image as background, add to the\n * canvas property a reference to the canvas it is on. Otherwise the image cannot detect the zoom\n * vale. As an alternative you can disable image objectCaching\n * @type FabricObject\n */\n backgroundImage?: FabricObject;\n\n /**\n * if set to false overlay image is not affected by viewport transform\n * @since 1.6.3\n * @type Boolean\n * @todo we should really find a different way to do this\n */\n overlayVpt: boolean;\n\n /**\n * Overlay color of canvas instance.\n * @since 1.3.9\n * @type {(String|TFiller)}\n */\n overlayColor: TFiller | string;\n\n /**\n * Overlay image of canvas instance.\n * since 2.4.0 image caching is active, please when putting an image as overlay, add to the\n * canvas property a reference to the canvas it is on. Otherwise the image cannot detect the zoom\n * vale. As an alternative you can disable image objectCaching\n * @type FabricObject\n */\n overlayImage?: FabricObject;\n}\n\ninterface CanvasRenderingOptions {\n /**\n * Indicates whether {@link StaticCanvas#add}, {@link StaticCanvas#insertAt} and {@link StaticCanvas#remove},\n * {@link StaticCanvas#moveTo}, {@link StaticCanvas#clear} and many more, should also re-render canvas.\n * Disabling this option will not give a performance boost when adding/removing a lot of objects to/from canvas at once\n * since the renders are queued and executed one per frame.\n * Disabling is suggested anyway and managing the renders of the app manually is not a big effort ( canvas.requestRenderAll() )\n * Left default to true to do not break documentation and old app, fiddles.\n * @type Boolean\n */\n renderOnAddRemove: boolean;\n\n /**\n * Based on vptCoords and object.aCoords, skip rendering of objects that\n * are not included in current viewport.\n * May greatly help in applications with crowded canvas and use of zoom/pan\n * If One of the corner of the bounding box of the object is on the canvas\n * the objects get rendered.\n * @type Boolean\n * @default true\n */\n skipOffscreen: boolean;\n\n /**\n * When true, canvas is scaled by devicePixelRatio for better rendering on retina screens\n * @type Boolean\n */\n enableRetinaScaling: boolean;\n\n /**\n * Indicates whether this canvas will use image smoothing, this is on by default in browsers\n * @type Boolean\n */\n imageSmoothingEnabled: boolean;\n\n /**\n * a fabricObject that, without stroke define a clipping area with their shape. filled in black\n * the clipPath object gets used when the canvas has rendered, and the context is placed in the\n * top left corner of the canvas.\n * clipPath will clip away controls, if you do not want this to happen use controlsAboveOverlay = true\n * @type FabricObject\n */\n clipPath?: FabricObject;\n}\n\nexport interface CanvasExportOptions {\n /**\n * Indicates whether toObject/toDatalessObject should include default values\n * if set to false, takes precedence over the object value.\n * @type Boolean\n */\n includeDefaultValues: boolean;\n\n /**\n * When true, getSvgTransform() will apply the StaticCanvas.viewportTransform to the SVG transformation. When true,\n * a zoomed canvas will then produce zoomed SVG output.\n * @type Boolean\n */\n svgViewportTransformation: boolean;\n}\n\nexport interface StaticCanvasOptions\n extends CanvasDrawableOptions,\n CanvasRenderingOptions,\n CanvasExportOptions {\n /**\n * Width in virtual/logical pixels of the canvas.\n * The canvas can be larger than width if retina scaling is active\n * @type number\n */\n width: number;\n\n /**\n * Height in virtual/logical pixels of the canvas.\n * The canvas can be taller than width if retina scaling is active\n * @type height\n */\n height: number;\n\n /**\n * Indicates whether object controls (borders/controls) are rendered above overlay image\n * @type Boolean\n *\n * @todo move to Canvas\n */\n controlsAboveOverlay: boolean;\n\n /**\n * Indicates whether the browser can be scrolled when using a touchscreen and dragging on the canvas\n * It gives PRIORITY to DOM scrolling, it doesn't make it always possible.\n * If is true, when using a touch event on the canvas, the canvas will scroll if scroll is possible.\n * If we are in drawing mode or if we are selecting an object the canvas preventDefault and so it won't scroll\n * @type Boolean\n *\n * @todo move to Canvas\n */\n allowTouchScrolling: boolean;\n\n /**\n * The transformation (a Canvas 2D API transform matrix) which focuses the viewport\n * @type Array\n * @example Default transform\n * canvas.viewportTransform = [1, 0, 0, 1, 0, 0];\n * @example Scale by 70% and translate toward bottom-right by 50, without skewing\n * canvas.viewportTransform = [0.7, 0, 0, 0.7, 50, 50];\n */\n viewportTransform: TMat2D;\n}\n\nexport const staticCanvasDefaults: TOptions = {\n backgroundVpt: true,\n backgroundColor: '',\n overlayVpt: true,\n overlayColor: '',\n\n includeDefaultValues: true,\n svgViewportTransformation: true,\n\n renderOnAddRemove: true,\n skipOffscreen: true,\n enableRetinaScaling: true,\n imageSmoothingEnabled: true,\n\n /**\n * @todo move to Canvas\n */\n controlsAboveOverlay: false,\n /**\n * @todo move to Canvas\n */\n allowTouchScrolling: false,\n\n viewportTransform: [...iMatrix],\n};\n","import { config } from '../config';\nimport { CENTER, VERSION } from '../constants';\nimport type { CanvasEvents, StaticCanvasEvents } from '../EventTypeDefs';\nimport type { Gradient } from '../gradient/Gradient';\nimport { createCollectionMixin, isCollection } from '../Collection';\nimport { CommonMethods } from '../CommonMethods';\nimport type { Pattern } from '../Pattern';\nimport { Point } from '../Point';\nimport type { TCachedFabricObject } from '../shapes/Object/Object';\nimport type {\n Abortable,\n Constructor,\n TCornerPoint,\n TDataUrlOptions,\n TFiller,\n TMat2D,\n TSize,\n TSVGReviver,\n TToCanvasElementOptions,\n TValidToObjectMethod,\n TOptions,\n} from '../typedefs';\nimport {\n cancelAnimFrame,\n requestAnimFrame,\n} from '../util/animation/AnimationFrameProvider';\nimport { runningAnimations } from '../util/animation/AnimationRegistry';\nimport { uid } from '../util/internals/uid';\nimport { createCanvasElementFor, toBlob, toDataURL } from '../util/misc/dom';\nimport { invertTransform, transformPoint } from '../util/misc/matrix';\nimport type { EnlivenObjectOptions } from '../util/misc/objectEnlive';\nimport {\n enlivenObjectEnlivables,\n enlivenObjects,\n} from '../util/misc/objectEnlive';\nimport { pick } from '../util/misc/pick';\nimport { matrixToSVG } from '../util/misc/svgExport';\nimport { toFixed } from '../util/misc/toFixed';\nimport { isFiller, isPattern, isTextObject } from '../util/typeAssertions';\nimport { StaticCanvasDOMManager } from './DOMManagers/StaticCanvasDOMManager';\nimport type { CSSDimensions } from './DOMManagers/util';\nimport type { FabricObject } from '../shapes/Object/FabricObject';\nimport type { StaticCanvasOptions } from './StaticCanvasOptions';\nimport { staticCanvasDefaults } from './StaticCanvasOptions';\nimport { log, FabricError } from '../util/internals/console';\nimport { getDevicePixelRatio } from '../env';\n\n/**\n * Having both options in TCanvasSizeOptions set to true transform the call in a calcOffset\n * Better try to restrict with types to avoid confusion.\n */\nexport type TCanvasSizeOptions =\n | {\n backstoreOnly?: true;\n cssOnly?: false;\n }\n | {\n backstoreOnly?: false;\n cssOnly?: true;\n };\n\nexport type TSVGExportOptions = {\n suppressPreamble?: boolean;\n viewBox?: {\n x: number;\n y: number;\n width: number;\n height: number;\n };\n encoding?: 'UTF-8'; // test Encoding type and see what happens\n width?: string;\n height?: string;\n reviver?: TSVGReviver;\n};\n\n/**\n * Static canvas class\n * @see {@link http://fabric5.fabricjs.com/static_canvas|StaticCanvas demo}\n * @fires before:render\n * @fires after:render\n * @fires canvas:cleared\n * @fires object:added\n * @fires object:removed\n */\n// TODO: fix `EventSpec` inheritance https://github.com/microsoft/TypeScript/issues/26154#issuecomment-1366616260\nexport class StaticCanvas<\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n EventSpec extends StaticCanvasEvents = StaticCanvasEvents,\n >\n extends createCollectionMixin(CommonMethods)\n implements StaticCanvasOptions\n{\n declare width: number;\n declare height: number;\n\n // background\n declare backgroundVpt: boolean;\n declare backgroundColor: TFiller | string;\n declare backgroundImage?: FabricObject;\n // overlay\n declare overlayVpt: boolean;\n declare overlayColor: TFiller | string;\n declare overlayImage?: FabricObject;\n\n declare clipPath?: FabricObject;\n\n declare includeDefaultValues: boolean;\n\n // rendering config\n declare renderOnAddRemove: boolean;\n declare skipOffscreen: boolean;\n declare enableRetinaScaling: boolean;\n declare imageSmoothingEnabled: boolean;\n\n /**\n * @todo move to Canvas\n */\n declare controlsAboveOverlay: boolean;\n\n /**\n * @todo move to Canvas\n */\n declare allowTouchScrolling: boolean;\n\n declare viewportTransform: TMat2D;\n\n /**\n * The viewport bounding box in scene plane coordinates, see {@link calcViewportBoundaries}\n */\n declare vptCoords: TCornerPoint;\n\n /**\n * A reference to the canvas actual HTMLCanvasElement.\n * Can be use to read the raw pixels, but never write or manipulate\n * @type HTMLCanvasElement\n */\n get lowerCanvasEl() {\n return this.elements.lower?.el;\n }\n\n get contextContainer() {\n return this.elements.lower?.ctx;\n }\n\n /**\n * If true the Canvas is in the process or has been disposed/destroyed.\n * No more rendering operation will be executed on this canvas.\n * @type boolean\n */\n declare destroyed?: boolean;\n\n /**\n * Started the process of disposing but not done yet.\n * WIll likely complete the render cycle already scheduled but stopping adding more.\n * @type boolean\n */\n declare disposed?: boolean;\n\n declare _offset: { left: number; top: number };\n declare protected hasLostContext: boolean;\n declare protected nextRenderHandle: number;\n\n declare elements: StaticCanvasDOMManager;\n\n /**\n * When true control drawing is skipped.\n * This boolean is used to avoid toDataURL to export controls.\n * Usage of this boolean to build up other flows and features is not supported\n * @type Boolean\n * @default false\n */\n declare protected skipControlsDrawing: boolean;\n\n static ownDefaults = staticCanvasDefaults;\n\n // reference to\n declare protected __cleanupTask?: {\n (): void;\n kill: (reason?: any) => void;\n };\n\n static getDefaults(): Record {\n return StaticCanvas.ownDefaults;\n }\n\n constructor(\n el?: string | HTMLCanvasElement,\n options: TOptions = {},\n ) {\n super();\n Object.assign(\n this,\n (this.constructor as typeof StaticCanvas).getDefaults(),\n );\n this.set(options);\n this.initElements(el);\n this._setDimensionsImpl({\n width: this.width || this.elements.lower.el.width || 0,\n height: this.height || this.elements.lower.el.height || 0,\n });\n this.skipControlsDrawing = false;\n this.viewportTransform = [...this.viewportTransform];\n this.calcViewportBoundaries();\n }\n\n protected initElements(el?: string | HTMLCanvasElement) {\n this.elements = new StaticCanvasDOMManager(el);\n }\n\n add(...objects: FabricObject[]) {\n const size = super.add(...objects);\n objects.length > 0 && this.renderOnAddRemove && this.requestRenderAll();\n return size;\n }\n\n insertAt(index: number, ...objects: FabricObject[]) {\n const size = super.insertAt(index, ...objects);\n objects.length > 0 && this.renderOnAddRemove && this.requestRenderAll();\n return size;\n }\n\n remove(...objects: FabricObject[]) {\n const removed = super.remove(...objects);\n removed.length > 0 && this.renderOnAddRemove && this.requestRenderAll();\n return removed;\n }\n\n _onObjectAdded(obj: FabricObject) {\n if (obj.canvas && (obj.canvas as StaticCanvas) !== this) {\n log(\n 'warn',\n 'Canvas is trying to add an object that belongs to a different canvas.\\n' +\n 'Resulting to default behavior: removing object from previous canvas and adding to new canvas',\n );\n obj.canvas.remove(obj);\n }\n obj._set('canvas', this);\n obj.setCoords();\n this.fire('object:added', { target: obj });\n obj.fire('added', { target: this });\n }\n\n _onObjectRemoved(obj: FabricObject) {\n obj._set('canvas', undefined);\n this.fire('object:removed', { target: obj });\n obj.fire('removed', { target: this });\n }\n\n _onStackOrderChanged() {\n this.renderOnAddRemove && this.requestRenderAll();\n }\n\n /**\n * @private\n * @see https://developer.apple.com/library/safari/documentation/AudioVideo/Conceptual/HTML-canvas-guide/SettingUptheCanvas/SettingUptheCanvas.html\n * @return {Number} retinaScaling if applied, otherwise 1;\n */\n getRetinaScaling() {\n return this.enableRetinaScaling ? getDevicePixelRatio() : 1;\n }\n\n /**\n * Calculates canvas element offset relative to the document\n * This method is also attached as \"resize\" event handler of window\n */\n calcOffset() {\n return (this._offset = this.elements.calcOffset());\n }\n\n /**\n * Returns canvas width (in px)\n * @return {Number}\n */\n getWidth(): number {\n return this.width;\n }\n\n /**\n * Returns canvas height (in px)\n * @return {Number}\n */\n getHeight(): number {\n return this.height;\n }\n\n /**\n * Internal use only\n * @protected\n */\n protected _setDimensionsImpl(\n dimensions: Partial,\n { cssOnly = false, backstoreOnly = false }: TCanvasSizeOptions = {},\n ) {\n if (!cssOnly) {\n const size = {\n width: this.width,\n height: this.height,\n ...(dimensions as Partial),\n };\n this.elements.setDimensions(size, this.getRetinaScaling());\n this.hasLostContext = true;\n this.width = size.width;\n this.height = size.height;\n }\n if (!backstoreOnly) {\n this.elements.setCSSDimensions(dimensions);\n }\n\n this.calcOffset();\n }\n\n /**\n * Sets dimensions (width, height) of this canvas instance. when options.cssOnly flag active you should also supply the unit of measure (px/%/em)\n * @param {Object} dimensions Object with width/height properties\n * @param {Number|String} [dimensions.width] Width of canvas element\n * @param {Number|String} [dimensions.height] Height of canvas element\n * @param {Object} [options] Options object\n * @param {Boolean} [options.backstoreOnly=false] Set the given dimensions only as canvas backstore dimensions\n * @param {Boolean} [options.cssOnly=false] Set the given dimensions only as css dimensions\n */\n setDimensions(\n dimensions: Partial,\n options?: { cssOnly?: true; backstoreOnly?: false },\n ): void;\n setDimensions(\n dimensions: Partial,\n options?: { backstoreOnly?: true; cssOnly?: false },\n ): void;\n setDimensions(dimensions: Partial, options?: never): void;\n setDimensions(\n dimensions: Partial,\n options?: TCanvasSizeOptions,\n ) {\n this._setDimensionsImpl(dimensions, options);\n if (!options || !options.cssOnly) {\n this.requestRenderAll();\n }\n }\n\n /**\n * Returns canvas zoom level\n * @return {Number}\n */\n getZoom() {\n return this.viewportTransform[0];\n }\n\n /**\n * Sets viewport transformation of this canvas instance\n * @param {Array} vpt a Canvas 2D API transform matrix\n */\n setViewportTransform(vpt: TMat2D) {\n this.viewportTransform = vpt;\n this.calcViewportBoundaries();\n this.renderOnAddRemove && this.requestRenderAll();\n }\n\n /**\n * Sets zoom level of this canvas instance, the zoom centered around point\n * meaning that following zoom to point with the same point will have the visual\n * effect of the zoom originating from that point. The point won't move.\n * It has nothing to do with canvas center or visual center of the viewport.\n * @param {Point} point to zoom with respect to\n * @param {Number} value to set zoom to, less than 1 zooms out\n */\n zoomToPoint(point: Point, value: number) {\n // TODO: just change the scale, preserve other transformations\n const before = point,\n vpt: TMat2D = [...this.viewportTransform];\n const newPoint = transformPoint(point, invertTransform(vpt));\n vpt[0] = value;\n vpt[3] = value;\n const after = transformPoint(newPoint, vpt);\n vpt[4] += before.x - after.x;\n vpt[5] += before.y - after.y;\n this.setViewportTransform(vpt);\n }\n\n /**\n * Sets zoom level of this canvas instance\n * @param {Number} value to set zoom to, less than 1 zooms out\n */\n setZoom(value: number) {\n this.zoomToPoint(new Point(0, 0), value);\n }\n\n /**\n * Pan viewport so as to place point at top left corner of canvas\n * @param {Point} point to move to\n */\n absolutePan(point: Point) {\n const vpt: TMat2D = [...this.viewportTransform];\n vpt[4] = -point.x;\n vpt[5] = -point.y;\n return this.setViewportTransform(vpt);\n }\n\n /**\n * Pans viewpoint relatively\n * @param {Point} point (position vector) to move by\n */\n relativePan(point: Point) {\n return this.absolutePan(\n new Point(\n -point.x - this.viewportTransform[4],\n -point.y - this.viewportTransform[5],\n ),\n );\n }\n\n /**\n * Returns <canvas> element corresponding to this instance\n * @return {HTMLCanvasElement}\n */\n getElement(): HTMLCanvasElement {\n return this.elements.lower.el;\n }\n\n /**\n * Clears specified context of canvas element\n * @param {CanvasRenderingContext2D} ctx Context to clear\n */\n clearContext(ctx: CanvasRenderingContext2D) {\n ctx.clearRect(0, 0, this.width, this.height);\n }\n\n /**\n * Returns context of canvas where objects are drawn\n * @return {CanvasRenderingContext2D}\n */\n getContext(): CanvasRenderingContext2D {\n return this.elements.lower.ctx;\n }\n\n /**\n * Clears all contexts (background, main, top) of an instance\n */\n clear() {\n this.remove(...this.getObjects());\n this.backgroundImage = undefined;\n this.overlayImage = undefined;\n this.backgroundColor = '';\n this.overlayColor = '';\n this.clearContext(this.getContext());\n this.fire('canvas:cleared');\n this.renderOnAddRemove && this.requestRenderAll();\n }\n\n /**\n * Renders the canvas\n */\n renderAll() {\n this.cancelRequestedRender();\n if (this.destroyed) {\n return;\n }\n this.renderCanvas(this.getContext(), this._objects);\n }\n\n /**\n * Function created to be instance bound at initialization\n * used in requestAnimationFrame rendering\n * Let the fabricJS call it. If you call it manually you could have more\n * animationFrame stacking on to of each other\n * for an imperative rendering, use canvas.renderAll\n * @private\n */\n renderAndReset() {\n this.nextRenderHandle = 0;\n this.renderAll();\n }\n\n /**\n * Append a renderAll request to next animation frame.\n * unless one is already in progress, in that case nothing is done\n * a boolean flag will avoid appending more.\n */\n requestRenderAll() {\n if (!this.nextRenderHandle && !this.disposed && !this.destroyed) {\n this.nextRenderHandle = requestAnimFrame(() => this.renderAndReset());\n }\n }\n\n /**\n * Calculate the position of the 4 corner of canvas with current viewportTransform.\n * helps to determinate when an object is in the current rendering viewport\n */\n calcViewportBoundaries(): TCornerPoint {\n const width = this.width,\n height = this.height,\n iVpt = invertTransform(this.viewportTransform),\n a = transformPoint({ x: 0, y: 0 }, iVpt),\n b = transformPoint({ x: width, y: height }, iVpt),\n // we don't support vpt flipping\n // but the code is robust enough to mostly work with flipping\n min = a.min(b),\n max = a.max(b);\n return (this.vptCoords = {\n tl: min,\n tr: new Point(max.x, min.y),\n bl: new Point(min.x, max.y),\n br: max,\n });\n }\n\n cancelRequestedRender() {\n if (this.nextRenderHandle) {\n cancelAnimFrame(this.nextRenderHandle);\n this.nextRenderHandle = 0;\n }\n }\n\n drawControls(_ctx: CanvasRenderingContext2D) {\n // Static canvas has no controls\n }\n\n /**\n * Renders background, objects, overlay and controls.\n * @param {CanvasRenderingContext2D} ctx\n * @param {Array} objects to render\n */\n renderCanvas(ctx: CanvasRenderingContext2D, objects: FabricObject[]) {\n if (this.destroyed) {\n return;\n }\n\n const v = this.viewportTransform,\n path = this.clipPath;\n this.calcViewportBoundaries();\n this.clearContext(ctx);\n ctx.imageSmoothingEnabled = this.imageSmoothingEnabled;\n // @ts-expect-error node-canvas stuff\n ctx.patternQuality = 'best';\n this.fire('before:render', { ctx });\n this._renderBackground(ctx);\n\n ctx.save();\n //apply viewport transform once for all rendering process\n ctx.transform(v[0], v[1], v[2], v[3], v[4], v[5]);\n this._renderObjects(ctx, objects);\n ctx.restore();\n if (!this.controlsAboveOverlay && !this.skipControlsDrawing) {\n this.drawControls(ctx);\n }\n if (path) {\n path._set('canvas', this);\n // needed to setup a couple of variables\n // todo migrate to the newer one\n path.shouldCache();\n path._transformDone = true;\n (path as TCachedFabricObject).renderCache({ forClipping: true });\n this.drawClipPathOnCanvas(ctx, path as TCachedFabricObject);\n }\n this._renderOverlay(ctx);\n if (this.controlsAboveOverlay && !this.skipControlsDrawing) {\n this.drawControls(ctx);\n }\n this.fire('after:render', { ctx });\n\n if (this.__cleanupTask) {\n this.__cleanupTask();\n this.__cleanupTask = undefined;\n }\n }\n\n /**\n * Paint the cached clipPath on the lowerCanvasEl\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n drawClipPathOnCanvas(\n ctx: CanvasRenderingContext2D,\n clipPath: TCachedFabricObject,\n ) {\n const v = this.viewportTransform;\n ctx.save();\n ctx.transform(...v);\n // DEBUG: uncomment this line, comment the following\n // ctx.globalAlpha = 0.4;\n ctx.globalCompositeOperation = 'destination-in';\n clipPath.transform(ctx);\n ctx.scale(1 / clipPath.zoomX, 1 / clipPath.zoomY);\n ctx.drawImage(\n clipPath._cacheCanvas,\n -clipPath.cacheTranslationX,\n -clipPath.cacheTranslationY,\n );\n ctx.restore();\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n * @param {Array} objects to render\n */\n _renderObjects(ctx: CanvasRenderingContext2D, objects: FabricObject[]) {\n for (let i = 0, len = objects.length; i < len; ++i) {\n objects[i] && objects[i].render(ctx);\n }\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n * @param {string} property 'background' or 'overlay'\n */\n _renderBackgroundOrOverlay(\n ctx: CanvasRenderingContext2D,\n property: 'background' | 'overlay',\n ) {\n const fill = this[`${property}Color`],\n object = this[`${property}Image`],\n v = this.viewportTransform,\n needsVpt = this[`${property}Vpt`];\n if (!fill && !object) {\n return;\n }\n const isAFiller = isFiller(fill);\n if (fill) {\n ctx.save();\n ctx.beginPath();\n ctx.moveTo(0, 0);\n ctx.lineTo(this.width, 0);\n ctx.lineTo(this.width, this.height);\n ctx.lineTo(0, this.height);\n ctx.closePath();\n ctx.fillStyle = isAFiller ? fill.toLive(ctx /* this */)! : fill;\n if (needsVpt) {\n ctx.transform(...v);\n }\n if (isAFiller) {\n ctx.transform(1, 0, 0, 1, fill.offsetX || 0, fill.offsetY || 0);\n const m = ((fill as Gradient<'linear'>).gradientTransform ||\n (fill as Pattern).patternTransform) as TMat2D;\n m && ctx.transform(...m);\n }\n ctx.fill();\n ctx.restore();\n }\n if (object) {\n ctx.save();\n const { skipOffscreen } = this;\n // if the object doesn't move with the viewport,\n // the offscreen concept does not apply;\n this.skipOffscreen = needsVpt;\n if (needsVpt) {\n ctx.transform(...v);\n }\n object.render(ctx);\n this.skipOffscreen = skipOffscreen;\n ctx.restore();\n }\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _renderBackground(ctx: CanvasRenderingContext2D) {\n this._renderBackgroundOrOverlay(ctx, 'background');\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _renderOverlay(ctx: CanvasRenderingContext2D) {\n this._renderBackgroundOrOverlay(ctx, 'overlay');\n }\n\n /**\n * Returns coordinates of a center of canvas.\n * @return {Point}\n */\n getCenterPoint() {\n return new Point(this.width / 2, this.height / 2);\n }\n\n /**\n * Centers object horizontally in the canvas\n */\n centerObjectH(object: FabricObject) {\n return this._centerObject(\n object,\n new Point(this.getCenterPoint().x, object.getCenterPoint().y),\n );\n }\n\n /**\n * Centers object vertically in the canvas\n * @param {FabricObject} object Object to center vertically\n */\n centerObjectV(object: FabricObject) {\n return this._centerObject(\n object,\n new Point(object.getCenterPoint().x, this.getCenterPoint().y),\n );\n }\n\n /**\n * Centers object vertically and horizontally in the canvas\n * @param {FabricObject} object Object to center vertically and horizontally\n */\n centerObject(object: FabricObject) {\n return this._centerObject(object, this.getCenterPoint());\n }\n\n /**\n * Centers object vertically and horizontally in the viewport\n * @param {FabricObject} object Object to center vertically and horizontally\n */\n viewportCenterObject(object: FabricObject) {\n return this._centerObject(object, this.getVpCenter());\n }\n\n /**\n * Centers object horizontally in the viewport, object.top is unchanged\n * @param {FabricObject} object Object to center vertically and horizontally\n */\n viewportCenterObjectH(object: FabricObject) {\n return this._centerObject(\n object,\n new Point(this.getVpCenter().x, object.getCenterPoint().y),\n );\n }\n\n /**\n * Centers object Vertically in the viewport, object.top is unchanged\n * @param {FabricObject} object Object to center vertically and horizontally\n */\n viewportCenterObjectV(object: FabricObject) {\n return this._centerObject(\n object,\n new Point(object.getCenterPoint().x, this.getVpCenter().y),\n );\n }\n\n /**\n * Calculate the point in canvas that correspond to the center of actual viewport.\n * @return {Point} vpCenter, viewport center\n */\n getVpCenter(): Point {\n return transformPoint(\n this.getCenterPoint(),\n invertTransform(this.viewportTransform),\n );\n }\n\n /**\n * @private\n * @param {FabricObject} object Object to center\n * @param {Point} center Center point\n */\n _centerObject(object: FabricObject, center: Point) {\n object.setXY(center, CENTER, CENTER);\n object.setCoords();\n this.renderOnAddRemove && this.requestRenderAll();\n }\n\n /**\n * Returns dataless JSON representation of canvas\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {String} json string\n */\n toDatalessJSON(propertiesToInclude?: string[]) {\n return this.toDatalessObject(propertiesToInclude);\n }\n\n /**\n * Returns object representation of canvas\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} object representation of an instance\n */\n toObject(propertiesToInclude?: string[]) {\n return this._toObjectMethod('toObject', propertiesToInclude);\n }\n\n /**\n * Returns Object representation of canvas\n * this alias is provided because if you call JSON.stringify on an instance,\n * the toJSON object will be invoked if it exists.\n * Having a toJSON method means you can do JSON.stringify(myCanvas)\n * JSON does not support additional properties because toJSON has its own signature\n * @return {Object} JSON compatible object\n * @see {@link http://fabric5.fabricjs.com/fabric-intro-part-3#serialization}\n * @see {@link http://jsfiddle.net/fabricjs/pec86/|jsFiddle demo}\n * @example JSON representation of canvas \n * const json = canvas.toJSON();\n * @example JSON representation of canvas \n * const json = JSON.stringify(canvas);\n */\n toJSON() {\n return this.toObject();\n }\n\n /**\n * Returns dataless object representation of canvas\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} object representation of an instance\n */\n toDatalessObject(propertiesToInclude?: string[]) {\n return this._toObjectMethod('toDatalessObject', propertiesToInclude);\n }\n\n /**\n * @private\n */\n _toObjectMethod(\n methodName: TValidToObjectMethod,\n propertiesToInclude?: string[],\n ) {\n const clipPath = this.clipPath;\n const clipPathData =\n clipPath && !clipPath.excludeFromExport\n ? this._toObject(clipPath, methodName, propertiesToInclude)\n : null;\n return {\n version: VERSION,\n ...pick(this, propertiesToInclude as (keyof this)[]),\n objects: this._objects\n .filter((object) => !object.excludeFromExport)\n .map((instance) =>\n this._toObject(instance, methodName, propertiesToInclude),\n ),\n ...this.__serializeBgOverlay(methodName, propertiesToInclude),\n ...(clipPathData ? { clipPath: clipPathData } : null),\n };\n }\n\n /**\n * @private\n */\n protected _toObject(\n instance: FabricObject,\n methodName: TValidToObjectMethod,\n propertiesToInclude?: string[],\n ) {\n let originalValue;\n\n if (!this.includeDefaultValues) {\n originalValue = instance.includeDefaultValues;\n instance.includeDefaultValues = false;\n }\n\n const object = instance[methodName](propertiesToInclude);\n if (!this.includeDefaultValues) {\n instance.includeDefaultValues = !!originalValue;\n }\n return object;\n }\n\n /**\n * @private\n */\n __serializeBgOverlay(\n methodName: TValidToObjectMethod,\n propertiesToInclude?: string[],\n ) {\n const data: any = {},\n bgImage = this.backgroundImage,\n overlayImage = this.overlayImage,\n bgColor = this.backgroundColor,\n overlayColor = this.overlayColor;\n\n if (isFiller(bgColor)) {\n if (!bgColor.excludeFromExport) {\n data.background = bgColor.toObject(propertiesToInclude);\n }\n } else if (bgColor) {\n data.background = bgColor;\n }\n\n if (isFiller(overlayColor)) {\n if (!overlayColor.excludeFromExport) {\n data.overlay = overlayColor.toObject(propertiesToInclude);\n }\n } else if (overlayColor) {\n data.overlay = overlayColor;\n }\n\n if (bgImage && !bgImage.excludeFromExport) {\n data.backgroundImage = this._toObject(\n bgImage,\n methodName,\n propertiesToInclude,\n );\n }\n if (overlayImage && !overlayImage.excludeFromExport) {\n data.overlayImage = this._toObject(\n overlayImage,\n methodName,\n propertiesToInclude,\n );\n }\n\n return data;\n }\n\n /* _TO_SVG_START_ */\n\n declare svgViewportTransformation: boolean;\n\n /**\n * Returns SVG representation of canvas\n * @param {Object} [options] Options object for SVG output\n * @param {Boolean} [options.suppressPreamble=false] If true xml tag is not included\n * @param {Object} [options.viewBox] SVG viewbox object\n * @param {Number} [options.viewBox.x] x-coordinate of viewbox\n * @param {Number} [options.viewBox.y] y-coordinate of viewbox\n * @param {Number} [options.viewBox.width] Width of viewbox\n * @param {Number} [options.viewBox.height] Height of viewbox\n * @param {String} [options.encoding=UTF-8] Encoding of SVG output\n * @param {String} [options.width] desired width of svg with or without units\n * @param {String} [options.height] desired height of svg with or without units\n * @param {Function} [reviver] Method for further parsing of svg elements, called after each fabric object converted into svg representation.\n * @return {String} SVG string\n * @see {@link http://fabric5.fabricjs.com/fabric-intro-part-3#serialization}\n * @see {@link http://jsfiddle.net/fabricjs/jQ3ZZ/|jsFiddle demo}\n * @example Normal SVG output\n * var svg = canvas.toSVG();\n * @example SVG output without preamble (without <?xml ../>)\n * var svg = canvas.toSVG({suppressPreamble: true});\n * @example SVG output with viewBox attribute\n * var svg = canvas.toSVG({\n * viewBox: {\n * x: 100,\n * y: 100,\n * width: 200,\n * height: 300\n * }\n * });\n * @example SVG output with different encoding (default: UTF-8)\n * var svg = canvas.toSVG({encoding: 'ISO-8859-1'});\n * @example Modify SVG output with reviver function\n * var svg = canvas.toSVG(null, function(svg) {\n * return svg.replace('stroke-dasharray: ; stroke-linecap: butt; stroke-linejoin: miter; stroke-miterlimit: 10; ', '');\n * });\n */\n toSVG(options: TSVGExportOptions = {}, reviver?: TSVGReviver) {\n options.reviver = reviver;\n const markup: string[] = [];\n\n this._setSVGPreamble(markup, options);\n this._setSVGHeader(markup, options);\n if (this.clipPath) {\n markup.push(`\\n`);\n }\n this._setSVGBgOverlayColor(markup, 'background');\n this._setSVGBgOverlayImage(markup, 'backgroundImage', reviver);\n this._setSVGObjects(markup, reviver);\n if (this.clipPath) {\n markup.push('\\n');\n }\n this._setSVGBgOverlayColor(markup, 'overlay');\n this._setSVGBgOverlayImage(markup, 'overlayImage', reviver);\n\n markup.push('');\n\n return markup.join('');\n }\n\n /**\n * @private\n */\n _setSVGPreamble(markup: string[], options: TSVGExportOptions): void {\n if (options.suppressPreamble) {\n return;\n }\n markup.push(\n '\\n',\n '\\n',\n );\n }\n\n /**\n * @private\n */\n _setSVGHeader(markup: string[], options: TSVGExportOptions): void {\n const width = options.width || `${this.width}`,\n height = options.height || `${this.height}`,\n NUM_FRACTION_DIGITS = config.NUM_FRACTION_DIGITS,\n optViewBox = options.viewBox;\n let viewBox: string;\n if (optViewBox) {\n viewBox = `viewBox=\"${optViewBox.x} ${optViewBox.y} ${optViewBox.width} ${optViewBox.height}\" `;\n } else if (this.svgViewportTransformation) {\n const vpt = this.viewportTransform;\n viewBox = `viewBox=\"${toFixed(\n -vpt[4] / vpt[0],\n NUM_FRACTION_DIGITS,\n )} ${toFixed(-vpt[5] / vpt[3], NUM_FRACTION_DIGITS)} ${toFixed(\n this.width / vpt[0],\n NUM_FRACTION_DIGITS,\n )} ${toFixed(this.height / vpt[3], NUM_FRACTION_DIGITS)}\" `;\n } else {\n viewBox = `viewBox=\"0 0 ${this.width} ${this.height}\" `;\n }\n\n markup.push(\n '\\n',\n 'Created with Fabric.js ',\n VERSION,\n '\\n',\n '\\n',\n this.createSVGFontFacesMarkup(),\n this.createSVGRefElementsMarkup(),\n this.createSVGClipPathMarkup(options),\n '\\n',\n );\n }\n\n createSVGClipPathMarkup(options: TSVGExportOptions): string {\n const clipPath = this.clipPath;\n if (clipPath) {\n clipPath.clipPathId = `CLIPPATH_${uid()}`;\n return `\\n${clipPath.toClipPathSVG(\n options.reviver,\n )}\\n`;\n }\n return '';\n }\n\n /**\n * Creates markup containing SVG referenced elements like patterns, gradients etc.\n * @return {String}\n */\n createSVGRefElementsMarkup(): string {\n return (['background', 'overlay'] as const)\n .map((prop) => {\n const fill = this[`${prop}Color`];\n if (isFiller(fill)) {\n const shouldTransform = this[`${prop}Vpt`],\n vpt = this.viewportTransform,\n object = {\n // otherwise circular dependency\n isType: () => false,\n width: this.width / (shouldTransform ? vpt[0] : 1),\n height: this.height / (shouldTransform ? vpt[3] : 1),\n };\n return fill.toSVG(object as FabricObject, {\n additionalTransform: shouldTransform ? matrixToSVG(vpt) : '',\n });\n }\n })\n .join('');\n }\n\n /**\n * Creates markup containing SVG font faces,\n * font URLs for font faces must be collected by developers\n * and are not extracted from the DOM by fabricjs\n * @param {Array} objects Array of fabric objects\n * @return {String}\n */\n createSVGFontFacesMarkup(): string {\n const objects: FabricObject[] = [],\n fontList: Record = {},\n fontPaths = config.fontPaths;\n\n this._objects.forEach(function add(object) {\n objects.push(object);\n if (isCollection(object)) {\n object._objects.forEach(add);\n }\n });\n\n objects.forEach((obj) => {\n if (!isTextObject(obj)) {\n return;\n }\n const { styles, fontFamily } = obj;\n if (fontList[fontFamily] || !fontPaths[fontFamily]) {\n return;\n }\n fontList[fontFamily] = true;\n if (!styles) {\n return;\n }\n Object.values(styles).forEach((styleRow) => {\n Object.values(styleRow).forEach(({ fontFamily = '' }) => {\n if (!fontList[fontFamily] && fontPaths[fontFamily]) {\n fontList[fontFamily] = true;\n }\n });\n });\n });\n\n const fontListMarkup = Object.keys(fontList)\n .map(\n (fontFamily) =>\n `\\t\\t@font-face {\\n\\t\\t\\tfont-family: '${fontFamily}';\\n\\t\\t\\tsrc: url('${fontPaths[fontFamily]}');\\n\\t\\t}\\n`,\n )\n .join('');\n\n if (fontListMarkup) {\n return `\\t\\n`;\n }\n return '';\n }\n\n /**\n * @private\n */\n _setSVGObjects(markup: string[], reviver?: TSVGReviver) {\n this.forEachObject((fabricObject) => {\n if (fabricObject.excludeFromExport) {\n return;\n }\n this._setSVGObject(markup, fabricObject, reviver);\n });\n }\n\n /**\n * This is its own function because the Canvas ( non static ) requires extra code here\n * @private\n */\n _setSVGObject(\n markup: string[],\n instance: FabricObject,\n reviver?: TSVGReviver,\n ) {\n markup.push(instance.toSVG(reviver));\n }\n\n /**\n * @private\n */\n _setSVGBgOverlayImage(\n markup: string[],\n property: 'overlayImage' | 'backgroundImage',\n reviver?: TSVGReviver,\n ) {\n const bgOrOverlay = this[property];\n if (bgOrOverlay && !bgOrOverlay.excludeFromExport && bgOrOverlay.toSVG) {\n markup.push(bgOrOverlay.toSVG(reviver));\n }\n }\n\n /**\n * @TODO this seems to handle patterns but fail at gradients.\n * @private\n */\n _setSVGBgOverlayColor(markup: string[], property: 'background' | 'overlay') {\n const filler = this[`${property}Color`];\n if (!filler) {\n return;\n }\n if (isFiller(filler)) {\n const repeat = (filler as Pattern).repeat || '',\n finalWidth = this.width,\n finalHeight = this.height,\n shouldInvert = this[`${property}Vpt`],\n additionalTransform = shouldInvert\n ? matrixToSVG(invertTransform(this.viewportTransform))\n : '';\n markup.push(\n `\\n`,\n );\n } else {\n markup.push(\n '\\n',\n );\n }\n }\n /* _TO_SVG_END_ */\n\n /**\n * Populates canvas with data from the specified JSON.\n * JSON format must conform to the one of {@link fabric.Canvas#toJSON}\n *\n * **IMPORTANT**: It is recommended to abort loading tasks before calling this method to prevent race conditions and unnecessary networking\n *\n * @param {String|Object} json JSON string or object\n * @param {Function} [reviver] Method for further parsing of JSON elements, called after each fabric object created.\n * @param {Object} [options] options\n * @param {AbortSignal} [options.signal] see https://developer.mozilla.org/en-US/docs/Web/API/AbortController/signal\n * @return {Promise} instance\n * @see {@link http://fabric5.fabricjs.com/fabric-intro-part-3#deserialization}\n * @see {@link http://jsfiddle.net/fabricjs/fmgXt/|jsFiddle demo}\n * @example loadFromJSON\n * canvas.loadFromJSON(json).then((canvas) => canvas.requestRenderAll());\n * @example loadFromJSON with reviver\n * canvas.loadFromJSON(json, function(o, object) {\n * // `o` = json object\n * // `object` = fabric.Object instance\n * // ... do some stuff ...\n * }).then((canvas) => {\n * ... canvas is restored, add your code.\n * });\n *\n */\n loadFromJSON(\n json: string | Record,\n reviver?: EnlivenObjectOptions['reviver'],\n { signal }: Abortable = {},\n ): Promise {\n if (!json) {\n return Promise.reject(new FabricError('`json` is undefined'));\n }\n\n // parse json if it wasn't already\n const { objects = [], ...serialized } =\n typeof json === 'string' ? JSON.parse(json) : json;\n const { backgroundImage, background, overlayImage, overlay, clipPath } =\n serialized;\n const renderOnAddRemove = this.renderOnAddRemove;\n this.renderOnAddRemove = false;\n\n return Promise.all([\n enlivenObjects(objects, {\n reviver,\n signal,\n }),\n enlivenObjectEnlivables(\n {\n backgroundImage,\n backgroundColor: background,\n overlayImage,\n overlayColor: overlay,\n clipPath,\n },\n { signal },\n ),\n ]).then(([enlived, enlivedMap]) => {\n this.clear();\n this.add(...enlived);\n this.set(serialized);\n this.set(enlivedMap);\n this.renderOnAddRemove = renderOnAddRemove;\n return this;\n });\n }\n\n /**\n * Clones canvas instance\n * @param {string[]} [properties] Array of properties to include in the cloned canvas and children\n */\n clone(properties: string[]) {\n const data = this.toObject(properties);\n const canvas = this.cloneWithoutData();\n return canvas.loadFromJSON(data);\n }\n\n /**\n * Clones canvas instance without cloning existing data.\n * This essentially copies canvas dimensions since loadFromJSON does not affect canvas size.\n */\n cloneWithoutData() {\n const el = createCanvasElementFor(this);\n return new (this.constructor as Constructor)(el);\n }\n\n /**\n * Exports canvas element to a dataurl image. Note that when multiplier is used, cropping is scaled appropriately\n * @param {Object} [options] Options object\n * @param {String} [options.format=png] The format of the output image. Either \"jpeg\" or \"png\"\n * @param {Number} [options.quality=1] Quality level (0..1). Only used for jpeg.\n * @param {Number} [options.multiplier=1] Multiplier to scale by, to have consistent\n * @param {Number} [options.left] Cropping left offset. Introduced in v1.2.14\n * @param {Number} [options.top] Cropping top offset. Introduced in v1.2.14\n * @param {Number} [options.width] Cropping width. Introduced in v1.2.14\n * @param {Number} [options.height] Cropping height. Introduced in v1.2.14\n * @param {Boolean} [options.enableRetinaScaling] Enable retina scaling for clone image. Introduce in 2.0.0\n * @param {(object: fabric.Object) => boolean} [options.filter] Function to filter objects.\n * @return {String} Returns a data: URL containing a representation of the object in the format specified by options.format\n * @see {@link https://jsfiddle.net/xsjua1rd/ demo}\n * @example Generate jpeg dataURL with lower quality\n * var dataURL = canvas.toDataURL({\n * format: 'jpeg',\n * quality: 0.8\n * });\n * @example Generate cropped png dataURL (clipping of canvas)\n * var dataURL = canvas.toDataURL({\n * format: 'png',\n * left: 100,\n * top: 100,\n * width: 200,\n * height: 200\n * });\n * @example Generate double scaled png dataURL\n * var dataURL = canvas.toDataURL({\n * format: 'png',\n * multiplier: 2\n * });\n * @example Generate dataURL with objects that overlap a specified object\n * var myObject;\n * var dataURL = canvas.toDataURL({\n * filter: (object) => object.isContainedWithinObject(myObject) || object.intersectsWithObject(myObject)\n * });\n */\n toDataURL(options = {} as TDataUrlOptions): string {\n const {\n format = 'png',\n quality = 1,\n multiplier = 1,\n enableRetinaScaling = false,\n } = options;\n const finalMultiplier =\n multiplier * (enableRetinaScaling ? this.getRetinaScaling() : 1);\n\n return toDataURL(\n this.toCanvasElement(finalMultiplier, options),\n format,\n quality,\n );\n }\n toBlob(options = {} as TDataUrlOptions): Promise {\n const {\n format = 'png',\n quality = 1,\n multiplier = 1,\n enableRetinaScaling = false,\n } = options;\n const finalMultiplier =\n multiplier * (enableRetinaScaling ? this.getRetinaScaling() : 1);\n\n return toBlob(\n this.toCanvasElement(finalMultiplier, options),\n format,\n quality,\n );\n }\n\n /**\n * Create a new HTMLCanvas element painted with the current canvas content.\n * No need to resize the actual one or repaint it.\n * Will transfer object ownership to a new canvas, paint it, and set everything back.\n * This is an intermediary step used to get to a dataUrl but also it is useful to\n * create quick image copies of a canvas without passing for the dataUrl string\n * @param {Number} [multiplier] a zoom factor.\n * @param {Object} [options] Cropping informations\n * @param {Number} [options.left] Cropping left offset.\n * @param {Number} [options.top] Cropping top offset.\n * @param {Number} [options.width] Cropping width.\n * @param {Number} [options.height] Cropping height.\n * @param {(object: fabric.Object) => boolean} [options.filter] Function to filter objects.\n */\n toCanvasElement(\n multiplier = 1,\n { width, height, left, top, filter } = {} as TToCanvasElementOptions,\n ): HTMLCanvasElement {\n const scaledWidth = (width || this.width) * multiplier,\n scaledHeight = (height || this.height) * multiplier,\n zoom = this.getZoom(),\n originalWidth = this.width,\n originalHeight = this.height,\n originalSkipControlsDrawing = this.skipControlsDrawing,\n newZoom = zoom * multiplier,\n vp = this.viewportTransform,\n translateX = (vp[4] - (left || 0)) * multiplier,\n translateY = (vp[5] - (top || 0)) * multiplier,\n newVp = [newZoom, 0, 0, newZoom, translateX, translateY] as TMat2D,\n originalRetina = this.enableRetinaScaling,\n canvasEl = createCanvasElementFor({\n width: scaledWidth,\n height: scaledHeight,\n }),\n objectsToRender = filter\n ? this._objects.filter((obj) => filter(obj))\n : this._objects;\n this.enableRetinaScaling = false;\n this.viewportTransform = newVp;\n this.width = scaledWidth;\n this.height = scaledHeight;\n this.skipControlsDrawing = true;\n this.calcViewportBoundaries();\n this.renderCanvas(canvasEl.getContext('2d')!, objectsToRender);\n this.viewportTransform = vp;\n this.width = originalWidth;\n this.height = originalHeight;\n this.calcViewportBoundaries();\n this.enableRetinaScaling = originalRetina;\n this.skipControlsDrawing = originalSkipControlsDrawing;\n return canvasEl;\n }\n\n /**\n * Waits until rendering has settled to destroy the canvas\n * @returns {Promise} a promise resolving to `true` once the canvas has been destroyed or to `false` if the canvas has was already destroyed\n * @throws if aborted by a consequent call\n */\n dispose() {\n !this.disposed &&\n this.elements.cleanupDOM({ width: this.width, height: this.height });\n runningAnimations.cancelByCanvas(this);\n this.disposed = true;\n return new Promise((resolve, reject) => {\n const task = () => {\n this.destroy();\n resolve(true);\n };\n task.kill = reject;\n if (this.__cleanupTask) {\n this.__cleanupTask.kill('aborted');\n }\n\n if (this.destroyed) {\n resolve(false);\n } else if (this.nextRenderHandle) {\n this.__cleanupTask = task;\n } else {\n task();\n }\n });\n }\n\n /**\n * Clears the canvas element, disposes objects and frees resources.\n *\n * Invoked as part of the **async** operation of {@link dispose}.\n *\n * **CAUTION**:\n *\n * This method is **UNSAFE**.\n * You may encounter a race condition using it if there's a requested render.\n * Call this method only if you are sure rendering has settled.\n * Consider using {@link dispose} as it is **SAFE**\n *\n * @private\n */\n destroy() {\n this.destroyed = true;\n this.cancelRequestedRender();\n this.forEachObject((object) => object.dispose());\n this._objects = [];\n if (this.backgroundImage) {\n this.backgroundImage.dispose();\n }\n this.backgroundImage = undefined;\n if (this.overlayImage) {\n this.overlayImage.dispose();\n }\n this.overlayImage = undefined;\n this.elements.dispose();\n }\n\n /**\n * Returns a string representation of an instance\n * @return {String} string representation of an instance\n */\n toString() {\n return `#`;\n }\n}\n","import type { TPointerEvent } from '../EventTypeDefs';\nimport { Point } from '../Point';\nimport { getScrollLeftTop } from './dom_misc';\n\nconst touchEvents = ['touchstart', 'touchmove', 'touchend'];\n\nfunction getTouchInfo(event: TouchEvent | MouseEvent): MouseEvent | Touch {\n const touchProp = (event as TouchEvent).changedTouches;\n if (touchProp && touchProp[0]) {\n return touchProp[0];\n }\n return event as MouseEvent;\n}\n\nexport const getPointer = (event: TPointerEvent): Point => {\n const element = event.target as HTMLElement,\n scroll = getScrollLeftTop(element),\n _evt = getTouchInfo(event);\n return new Point(_evt.clientX + scroll.left, _evt.clientY + scroll.top);\n};\n\nexport const isTouchEvent = (event: TPointerEvent) =>\n touchEvents.includes(event.type) ||\n (event as PointerEvent).pointerType === 'touch';\n\nexport const stopEvent = (e: Event) => {\n e.preventDefault();\n e.stopPropagation();\n};\n","import type { XY } from '../../Point';\nimport type { TBBox } from '../../typedefs';\n\n/**\n * Calculates bounding box (left, top, width, height) from given `points`\n * @param {XY[]} points\n * @return {Object} Object with left, top, width, height properties\n */\nexport const makeBoundingBoxFromPoints = (points: XY[]): TBBox => {\n let left = 0,\n top = 0,\n width = 0,\n height = 0;\n\n for (let i = 0, len = points.length; i < len; i++) {\n const { x, y } = points[i];\n if (x > width || !i) width = x;\n if (x < left || !i) left = x;\n if (y > height || !i) height = y;\n if (y < top || !i) top = y;\n }\n\n return {\n left,\n top,\n width: width - left,\n height: height - top,\n };\n};\n","import { Point } from '../../Point';\nimport { CENTER } from '../../constants';\nimport type { FabricObject } from '../../shapes/Object/Object';\nimport type { TMat2D } from '../../typedefs';\nimport { makeBoundingBoxFromPoints } from './boundingBoxFromPoints';\nimport {\n invertTransform,\n multiplyTransformMatrices,\n qrDecompose,\n} from './matrix';\n\n/**\n * given an object and a transform, apply the inverse transform to the object,\n * this is equivalent to remove from that object that transformation, so that\n * added in a space with the removed transform, the object will be the same as before.\n * Removing from an object a transform that scale by 2 is like scaling it by 1/2.\n * Removing from an object a transform that rotate by 30deg is like rotating by 30deg\n * in the opposite direction.\n * This util is used to add objects inside transformed groups or nested groups.\n * @param {FabricObject} object the object you want to transform\n * @param {TMat2D} transform the destination transform\n */\nexport const removeTransformFromObject = (\n object: FabricObject,\n transform: TMat2D,\n) => {\n const inverted = invertTransform(transform),\n finalTransform = multiplyTransformMatrices(\n inverted,\n object.calcOwnMatrix(),\n );\n applyTransformToObject(object, finalTransform);\n};\n\n/**\n * given an object and a transform, apply the transform to the object.\n * this is equivalent to change the space where the object is drawn.\n * Adding to an object a transform that scale by 2 is like scaling it by 2.\n * This is used when removing an object from an active selection for example.\n * @param {FabricObject} object the object you want to transform\n * @param {Array} transform the destination transform\n */\nexport const addTransformToObject = (object: FabricObject, transform: TMat2D) =>\n applyTransformToObject(\n object,\n multiplyTransformMatrices(transform, object.calcOwnMatrix()),\n );\n\n/**\n * discard an object transform state and apply the one from the matrix.\n * @param {FabricObject} object the object you want to transform\n * @param {Array} transform the destination transform\n */\nexport const applyTransformToObject = (\n object: FabricObject,\n transform: TMat2D,\n) => {\n const { translateX, translateY, scaleX, scaleY, ...otherOptions } =\n qrDecompose(transform),\n center = new Point(translateX, translateY);\n object.flipX = false;\n object.flipY = false;\n Object.assign(object, otherOptions);\n object.set({ scaleX, scaleY });\n object.setPositionByOrigin(center, CENTER, CENTER);\n};\n/**\n * reset an object transform state to neutral. Top and left are not accounted for\n * @param {FabricObject} target object to transform\n */\nexport const resetObjectTransform = (target: FabricObject) => {\n target.scaleX = 1;\n target.scaleY = 1;\n target.skewX = 0;\n target.skewY = 0;\n target.flipX = false;\n target.flipY = false;\n target.rotate(0);\n};\n\n/**\n * Extract Object transform values\n * @param {FabricObject} target object to read from\n * @return {Object} Components of transform\n */\nexport const saveObjectTransform = (target: FabricObject) => ({\n scaleX: target.scaleX,\n scaleY: target.scaleY,\n skewX: target.skewX,\n skewY: target.skewY,\n angle: target.angle,\n left: target.left,\n flipX: target.flipX,\n flipY: target.flipY,\n top: target.top,\n});\n\n/**\n * given a width and height, return the size of the bounding box\n * that can contains the box with width/height with applied transform.\n * Use to calculate the boxes around objects for controls.\n * @param {Number} width\n * @param {Number} height\n * @param {TMat2D} t\n * @returns {Point} size\n */\nexport const sizeAfterTransform = (\n width: number,\n height: number,\n t: TMat2D,\n) => {\n const dimX = width / 2,\n dimY = height / 2,\n points = [\n new Point(-dimX, -dimY),\n new Point(dimX, -dimY),\n new Point(-dimX, dimY),\n new Point(dimX, dimY),\n ].map((p) => p.transform(t)),\n bbox = makeBoundingBoxFromPoints(points);\n return new Point(bbox.width, bbox.height);\n};\n","import { iMatrix } from '../../constants';\nimport type { Point } from '../../Point';\nimport type { FabricObject } from '../../shapes/Object/Object';\nimport type { TMat2D } from '../../typedefs';\nimport { invertTransform, multiplyTransformMatrices } from './matrix';\nimport { applyTransformToObject } from './objectTransforms';\n\n/**\n * We are actually looking for the transformation from the destination plane to the source plane (change of basis matrix)\\\n * The object will exist on the destination plane and we want it to seem unchanged by it so we invert the destination matrix (`to`) and then apply the source matrix (`from`)\n * @param [from]\n * @param [to]\n * @returns\n */\nexport const calcPlaneChangeMatrix = (\n from: TMat2D = iMatrix,\n to: TMat2D = iMatrix,\n) => multiplyTransformMatrices(invertTransform(to), from);\n\n/**\n * Sends a point from the source coordinate plane to the destination coordinate plane.\\\n * From the canvas/viewer's perspective the point remains unchanged.\n *\n * @example Send point from canvas plane to group plane\n * var obj = new Rect({ left: 20, top: 20, width: 60, height: 60, strokeWidth: 0 });\n * var group = new Group([obj], { strokeWidth: 0 });\n * var sentPoint1 = sendPointToPlane(new Point(50, 50), undefined, group.calcTransformMatrix());\n * var sentPoint2 = sendPointToPlane(new Point(50, 50), iMatrix, group.calcTransformMatrix());\n * console.log(sentPoint1, sentPoint2) // both points print (0,0) which is the center of group\n *\n * @param {Point} point\n * @param {TMat2D} [from] plane matrix containing object. Passing `undefined` is equivalent to passing the identity matrix, which means `point` exists in the canvas coordinate plane.\n * @param {TMat2D} [to] destination plane matrix to contain object. Passing `undefined` means `point` should be sent to the canvas coordinate plane.\n * @returns {Point} transformed point\n */\nexport const sendPointToPlane = (\n point: Point,\n from: TMat2D = iMatrix,\n to: TMat2D = iMatrix,\n): Point => point.transform(calcPlaneChangeMatrix(from, to));\n\n/**\n * See {@link sendPointToPlane}\n */\nexport const sendVectorToPlane = (\n point: Point,\n from: TMat2D = iMatrix,\n to: TMat2D = iMatrix,\n): Point => point.transform(calcPlaneChangeMatrix(from, to), true);\n\n/**\n *\n * A util that abstracts applying transform to objects.\\\n * Sends `object` to the destination coordinate plane by applying the relevant transformations.\\\n * Changes the space/plane where `object` is drawn.\\\n * From the canvas/viewer's perspective `object` remains unchanged.\n *\n * @example Move clip path from one object to another while preserving it's appearance as viewed by canvas/viewer\n * let obj, obj2;\n * let clipPath = new Circle({ radius: 50 });\n * obj.clipPath = clipPath;\n * // render\n * sendObjectToPlane(clipPath, obj.calcTransformMatrix(), obj2.calcTransformMatrix());\n * obj.clipPath = undefined;\n * obj2.clipPath = clipPath;\n * // render, clipPath now clips obj2 but seems unchanged from the eyes of the viewer\n *\n * @example Clip an object's clip path with an existing object\n * let obj, existingObj;\n * let clipPath = new Circle({ radius: 50 });\n * obj.clipPath = clipPath;\n * let transformTo = multiplyTransformMatrices(obj.calcTransformMatrix(), clipPath.calcTransformMatrix());\n * sendObjectToPlane(existingObj, existingObj.group?.calcTransformMatrix(), transformTo);\n * clipPath.clipPath = existingObj;\n *\n * @param {FabricObject} object\n * @param {Matrix} [from] plane matrix containing object. Passing `undefined` is equivalent to passing the identity matrix, which means `object` is a direct child of canvas.\n * @param {Matrix} [to] destination plane matrix to contain object. Passing `undefined` means `object` should be sent to the canvas coordinate plane.\n * @returns {Matrix} the transform matrix that was applied to `object`\n */\nexport const sendObjectToPlane = (\n object: FabricObject,\n from?: TMat2D,\n to?: TMat2D,\n): TMat2D => {\n const t = calcPlaneChangeMatrix(from, to);\n applyTransformToObject(\n object,\n multiplyTransformMatrices(t, object.calcOwnMatrix()),\n );\n return t;\n};\n","import type {\n ObjectModificationEvents,\n TModificationEvents,\n} from '../EventTypeDefs';\n\nexport const fireEvent = (\n eventName: TModificationEvents,\n options: ObjectModificationEvents[typeof eventName],\n) => {\n const {\n transform: { target },\n } = options;\n target.canvas?.fire(`object:${eventName}`, {\n ...options,\n target,\n });\n target.fire(eventName, options);\n};\n","import type { TOriginX, TOriginY } from '../../typedefs';\n\nconst originOffset = {\n left: -0.5,\n top: -0.5,\n center: 0,\n bottom: 0.5,\n right: 0.5,\n};\n/**\n * Resolves origin value relative to center\n * @private\n * @param {TOriginX | TOriginY} originValue originX / originY\n * @returns number\n */\n\nexport const resolveOrigin = (\n originValue: TOriginX | TOriginY | number,\n): number =>\n typeof originValue === 'string'\n ? originOffset[originValue]\n : originValue - 0.5;\n","import type { XY } from '../../Point';\nimport { Point } from '../../Point';\nimport type { TRadian } from '../../typedefs';\n\nconst unitVectorX = new Point(1, 0);\nconst zero = new Point();\n\n/**\n * Rotates `vector` with `radians`\n * @param {Point} vector The vector to rotate (x and y)\n * @param {Number} radians The radians of the angle for the rotation\n * @return {Point} The new rotated point\n */\nexport const rotateVector = (vector: Point, radians: TRadian) =>\n vector.rotate(radians);\n\n/**\n * Creates a vector from points represented as a point\n *\n * @param {Point} from\n * @param {Point} to\n * @returns {Point} vector\n */\nexport const createVector = (from: XY, to: XY): Point =>\n new Point(to).subtract(from);\n\n/**\n * return the magnitude of a vector\n * @return {number}\n */\nexport const magnitude = (point: Point) => point.distanceFrom(zero);\n\n/**\n * Calculates the angle between 2 vectors\n * @param {Point} a\n * @param {Point} b\n * @returns the angle in radians from `a` to `b`\n */\nexport const calcAngleBetweenVectors = (a: Point, b: Point): TRadian =>\n Math.atan2(crossProduct(a, b), dotProduct(a, b)) as TRadian;\n\n/**\n * Calculates the angle between the x axis and the vector\n * @param {Point} v\n * @returns the angle in radians of `v`\n */\nexport const calcVectorRotation = (v: Point) =>\n calcAngleBetweenVectors(unitVectorX, v);\n\n/**\n * @param {Point} v\n * @returns {Point} vector representing the unit vector pointing to the direction of `v`\n */\nexport const getUnitVector = (v: Point): Point =>\n v.eq(zero) ? v : v.scalarDivide(magnitude(v));\n\n/**\n * @param {Point} v\n * @param {Boolean} [counterClockwise] the direction of the orthogonal vector, defaults to `true`\n * @returns {Point} the unit orthogonal vector\n */\nexport const getOrthonormalVector = (\n v: Point,\n counterClockwise = true,\n): Point =>\n getUnitVector(new Point(-v.y, v.x).scalarMultiply(counterClockwise ? 1 : -1));\n\n/**\n * Cross product of two vectors in 2D\n * @param {Point} a\n * @param {Point} b\n * @returns {number} the magnitude of Z vector\n */\nexport const crossProduct = (a: Point, b: Point): number =>\n a.x * b.y - a.y * b.x;\n\n/**\n * Dot product of two vectors in 2D\n * @param {Point} a\n * @param {Point} b\n * @returns {number}\n */\nexport const dotProduct = (a: Point, b: Point): number => a.x * b.x + a.y * b.y;\n\n/**\n * Checks if the vector is between two others. It is considered\n * to be inside when the vector to be tested is between the\n * initial vector and the final vector (included) in a counterclockwise direction.\n * @param {Point} t vector to be tested\n * @param {Point} a initial vector\n * @param {Point} b final vector\n * @returns {boolean} true if the vector is among the others\n */\nexport const isBetweenVectors = (t: Point, a: Point, b: Point): boolean => {\n if (t.eq(a) || t.eq(b)) return true;\n const AxB = crossProduct(a, b),\n AxT = crossProduct(a, t),\n BxT = crossProduct(b, t);\n return AxB >= 0 ? AxT >= 0 && BxT <= 0 : !(AxT <= 0 && BxT >= 0);\n};\n","import type {\n TPointerEvent,\n Transform,\n TransformAction,\n BasicTransformEvent,\n} from '../EventTypeDefs';\nimport { resolveOrigin } from '../util/misc/resolveOrigin';\nimport { Point } from '../Point';\nimport type { FabricObject } from '../shapes/Object/FabricObject';\nimport type { TOriginX, TOriginY } from '../typedefs';\nimport { degreesToRadians } from '../util/misc/radiansDegreesConversion';\nimport type { Control } from './Control';\nimport { CENTER, quarterPI, twoMathPi } from '../constants';\nimport { calcVectorRotation, createVector } from '../util/misc/vectors';\nimport type { TOCoord } from '../shapes/Object/InteractiveObject';\nimport { sendPointToPlane } from '../util/misc/planeChange';\n\nexport const NOT_ALLOWED_CURSOR = 'not-allowed';\n\n/**\n * @param {Boolean} alreadySelected true if target is already selected\n * @param {String} corner a string representing the corner ml, mr, tl ...\n * @param {Event} e Event object\n * @param {FabricObject} [target] inserted back to help overriding. Unused\n */\nexport const getActionFromCorner = (\n alreadySelected: boolean,\n corner: string | undefined,\n e: TPointerEvent,\n target: FabricObject,\n) => {\n if (!corner || !alreadySelected) {\n return 'drag';\n }\n const control = target.controls[corner];\n return control.getActionName(e, control, target);\n};\n\n/**\n * Checks if transform is centered\n * @param {Object} transform transform data\n * @return {Boolean} true if transform is centered\n */\nexport function isTransformCentered(transform: Transform) {\n return (\n resolveOrigin(transform.originX) === resolveOrigin(CENTER) &&\n resolveOrigin(transform.originY) === resolveOrigin(CENTER)\n );\n}\n\nexport function invertOrigin(origin: TOriginX | TOriginY) {\n return -resolveOrigin(origin) + 0.5;\n}\n\nexport const isLocked = (\n target: FabricObject,\n lockingKey:\n | 'lockMovementX'\n | 'lockMovementY'\n | 'lockRotation'\n | 'lockScalingX'\n | 'lockScalingY'\n | 'lockSkewingX'\n | 'lockSkewingY'\n | 'lockScalingFlip',\n) => target[lockingKey];\n\nexport const commonEventInfo: TransformAction<\n Transform,\n BasicTransformEvent\n> = (eventData, transform, x, y) => {\n return {\n e: eventData,\n transform,\n pointer: new Point(x, y),\n };\n};\n\n/**\n * Combine control position and object angle to find the control direction compared\n * to the object center.\n * @param {FabricObject} fabricObject the fabric object for which we are rendering controls\n * @param {Control} control the control class\n * @return {Number} 0 - 7 a quadrant number\n */\nexport function findCornerQuadrant(\n fabricObject: FabricObject,\n control: Control,\n coord: TOCoord,\n): number {\n const target = coord;\n const center = sendPointToPlane(\n fabricObject.getCenterPoint(),\n fabricObject.canvas!.viewportTransform,\n undefined,\n );\n const angle = calcVectorRotation(createVector(center, target)) + twoMathPi;\n return Math.round((angle % twoMathPi) / quarterPI);\n}\n\n/**\n * @returns the normalized point (rotated relative to center) in local coordinates\n */\nfunction normalizePoint(\n target: FabricObject,\n point: Point,\n originX: TOriginX,\n originY: TOriginY,\n): Point {\n const center = target.getRelativeCenterPoint(),\n p =\n typeof originX !== 'undefined' && typeof originY !== 'undefined'\n ? target.translateToGivenOrigin(\n center,\n CENTER,\n CENTER,\n originX,\n originY,\n )\n : new Point(target.left, target.top),\n p2 = target.angle\n ? point.rotate(-degreesToRadians(target.angle), center)\n : point;\n return p2.subtract(p);\n}\n\n/**\n * Transforms a point to the offset from the given origin\n * @param {Object} transform\n * @param {String} originX\n * @param {String} originY\n * @param {number} x\n * @param {number} y\n * @return {Fabric.Point} the normalized point\n */\nexport function getLocalPoint(\n { target, corner }: Transform,\n originX: TOriginX,\n originY: TOriginY,\n x: number,\n y: number,\n) {\n const control = target.controls[corner],\n zoom = target.canvas?.getZoom() || 1,\n padding = target.padding / zoom,\n localPoint = normalizePoint(target, new Point(x, y), originX, originY);\n if (localPoint.x >= padding) {\n localPoint.x -= padding;\n }\n if (localPoint.x <= -padding) {\n localPoint.x += padding;\n }\n if (localPoint.y >= padding) {\n localPoint.y -= padding;\n }\n if (localPoint.y <= padding) {\n localPoint.y += padding;\n }\n localPoint.x -= control.offsetX;\n localPoint.y -= control.offsetY;\n return localPoint;\n}\n","import type { TransformActionHandler } from '../EventTypeDefs';\nimport { LEFT, TOP, MOVING } from '../constants';\nimport { fireEvent } from './fireEvent';\nimport { commonEventInfo, isLocked } from './util';\n\n/**\n * Action handler\n * @private\n * @param {Event} eventData javascript event that is doing the transform\n * @param {Object} transform javascript object containing a series of information around the current transform\n * @param {number} x current mouse x position, canvas normalized\n * @param {number} y current mouse y position, canvas normalized\n * @return {Boolean} true if the translation occurred\n */\nexport const dragHandler: TransformActionHandler = (\n eventData,\n transform,\n x,\n y,\n) => {\n const { target, offsetX, offsetY } = transform,\n newLeft = x - offsetX,\n newTop = y - offsetY,\n moveX = !isLocked(target, 'lockMovementX') && target.left !== newLeft,\n moveY = !isLocked(target, 'lockMovementY') && target.top !== newTop;\n moveX && target.set(LEFT, newLeft);\n moveY && target.set(TOP, newTop);\n if (moveX || moveY) {\n fireEvent(MOVING, commonEventInfo(eventData, transform, x, y));\n }\n return moveX || moveY;\n};\n","/**\n * Map of the 148 color names with HEX code\n * @see: https://www.w3.org/TR/css3-color/#svg-color\n */\nexport const ColorNameMap = {\n aliceblue: '#F0F8FF',\n antiquewhite: '#FAEBD7',\n aqua: '#0FF',\n aquamarine: '#7FFFD4',\n azure: '#F0FFFF',\n beige: '#F5F5DC',\n bisque: '#FFE4C4',\n black: '#000',\n blanchedalmond: '#FFEBCD',\n blue: '#00F',\n blueviolet: '#8A2BE2',\n brown: '#A52A2A',\n burlywood: '#DEB887',\n cadetblue: '#5F9EA0',\n chartreuse: '#7FFF00',\n chocolate: '#D2691E',\n coral: '#FF7F50',\n cornflowerblue: '#6495ED',\n cornsilk: '#FFF8DC',\n crimson: '#DC143C',\n cyan: '#0FF',\n darkblue: '#00008B',\n darkcyan: '#008B8B',\n darkgoldenrod: '#B8860B',\n darkgray: '#A9A9A9',\n darkgrey: '#A9A9A9',\n darkgreen: '#006400',\n darkkhaki: '#BDB76B',\n darkmagenta: '#8B008B',\n darkolivegreen: '#556B2F',\n darkorange: '#FF8C00',\n darkorchid: '#9932CC',\n darkred: '#8B0000',\n darksalmon: '#E9967A',\n darkseagreen: '#8FBC8F',\n darkslateblue: '#483D8B',\n darkslategray: '#2F4F4F',\n darkslategrey: '#2F4F4F',\n darkturquoise: '#00CED1',\n darkviolet: '#9400D3',\n deeppink: '#FF1493',\n deepskyblue: '#00BFFF',\n dimgray: '#696969',\n dimgrey: '#696969',\n dodgerblue: '#1E90FF',\n firebrick: '#B22222',\n floralwhite: '#FFFAF0',\n forestgreen: '#228B22',\n fuchsia: '#F0F',\n gainsboro: '#DCDCDC',\n ghostwhite: '#F8F8FF',\n gold: '#FFD700',\n goldenrod: '#DAA520',\n gray: '#808080',\n grey: '#808080',\n green: '#008000',\n greenyellow: '#ADFF2F',\n honeydew: '#F0FFF0',\n hotpink: '#FF69B4',\n indianred: '#CD5C5C',\n indigo: '#4B0082',\n ivory: '#FFFFF0',\n khaki: '#F0E68C',\n lavender: '#E6E6FA',\n lavenderblush: '#FFF0F5',\n lawngreen: '#7CFC00',\n lemonchiffon: '#FFFACD',\n lightblue: '#ADD8E6',\n lightcoral: '#F08080',\n lightcyan: '#E0FFFF',\n lightgoldenrodyellow: '#FAFAD2',\n lightgray: '#D3D3D3',\n lightgrey: '#D3D3D3',\n lightgreen: '#90EE90',\n lightpink: '#FFB6C1',\n lightsalmon: '#FFA07A',\n lightseagreen: '#20B2AA',\n lightskyblue: '#87CEFA',\n lightslategray: '#789',\n lightslategrey: '#789',\n lightsteelblue: '#B0C4DE',\n lightyellow: '#FFFFE0',\n lime: '#0F0',\n limegreen: '#32CD32',\n linen: '#FAF0E6',\n magenta: '#F0F',\n maroon: '#800000',\n mediumaquamarine: '#66CDAA',\n mediumblue: '#0000CD',\n mediumorchid: '#BA55D3',\n mediumpurple: '#9370DB',\n mediumseagreen: '#3CB371',\n mediumslateblue: '#7B68EE',\n mediumspringgreen: '#00FA9A',\n mediumturquoise: '#48D1CC',\n mediumvioletred: '#C71585',\n midnightblue: '#191970',\n mintcream: '#F5FFFA',\n mistyrose: '#FFE4E1',\n moccasin: '#FFE4B5',\n navajowhite: '#FFDEAD',\n navy: '#000080',\n oldlace: '#FDF5E6',\n olive: '#808000',\n olivedrab: '#6B8E23',\n orange: '#FFA500',\n orangered: '#FF4500',\n orchid: '#DA70D6',\n palegoldenrod: '#EEE8AA',\n palegreen: '#98FB98',\n paleturquoise: '#AFEEEE',\n palevioletred: '#DB7093',\n papayawhip: '#FFEFD5',\n peachpuff: '#FFDAB9',\n peru: '#CD853F',\n pink: '#FFC0CB',\n plum: '#DDA0DD',\n powderblue: '#B0E0E6',\n purple: '#800080',\n rebeccapurple: '#639',\n red: '#F00',\n rosybrown: '#BC8F8F',\n royalblue: '#4169E1',\n saddlebrown: '#8B4513',\n salmon: '#FA8072',\n sandybrown: '#F4A460',\n seagreen: '#2E8B57',\n seashell: '#FFF5EE',\n sienna: '#A0522D',\n silver: '#C0C0C0',\n skyblue: '#87CEEB',\n slateblue: '#6A5ACD',\n slategray: '#708090',\n slategrey: '#708090',\n snow: '#FFFAFA',\n springgreen: '#00FF7F',\n steelblue: '#4682B4',\n tan: '#D2B48C',\n teal: '#008080',\n thistle: '#D8BFD8',\n tomato: '#FF6347',\n turquoise: '#40E0D0',\n violet: '#EE82EE',\n wheat: '#F5DEB3',\n white: '#FFF',\n whitesmoke: '#F5F5F5',\n yellow: '#FF0',\n yellowgreen: '#9ACD32',\n};\n","import type { TRGBAColorSource } from './typedefs';\n\n/**\n * @param {Number} p\n * @param {Number} q\n * @param {Number} t\n * @return {Number}\n */\nexport const hue2rgb = (p: number, q: number, t: number): number => {\n if (t < 0) {\n t += 1;\n }\n if (t > 1) {\n t -= 1;\n }\n if (t < 1 / 6) {\n return p + (q - p) * 6 * t;\n }\n if (t < 1 / 2) {\n return q;\n }\n if (t < 2 / 3) {\n return p + (q - p) * (2 / 3 - t) * 6;\n }\n return p;\n};\n\n/**\n * Adapted from {@link https://gist.github.com/mjackson/5311256 https://gist.github.com/mjackson}\n * @param {Number} r Red color value\n * @param {Number} g Green color value\n * @param {Number} b Blue color value\n * @param {Number} a Alpha color value pass through\n * @return {TRGBColorSource} Hsl color\n */\nexport const rgb2Hsl = (\n r: number,\n g: number,\n b: number,\n a: number,\n): TRGBAColorSource => {\n r /= 255;\n g /= 255;\n b /= 255;\n const maxValue = Math.max(r, g, b),\n minValue = Math.min(r, g, b);\n\n let h!: number, s: number;\n const l = (maxValue + minValue) / 2;\n\n if (maxValue === minValue) {\n h = s = 0; // achromatic\n } else {\n const d = maxValue - minValue;\n s = l > 0.5 ? d / (2 - maxValue - minValue) : d / (maxValue + minValue);\n switch (maxValue) {\n case r:\n h = (g - b) / d + (g < b ? 6 : 0);\n break;\n case g:\n h = (b - r) / d + 2;\n break;\n case b:\n h = (r - g) / d + 4;\n break;\n }\n h /= 6;\n }\n\n return [Math.round(h * 360), Math.round(s * 100), Math.round(l * 100), a];\n};\n\nexport const fromAlphaToFloat = (value = '1') =>\n parseFloat(value) / (value.endsWith('%') ? 100 : 1);\n\n/**\n * Convert a value in the inclusive range [0, 255] to hex\n */\nexport const hexify = (value: number) =>\n Math.min(Math.round(value), 255).toString(16).toUpperCase().padStart(2, '0');\n\n/**\n * Calculate the grey average value for rgb and pass through alpha\n */\nexport const greyAverage = ([\n r,\n g,\n b,\n a = 1,\n]: TRGBAColorSource): TRGBAColorSource => {\n const avg = Math.round(r * 0.3 + g * 0.59 + b * 0.11);\n return [avg, avg, avg, a];\n};\n","import { radiansToDegrees } from '../util/misc/radiansDegreesConversion';\nimport { ColorNameMap } from './color_map';\nimport { reHSLa, reHex, reRGBa } from './constants';\nimport type { TRGBAColorSource, TColorArg } from './typedefs';\nimport {\n hue2rgb,\n hexify,\n rgb2Hsl,\n fromAlphaToFloat,\n greyAverage,\n} from './util';\n\n/**\n * @class Color common color operations\n * @see {@link http://fabric5.fabricjs.com/fabric-intro-part-2#colors colors}\n */\nexport class Color {\n declare private _source: TRGBAColorSource;\n isUnrecognised = false;\n\n /**\n *\n * @param {string} [color] optional in hex or rgb(a) or hsl format or from known color list\n */\n constructor(color?: TColorArg) {\n if (!color) {\n // we default to black as canvas does\n this.setSource([0, 0, 0, 1]);\n } else if (color instanceof Color) {\n this.setSource([...color._source]);\n } else if (Array.isArray(color)) {\n const [r, g, b, a = 1] = color;\n this.setSource([r, g, b, a]);\n } else {\n this.setSource(this._tryParsingColor(color));\n }\n }\n\n /**\n * @private\n * @param {string} [color] Color value to parse\n * @returns {TRGBAColorSource}\n */\n protected _tryParsingColor(color: string) {\n color = color.toLowerCase();\n if (color in ColorNameMap) {\n color = ColorNameMap[color as keyof typeof ColorNameMap];\n }\n return color === 'transparent'\n ? ([255, 255, 255, 0] as TRGBAColorSource)\n : Color.sourceFromHex(color) ||\n Color.sourceFromRgb(color) ||\n Color.sourceFromHsl(color) ||\n // color is not recognized\n // we default to black as canvas does\n // eslint-disable-next-line no-constant-binary-expression\n ((this.isUnrecognised = true) && ([0, 0, 0, 1] as TRGBAColorSource));\n }\n\n /**\n * Returns source of this color (where source is an array representation; ex: [200, 200, 100, 1])\n * @return {TRGBAColorSource}\n */\n getSource() {\n return this._source;\n }\n\n /**\n * Sets source of this color (where source is an array representation; ex: [200, 200, 100, 1])\n * @param {TRGBAColorSource} source\n */\n setSource(source: TRGBAColorSource) {\n this._source = source;\n }\n\n /**\n * Returns color representation in RGB format\n * @return {String} ex: rgb(0-255,0-255,0-255)\n */\n toRgb() {\n const [r, g, b] = this.getSource();\n return `rgb(${r},${g},${b})`;\n }\n\n /**\n * Returns color representation in RGBA format\n * @return {String} ex: rgba(0-255,0-255,0-255,0-1)\n */\n toRgba() {\n return `rgba(${this.getSource().join(',')})`;\n }\n\n /**\n * Returns color representation in HSL format\n * @return {String} ex: hsl(0-360,0%-100%,0%-100%)\n */\n toHsl() {\n const [h, s, l] = rgb2Hsl(...this.getSource());\n return `hsl(${h},${s}%,${l}%)`;\n }\n\n /**\n * Returns color representation in HSLA format\n * @return {String} ex: hsla(0-360,0%-100%,0%-100%,0-1)\n */\n toHsla() {\n const [h, s, l, a] = rgb2Hsl(...this.getSource());\n return `hsla(${h},${s}%,${l}%,${a})`;\n }\n\n /**\n * Returns color representation in HEX format\n * @return {String} ex: FF5555\n */\n toHex() {\n const fullHex = this.toHexa();\n return fullHex.slice(0, 6);\n }\n\n /**\n * Returns color representation in HEXA format\n * @return {String} ex: FF5555CC\n */\n toHexa() {\n const [r, g, b, a] = this.getSource();\n return `${hexify(r)}${hexify(g)}${hexify(b)}${hexify(Math.round(a * 255))}`;\n }\n\n /**\n * Gets value of alpha channel for this color\n * @return {Number} 0-1\n */\n getAlpha() {\n return this.getSource()[3];\n }\n\n /**\n * Sets value of alpha channel for this color\n * @param {Number} alpha Alpha value 0-1\n * @return {Color} thisArg\n */\n setAlpha(alpha: number) {\n this._source[3] = alpha;\n return this;\n }\n\n /**\n * Transforms color to its grayscale representation\n * @return {Color} thisArg\n */\n toGrayscale() {\n this.setSource(greyAverage(this.getSource()));\n return this;\n }\n\n /**\n * Transforms color to its black and white representation\n * @param {Number} threshold\n * @return {Color} thisArg\n */\n toBlackWhite(threshold: number) {\n const [average, , , a] = greyAverage(this.getSource()),\n bOrW = average < (threshold || 127) ? 0 : 255;\n this.setSource([bOrW, bOrW, bOrW, a]);\n return this;\n }\n\n /**\n * Overlays color with another color\n * @param {String|Color} otherColor\n * @return {Color} thisArg\n */\n overlayWith(otherColor: string | Color) {\n if (!(otherColor instanceof Color)) {\n otherColor = new Color(otherColor);\n }\n\n const source = this.getSource(),\n otherAlpha = 0.5,\n otherSource = otherColor.getSource(),\n [R, G, B] = source.map((value, index) =>\n Math.round(value * (1 - otherAlpha) + otherSource[index] * otherAlpha),\n );\n\n this.setSource([R, G, B, source[3]]);\n return this;\n }\n\n /**\n * Returns new color object, when given a color in RGB format\n * @param {String} color Color value ex: rgb(0-255,0-255,0-255)\n * @return {Color}\n */\n static fromRgb(color: string): Color {\n return Color.fromRgba(color);\n }\n\n /**\n * Returns new color object, when given a color in RGBA format\n * @param {String} color\n * @return {Color}\n */\n static fromRgba(color: string): Color {\n return new Color(Color.sourceFromRgb(color));\n }\n\n /**\n * Returns array representation (ex: [100, 100, 200, 1]) of a color that's in RGB or RGBA format\n * @param {String} color Color value ex: rgb(0-255,0-255,0-255), rgb(0%-100%,0%-100%,0%-100%)\n * @return {TRGBAColorSource | undefined} source\n */\n static sourceFromRgb(color: string): TRGBAColorSource | undefined {\n const match = color.match(reRGBa());\n if (match) {\n const [r, g, b] = match.slice(1, 4).map((value) => {\n const parsedValue = parseFloat(value);\n return value.endsWith('%')\n ? Math.round(parsedValue * 2.55)\n : parsedValue;\n });\n return [r, g, b, fromAlphaToFloat(match[4])];\n }\n }\n\n /**\n * Returns new color object, when given a color in HSL format\n * @param {String} color Color value ex: hsl(0-260,0%-100%,0%-100%)\n * @return {Color}\n */\n static fromHsl(color: string): Color {\n return Color.fromHsla(color);\n }\n\n /**\n * Returns new color object, when given a color in HSLA format\n * @param {String} color\n * @return {Color}\n */\n static fromHsla(color: string): Color {\n return new Color(Color.sourceFromHsl(color));\n }\n\n /**\n * Returns array representation (ex: [100, 100, 200, 1]) of a color that's in HSL or HSLA format.\n * Adapted from https://github.com/mjijackson\n * @param {String} color Color value ex: hsl(0-360,0%-100%,0%-100%) or hsla(0-360,0%-100%,0%-100%, 0-1)\n * @return {TRGBAColorSource | undefined} source\n * @see http://http://www.w3.org/TR/css3-color/#hsl-color\n */\n static sourceFromHsl(color: string): TRGBAColorSource | undefined {\n const match = color.match(reHSLa());\n if (!match) {\n return;\n }\n const match1degrees = Color.parseAngletoDegrees(match[1]);\n\n const h = (((match1degrees % 360) + 360) % 360) / 360,\n s = parseFloat(match[2]) / 100,\n l = parseFloat(match[3]) / 100;\n let r: number, g: number, b: number;\n\n if (s === 0) {\n r = g = b = l;\n } else {\n const q = l <= 0.5 ? l * (s + 1) : l + s - l * s,\n p = l * 2 - q;\n\n r = hue2rgb(p, q, h + 1 / 3);\n g = hue2rgb(p, q, h);\n b = hue2rgb(p, q, h - 1 / 3);\n }\n\n return [\n Math.round(r * 255),\n Math.round(g * 255),\n Math.round(b * 255),\n fromAlphaToFloat(match[4]),\n ];\n }\n\n /**\n * Returns new color object, when given a color in HEX format\n * @param {String} color Color value ex: FF5555\n * @return {Color}\n */\n static fromHex(color: string): Color {\n return new Color(Color.sourceFromHex(color));\n }\n\n /**\n * Returns array representation (ex: [100, 100, 200, 1]) of a color that's in HEX format\n * @param {String} color ex: FF5555 or FF5544CC (RGBa)\n * @return {TRGBAColorSource | undefined} source\n */\n static sourceFromHex(color: string): TRGBAColorSource | undefined {\n if (color.match(reHex())) {\n const value = color.slice(color.indexOf('#') + 1),\n isShortNotation = value.length <= 4;\n let expandedValue: string[];\n if (isShortNotation) {\n expandedValue = value.split('').map((hex) => hex + hex);\n } else {\n expandedValue = value.match(/.{2}/g)!;\n }\n const [r, g, b, a = 255] = expandedValue.map((hexCouple) =>\n parseInt(hexCouple, 16),\n );\n return [r, g, b, a / 255];\n }\n }\n\n /**\n * Converts a string that could be any angle notation (50deg, 0.5turn, 2rad)\n * into degrees without the 'deg' suffix\n * @param {String} value ex: 0deg, 0.5turn, 2rad\n * @return {Number} number in degrees or NaN if inputs are invalid\n */\n static parseAngletoDegrees(value: string): number {\n const lowercase = value.toLowerCase();\n const numeric = parseFloat(lowercase);\n\n if (lowercase.includes('rad')) {\n return radiansToDegrees(numeric);\n }\n\n if (lowercase.includes('turn')) {\n return numeric * 360;\n }\n\n // Value is probably just a number already in degrees eg '50'\n return numeric;\n }\n}\n","/**\n * Regex matching color in RGB or RGBA formats (ex: `rgb(0, 0, 0)`, `rgba(255, 100, 10, 0.5)`, `rgba( 255 , 100 , 10 , 0.5 )`, `rgb(1,1,1)`, `rgba(100%, 60%, 10%, 0.5)`)\n * Also matching rgba(r g b / a) as per new specs\n * https://developer.mozilla.org/en-US/docs/Web/CSS/color_value/rgb\n * Formal syntax at the time of writing:\n * =\n * rgb( [ | none ]{3} [ / [ | none ] ]? ) |\n * rgb( [ | none ]{3} [ / [ | none ] ]? )\n * = | \n *\n * For learners this is how you can read this regex\n * Regular expression for matching an rgba or rgb CSS color value\n *\n * /^ # Beginning of the string\n * rgba? # \"rgb\" or \"rgba\"\n * \\(\\s* # Opening parenthesis and optional whitespace\n * (\\d{0,3} # 0 to three digits R channel\n * (?:\\.\\d+)? # Optional decimal with one or more digits\n * ) # End of capturing group for the first color component\n * %? # Optional percent sign after the first color component\n * \\s* # Optional whitespace\n * [\\s|,] # Separator between color components can be a space or comma\n * \\s* # Optional whitespace\n * (\\d{0,3} # 0 to three digits G channel\n * (?:\\.\\d+)? # Optional decimal with one or more digits\n * ) # End of capturing group for the second color component\n * %? # Optional percent sign after the second color component\n * \\s* # Optional whitespace\n * [\\s|,] # Separator between color components can be a space or comma\n * \\s* # Optional whitespace\n * (\\d{0,3} # 0 to three digits B channel\n * (?:\\.\\d+)? # Optional decimal with one or more digits\n * ) # End of capturing group for the third color component\n * %? # Optional percent sign after the third color component\n * \\s* # Optional whitespace\n * (?: # Beginning of non-capturing group for alpha value\n * \\s* # Optional whitespace\n * [,/] # Comma or slash separator for alpha value\n * \\s* # Optional whitespace\n * (\\d{0,3} # Zero to three digits\n * (?:\\.\\d+)? # Optional decimal with one or more digits\n * ) # End of capturing group for alpha value\n * %? # Optional percent sign after alpha value\n * \\s* # Optional whitespace\n * )? # End of non-capturing group for alpha value (optional)\n * \\) # Closing parenthesis\n * $ # End of the string\n *\n * The alpha channel can be in the format 0.4 .7 or 1 or 73%\n *\n * WARNING this regex doesn't fail on off spec colors. it matches everything that could be a color.\n * So the spec does not allow for `rgba(30 , 45% 35, 49%)` but this will work anyways for us\n */\nexport const reRGBa = () =>\n /^rgba?\\(\\s*(\\d{0,3}(?:\\.\\d+)?%?)\\s*[\\s|,]\\s*(\\d{0,3}(?:\\.\\d+)?%?)\\s*[\\s|,]\\s*(\\d{0,3}(?:\\.\\d+)?%?)\\s*(?:\\s*[,/]\\s*(\\d{0,3}(?:\\.\\d+)?%?)\\s*)?\\)$/i;\n\n/**\n * Regex matching color in HSL or HSLA formats (ex: hsl(0, 0, 0), rgba(255, 100, 10, 0.5), rgba( 255 , 100 , 10 , 0.5 ), rgb(1,1,1), rgba(100%, 60%, 10%, 0.5))\n * Also matching rgba(r g b / a) as per new specs\n * https://developer.mozilla.org/en-US/docs/Web/CSS/color_value/hsl\n * Formal syntax at the time of writing:\n * =\n * hsl( [ | none ] [ | none ] [ | none ] [ / [ | none ] ]? )\n *\n * =\n * |\n * \n *\n * =\n * |\n * \n *\n * For learners this is how you can read this regex\n * Regular expression for matching an hsla or hsl CSS color value\n *\n * /^hsla?\\( // Matches the beginning of the string and the opening parenthesis of \"hsl\" or \"hsla\"\n * \\s* // Matches any whitespace characters (space, tab, etc.) zero or more times\n * (\\d{0,3} // Hue: 0 to three digits - start capture in a group\n * (?:\\.\\d+)? // Hue: Optional (non capture group) decimal with one or more digits.\n * (?:deg|turn|rad)? // Hue: Optionally include suffix deg or turn or rad\n * ) // Hue: End capture group\n * \\s* // Matches any whitespace characters zero or more times\n * [\\s|,] // Matches a space, tab or comma\n * \\s* // Matches any whitespace characters zero or more times\n * (\\d{0,3} // Saturation: 0 to three digits - start capture in a group\n * (?:\\.\\d+)? // Saturation: Optional decimal with one or more digits in a non-capturing group\n * %?) // Saturation: match optional % character and end capture group\n * \\s* // Matches any whitespace characters zero or more times\n * [\\s|,] // Matches a space, tab or comma\n * \\s* // Matches any whitespace characters zero or more times\n * (\\d{0,3} // Lightness: 0 to three digits - start capture in a group\n * (?:\\.\\d+)? // Lightness: Optional decimal with one or more digits in a non-capturing group\n * %?) // Lightness: match % character and end capture group\n * \\s* // Matches any whitespace characters zero or more times\n * (?: // Alpha: Begins a non-capturing group for the alpha value\n * \\s* // Matches any whitespace characters zero or more times\n * [,/] // Matches a comma or forward slash\n * \\s* // Matches any whitespace characters zero or more times\n * (\\d*(?:\\.\\d+)?%?) // Matches zero or more digits, optionally followed by a decimal point and one or more digits, followed by an optional percentage sign and captures it in a group\n * \\s* // Matches any whitespace characters zero or more times\n * )? // Makes the alpha value group optional\n * \\) // Matches the closing parenthesis\n * $/i // Matches the end of the string and sets the regular expression to case-insensitive mode\n *\n * WARNING this regex doesn't fail on off spec colors. It matches everything that could be a color.\n * So the spec does not allow `hsl(30 , 45% 35, 49%)` but this will work anyways for us.\n */\nexport const reHSLa = () =>\n /^hsla?\\(\\s*([+-]?\\d{0,3}(?:\\.\\d+)?(?:deg|turn|rad)?)\\s*[\\s|,]\\s*(\\d{0,3}(?:\\.\\d+)?%?)\\s*[\\s|,]\\s*(\\d{0,3}(?:\\.\\d+)?%?)\\s*(?:\\s*[,/]\\s*(\\d*(?:\\.\\d+)?%?)\\s*)?\\)$/i;\n\n/**\n * Regex matching color in HEX format (ex: #FF5544CC, #FF5555, 010155, aff)\n */\nexport const reHex = () => /^#?(([0-9a-f]){3,4}|([0-9a-f]{2}){3,4})$/i;\n","import { Color } from '../../color/Color';\nimport { config } from '../../config';\nimport { DEFAULT_SVG_FONT_SIZE, FILL, NONE } from '../../constants';\nimport type { TBBox, SVGElementName, SupportedSVGUnit } from '../../typedefs';\nimport { toFixed } from './toFixed';\n\n/**\n * Returns array of attributes for given svg that fabric parses\n * @param {SVGElementName} type Type of svg element (eg. 'circle')\n * @return {Array} string names of supported attributes\n */\nexport const getSvgAttributes = (type: SVGElementName) => {\n const commonAttributes = ['instantiated_by_use', 'style', 'id', 'class'];\n switch (type) {\n case 'linearGradient':\n return commonAttributes.concat([\n 'x1',\n 'y1',\n 'x2',\n 'y2',\n 'gradientUnits',\n 'gradientTransform',\n ]);\n case 'radialGradient':\n return commonAttributes.concat([\n 'gradientUnits',\n 'gradientTransform',\n 'cx',\n 'cy',\n 'r',\n 'fx',\n 'fy',\n 'fr',\n ]);\n case 'stop':\n return commonAttributes.concat(['offset', 'stop-color', 'stop-opacity']);\n }\n return commonAttributes;\n};\n\n/**\n * Converts from attribute value to pixel value if applicable.\n * Returns converted pixels or original value not converted.\n * @param {string} value number to operate on\n * @param {number} fontSize\n * @return {number}\n */\nexport const parseUnit = (value: string, fontSize = DEFAULT_SVG_FONT_SIZE) => {\n const unit = /\\D{0,2}$/.exec(value),\n number = parseFloat(value);\n const dpi = config.DPI;\n switch (unit?.[0] as SupportedSVGUnit) {\n case 'mm':\n return (number * dpi) / 25.4;\n\n case 'cm':\n return (number * dpi) / 2.54;\n\n case 'in':\n return number * dpi;\n\n case 'pt':\n return (number * dpi) / 72; // or * 4 / 3\n\n case 'pc':\n return ((number * dpi) / 72) * 12; // or * 16\n\n case 'em':\n return number * fontSize;\n\n default:\n return number;\n }\n};\n\nexport type MeetOrSlice = 'meet' | 'slice';\n\nexport type MinMidMax = 'Min' | 'Mid' | 'Max' | 'none';\n\nexport type TPreserveArParsed = {\n meetOrSlice: MeetOrSlice;\n alignX: MinMidMax;\n alignY: MinMidMax;\n};\n\n// align can be either none or undefined or a combination of mid/max\nconst parseAlign = (align: string): MinMidMax[] => {\n //divide align in alignX and alignY\n if (align && align !== NONE) {\n return [align.slice(1, 4) as MinMidMax, align.slice(5, 8) as MinMidMax];\n } else if (align === NONE) {\n return [align, align];\n }\n return ['Mid', 'Mid'];\n};\n\n/**\n * Parse preserveAspectRatio attribute from element\n * https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/preserveAspectRatio\n * @param {string} attribute to be parsed\n * @return {Object} an object containing align and meetOrSlice attribute\n */\nexport const parsePreserveAspectRatioAttribute = (\n attribute: string,\n): TPreserveArParsed => {\n const [firstPart, secondPart] = attribute.trim().split(' ') as [\n MinMidMax,\n MeetOrSlice | undefined,\n ];\n const [alignX, alignY] = parseAlign(firstPart);\n return {\n meetOrSlice: secondPart || 'meet',\n alignX,\n alignY,\n };\n};\n\n/**\n * Adobe Illustrator (at least CS5) is unable to render rgba()-based fill values\n * we work around it by \"moving\" alpha channel into opacity attribute and setting fill's alpha to 1\n * @param prop\n * @param value\n * @param {boolean} inlineStyle The default is inline style, the separator used is \":\", The other is \"=\"\n * @returns\n */\nexport const colorPropToSVG = (\n prop: string,\n value?: any,\n inlineStyle = true,\n) => {\n let colorValue;\n let opacityValue;\n if (!value) {\n colorValue = 'none';\n } else if (value.toLive) {\n colorValue = `url(#SVGID_${value.id})`;\n } else {\n const color = new Color(value),\n opacity = color.getAlpha();\n\n colorValue = color.toRgb();\n if (opacity !== 1) {\n opacityValue = opacity.toString();\n }\n }\n if (inlineStyle) {\n return `${prop}: ${colorValue}; ${\n opacityValue ? `${prop}-opacity: ${opacityValue}; ` : ''\n }`;\n } else {\n return `${prop}=\"${colorValue}\" ${\n opacityValue ? `${prop}-opacity=\"${opacityValue}\" ` : ''\n }`;\n }\n};\n\nexport const createSVGRect = (\n color: string,\n { left, top, width, height }: TBBox,\n precision = config.NUM_FRACTION_DIGITS,\n) => {\n const svgColor = colorPropToSVG(FILL, color, false);\n const [x, y, w, h] = [left, top, width, height].map((value) =>\n toFixed(value, precision),\n );\n return ``;\n};\n","import type { TSVGReviver } from '../../typedefs';\nimport { uid } from '../../util/internals/uid';\nimport { colorPropToSVG } from '../../util/misc/svgParsing';\nimport { FILL, NONE, STROKE } from '../../constants';\nimport type { FabricObject } from './FabricObject';\nimport { isFiller } from '../../util/typeAssertions';\nimport { matrixToSVG } from '../../util/misc/svgExport';\n\nexport class FabricObjectSVGExportMixin {\n /**\n * When an object is being exported as SVG as a clippath, a reference inside the SVG is needed.\n * This reference is a UID in the fabric namespace and is temporary stored here.\n * @type {String}\n */\n declare clipPathId?: string;\n\n /**\n * Returns styles-string for svg-export\n * @param {Boolean} skipShadow a boolean to skip shadow filter output\n * @return {String}\n */\n getSvgStyles(\n this: FabricObjectSVGExportMixin & FabricObject,\n skipShadow?: boolean,\n ) {\n const fillRule = this.fillRule ? this.fillRule : 'nonzero',\n strokeWidth = this.strokeWidth ? this.strokeWidth : '0',\n strokeDashArray = this.strokeDashArray\n ? this.strokeDashArray.join(' ')\n : NONE,\n strokeDashOffset = this.strokeDashOffset ? this.strokeDashOffset : '0',\n strokeLineCap = this.strokeLineCap ? this.strokeLineCap : 'butt',\n strokeLineJoin = this.strokeLineJoin ? this.strokeLineJoin : 'miter',\n strokeMiterLimit = this.strokeMiterLimit ? this.strokeMiterLimit : '4',\n opacity = typeof this.opacity !== 'undefined' ? this.opacity : '1',\n visibility = this.visible ? '' : ' visibility: hidden;',\n filter = skipShadow ? '' : this.getSvgFilter(),\n fill = colorPropToSVG(FILL, this.fill),\n stroke = colorPropToSVG(STROKE, this.stroke);\n\n return [\n stroke,\n 'stroke-width: ',\n strokeWidth,\n '; ',\n 'stroke-dasharray: ',\n strokeDashArray,\n '; ',\n 'stroke-linecap: ',\n strokeLineCap,\n '; ',\n 'stroke-dashoffset: ',\n strokeDashOffset,\n '; ',\n 'stroke-linejoin: ',\n strokeLineJoin,\n '; ',\n 'stroke-miterlimit: ',\n strokeMiterLimit,\n '; ',\n fill,\n 'fill-rule: ',\n fillRule,\n '; ',\n 'opacity: ',\n opacity,\n ';',\n filter,\n visibility,\n ].join('');\n }\n\n /**\n * Returns filter for svg shadow\n * @return {String}\n */\n getSvgFilter(this: FabricObjectSVGExportMixin & FabricObject) {\n return this.shadow ? `filter: url(#SVGID_${this.shadow.id});` : '';\n }\n\n /**\n * Returns id attribute for svg output\n * @return {String}\n */\n getSvgCommons(\n this: FabricObjectSVGExportMixin & FabricObject & { id?: string },\n ) {\n return [\n this.id ? `id=\"${this.id}\" ` : '',\n this.clipPath\n ? `clip-path=\"url(#${\n (this.clipPath as FabricObjectSVGExportMixin & FabricObject)\n .clipPathId\n })\" `\n : '',\n ].join('');\n }\n\n /**\n * Returns transform-string for svg-export\n * @param {Boolean} use the full transform or the single object one.\n * @return {String}\n */\n getSvgTransform(\n this: FabricObjectSVGExportMixin & FabricObject,\n full?: boolean,\n additionalTransform = '',\n ) {\n const transform = full ? this.calcTransformMatrix() : this.calcOwnMatrix(),\n svgTransform = `transform=\"${matrixToSVG(transform)}`;\n return `${svgTransform}${additionalTransform}\" `;\n }\n\n /**\n * Returns svg representation of an instance\n * This function is implemented in each subclass\n * This is just because typescript otherwise cryies all the time\n * @return {Array} an array of strings with the specific svg representation\n * of the instance\n */\n _toSVG(_reviver?: TSVGReviver): string[] {\n return [''];\n }\n\n /**\n * Returns svg representation of an instance\n * @param {TSVGReviver} [reviver] Method for further parsing of svg representation.\n * @return {String} svg representation of an instance\n */\n toSVG(\n this: FabricObjectSVGExportMixin & FabricObject,\n reviver?: TSVGReviver,\n ) {\n return this._createBaseSVGMarkup(this._toSVG(reviver), {\n reviver,\n });\n }\n\n /**\n * Returns svg clipPath representation of an instance\n * @param {TSVGReviver} [reviver] Method for further parsing of svg representation.\n * @return {String} svg representation of an instance\n */\n toClipPathSVG(\n this: FabricObjectSVGExportMixin & FabricObject,\n reviver?: TSVGReviver,\n ) {\n return (\n '\\t' +\n this._createBaseClipPathSVGMarkup(this._toSVG(reviver), {\n reviver,\n })\n );\n }\n\n /**\n * @private\n */\n _createBaseClipPathSVGMarkup(\n this: FabricObjectSVGExportMixin & FabricObject,\n objectMarkup: string[],\n {\n reviver,\n additionalTransform = '',\n }: { reviver?: TSVGReviver; additionalTransform?: string } = {},\n ) {\n const commonPieces = [\n this.getSvgTransform(true, additionalTransform),\n this.getSvgCommons(),\n ].join(''),\n // insert commons in the markup, style and svgCommons\n index = objectMarkup.indexOf('COMMON_PARTS');\n objectMarkup[index] = commonPieces;\n return reviver ? reviver(objectMarkup.join('')) : objectMarkup.join('');\n }\n\n /**\n * @private\n */\n _createBaseSVGMarkup(\n this: FabricObjectSVGExportMixin & FabricObject,\n objectMarkup: string[],\n {\n noStyle,\n reviver,\n withShadow,\n additionalTransform,\n }: {\n noStyle?: boolean;\n reviver?: TSVGReviver;\n withShadow?: boolean;\n additionalTransform?: string;\n } = {},\n ): string {\n const styleInfo = noStyle ? '' : `style=\"${this.getSvgStyles()}\" `,\n shadowInfo = withShadow ? `style=\"${this.getSvgFilter()}\" ` : '',\n clipPath = this.clipPath as FabricObjectSVGExportMixin & FabricObject,\n vectorEffect = this.strokeUniform\n ? 'vector-effect=\"non-scaling-stroke\" '\n : '',\n absoluteClipPath = clipPath && clipPath.absolutePositioned,\n stroke = this.stroke,\n fill = this.fill,\n shadow = this.shadow,\n markup = [],\n // insert commons in the markup, style and svgCommons\n index = objectMarkup.indexOf('COMMON_PARTS');\n let clipPathMarkup;\n if (clipPath) {\n clipPath.clipPathId = `CLIPPATH_${uid()}`;\n clipPathMarkup = `\\n${clipPath.toClipPathSVG(reviver)}\\n`;\n }\n if (absoluteClipPath) {\n markup.push('\\n');\n }\n markup.push(\n '\\n',\n );\n const commonPieces = [\n styleInfo,\n vectorEffect,\n noStyle ? '' : this.addPaintOrder(),\n ' ',\n additionalTransform ? `transform=\"${additionalTransform}\" ` : '',\n ].join('');\n objectMarkup[index] = commonPieces;\n if (isFiller(fill)) {\n markup.push(fill.toSVG(this));\n }\n if (isFiller(stroke)) {\n markup.push(stroke.toSVG(this));\n }\n if (shadow) {\n markup.push(shadow.toSVG(this));\n }\n if (clipPath) {\n markup.push(clipPathMarkup);\n }\n markup.push(objectMarkup.join(''));\n markup.push('\\n');\n absoluteClipPath && markup.push('\\n');\n return reviver ? reviver(markup.join('')) : markup.join('');\n }\n\n addPaintOrder(this: FabricObjectSVGExportMixin & FabricObject) {\n return this.paintFirst !== FILL ? ` paint-order=\"${this.paintFirst}\" ` : '';\n }\n}\n","export function getSvgRegex(arr: string[]) {\n return new RegExp('^(' + arr.join('|') + ')\\\\b', 'i');\n}\n","import { FILL, LEFT, STROKE, reNewline } from '../../constants';\nimport type { TClassProperties } from '../../typedefs';\nimport type { FabricText } from './Text';\n\nexport const TEXT_DECORATION_THICKNESS = 'textDecorationThickness';\n\nconst fontProperties = [\n 'fontSize',\n 'fontWeight',\n 'fontFamily',\n 'fontStyle',\n] as const;\n\nexport const textDecorationProperties = [\n 'underline',\n 'overline',\n 'linethrough',\n] as const;\n\nexport const textLayoutProperties: string[] = [\n ...fontProperties,\n 'lineHeight',\n 'text',\n 'charSpacing',\n 'textAlign',\n 'styles',\n 'path',\n 'pathStartOffset',\n 'pathSide',\n 'pathAlign',\n];\n\nexport const additionalProps = [\n ...textLayoutProperties,\n ...textDecorationProperties,\n 'textBackgroundColor',\n 'direction',\n TEXT_DECORATION_THICKNESS,\n] as const;\n\nexport type StylePropertiesType =\n | 'fill'\n | 'stroke'\n | 'strokeWidth'\n | 'fontSize'\n | 'fontFamily'\n | 'fontWeight'\n | 'fontStyle'\n | 'textBackgroundColor'\n | 'deltaY'\n | 'overline'\n | 'underline'\n | 'linethrough'\n | typeof TEXT_DECORATION_THICKNESS;\n\nexport const styleProperties: Readonly = [\n ...fontProperties,\n ...textDecorationProperties,\n STROKE,\n 'strokeWidth',\n FILL,\n 'deltaY',\n 'textBackgroundColor',\n TEXT_DECORATION_THICKNESS,\n] as const;\n\n// @TODO: Many things here are configuration related and shouldn't be on the class nor prototype\n// regexes, list of properties that are not suppose to change by instances, magic consts.\n// this will be a separated effort\nexport const textDefaultValues: Partial> = {\n _reNewline: reNewline,\n _reSpacesAndTabs: /[ \\t\\r]/g,\n _reSpaceAndTab: /[ \\t\\r]/,\n _reWords: /\\S+/g,\n fontSize: 40,\n fontWeight: 'normal',\n fontFamily: 'Times New Roman',\n underline: false,\n overline: false,\n linethrough: false,\n textAlign: LEFT,\n fontStyle: 'normal',\n lineHeight: 1.16,\n textBackgroundColor: '',\n stroke: null,\n shadow: null,\n path: undefined,\n pathStartOffset: 0,\n pathSide: LEFT,\n pathAlign: 'baseline',\n charSpacing: 0,\n deltaY: 0,\n direction: 'ltr',\n CACHE_FONT_SIZE: 400,\n MIN_TEXT_WIDTH: 2,\n // Text magic numbers\n superscript: {\n size: 0.6, // fontSize factor\n baseline: -0.35, // baseline-shift factor (upwards)\n },\n subscript: {\n size: 0.6, // fontSize factor\n baseline: 0.11, // baseline-shift factor (downwards)\n },\n _fontSizeFraction: 0.222,\n offsets: {\n underline: 0.1,\n linethrough: -0.28167, // added 1/30 to original number\n overline: -0.81333, // added 1/15 to original number\n },\n _fontSizeMult: 1.13,\n [TEXT_DECORATION_THICKNESS]: 66.667, // before implementation was 1/15\n};\n\nexport const JUSTIFY = 'justify';\nexport const JUSTIFY_LEFT = 'justify-left';\nexport const JUSTIFY_RIGHT = 'justify-right';\nexport const JUSTIFY_CENTER = 'justify-center';\n","import { getSvgRegex } from './getSvgRegex';\nimport { LEFT, TOP } from '../constants';\nimport { TEXT_DECORATION_THICKNESS } from '../shapes/Text/constants';\n\n// matches, e.g.: +14.56e-12, etc.\nexport const reNum = String.raw`[-+]?(?:\\d*\\.\\d+|\\d+\\.?)(?:[eE][-+]?\\d+)?`;\nexport const viewportSeparator = String.raw`(?:\\s*,?\\s+|\\s*,\\s*)`;\n\nexport const svgNS = 'http://www.w3.org/2000/svg';\n\nexport const reFontDeclaration = new RegExp(\n '(normal|italic)?\\\\s*(normal|small-caps)?\\\\s*' +\n '(normal|bold|bolder|lighter|100|200|300|400|500|600|700|800|900)?\\\\s*(' +\n reNum +\n '(?:px|cm|mm|em|pt|pc|in)*)(?:\\\\/(normal|' +\n reNum +\n '))?\\\\s+(.*)',\n);\n\nexport const svgValidTagNames = [\n 'path',\n 'circle',\n 'polygon',\n 'polyline',\n 'ellipse',\n 'rect',\n 'line',\n 'image',\n 'text',\n ],\n svgViewBoxElements = ['symbol', 'image', 'marker', 'pattern', 'view', 'svg'],\n svgInvalidAncestors = [\n 'pattern',\n 'defs',\n 'symbol',\n 'metadata',\n 'clipPath',\n 'mask',\n 'desc',\n ],\n svgValidParents = ['symbol', 'g', 'a', 'svg', 'clipPath', 'defs'],\n attributesMap = {\n cx: LEFT,\n x: LEFT,\n r: 'radius',\n cy: TOP,\n y: TOP,\n display: 'visible',\n visibility: 'visible',\n transform: 'transformMatrix',\n 'fill-opacity': 'fillOpacity',\n 'fill-rule': 'fillRule',\n 'font-family': 'fontFamily',\n 'font-size': 'fontSize',\n 'font-style': 'fontStyle',\n 'font-weight': 'fontWeight',\n 'letter-spacing': 'charSpacing',\n 'paint-order': 'paintFirst',\n 'stroke-dasharray': 'strokeDashArray',\n 'stroke-dashoffset': 'strokeDashOffset',\n 'stroke-linecap': 'strokeLineCap',\n 'stroke-linejoin': 'strokeLineJoin',\n 'stroke-miterlimit': 'strokeMiterLimit',\n 'stroke-opacity': 'strokeOpacity',\n 'stroke-width': 'strokeWidth',\n 'text-decoration': 'textDecoration',\n 'text-anchor': 'textAnchor',\n opacity: 'opacity',\n 'clip-path': 'clipPath',\n 'clip-rule': 'clipRule',\n 'vector-effect': 'strokeUniform',\n 'image-rendering': 'imageSmoothing',\n 'text-decoration-thickness': TEXT_DECORATION_THICKNESS,\n },\n fSize = 'font-size',\n cPath = 'clip-path';\n\nexport const svgValidTagNamesRegEx = getSvgRegex(svgValidTagNames);\n\nexport const svgViewBoxElementsRegEx = getSvgRegex(svgViewBoxElements);\n\nexport const svgValidParentsRegEx = getSvgRegex(svgValidParents);\n\n// http://www.w3.org/TR/SVG/coords.html#ViewBoxAttribute\n\nexport const reViewBoxAttrValue = new RegExp(\n String.raw`^\\s*(${reNum})${viewportSeparator}(${reNum})${viewportSeparator}(${reNum})${viewportSeparator}(${reNum})\\s*$`,\n);\n","import { classRegistry } from './ClassRegistry';\nimport { Color } from './color/Color';\nimport { config } from './config';\nimport { reNum } from './parser/constants';\nimport { Point } from './Point';\nimport type { FabricObject } from './shapes/Object/FabricObject';\nimport type { TClassProperties } from './typedefs';\nimport { uid } from './util/internals/uid';\nimport { pickBy } from './util/misc/pick';\nimport { degreesToRadians } from './util/misc/radiansDegreesConversion';\nimport { toFixed } from './util/misc/toFixed';\nimport { rotateVector } from './util/misc/vectors';\n\n/**\n * Regex matching shadow offsetX, offsetY and blur (ex: \"2px 2px 10px rgba(0,0,0,0.2)\", \"rgb(0,255,0) 2px 2px\")\n * - (?:\\s|^): This part captures either a whitespace character (\\s) or the beginning of a line (^). It's non-capturing (due to (?:...)), meaning it doesn't create a capturing group.\n * - (-?\\d+(?:\\.\\d*)?(?:px)?(?:\\s?|$))?: This captures the first component of the shadow, which is the horizontal offset. Breaking it down:\n * - (-?\\d+): Captures an optional minus sign followed by one or more digits (integer part of the number).\n * - (?:\\.\\d*)?: Optionally captures a decimal point followed by zero or more digits (decimal part of the number).\n * - (?:px)?: Optionally captures the \"px\" unit.\n * - (?:\\s?|$): Captures either an optional whitespace or the end of the line. This whole part is wrapped in a non-capturing group and marked as optional with ?.\n * - (-?\\d+(?:\\.\\d*)?(?:px)?(?:\\s?|$))?: Similar to the previous step, this captures the vertical offset.\n\n(\\d+(?:\\.\\d*)?(?:px)?)?: This captures the blur radius. It's similar to the horizontal offset but without the optional minus sign.\n\n(?:\\s+(-?\\d+(?:\\.\\d*)?(?:px)?(?:\\s?|$))?){0,1}: This captures an optional part for the color. It allows for whitespace followed by a component with an optional minus sign, digits, decimal point, and \"px\" unit.\n\n(?:$|\\s): This captures either the end of the line or a whitespace character. It ensures that the match ends either at the end of the string or with a whitespace character.\n */\n// eslint-disable-next-line max-len\n\nconst shadowOffsetRegex = '(-?\\\\d+(?:\\\\.\\\\d*)?(?:px)?(?:\\\\s?|$))?';\n\nconst reOffsetsAndBlur = new RegExp(\n '(?:\\\\s|^)' +\n shadowOffsetRegex +\n shadowOffsetRegex +\n '(' +\n reNum +\n '?(?:px)?)?(?:\\\\s?|$)(?:$|\\\\s)',\n);\n\nexport const shadowDefaultValues: Partial> = {\n color: 'rgb(0,0,0)',\n blur: 0,\n offsetX: 0,\n offsetY: 0,\n affectStroke: false,\n includeDefaultValues: true,\n nonScaling: false,\n};\n\nexport type SerializedShadowOptions = {\n color: string;\n blur: number;\n offsetX: number;\n offsetY: number;\n affectStroke: boolean;\n nonScaling: boolean;\n type: string;\n};\n\nexport class Shadow {\n /**\n * Shadow color\n * @type String\n */\n declare color: string;\n\n /**\n * Shadow blur\n * @type Number\n */\n declare blur: number;\n\n /**\n * Shadow horizontal offset\n * @type Number\n */\n declare offsetX: number;\n\n /**\n * Shadow vertical offset\n * @type Number\n */\n declare offsetY: number;\n\n /**\n * Whether the shadow should affect stroke operations\n * @type Boolean\n */\n declare affectStroke: boolean;\n\n /**\n * Indicates whether toObject should include default values\n * @type Boolean\n */\n declare includeDefaultValues: boolean;\n\n /**\n * When `false`, the shadow will scale with the object.\n * When `true`, the shadow's offsetX, offsetY, and blur will not be affected by the object's scale.\n * default to false\n * @type Boolean\n */\n declare nonScaling: boolean;\n\n declare id: number;\n\n static ownDefaults = shadowDefaultValues;\n\n static type = 'shadow';\n\n /**\n * @see {@link http://fabric5.fabricjs.com/shadows|Shadow demo}\n * @param {Object|String} [options] Options object with any of color, blur, offsetX, offsetY properties or string (e.g. \"rgba(0,0,0,0.2) 2px 2px 10px\")\n */\n constructor(options?: Partial>);\n constructor(svgAttribute: string);\n constructor(arg0: string | Partial> = {}) {\n const options: Partial> =\n typeof arg0 === 'string' ? Shadow.parseShadow(arg0) : arg0;\n Object.assign(this, Shadow.ownDefaults, options);\n this.id = uid();\n }\n\n /**\n * @param {String} value Shadow value to parse\n * @return {Object} Shadow object with color, offsetX, offsetY and blur\n */\n static parseShadow(value: string) {\n const shadowStr = value.trim(),\n [, offsetX = 0, offsetY = 0, blur = 0] = (\n reOffsetsAndBlur.exec(shadowStr) || []\n ).map((value) => parseFloat(value) || 0),\n color = (shadowStr.replace(reOffsetsAndBlur, '') || 'rgb(0,0,0)').trim();\n\n return {\n color,\n offsetX,\n offsetY,\n blur,\n };\n }\n\n /**\n * Returns a string representation of an instance\n * @see http://www.w3.org/TR/css-text-decor-3/#text-shadow\n * @return {String} Returns CSS3 text-shadow declaration\n */\n toString() {\n return [this.offsetX, this.offsetY, this.blur, this.color].join('px ');\n }\n\n /**\n * Returns SVG representation of a shadow\n * @param {FabricObject} object\n * @return {String} SVG representation of a shadow\n */\n toSVG(object: FabricObject) {\n const offset = rotateVector(\n new Point(this.offsetX, this.offsetY),\n degreesToRadians(-object.angle),\n ),\n BLUR_BOX = 20,\n color = new Color(this.color);\n let fBoxX = 40,\n fBoxY = 40;\n\n if (object.width && object.height) {\n //http://www.w3.org/TR/SVG/filters.html#FilterEffectsRegion\n // we add some extra space to filter box to contain the blur ( 20 )\n fBoxX =\n toFixed(\n (Math.abs(offset.x) + this.blur) / object.width,\n config.NUM_FRACTION_DIGITS,\n ) *\n 100 +\n BLUR_BOX;\n fBoxY =\n toFixed(\n (Math.abs(offset.y) + this.blur) / object.height,\n config.NUM_FRACTION_DIGITS,\n ) *\n 100 +\n BLUR_BOX;\n }\n if (object.flipX) {\n offset.x *= -1;\n }\n if (object.flipY) {\n offset.y *= -1;\n }\n\n return `\\n\\t\\n\\t\\n\\t\\n\\t\\n\\t\\n\\t\\t\\n\\t\\t\\n\\t\\n\\n`;\n }\n\n /**\n * Returns object representation of a shadow\n * @return {Object} Object representation of a shadow instance\n */\n toObject() {\n const data: SerializedShadowOptions = {\n color: this.color,\n blur: this.blur,\n offsetX: this.offsetX,\n offsetY: this.offsetY,\n affectStroke: this.affectStroke,\n nonScaling: this.nonScaling,\n type: (this.constructor as typeof Shadow).type,\n };\n const defaults = Shadow.ownDefaults as SerializedShadowOptions;\n return !this.includeDefaultValues\n ? pickBy(data, (value, key) => value !== defaults[key])\n : data;\n }\n\n static async fromObject(options: Partial>) {\n return new this(options);\n }\n}\n\nclassRegistry.setClass(Shadow, 'shadow');\n","export const capValue = (min: number, value: number, max: number) =>\n Math.max(min, Math.min(value, max));\n","import {\n TOP,\n LEFT,\n SCALE_Y,\n SCALE_X,\n SKEW_X,\n SKEW_Y,\n FILL,\n STROKE,\n} from '../../constants';\nimport type { TClassProperties } from '../../typedefs';\nimport type { InteractiveFabricObject } from './InteractiveObject';\nimport type { FabricObject } from './Object';\n\nexport const stateProperties = [\n TOP,\n LEFT,\n SCALE_X,\n SCALE_Y,\n 'flipX',\n 'flipY',\n 'originX',\n 'originY',\n 'angle',\n 'opacity',\n 'globalCompositeOperation',\n 'shadow',\n 'visible',\n SKEW_X,\n SKEW_Y,\n];\n\nexport const cacheProperties = [\n FILL,\n STROKE,\n 'strokeWidth',\n 'strokeDashArray',\n 'width',\n 'height',\n 'paintFirst',\n 'strokeUniform',\n 'strokeLineCap',\n 'strokeDashOffset',\n 'strokeLineJoin',\n 'strokeMiterLimit',\n 'backgroundColor',\n 'clipPath',\n];\n\nexport const fabricObjectDefaultValues: Partial<\n TClassProperties\n> = {\n // see composeMatrix() to see order of transforms. First defaults listed based on this\n top: 0,\n left: 0,\n width: 0,\n height: 0,\n angle: 0,\n flipX: false,\n flipY: false,\n scaleX: 1,\n scaleY: 1,\n minScaleLimit: 0,\n skewX: 0,\n skewY: 0,\n originX: LEFT,\n originY: TOP,\n strokeWidth: 1,\n strokeUniform: false,\n padding: 0,\n opacity: 1,\n paintFirst: FILL,\n fill: 'rgb(0,0,0)',\n fillRule: 'nonzero',\n stroke: null,\n strokeDashArray: null,\n strokeDashOffset: 0,\n strokeLineCap: 'butt',\n strokeLineJoin: 'miter',\n strokeMiterLimit: 4,\n globalCompositeOperation: 'source-over',\n backgroundColor: '',\n shadow: null,\n visible: true,\n includeDefaultValues: true,\n excludeFromExport: false,\n objectCaching: true,\n clipPath: undefined,\n inverted: false,\n absolutePositioned: false,\n centeredRotation: true,\n centeredScaling: false,\n dirty: true,\n} as const;\n\nexport const interactiveObjectDefaultValues: Partial<\n TClassProperties\n> = {\n noScaleCache: true,\n lockMovementX: false,\n lockMovementY: false,\n lockRotation: false,\n lockScalingX: false,\n lockScalingY: false,\n lockSkewingX: false,\n lockSkewingY: false,\n lockScalingFlip: false,\n cornerSize: 13,\n touchCornerSize: 24,\n transparentCorners: true,\n cornerColor: 'rgb(178,204,255)',\n cornerStrokeColor: '',\n cornerStyle: 'rect',\n cornerDashArray: null,\n hasControls: true,\n borderColor: 'rgb(178,204,255)',\n borderDashArray: null,\n borderOpacityWhenMoving: 0.4,\n borderScaleFactor: 1,\n hasBorders: true,\n selectionBackgroundColor: '',\n selectable: true,\n evented: true,\n perPixelTargetFind: false,\n activeOn: 'down',\n hoverCursor: null,\n moveCursor: null,\n};\n","/**\n * Easing functions\n * @see {@link http://gizma.com/easing/ Easing Equations by Robert Penner}\n */\n\nimport { twoMathPi, halfPI } from '../../constants';\nimport type { TEasingFunction } from './types';\n\nconst normalize = (a: number, c: number, p: number, s: number) => {\n if (a < Math.abs(c)) {\n a = c;\n s = p / 4;\n } else {\n //handle the 0/0 case:\n if (c === 0 && a === 0) {\n s = (p / twoMathPi) * Math.asin(1);\n } else {\n s = (p / twoMathPi) * Math.asin(c / a);\n }\n }\n return { a, c, p, s };\n};\n\nconst elastic = (\n a: number,\n s: number,\n p: number,\n t: number,\n d: number,\n): number =>\n a * Math.pow(2, 10 * (t -= 1)) * Math.sin(((t * d - s) * twoMathPi) / p);\n\n/**\n * Default sinusoidal easing\n */\nexport const defaultEasing: TEasingFunction = (t, b, c, d) =>\n -c * Math.cos((t / d) * halfPI) + c + b;\n\n/**\n * Cubic easing in\n */\nexport const easeInCubic: TEasingFunction = (t, b, c, d) =>\n c * (t / d) ** 3 + b;\n\n/**\n * Cubic easing out\n */\nexport const easeOutCubic: TEasingFunction = (t, b, c, d) =>\n c * ((t / d - 1) ** 3 + 1) + b;\n\n/**\n * Cubic easing in and out\n */\nexport const easeInOutCubic: TEasingFunction = (t, b, c, d) => {\n t /= d / 2;\n if (t < 1) {\n return (c / 2) * t ** 3 + b;\n }\n return (c / 2) * ((t - 2) ** 3 + 2) + b;\n};\n\n/**\n * Quartic easing in\n */\nexport const easeInQuart: TEasingFunction = (t, b, c, d) =>\n c * (t /= d) * t ** 3 + b;\n\n/**\n * Quartic easing out\n */\nexport const easeOutQuart: TEasingFunction = (t, b, c, d) =>\n -c * ((t = t / d - 1) * t ** 3 - 1) + b;\n\n/**\n * Quartic easing in and out\n */\nexport const easeInOutQuart: TEasingFunction = (t, b, c, d) => {\n t /= d / 2;\n if (t < 1) {\n return (c / 2) * t ** 4 + b;\n }\n return (-c / 2) * ((t -= 2) * t ** 3 - 2) + b;\n};\n\n/**\n * Quintic easing in\n */\nexport const easeInQuint: TEasingFunction = (t, b, c, d) =>\n c * (t / d) ** 5 + b;\n\n/**\n * Quintic easing out\n */\nexport const easeOutQuint: TEasingFunction = (t, b, c, d) =>\n c * ((t / d - 1) ** 5 + 1) + b;\n\n/**\n * Quintic easing in and out\n */\nexport const easeInOutQuint: TEasingFunction = (t, b, c, d) => {\n t /= d / 2;\n if (t < 1) {\n return (c / 2) * t ** 5 + b;\n }\n return (c / 2) * ((t - 2) ** 5 + 2) + b;\n};\n\n/**\n * Sinusoidal easing in\n */\nexport const easeInSine: TEasingFunction = (t, b, c, d) =>\n -c * Math.cos((t / d) * halfPI) + c + b;\n\n/**\n * Sinusoidal easing out\n */\nexport const easeOutSine: TEasingFunction = (t, b, c, d) =>\n c * Math.sin((t / d) * halfPI) + b;\n\n/**\n * Sinusoidal easing in and out\n */\nexport const easeInOutSine: TEasingFunction = (t, b, c, d) =>\n (-c / 2) * (Math.cos((Math.PI * t) / d) - 1) + b;\n\n/**\n * Exponential easing in\n */\nexport const easeInExpo: TEasingFunction = (t, b, c, d) =>\n t === 0 ? b : c * 2 ** (10 * (t / d - 1)) + b;\n\n/**\n * Exponential easing out\n */\nexport const easeOutExpo: TEasingFunction = (t, b, c, d) =>\n t === d ? b + c : c * -(2 ** ((-10 * t) / d) + 1) + b;\n\n/**\n * Exponential easing in and out\n */\nexport const easeInOutExpo: TEasingFunction = (t, b, c, d) => {\n if (t === 0) {\n return b;\n }\n if (t === d) {\n return b + c;\n }\n t /= d / 2;\n if (t < 1) {\n return (c / 2) * 2 ** (10 * (t - 1)) + b;\n }\n return (c / 2) * -(2 ** (-10 * --t) + 2) + b;\n};\n\n/**\n * Circular easing in\n */\nexport const easeInCirc: TEasingFunction = (t, b, c, d) =>\n -c * (Math.sqrt(1 - (t /= d) * t) - 1) + b;\n\n/**\n * Circular easing out\n */\nexport const easeOutCirc: TEasingFunction = (t, b, c, d) =>\n c * Math.sqrt(1 - (t = t / d - 1) * t) + b;\n\n/**\n * Circular easing in and out\n */\nexport const easeInOutCirc: TEasingFunction = (t, b, c, d) => {\n t /= d / 2;\n if (t < 1) {\n return (-c / 2) * (Math.sqrt(1 - t ** 2) - 1) + b;\n }\n return (c / 2) * (Math.sqrt(1 - (t -= 2) * t) + 1) + b;\n};\n\n/**\n * Elastic easing in\n */\nexport const easeInElastic: TEasingFunction = (t, b, c, d) => {\n const s = 1.70158,\n a = c;\n let p = 0;\n if (t === 0) {\n return b;\n }\n t /= d;\n if (t === 1) {\n return b + c;\n }\n if (!p) {\n p = d * 0.3;\n }\n const { a: normA, s: normS, p: normP } = normalize(a, c, p, s);\n return -elastic(normA, normS, normP, t, d) + b;\n};\n\n/**\n * Elastic easing out\n */\nexport const easeOutElastic: TEasingFunction = (t, b, c, d) => {\n const s = 1.70158,\n a = c;\n let p = 0;\n if (t === 0) {\n return b;\n }\n t /= d;\n if (t === 1) {\n return b + c;\n }\n if (!p) {\n p = d * 0.3;\n }\n const { a: normA, s: normS, p: normP, c: normC } = normalize(a, c, p, s);\n return (\n normA * 2 ** (-10 * t) * Math.sin(((t * d - normS) * twoMathPi) / normP) +\n normC +\n b\n );\n};\n\n/**\n * Elastic easing in and out\n */\nexport const easeInOutElastic: TEasingFunction = (t, b, c, d) => {\n const s = 1.70158,\n a = c;\n let p = 0;\n if (t === 0) {\n return b;\n }\n t /= d / 2;\n if (t === 2) {\n return b + c;\n }\n if (!p) {\n p = d * (0.3 * 1.5);\n }\n const { a: normA, s: normS, p: normP, c: normC } = normalize(a, c, p, s);\n if (t < 1) {\n return -0.5 * elastic(normA, normS, normP, t, d) + b;\n }\n return (\n normA *\n Math.pow(2, -10 * (t -= 1)) *\n Math.sin(((t * d - normS) * twoMathPi) / normP) *\n 0.5 +\n normC +\n b\n );\n};\n\n/**\n * Backwards easing in\n */\nexport const easeInBack: TEasingFunction = (t, b, c, d, s = 1.70158) =>\n c * (t /= d) * t * ((s + 1) * t - s) + b;\n\n/**\n * Backwards easing out\n */\nexport const easeOutBack: TEasingFunction = (t, b, c, d, s = 1.70158) =>\n c * ((t = t / d - 1) * t * ((s + 1) * t + s) + 1) + b;\n\n/**\n * Backwards easing in and out\n */\nexport const easeInOutBack: TEasingFunction = (t, b, c, d, s = 1.70158) => {\n t /= d / 2;\n if (t < 1) {\n return (c / 2) * (t * t * (((s *= 1.525) + 1) * t - s)) + b;\n }\n return (c / 2) * ((t -= 2) * t * (((s *= 1.525) + 1) * t + s) + 2) + b;\n};\n\n/**\n * Bouncing easing out\n */\nexport const easeOutBounce: TEasingFunction = (t, b, c, d) => {\n if ((t /= d) < 1 / 2.75) {\n return c * (7.5625 * t * t) + b;\n } else if (t < 2 / 2.75) {\n return c * (7.5625 * (t -= 1.5 / 2.75) * t + 0.75) + b;\n } else if (t < 2.5 / 2.75) {\n return c * (7.5625 * (t -= 2.25 / 2.75) * t + 0.9375) + b;\n } else {\n return c * (7.5625 * (t -= 2.625 / 2.75) * t + 0.984375) + b;\n }\n};\n\n/**\n * Bouncing easing in\n */\nexport const easeInBounce: TEasingFunction = (t, b, c, d) =>\n c - easeOutBounce(d - t, 0, c, d) + b;\n\n/**\n * Bouncing easing in and out\n */\nexport const easeInOutBounce: TEasingFunction = (t, b, c, d) =>\n t < d / 2\n ? easeInBounce(t * 2, 0, c, d) * 0.5 + b\n : easeOutBounce(t * 2 - d, 0, c, d) * 0.5 + c * 0.5 + b;\n\n/**\n * Quadratic easing in\n */\nexport const easeInQuad: TEasingFunction = (t, b, c, d) => c * (t /= d) * t + b;\n\n/**\n * Quadratic easing out\n */\nexport const easeOutQuad: TEasingFunction = (t, b, c, d) =>\n -c * (t /= d) * (t - 2) + b;\n\n/**\n * Quadratic easing in and out\n */\nexport const easeInOutQuad: TEasingFunction = (t, b, c, d) => {\n t /= d / 2;\n if (t < 1) {\n return (c / 2) * t ** 2 + b;\n }\n return (-c / 2) * (--t * (t - 2) - 1) + b;\n};\n","import { noop } from '../../constants';\nimport { requestAnimFrame } from './AnimationFrameProvider';\nimport { runningAnimations } from './AnimationRegistry';\nimport { defaultEasing } from './easing';\nimport type {\n AnimationState,\n TAbortCallback,\n TBaseAnimationOptions,\n TEasingFunction,\n TOnAnimationChangeCallback,\n} from './types';\n\nconst defaultAbort = () => false;\n\nexport abstract class AnimationBase<\n T extends number | number[] = number | number[],\n> {\n declare readonly startValue: T;\n declare readonly endValue: T;\n declare readonly duration: number;\n declare readonly delay: number;\n\n declare protected readonly byValue: T;\n declare protected readonly easing: TEasingFunction;\n\n declare private readonly _onStart: VoidFunction;\n declare private readonly _onChange: TOnAnimationChangeCallback;\n declare private readonly _onComplete: TOnAnimationChangeCallback;\n declare private readonly _abort: TAbortCallback;\n\n /**\n * Used to register the animation to a target object\n * so that it can be cancelled within the object context\n */\n declare readonly target?: unknown;\n\n private _state: AnimationState = 'pending';\n /**\n * Time %, or the ratio of `timeElapsed / duration`\n * @see tick\n */\n durationProgress = 0;\n /**\n * Value %, or the ratio of `(currentValue - startValue) / (endValue - startValue)`\n */\n valueProgress = 0;\n /**\n * Current value\n */\n declare value: T;\n /**\n * Animation start time ms\n */\n declare private startTime: number;\n\n constructor({\n startValue,\n byValue,\n duration = 500,\n delay = 0,\n easing = defaultEasing,\n onStart = noop,\n onChange = noop,\n onComplete = noop,\n abort = defaultAbort,\n target,\n }: TBaseAnimationOptions) {\n this.tick = this.tick.bind(this);\n\n this.duration = duration;\n this.delay = delay;\n this.easing = easing;\n this._onStart = onStart;\n this._onChange = onChange;\n this._onComplete = onComplete;\n this._abort = abort;\n this.target = target;\n\n this.startValue = startValue;\n this.byValue = byValue;\n this.value = this.startValue;\n this.endValue = Object.freeze(this.calculate(this.duration).value);\n }\n\n get state() {\n return this._state;\n }\n\n isDone() {\n return this._state === 'aborted' || this._state === 'completed';\n }\n\n /**\n * Calculate the current value based on the easing parameters\n * @param timeElapsed in ms\n * @protected\n */\n protected abstract calculate(timeElapsed: number): {\n value: T;\n valueProgress: number;\n };\n\n start() {\n const firstTick: FrameRequestCallback = (timestamp) => {\n if (this._state !== 'pending') return;\n this.startTime = timestamp || +new Date();\n this._state = 'running';\n this._onStart();\n this.tick(this.startTime);\n };\n\n this.register();\n\n // setTimeout(cb, 0) will run cb on the next frame, causing a delay\n // we don't want that\n if (this.delay > 0) {\n setTimeout(() => requestAnimFrame(firstTick), this.delay);\n } else {\n requestAnimFrame(firstTick);\n }\n }\n\n private tick(t: number) {\n const durationMs = (t || +new Date()) - this.startTime;\n const boundDurationMs = Math.min(durationMs, this.duration);\n this.durationProgress = boundDurationMs / this.duration;\n const { value, valueProgress } = this.calculate(boundDurationMs);\n this.value = Object.freeze(value);\n this.valueProgress = valueProgress;\n\n if (this._state === 'aborted') {\n return;\n } else if (\n this._abort(this.value, this.valueProgress, this.durationProgress)\n ) {\n this._state = 'aborted';\n this.unregister();\n } else if (durationMs >= this.duration) {\n this.durationProgress = this.valueProgress = 1;\n this._onChange(this.endValue, this.valueProgress, this.durationProgress);\n this._state = 'completed';\n this._onComplete(\n this.endValue,\n this.valueProgress,\n this.durationProgress,\n );\n this.unregister();\n } else {\n this._onChange(this.value, this.valueProgress, this.durationProgress);\n requestAnimFrame(this.tick);\n }\n }\n\n private register() {\n runningAnimations.push(this as unknown as AnimationBase);\n }\n\n private unregister() {\n runningAnimations.remove(this as unknown as AnimationBase);\n }\n\n abort() {\n this._state = 'aborted';\n this.unregister();\n }\n}\n","import { AnimationBase } from './AnimationBase';\nimport type { ValueAnimationOptions } from './types';\n\nexport class ValueAnimation extends AnimationBase {\n constructor({\n startValue = 0,\n endValue = 100,\n ...otherOptions\n }: ValueAnimationOptions) {\n super({\n ...otherOptions,\n startValue,\n byValue: endValue - startValue,\n });\n }\n\n protected calculate(timeElapsed: number) {\n const value = this.easing(\n timeElapsed,\n this.startValue,\n this.byValue,\n this.duration,\n );\n return {\n value,\n valueProgress: Math.abs((value - this.startValue) / this.byValue),\n };\n }\n}\n","import { AnimationBase } from './AnimationBase';\nimport type { ArrayAnimationOptions } from './types';\n\nexport class ArrayAnimation extends AnimationBase {\n constructor({\n startValue = [0],\n endValue = [100],\n ...options\n }: ArrayAnimationOptions) {\n super({\n ...options,\n startValue,\n byValue: endValue.map((value, i) => value - startValue[i]),\n });\n }\n protected calculate(timeElapsed: number) {\n const values = this.startValue.map((value, i) =>\n this.easing(timeElapsed, value, this.byValue[i], this.duration, i),\n );\n return {\n value: values,\n valueProgress: Math.abs(\n (values[0] - this.startValue[0]) / this.byValue[0],\n ),\n };\n }\n}\n","import { Color } from '../../color/Color';\nimport type { TRGBAColorSource } from '../../color/typedefs';\nimport { halfPI } from '../../constants';\nimport { capValue } from '../misc/capValue';\nimport { AnimationBase } from './AnimationBase';\nimport type {\n ColorAnimationOptions,\n TEasingFunction,\n TOnAnimationChangeCallback,\n} from './types';\n\nconst defaultColorEasing: TEasingFunction = (\n timeElapsed,\n startValue,\n byValue,\n duration,\n) => {\n const durationProgress = 1 - Math.cos((timeElapsed / duration) * halfPI);\n return startValue + byValue * durationProgress;\n};\n\nconst wrapColorCallback = (\n callback?: TOnAnimationChangeCallback,\n) =>\n callback &&\n ((rgba: TRGBAColorSource, valueProgress: number, durationProgress: number) =>\n callback(new Color(rgba).toRgba(), valueProgress, durationProgress));\n\nexport class ColorAnimation extends AnimationBase {\n constructor({\n startValue,\n endValue,\n easing = defaultColorEasing,\n onChange,\n onComplete,\n abort,\n ...options\n }: ColorAnimationOptions) {\n const startColor = new Color(startValue).getSource();\n const endColor = new Color(endValue).getSource();\n super({\n ...options,\n startValue: startColor,\n byValue: endColor.map(\n (value, i) => value - startColor[i],\n ) as TRGBAColorSource,\n easing,\n onChange: wrapColorCallback(onChange),\n onComplete: wrapColorCallback(onComplete),\n abort: wrapColorCallback(abort),\n });\n }\n protected calculate(timeElapsed: number) {\n const [r, g, b, a] = this.startValue.map((value, i) =>\n this.easing(timeElapsed, value, this.byValue[i], this.duration, i),\n ) as TRGBAColorSource;\n const value = [\n ...[r, g, b].map(Math.round),\n capValue(0, a, 1),\n ] as TRGBAColorSource;\n return {\n value,\n valueProgress:\n // to correctly calculate the change ratio we must find a changed value\n value\n .map((p, i) =>\n this.byValue[i] !== 0\n ? Math.abs((p - this.startValue[i]) / this.byValue[i])\n : 0,\n )\n .find((p) => p !== 0) || 0,\n };\n }\n}\n","import { ValueAnimation } from './ValueAnimation';\nimport { ArrayAnimation } from './ArrayAnimation';\nimport { ColorAnimation } from './ColorAnimation';\nimport type {\n ValueAnimationOptions,\n ArrayAnimationOptions,\n ColorAnimationOptions,\n} from './types';\nimport type { TColorArg } from '../../color/typedefs';\n\nexport type TAnimation =\n T extends TColorArg\n ? ColorAnimation\n : T extends number[]\n ? ArrayAnimation\n : ValueAnimation;\n\nconst isArrayAnimation = (\n options: ArrayAnimationOptions | ValueAnimationOptions,\n): options is ArrayAnimationOptions => {\n return Array.isArray(options.startValue) || Array.isArray(options.endValue);\n};\n\n/**\n * Changes value(s) from startValue to endValue within a certain period of time,\n * invoking callbacks as the value(s) change.\n *\n * @example\n * animate({\n * startValue: 1,\n * endValue: 0,\n * onChange: (v) => {\n * obj.set('opacity', v);\n * // since we are running in a requested frame we should call `renderAll` and not `requestRenderAll`\n * canvas.renderAll();\n * }\n * });\n *\n * @example Using lists:\n * animate({\n * startValue: [1, 2, 3],\n * endValue: [2, 4, 6],\n * onChange: ([x, y, zoom]) => {\n * canvas.zoomToPoint(new Point(x, y), zoom);\n * canvas.renderAll();\n * }\n * });\n *\n */\nexport function animate(options: ArrayAnimationOptions): ArrayAnimation;\nexport function animate(options: ValueAnimationOptions): ValueAnimation;\nexport function animate<\n T extends ValueAnimationOptions | ArrayAnimationOptions,\n>(\n options: T,\n): T extends ArrayAnimationOptions ? ArrayAnimation : ValueAnimation;\nexport function animate<\n T extends ValueAnimationOptions | ArrayAnimationOptions,\n R extends T extends ArrayAnimationOptions ? ArrayAnimation : ValueAnimation,\n>(options: T): R {\n const animation = (\n isArrayAnimation(options)\n ? new ArrayAnimation(options)\n : new ValueAnimation(options)\n ) as R;\n animation.start();\n return animation;\n}\n\nexport function animateColor(options: ColorAnimationOptions) {\n const animation = new ColorAnimation(options);\n animation.start();\n return animation;\n}\n","import { Point } from './Point';\nimport { createVector } from './util/misc/vectors';\n\n/* Adaptation of work of Kevin Lindsey (kevin@kevlindev.com) */\n\nexport type IntersectionType = 'Intersection' | 'Coincident' | 'Parallel';\n\nexport class Intersection {\n declare points: Point[];\n\n declare status?: IntersectionType;\n\n constructor(status?: IntersectionType) {\n this.status = status;\n this.points = [];\n }\n\n /**\n * Used to verify if a point is alredy in the collection\n * @param {Point} point\n * @returns {boolean}\n */\n private includes(point: Point): boolean {\n return this.points.some((p) => p.eq(point));\n }\n\n /**\n * Appends points of intersection\n * @param {...Point[]} points\n * @return {Intersection} thisArg\n */\n private append(...points: Point[]): Intersection {\n this.points = this.points.concat(\n points.filter((point) => {\n return !this.includes(point);\n }),\n );\n return this;\n }\n\n /**\n * check if point T is on the segment or line defined between A and B\n *\n * @param {Point} T the point we are checking for\n * @param {Point} A one extremity of the segment\n * @param {Point} B the other extremity of the segment\n * @param [infinite] if true checks if `T` is on the line defined by `A` and `B`\n * @returns true if `T` is contained\n */\n static isPointContained(T: Point, A: Point, B: Point, infinite = false) {\n if (A.eq(B)) {\n // Edge case: the segment is a point, we check for coincidence,\n // infinite param has no meaning because there are infinite lines to consider\n return T.eq(A);\n } else if (A.x === B.x) {\n // Edge case: horizontal line.\n // we first check if T.x has the same value, and then if T.y is contained between A.y and B.y\n return (\n T.x === A.x &&\n (infinite || (T.y >= Math.min(A.y, B.y) && T.y <= Math.max(A.y, B.y)))\n );\n } else if (A.y === B.y) {\n // Edge case: vertical line.\n // we first check if T.y has the same value, and then if T.x is contained between A.x and B.x\n return (\n T.y === A.y &&\n (infinite || (T.x >= Math.min(A.x, B.x) && T.x <= Math.max(A.x, B.x)))\n );\n } else {\n // Generic case: sloped line.\n // we check that AT has the same slope as AB\n // for the segment case we need both the vectors to have the same direction and for AT to be lte AB in size\n // for the infinite case we check the absolute value of the slope, since direction is meaningless\n const AB = createVector(A, B);\n const AT = createVector(A, T);\n const s = AT.divide(AB);\n return infinite\n ? Math.abs(s.x) === Math.abs(s.y)\n : s.x === s.y && s.x >= 0 && s.x <= 1;\n }\n }\n\n /**\n * Use the ray casting algorithm to determine if point is in the polygon defined by points\n * @see https://en.wikipedia.org/wiki/Point_in_polygon\n * @param point\n * @param points polygon points\n * @returns\n */\n static isPointInPolygon(point: Point, points: Point[]) {\n const other = new Point(point).setX(\n Math.min(point.x - 1, ...points.map((p) => p.x)),\n );\n let hits = 0;\n for (let index = 0; index < points.length; index++) {\n const inter = this.intersectSegmentSegment(\n // polygon side\n points[index],\n points[(index + 1) % points.length],\n // ray\n point,\n other,\n );\n if (inter.includes(point)) {\n // point is on the polygon side\n return true;\n }\n hits += Number(inter.status === 'Intersection');\n }\n return hits % 2 === 1;\n }\n\n /**\n * Checks if a line intersects another\n * @see {@link https://en.wikipedia.org/wiki/Line%E2%80%93line_intersection line intersection}\n * @see {@link https://en.wikipedia.org/wiki/Cramer%27s_rule Cramer's rule}\n * @param {Point} a1\n * @param {Point} a2\n * @param {Point} b1\n * @param {Point} b2\n * @param {boolean} [aInfinite=true] check segment intersection by passing `false`\n * @param {boolean} [bInfinite=true] check segment intersection by passing `false`\n * @return {Intersection}\n */\n static intersectLineLine(\n a1: Point,\n a2: Point,\n b1: Point,\n b2: Point,\n aInfinite = true,\n bInfinite = true,\n ): Intersection {\n const a2xa1x = a2.x - a1.x,\n a2ya1y = a2.y - a1.y,\n b2xb1x = b2.x - b1.x,\n b2yb1y = b2.y - b1.y,\n a1xb1x = a1.x - b1.x,\n a1yb1y = a1.y - b1.y,\n uaT = b2xb1x * a1yb1y - b2yb1y * a1xb1x,\n ubT = a2xa1x * a1yb1y - a2ya1y * a1xb1x,\n uB = b2yb1y * a2xa1x - b2xb1x * a2ya1y;\n if (uB !== 0) {\n const ua = uaT / uB,\n ub = ubT / uB;\n if (\n (aInfinite || (0 <= ua && ua <= 1)) &&\n (bInfinite || (0 <= ub && ub <= 1))\n ) {\n return new Intersection('Intersection').append(\n new Point(a1.x + ua * a2xa1x, a1.y + ua * a2ya1y),\n );\n } else {\n return new Intersection();\n }\n } else {\n if (uaT === 0 || ubT === 0) {\n const segmentsCoincide =\n aInfinite ||\n bInfinite ||\n Intersection.isPointContained(a1, b1, b2) ||\n Intersection.isPointContained(a2, b1, b2) ||\n Intersection.isPointContained(b1, a1, a2) ||\n Intersection.isPointContained(b2, a1, a2);\n return new Intersection(segmentsCoincide ? 'Coincident' : undefined);\n } else {\n return new Intersection('Parallel');\n }\n }\n }\n\n /**\n * Checks if a segment intersects a line\n * @see {@link intersectLineLine} for line intersection\n * @param {Point} s1 boundary point of segment\n * @param {Point} s2 other boundary point of segment\n * @param {Point} l1 point on line\n * @param {Point} l2 other point on line\n * @return {Intersection}\n */\n static intersectSegmentLine(\n s1: Point,\n s2: Point,\n l1: Point,\n l2: Point,\n ): Intersection {\n return Intersection.intersectLineLine(s1, s2, l1, l2, false, true);\n }\n\n /**\n * Checks if a segment intersects another\n * @see {@link intersectLineLine} for line intersection\n * @param {Point} a1 boundary point of segment\n * @param {Point} a2 other boundary point of segment\n * @param {Point} b1 boundary point of segment\n * @param {Point} b2 other boundary point of segment\n * @return {Intersection}\n */\n static intersectSegmentSegment(\n a1: Point,\n a2: Point,\n b1: Point,\n b2: Point,\n ): Intersection {\n return Intersection.intersectLineLine(a1, a2, b1, b2, false, false);\n }\n\n /**\n * Checks if line intersects polygon\n *\n * @todo account for stroke\n *\n * @see {@link intersectSegmentPolygon} for segment intersection\n * @param {Point} a1 point on line\n * @param {Point} a2 other point on line\n * @param {Point[]} points polygon points\n * @param {boolean} [infinite=true] check segment intersection by passing `false`\n * @return {Intersection}\n */\n static intersectLinePolygon(\n a1: Point,\n a2: Point,\n points: Point[],\n infinite = true,\n ): Intersection {\n const result = new Intersection();\n const length = points.length;\n\n for (let i = 0, b1, b2, inter; i < length; i++) {\n b1 = points[i];\n b2 = points[(i + 1) % length];\n inter = Intersection.intersectLineLine(a1, a2, b1, b2, infinite, false);\n if (inter.status === 'Coincident') {\n return inter;\n }\n result.append(...inter.points);\n }\n\n if (result.points.length > 0) {\n result.status = 'Intersection';\n }\n\n return result;\n }\n\n /**\n * Checks if segment intersects polygon\n * @see {@link intersectLinePolygon} for line intersection\n * @param {Point} a1 boundary point of segment\n * @param {Point} a2 other boundary point of segment\n * @param {Point[]} points polygon points\n * @return {Intersection}\n */\n static intersectSegmentPolygon(\n a1: Point,\n a2: Point,\n points: Point[],\n ): Intersection {\n return Intersection.intersectLinePolygon(a1, a2, points, false);\n }\n\n /**\n * Checks if polygon intersects another polygon\n *\n * @todo account for stroke\n *\n * @param {Point[]} points1\n * @param {Point[]} points2\n * @return {Intersection}\n */\n static intersectPolygonPolygon(\n points1: Point[],\n points2: Point[],\n ): Intersection {\n const result = new Intersection(),\n length = points1.length;\n const coincidences: Intersection[] = [];\n\n for (let i = 0; i < length; i++) {\n const a1 = points1[i],\n a2 = points1[(i + 1) % length],\n inter = Intersection.intersectSegmentPolygon(a1, a2, points2);\n if (inter.status === 'Coincident') {\n coincidences.push(inter);\n result.append(a1, a2);\n } else {\n result.append(...inter.points);\n }\n }\n\n if (coincidences.length > 0 && coincidences.length === points1.length) {\n return new Intersection('Coincident');\n } else if (result.points.length > 0) {\n result.status = 'Intersection';\n }\n\n return result;\n }\n\n /**\n * Checks if polygon intersects rectangle\n * @see {@link intersectPolygonPolygon} for polygon intersection\n * @param {Point[]} points polygon points\n * @param {Point} r1 top left point of rect\n * @param {Point} r2 bottom right point of rect\n * @return {Intersection}\n */\n static intersectPolygonRectangle(\n points: Point[],\n r1: Point,\n r2: Point,\n ): Intersection {\n const min = r1.min(r2),\n max = r1.max(r2),\n topRight = new Point(max.x, min.y),\n bottomLeft = new Point(min.x, max.y);\n\n return Intersection.intersectPolygonPolygon(points, [\n min,\n topRight,\n max,\n bottomLeft,\n ]);\n }\n}\n","import type {\n TBBox,\n TCornerPoint,\n TDegree,\n TMat2D,\n TOriginX,\n TOriginY,\n} from '../../typedefs';\nimport { SCALE_X, SCALE_Y, iMatrix } from '../../constants';\nimport { Intersection } from '../../Intersection';\nimport { Point } from '../../Point';\nimport { makeBoundingBoxFromPoints } from '../../util/misc/boundingBoxFromPoints';\nimport {\n createRotateMatrix,\n createTranslateMatrix,\n composeMatrix,\n invertTransform,\n multiplyTransformMatrices,\n transformPoint,\n calcPlaneRotation,\n} from '../../util/misc/matrix';\nimport { radiansToDegrees } from '../../util/misc/radiansDegreesConversion';\nimport type { Canvas } from '../../canvas/Canvas';\nimport type { StaticCanvas } from '../../canvas/StaticCanvas';\nimport type { ObjectEvents } from '../../EventTypeDefs';\nimport type { ControlProps } from './types/ControlProps';\nimport { resolveOrigin } from '../../util/misc/resolveOrigin';\nimport type { Group } from '../Group';\nimport { calcDimensionsMatrix } from '../../util/misc/matrix';\nimport { sizeAfterTransform } from '../../util/misc/objectTransforms';\nimport { degreesToRadians } from '../../util/misc/radiansDegreesConversion';\nimport { CommonMethods } from '../../CommonMethods';\nimport type { BaseProps } from './types/BaseProps';\nimport type { FillStrokeProps } from './types/FillStrokeProps';\nimport { CENTER, LEFT, TOP } from '../../constants';\n\ntype TMatrixCache = {\n key: number[];\n value: TMat2D;\n};\n\ntype TACoords = TCornerPoint;\n\nexport class ObjectGeometry\n extends CommonMethods\n implements\n Pick,\n BaseProps,\n Pick\n{\n // #region Geometry\n\n declare padding: number;\n\n /**\n * Describe object's corner position in scene coordinates.\n * The coordinates are derived from the following:\n * left, top, width, height, scaleX, scaleY, skewX, skewY, angle, strokeWidth.\n * The coordinates do not depend on viewport changes.\n * The coordinates get updated with {@link setCoords}.\n * You can calculate them without updating with {@link calcACoords()}\n */\n declare aCoords: TACoords;\n\n /**\n * storage cache for object transform matrix\n */\n declare ownMatrixCache?: TMatrixCache;\n\n /**\n * storage cache for object full transform matrix\n */\n declare matrixCache?: TMatrixCache;\n\n /**\n * A Reference of the Canvas where the object is actually added\n * @type StaticCanvas | Canvas;\n * @default undefined\n * @private\n */\n declare canvas?: StaticCanvas | Canvas;\n\n /**\n * @returns {number} x position according to object's originX property in canvas coordinate plane\n */\n getX(): number {\n return this.getXY().x;\n }\n\n /**\n * @param {number} value x position according to object's originX property in canvas coordinate plane\n */\n setX(value: number) {\n this.setXY(this.getXY().setX(value));\n }\n\n /**\n * @returns {number} y position according to object's originY property in canvas coordinate plane\n */\n getY(): number {\n return this.getXY().y;\n }\n\n /**\n * @param {number} value y position according to object's originY property in canvas coordinate plane\n */\n setY(value: number) {\n this.setXY(this.getXY().setY(value));\n }\n\n /**\n * @returns {number} x position according to object's originX property in parent's coordinate plane\\\n * if parent is canvas then this property is identical to {@link getX}\n */\n getRelativeX(): number {\n return this.left;\n }\n\n /**\n * @param {number} value x position according to object's originX property in parent's coordinate plane\\\n * if parent is canvas then this method is identical to {@link setX}\n */\n setRelativeX(value: number) {\n this.left = value;\n }\n\n /**\n * @returns {number} y position according to object's originY property in parent's coordinate plane\\\n * if parent is canvas then this property is identical to {@link getY}\n */\n getRelativeY(): number {\n return this.top;\n }\n\n /**\n * @param {number} value y position according to object's originY property in parent's coordinate plane\\\n * if parent is canvas then this property is identical to {@link setY}\n */\n setRelativeY(value: number) {\n this.top = value;\n }\n\n /**\n * @returns {Point} x position according to object's originX originY properties in canvas coordinate plane\n */\n getXY(): Point {\n const relativePosition = this.getRelativeXY();\n return this.group\n ? transformPoint(relativePosition, this.group.calcTransformMatrix())\n : relativePosition;\n }\n\n /**\n * Set an object position to a particular point, the point is intended in absolute ( canvas ) coordinate.\n * You can specify originX and originY values,\n * that otherwise are the object's current values.\n * @example Set object's bottom left corner to point (5,5) on canvas\n * object.setXY(new Point(5, 5), 'left', 'bottom').\n * @param {Point} point position in scene coordinate plane\n * @param {TOriginX} [originX] Horizontal origin: 'left', 'center' or 'right'\n * @param {TOriginY} [originY] Vertical origin: 'top', 'center' or 'bottom'\n */\n setXY(point: Point, originX?: TOriginX, originY?: TOriginY) {\n if (this.group) {\n point = transformPoint(\n point,\n invertTransform(this.group.calcTransformMatrix()),\n );\n }\n this.setRelativeXY(point, originX, originY);\n }\n\n /**\n * @returns {Point} x,y position according to object's originX originY properties in parent's coordinate plane\n */\n getRelativeXY(): Point {\n return new Point(this.left, this.top);\n }\n\n /**\n * As {@link setXY}, but in current parent's coordinate plane (the current group if any or the canvas)\n * @param {Point} point position according to object's originX originY properties in parent's coordinate plane\n * @param {TOriginX} [originX] Horizontal origin: 'left', 'center' or 'right'\n * @param {TOriginY} [originY] Vertical origin: 'top', 'center' or 'bottom'\n */\n setRelativeXY(\n point: Point,\n originX: TOriginX = this.originX,\n originY: TOriginY = this.originY,\n ) {\n this.setPositionByOrigin(point, originX, originY);\n }\n\n /**\n * @deprecated intermidiate method to be removed, do not use\n */\n protected isStrokeAccountedForInDimensions() {\n return false;\n }\n\n /**\n * @return {Point[]} [tl, tr, br, bl] in the scene plane\n */\n getCoords(): Point[] {\n const { tl, tr, br, bl } =\n this.aCoords || (this.aCoords = this.calcACoords());\n const coords = [tl, tr, br, bl];\n if (this.group) {\n const t = this.group.calcTransformMatrix();\n return coords.map((p) => transformPoint(p, t));\n }\n return coords;\n }\n\n /**\n * Checks if object intersects with the scene rect formed by tl and br\n */\n intersectsWithRect(tl: Point, br: Point): boolean {\n const intersection = Intersection.intersectPolygonRectangle(\n this.getCoords(),\n tl,\n br,\n );\n return intersection.status === 'Intersection';\n }\n\n /**\n * Checks if object intersects with another object\n * @param {Object} other Object to test\n * @return {Boolean} true if object intersects with another object\n */\n intersectsWithObject(other: ObjectGeometry): boolean {\n const intersection = Intersection.intersectPolygonPolygon(\n this.getCoords(),\n other.getCoords(),\n );\n\n return (\n intersection.status === 'Intersection' ||\n intersection.status === 'Coincident' ||\n other.isContainedWithinObject(this) ||\n this.isContainedWithinObject(other)\n );\n }\n\n /**\n * Checks if object is fully contained within area of another object\n * @param {Object} other Object to test\n * @return {Boolean} true if object is fully contained within area of another object\n */\n isContainedWithinObject(other: ObjectGeometry): boolean {\n const points = this.getCoords();\n return points.every((point) => other.containsPoint(point));\n }\n\n /**\n * Checks if object is fully contained within the scene rect formed by tl and br\n */\n isContainedWithinRect(tl: Point, br: Point): boolean {\n const { left, top, width, height } = this.getBoundingRect();\n return (\n left >= tl.x &&\n left + width <= br.x &&\n top >= tl.y &&\n top + height <= br.y\n );\n }\n\n isOverlapping(other: T): boolean {\n return (\n this.intersectsWithObject(other) ||\n this.isContainedWithinObject(other) ||\n other.isContainedWithinObject(this)\n );\n }\n\n /**\n * Checks if point is inside the object\n * @param {Point} point Point to check against\n * @return {Boolean} true if point is inside the object\n */\n containsPoint(point: Point): boolean {\n return Intersection.isPointInPolygon(point, this.getCoords());\n }\n\n /**\n * Checks if object is contained within the canvas with current viewportTransform\n * the check is done stopping at first point that appears on screen\n * @return {Boolean} true if object is fully or partially contained within canvas\n */\n isOnScreen(): boolean {\n if (!this.canvas) {\n return false;\n }\n const { tl, br } = this.canvas.vptCoords;\n const points = this.getCoords();\n // if some point is on screen, the object is on screen.\n if (\n points.some(\n (point) =>\n point.x <= br.x &&\n point.x >= tl.x &&\n point.y <= br.y &&\n point.y >= tl.y,\n )\n ) {\n return true;\n }\n // no points on screen, check intersection with absolute coordinates\n if (this.intersectsWithRect(tl, br)) {\n return true;\n }\n // check if the object is so big that it contains the entire viewport\n return this.containsPoint(tl.midPointFrom(br));\n }\n\n /**\n * Checks if object is partially contained within the canvas with current viewportTransform\n * @return {Boolean} true if object is partially contained within canvas\n */\n isPartiallyOnScreen(): boolean {\n if (!this.canvas) {\n return false;\n }\n const { tl, br } = this.canvas.vptCoords;\n if (this.intersectsWithRect(tl, br)) {\n return true;\n }\n const allPointsAreOutside = this.getCoords().every(\n (point) =>\n (point.x >= br.x || point.x <= tl.x) &&\n (point.y >= br.y || point.y <= tl.y),\n );\n // check if the object is so big that it contains the entire viewport\n return allPointsAreOutside && this.containsPoint(tl.midPointFrom(br));\n }\n\n /**\n * Returns coordinates of object's bounding rectangle (left, top, width, height)\n * the box is intended as aligned to axis of canvas.\n * @return {Object} Object with left, top, width, height properties\n */\n getBoundingRect(): TBBox {\n return makeBoundingBoxFromPoints(this.getCoords());\n }\n\n /**\n * Returns width of an object's bounding box counting transformations\n * @todo shouldn't this account for group transform and return the actual size in canvas coordinate plane?\n * @return {Number} width value\n */\n getScaledWidth(): number {\n return this._getTransformedDimensions().x;\n }\n\n /**\n * Returns height of an object bounding box counting transformations\n * @todo shouldn't this account for group transform and return the actual size in canvas coordinate plane?\n * @return {Number} height value\n */\n getScaledHeight(): number {\n return this._getTransformedDimensions().y;\n }\n\n /**\n * Scales an object (equally by x and y)\n * @param {Number} value Scale factor\n * @return {void}\n */\n scale(value: number): void {\n this._set(SCALE_X, value);\n this._set(SCALE_Y, value);\n this.setCoords();\n }\n\n /**\n * Scales an object to a given width, with respect to bounding box (scaling by x/y equally)\n * @param {Number} value New width value\n * @return {void}\n */\n scaleToWidth(value: number) {\n // adjust to bounding rect factor so that rotated shapes would fit as well\n const boundingRectFactor =\n this.getBoundingRect().width / this.getScaledWidth();\n return this.scale(value / this.width / boundingRectFactor);\n }\n\n /**\n * Scales an object to a given height, with respect to bounding box (scaling by x/y equally)\n * @param {Number} value New height value\n * @return {void}\n */\n scaleToHeight(value: number) {\n // adjust to bounding rect factor so that rotated shapes would fit as well\n const boundingRectFactor =\n this.getBoundingRect().height / this.getScaledHeight();\n return this.scale(value / this.height / boundingRectFactor);\n }\n\n getCanvasRetinaScaling() {\n return this.canvas?.getRetinaScaling() || 1;\n }\n\n /**\n * Returns the object angle relative to canvas counting also the group property\n * @returns {TDegree}\n */\n getTotalAngle(): TDegree {\n return this.group\n ? radiansToDegrees(calcPlaneRotation(this.calcTransformMatrix()))\n : this.angle;\n }\n\n /**\n * Retrieves viewportTransform from Object's canvas if available\n * @return {TMat2D}\n */\n getViewportTransform(): TMat2D {\n return this.canvas?.viewportTransform || (iMatrix.concat() as TMat2D);\n }\n\n /**\n * Calculates the coordinates of the 4 corner of the bbox, in absolute coordinates.\n * those never change with zoom or viewport changes.\n * @return {TCornerPoint}\n */\n calcACoords(): TCornerPoint {\n const rotateMatrix = createRotateMatrix({ angle: this.angle }),\n { x, y } = this.getRelativeCenterPoint(),\n tMatrix = createTranslateMatrix(x, y),\n finalMatrix = multiplyTransformMatrices(tMatrix, rotateMatrix),\n dim = this._getTransformedDimensions(),\n w = dim.x / 2,\n h = dim.y / 2;\n return {\n // corners\n tl: transformPoint({ x: -w, y: -h }, finalMatrix),\n tr: transformPoint({ x: w, y: -h }, finalMatrix),\n bl: transformPoint({ x: -w, y: h }, finalMatrix),\n br: transformPoint({ x: w, y: h }, finalMatrix),\n };\n }\n\n /**\n * Sets corner and controls position coordinates based on current angle, width and height, left and top.\n * aCoords are used to quickly find an object on the canvas.\n * See {@link https://github.com/fabricjs/fabric.js/wiki/When-to-call-setCoords} and {@link http://fabric5.fabricjs.com/fabric-gotchas}\n */\n setCoords(): void {\n this.aCoords = this.calcACoords();\n }\n\n transformMatrixKey(skipGroup = false): number[] {\n let prefix: number[] = [];\n if (!skipGroup && this.group) {\n prefix = this.group.transformMatrixKey(skipGroup);\n }\n prefix.push(\n this.top,\n this.left,\n this.width,\n this.height,\n this.scaleX,\n this.scaleY,\n this.angle,\n this.strokeWidth,\n this.skewX,\n this.skewY,\n +this.flipX,\n +this.flipY,\n resolveOrigin(this.originX),\n resolveOrigin(this.originY),\n );\n\n return prefix;\n }\n\n /**\n * calculate transform matrix that represents the current transformations from the\n * object's properties.\n * @param {Boolean} [skipGroup] return transform matrix for object not counting parent transformations\n * There are some situation in which this is useful to avoid the fake rotation.\n * @return {TMat2D} transform matrix for the object\n */\n calcTransformMatrix(skipGroup = false): TMat2D {\n let matrix = this.calcOwnMatrix();\n if (skipGroup || !this.group) {\n return matrix;\n }\n const key = this.transformMatrixKey(skipGroup),\n cache = this.matrixCache;\n if (cache && cache.key.every((x, i) => x === key[i])) {\n return cache.value;\n }\n if (this.group) {\n matrix = multiplyTransformMatrices(\n this.group.calcTransformMatrix(false),\n matrix,\n );\n }\n this.matrixCache = {\n key,\n value: matrix,\n };\n return matrix;\n }\n\n /**\n * calculate transform matrix that represents the current transformations from the\n * object's properties, this matrix does not include the group transformation\n * @return {TMat2D} transform matrix for the object\n */\n calcOwnMatrix(): TMat2D {\n const key = this.transformMatrixKey(true),\n cache = this.ownMatrixCache;\n if (cache && cache.key === key) {\n return cache.value;\n }\n const center = this.getRelativeCenterPoint(),\n options = {\n angle: this.angle,\n translateX: center.x,\n translateY: center.y,\n scaleX: this.scaleX,\n scaleY: this.scaleY,\n skewX: this.skewX,\n skewY: this.skewY,\n flipX: this.flipX,\n flipY: this.flipY,\n },\n value = composeMatrix(options);\n this.ownMatrixCache = {\n key,\n value,\n };\n return value;\n }\n\n /**\n * Calculate object dimensions from its properties\n * @private\n * @returns {Point} dimensions\n */\n _getNonTransformedDimensions(): Point {\n return new Point(this.width, this.height).scalarAdd(this.strokeWidth);\n }\n\n /**\n * Calculate object dimensions for controls box, including padding and canvas zoom.\n * and active selection\n * @private\n * @param {object} [options] transform options\n * @returns {Point} dimensions\n */\n _calculateCurrentDimensions(options?: any): Point {\n return this._getTransformedDimensions(options)\n .transform(this.getViewportTransform(), true)\n .scalarAdd(2 * this.padding);\n }\n\n // #region Origin\n\n declare top: number;\n declare left: number;\n declare width: number;\n declare height: number;\n declare flipX: boolean;\n declare flipY: boolean;\n declare scaleX: number;\n declare scaleY: number;\n declare skewX: number;\n declare skewY: number;\n /**\n * @deprecated please use 'center' as value in new projects\n * */\n declare originX: TOriginX;\n /**\n * @deprecated please use 'center' as value in new projects\n * */\n declare originY: TOriginY;\n declare angle: TDegree;\n declare strokeWidth: number;\n declare strokeUniform: boolean;\n\n /**\n * Object containing this object.\n * can influence its size and position\n */\n declare group?: Group;\n\n /**\n * Calculate object bounding box dimensions from its properties scale, skew.\n * This bounding box is aligned with object angle and not with canvas axis or screen.\n * @param {Object} [options]\n * @param {Number} [options.scaleX]\n * @param {Number} [options.scaleY]\n * @param {Number} [options.skewX]\n * @param {Number} [options.skewY]\n * @private\n * @returns {Point} dimensions\n */\n _getTransformedDimensions(options: any = {}): Point {\n const dimOptions = {\n // if scaleX or scaleY are negative numbers,\n // this will return dimensions that are negative.\n // and this will break assumptions around the codebase\n scaleX: this.scaleX,\n scaleY: this.scaleY,\n skewX: this.skewX,\n skewY: this.skewY,\n width: this.width,\n height: this.height,\n strokeWidth: this.strokeWidth,\n // TODO remove this spread. is visible in the performance inspection\n ...options,\n };\n // stroke is applied before/after transformations are applied according to `strokeUniform`\n const strokeWidth = dimOptions.strokeWidth;\n let preScalingStrokeValue = strokeWidth,\n postScalingStrokeValue = 0;\n\n if (this.strokeUniform) {\n preScalingStrokeValue = 0;\n postScalingStrokeValue = strokeWidth;\n }\n const dimX = dimOptions.width + preScalingStrokeValue,\n dimY = dimOptions.height + preScalingStrokeValue,\n noSkew = dimOptions.skewX === 0 && dimOptions.skewY === 0;\n let finalDimensions;\n if (noSkew) {\n finalDimensions = new Point(\n dimX * dimOptions.scaleX,\n dimY * dimOptions.scaleY,\n );\n } else {\n finalDimensions = sizeAfterTransform(\n dimX,\n dimY,\n calcDimensionsMatrix(dimOptions),\n );\n }\n\n return finalDimensions.scalarAdd(postScalingStrokeValue);\n }\n\n /**\n * Translates the coordinates from a set of origin to another (based on the object's dimensions)\n * @param {Point} point The point which corresponds to the originX and originY params\n * @param {TOriginX} fromOriginX Horizontal origin: 'left', 'center' or 'right'\n * @param {TOriginY} fromOriginY Vertical origin: 'top', 'center' or 'bottom'\n * @param {TOriginX} toOriginX Horizontal origin: 'left', 'center' or 'right'\n * @param {TOriginY} toOriginY Vertical origin: 'top', 'center' or 'bottom'\n * @return {Point}\n */\n translateToGivenOrigin(\n point: Point,\n fromOriginX: TOriginX,\n fromOriginY: TOriginY,\n toOriginX: TOriginX,\n toOriginY: TOriginY,\n ): Point {\n let x = point.x,\n y = point.y;\n const offsetX = resolveOrigin(toOriginX) - resolveOrigin(fromOriginX),\n offsetY = resolveOrigin(toOriginY) - resolveOrigin(fromOriginY);\n\n if (offsetX || offsetY) {\n const dim = this._getTransformedDimensions();\n x += offsetX * dim.x;\n y += offsetY * dim.y;\n }\n\n return new Point(x, y);\n }\n\n /**\n * Translates the coordinates from origin to center coordinates (based on the object's dimensions)\n * @param {Point} point The point which corresponds to the originX and originY params\n * @param {TOriginX} originX Horizontal origin: 'left', 'center' or 'right'\n * @param {TOriginY} originY Vertical origin: 'top', 'center' or 'bottom'\n * @return {Point}\n */\n translateToCenterPoint(\n point: Point,\n originX: TOriginX,\n originY: TOriginY,\n ): Point {\n if (originX === CENTER && originY === CENTER) {\n return point;\n }\n const p = this.translateToGivenOrigin(\n point,\n originX,\n originY,\n CENTER,\n CENTER,\n );\n if (this.angle) {\n return p.rotate(degreesToRadians(this.angle), point);\n }\n return p;\n }\n\n /**\n * Translates the coordinates from center to origin coordinates (based on the object's dimensions)\n * @param {Point} center The point which corresponds to center of the object\n * @param {OriginX} originX Horizontal origin: 'left', 'center' or 'right'\n * @param {OriginY} originY Vertical origin: 'top', 'center' or 'bottom'\n * @return {Point}\n */\n translateToOriginPoint(\n center: Point,\n originX: TOriginX,\n originY: TOriginY,\n ): Point {\n const p = this.translateToGivenOrigin(\n center,\n CENTER,\n CENTER,\n originX,\n originY,\n );\n if (this.angle) {\n return p.rotate(degreesToRadians(this.angle), center);\n }\n return p;\n }\n\n /**\n * Returns the center coordinates of the object relative to canvas\n * @return {Point}\n */\n getCenterPoint(): Point {\n const relCenter = this.getRelativeCenterPoint();\n return this.group\n ? transformPoint(relCenter, this.group.calcTransformMatrix())\n : relCenter;\n }\n\n /**\n * Returns the center coordinates of the object relative to it's parent\n * @return {Point}\n */\n getRelativeCenterPoint(): Point {\n return this.translateToCenterPoint(\n new Point(this.left, this.top),\n this.originX,\n this.originY,\n );\n }\n\n /**\n * Returns the position of the object as if it has a different origin.\n * Take an object that has left, top set to 100, 100 with origin 'left', 'top'.\n * Return the values of left top ( wrapped in a point ) that you would need to keep\n * the same position if origin where different.\n * Alternatively you can use this to also find which point in the parent plane is a specific origin\n * ( where is the bottom right corner of my object? )\n * @param {TOriginX} originX Horizontal origin: 'left', 'center' or 'right'\n * @param {TOriginY} originY Vertical origin: 'top', 'center' or 'bottom'\n * @return {Point}\n */\n getPointByOrigin(originX: TOriginX, originY: TOriginY): Point {\n return this.translateToOriginPoint(\n this.getRelativeCenterPoint(),\n originX,\n originY,\n );\n }\n\n /**\n * Sets the position of the object taking into consideration the object's origin\n * @param {Point} pos The new position of the object\n * @param {TOriginX} originX Horizontal origin: 'left', 'center' or 'right'\n * @param {TOriginY} originY Vertical origin: 'top', 'center' or 'bottom'\n * @return {void}\n */\n setPositionByOrigin(pos: Point, originX: TOriginX, originY: TOriginY) {\n const center = this.translateToCenterPoint(pos, originX, originY),\n position = this.translateToOriginPoint(\n center,\n this.originX,\n this.originY,\n );\n this.set({ left: position.x, top: position.y });\n }\n\n /**\n * @private\n */\n _getLeftTopCoords() {\n return this.translateToOriginPoint(\n this.getRelativeCenterPoint(),\n LEFT,\n TOP,\n );\n }\n}\n","import { cache } from '../../cache';\nimport { config } from '../../config';\nimport {\n ALIASING_LIMIT,\n CENTER,\n iMatrix,\n LEFT,\n SCALE_X,\n SCALE_Y,\n STROKE,\n FILL,\n TOP,\n VERSION,\n} from '../../constants';\nimport type { ObjectEvents } from '../../EventTypeDefs';\nimport { Point } from '../../Point';\nimport { Shadow } from '../../Shadow';\nimport type {\n TDegree,\n TFiller,\n TSize,\n TCacheCanvasDimensions,\n Abortable,\n TOptions,\n ImageFormat,\n} from '../../typedefs';\nimport { classRegistry } from '../../ClassRegistry';\nimport { runningAnimations } from '../../util/animation/AnimationRegistry';\nimport { capValue } from '../../util/misc/capValue';\nimport {\n createCanvasElement,\n createCanvasElementFor,\n toDataURL,\n toBlob,\n} from '../../util/misc/dom';\nimport { invertTransform, qrDecompose } from '../../util/misc/matrix';\nimport { enlivenObjectEnlivables } from '../../util/misc/objectEnlive';\nimport {\n resetObjectTransform,\n saveObjectTransform,\n} from '../../util/misc/objectTransforms';\nimport { sendObjectToPlane } from '../../util/misc/planeChange';\nimport { pick, pickBy } from '../../util/misc/pick';\nimport { toFixed } from '../../util/misc/toFixed';\nimport type { Group } from '../Group';\nimport { StaticCanvas } from '../../canvas/StaticCanvas';\nimport { isFiller, isSerializableFiller } from '../../util/typeAssertions';\nimport type { FabricImage } from '../Image';\nimport {\n cacheProperties,\n fabricObjectDefaultValues,\n stateProperties,\n} from './defaultValues';\nimport type { Gradient } from '../../gradient/Gradient';\nimport type { Pattern } from '../../Pattern';\nimport type { Canvas } from '../../canvas/Canvas';\nimport type { SerializedObjectProps } from './types/SerializedObjectProps';\nimport type { ObjectProps } from './types/ObjectProps';\nimport { getDevicePixelRatio, getEnv } from '../../env';\nimport { log } from '../../util/internals/console';\nimport type { TColorArg } from '../../color/typedefs';\nimport type { TAnimation } from '../../util/animation/animate';\nimport { animate, animateColor } from '../../util/animation/animate';\nimport type {\n AnimationOptions,\n ArrayAnimationOptions,\n ColorAnimationOptions,\n ValueAnimationOptions,\n} from '../../util/animation/types';\nimport { ObjectGeometry } from './ObjectGeometry';\n\ntype TAncestor = FabricObject;\ntype TCollection = Group;\n\nexport type Ancestors =\n | [FabricObject | Group]\n | [FabricObject | Group, ...Group[]]\n | Group[];\n\nexport type AncestryComparison = {\n /**\n * common ancestors of `this` and`other`(may include`this` | `other`)\n */\n common: Ancestors;\n /**\n * ancestors that are of `this` only\n */\n fork: Ancestors;\n /**\n * ancestors that are of `other` only\n */\n otherFork: Ancestors;\n};\n\nexport type TCachedFabricObject = T &\n Required<\n Pick<\n T,\n | 'zoomX'\n | 'zoomY'\n | '_cacheCanvas'\n | '_cacheContext'\n | 'cacheTranslationX'\n | 'cacheTranslationY'\n >\n > & {\n _cacheContext: CanvasRenderingContext2D;\n };\n\nexport type ObjectToCanvasElementOptions = {\n format?: ImageFormat;\n /** Multiplier to scale by */\n multiplier?: number;\n /** Cropping left offset. Introduced in v1.2.14 */\n left?: number;\n /** Cropping top offset. Introduced in v1.2.14 */\n top?: number;\n /** Cropping width. Introduced in v1.2.14 */\n width?: number;\n /** Cropping height. Introduced in v1.2.14 */\n height?: number;\n /** Enable retina scaling for clone image. Introduce in 1.6.4 */\n enableRetinaScaling?: boolean;\n /** Remove current object transform ( no scale , no angle, no flip, no skew ). Introduced in 2.3.4 */\n withoutTransform?: boolean;\n /** Remove current object shadow. Introduced in 2.4.2 */\n withoutShadow?: boolean;\n /** Account for canvas viewport transform */\n viewportTransform?: boolean;\n /** Function to create the output canvas to export onto */\n canvasProvider?: (el?: HTMLCanvasElement) => T;\n};\n\ntype toDataURLOptions = ObjectToCanvasElementOptions & {\n quality?: number;\n};\n\nexport type DrawContext =\n | {\n parentClipPaths: FabricObject[];\n width: number;\n height: number;\n cacheTranslationX: number;\n cacheTranslationY: number;\n zoomX: number;\n zoomY: number;\n }\n | Record;\n\n/**\n * Root object class from which all 2d shape classes inherit from\n * @see {@link http://fabric5.fabricjs.com/fabric-intro-part-1#objects}\n *\n * @fires added\n * @fires removed\n *\n * @fires selected\n * @fires deselected\n *\n * @fires rotating\n * @fires scaling\n * @fires moving\n * @fires skewing\n * @fires modified\n *\n * @fires mousedown\n * @fires mouseup\n * @fires mouseover\n * @fires mouseout\n * @fires mousewheel\n * @fires mousedblclick\n *\n * @fires dragover\n * @fires dragenter\n * @fires dragleave\n * @fires drop\n */\nexport class FabricObject<\n Props extends TOptions = Partial,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n SProps extends SerializedObjectProps = SerializedObjectProps,\n EventSpec extends ObjectEvents = ObjectEvents,\n >\n extends ObjectGeometry\n implements ObjectProps\n{\n declare minScaleLimit: number;\n\n declare opacity: number;\n\n declare paintFirst: 'fill' | 'stroke';\n declare fill: string | TFiller | null;\n declare fillRule: CanvasFillRule;\n declare stroke: string | TFiller | null;\n declare strokeDashArray: number[] | null;\n declare strokeDashOffset: number;\n declare strokeLineCap: CanvasLineCap;\n declare strokeLineJoin: CanvasLineJoin;\n declare strokeMiterLimit: number;\n\n declare globalCompositeOperation: GlobalCompositeOperation;\n declare backgroundColor: string;\n\n declare shadow: Shadow | null;\n\n declare visible: boolean;\n\n declare includeDefaultValues: boolean;\n declare excludeFromExport: boolean;\n\n declare objectCaching: boolean;\n\n declare clipPath?: FabricObject;\n declare inverted: boolean;\n declare absolutePositioned: boolean;\n declare centeredRotation: boolean;\n declare centeredScaling: boolean;\n\n /**\n * This list of properties is used to check if the state of an object is changed.\n * This state change now is only used for children of groups to understand if a group\n * needs its cache regenerated during a .set call\n * @type Array\n */\n static stateProperties: string[] = stateProperties;\n\n /**\n * List of properties to consider when checking if cache needs refresh\n * Those properties are checked by\n * calls to Object.set(key, value). If the key is in this list, the object is marked as dirty\n * and refreshed at the next render\n * @type Array\n */\n static cacheProperties: string[] = cacheProperties;\n\n /**\n * When set to `true`, object's cache will be rerendered next render call.\n * since 1.7.0\n * @type Boolean\n * @default true\n */\n declare dirty: boolean;\n\n /**\n * Quick access for the _cacheCanvas rendering context\n * This is part of the objectCaching feature\n * since 1.7.0\n * @type boolean\n * @default undefined\n * @private\n */\n _cacheContext: CanvasRenderingContext2D | null = null;\n\n /**\n * A reference to the HTMLCanvasElement that is used to contain the cache of the object\n * this canvas element is resized and cleared as needed\n * Is marked private, you can read it, don't use it since it is handled by fabric\n * since 1.7.0\n * @type HTMLCanvasElement\n * @default undefined\n * @private\n */\n declare _cacheCanvas?: HTMLCanvasElement;\n\n /**\n * zoom level used on the cacheCanvas to draw the cache, X axe\n * since 1.7.0\n * @type number\n * @default undefined\n * @private\n */\n declare zoomX?: number;\n\n /**\n * zoom level used on the cacheCanvas to draw the cache, Y axe\n * since 1.7.0\n * @type number\n * @default undefined\n * @private\n */\n declare zoomY?: number;\n\n /**\n * zoom level used on the cacheCanvas to draw the cache, Y axe\n * since 1.7.0\n * @type number\n * @default undefined\n * @private\n */\n declare cacheTranslationX?: number;\n\n /**\n * translation of the cacheCanvas away from the center, for subpixel accuracy and crispness\n * since 1.7.0\n * @type number\n * @default undefined\n * @private\n */\n declare cacheTranslationY?: number;\n\n /**\n * A reference to the parent of the object, usually a Group\n * @type number\n * @default undefined\n * @private\n */\n declare group?: Group;\n\n /**\n * Indicate if the object is sitting on a cache dedicated to it\n * or is part of a larger cache for many object ( a group for example)\n * @type number\n * @default undefined\n * @private\n */\n declare ownCaching?: boolean;\n\n /**\n * Private. indicates if the object inside a group is on a transformed context or not\n * or is part of a larger cache for many object ( a group for example)\n * @type boolean\n * @default undefined\n * @private\n */\n declare _transformDone?: boolean;\n\n static ownDefaults = fabricObjectDefaultValues;\n\n static getDefaults(): Record {\n return FabricObject.ownDefaults;\n }\n\n /**\n * The class type.\n * This is used for serialization and deserialization purposes and internally it can be used\n * to identify classes.\n * When we transform a class in a plain JS object we need a way to recognize which class it was,\n * and the type is the way we do that. It has no other purposes and you should not give one.\n * Hard to reach on instances and please do not use to drive instance's logic (this.constructor.type).\n * To idenfity a class use instanceof class ( instanceof Rect ).\n * We do not do that in fabricJS code because we want to try to have code splitting possible.\n */\n static type = 'FabricObject';\n\n /**\n * Legacy identifier of the class. Prefer using utils like isType or instanceOf\n * Will be removed in fabric 7 or 8.\n * The setter exists to avoid type errors in old code and possibly current deserialization code.\n * DO NOT build new code around this type value\n * @TODO add sustainable warning message\n * @type string\n * @deprecated\n */\n get type() {\n const name = (this.constructor as typeof FabricObject).type;\n if (name === 'FabricObject') {\n return 'object';\n }\n return name.toLowerCase();\n }\n\n set type(value) {\n log('warn', 'Setting type has no effect', value);\n }\n\n /**\n * Constructor\n * @param {Object} [options] Options object\n */\n constructor(options?: Props) {\n super();\n Object.assign(this, FabricObject.ownDefaults);\n this.setOptions(options);\n }\n\n /**\n * Create a the canvas used to keep the cached copy of the object\n * @private\n */\n _createCacheCanvas() {\n this._cacheCanvas = createCanvasElement();\n this._cacheContext = this._cacheCanvas.getContext('2d');\n this._updateCacheCanvas();\n // if canvas gets created, is empty, so dirty.\n this.dirty = true;\n }\n\n /**\n * Limit the cache dimensions so that X * Y do not cross config.perfLimitSizeTotal\n * and each side do not cross fabric.cacheSideLimit\n * those numbers are configurable so that you can get as much detail as you want\n * making bargain with performances.\n * It mutates the input object dims.\n * @param {TCacheCanvasDimensions} dims\n * @return {TCacheCanvasDimensions} dims\n */\n _limitCacheSize(\n dims: TCacheCanvasDimensions & { capped?: boolean },\n ): TCacheCanvasDimensions & { capped?: boolean } {\n const width = dims.width,\n height = dims.height,\n max = config.maxCacheSideLimit,\n min = config.minCacheSideLimit;\n if (\n width <= max &&\n height <= max &&\n width * height <= config.perfLimitSizeTotal\n ) {\n if (width < min) {\n dims.width = min;\n }\n if (height < min) {\n dims.height = min;\n }\n return dims;\n }\n const ar = width / height,\n [limX, limY] = cache.limitDimsByArea(ar),\n x = capValue(min, limX, max),\n y = capValue(min, limY, max);\n if (width > x) {\n dims.zoomX /= width / x;\n dims.width = x;\n dims.capped = true;\n }\n if (height > y) {\n dims.zoomY /= height / y;\n dims.height = y;\n dims.capped = true;\n }\n return dims;\n }\n\n /**\n * Return the dimension and the zoom level needed to create a cache canvas\n * big enough to host the object to be cached.\n * @private\n * @return {TCacheCanvasDimensions} Informations about the object to be cached\n */\n _getCacheCanvasDimensions(): TCacheCanvasDimensions {\n const objectScale = this.getTotalObjectScaling(),\n // calculate dimensions without skewing\n dim = this._getTransformedDimensions({ skewX: 0, skewY: 0 }),\n neededX = (dim.x * objectScale.x) / this.scaleX,\n neededY = (dim.y * objectScale.y) / this.scaleY;\n return {\n // for sure this ALIASING_LIMIT is slightly creating problem\n // in situation in which the cache canvas gets an upper limit\n // also objectScale contains already scaleX and scaleY\n width: Math.ceil(neededX + ALIASING_LIMIT),\n height: Math.ceil(neededY + ALIASING_LIMIT),\n zoomX: objectScale.x,\n zoomY: objectScale.y,\n x: neededX,\n y: neededY,\n };\n }\n\n /**\n * Update width and height of the canvas for cache\n * returns true or false if canvas needed resize.\n * @private\n * @return {Boolean} true if the canvas has been resized\n */\n _updateCacheCanvas() {\n const canvas = this._cacheCanvas!,\n context = this._cacheContext,\n { width, height, zoomX, zoomY, x, y } = this._limitCacheSize(\n this._getCacheCanvasDimensions(),\n ),\n dimensionsChanged = width !== canvas.width || height !== canvas.height,\n zoomChanged = this.zoomX !== zoomX || this.zoomY !== zoomY;\n\n if (!canvas || !context) {\n return false;\n }\n\n const shouldRedraw = dimensionsChanged || zoomChanged;\n\n if (shouldRedraw) {\n if (width !== canvas.width || height !== canvas.height) {\n canvas.width = width;\n canvas.height = height;\n } else {\n context.setTransform(1, 0, 0, 1, 0, 0);\n context.clearRect(0, 0, canvas.width, canvas.height);\n }\n const drawingWidth = x / 2;\n const drawingHeight = y / 2;\n this.cacheTranslationX =\n Math.round(canvas.width / 2 - drawingWidth) + drawingWidth;\n this.cacheTranslationY =\n Math.round(canvas.height / 2 - drawingHeight) + drawingHeight;\n context.translate(this.cacheTranslationX, this.cacheTranslationY);\n context.scale(zoomX, zoomY);\n this.zoomX = zoomX;\n this.zoomY = zoomY;\n return true;\n }\n return false;\n }\n\n /**\n * Sets object's properties from options, for class constructor only.\n * Needs to be overridden for different defaults.\n * @protected\n * @param {Object} [options] Options object\n */\n protected setOptions(options: Record = {}) {\n this._setOptions(options);\n }\n\n /**\n * Transforms context when rendering an object\n * @param {CanvasRenderingContext2D} ctx Context\n */\n transform(ctx: CanvasRenderingContext2D) {\n const needFullTransform =\n (this.group && !this.group._transformDone) ||\n (this.group && this.canvas && ctx === (this.canvas as Canvas).contextTop);\n const m = this.calcTransformMatrix(!needFullTransform);\n ctx.transform(m[0], m[1], m[2], m[3], m[4], m[5]);\n }\n\n /**\n * Return the object scale factor counting also the group scaling\n * @return {Point}\n */\n getObjectScaling() {\n // if the object is a top level one, on the canvas, we go for simple aritmetic\n // otherwise the complex method with angles will return approximations and decimals\n // and will likely kill the cache when not needed\n // https://github.com/fabricjs/fabric.js/issues/7157\n if (!this.group) {\n return new Point(Math.abs(this.scaleX), Math.abs(this.scaleY));\n }\n // if we are inside a group total zoom calculation is complex, we defer to generic matrices\n const options = qrDecompose(this.calcTransformMatrix());\n return new Point(Math.abs(options.scaleX), Math.abs(options.scaleY));\n }\n\n /**\n * Return the object scale factor counting also the group scaling, zoom and retina\n * @return {Object} object with scaleX and scaleY properties\n */\n getTotalObjectScaling() {\n const scale = this.getObjectScaling();\n if (this.canvas) {\n const zoom = this.canvas.getZoom();\n const retina = this.getCanvasRetinaScaling();\n return scale.scalarMultiply(zoom * retina);\n }\n return scale;\n }\n\n /**\n * Return the object opacity counting also the group property\n * @return {Number}\n */\n getObjectOpacity() {\n let opacity = this.opacity;\n if (this.group) {\n opacity *= this.group.getObjectOpacity();\n }\n return opacity;\n }\n\n /**\n * Makes sure the scale is valid and modifies it if necessary\n * @todo: this is a control action issue, not a geometry one\n * @private\n * @param {Number} value, unconstrained\n * @return {Number} constrained value;\n */\n _constrainScale(value: number): number {\n if (Math.abs(value) < this.minScaleLimit) {\n if (value < 0) {\n return -this.minScaleLimit;\n } else {\n return this.minScaleLimit;\n }\n } else if (value === 0) {\n return 0.0001;\n }\n return value;\n }\n\n /**\n * Handles setting values on the instance and handling internal side effects\n * @protected\n * @param {String} key\n * @param {*} value\n */\n _set(key: string, value: any) {\n if (key === SCALE_X || key === SCALE_Y) {\n value = this._constrainScale(value);\n }\n if (key === SCALE_X && value < 0) {\n this.flipX = !this.flipX;\n value *= -1;\n } else if (key === 'scaleY' && value < 0) {\n this.flipY = !this.flipY;\n value *= -1;\n // i don't like this automatic initialization here\n } else if (key === 'shadow' && value && !(value instanceof Shadow)) {\n value = new Shadow(value);\n }\n\n const isChanged = this[key as keyof this] !== value;\n this[key as keyof this] = value;\n\n // invalidate caches\n if (\n isChanged &&\n (this.constructor as typeof FabricObject).cacheProperties.includes(key)\n ) {\n this.dirty = true;\n }\n // a dirty child makes the parent dirty.\n // but a non dirty child does not make the parent not dirty.\n // the parent could be dirty for some other reason.\n this.parent &&\n (this.dirty ||\n (isChanged &&\n (this.constructor as typeof FabricObject).stateProperties.includes(\n key,\n ))) &&\n this.parent._set('dirty', true);\n\n return this;\n }\n\n /**\n * return if the object would be visible in rendering\n * @return {Boolean}\n */\n isNotVisible() {\n return (\n this.opacity === 0 ||\n (!this.width && !this.height && this.strokeWidth === 0) ||\n !this.visible\n );\n }\n\n /**\n * Renders an object on a specified context\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n render(ctx: CanvasRenderingContext2D) {\n // do not render if width/height are zeros or object is not visible\n if (this.isNotVisible()) {\n return;\n }\n if (\n this.canvas &&\n this.canvas.skipOffscreen &&\n !this.group &&\n !this.isOnScreen()\n ) {\n return;\n }\n ctx.save();\n this._setupCompositeOperation(ctx);\n this.drawSelectionBackground(ctx);\n this.transform(ctx);\n this._setOpacity(ctx);\n this._setShadow(ctx);\n if (this.shouldCache()) {\n (this as TCachedFabricObject).renderCache();\n (this as TCachedFabricObject).drawCacheOnCanvas(ctx);\n } else {\n this._removeCacheCanvas();\n this.drawObject(ctx, false, {});\n this.dirty = false;\n }\n ctx.restore();\n }\n\n drawSelectionBackground(_ctx: CanvasRenderingContext2D) {\n /* no op */\n }\n\n renderCache(this: TCachedFabricObject, options?: any) {\n options = options || {};\n if (!this._cacheCanvas || !this._cacheContext) {\n this._createCacheCanvas();\n }\n if (this.isCacheDirty() && this._cacheContext) {\n const { zoomX, zoomY, cacheTranslationX, cacheTranslationY } = this;\n const { width, height } = this._cacheCanvas;\n this.drawObject(this._cacheContext, options.forClipping, {\n zoomX,\n zoomY,\n cacheTranslationX,\n cacheTranslationY,\n width,\n height,\n parentClipPaths: [],\n });\n this.dirty = false;\n }\n }\n\n /**\n * Remove cacheCanvas and its dimensions from the objects\n */\n _removeCacheCanvas() {\n this._cacheCanvas = undefined;\n this._cacheContext = null;\n }\n\n /**\n * return true if the object will draw a stroke\n * Does not consider text styles. This is just a shortcut used at rendering time\n * We want it to be an approximation and be fast.\n * wrote to avoid extra caching, it has to return true when stroke happens,\n * can guess when it will not happen at 100% chance, does not matter if it misses\n * some use case where the stroke is invisible.\n * @since 3.0.0\n * @returns Boolean\n */\n hasStroke(): boolean {\n return (\n !!this.stroke && this.stroke !== 'transparent' && this.strokeWidth !== 0\n );\n }\n\n /**\n * return true if the object will draw a fill\n * Does not consider text styles. This is just a shortcut used at rendering time\n * We want it to be an approximation and be fast.\n * wrote to avoid extra caching, it has to return true when fill happens,\n * can guess when it will not happen at 100% chance, does not matter if it misses\n * some use case where the fill is invisible.\n * @since 3.0.0\n * @returns Boolean\n */\n hasFill(): boolean {\n return !!this.fill && this.fill !== 'transparent';\n }\n\n /**\n * When returns `true`, force the object to have its own cache, even if it is inside a group\n * it may be needed when your object behave in a particular way on the cache and always needs\n * its own isolated canvas to render correctly.\n * Created to be overridden\n * since 1.7.12\n * @returns Boolean\n */\n needsItsOwnCache() {\n // TODO re-evaluate this shadow condition\n if (\n this.paintFirst === STROKE &&\n this.hasFill() &&\n this.hasStroke() &&\n !!this.shadow\n ) {\n return true;\n }\n if (this.clipPath) {\n return true;\n }\n return false;\n }\n\n /**\n * Decide if the object should cache or not. Create its own cache level\n * objectCaching is a global flag, wins over everything\n * needsItsOwnCache should be used when the object drawing method requires\n * a cache step.\n * Generally you do not cache objects in groups because the group outside is cached.\n * Read as: cache if is needed, or if the feature is enabled but we are not already caching.\n * @return {Boolean}\n */\n shouldCache() {\n this.ownCaching =\n (this.objectCaching && (!this.parent || !this.parent.isOnACache())) ||\n this.needsItsOwnCache();\n return this.ownCaching;\n }\n\n /**\n * Check if this object will cast a shadow with an offset.\n * used by Group.shouldCache to know if child has a shadow recursively\n * @return {Boolean}\n * @deprecated\n */\n willDrawShadow() {\n return (\n !!this.shadow && (this.shadow.offsetX !== 0 || this.shadow.offsetY !== 0)\n );\n }\n\n /**\n * Execute the drawing operation for an object clipPath\n * @param {CanvasRenderingContext2D} ctx Context to render on\n * @param {FabricObject} clipPath\n */\n drawClipPathOnCache(\n ctx: CanvasRenderingContext2D,\n clipPath: FabricObject,\n canvasWithClipPath: HTMLCanvasElement,\n ) {\n ctx.save();\n // DEBUG: uncomment this line, comment the following\n // ctx.globalAlpha = 0.4\n if (clipPath.inverted) {\n ctx.globalCompositeOperation = 'destination-out';\n } else {\n ctx.globalCompositeOperation = 'destination-in';\n }\n ctx.setTransform(1, 0, 0, 1, 0, 0);\n ctx.drawImage(canvasWithClipPath, 0, 0);\n ctx.restore();\n }\n\n /**\n * Execute the drawing operation for an object on a specified context\n * @param {CanvasRenderingContext2D} ctx Context to render on\n * @param {boolean} forClipping apply clipping styles\n * @param {DrawContext} context additional context for rendering\n */\n drawObject(\n ctx: CanvasRenderingContext2D,\n forClipping: boolean | undefined,\n context: DrawContext,\n ) {\n const originalFill = this.fill,\n originalStroke = this.stroke;\n if (forClipping) {\n this.fill = 'black';\n this.stroke = '';\n this._setClippingProperties(ctx);\n } else {\n this._renderBackground(ctx);\n }\n this._render(ctx);\n this._drawClipPath(ctx, this.clipPath, context);\n this.fill = originalFill;\n this.stroke = originalStroke;\n }\n\n private createClipPathLayer(\n this: TCachedFabricObject,\n clipPath: FabricObject,\n context: DrawContext,\n ) {\n const canvas = createCanvasElementFor(context as TSize);\n const ctx = canvas.getContext('2d')!;\n ctx.translate(context.cacheTranslationX, context.cacheTranslationY);\n ctx.scale(context.zoomX, context.zoomY);\n clipPath._cacheCanvas = canvas;\n context.parentClipPaths.forEach((prevClipPath) => {\n prevClipPath.transform(ctx);\n });\n context.parentClipPaths.push(clipPath);\n if (clipPath.absolutePositioned) {\n const m = invertTransform(this.calcTransformMatrix());\n ctx.transform(m[0], m[1], m[2], m[3], m[4], m[5]);\n }\n clipPath.transform(ctx);\n clipPath.drawObject(ctx, true, context);\n return canvas;\n }\n\n /**\n * Prepare clipPath state and cache and draw it on instance's cache\n * @param {CanvasRenderingContext2D} ctx\n * @param {FabricObject} clipPath\n */\n _drawClipPath(\n ctx: CanvasRenderingContext2D,\n clipPath: FabricObject | undefined,\n context: DrawContext,\n ) {\n if (!clipPath) {\n return;\n }\n // needed to setup _transformDone\n // TODO find a better solution?\n clipPath._transformDone = true;\n const canvas = (this as TCachedFabricObject).createClipPathLayer(\n clipPath,\n context,\n );\n this.drawClipPathOnCache(ctx, clipPath, canvas);\n }\n\n /**\n * Paint the cached copy of the object on the target context.\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n drawCacheOnCanvas(this: TCachedFabricObject, ctx: CanvasRenderingContext2D) {\n ctx.scale(1 / this.zoomX, 1 / this.zoomY);\n ctx.drawImage(\n this._cacheCanvas,\n -this.cacheTranslationX,\n -this.cacheTranslationY,\n );\n }\n\n /**\n * Check if cache is dirty and if is dirty clear the context.\n * This check has a big side effect, it changes the underlying cache canvas if necessary.\n * Do not call this method on your own to check if the cache is dirty, because if it is,\n * it is also going to wipe the cache. This is badly designed and needs to be fixed.\n * @param {Boolean} skipCanvas skip canvas checks because this object is painted\n * on parent canvas.\n */\n isCacheDirty(skipCanvas = false) {\n if (this.isNotVisible()) {\n return false;\n }\n const canvas = this._cacheCanvas;\n const ctx = this._cacheContext;\n if (canvas && ctx && !skipCanvas && this._updateCacheCanvas()) {\n // in this case the context is already cleared.\n return true;\n } else {\n if (this.dirty || (this.clipPath && this.clipPath.absolutePositioned)) {\n if (canvas && ctx && !skipCanvas) {\n ctx.save();\n ctx.setTransform(1, 0, 0, 1, 0, 0);\n ctx.clearRect(0, 0, canvas.width, canvas.height);\n ctx.restore();\n }\n return true;\n }\n }\n return false;\n }\n\n /**\n * Draws a background for the object big as its untransformed dimensions\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _renderBackground(ctx: CanvasRenderingContext2D) {\n if (!this.backgroundColor) {\n return;\n }\n const dim = this._getNonTransformedDimensions();\n ctx.fillStyle = this.backgroundColor;\n\n ctx.fillRect(-dim.x / 2, -dim.y / 2, dim.x, dim.y);\n // if there is background color no other shadows\n // should be casted\n this._removeShadow(ctx);\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _setOpacity(ctx: CanvasRenderingContext2D) {\n if (this.group && !this.group._transformDone) {\n ctx.globalAlpha = this.getObjectOpacity();\n } else {\n ctx.globalAlpha *= this.opacity;\n }\n }\n\n _setStrokeStyles(\n ctx: CanvasRenderingContext2D,\n decl: Pick<\n this,\n | 'stroke'\n | 'strokeWidth'\n | 'strokeLineCap'\n | 'strokeDashOffset'\n | 'strokeLineJoin'\n | 'strokeMiterLimit'\n >,\n ) {\n const stroke = decl.stroke;\n if (stroke) {\n ctx.lineWidth = decl.strokeWidth;\n ctx.lineCap = decl.strokeLineCap;\n ctx.lineDashOffset = decl.strokeDashOffset;\n ctx.lineJoin = decl.strokeLineJoin;\n ctx.miterLimit = decl.strokeMiterLimit;\n if (isFiller(stroke)) {\n if (\n (stroke as Gradient<'linear'>).gradientUnits === 'percentage' ||\n (stroke as Gradient<'linear'>).gradientTransform ||\n (stroke as Pattern).patternTransform\n ) {\n // need to transform gradient in a pattern.\n // this is a slow process. If you are hitting this codepath, and the object\n // is not using caching, you should consider switching it on.\n // we need a canvas as big as the current object caching canvas.\n this._applyPatternForTransformedGradient(ctx, stroke);\n } else {\n // is a simple gradient or pattern\n ctx.strokeStyle = stroke.toLive(ctx)!;\n this._applyPatternGradientTransform(ctx, stroke);\n }\n } else {\n // is a color\n ctx.strokeStyle = decl.stroke as string;\n }\n }\n }\n\n _setFillStyles(ctx: CanvasRenderingContext2D, { fill }: Pick) {\n if (fill) {\n if (isFiller(fill)) {\n ctx.fillStyle = fill.toLive(ctx)!;\n this._applyPatternGradientTransform(ctx, fill);\n } else {\n ctx.fillStyle = fill;\n }\n }\n }\n\n _setClippingProperties(ctx: CanvasRenderingContext2D) {\n ctx.globalAlpha = 1;\n ctx.strokeStyle = 'transparent';\n ctx.fillStyle = '#000000';\n }\n\n /**\n * @private\n * Sets line dash\n * @param {CanvasRenderingContext2D} ctx Context to set the dash line on\n * @param {Array} dashArray array representing dashes\n */\n _setLineDash(ctx: CanvasRenderingContext2D, dashArray?: number[] | null) {\n if (!dashArray || dashArray.length === 0) {\n return;\n }\n ctx.setLineDash(dashArray);\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _setShadow(ctx: CanvasRenderingContext2D) {\n if (!this.shadow) {\n return;\n }\n\n const shadow = this.shadow,\n canvas = this.canvas,\n retinaScaling = this.getCanvasRetinaScaling(),\n [sx, , , sy] = canvas?.viewportTransform || iMatrix,\n multX = sx * retinaScaling,\n multY = sy * retinaScaling,\n scaling = shadow.nonScaling ? new Point(1, 1) : this.getObjectScaling();\n ctx.shadowColor = shadow.color;\n ctx.shadowBlur =\n (shadow.blur *\n config.browserShadowBlurConstant *\n (multX + multY) *\n (scaling.x + scaling.y)) /\n 4;\n ctx.shadowOffsetX = shadow.offsetX * multX * scaling.x;\n ctx.shadowOffsetY = shadow.offsetY * multY * scaling.y;\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _removeShadow(ctx: CanvasRenderingContext2D) {\n if (!this.shadow) {\n return;\n }\n\n ctx.shadowColor = '';\n ctx.shadowBlur = ctx.shadowOffsetX = ctx.shadowOffsetY = 0;\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n * @param {TFiller} filler {@link Pattern} or {@link Gradient}\n */\n _applyPatternGradientTransform(\n ctx: CanvasRenderingContext2D,\n filler: TFiller,\n ) {\n if (!isFiller(filler)) {\n return { offsetX: 0, offsetY: 0 };\n }\n const t =\n (filler as Gradient<'linear'>).gradientTransform ||\n (filler as Pattern).patternTransform;\n const offsetX = -this.width / 2 + filler.offsetX || 0,\n offsetY = -this.height / 2 + filler.offsetY || 0;\n\n if ((filler as Gradient<'linear'>).gradientUnits === 'percentage') {\n ctx.transform(this.width, 0, 0, this.height, offsetX, offsetY);\n } else {\n ctx.transform(1, 0, 0, 1, offsetX, offsetY);\n }\n if (t) {\n ctx.transform(t[0], t[1], t[2], t[3], t[4], t[5]);\n }\n return { offsetX: offsetX, offsetY: offsetY };\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _renderPaintInOrder(ctx: CanvasRenderingContext2D) {\n if (this.paintFirst === STROKE) {\n this._renderStroke(ctx);\n this._renderFill(ctx);\n } else {\n this._renderFill(ctx);\n this._renderStroke(ctx);\n }\n }\n\n /**\n * @private\n * function that actually render something on the context.\n * empty here to allow Obects to work on tests to benchmark fabric functionalites\n * not related to rendering\n * @param {CanvasRenderingContext2D} _ctx Context to render on\n */\n _render(_ctx: CanvasRenderingContext2D) {\n // placeholder to be overridden\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _renderFill(ctx: CanvasRenderingContext2D) {\n if (!this.fill) {\n return;\n }\n\n ctx.save();\n this._setFillStyles(ctx, this);\n if (this.fillRule === 'evenodd') {\n ctx.fill('evenodd');\n } else {\n ctx.fill();\n }\n ctx.restore();\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _renderStroke(ctx: CanvasRenderingContext2D) {\n if (!this.stroke || this.strokeWidth === 0) {\n return;\n }\n\n if (this.shadow && !this.shadow.affectStroke) {\n this._removeShadow(ctx);\n }\n\n ctx.save();\n if (this.strokeUniform) {\n const scaling = this.getObjectScaling();\n ctx.scale(1 / scaling.x, 1 / scaling.y);\n }\n this._setLineDash(ctx, this.strokeDashArray);\n this._setStrokeStyles(ctx, this);\n ctx.stroke();\n ctx.restore();\n }\n\n /**\n * This function try to patch the missing gradientTransform on canvas gradients.\n * transforming a context to transform the gradient, is going to transform the stroke too.\n * we want to transform the gradient but not the stroke operation, so we create\n * a transformed gradient on a pattern and then we use the pattern instead of the gradient.\n * this method has drawbacks: is slow, is in low resolution, needs a patch for when the size\n * is limited.\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n * @param {Gradient} filler\n */\n _applyPatternForTransformedGradient(\n ctx: CanvasRenderingContext2D,\n filler: TFiller,\n ) {\n const dims = this._limitCacheSize(this._getCacheCanvasDimensions()),\n retinaScaling = this.getCanvasRetinaScaling(),\n width = dims.x / this.scaleX / retinaScaling,\n height = dims.y / this.scaleY / retinaScaling,\n pCanvas = createCanvasElementFor({\n // in case width and height are less than 1px, we have to round up.\n // since the pattern is no-repeat, this is fine\n width: Math.ceil(width),\n height: Math.ceil(height),\n });\n\n const pCtx = pCanvas.getContext('2d');\n if (!pCtx) {\n return;\n }\n pCtx.beginPath();\n pCtx.moveTo(0, 0);\n pCtx.lineTo(width, 0);\n pCtx.lineTo(width, height);\n pCtx.lineTo(0, height);\n pCtx.closePath();\n pCtx.translate(width / 2, height / 2);\n pCtx.scale(\n dims.zoomX / this.scaleX / retinaScaling,\n dims.zoomY / this.scaleY / retinaScaling,\n );\n this._applyPatternGradientTransform(pCtx, filler);\n pCtx.fillStyle = filler.toLive(ctx)!;\n pCtx.fill();\n ctx.translate(\n -this.width / 2 - this.strokeWidth / 2,\n -this.height / 2 - this.strokeWidth / 2,\n );\n ctx.scale(\n (retinaScaling * this.scaleX) / dims.zoomX,\n (retinaScaling * this.scaleY) / dims.zoomY,\n );\n ctx.strokeStyle = pCtx.createPattern(pCanvas, 'no-repeat') ?? '';\n }\n\n /**\n * This function is an helper for svg import. it returns the center of the object in the svg\n * untransformed coordinates\n * @private\n * @return {Point} center point from element coordinates\n */\n _findCenterFromElement() {\n return new Point(this.left + this.width / 2, this.top + this.height / 2);\n }\n\n /**\n * Clones an instance.\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @returns {Promise}\n */\n clone(propertiesToInclude?: string[]): Promise {\n const objectForm = this.toObject(propertiesToInclude);\n return (this.constructor as typeof FabricObject).fromObject(\n objectForm,\n ) as unknown as Promise;\n }\n\n /**\n * Creates an instance of Image out of an object\n * makes use of toCanvasElement.\n * Once this method was based on toDataUrl and loadImage, so it also had a quality\n * and format option. toCanvasElement is faster and produce no loss of quality.\n * If you need to get a real Jpeg or Png from an object, using toDataURL is the right way to do it.\n * toCanvasElement and then toBlob from the obtained canvas is also a good option.\n * @todo fix the export type, it could not be Image but the type that getClass return for 'image'.\n * @param {ObjectToCanvasElementOptions} [options] for clone as image, passed to toDataURL\n * @param {Number} [options.multiplier=1] Multiplier to scale by\n * @param {Number} [options.left] Cropping left offset. Introduced in v1.2.14\n * @param {Number} [options.top] Cropping top offset. Introduced in v1.2.14\n * @param {Number} [options.width] Cropping width. Introduced in v1.2.14\n * @param {Number} [options.height] Cropping height. Introduced in v1.2.14\n * @param {Boolean} [options.enableRetinaScaling] Enable retina scaling for clone image. Introduce in 1.6.4\n * @param {Boolean} [options.withoutTransform] Remove current object transform ( no scale , no angle, no flip, no skew ). Introduced in 2.3.4\n * @param {Boolean} [options.withoutShadow] Remove current object shadow. Introduced in 2.4.2\n * @return {FabricImage} Object cloned as image.\n */\n cloneAsImage(options: ObjectToCanvasElementOptions): FabricImage {\n const canvasEl = this.toCanvasElement(options);\n // TODO: how to import Image w/o an import cycle?\n const ImageClass = classRegistry.getClass('image');\n return new ImageClass(canvasEl);\n }\n\n /**\n * Converts an object into a HTMLCanvas element\n * @param {ObjectToCanvasElementOptions} options Options object\n * @param {Number} [options.multiplier=1] Multiplier to scale by\n * @param {Number} [options.left] Cropping left offset. Introduced in v1.2.14\n * @param {Number} [options.top] Cropping top offset. Introduced in v1.2.14\n * @param {Number} [options.width] Cropping width. Introduced in v1.2.14\n * @param {Number} [options.height] Cropping height. Introduced in v1.2.14\n * @param {Boolean} [options.enableRetinaScaling] Enable retina scaling for clone image. Introduce in 1.6.4\n * @param {Boolean} [options.withoutTransform] Remove current object transform ( no scale , no angle, no flip, no skew ). Introduced in 2.3.4\n * @param {Boolean} [options.withoutShadow] Remove current object shadow. Introduced in 2.4.2\n * @param {Boolean} [options.viewportTransform] Account for canvas viewport transform\n * @param {(el?: HTMLCanvasElement) => StaticCanvas} [options.canvasProvider] Create the output canvas\n * @return {HTMLCanvasElement} Returns DOM element with the FabricObject\n */\n toCanvasElement(options: ObjectToCanvasElementOptions = {}) {\n const origParams = saveObjectTransform(this),\n originalGroup = this.group,\n originalShadow = this.shadow,\n abs = Math.abs,\n retinaScaling = options.enableRetinaScaling ? getDevicePixelRatio() : 1,\n multiplier = (options.multiplier || 1) * retinaScaling,\n canvasProvider: (el: HTMLCanvasElement) => StaticCanvas =\n options.canvasProvider ||\n ((el: HTMLCanvasElement) =>\n new StaticCanvas(el, {\n enableRetinaScaling: false,\n renderOnAddRemove: false,\n skipOffscreen: false,\n }));\n delete this.group;\n if (options.withoutTransform) {\n resetObjectTransform(this);\n }\n if (options.withoutShadow) {\n this.shadow = null;\n }\n if (options.viewportTransform) {\n sendObjectToPlane(this, this.getViewportTransform());\n }\n\n this.setCoords();\n const el = createCanvasElement(),\n boundingRect = this.getBoundingRect(),\n shadow = this.shadow,\n shadowOffset = new Point();\n\n if (shadow) {\n const shadowBlur = shadow.blur;\n const scaling = shadow.nonScaling\n ? new Point(1, 1)\n : this.getObjectScaling();\n // consider non scaling shadow.\n shadowOffset.x =\n 2 * Math.round(abs(shadow.offsetX) + shadowBlur) * abs(scaling.x);\n shadowOffset.y =\n 2 * Math.round(abs(shadow.offsetY) + shadowBlur) * abs(scaling.y);\n }\n const width = boundingRect.width + shadowOffset.x,\n height = boundingRect.height + shadowOffset.y;\n // if the current width/height is not an integer\n // we need to make it so.\n el.width = Math.ceil(width);\n el.height = Math.ceil(height);\n const canvas = canvasProvider(el);\n if (options.format === 'jpeg') {\n canvas.backgroundColor = '#fff';\n }\n this.setPositionByOrigin(\n new Point(canvas.width / 2, canvas.height / 2),\n CENTER,\n CENTER,\n );\n const originalCanvas = this.canvas;\n // static canvas and canvas have both an array of InteractiveObjects\n // @ts-expect-error this needs to be fixed somehow, or ignored globally\n canvas._objects = [this];\n this.set('canvas', canvas);\n this.setCoords();\n const canvasEl = canvas.toCanvasElement(multiplier || 1, options);\n this.set('canvas', originalCanvas);\n this.shadow = originalShadow;\n if (originalGroup) {\n this.group = originalGroup;\n }\n this.set(origParams);\n this.setCoords();\n // canvas.dispose will call image.dispose that will nullify the elements\n // since this canvas is a simple element for the process, we remove references\n // to objects in this way in order to avoid object trashing.\n canvas._objects = [];\n // since render has settled it is safe to destroy canvas\n canvas.destroy();\n return canvasEl;\n }\n\n /**\n * Converts an object into a data-url-like string\n * @param {Object} options Options object\n * @param {String} [options.format=png] The format of the output image. Either \"jpeg\" or \"png\"\n * @param {Number} [options.quality=1] Quality level (0..1). Only used for jpeg.\n * @param {Number} [options.multiplier=1] Multiplier to scale by\n * @param {Number} [options.left] Cropping left offset. Introduced in v1.2.14\n * @param {Number} [options.top] Cropping top offset. Introduced in v1.2.14\n * @param {Number} [options.width] Cropping width. Introduced in v1.2.14\n * @param {Number} [options.height] Cropping height. Introduced in v1.2.14\n * @param {Boolean} [options.enableRetinaScaling] Enable retina scaling for clone image. Introduce in 1.6.4\n * @param {Boolean} [options.withoutTransform] Remove current object transform ( no scale , no angle, no flip, no skew ). Introduced in 2.3.4\n * @param {Boolean} [options.withoutShadow] Remove current object shadow. Introduced in 2.4.2\n * @return {String} Returns a data: URL containing a representation of the object in the format specified by options.format\n */\n toDataURL(options: toDataURLOptions = {}) {\n return toDataURL(\n this.toCanvasElement(options),\n options.format || 'png',\n options.quality || 1,\n );\n }\n toBlob(options: toDataURLOptions = {}) {\n return toBlob(\n this.toCanvasElement(options),\n options.format || 'png',\n options.quality || 1,\n );\n }\n\n /**\n * Checks if the instance is of any of the specified types.\n * We use this to filter a list of objects for the `getObjects` function.\n *\n * For detecting an instance type `instanceOf` is a better check,\n * but to avoid to make specific classes a dependency of generic code\n * internally we use this.\n *\n * This compares both the static class `type` and the instance's own `type` property\n * against the provided list of types.\n *\n * @param types - A list of type strings to check against.\n * @returns `true` if the object's type or class type matches any in the list, otherwise `false`.\n */\n isType(...types: string[]) {\n return (\n types.includes((this.constructor as typeof FabricObject).type) ||\n types.includes(this.type)\n );\n }\n\n /**\n * Returns complexity of an instance\n * @return {Number} complexity of this instance (is 1 unless subclassed)\n */\n complexity() {\n return 1;\n }\n\n /**\n * Returns a JSON representation of an instance\n * @return {Object} JSON\n */\n toJSON() {\n // delegate, not alias\n return this.toObject();\n }\n\n /**\n * Sets \"angle\" of an instance with centered rotation\n * @param {TDegree} angle Angle value (in degrees)\n */\n rotate(angle: TDegree) {\n const { centeredRotation, originX, originY } = this;\n\n if (centeredRotation) {\n const { x, y } = this.getRelativeCenterPoint();\n this.originX = CENTER;\n this.originY = CENTER;\n this.left = x;\n this.top = y;\n }\n\n this.set('angle', angle);\n\n if (centeredRotation) {\n const { x, y } = this.translateToOriginPoint(\n this.getRelativeCenterPoint(),\n originX,\n originY,\n );\n this.left = x;\n this.top = y;\n this.originX = originX;\n this.originY = originY;\n }\n }\n\n /**\n * This callback function is called by the parent group of an object every\n * time a non-delegated property changes on the group. It is passed the key\n * and value as parameters. Not adding in this function's signature to avoid\n * Travis build error about unused variables.\n */\n setOnGroup() {\n // implemented by sub-classes, as needed.\n }\n\n /**\n * Sets canvas globalCompositeOperation for specific object\n * custom composition operation for the particular object can be specified using globalCompositeOperation property\n * @param {CanvasRenderingContext2D} ctx Rendering canvas context\n */\n _setupCompositeOperation(ctx: CanvasRenderingContext2D) {\n if (this.globalCompositeOperation) {\n ctx.globalCompositeOperation = this.globalCompositeOperation;\n }\n }\n\n /**\n * cancel instance's running animations\n * override if necessary to dispose artifacts such as `clipPath`\n */\n dispose() {\n runningAnimations.cancelByTarget(this);\n this.off();\n this._set('canvas', undefined);\n // clear caches\n this._cacheCanvas && getEnv().dispose(this._cacheCanvas);\n this._cacheCanvas = undefined;\n this._cacheContext = null;\n }\n\n // #region Animation methods\n /**\n * List of properties to consider for animating colors.\n * @type String[]\n */\n static colorProperties: string[] = [FILL, STROKE, 'backgroundColor'];\n\n /**\n * Animates object's properties\n * @param {Record} animatable map of keys and end values\n * @param {Partial>} options\n * @see {@link http://fabric5.fabricjs.com/fabric-intro-part-2#animation}\n * @return {Record>} map of animation contexts\n *\n * As object — multiple properties\n *\n * object.animate({ left: ..., top: ... });\n * object.animate({ left: ..., top: ... }, { duration: ... });\n */\n animate(\n animatable: Record,\n options?: Partial>,\n ): Record> {\n return Object.entries(animatable).reduce(\n (acc, [key, endValue]) => {\n acc[key] = this._animate(key, endValue, options);\n return acc;\n },\n {} as Record>,\n );\n }\n\n /**\n * @private\n * @param {String} key Property to animate\n * @param {String} to Value to animate to\n * @param {Object} [options] Options object\n */\n _animate(\n key: string,\n endValue: T,\n options: Partial> = {},\n ): TAnimation {\n const path = key.split('.');\n const propIsColor = (\n this.constructor as typeof FabricObject\n ).colorProperties.includes(path[path.length - 1]);\n const { abort, startValue, onChange, onComplete } = options;\n const animationOptions = {\n ...options,\n target: this,\n // path.reduce... is the current value in case start value isn't provided\n startValue:\n startValue ?? path.reduce((deep: any, key) => deep[key], this),\n endValue,\n abort: abort?.bind(this),\n onChange: (\n value: number | number[] | string,\n valueProgress: number,\n durationProgress: number,\n ) => {\n path.reduce((deep: Record, key, index) => {\n if (index === path.length - 1) {\n deep[key] = value;\n }\n return deep[key];\n }, this);\n onChange &&\n // @ts-expect-error generic callback arg0 is wrong\n onChange(value, valueProgress, durationProgress);\n },\n onComplete: (\n value: number | number[] | string,\n valueProgress: number,\n durationProgress: number,\n ) => {\n this.setCoords();\n onComplete &&\n // @ts-expect-error generic callback arg0 is wrong\n onComplete(value, valueProgress, durationProgress);\n },\n } as AnimationOptions;\n\n return (\n propIsColor\n ? animateColor(animationOptions as ColorAnimationOptions)\n : animate(\n animationOptions as ValueAnimationOptions | ArrayAnimationOptions,\n )\n ) as TAnimation;\n }\n\n // #region Object stacking methods\n\n /**\n * A reference to the parent of the object\n * Used to keep the original parent ref when the object has been added to an ActiveSelection, hence loosing the `group` ref\n */\n declare parent?: Group;\n\n /**\n * Checks if object is descendant of target\n * Should be used instead of {@link Group.contains} or {@link StaticCanvas.contains} for performance reasons\n * @param {TAncestor} target\n * @returns {boolean}\n */\n isDescendantOf(target: TAncestor): boolean {\n const { parent, group } = this;\n return (\n parent === target ||\n group === target ||\n // walk up\n (!!parent && parent.isDescendantOf(target)) ||\n (!!group && group !== parent && group.isDescendantOf(target))\n );\n }\n\n /**\n * @returns {Ancestors} ancestors (excluding `ActiveSelection`) from bottom to top\n */\n getAncestors(): Ancestors {\n const ancestors: TAncestor[] = [];\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n let parent: TAncestor | undefined = this;\n do {\n parent = parent.parent;\n parent && ancestors.push(parent);\n } while (parent);\n return ancestors as Ancestors;\n }\n\n /**\n * Compare ancestors\n *\n * @param {StackedObject} other\n * @returns {AncestryComparison} an object that represent the ancestry situation.\n */\n findCommonAncestors(other: T): AncestryComparison {\n if (this === other) {\n return {\n fork: [],\n otherFork: [],\n common: [this, ...this.getAncestors()],\n } as AncestryComparison;\n }\n const ancestors = this.getAncestors();\n const otherAncestors = other.getAncestors();\n // if `this` has no ancestors and `this` is top ancestor of `other` we must handle the following case\n if (\n ancestors.length === 0 &&\n otherAncestors.length > 0 &&\n this === otherAncestors[otherAncestors.length - 1]\n ) {\n return {\n fork: [],\n otherFork: [\n other,\n ...otherAncestors.slice(0, otherAncestors.length - 1),\n ],\n common: [this],\n } as AncestryComparison;\n }\n // compare ancestors\n for (let i = 0, ancestor; i < ancestors.length; i++) {\n ancestor = ancestors[i];\n if (ancestor === other) {\n return {\n fork: [this, ...ancestors.slice(0, i)],\n otherFork: [],\n common: ancestors.slice(i),\n } as AncestryComparison;\n }\n for (let j = 0; j < otherAncestors.length; j++) {\n if (this === otherAncestors[j]) {\n return {\n fork: [],\n otherFork: [other, ...otherAncestors.slice(0, j)],\n common: [this, ...ancestors],\n } as AncestryComparison;\n }\n if (ancestor === otherAncestors[j]) {\n return {\n fork: [this, ...ancestors.slice(0, i)],\n otherFork: [other, ...otherAncestors.slice(0, j)],\n common: ancestors.slice(i),\n } as AncestryComparison;\n }\n }\n }\n // nothing shared\n return {\n fork: [this, ...ancestors],\n otherFork: [other, ...otherAncestors],\n common: [],\n } as AncestryComparison;\n }\n\n /**\n *\n * @param {StackedObject} other\n * @returns {boolean}\n */\n hasCommonAncestors(other: T): boolean {\n const commonAncestors = this.findCommonAncestors(other);\n return commonAncestors && !!commonAncestors.common.length;\n }\n\n /**\n *\n * @param {FabricObject} other object to compare against\n * @returns {boolean | undefined} if objects do not share a common ancestor or they are strictly equal it is impossible to determine which is in front of the other; in such cases the function returns `undefined`\n */\n isInFrontOf(other: T): boolean | undefined {\n if (this === other) {\n return undefined;\n }\n const ancestorData = this.findCommonAncestors(other);\n\n if (ancestorData.fork.includes(other as any)) {\n return true;\n }\n if (ancestorData.otherFork.includes(this as any)) {\n return false;\n }\n // if there isn't a common ancestor, we take the canvas.\n // if there is no canvas, there is nothing to compare\n const firstCommonAncestor = ancestorData.common[0] || this.canvas;\n if (!firstCommonAncestor) {\n return undefined;\n }\n const headOfFork = ancestorData.fork.pop(),\n headOfOtherFork = ancestorData.otherFork.pop(),\n thisIndex = (firstCommonAncestor as TCollection)._objects.indexOf(\n headOfFork as any,\n ),\n otherIndex = (firstCommonAncestor as TCollection)._objects.indexOf(\n headOfOtherFork as any,\n );\n return thisIndex > -1 && thisIndex > otherIndex;\n }\n\n // #region Serialization\n /**\n * Define a list of custom properties that will be serialized when\n * instance.toObject() gets called\n */\n static customProperties: string[] = [];\n\n /**\n * Returns an object representation of an instance\n * @param {string[]} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} Object representation of an instance\n */\n toObject(propertiesToInclude: any[] = []): any {\n const propertiesToSerialize = propertiesToInclude.concat(\n FabricObject.customProperties,\n (this.constructor as typeof FabricObject).customProperties || [],\n );\n let clipPathData: Partial | undefined;\n const NUM_FRACTION_DIGITS = config.NUM_FRACTION_DIGITS;\n const {\n clipPath,\n fill,\n stroke,\n shadow,\n strokeDashArray,\n left,\n top,\n originX,\n originY,\n width,\n height,\n strokeWidth,\n strokeLineCap,\n strokeDashOffset,\n strokeLineJoin,\n strokeUniform,\n strokeMiterLimit,\n scaleX,\n scaleY,\n angle,\n flipX,\n flipY,\n opacity,\n visible,\n backgroundColor,\n fillRule,\n paintFirst,\n globalCompositeOperation,\n skewX,\n skewY,\n } = this;\n if (clipPath && !clipPath.excludeFromExport) {\n clipPathData = clipPath.toObject(\n propertiesToSerialize.concat('inverted', 'absolutePositioned'),\n );\n }\n const toFixedBound = (val: number) => toFixed(val, NUM_FRACTION_DIGITS);\n const object = {\n ...pick(this, propertiesToSerialize as (keyof this)[]),\n type: (this.constructor as typeof FabricObject).type,\n version: VERSION,\n originX,\n originY,\n left: toFixedBound(left),\n top: toFixedBound(top),\n width: toFixedBound(width),\n height: toFixedBound(height),\n fill: isSerializableFiller(fill) ? fill.toObject() : fill,\n stroke: isSerializableFiller(stroke) ? stroke.toObject() : stroke,\n strokeWidth: toFixedBound(strokeWidth),\n strokeDashArray: strokeDashArray\n ? strokeDashArray.concat()\n : strokeDashArray,\n strokeLineCap,\n strokeDashOffset,\n strokeLineJoin,\n strokeUniform,\n strokeMiterLimit: toFixedBound(strokeMiterLimit),\n scaleX: toFixedBound(scaleX),\n scaleY: toFixedBound(scaleY),\n angle: toFixedBound(angle),\n flipX,\n flipY,\n opacity: toFixedBound(opacity),\n shadow: shadow ? shadow.toObject() : shadow,\n visible,\n backgroundColor,\n fillRule,\n paintFirst,\n globalCompositeOperation,\n skewX: toFixedBound(skewX),\n skewY: toFixedBound(skewY),\n ...(clipPathData ? { clipPath: clipPathData } : null),\n };\n\n return !this.includeDefaultValues\n ? this._removeDefaultValues(object)\n : object;\n }\n\n /**\n * Returns (dataless) object representation of an instance\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} Object representation of an instance\n */\n toDatalessObject(propertiesToInclude?: any[]): any {\n // will be overwritten by subclasses\n return this.toObject(propertiesToInclude);\n }\n\n /**\n * @private\n * @param {Object} object\n */\n _removeDefaultValues(object: T): Partial {\n // getDefaults() ( get from static ownDefaults ) should win over prototype since anyway they get assigned to instance\n // ownDefault vs prototype is swappable only if you change all the fabric objects consistently.\n const defaults = (this.constructor as typeof FabricObject).getDefaults();\n const hasStaticDefaultValues = Object.keys(defaults).length > 0;\n const baseValues = hasStaticDefaultValues\n ? defaults\n : Object.getPrototypeOf(this);\n\n return pickBy(object, (value, key) => {\n if (key === LEFT || key === TOP || key === 'type') {\n return true;\n }\n const baseValue = baseValues[key];\n return (\n value !== baseValue &&\n // basically a check for [] === []\n !(\n Array.isArray(value) &&\n Array.isArray(baseValue) &&\n value.length === 0 &&\n baseValue.length === 0\n )\n );\n });\n }\n\n /**\n * Returns a string representation of an instance\n * @return {String}\n */\n toString() {\n return `#<${(this.constructor as typeof FabricObject).type}>`;\n }\n\n /**\n *\n * @param {Function} klass\n * @param {object} object\n * @param {object} [options]\n * @param {string} [options.extraParam] property to pass as first argument to the constructor\n * @param {AbortSignal} [options.signal] handle aborting, see https://developer.mozilla.org/en-US/docs/Web/API/AbortController/signal\n * @returns {Promise}\n */\n static _fromObject(\n { type, ...serializedObjectOptions }: Record,\n { extraParam, ...options }: Abortable & { extraParam?: string } = {},\n ): Promise {\n return enlivenObjectEnlivables(serializedObjectOptions, options).then(\n (enlivedObjectOptions) => {\n // from the resulting enlived options, extract options.extraParam to arg0\n // to avoid accidental overrides later\n if (extraParam) {\n delete enlivedObjectOptions[extraParam];\n return new this(\n serializedObjectOptions[extraParam],\n // @ts-expect-error different signature\n enlivedObjectOptions,\n );\n } else {\n return new this(enlivedObjectOptions);\n }\n },\n ) as Promise;\n }\n\n /**\n *\n * @param {object} object\n * @param {object} [options]\n * @param {AbortSignal} [options.signal] handle aborting, see https://developer.mozilla.org/en-US/docs/Web/API/AbortController/signal\n * @returns {Promise}\n */\n static fromObject>(\n object: T,\n options?: Abortable,\n ) {\n return this._fromObject(object, options);\n }\n}\n\nclassRegistry.setClass(FabricObject);\nclassRegistry.setClass(FabricObject, 'object');\n","import type {\n TModificationEvents,\n Transform,\n TransformActionHandler,\n} from '../EventTypeDefs';\nimport { fireEvent } from './fireEvent';\nimport { commonEventInfo } from './util';\n\n/**\n * Wrap an action handler with firing an event if the action is performed\n * @param {TModificationEvents} eventName the event we want to fire\n * @param {TransformActionHandler} actionHandler the function to wrap\n * @param {object} extraEventInfo extra information to pas to the event handler\n * @return {TransformActionHandler} a function with an action handler signature\n */\nexport const wrapWithFireEvent = <\n T extends Transform,\n P extends object = Record,\n>(\n eventName: TModificationEvents,\n actionHandler: TransformActionHandler,\n extraEventInfo?: P,\n) => {\n return ((eventData, transform, x, y) => {\n const actionPerformed = actionHandler(eventData, transform, x, y);\n if (actionPerformed) {\n fireEvent(eventName, {\n ...commonEventInfo(eventData, transform, x, y),\n ...extraEventInfo,\n });\n }\n return actionPerformed;\n }) as TransformActionHandler;\n};\n","import type { Transform, TransformActionHandler } from '../EventTypeDefs';\n\n/**\n * Wrap an action handler with saving/restoring object position on the transform.\n * this is the code that permits to objects to keep their position while transforming.\n * @param {Function} actionHandler the function to wrap\n * @return {Function} a function with an action handler signature\n */\nexport function wrapWithFixedAnchor(\n actionHandler: TransformActionHandler,\n) {\n return ((eventData, transform, x, y) => {\n const { target, originX, originY } = transform,\n centerPoint = target.getRelativeCenterPoint(),\n constraint = target.translateToOriginPoint(centerPoint, originX, originY),\n actionPerformed = actionHandler(eventData, transform, x, y);\n // flipping requires to change the transform origin, so we read from the mutated transform\n // instead of leveraging the one destructured before\n target.setPositionByOrigin(\n constraint,\n transform.originX,\n transform.originY,\n );\n return actionPerformed;\n }) as TransformActionHandler;\n}\n","import type { TransformActionHandler } from '../EventTypeDefs';\nimport { CENTER, LEFT, RESIZING, RIGHT } from '../constants';\nimport { resolveOrigin } from '../util/misc/resolveOrigin';\nimport { getLocalPoint, isTransformCentered } from './util';\nimport { wrapWithFireEvent } from './wrapWithFireEvent';\nimport { wrapWithFixedAnchor } from './wrapWithFixedAnchor';\n\n/**\n * Action handler to change object's width\n * Needs to be wrapped with `wrapWithFixedAnchor` to be effective\n * @param {Event} eventData javascript event that is doing the transform\n * @param {Object} transform javascript object containing a series of information around the current transform\n * @param {number} x current mouse x position, canvas normalized\n * @param {number} y current mouse y position, canvas normalized\n * @return {Boolean} true if some change happened\n */\nexport const changeObjectWidth: TransformActionHandler = (\n eventData,\n transform,\n x,\n y,\n) => {\n const localPoint = getLocalPoint(\n transform,\n transform.originX,\n transform.originY,\n x,\n y,\n );\n // make sure the control changes width ONLY from it's side of target\n if (\n resolveOrigin(transform.originX) === resolveOrigin(CENTER) ||\n (resolveOrigin(transform.originX) === resolveOrigin(RIGHT) &&\n localPoint.x < 0) ||\n (resolveOrigin(transform.originX) === resolveOrigin(LEFT) &&\n localPoint.x > 0)\n ) {\n const { target } = transform,\n strokePadding =\n target.strokeWidth / (target.strokeUniform ? target.scaleX : 1),\n multiplier = isTransformCentered(transform) ? 2 : 1,\n oldWidth = target.width,\n newWidth =\n Math.abs((localPoint.x * multiplier) / target.scaleX) - strokePadding;\n target.set('width', Math.max(newWidth, 1));\n // check against actual target width in case `newWidth` was rejected\n return oldWidth !== target.width;\n }\n return false;\n};\n\nexport const changeWidth = wrapWithFireEvent(\n RESIZING,\n wrapWithFixedAnchor(changeObjectWidth),\n);\n","import { FILL, STROKE, twoMathPi } from '../constants';\nimport type { InteractiveFabricObject } from '../shapes/Object/InteractiveObject';\nimport { degreesToRadians } from '../util/misc/radiansDegreesConversion';\nimport type { Control } from './Control';\n\nexport type ControlRenderingStyleOverride = Partial<\n Pick<\n InteractiveFabricObject,\n | 'cornerStyle'\n | 'cornerSize'\n | 'cornerColor'\n | 'cornerStrokeColor'\n | 'cornerDashArray'\n | 'transparentCorners'\n >\n>;\n\nexport type ControlRenderer<\n O extends InteractiveFabricObject = InteractiveFabricObject,\n> = (\n ctx: CanvasRenderingContext2D,\n left: number,\n top: number,\n styleOverride: ControlRenderingStyleOverride,\n fabricObject: O,\n) => void;\n\n/**\n * Render a round control, as per fabric features.\n * This function is written to respect object properties like transparentCorners, cornerSize\n * cornerColor, cornerStrokeColor\n * plus the addition of offsetY and offsetX.\n * @param {CanvasRenderingContext2D} ctx context to render on\n * @param {Number} left x coordinate where the control center should be\n * @param {Number} top y coordinate where the control center should be\n * @param {Object} styleOverride override for FabricObject controls style\n * @param {FabricObject} fabricObject the fabric object for which we are rendering controls\n */\nexport function renderCircleControl(\n this: Control,\n ctx: CanvasRenderingContext2D,\n left: number,\n top: number,\n styleOverride: ControlRenderingStyleOverride,\n fabricObject: InteractiveFabricObject,\n) {\n styleOverride = styleOverride || {};\n const xSize =\n this.sizeX || styleOverride.cornerSize || fabricObject.cornerSize,\n ySize = this.sizeY || styleOverride.cornerSize || fabricObject.cornerSize,\n transparentCorners =\n typeof styleOverride.transparentCorners !== 'undefined'\n ? styleOverride.transparentCorners\n : fabricObject.transparentCorners,\n methodName = transparentCorners ? STROKE : FILL,\n stroke =\n !transparentCorners &&\n (styleOverride.cornerStrokeColor || fabricObject.cornerStrokeColor);\n let myLeft = left,\n myTop = top,\n size;\n ctx.save();\n ctx.fillStyle = styleOverride.cornerColor || fabricObject.cornerColor || '';\n ctx.strokeStyle =\n styleOverride.cornerStrokeColor || fabricObject.cornerStrokeColor || '';\n // TODO: use proper ellipse code.\n if (xSize > ySize) {\n size = xSize;\n ctx.scale(1.0, ySize / xSize);\n myTop = (top * xSize) / ySize;\n } else if (ySize > xSize) {\n size = ySize;\n ctx.scale(xSize / ySize, 1.0);\n myLeft = (left * ySize) / xSize;\n } else {\n size = xSize;\n }\n ctx.beginPath();\n ctx.arc(myLeft, myTop, size / 2, 0, twoMathPi, false);\n ctx[methodName]();\n if (stroke) {\n ctx.stroke();\n }\n ctx.restore();\n}\n\n/**\n * Render a square control, as per fabric features.\n * This function is written to respect object properties like transparentCorners, cornerSize\n * cornerColor, cornerStrokeColor\n * plus the addition of offsetY and offsetX.\n * @param {CanvasRenderingContext2D} ctx context to render on\n * @param {Number} left x coordinate where the control center should be\n * @param {Number} top y coordinate where the control center should be\n * @param {Object} styleOverride override for FabricObject controls style\n * @param {FabricObject} fabricObject the fabric object for which we are rendering controls\n */\nexport function renderSquareControl(\n this: Control,\n ctx: CanvasRenderingContext2D,\n left: number,\n top: number,\n styleOverride: ControlRenderingStyleOverride,\n fabricObject: InteractiveFabricObject,\n) {\n styleOverride = styleOverride || {};\n const xSize =\n this.sizeX || styleOverride.cornerSize || fabricObject.cornerSize,\n ySize = this.sizeY || styleOverride.cornerSize || fabricObject.cornerSize,\n transparentCorners =\n typeof styleOverride.transparentCorners !== 'undefined'\n ? styleOverride.transparentCorners\n : fabricObject.transparentCorners,\n methodName = transparentCorners ? STROKE : FILL,\n stroke =\n !transparentCorners &&\n (styleOverride.cornerStrokeColor || fabricObject.cornerStrokeColor),\n xSizeBy2 = xSize / 2,\n ySizeBy2 = ySize / 2;\n ctx.save();\n ctx.fillStyle = styleOverride.cornerColor || fabricObject.cornerColor || '';\n ctx.strokeStyle =\n styleOverride.cornerStrokeColor || fabricObject.cornerStrokeColor || '';\n ctx.translate(left, top);\n // angle is relative to canvas plane\n const angle = fabricObject.getTotalAngle();\n ctx.rotate(degreesToRadians(angle));\n // this does not work, and fixed with ( && ) does not make sense.\n // to have real transparent corners we need the controls on upperCanvas\n // transparentCorners || ctx.clearRect(-xSizeBy2, -ySizeBy2, xSize, ySize);\n ctx[`${methodName}Rect`](-xSizeBy2, -ySizeBy2, xSize, ySize);\n if (stroke) {\n ctx.strokeRect(-xSizeBy2, -ySizeBy2, xSize, ySize);\n }\n ctx.restore();\n}\n","/* eslint-disable @typescript-eslint/no-unused-vars */\nimport type {\n ControlActionHandler,\n TPointerEvent,\n TransformActionHandler,\n} from '../EventTypeDefs';\nimport { Intersection } from '../Intersection';\nimport { Point } from '../Point';\nimport { SCALE } from '../constants';\nimport type {\n InteractiveFabricObject,\n TOCoord,\n} from '../shapes/Object/InteractiveObject';\nimport type { TCornerPoint, TDegree, TMat2D } from '../typedefs';\nimport {\n createRotateMatrix,\n createScaleMatrix,\n createTranslateMatrix,\n multiplyTransformMatrixArray,\n} from '../util/misc/matrix';\nimport type { ControlRenderingStyleOverride } from './controlRendering';\nimport { renderCircleControl, renderSquareControl } from './controlRendering';\n\nexport class Control {\n /**\n * keep track of control visibility.\n * mainly for backward compatibility.\n * if you do not want to see a control, you can remove it\n * from the control set.\n * @type {Boolean}\n * @default true\n */\n visible = true;\n\n /**\n * Name of the action that the control will likely execute.\n * This is optional. FabricJS uses to identify what the user is doing for some\n * extra optimizations. If you are writing a custom control and you want to know\n * somewhere else in the code what is going on, you can use this string here.\n * you can also provide a custom getActionName if your control run multiple actions\n * depending on some external state.\n * default to scale since is the most common, used on 4 corners by default\n * @type {String}\n * @default 'scale'\n */\n actionName = SCALE;\n\n /**\n * Drawing angle of the control.\n * NOT used for now, but name marked as needed for internal logic\n * example: to reuse the same drawing function for different rotated controls\n * @type {Number}\n * @default 0\n */\n angle = 0;\n\n /**\n * Relative position of the control. X\n * 0,0 is the center of the Object, while -0.5 (left) or 0.5 (right) are the extremities\n * of the bounding box.\n * @type {Number}\n * @default 0\n */\n x = 0;\n\n /**\n * Relative position of the control. Y\n * 0,0 is the center of the Object, while -0.5 (top) or 0.5 (bottom) are the extremities\n * of the bounding box.\n * @type {Number}\n * @default 0\n */\n y = 0;\n\n /**\n * Horizontal offset of the control from the defined position. In pixels\n * Positive offset moves the control to the right, negative to the left.\n * It used when you want to have position of control that does not scale with\n * the bounding box. Example: rotation control is placed at x:0, y: 0.5 on\n * the boundind box, with an offset of 30 pixels vertically. Those 30 pixels will\n * stay 30 pixels no matter how the object is big. Another example is having 2\n * controls in the corner, that stay in the same position when the object scale.\n * of the bounding box.\n * @type {Number}\n * @default 0\n */\n offsetX = 0;\n\n /**\n * Vertical offset of the control from the defined position. In pixels\n * Positive offset moves the control to the bottom, negative to the top.\n * @type {Number}\n * @default 0\n */\n offsetY = 0;\n\n /**\n * Sets the length of the control. If null, defaults to object's cornerSize.\n * Expects both sizeX and sizeY to be set when set.\n * @type {?Number}\n * @default null\n */\n sizeX = 0;\n\n /**\n * Sets the height of the control. If null, defaults to object's cornerSize.\n * Expects both sizeX and sizeY to be set when set.\n * @type {?Number}\n * @default null\n */\n sizeY = 0;\n\n /**\n * Sets the length of the touch area of the control. If null, defaults to object's touchCornerSize.\n * Expects both touchSizeX and touchSizeY to be set when set.\n * @type {?Number}\n * @default null\n */\n touchSizeX = 0;\n\n /**\n * Sets the height of the touch area of the control. If null, defaults to object's touchCornerSize.\n * Expects both touchSizeX and touchSizeY to be set when set.\n * @type {?Number}\n * @default null\n */\n touchSizeY = 0;\n\n /**\n * Css cursor style to display when the control is hovered.\n * if the method `cursorStyleHandler` is provided, this property is ignored.\n * @type {String}\n * @default 'crosshair'\n */\n cursorStyle = 'crosshair';\n\n /**\n * If controls has an offsetY or offsetX, draw a line that connects\n * the control to the bounding box\n * @type {Boolean}\n * @default false\n */\n withConnection = false;\n\n constructor(options?: Partial) {\n Object.assign(this, options);\n }\n\n /**\n * The control actionHandler, provide one to handle action ( control being moved )\n * @param {Event} eventData the native mouse event\n * @param {Transform} transformData properties of the current transform\n * @param {Number} x x position of the cursor\n * @param {Number} y y position of the cursor\n * @return {Boolean} true if the action/event modified the object\n */\n declare actionHandler: TransformActionHandler;\n\n /**\n * The control handler for mouse down, provide one to handle mouse down on control\n * @param {Event} eventData the native mouse event\n * @param {Transform} transformData properties of the current transform\n * @param {Number} x x position of the cursor\n * @param {Number} y y position of the cursor\n * @return {Boolean} true if the action/event modified the object\n */\n declare mouseDownHandler?: ControlActionHandler;\n\n /**\n * The control mouseUpHandler, provide one to handle an effect on mouse up.\n * @param {Event} eventData the native mouse event\n * @param {Transform} transformData properties of the current transform\n * @param {Number} x x position of the cursor\n * @param {Number} y y position of the cursor\n * @return {Boolean} true if the action/event modified the object\n */\n declare mouseUpHandler?: ControlActionHandler;\n\n shouldActivate(\n controlKey: string,\n fabricObject: InteractiveFabricObject,\n pointer: Point,\n { tl, tr, br, bl }: TCornerPoint,\n ) {\n // TODO: locking logic can be handled here instead of in the control handler logic\n return (\n fabricObject.canvas?.getActiveObject() === fabricObject &&\n fabricObject.isControlVisible(controlKey) &&\n Intersection.isPointInPolygon(pointer, [tl, tr, br, bl])\n );\n }\n\n /**\n * Returns control actionHandler\n * @param {Event} eventData the native mouse event\n * @param {FabricObject} fabricObject on which the control is displayed\n * @param {Control} control control for which the action handler is being asked\n * @return {Function} the action handler\n */\n getActionHandler(\n eventData: TPointerEvent,\n fabricObject: InteractiveFabricObject,\n control: Control,\n ): TransformActionHandler | undefined {\n return this.actionHandler;\n }\n\n /**\n * Returns control mouseDown handler\n * @param {Event} eventData the native mouse event\n * @param {FabricObject} fabricObject on which the control is displayed\n * @param {Control} control control for which the action handler is being asked\n * @return {Function} the action handler\n */\n getMouseDownHandler(\n eventData: TPointerEvent,\n fabricObject: InteractiveFabricObject,\n control: Control,\n ): ControlActionHandler | undefined {\n return this.mouseDownHandler;\n }\n\n /**\n * Returns control mouseUp handler.\n * During actions the fabricObject or the control can be of different obj\n * @param {Event} eventData the native mouse event\n * @param {FabricObject} fabricObject on which the control is displayed\n * @param {Control} control control for which the action handler is being asked\n * @return {Function} the action handler\n */\n getMouseUpHandler(\n eventData: TPointerEvent,\n fabricObject: InteractiveFabricObject,\n control: Control,\n ): ControlActionHandler | undefined {\n return this.mouseUpHandler;\n }\n\n /**\n * Returns control cursorStyle for css using cursorStyle. If you need a more elaborate\n * function you can pass one in the constructor\n * the cursorStyle property\n * @param {Event} eventData the native mouse event\n * @param {Control} control the current control ( likely this)\n * @param {FabricObject} object on which the control is displayed\n * @return {String}\n */\n cursorStyleHandler(\n eventData: TPointerEvent,\n control: Control,\n fabricObject: InteractiveFabricObject,\n coord: TOCoord,\n ) {\n return control.cursorStyle;\n }\n\n /**\n * Returns the action name. The basic implementation just return the actionName property.\n * @param {Event} eventData the native mouse event\n * @param {Control} control the current control ( likely this)\n * @param {FabricObject} object on which the control is displayed\n * @return {String}\n */\n getActionName(\n eventData: TPointerEvent,\n control: Control,\n fabricObject: InteractiveFabricObject,\n ) {\n return control.actionName;\n }\n\n /**\n * Returns controls visibility\n * @param {FabricObject} object on which the control is displayed\n * @param {String} controlKey key where the control is memorized on the\n * @return {Boolean}\n */\n getVisibility(fabricObject: InteractiveFabricObject, controlKey: string) {\n return fabricObject._controlsVisibility?.[controlKey] ?? this.visible;\n }\n\n /**\n * Sets controls visibility\n * @param {Boolean} visibility for the object\n * @return {Void}\n */\n setVisibility(\n visibility: boolean,\n name?: string,\n fabricObject?: InteractiveFabricObject,\n ) {\n this.visible = visibility;\n }\n\n positionHandler(\n dim: Point,\n finalMatrix: TMat2D,\n fabricObject: InteractiveFabricObject,\n currentControl: Control,\n ) {\n return new Point(\n this.x * dim.x + this.offsetX,\n this.y * dim.y + this.offsetY,\n ).transform(finalMatrix);\n }\n\n /**\n * Returns the coords for this control based on object values.\n * @param {Number} objectAngle angle from the fabric object holding the control\n * @param {Number} objectCornerSize cornerSize from the fabric object holding the control (or touchCornerSize if\n * isTouch is true)\n * @param {Number} centerX x coordinate where the control center should be\n * @param {Number} centerY y coordinate where the control center should be\n * @param {boolean} isTouch true if touch corner, false if normal corner\n */\n calcCornerCoords(\n angle: TDegree,\n objectCornerSize: number,\n centerX: number,\n centerY: number,\n isTouch: boolean,\n fabricObject: InteractiveFabricObject,\n ) {\n const t = multiplyTransformMatrixArray([\n createTranslateMatrix(centerX, centerY),\n createRotateMatrix({ angle }),\n createScaleMatrix(\n (isTouch ? this.touchSizeX : this.sizeX) || objectCornerSize,\n (isTouch ? this.touchSizeY : this.sizeY) || objectCornerSize,\n ),\n ]);\n return {\n tl: new Point(-0.5, -0.5).transform(t),\n tr: new Point(0.5, -0.5).transform(t),\n br: new Point(0.5, 0.5).transform(t),\n bl: new Point(-0.5, 0.5).transform(t),\n };\n }\n\n /**\n * Render function for the control.\n * When this function runs the context is unscaled. unrotate. Just retina scaled.\n * all the functions will have to translate to the point left,top before starting Drawing\n * if they want to draw a control where the position is detected.\n * left and top are the result of the positionHandler function\n * @param {RenderingContext2D} ctx the context where the control will be drawn\n * @param {Number} left position of the canvas where we are about to render the control.\n * @param {Number} top position of the canvas where we are about to render the control.\n * @param {Object} styleOverride\n * @param {FabricObject} fabricObject the object where the control is about to be rendered\n */\n render(\n ctx: CanvasRenderingContext2D,\n left: number,\n top: number,\n styleOverride: ControlRenderingStyleOverride | undefined,\n fabricObject: InteractiveFabricObject,\n ) {\n styleOverride = styleOverride || {};\n switch (styleOverride.cornerStyle || fabricObject.cornerStyle) {\n case 'circle':\n renderCircleControl.call(\n this,\n ctx,\n left,\n top,\n styleOverride,\n fabricObject,\n );\n break;\n default:\n renderSquareControl.call(\n this,\n ctx,\n left,\n top,\n styleOverride,\n fabricObject,\n );\n }\n }\n}\n","import type {\n ControlCursorCallback,\n TransformActionHandler,\n} from '../EventTypeDefs';\nimport { ROTATING } from '../constants';\nimport { radiansToDegrees } from '../util/misc/radiansDegreesConversion';\nimport { isLocked, NOT_ALLOWED_CURSOR } from './util';\nimport { wrapWithFireEvent } from './wrapWithFireEvent';\nimport { wrapWithFixedAnchor } from './wrapWithFixedAnchor';\n\n/**\n * Find the correct style for the control that is used for rotation.\n * this function is very simple and it just take care of not-allowed or standard cursor\n * @param {Event} eventData the javascript event that is causing the scale\n * @param {Control} control the control that is interested in the action\n * @param {FabricObject} fabricObject the fabric object that is interested in the action\n * @return {String} a valid css string for the cursor\n */\nexport const rotationStyleHandler: ControlCursorCallback = (\n eventData,\n control,\n fabricObject,\n) => {\n if (fabricObject.lockRotation) {\n return NOT_ALLOWED_CURSOR;\n }\n return control.cursorStyle;\n};\n\n/**\n * Action handler for rotation and snapping, without anchor point.\n * Needs to be wrapped with `wrapWithFixedAnchor` to be effective\n * @param {Event} eventData javascript event that is doing the transform\n * @param {Object} transform javascript object containing a series of information around the current transform\n * @param {number} x current mouse x position, canvas normalized\n * @param {number} y current mouse y position, canvas normalized\n * @return {Boolean} true if some change happened\n * @private\n */\nconst rotateObjectWithSnapping: TransformActionHandler = (\n eventData,\n { target, ex, ey, theta, originX, originY },\n x,\n y,\n) => {\n const pivotPoint = target.translateToOriginPoint(\n target.getRelativeCenterPoint(),\n originX,\n originY,\n );\n\n if (isLocked(target, 'lockRotation')) {\n return false;\n }\n\n const lastAngle = Math.atan2(ey - pivotPoint.y, ex - pivotPoint.x),\n curAngle = Math.atan2(y - pivotPoint.y, x - pivotPoint.x);\n let angle = radiansToDegrees(curAngle - lastAngle + theta);\n\n if (target.snapAngle && target.snapAngle > 0) {\n const snapAngle = target.snapAngle,\n snapThreshold = target.snapThreshold || snapAngle,\n rightAngleLocked = Math.ceil(angle / snapAngle) * snapAngle,\n leftAngleLocked = Math.floor(angle / snapAngle) * snapAngle;\n\n if (Math.abs(angle - leftAngleLocked) < snapThreshold) {\n angle = leftAngleLocked;\n } else if (Math.abs(angle - rightAngleLocked) < snapThreshold) {\n angle = rightAngleLocked;\n }\n }\n\n // normalize angle to positive value\n if (angle < 0) {\n angle = 360 + angle;\n }\n angle %= 360;\n\n const hasRotated = target.angle !== angle;\n // TODO: why aren't we using set?\n target.angle = angle;\n return hasRotated;\n};\n\nexport const rotationWithSnapping = wrapWithFireEvent(\n ROTATING,\n wrapWithFixedAnchor(rotateObjectWithSnapping),\n);\n","import type {\n ControlCursorCallback,\n TPointerEvent,\n Transform,\n TransformActionHandler,\n} from '../EventTypeDefs';\nimport type { FabricObject } from '../shapes/Object/FabricObject';\nimport type { TAxis } from '../typedefs';\nimport type { Canvas } from '../canvas/Canvas';\nimport {\n findCornerQuadrant,\n getLocalPoint,\n invertOrigin,\n isLocked,\n isTransformCentered,\n NOT_ALLOWED_CURSOR,\n} from './util';\nimport { wrapWithFireEvent } from './wrapWithFireEvent';\nimport { wrapWithFixedAnchor } from './wrapWithFixedAnchor';\nimport { SCALE_X, SCALE_Y, SCALING } from '../constants';\n\ntype ScaleTransform = Transform & {\n gestureScale?: number;\n signX?: number;\n signY?: number;\n};\n\ntype ScaleBy = TAxis | 'equally' | '' | undefined;\n\n/**\n * Inspect event and fabricObject properties to understand if the scaling action\n * @param {Event} eventData from the user action\n * @param {FabricObject} fabricObject the fabric object about to scale\n * @return {Boolean} true if scale is proportional\n */\nexport function scaleIsProportional(\n eventData: TPointerEvent,\n fabricObject: FabricObject,\n): boolean {\n const canvas = fabricObject.canvas as Canvas,\n uniformIsToggled = eventData[canvas.uniScaleKey!];\n return (\n (canvas.uniformScaling && !uniformIsToggled) ||\n (!canvas.uniformScaling && uniformIsToggled)\n );\n}\n\n/**\n * Inspect fabricObject to understand if the current scaling action is allowed\n * @param {FabricObject} fabricObject the fabric object about to scale\n * @param {String} by 'x' or 'y' or ''\n * @param {Boolean} scaleProportionally true if we are trying to scale proportionally\n * @return {Boolean} true if scaling is not allowed at current conditions\n */\nexport function scalingIsForbidden(\n fabricObject: FabricObject,\n by: ScaleBy,\n scaleProportionally: boolean,\n) {\n const lockX = isLocked(fabricObject, 'lockScalingX'),\n lockY = isLocked(fabricObject, 'lockScalingY');\n if (lockX && lockY) {\n return true;\n }\n if (!by && (lockX || lockY) && scaleProportionally) {\n return true;\n }\n if (lockX && by === 'x') {\n return true;\n }\n if (lockY && by === 'y') {\n return true;\n }\n // code crashes because of a division by 0 if a 0 sized object is scaled\n // forbid to prevent scaling to happen. ISSUE-9475\n const { width, height, strokeWidth } = fabricObject;\n if (width === 0 && strokeWidth === 0 && by !== 'y') {\n return true;\n }\n if (height === 0 && strokeWidth === 0 && by !== 'x') {\n return true;\n }\n return false;\n}\n\nconst scaleMap = ['e', 'se', 's', 'sw', 'w', 'nw', 'n', 'ne', 'e'];\n\n/**\n * return the correct cursor style for the scale action\n * @param {Event} eventData the javascript event that is causing the scale\n * @param {Control} control the control that is interested in the action\n * @param {FabricObject} fabricObject the fabric object that is interested in the action\n * @return {String} a valid css string for the cursor\n */\nexport const scaleCursorStyleHandler: ControlCursorCallback = (\n eventData,\n control,\n fabricObject,\n coord,\n) => {\n const scaleProportionally = scaleIsProportional(eventData, fabricObject),\n by =\n control.x !== 0 && control.y === 0\n ? 'x'\n : control.x === 0 && control.y !== 0\n ? 'y'\n : '';\n if (scalingIsForbidden(fabricObject, by, scaleProportionally)) {\n return NOT_ALLOWED_CURSOR;\n }\n const n = findCornerQuadrant(fabricObject, control, coord);\n return `${scaleMap[n]}-resize`;\n};\n\n/**\n * Basic scaling logic, reused with different constrain for scaling X,Y, freely or equally.\n * Needs to be wrapped with `wrapWithFixedAnchor` to be effective\n * @param {Event} eventData javascript event that is doing the transform\n * @param {Object} transform javascript object containing a series of information around the current transform\n * @param {number} x current mouse x position, canvas normalized\n * @param {number} y current mouse y position, canvas normalized\n * @param {Object} options additional information for scaling\n * @param {String} options.by 'x', 'y', 'equally' or '' to indicate type of scaling\n * @return {Boolean} true if some change happened\n * @private\n */\nfunction scaleObject(\n eventData: TPointerEvent,\n transform: ScaleTransform,\n x: number,\n y: number,\n options: { by?: ScaleBy } = {},\n) {\n const target = transform.target,\n by = options.by,\n scaleProportionally = scaleIsProportional(eventData, target),\n forbidScaling = scalingIsForbidden(target, by, scaleProportionally);\n let newPoint, scaleX, scaleY, dim, signX, signY;\n\n if (forbidScaling) {\n return false;\n }\n if (transform.gestureScale) {\n scaleX = transform.scaleX * transform.gestureScale;\n scaleY = transform.scaleY * transform.gestureScale;\n } else {\n newPoint = getLocalPoint(\n transform,\n transform.originX,\n transform.originY,\n x,\n y,\n );\n // use of sign: We use sign to detect change of direction of an action. sign usually change when\n // we cross the origin point with the mouse. So a scale flip for example. There is an issue when scaling\n // by center and scaling using one middle control ( default: mr, mt, ml, mb), the mouse movement can easily\n // cross many time the origin point and flip the object. so we need a way to filter out the noise.\n // This ternary here should be ok to filter out X scaling when we want Y only and vice versa.\n signX = by !== 'y' ? Math.sign(newPoint.x || transform.signX || 1) : 1;\n signY = by !== 'x' ? Math.sign(newPoint.y || transform.signY || 1) : 1;\n if (!transform.signX) {\n transform.signX = signX;\n }\n if (!transform.signY) {\n transform.signY = signY;\n }\n\n if (\n isLocked(target, 'lockScalingFlip') &&\n (transform.signX !== signX || transform.signY !== signY)\n ) {\n return false;\n }\n\n dim = target._getTransformedDimensions();\n // missing detection of flip and logic to switch the origin\n if (scaleProportionally && !by) {\n // uniform scaling\n const distance = Math.abs(newPoint.x) + Math.abs(newPoint.y),\n { original } = transform,\n originalDistance =\n Math.abs((dim.x * original.scaleX) / target.scaleX) +\n Math.abs((dim.y * original.scaleY) / target.scaleY),\n scale = distance / originalDistance;\n scaleX = original.scaleX * scale;\n scaleY = original.scaleY * scale;\n } else {\n scaleX = Math.abs((newPoint.x * target.scaleX) / dim.x);\n scaleY = Math.abs((newPoint.y * target.scaleY) / dim.y);\n }\n // if we are scaling by center, we need to double the scale\n if (isTransformCentered(transform)) {\n scaleX *= 2;\n scaleY *= 2;\n }\n if (transform.signX !== signX && by !== 'y') {\n transform.originX = invertOrigin(transform.originX);\n scaleX *= -1;\n transform.signX = signX;\n }\n if (transform.signY !== signY && by !== 'x') {\n transform.originY = invertOrigin(transform.originY);\n scaleY *= -1;\n transform.signY = signY;\n }\n }\n // minScale is taken care of in the setter.\n const oldScaleX = target.scaleX,\n oldScaleY = target.scaleY;\n if (!by) {\n !isLocked(target, 'lockScalingX') && target.set(SCALE_X, scaleX);\n !isLocked(target, 'lockScalingY') && target.set(SCALE_Y, scaleY);\n } else {\n // forbidden cases already handled on top here.\n by === 'x' && target.set(SCALE_X, scaleX);\n by === 'y' && target.set(SCALE_Y, scaleY);\n }\n return oldScaleX !== target.scaleX || oldScaleY !== target.scaleY;\n}\n\n/**\n * Generic scaling logic, to scale from corners either equally or freely.\n * Needs to be wrapped with `wrapWithFixedAnchor` to be effective\n * @param {Event} eventData javascript event that is doing the transform\n * @param {Object} transform javascript object containing a series of information around the current transform\n * @param {number} x current mouse x position, canvas normalized\n * @param {number} y current mouse y position, canvas normalized\n * @return {Boolean} true if some change happened\n */\nexport const scaleObjectFromCorner: TransformActionHandler = (\n eventData,\n transform,\n x,\n y,\n) => {\n return scaleObject(eventData, transform, x, y);\n};\n\n/**\n * Scaling logic for the X axis.\n * Needs to be wrapped with `wrapWithFixedAnchor` to be effective\n * @param {Event} eventData javascript event that is doing the transform\n * @param {Object} transform javascript object containing a series of information around the current transform\n * @param {number} x current mouse x position, canvas normalized\n * @param {number} y current mouse y position, canvas normalized\n * @return {Boolean} true if some change happened\n */\nconst scaleObjectX: TransformActionHandler = (\n eventData,\n transform,\n x,\n y,\n) => {\n return scaleObject(eventData, transform, x, y, { by: 'x' });\n};\n\n/**\n * Scaling logic for the Y axis.\n * Needs to be wrapped with `wrapWithFixedAnchor` to be effective\n * @param {Event} eventData javascript event that is doing the transform\n * @param {Object} transform javascript object containing a series of information around the current transform\n * @param {number} x current mouse x position, canvas normalized\n * @param {number} y current mouse y position, canvas normalized\n * @return {Boolean} true if some change happened\n */\nconst scaleObjectY: TransformActionHandler = (\n eventData,\n transform,\n x,\n y,\n) => {\n return scaleObject(eventData, transform, x, y, { by: 'y' });\n};\n\nexport const scalingEqually = wrapWithFireEvent(\n SCALING,\n wrapWithFixedAnchor(scaleObjectFromCorner),\n);\n\nexport const scalingX = wrapWithFireEvent(\n SCALING,\n wrapWithFixedAnchor(scaleObjectX),\n);\n\nexport const scalingY = wrapWithFireEvent(\n SCALING,\n wrapWithFixedAnchor(scaleObjectY),\n);\n","import type {\n ControlCursorCallback,\n TPointerEvent,\n Transform,\n TransformActionHandler,\n} from '../EventTypeDefs';\nimport { resolveOrigin } from '../util/misc/resolveOrigin';\nimport { Point } from '../Point';\nimport type { TAxis, TAxisKey } from '../typedefs';\nimport {\n degreesToRadians,\n radiansToDegrees,\n} from '../util/misc/radiansDegreesConversion';\nimport {\n findCornerQuadrant,\n getLocalPoint,\n isLocked,\n NOT_ALLOWED_CURSOR,\n} from './util';\nimport { wrapWithFireEvent } from './wrapWithFireEvent';\nimport { wrapWithFixedAnchor } from './wrapWithFixedAnchor';\nimport {\n CENTER,\n SCALE_X,\n SCALE_Y,\n SKEWING,\n SKEW_X,\n SKEW_Y,\n} from '../constants';\n\nexport type SkewTransform = Transform & { skewingSide: -1 | 1 };\n\nconst AXIS_KEYS: Record<\n TAxis,\n {\n counterAxis: TAxis;\n scale: TAxisKey<'scale'>;\n skew: TAxisKey<'skew'>;\n lockSkewing: TAxisKey<'lockSkewing'>;\n origin: TAxisKey<'origin'>;\n flip: TAxisKey<'flip'>;\n }\n> = {\n x: {\n counterAxis: 'y',\n scale: SCALE_X,\n skew: SKEW_X,\n lockSkewing: 'lockSkewingX',\n origin: 'originX',\n flip: 'flipX',\n },\n y: {\n counterAxis: 'x',\n scale: SCALE_Y,\n skew: SKEW_Y,\n lockSkewing: 'lockSkewingY',\n origin: 'originY',\n flip: 'flipY',\n },\n};\n\nconst skewMap = ['ns', 'nesw', 'ew', 'nwse'];\n\n/**\n * return the correct cursor style for the skew action\n * @param {Event} eventData the javascript event that is causing the scale\n * @param {Control} control the control that is interested in the action\n * @param {FabricObject} fabricObject the fabric object that is interested in the action\n * @return {String} a valid css string for the cursor\n */\nexport const skewCursorStyleHandler: ControlCursorCallback = (\n eventData,\n control,\n fabricObject,\n coord,\n) => {\n if (control.x !== 0 && isLocked(fabricObject, 'lockSkewingY')) {\n return NOT_ALLOWED_CURSOR;\n }\n if (control.y !== 0 && isLocked(fabricObject, 'lockSkewingX')) {\n return NOT_ALLOWED_CURSOR;\n }\n const n = findCornerQuadrant(fabricObject, control, coord) % 4;\n return `${skewMap[n]}-resize`;\n};\n\n/**\n * Since skewing is applied before scaling, calculations are done in a scaleless plane\n * @see https://github.com/fabricjs/fabric.js/pull/8380\n */\nfunction skewObject(\n axis: TAxis,\n { target, ex, ey, skewingSide, ...transform }: SkewTransform,\n pointer: Point,\n) {\n const { skew: skewKey } = AXIS_KEYS[axis],\n offset = pointer\n .subtract(new Point(ex, ey))\n .divide(new Point(target.scaleX, target.scaleY))[axis],\n skewingBefore = target[skewKey],\n skewingStart = transform[skewKey],\n shearingStart = Math.tan(degreesToRadians(skewingStart)),\n // let a, b be the size of target\n // let a' be the value of a after applying skewing\n // then:\n // a' = a + b * skewA => skewA = (a' - a) / b\n // the value b is tricky since skewY is applied before skewX\n b =\n axis === 'y'\n ? target._getTransformedDimensions({\n scaleX: 1,\n scaleY: 1,\n // since skewY is applied before skewX, b (=width) is not affected by skewX\n skewX: 0,\n }).x\n : target._getTransformedDimensions({\n scaleX: 1,\n scaleY: 1,\n }).y;\n\n const shearing =\n (2 * offset * skewingSide) /\n // we max out fractions to safeguard from asymptotic behavior\n Math.max(b, 1) +\n // add starting state\n shearingStart;\n\n const skewing = radiansToDegrees(Math.atan(shearing));\n\n target.set(skewKey, skewing);\n const changed = skewingBefore !== target[skewKey];\n\n if (changed && axis === 'y') {\n // we don't want skewing to affect scaleX\n // so we factor it by the inverse skewing diff to make it seem unchanged to the viewer\n const { skewX, scaleX } = target,\n dimBefore = target._getTransformedDimensions({ skewY: skewingBefore }),\n dimAfter = target._getTransformedDimensions(),\n compensationFactor = skewX !== 0 ? dimBefore.x / dimAfter.x : 1;\n compensationFactor !== 1 &&\n target.set(SCALE_X, compensationFactor * scaleX);\n }\n\n return changed;\n}\n\n/**\n * Wrapped Action handler for skewing on a given axis, takes care of the\n * skew direction and determines the correct transform origin for the anchor point\n * @param {Event} eventData javascript event that is doing the transform\n * @param {Object} transform javascript object containing a series of information around the current transform\n * @param {number} x current mouse x position, canvas normalized\n * @param {number} y current mouse y position, canvas normalized\n * @return {Boolean} true if some change happened\n */\nfunction skewHandler(\n axis: TAxis,\n eventData: TPointerEvent,\n transform: Transform,\n x: number,\n y: number,\n) {\n const { target } = transform,\n {\n counterAxis,\n origin: originKey,\n lockSkewing: lockSkewingKey,\n skew: skewKey,\n flip: flipKey,\n } = AXIS_KEYS[axis];\n if (isLocked(target, lockSkewingKey)) {\n return false;\n }\n\n const { origin: counterOriginKey, flip: counterFlipKey } =\n AXIS_KEYS[counterAxis],\n counterOriginFactor =\n resolveOrigin(transform[counterOriginKey]) *\n (target[counterFlipKey] ? -1 : 1),\n // if the counter origin is top/left (= -0.5) then we are skewing x/y values on the bottom/right side of target respectively.\n // if the counter origin is bottom/right (= 0.5) then we are skewing x/y values on the top/left side of target respectively.\n // skewing direction on the top/left side of target is OPPOSITE to the direction of the movement of the pointer,\n // so we factor skewing direction by this value.\n skewingSide = (-Math.sign(counterOriginFactor) *\n (target[flipKey] ? -1 : 1)) as 1 | -1,\n skewingDirection =\n ((target[skewKey] === 0 &&\n // in case skewing equals 0 we use the pointer offset from target center to determine the direction of skewing\n getLocalPoint(transform, CENTER, CENTER, x, y)[axis] > 0) ||\n // in case target has skewing we use that as the direction\n target[skewKey] > 0\n ? 1\n : -1) * skewingSide,\n // anchor to the opposite side of the skewing direction\n // normalize value from [-1, 1] to origin value [0, 1]\n origin = -skewingDirection * 0.5 + 0.5;\n\n const finalHandler = wrapWithFireEvent(\n SKEWING,\n wrapWithFixedAnchor((eventData, transform, x, y) =>\n skewObject(axis, transform, new Point(x, y)),\n ),\n );\n\n return finalHandler(\n eventData,\n {\n ...transform,\n [originKey]: origin,\n skewingSide,\n },\n x,\n y,\n );\n}\n\n/**\n * Wrapped Action handler for skewing on the X axis, takes care of the\n * skew direction and determines the correct transform origin for the anchor point\n * @param {Event} eventData javascript event that is doing the transform\n * @param {Object} transform javascript object containing a series of information around the current transform\n * @param {number} x current mouse x position, canvas normalized\n * @param {number} y current mouse y position, canvas normalized\n * @return {Boolean} true if some change happened\n */\nexport const skewHandlerX: TransformActionHandler = (\n eventData,\n transform,\n x,\n y,\n) => {\n return skewHandler('x', eventData, transform, x, y);\n};\n\n/**\n * Wrapped Action handler for skewing on the Y axis, takes care of the\n * skew direction and determines the correct transform origin for the anchor point\n * @param {Event} eventData javascript event that is doing the transform\n * @param {Object} transform javascript object containing a series of information around the current transform\n * @param {number} x current mouse x position, canvas normalized\n * @param {number} y current mouse y position, canvas normalized\n * @return {Boolean} true if some change happened\n */\nexport const skewHandlerY: TransformActionHandler = (\n eventData,\n transform,\n x,\n y,\n) => {\n return skewHandler('y', eventData, transform, x, y);\n};\n","import type {\n ControlCallback,\n ControlCursorCallback,\n TPointerEvent,\n TransformActionHandler,\n} from '../EventTypeDefs';\nimport { SCALE_X, SCALE_Y, SKEW_X, SKEW_Y } from '../constants';\nimport type { FabricObject } from '../shapes/Object/FabricObject';\nimport type { TAxisKey } from '../typedefs';\nimport { scaleCursorStyleHandler, scalingX, scalingY } from './scale';\nimport { skewCursorStyleHandler, skewHandlerX, skewHandlerY } from './skew';\n\nfunction isAltAction(eventData: TPointerEvent, target: FabricObject) {\n return eventData[target.canvas!.altActionKey!];\n}\n\n/**\n * Inspect event, control and fabricObject to return the correct action name\n * @param {Event} eventData the javascript event that is causing the scale\n * @param {Control} control the control that is interested in the action\n * @param {FabricObject} fabricObject the fabric object that is interested in the action\n * @return {String} an action name\n */\nexport const scaleOrSkewActionName: ControlCallback<\n TAxisKey<'skew' | 'scale'> | ''\n> = (eventData, control, fabricObject) => {\n const isAlternative = isAltAction(eventData, fabricObject);\n if (control.x === 0) {\n // then is scaleY or skewX\n return isAlternative ? SKEW_X : SCALE_Y;\n }\n if (control.y === 0) {\n // then is scaleY or skewX\n return isAlternative ? SKEW_Y : SCALE_X;\n }\n return '';\n};\n\n/**\n * Combine skew and scale style handlers to cover fabric standard use case\n * @param {Event} eventData the javascript event that is causing the scale\n * @param {Control} control the control that is interested in the action\n * @param {FabricObject} fabricObject the fabric object that is interested in the action\n * @return {String} a valid css string for the cursor\n */\nexport const scaleSkewCursorStyleHandler: ControlCursorCallback = (\n eventData,\n control,\n fabricObject,\n coord,\n) => {\n return isAltAction(eventData, fabricObject)\n ? skewCursorStyleHandler(eventData, control, fabricObject, coord)\n : scaleCursorStyleHandler(eventData, control, fabricObject, coord);\n};\n/**\n * Composed action handler to either scale X or skew Y\n * Needs to be wrapped with `wrapWithFixedAnchor` to be effective\n * @param {Event} eventData javascript event that is doing the transform\n * @param {Object} transform javascript object containing a series of information around the current transform\n * @param {number} x current mouse x position, canvas normalized\n * @param {number} y current mouse y position, canvas normalized\n * @return {Boolean} true if some change happened\n */\nexport const scalingXOrSkewingY: TransformActionHandler = (\n eventData,\n transform,\n x,\n y,\n) => {\n return isAltAction(eventData, transform.target)\n ? skewHandlerY(eventData, transform, x, y)\n : scalingX(eventData, transform, x, y);\n};\n\n/**\n * Composed action handler to either scale Y or skew X\n * Needs to be wrapped with `wrapWithFixedAnchor` to be effective\n * @param {Event} eventData javascript event that is doing the transform\n * @param {Object} transform javascript object containing a series of information around the current transform\n * @param {number} x current mouse x position, canvas normalized\n * @param {number} y current mouse y position, canvas normalized\n * @return {Boolean} true if some change happened\n */\nexport const scalingYOrSkewingX: TransformActionHandler = (\n eventData,\n transform,\n x,\n y,\n) => {\n return isAltAction(eventData, transform.target)\n ? skewHandlerX(eventData, transform, x, y)\n : scalingY(eventData, transform, x, y);\n};\n","import { RESIZING, ROTATE } from '../constants';\nimport { changeWidth } from './changeWidth';\nimport { Control } from './Control';\nimport { rotationStyleHandler, rotationWithSnapping } from './rotate';\nimport { scaleCursorStyleHandler, scalingEqually } from './scale';\nimport {\n scaleOrSkewActionName,\n scaleSkewCursorStyleHandler,\n scalingXOrSkewingY,\n scalingYOrSkewingX,\n} from './scaleSkew';\n\n// use this function if you want to generate new controls for every instance\nexport const createObjectDefaultControls = () => ({\n ml: new Control({\n x: -0.5,\n y: 0,\n cursorStyleHandler: scaleSkewCursorStyleHandler,\n actionHandler: scalingXOrSkewingY,\n getActionName: scaleOrSkewActionName,\n }),\n\n mr: new Control({\n x: 0.5,\n y: 0,\n cursorStyleHandler: scaleSkewCursorStyleHandler,\n actionHandler: scalingXOrSkewingY,\n getActionName: scaleOrSkewActionName,\n }),\n\n mb: new Control({\n x: 0,\n y: 0.5,\n cursorStyleHandler: scaleSkewCursorStyleHandler,\n actionHandler: scalingYOrSkewingX,\n getActionName: scaleOrSkewActionName,\n }),\n\n mt: new Control({\n x: 0,\n y: -0.5,\n cursorStyleHandler: scaleSkewCursorStyleHandler,\n actionHandler: scalingYOrSkewingX,\n getActionName: scaleOrSkewActionName,\n }),\n\n tl: new Control({\n x: -0.5,\n y: -0.5,\n cursorStyleHandler: scaleCursorStyleHandler,\n actionHandler: scalingEqually,\n }),\n\n tr: new Control({\n x: 0.5,\n y: -0.5,\n cursorStyleHandler: scaleCursorStyleHandler,\n actionHandler: scalingEqually,\n }),\n\n bl: new Control({\n x: -0.5,\n y: 0.5,\n cursorStyleHandler: scaleCursorStyleHandler,\n actionHandler: scalingEqually,\n }),\n\n br: new Control({\n x: 0.5,\n y: 0.5,\n cursorStyleHandler: scaleCursorStyleHandler,\n actionHandler: scalingEqually,\n }),\n\n mtr: new Control({\n x: 0,\n y: -0.5,\n actionHandler: rotationWithSnapping,\n cursorStyleHandler: rotationStyleHandler,\n offsetY: -40,\n withConnection: true,\n actionName: ROTATE,\n }),\n});\n\nexport const createResizeControls = () => ({\n mr: new Control({\n x: 0.5,\n y: 0,\n actionHandler: changeWidth,\n cursorStyleHandler: scaleSkewCursorStyleHandler,\n actionName: RESIZING,\n }),\n ml: new Control({\n x: -0.5,\n y: 0,\n actionHandler: changeWidth,\n cursorStyleHandler: scaleSkewCursorStyleHandler,\n actionName: RESIZING,\n }),\n});\n\nexport const createTextboxDefaultControls = () => ({\n ...createObjectDefaultControls(),\n ...createResizeControls(),\n});\n","import { Point, ZERO } from '../../Point';\nimport type { TCornerPoint, TDegree } from '../../typedefs';\nimport { FabricObject } from './Object';\nimport { degreesToRadians } from '../../util/misc/radiansDegreesConversion';\nimport type { TQrDecomposeOut } from '../../util/misc/matrix';\nimport {\n calcDimensionsMatrix,\n createRotateMatrix,\n createTranslateMatrix,\n multiplyTransformMatrices,\n qrDecompose,\n} from '../../util/misc/matrix';\nimport type { Control } from '../../controls/Control';\nimport { sizeAfterTransform } from '../../util/misc/objectTransforms';\nimport type { ObjectEvents, TPointerEvent } from '../../EventTypeDefs';\nimport type { Canvas } from '../../canvas/Canvas';\nimport type { ControlRenderingStyleOverride } from '../../controls/controlRendering';\nimport type { FabricObjectProps } from './types/FabricObjectProps';\nimport type { TFabricObjectProps, SerializedObjectProps } from './types';\nimport { createObjectDefaultControls } from '../../controls/commonControls';\nimport { interactiveObjectDefaultValues } from './defaultValues';\nimport { SCALE } from '../../constants';\n\nexport type TOCoord = Point & {\n corner: TCornerPoint;\n touchCorner: TCornerPoint;\n};\n\nexport type TControlSet = Record;\n\nexport type TBorderRenderingStyleOverride = Partial<\n Pick\n>;\n\nexport type TStyleOverride = ControlRenderingStyleOverride &\n TBorderRenderingStyleOverride &\n Partial<\n Pick & {\n forActiveSelection: boolean;\n }\n >;\n\nexport class InteractiveFabricObject<\n Props extends TFabricObjectProps = Partial,\n SProps extends SerializedObjectProps = SerializedObjectProps,\n EventSpec extends ObjectEvents = ObjectEvents,\n >\n extends FabricObject\n implements FabricObjectProps\n{\n declare noScaleCache: boolean;\n\n declare snapAngle?: TDegree;\n declare snapThreshold?: TDegree;\n\n declare lockMovementX: boolean;\n declare lockMovementY: boolean;\n declare lockRotation: boolean;\n declare lockScalingX: boolean;\n declare lockScalingY: boolean;\n declare lockSkewingX: boolean;\n declare lockSkewingY: boolean;\n declare lockScalingFlip: boolean;\n\n declare cornerSize: number;\n declare touchCornerSize: number;\n declare transparentCorners: boolean;\n declare cornerColor: string;\n declare cornerStrokeColor: string;\n declare cornerStyle: 'rect' | 'circle';\n declare cornerDashArray: number[] | null;\n declare hasControls: boolean;\n\n declare borderColor: string;\n declare borderDashArray: number[] | null;\n declare borderOpacityWhenMoving: number;\n declare borderScaleFactor: number;\n declare hasBorders: boolean;\n declare selectionBackgroundColor: string;\n\n declare selectable: boolean;\n declare evented: boolean;\n declare perPixelTargetFind: boolean;\n declare activeOn: 'down' | 'up';\n\n declare hoverCursor: CSSStyleDeclaration['cursor'] | null;\n declare moveCursor: CSSStyleDeclaration['cursor'] | null;\n\n /**\n * The object's controls' position in viewport coordinates\n * Calculated by {@link Control#positionHandler} and {@link Control#calcCornerCoords}, depending on {@link padding}.\n * `corner/touchCorner` describe the 4 points forming the interactive area of the corner.\n * Used to draw and locate controls.\n */\n declare oCoords: Record;\n\n /**\n * keeps the value of the last hovered corner during mouse move.\n * 0 is no corner, or 'mt', 'ml', 'mtr' etc..\n * It should be private, but there is no harm in using it as\n * a read-only property.\n * this isn't cleaned automatically. Non selected objects may have wrong values\n * @type [string]\n */\n declare __corner?: string;\n\n /**\n * a map of control visibility for this object.\n * this was left when controls were introduced to not break the api too much\n * this takes priority over the generic control visibility\n */\n declare _controlsVisibility: Record;\n\n /**\n * holds the controls for the object.\n * controls are added by default_controls.js\n */\n declare controls: TControlSet;\n\n /**\n * internal boolean to signal the code that the object is\n * part of the move action.\n */\n declare isMoving?: boolean;\n\n /**\n * A boolean used from the gesture module to keep tracking of a scaling\n * action when there is no scaling transform in place.\n * This is an edge case and is used twice in all codebase.\n * Probably added to keep track of some performance issues\n * @TODO use git blame to investigate why it was added\n * DON'T USE IT. WE WILL TRY TO REMOVE IT\n */\n declare _scaling?: boolean;\n\n declare canvas?: Canvas;\n\n static ownDefaults = interactiveObjectDefaultValues;\n\n static getDefaults(): Record {\n return {\n ...super.getDefaults(),\n ...InteractiveFabricObject.ownDefaults,\n };\n }\n\n /**\n * Constructor\n * @param {Object} [options] Options object\n */\n constructor(options?: Props) {\n super();\n Object.assign(\n this,\n (this.constructor as typeof InteractiveFabricObject).createControls(),\n InteractiveFabricObject.ownDefaults,\n );\n this.setOptions(options);\n }\n\n /**\n * Creates the default control object.\n * If you prefer to have on instance of controls shared among all objects\n * make this function return an empty object and add controls to the ownDefaults\n * @param {Object} [options] Options object\n */\n static createControls(): { controls: Record } {\n return { controls: createObjectDefaultControls() };\n }\n\n /**\n * Update width and height of the canvas for cache\n * returns true or false if canvas needed resize.\n * @private\n * @return {Boolean} true if the canvas has been resized\n */\n _updateCacheCanvas() {\n const targetCanvas = this.canvas;\n if (this.noScaleCache && targetCanvas && targetCanvas._currentTransform) {\n const transform = targetCanvas._currentTransform,\n target = transform.target,\n action = transform.action;\n if (\n this === (target as unknown as this) &&\n action &&\n action.startsWith(SCALE)\n ) {\n return false;\n }\n }\n return super._updateCacheCanvas();\n }\n\n getActiveControl() {\n const key = this.__corner;\n return key\n ? {\n key,\n control: this.controls[key],\n coord: this.oCoords[key],\n }\n : undefined;\n }\n\n /**\n * Determines which corner is under the mouse cursor, represented by `pointer`.\n * This function returns a corner only if the object is the active one.\n * This is done to avoid selecting corner of non active object and activating transformations\n * rather than drag action. The default behavior of fabricJS is that if you want to transform\n * an object, first you select it to show the control set\n * @private\n * @param {Object} pointer The pointer indicating the mouse position\n * @param {boolean} forTouch indicates if we are looking for interaction area with a touch action\n * @return {String|Boolean} corner code (tl, tr, bl, br, etc.), or 0 if nothing is found.\n */\n findControl(\n pointer: Point,\n forTouch = false,\n ): { key: string; control: Control; coord: TOCoord } | undefined {\n if (!this.hasControls || !this.canvas) {\n return undefined;\n }\n\n this.__corner = undefined;\n const cornerEntries = Object.entries(this.oCoords);\n for (let i = cornerEntries.length - 1; i >= 0; i--) {\n const [key, corner] = cornerEntries[i];\n const control = this.controls[key];\n\n if (\n control.shouldActivate(\n key,\n this,\n pointer,\n forTouch ? corner.touchCorner : corner.corner,\n )\n ) {\n // this.canvas.contextTop.fillRect(pointer.x - 1, pointer.y - 1, 2, 2);\n this.__corner = key;\n\n return { key, control, coord: this.oCoords[key] };\n }\n }\n\n return undefined;\n }\n\n /**\n * Calculates the coordinates of the center of each control plus the corners of the control itself\n * This basically just delegates to each control positionHandler\n * WARNING: changing what is passed to positionHandler is a breaking change, since position handler\n * is a public api and should be done just if extremely necessary\n * @return {Record}\n */\n calcOCoords(): Record {\n const vpt = this.getViewportTransform(),\n center = this.getCenterPoint(),\n tMatrix = createTranslateMatrix(center.x, center.y),\n rMatrix = createRotateMatrix({\n angle: this.getTotalAngle() - (!!this.group && this.flipX ? 180 : 0),\n }),\n positionMatrix = multiplyTransformMatrices(tMatrix, rMatrix),\n startMatrix = multiplyTransformMatrices(vpt, positionMatrix),\n finalMatrix = multiplyTransformMatrices(startMatrix, [\n 1 / vpt[0],\n 0,\n 0,\n 1 / vpt[3],\n 0,\n 0,\n ]),\n transformOptions = this.group\n ? qrDecompose(this.calcTransformMatrix())\n : undefined;\n // decomposing could bring negative scaling and `_calculateCurrentDimensions` can't take it\n if (transformOptions) {\n transformOptions.scaleX = Math.abs(transformOptions.scaleX);\n transformOptions.scaleY = Math.abs(transformOptions.scaleY);\n }\n const dim = this._calculateCurrentDimensions(transformOptions),\n coords: Record = {};\n\n this.forEachControl((control, key) => {\n const position = control.positionHandler(dim, finalMatrix, this, control);\n // coords[key] are sometimes used as points. Those are points to which we add\n // the property corner and touchCorner from `_calcCornerCoords`.\n // don't remove this assign for an object spread.\n coords[key] = Object.assign(\n position,\n this._calcCornerCoords(control, position),\n );\n });\n\n // debug code\n /*\n const canvas = this.canvas;\n setTimeout(function () {\n if (!canvas) return;\n canvas.contextTop.clearRect(0, 0, 700, 700);\n canvas.contextTop.fillStyle = 'green';\n Object.keys(coords).forEach(function(key) {\n const control = coords[key];\n canvas.contextTop.fillRect(control.x, control.y, 3, 3);\n });\n } 50);\n */\n return coords;\n }\n\n /**\n * Sets the coordinates that determine the interaction area of each control\n * note: if we would switch to ROUND corner area, all of this would disappear.\n * everything would resolve to a single point and a pythagorean theorem for the distance\n * @todo evaluate simplification of code switching to circle interaction area at runtime\n * @private\n */\n private _calcCornerCoords(control: Control, position: Point) {\n const angle = this.getTotalAngle();\n const corner = control.calcCornerCoords(\n angle,\n this.cornerSize,\n position.x,\n position.y,\n false,\n this,\n );\n const touchCorner = control.calcCornerCoords(\n angle,\n this.touchCornerSize,\n position.x,\n position.y,\n true,\n this,\n );\n return { corner, touchCorner };\n }\n\n /**\n * @override set controls' coordinates as well\n * See {@link https://github.com/fabricjs/fabric.js/wiki/When-to-call-setCoords} and {@link https://fabric5.fabricjs.com/fabric-gotchas}\n * @return {void}\n */\n setCoords(): void {\n super.setCoords();\n this.canvas && (this.oCoords = this.calcOCoords());\n }\n\n /**\n * Calls a function for each control. The function gets called,\n * with the control, the control's key and the object that is calling the iterator\n * @param {Function} fn function to iterate over the controls over\n */\n forEachControl(\n fn: (\n control: Control,\n key: string,\n fabricObject: InteractiveFabricObject,\n ) => any,\n ) {\n for (const i in this.controls) {\n fn(this.controls[i], i, this);\n }\n }\n\n /**\n * Draws a colored layer behind the object, inside its selection borders.\n * Requires public options: padding, selectionBackgroundColor\n * this function is called when the context is transformed\n * has checks to be skipped when the object is on a staticCanvas\n * @todo evaluate if make this disappear in favor of a pre-render hook for objects\n * this was added by Andrea Bogazzi to make possible some feature for work reasons\n * it seemed a good option, now is an edge case\n * @param {CanvasRenderingContext2D} ctx Context to draw on\n */\n drawSelectionBackground(ctx: CanvasRenderingContext2D): void {\n if (\n !this.selectionBackgroundColor ||\n (this.canvas && (this.canvas._activeObject as unknown as this) !== this)\n ) {\n return;\n }\n ctx.save();\n const center = this.getRelativeCenterPoint(),\n wh = this._calculateCurrentDimensions(),\n vpt = this.getViewportTransform();\n ctx.translate(center.x, center.y);\n ctx.scale(1 / vpt[0], 1 / vpt[3]);\n ctx.rotate(degreesToRadians(this.angle));\n ctx.fillStyle = this.selectionBackgroundColor;\n ctx.fillRect(-wh.x / 2, -wh.y / 2, wh.x, wh.y);\n ctx.restore();\n }\n\n /**\n * @public override this function in order to customize the drawing of the control box, e.g. rounded corners, different border style.\n * @param {CanvasRenderingContext2D} ctx ctx is rotated and translated so that (0,0) is at object's center\n * @param {Point} size the control box size used\n */\n strokeBorders(ctx: CanvasRenderingContext2D, size: Point): void {\n ctx.strokeRect(-size.x / 2, -size.y / 2, size.x, size.y);\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to draw on\n * @param {Point} size\n * @param {TStyleOverride} styleOverride object to override the object style\n */\n _drawBorders(\n ctx: CanvasRenderingContext2D,\n size: Point,\n styleOverride: TStyleOverride = {},\n ): void {\n const options = {\n hasControls: this.hasControls,\n borderColor: this.borderColor,\n borderDashArray: this.borderDashArray,\n ...styleOverride,\n };\n ctx.save();\n ctx.strokeStyle = options.borderColor;\n this._setLineDash(ctx, options.borderDashArray);\n this.strokeBorders(ctx, size);\n options.hasControls && this.drawControlsConnectingLines(ctx, size);\n ctx.restore();\n }\n\n /**\n * Renders controls and borders for the object\n * the context here is not transformed\n * @todo move to interactivity\n * @param {CanvasRenderingContext2D} ctx Context to render on\n * @param {TStyleOverride} [styleOverride] properties to override the object style\n */\n _renderControls(\n ctx: CanvasRenderingContext2D,\n styleOverride: TStyleOverride = {},\n ) {\n const { hasBorders, hasControls } = this;\n const styleOptions = {\n hasBorders,\n hasControls,\n ...styleOverride,\n };\n const vpt = this.getViewportTransform(),\n shouldDrawBorders = styleOptions.hasBorders,\n shouldDrawControls = styleOptions.hasControls;\n const matrix = multiplyTransformMatrices(vpt, this.calcTransformMatrix());\n const options = qrDecompose(matrix);\n ctx.save();\n ctx.translate(options.translateX, options.translateY);\n ctx.lineWidth = this.borderScaleFactor; // 1 * this.borderScaleFactor;\n // since interactive groups have been introduced, an object could be inside a group and needing controls\n // the following equality check `this.group === this.parent` covers:\n // object without a group ( undefined === undefined )\n // object inside a group\n // excludes object inside a group but multi selected since group and parent will differ in value\n if (this.group === this.parent) {\n ctx.globalAlpha = this.isMoving ? this.borderOpacityWhenMoving : 1;\n }\n if (this.flipX) {\n options.angle -= 180;\n }\n ctx.rotate(degreesToRadians(this.group ? options.angle : this.angle));\n shouldDrawBorders && this.drawBorders(ctx, options, styleOverride);\n shouldDrawControls && this.drawControls(ctx, styleOverride);\n ctx.restore();\n }\n\n /**\n * Draws borders of an object's bounding box.\n * Requires public properties: width, height\n * Requires public options: padding, borderColor\n * @param {CanvasRenderingContext2D} ctx Context to draw on\n * @param {object} options object representing current object parameters\n * @param {TStyleOverride} [styleOverride] object to override the object style\n */\n drawBorders(\n ctx: CanvasRenderingContext2D,\n options: TQrDecomposeOut,\n styleOverride: TStyleOverride,\n ): void {\n let size;\n if ((styleOverride && styleOverride.forActiveSelection) || this.group) {\n const bbox = sizeAfterTransform(\n this.width,\n this.height,\n calcDimensionsMatrix(options),\n ),\n stroke = !this.isStrokeAccountedForInDimensions()\n ? (this.strokeUniform\n ? new Point().scalarAdd(this.canvas ? this.canvas.getZoom() : 1)\n : // this is extremely confusing. options comes from the upper function\n // and is the qrDecompose of a matrix that takes in account zoom too\n new Point(options.scaleX, options.scaleY)\n ).scalarMultiply(this.strokeWidth)\n : ZERO;\n size = bbox\n .add(stroke)\n .scalarAdd(this.borderScaleFactor)\n .scalarAdd(this.padding * 2);\n } else {\n size = this._calculateCurrentDimensions().scalarAdd(\n this.borderScaleFactor,\n );\n }\n this._drawBorders(ctx, size, styleOverride);\n }\n\n /**\n * Draws lines from a borders of an object's bounding box to controls that have `withConnection` property set.\n * Requires public properties: width, height\n * Requires public options: padding, borderColor\n * @param {CanvasRenderingContext2D} ctx Context to draw on\n * @param {Point} size object size x = width, y = height\n */\n drawControlsConnectingLines(\n ctx: CanvasRenderingContext2D,\n size: Point,\n ): void {\n let shouldStroke = false;\n\n ctx.beginPath();\n this.forEachControl((control, key) => {\n // in this moment, the ctx is centered on the object.\n // width and height of the above function are the size of the bbox.\n if (control.withConnection && control.getVisibility(this, key)) {\n // reset movement for each control\n shouldStroke = true;\n ctx.moveTo(control.x * size.x, control.y * size.y);\n ctx.lineTo(\n control.x * size.x + control.offsetX,\n control.y * size.y + control.offsetY,\n );\n }\n });\n shouldStroke && ctx.stroke();\n }\n\n /**\n * Draws corners of an object's bounding box.\n * Requires public properties: width, height\n * Requires public options: cornerSize, padding\n * Be aware that since fabric 6.0 this function does not call setCoords anymore.\n * setCoords needs to be called manually if the object of which we are rendering controls\n * is outside the standard selection and transform process.\n * @param {CanvasRenderingContext2D} ctx Context to draw on\n * @param {ControlRenderingStyleOverride} styleOverride object to override the object style\n */\n drawControls(\n ctx: CanvasRenderingContext2D,\n styleOverride: ControlRenderingStyleOverride = {},\n ) {\n ctx.save();\n const retinaScaling = this.getCanvasRetinaScaling();\n const { cornerStrokeColor, cornerDashArray, cornerColor } = this;\n const options = {\n cornerStrokeColor,\n cornerDashArray,\n cornerColor,\n ...styleOverride,\n };\n ctx.setTransform(retinaScaling, 0, 0, retinaScaling, 0, 0);\n ctx.strokeStyle = ctx.fillStyle = options.cornerColor;\n if (!this.transparentCorners) {\n ctx.strokeStyle = options.cornerStrokeColor;\n }\n this._setLineDash(ctx, options.cornerDashArray);\n this.forEachControl((control, key) => {\n if (control.getVisibility(this, key)) {\n const p = this.oCoords[key];\n control.render(ctx, p.x, p.y, options, this);\n }\n });\n ctx.restore();\n }\n\n /**\n * Returns true if the specified control is visible, false otherwise.\n * @param {string} controlKey The key of the control. Possible values are usually 'tl', 'tr', 'br', 'bl', 'ml', 'mt', 'mr', 'mb', 'mtr',\n * but since the control api allow for any control name, can be any string.\n * @returns {boolean} true if the specified control is visible, false otherwise\n */\n isControlVisible(controlKey: string): boolean {\n return (\n this.controls[controlKey] &&\n this.controls[controlKey].getVisibility(this, controlKey)\n );\n }\n\n /**\n * Sets the visibility of the specified control.\n * please do not use.\n * @param {String} controlKey The key of the control. Possible values are 'tl', 'tr', 'br', 'bl', 'ml', 'mt', 'mr', 'mb', 'mtr'.\n * but since the control api allow for any control name, can be any string.\n * @param {Boolean} visible true to set the specified control visible, false otherwise\n * @todo discuss this overlap of priority here with the team. Andrea Bogazzi for details\n */\n setControlVisible(controlKey: string, visible: boolean) {\n if (!this._controlsVisibility) {\n this._controlsVisibility = {};\n }\n this._controlsVisibility[controlKey] = visible;\n }\n\n /**\n * Sets the visibility state of object controls, this is just a bulk option for setControlVisible;\n * @param {Record} [options] with an optional key per control\n * example: {Boolean} [options.bl] true to enable the bottom-left control, false to disable it\n */\n setControlsVisibility(options: Record = {}) {\n Object.entries(options).forEach(([controlKey, visibility]) =>\n this.setControlVisible(controlKey, visibility),\n );\n }\n\n /**\n * Clears the canvas.contextTop in a specific area that corresponds to the object's bounding box\n * that is in the canvas.contextContainer.\n * This function is used to clear pieces of contextTop where we render ephemeral effects on top of the object.\n * Example: blinking cursor text selection, drag effects.\n * @todo discuss swapping restoreManually with a renderCallback, but think of async issues\n * @param {Boolean} [restoreManually] When true won't restore the context after clear, in order to draw something else.\n * @return {CanvasRenderingContext2D|undefined} canvas.contextTop that is either still transformed\n * with the object transformMatrix, or restored to neutral transform\n */\n clearContextTop(\n restoreManually?: boolean,\n ): CanvasRenderingContext2D | undefined {\n if (!this.canvas) {\n return;\n }\n const ctx = this.canvas.contextTop;\n if (!ctx) {\n return;\n }\n const v = this.canvas.viewportTransform;\n ctx.save();\n ctx.transform(v[0], v[1], v[2], v[3], v[4], v[5]);\n this.transform(ctx);\n // we add 4 pixel, to be sure to do not leave any pixel out\n const width = this.width + 4,\n height = this.height + 4;\n ctx.clearRect(-width / 2, -height / 2, width, height);\n\n restoreManually || ctx.restore();\n return ctx;\n }\n\n /**\n * This callback function is called every time _discardActiveObject or _setActiveObject\n * try to to deselect this object. If the function returns true, the process is cancelled\n * @param {Object} [_options] options sent from the upper functions\n * @param {TPointerEvent} [options.e] event if the process is generated by an event\n * @param {FabricObject} [options.object] next object we are setting as active, and reason why\n * this is being deselected\n */\n onDeselect(_options?: {\n e?: TPointerEvent;\n object?: InteractiveFabricObject;\n }): boolean {\n // implemented by sub-classes, as needed.\n return false;\n }\n\n /**\n * This callback function is called every time _discardActiveObject or _setActiveObject\n * try to to select this object. If the function returns true, the process is cancelled\n * @param {Object} [_options] options sent from the upper functions\n * @param {Event} [_options.e] event if the process is generated by an event\n */\n onSelect(_options?: { e?: TPointerEvent }): boolean {\n // implemented by sub-classes, as needed.\n return false;\n }\n\n /**\n * Override to customize Drag behavior\n * Fired from {@link Canvas#_onMouseMove}\n * @returns true in order for the window to start a drag session\n */\n shouldStartDragging(_e: TPointerEvent) {\n return false;\n }\n\n /**\n * Override to customize Drag behavior\\\n * Fired once a drag session has started\n * @returns true to handle the drag event\n */\n onDragStart(_e: DragEvent) {\n return false;\n }\n\n /**\n * Override to customize drag and drop behavior\n * @public\n * @param {DragEvent} _e\n * @returns {boolean} true if the object currently dragged can be dropped on the target\n */\n canDrop(_e: DragEvent): boolean {\n return false;\n }\n\n /**\n * Override to customize drag and drop behavior\n * render a specific effect when an object is the source of a drag event\n * example: render the selection status for the part of text that is being dragged from a text object\n * @public\n * @param {DragEvent} _e\n */\n renderDragSourceEffect(_e: DragEvent) {\n // for subclasses\n }\n\n /**\n * Override to customize drag and drop behavior\n * render a specific effect when an object is the target of a drag event\n * used to show that the underly object can receive a drop, or to show how the\n * object will change when dropping. example: show the cursor where the text is about to be dropped\n * @public\n * @param {DragEvent} _e\n */\n renderDropTargetEffect(_e: DragEvent) {\n // for subclasses\n }\n}\n","import type { Constructor } from '../typedefs';\n\n/***\n * https://www.typescriptlang.org/docs/handbook/mixins.html#alternative-pattern\n */\nexport function applyMixins(\n derivedCtor: T,\n constructors: S[],\n) {\n constructors.forEach((baseCtor) => {\n Object.getOwnPropertyNames(baseCtor.prototype).forEach((name) => {\n name !== 'constructor' &&\n Object.defineProperty(\n derivedCtor.prototype,\n name,\n Object.getOwnPropertyDescriptor(baseCtor.prototype, name) ||\n Object.create(null),\n );\n });\n });\n return derivedCtor as T & { prototype: InstanceType };\n}\n","import type { ObjectEvents } from '../../EventTypeDefs';\nimport { FabricObjectSVGExportMixin } from './FabricObjectSVGExportMixin';\nimport { InteractiveFabricObject } from './InteractiveObject';\nimport { applyMixins } from '../../util/applyMixins';\nimport type { FabricObjectProps } from './types/FabricObjectProps';\nimport type { TFabricObjectProps, SerializedObjectProps } from './types';\nimport { classRegistry } from '../../ClassRegistry';\n\n// TODO somehow we have to make a tree-shakeable import\n\n// eslint-disable-next-line @typescript-eslint/no-empty-object-type\nexport interface FabricObject<\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n Props extends TFabricObjectProps = Partial,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n SProps extends SerializedObjectProps = SerializedObjectProps,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n EventSpec extends ObjectEvents = ObjectEvents,\n> extends FabricObjectSVGExportMixin {}\n\n// eslint-disable-next-line @typescript-eslint/no-unsafe-declaration-merging\nexport class FabricObject<\n Props extends TFabricObjectProps = Partial,\n SProps extends SerializedObjectProps = SerializedObjectProps,\n EventSpec extends ObjectEvents = ObjectEvents,\n> extends InteractiveFabricObject {}\n\napplyMixins(FabricObject, [FabricObjectSVGExportMixin]);\n\nclassRegistry.setClass(FabricObject);\nclassRegistry.setClass(FabricObject, 'object');\n\nexport { cacheProperties } from './defaultValues';\n","/**\n * Returns true if context has transparent pixel\n * at specified location (taking tolerance into account)\n * @param {CanvasRenderingContext2D} ctx context\n * @param {Number} x x coordinate in canvasElementCoordinate, not fabric space. integer\n * @param {Number} y y coordinate in canvasElementCoordinate, not fabric space. integer\n * @param {Number} tolerance Tolerance pixels around the point, not alpha tolerance, integer\n * @return {boolean} true if transparent\n */\nexport const isTransparent = (\n ctx: CanvasRenderingContext2D,\n x: number,\n y: number,\n tolerance: number,\n): boolean => {\n tolerance = Math.round(tolerance);\n const size = tolerance * 2 + 1;\n const { data } = ctx.getImageData(x - tolerance, y - tolerance, size, size);\n\n // Split image data - for tolerance > 1, pixelDataSize = 4;\n for (let i = 3; i < data.length; i += 4) {\n const alphaChannel = data[i];\n if (alphaChannel > 0) {\n return false;\n }\n }\n return true;\n};\n","import type { XY } from '../../../Point';\nimport { Point } from '../../../Point';\nimport { degreesToRadians } from '../radiansDegreesConversion';\nimport { createVector } from '../vectors';\nimport type { TProjectStrokeOnPointsOptions, TProjection } from './types';\n\n/**\n * @see https://github.com/fabricjs/fabric.js/pull/8344\n * @todo consider removing skewing from points before calculating stroke projection,\n * see https://github.com/fabricjs/fabric.js/commit/494a10ee2f8c2278ae9a55b20bf50cf6ee25b064#commitcomment-94751537\n */\nexport abstract class StrokeProjectionsBase {\n declare options: TProjectStrokeOnPointsOptions;\n declare scale: Point;\n declare strokeUniformScalar: Point;\n declare strokeProjectionMagnitude: number;\n\n constructor(options: TProjectStrokeOnPointsOptions) {\n this.options = options;\n this.strokeProjectionMagnitude = this.options.strokeWidth / 2;\n this.scale = new Point(this.options.scaleX, this.options.scaleY);\n this.strokeUniformScalar = this.options.strokeUniform\n ? new Point(1 / this.options.scaleX, 1 / this.options.scaleY)\n : new Point(1, 1);\n }\n\n /**\n * When the stroke is uniform, scaling affects the arrangement of points. So we must take it into account.\n */\n protected createSideVector(from: XY, to: XY) {\n const v = createVector(from, to);\n return this.options.strokeUniform ? v.multiply(this.scale) : v;\n }\n\n protected abstract calcOrthogonalProjection(\n from: Point,\n to: Point,\n magnitude?: number,\n ): Point;\n\n protected projectOrthogonally(from: Point, to: Point, magnitude?: number) {\n return this.applySkew(\n from.add(this.calcOrthogonalProjection(from, to, magnitude)),\n );\n }\n\n protected isSkewed() {\n return this.options.skewX !== 0 || this.options.skewY !== 0;\n }\n\n protected applySkew(point: Point) {\n const p = new Point(point);\n // skewY must be applied before skewX as this distortion affects skewX calculation\n p.y += p.x * Math.tan(degreesToRadians(this.options.skewY));\n p.x += p.y * Math.tan(degreesToRadians(this.options.skewX));\n return p;\n }\n\n protected scaleUnitVector(unitVector: Point, scalar: number) {\n return unitVector.multiply(this.strokeUniformScalar).scalarMultiply(scalar);\n }\n\n protected abstract projectPoints(): Point[];\n\n public abstract project(): TProjection[];\n}\n","import type { XY } from '../../../Point';\nimport { Point } from '../../../Point';\nimport { halfPI, twoMathPi } from '../../../constants';\nimport type { TRadian } from '../../../typedefs';\nimport { degreesToRadians } from '../radiansDegreesConversion';\nimport {\n calcAngleBetweenVectors,\n calcVectorRotation,\n crossProduct,\n getOrthonormalVector,\n getUnitVector,\n isBetweenVectors,\n magnitude,\n rotateVector,\n} from '../vectors';\nimport { StrokeProjectionsBase } from './StrokeProjectionsBase';\nimport type { TProjection, TProjectStrokeOnPointsOptions } from './types';\n\nconst zeroVector = new Point();\n\n/**\n * class in charge of finding projections for each type of line join\n * @see {@link [Closed path projections at #8344](https://github.com/fabricjs/fabric.js/pull/8344#2-closed-path)}\n *\n * - MDN:\n * - https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/lineJoin\n * - https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/stroke-linejoin\n * - Spec: https://svgwg.org/svg2-draft/painting.html#StrokeLinejoinProperty\n * - Playground to understand how the line joins works: https://hypertolosana.github.io/efficient-webgl-stroking/index.html\n * - View the calculated projections for each of the control points: https://codesandbox.io/s/project-stroke-points-with-context-to-trace-b8jc4j?file=/src/index.js\n *\n */\nexport class StrokeLineJoinProjections extends StrokeProjectionsBase {\n /**\n * The point being projected (the angle ∠BAC)\n */\n declare A: Point;\n /**\n * The point before A\n */\n declare B: Point;\n /**\n * The point after A\n */\n declare C: Point;\n /**\n * The AB vector\n */\n AB: Point;\n /**\n * The AC vector\n */\n AC: Point;\n /**\n * The angle of A (∠BAC)\n */\n alpha: TRadian;\n /**\n * The bisector of A (∠BAC)\n */\n bisector: Point;\n\n static getOrthogonalRotationFactor(vector1: Point, vector2?: Point) {\n const angle = vector2\n ? calcAngleBetweenVectors(vector1, vector2)\n : calcVectorRotation(vector1);\n return Math.abs(angle) < halfPI ? -1 : 1;\n }\n\n constructor(A: XY, B: XY, C: XY, options: TProjectStrokeOnPointsOptions) {\n super(options);\n this.A = new Point(A);\n this.B = new Point(B);\n this.C = new Point(C);\n this.AB = this.createSideVector(this.A, this.B);\n this.AC = this.createSideVector(this.A, this.C);\n this.alpha = calcAngleBetweenVectors(this.AB, this.AC);\n this.bisector = getUnitVector(\n // if AC is also the zero vector nothing will be projected\n // in that case the next point will handle the projection\n rotateVector(this.AB.eq(zeroVector) ? this.AC : this.AB, this.alpha / 2),\n );\n }\n\n calcOrthogonalProjection(\n from: Point,\n to: Point,\n magnitude: number = this.strokeProjectionMagnitude,\n ) {\n const vector = this.createSideVector(from, to);\n const orthogonalProjection = getOrthonormalVector(vector);\n const correctSide = StrokeLineJoinProjections.getOrthogonalRotationFactor(\n orthogonalProjection,\n this.bisector,\n );\n return this.scaleUnitVector(orthogonalProjection, magnitude * correctSide);\n }\n\n /**\n * BEVEL\n * Calculation: the projection points are formed by the vector orthogonal to the vertex.\n *\n * @see https://github.com/fabricjs/fabric.js/pull/8344#2-2-bevel\n */\n projectBevel() {\n const projections: Point[] = [];\n // if `alpha` equals 0 or 2*PI, the projections are the same for `B` and `C`\n (this.alpha % twoMathPi === 0 ? [this.B] : [this.B, this.C]).forEach(\n (to) => {\n projections.push(this.projectOrthogonally(this.A, to));\n projections.push(\n this.projectOrthogonally(this.A, to, -this.strokeProjectionMagnitude),\n );\n },\n );\n return projections;\n }\n\n /**\n * MITER\n * Calculation: the corner is formed by extending the outer edges of the stroke\n * at the tangents of the path segments until they intersect.\n *\n * @see https://github.com/fabricjs/fabric.js/pull/8344#2-1-miter\n */\n projectMiter() {\n const projections: Point[] = [],\n alpha = Math.abs(this.alpha),\n hypotUnitScalar = 1 / Math.sin(alpha / 2),\n miterVector = this.scaleUnitVector(\n this.bisector,\n -this.strokeProjectionMagnitude * hypotUnitScalar,\n );\n\n // When two line segments meet at a sharp angle, it is possible for the join to extend,\n // far beyond the thickness of the line stroking the path. The stroke-miterlimit imposes\n // a limit on the extent of the line join.\n // MDN: https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/stroke-miterlimit\n // When the stroke is uniform, scaling changes the arrangement of points, this changes the miter-limit\n const strokeMiterLimit = this.options.strokeUniform\n ? magnitude(\n this.scaleUnitVector(this.bisector, this.options.strokeMiterLimit),\n )\n : this.options.strokeMiterLimit;\n\n if (\n magnitude(miterVector) / this.strokeProjectionMagnitude <=\n strokeMiterLimit\n ) {\n projections.push(this.applySkew(this.A.add(miterVector)));\n }\n /* when the miter-limit is reached, the stroke line join becomes of type bevel.\n We always need two orthogonal projections which are basically bevel-type projections,\n so regardless of whether the miter-limit was reached or not, we include these projections.\n */\n projections.push(...this.projectBevel());\n\n return projections;\n }\n\n /**\n * ROUND (without skew)\n * Calculation: the projections are the two vectors parallel to X and Y axes\n *\n * @see https://github.com/fabricjs/fabric.js/pull/8344#2-3-1-round-without-skew\n */\n private projectRoundNoSkew(startCircle: Point, endCircle: Point) {\n const projections: Point[] = [],\n // correctSide is used to only consider projecting for the outer side\n correctSide = new Point(\n StrokeLineJoinProjections.getOrthogonalRotationFactor(this.bisector),\n StrokeLineJoinProjections.getOrthogonalRotationFactor(\n new Point(this.bisector.y, this.bisector.x),\n ),\n ),\n radiusOnAxisX = new Point(1, 0)\n .scalarMultiply(this.strokeProjectionMagnitude)\n .multiply(this.strokeUniformScalar)\n .multiply(correctSide),\n radiusOnAxisY = new Point(0, 1)\n .scalarMultiply(this.strokeProjectionMagnitude)\n .multiply(this.strokeUniformScalar)\n .multiply(correctSide);\n\n [radiusOnAxisX, radiusOnAxisY].forEach((vector) => {\n if (isBetweenVectors(vector, startCircle, endCircle)) {\n projections.push(this.A.add(vector));\n }\n });\n return projections;\n }\n\n /**\n * ROUND (with skew)\n * Calculation: the projections are the points furthest from the vertex in\n * the direction of the X and Y axes after distortion.\n *\n * @see https://github.com/fabricjs/fabric.js/pull/8344#2-3-2-round-skew\n */\n private projectRoundWithSkew(startCircle: Point, endCircle: Point) {\n const projections: Point[] = [];\n\n const { skewX, skewY, scaleX, scaleY, strokeUniform } = this.options,\n shearing = new Point(\n Math.tan(degreesToRadians(skewX)),\n Math.tan(degreesToRadians(skewY)),\n );\n // The points furthest from the vertex in the direction of the X and Y axes after distortion\n const circleRadius = this.strokeProjectionMagnitude,\n newY = strokeUniform\n ? circleRadius /\n scaleY /\n Math.sqrt(1 / scaleY ** 2 + (1 / scaleX ** 2) * shearing.y ** 2)\n : circleRadius / Math.sqrt(1 + shearing.y ** 2),\n furthestY = new Point(\n // Safe guard due to floating point precision. In some situations the square root\n // was returning NaN because of a negative number close to zero.\n Math.sqrt(Math.max(circleRadius ** 2 - newY ** 2, 0)),\n newY,\n ),\n newX = strokeUniform\n ? circleRadius /\n Math.sqrt(\n 1 +\n (shearing.x ** 2 * (1 / scaleY) ** 2) /\n (1 / scaleX + (1 / scaleX) * shearing.x * shearing.y) ** 2,\n )\n : circleRadius /\n Math.sqrt(1 + shearing.x ** 2 / (1 + shearing.x * shearing.y) ** 2),\n furthestX = new Point(\n newX,\n Math.sqrt(Math.max(circleRadius ** 2 - newX ** 2, 0)),\n );\n\n [\n furthestX,\n furthestX.scalarMultiply(-1),\n furthestY,\n furthestY.scalarMultiply(-1),\n ]\n // We need to skew the vector here as this information is used to check if\n // it is between the start and end of the circle segment\n .map((vector) =>\n this.applySkew(\n strokeUniform ? vector.multiply(this.strokeUniformScalar) : vector,\n ),\n )\n .forEach((vector) => {\n if (isBetweenVectors(vector, startCircle, endCircle)) {\n projections.push(this.applySkew(this.A).add(vector));\n }\n });\n\n return projections;\n }\n\n projectRound() {\n const projections: Point[] = [];\n /* Include the start and end points of the circle segment, so that only\n the projections contained within it are included */\n // add the orthogonal projections (start and end points of circle segment)\n projections.push(...this.projectBevel());\n // let's determines which one of the orthogonal projection is the beginning and end of the circle segment.\n // when `alpha` equals 0 or 2*PI, we have a straight line, so the way to find the start/end is different.\n const isStraightLine = this.alpha % twoMathPi === 0,\n // change the origin of the projections to point A\n // so that the cross product calculation is correct\n newOrigin = this.applySkew(this.A),\n proj0 = projections[isStraightLine ? 0 : 2].subtract(newOrigin),\n proj1 = projections[isStraightLine ? 1 : 0].subtract(newOrigin),\n // when `isStraightLine` === true, we compare with the vector opposite AB, otherwise we compare with the bisector.\n comparisonVector = isStraightLine\n ? this.applySkew(this.AB.scalarMultiply(-1))\n : this.applySkew(\n this.bisector.multiply(this.strokeUniformScalar).scalarMultiply(-1),\n ),\n // the beginning of the circle segment is always to the right of the comparison vector (cross product > 0)\n isProj0Start = crossProduct(proj0, comparisonVector) > 0,\n startCircle = isProj0Start ? proj0 : proj1,\n endCircle = isProj0Start ? proj1 : proj0;\n if (!this.isSkewed()) {\n projections.push(...this.projectRoundNoSkew(startCircle, endCircle));\n } else {\n projections.push(...this.projectRoundWithSkew(startCircle, endCircle));\n }\n return projections;\n }\n\n /**\n * Project stroke width on points returning projections for each point as follows:\n * - `miter`: 1 point corresponding to the outer boundary. If the miter limit is exceeded, it will be 2 points (becomes bevel)\n * - `bevel`: 2 points corresponding to the bevel possible boundaries, orthogonal to the stroke.\n * - `round`: same as `bevel` when it has no skew, with skew are 4 points.\n */\n protected projectPoints() {\n switch (this.options.strokeLineJoin) {\n case 'miter':\n return this.projectMiter();\n case 'round':\n return this.projectRound();\n default:\n return this.projectBevel();\n }\n }\n\n public project(): TProjection[] {\n return this.projectPoints().map((point) => ({\n originPoint: this.A,\n projectedPoint: point,\n angle: this.alpha,\n bisector: this.bisector,\n }));\n }\n}\n","import type { XY } from '../../../Point';\nimport { Point } from '../../../Point';\nimport { getOrthonormalVector, getUnitVector } from '../vectors';\nimport { StrokeLineJoinProjections } from './StrokeLineJoinProjections';\nimport { StrokeProjectionsBase } from './StrokeProjectionsBase';\nimport type { TProjection, TProjectStrokeOnPointsOptions } from './types';\n\n/**\n * class in charge of finding projections for each type of line cap for start/end of an open path\n * @see {@link [Open path projections at #8344](https://github.com/fabricjs/fabric.js/pull/8344#1-open-path)}\n *\n * Reference:\n * - MDN:\n * - https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/lineCap\n * - https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/stroke-linecap\n * - Spec: https://html.spec.whatwg.org/multipage/canvas.html#dom-context-2d-linecap-dev\n * - Playground to understand how the line joins works: https://hypertolosana.github.io/efficient-webgl-stroking/index.html\n * - View the calculated projections for each of the control points: https://codesandbox.io/s/project-stroke-points-with-context-to-trace-b8jc4j?file=/src/index.js\n */\nexport class StrokeLineCapProjections extends StrokeProjectionsBase {\n /**\n * edge point\n */\n declare A: Point;\n /**\n * point next to edge point\n */\n declare T: Point;\n\n constructor(A: XY, T: XY, options: TProjectStrokeOnPointsOptions) {\n super(options);\n this.A = new Point(A);\n this.T = new Point(T);\n }\n\n calcOrthogonalProjection(\n from: Point,\n to: Point,\n magnitude: number = this.strokeProjectionMagnitude,\n ) {\n const vector = this.createSideVector(from, to);\n return this.scaleUnitVector(getOrthonormalVector(vector), magnitude);\n }\n\n /**\n * OPEN PATH START/END - Line cap: Butt\n * Calculation: to find the projections, just find the points orthogonal to the stroke\n *\n * @see https://github.com/fabricjs/fabric.js/pull/8344#1-1-butt\n */\n projectButt() {\n return [\n this.projectOrthogonally(this.A, this.T, this.strokeProjectionMagnitude),\n this.projectOrthogonally(this.A, this.T, -this.strokeProjectionMagnitude),\n ];\n }\n\n /**\n * OPEN PATH START/END - Line cap: Round\n * Calculation: same as stroke line join `round`\n *\n * @see https://github.com/fabricjs/fabric.js/pull/8344#1-2-round\n */\n projectRound() {\n const projections: Point[] = [];\n\n if (!this.isSkewed() && this.A.eq(this.T)) {\n /* 1 point case without `skew`\n When `strokeUniform` is true, scaling has no effect.\n So we divide by scale, to remove its effect.\n */\n const projection = new Point(1, 1)\n .scalarMultiply(this.strokeProjectionMagnitude)\n .multiply(this.strokeUniformScalar);\n projections.push(\n this.applySkew(this.A.add(projection)),\n this.applySkew(this.A.subtract(projection)),\n );\n } else {\n projections.push(\n ...new StrokeLineJoinProjections(\n this.A,\n this.T,\n this.T,\n this.options,\n ).projectRound(),\n );\n }\n\n return projections;\n }\n\n /**\n * OPEN PATH START/END - Line cap: Square\n * Calculation: project a rectangle of points on the stroke in the opposite direction of the vector `AT`\n *\n * @see https://github.com/fabricjs/fabric.js/pull/8344#1-3-square\n */\n projectSquare() {\n const projections: Point[] = [];\n\n if (this.A.eq(this.T)) {\n /* 1 point case without `skew`\n When `strokeUniform` is true, scaling has no effect.\n So we divide by scale, to remove its effect.\n */\n const projection = new Point(1, 1)\n .scalarMultiply(this.strokeProjectionMagnitude)\n .multiply(this.strokeUniformScalar);\n projections.push(this.A.add(projection), this.A.subtract(projection));\n } else {\n const orthogonalProjection = this.calcOrthogonalProjection(\n this.A,\n this.T,\n this.strokeProjectionMagnitude,\n );\n const strokePointingOut = this.scaleUnitVector(\n getUnitVector(this.createSideVector(this.A, this.T)),\n -this.strokeProjectionMagnitude,\n );\n const projectedA = this.A.add(strokePointingOut);\n projections.push(\n projectedA.add(orthogonalProjection),\n projectedA.subtract(orthogonalProjection),\n );\n }\n\n return projections.map((p) => this.applySkew(p));\n }\n\n protected projectPoints() {\n switch (this.options.strokeLineCap) {\n case 'round':\n return this.projectRound();\n case 'square':\n return this.projectSquare();\n default:\n return this.projectButt();\n }\n }\n\n public project(): TProjection[] {\n return this.projectPoints().map((point) => ({\n originPoint: this.A,\n projectedPoint: point,\n }));\n }\n}\n","import { Point, type XY } from '../../../Point';\nimport { findIndexRight } from '../../internals/findRight';\nimport { StrokeLineCapProjections } from './StrokeLineCapProjections';\nimport { StrokeLineJoinProjections } from './StrokeLineJoinProjections';\nimport type { TProjection, TProjectStrokeOnPointsOptions } from './types';\n\nexport type * from './types';\n\n/**\n *\n * Used to calculate object's bounding box\n *\n * @see https://github.com/fabricjs/fabric.js/pull/8344\n *\n */\nexport const projectStrokeOnPoints = (\n points: XY[],\n options: TProjectStrokeOnPointsOptions,\n openPath = false,\n): TProjection[] => {\n const projections: TProjection[] = [];\n\n if (points.length === 0) {\n return projections;\n }\n\n // first we remove duplicate neighboring points\n const reduced = points.reduce(\n (reduced, point) => {\n if (!reduced[reduced.length - 1].eq(point)) {\n reduced.push(new Point(point));\n }\n return reduced;\n },\n [new Point(points[0])],\n );\n\n if (reduced.length === 1) {\n openPath = true;\n } else if (!openPath) {\n // remove points from end in case they equal the first point\n // in order to correctly project the first point\n const start = reduced[0];\n const index = findIndexRight(reduced, (point) => !point.eq(start));\n reduced.splice(index + 1);\n }\n\n reduced.forEach((A, index, points) => {\n let B: XY, C: XY;\n if (index === 0) {\n C = points[1];\n B = openPath ? A : points[points.length - 1];\n } else if (index === points.length - 1) {\n B = points[index - 1];\n C = openPath ? A : points[0];\n } else {\n B = points[index - 1];\n C = points[index + 1];\n }\n\n if (openPath && points.length === 1) {\n projections.push(\n ...new StrokeLineCapProjections(A, A, options).project(),\n );\n } else if (openPath && (index === 0 || index === points.length - 1)) {\n projections.push(\n ...new StrokeLineCapProjections(\n A,\n index === 0 ? C : B,\n options,\n ).project(),\n );\n } else {\n projections.push(\n ...new StrokeLineJoinProjections(A, B, C, options).project(),\n );\n }\n });\n\n return projections;\n};\n","export const findIndexRight = (\n array: T[],\n predicate: (value: T, index: number, array: T[]) => boolean,\n) => {\n for (let index = array.length - 1; index >= 0; index--) {\n if (predicate(array[index], index, array)) {\n return index;\n }\n }\n return -1;\n};\n","import type { TextStyle } from '../../shapes/Text/StyledText';\n\nexport const cloneStyles = (style: TextStyle): TextStyle => {\n const newObj: TextStyle = {};\n Object.keys(style).forEach((key) => {\n newObj[key] = {};\n Object.keys(style[key]).forEach((keyInner) => {\n newObj[key][keyInner] = { ...style[key][keyInner] };\n });\n });\n return newObj;\n};\n","import { getFabricWindow } from '../env';\n\n/**\n * Capitalizes a string\n * @param {String} string String to capitalize\n * @param {Boolean} [firstLetterOnly] If true only first letter is capitalized\n * and other letters stay untouched, if false first letter is capitalized\n * and other letters are converted to lowercase.\n * @return {String} Capitalized version of a string\n */\nexport const capitalize = (string: string, firstLetterOnly = false): string =>\n `${string.charAt(0).toUpperCase()}${\n firstLetterOnly ? string.slice(1) : string.slice(1).toLowerCase()\n }`;\n\n/**\n * Escapes XML in a string\n * @param {String} string String to escape\n * @return {String} Escaped version of a string\n */\nexport const escapeXml = (string: string): string =>\n string\n .replace(/&/g, '&')\n .replace(/\"/g, '"')\n .replace(/'/g, ''')\n .replace(//g, '>');\n\nlet segmenter: Intl.Segmenter | false;\n\nconst getSegmenter = () => {\n if (!segmenter) {\n segmenter =\n 'Intl' in getFabricWindow() &&\n 'Segmenter' in Intl &&\n new Intl.Segmenter(undefined, {\n granularity: 'grapheme',\n });\n }\n return segmenter;\n};\n\n/**\n * Divide a string in the user perceived single units\n * @param {String} textstring String to escape\n * @return {Array} array containing the graphemes\n */\nexport const graphemeSplit = (textstring: string): string[] => {\n segmenter || getSegmenter();\n if (segmenter) {\n const segments = segmenter.segment(textstring);\n return Array.from(segments).map(({ segment }) => segment);\n }\n\n //Fallback\n return graphemeSplitImpl(textstring);\n};\n\nconst graphemeSplitImpl = (textstring: string): string[] => {\n const graphemes: string[] = [];\n for (let i = 0, chr; i < textstring.length; i++) {\n if ((chr = getWholeChar(textstring, i)) === false) {\n continue;\n }\n graphemes.push(chr);\n }\n return graphemes;\n};\n\n// taken from mdn in the charAt doc page.\nconst getWholeChar = (str: string, i: number): string | false => {\n const code = str.charCodeAt(i);\n if (isNaN(code)) {\n return ''; // Position not found\n }\n if (code < 0xd800 || code > 0xdfff) {\n return str.charAt(i);\n }\n\n // High surrogate (could change last hex to 0xDB7F to treat high private\n // surrogates as single characters)\n if (0xd800 <= code && code <= 0xdbff) {\n if (str.length <= i + 1) {\n throw 'High surrogate without following low surrogate';\n }\n const next = str.charCodeAt(i + 1);\n if (0xdc00 > next || next > 0xdfff) {\n throw 'High surrogate without following low surrogate';\n }\n return str.charAt(i) + str.charAt(i + 1);\n }\n // Low surrogate (0xDC00 <= code && code <= 0xDFFF)\n if (i === 0) {\n throw 'Low surrogate without preceding high surrogate';\n }\n const prev = str.charCodeAt(i - 1);\n\n // (could change last hex to 0xDB7F to treat high private\n // surrogates as single characters)\n if (0xd800 > prev || prev > 0xdbff) {\n throw 'Low surrogate without preceding high surrogate';\n }\n // We can pass over low surrogates now as the second component\n // in a pair which we have already processed\n return false;\n};\n","import { reNewline } from '../../constants';\nimport type {\n TextStyle,\n TextStyleDeclaration,\n} from '../../shapes/Text/StyledText';\nimport { cloneStyles } from '../internals/cloneStyles';\nimport { graphemeSplit } from '../lang_string';\n\nexport type TextStyleArray = {\n start: number;\n end: number;\n style: TextStyleDeclaration;\n}[];\n\n/**\n * @param {Object} prevStyle first style to compare\n * @param {Object} thisStyle second style to compare\n * @param {boolean} forTextSpans whether to check overline, underline, and line-through properties\n * @return {boolean} true if the style changed\n */\nexport const hasStyleChanged = (\n prevStyle: TextStyleDeclaration,\n thisStyle: TextStyleDeclaration,\n forTextSpans = false,\n) =>\n prevStyle.fill !== thisStyle.fill ||\n prevStyle.stroke !== thisStyle.stroke ||\n prevStyle.strokeWidth !== thisStyle.strokeWidth ||\n prevStyle.fontSize !== thisStyle.fontSize ||\n prevStyle.fontFamily !== thisStyle.fontFamily ||\n prevStyle.fontWeight !== thisStyle.fontWeight ||\n prevStyle.fontStyle !== thisStyle.fontStyle ||\n prevStyle.textDecorationThickness !== thisStyle.textDecorationThickness ||\n prevStyle.textBackgroundColor !== thisStyle.textBackgroundColor ||\n prevStyle.deltaY !== thisStyle.deltaY ||\n (forTextSpans &&\n (prevStyle.overline !== thisStyle.overline ||\n prevStyle.underline !== thisStyle.underline ||\n prevStyle.linethrough !== thisStyle.linethrough));\n\n/**\n * Returns the array form of a text object's inline styles property with styles grouped in ranges\n * rather than per character. This format is less verbose, and is better suited for storage\n * so it is used in serialization (not during runtime).\n * @param {object} styles per character styles for a text object\n * @param {String} text the text string that the styles are applied to\n * @return {{start: number, end: number, style: object}[]}\n */\nexport const stylesToArray = (\n styles: TextStyle,\n text: string,\n): TextStyleArray => {\n const textLines = text.split('\\n'),\n stylesArray = [];\n let charIndex = -1,\n prevStyle = {};\n // clone style structure to prevent mutation\n styles = cloneStyles(styles);\n\n //loop through each textLine\n for (let i = 0; i < textLines.length; i++) {\n const chars = graphemeSplit(textLines[i]);\n if (!styles[i]) {\n //no styles exist for this line, so add the line's length to the charIndex total and reset prevStyle\n charIndex += chars.length;\n prevStyle = {};\n continue;\n }\n //loop through each character of the current line\n for (let c = 0; c < chars.length; c++) {\n charIndex++;\n const thisStyle = styles[i][c];\n //check if style exists for this character\n if (thisStyle && Object.keys(thisStyle).length > 0) {\n if (hasStyleChanged(prevStyle, thisStyle, true)) {\n stylesArray.push({\n start: charIndex,\n end: charIndex + 1,\n style: thisStyle,\n });\n } else {\n //if style is the same as previous character, increase end index\n stylesArray[stylesArray.length - 1].end++;\n }\n }\n prevStyle = thisStyle || {};\n }\n }\n return stylesArray;\n};\n\n/**\n * Returns the object form of the styles property with styles that are assigned per\n * character rather than grouped by range. This format is more verbose, and is\n * only used during runtime (not for serialization/storage)\n * @param {Array} styles the serialized form of a text object's styles\n * @param {String} text the text string that the styles are applied to\n * @return {Object}\n */\nexport const stylesFromArray = (\n styles: TextStyleArray | TextStyle,\n text: string,\n): TextStyle => {\n if (!Array.isArray(styles)) {\n // clone to prevent mutation\n return cloneStyles(styles);\n }\n const textLines = text.split(reNewline),\n stylesObject: TextStyle = {};\n let charIndex = -1,\n styleIndex = 0;\n //loop through each textLine\n for (let i = 0; i < textLines.length; i++) {\n const chars = graphemeSplit(textLines[i]);\n\n //loop through each character of the current line\n for (let c = 0; c < chars.length; c++) {\n charIndex++;\n //check if there's a style collection that includes the current character\n if (\n styles[styleIndex] &&\n styles[styleIndex].start <= charIndex &&\n charIndex < styles[styleIndex].end\n ) {\n //create object for line index if it doesn't exist\n stylesObject[i] = stylesObject[i] || {};\n //assign a style at this character's index\n stylesObject[i][c] = { ...styles[styleIndex].style };\n //if character is at the end of the current style collection, move to the next\n if (charIndex === styles[styleIndex].end - 1) {\n styleIndex++;\n }\n }\n }\n }\n return stylesObject;\n};\n","import { FILL, STROKE } from '../constants';\n\n/**\n * Attributes parsed from all SVG elements\n * @type array\n */\nexport const SHARED_ATTRIBUTES = [\n 'display',\n 'transform',\n FILL,\n 'fill-opacity',\n 'fill-rule',\n 'opacity',\n STROKE,\n 'stroke-dasharray',\n 'stroke-linecap',\n 'stroke-dashoffset',\n 'stroke-linejoin',\n 'stroke-miterlimit',\n 'stroke-opacity',\n 'stroke-width',\n 'id',\n 'paint-order',\n 'vector-effect',\n 'instantiated_by_use',\n 'clip-path',\n];\n","export function selectorMatches(\n element: HTMLElement | SVGElement,\n selector: string,\n) {\n const nodeName = element.nodeName;\n const classNames = element.getAttribute('class');\n const id = element.getAttribute('id');\n const azAz = '(?![a-zA-Z\\\\-]+)';\n let matcher;\n // i check if a selector matches slicing away part from it.\n // if i get empty string i should match\n matcher = new RegExp('^' + nodeName, 'i');\n selector = selector.replace(matcher, '');\n if (id && selector.length) {\n matcher = new RegExp('#' + id + azAz, 'i');\n selector = selector.replace(matcher, '');\n }\n if (classNames && selector.length) {\n const splitClassNames = classNames.split(' ');\n for (let i = splitClassNames.length; i--; ) {\n matcher = new RegExp('\\\\.' + splitClassNames[i] + azAz, 'i');\n selector = selector.replace(matcher, '');\n }\n }\n return selector.length === 0;\n}\n","import { selectorMatches } from './selectorMatches';\nimport { doesSomeParentMatch } from './doesSomeParentMatch';\n\n/**\n * @private\n */\n\nexport function elementMatchesRule(\n element: HTMLElement | SVGElement,\n selectors: string[],\n) {\n let parentMatching = true;\n // start from rightmost selector.\n const firstMatching = selectorMatches(element, selectors.pop()!);\n if (firstMatching && selectors.length) {\n parentMatching = doesSomeParentMatch(element, selectors);\n }\n return firstMatching && parentMatching && selectors.length === 0;\n}\n","import { selectorMatches } from './selectorMatches';\n\nexport function doesSomeParentMatch(\n element: HTMLElement | SVGElement,\n selectors: string[],\n) {\n let selector: string,\n parentMatching = true;\n while (\n element.parentElement &&\n element.parentElement.nodeType === 1 &&\n selectors.length\n ) {\n if (parentMatching) {\n selector = selectors.pop()!;\n }\n element = element.parentElement;\n parentMatching = selectorMatches(element, selector!);\n }\n return selectors.length === 0;\n}\n","import { elementMatchesRule } from './elementMatchesRule';\nimport type { CSSRules } from './typedefs';\n\n/**\n * @private\n */\n\nexport function getGlobalStylesForElement(\n element: HTMLElement | SVGElement,\n cssRules: CSSRules = {},\n) {\n let styles: Record = {};\n for (const rule in cssRules) {\n if (elementMatchesRule(element, rule.split(' '))) {\n styles = {\n ...styles,\n ...cssRules[rule],\n };\n }\n }\n return styles;\n}\n","import { attributesMap } from './constants';\n\nexport const normalizeAttr = (\n attr: keyof typeof attributesMap | string,\n): string => attributesMap[attr as keyof typeof attributesMap] ?? attr;\n","import { reNum } from '../../parser/constants';\n\nconst regex = new RegExp(`(${reNum})`, 'gi');\n\nexport const cleanupSvgAttribute = (attributeValue: string) =>\n attributeValue\n .replace(regex, ' $1 ')\n // replace annoying commas and arbitrary whitespace with single spaces\n .replace(/,/gi, ' ')\n .replace(/\\s+/gi, ' ');\n","import { ROTATE, SCALE, SKEW_X, SKEW_Y, iMatrix } from '../constants';\nimport { reNum } from './constants';\nimport type { TMat2D } from '../typedefs';\nimport { cleanupSvgAttribute } from '../util/internals/cleanupSvgAttribute';\nimport {\n createRotateMatrix,\n createScaleMatrix,\n createSkewXMatrix,\n createSkewYMatrix,\n createTranslateMatrix,\n multiplyTransformMatrixArray,\n} from '../util/misc/matrix';\n\n// == begin transform regexp\nconst p = `(${reNum})`;\nconst skewX = String.raw`(skewX)\\(${p}\\)`;\nconst skewY = String.raw`(skewY)\\(${p}\\)`;\nconst rotate = String.raw`(rotate)\\(${p}(?: ${p} ${p})?\\)`;\nconst scale = String.raw`(scale)\\(${p}(?: ${p})?\\)`;\nconst translate = String.raw`(translate)\\(${p}(?: ${p})?\\)`;\nconst matrix = String.raw`(matrix)\\(${p} ${p} ${p} ${p} ${p} ${p}\\)`;\nconst transform = `(?:${matrix}|${translate}|${rotate}|${scale}|${skewX}|${skewY})`;\nconst transforms = `(?:${transform}*)`;\nconst transformList = String.raw`^\\s*(?:${transforms}?)\\s*$`;\n// http://www.w3.org/TR/SVG/coords.html#TransformAttribute\nconst reTransformList = new RegExp(transformList);\nconst reTransform = new RegExp(transform);\nconst reTransformAll = new RegExp(transform, 'g');\n// == end transform regexp\n\n/**\n * Parses \"transform\" attribute, returning an array of values\n * @param {String} attributeValue String containing attribute value\n * @return {TTransformMatrix} Array of 6 elements representing transformation matrix\n */\nexport function parseTransformAttribute(attributeValue: string): TMat2D {\n // first we clean the string\n attributeValue = cleanupSvgAttribute(attributeValue)\n // remove spaces around front parentheses\n .replace(/\\s*([()])\\s*/gi, '$1');\n\n // start with identity matrix\n const matrices: TMat2D[] = [];\n\n // return if no argument was given or\n // an argument does not match transform attribute regexp\n if (\n !attributeValue ||\n (attributeValue && !reTransformList.test(attributeValue))\n ) {\n return [...iMatrix];\n }\n\n for (const match of attributeValue.matchAll(reTransformAll)) {\n const transformMatch = reTransform.exec(match[0]);\n if (!transformMatch) {\n continue;\n }\n let matrix: TMat2D = iMatrix;\n const matchedParams = transformMatch.filter((m) => !!m);\n const [, operation, ...rawArgs] = matchedParams;\n const [arg0, arg1, arg2, arg3, arg4, arg5] = rawArgs.map((arg) =>\n parseFloat(arg),\n );\n\n switch (operation) {\n case 'translate':\n matrix = createTranslateMatrix(arg0, arg1);\n break;\n case ROTATE:\n matrix = createRotateMatrix({ angle: arg0 }, { x: arg1, y: arg2 });\n break;\n case SCALE:\n matrix = createScaleMatrix(arg0, arg1);\n break;\n case SKEW_X:\n matrix = createSkewXMatrix(arg0);\n break;\n case SKEW_Y:\n matrix = createSkewYMatrix(arg0);\n break;\n case 'matrix':\n matrix = [arg0, arg1, arg2, arg3, arg4, arg5];\n break;\n }\n\n // snapshot current matrix into matrices array\n matrices.push(matrix);\n }\n\n return multiplyTransformMatrixArray(matrices);\n}\n","import { multiplyTransformMatrices } from '../util/misc/matrix';\nimport { parseUnit } from '../util/misc/svgParsing';\nimport { parseTransformAttribute } from './parseTransformAttribute';\nimport { CENTER, LEFT, RIGHT, NONE, FILL, STROKE } from '../constants';\nimport { TEXT_DECORATION_THICKNESS } from '../shapes/Text/constants';\n\nexport function normalizeValue(\n attr: string,\n value: any,\n parentAttributes: Record,\n fontSize: number,\n): string | null | boolean | number[] | number {\n const isArray = Array.isArray(value);\n let parsed: number | number[];\n let ouputValue: string | null | boolean | number[] | number = value;\n if ((attr === FILL || attr === STROKE) && value === NONE) {\n ouputValue = '';\n } else if (attr === 'strokeUniform') {\n return value === 'non-scaling-stroke';\n } else if (attr === 'strokeDashArray') {\n if (value === NONE) {\n ouputValue = null;\n } else {\n ouputValue = value.replace(/,/g, ' ').split(/\\s+/).map(parseFloat);\n }\n } else if (attr === 'transformMatrix') {\n if (parentAttributes && parentAttributes.transformMatrix) {\n ouputValue = multiplyTransformMatrices(\n parentAttributes.transformMatrix,\n parseTransformAttribute(value),\n );\n } else {\n ouputValue = parseTransformAttribute(value);\n }\n } else if (attr === 'visible') {\n ouputValue = value !== NONE && value !== 'hidden';\n // display=none on parent element always takes precedence over child element\n if (parentAttributes && parentAttributes.visible === false) {\n ouputValue = false;\n }\n } else if (attr === 'opacity') {\n ouputValue = parseFloat(value);\n if (parentAttributes && typeof parentAttributes.opacity !== 'undefined') {\n ouputValue *= parentAttributes.opacity as number;\n }\n } else if (attr === 'textAnchor' /* text-anchor */) {\n ouputValue = value === 'start' ? LEFT : value === 'end' ? RIGHT : CENTER;\n } else if (attr === 'charSpacing' || attr === TEXT_DECORATION_THICKNESS) {\n // parseUnit returns px and we convert it to em\n parsed = (parseUnit(value, fontSize) / fontSize) * 1000;\n } else if (attr === 'paintFirst') {\n const fillIndex = value.indexOf(FILL);\n const strokeIndex = value.indexOf(STROKE);\n ouputValue = FILL;\n if (fillIndex > -1 && strokeIndex > -1 && strokeIndex < fillIndex) {\n ouputValue = STROKE;\n } else if (fillIndex === -1 && strokeIndex > -1) {\n ouputValue = STROKE;\n }\n } else if (\n attr === 'href' ||\n attr === 'xlink:href' ||\n attr === 'font' ||\n attr === 'id'\n ) {\n return value;\n } else if (attr === 'imageSmoothing') {\n return value === 'optimizeQuality';\n } else {\n parsed = isArray\n ? (value as string[]).map(parseUnit)\n : parseUnit(value, fontSize);\n }\n\n return !isArray && isNaN(parsed! as number) ? ouputValue : parsed!;\n}\n","/**\n * Takes a style string and parses it in one that has only defined values\n * and lowercases properties\n * @param style\n * @param oStyle\n */\nexport function parseStyleString(\n style: string,\n oStyle: Record,\n): void {\n style\n .replace(/;\\s*$/, '')\n .split(';')\n .forEach((chunk) => {\n if (!chunk) return;\n const [attr, value] = chunk.split(':');\n oStyle[attr.trim().toLowerCase()] = value.trim();\n });\n}\n","import { parseStyleObject } from './parseStyleObject';\nimport { parseStyleString } from './parseStyleString';\n\n/**\n * Parses \"style\" attribute, retuning an object with values\n * @param {SVGElement} element Element to parse\n * @return {Object} Objects with values parsed from style attribute of an element\n */\nexport function parseStyleAttribute(\n element: HTMLElement | SVGElement,\n): Record {\n const oStyle: Record = {},\n style = element.getAttribute('style');\n\n if (!style) {\n return oStyle;\n }\n\n if (typeof style === 'string') {\n parseStyleString(style, oStyle);\n } else {\n parseStyleObject(style, oStyle);\n }\n\n return oStyle;\n}\n","/**\n * Takes a style object and parses it in one that has only defined values\n * and lowercases properties\n * @param style\n * @param oStyle\n */\nexport function parseStyleObject(\n style: Record,\n oStyle: Record,\n): void {\n Object.entries(style).forEach(([prop, value]) => {\n if (value === undefined) {\n return;\n }\n oStyle[prop.toLowerCase()] = value;\n });\n}\n","import { Color } from '../color/Color';\nimport { toFixed } from '../util/misc/toFixed';\nimport { FabricObject } from '../shapes/Object/FabricObject';\n\nconst colorAttributesMap = {\n stroke: 'strokeOpacity',\n fill: 'fillOpacity',\n};\n\n/**\n * @private\n * @param {Object} attributes Array of attributes to parse\n */\n\nexport function setStrokeFillOpacity(\n attributes: Record,\n): Record {\n const defaults = FabricObject.getDefaults();\n Object.entries(colorAttributesMap).forEach(([attr, colorAttr]) => {\n if (\n typeof attributes[colorAttr] === 'undefined' ||\n attributes[attr] === ''\n ) {\n return;\n }\n if (typeof attributes[attr] === 'undefined') {\n if (!defaults[attr]) {\n return;\n }\n attributes[attr] = defaults[attr];\n }\n if (attributes[attr].indexOf('url(') === 0) {\n return;\n }\n const color = new Color(attributes[attr]);\n attributes[attr] = color\n .setAlpha(toFixed(color.getAlpha() * attributes[colorAttr], 2))\n .toRgba();\n });\n return attributes;\n}\n","import { DEFAULT_SVG_FONT_SIZE } from '../constants';\nimport { parseUnit } from '../util/misc/svgParsing';\nimport { cPath, fSize, svgValidParentsRegEx } from './constants';\nimport { getGlobalStylesForElement } from './getGlobalStylesForElement';\nimport { normalizeAttr } from './normalizeAttr';\nimport { normalizeValue } from './normalizeValue';\nimport { parseFontDeclaration } from './parseFontDeclaration';\nimport { parseStyleAttribute } from './parseStyleAttribute';\nimport { setStrokeFillOpacity } from './setStrokeFillOpacity';\nimport type { CSSRules } from './typedefs';\n\n/**\n * Returns an object of attributes' name/value, given element and an array of attribute names;\n * Parses parent \"g\" nodes recursively upwards.\n * @param {SVGElement | HTMLElement} element Element to parse\n * @param {Array} attributes Array of attributes to parse\n * @return {Object} object containing parsed attributes' names/values\n */\nexport function parseAttributes(\n element: HTMLElement | SVGElement | null,\n attributes: string[],\n cssRules?: CSSRules,\n): Record {\n if (!element) {\n return {};\n }\n\n let parentAttributes: Record = {},\n fontSize: number,\n parentFontSize = DEFAULT_SVG_FONT_SIZE;\n\n // if there's a parent container (`g` or `a` or `symbol` node), parse its attributes recursively upwards\n if (\n element.parentNode &&\n svgValidParentsRegEx.test(element.parentNode.nodeName)\n ) {\n parentAttributes = parseAttributes(\n element.parentElement,\n attributes,\n cssRules,\n );\n if (parentAttributes.fontSize) {\n fontSize = parentFontSize = parseUnit(parentAttributes.fontSize);\n }\n }\n\n const ownAttributes: Record = {\n ...attributes.reduce>((memo, attr) => {\n const value = element.getAttribute(attr);\n if (value) {\n memo[attr] = value;\n }\n return memo;\n }, {}),\n // add values parsed from style, which take precedence over attributes\n // (see: http://www.w3.org/TR/SVG/styling.html#UsingPresentationAttributes)\n ...getGlobalStylesForElement(element, cssRules),\n ...parseStyleAttribute(element),\n };\n\n if (ownAttributes[cPath]) {\n element.setAttribute(cPath, ownAttributes[cPath]);\n }\n if (ownAttributes[fSize]) {\n // looks like the minimum should be 9px when dealing with ems. this is what looks like in browsers.\n fontSize = parseUnit(ownAttributes[fSize], parentFontSize);\n ownAttributes[fSize] = `${fontSize}`;\n }\n\n // this should have its own complex type\n const normalizedStyle: Record<\n string,\n string | boolean | number | number[] | null\n > = {};\n for (const attr in ownAttributes) {\n const normalizedAttr = normalizeAttr(attr);\n const normalizedValue = normalizeValue(\n normalizedAttr,\n ownAttributes[attr],\n parentAttributes,\n fontSize!,\n );\n normalizedStyle[normalizedAttr] = normalizedValue;\n }\n if (normalizedStyle && normalizedStyle.font) {\n parseFontDeclaration(normalizedStyle.font as string, normalizedStyle);\n }\n const mergedAttrs = { ...parentAttributes, ...normalizedStyle };\n return svgValidParentsRegEx.test(element.nodeName)\n ? mergedAttrs\n : setStrokeFillOpacity(mergedAttrs);\n}\n","import { parseUnit } from '../util/misc/svgParsing';\nimport { reFontDeclaration } from './constants';\n\n/**\n * Parses a short font declaration, building adding its properties to a style object\n * @param {String} value font declaration\n * @param {Object} oStyle definition\n */\nexport function parseFontDeclaration(\n value: string,\n oStyle: Record,\n): void {\n const match = value.match(reFontDeclaration);\n\n if (!match) {\n return;\n }\n const fontStyle = match[1],\n // font variant is not used\n // fontVariant = match[2],\n fontWeight = match[3],\n fontSize = match[4],\n lineHeight = match[5],\n fontFamily = match[6];\n\n if (fontStyle) {\n oStyle.fontStyle = fontStyle;\n }\n if (fontWeight) {\n oStyle.fontWeight = isNaN(parseFloat(fontWeight))\n ? fontWeight\n : parseFloat(fontWeight);\n }\n if (fontSize) {\n oStyle.fontSize = parseUnit(fontSize);\n }\n if (fontFamily) {\n oStyle.fontFamily = fontFamily;\n }\n if (lineHeight) {\n oStyle.lineHeight = lineHeight === 'normal' ? 1 : lineHeight;\n }\n}\n","import { kRect } from '../constants';\nimport { SHARED_ATTRIBUTES } from '../parser/attributes';\nimport { parseAttributes } from '../parser/parseAttributes';\nimport type { Abortable, TClassProperties, TOptions } from '../typedefs';\nimport { classRegistry } from '../ClassRegistry';\nimport { FabricObject, cacheProperties } from './Object/FabricObject';\nimport type { FabricObjectProps, SerializedObjectProps } from './Object/types';\nimport type { ObjectEvents } from '../EventTypeDefs';\nimport type { CSSRules } from '../parser/typedefs';\n\nexport const rectDefaultValues: Partial> = {\n rx: 0,\n ry: 0,\n};\n\ninterface UniqueRectProps {\n rx: number;\n ry: number;\n}\n\nexport interface SerializedRectProps\n extends SerializedObjectProps,\n UniqueRectProps {}\n\nexport interface RectProps extends FabricObjectProps, UniqueRectProps {}\n\nconst RECT_PROPS = ['rx', 'ry'] as const;\n\nexport class Rect<\n Props extends TOptions = Partial,\n SProps extends SerializedRectProps = SerializedRectProps,\n EventSpec extends ObjectEvents = ObjectEvents,\n >\n extends FabricObject\n implements RectProps\n{\n /**\n * Horizontal border radius\n * @type Number\n */\n declare rx: number;\n\n /**\n * Vertical border radius\n * @type Number\n */\n declare ry: number;\n\n static type = 'Rect';\n\n static cacheProperties = [...cacheProperties, ...RECT_PROPS];\n\n static ownDefaults = rectDefaultValues;\n\n static getDefaults(): Record {\n return {\n ...super.getDefaults(),\n ...Rect.ownDefaults,\n };\n }\n\n /**\n * Constructor\n * @param {Object} [options] Options object\n */\n constructor(options?: Props) {\n super();\n Object.assign(this, Rect.ownDefaults);\n this.setOptions(options);\n this._initRxRy();\n }\n /**\n * Initializes rx/ry attributes\n * @private\n */\n _initRxRy() {\n const { rx, ry } = this;\n if (rx && !ry) {\n this.ry = rx;\n } else if (ry && !rx) {\n this.rx = ry;\n }\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _render(ctx: CanvasRenderingContext2D) {\n const { width: w, height: h } = this;\n const x = -w / 2;\n const y = -h / 2;\n const rx = this.rx ? Math.min(this.rx, w / 2) : 0;\n const ry = this.ry ? Math.min(this.ry, h / 2) : 0;\n const isRounded = rx !== 0 || ry !== 0;\n\n ctx.beginPath();\n\n ctx.moveTo(x + rx, y);\n\n ctx.lineTo(x + w - rx, y);\n isRounded &&\n ctx.bezierCurveTo(\n x + w - kRect * rx,\n y,\n x + w,\n y + kRect * ry,\n x + w,\n y + ry,\n );\n\n ctx.lineTo(x + w, y + h - ry);\n isRounded &&\n ctx.bezierCurveTo(\n x + w,\n y + h - kRect * ry,\n x + w - kRect * rx,\n y + h,\n x + w - rx,\n y + h,\n );\n\n ctx.lineTo(x + rx, y + h);\n isRounded &&\n ctx.bezierCurveTo(\n x + kRect * rx,\n y + h,\n x,\n y + h - kRect * ry,\n x,\n y + h - ry,\n );\n\n ctx.lineTo(x, y + ry);\n isRounded &&\n ctx.bezierCurveTo(x, y + kRect * ry, x + kRect * rx, y, x + rx, y);\n\n ctx.closePath();\n\n this._renderPaintInOrder(ctx);\n }\n\n /**\n * Returns object representation of an instance\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} object representation of an instance\n */\n toObject<\n T extends Omit, keyof SProps>,\n K extends keyof T = never,\n >(propertiesToInclude: K[] = []): Pick & SProps {\n return super.toObject([...RECT_PROPS, ...propertiesToInclude]);\n }\n\n /**\n * Returns svg representation of an instance\n * @return {Array} an array of strings with the specific svg representation\n * of the instance\n */\n _toSVG() {\n const { width, height, rx, ry } = this;\n return [\n '\\n`,\n ];\n }\n\n /**\n * List of attribute names to account for when parsing SVG element (used by `Rect.fromElement`)\n * @see: http://www.w3.org/TR/SVG/shapes.html#RectElement\n */\n static ATTRIBUTE_NAMES = [\n ...SHARED_ATTRIBUTES,\n 'x',\n 'y',\n 'rx',\n 'ry',\n 'width',\n 'height',\n ];\n\n /* _FROM_SVG_START_ */\n\n /**\n * Returns {@link Rect} instance from an SVG element\n * @param {HTMLElement} element Element to parse\n * @param {Object} [options] Options object\n */\n static async fromElement(\n element: HTMLElement | SVGElement,\n options?: Abortable,\n cssRules?: CSSRules,\n ) {\n const {\n left = 0,\n top = 0,\n width = 0,\n height = 0,\n visible = true,\n ...restOfparsedAttributes\n } = parseAttributes(element, this.ATTRIBUTE_NAMES, cssRules);\n\n return new this({\n ...options,\n ...restOfparsedAttributes,\n left,\n top,\n width,\n height,\n visible: Boolean(visible && width && height),\n });\n }\n\n /* _FROM_SVG_END_ */\n}\n\nclassRegistry.setClass(Rect);\nclassRegistry.setSVGClass(Rect);\n","export const LAYOUT_TYPE_INITIALIZATION = 'initialization';\nexport const LAYOUT_TYPE_ADDED = 'added';\nexport const LAYOUT_TYPE_REMOVED = 'removed';\nexport const LAYOUT_TYPE_IMPERATIVE = 'imperative';\nexport const LAYOUT_TYPE_OBJECT_MODIFIED = 'object_modified';\nexport const LAYOUT_TYPE_OBJECT_MODIFYING = 'object_modifying';\n","import { Point, ZERO } from '../../Point';\nimport type { Group } from '../../shapes/Group';\nimport type { FabricObject } from '../../shapes/Object/FabricObject';\nimport { multiplyTransformMatrixArray } from '../../util/misc/matrix';\nimport { sizeAfterTransform } from '../../util/misc/objectTransforms';\nimport {\n calcPlaneChangeMatrix,\n sendVectorToPlane,\n} from '../../util/misc/planeChange';\n\n/**\n * @returns 2 points, the tl and br corners of the non rotated bounding box of an object\n * in the {@link group} plane, taking into account objects that {@link group} is their parent\n * but also belong to the active selection.\n */\nexport const getObjectBounds = (\n destinationGroup: Group,\n object: FabricObject,\n): Point[] => {\n const {\n strokeUniform,\n strokeWidth,\n width,\n height,\n group: currentGroup,\n } = object;\n const t =\n currentGroup && currentGroup !== destinationGroup\n ? calcPlaneChangeMatrix(\n currentGroup.calcTransformMatrix(),\n destinationGroup.calcTransformMatrix(),\n )\n : null;\n const objectCenter = t\n ? object.getRelativeCenterPoint().transform(t)\n : object.getRelativeCenterPoint();\n const accountForStroke = !object['isStrokeAccountedForInDimensions']();\n const strokeUniformVector =\n strokeUniform && accountForStroke\n ? sendVectorToPlane(\n new Point(strokeWidth, strokeWidth),\n undefined,\n destinationGroup.calcTransformMatrix(),\n )\n : ZERO;\n const scalingStrokeWidth =\n !strokeUniform && accountForStroke ? strokeWidth : 0;\n const sizeVector = sizeAfterTransform(\n width + scalingStrokeWidth,\n height + scalingStrokeWidth,\n multiplyTransformMatrixArray([t, object.calcOwnMatrix()], true),\n )\n .add(strokeUniformVector)\n .scalarDivide(2);\n return [objectCenter.subtract(sizeVector), objectCenter.add(sizeVector)];\n};\n","import { Point } from '../../Point';\nimport type { FabricObject } from '../../shapes/Object/FabricObject';\nimport { makeBoundingBoxFromPoints } from '../../util/misc/boundingBoxFromPoints';\nimport {\n LAYOUT_TYPE_INITIALIZATION,\n LAYOUT_TYPE_IMPERATIVE,\n} from '../constants';\nimport type {\n InitializationLayoutContext,\n LayoutStrategyResult,\n StrictLayoutContext,\n} from '../types';\nimport { getObjectBounds } from './utils';\n\n/**\n * Exposes a main public method {@link calcLayoutResult} that is used by the `LayoutManager` to perform layout.\n * Returning `undefined` signals the `LayoutManager` to skip the layout.\n *\n * In charge of calculating the bounding box of the passed objects.\n */\nexport abstract class LayoutStrategy {\n /**\n * override by subclass for persistence (TS does not support `static abstract`)\n */\n static type = 'strategy';\n\n /**\n * Used by the `LayoutManager` to perform layout\n * @TODO/fix: if this method is calcResult, should calc unconditionally.\n * the condition to not calc should be evaluated by the layoutManager.\n * @returns layout result **OR** `undefined` to skip layout\n */\n public calcLayoutResult(\n context: StrictLayoutContext,\n objects: FabricObject[],\n ): LayoutStrategyResult | undefined {\n if (this.shouldPerformLayout(context)) {\n return this.calcBoundingBox(objects, context);\n }\n }\n\n shouldPerformLayout({ type, prevStrategy, strategy }: StrictLayoutContext) {\n return (\n type === LAYOUT_TYPE_INITIALIZATION ||\n type === LAYOUT_TYPE_IMPERATIVE ||\n (!!prevStrategy && strategy !== prevStrategy)\n );\n }\n\n shouldLayoutClipPath({ type, target: { clipPath } }: StrictLayoutContext) {\n return (\n type !== LAYOUT_TYPE_INITIALIZATION &&\n clipPath &&\n !clipPath.absolutePositioned\n );\n }\n\n getInitialSize(\n context: StrictLayoutContext & InitializationLayoutContext,\n result: Pick,\n ) {\n return result.size;\n }\n\n /**\n * Override this method to customize layout.\n */\n calcBoundingBox(\n objects: FabricObject[],\n context: StrictLayoutContext,\n ): LayoutStrategyResult | undefined {\n const { type, target } = context;\n if (type === LAYOUT_TYPE_IMPERATIVE && context.overrides) {\n return context.overrides;\n }\n if (objects.length === 0) {\n return;\n }\n const { left, top, width, height } = makeBoundingBoxFromPoints(\n objects\n .map((object) => getObjectBounds(target, object))\n .reduce((coords, curr) => coords.concat(curr), []),\n );\n const bboxSize = new Point(width, height);\n const bboxLeftTop = new Point(left, top);\n const bboxCenter = bboxLeftTop.add(bboxSize.scalarDivide(2));\n\n if (type === LAYOUT_TYPE_INITIALIZATION) {\n const actualSize = this.getInitialSize(context, {\n size: bboxSize,\n center: bboxCenter,\n });\n return {\n // in `initialization` we do not account for target's transformation matrix\n center: bboxCenter,\n // TODO: investigate if this is still necessary\n relativeCorrection: new Point(0, 0),\n size: actualSize,\n };\n } else {\n // we send `relativeCenter` up to group's containing plane\n const center = bboxCenter.transform(target.calcOwnMatrix());\n return {\n center,\n size: bboxSize,\n };\n }\n }\n}\n","import type { StrictLayoutContext } from '../types';\nimport { LayoutStrategy } from './LayoutStrategy';\nimport { classRegistry } from '../../ClassRegistry';\n\n/**\n * Layout will adjust the bounding box to fit target's objects.\n */\nexport class FitContentLayout extends LayoutStrategy {\n static readonly type = 'fit-content';\n\n /**\n * @override layout on all triggers\n * Override at will\n */\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n shouldPerformLayout(context: StrictLayoutContext) {\n return true;\n }\n}\n\nclassRegistry.setClass(FitContentLayout);\n","import { Point } from '../Point';\nimport {\n CENTER,\n CHANGED,\n MODIFIED,\n MODIFY_PATH,\n MODIFY_POLY,\n MOVING,\n RESIZING,\n ROTATING,\n SCALING,\n SKEWING,\n iMatrix,\n} from '../constants';\nimport type { Group } from '../shapes/Group';\nimport type { FabricObject } from '../shapes/Object/FabricObject';\nimport { invertTransform } from '../util/misc/matrix';\nimport { resolveOrigin } from '../util/misc/resolveOrigin';\nimport { FitContentLayout } from './LayoutStrategies/FitContentLayout';\nimport type { LayoutStrategy } from './LayoutStrategies/LayoutStrategy';\nimport {\n LAYOUT_TYPE_INITIALIZATION,\n LAYOUT_TYPE_ADDED,\n LAYOUT_TYPE_REMOVED,\n LAYOUT_TYPE_IMPERATIVE,\n LAYOUT_TYPE_OBJECT_MODIFIED,\n LAYOUT_TYPE_OBJECT_MODIFYING,\n} from './constants';\nimport type {\n LayoutContext,\n LayoutResult,\n RegistrationContext,\n StrictLayoutContext,\n} from './types';\nimport { classRegistry } from '../ClassRegistry';\nimport type { TModificationEvents } from '../EventTypeDefs';\n\nconst LAYOUT_MANAGER = 'layoutManager';\n\nexport type SerializedLayoutManager = {\n type: string;\n strategy: string;\n};\n\nexport class LayoutManager {\n declare private _prevLayoutStrategy?: LayoutStrategy;\n declare protected _subscriptions: Map;\n\n strategy: LayoutStrategy;\n\n constructor(strategy: LayoutStrategy = new FitContentLayout()) {\n this.strategy = strategy;\n this._subscriptions = new Map();\n }\n\n public performLayout(context: LayoutContext) {\n const strictContext: StrictLayoutContext = {\n bubbles: true,\n strategy: this.strategy,\n ...context,\n prevStrategy: this._prevLayoutStrategy,\n stopPropagation() {\n this.bubbles = false;\n },\n };\n\n this.onBeforeLayout(strictContext);\n\n const layoutResult = this.getLayoutResult(strictContext);\n if (layoutResult) {\n this.commitLayout(strictContext, layoutResult);\n }\n\n this.onAfterLayout(strictContext, layoutResult);\n this._prevLayoutStrategy = strictContext.strategy;\n }\n\n /**\n * Attach handlers for events that we know will invalidate the layout when\n * performed on child objects ( general transforms ).\n * Returns the disposers for later unsubscribing and cleanup\n * @param {FabricObject} object\n * @param {RegistrationContext & Partial} context\n * @returns {VoidFunction[]} disposers remove the handlers\n */\n protected attachHandlers(\n object: FabricObject,\n context: RegistrationContext & Partial,\n ): VoidFunction[] {\n const { target } = context;\n return (\n [\n MODIFIED,\n MOVING,\n RESIZING,\n ROTATING,\n SCALING,\n SKEWING,\n CHANGED,\n MODIFY_POLY,\n MODIFY_PATH,\n ] as (TModificationEvents & 'modified')[]\n ).map((key) =>\n object.on(key, (e) =>\n this.performLayout(\n key === MODIFIED\n ? {\n type: LAYOUT_TYPE_OBJECT_MODIFIED,\n trigger: key,\n e,\n target,\n }\n : {\n type: LAYOUT_TYPE_OBJECT_MODIFYING,\n trigger: key,\n e,\n target,\n },\n ),\n ),\n );\n }\n\n /**\n * Subscribe an object to transform events that will trigger a layout change on the parent\n * This is important only for interactive groups.\n * @param object\n * @param context\n */\n protected subscribe(\n object: FabricObject,\n context: RegistrationContext & Partial,\n ) {\n this.unsubscribe(object, context);\n const disposers = this.attachHandlers(object, context);\n this._subscriptions.set(object, disposers);\n }\n\n /**\n * unsubscribe object layout triggers\n */\n protected unsubscribe(\n object: FabricObject,\n _context?: RegistrationContext & Partial,\n ) {\n (this._subscriptions.get(object) || []).forEach((d) => d());\n this._subscriptions.delete(object);\n }\n\n unsubscribeTargets(\n context: RegistrationContext & Partial,\n ) {\n context.targets.forEach((object) => this.unsubscribe(object, context));\n }\n\n subscribeTargets(\n context: RegistrationContext & Partial,\n ) {\n context.targets.forEach((object) => this.subscribe(object, context));\n }\n\n protected onBeforeLayout(context: StrictLayoutContext) {\n const { target, type } = context;\n const { canvas } = target;\n // handle layout triggers subscription\n // @TODO: gate the registration when the group is interactive\n if (type === LAYOUT_TYPE_INITIALIZATION || type === LAYOUT_TYPE_ADDED) {\n this.subscribeTargets(context);\n } else if (type === LAYOUT_TYPE_REMOVED) {\n this.unsubscribeTargets(context);\n }\n // fire layout event (event will fire only for layouts after initialization layout)\n target.fire('layout:before', {\n context,\n });\n canvas &&\n canvas.fire('object:layout:before', {\n target,\n context,\n });\n\n if (type === LAYOUT_TYPE_IMPERATIVE && context.deep) {\n const { strategy: _, ...tricklingContext } = context;\n // traverse the tree\n target.forEachObject(\n (object) =>\n (object as Group).layoutManager &&\n (object as Group).layoutManager.performLayout({\n ...tricklingContext,\n bubbles: false,\n target: object as Group,\n }),\n );\n }\n }\n\n protected getLayoutResult(\n context: StrictLayoutContext,\n ): Required | undefined {\n const { target, strategy, type } = context;\n\n const result = strategy.calcLayoutResult(context, target.getObjects());\n\n if (!result) {\n return;\n }\n\n const prevCenter =\n type === LAYOUT_TYPE_INITIALIZATION\n ? new Point()\n : target.getRelativeCenterPoint();\n\n const {\n center: nextCenter,\n correction = new Point(),\n relativeCorrection = new Point(),\n } = result;\n const offset = prevCenter\n .subtract(nextCenter)\n .add(correction)\n .transform(\n // in `initialization` we do not account for target's transformation matrix\n type === LAYOUT_TYPE_INITIALIZATION\n ? iMatrix\n : invertTransform(target.calcOwnMatrix()),\n true,\n )\n .add(relativeCorrection);\n\n return {\n result,\n prevCenter,\n nextCenter,\n offset,\n };\n }\n\n protected commitLayout(\n context: StrictLayoutContext,\n layoutResult: Required,\n ) {\n const { target } = context;\n const {\n result: { size },\n nextCenter,\n } = layoutResult;\n // set dimensions\n target.set({ width: size.x, height: size.y });\n // layout descendants\n this.layoutObjects(context, layoutResult);\n // set position\n // in `initialization` we do not account for target's transformation matrix\n if (context.type === LAYOUT_TYPE_INITIALIZATION) {\n // TODO: what about strokeWidth?\n target.set({\n left:\n context.x ?? nextCenter.x + size.x * resolveOrigin(target.originX),\n top: context.y ?? nextCenter.y + size.y * resolveOrigin(target.originY),\n });\n } else {\n target.setPositionByOrigin(nextCenter, CENTER, CENTER);\n // invalidate\n target.setCoords();\n target.set('dirty', true);\n }\n }\n\n protected layoutObjects(\n context: StrictLayoutContext,\n layoutResult: Required,\n ) {\n const { target } = context;\n // adjust objects to account for new center\n target.forEachObject((object) => {\n object.group === target &&\n this.layoutObject(context, layoutResult, object);\n });\n // adjust clip path to account for new center\n context.strategy.shouldLayoutClipPath(context) &&\n this.layoutObject(context, layoutResult, target.clipPath as FabricObject);\n }\n\n /**\n * @param {FabricObject} object\n * @param {Point} offset\n */\n protected layoutObject(\n context: StrictLayoutContext,\n { offset }: Required,\n object: FabricObject,\n ) {\n // TODO: this is here for cache invalidation.\n // verify if this is necessary since we have explicit\n // cache invalidation at the end of commitLayout\n object.set({\n left: object.left + offset.x,\n top: object.top + offset.y,\n });\n }\n\n protected onAfterLayout(\n context: StrictLayoutContext,\n layoutResult?: LayoutResult,\n ) {\n const {\n target,\n strategy,\n bubbles,\n prevStrategy: _,\n ...bubblingContext\n } = context;\n const { canvas } = target;\n\n // fire layout event (event will fire only for layouts after initialization layout)\n target.fire('layout:after', {\n context,\n result: layoutResult,\n });\n canvas &&\n canvas.fire('object:layout:after', {\n context,\n result: layoutResult,\n target,\n });\n\n // bubble\n const parent = target.parent;\n if (bubbles && parent?.layoutManager) {\n // add target to context#path\n (bubblingContext.path || (bubblingContext.path = [])).push(target);\n // all parents should invalidate their layout\n parent.layoutManager.performLayout({\n ...bubblingContext,\n target: parent,\n });\n }\n target.set('dirty', true);\n }\n\n dispose() {\n const { _subscriptions } = this;\n _subscriptions.forEach((disposers) => disposers.forEach((d) => d()));\n _subscriptions.clear();\n }\n\n toObject() {\n return {\n type: LAYOUT_MANAGER,\n strategy: (this.strategy.constructor as typeof LayoutStrategy).type,\n };\n }\n\n toJSON() {\n return this.toObject();\n }\n}\n\nclassRegistry.setClass(LayoutManager, LAYOUT_MANAGER);\n","import type { CollectionEvents, ObjectEvents } from '../EventTypeDefs';\nimport { createCollectionMixin } from '../Collection';\nimport type {\n TClassProperties,\n TSVGReviver,\n TOptions,\n Abortable,\n} from '../typedefs';\nimport {\n invertTransform,\n multiplyTransformMatrices,\n} from '../util/misc/matrix';\nimport {\n enlivenObjectEnlivables,\n enlivenObjects,\n} from '../util/misc/objectEnlive';\nimport { applyTransformToObject } from '../util/misc/objectTransforms';\nimport { FabricObject } from './Object/FabricObject';\nimport { Rect } from './Rect';\nimport { classRegistry } from '../ClassRegistry';\nimport type { FabricObjectProps, SerializedObjectProps } from './Object/types';\nimport { log } from '../util/internals/console';\nimport type {\n ImperativeLayoutOptions,\n LayoutBeforeEvent,\n LayoutAfterEvent,\n} from '../LayoutManager/types';\nimport { LayoutManager } from '../LayoutManager/LayoutManager';\nimport {\n LAYOUT_TYPE_ADDED,\n LAYOUT_TYPE_IMPERATIVE,\n LAYOUT_TYPE_INITIALIZATION,\n LAYOUT_TYPE_REMOVED,\n} from '../LayoutManager/constants';\nimport type { SerializedLayoutManager } from '../LayoutManager/LayoutManager';\nimport type { FitContentLayout } from '../LayoutManager';\nimport type { DrawContext } from './Object/Object';\n\n/**\n * This class handles the specific case of creating a group using {@link Group#fromObject} and is not meant to be used in any other case.\n * We could have used a boolean in the constructor, as we did previously, but we think the boolean\n * would stay in the group's constructor interface and create confusion, therefore it was removed.\n * This layout manager doesn't do anything and therefore keeps the exact layout the group had when {@link Group#toObject} was called.\n */\nclass NoopLayoutManager extends LayoutManager {\n performLayout() {}\n}\n\nexport interface GroupEvents extends ObjectEvents, CollectionEvents {\n 'layout:before': LayoutBeforeEvent;\n 'layout:after': LayoutAfterEvent;\n}\n\nexport interface GroupOwnProps {\n subTargetCheck: boolean;\n interactive: boolean;\n}\n\nexport interface SerializedGroupProps\n extends SerializedObjectProps,\n GroupOwnProps {\n objects: SerializedObjectProps[];\n layoutManager: SerializedLayoutManager;\n}\n\nexport interface GroupProps extends FabricObjectProps, GroupOwnProps {\n layoutManager: LayoutManager;\n}\n\nexport const groupDefaultValues: Partial> = {\n strokeWidth: 0,\n subTargetCheck: false,\n interactive: false,\n};\n\n/**\n * @fires object:added\n * @fires object:removed\n * @fires layout:before\n * @fires layout:after\n */\nexport class Group\n extends createCollectionMixin(\n FabricObject,\n )\n implements GroupProps\n{\n /**\n * Used to optimize performance\n * set to `false` if you don't need contained objects to be targets of events\n * @type boolean\n */\n declare subTargetCheck: boolean;\n\n /**\n * Used to allow targeting of object inside groups.\n * set to true if you want to select an object inside a group.\\\n * **REQUIRES** `subTargetCheck` set to true\n * This will be not removed but slowly replaced with a method setInteractive\n * that will take care of enabling subTargetCheck and necessary object events.\n * There is too much attached to group interactivity to just be evaluated by a\n * boolean in the code\n * @deprecated\n * @type boolean\n */\n declare interactive: boolean;\n\n declare layoutManager: LayoutManager;\n\n /**\n * Used internally to optimize performance\n * Once an object is selected, instance is rendered without the selected object.\n * This way instance is cached only once for the entire interaction with the selected object.\n * @private\n */\n protected _activeObjects: FabricObject[] = [];\n\n static type = 'Group';\n\n static ownDefaults: Record = groupDefaultValues;\n private __objectSelectionTracker: (ev: ObjectEvents['selected']) => void;\n private __objectSelectionDisposer: (ev: ObjectEvents['deselected']) => void;\n\n static getDefaults(): Record {\n return {\n ...super.getDefaults(),\n ...Group.ownDefaults,\n };\n }\n\n /**\n * Constructor\n *\n * @param {FabricObject[]} [objects] instance objects\n * @param {Object} [options] Options object\n */\n constructor(objects: FabricObject[] = [], options: Partial = {}) {\n super();\n Object.assign(this, Group.ownDefaults);\n this.setOptions(options);\n this.groupInit(objects, options);\n }\n\n /**\n * Shared code between group and active selection\n * Meant to be used by the constructor.\n */\n protected groupInit(\n objects: FabricObject[],\n options: {\n layoutManager?: LayoutManager;\n top?: number;\n left?: number;\n },\n ) {\n this._objects = [...objects]; // Avoid unwanted mutations of Collection to affect the caller\n\n this.__objectSelectionTracker = this.__objectSelectionMonitor.bind(\n this,\n true,\n );\n this.__objectSelectionDisposer = this.__objectSelectionMonitor.bind(\n this,\n false,\n );\n\n this.forEachObject((object) => {\n this.enterGroup(object, false);\n });\n\n // perform initial layout\n this.layoutManager = options.layoutManager ?? new LayoutManager();\n this.layoutManager.performLayout({\n type: LAYOUT_TYPE_INITIALIZATION,\n target: this,\n targets: [...objects],\n // @TODO remove this concept from the layout manager.\n // Layout manager will calculate the correct position,\n // group options can override it later.\n x: options.left,\n y: options.top,\n });\n }\n\n /**\n * Checks if object can enter group and logs relevant warnings\n * @private\n * @param {FabricObject} object\n * @returns\n */\n canEnterGroup(object: FabricObject) {\n if (object === this || this.isDescendantOf(object)) {\n // prevent circular object tree\n log(\n 'error',\n 'Group: circular object trees are not supported, this call has no effect',\n );\n return false;\n } else if (this._objects.indexOf(object) !== -1) {\n // is already in the objects array\n log(\n 'error',\n 'Group: duplicate objects are not supported inside group, this call has no effect',\n );\n return false;\n }\n return true;\n }\n\n /**\n * Override this method to enhance performance (for groups with a lot of objects).\n * If Overriding, be sure not pass illegal objects to group - it will break your app.\n * @private\n */\n protected _filterObjectsBeforeEnteringGroup(objects: FabricObject[]) {\n return objects.filter((object, index, array) => {\n // can enter AND is the first occurrence of the object in the passed args (to prevent adding duplicates)\n return this.canEnterGroup(object) && array.indexOf(object) === index;\n });\n }\n\n /**\n * Add objects\n * @param {...FabricObject[]} objects\n */\n add(...objects: FabricObject[]) {\n const allowedObjects = this._filterObjectsBeforeEnteringGroup(objects);\n const size = super.add(...allowedObjects);\n this._onAfterObjectsChange(LAYOUT_TYPE_ADDED, allowedObjects);\n return size;\n }\n\n /**\n * Inserts an object into collection at specified index\n * @param {FabricObject[]} objects Object to insert\n * @param {Number} index Index to insert object at\n */\n insertAt(index: number, ...objects: FabricObject[]) {\n const allowedObjects = this._filterObjectsBeforeEnteringGroup(objects);\n const size = super.insertAt(index, ...allowedObjects);\n this._onAfterObjectsChange(LAYOUT_TYPE_ADDED, allowedObjects);\n return size;\n }\n\n /**\n * Remove objects\n * @param {...FabricObject[]} objects\n * @returns {FabricObject[]} removed objects\n */\n remove(...objects: FabricObject[]) {\n const removed = super.remove(...objects);\n this._onAfterObjectsChange(LAYOUT_TYPE_REMOVED, removed);\n return removed;\n }\n\n _onObjectAdded(object: FabricObject) {\n this.enterGroup(object, true);\n this.fire('object:added', { target: object });\n object.fire('added', { target: this });\n }\n\n /**\n * @private\n * @param {FabricObject} object\n * @param {boolean} [removeParentTransform] true if object should exit group without applying group's transform to it\n */\n _onObjectRemoved(object: FabricObject, removeParentTransform?: boolean) {\n this.exitGroup(object, removeParentTransform);\n this.fire('object:removed', { target: object });\n object.fire('removed', { target: this });\n }\n\n /**\n * @private\n * @param {'added'|'removed'} type\n * @param {FabricObject[]} targets\n */\n _onAfterObjectsChange(type: 'added' | 'removed', targets: FabricObject[]) {\n this.layoutManager.performLayout({\n type,\n targets,\n target: this,\n });\n }\n\n _onStackOrderChanged() {\n this._set('dirty', true);\n }\n\n /**\n * @private\n * @param {string} key\n * @param {*} value\n */\n _set(key: string, value: any) {\n const prev = this[key as keyof this];\n super._set(key, value);\n if (key === 'canvas' && prev !== value) {\n (this._objects || []).forEach((object) => {\n object._set(key, value);\n });\n }\n return this;\n }\n\n /**\n * @private\n */\n _shouldSetNestedCoords() {\n return this.subTargetCheck;\n }\n\n /**\n * Remove all objects\n * @returns {FabricObject[]} removed objects\n */\n removeAll() {\n this._activeObjects = [];\n return this.remove(...this._objects);\n }\n\n /**\n * keeps track of the selected objects\n * @private\n */\n __objectSelectionMonitor(\n selected: T,\n {\n target: object,\n }: ObjectEvents[T extends true ? 'selected' : 'deselected'],\n ) {\n const activeObjects = this._activeObjects;\n if (selected) {\n activeObjects.push(object);\n this._set('dirty', true);\n } else if (activeObjects.length > 0) {\n const index = activeObjects.indexOf(object);\n if (index > -1) {\n activeObjects.splice(index, 1);\n this._set('dirty', true);\n }\n }\n }\n\n /**\n * @private\n * @param {boolean} watch\n * @param {FabricObject} object\n */\n _watchObject(watch: boolean, object: FabricObject) {\n // make sure we listen only once\n watch && this._watchObject(false, object);\n if (watch) {\n object.on('selected', this.__objectSelectionTracker);\n object.on('deselected', this.__objectSelectionDisposer);\n } else {\n object.off('selected', this.__objectSelectionTracker);\n object.off('deselected', this.__objectSelectionDisposer);\n }\n }\n\n /**\n * @private\n * @param {FabricObject} object\n * @param {boolean} [removeParentTransform] true if object is in canvas coordinate plane\n */\n enterGroup(object: FabricObject, removeParentTransform?: boolean) {\n object.group && object.group.remove(object);\n object._set('parent', this);\n this._enterGroup(object, removeParentTransform);\n }\n\n /**\n * @private\n * @param {FabricObject} object\n * @param {boolean} [removeParentTransform] true if object is in canvas coordinate plane\n */\n _enterGroup(object: FabricObject, removeParentTransform?: boolean) {\n if (removeParentTransform) {\n // can this be converted to utils (sendObjectToPlane)?\n applyTransformToObject(\n object,\n multiplyTransformMatrices(\n invertTransform(this.calcTransformMatrix()),\n object.calcTransformMatrix(),\n ),\n );\n }\n this._shouldSetNestedCoords() && object.setCoords();\n object._set('group', this);\n object._set('canvas', this.canvas);\n this._watchObject(true, object);\n const activeObject =\n this.canvas &&\n this.canvas.getActiveObject &&\n this.canvas.getActiveObject();\n // if we are adding the activeObject in a group\n if (\n activeObject &&\n (activeObject === object || object.isDescendantOf(activeObject))\n ) {\n this._activeObjects.push(object);\n }\n }\n\n /**\n * @private\n * @param {FabricObject} object\n * @param {boolean} [removeParentTransform] true if object should exit group without applying group's transform to it\n */\n exitGroup(object: FabricObject, removeParentTransform?: boolean) {\n this._exitGroup(object, removeParentTransform);\n object._set('parent', undefined);\n object._set('canvas', undefined);\n }\n\n /**\n * Executes the inner fabric logic of exiting a group.\n * - Stop watching the object\n * - Remove the object from the optimization map this._activeObjects\n * - unset the group property of the object\n * @protected\n * @param {FabricObject} object\n * @param {boolean} [removeParentTransform] true if object should exit group without applying group's transform to it\n */\n _exitGroup(object: FabricObject, removeParentTransform?: boolean) {\n object._set('group', undefined);\n if (!removeParentTransform) {\n applyTransformToObject(\n object,\n multiplyTransformMatrices(\n this.calcTransformMatrix(),\n object.calcTransformMatrix(),\n ),\n );\n object.setCoords();\n }\n this._watchObject(false, object);\n const index =\n this._activeObjects.length > 0 ? this._activeObjects.indexOf(object) : -1;\n if (index > -1) {\n this._activeObjects.splice(index, 1);\n }\n }\n\n /**\n * Decide if the group should cache or not. Create its own cache level\n * needsItsOwnCache should be used when the object drawing method requires\n * a cache step.\n * Generally you do not cache objects in groups because the group is already cached.\n * @return {Boolean}\n */\n shouldCache() {\n const ownCache = FabricObject.prototype.shouldCache.call(this);\n if (ownCache) {\n for (let i = 0; i < this._objects.length; i++) {\n if (this._objects[i].willDrawShadow()) {\n this.ownCaching = false;\n return false;\n }\n }\n }\n return ownCache;\n }\n\n /**\n * Check if this object or a child object will cast a shadow\n * @return {Boolean}\n */\n willDrawShadow() {\n if (super.willDrawShadow()) {\n return true;\n }\n for (let i = 0; i < this._objects.length; i++) {\n if (this._objects[i].willDrawShadow()) {\n return true;\n }\n }\n return false;\n }\n\n /**\n * Check if instance or its group are caching, recursively up\n * @return {Boolean}\n */\n isOnACache(): boolean {\n return this.ownCaching || (!!this.parent && this.parent.isOnACache());\n }\n\n /**\n * Execute the drawing operation for an object on a specified context\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n drawObject(\n ctx: CanvasRenderingContext2D,\n forClipping: boolean | undefined,\n context: DrawContext,\n ) {\n this._renderBackground(ctx);\n for (let i = 0; i < this._objects.length; i++) {\n const obj = this._objects[i];\n // TODO: handle rendering edge case somehow\n if (this.canvas?.preserveObjectStacking && obj.group !== this) {\n ctx.save();\n ctx.transform(...invertTransform(this.calcTransformMatrix()));\n obj.render(ctx);\n ctx.restore();\n } else if (obj.group === this) {\n obj.render(ctx);\n }\n }\n this._drawClipPath(ctx, this.clipPath, context);\n }\n\n /**\n * @override\n * @return {Boolean}\n */\n setCoords() {\n super.setCoords();\n this._shouldSetNestedCoords() &&\n this.forEachObject((object) => object.setCoords());\n }\n\n triggerLayout(options: ImperativeLayoutOptions = {}) {\n this.layoutManager.performLayout({\n target: this,\n type: LAYOUT_TYPE_IMPERATIVE,\n ...options,\n });\n }\n\n /**\n * Renders instance on a given context\n * @param {CanvasRenderingContext2D} ctx context to render instance on\n */\n render(ctx: CanvasRenderingContext2D) {\n this._transformDone = true;\n super.render(ctx);\n this._transformDone = false;\n }\n\n /**\n *\n * @private\n * @param {'toObject'|'toDatalessObject'} [method]\n * @param {string[]} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @returns {FabricObject[]} serialized objects\n */\n __serializeObjects(\n method: 'toObject' | 'toDatalessObject',\n propertiesToInclude?: string[],\n ) {\n const _includeDefaultValues = this.includeDefaultValues;\n return this._objects\n .filter(function (obj) {\n return !obj.excludeFromExport;\n })\n .map(function (obj) {\n const originalDefaults = obj.includeDefaultValues;\n obj.includeDefaultValues = _includeDefaultValues;\n const data = obj[method || 'toObject'](propertiesToInclude);\n obj.includeDefaultValues = originalDefaults;\n // delete data.version;\n return data;\n });\n }\n\n /**\n * Returns object representation of an instance\n * @param {string[]} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} object representation of an instance\n */\n toObject<\n T extends Omit<\n GroupProps & TClassProperties,\n keyof SerializedGroupProps\n >,\n K extends keyof T = never,\n >(propertiesToInclude: K[] = []): Pick & SerializedGroupProps {\n const layoutManager = this.layoutManager.toObject();\n\n return {\n ...super.toObject([\n 'subTargetCheck',\n 'interactive',\n ...propertiesToInclude,\n ]),\n ...(layoutManager.strategy !== 'fit-content' || this.includeDefaultValues\n ? { layoutManager }\n : {}),\n objects: this.__serializeObjects(\n 'toObject',\n propertiesToInclude as string[],\n ),\n };\n }\n\n toString() {\n return `#`;\n }\n\n dispose() {\n this.layoutManager.unsubscribeTargets({\n targets: this.getObjects(),\n target: this,\n });\n this._activeObjects = [];\n this.forEachObject((object) => {\n this._watchObject(false, object);\n object.dispose();\n });\n super.dispose();\n }\n\n /**\n * @private\n */\n _createSVGBgRect(reviver?: TSVGReviver) {\n if (!this.backgroundColor) {\n return '';\n }\n const fillStroke = Rect.prototype._toSVG.call(this);\n const commons = fillStroke.indexOf('COMMON_PARTS');\n fillStroke[commons] = 'for=\"group\" ';\n const markup = fillStroke.join('');\n return reviver ? reviver(markup) : markup;\n }\n\n /**\n * Returns svg representation of an instance\n * @param {TSVGReviver} [reviver] Method for further parsing of svg representation.\n * @return {String} svg representation of an instance\n */\n _toSVG(reviver?: TSVGReviver) {\n const svgString = ['\\n'];\n const bg = this._createSVGBgRect(reviver);\n bg && svgString.push('\\t\\t', bg);\n for (let i = 0; i < this._objects.length; i++) {\n svgString.push('\\t\\t', this._objects[i].toSVG(reviver));\n }\n svgString.push('\\n');\n return svgString;\n }\n\n /**\n * Returns styles-string for svg-export, specific version for group\n * @return {String}\n */\n getSvgStyles(): string {\n const opacity =\n typeof this.opacity !== 'undefined' && this.opacity !== 1\n ? `opacity: ${this.opacity};`\n : '',\n visibility = this.visible ? '' : ' visibility: hidden;';\n return [opacity, this.getSvgFilter(), visibility].join('');\n }\n\n /**\n * Returns svg clipPath representation of an instance\n * @param {Function} [reviver] Method for further parsing of svg representation.\n * @return {String} svg representation of an instance\n */\n toClipPathSVG(reviver?: TSVGReviver): string {\n const svgString = [];\n const bg = this._createSVGBgRect(reviver);\n bg && svgString.push('\\t', bg);\n for (let i = 0; i < this._objects.length; i++) {\n svgString.push('\\t', this._objects[i].toClipPathSVG(reviver));\n }\n return this._createBaseClipPathSVGMarkup(svgString, {\n reviver,\n });\n }\n\n /**\n * @todo support loading from svg\n * @private\n * @param {Object} object Object to create a group from\n * @returns {Promise}\n */\n static fromObject>(\n { type, objects = [], layoutManager, ...options }: T,\n abortable?: Abortable,\n ) {\n return Promise.all([\n enlivenObjects(objects, abortable),\n enlivenObjectEnlivables(options, abortable),\n ]).then(([objects, hydratedOptions]) => {\n const group = new this(objects, {\n ...options,\n ...hydratedOptions,\n layoutManager: new NoopLayoutManager(),\n });\n if (layoutManager) {\n const layoutClass = classRegistry.getClass(\n layoutManager.type,\n );\n const strategyClass = classRegistry.getClass(\n layoutManager.strategy,\n );\n group.layoutManager = new layoutClass(new strategyClass());\n } else {\n group.layoutManager = new LayoutManager();\n }\n group.layoutManager.subscribeTargets({\n type: LAYOUT_TYPE_INITIALIZATION,\n target: group,\n targets: group.getObjects(),\n });\n group.setCoords();\n return group;\n });\n }\n}\n\nclassRegistry.setClass(Group);\n","import type { GroupProps } from '../../shapes/Group';\nimport { Group } from '../../shapes/Group';\nimport type { FabricObject } from '../../shapes/Object/FabricObject';\n\n/**\n * TODO experiment with different layout manager and svg results ( fixed fit content )\n * Groups SVG elements (usually those retrieved from SVG document)\n * @param {FabricObject[]} elements FabricObject(s) parsed from svg, to group\n * @return {FabricObject | Group}\n */\nexport const groupSVGElements = (\n elements: FabricObject[],\n options?: Partial,\n) => {\n if (elements && elements.length === 1) {\n return elements[0];\n }\n return new Group(elements, options);\n};\n","import type { TSize } from '../../typedefs';\n\n/**\n * Finds the scale for the object source to fit inside the object destination,\n * keeping aspect ratio intact.\n * respect the total allowed area for the cache.\n * @param {TSize} source natural unscaled size of the object\n * @param {TSize} destination natural unscaled size of the object\n * @return {Number} scale factor to apply to source to fit into destination\n */\nexport const findScaleToFit = (source: TSize, destination: TSize) =>\n Math.min(\n destination.width / source.width,\n destination.height / source.height,\n );\n\n/**\n * Finds the scale for the object source to cover entirely the object destination,\n * keeping aspect ratio intact.\n * respect the total allowed area for the cache.\n * @param {TSize} source natural unscaled size of the object\n * @param {TSize} destination natural unscaled size of the object\n * @return {Number} scale factor to apply to source to cover destination\n */\nexport const findScaleToCover = (source: TSize, destination: TSize) =>\n Math.max(\n destination.width / source.width,\n destination.height / source.height,\n );\n","import { reNum } from '../../parser/constants';\n\nconst commaWsp = `\\\\s*,?\\\\s*`;\n\n/**\n * p for param\n * using \"bad naming\" here because it makes the regex much easier to read\n * p is a number that is preceded by an arbitary number of spaces, maybe 0,\n * a comma or not, and then possibly more spaces or not.\n */\nconst p = `${commaWsp}(${reNum})`;\n\n// const reMoveToCommand = `(M) ?(?:${p}${p} ?)+`;\n\n// const reLineCommand = `(L) ?(?:${p}${p} ?)+`;\n\n// const reHorizontalLineCommand = `(H) ?(?:${p} ?)+`;\n\n// const reVerticalLineCommand = `(V) ?(?:${p} ?)+`;\n\n// const reClosePathCommand = String.raw`(Z)\\s*`;\n\n// const reCubicCurveCommand = `(C) ?(?:${p}${p}${p}${p}${p}${p} ?)+`;\n\n// const reCubicCurveShortcutCommand = `(S) ?(?:${p}${p}${p}${p} ?)+`;\n\n// const reQuadraticCurveCommand = `(Q) ?(?:${p}${p}${p}${p} ?)+`;\n\n// const reQuadraticCurveShortcutCommand = `(T) ?(?:${p}${p} ?)+`;\n\nexport const reArcCommandPoints = `${p}${p}${p}${commaWsp}([01])${commaWsp}([01])${p}${p}`;\n// const reArcCommand = `(A) ?(?:${reArcCommandPoints} ?)+`;\n\n// export const rePathCommandGroups =\n// `(?:(?:${reMoveToCommand})` +\n// `|(?:${reLineCommand})` +\n// `|(?:${reHorizontalLineCommand})` +\n// `|(?:${reVerticalLineCommand})` +\n// `|(?:${reClosePathCommand})` +\n// `|(?:${reCubicCurveCommand})` +\n// `|(?:${reCubicCurveShortcutCommand})` +\n// `|(?:${reQuadraticCurveCommand})` +\n// `|(?:${reQuadraticCurveShortcutCommand})` +\n// `|(?:${reArcCommand}))`;\n\nexport const rePathCommand = '[mzlhvcsqta][^mzlhvcsqta]*';\n","import { cache } from '../../cache';\nimport { config } from '../../config';\nimport { halfPI, PiBy180 } from '../../constants';\nimport type { TMat2D, TRadian, TRectBounds } from '../../typedefs';\nimport { cos } from '../misc/cos';\nimport { multiplyTransformMatrices, transformPoint } from '../misc/matrix';\nimport { sin } from '../misc/sin';\nimport { toFixed } from '../misc/toFixed';\nimport type {\n TCurveInfo,\n TComplexPathData,\n TParsedAbsoluteCubicCurveCommand,\n TPathSegmentInfo,\n TPointAngle,\n TSimpleParsedCommand,\n TSimplePathData,\n TPathSegmentCommandInfo,\n TComplexParsedCommand,\n TPathSegmentInfoCommon,\n TEndPathInfo,\n TParsedArcCommand,\n TComplexParsedCommandType,\n} from './typedefs';\nimport type { XY } from '../../Point';\nimport { Point } from '../../Point';\nimport { reArcCommandPoints, rePathCommand } from './regex';\nimport { reNum } from '../../parser/constants';\n\n/**\n * Commands that may be repeated\n */\nconst repeatedCommands: Record = {\n m: 'l',\n M: 'L',\n};\n\n/**\n * Convert an arc of a rotated ellipse to a Bezier Curve\n * @param {TRadian} theta1 start of the arc\n * @param {TRadian} theta2 end of the arc\n * @param cosTh cosine of the angle of rotation\n * @param sinTh sine of the angle of rotation\n * @param rx x-axis radius (before rotation)\n * @param ry y-axis radius (before rotation)\n * @param cx1 center x of the ellipse\n * @param cy1 center y of the ellipse\n * @param mT\n * @param fromX starting point of arc x\n * @param fromY starting point of arc y\n */\nconst segmentToBezier = (\n theta1: TRadian,\n theta2: TRadian,\n cosTh: number,\n sinTh: number,\n rx: number,\n ry: number,\n cx1: number,\n cy1: number,\n mT: number,\n fromX: number,\n fromY: number,\n): TParsedAbsoluteCubicCurveCommand => {\n const costh1 = cos(theta1),\n sinth1 = sin(theta1),\n costh2 = cos(theta2),\n sinth2 = sin(theta2),\n toX = cosTh * rx * costh2 - sinTh * ry * sinth2 + cx1,\n toY = sinTh * rx * costh2 + cosTh * ry * sinth2 + cy1,\n cp1X = fromX + mT * (-cosTh * rx * sinth1 - sinTh * ry * costh1),\n cp1Y = fromY + mT * (-sinTh * rx * sinth1 + cosTh * ry * costh1),\n cp2X = toX + mT * (cosTh * rx * sinth2 + sinTh * ry * costh2),\n cp2Y = toY + mT * (sinTh * rx * sinth2 - cosTh * ry * costh2);\n\n return ['C', cp1X, cp1Y, cp2X, cp2Y, toX, toY];\n};\n\n/**\n * Adapted from {@link http://dxr.mozilla.org/mozilla-central/source/dom/svg/SVGPathDataParser.cpp}\n * by Andrea Bogazzi code is under MPL. if you don't have a copy of the license you can take it here\n * http://mozilla.org/MPL/2.0/\n * @param toX\n * @param toY\n * @param rx\n * @param ry\n * @param {number} large 0 or 1 flag\n * @param {number} sweep 0 or 1 flag\n * @param rotateX\n */\nconst arcToSegments = (\n toX: number,\n toY: number,\n rx: number,\n ry: number,\n large: number,\n sweep: number,\n rotateX: TRadian,\n): TParsedAbsoluteCubicCurveCommand[] => {\n if (rx === 0 || ry === 0) {\n return [];\n }\n let fromX = 0,\n fromY = 0,\n root = 0;\n const PI = Math.PI,\n theta = rotateX * PiBy180,\n sinTheta = sin(theta),\n cosTh = cos(theta),\n px = 0.5 * (-cosTh * toX - sinTheta * toY),\n py = 0.5 * (-cosTh * toY + sinTheta * toX),\n rx2 = rx ** 2,\n ry2 = ry ** 2,\n py2 = py ** 2,\n px2 = px ** 2,\n pl = rx2 * ry2 - rx2 * py2 - ry2 * px2;\n let _rx = Math.abs(rx);\n let _ry = Math.abs(ry);\n\n if (pl < 0) {\n const s = Math.sqrt(1 - pl / (rx2 * ry2));\n _rx *= s;\n _ry *= s;\n } else {\n root =\n (large === sweep ? -1.0 : 1.0) * Math.sqrt(pl / (rx2 * py2 + ry2 * px2));\n }\n\n const cx = (root * _rx * py) / _ry,\n cy = (-root * _ry * px) / _rx,\n cx1 = cosTh * cx - sinTheta * cy + toX * 0.5,\n cy1 = sinTheta * cx + cosTh * cy + toY * 0.5;\n let mTheta = calcVectorAngle(1, 0, (px - cx) / _rx, (py - cy) / _ry);\n let dtheta = calcVectorAngle(\n (px - cx) / _rx,\n (py - cy) / _ry,\n (-px - cx) / _rx,\n (-py - cy) / _ry,\n );\n\n if (sweep === 0 && dtheta > 0) {\n dtheta -= 2 * PI;\n } else if (sweep === 1 && dtheta < 0) {\n dtheta += 2 * PI;\n }\n\n // Convert into cubic bezier segments <= 90deg\n const segments = Math.ceil(Math.abs((dtheta / PI) * 2)),\n result = [],\n mDelta = dtheta / segments,\n mT =\n ((8 / 3) * Math.sin(mDelta / 4) * Math.sin(mDelta / 4)) /\n Math.sin(mDelta / 2);\n let th3 = mTheta + mDelta;\n\n for (let i = 0; i < segments; i++) {\n result[i] = segmentToBezier(\n mTheta,\n th3,\n cosTh,\n sinTheta,\n _rx,\n _ry,\n cx1,\n cy1,\n mT,\n fromX,\n fromY,\n );\n fromX = result[i][5];\n fromY = result[i][6];\n mTheta = th3;\n th3 += mDelta;\n }\n return result;\n};\n\n/**\n * @private\n * Calculate the angle between two vectors\n * @param ux u endpoint x\n * @param uy u endpoint y\n * @param vx v endpoint x\n * @param vy v endpoint y\n */\nconst calcVectorAngle = (\n ux: number,\n uy: number,\n vx: number,\n vy: number,\n): TRadian => {\n const ta = Math.atan2(uy, ux),\n tb = Math.atan2(vy, vx);\n if (tb >= ta) {\n return tb - ta;\n } else {\n return 2 * Math.PI - (ta - tb);\n }\n};\n\n// functions for the Cubic beizer\n// taken from: https://github.com/konvajs/konva/blob/7.0.5/src/shapes/Path.ts#L350\nconst CB1 = (t: number) => t ** 3;\nconst CB2 = (t: number) => 3 * t ** 2 * (1 - t);\nconst CB3 = (t: number) => 3 * t * (1 - t) ** 2;\nconst CB4 = (t: number) => (1 - t) ** 3;\n\n/**\n * Calculate bounding box of a cubic Bezier curve\n * Taken from http://jsbin.com/ivomiq/56/edit (no credits available)\n * TODO: can we normalize this with the starting points set at 0 and then translated the bbox?\n * @param {number} begx starting point\n * @param {number} begy\n * @param {number} cp1x first control point\n * @param {number} cp1y\n * @param {number} cp2x second control point\n * @param {number} cp2y\n * @param {number} endx end of bezier\n * @param {number} endy\n * @return {TRectBounds} the rectangular bounds\n */\nexport function getBoundsOfCurve(\n begx: number,\n begy: number,\n cp1x: number,\n cp1y: number,\n cp2x: number,\n cp2y: number,\n endx: number,\n endy: number,\n): TRectBounds {\n let argsString: string;\n if (config.cachesBoundsOfCurve) {\n // eslint-disable-next-line\n argsString = [...arguments].join();\n if (cache.boundsOfCurveCache[argsString]) {\n return cache.boundsOfCurveCache[argsString];\n }\n }\n\n const sqrt = Math.sqrt,\n abs = Math.abs,\n tvalues = [],\n bounds: [[x: number, y: number], [x: number, y: number]] = [\n [0, 0],\n [0, 0],\n ];\n\n let b = 6 * begx - 12 * cp1x + 6 * cp2x;\n let a = -3 * begx + 9 * cp1x - 9 * cp2x + 3 * endx;\n let c = 3 * cp1x - 3 * begx;\n\n for (let i = 0; i < 2; ++i) {\n if (i > 0) {\n b = 6 * begy - 12 * cp1y + 6 * cp2y;\n a = -3 * begy + 9 * cp1y - 9 * cp2y + 3 * endy;\n c = 3 * cp1y - 3 * begy;\n }\n\n if (abs(a) < 1e-12) {\n if (abs(b) < 1e-12) {\n continue;\n }\n const t = -c / b;\n if (0 < t && t < 1) {\n tvalues.push(t);\n }\n continue;\n }\n const b2ac = b * b - 4 * c * a;\n if (b2ac < 0) {\n continue;\n }\n const sqrtb2ac = sqrt(b2ac);\n const t1 = (-b + sqrtb2ac) / (2 * a);\n if (0 < t1 && t1 < 1) {\n tvalues.push(t1);\n }\n const t2 = (-b - sqrtb2ac) / (2 * a);\n if (0 < t2 && t2 < 1) {\n tvalues.push(t2);\n }\n }\n\n let j = tvalues.length;\n const jlen = j;\n const iterator = getPointOnCubicBezierIterator(\n begx,\n begy,\n cp1x,\n cp1y,\n cp2x,\n cp2y,\n endx,\n endy,\n );\n while (j--) {\n const { x, y } = iterator(tvalues[j]);\n bounds[0][j] = x;\n bounds[1][j] = y;\n }\n\n bounds[0][jlen] = begx;\n bounds[1][jlen] = begy;\n bounds[0][jlen + 1] = endx;\n bounds[1][jlen + 1] = endy;\n const result: TRectBounds = [\n new Point(Math.min(...bounds[0]), Math.min(...bounds[1])),\n new Point(Math.max(...bounds[0]), Math.max(...bounds[1])),\n ];\n if (config.cachesBoundsOfCurve) {\n cache.boundsOfCurveCache[argsString!] = result;\n }\n return result;\n}\n\n/**\n * Converts arc to a bunch of cubic Bezier curves\n * @param {number} fx starting point x\n * @param {number} fy starting point y\n * @param {TParsedArcCommand} coords Arc command\n */\nexport const fromArcToBeziers = (\n fx: number,\n fy: number,\n [_, rx, ry, rot, large, sweep, tx, ty]: TParsedArcCommand,\n): TParsedAbsoluteCubicCurveCommand[] => {\n const segsNorm = arcToSegments(tx - fx, ty - fy, rx, ry, large, sweep, rot);\n\n for (let i = 0, len = segsNorm.length; i < len; i++) {\n segsNorm[i][1] += fx;\n segsNorm[i][2] += fy;\n segsNorm[i][3] += fx;\n segsNorm[i][4] += fy;\n segsNorm[i][5] += fx;\n segsNorm[i][6] += fy;\n }\n return segsNorm;\n};\n\n/**\n * This function takes a parsed SVG path and makes it simpler for fabricJS logic.\n * Simplification consist of:\n * - All commands converted to absolute (lowercase to uppercase)\n * - S converted to C\n * - T converted to Q\n * - A converted to C\n * @param {TComplexPathData} path the array of commands of a parsed SVG path for `Path`\n * @return {TSimplePathData} the simplified array of commands of a parsed SVG path for `Path`\n * TODO: figure out how to remove the type assertions in a nice way\n */\nexport const makePathSimpler = (path: TComplexPathData): TSimplePathData => {\n // x and y represent the last point of the path, AKA the previous command point.\n // we add them to each relative command to make it an absolute comment.\n // we also swap the v V h H with L, because are easier to transform.\n let x = 0,\n y = 0;\n // x1 and y1 represent the last point of the subpath. the subpath is started with\n // m or M command. When a z or Z command is drawn, x and y need to be resetted to\n // the last x1 and y1.\n let x1 = 0,\n y1 = 0;\n // previous will host the letter of the previous command, to handle S and T.\n // controlX and controlY will host the previous reflected control point\n const destinationPath: TSimplePathData = [];\n let previous,\n // placeholders\n controlX = 0,\n controlY = 0;\n for (const parsedCommand of path) {\n const current: TComplexParsedCommand = [...parsedCommand];\n let converted: TSimpleParsedCommand | undefined;\n switch (\n current[0] // first letter\n ) {\n case 'l': // lineto, relative\n current[1] += x;\n current[2] += y;\n // falls through\n case 'L':\n x = current[1];\n y = current[2];\n converted = ['L', x, y];\n break;\n case 'h': // horizontal lineto, relative\n current[1] += x;\n // falls through\n case 'H':\n x = current[1];\n converted = ['L', x, y];\n break;\n case 'v': // vertical lineto, relative\n current[1] += y;\n // falls through\n case 'V':\n y = current[1];\n converted = ['L', x, y];\n break;\n case 'm': // moveTo, relative\n current[1] += x;\n current[2] += y;\n // falls through\n case 'M':\n x = current[1];\n y = current[2];\n x1 = current[1];\n y1 = current[2];\n converted = ['M', x, y];\n break;\n case 'c': // bezierCurveTo, relative\n current[1] += x;\n current[2] += y;\n current[3] += x;\n current[4] += y;\n current[5] += x;\n current[6] += y;\n // falls through\n case 'C':\n controlX = current[3];\n controlY = current[4];\n x = current[5];\n y = current[6];\n converted = ['C', current[1], current[2], controlX, controlY, x, y];\n break;\n case 's': // shorthand cubic bezierCurveTo, relative\n current[1] += x;\n current[2] += y;\n current[3] += x;\n current[4] += y;\n // falls through\n case 'S':\n // would be sScC but since we are swapping sSc for C, we check just that.\n if (previous === 'C') {\n // calculate reflection of previous control points\n controlX = 2 * x - controlX;\n controlY = 2 * y - controlY;\n } else {\n // If there is no previous command or if the previous command was not a C, c, S, or s,\n // the control point is coincident with the current point\n controlX = x;\n controlY = y;\n }\n x = current[3];\n y = current[4];\n converted = ['C', controlX, controlY, current[1], current[2], x, y];\n // converted[3] and converted[4] are NOW the second control point.\n // we keep it for the next reflection.\n controlX = converted[3];\n controlY = converted[4];\n break;\n case 'q': // quadraticCurveTo, relative\n current[1] += x;\n current[2] += y;\n current[3] += x;\n current[4] += y;\n // falls through\n case 'Q':\n controlX = current[1];\n controlY = current[2];\n x = current[3];\n y = current[4];\n converted = ['Q', controlX, controlY, x, y];\n break;\n case 't': // shorthand quadraticCurveTo, relative\n current[1] += x;\n current[2] += y;\n // falls through\n case 'T':\n if (previous === 'Q') {\n // calculate reflection of previous control point\n controlX = 2 * x - controlX;\n controlY = 2 * y - controlY;\n } else {\n // If there is no previous command or if the previous command was not a Q, q, T or t,\n // assume the control point is coincident with the current point\n controlX = x;\n controlY = y;\n }\n x = current[1];\n y = current[2];\n converted = ['Q', controlX, controlY, x, y];\n break;\n case 'a':\n current[6] += x;\n current[7] += y;\n // falls through\n case 'A':\n fromArcToBeziers(x, y, current).forEach((b) => destinationPath.push(b));\n x = current[6];\n y = current[7];\n break;\n case 'z':\n case 'Z':\n x = x1;\n y = y1;\n converted = ['Z'];\n break;\n default:\n }\n if (converted) {\n destinationPath.push(converted);\n previous = converted[0];\n } else {\n previous = '';\n }\n }\n return destinationPath;\n};\n\n// todo verify if we can just use the point class here\n/**\n * Calc length from point x1,y1 to x2,y2\n * @param {number} x1 starting point x\n * @param {number} y1 starting point y\n * @param {number} x2 starting point x\n * @param {number} y2 starting point y\n * @return {number} length of segment\n */\nconst calcLineLength = (\n x1: number,\n y1: number,\n x2: number,\n y2: number,\n): number => Math.sqrt((x2 - x1) ** 2 + (y2 - y1) ** 2);\n\n/**\n * Get an iterator that takes a percentage and returns a point\n * @param {number} begx\n * @param {number} begy\n * @param {number} cp1x\n * @param {number} cp1y\n * @param {number} cp2x\n * @param {number} cp2y\n * @param {number} endx\n * @param {number} endy\n */\nconst getPointOnCubicBezierIterator =\n (\n begx: number,\n begy: number,\n cp1x: number,\n cp1y: number,\n cp2x: number,\n cp2y: number,\n endx: number,\n endy: number,\n ) =>\n (pct: number) => {\n const c1 = CB1(pct),\n c2 = CB2(pct),\n c3 = CB3(pct),\n c4 = CB4(pct);\n return new Point(\n endx * c1 + cp2x * c2 + cp1x * c3 + begx * c4,\n endy * c1 + cp2y * c2 + cp1y * c3 + begy * c4,\n );\n };\n\nconst QB1 = (t: number) => t ** 2;\nconst QB2 = (t: number) => 2 * t * (1 - t);\nconst QB3 = (t: number) => (1 - t) ** 2;\n\nconst getTangentCubicIterator =\n (\n p1x: number,\n p1y: number,\n p2x: number,\n p2y: number,\n p3x: number,\n p3y: number,\n p4x: number,\n p4y: number,\n ) =>\n (pct: number) => {\n const qb1 = QB1(pct),\n qb2 = QB2(pct),\n qb3 = QB3(pct),\n tangentX =\n 3 * (qb3 * (p2x - p1x) + qb2 * (p3x - p2x) + qb1 * (p4x - p3x)),\n tangentY =\n 3 * (qb3 * (p2y - p1y) + qb2 * (p3y - p2y) + qb1 * (p4y - p3y));\n return Math.atan2(tangentY, tangentX);\n };\n\nconst getPointOnQuadraticBezierIterator =\n (\n p1x: number,\n p1y: number,\n p2x: number,\n p2y: number,\n p3x: number,\n p3y: number,\n ) =>\n (pct: number) => {\n const c1 = QB1(pct),\n c2 = QB2(pct),\n c3 = QB3(pct);\n return new Point(\n p3x * c1 + p2x * c2 + p1x * c3,\n p3y * c1 + p2y * c2 + p1y * c3,\n );\n };\n\nconst getTangentQuadraticIterator =\n (\n p1x: number,\n p1y: number,\n p2x: number,\n p2y: number,\n p3x: number,\n p3y: number,\n ) =>\n (pct: number) => {\n const invT = 1 - pct,\n tangentX = 2 * (invT * (p2x - p1x) + pct * (p3x - p2x)),\n tangentY = 2 * (invT * (p2y - p1y) + pct * (p3y - p2y));\n return Math.atan2(tangentY, tangentX);\n };\n\n// this will run over a path segment (a cubic or quadratic segment) and approximate it\n// with 100 segments. This will good enough to calculate the length of the curve\nconst pathIterator = (\n iterator: (pct: number) => Point,\n x1: number,\n y1: number,\n) => {\n let tempP = new Point(x1, y1),\n tmpLen = 0;\n for (let perc = 1; perc <= 100; perc += 1) {\n const p = iterator(perc / 100);\n tmpLen += calcLineLength(tempP.x, tempP.y, p.x, p.y);\n tempP = p;\n }\n return tmpLen;\n};\n\n/**\n * Given a pathInfo, and a distance in pixels, find the percentage from 0 to 1\n * that correspond to that pixels run over the path.\n * The percentage will be then used to find the correct point on the canvas for the path.\n * @param {Array} segInfo fabricJS collection of information on a parsed path\n * @param {number} distance from starting point, in pixels.\n * @return {TPointAngle} info object with x and y ( the point on canvas ) and angle, the tangent on that point;\n */\nconst findPercentageForDistance = (\n segInfo: TCurveInfo<'Q' | 'C'>,\n distance: number,\n): TPointAngle => {\n let perc = 0,\n tmpLen = 0,\n tempP: XY = { x: segInfo.x, y: segInfo.y },\n p: XY = { ...tempP },\n nextLen: number,\n nextStep = 0.01,\n lastPerc = 0;\n // nextStep > 0.0001 covers 0.00015625 that 1/64th of 1/100\n // the path\n const iterator = segInfo.iterator,\n angleFinder = segInfo.angleFinder;\n while (tmpLen < distance && nextStep > 0.0001) {\n p = iterator(perc);\n lastPerc = perc;\n nextLen = calcLineLength(tempP.x, tempP.y, p.x, p.y);\n // compare tmpLen each cycle with distance, decide next perc to test.\n if (nextLen + tmpLen > distance) {\n // we discard this step and we make smaller steps.\n perc -= nextStep;\n nextStep /= 2;\n } else {\n tempP = p;\n perc += nextStep;\n tmpLen += nextLen;\n }\n }\n return { ...p, angle: angleFinder(lastPerc) };\n};\n\n/**\n * Run over a parsed and simplified path and extract some information (length of each command and starting point)\n * @param {TSimplePathData} path parsed path commands\n * @return {TPathSegmentInfo[]} path commands information\n */\nexport const getPathSegmentsInfo = (\n path: TSimplePathData,\n): TPathSegmentInfo[] => {\n let totalLength = 0,\n //x2 and y2 are the coords of segment start\n //x1 and y1 are the coords of the current point\n x1 = 0,\n y1 = 0,\n x2 = 0,\n y2 = 0,\n iterator,\n tempInfo: TPathSegmentInfo;\n const info: TPathSegmentInfo[] = [];\n for (const current of path) {\n const basicInfo: TPathSegmentInfoCommon = {\n x: x1,\n y: y1,\n command: current[0],\n length: 0,\n };\n switch (\n current[0] //first letter\n ) {\n case 'M':\n tempInfo = >basicInfo;\n tempInfo.x = x2 = x1 = current[1];\n tempInfo.y = y2 = y1 = current[2];\n break;\n case 'L':\n tempInfo = >basicInfo;\n tempInfo.length = calcLineLength(x1, y1, current[1], current[2]);\n x1 = current[1];\n y1 = current[2];\n break;\n case 'C':\n iterator = getPointOnCubicBezierIterator(\n x1,\n y1,\n current[1],\n current[2],\n current[3],\n current[4],\n current[5],\n current[6],\n );\n tempInfo = >basicInfo;\n tempInfo.iterator = iterator;\n tempInfo.angleFinder = getTangentCubicIterator(\n x1,\n y1,\n current[1],\n current[2],\n current[3],\n current[4],\n current[5],\n current[6],\n );\n tempInfo.length = pathIterator(iterator, x1, y1);\n\n x1 = current[5];\n y1 = current[6];\n break;\n case 'Q':\n iterator = getPointOnQuadraticBezierIterator(\n x1,\n y1,\n current[1],\n current[2],\n current[3],\n current[4],\n );\n tempInfo = >basicInfo;\n tempInfo.iterator = iterator;\n tempInfo.angleFinder = getTangentQuadraticIterator(\n x1,\n y1,\n current[1],\n current[2],\n current[3],\n current[4],\n );\n tempInfo.length = pathIterator(iterator, x1, y1);\n x1 = current[3];\n y1 = current[4];\n break;\n case 'Z':\n // we add those in order to ease calculations later\n tempInfo = basicInfo;\n tempInfo.destX = x2;\n tempInfo.destY = y2;\n tempInfo.length = calcLineLength(x1, y1, x2, y2);\n x1 = x2;\n y1 = y2;\n break;\n }\n totalLength += tempInfo.length;\n info.push(tempInfo);\n }\n info.push({ length: totalLength, x: x1, y: y1 });\n return info;\n};\n\n/**\n * Get the point on the path that is distance along the path\n * @param path\n * @param distance\n * @param infos\n */\nexport const getPointOnPath = (\n path: TSimplePathData,\n distance: number,\n infos: TPathSegmentInfo[] = getPathSegmentsInfo(path),\n): TPointAngle | undefined => {\n let i = 0;\n while (distance - infos[i].length > 0 && i < infos.length - 2) {\n distance -= infos[i].length;\n i++;\n }\n const segInfo = infos[i],\n segPercent = distance / segInfo.length,\n segment = path[i];\n\n switch (segInfo.command) {\n case 'M':\n return { x: segInfo.x, y: segInfo.y, angle: 0 };\n case 'Z':\n return {\n ...new Point(segInfo.x, segInfo.y).lerp(\n new Point(segInfo.destX, segInfo.destY),\n segPercent,\n ),\n angle: Math.atan2(segInfo.destY - segInfo.y, segInfo.destX - segInfo.x),\n };\n case 'L':\n return {\n ...new Point(segInfo.x, segInfo.y).lerp(\n new Point(segment[1]!, segment[2]!),\n segPercent,\n ),\n angle: Math.atan2(segment[2]! - segInfo.y, segment[1]! - segInfo.x),\n };\n case 'C':\n return findPercentageForDistance(segInfo, distance);\n case 'Q':\n return findPercentageForDistance(segInfo, distance);\n default:\n // throw Error('Invalid command');\n }\n};\n\nconst rePathCmdAll = new RegExp(rePathCommand, 'gi');\nconst regExpArcCommandPoints = new RegExp(reArcCommandPoints, 'g');\nconst reMyNum = new RegExp(reNum, 'gi');\nconst commandLengths = {\n m: 2,\n l: 2,\n h: 1,\n v: 1,\n c: 6,\n s: 4,\n q: 4,\n t: 2,\n a: 7,\n} as const;\n/**\n *\n * @param {string} pathString\n * @return {TComplexPathData} An array of SVG path commands\n * @example Usage\n * parsePath('M 3 4 Q 3 5 2 1 4 0 Q 9 12 2 1 4 0') === [\n * ['M', 3, 4],\n * ['Q', 3, 5, 2, 1, 4, 0],\n * ['Q', 9, 12, 2, 1, 4, 0],\n * ];\n */\nexport const parsePath = (pathString: string): TComplexPathData => {\n const chain: TComplexPathData = [];\n const all = pathString.match(rePathCmdAll) ?? [];\n for (const matchStr of all) {\n // take match string and save the first letter as the command\n const commandLetter = matchStr[0] as TComplexParsedCommandType;\n // in case of Z we have very little to do\n if (commandLetter === 'z' || commandLetter === 'Z') {\n chain.push([commandLetter]);\n continue;\n }\n const commandLength =\n commandLengths[\n commandLetter.toLowerCase() as keyof typeof commandLengths\n ];\n\n let paramArr = [];\n if (commandLetter === 'a' || commandLetter === 'A') {\n // the arc command ha some peculariaties that requires a special regex other than numbers\n // it is possible to avoid using a space between the sweep and large arc flags, making them either\n // 00, 01, 10 or 11, making them identical to a plain number for the regex reMyNum\n // reset the regexp\n regExpArcCommandPoints.lastIndex = 0;\n for (let out = null; (out = regExpArcCommandPoints.exec(matchStr)); ) {\n paramArr.push(...out.slice(1));\n }\n } else {\n paramArr = matchStr.match(reMyNum) || [];\n }\n\n // inspect the length of paramArr, if is longer than commandLength\n // we are dealing with repeated commands\n for (let i = 0; i < paramArr.length; i += commandLength) {\n const newCommand = new Array(commandLength) as TComplexParsedCommand;\n const transformedCommand = repeatedCommands[commandLetter];\n newCommand[0] =\n i > 0 && transformedCommand ? transformedCommand : commandLetter;\n for (let j = 0; j < commandLength; j++) {\n newCommand[j + 1] = parseFloat(paramArr[i + j]);\n }\n chain.push(newCommand);\n }\n }\n return chain;\n};\n\n/**\n *\n * Converts points to a smooth SVG path\n * @param {XY[]} points Array of points\n * @param {number} [correction] Apply a correction to the path (usually we use `width / 1000`). If value is undefined 0 is used as the correction value.\n * @return {(string|number)[][]} An array of SVG path commands\n */\nexport const getSmoothPathFromPoints = (\n points: Point[],\n correction = 0,\n): TSimplePathData => {\n let p1 = new Point(points[0]),\n p2 = new Point(points[1]),\n multSignX = 1,\n multSignY = 0;\n const path: TSimplePathData = [],\n len = points.length,\n manyPoints = len > 2;\n\n if (manyPoints) {\n multSignX = points[2].x < p2.x ? -1 : points[2].x === p2.x ? 0 : 1;\n multSignY = points[2].y < p2.y ? -1 : points[2].y === p2.y ? 0 : 1;\n }\n path.push([\n 'M',\n p1.x - multSignX * correction,\n p1.y - multSignY * correction,\n ]);\n let i;\n for (i = 1; i < len; i++) {\n if (!p1.eq(p2)) {\n const midPoint = p1.midPointFrom(p2);\n // p1 is our bezier control point\n // midpoint is our endpoint\n // start point is p(i-1) value.\n path.push(['Q', p1.x, p1.y, midPoint.x, midPoint.y]);\n }\n p1 = points[i];\n if (i + 1 < points.length) {\n p2 = points[i + 1];\n }\n }\n if (manyPoints) {\n multSignX = p1.x > points[i - 2].x ? 1 : p1.x === points[i - 2].x ? 0 : -1;\n multSignY = p1.y > points[i - 2].y ? 1 : p1.y === points[i - 2].y ? 0 : -1;\n }\n path.push([\n 'L',\n p1.x + multSignX * correction,\n p1.y + multSignY * correction,\n ]);\n return path;\n};\n\n/**\n * Transform a path by transforming each segment.\n * it has to be a simplified path or it won't work.\n * WARNING: this depends from pathOffset for correct operation\n * @param {TSimplePathData} path fabricJS parsed and simplified path commands\n * @param {TMat2D} transform matrix that represent the transformation\n * @param {Point} [pathOffset] `Path.pathOffset`\n * @returns {TSimplePathData} the transformed path\n */\nexport const transformPath = (\n path: TSimplePathData,\n transform: TMat2D,\n pathOffset: Point,\n): TSimplePathData => {\n if (pathOffset) {\n transform = multiplyTransformMatrices(transform, [\n 1,\n 0,\n 0,\n 1,\n -pathOffset.x,\n -pathOffset.y,\n ]);\n }\n return path.map((pathSegment) => {\n const newSegment: TSimpleParsedCommand = [...pathSegment];\n for (let i = 1; i < pathSegment.length - 1; i += 2) {\n // TODO: is there a way to get around casting to any?\n const { x, y } = transformPoint(\n {\n x: pathSegment[i] as number,\n y: pathSegment[i + 1] as number,\n },\n transform,\n );\n newSegment[i] = x;\n newSegment[i + 1] = y;\n }\n return newSegment;\n });\n};\n\n/**\n * Returns an array of path commands to create a regular polygon\n * @param {number} numVertexes\n * @param {number} radius\n * @returns {TSimplePathData} An array of SVG path commands\n */\nexport const getRegularPolygonPath = (\n numVertexes: number,\n radius: number,\n): TSimplePathData => {\n const interiorAngle = (Math.PI * 2) / numVertexes;\n // rotationAdjustment rotates the path by 1/2 the interior angle so that the polygon always has a flat side on the bottom\n // This isn't strictly necessary, but it's how we tend to think of and expect polygons to be drawn\n let rotationAdjustment = -halfPI;\n if (numVertexes % 2 === 0) {\n rotationAdjustment += interiorAngle / 2;\n }\n const d = new Array(numVertexes + 1);\n for (let i = 0; i < numVertexes; i++) {\n const rad = i * interiorAngle + rotationAdjustment;\n const { x, y } = new Point(cos(rad), sin(rad)).scalarMultiply(radius);\n d[i] = [i === 0 ? 'M' : 'L', x, y];\n }\n d[numVertexes] = ['Z'];\n return d;\n};\n\n/**\n * Join path commands to go back to svg format\n * @param {TSimplePathData} pathData fabricJS parsed path commands\n * @param {number} fractionDigits number of fraction digits to \"leave\"\n * @return {String} joined path 'M 0 0 L 20 30'\n */\nexport const joinPath = (pathData: TSimplePathData, fractionDigits?: number) =>\n pathData\n .map((segment) => {\n return segment\n .map((arg, i) => {\n if (i === 0) return arg;\n return fractionDigits === undefined\n ? arg\n : toFixed(arg, fractionDigits);\n })\n .join(' ');\n })\n .join(' ');\n","/**\n * Returns random number between 2 specified ones.\n * @param {Number} min lower limit\n * @param {Number} max upper limit\n * @return {Number} random value (between min and max)\n */\nexport const getRandomInt = (min: number, max: number): number =>\n Math.floor(Math.random() * (max - min + 1)) + min;\n","import { CENTER, SCALE_X, SCALE_Y } from '../constants';\nimport type { FabricImage } from '../shapes/Image';\nimport type { FabricObject } from '../shapes/Object/FabricObject';\nimport type { TMat2D } from '../typedefs';\nimport { qrDecompose } from './misc/matrix';\n\ntype FabricObjectWithTransformMatrix = FabricObject & {\n transformMatrix?: TMat2D;\n};\n\n/**\n * This function is an helper for svg import. it decompose the transformMatrix\n * and assign properties to object.\n * untransformed coordinates\n * @private\n */\nconst _assignTransformMatrixProps = (\n object: FabricObjectWithTransformMatrix,\n) => {\n if (object.transformMatrix) {\n const { scaleX, scaleY, angle, skewX } = qrDecompose(\n object.transformMatrix,\n );\n object.flipX = false;\n object.flipY = false;\n object.set(SCALE_X, scaleX);\n object.set(SCALE_Y, scaleY);\n object.angle = angle;\n object.skewX = skewX;\n object.skewY = 0;\n }\n};\n\n/**\n * This function is an helper for svg import. it removes the transform matrix\n * and set to object properties that fabricjs can handle\n * @private\n * @param {Object} preserveAspectRatioOptions\n */\nexport const removeTransformMatrixForSvgParsing = (\n object: FabricObjectWithTransformMatrix,\n preserveAspectRatioOptions?: any,\n) => {\n let center = object._findCenterFromElement();\n if (object.transformMatrix) {\n _assignTransformMatrixProps(object);\n center = center.transform(object.transformMatrix);\n }\n delete object.transformMatrix;\n if (preserveAspectRatioOptions) {\n object.scaleX *= preserveAspectRatioOptions.scaleX;\n object.scaleY *= preserveAspectRatioOptions.scaleY;\n (object as FabricImage).cropX = preserveAspectRatioOptions.cropX;\n (object as FabricImage).cropY = preserveAspectRatioOptions.cropY;\n center.x += preserveAspectRatioOptions.offsetLeft;\n center.y += preserveAspectRatioOptions.offsetTop;\n object.width = preserveAspectRatioOptions.width;\n object.height = preserveAspectRatioOptions.height;\n }\n object.setPositionByOrigin(center, CENTER, CENTER);\n};\n","import type { FabricObject } from '../../shapes/Object/FabricObject';\nimport { sendObjectToPlane } from './planeChange';\nimport { Group } from '../../shapes/Group';\n/**\n * Merges 2 clip paths into one visually equal clip path\n *\n * **IMPORTANT**:\\\n * Does **NOT** clone the arguments, clone them proir if necessary.\n *\n * Creates a wrapper (group) that contains one clip path and is clipped by the other so content is kept where both overlap.\n * Use this method if both the clip paths may have nested clip paths of their own, so assigning one to the other's clip path property is not possible.\n *\n * In order to handle the `inverted` property we follow logic described in the following cases:\\\n * **(1)** both clip paths are inverted - the clip paths pass the inverted prop to the wrapper and loose it themselves.\\\n * **(2)** one is inverted and the other isn't - the wrapper shouldn't become inverted and the inverted clip path must clip the non inverted one to produce an identical visual effect.\\\n * **(3)** both clip paths are not inverted - wrapper and clip paths remain unchanged.\n *\n * @param {fabric.Object} c1\n * @param {fabric.Object} c2\n * @returns {fabric.Object} merged clip path\n */\nexport const mergeClipPaths = (c1: FabricObject, c2: FabricObject) => {\n let a = c1,\n b = c2;\n if (a.inverted && !b.inverted) {\n // case (2)\n a = c2;\n b = c1;\n }\n // `b` becomes `a`'s clip path so we transform `b` to `a` coordinate plane\n sendObjectToPlane(b, b.group?.calcTransformMatrix(), a.calcTransformMatrix());\n // assign the `inverted` prop to the wrapping group\n const inverted = a.inverted && b.inverted;\n if (inverted) {\n // case (1)\n a.inverted = b.inverted = false;\n }\n return new Group([a], { clipPath: b, inverted });\n};\n","// TODO this file needs to go away, cross browser style support is not fabricjs domain.\n\n/**\n * wrapper for setting element's style\n * @param {HTMLElement} element an HTMLElement\n * @param {Object} styles to apply to element\n */\nexport function setStyle(element: HTMLElement, styles: Record) {\n const elementStyle = element.style;\n if (!elementStyle) {\n return;\n }\n Object.entries(styles).forEach(([property, value]) =>\n elementStyle.setProperty(property, value),\n );\n}\n","import { getEnv, getFabricDocument } from '../../env';\nimport type { TSize } from '../../typedefs';\nimport { createCanvasElement } from '../../util/misc/dom';\nimport { setStyle } from '../../util/internals/dom_style';\nimport type { CSSDimensions } from './util';\nimport { makeElementUnselectable, setCSSDimensions } from './util';\nimport type { CanvasItem } from './StaticCanvasDOMManager';\nimport { StaticCanvasDOMManager } from './StaticCanvasDOMManager';\nimport { setCanvasDimensions } from './util';\nimport { NONE } from '../../constants';\n\nexport class CanvasDOMManager extends StaticCanvasDOMManager {\n upper: CanvasItem;\n container: HTMLDivElement;\n\n constructor(\n arg0?: string | HTMLCanvasElement,\n {\n allowTouchScrolling = false,\n containerClass = '',\n }: {\n allowTouchScrolling?: boolean;\n /**\n * @deprecated here only for backward compatibility\n */\n containerClass?: string;\n } = {},\n ) {\n super(arg0);\n const { el: lowerCanvasEl } = this.lower;\n const upperCanvasEl = this.createUpperCanvas();\n this.upper = { el: upperCanvasEl, ctx: upperCanvasEl.getContext('2d')! };\n this.applyCanvasStyle(lowerCanvasEl, {\n allowTouchScrolling,\n });\n this.applyCanvasStyle(upperCanvasEl, {\n allowTouchScrolling,\n styles: {\n position: 'absolute',\n left: '0',\n top: '0',\n },\n });\n const container = this.createContainerElement();\n container.classList.add(containerClass);\n if (lowerCanvasEl.parentNode) {\n lowerCanvasEl.parentNode.replaceChild(container, lowerCanvasEl);\n }\n container.append(lowerCanvasEl, upperCanvasEl);\n this.container = container;\n }\n\n protected createUpperCanvas() {\n const { el: lowerCanvasEl } = this.lower;\n const el = createCanvasElement();\n // we assign the same classname of the lowerCanvas\n el.className = lowerCanvasEl.className;\n // but then we remove the lower-canvas specific className\n el.classList.remove('lower-canvas');\n // we add the specific upper-canvas class\n el.classList.add('upper-canvas');\n el.setAttribute('data-fabric', 'top');\n el.style.cssText = lowerCanvasEl.style.cssText;\n el.setAttribute('draggable', 'true');\n return el;\n }\n\n protected createContainerElement() {\n const container = getFabricDocument().createElement('div');\n container.setAttribute('data-fabric', 'wrapper');\n setStyle(container, {\n position: 'relative',\n });\n makeElementUnselectable(container);\n return container;\n }\n\n /**\n * @private\n * @param {HTMLCanvasElement} element canvas element to apply styles on\n */\n protected applyCanvasStyle(\n element: HTMLCanvasElement,\n options: {\n allowTouchScrolling?: boolean;\n styles?: Record;\n },\n ) {\n const { styles, allowTouchScrolling } = options;\n setStyle(element, {\n ...styles,\n 'touch-action': allowTouchScrolling ? 'manipulation' : NONE,\n });\n makeElementUnselectable(element);\n }\n\n setDimensions(size: TSize, retinaScaling: number) {\n super.setDimensions(size, retinaScaling);\n const { el, ctx } = this.upper;\n setCanvasDimensions(el, ctx, size, retinaScaling);\n }\n\n setCSSDimensions(size: Partial): void {\n super.setCSSDimensions(size);\n setCSSDimensions(this.upper.el, size);\n setCSSDimensions(this.container, size);\n }\n\n cleanupDOM(size: TSize) {\n const container = this.container,\n { el: lowerCanvasEl } = this.lower,\n { el: upperCanvasEl } = this.upper;\n super.cleanupDOM(size);\n container.removeChild(upperCanvasEl);\n container.removeChild(lowerCanvasEl);\n if (container.parentNode) {\n container.parentNode.replaceChild(lowerCanvasEl, container);\n }\n }\n\n dispose() {\n super.dispose();\n getEnv().dispose(this.upper.el);\n // @ts-expect-error disposing\n delete this.upper;\n // @ts-expect-error disposing\n delete this.container;\n }\n}\n","import { dragHandler } from '../controls/drag';\nimport { getActionFromCorner } from '../controls/util';\nimport { Point } from '../Point';\nimport { FabricObject } from '../shapes/Object/FabricObject';\nimport type {\n CanvasEvents,\n ModifierKey,\n TOptionalModifierKey,\n TPointerEvent,\n Transform,\n} from '../EventTypeDefs';\nimport {\n addTransformToObject,\n saveObjectTransform,\n} from '../util/misc/objectTransforms';\nimport type { TCanvasSizeOptions } from './StaticCanvas';\nimport { StaticCanvas } from './StaticCanvas';\nimport { isCollection } from '../Collection';\nimport { isTransparent } from '../util/misc/isTransparent';\nimport type {\n TMat2D,\n TOriginX,\n TOriginY,\n TSize,\n TSVGReviver,\n} from '../typedefs';\nimport { degreesToRadians } from '../util/misc/radiansDegreesConversion';\nimport { getPointer, isTouchEvent } from '../util/dom_event';\nimport type { IText } from '../shapes/IText/IText';\nimport type { BaseBrush } from '../brushes/BaseBrush';\nimport { pick } from '../util/misc/pick';\nimport { sendPointToPlane } from '../util/misc/planeChange';\nimport { cos, createCanvasElement, sin } from '../util';\nimport { CanvasDOMManager } from './DOMManagers/CanvasDOMManager';\nimport {\n BOTTOM,\n CENTER,\n LEFT,\n MODIFIED,\n RESIZING,\n RIGHT,\n ROTATE,\n SCALE,\n SCALE_X,\n SCALE_Y,\n SKEW_X,\n SKEW_Y,\n TOP,\n} from '../constants';\nimport type { CanvasOptions } from './CanvasOptions';\nimport { canvasDefaults } from './CanvasOptions';\nimport { Intersection } from '../Intersection';\nimport { isActiveSelection } from '../util/typeAssertions';\nimport { Group } from '../shapes/Group';\n\nexport type TargetsInfo = {\n target?: FabricObject;\n subTargets: FabricObject[];\n};\n\nexport type TargetsInfoWithContainer = {\n // the target we think is the most continuing the selection action.\n // could be hoveredTarget or the currently selected object\n target?: FabricObject;\n // the nested targets under the pointer for container\n subTargets: FabricObject[];\n // the container for target, or target itself if there are no selectable nested targets\n container?: FabricObject;\n};\n\nexport type FullTargetsInfoWithContainer = TargetsInfoWithContainer & {\n // hoveredTarget\n currentTarget?: FabricObject;\n // the container for hoveredTarget, or container itself\n currentContainer?: FabricObject;\n // nested targets of current container\n currentSubTargets: FabricObject[];\n};\n\n/**\n * Canvas class\n * @class Canvas\n * @extends StaticCanvas\n * @see {@link http://fabric5.fabricjs.com/fabric-intro-part-1#canvas}\n *\n * @fires object:modified at the end of a transform\n * @fires object:rotating while an object is being rotated from the control\n * @fires object:scaling while an object is being scaled by controls\n * @fires object:moving while an object is being dragged\n * @fires object:skewing while an object is being skewed from the controls\n *\n * @fires before:transform before a transform is is started\n * @fires before:selection:cleared\n * @fires selection:cleared\n * @fires selection:updated\n * @fires selection:created\n *\n * @fires path:created after a drawing operation ends and the path is added\n * @fires mouse:down\n * @fires mouse:move\n * @fires mouse:up\n * @fires mouse:down:before on mouse down, before the inner fabric logic runs\n * @fires mouse:move:before on mouse move, before the inner fabric logic runs\n * @fires mouse:up:before on mouse up, before the inner fabric logic runs\n * @fires mouse:over\n * @fires mouse:out\n * @fires mouse:dblclick whenever a native dbl click event fires on the canvas.\n *\n * @fires dragover\n * @fires dragenter\n * @fires dragleave\n * @fires drag:enter object drag enter\n * @fires drag:leave object drag leave\n * @fires drop:before before drop event. Prepare for the drop event (same native event).\n * @fires drop\n * @fires drop:after after drop event. Run logic on canvas after event has been accepted/declined (same native event).\n * @example\n * let a: fabric.Object, b: fabric.Object;\n * let flag = false;\n * canvas.add(a, b);\n * a.on('drop:before', opt => {\n * // we want a to accept the drop even though it's below b in the stack\n * flag = this.canDrop(opt.e);\n * });\n * b.canDrop = function(e) {\n * !flag && this.draggableTextDelegate.canDrop(e);\n * }\n * b.on('dragover', opt => b.set('fill', opt.dropTarget === b ? 'pink' : 'black'));\n * a.on('drop', opt => {\n * opt.e.defaultPrevented // drop occurred\n * opt.didDrop // drop occurred on canvas\n * opt.target // drop target\n * opt.target !== a && a.set('text', 'I lost');\n * });\n * canvas.on('drop:after', opt => {\n * // inform user who won\n * if(!opt.e.defaultPrevented) {\n * // no winners\n * }\n * else if(!opt.didDrop) {\n * // my objects didn't win, some other lucky object\n * }\n * else {\n * // we have a winner it's opt.target!!\n * }\n * })\n *\n * @fires after:render at the end of the render process, receives the context in the callback\n * @fires before:render at start the render process, receives the context in the callback\n *\n * @fires contextmenu:before\n * @fires contextmenu\n * @example\n * let handler;\n * targets.forEach(target => {\n * target.on('contextmenu:before', opt => {\n * // decide which target should handle the event before canvas hijacks it\n * if (someCaseHappens && opt.targets.includes(target)) {\n * handler = target;\n * }\n * });\n * target.on('contextmenu', opt => {\n * // do something fantastic\n * });\n * });\n * canvas.on('contextmenu', opt => {\n * if (!handler) {\n * // no one takes responsibility, it's always left to me\n * // let's show them how it's done!\n * }\n * });\n *\n */\nexport class SelectableCanvas\n extends StaticCanvas\n implements Omit\n{\n declare _objects: FabricObject[];\n\n // transform config\n declare uniformScaling: boolean;\n declare uniScaleKey: TOptionalModifierKey;\n declare centeredScaling: boolean;\n declare centeredRotation: boolean;\n declare centeredKey: TOptionalModifierKey;\n declare altActionKey: TOptionalModifierKey;\n\n // selection config\n declare selection: boolean;\n declare selectionKey: TOptionalModifierKey | ModifierKey[];\n declare altSelectionKey: TOptionalModifierKey;\n declare selectionColor: string;\n declare selectionDashArray: number[];\n declare selectionBorderColor: string;\n declare selectionLineWidth: number;\n declare selectionFullyContained: boolean;\n\n // cursors\n declare hoverCursor: CSSStyleDeclaration['cursor'];\n declare moveCursor: CSSStyleDeclaration['cursor'];\n declare defaultCursor: CSSStyleDeclaration['cursor'];\n declare freeDrawingCursor: CSSStyleDeclaration['cursor'];\n declare notAllowedCursor: CSSStyleDeclaration['cursor'];\n\n declare containerClass: string;\n\n // target find config\n declare perPixelTargetFind: boolean;\n declare targetFindTolerance: number;\n declare skipTargetFind: boolean;\n\n /**\n * When true, mouse events on canvas (mousedown/mousemove/mouseup) result in free drawing.\n * After mousedown, mousemove creates a shape,\n * and then mouseup finalizes it and adds an instance of `fabric.Path` onto canvas.\n * @see {@link http://fabric5.fabricjs.com/fabric-intro-part-4#free_drawing}\n * @type Boolean\n */\n declare isDrawingMode: boolean;\n\n declare preserveObjectStacking: boolean;\n\n /**\n * 启用双击锁定组对象,锁定后只能选择对象的子节点,无论group中interative和subTargetCheck是否启用\n * @type Boolean\n * @default\n */\n declare dblClickIsolateObject: boolean;\n\n /**\n * 双击锁定的节点, 目前只支持组节点\n * @type Group | null\n * @default\n */\n isolatedObject: Group | null;\n\n /**\n * 指定的搜索对象\n * @type Boolean\n * @default null\n */\n _searchTargets: FabricObject[] | null;\n\n // event config\n declare stopContextMenu: boolean;\n declare fireRightClick: boolean;\n declare fireMiddleClick: boolean;\n\n /**\n * Keep track of the hovered target in the previous event\n * @type FabricObject | null\n * @private\n */\n declare _hoveredTarget?: FabricObject;\n\n /**\n * hold the list of nested targets hovered in the previous events\n * @type FabricObject[]\n * @private\n */\n _hoveredTargets: FabricObject[] = [];\n\n /**\n * hold the list of objects to render\n * @type FabricObject[]\n * @private\n */\n declare _objectsToRender?: FabricObject[];\n\n /**\n * hold a reference to a data structure that contains information\n * on the current on going transform\n * @type\n * @private\n */\n _currentTransform: Transform | null = null;\n\n /**\n * hold a reference to a data structure used to track the selection\n * box on canvas drag\n * on the current on going transform\n * x, y, deltaX and deltaY are in scene plane\n * @type\n * @private\n */\n protected _groupSelector: {\n x: number;\n y: number;\n deltaX: number;\n deltaY: number;\n } | null = null;\n\n /**\n * internal flag used to understand if the context top requires a cleanup\n * in case this is true, the contextTop will be cleared at the next render\n * @type boolean\n * @private\n */\n contextTopDirty = false;\n\n /**\n * During a mouse event we may need the pointer multiple times in multiple functions.\n * _scenePoint holds a reference to the pointer in fabricCanvas/design coordinates that is valid for the event\n * lifespan. Every fabricJS mouse event create and delete the cache every time\n * We do this because there are some HTML DOM inspection functions to get the actual pointer coordinates\n * @type {Point}\n */\n protected declare _scenePoint?: Point;\n\n /**\n * During a mouse event we may need the pointer multiple times in multiple functions.\n * _viewportPoint holds a reference to the pointer in html coordinates that is valid for the event\n * lifespan. Every fabricJS mouse event create and delete the cache every time\n * We do this because there are some HTML DOM inspection functions to get the actual pointer coordinates\n * @type {Point}\n */\n protected declare _viewportPoint?: Point;\n\n /**\n * Holds the informations we cache during an event lifespan\n * This data is needed many times during an event and we want to avoid to recalculate it\n * multuple times.\n */\n protected declare _targetInfo: FullTargetsInfoWithContainer | undefined;\n\n static ownDefaults = canvasDefaults;\n\n static getDefaults(): Record {\n return { ...super.getDefaults(), ...SelectableCanvas.ownDefaults };\n }\n\n declare elements: CanvasDOMManager;\n get upperCanvasEl() {\n return this.elements.upper?.el;\n }\n get contextTop() {\n return this.elements.upper?.ctx;\n }\n get wrapperEl() {\n return this.elements.container;\n }\n private declare pixelFindCanvasEl: HTMLCanvasElement;\n private declare pixelFindContext: CanvasRenderingContext2D;\n\n protected declare _isCurrentlyDrawing: boolean;\n declare freeDrawingBrush?: BaseBrush;\n declare _activeObject?: FabricObject;\n\n protected initElements(el?: string | HTMLCanvasElement) {\n this.elements = new CanvasDOMManager(el, {\n allowTouchScrolling: this.allowTouchScrolling,\n containerClass: this.containerClass,\n });\n this._createCacheCanvas();\n }\n\n /**\n * @private\n * @param {FabricObject} obj Object that was added\n */\n _onObjectAdded(obj: FabricObject) {\n this._objectsToRender = undefined;\n super._onObjectAdded(obj);\n }\n\n /**\n * @private\n * @param {FabricObject} obj Object that was removed\n */\n _onObjectRemoved(obj: FabricObject) {\n this._objectsToRender = undefined;\n // removing active object should fire \"selection:cleared\" events\n if (obj === this._activeObject) {\n this.fire('before:selection:cleared', { deselected: [obj] });\n this._discardActiveObject();\n this.fire('selection:cleared', { deselected: [obj] });\n obj.fire('deselected', {\n target: obj,\n });\n }\n if (obj === this._hoveredTarget) {\n this._hoveredTarget = undefined;\n this._hoveredTargets = [];\n }\n super._onObjectRemoved(obj);\n }\n\n _onStackOrderChanged() {\n this._objectsToRender = undefined;\n super._onStackOrderChanged();\n }\n\n /**\n * Divides objects in two groups, one to render immediately\n * and one to render as activeGroup.\n * @return {Array} objects to render immediately and pushes the other in the activeGroup.\n */\n _chooseObjectsToRender(): FabricObject[] {\n const activeObject = this._activeObject;\n return !this.preserveObjectStacking && activeObject\n ? this._objects\n .filter((object) => !object.group && object !== activeObject)\n .concat(activeObject)\n : this._objects;\n }\n\n /**\n * Renders both the top canvas and the secondary container canvas.\n */\n renderAll() {\n this.cancelRequestedRender();\n if (this.destroyed) {\n return;\n }\n if (this.contextTopDirty && !this._groupSelector && !this.isDrawingMode) {\n this.clearContext(this.contextTop);\n this.contextTopDirty = false;\n }\n if (this.hasLostContext) {\n this.renderTopLayer(this.contextTop);\n this.hasLostContext = false;\n }\n !this._objectsToRender &&\n (this._objectsToRender = this._chooseObjectsToRender());\n this.renderCanvas(this.getContext(), this._objectsToRender);\n }\n\n /**\n * text selection is rendered by the active text instance during the rendering cycle\n */\n renderTopLayer(ctx: CanvasRenderingContext2D): void {\n ctx.save();\n if (this.isDrawingMode && this._isCurrentlyDrawing) {\n this.freeDrawingBrush && this.freeDrawingBrush._render();\n this.contextTopDirty = true;\n }\n // we render the top context - last object\n if (this.selection && this._groupSelector) {\n this._drawSelection(ctx);\n this.contextTopDirty = true;\n }\n ctx.restore();\n }\n\n /**\n * Method to render only the top canvas.\n * Also used to render the group selection box.\n * Does not render text selection.\n */\n renderTop() {\n const ctx = this.contextTop;\n this.clearContext(ctx);\n this.renderTopLayer(ctx);\n // todo: how do i know if the after:render is for the top or normal contex?\n this.fire('after:render', { ctx });\n }\n\n /**\n * Set the canvas tolerance value for pixel taret find.\n * Use only integer numbers.\n * @private\n */\n setTargetFindTolerance(value: number) {\n value = Math.round(value);\n this.targetFindTolerance = value;\n const retina = this.getRetinaScaling();\n const size = Math.ceil((value * 2 + 1) * retina);\n this.pixelFindCanvasEl.width = this.pixelFindCanvasEl.height = size;\n this.pixelFindContext.scale(retina, retina);\n }\n\n /**\n * Returns true if object is transparent at a certain location\n * Clarification: this is `is target transparent at location X or are controls there`\n * @TODO this seems dumb that we treat controls with transparency. we can find controls\n * programmatically without painting them, the cache canvas optimization is always valid\n * @param {FabricObject} target Object to check\n * @param {Number} x Left coordinate in viewport space\n * @param {Number} y Top coordinate in viewport space\n * @return {Boolean}\n */\n isTargetTransparent(target: FabricObject, x: number, y: number): boolean {\n const tolerance = this.targetFindTolerance;\n const ctx = this.pixelFindContext;\n this.clearContext(ctx);\n ctx.save();\n ctx.translate(-x + tolerance, -y + tolerance);\n ctx.transform(...this.viewportTransform);\n const selectionBgc = target.selectionBackgroundColor;\n target.selectionBackgroundColor = '';\n target.render(ctx);\n target.selectionBackgroundColor = selectionBgc;\n ctx.restore();\n // our canvas is square, and made around tolerance.\n // so tolerance in this case also represent the center of the canvas.\n const enhancedTolerance = Math.round(tolerance * this.getRetinaScaling());\n return isTransparent(\n ctx,\n enhancedTolerance,\n enhancedTolerance,\n enhancedTolerance,\n );\n }\n\n /**\n * takes an event and determines if selection key has been pressed\n * @private\n * @param {TPointerEvent} e Event object\n */\n _isSelectionKeyPressed(e: TPointerEvent): boolean {\n const sKey = this.selectionKey;\n if (!sKey) {\n return false;\n }\n if (Array.isArray(sKey)) {\n return !!sKey.find((key) => !!key && e[key] === true);\n } else {\n return e[sKey];\n }\n }\n\n /**\n * @private\n * @param {TPointerEvent} e Event object\n * @param {FabricObject} target\n */\n _shouldClearSelection(\n e: TPointerEvent,\n target?: FabricObject,\n ): target is undefined {\n const activeObjects = this.getActiveObjects(),\n activeObject = this._activeObject;\n\n return !!(\n !target ||\n (target &&\n activeObject &&\n activeObjects.length > 1 &&\n activeObjects.indexOf(target) === -1 &&\n activeObject !== target &&\n !this._isSelectionKeyPressed(e)) ||\n (target && !target.evented) ||\n (target && !target.selectable && activeObject && activeObject !== target)\n );\n }\n\n /**\n * This method will take in consideration a modifier key pressed and the control we are\n * about to drag, and try to guess the anchor point ( origin ) of the transormation.\n * This should be really in the realm of controls, and we should remove specific code for legacy\n * embedded actions.\n * @TODO this probably deserve discussion/rediscovery and change/refactor\n * @private\n * @deprecated\n * @param {FabricObject} target\n * @param {string} action\n * @param {boolean} altKey\n * @returns {boolean} true if the transformation should be centered\n */\n private _shouldCenterTransform(\n target: FabricObject,\n action: string,\n modifierKeyPressed: boolean,\n ) {\n if (!target) {\n return;\n }\n\n let centerTransform;\n\n if (\n action === SCALE ||\n action === SCALE_X ||\n action === SCALE_Y ||\n action === RESIZING\n ) {\n centerTransform = this.centeredScaling || target.centeredScaling;\n } else if (action === ROTATE) {\n centerTransform = this.centeredRotation || target.centeredRotation;\n }\n\n return centerTransform ? !modifierKeyPressed : modifierKeyPressed;\n }\n\n /**\n * Given the control clicked, determine the origin of the transform.\n * This is bad because controls can totally have custom names\n * should disappear before release 4.0\n * @private\n * @deprecated\n */\n _getOriginFromCorner(\n target: FabricObject,\n controlName: string,\n ): { x: TOriginX; y: TOriginY } {\n const origin = {\n x: target.originX,\n y: target.originY,\n };\n\n if (!controlName) {\n return origin;\n }\n\n // is a left control ?\n if (['ml', 'tl', 'bl'].includes(controlName)) {\n origin.x = RIGHT;\n // is a right control ?\n } else if (['mr', 'tr', 'br'].includes(controlName)) {\n origin.x = LEFT;\n }\n // is a top control ?\n if (['tl', 'mt', 'tr'].includes(controlName)) {\n origin.y = BOTTOM;\n // is a bottom control ?\n } else if (['bl', 'mb', 'br'].includes(controlName)) {\n origin.y = TOP;\n }\n return origin;\n }\n\n /**\n * @private\n * @param {Event} e Event object\n * @param {FabricObject} target\n * @param {boolean} [alreadySelected] pass true to setup the active control\n */\n _setupCurrentTransform(\n e: TPointerEvent,\n target: FabricObject,\n alreadySelected: boolean,\n ): void {\n const pointer = target.group\n ? // transform pointer to target's containing coordinate plane\n sendPointToPlane(\n this.getScenePoint(e),\n undefined,\n target.group.calcTransformMatrix(),\n )\n : this.getScenePoint(e);\n const { key: corner = '', control } = target.getActiveControl() || {},\n actionHandler =\n alreadySelected && control\n ? control.getActionHandler(e, target, control)?.bind(control)\n : dragHandler,\n action = getActionFromCorner(alreadySelected, corner, e, target),\n altKey = e[this.centeredKey as ModifierKey],\n origin = this._shouldCenterTransform(target, action, altKey)\n ? ({ x: CENTER, y: CENTER } as const)\n : this._getOriginFromCorner(target, corner),\n /**\n * relative to target's containing coordinate plane\n * both agree on every point\n **/\n transform: Transform = {\n target: target,\n action,\n actionHandler,\n actionPerformed: false,\n corner,\n scaleX: target.scaleX,\n scaleY: target.scaleY,\n skewX: target.skewX,\n skewY: target.skewY,\n offsetX: pointer.x - target.left,\n offsetY: pointer.y - target.top,\n originX: origin.x,\n originY: origin.y,\n ex: pointer.x,\n ey: pointer.y,\n lastX: pointer.x,\n lastY: pointer.y,\n theta: degreesToRadians(target.angle),\n width: target.width,\n height: target.height,\n shiftKey: e.shiftKey,\n altKey,\n original: {\n ...saveObjectTransform(target),\n originX: origin.x,\n originY: origin.y,\n },\n };\n\n this._currentTransform = transform;\n\n this.fire('before:transform', {\n e,\n transform,\n });\n }\n\n /**\n * Set the cursor type of the canvas element\n * @param {String} value Cursor type of the canvas element.\n * @see http://www.w3.org/TR/css3-ui/#cursor\n */\n setCursor(value: CSSStyleDeclaration['cursor']): void {\n this.upperCanvasEl.style.cursor = value;\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx to draw the selection on\n */\n _drawSelection(ctx: CanvasRenderingContext2D): void {\n const { x, y, deltaX, deltaY } = this._groupSelector!,\n start = new Point(x, y).transform(this.viewportTransform),\n extent = new Point(x + deltaX, y + deltaY).transform(\n this.viewportTransform,\n ),\n strokeOffset = this.selectionLineWidth / 2;\n let minX = Math.min(start.x, extent.x),\n minY = Math.min(start.y, extent.y),\n maxX = Math.max(start.x, extent.x),\n maxY = Math.max(start.y, extent.y);\n\n if (this.selectionColor) {\n ctx.fillStyle = this.selectionColor;\n ctx.fillRect(minX, minY, maxX - minX, maxY - minY);\n }\n\n if (!this.selectionLineWidth || !this.selectionBorderColor) {\n return;\n }\n ctx.lineWidth = this.selectionLineWidth;\n ctx.strokeStyle = this.selectionBorderColor;\n\n minX += strokeOffset;\n minY += strokeOffset;\n maxX -= strokeOffset;\n maxY -= strokeOffset;\n // selection border\n // @TODO: is _setLineDash still necessary on modern canvas?\n FabricObject.prototype._setLineDash.call(\n this,\n ctx,\n this.selectionDashArray,\n );\n ctx.strokeRect(minX, minY, maxX - minX, maxY - minY);\n }\n\n /**\n * 双击选择\n * @param e\n * @returns\n */\n dblClickLock(e: TPointerEvent): boolean {\n if (this.dblClickIsolateObject) {\n const pointer = this.getScenePoint(e);\n const objects = this.isolatedObject\n ? this.isolatedObject.getObjects()\n : this.getObjects();\n const obj = this.searchPossibleTargets(objects, pointer);\n if (obj.target) {\n if (obj.target instanceof Group) {\n // 组才修改锁定\n this.isolatedObject = obj.target;\n this.discardActiveObject();\n // 新创建的组对象,子节点coords初始化,否则无法选中\n obj.target._objects.forEach((o) => {\n o.setCoords();\n });\n } else {\n // 非组对象不处理锁定,返回false继续对象自己的双击事件\n return false;\n }\n } else {\n // 取消锁定\n this.isolatedObject = null;\n this.discardActiveObject();\n }\n return true;\n }\n return false;\n }\n\n /**\n * 设置搜索对象\n * 如当编辑path时,设置点为可搜索对象\n * @param objects\n */\n setSearchTargets(objects: FabricObject[] | null) {\n this._searchTargets = objects;\n }\n\n /**\n * 返回搜索对象\n * @returns\n */\n getSearchTargets() {\n return (\n this._searchTargets ||\n (this.isolatedObject ? this.isolatedObject._objects : this._objects)\n );\n }\n\n /**\n * Method that determines what object we are clicking on\n * 11/09/2018 TODO: would be cool if findTarget could discern between being a full target\n * or the outside part of the corner.\n * @param {Event} e mouse event\n * @return {TargetsInfoWithContainer} the target found\n */\n findTarget(e: TPointerEvent): FullTargetsInfoWithContainer {\n // this._targetInfo is cached by _cacheTransformEventData\n // and destroyed by _resetTransformEventData\n if (this._targetInfo) {\n return this._targetInfo;\n }\n\n if (this.skipTargetFind) {\n return {\n subTargets: [],\n currentSubTargets: [],\n };\n }\n\n const pointer = this.getScenePoint(e),\n activeObject = this._activeObject,\n aObjects = this.getActiveObjects(),\n targetInfo = this.searchPossibleTargets(this.getSearchTargets(), pointer);\n\n const {\n subTargets: currentSubTargets,\n container: currentContainer,\n target: currentTarget,\n } = targetInfo;\n\n const fullTargetInfo: FullTargetsInfoWithContainer = {\n ...targetInfo,\n currentSubTargets,\n currentContainer,\n currentTarget,\n };\n\n // simplest case no active object, return a new target\n if (!activeObject) {\n return fullTargetInfo;\n }\n\n // check pointer is over active selection and possibly perform `subTargetCheck`\n const activeObjectTargetInfo: FullTargetsInfoWithContainer = {\n ...this.searchPossibleTargets([activeObject], pointer),\n currentSubTargets,\n currentContainer,\n currentTarget,\n };\n\n const activeObjectControl = activeObject.findControl(\n this.getViewportPoint(e),\n isTouchEvent(e),\n );\n\n // we are clicking exactly the control of an active object, shortcut to that object.\n if (activeObjectControl) {\n return {\n ...activeObjectTargetInfo,\n target: activeObject, // we override target in case we are in the outside part of the corner.\n };\n }\n\n // in case we are over the active object\n if (activeObjectTargetInfo.target) {\n if (aObjects.length > 1) {\n // in case of active selection and target hit over the activeSelection, just exit\n // TODO Verify if we need to override target with container\n return activeObjectTargetInfo;\n }\n // from here onward not an active selection, just an activeOject that maybe is a group\n\n // preserveObjectStacking is false, so activeObject is drawn on top, just return activeObject\n if (!this.preserveObjectStacking) {\n // TODO Verify if we need to override target with container\n return activeObjectTargetInfo;\n }\n\n // In case we are in preserveObjectStacking ( selection in stack )\n // there is the possibility to force with `altSelectionKey` to return the activeObject\n // from any point in the stack, even if we have another object completely on top of it.\n if (\n this.preserveObjectStacking &&\n e[this.altSelectionKey as ModifierKey]\n ) {\n // TODO Verify if we need to override target with container\n return activeObjectTargetInfo;\n }\n }\n\n // we have an active object, but we ruled out it being our target in any way.\n return fullTargetInfo;\n }\n\n /**\n * Checks if the point is inside the object selection area including padding\n * @param {FabricObject} obj Object to test against\n * @param {Object} [pointer] point in scene coordinates\n * @return {Boolean} true if point is contained within an area of given object\n * @private\n */\n private _pointIsInObjectSelectionArea(obj: FabricObject, point: Point) {\n // getCoords will already take care of group de-nesting\n let coords = obj.getCoords();\n const viewportZoom = this.getZoom();\n const padding = obj.padding / viewportZoom;\n if (padding) {\n const [tl, tr, br, bl] = coords;\n // what is the angle of the object?\n // we could use getTotalAngle, but is way easier to look at it\n // from how coords are oriented, since if something went wrong\n // at least we are consistent.\n const angleRadians = Math.atan2(tr.y - tl.y, tr.x - tl.x),\n cosP = cos(angleRadians) * padding,\n sinP = sin(angleRadians) * padding,\n cosPSinP = cosP + sinP,\n cosPMinusSinP = cosP - sinP;\n\n coords = [\n new Point(tl.x - cosPMinusSinP, tl.y - cosPSinP),\n new Point(tr.x + cosPSinP, tr.y - cosPMinusSinP),\n new Point(br.x + cosPMinusSinP, br.y + cosPSinP),\n new Point(bl.x - cosPSinP, bl.y + cosPMinusSinP),\n ];\n // in case of padding we calculate the new coords on the fly.\n // otherwise we have to maintain 2 sets of coordinates for everything.\n // we can reiterate on storing them.\n // if this is slow, for now the semplification is large and doesn't impact\n // rendering.\n // the idea behind this is that outside target check we don't need ot know\n // where those coords are\n }\n return Intersection.isPointInPolygon(point, coords);\n }\n\n /**\n * Checks point is inside the object selection condition. Either area with padding\n * or over pixels if perPixelTargetFind is enabled\n * @param {FabricObject} obj Object to test against\n * @param {Point} pointer point from scene.\n * @return {Boolean} true if point is contained within an area of given object\n * @private\n */\n _checkTarget(obj: FabricObject, pointer: Point): boolean {\n if (\n obj &&\n obj.visible &&\n obj.evented &&\n this._pointIsInObjectSelectionArea(obj, pointer)\n ) {\n if (\n (this.perPixelTargetFind || obj.perPixelTargetFind) &&\n !(obj as unknown as IText).isEditing\n ) {\n const viewportPoint = pointer.transform(this.viewportTransform);\n if (!this.isTargetTransparent(obj, viewportPoint.x, viewportPoint.y)) {\n return true;\n }\n } else {\n return true;\n }\n }\n return false;\n }\n\n /**\n * Given an array of objects search possible targets under the pointer position\n * Returns an\n * @param {Array} objects objects array to look into\n * @param {Object} pointer x,y object of point of scene coordinates we want to check.\n * @param {Object} subTargets If passed, subtargets will be collected inside the array\n * @return {TargetsInfo} **top most object from given `objects`** that contains pointer\n * @private\n */\n _searchPossibleTargets(\n objects: FabricObject[],\n pointer: Point,\n subTargets: FabricObject[],\n ): TargetsInfo {\n let i = objects.length;\n // Do not check for currently grouped objects, since we check the parent group itself.\n // until we call this function specifically to search inside the activeGroup\n while (i--) {\n const target = objects[i];\n if (this._checkTarget(target, pointer)) {\n // 没有开启双击锁定节点才搜索子节点\n if (\n !this.dblClickIsolateObject &&\n isCollection(target) &&\n target.subTargetCheck\n ) {\n const { target: subTarget } = this._searchPossibleTargets(\n target._objects,\n pointer,\n subTargets,\n );\n subTarget && subTargets.push(subTarget);\n }\n return {\n target,\n subTargets,\n };\n }\n }\n return {\n subTargets: [],\n };\n }\n\n /**\n * Search inside an objects array the fiurst object that contains pointer\n * Collect subTargets of that object inside the subTargets array passed as parameter\n * @param {FabricObject[]} objects objects array to look into\n * @param {Point} pointer coordinates from viewport to check.\n * @return {FabricObject} **top most object on screen** that contains pointer\n */\n searchPossibleTargets(\n objects: FabricObject[],\n pointer: Point,\n ): TargetsInfoWithContainer {\n const targetInfo: TargetsInfoWithContainer = this._searchPossibleTargets(\n objects,\n pointer,\n [],\n );\n\n // outermost target is the container.\n targetInfo.container = targetInfo.target;\n const { container, subTargets } = targetInfo;\n\n if (\n container &&\n isCollection(container) &&\n container.interactive &&\n subTargets[0]\n ) {\n /** subTargets[0] is the innermost nested target, but it could be inside non interactive groups\n * and so not a possible selection target.\n * We loop the array from the end that is outermost innertarget.\n */\n for (let i = subTargets.length - 1; i > 0; i--) {\n const t = subTargets[i];\n if (!(isCollection(t) && t.interactive)) {\n // one of the subtargets was not interactive. that is the last subtarget we can return.\n // we can't dig more deep;\n targetInfo.target = t;\n return targetInfo;\n }\n }\n targetInfo.target = subTargets[0];\n return targetInfo;\n }\n\n return targetInfo;\n }\n\n /**\n * @returns point existing in the same plane as the {@link HTMLCanvasElement},\n * `(0, 0)` being the top left corner of the {@link HTMLCanvasElement}.\n * This means that changes to the {@link viewportTransform} do not change the values of the point\n * and it remains unchanged from the viewer's perspective.\n *\n * @example\n * const scenePoint = sendPointToPlane(\n * this.getViewportPoint(e),\n * undefined,\n * canvas.viewportTransform\n * );\n *\n */\n getViewportPoint(e: TPointerEvent) {\n if (this._viewportPoint) {\n return this._viewportPoint;\n }\n return this._getPointerImpl(e, true);\n }\n\n /**\n * @returns point existing in the scene (the same plane as the plane {@link FabricObject#getCenterPoint} exists in).\n * This means that changes to the {@link viewportTransform} do not change the values of the point,\n * however, from the viewer's perspective, the point is changed.\n *\n * @example\n * const viewportPoint = sendPointToPlane(\n * this.getScenePoint(e),\n * canvas.viewportTransform\n * );\n *\n */\n getScenePoint(e: TPointerEvent) {\n if (this._scenePoint) {\n return this._scenePoint;\n }\n return this._getPointerImpl(e);\n }\n\n /**\n * Returns pointer relative to canvas.\n *\n * Use {@link getViewportPoint} or {@link getScenePoint} instead.\n *\n * @param {Event} e\n * @param {Boolean} [fromViewport] whether to return the point from the viewport or in the scene\n * @return {Point}\n */\n protected _getPointerImpl(e: TPointerEvent, fromViewport = false): Point {\n const upperCanvasEl = this.upperCanvasEl,\n bounds = upperCanvasEl.getBoundingClientRect();\n let pointer = getPointer(e),\n boundsWidth = bounds.width || 0,\n boundsHeight = bounds.height || 0;\n\n if (!boundsWidth || !boundsHeight) {\n if (TOP in bounds && BOTTOM in bounds) {\n boundsHeight = Math.abs(bounds.top - bounds.bottom);\n }\n if (RIGHT in bounds && LEFT in bounds) {\n boundsWidth = Math.abs(bounds.right - bounds.left);\n }\n }\n\n this.calcOffset();\n pointer.x = pointer.x - this._offset.left;\n pointer.y = pointer.y - this._offset.top;\n if (!fromViewport) {\n pointer = sendPointToPlane(pointer, undefined, this.viewportTransform);\n }\n\n const retinaScaling = this.getRetinaScaling();\n if (retinaScaling !== 1) {\n pointer.x /= retinaScaling;\n pointer.y /= retinaScaling;\n }\n\n // If bounds are not available (i.e. not visible), do not apply scale.\n const cssScale =\n boundsWidth === 0 || boundsHeight === 0\n ? new Point(1, 1)\n : new Point(\n upperCanvasEl.width / boundsWidth,\n upperCanvasEl.height / boundsHeight,\n );\n\n return pointer.multiply(cssScale);\n }\n\n /**\n * Internal use only\n * @protected\n */\n protected _setDimensionsImpl(\n dimensions: TSize,\n options?: TCanvasSizeOptions,\n ) {\n // @ts-expect-error this method exists in the subclass - should be moved or declared as abstract\n this._resetTransformEventData();\n super._setDimensionsImpl(dimensions, options);\n if (this._isCurrentlyDrawing) {\n this.freeDrawingBrush &&\n this.freeDrawingBrush._setBrushStyles(this.contextTop);\n }\n }\n\n protected _createCacheCanvas() {\n this.pixelFindCanvasEl = createCanvasElement();\n this.pixelFindContext = this.pixelFindCanvasEl.getContext('2d', {\n willReadFrequently: true,\n })!;\n this.setTargetFindTolerance(this.targetFindTolerance);\n }\n\n /**\n * Returns context of top canvas where interactions are drawn\n * @returns {CanvasRenderingContext2D}\n */\n getTopContext(): CanvasRenderingContext2D {\n return this.elements.upper.ctx;\n }\n\n /**\n * Returns context of canvas where object selection is drawn\n * @alias\n * @return {CanvasRenderingContext2D}\n */\n getSelectionContext(): CanvasRenderingContext2D {\n return this.elements.upper.ctx;\n }\n\n /**\n * Returns <canvas> element on which object selection is drawn\n * @return {HTMLCanvasElement}\n */\n getSelectionElement(): HTMLCanvasElement {\n return this.elements.upper.el;\n }\n\n /**\n * Returns currently active object\n * @return {FabricObject | null} active object\n */\n getActiveObject(): FabricObject | undefined {\n return this._activeObject;\n }\n\n /**\n * Returns an array with the current selected objects\n * @return {FabricObject[]} active objects array\n */\n getActiveObjects(): FabricObject[] {\n const active = this._activeObject;\n return isActiveSelection(active)\n ? active.getObjects()\n : active\n ? [active]\n : [];\n }\n\n /**\n * @private\n * Compares the old activeObject with the current one and fires correct events\n * @param {FabricObject[]} oldObjects old activeObject\n * @param {TPointerEvent} e mouse event triggering the selection events\n */\n _fireSelectionEvents(oldObjects: FabricObject[], e?: TPointerEvent) {\n let somethingChanged = false,\n invalidate = false;\n const objects = this.getActiveObjects(),\n added: FabricObject[] = [],\n removed: FabricObject[] = [];\n\n oldObjects.forEach((target) => {\n if (!objects.includes(target)) {\n somethingChanged = true;\n target.fire('deselected', {\n e,\n target,\n });\n removed.push(target);\n }\n });\n\n objects.forEach((target) => {\n if (!oldObjects.includes(target)) {\n somethingChanged = true;\n target.fire('selected', {\n e,\n target,\n });\n added.push(target);\n }\n });\n\n if (oldObjects.length > 0 && objects.length > 0) {\n invalidate = true;\n somethingChanged &&\n this.fire('selection:updated', {\n e,\n selected: added,\n deselected: removed,\n });\n } else if (objects.length > 0) {\n invalidate = true;\n this.fire('selection:created', {\n e,\n selected: added,\n });\n } else if (oldObjects.length > 0) {\n invalidate = true;\n this.fire('selection:cleared', {\n e,\n deselected: removed,\n });\n }\n invalidate && (this._objectsToRender = undefined);\n }\n\n /**\n * Sets given object as the only active object on canvas\n * @param {FabricObject} object Object to set as an active one\n * @param {TPointerEvent} [e] Event (passed along when firing \"object:selected\")\n * @return {Boolean} true if the object has been selected\n */\n setActiveObject(object: FabricObject, e?: TPointerEvent) {\n // we can't inline this, since _setActiveObject will change what getActiveObjects returns\n const currentActives = this.getActiveObjects();\n const selected = this._setActiveObject(object, e);\n this._fireSelectionEvents(currentActives, e);\n return selected;\n }\n\n /**\n * This is supposed to be equivalent to setActiveObject but without firing\n * any event. There is commitment to have this stay this way.\n * This is the functional part of setActiveObject.\n * @param {Object} object to set as active\n * @param {Event} [e] Event (passed along when firing \"object:selected\")\n * @return {Boolean} true if the object has been selected\n */\n _setActiveObject(object: FabricObject, e?: TPointerEvent) {\n const prevActiveObject = this._activeObject;\n if (prevActiveObject === object) {\n return false;\n }\n // after calling this._discardActiveObject, this,_activeObject could be undefined\n if (!this._discardActiveObject(e, object) && this._activeObject) {\n // refused to deselect\n return false;\n }\n if (object.onSelect({ e })) {\n return false;\n }\n\n this._activeObject = object;\n\n if (isActiveSelection(object) && prevActiveObject !== object) {\n object.set('canvas', this);\n }\n object.setCoords();\n\n return true;\n }\n\n /**\n * This is supposed to be equivalent to discardActiveObject but without firing\n * any selection events ( can still fire object transformation events ). There is commitment to have this stay this way.\n * This is the functional part of discardActiveObject.\n * @param {Event} [e] Event (passed along when firing \"object:deselected\")\n * @param {Object} object the next object to set as active, reason why we are discarding this\n * @return {Boolean} true if the active object has been discarded\n */\n _discardActiveObject(\n e?: TPointerEvent,\n object?: FabricObject,\n ): this is { _activeObject: undefined } {\n const obj = this._activeObject;\n if (obj) {\n // onDeselect return TRUE to cancel selection;\n if (obj.onDeselect({ e, object })) {\n return false;\n }\n if (this._currentTransform && this._currentTransform.target === obj) {\n this.endCurrentTransform(e);\n }\n if (isActiveSelection(obj) && obj === this._hoveredTarget) {\n this._hoveredTarget = undefined;\n }\n this._activeObject = undefined;\n return true;\n }\n return false;\n }\n\n /**\n * Discards currently active object and fire events. If the function is called by fabric\n * as a consequence of a mouse event, the event is passed as a parameter and\n * sent to the fire function for the custom events. When used as a method the\n * e param does not have any application.\n * @param {event} e\n * @return {Boolean} true if the active object has been discarded\n */\n discardActiveObject(e?: TPointerEvent): this is { _activeObject: undefined } {\n const currentActives = this.getActiveObjects(),\n activeObject = this.getActiveObject();\n if (currentActives.length) {\n this.fire('before:selection:cleared', {\n e,\n deselected: [activeObject!],\n });\n }\n const discarded = this._discardActiveObject(e);\n this._fireSelectionEvents(currentActives, e);\n return discarded;\n }\n\n /**\n * End the current transform.\n * You don't usually need to call this method unless you are interrupting a user initiated transform\n * because of some other event ( a press of key combination, or something that block the user UX )\n * @param {Event} [e] send the mouse event that generate the finalize down, so it can be used in the event\n */\n endCurrentTransform(e?: TPointerEvent) {\n const transform = this._currentTransform;\n this._finalizeCurrentTransform(e);\n if (transform && transform.target) {\n // this could probably go inside _finalizeCurrentTransform\n transform.target.isMoving = false;\n }\n this._currentTransform = null;\n }\n\n /**\n * @private\n * @param {Event} e send the mouse event that generate the finalize down, so it can be used in the event\n */\n _finalizeCurrentTransform(e?: TPointerEvent) {\n const transform = this._currentTransform!,\n target = transform.target,\n options = {\n e,\n target,\n transform,\n action: transform.action,\n };\n\n if (target._scaling) {\n target._scaling = false;\n }\n\n target.setCoords();\n\n if (transform.actionPerformed) {\n this.fire('object:modified', options);\n target.fire(MODIFIED, options);\n }\n }\n\n /**\n * Sets viewport transformation of this canvas instance\n * @param {Array} vpt a Canvas 2D API transform matrix\n */\n setViewportTransform(vpt: TMat2D) {\n super.setViewportTransform(vpt);\n const activeObject = this._activeObject;\n if (activeObject) {\n activeObject.setCoords();\n }\n }\n\n /**\n * @override clears active selection ref and interactive canvas elements and contexts\n */\n destroy() {\n // dispose of active selection\n const activeObject = this._activeObject;\n if (isActiveSelection(activeObject)) {\n activeObject.removeAll();\n activeObject.dispose();\n }\n\n delete this._activeObject;\n\n super.destroy();\n\n // free resources\n\n // pixel find canvas\n // @ts-expect-error disposing\n this.pixelFindContext = null;\n // @ts-expect-error disposing\n this.pixelFindCanvasEl = undefined;\n }\n\n /**\n * Clears all contexts (background, main, top) of an instance\n */\n clear() {\n // discard active object and fire events\n this.discardActiveObject();\n // make sure we clear the active object in case it refused to be discarded\n this._activeObject = undefined;\n this.clearContext(this.contextTop);\n super.clear();\n }\n\n /**\n * Draws objects' controls (borders/controls)\n * @param {CanvasRenderingContext2D} ctx Context to render controls on\n */\n drawControls(ctx: CanvasRenderingContext2D) {\n const activeObject = this._activeObject;\n\n if (activeObject) {\n activeObject._renderControls(ctx);\n }\n }\n\n /**\n * @private\n */\n protected _toObject(\n instance: FabricObject,\n methodName: 'toObject' | 'toDatalessObject',\n propertiesToInclude: string[],\n ): Record {\n // If the object is part of the current selection group, it should\n // be transformed appropriately\n // i.e. it should be serialised as it would appear if the selection group\n // were to be destroyed.\n const originalProperties = this._realizeGroupTransformOnObject(instance),\n object = super._toObject(instance, methodName, propertiesToInclude);\n //Undo the damage we did by changing all of its properties\n instance.set(originalProperties);\n return object;\n }\n\n /**\n * Realizes an object's group transformation on it\n * @private\n * @param {FabricObject} [instance] the object to transform (gets mutated)\n * @returns the original values of instance which were changed\n */\n private _realizeGroupTransformOnObject(\n instance: FabricObject,\n ): Partial {\n const { group } = instance;\n if (group && isActiveSelection(group) && this._activeObject === group) {\n const layoutProps = [\n 'angle',\n 'flipX',\n 'flipY',\n LEFT,\n SCALE_X,\n SCALE_Y,\n SKEW_X,\n SKEW_Y,\n TOP,\n ] as (keyof typeof instance)[];\n const originalValues = pick(instance, layoutProps);\n addTransformToObject(instance, group.calcOwnMatrix());\n return originalValues;\n } else {\n return {};\n }\n }\n\n /**\n * @private\n */\n _setSVGObject(\n markup: string[],\n instance: FabricObject,\n reviver?: TSVGReviver,\n ) {\n // If the object is in a selection group, simulate what would happen to that\n // object when the group is deselected\n const originalProperties = this._realizeGroupTransformOnObject(instance);\n super._setSVGObject(markup, instance, reviver);\n instance.set(originalProperties);\n }\n}\n","import type { ModifierKey, TOptionalModifierKey } from '../EventTypeDefs';\nimport type { TOptions } from '../typedefs';\nimport type { StaticCanvasOptions } from './StaticCanvasOptions';\n\nexport interface CanvasTransformOptions {\n /**\n * When true, objects can be transformed by one side (unproportionately)\n * when dragged on the corners that normally would not do that.\n * @type Boolean\n * @since fabric 4.0 // changed name and default value\n */\n uniformScaling: boolean;\n\n /**\n * Indicates which key switches uniform scaling.\n * values: 'altKey', 'shiftKey', 'ctrlKey'.\n * If `null` or 'none' or any other string that is not a modifier key\n * feature is disabled.\n * totally wrong named. this sounds like `uniform scaling`\n * if Canvas.uniformScaling is true, pressing this will set it to false\n * and viceversa.\n * @since 1.6.2\n * @type ModifierKey\n */\n uniScaleKey: TOptionalModifierKey;\n\n /**\n * When true, objects use center point as the origin of scale transformation.\n * Backwards incompatibility note: This property replaces \"centerTransform\" (Boolean).\n * @since 1.3.4\n * @type Boolean\n */\n centeredScaling: boolean;\n\n /**\n * When true, objects use center point as the origin of rotate transformation.\n * Backwards incompatibility note: This property replaces \"centerTransform\" (Boolean).\n * @since 1.3.4\n * @type Boolean\n */\n centeredRotation: boolean;\n\n /**\n * Indicates which key enable centered Transform\n * values: 'altKey', 'shiftKey', 'ctrlKey'.\n * If `null` or 'none' or any other string that is not a modifier key\n * feature is disabled feature disabled.\n * @since 1.6.2\n * @type ModifierKey\n */\n centeredKey: TOptionalModifierKey;\n\n /**\n * Indicates which key enable alternate action on corner\n * values: 'altKey', 'shiftKey', 'ctrlKey'.\n * If `null` or 'none' or any other string that is not a modifier key\n * feature is disabled feature disabled.\n * @since 1.6.2\n * @type ModifierKey\n */\n altActionKey: TOptionalModifierKey;\n}\n\nexport interface CanvasSelectionOptions {\n /**\n * Indicates whether group selection should be enabled\n * @type Boolean\n */\n selection: boolean;\n\n /**\n * Indicates which key or keys enable multiple click selection\n * Pass value as a string or array of strings\n * values: 'altKey', 'shiftKey', 'ctrlKey'.\n * If `null` or empty or containing any other string that is not a modifier key\n * feature is disabled.\n * @since 1.6.2\n * @type ModifierKey|ModifierKey[]\n */\n selectionKey: TOptionalModifierKey | ModifierKey[];\n\n /**\n * Indicates which key enable alternative selection\n * in case of a target overlapping with active object and we don't want to loose the\n * active selection, we can press this modifier key and continue selecting the current\n * selected object also when is covered by another or many valid targets for selection.\n * values: 'altKey', 'shiftKey', 'ctrlKey'.\n * For a series of reason that come from the general expectations on how\n * things should work, this feature works only for preserveObjectStacking true.\n * If `null` or 'none' or any other string that is not a modifier key\n * feature is disabled.\n * @since 1.6.5\n * @type null|ModifierKey\n */\n altSelectionKey: TOptionalModifierKey;\n\n /**\n * Color of selection\n * @type String\n */\n selectionColor: string;\n\n /**\n * Default dash array pattern\n * If not empty the selection border is dashed\n * @type Array\n */\n selectionDashArray: number[];\n\n /**\n * Color of the border of selection (usually slightly darker than color of selection itself)\n * @type String\n */\n selectionBorderColor: string;\n\n /**\n * Width of a line used in object/group selection\n * @type Number\n */\n selectionLineWidth: number;\n\n /**\n * Select only shapes that are fully contained in the dragged selection rectangle.\n * @type Boolean\n */\n selectionFullyContained: boolean;\n}\n\nexport interface CanvasCursorOptions {\n /**\n * Default cursor value used when hovering over an object on canvas\n * @type CSSStyleDeclaration['cursor']\n * @default move\n */\n hoverCursor: CSSStyleDeclaration['cursor'];\n\n /**\n * Default cursor value used when moving an object on canvas\n * @type CSSStyleDeclaration['cursor']\n * @default move\n */\n moveCursor: CSSStyleDeclaration['cursor'];\n\n /**\n * Default cursor value used for the entire canvas\n * @type String\n * @default default\n */\n defaultCursor: CSSStyleDeclaration['cursor'];\n\n /**\n * Cursor value used during free drawing\n * @type String\n * @default crosshair\n */\n freeDrawingCursor: CSSStyleDeclaration['cursor'];\n\n /**\n * Cursor value used for disabled elements ( corners with disabled action )\n * @type String\n * @since 2.0.0\n * @default not-allowed\n */\n notAllowedCursor: CSSStyleDeclaration['cursor'];\n}\n\nexport interface TargetFindOptions {\n /**\n * When true, object detection happens on per-pixel basis rather than on per-bounding-box\n * @type Boolean\n */\n perPixelTargetFind: boolean;\n\n /**\n * Number of pixels around target pixel to tolerate (consider active) during object detection\n * @type Number\n */\n targetFindTolerance: number;\n\n /**\n * When true, target detection is skipped. Target detection will return always undefined.\n * click selection won't work anymore, events will fire with no targets.\n * if something is selected before setting it to true, it will be deselected at the first click.\n * area selection will still work. check the `selection` property too.\n * if you deactivate both, you should look into staticCanvas.\n * @type Boolean\n */\n skipTargetFind: boolean;\n}\n\nexport interface CanvasEventsOptions {\n /**\n * Indicates if the right click on canvas can output the context menu or not\n * The default value changed from false to true in Fabric 7.0\n * @see https://fabricjs.com/docs/upgrading/upgrading-to-fabric-70/\n * @deprecated since 7.0, Will be removed in Fabric 8.0\n * @type Boolean\n * @since 1.6.5\n */\n stopContextMenu: boolean;\n\n /**\n * Indicates if the canvas can fire right click events\n * The default value changed from false to true in Fabric 7.0\n * @see https://fabricjs.com/docs/upgrading/upgrading-to-fabric-70/\n * @deprecated since 7.0, Will be removed in Fabric 8.0\n * @type Boolean\n * @since 1.6.5\n */\n fireRightClick: boolean;\n\n /**\n * Indicates if the canvas can fire middle click events\n * The default value changed from false to true in Fabric 7.0\n * @see https://fabricjs.com/docs/upgrading/upgrading-to-fabric-70/\n * @deprecated since 7.0, Will be removed in Fabric 8.0\n * @type Boolean\n * @since 1.7.8\n */\n fireMiddleClick: boolean;\n\n /**\n * When the option is enabled, PointerEvent is used instead of TPointerEvent.\n * @type Boolean\n */\n enablePointerEvents: boolean;\n}\n\nexport interface CanvasOptions\n extends StaticCanvasOptions,\n CanvasTransformOptions,\n CanvasSelectionOptions,\n CanvasCursorOptions,\n TargetFindOptions,\n CanvasEventsOptions {\n /**\n * Default element class that's given to wrapper (div) element of canvas\n * @type String\n * @deprecated customize {@link CanvasDOMManager} instead or access {@link elements} directly\n */\n containerClass: string;\n\n /**\n * Indicates whether objects should remain in current stack position when selected.\n * When false objects are brought to top and rendered as part of the selection group\n * @type Boolean\n * @default true\n */\n preserveObjectStacking: boolean;\n\n /**\n * 启用双击锁定组节点,锁定后可选择组节点中的子节点,无论group中interative和subTargetCheck是否启用\n * @type Boolean\n * @default\n */\n dblClickIsolateObject: boolean;\n}\n\nexport type TCanvasOptions = TOptions;\n\nexport const canvasDefaults: TOptions = {\n uniformScaling: true,\n uniScaleKey: 'shiftKey',\n centeredScaling: false,\n centeredRotation: false,\n centeredKey: 'altKey',\n altActionKey: 'shiftKey',\n\n selection: true,\n selectionKey: 'shiftKey',\n selectionColor: 'rgba(100, 100, 255, 0.3)',\n selectionDashArray: [],\n selectionBorderColor: 'rgba(255, 255, 255, 0.3)',\n selectionLineWidth: 1,\n selectionFullyContained: false,\n\n hoverCursor: 'move',\n moveCursor: 'move',\n defaultCursor: 'default',\n freeDrawingCursor: 'crosshair',\n notAllowedCursor: 'not-allowed',\n\n perPixelTargetFind: false,\n targetFindTolerance: 0,\n skipTargetFind: false,\n\n stopContextMenu: true,\n fireRightClick: true,\n fireMiddleClick: true,\n enablePointerEvents: false,\n\n containerClass: 'canvas-container',\n preserveObjectStacking: true,\n};\n","import type { TPointerEvent } from '../EventTypeDefs';\nimport type { ITextBehavior } from '../shapes/IText/ITextBehavior';\nimport { removeFromArray } from '../util/internals/removeFromArray';\nimport type { Canvas } from './Canvas';\n\n/**\n * In charge of synchronizing all interactive text instances of a canvas\n */\nexport class TextEditingManager {\n private targets: ITextBehavior[] = [];\n declare private target?: ITextBehavior;\n private __disposer: VoidFunction;\n\n constructor(canvas: Canvas) {\n const cb = () => {\n const { hiddenTextarea } =\n (canvas.getActiveObject() as ITextBehavior) || {};\n hiddenTextarea && hiddenTextarea.focus();\n };\n const el = canvas.upperCanvasEl;\n el.addEventListener('click', cb);\n this.__disposer = () => el.removeEventListener('click', cb);\n }\n\n exitTextEditing() {\n this.target = undefined;\n this.targets.forEach((target) => {\n if (target.isEditing) {\n target.exitEditing();\n }\n });\n }\n\n add(target: ITextBehavior) {\n this.targets.push(target);\n }\n\n remove(target: ITextBehavior) {\n this.unregister(target);\n removeFromArray(this.targets, target);\n }\n\n register(target: ITextBehavior) {\n this.target = target;\n }\n\n unregister(target: ITextBehavior) {\n if (target === this.target) {\n this.target = undefined;\n }\n }\n\n onMouseMove(e: TPointerEvent) {\n this.target?.isEditing && this.target.updateSelectionOnMouseMove(e);\n }\n\n clear() {\n this.targets = [];\n this.target = undefined;\n }\n\n dispose() {\n this.clear();\n this.__disposer();\n // @ts-expect-error disposing\n delete this.__disposer;\n }\n}\n","import { classRegistry } from '../ClassRegistry';\nimport { NONE } from '../constants';\nimport type {\n CanvasEvents,\n DragEventData,\n ObjectEvents,\n TEventsExtraData,\n TPointerEvent,\n TPointerEventNames,\n Transform,\n} from '../EventTypeDefs';\nimport { Point } from '../Point';\nimport type { ActiveSelection } from '../shapes/ActiveSelection';\nimport type { Group } from '../shapes/Group';\nimport type { IText } from '../shapes/IText/IText';\nimport type { FabricObject } from '../shapes/Object/FabricObject';\nimport { isTouchEvent, stopEvent } from '../util/dom_event';\nimport { getDocumentFromElement, getWindowFromElement } from '../util/dom_misc';\nimport { sendPointToPlane } from '../util/misc/planeChange';\nimport { isActiveSelection } from '../util/typeAssertions';\nimport type { CanvasOptions, TCanvasOptions } from './CanvasOptions';\nimport { SelectableCanvas } from './SelectableCanvas';\nimport { TextEditingManager } from './TextEditingManager';\n\nconst addEventOptions = { passive: false } as EventListenerOptions;\n\nconst getEventPoints = (canvas: Canvas, e: TPointerEvent) => {\n const viewportPoint = canvas.getViewportPoint(e);\n const scenePoint = canvas.getScenePoint(e);\n return {\n viewportPoint,\n scenePoint,\n };\n};\n\n// just to be clear, the utils are now deprecated and those are here exactly as minifier helpers\n// because el.addEventListener can't me be minified while a const yes and we use it 47 times in this file.\n// few bytes but why give it away.\nconst addListener = (\n el: HTMLElement | Document,\n ...args: Parameters\n) => el.addEventListener(...args);\nconst removeListener = (\n el: HTMLElement | Document,\n ...args: Parameters\n) => el.removeEventListener(...args);\n\nconst syntheticEventConfig = {\n mouse: {\n in: 'over',\n out: 'out',\n targetIn: 'mouseover',\n targetOut: 'mouseout',\n canvasIn: 'mouse:over',\n canvasOut: 'mouse:out',\n },\n drag: {\n in: 'enter',\n out: 'leave',\n targetIn: 'dragenter',\n targetOut: 'dragleave',\n canvasIn: 'drag:enter',\n canvasOut: 'drag:leave',\n },\n} as const;\n\ntype TSyntheticEventContext = {\n mouse: { e: TPointerEvent };\n drag: DragEventData;\n};\n\nexport class Canvas extends SelectableCanvas implements CanvasOptions {\n /**\n * Contains the id of the touch event that owns the fabric transform\n * @type Number\n * @private\n */\n declare mainTouchId?: number;\n\n declare enablePointerEvents: boolean;\n\n /**\n * Holds a reference to a setTimeout timer for event synchronization\n * @type number\n * @private\n */\n private declare _willAddMouseDown: number;\n\n /**\n * Holds a reference to an object on the canvas that is receiving the drag over event.\n * @type FabricObject\n * @private\n */\n private declare _draggedoverTarget?: FabricObject;\n\n /**\n * Holds a reference to an object on the canvas from where the drag operation started\n * @type FabricObject\n * @private\n */\n private declare _dragSource?: FabricObject;\n\n /**\n * Holds a reference to an object on the canvas that is the current drop target\n * May differ from {@link _draggedoverTarget}\n * @todo inspect whether {@link _draggedoverTarget} and {@link _dropTarget} should be merged somehow\n * @type FabricObject\n * @private\n */\n private declare _dropTarget: FabricObject | undefined;\n\n /**\n * a boolean that keeps track of the click state during a cycle of mouse down/up.\n * If a mouse move occurs it becomes false.\n * Is true by default, turns false on mouse move.\n * Used to determine if a mouseUp is a click\n */\n private _isClick: boolean;\n\n textEditingManager = new TextEditingManager(this);\n\n constructor(el?: string | HTMLCanvasElement, options: TCanvasOptions = {}) {\n super(el, options);\n // bind event handlers\n (\n [\n '_onMouseDown',\n '_onTouchStart',\n '_onMouseMove',\n '_onMouseUp',\n '_onTouchEnd',\n '_onResize',\n // '_onGesture',\n // '_onDrag',\n // '_onShake',\n // '_onLongPress',\n // '_onOrientationChange',\n '_onMouseWheel',\n '_onMouseOut',\n '_onMouseEnter',\n '_onContextMenu',\n '_onClick',\n '_onDragStart',\n '_onDragEnd',\n '_onDragProgress',\n '_onDragOver',\n '_onDragEnter',\n '_onDragLeave',\n '_onDrop',\n ] as (keyof this)[]\n ).forEach((eventHandler) => {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-function-type\n this[eventHandler] = (this[eventHandler] as Function).bind(this);\n });\n // register event handlers\n this.addOrRemove(addListener, 'add');\n }\n\n /**\n * return an event prefix pointer or mouse.\n * @private\n */\n private _getEventPrefix() {\n return this.enablePointerEvents ? 'pointer' : 'mouse';\n }\n\n addOrRemove(functor: any, _eventjsFunctor: 'add' | 'remove') {\n const canvasElement = this.upperCanvasEl,\n eventTypePrefix = this._getEventPrefix();\n functor(getWindowFromElement(canvasElement), 'resize', this._onResize);\n functor(canvasElement, eventTypePrefix + 'down', this._onMouseDown);\n functor(\n canvasElement,\n `${eventTypePrefix}move`,\n this._onMouseMove,\n addEventOptions,\n );\n functor(canvasElement, `${eventTypePrefix}out`, this._onMouseOut);\n functor(canvasElement, `${eventTypePrefix}enter`, this._onMouseEnter);\n functor(canvasElement, 'wheel', this._onMouseWheel, { passive: false });\n functor(canvasElement, 'contextmenu', this._onContextMenu);\n functor(canvasElement, 'click', this._onClick);\n // decide if to remove in fabric 7.0\n functor(canvasElement, 'dblclick', this._onClick);\n functor(canvasElement, 'dragstart', this._onDragStart);\n functor(canvasElement, 'dragend', this._onDragEnd);\n functor(canvasElement, 'dragover', this._onDragOver);\n functor(canvasElement, 'dragenter', this._onDragEnter);\n functor(canvasElement, 'dragleave', this._onDragLeave);\n functor(canvasElement, 'drop', this._onDrop);\n if (!this.enablePointerEvents) {\n functor(canvasElement, 'touchstart', this._onTouchStart, addEventOptions);\n }\n // if (typeof eventjs !== 'undefined' && eventjsFunctor in eventjs) {\n // eventjs[eventjsFunctor](canvasElement, 'gesture', this._onGesture);\n // eventjs[eventjsFunctor](canvasElement, 'drag', this._onDrag);\n // eventjs[eventjsFunctor](\n // canvasElement,\n // 'orientation',\n // this._onOrientationChange\n // );\n // eventjs[eventjsFunctor](canvasElement, 'shake', this._onShake);\n // eventjs[eventjsFunctor](canvasElement, 'longpress', this._onLongPress);\n // }\n }\n\n /**\n * Removes all event listeners, used when disposing the instance\n */\n removeListeners() {\n this.addOrRemove(removeListener, 'remove');\n // if you dispose on a mouseDown, before mouse up, you need to clean document to...\n const eventTypePrefix = this._getEventPrefix();\n const doc = getDocumentFromElement(this.upperCanvasEl);\n removeListener(\n doc,\n `${eventTypePrefix}up`,\n this._onMouseUp as EventListener,\n );\n removeListener(\n doc,\n 'touchend',\n this._onTouchEnd as EventListener,\n addEventOptions,\n );\n removeListener(\n doc,\n `${eventTypePrefix}move`,\n this._onMouseMove as EventListener,\n addEventOptions,\n );\n removeListener(\n doc,\n 'touchmove',\n this._onMouseMove as EventListener,\n addEventOptions,\n );\n clearTimeout(this._willAddMouseDown);\n }\n\n /**\n * @private\n * @param {Event} [e] Event object fired on wheel event\n */\n private _onMouseWheel(e: MouseEvent) {\n this._cacheTransformEventData(e);\n this._handleEvent(e, 'wheel');\n this._resetTransformEventData();\n }\n\n /**\n * @private\n * @param {Event} e Event object fired on mousedown\n */\n private _onMouseOut(e: TPointerEvent) {\n const target = this._hoveredTarget;\n const shared = {\n e,\n ...getEventPoints(this, e),\n };\n this.fire('mouse:out', { ...shared, target });\n this._hoveredTarget = undefined;\n target && target.fire('mouseout', { ...shared });\n this._hoveredTargets.forEach((nestedTarget) => {\n this.fire('mouse:out', { ...shared, target: nestedTarget });\n nestedTarget && nestedTarget.fire('mouseout', { ...shared });\n });\n this._hoveredTargets = [];\n }\n\n /**\n * @private\n * Used when the mouse cursor enter the canvas from outside\n * @param {Event} e Event object fired on mouseenter\n */\n private _onMouseEnter(e: TPointerEvent) {\n // This find target and consequent 'mouse:over' is used to\n // clear old instances on hovered target.\n // calling findTarget has the side effect of killing target.__corner.\n // as a short term fix we are not firing this if we are currently transforming.\n // as a long term fix we need to separate the action of finding a target with the\n // side effects we added to it.\n const { target } = this.findTarget(e);\n // we fire the event only when there is no target, if there is a target, the specific\n // target event will fire.\n if (!this._currentTransform && !target) {\n this.fire('mouse:over', {\n e,\n ...getEventPoints(this, e),\n });\n this._hoveredTarget = undefined;\n this._hoveredTargets = [];\n }\n }\n\n /**\n * supports native like text dragging\n * @private\n * @param {DragEvent} e\n */\n private _onDragStart(e: DragEvent) {\n this._isClick = false;\n const activeObject = this.getActiveObject();\n if (activeObject && activeObject.onDragStart(e)) {\n this._dragSource = activeObject;\n const options = { e, target: activeObject };\n this.fire('dragstart', options);\n activeObject.fire('dragstart', options);\n addListener(\n this.upperCanvasEl,\n 'drag',\n this._onDragProgress as EventListener,\n );\n return;\n }\n stopEvent(e);\n }\n\n /**\n * First we clear top context where the effects are being rendered.\n * Then we render the effects.\n * Doing so will render the correct effect for all cases including an overlap between `source` and `target`.\n * @private\n */\n private _renderDragEffects(\n e: DragEvent,\n source?: FabricObject,\n target?: FabricObject,\n ) {\n let dirty = false;\n // clear top context\n const dropTarget = this._dropTarget;\n if (dropTarget && dropTarget !== source && dropTarget !== target) {\n dropTarget.clearContextTop();\n dirty = true;\n }\n source?.clearContextTop();\n target !== source && target?.clearContextTop();\n // render effects\n const ctx = this.contextTop;\n ctx.save();\n ctx.transform(...this.viewportTransform);\n if (source) {\n ctx.save();\n source.transform(ctx);\n source.renderDragSourceEffect(e);\n ctx.restore();\n dirty = true;\n }\n if (target) {\n ctx.save();\n target.transform(ctx);\n target.renderDropTargetEffect(e);\n ctx.restore();\n dirty = true;\n }\n ctx.restore();\n dirty && (this.contextTopDirty = true);\n }\n\n /**\n * supports native like text dragging\n * https://developer.mozilla.org/en-US/docs/Web/API/HTML_Drag_and_Drop_API/Drag_operations#finishing_a_drag\n * @private\n * @param {DragEvent} e\n */\n private _onDragEnd(e: DragEvent) {\n const { currentSubTargets } = this.findTarget(e);\n const didDrop = !!e.dataTransfer && e.dataTransfer.dropEffect !== NONE,\n dropTarget = didDrop ? this._activeObject : undefined,\n options = {\n e,\n target: this._dragSource as FabricObject,\n subTargets: currentSubTargets,\n dragSource: this._dragSource as FabricObject,\n didDrop,\n dropTarget: dropTarget as FabricObject,\n };\n removeListener(\n this.upperCanvasEl,\n 'drag',\n this._onDragProgress as EventListener,\n );\n this.fire('dragend', options);\n this._dragSource && this._dragSource.fire('dragend', options);\n delete this._dragSource;\n // we need to call mouse up synthetically because the browser won't\n this._onMouseUp(e);\n }\n\n /**\n * fire `drag` event on canvas and drag source\n * @private\n * @param {DragEvent} e\n */\n private _onDragProgress(e: DragEvent) {\n const options = {\n e,\n target: this._dragSource,\n dragSource: this._dragSource,\n dropTarget: this._draggedoverTarget as FabricObject,\n };\n this.fire('drag', options);\n this._dragSource && this._dragSource.fire('drag', options);\n }\n\n /**\n * prevent default to allow drop event to be fired\n * https://developer.mozilla.org/en-US/docs/Web/API/HTML_Drag_and_Drop_API/Drag_operations#specifying_drop_targets\n * @private\n * @param {DragEvent} [e] Event object fired on Event.js shake\n */\n private _onDragOver(e: DragEvent) {\n const eventType = 'dragover';\n const { currentContainer: target, currentSubTargets } = this.findTarget(e);\n const dragSource = this._dragSource as FabricObject;\n const options = {\n e,\n target,\n subTargets: currentSubTargets,\n dragSource,\n canDrop: false,\n dropTarget: undefined,\n };\n let dropTarget;\n // fire on canvas\n this.fire(eventType, options);\n // make sure we fire dragenter events before dragover\n // if dragleave is needed, object will not fire dragover so we don't need to trouble ourselves with it\n this._fireEnterLeaveEvents(e, target, options);\n if (target) {\n if (target.canDrop(e)) {\n dropTarget = target;\n }\n target.fire(eventType, options);\n }\n // propagate the event to subtargets\n for (let i = 0; i < currentSubTargets.length; i++) {\n const subTarget = currentSubTargets[i];\n // accept event only if previous targets didn't (the accepting target calls `preventDefault` to inform that the event is taken)\n // TODO: verify if those should loop in inverse order then?\n // what is the order of subtargets?\n if (subTarget.canDrop(e)) {\n dropTarget = subTarget;\n }\n subTarget.fire(eventType, options);\n }\n // render drag effects now that relations between source and target is clear\n this._renderDragEffects(e, dragSource, dropTarget);\n this._dropTarget = dropTarget;\n }\n\n /**\n * fire `dragleave` on `dragover` targets\n * @private\n * @param {Event} [e] Event object fired on Event.js shake\n */\n private _onDragEnter(e: DragEvent) {\n const { currentContainer, currentSubTargets } = this.findTarget(e);\n const options = {\n e,\n target: currentContainer,\n subTargets: currentSubTargets,\n dragSource: this._dragSource,\n };\n this.fire('dragenter', options);\n // fire dragenter on targets\n this._fireEnterLeaveEvents(e, currentContainer, options);\n }\n\n /**\n * fire `dragleave` on `dragover` targets\n * @private\n * @param {Event} [e] Event object fired on Event.js shake\n */\n private _onDragLeave(e: DragEvent) {\n const { currentSubTargets } = this.findTarget(e);\n const options = {\n e,\n target: this._draggedoverTarget,\n subTargets: currentSubTargets,\n dragSource: this._dragSource,\n };\n this.fire('dragleave', options);\n\n // fire dragleave on targets\n this._fireEnterLeaveEvents(e, undefined, options);\n this._renderDragEffects(e, this._dragSource);\n this._dropTarget = undefined;\n this._hoveredTargets = [];\n }\n\n /**\n * `drop:before` is a an event that allows you to schedule logic\n * before the `drop` event. Prefer `drop` event always, but if you need\n * to run some drop-disabling logic on an event, since there is no way\n * to handle event handlers ordering, use `drop:before`\n * @private\n * @param {Event} e\n */\n private _onDrop(e: DragEvent) {\n const { currentContainer, currentSubTargets } = this.findTarget(e);\n const options = this._basicEventHandler('drop:before', {\n e,\n target: currentContainer,\n subTargets: currentSubTargets,\n dragSource: this._dragSource,\n ...getEventPoints(this, e),\n });\n // will be set by the drop target\n options.didDrop = false;\n // will be set by the drop target, used in case options.target refuses the drop\n options.dropTarget = undefined;\n // fire `drop`\n this._basicEventHandler('drop', options);\n // inform canvas of the drop\n // we do this because canvas was unaware of what happened at the time the `drop` event was fired on it\n // use for side effects\n this.fire('drop:after', options);\n }\n\n /**\n * @private\n * @param {Event} e Event object fired on mousedown\n */\n private _onContextMenu(e: TPointerEvent): false {\n const { target, subTargets } = this.findTarget(e);\n const options = this._basicEventHandler('contextmenu:before', {\n e,\n target,\n subTargets,\n });\n // TODO: this line is silly because the dev can subscribe to the event and prevent it themselves\n this.stopContextMenu && stopEvent(e);\n this._basicEventHandler('contextmenu', options);\n return false;\n }\n\n /**\n * @private\n * @param {Event} e Event object fired on mousedown\n */\n private _onClick(e: TPointerEvent) {\n const clicks = e.detail;\n if (clicks > 3 || clicks < 2) return;\n this._cacheTransformEventData(e);\n clicks == 2 && e.type === 'dblclick' && this._onDblClick(e);\n clicks == 3 && this._handleEvent(e, 'tripleclick');\n this._resetTransformEventData();\n }\n\n /**\n * 双击选择锁定组的子节点\n * @param e\n */\n private _onDblClick(e: TPointerEvent) {\n if (this.dblClickLock(e)) {\n // 锁定后立即选中点击子对象\n this._resetTransformEventData();\n this.__onMouseDown(e);\n this.__onMouseUp(e);\n return;\n }\n this._handleEvent(e, 'dblclick');\n }\n\n /**\n * Return a the id of an event.\n * returns either the pointerId or the identifier or 0 for the mouse event\n * @private\n * @param {Event} evt Event object\n */\n getPointerId(evt: TouchEvent | PointerEvent): number {\n const changedTouches = (evt as TouchEvent).changedTouches;\n\n if (changedTouches) {\n return changedTouches[0] && changedTouches[0].identifier;\n }\n\n if (this.enablePointerEvents) {\n return (evt as PointerEvent).pointerId;\n }\n\n return -1;\n }\n\n /**\n * Determines if an event has the id of the event that is considered main\n * @private\n * @param {evt} event Event object\n */\n _isMainEvent(evt: TPointerEvent): boolean {\n if ((evt as PointerEvent).isPrimary === true) {\n return true;\n }\n if ((evt as PointerEvent).isPrimary === false) {\n return false;\n }\n if (evt.type === 'touchend' && (evt as TouchEvent).touches.length === 0) {\n return true;\n }\n if ((evt as TouchEvent).changedTouches) {\n return (\n (evt as TouchEvent).changedTouches[0].identifier === this.mainTouchId\n );\n }\n return true;\n }\n\n /**\n * @private\n * @param {Event} e Event object fired on mousedown\n */\n _onTouchStart(e: TouchEvent) {\n this._cacheTransformEventData(e);\n // we will prevent scrolling if allowTouchScrolling is not enabled and\n let shouldPreventScrolling = !this.allowTouchScrolling;\n const currentActiveObject = this._activeObject;\n if (this.mainTouchId === undefined) {\n this.mainTouchId = this.getPointerId(e);\n }\n this.__onMouseDown(e);\n const { target } = this.findTarget(e);\n // after executing fabric logic for mouse down let's see\n // if we didn't change target or if we are drawing\n // we want to prevent scrolling anyway\n if (\n this.isDrawingMode ||\n (currentActiveObject && target === currentActiveObject)\n ) {\n shouldPreventScrolling = true;\n }\n // prevent default, will block scrolling from start\n shouldPreventScrolling && e.preventDefault();\n const canvasElement = this.upperCanvasEl,\n eventTypePrefix = this._getEventPrefix();\n const doc = getDocumentFromElement(canvasElement);\n addListener(\n doc,\n 'touchend',\n this._onTouchEnd as EventListener,\n addEventOptions,\n );\n // if we scroll don't register the touch move event\n shouldPreventScrolling &&\n addListener(\n doc,\n 'touchmove',\n this._onMouseMove as EventListener,\n addEventOptions,\n );\n // Unbind mousedown to prevent double triggers from touch devices\n removeListener(\n canvasElement,\n `${eventTypePrefix}down`,\n this._onMouseDown as EventListener,\n );\n this._resetTransformEventData();\n }\n\n /**\n * @private\n * @param {Event} e Event object fired on mousedown\n */\n _onMouseDown(e: TPointerEvent) {\n this._cacheTransformEventData(e);\n this.__onMouseDown(e);\n const canvasElement = this.upperCanvasEl,\n eventTypePrefix = this._getEventPrefix();\n // switch from moving on the canvas element to moving on the document\n removeListener(\n canvasElement,\n `${eventTypePrefix}move`,\n this._onMouseMove as EventListener,\n addEventOptions,\n );\n const doc = getDocumentFromElement(canvasElement);\n addListener(doc, `${eventTypePrefix}up`, this._onMouseUp as EventListener);\n addListener(\n doc,\n `${eventTypePrefix}move`,\n this._onMouseMove as EventListener,\n addEventOptions,\n );\n this._resetTransformEventData();\n }\n\n /**\n * @private\n * @param {Event} e Event object fired on mousedown\n */\n _onTouchEnd(e: TouchEvent) {\n if (e.touches.length > 0) {\n // if there are still touches stop here\n return;\n }\n this._cacheTransformEventData(e);\n this.__onMouseUp(e);\n this._resetTransformEventData();\n delete this.mainTouchId;\n const eventTypePrefix = this._getEventPrefix();\n const doc = getDocumentFromElement(this.upperCanvasEl);\n removeListener(\n doc,\n 'touchend',\n this._onTouchEnd as EventListener,\n addEventOptions,\n );\n removeListener(\n doc,\n 'touchmove',\n this._onMouseMove as EventListener,\n addEventOptions,\n );\n if (this._willAddMouseDown) {\n clearTimeout(this._willAddMouseDown);\n }\n this._willAddMouseDown = setTimeout(() => {\n // Wait 400ms before rebinding mousedown to prevent double triggers\n // from touch devices\n addListener(\n this.upperCanvasEl,\n `${eventTypePrefix}down`,\n this._onMouseDown as EventListener,\n );\n this._willAddMouseDown = 0;\n }, 400) as unknown as number;\n }\n\n /**\n * @private\n * @param {Event} e Event object fired on mouseup\n */\n _onMouseUp(e: TPointerEvent) {\n this._cacheTransformEventData(e);\n this.__onMouseUp(e);\n const canvasElement = this.upperCanvasEl,\n eventTypePrefix = this._getEventPrefix();\n if (this._isMainEvent(e)) {\n const doc = getDocumentFromElement(this.upperCanvasEl);\n removeListener(\n doc,\n `${eventTypePrefix}up`,\n this._onMouseUp as EventListener,\n );\n removeListener(\n doc,\n `${eventTypePrefix}move`,\n this._onMouseMove as EventListener,\n addEventOptions,\n );\n addListener(\n canvasElement,\n `${eventTypePrefix}move`,\n this._onMouseMove as EventListener,\n addEventOptions,\n );\n }\n this._resetTransformEventData();\n }\n\n /**\n * @private\n * @param {Event} e Event object fired on mousemove\n */\n _onMouseMove(e: TPointerEvent) {\n this._cacheTransformEventData(e);\n\n const activeObject = this.getActiveObject();\n !this.allowTouchScrolling &&\n (!activeObject ||\n // a drag event sequence is started by the active object flagging itself on mousedown / mousedown:before\n // we must not prevent the event's default behavior in order for the window to start dragging\n !activeObject.shouldStartDragging(e)) &&\n e.preventDefault &&\n e.preventDefault();\n this.__onMouseMove(e);\n this._resetTransformEventData();\n }\n\n /**\n * @private\n */\n _onResize() {\n this.calcOffset();\n this._resetTransformEventData();\n }\n\n /**\n * Decides whether the canvas should be redrawn in mouseup and mousedown events.\n * @private\n * @param {Object} target\n */\n _shouldRender(target: FabricObject | undefined) {\n const activeObject = this.getActiveObject();\n // if just one of them is available or if they are both but are different objects\n // this covers: switch of target, from target to no target, selection of target\n // multiSelection with key and mouse\n return (\n !!activeObject !== !!target ||\n (activeObject && target && activeObject !== target)\n );\n }\n\n /**\n * Method that defines the actions when mouse is released on canvas.\n * The method resets the currentTransform parameters, store the image corner\n * position in the image object and render the canvas on top.\n * @private\n * @param {Event} e Event object fired on mouseup\n */\n __onMouseUp(e: TPointerEvent) {\n this._handleEvent(e, 'up:before');\n\n const transform = this._currentTransform;\n const isClick = this._isClick;\n const { target } = this.findTarget(e);\n\n // if right/middle click just fire events and return\n // target undefined will make the _handleEvent search the target\n const { button } = e as MouseEvent;\n if (button) {\n ((this.fireMiddleClick && button === 1) ||\n (this.fireRightClick && button === 2)) &&\n this._handleEvent(e, 'up');\n return;\n }\n\n if (this.isDrawingMode && this._isCurrentlyDrawing) {\n this._onMouseUpInDrawingMode(e);\n return;\n }\n\n if (!this._isMainEvent(e)) {\n return;\n }\n let shouldRender = false;\n if (transform) {\n this._finalizeCurrentTransform(e);\n shouldRender = transform.actionPerformed;\n }\n if (!isClick) {\n const targetWasActive = target === this._activeObject;\n this.handleSelection(e);\n if (!shouldRender) {\n shouldRender =\n this._shouldRender(target) ||\n (!targetWasActive && target === this._activeObject);\n }\n }\n let pointer, corner;\n if (target) {\n const found = target.findControl(\n this.getViewportPoint(e),\n isTouchEvent(e),\n );\n const { key, control } = found || {};\n corner = key;\n if (\n target.selectable &&\n target !== this._activeObject &&\n target.activeOn === 'up'\n ) {\n this.setActiveObject(target, e);\n shouldRender = true;\n } else if (control) {\n const mouseUpHandler = control.getMouseUpHandler(e, target, control);\n if (mouseUpHandler) {\n pointer = this.getScenePoint(e);\n mouseUpHandler.call(control, e, transform!, pointer.x, pointer.y);\n }\n }\n target.isMoving = false;\n }\n // if we are ending up a transform on a different control or a new object\n // fire the original mouse up from the corner that started the transform\n if (\n transform &&\n (transform.target !== target || transform.corner !== corner)\n ) {\n const originalControl =\n transform.target && transform.target.controls[transform.corner],\n originalMouseUpHandler =\n originalControl &&\n originalControl.getMouseUpHandler(\n e,\n transform.target,\n originalControl,\n );\n pointer = pointer || this.getScenePoint(e);\n originalMouseUpHandler &&\n originalMouseUpHandler.call(\n originalControl,\n e,\n transform,\n pointer.x,\n pointer.y,\n );\n }\n this._setCursorFromEvent(e, target);\n this._handleEvent(e, 'up');\n this._groupSelector = null;\n this._currentTransform = null;\n // reset the target information about which corner is selected\n target && (target.__corner = undefined);\n if (shouldRender) {\n this.requestRenderAll();\n } else if (!isClick && !(this._activeObject as IText)?.isEditing) {\n this.renderTop();\n }\n }\n\n _basicEventHandler(\n eventType: T,\n options: (CanvasEvents & ObjectEvents)[T],\n ) {\n const { target, subTargets = [] } = options as {\n target?: FabricObject;\n subTargets: FabricObject[];\n };\n this.fire(eventType, options);\n target && target.fire(eventType, options);\n for (let i = 0; i < subTargets.length; i++) {\n subTargets[i] !== target && subTargets[i].fire(eventType, options);\n }\n return options;\n }\n\n /**\n * @private\n * Handle event firing for target and subtargets\n * @param {TPointerEvent} e event from mouse\n * @param {TPointerEventNames} eventType\n */\n _handleEvent(\n e: TPointerEvent,\n eventType: T,\n extraData?: TEventsExtraData[T],\n ) {\n const { target, subTargets } = this.findTarget(e),\n options: CanvasEvents[`mouse:${T}`] = {\n e,\n target,\n subTargets,\n ...getEventPoints(this, e),\n transform: this._currentTransform,\n ...(eventType === 'down:before' || eventType === 'down'\n ? extraData\n : {}),\n } as CanvasEvents[`mouse:${T}`];\n if (eventType === 'up:before' || eventType === 'up') {\n (options as CanvasEvents[`mouse:up`]).isClick = this._isClick;\n }\n this.fire(`mouse:${eventType}`, options);\n // this may be a little be more complicated of what we want to handle\n target && target.fire(`mouse${eventType}`, options);\n for (let i = 0; i < subTargets.length; i++) {\n subTargets[i] !== target &&\n subTargets[i].fire(`mouse${eventType}`, options);\n }\n }\n\n /**\n * @private\n * @param {Event} e Event object fired on mousedown\n */\n _onMouseDownInDrawingMode(e: TPointerEvent) {\n this._isCurrentlyDrawing = true;\n if (this.getActiveObject()) {\n this.discardActiveObject(e);\n this.requestRenderAll();\n }\n // TODO: this is a scene point so it should be renamed\n const pointer = this.getScenePoint(e);\n this.freeDrawingBrush &&\n this.freeDrawingBrush.onMouseDown(pointer, { e, pointer });\n this._handleEvent(e, 'down', { alreadySelected: false });\n }\n\n /**\n * @private\n * @param {Event} e Event object fired on mousemove\n */\n _onMouseMoveInDrawingMode(e: TPointerEvent) {\n if (this._isCurrentlyDrawing) {\n const pointer = this.getScenePoint(e);\n this.freeDrawingBrush &&\n this.freeDrawingBrush.onMouseMove(pointer, {\n e,\n // this is an absolute pointer, the naming is wrong\n pointer,\n });\n }\n this.setCursor(this.freeDrawingCursor);\n this._handleEvent(e, 'move');\n }\n\n /**\n * @private\n * @param {Event} e Event object fired on mouseup\n */\n _onMouseUpInDrawingMode(e: TPointerEvent) {\n const pointer = this.getScenePoint(e);\n if (this.freeDrawingBrush) {\n this._isCurrentlyDrawing = !!this.freeDrawingBrush.onMouseUp({\n e: e,\n // this is an absolute pointer, the naming is wrong\n pointer,\n });\n } else {\n this._isCurrentlyDrawing = false;\n }\n this._handleEvent(e, 'up');\n }\n\n /**\n * Method that defines the actions when mouse is clicked on canvas.\n * The method inits the currentTransform parameters and renders all the\n * canvas so the current image can be placed on the top canvas and the rest\n * in on the container one.\n * @private\n * @param {Event} e Event object fired on mousedown\n */\n __onMouseDown(e: TPointerEvent) {\n this._isClick = true;\n this._handleEvent(e, 'down:before');\n\n let { target } = this.findTarget(e);\n let alreadySelected = !!target && target === this._activeObject;\n // if right/middle click just fire events\n const { button } = e as MouseEvent;\n if (button) {\n ((this.fireMiddleClick && button === 1) ||\n (this.fireRightClick && button === 2)) &&\n this._handleEvent(e, 'down', {\n alreadySelected,\n });\n return;\n }\n\n if (this.isDrawingMode) {\n this._onMouseDownInDrawingMode(e);\n return;\n }\n\n if (!this._isMainEvent(e)) {\n return;\n }\n\n // ignore if some object is being transformed at this moment\n if (this._currentTransform) {\n return;\n }\n\n let shouldRender = this._shouldRender(target);\n let grouped = false;\n if (this.handleMultiSelection(e, target)) {\n // active object might have changed while grouping\n target = this._activeObject;\n grouped = true;\n shouldRender = true;\n } else if (this._shouldClearSelection(e, target)) {\n this.discardActiveObject(e);\n\n // 锁定对象时且没有指定选中时,如果点击组外空白或对象,取消锁定\n if (this.isolatedObject && !this._searchTargets) {\n this.setSearchTargets([this.isolatedObject]);\n const { target } = this.findTarget(e);\n // 没有选中任何对象,或者选中的是锁定对象以外的对象\n if (target !== this.isolatedObject) {\n this.isolatedObject = null;\n }\n this.setSearchTargets(null);\n // 在此执行__onMouseDown选中其他对象\n this._resetTransformEventData();\n this.__onMouseDown(e);\n return;\n }\n }\n // we start a group selector rectangle if\n // selection is enabled\n // and there is no target, or the following 3 conditions are satisfied:\n // target is not selectable ( otherwise we selected it )\n // target is not editing\n // target is not already selected ( otherwise we drag )\n if (\n this.selection &&\n (!target ||\n (!target.selectable &&\n !(target as IText).isEditing &&\n target !== this._activeObject))\n ) {\n const p = this.getScenePoint(e);\n this._groupSelector = {\n x: p.x,\n y: p.y,\n deltaY: 0,\n deltaX: 0,\n };\n }\n\n // check again because things could have changed\n alreadySelected = !!target && target === this._activeObject;\n if (target) {\n if (target.selectable && target.activeOn === 'down') {\n this.setActiveObject(target, e);\n }\n const handle = target.findControl(\n this.getViewportPoint(e),\n isTouchEvent(e),\n );\n if (target === this._activeObject && (handle || !grouped)) {\n this._setupCurrentTransform(e, target, alreadySelected);\n const control = handle ? handle.control : undefined,\n pointer = this.getScenePoint(e),\n mouseDownHandler =\n control && control.getMouseDownHandler(e, target, control);\n mouseDownHandler &&\n mouseDownHandler.call(\n control,\n e,\n this._currentTransform!,\n pointer.x,\n pointer.y,\n );\n }\n }\n // we clear `_objectsToRender` in case of a change in order to repopulate it at rendering\n // run before firing the `down` event to give the dev a chance to populate it themselves\n shouldRender && (this._objectsToRender = undefined);\n this._handleEvent(e, 'down', { alreadySelected: alreadySelected });\n // we must renderAll so that we update the visuals\n shouldRender && this.requestRenderAll();\n }\n\n /**\n * reset cache form common information needed during event processing\n * @private\n */\n _resetTransformEventData() {\n this._targetInfo = this._viewportPoint = this._scenePoint = undefined;\n }\n\n /**\n * Cache common information needed during event processing\n * @private\n * @param {Event} e Event object fired on event\n */\n _cacheTransformEventData(e: TPointerEvent) {\n // reset in order to avoid stale caching\n this._resetTransformEventData();\n this._viewportPoint = this.getViewportPoint(e);\n this._scenePoint = sendPointToPlane(\n this._viewportPoint,\n undefined,\n this.viewportTransform,\n );\n this._targetInfo = this.findTarget(e);\n // TODO: investigate better if this can be made less implicit in the code\n if (this._currentTransform) {\n this._targetInfo.target = this._currentTransform.target;\n }\n }\n\n /**\n * Method that defines the actions when mouse is hovering the canvas.\n * The currentTransform parameter will define whether the user is rotating/scaling/translating\n * an image or neither of them (only hovering). A group selection is also possible and would cancel\n * all any other type of action.\n * In case of an image transformation only the top canvas will be rendered.\n * @private\n * @param {Event} e Event object fired on mousemove\n */\n __onMouseMove(e: TPointerEvent) {\n this._isClick = false;\n this._handleEvent(e, 'move:before');\n\n if (this.isDrawingMode) {\n this._onMouseMoveInDrawingMode(e);\n return;\n }\n\n if (!this._isMainEvent(e)) {\n return;\n }\n\n const groupSelector = this._groupSelector;\n\n // We initially clicked in an empty area, so we draw a box for multiple selection\n if (groupSelector) {\n const pointer = this.getScenePoint(e);\n\n groupSelector.deltaX = pointer.x - groupSelector.x;\n groupSelector.deltaY = pointer.y - groupSelector.y;\n\n this.renderTop();\n } else if (!this._currentTransform) {\n const { target } = this.findTarget(e);\n this._setCursorFromEvent(e, target);\n this._fireOverOutEvents(e, target);\n } else {\n this._transformObject(e);\n }\n this.textEditingManager.onMouseMove(e);\n this._handleEvent(e, 'move');\n }\n\n /**\n * Manage the mouseout, mouseover events for the fabric object on the canvas\n * @param {Fabric.Object} target the target where the target from the mousemove event\n * @param {Event} e Event object fired on mousemove\n * @private\n */\n _fireOverOutEvents(e: TPointerEvent, target?: FabricObject) {\n const { _hoveredTarget, _hoveredTargets } = this,\n { subTargets } = this.findTarget(e),\n length = Math.max(_hoveredTargets.length, subTargets.length);\n\n this.fireSyntheticInOutEvents('mouse', {\n e,\n target,\n oldTarget: _hoveredTarget,\n fireCanvas: true,\n });\n for (let i = 0; i < length; i++) {\n if (\n subTargets[i] === target ||\n (_hoveredTargets[i] && _hoveredTargets[i] === _hoveredTarget)\n ) {\n continue;\n }\n this.fireSyntheticInOutEvents('mouse', {\n e,\n target: subTargets[i],\n oldTarget: _hoveredTargets[i],\n });\n }\n this._hoveredTarget = target;\n this._hoveredTargets = subTargets;\n }\n\n /**\n * Manage the dragEnter, dragLeave events for the fabric objects on the canvas\n * @param {Fabric.Object} target the target where the target from the onDrag event\n * @param {Object} data Event object fired on dragover\n * @private\n */\n _fireEnterLeaveEvents(\n e: TPointerEvent,\n target: FabricObject | undefined,\n data: DragEventData,\n ) {\n const draggedoverTarget = this._draggedoverTarget,\n _hoveredTargets = this._hoveredTargets,\n { subTargets } = this.findTarget(e),\n length = Math.max(_hoveredTargets.length, subTargets.length);\n\n this.fireSyntheticInOutEvents('drag', {\n ...data,\n target,\n oldTarget: draggedoverTarget,\n fireCanvas: true,\n });\n for (let i = 0; i < length; i++) {\n this.fireSyntheticInOutEvents('drag', {\n ...data,\n target: subTargets[i],\n oldTarget: _hoveredTargets[i],\n });\n }\n this._draggedoverTarget = target;\n }\n\n /**\n * Manage the synthetic in/out events for the fabric objects on the canvas\n * @param {Fabric.Object} target the target where the target from the supported events\n * @param {Object} data Event object fired\n * @param {Object} config configuration for the function to work\n * @param {String} config.targetName property on the canvas where the old target is stored\n * @param {String} [config.canvasEvtOut] name of the event to fire at canvas level for out\n * @param {String} config.evtOut name of the event to fire for out\n * @param {String} [config.canvasEvtIn] name of the event to fire at canvas level for in\n * @param {String} config.evtIn name of the event to fire for in\n * @private\n */\n fireSyntheticInOutEvents(\n type: T,\n {\n target,\n oldTarget,\n fireCanvas,\n e,\n ...data\n }: TSyntheticEventContext[T] & {\n target?: FabricObject;\n oldTarget?: FabricObject;\n fireCanvas?: boolean;\n },\n ) {\n const { targetIn, targetOut, canvasIn, canvasOut } =\n syntheticEventConfig[type];\n const targetChanged = oldTarget !== target;\n\n if (oldTarget && targetChanged) {\n const outOpt: CanvasEvents[typeof canvasOut] = {\n ...data,\n e,\n target: oldTarget,\n nextTarget: target,\n ...getEventPoints(this, e),\n };\n fireCanvas && this.fire(canvasOut, outOpt);\n oldTarget.fire(targetOut, outOpt);\n }\n if (target && targetChanged) {\n const inOpt: CanvasEvents[typeof canvasIn] = {\n ...data,\n e,\n target,\n previousTarget: oldTarget,\n ...getEventPoints(this, e),\n };\n fireCanvas && this.fire(canvasIn, inOpt);\n target.fire(targetIn, inOpt);\n }\n }\n\n /**\n * @private\n * @param {Event} e Event fired on mousemove\n */\n _transformObject(e: TPointerEvent) {\n const scenePoint = this.getScenePoint(e),\n transform = this._currentTransform!,\n target = transform.target,\n // transform pointer to target's containing coordinate plane\n // both pointer and object should agree on every point\n localPointer = target.group\n ? sendPointToPlane(\n scenePoint,\n undefined,\n target.group.calcTransformMatrix(),\n )\n : scenePoint;\n transform.shiftKey = e.shiftKey;\n transform.altKey = !!this.centeredKey && e[this.centeredKey];\n\n this._performTransformAction(e, transform, localPointer);\n transform.actionPerformed && this.requestRenderAll();\n }\n\n /**\n * @private\n */\n _performTransformAction(\n e: TPointerEvent,\n transform: Transform,\n pointer: Point,\n ) {\n const { action, actionHandler, target } = transform;\n\n const actionPerformed =\n !!actionHandler && actionHandler(e, transform, pointer.x, pointer.y);\n actionPerformed && target.setCoords();\n\n // this object could be created from the function in the control handlers\n if (action === 'drag' && actionPerformed) {\n transform.target.isMoving = true;\n this.setCursor(transform.target.moveCursor || this.moveCursor);\n }\n transform.actionPerformed = transform.actionPerformed || actionPerformed;\n }\n\n /**\n * Sets the cursor depending on where the canvas is being hovered.\n * Note: very buggy in Opera\n * @param {Event} e Event object\n * @param {Object} target Object that the mouse is hovering, if so.\n */\n _setCursorFromEvent(e: TPointerEvent, target?: FabricObject) {\n if (!target) {\n this.setCursor(this.defaultCursor);\n return;\n }\n let hoverCursor = target.hoverCursor || this.hoverCursor;\n const activeSelection = isActiveSelection(this._activeObject)\n ? this._activeObject\n : null,\n // only show proper corner when group selection is not active\n corner =\n (!activeSelection || target.group !== activeSelection) &&\n // here we call findTargetCorner always with undefined for the touch parameter.\n // we assume that if you are using a cursor you do not need to interact with\n // the bigger touch area.\n target.findControl(this.getViewportPoint(e));\n\n if (!corner) {\n if ((target as Group).subTargetCheck) {\n // hoverCursor should come from top-most subTarget,\n // so we walk the array backwards\n const { subTargets } = this.findTarget(e);\n subTargets\n .concat()\n .reverse()\n .forEach((_target) => {\n hoverCursor = _target.hoverCursor || hoverCursor;\n });\n }\n this.setCursor(hoverCursor);\n } else {\n const { control, coord } = corner;\n this.setCursor(control.cursorStyleHandler(e, control, target, coord));\n }\n }\n\n /**\n * ## Handles multiple selection\n * - toggles `target` selection (selects/deselects `target` if it isn't/is selected respectively)\n * - sets the active object in case it is not set or in case there is a single active object left under active selection.\n * ---\n * - If the active object is the active selection we add/remove `target` from it\n * - If not, add the active object and `target` to the active selection and make it the active object.\n * @TODO rewrite this after find target is refactored\n * @private\n * @param {TPointerEvent} e Event object\n * @param {FabricObject} target target of event to select/deselect\n * @returns true if grouping occurred\n */\n protected handleMultiSelection(e: TPointerEvent, target?: FabricObject) {\n const activeObject = this._activeObject;\n const isAS = isActiveSelection(activeObject);\n if (\n // check if an active object exists on canvas and if the user is pressing the `selectionKey` while canvas supports multi selection.\n !!activeObject &&\n this._isSelectionKeyPressed(e) &&\n this.selection &&\n // on top of that the user also has to hit a target that is selectable.\n !!target &&\n target.selectable &&\n // group target and active object only if they are different objects\n // else we try to find a subtarget of `ActiveSelection`\n (activeObject !== target || isAS) &&\n // make sure `activeObject` and `target` aren't ancestors of each other in case `activeObject` is not `ActiveSelection`\n // if it is then we want to remove `target` from it\n (isAS ||\n (!target.isDescendantOf(activeObject) &&\n !activeObject.isDescendantOf(target))) &&\n // target accepts selection\n !target.onSelect({ e }) &&\n // make sure we are not on top of a control\n !activeObject.getActiveControl()\n ) {\n if (isAS) {\n const prevActiveObjects = activeObject.getObjects();\n let subTargets: FabricObject[] = [];\n // const { subTargets: testSubTargets } = this.findTarget(e);\n if (target === activeObject) {\n const pointer = this.getScenePoint(e);\n let targetInfo = this.searchPossibleTargets(\n prevActiveObjects,\n pointer,\n );\n // console.log(testSubTargets.includes(targetInfo.target));\n if (targetInfo.target) {\n target = targetInfo.target;\n subTargets = targetInfo.subTargets;\n } else {\n targetInfo = this.searchPossibleTargets(this._objects, pointer);\n target = targetInfo.target;\n subTargets = targetInfo.subTargets;\n }\n // if nothing is found bail out\n if (!target || !target.selectable) {\n return false;\n }\n }\n if (target.group === activeObject) {\n // `target` is part of active selection => remove it\n activeObject.remove(target);\n this._hoveredTarget = target;\n this._hoveredTargets = subTargets;\n // if after removing an object we are left with one only...\n if (activeObject.size() === 1) {\n // activate last remaining object\n // deselecting the active selection will remove the remaining object from it\n this._setActiveObject(activeObject.item(0), e);\n }\n } else {\n // `target` isn't part of active selection => add it\n activeObject.multiSelectAdd(target);\n this._hoveredTarget = activeObject;\n this._hoveredTargets = subTargets;\n }\n this._fireSelectionEvents(prevActiveObjects, e);\n } else {\n (activeObject as IText).isEditing &&\n (activeObject as IText).exitEditing();\n // add the active object and the target to the active selection and set it as the active object\n const klass =\n classRegistry.getClass('ActiveSelection');\n const newActiveSelection = new klass([], {\n /**\n * it is crucial to pass the canvas ref before calling {@link ActiveSelection#multiSelectAdd}\n * since it uses {@link FabricObject#isInFrontOf} which relies on the canvas ref\n */\n canvas: this,\n });\n newActiveSelection.multiSelectAdd(activeObject, target);\n this._hoveredTarget = newActiveSelection;\n // ISSUE 4115: should we consider subTargets here?\n // this._hoveredTargets = [];\n // this._hoveredTargets = this.targets.concat();\n this._setActiveObject(newActiveSelection, e);\n this._fireSelectionEvents([activeObject], e);\n }\n return true;\n }\n return false;\n }\n\n /**\n * ## Handles selection\n * - selects objects that are contained in (and possibly intersecting) the selection bounding box\n * - sets the active object\n * ---\n * runs on mouse up after a mouse move\n */\n protected handleSelection(e: TPointerEvent) {\n if (!this.selection || !this._groupSelector) {\n return false;\n }\n const { x, y, deltaX, deltaY } = this._groupSelector,\n point1 = new Point(x, y),\n point2 = point1.add(new Point(deltaX, deltaY)),\n tl = point1.min(point2),\n br = point1.max(point2),\n size = br.subtract(tl);\n\n const collectedObjects = this.collectObjects(\n {\n left: tl.x,\n top: tl.y,\n width: size.x,\n height: size.y,\n },\n { includeIntersecting: !this.selectionFullyContained },\n ) as FabricObject[];\n\n const objects =\n // though this method runs only after mouse move the pointer could do a mouse up on the same position as mouse down\n // should it be handled as is?\n point1.eq(point2)\n ? collectedObjects[0]\n ? [collectedObjects[0]]\n : []\n : collectedObjects.length > 1\n ? collectedObjects\n .filter((object) => !object.onSelect({ e }))\n .reverse()\n : // `setActiveObject` will call `onSelect(collectedObjects[0])` in this case\n collectedObjects;\n\n // set active object\n if (objects.length === 1) {\n // set as active object\n this.setActiveObject(objects[0], e);\n } else if (objects.length > 1) {\n // add to active selection and make it the active object\n const klass =\n classRegistry.getClass('ActiveSelection');\n this.setActiveObject(new klass(objects, { canvas: this }), e);\n }\n\n // cleanup\n this._groupSelector = null;\n return true;\n }\n\n /**\n * @override clear {@link textEditingManager}\n */\n clear() {\n this.textEditingManager.clear();\n super.clear();\n }\n\n /**\n * @override clear {@link textEditingManager}\n */\n destroy() {\n this.removeListeners();\n this.textEditingManager.dispose();\n super.destroy();\n }\n}\n","export const linearDefaultCoords = {\n x1: 0,\n y1: 0,\n x2: 0,\n y2: 0,\n};\n\nexport const radialDefaultCoords = {\n ...linearDefaultCoords,\n r1: 0,\n r2: 0,\n};\n","/**\n *\n * @param value value to check if NaN\n * @param [valueIfNaN]\n * @returns `fallback` is `value is NaN\n */\nexport const ifNaN = (value: number, valueIfNaN?: number) => {\n return isNaN(value) && typeof valueIfNaN === 'number' ? valueIfNaN : value;\n};\n","import { ifNaN } from '../util/internals/ifNaN';\nimport { capValue } from '../util/misc/capValue';\n\nconst RE_PERCENT = /^(\\d+\\.\\d+)%|(\\d+)%$/;\n\nexport function isPercent(value: string | null) {\n return value && RE_PERCENT.test(value);\n}\n\n/**\n *\n * @param value\n * @param valueIfNaN\n * @returns ∈ [0, 1]\n */\nexport function parsePercent(\n value: string | number | null | undefined,\n valueIfNaN?: number,\n) {\n const parsed =\n typeof value === 'number'\n ? value\n : typeof value === 'string'\n ? parseFloat(value) / (isPercent(value) ? 100 : 1)\n : NaN;\n return capValue(0, ifNaN(parsed, valueIfNaN), 1);\n}\n","import { Color } from '../../color/Color';\nimport { parsePercent } from '../../parser/percent';\nimport { ifNaN } from '../../util/internals/ifNaN';\nimport type { ColorStop } from '../typedefs';\n\nconst RE_KEY_VALUE_PAIRS = /\\s*;\\s*/;\nconst RE_KEY_VALUE = /\\s*:\\s*/;\n\nfunction parseColorStop(el: SVGStopElement, opacityMultiplier: number) {\n let colorValue, opacityValue;\n const style = el.getAttribute('style');\n if (style) {\n const keyValuePairs = style.split(RE_KEY_VALUE_PAIRS);\n\n if (keyValuePairs[keyValuePairs.length - 1] === '') {\n keyValuePairs.pop();\n }\n\n for (let i = keyValuePairs.length; i--; ) {\n const [key, value] = keyValuePairs[i]\n .split(RE_KEY_VALUE)\n .map((s) => s.trim());\n if (key === 'stop-color') {\n colorValue = value;\n } else if (key === 'stop-opacity') {\n opacityValue = value;\n }\n }\n }\n\n colorValue = colorValue || el.getAttribute('stop-color') || 'rgb(0,0,0)';\n opacityValue = ifNaN(\n parseFloat(opacityValue || el.getAttribute('stop-opacity') || ''),\n 1,\n );\n\n const color = new Color(colorValue);\n\n color.setAlpha(color.getAlpha() * opacityValue * opacityMultiplier);\n\n return {\n offset: parsePercent(el.getAttribute('offset'), 0),\n color: color.toRgba(),\n };\n}\n\nexport function parseColorStops(\n el: SVGGradientElement,\n opacityAttr: string | null,\n) {\n const colorStops: ColorStop[] = [],\n colorStopEls = el.getElementsByTagName('stop'),\n multiplier = parsePercent(opacityAttr, 1);\n for (let i = colorStopEls.length; i--; ) {\n colorStops.push(parseColorStop(colorStopEls[i], multiplier));\n }\n return colorStops;\n}\n","import type { GradientType, GradientUnits } from '../typedefs';\n\nexport function parseType(el: SVGGradientElement): GradientType {\n return el.nodeName === 'linearGradient' || el.nodeName === 'LINEARGRADIENT'\n ? 'linear'\n : 'radial';\n}\n\nexport function parseGradientUnits(el: SVGGradientElement): GradientUnits {\n return el.getAttribute('gradientUnits') === 'userSpaceOnUse'\n ? 'pixels'\n : 'percentage';\n}\n","import { isPercent } from '../../parser/percent';\nimport type { TSize } from '../../typedefs';\nimport type { GradientCoords, GradientType, GradientUnits } from '../typedefs';\nimport { parseGradientUnits, parseType } from './misc';\n\nfunction convertPercentUnitsToValues<\n T extends GradientType,\n K extends keyof GradientCoords,\n>(\n valuesToConvert: Record,\n { width, height, gradientUnits }: TSize & { gradientUnits: GradientUnits },\n) {\n let finalValue;\n return (Object.keys(valuesToConvert) as K[]).reduce(\n (acc, prop) => {\n const propValue = valuesToConvert[prop];\n if (propValue === 'Infinity') {\n finalValue = 1;\n } else if (propValue === '-Infinity') {\n finalValue = 0;\n } else {\n finalValue =\n typeof propValue === 'string' ? parseFloat(propValue) : propValue;\n if (typeof propValue === 'string' && isPercent(propValue)) {\n finalValue *= 0.01;\n if (gradientUnits === 'pixels') {\n // then we need to fix those percentages here in svg parsing\n if (prop === 'x1' || prop === 'x2' || prop === 'r2') {\n finalValue *= width;\n }\n if (prop === 'y1' || prop === 'y2') {\n finalValue *= height;\n }\n }\n }\n }\n acc[prop] = finalValue;\n return acc;\n },\n {} as Record,\n );\n}\n\nfunction getValue(el: SVGGradientElement, key: string) {\n return el.getAttribute(key);\n}\n\nexport function parseLinearCoords(el: SVGGradientElement) {\n return {\n x1: getValue(el, 'x1') || 0,\n y1: getValue(el, 'y1') || 0,\n x2: getValue(el, 'x2') || '100%',\n y2: getValue(el, 'y2') || 0,\n };\n}\n\nexport function parseRadialCoords(el: SVGGradientElement) {\n return {\n x1: getValue(el, 'fx') || getValue(el, 'cx') || '50%',\n y1: getValue(el, 'fy') || getValue(el, 'cy') || '50%',\n r1: 0,\n x2: getValue(el, 'cx') || '50%',\n y2: getValue(el, 'cy') || '50%',\n r2: getValue(el, 'r') || '50%',\n };\n}\n\nexport function parseCoords(el: SVGGradientElement, size: TSize) {\n return convertPercentUnitsToValues(\n parseType(el) === 'linear' ? parseLinearCoords(el) : parseRadialCoords(el),\n {\n ...size,\n gradientUnits: parseGradientUnits(el),\n },\n );\n}\n","import { iMatrix } from '../constants';\nimport { parseTransformAttribute } from '../parser/parseTransformAttribute';\nimport type { FabricObject } from '../shapes/Object/FabricObject';\nimport type { TMat2D } from '../typedefs';\nimport { uid } from '../util/internals/uid';\nimport { pick } from '../util/misc/pick';\nimport { matrixToSVG } from '../util/misc/svgExport';\nimport { linearDefaultCoords, radialDefaultCoords } from './constants';\nimport { parseColorStops } from './parser/parseColorStops';\nimport { parseCoords } from './parser/parseCoords';\nimport { parseType, parseGradientUnits } from './parser/misc';\nimport type {\n ColorStop,\n GradientCoords,\n GradientOptions,\n GradientType,\n GradientUnits,\n SVGOptions,\n SerializedGradientProps,\n} from './typedefs';\nimport { classRegistry } from '../ClassRegistry';\nimport { isPath } from '../util/typeAssertions';\n\n/**\n * Gradient class\n * @class Gradient\n * @see {@link http://fabric5.fabricjs.com/fabric-intro-part-2#gradients}\n */\nexport class Gradient<\n S,\n T extends GradientType = S extends GradientType ? S : 'linear',\n> {\n /**\n * Horizontal offset for aligning gradients coming from SVG when outside pathgroups\n * @type Number\n * @default 0\n */\n declare offsetX: number;\n\n /**\n * Vertical offset for aligning gradients coming from SVG when outside pathgroups\n * @type Number\n * @default 0\n */\n declare offsetY: number;\n\n /**\n * A transform matrix to apply to the gradient before painting.\n * Imported from svg gradients, is not applied with the current transform in the center.\n * Before this transform is applied, the origin point is at the top left corner of the object\n * plus the addition of offsetY and offsetX.\n * @type Number[]\n * @default null\n */\n declare gradientTransform?: TMat2D;\n\n /**\n * coordinates units for coords.\n * If `pixels`, the number of coords are in the same unit of width / height.\n * If set as `percentage` the coords are still a number, but 1 means 100% of width\n * for the X and 100% of the height for the y. It can be bigger than 1 and negative.\n * allowed values pixels or percentage.\n * @type GradientUnits\n * @default 'pixels'\n */\n declare gradientUnits: GradientUnits;\n\n /**\n * Gradient type linear or radial\n * @type GradientType\n * @default 'linear'\n */\n declare type: T;\n\n /**\n * Defines how the gradient is located in space and spread\n * @type GradientCoords\n */\n declare coords: GradientCoords;\n\n /**\n * Defines how many colors a gradient has and how they are located on the axis\n * defined by coords\n * @type GradientCoords\n */\n declare colorStops: ColorStop[];\n\n /**\n * If true, this object will not be exported during the serialization of a canvas\n * @type boolean\n */\n declare excludeFromExport?: boolean;\n\n /**\n * ID used for SVG export functionalities\n * @type number | string\n */\n declare readonly id: string | number;\n\n static type = 'Gradient';\n\n constructor(options: GradientOptions) {\n const {\n type = 'linear' as T,\n gradientUnits = 'pixels',\n coords = {},\n colorStops = [],\n offsetX = 0,\n offsetY = 0,\n gradientTransform,\n id,\n } = options || {};\n Object.assign(this, {\n type,\n gradientUnits,\n coords: {\n ...(type === 'radial' ? radialDefaultCoords : linearDefaultCoords),\n ...coords,\n },\n colorStops,\n offsetX,\n offsetY,\n gradientTransform,\n id: id ? `${id}_${uid()}` : uid(),\n });\n }\n\n /**\n * Adds another colorStop\n * @param {Record} colorStop Object with offset and color\n * @return {Gradient} thisArg\n */\n addColorStop(colorStops: Record) {\n for (const position in colorStops) {\n this.colorStops.push({\n offset: parseFloat(position),\n color: colorStops[position],\n });\n }\n return this;\n }\n\n /**\n * Returns object representation of a gradient\n * @param {string[]} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {object}\n */\n toObject(\n propertiesToInclude?: (keyof this | string)[],\n ): SerializedGradientProps {\n return {\n ...pick(this, propertiesToInclude as (keyof this)[]),\n type: this.type,\n coords: { ...this.coords },\n colorStops: this.colorStops.map((colorStop) => ({ ...colorStop })),\n offsetX: this.offsetX,\n offsetY: this.offsetY,\n gradientUnits: this.gradientUnits,\n gradientTransform: this.gradientTransform\n ? [...this.gradientTransform]\n : undefined,\n };\n }\n\n /* _TO_SVG_START_ */\n /**\n * Returns SVG representation of an gradient\n * @param {FabricObject} object Object to create a gradient for\n * @return {String} SVG representation of an gradient (linear/radial)\n */\n toSVG(\n object: FabricObject,\n {\n additionalTransform: preTransform,\n }: { additionalTransform?: string } = {},\n ) {\n const markup = [],\n transform = (\n this.gradientTransform\n ? this.gradientTransform.concat()\n : iMatrix.concat()\n ) as TMat2D,\n gradientUnits =\n this.gradientUnits === 'pixels'\n ? 'userSpaceOnUse'\n : 'objectBoundingBox';\n // colorStops must be sorted ascending, and guarded against deep mutations\n const colorStops = this.colorStops\n .map((colorStop) => ({ ...colorStop }))\n .sort((a, b) => {\n return a.offset - b.offset;\n });\n\n let offsetX = -this.offsetX,\n offsetY = -this.offsetY;\n if (gradientUnits === 'objectBoundingBox') {\n offsetX /= object.width;\n offsetY /= object.height;\n } else {\n offsetX += object.width / 2;\n offsetY += object.height / 2;\n }\n // todo what about polygon/polyline?\n if (isPath(object) && this.gradientUnits !== 'percentage') {\n offsetX -= object.pathOffset.x;\n offsetY -= object.pathOffset.y;\n }\n transform[4] -= offsetX;\n transform[5] -= offsetY;\n\n const commonAttributes = [\n `id=\"SVGID_${this.id}\"`,\n `gradientUnits=\"${gradientUnits}\"`,\n `gradientTransform=\"${\n preTransform ? preTransform + ' ' : ''\n }${matrixToSVG(transform)}\"`,\n '',\n ].join(' ');\n\n if (this.type === 'linear') {\n const { x1, y1, x2, y2 } = this.coords;\n markup.push(\n '\\n',\n );\n } else if (this.type === 'radial') {\n const { x1, y1, x2, y2, r1, r2 } = this\n .coords as GradientCoords<'radial'>;\n const needsSwap = r1 > r2;\n // svg radial gradient has just 1 radius. the biggest.\n markup.push(\n '\\n',\n );\n if (needsSwap) {\n // svg goes from internal to external radius. if radius are inverted, swap color stops.\n colorStops.reverse(); // mutates array\n colorStops.forEach((colorStop) => {\n colorStop.offset = 1 - colorStop.offset;\n });\n }\n const minRadius = Math.min(r1, r2);\n if (minRadius > 0) {\n // i have to shift all colorStops and add new one in 0.\n const maxRadius = Math.max(r1, r2),\n percentageShift = minRadius / maxRadius;\n colorStops.forEach((colorStop) => {\n colorStop.offset += percentageShift * (1 - colorStop.offset);\n });\n }\n }\n\n colorStops.forEach(({ color, offset }) => {\n markup.push(\n `\\n`,\n );\n });\n\n markup.push(\n this.type === 'linear' ? '' : '',\n '\\n',\n );\n\n return markup.join('');\n }\n /* _TO_SVG_END_ */\n\n /**\n * Returns an instance of CanvasGradient\n * @param {CanvasRenderingContext2D} ctx Context to render on\n * @return {CanvasGradient}\n */\n toLive(ctx: CanvasRenderingContext2D): CanvasGradient {\n const { x1, y1, x2, y2, r1, r2 } = this.coords as GradientCoords<'radial'>;\n const gradient =\n this.type === 'linear'\n ? ctx.createLinearGradient(x1, y1, x2, y2)\n : ctx.createRadialGradient(x1, y1, r1, x2, y2, r2);\n\n this.colorStops.forEach(({ color, offset }) => {\n gradient.addColorStop(offset, color);\n });\n\n return gradient;\n }\n\n static async fromObject(\n options: GradientOptions<'linear'>,\n ): Promise>;\n static async fromObject(\n options: GradientOptions<'radial'>,\n ): Promise>;\n static async fromObject(\n options: GradientOptions<'linear'> | GradientOptions<'radial'>,\n ) {\n const { colorStops, gradientTransform } = options;\n return new this({\n ...options,\n colorStops: colorStops\n ? colorStops.map((colorStop) => ({ ...colorStop }))\n : undefined,\n gradientTransform: gradientTransform ? [...gradientTransform] : undefined,\n });\n }\n\n /* _FROM_SVG_START_ */\n /**\n * Returns {@link Gradient} instance from an SVG element\n * @param {SVGGradientElement} el SVG gradient element\n * @param {FabricObject} instance\n * @param {String} opacity A fill-opacity or stroke-opacity attribute to multiply to each stop's opacity.\n * @param {SVGOptions} svgOptions an object containing the size of the SVG in order to parse correctly gradients\n * that uses gradientUnits as 'userSpaceOnUse' and percentages.\n * @return {Gradient} Gradient instance\n * @see http://www.w3.org/TR/SVG/pservers.html#LinearGradientElement\n * @see http://www.w3.org/TR/SVG/pservers.html#RadialGradientElement\n *\n * @example\n *\n * \n * \n * \n * \n *\n * OR\n *\n * \n * \n * \n * \n *\n * OR\n *\n * \n * \n * \n * \n * \n *\n * OR\n *\n * \n * \n * \n * \n * \n *\n */\n static fromElement(\n el: SVGGradientElement,\n instance: FabricObject,\n svgOptions: SVGOptions,\n ): Gradient {\n const gradientUnits = parseGradientUnits(el);\n const center = instance._findCenterFromElement();\n return new this({\n id: el.getAttribute('id') || undefined,\n type: parseType(el),\n coords: parseCoords(el, {\n width: svgOptions.viewBoxWidth || svgOptions.width,\n height: svgOptions.viewBoxHeight || svgOptions.height,\n }),\n colorStops: parseColorStops(el, svgOptions.opacity),\n gradientUnits,\n gradientTransform: parseTransformAttribute(\n el.getAttribute('gradientTransform') || '',\n ),\n ...(gradientUnits === 'pixels'\n ? {\n offsetX: instance.width / 2 - center.x,\n offsetY: instance.height / 2 - center.y,\n }\n : {\n offsetX: 0,\n offsetY: 0,\n }),\n });\n }\n /* _FROM_SVG_END_ */\n}\n\nclassRegistry.setClass(Gradient, 'gradient');\nclassRegistry.setClass(Gradient, 'linear');\nclassRegistry.setClass(Gradient, 'radial');\n","import { config } from '../config';\nimport type { Abortable, TCrossOrigin, TMat2D, TSize } from '../typedefs';\nimport { ifNaN } from '../util/internals/ifNaN';\nimport { uid } from '../util/internals/uid';\nimport { loadImage } from '../util/misc/objectEnlive';\nimport { pick } from '../util/misc/pick';\nimport { toFixed } from '../util/misc/toFixed';\nimport { classRegistry } from '../ClassRegistry';\nimport type {\n PatternRepeat,\n PatternOptions,\n SerializedPatternOptions,\n} from './types';\nimport { log } from '../util/internals/console';\n\n/**\n * @see {@link http://fabric5.fabricjs.com/patterns demo}\n * @see {@link http://fabric5.fabricjs.com/dynamic-patterns demo}\n */\nexport class Pattern {\n static type = 'Pattern';\n\n /**\n * Legacy identifier of the class. Prefer using this.constructor.type 'Pattern'\n * or utils like isPattern, or instance of to indentify a pattern in your code.\n * Will be removed in future versiones\n * @TODO add sustainable warning message\n * @type string\n * @deprecated\n */\n get type() {\n return 'pattern';\n }\n\n set type(value) {\n log('warn', 'Setting type has no effect', value);\n }\n\n /**\n * @type PatternRepeat\n * @defaults\n */\n repeat: PatternRepeat = 'repeat';\n\n /**\n * Pattern horizontal offset from object's left/top corner\n * @type Number\n */\n offsetX = 0;\n\n /**\n * Pattern vertical offset from object's left/top corner\n * @type Number\n */\n offsetY = 0;\n\n /**\n * @type TCrossOrigin\n */\n crossOrigin: TCrossOrigin = '';\n\n /**\n * transform matrix to change the pattern, imported from svgs.\n * @todo verify if using the identity matrix as default makes the rest of the code more easy\n * @type Array\n */\n declare patternTransform?: TMat2D;\n\n /**\n * The actual pixel source of the pattern\n */\n declare source: CanvasImageSource;\n\n /**\n * If true, this object will not be exported during the serialization of a canvas\n * @type boolean\n */\n declare excludeFromExport?: boolean;\n\n /**\n * ID used for SVG export functionalities\n * @type number\n */\n declare readonly id: number;\n\n /**\n * Constructor\n * @param {Object} [options] Options object\n * @param {option.source} [source] the pattern source, eventually empty or a drawable\n */\n constructor(options: PatternOptions) {\n this.id = uid();\n Object.assign(this, options);\n }\n\n /**\n * @returns true if {@link source} is an element\n */\n isImageSource(): this is { source: HTMLImageElement } {\n return (\n !!this.source && typeof (this.source as HTMLImageElement).src === 'string'\n );\n }\n\n /**\n * @returns true if {@link source} is a element\n */\n isCanvasSource(): this is { source: HTMLCanvasElement } {\n return !!this.source && !!(this.source as HTMLCanvasElement).toDataURL;\n }\n\n sourceToString(): string {\n return this.isImageSource()\n ? this.source.src\n : this.isCanvasSource()\n ? this.source.toDataURL()\n : '';\n }\n\n /**\n * Returns an instance of CanvasPattern\n * @param {CanvasRenderingContext2D} ctx Context to create pattern\n * @return {CanvasPattern}\n */\n toLive(ctx: CanvasRenderingContext2D): CanvasPattern | null {\n if (\n // if the image failed to load, return, and allow rest to continue loading\n !this.source ||\n // if an image\n (this.isImageSource() &&\n (!this.source.complete ||\n this.source.naturalWidth === 0 ||\n this.source.naturalHeight === 0))\n ) {\n return null;\n }\n\n return ctx.createPattern(this.source, this.repeat)!;\n }\n\n /**\n * Returns object representation of a pattern\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {object} Object representation of a pattern instance\n */\n toObject(propertiesToInclude: string[] = []): Record {\n const { repeat, crossOrigin } = this;\n return {\n ...pick(this, propertiesToInclude as (keyof this)[]),\n type: 'pattern',\n source: this.sourceToString(),\n repeat,\n crossOrigin,\n offsetX: toFixed(this.offsetX, config.NUM_FRACTION_DIGITS),\n offsetY: toFixed(this.offsetY, config.NUM_FRACTION_DIGITS),\n patternTransform: this.patternTransform\n ? [...this.patternTransform]\n : null,\n };\n }\n\n /* _TO_SVG_START_ */\n /**\n * Returns SVG representation of a pattern\n */\n toSVG({ width, height }: TSize): string {\n const { source: patternSource, repeat, id } = this,\n patternOffsetX = ifNaN(this.offsetX / width, 0),\n patternOffsetY = ifNaN(this.offsetY / height, 0),\n patternWidth =\n repeat === 'repeat-y' || repeat === 'no-repeat'\n ? 1 + Math.abs(patternOffsetX || 0)\n : ifNaN((patternSource as HTMLImageElement).width / width, 0),\n patternHeight =\n repeat === 'repeat-x' || repeat === 'no-repeat'\n ? 1 + Math.abs(patternOffsetY || 0)\n : ifNaN((patternSource as HTMLImageElement).height / height, 0);\n\n return [\n ``,\n ``,\n ``,\n '',\n ].join('\\n');\n }\n /* _TO_SVG_END_ */\n\n static async fromObject(\n {\n type,\n source,\n patternTransform,\n ...otherOptions\n }: SerializedPatternOptions,\n options?: Abortable,\n ): Promise {\n const img = await loadImage(source, {\n ...options,\n crossOrigin: otherOptions.crossOrigin,\n });\n return new this({\n ...otherOptions,\n patternTransform:\n patternTransform && (patternTransform.slice(0) as TMat2D),\n source: img,\n });\n }\n}\n\nclassRegistry.setClass(Pattern);\n// kept for compatibility reason\nclassRegistry.setClass(Pattern, 'pattern');\n","import { Color } from '../color/Color';\nimport type { Point } from '../Point';\nimport type { Shadow } from '../Shadow';\nimport type { Canvas } from '../canvas/Canvas';\nimport type { TBrushEventData } from './typedefs';\n\n/**\n * @see {@link http://fabric5.fabricjs.com/freedrawing|Freedrawing demo}\n */\nexport abstract class BaseBrush {\n /**\n * Color of a brush\n * @type String\n */\n color = 'rgb(0, 0, 0)';\n\n /**\n * Width of a brush, has to be a Number, no string literals\n * @type Number\n */\n width = 1;\n\n /**\n * Shadow object representing shadow of this shape.\n * Backwards incompatibility note: This property replaces \"shadowColor\" (String), \"shadowOffsetX\" (Number),\n * \"shadowOffsetY\" (Number) and \"shadowBlur\" (Number) since v1.2.12\n * @type Shadow\n */\n shadow: Shadow | null = null;\n\n /**\n * Line endings style of a brush (one of \"butt\", \"round\", \"square\")\n * @type String\n */\n strokeLineCap: CanvasLineCap = 'round';\n\n /**\n * Corner style of a brush (one of \"bevel\", \"round\", \"miter\")\n * @type String\n */\n strokeLineJoin: CanvasLineJoin = 'round';\n\n /**\n * Maximum miter length (used for strokeLineJoin = \"miter\") of a brush's\n * @type Number\n */\n strokeMiterLimit = 10;\n\n /**\n * Stroke Dash Array.\n * @type Array\n */\n strokeDashArray: number[] | null = null;\n\n /**\n * When `true`, the free drawing is limited to the whiteboard size. Default to false.\n * @type Boolean\n * @default false\n */\n\n limitedToCanvasSize = false;\n\n /**\n * @todo add type\n */\n declare canvas: Canvas;\n\n constructor(canvas: Canvas) {\n this.canvas = canvas;\n }\n\n abstract _render(): void;\n abstract onMouseDown(pointer: Point, ev: TBrushEventData): void;\n abstract onMouseMove(pointer: Point, ev: TBrushEventData): void;\n /**\n * @returns true if brush should continue blocking interaction\n */\n abstract onMouseUp(ev: TBrushEventData): boolean | void;\n\n /**\n * Sets brush styles\n * @private\n * @param {CanvasRenderingContext2D} ctx\n */\n _setBrushStyles(ctx: CanvasRenderingContext2D) {\n ctx.strokeStyle = this.color;\n ctx.lineWidth = this.width;\n ctx.lineCap = this.strokeLineCap;\n ctx.miterLimit = this.strokeMiterLimit;\n ctx.lineJoin = this.strokeLineJoin;\n ctx.setLineDash(this.strokeDashArray || []);\n }\n\n /**\n * Sets the transformation on given context\n * @param {CanvasRenderingContext2D} ctx context to render on\n * @private\n */\n protected _saveAndTransform(ctx: CanvasRenderingContext2D) {\n const v = this.canvas.viewportTransform;\n ctx.save();\n ctx.transform(v[0], v[1], v[2], v[3], v[4], v[5]);\n }\n\n protected needsFullRender() {\n const color = new Color(this.color);\n return color.getAlpha() < 1 || !!this.shadow;\n }\n\n /**\n * Sets brush shadow styles\n * @private\n */\n protected _setShadow() {\n if (!this.shadow || !this.canvas) {\n return;\n }\n\n const canvas = this.canvas,\n shadow = this.shadow,\n ctx = canvas.contextTop,\n zoom = canvas.getZoom() * canvas.getRetinaScaling();\n\n ctx.shadowColor = shadow.color;\n ctx.shadowBlur = shadow.blur * zoom;\n ctx.shadowOffsetX = shadow.offsetX * zoom;\n ctx.shadowOffsetY = shadow.offsetY * zoom;\n }\n\n /**\n * Removes brush shadow styles\n * @private\n */\n protected _resetShadow() {\n const ctx = this.canvas.contextTop;\n\n ctx.shadowColor = '';\n ctx.shadowBlur = ctx.shadowOffsetX = ctx.shadowOffsetY = 0;\n }\n\n /**\n * Check is pointer is outside canvas boundaries\n * @param {Object} pointer\n * @private\n */\n protected _isOutSideCanvas(pointer: Point) {\n return (\n pointer.x < 0 ||\n pointer.x > this.canvas.getWidth() ||\n pointer.y < 0 ||\n pointer.y > this.canvas.getHeight()\n );\n }\n}\n","import { config } from '../config';\nimport { SHARED_ATTRIBUTES } from '../parser/attributes';\nimport { parseAttributes } from '../parser/parseAttributes';\nimport type { XY } from '../Point';\nimport { Point } from '../Point';\nimport { makeBoundingBoxFromPoints } from '../util/misc/boundingBoxFromPoints';\nimport { toFixed } from '../util/misc/toFixed';\nimport {\n getBoundsOfCurve,\n joinPath,\n makePathSimpler,\n parsePath,\n} from '../util/path';\nimport { classRegistry } from '../ClassRegistry';\nimport { FabricObject, cacheProperties } from './Object/FabricObject';\nimport type {\n TComplexPathData,\n TPathSegmentInfo,\n TSimplePathData,\n} from '../util/path/typedefs';\nimport type { FabricObjectProps, SerializedObjectProps } from './Object/types';\nimport type { ObjectEvents } from '../EventTypeDefs';\nimport type {\n TBBox,\n TClassProperties,\n TSVGReviver,\n TOptions,\n} from '../typedefs';\nimport { CENTER, LEFT, TOP } from '../constants';\nimport type { CSSRules } from '../parser/typedefs';\n\ninterface UniquePathProps {\n sourcePath?: string;\n path?: TSimplePathData;\n}\n\nexport interface SerializedPathProps\n extends SerializedObjectProps,\n UniquePathProps {}\n\nexport interface PathProps extends FabricObjectProps, UniquePathProps {}\n\nexport interface IPathBBox extends TBBox {\n left: number;\n top: number;\n pathOffset: Point;\n}\n\nexport class Path<\n Props extends TOptions = Partial,\n SProps extends SerializedPathProps = SerializedPathProps,\n EventSpec extends ObjectEvents = ObjectEvents,\n> extends FabricObject {\n /**\n * Array of path points\n * @type Array\n */\n declare path: TSimplePathData;\n\n declare pathOffset: Point;\n\n declare sourcePath?: string;\n\n declare segmentsInfo?: TPathSegmentInfo[];\n\n static type = 'Path';\n\n static cacheProperties = [...cacheProperties, 'path', 'fillRule'];\n\n /**\n * Constructor\n * @param {TComplexPathData} path Path data (sequence of coordinates and corresponding \"command\" tokens)\n * @param {Partial} [options] Options object\n * @return {Path} thisArg\n */\n constructor(\n path: TComplexPathData | string,\n // todo: evaluate this spread here\n { path: _, left, top, ...options }: Partial = {},\n ) {\n super();\n Object.assign(this, Path.ownDefaults);\n this.setOptions(options);\n this._setPath(path || [], true);\n typeof left === 'number' && this.set(LEFT, left);\n typeof top === 'number' && this.set(TOP, top);\n }\n\n /**\n * @private\n * @param {TComplexPathData | string} path Path data (sequence of coordinates and corresponding \"command\" tokens)\n * @param {boolean} [adjustPosition] pass true to reposition the object according to the bounding box\n * @returns {Point} top left position of the bounding box, useful for complementary positioning\n */\n _setPath(path: TComplexPathData | string, adjustPosition?: boolean) {\n this.path = makePathSimpler(Array.isArray(path) ? path : parsePath(path));\n this.setBoundingBox(adjustPosition);\n }\n\n /**\n * This function is an helper for svg import. it returns the center of the object in the svg\n * untransformed coordinates, by look at the polyline/polygon points.\n * @private\n * @return {Point} center point from element coordinates\n */\n _findCenterFromElement(): Point {\n const bbox = this._calcBoundsFromPath();\n return new Point(bbox.left + bbox.width / 2, bbox.top + bbox.height / 2);\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx context to render path on\n */\n _renderPathCommands(ctx: CanvasRenderingContext2D) {\n const l = -this.pathOffset.x,\n t = -this.pathOffset.y;\n\n ctx.beginPath();\n\n for (const command of this.path) {\n switch (\n command[0] // first letter\n ) {\n case 'L': // lineto, absolute\n ctx.lineTo(command[1] + l, command[2] + t);\n break;\n\n case 'M': // moveTo, absolute\n ctx.moveTo(command[1] + l, command[2] + t);\n break;\n\n case 'C': // bezierCurveTo, absolute\n ctx.bezierCurveTo(\n command[1] + l,\n command[2] + t,\n command[3] + l,\n command[4] + t,\n command[5] + l,\n command[6] + t,\n );\n break;\n\n case 'Q': // quadraticCurveTo, absolute\n ctx.quadraticCurveTo(\n command[1] + l,\n command[2] + t,\n command[3] + l,\n command[4] + t,\n );\n break;\n\n case 'Z':\n ctx.closePath();\n break;\n }\n }\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx context to render path on\n */\n _render(ctx: CanvasRenderingContext2D) {\n this._renderPathCommands(ctx);\n this._renderPaintInOrder(ctx);\n }\n\n /**\n * Returns string representation of an instance\n * @return {string} string representation of an instance\n */\n toString() {\n return `#`;\n }\n\n /**\n * Returns object representation of an instance\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} object representation of an instance\n */\n toObject<\n T extends Omit, keyof SProps>,\n K extends keyof T = never,\n >(propertiesToInclude: K[] = []): Pick & SProps {\n return {\n ...super.toObject(propertiesToInclude),\n path: this.path.map((pathCmd) => pathCmd.slice()),\n };\n }\n\n /**\n * Returns dataless object representation of an instance\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} object representation of an instance\n */\n toDatalessObject<\n T extends Omit, keyof SProps>,\n K extends keyof T = never,\n >(propertiesToInclude: K[] = []): Pick & SProps {\n const o = this.toObject(propertiesToInclude);\n if (this.sourcePath) {\n delete o.path;\n o.sourcePath = this.sourcePath;\n }\n return o;\n }\n\n /**\n * Returns svg representation of an instance\n * @return {Array} an array of strings with the specific svg representation\n * of the instance\n */\n _toSVG() {\n const path = joinPath(this.path, config.NUM_FRACTION_DIGITS);\n return [\n '\\n`,\n ];\n }\n\n /**\n * @private\n * @return the path command's translate transform attribute\n */\n _getOffsetTransform() {\n const digits = config.NUM_FRACTION_DIGITS;\n return ` translate(${toFixed(-this.pathOffset.x, digits)}, ${toFixed(\n -this.pathOffset.y,\n digits,\n )})`;\n }\n\n /**\n * Returns svg clipPath representation of an instance\n * @param {Function} [reviver] Method for further parsing of svg representation.\n * @return {string} svg representation of an instance\n */\n toClipPathSVG(reviver?: TSVGReviver): string {\n const additionalTransform = this._getOffsetTransform();\n return (\n '\\t' +\n this._createBaseClipPathSVGMarkup(this._toSVG(), {\n reviver,\n additionalTransform: additionalTransform,\n })\n );\n }\n\n /**\n * Returns svg representation of an instance\n * @param {Function} [reviver] Method for further parsing of svg representation.\n * @return {string} svg representation of an instance\n */\n toSVG(reviver?: TSVGReviver): string {\n const additionalTransform = this._getOffsetTransform();\n return this._createBaseSVGMarkup(this._toSVG(), {\n reviver,\n additionalTransform: additionalTransform,\n });\n }\n\n /**\n * Returns number representation of an instance complexity\n * @return {number} complexity of this instance\n */\n complexity() {\n return this.path.length;\n }\n\n setDimensions() {\n this.setBoundingBox();\n }\n\n setBoundingBox(adjustPosition?: boolean) {\n const { width, height, pathOffset } = this._calcDimensions();\n this.set({ width, height, pathOffset });\n // using pathOffset because it match the use case.\n // if pathOffset change here we need to use left + width/2 , top + height/2\n adjustPosition && this.setPositionByOrigin(pathOffset, CENTER, CENTER);\n }\n\n _calcBoundsFromPath(): TBBox {\n const bounds: XY[] = [];\n let subpathStartX = 0,\n subpathStartY = 0,\n x = 0, // current x\n y = 0; // current y\n\n for (const command of this.path) {\n // current instruction\n switch (\n command[0] // first letter\n ) {\n case 'L': // lineto, absolute\n x = command[1];\n y = command[2];\n bounds.push({ x: subpathStartX, y: subpathStartY }, { x, y });\n break;\n\n case 'M': // moveTo, absolute\n x = command[1];\n y = command[2];\n subpathStartX = x;\n subpathStartY = y;\n break;\n\n case 'C': // bezierCurveTo, absolute\n bounds.push(\n ...getBoundsOfCurve(\n x,\n y,\n command[1],\n command[2],\n command[3],\n command[4],\n command[5],\n command[6],\n ),\n );\n x = command[5];\n y = command[6];\n break;\n\n case 'Q': // quadraticCurveTo, absolute\n bounds.push(\n ...getBoundsOfCurve(\n x,\n y,\n command[1],\n command[2],\n command[1],\n command[2],\n command[3],\n command[4],\n ),\n );\n x = command[3];\n y = command[4];\n break;\n\n case 'Z':\n x = subpathStartX;\n y = subpathStartY;\n break;\n }\n }\n return makeBoundingBoxFromPoints(bounds);\n }\n\n /**\n * @private\n */\n _calcDimensions(): IPathBBox {\n const bbox = this._calcBoundsFromPath();\n\n return {\n ...bbox,\n pathOffset: new Point(\n bbox.left + bbox.width / 2,\n bbox.top + bbox.height / 2,\n ),\n };\n }\n\n /**\n * List of attribute names to account for when parsing SVG element (used by `Path.fromElement`)\n * @see http://www.w3.org/TR/SVG/paths.html#PathElement\n */\n static ATTRIBUTE_NAMES = [...SHARED_ATTRIBUTES, 'd'];\n\n /**\n * Creates an instance of Path from an object\n * @param {Object} object\n * @returns {Promise}\n */\n static fromObject>(object: T) {\n return this._fromObject(object, {\n extraParam: 'path',\n });\n }\n\n /**\n * Creates an instance of Path from an SVG element\n * @param {HTMLElement} element to parse\n * @param {Partial} [options] Options object\n */\n static async fromElement(\n element: HTMLElement | SVGElement,\n options?: Partial,\n cssRules?: CSSRules,\n ) {\n const { d, ...parsedAttributes } = parseAttributes(\n element,\n this.ATTRIBUTE_NAMES,\n cssRules,\n );\n return new this(d, {\n ...parsedAttributes,\n ...options,\n // we pass undefined to instruct the constructor to position the object using the bbox\n left: undefined,\n top: undefined,\n });\n }\n}\n\nclassRegistry.setClass(Path);\nclassRegistry.setSVGClass(Path);\n\n/* _FROM_SVG_START_ */\n","import type { ModifierKey, TEvent } from '../EventTypeDefs';\nimport type { Point } from '../Point';\nimport { Shadow } from '../Shadow';\nimport { Path } from '../shapes/Path';\nimport { getSmoothPathFromPoints, joinPath } from '../util/path';\nimport type { Canvas } from '../canvas/Canvas';\nimport { BaseBrush } from './BaseBrush';\nimport type { TSimplePathData } from '../util/path/typedefs';\n\n/**\n * @private\n * @param {TSimplePathData} pathData SVG path commands\n * @returns {boolean}\n */\nfunction isEmptySVGPath(pathData: TSimplePathData): boolean {\n return joinPath(pathData) === 'M 0 0 Q 0 0 0 0 L 0 0';\n}\n\nexport class PencilBrush extends BaseBrush {\n /**\n * Discard points that are less than `decimate` pixel distant from each other\n * @type Number\n * @default 0.4\n */\n decimate = 0.4;\n\n /**\n * Draws a straight line between last recorded point to current pointer\n * Used for `shift` functionality\n *\n * @type boolean\n * @default false\n */\n drawStraightLine = false;\n\n /**\n * The event modifier key that makes the brush draw a straight line.\n * If `null` or 'none' or any other string that is not a modifier key the feature is disabled.\n * @type {ModifierKey | undefined | null}\n */\n straightLineKey: ModifierKey | undefined | null = 'shiftKey';\n\n declare protected _points: Point[];\n declare protected _hasStraightLine: boolean;\n declare protected oldEnd?: Point;\n\n constructor(canvas: Canvas) {\n super(canvas);\n this._points = [];\n this._hasStraightLine = false;\n }\n\n needsFullRender() {\n return super.needsFullRender() || this._hasStraightLine;\n }\n\n static drawSegment(ctx: CanvasRenderingContext2D, p1: Point, p2: Point) {\n const midPoint = p1.midPointFrom(p2);\n ctx.quadraticCurveTo(p1.x, p1.y, midPoint.x, midPoint.y);\n return midPoint;\n }\n\n /**\n * Invoked on mouse down\n * @param {Point} pointer\n */\n onMouseDown(pointer: Point, { e }: TEvent) {\n if (!this.canvas._isMainEvent(e)) {\n return;\n }\n this.drawStraightLine = !!this.straightLineKey && e[this.straightLineKey];\n this._prepareForDrawing(pointer);\n // capture coordinates immediately\n // this allows to draw dots (when movement never occurs)\n this._addPoint(pointer);\n this._render();\n }\n\n /**\n * Invoked on mouse move\n * @param {Point} pointer\n */\n onMouseMove(pointer: Point, { e }: TEvent) {\n if (!this.canvas._isMainEvent(e)) {\n return;\n }\n this.drawStraightLine = !!this.straightLineKey && e[this.straightLineKey];\n if (this.limitedToCanvasSize === true && this._isOutSideCanvas(pointer)) {\n return;\n }\n if (this._addPoint(pointer) && this._points.length > 1) {\n if (this.needsFullRender()) {\n // redraw curve\n // clear top canvas\n this.canvas.clearContext(this.canvas.contextTop);\n this._render();\n } else {\n const points = this._points,\n length = points.length,\n ctx = this.canvas.contextTop;\n // draw the curve update\n this._saveAndTransform(ctx);\n if (this.oldEnd) {\n ctx.beginPath();\n ctx.moveTo(this.oldEnd.x, this.oldEnd.y);\n }\n this.oldEnd = PencilBrush.drawSegment(\n ctx,\n points[length - 2],\n points[length - 1],\n );\n ctx.stroke();\n ctx.restore();\n }\n }\n }\n\n /**\n * Invoked on mouse up\n */\n onMouseUp({ e }: TEvent) {\n if (!this.canvas._isMainEvent(e)) {\n return true;\n }\n this.drawStraightLine = false;\n this.oldEnd = undefined;\n this._finalizeAndAddPath();\n\n return false;\n }\n\n /**\n * @private\n * @param {Point} pointer Actual mouse position related to the canvas.\n */\n _prepareForDrawing(pointer: Point) {\n this._reset();\n this._addPoint(pointer);\n this.canvas.contextTop.moveTo(pointer.x, pointer.y);\n }\n\n /**\n * @private\n * @param {Point} point Point to be added to points array\n */\n _addPoint(point: Point) {\n if (\n this._points.length > 1 &&\n point.eq(this._points[this._points.length - 1])\n ) {\n return false;\n }\n if (this.drawStraightLine && this._points.length > 1) {\n this._hasStraightLine = true;\n this._points.pop();\n }\n this._points.push(point);\n return true;\n }\n\n /**\n * Clear points array and set contextTop canvas style.\n * @private\n */\n _reset() {\n this._points = [];\n this._setBrushStyles(this.canvas.contextTop);\n this._setShadow();\n this._hasStraightLine = false;\n }\n\n /**\n * Draw a smooth path on the topCanvas using quadraticCurveTo\n * @private\n * @param {CanvasRenderingContext2D} [ctx]\n */\n _render(ctx: CanvasRenderingContext2D = this.canvas.contextTop) {\n let p1 = this._points[0],\n p2 = this._points[1];\n this._saveAndTransform(ctx);\n ctx.beginPath();\n //if we only have 2 points in the path and they are the same\n //it means that the user only clicked the canvas without moving the mouse\n //then we should be drawing a dot. A path isn't drawn between two identical dots\n //that's why we set them apart a bit\n if (this._points.length === 2 && p1.x === p2.x && p1.y === p2.y) {\n const width = this.width / 1000;\n p1.x -= width;\n p2.x += width;\n }\n ctx.moveTo(p1.x, p1.y);\n\n for (let i = 1; i < this._points.length; i++) {\n // we pick the point between pi + 1 & pi + 2 as the\n // end point and p1 as our control point.\n PencilBrush.drawSegment(ctx, p1, p2);\n p1 = this._points[i];\n p2 = this._points[i + 1];\n }\n // Draw last line as a straight line while\n // we wait for the next point to be able to calculate\n // the bezier control point\n ctx.lineTo(p1.x, p1.y);\n ctx.stroke();\n ctx.restore();\n }\n\n /**\n * Converts points to SVG path\n * @param {Point[]} points Array of points\n * @return {TSimplePathData} SVG path commands\n */\n convertPointsToSVGPath(points: Point[]): TSimplePathData {\n const correction = this.width / 1000;\n return getSmoothPathFromPoints(points, correction);\n }\n\n /**\n * Creates a Path object to add on canvas\n * @param {TSimplePathData} pathData Path data\n * @return {Path} Path to add on canvas\n */\n createPath(pathData: TSimplePathData): Path {\n const path = new Path(pathData, {\n fill: null,\n stroke: this.color,\n strokeWidth: this.width,\n strokeLineCap: this.strokeLineCap,\n strokeMiterLimit: this.strokeMiterLimit,\n strokeLineJoin: this.strokeLineJoin,\n strokeDashArray: this.strokeDashArray,\n });\n if (this.shadow) {\n this.shadow.affectStroke = true;\n path.shadow = new Shadow(this.shadow);\n }\n\n return path;\n }\n\n /**\n * Decimate points array with the decimate value\n */\n decimatePoints(points: Point[], distance: number) {\n if (points.length <= 2) {\n return points;\n }\n let lastPoint = points[0],\n cDistance;\n const zoom = this.canvas.getZoom(),\n adjustedDistance = Math.pow(distance / zoom, 2),\n l = points.length - 1,\n newPoints = [lastPoint];\n // TODO investigate why this is not i < l\n for (let i = 1; i < l - 1; i++) {\n cDistance =\n Math.pow(lastPoint.x - points[i].x, 2) +\n Math.pow(lastPoint.y - points[i].y, 2);\n if (cDistance >= adjustedDistance) {\n lastPoint = points[i];\n newPoints.push(lastPoint);\n }\n }\n // Add the last point from the original line to the end of the array.\n // This ensures decimate doesn't delete the last point on the line, and ensures the line is > 1 point.\n newPoints.push(points[l]);\n return newPoints;\n }\n\n /**\n * On mouseup after drawing the path on contextTop canvas\n * we use the points captured to create an new Path object\n * and add it to the canvas.\n */\n _finalizeAndAddPath() {\n const ctx = this.canvas.contextTop;\n ctx.closePath();\n if (this.decimate) {\n this._points = this.decimatePoints(this._points, this.decimate);\n }\n const pathData = this.convertPointsToSVGPath(this._points);\n if (isEmptySVGPath(pathData)) {\n // do not create 0 width/height paths, as they are\n // rendered inconsistently across browsers\n // Firefox 4, for example, renders a dot,\n // whereas Chrome 10 renders nothing\n this.canvas.requestRenderAll();\n return;\n }\n\n const path = this.createPath(pathData);\n this.canvas.clearContext(this.canvas.contextTop);\n this.canvas.fire('before:path:created', { path: path });\n this.canvas.add(path);\n this.canvas.requestRenderAll();\n path.setCoords();\n this._resetShadow();\n\n // fire event 'path' created\n this.canvas.fire('path:created', { path: path });\n }\n}\n","import type { ObjectEvents } from '../EventTypeDefs';\nimport { SHARED_ATTRIBUTES } from '../parser/attributes';\nimport { parseAttributes } from '../parser/parseAttributes';\nimport { cos } from '../util/misc/cos';\nimport { degreesToRadians } from '../util/misc/radiansDegreesConversion';\nimport { sin } from '../util/misc/sin';\nimport { classRegistry } from '../ClassRegistry';\nimport { FabricObject, cacheProperties } from './Object/FabricObject';\nimport type { Abortable, TClassProperties, TOptions } from '../typedefs';\nimport type { FabricObjectProps, SerializedObjectProps } from './Object/types';\nimport type { CSSRules } from '../parser/typedefs';\nimport { SCALE_X, SCALE_Y } from '../constants';\n\ninterface UniqueCircleProps {\n /**\n * Radius of this circle\n * @type Number\n * @default 0\n */\n radius: number;\n\n /**\n * Angle for the start of the circle, in degrees.\n * @type TDegree 0 - 359\n * @default 0\n */\n startAngle: number;\n\n /**\n * Angle for the end of the circle, in degrees\n * @type TDegree 1 - 360\n * @default 360\n */\n endAngle: number;\n\n /**\n * Orientation for the direction of the circle.\n * Setting to true will switch the arc of the circle to traverse from startAngle to endAngle in a counter-clockwise direction.\n * Note: this will only change how the circle is drawn, and does not affect rotational transformation.\n * @default false\n */\n counterClockwise: boolean;\n}\n\nexport interface SerializedCircleProps\n extends SerializedObjectProps,\n UniqueCircleProps {}\n\nexport interface CircleProps extends FabricObjectProps, UniqueCircleProps {}\n\nconst CIRCLE_PROPS = [\n 'radius',\n 'startAngle',\n 'endAngle',\n 'counterClockwise',\n] as const;\n\nexport const circleDefaultValues: Partial> = {\n radius: 0,\n startAngle: 0,\n endAngle: 360,\n counterClockwise: false,\n};\n\nexport class Circle<\n Props extends TOptions = Partial,\n SProps extends SerializedCircleProps = SerializedCircleProps,\n EventSpec extends ObjectEvents = ObjectEvents,\n >\n extends FabricObject\n implements UniqueCircleProps\n{\n declare radius: number;\n declare startAngle: number;\n declare endAngle: number;\n declare counterClockwise: boolean;\n\n static type = 'Circle';\n\n static cacheProperties = [...cacheProperties, ...CIRCLE_PROPS];\n\n static ownDefaults = circleDefaultValues;\n\n static getDefaults(): Record {\n return {\n ...super.getDefaults(),\n ...Circle.ownDefaults,\n };\n }\n\n /**\n * Constructor\n * @param {Object} [options] Options object\n */\n constructor(options?: Props) {\n super();\n Object.assign(this, Circle.ownDefaults);\n this.setOptions(options);\n }\n\n /**\n * @private\n * @param {String} key\n * @param {*} value\n */\n _set(key: string, value: any) {\n super._set(key, value);\n\n if (key === 'radius') {\n this.setRadius(value);\n }\n\n return this;\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx context to render on\n */\n _render(ctx: CanvasRenderingContext2D) {\n ctx.beginPath();\n ctx.arc(\n 0,\n 0,\n this.radius,\n degreesToRadians(this.startAngle),\n degreesToRadians(this.endAngle),\n this.counterClockwise,\n );\n this._renderPaintInOrder(ctx);\n }\n\n /**\n * Returns horizontal radius of an object (according to how an object is scaled)\n * @return {Number}\n */\n getRadiusX(): number {\n return this.get('radius') * this.get(SCALE_X);\n }\n\n /**\n * Returns vertical radius of an object (according to how an object is scaled)\n * @return {Number}\n */\n getRadiusY(): number {\n return this.get('radius') * this.get(SCALE_Y);\n }\n\n /**\n * Sets radius of an object (and updates width accordingly)\n */\n setRadius(value: number) {\n this.radius = value;\n this.set({ width: value * 2, height: value * 2 });\n }\n\n /**\n * Returns object representation of an instance\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} object representation of an instance\n */\n toObject<\n T extends Omit, keyof SProps>,\n K extends keyof T = never,\n >(propertiesToInclude: K[] = []): Pick & SProps {\n return super.toObject([...CIRCLE_PROPS, ...propertiesToInclude]);\n }\n\n /* _TO_SVG_START_ */\n\n /**\n * Returns svg representation of an instance\n * @return {Array} an array of strings with the specific svg representation\n * of the instance\n */\n _toSVG(): string[] {\n const angle = (this.endAngle - this.startAngle) % 360;\n\n if (angle === 0) {\n return [\n '\\n',\n ];\n } else {\n const { radius } = this;\n const start = degreesToRadians(this.startAngle),\n end = degreesToRadians(this.endAngle),\n startX = cos(start) * radius,\n startY = sin(start) * radius,\n endX = cos(end) * radius,\n endY = sin(end) * radius,\n largeFlag = angle > 180 ? 1 : 0,\n sweepFlag = this.counterClockwise ? 0 : 1;\n return [\n `\\n',\n ];\n }\n }\n /* _TO_SVG_END_ */\n\n /* _FROM_SVG_START_ */\n /**\n * List of attribute names to account for when parsing SVG element (used by {@link Circle.fromElement})\n * @see: http://www.w3.org/TR/SVG/shapes.html#CircleElement\n */\n static ATTRIBUTE_NAMES = ['cx', 'cy', 'r', ...SHARED_ATTRIBUTES];\n\n /**\n * Returns {@link Circle} instance from an SVG element\n * @param {HTMLElement} element Element to parse\n * @param {Object} [options] Partial Circle object to default missing properties on the element.\n * @throws {Error} If value of `r` attribute is missing or invalid\n */\n static async fromElement(\n element: HTMLElement,\n options: Abortable,\n cssRules?: CSSRules,\n ): Promise {\n const {\n left = 0,\n top = 0,\n radius = 0,\n ...otherParsedAttributes\n } = parseAttributes(\n element,\n this.ATTRIBUTE_NAMES,\n cssRules,\n ) as Partial;\n\n // this probably requires to be fixed for default origins not being top/left.\n\n return new this({\n ...otherParsedAttributes,\n radius,\n left: left - radius,\n top: top - radius,\n });\n }\n\n /* _FROM_SVG_END_ */\n\n /**\n * @todo how do we declare this??\n */\n static fromObject>(object: T) {\n return super._fromObject(object);\n }\n}\n\nclassRegistry.setClass(Circle);\nclassRegistry.setSVGClass(Circle);\n","import { SHARED_ATTRIBUTES } from '../parser/attributes';\nimport { parseAttributes } from '../parser/parseAttributes';\nimport type { Abortable, TClassProperties, TOptions } from '../typedefs';\nimport { classRegistry } from '../ClassRegistry';\nimport { FabricObject, cacheProperties } from './Object/FabricObject';\nimport { Point } from '../Point';\nimport { isFiller } from '../util/typeAssertions';\nimport type { FabricObjectProps, SerializedObjectProps } from './Object/types';\nimport type { ObjectEvents } from '../EventTypeDefs';\nimport { makeBoundingBoxFromPoints } from '../util';\nimport { CENTER, LEFT, TOP } from '../constants';\nimport type { CSSRules } from '../parser/typedefs';\n\n// @TODO this code is terrible and Line should be a special case of polyline.\n\nconst coordProps = ['x1', 'x2', 'y1', 'y2'] as const;\n\ninterface UniqueLineProps {\n x1: number;\n x2: number;\n y1: number;\n y2: number;\n}\n\nexport interface SerializedLineProps\n extends SerializedObjectProps,\n UniqueLineProps {}\n\n/**\n * A Class to draw a line\n * A bunch of methods will be added to Polyline to handle the line case\n * The line class is very strange to work with, is all special, it hardly aligns\n * to what a developer want everytime there is an angle\n * @deprecated\n */\nexport class Line<\n Props extends TOptions = Partial,\n SProps extends SerializedLineProps = SerializedLineProps,\n EventSpec extends ObjectEvents = ObjectEvents,\n >\n extends FabricObject\n implements UniqueLineProps\n{\n /**\n * x value or first line edge\n * @type number\n */\n declare x1: number;\n\n /**\n * y value or first line edge\n * @type number\n */\n declare y1: number;\n\n /**\n * x value or second line edge\n * @type number\n */\n declare x2: number;\n\n /**\n * y value or second line edge\n * @type number\n */\n declare y2: number;\n\n static type = 'Line';\n\n static cacheProperties = [...cacheProperties, ...coordProps];\n /**\n * Constructor\n * @param {Array} [points] Array of points\n * @param {Object} [options] Options object\n * @return {Line} thisArg\n */\n constructor([x1, y1, x2, y2] = [0, 0, 0, 0], options: Partial = {}) {\n super();\n Object.assign(this, Line.ownDefaults);\n this.setOptions(options);\n this.x1 = x1;\n this.x2 = x2;\n this.y1 = y1;\n this.y2 = y2;\n this._setWidthHeight();\n const { left, top } = options;\n typeof left === 'number' && this.set(LEFT, left);\n typeof top === 'number' && this.set(TOP, top);\n }\n\n /**\n * @private\n * @param {Object} [options] Options\n */\n _setWidthHeight() {\n const { x1, y1, x2, y2 } = this;\n this.width = Math.abs(x2 - x1);\n this.height = Math.abs(y2 - y1);\n const { left, top, width, height } = makeBoundingBoxFromPoints([\n { x: x1, y: y1 },\n { x: x2, y: y2 },\n ]);\n const position = new Point(left + width / 2, top + height / 2);\n this.setPositionByOrigin(position, CENTER, CENTER);\n }\n\n /**\n * @private\n * @param {String} key\n * @param {*} value\n */\n _set(key: string, value: any) {\n super._set(key, value);\n if (coordProps.includes(key as keyof UniqueLineProps)) {\n // this doesn't make sense very much, since setting x1 when top or left\n // are already set, is just going to show a strange result since the\n // line will move way more than the developer expect.\n // in fabric5 it worked only when the line didn't have extra transformations,\n // in fabric6 too. With extra transform they behave bad in different ways.\n // This needs probably a good rework or a tutorial if you have to create a dynamic line\n this._setWidthHeight();\n }\n return this;\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _render(ctx: CanvasRenderingContext2D) {\n ctx.beginPath();\n\n const p = this.calcLinePoints();\n ctx.moveTo(p.x1, p.y1);\n ctx.lineTo(p.x2, p.y2);\n\n ctx.lineWidth = this.strokeWidth;\n\n // TODO: test this\n // make sure setting \"fill\" changes color of a line\n // (by copying fillStyle to strokeStyle, since line is stroked, not filled)\n const origStrokeStyle = ctx.strokeStyle;\n if (isFiller(this.stroke)) {\n ctx.strokeStyle = this.stroke.toLive(ctx)!;\n } else {\n ctx.strokeStyle = this.stroke ?? ctx.fillStyle;\n }\n this.stroke && this._renderStroke(ctx);\n ctx.strokeStyle = origStrokeStyle;\n }\n\n /**\n * This function is an helper for svg import. it returns the center of the object in the svg\n * untransformed coordinates\n * @private\n * @return {Point} center point from element coordinates\n */\n _findCenterFromElement(): Point {\n return new Point((this.x1 + this.x2) / 2, (this.y1 + this.y2) / 2);\n }\n\n /**\n * Returns object representation of an instance\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} object representation of an instance\n */\n toObject<\n T extends Omit, keyof SProps>,\n K extends keyof T = never,\n >(propertiesToInclude: K[] = []): Pick & SProps {\n return {\n ...super.toObject(propertiesToInclude),\n ...this.calcLinePoints(),\n };\n }\n\n /*\n * Calculate object dimensions from its properties\n * @private\n */\n _getNonTransformedDimensions(): Point {\n const dim = super._getNonTransformedDimensions();\n if (this.strokeLineCap === 'butt') {\n if (this.width === 0) {\n dim.y -= this.strokeWidth;\n }\n if (this.height === 0) {\n dim.x -= this.strokeWidth;\n }\n }\n return dim;\n }\n\n /**\n * Recalculates line points given width and height\n * Those points are simply placed around the center,\n * This is not useful outside internal render functions and svg output\n * Is not meant to be for the developer.\n * @private\n */\n calcLinePoints(): UniqueLineProps {\n const { x1: _x1, x2: _x2, y1: _y1, y2: _y2, width, height } = this;\n const xMult = _x1 <= _x2 ? -1 : 1,\n yMult = _y1 <= _y2 ? -1 : 1,\n x1 = (xMult * width) / 2,\n y1 = (yMult * height) / 2,\n x2 = (xMult * -width) / 2,\n y2 = (yMult * -height) / 2;\n\n return {\n x1,\n x2,\n y1,\n y2,\n };\n }\n\n /* _FROM_SVG_START_ */\n\n /**\n * Returns svg representation of an instance\n * @return {Array} an array of strings with the specific svg representation\n * of the instance\n */\n _toSVG() {\n const { x1, x2, y1, y2 } = this.calcLinePoints();\n return [\n '\\n`,\n ];\n }\n\n /**\n * List of attribute names to account for when parsing SVG element (used by {@link Line.fromElement})\n * @see http://www.w3.org/TR/SVG/shapes.html#LineElement\n */\n static ATTRIBUTE_NAMES = SHARED_ATTRIBUTES.concat(coordProps);\n\n /**\n * Returns Line instance from an SVG element\n * @param {HTMLElement} element Element to parse\n * @param {Object} [options] Options object\n * @param {Function} [callback] callback function invoked after parsing\n */\n static async fromElement(\n element: HTMLElement,\n options?: Abortable,\n cssRules?: CSSRules,\n ) {\n const {\n x1 = 0,\n y1 = 0,\n x2 = 0,\n y2 = 0,\n ...parsedAttributes\n } = parseAttributes(element, this.ATTRIBUTE_NAMES, cssRules);\n return new this([x1, y1, x2, y2], parsedAttributes);\n }\n\n /* _FROM_SVG_END_ */\n\n /**\n * Returns Line instance from an object representation\n * @param {Object} object Object to create an instance from\n * @returns {Promise}\n */\n static fromObject>({\n x1,\n y1,\n x2,\n y2,\n ...object\n }: T) {\n return this._fromObject(\n {\n ...object,\n points: [x1, y1, x2, y2],\n },\n {\n extraParam: 'points',\n },\n );\n }\n}\n\nclassRegistry.setClass(Line);\nclassRegistry.setSVGClass(Line);\n","import { classRegistry } from '../ClassRegistry';\nimport { FabricObject } from './Object/FabricObject';\nimport type { FabricObjectProps, SerializedObjectProps } from './Object/types';\nimport type { TClassProperties, TOptions } from '../typedefs';\nimport type { ObjectEvents } from '../EventTypeDefs';\n\nexport const triangleDefaultValues: Partial> = {\n width: 100,\n height: 100,\n};\n\nexport class Triangle<\n Props extends TOptions = Partial,\n SProps extends SerializedObjectProps = SerializedObjectProps,\n EventSpec extends ObjectEvents = ObjectEvents,\n >\n extends FabricObject\n implements FabricObjectProps\n{\n static type = 'Triangle';\n\n static ownDefaults = triangleDefaultValues;\n\n static getDefaults(): Record {\n return { ...super.getDefaults(), ...Triangle.ownDefaults };\n }\n\n /**\n * Constructor\n * @param {Object} [options] Options object\n */\n constructor(options?: Props) {\n super();\n Object.assign(this, Triangle.ownDefaults);\n this.setOptions(options);\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _render(ctx: CanvasRenderingContext2D) {\n const widthBy2 = this.width / 2,\n heightBy2 = this.height / 2;\n\n ctx.beginPath();\n ctx.moveTo(-widthBy2, heightBy2);\n ctx.lineTo(0, -heightBy2);\n ctx.lineTo(widthBy2, heightBy2);\n ctx.closePath();\n\n this._renderPaintInOrder(ctx);\n }\n\n /**\n * Returns svg representation of an instance\n * @return {Array} an array of strings with the specific svg representation\n * of the instance\n */\n _toSVG() {\n const widthBy2 = this.width / 2,\n heightBy2 = this.height / 2,\n points = `${-widthBy2} ${heightBy2},0 ${-heightBy2},${widthBy2} ${heightBy2}`;\n return [''];\n }\n}\n\nclassRegistry.setClass(Triangle);\nclassRegistry.setSVGClass(Triangle);\n","import { SCALE_X, SCALE_Y, twoMathPi } from '../constants';\nimport { SHARED_ATTRIBUTES } from '../parser/attributes';\nimport { parseAttributes } from '../parser/parseAttributes';\nimport type { Abortable, TClassProperties, TOptions } from '../typedefs';\nimport { classRegistry } from '../ClassRegistry';\nimport { FabricObject, cacheProperties } from './Object/FabricObject';\nimport type { FabricObjectProps, SerializedObjectProps } from './Object/types';\nimport type { ObjectEvents } from '../EventTypeDefs';\nimport type { CSSRules } from '../parser/typedefs';\n\nexport const ellipseDefaultValues: Partial> = {\n rx: 0,\n ry: 0,\n};\n\ninterface UniqueEllipseProps {\n rx: number;\n ry: number;\n}\n\nexport interface SerializedEllipseProps\n extends SerializedObjectProps,\n UniqueEllipseProps {}\n\nexport interface EllipseProps extends FabricObjectProps, UniqueEllipseProps {}\n\nconst ELLIPSE_PROPS = ['rx', 'ry'] as const;\n\nexport class Ellipse<\n Props extends TOptions = Partial,\n SProps extends SerializedEllipseProps = SerializedEllipseProps,\n EventSpec extends ObjectEvents = ObjectEvents,\n >\n extends FabricObject\n implements EllipseProps\n{\n /**\n * Horizontal radius\n * @type Number\n */\n declare rx: number;\n\n /**\n * Vertical radius\n * @type Number\n */\n declare ry: number;\n\n static type = 'Ellipse';\n\n static cacheProperties = [...cacheProperties, ...ELLIPSE_PROPS];\n\n static ownDefaults = ellipseDefaultValues;\n\n static getDefaults(): Record {\n return {\n ...super.getDefaults(),\n ...Ellipse.ownDefaults,\n };\n }\n\n /**\n * Constructor\n * @param {Object} [options] Options object\n */\n constructor(options?: Props) {\n super();\n Object.assign(this, Ellipse.ownDefaults);\n this.setOptions(options);\n }\n\n /**\n * @private\n * @param {String} key\n * @param {*} value\n * @return {Ellipse} thisArg\n */\n _set(key: string, value: any) {\n super._set(key, value);\n switch (key) {\n case 'rx':\n this.rx = value;\n this.set('width', value * 2);\n break;\n\n case 'ry':\n this.ry = value;\n this.set('height', value * 2);\n break;\n }\n return this;\n }\n\n /**\n * Returns horizontal radius of an object (according to how an object is scaled)\n * @return {Number}\n */\n getRx() {\n return this.get('rx') * this.get(SCALE_X);\n }\n\n /**\n * Returns Vertical radius of an object (according to how an object is scaled)\n * @return {Number}\n */\n getRy() {\n return this.get('ry') * this.get(SCALE_Y);\n }\n\n /**\n * Returns object representation of an instance\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} object representation of an instance\n */\n toObject<\n T extends Omit, keyof SProps>,\n K extends keyof T = never,\n >(propertiesToInclude: K[] = []): Pick & SProps {\n return super.toObject([...ELLIPSE_PROPS, ...propertiesToInclude]);\n }\n\n /**\n * Returns svg representation of an instance\n * @return {Array} an array of strings with the specific svg representation\n * of the instance\n */\n _toSVG(): string[] {\n return [\n '\\n`,\n ];\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx context to render on\n */\n _render(ctx: CanvasRenderingContext2D) {\n ctx.beginPath();\n ctx.save();\n ctx.transform(1, 0, 0, this.ry / this.rx, 0, 0);\n ctx.arc(0, 0, this.rx, 0, twoMathPi, false);\n ctx.restore();\n this._renderPaintInOrder(ctx);\n }\n\n /* _FROM_SVG_START_ */\n\n /**\n * List of attribute names to account for when parsing SVG element (used by {@link Ellipse.fromElement})\n * @see http://www.w3.org/TR/SVG/shapes.html#EllipseElement\n */\n static ATTRIBUTE_NAMES = [...SHARED_ATTRIBUTES, 'cx', 'cy', 'rx', 'ry'];\n\n /**\n * Returns {@link Ellipse} instance from an SVG element\n * @param {HTMLElement} element Element to parse\n * @return {Ellipse}\n */\n static async fromElement(\n element: HTMLElement,\n options?: Abortable,\n cssRules?: CSSRules,\n ) {\n const parsedAttributes = parseAttributes(\n element,\n this.ATTRIBUTE_NAMES,\n cssRules,\n );\n\n parsedAttributes.left = (parsedAttributes.left || 0) - parsedAttributes.rx;\n parsedAttributes.top = (parsedAttributes.top || 0) - parsedAttributes.ry;\n return new this(parsedAttributes);\n }\n\n /* _FROM_SVG_END_ */\n}\n\nclassRegistry.setClass(Ellipse);\nclassRegistry.setSVGClass(Ellipse);\n","import { config } from '../config';\nimport { SHARED_ATTRIBUTES } from '../parser/attributes';\nimport { parseAttributes } from '../parser/parseAttributes';\nimport { parsePointsAttribute } from '../parser/parsePointsAttribute';\nimport type { XY } from '../Point';\nimport { Point } from '../Point';\nimport type { Abortable, TClassProperties, TOptions } from '../typedefs';\nimport { classRegistry } from '../ClassRegistry';\nimport { makeBoundingBoxFromPoints } from '../util/misc/boundingBoxFromPoints';\nimport { calcDimensionsMatrix, transformPoint } from '../util/misc/matrix';\nimport { projectStrokeOnPoints } from '../util/misc/projectStroke';\nimport type { TProjectStrokeOnPointsOptions } from '../util/misc/projectStroke/types';\nimport { degreesToRadians } from '../util/misc/radiansDegreesConversion';\nimport { toFixed } from '../util/misc/toFixed';\nimport { FabricObject, cacheProperties } from './Object/FabricObject';\nimport type { FabricObjectProps, SerializedObjectProps } from './Object/types';\nimport type { ObjectEvents } from '../EventTypeDefs';\nimport {\n CENTER,\n LEFT,\n SCALE_X,\n SCALE_Y,\n SKEW_X,\n SKEW_Y,\n TOP,\n} from '../constants';\nimport type { CSSRules } from '../parser/typedefs';\n\nexport const polylineDefaultValues: Partial> = {\n /**\n * @deprecated transient option soon to be removed in favor of a different design\n */\n exactBoundingBox: false,\n};\n\nexport interface SerializedPolylineProps extends SerializedObjectProps {\n points: XY[];\n}\n\nexport class Polyline<\n Props extends TOptions = Partial,\n SProps extends SerializedPolylineProps = SerializedPolylineProps,\n EventSpec extends ObjectEvents = ObjectEvents,\n> extends FabricObject {\n /**\n * Points array\n * @type Array\n */\n declare points: XY[];\n\n /**\n * WARNING: Feature in progress\n * Calculate the exact bounding box taking in account strokeWidth on acute angles\n * this will be turned to true by default on fabric 6.0\n * maybe will be left in as an optimization since calculations may be slow\n * @deprecated transient option soon to be removed in favor of a different design\n * @type Boolean\n * @default false\n */\n declare exactBoundingBox: boolean;\n\n declare private initialized: true | undefined;\n\n static ownDefaults = polylineDefaultValues;\n\n static type = 'Polyline';\n\n static getDefaults(): Record {\n return {\n ...super.getDefaults(),\n ...Polyline.ownDefaults,\n };\n }\n\n /**\n * A list of properties that if changed trigger a recalculation of dimensions\n * @todo check if you really need to recalculate for all cases\n */\n static layoutProperties: (keyof Polyline)[] = [\n SKEW_X,\n SKEW_Y,\n 'strokeLineCap',\n 'strokeLineJoin',\n 'strokeMiterLimit',\n 'strokeWidth',\n 'strokeUniform',\n 'points',\n ];\n\n declare pathOffset: Point;\n\n declare strokeOffset: Point;\n\n static cacheProperties = [...cacheProperties, 'points'];\n\n strokeDiff: Point;\n\n /**\n * Constructor\n * @param {Array} points Array of points (where each point is an object with x and y)\n * @param {Object} [options] Options object\n * @return {Polyline} thisArg\n * @example\n * var poly = new Polyline([\n * { x: 10, y: 10 },\n * { x: 50, y: 30 },\n * { x: 40, y: 70 },\n * { x: 60, y: 50 },\n * { x: 100, y: 150 },\n * { x: 40, y: 100 }\n * ], {\n * stroke: 'red',\n * left: 100,\n * top: 100\n * });\n */\n constructor(points: XY[] = [], options: Props = {} as Props) {\n super();\n Object.assign(this, Polyline.ownDefaults);\n this.setOptions(options);\n this.points = points;\n const { left, top } = options;\n this.initialized = true;\n this.setBoundingBox(true);\n typeof left === 'number' && this.set(LEFT, left);\n typeof top === 'number' && this.set(TOP, top);\n }\n\n protected isOpen() {\n return true;\n }\n\n private _projectStrokeOnPoints(options: TProjectStrokeOnPointsOptions) {\n return projectStrokeOnPoints(this.points, options, this.isOpen());\n }\n\n /**\n * Calculate the polygon bounding box\n * @private\n */\n _calcDimensions(options?: Partial) {\n options = {\n scaleX: this.scaleX,\n scaleY: this.scaleY,\n skewX: this.skewX,\n skewY: this.skewY,\n strokeLineCap: this.strokeLineCap,\n strokeLineJoin: this.strokeLineJoin,\n strokeMiterLimit: this.strokeMiterLimit,\n strokeUniform: this.strokeUniform,\n strokeWidth: this.strokeWidth,\n ...(options || {}),\n };\n const points = this.exactBoundingBox\n ? this._projectStrokeOnPoints(\n options as TProjectStrokeOnPointsOptions,\n ).map((projection) => projection.projectedPoint)\n : this.points;\n if (points.length === 0) {\n return {\n left: 0,\n top: 0,\n width: 0,\n height: 0,\n pathOffset: new Point(),\n strokeOffset: new Point(),\n strokeDiff: new Point(),\n };\n }\n const bbox = makeBoundingBoxFromPoints(points),\n // Remove scale effect, since it's applied after\n matrix = calcDimensionsMatrix({ ...options, scaleX: 1, scaleY: 1 }),\n bboxNoStroke = makeBoundingBoxFromPoints(\n this.points.map((p) => transformPoint(p, matrix, true)),\n ),\n scale = new Point(this.scaleX, this.scaleY);\n let offsetX = bbox.left + bbox.width / 2,\n offsetY = bbox.top + bbox.height / 2;\n if (this.exactBoundingBox) {\n offsetX = offsetX - offsetY * Math.tan(degreesToRadians(this.skewX));\n // Order of those assignments is important.\n // offsetY relies on offsetX being already changed by the line above\n offsetY = offsetY - offsetX * Math.tan(degreesToRadians(this.skewY));\n }\n\n return {\n ...bbox,\n pathOffset: new Point(offsetX, offsetY),\n strokeOffset: new Point(bboxNoStroke.left, bboxNoStroke.top)\n .subtract(new Point(bbox.left, bbox.top))\n .multiply(scale),\n strokeDiff: new Point(bbox.width, bbox.height)\n .subtract(new Point(bboxNoStroke.width, bboxNoStroke.height))\n .multiply(scale),\n };\n }\n\n /**\n * This function is an helper for svg import. it returns the center of the object in the svg\n * untransformed coordinates, by look at the polyline/polygon points.\n * @private\n * @return {Point} center point from element coordinates\n */\n _findCenterFromElement(): Point {\n const bbox = makeBoundingBoxFromPoints(this.points);\n return new Point(bbox.left + bbox.width / 2, bbox.top + bbox.height / 2);\n }\n\n setDimensions() {\n this.setBoundingBox();\n }\n\n setBoundingBox(adjustPosition?: boolean) {\n const { left, top, width, height, pathOffset, strokeOffset, strokeDiff } =\n this._calcDimensions();\n this.set({ width, height, pathOffset, strokeOffset, strokeDiff });\n adjustPosition &&\n this.setPositionByOrigin(\n new Point(left + width / 2, top + height / 2),\n CENTER,\n CENTER,\n );\n }\n\n /**\n * @deprecated intermidiate method to be removed, do not use\n */\n protected isStrokeAccountedForInDimensions() {\n return this.exactBoundingBox;\n }\n\n /**\n * @override stroke is taken in account in size\n */\n _getNonTransformedDimensions() {\n return this.exactBoundingBox\n ? // TODO: fix this\n new Point(this.width, this.height)\n : super._getNonTransformedDimensions();\n }\n\n /**\n * @override stroke and skewing are taken into account when projecting stroke on points,\n * therefore we don't want the default calculation to account for skewing as well.\n * Though it is possible to pass `width` and `height` in `options`, doing so is very strange, use with discretion.\n *\n * @private\n */\n _getTransformedDimensions(options: any = {}) {\n if (this.exactBoundingBox) {\n let size: Point;\n /* When `strokeUniform = true`, any changes to the properties require recalculating the `width` and `height` because\n the stroke projections are affected.\n When `strokeUniform = false`, we don't need to recalculate for scale transformations, as the effect of scale on\n projections follows a linear function (e.g. scaleX of 2 just multiply width by 2)*/\n if (\n Object.keys(options).some(\n (key) =>\n this.strokeUniform ||\n (this.constructor as typeof Polyline).layoutProperties.includes(\n key as keyof TProjectStrokeOnPointsOptions,\n ),\n )\n ) {\n const { width, height } = this._calcDimensions(options);\n size = new Point(options.width ?? width, options.height ?? height);\n } else {\n size = new Point(\n options.width ?? this.width,\n options.height ?? this.height,\n );\n }\n return size.multiply(\n new Point(options.scaleX || this.scaleX, options.scaleY || this.scaleY),\n );\n } else {\n return super._getTransformedDimensions(options);\n }\n }\n\n /**\n * Recalculates dimensions when changing skew and scale\n * @private\n */\n _set(key: string, value: any) {\n const changed = this.initialized && this[key as keyof this] !== value;\n const output = super._set(key, value);\n if (\n this.exactBoundingBox &&\n changed &&\n (((key === SCALE_X || key === SCALE_Y) &&\n this.strokeUniform &&\n (this.constructor as typeof Polyline).layoutProperties.includes(\n 'strokeUniform',\n )) ||\n (this.constructor as typeof Polyline).layoutProperties.includes(\n key as keyof Polyline,\n ))\n ) {\n this.setDimensions();\n }\n return output;\n }\n\n /**\n * Returns object representation of an instance\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} Object representation of an instance\n */\n toObject<\n T extends Omit, keyof SProps>,\n K extends keyof T = never,\n >(propertiesToInclude: K[] = []): Pick & SProps {\n return {\n ...super.toObject(propertiesToInclude),\n points: this.points.map(({ x, y }) => ({ x, y })),\n };\n }\n\n /**\n * Returns svg representation of an instance\n * @return {Array} an array of strings with the specific svg representation\n * of the instance\n */\n _toSVG() {\n const points = [],\n diffX = this.pathOffset.x,\n diffY = this.pathOffset.y,\n NUM_FRACTION_DIGITS = config.NUM_FRACTION_DIGITS;\n\n for (let i = 0, len = this.points.length; i < len; i++) {\n points.push(\n toFixed(this.points[i].x - diffX, NUM_FRACTION_DIGITS),\n ',',\n toFixed(this.points[i].y - diffY, NUM_FRACTION_DIGITS),\n ' ',\n );\n }\n return [\n `<${\n (this.constructor as typeof Polyline).type.toLowerCase() as\n | 'polyline'\n | 'polygon'\n } `,\n 'COMMON_PARTS',\n `points=\"${points.join('')}\" />\\n`,\n ];\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _render(ctx: CanvasRenderingContext2D) {\n const len = this.points.length,\n x = this.pathOffset.x,\n y = this.pathOffset.y;\n\n if (!len || isNaN(this.points[len - 1].y)) {\n // do not draw if no points or odd points\n // NaN comes from parseFloat of a empty string in parser\n return;\n }\n ctx.beginPath();\n ctx.moveTo(this.points[0].x - x, this.points[0].y - y);\n for (let i = 0; i < len; i++) {\n const point = this.points[i];\n ctx.lineTo(point.x - x, point.y - y);\n }\n !this.isOpen() && ctx.closePath();\n this._renderPaintInOrder(ctx);\n }\n\n /**\n * Returns complexity of an instance\n * @return {Number} complexity of this instance\n */\n complexity(): number {\n return this.points.length;\n }\n\n /* _FROM_SVG_START_ */\n\n /**\n * List of attribute names to account for when parsing SVG element (used by {@link Polyline.fromElement})\n * @see: http://www.w3.org/TR/SVG/shapes.html#PolylineElement\n */\n static ATTRIBUTE_NAMES = [...SHARED_ATTRIBUTES];\n\n /**\n * Returns Polyline instance from an SVG element\n * @param {HTMLElement} element Element to parser\n * @param {Object} [options] Options object\n */\n static async fromElement(\n element: HTMLElement | SVGElement,\n options?: Abortable,\n cssRules?: CSSRules,\n ) {\n const points = parsePointsAttribute(element.getAttribute('points')),\n // we omit left and top to instruct the constructor to position the object using the bbox\n\n { left, top, ...parsedAttributes } = parseAttributes(\n element,\n this.ATTRIBUTE_NAMES,\n cssRules,\n );\n return new this(points, {\n ...parsedAttributes,\n ...options,\n });\n }\n\n /* _FROM_SVG_END_ */\n\n /**\n * Returns Polyline instance from an object representation\n * @param {Object} object Object to create an instance from\n * @returns {Promise}\n */\n static fromObject>(object: T) {\n return this._fromObject(object, {\n extraParam: 'points',\n });\n }\n}\n\nclassRegistry.setClass(Polyline);\nclassRegistry.setSVGClass(Polyline);\n","import type { XY } from '../Point';\n\n/**\n * Parses \"points\" attribute, returning an array of values\n * @param {String} points points attribute string\n * @return {Array} array of points\n */\nexport function parsePointsAttribute(points: string | null): XY[] {\n // points attribute is required and must not be empty\n if (!points) {\n return [];\n }\n\n // replace commas with whitespace and remove bookending whitespace\n const pointsSplit: string[] = points.replace(/,/g, ' ').trim().split(/\\s+/);\n\n const parsedPoints = [];\n\n for (let i = 0; i < pointsSplit.length; i += 2) {\n parsedPoints.push({\n x: parseFloat(pointsSplit[i]),\n y: parseFloat(pointsSplit[i + 1]),\n });\n }\n\n // odd number of points is an error\n // if (parsedPoints.length % 2 !== 0) {\n // return null;\n // }\n return parsedPoints;\n}\n","import { classRegistry } from '../ClassRegistry';\nimport { Polyline, polylineDefaultValues } from './Polyline';\n\nexport class Polygon extends Polyline {\n static ownDefaults = polylineDefaultValues;\n\n static type = 'Polygon';\n\n protected isOpen() {\n return false;\n }\n}\n\nclassRegistry.setClass(Polygon);\nclassRegistry.setSVGClass(Polygon);\n","import type { ObjectEvents } from '../../EventTypeDefs';\nimport type { FabricObjectProps, SerializedObjectProps } from '../Object/types';\nimport type { TOptions } from '../../typedefs';\nimport { FabricObject } from '../Object/FabricObject';\nimport { styleProperties } from './constants';\nimport type { StylePropertiesType } from './constants';\nimport type { FabricText } from './Text';\nimport { pick } from '../../util';\nimport { pickBy } from '../../util/misc/pick';\n\nexport type CompleteTextStyleDeclaration = Pick<\n FabricText,\n StylePropertiesType\n>;\n\nexport type TextStyleDeclaration = Partial;\n\nexport type TextStyle = {\n [line: number | string]: { [char: number | string]: TextStyleDeclaration };\n};\n\nexport abstract class StyledText<\n Props extends TOptions = Partial,\n SProps extends SerializedObjectProps = SerializedObjectProps,\n EventSpec extends ObjectEvents = ObjectEvents,\n> extends FabricObject {\n declare abstract styles: TextStyle;\n declare protected abstract _textLines: string[][];\n declare protected _forceClearCache: boolean;\n static _styleProperties: Readonly = styleProperties;\n abstract get2DCursorLocation(\n selectionStart: number,\n skipWrapping?: boolean,\n ): { charIndex: number; lineIndex: number };\n\n /**\n * Returns true if object has no styling or no styling in a line\n * @param {Number} lineIndex , lineIndex is on wrapped lines.\n * @return {Boolean}\n */\n isEmptyStyles(lineIndex?: number): boolean {\n if (!this.styles) {\n return true;\n }\n if (typeof lineIndex !== 'undefined' && !this.styles[lineIndex]) {\n return true;\n }\n const obj =\n typeof lineIndex === 'undefined'\n ? this.styles\n : { line: this.styles[lineIndex] };\n for (const p1 in obj) {\n for (const p2 in obj[p1]) {\n // eslint-disable-next-line no-unused-vars\n for (const p3 in obj[p1][p2]) {\n return false;\n }\n }\n }\n return true;\n }\n\n /**\n * Returns true if object has a style property or has it ina specified line\n * This function is used to detect if a text will use a particular property or not.\n * @param {String} property to check for\n * @param {Number} lineIndex to check the style on\n * @return {Boolean}\n */\n styleHas(property: keyof TextStyleDeclaration, lineIndex?: number): boolean {\n if (!this.styles) {\n return false;\n }\n if (typeof lineIndex !== 'undefined' && !this.styles[lineIndex]) {\n return false;\n }\n const obj =\n typeof lineIndex === 'undefined'\n ? this.styles\n : { 0: this.styles[lineIndex] };\n // eslint-disable-next-line\n for (const p1 in obj) {\n // eslint-disable-next-line\n for (const p2 in obj[p1]) {\n if (typeof obj[p1][p2][property] !== 'undefined') {\n return true;\n }\n }\n }\n return false;\n }\n\n /**\n * Check if characters in a text have a value for a property\n * whose value matches the textbox's value for that property. If so,\n * the character-level property is deleted. If the character\n * has no other properties, then it is also deleted. Finally,\n * if the line containing that character has no other characters\n * then it also is deleted.\n */\n cleanStyle(property: keyof TextStyleDeclaration) {\n if (!this.styles) {\n return false;\n }\n const obj = this.styles;\n let stylesCount = 0,\n letterCount,\n stylePropertyValue,\n allStyleObjectPropertiesMatch = true,\n graphemeCount = 0;\n for (const p1 in obj) {\n letterCount = 0;\n for (const p2 in obj[p1]) {\n const styleObject = obj[p1][p2] || {},\n stylePropertyHasBeenSet = styleObject[property] !== undefined;\n\n stylesCount++;\n\n if (stylePropertyHasBeenSet) {\n if (!stylePropertyValue) {\n stylePropertyValue = styleObject[property];\n } else if (styleObject[property] !== stylePropertyValue) {\n allStyleObjectPropertiesMatch = false;\n }\n\n if (styleObject[property] === this[property as keyof this]) {\n delete styleObject[property];\n }\n } else {\n allStyleObjectPropertiesMatch = false;\n }\n\n if (Object.keys(styleObject).length !== 0) {\n letterCount++;\n } else {\n delete obj[p1][p2];\n }\n }\n\n if (letterCount === 0) {\n delete obj[p1];\n }\n }\n // if every grapheme has the same style set then\n // delete those styles and set it on the parent\n for (let i = 0; i < this._textLines.length; i++) {\n graphemeCount += this._textLines[i].length;\n }\n if (allStyleObjectPropertiesMatch && stylesCount === graphemeCount) {\n this[property as keyof this] = stylePropertyValue as any;\n this.removeStyle(property);\n }\n }\n\n /**\n * Remove a style property or properties from all individual character styles\n * in a text object. Deletes the character style object if it contains no other style\n * props. Deletes a line style object if it contains no other character styles.\n *\n * @param {String} props The property to remove from character styles.\n */\n removeStyle(property: keyof TextStyleDeclaration) {\n if (!this.styles) {\n return;\n }\n const obj = this.styles;\n let line, lineNum, charNum;\n for (lineNum in obj) {\n line = obj[lineNum];\n for (charNum in line) {\n delete line[charNum][property];\n if (Object.keys(line[charNum]).length === 0) {\n delete line[charNum];\n }\n }\n if (Object.keys(line).length === 0) {\n delete obj[lineNum];\n }\n }\n }\n\n private _extendStyles(index: number, style: TextStyleDeclaration): void {\n const { lineIndex, charIndex } = this.get2DCursorLocation(index);\n\n if (!this._getLineStyle(lineIndex)) {\n this._setLineStyle(lineIndex);\n }\n\n const newStyle = pickBy(\n {\n // first create a new object that is a merge of existing and new\n ...this._getStyleDeclaration(lineIndex, charIndex),\n ...style,\n // use the predicate to discard undefined values\n },\n (value) => value !== undefined,\n );\n\n // finally assign to the old position the new style\n this._setStyleDeclaration(lineIndex, charIndex, newStyle);\n }\n\n /**\n * Gets style of a current selection/cursor (at the start position)\n * @param {Number} startIndex Start index to get styles at\n * @param {Number} endIndex End index to get styles at, if not specified startIndex + 1\n * @param {Boolean} [complete] get full style or not\n * @return {Array} styles an array with one, zero or more Style objects\n */\n getSelectionStyles(\n startIndex: number,\n endIndex?: number,\n complete?: boolean,\n ): TextStyleDeclaration[] {\n const styles: TextStyleDeclaration[] = [];\n for (let i = startIndex; i < (endIndex || startIndex); i++) {\n styles.push(this.getStyleAtPosition(i, complete));\n }\n return styles;\n }\n\n /**\n * Gets style of a current selection/cursor position\n * @param {Number} position to get styles at\n * @param {Boolean} [complete] full style if true\n * @return {Object} style Style object at a specified index\n * @private\n */\n getStyleAtPosition(position: number, complete?: boolean) {\n const { lineIndex, charIndex } = this.get2DCursorLocation(position);\n return complete\n ? this.getCompleteStyleDeclaration(lineIndex, charIndex)\n : this._getStyleDeclaration(lineIndex, charIndex);\n }\n\n /**\n * Sets style of a current selection, if no selection exist, do not set anything.\n * @param {Object} styles Styles object\n * @param {Number} startIndex Start index to get styles at\n * @param {Number} [endIndex] End index to get styles at, if not specified startIndex + 1\n */\n setSelectionStyles(styles: object, startIndex: number, endIndex?: number) {\n for (let i = startIndex; i < (endIndex || startIndex); i++) {\n this._extendStyles(i, styles);\n }\n /* not included in _extendStyles to avoid clearing cache more than once */\n this._forceClearCache = true;\n }\n\n /**\n * Get a reference, not a clone, to the style object for a given character,\n * if no style is set for a line or char, return a new empty object.\n * This is tricky and confusing because when you get an empty object you can't\n * determine if it is a reference or a new one.\n * @TODO this should always return a reference or always a clone or undefined when necessary.\n * @protected\n * @param {Number} lineIndex\n * @param {Number} charIndex\n * @return {TextStyleDeclaration} a style object reference to the existing one or a new empty object when undefined\n */\n _getStyleDeclaration(\n lineIndex: number,\n charIndex: number,\n ): TextStyleDeclaration {\n const lineStyle = this.styles && this.styles[lineIndex];\n return lineStyle ? (lineStyle[charIndex] ?? {}) : {};\n }\n\n /**\n * return a new object that contains all the style property for a character\n * the object returned is newly created\n * @param {Number} lineIndex of the line where the character is\n * @param {Number} charIndex position of the character on the line\n * @return {Object} style object\n */\n getCompleteStyleDeclaration(\n lineIndex: number,\n charIndex: number,\n ): CompleteTextStyleDeclaration {\n return {\n ...pick(\n this,\n (this.constructor as typeof StyledText)\n ._styleProperties as (keyof this)[],\n ),\n ...this._getStyleDeclaration(lineIndex, charIndex),\n } as CompleteTextStyleDeclaration;\n }\n\n /**\n * @param {Number} lineIndex\n * @param {Number} charIndex\n * @param {Object} style\n * @private\n */\n protected _setStyleDeclaration(\n lineIndex: number,\n charIndex: number,\n style: object,\n ) {\n this.styles[lineIndex][charIndex] = style;\n }\n\n /**\n *\n * @param {Number} lineIndex\n * @param {Number} charIndex\n * @private\n */\n protected _deleteStyleDeclaration(lineIndex: number, charIndex: number) {\n delete this.styles[lineIndex][charIndex];\n }\n\n /**\n * @param {Number} lineIndex\n * @return {Boolean} if the line exists or not\n * @private\n */\n protected _getLineStyle(lineIndex: number): boolean {\n return !!this.styles[lineIndex];\n }\n\n /**\n * Set the line style to an empty object so that is initialized\n * @param {Number} lineIndex\n * @private\n */\n protected _setLineStyle(lineIndex: number) {\n this.styles[lineIndex] = {};\n }\n\n protected _deleteLineStyle(lineIndex: number) {\n delete this.styles[lineIndex];\n }\n}\n","import { config } from '../../config';\nimport type { TSVGReviver } from '../../typedefs';\nimport { escapeXml } from '../../util/lang_string';\nimport { colorPropToSVG, createSVGRect } from '../../util/misc/svgParsing';\nimport { hasStyleChanged } from '../../util/misc/textStyles';\nimport { toFixed } from '../../util/misc/toFixed';\nimport { FabricObjectSVGExportMixin } from '../Object/FabricObjectSVGExportMixin';\nimport { type TextStyleDeclaration } from './StyledText';\nimport { JUSTIFY } from '../Text/constants';\nimport type { FabricText, GraphemeBBox } from './Text';\nimport { STROKE, FILL } from '../../constants';\nimport { createRotateMatrix } from '../../util/misc/matrix';\nimport { radiansToDegrees } from '../../util/misc/radiansDegreesConversion';\nimport { Point } from '../../Point';\nimport { matrixToSVG } from '../../util/misc/svgExport';\n\nconst multipleSpacesRegex = / +/g;\nconst dblQuoteRegex = /\"/g;\n\nfunction createSVGInlineRect(\n color: string,\n left: number,\n top: number,\n width: number,\n height: number,\n) {\n return `\\t\\t${createSVGRect(color, { left, top, width, height })}\\n`;\n}\n\nexport class TextSVGExportMixin extends FabricObjectSVGExportMixin {\n _toSVG(this: TextSVGExportMixin & FabricText): string[] {\n const offsets = this._getSVGLeftTopOffsets(),\n textAndBg = this._getSVGTextAndBg(offsets.textTop, offsets.textLeft);\n return this._wrapSVGTextAndBg(textAndBg);\n }\n\n toSVG(this: TextSVGExportMixin & FabricText, reviver?: TSVGReviver): string {\n const textSvg = this._createBaseSVGMarkup(this._toSVG(), {\n reviver,\n noStyle: true,\n withShadow: true,\n }),\n path = this.path;\n if (path) {\n return (\n textSvg +\n path._createBaseSVGMarkup(path._toSVG(), {\n reviver,\n withShadow: true,\n additionalTransform: matrixToSVG(this.calcOwnMatrix()),\n })\n );\n }\n return textSvg;\n }\n\n private _getSVGLeftTopOffsets(this: TextSVGExportMixin & FabricText) {\n return {\n textLeft: -this.width / 2,\n textTop: -this.height / 2,\n lineTop: this.getHeightOfLine(0),\n };\n }\n\n private _wrapSVGTextAndBg(\n this: TextSVGExportMixin & FabricText,\n {\n textBgRects,\n textSpans,\n }: {\n textSpans: string[];\n textBgRects: string[];\n },\n ) {\n const noShadow = true,\n textDecoration = this.getSvgTextDecoration(this);\n return [\n textBgRects.join(''),\n '\\t\\t',\n textSpans.join(''),\n '\\n',\n ];\n }\n\n /**\n * @private\n * @param {Number} textTopOffset Text top offset\n * @param {Number} textLeftOffset Text left offset\n * @return {Object}\n */\n private _getSVGTextAndBg(\n this: TextSVGExportMixin & FabricText,\n textTopOffset: number,\n textLeftOffset: number,\n ) {\n const textSpans: string[] = [],\n textBgRects: string[] = [];\n let height = textTopOffset,\n lineOffset;\n\n // bounding-box background\n this.backgroundColor &&\n textBgRects.push(\n ...createSVGInlineRect(\n this.backgroundColor,\n -this.width / 2,\n -this.height / 2,\n this.width,\n this.height,\n ),\n );\n\n // text and text-background\n for (let i = 0, len = this._textLines.length; i < len; i++) {\n lineOffset = this._getLineLeftOffset(i);\n if (this.direction === 'rtl') {\n lineOffset += this.width;\n }\n if (this.textBackgroundColor || this.styleHas('textBackgroundColor', i)) {\n this._setSVGTextLineBg(\n textBgRects,\n i,\n textLeftOffset + lineOffset,\n height,\n );\n }\n this._setSVGTextLineText(\n textSpans,\n i,\n textLeftOffset + lineOffset,\n height,\n );\n height += this.getHeightOfLine(i);\n }\n\n return {\n textSpans,\n textBgRects,\n };\n }\n\n private _createTextCharSpan(\n this: TextSVGExportMixin & FabricText,\n char: string,\n styleDecl: TextStyleDeclaration,\n left: number,\n top: number,\n charBox: GraphemeBBox,\n ) {\n const numFractionDigit = config.NUM_FRACTION_DIGITS;\n const styleProps = this.getSvgSpanStyles(\n styleDecl,\n char !== char.trim() || !!char.match(multipleSpacesRegex),\n ),\n fillStyles = styleProps ? `style=\"${styleProps}\"` : '',\n dy = styleDecl.deltaY,\n dySpan = dy ? ` dy=\"${toFixed(dy, numFractionDigit)}\" ` : '',\n { angle, renderLeft, renderTop, width } = charBox;\n let angleAttr = '';\n if (renderLeft !== undefined) {\n const wBy2 = width / 2;\n angle &&\n (angleAttr = ` rotate=\"${toFixed(radiansToDegrees(angle), numFractionDigit)}\"`);\n const m = createRotateMatrix({ angle: radiansToDegrees(angle!) });\n m[4] = renderLeft!;\n m[5] = renderTop!;\n const renderPoint = new Point(-wBy2, 0).transform(m);\n left = renderPoint.x;\n top = renderPoint.y;\n }\n\n return `${escapeXml(char)}`;\n }\n\n private _setSVGTextLineText(\n this: TextSVGExportMixin & FabricText,\n textSpans: string[],\n lineIndex: number,\n textLeftOffset: number,\n textTopOffset: number,\n ) {\n const lineHeight = this.getHeightOfLine(lineIndex),\n isJustify = this.textAlign.includes(JUSTIFY),\n line = this._textLines[lineIndex];\n let actualStyle,\n nextStyle,\n charsToRender = '',\n charBox,\n style,\n boxWidth = 0,\n timeToRender;\n\n textTopOffset +=\n (lineHeight * (1 - this._fontSizeFraction)) / this.lineHeight;\n for (let i = 0, len = line.length - 1; i <= len; i++) {\n timeToRender = i === len || this.charSpacing || this.path;\n charsToRender += line[i];\n charBox = this.__charBounds[lineIndex][i];\n if (boxWidth === 0) {\n textLeftOffset += charBox.kernedWidth - charBox.width;\n boxWidth += charBox.width;\n } else {\n boxWidth += charBox.kernedWidth;\n }\n if (isJustify && !timeToRender) {\n if (this._reSpaceAndTab.test(line[i])) {\n timeToRender = true;\n }\n }\n if (!timeToRender) {\n // if we have charSpacing or a path, we render char by char\n actualStyle =\n actualStyle || this.getCompleteStyleDeclaration(lineIndex, i);\n nextStyle = this.getCompleteStyleDeclaration(lineIndex, i + 1);\n timeToRender = hasStyleChanged(actualStyle, nextStyle, true);\n }\n if (timeToRender) {\n style = this._getStyleDeclaration(lineIndex, i);\n textSpans.push(\n this._createTextCharSpan(\n charsToRender,\n style,\n textLeftOffset,\n textTopOffset,\n charBox,\n ),\n );\n charsToRender = '';\n actualStyle = nextStyle;\n if (this.direction === 'rtl') {\n textLeftOffset -= boxWidth;\n } else {\n textLeftOffset += boxWidth;\n }\n boxWidth = 0;\n }\n }\n }\n\n private _setSVGTextLineBg(\n this: TextSVGExportMixin & FabricText,\n textBgRects: (string | number)[],\n i: number,\n leftOffset: number,\n textTopOffset: number,\n ) {\n const line = this._textLines[i],\n heightOfLine = this.getHeightOfLine(i) / this.lineHeight;\n let boxWidth = 0,\n boxStart = 0,\n currentColor,\n lastColor = this.getValueOfPropertyAt(i, 0, 'textBackgroundColor');\n for (let j = 0; j < line.length; j++) {\n const { left, width, kernedWidth } = this.__charBounds[i][j];\n currentColor = this.getValueOfPropertyAt(i, j, 'textBackgroundColor');\n if (currentColor !== lastColor) {\n lastColor &&\n textBgRects.push(\n ...createSVGInlineRect(\n lastColor,\n leftOffset + boxStart,\n textTopOffset,\n boxWidth,\n heightOfLine,\n ),\n );\n boxStart = left;\n boxWidth = width;\n lastColor = currentColor;\n } else {\n boxWidth += kernedWidth;\n }\n }\n currentColor &&\n textBgRects.push(\n ...createSVGInlineRect(\n lastColor,\n leftOffset + boxStart,\n textTopOffset,\n boxWidth,\n heightOfLine,\n ),\n );\n }\n\n /**\n * Returns styles-string for svg-export\n * @param {Boolean} skipShadow a boolean to skip shadow filter output\n * @return {String}\n */\n getSvgStyles(this: TextSVGExportMixin & FabricText, skipShadow?: boolean) {\n return `${super.getSvgStyles(skipShadow)} text-decoration-thickness: ${toFixed((this.textDecorationThickness * this.getObjectScaling().y) / 10, config.NUM_FRACTION_DIGITS)}%; white-space: pre;`;\n }\n\n /**\n * Returns styles-string for svg-export\n * @param {Object} style the object from which to retrieve style properties\n * @param {Boolean} useWhiteSpace a boolean to include an additional attribute in the style.\n * @return {String}\n */\n getSvgSpanStyles(\n this: TextSVGExportMixin & FabricText,\n style: TextStyleDeclaration,\n useWhiteSpace?: boolean,\n ) {\n const {\n fontFamily,\n strokeWidth,\n stroke,\n fill,\n fontSize,\n fontStyle,\n fontWeight,\n deltaY,\n textDecorationThickness,\n linethrough,\n overline,\n underline,\n } = style;\n\n const textDecoration = this.getSvgTextDecoration({\n underline: underline ?? this.underline,\n overline: overline ?? this.overline,\n linethrough: linethrough ?? this.linethrough,\n });\n const thickness = textDecorationThickness || this.textDecorationThickness;\n return [\n stroke ? colorPropToSVG(STROKE, stroke) : '',\n strokeWidth ? `stroke-width: ${strokeWidth}; ` : '',\n fontFamily\n ? `font-family: ${\n !fontFamily.includes(\"'\") && !fontFamily.includes('\"')\n ? `'${fontFamily}'`\n : fontFamily\n }; `\n : '',\n fontSize ? `font-size: ${fontSize}px; ` : '',\n fontStyle ? `font-style: ${fontStyle}; ` : '',\n fontWeight ? `font-weight: ${fontWeight}; ` : '',\n textDecoration\n ? `text-decoration: ${textDecoration}; text-decoration-thickness: ${toFixed((thickness * this.getObjectScaling().y) / 10, config.NUM_FRACTION_DIGITS)}%; `\n : '',\n fill ? colorPropToSVG(FILL, fill) : '',\n deltaY ? `baseline-shift: ${-deltaY}; ` : '',\n useWhiteSpace ? 'white-space: pre; ' : '',\n ].join('');\n }\n\n /**\n * Returns text-decoration property for svg-export\n * @param {Object} style the object from which to retrieve style properties\n * @return {String}\n */\n getSvgTextDecoration(\n this: TextSVGExportMixin & FabricText,\n style: TextStyleDeclaration,\n ) {\n return (['overline', 'underline', 'line-through'] as const)\n .filter(\n (decoration) =>\n style[\n decoration.replace('-', '') as\n | 'overline'\n | 'underline'\n | 'linethrough'\n ],\n )\n .join(' ');\n }\n}\n","import { cache } from '../../cache';\nimport { DEFAULT_SVG_FONT_SIZE, FILL, STROKE } from '../../constants';\nimport type { ObjectEvents } from '../../EventTypeDefs';\nimport type {\n CompleteTextStyleDeclaration,\n TextStyle,\n TextStyleDeclaration,\n} from './StyledText';\nimport { StyledText } from './StyledText';\nimport { SHARED_ATTRIBUTES } from '../../parser/attributes';\nimport { parseAttributes } from '../../parser/parseAttributes';\nimport type {\n Abortable,\n TCacheCanvasDimensions,\n TClassProperties,\n TFiller,\n TOptions,\n} from '../../typedefs';\nimport { classRegistry } from '../../ClassRegistry';\nimport { graphemeSplit } from '../../util/lang_string';\nimport { createCanvasElementFor } from '../../util/misc/dom';\nimport type { TextStyleArray } from '../../util/misc/textStyles';\nimport {\n hasStyleChanged,\n stylesFromArray,\n stylesToArray,\n} from '../../util/misc/textStyles';\nimport { getPathSegmentsInfo, getPointOnPath } from '../../util/path';\nimport { cacheProperties } from '../Object/FabricObject';\nimport type { Path } from '../Path';\nimport { TextSVGExportMixin } from './TextSVGExportMixin';\nimport { applyMixins } from '../../util/applyMixins';\nimport type { FabricObjectProps, SerializedObjectProps } from '../Object/types';\nimport type { StylePropertiesType } from './constants';\nimport {\n additionalProps,\n textDefaultValues,\n textLayoutProperties,\n JUSTIFY,\n JUSTIFY_CENTER,\n JUSTIFY_LEFT,\n JUSTIFY_RIGHT,\n TEXT_DECORATION_THICKNESS,\n} from './constants';\nimport { CENTER, LEFT, RIGHT, TOP, BOTTOM } from '../../constants';\nimport { isFiller } from '../../util/typeAssertions';\nimport type { Gradient } from '../../gradient/Gradient';\nimport type { Pattern } from '../../Pattern';\nimport type { CSSRules } from '../../parser/typedefs';\n\nlet measuringContext: CanvasRenderingContext2D | null;\n\n/**\n * Return a context for measurement of text string.\n * if created it gets stored for reuse\n */\nfunction getMeasuringContext() {\n if (!measuringContext) {\n const canvas = createCanvasElementFor({\n width: 0,\n height: 0,\n });\n measuringContext = canvas.getContext('2d');\n }\n return measuringContext;\n}\n\nexport type TPathSide = 'left' | 'right';\n\nexport type TPathAlign = 'baseline' | 'center' | 'ascender' | 'descender';\n\nexport type TextLinesInfo = {\n lines: string[];\n graphemeLines: string[][];\n graphemeText: string[];\n _unwrappedLines: string[][];\n};\n\n/**\n * Measure and return the info of a single grapheme.\n * needs the the info of previous graphemes already filled\n * Override to customize measuring\n */\nexport type GraphemeBBox = {\n width: number;\n height: number;\n kernedWidth: number;\n left: number;\n deltaY: number;\n renderLeft?: number;\n renderTop?: number;\n angle?: number;\n};\n\n// @TODO this is not complete\ninterface UniqueTextProps {\n charSpacing: number;\n lineHeight: number;\n fontSize: number;\n fontWeight: string | number;\n fontFamily: string;\n fontStyle: string;\n pathSide: TPathSide;\n pathAlign: TPathAlign;\n underline: boolean;\n overline: boolean;\n linethrough: boolean;\n textAlign: string;\n direction: CanvasDirection;\n path?: Path;\n textDecorationThickness: number;\n}\n\nexport interface SerializedTextProps\n extends SerializedObjectProps,\n UniqueTextProps {\n styles: TextStyleArray | TextStyle;\n}\n\nexport interface TextProps extends FabricObjectProps, UniqueTextProps {\n styles: TextStyle;\n}\n\n/**\n * Text class\n * @see {@link http://fabric5.fabricjs.com/fabric-intro-part-2#text}\n */\nexport class FabricText<\n Props extends TOptions = Partial,\n SProps extends SerializedTextProps = SerializedTextProps,\n EventSpec extends ObjectEvents = ObjectEvents,\n >\n extends StyledText\n implements UniqueTextProps\n{\n /**\n * Properties that requires a text layout recalculation when changed\n * @type string[]\n * @protected\n */\n static textLayoutProperties: string[] = textLayoutProperties;\n\n /**\n * @private\n */\n declare _reNewline: RegExp;\n\n /**\n * Use this regular expression to filter for whitespaces that is not a new line.\n * Mostly used when text is 'justify' aligned.\n * @private\n */\n declare _reSpacesAndTabs: RegExp;\n\n /**\n * Use this regular expression to filter for whitespace that is not a new line.\n * Mostly used when text is 'justify' aligned.\n * @private\n */\n declare _reSpaceAndTab: RegExp;\n\n /**\n * Use this regular expression to filter consecutive groups of non spaces.\n * Mostly used when text is 'justify' aligned.\n * @private\n */\n declare _reWords: RegExp;\n\n declare text: string;\n\n /**\n * Font size (in pixels)\n * @type Number\n */\n declare fontSize: number;\n\n /**\n * Font weight (e.g. bold, normal, 400, 600, 800)\n * @type {(Number|String)}\n */\n declare fontWeight: string | number;\n\n /**\n * Font family\n * @type String\n */\n declare fontFamily: string;\n\n /**\n * Text decoration underline.\n * @type Boolean\n */\n declare underline: boolean;\n\n /**\n * Text decoration overline.\n * @type Boolean\n */\n declare overline: boolean;\n\n /**\n * Text decoration linethrough.\n * @type Boolean\n */\n declare linethrough: boolean;\n\n /**\n * Text alignment. Possible values: \"left\", \"center\", \"right\", \"justify\",\n * \"justify-left\", \"justify-center\" or \"justify-right\".\n * @type String\n */\n declare textAlign: string;\n\n /**\n * Font style . Possible values: \"\", \"normal\", \"italic\" or \"oblique\".\n * @type String\n */\n declare fontStyle: string;\n\n /**\n * Line height\n * @type Number\n */\n declare lineHeight: number;\n\n /**\n * Superscript schema object (minimum overlap)\n */\n declare superscript: {\n /**\n * fontSize factor\n * @default 0.6\n */\n size: number;\n /**\n * baseline-shift factor (upwards)\n * @default -0.35\n */\n baseline: number;\n };\n\n /**\n * Subscript schema object (minimum overlap)\n */\n declare subscript: {\n /**\n * fontSize factor\n * @default 0.6\n */\n size: number;\n /**\n * baseline-shift factor (downwards)\n * @default 0.11\n */\n baseline: number;\n };\n\n /**\n * Background color of text lines\n * @type String\n */\n declare textBackgroundColor: string;\n\n declare styles: TextStyle;\n\n /**\n * Path that the text should follow.\n * since 4.6.0 the path will be drawn automatically.\n * if you want to make the path visible, give it a stroke and strokeWidth or fill value\n * if you want it to be hidden, assign visible = false to the path.\n * This feature is in BETA, and SVG import/export is not yet supported.\n * @type Path\n * @example\n * const textPath = new Text('Text on a path', {\n * top: 150,\n * left: 150,\n * textAlign: 'center',\n * charSpacing: -50,\n * path: new Path('M 0 0 C 50 -100 150 -100 200 0', {\n * strokeWidth: 1,\n * visible: false\n * }),\n * pathSide: 'left',\n * pathStartOffset: 0\n * });\n */\n declare path?: Path;\n\n /**\n * The text decoration tickness for underline, overline and strikethrough\n * The tickness is expressed in thousandths of fontSize ( em ).\n * The original value was 1/15 that translates to 66.6667 thousandths.\n * The choice of unit of measure is to align with charSpacing.\n * You can slim the tickness without issues, while large underline or overline may end up\n * outside the bounding box of the text. In order to fix that a bigger refactor of the code\n * is needed and is out of scope for now. If you need such large overline on the first line\n * of text or large underline on the last line of text, consider disabling caching as a\n * workaround\n * @default 66.667\n */\n declare textDecorationThickness: number;\n\n /**\n * Offset amount for text path starting position\n * Only used when text has a path\n */\n declare pathStartOffset: number;\n\n /**\n * Which side of the path the text should be drawn on.\n * Only used when text has a path\n * @type {TPathSide} 'left|right'\n */\n declare pathSide: TPathSide;\n\n /**\n * How text is aligned to the path. This property determines\n * the perpendicular position of each character relative to the path.\n * (one of \"baseline\", \"center\", \"ascender\", \"descender\")\n * This feature is in BETA, and its behavior may change\n * @type TPathAlign\n */\n declare pathAlign: TPathAlign;\n\n /**\n * @private\n */\n declare _fontSizeFraction: number;\n\n /**\n * @private\n */\n declare offsets: { underline: number; linethrough: number; overline: number };\n\n /**\n * Text Line proportion to font Size (in pixels)\n * @type Number\n */\n declare _fontSizeMult: number;\n\n /**\n * additional space between characters\n * expressed in thousands of em unit\n * @type Number\n */\n declare charSpacing: number;\n\n /**\n * Baseline shift, styles only, keep at 0 for the main text object\n * @type {Number}\n */\n declare deltaY: number;\n\n /**\n * WARNING: EXPERIMENTAL. NOT SUPPORTED YET\n * determine the direction of the text.\n * This has to be set manually together with textAlign and originX for proper\n * experience.\n * some interesting link for the future\n * https://www.w3.org/International/questions/qa-bidi-unicode-controls\n * @since 4.5.0\n * @type {CanvasDirection} 'ltr|rtl'\n */\n declare direction: CanvasDirection;\n\n /**\n * contains characters bounding boxes\n * This variable is considered to be protected.\n * But for how mixins are implemented right now, we can't leave it private\n * @protected\n */\n __charBounds: GraphemeBBox[][] = [];\n\n /**\n * use this size when measuring text. To avoid IE11 rounding errors\n * @type {Number}\n * @readonly\n * @private\n */\n declare CACHE_FONT_SIZE: number;\n\n /**\n * contains the min text width to avoid getting 0\n * @type {Number}\n */\n declare MIN_TEXT_WIDTH: number;\n\n /**\n * contains the the text of the object, divided in lines as they are displayed\n * on screen. Wrapping will divide the text independently of line breaks\n * @type {string[]}\n */\n declare textLines: string[];\n\n /**\n * same as textlines, but each line is an array of graphemes as split by splitByGrapheme\n * @type {string[]}\n */\n declare _textLines: string[][];\n\n declare _unwrappedTextLines: string[][];\n declare _text: string[];\n declare cursorWidth: number;\n declare __lineHeights: number[];\n declare __lineWidths: number[];\n declare initialized?: true;\n\n static cacheProperties = [...cacheProperties, ...additionalProps];\n\n static ownDefaults = textDefaultValues;\n\n static type = 'Text';\n\n static getDefaults(): Record {\n return { ...super.getDefaults(), ...FabricText.ownDefaults };\n }\n\n constructor(text: string, options?: Props) {\n super();\n Object.assign(this, FabricText.ownDefaults);\n this.setOptions(options);\n if (!this.styles) {\n this.styles = {};\n }\n this.text = text;\n this.initialized = true;\n if (this.path) {\n this.setPathInfo();\n }\n this.initDimensions();\n this.setCoords();\n }\n\n /**\n * If text has a path, it will add the extra information needed\n * for path and text calculations\n */\n setPathInfo() {\n const path = this.path;\n if (path) {\n path.segmentsInfo = getPathSegmentsInfo(path.path);\n }\n }\n\n /**\n * @private\n * Divides text into lines of text and lines of graphemes.\n */\n _splitText(): TextLinesInfo {\n const newLines = this._splitTextIntoLines(this.text);\n this.textLines = newLines.lines;\n this._textLines = newLines.graphemeLines;\n this._unwrappedTextLines = newLines._unwrappedLines;\n this._text = newLines.graphemeText;\n return newLines;\n }\n\n /**\n * Initialize or update text dimensions.\n * Updates this.width and this.height with the proper values.\n * Does not return dimensions.\n */\n initDimensions() {\n this._splitText();\n this._clearCache();\n this.dirty = true;\n if (this.path) {\n this.width = this.path.width;\n this.height = this.path.height;\n } else {\n this.width =\n this.calcTextWidth() || this.cursorWidth || this.MIN_TEXT_WIDTH;\n this.height = this.calcTextHeight();\n }\n if (this.textAlign.includes(JUSTIFY)) {\n // once text is measured we need to make space fatter to make justified text.\n this.enlargeSpaces();\n }\n }\n\n /**\n * Enlarge space boxes and shift the others\n */\n enlargeSpaces() {\n let diffSpace,\n currentLineWidth,\n numberOfSpaces,\n accumulatedSpace,\n line,\n charBound,\n spaces;\n for (let i = 0, len = this._textLines.length; i < len; i++) {\n if (\n this.textAlign !== JUSTIFY &&\n (i === len - 1 || this.isEndOfWrapping(i))\n ) {\n continue;\n }\n accumulatedSpace = 0;\n line = this._textLines[i];\n currentLineWidth = this.getLineWidth(i);\n if (\n currentLineWidth < this.width &&\n (spaces = this.textLines[i].match(this._reSpacesAndTabs))\n ) {\n numberOfSpaces = spaces.length;\n diffSpace = (this.width - currentLineWidth) / numberOfSpaces;\n for (let j = 0; j <= line.length; j++) {\n charBound = this.__charBounds[i][j];\n if (this._reSpaceAndTab.test(line[j])) {\n charBound.width += diffSpace;\n charBound.kernedWidth += diffSpace;\n charBound.left += accumulatedSpace;\n accumulatedSpace += diffSpace;\n } else {\n charBound.left += accumulatedSpace;\n }\n }\n }\n }\n }\n\n /**\n * Detect if the text line is ended with an hard break\n * text and itext do not have wrapping, return false\n * @return {Boolean}\n */\n isEndOfWrapping(lineIndex: number): boolean {\n return lineIndex === this._textLines.length - 1;\n }\n\n /**\n * Detect if a line has a linebreak and so we need to account for it when moving\n * and counting style.\n * It return always 1 for text and Itext. Textbox has its own implementation\n * @return Number\n */\n missingNewlineOffset(lineIndex: number, skipWrapping?: boolean): 0 | 1;\n missingNewlineOffset(_lineIndex: number): 1 {\n return 1;\n }\n\n /**\n * Returns 2d representation (lineIndex and charIndex) of cursor\n * @param {Number} selectionStart\n * @param {Boolean} [skipWrapping] consider the location for unwrapped lines. useful to manage styles.\n */\n get2DCursorLocation(selectionStart: number, skipWrapping?: boolean) {\n const lines = skipWrapping ? this._unwrappedTextLines : this._textLines;\n let i: number;\n for (i = 0; i < lines.length; i++) {\n if (selectionStart <= lines[i].length) {\n return {\n lineIndex: i,\n charIndex: selectionStart,\n };\n }\n selectionStart -=\n lines[i].length + this.missingNewlineOffset(i, skipWrapping);\n }\n return {\n lineIndex: i - 1,\n charIndex:\n lines[i - 1].length < selectionStart\n ? lines[i - 1].length\n : selectionStart,\n };\n }\n\n /**\n * Returns string representation of an instance\n * @return {String} String representation of text object\n */\n toString(): string {\n return `#`;\n }\n\n /**\n * Return the dimension and the zoom level needed to create a cache canvas\n * big enough to host the object to be cached.\n * @private\n * @param {Object} dim.x width of object to be cached\n * @param {Object} dim.y height of object to be cached\n * @return {Object}.width width of canvas\n * @return {Object}.height height of canvas\n * @return {Object}.zoomX zoomX zoom value to unscale the canvas before drawing cache\n * @return {Object}.zoomY zoomY zoom value to unscale the canvas before drawing cache\n */\n _getCacheCanvasDimensions(): TCacheCanvasDimensions {\n const dims = super._getCacheCanvasDimensions();\n const fontSize = this.fontSize;\n dims.width += fontSize * dims.zoomX;\n dims.height += fontSize * dims.zoomY;\n return dims;\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _render(ctx: CanvasRenderingContext2D) {\n const path = this.path;\n path && !path.isNotVisible() && path._render(ctx);\n this._setTextStyles(ctx);\n this._renderTextLinesBackground(ctx);\n this._renderTextDecoration(ctx, 'underline');\n this._renderText(ctx);\n this._renderTextDecoration(ctx, 'overline');\n this._renderTextDecoration(ctx, 'linethrough');\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _renderText(ctx: CanvasRenderingContext2D) {\n if (this.paintFirst === STROKE) {\n this._renderTextStroke(ctx);\n this._renderTextFill(ctx);\n } else {\n this._renderTextFill(ctx);\n this._renderTextStroke(ctx);\n }\n }\n\n /**\n * Set the font parameter of the context with the object properties or with charStyle\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n * @param {Object} [charStyle] object with font style properties\n * @param {String} [charStyle.fontFamily] Font Family\n * @param {Number} [charStyle.fontSize] Font size in pixels. ( without px suffix )\n * @param {String} [charStyle.fontWeight] Font weight\n * @param {String} [charStyle.fontStyle] Font style (italic|normal)\n */\n _setTextStyles(\n ctx: CanvasRenderingContext2D,\n charStyle?: any,\n forMeasuring?: boolean,\n ) {\n ctx.textBaseline = 'alphabetic';\n if (this.path) {\n switch (this.pathAlign) {\n case CENTER:\n ctx.textBaseline = 'middle';\n break;\n case 'ascender':\n ctx.textBaseline = TOP;\n break;\n case 'descender':\n ctx.textBaseline = BOTTOM;\n break;\n }\n }\n ctx.font = this._getFontDeclaration(charStyle, forMeasuring);\n }\n\n /**\n * calculate and return the text Width measuring each line.\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n * @return {Number} Maximum width of Text object\n */\n calcTextWidth(): number {\n let maxWidth = this.getLineWidth(0);\n\n for (let i = 1, len = this._textLines.length; i < len; i++) {\n const currentLineWidth = this.getLineWidth(i);\n if (currentLineWidth > maxWidth) {\n maxWidth = currentLineWidth;\n }\n }\n return maxWidth;\n }\n\n /**\n * @private\n * @param {String} method Method name (\"fillText\" or \"strokeText\")\n * @param {CanvasRenderingContext2D} ctx Context to render on\n * @param {String} line Text to render\n * @param {Number} left Left position of text\n * @param {Number} top Top position of text\n * @param {Number} lineIndex Index of a line in a text\n */\n _renderTextLine(\n method: 'fillText' | 'strokeText',\n ctx: CanvasRenderingContext2D,\n line: string[],\n left: number,\n top: number,\n lineIndex: number,\n ) {\n this._renderChars(method, ctx, line, left, top, lineIndex);\n }\n\n /**\n * Renders the text background for lines, taking care of style\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _renderTextLinesBackground(ctx: CanvasRenderingContext2D) {\n if (!this.textBackgroundColor && !this.styleHas('textBackgroundColor')) {\n return;\n }\n const originalFill = ctx.fillStyle,\n leftOffset = this._getLeftOffset();\n let lineTopOffset = this._getTopOffset();\n\n for (let i = 0, len = this._textLines.length; i < len; i++) {\n const heightOfLine = this.getHeightOfLine(i);\n if (\n !this.textBackgroundColor &&\n !this.styleHas('textBackgroundColor', i)\n ) {\n lineTopOffset += heightOfLine;\n continue;\n }\n const jlen = this._textLines[i].length;\n const lineLeftOffset = this._getLineLeftOffset(i);\n let boxWidth = 0;\n let boxStart = 0;\n let drawStart;\n let currentColor;\n let lastColor = this.getValueOfPropertyAt(i, 0, 'textBackgroundColor');\n for (let j = 0; j < jlen; j++) {\n // at this point charbox are either standard or full with pathInfo if there is a path.\n const charBox = this.__charBounds[i][j] as Required;\n currentColor = this.getValueOfPropertyAt(i, j, 'textBackgroundColor');\n if (this.path) {\n ctx.save();\n ctx.translate(charBox.renderLeft, charBox.renderTop);\n ctx.rotate(charBox.angle);\n ctx.fillStyle = currentColor;\n currentColor &&\n ctx.fillRect(\n -charBox.width / 2,\n (-heightOfLine / this.lineHeight) * (1 - this._fontSizeFraction),\n charBox.width,\n heightOfLine / this.lineHeight,\n );\n ctx.restore();\n } else if (currentColor !== lastColor) {\n drawStart = leftOffset + lineLeftOffset + boxStart;\n if (this.direction === 'rtl') {\n drawStart = this.width - drawStart - boxWidth;\n }\n ctx.fillStyle = lastColor;\n lastColor &&\n ctx.fillRect(\n drawStart,\n lineTopOffset,\n boxWidth,\n heightOfLine / this.lineHeight,\n );\n boxStart = charBox.left;\n boxWidth = charBox.width;\n lastColor = currentColor;\n } else {\n boxWidth += charBox.kernedWidth;\n }\n }\n if (currentColor && !this.path) {\n drawStart = leftOffset + lineLeftOffset + boxStart;\n if (this.direction === 'rtl') {\n drawStart = this.width - drawStart - boxWidth;\n }\n ctx.fillStyle = currentColor;\n ctx.fillRect(\n drawStart,\n lineTopOffset,\n boxWidth,\n heightOfLine / this.lineHeight,\n );\n }\n lineTopOffset += heightOfLine;\n }\n ctx.fillStyle = originalFill;\n // if there is text background color no\n // other shadows should be casted\n this._removeShadow(ctx);\n }\n\n /**\n * measure and return the width of a single character.\n * possibly overridden to accommodate different measure logic or\n * to hook some external lib for character measurement\n * @private\n * @param {String} _char, char to be measured\n * @param {Object} charStyle style of char to be measured\n * @param {String} [previousChar] previous char\n * @param {Object} [prevCharStyle] style of previous char\n */\n _measureChar(\n _char: string,\n charStyle: CompleteTextStyleDeclaration,\n previousChar: string | undefined,\n prevCharStyle: CompleteTextStyleDeclaration | Record,\n ) {\n const fontCache = cache.getFontCache(charStyle),\n fontDeclaration = this._getFontDeclaration(charStyle),\n couple = previousChar + _char,\n stylesAreEqual =\n previousChar &&\n fontDeclaration === this._getFontDeclaration(prevCharStyle),\n fontMultiplier = charStyle.fontSize / this.CACHE_FONT_SIZE;\n let width: number | undefined,\n coupleWidth: number | undefined,\n previousWidth: number | undefined,\n kernedWidth: number | undefined;\n\n if (previousChar && fontCache[previousChar] !== undefined) {\n previousWidth = fontCache[previousChar];\n }\n if (fontCache[_char] !== undefined) {\n kernedWidth = width = fontCache[_char];\n }\n if (stylesAreEqual && fontCache[couple] !== undefined) {\n coupleWidth = fontCache[couple];\n kernedWidth = coupleWidth - previousWidth!;\n }\n if (\n width === undefined ||\n previousWidth === undefined ||\n coupleWidth === undefined\n ) {\n const ctx = getMeasuringContext()!;\n // send a TRUE to specify measuring font size CACHE_FONT_SIZE\n this._setTextStyles(ctx, charStyle, true);\n if (width === undefined) {\n kernedWidth = width = ctx.measureText(_char).width;\n fontCache[_char] = width;\n }\n if (previousWidth === undefined && stylesAreEqual && previousChar) {\n previousWidth = ctx.measureText(previousChar).width;\n fontCache[previousChar] = previousWidth;\n }\n if (stylesAreEqual && coupleWidth === undefined) {\n // we can measure the kerning couple and subtract the width of the previous character\n coupleWidth = ctx.measureText(couple).width;\n fontCache[couple] = coupleWidth;\n // safe to use the non-null since if undefined we defined it before.\n kernedWidth = coupleWidth - previousWidth!;\n }\n }\n return {\n width: width * fontMultiplier,\n kernedWidth: kernedWidth! * fontMultiplier,\n };\n }\n\n /**\n * Computes height of character at given position\n * @param {Number} line the line index number\n * @param {Number} _char the character index number\n * @return {Number} fontSize of the character\n */\n getHeightOfChar(line: number, _char: number): number {\n return this.getValueOfPropertyAt(line, _char, 'fontSize');\n }\n\n /**\n * measure a text line measuring all characters.\n * @param {Number} lineIndex line number\n */\n measureLine(lineIndex: number) {\n const lineInfo = this._measureLine(lineIndex);\n if (this.charSpacing !== 0) {\n lineInfo.width -= this._getWidthOfCharSpacing();\n }\n if (lineInfo.width < 0) {\n lineInfo.width = 0;\n }\n return lineInfo;\n }\n\n /**\n * measure every grapheme of a line, populating __charBounds\n * @param {Number} lineIndex\n * @return {Object} object.width total width of characters\n * @return {Object} object.numOfSpaces length of chars that match this._reSpacesAndTabs\n */\n _measureLine(lineIndex: number) {\n let width = 0,\n prevGrapheme: string | undefined,\n graphemeInfo: GraphemeBBox | undefined;\n\n const reverse = this.pathSide === RIGHT,\n path = this.path,\n line = this._textLines[lineIndex],\n llength = line.length,\n lineBounds = new Array(llength);\n\n this.__charBounds[lineIndex] = lineBounds;\n for (let i = 0; i < llength; i++) {\n const grapheme = line[i];\n graphemeInfo = this._getGraphemeBox(grapheme, lineIndex, i, prevGrapheme);\n lineBounds[i] = graphemeInfo;\n width += graphemeInfo.kernedWidth;\n prevGrapheme = grapheme;\n }\n // this latest bound box represent the last character of the line\n // to simplify cursor handling in interactive mode.\n lineBounds[llength] = {\n left: graphemeInfo ? graphemeInfo.left + graphemeInfo.width : 0,\n width: 0,\n kernedWidth: 0,\n height: this.fontSize,\n deltaY: 0,\n } as GraphemeBBox;\n if (path && path.segmentsInfo) {\n let positionInPath = 0;\n const totalPathLength =\n path.segmentsInfo[path.segmentsInfo.length - 1].length;\n switch (this.textAlign) {\n case LEFT:\n positionInPath = reverse ? totalPathLength - width : 0;\n break;\n case CENTER:\n positionInPath = (totalPathLength - width) / 2;\n break;\n case RIGHT:\n positionInPath = reverse ? 0 : totalPathLength - width;\n break;\n //todo - add support for justify\n }\n positionInPath += this.pathStartOffset * (reverse ? -1 : 1);\n for (\n let i = reverse ? llength - 1 : 0;\n reverse ? i >= 0 : i < llength;\n reverse ? i-- : i++\n ) {\n graphemeInfo = lineBounds[i];\n if (positionInPath > totalPathLength) {\n positionInPath %= totalPathLength;\n } else if (positionInPath < 0) {\n positionInPath += totalPathLength;\n }\n // it would probably much faster to send all the grapheme position for a line\n // and calculate path position/angle at once.\n this._setGraphemeOnPath(positionInPath, graphemeInfo);\n positionInPath += graphemeInfo.kernedWidth;\n }\n }\n return { width: width, numOfSpaces: 0 };\n }\n\n /**\n * Calculate the angle and the left,top position of the char that follow a path.\n * It appends it to graphemeInfo to be reused later at rendering\n * @private\n * @param {Number} positionInPath to be measured\n * @param {GraphemeBBox} graphemeInfo current grapheme box information\n * @param {Object} startingPoint position of the point\n */\n _setGraphemeOnPath(positionInPath: number, graphemeInfo: GraphemeBBox) {\n const centerPosition = positionInPath + graphemeInfo.kernedWidth / 2,\n path = this.path!;\n\n // we are at currentPositionOnPath. we want to know what point on the path is.\n const info = getPointOnPath(path.path, centerPosition, path.segmentsInfo)!;\n graphemeInfo.renderLeft = info.x - path.pathOffset.x;\n graphemeInfo.renderTop = info.y - path.pathOffset.y;\n graphemeInfo.angle = info.angle + (this.pathSide === RIGHT ? Math.PI : 0);\n }\n\n /**\n *\n * @param {String} grapheme to be measured\n * @param {Number} lineIndex index of the line where the char is\n * @param {Number} charIndex position in the line\n * @param {String} [prevGrapheme] character preceding the one to be measured\n * @returns {GraphemeBBox} grapheme bbox\n */\n _getGraphemeBox(\n grapheme: string,\n lineIndex: number,\n charIndex: number,\n prevGrapheme?: string,\n skipLeft?: boolean,\n ): GraphemeBBox {\n const style = this.getCompleteStyleDeclaration(lineIndex, charIndex),\n prevStyle = prevGrapheme\n ? this.getCompleteStyleDeclaration(lineIndex, charIndex - 1)\n : {},\n info = this._measureChar(grapheme, style, prevGrapheme, prevStyle);\n let kernedWidth = info.kernedWidth,\n width = info.width,\n charSpacing;\n\n if (this.charSpacing !== 0) {\n charSpacing = this._getWidthOfCharSpacing();\n width += charSpacing;\n kernedWidth += charSpacing;\n }\n\n const box: GraphemeBBox = {\n width,\n left: 0,\n height: style.fontSize,\n kernedWidth,\n deltaY: style.deltaY,\n };\n if (charIndex > 0 && !skipLeft) {\n const previousBox = this.__charBounds[lineIndex][charIndex - 1];\n box.left =\n previousBox.left + previousBox.width + info.kernedWidth - info.width;\n }\n return box;\n }\n\n /**\n * Calculate height of line at 'lineIndex'\n * @param {Number} lineIndex index of line to calculate\n * @return {Number}\n */\n getHeightOfLine(lineIndex: number): number {\n if (this.__lineHeights[lineIndex]) {\n return this.__lineHeights[lineIndex];\n }\n\n // char 0 is measured before the line cycle because it needs to char\n // emptylines\n let maxHeight = this.getHeightOfChar(lineIndex, 0);\n for (let i = 1, len = this._textLines[lineIndex].length; i < len; i++) {\n maxHeight = Math.max(this.getHeightOfChar(lineIndex, i), maxHeight);\n }\n\n return (this.__lineHeights[lineIndex] =\n maxHeight * this.lineHeight * this._fontSizeMult);\n }\n\n /**\n * Calculate text box height\n */\n calcTextHeight() {\n let lineHeight,\n height = 0;\n for (let i = 0, len = this._textLines.length; i < len; i++) {\n lineHeight = this.getHeightOfLine(i);\n height += i === len - 1 ? lineHeight / this.lineHeight : lineHeight;\n }\n return height;\n }\n\n /**\n * @private\n * @return {Number} Left offset\n */\n _getLeftOffset(): number {\n return this.direction === 'ltr' ? -this.width / 2 : this.width / 2;\n }\n\n /**\n * @private\n * @return {Number} Top offset\n */\n _getTopOffset(): number {\n return -this.height / 2;\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n * @param {String} method Method name (\"fillText\" or \"strokeText\")\n */\n _renderTextCommon(\n ctx: CanvasRenderingContext2D,\n method: 'fillText' | 'strokeText',\n ) {\n ctx.save();\n let lineHeights = 0;\n const left = this._getLeftOffset(),\n top = this._getTopOffset();\n for (let i = 0, len = this._textLines.length; i < len; i++) {\n const heightOfLine = this.getHeightOfLine(i),\n maxHeight = heightOfLine / this.lineHeight,\n leftOffset = this._getLineLeftOffset(i);\n this._renderTextLine(\n method,\n ctx,\n this._textLines[i],\n left + leftOffset,\n top + lineHeights + maxHeight,\n i,\n );\n lineHeights += heightOfLine;\n }\n ctx.restore();\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _renderTextFill(ctx: CanvasRenderingContext2D) {\n if (!this.fill && !this.styleHas(FILL)) {\n return;\n }\n\n this._renderTextCommon(ctx, 'fillText');\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _renderTextStroke(ctx: CanvasRenderingContext2D) {\n if ((!this.stroke || this.strokeWidth === 0) && this.isEmptyStyles()) {\n return;\n }\n\n if (this.shadow && !this.shadow.affectStroke) {\n this._removeShadow(ctx);\n }\n\n ctx.save();\n this._setLineDash(ctx, this.strokeDashArray);\n ctx.beginPath();\n this._renderTextCommon(ctx, 'strokeText');\n ctx.closePath();\n ctx.restore();\n }\n\n /**\n * @private\n * @param {String} method fillText or strokeText.\n * @param {CanvasRenderingContext2D} ctx Context to render on\n * @param {Array} line Content of the line, splitted in an array by grapheme\n * @param {Number} left\n * @param {Number} top\n * @param {Number} lineIndex\n */\n _renderChars(\n method: 'fillText' | 'strokeText',\n ctx: CanvasRenderingContext2D,\n line: Array,\n left: number,\n top: number,\n lineIndex: number,\n ) {\n const lineHeight = this.getHeightOfLine(lineIndex),\n isJustify = this.textAlign.includes(JUSTIFY),\n path = this.path,\n shortCut =\n !isJustify &&\n this.charSpacing === 0 &&\n this.isEmptyStyles(lineIndex) &&\n !path,\n isLtr = this.direction === 'ltr',\n sign = this.direction === 'ltr' ? 1 : -1,\n // this was changed in the PR #7674\n // currentDirection = ctx.canvas.getAttribute('dir');\n currentDirection = ctx.direction;\n\n let actualStyle,\n nextStyle,\n charsToRender = '',\n charBox,\n boxWidth = 0,\n timeToRender,\n drawingLeft;\n\n ctx.save();\n if (currentDirection !== this.direction) {\n ctx.canvas.setAttribute('dir', isLtr ? 'ltr' : 'rtl');\n ctx.direction = isLtr ? 'ltr' : 'rtl';\n ctx.textAlign = isLtr ? LEFT : RIGHT;\n }\n top -= (lineHeight * this._fontSizeFraction) / this.lineHeight;\n if (shortCut) {\n // render all the line in one pass without checking\n // drawingLeft = isLtr ? left : left - this.getLineWidth(lineIndex);\n this._renderChar(method, ctx, lineIndex, 0, line.join(''), left, top);\n ctx.restore();\n return;\n }\n for (let i = 0, len = line.length - 1; i <= len; i++) {\n timeToRender = i === len || this.charSpacing || path;\n charsToRender += line[i];\n charBox = this.__charBounds[lineIndex][i] as Required;\n if (boxWidth === 0) {\n left += sign * (charBox.kernedWidth - charBox.width);\n boxWidth += charBox.width;\n } else {\n boxWidth += charBox.kernedWidth;\n }\n if (isJustify && !timeToRender) {\n if (this._reSpaceAndTab.test(line[i])) {\n timeToRender = true;\n }\n }\n if (!timeToRender) {\n // if we have charSpacing, we render char by char\n actualStyle =\n actualStyle || this.getCompleteStyleDeclaration(lineIndex, i);\n nextStyle = this.getCompleteStyleDeclaration(lineIndex, i + 1);\n timeToRender = hasStyleChanged(actualStyle, nextStyle, false);\n }\n if (timeToRender) {\n if (path) {\n ctx.save();\n ctx.translate(charBox.renderLeft, charBox.renderTop);\n ctx.rotate(charBox.angle);\n this._renderChar(\n method,\n ctx,\n lineIndex,\n i,\n charsToRender,\n -boxWidth / 2,\n 0,\n );\n ctx.restore();\n } else {\n drawingLeft = left;\n this._renderChar(\n method,\n ctx,\n lineIndex,\n i,\n charsToRender,\n drawingLeft,\n top,\n );\n }\n charsToRender = '';\n actualStyle = nextStyle;\n left += sign * boxWidth;\n boxWidth = 0;\n }\n }\n ctx.restore();\n }\n\n /**\n * This function try to patch the missing gradientTransform on canvas gradients.\n * transforming a context to transform the gradient, is going to transform the stroke too.\n * we want to transform the gradient but not the stroke operation, so we create\n * a transformed gradient on a pattern and then we use the pattern instead of the gradient.\n * this method has drawbacks: is slow, is in low resolution, needs a patch for when the size\n * is limited.\n * @private\n * @param {TFiller} filler a fabric gradient instance\n * @return {CanvasPattern} a pattern to use as fill/stroke style\n */\n _applyPatternGradientTransformText(filler: TFiller) {\n // TODO: verify compatibility with strokeUniform\n const width = this.width + this.strokeWidth,\n height = this.height + this.strokeWidth,\n pCanvas = createCanvasElementFor({\n width,\n height,\n }),\n pCtx = pCanvas.getContext('2d')!;\n pCanvas.width = width;\n pCanvas.height = height;\n pCtx.beginPath();\n pCtx.moveTo(0, 0);\n pCtx.lineTo(width, 0);\n pCtx.lineTo(width, height);\n pCtx.lineTo(0, height);\n pCtx.closePath();\n pCtx.translate(width / 2, height / 2);\n pCtx.fillStyle = filler.toLive(pCtx)!;\n this._applyPatternGradientTransform(pCtx, filler);\n pCtx.fill();\n return pCtx.createPattern(pCanvas, 'no-repeat')!;\n }\n\n handleFiller(\n ctx: CanvasRenderingContext2D,\n property: `${T}Style`,\n filler: TFiller | string,\n ): { offsetX: number; offsetY: number } {\n let offsetX: number, offsetY: number;\n if (isFiller(filler)) {\n if (\n (filler as Gradient<'linear'>).gradientUnits === 'percentage' ||\n (filler as Gradient<'linear'>).gradientTransform ||\n (filler as Pattern).patternTransform\n ) {\n // need to transform gradient in a pattern.\n // this is a slow process. If you are hitting this codepath, and the object\n // is not using caching, you should consider switching it on.\n // we need a canvas as big as the current object caching canvas.\n offsetX = -this.width / 2;\n offsetY = -this.height / 2;\n ctx.translate(offsetX, offsetY);\n ctx[property] = this._applyPatternGradientTransformText(filler);\n return { offsetX, offsetY };\n } else {\n // is a simple gradient or pattern\n ctx[property] = filler.toLive(ctx)!;\n return this._applyPatternGradientTransform(ctx, filler);\n }\n } else {\n // is a color\n ctx[property] = filler;\n }\n return { offsetX: 0, offsetY: 0 };\n }\n\n /**\n * This function prepare the canvas for a stroke style, and stroke and strokeWidth\n * need to be sent in as defined\n * @param {CanvasRenderingContext2D} ctx\n * @param {CompleteTextStyleDeclaration} style with stroke and strokeWidth defined\n * @returns\n */\n _setStrokeStyles(\n ctx: CanvasRenderingContext2D,\n {\n stroke,\n strokeWidth,\n }: Pick,\n ) {\n ctx.lineWidth = strokeWidth;\n ctx.lineCap = this.strokeLineCap;\n ctx.lineDashOffset = this.strokeDashOffset;\n ctx.lineJoin = this.strokeLineJoin;\n ctx.miterLimit = this.strokeMiterLimit;\n return this.handleFiller(ctx, 'strokeStyle', stroke!);\n }\n\n /**\n * This function prepare the canvas for a ill style, and fill\n * need to be sent in as defined\n * @param {CanvasRenderingContext2D} ctx\n * @param {CompleteTextStyleDeclaration} style with ill defined\n * @returns\n */\n _setFillStyles(ctx: CanvasRenderingContext2D, { fill }: Pick) {\n return this.handleFiller(ctx, 'fillStyle', fill!);\n }\n\n /**\n * @private\n * @param {String} method\n * @param {CanvasRenderingContext2D} ctx Context to render on\n * @param {Number} lineIndex\n * @param {Number} charIndex\n * @param {String} _char\n * @param {Number} left Left coordinate\n * @param {Number} top Top coordinate\n * @param {Number} lineHeight Height of the line\n */\n _renderChar(\n method: 'fillText' | 'strokeText',\n ctx: CanvasRenderingContext2D,\n lineIndex: number,\n charIndex: number,\n _char: string,\n left: number,\n top: number,\n ) {\n const decl = this._getStyleDeclaration(lineIndex, charIndex),\n fullDecl = this.getCompleteStyleDeclaration(lineIndex, charIndex),\n shouldFill = method === 'fillText' && fullDecl.fill,\n shouldStroke =\n method === 'strokeText' && fullDecl.stroke && fullDecl.strokeWidth;\n\n if (!shouldStroke && !shouldFill) {\n return;\n }\n ctx.save();\n\n ctx.font = this._getFontDeclaration(fullDecl);\n\n if (decl.textBackgroundColor) {\n this._removeShadow(ctx);\n }\n if (decl.deltaY) {\n top += decl.deltaY;\n }\n\n if (shouldFill) {\n const fillOffsets = this._setFillStyles(ctx, fullDecl);\n ctx.fillText(\n _char,\n left - fillOffsets.offsetX,\n top - fillOffsets.offsetY,\n );\n }\n\n if (shouldStroke) {\n const strokeOffsets = this._setStrokeStyles(ctx, fullDecl);\n ctx.strokeText(\n _char,\n left - strokeOffsets.offsetX,\n top - strokeOffsets.offsetY,\n );\n }\n\n ctx.restore();\n }\n\n /**\n * Turns the character into a 'superior figure' (i.e. 'superscript')\n * @param {Number} start selection start\n * @param {Number} end selection end\n */\n setSuperscript(start: number, end: number) {\n this._setScript(start, end, this.superscript);\n }\n\n /**\n * Turns the character into an 'inferior figure' (i.e. 'subscript')\n * @param {Number} start selection start\n * @param {Number} end selection end\n */\n setSubscript(start: number, end: number) {\n this._setScript(start, end, this.subscript);\n }\n\n /**\n * Applies 'schema' at given position\n * @private\n * @param {Number} start selection start\n * @param {Number} end selection end\n * @param {Number} schema\n */\n protected _setScript(\n start: number,\n end: number,\n schema: {\n size: number;\n baseline: number;\n },\n ) {\n const loc = this.get2DCursorLocation(start, true),\n fontSize = this.getValueOfPropertyAt(\n loc.lineIndex,\n loc.charIndex,\n 'fontSize',\n ),\n dy = this.getValueOfPropertyAt(loc.lineIndex, loc.charIndex, 'deltaY'),\n style = {\n fontSize: fontSize * schema.size,\n deltaY: dy + fontSize * schema.baseline,\n };\n this.setSelectionStyles(style, start, end);\n }\n\n /**\n * @private\n * @param {Number} lineIndex index text line\n * @return {Number} Line left offset\n */\n _getLineLeftOffset(lineIndex: number): number {\n const lineWidth = this.getLineWidth(lineIndex),\n lineDiff = this.width - lineWidth,\n textAlign = this.textAlign,\n direction = this.direction,\n isEndOfWrapping = this.isEndOfWrapping(lineIndex);\n let leftOffset = 0;\n if (\n textAlign === JUSTIFY ||\n (textAlign === JUSTIFY_CENTER && !isEndOfWrapping) ||\n (textAlign === JUSTIFY_RIGHT && !isEndOfWrapping) ||\n (textAlign === JUSTIFY_LEFT && !isEndOfWrapping)\n ) {\n return 0;\n }\n if (textAlign === CENTER) {\n leftOffset = lineDiff / 2;\n }\n if (textAlign === RIGHT) {\n leftOffset = lineDiff;\n }\n if (textAlign === JUSTIFY_CENTER) {\n leftOffset = lineDiff / 2;\n }\n if (textAlign === JUSTIFY_RIGHT) {\n leftOffset = lineDiff;\n }\n if (direction === 'rtl') {\n if (\n textAlign === RIGHT ||\n textAlign === JUSTIFY ||\n textAlign === JUSTIFY_RIGHT\n ) {\n leftOffset = 0;\n } else if (textAlign === LEFT || textAlign === JUSTIFY_LEFT) {\n leftOffset = -lineDiff;\n } else if (textAlign === CENTER || textAlign === JUSTIFY_CENTER) {\n leftOffset = -lineDiff / 2;\n }\n }\n return leftOffset;\n }\n\n /**\n * @private\n */\n _clearCache() {\n this._forceClearCache = false;\n this.__lineWidths = [];\n this.__lineHeights = [];\n this.__charBounds = [];\n }\n\n /**\n * Measure a single line given its index. Used to calculate the initial\n * text bounding box. The values are calculated and stored in __lineWidths cache.\n * @private\n * @param {Number} lineIndex line number\n * @return {Number} Line width\n */\n getLineWidth(lineIndex: number): number {\n if (this.__lineWidths[lineIndex] !== undefined) {\n return this.__lineWidths[lineIndex];\n }\n\n const { width } = this.measureLine(lineIndex);\n this.__lineWidths[lineIndex] = width;\n return width;\n }\n\n _getWidthOfCharSpacing() {\n if (this.charSpacing !== 0) {\n return (this.fontSize * this.charSpacing) / 1000;\n }\n return 0;\n }\n\n /**\n * Retrieves the value of property at given character position\n * @param {Number} lineIndex the line number\n * @param {Number} charIndex the character number\n * @param {String} property the property name\n * @returns the value of 'property'\n */\n getValueOfPropertyAt(\n lineIndex: number,\n charIndex: number,\n property: T,\n ): this[T] {\n const charStyle = this._getStyleDeclaration(lineIndex, charIndex);\n return (charStyle[property] ?? this[property]) as this[T];\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _renderTextDecoration(\n ctx: CanvasRenderingContext2D,\n type: 'underline' | 'linethrough' | 'overline',\n ) {\n if (!this[type] && !this.styleHas(type)) {\n return;\n }\n let topOffset = this._getTopOffset();\n const leftOffset = this._getLeftOffset(),\n path = this.path,\n charSpacing = this._getWidthOfCharSpacing(),\n offsetAligner =\n type === 'linethrough' ? 0.5 : type === 'overline' ? 1 : 0,\n offsetY = this.offsets[type];\n for (let i = 0, len = this._textLines.length; i < len; i++) {\n const heightOfLine = this.getHeightOfLine(i);\n if (!this[type] && !this.styleHas(type, i)) {\n topOffset += heightOfLine;\n continue;\n }\n const line = this._textLines[i];\n const maxHeight = heightOfLine / this.lineHeight;\n const lineLeftOffset = this._getLineLeftOffset(i);\n let boxStart = 0;\n let boxWidth = 0;\n let lastDecoration = this.getValueOfPropertyAt(i, 0, type);\n let lastFill = this.getValueOfPropertyAt(i, 0, FILL);\n let lastTickness = this.getValueOfPropertyAt(\n i,\n 0,\n TEXT_DECORATION_THICKNESS,\n );\n let currentDecoration = lastDecoration;\n let currentFill = lastFill;\n let currentTickness = lastTickness;\n const top = topOffset + maxHeight * (1 - this._fontSizeFraction);\n let size = this.getHeightOfChar(i, 0);\n let dy = this.getValueOfPropertyAt(i, 0, 'deltaY');\n for (let j = 0, jlen = line.length; j < jlen; j++) {\n const charBox = this.__charBounds[i][j] as Required;\n currentDecoration = this.getValueOfPropertyAt(i, j, type);\n currentFill = this.getValueOfPropertyAt(i, j, FILL);\n currentTickness = this.getValueOfPropertyAt(\n i,\n j,\n TEXT_DECORATION_THICKNESS,\n );\n const currentSize = this.getHeightOfChar(i, j);\n const currentDy = this.getValueOfPropertyAt(i, j, 'deltaY');\n if (path && currentDecoration && currentFill) {\n const finalTickness = (this.fontSize * currentTickness) / 1000;\n ctx.save();\n // bug? verify lastFill is a valid fill here.\n ctx.fillStyle = lastFill as string;\n ctx.translate(charBox.renderLeft, charBox.renderTop);\n ctx.rotate(charBox.angle);\n ctx.fillRect(\n -charBox.kernedWidth / 2,\n offsetY * currentSize + currentDy - offsetAligner * finalTickness,\n charBox.kernedWidth,\n finalTickness,\n );\n ctx.restore();\n } else if (\n (currentDecoration !== lastDecoration ||\n currentFill !== lastFill ||\n currentSize !== size ||\n currentTickness !== lastTickness ||\n currentDy !== dy) &&\n boxWidth > 0\n ) {\n const finalTickness = (this.fontSize * lastTickness) / 1000;\n let drawStart = leftOffset + lineLeftOffset + boxStart;\n if (this.direction === 'rtl') {\n drawStart = this.width - drawStart - boxWidth;\n }\n if (lastDecoration && lastFill && lastTickness) {\n // bug? verify lastFill is a valid fill here.\n ctx.fillStyle = lastFill as string;\n ctx.fillRect(\n drawStart,\n top + offsetY * size + dy - offsetAligner * finalTickness,\n boxWidth,\n finalTickness,\n );\n }\n boxStart = charBox.left;\n boxWidth = charBox.width;\n lastDecoration = currentDecoration;\n lastTickness = currentTickness;\n lastFill = currentFill;\n size = currentSize;\n dy = currentDy;\n } else {\n boxWidth += charBox.kernedWidth;\n }\n }\n let drawStart = leftOffset + lineLeftOffset + boxStart;\n if (this.direction === 'rtl') {\n drawStart = this.width - drawStart - boxWidth;\n }\n ctx.fillStyle = currentFill as string;\n const finalTickness = (this.fontSize * currentTickness) / 1000;\n currentDecoration &&\n currentFill &&\n currentTickness &&\n ctx.fillRect(\n drawStart,\n top + offsetY * size + dy - offsetAligner * finalTickness,\n boxWidth - charSpacing,\n finalTickness,\n );\n topOffset += heightOfLine;\n }\n // if there is text background color no\n // other shadows should be casted\n this._removeShadow(ctx);\n }\n\n /**\n * return font declaration string for canvas context\n * @param {Object} [styleObject] object\n * @returns {String} font declaration formatted for canvas context.\n */\n _getFontDeclaration(\n {\n fontFamily = this.fontFamily,\n fontStyle = this.fontStyle,\n fontWeight = this.fontWeight,\n fontSize = this.fontSize,\n }: Partial<\n Pick<\n TextStyleDeclaration,\n 'fontFamily' | 'fontStyle' | 'fontWeight' | 'fontSize'\n >\n > = {},\n forMeasuring?: boolean,\n ): string {\n const parsedFontFamily =\n fontFamily.includes(\"'\") ||\n fontFamily.includes('\"') ||\n fontFamily.includes(',') ||\n FabricText.genericFonts.includes(fontFamily.toLowerCase())\n ? fontFamily\n : `\"${fontFamily}\"`;\n return [\n fontStyle,\n fontWeight,\n `${forMeasuring ? this.CACHE_FONT_SIZE : fontSize}px`,\n parsedFontFamily,\n ].join(' ');\n }\n\n /**\n * Renders text instance on a specified context\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n render(ctx: CanvasRenderingContext2D) {\n if (!this.visible) {\n return;\n }\n if (\n this.canvas &&\n this.canvas.skipOffscreen &&\n !this.group &&\n !this.isOnScreen()\n ) {\n return;\n }\n if (this._forceClearCache) {\n this.initDimensions();\n }\n super.render(ctx);\n }\n\n /**\n * Override this method to customize grapheme splitting\n * @todo the util `graphemeSplit` needs to be injectable in some way.\n * is more comfortable to inject the correct util rather than having to override text\n * in the middle of the prototype chain\n * @param {string} value\n * @returns {string[]} array of graphemes\n */\n graphemeSplit(value: string): string[] {\n return graphemeSplit(value);\n }\n\n /**\n * Returns the text as an array of lines.\n * @param {String} text text to split\n * @returns Lines in the text\n */\n _splitTextIntoLines(text: string): TextLinesInfo {\n const lines = text.split(this._reNewline),\n newLines = new Array(lines.length),\n newLine = ['\\n'];\n let newText: string[] = [];\n for (let i = 0; i < lines.length; i++) {\n newLines[i] = this.graphemeSplit(lines[i]);\n newText = newText.concat(newLines[i], newLine);\n }\n newText.pop();\n return {\n _unwrappedLines: newLines,\n lines: lines,\n graphemeText: newText,\n graphemeLines: newLines,\n };\n }\n\n /**\n * Returns object representation of an instance\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} Object representation of an instance\n */\n toObject<\n T extends Omit, keyof SProps>,\n K extends keyof T = never,\n >(propertiesToInclude: K[] = []): Pick & SProps {\n return {\n ...super.toObject([...additionalProps, ...propertiesToInclude] as K[]),\n styles: stylesToArray(this.styles, this.text),\n ...(this.path ? { path: this.path.toObject() } : {}),\n };\n }\n\n set(key: string | any, value?: any) {\n const { textLayoutProperties } = this.constructor as typeof FabricText;\n super.set(key, value);\n let needsDims = false;\n let isAddingPath = false;\n if (typeof key === 'object') {\n for (const _key in key) {\n if (_key === 'path') {\n this.setPathInfo();\n }\n needsDims = needsDims || textLayoutProperties.includes(_key);\n isAddingPath = isAddingPath || _key === 'path';\n }\n } else {\n needsDims = textLayoutProperties.includes(key);\n isAddingPath = key === 'path';\n }\n if (isAddingPath) {\n this.setPathInfo();\n }\n if (needsDims && this.initialized) {\n this.initDimensions();\n this.setCoords();\n }\n return this;\n }\n\n /**\n * Returns complexity of an instance\n * @return {Number} complexity\n */\n complexity(): number {\n return 1;\n }\n\n /**\n * List of generic font families\n * @see https://developer.mozilla.org/en-US/docs/Web/CSS/font-family#generic-name\n */\n static genericFonts = [\n 'serif',\n 'sans-serif',\n 'monospace',\n 'cursive',\n 'fantasy',\n 'system-ui',\n 'ui-serif',\n 'ui-sans-serif',\n 'ui-monospace',\n 'ui-rounded',\n 'math',\n 'emoji',\n 'fangsong',\n ];\n\n /* _FROM_SVG_START_ */\n\n /**\n * List of attribute names to account for when parsing SVG element (used by {@link FabricText.fromElement})\n * @see: http://www.w3.org/TR/SVG/text.html#TextElement\n */\n static ATTRIBUTE_NAMES = SHARED_ATTRIBUTES.concat(\n 'x',\n 'y',\n 'dx',\n 'dy',\n 'font-family',\n 'font-style',\n 'font-weight',\n 'font-size',\n 'letter-spacing',\n 'text-decoration',\n 'text-anchor',\n );\n\n /**\n * Returns FabricText instance from an SVG element (not yet implemented)\n * @param {HTMLElement} element Element to parse\n * @param {Object} [options] Options object\n */\n static async fromElement(\n element: HTMLElement | SVGElement,\n options?: Abortable,\n cssRules?: CSSRules,\n ) {\n const parsedAttributes = parseAttributes(\n element,\n FabricText.ATTRIBUTE_NAMES,\n cssRules,\n );\n\n const {\n textAnchor = LEFT as typeof LEFT | typeof CENTER | typeof RIGHT,\n textDecoration = '',\n dx = 0,\n dy = 0,\n top = 0,\n left = 0,\n fontSize = DEFAULT_SVG_FONT_SIZE,\n strokeWidth = 1,\n ...restOfOptions\n } = { ...options, ...parsedAttributes };\n\n const textContent = (element.textContent || '')\n .replace(/^\\s+|\\s+$|\\n+/g, '')\n .replace(/\\s+/g, ' ');\n\n // this code here is probably the usual issue for SVG center find\n // this can later looked at again and probably removed.\n\n const text = new this(textContent, {\n left: left + dx,\n top: top + dy,\n underline: textDecoration.includes('underline'),\n overline: textDecoration.includes('overline'),\n linethrough: textDecoration.includes('line-through'),\n // we initialize this as 0\n strokeWidth: 0,\n fontSize,\n ...restOfOptions,\n }),\n textHeightScaleFactor = text.getScaledHeight() / text.height,\n lineHeightDiff =\n (text.height + text.strokeWidth) * text.lineHeight - text.height,\n scaledDiff = lineHeightDiff * textHeightScaleFactor,\n textHeight = text.getScaledHeight() + scaledDiff;\n\n let offX = 0;\n /*\n Adjust positioning:\n x/y attributes in SVG correspond to the bottom-left corner of text bounding box\n fabric output by default at top, left.\n */\n if (textAnchor === CENTER) {\n offX = text.getScaledWidth() / 2;\n }\n if (textAnchor === RIGHT) {\n offX = text.getScaledWidth();\n }\n text.set({\n left: text.left - offX,\n top:\n text.top -\n (textHeight - text.fontSize * (0.07 + text._fontSizeFraction)) /\n text.lineHeight,\n strokeWidth,\n });\n return text;\n }\n\n /* _FROM_SVG_END_ */\n\n /**\n * Returns FabricText instance from an object representation\n * @param {Object} object plain js Object to create an instance from\n * @returns {Promise}\n */\n static fromObject<\n T extends TOptions,\n S extends FabricText,\n >(object: T) {\n return this._fromObject(\n {\n ...object,\n styles: stylesFromArray(object.styles || {}, object.text),\n },\n {\n extraParam: 'text',\n },\n );\n }\n}\n\napplyMixins(FabricText, [TextSVGExportMixin]);\nclassRegistry.setClass(FabricText);\nclassRegistry.setSVGClass(FabricText);\n","import type {\n DragEventData,\n DropEventData,\n TPointerEvent,\n} from '../../EventTypeDefs';\nimport { Point } from '../../Point';\nimport type { IText } from './IText';\nimport { setStyle } from '../../util/internals/dom_style';\nimport { cloneStyles } from '../../util/internals/cloneStyles';\nimport type { TextStyleDeclaration } from '../Text/StyledText';\nimport { getDocumentFromElement } from '../../util/dom_misc';\nimport { CHANGED, NONE } from '../../constants';\n\n/**\n * #### Dragging IText/Textbox Lifecycle\n * - {@link start} is called from `mousedown` {@link IText#_mouseDownHandler} and determines if dragging should start by testing {@link isPointerOverSelection}\n * - if true `mousedown` {@link IText#_mouseDownHandler} is blocked to keep selection\n * - if the pointer moves, canvas fires numerous mousemove {@link Canvas#_onMouseMove} that we make sure **aren't** prevented ({@link IText#shouldStartDragging}) in order for the window to start a drag session\n * - once/if the session starts canvas calls {@link onDragStart} on the active object to determine if dragging should occur\n * - canvas fires relevant drag events that are handled by the handlers defined in this scope\n * - {@link end} is called from `mouseup` {@link IText#mouseUpHandler}, blocking IText default click behavior\n * - in case the drag session didn't occur, {@link end} handles a click, since logic to do so was blocked during `mousedown`\n */\nexport class DraggableTextDelegate {\n readonly target: IText;\n private __mouseDownInPlace = false;\n private __dragStartFired = false;\n private __isDraggingOver = false;\n private __dragStartSelection?: {\n selectionStart: number;\n selectionEnd: number;\n };\n private __dragImageDisposer?: VoidFunction;\n private _dispose?: () => void;\n\n constructor(target: IText) {\n this.target = target;\n const disposers = [\n this.target.on('dragenter', this.dragEnterHandler.bind(this)),\n this.target.on('dragover', this.dragOverHandler.bind(this)),\n this.target.on('dragleave', this.dragLeaveHandler.bind(this)),\n this.target.on('dragend', this.dragEndHandler.bind(this)),\n this.target.on('drop', this.dropHandler.bind(this)),\n ];\n this._dispose = () => {\n disposers.forEach((d) => d());\n this._dispose = undefined;\n };\n }\n\n isPointerOverSelection(e: TPointerEvent) {\n const target = this.target;\n const newSelection = target.getSelectionStartFromPointer(e);\n return (\n target.isEditing &&\n newSelection >= target.selectionStart &&\n newSelection <= target.selectionEnd &&\n target.selectionStart < target.selectionEnd\n );\n }\n\n /**\n * @public override this method to disable dragging and default to mousedown logic\n */\n start(e: TPointerEvent) {\n return (this.__mouseDownInPlace = this.isPointerOverSelection(e));\n }\n\n /**\n * @public override this method to disable dragging without discarding selection\n */\n isActive() {\n return this.__mouseDownInPlace;\n }\n\n /**\n * Ends interaction and sets cursor in case of a click\n * @returns true if was active\n */\n end(e: TPointerEvent) {\n const active = this.isActive();\n if (active && !this.__dragStartFired) {\n // mousedown has been blocked since `active` is true => cursor has not been set.\n // `__dragStartFired` is false => dragging didn't occur, pointer didn't move and is over selection.\n // meaning this is actually a click, `active` is a false positive.\n this.target.setCursorByClick(e);\n this.target.initDelayedCursor(true);\n }\n this.__mouseDownInPlace = false;\n this.__dragStartFired = false;\n this.__isDraggingOver = false;\n return active;\n }\n\n getDragStartSelection() {\n return this.__dragStartSelection;\n }\n\n /**\n * Override to customize the drag image\n * https://developer.mozilla.org/en-US/docs/Web/API/DataTransfer/setDragImage\n */\n setDragImage(\n e: DragEvent,\n {\n selectionStart,\n selectionEnd,\n }: {\n selectionStart: number;\n selectionEnd: number;\n },\n ) {\n const target = this.target;\n const canvas = target.canvas!;\n const flipFactor = new Point(target.flipX ? -1 : 1, target.flipY ? -1 : 1);\n const boundaries = target._getCursorBoundaries(selectionStart);\n const selectionPosition = new Point(\n boundaries.left + boundaries.leftOffset,\n boundaries.top + boundaries.topOffset,\n ).multiply(flipFactor);\n const pos = selectionPosition.transform(target.calcTransformMatrix());\n const pointer = canvas.getScenePoint(e);\n const diff = pointer.subtract(pos);\n const retinaScaling = target.getCanvasRetinaScaling();\n const bbox = target.getBoundingRect();\n const correction = pos.subtract(new Point(bbox.left, bbox.top));\n const vpt = canvas.viewportTransform;\n const offset = correction.add(diff).transform(vpt, true);\n // prepare instance for drag image snapshot by making all non selected text invisible\n const bgc = target.backgroundColor;\n const styles = cloneStyles(target.styles);\n target.backgroundColor = '';\n const styleOverride = {\n stroke: 'transparent',\n fill: 'transparent',\n textBackgroundColor: 'transparent',\n };\n target.setSelectionStyles(styleOverride, 0, selectionStart);\n target.setSelectionStyles(styleOverride, selectionEnd, target.text.length);\n target.dirty = true;\n const dragImage = target.toCanvasElement({\n enableRetinaScaling: canvas.enableRetinaScaling,\n viewportTransform: true,\n });\n // restore values\n target.backgroundColor = bgc;\n target.styles = styles;\n target.dirty = true;\n // position drag image offscreen\n setStyle(dragImage, {\n position: 'fixed',\n left: `${-dragImage.width}px`,\n border: NONE,\n width: `${dragImage.width / retinaScaling}px`,\n height: `${dragImage.height / retinaScaling}px`,\n });\n this.__dragImageDisposer && this.__dragImageDisposer();\n this.__dragImageDisposer = () => {\n dragImage.remove();\n };\n getDocumentFromElement(\n (e.target || this.target.hiddenTextarea)! as HTMLElement,\n ).body.appendChild(dragImage);\n e.dataTransfer?.setDragImage(dragImage, offset.x, offset.y);\n }\n\n /**\n * @returns {boolean} determines whether {@link target} should/shouldn't become a drag source\n */\n onDragStart(e: DragEvent): boolean {\n this.__dragStartFired = true;\n const target = this.target;\n const active = this.isActive();\n if (active && e.dataTransfer) {\n const selection = (this.__dragStartSelection = {\n selectionStart: target.selectionStart,\n selectionEnd: target.selectionEnd,\n });\n const value = target._text\n .slice(selection.selectionStart, selection.selectionEnd)\n .join('');\n const data = { text: target.text, value, ...selection };\n e.dataTransfer.setData('text/plain', value);\n e.dataTransfer.setData(\n 'application/fabric',\n JSON.stringify({\n value: value,\n styles: target.getSelectionStyles(\n selection.selectionStart,\n selection.selectionEnd,\n true,\n ),\n }),\n );\n e.dataTransfer.effectAllowed = 'copyMove';\n this.setDragImage(e, data);\n }\n target.abortCursorAnimation();\n return active;\n }\n\n /**\n * use {@link targetCanDrop} to respect overriding\n * @returns {boolean} determines whether {@link target} should/shouldn't become a drop target\n */\n canDrop(e: DragEvent): boolean {\n if (\n this.target.editable &&\n !this.target.getActiveControl() &&\n !e.defaultPrevented\n ) {\n if (this.isActive() && this.__dragStartSelection) {\n // drag source trying to drop over itself\n // allow dropping only outside of drag start selection\n const index = this.target.getSelectionStartFromPointer(e);\n const dragStartSelection = this.__dragStartSelection;\n return (\n index < dragStartSelection.selectionStart ||\n index > dragStartSelection.selectionEnd\n );\n }\n return true;\n }\n return false;\n }\n\n /**\n * in order to respect overriding {@link IText#canDrop} we call that instead of calling {@link canDrop} directly\n */\n protected targetCanDrop(e: DragEvent) {\n return this.target.canDrop(e);\n }\n\n dragEnterHandler({ e }: DragEventData) {\n const canDrop = this.targetCanDrop(e);\n if (!this.__isDraggingOver && canDrop) {\n this.__isDraggingOver = true;\n }\n }\n\n dragOverHandler(ev: DragEventData) {\n const { e } = ev;\n const canDrop = this.targetCanDrop(e);\n if (!this.__isDraggingOver && canDrop) {\n this.__isDraggingOver = true;\n } else if (this.__isDraggingOver && !canDrop) {\n // drop state has changed\n this.__isDraggingOver = false;\n }\n if (this.__isDraggingOver) {\n // can be dropped, inform browser\n e.preventDefault();\n // inform event subscribers\n ev.canDrop = true;\n ev.dropTarget = this.target;\n }\n }\n\n dragLeaveHandler() {\n if (this.__isDraggingOver || this.isActive()) {\n this.__isDraggingOver = false;\n }\n }\n\n /**\n * Override the `text/plain | application/fabric` types of {@link DragEvent#dataTransfer}\n * in order to change the drop value or to customize styling respectively, by listening to the `drop:before` event\n * https://developer.mozilla.org/en-US/docs/Web/API/HTML_Drag_and_Drop_API/Drag_operations#performing_a_drop\n */\n dropHandler(ev: DropEventData) {\n const { e } = ev;\n const didDrop = e.defaultPrevented;\n this.__isDraggingOver = false;\n // inform browser that the drop has been accepted\n e.preventDefault();\n let insert = e.dataTransfer?.getData('text/plain');\n if (insert && !didDrop) {\n const target = this.target;\n const canvas = target.canvas!;\n let insertAt = target.getSelectionStartFromPointer(e);\n const { styles } = (\n e.dataTransfer!.types.includes('application/fabric')\n ? JSON.parse(e.dataTransfer!.getData('application/fabric'))\n : {}\n ) as { styles: TextStyleDeclaration[] };\n const trailing = insert[Math.max(0, insert.length - 1)];\n const selectionStartOffset = 0;\n // drag and drop in same instance\n if (this.__dragStartSelection) {\n const selectionStart = this.__dragStartSelection.selectionStart;\n const selectionEnd = this.__dragStartSelection.selectionEnd;\n if (insertAt > selectionStart && insertAt <= selectionEnd) {\n insertAt = selectionStart;\n } else if (insertAt > selectionEnd) {\n insertAt -= selectionEnd - selectionStart;\n }\n target.removeChars(selectionStart, selectionEnd);\n // prevent `dragend` from handling event\n delete this.__dragStartSelection;\n }\n // remove redundant line break\n if (\n target._reNewline.test(trailing) &&\n (target._reNewline.test(target._text[insertAt]) ||\n insertAt === target._text.length)\n ) {\n insert = insert.trimEnd();\n }\n // inform subscribers\n ev.didDrop = true;\n ev.dropTarget = target;\n // finalize\n target.insertChars(insert, styles, insertAt);\n // can this part be moved in an outside event? andrea to check.\n canvas.setActiveObject(target);\n target.enterEditing(e);\n target.selectionStart = Math.min(\n insertAt + selectionStartOffset,\n target._text.length,\n );\n target.selectionEnd = Math.min(\n target.selectionStart + insert.length,\n target._text.length,\n );\n target.hiddenTextarea!.value = target.text;\n target._updateTextarea();\n target.hiddenTextarea!.focus();\n target.fire(CHANGED, {\n index: insertAt + selectionStartOffset,\n action: 'drop',\n });\n canvas.fire('text:changed', { target });\n canvas.contextTopDirty = true;\n canvas.requestRenderAll();\n }\n }\n\n /**\n * fired only on the drag source after drop (if occurred)\n * handle changes to the drag source in case of a drop on another object or a cancellation\n * https://developer.mozilla.org/en-US/docs/Web/API/HTML_Drag_and_Drop_API/Drag_operations#finishing_a_drag\n */\n dragEndHandler({ e }: DragEventData) {\n if (this.isActive() && this.__dragStartFired) {\n // once the drop event finishes we check if we need to change the drag source\n // if the drag source received the drop we bail out since the drop handler has already handled logic\n if (this.__dragStartSelection) {\n const target = this.target;\n const canvas = this.target.canvas!;\n const { selectionStart, selectionEnd } = this.__dragStartSelection;\n const dropEffect = e.dataTransfer?.dropEffect || NONE;\n if (dropEffect === NONE) {\n // pointer is back over selection\n target.selectionStart = selectionStart;\n target.selectionEnd = selectionEnd;\n target._updateTextarea();\n target.hiddenTextarea!.focus();\n } else {\n target.clearContextTop();\n if (dropEffect === 'move') {\n target.removeChars(selectionStart, selectionEnd);\n target.selectionStart = target.selectionEnd = selectionStart;\n target.hiddenTextarea &&\n (target.hiddenTextarea.value = target.text);\n target._updateTextarea();\n target.fire(CHANGED, {\n index: selectionStart,\n action: 'dragend',\n });\n canvas.fire('text:changed', { target });\n canvas.requestRenderAll();\n }\n target.exitEditing();\n }\n }\n }\n\n this.__dragImageDisposer && this.__dragImageDisposer();\n delete this.__dragImageDisposer;\n delete this.__dragStartSelection;\n this.__isDraggingOver = false;\n }\n\n dispose() {\n this._dispose && this._dispose();\n }\n}\n","import type { ObjectEvents, TPointerEvent } from '../../EventTypeDefs';\nimport { Point } from '../../Point';\nimport type { FabricObject } from '../Object/FabricObject';\nimport { FabricText } from '../Text/Text';\nimport { animate } from '../../util/animation/animate';\nimport type { TOnAnimationChangeCallback } from '../../util/animation/types';\nimport type { ValueAnimation } from '../../util/animation/ValueAnimation';\nimport type { TextStyleDeclaration } from '../Text/StyledText';\nimport type { SerializedTextProps, TextProps } from '../Text/Text';\nimport type { TOptions } from '../../typedefs';\nimport { getDocumentFromElement } from '../../util/dom_misc';\nimport { LEFT, MODIFIED, RIGHT, reNewline } from '../../constants';\nimport type { IText } from './IText';\n\n/**\n * extend this regex to support non english languages\n *\n * - ` ` Matches a SPACE character (char code 32).\n * - `\\n` Matches a LINE FEED character (char code 10).\n * - `\\.` Matches a \".\" character (char code 46).\n * - `,` Matches a \",\" character (char code 44).\n * - `;` Matches a \";\" character (char code 59).\n * - `!` Matches a \"!\" character (char code 33).\n * - `\\?` Matches a \"?\" character (char code 63).\n * - `\\-` Matches a \"-\" character (char code 45).\n */\n// eslint-disable-next-line no-useless-escape\nconst reNonWord = /[ \\n\\.,;!\\?\\-]/;\n\nexport type ITextEvents = ObjectEvents & {\n 'selection:changed': never;\n changed: never | { index: number; action: string };\n 'editing:entered': never | { e: TPointerEvent };\n 'editing:exited': never;\n};\n\nexport abstract class ITextBehavior<\n Props extends TOptions = Partial,\n SProps extends SerializedTextProps = SerializedTextProps,\n EventSpec extends ITextEvents = ITextEvents,\n> extends FabricText {\n declare abstract isEditing: boolean;\n declare abstract cursorDelay: number;\n declare abstract selectionStart: number;\n declare abstract selectionEnd: number;\n declare abstract cursorDuration: number;\n declare abstract editable: boolean;\n declare abstract editingBorderColor: string;\n\n declare abstract compositionStart: number;\n declare abstract compositionEnd: number;\n\n declare abstract hiddenTextarea: HTMLTextAreaElement | null;\n\n /**\n * Helps determining when the text is in composition, so that the cursor\n * rendering is altered.\n */\n declare protected inCompositionMode: boolean;\n\n declare protected _reSpace: RegExp;\n declare private _currentTickState?: ValueAnimation;\n declare private _currentTickCompleteState?: ValueAnimation;\n protected _currentCursorOpacity = 1;\n declare private _textBeforeEdit: string;\n declare protected __selectionStartOnMouseDown: number;\n\n /**\n * Keeps track if the IText object was selected before the actual click.\n * This because we want to delay enter editing by a click.\n */\n declare protected selected: boolean;\n declare protected cursorOffsetCache: { left?: number; top?: number };\n declare protected _savedProps?: {\n hasControls: boolean;\n borderColor: string;\n lockMovementX: boolean;\n lockMovementY: boolean;\n selectable: boolean;\n hoverCursor: CSSStyleDeclaration['cursor'] | null;\n defaultCursor?: CSSStyleDeclaration['cursor'];\n moveCursor?: CSSStyleDeclaration['cursor'];\n };\n declare protected _selectionDirection: 'left' | 'right' | null;\n\n abstract initHiddenTextarea(): void;\n abstract _fireSelectionChanged(): void;\n abstract renderCursorOrSelection(): void;\n abstract getSelectionStartFromPointer(e: TPointerEvent): number;\n abstract _getCursorBoundaries(\n index: number,\n skipCaching?: boolean,\n ): {\n left: number;\n top: number;\n leftOffset: number;\n topOffset: number;\n };\n\n /**\n * Initializes all the interactive behavior of IText\n */\n initBehavior() {\n this._tick = this._tick.bind(this);\n this._onTickComplete = this._onTickComplete.bind(this);\n this.updateSelectionOnMouseMove =\n this.updateSelectionOnMouseMove.bind(this);\n }\n\n onDeselect(options?: { e?: TPointerEvent; object?: FabricObject }) {\n this.isEditing && this.exitEditing();\n this.selected = false;\n return super.onDeselect(options);\n }\n\n /**\n * @private\n */\n _animateCursor({\n toValue,\n duration,\n delay,\n onComplete,\n }: {\n toValue: number;\n duration: number;\n delay?: number;\n onComplete?: TOnAnimationChangeCallback;\n }) {\n return animate({\n startValue: this._currentCursorOpacity,\n endValue: toValue,\n duration,\n delay,\n onComplete,\n abort: () =>\n !this.canvas ||\n // we do not want to animate a selection, only cursor\n this.selectionStart !== this.selectionEnd,\n onChange: (value) => {\n this._currentCursorOpacity = value;\n this.renderCursorOrSelection();\n },\n });\n }\n\n /**\n * changes the cursor from visible to invisible\n */\n private _tick(delay?: number) {\n this._currentTickState = this._animateCursor({\n toValue: 0,\n duration: this.cursorDuration / 2,\n delay: Math.max(delay || 0, 100),\n onComplete: this._onTickComplete,\n });\n }\n\n /**\n * Changes the cursor from invisible to visible\n */\n private _onTickComplete() {\n this._currentTickCompleteState?.abort();\n this._currentTickCompleteState = this._animateCursor({\n toValue: 1,\n duration: this.cursorDuration,\n onComplete: this._tick,\n });\n }\n\n /**\n * Initializes delayed cursor\n */\n initDelayedCursor(restart?: boolean) {\n this.abortCursorAnimation();\n this._tick(restart ? 0 : this.cursorDelay);\n }\n\n /**\n * Aborts cursor animation, clears all timeouts and clear textarea context if necessary\n */\n abortCursorAnimation() {\n let shouldClear = false;\n [this._currentTickState, this._currentTickCompleteState].forEach(\n (cursorAnimation) => {\n if (cursorAnimation && !cursorAnimation.isDone()) {\n shouldClear = true;\n cursorAnimation.abort();\n }\n },\n );\n\n this._currentCursorOpacity = 1;\n\n // make sure we clear context even if instance is not editing\n if (shouldClear) {\n this.clearContextTop();\n }\n }\n\n /**\n * Restart tue cursor animation if either is in complete state ( between animations )\n * or if it never started before\n */\n restartCursorIfNeeded() {\n if (\n [this._currentTickState, this._currentTickCompleteState].some(\n (cursorAnimation) => !cursorAnimation || cursorAnimation.isDone(),\n )\n ) {\n this.initDelayedCursor();\n }\n }\n\n /**\n * Selects entire text\n */\n selectAll() {\n this.selectionStart = 0;\n this.selectionEnd = this._text.length;\n this._fireSelectionChanged();\n this._updateTextarea();\n return this;\n }\n\n /**\n * Selects entire text and updates the visual state\n */\n cmdAll() {\n this.selectAll();\n this.renderCursorOrSelection();\n }\n\n /**\n * Returns selected text\n * @return {String}\n */\n getSelectedText(): string {\n return this._text.slice(this.selectionStart, this.selectionEnd).join('');\n }\n\n /**\n * Find new selection index representing start of current word according to current selection index\n * @param {Number} startFrom Current selection index\n * @return {Number} New selection index\n */\n findWordBoundaryLeft(startFrom: number): number {\n let offset = 0,\n index = startFrom - 1;\n\n // remove space before cursor first\n if (this._reSpace.test(this._text[index])) {\n while (this._reSpace.test(this._text[index])) {\n offset++;\n index--;\n }\n }\n while (/\\S/.test(this._text[index]) && index > -1) {\n offset++;\n index--;\n }\n\n return startFrom - offset;\n }\n\n /**\n * Find new selection index representing end of current word according to current selection index\n * @param {Number} startFrom Current selection index\n * @return {Number} New selection index\n */\n findWordBoundaryRight(startFrom: number): number {\n let offset = 0,\n index = startFrom;\n\n // remove space after cursor first\n if (this._reSpace.test(this._text[index])) {\n while (this._reSpace.test(this._text[index])) {\n offset++;\n index++;\n }\n }\n while (/\\S/.test(this._text[index]) && index < this._text.length) {\n offset++;\n index++;\n }\n\n return startFrom + offset;\n }\n\n /**\n * Find new selection index representing start of current line according to current selection index\n * @param {Number} startFrom Current selection index\n * @return {Number} New selection index\n */\n findLineBoundaryLeft(startFrom: number): number {\n let offset = 0,\n index = startFrom - 1;\n\n while (!/\\n/.test(this._text[index]) && index > -1) {\n offset++;\n index--;\n }\n\n return startFrom - offset;\n }\n\n /**\n * Find new selection index representing end of current line according to current selection index\n * @param {Number} startFrom Current selection index\n * @return {Number} New selection index\n */\n findLineBoundaryRight(startFrom: number): number {\n let offset = 0,\n index = startFrom;\n\n while (!/\\n/.test(this._text[index]) && index < this._text.length) {\n offset++;\n index++;\n }\n\n return startFrom + offset;\n }\n\n /**\n * Finds index corresponding to beginning or end of a word\n * @param {Number} selectionStart Index of a character\n * @param {Number} direction 1 or -1\n * @return {Number} Index of the beginning or end of a word\n */\n searchWordBoundary(selectionStart: number, direction: 1 | -1): number {\n const text = this._text;\n // if we land on a space we move the cursor backwards\n // if we are searching boundary end we move the cursor backwards ONLY if we don't land on a line break\n let index =\n selectionStart > 0 &&\n this._reSpace.test(text[selectionStart]) &&\n (direction === -1 || !reNewline.test(text[selectionStart - 1]))\n ? selectionStart - 1\n : selectionStart,\n _char = text[index];\n while (index > 0 && index < text.length && !reNonWord.test(_char)) {\n index += direction;\n _char = text[index];\n }\n if (direction === -1 && reNonWord.test(_char)) {\n index++;\n }\n return index;\n }\n\n /**\n * Selects the word that contains the char at index selectionStart\n * @param {Number} selectionStart Index of a character\n */\n selectWord(selectionStart?: number) {\n selectionStart = selectionStart ?? this.selectionStart;\n // search backwards\n const newSelectionStart = this.searchWordBoundary(selectionStart, -1),\n // search forward\n newSelectionEnd = Math.max(\n newSelectionStart,\n this.searchWordBoundary(selectionStart, 1),\n );\n\n this.selectionStart = newSelectionStart;\n this.selectionEnd = newSelectionEnd;\n this._fireSelectionChanged();\n this._updateTextarea();\n // remove next major, for now it renders twice :(\n this.renderCursorOrSelection();\n }\n\n /**\n * Selects the line that contains selectionStart\n * @param {Number} selectionStart Index of a character\n */\n selectLine(selectionStart?: number) {\n selectionStart = selectionStart ?? this.selectionStart;\n const newSelectionStart = this.findLineBoundaryLeft(selectionStart),\n newSelectionEnd = this.findLineBoundaryRight(selectionStart);\n\n this.selectionStart = newSelectionStart;\n this.selectionEnd = newSelectionEnd;\n this._fireSelectionChanged();\n this._updateTextarea();\n }\n\n /**\n * Enters editing state\n */\n enterEditing(e?: TPointerEvent) {\n if (this.isEditing || !this.editable) {\n return;\n }\n this.enterEditingImpl();\n this.fire('editing:entered', e ? { e } : undefined);\n this._fireSelectionChanged();\n if (this.canvas) {\n this.canvas.fire('text:editing:entered', {\n target: this as unknown as IText,\n e,\n });\n this.canvas.requestRenderAll();\n }\n }\n\n /**\n * runs the actual logic that enter from editing state, see {@link enterEditing}\n */\n enterEditingImpl() {\n if (this.canvas) {\n this.canvas.calcOffset();\n this.canvas.textEditingManager.exitTextEditing();\n }\n\n this.isEditing = true;\n\n this.initHiddenTextarea();\n this.hiddenTextarea!.focus();\n this.hiddenTextarea!.value = this.text;\n this._updateTextarea();\n this._saveEditingProps();\n this._setEditingProps();\n this._textBeforeEdit = this.text;\n\n this._tick();\n }\n\n /**\n * called by {@link Canvas#textEditingManager}\n */\n updateSelectionOnMouseMove(e: TPointerEvent) {\n if (this.getActiveControl()) {\n return;\n }\n\n const el = this.hiddenTextarea!;\n // regain focus\n getDocumentFromElement(el).activeElement !== el && el.focus();\n\n const newSelectionStart = this.getSelectionStartFromPointer(e),\n currentStart = this.selectionStart,\n currentEnd = this.selectionEnd;\n if (\n (newSelectionStart !== this.__selectionStartOnMouseDown ||\n currentStart === currentEnd) &&\n (currentStart === newSelectionStart || currentEnd === newSelectionStart)\n ) {\n return;\n }\n if (newSelectionStart > this.__selectionStartOnMouseDown) {\n this.selectionStart = this.__selectionStartOnMouseDown;\n this.selectionEnd = newSelectionStart;\n } else {\n this.selectionStart = newSelectionStart;\n this.selectionEnd = this.__selectionStartOnMouseDown;\n }\n if (\n this.selectionStart !== currentStart ||\n this.selectionEnd !== currentEnd\n ) {\n this._fireSelectionChanged();\n this._updateTextarea();\n this.renderCursorOrSelection();\n }\n }\n\n /**\n * @private\n */\n _setEditingProps() {\n this.hoverCursor = 'text';\n\n if (this.canvas) {\n this.canvas.defaultCursor = this.canvas.moveCursor = 'text';\n }\n\n this.borderColor = this.editingBorderColor;\n this.hasControls = this.selectable = false;\n this.lockMovementX = this.lockMovementY = true;\n }\n\n /**\n * convert from textarea to grapheme indexes\n */\n fromStringToGraphemeSelection(start: number, end: number, text: string) {\n const smallerTextStart = text.slice(0, start),\n graphemeStart = this.graphemeSplit(smallerTextStart).length;\n if (start === end) {\n return { selectionStart: graphemeStart, selectionEnd: graphemeStart };\n }\n const smallerTextEnd = text.slice(start, end),\n graphemeEnd = this.graphemeSplit(smallerTextEnd).length;\n return {\n selectionStart: graphemeStart,\n selectionEnd: graphemeStart + graphemeEnd,\n };\n }\n\n /**\n * convert from fabric to textarea values\n */\n fromGraphemeToStringSelection(\n start: number,\n end: number,\n graphemes: string[],\n ) {\n const smallerTextStart = graphemes.slice(0, start),\n graphemeStart = smallerTextStart.join('').length;\n if (start === end) {\n return { selectionStart: graphemeStart, selectionEnd: graphemeStart };\n }\n const smallerTextEnd = graphemes.slice(start, end),\n graphemeEnd = smallerTextEnd.join('').length;\n return {\n selectionStart: graphemeStart,\n selectionEnd: graphemeStart + graphemeEnd,\n };\n }\n\n /**\n * @private\n */\n _updateTextarea() {\n this.cursorOffsetCache = {};\n if (!this.hiddenTextarea) {\n return;\n }\n if (!this.inCompositionMode) {\n const newSelection = this.fromGraphemeToStringSelection(\n this.selectionStart,\n this.selectionEnd,\n this._text,\n );\n this.hiddenTextarea.selectionStart = newSelection.selectionStart;\n this.hiddenTextarea.selectionEnd = newSelection.selectionEnd;\n }\n this.updateTextareaPosition();\n }\n\n /**\n * @private\n */\n updateFromTextArea() {\n if (!this.hiddenTextarea) {\n return;\n }\n this.cursorOffsetCache = {};\n const textarea = this.hiddenTextarea;\n this.text = textarea.value;\n this.set('dirty', true);\n this.initDimensions();\n this.setCoords();\n const newSelection = this.fromStringToGraphemeSelection(\n textarea.selectionStart,\n textarea.selectionEnd,\n textarea.value,\n );\n this.selectionEnd = this.selectionStart = newSelection.selectionEnd;\n if (!this.inCompositionMode) {\n this.selectionStart = newSelection.selectionStart;\n }\n this.updateTextareaPosition();\n }\n\n /**\n * @private\n */\n updateTextareaPosition() {\n if (this.selectionStart === this.selectionEnd) {\n const style = this._calcTextareaPosition();\n this.hiddenTextarea!.style.left = style.left;\n this.hiddenTextarea!.style.top = style.top;\n }\n }\n\n /**\n * @private\n * @return {Object} style contains style for hiddenTextarea\n */\n _calcTextareaPosition() {\n if (!this.canvas) {\n return { left: '1px', top: '1px' };\n }\n const desiredPosition = this.inCompositionMode\n ? this.compositionStart\n : this.selectionStart,\n boundaries = this._getCursorBoundaries(desiredPosition),\n cursorLocation = this.get2DCursorLocation(desiredPosition),\n lineIndex = cursorLocation.lineIndex,\n charIndex = cursorLocation.charIndex,\n charHeight =\n this.getValueOfPropertyAt(lineIndex, charIndex, 'fontSize') *\n this.lineHeight,\n leftOffset = boundaries.leftOffset,\n retinaScaling = this.getCanvasRetinaScaling(),\n upperCanvas = this.canvas.upperCanvasEl,\n upperCanvasWidth = upperCanvas.width / retinaScaling,\n upperCanvasHeight = upperCanvas.height / retinaScaling,\n maxWidth = upperCanvasWidth - charHeight,\n maxHeight = upperCanvasHeight - charHeight;\n\n const p = new Point(\n boundaries.left + leftOffset,\n boundaries.top + boundaries.topOffset + charHeight,\n )\n .transform(this.calcTransformMatrix())\n .transform(this.canvas.viewportTransform)\n .multiply(\n new Point(\n upperCanvas.clientWidth / upperCanvasWidth,\n upperCanvas.clientHeight / upperCanvasHeight,\n ),\n );\n\n if (p.x < 0) {\n p.x = 0;\n }\n if (p.x > maxWidth) {\n p.x = maxWidth;\n }\n if (p.y < 0) {\n p.y = 0;\n }\n if (p.y > maxHeight) {\n p.y = maxHeight;\n }\n\n // add canvas offset on document\n p.x += this.canvas._offset.left;\n p.y += this.canvas._offset.top;\n\n return {\n left: `${p.x}px`,\n top: `${p.y}px`,\n fontSize: `${charHeight}px`,\n charHeight: charHeight,\n };\n }\n\n /**\n * @private\n */\n _saveEditingProps() {\n this._savedProps = {\n hasControls: this.hasControls,\n borderColor: this.borderColor,\n lockMovementX: this.lockMovementX,\n lockMovementY: this.lockMovementY,\n hoverCursor: this.hoverCursor,\n selectable: this.selectable,\n defaultCursor: this.canvas && this.canvas.defaultCursor,\n moveCursor: this.canvas && this.canvas.moveCursor,\n };\n }\n\n /**\n * @private\n */\n _restoreEditingProps() {\n if (!this._savedProps) {\n return;\n }\n\n this.hoverCursor = this._savedProps.hoverCursor;\n this.hasControls = this._savedProps.hasControls;\n this.borderColor = this._savedProps.borderColor;\n this.selectable = this._savedProps.selectable;\n this.lockMovementX = this._savedProps.lockMovementX;\n this.lockMovementY = this._savedProps.lockMovementY;\n\n if (this.canvas) {\n this.canvas.defaultCursor =\n this._savedProps.defaultCursor || this.canvas.defaultCursor;\n this.canvas.moveCursor =\n this._savedProps.moveCursor || this.canvas.moveCursor;\n }\n\n delete this._savedProps;\n }\n\n /**\n * runs the actual logic that exits from editing state, see {@link exitEditing}\n * But it does not fire events\n */\n exitEditingImpl() {\n const hiddenTextarea = this.hiddenTextarea;\n this.selected = false;\n this.isEditing = false;\n\n if (hiddenTextarea) {\n hiddenTextarea.blur && hiddenTextarea.blur();\n hiddenTextarea.parentNode &&\n hiddenTextarea.parentNode.removeChild(hiddenTextarea);\n }\n this.hiddenTextarea = null;\n this.abortCursorAnimation();\n this.selectionStart !== this.selectionEnd && this.clearContextTop();\n this.selectionEnd = this.selectionStart;\n this._restoreEditingProps();\n if (this._forceClearCache) {\n this.initDimensions();\n this.setCoords();\n }\n }\n\n /**\n * Exits from editing state and fires relevant events\n */\n exitEditing() {\n const isTextChanged = this._textBeforeEdit !== this.text;\n this.exitEditingImpl();\n\n this.fire('editing:exited');\n isTextChanged && this.fire(MODIFIED);\n if (this.canvas) {\n this.canvas.fire('text:editing:exited', {\n target: this as unknown as IText,\n });\n // todo: evaluate add an action to this event\n isTextChanged && this.canvas.fire('object:modified', { target: this });\n }\n return this;\n }\n\n /**\n * @private\n */\n _removeExtraneousStyles() {\n for (const prop in this.styles) {\n if (!this._textLines[prop as unknown as number]) {\n delete this.styles[prop];\n }\n }\n }\n\n /**\n * remove and reflow a style block from start to end.\n * @param {Number} start linear start position for removal (included in removal)\n * @param {Number} end linear end position for removal ( excluded from removal )\n */\n removeStyleFromTo(start: number, end: number) {\n const { lineIndex: lineStart, charIndex: charStart } =\n this.get2DCursorLocation(start, true),\n { lineIndex: lineEnd, charIndex: charEnd } = this.get2DCursorLocation(\n end,\n true,\n );\n if (lineStart !== lineEnd) {\n // step1 remove the trailing of lineStart\n if (this.styles[lineStart]) {\n for (\n let i = charStart;\n i < this._unwrappedTextLines[lineStart].length;\n i++\n ) {\n delete this.styles[lineStart][i];\n }\n }\n // step2 move the trailing of lineEnd to lineStart if needed\n if (this.styles[lineEnd]) {\n for (\n let i = charEnd;\n i < this._unwrappedTextLines[lineEnd].length;\n i++\n ) {\n const styleObj = this.styles[lineEnd][i];\n if (styleObj) {\n this.styles[lineStart] || (this.styles[lineStart] = {});\n this.styles[lineStart][charStart + i - charEnd] = styleObj;\n }\n }\n }\n // step3 detects lines will be completely removed.\n for (let i = lineStart + 1; i <= lineEnd; i++) {\n delete this.styles[i];\n }\n // step4 shift remaining lines.\n this.shiftLineStyles(lineEnd, lineStart - lineEnd);\n } else {\n // remove and shift left on the same line\n if (this.styles[lineStart]) {\n const styleObj = this.styles[lineStart];\n const diff = charEnd - charStart;\n for (let i = charStart; i < charEnd; i++) {\n delete styleObj[i];\n }\n for (const char in this.styles[lineStart]) {\n const numericChar = parseInt(char, 10);\n if (numericChar >= charEnd) {\n styleObj[numericChar - diff] = styleObj[char];\n delete styleObj[char];\n }\n }\n }\n }\n }\n\n /**\n * Shifts line styles up or down\n * @param {Number} lineIndex Index of a line\n * @param {Number} offset Can any number?\n */\n shiftLineStyles(lineIndex: number, offset: number) {\n const clonedStyles = Object.assign({}, this.styles);\n for (const line in this.styles) {\n const numericLine = parseInt(line, 10);\n if (numericLine > lineIndex) {\n this.styles[numericLine + offset] = clonedStyles[numericLine];\n if (!clonedStyles[numericLine - offset]) {\n delete this.styles[numericLine];\n }\n }\n }\n }\n\n /**\n * Handle insertion of more consecutive style lines for when one or more\n * newlines gets added to the text. Since current style needs to be shifted\n * first we shift the current style of the number lines needed, then we add\n * new lines from the last to the first.\n * @param {Number} lineIndex Index of a line\n * @param {Number} charIndex Index of a char\n * @param {Number} qty number of lines to add\n * @param {Array} copiedStyle Array of objects styles\n */\n insertNewlineStyleObject(\n lineIndex: number,\n charIndex: number,\n qty: number,\n copiedStyle?: { [index: number]: TextStyleDeclaration },\n ) {\n const newLineStyles: { [index: number]: TextStyleDeclaration } = {};\n const originalLineLength = this._unwrappedTextLines[lineIndex].length;\n const isEndOfLine = originalLineLength === charIndex;\n\n let someStyleIsCarryingOver = false;\n qty || (qty = 1);\n this.shiftLineStyles(lineIndex, qty);\n const currentCharStyle = this.styles[lineIndex]\n ? this.styles[lineIndex][charIndex === 0 ? charIndex : charIndex - 1]\n : undefined;\n\n // we clone styles of all chars\n // after cursor onto the current line\n for (const index in this.styles[lineIndex]) {\n const numIndex = parseInt(index, 10);\n if (numIndex >= charIndex) {\n someStyleIsCarryingOver = true;\n newLineStyles[numIndex - charIndex] = this.styles[lineIndex][index];\n // remove lines from the previous line since they're on a new line now\n if (!(isEndOfLine && charIndex === 0)) {\n delete this.styles[lineIndex][index];\n }\n }\n }\n let styleCarriedOver = false;\n if (someStyleIsCarryingOver && !isEndOfLine) {\n // if is end of line, the extra style we copied\n // is probably not something we want\n this.styles[lineIndex + qty] = newLineStyles;\n styleCarriedOver = true;\n }\n if (styleCarriedOver || originalLineLength > charIndex) {\n // skip the last line of since we already prepared it.\n // or contains text without style that we don't want to style\n // just because it changed lines\n qty--;\n }\n // for the all the lines or all the other lines\n // we clone current char style onto the next (otherwise empty) line\n while (qty > 0) {\n if (copiedStyle && copiedStyle[qty - 1]) {\n this.styles[lineIndex + qty] = {\n 0: { ...copiedStyle[qty - 1] },\n };\n } else if (currentCharStyle) {\n this.styles[lineIndex + qty] = {\n 0: { ...currentCharStyle },\n };\n } else {\n delete this.styles[lineIndex + qty];\n }\n qty--;\n }\n this._forceClearCache = true;\n }\n\n /**\n * Inserts style object for a given line/char index\n * @param {Number} lineIndex Index of a line\n * @param {Number} charIndex Index of a char\n * @param {Number} quantity number Style object to insert, if given\n * @param {Array} copiedStyle array of style objects\n */\n insertCharStyleObject(\n lineIndex: number,\n charIndex: number,\n quantity: number,\n copiedStyle?: TextStyleDeclaration[],\n ) {\n if (!this.styles) {\n this.styles = {};\n }\n const currentLineStyles = this.styles[lineIndex],\n currentLineStylesCloned = currentLineStyles\n ? { ...currentLineStyles }\n : {};\n\n quantity || (quantity = 1);\n // shift all char styles by quantity forward\n // 0,1,2,3 -> (charIndex=2) -> 0,1,3,4 -> (insert 2) -> 0,1,2,3,4\n for (const index in currentLineStylesCloned) {\n const numericIndex = parseInt(index, 10);\n if (numericIndex >= charIndex) {\n currentLineStyles[numericIndex + quantity] =\n currentLineStylesCloned[numericIndex];\n // only delete the style if there was nothing moved there\n if (!currentLineStylesCloned[numericIndex - quantity]) {\n delete currentLineStyles[numericIndex];\n }\n }\n }\n this._forceClearCache = true;\n if (copiedStyle) {\n while (quantity--) {\n if (!Object.keys(copiedStyle[quantity]).length) {\n continue;\n }\n if (!this.styles[lineIndex]) {\n this.styles[lineIndex] = {};\n }\n this.styles[lineIndex][charIndex + quantity] = {\n ...copiedStyle[quantity],\n };\n }\n return;\n }\n if (!currentLineStyles) {\n return;\n }\n const newStyle = currentLineStyles[charIndex ? charIndex - 1 : 1];\n while (newStyle && quantity--) {\n this.styles[lineIndex][charIndex + quantity] = { ...newStyle };\n }\n }\n\n /**\n * Inserts style object(s)\n * @param {Array} insertedText Characters at the location where style is inserted\n * @param {Number} start cursor index for inserting style\n * @param {Array} [copiedStyle] array of style objects to insert.\n */\n insertNewStyleBlock(\n insertedText: string[],\n start: number,\n copiedStyle?: TextStyleDeclaration[],\n ) {\n const cursorLoc = this.get2DCursorLocation(start, true),\n addedLines = [0];\n let linesLength = 0;\n // get an array of how many char per lines are being added.\n for (let i = 0; i < insertedText.length; i++) {\n if (insertedText[i] === '\\n') {\n linesLength++;\n addedLines[linesLength] = 0;\n } else {\n addedLines[linesLength]++;\n }\n }\n // for the first line copy the style from the current char position.\n if (addedLines[0] > 0) {\n this.insertCharStyleObject(\n cursorLoc.lineIndex,\n cursorLoc.charIndex,\n addedLines[0],\n copiedStyle,\n );\n copiedStyle = copiedStyle && copiedStyle.slice(addedLines[0] + 1);\n }\n linesLength &&\n this.insertNewlineStyleObject(\n cursorLoc.lineIndex,\n cursorLoc.charIndex + addedLines[0],\n linesLength,\n );\n let i;\n for (i = 1; i < linesLength; i++) {\n if (addedLines[i] > 0) {\n this.insertCharStyleObject(\n cursorLoc.lineIndex + i,\n 0,\n addedLines[i],\n copiedStyle,\n );\n } else if (copiedStyle) {\n // this test is required in order to close #6841\n // when a pasted buffer begins with a newline then\n // this.styles[cursorLoc.lineIndex + i] and copiedStyle[0]\n // may be undefined for some reason\n if (this.styles[cursorLoc.lineIndex + i] && copiedStyle[0]) {\n this.styles[cursorLoc.lineIndex + i][0] = copiedStyle[0];\n }\n }\n copiedStyle = copiedStyle && copiedStyle.slice(addedLines[i] + 1);\n }\n if (addedLines[i] > 0) {\n this.insertCharStyleObject(\n cursorLoc.lineIndex + i,\n 0,\n addedLines[i],\n copiedStyle,\n );\n }\n }\n\n /**\n * Removes characters from start/end\n * start/end ar per grapheme position in _text array.\n *\n * @param {Number} start\n * @param {Number} end default to start + 1\n */\n removeChars(start: number, end: number = start + 1) {\n this.removeStyleFromTo(start, end);\n this._text.splice(start, end - start);\n this.text = this._text.join('');\n this.set('dirty', true);\n this.initDimensions();\n this.setCoords();\n this._removeExtraneousStyles();\n }\n\n /**\n * insert characters at start position, before start position.\n * start equal 1 it means the text get inserted between actual grapheme 0 and 1\n * if style array is provided, it must be as the same length of text in graphemes\n * if end is provided and is bigger than start, old text is replaced.\n * start/end ar per grapheme position in _text array.\n *\n * @param {String} text text to insert\n * @param {Array} style array of style objects\n * @param {Number} start\n * @param {Number} end default to start + 1\n */\n insertChars(\n text: string,\n style: TextStyleDeclaration[] | undefined,\n start: number,\n end: number = start,\n ) {\n if (end > start) {\n this.removeStyleFromTo(start, end);\n }\n const graphemes = this.graphemeSplit(text);\n this.insertNewStyleBlock(graphemes, start, style);\n this._text = [\n ...this._text.slice(0, start),\n ...graphemes,\n ...this._text.slice(end),\n ];\n this.text = this._text.join('');\n this.set('dirty', true);\n this.initDimensions();\n this.setCoords();\n this._removeExtraneousStyles();\n }\n\n /**\n * Set the selectionStart and selectionEnd according to the new position of cursor\n * mimic the key - mouse navigation when shift is pressed.\n */\n setSelectionStartEndWithShift(\n start: number,\n end: number,\n newSelection: number,\n ) {\n if (newSelection <= start) {\n if (end === start) {\n this._selectionDirection = LEFT;\n } else if (this._selectionDirection === RIGHT) {\n this._selectionDirection = LEFT;\n this.selectionEnd = start;\n }\n this.selectionStart = newSelection;\n } else if (newSelection > start && newSelection < end) {\n if (this._selectionDirection === RIGHT) {\n this.selectionEnd = newSelection;\n } else {\n this.selectionStart = newSelection;\n }\n } else {\n // newSelection is > selection start and end\n if (end === start) {\n this._selectionDirection = RIGHT;\n } else if (this._selectionDirection === LEFT) {\n this._selectionDirection = RIGHT;\n this.selectionStart = end;\n }\n this.selectionEnd = newSelection;\n }\n }\n}\n","import { config } from '../../config';\nimport { getFabricDocument, getEnv } from '../../env';\nimport { capValue } from '../../util/misc/capValue';\nimport type { ITextEvents } from './ITextBehavior';\nimport { ITextBehavior } from './ITextBehavior';\nimport type { TKeyMapIText } from './constants';\nimport type { TOptions } from '../../typedefs';\nimport type { TextProps, SerializedTextProps } from '../Text/Text';\nimport { getDocumentFromElement } from '../../util/dom_misc';\nimport { CHANGED, LEFT, RIGHT } from '../../constants';\nimport type { IText } from './IText';\nimport type { TextStyleDeclaration } from '../Text/StyledText';\n\nexport abstract class ITextKeyBehavior<\n Props extends TOptions = Partial,\n SProps extends SerializedTextProps = SerializedTextProps,\n EventSpec extends ITextEvents = ITextEvents,\n> extends ITextBehavior {\n /**\n * For functionalities on keyDown\n * Map a special key to a function of the instance/prototype\n * If you need different behavior for ESC or TAB or arrows, you have to change\n * this map setting the name of a function that you build on the IText or\n * your prototype.\n * the map change will affect all Instances unless you need for only some text Instances\n * in that case you have to clone this object and assign your Instance.\n * this.keysMap = Object.assign({}, this.keysMap);\n * The function must be in IText.prototype.myFunction And will receive event as args[0]\n */\n declare keysMap: TKeyMapIText;\n\n declare keysMapRtl: TKeyMapIText;\n\n /**\n * For functionalities on keyUp + ctrl || cmd\n */\n declare ctrlKeysMapUp: TKeyMapIText;\n\n /**\n * For functionalities on keyDown + ctrl || cmd\n */\n declare ctrlKeysMapDown: TKeyMapIText;\n\n declare hiddenTextarea: HTMLTextAreaElement | null;\n\n /**\n * DOM container to append the hiddenTextarea.\n * An alternative to attaching to the document.body.\n * Useful to reduce laggish redraw of the full document.body tree and\n * also with modals event capturing that won't let the textarea take focus.\n * @type HTMLElement\n */\n declare hiddenTextareaContainer?: HTMLElement | null;\n\n declare private _clickHandlerInitialized: boolean;\n declare private _copyDone: boolean;\n declare private fromPaste: boolean;\n\n /**\n * Initializes hidden textarea (needed to bring up keyboard in iOS)\n */\n initHiddenTextarea() {\n const doc =\n (this.canvas && getDocumentFromElement(this.canvas.getElement())) ||\n getFabricDocument();\n const textarea = doc.createElement('textarea');\n Object.entries({\n autocapitalize: 'off',\n autocorrect: 'off',\n autocomplete: 'off',\n spellcheck: 'false',\n 'data-fabric': 'textarea',\n wrap: 'off',\n name: 'fabricTextarea',\n }).map(([attribute, value]) => textarea.setAttribute(attribute, value));\n const { top, left, fontSize } = this._calcTextareaPosition();\n // line-height: 1px; was removed from the style to fix this:\n // https://bugs.chromium.org/p/chromium/issues/detail?id=870966\n textarea.style.cssText = `position: absolute; top: ${top}; left: ${left}; z-index: -999; opacity: 0; width: 1px; height: 1px; font-size: 1px; padding-top: ${fontSize};`;\n\n (this.hiddenTextareaContainer || doc.body).appendChild(textarea);\n\n Object.entries({\n blur: 'blur',\n keydown: 'onKeyDown',\n keyup: 'onKeyUp',\n input: 'onInput',\n copy: 'copy',\n cut: 'copy',\n paste: 'paste',\n compositionstart: 'onCompositionStart',\n compositionupdate: 'onCompositionUpdate',\n compositionend: 'onCompositionEnd',\n } as Record).map(([eventName, handler]) =>\n textarea.addEventListener(\n eventName,\n (this[handler] as EventListener).bind(this),\n ),\n );\n this.hiddenTextarea = textarea;\n }\n\n /**\n * Override this method to customize cursor behavior on textbox blur\n */\n blur() {\n this.abortCursorAnimation();\n }\n\n /**\n * Handles keydown event\n * only used for arrows and combination of modifier keys.\n * @param {KeyboardEvent} e Event object\n */\n onKeyDown(e: KeyboardEvent) {\n if (!this.isEditing) {\n return;\n }\n const keyMap = this.direction === 'rtl' ? this.keysMapRtl : this.keysMap;\n if (e.keyCode in keyMap) {\n (this[keyMap[e.keyCode] as keyof this] as (arg: KeyboardEvent) => void)(\n e,\n );\n } else if (e.keyCode in this.ctrlKeysMapDown && (e.ctrlKey || e.metaKey)) {\n (\n this[this.ctrlKeysMapDown[e.keyCode] as keyof this] as (\n arg: KeyboardEvent,\n ) => void\n )(e);\n } else {\n return;\n }\n e.stopImmediatePropagation();\n e.preventDefault();\n if (e.keyCode >= 33 && e.keyCode <= 40) {\n // if i press an arrow key just update selection\n this.inCompositionMode = false;\n this.clearContextTop();\n this.renderCursorOrSelection();\n } else {\n this.canvas && this.canvas.requestRenderAll();\n }\n }\n\n /**\n * Handles keyup event\n * We handle KeyUp because ie11 and edge have difficulties copy/pasting\n * if a copy/cut event fired, keyup is dismissed\n * @param {KeyboardEvent} e Event object\n */\n onKeyUp(e: KeyboardEvent) {\n if (!this.isEditing || this._copyDone || this.inCompositionMode) {\n this._copyDone = false;\n return;\n }\n if (e.keyCode in this.ctrlKeysMapUp && (e.ctrlKey || e.metaKey)) {\n (\n this[this.ctrlKeysMapUp[e.keyCode] as keyof this] as (\n arg: KeyboardEvent,\n ) => void\n )(e);\n } else {\n return;\n }\n e.stopImmediatePropagation();\n e.preventDefault();\n this.canvas && this.canvas.requestRenderAll();\n }\n\n /**\n * Handles onInput event\n * @param {Event} e Event object\n */\n onInput(this: this & { hiddenTextarea: HTMLTextAreaElement }, e: Event) {\n const fromPaste = this.fromPaste;\n const { value, selectionStart, selectionEnd } = this.hiddenTextarea;\n this.fromPaste = false;\n e && e.stopPropagation();\n if (!this.isEditing) {\n return;\n }\n const updateAndFire = () => {\n this.updateFromTextArea();\n this.fire(CHANGED);\n if (this.canvas) {\n this.canvas.fire('text:changed', { target: this as unknown as IText });\n this.canvas.requestRenderAll();\n }\n };\n if (this.hiddenTextarea.value === '') {\n this.styles = {};\n updateAndFire();\n return;\n }\n // decisions about style changes.\n const nextText = this._splitTextIntoLines(value).graphemeText,\n charCount = this._text.length,\n nextCharCount = nextText.length,\n _selectionStart = this.selectionStart,\n _selectionEnd = this.selectionEnd,\n selection = _selectionStart !== _selectionEnd;\n let copiedStyle: TextStyleDeclaration[] | undefined,\n removedText,\n charDiff = nextCharCount - charCount,\n removeFrom,\n removeTo;\n\n const textareaSelection = this.fromStringToGraphemeSelection(\n selectionStart,\n selectionEnd,\n value,\n );\n const backDelete = _selectionStart > textareaSelection.selectionStart;\n\n if (selection) {\n removedText = this._text.slice(_selectionStart, _selectionEnd);\n charDiff += _selectionEnd - _selectionStart;\n } else if (nextCharCount < charCount) {\n if (backDelete) {\n removedText = this._text.slice(_selectionEnd + charDiff, _selectionEnd);\n } else {\n removedText = this._text.slice(\n _selectionStart,\n _selectionStart - charDiff,\n );\n }\n }\n const insertedText = nextText.slice(\n textareaSelection.selectionEnd - charDiff,\n textareaSelection.selectionEnd,\n );\n if (removedText && removedText.length) {\n if (insertedText.length) {\n // let's copy some style before deleting.\n // we want to copy the style before the cursor OR the style at the cursor if selection\n // is bigger than 0.\n copiedStyle = this.getSelectionStyles(\n _selectionStart,\n _selectionStart + 1,\n false,\n );\n // now duplicate the style one for each inserted text.\n copiedStyle = insertedText.map(\n () =>\n // this return an array of references, but that is fine since we are\n // copying the style later.\n copiedStyle![0],\n );\n }\n if (selection) {\n removeFrom = _selectionStart;\n removeTo = _selectionEnd;\n } else if (backDelete) {\n // detect differences between forwardDelete and backDelete\n removeFrom = _selectionEnd - removedText.length;\n removeTo = _selectionEnd;\n } else {\n removeFrom = _selectionEnd;\n removeTo = _selectionEnd + removedText.length;\n }\n this.removeStyleFromTo(removeFrom, removeTo);\n }\n if (insertedText.length) {\n const { copyPasteData } = getEnv();\n if (\n fromPaste &&\n insertedText.join('') === copyPasteData.copiedText &&\n !config.disableStyleCopyPaste\n ) {\n copiedStyle = copyPasteData.copiedTextStyle;\n }\n this.insertNewStyleBlock(insertedText, _selectionStart, copiedStyle);\n }\n updateAndFire();\n }\n\n /**\n * Composition start\n */\n onCompositionStart() {\n this.inCompositionMode = true;\n }\n\n /**\n * Composition end\n */\n onCompositionEnd() {\n this.inCompositionMode = false;\n }\n\n onCompositionUpdate({ target }: CompositionEvent) {\n const { selectionStart, selectionEnd } = target as HTMLTextAreaElement;\n this.compositionStart = selectionStart;\n this.compositionEnd = selectionEnd;\n this.updateTextareaPosition();\n }\n\n /**\n * Copies selected text\n */\n copy() {\n if (this.selectionStart === this.selectionEnd) {\n //do not cut-copy if no selection\n return;\n }\n const { copyPasteData } = getEnv();\n copyPasteData.copiedText = this.getSelectedText();\n if (!config.disableStyleCopyPaste) {\n copyPasteData.copiedTextStyle = this.getSelectionStyles(\n this.selectionStart,\n this.selectionEnd,\n true,\n );\n } else {\n copyPasteData.copiedTextStyle = undefined;\n }\n this._copyDone = true;\n }\n\n /**\n * Pastes text\n */\n paste() {\n this.fromPaste = true;\n }\n\n /**\n * Finds the width in pixels before the cursor on the same line\n * @private\n * @param {Number} lineIndex\n * @param {Number} charIndex\n * @return {Number} widthBeforeCursor width before cursor\n */\n _getWidthBeforeCursor(lineIndex: number, charIndex: number): number {\n let widthBeforeCursor = this._getLineLeftOffset(lineIndex),\n bound;\n\n if (charIndex > 0) {\n bound = this.__charBounds[lineIndex][charIndex - 1];\n widthBeforeCursor += bound.left + bound.width;\n }\n return widthBeforeCursor;\n }\n\n /**\n * Gets start offset of a selection\n * @param {KeyboardEvent} e Event object\n * @param {Boolean} isRight\n * @return {Number}\n */\n getDownCursorOffset(e: KeyboardEvent, isRight: boolean): number {\n const selectionProp = this._getSelectionForOffset(e, isRight),\n cursorLocation = this.get2DCursorLocation(selectionProp),\n lineIndex = cursorLocation.lineIndex;\n // if on last line, down cursor goes to end of line\n if (\n lineIndex === this._textLines.length - 1 ||\n e.metaKey ||\n e.keyCode === 34\n ) {\n // move to the end of a text\n return this._text.length - selectionProp;\n }\n const charIndex = cursorLocation.charIndex,\n widthBeforeCursor = this._getWidthBeforeCursor(lineIndex, charIndex),\n indexOnOtherLine = this._getIndexOnLine(lineIndex + 1, widthBeforeCursor),\n textAfterCursor = this._textLines[lineIndex].slice(charIndex);\n return (\n textAfterCursor.length +\n indexOnOtherLine +\n 1 +\n this.missingNewlineOffset(lineIndex)\n );\n }\n\n /**\n * private\n * Helps finding if the offset should be counted from Start or End\n * @param {KeyboardEvent} e Event object\n * @param {Boolean} isRight\n * @return {Number}\n */\n _getSelectionForOffset(e: KeyboardEvent, isRight: boolean): number {\n if (e.shiftKey && this.selectionStart !== this.selectionEnd && isRight) {\n return this.selectionEnd;\n } else {\n return this.selectionStart;\n }\n }\n\n /**\n * @param {KeyboardEvent} e Event object\n * @param {Boolean} isRight\n * @return {Number}\n */\n getUpCursorOffset(e: KeyboardEvent, isRight: boolean): number {\n const selectionProp = this._getSelectionForOffset(e, isRight),\n cursorLocation = this.get2DCursorLocation(selectionProp),\n lineIndex = cursorLocation.lineIndex;\n if (lineIndex === 0 || e.metaKey || e.keyCode === 33) {\n // if on first line, up cursor goes to start of line\n return -selectionProp;\n }\n const charIndex = cursorLocation.charIndex,\n widthBeforeCursor = this._getWidthBeforeCursor(lineIndex, charIndex),\n indexOnOtherLine = this._getIndexOnLine(lineIndex - 1, widthBeforeCursor),\n textBeforeCursor = this._textLines[lineIndex].slice(0, charIndex),\n missingNewlineOffset = this.missingNewlineOffset(lineIndex - 1);\n // return a negative offset\n return (\n -this._textLines[lineIndex - 1].length +\n indexOnOtherLine -\n textBeforeCursor.length +\n (1 - missingNewlineOffset)\n );\n }\n\n /**\n * for a given width it founds the matching character.\n * @private\n */\n _getIndexOnLine(lineIndex: number, width: number) {\n const line = this._textLines[lineIndex],\n lineLeftOffset = this._getLineLeftOffset(lineIndex);\n let widthOfCharsOnLine = lineLeftOffset,\n indexOnLine = 0,\n charWidth,\n foundMatch;\n\n for (let j = 0, jlen = line.length; j < jlen; j++) {\n charWidth = this.__charBounds[lineIndex][j].width;\n widthOfCharsOnLine += charWidth;\n if (widthOfCharsOnLine > width) {\n foundMatch = true;\n const leftEdge = widthOfCharsOnLine - charWidth,\n rightEdge = widthOfCharsOnLine,\n offsetFromLeftEdge = Math.abs(leftEdge - width),\n offsetFromRightEdge = Math.abs(rightEdge - width);\n\n indexOnLine = offsetFromRightEdge < offsetFromLeftEdge ? j : j - 1;\n break;\n }\n }\n\n // reached end\n if (!foundMatch) {\n indexOnLine = line.length - 1;\n }\n\n return indexOnLine;\n }\n\n /**\n * Moves cursor down\n * @param {KeyboardEvent} e Event object\n */\n moveCursorDown(e: KeyboardEvent) {\n if (\n this.selectionStart >= this._text.length &&\n this.selectionEnd >= this._text.length\n ) {\n return;\n }\n this._moveCursorUpOrDown('Down', e);\n }\n\n /**\n * Moves cursor up\n * @param {KeyboardEvent} e Event object\n */\n moveCursorUp(e: KeyboardEvent) {\n if (this.selectionStart === 0 && this.selectionEnd === 0) {\n return;\n }\n this._moveCursorUpOrDown('Up', e);\n }\n\n /**\n * Moves cursor up or down, fires the events\n * @param {String} direction 'Up' or 'Down'\n * @param {KeyboardEvent} e Event object\n */\n _moveCursorUpOrDown(direction: 'Up' | 'Down', e: KeyboardEvent) {\n const offset = this[`get${direction}CursorOffset`](\n e,\n this._selectionDirection === RIGHT,\n );\n if (e.shiftKey) {\n this.moveCursorWithShift(offset);\n } else {\n this.moveCursorWithoutShift(offset);\n }\n if (offset !== 0) {\n const max = this.text.length;\n this.selectionStart = capValue(0, this.selectionStart, max);\n this.selectionEnd = capValue(0, this.selectionEnd, max);\n // TODO fix: abort and init should be an alternative depending\n // on selectionStart/End being equal or different\n this.abortCursorAnimation();\n this.initDelayedCursor();\n this._fireSelectionChanged();\n this._updateTextarea();\n }\n }\n\n /**\n * Moves cursor with shift\n * @param {Number} offset\n */\n moveCursorWithShift(offset: number) {\n const newSelection =\n this._selectionDirection === LEFT\n ? this.selectionStart + offset\n : this.selectionEnd + offset;\n this.setSelectionStartEndWithShift(\n this.selectionStart,\n this.selectionEnd,\n newSelection,\n );\n return offset !== 0;\n }\n\n /**\n * Moves cursor up without shift\n * @param {Number} offset\n */\n moveCursorWithoutShift(offset: number) {\n if (offset < 0) {\n this.selectionStart += offset;\n this.selectionEnd = this.selectionStart;\n } else {\n this.selectionEnd += offset;\n this.selectionStart = this.selectionEnd;\n }\n return offset !== 0;\n }\n\n /**\n * Moves cursor left\n * @param {KeyboardEvent} e Event object\n */\n moveCursorLeft(e: KeyboardEvent) {\n if (this.selectionStart === 0 && this.selectionEnd === 0) {\n return;\n }\n this._moveCursorLeftOrRight('Left', e);\n }\n\n /**\n * @private\n * @return {Boolean} true if a change happened\n *\n * @todo refactor not to use method name composition\n */\n _move(\n e: KeyboardEvent,\n prop: 'selectionStart' | 'selectionEnd',\n direction: 'Left' | 'Right',\n ): boolean {\n let newValue: number | undefined;\n if (e.altKey) {\n newValue = this[`findWordBoundary${direction}`](this[prop]);\n } else if (e.metaKey || e.keyCode === 35 || e.keyCode === 36) {\n newValue = this[`findLineBoundary${direction}`](this[prop]);\n } else {\n this[prop] += direction === 'Left' ? -1 : 1;\n return true;\n }\n if (typeof newValue !== 'undefined' && this[prop] !== newValue) {\n this[prop] = newValue;\n return true;\n }\n return false;\n }\n\n /**\n * @private\n */\n _moveLeft(e: KeyboardEvent, prop: 'selectionStart' | 'selectionEnd') {\n return this._move(e, prop, 'Left');\n }\n\n /**\n * @private\n */\n _moveRight(e: KeyboardEvent, prop: 'selectionStart' | 'selectionEnd') {\n return this._move(e, prop, 'Right');\n }\n\n /**\n * Moves cursor left without keeping selection\n * @param {KeyboardEvent} e\n */\n moveCursorLeftWithoutShift(e: KeyboardEvent) {\n let change = true;\n this._selectionDirection = LEFT;\n\n // only move cursor when there is no selection,\n // otherwise we discard it, and leave cursor on same place\n if (\n this.selectionEnd === this.selectionStart &&\n this.selectionStart !== 0\n ) {\n change = this._moveLeft(e, 'selectionStart');\n }\n this.selectionEnd = this.selectionStart;\n return change;\n }\n\n /**\n * Moves cursor left while keeping selection\n * @param {KeyboardEvent} e\n */\n moveCursorLeftWithShift(e: KeyboardEvent) {\n if (\n this._selectionDirection === RIGHT &&\n this.selectionStart !== this.selectionEnd\n ) {\n return this._moveLeft(e, 'selectionEnd');\n } else if (this.selectionStart !== 0) {\n this._selectionDirection = LEFT;\n return this._moveLeft(e, 'selectionStart');\n }\n }\n\n /**\n * Moves cursor right\n * @param {KeyboardEvent} e Event object\n */\n moveCursorRight(e: KeyboardEvent) {\n if (\n this.selectionStart >= this._text.length &&\n this.selectionEnd >= this._text.length\n ) {\n return;\n }\n this._moveCursorLeftOrRight('Right', e);\n }\n\n /**\n * Moves cursor right or Left, fires event\n * @param {String} direction 'Left', 'Right'\n * @param {KeyboardEvent} e Event object\n */\n _moveCursorLeftOrRight(direction: 'Left' | 'Right', e: KeyboardEvent) {\n const actionName = `moveCursor${direction}${\n e.shiftKey ? 'WithShift' : 'WithoutShift'\n }` as const;\n this._currentCursorOpacity = 1;\n if (this[actionName](e)) {\n // TODO fix: abort and init should be an alternative depending\n // on selectionStart/End being equal or different\n this.abortCursorAnimation();\n this.initDelayedCursor();\n this._fireSelectionChanged();\n this._updateTextarea();\n }\n }\n\n /**\n * Moves cursor right while keeping selection\n * @param {KeyboardEvent} e\n */\n moveCursorRightWithShift(e: KeyboardEvent) {\n if (\n this._selectionDirection === LEFT &&\n this.selectionStart !== this.selectionEnd\n ) {\n return this._moveRight(e, 'selectionStart');\n } else if (this.selectionEnd !== this._text.length) {\n this._selectionDirection = RIGHT;\n return this._moveRight(e, 'selectionEnd');\n }\n }\n\n /**\n * Moves cursor right without keeping selection\n * @param {KeyboardEvent} e Event object\n */\n moveCursorRightWithoutShift(e: KeyboardEvent) {\n let changed = true;\n this._selectionDirection = RIGHT;\n\n if (this.selectionStart === this.selectionEnd) {\n changed = this._moveRight(e, 'selectionStart');\n this.selectionEnd = this.selectionStart;\n } else {\n this.selectionStart = this.selectionEnd;\n }\n return changed;\n }\n}\n","import type {\n ObjectPointerEvents,\n TPointerEvent,\n TPointerEventInfo,\n} from '../../EventTypeDefs';\nimport { Point } from '../../Point';\nimport { invertTransform } from '../../util/misc/matrix';\nimport { DraggableTextDelegate } from './DraggableTextDelegate';\nimport type { ITextEvents } from './ITextBehavior';\nimport { ITextKeyBehavior } from './ITextKeyBehavior';\nimport type { TOptions } from '../../typedefs';\nimport type { TextProps, SerializedTextProps } from '../Text/Text';\nimport type { IText } from './IText';\n/**\n * `LEFT_CLICK === 0`\n */\nconst notALeftClick = (e: Event) => !!(e as MouseEvent).button;\n\nexport abstract class ITextClickBehavior<\n Props extends TOptions = Partial,\n SProps extends SerializedTextProps = SerializedTextProps,\n EventSpec extends ITextEvents = ITextEvents,\n> extends ITextKeyBehavior {\n protected draggableTextDelegate: DraggableTextDelegate;\n\n initBehavior() {\n // Initializes event handlers related to cursor or selection\n this.on('mousedown', this._mouseDownHandler);\n this.on('mouseup', this.mouseUpHandler);\n this.on('mousedblclick', this.doubleClickHandler);\n this.on('mousetripleclick', this.tripleClickHandler);\n\n this.draggableTextDelegate = new DraggableTextDelegate(\n this as unknown as IText,\n );\n\n super.initBehavior();\n }\n\n /**\n * If this method returns true a mouse move operation over a text selection\n * will not prevent the native mouse event allowing the browser to start a drag operation.\n * shouldStartDragging can be read 'do not prevent default for mouse move event'\n * To prevent drag and drop between objects both shouldStartDragging and onDragStart should return false\n * @returns\n */\n shouldStartDragging() {\n return this.draggableTextDelegate.isActive();\n }\n\n /**\n * @public override this method to control whether instance should/shouldn't become a drag source,\n * @see also {@link DraggableTextDelegate#isActive}\n * To prevent drag and drop between objects both shouldStartDragging and onDragStart should return false\n * @returns {boolean} should handle event\n */\n onDragStart(e: DragEvent) {\n return this.draggableTextDelegate.onDragStart(e);\n }\n\n /**\n * @public override this method to control whether instance should/shouldn't become a drop target\n */\n canDrop(e: DragEvent) {\n return this.draggableTextDelegate.canDrop(e);\n }\n\n /**\n * Default handler for double click, select a word\n */\n doubleClickHandler(options: TPointerEventInfo) {\n if (!this.isEditing) {\n return;\n }\n this.selectWord(this.getSelectionStartFromPointer(options.e));\n this.renderCursorOrSelection();\n }\n\n /**\n * Default handler for triple click, select a line\n */\n tripleClickHandler(options: TPointerEventInfo) {\n if (!this.isEditing) {\n return;\n }\n this.selectLine(this.getSelectionStartFromPointer(options.e));\n this.renderCursorOrSelection();\n }\n\n /**\n * Default event handler for the basic functionalities needed on _mouseDown\n * can be overridden to do something different.\n * Scope of this implementation is: find the click position, set selectionStart\n * find selectionEnd, initialize the drawing of either cursor or selection area\n * initializing a mousedDown on a text area will cancel fabricjs knowledge of\n * current compositionMode. It will be set to false.\n */\n _mouseDownHandler({ e, alreadySelected }: ObjectPointerEvents['mousedown']) {\n if (\n !this.canvas ||\n !this.editable ||\n notALeftClick(e) ||\n this.getActiveControl()\n ) {\n return;\n }\n\n if (this.draggableTextDelegate.start(e)) {\n return;\n }\n\n this.canvas.textEditingManager.register(this);\n\n if (alreadySelected) {\n this.inCompositionMode = false;\n this.setCursorByClick(e);\n }\n\n if (this.isEditing) {\n this.__selectionStartOnMouseDown = this.selectionStart;\n if (this.selectionStart === this.selectionEnd) {\n this.abortCursorAnimation();\n }\n this.renderCursorOrSelection();\n }\n this.selected ||= alreadySelected || this.isEditing;\n }\n\n /**\n * standard handler for mouse up, overridable\n * @private\n */\n mouseUpHandler({ e, transform }: ObjectPointerEvents['mouseup']) {\n const didDrag = this.draggableTextDelegate.end(e);\n\n if (this.canvas) {\n this.canvas.textEditingManager.unregister(this);\n\n const activeObject = this.canvas._activeObject;\n if (activeObject && activeObject !== this) {\n // avoid running this logic when there is an active object\n // this because is possible with shift click and fast clicks,\n // to rapidly deselect and reselect this object and trigger an enterEdit\n return;\n }\n }\n\n if (\n !this.editable ||\n (this.group && !this.group.interactive) ||\n (transform && transform.actionPerformed) ||\n notALeftClick(e) ||\n didDrag\n ) {\n return;\n }\n\n if (this.selected && !this.getActiveControl()) {\n this.enterEditing(e);\n if (this.selectionStart === this.selectionEnd) {\n this.initDelayedCursor(true);\n } else {\n this.renderCursorOrSelection();\n }\n }\n }\n\n /**\n * Changes cursor location in a text depending on passed pointer (x/y) object\n * @param {TPointerEvent} e Event object\n */\n setCursorByClick(e: TPointerEvent) {\n const newSelection = this.getSelectionStartFromPointer(e),\n start = this.selectionStart,\n end = this.selectionEnd;\n if (e.shiftKey) {\n this.setSelectionStartEndWithShift(start, end, newSelection);\n } else {\n this.selectionStart = newSelection;\n this.selectionEnd = newSelection;\n }\n if (this.isEditing) {\n this._fireSelectionChanged();\n this._updateTextarea();\n }\n }\n\n /**\n * Returns index of a character corresponding to where an object was clicked\n * @param {TPointerEvent} e Event object\n * @return {Number} Index of a character\n */\n getSelectionStartFromPointer(e: TPointerEvent): number {\n const mouseOffset = this.canvas!.getScenePoint(e)\n .transform(invertTransform(this.calcTransformMatrix()))\n .add(new Point(-this._getLeftOffset(), -this._getTopOffset()));\n let height = 0,\n charIndex = 0,\n lineIndex = 0;\n\n for (let i = 0; i < this._textLines.length; i++) {\n if (height <= mouseOffset.y) {\n height += this.getHeightOfLine(i);\n lineIndex = i;\n if (i > 0) {\n charIndex +=\n this._textLines[i - 1].length + this.missingNewlineOffset(i - 1);\n }\n } else {\n break;\n }\n }\n const lineLeftOffset = Math.abs(this._getLineLeftOffset(lineIndex));\n let width = lineLeftOffset;\n const charLength = this._textLines[lineIndex].length;\n const chars = this.__charBounds[lineIndex];\n for (let j = 0; j < charLength; j++) {\n // i removed something about flipX here, check.\n const charWidth = chars[j].kernedWidth;\n const widthAfter = width + charWidth;\n if (mouseOffset.x <= widthAfter) {\n // if the pointer is closer to the end of the char we increment charIndex\n // in order to position the cursor after the char\n if (\n Math.abs(mouseOffset.x - widthAfter) <=\n Math.abs(mouseOffset.x - width)\n ) {\n charIndex++;\n }\n break;\n }\n width = widthAfter;\n charIndex++;\n }\n\n return Math.min(\n // if object is horizontally flipped, mirror cursor location from the end\n this.flipX ? charLength - charIndex : charIndex,\n this._text.length,\n );\n }\n}\n","export type TKeyMapIText = Record<\n KeyboardEvent['keyCode'],\n CursorHandlingMethods\n>;\n\nexport type CursorHandlingMethods =\n | 'moveCursorUp'\n | 'moveCursorDown'\n | 'moveCursorLeft'\n | 'moveCursorRight'\n | 'exitEditing'\n | 'copy'\n | 'cut'\n | 'cmdAll';\n\nconst MOVE_CURSOR_UP: CursorHandlingMethods = 'moveCursorUp';\nconst MOVE_CURSOR_DOWN: CursorHandlingMethods = 'moveCursorDown';\nconst MOVE_CURSOR_LEFT: CursorHandlingMethods = 'moveCursorLeft';\nconst MOVE_CURSOR_RIGHT: CursorHandlingMethods = 'moveCursorRight';\nconst EXIT_EDITING: CursorHandlingMethods = 'exitEditing';\n\n// @TODO look into import { Key } from 'ts-key-enum';\n// and transition from keyCode to Key\n// also reduce string duplication\nexport const keysMap: TKeyMapIText = {\n 9: EXIT_EDITING,\n 27: EXIT_EDITING,\n 33: MOVE_CURSOR_UP,\n 34: MOVE_CURSOR_DOWN,\n 35: MOVE_CURSOR_RIGHT,\n 36: MOVE_CURSOR_LEFT,\n 37: MOVE_CURSOR_LEFT,\n 38: MOVE_CURSOR_UP,\n 39: MOVE_CURSOR_RIGHT,\n 40: MOVE_CURSOR_DOWN,\n};\n\nexport const keysMapRtl: TKeyMapIText = {\n 9: EXIT_EDITING,\n 27: EXIT_EDITING,\n 33: MOVE_CURSOR_UP,\n 34: MOVE_CURSOR_DOWN,\n 35: MOVE_CURSOR_LEFT,\n 36: MOVE_CURSOR_RIGHT,\n 37: MOVE_CURSOR_RIGHT,\n 38: MOVE_CURSOR_UP,\n 39: MOVE_CURSOR_LEFT,\n 40: MOVE_CURSOR_DOWN,\n};\n\n/**\n * For functionalities on keyUp + ctrl || cmd\n */\nexport const ctrlKeysMapUp: TKeyMapIText = {\n 67: 'copy',\n // there was a reason this wasn't deleted. for now leave it here\n 88: 'cut',\n};\n\n/**\n * For functionalities on keyDown + ctrl || cmd\n */\nexport const ctrlKeysMapDown: TKeyMapIText = {\n 65: 'cmdAll',\n};\n","import type { StaticCanvas } from '../../canvas/StaticCanvas';\n\n/**\n * Set the transform of the passed context to the same of a specific Canvas or StaticCanvas.\n * setTransform is used since this utility will RESET the ctx transform to the basic value\n * of retina scaling and viewport transform\n * It is not meant to be added to other transforms, it is used internally to preapre canvases to draw\n * @param ctx\n * @param canvas\n */\nexport const applyCanvasTransform = (\n ctx: CanvasRenderingContext2D,\n canvas: StaticCanvas,\n) => {\n const scale = canvas.getRetinaScaling();\n ctx.setTransform(scale, 0, 0, scale, 0, 0);\n const v = canvas.viewportTransform;\n ctx.transform(v[0], v[1], v[2], v[3], v[4], v[5]);\n};\n","import { Canvas } from '../../canvas/Canvas';\nimport type { ITextEvents } from './ITextBehavior';\nimport { ITextClickBehavior } from './ITextClickBehavior';\nimport {\n ctrlKeysMapDown,\n ctrlKeysMapUp,\n keysMap,\n keysMapRtl,\n} from './constants';\nimport type { TClassProperties, TFiller, TOptions } from '../../typedefs';\nimport { classRegistry } from '../../ClassRegistry';\nimport type { SerializedTextProps, TextProps } from '../Text/Text';\nimport {\n JUSTIFY,\n JUSTIFY_CENTER,\n JUSTIFY_LEFT,\n JUSTIFY_RIGHT,\n} from '../Text/constants';\nimport { CENTER, FILL, LEFT, RIGHT } from '../../constants';\nimport type { ObjectToCanvasElementOptions } from '../Object/Object';\nimport type { FabricObject } from '../Object/FabricObject';\nimport { createCanvasElementFor } from '../../util/misc/dom';\nimport { applyCanvasTransform } from '../../util/internals/applyCanvasTransform';\n\nexport type CursorBoundaries = {\n left: number;\n top: number;\n leftOffset: number;\n topOffset: number;\n};\n\nexport type CursorRenderingData = {\n color: string;\n opacity: number;\n left: number;\n top: number;\n width: number;\n height: number;\n};\n\n// Declare IText protected properties to workaround TS\nconst protectedDefaultValues = {\n _selectionDirection: null,\n _reSpace: /\\s|\\r?\\n/,\n inCompositionMode: false,\n};\n\nexport const iTextDefaultValues: Partial> = {\n selectionStart: 0,\n selectionEnd: 0,\n selectionColor: 'rgba(17,119,255,0.3)',\n isEditing: false,\n editable: true,\n editingBorderColor: 'rgba(102,153,255,0.25)',\n cursorWidth: 2,\n cursorColor: '',\n cursorDelay: 1000,\n cursorDuration: 600,\n caching: true,\n hiddenTextareaContainer: null,\n keysMap,\n keysMapRtl,\n ctrlKeysMapDown,\n ctrlKeysMapUp,\n ...protectedDefaultValues,\n};\n\n// @TODO this is not complete\ninterface UniqueITextProps {\n selectionStart: number;\n selectionEnd: number;\n}\n\nexport interface SerializedITextProps\n extends SerializedTextProps,\n UniqueITextProps {}\n\nexport interface ITextProps extends TextProps, UniqueITextProps {}\n\n/**\n * @fires changed\n * @fires selection:changed\n * @fires editing:entered\n * @fires editing:exited\n * @fires dragstart\n * @fires drag drag event firing on the drag source\n * @fires dragend\n * @fires copy\n * @fires cut\n * @fires paste\n *\n * #### Supported key combinations\n * ```\n * Move cursor: left, right, up, down\n * Select character: shift + left, shift + right\n * Select text vertically: shift + up, shift + down\n * Move cursor by word: alt + left, alt + right\n * Select words: shift + alt + left, shift + alt + right\n * Move cursor to line start/end: cmd + left, cmd + right or home, end\n * Select till start/end of line: cmd + shift + left, cmd + shift + right or shift + home, shift + end\n * Jump to start/end of text: cmd + up, cmd + down\n * Select till start/end of text: cmd + shift + up, cmd + shift + down or shift + pgUp, shift + pgDown\n * Delete character: backspace\n * Delete word: alt + backspace\n * Delete line: cmd + backspace\n * Forward delete: delete\n * Copy text: ctrl/cmd + c\n * Paste text: ctrl/cmd + v\n * Cut text: ctrl/cmd + x\n * Select entire text: ctrl/cmd + a\n * Quit editing tab or esc\n * ```\n *\n * #### Supported mouse/touch combination\n * ```\n * Position cursor: click/touch\n * Create selection: click/touch & drag\n * Create selection: click & shift + click\n * Select word: double click\n * Select line: triple click\n * ```\n */\nexport class IText<\n Props extends TOptions = Partial,\n SProps extends SerializedITextProps = SerializedITextProps,\n EventSpec extends ITextEvents = ITextEvents,\n >\n extends ITextClickBehavior\n implements UniqueITextProps\n{\n /**\n * Index where text selection starts (or where cursor is when there is no selection)\n * @type Number\n */\n declare selectionStart: number;\n\n /**\n * Index where text selection ends\n * @type Number\n */\n declare selectionEnd: number;\n\n declare compositionStart: number;\n\n declare compositionEnd: number;\n\n /**\n * Color of text selection\n * @type String\n */\n declare selectionColor: string;\n\n /**\n * Indicates whether text is in editing mode\n * @type Boolean\n */\n declare isEditing: boolean;\n\n /**\n * Indicates whether a text can be edited\n * @type Boolean\n */\n declare editable: boolean;\n\n /**\n * Border color of text object while it's in editing mode\n * @type String\n */\n declare editingBorderColor: string;\n\n /**\n * Width of cursor (in px)\n * @type Number\n */\n declare cursorWidth: number;\n\n /**\n * Color of text cursor color in editing mode.\n * if not set (default) will take color from the text.\n * if set to a color value that fabric can understand, it will\n * be used instead of the color of the text at the current position.\n * @type String\n */\n declare cursorColor: string;\n\n /**\n * Delay between cursor blink (in ms)\n * @type Number\n */\n declare cursorDelay: number;\n\n /**\n * Duration of cursor fade in (in ms)\n * @type Number\n */\n declare cursorDuration: number;\n\n declare compositionColor: string;\n\n /**\n * Indicates whether internal text char widths can be cached\n * @type Boolean\n */\n declare caching: boolean;\n\n static ownDefaults = iTextDefaultValues;\n\n static getDefaults(): Record {\n return { ...super.getDefaults(), ...IText.ownDefaults };\n }\n\n static type = 'IText';\n\n get type() {\n const type = super.type;\n // backward compatibility\n return type === 'itext' ? 'i-text' : type;\n }\n\n /**\n * Constructor\n * @param {String} text Text string\n * @param {Object} [options] Options object\n */\n constructor(text: string, options?: Props) {\n super(text, { ...IText.ownDefaults, ...options } as Props);\n this.initBehavior();\n }\n\n /**\n * While editing handle differently\n * @private\n * @param {string} key\n * @param {*} value\n */\n _set(key: string, value: any) {\n if (this.isEditing && this._savedProps && key in this._savedProps) {\n // @ts-expect-error irritating TS\n this._savedProps[key] = value;\n return this;\n }\n if (key === 'canvas') {\n this.canvas instanceof Canvas &&\n this.canvas.textEditingManager.remove(this);\n value instanceof Canvas && value.textEditingManager.add(this);\n }\n return super._set(key, value);\n }\n\n /**\n * Sets selection start (left boundary of a selection)\n * @param {Number} index Index to set selection start to\n */\n setSelectionStart(index: number) {\n index = Math.max(index, 0);\n this._updateAndFire('selectionStart', index);\n }\n\n /**\n * Sets selection end (right boundary of a selection)\n * @param {Number} index Index to set selection end to\n */\n setSelectionEnd(index: number) {\n index = Math.min(index, this.text.length);\n this._updateAndFire('selectionEnd', index);\n }\n\n /**\n * @private\n * @param {String} property 'selectionStart' or 'selectionEnd'\n * @param {Number} index new position of property\n */\n protected _updateAndFire(\n property: 'selectionStart' | 'selectionEnd',\n index: number,\n ) {\n if (this[property] !== index) {\n this._fireSelectionChanged();\n this[property] = index;\n }\n this._updateTextarea();\n }\n\n /**\n * Fires the even of selection changed\n * @private\n */\n _fireSelectionChanged() {\n this.fire('selection:changed');\n this.canvas && this.canvas.fire('text:selection:changed', { target: this });\n }\n\n /**\n * Initialize text dimensions. Render all text on given context\n * or on a offscreen canvas to get the text width with measureText.\n * Updates this.width and this.height with the proper values.\n * Does not return dimensions.\n * @private\n */\n initDimensions() {\n this.isEditing && this.initDelayedCursor();\n super.initDimensions();\n }\n\n /**\n * Gets style of a current selection/cursor (at the start position)\n * if startIndex or endIndex are not provided, selectionStart or selectionEnd will be used.\n * @param {Number} startIndex Start index to get styles at\n * @param {Number} endIndex End index to get styles at, if not specified selectionEnd or startIndex + 1\n * @param {Boolean} [complete] get full style or not\n * @return {Array} styles an array with one, zero or more Style objects\n */\n getSelectionStyles(\n startIndex: number = this.selectionStart || 0,\n endIndex: number = this.selectionEnd,\n complete?: boolean,\n ) {\n return super.getSelectionStyles(startIndex, endIndex, complete);\n }\n\n /**\n * Sets style of a current selection, if no selection exist, do not set anything.\n * @param {Object} [styles] Styles object\n * @param {Number} [startIndex] Start index to get styles at\n * @param {Number} [endIndex] End index to get styles at, if not specified selectionEnd or startIndex + 1\n */\n setSelectionStyles(\n styles: object,\n startIndex: number = this.selectionStart || 0,\n endIndex: number = this.selectionEnd,\n ) {\n return super.setSelectionStyles(styles, startIndex, endIndex);\n }\n\n /**\n * Returns 2d representation (lineIndex and charIndex) of cursor (or selection start)\n * @param {Number} [selectionStart] Optional index. When not given, current selectionStart is used.\n * @param {Boolean} [skipWrapping] consider the location for unwrapped lines. useful to manage styles.\n */\n get2DCursorLocation(\n selectionStart = this.selectionStart,\n skipWrapping?: boolean,\n ) {\n return super.get2DCursorLocation(selectionStart, skipWrapping);\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n render(ctx: CanvasRenderingContext2D) {\n super.render(ctx);\n // clear the cursorOffsetCache, so we ensure to calculate once per renderCursor\n // the correct position but not at every cursor animation.\n this.cursorOffsetCache = {};\n this.renderCursorOrSelection();\n }\n\n /**\n * @override block cursor/selection logic while rendering the exported canvas\n * @todo this workaround should be replaced with a more robust solution\n */\n toCanvasElement(options?: ObjectToCanvasElementOptions): HTMLCanvasElement {\n const isEditing = this.isEditing;\n this.isEditing = false;\n const canvas = super.toCanvasElement(options);\n this.isEditing = isEditing;\n return canvas;\n }\n\n /**\n * Renders cursor or selection (depending on what exists)\n * it does on the contextTop. If contextTop is not available, do nothing.\n */\n renderCursorOrSelection() {\n if (!this.isEditing || !this.canvas) {\n return;\n }\n const ctx = this.clearContextTop(true);\n if (!ctx) {\n return;\n }\n const boundaries = this._getCursorBoundaries();\n\n const ancestors = this.findAncestorsWithClipPath();\n const hasAncestorsWithClipping = ancestors.length > 0;\n let drawingCtx: CanvasRenderingContext2D = ctx;\n let drawingCanvas: HTMLCanvasElement | undefined = undefined;\n if (hasAncestorsWithClipping) {\n // we have some clipPath, we need to draw the selection on an intermediate layer.\n drawingCanvas = createCanvasElementFor(ctx.canvas);\n drawingCtx = drawingCanvas.getContext('2d')!;\n applyCanvasTransform(drawingCtx, this.canvas);\n const m = this.calcTransformMatrix();\n drawingCtx.transform(m[0], m[1], m[2], m[3], m[4], m[5]);\n }\n\n if (this.selectionStart === this.selectionEnd && !this.inCompositionMode) {\n this.renderCursor(drawingCtx, boundaries);\n } else {\n this.renderSelection(drawingCtx, boundaries);\n }\n\n if (hasAncestorsWithClipping) {\n // we need a neutral context.\n // this won't work for nested clippaths in which a clippath\n // has its own clippath\n for (const ancestor of ancestors) {\n const clipPath = ancestor.clipPath!;\n const clippingCanvas = createCanvasElementFor(ctx.canvas);\n const clippingCtx = clippingCanvas.getContext('2d')!;\n applyCanvasTransform(clippingCtx, this.canvas);\n // position the ctx in the center of the outer ancestor\n if (!clipPath.absolutePositioned) {\n const m = ancestor.calcTransformMatrix();\n clippingCtx.transform(m[0], m[1], m[2], m[3], m[4], m[5]);\n }\n clipPath.transform(clippingCtx);\n // we assign an empty drawing context, we don't plan to have this working for nested clippaths for now\n clipPath.drawObject(clippingCtx, true, {});\n this.drawClipPathOnCache(drawingCtx, clipPath, clippingCanvas);\n }\n }\n\n if (hasAncestorsWithClipping) {\n ctx.setTransform(1, 0, 0, 1, 0, 0);\n ctx.drawImage(drawingCanvas!, 0, 0);\n }\n\n this.canvas.contextTopDirty = true;\n ctx.restore();\n }\n\n /**\n * Finds and returns an array of clip paths that are applied to the parent\n * group(s) of the current FabricObject instance. The object's hierarchy is\n * traversed upwards (from the current object towards the root of the canvas),\n * checking each parent object for the presence of a `clipPath` that is not\n * absolutely positioned.\n */\n findAncestorsWithClipPath(): FabricObject[] {\n const clipPathAncestors: FabricObject[] = [];\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n let obj: FabricObject | undefined = this;\n while (obj) {\n if (obj.clipPath) {\n clipPathAncestors.push(obj);\n }\n obj = obj.parent;\n }\n\n return clipPathAncestors;\n }\n\n /**\n * Returns cursor boundaries (left, top, leftOffset, topOffset)\n * left/top are left/top of entire text box\n * leftOffset/topOffset are offset from that left/top point of a text box\n * @private\n * @param {number} [index] index from start\n * @param {boolean} [skipCaching]\n */\n _getCursorBoundaries(\n index: number = this.selectionStart,\n skipCaching?: boolean,\n ): CursorBoundaries {\n const left = this._getLeftOffset(),\n top = this._getTopOffset(),\n offsets = this._getCursorBoundariesOffsets(index, skipCaching);\n return {\n left: left,\n top: top,\n leftOffset: offsets.left,\n topOffset: offsets.top,\n };\n }\n\n /**\n * Caches and returns cursor left/top offset relative to instance's center point\n * @private\n * @param {number} index index from start\n * @param {boolean} [skipCaching]\n */\n _getCursorBoundariesOffsets(\n index: number,\n skipCaching?: boolean,\n ): { left: number; top: number } {\n if (skipCaching) {\n return this.__getCursorBoundariesOffsets(index);\n }\n if (this.cursorOffsetCache && 'top' in this.cursorOffsetCache) {\n return this.cursorOffsetCache as { left: number; top: number };\n }\n return (this.cursorOffsetCache = this.__getCursorBoundariesOffsets(index));\n }\n\n /**\n * Calculates cursor left/top offset relative to instance's center point\n * @private\n * @param {number} index index from start\n */\n __getCursorBoundariesOffsets(index: number) {\n let topOffset = 0,\n leftOffset = 0;\n const { charIndex, lineIndex } = this.get2DCursorLocation(index);\n\n for (let i = 0; i < lineIndex; i++) {\n topOffset += this.getHeightOfLine(i);\n }\n const lineLeftOffset = this._getLineLeftOffset(lineIndex);\n const bound = this.__charBounds[lineIndex][charIndex];\n bound && (leftOffset = bound.left);\n if (\n this.charSpacing !== 0 &&\n charIndex === this._textLines[lineIndex].length\n ) {\n leftOffset -= this._getWidthOfCharSpacing();\n }\n const boundaries = {\n top: topOffset,\n left: lineLeftOffset + (leftOffset > 0 ? leftOffset : 0),\n };\n if (this.direction === 'rtl') {\n if (\n this.textAlign === RIGHT ||\n this.textAlign === JUSTIFY ||\n this.textAlign === JUSTIFY_RIGHT\n ) {\n boundaries.left *= -1;\n } else if (this.textAlign === LEFT || this.textAlign === JUSTIFY_LEFT) {\n boundaries.left = lineLeftOffset - (leftOffset > 0 ? leftOffset : 0);\n } else if (\n this.textAlign === CENTER ||\n this.textAlign === JUSTIFY_CENTER\n ) {\n boundaries.left = lineLeftOffset - (leftOffset > 0 ? leftOffset : 0);\n }\n }\n return boundaries;\n }\n\n /**\n * Renders cursor on context Top, outside the animation cycle, on request\n * Used for the drag/drop effect.\n * If contextTop is not available, do nothing.\n */\n renderCursorAt(selectionStart: number) {\n this._renderCursor(\n this.canvas!.contextTop,\n this._getCursorBoundaries(selectionStart, true),\n selectionStart,\n );\n }\n\n /**\n * Renders cursor\n * @param {Object} boundaries\n * @param {CanvasRenderingContext2D} ctx transformed context to draw on\n */\n renderCursor(ctx: CanvasRenderingContext2D, boundaries: CursorBoundaries) {\n this._renderCursor(ctx, boundaries, this.selectionStart);\n }\n\n /**\n * Return the data needed to render the cursor for given selection start\n * The left,top are relative to the object, while width and height are prescaled\n * to look think with canvas zoom and object scaling,\n * so they depend on canvas and object scaling\n */\n getCursorRenderingData(\n selectionStart: number = this.selectionStart,\n boundaries: CursorBoundaries = this._getCursorBoundaries(selectionStart),\n ): CursorRenderingData {\n const cursorLocation = this.get2DCursorLocation(selectionStart),\n lineIndex = cursorLocation.lineIndex,\n charIndex =\n cursorLocation.charIndex > 0 ? cursorLocation.charIndex - 1 : 0,\n charHeight = this.getValueOfPropertyAt(lineIndex, charIndex, 'fontSize'),\n multiplier = this.getObjectScaling().x * this.canvas!.getZoom(),\n cursorWidth = this.cursorWidth / multiplier,\n dy = this.getValueOfPropertyAt(lineIndex, charIndex, 'deltaY'),\n topOffset =\n boundaries.topOffset +\n ((1 - this._fontSizeFraction) * this.getHeightOfLine(lineIndex)) /\n this.lineHeight -\n charHeight * (1 - this._fontSizeFraction);\n\n return {\n color:\n this.cursorColor ||\n (this.getValueOfPropertyAt(lineIndex, charIndex, 'fill') as string),\n opacity: this._currentCursorOpacity,\n left: boundaries.left + boundaries.leftOffset - cursorWidth / 2,\n top: topOffset + boundaries.top + dy,\n width: cursorWidth,\n height: charHeight,\n };\n }\n\n /**\n * Render the cursor at the given selectionStart.\n * @param {CanvasRenderingContext2D} ctx transformed context to draw on\n */\n _renderCursor(\n ctx: CanvasRenderingContext2D,\n boundaries: CursorBoundaries,\n selectionStart: number,\n ) {\n const { color, opacity, left, top, width, height } =\n this.getCursorRenderingData(selectionStart, boundaries);\n ctx.fillStyle = color;\n ctx.globalAlpha = opacity;\n ctx.fillRect(left, top, width, height);\n }\n\n /**\n * Renders text selection\n * @param {Object} boundaries Object with left/top/leftOffset/topOffset\n * @param {CanvasRenderingContext2D} ctx transformed context to draw on\n */\n renderSelection(ctx: CanvasRenderingContext2D, boundaries: CursorBoundaries) {\n const selection = {\n selectionStart: this.inCompositionMode\n ? this.hiddenTextarea!.selectionStart\n : this.selectionStart,\n selectionEnd: this.inCompositionMode\n ? this.hiddenTextarea!.selectionEnd\n : this.selectionEnd,\n };\n this._renderSelection(ctx, selection, boundaries);\n }\n\n /**\n * Renders drag start text selection\n */\n renderDragSourceEffect() {\n const dragStartSelection =\n this.draggableTextDelegate.getDragStartSelection()!;\n this._renderSelection(\n this.canvas!.contextTop,\n dragStartSelection,\n this._getCursorBoundaries(dragStartSelection.selectionStart, true),\n );\n }\n\n renderDropTargetEffect(e: DragEvent) {\n const dragSelection = this.getSelectionStartFromPointer(e);\n this.renderCursorAt(dragSelection);\n }\n\n /**\n * Renders text selection\n * @private\n * @param {{ selectionStart: number, selectionEnd: number }} selection\n * @param {Object} boundaries Object with left/top/leftOffset/topOffset\n * @param {CanvasRenderingContext2D} ctx transformed context to draw on\n */\n _renderSelection(\n ctx: CanvasRenderingContext2D,\n selection: { selectionStart: number; selectionEnd: number },\n boundaries: CursorBoundaries,\n ) {\n const selectionStart = selection.selectionStart,\n selectionEnd = selection.selectionEnd,\n isJustify = this.textAlign.includes(JUSTIFY),\n start = this.get2DCursorLocation(selectionStart),\n end = this.get2DCursorLocation(selectionEnd),\n startLine = start.lineIndex,\n endLine = end.lineIndex,\n startChar = start.charIndex < 0 ? 0 : start.charIndex,\n endChar = end.charIndex < 0 ? 0 : end.charIndex;\n\n for (let i = startLine; i <= endLine; i++) {\n const lineOffset = this._getLineLeftOffset(i) || 0;\n let lineHeight = this.getHeightOfLine(i),\n realLineHeight = 0,\n boxStart = 0,\n boxEnd = 0;\n\n if (i === startLine) {\n boxStart = this.__charBounds[startLine][startChar].left;\n }\n if (i >= startLine && i < endLine) {\n boxEnd =\n isJustify && !this.isEndOfWrapping(i)\n ? this.width\n : this.getLineWidth(i) || 5; // WTF is this 5?\n } else if (i === endLine) {\n if (endChar === 0) {\n boxEnd = this.__charBounds[endLine][endChar].left;\n } else {\n const charSpacing = this._getWidthOfCharSpacing();\n boxEnd =\n this.__charBounds[endLine][endChar - 1].left +\n this.__charBounds[endLine][endChar - 1].width -\n charSpacing;\n }\n }\n realLineHeight = lineHeight;\n if (this.lineHeight < 1 || (i === endLine && this.lineHeight > 1)) {\n lineHeight /= this.lineHeight;\n }\n let drawStart = boundaries.left + lineOffset + boxStart,\n drawHeight = lineHeight,\n extraTop = 0;\n const drawWidth = boxEnd - boxStart;\n if (this.inCompositionMode) {\n ctx.fillStyle = this.compositionColor || 'black';\n drawHeight = 1;\n extraTop = lineHeight;\n } else {\n ctx.fillStyle = this.selectionColor;\n }\n if (this.direction === 'rtl') {\n if (\n this.textAlign === RIGHT ||\n this.textAlign === JUSTIFY ||\n this.textAlign === JUSTIFY_RIGHT\n ) {\n drawStart = this.width - drawStart - drawWidth;\n } else if (this.textAlign === LEFT || this.textAlign === JUSTIFY_LEFT) {\n drawStart = boundaries.left + lineOffset - boxEnd;\n } else if (\n this.textAlign === CENTER ||\n this.textAlign === JUSTIFY_CENTER\n ) {\n drawStart = boundaries.left + lineOffset - boxEnd;\n }\n }\n ctx.fillRect(\n drawStart,\n boundaries.top + boundaries.topOffset + extraTop,\n drawWidth,\n drawHeight,\n );\n boundaries.topOffset += realLineHeight;\n }\n }\n\n /**\n * High level function to know the height of the cursor.\n * the currentChar is the one that precedes the cursor\n * Returns fontSize of char at the current cursor\n * Unused from the library, is for the end user\n * @return {Number} Character font size\n */\n getCurrentCharFontSize(): number {\n const cp = this._getCurrentCharIndex();\n return this.getValueOfPropertyAt(cp.l, cp.c, 'fontSize');\n }\n\n /**\n * High level function to know the color of the cursor.\n * the currentChar is the one that precedes the cursor\n * Returns color (fill) of char at the current cursor\n * if the text object has a pattern or gradient for filler, it will return that.\n * Unused by the library, is for the end user\n * @return {String | TFiller} Character color (fill)\n */\n getCurrentCharColor(): string | TFiller | null {\n const cp = this._getCurrentCharIndex();\n return this.getValueOfPropertyAt(cp.l, cp.c, FILL);\n }\n\n /**\n * Returns the cursor position for the getCurrent.. functions\n * @private\n */\n _getCurrentCharIndex() {\n const cursorPosition = this.get2DCursorLocation(this.selectionStart, true),\n charIndex =\n cursorPosition.charIndex > 0 ? cursorPosition.charIndex - 1 : 0;\n return { l: cursorPosition.lineIndex, c: charIndex };\n }\n\n dispose() {\n this.exitEditingImpl();\n this.draggableTextDelegate.dispose();\n super.dispose();\n }\n}\n\nclassRegistry.setClass(IText);\n// legacy\nclassRegistry.setClass(IText, 'i-text');\n","import type { TClassProperties, TOptions } from '../typedefs';\nimport { IText } from './IText/IText';\nimport { classRegistry } from '../ClassRegistry';\nimport { createTextboxDefaultControls } from '../controls/commonControls';\nimport { JUSTIFY } from './Text/constants';\nimport type { TextStyleDeclaration } from './Text/StyledText';\nimport type { SerializedITextProps, ITextProps } from './IText/IText';\nimport type { ITextEvents } from './IText/ITextBehavior';\nimport type { TextLinesInfo } from './Text/Text';\nimport type { Control } from '../controls/Control';\n\n// @TODO: Many things here are configuration related and shouldn't be on the class nor prototype\n// regexes, list of properties that are not suppose to change by instances, magic consts.\n// this will be a separated effort\nexport const textboxDefaultValues: Partial> = {\n minWidth: 20,\n dynamicMinWidth: 2,\n lockScalingFlip: true,\n noScaleCache: false,\n _wordJoiners: /[ \\t\\r]/,\n splitByGrapheme: false,\n};\n\nexport type GraphemeData = {\n wordsData: {\n word: string[];\n width: number;\n }[][];\n largestWordWidth: number;\n};\n\nexport type StyleMap = Record;\n\n// @TODO this is not complete\ninterface UniqueTextboxProps {\n minWidth: number;\n splitByGrapheme: boolean;\n dynamicMinWidth: number;\n _wordJoiners: RegExp;\n}\n\nexport interface SerializedTextboxProps\n extends SerializedITextProps,\n Pick {}\n\nexport interface TextboxProps extends ITextProps, UniqueTextboxProps {}\n\n/**\n * Textbox class, based on IText, allows the user to resize the text rectangle\n * and wraps lines automatically. Textboxes have their Y scaling locked, the\n * user can only change width. Height is adjusted automatically based on the\n * wrapping of lines.\n */\nexport class Textbox<\n Props extends TOptions = Partial,\n SProps extends SerializedTextboxProps = SerializedTextboxProps,\n EventSpec extends ITextEvents = ITextEvents,\n >\n extends IText\n implements UniqueTextboxProps\n{\n /**\n * Minimum width of textbox, in pixels.\n * @type Number\n */\n declare minWidth: number;\n\n /**\n * Minimum calculated width of a textbox, in pixels.\n * fixed to 2 so that an empty textbox cannot go to 0\n * and is still selectable without text.\n * @type Number\n */\n declare dynamicMinWidth: number;\n\n /**\n * Use this boolean property in order to split strings that have no white space concept.\n * this is a cheap way to help with chinese/japanese\n * @type Boolean\n * @since 2.6.0\n */\n declare splitByGrapheme: boolean;\n\n declare _wordJoiners: RegExp;\n\n declare _styleMap: StyleMap;\n\n declare isWrapping: boolean;\n\n static type = 'Textbox';\n\n static textLayoutProperties = [...IText.textLayoutProperties, 'width'];\n\n static ownDefaults = textboxDefaultValues;\n\n static getDefaults(): Record {\n return {\n ...super.getDefaults(),\n ...Textbox.ownDefaults,\n };\n }\n\n /**\n * Constructor\n * @param {String} text Text string\n * @param {Object} [options] Options object\n */\n constructor(text: string, options?: Props) {\n super(text, { ...Textbox.ownDefaults, ...options } as Props);\n }\n\n /**\n * Creates the default control object.\n * If you prefer to have on instance of controls shared among all objects\n * make this function return an empty object and add controls to the ownDefaults object\n */\n static createControls(): { controls: Record } {\n return { controls: createTextboxDefaultControls() };\n }\n\n /**\n * Unlike superclass's version of this function, Textbox does not update\n * its width.\n * @private\n * @override\n */\n initDimensions() {\n if (!this.initialized) {\n return;\n }\n this.isEditing && this.initDelayedCursor();\n this._clearCache();\n // clear dynamicMinWidth as it will be different after we re-wrap line\n this.dynamicMinWidth = 0;\n // wrap lines\n this._styleMap = this._generateStyleMap(this._splitText());\n // if after wrapping, the width is smaller than dynamicMinWidth, change the width and re-wrap\n if (this.dynamicMinWidth > this.width) {\n this._set('width', this.dynamicMinWidth);\n }\n if (this.textAlign.includes(JUSTIFY)) {\n // once text is measured we need to make space fatter to make justified text.\n this.enlargeSpaces();\n }\n // clear cache and re-calculate height\n this.height = this.calcTextHeight();\n }\n\n /**\n * Generate an object that translates the style object so that it is\n * broken up by visual lines (new lines and automatic wrapping).\n * The original text styles object is broken up by actual lines (new lines only),\n * which is only sufficient for Text / IText\n * @private\n */\n _generateStyleMap(textInfo: TextLinesInfo): StyleMap {\n let realLineCount = 0,\n realLineCharCount = 0,\n charCount = 0;\n const map: StyleMap = {};\n\n for (let i = 0; i < textInfo.graphemeLines.length; i++) {\n if (textInfo.graphemeText[charCount] === '\\n' && i > 0) {\n realLineCharCount = 0;\n charCount++;\n realLineCount++;\n } else if (\n !this.splitByGrapheme &&\n this._reSpaceAndTab.test(textInfo.graphemeText[charCount]) &&\n i > 0\n ) {\n // this case deals with space's that are removed from end of lines when wrapping\n realLineCharCount++;\n charCount++;\n }\n\n map[i] = { line: realLineCount, offset: realLineCharCount };\n\n charCount += textInfo.graphemeLines[i].length;\n realLineCharCount += textInfo.graphemeLines[i].length;\n }\n\n return map;\n }\n\n /**\n * Returns true if object has a style property or has it on a specified line\n * @param {Number} lineIndex\n * @return {Boolean}\n */\n styleHas(property: keyof TextStyleDeclaration, lineIndex: number): boolean {\n if (this._styleMap && !this.isWrapping) {\n const map = this._styleMap[lineIndex];\n if (map) {\n lineIndex = map.line;\n }\n }\n return super.styleHas(property, lineIndex);\n }\n\n /**\n * Returns true if object has no styling or no styling in a line\n * @param {Number} lineIndex , lineIndex is on wrapped lines.\n * @return {Boolean}\n */\n isEmptyStyles(lineIndex: number): boolean {\n if (!this.styles) {\n return true;\n }\n let offset = 0,\n nextLineIndex = lineIndex + 1,\n nextOffset: number,\n shouldLimit = false;\n const map = this._styleMap[lineIndex],\n mapNextLine = this._styleMap[lineIndex + 1];\n if (map) {\n lineIndex = map.line;\n offset = map.offset;\n }\n if (mapNextLine) {\n nextLineIndex = mapNextLine.line;\n shouldLimit = nextLineIndex === lineIndex;\n nextOffset = mapNextLine.offset;\n }\n const obj =\n typeof lineIndex === 'undefined'\n ? this.styles\n : { line: this.styles[lineIndex] };\n for (const p1 in obj) {\n for (const p2 in obj[p1]) {\n const p2Number = parseInt(p2, 10);\n if (p2Number >= offset && (!shouldLimit || p2Number < nextOffset!)) {\n for (const p3 in obj[p1][p2]) {\n return false;\n }\n }\n }\n }\n return true;\n }\n\n /**\n * @protected\n * @param {Number} lineIndex\n * @param {Number} charIndex\n * @return {TextStyleDeclaration} a style object reference to the existing one or a new empty object when undefined\n */\n _getStyleDeclaration(\n lineIndex: number,\n charIndex: number,\n ): TextStyleDeclaration {\n if (this._styleMap && !this.isWrapping) {\n const map = this._styleMap[lineIndex];\n if (!map) {\n return {};\n }\n lineIndex = map.line;\n charIndex = map.offset + charIndex;\n }\n return super._getStyleDeclaration(lineIndex, charIndex);\n }\n\n /**\n * @param {Number} lineIndex\n * @param {Number} charIndex\n * @param {Object} style\n * @private\n */\n protected _setStyleDeclaration(\n lineIndex: number,\n charIndex: number,\n style: object,\n ) {\n const map = this._styleMap[lineIndex];\n super._setStyleDeclaration(map.line, map.offset + charIndex, style);\n }\n\n /**\n * @param {Number} lineIndex\n * @param {Number} charIndex\n * @private\n */\n protected _deleteStyleDeclaration(lineIndex: number, charIndex: number) {\n const map = this._styleMap[lineIndex];\n super._deleteStyleDeclaration(map.line, map.offset + charIndex);\n }\n\n /**\n * probably broken need a fix\n * Returns the real style line that correspond to the wrapped lineIndex line\n * Used just to verify if the line does exist or not.\n * @param {Number} lineIndex\n * @returns {Boolean} if the line exists or not\n * @private\n */\n protected _getLineStyle(lineIndex: number): boolean {\n const map = this._styleMap[lineIndex];\n return !!this.styles[map.line];\n }\n\n /**\n * Set the line style to an empty object so that is initialized\n * @param {Number} lineIndex\n * @param {Object} style\n * @private\n */\n protected _setLineStyle(lineIndex: number) {\n const map = this._styleMap[lineIndex];\n super._setLineStyle(map.line);\n }\n\n /**\n * Wraps text using the 'width' property of Textbox. First this function\n * splits text on newlines, so we preserve newlines entered by the user.\n * Then it wraps each line using the width of the Textbox by calling\n * _wrapLine().\n * @param {Array} lines The string array of text that is split into lines\n * @param {Number} desiredWidth width you want to wrap to\n * @returns {Array} Array of lines\n */\n _wrapText(lines: string[], desiredWidth: number): string[][] {\n this.isWrapping = true;\n // extract all thewords and the widths to optimally wrap lines.\n const data = this.getGraphemeDataForRender(lines);\n const wrapped: string[][] = [];\n for (let i = 0; i < data.wordsData.length; i++) {\n wrapped.push(...this._wrapLine(i, desiredWidth, data));\n }\n this.isWrapping = false;\n return wrapped;\n }\n\n /**\n * For each line of text terminated by an hard line stop,\n * measure each word width and extract the largest word from all.\n * The returned words here are the one that at the end will be rendered.\n * @param {string[]} lines the lines we need to measure\n *\n */\n getGraphemeDataForRender(lines: string[]): GraphemeData {\n const splitByGrapheme = this.splitByGrapheme,\n infix = splitByGrapheme ? '' : ' ';\n\n let largestWordWidth = 0;\n\n const data = lines.map((line, lineIndex) => {\n let offset = 0;\n const wordsOrGraphemes = splitByGrapheme\n ? this.graphemeSplit(line)\n : this.wordSplit(line);\n\n if (wordsOrGraphemes.length === 0) {\n return [{ word: [], width: 0 }];\n }\n\n return wordsOrGraphemes.map((word: string) => {\n // if using splitByGrapheme words are already in graphemes.\n const graphemeArray = splitByGrapheme\n ? [word]\n : this.graphemeSplit(word);\n const width = this._measureWord(graphemeArray, lineIndex, offset);\n largestWordWidth = Math.max(width, largestWordWidth);\n offset += graphemeArray.length + infix.length;\n return { word: graphemeArray, width };\n });\n });\n\n return {\n wordsData: data,\n largestWordWidth,\n };\n }\n\n /**\n * Helper function to measure a string of text, given its lineIndex and charIndex offset\n * It gets called when charBounds are not available yet.\n * Override if necessary\n * Use with {@link Textbox#wordSplit}\n *\n * @param {CanvasRenderingContext2D} ctx\n * @param {String} text\n * @param {number} lineIndex\n * @param {number} charOffset\n * @returns {number}\n */\n _measureWord(word: string[], lineIndex: number, charOffset = 0): number {\n let width = 0,\n prevGrapheme;\n const skipLeft = true;\n for (let i = 0, len = word.length; i < len; i++) {\n const box = this._getGraphemeBox(\n word[i],\n lineIndex,\n i + charOffset,\n prevGrapheme,\n skipLeft,\n );\n width += box.kernedWidth;\n prevGrapheme = word[i];\n }\n return width;\n }\n\n /**\n * Override this method to customize word splitting\n * Use with {@link Textbox#_measureWord}\n * @param {string} value\n * @returns {string[]} array of words\n */\n wordSplit(value: string): string[] {\n return value.split(this._wordJoiners);\n }\n\n /**\n * Wraps a line of text using the width of the Textbox as desiredWidth\n * and leveraging the known width o words from GraphemeData\n * @private\n * @param {Number} lineIndex\n * @param {Number} desiredWidth width you want to wrap the line to\n * @param {GraphemeData} graphemeData an object containing all the lines' words width.\n * @param {Number} reservedSpace space to remove from wrapping for custom functionalities\n * @returns {Array} Array of line(s) into which the given text is wrapped\n * to.\n */\n _wrapLine(\n lineIndex: number,\n desiredWidth: number,\n { largestWordWidth, wordsData }: GraphemeData,\n reservedSpace = 0,\n ): string[][] {\n const additionalSpace = this._getWidthOfCharSpacing(),\n splitByGrapheme = this.splitByGrapheme,\n graphemeLines = [],\n infix = splitByGrapheme ? '' : ' ';\n\n let lineWidth = 0,\n line: string[] = [],\n // spaces in different languages?\n offset = 0,\n infixWidth = 0,\n lineJustStarted = true;\n\n desiredWidth -= reservedSpace;\n\n const maxWidth = Math.max(\n desiredWidth,\n largestWordWidth,\n this.dynamicMinWidth,\n );\n // layout words\n const data = wordsData[lineIndex];\n offset = 0;\n let i;\n for (i = 0; i < data.length; i++) {\n const { word, width: wordWidth } = data[i];\n offset += word.length;\n\n lineWidth += infixWidth + wordWidth - additionalSpace;\n if (lineWidth > maxWidth && !lineJustStarted) {\n graphemeLines.push(line);\n line = [];\n lineWidth = wordWidth;\n lineJustStarted = true;\n } else {\n lineWidth += additionalSpace;\n }\n\n if (!lineJustStarted && !splitByGrapheme) {\n line.push(infix);\n }\n line = line.concat(word);\n\n infixWidth = splitByGrapheme\n ? 0\n : this._measureWord([infix], lineIndex, offset);\n offset++;\n lineJustStarted = false;\n }\n\n i && graphemeLines.push(line);\n\n // TODO: this code is probably not necessary anymore.\n // it can be moved out of this function since largestWordWidth is now\n // known in advance\n if (largestWordWidth + reservedSpace > this.dynamicMinWidth) {\n this.dynamicMinWidth = largestWordWidth - additionalSpace + reservedSpace;\n }\n return graphemeLines;\n }\n\n /**\n * Detect if the text line is ended with an hard break\n * text and itext do not have wrapping, return false\n * @param {Number} lineIndex text to split\n * @return {Boolean}\n */\n isEndOfWrapping(lineIndex: number): boolean {\n if (!this._styleMap[lineIndex + 1]) {\n // is last line, return true;\n return true;\n }\n if (this._styleMap[lineIndex + 1].line !== this._styleMap[lineIndex].line) {\n // this is last line before a line break, return true;\n return true;\n }\n return false;\n }\n\n /**\n * Detect if a line has a linebreak and so we need to account for it when moving\n * and counting style.\n * This is important only for splitByGrapheme at the end of wrapping.\n * If we are not wrapping the offset is always 1\n * @return Number\n */\n missingNewlineOffset(lineIndex: number, skipWrapping?: boolean): 0 | 1 {\n if (this.splitByGrapheme && !skipWrapping) {\n return this.isEndOfWrapping(lineIndex) ? 1 : 0;\n }\n return 1;\n }\n\n /**\n * Gets lines of text to render in the Textbox. This function calculates\n * text wrapping on the fly every time it is called.\n * @param {String} text text to split\n * @returns {Array} Array of lines in the Textbox.\n * @override\n */\n _splitTextIntoLines(text: string) {\n const newText = super._splitTextIntoLines(text),\n graphemeLines = this._wrapText(newText.lines, this.width),\n lines = new Array(graphemeLines.length);\n for (let i = 0; i < graphemeLines.length; i++) {\n lines[i] = graphemeLines[i].join('');\n }\n newText.lines = lines;\n newText.graphemeLines = graphemeLines;\n return newText;\n }\n\n getMinWidth() {\n return Math.max(this.minWidth, this.dynamicMinWidth);\n }\n\n _removeExtraneousStyles() {\n const linesToKeep = new Map();\n for (const prop in this._styleMap) {\n const propNumber = parseInt(prop, 10);\n if (this._textLines[propNumber]) {\n const lineIndex = this._styleMap[prop].line;\n linesToKeep.set(`${lineIndex}`, true);\n }\n }\n for (const prop in this.styles) {\n if (!linesToKeep.has(prop)) {\n delete this.styles[prop];\n }\n }\n }\n\n /**\n * Returns object representation of an instance\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} object representation of an instance\n */\n toObject<\n T extends Omit, keyof SProps>,\n K extends keyof T = never,\n >(propertiesToInclude: K[] = []): Pick & SProps {\n return super.toObject([\n 'minWidth',\n 'splitByGrapheme',\n ...propertiesToInclude,\n ] as K[]);\n }\n}\n\nclassRegistry.setClass(Textbox);\n","import { Point } from '../../Point';\nimport type { FabricObject } from '../../shapes/Object/FabricObject';\nimport { makeBoundingBoxFromPoints } from '../../util/misc/boundingBoxFromPoints';\nimport { sendPointToPlane } from '../../util/misc/planeChange';\nimport type { LayoutStrategyResult, StrictLayoutContext } from '../types';\nimport { LayoutStrategy } from './LayoutStrategy';\nimport { getObjectBounds } from './utils';\nimport { classRegistry } from '../../ClassRegistry';\n\n/**\n * Layout will adjust the bounding box to match the clip path bounding box.\n */\nexport class ClipPathLayout extends LayoutStrategy {\n static readonly type = 'clip-path';\n\n shouldPerformLayout(context: StrictLayoutContext): boolean {\n return !!context.target.clipPath && super.shouldPerformLayout(context);\n }\n\n shouldLayoutClipPath() {\n return false;\n }\n\n calcLayoutResult(\n context: StrictLayoutContext,\n objects: FabricObject[],\n ): LayoutStrategyResult | undefined {\n const { target } = context;\n const { clipPath, group } = target;\n if (!clipPath || !this.shouldPerformLayout(context)) {\n return;\n }\n // TODO: remove stroke calculation from this case\n const { width, height } = makeBoundingBoxFromPoints(\n getObjectBounds(target, clipPath as FabricObject),\n );\n const size = new Point(width, height);\n if (clipPath.absolutePositioned) {\n // we want the center point to exist in group's containing plane\n const clipPathCenter = sendPointToPlane(\n clipPath.getRelativeCenterPoint(),\n undefined,\n group ? group.calcTransformMatrix() : undefined,\n );\n return {\n center: clipPathCenter,\n size,\n };\n } else {\n // we want the center point to exist in group's containing plane, so we send it upwards\n const clipPathCenter = clipPath\n .getRelativeCenterPoint()\n .transform(target.calcOwnMatrix(), true);\n if (this.shouldPerformLayout(context)) {\n // the clip path is positioned relative to the group's center which is affected by the bbox\n // so we first calculate the bbox\n const { center = new Point(), correction = new Point() } =\n this.calcBoundingBox(objects, context) || {};\n return {\n center: center.add(clipPathCenter),\n correction: correction.subtract(clipPathCenter),\n size,\n };\n } else {\n return {\n center: target.getRelativeCenterPoint().add(clipPathCenter),\n size,\n };\n }\n }\n }\n}\n\nclassRegistry.setClass(ClipPathLayout);\n","import { Point } from '../../Point';\nimport type {\n InitializationLayoutContext,\n LayoutStrategyResult,\n StrictLayoutContext,\n} from '../types';\nimport { LayoutStrategy } from './LayoutStrategy';\nimport { classRegistry } from '../../ClassRegistry';\n\n/**\n * Layout will keep target's initial size.\n */\nexport class FixedLayout extends LayoutStrategy {\n static readonly type = 'fixed';\n\n /**\n * @override respect target's initial size\n */\n getInitialSize(\n { target }: StrictLayoutContext & InitializationLayoutContext,\n { size }: Pick,\n ): Point {\n return new Point(target.width || size.x, target.height || size.y);\n }\n}\n\nclassRegistry.setClass(FixedLayout);\n","import { LayoutManager } from './LayoutManager';\nimport type { RegistrationContext, StrictLayoutContext } from './types';\nimport type { Group } from '../shapes/Group';\n\n/**\n * Today the LayoutManager class also takes care of subscribing event handlers\n * to update the group layout when the group is interactive and a transform is applied\n * to a child object.\n * The ActiveSelection is never interactive, but it could contain objects from\n * groups that are.\n * The standard LayoutManager would subscribe the children of the activeSelection to\n * perform layout changes to the active selection itself, what we need instead is that\n * the transformation applied to the active selection will trigger changes to the\n * original group of the children ( the one referenced under the parent property )\n * This subclass of the LayoutManager has a single duty to fill the gap of this difference.`\n */\nexport class ActiveSelectionLayoutManager extends LayoutManager {\n subscribeTargets(\n context: RegistrationContext & Partial,\n ): void {\n const activeSelection = context.target;\n const parents = context.targets.reduce((parents, target) => {\n target.parent && parents.add(target.parent);\n return parents;\n }, new Set());\n parents.forEach((parent) => {\n parent.layoutManager.subscribeTargets({\n target: parent,\n targets: [activeSelection],\n });\n });\n }\n\n /**\n * unsubscribe from parent only if all its children were deselected\n */\n unsubscribeTargets(\n context: RegistrationContext & Partial,\n ): void {\n const activeSelection = context.target;\n const selectedObjects = activeSelection.getObjects();\n const parents = context.targets.reduce((parents, target) => {\n target.parent && parents.add(target.parent);\n return parents;\n }, new Set());\n parents.forEach((parent) => {\n !selectedObjects.some((object) => object.parent === parent) &&\n parent.layoutManager.unsubscribeTargets({\n target: parent,\n targets: [activeSelection],\n });\n });\n }\n}\n","import type { ControlRenderingStyleOverride } from '../controls/controlRendering';\nimport { classRegistry } from '../ClassRegistry';\nimport type { GroupProps } from './Group';\nimport { Group } from './Group';\nimport type { FabricObject } from './Object/FabricObject';\nimport {\n LAYOUT_TYPE_ADDED,\n LAYOUT_TYPE_REMOVED,\n} from '../LayoutManager/constants';\nimport type { TClassProperties } from '../typedefs';\nimport { log } from '../util/internals/console';\nimport { ActiveSelectionLayoutManager } from '../LayoutManager/ActiveSelectionLayoutManager';\n\nexport type MultiSelectionStacking = 'canvas-stacking' | 'selection-order';\n\nexport interface ActiveSelectionOptions extends GroupProps {\n multiSelectionStacking: MultiSelectionStacking;\n}\n\nconst activeSelectionDefaultValues: Partial> =\n {\n multiSelectionStacking: 'canvas-stacking',\n };\n\n/**\n * Used by Canvas to manage selection.\n *\n * @example\n * class MyActiveSelection extends ActiveSelection {\n * ...\n * }\n *\n * // override the default `ActiveSelection` class\n * classRegistry.setClass(MyActiveSelection)\n */\nexport class ActiveSelection extends Group {\n static type = 'ActiveSelection';\n\n static ownDefaults: Record = activeSelectionDefaultValues;\n\n static getDefaults(): Record {\n return { ...super.getDefaults(), ...ActiveSelection.ownDefaults };\n }\n\n /**\n * The ActiveSelection needs to use the ActiveSelectionLayoutManager\n * or selections on interactive groups may be broken\n */\n declare layoutManager: ActiveSelectionLayoutManager;\n\n /**\n * controls how selected objects are added during a multiselection event\n * - `canvas-stacking` adds the selected object to the active selection while respecting canvas object stacking order\n * - `selection-order` adds the selected object to the top of the stack,\n * meaning that the stack is ordered by the order in which objects were selected\n * @default `canvas-stacking`\n */\n declare multiSelectionStacking: MultiSelectionStacking;\n\n constructor(\n objects: FabricObject[] = [],\n options: Partial = {},\n ) {\n super();\n Object.assign(this, ActiveSelection.ownDefaults);\n this.setOptions(options);\n const { left, top, layoutManager } = options;\n this.groupInit(objects, {\n left,\n top,\n layoutManager: layoutManager ?? new ActiveSelectionLayoutManager(),\n });\n }\n\n /**\n * @private\n */\n _shouldSetNestedCoords() {\n return true;\n }\n\n /**\n * @private\n * @override we don't want the selection monitor to be active\n */\n __objectSelectionMonitor() {\n // noop\n }\n\n /**\n * Adds objects with respect to {@link multiSelectionStacking}\n * @param targets object to add to selection\n */\n multiSelectAdd(...targets: FabricObject[]) {\n if (this.multiSelectionStacking === 'selection-order') {\n this.add(...targets);\n } else {\n // respect object stacking as it is on canvas\n // perf enhancement for large ActiveSelection: consider a binary search of `isInFrontOf`\n targets.forEach((target) => {\n const index = this._objects.findIndex((obj) => obj.isInFrontOf(target));\n const insertAt =\n index === -1\n ? // `target` is in front of all other objects\n this.size()\n : index;\n this.insertAt(insertAt, target);\n });\n }\n }\n\n /**\n * @override block ancestors/descendants of selected objects from being selected to prevent a circular object tree\n */\n canEnterGroup(object: FabricObject) {\n if (\n this.getObjects().some(\n (o) => o.isDescendantOf(object) || object.isDescendantOf(o),\n )\n ) {\n // prevent circular object tree\n log(\n 'error',\n 'ActiveSelection: circular object trees are not supported, this call has no effect',\n );\n return false;\n }\n\n return super.canEnterGroup(object);\n }\n\n /**\n * Change an object so that it can be part of an active selection.\n * this method is called by multiselectAdd from canvas code.\n * @private\n * @param {FabricObject} object\n * @param {boolean} [removeParentTransform] true if object is in canvas coordinate plane\n */\n enterGroup(object: FabricObject, removeParentTransform?: boolean) {\n // This condition check that the object has currently a group, and the group\n // is also its parent, meaning that is not in an active selection, but is\n // in a normal group.\n if (object.parent && object.parent === object.group) {\n // Disconnect the object from the group functionalities, but keep the ref parent intact\n // for later re-enter\n object.parent._exitGroup(object);\n // in this case the object is probably inside an active selection.\n } else if (object.group && object.parent !== object.group) {\n // in this case group.remove will also clear the old parent reference.\n object.group.remove(object);\n }\n // enter the active selection from a render perspective\n // the object will be in the objects array of both the ActiveSelection and the Group\n // but referenced in the group's _activeObjects so that it won't be rendered twice.\n this._enterGroup(object, removeParentTransform);\n }\n\n /**\n * we want objects to retain their canvas ref when exiting instance\n * @private\n * @param {FabricObject} object\n * @param {boolean} [removeParentTransform] true if object should exit group without applying group's transform to it\n */\n exitGroup(object: FabricObject, removeParentTransform?: boolean) {\n this._exitGroup(object, removeParentTransform);\n // return to parent\n object.parent && object.parent._enterGroup(object, true);\n }\n\n /**\n * @private\n * @param {'added'|'removed'} type\n * @param {FabricObject[]} targets\n */\n _onAfterObjectsChange(type: 'added' | 'removed', targets: FabricObject[]) {\n super._onAfterObjectsChange(type, targets);\n const groups = new Set();\n targets.forEach((object) => {\n const { parent } = object;\n parent && groups.add(parent);\n });\n if (type === LAYOUT_TYPE_REMOVED) {\n // invalidate groups' layout and mark as dirty\n groups.forEach((group) => {\n group._onAfterObjectsChange(LAYOUT_TYPE_ADDED, targets);\n });\n } else {\n // mark groups as dirty\n groups.forEach((group) => {\n group._set('dirty', true);\n });\n }\n }\n\n /**\n * @override remove all objects\n */\n onDeselect() {\n this.removeAll();\n return false;\n }\n\n /**\n * Returns string representation of a group\n * @return {String}\n */\n toString() {\n return `#`;\n }\n\n /**\n * Decide if the object should cache or not. The Active selection never caches\n * @return {Boolean}\n */\n shouldCache() {\n return false;\n }\n\n /**\n * Check if this group or its parent group are caching, recursively up\n * @return {Boolean}\n */\n isOnACache() {\n return false;\n }\n\n /**\n * Renders controls and borders for the object\n * @param {CanvasRenderingContext2D} ctx Context to render on\n * @param {Object} [styleOverride] properties to override the object style\n * @param {Object} [childrenOverride] properties to override the children overrides\n */\n _renderControls(\n ctx: CanvasRenderingContext2D,\n styleOverride?: ControlRenderingStyleOverride,\n childrenOverride?: ControlRenderingStyleOverride,\n ) {\n ctx.save();\n ctx.globalAlpha = this.isMoving ? this.borderOpacityWhenMoving : 1;\n const options = {\n hasControls: false,\n ...childrenOverride,\n forActiveSelection: true,\n };\n for (let i = 0; i < this._objects.length; i++) {\n this._objects[i]._renderControls(ctx, options);\n }\n super._renderControls(ctx, styleOverride);\n ctx.restore();\n }\n}\n\nclassRegistry.setClass(ActiveSelection);\nclassRegistry.setClass(ActiveSelection, 'activeSelection');\n","/**\n * Canvas 2D filter backend.\n */\nimport type { BaseFilter } from './BaseFilter';\nimport type { T2DPipelineState, TPipelineResources } from './typedefs';\n\nexport class Canvas2dFilterBackend {\n /**\n * Experimental. This object is a sort of repository of help layers used to avoid\n * of recreating them during frequent filtering. If you are previewing a filter with\n * a slider you probably do not want to create help layers every filter step.\n * in this object there will be appended some canvases, created once, resized sometimes\n * cleared never. Clearing is left to the developer.\n **/\n resources: TPipelineResources = {};\n\n /**\n * Apply a set of filters against a source image and draw the filtered output\n * to the provided destination canvas.\n *\n * @param {EnhancedFilter} filters The filter to apply.\n * @param {HTMLImageElement|HTMLCanvasElement} sourceElement The source to be filtered.\n * @param {Number} sourceWidth The width of the source input.\n * @param {Number} sourceHeight The height of the source input.\n * @param {HTMLCanvasElement} targetCanvas The destination for filtered output to be drawn.\n */\n applyFilters(\n filters: BaseFilter>[],\n sourceElement: CanvasImageSource,\n sourceWidth: number,\n sourceHeight: number,\n targetCanvas: HTMLCanvasElement,\n ): T2DPipelineState | void {\n const ctx = targetCanvas.getContext('2d', {\n willReadFrequently: true,\n desynchronized: true,\n });\n if (!ctx) {\n return;\n }\n ctx.drawImage(sourceElement, 0, 0, sourceWidth, sourceHeight);\n const imageData = ctx.getImageData(0, 0, sourceWidth, sourceHeight);\n const originalImageData = ctx.getImageData(0, 0, sourceWidth, sourceHeight);\n const pipelineState: T2DPipelineState = {\n sourceWidth,\n sourceHeight,\n imageData,\n originalEl: sourceElement,\n originalImageData,\n canvasEl: targetCanvas,\n ctx,\n filterBackend: this,\n };\n filters.forEach((filter) => {\n filter.applyTo(pipelineState);\n });\n const { imageData: imageDataPostFilter } = pipelineState;\n if (\n imageDataPostFilter.width !== sourceWidth ||\n imageDataPostFilter.height !== sourceHeight\n ) {\n targetCanvas.width = imageDataPostFilter.width;\n targetCanvas.height = imageDataPostFilter.height;\n }\n ctx.putImageData(imageDataPostFilter, 0, 0);\n return pipelineState;\n }\n}\n","import { config } from '../config';\nimport { createCanvasElementFor } from '../util/misc/dom';\nimport type {\n TWebGLPipelineState,\n TProgramCache,\n TTextureCache,\n TPipelineResources,\n} from './typedefs';\nimport type { BaseFilter } from './BaseFilter';\n\nexport class WebGLFilterBackend {\n declare tileSize: number;\n\n /**\n * Define ...\n **/\n aPosition: Float32Array = new Float32Array([0, 0, 0, 1, 1, 0, 1, 1]);\n\n /**\n * If GLPut data is the fastest operation, or if forced, this buffer will be used\n * to transfer the data back in the 2d logic\n **/\n declare imageBuffer?: ArrayBuffer;\n\n declare canvas: HTMLCanvasElement;\n\n /**\n * The Webgl context that will execute the operations for filtering\n **/\n declare gl: WebGLRenderingContext;\n\n /**\n * Keyed map for shader cache\n **/\n declare programCache: TProgramCache;\n\n /**\n * Keyed map for texture cache\n **/\n declare textureCache: TTextureCache;\n\n /**\n * Contains GPU info for debug\n **/\n declare gpuInfo: any;\n\n /**\n * Experimental. This object is a sort of repository of help layers used to avoid\n * of recreating them during frequent filtering. If you are previewing a filter with\n * a slider you probably do not want to create help layers every filter step.\n * in this object there will be appended some canvases, created once, resized sometimes\n * cleared never. Clearing is left to the developer.\n **/\n resources: TPipelineResources = {};\n\n constructor({ tileSize = config.textureSize } = {}) {\n this.tileSize = tileSize;\n this.setupGLContext(tileSize, tileSize);\n this.captureGPUInfo();\n }\n\n /**\n * Setup a WebGL context suitable for filtering, and bind any needed event handlers.\n */\n setupGLContext(width: number, height: number): void {\n this.dispose();\n this.createWebGLCanvas(width, height);\n }\n\n /**\n * Create a canvas element and associated WebGL context and attaches them as\n * class properties to the GLFilterBackend class.\n */\n createWebGLCanvas(width: number, height: number): void {\n const canvas = createCanvasElementFor({ width, height });\n const glOptions = {\n alpha: true,\n premultipliedAlpha: false,\n depth: false,\n stencil: false,\n antialias: false,\n },\n gl = canvas.getContext('webgl', glOptions) as WebGLRenderingContext;\n\n if (!gl) {\n return;\n }\n gl.clearColor(0, 0, 0, 0);\n // this canvas can fire webglcontextlost and webglcontextrestored\n this.canvas = canvas;\n this.gl = gl;\n }\n\n /**\n * Attempts to apply the requested filters to the source provided, drawing the filtered output\n * to the provided target canvas.\n *\n * @param {Array} filters The filters to apply.\n * @param {TexImageSource} source The source to be filtered.\n * @param {Number} width The width of the source input.\n * @param {Number} height The height of the source input.\n * @param {HTMLCanvasElement} targetCanvas The destination for filtered output to be drawn.\n * @param {String|undefined} cacheKey A key used to cache resources related to the source. If\n * omitted, caching will be skipped.\n */\n applyFilters(\n filters: BaseFilter>[],\n source: TexImageSource,\n width: number,\n height: number,\n targetCanvas: HTMLCanvasElement,\n cacheKey?: string,\n ): TWebGLPipelineState | undefined {\n const gl = this.gl;\n const ctx = targetCanvas.getContext('2d');\n if (!gl || !ctx) {\n return;\n }\n let cachedTexture;\n if (cacheKey) {\n cachedTexture = this.getCachedTexture(cacheKey, source);\n }\n const pipelineState: TWebGLPipelineState = {\n originalWidth:\n (source as HTMLImageElement).width ||\n (source as HTMLImageElement).naturalWidth ||\n 0,\n originalHeight:\n (source as HTMLImageElement).height ||\n (source as HTMLImageElement).naturalHeight ||\n 0,\n sourceWidth: width,\n sourceHeight: height,\n destinationWidth: width,\n destinationHeight: height,\n context: gl,\n sourceTexture: this.createTexture(\n gl,\n width,\n height,\n !cachedTexture ? source : undefined,\n ),\n targetTexture: this.createTexture(gl, width, height),\n originalTexture:\n cachedTexture ||\n this.createTexture(\n gl,\n width,\n height,\n !cachedTexture ? source : undefined,\n ),\n passes: filters.length,\n webgl: true,\n aPosition: this.aPosition,\n programCache: this.programCache,\n pass: 0,\n filterBackend: this,\n targetCanvas: targetCanvas,\n };\n const tempFbo = gl.createFramebuffer();\n gl.bindFramebuffer(gl.FRAMEBUFFER, tempFbo);\n filters.forEach((filter: any) => {\n filter && filter.applyTo(pipelineState);\n });\n resizeCanvasIfNeeded(pipelineState);\n this.copyGLTo2D(gl, pipelineState);\n gl.bindTexture(gl.TEXTURE_2D, null);\n gl.deleteTexture(pipelineState.sourceTexture);\n gl.deleteTexture(pipelineState.targetTexture);\n gl.deleteFramebuffer(tempFbo);\n ctx.setTransform(1, 0, 0, 1, 0, 0);\n return pipelineState;\n }\n\n /**\n * Detach event listeners, remove references, and clean up caches.\n */\n dispose() {\n if (this.canvas) {\n // we are disposing, we don't care about the fact\n // that the canvas shouldn't be null.\n // @ts-expect-error disposing\n this.canvas = null;\n // @ts-expect-error disposing\n this.gl = null;\n }\n this.clearWebGLCaches();\n }\n\n /**\n * Wipe out WebGL-related caches.\n */\n clearWebGLCaches() {\n this.programCache = {};\n this.textureCache = {};\n }\n\n /**\n * Create a WebGL texture object.\n *\n * Accepts specific dimensions to initialize the texture to or a source image.\n *\n * @param {WebGLRenderingContext} gl The GL context to use for creating the texture.\n * @param {number} width The width to initialize the texture at.\n * @param {number} height The height to initialize the texture.\n * @param {TexImageSource} textureImageSource A source for the texture data.\n * @param {number} filter gl.NEAREST default or gl.LINEAR filters for the texture.\n * This filter is very useful for LUTs filters. If you need interpolation use gl.LINEAR\n * @returns {WebGLTexture}\n */\n createTexture(\n gl: WebGLRenderingContext,\n width: number,\n height: number,\n textureImageSource?: TexImageSource,\n filter?:\n | WebGLRenderingContextBase['NEAREST']\n | WebGLRenderingContextBase['LINEAR'],\n ): WebGLTexture {\n const {\n NEAREST,\n TEXTURE_2D,\n RGBA,\n UNSIGNED_BYTE,\n CLAMP_TO_EDGE,\n TEXTURE_MAG_FILTER,\n TEXTURE_MIN_FILTER,\n TEXTURE_WRAP_S,\n TEXTURE_WRAP_T,\n } = gl;\n const texture = gl.createTexture();\n gl.bindTexture(TEXTURE_2D, texture);\n gl.texParameteri(TEXTURE_2D, TEXTURE_MAG_FILTER, filter || NEAREST);\n gl.texParameteri(TEXTURE_2D, TEXTURE_MIN_FILTER, filter || NEAREST);\n gl.texParameteri(TEXTURE_2D, TEXTURE_WRAP_S, CLAMP_TO_EDGE);\n gl.texParameteri(TEXTURE_2D, TEXTURE_WRAP_T, CLAMP_TO_EDGE);\n if (textureImageSource) {\n gl.texImage2D(\n TEXTURE_2D,\n 0,\n RGBA,\n RGBA,\n UNSIGNED_BYTE,\n textureImageSource,\n );\n } else {\n gl.texImage2D(\n TEXTURE_2D,\n 0,\n RGBA,\n width,\n height,\n 0,\n RGBA,\n UNSIGNED_BYTE,\n null,\n );\n }\n // disabled because website and issues with different typescript version\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion\n return texture!;\n }\n\n /**\n * Can be optionally used to get a texture from the cache array\n *\n * If an existing texture is not found, a new texture is created and cached.\n *\n * @param {String} uniqueId A cache key to use to find an existing texture.\n * @param {HTMLImageElement|HTMLCanvasElement} textureImageSource A source to use to create the\n * texture cache entry if one does not already exist.\n */\n getCachedTexture(\n uniqueId: string,\n textureImageSource: TexImageSource,\n filter?:\n | WebGLRenderingContextBase['NEAREST']\n | WebGLRenderingContextBase['LINEAR'],\n ): WebGLTexture | null {\n const { textureCache } = this;\n if (textureCache[uniqueId]) {\n return textureCache[uniqueId];\n } else {\n const texture = this.createTexture(\n this.gl,\n (textureImageSource as HTMLImageElement).width,\n (textureImageSource as HTMLImageElement).height,\n textureImageSource,\n filter,\n );\n if (texture) {\n textureCache[uniqueId] = texture;\n }\n return texture;\n }\n }\n\n /**\n * Clear out cached resources related to a source image that has been\n * filtered previously.\n *\n * @param {String} cacheKey The cache key provided when the source image was filtered.\n */\n evictCachesForKey(cacheKey: string) {\n if (this.textureCache[cacheKey]) {\n this.gl.deleteTexture(this.textureCache[cacheKey]);\n delete this.textureCache[cacheKey];\n }\n }\n\n /**\n * Copy an input WebGL canvas on to an output 2D canvas.\n *\n * The WebGL canvas is assumed to be upside down, with the top-left pixel of the\n * desired output image appearing in the bottom-left corner of the WebGL canvas.\n *\n * @param {WebGLRenderingContext} sourceContext The WebGL context to copy from.\n * @param {Object} pipelineState The 2D target canvas to copy on to.\n */\n copyGLTo2D(gl: WebGLRenderingContext, pipelineState: TWebGLPipelineState) {\n const glCanvas = gl.canvas,\n targetCanvas = pipelineState.targetCanvas,\n ctx = targetCanvas.getContext('2d');\n if (!ctx) {\n return;\n }\n ctx.translate(0, targetCanvas.height); // move it down again\n ctx.scale(1, -1); // vertical flip\n // where is my image on the big glcanvas?\n const sourceY = glCanvas.height - targetCanvas.height;\n ctx.drawImage(\n glCanvas,\n 0,\n sourceY,\n targetCanvas.width,\n targetCanvas.height,\n 0,\n 0,\n targetCanvas.width,\n targetCanvas.height,\n );\n }\n\n /**\n * Copy an input WebGL canvas on to an output 2D canvas using 2d canvas' putImageData\n * API. Measurably faster than using ctx.drawImage in Firefox (version 54 on OSX Sierra).\n *\n * @param {WebGLRenderingContext} sourceContext The WebGL context to copy from.\n * @param {HTMLCanvasElement} targetCanvas The 2D target canvas to copy on to.\n * @param {Object} pipelineState The 2D target canvas to copy on to.\n */\n copyGLTo2DPutImageData(\n this: Required,\n gl: WebGLRenderingContext,\n pipelineState: TWebGLPipelineState,\n ) {\n const targetCanvas = pipelineState.targetCanvas,\n ctx = targetCanvas.getContext('2d'),\n dWidth = pipelineState.destinationWidth,\n dHeight = pipelineState.destinationHeight,\n numBytes = dWidth * dHeight * 4;\n if (!ctx) {\n return;\n }\n const u8 = new Uint8Array(this.imageBuffer, 0, numBytes);\n const u8Clamped = new Uint8ClampedArray(this.imageBuffer, 0, numBytes);\n\n gl.readPixels(0, 0, dWidth, dHeight, gl.RGBA, gl.UNSIGNED_BYTE, u8);\n const imgData = new ImageData(u8Clamped, dWidth, dHeight);\n ctx.putImageData(imgData, 0, 0);\n }\n\n /**\n * Attempt to extract GPU information strings from a WebGL context.\n *\n * Useful information when debugging or blacklisting specific GPUs.\n *\n * @returns {Object} A GPU info object with renderer and vendor strings.\n */\n captureGPUInfo() {\n if (this.gpuInfo) {\n return this.gpuInfo;\n }\n const gl = this.gl,\n gpuInfo = { renderer: '', vendor: '' };\n if (!gl) {\n return gpuInfo;\n }\n const ext = gl.getExtension('WEBGL_debug_renderer_info');\n if (ext) {\n const renderer = gl.getParameter(ext.UNMASKED_RENDERER_WEBGL);\n const vendor = gl.getParameter(ext.UNMASKED_VENDOR_WEBGL);\n if (renderer) {\n gpuInfo.renderer = renderer.toLowerCase();\n }\n if (vendor) {\n gpuInfo.vendor = vendor.toLowerCase();\n }\n }\n this.gpuInfo = gpuInfo;\n return gpuInfo;\n }\n}\n\nfunction resizeCanvasIfNeeded(pipelineState: TWebGLPipelineState): void {\n const targetCanvas = pipelineState.targetCanvas,\n width = targetCanvas.width,\n height = targetCanvas.height,\n dWidth = pipelineState.destinationWidth,\n dHeight = pipelineState.destinationHeight;\n\n if (width !== dWidth || height !== dHeight) {\n targetCanvas.width = dWidth;\n targetCanvas.height = dHeight;\n }\n}\n","import { config } from '../config';\nimport { getEnv } from '../env';\nimport { createCanvasElement } from '../util/misc/dom';\nimport { Canvas2dFilterBackend } from './Canvas2dFilterBackend';\nimport { WebGLFilterBackend } from './WebGLFilterBackend';\n\nexport type FilterBackend = WebGLFilterBackend | Canvas2dFilterBackend;\n\nlet filterBackend: FilterBackend;\n\n/**\n * Verifies if it is possible to initialize webgl or fallback on a canvas2d filtering backend\n */\nexport function initFilterBackend(): FilterBackend {\n const { WebGLProbe } = getEnv();\n WebGLProbe.queryWebGL(createCanvasElement());\n if (config.enableGLFiltering && WebGLProbe.isSupported(config.textureSize)) {\n return new WebGLFilterBackend({ tileSize: config.textureSize });\n } else {\n return new Canvas2dFilterBackend();\n }\n}\n\n/**\n * Get the current fabricJS filter backend or initialize one if not available yet\n * @param [strict] pass `true` to create the backend if it wasn't created yet (default behavior),\n * pass `false` to get the backend ref without mutating it\n */\nexport function getFilterBackend(strict = true): FilterBackend {\n if (!filterBackend && strict) {\n filterBackend = initFilterBackend();\n }\n return filterBackend;\n}\n\nexport function setFilterBackend(backend: FilterBackend) {\n filterBackend = backend;\n}\n","import { getFabricDocument, getEnv } from '../env';\nimport type { BaseFilter } from '../filters/BaseFilter';\nimport { getFilterBackend } from '../filters/FilterBackend';\nimport { SHARED_ATTRIBUTES } from '../parser/attributes';\nimport { parseAttributes } from '../parser/parseAttributes';\nimport type {\n TClassProperties,\n TCrossOrigin,\n TSize,\n Abortable,\n TOptions,\n} from '../typedefs';\nimport { uid } from '../util/internals/uid';\nimport { createCanvasElementFor } from '../util/misc/dom';\nimport { findScaleToCover, findScaleToFit } from '../util/misc/findScaleTo';\nimport type { LoadImageOptions } from '../util/misc/objectEnlive';\nimport {\n enlivenObjectEnlivables,\n enlivenObjects,\n loadImage,\n} from '../util/misc/objectEnlive';\nimport { parsePreserveAspectRatioAttribute } from '../util/misc/svgParsing';\nimport { classRegistry } from '../ClassRegistry';\nimport { FabricObject, cacheProperties } from './Object/FabricObject';\nimport type { FabricObjectProps, SerializedObjectProps } from './Object/types';\nimport type { ObjectEvents } from '../EventTypeDefs';\nimport { WebGLFilterBackend } from '../filters/WebGLFilterBackend';\nimport { FILL, NONE } from '../constants';\nimport { getDocumentFromElement } from '../util/dom_misc';\nimport type { CSSRules } from '../parser/typedefs';\nimport type { Resize, ResizeSerializedProps } from '../filters/Resize';\nimport type { TCachedFabricObject } from './Object/Object';\nimport { log } from '../util/internals/console';\n\n// @todo Would be nice to have filtering code not imported directly.\n\nexport type ImageSource =\n | HTMLImageElement\n | HTMLVideoElement\n | HTMLCanvasElement;\n\ninterface UniqueImageProps {\n srcFromAttribute: boolean;\n minimumScaleTrigger: number;\n cropX: number;\n cropY: number;\n imageSmoothing: boolean;\n filters: BaseFilter>[];\n resizeFilter?: Resize;\n}\n\nexport const imageDefaultValues: Partial> = {\n strokeWidth: 0,\n srcFromAttribute: false,\n minimumScaleTrigger: 0.5,\n cropX: 0,\n cropY: 0,\n imageSmoothing: true,\n};\n\nexport interface SerializedImageProps extends SerializedObjectProps {\n src: string;\n crossOrigin: TCrossOrigin;\n filters: any[];\n resizeFilter?: ResizeSerializedProps;\n cropX: number;\n cropY: number;\n}\n\nexport interface ImageProps extends FabricObjectProps, UniqueImageProps {}\n\nconst IMAGE_PROPS = ['cropX', 'cropY'] as const;\n\n/**\n * @see {@link http://fabric5.fabricjs.com/fabric-intro-part-1#images}\n */\nexport class FabricImage<\n Props extends TOptions = Partial,\n SProps extends SerializedImageProps = SerializedImageProps,\n EventSpec extends ObjectEvents = ObjectEvents,\n >\n extends FabricObject\n implements ImageProps\n{\n /**\n * When calling {@link FabricImage.getSrc}, return value from element src with `element.getAttribute('src')`.\n * This allows for relative urls as image src.\n * @since 2.7.0\n * @type Boolean\n * @default false\n */\n declare srcFromAttribute: boolean;\n\n /**\n * private\n * contains last value of scaleX to detect\n * if the Image got resized after the last Render\n * @type Number\n */\n protected _lastScaleX = 1;\n\n /**\n * private\n * contains last value of scaleY to detect\n * if the Image got resized after the last Render\n * @type Number\n */\n protected _lastScaleY = 1;\n\n /**\n * private\n * contains last value of scaling applied by the apply filter chain\n * @type Number\n */\n protected _filterScalingX = 1;\n\n /**\n * private\n * contains last value of scaling applied by the apply filter chain\n * @type Number\n */\n protected _filterScalingY = 1;\n\n /**\n * minimum scale factor under which any resizeFilter is triggered to resize the image\n * 0 will disable the automatic resize. 1 will trigger automatically always.\n * number bigger than 1 are not implemented yet.\n * @type Number\n */\n declare minimumScaleTrigger: number;\n\n /**\n * key used to retrieve the texture representing this image\n * @since 2.0.0\n * @type String\n */\n declare cacheKey: string;\n\n /**\n * Image crop in pixels from original image size.\n * @since 2.0.0\n * @type Number\n */\n declare cropX: number;\n\n /**\n * Image crop in pixels from original image size.\n * @since 2.0.0\n * @type Number\n */\n declare cropY: number;\n\n /**\n * Indicates whether this canvas will use image smoothing when painting this image.\n * Also influence if the cacheCanvas for this image uses imageSmoothing\n * @since 4.0.0-beta.11\n * @type Boolean\n */\n declare imageSmoothing: boolean;\n\n declare preserveAspectRatio: string;\n\n declare protected src: string;\n\n declare filters: BaseFilter>[];\n declare resizeFilter: Resize;\n\n declare _element: ImageSource;\n declare _filteredEl?: HTMLCanvasElement;\n declare _originalElement: ImageSource;\n\n static type = 'Image';\n\n static cacheProperties = [...cacheProperties, ...IMAGE_PROPS];\n\n static ownDefaults = imageDefaultValues;\n\n static getDefaults(): Record {\n return {\n ...super.getDefaults(),\n ...FabricImage.ownDefaults,\n };\n }\n /**\n * Constructor\n * Image can be initialized with any canvas drawable or a string.\n * The string should be a url and will be loaded as an image.\n * Canvas and Image element work out of the box, while videos require extra code to work.\n * Please check video element events for seeking.\n * @param {ImageSource | string} element Image element\n * @param {Object} [options] Options object\n */\n constructor(elementId: string, options?: Props);\n constructor(element: ImageSource, options?: Props);\n constructor(arg0: ImageSource | string, options?: Props) {\n super();\n this.filters = [];\n Object.assign(this, FabricImage.ownDefaults);\n this.setOptions(options);\n this.cacheKey = `texture${uid()}`;\n this.setElement(\n typeof arg0 === 'string'\n ? ((\n (this.canvas && getDocumentFromElement(this.canvas.getElement())) ||\n getFabricDocument()\n ).getElementById(arg0) as ImageSource)\n : arg0,\n options,\n );\n }\n\n /**\n * Returns image element which this instance if based on\n */\n getElement() {\n return this._element;\n }\n\n /**\n * Sets image element for this instance to a specified one.\n * If filters defined they are applied to new image.\n * You might need to call `canvas.renderAll` and `object.setCoords` after replacing, to render new image and update controls area.\n * @param {HTMLImageElement} element\n * @param {Partial} [size] Options object\n */\n setElement(element: ImageSource, size: Partial = {}) {\n this.removeTexture(this.cacheKey);\n this.removeTexture(`${this.cacheKey}_filtered`);\n this._element = element;\n this._originalElement = element;\n this._setWidthHeight(size);\n if (this.filters.length !== 0) {\n this.applyFilters();\n }\n // resizeFilters work on the already filtered copy.\n // we need to apply resizeFilters AFTER normal filters.\n // applyResizeFilters is run more often than normal filters\n // and is triggered by user interactions rather than dev code\n if (this.resizeFilter) {\n this.applyResizeFilters();\n }\n }\n\n /**\n * Delete a single texture if in webgl mode\n */\n removeTexture(key: string) {\n const backend = getFilterBackend(false);\n if (backend instanceof WebGLFilterBackend) {\n backend.evictCachesForKey(key);\n }\n }\n\n /**\n * Delete textures, reference to elements and eventually JSDOM cleanup\n */\n dispose() {\n super.dispose();\n this.removeTexture(this.cacheKey);\n this.removeTexture(`${this.cacheKey}_filtered`);\n this._cacheContext = null;\n (\n ['_originalElement', '_element', '_filteredEl', '_cacheCanvas'] as const\n ).forEach((elementKey) => {\n const el = this[elementKey];\n el && getEnv().dispose(el);\n // @ts-expect-error disposing\n this[elementKey] = undefined;\n });\n }\n\n /**\n * Get the crossOrigin value (of the corresponding image element)\n */\n getCrossOrigin(): string | null {\n return (\n this._originalElement &&\n ((this._originalElement as any).crossOrigin || null)\n );\n }\n\n /**\n * Returns original size of an image\n */\n getOriginalSize() {\n const element = this.getElement() as any;\n if (!element) {\n return {\n width: 0,\n height: 0,\n };\n }\n return {\n width: element.naturalWidth || element.width,\n height: element.naturalHeight || element.height,\n };\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _stroke(ctx: CanvasRenderingContext2D) {\n if (!this.stroke || this.strokeWidth === 0) {\n return;\n }\n const w = this.width / 2,\n h = this.height / 2;\n ctx.beginPath();\n ctx.moveTo(-w, -h);\n ctx.lineTo(w, -h);\n ctx.lineTo(w, h);\n ctx.lineTo(-w, h);\n ctx.lineTo(-w, -h);\n ctx.closePath();\n }\n\n /**\n * Returns object representation of an instance\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} Object representation of an instance\n */\n toObject<\n T extends Omit, keyof SProps>,\n K extends keyof T = never,\n >(propertiesToInclude: K[] = []): Pick & SProps {\n const filters: Record[] = [];\n this.filters.forEach((filterObj) => {\n filterObj && filters.push(filterObj.toObject());\n });\n return {\n ...super.toObject([...IMAGE_PROPS, ...propertiesToInclude]),\n src: this.getSrc(),\n crossOrigin: this.getCrossOrigin(),\n filters,\n ...(this.resizeFilter\n ? { resizeFilter: this.resizeFilter.toObject() }\n : {}),\n };\n }\n\n /**\n * Returns true if an image has crop applied, inspecting values of cropX,cropY,width,height.\n * @return {Boolean}\n */\n hasCrop() {\n return (\n !!this.cropX ||\n !!this.cropY ||\n this.width < this._element.width ||\n this.height < this._element.height\n );\n }\n\n /**\n * Returns svg representation of an instance\n * @return {string[]} an array of strings with the specific svg representation\n * of the instance\n */\n _toSVG() {\n const imageMarkup: string[] = [],\n element = this._element,\n x = -this.width / 2,\n y = -this.height / 2;\n let svgString: string[] = [],\n strokeSvg: string[] = [],\n clipPath = '',\n imageRendering = '';\n if (!element) {\n return [];\n }\n if (this.hasCrop()) {\n const clipPathId = uid();\n svgString.push(\n '\\n',\n '\\t\\n',\n '\\n',\n );\n clipPath = ' clip-path=\"url(#imageCrop_' + clipPathId + ')\" ';\n }\n if (!this.imageSmoothing) {\n imageRendering = ' image-rendering=\"optimizeSpeed\"';\n }\n imageMarkup.push(\n '\\t element with actual transformation, then offsetting object to the top/left\n // so that object's center aligns with container's left/top\n }\" width=\"${\n element.width || (element as HTMLImageElement).naturalWidth\n }\" height=\"${\n element.height || (element as HTMLImageElement).naturalHeight\n }\"${imageRendering}${clipPath}>\\n`,\n );\n\n if (this.stroke || this.strokeDashArray) {\n const origFill = this.fill;\n this.fill = null;\n strokeSvg = [\n `\\t\\n`,\n ];\n this.fill = origFill;\n }\n if (this.paintFirst !== FILL) {\n svgString = svgString.concat(strokeSvg, imageMarkup);\n } else {\n svgString = svgString.concat(imageMarkup, strokeSvg);\n }\n return svgString;\n }\n\n /**\n * Returns source of an image\n * @param {Boolean} filtered indicates if the src is needed for svg\n * @return {String} Source of an image\n */\n getSrc(filtered?: boolean): string {\n const element = filtered ? this._element : this._originalElement;\n if (element) {\n if ((element as HTMLCanvasElement).toDataURL) {\n return (element as HTMLCanvasElement).toDataURL();\n }\n\n if (this.srcFromAttribute) {\n return element.getAttribute('src') || '';\n } else {\n return (element as HTMLImageElement).src;\n }\n } else {\n return this.src || '';\n }\n }\n\n /**\n * Alias for getSrc\n * @param filtered\n * @deprecated\n */\n getSvgSrc(filtered?: boolean) {\n return this.getSrc(filtered);\n }\n\n /**\n * Loads and sets source of an image\\\n * **IMPORTANT**: It is recommended to abort loading tasks before calling this method to prevent race conditions and unnecessary networking\n * @param {String} src Source string (URL)\n * @param {LoadImageOptions} [options] Options object\n */\n setSrc(src: string, { crossOrigin, signal }: LoadImageOptions = {}) {\n return loadImage(src, { crossOrigin, signal }).then((img) => {\n typeof crossOrigin !== 'undefined' && this.set({ crossOrigin });\n this.setElement(img);\n });\n }\n\n /**\n * Returns string representation of an instance\n * @return {String} String representation of an instance\n */\n toString() {\n return `#`;\n }\n\n applyResizeFilters() {\n const filter = this.resizeFilter,\n minimumScale = this.minimumScaleTrigger,\n objectScale = this.getTotalObjectScaling(),\n scaleX = objectScale.x,\n scaleY = objectScale.y,\n elementToFilter = this._filteredEl || this._originalElement;\n if (this.group) {\n this.set('dirty', true);\n }\n if (!filter || (scaleX > minimumScale && scaleY > minimumScale)) {\n this._element = elementToFilter;\n this._filterScalingX = 1;\n this._filterScalingY = 1;\n this._lastScaleX = scaleX;\n this._lastScaleY = scaleY;\n return;\n }\n const canvasEl = createCanvasElementFor(elementToFilter),\n { width, height } = elementToFilter;\n this._element = canvasEl;\n this._lastScaleX = filter.scaleX = scaleX;\n this._lastScaleY = filter.scaleY = scaleY;\n getFilterBackend().applyFilters(\n [filter],\n elementToFilter,\n width,\n height,\n this._element,\n );\n this._filterScalingX = canvasEl.width / this._originalElement.width;\n this._filterScalingY = canvasEl.height / this._originalElement.height;\n }\n\n /**\n * Applies filters assigned to this image (from \"filters\" array) or from filter param\n * @param {Array} filters to be applied\n * @param {Boolean} forResizing specify if the filter operation is a resize operation\n */\n applyFilters(\n filters: BaseFilter>[] = this.filters || [],\n ) {\n filters = filters.filter((filter) => filter && !filter.isNeutralState());\n this.set('dirty', true);\n\n // needs to clear out or WEBGL will not resize correctly\n this.removeTexture(`${this.cacheKey}_filtered`);\n\n if (filters.length === 0) {\n this._element = this._originalElement;\n // this is unsafe and needs to be rethinkend\n this._filteredEl = undefined;\n this._filterScalingX = 1;\n this._filterScalingY = 1;\n return;\n }\n\n const imgElement = this._originalElement,\n sourceWidth =\n (imgElement as HTMLImageElement).naturalWidth || imgElement.width,\n sourceHeight =\n (imgElement as HTMLImageElement).naturalHeight || imgElement.height;\n\n if (this._element === this._originalElement) {\n // if the _element a reference to _originalElement\n // we need to create a new element to host the filtered pixels\n const canvasEl = createCanvasElementFor({\n width: sourceWidth,\n height: sourceHeight,\n });\n this._element = canvasEl;\n this._filteredEl = canvasEl;\n } else if (this._filteredEl) {\n // if the _element is it own element,\n // and we also have a _filteredEl, then we clean up _filteredEl\n // and we assign it to _element.\n // in this way we invalidate the eventual old resize filtered element\n this._element = this._filteredEl;\n this._filteredEl\n .getContext('2d')!\n .clearRect(0, 0, sourceWidth, sourceHeight);\n // we also need to resize again at next renderAll, so remove saved _lastScaleX/Y\n this._lastScaleX = 1;\n this._lastScaleY = 1;\n }\n getFilterBackend().applyFilters(\n filters,\n this._originalElement,\n sourceWidth,\n sourceHeight,\n this._element as HTMLCanvasElement,\n this.cacheKey,\n );\n if (\n this._originalElement.width !== this._element.width ||\n this._originalElement.height !== this._element.height\n ) {\n this._filterScalingX = this._element.width / this._originalElement.width;\n this._filterScalingY =\n this._element.height / this._originalElement.height;\n }\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _render(ctx: CanvasRenderingContext2D) {\n ctx.imageSmoothingEnabled = this.imageSmoothing;\n if (this.isMoving !== true && this.resizeFilter && this._needsResize()) {\n this.applyResizeFilters();\n }\n this._stroke(ctx);\n this._renderPaintInOrder(ctx);\n }\n\n /**\n * Paint the cached copy of the object on the target context.\n * it will set the imageSmoothing for the draw operation\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n drawCacheOnCanvas(\n this: TCachedFabricObject,\n ctx: CanvasRenderingContext2D,\n ) {\n ctx.imageSmoothingEnabled = this.imageSmoothing;\n super.drawCacheOnCanvas(ctx);\n }\n\n /**\n * Decide if the FabricImage should cache or not. Create its own cache level\n * needsItsOwnCache should be used when the object drawing method requires\n * a cache step.\n * Generally you do not cache objects in groups because the group outside is cached.\n * This is the special Image version where we would like to avoid caching where possible.\n * Essentially images do not benefit from caching. They may require caching, and in that\n * case we do it. Also caching an image usually ends in a loss of details.\n * A full performance audit should be done.\n * @return {Boolean}\n */\n shouldCache() {\n return this.needsItsOwnCache();\n }\n\n _renderFill(ctx: CanvasRenderingContext2D) {\n const elementToDraw = this._element;\n if (!elementToDraw) {\n return;\n }\n const scaleX = this._filterScalingX,\n scaleY = this._filterScalingY,\n w = this.width,\n h = this.height,\n // crop values cannot be lesser than 0.\n cropX = Math.max(this.cropX, 0),\n cropY = Math.max(this.cropY, 0),\n elWidth =\n (elementToDraw as HTMLImageElement).naturalWidth || elementToDraw.width,\n elHeight =\n (elementToDraw as HTMLImageElement).naturalHeight ||\n elementToDraw.height,\n sX = cropX * scaleX,\n sY = cropY * scaleY,\n // the width height cannot exceed element width/height, starting from the crop offset.\n sW = Math.min(w * scaleX, elWidth - sX),\n sH = Math.min(h * scaleY, elHeight - sY),\n x = -w / 2,\n y = -h / 2,\n maxDestW = Math.min(w, elWidth / scaleX - cropX),\n maxDestH = Math.min(h, elHeight / scaleY - cropY);\n\n elementToDraw &&\n ctx.drawImage(elementToDraw, sX, sY, sW, sH, x, y, maxDestW, maxDestH);\n }\n\n /**\n * needed to check if image needs resize\n * @private\n */\n _needsResize() {\n const scale = this.getTotalObjectScaling();\n return scale.x !== this._lastScaleX || scale.y !== this._lastScaleY;\n }\n\n /**\n * @private\n * @deprecated unused\n */\n _resetWidthHeight() {\n this.set(this.getOriginalSize());\n }\n\n /**\n * @private\n * Set the width and the height of the image object, using the element or the\n * options.\n */\n _setWidthHeight({ width, height }: Partial = {}) {\n const size = this.getOriginalSize();\n this.width = width || size.width;\n this.height = height || size.height;\n }\n\n /**\n * Calculate offset for center and scale factor for the image in order to respect\n * the preserveAspectRatio attribute\n * @private\n */\n parsePreserveAspectRatioAttribute() {\n const pAR = parsePreserveAspectRatioAttribute(\n this.preserveAspectRatio || '',\n ),\n pWidth = this.width,\n pHeight = this.height,\n parsedAttributes = { width: pWidth, height: pHeight };\n let rWidth = this._element.width,\n rHeight = this._element.height,\n scaleX = 1,\n scaleY = 1,\n offsetLeft = 0,\n offsetTop = 0,\n cropX = 0,\n cropY = 0,\n offset;\n\n if (pAR && (pAR.alignX !== NONE || pAR.alignY !== NONE)) {\n if (pAR.meetOrSlice === 'meet') {\n scaleX = scaleY = findScaleToFit(this._element, parsedAttributes);\n offset = (pWidth - rWidth * scaleX) / 2;\n if (pAR.alignX === 'Min') {\n offsetLeft = -offset;\n }\n if (pAR.alignX === 'Max') {\n offsetLeft = offset;\n }\n offset = (pHeight - rHeight * scaleY) / 2;\n if (pAR.alignY === 'Min') {\n offsetTop = -offset;\n }\n if (pAR.alignY === 'Max') {\n offsetTop = offset;\n }\n }\n if (pAR.meetOrSlice === 'slice') {\n scaleX = scaleY = findScaleToCover(this._element, parsedAttributes);\n offset = rWidth - pWidth / scaleX;\n if (pAR.alignX === 'Mid') {\n cropX = offset / 2;\n }\n if (pAR.alignX === 'Max') {\n cropX = offset;\n }\n offset = rHeight - pHeight / scaleY;\n if (pAR.alignY === 'Mid') {\n cropY = offset / 2;\n }\n if (pAR.alignY === 'Max') {\n cropY = offset;\n }\n rWidth = pWidth / scaleX;\n rHeight = pHeight / scaleY;\n }\n } else {\n scaleX = pWidth / rWidth;\n scaleY = pHeight / rHeight;\n }\n return {\n width: rWidth,\n height: rHeight,\n scaleX,\n scaleY,\n offsetLeft,\n offsetTop,\n cropX,\n cropY,\n };\n }\n\n /**\n * List of attribute names to account for when parsing SVG element (used by {@link FabricImage.fromElement})\n * @see {@link http://www.w3.org/TR/SVG/struct.html#ImageElement}\n */\n static ATTRIBUTE_NAMES = [\n ...SHARED_ATTRIBUTES,\n 'x',\n 'y',\n 'width',\n 'height',\n 'preserveAspectRatio',\n 'xlink:href',\n 'href',\n 'crossOrigin',\n 'image-rendering',\n ];\n\n /**\n * Creates an instance of FabricImage from its object representation\n * @param {Object} object Object to create an instance from\n * @param {object} [options] Options object\n * @param {AbortSignal} [options.signal] handle aborting, see https://developer.mozilla.org/en-US/docs/Web/API/AbortController/signal\n * @returns {Promise}\n */\n static fromObject>(\n { filters: f, resizeFilter: rf, src, crossOrigin, type, ...object }: T,\n options?: Abortable,\n ) {\n return Promise.all([\n loadImage(src!, { ...options, crossOrigin }),\n f && enlivenObjects>(f, options),\n // redundant - handled by enlivenObjectEnlivables, but nicely explicit\n rf ? enlivenObjects([rf], options) : [],\n enlivenObjectEnlivables(object, options),\n ]).then(([el, filters = [], [resizeFilter], hydratedProps = {}]) => {\n return new this(el, {\n ...object,\n // TODO: passing src creates a difference between image creation and restoring from JSON\n src,\n filters,\n resizeFilter,\n ...hydratedProps,\n });\n });\n }\n\n /**\n * Creates an instance of Image from an URL string\n * @param {String} url URL to create an image from\n * @param {LoadImageOptions} [options] Options object\n * @returns {Promise}\n */\n static fromURL>(\n url: string,\n { crossOrigin = null, signal }: LoadImageOptions = {},\n imageOptions?: T,\n ): Promise {\n return loadImage(url, { crossOrigin, signal }).then(\n (img) => new this(img, imageOptions),\n );\n }\n\n /**\n * Returns {@link FabricImage} instance from an SVG element\n * @param {HTMLElement} element Element to parse\n * @param {Object} [options] Options object\n * @param {AbortSignal} [options.signal] handle aborting, see https://developer.mozilla.org/en-US/docs/Web/API/AbortController/signal\n * @param {Function} callback Callback to execute when Image object is created\n */\n static async fromElement(\n element: HTMLElement,\n options: Abortable = {},\n cssRules?: CSSRules,\n ) {\n const parsedAttributes = parseAttributes(\n element,\n this.ATTRIBUTE_NAMES,\n cssRules,\n );\n return this.fromURL(\n parsedAttributes['xlink:href'] || parsedAttributes['href'],\n options,\n parsedAttributes,\n ).catch((err) => {\n log('log', 'Unable to parse Image', err);\n return null;\n });\n }\n}\n\nclassRegistry.setClass(FabricImage);\nclassRegistry.setSVGClass(FabricImage);\n","import { svgNS } from './constants';\nimport {\n parsePreserveAspectRatioAttribute,\n parseUnit,\n} from '../util/misc/svgParsing';\nimport { svgViewBoxElementsRegEx, reViewBoxAttrValue } from './constants';\nimport { NONE } from '../constants';\n\nexport type ParsedViewboxTransform = Partial<{\n width: number;\n height: number;\n minX: number;\n minY: number;\n viewBoxWidth: number;\n viewBoxHeight: number;\n}>;\n\n/**\n * Add a element that envelop all child elements and makes the viewbox transformMatrix descend on all elements\n */\nexport function applyViewboxTransform(\n element: Element,\n): ParsedViewboxTransform {\n if (!svgViewBoxElementsRegEx.test(element.nodeName)) {\n return {};\n }\n const viewBoxAttr: string | null = element.getAttribute('viewBox');\n let scaleX = 1;\n let scaleY = 1;\n let minX = 0;\n let minY = 0;\n let matrix;\n let el;\n const widthAttr = element.getAttribute('width');\n const heightAttr = element.getAttribute('height');\n const x = element.getAttribute('x') || 0;\n const y = element.getAttribute('y') || 0;\n const goodViewbox = viewBoxAttr && reViewBoxAttrValue.test(viewBoxAttr);\n const missingViewBox = !goodViewbox;\n const missingDimAttr =\n !widthAttr || !heightAttr || widthAttr === '100%' || heightAttr === '100%';\n\n let translateMatrix = '';\n let widthDiff = 0;\n let heightDiff = 0;\n\n if (missingViewBox) {\n if (\n (x || y) &&\n element.parentNode &&\n element.parentNode.nodeName !== '#document'\n ) {\n translateMatrix =\n ' translate(' + parseUnit(x || '0') + ' ' + parseUnit(y || '0') + ') ';\n matrix = (element.getAttribute('transform') || '') + translateMatrix;\n element.setAttribute('transform', matrix);\n element.removeAttribute('x');\n element.removeAttribute('y');\n }\n }\n\n if (missingViewBox && missingDimAttr) {\n return {\n width: 0,\n height: 0,\n };\n }\n\n const parsedDim: ParsedViewboxTransform = {\n width: 0,\n height: 0,\n };\n\n if (missingViewBox) {\n parsedDim.width = parseUnit(widthAttr!);\n parsedDim.height = parseUnit(heightAttr!);\n // set a transform for elements that have x y and are inner(only) SVGs\n return parsedDim;\n }\n\n const pasedViewBox = viewBoxAttr.match(reViewBoxAttrValue)!;\n minX = -parseFloat(pasedViewBox[1]);\n minY = -parseFloat(pasedViewBox[2]);\n const viewBoxWidth = parseFloat(pasedViewBox[3]);\n const viewBoxHeight = parseFloat(pasedViewBox[4]);\n parsedDim.minX = minX;\n parsedDim.minY = minY;\n parsedDim.viewBoxWidth = viewBoxWidth;\n parsedDim.viewBoxHeight = viewBoxHeight;\n if (!missingDimAttr) {\n parsedDim.width = parseUnit(widthAttr);\n parsedDim.height = parseUnit(heightAttr);\n scaleX = parsedDim.width / viewBoxWidth;\n scaleY = parsedDim.height / viewBoxHeight;\n } else {\n parsedDim.width = viewBoxWidth;\n parsedDim.height = viewBoxHeight;\n }\n\n // default is to preserve aspect ratio\n const preserveAspectRatio = parsePreserveAspectRatioAttribute(\n element.getAttribute('preserveAspectRatio') || '',\n );\n if (preserveAspectRatio.alignX !== NONE) {\n //translate all container for the effect of Mid, Min, Max\n if (preserveAspectRatio.meetOrSlice === 'meet') {\n scaleY = scaleX = scaleX > scaleY ? scaleY : scaleX;\n // calculate additional translation to move the viewbox\n }\n if (preserveAspectRatio.meetOrSlice === 'slice') {\n scaleY = scaleX = scaleX > scaleY ? scaleX : scaleY;\n // calculate additional translation to move the viewbox\n }\n widthDiff = parsedDim.width - viewBoxWidth * scaleX;\n heightDiff = parsedDim.height - viewBoxHeight * scaleX;\n if (preserveAspectRatio.alignX === 'Mid') {\n widthDiff /= 2;\n }\n if (preserveAspectRatio.alignY === 'Mid') {\n heightDiff /= 2;\n }\n if (preserveAspectRatio.alignX === 'Min') {\n widthDiff = 0;\n }\n if (preserveAspectRatio.alignY === 'Min') {\n heightDiff = 0;\n }\n }\n\n if (\n scaleX === 1 &&\n scaleY === 1 &&\n minX === 0 &&\n minY === 0 &&\n x === 0 &&\n y === 0\n ) {\n return parsedDim;\n }\n if ((x || y) && element.parentNode!.nodeName !== '#document') {\n translateMatrix =\n ' translate(' + parseUnit(x || '0') + ' ' + parseUnit(y || '0') + ') ';\n }\n\n matrix =\n translateMatrix +\n ' matrix(' +\n scaleX +\n ' 0' +\n ' 0 ' +\n scaleY +\n ' ' +\n (minX * scaleX + widthDiff) +\n ' ' +\n (minY * scaleY + heightDiff) +\n ') ';\n // seems unused.\n // parsedDim.viewboxTransform = parseTransformAttribute(matrix);\n if (element.nodeName === 'svg') {\n el = element.ownerDocument.createElementNS(svgNS, 'g');\n // element.firstChild != null\n while (element.firstChild) {\n el.appendChild(element.firstChild);\n }\n element.appendChild(el);\n } else {\n el = element;\n el.removeAttribute('x');\n el.removeAttribute('y');\n matrix = el.getAttribute('transform') + matrix;\n }\n el.setAttribute('transform', matrix);\n return parsedDim;\n}\n","export const getTagName = (node: Element) => node.tagName.replace('svg:', '');\n","import { svgInvalidAncestors } from './constants';\nimport { getSvgRegex } from './getSvgRegex';\nimport { getTagName } from './getTagName';\n\nconst svgInvalidAncestorsRegEx = getSvgRegex(svgInvalidAncestors);\n\nexport function hasInvalidAncestor(element: Element) {\n let _element: Element | null = element;\n while (_element && (_element = _element.parentElement)) {\n if (\n _element &&\n _element.nodeName &&\n svgInvalidAncestorsRegEx.test(getTagName(_element)) &&\n !_element.getAttribute('instantiated_by_use')\n ) {\n return true;\n }\n }\n return false;\n}\n","export function getMultipleNodes(\n doc: Document,\n nodeNames: string[],\n): Element[] {\n let nodeName,\n nodeArray: Element[] = [],\n nodeList,\n i,\n len;\n for (i = 0, len = nodeNames.length; i < len; i++) {\n nodeName = nodeNames[i];\n nodeList = doc.getElementsByTagNameNS(\n 'http://www.w3.org/2000/svg',\n nodeName,\n );\n nodeArray = nodeArray.concat(Array.from(nodeList));\n }\n return nodeArray;\n}\n","const gradientsAttrs = [\n 'gradientTransform',\n 'x1',\n 'x2',\n 'y1',\n 'y2',\n 'gradientUnits',\n 'cx',\n 'cy',\n 'r',\n 'fx',\n 'fy',\n];\nconst xlinkAttr = 'xlink:href';\n\nexport function recursivelyParseGradientsXlink(\n doc: Document,\n gradient: Element,\n) {\n const xLink = gradient.getAttribute(xlinkAttr)?.slice(1) || '',\n referencedGradient = doc.getElementById(xLink);\n if (referencedGradient && referencedGradient.getAttribute(xlinkAttr)) {\n recursivelyParseGradientsXlink(doc, referencedGradient as Element);\n }\n if (referencedGradient) {\n gradientsAttrs.forEach((attr) => {\n const value = referencedGradient.getAttribute(attr);\n if (!gradient.hasAttribute(attr) && value) {\n gradient.setAttribute(attr, value);\n }\n });\n if (!gradient.children.length) {\n const referenceClone = referencedGradient.cloneNode(true);\n while (referenceClone.firstChild) {\n gradient.appendChild(referenceClone.firstChild);\n }\n }\n }\n gradient.removeAttribute(xlinkAttr);\n}\n","import { getMultipleNodes } from './getMultipleNodes';\nimport { recursivelyParseGradientsXlink } from './recursivelyParseGradientsXlink';\n\nconst tagArray = [\n 'linearGradient',\n 'radialGradient',\n 'svg:linearGradient',\n 'svg:radialGradient',\n];\n\n/**\n * Parses an SVG document, returning all of the gradient declarations found in it\n * @param {SVGDocument} doc SVG document to parse\n * @return {Object} Gradient definitions; key corresponds to element id, value -- to gradient definition element\n */\nexport function getGradientDefs(\n doc: Document,\n): Record {\n const elList = getMultipleNodes(doc, tagArray);\n const gradientDefs: Record = {};\n let j = elList.length;\n while (j--) {\n const el = elList[j];\n if (el.getAttribute('xlink:href')) {\n recursivelyParseGradientsXlink(doc, el);\n }\n const id = el.getAttribute('id');\n if (id) {\n gradientDefs[id] = el as SVGGradientElement;\n }\n }\n return gradientDefs;\n}\n","import { Gradient } from '../gradient/Gradient';\nimport { Group } from '../shapes/Group';\nimport { FabricImage } from '../shapes/Image';\nimport { classRegistry } from '../ClassRegistry';\nimport {\n invertTransform,\n multiplyTransformMatrices,\n qrDecompose,\n} from '../util/misc/matrix';\nimport { removeTransformMatrixForSvgParsing } from '../util/transform_matrix_removal';\nimport type { FabricObject } from '../shapes/Object/FabricObject';\nimport { Point } from '../Point';\nimport { CENTER, FILL, STROKE } from '../constants';\nimport { getGradientDefs } from './getGradientDefs';\nimport { getCSSRules } from './getCSSRules';\nimport type { LoadImageOptions } from '../util';\nimport type { CSSRules, TSvgReviverCallback } from './typedefs';\nimport type { ParsedViewboxTransform } from './applyViewboxTransform';\nimport type { SVGOptions } from '../gradient';\nimport { getTagName } from './getTagName';\nimport { parseTransformAttribute } from './parseTransformAttribute';\n\nconst findTag = (el: Element) =>\n classRegistry.getSVGClass(getTagName(el).toLowerCase());\n\ntype StorageType = {\n fill: SVGGradientElement;\n stroke: SVGGradientElement;\n clipPath: Element[];\n};\n\ntype NotParsedFabricObject = FabricObject & {\n fill: string;\n stroke: string;\n clipPath?: string;\n clipRule?: CanvasFillRule;\n};\n\nexport class ElementsParser {\n declare elements: Element[];\n declare options: LoadImageOptions & ParsedViewboxTransform;\n declare reviver?: TSvgReviverCallback;\n declare regexUrl: RegExp;\n declare doc: Document;\n declare clipPaths: Record;\n declare gradientDefs: Record;\n declare cssRules: CSSRules;\n\n constructor(\n elements: Element[],\n options: LoadImageOptions & ParsedViewboxTransform,\n reviver: TSvgReviverCallback | undefined,\n doc: Document,\n clipPaths: Record,\n ) {\n this.elements = elements;\n this.options = options;\n this.reviver = reviver;\n this.regexUrl = /^url\\(['\"]?#([^'\"]+)['\"]?\\)/g;\n this.doc = doc;\n this.clipPaths = clipPaths;\n this.gradientDefs = getGradientDefs(doc);\n this.cssRules = getCSSRules(doc);\n }\n\n parse(): Promise> {\n return Promise.all(\n this.elements.map((element) => this.createObject(element)),\n );\n }\n\n async createObject(el: Element): Promise {\n const klass = findTag(el);\n if (klass) {\n const obj: NotParsedFabricObject = await klass.fromElement(\n el,\n this.options,\n this.cssRules,\n );\n this.resolveGradient(obj, el, FILL);\n this.resolveGradient(obj, el, STROKE);\n if (obj instanceof FabricImage && obj._originalElement) {\n removeTransformMatrixForSvgParsing(\n obj,\n obj.parsePreserveAspectRatioAttribute(),\n );\n } else {\n removeTransformMatrixForSvgParsing(obj);\n }\n await this.resolveClipPath(obj, el);\n this.reviver && this.reviver(el, obj);\n return obj;\n }\n return null;\n }\n\n extractPropertyDefinition(\n obj: NotParsedFabricObject,\n property: 'fill' | 'stroke' | 'clipPath',\n storage: Record,\n ): StorageType[typeof property] | undefined {\n const value = obj[property]!,\n regex = this.regexUrl;\n if (!regex.test(value)) {\n return undefined;\n }\n // verify: can we remove the 'g' flag? and remove lastIndex changes?\n regex.lastIndex = 0;\n // we passed the regex test, so we know is not null;\n const id = regex.exec(value)![1];\n regex.lastIndex = 0;\n // @todo fix this\n return storage[id];\n }\n\n resolveGradient(\n obj: NotParsedFabricObject,\n el: Element,\n property: 'fill' | 'stroke',\n ) {\n const gradientDef = this.extractPropertyDefinition(\n obj,\n property,\n this.gradientDefs,\n ) as SVGGradientElement;\n if (gradientDef) {\n const opacityAttr = el.getAttribute(property + '-opacity');\n const gradient = Gradient.fromElement(gradientDef, obj, {\n ...this.options,\n opacity: opacityAttr,\n } as SVGOptions);\n obj.set(property, gradient);\n }\n }\n\n // TODO: resolveClipPath could be run once per clippath with minor work per object.\n // is a refactor that i m not sure is worth on this code\n async resolveClipPath(\n obj: NotParsedFabricObject,\n usingElement: Element,\n exactOwner?: Element,\n ) {\n const clipPathElements = this.extractPropertyDefinition(\n obj,\n 'clipPath',\n this.clipPaths,\n ) as Element[];\n if (clipPathElements) {\n const objTransformInv = invertTransform(obj.calcTransformMatrix());\n const clipPathTag = clipPathElements[0].parentElement!;\n let clipPathOwner = usingElement;\n while (\n !exactOwner &&\n clipPathOwner.parentElement &&\n clipPathOwner.getAttribute('clip-path') !== obj.clipPath\n ) {\n clipPathOwner = clipPathOwner.parentElement;\n }\n // move the clipPath tag as sibling to the real element that is using it\n clipPathOwner.parentElement!.appendChild(clipPathTag);\n\n // this multiplication order could be opposite.\n // but i don't have an svg to test it\n // at the first SVG that has a transform on both places and is misplaced\n // try to invert this multiplication order\n const finalTransform = parseTransformAttribute(\n `${clipPathOwner.getAttribute('transform') || ''} ${\n clipPathTag.getAttribute('originalTransform') || ''\n }`,\n );\n\n clipPathTag.setAttribute(\n 'transform',\n `matrix(${finalTransform.join(',')})`,\n );\n\n const container = await Promise.all(\n clipPathElements.map((clipPathElement) => {\n return findTag(clipPathElement)\n .fromElement(clipPathElement, this.options, this.cssRules)\n .then((enlivedClippath: NotParsedFabricObject) => {\n removeTransformMatrixForSvgParsing(enlivedClippath);\n enlivedClippath.fillRule = enlivedClippath.clipRule!;\n delete enlivedClippath.clipRule;\n return enlivedClippath;\n });\n }),\n );\n const clipPath =\n container.length === 1 ? container[0] : new Group(container);\n const gTransform = multiplyTransformMatrices(\n objTransformInv,\n clipPath.calcTransformMatrix(),\n );\n if (clipPath.clipPath) {\n await this.resolveClipPath(\n clipPath,\n clipPathOwner,\n // this is tricky.\n // it tries to differentiate from when clipPaths are inherited by outside groups\n // or when are really clipPaths referencing other clipPaths\n clipPathTag.getAttribute('clip-path') ? clipPathOwner : undefined,\n );\n }\n const { scaleX, scaleY, angle, skewX, translateX, translateY } =\n qrDecompose(gTransform);\n clipPath.set({\n flipX: false,\n flipY: false,\n });\n clipPath.set({\n scaleX,\n scaleY,\n angle,\n skewX,\n skewY: 0,\n });\n clipPath.setPositionByOrigin(\n new Point(translateX, translateY),\n CENTER,\n CENTER,\n );\n obj.clipPath = clipPath;\n } else {\n // if clip-path does not resolve to any element, delete the property.\n delete obj.clipPath;\n return;\n }\n }\n}\n","import type { CSSRules } from './typedefs';\n\n/**\n * Returns CSS rules for a given SVG document\n * @param {HTMLElement} doc SVG document to parse\n * @return {Object} CSS rules of this document\n */\nexport function getCSSRules(doc: Document) {\n const styles = doc.getElementsByTagName('style');\n const allRules: CSSRules = {};\n\n // very crude parsing of style contents\n for (let i = 0; i < styles.length; i++) {\n const styleContents = (styles[i].textContent || '').replace(\n // remove comments\n /\\/\\*[\\s\\S]*?\\*\\//g,\n '',\n );\n\n if (styleContents.trim() === '') {\n continue;\n }\n // recovers all the rule in this form `body { style code... }`\n // rules = styleContents.match(/[^{]*\\{[\\s\\S]*?\\}/g);\n styleContents\n .split('}')\n // remove empty rules and remove everything if we didn't split in at least 2 pieces\n .filter((rule, index, array) => array.length > 1 && rule.trim())\n // at this point we have hopefully an array of rules `body { style code... `\n .forEach((rule) => {\n // if there is more than one opening bracket and the rule starts with '@', it is likely\n // a nested at-rule like @media, @supports, @scope, etc. Ignore these as the code below\n // can not handle it.\n if (\n (rule.match(/{/g) || []).length > 1 &&\n rule.trim().startsWith('@')\n ) {\n return;\n }\n\n const match = rule.split('{'),\n ruleObj: Record = {},\n declaration = match[1].trim(),\n propertyValuePairs = declaration.split(';').filter(function (pair) {\n return pair.trim();\n });\n\n for (let j = 0; j < propertyValuePairs.length; j++) {\n const pair = propertyValuePairs[j].split(':'),\n property = pair[0].trim(),\n value = pair[1].trim();\n ruleObj[property] = value;\n }\n rule = match[0].trim();\n rule.split(',').forEach((_rule) => {\n _rule = _rule.replace(/^svg/i, '').trim();\n if (_rule === '') {\n return;\n }\n allRules[_rule] = {\n ...(allRules[_rule] || {}),\n ...ruleObj,\n };\n });\n });\n }\n return allRules;\n}\n","import { applyViewboxTransform } from './applyViewboxTransform';\nimport { svgValidTagNamesRegEx } from './constants';\nimport { hasInvalidAncestor } from './hasInvalidAncestor';\nimport { parseUseDirectives } from './parseUseDirectives';\nimport type { SVGParsingOutput, TSvgReviverCallback } from './typedefs';\nimport type { LoadImageOptions } from '../util/misc/objectEnlive';\nimport { ElementsParser } from './elements_parser';\nimport { log, SignalAbortedError } from '../util/internals/console';\nimport { getTagName } from './getTagName';\n\nconst isValidSvgTag = (el: Element) =>\n svgValidTagNamesRegEx.test(getTagName(el));\n\nexport const createEmptyResponse = (): SVGParsingOutput => ({\n objects: [],\n elements: [],\n options: {},\n allElements: [],\n});\n\n/**\n * Parses an SVG document, converts it to an array of corresponding fabric.* instances and passes them to a callback\n * @param {HTMLElement} doc SVG document to parse\n * @param {TSvgParsedCallback} callback Invoked when the parsing is done, with null if parsing wasn't possible with the list of svg nodes.\n * @param {TSvgReviverCallback} [reviver] Extra callback for further parsing of SVG elements, called after each fabric object has been created.\n * Takes as input the original svg element and the generated `FabricObject` as arguments. Used to inspect extra properties not parsed by fabric,\n * or extra custom manipulation\n * @param {Object} [options] Object containing options for parsing\n * @param {String} [options.crossOrigin] crossOrigin setting to use for external resources\n * @param {AbortSignal} [options.signal] handle aborting, see https://developer.mozilla.org/en-US/docs/Web/API/AbortController/signal\n * @return {SVGParsingOutput}\n * {@link SVGParsingOutput} also receives `allElements` array as the last argument. This is the full list of svg nodes available in the document.\n * You may want to use it if you are trying to regroup the objects as they were originally grouped in the SVG. ( This was the reason why it was added )\n */\nexport async function parseSVGDocument(\n doc: Document,\n reviver?: TSvgReviverCallback,\n { crossOrigin, signal }: LoadImageOptions = {},\n): Promise {\n if (signal && signal.aborted) {\n log('log', new SignalAbortedError('parseSVGDocument'));\n // this is an unhappy path, we dont care about speed\n return createEmptyResponse();\n }\n const documentElement = doc.documentElement;\n parseUseDirectives(doc);\n\n const descendants = Array.from(documentElement.getElementsByTagName('*')),\n options = {\n ...applyViewboxTransform(documentElement),\n crossOrigin,\n signal,\n };\n const elements = descendants.filter((el) => {\n applyViewboxTransform(el);\n return isValidSvgTag(el) && !hasInvalidAncestor(el); // http://www.w3.org/TR/SVG/struct.html#DefsElement\n });\n if (!elements || (elements && !elements.length)) {\n return {\n ...createEmptyResponse(),\n options,\n allElements: descendants,\n };\n }\n const localClipPaths: Record = {};\n descendants\n .filter((el) => getTagName(el) === 'clipPath')\n .forEach((el) => {\n el.setAttribute('originalTransform', el.getAttribute('transform') || '');\n const id = el.getAttribute('id')!;\n localClipPaths[id] = Array.from(el.getElementsByTagName('*')).filter(\n (el) => isValidSvgTag(el),\n );\n });\n\n // Precedence of rules: style > class > attribute\n const elementParser = new ElementsParser(\n elements,\n options,\n reviver,\n doc,\n localClipPaths,\n );\n\n const instances = await elementParser.parse();\n\n return {\n objects: instances,\n elements,\n options,\n allElements: descendants,\n };\n}\n","import { svgNS } from './constants';\nimport { getMultipleNodes } from './getMultipleNodes';\nimport { applyViewboxTransform } from './applyViewboxTransform';\nimport { parseStyleString } from './parseStyleString';\n\nexport function parseUseDirectives(doc: Document) {\n const nodelist = getMultipleNodes(doc, ['use', 'svg:use']);\n const skipAttributes = ['x', 'y', 'xlink:href', 'href', 'transform'];\n\n for (const useElement of nodelist) {\n const useAttributes: NamedNodeMap = useElement.attributes;\n\n const useAttrMap: Record = {};\n for (const attr of useAttributes) {\n attr.value && (useAttrMap[attr.name] = attr.value);\n }\n\n const xlink = (useAttrMap['xlink:href'] || useAttrMap.href || '').slice(1);\n\n if (xlink === '') {\n return;\n }\n const referencedElement = doc.getElementById(xlink);\n if (referencedElement === null) {\n // if we can't find the target of the xlink, consider this use tag bad, similar to no xlink\n return;\n }\n let clonedOriginal = referencedElement.cloneNode(true) as Element;\n\n const originalAttributes: NamedNodeMap = clonedOriginal.attributes;\n\n const originalAttrMap: Record = {};\n for (const attr of originalAttributes) {\n attr.value && (originalAttrMap[attr.name] = attr.value);\n }\n\n // Transform attribute needs to be merged in a particular way\n const { x = 0, y = 0, transform = '' } = useAttrMap;\n const currentTrans = `${transform} ${\n originalAttrMap.transform || ''\n } translate(${x}, ${y})`;\n\n applyViewboxTransform(clonedOriginal);\n\n if (/^svg$/i.test(clonedOriginal.nodeName)) {\n // if is an SVG, create a group and apply all the attributes on top of it\n const el3 = clonedOriginal.ownerDocument.createElementNS(svgNS, 'g');\n Object.entries(originalAttrMap).forEach(([name, value]) =>\n el3.setAttributeNS(svgNS, name, value),\n );\n el3.append(...clonedOriginal.childNodes);\n clonedOriginal = el3;\n }\n\n for (const attr of useAttributes) {\n if (!attr) {\n continue;\n }\n const { name, value } = attr;\n if (skipAttributes.includes(name)) {\n continue;\n }\n\n if (name === 'style') {\n // when use has a style, merge the two styles, with the ref being priority (not use)\n // priority is by feature. an attribute for fill on the original element\n // will overwrite the fill in style or attribute for tha use\n const styleRecord: Record = {};\n parseStyleString(value, styleRecord);\n // cleanup styleRecord from attributes of original\n Object.entries(originalAttrMap).forEach(([name, value]) => {\n styleRecord[name] = value;\n });\n // now we can put in the style of the original that will overwrite the original attributes\n parseStyleString(originalAttrMap.style || '', styleRecord);\n const mergedStyles = Object.entries(styleRecord)\n .map((entry) => entry.join(':'))\n .join(';');\n clonedOriginal.setAttribute(name, mergedStyles);\n } else {\n // set the attribute from use element only if the original does not have it already\n !originalAttrMap[name] && clonedOriginal.setAttribute(name, value);\n }\n }\n\n clonedOriginal.setAttribute('transform', currentTrans);\n clonedOriginal.setAttribute('instantiated_by_use', '1');\n clonedOriginal.removeAttribute('id');\n useElement.parentNode!.replaceChild(clonedOriginal, useElement);\n }\n}\n","import { getFabricWindow } from '../env';\nimport type { LoadImageOptions } from '../util/misc/objectEnlive';\nimport { parseSVGDocument } from './parseSVGDocument';\nimport type { SVGParsingOutput, TSvgReviverCallback } from './typedefs';\n\n/**\n * Takes string corresponding to an SVG document, and parses it into a set of fabric objects\n * @param {String} string representing the svg\n * @param {TSvgParsedCallback} callback Invoked when the parsing is done, with null if parsing wasn't possible with the list of svg nodes.\n * {@link TSvgParsedCallback} also receives `allElements` array as the last argument. This is the full list of svg nodes available in the document.\n * You may want to use it if you are trying to regroup the objects as they were originally grouped in the SVG. ( This was the reason why it was added )\n * @param {TSvgReviverCallback} [reviver] Extra callback for further parsing of SVG elements, called after each fabric object has been created.\n * Takes as input the original svg element and the generated `FabricObject` as arguments. Used to inspect extra properties not parsed by fabric,\n * or extra custom manipulation\n * @param {Object} [options] Object containing options for parsing\n * @param {String} [options.crossOrigin] crossOrigin setting to use for external resources\n * @param {AbortSignal} [options.signal] handle aborting, see https://developer.mozilla.org/en-US/docs/Web/API/AbortController/signal\n */\nexport function loadSVGFromString(\n string: string,\n reviver?: TSvgReviverCallback,\n options?: LoadImageOptions,\n): Promise {\n const parser = new (getFabricWindow().DOMParser)(),\n // should we use `image/svg+xml` here?\n doc = parser.parseFromString(string.trim(), 'text/xml');\n return parseSVGDocument(doc, reviver, options);\n}\n","import { Point } from '../Point';\nimport { Control } from './Control';\nimport type { TMat2D } from '../typedefs';\nimport type { Polyline } from '../shapes/Polyline';\nimport { multiplyTransformMatrices } from '../util/misc/matrix';\nimport type {\n TModificationEvents,\n TPointerEvent,\n Transform,\n TransformActionHandler,\n} from '../EventTypeDefs';\nimport { wrapWithFireEvent } from './wrapWithFireEvent';\nimport { sendPointToPlane } from '../util/misc/planeChange';\nimport { MODIFY_POLY } from '../constants';\n\nconst ACTION_NAME: TModificationEvents = MODIFY_POLY;\n\ntype TTransformAnchor = Transform & { pointIndex: number };\n\n/**\n * This function locates the controls.\n * It'll be used both for drawing and for interaction.\n */\nexport const createPolyPositionHandler = (pointIndex: number) => {\n return function (dim: Point, finalMatrix: TMat2D, polyObject: Polyline) {\n const { points, pathOffset } = polyObject;\n return new Point(points[pointIndex])\n .subtract(pathOffset)\n .transform(\n multiplyTransformMatrices(\n polyObject.getViewportTransform(),\n polyObject.calcTransformMatrix(),\n ),\n );\n };\n};\n\n/**\n * This function defines what the control does.\n * It'll be called on every mouse move after a control has been clicked and is being dragged.\n * The function receives as argument the mouse event, the current transform object\n * and the current position in canvas coordinate `transform.target` is a reference to the\n * current object being transformed.\n */\nexport const polyActionHandler = (\n eventData: TPointerEvent,\n transform: TTransformAnchor,\n x: number,\n y: number,\n) => {\n const { target, pointIndex } = transform;\n const poly = target as Polyline;\n const mouseLocalPosition = sendPointToPlane(\n new Point(x, y),\n undefined,\n poly.calcOwnMatrix(),\n );\n\n poly.points[pointIndex] = mouseLocalPosition.add(poly.pathOffset);\n poly.setDimensions();\n poly.set('dirty', true);\n return true;\n};\n\n/**\n * Keep the polygon in the same position when we change its `width`/`height`/`top`/`left`.\n */\nexport const factoryPolyActionHandler = (\n pointIndex: number,\n fn: TransformActionHandler,\n) => {\n return function (\n eventData: TPointerEvent,\n transform: Transform,\n x: number,\n y: number,\n ) {\n const poly = transform.target as Polyline,\n anchorPoint = new Point(\n poly.points[(pointIndex > 0 ? pointIndex : poly.points.length) - 1],\n ),\n anchorPointInParentPlane = anchorPoint\n .subtract(poly.pathOffset)\n .transform(poly.calcOwnMatrix()),\n actionPerformed = fn(eventData, { ...transform, pointIndex }, x, y);\n\n const newAnchorPointInParentPlane = anchorPoint\n .subtract(poly.pathOffset)\n .transform(poly.calcOwnMatrix());\n\n const diff = newAnchorPointInParentPlane.subtract(anchorPointInParentPlane);\n poly.left -= diff.x;\n poly.top -= diff.y;\n\n return actionPerformed;\n };\n};\n\nexport const createPolyActionHandler = (pointIndex: number) =>\n wrapWithFireEvent(\n ACTION_NAME,\n factoryPolyActionHandler(pointIndex, polyActionHandler),\n );\n\nexport function createPolyControls(\n poly: Polyline,\n options?: Partial,\n): Record;\nexport function createPolyControls(\n numOfControls: number,\n options?: Partial,\n): Record;\nexport function createPolyControls(\n arg0: number | Polyline,\n options: Partial = {},\n) {\n const controls = {} as Record;\n for (\n let idx = 0;\n idx < (typeof arg0 === 'number' ? arg0 : arg0.points.length);\n idx++\n ) {\n controls[`p${idx}`] = new Control({\n actionName: ACTION_NAME,\n positionHandler: createPolyPositionHandler(idx),\n actionHandler: createPolyActionHandler(idx),\n ...options,\n });\n }\n return controls;\n}\n","import { Point } from '../Point';\nimport { Control } from './Control';\nimport type { TMat2D } from '../typedefs';\nimport type { Path } from '../shapes/Path';\nimport { multiplyTransformMatrices } from '../util/misc/matrix';\nimport type {\n TModificationEvents,\n TPointerEvent,\n Transform,\n} from '../EventTypeDefs';\nimport { sendPointToPlane } from '../util/misc/planeChange';\nimport type { TSimpleParseCommandType } from '../util/path/typedefs';\nimport type { ControlRenderingStyleOverride } from './controlRendering';\nimport { fireEvent } from './fireEvent';\nimport { commonEventInfo } from './util';\n\nconst ACTION_NAME: TModificationEvents = 'modifyPath' as const;\n\ntype TTransformAnchor = Transform;\n\nexport type PathPointControlStyle = {\n controlFill?: string;\n controlStroke?: string;\n connectionDashArray?: number[];\n};\n\nconst calcPathPointPosition = (\n pathObject: Path,\n commandIndex: number,\n pointIndex: number,\n) => {\n const { path, pathOffset } = pathObject;\n const command = path[commandIndex];\n return new Point(\n (command[pointIndex] as number) - pathOffset.x,\n (command[pointIndex + 1] as number) - pathOffset.y,\n ).transform(\n multiplyTransformMatrices(\n pathObject.getViewportTransform(),\n pathObject.calcTransformMatrix(),\n ),\n );\n};\n\nconst movePathPoint = (\n pathObject: Path,\n x: number,\n y: number,\n commandIndex: number,\n pointIndex: number,\n) => {\n const { path, pathOffset } = pathObject;\n\n const anchorCommand =\n path[(commandIndex > 0 ? commandIndex : path.length) - 1];\n const anchorPoint = new Point(\n anchorCommand[pointIndex] as number,\n anchorCommand[pointIndex + 1] as number,\n );\n\n const anchorPointInParentPlane = anchorPoint\n .subtract(pathOffset)\n .transform(pathObject.calcOwnMatrix());\n\n const mouseLocalPosition = sendPointToPlane(\n new Point(x, y),\n undefined,\n pathObject.calcOwnMatrix(),\n );\n\n path[commandIndex][pointIndex] = mouseLocalPosition.x + pathOffset.x;\n path[commandIndex][pointIndex + 1] = mouseLocalPosition.y + pathOffset.y;\n pathObject.setDimensions();\n\n const newAnchorPointInParentPlane = anchorPoint\n .subtract(pathObject.pathOffset)\n .transform(pathObject.calcOwnMatrix());\n\n const diff = newAnchorPointInParentPlane.subtract(anchorPointInParentPlane);\n pathObject.left -= diff.x;\n pathObject.top -= diff.y;\n pathObject.set('dirty', true);\n return true;\n};\n\n/**\n * This function locates the controls.\n * It'll be used both for drawing and for interaction.\n */\nfunction pathPositionHandler(\n this: PathPointControl,\n dim: Point,\n finalMatrix: TMat2D,\n pathObject: Path,\n) {\n const { commandIndex, pointIndex } = this;\n return calcPathPointPosition(pathObject, commandIndex, pointIndex);\n}\n\n/**\n * This function defines what the control does.\n * It'll be called on every mouse move after a control has been clicked and is being dragged.\n * The function receives as argument the mouse event, the current transform object\n * and the current position in canvas coordinate `transform.target` is a reference to the\n * current object being transformed.\n */\nfunction pathActionHandler(\n this: PathPointControl,\n eventData: TPointerEvent,\n transform: TTransformAnchor,\n x: number,\n y: number,\n) {\n const { target } = transform;\n const { commandIndex, pointIndex } = this;\n const actionPerformed = movePathPoint(\n target as Path,\n x,\n y,\n commandIndex,\n pointIndex,\n );\n if (actionPerformed) {\n fireEvent(this.actionName as TModificationEvents, {\n ...commonEventInfo(eventData, transform, x, y),\n commandIndex,\n pointIndex,\n });\n }\n return actionPerformed;\n}\n\nconst indexFromPrevCommand = (previousCommandType: TSimpleParseCommandType) =>\n previousCommandType === 'C' ? 5 : previousCommandType === 'Q' ? 3 : 1;\n\nclass PathPointControl extends Control {\n declare commandIndex: number;\n declare pointIndex: number;\n declare controlFill: string;\n declare controlStroke: string;\n constructor(options?: Partial) {\n super(options);\n }\n\n render(\n ctx: CanvasRenderingContext2D,\n left: number,\n top: number,\n styleOverride: ControlRenderingStyleOverride | undefined,\n fabricObject: Path,\n ) {\n const overrides: ControlRenderingStyleOverride = {\n ...styleOverride,\n cornerColor: this.controlFill,\n cornerStrokeColor: this.controlStroke,\n transparentCorners: !this.controlFill,\n };\n super.render(ctx, left, top, overrides, fabricObject);\n }\n}\n\nclass PathControlPointControl extends PathPointControl {\n declare connectionDashArray?: number[];\n declare connectToCommandIndex: number;\n declare connectToPointIndex: number;\n constructor(options?: Partial) {\n super(options);\n }\n\n render(\n this: PathControlPointControl,\n ctx: CanvasRenderingContext2D,\n left: number,\n top: number,\n styleOverride: ControlRenderingStyleOverride | undefined,\n fabricObject: Path,\n ) {\n const { path } = fabricObject;\n const {\n commandIndex,\n pointIndex,\n connectToCommandIndex,\n connectToPointIndex,\n } = this;\n ctx.save();\n ctx.strokeStyle = this.controlStroke;\n if (this.connectionDashArray) {\n ctx.setLineDash(this.connectionDashArray);\n }\n const [commandType] = path[commandIndex];\n const point = calcPathPointPosition(\n fabricObject,\n connectToCommandIndex,\n connectToPointIndex,\n );\n\n if (commandType === 'Q') {\n // one control point connects to 2 points\n const point2 = calcPathPointPosition(\n fabricObject,\n commandIndex,\n pointIndex + 2,\n );\n ctx.moveTo(point2.x, point2.y);\n ctx.lineTo(left, top);\n } else {\n ctx.moveTo(left, top);\n }\n ctx.lineTo(point.x, point.y);\n ctx.stroke();\n ctx.restore();\n\n super.render(ctx, left, top, styleOverride, fabricObject);\n }\n}\n\nconst createControl = (\n commandIndexPos: number,\n pointIndexPos: number,\n isControlPoint: boolean,\n options: Partial & {\n controlPointStyle?: PathPointControlStyle;\n pointStyle?: PathPointControlStyle;\n },\n connectToCommandIndex?: number,\n connectToPointIndex?: number,\n) =>\n new (isControlPoint ? PathControlPointControl : PathPointControl)({\n commandIndex: commandIndexPos,\n pointIndex: pointIndexPos,\n actionName: ACTION_NAME,\n positionHandler: pathPositionHandler,\n actionHandler: pathActionHandler,\n connectToCommandIndex,\n connectToPointIndex,\n ...options,\n ...(isControlPoint ? options.controlPointStyle : options.pointStyle),\n } as Partial);\n\nexport function createPathControls(\n path: Path,\n options: Partial & {\n controlPointStyle?: PathPointControlStyle;\n pointStyle?: PathPointControlStyle;\n } = {},\n): Record {\n const controls = {} as Record;\n let previousCommandType: TSimpleParseCommandType = 'M';\n path.path.forEach((command, commandIndex) => {\n const commandType = command[0];\n\n if (commandType !== 'Z') {\n controls[`c_${commandIndex}_${commandType}`] = createControl(\n commandIndex,\n command.length - 2,\n false,\n options,\n );\n }\n switch (commandType) {\n case 'C':\n controls[`c_${commandIndex}_C_CP_1`] = createControl(\n commandIndex,\n 1,\n true,\n options,\n commandIndex - 1,\n indexFromPrevCommand(previousCommandType),\n );\n controls[`c_${commandIndex}_C_CP_2`] = createControl(\n commandIndex,\n 3,\n true,\n options,\n commandIndex,\n 5,\n );\n break;\n case 'Q':\n controls[`c_${commandIndex}_Q_CP_1`] = createControl(\n commandIndex,\n 1,\n true,\n options,\n commandIndex,\n 3,\n );\n break;\n }\n previousCommandType = commandType;\n });\n return controls;\n}\n","import { getFabricWindow } from '../env';\nimport { createCanvasElement, createCanvasElementFor } from '../util/misc/dom';\nimport { WebGLFilterBackend } from './WebGLFilterBackend';\nimport type { TWebGLPipelineState, T2DPipelineState } from './typedefs';\n\nexport const isWebGLPipelineState = (\n options: TWebGLPipelineState | T2DPipelineState,\n): options is TWebGLPipelineState => {\n return (options as TWebGLPipelineState).webgl !== undefined;\n};\n\n/**\n * Pick a method to copy data from GL context to 2d canvas. In some browsers using\n * drawImage should be faster, but is also bugged for a small combination of old hardware\n * and drivers.\n * putImageData is faster than drawImage for that specific operation.\n */\nexport const isPutImageFaster = (width: number, height: number): boolean => {\n const targetCanvas = createCanvasElementFor({ width, height });\n const sourceCanvas = createCanvasElement();\n const gl = sourceCanvas.getContext('webgl')!;\n // eslint-disable-next-line no-undef\n const imageBuffer = new ArrayBuffer(width * height * 4);\n\n const testContext = {\n imageBuffer: imageBuffer,\n } as unknown as Required;\n const testPipelineState = {\n destinationWidth: width,\n destinationHeight: height,\n targetCanvas: targetCanvas,\n } as unknown as TWebGLPipelineState;\n let startTime;\n\n startTime = getFabricWindow().performance.now();\n WebGLFilterBackend.prototype.copyGLTo2D.call(\n testContext,\n gl,\n testPipelineState,\n );\n const drawImageTime = getFabricWindow().performance.now() - startTime;\n\n startTime = getFabricWindow().performance.now();\n WebGLFilterBackend.prototype.copyGLTo2DPutImageData.call(\n testContext,\n gl,\n testPipelineState,\n );\n const putImageDataTime = getFabricWindow().performance.now() - startTime;\n\n return drawImageTime > putImageDataTime;\n};\n","export const highPsourceCode = `precision highp float`;\n\nexport const identityFragmentShader = `\n ${highPsourceCode};\n varying vec2 vTexCoord;\n uniform sampler2D uTexture;\n void main() {\n gl_FragColor = texture2D(uTexture, vTexCoord);\n }`;\n\nexport const vertexSource = `\n attribute vec2 aPosition;\n varying vec2 vTexCoord;\n void main() {\n vTexCoord = aPosition;\n gl_Position = vec4(aPosition * 2.0 - 1.0, 0.0, 1.0);\n }`;\n","import { getEnv } from '../env';\nimport type {\n T2DPipelineState,\n TWebGLAttributeLocationMap,\n TWebGLPipelineState,\n TWebGLProgramCacheItem,\n TWebGLUniformLocationMap,\n} from './typedefs';\nimport { isWebGLPipelineState } from './utils';\nimport {\n highPsourceCode,\n identityFragmentShader,\n vertexSource,\n} from './shaders/baseFilter';\nimport type { Abortable } from '../typedefs';\nimport { FabricError } from '../util/internals/console';\nimport { createCanvasElementFor } from '../util/misc/dom';\n\nconst regex = new RegExp(highPsourceCode, 'g');\n\nexport class BaseFilter<\n Name extends string,\n OwnProps extends Record = object,\n SerializedProps extends Record = OwnProps,\n> {\n /**\n * Filter type\n */\n get type(): Name {\n return (this.constructor as typeof BaseFilter).type as Name;\n }\n\n /**\n * The class type. Used to identify which class this is.\n * This is used for serialization purposes and internally it can be used\n * to identify classes. As a developer you could use `instance of Class`\n * but to avoid importing all the code and blocking tree shaking we try\n * to avoid doing that.\n */\n static type = 'BaseFilter';\n\n /**\n * Contains the uniform locations for the fragment shader.\n * uStepW and uStepH are handled by the BaseFilter, each filter class\n * needs to specify all the one that are needed\n */\n static uniformLocations: string[] = [];\n\n declare static defaults: Record;\n\n /**\n * Constructor\n * @param {Object} [options] Options object\n */\n constructor({\n type,\n ...options\n }: { type?: never } & Partial & Record = {}) {\n Object.assign(\n this,\n (this.constructor as typeof BaseFilter).defaults,\n options,\n );\n }\n\n protected getFragmentSource(): string {\n return identityFragmentShader;\n }\n\n getVertexSource(): string {\n return vertexSource;\n }\n\n /**\n * Compile this filter's shader program.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context to use for shader compilation.\n * @param {String} fragmentSource fragmentShader source for compilation\n * @param {String} vertexSource vertexShader source for compilation\n */\n createProgram(\n gl: WebGLRenderingContext,\n fragmentSource: string = this.getFragmentSource(),\n vertexSource: string = this.getVertexSource(),\n ) {\n const {\n WebGLProbe: { GLPrecision = 'highp' },\n } = getEnv();\n if (GLPrecision !== 'highp') {\n fragmentSource = fragmentSource.replace(\n regex,\n highPsourceCode.replace('highp', GLPrecision),\n );\n }\n const vertexShader = gl.createShader(gl.VERTEX_SHADER);\n const fragmentShader = gl.createShader(gl.FRAGMENT_SHADER);\n const program = gl.createProgram();\n\n if (!vertexShader || !fragmentShader || !program) {\n throw new FabricError(\n 'Vertex, fragment shader or program creation error',\n );\n }\n gl.shaderSource(vertexShader, vertexSource);\n gl.compileShader(vertexShader);\n if (!gl.getShaderParameter(vertexShader, gl.COMPILE_STATUS)) {\n throw new FabricError(\n `Vertex shader compile error for ${this.type}: ${gl.getShaderInfoLog(\n vertexShader,\n )}`,\n );\n }\n\n gl.shaderSource(fragmentShader, fragmentSource);\n gl.compileShader(fragmentShader);\n if (!gl.getShaderParameter(fragmentShader, gl.COMPILE_STATUS)) {\n throw new FabricError(\n `Fragment shader compile error for ${this.type}: ${gl.getShaderInfoLog(\n fragmentShader,\n )}`,\n );\n }\n\n gl.attachShader(program, vertexShader);\n gl.attachShader(program, fragmentShader);\n gl.linkProgram(program);\n if (!gl.getProgramParameter(program, gl.LINK_STATUS)) {\n throw new FabricError(\n `Shader link error for \"${this.type}\" ${gl.getProgramInfoLog(program)}`,\n );\n }\n\n const uniformLocations = this.getUniformLocations(gl, program) || {};\n uniformLocations.uStepW = gl.getUniformLocation(program, 'uStepW');\n uniformLocations.uStepH = gl.getUniformLocation(program, 'uStepH');\n\n return {\n program,\n attributeLocations: this.getAttributeLocations(gl, program),\n uniformLocations,\n };\n }\n\n /**\n * Return a map of attribute names to WebGLAttributeLocation objects.\n *\n * @param {WebGLRenderingContext} gl The canvas context used to compile the shader program.\n * @param {WebGLShaderProgram} program The shader program from which to take attribute locations.\n * @returns {Object} A map of attribute names to attribute locations.\n */\n getAttributeLocations(\n gl: WebGLRenderingContext,\n program: WebGLProgram,\n ): TWebGLAttributeLocationMap {\n return {\n aPosition: gl.getAttribLocation(program, 'aPosition'),\n };\n }\n\n /**\n * Return a map of uniform names to WebGLUniformLocation objects.\n *\n * @param {WebGLRenderingContext} gl The canvas context used to compile the shader program.\n * @param {WebGLShaderProgram} program The shader program from which to take uniform locations.\n * @returns {Object} A map of uniform names to uniform locations.\n */\n getUniformLocations(\n gl: WebGLRenderingContext,\n program: WebGLProgram,\n ): TWebGLUniformLocationMap {\n const locations = (this.constructor as unknown as typeof BaseFilter)\n .uniformLocations;\n\n const uniformLocations: Record = {};\n for (let i = 0; i < locations.length; i++) {\n uniformLocations[locations[i]] = gl.getUniformLocation(\n program,\n locations[i],\n );\n }\n return uniformLocations;\n }\n\n /**\n * Send attribute data from this filter to its shader program on the GPU.\n *\n * @param {WebGLRenderingContext} gl The canvas context used to compile the shader program.\n * @param {Object} attributeLocations A map of shader attribute names to their locations.\n */\n sendAttributeData(\n gl: WebGLRenderingContext,\n attributeLocations: Record,\n aPositionData: Float32Array,\n ) {\n const attributeLocation = attributeLocations.aPosition;\n const buffer = gl.createBuffer();\n gl.bindBuffer(gl.ARRAY_BUFFER, buffer);\n gl.enableVertexAttribArray(attributeLocation);\n gl.vertexAttribPointer(attributeLocation, 2, gl.FLOAT, false, 0, 0);\n gl.bufferData(gl.ARRAY_BUFFER, aPositionData, gl.STATIC_DRAW);\n }\n\n _setupFrameBuffer(options: TWebGLPipelineState) {\n const gl = options.context;\n if (options.passes > 1) {\n const width = options.destinationWidth;\n const height = options.destinationHeight;\n if (options.sourceWidth !== width || options.sourceHeight !== height) {\n gl.deleteTexture(options.targetTexture);\n options.targetTexture = options.filterBackend.createTexture(\n gl,\n width,\n height,\n );\n }\n gl.framebufferTexture2D(\n gl.FRAMEBUFFER,\n gl.COLOR_ATTACHMENT0,\n gl.TEXTURE_2D,\n options.targetTexture,\n 0,\n );\n } else {\n // draw last filter on canvas and not to framebuffer.\n gl.bindFramebuffer(gl.FRAMEBUFFER, null);\n gl.finish();\n }\n }\n\n _swapTextures(options: TWebGLPipelineState) {\n options.passes--;\n options.pass++;\n const temp = options.targetTexture;\n options.targetTexture = options.sourceTexture;\n options.sourceTexture = temp;\n }\n\n /**\n * Generic isNeutral implementation for one parameter based filters.\n * Used only in image applyFilters to discard filters that will not have an effect\n * on the image\n * Other filters may need their own version ( ColorMatrix, HueRotation, gamma, ComposedFilter )\n * @param {Object} options\n **/\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n isNeutralState(options?: any): boolean {\n return false;\n }\n\n /**\n * Apply this filter to the input image data provided.\n *\n * Determines whether to use WebGL or Canvas2D based on the options.webgl flag.\n *\n * @param {Object} options\n * @param {Number} options.passes The number of filters remaining to be executed\n * @param {Boolean} options.webgl Whether to use webgl to render the filter.\n * @param {WebGLTexture} options.sourceTexture The texture setup as the source to be filtered.\n * @param {WebGLTexture} options.targetTexture The texture where filtered output should be drawn.\n * @param {WebGLRenderingContext} options.context The GL context used for rendering.\n * @param {Object} options.programCache A map of compiled shader programs, keyed by filter type.\n */\n applyTo(options: TWebGLPipelineState | T2DPipelineState) {\n if (isWebGLPipelineState(options)) {\n this._setupFrameBuffer(options);\n this.applyToWebGL(options);\n this._swapTextures(options);\n } else {\n this.applyTo2d(options);\n }\n }\n\n applyTo2d(_options: T2DPipelineState): void {\n // override by subclass\n }\n\n /**\n * Returns a string that represent the current selected shader code for the filter.\n * Used to force recompilation when parameters change or to retrieve the shader from cache\n * @type string\n **/\n getCacheKey(): string {\n return this.type;\n }\n\n /**\n * Retrieves the cached shader.\n * @param {Object} options\n * @param {WebGLRenderingContext} options.context The GL context used for rendering.\n * @param {Object} options.programCache A map of compiled shader programs, keyed by filter type.\n * @return {WebGLProgram} the compiled program shader\n */\n retrieveShader(options: TWebGLPipelineState): TWebGLProgramCacheItem {\n const key = this.getCacheKey();\n if (!options.programCache[key]) {\n options.programCache[key] = this.createProgram(options.context);\n }\n return options.programCache[key];\n }\n\n /**\n * Apply this filter using webgl.\n *\n * @param {Object} options\n * @param {Number} options.passes The number of filters remaining to be executed\n * @param {Boolean} options.webgl Whether to use webgl to render the filter.\n * @param {WebGLTexture} options.originalTexture The texture of the original input image.\n * @param {WebGLTexture} options.sourceTexture The texture setup as the source to be filtered.\n * @param {WebGLTexture} options.targetTexture The texture where filtered output should be drawn.\n * @param {WebGLRenderingContext} options.context The GL context used for rendering.\n * @param {Object} options.programCache A map of compiled shader programs, keyed by filter type.\n */\n applyToWebGL(options: TWebGLPipelineState) {\n const gl = options.context;\n const shader = this.retrieveShader(options);\n if (options.pass === 0 && options.originalTexture) {\n gl.bindTexture(gl.TEXTURE_2D, options.originalTexture);\n } else {\n gl.bindTexture(gl.TEXTURE_2D, options.sourceTexture);\n }\n gl.useProgram(shader.program);\n this.sendAttributeData(gl, shader.attributeLocations, options.aPosition);\n\n gl.uniform1f(shader.uniformLocations.uStepW, 1 / options.sourceWidth);\n gl.uniform1f(shader.uniformLocations.uStepH, 1 / options.sourceHeight);\n\n this.sendUniformData(gl, shader.uniformLocations);\n gl.viewport(0, 0, options.destinationWidth, options.destinationHeight);\n gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4);\n }\n\n bindAdditionalTexture(\n gl: WebGLRenderingContext,\n texture: WebGLTexture,\n textureUnit: number,\n ) {\n gl.activeTexture(textureUnit);\n gl.bindTexture(gl.TEXTURE_2D, texture);\n // reset active texture to 0 as usual\n gl.activeTexture(gl.TEXTURE0);\n }\n\n unbindAdditionalTexture(gl: WebGLRenderingContext, textureUnit: number) {\n gl.activeTexture(textureUnit);\n gl.bindTexture(gl.TEXTURE_2D, null);\n gl.activeTexture(gl.TEXTURE0);\n }\n\n /**\n * Send uniform data from this filter to its shader program on the GPU.\n *\n * Intended to be overridden by subclasses.\n *\n * @param {WebGLRenderingContext} _gl The canvas context used to compile the shader program.\n * @param {Object} _uniformLocations A map of shader uniform names to their locations.\n */\n sendUniformData(\n _gl: WebGLRenderingContext,\n _uniformLocations: TWebGLUniformLocationMap,\n ): void {\n // override by subclass\n }\n\n /**\n * If needed by a 2d filter, this functions can create an helper canvas to be used\n * remember that options.targetCanvas is available for use till end of chain.\n */\n createHelpLayer(options: T2DPipelineState) {\n if (!options.helpLayer) {\n const { sourceWidth, sourceHeight } = options;\n const helpLayer = createCanvasElementFor({\n width: sourceWidth,\n height: sourceHeight,\n });\n options.helpLayer = helpLayer;\n }\n }\n\n /**\n * Returns object representation of an instance\n * It will automatically export the default values of a filter,\n * stored in the static defaults property.\n * @return {Object} Object representation of an instance\n */\n toObject(): { type: Name } & SerializedProps {\n const defaultKeys = Object.keys(\n (this.constructor as typeof BaseFilter).defaults || {},\n ) as (keyof SerializedProps)[];\n\n return {\n type: this.type,\n ...defaultKeys.reduce((acc, key) => {\n acc[key] = this[\n key as keyof this\n ] as unknown as (typeof acc)[typeof key];\n return acc;\n }, {} as SerializedProps),\n };\n }\n\n /**\n * Returns a JSON representation of an instance\n * @return {Object} JSON\n */\n toJSON() {\n // delegate, not alias\n return this.toObject();\n }\n\n static async fromObject(\n { type, ...filterOptions }: Record,\n _options?: Abortable,\n ): Promise> {\n return new this(filterOptions);\n }\n}\n","export const blendColorFragmentSource = {\n multiply: 'gl_FragColor.rgb *= uColor.rgb;\\n',\n screen:\n 'gl_FragColor.rgb = 1.0 - (1.0 - gl_FragColor.rgb) * (1.0 - uColor.rgb);\\n',\n add: 'gl_FragColor.rgb += uColor.rgb;\\n',\n difference: 'gl_FragColor.rgb = abs(gl_FragColor.rgb - uColor.rgb);\\n',\n subtract: 'gl_FragColor.rgb -= uColor.rgb;\\n',\n lighten: 'gl_FragColor.rgb = max(gl_FragColor.rgb, uColor.rgb);\\n',\n darken: 'gl_FragColor.rgb = min(gl_FragColor.rgb, uColor.rgb);\\n',\n exclusion:\n 'gl_FragColor.rgb += uColor.rgb - 2.0 * (uColor.rgb * gl_FragColor.rgb);\\n',\n overlay: `\n if (uColor.r < 0.5) {\n gl_FragColor.r *= 2.0 * uColor.r;\n } else {\n gl_FragColor.r = 1.0 - 2.0 * (1.0 - gl_FragColor.r) * (1.0 - uColor.r);\n }\n if (uColor.g < 0.5) {\n gl_FragColor.g *= 2.0 * uColor.g;\n } else {\n gl_FragColor.g = 1.0 - 2.0 * (1.0 - gl_FragColor.g) * (1.0 - uColor.g);\n }\n if (uColor.b < 0.5) {\n gl_FragColor.b *= 2.0 * uColor.b;\n } else {\n gl_FragColor.b = 1.0 - 2.0 * (1.0 - gl_FragColor.b) * (1.0 - uColor.b);\n }\n `,\n tint: `\n gl_FragColor.rgb *= (1.0 - uColor.a);\n gl_FragColor.rgb += uColor.rgb;\n `,\n} as const;\n","import { Color } from '../color/Color';\nimport { BaseFilter } from './BaseFilter';\nimport type { T2DPipelineState, TWebGLUniformLocationMap } from './typedefs';\nimport { classRegistry } from '../ClassRegistry';\nimport { blendColorFragmentSource } from './shaders/blendColor';\n\nexport type TBlendMode =\n | 'multiply'\n | 'add'\n | 'difference'\n | 'screen'\n | 'subtract'\n | 'darken'\n | 'lighten'\n | 'overlay'\n | 'exclusion'\n | 'tint';\n\ntype BlendColorOwnProps = {\n color: string;\n mode: TBlendMode;\n alpha: number;\n};\n\nexport const blendColorDefaultValues: BlendColorOwnProps = {\n color: '#F95C63',\n mode: 'multiply',\n alpha: 1,\n};\n\n/**\n * Color Blend filter class\n * @example\n * const filter = new BlendColor({\n * color: '#000',\n * mode: 'multiply'\n * });\n *\n * const filter = new BlendImage({\n * image: fabricImageObject,\n * mode: 'multiply'\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n * canvas.renderAll();\n */\nexport class BlendColor extends BaseFilter<'BlendColor', BlendColorOwnProps> {\n /**\n * Color to make the blend operation with. default to a reddish color since black or white\n * gives always strong result.\n * @type String\n **/\n declare color: BlendColorOwnProps['color'];\n\n /**\n * Blend mode for the filter: one of multiply, add, difference, screen, subtract,\n * darken, lighten, overlay, exclusion, tint.\n * @type String\n **/\n declare mode: BlendColorOwnProps['mode'];\n /**\n * alpha value. represent the strength of the blend color operation.\n * @type Number\n **/\n declare alpha: BlendColorOwnProps['alpha'];\n\n static defaults = blendColorDefaultValues;\n\n static type = 'BlendColor';\n\n static uniformLocations = ['uColor'];\n\n getCacheKey() {\n return `${this.type}_${this.mode}`;\n }\n\n protected getFragmentSource(): string {\n return `\n precision highp float;\n uniform sampler2D uTexture;\n uniform vec4 uColor;\n varying vec2 vTexCoord;\n void main() {\n vec4 color = texture2D(uTexture, vTexCoord);\n gl_FragColor = color;\n if (color.a > 0.0) {\n ${blendColorFragmentSource[this.mode]}\n }\n }\n `;\n }\n\n /**\n * Apply the Blend operation to a Uint8ClampedArray representing the pixels of an image.\n *\n * @param {Object} options\n * @param {ImageData} options.imageData The Uint8ClampedArray to be filtered.\n */\n applyTo2d({ imageData: { data } }: T2DPipelineState) {\n const source = new Color(this.color).getSource();\n const alpha = this.alpha;\n const tr = source[0] * alpha;\n const tg = source[1] * alpha;\n const tb = source[2] * alpha;\n const alpha1 = 1 - alpha;\n\n for (let i = 0; i < data.length; i += 4) {\n const r = data[i];\n const g = data[i + 1];\n const b = data[i + 2];\n let oR, oG, oB;\n switch (this.mode) {\n case 'multiply':\n oR = (r * tr) / 255;\n oG = (g * tg) / 255;\n oB = (b * tb) / 255;\n break;\n case 'screen':\n oR = 255 - ((255 - r) * (255 - tr)) / 255;\n oG = 255 - ((255 - g) * (255 - tg)) / 255;\n oB = 255 - ((255 - b) * (255 - tb)) / 255;\n break;\n case 'add':\n oR = r + tr;\n oG = g + tg;\n oB = b + tb;\n break;\n case 'difference':\n oR = Math.abs(r - tr);\n oG = Math.abs(g - tg);\n oB = Math.abs(b - tb);\n break;\n case 'subtract':\n oR = r - tr;\n oG = g - tg;\n oB = b - tb;\n break;\n case 'darken':\n oR = Math.min(r, tr);\n oG = Math.min(g, tg);\n oB = Math.min(b, tb);\n break;\n case 'lighten':\n oR = Math.max(r, tr);\n oG = Math.max(g, tg);\n oB = Math.max(b, tb);\n break;\n case 'overlay':\n oR =\n tr < 128\n ? (2 * r * tr) / 255\n : 255 - (2 * (255 - r) * (255 - tr)) / 255;\n oG =\n tg < 128\n ? (2 * g * tg) / 255\n : 255 - (2 * (255 - g) * (255 - tg)) / 255;\n oB =\n tb < 128\n ? (2 * b * tb) / 255\n : 255 - (2 * (255 - b) * (255 - tb)) / 255;\n break;\n case 'exclusion':\n oR = tr + r - (2 * tr * r) / 255;\n oG = tg + g - (2 * tg * g) / 255;\n oB = tb + b - (2 * tb * b) / 255;\n break;\n case 'tint':\n oR = tr + r * alpha1;\n oG = tg + g * alpha1;\n oB = tb + b * alpha1;\n }\n data[i] = oR;\n data[i + 1] = oG;\n data[i + 2] = oB;\n }\n }\n\n /**\n * Send data from this filter to its shader program's uniforms.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n */\n sendUniformData(\n gl: WebGLRenderingContext,\n uniformLocations: TWebGLUniformLocationMap,\n ) {\n const source = new Color(this.color).getSource();\n source[0] = (this.alpha * source[0]) / 255;\n source[1] = (this.alpha * source[1]) / 255;\n source[2] = (this.alpha * source[2]) / 255;\n source[3] = this.alpha;\n gl.uniform4fv(uniformLocations.uColor, source);\n }\n}\n\nclassRegistry.setClass(BlendColor);\n","import type { TBlendImageMode } from '../BlendImage';\n\nexport const fragmentSource: Record = {\n multiply: `\n precision highp float;\n uniform sampler2D uTexture;\n uniform sampler2D uImage;\n uniform vec4 uColor;\n varying vec2 vTexCoord;\n varying vec2 vTexCoord2;\n void main() {\n vec4 color = texture2D(uTexture, vTexCoord);\n vec4 color2 = texture2D(uImage, vTexCoord2);\n color.rgba *= color2.rgba;\n gl_FragColor = color;\n }\n `,\n mask: `\n precision highp float;\n uniform sampler2D uTexture;\n uniform sampler2D uImage;\n uniform vec4 uColor;\n varying vec2 vTexCoord;\n varying vec2 vTexCoord2;\n void main() {\n vec4 color = texture2D(uTexture, vTexCoord);\n vec4 color2 = texture2D(uImage, vTexCoord2);\n color.a = color2.a;\n gl_FragColor = color;\n }\n `,\n} as const;\n\nexport const vertexSource = `\n attribute vec2 aPosition;\n varying vec2 vTexCoord;\n varying vec2 vTexCoord2;\n uniform mat3 uTransformMatrix;\n void main() {\n vTexCoord = aPosition;\n vTexCoord2 = (uTransformMatrix * vec3(aPosition, 1.0)).xy;\n gl_Position = vec4(aPosition * 2.0 - 1.0, 0.0, 1.0);\n }\n ` as const;\n","import { FabricImage } from '../shapes/Image';\nimport { createCanvasElement } from '../util/misc/dom';\nimport { BaseFilter } from './BaseFilter';\nimport type {\n T2DPipelineState,\n TWebGLPipelineState,\n TWebGLUniformLocationMap,\n} from './typedefs';\nimport type { WebGLFilterBackend } from './WebGLFilterBackend';\nimport { classRegistry } from '../ClassRegistry';\nimport { fragmentSource, vertexSource } from './shaders/blendImage';\n\nexport type TBlendImageMode = 'multiply' | 'mask';\n\ntype BlendImageOwnProps = {\n mode: TBlendImageMode;\n alpha: number;\n};\n\nexport const blendImageDefaultValues: BlendImageOwnProps = {\n mode: 'multiply',\n alpha: 1,\n};\n\n/**\n * Image Blend filter class\n * @example\n * const filter = new filters.BlendColor({\n * color: '#000',\n * mode: 'multiply'\n * });\n *\n * const filter = new BlendImage({\n * image: fabricImageObject,\n * mode: 'multiply'\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n * canvas.renderAll();\n */\nexport class BlendImage extends BaseFilter<'BlendImage', BlendImageOwnProps> {\n /**\n * Image to make the blend operation with.\n **/\n declare image: FabricImage;\n\n /**\n * Blend mode for the filter: either 'multiply' or 'mask'. 'multiply' will\n * multiply the values of each channel (R, G, B, and A) of the filter image by\n * their corresponding values in the base image. 'mask' will only look at the\n * alpha channel of the filter image, and apply those values to the base\n * image's alpha channel.\n * @type String\n **/\n declare mode: BlendImageOwnProps['mode'];\n\n /**\n * alpha value. represent the strength of the blend image operation.\n * not implemented.\n **/\n declare alpha: BlendImageOwnProps['alpha'];\n\n static type = 'BlendImage';\n\n static defaults = blendImageDefaultValues;\n\n static uniformLocations = ['uTransformMatrix', 'uImage'];\n\n getCacheKey() {\n return `${this.type}_${this.mode}`;\n }\n\n getFragmentSource(): string {\n return fragmentSource[this.mode];\n }\n\n getVertexSource(): string {\n return vertexSource;\n }\n\n applyToWebGL(options: TWebGLPipelineState) {\n const gl = options.context,\n texture = this.createTexture(options.filterBackend, this.image);\n this.bindAdditionalTexture(gl, texture!, gl.TEXTURE1);\n super.applyToWebGL(options);\n this.unbindAdditionalTexture(gl, gl.TEXTURE1);\n }\n\n createTexture(backend: WebGLFilterBackend, image: FabricImage) {\n return backend.getCachedTexture(image.cacheKey, image.getElement());\n }\n\n /**\n * Calculate a transformMatrix to adapt the image to blend over\n * @param {Object} options\n * @param {WebGLRenderingContext} options.context The GL context used for rendering.\n * @param {Object} options.programCache A map of compiled shader programs, keyed by filter type.\n */\n calculateMatrix() {\n const image = this.image,\n { width, height } = image.getElement();\n return [\n 1 / image.scaleX,\n 0,\n 0,\n 0,\n 1 / image.scaleY,\n 0,\n -image.left / width,\n -image.top / height,\n 1,\n ];\n }\n\n /**\n * Apply the Blend operation to a Uint8ClampedArray representing the pixels of an image.\n *\n * @param {Object} options\n * @param {ImageData} options.imageData The Uint8ClampedArray to be filtered.\n */\n applyTo2d({\n imageData: { data, width, height },\n filterBackend: { resources },\n }: T2DPipelineState) {\n const image = this.image;\n if (!resources.blendImage) {\n resources.blendImage = createCanvasElement();\n }\n const canvas1 = resources.blendImage;\n const context = canvas1.getContext('2d')!;\n if (canvas1.width !== width || canvas1.height !== height) {\n canvas1.width = width;\n canvas1.height = height;\n } else {\n context.clearRect(0, 0, width, height);\n }\n context.setTransform(\n image.scaleX,\n 0,\n 0,\n image.scaleY,\n image.left,\n image.top,\n );\n context.drawImage(image.getElement(), 0, 0, width, height);\n const blendData = context.getImageData(0, 0, width, height).data;\n for (let i = 0; i < data.length; i += 4) {\n const r = data[i];\n const g = data[i + 1];\n const b = data[i + 2];\n const a = data[i + 3];\n\n const tr = blendData[i];\n const tg = blendData[i + 1];\n const tb = blendData[i + 2];\n const ta = blendData[i + 3];\n\n switch (this.mode) {\n case 'multiply':\n data[i] = (r * tr) / 255;\n data[i + 1] = (g * tg) / 255;\n data[i + 2] = (b * tb) / 255;\n data[i + 3] = (a * ta) / 255;\n break;\n case 'mask':\n data[i + 3] = ta;\n break;\n }\n }\n }\n\n /**\n * Send data from this filter to its shader program's uniforms.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n */\n sendUniformData(\n gl: WebGLRenderingContext,\n uniformLocations: TWebGLUniformLocationMap,\n ) {\n const matrix = this.calculateMatrix();\n gl.uniform1i(uniformLocations.uImage, 1); // texture unit 1.\n gl.uniformMatrix3fv(uniformLocations.uTransformMatrix, false, matrix);\n }\n\n /**\n * Returns object representation of an instance\n * TODO: Handle the possibility of missing image better.\n * As of now a BlendImage filter without image can't be used with fromObject\n * @return {Object} Object representation of an instance\n */\n toObject(): {\n type: 'BlendImage';\n image: ReturnType;\n } & BlendImageOwnProps {\n return {\n ...super.toObject(),\n image: this.image && this.image.toObject(),\n };\n }\n\n /**\n * Create filter instance from an object representation\n * @param {object} object Object to create an instance from\n * @param {object} [options]\n * @param {AbortSignal} [options.signal] handle aborting image loading, see https://developer.mozilla.org/en-US/docs/Web/API/AbortController/signal\n * @returns {Promise}\n */\n static async fromObject(\n { type, image, ...filterOptions }: Record,\n options: { signal: AbortSignal },\n ): Promise> {\n return FabricImage.fromObject(image, options).then(\n (enlivedImage) => new this({ ...filterOptions, image: enlivedImage }),\n );\n }\n}\n\nclassRegistry.setClass(BlendImage);\n","import { BaseFilter } from './BaseFilter';\nimport type {\n TWebGLPipelineState,\n T2DPipelineState,\n TWebGLUniformLocationMap,\n} from './typedefs';\nimport { isWebGLPipelineState } from './utils';\nimport { classRegistry } from '../ClassRegistry';\nimport { fragmentSource } from './shaders/blur';\n\ntype BlurOwnProps = {\n blur: number;\n};\n\nexport const blurDefaultValues: BlurOwnProps = {\n blur: 0,\n};\n\n/**\n * Blur filter class\n * @example\n * const filter = new Blur({\n * blur: 0.5\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n * canvas.renderAll();\n */\nexport class Blur extends BaseFilter<'Blur', BlurOwnProps> {\n /**\n * blur value, in percentage of image dimensions.\n * specific to keep the image blur constant at different resolutions\n * range between 0 and 1.\n * @type Number\n */\n declare blur: BlurOwnProps['blur'];\n\n declare horizontal: boolean;\n declare aspectRatio: number;\n\n static type = 'Blur';\n\n static defaults = blurDefaultValues;\n\n static uniformLocations = ['uDelta'];\n\n getFragmentSource(): string {\n return fragmentSource;\n }\n\n applyTo(options: TWebGLPipelineState | T2DPipelineState) {\n if (isWebGLPipelineState(options)) {\n // this aspectRatio is used to give the same blur to vertical and horizontal\n this.aspectRatio = options.sourceWidth / options.sourceHeight;\n options.passes++;\n this._setupFrameBuffer(options);\n this.horizontal = true;\n this.applyToWebGL(options);\n this._swapTextures(options);\n this._setupFrameBuffer(options);\n this.horizontal = false;\n this.applyToWebGL(options);\n this._swapTextures(options);\n } else {\n this.applyTo2d(options);\n }\n }\n\n applyTo2d({ imageData: { data, width, height } }: T2DPipelineState) {\n // this code mimic the shader for output consistency\n // it samples 31 pixels across the image over a distance that depends from the blur value.\n this.aspectRatio = width / height;\n this.horizontal = true;\n let blurValue = this.getBlurValue() * width;\n const imageData = new Uint8ClampedArray(data);\n const samples = 15;\n const bytesInRow = 4 * width;\n for (let i = 0; i < data.length; i += 4) {\n let r = 0.0,\n g = 0.0,\n b = 0.0,\n a = 0.0,\n totalA = 0;\n const minIRow = i - (i % bytesInRow);\n const maxIRow = minIRow + bytesInRow;\n // for now let's keep noise out of the way\n // let pixelOffset = 0;\n // const offset = Math.random() * 3;\n // if (offset > 2) {\n // pixelOffset = 4;\n // } else if (offset < 1) {\n // pixelOffset = -4;\n // }\n for (let j = -samples + 1; j < samples; j++) {\n const percent = j / samples;\n const distance = Math.floor(blurValue * percent) * 4;\n const weight = 1 - Math.abs(percent);\n let sampledPixel = i + distance; // + pixelOffset;\n // try to implement edge mirroring\n if (sampledPixel < minIRow) {\n sampledPixel = minIRow;\n } else if (sampledPixel > maxIRow) {\n sampledPixel = maxIRow;\n }\n const localAlpha = data[sampledPixel + 3] * weight;\n r += data[sampledPixel] * localAlpha;\n g += data[sampledPixel + 1] * localAlpha;\n b += data[sampledPixel + 2] * localAlpha;\n a += localAlpha;\n totalA += weight;\n }\n imageData[i] = r / a;\n imageData[i + 1] = g / a;\n imageData[i + 2] = b / a;\n imageData[i + 3] = a / totalA;\n }\n this.horizontal = false;\n blurValue = this.getBlurValue() * height;\n for (let i = 0; i < imageData.length; i += 4) {\n let r = 0.0,\n g = 0.0,\n b = 0.0,\n a = 0.0,\n totalA = 0;\n const minIRow = i % bytesInRow;\n const maxIRow = imageData.length - bytesInRow + minIRow;\n // for now let's keep noise out of the way\n // let pixelOffset = 0;\n // const offset = Math.random() * 3;\n // if (offset > 2) {\n // pixelOffset = bytesInRow;\n // } else if (offset < 1) {\n // pixelOffset = -bytesInRow;\n // }\n for (let j = -samples + 1; j < samples; j++) {\n const percent = j / samples;\n const distance = Math.floor(blurValue * percent) * bytesInRow;\n const weight = 1 - Math.abs(percent);\n let sampledPixel = i + distance; // + pixelOffset;\n // try to implement edge mirroring\n if (sampledPixel < minIRow) {\n sampledPixel = minIRow;\n } else if (sampledPixel > maxIRow) {\n sampledPixel = maxIRow;\n }\n const localAlpha = imageData[sampledPixel + 3] * weight;\n r += imageData[sampledPixel] * localAlpha;\n g += imageData[sampledPixel + 1] * localAlpha;\n b += imageData[sampledPixel + 2] * localAlpha;\n a += localAlpha;\n totalA += weight;\n }\n data[i] = r / a;\n data[i + 1] = g / a;\n data[i + 2] = b / a;\n data[i + 3] = a / totalA;\n }\n }\n\n /**\n * Send data from this filter to its shader program's uniforms.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n */\n sendUniformData(\n gl: WebGLRenderingContext,\n uniformLocations: TWebGLUniformLocationMap,\n ) {\n const delta = this.chooseRightDelta();\n gl.uniform2fv(uniformLocations.uDelta, delta);\n }\n\n isNeutralState() {\n return this.blur === 0;\n }\n\n getBlurValue(): number {\n let blurScale = 1;\n const { horizontal, aspectRatio } = this;\n if (horizontal) {\n if (aspectRatio > 1) {\n // image is wide, i want to shrink radius horizontal\n blurScale = 1 / aspectRatio;\n }\n } else {\n if (aspectRatio < 1) {\n // image is tall, i want to shrink radius vertical\n blurScale = aspectRatio;\n }\n }\n return blurScale * this.blur * 0.12;\n }\n\n /**\n * choose right value of image percentage to blur with\n * @returns {Array} a numeric array with delta values\n */\n chooseRightDelta() {\n const blur = this.getBlurValue();\n return this.horizontal ? [blur, 0] : [0, blur];\n }\n}\n\nclassRegistry.setClass(Blur);\n","export const fragmentSource = `\n precision highp float;\n uniform sampler2D uTexture;\n uniform vec2 uDelta;\n varying vec2 vTexCoord;\n const float nSamples = 15.0;\n vec3 v3offset = vec3(12.9898, 78.233, 151.7182);\n float random(vec3 scale) {\n /* use the fragment position for a different seed per-pixel */\n return fract(sin(dot(gl_FragCoord.xyz, scale)) * 43758.5453);\n }\n void main() {\n vec4 color = vec4(0.0);\n float totalC = 0.0;\n float totalA = 0.0;\n float offset = random(v3offset);\n for (float t = -nSamples; t <= nSamples; t++) {\n float percent = (t + offset - 0.5) / nSamples;\n vec4 sample = texture2D(uTexture, vTexCoord + uDelta * percent);\n float weight = 1.0 - abs(percent);\n float alpha = weight * sample.a;\n color.rgb += sample.rgb * alpha;\n color.a += alpha;\n totalA += weight;\n totalC += alpha;\n }\n gl_FragColor.rgb = color.rgb / totalC;\n gl_FragColor.a = color.a / totalA;\n }\n ` as const;\n","import { BaseFilter } from './BaseFilter';\nimport type { T2DPipelineState, TWebGLUniformLocationMap } from './typedefs';\nimport { classRegistry } from '../ClassRegistry';\nimport { fragmentSource } from './shaders/brightness';\n\ntype BrightnessOwnProps = {\n brightness: number;\n};\n\nexport const brightnessDefaultValues: BrightnessOwnProps = {\n brightness: 0,\n};\n\n/**\n * Brightness filter class\n * @example\n * const filter = new Brightness({\n * brightness: 0.05\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n */\nexport class Brightness extends BaseFilter<'Brightness', BrightnessOwnProps> {\n /**\n * Brightness value, from -1 to 1.\n * translated to -255 to 255 for 2d\n * 0.0039215686 is the part of 1 that get translated to 1 in 2d\n * @param {Number} brightness\n */\n declare brightness: BrightnessOwnProps['brightness'];\n\n static type = 'Brightness';\n\n static defaults = brightnessDefaultValues;\n\n static uniformLocations = ['uBrightness'];\n\n getFragmentSource() {\n return fragmentSource;\n }\n\n /**\n * Apply the Brightness operation to a Uint8ClampedArray representing the pixels of an image.\n *\n * @param {Object} options\n * @param {ImageData} options.imageData The Uint8ClampedArray to be filtered.\n */\n applyTo2d({ imageData: { data } }: T2DPipelineState) {\n const brightness = Math.round(this.brightness * 255);\n for (let i = 0; i < data.length; i += 4) {\n data[i] += brightness;\n data[i + 1] += brightness;\n data[i + 2] += brightness;\n }\n }\n\n isNeutralState() {\n return this.brightness === 0;\n }\n\n /**\n * Send data from this filter to its shader program's uniforms.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n */\n sendUniformData(\n gl: WebGLRenderingContext,\n uniformLocations: TWebGLUniformLocationMap,\n ) {\n gl.uniform1f(uniformLocations.uBrightness, this.brightness);\n }\n}\n\nclassRegistry.setClass(Brightness);\n","export const fragmentSource = `\n precision highp float;\n uniform sampler2D uTexture;\n uniform float uBrightness;\n varying vec2 vTexCoord;\n void main() {\n vec4 color = texture2D(uTexture, vTexCoord);\n color.rgb += uBrightness;\n gl_FragColor = color;\n }\n`;\n","export const fragmentSource = `\n precision highp float;\n uniform sampler2D uTexture;\n varying vec2 vTexCoord;\n uniform mat4 uColorMatrix;\n uniform vec4 uConstants;\n void main() {\n vec4 color = texture2D(uTexture, vTexCoord);\n color *= uColorMatrix;\n color += uConstants;\n gl_FragColor = color;\n }`;\n","import { BaseFilter } from './BaseFilter';\nimport type {\n T2DPipelineState,\n TMatColorMatrix,\n TWebGLUniformLocationMap,\n} from './typedefs';\nimport { classRegistry } from '../ClassRegistry';\nimport { fragmentSource } from './shaders/colorMatrix';\n\nexport type ColorMatrixOwnProps = {\n matrix: TMatColorMatrix;\n colorsOnly: boolean;\n};\n\nexport const colorMatrixDefaultValues: ColorMatrixOwnProps = {\n matrix: [1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0],\n colorsOnly: true,\n};\n\n/**\n * Color Matrix filter class\n * @see {@link http://fabric5.fabricjs.com/image-filters|ImageFilters demo}\n * @see {@link http://phoboslab.org/log/2013/11/fast-image-filters-with-webgl demo}\n * @example Kodachrome filter\n * const filter = new ColorMatrix({\n * matrix: [\n 1.1285582396593525, -0.3967382283601348, -0.03992559172921793, 0, 63.72958762196502,\n -0.16404339962244616, 1.0835251566291304, -0.05498805115633132, 0, 24.732407896706203,\n -0.16786010706155763, -0.5603416277695248, 1.6014850761964943, 0, 35.62982807460946,\n 0, 0, 0, 1, 0\n ]\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n */\nexport class ColorMatrix<\n Name extends string = 'ColorMatrix',\n OwnProps extends object = ColorMatrixOwnProps,\n SerializedProps extends object = ColorMatrixOwnProps,\n> extends BaseFilter {\n /**\n * Colormatrix for pixels.\n * array of 20 floats. Numbers in positions 4, 9, 14, 19 loose meaning\n * outside the -1, 1 range.\n * 0.0039215686 is the part of 1 that get translated to 1 in 2d\n * @param {Array} matrix array of 20 numbers.\n */\n declare matrix: ColorMatrixOwnProps['matrix'];\n\n /**\n * Lock the colormatrix on the color part, skipping alpha, mainly for non webgl scenario\n * to save some calculation\n * @type Boolean\n * @default true\n */\n declare colorsOnly: ColorMatrixOwnProps['colorsOnly'];\n\n static type = 'ColorMatrix';\n\n static defaults = colorMatrixDefaultValues;\n\n static uniformLocations = ['uColorMatrix', 'uConstants'];\n\n getFragmentSource(): string {\n return fragmentSource;\n }\n\n /**\n * Apply the ColorMatrix operation to a Uint8Array representing the pixels of an image.\n *\n * @param {Object} options\n * @param {ImageData} options.imageData The Uint8Array to be filtered.\n */\n applyTo2d(options: T2DPipelineState) {\n const imageData = options.imageData,\n data = imageData.data,\n m = this.matrix,\n colorsOnly = this.colorsOnly;\n\n for (let i = 0; i < data.length; i += 4) {\n const r = data[i];\n const g = data[i + 1];\n const b = data[i + 2];\n\n data[i] = r * m[0] + g * m[1] + b * m[2] + m[4] * 255;\n data[i + 1] = r * m[5] + g * m[6] + b * m[7] + m[9] * 255;\n data[i + 2] = r * m[10] + g * m[11] + b * m[12] + m[14] * 255;\n if (!colorsOnly) {\n const a = data[i + 3];\n data[i] += a * m[3];\n data[i + 1] += a * m[8];\n data[i + 2] += a * m[13];\n data[i + 3] =\n r * m[15] + g * m[16] + b * m[17] + a * m[18] + m[19] * 255;\n }\n }\n }\n\n /**\n * Send data from this filter to its shader program's uniforms.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n */\n sendUniformData(\n gl: WebGLRenderingContext,\n uniformLocations: TWebGLUniformLocationMap,\n ) {\n const m = this.matrix,\n matrix = [\n m[0],\n m[1],\n m[2],\n m[3],\n m[5],\n m[6],\n m[7],\n m[8],\n m[10],\n m[11],\n m[12],\n m[13],\n m[15],\n m[16],\n m[17],\n m[18],\n ],\n constants = [m[4], m[9], m[14], m[19]];\n gl.uniformMatrix4fv(uniformLocations.uColorMatrix, false, matrix);\n gl.uniform4fv(uniformLocations.uConstants, constants);\n }\n\n toObject(): { type: Name } & SerializedProps {\n return {\n ...super.toObject(),\n matrix: [...this.matrix] as TMatColorMatrix,\n };\n }\n}\n\nclassRegistry.setClass(ColorMatrix);\n","import { ColorMatrix } from './ColorMatrix';\nimport { classRegistry } from '../ClassRegistry';\nimport type { TMatColorMatrix } from './typedefs';\n\ntype FixedFiltersOwnProps = {\n colorsOnly: boolean;\n};\n\nexport function createColorMatrixFilter(key: string, matrix: TMatColorMatrix) {\n const newClass = class extends ColorMatrix<\n typeof key,\n FixedFiltersOwnProps,\n FixedFiltersOwnProps\n > {\n static type = key;\n\n static defaults = {\n colorsOnly: false,\n matrix,\n };\n\n toObject(): { type: string } & FixedFiltersOwnProps {\n return { type: this.type, colorsOnly: this.colorsOnly };\n }\n };\n classRegistry.setClass(newClass, key);\n return newClass as typeof ColorMatrix;\n}\n\nexport const Brownie = createColorMatrixFilter(\n 'Brownie',\n [\n 0.5997, 0.34553, -0.27082, 0, 0.186, -0.0377, 0.86095, 0.15059, 0, -0.1449,\n 0.24113, -0.07441, 0.44972, 0, -0.02965, 0, 0, 0, 1, 0,\n ],\n);\n\nexport const Vintage = createColorMatrixFilter(\n 'Vintage',\n [\n 0.62793, 0.32021, -0.03965, 0, 0.03784, 0.02578, 0.64411, 0.03259, 0,\n 0.02926, 0.0466, -0.08512, 0.52416, 0, 0.02023, 0, 0, 0, 1, 0,\n ],\n);\n\nexport const Kodachrome = createColorMatrixFilter(\n 'Kodachrome',\n [\n 1.12855, -0.39673, -0.03992, 0, 0.24991, -0.16404, 1.08352, -0.05498, 0,\n 0.09698, -0.16786, -0.56034, 1.60148, 0, 0.13972, 0, 0, 0, 1, 0,\n ],\n);\n\nexport const Technicolor = createColorMatrixFilter(\n 'Technicolor',\n [\n 1.91252, -0.85453, -0.09155, 0, 0.04624, -0.30878, 1.76589, -0.10601, 0,\n -0.27589, -0.2311, -0.75018, 1.84759, 0, 0.12137, 0, 0, 0, 1, 0,\n ],\n);\n\nexport const Polaroid = createColorMatrixFilter(\n 'Polaroid',\n [\n 1.438, -0.062, -0.062, 0, 0, -0.122, 1.378, -0.122, 0, 0, -0.016, -0.016,\n 1.483, 0, 0, 0, 0, 0, 1, 0,\n ],\n);\n\nexport const Sepia = createColorMatrixFilter(\n 'Sepia',\n [\n 0.393, 0.769, 0.189, 0, 0, 0.349, 0.686, 0.168, 0, 0, 0.272, 0.534, 0.131,\n 0, 0, 0, 0, 0, 1, 0,\n ],\n);\n\nexport const BlackWhite = createColorMatrixFilter(\n 'BlackWhite',\n [\n 1.5, 1.5, 1.5, 0, -1, 1.5, 1.5, 1.5, 0, -1, 1.5, 1.5, 1.5, 0, -1, 0, 0, 0,\n 1, 0,\n ],\n);\n","import { BaseFilter } from './BaseFilter';\nimport type { T2DPipelineState, TWebGLPipelineState } from './typedefs';\nimport { isWebGLPipelineState } from './utils';\nimport { classRegistry } from '../ClassRegistry';\n\ntype ComposedOwnProps = {\n subFilters: BaseFilter[];\n};\n\ntype ComposedSerializedProps = {\n subFilters: Record[];\n};\n\n/**\n * A container class that knows how to apply a sequence of filters to an input image.\n */\nexport class Composed extends BaseFilter<\n 'Composed',\n ComposedOwnProps,\n ComposedSerializedProps\n> {\n /**\n * A non sparse array of filters to apply\n */\n declare subFilters: ComposedOwnProps['subFilters'];\n\n static type = 'Composed';\n\n constructor(\n options: { subFilters?: BaseFilter[] } & Record = {},\n ) {\n super(options);\n this.subFilters = options.subFilters || [];\n }\n\n /**\n * Apply this container's filters to the input image provided.\n *\n * @param {Object} options\n * @param {Number} options.passes The number of filters remaining to be applied.\n */\n applyTo(options: TWebGLPipelineState | T2DPipelineState) {\n if (isWebGLPipelineState(options)) {\n options.passes += this.subFilters.length - 1;\n }\n this.subFilters.forEach((filter) => {\n filter.applyTo(options);\n });\n }\n\n /**\n * Serialize this filter into JSON.\n * @returns {Object} A JSON representation of this filter.\n */\n toObject() {\n return {\n type: this.type,\n subFilters: this.subFilters.map((filter) => filter.toObject()),\n };\n }\n\n isNeutralState() {\n return !this.subFilters.some((filter) => !filter.isNeutralState());\n }\n\n /**\n * Deserialize a JSON definition of a ComposedFilter into a concrete instance.\n * @param {oject} object Object to create an instance from\n * @param {object} [options]\n * @param {AbortSignal} [options.signal] handle aborting `BlendImage` filter loading, see https://developer.mozilla.org/en-US/docs/Web/API/AbortController/signal\n * @returns {Promise}\n */\n static fromObject(\n object: Record,\n options?: { signal: AbortSignal },\n ): Promise {\n return Promise.all(\n ((object.subFilters || []) as BaseFilter[]).map((filter) =>\n classRegistry\n .getClass(filter.type)\n .fromObject(filter, options),\n ),\n ).then((enlivedFilters) => new this({ subFilters: enlivedFilters }));\n }\n}\n\nclassRegistry.setClass(Composed);\n","import { BaseFilter } from './BaseFilter';\nimport type { T2DPipelineState, TWebGLUniformLocationMap } from './typedefs';\nimport { classRegistry } from '../ClassRegistry';\nimport { fragmentSource } from './shaders/constrast';\n\ntype ContrastOwnProps = {\n contrast: number;\n};\n\nexport const contrastDefaultValues: ContrastOwnProps = {\n contrast: 0,\n};\n\n/**\n * Contrast filter class\n * @example\n * const filter = new Contrast({\n * contrast: 0.25\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n */\nexport class Contrast extends BaseFilter<'Contrast', ContrastOwnProps> {\n /**\n * contrast value, range from -1 to 1.\n * @param {Number} contrast\n * @default 0\n */\n declare contrast: ContrastOwnProps['contrast'];\n\n static type = 'Contrast';\n\n static defaults = contrastDefaultValues;\n\n static uniformLocations = ['uContrast'];\n\n getFragmentSource() {\n return fragmentSource;\n }\n\n isNeutralState() {\n return this.contrast === 0;\n }\n\n /**\n * Apply the Contrast operation to a Uint8Array representing the pixels of an image.\n *\n * @param {Object} options\n * @param {ImageData} options.imageData The Uint8Array to be filtered.\n */\n applyTo2d({ imageData: { data } }: T2DPipelineState) {\n const contrast = Math.floor(this.contrast * 255),\n contrastF = (259 * (contrast + 255)) / (255 * (259 - contrast));\n\n for (let i = 0; i < data.length; i += 4) {\n data[i] = contrastF * (data[i] - 128) + 128;\n data[i + 1] = contrastF * (data[i + 1] - 128) + 128;\n data[i + 2] = contrastF * (data[i + 2] - 128) + 128;\n }\n }\n\n /**\n * Send data from this filter to its shader program's uniforms.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n */\n sendUniformData(\n gl: WebGLRenderingContext,\n uniformLocations: TWebGLUniformLocationMap,\n ) {\n gl.uniform1f(uniformLocations.uContrast, this.contrast);\n }\n}\n\nclassRegistry.setClass(Contrast);\n","export const fragmentSource = `\n precision highp float;\n uniform sampler2D uTexture;\n uniform float uContrast;\n varying vec2 vTexCoord;\n void main() {\n vec4 color = texture2D(uTexture, vTexCoord);\n float contrastF = 1.015 * (uContrast + 1.0) / (1.0 * (1.015 - uContrast));\n color.rgb = contrastF * (color.rgb - 0.5) + 0.5;\n gl_FragColor = color;\n }`;\n","export const fragmentSource = {\n Convolute_3_1: `\n precision highp float;\n uniform sampler2D uTexture;\n uniform float uMatrix[9];\n uniform float uStepW;\n uniform float uStepH;\n varying vec2 vTexCoord;\n void main() {\n vec4 color = vec4(0, 0, 0, 0);\n for (float h = 0.0; h < 3.0; h+=1.0) {\n for (float w = 0.0; w < 3.0; w+=1.0) {\n vec2 matrixPos = vec2(uStepW * (w - 1), uStepH * (h - 1));\n color += texture2D(uTexture, vTexCoord + matrixPos) * uMatrix[int(h * 3.0 + w)];\n }\n }\n gl_FragColor = color;\n }\n `,\n Convolute_3_0: `\n precision highp float;\n uniform sampler2D uTexture;\n uniform float uMatrix[9];\n uniform float uStepW;\n uniform float uStepH;\n varying vec2 vTexCoord;\n void main() {\n vec4 color = vec4(0, 0, 0, 1);\n for (float h = 0.0; h < 3.0; h+=1.0) {\n for (float w = 0.0; w < 3.0; w+=1.0) {\n vec2 matrixPos = vec2(uStepW * (w - 1.0), uStepH * (h - 1.0));\n color.rgb += texture2D(uTexture, vTexCoord + matrixPos).rgb * uMatrix[int(h * 3.0 + w)];\n }\n }\n float alpha = texture2D(uTexture, vTexCoord).a;\n gl_FragColor = color;\n gl_FragColor.a = alpha;\n }\n `,\n Convolute_5_1: `\n precision highp float;\n uniform sampler2D uTexture;\n uniform float uMatrix[25];\n uniform float uStepW;\n uniform float uStepH;\n varying vec2 vTexCoord;\n void main() {\n vec4 color = vec4(0, 0, 0, 0);\n for (float h = 0.0; h < 5.0; h+=1.0) {\n for (float w = 0.0; w < 5.0; w+=1.0) {\n vec2 matrixPos = vec2(uStepW * (w - 2.0), uStepH * (h - 2.0));\n color += texture2D(uTexture, vTexCoord + matrixPos) * uMatrix[int(h * 5.0 + w)];\n }\n }\n gl_FragColor = color;\n }\n `,\n Convolute_5_0: `\n precision highp float;\n uniform sampler2D uTexture;\n uniform float uMatrix[25];\n uniform float uStepW;\n uniform float uStepH;\n varying vec2 vTexCoord;\n void main() {\n vec4 color = vec4(0, 0, 0, 1);\n for (float h = 0.0; h < 5.0; h+=1.0) {\n for (float w = 0.0; w < 5.0; w+=1.0) {\n vec2 matrixPos = vec2(uStepW * (w - 2.0), uStepH * (h - 2.0));\n color.rgb += texture2D(uTexture, vTexCoord + matrixPos).rgb * uMatrix[int(h * 5.0 + w)];\n }\n }\n float alpha = texture2D(uTexture, vTexCoord).a;\n gl_FragColor = color;\n gl_FragColor.a = alpha;\n }\n `,\n Convolute_7_1: `\n precision highp float;\n uniform sampler2D uTexture;\n uniform float uMatrix[49];\n uniform float uStepW;\n uniform float uStepH;\n varying vec2 vTexCoord;\n void main() {\n vec4 color = vec4(0, 0, 0, 0);\n for (float h = 0.0; h < 7.0; h+=1.0) {\n for (float w = 0.0; w < 7.0; w+=1.0) {\n vec2 matrixPos = vec2(uStepW * (w - 3.0), uStepH * (h - 3.0));\n color += texture2D(uTexture, vTexCoord + matrixPos) * uMatrix[int(h * 7.0 + w)];\n }\n }\n gl_FragColor = color;\n }\n `,\n Convolute_7_0: `\n precision highp float;\n uniform sampler2D uTexture;\n uniform float uMatrix[49];\n uniform float uStepW;\n uniform float uStepH;\n varying vec2 vTexCoord;\n void main() {\n vec4 color = vec4(0, 0, 0, 1);\n for (float h = 0.0; h < 7.0; h+=1.0) {\n for (float w = 0.0; w < 7.0; w+=1.0) {\n vec2 matrixPos = vec2(uStepW * (w - 3.0), uStepH * (h - 3.0));\n color.rgb += texture2D(uTexture, vTexCoord + matrixPos).rgb * uMatrix[int(h * 7.0 + w)];\n }\n }\n float alpha = texture2D(uTexture, vTexCoord).a;\n gl_FragColor = color;\n gl_FragColor.a = alpha;\n }\n `,\n Convolute_9_1: `\n precision highp float;\n uniform sampler2D uTexture;\n uniform float uMatrix[81];\n uniform float uStepW;\n uniform float uStepH;\n varying vec2 vTexCoord;\n void main() {\n vec4 color = vec4(0, 0, 0, 0);\n for (float h = 0.0; h < 9.0; h+=1.0) {\n for (float w = 0.0; w < 9.0; w+=1.0) {\n vec2 matrixPos = vec2(uStepW * (w - 4.0), uStepH * (h - 4.0));\n color += texture2D(uTexture, vTexCoord + matrixPos) * uMatrix[int(h * 9.0 + w)];\n }\n }\n gl_FragColor = color;\n }\n `,\n Convolute_9_0: `\n precision highp float;\n uniform sampler2D uTexture;\n uniform float uMatrix[81];\n uniform float uStepW;\n uniform float uStepH;\n varying vec2 vTexCoord;\n void main() {\n vec4 color = vec4(0, 0, 0, 1);\n for (float h = 0.0; h < 9.0; h+=1.0) {\n for (float w = 0.0; w < 9.0; w+=1.0) {\n vec2 matrixPos = vec2(uStepW * (w - 4.0), uStepH * (h - 4.0));\n color.rgb += texture2D(uTexture, vTexCoord + matrixPos).rgb * uMatrix[int(h * 9.0 + w)];\n }\n }\n float alpha = texture2D(uTexture, vTexCoord).a;\n gl_FragColor = color;\n gl_FragColor.a = alpha;\n }\n `,\n};\n","import { BaseFilter } from './BaseFilter';\nimport type { T2DPipelineState, TWebGLUniformLocationMap } from './typedefs';\nimport { classRegistry } from '../ClassRegistry';\nimport { fragmentSource } from './shaders/convolute';\n\nexport type ConvoluteOwnProps = {\n opaque: boolean;\n matrix: number[];\n};\n\nexport const convoluteDefaultValues: ConvoluteOwnProps = {\n opaque: false,\n matrix: [0, 0, 0, 0, 1, 0, 0, 0, 0],\n};\n\n/**\n * Adapted from html5rocks article\n * @example Sharpen filter\n * const filter = new Convolute({\n * matrix: [ 0, -1, 0,\n * -1, 5, -1,\n * 0, -1, 0 ]\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n * canvas.renderAll();\n * @example Blur filter\n * const filter = new Convolute({\n * matrix: [ 1/9, 1/9, 1/9,\n * 1/9, 1/9, 1/9,\n * 1/9, 1/9, 1/9 ]\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n * canvas.renderAll();\n * @example Emboss filter\n * const filter = new Convolute({\n * matrix: [ 1, 1, 1,\n * 1, 0.7, -1,\n * -1, -1, -1 ]\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n * canvas.renderAll();\n * @example Emboss filter with opaqueness\n * const filter = new Convolute({\n * opaque: true,\n * matrix: [ 1, 1, 1,\n * 1, 0.7, -1,\n * -1, -1, -1 ]\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n * canvas.renderAll();\n */\nexport class Convolute extends BaseFilter<'Convolute', ConvoluteOwnProps> {\n /*\n * Opaque value (true/false)\n */\n declare opaque: ConvoluteOwnProps['opaque'];\n\n /*\n * matrix for the filter, max 9x9\n */\n declare matrix: ConvoluteOwnProps['matrix'];\n\n static type = 'Convolute';\n\n static defaults = convoluteDefaultValues;\n\n static uniformLocations = ['uMatrix', 'uOpaque', 'uHalfSize', 'uSize'];\n\n getCacheKey() {\n return `${this.type}_${Math.sqrt(this.matrix.length)}_${\n this.opaque ? 1 : 0\n }` as keyof typeof fragmentSource;\n }\n\n getFragmentSource() {\n return fragmentSource[this.getCacheKey()];\n }\n\n /**\n * Apply the Brightness operation to a Uint8ClampedArray representing the pixels of an image.\n *\n * @param {Object} options\n * @param {ImageData} options.imageData The Uint8ClampedArray to be filtered.\n */\n applyTo2d(options: T2DPipelineState) {\n const imageData = options.imageData,\n data = imageData.data,\n weights = this.matrix,\n side = Math.round(Math.sqrt(weights.length)),\n halfSide = Math.floor(side / 2),\n sw = imageData.width,\n sh = imageData.height,\n output = options.ctx.createImageData(sw, sh),\n dst = output.data,\n // go through the destination image pixels\n alphaFac = this.opaque ? 1 : 0;\n let r, g, b, a, dstOff, scx, scy, srcOff, wt, x, y, cx, cy;\n\n for (y = 0; y < sh; y++) {\n for (x = 0; x < sw; x++) {\n dstOff = (y * sw + x) * 4;\n // calculate the weighed sum of the source image pixels that\n // fall under the convolution matrix\n r = 0;\n g = 0;\n b = 0;\n a = 0;\n\n for (cy = 0; cy < side; cy++) {\n for (cx = 0; cx < side; cx++) {\n scy = y + cy - halfSide;\n scx = x + cx - halfSide;\n\n // eslint-disable-next-line max-depth\n if (scy < 0 || scy >= sh || scx < 0 || scx >= sw) {\n continue;\n }\n\n srcOff = (scy * sw + scx) * 4;\n wt = weights[cy * side + cx];\n\n r += data[srcOff] * wt;\n g += data[srcOff + 1] * wt;\n b += data[srcOff + 2] * wt;\n // eslint-disable-next-line max-depth\n if (!alphaFac) {\n a += data[srcOff + 3] * wt;\n }\n }\n }\n dst[dstOff] = r;\n dst[dstOff + 1] = g;\n dst[dstOff + 2] = b;\n if (!alphaFac) {\n dst[dstOff + 3] = a;\n } else {\n dst[dstOff + 3] = data[dstOff + 3];\n }\n }\n }\n options.imageData = output;\n }\n\n /**\n * Send data from this filter to its shader program's uniforms.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n */\n sendUniformData(\n gl: WebGLRenderingContext,\n uniformLocations: TWebGLUniformLocationMap,\n ) {\n gl.uniform1fv(uniformLocations.uMatrix, this.matrix);\n }\n\n /**\n * Returns object representation of an instance\n * @return {Object} Object representation of an instance\n */\n toObject() {\n return {\n ...super.toObject(),\n opaque: this.opaque,\n matrix: [...this.matrix],\n };\n }\n}\n\nclassRegistry.setClass(Convolute);\n","export const fragmentSource = `\n precision highp float;\n uniform sampler2D uTexture;\n uniform vec3 uGamma;\n varying vec2 vTexCoord;\n void main() {\n vec4 color = texture2D(uTexture, vTexCoord);\n vec3 correction = (1.0 / uGamma);\n color.r = pow(color.r, correction.r);\n color.g = pow(color.g, correction.g);\n color.b = pow(color.b, correction.b);\n gl_FragColor = color;\n gl_FragColor.rgb *= color.a;\n }\n`;\n","import { BaseFilter } from './BaseFilter';\nimport { classRegistry } from '../ClassRegistry';\nimport { fragmentSource } from './shaders/gamma';\nimport type { T2DPipelineState, TWebGLUniformLocationMap } from './typedefs';\n\nconst GAMMA = 'Gamma' as const;\n\nexport type GammaInput = [number, number, number];\n\nexport type GammaOwnProps = {\n gamma: GammaInput;\n};\n\nexport const gammaDefaultValues: GammaOwnProps = {\n gamma: [1, 1, 1],\n};\n\n/**\n * Gamma filter class\n * @example\n * const filter = new Gamma({\n * gamma: [1, 0.5, 2.1]\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n */\nexport class Gamma extends BaseFilter {\n /**\n * Gamma array value, from 0.01 to 2.2.\n * @param {Array} gamma\n */\n declare gamma: GammaOwnProps['gamma'];\n declare rgbValues?: {\n r: Uint8Array;\n g: Uint8Array;\n b: Uint8Array;\n };\n\n static type = GAMMA;\n\n static defaults = gammaDefaultValues;\n\n static uniformLocations = ['uGamma'];\n\n getFragmentSource() {\n return fragmentSource;\n }\n\n constructor(options: { gamma?: GammaInput } = {}) {\n super(options);\n this.gamma =\n options.gamma ||\n ((\n this.constructor as typeof Gamma\n ).defaults.gamma.concat() as GammaInput);\n }\n\n /**\n * Apply the Gamma operation to a Uint8Array representing the pixels of an image.\n *\n * @param {Object} options\n * @param {ImageData} options.imageData The Uint8Array to be filtered.\n */\n applyTo2d({ imageData: { data } }: T2DPipelineState) {\n const gamma = this.gamma,\n rInv = 1 / gamma[0],\n gInv = 1 / gamma[1],\n bInv = 1 / gamma[2];\n\n if (!this.rgbValues) {\n this.rgbValues = {\n r: new Uint8Array(256),\n g: new Uint8Array(256),\n b: new Uint8Array(256),\n };\n }\n\n // This is an optimization - pre-compute a look-up table for each color channel\n // instead of performing these pow calls for each pixel in the image.\n const rgb = this.rgbValues;\n for (let i = 0; i < 256; i++) {\n rgb.r[i] = Math.pow(i / 255, rInv) * 255;\n rgb.g[i] = Math.pow(i / 255, gInv) * 255;\n rgb.b[i] = Math.pow(i / 255, bInv) * 255;\n }\n for (let i = 0; i < data.length; i += 4) {\n data[i] = rgb.r[data[i]];\n data[i + 1] = rgb.g[data[i + 1]];\n data[i + 2] = rgb.b[data[i + 2]];\n }\n }\n\n /**\n * Send data from this filter to its shader program's uniforms.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n */\n sendUniformData(\n gl: WebGLRenderingContext,\n uniformLocations: TWebGLUniformLocationMap,\n ) {\n gl.uniform3fv(uniformLocations.uGamma, this.gamma);\n }\n\n isNeutralState() {\n const { gamma } = this;\n return gamma[0] === 1 && gamma[1] === 1 && gamma[2] === 1;\n }\n\n toObject(): { type: typeof GAMMA; gamma: GammaInput } {\n return {\n type: GAMMA,\n gamma: this.gamma.concat() as GammaInput,\n };\n }\n}\n\nclassRegistry.setClass(Gamma);\n","import type { TGrayscaleMode } from '../Grayscale';\n\nexport const fragmentSource: Record = {\n average: `\n precision highp float;\n uniform sampler2D uTexture;\n varying vec2 vTexCoord;\n void main() {\n vec4 color = texture2D(uTexture, vTexCoord);\n float average = (color.r + color.b + color.g) / 3.0;\n gl_FragColor = vec4(average, average, average, color.a);\n }\n `,\n lightness: `\n precision highp float;\n uniform sampler2D uTexture;\n uniform int uMode;\n varying vec2 vTexCoord;\n void main() {\n vec4 col = texture2D(uTexture, vTexCoord);\n float average = (max(max(col.r, col.g),col.b) + min(min(col.r, col.g),col.b)) / 2.0;\n gl_FragColor = vec4(average, average, average, col.a);\n }\n `,\n luminosity: `\n precision highp float;\n uniform sampler2D uTexture;\n uniform int uMode;\n varying vec2 vTexCoord;\n void main() {\n vec4 col = texture2D(uTexture, vTexCoord);\n float average = 0.21 * col.r + 0.72 * col.g + 0.07 * col.b;\n gl_FragColor = vec4(average, average, average, col.a);\n }\n `,\n};\n","import { BaseFilter } from './BaseFilter';\nimport type { T2DPipelineState, TWebGLUniformLocationMap } from './typedefs';\nimport { classRegistry } from '../ClassRegistry';\nimport { fragmentSource } from './shaders/grayscale';\n\nexport type TGrayscaleMode = 'average' | 'lightness' | 'luminosity';\n\ntype GrayscaleOwnProps = {\n mode: TGrayscaleMode;\n};\n\nexport const grayscaleDefaultValues: GrayscaleOwnProps = {\n mode: 'average',\n};\n\n/**\n * Grayscale image filter class\n * @example\n * const filter = new Grayscale();\n * object.filters.push(filter);\n * object.applyFilters();\n */\nexport class Grayscale extends BaseFilter<'Grayscale', GrayscaleOwnProps> {\n declare mode: TGrayscaleMode;\n\n static type = 'Grayscale';\n\n static defaults = grayscaleDefaultValues;\n\n static uniformLocations = ['uMode'];\n\n /**\n * Apply the Grayscale operation to a Uint8Array representing the pixels of an image.\n *\n * @param {Object} options\n * @param {ImageData} options.imageData The Uint8Array to be filtered.\n */\n applyTo2d({ imageData: { data } }: T2DPipelineState) {\n for (let i = 0, value: number; i < data.length; i += 4) {\n const r = data[i];\n const g = data[i + 1];\n const b = data[i + 2];\n switch (this.mode) {\n case 'average':\n value = (r + g + b) / 3;\n break;\n case 'lightness':\n value = (Math.min(r, g, b) + Math.max(r, g, b)) / 2;\n break;\n case 'luminosity':\n value = 0.21 * r + 0.72 * g + 0.07 * b;\n break;\n }\n\n data[i + 2] = data[i + 1] = data[i] = value;\n }\n }\n\n getCacheKey() {\n return `${this.type}_${this.mode}`;\n }\n\n getFragmentSource() {\n return fragmentSource[this.mode];\n }\n\n /**\n * Send data from this filter to its shader program's uniforms.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n */\n sendUniformData(\n gl: WebGLRenderingContext,\n uniformLocations: TWebGLUniformLocationMap,\n ) {\n const mode = 1;\n gl.uniform1i(uniformLocations.uMode, mode);\n }\n\n /**\n * Grayscale filter isNeutralState implementation\n * The filter is never neutral\n * on the image\n **/\n isNeutralState() {\n return false;\n }\n}\n\nclassRegistry.setClass(Grayscale);\n","import { cos } from '../util/misc/cos';\nimport { sin } from '../util/misc/sin';\nimport {\n ColorMatrix,\n type ColorMatrixOwnProps,\n colorMatrixDefaultValues,\n} from './ColorMatrix';\nimport type { TWebGLPipelineState, T2DPipelineState } from './typedefs';\nimport { classRegistry } from '../ClassRegistry';\n\nexport type HueRotationOwnProps = ColorMatrixOwnProps & {\n rotation: number;\n};\n\nexport type HueRotationSerializedProps = {\n rotation: number;\n};\n\nexport const hueRotationDefaultValues: HueRotationOwnProps = {\n ...colorMatrixDefaultValues,\n rotation: 0,\n};\n\n/**\n * HueRotation filter class\n * @example\n * const filter = new HueRotation({\n * rotation: -0.5\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n */\nexport class HueRotation extends ColorMatrix<\n 'HueRotation',\n HueRotationOwnProps,\n HueRotationSerializedProps\n> {\n /**\n * HueRotation value, from -1 to 1.\n */\n declare rotation: HueRotationOwnProps['rotation'];\n\n static type = 'HueRotation';\n\n static defaults = hueRotationDefaultValues;\n\n calculateMatrix() {\n const rad = this.rotation * Math.PI,\n cosine = cos(rad),\n sine = sin(rad),\n aThird = 1 / 3,\n aThirdSqtSin = Math.sqrt(aThird) * sine,\n OneMinusCos = 1 - cosine;\n this.matrix = [\n cosine + OneMinusCos / 3,\n aThird * OneMinusCos - aThirdSqtSin,\n aThird * OneMinusCos + aThirdSqtSin,\n 0,\n 0,\n aThird * OneMinusCos + aThirdSqtSin,\n cosine + aThird * OneMinusCos,\n aThird * OneMinusCos - aThirdSqtSin,\n 0,\n 0,\n aThird * OneMinusCos - aThirdSqtSin,\n aThird * OneMinusCos + aThirdSqtSin,\n cosine + aThird * OneMinusCos,\n 0,\n 0,\n 0,\n 0,\n 0,\n 1,\n 0,\n ];\n }\n\n isNeutralState() {\n return this.rotation === 0;\n }\n\n applyTo(options: TWebGLPipelineState | T2DPipelineState) {\n this.calculateMatrix();\n super.applyTo(options);\n }\n\n toObject() {\n return {\n type: this.type,\n rotation: this.rotation,\n };\n }\n}\n\nclassRegistry.setClass(HueRotation);\n","import { BaseFilter } from './BaseFilter';\nimport type { T2DPipelineState, TWebGLUniformLocationMap } from './typedefs';\nimport { classRegistry } from '../ClassRegistry';\nimport { fragmentSource } from './shaders/invert';\n\nexport type InvertOwnProps = {\n alpha: boolean;\n invert: boolean;\n};\n\nexport const invertDefaultValues: InvertOwnProps = {\n alpha: false,\n invert: true,\n};\n\n/**\n * @example\n * const filter = new Invert();\n * object.filters.push(filter);\n * object.applyFilters(canvas.renderAll.bind(canvas));\n */\nexport class Invert extends BaseFilter<'Invert', InvertOwnProps> {\n /**\n * Invert also alpha.\n * @param {Boolean} alpha\n **/\n declare alpha: InvertOwnProps['alpha'];\n\n /**\n * Filter invert. if false, does nothing\n * @param {Boolean} invert\n */\n declare invert: InvertOwnProps['invert'];\n\n static type = 'Invert';\n\n static defaults = invertDefaultValues;\n\n static uniformLocations = ['uInvert', 'uAlpha'];\n\n /**\n * Apply the Invert operation to a Uint8Array representing the pixels of an image.\n *\n * @param {Object} options\n * @param {ImageData} options.imageData The Uint8Array to be filtered.\n */\n applyTo2d({ imageData: { data } }: T2DPipelineState) {\n for (let i = 0; i < data.length; i += 4) {\n data[i] = 255 - data[i];\n data[i + 1] = 255 - data[i + 1];\n data[i + 2] = 255 - data[i + 2];\n\n if (this.alpha) {\n data[i + 3] = 255 - data[i + 3];\n }\n }\n }\n\n protected getFragmentSource(): string {\n return fragmentSource;\n }\n\n /**\n * Invert filter isNeutralState implementation\n * Used only in image applyFilters to discard filters that will not have an effect\n * on the image\n * @param {Object} options\n **/\n isNeutralState() {\n return !this.invert;\n }\n\n /**\n * Send data from this filter to its shader program's uniforms.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n */\n sendUniformData(\n gl: WebGLRenderingContext,\n uniformLocations: TWebGLUniformLocationMap,\n ) {\n gl.uniform1i(uniformLocations.uInvert, Number(this.invert));\n gl.uniform1i(uniformLocations.uAlpha, Number(this.alpha));\n }\n}\n\nclassRegistry.setClass(Invert);\n","export const fragmentSource = `\n precision highp float;\n uniform sampler2D uTexture;\n uniform int uInvert;\n uniform int uAlpha;\n varying vec2 vTexCoord;\n void main() {\n vec4 color = texture2D(uTexture, vTexCoord);\n if (uInvert == 1) {\n if (uAlpha == 1) {\n gl_FragColor = vec4(1.0 - color.r,1.0 -color.g,1.0 -color.b,1.0 -color.a);\n } else {\n gl_FragColor = vec4(1.0 - color.r,1.0 -color.g,1.0 -color.b,color.a);\n }\n } else {\n gl_FragColor = color;\n }\n }\n`;\n","import { BaseFilter } from './BaseFilter';\nimport type { T2DPipelineState, TWebGLUniformLocationMap } from './typedefs';\nimport { classRegistry } from '../ClassRegistry';\nimport { fragmentSource } from './shaders/noise';\n\nexport type NoiseOwnProps = {\n noise: number;\n};\n\nexport const noiseDefaultValues: NoiseOwnProps = {\n noise: 0,\n};\n\n/**\n * Noise filter class\n * @example\n * const filter = new Noise({\n * noise: 700\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n * canvas.renderAll();\n */\nexport class Noise extends BaseFilter<'Noise', NoiseOwnProps> {\n /**\n * Noise value, from\n * @param {Number} noise\n */\n declare noise: NoiseOwnProps['noise'];\n\n static type = 'Noise';\n\n static defaults = noiseDefaultValues;\n\n static uniformLocations = ['uNoise', 'uSeed'];\n\n getFragmentSource() {\n return fragmentSource;\n }\n\n /**\n * Apply the Brightness operation to a Uint8ClampedArray representing the pixels of an image.\n *\n * @param {Object} options\n * @param {ImageData} options.imageData The Uint8ClampedArray to be filtered.\n */\n applyTo2d({ imageData: { data } }: T2DPipelineState) {\n const noise = this.noise;\n for (let i = 0; i < data.length; i += 4) {\n const rand = (0.5 - Math.random()) * noise;\n data[i] += rand;\n data[i + 1] += rand;\n data[i + 2] += rand;\n }\n }\n\n /**\n * Send data from this filter to its shader program's uniforms.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n */\n sendUniformData(\n gl: WebGLRenderingContext,\n uniformLocations: TWebGLUniformLocationMap,\n ) {\n gl.uniform1f(uniformLocations.uNoise, this.noise / 255);\n gl.uniform1f(uniformLocations.uSeed, Math.random());\n }\n\n isNeutralState() {\n return this.noise === 0;\n }\n}\n\nclassRegistry.setClass(Noise);\n","export const fragmentSource = `\n precision highp float;\n uniform sampler2D uTexture;\n uniform float uStepH;\n uniform float uNoise;\n uniform float uSeed;\n varying vec2 vTexCoord;\n float rand(vec2 co, float seed, float vScale) {\n return fract(sin(dot(co.xy * vScale ,vec2(12.9898 , 78.233))) * 43758.5453 * (seed + 0.01) / 2.0);\n }\n void main() {\n vec4 color = texture2D(uTexture, vTexCoord);\n color.rgb += (0.5 - rand(vTexCoord, uSeed, 0.1 / uStepH)) * uNoise;\n gl_FragColor = color;\n }\n`;\n","import { BaseFilter } from './BaseFilter';\nimport type { T2DPipelineState, TWebGLUniformLocationMap } from './typedefs';\nimport { classRegistry } from '../ClassRegistry';\nimport { fragmentSource } from './shaders/pixelate';\n\nexport type PixelateOwnProps = {\n blocksize: number;\n};\n\nexport const pixelateDefaultValues: PixelateOwnProps = {\n blocksize: 4,\n};\n\n/**\n * Pixelate filter class\n * @example\n * const filter = new Pixelate({\n * blocksize: 8\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n */\nexport class Pixelate extends BaseFilter<'Pixelate', PixelateOwnProps> {\n declare blocksize: PixelateOwnProps['blocksize'];\n\n static type = 'Pixelate';\n\n static defaults = pixelateDefaultValues;\n\n static uniformLocations = ['uBlocksize'];\n\n /**\n * Apply the Pixelate operation to a Uint8ClampedArray representing the pixels of an image.\n *\n * @param {Object} options\n * @param {ImageData} options.imageData The Uint8ClampedArray to be filtered.\n */\n applyTo2d({ imageData: { data, width, height } }: T2DPipelineState) {\n for (let i = 0; i < height; i += this.blocksize) {\n for (let j = 0; j < width; j += this.blocksize) {\n const index = i * 4 * width + j * 4;\n const r = data[index];\n const g = data[index + 1];\n const b = data[index + 2];\n const a = data[index + 3];\n\n for (let _i = i; _i < Math.min(i + this.blocksize, height); _i++) {\n for (let _j = j; _j < Math.min(j + this.blocksize, width); _j++) {\n const index = _i * 4 * width + _j * 4;\n data[index] = r;\n data[index + 1] = g;\n data[index + 2] = b;\n data[index + 3] = a;\n }\n }\n }\n }\n }\n\n /**\n * Indicate when the filter is not gonna apply changes to the image\n **/\n isNeutralState() {\n return this.blocksize === 1;\n }\n\n protected getFragmentSource(): string {\n return fragmentSource;\n }\n\n /**\n * Send data from this filter to its shader program's uniforms.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n */\n sendUniformData(\n gl: WebGLRenderingContext,\n uniformLocations: TWebGLUniformLocationMap,\n ) {\n gl.uniform1f(uniformLocations.uBlocksize, this.blocksize);\n }\n}\n\nclassRegistry.setClass(Pixelate);\n","export const fragmentSource = `\n precision highp float;\n uniform sampler2D uTexture;\n uniform float uBlocksize;\n uniform float uStepW;\n uniform float uStepH;\n varying vec2 vTexCoord;\n void main() {\n float blockW = uBlocksize * uStepW;\n float blockH = uBlocksize * uStepH;\n int posX = int(vTexCoord.x / blockW);\n int posY = int(vTexCoord.y / blockH);\n float fposX = float(posX);\n float fposY = float(posY);\n vec2 squareCoords = vec2(fposX * blockW, fposY * blockH);\n vec4 color = texture2D(uTexture, squareCoords);\n gl_FragColor = color;\n }\n`;\n","import { classRegistry } from '../ClassRegistry';\nimport { Color } from '../color/Color';\nimport { BaseFilter } from './BaseFilter';\nimport { fragmentShader } from './shaders/removeColor';\nimport type { T2DPipelineState, TWebGLUniformLocationMap } from './typedefs';\n\nexport type RemoveColorOwnProps = {\n color: string;\n distance: number;\n useAlpha: boolean;\n};\n\nexport const removeColorDefaultValues: RemoveColorOwnProps = {\n color: '#FFFFFF',\n distance: 0.02,\n useAlpha: false,\n};\n\n/**\n * Remove white filter class\n * @example\n * const filter = new RemoveColor({\n * threshold: 0.2,\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n * canvas.renderAll();\n */\nexport class RemoveColor extends BaseFilter<\n 'RemoveColor',\n RemoveColorOwnProps\n> {\n /**\n * Color to remove, in any format understood by {@link Color}.\n */\n declare color: RemoveColorOwnProps['color'];\n\n /**\n * distance to actual color, as value up or down from each r,g,b\n * between 0 and 1\n **/\n declare distance: RemoveColorOwnProps['distance'];\n\n /**\n * For color to remove inside distance, use alpha channel for a smoother deletion\n * NOT IMPLEMENTED YET\n **/\n declare useAlpha: RemoveColorOwnProps['useAlpha'];\n\n static type = 'RemoveColor';\n\n static defaults = removeColorDefaultValues;\n\n static uniformLocations = ['uLow', 'uHigh'];\n\n getFragmentSource() {\n return fragmentShader;\n }\n\n /**\n * Applies filter to canvas element\n * @param {Object} canvasEl Canvas element to apply filter to\n */\n applyTo2d({ imageData: { data } }: T2DPipelineState) {\n const distance = this.distance * 255,\n source = new Color(this.color).getSource(),\n lowC = [source[0] - distance, source[1] - distance, source[2] - distance],\n highC = [\n source[0] + distance,\n source[1] + distance,\n source[2] + distance,\n ];\n\n for (let i = 0; i < data.length; i += 4) {\n const r = data[i];\n const g = data[i + 1];\n const b = data[i + 2];\n\n if (\n r > lowC[0] &&\n g > lowC[1] &&\n b > lowC[2] &&\n r < highC[0] &&\n g < highC[1] &&\n b < highC[2]\n ) {\n data[i + 3] = 0;\n }\n }\n }\n\n /**\n * Send data from this filter to its shader program's uniforms.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n */\n sendUniformData(\n gl: WebGLRenderingContext,\n uniformLocations: TWebGLUniformLocationMap,\n ) {\n const source = new Color(this.color).getSource(),\n distance = this.distance,\n lowC = [\n 0 + source[0] / 255 - distance,\n 0 + source[1] / 255 - distance,\n 0 + source[2] / 255 - distance,\n 1,\n ],\n highC = [\n source[0] / 255 + distance,\n source[1] / 255 + distance,\n source[2] / 255 + distance,\n 1,\n ];\n gl.uniform4fv(uniformLocations.uLow, lowC);\n gl.uniform4fv(uniformLocations.uHigh, highC);\n }\n}\n\nclassRegistry.setClass(RemoveColor);\n","export const fragmentShader = `\nprecision highp float;\nuniform sampler2D uTexture;\nuniform vec4 uLow;\nuniform vec4 uHigh;\nvarying vec2 vTexCoord;\nvoid main() {\n gl_FragColor = texture2D(uTexture, vTexCoord);\n if(all(greaterThan(gl_FragColor.rgb,uLow.rgb)) && all(greaterThan(uHigh.rgb,gl_FragColor.rgb))) {\n gl_FragColor.a = 0.0;\n }\n}\n`;\n","import { BaseFilter } from './BaseFilter';\nimport type {\n T2DPipelineState,\n TWebGLPipelineState,\n TWebGLUniformLocationMap,\n} from './typedefs';\nimport { isWebGLPipelineState } from './utils';\nimport { classRegistry } from '../ClassRegistry';\nimport { createCanvasElement } from '../util/misc/dom';\nimport type { XY } from '../Point';\n\nexport type TResizeType = 'bilinear' | 'hermite' | 'sliceHack' | 'lanczos';\n\nexport type ResizeOwnProps = {\n resizeType: TResizeType;\n scaleX: number;\n scaleY: number;\n lanczosLobes: number;\n};\n\nexport type ResizeSerializedProps = ResizeOwnProps;\n\nexport const resizeDefaultValues: ResizeOwnProps = {\n resizeType: 'hermite',\n scaleX: 1,\n scaleY: 1,\n lanczosLobes: 3,\n};\n\ntype ResizeDuring2DResize = Resize & {\n rcpScaleX: number;\n rcpScaleY: number;\n};\n\ntype ResizeDuringWEBGLResize = Resize & {\n rcpScaleX: number;\n rcpScaleY: number;\n horizontal: boolean;\n width: number;\n height: number;\n taps: number[];\n tempScale: number;\n dH: number;\n dW: number;\n};\n\n/**\n * Resize image filter class\n * @example\n * const filter = new Resize();\n * object.filters.push(filter);\n * object.applyFilters(canvas.renderAll.bind(canvas));\n */\nexport class Resize extends BaseFilter<'Resize', ResizeOwnProps> {\n /**\n * Resize type\n * for webgl resizeType is just lanczos, for canvas2d can be:\n * bilinear, hermite, sliceHack, lanczos.\n */\n declare resizeType: ResizeOwnProps['resizeType'];\n\n /**\n * Scale factor for resizing, x axis\n * @param {Number} scaleX\n */\n declare scaleX: ResizeOwnProps['scaleX'];\n\n /**\n * Scale factor for resizing, y axis\n * @param {Number} scaleY\n */\n declare scaleY: ResizeOwnProps['scaleY'];\n\n /**\n * LanczosLobes parameter for lanczos filter, valid for resizeType lanczos\n * @param {Number} lanczosLobes\n */\n declare lanczosLobes: ResizeOwnProps['lanczosLobes'];\n\n static type = 'Resize';\n\n static defaults = resizeDefaultValues;\n\n static uniformLocations = ['uDelta', 'uTaps'];\n\n /**\n * Send data from this filter to its shader program's uniforms.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n */\n sendUniformData(\n this: ResizeDuringWEBGLResize,\n gl: WebGLRenderingContext,\n uniformLocations: TWebGLUniformLocationMap,\n ) {\n gl.uniform2fv(\n uniformLocations.uDelta,\n this.horizontal ? [1 / this.width, 0] : [0, 1 / this.height],\n );\n gl.uniform1fv(uniformLocations.uTaps, this.taps);\n }\n\n getFilterWindow(this: ResizeDuringWEBGLResize) {\n const scale = this.tempScale;\n return Math.ceil(this.lanczosLobes / scale);\n }\n\n getCacheKey(this: ResizeDuringWEBGLResize): string {\n const filterWindow = this.getFilterWindow();\n return `${this.type}_${filterWindow}`;\n }\n\n getFragmentSource(this: ResizeDuringWEBGLResize): string {\n const filterWindow = this.getFilterWindow();\n return this.generateShader(filterWindow);\n }\n\n getTaps(this: ResizeDuringWEBGLResize) {\n const lobeFunction = this.lanczosCreate(this.lanczosLobes),\n scale = this.tempScale,\n filterWindow = this.getFilterWindow(),\n taps = new Array(filterWindow);\n for (let i = 1; i <= filterWindow; i++) {\n taps[i - 1] = lobeFunction(i * scale);\n }\n return taps;\n }\n\n /**\n * Generate vertex and shader sources from the necessary steps numbers\n * @param {Number} filterWindow\n */\n generateShader(filterWindow: number) {\n const offsets = new Array(filterWindow);\n for (let i = 1; i <= filterWindow; i++) {\n offsets[i - 1] = `${i}.0 * uDelta`;\n }\n return `\n precision highp float;\n uniform sampler2D uTexture;\n uniform vec2 uDelta;\n varying vec2 vTexCoord;\n uniform float uTaps[${filterWindow}];\n void main() {\n vec4 color = texture2D(uTexture, vTexCoord);\n float sum = 1.0;\n ${offsets\n .map(\n (offset, i) => `\n color += texture2D(uTexture, vTexCoord + ${offset}) * uTaps[${i}] + texture2D(uTexture, vTexCoord - ${offset}) * uTaps[${i}];\n sum += 2.0 * uTaps[${i}];\n `,\n )\n .join('\\n')}\n gl_FragColor = color / sum;\n }\n `;\n }\n\n applyToForWebgl(this: ResizeDuringWEBGLResize, options: TWebGLPipelineState) {\n options.passes++;\n this.width = options.sourceWidth;\n this.horizontal = true;\n this.dW = Math.round(this.width * this.scaleX);\n this.dH = options.sourceHeight;\n this.tempScale = this.dW / this.width;\n this.taps = this.getTaps();\n options.destinationWidth = this.dW;\n super.applyTo(options);\n options.sourceWidth = options.destinationWidth;\n\n this.height = options.sourceHeight;\n this.horizontal = false;\n this.dH = Math.round(this.height * this.scaleY);\n this.tempScale = this.dH / this.height;\n this.taps = this.getTaps();\n options.destinationHeight = this.dH;\n super.applyTo(options);\n options.sourceHeight = options.destinationHeight;\n }\n\n /**\n * Apply the resize filter to the image\n * Determines whether to use WebGL or Canvas2D based on the options.webgl flag.\n *\n * @param {Object} options\n * @param {Number} options.passes The number of filters remaining to be executed\n * @param {Boolean} options.webgl Whether to use webgl to render the filter.\n * @param {WebGLTexture} options.sourceTexture The texture setup as the source to be filtered.\n * @param {WebGLTexture} options.targetTexture The texture where filtered output should be drawn.\n * @param {WebGLRenderingContext} options.context The GL context used for rendering.\n * @param {Object} options.programCache A map of compiled shader programs, keyed by filter type.\n */\n applyTo(options: TWebGLPipelineState | T2DPipelineState) {\n if (isWebGLPipelineState(options)) {\n (this as unknown as ResizeDuringWEBGLResize).applyToForWebgl(options);\n } else {\n (this as unknown as ResizeDuring2DResize).applyTo2d(options);\n }\n }\n\n isNeutralState() {\n return this.scaleX === 1 && this.scaleY === 1;\n }\n\n lanczosCreate(lobes: number) {\n return (x: number) => {\n if (x >= lobes || x <= -lobes) {\n return 0.0;\n }\n if (x < 1.1920929e-7 && x > -1.1920929e-7) {\n return 1.0;\n }\n x *= Math.PI;\n const xx = x / lobes;\n return ((Math.sin(x) / x) * Math.sin(xx)) / xx;\n };\n }\n\n applyTo2d(this: ResizeDuring2DResize, options: T2DPipelineState) {\n const imageData = options.imageData,\n scaleX = this.scaleX,\n scaleY = this.scaleY;\n\n this.rcpScaleX = 1 / scaleX;\n this.rcpScaleY = 1 / scaleY;\n\n const oW = imageData.width;\n const oH = imageData.height;\n const dW = Math.round(oW * scaleX);\n const dH = Math.round(oH * scaleY);\n let newData: ImageData;\n\n if (this.resizeType === 'sliceHack') {\n newData = this.sliceByTwo(options, oW, oH, dW, dH);\n } else if (this.resizeType === 'hermite') {\n newData = this.hermiteFastResize(options, oW, oH, dW, dH);\n } else if (this.resizeType === 'bilinear') {\n newData = this.bilinearFiltering(options, oW, oH, dW, dH);\n } else if (this.resizeType === 'lanczos') {\n newData = this.lanczosResize(options, oW, oH, dW, dH);\n } else {\n // this should never trigger, is here just for safety net.\n newData = new ImageData(dW, dH);\n }\n options.imageData = newData;\n }\n\n /**\n * Filter sliceByTwo\n * @param {Object} canvasEl Canvas element to apply filter to\n * @param {Number} oW Original Width\n * @param {Number} oH Original Height\n * @param {Number} dW Destination Width\n * @param {Number} dH Destination Height\n * @returns {ImageData}\n */\n sliceByTwo(\n options: T2DPipelineState,\n oW: number,\n oH: number,\n dW: number,\n dH: number,\n ) {\n const imageData = options.imageData;\n const mult = 0.5;\n let doneW = false;\n let doneH = false;\n let stepW = oW * mult;\n let stepH = oH * mult;\n const resources = options.filterBackend.resources;\n let sX = 0;\n let sY = 0;\n const dX = oW;\n let dY = 0;\n if (!resources.sliceByTwo) {\n resources.sliceByTwo = createCanvasElement();\n }\n const tmpCanvas = resources.sliceByTwo;\n if (tmpCanvas.width < oW * 1.5 || tmpCanvas.height < oH) {\n tmpCanvas.width = oW * 1.5;\n tmpCanvas.height = oH;\n }\n const ctx = tmpCanvas.getContext('2d')!;\n ctx.clearRect(0, 0, oW * 1.5, oH);\n ctx.putImageData(imageData, 0, 0);\n\n dW = Math.floor(dW);\n dH = Math.floor(dH);\n\n while (!doneW || !doneH) {\n oW = stepW;\n oH = stepH;\n if (dW < Math.floor(stepW * mult)) {\n stepW = Math.floor(stepW * mult);\n } else {\n stepW = dW;\n doneW = true;\n }\n if (dH < Math.floor(stepH * mult)) {\n stepH = Math.floor(stepH * mult);\n } else {\n stepH = dH;\n doneH = true;\n }\n ctx.drawImage(tmpCanvas, sX, sY, oW, oH, dX, dY, stepW, stepH);\n sX = dX;\n sY = dY;\n dY += stepH;\n }\n return ctx.getImageData(sX, sY, dW, dH);\n }\n\n /**\n * Filter lanczosResize\n * @param {Object} canvasEl Canvas element to apply filter to\n * @param {Number} oW Original Width\n * @param {Number} oH Original Height\n * @param {Number} dW Destination Width\n * @param {Number} dH Destination Height\n * @returns {ImageData}\n */\n lanczosResize(\n this: ResizeDuring2DResize,\n options: T2DPipelineState,\n oW: number,\n oH: number,\n dW: number,\n dH: number,\n ): ImageData {\n function process(u: number): ImageData {\n let v, i, weight, idx, a, red, green, blue, alpha, fX, fY;\n center.x = (u + 0.5) * ratioX;\n icenter.x = Math.floor(center.x);\n for (v = 0; v < dH; v++) {\n center.y = (v + 0.5) * ratioY;\n icenter.y = Math.floor(center.y);\n a = 0;\n red = 0;\n green = 0;\n blue = 0;\n alpha = 0;\n for (i = icenter.x - range2X; i <= icenter.x + range2X; i++) {\n if (i < 0 || i >= oW) {\n continue;\n }\n fX = Math.floor(1000 * Math.abs(i - center.x));\n if (!cacheLanc[fX]) {\n cacheLanc[fX] = {};\n }\n for (let j = icenter.y - range2Y; j <= icenter.y + range2Y; j++) {\n if (j < 0 || j >= oH) {\n continue;\n }\n fY = Math.floor(1000 * Math.abs(j - center.y));\n if (!cacheLanc[fX][fY]) {\n cacheLanc[fX][fY] = lanczos(\n Math.sqrt(\n Math.pow(fX * rcpRatioX, 2) + Math.pow(fY * rcpRatioY, 2),\n ) / 1000,\n );\n }\n weight = cacheLanc[fX][fY];\n if (weight > 0) {\n idx = (j * oW + i) * 4;\n a += weight;\n red += weight * srcData[idx];\n green += weight * srcData[idx + 1];\n blue += weight * srcData[idx + 2];\n alpha += weight * srcData[idx + 3];\n }\n }\n }\n idx = (v * dW + u) * 4;\n destData[idx] = red / a;\n destData[idx + 1] = green / a;\n destData[idx + 2] = blue / a;\n destData[idx + 3] = alpha / a;\n }\n\n if (++u < dW) {\n return process(u);\n } else {\n return destImg;\n }\n }\n\n const srcData = options.imageData.data,\n destImg = options.ctx.createImageData(dW, dH),\n destData = destImg.data,\n lanczos = this.lanczosCreate(this.lanczosLobes),\n ratioX = this.rcpScaleX,\n ratioY = this.rcpScaleY,\n rcpRatioX = 2 / this.rcpScaleX,\n rcpRatioY = 2 / this.rcpScaleY,\n range2X = Math.ceil((ratioX * this.lanczosLobes) / 2),\n range2Y = Math.ceil((ratioY * this.lanczosLobes) / 2),\n cacheLanc: Record> = {},\n center: XY = { x: 0, y: 0 },\n icenter: XY = { x: 0, y: 0 };\n\n return process(0);\n }\n\n /**\n * bilinearFiltering\n * @param {Object} canvasEl Canvas element to apply filter to\n * @param {Number} oW Original Width\n * @param {Number} oH Original Height\n * @param {Number} dW Destination Width\n * @param {Number} dH Destination Height\n * @returns {ImageData}\n */\n bilinearFiltering(\n this: ResizeDuring2DResize,\n options: T2DPipelineState,\n oW: number,\n oH: number,\n dW: number,\n dH: number,\n ) {\n let a;\n let b;\n let c;\n let d;\n let x;\n let y;\n let i;\n let j;\n let xDiff;\n let yDiff;\n let chnl;\n let color;\n let offset = 0;\n let origPix;\n const ratioX = this.rcpScaleX;\n const ratioY = this.rcpScaleY;\n const w4 = 4 * (oW - 1);\n const img = options.imageData;\n const pixels = img.data;\n const destImage = options.ctx.createImageData(dW, dH);\n const destPixels = destImage.data;\n for (i = 0; i < dH; i++) {\n for (j = 0; j < dW; j++) {\n x = Math.floor(ratioX * j);\n y = Math.floor(ratioY * i);\n xDiff = ratioX * j - x;\n yDiff = ratioY * i - y;\n origPix = 4 * (y * oW + x);\n\n for (chnl = 0; chnl < 4; chnl++) {\n a = pixels[origPix + chnl];\n b = pixels[origPix + 4 + chnl];\n c = pixels[origPix + w4 + chnl];\n d = pixels[origPix + w4 + 4 + chnl];\n color =\n a * (1 - xDiff) * (1 - yDiff) +\n b * xDiff * (1 - yDiff) +\n c * yDiff * (1 - xDiff) +\n d * xDiff * yDiff;\n destPixels[offset++] = color;\n }\n }\n }\n return destImage;\n }\n\n /**\n * hermiteFastResize\n * @param {Object} canvasEl Canvas element to apply filter to\n * @param {Number} oW Original Width\n * @param {Number} oH Original Height\n * @param {Number} dW Destination Width\n * @param {Number} dH Destination Height\n * @returns {ImageData}\n */\n hermiteFastResize(\n this: ResizeDuring2DResize,\n options: T2DPipelineState,\n oW: number,\n oH: number,\n dW: number,\n dH: number,\n ) {\n const ratioW = this.rcpScaleX,\n ratioH = this.rcpScaleY,\n ratioWHalf = Math.ceil(ratioW / 2),\n ratioHHalf = Math.ceil(ratioH / 2),\n img = options.imageData,\n data = img.data,\n img2 = options.ctx.createImageData(dW, dH),\n data2 = img2.data;\n for (let j = 0; j < dH; j++) {\n for (let i = 0; i < dW; i++) {\n const x2 = (i + j * dW) * 4;\n let weight = 0;\n let weights = 0;\n let weightsAlpha = 0;\n let gxR = 0;\n let gxG = 0;\n let gxB = 0;\n let gxA = 0;\n const centerY = (j + 0.5) * ratioH;\n for (let yy = Math.floor(j * ratioH); yy < (j + 1) * ratioH; yy++) {\n const dy = Math.abs(centerY - (yy + 0.5)) / ratioHHalf,\n centerX = (i + 0.5) * ratioW,\n w0 = dy * dy;\n for (let xx = Math.floor(i * ratioW); xx < (i + 1) * ratioW; xx++) {\n let dx = Math.abs(centerX - (xx + 0.5)) / ratioWHalf;\n const w = Math.sqrt(w0 + dx * dx);\n /* eslint-disable max-depth */\n if (w > 1 && w < -1) {\n continue;\n }\n //hermite filter\n weight = 2 * w * w * w - 3 * w * w + 1;\n if (weight > 0) {\n dx = 4 * (xx + yy * oW);\n //alpha\n gxA += weight * data[dx + 3];\n weightsAlpha += weight;\n //colors\n if (data[dx + 3] < 255) {\n weight = (weight * data[dx + 3]) / 250;\n }\n gxR += weight * data[dx];\n gxG += weight * data[dx + 1];\n gxB += weight * data[dx + 2];\n weights += weight;\n }\n /* eslint-enable max-depth */\n }\n }\n data2[x2] = gxR / weights;\n data2[x2 + 1] = gxG / weights;\n data2[x2 + 2] = gxB / weights;\n data2[x2 + 3] = gxA / weightsAlpha;\n }\n }\n return img2;\n }\n}\n\nclassRegistry.setClass(Resize);\n","import { BaseFilter } from './BaseFilter';\nimport type { T2DPipelineState, TWebGLUniformLocationMap } from './typedefs';\nimport { classRegistry } from '../ClassRegistry';\nimport { fragmentSource } from './shaders/saturation';\n\nexport type SaturationOwnProps = {\n saturation: number;\n};\n\nexport const saturationDefaultValues: SaturationOwnProps = {\n saturation: 0,\n};\n\n/**\n * Saturate filter class\n * @example\n * const filter = new Saturation({\n * saturation: 1\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n */\nexport class Saturation extends BaseFilter<'Saturation', SaturationOwnProps> {\n /**\n * Saturation value, from -1 to 1.\n * Increases/decreases the color saturation.\n * A value of 0 has no effect.\n *\n * @param {Number} saturation\n */\n declare saturation: SaturationOwnProps['saturation'];\n\n static type = 'Saturation';\n\n static defaults = saturationDefaultValues;\n\n static uniformLocations = ['uSaturation'];\n\n getFragmentSource() {\n return fragmentSource;\n }\n\n /**\n * Apply the Saturation operation to a Uint8ClampedArray representing the pixels of an image.\n *\n * @param {Object} options\n * @param {ImageData} options.imageData The Uint8ClampedArray to be filtered.\n */\n applyTo2d({ imageData: { data } }: T2DPipelineState) {\n const adjust = -this.saturation;\n for (let i = 0; i < data.length; i += 4) {\n const r = data[i];\n const g = data[i + 1];\n const b = data[i + 2];\n const max = Math.max(r, g, b);\n data[i] += max !== r ? (max - r) * adjust : 0;\n data[i + 1] += max !== g ? (max - g) * adjust : 0;\n data[i + 2] += max !== b ? (max - b) * adjust : 0;\n }\n }\n\n /**\n * Send data from this filter to its shader program's uniforms.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n */\n sendUniformData(\n gl: WebGLRenderingContext,\n uniformLocations: TWebGLUniformLocationMap,\n ) {\n gl.uniform1f(uniformLocations.uSaturation, -this.saturation);\n }\n\n isNeutralState() {\n return this.saturation === 0;\n }\n}\n\nclassRegistry.setClass(Saturation);\n","export const fragmentSource = `\n precision highp float;\n uniform sampler2D uTexture;\n uniform float uSaturation;\n varying vec2 vTexCoord;\n void main() {\n vec4 color = texture2D(uTexture, vTexCoord);\n float rgMax = max(color.r, color.g);\n float rgbMax = max(rgMax, color.b);\n color.r += rgbMax != color.r ? (rgbMax - color.r) * uSaturation : 0.00;\n color.g += rgbMax != color.g ? (rgbMax - color.g) * uSaturation : 0.00;\n color.b += rgbMax != color.b ? (rgbMax - color.b) * uSaturation : 0.00;\n gl_FragColor = color;\n }\n`;\n","import { BaseFilter } from './BaseFilter';\nimport type { T2DPipelineState, TWebGLUniformLocationMap } from './typedefs';\nimport { classRegistry } from '../ClassRegistry';\nimport { fragmentSource } from './shaders/vibrance';\n\nexport type VibranceOwnProps = {\n vibrance: number;\n};\n\nexport const vibranceDefaultValues: VibranceOwnProps = {\n vibrance: 0,\n};\n\n/**\n * Vibrance filter class\n * @example\n * const filter = new Vibrance({\n * vibrance: 1\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n */\nexport class Vibrance extends BaseFilter<'Vibrance', VibranceOwnProps> {\n /**\n * Vibrance value, from -1 to 1.\n * Increases/decreases the saturation of more muted colors with less effect on saturated colors.\n * A value of 0 has no effect.\n *\n * @param {Number} vibrance\n */\n declare vibrance: VibranceOwnProps['vibrance'];\n\n static type = 'Vibrance';\n\n static defaults = vibranceDefaultValues;\n\n static uniformLocations = ['uVibrance'];\n\n getFragmentSource() {\n return fragmentSource;\n }\n\n /**\n * Apply the Vibrance operation to a Uint8ClampedArray representing the pixels of an image.\n *\n * @param {Object} options\n * @param {ImageData} options.imageData The Uint8ClampedArray to be filtered.\n */\n applyTo2d({ imageData: { data } }: T2DPipelineState) {\n const adjust = -this.vibrance;\n for (let i = 0; i < data.length; i += 4) {\n const r = data[i];\n const g = data[i + 1];\n const b = data[i + 2];\n const max = Math.max(r, g, b);\n const avg = (r + g + b) / 3;\n const amt = ((Math.abs(max - avg) * 2) / 255) * adjust;\n data[i] += max !== r ? (max - r) * amt : 0;\n data[i + 1] += max !== g ? (max - g) * amt : 0;\n data[i + 2] += max !== b ? (max - b) * amt : 0;\n }\n }\n\n /**\n * Send data from this filter to its shader program's uniforms.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {TWebGLUniformLocationMap} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n */\n sendUniformData(\n gl: WebGLRenderingContext,\n uniformLocations: TWebGLUniformLocationMap,\n ) {\n gl.uniform1f(uniformLocations.uVibrance, -this.vibrance);\n }\n\n isNeutralState() {\n return this.vibrance === 0;\n }\n}\n\nclassRegistry.setClass(Vibrance);\n","export const fragmentSource = `\n precision highp float;\n uniform sampler2D uTexture;\n uniform float uVibrance;\n varying vec2 vTexCoord;\n void main() {\n vec4 color = texture2D(uTexture, vTexCoord);\n float max = max(color.r, max(color.g, color.b));\n float avg = (color.r + color.g + color.b) / 3.0;\n float amt = (abs(max - avg) * 2.0) * uVibrance;\n color.r += max != color.r ? (max - color.r) * amt : 0.00;\n color.g += max != color.g ? (max - color.g) * amt : 0.00;\n color.b += max != color.b ? (max - color.b) * amt : 0.00;\n gl_FragColor = color;\n }\n`;\n","import { Color } from '../color/Color';\nimport type { Point } from '../Point';\nimport { Shadow } from '../Shadow';\nimport { Circle } from '../shapes/Circle';\nimport { Group } from '../shapes/Group';\nimport { getRandomInt } from '../util/internals/getRandomInt';\nimport type { Canvas } from '../canvas/Canvas';\nimport { BaseBrush } from './BaseBrush';\nimport type { CircleBrushPoint } from './typedefs';\nimport { CENTER } from '../constants';\n\nexport class CircleBrush extends BaseBrush {\n /**\n * Width of a brush\n * @type Number\n */\n width = 10;\n\n declare points: CircleBrushPoint[];\n\n constructor(canvas: Canvas) {\n super(canvas);\n this.points = [];\n }\n\n /**\n * Invoked inside on mouse down and mouse move\n * @param {Point} pointer\n */\n drawDot(pointer: Point) {\n const point = this.addPoint(pointer),\n ctx = this.canvas.contextTop;\n this._saveAndTransform(ctx);\n this.dot(ctx, point);\n ctx.restore();\n }\n\n dot(ctx: CanvasRenderingContext2D, point: CircleBrushPoint) {\n ctx.fillStyle = point.fill;\n ctx.beginPath();\n ctx.arc(point.x, point.y, point.radius, 0, Math.PI * 2, false);\n ctx.closePath();\n ctx.fill();\n }\n\n /**\n * Invoked on mouse down\n */\n onMouseDown(pointer: Point) {\n this.points = [];\n this.canvas.clearContext(this.canvas.contextTop);\n this._setShadow();\n this.drawDot(pointer);\n }\n\n /**\n * Render the full state of the brush\n * @private\n */\n _render() {\n const ctx = this.canvas.contextTop,\n points = this.points;\n this._saveAndTransform(ctx);\n for (let i = 0; i < points.length; i++) {\n this.dot(ctx, points[i]);\n }\n ctx.restore();\n }\n\n /**\n * Invoked on mouse move\n * @param {Point} pointer\n */\n onMouseMove(pointer: Point) {\n if (this.limitedToCanvasSize === true && this._isOutSideCanvas(pointer)) {\n return;\n }\n if (this.needsFullRender()) {\n this.canvas.clearContext(this.canvas.contextTop);\n this.addPoint(pointer);\n this._render();\n } else {\n this.drawDot(pointer);\n }\n }\n\n /**\n * Invoked on mouse up\n */\n onMouseUp() {\n const originalRenderOnAddRemove = this.canvas.renderOnAddRemove;\n this.canvas.renderOnAddRemove = false;\n\n const circles: Circle[] = [];\n\n for (let i = 0; i < this.points.length; i++) {\n const point = this.points[i],\n circle = new Circle({\n radius: point.radius,\n left: point.x,\n top: point.y,\n originX: CENTER,\n originY: CENTER,\n fill: point.fill,\n });\n\n this.shadow && (circle.shadow = new Shadow(this.shadow));\n\n circles.push(circle);\n }\n const group = new Group(circles, { canvas: this.canvas });\n\n this.canvas.fire('before:path:created', { path: group });\n this.canvas.add(group);\n this.canvas.fire('path:created', { path: group });\n\n this.canvas.clearContext(this.canvas.contextTop);\n this._resetShadow();\n this.canvas.renderOnAddRemove = originalRenderOnAddRemove;\n this.canvas.requestRenderAll();\n }\n\n /**\n * @param {Object} pointer\n * @return {Point} Just added pointer point\n */\n addPoint({ x, y }: Point) {\n const pointerPoint: CircleBrushPoint = {\n x,\n y,\n radius: getRandomInt(Math.max(0, this.width - 20), this.width + 20) / 2,\n fill: new Color(this.color).setAlpha(getRandomInt(0, 100) / 100).toRgba(),\n };\n\n this.points.push(pointerPoint);\n\n return pointerPoint;\n }\n}\n","import { Pattern } from '../Pattern';\nimport { createCanvasElement } from '../util/misc/dom';\nimport type { Canvas } from '../canvas/Canvas';\nimport { PencilBrush } from './PencilBrush';\nimport type { TSimplePathData } from '../util/path/typedefs';\n\nexport class PatternBrush extends PencilBrush {\n declare source?: CanvasImageSource;\n\n constructor(canvas: Canvas) {\n super(canvas);\n }\n\n getPatternSrc() {\n const dotWidth = 20,\n dotDistance = 5,\n patternCanvas = createCanvasElement(),\n patternCtx = patternCanvas.getContext('2d');\n\n patternCanvas.width = patternCanvas.height = dotWidth + dotDistance;\n if (patternCtx) {\n patternCtx.fillStyle = this.color;\n patternCtx.beginPath();\n patternCtx.arc(\n dotWidth / 2,\n dotWidth / 2,\n dotWidth / 2,\n 0,\n Math.PI * 2,\n false,\n );\n patternCtx.closePath();\n patternCtx.fill();\n }\n return patternCanvas;\n }\n\n /**\n * Creates \"pattern\" instance property\n * @param {CanvasRenderingContext2D} ctx\n */\n getPattern(ctx: CanvasRenderingContext2D) {\n return ctx.createPattern(this.source || this.getPatternSrc(), 'repeat');\n }\n\n /**\n * Sets brush styles\n * @param {CanvasRenderingContext2D} ctx\n */\n _setBrushStyles(ctx: CanvasRenderingContext2D) {\n super._setBrushStyles(ctx);\n const pattern = this.getPattern(ctx);\n pattern && (ctx.strokeStyle = pattern);\n }\n\n /**\n * Creates path\n */\n createPath(pathData: TSimplePathData) {\n const path = super.createPath(pathData),\n topLeft = path._getLeftTopCoords().scalarAdd(path.strokeWidth / 2);\n\n path.stroke = new Pattern({\n source: this.source || this.getPatternSrc(),\n offsetX: -topLeft.x,\n offsetY: -topLeft.y,\n });\n return path;\n }\n}\n","import type { Point } from '../Point';\nimport { Group } from '../shapes/Group';\nimport { Shadow } from '../Shadow';\nimport { Rect } from '../shapes/Rect';\nimport { getRandomInt } from '../util/internals/getRandomInt';\nimport type { Canvas } from '../canvas/Canvas';\nimport { BaseBrush } from './BaseBrush';\nimport type { SprayBrushPoint } from './typedefs';\nimport { CENTER } from '../constants';\n\n/**\n *\n * @param rects\n * @returns\n */\nfunction getUniqueRects(rects: Rect[]) {\n const uniqueRects: Record = {};\n const uniqueRectsArray: Rect[] = [];\n\n for (let i = 0, key: string; i < rects.length; i++) {\n key = `${rects[i].left}${rects[i].top}`;\n if (!uniqueRects[key]) {\n uniqueRects[key] = true;\n uniqueRectsArray.push(rects[i]);\n }\n }\n\n return uniqueRectsArray;\n}\n\nexport class SprayBrush extends BaseBrush {\n /**\n * Width of a spray\n * @type Number\n */\n width = 10;\n\n /**\n * Density of a spray (number of dots per chunk)\n * @type Number\n */\n density = 20;\n\n /**\n * Width of spray dots\n * @type Number\n */\n dotWidth = 1;\n\n /**\n * Width variance of spray dots\n * @type Number\n */\n dotWidthVariance = 1;\n\n /**\n * Whether opacity of a dot should be random\n * @type Boolean\n */\n randomOpacity = false;\n\n /**\n * Whether overlapping dots (rectangles) should be removed (for performance reasons)\n * @type Boolean\n */\n optimizeOverlapping = true;\n\n declare private sprayChunks: SprayBrushPoint[][];\n\n declare private sprayChunk: SprayBrushPoint[];\n\n /**\n * Constructor\n * @param {Canvas} canvas\n * @return {SprayBrush} Instance of a spray brush\n */\n constructor(canvas: Canvas) {\n super(canvas);\n this.sprayChunks = [];\n this.sprayChunk = [];\n }\n\n /**\n * Invoked on mouse down\n * @param {Point} pointer\n */\n onMouseDown(pointer: Point) {\n this.sprayChunks = [];\n this.canvas.clearContext(this.canvas.contextTop);\n this._setShadow();\n\n this.addSprayChunk(pointer);\n this.renderChunck(this.sprayChunk);\n }\n\n /**\n * Invoked on mouse move\n * @param {Point} pointer\n */\n onMouseMove(pointer: Point) {\n if (this.limitedToCanvasSize === true && this._isOutSideCanvas(pointer)) {\n return;\n }\n this.addSprayChunk(pointer);\n this.renderChunck(this.sprayChunk);\n }\n\n /**\n * Invoked on mouse up\n */\n onMouseUp() {\n const originalRenderOnAddRemove = this.canvas.renderOnAddRemove;\n this.canvas.renderOnAddRemove = false;\n\n const rects: Rect[] = [];\n\n for (let i = 0; i < this.sprayChunks.length; i++) {\n const sprayChunk = this.sprayChunks[i];\n for (let j = 0; j < sprayChunk.length; j++) {\n const chunck = sprayChunk[j];\n const rect = new Rect({\n width: chunck.width,\n height: chunck.width,\n left: chunck.x + 1,\n top: chunck.y + 1,\n originX: CENTER,\n originY: CENTER,\n fill: this.color,\n });\n rects.push(rect);\n }\n }\n\n const group = new Group(\n this.optimizeOverlapping ? getUniqueRects(rects) : rects,\n {\n objectCaching: true,\n subTargetCheck: false,\n interactive: false,\n },\n );\n this.shadow && group.set('shadow', new Shadow(this.shadow));\n this.canvas.fire('before:path:created', { path: group });\n this.canvas.add(group);\n this.canvas.fire('path:created', { path: group });\n\n this.canvas.clearContext(this.canvas.contextTop);\n this._resetShadow();\n this.canvas.renderOnAddRemove = originalRenderOnAddRemove;\n this.canvas.requestRenderAll();\n }\n\n renderChunck(sprayChunck: SprayBrushPoint[]) {\n const ctx = this.canvas.contextTop;\n ctx.fillStyle = this.color;\n\n this._saveAndTransform(ctx);\n\n for (let i = 0; i < sprayChunck.length; i++) {\n const point = sprayChunck[i];\n ctx.globalAlpha = point.opacity;\n ctx.fillRect(point.x, point.y, point.width, point.width);\n }\n\n ctx.restore();\n }\n\n /**\n * Render all spray chunks\n */\n _render() {\n const ctx = this.canvas.contextTop;\n ctx.fillStyle = this.color;\n\n this._saveAndTransform(ctx);\n\n for (let i = 0; i < this.sprayChunks.length; i++) {\n this.renderChunck(this.sprayChunks[i]);\n }\n ctx.restore();\n }\n\n /**\n * @param {Point} pointer\n */\n addSprayChunk(pointer: Point) {\n this.sprayChunk = [];\n const radius = this.width / 2;\n\n for (let i = 0; i < this.density; i++) {\n this.sprayChunk.push({\n x: getRandomInt(pointer.x - radius, pointer.x + radius),\n y: getRandomInt(pointer.y - radius, pointer.y + radius),\n width: this.dotWidthVariance\n ? getRandomInt(\n // bottom clamp width to 1\n Math.max(1, this.dotWidth - this.dotWidthVariance),\n this.dotWidth + this.dotWidthVariance,\n )\n : this.dotWidth,\n opacity: this.randomOpacity ? getRandomInt(0, 100) / 100 : 1,\n });\n }\n\n this.sprayChunks.push(this.sprayChunk);\n }\n}\n","import { createEmptyResponse } from './parseSVGDocument';\nimport { loadSVGFromString } from './loadSVGFromString';\nimport type { SVGParsingOutput, TSvgReviverCallback } from './typedefs';\nimport type { LoadImageOptions } from '../util/misc/objectEnlive';\nimport { FabricError } from '../util/internals/console';\n\n/**\n * Takes url corresponding to an SVG document, and parses it into a set of fabric objects.\n * Note that SVG is fetched via fetch API, so it needs to conform to SOP (Same Origin Policy)\n * @param {string} url where the SVG is\n * @param {TSvgParsedCallback} callback Invoked when the parsing is done, with null if parsing wasn't possible with the list of svg nodes.\n * {@link TSvgParsedCallback} also receives `allElements` array as the last argument. This is the full list of svg nodes available in the document.\n * You may want to use it if you are trying to regroup the objects as they were originally grouped in the SVG. ( This was the reason why it was added )\n * @param {TSvgReviverCallback} [reviver] Extra callback for further parsing of SVG elements, called after each fabric object has been created.\n * Takes as input the original svg element and the generated `FabricObject` as arguments. Used to inspect extra properties not parsed by fabric,\n * or extra custom manipulation\n * @param {Object} [options] Object containing options for parsing\n * @param {String} [options.crossOrigin] crossOrigin setting to use for external resources\n * @param {AbortSignal} [options.signal] handle aborting, see https://developer.mozilla.org/en-US/docs/Web/API/AbortController/signal\n */\nexport function loadSVGFromURL(\n url: string,\n reviver?: TSvgReviverCallback,\n options: LoadImageOptions = {},\n): Promise {\n return fetch(url.replace(/^\\n\\s*/, '').trim(), {\n signal: options.signal,\n })\n .then((response) => {\n if (!response.ok) {\n throw new FabricError(`HTTP error! status: ${response.status}`);\n }\n return response.text();\n })\n .then((svgText) => {\n return loadSVGFromString(svgText, reviver, options);\n })\n .catch(() => {\n // this is an unhappy path, we dont care about speed\n return createEmptyResponse();\n });\n}\n"],"names":["BaseConfiguration","constructor","_defineProperty","this","window","devicePixelRatio","config","super","configure","arguments","length","undefined","Object","assign","addFonts","paths","fontPaths","removeFonts","forEach","fontFamily","clearFonts","restoreDefaults","keys","defaults","reduce","acc","key","log","severity","_len","optionalParams","Array","_key","console","FabricError","Error","message","options","SignalAbortedError","context","GLProbe","WebGLProbe","testPrecision","gl","precision","fragmentSource","fragmentShader","createShader","FRAGMENT_SHADER","shaderSource","compileShader","getShaderParameter","COMPILE_STATUS","queryWebGL","canvas","getContext","maxTextureSize","getParameter","MAX_TEXTURE_SIZE","GLPrecision","find","getExtension","loseContext","isSupported","textureSize","copyPasteData","env","getEnv","document","isTouchSupported","navigator","maxTouchPoints","dispose","getFabricDocument","getFabricWindow","getDevicePixelRatio","_config$devicePixelRa","Math","max","cache","getFontCache","_ref","fontStyle","fontWeight","toLowerCase","charWidthsCache","fontCache","cacheKey","clearFontCache","limitDimsByArea","ar","perfLimitSizeTotal","roughWidth","sqrt","floor","VERSION","noop","halfPI","PI","quarterPI","twoMathPi","PiBy180","iMatrix","freeze","DEFAULT_SVG_FONT_SIZE","kRect","CENTER","LEFT","TOP","BOTTOM","RIGHT","NONE","reNewline","MOVING","SCALING","ROTATING","ROTATE","SKEWING","RESIZING","MODIFY_POLY","MODIFY_PATH","CHANGED","SCALE","SCALE_X","SCALE_Y","SKEW_X","SKEW_Y","FILL","STROKE","MODIFIED","JSON","SVG","classRegistry","Map","has","classType","getClass","get","setClass","classConstructor","set","type","getSVGClass","SVGTagName","setSVGClass","runningAnimations","remove","index","indexOf","splice","cancelAll","animations","animation","abort","cancelByCanvas","filter","_animation$target","target","cancelByTarget","Observable","on","arg0","handler","__eventListeners","entries","eventName","off","push","once","disposers","_ref2","d","disposer","args","call","_removeEventListener","eventListener","_ref3","fire","_this$__eventListener","listenersForEvent","concat","i","removeFromArray","array","value","idx","cos","angle","abs","sin","angleSlice","sign","Point","y","x","add","that","addEquals","scalarAdd","scalar","scalarAddEquals","subtract","subtractEquals","scalarSubtract","scalarSubtractEquals","multiply","scalarMultiply","scalarMultiplyEquals","divide","scalarDivide","scalarDivideEquals","eq","lt","lte","gt","gte","lerp","t","min","distanceFrom","dx","dy","midPointFrom","toString","setXY","setX","setY","setFromPoint","swap","clone","rotate","radians","origin","ZERO","sinus","cosinus","p","transform","ignoreOffset","isCollection","fabricObject","isArray","_objects","createCollectionMixin","Base","Collection","_onObjectAdded","object","_onObjectRemoved","_onStackOrderChanged","objects","size","insertAt","_len2","_key2","removed","_len3","_key3","forEachObject","callback","getObjects","_len4","types","_key4","o","isType","item","isEmpty","contains","deep","includes","some","obj","complexity","memo","current","sendObjectToBack","unshift","bringObjectToFront","sendObjectBackwards","intersecting","newIdx","findNewLowerIndex","bringObjectForward","findNewUpperIndex","moveObjectTo","isOverlapping","collectObjects","left","top","width","height","includeIntersecting","tl","br","selectable","visible","intersectsWithRect","isContainedWithinRect","containsPoint","CommonMethods","_setOptions","prop","_setObject","_set","toggle","property","requestAnimFrame","requestAnimationFrame","cancelAnimFrame","handle","cancelAnimationFrame","id","uid","createCanvasElement","element","createElement","createImage","createCanvasElementFor","newCanvas","toDataURL","canvasEl","format","quality","toBlob","Promise","resolve","_","degreesToRadians","degrees","radiansToDegrees","isIdentityMatrix","mat","every","transformPoint","invertTransform","a","r","multiplyTransformMatrices","b","is2x2","multiplyTransformMatrixArray","matrices","reduceRight","product","curr","calcPlaneRotation","atan2","qrDecompose","denom","pow","scaleX","scaleY","skewX","skewY","translateX","translateY","createTranslateMatrix","createRotateMatrix","angleRadiant","cosValue","sinValue","createScaleMatrix","angleToSkew","tan","createSkewXMatrix","skewValue","createSkewYMatrix","calcDimensionsMatrix","flipX","flipY","matrix","composeMatrix","scaleMatrix","loadImage","url","signal","crossOrigin","reject","aborted","img","err","src","addEventListener","done","onload","onerror","removeEventListener","enlivenObjects","reviver","instances","all","map","fromObject","then","fabricInstance","catch","error","instance","finally","enlivenObjectEnlivables","serializedObject","promises","values","enlived","pick","source","pickBy","predicate","toFixed","number","fractionDigits","parseFloat","Number","matrixToSVG","NUM_FRACTION_DIGITS","join","isFiller","filler","toLive","isSerializableFiller","toObject","isPattern","offsetX","isActiveSelection","getScrollLeftTop","doc","getDocumentFromElement","elementLoop","docElement","documentElement","body","scrollLeft","scrollTop","parentNode","host","nodeType","style","position","el","ownerDocument","getWindowFromElement","_el$ownerDocument","defaultView","setCanvasDimensions","ctx","retinaScaling","setAttribute","scale","setCSSDimensions","makeElementUnselectable","onselectstart","userSelect","StaticCanvasDOMManager","createLowerCanvas","lower","getElementById","hasAttribute","_originalCanvasStyle","cssText","classList","cleanupDOM","removeAttribute","setDimensions","calcOffset","_getWindowFromElement","offset","elemStyle","getComputedStyle","parseInt","borderLeftWidth","borderTopWidth","paddingLeft","paddingTop","box","docElem","getBoundingClientRect","scrollLeftTop","clientLeft","clientTop","getElementOffset","staticCanvasDefaults","backgroundVpt","backgroundColor","overlayVpt","overlayColor","includeDefaultValues","svgViewportTransformation","renderOnAddRemove","skipOffscreen","enableRetinaScaling","imageSmoothingEnabled","controlsAboveOverlay","allowTouchScrolling","viewportTransform","StaticCanvas","lowerCanvasEl","_this$elements$lower","elements","contextContainer","_this$elements$lower2","getDefaults","ownDefaults","initElements","_setDimensionsImpl","skipControlsDrawing","calcViewportBoundaries","requestRenderAll","setCoords","getRetinaScaling","_offset","getWidth","getHeight","dimensions","cssOnly","backstoreOnly","hasLostContext","getZoom","setViewportTransform","vpt","zoomToPoint","point","before","newPoint","after","setZoom","absolutePan","relativePan","getElement","clearContext","clearRect","clear","backgroundImage","overlayImage","renderAll","cancelRequestedRender","destroyed","renderCanvas","renderAndReset","nextRenderHandle","disposed","iVpt","vptCoords","tr","bl","drawControls","_ctx","v","path","clipPath","patternQuality","_renderBackground","save","_renderObjects","restore","shouldCache","_transformDone","renderCache","forClipping","drawClipPathOnCanvas","_renderOverlay","__cleanupTask","globalCompositeOperation","zoomX","zoomY","drawImage","_cacheCanvas","cacheTranslationX","cacheTranslationY","len","render","_renderBackgroundOrOverlay","fill","needsVpt","isAFiller","beginPath","moveTo","lineTo","closePath","fillStyle","offsetY","m","gradientTransform","patternTransform","getCenterPoint","centerObjectH","_centerObject","centerObjectV","centerObject","viewportCenterObject","getVpCenter","viewportCenterObjectH","viewportCenterObjectV","center","toDatalessJSON","propertiesToInclude","toDatalessObject","_toObjectMethod","toJSON","methodName","clipPathData","excludeFromExport","_toObject","version","__serializeBgOverlay","originalValue","data","bgImage","bgColor","background","overlay","toSVG","markup","_setSVGPreamble","_setSVGHeader","clipPathId","_setSVGBgOverlayColor","_setSVGBgOverlayImage","_setSVGObjects","suppressPreamble","encoding","optViewBox","viewBox","createSVGFontFacesMarkup","createSVGRefElementsMarkup","createSVGClipPathMarkup","toClipPathSVG","shouldTransform","additionalTransform","fontList","_renderText","styles","styleRow","fontListMarkup","_setSVGObject","bgOrOverlay","repeat","finalWidth","finalHeight","loadFromJSON","json","serialized","parse","enlivedMap","properties","cloneWithoutData","multiplier","finalMultiplier","toCanvasElement","scaledWidth","scaledHeight","zoom","originalWidth","originalHeight","originalSkipControlsDrawing","newZoom","vp","newVp","originalRetina","objectsToRender","task","destroy","kill","touchEvents","getPointer","event","scroll","_evt","touchProp","changedTouches","getTouchInfo","clientX","clientY","isTouchEvent","pointerType","stopEvent","e","preventDefault","stopPropagation","makeBoundingBoxFromPoints","points","addTransformToObject","applyTransformToObject","calcOwnMatrix","otherOptions","setPositionByOrigin","resetObjectTransform","saveObjectTransform","sizeAfterTransform","dimX","dimY","bbox","calcPlaneChangeMatrix","from","sendPointToPlane","to","sendVectorToPlane","sendObjectToPlane","fireEvent","_target$canvas","originOffset","bottom","right","resolveOrigin","originValue","unitVectorX","zero","rotateVector","vector","createVector","magnitude","calcAngleBetweenVectors","crossProduct","dotProduct","calcVectorRotation","getUnitVector","getOrthonormalVector","counterClockwise","isBetweenVectors","AxB","AxT","BxT","NOT_ALLOWED_CURSOR","isTransformCentered","originX","originY","invertOrigin","isLocked","lockingKey","commonEventInfo","eventData","pointer","findCornerQuadrant","control","coord","round","getLocalPoint","corner","controls","padding","localPoint","getRelativeCenterPoint","translateToGivenOrigin","normalizePoint","dragHandler","newLeft","newTop","moveX","moveY","ColorNameMap","aliceblue","antiquewhite","aqua","aquamarine","azure","beige","bisque","black","blanchedalmond","blue","blueviolet","brown","burlywood","cadetblue","chartreuse","chocolate","coral","cornflowerblue","cornsilk","crimson","cyan","darkblue","darkcyan","darkgoldenrod","darkgray","darkgrey","darkgreen","darkkhaki","darkmagenta","darkolivegreen","darkorange","darkorchid","darkred","darksalmon","darkseagreen","darkslateblue","darkslategray","darkslategrey","darkturquoise","darkviolet","deeppink","deepskyblue","dimgray","dimgrey","dodgerblue","firebrick","floralwhite","forestgreen","fuchsia","gainsboro","ghostwhite","gold","goldenrod","gray","grey","green","greenyellow","honeydew","hotpink","indianred","indigo","ivory","khaki","lavender","lavenderblush","lawngreen","lemonchiffon","lightblue","lightcoral","lightcyan","lightgoldenrodyellow","lightgray","lightgrey","lightgreen","lightpink","lightsalmon","lightseagreen","lightskyblue","lightslategray","lightslategrey","lightsteelblue","lightyellow","lime","limegreen","linen","magenta","maroon","mediumaquamarine","mediumblue","mediumorchid","mediumpurple","mediumseagreen","mediumslateblue","mediumspringgreen","mediumturquoise","mediumvioletred","midnightblue","mintcream","mistyrose","moccasin","navajowhite","navy","oldlace","olive","olivedrab","orange","orangered","orchid","palegoldenrod","palegreen","paleturquoise","palevioletred","papayawhip","peachpuff","peru","pink","plum","powderblue","purple","rebeccapurple","red","rosybrown","royalblue","saddlebrown","salmon","sandybrown","seagreen","seashell","sienna","silver","skyblue","slateblue","slategray","slategrey","snow","springgreen","steelblue","teal","thistle","tomato","turquoise","violet","wheat","white","whitesmoke","yellow","yellowgreen","hue2rgb","q","rgb2Hsl","g","maxValue","minValue","h","s","l","fromAlphaToFloat","endsWith","hexify","toUpperCase","padStart","greyAverage","avg","Color","color","setSource","_source","_tryParsingColor","sourceFromHex","sourceFromRgb","sourceFromHsl","isUnrecognised","getSource","toRgb","toRgba","toHsl","toHsla","toHex","toHexa","slice","getAlpha","setAlpha","alpha","toGrayscale","toBlackWhite","threshold","average","bOrW","overlayWith","otherColor","otherSource","R","G","B","fromRgb","fromRgba","match","parsedValue","fromHsl","fromHsla","parseAngletoDegrees","fromHex","expandedValue","split","hex","hexCouple","lowercase","numeric","parseUnit","fontSize","unit","exec","dpi","DPI","parsePreserveAspectRatioAttribute","attribute","firstPart","secondPart","trim","alignX","alignY","align","meetOrSlice","colorPropToSVG","colorValue","opacityValue","inlineStyle","opacity","FabricObjectSVGExportMixin","getSvgStyles","skipShadow","fillRule","strokeWidth","strokeDashArray","strokeDashOffset","strokeLineCap","strokeLineJoin","strokeMiterLimit","visibility","getSvgFilter","stroke","shadow","getSvgCommons","getSvgTransform","full","calcTransformMatrix","_toSVG","_reviver","_createBaseSVGMarkup","_createBaseClipPathSVGMarkup","objectMarkup","commonPieces","noStyle","withShadow","styleInfo","shadowInfo","vectorEffect","strokeUniform","absoluteClipPath","absolutePositioned","clipPathMarkup","addPaintOrder","paintFirst","getSvgRegex","arr","RegExp","TEXT_DECORATION_THICKNESS","fontProperties","textDecorationProperties","textLayoutProperties","additionalProps","styleProperties","textDefaultValues","_reNewline","_reSpacesAndTabs","_reSpaceAndTab","_reWords","underline","overline","linethrough","textAlign","lineHeight","textBackgroundColor","pathStartOffset","pathSide","pathAlign","charSpacing","deltaY","direction","CACHE_FONT_SIZE","MIN_TEXT_WIDTH","superscript","baseline","subscript","_fontSizeFraction","offsets","_fontSizeMult","JUSTIFY","JUSTIFY_LEFT","JUSTIFY_RIGHT","JUSTIFY_CENTER","reNum","String","raw","viewportSeparator","svgNS","reFontDeclaration","attributesMap","cx","cy","display","fSize","cPath","svgValidTagNamesRegEx","svgViewBoxElementsRegEx","svgValidParentsRegEx","reViewBoxAttrValue","shadowOffsetRegex","reOffsetsAndBlur","Shadow","parseShadow","shadowStr","blur","replace","fBoxX","fBoxY","affectStroke","nonScaling","capValue","stateProperties","cacheProperties","fabricObjectDefaultValues","minScaleLimit","objectCaching","inverted","centeredRotation","centeredScaling","dirty","normalize","c","asin","elastic","defaultEasing","easeOutBounce","easeInBounce","easeInCirc","easeInCubic","easeInElastic","normA","normS","normP","easeInExpo","easeInOutBounce","easeInOutCirc","easeInOutCubic","easeInOutElastic","normC","easeInOutExpo","easeInOutQuad","easeInOutQuart","easeInOutQuint","easeInOutSine","easeInQuad","easeInQuart","easeInQuint","easeInSine","easeOutCirc","easeOutCubic","easeOutElastic","easeOutExpo","easeOutQuad","easeOutQuart","easeOutQuint","easeOutSine","defaultAbort","AnimationBase","startValue","byValue","duration","delay","easing","onStart","onChange","onComplete","tick","bind","_onStart","_onChange","_onComplete","_abort","endValue","calculate","state","_state","isDone","start","firstTick","timestamp","startTime","Date","register","setTimeout","durationMs","boundDurationMs","durationProgress","valueProgress","unregister","ValueAnimation","timeElapsed","ArrayAnimation","defaultColorEasing","wrapColorCallback","rgba","ColorAnimation","startColor","endColor","animate","isArrayAnimation","animateColor","Intersection","status","append","isPointContained","T","A","infinite","AB","isPointInPolygon","other","hits","inter","intersectSegmentSegment","intersectLineLine","a1","a2","b1","b2","aInfinite","bInfinite","a2xa1x","a2ya1y","b2xb1x","b2yb1y","a1xb1x","a1yb1y","uaT","ubT","uB","ua","ub","segmentsCoincide","intersectSegmentLine","s1","s2","l1","l2","intersectLinePolygon","result","intersectSegmentPolygon","intersectPolygonPolygon","points1","points2","coincidences","intersectPolygonRectangle","r1","r2","topRight","bottomLeft","ObjectGeometry","getX","getXY","getY","getRelativeX","setRelativeX","getRelativeY","setRelativeY","relativePosition","getRelativeXY","group","setRelativeXY","isStrokeAccountedForInDimensions","getCoords","aCoords","calcACoords","coords","intersectsWithObject","intersection","isContainedWithinObject","getBoundingRect","isOnScreen","isPartiallyOnScreen","getScaledWidth","_getTransformedDimensions","getScaledHeight","scaleToWidth","boundingRectFactor","scaleToHeight","getCanvasRetinaScaling","_this$canvas","getTotalAngle","getViewportTransform","_this$canvas2","rotateMatrix","tMatrix","finalMatrix","dim","w","transformMatrixKey","skipGroup","prefix","matrixCache","ownMatrixCache","_getNonTransformedDimensions","_calculateCurrentDimensions","dimOptions","preScalingStrokeValue","postScalingStrokeValue","finalDimensions","fromOriginX","fromOriginY","toOriginX","toOriginY","translateToCenterPoint","translateToOriginPoint","relCenter","getPointByOrigin","pos","_getLeftTopCoords","FabricObject","name","setOptions","_createCacheCanvas","_cacheContext","_updateCacheCanvas","_limitCacheSize","dims","maxCacheSideLimit","minCacheSideLimit","limX","limY","capped","_getCacheCanvasDimensions","objectScale","getTotalObjectScaling","neededX","neededY","ceil","dimensionsChanged","zoomChanged","setTransform","drawingWidth","drawingHeight","translate","needFullTransform","contextTop","getObjectScaling","retina","getObjectOpacity","_constrainScale","isChanged","parent","isNotVisible","_setupCompositeOperation","drawSelectionBackground","_setOpacity","_setShadow","drawCacheOnCanvas","_removeCacheCanvas","drawObject","isCacheDirty","parentClipPaths","hasStroke","hasFill","needsItsOwnCache","ownCaching","isOnACache","willDrawShadow","drawClipPathOnCache","canvasWithClipPath","originalFill","originalStroke","_setClippingProperties","_render","_drawClipPath","createClipPathLayer","prevClipPath","skipCanvas","fillRect","_removeShadow","globalAlpha","_setStrokeStyles","decl","lineWidth","lineCap","lineDashOffset","lineJoin","miterLimit","gradientUnits","_applyPatternForTransformedGradient","strokeStyle","_applyPatternGradientTransform","_setFillStyles","_setLineDash","dashArray","setLineDash","sx","sy","multX","multY","scaling","shadowColor","shadowBlur","browserShadowBlurConstant","shadowOffsetX","shadowOffsetY","_renderPaintInOrder","_renderStroke","_renderFill","_pCtx$createPattern","pCanvas","pCtx","createPattern","_findCenterFromElement","objectForm","cloneAsImage","origParams","originalGroup","originalShadow","canvasProvider","withoutTransform","withoutShadow","boundingRect","shadowOffset","originalCanvas","setOnGroup","animatable","_animate","propIsColor","colorProperties","animationOptions","isDescendantOf","getAncestors","ancestors","findCommonAncestors","fork","otherFork","common","otherAncestors","ancestor","j","hasCommonAncestors","commonAncestors","isInFrontOf","ancestorData","firstCommonAncestor","headOfFork","pop","headOfOtherFork","thisIndex","otherIndex","propertiesToSerialize","customProperties","toFixedBound","val","_removeDefaultValues","baseValues","getPrototypeOf","baseValue","_fromObject","serializedObjectOptions","extraParam","enlivedObjectOptions","wrapWithFireEvent","actionHandler","extraEventInfo","actionPerformed","wrapWithFixedAnchor","centerPoint","constraint","changeWidth","changeObjectWidth","strokePadding","oldWidth","newWidth","renderCircleControl","styleOverride","xSize","sizeX","cornerSize","ySize","sizeY","transparentCorners","cornerStrokeColor","myLeft","myTop","cornerColor","arc","renderSquareControl","xSizeBy2","ySizeBy2","strokeRect","Control","shouldActivate","controlKey","_fabricObject$canvas","getActiveObject","isControlVisible","getActionHandler","getMouseDownHandler","mouseDownHandler","getMouseUpHandler","mouseUpHandler","cursorStyleHandler","cursorStyle","getActionName","actionName","getVisibility","_fabricObject$_contro","_fabricObject$_contro2","_controlsVisibility","setVisibility","positionHandler","currentControl","calcCornerCoords","objectCornerSize","centerX","centerY","isTouch","touchSizeX","touchSizeY","cornerStyle","rotationStyleHandler","lockRotation","rotationWithSnapping","rotateObjectWithSnapping","ex","ey","theta","pivotPoint","lastAngle","curAngle","snapAngle","snapThreshold","rightAngleLocked","leftAngleLocked","hasRotated","scaleIsProportional","uniformIsToggled","uniScaleKey","uniformScaling","scalingIsForbidden","by","scaleProportionally","lockX","lockY","scaleMap","scaleCursorStyleHandler","n","scaleObject","signX","signY","gestureScale","distance","original","oldScaleX","oldScaleY","scalingEqually","scaleObjectFromCorner","scalingX","scaleObjectX","scalingY","scaleObjectY","AXIS_KEYS","counterAxis","skew","lockSkewing","flip","skewMap","skewCursorStyleHandler","skewHandler","axis","originKey","lockSkewingKey","skewKey","flipKey","counterOriginKey","counterFlipKey","counterOriginFactor","skewingSide","finalHandler","skewingBefore","skewingStart","shearingStart","shearing","skewing","atan","changed","dimBefore","dimAfter","compensationFactor","skewObject","skewHandlerX","skewHandlerY","isAltAction","altActionKey","scaleOrSkewActionName","isAlternative","scaleSkewCursorStyleHandler","scalingXOrSkewingY","scalingYOrSkewingX","createObjectDefaultControls","ml","mr","mb","mt","mtr","withConnection","createResizeControls","createTextboxDefaultControls","InteractiveFabricObject","createControls","targetCanvas","noScaleCache","_currentTransform","action","startsWith","getActiveControl","__corner","oCoords","findControl","forTouch","hasControls","cornerEntries","touchCorner","calcOCoords","rMatrix","positionMatrix","startMatrix","transformOptions","forEachControl","_calcCornerCoords","touchCornerSize","fn","selectionBackgroundColor","_activeObject","wh","strokeBorders","_drawBorders","borderColor","borderDashArray","drawControlsConnectingLines","_renderControls","hasBorders","styleOptions","shouldDrawBorders","shouldDrawControls","borderScaleFactor","isMoving","borderOpacityWhenMoving","drawBorders","forActiveSelection","shouldStroke","cornerDashArray","setControlVisible","setControlsVisibility","clearContextTop","restoreManually","onDeselect","_options","onSelect","shouldStartDragging","_e","onDragStart","canDrop","renderDragSourceEffect","renderDropTargetEffect","applyMixins","derivedCtor","constructors","baseCtor","getOwnPropertyNames","prototype","defineProperty","getOwnPropertyDescriptor","create","lockMovementX","lockMovementY","lockScalingX","lockScalingY","lockSkewingX","lockSkewingY","lockScalingFlip","evented","perPixelTargetFind","activeOn","hoverCursor","moveCursor","isTransparent","tolerance","getImageData","StrokeProjectionsBase","strokeProjectionMagnitude","strokeUniformScalar","createSideVector","projectOrthogonally","applySkew","calcOrthogonalProjection","isSkewed","scaleUnitVector","unitVector","zeroVector","StrokeLineJoinProjections","getOrthogonalRotationFactor","vector1","vector2","C","AC","bisector","orthogonalProjection","correctSide","projectBevel","projections","projectMiter","hypotUnitScalar","miterVector","projectRoundNoSkew","startCircle","endCircle","projectRoundWithSkew","circleRadius","newY","furthestY","newX","furthestX","projectRound","isStraightLine","newOrigin","proj0","proj1","comparisonVector","isProj0Start","projectPoints","project","originPoint","projectedPoint","StrokeLineCapProjections","projectButt","projection","projectSquare","strokePointingOut","projectedA","projectStrokeOnPoints","openPath","reduced","findIndexRight","cloneStyles","newObj","keyInner","escapeXml","string","segmenter","graphemeSplit","textstring","Intl","Segmenter","granularity","segments","segment","graphemeSplitImpl","graphemes","chr","getWholeChar","str","code","charCodeAt","isNaN","charAt","next","prev","firstLetterOnly","hasStyleChanged","prevStyle","thisStyle","forTextSpans","textDecorationThickness","stylesToArray","text","textLines","stylesArray","charIndex","chars","end","stylesFromArray","stylesObject","styleIndex","SHARED_ATTRIBUTES","selectorMatches","selector","nodeName","classNames","getAttribute","azAz","matcher","splitClassNames","elementMatchesRule","selectors","parentMatching","firstMatching","parentElement","doesSomeParentMatch","getGlobalStylesForElement","cssRules","rule","normalizeAttr","attr","_attributesMap","regex","transforms","transformList","reTransformList","reTransform","reTransformAll","parseTransformAttribute","attributeValue","cleanupSvgAttribute","test","matchAll","transformMatch","matchedParams","operation","rawArgs","arg1","arg2","arg3","arg4","arg5","arg","normalizeValue","parentAttributes","parsed","ouputValue","transformMatrix","fillIndex","strokeIndex","parseStyleString","oStyle","chunk","parseStyleAttribute","parseStyleObject","colorAttributesMap","parseAttributes","attributes","parentFontSize","ownAttributes","normalizedStyle","normalizedAttr","normalizedValue","font","parseFontDeclaration","mergedAttrs","colorAttr","setStrokeFillOpacity","RECT_PROPS","Rect","_initRxRy","rx","ry","isRounded","bezierCurveTo","fromElement","restOfparsedAttributes","ATTRIBUTE_NAMES","Boolean","LAYOUT_TYPE_INITIALIZATION","LAYOUT_TYPE_ADDED","LAYOUT_TYPE_REMOVED","LAYOUT_TYPE_IMPERATIVE","getObjectBounds","destinationGroup","currentGroup","objectCenter","accountForStroke","strokeUniformVector","scalingStrokeWidth","sizeVector","LayoutStrategy","calcLayoutResult","shouldPerformLayout","calcBoundingBox","prevStrategy","strategy","shouldLayoutClipPath","getInitialSize","overrides","bboxSize","bboxCenter","actualSize","relativeCorrection","FitContentLayout","LAYOUT_MANAGER","LayoutManager","_subscriptions","performLayout","strictContext","bubbles","_prevLayoutStrategy","onBeforeLayout","layoutResult","getLayoutResult","commitLayout","onAfterLayout","attachHandlers","trigger","subscribe","unsubscribe","_context","delete","unsubscribeTargets","targets","subscribeTargets","tricklingContext","layoutManager","prevCenter","nextCenter","correction","_context$x","_context$y","layoutObjects","layoutObject","bubblingContext","NoopLayoutManager","Group","groupInit","_options$layoutManage","__objectSelectionTracker","__objectSelectionMonitor","__objectSelectionDisposer","enterGroup","canEnterGroup","_filterObjectsBeforeEnteringGroup","allowedObjects","_onAfterObjectsChange","removeParentTransform","exitGroup","_shouldSetNestedCoords","subTargetCheck","removeAll","_activeObjects","selected","activeObjects","_watchObject","watch","_enterGroup","activeObject","_exitGroup","ownCache","preserveObjectStacking","triggerLayout","__serializeObjects","method","_includeDefaultValues","originalDefaults","_createSVGBgRect","fillStroke","commons","svgString","bg","abortable","hydratedOptions","layoutClass","strategyClass","interactive","findScaleToFit","destination","findScaleToCover","commaWsp","reArcCommandPoints","repeatedCommands","M","segmentToBezier","theta1","theta2","cosTh","sinTh","cx1","cy1","mT","fromX","fromY","costh1","sinth1","costh2","sinth2","toX","toY","calcVectorAngle","ux","uy","vx","vy","ta","tb","getBoundsOfCurve","begx","begy","cp1x","cp1y","cp2x","cp2y","endx","endy","argsString","cachesBoundsOfCurve","boundsOfCurveCache","tvalues","bounds","b2ac","sqrtb2ac","t1","t2","jlen","iterator","getPointOnCubicBezierIterator","fromArcToBeziers","fx","fy","rot","large","sweep","tx","ty","segsNorm","arcToSegments","rotateX","root","sinTheta","px","py","rx2","ry2","py2","px2","pl","_rx","_ry","mTheta","dtheta","mDelta","th3","makePathSimpler","x1","y1","destinationPath","previous","controlX","controlY","parsedCommand","converted","calcLineLength","x2","y2","pct","c1","c2","CB2","c3","CB3","c4","CB4","QB1","QB2","QB3","getTangentCubicIterator","p1x","p1y","p2x","p2y","p3x","p3y","p4x","p4y","qb1","qb2","qb3","tangentX","tangentY","getPointOnQuadraticBezierIterator","getTangentQuadraticIterator","invT","pathIterator","tempP","tmpLen","perc","findPercentageForDistance","segInfo","nextLen","nextStep","lastPerc","angleFinder","getPathSegmentsInfo","tempInfo","totalLength","info","basicInfo","command","destX","destY","getPointOnPath","infos","segPercent","rePathCmdAll","regExpArcCommandPoints","reMyNum","commandLengths","parsePath","pathString","_pathString$match","chain","matchStr","commandLetter","commandLength","paramArr","lastIndex","out","newCommand","transformedCommand","getSmoothPathFromPoints","p1","p2","multSignX","multSignY","manyPoints","midPoint","joinPath","pathData","getRandomInt","random","removeTransformMatrixForSvgParsing","preserveAspectRatioOptions","_assignTransformMatrixProps","cropX","cropY","offsetLeft","offsetTop","_newCanvas$getContext","getRegularPolygonPath","numVertexes","radius","interiorAngle","rotationAdjustment","rad","commonAttributes","groupSVGElements","mergeClipPaths","_b$group","removeTransformFromObject","finalTransform","transformPath","pathOffset","pathSegment","newSegment","setStyle","elementStyle","setProperty","CanvasDOMManager","containerClass","upperCanvasEl","createUpperCanvas","upper","applyCanvasStyle","container","createContainerElement","replaceChild","className","removeChild","SelectableCanvas","_this$elements$upper","_this$elements$upper2","wrapperEl","_objectsToRender","deselected","_discardActiveObject","_hoveredTarget","_hoveredTargets","_chooseObjectsToRender","contextTopDirty","_groupSelector","isDrawingMode","renderTopLayer","_isCurrentlyDrawing","freeDrawingBrush","selection","_drawSelection","renderTop","setTargetFindTolerance","targetFindTolerance","pixelFindCanvasEl","pixelFindContext","isTargetTransparent","selectionBgc","enhancedTolerance","_isSelectionKeyPressed","sKey","selectionKey","_shouldClearSelection","getActiveObjects","_shouldCenterTransform","modifierKeyPressed","centerTransform","_getOriginFromCorner","controlName","_setupCurrentTransform","alreadySelected","_control$getActionHan","getScenePoint","getActionFromCorner","altKey","centeredKey","lastX","lastY","shiftKey","setCursor","cursor","deltaX","extent","strokeOffset","selectionLineWidth","minX","minY","maxX","maxY","selectionColor","selectionBorderColor","selectionDashArray","dblClickLock","dblClickIsolateObject","isolatedObject","searchPossibleTargets","discardActiveObject","setSearchTargets","_searchTargets","getSearchTargets","findTarget","_targetInfo","skipTargetFind","subTargets","currentSubTargets","aObjects","targetInfo","currentContainer","currentTarget","fullTargetInfo","activeObjectTargetInfo","getViewportPoint","altSelectionKey","_pointIsInObjectSelectionArea","viewportZoom","angleRadians","cosP","sinP","cosPSinP","cosPMinusSinP","_checkTarget","isEditing","viewportPoint","_searchPossibleTargets","subTarget","_viewportPoint","_getPointerImpl","_scenePoint","fromViewport","boundsWidth","boundsHeight","cssScale","_resetTransformEventData","_setBrushStyles","willReadFrequently","getTopContext","getSelectionContext","getSelectionElement","active","_fireSelectionEvents","oldObjects","somethingChanged","invalidate","added","setActiveObject","currentActives","_setActiveObject","prevActiveObject","endCurrentTransform","discarded","_finalizeCurrentTransform","_scaling","originalProperties","_realizeGroupTransformOnObject","originalValues","selectionFullyContained","defaultCursor","freeDrawingCursor","notAllowedCursor","stopContextMenu","fireRightClick","fireMiddleClick","enablePointerEvents","TextEditingManager","cb","hiddenTextarea","focus","__disposer","exitTextEditing","exitEditing","onMouseMove","_this$target","updateSelectionOnMouseMove","addEventOptions","passive","getEventPoints","scenePoint","addListener","removeListener","syntheticEventConfig","mouse","in","targetIn","targetOut","canvasIn","canvasOut","drag","Canvas","eventHandler","addOrRemove","_getEventPrefix","functor","_eventjsFunctor","canvasElement","eventTypePrefix","_onResize","_onMouseDown","_onMouseMove","_onMouseOut","_onMouseEnter","_onMouseWheel","_onContextMenu","_onClick","_onDragStart","_onDragEnd","_onDragOver","_onDragEnter","_onDragLeave","_onDrop","_onTouchStart","removeListeners","_onMouseUp","_onTouchEnd","clearTimeout","_willAddMouseDown","_cacheTransformEventData","_handleEvent","shared","nestedTarget","_isClick","_dragSource","_onDragProgress","_renderDragEffects","dropTarget","_dropTarget","didDrop","dataTransfer","dropEffect","dragSource","_draggedoverTarget","eventType","_fireEnterLeaveEvents","_basicEventHandler","clicks","detail","_onDblClick","__onMouseDown","__onMouseUp","getPointerId","evt","identifier","pointerId","_isMainEvent","isPrimary","touches","mainTouchId","shouldPreventScrolling","currentActiveObject","__onMouseMove","_shouldRender","_this$_activeObject","isClick","button","_onMouseUpInDrawingMode","shouldRender","targetWasActive","handleSelection","found","originalControl","originalMouseUpHandler","_setCursorFromEvent","extraData","_onMouseDownInDrawingMode","onMouseDown","_onMouseMoveInDrawingMode","onMouseUp","grouped","handleMultiSelection","groupSelector","_transformObject","_fireOverOutEvents","textEditingManager","fireSyntheticInOutEvents","oldTarget","fireCanvas","draggedoverTarget","targetChanged","outOpt","nextTarget","inOpt","previousTarget","localPointer","_performTransformAction","activeSelection","reverse","_target","isAS","prevActiveObjects","multiSelectAdd","newActiveSelection","point1","point2","collectedObjects","klass","linearDefaultCoords","radialDefaultCoords","ifNaN","valueIfNaN","RE_PERCENT","isPercent","parsePercent","NaN","RE_KEY_VALUE_PAIRS","RE_KEY_VALUE","parseColorStop","opacityMultiplier","keyValuePairs","parseColorStops","opacityAttr","colorStops","colorStopEls","getElementsByTagName","parseType","parseGradientUnits","getValue","parseCoords","valuesToConvert","finalValue","propValue","convertPercentUnitsToValues","parseLinearCoords","parseRadialCoords","Gradient","addColorStop","colorStop","preTransform","sort","_renderPathCommands","needsSwap","minRadius","percentageShift","gradient","createLinearGradient","createRadialGradient","svgOptions","viewBoxWidth","viewBoxHeight","Pattern","isImageSource","isCanvasSource","sourceToString","complete","naturalWidth","naturalHeight","patternSource","patternOffsetX","patternOffsetY","BaseBrush","_saveAndTransform","needsFullRender","_resetShadow","_isOutSideCanvas","Path","_setPath","adjustPosition","setBoundingBox","_calcBoundsFromPath","quadraticCurveTo","pathCmd","sourcePath","_getOffsetTransform","digits","_calcDimensions","subpathStartX","subpathStartY","parsedAttributes","PencilBrush","_points","_hasStraightLine","drawSegment","drawStraightLine","straightLineKey","_prepareForDrawing","_addPoint","limitedToCanvasSize","oldEnd","_finalizeAndAddPath","_reset","convertPointsToSVGPath","createPath","decimatePoints","cDistance","lastPoint","adjustedDistance","newPoints","decimate","isEmptySVGPath","CIRCLE_PROPS","Circle","setRadius","startAngle","endAngle","getRadiusX","getRadiusY","startX","startY","endX","endY","otherParsedAttributes","coordProps","Line","_setWidthHeight","calcLinePoints","origStrokeStyle","_this$stroke","_x1","_x2","_y1","_y2","xMult","yMult","Triangle","widthBy2","heightBy2","ELLIPSE_PROPS","Ellipse","getRx","getRy","polylineDefaultValues","exactBoundingBox","Polyline","initialized","isOpen","_projectStrokeOnPoints","strokeDiff","bboxNoStroke","layoutProperties","_options$width","_options$height","_options$width2","_options$height2","output","diffX","diffY","pointsSplit","parsedPoints","parsePointsAttribute","Polygon","StyledText","isEmptyStyles","lineIndex","line","p3","styleHas","cleanStyle","letterCount","stylePropertyValue","stylesCount","allStyleObjectPropertiesMatch","graphemeCount","styleObject","_textLines","removeStyle","lineNum","charNum","_extendStyles","get2DCursorLocation","_getLineStyle","_setLineStyle","newStyle","_getStyleDeclaration","_setStyleDeclaration","getSelectionStyles","startIndex","endIndex","getStyleAtPosition","getCompleteStyleDeclaration","setSelectionStyles","_forceClearCache","_lineStyle$charIndex","lineStyle","_styleProperties","_deleteStyleDeclaration","_deleteLineStyle","multipleSpacesRegex","dblQuoteRegex","createSVGInlineRect","svgColor","createSVGRect","measuringContext","FabricText","setPathInfo","initDimensions","segmentsInfo","_splitText","newLines","_splitTextIntoLines","lines","graphemeLines","_unwrappedTextLines","_unwrappedLines","_text","graphemeText","_clearCache","calcTextWidth","cursorWidth","calcTextHeight","enlargeSpaces","diffSpace","currentLineWidth","numberOfSpaces","accumulatedSpace","charBound","spaces","isEndOfWrapping","getLineWidth","__charBounds","kernedWidth","missingNewlineOffset","_lineIndex","selectionStart","skipWrapping","_setTextStyles","_renderTextLinesBackground","_renderTextDecoration","_renderTextStroke","_renderTextFill","charStyle","forMeasuring","textBaseline","_getFontDeclaration","maxWidth","_renderTextLine","_renderChars","leftOffset","_getLeftOffset","lineTopOffset","_getTopOffset","heightOfLine","getHeightOfLine","lineLeftOffset","_getLineLeftOffset","drawStart","currentColor","boxWidth","boxStart","lastColor","getValueOfPropertyAt","charBox","renderLeft","_measureChar","_char","previousChar","prevCharStyle","fontDeclaration","couple","stylesAreEqual","fontMultiplier","coupleWidth","previousWidth","getMeasuringContext","measureText","getHeightOfChar","measureLine","lineInfo","_measureLine","_getWidthOfCharSpacing","prevGrapheme","graphemeInfo","llength","lineBounds","grapheme","_getGraphemeBox","positionInPath","totalPathLength","_setGraphemeOnPath","numOfSpaces","centerPosition","skipLeft","previousBox","__lineHeights","maxHeight","_renderTextCommon","lineHeights","isJustify","shortCut","isLtr","currentDirection","actualStyle","nextStyle","timeToRender","drawingLeft","charsToRender","_renderChar","_applyPatternGradientTransformText","handleFiller","fullDecl","shouldFill","fillOffsets","fillText","strokeOffsets","strokeText","setSuperscript","_setScript","setSubscript","schema","loc","lineDiff","__lineWidths","_charStyle$property","topOffset","offsetAligner","lastDecoration","lastFill","lastTickness","currentDecoration","currentFill","currentTickness","currentSize","currentDy","finalTickness","parsedFontFamily","genericFonts","newLine","newText","needsDims","isAddingPath","textAnchor","textDecoration","restOfOptions","textContent","textHeightScaleFactor","scaledDiff","textHeight","offX","_getSVGLeftTopOffsets","textAndBg","_getSVGTextAndBg","textTop","textLeft","_wrapSVGTextAndBg","textSvg","lineTop","textBgRects","textSpans","getSvgTextDecoration","textTopOffset","textLeftOffset","lineOffset","_setSVGTextLineBg","_setSVGTextLineText","_createTextCharSpan","char","styleDecl","numFractionDigit","styleProps","getSvgSpanStyles","fillStyles","dySpan","angleAttr","wBy2","renderPoint","useWhiteSpace","thickness","decoration","DraggableTextDelegate","dragEnterHandler","dragOverHandler","dragLeaveHandler","dragEndHandler","dropHandler","_dispose","isPointerOverSelection","newSelection","getSelectionStartFromPointer","selectionEnd","__mouseDownInPlace","isActive","__dragStartFired","setCursorByClick","initDelayedCursor","__isDraggingOver","getDragStartSelection","__dragStartSelection","setDragImage","_e$dataTransfer","flipFactor","boundaries","_getCursorBoundaries","diff","bgc","dragImage","border","__dragImageDisposer","appendChild","setData","stringify","effectAllowed","abortCursorAnimation","editable","defaultPrevented","dragStartSelection","targetCanDrop","ev","_e$dataTransfer2","insert","getData","trailing","selectionStartOffset","removeChars","trimEnd","insertChars","enterEditing","_updateTextarea","_e$dataTransfer3","reNonWord","ITextBehavior","initBehavior","_tick","_onTickComplete","_animateCursor","toValue","_currentCursorOpacity","renderCursorOrSelection","_currentTickState","cursorDuration","_this$_currentTickCom","_currentTickCompleteState","restart","cursorDelay","shouldClear","cursorAnimation","restartCursorIfNeeded","selectAll","_fireSelectionChanged","cmdAll","getSelectedText","findWordBoundaryLeft","startFrom","_reSpace","findWordBoundaryRight","findLineBoundaryLeft","findLineBoundaryRight","searchWordBoundary","selectWord","newSelectionStart","newSelectionEnd","selectLine","enterEditingImpl","initHiddenTextarea","_saveEditingProps","_setEditingProps","_textBeforeEdit","activeElement","currentStart","currentEnd","__selectionStartOnMouseDown","editingBorderColor","fromStringToGraphemeSelection","smallerTextStart","graphemeStart","smallerTextEnd","fromGraphemeToStringSelection","cursorOffsetCache","inCompositionMode","updateTextareaPosition","updateFromTextArea","textarea","_calcTextareaPosition","desiredPosition","compositionStart","cursorLocation","charHeight","upperCanvas","upperCanvasWidth","upperCanvasHeight","clientWidth","clientHeight","_savedProps","_restoreEditingProps","exitEditingImpl","isTextChanged","_removeExtraneousStyles","removeStyleFromTo","lineStart","charStart","lineEnd","charEnd","styleObj","shiftLineStyles","numericChar","clonedStyles","numericLine","insertNewlineStyleObject","qty","copiedStyle","newLineStyles","originalLineLength","isEndOfLine","someStyleIsCarryingOver","currentCharStyle","numIndex","styleCarriedOver","insertCharStyleObject","quantity","currentLineStyles","currentLineStylesCloned","numericIndex","insertNewStyleBlock","insertedText","cursorLoc","addedLines","linesLength","setSelectionStartEndWithShift","_selectionDirection","ITextKeyBehavior","autocapitalize","autocorrect","autocomplete","spellcheck","wrap","hiddenTextareaContainer","keydown","keyup","input","copy","cut","paste","compositionstart","compositionupdate","compositionend","onKeyDown","keyMap","keysMapRtl","keysMap","keyCode","ctrlKeysMapDown","ctrlKey","metaKey","stopImmediatePropagation","onKeyUp","_copyDone","ctrlKeysMapUp","onInput","fromPaste","updateAndFire","nextText","charCount","nextCharCount","_selectionStart","_selectionEnd","removedText","removeFrom","removeTo","charDiff","textareaSelection","backDelete","copiedText","disableStyleCopyPaste","copiedTextStyle","onCompositionStart","onCompositionEnd","onCompositionUpdate","compositionEnd","_getWidthBeforeCursor","bound","widthBeforeCursor","getDownCursorOffset","isRight","selectionProp","_getSelectionForOffset","indexOnOtherLine","_getIndexOnLine","getUpCursorOffset","textBeforeCursor","charWidth","foundMatch","widthOfCharsOnLine","indexOnLine","leftEdge","rightEdge","offsetFromLeftEdge","moveCursorDown","_moveCursorUpOrDown","moveCursorUp","moveCursorWithShift","moveCursorWithoutShift","moveCursorLeft","_moveCursorLeftOrRight","_move","newValue","_moveLeft","_moveRight","moveCursorLeftWithoutShift","change","moveCursorLeftWithShift","moveCursorRight","moveCursorRightWithShift","moveCursorRightWithoutShift","notALeftClick","ITextClickBehavior","_mouseDownHandler","doubleClickHandler","tripleClickHandler","draggableTextDelegate","didDrag","mouseOffset","charLength","widthAfter","MOVE_CURSOR_UP","MOVE_CURSOR_DOWN","MOVE_CURSOR_LEFT","MOVE_CURSOR_RIGHT","EXIT_EDITING","applyCanvasTransform","iTextDefaultValues","cursorColor","caching","IText","setSelectionStart","_updateAndFire","setSelectionEnd","findAncestorsWithClipPath","hasAncestorsWithClipping","drawingCanvas","drawingCtx","renderSelection","renderCursor","clippingCanvas","clippingCtx","clipPathAncestors","skipCaching","_getCursorBoundariesOffsets","__getCursorBoundariesOffsets","renderCursorAt","_renderCursor","getCursorRenderingData","_renderSelection","dragSelection","startLine","endLine","startChar","endChar","realLineHeight","boxEnd","drawHeight","extraTop","drawWidth","compositionColor","getCurrentCharFontSize","cp","_getCurrentCharIndex","getCurrentCharColor","cursorPosition","Textbox","dynamicMinWidth","_styleMap","_generateStyleMap","textInfo","realLineCount","realLineCharCount","splitByGrapheme","isWrapping","nextOffset","nextLineIndex","shouldLimit","mapNextLine","p2Number","_wrapText","desiredWidth","getGraphemeDataForRender","wrapped","wordsData","_wrapLine","infix","largestWordWidth","wordsOrGraphemes","wordSplit","word","graphemeArray","_measureWord","charOffset","_wordJoiners","reservedSpace","additionalSpace","infixWidth","lineJustStarted","wordWidth","getMinWidth","minWidth","linesToKeep","propNumber","ClipPathLayout","clipPathCenter","FixedLayout","ActiveSelectionLayoutManager","parents","Set","selectedObjects","ActiveSelection","multiSelectionStacking","findIndex","groups","childrenOverride","Canvas2dFilterBackend","applyFilters","filters","sourceElement","sourceWidth","sourceHeight","desynchronized","pipelineState","imageData","originalEl","originalImageData","filterBackend","applyTo","imageDataPostFilter","putImageData","WebGLFilterBackend","tileSize","Float32Array","setupGLContext","captureGPUInfo","createWebGLCanvas","premultipliedAlpha","depth","stencil","antialias","clearColor","cachedTexture","getCachedTexture","destinationWidth","destinationHeight","sourceTexture","createTexture","targetTexture","originalTexture","passes","webgl","aPosition","programCache","pass","tempFbo","createFramebuffer","bindFramebuffer","FRAMEBUFFER","dWidth","dHeight","resizeCanvasIfNeeded","copyGLTo2D","bindTexture","TEXTURE_2D","deleteTexture","deleteFramebuffer","clearWebGLCaches","textureCache","textureImageSource","NEAREST","RGBA","UNSIGNED_BYTE","CLAMP_TO_EDGE","TEXTURE_MAG_FILTER","TEXTURE_MIN_FILTER","TEXTURE_WRAP_S","TEXTURE_WRAP_T","texture","texParameteri","texImage2D","uniqueId","evictCachesForKey","glCanvas","sourceY","copyGLTo2DPutImageData","numBytes","u8","Uint8Array","imageBuffer","u8Clamped","Uint8ClampedArray","readPixels","imgData","ImageData","gpuInfo","renderer","vendor","ext","UNMASKED_RENDERER_WEBGL","UNMASKED_VENDOR_WEBGL","initFilterBackend","enableGLFiltering","getFilterBackend","IMAGE_PROPS","FabricImage","setElement","_element","removeTexture","_originalElement","resizeFilter","applyResizeFilters","backend","elementKey","getCrossOrigin","getOriginalSize","_stroke","filterObj","getSrc","hasCrop","imageMarkup","strokeSvg","imageRendering","imageSmoothing","getSvgSrc","origFill","filtered","srcFromAttribute","setSrc","minimumScale","minimumScaleTrigger","elementToFilter","_filteredEl","_filterScalingX","_filterScalingY","_lastScaleX","_lastScaleY","isNeutralState","imgElement","_needsResize","elementToDraw","elWidth","elHeight","sX","sY","sW","sH","maxDestW","maxDestH","_resetWidthHeight","pAR","preserveAspectRatio","pWidth","pHeight","rWidth","rHeight","f","rf","hydratedProps","fromURL","imageOptions","applyViewboxTransform","viewBoxAttr","widthAttr","heightAttr","missingViewBox","missingDimAttr","translateMatrix","widthDiff","heightDiff","parsedDim","pasedViewBox","createElementNS","firstChild","getTagName","node","tagName","svgInvalidAncestorsRegEx","getMultipleNodes","nodeNames","nodeList","nodeArray","getElementsByTagNameNS","gradientsAttrs","xlinkAttr","recursivelyParseGradientsXlink","_gradient$getAttribut","xLink","referencedGradient","children","referenceClone","cloneNode","tagArray","findTag","ElementsParser","clipPaths","regexUrl","gradientDefs","elList","getGradientDefs","allRules","styleContents","ruleObj","propertyValuePairs","pair","_rule","getCSSRules","createObject","resolveGradient","resolveClipPath","extractPropertyDefinition","storage","gradientDef","usingElement","exactOwner","clipPathElements","objTransformInv","clipPathTag","clipPathOwner","clipPathElement","enlivedClippath","clipRule","gTransform","isValidSvgTag","async","parseSVGDocument","createEmptyResponse","allElements","nodelist","skipAttributes","useElement","useAttributes","useAttrMap","xlink","href","referencedElement","clonedOriginal","originalAttributes","originalAttrMap","currentTrans","el3","setAttributeNS","childNodes","styleRecord","mergedStyles","entry","parseUseDirectives","descendants","hasInvalidAncestor","localClipPaths","elementParser","loadSVGFromString","parseFromString","ACTION_NAME","createPolyPositionHandler","pointIndex","polyObject","polyActionHandler","poly","mouseLocalPosition","factoryPolyActionHandler","anchorPoint","anchorPointInParentPlane","createPolyActionHandler","calcPathPointPosition","pathObject","commandIndex","pathPositionHandler","pathActionHandler","movePathPoint","anchorCommand","PathPointControl","controlFill","controlStroke","PathControlPointControl","connectToCommandIndex","connectToPointIndex","connectionDashArray","commandType","createControl","commandIndexPos","pointIndexPos","isControlPoint","controlPointStyle","pointStyle","previousCommandType","indexFromPrevCommand","isWebGLPipelineState","highPsourceCode","identityFragmentShader","BaseFilter","getFragmentSource","getVertexSource","createProgram","vertexSource","vertexShader","VERTEX_SHADER","program","getShaderInfoLog","attachShader","linkProgram","getProgramParameter","LINK_STATUS","getProgramInfoLog","uniformLocations","getUniformLocations","uStepW","getUniformLocation","uStepH","attributeLocations","getAttributeLocations","getAttribLocation","locations","sendAttributeData","aPositionData","attributeLocation","buffer","createBuffer","bindBuffer","ARRAY_BUFFER","enableVertexAttribArray","vertexAttribPointer","FLOAT","bufferData","STATIC_DRAW","_setupFrameBuffer","framebufferTexture2D","COLOR_ATTACHMENT0","finish","_swapTextures","temp","applyToWebGL","applyTo2d","getCacheKey","retrieveShader","shader","useProgram","uniform1f","sendUniformData","viewport","drawArrays","TRIANGLE_STRIP","bindAdditionalTexture","textureUnit","activeTexture","TEXTURE0","unbindAdditionalTexture","_gl","_uniformLocations","createHelpLayer","helpLayer","defaultKeys","filterOptions","blendColorFragmentSource","screen","difference","lighten","darken","exclusion","tint","BlendColor","mode","tg","alpha1","oR","oG","oB","uniform4fv","uColor","mask","BlendImage","image","TEXTURE1","calculateMatrix","resources","blendImage","canvas1","blendData","uniform1i","uImage","uniformMatrix3fv","uTransformMatrix","enlivedImage","Blur","aspectRatio","horizontal","blurValue","getBlurValue","samples","bytesInRow","totalA","minIRow","maxIRow","percent","weight","sampledPixel","localAlpha","delta","chooseRightDelta","uniform2fv","uDelta","blurScale","Brightness","brightness","uBrightness","colorMatrixDefaultValues","colorsOnly","ColorMatrix","constants","uniformMatrix4fv","uColorMatrix","uConstants","createColorMatrixFilter","_Class","newClass","Brownie","Vintage","Kodachrome","Technicolor","Polaroid","Sepia","BlackWhite","Composed","subFilters","enlivedFilters","Contrast","contrast","contrastF","uContrast","Convolute_3_1","Convolute_3_0","Convolute_5_1","Convolute_5_0","Convolute_7_1","Convolute_7_0","Convolute_9_1","Convolute_9_0","Convolute","opaque","weights","side","halfSide","sw","sh","createImageData","dst","alphaFac","dstOff","scx","scy","srcOff","wt","uniform1fv","uMatrix","GAMMA","Gamma","gamma","rInv","gInv","bInv","rgbValues","rgb","uniform3fv","uGamma","lightness","luminosity","Grayscale","uMode","hueRotationDefaultValues","rotation","HueRotation","cosine","sine","aThird","aThirdSqtSin","OneMinusCos","Invert","invert","uInvert","uAlpha","Noise","noise","rand","uNoise","uSeed","Pixelate","blocksize","_i","_j","uBlocksize","RemoveColor","lowC","highC","uLow","uHigh","useAlpha","Resize","uTaps","taps","getFilterWindow","tempScale","lanczosLobes","filterWindow","generateShader","getTaps","lobeFunction","lanczosCreate","applyToForWebgl","dW","dH","lobes","xx","rcpScaleX","rcpScaleY","oW","oH","newData","resizeType","sliceByTwo","hermiteFastResize","bilinearFiltering","lanczosResize","mult","doneW","doneH","stepW","stepH","dX","dY","tmpCanvas","srcData","destImg","destData","lanczos","ratioX","ratioY","rcpRatioX","rcpRatioY","range2X","range2Y","cacheLanc","icenter","process","u","fX","fY","xDiff","yDiff","chnl","origPix","w4","pixels","destImage","destPixels","ratioW","ratioH","ratioWHalf","ratioHHalf","img2","data2","weightsAlpha","gxR","gxG","gxB","gxA","yy","w0","Saturation","adjust","saturation","uSaturation","Vibrance","vibrance","amt","uVibrance","drawDot","addPoint","dot","originalRenderOnAddRemove","circles","circle","pointerPoint","getPatternSrc","patternCanvas","patternCtx","dotWidth","getPattern","pattern","topLeft","sprayChunks","sprayChunk","addSprayChunk","renderChunck","rects","chunck","rect","optimizeOverlapping","uniqueRects","uniqueRectsArray","getUniqueRects","sprayChunck","density","dotWidthVariance","randomOpacity","isPutImageFaster","testContext","ArrayBuffer","testPipelineState","performance","now","drawImageTime","fetch","response","ok","svgText"],"mappings":"+pBAEA,MAAMA,EAAkBC,WAAAA,GACtBC,mCAc4B,GAE5BA,aAGM,IAENA,EAAAC,KAAA,mBAKoB,oBAAXC,OAAyBA,OAAOC,iBAAmB,GAE5DH,4BAKqB,SAErBA,2BAKoB,MAEpBA,2BAKoB,KAEpBA,gCAOwB,GAExBA,4BAOoB,GAEpBA,qBASc,MAEdA,8BAOsB,GAEtBA,8BAQsB,GAEtBA,EAAAC,KAAA,YAIwE,IAExED,6BAKsB,EAAC,QA8CZI,EAAS,IA3Cf,cAA4BN,EACjCC,WAAAA,CAAYK,GACVC,QACAJ,KAAKK,UAAUF,EACjB,CAEAE,SAAAA,GAAuC,IAA7BF,EAAsBG,UAAAC,OAAA,QAAAC,IAAAF,UAAA,GAAAA,UAAA,GAAG,CAAA,EACjCG,OAAOC,OAAOV,KAAMG,EACtB,CAKAQ,QAAAA,GAEE,IADAC,EAAiEN,UAAAC,OAAA,QAAAC,IAAAF,UAAA,GAAAA,UAAA,GAAG,CAAA,EAEpEN,KAAKa,UAAY,IACZb,KAAKa,aACLD,EAEP,CAEAE,WAAAA,IAAiCR,UAAAC,OAAA,QAAAC,IAAAF,UAAA,GAAAA,UAAA,GAAG,IACtBS,QAASC,WACZhB,KAAKa,UAAUG,IAE1B,CAEAC,UAAAA,GACEjB,KAAKa,UAAY,CAAA,CACnB,CAEAK,eAAAA,CAA6CC,GAC3C,MAAMC,EAAW,IAAIvB,EACfM,GACJgB,aAAI,EAAJA,EAAME,OAAO,CAACC,EAAKC,KACjBD,EAAIC,GAAOH,EAASG,GACbD,GACN,CAAA,KAAYF,EACjBpB,KAAKK,UAAUF,EACjB,GC1JWqB,EAAM,SACjBC,GAAkC,IAAA,IAAAC,EAAApB,UAAAC,OAC/BoB,MAAcC,MAAAF,EAAA,EAAAA,OAAAG,EAAA,EAAAA,EAAAH,EAAAG,IAAdF,EAAcE,EAAA,GAAAvB,UAAAuB,GAAA,OAGjBC,QAAQL,GAAU,YAAaE,EAAe,EAEzC,MAAMI,UAAoBC,MAC/BlC,WAAAA,CAAYmC,EAAkBC,GAC5B9B,MAAM,WAAW6B,IAAWC,EAC9B,EAGK,MAAMC,UAA2BJ,EACtCjC,WAAAA,CAAYsC,GACVhC,MAAM,GAAGgC,2CACX,ECdK,MAAeC,GCKf,MAAMC,UAAmBD,EAStBE,aAAAA,CACNC,EACAC,GAEA,MAAMC,EAAiB,aAAaD,0BAC9BE,EAAiBH,EAAGI,aAAaJ,EAAGK,iBAC1C,QAAKF,IAGLH,EAAGM,aAAaH,EAAgBD,GAChCF,EAAGO,cAAcJ,KACRH,EAAGQ,mBAAmBL,EAAgBH,EAAGS,gBACpD,CAKAC,UAAAA,CAAWC,GACT,MAAMX,EAAKW,EAAOC,WAAW,SACzBZ,IACFxC,KAAKqD,eAAiBb,EAAGc,aAAad,EAAGe,kBACzCvD,KAAKwD,YAAe,CAAC,QAAS,UAAW,QAAkBC,KACxDhB,GAAczC,KAAKuC,cAAcC,EAAIC,IAExCD,EAAGkB,aAAa,sBAAuBC,cACvCnC,EAAI,MAAO,2BAA2BxB,KAAKqD,kBAE/C,CAEAO,WAAAA,CAAYC,GACV,QAAS7D,KAAKqD,gBAAkBrD,KAAKqD,gBAAkBQ,CACzD,EC3CF,MAAMC,EAAgC,CAAA,ECStC,IAAIC,EAeG,MAOMC,EAASA,IAAMD,IAAQA,ED5B3B,CACLE,kBACAhE,cACAiE,iBACE,iBAAkBjE,QAClB,iBAAkBgE,UACjBhE,QAAUA,OAAOkE,WAAalE,OAAOkE,UAAUC,eAAiB,EACnE9B,WAAY,IAAIA,EAChB+B,OAAAA,GACE,EAEFP,kBCmBSQ,EAAoBA,IAAgBN,IAASC,SAE7CM,EAAkBA,IAC7BP,IAAS/D,OAKEuE,EAAsBA,KAAA,IAAAC,EAAA,OACjCC,KAAKC,IAA2B,QAAxBF,EAACtE,EAAOD,wBAAgB,IAAAuE,EAAAA,EAAIF,IAAkBrE,iBAAkB,UC2C7D0E,EAAQ,IAtFd,MAAY9E,WAAAA,GACjBC,EAAAC,KAAA,kBASI,IAiEJD,EAAAC,KAAA,qBAQkD,GAAE,CApEpD6E,YAAAA,CAAYC,GAQT,IARU9D,WACXA,EAAU+D,UACVA,EAASC,WACTA,GAKDF,EACC9D,EAAaA,EAAWiE,cACnBjF,KAAKkF,gBAAgBlE,KACxBhB,KAAKkF,gBAAgBlE,GAAc,CAAA,GAErC,MAAMmE,EAAYnF,KAAKkF,gBAAgBlE,GACjCoE,EAAW,GAAGL,EAAUE,kBAC5BD,EAAa,IACbC,gBAIF,OAHKE,EAAUC,KACbD,EAAUC,GAAY,CAAA,GAEjBD,EAAUC,EACnB,CAaAC,cAAAA,CAAerE,IACbA,GAAcA,GAAc,IAAIiE,eAGrBjF,KAAKkF,gBAAgBlE,WACvBhB,KAAKkF,gBAAgBlE,GAF5BhB,KAAKkF,gBAAkB,CAAA,CAI3B,CAQAI,eAAAA,CAAgBC,GACd,MAAMC,mBAAEA,GAAuBrF,EACzBsF,EAAaf,KAAKgB,KAAKF,EAAqBD,GAGlD,MAAO,CACLb,KAAKiB,MAAMF,GACXf,KAAKiB,MAAMH,EAAqBC,GAEpC,GCxEK,MAAMG,gBAEN,SAASC,IAAQ,CAEjB,MAAMC,EAASpB,KAAKqB,GAAK,EACnBC,EAAYtB,KAAKqB,GAAK,EACtBE,EAAsB,EAAVvB,KAAKqB,GACjBG,EAAUxB,KAAKqB,GAAK,IAEpBI,EAAU1F,OAAO2F,OAAO,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,IACxCC,EAAwB,GAIxBC,EAAQ,YAERC,EAAS,SACTC,EAAO,OACPC,EAAM,MACNC,EAAS,SACTC,EAAQ,QACRC,EAAO,OAEPC,EAAY,QAEZC,EAAS,SACTC,EAAU,UACVC,EAAW,WACXC,EAAS,SACTC,EAAU,UACVC,EAAW,WACXC,EAAc,aACdC,EAAc,aACdC,EAAU,UACVC,EAAQ,QACRC,EAAU,SACVC,EAAU,SACVC,EAAS,QACTC,EAAS,QACTC,EAAO,OACPC,EAAS,SACTC,EAAW,WC/BXC,EAAO,OACPC,EAAM,YA8CNC,EAAgB,IA5CtB,MAILnI,WAAAA,GACEE,KAAK+H,GAAQ,IAAIG,IACjBlI,KAAKgI,GAAO,IAAIE,GAClB,CAEAC,GAAAA,CAAIC,GACF,OAAOpI,KAAK+H,GAAMI,IAAIC,EACxB,CAEAC,QAAAA,CAAYD,GACV,MAAMtI,EAAcE,KAAK+H,GAAMO,IAAIF,GACnC,IAAKtI,EACH,MAAM,IAAIiC,EAAY,2BAA2BqG,KAEnD,OAAOtI,CACT,CAEAyI,QAAAA,CAASC,EAAuBJ,GAC1BA,EACFpI,KAAK+H,GAAMU,IAAIL,EAAWI,IAE1BxI,KAAK+H,GAAMU,IAAID,EAAiBE,KAAMF,GAGtCxI,KAAK+H,GAAMU,IAAID,EAAiBE,KAAKzD,cAAeuD,GAExD,CAEAG,WAAAA,CAAYC,GACV,OAAO5I,KAAKgI,GAAKM,IAAIM,EACvB,CAEAC,WAAAA,CAAYL,EAAuBI,GACjC5I,KAAKgI,GAAKS,IACRG,QAAAA,EAAcJ,EAAiBE,KAAKzD,cACpCuD,EAEJ,SCAWM,EAAoB,IAnDjC,cAAgClH,MAK9BmH,MAAAA,CAAO3G,GACL,MAAM4G,EAAQhJ,KAAKiJ,QAAQ7G,GAC3B4G,GAAQ,GAAMhJ,KAAKkJ,OAAOF,EAAO,EACnC,CAKAG,SAAAA,GACE,MAAMC,EAAapJ,KAAKkJ,OAAO,GAE/B,OADAE,EAAWrI,QAASsI,GAAcA,EAAUC,SACrCF,CACT,CAMAG,cAAAA,CAAepG,GACb,IAAKA,EACH,MAAO,GAET,MAAMiG,EAAapJ,KAAKwJ,OACrBH,IAAS,IAAAI,EAAA,OACRJ,EAAUK,SAAWvG,GACQ,iBAArBkG,EAAUK,SACC,QAAjBD,EAACJ,EAAUK,cAAM,IAAAD,OAAA,EAAjBA,EAAoCtG,UAAWA,IAGrD,OADAiG,EAAWrI,QAASsI,GAAcA,EAAUC,SACrCF,CACT,CAMAO,cAAAA,CAAeD,GACb,IAAKA,EACH,MAAO,GAET,MAAMN,EAAapJ,KAAKwJ,OAAQH,GAAcA,EAAUK,SAAWA,GAEnE,OADAN,EAAWrI,QAASsI,GAAcA,EAAUC,SACrCF,CACT,GC7CK,MAAMQ,EAAsB9J,WAAAA,GAAAC,EAAAC,KAAA,mBAE/B,GAAE,CAeJ6J,EAAAA,CACEC,EACAC,GAKA,GAHK/J,KAAKgK,mBACRhK,KAAKgK,iBAAmB,CAAA,GAEN,iBAATF,EAKT,OAHArJ,OAAOwJ,QAAQH,GAAM/I,QAAQ+D,IAA0B,IAAxBoF,EAAWH,GAAQjF,EAChD9E,KAAK6J,GAAGK,EAAgBH,KAEnB,IAAM/J,KAAKmK,IAAIL,GACjB,GAAIC,EAAS,CAClB,MAAMG,EAAYJ,EAKlB,OAJK9J,KAAKgK,iBAAiBE,KACzBlK,KAAKgK,iBAAiBE,GAAa,IAErClK,KAAKgK,iBAAiBE,GAAWE,KAAKL,GAC/B,IAAM/J,KAAKmK,IAAID,EAAWH,EACnC,CAEE,MAAO,KAAM,CAEjB,CAeAM,IAAAA,CACEP,EACAC,GAEA,GAAoB,iBAATD,EAAmB,CAE5B,MAAMQ,EAA4B,GAIlC,OAHA7J,OAAOwJ,QAAQH,GAAM/I,QAAQwJ,IAA0B,IAAxBL,EAAWH,GAAQQ,EAChDD,EAAUF,KAAKpK,KAAKqK,KAAKH,EAAgBH,MAEpC,IAAMO,EAAUvJ,QAASyJ,GAAMA,IACxC,CAAO,GAAIT,EAAS,CAClB,MAAMU,EAAWzK,KAAK6J,GACpBC,EACA,WAA2D,IAAA,IAAApI,EAAApB,UAAAC,OAANmK,EAAI,IAAA9I,MAAAF,GAAAG,EAAA,EAAAA,EAAAH,EAAAG,IAAJ6I,EAAI7I,GAAAvB,UAAAuB,GACvDkI,EAAQY,KAAK3K,QAAS0K,GACtBD,GACF,GAEF,OAAOA,CACT,CAEE,MAAO,KAAM,CAEjB,CAOQG,oBAAAA,CACNV,EACAH,GAEA,GAAK/J,KAAKgK,iBAAiBE,GAI3B,GAAIH,EAAS,CACX,MAAMc,EAAgB7K,KAAKgK,iBAAiBE,GACtClB,EAAQ6B,EAAc5B,QAAQc,GACpCf,GAAQ,GAAM6B,EAAc3B,OAAOF,EAAO,EAC5C,MACEhJ,KAAKgK,iBAAiBE,GAAa,EAEvC,CAyBAC,GAAAA,CACEL,EACAC,GAEA,GAAK/J,KAAKgK,iBAKV,QAAoB,IAATF,EACT,IAAK,MAAMI,KAAalK,KAAKgK,iBAC3BhK,KAAK4K,qBAAqBV,OAIL,iBAATJ,EACdrJ,OAAOwJ,QAAQH,GAAM/I,QAAQ+J,IAA0B,IAAxBZ,EAAWH,GAAQe,EAChD9K,KAAK4K,qBAAqBV,EAAgBH,KAG5C/J,KAAK4K,qBAAqBd,EAAMC,EAEpC,CAOAgB,IAAAA,CAAgCb,EAAchI,GAAwB,IAAA8I,EACpE,IAAKhL,KAAKgK,iBACR,OAGF,MAAMiB,UAAiBD,EAAGhL,KAAKgK,iBAAiBE,UAAU,IAAAc,OAAA,EAAhCA,EAAkCE,SAC5D,GAAID,EACF,IAAK,IAAIE,EAAI,EAAGA,EAAIF,EAAkB1K,OAAQ4K,IAC5CF,EAAkBE,GAAGR,KAAK3K,KAAMkC,GAAW,CAAA,EAGjD,EC1KK,MAAMkJ,GAAkBA,CAAIC,EAAYC,KAC7C,MAAMC,EAAMF,EAAMpC,QAAQqC,GAI1B,OAHY,IAARC,GACFF,EAAMnC,OAAOqC,EAAK,GAEbF,GCFIG,GAAOC,IAClB,GAAc,IAAVA,EACF,OAAO,EAGT,OADmB/G,KAAKgH,IAAID,GAAS3F,GAEnC,KAAK,EACL,KAAK,EACH,OAAO,EACT,KAAK,EACH,OAAO,EAEX,OAAOpB,KAAK8G,IAAIC,ICZLE,GAAOF,IAClB,GAAc,IAAVA,EACF,OAAO,EAET,MAAMG,EAAaH,EAAQ3F,EACrBwF,EAAQ5G,KAAKmH,KAAKJ,GACxB,OAAQG,GACN,KAAK,EACH,OAAON,EACT,KAAK,EACH,OAAO,EACT,KAAK,EACH,OAAQA,EAEZ,OAAO5G,KAAKiH,IAAIF,ICZX,MAAMK,GAQXhM,WAAAA,GAA0C,IAA9BgK,EAAiBxJ,UAAAC,OAAA,QAAAC,IAAAF,UAAA,GAAAA,UAAA,GAAG,EAAGyL,EAACzL,UAAAC,OAAA,QAAAC,IAAAF,UAAA,GAAAA,UAAA,GAAG,EACjB,iBAATwJ,GACT9J,KAAKgM,EAAIlC,EAAKkC,EACdhM,KAAK+L,EAAIjC,EAAKiC,IAEd/L,KAAKgM,EAAIlC,EACT9J,KAAK+L,EAAIA,EAEb,CAOAE,GAAAA,CAAIC,GACF,OAAO,IAAIJ,GAAM9L,KAAKgM,EAAIE,EAAKF,EAAGhM,KAAK+L,EAAIG,EAAKH,EAClD,CAQAI,SAAAA,CAAUD,GAGR,OAFAlM,KAAKgM,GAAKE,EAAKF,EACfhM,KAAK+L,GAAKG,EAAKH,EACR/L,IACT,CAOAoM,SAAAA,CAAUC,GACR,OAAO,IAAIP,GAAM9L,KAAKgM,EAAIK,EAAQrM,KAAK+L,EAAIM,EAC7C,CAQAC,eAAAA,CAAgBD,GAGd,OAFArM,KAAKgM,GAAKK,EACVrM,KAAK+L,GAAKM,EACHrM,IACT,CAOAuM,QAAAA,CAASL,GACP,OAAO,IAAIJ,GAAM9L,KAAKgM,EAAIE,EAAKF,EAAGhM,KAAK+L,EAAIG,EAAKH,EAClD,CAQAS,cAAAA,CAAeN,GAGb,OAFAlM,KAAKgM,GAAKE,EAAKF,EACfhM,KAAK+L,GAAKG,EAAKH,EACR/L,IACT,CAOAyM,cAAAA,CAAeJ,GACb,OAAO,IAAIP,GAAM9L,KAAKgM,EAAIK,EAAQrM,KAAK+L,EAAIM,EAC7C,CAQAK,oBAAAA,CAAqBL,GAGnB,OAFArM,KAAKgM,GAAKK,EACVrM,KAAK+L,GAAKM,EACHrM,IACT,CAOA2M,QAAAA,CAAST,GACP,OAAO,IAAIJ,GAAM9L,KAAKgM,EAAIE,EAAKF,EAAGhM,KAAK+L,EAAIG,EAAKH,EAClD,CAOAa,cAAAA,CAAeP,GACb,OAAO,IAAIP,GAAM9L,KAAKgM,EAAIK,EAAQrM,KAAK+L,EAAIM,EAC7C,CAQAQ,oBAAAA,CAAqBR,GAGnB,OAFArM,KAAKgM,GAAKK,EACVrM,KAAK+L,GAAKM,EACHrM,IACT,CAOA8M,MAAAA,CAAOZ,GACL,OAAO,IAAIJ,GAAM9L,KAAKgM,EAAIE,EAAKF,EAAGhM,KAAK+L,EAAIG,EAAKH,EAClD,CAOAgB,YAAAA,CAAaV,GACX,OAAO,IAAIP,GAAM9L,KAAKgM,EAAIK,EAAQrM,KAAK+L,EAAIM,EAC7C,CAQAW,kBAAAA,CAAmBX,GAGjB,OAFArM,KAAKgM,GAAKK,EACVrM,KAAK+L,GAAKM,EACHrM,IACT,CAOAiN,EAAAA,CAAGf,GACD,OAAOlM,KAAKgM,IAAME,EAAKF,GAAKhM,KAAK+L,IAAMG,EAAKH,CAC9C,CAOAmB,EAAAA,CAAGhB,GACD,OAAOlM,KAAKgM,EAAIE,EAAKF,GAAKhM,KAAK+L,EAAIG,EAAKH,CAC1C,CAOAoB,GAAAA,CAAIjB,GACF,OAAOlM,KAAKgM,GAAKE,EAAKF,GAAKhM,KAAK+L,GAAKG,EAAKH,CAC5C,CAQAqB,EAAAA,CAAGlB,GACD,OAAOlM,KAAKgM,EAAIE,EAAKF,GAAKhM,KAAK+L,EAAIG,EAAKH,CAC1C,CAOAsB,GAAAA,CAAInB,GACF,OAAOlM,KAAKgM,GAAKE,EAAKF,GAAKhM,KAAK+L,GAAKG,EAAKH,CAC5C,CAQAuB,IAAAA,CAAKpB,GAA0B,IAAhBqB,EAACjN,UAAAC,OAAA,QAAAC,IAAAF,UAAA,GAAAA,UAAA,GAAG,GAEjB,OADAiN,EAAI7I,KAAKC,IAAID,KAAK8I,IAAI,EAAGD,GAAI,GACtB,IAAIzB,GACT9L,KAAKgM,GAAKE,EAAKF,EAAIhM,KAAKgM,GAAKuB,EAC7BvN,KAAK+L,GAAKG,EAAKH,EAAI/L,KAAK+L,GAAKwB,EAEjC,CAOAE,YAAAA,CAAavB,GACX,MAAMwB,EAAK1N,KAAKgM,EAAIE,EAAKF,EACvB2B,EAAK3N,KAAK+L,EAAIG,EAAKH,EACrB,OAAOrH,KAAKgB,KAAKgI,EAAKA,EAAKC,EAAKA,EAClC,CAOAC,YAAAA,CAAa1B,GACX,OAAOlM,KAAKsN,KAAKpB,EACnB,CAOAsB,GAAAA,CAAItB,GACF,OAAO,IAAIJ,GAAMpH,KAAK8I,IAAIxN,KAAKgM,EAAGE,EAAKF,GAAItH,KAAK8I,IAAIxN,KAAK+L,EAAGG,EAAKH,GACnE,CAOApH,GAAAA,CAAIuH,GACF,OAAO,IAAIJ,GAAMpH,KAAKC,IAAI3E,KAAKgM,EAAGE,EAAKF,GAAItH,KAAKC,IAAI3E,KAAK+L,EAAGG,EAAKH,GACnE,CAMA8B,QAAAA,GACE,MAAO,GAAG7N,KAAKgM,KAAKhM,KAAK+L,GAC3B,CAOA+B,KAAAA,CAAM9B,EAAWD,GAGf,OAFA/L,KAAKgM,EAAIA,EACThM,KAAK+L,EAAIA,EACF/L,IACT,CAMA+N,IAAAA,CAAK/B,GAEH,OADAhM,KAAKgM,EAAIA,EACFhM,IACT,CAMAgO,IAAAA,CAAKjC,GAEH,OADA/L,KAAK+L,EAAIA,EACF/L,IACT,CAMAiO,YAAAA,CAAa/B,GAGX,OAFAlM,KAAKgM,EAAIE,EAAKF,EACdhM,KAAK+L,EAAIG,EAAKH,EACP/L,IACT,CAMAkO,IAAAA,CAAKhC,GACH,MAAMF,EAAIhM,KAAKgM,EACbD,EAAI/L,KAAK+L,EACX/L,KAAKgM,EAAIE,EAAKF,EACdhM,KAAK+L,EAAIG,EAAKH,EACdG,EAAKF,EAAIA,EACTE,EAAKH,EAAIA,CACX,CAMAoC,KAAAA,GACE,OAAO,IAAIrC,GAAM9L,KAAKgM,EAAGhM,KAAK+L,EAChC,CAQAqC,MAAAA,CAAOC,GAA4C,IAA1BC,EAAUhO,UAAAC,OAAA,QAAAC,IAAAF,UAAA,GAAAA,UAAA,GAAGiO,GAGpC,MAAMC,EAAQ7C,GAAI0C,GAChBI,EAAUjD,GAAI6C,GACVK,EAAI1O,KAAKuM,SAAS+B,GAKxB,OAJgB,IAAIxC,GAClB4C,EAAE1C,EAAIyC,EAAUC,EAAE3C,EAAIyC,EACtBE,EAAE1C,EAAIwC,EAAQE,EAAE3C,EAAI0C,GAEPxC,IAAIqC,EACrB,CAQAK,SAAAA,CAAUpB,GAAwC,IAA7BqB,EAAYtO,UAAAC,OAAA,QAAAC,IAAAF,UAAA,IAAAA,UAAA,GAC/B,OAAO,IAAIwL,GACTyB,EAAE,GAAKvN,KAAKgM,EAAIuB,EAAE,GAAKvN,KAAK+L,GAAK6C,EAAe,EAAIrB,EAAE,IACtDA,EAAE,GAAKvN,KAAKgM,EAAIuB,EAAE,GAAKvN,KAAK+L,GAAK6C,EAAe,EAAIrB,EAAE,IAE1D,EAGK,MAAMgB,GAAO,IAAIzC,GAAM,EAAG,GC7WpB+C,GACXC,KAESA,GAAgBlN,MAAMmN,QAASD,EAAuBE,UAG1D,SAASC,GAAiDC,GAC/D,MAAMC,UAAmBD,EAAKpP,WAAAA,GAAAM,SAAAE,WAC5BP,kBAI2B,GAAE,CAG7BqP,cAAAA,CAAeC,GACb,CAIFC,gBAAAA,CAAiBD,GACf,CAIFE,oBAAAA,CAAqBF,GACnB,CASFpD,GAAAA,GAAwC,IAAA,IAAAvK,EAAApB,UAAAC,OAAjCiP,EAAO,IAAA5N,MAAAF,GAAAG,EAAA,EAAAA,EAAAH,EAAAG,IAAP2N,EAAO3N,GAAAvB,UAAAuB,GACZ,MAAM4N,EAAOzP,KAAKgP,SAAS5E,QAAQoF,GAEnC,OADAA,EAAQzO,QAASsO,GAAWrP,KAAKoP,eAAeC,IACzCI,CACT,CAQAC,QAAAA,CAAS1G,GAA2C,IAAA,IAAA2G,EAAArP,UAAAC,OAAzBiP,MAAO5N,MAAA+N,EAAA,EAAAA,OAAAC,EAAA,EAAAA,EAAAD,EAAAC,IAAPJ,EAAOI,EAAA,GAAAtP,UAAAsP,GAGhC,OAFA5P,KAAKgP,SAAS9F,OAAOF,EAAO,KAAMwG,GAClCA,EAAQzO,QAASsO,GAAWrP,KAAKoP,eAAeC,IACzCrP,KAAKgP,SAASzO,MACvB,CAQAwI,MAAAA,GACE,MAAMsC,EAAQrL,KAAKgP,SACjBa,EAA0B,GAAG,IAAA,IAAAC,EAAAxP,UAAAC,OAFvBiP,EAAO,IAAA5N,MAAAkO,GAAAC,EAAA,EAAAA,EAAAD,EAAAC,IAAPP,EAAOO,GAAAzP,UAAAyP,GAYf,OATAP,EAAQzO,QAASsO,IACf,MAAMrG,EAAQqC,EAAMpC,QAAQoG,IAEd,IAAVrG,IACFqC,EAAMnC,OAAOF,EAAO,GACpB6G,EAAQzF,KAAKiF,GACbrP,KAAKsP,iBAAiBD,MAGnBQ,CACT,CAUAG,aAAAA,CACEC,GAMAjQ,KAAKkQ,aAAanP,QAAQ,CAACsO,EAAQrG,EAAOwG,IACxCS,EAASZ,EAAQrG,EAAOwG,GAE5B,CAOAU,UAAAA,GAA+B,IAAA,IAAAC,EAAA7P,UAAAC,OAAjB6P,EAAK,IAAAxO,MAAAuO,GAAAE,EAAA,EAAAA,EAAAF,EAAAE,IAALD,EAAKC,GAAA/P,UAAA+P,GACjB,OAAqB,IAAjBD,EAAM7P,OACD,IAAIP,KAAKgP,UAEXhP,KAAKgP,SAASxF,OAAQ8G,GAAMA,EAAEC,UAAUH,GACjD,CAOAI,IAAAA,CAAKxH,GACH,OAAOhJ,KAAKgP,SAAShG,EACvB,CAMAyH,OAAAA,GACE,OAAgC,IAAzBzQ,KAAKgP,SAASzO,MACvB,CAMAkP,IAAAA,GACE,OAAOzP,KAAKgP,SAASzO,MACvB,CAUAmQ,QAAAA,CAASrB,EAAsBsB,GAC7B,QAAI3Q,KAAKgP,SAAS4B,SAASvB,MAEhBsB,GACF3Q,KAAKgP,SAAS6B,KAClBC,GACCA,aAAe3B,GACd2B,EAA8BJ,SAASrB,GAAQ,GAIxD,CAMA0B,UAAAA,GACE,OAAO/Q,KAAKgP,SAAS3N,OAAO,CAAC2P,EAAMC,IACjCD,GAAQC,EAAQF,WAAaE,EAAQF,aAAe,EAEnD,EACL,CAQAG,gBAAAA,CAAiB7B,GACf,SAAKA,GAAUA,IAAWrP,KAAKgP,SAAS,MAGxC5D,GAAgBpL,KAAKgP,SAAUK,GAC/BrP,KAAKgP,SAASmC,QAAQ9B,GACtBrP,KAAKuP,qBAAqBF,IACnB,EACT,CAQA+B,kBAAAA,CAAmB/B,GACjB,SAAKA,GAAUA,IAAWrP,KAAKgP,SAAShP,KAAKgP,SAASzO,OAAS,MAG/D6K,GAAgBpL,KAAKgP,SAAUK,GAC/BrP,KAAKgP,SAAS5E,KAAKiF,GACnBrP,KAAKuP,qBAAqBF,IACnB,EACT,CAYAgC,mBAAAA,CAAoBhC,EAAsBiC,GACxC,IAAKjC,EACH,OAAO,EAET,MAAM9D,EAAMvL,KAAKgP,SAAS/F,QAAQoG,GAClC,GAAY,IAAR9D,EAAW,CAEb,MAAMgG,EAASvR,KAAKwR,kBAAkBnC,EAAQ9D,EAAK+F,GAInD,OAHAlG,GAAgBpL,KAAKgP,SAAUK,GAC/BrP,KAAKgP,SAAS9F,OAAOqI,EAAQ,EAAGlC,GAChCrP,KAAKuP,qBAAqBF,IACnB,CACT,CACA,OAAO,CACT,CAYAoC,kBAAAA,CAAmBpC,EAAsBiC,GACvC,IAAKjC,EACH,OAAO,EAET,MAAM9D,EAAMvL,KAAKgP,SAAS/F,QAAQoG,GAClC,GAAI9D,IAAQvL,KAAKgP,SAASzO,OAAS,EAAG,CAEpC,MAAMgR,EAASvR,KAAK0R,kBAAkBrC,EAAQ9D,EAAK+F,GAInD,OAHAlG,GAAgBpL,KAAKgP,SAAUK,GAC/BrP,KAAKgP,SAAS9F,OAAOqI,EAAQ,EAAGlC,GAChCrP,KAAKuP,qBAAqBF,IACnB,CACT,CACA,OAAO,CACT,CAQAsC,YAAAA,CAAatC,EAAsBrG,GACjC,OAAIqG,IAAWrP,KAAKgP,SAAShG,KAG7BoC,GAAgBpL,KAAKgP,SAAUK,GAC/BrP,KAAKgP,SAAS9F,OAAOF,EAAO,EAAGqG,GAC/BrP,KAAKuP,qBAAqBF,IACnB,EACT,CAEAmC,iBAAAA,CACEnC,EACA9D,EACA+F,GAEA,IAAIC,EAEJ,GAAID,EAAc,CAChBC,EAAShG,EAET,IAAK,IAAIJ,EAAII,EAAM,EAAGJ,GAAK,IAAKA,EAC9B,GAAIkE,EAAOuC,cAAc5R,KAAKgP,SAAS7D,IAAK,CAC1CoG,EAASpG,EACT,KACF,CAEJ,MACEoG,EAAShG,EAAM,EAGjB,OAAOgG,CACT,CAEAG,iBAAAA,CACErC,EACA9D,EACA+F,GAEA,IAAIC,EAEJ,GAAID,EAAc,CAChBC,EAAShG,EAET,IAAK,IAAIJ,EAAII,EAAM,EAAGJ,EAAInL,KAAKgP,SAASzO,SAAU4K,EAChD,GAAIkE,EAAOuC,cAAc5R,KAAKgP,SAAS7D,IAAK,CAC1CoG,EAASpG,EACT,KACF,CAEJ,MACEoG,EAAShG,EAAM,EAGjB,OAAOgG,CACT,CAUAM,cAAAA,CAAc/M,GAGZ,IAFAgN,KAAEA,EAAIC,IAAEA,EAAGC,MAAEA,EAAKC,OAAEA,GAAenN,GACnCoN,oBAAEA,GAAsB,GAAyC5R,UAAAC,OAAA,QAAAC,IAAAF,UAAA,GAAAA,UAAA,GAAG,CAAA,EAEpE,MAAMkP,EAAqC,GACzC2C,EAAK,IAAIrG,GAAMgG,EAAMC,GACrBK,EAAKD,EAAGlG,IAAI,IAAIH,GAAMkG,EAAOC,IAG/B,IAAK,IAAI9G,EAAInL,KAAKgP,SAASzO,OAAS,EAAG4K,GAAK,EAAGA,IAAK,CAClD,MAAMkE,EAASrP,KAAKgP,SAAS7D,GAE3BkE,EAAOgD,YACPhD,EAAOiD,UACLJ,GAAuB7C,EAAOkD,mBAAmBJ,EAAIC,IACrD/C,EAAOmD,sBAAsBL,EAAIC,IAChCF,GAAuB7C,EAAOoD,cAAcN,IAC5CD,GAAuB7C,EAAOoD,cAAcL,KAE/C5C,EAAQpF,KAAKiF,EAEjB,CAEA,OAAOG,CACT,EAIF,OAAOL,CACT,CChWO,MAAMuD,WAAiC9I,EAMlC+I,WAAAA,GAA+B,IAAnBzQ,EAAY5B,UAAAC,OAAA,QAAAC,IAAAF,UAAA,GAAAA,UAAA,GAAG,CAAA,EACnC,IAAK,MAAMsS,KAAQ1Q,EACjBlC,KAAKyI,IAAImK,EAAM1Q,EAAQ0Q,GAE3B,CAKAC,UAAAA,CAAW/B,GACT,IAAK,MAAM8B,KAAQ9B,EACjB9Q,KAAK8S,KAAKF,EAAM9B,EAAI8B,GAExB,CAOAnK,GAAAA,CAAIlH,EAAmC+J,GAMrC,MALmB,iBAAR/J,EACTvB,KAAK6S,WAAWtR,GAEhBvB,KAAK8S,KAAKvR,EAAK+J,GAEVtL,IACT,CAEA8S,IAAAA,CAAKvR,EAAa+J,GAChBtL,KAAKuB,GAAqB+J,CAC5B,CAMAyH,MAAAA,CAAOC,GACL,MAAM1H,EAAQtL,KAAKsI,IAAI0K,GAIvB,MAHqB,kBAAV1H,GACTtL,KAAKyI,IAAIuK,GAAW1H,GAEftL,IACT,CAOAsI,GAAAA,CAAI0K,GACF,OAAOhT,KAAKgT,EACd,EC1DK,SAASC,GAAiBhD,GAC/B,OAAO1L,IAAkB2O,sBAAsBjD,EACjD,CAEO,SAASkD,GAAgBC,GAC9B,OAAO7O,IAAkB8O,qBAAqBD,EAChD,CCRA,IAAIE,GAAK,EAEF,MAAMC,GAAMA,IAAMD,KCKZE,GAAsBA,KACjC,MAAMC,EAAUnP,IAAoBoP,cAAc,UAClD,IAAKD,QAAyC,IAAvBA,EAAQrQ,WAC7B,MAAM,IAAIrB,EAAY,qCAExB,OAAO0R,GAOIE,GAAcA,IACzBrP,IAAoBoP,cAAc,OAoBvBE,GACXzQ,IAEA,MAAM0Q,EAAYL,KAGlB,OAFAK,EAAU7B,MAAQ7O,EAAO6O,MACzB6B,EAAU5B,OAAS9O,EAAO8O,OACnB4B,GAWIC,GAAYA,CACvBC,EACAC,EACAC,IACGF,EAASD,UAAU,SAASE,IAAUC,GAQ9BC,GAASA,CACpBH,EACAC,EACAC,IAEA,IAAIE,QAAQ,CAACC,EAASC,KACpBN,EAASG,OAAOE,EAAS,SAASJ,IAAUC,KCnEnCK,GAAoBC,GAC9BA,EAAUrO,EAOAsO,GAAoBnG,GAC9BA,EAAUnI,ECiBAuO,GAAoBC,GAC/BA,EAAIC,MAAM,CAACrJ,EAAOtC,IAAUsC,IAAUnF,EAAQ6C,IAUnC4L,GAAiBA,CAC5BlG,EACAnB,EACAqB,IACU,IAAI9C,GAAM4C,GAAGC,UAAUpB,EAAGqB,GAOzBiG,GAAmBtH,IAC9B,MAAMuH,EAAI,GAAKvH,EAAE,GAAKA,EAAE,GAAKA,EAAE,GAAKA,EAAE,IACpCwH,EAAI,CAACD,EAAIvH,EAAE,IAAKuH,EAAIvH,EAAE,IAAKuH,EAAIvH,EAAE,GAAIuH,EAAIvH,EAAE,GAAI,EAAG,IAClDvB,EAAEA,EAACD,EAAEA,GAAM,IAAID,GAAMyB,EAAE,GAAIA,EAAE,IAAIoB,UAAUoG,GAAG,GAGhD,OAFAA,EAAE,IAAM/I,EACR+I,EAAE,IAAMhJ,EACDgJ,GAUIC,GAA4BA,CACvCF,EACAG,EACAC,IAEA,CACEJ,EAAE,GAAKG,EAAE,GAAKH,EAAE,GAAKG,EAAE,GACvBH,EAAE,GAAKG,EAAE,GAAKH,EAAE,GAAKG,EAAE,GACvBH,EAAE,GAAKG,EAAE,GAAKH,EAAE,GAAKG,EAAE,GACvBH,EAAE,GAAKG,EAAE,GAAKH,EAAE,GAAKG,EAAE,GACvBC,EAAQ,EAAIJ,EAAE,GAAKG,EAAE,GAAKH,EAAE,GAAKG,EAAE,GAAKH,EAAE,GAC1CI,EAAQ,EAAIJ,EAAE,GAAKG,EAAE,GAAKH,EAAE,GAAKG,EAAE,GAAKH,EAAE,IAYjCK,GAA+BA,CAC1CC,EACAF,IAEAE,EAASC,YACP,CAACC,EAAiBC,IAChBA,GAAQD,EACJN,GAA0BO,EAAMD,EAASJ,GACzCK,GAAQD,OACd9U,IACG2F,EAAQ+E,SAEFsK,GAAoB1Q,IAAA,IAAEgQ,EAAGG,GAAUnQ,EAAA,OAC9CJ,KAAK+Q,MAAMR,EAAGH,IAOHY,GAAeZ,IAC1B,MAAMrJ,EAAQ+J,GAAkBV,GAC9Ba,EAAQjR,KAAKkR,IAAId,EAAE,GAAI,GAAKpQ,KAAKkR,IAAId,EAAE,GAAI,GAC3Ce,EAASnR,KAAKgB,KAAKiQ,GACnBG,GAAUhB,EAAE,GAAKA,EAAE,GAAKA,EAAE,GAAKA,EAAE,IAAMe,EACvCE,EAAQrR,KAAK+Q,MAAMX,EAAE,GAAKA,EAAE,GAAKA,EAAE,GAAKA,EAAE,GAAIa,GAChD,MAAO,CACLlK,MAAO+I,GAAiB/I,GACxBoK,SACAC,SACAC,MAAOvB,GAAiBuB,GACxBC,MAAO,EACPC,WAAYnB,EAAE,IAAM,EACpBoB,WAAYpB,EAAE,IAAM,IAkBXqB,GAAwB,SAACnK,GAAgB,MAAa,CACjE,EACA,EACA,EACA,EACAA,EALgD1L,UAAAC,OAAA,QAAAC,IAAAF,UAAA,GAAAA,UAAA,GAAG,EAOpD,EAeM,SAAS8V,KAGN,IAFR3K,MAAEA,EAAQ,GAAsBnL,UAAAC,OAAA,QAAAC,IAAAF,UAAA,GAAAA,UAAA,GAAG,CAAA,GACnC0L,EAAEA,EAAI,EAACD,EAAEA,EAAI,GAAgBzL,UAAAC,OAAA,QAAAC,IAAAF,UAAA,GAAAA,UAAA,GAAG,CAAA,EAEhC,MAAM+V,EAAe/B,GAAiB7I,GACpC6K,EAAW9K,GAAI6K,GACfE,EAAW5K,GAAI0K,GACjB,MAAO,CACLC,EACAC,GACCA,EACDD,EACAtK,EAAIA,GAAKsK,EAAWtK,EAAIuK,EAAWxK,GAAK,EACxCA,EAAIA,GAAKwK,EAAWvK,EAAIsK,EAAWvK,GAAK,EAE5C,CAgBO,MAAMyK,GAAoB,SAACxK,GAAwB,MAAa,CACrEA,EACA,EACA,EAHoD1L,UAAAC,OAAA,QAAAC,IAAAF,UAAA,GAAAA,UAAA,GAAG0L,EAKvD,EACA,EACD,EAEYyK,GAAehL,GAC1B/G,KAAKgS,IAAIpC,GAAiB7I,IAkBfkL,GAAqBC,GAA+B,CAC/D,EACA,EACAH,GAAYG,GACZ,EACA,EACA,GAgBWC,GAAqBD,GAA+B,CAC/D,EACAH,GAAYG,GACZ,EACA,EACA,EACA,GAkBWE,GAAuBvM,IAOZ,IAPasL,OACnCA,EAAS,EAACC,OACVA,EAAS,EAACiB,MACVA,GAAQ,EAAKC,MACbA,GAAQ,EAAKjB,MACbA,EAAQ,EAAYC,MACpBA,EAAQ,GACSzL,EACb0M,EAAST,GACXO,GAASlB,EAASA,EAClBmB,GAASlB,EAASA,GAQpB,OANIC,IACFkB,EAASjC,GAA0BiC,EAAQN,GAAkBZ,IAAQ,IAEnEC,IACFiB,EAASjC,GAA0BiC,EAAQJ,GAAkBb,IAAQ,IAEhEiB,GAoBIC,GAAiBhV,IAC5B,MAAM+T,WAAEA,EAAa,EAACC,WAAEA,EAAa,EAACzK,MAAEA,EAAQ,GAAiBvJ,EACjE,IAAI+U,EAASd,GAAsBF,EAAYC,GAC3CzK,IACFwL,EAASjC,GAA0BiC,EAAQb,GAAmB,CAAE3K,YAElE,MAAM0L,EAAcL,GAAqB5U,GAIzC,OAHKuS,GAAiB0C,KACpBF,EAASjC,GAA0BiC,EAAQE,IAEtCF,GCrSIG,GAAY,SACvBC,GAAW,IACXC,OAAEA,EAAMC,YAAEA,EAAc,MAAwBjX,UAAAC,OAAA,QAAAC,IAAAF,UAAA,GAAAA,UAAA,GAAG,CAAA,EAAE,OAErD,IAAI6T,QAA0B,SAAUC,EAASoD,GAC/C,GAAIF,GAAUA,EAAOG,QACnB,OAAOD,EAAO,IAAIrV,EAAmB,cAEvC,MAAMuV,EAAM/D,KACZ,IAAIrK,EACAgO,IACFhO,EAAQ,SAAUqO,GAChBD,EAAIE,IAAM,GACVJ,EAAOG,EACT,EACAL,EAAOO,iBAAiB,QAASvO,EAAO,CAAEe,MAAM,KAElD,MAAMyN,EAAO,WACXJ,EAAIK,OAASL,EAAIM,QAAU,KAC3B1O,IAASgO,SAAAA,EAAQW,oBAAoB,QAAS3O,IAC9C8K,EAAQsD,EACV,EACKL,GAILK,EAAIK,OAASD,EACbJ,EAAIM,QAAU,WACZ1O,IAASgO,SAAAA,EAAQW,oBAAoB,QAAS3O,IAC9CkO,EAAO,IAAIzV,EAAY,iBAAiB2V,EAAIE,OAC9C,EACAL,IAAgBG,EAAIH,YAAcA,GAClCG,EAAIE,IAAMP,GATRS,GAUJ,EAAE,EA8BSI,GAAiB,SAQ5B1I,GAAc,IACd8H,OAAEA,EAAMa,QAAEA,EAAUtS,GAA4BvF,UAAAC,OAAA,QAAAC,IAAAF,UAAA,GAAAA,UAAA,GAAG,CAAA,EAAE,OAErD,IAAI6T,QAAa,CAACC,EAASoD,KACzB,MAAMY,EAAiB,GACvBd,GAAUA,EAAOO,iBAAiB,QAASL,EAAQ,CAAEnN,MAAM,IAC3D8J,QAAQkE,IACN7I,EAAQ8I,IAAKxH,GACX7I,EACGI,SAICyI,EAAIpI,MACL6P,WAAWzH,EAAK,CAAEwG,WAClBkB,KAAMC,IACLN,EAAQrH,EAAK2H,GACbL,EAAUhO,KAAKqO,GACRA,MAIZD,KAAKpE,GACLsE,MAAOC,IAENP,EAAUrX,QAAS6X,IAChBA,EAA0BvU,SACxBuU,EAA0BvU,YAE/BmT,EAAOmB,KAERE,QAAQ,KACPvB,GAAUA,EAAOW,oBAAoB,QAAST,MAElD,EASSsB,GAA0B,SAGrCC,GAAqB,IACrBzB,OAAEA,GAAmBhX,UAAAC,OAAA,QAAAC,IAAAF,UAAA,GAAAA,UAAA,GAAG,CAAA,EAAE,OAE1B,IAAI6T,QAAW,CAACC,EAASoD,KACvB,MAAMY,EAAiD,GACvDd,GAAUA,EAAOO,iBAAiB,QAASL,EAAQ,CAAEnN,MAAM,IAE3D,MAAM2O,EAAWvY,OAAOwY,OAAOF,GAAkBT,IAAKhN,GAC/CA,GASDA,EAAM5C,MAAQT,EAAcE,IAAImD,EAAM5C,MACjCwP,GAAgD,CAAC5M,GAAQ,CAC9DgM,WACCkB,KAAK1T,IAAe,IAAboU,GAAQpU,EAEhB,OADAsT,EAAUhO,KAAK8O,GACRA,IAbF5N,GAkBLnK,EAAOV,OAAOU,KAAK4X,GACzB5E,QAAQkE,IAAIW,GACTR,KAAMU,GACEA,EAAQ7X,OAAO,CAACC,EAAKsX,EAAU5P,KACpC1H,EAAIH,EAAK6H,IAAU4P,EACZtX,GACN,CAAA,IAEJkX,KAAKpE,GACLsE,MAAOC,IAENP,EAAUrX,QAAS6X,IACjBA,EAASvU,SAAWuU,EAASvU,YAE/BmT,EAAOmB,KAERE,QAAQ,KACPvB,GAAUA,EAAOW,oBAAoB,QAAST,MAElD,ECzLS2B,GAAO,SAClBC,GAGA,OAFiB9Y,UAAAC,OAAA,QAAAC,IAAAF,UAAA,GAAAA,UAAA,GAAG,IAERe,OAAO,CAACiP,EAAG/O,KACjBA,KAAO6X,IACT9I,EAAE/O,GAAO6X,EAAO7X,IAEX+O,GACN,CAAA,EACL,EAEa+I,GAASA,CACpBD,EACAE,IAEQ7Y,OAAOU,KAAKiY,GAAwB/X,OAAO,CAACiP,EAAG/O,KACjD+X,EAAUF,EAAO7X,GAAMA,EAAK6X,KAC9B9I,EAAE/O,GAAO6X,EAAO7X,IAEX+O,GACN,CAAA,GCrBQiJ,GAAUA,CAACC,EAAyBC,IAC/CC,WAAWC,OAAOH,GAAQD,QAAQE,ICEvBG,GAAejL,GAC1B,UACAA,EACG2J,IAAKhN,GAAUiO,GAAQjO,EAAOnL,EAAO0Z,sBACrCC,KAAK,KACR,ICPWC,GACXC,KAESA,QAAyCxZ,IAA9BwZ,EAAmBC,OAG5BC,GACXF,KAESA,GAAkD,mBAAhCA,EAAmBG,SAGnCC,GAAaJ,KAEpBA,QAA0CxZ,IAA/BwZ,EAAmBK,SAAyB,WAAYL,EAsB5DM,GACXxL,KAEEA,GAAgB,2BAA4BA,ECzCzC,SAASyL,GAAiB9G,GAC/B,MAAM+G,EAAM/G,GAAWgH,GAAuBhH,GAC9C,IAAI3B,EAAO,EACTC,EAAM,EACR,IAAK0B,IAAY+G,EACf,MAAO,CAAE1I,OAAMC,OAEjB,IAAI2I,EAAmDjH,EACvD,MAAMkH,EAAaH,EAAII,gBACrBC,EAAOL,EAAIK,MAAQ,CACjBC,WAAY,EACZC,UAAW,GAMf,KACEL,IACCA,EAAYM,YAAeN,EAAsCO,QAElEP,EAAeA,EAAYM,YACxBN,EAAsCO,KAIrCP,IAAgBF,GAClB1I,EAAO+I,EAAKC,YAAcH,EAAWG,YAAc,EACnD/I,EAAM8I,EAAKE,WAAaJ,EAAWI,WAAa,IAEhDjJ,GAAS4I,EAA4BI,YAAc,EACnD/I,GAAQ2I,EAA4BK,WAAa,GAIxB,IAAzBL,EAAYQ,UACoC,UAA/CR,EAA4BS,MAAMC,YAMvC,MAAO,CAAEtJ,OAAMC,MACjB,CAEO,MAAM0I,GAA0BY,GACrCA,EAAGC,eAAiB,KAETC,GAAwBF,IAAe,IAAAG,EAAA,OAClC,QAAhBA,EAAAH,EAAGC,qBAAa,IAAAE,OAAA,EAAhBA,EAAkBC,cAAe,MC9CtBC,GAAsB,SACjCL,EACAM,EAA6B7W,GAG1B,IAFHkN,MAAEA,EAAKC,OAAEA,GAAenN,EACxB8W,EAAatb,UAAAC,OAAA,QAAAC,IAAAF,UAAA,GAAAA,UAAA,GAAG,EAEhB+a,EAAGrJ,MAAQA,EACXqJ,EAAGpJ,OAASA,EACR2J,EAAgB,IAClBP,EAAGQ,aAAa,SAAU7J,EAAQ4J,GAAe/N,YACjDwN,EAAGQ,aAAa,UAAW5J,EAAS2J,GAAe/N,YACnD8N,EAAIG,MAAMF,EAAeA,GAE7B,EAOaG,GAAmBA,CAC9BV,EAAe9Q,KAEZ,IADHyH,MAAEA,EAAKC,OAAEA,GAAgC1H,EAEzCyH,IAAUqJ,EAAGF,MAAMnJ,MAAyB,iBAAVA,EAAqB,GAAGA,MAAYA,GACtEC,IACGoJ,EAAGF,MAAMlJ,OAA2B,iBAAXA,EAAsB,GAAGA,MAAaA,IA4C7D,SAAS+J,GAAwBvI,GAKtC,YAJqC,IAA1BA,EAAQwI,gBACjBxI,EAAQwI,cAAgB,KAAM,GAEhCxI,EAAQ0H,MAAMe,WAAatV,EACpB6M,CACT,CCvEO,MAAM0I,GAUXrc,WAAAA,CAAYgK,GATZ/J,EAAAC,KAAA,4BAAA,GAAAD,EAAAC,KAAA,aAAA,GAUE,MAAMqb,EAAKrb,KAAKoc,kBAAkBtS,GAClC9J,KAAKqc,MAAQ,CAAEhB,KAAIM,IAAKN,EAAGjY,WAAW,MACxC,CAEUgZ,iBAAAA,CAAkBtS,GAE1B,MAAMuR,GVkCRlY,EUlC0B2G,SVoCsCtJ,IAA5C2C,EAA6BC,WUnC3C0G,EACCA,GACExF,IAAoBgY,eAAexS,IACtC0J,KV8BNrQ,MU7BE,GAAIkY,EAAGkB,aAAa,eAClB,MAAM,IAAIxa,EACR,0GAMJ,OAHA/B,KAAKwc,qBAAuBnB,EAAGF,MAAMsB,QACrCpB,EAAGQ,aAAa,cAAe,QAC/BR,EAAGqB,UAAUzQ,IAAI,gBACVoP,CACT,CAEAsB,UAAAA,CAAU7X,GAA2B,IAA1BkN,MAAEA,EAAKC,OAAEA,GAAenN,EACjC,MAAMuW,GAAEA,GAAOrb,KAAKqc,MAEpBhB,EAAGqB,UAAU3T,OAAO,gBACpBsS,EAAGuB,gBAAgB,eAEnBvB,EAAGQ,aAAa,QAAS,GAAG7J,KAC5BqJ,EAAGQ,aAAa,SAAU,GAAG5J,KAC7BoJ,EAAGF,MAAMsB,QAAUzc,KAAKwc,sBAAwB,GAChDxc,KAAKwc,0BAAuBhc,CAC9B,CAEAqc,aAAAA,CAAcpN,EAAamM,GACzB,MAAMP,GAAEA,EAAEM,IAAEA,GAAQ3b,KAAKqc,MACzBX,GAAoBL,EAAIM,EAAKlM,EAAMmM,EACrC,CAEAG,gBAAAA,CAAiBtM,GACfsM,GAAiB/b,KAAKqc,MAAMhB,GAAI5L,EAClC,CAKAqN,UAAAA,GACE,OD7BG,SAA0BrJ,GAAsB,IAAAsJ,EACrD,MAAMvC,EAAM/G,GAAWgH,GAAuBhH,GAC5CuJ,EAAS,CAAElL,KAAM,EAAGC,IAAK,GAE3B,IAAKyI,EACH,OAAOwC,EAET,MAAMC,GACyB,QAA7BF,EAAAxB,GAAqB9H,cAAQsJ,SAA7BA,EAA+BG,iBAAiBzJ,EAAS,QACxD,CAAA,EACHuJ,EAAOlL,MAAQqL,SAASF,EAAUG,gBAAiB,KAAO,EAC1DJ,EAAOjL,KAAOoL,SAASF,EAAUI,eAAgB,KAAO,EACxDL,EAAOlL,MAAQqL,SAASF,EAAUK,YAAa,KAAO,EACtDN,EAAOjL,KAAOoL,SAASF,EAAUM,WAAY,KAAO,EAEpD,IAAIC,EAAM,CAAE1L,KAAM,EAAGC,IAAK,GAE1B,MAAM0L,EAAUjD,EAAII,qBACyB,IAAlCnH,EAAQiK,wBACjBF,EAAM/J,EAAQiK,yBAGhB,MAAMC,EAAgBpD,GAAiB9G,GAEvC,MAAO,CACL3B,KACE0L,EAAI1L,KAAO6L,EAAc7L,MAAQ2L,EAAQG,YAAc,GAAKZ,EAAOlL,KACrEC,IAAKyL,EAAIzL,IAAM4L,EAAc5L,KAAO0L,EAAQI,WAAa,GAAKb,EAAOjL,IAEzE,CCAW+L,CAAiB9d,KAAKqc,MAAMhB,GACrC,CAEAhX,OAAAA,GACEL,IAASK,QAAQrE,KAAKqc,MAAMhB,WAErBrb,KAAKqc,KACd,ECoFK,MAAM0B,GAAsD,CACjEC,eAAe,EACfC,gBAAiB,GACjBC,YAAY,EACZC,aAAc,GAEdC,sBAAsB,EACtBC,2BAA2B,EAE3BC,mBAAmB,EACnBC,eAAe,EACfC,qBAAqB,EACrBC,uBAAuB,EAKvBC,sBAAsB,EAItBC,qBAAqB,EAErBC,kBAAmB,IAAIzY,ICpGlB,MAAM0Y,WAIH5P,GAAsByD,KA+C9B,iBAAIoM,GAAgB,IAAAC,EAClB,OAA0B,QAA1BA,EAAO/e,KAAKgf,SAAS3C,aAAK,IAAA0C,OAAA,EAAnBA,EAAqB1D,EAC9B,CAEA,oBAAI4D,GAAmB,IAAAC,EACrB,OAA0B,QAA1BA,EAAOlf,KAAKgf,SAAS3C,aAAK,IAAA6C,OAAA,EAAnBA,EAAqBvD,GAC9B,CAuCA,kBAAOwD,GACL,OAAON,GAAaO,WACtB,CAEAtf,WAAAA,CACEub,GAEA,IADAnZ,EAAsC5B,UAAAC,OAAA,QAAAC,IAAAF,UAAA,GAAAA,UAAA,GAAG,CAAA,EAEzCF,QACAK,OAAOC,OACLV,KACCA,KAAKF,YAAoCqf,eAE5Cnf,KAAKyI,IAAIvG,GACTlC,KAAKqf,aAAahE,GAClBrb,KAAKsf,mBAAmB,CACtBtN,MAAOhS,KAAKgS,OAAShS,KAAKgf,SAAS3C,MAAMhB,GAAGrJ,OAAS,EACrDC,OAAQjS,KAAKiS,QAAUjS,KAAKgf,SAAS3C,MAAMhB,GAAGpJ,QAAU,IAE1DjS,KAAKuf,qBAAsB,EAC3Bvf,KAAK4e,kBAAoB,IAAI5e,KAAK4e,mBAClC5e,KAAKwf,wBACP,CAEUH,YAAAA,CAAahE,GACrBrb,KAAKgf,SAAW,IAAI7C,GAAuBd,EAC7C,CAEApP,GAAAA,GACE,MAAMwD,EAAOrP,MAAM6L,OAAI3L,WAEvB,OADAA,UAAQC,OAAS,GAAKP,KAAKse,mBAAqBte,KAAKyf,mBAC9ChQ,CACT,CAEAC,QAAAA,CAAS1G,GAA2C,IAAA,IAAAtH,EAAApB,UAAAC,OAAzBiP,MAAO5N,MAAAF,EAAA,EAAAA,OAAAG,EAAA,EAAAA,EAAAH,EAAAG,IAAP2N,EAAO3N,EAAA,GAAAvB,UAAAuB,GAChC,MAAM4N,EAAOrP,MAAMsP,SAAS1G,KAAUwG,GAEtC,OADAA,EAAQjP,OAAS,GAAKP,KAAKse,mBAAqBte,KAAKyf,mBAC9ChQ,CACT,CAEA1G,MAAAA,GACE,MAAM8G,EAAUzP,MAAM2I,UAAOzI,WAE7B,OADAuP,EAAQtP,OAAS,GAAKP,KAAKse,mBAAqBte,KAAKyf,mBAC9C5P,CACT,CAEAT,cAAAA,CAAe0B,GACTA,EAAI3N,QAAW2N,EAAI3N,SAA4BnD,OACjDwB,EACE,OACA,uKAGFsP,EAAI3N,OAAO4F,OAAO+H,IAEpBA,EAAIgC,KAAK,SAAU9S,MACnB8Q,EAAI4O,YACJ1f,KAAK+K,KAAK,eAAgB,CAAErB,OAAQoH,IACpCA,EAAI/F,KAAK,QAAS,CAAErB,OAAQ1J,MAC9B,CAEAsP,gBAAAA,CAAiBwB,GACfA,EAAIgC,KAAK,cAAUtS,GACnBR,KAAK+K,KAAK,iBAAkB,CAAErB,OAAQoH,IACtCA,EAAI/F,KAAK,UAAW,CAAErB,OAAQ1J,MAChC,CAEAuP,oBAAAA,GACEvP,KAAKse,mBAAqBte,KAAKyf,kBACjC,CAOAE,gBAAAA,GACE,OAAO3f,KAAKwe,oBAAsBha,IAAwB,CAC5D,CAMAsY,UAAAA,GACE,OAAQ9c,KAAK4f,QAAU5f,KAAKgf,SAASlC,YACvC,CAMA+C,QAAAA,GACE,OAAO7f,KAAKgS,KACd,CAMA8N,SAAAA,GACE,OAAO9f,KAAKiS,MACd,CAMUqN,kBAAAA,CACRS,GAEA,IADAC,QAAEA,GAAU,EAAKC,cAAEA,GAAgB,GAA2B3f,UAAAC,OAAA,QAAAC,IAAAF,UAAA,GAAAA,UAAA,GAAG,CAAA,EAEjE,IAAK0f,EAAS,CACZ,MAAMvQ,EAAO,CACXuC,MAAOhS,KAAKgS,MACZC,OAAQjS,KAAKiS,UACT8N,GAEN/f,KAAKgf,SAASnC,cAAcpN,EAAMzP,KAAK2f,oBACvC3f,KAAKkgB,gBAAiB,EACtBlgB,KAAKgS,MAAQvC,EAAKuC,MAClBhS,KAAKiS,OAASxC,EAAKwC,MACrB,CACKgO,GACHjgB,KAAKgf,SAASjD,iBAAiBgE,GAGjC/f,KAAK8c,YACP,CAoBAD,aAAAA,CACEkD,EACA7d,GAEAlC,KAAKsf,mBAAmBS,EAAY7d,GAC/BA,GAAYA,EAAQ8d,SACvBhgB,KAAKyf,kBAET,CAMAU,OAAAA,GACE,OAAOngB,KAAK4e,kBAAkB,EAChC,CAMAwB,oBAAAA,CAAqBC,GACnBrgB,KAAK4e,kBAAoByB,EACzBrgB,KAAKwf,yBACLxf,KAAKse,mBAAqBte,KAAKyf,kBACjC,CAUAa,WAAAA,CAAYC,EAAcjV,GAExB,MAAMkV,EAASD,EACbF,EAAc,IAAIrgB,KAAK4e,mBACnB6B,EAAW7L,GAAe2L,EAAO1L,GAAgBwL,IACvDA,EAAI,GAAK/U,EACT+U,EAAI,GAAK/U,EACT,MAAMoV,EAAQ9L,GAAe6L,EAAUJ,GACvCA,EAAI,IAAMG,EAAOxU,EAAI0U,EAAM1U,EAC3BqU,EAAI,IAAMG,EAAOzU,EAAI2U,EAAM3U,EAC3B/L,KAAKogB,qBAAqBC,EAC5B,CAMAM,OAAAA,CAAQrV,GACNtL,KAAKsgB,YAAY,IAAIxU,GAAM,EAAG,GAAIR,EACpC,CAMAsV,WAAAA,CAAYL,GACV,MAAMF,EAAc,IAAIrgB,KAAK4e,mBAG7B,OAFAyB,EAAI,IAAME,EAAMvU,EAChBqU,EAAI,IAAME,EAAMxU,EACT/L,KAAKogB,qBAAqBC,EACnC,CAMAQ,WAAAA,CAAYN,GACV,OAAOvgB,KAAK4gB,YACV,IAAI9U,IACDyU,EAAMvU,EAAIhM,KAAK4e,kBAAkB,IACjC2B,EAAMxU,EAAI/L,KAAK4e,kBAAkB,IAGxC,CAMAkC,UAAAA,GACE,OAAO9gB,KAAKgf,SAAS3C,MAAMhB,EAC7B,CAMA0F,YAAAA,CAAapF,GACXA,EAAIqF,UAAU,EAAG,EAAGhhB,KAAKgS,MAAOhS,KAAKiS,OACvC,CAMA7O,UAAAA,GACE,OAAOpD,KAAKgf,SAAS3C,MAAMV,GAC7B,CAKAsF,KAAAA,GACEjhB,KAAK+I,UAAU/I,KAAKkQ,cACpBlQ,KAAKkhB,qBAAkB1gB,EACvBR,KAAKmhB,kBAAe3gB,EACpBR,KAAKie,gBAAkB,GACvBje,KAAKme,aAAe,GACpBne,KAAK+gB,aAAa/gB,KAAKoD,cACvBpD,KAAK+K,KAAK,kBACV/K,KAAKse,mBAAqBte,KAAKyf,kBACjC,CAKA2B,SAAAA,GACEphB,KAAKqhB,wBACDrhB,KAAKshB,WAGTthB,KAAKuhB,aAAavhB,KAAKoD,aAAcpD,KAAKgP,SAC5C,CAUAwS,cAAAA,GACExhB,KAAKyhB,iBAAmB,EACxBzhB,KAAKohB,WACP,CAOA3B,gBAAAA,GACOzf,KAAKyhB,kBAAqBzhB,KAAK0hB,UAAa1hB,KAAKshB,YACpDthB,KAAKyhB,iBAAmBxO,GAAiB,IAAMjT,KAAKwhB,kBAExD,CAMAhC,sBAAAA,GACE,MAAMxN,EAAQhS,KAAKgS,MACjBC,EAASjS,KAAKiS,OACd0P,EAAO9M,GAAgB7U,KAAK4e,mBAC5B9J,EAAIF,GAAe,CAAE5I,EAAG,EAAGD,EAAG,GAAK4V,GACnC1M,EAAIL,GAAe,CAAE5I,EAAGgG,EAAOjG,EAAGkG,GAAU0P,GAG5CnU,EAAMsH,EAAEtH,IAAIyH,GACZtQ,EAAMmQ,EAAEnQ,IAAIsQ,GACd,OAAQjV,KAAK4hB,UAAY,CACvBzP,GAAI3E,EACJqU,GAAI,IAAI/V,GAAMnH,EAAIqH,EAAGwB,EAAIzB,GACzB+V,GAAI,IAAIhW,GAAM0B,EAAIxB,EAAGrH,EAAIoH,GACzBqG,GAAIzN,EAER,CAEA0c,qBAAAA,GACMrhB,KAAKyhB,mBACPtO,GAAgBnT,KAAKyhB,kBACrBzhB,KAAKyhB,iBAAmB,EAE5B,CAEAM,YAAAA,CAAaC,GACX,CAQFT,YAAAA,CAAa5F,EAA+BnM,GAC1C,GAAIxP,KAAKshB,UACP,OAGF,MAAMW,EAAIjiB,KAAK4e,kBACbsD,EAAOliB,KAAKmiB,SACdniB,KAAKwf,yBACLxf,KAAK+gB,aAAapF,GAClBA,EAAI8C,sBAAwBze,KAAKye,sBAEjC9C,EAAIyG,eAAiB,OACrBpiB,KAAK+K,KAAK,gBAAiB,CAAE4Q,QAC7B3b,KAAKqiB,kBAAkB1G,GAEvBA,EAAI2G,OAEJ3G,EAAIhN,UAAUsT,EAAE,GAAIA,EAAE,GAAIA,EAAE,GAAIA,EAAE,GAAIA,EAAE,GAAIA,EAAE,IAC9CjiB,KAAKuiB,eAAe5G,EAAKnM,GACzBmM,EAAI6G,UACCxiB,KAAK0e,sBAAyB1e,KAAKuf,qBACtCvf,KAAK+hB,aAAapG,GAEhBuG,IACFA,EAAKpP,KAAK,SAAU9S,MAGpBkiB,EAAKO,cACLP,EAAKQ,gBAAiB,EACrBR,EAA6BS,YAAY,CAAEC,aAAa,IACzD5iB,KAAK6iB,qBAAqBlH,EAAKuG,IAEjCliB,KAAK8iB,eAAenH,GAChB3b,KAAK0e,uBAAyB1e,KAAKuf,qBACrCvf,KAAK+hB,aAAapG,GAEpB3b,KAAK+K,KAAK,eAAgB,CAAE4Q,QAExB3b,KAAK+iB,gBACP/iB,KAAK+iB,gBACL/iB,KAAK+iB,mBAAgBviB,EAEzB,CAMAqiB,oBAAAA,CACElH,EACAwG,GAEA,MAAMF,EAAIjiB,KAAK4e,kBACfjD,EAAI2G,OACJ3G,EAAIhN,aAAasT,GAGjBtG,EAAIqH,yBAA2B,iBAC/Bb,EAASxT,UAAUgN,GACnBA,EAAIG,MAAM,EAAIqG,EAASc,MAAO,EAAId,EAASe,OAC3CvH,EAAIwH,UACFhB,EAASiB,cACRjB,EAASkB,mBACTlB,EAASmB,mBAEZ3H,EAAI6G,SACN,CAOAD,cAAAA,CAAe5G,EAA+BnM,GAC5C,IAAK,IAAIrE,EAAI,EAAGoY,EAAM/T,EAAQjP,OAAQ4K,EAAIoY,IAAOpY,EAC/CqE,EAAQrE,IAAMqE,EAAQrE,GAAGqY,OAAO7H,EAEpC,CAOA8H,0BAAAA,CACE9H,EACA3I,GAEA,MAAM0Q,EAAO1jB,KAAK,GAAGgT,UACnB3D,EAASrP,KAAK,GAAGgT,UACjBiP,EAAIjiB,KAAK4e,kBACT+E,EAAW3jB,KAAK,GAAGgT,QACrB,IAAK0Q,IAASrU,EACZ,OAEF,MAAMuU,EAAY7J,GAAS2J,GAC3B,GAAIA,EAAM,CAYR,GAXA/H,EAAI2G,OACJ3G,EAAIkI,YACJlI,EAAImI,OAAO,EAAG,GACdnI,EAAIoI,OAAO/jB,KAAKgS,MAAO,GACvB2J,EAAIoI,OAAO/jB,KAAKgS,MAAOhS,KAAKiS,QAC5B0J,EAAIoI,OAAO,EAAG/jB,KAAKiS,QACnB0J,EAAIqI,YACJrI,EAAIsI,UAAYL,EAAYF,EAAKzJ,OAAO0B,GAAmB+H,EACvDC,GACFhI,EAAIhN,aAAasT,GAEf2B,EAAW,CACbjI,EAAIhN,UAAU,EAAG,EAAG,EAAG,EAAG+U,EAAKrJ,SAAW,EAAGqJ,EAAKQ,SAAW,GAC7D,MAAMC,EAAMT,EAA4BU,mBACrCV,EAAiBW,iBACpBF,GAAKxI,EAAIhN,aAAawV,EACxB,CACAxI,EAAI+H,OACJ/H,EAAI6G,SACN,CACA,GAAInT,EAAQ,CACVsM,EAAI2G,OACJ,MAAM/D,cAAEA,GAAkBve,KAG1BA,KAAKue,cAAgBoF,EACjBA,GACFhI,EAAIhN,aAAasT,GAEnB5S,EAAOmU,OAAO7H,GACd3b,KAAKue,cAAgBA,EACrB5C,EAAI6G,SACN,CACF,CAMAH,iBAAAA,CAAkB1G,GAChB3b,KAAKyjB,2BAA2B9H,EAAK,aACvC,CAMAmH,cAAAA,CAAenH,GACb3b,KAAKyjB,2BAA2B9H,EAAK,UACvC,CAMA2I,cAAAA,GACE,OAAO,IAAIxY,GAAM9L,KAAKgS,MAAQ,EAAGhS,KAAKiS,OAAS,EACjD,CAKAsS,aAAAA,CAAclV,GACZ,OAAOrP,KAAKwkB,cACVnV,EACA,IAAIvD,GAAM9L,KAAKskB,iBAAiBtY,EAAGqD,EAAOiV,iBAAiBvY,GAE/D,CAMA0Y,aAAAA,CAAcpV,GACZ,OAAOrP,KAAKwkB,cACVnV,EACA,IAAIvD,GAAMuD,EAAOiV,iBAAiBtY,EAAGhM,KAAKskB,iBAAiBvY,GAE/D,CAMA2Y,YAAAA,CAAarV,GACX,OAAOrP,KAAKwkB,cAAcnV,EAAQrP,KAAKskB,iBACzC,CAMAK,oBAAAA,CAAqBtV,GACnB,OAAOrP,KAAKwkB,cAAcnV,EAAQrP,KAAK4kB,cACzC,CAMAC,qBAAAA,CAAsBxV,GACpB,OAAOrP,KAAKwkB,cACVnV,EACA,IAAIvD,GAAM9L,KAAK4kB,cAAc5Y,EAAGqD,EAAOiV,iBAAiBvY,GAE5D,CAMA+Y,qBAAAA,CAAsBzV,GACpB,OAAOrP,KAAKwkB,cACVnV,EACA,IAAIvD,GAAMuD,EAAOiV,iBAAiBtY,EAAGhM,KAAK4kB,cAAc7Y,GAE5D,CAMA6Y,WAAAA,GACE,OAAOhQ,GACL5U,KAAKskB,iBACLzP,GAAgB7U,KAAK4e,mBAEzB,CAOA4F,aAAAA,CAAcnV,EAAsB0V,GAClC1V,EAAOvB,MAAMiX,EAAQxe,EAAQA,GAC7B8I,EAAOqQ,YACP1f,KAAKse,mBAAqBte,KAAKyf,kBACjC,CAOAuF,cAAAA,CAAeC,GACb,OAAOjlB,KAAKklB,iBAAiBD,EAC/B,CAOA9K,QAAAA,CAAS8K,GACP,OAAOjlB,KAAKmlB,gBAAgB,WAAYF,EAC1C,CAgBAG,MAAAA,GACE,OAAOplB,KAAKma,UACd,CAOA+K,gBAAAA,CAAiBD,GACf,OAAOjlB,KAAKmlB,gBAAgB,mBAAoBF,EAClD,CAKAE,eAAAA,CACEE,EACAJ,GAEA,MAAM9C,EAAWniB,KAAKmiB,SAChBmD,EACJnD,IAAaA,EAASoD,kBAClBvlB,KAAKwlB,UAAUrD,EAAUkD,EAAYJ,GACrC,KACN,MAAO,CACLQ,QAAS7f,KACNuT,GAAKnZ,KAAMilB,GACdzV,QAASxP,KAAKgP,SACXxF,OAAQ6F,IAAYA,EAAOkW,mBAC3BjN,IAAKM,GACJ5Y,KAAKwlB,UAAU5M,EAAUyM,EAAYJ,OAEtCjlB,KAAK0lB,qBAAqBL,EAAYJ,MACrCK,EAAe,CAAEnD,SAAUmD,GAAiB,KAEpD,CAKUE,SAAAA,CACR5M,EACAyM,EACAJ,GAEA,IAAIU,EAEC3lB,KAAKoe,uBACRuH,EAAgB/M,EAASwF,qBACzBxF,EAASwF,sBAAuB,GAGlC,MAAM/O,EAASuJ,EAASyM,GAAYJ,GAIpC,OAHKjlB,KAAKoe,uBACRxF,EAASwF,uBAAyBuH,GAE7BtW,CACT,CAKAqW,oBAAAA,CACEL,EACAJ,GAEA,MAAMW,EAAY,CAAA,EAChBC,EAAU7lB,KAAKkhB,gBACfC,EAAenhB,KAAKmhB,aACpB2E,EAAU9lB,KAAKie,gBACfE,EAAene,KAAKme,aAiCtB,OA/BIpE,GAAS+L,GACNA,EAAQP,oBACXK,EAAKG,WAAaD,EAAQ3L,SAAS8K,IAE5Ba,IACTF,EAAKG,WAAaD,GAGhB/L,GAASoE,GACNA,EAAaoH,oBAChBK,EAAKI,QAAU7H,EAAahE,SAAS8K,IAE9B9G,IACTyH,EAAKI,QAAU7H,GAGb0H,IAAYA,EAAQN,oBACtBK,EAAK1E,gBAAkBlhB,KAAKwlB,UAC1BK,EACAR,EACAJ,IAGA9D,IAAiBA,EAAaoE,oBAChCK,EAAKzE,aAAenhB,KAAKwlB,UACvBrE,EACAkE,EACAJ,IAIGW,CACT,CA0CAK,KAAAA,GAA8D,IAAxD/jB,EAA0B5B,UAAAC,OAAA,QAAAC,IAAAF,UAAA,GAAAA,UAAA,GAAG,CAAA,EAAI6X,EAAqB7X,UAAAC,OAAA,EAAAD,kBAAAE,EAC1D0B,EAAQiW,QAAUA,EAClB,MAAM+N,EAAmB,GAkBzB,OAhBAlmB,KAAKmmB,gBAAgBD,EAAQhkB,GAC7BlC,KAAKomB,cAAcF,EAAQhkB,GACvBlC,KAAKmiB,UACP+D,EAAO9b,KAAK,sBAAsBpK,KAAKmiB,SAASkE,oBAElDrmB,KAAKsmB,sBAAsBJ,EAAQ,cACnClmB,KAAKumB,sBAAsBL,EAAQ,kBAAmB/N,GACtDnY,KAAKwmB,eAAeN,EAAQ/N,GACxBnY,KAAKmiB,UACP+D,EAAO9b,KAAK,UAEdpK,KAAKsmB,sBAAsBJ,EAAQ,WACnClmB,KAAKumB,sBAAsBL,EAAQ,eAAgB/N,GAEnD+N,EAAO9b,KAAK,UAEL8b,EAAOpM,KAAK,GACrB,CAKAqM,eAAAA,CAAgBD,EAAkBhkB,GAC5BA,EAAQukB,kBAGZP,EAAO9b,KACL,iCACAlI,EAAQwkB,UAAY,QACpB,yBACA,kDACA,wDAEJ,CAKAN,aAAAA,CAAcF,EAAkBhkB,GAC9B,MAAM8P,EAAQ9P,EAAQ8P,OAAS,GAAGhS,KAAKgS,QACrCC,EAAS/P,EAAQ+P,QAAU,GAAGjS,KAAKiS,SACnC4H,EAAsB1Z,EAAO0Z,oBAC7B8M,EAAazkB,EAAQ0kB,QACvB,IAAIA,EACJ,GAAID,EACFC,EAAU,YAAYD,EAAW3a,KAAK2a,EAAW5a,KAAK4a,EAAW3U,SAAS2U,EAAW1U,gBAChF,GAAIjS,KAAKqe,0BAA2B,CACzC,MAAMgC,EAAMrgB,KAAK4e,kBACjBgI,EAAU,YAAYrN,IACnB8G,EAAI,GAAKA,EAAI,GACdxG,MACGN,IAAS8G,EAAI,GAAKA,EAAI,GAAIxG,MAAwBN,GACrDvZ,KAAKgS,MAAQqO,EAAI,GACjBxG,MACGN,GAAQvZ,KAAKiS,OAASoO,EAAI,GAAIxG,MACrC,MACE+M,EAAU,gBAAgB5mB,KAAKgS,SAAShS,KAAKiS,WAG/CiU,EAAO9b,KACL,QACA,sCACA,8CACA,iBACA,UACA4H,EACA,KACA,WACAC,EACA,KACA2U,EACA,0BACA,gCACAhhB,EACA,YACA,WACA5F,KAAK6mB,2BACL7mB,KAAK8mB,6BACL9mB,KAAK+mB,wBAAwB7kB,GAC7B,YAEJ,CAEA6kB,uBAAAA,CAAwB7kB,GACtB,MAAMigB,EAAWniB,KAAKmiB,SACtB,OAAIA,GACFA,EAASkE,WAAa,YAAY9S,OAC3B,iBAAiB4O,EAASkE,kBAAkBlE,EAAS6E,cAC1D9kB,EAAQiW,yBAGL,EACT,CAMA2O,0BAAAA,GACE,MAAQ,CAAC,aAAc,WACpBxO,IAAK1F,IACJ,MAAM8Q,EAAO1jB,KAAK,GAAG4S,UACrB,GAAImH,GAAS2J,GAAO,CAClB,MAAMuD,EAAkBjnB,KAAK,GAAG4S,QAC9ByN,EAAMrgB,KAAK4e,kBACXvP,EAAS,CAEPkB,OAAQA,KAAM,EACdyB,MAAOhS,KAAKgS,OAASiV,EAAkB5G,EAAI,GAAK,GAChDpO,OAAQjS,KAAKiS,QAAUgV,EAAkB5G,EAAI,GAAK,IAEtD,OAAOqD,EAAKuC,MAAM5W,EAAwB,CACxC6X,oBAAqBD,EAAkBrN,GAAYyG,GAAO,IAE9D,IAEDvG,KAAK,GACV,CASA+M,wBAAAA,GACE,MAAMrX,EAA0B,GAC9B2X,EAAoC,CAAA,EACpCtmB,EAAYV,EAAOU,UAErBb,KAAKgP,SAASjO,QAAQ,SAASkL,EAAIoD,GACjCG,EAAQpF,KAAKiF,GACTR,GAAaQ,IACfA,EAAOL,SAASjO,QAAQkL,EAE5B,GAEAuD,EAAQzO,QAAS+P,IACf,KL9hCJhC,EK8hCsBgC,IL1hCgC,mBAA5ChC,EAA4BsY,YK2hChC,OL/hCNtY,MKiiCI,MAAMuY,OAAEA,EAAMrmB,WAAEA,GAAe8P,GAC3BqW,EAASnmB,IAAgBH,EAAUG,KAGvCmmB,EAASnmB,IAAc,EAClBqmB,GAGL5mB,OAAOwY,OAAOoO,GAAQtmB,QAASumB,IAC7B7mB,OAAOwY,OAAOqO,GAAUvmB,QAAQ+D,IAAyB,IAAxB9D,WAAEA,EAAa,IAAI8D,GAC7CqiB,EAASnmB,IAAeH,EAAUG,KACrCmmB,EAASnmB,IAAc,UAM/B,MAAMumB,EAAiB9mB,OAAOU,KAAKgmB,GAChC7O,IACEtX,GACC,yCAAyCA,wBAAiCH,EAAUG,kBAEvF8Y,KAAK,IAER,OAAIyN,EACK,uCAAuCA,iBAEzC,EACT,CAKAf,cAAAA,CAAeN,EAAkB/N,GAC/BnY,KAAKgQ,cAAelB,IACdA,EAAayW,mBAGjBvlB,KAAKwnB,cAActB,EAAQpX,EAAcqJ,IAE7C,CAMAqP,aAAAA,CACEtB,EACAtN,EACAT,GAEA+N,EAAO9b,KAAKwO,EAASqN,MAAM9N,GAC7B,CAKAoO,qBAAAA,CACEL,EACAlT,EACAmF,GAEA,MAAMsP,EAAcznB,KAAKgT,GACrByU,IAAgBA,EAAYlC,mBAAqBkC,EAAYxB,OAC/DC,EAAO9b,KAAKqd,EAAYxB,MAAM9N,GAElC,CAMAmO,qBAAAA,CAAsBJ,EAAkBlT,GACtC,MAAMgH,EAASha,KAAK,GAAGgT,UACvB,GAAKgH,EAGL,GAAID,GAASC,GAAS,CACpB,MAAM0N,EAAU1N,EAAmB0N,QAAU,GAC3CC,EAAa3nB,KAAKgS,MAClB4V,EAAc5nB,KAAKiS,OAEnBiV,EADelnB,KAAK,GAAGgT,QAEnB4G,GAAY/E,GAAgB7U,KAAK4e,oBACjC,GACNsH,EAAO9b,KACL,oBAAoB8c,eAAiCS,EAAa,KAChEC,EAAc,UACP5N,EAAOK,QAAUsN,EAAa,SACrC3N,EAAOkK,QAAU0D,EAAc,aAEnB,aAAXF,GAAoC,cAAXA,IAA2BtN,GAAUJ,GAE3D2N,EADC3N,EAAOZ,OAA4BpH,kBAG5B,aAAX0V,GAAoC,cAAXA,IAA2BtN,GAAUJ,GAE3D4N,EADC5N,EAAOZ,OAA4BnH,4BAEpB+H,EAAO1G,iBAEjC,MACE4S,EAAO9b,KACL,gDACA,SACA4P,EACA,IACA,aAGN,CA4BA6N,YAAAA,CACEC,EACA3P,GAEe,IADfb,OAAEA,GAAmBhX,UAAAC,OAAA,QAAAC,IAAAF,UAAA,GAAAA,UAAA,GAAG,CAAA,EAExB,IAAKwnB,EACH,OAAO3T,QAAQqD,OAAO,IAAIzV,EAAY,wBAIxC,MAAMyN,QAAEA,EAAU,MAAOuY,GACP,iBAATD,EAAoB/f,KAAKigB,MAAMF,GAAQA,GAC1C5G,gBAAEA,EAAe6E,WAAEA,EAAU5E,aAAEA,EAAY6E,QAAEA,EAAO7D,SAAEA,GAC1D4F,EACIzJ,EAAoBte,KAAKse,kBAG/B,OAFAte,KAAKse,mBAAoB,EAElBnK,QAAQkE,IAAI,CACjBH,GAA6B1I,EAAS,CACpC2I,UACAb,WAEFwB,GACE,CACEoI,kBACAjD,gBAAiB8H,EACjB5E,eACAhD,aAAc6H,EACd7D,YAEF,CAAE7K,aAEHkB,KAAKjO,IAA2B,IAAzB2O,EAAS+O,GAAW1d,EAM5B,OALAvK,KAAKihB,QACLjhB,KAAKiM,OAAOiN,GACZlZ,KAAKyI,IAAIsf,GACT/nB,KAAKyI,IAAIwf,GACTjoB,KAAKse,kBAAoBA,EAClBte,MAEX,CAMAmO,KAAAA,CAAM+Z,GACJ,MAAMtC,EAAO5lB,KAAKma,SAAS+N,GAE3B,OADeloB,KAAKmoB,mBACNN,aAAajC,EAC7B,CAMAuC,gBAAAA,GACE,MAAM9M,EAAKzH,GAAuB5T,MAClC,OAAO,IAAKA,KAAKF,YAAkCub,EACrD,CAwCAvH,SAAAA,GAAmD,IAAzC5R,EAAO5B,UAAAC,OAAA,QAAAC,IAAAF,UAAA,GAAAA,UAAA,GAAG,CAAA,EAClB,MAAM0T,OACJA,EAAS,MAAKC,QACdA,EAAU,EAACmU,WACXA,EAAa,EAAC5J,oBACdA,GAAsB,GACpBtc,EACEmmB,EACJD,GAAc5J,EAAsBxe,KAAK2f,mBAAqB,GAEhE,OAAO7L,GACL9T,KAAKsoB,gBAAgBD,EAAiBnmB,GACtC8R,EACAC,EAEJ,CACAC,MAAAA,GAA8D,IAAvDhS,EAAO5B,UAAAC,OAAA,QAAAC,IAAAF,UAAA,GAAAA,UAAA,GAAG,CAAA,EACf,MAAM0T,OACJA,EAAS,MAAKC,QACdA,EAAU,EAACmU,WACXA,EAAa,EAAC5J,oBACdA,GAAsB,GACpBtc,EACEmmB,EACJD,GAAc5J,EAAsBxe,KAAK2f,mBAAqB,GAEhE,OAAOzL,GACLlU,KAAKsoB,gBAAgBD,EAAiBnmB,GACtC8R,EACAC,EAEJ,CAgBAqU,eAAAA,GAGqB,IAFnBF,EAAU9nB,UAAAC,OAAA,QAAAC,IAAAF,UAAA,GAAAA,UAAA,GAAG,GACb0R,MAAEA,EAAKC,OAAEA,EAAMH,KAAEA,EAAIC,IAAEA,EAAGvI,OAAEA,GAAQlJ,UAAAC,OAAA,QAAAC,IAAAF,UAAA,GAAAA,UAAA,GAAG,CAAA,EAEvC,MAAMioB,GAAevW,GAAShS,KAAKgS,OAASoW,EAC1CI,GAAgBvW,GAAUjS,KAAKiS,QAAUmW,EACzCK,EAAOzoB,KAAKmgB,UACZuI,EAAgB1oB,KAAKgS,MACrB2W,EAAiB3oB,KAAKiS,OACtB2W,EAA8B5oB,KAAKuf,oBACnCsJ,EAAUJ,EAAOL,EACjBU,EAAK9oB,KAAK4e,kBAGVmK,EAAQ,CAACF,EAAS,EAAG,EAAGA,GAFVC,EAAG,IAAMhX,GAAQ,IAAMsW,GACvBU,EAAG,IAAM/W,GAAO,IAAMqW,GAEpCY,EAAiBhpB,KAAKwe,oBACtBzK,EAAWH,GAAuB,CAChC5B,MAAOuW,EACPtW,OAAQuW,IAEVS,EAAkBzf,EACdxJ,KAAKgP,SAASxF,OAAQsH,GAAQtH,EAAOsH,IACrC9Q,KAAKgP,SAcX,OAbAhP,KAAKwe,qBAAsB,EAC3Bxe,KAAK4e,kBAAoBmK,EACzB/oB,KAAKgS,MAAQuW,EACbvoB,KAAKiS,OAASuW,EACdxoB,KAAKuf,qBAAsB,EAC3Bvf,KAAKwf,yBACLxf,KAAKuhB,aAAaxN,EAAS3Q,WAAW,MAAQ6lB,GAC9CjpB,KAAK4e,kBAAoBkK,EACzB9oB,KAAKgS,MAAQ0W,EACb1oB,KAAKiS,OAAS0W,EACd3oB,KAAKwf,yBACLxf,KAAKwe,oBAAsBwK,EAC3BhpB,KAAKuf,oBAAsBqJ,EACpB7U,CACT,CAOA1P,OAAAA,GAKE,OAJCrE,KAAK0hB,UACJ1hB,KAAKgf,SAASrC,WAAW,CAAE3K,MAAOhS,KAAKgS,MAAOC,OAAQjS,KAAKiS,SAC7DnJ,EAAkBS,eAAevJ,MACjCA,KAAK0hB,UAAW,EACT,IAAIvN,QAAiB,CAACC,EAASoD,KACpC,MAAM0R,EAAOA,KACXlpB,KAAKmpB,UACL/U,GAAQ,IAEV8U,EAAKE,KAAO5R,EACRxX,KAAK+iB,eACP/iB,KAAK+iB,cAAcqG,KAAK,WAGtBppB,KAAKshB,UACPlN,GAAQ,GACCpU,KAAKyhB,iBACdzhB,KAAK+iB,cAAgBmG,EAErBA,KAGN,CAgBAC,OAAAA,GACEnpB,KAAKshB,WAAY,EACjBthB,KAAKqhB,wBACLrhB,KAAKgQ,cAAeX,GAAWA,EAAOhL,WACtCrE,KAAKgP,SAAW,GACZhP,KAAKkhB,iBACPlhB,KAAKkhB,gBAAgB7c,UAEvBrE,KAAKkhB,qBAAkB1gB,EACnBR,KAAKmhB,cACPnhB,KAAKmhB,aAAa9c,UAEpBrE,KAAKmhB,kBAAe3gB,EACpBR,KAAKgf,SAAS3a,SAChB,CAMAwJ,QAAAA,GACE,MAAO,aAAa7N,KAAK+Q,6BACvB/Q,KAAKgP,SAASzO,WAElB,EACDR,EA72CY8e,GAAY,cAwFFd,ICzKvB,MAAMsL,GAAc,CAAC,aAAc,YAAa,YAUzC,MAAMC,GAAcC,IACzB,MACEC,EAASjP,GADKgP,EAAM7f,QAEpB+f,EAXJ,SAAsBF,GACpB,MAAMG,EAAaH,EAAqBI,eACxC,OAAID,GAAaA,EAAU,GAClBA,EAAU,GAEZH,CACT,CAKWK,CAAaL,GACtB,OAAO,IAAIzd,GAAM2d,EAAKI,QAAUL,EAAO1X,KAAM2X,EAAKK,QAAUN,EAAOzX,MAGxDgY,GAAgBR,GAC3BF,GAAYzY,SAAS2Y,EAAM7gB,OACa,UAAvC6gB,EAAuBS,YAEbC,GAAaC,IACxBA,EAAEC,iBACFD,EAAEE,mBCnBSC,GAA6BC,IACxC,IAAIxY,EAAO,EACTC,EAAM,EACNC,EAAQ,EACRC,EAAS,EAEX,IAAK,IAAI9G,EAAI,EAAGoY,EAAM+G,EAAO/pB,OAAQ4K,EAAIoY,EAAKpY,IAAK,CACjD,MAAMa,EAAEA,EAACD,EAAEA,GAAMue,EAAOnf,IACpBa,EAAIgG,IAAU7G,KAAG6G,EAAQhG,IACzBA,EAAI8F,IAAS3G,KAAG2G,EAAO9F,IACvBD,EAAIkG,IAAW9G,KAAG8G,EAASlG,IAC3BA,EAAIgG,IAAQ5G,KAAG4G,EAAMhG,EAC3B,CAEA,MAAO,CACL+F,OACAC,MACAC,MAAOA,EAAQF,EACfG,OAAQA,EAASF,ICgBRwY,GAAuBA,CAAClb,EAAsBV,IACzD6b,GACEnb,EACA2F,GAA0BrG,EAAWU,EAAOob,kBAQnCD,GAAyBA,CACpCnb,EACAV,KAEA,MAAMsH,WAAEA,EAAUC,WAAEA,EAAUL,OAAEA,EAAMC,OAAEA,KAAW4U,GAC/ChV,GAAY/G,GACdoW,EAAS,IAAIjZ,GAAMmK,EAAYC,GACjC7G,EAAO0H,OAAQ,EACf1H,EAAO2H,OAAQ,EACfvW,OAAOC,OAAO2O,EAAQqb,GACtBrb,EAAO5G,IAAI,CAAEoN,SAAQC,WACrBzG,EAAOsb,oBAAoB5F,EAAQxe,EAAQA,IAMhCqkB,GAAwBlhB,IACnCA,EAAOmM,OAAS,EAChBnM,EAAOoM,OAAS,EAChBpM,EAAOqM,MAAQ,EACfrM,EAAOsM,MAAQ,EACftM,EAAOqN,OAAQ,EACfrN,EAAOsN,OAAQ,EACftN,EAAO0E,OAAO,IAQHyc,GAAuBnhB,IAAoB,CACtDmM,OAAQnM,EAAOmM,OACfC,OAAQpM,EAAOoM,OACfC,MAAOrM,EAAOqM,MACdC,MAAOtM,EAAOsM,MACdvK,MAAO/B,EAAO+B,MACdqG,KAAMpI,EAAOoI,KACbiF,MAAOrN,EAAOqN,MACdC,MAAOtN,EAAOsN,MACdjF,IAAKrI,EAAOqI,MAYD+Y,GAAqBA,CAChC9Y,EACAC,EACA1E,KAEA,MAAMwd,EAAO/Y,EAAQ,EACnBgZ,EAAO/Y,EAAS,EAChBqY,EAAS,CACP,IAAIxe,IAAOif,GAAOC,GAClB,IAAIlf,GAAMif,GAAOC,GACjB,IAAIlf,IAAOif,EAAMC,GACjB,IAAIlf,GAAMif,EAAMC,IAChB1S,IAAK5J,GAAMA,EAAEC,UAAUpB,IACzB0d,EAAOZ,GAA0BC,GACnC,OAAO,IAAIxe,GAAMmf,EAAKjZ,MAAOiZ,EAAKhZ,SC1GvBiZ,GAAwB,WAAA,IACnCC,EAAY7qB,UAAAC,OAAA,QAAAC,IAAAF,UAAA,GAAAA,UAAA,GAAG6F,EACK,OACjB6O,GAA0BH,GADnBvU,UAAAC,OAAA,QAAAC,IAAAF,UAAA,GAAAA,UAAA,GAAG6F,GACqCglB,EAAK,EAkB5CC,GAAmB,SAC9B7K,GAAY,IACZ4K,EAAY7qB,UAAAC,OAAA,QAAAC,IAAAF,UAAA,GAAAA,UAAA,GAAG6F,EACfklB,EAAU/qB,UAAAC,OAAA,QAAAC,IAAAF,UAAA,GAAAA,UAAA,GAAG6F,EAAO,OACVoa,EAAM5R,UAAUuc,GAAsBC,EAAME,GAAI,EAK/CC,GAAoB,SAC/B/K,GAAY,IACZ4K,EAAY7qB,UAAAC,OAAA,QAAAC,IAAAF,UAAA,GAAAA,UAAA,GAAG6F,EACfklB,EAAU/qB,UAAAC,OAAA,QAAAC,IAAAF,UAAA,GAAAA,UAAA,GAAG6F,EAAO,OACVoa,EAAM5R,UAAUuc,GAAsBC,EAAME,IAAK,EAAK,EAgCrDE,GAAoBA,CAC/Blc,EACA8b,EACAE,KAEA,MAAM9d,EAAI2d,GAAsBC,EAAME,GAKtC,OAJAb,GACEnb,EACA2F,GAA0BzH,EAAG8B,EAAOob,kBAE/Bld,GCrFIie,GAAYA,CACvBthB,EACAhI,KACG,IAAAupB,EACH,MACE9c,WAAWjF,OAAEA,IACXxH,EACS,QAAbupB,EAAA/hB,EAAOvG,cAAM,IAAAsoB,GAAbA,EAAe1gB,KAAK,UAAUb,IAAa,IACtChI,EACHwH,WAEFA,EAAOqB,KAAKb,EAAWhI,ICdnBwpB,GAAe,CACnB5Z,MAAM,GACNC,KAAK,GACLgT,OAAQ,EACR4G,OAAQ,GACRC,MAAO,IASIC,GACXC,GAEuB,iBAAhBA,EACHJ,GAAaI,GACbA,EAAc,GCjBdC,GAAc,IAAIjgB,GAAM,EAAG,GAC3BkgB,GAAO,IAAIlgB,GAQJmgB,GAAeA,CAACC,EAAe7d,IAC1C6d,EAAO9d,OAAOC,GASH8d,GAAeA,CAAChB,EAAUE,IACrC,IAAIvf,GAAMuf,GAAI9e,SAAS4e,GAMZiB,GAAa7L,GAAiBA,EAAM9S,aAAaue,IAQjDK,GAA0BA,CAACvX,EAAUG,IAChDvQ,KAAK+Q,MAAM6W,GAAaxX,EAAGG,GAAIsX,GAAWzX,EAAGG,IAOlCuX,GAAsBvK,GACjCoK,GAAwBN,GAAa9J,GAM1BwK,GAAiBxK,GAC5BA,EAAEhV,GAAG+e,IAAQ/J,EAAIA,EAAElV,aAAaqf,GAAUnK,IAO/ByK,GAAuB,SAClCzK,GAAQ,IACR0K,IAAgBrsB,UAAAC,OAAA,QAAAC,IAAAF,UAAA,KAAAA,UAAA,GAAO,OAEvBmsB,GAAc,IAAI3gB,IAAOmW,EAAElW,EAAGkW,EAAEjW,GAAGY,eAAe+f,EAAmB,GAAI,GAAI,EAQlEL,GAAeA,CAACxX,EAAUG,IACrCH,EAAE9I,EAAIiJ,EAAElJ,EAAI+I,EAAE/I,EAAIkJ,EAAEjJ,EAQTugB,GAAaA,CAACzX,EAAUG,IAAqBH,EAAE9I,EAAIiJ,EAAEjJ,EAAI8I,EAAE/I,EAAIkJ,EAAElJ,EAWjE6gB,GAAmBA,CAACrf,EAAUuH,EAAUG,KACnD,GAAI1H,EAAEN,GAAG6H,IAAMvH,EAAEN,GAAGgI,GAAI,OAAO,EAC/B,MAAM4X,EAAMP,GAAaxX,EAAGG,GAC1B6X,EAAMR,GAAaxX,EAAGvH,GACtBwf,EAAMT,GAAarX,EAAG1H,GACxB,OAAOsf,GAAO,EAAIC,GAAO,GAAKC,GAAO,IAAMD,GAAO,GAAKC,GAAO,ICjFnDC,GAAqB,cA0B3B,SAASC,GAAoBte,GAClC,OACEkd,GAAcld,EAAUue,WAAarB,GAActlB,IACnDslB,GAAcld,EAAUwe,WAAatB,GAActlB,EAEvD,CAEO,SAAS6mB,GAAa9e,GAC3B,MAAgC,GAAxBud,GAAcvd,EACxB,CAEO,MAAM+e,GAAWA,CACtB3jB,EACA4jB,IASG5jB,EAAO4jB,GAECC,GAGTA,CAACC,EAAW7e,EAAW3C,EAAGD,KACrB,CACLme,EAAGsD,EACH7e,YACA8e,QAAS,IAAI3hB,GAAME,EAAGD,KAWnB,SAAS2hB,GACd5e,EACA6e,EACAC,GAEA,MAAMlkB,EAASkkB,EACT7I,EAASqG,GACbtc,EAAawV,iBACbxV,EAAa3L,OAAQyb,uBACrBpe,GAEIiL,EAAQ+gB,GAAmBL,GAAapH,EAAQrb,IAAWzD,EACjE,OAAOvB,KAAKmpB,MAAOpiB,EAAQxF,EAAaD,EAC1C,CAqCO,SAAS8nB,GAAahpB,EAE3BooB,EACAC,EACAnhB,EACAD,GACA,IAAA0f,EAAA,IALA/hB,OAAEA,EAAMqkB,OAAEA,GAAmBjpB,EAM7B,MAAM6oB,EAAUjkB,EAAOskB,SAASD,GAC9BtF,GAAoB,QAAbgD,EAAA/hB,EAAOvG,cAAM,IAAAsoB,OAAA,EAAbA,EAAetL,YAAa,EACnC8N,EAAUvkB,EAAOukB,QAAUxF,EAC3ByF,EA1CJ,SACExkB,EACA6W,EACA2M,EACAC,GAEA,MAAMpI,EAASrb,EAAOykB,yBACpBzf,OACqB,IAAZwe,QAA8C,IAAZC,EACrCzjB,EAAO0kB,uBACLrJ,EACAxe,EACAA,EACA2mB,EACAC,GAEF,IAAIrhB,GAAMpC,EAAOoI,KAAMpI,EAAOqI,KAItC,OAHOrI,EAAO+B,MACR8U,EAAMnS,QAAQkG,GAAiB5K,EAAO+B,OAAQsZ,GAC9CxE,GACIhU,SAASmC,EACrB,CAqBiB2f,CAAe3kB,EAAQ,IAAIoC,GAAME,EAAGD,GAAImhB,EAASC,GAehE,OAdIe,EAAWliB,GAAKiiB,IAClBC,EAAWliB,GAAKiiB,GAEdC,EAAWliB,IAAMiiB,IACnBC,EAAWliB,GAAKiiB,GAEdC,EAAWniB,GAAKkiB,IAClBC,EAAWniB,GAAKkiB,GAEdC,EAAWniB,GAAKkiB,IAClBC,EAAWniB,GAAKkiB,GAElBC,EAAWliB,GAAK2hB,EAAQtT,QACxB6T,EAAWniB,GAAK4hB,EAAQzJ,QACjBgK,CACT,CCnJO,MAAMI,GAAsCA,CACjDd,EACA7e,EACA3C,EACAD,KAEA,MAAMrC,OAAEA,EAAM2Q,QAAEA,EAAO6J,QAAEA,GAAYvV,EACnC4f,EAAUviB,EAAIqO,EACdmU,EAASziB,EAAImY,EACbuK,GAASpB,GAAS3jB,EAAQ,kBAAoBA,EAAOoI,OAASyc,EAC9DG,GAASrB,GAAS3jB,EAAQ,kBAAoBA,EAAOqI,MAAQyc,EAM/D,OALAC,GAAS/kB,EAAOjB,IAAIjC,EAAM+nB,GAC1BG,GAAShlB,EAAOjB,IAAIhC,EAAK+nB,IACrBC,GAASC,IACXlD,GAAU1kB,EAAQymB,GAAgBC,EAAW7e,EAAW3C,EAAGD,IAEtD0iB,GAASC,GC1BLC,GAAe,CAC1BC,UAAW,UACXC,aAAc,UACdC,KAAM,OACNC,WAAY,UACZC,MAAO,UACPC,MAAO,UACPC,OAAQ,UACRC,MAAO,OACPC,eAAgB,UAChBC,KAAM,OACNC,WAAY,UACZC,MAAO,UACPC,UAAW,UACXC,UAAW,UACXC,WAAY,UACZC,UAAW,UACXC,MAAO,UACPC,eAAgB,UAChBC,SAAU,UACVC,QAAS,UACTC,KAAM,OACNC,SAAU,UACVC,SAAU,UACVC,cAAe,UACfC,SAAU,UACVC,SAAU,UACVC,UAAW,UACXC,UAAW,UACXC,YAAa,UACbC,eAAgB,UAChBC,WAAY,UACZC,WAAY,UACZC,QAAS,UACTC,WAAY,UACZC,aAAc,UACdC,cAAe,UACfC,cAAe,UACfC,cAAe,UACfC,cAAe,UACfC,WAAY,UACZC,SAAU,UACVC,YAAa,UACbC,QAAS,UACTC,QAAS,UACTC,WAAY,UACZC,UAAW,UACXC,YAAa,UACbC,YAAa,UACbC,QAAS,OACTC,UAAW,UACXC,WAAY,UACZC,KAAM,UACNC,UAAW,UACXC,KAAM,UACNC,KAAM,UACNC,MAAO,UACPC,YAAa,UACbC,SAAU,UACVC,QAAS,UACTC,UAAW,UACXC,OAAQ,UACRC,MAAO,UACPC,MAAO,UACPC,SAAU,UACVC,cAAe,UACfC,UAAW,UACXC,aAAc,UACdC,UAAW,UACXC,WAAY,UACZC,UAAW,UACXC,qBAAsB,UACtBC,UAAW,UACXC,UAAW,UACXC,WAAY,UACZC,UAAW,UACXC,YAAa,UACbC,cAAe,UACfC,aAAc,UACdC,eAAgB,OAChBC,eAAgB,OAChBC,eAAgB,UAChBC,YAAa,UACbC,KAAM,OACNC,UAAW,UACXC,MAAO,UACPC,QAAS,OACTC,OAAQ,UACRC,iBAAkB,UAClBC,WAAY,UACZC,aAAc,UACdC,aAAc,UACdC,eAAgB,UAChBC,gBAAiB,UACjBC,kBAAmB,UACnBC,gBAAiB,UACjBC,gBAAiB,UACjBC,aAAc,UACdC,UAAW,UACXC,UAAW,UACXC,SAAU,UACVC,YAAa,UACbC,KAAM,UACNC,QAAS,UACTC,MAAO,UACPC,UAAW,UACXC,OAAQ,UACRC,UAAW,UACXC,OAAQ,UACRC,cAAe,UACfC,UAAW,UACXC,cAAe,UACfC,cAAe,UACfC,WAAY,UACZC,UAAW,UACXC,KAAM,UACNC,KAAM,UACNC,KAAM,UACNC,WAAY,UACZC,OAAQ,UACRC,cAAe,OACfC,IAAK,OACLC,UAAW,UACXC,UAAW,UACXC,YAAa,UACbC,OAAQ,UACRC,WAAY,UACZC,SAAU,UACVC,SAAU,UACVC,OAAQ,UACRC,OAAQ,UACRC,QAAS,UACTC,UAAW,UACXC,UAAW,UACXC,UAAW,UACXC,KAAM,UACNC,YAAa,UACbC,UAAW,UACX1gB,IAAK,UACL2gB,KAAM,UACNC,QAAS,UACTC,OAAQ,UACRC,UAAW,UACXC,OAAQ,UACRC,MAAO,UACPC,MAAO,OACPC,WAAY,UACZC,OAAQ,OACRC,YAAa,WChJFC,GAAUA,CAACrpB,EAAWspB,EAAWzqB,KACxCA,EAAI,IACNA,GAAK,GAEHA,EAAI,IACNA,GAAK,GAEHA,EAAI,EAAI,EACHmB,EAAc,GAATspB,EAAItpB,GAASnB,EAEvBA,EAAI,GACCyqB,EAELzqB,EAAI,EAAI,EACHmB,GAAKspB,EAAItpB,IAAM,EAAI,EAAInB,GAAK,EAE9BmB,GAWIupB,GAAUA,CACrBljB,EACAmjB,EACAjjB,EACAH,KAEAC,GAAK,IACLmjB,GAAK,IACLjjB,GAAK,IACL,MAAMkjB,EAAWzzB,KAAKC,IAAIoQ,EAAGmjB,EAAGjjB,GAC9BmjB,EAAW1zB,KAAK8I,IAAIuH,EAAGmjB,EAAGjjB,GAE5B,IAAIojB,EAAYC,EAChB,MAAMC,GAAKJ,EAAWC,GAAY,EAElC,GAAID,IAAaC,EACfC,EAAIC,EAAI,MACH,CACL,MAAM9tB,EAAI2tB,EAAWC,EAErB,OADAE,EAAIC,EAAI,GAAM/tB,GAAK,EAAI2tB,EAAWC,GAAY5tB,GAAK2tB,EAAWC,GACtDD,GACN,KAAKpjB,EACHsjB,GAAKH,EAAIjjB,GAAKzK,GAAK0tB,EAAIjjB,EAAI,EAAI,GAC/B,MACF,KAAKijB,EACHG,GAAKpjB,EAAIF,GAAKvK,EAAI,EAClB,MACF,KAAKyK,EACHojB,GAAKtjB,EAAImjB,GAAK1tB,EAAI,EAGtB6tB,GAAK,CACP,CAEA,MAAO,CAAC3zB,KAAKmpB,MAAU,IAAJwK,GAAU3zB,KAAKmpB,MAAU,IAAJyK,GAAU5zB,KAAKmpB,MAAU,IAAJ0K,GAAUzjB,IAG5D0jB,GAAmB,WAAA,IAACltB,EAAKhL,UAAAC,OAAA,QAAAC,IAAAF,UAAA,GAAAA,UAAA,GAAG,IAAG,OAC1CoZ,WAAWpO,IAAUA,EAAMmtB,SAAS,KAAO,IAAM,EAAE,EAKxCC,GAAUptB,GACrB5G,KAAK8I,IAAI9I,KAAKmpB,MAAMviB,GAAQ,KAAKuC,SAAS,IAAI8qB,cAAcC,SAAS,EAAG,KAK7DC,GAAc/zB,IAKe,IAJxCiQ,EACAmjB,EACAjjB,EACAH,EAAI,GACahQ,EACjB,MAAMg0B,EAAMp0B,KAAKmpB,MAAU,GAAJ9Y,EAAc,IAAJmjB,EAAe,IAAJjjB,GAC5C,MAAO,CAAC6jB,EAAKA,EAAKA,EAAKhkB,IC3ElB,MAAMikB,GAQXj5B,WAAAA,CAAYk5B,GACV,GAD6Bj5B,yBANd,GAOVi5B,EAGE,GAAIA,aAAiBD,GAC1B/4B,KAAKi5B,UAAU,IAAID,EAAME,eACpB,GAAIt3B,MAAMmN,QAAQiqB,GAAQ,CAC/B,MAAOjkB,EAAGmjB,EAAGjjB,EAAGH,EAAI,GAAKkkB,EACzBh5B,KAAKi5B,UAAU,CAAClkB,EAAGmjB,EAAGjjB,EAAGH,GAC3B,MACE9U,KAAKi5B,UAAUj5B,KAAKm5B,iBAAiBH,SAPrCh5B,KAAKi5B,UAAU,CAAC,EAAG,EAAG,EAAG,GAS7B,CAOUE,gBAAAA,CAAiBH,GAKzB,OAJAA,EAAQA,EAAM/zB,iBACD0pB,KACXqK,EAAQrK,GAAaqK,IAEN,gBAAVA,EACF,CAAC,IAAK,IAAK,IAAK,GACjBD,GAAMK,cAAcJ,IAClBD,GAAMM,cAAcL,IACpBD,GAAMO,cAAcN,KAIlBh5B,KAAKu5B,gBAAiB,IAAU,CAAC,EAAG,EAAG,EAAG,EACpD,CAMAC,SAAAA,GACE,OAAOx5B,KAAKk5B,OACd,CAMAD,SAAAA,CAAU7f,GACRpZ,KAAKk5B,QAAU9f,CACjB,CAMAqgB,KAAAA,GACE,MAAO1kB,EAAGmjB,EAAGjjB,GAAKjV,KAAKw5B,YACvB,MAAO,OAAOzkB,KAAKmjB,KAAKjjB,IAC1B,CAMAykB,MAAAA,GACE,MAAO,QAAQ15B,KAAKw5B,YAAY1f,KAAK,OACvC,CAMA6f,KAAAA,GACE,MAAOtB,EAAGC,EAAGC,GAAKN,MAAWj4B,KAAKw5B,aAClC,MAAO,OAAOnB,KAAKC,MAAMC,KAC3B,CAMAqB,MAAAA,GACE,MAAOvB,EAAGC,EAAGC,EAAGzjB,GAAKmjB,MAAWj4B,KAAKw5B,aACrC,MAAO,QAAQnB,KAAKC,MAAMC,MAAMzjB,IAClC,CAMA+kB,KAAAA,GAEE,OADgB75B,KAAK85B,SACNC,MAAM,EAAG,EAC1B,CAMAD,MAAAA,GACE,MAAO/kB,EAAGmjB,EAAGjjB,EAAGH,GAAK9U,KAAKw5B,YAC1B,MAAO,GAAGd,GAAO3jB,KAAK2jB,GAAOR,KAAKQ,GAAOzjB,KAAKyjB,GAAOh0B,KAAKmpB,MAAU,IAAJ/Y,KAClE,CAMAklB,QAAAA,GACE,OAAOh6B,KAAKw5B,YAAY,EAC1B,CAOAS,QAAAA,CAASC,GAEP,OADAl6B,KAAKk5B,QAAQ,GAAKgB,EACXl6B,IACT,CAMAm6B,WAAAA,GAEE,OADAn6B,KAAKi5B,UAAUJ,GAAY74B,KAAKw5B,cACzBx5B,IACT,CAOAo6B,YAAAA,CAAaC,GACX,MAAOC,EAAO,CAAA,CAAMxlB,GAAK+jB,GAAY74B,KAAKw5B,aACxCe,EAAOD,GAAWD,GAAa,KAAO,EAAI,IAE5C,OADAr6B,KAAKi5B,UAAU,CAACsB,EAAMA,EAAMA,EAAMzlB,IAC3B9U,IACT,CAOAw6B,WAAAA,CAAYC,GACJA,aAAsB1B,KAC1B0B,EAAa,IAAI1B,GAAM0B,IAGzB,MAAMrhB,EAASpZ,KAAKw5B,YAElBkB,EAAcD,EAAWjB,aACxBmB,EAAGC,EAAGC,GAAKzhB,EAAOd,IAAI,CAAChN,EAAOtC,IAC7BtE,KAAKmpB,MAAW,GAALviB,EAHA,GAG2BovB,EAAY1xB,KAItD,OADAhJ,KAAKi5B,UAAU,CAAC0B,EAAGC,EAAGC,EAAGzhB,EAAO,KACzBpZ,IACT,CAOA,cAAO86B,CAAQ9B,GACb,OAAOD,GAAMgC,SAAS/B,EACxB,CAOA,eAAO+B,CAAS/B,GACd,OAAO,IAAID,GAAMA,GAAMM,cAAcL,GACvC,CAOA,oBAAOK,CAAcL,GACnB,MAAMgC,EAAQhC,EAAMgC,MC9JtB,oJD+JE,GAAIA,EAAO,CACT,MAAOjmB,EAAGmjB,EAAGjjB,GAAK+lB,EAAMjB,MAAM,EAAG,GAAGzhB,IAAKhN,IACvC,MAAM2vB,EAAcvhB,WAAWpO,GAC/B,OAAOA,EAAMmtB,SAAS,KAClB/zB,KAAKmpB,MAAoB,KAAdoN,GACXA,IAEN,MAAO,CAAClmB,EAAGmjB,EAAGjjB,EAAGujB,GAAiBwC,EAAM,IAC1C,CACF,CAOA,cAAOE,CAAQlC,GACb,OAAOD,GAAMoC,SAASnC,EACxB,CAOA,eAAOmC,CAASnC,GACd,OAAO,IAAID,GAAMA,GAAMO,cAAcN,GACvC,CASA,oBAAOM,CAAcN,GACnB,MAAMgC,EAAQhC,EAAMgC,MC9ItB,oKD+IE,IAAKA,EACH,OAEF,MAEM3C,GAFgBU,GAAMqC,oBAAoBJ,EAAM,IAEzB,IAAO,KAAO,IAAO,IAChD1C,EAAI5e,WAAWshB,EAAM,IAAM,IAC3BzC,EAAI7e,WAAWshB,EAAM,IAAM,IAC7B,IAAIjmB,EAAWmjB,EAAWjjB,EAE1B,GAAU,IAANqjB,EACFvjB,EAAImjB,EAAIjjB,EAAIsjB,MACP,CACL,MAAMP,EAAIO,GAAK,GAAMA,GAAKD,EAAI,GAAKC,EAAID,EAAIC,EAAID,EAC7C5pB,EAAQ,EAAJ6pB,EAAQP,EAEdjjB,EAAIgjB,GAAQrpB,EAAGspB,EAAGK,EAAI,EAAI,GAC1BH,EAAIH,GAAQrpB,EAAGspB,EAAGK,GAClBpjB,EAAI8iB,GAAQrpB,EAAGspB,EAAGK,EAAI,EAAI,EAC5B,CAEA,MAAO,CACL3zB,KAAKmpB,MAAU,IAAJ9Y,GACXrQ,KAAKmpB,MAAU,IAAJqK,GACXxzB,KAAKmpB,MAAU,IAAJ5Y,GACXujB,GAAiBwC,EAAM,IAE3B,CAOA,cAAOK,CAAQrC,GACb,OAAO,IAAID,GAAMA,GAAMK,cAAcJ,GACvC,CAOA,oBAAOI,CAAcJ,GACnB,GAAIA,EAAMgC,MCtLa,6CDsLG,CACxB,MAAM1vB,EAAQ0tB,EAAMe,MAAMf,EAAM/vB,QAAQ,KAAO,GAE/C,IAAIqyB,EAEFA,EAHkBhwB,EAAM/K,QAAU,EAGlB+K,EAAMiwB,MAAM,IAAIjjB,IAAKkjB,GAAQA,EAAMA,GAEnClwB,EAAM0vB,MAAM,SAE9B,MAAOjmB,EAAGmjB,EAAGjjB,EAAGH,EAAI,KAAOwmB,EAAchjB,IAAKmjB,GAC5Cte,SAASse,EAAW,KAEtB,MAAO,CAAC1mB,EAAGmjB,EAAGjjB,EAAGH,EAAI,IACvB,CACF,CAQA,0BAAOsmB,CAAoB9vB,GACzB,MAAMowB,EAAYpwB,EAAMrG,cAClB02B,EAAUjiB,WAAWgiB,GAE3B,OAAIA,EAAU9qB,SAAS,OACd4D,GAAiBmnB,GAGtBD,EAAU9qB,SAAS,QACJ,IAAV+qB,EAIFA,CACT,EEhUK,MAoCMC,GAAY,SAACtwB,GAAoD,IAArCuwB,EAAQv7B,UAAAC,OAAA,QAAAC,IAAAF,UAAA,GAAAA,UAAA,GAAG+F,EAClD,MAAMy1B,EAAO,WAAWC,KAAKzwB,GAC3BkO,EAASE,WAAWpO,GAChB0wB,EAAM77B,EAAO87B,IACnB,OAAQH,eAAAA,EAAO,IACb,IAAK,KACH,OAAQtiB,EAASwiB,EAAO,KAE1B,IAAK,KACH,OAAQxiB,EAASwiB,EAAO,KAE1B,IAAK,KACH,OAAOxiB,EAASwiB,EAElB,IAAK,KACH,OAAQxiB,EAASwiB,EAAO,GAE1B,IAAK,KACH,OAASxiB,EAASwiB,EAAO,GAAM,GAEjC,IAAK,KACH,OAAOxiB,EAASqiB,EAElB,QACE,OAAOriB,EAEb,EA6Ba0iB,GACXC,IAEA,MAAOC,EAAWC,GAAcF,EAAUG,OAAOf,MAAM,MAIhDgB,EAAQC,IAvBGC,EAuBkBL,IArBvBK,IAAU71B,EACd,CAAC61B,EAAM1C,MAAM,EAAG,GAAiB0C,EAAM1C,MAAM,EAAG,IAC9C0C,IAAU71B,EACZ,CAAC61B,EAAOA,GAEV,CAAC,MAAO,OAPGA,MAwBlB,MAAO,CACLC,YAAaL,GAAc,OAC3BE,SACAC,WAYSG,GAAiB,SAC5B/pB,EACAtH,GAEG,IACCsxB,EACAC,EAHJC,IAAWx8B,UAAAC,OAAA,QAAAC,IAAAF,UAAA,KAAAA,UAAA,GAIX,GAAKgL,EAEE,GAAIA,EAAM2O,OACf2iB,EAAa,cAActxB,EAAMgI,UAC5B,CACL,MAAM0lB,EAAQ,IAAID,GAAMztB,GACtByxB,EAAU/D,EAAMgB,WAElB4C,EAAa5D,EAAMS,QACH,IAAZsD,IACFF,EAAeE,EAAQlvB,WAE3B,MAXE+uB,EAAa,OAYf,OAAIE,EACK,GAAGlqB,MAASgqB,MACjBC,EAAe,GAAGjqB,cAAiBiqB,MAAmB,KAGjD,GAAGjqB,MAASgqB,MACjBC,EAAe,GAAGjqB,cAAiBiqB,MAAmB,IAG5D,EClJO,MAAMG,GAaXC,YAAAA,CAEEC,GAEA,MAAMC,EAAWn9B,KAAKm9B,SAAWn9B,KAAKm9B,SAAW,UAC/CC,EAAcp9B,KAAKo9B,YAAcp9B,KAAKo9B,YAAc,IACpDC,EAAkBr9B,KAAKq9B,gBACnBr9B,KAAKq9B,gBAAgBvjB,KAAK,KAC1BlT,EACJ02B,EAAmBt9B,KAAKs9B,iBAAmBt9B,KAAKs9B,iBAAmB,IACnEC,EAAgBv9B,KAAKu9B,cAAgBv9B,KAAKu9B,cAAgB,OAC1DC,EAAiBx9B,KAAKw9B,eAAiBx9B,KAAKw9B,eAAiB,QAC7DC,EAAmBz9B,KAAKy9B,iBAAmBz9B,KAAKy9B,iBAAmB,IACnEV,OAAkC,IAAjB/8B,KAAK+8B,QAA0B/8B,KAAK+8B,QAAU,IAC/DW,EAAa19B,KAAKsS,QAAU,GAAK,uBACjC9I,EAAS0zB,EAAa,GAAKl9B,KAAK29B,eAChCja,EAAOiZ,GAAe/0B,EAAM5H,KAAK0jB,MAGnC,MAAO,CAFIiZ,GAAe90B,EAAQ7H,KAAK49B,QAIrC,iBACAR,EACA,KACA,qBACAC,EACA,KACA,mBACAE,EACA,KACA,sBACAD,EACA,KACA,oBACAE,EACA,KACA,sBACAC,EACA,KACA/Z,EACA,cACAyZ,EACA,KACA,YACAJ,EACA,IACAvzB,EACAk0B,GACA5jB,KAAK,GACT,CAMA6jB,YAAAA,GACE,OAAO39B,KAAK69B,OAAS,sBAAsB79B,KAAK69B,OAAOvqB,OAAS,EAClE,CAMAwqB,aAAAA,GAGE,MAAO,CACL99B,KAAKsT,GAAK,OAAOtT,KAAKsT,OAAS,GAC/BtT,KAAKmiB,SACD,mBACGniB,KAAKmiB,SACHkE,gBAEL,IACJvM,KAAK,GACT,CAOAikB,eAAAA,CAEEC,GAEA,IADA9W,EAAmB5mB,UAAAC,OAAA,QAAAC,IAAAF,UAAA,GAAAA,UAAA,GAAG,GAEtB,MAAMqO,EAAYqvB,EAAOh+B,KAAKi+B,sBAAwBj+B,KAAKyqB,gBAE3D,MAAO,GADU,cAAc7Q,GAAYjL,OAClBuY,KAC3B,CASAgX,MAAAA,CAAOC,GACL,MAAO,CAAC,GACV,CAOAlY,KAAAA,CAEE9N,GAEA,OAAOnY,KAAKo+B,qBAAqBp+B,KAAKk+B,OAAO/lB,GAAU,CACrDA,WAEJ,CAOA6O,aAAAA,CAEE7O,GAEA,MACE,KACAnY,KAAKq+B,6BAA6Br+B,KAAKk+B,OAAO/lB,GAAU,CACtDA,WAGN,CAKAkmB,4BAAAA,CAEEC,GAKA,IAJAnmB,QACEA,EAAO+O,oBACPA,EAAsB,IACkC5mB,UAAAC,OAAA,QAAAC,IAAAF,UAAA,GAAAA,UAAA,GAAG,CAAA,EAE7D,MAAMi+B,EAAe,CACjBv+B,KAAK+9B,iBAAgB,EAAM7W,GAC3BlnB,KAAK89B,iBACLhkB,KAAK,IAEP9Q,EAAQs1B,EAAar1B,QAAQ,gBAE/B,OADAq1B,EAAat1B,GAASu1B,EACfpmB,EAAUA,EAAQmmB,EAAaxkB,KAAK,KAAOwkB,EAAaxkB,KAAK,GACtE,CAKAskB,oBAAAA,CAEEE,GAYQ,IAXRE,QACEA,EAAOrmB,QACPA,EAAOsmB,WACPA,EAAUvX,oBACVA,GAMD5mB,UAAAC,OAAA,QAAAC,IAAAF,UAAA,GAAAA,UAAA,GAAG,CAAA,EAEJ,MAAMo+B,EAAYF,EAAU,GAAK,UAAUx+B,KAAKi9B,mBAC9C0B,EAAaF,EAAa,UAAUz+B,KAAK29B,mBAAqB,GAC9Dxb,EAAWniB,KAAKmiB,SAChByc,EAAe5+B,KAAK6+B,cAChB,sCACA,GACJC,EAAmB3c,GAAYA,EAAS4c,mBACxCnB,EAAS59B,KAAK49B,OACdla,EAAO1jB,KAAK0jB,KACZma,EAAS79B,KAAK69B,OACd3X,EAAS,GAETld,EAAQs1B,EAAar1B,QAAQ,gBAC/B,IAAI+1B,EACA7c,IACFA,EAASkE,WAAa,YAAY9S,OAClCyrB,EAAiB,iBACf7c,EAASkE,kBACHlE,EAAS6E,cAAc7O,mBAE7B2mB,GACF5Y,EAAO9b,KAAK,MAAOu0B,EAAY3+B,KAAK89B,gBAAiB,QAEvD5X,EAAO9b,KACL,MACApK,KAAK+9B,iBAAgB,GACpBe,EAAuD,GAApCH,EAAa3+B,KAAK89B,gBACtC,QAEF,MAAMS,EAAe,CACnBG,EACAE,EACAJ,EAAU,GAAKx+B,KAAKi/B,gBACpB,IACA/X,EAAsB,cAAcA,MAA0B,IAC9DpN,KAAK,IAiBP,OAhBAwkB,EAAat1B,GAASu1B,EAClBxkB,GAAS2J,IACXwC,EAAO9b,KAAKsZ,EAAKuC,MAAMjmB,OAErB+Z,GAAS6jB,IACX1X,EAAO9b,KAAKwzB,EAAO3X,MAAMjmB,OAEvB69B,GACF3X,EAAO9b,KAAKyzB,EAAO5X,MAAMjmB,OAEvBmiB,GACF+D,EAAO9b,KAAK40B,GAEd9Y,EAAO9b,KAAKk0B,EAAaxkB,KAAK,KAC9BoM,EAAO9b,KAAK,UACZ00B,GAAoB5Y,EAAO9b,KAAK,UACzB+N,EAAUA,EAAQ+N,EAAOpM,KAAK,KAAOoM,EAAOpM,KAAK,GAC1D,CAEAmlB,aAAAA,GACE,OAAOj/B,KAAKk/B,aAAet3B,EAAO,iBAAiB5H,KAAKk/B,eAAiB,EAC3E,EC3PK,SAASC,GAAYC,GAC1B,OAAO,IAAIC,OAAO,KAAOD,EAAItlB,KAAK,KAAO,OAAQ,IACnD,CCEO,MAAMwlB,GAA4B,0BAEnCC,GAAiB,CACrB,WACA,aACA,aACA,aAGWC,GAA2B,CACtC,YACA,WACA,eAGWC,GAAiC,IACzCF,GACH,aACA,OACA,cACA,YACA,SACA,OACA,kBACA,WACA,aAGWG,GAAkB,IAC1BD,MACAD,GACH,sBACA,YACAF,IAkBWK,GAAmD,IAC3DJ,MACAC,GACH33B,EACA,cACAD,EACA,SACA,sBACA03B,IAMWM,GAA2D,CACtEC,WAAYh5B,EACZi5B,iBAAkB,WAClBC,eAAgB,UAChBC,SAAU,OACVnE,SAAU,GACV72B,WAAY,SACZhE,WAAY,kBACZi/B,WAAW,EACXC,UAAU,EACVC,aAAa,EACbC,UAAW55B,EACXzB,UAAW,SACXs7B,WAAY,KACZC,oBAAqB,GACrB1C,OAAQ,KACRC,OAAQ,KACR3b,UAAM1hB,EACN+/B,gBAAiB,EACjBC,SAAUh6B,EACVi6B,UAAW,WACXC,YAAa,EACbC,OAAQ,EACRC,UAAW,MACXC,gBAAiB,IACjBC,eAAgB,EAEhBC,YAAa,CACXtxB,KAAM,GACNuxB,UAAU,KAEZC,UAAW,CACTxxB,KAAM,GACNuxB,SAAU,KAEZE,kBAAmB,KACnBC,QAAS,CACPlB,UAAW,GACXE,aAAa,OACbD,UAAU,QAEZkB,cAAe,KACf9B,CAACA,IAA4B,QAGlB+B,GAAU,UACVC,GAAe,eACfC,GAAgB,gBAChBC,GAAiB,iBChHjBC,GAAQC,OAAOC,GAAG,4CAClBC,GAAoBF,OAAOC,GAAG,uBAE9BE,GAAQ,6BAERC,GAAoB,IAAIzC,OACnC,qHAEEoC,GACA,2CACAA,GACA,eAyBFM,GAAgB,CACdC,GAAIx7B,EACJwF,EAAGxF,EACHuO,EAAG,SACHktB,GAAIx7B,EACJsF,EAAGtF,EACHy7B,QAAS,UACTxE,WAAY,UACZ/uB,UAAW,kBACX,eAAgB,cAChB,YAAa,WACb,cAAe,aACf,YAAa,WACb,aAAc,YACd,cAAe,aACf,iBAAkB,cAClB,cAAe,aACf,mBAAoB,kBACpB,oBAAqB,mBACrB,iBAAkB,gBAClB,kBAAmB,iBACnB,oBAAqB,mBACrB,iBAAkB,gBAClB,eAAgB,cAChB,kBAAmB,iBACnB,cAAe,aACfouB,QAAS,UACT,YAAa,WACb,YAAa,WACb,gBAAiB,gBACjB,kBAAmB,iBACnB,4BAA6BuC,IAE/B6C,GAAQ,YACRC,GAAQ,YAEGC,GAAwBlD,GA1DL,CAC5B,OACA,SACA,UACA,WACA,UACA,OACA,OACA,QACA,SAmDSmD,GAA0BnD,GAjDhB,CAAC,SAAU,QAAS,SAAU,UAAW,OAAQ,QAmD3DoD,GAAuBpD,GAzChB,CAAC,SAAU,IAAK,IAAK,MAAO,WAAY,SA6C/CqD,GAAqB,IAAInD,OACpCqC,OAAOC,GAAG,QAAQF,MAASG,MAAqBH,MAASG,MAAqBH,MAASG,MAAqBH,WCvDxGgB,GAAoB,yCAEpBC,GAAmB,IAAIrD,OAC3B,YACEoD,GACAA,GACA,IACAhB,GACA,iCAuBG,MAAMkB,GAyDX7iC,WAAAA,GAAmE,IAAvDgK,EAAgDxJ,UAAAC,OAAA,QAAAC,IAAAF,UAAA,GAAAA,UAAA,GAAG,CAAA,EAC7D,MAAM4B,EACY,iBAAT4H,EAAoB64B,GAAOC,YAAY94B,GAAQA,EACxDrJ,OAAOC,OAAOV,KAAM2iC,GAAOvjB,YAAald,GACxClC,KAAKsT,GAAKC,IACZ,CAMA,kBAAOqvB,CAAYt3B,GACjB,MAAMu3B,EAAYv3B,EAAMgxB,QACtB,CAAGjiB,EAAU,EAAG6J,EAAU,EAAG4e,EAAO,IAClCJ,GAAiB3G,KAAK8G,IAAc,IACpCvqB,IAAKhN,GAAUoO,WAAWpO,IAAU,GAGxC,MAAO,CACL0tB,OAHS6J,EAAUE,QAAQL,GAAkB,KAAO,cAAcpG,OAIlEjiB,UACA6J,UACA4e,OAEJ,CAOAj1B,QAAAA,GACE,MAAO,CAAC7N,KAAKqa,QAASra,KAAKkkB,QAASlkB,KAAK8iC,KAAM9iC,KAAKg5B,OAAOlf,KAAK,MAClE,CAOAmM,KAAAA,CAAM5W,GACJ,MAAM2N,EAASiP,GACX,IAAIngB,GAAM9L,KAAKqa,QAASra,KAAKkkB,SAC7B5P,IAAkBjF,EAAO5D,QAG3ButB,EAAQ,IAAID,GAAM/4B,KAAKg5B,OACzB,IAAIgK,EAAQ,GACVC,EAAQ,GA2BV,OAzBI5zB,EAAO2C,OAAS3C,EAAO4C,SAGzB+wB,EAKI,IAJFzpB,IACG7U,KAAKgH,IAAIsR,EAAOhR,GAAKhM,KAAK8iC,MAAQzzB,EAAO2C,MAC1C7R,EAAO0Z,qBAXA,GAeXopB,EAKI,IAJF1pB,IACG7U,KAAKgH,IAAIsR,EAAOjR,GAAK/L,KAAK8iC,MAAQzzB,EAAO4C,OAC1C9R,EAAO0Z,qBAlBA,IAuBTxK,EAAO0H,QACTiG,EAAOhR,IAAK,GAEVqD,EAAO2H,QACTgG,EAAOjR,IAAK,GAGP,qBAAqB/L,KAAKsT,WAAW2vB,eAC1C,IAAM,EAAIA,WACFD,cACR,IAAM,EAAIA,2DAC8CzpB,GACxDvZ,KAAK8iC,KAAO9iC,KAAK8iC,KAAO,EAAI,EAC5B3iC,EAAO0Z,4DACgCN,GACvCyD,EAAOhR,EACP7L,EAAO0Z,6BACCN,GACRyD,EAAOjR,EACP5L,EAAO0Z,8EACkDmf,EAAMS,2BAA2BT,EAAMgB,yLACpG,CAMA7f,QAAAA,GACE,MAAMyL,EAAgC,CACpCoT,MAAOh5B,KAAKg5B,MACZ8J,KAAM9iC,KAAK8iC,KACXzoB,QAASra,KAAKqa,QACd6J,QAASlkB,KAAKkkB,QACdgf,aAAcljC,KAAKkjC,aACnBC,WAAYnjC,KAAKmjC,WACjBz6B,KAAO1I,KAAKF,YAA8B4I,MAEtCtH,EAAWuhC,GAAOvjB,YACxB,OAAQpf,KAAKoe,qBAETwH,EADAvM,GAAOuM,EAAM,CAACta,EAAO/J,IAAQ+J,IAAUlK,EAASG,GAEtD,CAEA,uBAAagX,CAAWrW,GACtB,OAAO,IAAIlC,KAAKkC,EAClB,EArIAnC,EArCW4iC,GAAM,cApBmD,CACpE3J,MAAO,aACP8J,KAAM,EACNzoB,QAAS,EACT6J,QAAS,EACTgf,cAAc,EACd9kB,sBAAsB,EACtB+kB,YAAY,IA4D4BpjC,EA/C7B4iC,GAAM,OAiDH,UA4HhB16B,EAAcM,SAASo6B,GAAQ,UC3OxB,MAAMS,GAAWA,CAAC51B,EAAalC,EAAe3G,IACnDD,KAAKC,IAAI6I,EAAK9I,KAAK8I,IAAIlC,EAAO3G,ICanB0+B,GAAkB,CAC7B58B,EACAD,EACAgB,EACAC,EACA,QACA,QACA,UACA,UACA,QACA,UACA,2BACA,SACA,UACAC,EACAC,GAGW27B,GAAkB,CAC7B17B,EACAC,EACA,cACA,kBACA,QACA,SACA,aACA,gBACA,gBACA,mBACA,iBACA,mBACA,kBACA,YAGW07B,GAET,CAEFxxB,IAAK,EACLD,KAAM,EACNE,MAAO,EACPC,OAAQ,EACRxG,MAAO,EACPsL,OAAO,EACPC,OAAO,EACPnB,OAAQ,EACRC,OAAQ,EACR0tB,cAAe,EACfztB,MAAO,EACPC,MAAO,EACPkX,QAAS1mB,EACT2mB,QAAS1mB,EACT22B,YAAa,EACbyB,eAAe,EACf5Q,QAAS,EACT8O,QAAS,EACTmC,WAAYt3B,EACZ8b,KAAM,aACNyZ,SAAU,UACVS,OAAQ,KACRP,gBAAiB,KACjBC,iBAAkB,EAClBC,cAAe,OACfC,eAAgB,QAChBC,iBAAkB,EAClBza,yBAA0B,cAC1B/E,gBAAiB,GACjB4f,OAAQ,KACRvrB,SAAS,EACT8L,sBAAsB,EACtBmH,mBAAmB,EACnBke,eAAe,EACfthB,cAAU3hB,EACVkjC,UAAU,EACV3E,oBAAoB,EACpB4E,kBAAkB,EAClBC,iBAAiB,EACjBC,OAAO,GCpFHC,GAAYA,CAAChvB,EAAWivB,EAAWr1B,EAAW4pB,KAC9CxjB,EAAIpQ,KAAKgH,IAAIq4B,IACfjvB,EAAIivB,EACJzL,EAAI5pB,EAAI,GAIN4pB,EADQ,IAANyL,GAAiB,IAANjvB,EACRpG,EAAIzI,EAAavB,KAAKs/B,KAAK,GAE3Bt1B,EAAIzI,EAAavB,KAAKs/B,KAAKD,EAAIjvB,GAGjC,CAAEA,IAAGivB,IAAGr1B,IAAG4pB,MAGd2L,GAAUA,CACdnvB,EACAwjB,EACA5pB,EACAnB,EACA/C,IAEAsK,EAAIpQ,KAAKkR,IAAI,EAAG,IAAMrI,GAAK,IAAM7I,KAAKiH,KAAM4B,EAAI/C,EAAI8tB,GAAKryB,EAAayI,GAK3Dw1B,GAAiCA,CAAC32B,EAAG0H,EAAG8uB,EAAGv5B,KACrDu5B,EAAIr/B,KAAK8G,IAAK+B,EAAI/C,EAAK1E,GAAUi+B,EAAI9uB,EAoP3BkvB,GAAiCA,CAAC52B,EAAG0H,EAAG8uB,EAAGv5B,KACjD+C,GAAK/C,GAAK,EAAI,KACVu5B,GAAK,OAASx2B,EAAIA,GAAK0H,EACrB1H,EAAI,EAAI,KACVw2B,GAAK,QAAUx2B,GAAK,IAAM,MAAQA,EAAI,KAAQ0H,EAC5C1H,EAAI,IAAM,KACZw2B,GAAK,QAAUx2B,GAAK,KAAO,MAAQA,EAAI,OAAU0H,EAEjD8uB,GAAK,QAAUx2B,GAAK,MAAQ,MAAQA,EAAI,SAAY0H,EAOlDmvB,GAAgCA,CAAC72B,EAAG0H,EAAG8uB,EAAGv5B,IACrDu5B,EAAII,GAAc35B,EAAI+C,EAAG,EAAGw2B,EAAGv5B,GAAKyK,mEAvCK,SAAC1H,EAAG0H,EAAG8uB,EAAGv5B,GAAC,IAAE8tB,EAACh4B,UAAAC,OAAA,QAAAC,IAAAF,UAAA,GAAAA,UAAA,GAAG,QAAO,OACjEyjC,GAAKx2B,GAAK/C,GAAK+C,IAAM+qB,EAAI,GAAK/qB,EAAI+qB,GAAKrjB,CAAC,6BArGCovB,CAAC92B,EAAG0H,EAAG8uB,EAAGv5B,KAClDu5B,GAAKr/B,KAAKgB,KAAK,GAAK6H,GAAK/C,GAAK+C,GAAK,GAAK0H,cArHCqvB,CAAC/2B,EAAG0H,EAAG8uB,EAAGv5B,IACpDu5B,GAAKx2B,EAAI/C,IAAM,EAAIyK,gBA0IyBsvB,CAACh3B,EAAG0H,EAAG8uB,EAAGv5B,KACtD,MACEsK,EAAIivB,EACN,IAAIr1B,EAAI,EACR,GAAU,IAANnB,EACF,OAAO0H,EAGT,GAAU,KADV1H,GAAK/C,GAEH,OAAOyK,EAAI8uB,EAERr1B,IACHA,EAAQ,GAAJlE,GAEN,MAAQsK,EAAG0vB,EAAOlM,EAAGmM,EAAO/1B,EAAGg2B,GAAUZ,GAAUhvB,EAAGivB,EAAGr1B,EAb/C,SAcV,OAAQu1B,GAAQO,EAAOC,EAAOC,EAAOn3B,EAAG/C,GAAKyK,cAnEJ0vB,CAACp3B,EAAG0H,EAAG8uB,EAAGv5B,IAC7C,IAAN+C,EAAU0H,EAAI8uB,EAAI,IAAM,IAAMx2B,EAAI/C,EAAI,IAAMyK,gBA4IA,SAAC1H,EAAG0H,EAAG8uB,EAAGv5B,GAAmB,IAAhB8tB,EAACh4B,UAAAC,OAAA,QAAAC,IAAAF,UAAA,GAAAA,UAAA,GAAG,QAE7D,OADAiN,GAAK/C,EAAI,GACD,EACEu5B,EAAI,GAAMx2B,EAAIA,IAAqB,GAAd+qB,GAAK,QAAc/qB,EAAI+qB,IAAMrjB,EAEpD8uB,EAAI,IAAOx2B,GAAK,GAAKA,IAAqB,GAAd+qB,GAAK,QAAc/qB,EAAI+qB,GAAK,GAAKrjB,CACvE,kBA0BgD2vB,CAACr3B,EAAG0H,EAAG8uB,EAAGv5B,IACxD+C,EAAI/C,EAAI,EAC2B,GAA/B45B,GAAiB,EAAJ72B,EAAO,EAAGw2B,EAAGv5B,GAAWyK,EACD,GAApCkvB,GAAkB,EAAJ52B,EAAQ/C,EAAG,EAAGu5B,EAAGv5B,GAAe,GAAJu5B,EAAU9uB,gBAvIZ4vB,CAACt3B,EAAG0H,EAAG8uB,EAAGv5B,KACtD+C,GAAK/C,EAAI,GACD,GACGu5B,EAAI,GAAMr/B,KAAKgB,KAAK,EAAI6H,GAAK,GAAK,GAAK0H,EAE1C8uB,EAAI,GAAMr/B,KAAKgB,KAAK,GAAK6H,GAAK,GAAKA,GAAK,GAAK0H,iBAzHR6vB,CAACv3B,EAAG0H,EAAG8uB,EAAGv5B,KACvD+C,GAAK/C,EAAI,GACD,EACEu5B,EAAI,EAAKx2B,GAAK,EAAI0H,EAEpB8uB,EAAI,IAAOx2B,EAAI,IAAM,EAAI,GAAK0H,mBAwKS8vB,CAACx3B,EAAG0H,EAAG8uB,EAAGv5B,KACzD,MACEsK,EAAIivB,EACN,IAAIr1B,EAAI,EACR,GAAU,IAANnB,EACF,OAAO0H,EAGT,GAAU,KADV1H,GAAK/C,EAAI,GAEP,OAAOyK,EAAI8uB,EAERr1B,IACHA,EAAIlE,GAAK,GAAM,MAEjB,MAAQsK,EAAG0vB,EAAOlM,EAAGmM,EAAO/1B,EAAGg2B,EAAOX,EAAGiB,GAAUlB,GAAUhvB,EAAGivB,EAAGr1B,EAbzD,SAcV,OAAInB,EAAI,GACC,GAAO02B,GAAQO,EAAOC,EAAOC,EAAOn3B,EAAG/C,GAAKyK,EAGnDuvB,EACE9/B,KAAKkR,IAAI,GAAG,IAAOrI,GAAK,IACxB7I,KAAKiH,KAAM4B,EAAI/C,EAAIi6B,GAASx+B,EAAay+B,GACzC,GACFM,EACA/vB,iBA9G0CgwB,CAAC13B,EAAG0H,EAAG8uB,EAAGv5B,IAC5C,IAAN+C,EACK0H,EAEL1H,IAAM/C,EACDyK,EAAI8uB,GAEbx2B,GAAK/C,EAAI,GACD,EACEu5B,EAAI,EAAK,IAAM,IAAMx2B,EAAI,IAAM0H,EAEjC8uB,EAAI,IAAO,KAAM,KAAQx2B,GAAK,GAAK0H,gBAyKCiwB,CAAC33B,EAAG0H,EAAG8uB,EAAGv5B,KACtD+C,GAAK/C,EAAI,GACD,EACEu5B,EAAI,EAAKx2B,GAAK,EAAI0H,GAEnB8uB,EAAI,KAAQx2B,GAAKA,EAAI,GAAK,GAAK0H,iBAzPKkwB,CAAC53B,EAAG0H,EAAG8uB,EAAGv5B,KACvD+C,GAAK/C,EAAI,GACD,EACEu5B,EAAI,EAAKx2B,GAAK,EAAI0H,GAEnB8uB,EAAI,IAAOx2B,GAAK,GAAKA,GAAK,EAAI,GAAK0H,iBAkBCmwB,CAAC73B,EAAG0H,EAAG8uB,EAAGv5B,KACvD+C,GAAK/C,EAAI,GACD,EACEu5B,EAAI,EAAKx2B,GAAK,EAAI0H,EAEpB8uB,EAAI,IAAOx2B,EAAI,IAAM,EAAI,GAAK0H,gBAkBMowB,CAAC93B,EAAG0H,EAAG8uB,EAAGv5B,KACpDu5B,EAAI,GAAMr/B,KAAK8G,IAAK9G,KAAKqB,GAAKwH,EAAK/C,GAAK,GAAKyK,aA0LNqwB,CAAC/3B,EAAG0H,EAAG8uB,EAAGv5B,IAAMu5B,GAAKx2B,GAAK/C,GAAK+C,EAAI0H,cArPlCswB,CAACh4B,EAAG0H,EAAG8uB,EAAGv5B,IACpDu5B,GAAKx2B,GAAK/C,GAAK+C,GAAK,EAAI0H,cAsBkBuwB,CAACj4B,EAAG0H,EAAG8uB,EAAGv5B,IACpDu5B,GAAKx2B,EAAI/C,IAAM,EAAIyK,aAsBsBwwB,CAACl4B,EAAG0H,EAAG8uB,EAAGv5B,KAClDu5B,EAAIr/B,KAAK8G,IAAK+B,EAAI/C,EAAK1E,GAAUi+B,EAAI9uB,cAwJI,SAAC1H,EAAG0H,EAAG8uB,EAAGv5B,GAAC,IAAE8tB,EAACh4B,UAAAC,OAAA,QAAAC,IAAAF,UAAA,GAAAA,UAAA,GAAG,QAAO,OAClEyjC,IAAMx2B,EAAIA,EAAI/C,EAAI,GAAK+C,IAAM+qB,EAAI,GAAK/qB,EAAI+qB,GAAK,GAAKrjB,CAAC,+BArGXywB,CAACn4B,EAAG0H,EAAG8uB,EAAGv5B,IACpDu5B,EAAIr/B,KAAKgB,KAAK,GAAK6H,EAAIA,EAAI/C,EAAI,GAAK+C,GAAK0H,eArHE0wB,CAACp4B,EAAG0H,EAAG8uB,EAAGv5B,IACrDu5B,IAAMx2B,EAAI/C,EAAI,IAAM,EAAI,GAAKyK,iBAyJgB2wB,CAACr4B,EAAG0H,EAAG8uB,EAAGv5B,KACvD,MACEsK,EAAIivB,EACN,IAAIr1B,EAAI,EACR,GAAU,IAANnB,EACF,OAAO0H,EAGT,GAAU,KADV1H,GAAK/C,GAEH,OAAOyK,EAAI8uB,EAERr1B,IACHA,EAAQ,GAAJlE,GAEN,MAAQsK,EAAG0vB,EAAOlM,EAAGmM,EAAO/1B,EAAGg2B,EAAOX,EAAGiB,GAAUlB,GAAUhvB,EAAGivB,EAAGr1B,EAbzD,SAcV,OACE81B,EAAQ,KAAM,GAAMj3B,GAAK7I,KAAKiH,KAAM4B,EAAI/C,EAAIi6B,GAASx+B,EAAay+B,GAClEM,EACA/vB,eArFwC4wB,CAACt4B,EAAG0H,EAAG8uB,EAAGv5B,IACpD+C,IAAM/C,EAAIyK,EAAI8uB,EAAIA,IAAM,KAAO,GAAMx2B,EAAK/C,GAAK,GAAKyK,cAmLV6wB,CAACv4B,EAAG0H,EAAG8uB,EAAGv5B,KACnDu5B,GAAKx2B,GAAK/C,IAAM+C,EAAI,GAAK0H,eArPiB8wB,CAACx4B,EAAG0H,EAAG8uB,EAAGv5B,KACpDu5B,IAAMx2B,EAAIA,EAAI/C,EAAI,GAAK+C,GAAK,EAAI,GAAK0H,eAsBK+wB,CAACz4B,EAAG0H,EAAG8uB,EAAGv5B,IACrDu5B,IAAMx2B,EAAI/C,EAAI,IAAM,EAAI,GAAKyK,cAsBagxB,CAAC14B,EAAG0H,EAAG8uB,EAAGv5B,IACpDu5B,EAAIr/B,KAAKiH,IAAK4B,EAAI/C,EAAK1E,GAAUmP,ICzGnC,MAAMixB,GAAeA,KAAM,EAEpB,MAAeC,GAyCpBrmC,WAAAA,CAAWgF,GAWkB,IAXjBshC,WACVA,EAAUC,QACVA,EAAOC,SACPA,EAAW,IAAGC,MACdA,EAAQ,EAACC,OACTA,EAAStC,GAAauC,QACtBA,EAAU5gC,EAAI6gC,SACdA,EAAW7gC,EAAI8gC,WACfA,EAAa9gC,EAAIyD,MACjBA,EAAQ48B,GAAYx8B,OACpBA,GACyB5E,EApC3B/E,gBAMiC,WACjCA,0BAImB,GACnBA,uBAGgB,GAsBdC,KAAK4mC,KAAO5mC,KAAK4mC,KAAKC,KAAK7mC,MAE3BA,KAAKsmC,SAAWA,EAChBtmC,KAAKumC,MAAQA,EACbvmC,KAAKwmC,OAASA,EACdxmC,KAAK8mC,SAAWL,EAChBzmC,KAAK+mC,UAAYL,EACjB1mC,KAAKgnC,YAAcL,EACnB3mC,KAAKinC,OAAS39B,EACdtJ,KAAK0J,OAASA,EAEd1J,KAAKomC,WAAaA,EAClBpmC,KAAKqmC,QAAUA,EACfrmC,KAAKsL,MAAQtL,KAAKomC,WAClBpmC,KAAKknC,SAAWzmC,OAAO2F,OAAOpG,KAAKmnC,UAAUnnC,KAAKsmC,UAAUh7B,MAC9D,CAEA,SAAI87B,GACF,OAAOpnC,KAAKqnC,MACd,CAEAC,MAAAA,GACE,MAAuB,YAAhBtnC,KAAKqnC,QAAwC,cAAhBrnC,KAAKqnC,MAC3C,CAYAE,KAAAA,GACE,MAAMC,EAAmCC,IACnB,YAAhBznC,KAAKqnC,SACTrnC,KAAK0nC,UAAYD,IAAc,IAAIE,KACnC3nC,KAAKqnC,OAAS,UACdrnC,KAAK8mC,WACL9mC,KAAK4mC,KAAK5mC,KAAK0nC,aAGjB1nC,KAAK4nC,WAID5nC,KAAKumC,MAAQ,EACfsB,WAAW,IAAM50B,GAAiBu0B,GAAYxnC,KAAKumC,OAEnDtzB,GAAiBu0B,EAErB,CAEQZ,IAAAA,CAAKr5B,GACX,MAAMu6B,GAAcv6B,IAAM,IAAIo6B,MAAU3nC,KAAK0nC,UACvCK,EAAkBrjC,KAAK8I,IAAIs6B,EAAY9nC,KAAKsmC,UAClDtmC,KAAKgoC,iBAAmBD,EAAkB/nC,KAAKsmC,SAC/C,MAAMh7B,MAAEA,EAAK28B,cAAEA,GAAkBjoC,KAAKmnC,UAAUY,GAChD/nC,KAAKsL,MAAQ7K,OAAO2F,OAAOkF,GAC3BtL,KAAKioC,cAAgBA,EAED,YAAhBjoC,KAAKqnC,SAGPrnC,KAAKinC,OAAOjnC,KAAKsL,MAAOtL,KAAKioC,cAAejoC,KAAKgoC,mBAEjDhoC,KAAKqnC,OAAS,UACdrnC,KAAKkoC,cACIJ,GAAc9nC,KAAKsmC,UAC5BtmC,KAAKgoC,iBAAmBhoC,KAAKioC,cAAgB,EAC7CjoC,KAAK+mC,UAAU/mC,KAAKknC,SAAUlnC,KAAKioC,cAAejoC,KAAKgoC,kBACvDhoC,KAAKqnC,OAAS,YACdrnC,KAAKgnC,YACHhnC,KAAKknC,SACLlnC,KAAKioC,cACLjoC,KAAKgoC,kBAEPhoC,KAAKkoC,eAELloC,KAAK+mC,UAAU/mC,KAAKsL,MAAOtL,KAAKioC,cAAejoC,KAAKgoC,kBACpD/0B,GAAiBjT,KAAK4mC,OAE1B,CAEQgB,QAAAA,GACN9+B,EAAkBsB,KAAKpK,KACzB,CAEQkoC,UAAAA,GACNp/B,EAAkBC,OAAO/I,KAC3B,CAEAsJ,KAAAA,GACEtJ,KAAKqnC,OAAS,UACdrnC,KAAKkoC,YACP,ECjKK,MAAMC,WAAuBhC,GAClCrmC,WAAAA,CAAWgF,GAIe,IAJdshC,WACVA,EAAa,EAACc,SACdA,EAAW,OACRxc,GACmB5lB,EACtB1E,MAAM,IACDsqB,EACH0b,aACAC,QAASa,EAAWd,GAExB,CAEUe,SAAAA,CAAUiB,GAClB,MAAM98B,EAAQtL,KAAKwmC,OACjB4B,EACApoC,KAAKomC,WACLpmC,KAAKqmC,QACLrmC,KAAKsmC,UAEP,MAAO,CACLh7B,QACA28B,cAAevjC,KAAKgH,KAAKJ,EAAQtL,KAAKomC,YAAcpmC,KAAKqmC,SAE7D,ECxBK,MAAMgC,WAAuBlC,GAClCrmC,WAAAA,CAAWgF,GAIe,IAJdshC,WACVA,EAAa,CAAC,GAAEc,SAChBA,EAAW,CAAC,QACThlC,GACmB4C,EACtB1E,MAAM,IACD8B,EACHkkC,aACAC,QAASa,EAAS5uB,IAAI,CAAChN,EAAOH,IAAMG,EAAQ86B,EAAWj7B,KAE3D,CACUg8B,SAAAA,CAAUiB,GAClB,MAAMnvB,EAASjZ,KAAKomC,WAAW9tB,IAAI,CAAChN,EAAOH,IACzCnL,KAAKwmC,OAAO4B,EAAa98B,EAAOtL,KAAKqmC,QAAQl7B,GAAInL,KAAKsmC,SAAUn7B,IAElE,MAAO,CACLG,MAAO2N,EACPgvB,cAAevjC,KAAKgH,KACjBuN,EAAO,GAAKjZ,KAAKomC,WAAW,IAAMpmC,KAAKqmC,QAAQ,IAGtD,ECdF,MAAMiC,GAAsCA,CAC1CF,EACAhC,EACAC,EACAC,IAGOF,EAAaC,GADK,EAAI3hC,KAAK8G,IAAK48B,EAAc9B,EAAYxgC,IAI7DyiC,GACJt4B,GAEAA,GAAQ,EACNu4B,EAAwBP,EAAuBD,IAC/C/3B,EAAS,IAAI8oB,GAAMyP,GAAM9O,SAAUuO,EAAeD,IAE/C,MAAMS,WAAuBtC,GAClCrmC,WAAAA,CAAWgF,GAQe,IARdshC,WACVA,EAAUc,SACVA,EAAQV,OACRA,EAAS8B,GAAkB5B,SAC3BA,EAAQC,WACRA,EAAUr9B,MACVA,KACGpH,GACmB4C,EACtB,MAAM4jC,EAAa,IAAI3P,GAAMqN,GAAY5M,YACnCmP,EAAW,IAAI5P,GAAMmO,GAAU1N,YACrCp5B,MAAM,IACD8B,EACHkkC,WAAYsC,EACZrC,QAASsC,EAASrwB,IAChB,CAAChN,EAAOH,IAAMG,EAAQo9B,EAAWv9B,IAEnCq7B,SACAE,SAAU6B,GAAkB7B,GAC5BC,WAAY4B,GAAkB5B,GAC9Br9B,MAAOi/B,GAAkBj/B,IAE7B,CACU69B,SAAAA,CAAUiB,GAClB,MAAOrzB,EAAGmjB,EAAGjjB,EAAGH,GAAK9U,KAAKomC,WAAW9tB,IAAI,CAAChN,EAAOH,IAC/CnL,KAAKwmC,OAAO4B,EAAa98B,EAAOtL,KAAKqmC,QAAQl7B,GAAInL,KAAKsmC,SAAUn7B,IAE5DG,EAAQ,IACT,CAACyJ,EAAGmjB,EAAGjjB,GAAGqD,IAAI5T,KAAKmpB,OACtBuV,GAAS,EAAGtuB,EAAG,IAEjB,MAAO,CACLxJ,QACA28B,cAEE38B,EACGgN,IAAI,CAAC5J,EAAGvD,IACa,IAApBnL,KAAKqmC,QAAQl7B,GACTzG,KAAKgH,KAAKgD,EAAI1O,KAAKomC,WAAWj7B,IAAMnL,KAAKqmC,QAAQl7B,IACjD,GAEL1H,KAAMiL,GAAY,IAANA,IAAY,EAEjC,EChBK,SAASk6B,GAGd1mC,GACA,MAAMmH,EA1CNnH,IAEON,MAAMmN,QAAQ7M,EAAQkkC,aAAexkC,MAAMmN,QAAQ7M,EAAQglC,UAyChE2B,CAAiB3mC,GACb,IAAImmC,GAAenmC,GACnB,IAAIimC,GAAejmC,GAGzB,OADAmH,EAAUk+B,QACHl+B,CACT,CAEO,SAASy/B,GAAa5mC,GAC3B,MAAMmH,EAAY,IAAIo/B,GAAevmC,GAErC,OADAmH,EAAUk+B,QACHl+B,CACT,CClEO,MAAM0/B,GAKXjpC,WAAAA,CAAYkpC,GACVhpC,KAAKgpC,OAASA,EACdhpC,KAAKsqB,OAAS,EAChB,CAOQ1Z,QAAAA,CAAS2P,GACf,OAAOvgB,KAAKsqB,OAAOzZ,KAAMnC,GAAMA,EAAEzB,GAAGsT,GACtC,CAOQ0oB,MAAAA,GAAyC,IAAA,IAAAvnC,EAAApB,UAAAC,OAA/B+pB,EAAM,IAAA1oB,MAAAF,GAAAG,EAAA,EAAAA,EAAAH,EAAAG,IAANyoB,EAAMzoB,GAAAvB,UAAAuB,GAMtB,OALA7B,KAAKsqB,OAAStqB,KAAKsqB,OAAOpf,OACxBof,EAAO9gB,OAAQ+W,IACLvgB,KAAK4Q,SAAS2P,KAGnBvgB,IACT,CAWA,uBAAOkpC,CAAiBC,EAAUC,EAAUvO,GAA4B,IAAlBwO,EAAQ/oC,UAAAC,OAAA,QAAAC,IAAAF,UAAA,IAAAA,UAAA,GAC5D,GAAI8oC,EAAEn8B,GAAG4tB,GAGP,OAAOsO,EAAEl8B,GAAGm8B,GACP,GAAIA,EAAEp9B,IAAM6uB,EAAE7uB,EAGnB,OACEm9B,EAAEn9B,IAAMo9B,EAAEp9B,IACTq9B,GAAaF,EAAEp9B,GAAKrH,KAAK8I,IAAI47B,EAAEr9B,EAAG8uB,EAAE9uB,IAAMo9B,EAAEp9B,GAAKrH,KAAKC,IAAIykC,EAAEr9B,EAAG8uB,EAAE9uB,IAE/D,GAAIq9B,EAAEr9B,IAAM8uB,EAAE9uB,EAGnB,OACEo9B,EAAEp9B,IAAMq9B,EAAEr9B,IACTs9B,GAAaF,EAAEn9B,GAAKtH,KAAK8I,IAAI47B,EAAEp9B,EAAG6uB,EAAE7uB,IAAMm9B,EAAEn9B,GAAKtH,KAAKC,IAAIykC,EAAEp9B,EAAG6uB,EAAE7uB,IAE/D,CAKL,MAAMs9B,EAAKnd,GAAaid,EAAGvO,GAErBvC,EADKnM,GAAaid,EAAGD,GACdr8B,OAAOw8B,GACpB,OAAOD,EACH3kC,KAAKgH,IAAI4sB,EAAEtsB,KAAOtH,KAAKgH,IAAI4sB,EAAEvsB,GAC7BusB,EAAEtsB,IAAMssB,EAAEvsB,GAAKusB,EAAEtsB,GAAK,GAAKssB,EAAEtsB,GAAK,CACxC,CACF,CASA,uBAAOu9B,CAAiBhpB,EAAc+J,GACpC,MAAMkf,EAAQ,IAAI19B,GAAMyU,GAAOxS,KAC7BrJ,KAAK8I,IAAI+S,EAAMvU,EAAI,KAAMse,EAAOhS,IAAK5J,GAAMA,EAAE1C,KAE/C,IAAIy9B,EAAO,EACX,IAAK,IAAIzgC,EAAQ,EAAGA,EAAQshB,EAAO/pB,OAAQyI,IAAS,CAClD,MAAM0gC,EAAQ1pC,KAAK2pC,wBAEjBrf,EAAOthB,GACPshB,GAAQthB,EAAQ,GAAKshB,EAAO/pB,QAE5BggB,EACAipB,GAEF,GAAIE,EAAM94B,SAAS2P,GAEjB,OAAO,EAETkpB,GAAQ9vB,OAAwB,iBAAjB+vB,EAAMV,OACvB,CACA,OAAOS,EAAO,GAAM,CACtB,CAcA,wBAAOG,CACLC,EACAC,EACAC,EACAC,GAGc,IAFdC,IAAS3pC,UAAAC,OAAA,QAAAC,IAAAF,UAAA,KAAAA,UAAA,GACT4pC,IAAS5pC,UAAAC,OAAA,QAAAC,IAAAF,UAAA,KAAAA,UAAA,GAET,MAAM6pC,EAASL,EAAG99B,EAAI69B,EAAG79B,EACvBo+B,EAASN,EAAG/9B,EAAI89B,EAAG99B,EACnBs+B,EAASL,EAAGh+B,EAAI+9B,EAAG/9B,EACnBs+B,EAASN,EAAGj+B,EAAIg+B,EAAGh+B,EACnBw+B,EAASV,EAAG79B,EAAI+9B,EAAG/9B,EACnBw+B,EAASX,EAAG99B,EAAIg+B,EAAGh+B,EACnB0+B,EAAMJ,EAASG,EAASF,EAASC,EACjCG,EAAMP,EAASK,EAASJ,EAASG,EACjCI,EAAKL,EAASH,EAASE,EAASD,EAClC,GAAW,IAAPO,EAAU,CACZ,MAAMC,EAAKH,EAAME,EACfE,EAAKH,EAAMC,EACb,OACGV,GAAc,GAAKW,GAAMA,GAAM,KAC/BV,GAAc,GAAKW,GAAMA,GAAM,GAEzB,IAAI9B,GAAa,gBAAgBE,OACtC,IAAIn9B,GAAM+9B,EAAG79B,EAAI4+B,EAAKT,EAAQN,EAAG99B,EAAI6+B,EAAKR,IAGrC,IAAIrB,EAEf,CACE,GAAY,IAAR0B,GAAqB,IAARC,EAAW,CAC1B,MAAMI,EACJb,GACAC,GACAnB,GAAaG,iBAAiBW,EAAIE,EAAIC,IACtCjB,GAAaG,iBAAiBY,EAAIC,EAAIC,IACtCjB,GAAaG,iBAAiBa,EAAIF,EAAIC,IACtCf,GAAaG,iBAAiBc,EAAIH,EAAIC,GACxC,OAAO,IAAIf,GAAa+B,EAAmB,kBAAetqC,EAC5D,CACE,OAAO,IAAIuoC,GAAa,WAG9B,CAWA,2BAAOgC,CACLC,EACAC,EACAC,EACAC,GAEA,OAAOpC,GAAaa,kBAAkBoB,EAAIC,EAAIC,EAAIC,GAAI,GAAO,EAC/D,CAWA,8BAAOxB,CACLE,EACAC,EACAC,EACAC,GAEA,OAAOjB,GAAaa,kBAAkBC,EAAIC,EAAIC,EAAIC,GAAI,GAAO,EAC/D,CAcA,2BAAOoB,CACLvB,EACAC,EACAxf,GAEc,IADd+e,IAAQ/oC,UAAAC,OAAA,QAAAC,IAAAF,UAAA,KAAAA,UAAA,GAER,MAAM+qC,EAAS,IAAItC,GACbxoC,EAAS+pB,EAAO/pB,OAEtB,IAAK,IAAWwpC,EAAIC,EAAIN,EAAfv+B,EAAI,EAAkBA,EAAI5K,EAAQ4K,IAAK,CAI9C,GAHA4+B,EAAKzf,EAAOnf,GACZ6+B,EAAK1f,GAAQnf,EAAI,GAAK5K,GACtBmpC,EAAQX,GAAaa,kBAAkBC,EAAIC,EAAIC,EAAIC,EAAIX,GAAU,GAC5C,eAAjBK,EAAMV,OACR,OAAOU,EAET2B,EAAOpC,UAAUS,EAAMpf,OACzB,CAMA,OAJI+gB,EAAO/gB,OAAO/pB,OAAS,IACzB8qC,EAAOrC,OAAS,gBAGXqC,CACT,CAUA,8BAAOC,CACLzB,EACAC,EACAxf,GAEA,OAAOye,GAAaqC,qBAAqBvB,EAAIC,EAAIxf,GAAQ,EAC3D,CAWA,8BAAOihB,CACLC,EACAC,GAEA,MAAMJ,EAAS,IAAItC,GACjBxoC,EAASirC,EAAQjrC,OACbmrC,EAA+B,GAErC,IAAK,IAAIvgC,EAAI,EAAGA,EAAI5K,EAAQ4K,IAAK,CAC/B,MAAM0+B,EAAK2B,EAAQrgC,GACjB2+B,EAAK0B,GAASrgC,EAAI,GAAK5K,GACvBmpC,EAAQX,GAAauC,wBAAwBzB,EAAIC,EAAI2B,GAClC,eAAjB/B,EAAMV,QACR0C,EAAathC,KAAKs/B,GAClB2B,EAAOpC,OAAOY,EAAIC,IAElBuB,EAAOpC,UAAUS,EAAMpf,OAE3B,CAEA,OAAIohB,EAAanrC,OAAS,GAAKmrC,EAAanrC,SAAWirC,EAAQjrC,OACtD,IAAIwoC,GAAa,eACfsC,EAAO/gB,OAAO/pB,OAAS,IAChC8qC,EAAOrC,OAAS,gBAGXqC,EACT,CAUA,gCAAOM,CACLrhB,EACAshB,EACAC,GAEA,MAAMr+B,EAAMo+B,EAAGp+B,IAAIq+B,GACjBlnC,EAAMinC,EAAGjnC,IAAIknC,GACbC,EAAW,IAAIhgC,GAAMnH,EAAIqH,EAAGwB,EAAIzB,GAChCggC,EAAa,IAAIjgC,GAAM0B,EAAIxB,EAAGrH,EAAIoH,GAEpC,OAAOg9B,GAAawC,wBAAwBjhB,EAAQ,CAClD9c,EACAs+B,EACAnnC,EACAonC,GAEJ,ECvRK,MAAMC,WACHt5B,GAyCRu5B,IAAAA,GACE,OAAOjsC,KAAKksC,QAAQlgC,CACtB,CAKA+B,IAAAA,CAAKzC,GACHtL,KAAK8N,MAAM9N,KAAKksC,QAAQn+B,KAAKzC,GAC/B,CAKA6gC,IAAAA,GACE,OAAOnsC,KAAKksC,QAAQngC,CACtB,CAKAiC,IAAAA,CAAK1C,GACHtL,KAAK8N,MAAM9N,KAAKksC,QAAQl+B,KAAK1C,GAC/B,CAMA8gC,YAAAA,GACE,OAAOpsC,KAAK8R,IACd,CAMAu6B,YAAAA,CAAa/gC,GACXtL,KAAK8R,KAAOxG,CACd,CAMAghC,YAAAA,GACE,OAAOtsC,KAAK+R,GACd,CAMAw6B,YAAAA,CAAajhC,GACXtL,KAAK+R,IAAMzG,CACb,CAKA4gC,KAAAA,GACE,MAAMM,EAAmBxsC,KAAKysC,gBAC9B,OAAOzsC,KAAK0sC,MACR93B,GAAe43B,EAAkBxsC,KAAK0sC,MAAMzO,uBAC5CuO,CACN,CAYA1+B,KAAAA,CAAMyS,EAAc2M,EAAoBC,GAClCntB,KAAK0sC,QACPnsB,EAAQ3L,GACN2L,EACA1L,GAAgB7U,KAAK0sC,MAAMzO,yBAG/Bj+B,KAAK2sC,cAAcpsB,EAAO2M,EAASC,EACrC,CAKAsf,aAAAA,GACE,OAAO,IAAI3gC,GAAM9L,KAAK8R,KAAM9R,KAAK+R,IACnC,CAQA46B,aAAAA,CACEpsB,GAGA,IAFA2M,EAAiB5sB,UAAAC,OAAA,QAAAC,IAAAF,UAAA,GAAAA,UAAA,GAAGN,KAAKktB,QACzBC,EAAiB7sB,UAAAC,OAAA,QAAAC,IAAAF,UAAA,GAAAA,UAAA,GAAGN,KAAKmtB,QAEzBntB,KAAK2qB,oBAAoBpK,EAAO2M,EAASC,EAC3C,CAKUyf,gCAAAA,GACR,OAAO,CACT,CAKAC,SAAAA,GACE,MAAM16B,GAAEA,EAAE0P,GAAEA,EAAEzP,GAAEA,EAAE0P,GAAEA,GAClB9hB,KAAK8sC,UAAY9sC,KAAK8sC,QAAU9sC,KAAK+sC,eACjCC,EAAS,CAAC76B,EAAI0P,EAAIzP,EAAI0P,GAC5B,GAAI9hB,KAAK0sC,MAAO,CACd,MAAMn/B,EAAIvN,KAAK0sC,MAAMzO,sBACrB,OAAO+O,EAAO10B,IAAK5J,GAAMkG,GAAelG,EAAGnB,GAC7C,CACA,OAAOy/B,CACT,CAKAz6B,kBAAAA,CAAmBJ,EAAWC,GAM5B,MAA+B,iBALV22B,GAAa4C,0BAChC3rC,KAAK6sC,YACL16B,EACAC,GAEkB42B,MACtB,CAOAiE,oBAAAA,CAAqBzD,GACnB,MAAM0D,EAAenE,GAAawC,wBAChCvrC,KAAK6sC,YACLrD,EAAMqD,aAGR,MAC0B,iBAAxBK,EAAalE,QACW,eAAxBkE,EAAalE,QACbQ,EAAM2D,wBAAwBntC,OAC9BA,KAAKmtC,wBAAwB3D,EAEjC,CAOA2D,uBAAAA,CAAwB3D,GAEtB,OADexpC,KAAK6sC,YACNl4B,MAAO4L,GAAUipB,EAAM/2B,cAAc8N,GACrD,CAKA/N,qBAAAA,CAAsBL,EAAWC,GAC/B,MAAMN,KAAEA,EAAIC,IAAEA,EAAGC,MAAEA,EAAKC,OAAEA,GAAWjS,KAAKotC,kBAC1C,OACEt7B,GAAQK,EAAGnG,GACX8F,EAAOE,GAASI,EAAGpG,GACnB+F,GAAOI,EAAGpG,GACVgG,EAAME,GAAUG,EAAGrG,CAEvB,CAEA6F,aAAAA,CAAwC43B,GACtC,OACExpC,KAAKitC,qBAAqBzD,IAC1BxpC,KAAKmtC,wBAAwB3D,IAC7BA,EAAM2D,wBAAwBntC,KAElC,CAOAyS,aAAAA,CAAc8N,GACZ,OAAOwoB,GAAaQ,iBAAiBhpB,EAAOvgB,KAAK6sC,YACnD,CAOAQ,UAAAA,GACE,IAAKrtC,KAAKmD,OACR,OAAO,EAET,MAAMgP,GAAEA,EAAEC,GAAEA,GAAOpS,KAAKmD,OAAOye,UAG/B,QAFe5hB,KAAK6sC,YAGXh8B,KACJ0P,GACCA,EAAMvU,GAAKoG,EAAGpG,GACduU,EAAMvU,GAAKmG,EAAGnG,GACduU,EAAMxU,GAAKqG,EAAGrG,GACdwU,EAAMxU,GAAKoG,EAAGpG,OAMhB/L,KAAKuS,mBAAmBJ,EAAIC,IAIzBpS,KAAKyS,cAAcN,EAAGvE,aAAawE,IAC5C,CAMAk7B,mBAAAA,GACE,IAAKttC,KAAKmD,OACR,OAAO,EAET,MAAMgP,GAAEA,EAAEC,GAAEA,GAAOpS,KAAKmD,OAAOye,UAC/B,GAAI5hB,KAAKuS,mBAAmBJ,EAAIC,GAC9B,OAAO,EAQT,OAN4BpS,KAAK6sC,YAAYl4B,MAC1C4L,IACEA,EAAMvU,GAAKoG,EAAGpG,GAAKuU,EAAMvU,GAAKmG,EAAGnG,KACjCuU,EAAMxU,GAAKqG,EAAGrG,GAAKwU,EAAMxU,GAAKoG,EAAGpG,KAGR/L,KAAKyS,cAAcN,EAAGvE,aAAawE,GACnE,CAOAg7B,eAAAA,GACE,OAAO/iB,GAA0BrqB,KAAK6sC,YACxC,CAOAU,cAAAA,GACE,OAAOvtC,KAAKwtC,4BAA4BxhC,CAC1C,CAOAyhC,eAAAA,GACE,OAAOztC,KAAKwtC,4BAA4BzhC,CAC1C,CAOA+P,KAAAA,CAAMxQ,GACJtL,KAAK8S,KAAKtL,EAAS8D,GACnBtL,KAAK8S,KAAKrL,EAAS6D,GACnBtL,KAAK0f,WACP,CAOAguB,YAAAA,CAAapiC,GAEX,MAAMqiC,EACJ3tC,KAAKotC,kBAAkBp7B,MAAQhS,KAAKutC,iBACtC,OAAOvtC,KAAK8b,MAAMxQ,EAAQtL,KAAKgS,MAAQ27B,EACzC,CAOAC,aAAAA,CAActiC,GAEZ,MAAMqiC,EACJ3tC,KAAKotC,kBAAkBn7B,OAASjS,KAAKytC,kBACvC,OAAOztC,KAAK8b,MAAMxQ,EAAQtL,KAAKiS,OAAS07B,EAC1C,CAEAE,sBAAAA,GAAyB,IAAAC,EACvB,OAAkB,QAAXA,EAAA9tC,KAAKmD,cAAM,IAAA2qC,OAAA,EAAXA,EAAanuB,qBAAsB,CAC5C,CAMAouB,aAAAA,GACE,OAAO/tC,KAAK0sC,MACRl4B,GAAiBgB,GAAkBxV,KAAKi+B,wBACxCj+B,KAAKyL,KACX,CAMAuiC,oBAAAA,GAA+B,IAAAC,EAC7B,eAAOA,EAAAjuC,KAAKmD,cAAM,IAAA8qC,OAAA,EAAXA,EAAarvB,oBAAsBzY,EAAQ+E,QACpD,CAOA6hC,WAAAA,GACE,MAAMmB,EAAe93B,GAAmB,CAAE3K,MAAOzL,KAAKyL,SACpDO,EAAEA,EAACD,EAAEA,GAAM/L,KAAKmuB,yBAChBggB,EAAUh4B,GAAsBnK,EAAGD,GACnCqiC,EAAcp5B,GAA0Bm5B,EAASD,GACjDG,EAAMruC,KAAKwtC,4BACXc,EAAID,EAAIriC,EAAI,EACZqsB,EAAIgW,EAAItiC,EAAI,EACd,MAAO,CAELoG,GAAIyC,GAAe,CAAE5I,GAAIsiC,EAAGviC,GAAIssB,GAAK+V,GACrCvsB,GAAIjN,GAAe,CAAE5I,EAAGsiC,EAAGviC,GAAIssB,GAAK+V,GACpCtsB,GAAIlN,GAAe,CAAE5I,GAAIsiC,EAAGviC,EAAGssB,GAAK+V,GACpCh8B,GAAIwC,GAAe,CAAE5I,EAAGsiC,EAAGviC,EAAGssB,GAAK+V,GAEvC,CAOA1uB,SAAAA,GACE1f,KAAK8sC,QAAU9sC,KAAK+sC,aACtB,CAEAwB,kBAAAA,GAAgD,IAA7BC,EAASluC,UAAAC,OAAA,QAAAC,IAAAF,UAAA,IAAAA,UAAA,GACtBmuC,EAAmB,GAqBvB,OApBKD,GAAaxuC,KAAK0sC,QACrB+B,EAASzuC,KAAK0sC,MAAM6B,mBAAmBC,IAEzCC,EAAOrkC,KACLpK,KAAK+R,IACL/R,KAAK8R,KACL9R,KAAKgS,MACLhS,KAAKiS,OACLjS,KAAK6V,OACL7V,KAAK8V,OACL9V,KAAKyL,MACLzL,KAAKo9B,YACLp9B,KAAK+V,MACL/V,KAAKgW,OACJhW,KAAK+W,OACL/W,KAAKgX,MACN6U,GAAc7rB,KAAKktB,SACnBrB,GAAc7rB,KAAKmtB,UAGdshB,CACT,CASAxQ,mBAAAA,GAA+C,IAA3BuQ,EAASluC,UAAAC,OAAA,QAAAC,IAAAF,UAAA,IAAAA,UAAA,GACvB2W,EAASjX,KAAKyqB,gBAClB,GAAI+jB,IAAcxuC,KAAK0sC,MACrB,OAAOz1B,EAET,MAAM1V,EAAMvB,KAAKuuC,mBAAmBC,GAClC5pC,EAAQ5E,KAAK0uC,YACf,OAAI9pC,GAASA,EAAMrD,IAAIoT,MAAM,CAAC3I,EAAGb,IAAMa,IAAMzK,EAAI4J,IACxCvG,EAAM0G,OAEXtL,KAAK0sC,QACPz1B,EAASjC,GACPhV,KAAK0sC,MAAMzO,qBAAoB,GAC/BhnB,IAGJjX,KAAK0uC,YAAc,CACjBntC,MACA+J,MAAO2L,GAEFA,EACT,CAOAwT,aAAAA,GACE,MAAMlpB,EAAMvB,KAAKuuC,oBAAmB,GAClC3pC,EAAQ5E,KAAK2uC,eACf,GAAI/pC,GAASA,EAAMrD,MAAQA,EACzB,OAAOqD,EAAM0G,MAEf,MAAMyZ,EAAS/kB,KAAKmuB,yBAClBjsB,EAAU,CACRuJ,MAAOzL,KAAKyL,MACZwK,WAAY8O,EAAO/Y,EACnBkK,WAAY6O,EAAOhZ,EACnB8J,OAAQ7V,KAAK6V,OACbC,OAAQ9V,KAAK8V,OACbC,MAAO/V,KAAK+V,MACZC,MAAOhW,KAAKgW,MACZe,MAAO/W,KAAK+W,MACZC,MAAOhX,KAAKgX,OAEd1L,EAAQ4L,GAAchV,GAKxB,OAJAlC,KAAK2uC,eAAiB,CACpBptC,MACA+J,SAEKA,CACT,CAOAsjC,4BAAAA,GACE,OAAO,IAAI9iC,GAAM9L,KAAKgS,MAAOhS,KAAKiS,QAAQ7F,UAAUpM,KAAKo9B,YAC3D,CASAyR,2BAAAA,CAA4B3sC,GAC1B,OAAOlC,KAAKwtC,0BAA0BtrC,GACnCyM,UAAU3O,KAAKguC,wBAAwB,GACvC5hC,UAAU,EAAIpM,KAAKiuB,QACxB,CA2CAuf,yBAAAA,GAAoD,IAA1BtrC,EAAY5B,UAAAC,OAAA,QAAAC,IAAAF,UAAA,GAAAA,UAAA,GAAG,CAAA,EACvC,MAAMwuC,EAAa,CAIjBj5B,OAAQ7V,KAAK6V,OACbC,OAAQ9V,KAAK8V,OACbC,MAAO/V,KAAK+V,MACZC,MAAOhW,KAAKgW,MACZhE,MAAOhS,KAAKgS,MACZC,OAAQjS,KAAKiS,OACbmrB,YAAap9B,KAAKo9B,eAEfl7B,GAGCk7B,EAAc0R,EAAW1R,YAC/B,IAAI2R,EAAwB3R,EAC1B4R,EAAyB,EAEvBhvC,KAAK6+B,gBACPkQ,EAAwB,EACxBC,EAAyB5R,GAE3B,MAAMrS,EAAO+jB,EAAW98B,MAAQ+8B,EAC9B/jB,EAAO8jB,EAAW78B,OAAS88B,EAE7B,IAAIE,EAcJ,OAZEA,EAH8B,IAArBH,EAAW/4B,OAAoC,IAArB+4B,EAAW94B,MAG5B,IAAIlK,GACpBif,EAAO+jB,EAAWj5B,OAClBmV,EAAO8jB,EAAWh5B,QAGFgV,GAChBC,EACAC,EACAlU,GAAqBg4B,IAIlBG,EAAgB7iC,UAAU4iC,EACnC,CAWA5gB,sBAAAA,CACE7N,EACA2uB,EACAC,EACAC,EACAC,GAEA,IAAIrjC,EAAIuU,EAAMvU,EACZD,EAAIwU,EAAMxU,EACZ,MAAMsO,EAAUwR,GAAcujB,GAAavjB,GAAcqjB,GACvDhrB,EAAU2H,GAAcwjB,GAAaxjB,GAAcsjB,GAErD,GAAI90B,GAAW6J,EAAS,CACtB,MAAMmqB,EAAMruC,KAAKwtC,4BACjBxhC,GAAKqO,EAAUg0B,EAAIriC,EACnBD,GAAKmY,EAAUmqB,EAAItiC,CACrB,CAEA,OAAO,IAAID,GAAME,EAAGD,EACtB,CASAujC,sBAAAA,CACE/uB,EACA2M,EACAC,GAEA,GAAID,IAAY3mB,GAAU4mB,IAAY5mB,EACpC,OAAOga,EAET,MAAM7R,EAAI1O,KAAKouB,uBACb7N,EACA2M,EACAC,EACA5mB,EACAA,GAEF,OAAIvG,KAAKyL,MACAiD,EAAEN,OAAOkG,GAAiBtU,KAAKyL,OAAQ8U,GAEzC7R,CACT,CASA6gC,sBAAAA,CACExqB,EACAmI,EACAC,GAEA,MAAMze,EAAI1O,KAAKouB,uBACbrJ,EACAxe,EACAA,EACA2mB,EACAC,GAEF,OAAIntB,KAAKyL,MACAiD,EAAEN,OAAOkG,GAAiBtU,KAAKyL,OAAQsZ,GAEzCrW,CACT,CAMA4V,cAAAA,GACE,MAAMkrB,EAAYxvC,KAAKmuB,yBACvB,OAAOnuB,KAAK0sC,MACR93B,GAAe46B,EAAWxvC,KAAK0sC,MAAMzO,uBACrCuR,CACN,CAMArhB,sBAAAA,GACE,OAAOnuB,KAAKsvC,uBACV,IAAIxjC,GAAM9L,KAAK8R,KAAM9R,KAAK+R,KAC1B/R,KAAKktB,QACLltB,KAAKmtB,QAET,CAaAsiB,gBAAAA,CAAiBviB,EAAmBC,GAClC,OAAOntB,KAAKuvC,uBACVvvC,KAAKmuB,yBACLjB,EACAC,EAEJ,CASAxC,mBAAAA,CAAoB+kB,EAAYxiB,EAAmBC,GACjD,MAAMpI,EAAS/kB,KAAKsvC,uBAAuBI,EAAKxiB,EAASC,GACvD/R,EAAWpb,KAAKuvC,uBACdxqB,EACA/kB,KAAKktB,QACLltB,KAAKmtB,SAETntB,KAAKyI,IAAI,CAAEqJ,KAAMsJ,EAASpP,EAAG+F,IAAKqJ,EAASrP,GAC7C,CAKA4jC,iBAAAA,GACE,OAAO3vC,KAAKuvC,uBACVvvC,KAAKmuB,yBACL3nB,EACAC,EAEJ,SC3mBK,MAAMmpC,UAMH5D,GAiJR,kBAAO7sB,GACL,OAAOywB,EAAaxwB,WACtB,CAuBA,QAAI1W,GACF,MAAMmnC,EAAQ7vC,KAAKF,YAAoC4I,KACvD,MAAa,iBAATmnC,EACK,SAEFA,EAAK5qC,aACd,CAEA,QAAIyD,CAAK4C,GACP9J,EAAI,OAAQ,6BAA8B8J,EAC5C,CAMAxL,WAAAA,CAAYoC,GACV9B,QA/HFL,uBAQiD,MAwH/CU,OAAOC,OAAOV,KAAM4vC,EAAaxwB,aACjCpf,KAAK8vC,WAAW5tC,EAClB,CAMA6tC,kBAAAA,GACE/vC,KAAKojB,aAAe5P,KACpBxT,KAAKgwC,cAAgBhwC,KAAKojB,aAAahgB,WAAW,MAClDpD,KAAKiwC,qBAELjwC,KAAK6jC,OAAQ,CACf,CAWAqM,eAAAA,CACEC,GAEA,MAAMn+B,EAAQm+B,EAAKn+B,MACjBC,EAASk+B,EAAKl+B,OACdtN,EAAMxE,EAAOiwC,kBACb5iC,EAAMrN,EAAOkwC,kBACf,GACEr+B,GAASrN,GACTsN,GAAUtN,GACVqN,EAAQC,GAAU9R,EAAOqF,mBAQzB,OANIwM,EAAQxE,IACV2iC,EAAKn+B,MAAQxE,GAEXyE,EAASzE,IACX2iC,EAAKl+B,OAASzE,GAET2iC,EAET,MAAM5qC,EAAKyM,EAAQC,GAChBq+B,EAAMC,GAAQ3rC,EAAMU,gBAAgBC,GACrCyG,EAAIo3B,GAAS51B,EAAK8iC,EAAM3rC,GACxBoH,EAAIq3B,GAAS51B,EAAK+iC,EAAM5rC,GAW1B,OAVIqN,EAAQhG,IACVmkC,EAAKltB,OAASjR,EAAQhG,EACtBmkC,EAAKn+B,MAAQhG,EACbmkC,EAAKK,QAAS,GAEZv+B,EAASlG,IACXokC,EAAKjtB,OAASjR,EAASlG,EACvBokC,EAAKl+B,OAASlG,EACdokC,EAAKK,QAAS,GAETL,CACT,CAQAM,yBAAAA,GACE,MAAMC,EAAc1wC,KAAK2wC,wBAEvBtC,EAAMruC,KAAKwtC,0BAA0B,CAAEz3B,MAAO,EAAGC,MAAO,IACxD46B,EAAWvC,EAAIriC,EAAI0kC,EAAY1kC,EAAKhM,KAAK6V,OACzCg7B,EAAWxC,EAAItiC,EAAI2kC,EAAY3kC,EAAK/L,KAAK8V,OAC3C,MAAO,CAIL9D,MAAOtN,KAAKosC,KAAKF,EtDlbO,GsDmbxB3+B,OAAQvN,KAAKosC,KAAKD,EtDnbM,GsDobxB5tB,MAAOytB,EAAY1kC,EACnBkX,MAAOwtB,EAAY3kC,EACnBC,EAAG4kC,EACH7kC,EAAG8kC,EAEP,CAQAZ,kBAAAA,GACE,MAAM9sC,EAASnD,KAAKojB,aAClBhhB,EAAUpC,KAAKgwC,eACfh+B,MAAEA,EAAKC,OAAEA,EAAMgR,MAAEA,EAAKC,MAAEA,EAAKlX,EAAEA,EAACD,EAAEA,GAAM/L,KAAKkwC,gBAC3ClwC,KAAKywC,6BAEPM,EAAoB/+B,IAAU7O,EAAO6O,OAASC,IAAW9O,EAAO8O,OAChE++B,EAAchxC,KAAKijB,QAAUA,GAASjjB,KAAKkjB,QAAUA,EAEvD,IAAK/f,IAAWf,EACd,OAAO,EAKT,GAFqB2uC,GAAqBC,EAExB,CACZh/B,IAAU7O,EAAO6O,OAASC,IAAW9O,EAAO8O,QAC9C9O,EAAO6O,MAAQA,EACf7O,EAAO8O,OAASA,IAEhB7P,EAAQ6uC,aAAa,EAAG,EAAG,EAAG,EAAG,EAAG,GACpC7uC,EAAQ4e,UAAU,EAAG,EAAG7d,EAAO6O,MAAO7O,EAAO8O,SAE/C,MAAMi/B,EAAellC,EAAI,EACnBmlC,EAAgBplC,EAAI,EAS1B,OARA/L,KAAKqjB,kBACH3e,KAAKmpB,MAAM1qB,EAAO6O,MAAQ,EAAIk/B,GAAgBA,EAChDlxC,KAAKsjB,kBACH5e,KAAKmpB,MAAM1qB,EAAO8O,OAAS,EAAIk/B,GAAiBA,EAClD/uC,EAAQgvC,UAAUpxC,KAAKqjB,kBAAmBrjB,KAAKsjB,mBAC/ClhB,EAAQ0Z,MAAMmH,EAAOC,GACrBljB,KAAKijB,MAAQA,EACbjjB,KAAKkjB,MAAQA,GACN,CACT,CACA,OAAO,CACT,CAQU4sB,UAAAA,GAA8C,IAAnC5tC,EAA4B5B,UAAAC,OAAA,QAAAC,IAAAF,UAAA,GAAAA,UAAA,GAAG,CAAA,EAClDN,KAAK2S,YAAYzQ,EACnB,CAMAyM,SAAAA,CAAUgN,GACR,MAAM01B,EACHrxC,KAAK0sC,QAAU1sC,KAAK0sC,MAAMhqB,gBAC1B1iB,KAAK0sC,OAAS1sC,KAAKmD,QAAUwY,IAAS3b,KAAKmD,OAAkBmuC,WAC1DntB,EAAInkB,KAAKi+B,qBAAqBoT,GACpC11B,EAAIhN,UAAUwV,EAAE,GAAIA,EAAE,GAAIA,EAAE,GAAIA,EAAE,GAAIA,EAAE,GAAIA,EAAE,GAChD,CAMAotB,gBAAAA,GAKE,IAAKvxC,KAAK0sC,MACR,OAAO,IAAI5gC,GAAMpH,KAAKgH,IAAI1L,KAAK6V,QAASnR,KAAKgH,IAAI1L,KAAK8V,SAGxD,MAAM5T,EAAUwT,GAAY1V,KAAKi+B,uBACjC,OAAO,IAAInyB,GAAMpH,KAAKgH,IAAIxJ,EAAQ2T,QAASnR,KAAKgH,IAAIxJ,EAAQ4T,QAC9D,CAMA66B,qBAAAA,GACE,MAAM70B,EAAQ9b,KAAKuxC,mBACnB,GAAIvxC,KAAKmD,OAAQ,CACf,MAAMslB,EAAOzoB,KAAKmD,OAAOgd,UACnBqxB,EAASxxC,KAAK6tC,yBACpB,OAAO/xB,EAAMlP,eAAe6b,EAAO+oB,EACrC,CACA,OAAO11B,CACT,CAMA21B,gBAAAA,GACE,IAAI1U,EAAU/8B,KAAK+8B,QAInB,OAHI/8B,KAAK0sC,QACP3P,GAAW/8B,KAAK0sC,MAAM+E,oBAEjB1U,CACT,CASA2U,eAAAA,CAAgBpmC,GACd,OAAI5G,KAAKgH,IAAIJ,GAAStL,KAAKwjC,cACrBl4B,EAAQ,GACFtL,KAAKwjC,cAENxjC,KAAKwjC,cAEK,IAAVl4B,EACF,KAEFA,CACT,CAQAwH,IAAAA,CAAKvR,EAAa+J,GACZ/J,IAAQiG,GAAWjG,IAAQkG,IAC7B6D,EAAQtL,KAAK0xC,gBAAgBpmC,IAE3B/J,IAAQiG,GAAW8D,EAAQ,GAC7BtL,KAAK+W,OAAS/W,KAAK+W,MACnBzL,IAAS,GACQ,WAAR/J,GAAoB+J,EAAQ,GACrCtL,KAAKgX,OAAShX,KAAKgX,MACnB1L,IAAS,GAEQ,WAAR/J,IAAoB+J,GAAWA,aAAiBq3B,KACzDr3B,EAAQ,IAAIq3B,GAAOr3B,IAGrB,MAAMqmC,EAAY3xC,KAAKuB,KAAuB+J,EAqB9C,OApBAtL,KAAKuB,GAAqB+J,EAIxBqmC,GACC3xC,KAAKF,YAAoCwjC,gBAAgB1yB,SAASrP,KAEnEvB,KAAK6jC,OAAQ,GAKf7jC,KAAK4xC,SACF5xC,KAAK6jC,OACH8N,GACE3xC,KAAKF,YAAoCujC,gBAAgBzyB,SACxDrP,KAENvB,KAAK4xC,OAAO9+B,KAAK,SAAS,GAErB9S,IACT,CAMA6xC,YAAAA,GACE,OACmB,IAAjB7xC,KAAK+8B,UACH/8B,KAAKgS,QAAUhS,KAAKiS,QAA+B,IAArBjS,KAAKo9B,cACpCp9B,KAAKsS,OAEV,CAMAkR,MAAAA,CAAO7H,GAED3b,KAAK6xC,gBAIP7xC,KAAKmD,QACLnD,KAAKmD,OAAOob,gBACXve,KAAK0sC,QACL1sC,KAAKqtC,eAIR1xB,EAAI2G,OACJtiB,KAAK8xC,yBAAyBn2B,GAC9B3b,KAAK+xC,wBAAwBp2B,GAC7B3b,KAAK2O,UAAUgN,GACf3b,KAAKgyC,YAAYr2B,GACjB3b,KAAKiyC,WAAWt2B,GACZ3b,KAAKyiB,eACNziB,KAA6B2iB,cAC7B3iB,KAA6BkyC,kBAAkBv2B,KAEhD3b,KAAKmyC,qBACLnyC,KAAKoyC,WAAWz2B,GAAK,EAAO,CAAA,GAC5B3b,KAAK6jC,OAAQ,GAEfloB,EAAI6G,UACN,CAEAuvB,uBAAAA,CAAwB/vB,GACtB,CAGFW,WAAAA,CAAuCzgB,GAKrC,GAJAA,EAAUA,GAAW,CAAA,EAChBlC,KAAKojB,cAAiBpjB,KAAKgwC,eAC9BhwC,KAAK+vC,qBAEH/vC,KAAKqyC,gBAAkBryC,KAAKgwC,cAAe,CAC7C,MAAM/sB,MAAEA,EAAKC,MAAEA,EAAKG,kBAAEA,EAAiBC,kBAAEA,GAAsBtjB,MACzDgS,MAAEA,EAAKC,OAAEA,GAAWjS,KAAKojB,aAC/BpjB,KAAKoyC,WAAWpyC,KAAKgwC,cAAe9tC,EAAQ0gB,YAAa,CACvDK,QACAC,QACAG,oBACAC,oBACAtR,QACAC,SACAqgC,gBAAiB,KAEnBtyC,KAAK6jC,OAAQ,CACf,CACF,CAKAsO,kBAAAA,GACEnyC,KAAKojB,kBAAe5iB,EACpBR,KAAKgwC,cAAgB,IACvB,CAYAuC,SAAAA,GACE,QACIvyC,KAAK49B,QAA0B,gBAAhB59B,KAAK49B,QAAiD,IAArB59B,KAAKo9B,WAE3D,CAYAoV,OAAAA,GACE,QAASxyC,KAAK0jB,MAAsB,gBAAd1jB,KAAK0jB,IAC7B,CAUA+uB,gBAAAA,GAEE,SACEzyC,KAAKk/B,aAAer3B,GACpB7H,KAAKwyC,WACLxyC,KAAKuyC,aACHvyC,KAAK69B,WAIL79B,KAAKmiB,QAIX,CAWAM,WAAAA,GAIE,OAHAziB,KAAK0yC,WACF1yC,KAAKyjC,iBAAmBzjC,KAAK4xC,SAAW5xC,KAAK4xC,OAAOe,eACrD3yC,KAAKyyC,mBACAzyC,KAAK0yC,UACd,CAQAE,cAAAA,GACE,QACI5yC,KAAK69B,SAAmC,IAAxB79B,KAAK69B,OAAOxjB,SAAyC,IAAxBra,KAAK69B,OAAO3Z,QAE/D,CAOA2uB,mBAAAA,CACEl3B,EACAwG,EACA2wB,GAEAn3B,EAAI2G,OAGAH,EAASuhB,SACX/nB,EAAIqH,yBAA2B,kBAE/BrH,EAAIqH,yBAA2B,iBAEjCrH,EAAIs1B,aAAa,EAAG,EAAG,EAAG,EAAG,EAAG,GAChCt1B,EAAIwH,UAAU2vB,EAAoB,EAAG,GACrCn3B,EAAI6G,SACN,CAQA4vB,UAAAA,CACEz2B,EACAiH,EACAxgB,GAEA,MAAM2wC,EAAe/yC,KAAK0jB,KACxBsvB,EAAiBhzC,KAAK49B,OACpBhb,GACF5iB,KAAK0jB,KAAO,QACZ1jB,KAAK49B,OAAS,GACd59B,KAAKizC,uBAAuBt3B,IAE5B3b,KAAKqiB,kBAAkB1G,GAEzB3b,KAAKkzC,QAAQv3B,GACb3b,KAAKmzC,cAAcx3B,EAAK3b,KAAKmiB,SAAU/f,GACvCpC,KAAK0jB,KAAOqvB,EACZ/yC,KAAK49B,OAASoV,CAChB,CAEQI,mBAAAA,CAENjxB,EACA/f,GAEA,MAAMe,EAASyQ,GAAuBxR,GAChCuZ,EAAMxY,EAAOC,WAAW,MAQ9B,GAPAuY,EAAIy1B,UAAUhvC,EAAQihB,kBAAmBjhB,EAAQkhB,mBACjD3H,EAAIG,MAAM1Z,EAAQ6gB,MAAO7gB,EAAQ8gB,OACjCf,EAASiB,aAAejgB,EACxBf,EAAQkwC,gBAAgBvxC,QAASsyC,IAC/BA,EAAa1kC,UAAUgN,KAEzBvZ,EAAQkwC,gBAAgBloC,KAAK+X,GACzBA,EAAS4c,mBAAoB,CAC/B,MAAM5a,EAAItP,GAAgB7U,KAAKi+B,uBAC/BtiB,EAAIhN,UAAUwV,EAAE,GAAIA,EAAE,GAAIA,EAAE,GAAIA,EAAE,GAAIA,EAAE,GAAIA,EAAE,GAChD,CAGA,OAFAhC,EAASxT,UAAUgN,GACnBwG,EAASiwB,WAAWz2B,GAAK,EAAMvZ,GACxBe,CACT,CAOAgwC,aAAAA,CACEx3B,EACAwG,EACA/f,GAEA,IAAK+f,EACH,OAIFA,EAASO,gBAAiB,EAC1B,MAAMvf,EAAUnD,KAA6BozC,oBAC3CjxB,EACA/f,GAEFpC,KAAK6yC,oBAAoBl3B,EAAKwG,EAAUhf,EAC1C,CAMA+uC,iBAAAA,CAA6Cv2B,GAC3CA,EAAIG,MAAM,EAAI9b,KAAKijB,MAAO,EAAIjjB,KAAKkjB,OACnCvH,EAAIwH,UACFnjB,KAAKojB,cACJpjB,KAAKqjB,mBACLrjB,KAAKsjB,kBAEV,CAUA+uB,YAAAA,GAAiC,IAApBiB,EAAUhzC,UAAAC,OAAA,QAAAC,IAAAF,UAAA,IAAAA,UAAA,GACrB,GAAIN,KAAK6xC,eACP,OAAO,EAET,MAAM1uC,EAASnD,KAAKojB,aACdzH,EAAM3b,KAAKgwC,cACjB,SAAI7sC,IAAUwY,GAAQ23B,IAActzC,KAAKiwC,0BAInCjwC,KAAK6jC,OAAU7jC,KAAKmiB,UAAYniB,KAAKmiB,SAAS4c,sBAC5C57B,GAAUwY,IAAQ23B,IACpB33B,EAAI2G,OACJ3G,EAAIs1B,aAAa,EAAG,EAAG,EAAG,EAAG,EAAG,GAChCt1B,EAAIqF,UAAU,EAAG,EAAG7d,EAAO6O,MAAO7O,EAAO8O,QACzC0J,EAAI6G,YAEC,EAIb,CAOAH,iBAAAA,CAAkB1G,GAChB,IAAK3b,KAAKie,gBACR,OAEF,MAAMowB,EAAMruC,KAAK4uC,+BACjBjzB,EAAIsI,UAAYjkB,KAAKie,gBAErBtC,EAAI43B,UAAUlF,EAAIriC,EAAI,GAAIqiC,EAAItiC,EAAI,EAAGsiC,EAAIriC,EAAGqiC,EAAItiC,GAGhD/L,KAAKwzC,cAAc73B,EACrB,CAMAq2B,WAAAA,CAAYr2B,GACN3b,KAAK0sC,QAAU1sC,KAAK0sC,MAAMhqB,eAC5B/G,EAAI83B,YAAczzC,KAAKyxC,mBAEvB91B,EAAI83B,aAAezzC,KAAK+8B,OAE5B,CAEA2W,gBAAAA,CACE/3B,EACAg4B,GAUA,MAAM/V,EAAS+V,EAAK/V,OAChBA,IACFjiB,EAAIi4B,UAAYD,EAAKvW,YACrBzhB,EAAIk4B,QAAUF,EAAKpW,cACnB5hB,EAAIm4B,eAAiBH,EAAKrW,iBAC1B3hB,EAAIo4B,SAAWJ,EAAKnW,eACpB7hB,EAAIq4B,WAAaL,EAAKlW,iBAClB1jB,GAAS6jB,GAEwC,eAAhDA,EAA8BqW,eAC9BrW,EAA8BxZ,mBAC9BwZ,EAAmBvZ,iBAMpBrkB,KAAKk0C,oCAAoCv4B,EAAKiiB,IAG9CjiB,EAAIw4B,YAAcvW,EAAO3jB,OAAO0B,GAChC3b,KAAKo0C,+BAA+Bz4B,EAAKiiB,IAI3CjiB,EAAIw4B,YAAcR,EAAK/V,OAG7B,CAEAyW,cAAAA,CAAe14B,EAA6B7W,GAAgC,IAA9B4e,KAAEA,GAA0B5e,EACpE4e,IACE3J,GAAS2J,IACX/H,EAAIsI,UAAYP,EAAKzJ,OAAO0B,GAC5B3b,KAAKo0C,+BAA+Bz4B,EAAK+H,IAEzC/H,EAAIsI,UAAYP,EAGtB,CAEAuvB,sBAAAA,CAAuBt3B,GACrBA,EAAI83B,YAAc,EAClB93B,EAAIw4B,YAAc,cAClBx4B,EAAIsI,UAAY,SAClB,CAQAqwB,YAAAA,CAAa34B,EAA+B44B,GACrCA,GAAkC,IAArBA,EAAUh0C,QAG5Bob,EAAI64B,YAAYD,EAClB,CAMAtC,UAAAA,CAAWt2B,GACT,IAAK3b,KAAK69B,OACR,OAGF,MAAMA,EAAS79B,KAAK69B,OAClB16B,EAASnD,KAAKmD,OACdyY,EAAgB5b,KAAK6tC,0BACpB4G,EAAE,CAAA,CAAMC,IAAMvxC,aAAM,EAANA,EAAQyb,oBAAqBzY,EAC5CwuC,EAAQF,EAAK74B,EACbg5B,EAAQF,EAAK94B,EACbi5B,EAAUhX,EAAOsF,WAAa,IAAIr3B,GAAM,EAAG,GAAK9L,KAAKuxC,mBACvD51B,EAAIm5B,YAAcjX,EAAO7E,MACzBrd,EAAIo5B,WACDlX,EAAOiF,KACN3iC,EAAO60C,2BACNL,EAAQC,IACRC,EAAQ7oC,EAAI6oC,EAAQ9oC,GACvB,EACF4P,EAAIs5B,cAAgBpX,EAAOxjB,QAAUs6B,EAAQE,EAAQ7oC,EACrD2P,EAAIu5B,cAAgBrX,EAAO3Z,QAAU0wB,EAAQC,EAAQ9oC,CACvD,CAMAynC,aAAAA,CAAc73B,GACP3b,KAAK69B,SAIVliB,EAAIm5B,YAAc,GAClBn5B,EAAIo5B,WAAap5B,EAAIs5B,cAAgBt5B,EAAIu5B,cAAgB,EAC3D,CAOAd,8BAAAA,CACEz4B,EACA3B,GAEA,IAAKD,GAASC,GACZ,MAAO,CAAEK,QAAS,EAAG6J,QAAS,GAEhC,MAAM3W,EACHyM,EAA8BoK,mBAC9BpK,EAAmBqK,iBAChBhK,GAAWra,KAAKgS,MAAQ,EAAIgI,EAAOK,SAAW,EAClD6J,GAAWlkB,KAAKiS,OAAS,EAAI+H,EAAOkK,SAAW,EAUjD,MARqD,eAAhDlK,EAA8Bi6B,cACjCt4B,EAAIhN,UAAU3O,KAAKgS,MAAO,EAAG,EAAGhS,KAAKiS,OAAQoI,EAAS6J,GAEtDvI,EAAIhN,UAAU,EAAG,EAAG,EAAG,EAAG0L,EAAS6J,GAEjC3W,GACFoO,EAAIhN,UAAUpB,EAAE,GAAIA,EAAE,GAAIA,EAAE,GAAIA,EAAE,GAAIA,EAAE,GAAIA,EAAE,IAEzC,CAAE8M,QAASA,EAAS6J,QAASA,EACtC,CAMAixB,mBAAAA,CAAoBx5B,GACd3b,KAAKk/B,aAAer3B,GACtB7H,KAAKo1C,cAAcz5B,GACnB3b,KAAKq1C,YAAY15B,KAEjB3b,KAAKq1C,YAAY15B,GACjB3b,KAAKo1C,cAAcz5B,GAEvB,CASAu3B,OAAAA,CAAQlxB,GACN,CAOFqzB,WAAAA,CAAY15B,GACL3b,KAAK0jB,OAIV/H,EAAI2G,OACJtiB,KAAKq0C,eAAe14B,EAAK3b,MACH,YAAlBA,KAAKm9B,SACPxhB,EAAI+H,KAAK,WAET/H,EAAI+H,OAEN/H,EAAI6G,UACN,CAMA4yB,aAAAA,CAAcz5B,GACZ,GAAK3b,KAAK49B,QAA+B,IAArB59B,KAAKo9B,YAAzB,CASA,GALIp9B,KAAK69B,SAAW79B,KAAK69B,OAAOqF,cAC9BljC,KAAKwzC,cAAc73B,GAGrBA,EAAI2G,OACAtiB,KAAK6+B,cAAe,CACtB,MAAMgW,EAAU70C,KAAKuxC,mBACrB51B,EAAIG,MAAM,EAAI+4B,EAAQ7oC,EAAG,EAAI6oC,EAAQ9oC,EACvC,CACA/L,KAAKs0C,aAAa34B,EAAK3b,KAAKq9B,iBAC5Br9B,KAAK0zC,iBAAiB/3B,EAAK3b,MAC3B2b,EAAIiiB,SACJjiB,EAAI6G,SAdJ,CAeF,CAaA0xB,mCAAAA,CACEv4B,EACA3B,GACA,IAAAs7B,EACA,MAAMnF,EAAOnwC,KAAKkwC,gBAAgBlwC,KAAKywC,6BACrC70B,EAAgB5b,KAAK6tC,yBACrB77B,EAAQm+B,EAAKnkC,EAAIhM,KAAK6V,OAAS+F,EAC/B3J,EAASk+B,EAAKpkC,EAAI/L,KAAK8V,OAAS8F,EAChC25B,EAAU3hC,GAAuB,CAG/B5B,MAAOtN,KAAKosC,KAAK9+B,GACjBC,OAAQvN,KAAKosC,KAAK7+B,KAGhBujC,EAAOD,EAAQnyC,WAAW,MAC3BoyC,IAGLA,EAAK3xB,YACL2xB,EAAK1xB,OAAO,EAAG,GACf0xB,EAAKzxB,OAAO/R,EAAO,GACnBwjC,EAAKzxB,OAAO/R,EAAOC,GACnBujC,EAAKzxB,OAAO,EAAG9R,GACfujC,EAAKxxB,YACLwxB,EAAKpE,UAAUp/B,EAAQ,EAAGC,EAAS,GACnCujC,EAAK15B,MACHq0B,EAAKltB,MAAQjjB,KAAK6V,OAAS+F,EAC3Bu0B,EAAKjtB,MAAQljB,KAAK8V,OAAS8F,GAE7B5b,KAAKo0C,+BAA+BoB,EAAMx7B,GAC1Cw7B,EAAKvxB,UAAYjK,EAAOC,OAAO0B,GAC/B65B,EAAK9xB,OACL/H,EAAIy1B,WACDpxC,KAAKgS,MAAQ,EAAIhS,KAAKo9B,YAAc,GACpCp9B,KAAKiS,OAAS,EAAIjS,KAAKo9B,YAAc,GAExCzhB,EAAIG,MACDF,EAAgB5b,KAAK6V,OAAUs6B,EAAKltB,MACpCrH,EAAgB5b,KAAK8V,OAAUq6B,EAAKjtB,OAEvCvH,EAAIw4B,YAAsD,QAA3CmB,EAAGE,EAAKC,cAAcF,EAAS,oBAAY,IAAAD,EAAAA,EAAI,GAChE,CAQAI,sBAAAA,GACE,OAAO,IAAI5pC,GAAM9L,KAAK8R,KAAO9R,KAAKgS,MAAQ,EAAGhS,KAAK+R,IAAM/R,KAAKiS,OAAS,EACxE,CAOA9D,KAAAA,CAAM8W,GACJ,MAAM0wB,EAAa31C,KAAKma,SAAS8K,GACjC,OAAQjlB,KAAKF,YAAoCyY,WAC/Co9B,EAEJ,CAqBAC,YAAAA,CAAa1zC,GACX,MAAM6R,EAAW/T,KAAKsoB,gBAAgBpmB,GAGtC,OAAO,IADY+F,EAAcI,SAA6B,SACvD,CAAe0L,EACxB,CAiBAuU,eAAAA,GAA4D,IAA5CpmB,EAAqC5B,UAAAC,OAAA,QAAAC,IAAAF,UAAA,GAAAA,UAAA,GAAG,CAAA,EACtD,MAAMu1C,EAAahrB,GAAoB7qB,MACrC81C,EAAgB91C,KAAK0sC,MACrBqJ,EAAiB/1C,KAAK69B,OACtBnyB,EAAMhH,KAAKgH,IACXkQ,EAAgB1Z,EAAQsc,oBAAsBha,IAAwB,EACtE4jB,GAAclmB,EAAQkmB,YAAc,GAAKxM,EACzCo6B,EACE9zC,EAAQ8zC,gBAAc,CACpB36B,GACA,IAAIwD,GAAaxD,EAAI,CACnBmD,qBAAqB,EACrBF,mBAAmB,EACnBC,eAAe,YAEhBve,KAAK0sC,MACRxqC,EAAQ+zC,kBACVrrB,GAAqB5qB,MAEnBkC,EAAQg0C,gBACVl2C,KAAK69B,OAAS,MAEZ37B,EAAQ0c,mBACV2M,GAAkBvrB,KAAMA,KAAKguC,wBAG/BhuC,KAAK0f,YACL,MAAMrE,EAAK7H,KACT2iC,EAAen2C,KAAKotC,kBACpBvP,EAAS79B,KAAK69B,OACduY,EAAe,IAAItqC,GAErB,GAAI+xB,EAAQ,CACV,MAAMkX,EAAalX,EAAOiF,KACpB+R,EAAUhX,EAAOsF,WACnB,IAAIr3B,GAAM,EAAG,GACb9L,KAAKuxC,mBAET6E,EAAapqC,EACX,EAAItH,KAAKmpB,MAAMniB,EAAImyB,EAAOxjB,SAAW06B,GAAcrpC,EAAImpC,EAAQ7oC,GACjEoqC,EAAarqC,EACX,EAAIrH,KAAKmpB,MAAMniB,EAAImyB,EAAO3Z,SAAW6wB,GAAcrpC,EAAImpC,EAAQ9oC,EACnE,CACA,MAAMiG,EAAQmkC,EAAankC,MAAQokC,EAAapqC,EAC9CiG,EAASkkC,EAAalkC,OAASmkC,EAAarqC,EAG9CsP,EAAGrJ,MAAQtN,KAAKosC,KAAK9+B,GACrBqJ,EAAGpJ,OAASvN,KAAKosC,KAAK7+B,GACtB,MAAM9O,EAAS6yC,EAAe36B,GACP,SAAnBnZ,EAAQ8R,SACV7Q,EAAO8a,gBAAkB,QAE3Bje,KAAK2qB,oBACH,IAAI7e,GAAM3I,EAAO6O,MAAQ,EAAG7O,EAAO8O,OAAS,GAC5C1L,EACAA,GAEF,MAAM8vC,EAAiBr2C,KAAKmD,OAG5BA,EAAO6L,SAAW,CAAChP,MACnBA,KAAKyI,IAAI,SAAUtF,GACnBnD,KAAK0f,YACL,MAAM3L,EAAW5Q,EAAOmlB,gBAAgBF,GAAc,EAAGlmB,GAczD,OAbAlC,KAAKyI,IAAI,SAAU4tC,GACnBr2C,KAAK69B,OAASkY,EACVD,IACF91C,KAAK0sC,MAAQoJ,GAEf91C,KAAKyI,IAAIotC,GACT71C,KAAK0f,YAILvc,EAAO6L,SAAW,GAElB7L,EAAOgmB,UACApV,CACT,CAiBAD,SAAAA,GAA0C,IAAhC5R,EAAyB5B,UAAAC,OAAA,QAAAC,IAAAF,UAAA,GAAAA,UAAA,GAAG,CAAA,EACpC,OAAOwT,GACL9T,KAAKsoB,gBAAgBpmB,GACrBA,EAAQ8R,QAAU,MAClB9R,EAAQ+R,SAAW,EAEvB,CACAC,MAAAA,GAAuC,IAAhChS,EAAyB5B,UAAAC,OAAA,QAAAC,IAAAF,UAAA,GAAAA,UAAA,GAAG,CAAA,EACjC,OAAO4T,GACLlU,KAAKsoB,gBAAgBpmB,GACrBA,EAAQ8R,QAAU,MAClB9R,EAAQ+R,SAAW,EAEvB,CAgBA1D,MAAAA,GAA2B,IAAA,IAAA7O,EAAApB,UAAAC,OAAjB6P,EAAK,IAAAxO,MAAAF,GAAAG,EAAA,EAAAA,EAAAH,EAAAG,IAALuO,EAAKvO,GAAAvB,UAAAuB,GACb,OACEuO,EAAMQ,SAAU5Q,KAAKF,YAAoC4I,OACzD0H,EAAMQ,SAAS5Q,KAAK0I,KAExB,CAMAqI,UAAAA,GACE,OAAO,CACT,CAMAqU,MAAAA,GAEE,OAAOplB,KAAKma,UACd,CAMA/L,MAAAA,CAAO3C,GACL,MAAMk4B,iBAAEA,EAAgBzW,QAAEA,EAAOC,QAAEA,GAAYntB,KAE/C,GAAI2jC,EAAkB,CACpB,MAAM33B,EAAEA,EAACD,EAAEA,GAAM/L,KAAKmuB,yBACtBnuB,KAAKktB,QAAU3mB,EACfvG,KAAKmtB,QAAU5mB,EACfvG,KAAK8R,KAAO9F,EACZhM,KAAK+R,IAAMhG,CACb,CAIA,GAFA/L,KAAKyI,IAAI,QAASgD,GAEdk4B,EAAkB,CACpB,MAAM33B,EAAEA,EAACD,EAAEA,GAAM/L,KAAKuvC,uBACpBvvC,KAAKmuB,yBACLjB,EACAC,GAEFntB,KAAK8R,KAAO9F,EACZhM,KAAK+R,IAAMhG,EACX/L,KAAKktB,QAAUA,EACfltB,KAAKmtB,QAAUA,CACjB,CACF,CAQAmpB,UAAAA,GACE,CAQFxE,wBAAAA,CAAyBn2B,GACnB3b,KAAKgjB,2BACPrH,EAAIqH,yBAA2BhjB,KAAKgjB,yBAExC,CAMA3e,OAAAA,GACEyE,EAAkBa,eAAe3J,MACjCA,KAAKmK,MACLnK,KAAK8S,KAAK,cAAUtS,GAEpBR,KAAKojB,cAAgBpf,IAASK,QAAQrE,KAAKojB,cAC3CpjB,KAAKojB,kBAAe5iB,EACpBR,KAAKgwC,cAAgB,IACvB,CAqBApH,OAAAA,CACE2N,EACAr0C,GAEA,OAAOzB,OAAOwJ,QAAQssC,GAAYl1C,OAChC,CAACC,EAAGiJ,KAAsB,IAAnBhJ,EAAK2lC,GAAS38B,EAEnB,OADAjJ,EAAIC,GAAOvB,KAAKw2C,SAASj1C,EAAK2lC,EAAUhlC,GACjCZ,GAET,CAAA,EAEJ,CAQAk1C,QAAAA,CACEj1C,EACA2lC,GAEe,IADfhlC,EAAqC5B,UAAAC,OAAA,QAAAC,IAAAF,UAAA,GAAAA,UAAA,GAAG,CAAA,EAExC,MAAM4hB,EAAO3gB,EAAIg6B,MAAM,KACjBkb,EACJz2C,KAAKF,YACL42C,gBAAgB9lC,SAASsR,EAAKA,EAAK3hB,OAAS,KACxC+I,MAAEA,EAAK88B,WAAEA,EAAUM,SAAEA,EAAQC,WAAEA,GAAezkC,EAC9Cy0C,EAAmB,IACpBz0C,EACHwH,OAAQ1J,KAERomC,WACEA,QAAAA,EAAclkB,EAAK7gB,OAAO,CAACsP,EAAWpP,IAAQoP,EAAKpP,GAAMvB,MAC3DknC,WACA59B,MAAOA,aAAK,EAALA,EAAOu9B,KAAK7mC,MACnB0mC,SAAUA,CACRp7B,EACA28B,EACAD,KAEA9lB,EAAK7gB,OAAO,CAACsP,EAA2BpP,EAAKyH,KACvCA,IAAUkZ,EAAK3hB,OAAS,IAC1BoQ,EAAKpP,GAAO+J,GAEPqF,EAAKpP,IACXvB,MACH0mC,GAEEA,EAASp7B,EAAO28B,EAAeD,IAEnCrB,WAAYA,CACVr7B,EACA28B,EACAD,KAEAhoC,KAAK0f,YACLinB,GAEEA,EAAWr7B,EAAO28B,EAAeD,KAIvC,OACEyO,EACI3N,GAAa6N,GACb/N,GACE+N,EAGV,CAgBAC,cAAAA,CAAeltC,GACb,MAAMkoC,OAAEA,EAAMlF,MAAEA,GAAU1sC,KAC1B,OACE4xC,IAAWloC,GACXgjC,IAAUhjC,KAEPkoC,GAAUA,EAAOgF,eAAeltC,MAChCgjC,GAASA,IAAUkF,GAAUlF,EAAMkK,eAAeltC,EAEzD,CAKAmtC,YAAAA,GACE,MAAMC,EAAyB,GAE/B,IAAIlF,EAAgC5xC,KACpC,GACE4xC,EAASA,EAAOA,OAChBA,GAAUkF,EAAU1sC,KAAKwnC,SAClBA,GACT,OAAOkF,CACT,CAQAC,mBAAAA,CAAoCvN,GAClC,GAAIxpC,OAASwpC,EACX,MAAO,CACLwN,KAAM,GACNC,UAAW,GACXC,OAAQ,CAACl3C,QAASA,KAAK62C,iBAG3B,MAAMC,EAAY92C,KAAK62C,eACjBM,EAAiB3N,EAAMqN,eAE7B,GACuB,IAArBC,EAAUv2C,QACV42C,EAAe52C,OAAS,GACxBP,OAASm3C,EAAeA,EAAe52C,OAAS,GAEhD,MAAO,CACLy2C,KAAM,GACNC,UAAW,CACTzN,KACG2N,EAAepd,MAAM,EAAGod,EAAe52C,OAAS,IAErD22C,OAAQ,CAACl3C,OAIb,IAAK,IAAWo3C,EAAPjsC,EAAI,EAAaA,EAAI2rC,EAAUv2C,OAAQ4K,IAAK,CAEnD,GADAisC,EAAWN,EAAU3rC,GACjBisC,IAAa5N,EACf,MAAO,CACLwN,KAAM,CAACh3C,QAAS82C,EAAU/c,MAAM,EAAG5uB,IACnC8rC,UAAW,GACXC,OAAQJ,EAAU/c,MAAM5uB,IAG5B,IAAK,IAAIksC,EAAI,EAAGA,EAAIF,EAAe52C,OAAQ82C,IAAK,CAC9C,GAAIr3C,OAASm3C,EAAeE,GAC1B,MAAO,CACLL,KAAM,GACNC,UAAW,CAACzN,KAAU2N,EAAepd,MAAM,EAAGsd,IAC9CH,OAAQ,CAACl3C,QAAS82C,IAGtB,GAAIM,IAAaD,EAAeE,GAC9B,MAAO,CACLL,KAAM,CAACh3C,QAAS82C,EAAU/c,MAAM,EAAG5uB,IACnC8rC,UAAW,CAACzN,KAAU2N,EAAepd,MAAM,EAAGsd,IAC9CH,OAAQJ,EAAU/c,MAAM5uB,GAG9B,CACF,CAEA,MAAO,CACL6rC,KAAM,CAACh3C,QAAS82C,GAChBG,UAAW,CAACzN,KAAU2N,GACtBD,OAAQ,GAEZ,CAOAI,kBAAAA,CAAmC9N,GACjC,MAAM+N,EAAkBv3C,KAAK+2C,oBAAoBvN,GACjD,OAAO+N,KAAqBA,EAAgBL,OAAO32C,MACrD,CAOAi3C,WAAAA,CAA4BhO,GAC1B,GAAIxpC,OAASwpC,EACX,OAEF,MAAMiO,EAAez3C,KAAK+2C,oBAAoBvN,GAE9C,GAAIiO,EAAaT,KAAKpmC,SAAS44B,GAC7B,OAAO,EAET,GAAIiO,EAAaR,UAAUrmC,SAAS5Q,MAClC,OAAO,EAIT,MAAM03C,EAAsBD,EAAaP,OAAO,IAAMl3C,KAAKmD,OAC3D,IAAKu0C,EACH,OAEF,MAAMC,EAAaF,EAAaT,KAAKY,MACnCC,EAAkBJ,EAAaR,UAAUW,MACzCE,EAAaJ,EAAoC1oC,SAAS/F,QACxD0uC,GAEFI,EAAcL,EAAoC1oC,SAAS/F,QACzD4uC,GAEJ,OAAOC,MAAkBA,EAAYC,CACvC,CAcA59B,QAAAA,GACE,MAAM69B,GAD2B13C,UAAAC,OAAA,QAAAC,IAAAF,UAAA,GAAAA,UAAA,GAAG,IACc4K,OAChD0kC,EAAaqI,iBACZj4C,KAAKF,YAAoCm4C,kBAAoB,IAEhE,IAAI3yB,EACJ,MAAMzL,EAAsB1Z,EAAO0Z,qBAC7BsI,SACJA,EAAQuB,KACRA,EAAIka,OACJA,EAAMC,OACNA,EAAMR,gBACNA,EAAevrB,KACfA,EAAIC,IACJA,EAAGmb,QACHA,EAAOC,QACPA,EAAOnb,MACPA,EAAKC,OACLA,EAAMmrB,YACNA,EAAWG,cACXA,EAAaD,iBACbA,EAAgBE,eAChBA,EAAcqB,cACdA,EAAapB,iBACbA,EAAgB5nB,OAChBA,EAAMC,OACNA,EAAMrK,MACNA,EAAKsL,MACLA,EAAKC,MACLA,EAAK+lB,QACLA,EAAOzqB,QACPA,EAAO2L,gBACPA,EAAekf,SACfA,EAAQ+B,WACRA,EAAUlc,yBACVA,EAAwBjN,MACxBA,EAAKC,MACLA,GACEhW,KACAmiB,IAAaA,EAASoD,oBACxBD,EAAenD,EAAShI,SACtB69B,EAAsB9sC,OAAO,WAAY,wBAG7C,MAAMgtC,EAAgBC,GAAgB5+B,GAAQ4+B,EAAKt+B,GAC7CxK,EAAS,IACV8J,GAAKnZ,KAAMg4C,GACdtvC,KAAO1I,KAAKF,YAAoC4I,KAChD+c,QAAS7f,EACTsnB,UACAC,UACArb,KAAMomC,EAAapmC,GACnBC,IAAKmmC,EAAanmC,GAClBC,MAAOkmC,EAAalmC,GACpBC,OAAQimC,EAAajmC,GACrByR,KAAMxJ,GAAqBwJ,GAAQA,EAAKvJ,WAAauJ,EACrDka,OAAQ1jB,GAAqB0jB,GAAUA,EAAOzjB,WAAayjB,EAC3DR,YAAa8a,EAAa9a,GAC1BC,gBAAiBA,EACbA,EAAgBnyB,SAChBmyB,EACJE,gBACAD,mBACAE,iBACAqB,gBACApB,iBAAkBya,EAAaza,GAC/B5nB,OAAQqiC,EAAariC,GACrBC,OAAQoiC,EAAapiC,GACrBrK,MAAOysC,EAAazsC,GACpBsL,QACAC,QACA+lB,QAASmb,EAAanb,GACtBc,OAAQA,EAASA,EAAO1jB,WAAa0jB,EACrCvrB,UACA2L,kBACAkf,WACA+B,aACAlc,2BACAjN,MAAOmiC,EAAaniC,GACpBC,MAAOkiC,EAAaliC,MAChBsP,EAAe,CAAEnD,SAAUmD,GAAiB,MAGlD,OAAQtlB,KAAKoe,qBAET/O,EADArP,KAAKo4C,qBAAqB/oC,EAEhC,CAOA6V,gBAAAA,CAAiBD,GAEf,OAAOjlB,KAAKma,SAAS8K,EACvB,CAMAmzB,oBAAAA,CAAuC/oC,GAGrC,MAAMjO,EAAYpB,KAAKF,YAAoCqf,cAErDk5B,EADyB53C,OAAOU,KAAKC,GAAUb,OAAS,EAE1Da,EACAX,OAAO63C,eAAet4C,MAE1B,OAAOqZ,GAAOhK,EAAQ,CAAC/D,EAAO/J,KAC5B,GAAIA,IAAQiF,GAAQjF,IAAQkF,GAAe,SAARlF,EACjC,OAAO,EAET,MAAMg3C,EAAYF,EAAW92C,GAC7B,OACE+J,IAAUitC,KAGR32C,MAAMmN,QAAQzD,IACd1J,MAAMmN,QAAQwpC,IACG,IAAjBjtC,EAAM/K,QACe,IAArBg4C,EAAUh4C,SAIlB,CAMAsN,QAAAA,GACE,MAAO,KAAM7N,KAAKF,YAAoC4I,OACxD,CAWA,kBAAO8vC,CAAW1tC,GAGJ,IAFZpC,KAAEA,KAAS+vC,GAAkD3tC,GAC7D4tC,WAAEA,KAAex2C,GAA8C5B,UAAAC,OAAA,QAAAC,IAAAF,UAAA,GAAAA,UAAA,GAAG,CAAA,EAElE,OAAOwY,GAA6B2/B,EAAyBv2C,GAASsW,KACnEmgC,GAGKD,UACKC,EAAqBD,GACrB,IAAI14C,KACTy4C,EAAwBC,GAExBC,IAGK,IAAI34C,KAAK24C,GAIxB,CASA,iBAAOpgC,CACLlJ,EACAnN,GAEA,OAAOlC,KAAKw4C,YAAYnpC,EAAQnN,EAClC,GAtrDAnC,EAzCW6vC,GAAY,kBA+CYvM,IAEnCtjC,EAjDW6vC,GAAY,kBAwDYtM,IAAevjC,EAxDvC6vC,GAAY,cAqJFrM,IAAyBxjC,EArJnC6vC,GAAY,OAqKT,gBAAc7vC,EArKjB6vC,GAAY,kBAmzCY,CAAChoC,EAAMC,EAAQ,oBAAkB9H,EAnzCzD6vC,GAAY,mBAoiDa,IA8LtC3nC,EAAcM,SAASqnC,IACvB3nC,EAAcM,SAASqnC,GAAc,UCr4D9B,MAAMgJ,GAAoBA,CAI/B1uC,EACA2uC,EACAC,IAEQ,CAACtrB,EAAW7e,EAAW3C,EAAGD,KAChC,MAAMgtC,EAAkBF,EAAcrrB,EAAW7e,EAAW3C,EAAGD,GAO/D,OANIgtC,GACFvtB,GAAUthB,EAAW,IAChBqjB,GAAgBC,EAAW7e,EAAW3C,EAAGD,MACzC+sC,IAGAC,GCvBJ,SAASC,GACdH,GAEA,MAAQ,CAACrrB,EAAW7e,EAAW3C,EAAGD,KAChC,MAAMrC,OAAEA,EAAMwjB,QAAEA,EAAOC,QAAEA,GAAYxe,EACnCsqC,EAAcvvC,EAAOykB,yBACrB+qB,EAAaxvC,EAAO6lC,uBAAuB0J,EAAa/rB,EAASC,GACjE4rB,EAAkBF,EAAcrrB,EAAW7e,EAAW3C,EAAGD,GAQ3D,OALArC,EAAOihB,oBACLuuB,EACAvqC,EAAUue,QACVve,EAAUwe,SAEL4rB,EAEX,CCTO,MAmCMI,GAAcP,GACzBzxC,EACA6xC,GArCuDI,CACvD5rB,EACA7e,EACA3C,EACAD,KAEA,MAAMmiB,EAAaJ,GACjBnf,EACAA,EAAUue,QACVve,EAAUwe,QACVnhB,EACAD,GAGF,GACE8f,GAAcld,EAAUue,WAAarB,GAActlB,IAClDslB,GAAcld,EAAUue,WAAarB,GAAcllB,IAClDunB,EAAWliB,EAAI,GAChB6f,GAAcld,EAAUue,WAAarB,GAAcrlB,IAClD0nB,EAAWliB,EAAI,EACjB,CACA,MAAMtC,OAAEA,GAAWiF,EACjB0qC,EACE3vC,EAAO0zB,aAAe1zB,EAAOm1B,cAAgBn1B,EAAOmM,OAAS,GAC/DuS,EAAa6E,GAAoBte,GAAa,EAAI,EAClD2qC,EAAW5vC,EAAOsI,MAClBunC,EACE70C,KAAKgH,IAAKwiB,EAAWliB,EAAIoc,EAAc1e,EAAOmM,QAAUwjC,EAG5D,OAFA3vC,EAAOjB,IAAI,QAAS/D,KAAKC,IAAI40C,EAAU,IAEhCD,IAAa5vC,EAAOsI,KAC7B,CACA,OAAO,KCVF,SAASwnC,GAEd79B,EACA7J,EACAC,EACA0nC,EACA3qC,GAEA2qC,EAAgBA,GAAiB,CAAA,EACjC,MAAMC,EACF15C,KAAK25C,OAASF,EAAcG,YAAc9qC,EAAa8qC,WACzDC,EAAQ75C,KAAK85C,OAASL,EAAcG,YAAc9qC,EAAa8qC,WAC/DG,OAC8C,IAArCN,EAAcM,mBACjBN,EAAcM,mBACdjrC,EAAairC,mBACnB10B,EAAa00B,EAAqBlyC,EAASD,EAC3Cg2B,GACGmc,IACAN,EAAcO,mBAAqBlrC,EAAakrC,mBACrD,IAEEvqC,EAFEwqC,EAASnoC,EACXooC,EAAQnoC,EAEV4J,EAAI2G,OACJ3G,EAAIsI,UAAYw1B,EAAcU,aAAerrC,EAAaqrC,aAAe,GACzEx+B,EAAIw4B,YACFsF,EAAcO,mBAAqBlrC,EAAakrC,mBAAqB,GAEnEN,EAAQG,GACVpqC,EAAOiqC,EACP/9B,EAAIG,MAAM,EAAK+9B,EAAQH,GACvBQ,EAASnoC,EAAM2nC,EAASG,GACfA,EAAQH,GACjBjqC,EAAOoqC,EACPl+B,EAAIG,MAAM49B,EAAQG,EAAO,GACzBI,EAAUnoC,EAAO+nC,EAASH,GAE1BjqC,EAAOiqC,EAET/9B,EAAIkI,YACJlI,EAAIy+B,IAAIH,EAAQC,EAAOzqC,EAAO,EAAG,EAAGxJ,GAAW,GAC/C0V,EAAI0J,KACAuY,GACFjiB,EAAIiiB,SAENjiB,EAAI6G,SACN,CAaO,SAAS63B,GAEd1+B,EACA7J,EACAC,EACA0nC,EACA3qC,GAEA2qC,EAAgBA,GAAiB,CAAA,EACjC,MAAMC,EACF15C,KAAK25C,OAASF,EAAcG,YAAc9qC,EAAa8qC,WACzDC,EAAQ75C,KAAK85C,OAASL,EAAcG,YAAc9qC,EAAa8qC,WAC/DG,OAC8C,IAArCN,EAAcM,mBACjBN,EAAcM,mBACdjrC,EAAairC,mBACnB10B,EAAa00B,EAAqBlyC,EAASD,EAC3Cg2B,GACGmc,IACAN,EAAcO,mBAAqBlrC,EAAakrC,mBACnDM,EAAWZ,EAAQ,EACnBa,EAAWV,EAAQ,EACrBl+B,EAAI2G,OACJ3G,EAAIsI,UAAYw1B,EAAcU,aAAerrC,EAAaqrC,aAAe,GACzEx+B,EAAIw4B,YACFsF,EAAcO,mBAAqBlrC,EAAakrC,mBAAqB,GACvEr+B,EAAIy1B,UAAUt/B,EAAMC,GAEpB,MAAMtG,EAAQqD,EAAai/B,gBAC3BpyB,EAAIvN,OAAOkG,GAAiB7I,IAI5BkQ,EAAI,GAAG0J,UAAmBi1B,GAAWC,EAAUb,EAAOG,GAClDjc,GACFjiB,EAAI6+B,YAAYF,GAAWC,EAAUb,EAAOG,GAE9Cl+B,EAAI6G,SACN,CChHO,MAAMi4B,GAyHX36C,WAAAA,CAAYoC,GAxHZnC,kBAQU,GAEVA,oBAWawH,GAEbxH,eAOQ,GAERA,WAOI,GAEJA,WAOI,GAEJA,iBAYU,GAEVA,iBAMU,GAEVA,eAMQ,GAERA,eAMQ,GAERA,oBAMa,GAEbA,oBAMa,GAEbA,qBAMc,aAEdA,yBAMiB,GAGfU,OAAOC,OAAOV,KAAMkC,EACtB,CAgCAw4C,cAAAA,CACEC,EACA7rC,EACA2e,EAAc3oB,GAEd,IAAA81C,EAAA,IADAzoC,GAAEA,EAAE0P,GAAEA,EAAEzP,GAAEA,EAAE0P,GAAEA,GAAkBhd,EAGhC,OACqB,QAAnB81C,EAAA9rC,EAAa3L,cAAM,IAAAy3C,OAAA,EAAnBA,EAAqBC,qBAAsB/rC,GAC3CA,EAAagsC,iBAAiBH,IAC9B5R,GAAaQ,iBAAiB9b,EAAS,CAACtb,EAAI0P,EAAIzP,EAAI0P,GAExD,CASAi5B,gBAAAA,CACEvtB,EACA1e,EACA6e,GAEA,OAAO3tB,KAAK64C,aACd,CASAmC,mBAAAA,CACExtB,EACA1e,EACA6e,GAEA,OAAO3tB,KAAKi7C,gBACd,CAUAC,iBAAAA,CACE1tB,EACA1e,EACA6e,GAEA,OAAO3tB,KAAKm7C,cACd,CAWAC,kBAAAA,CACE5tB,EACAG,EACA7e,EACA8e,GAEA,OAAOD,EAAQ0tB,WACjB,CASAC,aAAAA,CACE9tB,EACAG,EACA7e,GAEA,OAAO6e,EAAQ4tB,UACjB,CAQAC,aAAAA,CAAc1sC,EAAuC6rC,GAAoB,IAAAc,EAAAC,EACvE,OAAqD,QAArDD,UAAAC,EAAO5sC,EAAa6sC,2BAAmB,IAAAD,OAAA,EAAhCA,EAAmCf,cAAWc,EAAAA,EAAIz7C,KAAKsS,OAChE,CAOAspC,aAAAA,CACEle,EACAmS,EACA/gC,GAEA9O,KAAKsS,QAAUorB,CACjB,CAEAme,eAAAA,CACExN,EACAD,EACAt/B,EACAgtC,GAEA,OAAO,IAAIhwC,GACT9L,KAAKgM,EAAIqiC,EAAIriC,EAAIhM,KAAKqa,QACtBra,KAAK+L,EAAIsiC,EAAItiC,EAAI/L,KAAKkkB,SACtBvV,UAAUy/B,EACd,CAWA2N,gBAAAA,CACEtwC,EACAuwC,EACAC,EACAC,EACAC,EACArtC,GAEA,MAAMvB,EAAI4H,GAA6B,CACrCgB,GAAsB8lC,EAASC,GAC/B9lC,GAAmB,CAAE3K,UACrB+K,IACG2lC,EAAUn8C,KAAKo8C,WAAap8C,KAAK25C,QAAUqC,GAC3CG,EAAUn8C,KAAKq8C,WAAar8C,KAAK85C,QAAUkC,KAGhD,MAAO,CACL7pC,GAAI,IAAIrG,IAAM,IAAM,IAAM6C,UAAUpB,GACpCsU,GAAI,IAAI/V,GAAM,IAAK,IAAM6C,UAAUpB,GACnC6E,GAAI,IAAItG,GAAM,GAAK,IAAK6C,UAAUpB,GAClCuU,GAAI,IAAIhW,IAAM,GAAM,IAAK6C,UAAUpB,GAEvC,CAcAiW,MAAAA,CACE7H,EACA7J,EACAC,EACA0nC,EACA3qC,GAGA,GACO,aAFP2qC,EAAgBA,GAAiB,CAAA,GACX6C,aAAextC,EAAawtC,aAE9C9C,GAAoB7uC,KAClB3K,KACA2b,EACA7J,EACAC,EACA0nC,EACA3qC,QAIFurC,GAAoB1vC,KAClB3K,KACA2b,EACA7J,EACAC,EACA0nC,EACA3qC,EAGR,EC1WK,MAAMytC,GAA8CA,CACzD/uB,EACAG,EACA7e,IAEIA,EAAa0tC,aACRxvB,GAEFW,EAAQ0tB,YA0DJoB,GAAuB7D,GAClC5xC,EACAgyC,GA/CuD0D,CACvDlvB,EAAS1oB,EAETkH,EACAD,KACG,IAHHrC,OAAEA,EAAMizC,GAAEA,EAAEC,GAAEA,EAAEC,MAAEA,EAAK3vB,QAAEA,EAAOC,QAAEA,GAASroB,EAI3C,MAAMg4C,EAAapzC,EAAO6lC,uBACxB7lC,EAAOykB,yBACPjB,EACAC,GAGF,GAAIE,GAAS3jB,EAAQ,gBACnB,OAAO,EAGT,MAAMqzC,EAAYr4C,KAAK+Q,MAAMmnC,EAAKE,EAAW/wC,EAAG4wC,EAAKG,EAAW9wC,GAC9DgxC,EAAWt4C,KAAK+Q,MAAM1J,EAAI+wC,EAAW/wC,EAAGC,EAAI8wC,EAAW9wC,GACzD,IAAIP,EAAQ+I,GAAiBwoC,EAAWD,EAAYF,GAEpD,GAAInzC,EAAOuzC,WAAavzC,EAAOuzC,UAAY,EAAG,CAC5C,MAAMA,EAAYvzC,EAAOuzC,UACvBC,EAAgBxzC,EAAOwzC,eAAiBD,EACxCE,EAAmBz4C,KAAKosC,KAAKrlC,EAAQwxC,GAAaA,EAClDG,EAAkB14C,KAAKiB,MAAM8F,EAAQwxC,GAAaA,EAEhDv4C,KAAKgH,IAAID,EAAQ2xC,GAAmBF,EACtCzxC,EAAQ2xC,EACC14C,KAAKgH,IAAID,EAAQ0xC,GAAoBD,IAC9CzxC,EAAQ0xC,EAEZ,CAGI1xC,EAAQ,IACVA,EAAQ,IAAMA,GAEhBA,GAAS,IAET,MAAM4xC,EAAa3zC,EAAO+B,QAAUA,EAGpC,OADA/B,EAAO+B,MAAQA,EACR4xC,KC9CF,SAASC,GACd9vB,EACA1e,GAEA,MAAM3L,EAAS2L,EAAa3L,OAC1Bo6C,EAAmB/vB,EAAUrqB,EAAOq6C,aACtC,OACGr6C,EAAOs6C,iBAAmBF,IACzBp6C,EAAOs6C,gBAAkBF,CAE/B,CASO,SAASG,GACd5uC,EACA6uC,EACAC,GAEA,MAAMC,EAAQxwB,GAASve,EAAc,gBACnCgvC,EAAQzwB,GAASve,EAAc,gBACjC,GAAI+uC,GAASC,EACX,OAAO,EAET,IAAKH,IAAOE,GAASC,IAAUF,EAC7B,OAAO,EAET,GAAIC,GAAgB,MAAPF,EACX,OAAO,EAET,GAAIG,GAAgB,MAAPH,EACX,OAAO,EAIT,MAAM3rC,MAAEA,EAAKC,OAAEA,EAAMmrB,YAAEA,GAAgBtuB,EACvC,OAAc,IAAVkD,GAA+B,IAAhBorB,GAA4B,MAAPugB,GAGzB,IAAX1rC,GAAgC,IAAhBmrB,GAA4B,MAAPugB,CAI3C,CAEA,MAAMI,GAAW,CAAC,IAAK,KAAM,IAAK,KAAM,IAAK,KAAM,IAAK,KAAM,KASjDC,GAAiDA,CAC5DxwB,EACAG,EACA7e,EACA8e,KAEA,MAAMgwB,EAAsBN,GAAoB9vB,EAAW1e,GAO3D,GAAI4uC,GAAmB5uC,EALL,IAAd6e,EAAQ3hB,GAAyB,IAAd2hB,EAAQ5hB,EACvB,IACc,IAAd4hB,EAAQ3hB,GAAyB,IAAd2hB,EAAQ5hB,EACzB,IACA,GAC+B6xC,GACvC,OAAO5wB,GAET,MAAMixB,EAAIvwB,GAAmB5e,EAAc6e,EAASC,GACpD,MAAO,GAAGmwB,GAASE,aAerB,SAASC,GACP1wB,EACA7e,EACA3C,EACAD,GAEA,IADA7J,EAAyB5B,UAAAC,OAAA,QAAAC,IAAAF,UAAA,GAAAA,UAAA,GAAG,CAAA,EAE5B,MAAMoJ,EAASiF,EAAUjF,OACvBi0C,EAAKz7C,EAAQy7C,GACbC,EAAsBN,GAAoB9vB,EAAW9jB,GAEvD,IAAI+W,EAAU5K,EAAQC,EAAQu4B,EAAK8P,EAAOC,EAE1C,GAHkBV,GAAmBh0C,EAAQi0C,EAAIC,GAI/C,OAAO,EAET,GAAIjvC,EAAU0vC,aACZxoC,EAASlH,EAAUkH,OAASlH,EAAU0vC,aACtCvoC,EAASnH,EAAUmH,OAASnH,EAAU0vC,iBACjC,CAsBL,GArBA59B,EAAWqN,GACTnf,EACAA,EAAUue,QACVve,EAAUwe,QACVnhB,EACAD,GAOFoyC,EAAe,MAAPR,EAAaj5C,KAAKmH,KAAK4U,EAASzU,GAAK2C,EAAUwvC,OAAS,GAAK,EACrEC,EAAe,MAAPT,EAAaj5C,KAAKmH,KAAK4U,EAAS1U,GAAK4C,EAAUyvC,OAAS,GAAK,EAChEzvC,EAAUwvC,QACbxvC,EAAUwvC,MAAQA,GAEfxvC,EAAUyvC,QACbzvC,EAAUyvC,MAAQA,GAIlB/wB,GAAS3jB,EAAQ,qBAChBiF,EAAUwvC,QAAUA,GAASxvC,EAAUyvC,QAAUA,GAElD,OAAO,EAKT,GAFA/P,EAAM3kC,EAAO8jC,4BAEToQ,IAAwBD,EAAI,CAE9B,MAAMW,EAAW55C,KAAKgH,IAAI+U,EAASzU,GAAKtH,KAAKgH,IAAI+U,EAAS1U,IACxDwyC,SAAEA,GAAa5vC,EAIfmN,EAAQwiC,GAFN55C,KAAKgH,IAAK2iC,EAAIriC,EAAIuyC,EAAS1oC,OAAUnM,EAAOmM,QAC5CnR,KAAKgH,IAAK2iC,EAAItiC,EAAIwyC,EAASzoC,OAAUpM,EAAOoM,SAEhDD,EAAS0oC,EAAS1oC,OAASiG,EAC3BhG,EAASyoC,EAASzoC,OAASgG,CAC7B,MACEjG,EAASnR,KAAKgH,IAAK+U,EAASzU,EAAItC,EAAOmM,OAAUw4B,EAAIriC,GACrD8J,EAASpR,KAAKgH,IAAK+U,EAAS1U,EAAIrC,EAAOoM,OAAUu4B,EAAItiC,GAGnDkhB,GAAoBte,KACtBkH,GAAU,EACVC,GAAU,GAERnH,EAAUwvC,QAAUA,GAAgB,MAAPR,IAC/BhvC,EAAUue,QAAUE,GAAaze,EAAUue,SAC3CrX,IAAU,EACVlH,EAAUwvC,MAAQA,GAEhBxvC,EAAUyvC,QAAUA,GAAgB,MAAPT,IAC/BhvC,EAAUwe,QAAUC,GAAaze,EAAUwe,SAC3CrX,IAAU,EACVnH,EAAUyvC,MAAQA,EAEtB,CAEA,MAAMI,EAAY90C,EAAOmM,OACvB4oC,EAAY/0C,EAAOoM,OASrB,OARK6nC,GAKI,MAAPA,GAAcj0C,EAAOjB,IAAIjB,EAASqO,GAC3B,MAAP8nC,GAAcj0C,EAAOjB,IAAIhB,EAASqO,MALjCuX,GAAS3jB,EAAQ,iBAAmBA,EAAOjB,IAAIjB,EAASqO,IACxDwX,GAAS3jB,EAAQ,iBAAmBA,EAAOjB,IAAIhB,EAASqO,IAMpD0oC,IAAc90C,EAAOmM,QAAU4oC,IAAc/0C,EAAOoM,MAC7D,CAWO,MA6CM4oC,GAAiB9F,GAC5B7xC,EACAiyC,GA/C2E2F,CAC3EnxB,EACA7e,EACA3C,EACAD,IAEOmyC,GAAY1wB,EAAW7e,EAAW3C,EAAGD,KA4CjC6yC,GAAWhG,GACtB7xC,EACAiyC,GAlC2D6F,CAC3DrxB,EACA7e,EACA3C,EACAD,IAEOmyC,GAAY1wB,EAAW7e,EAAW3C,EAAGD,EAAG,CAAE4xC,GAAI,QA+B1CmB,GAAWlG,GACtB7xC,EACAiyC,GArB2D+F,CAC3DvxB,EACA7e,EACA3C,EACAD,IAEOmyC,GAAY1wB,EAAW7e,EAAW3C,EAAGD,EAAG,CAAE4xC,GAAI,QC/OjDqB,GAUF,CACFhzC,EAAG,CACDizC,YAAa,IACbnjC,MAAOtU,EACP03C,KAAMx3C,EACNy3C,YAAa,eACb7wC,OAAQ,UACR8wC,KAAM,SAERrzC,EAAG,CACDkzC,YAAa,IACbnjC,MAAOrU,EACPy3C,KAAMv3C,EACNw3C,YAAa,eACb7wC,OAAQ,UACR8wC,KAAM,UAIJC,GAAU,CAAC,KAAM,OAAQ,KAAM,QASxBC,GAAgDA,CAC3D9xB,EACAG,EACA7e,EACA8e,KAEA,GAAkB,IAAdD,EAAQ3hB,GAAWqhB,GAASve,EAAc,gBAC5C,OAAOke,GAET,GAAkB,IAAdW,EAAQ5hB,GAAWshB,GAASve,EAAc,gBAC5C,OAAOke,GAET,MAAMixB,EAAIvwB,GAAmB5e,EAAc6e,EAASC,GAAS,EAC7D,MAAO,GAAGyxB,GAAQpB,aAwEpB,SAASsB,GACPC,EACAhyB,EACA7e,EACA3C,EACAD,GAEA,MAAMrC,OAAEA,GAAWiF,GACjBswC,YACEA,EACA3wC,OAAQmxC,EACRN,YAAaO,EACbR,KAAMS,EACNP,KAAMQ,GACJZ,GAAUQ,GAChB,GAAInyB,GAAS3jB,EAAQg2C,GACnB,OAAO,EAGT,MAAQpxC,OAAQuxC,EAAkBT,KAAMU,GACpCd,GAAUC,GACZc,EACEl0B,GAAcld,EAAUkxC,KACvBn2C,EAAOo2C,IAAkB,EAAK,GAKjCE,GAAgBt7C,KAAKmH,KAAKk0C,IACvBr2C,EAAOk2C,IAAW,EAAK,GAW1BtxC,EAA6B,MATL,IAApB5E,EAAOi2C,IAEP7xB,GAAcnf,EAAWpI,EAAQA,EAAQyF,EAAGD,GAAGyzC,GAAQ,GAEzD91C,EAAOi2C,GAAW,EACd,GACA,GAAMK,GAGuB,GAE/BC,EAAerH,GACnB1xC,EACA8xC,GAAoB,CAACxrB,EAAW7e,EAAW3C,EAAGD,IA7GlD,SACEyzC,EAAW16C,EAEX2oB,GACA,IAFA/jB,OAAEA,EAAMizC,GAAEA,EAAEC,GAAEA,EAAEoD,YAAEA,KAAgBrxC,GAA0B7J,EAG5D,MAAQo6C,KAAMS,GAAYX,GAAUQ,GAClCxiC,EAASyQ,EACNlhB,SAAS,IAAIT,GAAM6wC,EAAIC,IACvB9vC,OAAO,IAAIhB,GAAMpC,EAAOmM,OAAQnM,EAAOoM,SAAS0pC,GACnDU,EAAgBx2C,EAAOi2C,GACvBQ,EAAexxC,EAAUgxC,GACzBS,EAAgB17C,KAAKgS,IAAIpC,GAAiB6rC,IAM1ClrC,EACW,MAATuqC,EACI91C,EAAO8jC,0BAA0B,CAC/B33B,OAAQ,EACRC,OAAQ,EAERC,MAAO,IACN/J,EACHtC,EAAO8jC,0BAA0B,CAC/B33B,OAAQ,EACRC,OAAQ,IACP/J,EAELs0C,EACH,EAAIrjC,EAASgjC,EAEZt7C,KAAKC,IAAIsQ,EAAG,GAEdmrC,EAEIE,EAAU9rC,GAAiB9P,KAAK67C,KAAKF,IAE3C32C,EAAOjB,IAAIk3C,EAASW,GACpB,MAAME,EAAUN,IAAkBx2C,EAAOi2C,GAEzC,GAAIa,GAAoB,MAAThB,EAAc,CAG3B,MAAMzpC,MAAEA,EAAKF,OAAEA,GAAWnM,EACxB+2C,EAAY/2C,EAAO8jC,0BAA0B,CAAEx3B,MAAOkqC,IACtDQ,EAAWh3C,EAAO8jC,4BAClBmT,EAA+B,IAAV5qC,EAAc0qC,EAAUz0C,EAAI00C,EAAS10C,EAAI,EACzC,IAAvB20C,GACEj3C,EAAOjB,IAAIjB,EAASm5C,EAAqB9qC,EAC7C,CAEA,OAAO2qC,CACT,CAwDMI,CAAWpB,EAAM7wC,EAAW,IAAI7C,GAAME,EAAGD,MAI7C,OAAOk0C,EACLzyB,EACA,IACK7e,EACH8wC,CAACA,GAAYnxC,EACb0xC,eAEFh0C,EACAD,EAEJ,CAWO,MAAM80C,GAAuCA,CAClDrzB,EACA7e,EACA3C,EACAD,IAEOwzC,GAAY,IAAK/xB,EAAW7e,EAAW3C,EAAGD,GAYtC+0C,GAAuCA,CAClDtzB,EACA7e,EACA3C,EACAD,IAEOwzC,GAAY,IAAK/xB,EAAW7e,EAAW3C,EAAGD,GC7OnD,SAASg1C,GAAYvzB,EAA0B9jB,GAC7C,OAAO8jB,EAAU9jB,EAAOvG,OAAQ69C,aAClC,CASO,MAAMC,GAETA,CAACzzB,EAAWG,EAAS7e,KACvB,MAAMoyC,EAAgBH,GAAYvzB,EAAW1e,GAC7C,OAAkB,IAAd6e,EAAQ3hB,EAEHk1C,EAAgBx5C,EAASD,EAEhB,IAAdkmB,EAAQ5hB,EAEHm1C,EAAgBv5C,EAASH,EAE3B,IAUI25C,GAAqDA,CAChE3zB,EACAG,EACA7e,EACA8e,IAEOmzB,GAAYvzB,EAAW1e,GAC1BwwC,GAAuB9xB,EAAWG,EAAS7e,EAAc8e,GACzDowB,GAAwBxwB,EAAWG,EAAS7e,EAAc8e,GAWnDwzB,GAA6CA,CACxD5zB,EACA7e,EACA3C,EACAD,IAEOg1C,GAAYvzB,EAAW7e,EAAUjF,QACpCo3C,GAAatzB,EAAW7e,EAAW3C,EAAGD,GACtC6yC,GAASpxB,EAAW7e,EAAW3C,EAAGD,GAY3Bs1C,GAA6CA,CACxD7zB,EACA7e,EACA3C,EACAD,IAEOg1C,GAAYvzB,EAAW7e,EAAUjF,QACpCm3C,GAAarzB,EAAW7e,EAAW3C,EAAGD,GACtC+yC,GAAStxB,EAAW7e,EAAW3C,EAAGD,GC/E3Bu1C,GAA8BA,KAAAA,CACzCC,GAAI,IAAI9G,GAAQ,CACdzuC,GAAG,GACHD,EAAG,EACHqvC,mBAAoB+F,GACpBtI,cAAeuI,GACf9F,cAAe2F,KAGjBO,GAAI,IAAI/G,GAAQ,CACdzuC,EAAG,GACHD,EAAG,EACHqvC,mBAAoB+F,GACpBtI,cAAeuI,GACf9F,cAAe2F,KAGjBQ,GAAI,IAAIhH,GAAQ,CACdzuC,EAAG,EACHD,EAAG,GACHqvC,mBAAoB+F,GACpBtI,cAAewI,GACf/F,cAAe2F,KAGjBS,GAAI,IAAIjH,GAAQ,CACdzuC,EAAG,EACHD,GAAG,GACHqvC,mBAAoB+F,GACpBtI,cAAewI,GACf/F,cAAe2F,KAGjB9uC,GAAI,IAAIsoC,GAAQ,CACdzuC,GAAG,GACHD,GAAG,GACHqvC,mBAAoB4C,GACpBnF,cAAe6F,KAGjB78B,GAAI,IAAI44B,GAAQ,CACdzuC,EAAG,GACHD,GAAG,GACHqvC,mBAAoB4C,GACpBnF,cAAe6F,KAGjB58B,GAAI,IAAI24B,GAAQ,CACdzuC,GAAG,GACHD,EAAG,GACHqvC,mBAAoB4C,GACpBnF,cAAe6F,KAGjBtsC,GAAI,IAAIqoC,GAAQ,CACdzuC,EAAG,GACHD,EAAG,GACHqvC,mBAAoB4C,GACpBnF,cAAe6F,KAGjBiD,IAAK,IAAIlH,GAAQ,CACfzuC,EAAG,EACHD,GAAG,GACH8sC,cAAe4D,GACfrB,mBAAoBmB,GACpBr4B,SAAS,GACT09B,gBAAgB,EAChBrG,WAAYt0C,MAIH46C,GAAuBA,KAAAA,CAClCL,GAAI,IAAI/G,GAAQ,CACdzuC,EAAG,GACHD,EAAG,EACH8sC,cAAeM,GACfiC,mBAAoB+F,GACpB5F,WAAYp0C,IAEdo6C,GAAI,IAAI9G,GAAQ,CACdzuC,GAAG,GACHD,EAAG,EACH8sC,cAAeM,GACfiC,mBAAoB+F,GACpB5F,WAAYp0C,MAIH26C,GAA+BA,KAAAA,IACvCR,QACAO,OC9DE,MAAME,WAKHnS,GA4FR,kBAAOzwB,GACL,MAAO,IACF/e,MAAM+e,iBACN4iC,GAAwB3iC,YAE/B,CAMAtf,WAAAA,CAAYoC,GACV9B,QACAK,OAAOC,OACLV,KACCA,KAAKF,YAA+CkiD,iBACrDD,GAAwB3iC,aAE1Bpf,KAAK8vC,WAAW5tC,EAClB,CAQA,qBAAO8/C,GACL,MAAO,CAAEh0B,SAAUszB,KACrB,CAQArR,kBAAAA,GACE,MAAMgS,EAAejiD,KAAKmD,OAC1B,GAAInD,KAAKkiD,cAAgBD,GAAgBA,EAAaE,kBAAmB,CACvE,MAAMxzC,EAAYszC,EAAaE,kBAC7Bz4C,EAASiF,EAAUjF,OACnB04C,EAASzzC,EAAUyzC,OACrB,GACEpiD,OAAU0J,GACV04C,GACAA,EAAOC,WAAW96C,GAElB,OAAO,CAEX,CACA,OAAOnH,MAAM6vC,oBACf,CAEAqS,gBAAAA,GACE,MAAM/gD,EAAMvB,KAAKuiD,SACjB,OAAOhhD,EACH,CACEA,MACAosB,QAAS3tB,KAAKguB,SAASzsB,GACvBqsB,MAAO5tB,KAAKwiD,QAAQjhD,SAEtBf,CACN,CAaAiiD,WAAAA,CACEh1B,GAE+D,IAD/Di1B,EAAQpiD,UAAAC,OAAA,QAAAC,IAAAF,UAAA,IAAAA,UAAA,GAER,IAAKN,KAAK2iD,cAAgB3iD,KAAKmD,OAC7B,OAGFnD,KAAKuiD,cAAW/hD,EAChB,MAAMoiD,EAAgBniD,OAAOwJ,QAAQjK,KAAKwiD,SAC1C,IAAK,IAAIr3C,EAAIy3C,EAAcriD,OAAS,EAAG4K,GAAK,EAAGA,IAAK,CAClD,MAAO5J,EAAKwsB,GAAU60B,EAAcz3C,GAC9BwiB,EAAU3tB,KAAKguB,SAASzsB,GAE9B,GACEosB,EAAQ+sB,eACNn5C,EACAvB,KACAytB,EACAi1B,EAAW30B,EAAO80B,YAAc90B,EAAOA,QAMzC,OAFA/tB,KAAKuiD,SAAWhhD,EAET,CAAEA,MAAKosB,UAASC,MAAO5tB,KAAKwiD,QAAQjhD,GAE/C,CAGF,CASAuhD,WAAAA,GACE,MAAMziC,EAAMrgB,KAAKguC,uBACfjpB,EAAS/kB,KAAKskB,iBACd6pB,EAAUh4B,GAAsB4O,EAAO/Y,EAAG+Y,EAAOhZ,GACjDg3C,EAAU3sC,GAAmB,CAC3B3K,MAAOzL,KAAK+tC,iBAAqB/tC,KAAK0sC,OAAS1sC,KAAK+W,MAAQ,IAAM,KAEpEisC,EAAiBhuC,GAA0Bm5B,EAAS4U,GACpDE,EAAcjuC,GAA0BqL,EAAK2iC,GAC7C5U,EAAcp5B,GAA0BiuC,EAAa,CACnD,EAAI5iC,EAAI,GACR,EACA,EACA,EAAIA,EAAI,GACR,EACA,IAEF6iC,EAAmBljD,KAAK0sC,MACpBh3B,GAAY1V,KAAKi+B,4BACjBz9B,EAEF0iD,IACFA,EAAiBrtC,OAASnR,KAAKgH,IAAIw3C,EAAiBrtC,QACpDqtC,EAAiBptC,OAASpR,KAAKgH,IAAIw3C,EAAiBptC,SAEtD,MAAMu4B,EAAMruC,KAAK6uC,4BAA4BqU,GAC3ClW,EAAkC,CAAA,EA0BpC,OAxBAhtC,KAAKmjD,eAAe,CAACx1B,EAASpsB,KAC5B,MAAM6Z,EAAWuS,EAAQkuB,gBAAgBxN,EAAKD,EAAapuC,KAAM2tB,GAIjEqf,EAAOzrC,GAAOd,OAAOC,OACnB0a,EACApb,KAAKojD,kBAAkBz1B,EAASvS,MAiB7B4xB,CACT,CASQoW,iBAAAA,CAAkBz1B,EAAkBvS,GAC1C,MAAM3P,EAAQzL,KAAK+tC,gBAiBnB,MAAO,CAAEhgB,OAhBMJ,EAAQouB,iBACrBtwC,EACAzL,KAAK45C,WACLx+B,EAASpP,EACToP,EAASrP,GACT,EACA/L,MAUe6iD,YARGl1B,EAAQouB,iBAC1BtwC,EACAzL,KAAKqjD,gBACLjoC,EAASpP,EACToP,EAASrP,GACT,EACA/L,MAGJ,CAOA0f,SAAAA,GACEtf,MAAMsf,YACN1f,KAAKmD,SAAWnD,KAAKwiD,QAAUxiD,KAAK8iD,cACtC,CAOAK,cAAAA,CACEG,GAMA,IAAK,MAAMn4C,KAAKnL,KAAKguB,SACnBs1B,EAAGtjD,KAAKguB,SAAS7iB,GAAIA,EAAGnL,KAE5B,CAYA+xC,uBAAAA,CAAwBp2B,GACtB,IACG3b,KAAKujD,0BACLvjD,KAAKmD,QAAWnD,KAAKmD,OAAOqgD,gBAAsCxjD,KAEnE,OAEF2b,EAAI2G,OACJ,MAAMyC,EAAS/kB,KAAKmuB,yBAClBs1B,EAAKzjD,KAAK6uC,8BACVxuB,EAAMrgB,KAAKguC,uBACbryB,EAAIy1B,UAAUrsB,EAAO/Y,EAAG+Y,EAAOhZ,GAC/B4P,EAAIG,MAAM,EAAIuE,EAAI,GAAI,EAAIA,EAAI,IAC9B1E,EAAIvN,OAAOkG,GAAiBtU,KAAKyL,QACjCkQ,EAAIsI,UAAYjkB,KAAKujD,yBACrB5nC,EAAI43B,UAAUkQ,EAAGz3C,EAAI,GAAIy3C,EAAG13C,EAAI,EAAG03C,EAAGz3C,EAAGy3C,EAAG13C,GAC5C4P,EAAI6G,SACN,CAOAkhC,aAAAA,CAAc/nC,EAA+BlM,GAC3CkM,EAAI6+B,YAAY/qC,EAAKzD,EAAI,GAAIyD,EAAK1D,EAAI,EAAG0D,EAAKzD,EAAGyD,EAAK1D,EACxD,CAQA43C,YAAAA,CACEhoC,EACAlM,GAEM,IADNgqC,EAA6Bn5C,UAAAC,OAAA,QAAAC,IAAAF,UAAA,GAAAA,UAAA,GAAG,CAAA,EAEhC,MAAM4B,EAAU,CACdygD,YAAa3iD,KAAK2iD,YAClBiB,YAAa5jD,KAAK4jD,YAClBC,gBAAiB7jD,KAAK6jD,mBACnBpK,GAEL99B,EAAI2G,OACJ3G,EAAIw4B,YAAcjyC,EAAQ0hD,YAC1B5jD,KAAKs0C,aAAa34B,EAAKzZ,EAAQ2hD,iBAC/B7jD,KAAK0jD,cAAc/nC,EAAKlM,GACxBvN,EAAQygD,aAAe3iD,KAAK8jD,4BAA4BnoC,EAAKlM,GAC7DkM,EAAI6G,SACN,CASAuhC,eAAAA,CACEpoC,GAEA,IADA89B,EAA6Bn5C,UAAAC,OAAA,QAAAC,IAAAF,UAAA,GAAAA,UAAA,GAAG,CAAA,EAEhC,MAAM0jD,WAAEA,EAAUrB,YAAEA,GAAgB3iD,KAC9BikD,EAAe,CACnBD,aACArB,iBACGlJ,GAECp5B,EAAMrgB,KAAKguC,uBACfkW,EAAoBD,EAAaD,WACjCG,EAAqBF,EAAatB,YAC9B1rC,EAASjC,GAA0BqL,EAAKrgB,KAAKi+B,uBAC7C/7B,EAAUwT,GAAYuB,GAC5B0E,EAAI2G,OACJ3G,EAAIy1B,UAAUlvC,EAAQ+T,WAAY/T,EAAQgU,YAC1CyF,EAAIi4B,UAAY5zC,KAAKokD,kBAMjBpkD,KAAK0sC,QAAU1sC,KAAK4xC,SACtBj2B,EAAI83B,YAAczzC,KAAKqkD,SAAWrkD,KAAKskD,wBAA0B,GAE/DtkD,KAAK+W,QACP7U,EAAQuJ,OAAS,KAEnBkQ,EAAIvN,OAAOkG,GAAiBtU,KAAK0sC,MAAQxqC,EAAQuJ,MAAQzL,KAAKyL,QAC9Dy4C,GAAqBlkD,KAAKukD,YAAY5oC,EAAKzZ,EAASu3C,GACpD0K,GAAsBnkD,KAAK+hB,aAAapG,EAAK89B,GAC7C99B,EAAI6G,SACN,CAUA+hC,WAAAA,CACE5oC,EACAzZ,EACAu3C,GAEA,IAAIhqC,EACJ,GAAKgqC,GAAiBA,EAAc+K,oBAAuBxkD,KAAK0sC,MAAO,CACrE,MAAMzhB,EAAOH,GACT9qB,KAAKgS,MACLhS,KAAKiS,OACL6E,GAAqB5U,IAEvB07B,EAAU59B,KAAK4sC,mCAOXr+B,IANCvO,KAAK6+B,eACF,IAAI/yB,IAAQM,UAAUpM,KAAKmD,OAASnD,KAAKmD,OAAOgd,UAAY,GAG5D,IAAIrU,GAAM5J,EAAQ2T,OAAQ3T,EAAQ4T,SACpClJ,eAAe5M,KAAKo9B,aAE5B3tB,EAAOwb,EACJhf,IAAI2xB,GACJxxB,UAAUpM,KAAKokD,mBACfh4C,UAAyB,EAAfpM,KAAKiuB,QACpB,MACExe,EAAOzP,KAAK6uC,8BAA8BziC,UACxCpM,KAAKokD,mBAGTpkD,KAAK2jD,aAAahoC,EAAKlM,EAAMgqC,EAC/B,CASAqK,2BAAAA,CACEnoC,EACAlM,GAEA,IAAIg1C,GAAe,EAEnB9oC,EAAIkI,YACJ7jB,KAAKmjD,eAAe,CAACx1B,EAASpsB,KAGxBosB,EAAQi0B,gBAAkBj0B,EAAQ6tB,cAAcx7C,KAAMuB,KAExDkjD,GAAe,EACf9oC,EAAImI,OAAO6J,EAAQ3hB,EAAIyD,EAAKzD,EAAG2hB,EAAQ5hB,EAAI0D,EAAK1D,GAChD4P,EAAIoI,OACF4J,EAAQ3hB,EAAIyD,EAAKzD,EAAI2hB,EAAQtT,QAC7BsT,EAAQ5hB,EAAI0D,EAAK1D,EAAI4hB,EAAQzJ,YAInCugC,GAAgB9oC,EAAIiiB,QACtB,CAYA7b,YAAAA,CACEpG,GAEA,IADA89B,EAA4Cn5C,UAAAC,OAAA,QAAAC,IAAAF,UAAA,GAAAA,UAAA,GAAG,CAAA,EAE/Cqb,EAAI2G,OACJ,MAAM1G,EAAgB5b,KAAK6tC,0BACrBmM,kBAAEA,EAAiB0K,gBAAEA,EAAevK,YAAEA,GAAgBn6C,KACtDkC,EAAU,CACd83C,oBACA0K,kBACAvK,iBACGV,GAEL99B,EAAIs1B,aAAar1B,EAAe,EAAG,EAAGA,EAAe,EAAG,GACxDD,EAAIw4B,YAAcx4B,EAAIsI,UAAY/hB,EAAQi4C,YACrCn6C,KAAK+5C,qBACRp+B,EAAIw4B,YAAcjyC,EAAQ83C,mBAE5Bh6C,KAAKs0C,aAAa34B,EAAKzZ,EAAQwiD,iBAC/B1kD,KAAKmjD,eAAe,CAACx1B,EAASpsB,KAC5B,GAAIosB,EAAQ6tB,cAAcx7C,KAAMuB,GAAM,CACpC,MAAMmN,EAAI1O,KAAKwiD,QAAQjhD,GACvBosB,EAAQnK,OAAO7H,EAAKjN,EAAE1C,EAAG0C,EAAE3C,EAAG7J,EAASlC,KACzC,IAEF2b,EAAI6G,SACN,CAQAs4B,gBAAAA,CAAiBH,GACf,OACE36C,KAAKguB,SAAS2sB,IACd36C,KAAKguB,SAAS2sB,GAAYa,cAAcx7C,KAAM26C,EAElD,CAUAgK,iBAAAA,CAAkBhK,EAAoBroC,GAC/BtS,KAAK27C,sBACR37C,KAAK27C,oBAAsB,CAAA,GAE7B37C,KAAK27C,oBAAoBhB,GAAcroC,CACzC,CAOAsyC,qBAAAA,GAA6D,IAAvC1iD,EAAgC5B,UAAAC,OAAA,QAAAC,IAAAF,UAAA,GAAAA,UAAA,GAAG,CAAA,EACvDG,OAAOwJ,QAAQ/H,GAASnB,QAAQ+D,IAAA,IAAE61C,EAAYjd,GAAW54B,EAAA,OACvD9E,KAAK2kD,kBAAkBhK,EAAYjd,IAEvC,CAYAmnB,eAAAA,CACEC,GAEA,IAAK9kD,KAAKmD,OACR,OAEF,MAAMwY,EAAM3b,KAAKmD,OAAOmuC,WACxB,IAAK31B,EACH,OAEF,MAAMsG,EAAIjiB,KAAKmD,OAAOyb,kBACtBjD,EAAI2G,OACJ3G,EAAIhN,UAAUsT,EAAE,GAAIA,EAAE,GAAIA,EAAE,GAAIA,EAAE,GAAIA,EAAE,GAAIA,EAAE,IAC9CjiB,KAAK2O,UAAUgN,GAEf,MAAM3J,EAAQhS,KAAKgS,MAAQ,EACzBC,EAASjS,KAAKiS,OAAS,EAIzB,OAHA0J,EAAIqF,WAAWhP,EAAQ,GAAIC,EAAS,EAAGD,EAAOC,GAE9C6yC,GAAmBnpC,EAAI6G,UAChB7G,CACT,CAUAopC,UAAAA,CAAWC,GAKT,OAAO,CACT,CAQAC,QAAAA,CAASD,GAEP,OAAO,CACT,CAOAE,mBAAAA,CAAoBC,GAClB,OAAO,CACT,CAOAC,WAAAA,CAAYD,GACV,OAAO,CACT,CAQAE,OAAAA,CAAQF,GACN,OAAO,CACT,CASAG,sBAAAA,CAAuBH,GACrB,CAWFI,sBAAAA,CAAuBJ,GACrB,EC/sBG,SAASK,GACdC,EACAC,GAaA,OAXAA,EAAa3kD,QAAS4kD,IACpBllD,OAAOmlD,oBAAoBD,EAASE,WAAW9kD,QAAS8uC,IAC7C,gBAATA,GACEpvC,OAAOqlD,eACLL,EAAYI,UACZhW,EACApvC,OAAOslD,yBAAyBJ,EAASE,UAAWhW,IAClDpvC,OAAOulD,OAAO,WAIjBP,CACT,CDwGE1lD,EAnFWgiD,GAAuB,cpBuDhC,CACFG,cAAc,EACd+D,eAAe,EACfC,eAAe,EACf1J,cAAc,EACd2J,cAAc,EACdC,cAAc,EACdC,cAAc,EACdC,cAAc,EACdC,iBAAiB,EACjB3M,WAAY,GACZyJ,gBAAiB,GACjBtJ,oBAAoB,EACpBI,YAAa,mBACbH,kBAAmB,GACnBsC,YAAa,OACboI,gBAAiB,KACjB/B,aAAa,EACbiB,YAAa,mBACbC,gBAAiB,KACjBS,wBAAyB,GACzBF,kBAAmB,EACnBJ,YAAY,EACZT,yBAA0B,GAC1BlxC,YAAY,EACZm0C,SAAS,EACTC,oBAAoB,EACpBC,SAAU,OACVC,YAAa,KACbC,WAAY,OsBzGP,MAAMhX,WAIHmS,IAEVyD,GAAY5V,GAAc,CAAC5S,KAE3B/0B,EAAcM,SAASqnC,IACvB3nC,EAAcM,SAASqnC,GAAc,UCrB9B,MAAMiX,GAAgBA,CAC3BlrC,EACA3P,EACAD,EACA+6C,KAGA,MAAMr3C,EAAmB,GADzBq3C,EAAYpiD,KAAKmpB,MAAMi5B,IACM,GACvBlhC,KAAEA,GAASjK,EAAIorC,aAAa/6C,EAAI86C,EAAW/6C,EAAI+6C,EAAWr3C,EAAMA,GAGtE,IAAK,IAAItE,EAAI,EAAGA,EAAIya,EAAKrlB,OAAQ4K,GAAK,EAAG,CAEvC,GADqBya,EAAKza,GACP,EACjB,OAAO,CAEX,CACA,OAAO,GCfF,MAAe67C,GAMpBlnD,WAAAA,CAAYoC,GACVlC,KAAKkC,QAAUA,EACflC,KAAKinD,0BAA4BjnD,KAAKkC,QAAQk7B,YAAc,EAC5Dp9B,KAAK8b,MAAQ,IAAIhQ,GAAM9L,KAAKkC,QAAQ2T,OAAQ7V,KAAKkC,QAAQ4T,QACzD9V,KAAKknD,oBAAsBlnD,KAAKkC,QAAQ28B,cACpC,IAAI/yB,GAAM,EAAI9L,KAAKkC,QAAQ2T,OAAQ,EAAI7V,KAAKkC,QAAQ4T,QACpD,IAAIhK,GAAM,EAAG,EACnB,CAKUq7C,gBAAAA,CAAiBh8B,EAAUE,GACnC,MAAMpJ,EAAIkK,GAAahB,EAAME,GAC7B,OAAOrrB,KAAKkC,QAAQ28B,cAAgB5c,EAAEtV,SAAS3M,KAAK8b,OAASmG,CAC/D,CAQUmlC,mBAAAA,CAAoBj8B,EAAaE,EAAWe,GACpD,OAAOpsB,KAAKqnD,UACVl8B,EAAKlf,IAAIjM,KAAKsnD,yBAAyBn8B,EAAME,EAAIe,IAErD,CAEUm7B,QAAAA,GACR,OAA8B,IAAvBvnD,KAAKkC,QAAQ6T,OAAsC,IAAvB/V,KAAKkC,QAAQ8T,KAClD,CAEUqxC,SAAAA,CAAU9mC,GAClB,MAAM7R,EAAI,IAAI5C,GAAMyU,GAIpB,OAFA7R,EAAE3C,GAAK2C,EAAE1C,EAAItH,KAAKgS,IAAIpC,GAAiBtU,KAAKkC,QAAQ8T,QACpDtH,EAAE1C,GAAK0C,EAAE3C,EAAIrH,KAAKgS,IAAIpC,GAAiBtU,KAAKkC,QAAQ6T,QAC7CrH,CACT,CAEU84C,eAAAA,CAAgBC,EAAmBp7C,GAC3C,OAAOo7C,EAAW96C,SAAS3M,KAAKknD,qBAAqBt6C,eAAeP,EACtE,EC1CF,MAAMq7C,GAAa,IAAI57C,GAchB,MAAM67C,WAAkCX,GA8B7C,kCAAOY,CAA4BC,EAAgBC,GACjD,MAAMr8C,EAAQq8C,EACVz7B,GAAwBw7B,EAASC,GACjCt7B,GAAmBq7B,GACvB,OAAOnjD,KAAKgH,IAAID,GAAS3F,GAAS,EAAK,CACzC,CAEAhG,WAAAA,CAAYspC,EAAOvO,EAAOktB,EAAO7lD,GAC/B9B,MAAM8B,GAzBRnC,EAAAC,KAAA,UAAA,GAIAD,EAAAC,KAAA,UAAA,GAIAD,EAAAC,KAAA,aAAA,GAIAD,EAAAC,KAAA,gBAAA,GAcEA,KAAKopC,EAAI,IAAIt9B,GAAMs9B,GACnBppC,KAAK66B,EAAI,IAAI/uB,GAAM+uB,GACnB76B,KAAK+nD,EAAI,IAAIj8C,GAAMi8C,GACnB/nD,KAAKspC,GAAKtpC,KAAKmnD,iBAAiBnnD,KAAKopC,EAAGppC,KAAK66B,GAC7C76B,KAAKgoD,GAAKhoD,KAAKmnD,iBAAiBnnD,KAAKopC,EAAGppC,KAAK+nD,GAC7C/nD,KAAKk6B,MAAQ7N,GAAwBrsB,KAAKspC,GAAItpC,KAAKgoD,IACnDhoD,KAAKioD,SAAWx7B,GAGdR,GAAajsB,KAAKspC,GAAGr8B,GAAGy6C,IAAc1nD,KAAKgoD,GAAKhoD,KAAKspC,GAAItpC,KAAKk6B,MAAQ,GAE1E,CAEAotB,wBAAAA,CACEn8B,EACAE,GAEA,IADAe,EAAiB9rB,UAAAC,OAAA,QAAAC,IAAAF,UAAA,GAAAA,UAAA,GAAGN,KAAKinD,0BAEzB,MAAM/6B,EAASlsB,KAAKmnD,iBAAiBh8B,EAAME,GACrC68B,EAAuBx7B,GAAqBR,GAC5Ci8B,EAAcR,GAA0BC,4BAC5CM,EACAloD,KAAKioD,UAEP,OAAOjoD,KAAKwnD,gBAAgBU,EAAsB97B,EAAY+7B,EAChE,CAQAC,YAAAA,GACE,MAAMC,EAAuB,GAU7B,OARCroD,KAAKk6B,MAAQj0B,IAAc,EAAI,CAACjG,KAAK66B,GAAK,CAAC76B,KAAK66B,EAAG76B,KAAK+nD,IAAIhnD,QAC1DsqB,IACCg9B,EAAYj+C,KAAKpK,KAAKonD,oBAAoBpnD,KAAKopC,EAAG/d,IAClDg9B,EAAYj+C,KACVpK,KAAKonD,oBAAoBpnD,KAAKopC,EAAG/d,GAAKrrB,KAAKinD,8BAI1CoB,CACT,CASAC,YAAAA,GACE,MAAMD,EAAuB,GAC3BnuB,EAAQx1B,KAAKgH,IAAI1L,KAAKk6B,OACtBquB,EAAkB,EAAI7jD,KAAKiH,IAAIuuB,EAAQ,GACvCsuB,EAAcxoD,KAAKwnD,gBACjBxnD,KAAKioD,UACJjoD,KAAKinD,0BAA4BsB,GAQhC9qB,EAAmBz9B,KAAKkC,QAAQ28B,cAClCzS,GACEpsB,KAAKwnD,gBAAgBxnD,KAAKioD,SAAUjoD,KAAKkC,QAAQu7B,mBAEnDz9B,KAAKkC,QAAQu7B,iBAcjB,OAXErR,GAAUo8B,GAAexoD,KAAKinD,2BAC9BxpB,GAEA4qB,EAAYj+C,KAAKpK,KAAKqnD,UAAUrnD,KAAKopC,EAAEn9B,IAAIu8C,KAM7CH,EAAYj+C,QAAQpK,KAAKooD,gBAElBC,CACT,CAQQI,kBAAAA,CAAmBC,EAAoBC,GAC7C,MAAMN,EAAuB,GAE3BF,EAAc,IAAIr8C,GAChB67C,GAA0BC,4BAA4B5nD,KAAKioD,UAC3DN,GAA0BC,4BACxB,IAAI97C,GAAM9L,KAAKioD,SAASl8C,EAAG/L,KAAKioD,SAASj8C,KAiB/C,MALA,CATkB,IAAIF,GAAM,EAAG,GAC1Bc,eAAe5M,KAAKinD,2BACpBt6C,SAAS3M,KAAKknD,qBACdv6C,SAASw7C,GACI,IAAIr8C,GAAM,EAAG,GAC1Bc,eAAe5M,KAAKinD,2BACpBt6C,SAAS3M,KAAKknD,qBACdv6C,SAASw7C,IAEiBpnD,QAASmrB,IAClCU,GAAiBV,EAAQw8B,EAAaC,IACxCN,EAAYj+C,KAAKpK,KAAKopC,EAAEn9B,IAAIigB,MAGzBm8B,CACT,CASQO,oBAAAA,CAAqBF,EAAoBC,GAC/C,MAAMN,EAAuB,IAEvBtyC,MAAEA,EAAKC,MAAEA,EAAKH,OAAEA,EAAMC,OAAEA,EAAM+oB,cAAEA,GAAkB7+B,KAAKkC,QAC3Dm+C,EAAW,IAAIv0C,GACbpH,KAAKgS,IAAIpC,GAAiByB,IAC1BrR,KAAKgS,IAAIpC,GAAiB0B,KAGxB6yC,EAAe7oD,KAAKinD,0BACxB6B,EAAOjqB,EACHgqB,EACA/yC,EACApR,KAAKgB,KAAK,EAAIoQ,GAAU,EAAK,EAAID,GAAU,EAAKwqC,EAASt0C,GAAK,GAC9D88C,EAAenkD,KAAKgB,KAAK,EAAI26C,EAASt0C,GAAK,GAC/Cg9C,EAAY,IAAIj9C,GAGdpH,KAAKgB,KAAKhB,KAAKC,IAAIkkD,GAAgB,EAAIC,GAAQ,EAAG,IAClDA,GAEFE,EAAOnqB,EACHgqB,EACAnkD,KAAKgB,KACH,EACG26C,EAASr0C,GAAK,GAAK,EAAI8J,IAAW,GAChC,EAAID,EAAU,EAAIA,EAAUwqC,EAASr0C,EAAIq0C,EAASt0C,IAAM,GAE/D88C,EACAnkD,KAAKgB,KAAK,EAAI26C,EAASr0C,GAAK,GAAK,EAAIq0C,EAASr0C,EAAIq0C,EAASt0C,IAAM,GACrEk9C,EAAY,IAAIn9C,GACdk9C,EACAtkD,KAAKgB,KAAKhB,KAAKC,IAAIkkD,GAAgB,EAAIG,GAAQ,EAAG,KAsBtD,MAnBA,CACEC,EACAA,EAAUr8C,gBAAe,GACzBm8C,EACAA,EAAUn8C,oBAIT0L,IAAK4T,GACJlsB,KAAKqnD,UACHxoB,EAAgB3S,EAAOvf,SAAS3M,KAAKknD,qBAAuBh7B,IAG/DnrB,QAASmrB,IACJU,GAAiBV,EAAQw8B,EAAaC,IACxCN,EAAYj+C,KAAKpK,KAAKqnD,UAAUrnD,KAAKopC,GAAGn9B,IAAIigB,MAI3Cm8B,CACT,CAEAa,YAAAA,GACE,MAAMb,EAAuB,GAI7BA,EAAYj+C,QAAQpK,KAAKooD,gBAGzB,MAAMe,EAAiBnpD,KAAKk6B,MAAQj0B,IAAc,EAGhDmjD,EAAYppD,KAAKqnD,UAAUrnD,KAAKopC,GAChCigB,EAAQhB,EAAYc,EAAiB,EAAI,GAAG58C,SAAS68C,GACrDE,EAAQjB,EAAYc,EAAiB,EAAI,GAAG58C,SAAS68C,GAErDG,EAAmBJ,EACfnpD,KAAKqnD,UAAUrnD,KAAKspC,GAAG18B,gBAAe,IACtC5M,KAAKqnD,UACHrnD,KAAKioD,SAASt7C,SAAS3M,KAAKknD,qBAAqBt6C,gBAAe,IAGtE48C,EAAel9B,GAAa+8B,EAAOE,GAAoB,EACvDb,EAAcc,EAAeH,EAAQC,EACrCX,EAAYa,EAAeF,EAAQD,EAMrC,OALKrpD,KAAKunD,WAGRc,EAAYj+C,QAAQpK,KAAK4oD,qBAAqBF,EAAaC,IAF3DN,EAAYj+C,QAAQpK,KAAKyoD,mBAAmBC,EAAaC,IAIpDN,CACT,CAQUoB,aAAAA,GACR,OAAQzpD,KAAKkC,QAAQs7B,gBACnB,IAAK,QACH,OAAOx9B,KAAKsoD,eACd,IAAK,QACH,OAAOtoD,KAAKkpD,eACd,QACE,OAAOlpD,KAAKooD,eAElB,CAEOsB,OAAAA,GACL,OAAO1pD,KAAKypD,gBAAgBnxC,IAAKiI,IAAK,CACpCopC,YAAa3pD,KAAKopC,EAClBwgB,eAAgBrpC,EAChB9U,MAAOzL,KAAKk6B,MACZ+tB,SAAUjoD,KAAKioD,WAEnB,ECrSK,MAAM4B,WAAiC7C,GAU5ClnD,WAAAA,CAAYspC,EAAOD,EAAOjnC,GACxB9B,MAAM8B,GACNlC,KAAKopC,EAAI,IAAIt9B,GAAMs9B,GACnBppC,KAAKmpC,EAAI,IAAIr9B,GAAMq9B,EACrB,CAEAme,wBAAAA,CACEn8B,EACAE,GAEA,IADAe,EAAiB9rB,UAAAC,OAAA,QAAAC,IAAAF,UAAA,GAAAA,UAAA,GAAGN,KAAKinD,0BAEzB,MAAM/6B,EAASlsB,KAAKmnD,iBAAiBh8B,EAAME,GAC3C,OAAOrrB,KAAKwnD,gBAAgB96B,GAAqBR,GAASE,EAC5D,CAQA09B,WAAAA,GACE,MAAO,CACL9pD,KAAKonD,oBAAoBpnD,KAAKopC,EAAGppC,KAAKmpC,EAAGnpC,KAAKinD,2BAC9CjnD,KAAKonD,oBAAoBpnD,KAAKopC,EAAGppC,KAAKmpC,GAAInpC,KAAKinD,2BAEnD,CAQAiC,YAAAA,GACE,MAAMb,EAAuB,GAE7B,IAAKroD,KAAKunD,YAAcvnD,KAAKopC,EAAEn8B,GAAGjN,KAAKmpC,GAAI,CAKzC,MAAM4gB,EAAa,IAAIj+C,GAAM,EAAG,GAC7Bc,eAAe5M,KAAKinD,2BACpBt6C,SAAS3M,KAAKknD,qBACjBmB,EAAYj+C,KACVpK,KAAKqnD,UAAUrnD,KAAKopC,EAAEn9B,IAAI89C,IAC1B/pD,KAAKqnD,UAAUrnD,KAAKopC,EAAE78B,SAASw9C,IAEnC,MACE1B,EAAYj+C,QACP,IAAIu9C,GACL3nD,KAAKopC,EACLppC,KAAKmpC,EACLnpC,KAAKmpC,EACLnpC,KAAKkC,SACLgnD,gBAIN,OAAOb,CACT,CAQA2B,aAAAA,GACE,MAAM3B,EAAuB,GAE7B,GAAIroD,KAAKopC,EAAEn8B,GAAGjN,KAAKmpC,GAAI,CAKrB,MAAM4gB,EAAa,IAAIj+C,GAAM,EAAG,GAC7Bc,eAAe5M,KAAKinD,2BACpBt6C,SAAS3M,KAAKknD,qBACjBmB,EAAYj+C,KAAKpK,KAAKopC,EAAEn9B,IAAI89C,GAAa/pD,KAAKopC,EAAE78B,SAASw9C,GAC3D,KAAO,CACL,MAAM7B,EAAuBloD,KAAKsnD,yBAChCtnD,KAAKopC,EACLppC,KAAKmpC,EACLnpC,KAAKinD,2BAEDgD,EAAoBjqD,KAAKwnD,gBAC7B/6B,GAAczsB,KAAKmnD,iBAAiBnnD,KAAKopC,EAAGppC,KAAKmpC,KAChDnpC,KAAKinD,2BAEFiD,EAAalqD,KAAKopC,EAAEn9B,IAAIg+C,GAC9B5B,EAAYj+C,KACV8/C,EAAWj+C,IAAIi8C,GACfgC,EAAW39C,SAAS27C,GAExB,CAEA,OAAOG,EAAY/vC,IAAK5J,GAAM1O,KAAKqnD,UAAU34C,GAC/C,CAEU+6C,aAAAA,GACR,OAAQzpD,KAAKkC,QAAQq7B,eACnB,IAAK,QACH,OAAOv9B,KAAKkpD,eACd,IAAK,SACH,OAAOlpD,KAAKgqD,gBACd,QACE,OAAOhqD,KAAK8pD,cAElB,CAEOJ,OAAAA,GACL,OAAO1pD,KAAKypD,gBAAgBnxC,IAAKiI,IAAK,CACpCopC,YAAa3pD,KAAKopC,EAClBwgB,eAAgBrpC,IAEpB,ECnIK,MAAM4pC,GAAwB,SACnC7/B,EACApoB,GAEkB,IADlBkoD,EAAQ9pD,UAAAC,OAAA,QAAAC,IAAAF,UAAA,IAAAA,UAAA,GAER,MAAM+nD,EAA6B,GAEnC,GAAsB,IAAlB/9B,EAAO/pB,OACT,OAAO8nD,EAIT,MAAMgC,EAAU//B,EAAOjpB,OACrB,CAACgpD,EAAS9pC,KACH8pC,EAAQA,EAAQ9pD,OAAS,GAAG0M,GAAGsT,IAClC8pC,EAAQjgD,KAAK,IAAI0B,GAAMyU,IAElB8pC,GAET,CAAC,IAAIv+C,GAAMwe,EAAO,MAGpB,GAAuB,IAAnB+/B,EAAQ9pD,OACV6pD,GAAW,OACN,IAAKA,EAAU,CAGpB,MAAM7iB,EAAQ8iB,EAAQ,GAChBrhD,EC3CoBshD,EAC5Bj/C,EACAiO,KAEA,IAAK,IAAItQ,EAAQqC,EAAM9K,OAAS,EAAGyI,GAAS,EAAGA,IAC7C,GAAIsQ,EAAUjO,EAAMrC,GAAQA,EAAOqC,GACjC,OAAOrC,EAGX,OAAO,GDkCSshD,CAAeD,EAAU9pC,IAAWA,EAAMtT,GAAGs6B,IAC3D8iB,EAAQnhD,OAAOF,EAAQ,EACzB,CAkCA,OAhCAqhD,EAAQtpD,QAAQ,CAACqoC,EAAGpgC,EAAOshB,KACzB,IAAIuQ,EAAOktB,EACG,IAAV/+C,GACF++C,EAAIz9B,EAAO,GACXuQ,EAAIuvB,EAAWhhB,EAAI9e,EAAOA,EAAO/pB,OAAS,IACjCyI,IAAUshB,EAAO/pB,OAAS,GACnCs6B,EAAIvQ,EAAOthB,EAAQ,GACnB++C,EAAIqC,EAAWhhB,EAAI9e,EAAO,KAE1BuQ,EAAIvQ,EAAOthB,EAAQ,GACnB++C,EAAIz9B,EAAOthB,EAAQ,IAGjBohD,GAA8B,IAAlB9/B,EAAO/pB,OACrB8nD,EAAYj+C,QACP,IAAIy/C,GAAyBzgB,EAAGA,EAAGlnC,GAASwnD,YAExCU,GAAuB,IAAVphD,GAAeA,IAAUshB,EAAO/pB,OAAS,EAS/D8nD,EAAYj+C,QACP,IAAIu9C,GAA0Bve,EAAGvO,EAAGktB,EAAG7lD,GAASwnD,WATrDrB,EAAYj+C,QACP,IAAIy/C,GACLzgB,EACU,IAAVpgC,EAAc++C,EAAIltB,EAClB34B,GACAwnD,aASDrB,CACT,EE9EakC,GAAepvC,IAC1B,MAAMqvC,EAAoB,CAAA,EAO1B,OANA/pD,OAAOU,KAAKga,GAAOpa,QAASQ,IAC1BipD,EAAOjpD,GAAO,CAAA,EACdd,OAAOU,KAAKga,EAAM5Z,IAAMR,QAAS0pD,IAC/BD,EAAOjpD,GAAKkpD,GAAY,IAAKtvC,EAAM5Z,GAAKkpD,QAGrCD,GCUIE,GAAaC,GACxBA,EACG5nB,QAAQ,KAAM,SACdA,QAAQ,KAAM,UACdA,QAAQ,KAAM,UACdA,QAAQ,KAAM,QACdA,QAAQ,KAAM,QAEnB,IAAI6nB,GAEJ,MAiBaC,GAAiBC,IAE5B,GADAF,IAjBKA,KACHA,GACE,SAAUrmD,KACV,cAAewmD,MACf,IAAIA,KAAKC,eAAUxqD,EAAW,CAC5ByqD,YAAa,cAafL,GAAW,CACb,MAAMM,EAAWN,GAAUO,QAAQL,GACnC,OAAOlpD,MAAMupB,KAAK+/B,GAAU5yC,IAAIxT,IAAA,IAACqmD,QAAEA,GAASrmD,EAAA,OAAKqmD,GACnD,CAGA,OAAOC,GAAkBN,IAGrBM,GAAqBN,IACzB,MAAMO,EAAsB,GAC5B,IAAK,IAAWC,EAAPngD,EAAI,EAAQA,EAAI2/C,EAAWvqD,OAAQ4K,KACE,KAAvCmgD,EAAMC,GAAaT,EAAY3/C,KAGpCkgD,EAAUjhD,KAAKkhD,GAEjB,OAAOD,GAIHE,GAAeA,CAACC,EAAargD,KACjC,MAAMsgD,EAAOD,EAAIE,WAAWvgD,GAC5B,GAAIwgD,MAAMF,GACR,MAAO,GAET,GAAIA,EAAO,OAAUA,EAAO,MAC1B,OAAOD,EAAII,OAAOzgD,GAKpB,GAAI,OAAUsgD,GAAQA,GAAQ,MAAQ,CACpC,GAAID,EAAIjrD,QAAU4K,EAAI,EACpB,KAAM,iDAER,MAAM0gD,EAAOL,EAAIE,WAAWvgD,EAAI,GAChC,GAAI,MAAS0gD,GAAQA,EAAO,MAC1B,KAAM,iDAER,OAAOL,EAAII,OAAOzgD,GAAKqgD,EAAII,OAAOzgD,EAAI,EACxC,CAEA,GAAU,IAANA,EACF,KAAM,iDAER,MAAM2gD,EAAON,EAAIE,WAAWvgD,EAAI,GAIhC,GAAI,MAAS2gD,GAAQA,EAAO,MAC1B,KAAM,iDAIR,OAAO,mDA9FiB,SAACnB,GAAc,IAAEoB,EAAezrD,UAAAC,OAAA,QAAAC,IAAAF,UAAA,IAAAA,UAAA,GAAQ,MAChE,GAAGqqD,EAAOiB,OAAO,GAAGjzB,gBAClBozB,EAAkBpB,EAAO5wB,MAAM,GAAK4wB,EAAO5wB,MAAM,GAAG90B,eACpD,kCCOG,MAAM+mD,GAAkB,SAC7BC,EACAC,GAA+B,IAC/BC,EAAY7rD,UAAAC,OAAA,QAAAC,IAAAF,UAAA,IAAAA,UAAA,GAAQ,OAEpB2rD,EAAUvoC,OAASwoC,EAAUxoC,MAC7BuoC,EAAUruB,SAAWsuB,EAAUtuB,QAC/BquB,EAAU7uB,cAAgB8uB,EAAU9uB,aACpC6uB,EAAUpwB,WAAaqwB,EAAUrwB,UACjCowB,EAAUjrD,aAAekrD,EAAUlrD,YACnCirD,EAAUjnD,aAAeknD,EAAUlnD,YACnCinD,EAAUlnD,YAAcmnD,EAAUnnD,WAClCknD,EAAUG,0BAA4BF,EAAUE,yBAChDH,EAAU3rB,sBAAwB4rB,EAAU5rB,qBAC5C2rB,EAAUtrB,SAAWurB,EAAUvrB,QAC9BwrB,IACEF,EAAU/rB,WAAagsB,EAAUhsB,UAChC+rB,EAAUhsB,YAAcisB,EAAUjsB,WAClCgsB,EAAU9rB,cAAgB+rB,EAAU/rB,YAAa,EAU1CksB,GAAgBA,CAC3BhlC,EACAilC,KAEA,MAAMC,EAAYD,EAAK/wB,MAAM,MAC3BixB,EAAc,GAChB,IAAIC,GAAY,EACdR,EAAY,CAAA,EAEd5kC,EAASkjC,GAAYljC,GAGrB,IAAK,IAAIlc,EAAI,EAAGA,EAAIohD,EAAUhsD,OAAQ4K,IAAK,CACzC,MAAMuhD,EAAQ7B,GAAc0B,EAAUphD,IACtC,GAAKkc,EAAOlc,GAOZ,IAAK,IAAI44B,EAAI,EAAGA,EAAI2oB,EAAMnsD,OAAQwjC,IAAK,CACrC0oB,IACA,MAAMP,EAAY7kC,EAAOlc,GAAG44B,GAExBmoB,GAAazrD,OAAOU,KAAK+qD,GAAW3rD,OAAS,IAC3CyrD,GAAgBC,EAAWC,GAAW,GACxCM,EAAYpiD,KAAK,CACfm9B,MAAOklB,EACPE,IAAKF,EAAY,EACjBtxC,MAAO+wC,IAITM,EAAYA,EAAYjsD,OAAS,GAAGosD,OAGxCV,EAAYC,GAAa,CAAA,CAC3B,MAtBEO,GAAaC,EAAMnsD,OACnB0rD,EAAY,CAAA,CAsBhB,CACA,OAAOO,GAWII,GAAkBA,CAC7BvlC,EACAilC,KAEA,IAAK1qD,MAAMmN,QAAQsY,GAEjB,OAAOkjC,GAAYljC,GAErB,MAAMklC,EAAYD,EAAK/wB,MAAM10B,GAC3BgmD,EAA0B,CAAA,EAC5B,IAAIJ,GAAY,EACdK,EAAa,EAEf,IAAK,IAAI3hD,EAAI,EAAGA,EAAIohD,EAAUhsD,OAAQ4K,IAAK,CACzC,MAAMuhD,EAAQ7B,GAAc0B,EAAUphD,IAGtC,IAAK,IAAI44B,EAAI,EAAGA,EAAI2oB,EAAMnsD,OAAQwjC,IAChC0oB,IAGEplC,EAAOylC,IACPzlC,EAAOylC,GAAYvlB,OAASklB,GAC5BA,EAAYplC,EAAOylC,GAAYH,MAG/BE,EAAa1hD,GAAK0hD,EAAa1hD,IAAM,CAAA,EAErC0hD,EAAa1hD,GAAG44B,GAAK,IAAK1c,EAAOylC,GAAY3xC,OAEzCsxC,IAAcplC,EAAOylC,GAAYH,IAAM,GACzCG,IAIR,CACA,OAAOD,GCjIIE,GAAoB,CAC/B,UACA,YACAnlD,EACA,eACA,YACA,UACAC,EACA,mBACA,iBACA,oBACA,kBACA,oBACA,iBACA,eACA,KACA,cACA,gBACA,sBACA,aCzBK,SAASmlD,GACdv5C,EACAw5C,GAEA,MAAMC,EAAWz5C,EAAQy5C,SACnBC,EAAa15C,EAAQ25C,aAAa,SAClC95C,EAAKG,EAAQ25C,aAAa,MAC1BC,EAAO,mBACb,IAAIC,EASJ,GANAA,EAAU,IAAIjuB,OAAO,IAAM6tB,EAAU,KACrCD,EAAWA,EAASlqB,QAAQuqB,EAAS,IACjCh6C,GAAM25C,EAAS1sD,SACjB+sD,EAAU,IAAIjuB,OAAO,IAAM/rB,EAAK+5C,EAAM,KACtCJ,EAAWA,EAASlqB,QAAQuqB,EAAS,KAEnCH,GAAcF,EAAS1sD,OAAQ,CACjC,MAAMgtD,EAAkBJ,EAAW5xB,MAAM,KACzC,IAAK,IAAIpwB,EAAIoiD,EAAgBhtD,OAAQ4K,KACnCmiD,EAAU,IAAIjuB,OAAO,MAAQkuB,EAAgBpiD,GAAKkiD,EAAM,KACxDJ,EAAWA,EAASlqB,QAAQuqB,EAAS,GAEzC,CACA,OAA2B,IAApBL,EAAS1sD,MAClB,CClBO,SAASitD,GACd/5C,EACAg6C,GAEA,IAAIC,GAAiB,EAErB,MAAMC,EAAgBX,GAAgBv5C,EAASg6C,EAAU7V,OAIzD,OAHI+V,GAAiBF,EAAUltD,SAC7BmtD,ECbG,SACLj6C,EACAg6C,GAEA,IAAIR,EACFS,GAAiB,EACnB,KACEj6C,EAAQm6C,eAC2B,IAAnCn6C,EAAQm6C,cAAc1yC,UACtBuyC,EAAUltD,QAENmtD,IACFT,EAAWQ,EAAU7V,OAGvB8V,EAAiBV,GADjBv5C,EAAUA,EAAQm6C,cACwBX,GAE5C,OAA4B,IAArBQ,EAAUltD,MACnB,CDLqBstD,CAAoBp6C,EAASg6C,IAEzCE,GAAiBD,GAAuC,IAArBD,EAAUltD,MACtD,CEXO,SAASutD,GACdr6C,GAEA,IADAs6C,EAAkBztD,UAAAC,OAAA,QAAAC,IAAAF,UAAA,GAAAA,UAAA,GAAG,CAAA,EAEjB+mB,EAAiC,CAAA,EACrC,IAAK,MAAM2mC,KAAQD,EACbP,GAAmB/5C,EAASu6C,EAAKzyB,MAAM,QACzClU,EAAS,IACJA,KACA0mC,EAASC,KAIlB,OAAO3mC,CACT,CCnBO,MAAM4mC,GACXC,IAAyC,IAAAC,EAAA,OACmB,QADnBA,EAC9BpsB,GAAcmsB,UAAmC,IAAAC,EAAAA,EAAID,GCF5DE,GAAQ,IAAI/uB,OAAO,IAAIoC,MAAU,MCYjC/yB,GAAI,IAAI+yB,MACR1rB,GAAQ2rB,OAAOC,GAAG,YAAYjzB,OAC9BsH,GAAQ0rB,OAAOC,GAAG,YAAYjzB,OAC9BN,GAASszB,OAAOC,GAAG,aAAajzB,SAAQA,MAAKA,SAC7CoN,GAAQ4lB,OAAOC,GAAG,YAAYjzB,SAAQA,SACtC0iC,GAAY1P,OAAOC,GAAG,gBAAgBjzB,SAAQA,SAE9CC,GAAY,MADH+yB,OAAOC,GAAG,aAAajzB,MAAKA,MAAKA,MAAKA,MAAKA,MAAKA,UAC7B0iC,MAAahjC,MAAU0N,MAAS/F,MAASC,MACrEq4C,GAAa,MAAM1/C,OACnB2/C,GAAgB5sB,OAAOC,GAAG,UAAU0sB,WAEpCE,GAAkB,IAAIlvB,OAAOivB,IAC7BE,GAAc,IAAInvB,OAAO1wB,IACzB8/C,GAAiB,IAAIpvB,OAAO1wB,GAAW,KAQtC,SAAS+/C,GAAwBC,GAOtC,MAAMv5C,EAAqB,GAI3B,KATAu5C,EDjCkCA,IAClCA,EACG5rB,QAAQqrB,GAAO,QAEfrrB,QAAQ,MAAO,KACfA,QAAQ,QAAS,KC4BH6rB,CAAoBD,GAElC5rB,QAAQ,iBAAkB,QAS1B4rB,IAAmBJ,GAAgBM,KAAKF,GAEzC,MAAO,IAAIxoD,GAGb,IAAK,MAAM60B,KAAS2zB,EAAeG,SAASL,IAAiB,CAC3D,MAAMM,EAAiBP,GAAYzyB,KAAKf,EAAM,IAC9C,IAAK+zB,EACH,SAEF,IAAI93C,EAAiB9Q,EACrB,MAAM6oD,EAAgBD,EAAevlD,OAAQ2a,KAAQA,KAC5C8qC,KAAcC,GAAWF,GAC3BllD,EAAMqlD,EAAMC,EAAMC,EAAMC,EAAMC,GAAQL,EAAQ52C,IAAKk3C,GACxD91C,WAAW81C,IAGb,OAAQP,GACN,IAAK,YACHh4C,EAASd,GAAsBrM,EAAMqlD,GACrC,MACF,KAAKloD,EACHgQ,EAASb,GAAmB,CAAE3K,MAAO3B,GAAQ,CAAEkC,EAAGmjD,EAAMpjD,EAAGqjD,IAC3D,MACF,KAAK7nD,EACH0P,EAAST,GAAkB1M,EAAMqlD,GACjC,MACF,KAAKznD,EACHuP,EAASN,GAAkB7M,GAC3B,MACF,KAAKnC,EACHsP,EAASJ,GAAkB/M,GAC3B,MACF,IAAK,SACHmN,EAAS,CAACnN,EAAMqlD,EAAMC,EAAMC,EAAMC,EAAMC,GAK5Cn6C,EAAShL,KAAK6M,EAChB,CAEA,OAAO9B,GAA6BC,EACtC,CCrFO,SAASq6C,GACdvB,EACA5iD,EACAokD,EACA7zB,GAEA,MAAM9sB,EAAUnN,MAAMmN,QAAQzD,GAC9B,IAAIqkD,EACAC,EAA0DtkD,EAC9D,GAAK4iD,IAAStmD,GAAQsmD,IAASrmD,GAAWyD,IAAU1E,EAE7C,IAAa,kBAATsnD,EACT,MAAiB,uBAAV5iD,EACF,GAAa,oBAAT4iD,EAEP0B,EADEtkD,IAAU1E,EACC,KAEA0E,EAAMy3B,QAAQ,KAAM,KAAKxH,MAAM,OAAOjjB,IAAIoB,iBAEpD,GAAa,oBAATw0C,EAEP0B,EADEF,GAAoBA,EAAiBG,gBAC1B76C,GACX06C,EAAiBG,gBACjBnB,GAAwBpjD,IAGbojD,GAAwBpjD,QAElC,GAAa,YAAT4iD,EACT0B,EAAatkD,IAAU1E,GAAkB,WAAV0E,EAE3BokD,IAAiD,IAA7BA,EAAiBp9C,UACvCs9C,GAAa,QAEV,GAAa,YAAT1B,EACT0B,EAAal2C,WAAWpO,GACpBokD,QAAwD,IAA7BA,EAAiB3yB,UAC9C6yB,GAAcF,EAAiB3yB,cAE5B,GAAa,eAATmxB,EACT0B,EAAuB,UAAVtkD,EAAoB9E,EAAiB,QAAV8E,EAAkB3E,EAAQJ,OAC7D,GAAa,gBAAT2nD,GAA0BA,IAAS5uB,GAE5CqwB,EAAU/zB,GAAUtwB,EAAOuwB,GAAYA,EAAY,SAC9C,GAAa,eAATqyB,EAAuB,CAChC,MAAM4B,EAAYxkD,EAAMrC,QAAQrB,GAC1BmoD,EAAczkD,EAAMrC,QAAQpB,GAClC+nD,EAAahoD,GACTkoD,GAAY,GAAMC,GAAc,GAAMA,EAAcD,QAE7CA,GAAoBC,GAAc,KAD3CH,EAAa/nD,EAIjB,KAAO,IACI,SAATqmD,GACS,eAATA,GACS,SAATA,GACS,OAATA,EAEA,OAAO5iD,EACF,GAAa,mBAAT4iD,EACT,MAAiB,oBAAV5iD,EAEPqkD,EAAS5gD,EACJzD,EAAmBgN,IAAIsjB,IACxBA,GAAUtwB,EAAOuwB,EACvB,OAxDE+zB,EAAa,GA0Df,OAAQ7gD,GAAW48C,MAAMgE,GAAqBC,EAAaD,CAC7D,CCrEO,SAASK,GACd70C,EACA80C,GAEA90C,EACG4nB,QAAQ,QAAS,IACjBxH,MAAM,KACNx6B,QAASmvD,IACR,IAAKA,EAAO,OACZ,MAAOhC,EAAM5iD,GAAS4kD,EAAM30B,MAAM,KAClC00B,EAAO/B,EAAK5xB,OAAOr3B,eAAiBqG,EAAMgxB,QAEhD,CCVO,SAAS6zB,GACd18C,GAEA,MAAMw8C,EAA8B,CAAA,EAClC90C,EAAQ1H,EAAQ25C,aAAa,SAE/B,OAAKjyC,GAIgB,iBAAVA,EACT60C,GAAiB70C,EAAO80C,GCbrB,SACL90C,EACA80C,GAEAxvD,OAAOwJ,QAAQkR,GAAOpa,QAAQ+D,IAAmB,IAAjB8N,EAAMtH,GAAMxG,OAC5BtE,IAAV8K,IAGJ2kD,EAAOr9C,EAAK3N,eAAiBqG,IAEjC,CDKI8kD,CAAiBj1C,EAAO80C,GAGnBA,GATEA,CAUX,CErBA,MAAMI,GAAqB,CACzBzyB,OAAQ,gBACRla,KAAM,eCYD,SAAS4sC,GACd78C,EACA88C,EACAxC,GAEA,IAAKt6C,EACH,MAAO,CAAA,EAGT,IACEooB,EADE6zB,EAA2C,CAAA,EAE7Cc,EAAiBnqD,EAIjBoN,EAAQuH,YACRunB,GAAqBssB,KAAKp7C,EAAQuH,WAAWkyC,YAE7CwC,EAAmBY,GACjB78C,EAAQm6C,cACR2C,EACAxC,GAEE2B,EAAiB7zB,WACnBA,EAAW20B,EAAiB50B,GAAU8zB,EAAiB7zB,YAI3D,MAAM40B,EAAwC,IACzCF,EAAWlvD,OAA+B,CAAC2P,EAAMk9C,KAClD,MAAM5iD,EAAQmI,EAAQ25C,aAAac,GAInC,OAHI5iD,IACF0F,EAAKk9C,GAAQ5iD,GAER0F,GACN,CAAA,MAGA88C,GAA0Br6C,EAASs6C,MACnCoC,GAAoB18C,IAGrBg9C,EAAcruB,KAChB3uB,EAAQoI,aAAaumB,GAAOquB,EAAcruB,KAExCquB,EAActuB,MAEhBtG,EAAWD,GAAU60B,EAActuB,IAAQquB,GAC3CC,EAActuB,IAAS,GAAGtG,KAI5B,MAAM60B,EAGF,CAAA,EACJ,IAAK,MAAMxC,KAAQuC,EAAe,CAChC,MAAME,EAAiB1C,GAAcC,GAC/B0C,EAAkBnB,GACtBkB,EACAF,EAAcvC,GACdwB,EACA7zB,GAEF60B,EAAgBC,GAAkBC,CACpC,CACIF,GAAmBA,EAAgBG,MC5ElC,SACLvlD,EACA2kD,GAEA,MAAMj1B,EAAQ1vB,EAAM0vB,MAAM8G,IAE1B,IAAK9G,EACH,OAEF,MAAMj2B,EAAYi2B,EAAM,GAGtBh2B,EAAag2B,EAAM,GACnBa,EAAWb,EAAM,GACjBqF,EAAarF,EAAM,GACnBh6B,EAAag6B,EAAM,GAEjBj2B,IACFkrD,EAAOlrD,UAAYA,GAEjBC,IACFirD,EAAOjrD,WAAa2mD,MAAMjyC,WAAW1U,IACjCA,EACA0U,WAAW1U,IAEb62B,IACFo0B,EAAOp0B,SAAWD,GAAUC,IAE1B76B,IACFivD,EAAOjvD,WAAaA,GAElBq/B,IACF4vB,EAAO5vB,WAA4B,WAAfA,EAA0B,EAAIA,EAEtD,CD2CIywB,CAAqBJ,EAAgBG,KAAgBH,GAEvD,MAAMK,EAAc,IAAKrB,KAAqBgB,GAC9C,OAAOnuB,GAAqBssB,KAAKp7C,EAAQy5C,UACrC6D,ED3EC,SACLR,GAEA,MAAMnvD,EAAWwuC,GAAazwB,cAsB9B,OArBA1e,OAAOwJ,QAAQomD,IAAoBtvD,QAAQ+D,IAAuB,IAArBopD,EAAM8C,GAAUlsD,EAC3D,QACmC,IAA1ByrD,EAAWS,IACG,KAArBT,EAAWrC,GAEX,OAEF,QAAgC,IAArBqC,EAAWrC,GAAuB,CAC3C,IAAK9sD,EAAS8sD,GACZ,OAEFqC,EAAWrC,GAAQ9sD,EAAS8sD,EAC9B,CACA,GAAyC,IAArCqC,EAAWrC,GAAMjlD,QAAQ,QAC3B,OAEF,MAAM+vB,EAAQ,IAAID,GAAMw3B,EAAWrC,IACnCqC,EAAWrC,GAAQl1B,EAChBiB,SAAS1gB,GAAQyf,EAAMgB,WAAau2B,EAAWS,GAAY,IAC3Dt3B,WAEE62B,CACT,CCkDMU,CAAqBF,EAC3B,CEjFO,MAgBDG,GAAa,CAAC,KAAM,MAEnB,MAAMC,WAKHvhB,GAqBR,kBAAOzwB,GACL,MAAO,IACF/e,MAAM+e,iBACNgyC,GAAK/xC,YAEZ,CAMAtf,WAAAA,CAAYoC,GACV9B,QACAK,OAAOC,OAAOV,KAAMmxD,GAAK/xC,aACzBpf,KAAK8vC,WAAW5tC,GAChBlC,KAAKoxD,WACP,CAKAA,SAAAA,GACE,MAAMC,GAAEA,EAAEC,GAAEA,GAAOtxD,KACfqxD,IAAOC,EACTtxD,KAAKsxD,GAAKD,EACDC,IAAOD,IAChBrxD,KAAKqxD,GAAKC,EAEd,CAMApe,OAAAA,CAAQv3B,GACN,MAAQ3J,MAAOs8B,EAAGr8B,OAAQomB,GAAMr4B,KAC1BgM,GAAKsiC,EAAI,EACTviC,GAAKssB,EAAI,EACTg5B,EAAKrxD,KAAKqxD,GAAK3sD,KAAK8I,IAAIxN,KAAKqxD,GAAI/iB,EAAI,GAAK,EAC1CgjB,EAAKtxD,KAAKsxD,GAAK5sD,KAAK8I,IAAIxN,KAAKsxD,GAAIj5B,EAAI,GAAK,EAC1Ck5B,EAAmB,IAAPF,GAAmB,IAAPC,EAE9B31C,EAAIkI,YAEJlI,EAAImI,OAAO9X,EAAIqlD,EAAItlD,GAEnB4P,EAAIoI,OAAO/X,EAAIsiC,EAAI+iB,EAAItlD,GACvBwlD,GACE51C,EAAI61C,cACFxlD,EAAIsiC,EAAIhoC,EAAQ+qD,EAChBtlD,EACAC,EAAIsiC,EACJviC,EAAIzF,EAAQgrD,EACZtlD,EAAIsiC,EACJviC,EAAIulD,GAGR31C,EAAIoI,OAAO/X,EAAIsiC,EAAGviC,EAAIssB,EAAIi5B,GAC1BC,GACE51C,EAAI61C,cACFxlD,EAAIsiC,EACJviC,EAAIssB,EAAI/xB,EAAQgrD,EAChBtlD,EAAIsiC,EAAIhoC,EAAQ+qD,EAChBtlD,EAAIssB,EACJrsB,EAAIsiC,EAAI+iB,EACRtlD,EAAIssB,GAGR1c,EAAIoI,OAAO/X,EAAIqlD,EAAItlD,EAAIssB,GACvBk5B,GACE51C,EAAI61C,cACFxlD,EAAI1F,EAAQ+qD,EACZtlD,EAAIssB,EACJrsB,EACAD,EAAIssB,EAAI/xB,EAAQgrD,EAChBtlD,EACAD,EAAIssB,EAAIi5B,GAGZ31C,EAAIoI,OAAO/X,EAAGD,EAAIulD,GAClBC,GACE51C,EAAI61C,cAAcxlD,EAAGD,EAAIzF,EAAQgrD,EAAItlD,EAAI1F,EAAQ+qD,EAAItlD,EAAGC,EAAIqlD,EAAItlD,GAElE4P,EAAIqI,YAEJhkB,KAAKm1C,oBAAoBx5B,EAC3B,CAOAxB,QAAAA,GAGsD,IAApD8K,EAAwB3kB,UAAAC,OAAA,QAAAC,IAAAF,UAAA,GAAAA,UAAA,GAAG,GAC3B,OAAOF,MAAM+Z,SAAS,IAAI+2C,MAAejsC,GAC3C,CAOAiZ,MAAAA,GACE,MAAMlsB,MAAEA,EAAKC,OAAEA,EAAMo/C,GAAEA,EAAEC,GAAEA,GAAOtxD,KAClC,MAAO,CACL,SACA,eACA,OAAOgS,EAAQ,UACZC,EAAS,UACHo/C,UAAWC,aAAct/C,cAAkBC,UAExD,CAuBA,wBAAaw/C,CACXh+C,EACAvR,EACA6rD,GAEA,MAAMj8C,KACJA,EAAO,EAACC,IACRA,EAAM,EAACC,MACPA,EAAQ,EAACC,OACTA,EAAS,EAACK,QACVA,GAAU,KACPo/C,GACDpB,GAAgB78C,EAASzT,KAAK2xD,gBAAiB5D,GAEnD,OAAO,IAAI/tD,KAAK,IACXkC,KACAwvD,EACH5/C,OACAC,MACAC,QACAC,SACAK,QAASs/C,QAAQt/C,GAAWN,GAASC,IAEzC,EA5KAlS,EAdWoxD,GAAI,OAoBD,QAAMpxD,EApBToxD,GAAI,kBAsBU,IAAI7tB,MAAoB4tB,KAAWnxD,EAtBjDoxD,GAAI,cAlBiD,CAChEE,GAAI,EACJC,GAAI,IAwCkCvxD,EAxB3BoxD,GAAI,kBAkJU,IACpBpE,GACH,IACA,IACA,KACA,KACA,QACA,WAsCJ9kD,EAAcM,SAAS4oD,IACvBlpD,EAAcY,YAAYsoD,IC5NnB,MAAMU,GAA6B,iBAC7BC,GAAoB,QACpBC,GAAsB,UACtBC,GAAyB,aCYzBC,GAAkBA,CAC7BC,EACA7iD,KAEA,MAAMwvB,cACJA,EAAazB,YACbA,EAAWprB,MACXA,EAAKC,OACLA,EACAy6B,MAAOylB,GACL9iD,EACE9B,EACJ4kD,GAAgBA,IAAiBD,EAC7BhnC,GACEinC,EAAal0B,sBACbi0B,EAAiBj0B,uBAEnB,KACAm0B,EAAe7kD,EACjB8B,EAAO8e,yBAAyBxf,UAAUpB,GAC1C8B,EAAO8e,yBACLkkC,GAAoBhjD,EAAyC,mCAC7DijD,EACJzzB,GAAiBwzB,EACb/mC,GACE,IAAIxf,GAAMsxB,EAAaA,QACvB58B,EACA0xD,EAAiBj0B,uBAEnB1vB,GACAgkD,GACH1zB,GAAiBwzB,EAAmBj1B,EAAc,EAC/Co1B,EAAa1nC,GACjB9Y,EAAQugD,EACRtgD,EAASsgD,EACTp9C,GAA6B,CAAC5H,EAAG8B,EAAOob,kBAAkB,IAEzDxe,IAAIqmD,GACJvlD,aAAa,GAChB,MAAO,CAACqlD,EAAa7lD,SAASimD,GAAaJ,EAAanmD,IAAIumD,KClCvD,MAAeC,GAYbC,gBAAAA,CACLtwD,EACAoN,GAEA,GAAIxP,KAAK2yD,oBAAoBvwD,GAC3B,OAAOpC,KAAK4yD,gBAAgBpjD,EAASpN,EAEzC,CAEAuwD,mBAAAA,CAAmB7tD,GAAwD,IAAvD4D,KAAEA,EAAImqD,aAAEA,EAAYC,SAAEA,GAA+BhuD,EACvE,OACE4D,IAASmpD,IACTnpD,IAASspD,MACNa,GAAgBC,IAAaD,CAEpC,CAEAE,oBAAAA,CAAoBxoD,GAAsD,IAArD7B,KAAEA,EAAMgB,QAAQyY,SAAEA,IAAiC5X,EACtE,OACE7B,IAASmpD,IACT1vC,IACCA,EAAS4c,kBAEd,CAEAi0B,cAAAA,CACE5wD,EACAipC,GAEA,OAAOA,EAAO57B,IAChB,CAKAmjD,eAAAA,CACEpjD,EACApN,GAEA,MAAMsG,KAAEA,EAAIgB,OAAEA,GAAWtH,EACzB,GAAIsG,IAASspD,IAA0B5vD,EAAQ6wD,UAC7C,OAAO7wD,EAAQ6wD,UAEjB,GAAuB,IAAnBzjD,EAAQjP,OACV,OAEF,MAAMuR,KAAEA,EAAIC,IAAEA,EAAGC,MAAEA,EAAKC,OAAEA,GAAWoY,GACnC7a,EACG8I,IAAKjJ,GAAW4iD,GAAgBvoD,EAAQ2F,IACxChO,OAAgB,CAAC2rC,EAAQz3B,IAASy3B,EAAO9hC,OAAOqK,GAAO,KAEtD29C,EAAW,IAAIpnD,GAAMkG,EAAOC,GAE5BkhD,EADc,IAAIrnD,GAAMgG,EAAMC,GACL9F,IAAIinD,EAASnmD,aAAa,IAEzD,GAAIrE,IAASmpD,GAA4B,CACvC,MAAMuB,EAAapzD,KAAKgzD,eAAe5wD,EAAS,CAC9CqN,KAAMyjD,EACNnuC,OAAQouC,IAEV,MAAO,CAELpuC,OAAQouC,EAERE,mBAAoB,IAAIvnD,GAAM,EAAG,GACjC2D,KAAM2jD,EAEV,CAGE,MAAO,CACLruC,OAFaouC,EAAWxkD,UAAUjF,EAAO+gB,iBAGzChb,KAAMyjD,EAGZ,EAtFAnzD,EADoB0yD,GAAc,OAIpB,YCjBT,MAAMa,WAAyBb,GAQpCE,mBAAAA,CAAoBvwD,GAClB,OAAO,CACT,EACDrC,EAXYuzD,GAAgB,OACJ,eAYzBrrD,EAAcM,SAAS+qD,ICiBvB,MAAMC,GAAiB,gBAOhB,MAAMC,GAMX1zD,WAAAA,GAA+D,IAAnDgzD,EAAwBxyD,UAAAC,OAAA,QAAAC,IAAAF,UAAA,GAAAA,UAAA,GAAG,IAAIgzD,GAAkBvzD,EAAAC,KAAA,gBAAA,GAC3DA,KAAK8yD,SAAWA,EAChB9yD,KAAKyzD,eAAiB,IAAIvrD,GAC5B,CAEOwrD,aAAAA,CAActxD,GACnB,MAAMuxD,EAAqC,CACzCC,SAAS,EACTd,SAAU9yD,KAAK8yD,YACZ1wD,EACHywD,aAAc7yD,KAAK6zD,oBACnBzpC,eAAAA,GACEpqB,KAAK4zD,SAAU,CACjB,GAGF5zD,KAAK8zD,eAAeH,GAEpB,MAAMI,EAAe/zD,KAAKg0D,gBAAgBL,GACtCI,GACF/zD,KAAKi0D,aAAaN,EAAeI,GAGnC/zD,KAAKk0D,cAAcP,EAAeI,GAClC/zD,KAAK6zD,oBAAsBF,EAAcb,QAC3C,CAUUqB,cAAAA,CACR9kD,EACAjN,GAEA,MAAMsH,OAAEA,GAAWtH,EACnB,MACE,CACE0F,EACAhB,EACAK,EACAH,EACAD,EACAG,EACAI,EACAF,EACAC,GAEFiR,IAAK/W,GACL8N,EAAOxF,GAAGtI,EAAM2oB,GACdlqB,KAAK0zD,cACHnyD,IAAQuG,EACJ,CACEY,KJvG2B,kBIwG3B0rD,QAAS7yD,EACT2oB,IACAxgB,UAEF,CACEhB,KJ5G4B,mBI6G5B0rD,QAAS7yD,EACT2oB,IACAxgB,YAKd,CAQU2qD,SAAAA,CACRhlD,EACAjN,GAEApC,KAAKs0D,YAAYjlD,EAAQjN,GACzB,MAAMkI,EAAYtK,KAAKm0D,eAAe9kD,EAAQjN,GAC9CpC,KAAKyzD,eAAehrD,IAAI4G,EAAQ/E,EAClC,CAKUgqD,WAAAA,CACRjlD,EACAklD,IAECv0D,KAAKyzD,eAAenrD,IAAI+G,IAAW,IAAItO,QAASyJ,GAAMA,KACvDxK,KAAKyzD,eAAee,OAAOnlD,EAC7B,CAEAolD,kBAAAA,CACEryD,GAEAA,EAAQsyD,QAAQ3zD,QAASsO,GAAWrP,KAAKs0D,YAAYjlD,EAAQjN,GAC/D,CAEAuyD,gBAAAA,CACEvyD,GAEAA,EAAQsyD,QAAQ3zD,QAASsO,GAAWrP,KAAKq0D,UAAUhlD,EAAQjN,GAC7D,CAEU0xD,cAAAA,CAAe1xD,GACvB,MAAMsH,OAAEA,EAAMhB,KAAEA,GAAStG,GACnBe,OAAEA,GAAWuG,EAkBnB,GAfIhB,IAASmpD,IAA8BnpD,IAASopD,GAClD9xD,KAAK20D,iBAAiBvyD,GACbsG,IAASqpD,IAClB/xD,KAAKy0D,mBAAmBryD,GAG1BsH,EAAOqB,KAAK,gBAAiB,CAC3B3I,YAEFe,GACEA,EAAO4H,KAAK,uBAAwB,CAClCrB,SACAtH,YAGAsG,IAASspD,IAA0B5vD,EAAQuO,KAAM,CACnD,MAAQmiD,SAAUz+C,KAAMugD,GAAqBxyD,EAE7CsH,EAAOsG,cACJX,GACEA,EAAiBwlD,eACjBxlD,EAAiBwlD,cAAcnB,cAAc,IACzCkB,EACHhB,SAAS,EACTlqD,OAAQ2F,IAGhB,CACF,CAEU2kD,eAAAA,CACR5xD,GAEA,MAAMsH,OAAEA,EAAMopD,SAAEA,EAAQpqD,KAAEA,GAAStG,EAE7BipC,EAASynB,EAASJ,iBAAiBtwD,EAASsH,EAAOwG,cAEzD,IAAKm7B,EACH,OAGF,MAAMypB,EACJpsD,IAASmpD,GACL,IAAI/lD,GACJpC,EAAOykB,0BAGXpJ,OAAQgwC,EAAUC,WAClBA,EAAa,IAAIlpD,GAAOunD,mBACxBA,EAAqB,IAAIvnD,IACvBu/B,EACEruB,EAAS83C,EACZvoD,SAASwoD,GACT9oD,IAAI+oD,GACJrmD,UAECjG,IAASmpD,GACL1rD,EACA0O,GAAgBnL,EAAO+gB,kBAC3B,GAEDxe,IAAIonD,GAEP,MAAO,CACLhoB,SACAypB,aACAC,aACA/3C,SAEJ,CAEUi3C,YAAAA,CACR7xD,EACA2xD,GAEA,MAAMrqD,OAAEA,GAAWtH,GAEjBipC,QAAQ57B,KAAEA,GAAMslD,WAChBA,GACEhB,EAO6C,IAAAkB,EAAAC,GALjDxrD,EAAOjB,IAAI,CAAEuJ,MAAOvC,EAAKzD,EAAGiG,OAAQxC,EAAK1D,IAEzC/L,KAAKm1D,cAAc/yD,EAAS2xD,GAGxB3xD,EAAQsG,OAASmpD,IAEnBnoD,EAAOjB,IAAI,CACTqJ,KACW,QADPmjD,EACF7yD,EAAQ4J,SAAC,IAAAipD,EAAAA,EAAIF,EAAW/oD,EAAIyD,EAAKzD,EAAI6f,GAAcniB,EAAOwjB,SAC5Dnb,IAAc,QAAXmjD,EAAE9yD,EAAQ2J,SAAC,IAAAmpD,EAAAA,EAAIH,EAAWhpD,EAAI0D,EAAK1D,EAAI8f,GAAcniB,EAAOyjB,YAGjEzjB,EAAOihB,oBAAoBoqC,EAAYxuD,EAAQA,GAE/CmD,EAAOgW,YACPhW,EAAOjB,IAAI,SAAS,GAExB,CAEU0sD,aAAAA,CACR/yD,EACA2xD,GAEA,MAAMrqD,OAAEA,GAAWtH,EAEnBsH,EAAOsG,cAAeX,IACpBA,EAAOq9B,QAAUhjC,GACf1J,KAAKo1D,aAAahzD,EAAS2xD,EAAc1kD,KAG7CjN,EAAQ0wD,SAASC,qBAAqB3wD,IACpCpC,KAAKo1D,aAAahzD,EAAS2xD,EAAcrqD,EAAOyY,SACpD,CAMUizC,YAAAA,CACRhzD,EAA4B0C,EAE5BuK,GACA,IAFA2N,OAAEA,GAAgClY,EAMlCuK,EAAO5G,IAAI,CACTqJ,KAAMzC,EAAOyC,KAAOkL,EAAOhR,EAC3B+F,IAAK1C,EAAO0C,IAAMiL,EAAOjR,GAE7B,CAEUmoD,aAAAA,CACR9xD,EACA2xD,GAEA,MAAMrqD,OACJA,EAAMopD,SACNA,EAAQc,QACRA,EACAf,aAAcx+C,KACXghD,GACDjzD,GACEe,OAAEA,GAAWuG,EAGnBA,EAAOqB,KAAK,eAAgB,CAC1B3I,UACAipC,OAAQ0oB,IAEV5wD,GACEA,EAAO4H,KAAK,sBAAuB,CACjC3I,UACAipC,OAAQ0oB,EACRrqD,WAIJ,MAAMkoC,EAASloC,EAAOkoC,OAClBgiB,SAAWhiB,GAAAA,EAAQijB,iBAEpBQ,EAAgBnzC,OAASmzC,EAAgBnzC,KAAO,KAAK9X,KAAKV,GAE3DkoC,EAAOijB,cAAcnB,cAAc,IAC9B2B,EACH3rD,OAAQkoC,KAGZloC,EAAOjB,IAAI,SAAS,EACtB,CAEApE,OAAAA,GACE,MAAMovD,eAAEA,GAAmBzzD,KAC3ByzD,EAAe1yD,QAASuJ,GAAcA,EAAUvJ,QAASyJ,GAAMA,MAC/DipD,EAAexyC,OACjB,CAEA9G,QAAAA,GACE,MAAO,CACLzR,KAAM6qD,GACNT,SAAW9yD,KAAK8yD,SAAShzD,YAAsC4I,KAEnE,CAEA0c,MAAAA,GACE,OAAOplB,KAAKma,UACd,EAGFlS,EAAcM,SAASirD,GAAeD,ICzTtC,MAAM+B,WAA0B9B,GAC9BE,aAAAA,GAAiB,EAoCZ,MAAM6B,WACHtmD,GACN2gC,KAwCF,kBAAOzwB,GACL,MAAO,IACF/e,MAAM+e,iBACNo2C,GAAMn2C,YAEb,CAQAtf,WAAAA,GAA6E,IAAjE0P,EAAuBlP,UAAAC,OAAA,QAAAC,IAAAF,UAAA,GAAAA,UAAA,GAAG,GAAI4B,EAA4B5B,UAAAC,OAAA,QAAAC,IAAAF,UAAA,GAAAA,UAAA,GAAG,CAAA,EACvEF,QA5BFL,wBAM2C,IAAEA,EAAAC,KAAA,gCAAA,GAAAD,EAAAC,KAAA,iCAAA,GAuB3CS,OAAOC,OAAOV,KAAMu1D,GAAMn2C,aAC1Bpf,KAAK8vC,WAAW5tC,GAChBlC,KAAKw1D,UAAUhmD,EAAStN,EAC1B,CAMUszD,SAAAA,CACRhmD,EACAtN,GAKA,IAAAuzD,EACAz1D,KAAKgP,SAAW,IAAIQ,GAEpBxP,KAAK01D,yBAA2B11D,KAAK21D,yBAAyB9uB,KAC5D7mC,MACA,GAEFA,KAAK41D,0BAA4B51D,KAAK21D,yBAAyB9uB,KAC7D7mC,MACA,GAGFA,KAAKgQ,cAAeX,IAClBrP,KAAK61D,WAAWxmD,GAAQ,KAI1BrP,KAAK60D,cAAqC,QAAxBY,EAAGvzD,EAAQ2yD,yBAAaY,EAAAA,EAAI,IAAIjC,GAClDxzD,KAAK60D,cAAcnB,cAAc,CAC/BhrD,KAAMmpD,GACNnoD,OAAQ1J,KACR00D,QAAS,IAAIllD,GAIbxD,EAAG9J,EAAQ4P,KACX/F,EAAG7J,EAAQ6P,KAEf,CAQA+jD,aAAAA,CAAczmD,GACZ,OAAIA,IAAWrP,MAAQA,KAAK42C,eAAevnC,IAEzC7N,EACE,QACA,4EAEK,QACExB,KAAKgP,SAAS/F,QAAQoG,KAE/B7N,EACE,QACA,qFAEK,EAGX,CAOUu0D,iCAAAA,CAAkCvmD,GAC1C,OAAOA,EAAQhG,OAAO,CAAC6F,EAAQrG,EAAOqC,IAE7BrL,KAAK81D,cAAczmD,IAAWhE,EAAMpC,QAAQoG,KAAYrG,EAEnE,CAMAiD,GAAAA,GAAgC,IAAA,IAAAvK,EAAApB,UAAAC,OAAzBiP,EAAO,IAAA5N,MAAAF,GAAAG,EAAA,EAAAA,EAAAH,EAAAG,IAAP2N,EAAO3N,GAAAvB,UAAAuB,GACZ,MAAMm0D,EAAiBh2D,KAAK+1D,kCAAkCvmD,GACxDC,EAAOrP,MAAM6L,OAAO+pD,GAE1B,OADAh2D,KAAKi2D,sBAAsBnE,GAAmBkE,GACvCvmD,CACT,CAOAC,QAAAA,CAAS1G,GAA2C,IAAA,IAAA2G,EAAArP,UAAAC,OAAzBiP,MAAO5N,MAAA+N,EAAA,EAAAA,OAAAC,EAAA,EAAAA,EAAAD,EAAAC,IAAPJ,EAAOI,EAAA,GAAAtP,UAAAsP,GAChC,MAAMomD,EAAiBh2D,KAAK+1D,kCAAkCvmD,GACxDC,EAAOrP,MAAMsP,SAAS1G,KAAUgtD,GAEtC,OADAh2D,KAAKi2D,sBAAsBnE,GAAmBkE,GACvCvmD,CACT,CAOA1G,MAAAA,GACE,MAAM8G,EAAUzP,MAAM2I,UAAOzI,WAE7B,OADAN,KAAKi2D,sBAAsBlE,GAAqBliD,GACzCA,CACT,CAEAT,cAAAA,CAAeC,GACbrP,KAAK61D,WAAWxmD,GAAQ,GACxBrP,KAAK+K,KAAK,eAAgB,CAAErB,OAAQ2F,IACpCA,EAAOtE,KAAK,QAAS,CAAErB,OAAQ1J,MACjC,CAOAsP,gBAAAA,CAAiBD,EAAsB6mD,GACrCl2D,KAAKm2D,UAAU9mD,EAAQ6mD,GACvBl2D,KAAK+K,KAAK,iBAAkB,CAAErB,OAAQ2F,IACtCA,EAAOtE,KAAK,UAAW,CAAErB,OAAQ1J,MACnC,CAOAi2D,qBAAAA,CAAsBvtD,EAA2BgsD,GAC/C10D,KAAK60D,cAAcnB,cAAc,CAC/BhrD,OACAgsD,UACAhrD,OAAQ1J,MAEZ,CAEAuP,oBAAAA,GACEvP,KAAK8S,KAAK,SAAS,EACrB,CAOAA,IAAAA,CAAKvR,EAAa+J,GAChB,MAAMwgD,EAAO9rD,KAAKuB,GAOlB,OANAnB,MAAM0S,KAAKvR,EAAK+J,GACJ,WAAR/J,GAAoBuqD,IAASxgD,IAC9BtL,KAAKgP,UAAY,IAAIjO,QAASsO,IAC7BA,EAAOyD,KAAKvR,EAAK+J,KAGdtL,IACT,CAKAo2D,sBAAAA,GACE,OAAOp2D,KAAKq2D,cACd,CAMAC,SAAAA,GAEE,OADAt2D,KAAKu2D,eAAiB,GACfv2D,KAAK+I,UAAU/I,KAAKgP,SAC7B,CAMA2mD,wBAAAA,CACEa,EAAW1xD,GAIX,IAFE4E,OAAQ2F,GACiDvK,EAE3D,MAAM2xD,EAAgBz2D,KAAKu2D,eAC3B,GAAIC,EACFC,EAAcrsD,KAAKiF,GACnBrP,KAAK8S,KAAK,SAAS,QACd,GAAI2jD,EAAcl2D,OAAS,EAAG,CACnC,MAAMyI,EAAQytD,EAAcxtD,QAAQoG,GAChCrG,GAAQ,IACVytD,EAAcvtD,OAAOF,EAAO,GAC5BhJ,KAAK8S,KAAK,SAAS,GAEvB,CACF,CAOA4jD,YAAAA,CAAaC,EAAgBtnD,GAE3BsnD,GAAS32D,KAAK02D,cAAa,EAAOrnD,GAC9BsnD,GACFtnD,EAAOxF,GAAG,WAAY7J,KAAK01D,0BAC3BrmD,EAAOxF,GAAG,aAAc7J,KAAK41D,6BAE7BvmD,EAAOlF,IAAI,WAAYnK,KAAK01D,0BAC5BrmD,EAAOlF,IAAI,aAAcnK,KAAK41D,2BAElC,CAOAC,UAAAA,CAAWxmD,EAAsB6mD,GAC/B7mD,EAAOq9B,OAASr9B,EAAOq9B,MAAM3jC,OAAOsG,GACpCA,EAAOyD,KAAK,SAAU9S,MACtBA,KAAK42D,YAAYvnD,EAAQ6mD,EAC3B,CAOAU,WAAAA,CAAYvnD,EAAsB6mD,GAC5BA,GAEF1rC,GACEnb,EACA2F,GACEH,GAAgB7U,KAAKi+B,uBACrB5uB,EAAO4uB,wBAIbj+B,KAAKo2D,0BAA4B/mD,EAAOqQ,YACxCrQ,EAAOyD,KAAK,QAAS9S,MACrBqP,EAAOyD,KAAK,SAAU9S,KAAKmD,QAC3BnD,KAAK02D,cAAa,EAAMrnD,GACxB,MAAMwnD,EACJ72D,KAAKmD,QACLnD,KAAKmD,OAAO03C,iBACZ76C,KAAKmD,OAAO03C,kBAGZgc,IACCA,IAAiBxnD,GAAUA,EAAOunC,eAAeigB,KAElD72D,KAAKu2D,eAAensD,KAAKiF,EAE7B,CAOA8mD,SAAAA,CAAU9mD,EAAsB6mD,GAC9Bl2D,KAAK82D,WAAWznD,EAAQ6mD,GACxB7mD,EAAOyD,KAAK,cAAUtS,GACtB6O,EAAOyD,KAAK,cAAUtS,EACxB,CAWAs2D,UAAAA,CAAWznD,EAAsB6mD,GAC/B7mD,EAAOyD,KAAK,aAAStS,GAChB01D,IACH1rC,GACEnb,EACA2F,GACEhV,KAAKi+B,sBACL5uB,EAAO4uB,wBAGX5uB,EAAOqQ,aAET1f,KAAK02D,cAAa,EAAOrnD,GACzB,MAAMrG,EACJhJ,KAAKu2D,eAAeh2D,OAAS,EAAIP,KAAKu2D,eAAettD,QAAQoG,IAAU,EACrErG,GAAQ,GACVhJ,KAAKu2D,eAAertD,OAAOF,EAAO,EAEtC,CASAyZ,WAAAA,GACE,MAAMs0C,EAAWnnB,GAAaiW,UAAUpjC,YAAY9X,KAAK3K,MACzD,GAAI+2D,EACF,IAAK,IAAI5rD,EAAI,EAAGA,EAAInL,KAAKgP,SAASzO,OAAQ4K,IACxC,GAAInL,KAAKgP,SAAS7D,GAAGynC,iBAEnB,OADA5yC,KAAK0yC,YAAa,GACX,EAIb,OAAOqkB,CACT,CAMAnkB,cAAAA,GACE,GAAIxyC,MAAMwyC,iBACR,OAAO,EAET,IAAK,IAAIznC,EAAI,EAAGA,EAAInL,KAAKgP,SAASzO,OAAQ4K,IACxC,GAAInL,KAAKgP,SAAS7D,GAAGynC,iBACnB,OAAO,EAGX,OAAO,CACT,CAMAD,UAAAA,GACE,OAAO3yC,KAAK0yC,cAAiB1yC,KAAK4xC,QAAU5xC,KAAK4xC,OAAOe,YAC1D,CAMAP,UAAAA,CACEz2B,EACAiH,EACAxgB,GAEApC,KAAKqiB,kBAAkB1G,GACvB,IAAK,IAAIxQ,EAAI,EAAGA,EAAInL,KAAKgP,SAASzO,OAAQ4K,IAAK,CAAA,IAAA2iC,EAC7C,MAAMh9B,EAAM9Q,KAAKgP,SAAS7D,WAEtB2iC,EAAA9tC,KAAKmD,cAAM,IAAA2qC,GAAXA,EAAakpB,wBAA0BlmD,EAAI47B,QAAU1sC,MACvD2b,EAAI2G,OACJ3G,EAAIhN,aAAakG,GAAgB7U,KAAKi+B,wBACtCntB,EAAI0S,OAAO7H,GACXA,EAAI6G,WACK1R,EAAI47B,QAAU1sC,MACvB8Q,EAAI0S,OAAO7H,EAEf,CACA3b,KAAKmzC,cAAcx3B,EAAK3b,KAAKmiB,SAAU/f,EACzC,CAMAsd,SAAAA,GACEtf,MAAMsf,YACN1f,KAAKo2D,0BACHp2D,KAAKgQ,cAAeX,GAAWA,EAAOqQ,YAC1C,CAEAu3C,aAAAA,GAAqD,IAAvC/0D,EAAgC5B,UAAAC,OAAA,QAAAC,IAAAF,UAAA,GAAAA,UAAA,GAAG,CAAA,EAC/CN,KAAK60D,cAAcnB,cAAc,CAC/BhqD,OAAQ1J,KACR0I,KAAMspD,MACH9vD,GAEP,CAMAshB,MAAAA,CAAO7H,GACL3b,KAAK0iB,gBAAiB,EACtBtiB,MAAMojB,OAAO7H,GACb3b,KAAK0iB,gBAAiB,CACxB,CASAw0C,kBAAAA,CACEC,EACAlyC,GAEA,MAAMmyC,EAAwBp3D,KAAKoe,qBACnC,OAAOpe,KAAKgP,SACTxF,OAAO,SAAUsH,GAChB,OAAQA,EAAIyU,iBACd,GACCjN,IAAI,SAAUxH,GACb,MAAMumD,EAAmBvmD,EAAIsN,qBAC7BtN,EAAIsN,qBAAuBg5C,EAC3B,MAAMxxC,EAAO9U,EAAIqmD,GAAU,YAAYlyC,GAGvC,OAFAnU,EAAIsN,qBAAuBi5C,EAEpBzxC,CACT,EACJ,CAOAzL,QAAAA,GAMoE,IAAlE8K,EAAwB3kB,UAAAC,OAAA,QAAAC,IAAAF,UAAA,GAAAA,UAAA,GAAG,GAC3B,MAAMu0D,EAAgB70D,KAAK60D,cAAc16C,WAEzC,MAAO,IACF/Z,MAAM+Z,SAAS,CAChB,iBACA,iBACG8K,OAE0B,gBAA3B4vC,EAAc/B,UAA8B9yD,KAAKoe,qBACjD,CAAEy2C,iBACF,GACJrlD,QAASxP,KAAKk3D,mBACZ,WACAjyC,GAGN,CAEApX,QAAAA,GACE,MAAO,aAAa7N,KAAK+Q,gBAC3B,CAEA1M,OAAAA,GACErE,KAAK60D,cAAcJ,mBAAmB,CACpCC,QAAS10D,KAAKkQ,aACdxG,OAAQ1J,OAEVA,KAAKu2D,eAAiB,GACtBv2D,KAAKgQ,cAAeX,IAClBrP,KAAK02D,cAAa,EAAOrnD,GACzBA,EAAOhL,YAETjE,MAAMiE,SACR,CAKAizD,gBAAAA,CAAiBn/C,GACf,IAAKnY,KAAKie,gBACR,MAAO,GAET,MAAMs5C,EAAapG,GAAKtL,UAAU3nB,OAAOvzB,KAAK3K,MACxCw3D,EAAUD,EAAWtuD,QAAQ,gBACnCsuD,EAAWC,GAAW,eACtB,MAAMtxC,EAASqxC,EAAWz9C,KAAK,IAC/B,OAAO3B,EAAUA,EAAQ+N,GAAUA,CACrC,CAOAgY,MAAAA,CAAO/lB,GACL,MAAMs/C,EAAY,CAAC,MAAO,eAAgB,QACpCC,EAAK13D,KAAKs3D,iBAAiBn/C,GACjCu/C,GAAMD,EAAUrtD,KAAK,OAAQstD,GAC7B,IAAK,IAAIvsD,EAAI,EAAGA,EAAInL,KAAKgP,SAASzO,OAAQ4K,IACxCssD,EAAUrtD,KAAK,OAAQpK,KAAKgP,SAAS7D,GAAG8a,MAAM9N,IAGhD,OADAs/C,EAAUrtD,KAAK,UACRqtD,CACT,CAMAx6B,YAAAA,GACE,MAAMF,OACsB,IAAjB/8B,KAAK+8B,SAA4C,IAAjB/8B,KAAK+8B,QACxC,YAAY/8B,KAAK+8B,WACjB,GACNW,EAAa19B,KAAKsS,QAAU,GAAK,uBACnC,MAAO,CAACyqB,EAAS/8B,KAAK29B,eAAgBD,GAAY5jB,KAAK,GACzD,CAOAkN,aAAAA,CAAc7O,GACZ,MAAMs/C,EAAY,GACZC,EAAK13D,KAAKs3D,iBAAiBn/C,GACjCu/C,GAAMD,EAAUrtD,KAAK,KAAMstD,GAC3B,IAAK,IAAIvsD,EAAI,EAAGA,EAAInL,KAAKgP,SAASzO,OAAQ4K,IACxCssD,EAAUrtD,KAAK,KAAMpK,KAAKgP,SAAS7D,GAAG6b,cAAc7O,IAEtD,OAAOnY,KAAKq+B,6BAA6Bo5B,EAAW,CAClDt/C,WAEJ,CAQA,iBAAOI,CAAUhO,EAEfotD,GACA,IAFAjvD,KAAEA,EAAI8G,QAAEA,EAAU,GAAEqlD,cAAEA,KAAkB3yD,GAAYqI,EAGpD,OAAO4J,QAAQkE,IAAI,CACjBH,GAA6B1I,EAASmoD,GACtC7+C,GAAwB5W,EAASy1D,KAChCn/C,KAAK1N,IAAgC,IAA9B0E,EAASooD,GAAgB9sD,EACjC,MAAM4hC,EAAQ,IAAI1sC,KAAKwP,EAAS,IAC3BtN,KACA01D,EACH/C,cAAe,IAAIS,KAErB,GAAIT,EAAe,CACjB,MAAMgD,EAAc5vD,EAAcI,SAChCwsD,EAAcnsD,MAEVovD,EAAgB7vD,EAAcI,SAClCwsD,EAAc/B,UAEhBpmB,EAAMmoB,cAAgB,IAAIgD,EAAY,IAAIC,EAC5C,MACEprB,EAAMmoB,cAAgB,IAAIrB,GAQ5B,OANA9mB,EAAMmoB,cAAcF,iBAAiB,CACnCjsD,KAAMmpD,GACNnoD,OAAQgjC,EACRgoB,QAAShoB,EAAMx8B,eAEjBw8B,EAAMhtB,YACCgtB,GAEX,EACD3sC,EAznBYw1D,GAAK,OAoCF,SAAOx1D,EApCVw1D,GAAK,cAZkD,CAClEn4B,YAAa,EACbi5B,gBAAgB,EAChB0B,aAAa,IAooBf9vD,EAAcM,SAASgtD,IClsBhB,MCAMyC,GAAiBA,CAAC5+C,EAAe6+C,IAC5CvzD,KAAK8I,IACHyqD,EAAYjmD,MAAQoH,EAAOpH,MAC3BimD,EAAYhmD,OAASmH,EAAOnH,QAWnBimD,GAAmBA,CAAC9+C,EAAe6+C,IAC9CvzD,KAAKC,IACHszD,EAAYjmD,MAAQoH,EAAOpH,MAC3BimD,EAAYhmD,OAASmH,EAAOnH,QCzB1BkmD,GAAW,aAQXzpD,GAAI,GAAGypD,MAAY12B,MAoBZ22B,GAAqB,GAAG1pD,KAAIA,KAAIA,KAAIypD,WAAiBA,WAAiBzpD,KAAIA,KCCjF2pD,GAA8C,CAClDl0C,EAAG,IACHm0C,EAAG,KAiBCC,GAAkBA,CACtBC,EACAC,EACAC,EACAC,EACAtH,EACAC,EACAsH,EACAC,EACAC,EACAC,EACAC,KAEA,MAAMC,EAASztD,GAAIgtD,GACjBU,EAASvtD,GAAI6sD,GACbW,EAAS3tD,GAAIitD,GACbW,EAASztD,GAAI8sD,GACbY,EAAMX,EAAQrH,EAAK8H,EAASR,EAAQrH,EAAK8H,EAASR,EAClDU,EAAMX,EAAQtH,EAAK8H,EAAST,EAAQpH,EAAK8H,EAASP,EAMpD,MAAO,CAAC,IALCE,EAAQD,IAAOJ,EAAQrH,EAAK6H,EAASP,EAAQrH,EAAK2H,GAClDD,EAAQF,IAAOH,EAAQtH,EAAK6H,EAASR,EAAQpH,EAAK2H,GAClDI,EAAMP,GAAMJ,EAAQrH,EAAK+H,EAAST,EAAQrH,EAAK6H,GAC/CG,EAAMR,GAAMH,EAAQtH,EAAK+H,EAASV,EAAQpH,EAAK6H,GAEnBE,EAAKC,IA8GtCC,GAAkBA,CACtBC,EACAC,EACAC,EACAC,KAEA,MAAMC,EAAKl1D,KAAK+Q,MAAMgkD,EAAID,GACxBK,EAAKn1D,KAAK+Q,MAAMkkD,EAAID,GACtB,OAAIG,GAAMD,EACDC,EAAKD,EAEL,EAAIl1D,KAAKqB,IAAM6zD,EAAKC,IAyBxB,SAASC,GACdC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,GAEA,IAAIC,EACJ,GAAIp6D,EAAOq6D,sBAETD,EAAa,IAAIj6D,WAAWwZ,OACxBlV,EAAM61D,mBAAmBF,IAC3B,OAAO31D,EAAM61D,mBAAmBF,GAIpC,MAAM70D,EAAOhB,KAAKgB,KAChBgG,EAAMhH,KAAKgH,IACXgvD,EAAU,GACVC,EAA2D,CACzD,CAAC,EAAG,GACJ,CAAC,EAAG,IAGR,IAAI1lD,EAAI,EAAI8kD,EAAO,GAAKE,EAAO,EAAIE,EAC/BrlD,GAAI,EAAKilD,EAAO,EAAIE,EAAO,EAAIE,EAAO,EAAIE,EAC1Ct2B,EAAI,EAAIk2B,EAAO,EAAIF,EAEvB,IAAK,IAAI5uD,EAAI,EAAGA,EAAI,IAAKA,EAAG,CAO1B,GANIA,EAAI,IACN8J,EAAI,EAAI+kD,EAAO,GAAKE,EAAO,EAAIE,EAC/BtlD,GAAI,EAAKklD,EAAO,EAAIE,EAAO,EAAIE,EAAO,EAAIE,EAC1Cv2B,EAAI,EAAIm2B,EAAO,EAAIF,GAGjBtuD,EAAIoJ,GAAK,MAAO,CAClB,GAAIpJ,EAAIuJ,GAAK,MACX,SAEF,MAAM1H,GAAKw2B,EAAI9uB,EACX,EAAI1H,GAAKA,EAAI,GACfmtD,EAAQtwD,KAAKmD,GAEf,QACF,CACA,MAAMqtD,EAAO3lD,EAAIA,EAAI,EAAI8uB,EAAIjvB,EAC7B,GAAI8lD,EAAO,EACT,SAEF,MAAMC,EAAWn1D,EAAKk1D,GAChBE,IAAO7lD,EAAI4lD,IAAa,EAAI/lD,GAC9B,EAAIgmD,GAAMA,EAAK,GACjBJ,EAAQtwD,KAAK0wD,GAEf,MAAMC,IAAO9lD,EAAI4lD,IAAa,EAAI/lD,GAC9B,EAAIimD,GAAMA,EAAK,GACjBL,EAAQtwD,KAAK2wD,EAEjB,CAEA,IAAI1jB,EAAIqjB,EAAQn6D,OAChB,MAAMy6D,EAAO3jB,EACP4jB,EAAWC,GACfnB,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,GAEF,KAAOjjB,KAAK,CACV,MAAMrrC,EAAEA,EAACD,EAAEA,GAAMkvD,EAASP,EAAQrjB,IAClCsjB,EAAO,GAAGtjB,GAAKrrC,EACf2uD,EAAO,GAAGtjB,GAAKtrC,CACjB,CAEA4uD,EAAO,GAAGK,GAAQjB,EAClBY,EAAO,GAAGK,GAAQhB,EAClBW,EAAO,GAAGK,EAAO,GAAKX,EACtBM,EAAO,GAAGK,EAAO,GAAKV,EACtB,MAAMjvB,EAAsB,CAC1B,IAAIv/B,GAAMpH,KAAK8I,OAAOmtD,EAAO,IAAKj2D,KAAK8I,OAAOmtD,EAAO,KACrD,IAAI7uD,GAAMpH,KAAKC,OAAOg2D,EAAO,IAAKj2D,KAAKC,OAAOg2D,EAAO,MAKvD,OAHIx6D,EAAOq6D,sBACT51D,EAAM61D,mBAAmBF,GAAelvB,GAEnCA,CACT,CAQO,MAAM8vB,GAAmBA,CAC9BC,EACAC,EAAUv2D,KAE6B,IADtCuP,EAAGg9C,EAAIC,EAAIgK,EAAKC,EAAOC,EAAOC,EAAIC,GAAsB52D,EAEzD,MAAM62D,EA7OcC,EACpBvC,EACAC,EACAjI,EACAC,EACAiK,EACAC,EACAK,KAEA,GAAW,IAAPxK,GAAmB,IAAPC,EACd,MAAO,GAET,IAAIyH,EAAQ,EACVC,EAAQ,EACR8C,EAAO,EACT,MAAM/1D,EAAKrB,KAAKqB,GACd82C,EAAQgf,EAAU31D,EAClB61D,EAAWpwD,GAAIkxC,GACf6b,EAAQltD,GAAIqxC,GACZmf,EAAK,KAAQtD,EAAQW,EAAM0C,EAAWzC,GACtC2C,EAAK,KAAQvD,EAAQY,EAAMyC,EAAW1C,GACtC6C,EAAM7K,GAAM,EACZ8K,EAAM7K,GAAM,EACZ8K,EAAMH,GAAM,EACZI,EAAML,GAAM,EACZM,EAAKJ,EAAMC,EAAMD,EAAME,EAAMD,EAAME,EACrC,IAAIE,EAAM73D,KAAKgH,IAAI2lD,GACfmL,EAAM93D,KAAKgH,IAAI4lD,GAEnB,GAAIgL,EAAK,EAAG,CACV,MAAMhkC,EAAI5zB,KAAKgB,KAAK,EAAI42D,GAAMJ,EAAMC,IACpCI,GAAOjkC,EACPkkC,GAAOlkC,CACT,MACEwjC,GACGP,IAAUC,GAAQ,EAAO,GAAO92D,KAAKgB,KAAK42D,GAAMJ,EAAME,EAAMD,EAAME,IAGvE,MAAMr6B,EAAM85B,EAAOS,EAAMN,EAAMO,EAC7Bv6B,GAAO65B,EAAOU,EAAMR,EAAMO,EAC1B3D,EAAMF,EAAQ12B,EAAK+5B,EAAW95B,EAAW,GAANo3B,EACnCR,EAAMkD,EAAW/5B,EAAK02B,EAAQz2B,EAAW,GAANq3B,EACrC,IAAImD,EAASlD,GAAgB,EAAG,GAAIyC,EAAKh6B,GAAMu6B,GAAMN,EAAKh6B,GAAMu6B,GAC5DE,EAASnD,IACVyC,EAAKh6B,GAAMu6B,GACXN,EAAKh6B,GAAMu6B,IACVR,EAAKh6B,GAAMu6B,IACXN,EAAKh6B,GAAMu6B,GAGD,IAAVhB,GAAekB,EAAS,EAC1BA,GAAU,EAAI32D,EACK,IAAVy1D,GAAekB,EAAS,IACjCA,GAAU,EAAI32D,GAIhB,MAAMmlD,EAAWxmD,KAAKosC,KAAKpsC,KAAKgH,IAAKgxD,EAAS32D,EAAM,IAClDslC,EAAS,GACTsxB,EAASD,EAASxR,EAClB4N,EACI,EAAI,EAAKp0D,KAAKiH,IAAIgxD,EAAS,GAAKj4D,KAAKiH,IAAIgxD,EAAS,GACpDj4D,KAAKiH,IAAIgxD,EAAS,GACtB,IAAIC,EAAMH,EAASE,EAEnB,IAAK,IAAIxxD,EAAI,EAAGA,EAAI+/C,EAAU//C,IAC5BkgC,EAAOlgC,GAAKotD,GACVkE,EACAG,EACAlE,EACAqD,EACAQ,EACAC,EACA5D,EACAC,EACAC,EACAC,EACAC,GAEFD,EAAQ1tB,EAAOlgC,GAAG,GAClB6tD,EAAQ3tB,EAAOlgC,GAAG,GAClBsxD,EAASG,EACTA,GAAOD,EAET,OAAOtxB,GAyJUuwB,CAAcH,EAAKL,EAAIM,EAAKL,EAAIhK,EAAIC,EAAIiK,EAAOC,EAAOF,GAEvE,IAAK,IAAInwD,EAAI,EAAGoY,EAAMo4C,EAASp7D,OAAQ4K,EAAIoY,EAAKpY,IAC9CwwD,EAASxwD,GAAG,IAAMiwD,EAClBO,EAASxwD,GAAG,IAAMkwD,EAClBM,EAASxwD,GAAG,IAAMiwD,EAClBO,EAASxwD,GAAG,IAAMkwD,EAClBM,EAASxwD,GAAG,IAAMiwD,EAClBO,EAASxwD,GAAG,IAAMkwD,EAEpB,OAAOM,GAcIkB,GAAmB36C,IAI9B,IAAIlW,EAAI,EACND,EAAI,EAIF+wD,EAAK,EACPC,EAAK,EAGP,MAAMC,EAAmC,GACzC,IAAIC,EAEFC,EAAW,EACXC,EAAW,EACb,IAAK,MAAMC,KAAiBl7C,EAAM,CAChC,MAAMjR,EAAiC,IAAImsD,GAC3C,IAAIC,EACJ,OACEpsD,EAAQ,IAER,IAAK,IACHA,EAAQ,IAAMjF,EACdiF,EAAQ,IAAMlF,EAEhB,IAAK,IACHC,EAAIiF,EAAQ,GACZlF,EAAIkF,EAAQ,GACZosD,EAAY,CAAC,IAAKrxD,EAAGD,GACrB,MACF,IAAK,IACHkF,EAAQ,IAAMjF,EAEhB,IAAK,IACHA,EAAIiF,EAAQ,GACZosD,EAAY,CAAC,IAAKrxD,EAAGD,GACrB,MACF,IAAK,IACHkF,EAAQ,IAAMlF,EAEhB,IAAK,IACHA,EAAIkF,EAAQ,GACZosD,EAAY,CAAC,IAAKrxD,EAAGD,GACrB,MACF,IAAK,IACHkF,EAAQ,IAAMjF,EACdiF,EAAQ,IAAMlF,EAEhB,IAAK,IACHC,EAAIiF,EAAQ,GACZlF,EAAIkF,EAAQ,GACZ6rD,EAAK7rD,EAAQ,GACb8rD,EAAK9rD,EAAQ,GACbosD,EAAY,CAAC,IAAKrxD,EAAGD,GACrB,MACF,IAAK,IACHkF,EAAQ,IAAMjF,EACdiF,EAAQ,IAAMlF,EACdkF,EAAQ,IAAMjF,EACdiF,EAAQ,IAAMlF,EACdkF,EAAQ,IAAMjF,EACdiF,EAAQ,IAAMlF,EAEhB,IAAK,IACHmxD,EAAWjsD,EAAQ,GACnBksD,EAAWlsD,EAAQ,GACnBjF,EAAIiF,EAAQ,GACZlF,EAAIkF,EAAQ,GACZosD,EAAY,CAAC,IAAKpsD,EAAQ,GAAIA,EAAQ,GAAIisD,EAAUC,EAAUnxD,EAAGD,GACjE,MACF,IAAK,IACHkF,EAAQ,IAAMjF,EACdiF,EAAQ,IAAMlF,EACdkF,EAAQ,IAAMjF,EACdiF,EAAQ,IAAMlF,EAEhB,IAAK,IAEc,MAAbkxD,GAEFC,EAAW,EAAIlxD,EAAIkxD,EACnBC,EAAW,EAAIpxD,EAAIoxD,IAInBD,EAAWlxD,EACXmxD,EAAWpxD,GAEbC,EAAIiF,EAAQ,GACZlF,EAAIkF,EAAQ,GACZosD,EAAY,CAAC,IAAKH,EAAUC,EAAUlsD,EAAQ,GAAIA,EAAQ,GAAIjF,EAAGD,GAGjEmxD,EAAWG,EAAU,GACrBF,EAAWE,EAAU,GACrB,MACF,IAAK,IACHpsD,EAAQ,IAAMjF,EACdiF,EAAQ,IAAMlF,EACdkF,EAAQ,IAAMjF,EACdiF,EAAQ,IAAMlF,EAEhB,IAAK,IACHmxD,EAAWjsD,EAAQ,GACnBksD,EAAWlsD,EAAQ,GACnBjF,EAAIiF,EAAQ,GACZlF,EAAIkF,EAAQ,GACZosD,EAAY,CAAC,IAAKH,EAAUC,EAAUnxD,EAAGD,GACzC,MACF,IAAK,IACHkF,EAAQ,IAAMjF,EACdiF,EAAQ,IAAMlF,EAEhB,IAAK,IACc,MAAbkxD,GAEFC,EAAW,EAAIlxD,EAAIkxD,EACnBC,EAAW,EAAIpxD,EAAIoxD,IAInBD,EAAWlxD,EACXmxD,EAAWpxD,GAEbC,EAAIiF,EAAQ,GACZlF,EAAIkF,EAAQ,GACZosD,EAAY,CAAC,IAAKH,EAAUC,EAAUnxD,EAAGD,GACzC,MACF,IAAK,IACHkF,EAAQ,IAAMjF,EACdiF,EAAQ,IAAMlF,EAEhB,IAAK,IACHovD,GAAiBnvD,EAAGD,EAAGkF,GAASlQ,QAASkU,GAAM+nD,EAAgB5yD,KAAK6K,IACpEjJ,EAAIiF,EAAQ,GACZlF,EAAIkF,EAAQ,GACZ,MACF,IAAK,IACL,IAAK,IACHjF,EAAI8wD,EACJ/wD,EAAIgxD,EACJM,EAAY,CAAC,KAIbA,GACFL,EAAgB5yD,KAAKizD,GACrBJ,EAAWI,EAAU,IAErBJ,EAAW,EAEf,CACA,OAAOD,GAYHM,GAAiBA,CACrBR,EACAC,EACAQ,EACAC,IACW94D,KAAKgB,MAAM63D,EAAKT,IAAO,GAAKU,EAAKT,IAAO,GAa/C7B,GACJA,CACEnB,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,IAEDmD,IACC,MAAMC,EAASD,GA1Va,EA2V1BE,EA1VOpwD,IAAc,EAAIA,GAAK,GAAK,EAAIA,GA0VlCqwD,CAAIH,GACTI,EA1VOtwD,IAAc,EAAIA,GAAK,EAAIA,IAAM,EA0VnCuwD,CAAIL,GACTM,EA1VOxwD,KAAe,EAAIA,IAAM,EA0V3BywD,CAAIP,GACX,OAAO,IAAI3xD,GACTuuD,EAAOqD,EAAKvD,EAAOwD,EAAK1D,EAAO4D,EAAK9D,EAAOgE,EAC3CzD,EAAOoD,EAAKtD,EAAOuD,EAAKzD,EAAO2D,EAAK7D,EAAO+D,IAI3CE,GAAO1wD,GAAcA,GAAK,EAC1B2wD,GAAO3wD,GAAc,EAAIA,GAAK,EAAIA,GAClC4wD,GAAO5wD,IAAe,EAAIA,IAAM,EAEhC6wD,GACJA,CACEC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,IAEDnB,IACC,MAAMoB,EAAMZ,GAAIR,GACdqB,EAAMZ,GAAIT,GACVsB,EAAMZ,GAAIV,GACVuB,EACE,GAAKD,GAAOR,EAAMF,GAAOS,GAAOL,EAAMF,GAAOM,GAAOF,EAAMF,IAC5DQ,EACE,GAAKF,GAAOP,EAAMF,GAAOQ,GAAOJ,EAAMF,GAAOK,GAAOD,EAAMF,IAC9D,OAAOh6D,KAAK+Q,MAAMwpD,EAAUD,IAG1BE,GACJA,CACEb,EACAC,EACAC,EACAC,EACAC,EACAC,IAEDjB,IACC,MAAMC,EAAKO,GAAIR,GACbE,EAAKO,GAAIT,GACTI,EAAKM,GAAIV,GACX,OAAO,IAAI3xD,GACT2yD,EAAMf,EAAKa,EAAMZ,EAAKU,EAAMR,EAC5Ba,EAAMhB,EAAKc,EAAMb,EAAKW,EAAMT,IAI5BsB,GACJA,CACEd,EACAC,EACAC,EACAC,EACAC,EACAC,IAEDjB,IACC,MAAM2B,EAAO,EAAI3B,EACfuB,EAAW,GAAKI,GAAQb,EAAMF,GAAOZ,GAAOgB,EAAMF,IAClDU,EAAW,GAAKG,GAAQZ,EAAMF,GAAOb,GAAOiB,EAAMF,IACpD,OAAO95D,KAAK+Q,MAAMwpD,EAAUD,IAK1BK,GAAeA,CACnBpE,EACA6B,EACAC,KAEA,IAAIuC,EAAQ,IAAIxzD,GAAMgxD,EAAIC,GACxBwC,EAAS,EACX,IAAK,IAAIC,EAAO,EAAGA,GAAQ,IAAKA,GAAQ,EAAG,CACzC,MAAM9wD,EAAIusD,EAASuE,EAAO,KAC1BD,GAAUjC,GAAegC,EAAMtzD,EAAGszD,EAAMvzD,EAAG2C,EAAE1C,EAAG0C,EAAE3C,GAClDuzD,EAAQ5wD,CACV,CACA,OAAO6wD,GAWHE,GAA4BA,CAChCC,EACAphB,KAEA,IAIEqhB,EAJEH,EAAO,EACTD,EAAS,EACTD,EAAY,CAAEtzD,EAAG0zD,EAAQ1zD,EAAGD,EAAG2zD,EAAQ3zD,GACvC2C,EAAQ,IAAK4wD,GAEbM,EAAW,IACXC,EAAW,EAGb,MAAM5E,EAAWyE,EAAQzE,SACvB6E,EAAcJ,EAAQI,YACxB,KAAOP,EAASjhB,GAAYshB,EAAW,MACrClxD,EAAIusD,EAASuE,GACbK,EAAWL,EACXG,EAAUrC,GAAegC,EAAMtzD,EAAGszD,EAAMvzD,EAAG2C,EAAE1C,EAAG0C,EAAE3C,GAE9C4zD,EAAUJ,EAASjhB,GAErBkhB,GAAQI,EACRA,GAAY,IAEZN,EAAQ5wD,EACR8wD,GAAQI,EACRL,GAAUI,GAGd,MAAO,IAAKjxD,EAAGjD,MAAOq0D,EAAYD,KAQvBE,GACX79C,IAEA,IAOE+4C,EACA+E,EAREC,EAAc,EAGhBnD,EAAK,EACLC,EAAK,EACLQ,EAAK,EACLC,EAAK,EAGP,MAAM0C,EAA2B,GACjC,IAAK,MAAMjvD,KAAWiR,EAAM,CAC1B,MAAMi+C,EAAmE,CACvEn0D,EAAG8wD,EACH/wD,EAAGgxD,EACHqD,QAASnvD,EAAQ,GACjB1Q,OAAQ,GAEV,OACE0Q,EAAQ,IAER,IAAK,IACH+uD,EAAwCG,EACxCH,EAASh0D,EAAIuxD,EAAKT,EAAK7rD,EAAQ,GAC/B+uD,EAASj0D,EAAIyxD,EAAKT,EAAK9rD,EAAQ,GAC/B,MACF,IAAK,IACH+uD,EAAwCG,EACxCH,EAASz/D,OAAS+8D,GAAeR,EAAIC,EAAI9rD,EAAQ,GAAIA,EAAQ,IAC7D6rD,EAAK7rD,EAAQ,GACb8rD,EAAK9rD,EAAQ,GACb,MACF,IAAK,IACHgqD,EAAWC,GACT4B,EACAC,EACA9rD,EAAQ,GACRA,EAAQ,GACRA,EAAQ,GACRA,EAAQ,GACRA,EAAQ,GACRA,EAAQ,IAEV+uD,EAA4BG,EAC5BH,EAAS/E,SAAWA,EACpB+E,EAASF,YAAc1B,GACrBtB,EACAC,EACA9rD,EAAQ,GACRA,EAAQ,GACRA,EAAQ,GACRA,EAAQ,GACRA,EAAQ,GACRA,EAAQ,IAEV+uD,EAASz/D,OAAS8+D,GAAapE,EAAU6B,EAAIC,GAE7CD,EAAK7rD,EAAQ,GACb8rD,EAAK9rD,EAAQ,GACb,MACF,IAAK,IACHgqD,EAAWiE,GACTpC,EACAC,EACA9rD,EAAQ,GACRA,EAAQ,GACRA,EAAQ,GACRA,EAAQ,IAEV+uD,EAA4BG,EAC5BH,EAAS/E,SAAWA,EACpB+E,EAASF,YAAcX,GACrBrC,EACAC,EACA9rD,EAAQ,GACRA,EAAQ,GACRA,EAAQ,GACRA,EAAQ,IAEV+uD,EAASz/D,OAAS8+D,GAAapE,EAAU6B,EAAIC,GAC7CD,EAAK7rD,EAAQ,GACb8rD,EAAK9rD,EAAQ,GACb,MACF,IAAK,IAEH+uD,EAAyBG,EACzBH,EAASK,MAAQ9C,EACjByC,EAASM,MAAQ9C,EACjBwC,EAASz/D,OAAS+8D,GAAeR,EAAIC,EAAIQ,EAAIC,GAC7CV,EAAKS,EACLR,EAAKS,EAGTyC,GAAeD,EAASz/D,OACxB2/D,EAAK91D,KAAK41D,EACZ,CAEA,OADAE,EAAK91D,KAAK,CAAE7J,OAAQ0/D,EAAaj0D,EAAG8wD,EAAI/wD,EAAGgxD,IACpCmD,GASIK,GAAiB,SAC5Br+C,EACAo8B,GAE4B,IAD5BkiB,EAAyBlgE,UAAAC,OAAA,QAAAC,IAAAF,UAAA,GAAAA,UAAA,GAAGy/D,GAAoB79C,GAE5C/W,EAAI,EACR,KAAOmzC,EAAWkiB,EAAMr1D,GAAG5K,OAAS,GAAK4K,EAAIq1D,EAAMjgE,OAAS,GAC1D+9C,GAAYkiB,EAAMr1D,GAAG5K,OACrB4K,IAEF,MAAMu0D,EAAUc,EAAMr1D,GACpBs1D,EAAaniB,EAAWohB,EAAQn/D,OAChC4qD,EAAUjpC,EAAK/W,GAEjB,OAAQu0D,EAAQU,SACd,IAAK,IACH,MAAO,CAAEp0D,EAAG0zD,EAAQ1zD,EAAGD,EAAG2zD,EAAQ3zD,EAAGN,MAAO,GAC9C,IAAK,IACH,MAAO,IACF,IAAIK,GAAM4zD,EAAQ1zD,EAAG0zD,EAAQ3zD,GAAGuB,KACjC,IAAIxB,GAAM4zD,EAAQW,MAAOX,EAAQY,OACjCG,GAEFh1D,MAAO/G,KAAK+Q,MAAMiqD,EAAQY,MAAQZ,EAAQ3zD,EAAG2zD,EAAQW,MAAQX,EAAQ1zD,IAEzE,IAAK,IACH,MAAO,IACF,IAAIF,GAAM4zD,EAAQ1zD,EAAG0zD,EAAQ3zD,GAAGuB,KACjC,IAAIxB,GAAMq/C,EAAQ,GAAKA,EAAQ,IAC/BsV,GAEFh1D,MAAO/G,KAAK+Q,MAAM01C,EAAQ,GAAMuU,EAAQ3zD,EAAGo/C,EAAQ,GAAMuU,EAAQ1zD,IAErE,IAAK,IAEL,IAAK,IACH,OAAOyzD,GAA0BC,EAASphB,GAIhD,EAEMoiB,GAAe,IAAIrhC,ODlxBI,6BCkxBkB,MACzCshC,GAAyB,IAAIthC,OAAO+4B,GAAoB,KACxDwI,GAAU,IAAIvhC,OAAOoC,GAAO,MAC5Bo/B,GAAiB,CACrB18C,EAAG,EACHoU,EAAG,EACHF,EAAG,EACHpW,EAAG,EACH8hB,EAAG,EACHzL,EAAG,EACHN,EAAG,EACHzqB,EAAG,EACHuH,EAAG,GAaQgsD,GAAaC,IAAyC,IAAAC,EACjE,MAAMC,EAA0B,GAC1B5oD,EAAoC,QAAjC2oD,EAAGD,EAAW/lC,MAAM0lC,WAAa,IAAAM,EAAAA,EAAI,GAC9C,IAAK,MAAME,KAAY7oD,EAAK,CAE1B,MAAM8oD,EAAgBD,EAAS,GAE/B,GAAsB,MAAlBC,GAA2C,MAAlBA,EAAuB,CAClDF,EAAM72D,KAAK,CAAC+2D,IACZ,QACF,CACA,MAAMC,EACJP,GACEM,EAAcl8D,eAGlB,IAAIo8D,EAAW,GACf,GAAsB,MAAlBF,GAA2C,MAAlBA,EAAuB,CAKlDR,GAAuBW,UAAY,EACnC,IAAK,IAAIC,EAAM,KAAOA,EAAMZ,GAAuB5kC,KAAKmlC,IACtDG,EAASj3D,QAAQm3D,EAAIxnC,MAAM,GAE/B,MACEsnC,EAAWH,EAASlmC,MAAM4lC,KAAY,GAKxC,IAAK,IAAIz1D,EAAI,EAAGA,EAAIk2D,EAAS9gE,OAAQ4K,GAAKi2D,EAAe,CACvD,MAAMI,EAAa,IAAI5/D,MAAMw/D,GACvBK,EAAqBpJ,GAAiB8I,GAC5CK,EAAW,GACTr2D,EAAI,GAAKs2D,EAAqBA,EAAqBN,EACrD,IAAK,IAAI9pB,EAAI,EAAGA,EAAI+pB,EAAe/pB,IACjCmqB,EAAWnqB,EAAI,GAAK39B,WAAW2nD,EAASl2D,EAAIksC,IAE9C4pB,EAAM72D,KAAKo3D,EACb,CACF,CACA,OAAOP,GAUIS,GAA0B,SACrCp3C,GAEoB,IADpB0qC,EAAU10D,UAAAC,OAAA,QAAAC,IAAAF,UAAA,GAAAA,UAAA,GAAG,EAETqhE,EAAK,IAAI71D,GAAMwe,EAAO,IACxBs3C,EAAK,IAAI91D,GAAMwe,EAAO,IACtBu3C,EAAY,EACZC,EAAY,EACd,MAAM5/C,EAAwB,GAC5BqB,EAAM+G,EAAO/pB,OACbwhE,EAAax+C,EAAM,EAWrB,IAAIpY,EACJ,IAVI42D,IACFF,EAAYv3C,EAAO,GAAGte,EAAI41D,EAAG51D,GAAI,EAAKse,EAAO,GAAGte,IAAM41D,EAAG51D,EAAI,EAAI,EACjE81D,EAAYx3C,EAAO,GAAGve,EAAI61D,EAAG71D,GAAI,EAAKue,EAAO,GAAGve,IAAM61D,EAAG71D,EAAI,EAAI,GAEnEmW,EAAK9X,KAAK,CACR,IACAu3D,EAAG31D,EAAI61D,EAAY7M,EACnB2M,EAAG51D,EAAI+1D,EAAY9M,IAGhB7pD,EAAI,EAAGA,EAAIoY,EAAKpY,IAAK,CACxB,IAAKw2D,EAAG10D,GAAG20D,GAAK,CACd,MAAMI,EAAWL,EAAG/zD,aAAag0D,GAIjC1/C,EAAK9X,KAAK,CAAC,IAAKu3D,EAAG31D,EAAG21D,EAAG51D,EAAGi2D,EAASh2D,EAAGg2D,EAASj2D,GACnD,CACA41D,EAAKr3C,EAAOnf,GACRA,EAAI,EAAImf,EAAO/pB,SACjBqhE,EAAKt3C,EAAOnf,EAAI,GAEpB,CAUA,OATI42D,IACFF,EAAYF,EAAG31D,EAAIse,EAAOnf,EAAI,GAAGa,EAAI,EAAI21D,EAAG31D,IAAMse,EAAOnf,EAAI,GAAGa,EAAI,GAAI,EACxE81D,EAAYH,EAAG51D,EAAIue,EAAOnf,EAAI,GAAGY,EAAI,EAAI41D,EAAG51D,IAAMue,EAAOnf,EAAI,GAAGY,EAAI,GAAI,GAE1EmW,EAAK9X,KAAK,CACR,IACAu3D,EAAG31D,EAAI61D,EAAY7M,EACnB2M,EAAG51D,EAAI+1D,EAAY9M,IAEd9yC,CACT,EA6Ea+/C,GAAWA,CAACC,EAA2BzoD,IAClDyoD,EACG5pD,IAAK6yC,GACGA,EACJ7yC,IAAI,CAACk3C,EAAKrkD,IACC,IAANA,QACsB3K,IAAnBiZ,EADa+1C,EAGhBj2C,GAAQi2C,EAAK/1C,IAElBK,KAAK,MAETA,KAAK,KC7gCGqoD,GAAeA,CAAC30D,EAAa7I,IACxCD,KAAKiB,MAAMjB,KAAK09D,UAAYz9D,EAAM6I,EAAM,IAAMA,ECgCnC60D,GAAqCA,CAChDhzD,EACAizD,KAEA,IAAIv9C,EAAS1V,EAAOqmC,yBAChBrmC,EAAOwgD,kBA3BXxgD,KAEA,GAAIA,EAAOwgD,gBAAiB,CAC1B,MAAMh6C,OAAEA,EAAMC,OAAEA,EAAMrK,MAAEA,EAAKsK,MAAEA,GAAUL,GACvCrG,EAAOwgD,iBAETxgD,EAAO0H,OAAQ,EACf1H,EAAO2H,OAAQ,EACf3H,EAAO5G,IAAIjB,EAASqO,GACpBxG,EAAO5G,IAAIhB,EAASqO,GACpBzG,EAAO5D,MAAQA,EACf4D,EAAO0G,MAAQA,EACf1G,EAAO2G,MAAQ,CACjB,GAeEusD,CAA4BlzD,GAC5B0V,EAASA,EAAOpW,UAAUU,EAAOwgD,yBAE5BxgD,EAAOwgD,gBACVyS,IACFjzD,EAAOwG,QAAUysD,EAA2BzsD,OAC5CxG,EAAOyG,QAAUwsD,EAA2BxsD,OAC3CzG,EAAuBmzD,MAAQF,EAA2BE,MAC1DnzD,EAAuBozD,MAAQH,EAA2BG,MAC3D19C,EAAO/Y,GAAKs2D,EAA2BI,WACvC39C,EAAOhZ,GAAKu2D,EAA2BK,UACvCtzD,EAAO2C,MAAQswD,EAA2BtwD,MAC1C3C,EAAO4C,OAASqwD,EAA2BrwD,QAE7C5C,EAAOsb,oBAAoB5F,EAAQxe,EAAQA,0R5F/B3CpD,IACsB,IAAAy/D,EACtB,MAAM/uD,EAAYD,GAAuBzQ,GAEzC,OAD0B,QAA1By/D,EAAA/uD,EAAUzQ,WAAW,iBAAKw/D,GAA1BA,EAA4Bz/C,UAAUhgB,EAAQ,EAAG,GAC1C0Q,oc0F48B4BgvD,CACnCC,EACAC,KAEA,MAAMC,EAA2B,EAAVt+D,KAAKqB,GAAU+8D,EAGtC,IAAIG,GAAsBn9D,EACtBg9D,EAAc,GAAM,IACtBG,GAAsBD,EAAgB,GAExC,MAAMx4D,EAAI,IAAI5I,MAAMkhE,EAAc,GAClC,IAAK,IAAI33D,EAAI,EAAGA,EAAI23D,EAAa33D,IAAK,CACpC,MAAM+3D,EAAM/3D,EAAI63D,EAAgBC,GAC1Bj3D,EAAEA,EAACD,EAAEA,GAAM,IAAID,GAAMN,GAAI03D,GAAMv3D,GAAIu3D,IAAMt2D,eAAem2D,GAC9Dv4D,EAAEW,GAAK,CAAO,IAANA,EAAU,IAAM,IAAKa,EAAGD,EAClC,CAEA,OADAvB,EAAEs4D,GAAe,CAAC,KACXt4D,+ChEn/BwB9B,IAC/B,MAAMy6D,EAAmB,CAAC,sBAAuB,QAAS,KAAM,SAChE,OAAQz6D,GACN,IAAK,iBACH,OAAOy6D,EAAiBj4D,OAAO,CAC7B,KACA,KACA,KACA,KACA,gBACA,sBAEJ,IAAK,iBACH,OAAOi4D,EAAiBj4D,OAAO,CAC7B,gBACA,oBACA,KACA,KACA,IACA,KACA,KACA,OAEJ,IAAK,OACH,OAAOi4D,EAAiBj4D,OAAO,CAAC,SAAU,aAAc,iBAE5D,OAAOi4D,qC6D3BuBC,CAC9BpkD,EACA9c,IAEI8c,GAAgC,IAApBA,EAASze,OAChBye,EAAS,GAEX,IAAIu2C,GAAMv2C,EAAU9c,sOMICmhE,CAAC3F,EAAkBC,KAAqB,IAAA2F,EACpE,IAAIxuD,EAAI4oD,EACNzoD,EAAI0oD,EACF7oD,EAAE4uB,WAAazuB,EAAEyuB,WAEnB5uB,EAAI6oD,EACJ1oD,EAAIyoD,GAGNnyC,GAAkBtW,EAAU,QAATquD,EAAEruD,EAAEy3B,aAAK,IAAA42B,OAAA,EAAPA,EAASrlC,sBAAuBnpB,EAAEmpB,uBAEvD,MAAMyF,EAAW5uB,EAAE4uB,UAAYzuB,EAAEyuB,SAKjC,OAJIA,IAEF5uB,EAAE4uB,SAAWzuB,EAAEyuB,UAAW,GAErB,IAAI6xB,GAAM,CAACzgD,GAAI,CAAEqN,SAAUlN,EAAGyuB,2P9EfE6/B,CACvCl0D,EACAV,KAEA,MAAM+0B,EAAW7uB,GAAgBlG,GAC/B60D,EAAiBxuD,GACf0uB,EACAr0B,EAAOob,iBAEXD,GAAuBnb,EAAQm0D,sT2Es6BJC,CAC3BvhD,EACAvT,EACA+0D,KAEIA,IACF/0D,EAAYqG,GAA0BrG,EAAW,CAC/C,EACA,EACA,EACA,GACC+0D,EAAW13D,GACX03D,EAAW33D,KAGTmW,EAAK5J,IAAKqrD,IACf,MAAMC,EAAmC,IAAID,GAC7C,IAAK,IAAIx4D,EAAI,EAAGA,EAAIw4D,EAAYpjE,OAAS,EAAG4K,GAAK,EAAG,CAElD,MAAMa,EAAEA,EAACD,EAAEA,GAAM6I,GACf,CACE5I,EAAG23D,EAAYx4D,GACfY,EAAG43D,EAAYx4D,EAAI,IAErBwD,GAEFi1D,EAAWz4D,GAAKa,EAChB43D,EAAWz4D,EAAI,GAAKY,CACtB,CACA,OAAO63D,yBI39BJ,SAASC,GAASpwD,EAAsB4T,GAC7C,MAAMy8C,EAAerwD,EAAQ0H,MACxB2oD,GAGLrjE,OAAOwJ,QAAQod,GAAQtmB,QAAQ+D,IAAA,IAAEkO,EAAU1H,GAAMxG,EAAA,OAC/Cg/D,EAAaC,YAAY/wD,EAAU1H,IAEvC,CCJO,MAAM04D,WAAyB7nD,GAIpCrc,WAAAA,CACEgK,GAWA,IAVA6U,oBACEA,GAAsB,EAAKslD,eAC3BA,EAAiB,IAOlB3jE,UAAAC,OAAA,QAAAC,IAAAF,UAAA,GAAAA,UAAA,GAAG,CAAA,EAEJF,MAAM0J,GAAM/J,EAAAC,KAAA,aAAA,GAAAD,EAAAC,KAAA,iBAAA,GACZ,MAAQqb,GAAIyD,GAAkB9e,KAAKqc,MAC7B6nD,EAAgBlkE,KAAKmkE,oBAC3BnkE,KAAKokE,MAAQ,CAAE/oD,GAAI6oD,EAAevoD,IAAKuoD,EAAc9gE,WAAW,OAChEpD,KAAKqkE,iBAAiBvlD,EAAe,CACnCH,wBAEF3e,KAAKqkE,iBAAiBH,EAAe,CACnCvlD,sBACA0I,OAAQ,CACNjM,SAAU,WACVtJ,KAAM,IACNC,IAAK,OAGT,MAAMuyD,EAAYtkE,KAAKukE,yBACvBD,EAAU5nD,UAAUzQ,IAAIg4D,GACpBnlD,EAAc9D,YAChB8D,EAAc9D,WAAWwpD,aAAaF,EAAWxlD,GAEnDwlD,EAAUr7B,OAAOnqB,EAAeolD,GAChClkE,KAAKskE,UAAYA,CACnB,CAEUH,iBAAAA,GACR,MAAQ9oD,GAAIyD,GAAkB9e,KAAKqc,MAC7BhB,EAAK7H,KAUX,OARA6H,EAAGopD,UAAY3lD,EAAc2lD,UAE7BppD,EAAGqB,UAAU3T,OAAO,gBAEpBsS,EAAGqB,UAAUzQ,IAAI,gBACjBoP,EAAGQ,aAAa,cAAe,OAC/BR,EAAGF,MAAMsB,QAAUqC,EAAc3D,MAAMsB,QACvCpB,EAAGQ,aAAa,YAAa,QACtBR,CACT,CAEUkpD,sBAAAA,GACR,MAAMD,EAAYhgE,IAAoBoP,cAAc,OAMpD,OALA4wD,EAAUzoD,aAAa,cAAe,WACtCgoD,GAASS,EAAW,CAClBlpD,SAAU,aAEZY,GAAwBsoD,GACjBA,CACT,CAMUD,gBAAAA,CACR5wD,EACAvR,GAKA,MAAMmlB,OAAEA,EAAM1I,oBAAEA,GAAwBzc,EACxC2hE,GAASpwD,EAAS,IACb4T,EACH,eAAgB1I,EAAsB,eAAiB/X,IAEzDoV,GAAwBvI,EAC1B,CAEAoJ,aAAAA,CAAcpN,EAAamM,GACzBxb,MAAMyc,cAAcpN,EAAMmM,GAC1B,MAAMP,GAAEA,EAAEM,IAAEA,GAAQ3b,KAAKokE,MACzB1oD,GAAoBL,EAAIM,EAAKlM,EAAMmM,EACrC,CAEAG,gBAAAA,CAAiBtM,GACfrP,MAAM2b,iBAAiBtM,GACvBsM,GAAiB/b,KAAKokE,MAAM/oD,GAAI5L,GAChCsM,GAAiB/b,KAAKskE,UAAW70D,EACnC,CAEAkN,UAAAA,CAAWlN,GACT,MAAM60D,EAAYtkE,KAAKskE,WACnBjpD,GAAIyD,GAAkB9e,KAAKqc,OAC3BhB,GAAI6oD,GAAkBlkE,KAAKokE,MAC/BhkE,MAAMuc,WAAWlN,GACjB60D,EAAUI,YAAYR,GACtBI,EAAUI,YAAY5lD,GAClBwlD,EAAUtpD,YACZspD,EAAUtpD,WAAWwpD,aAAa1lD,EAAewlD,EAErD,CAEAjgE,OAAAA,GACEjE,MAAMiE,UACNL,IAASK,QAAQrE,KAAKokE,MAAM/oD,WAErBrb,KAAKokE,aAELpkE,KAAKskE,SACd,EC8CK,MAAMK,WACH9lD,GAEV/e,WAAAA,GAAAM,SAAAE,WAqDEP,EAAAC,KAAA,sBAAA,GAOAD,EAAAC,KAAA,sBAAA,GAmBAD,yBAKkC,IASlCA,2BAMsC,MAEtCA,wBAaW,MAEXA,0BAMkB,EAAK,CA6BvB,kBAAOof,GACL,MAAO,IAAK/e,MAAM+e,iBAAkBwlD,GAAiBvlD,YACvD,CAGA,iBAAI8kD,GAAgB,IAAAU,EAClB,OAA0B,QAA1BA,EAAO5kE,KAAKgf,SAASolD,aAAK,IAAAQ,OAAA,EAAnBA,EAAqBvpD,EAC9B,CACA,cAAIi2B,GAAa,IAAAuzB,EACf,OAA0B,QAA1BA,EAAO7kE,KAAKgf,SAASolD,aAAK,IAAAS,OAAA,EAAnBA,EAAqBlpD,GAC9B,CACA,aAAImpD,GACF,OAAO9kE,KAAKgf,SAASslD,SACvB,CAQUjlD,YAAAA,CAAahE,GACrBrb,KAAKgf,SAAW,IAAIglD,GAAiB3oD,EAAI,CACvCsD,oBAAqB3e,KAAK2e,oBAC1BslD,eAAgBjkE,KAAKikE,iBAEvBjkE,KAAK+vC,oBACP,CAMA3gC,cAAAA,CAAe0B,GACb9Q,KAAK+kE,sBAAmBvkE,EACxBJ,MAAMgP,eAAe0B,EACvB,CAMAxB,gBAAAA,CAAiBwB,GACf9Q,KAAK+kE,sBAAmBvkE,EAEpBsQ,IAAQ9Q,KAAKwjD,gBACfxjD,KAAK+K,KAAK,2BAA4B,CAAEi6D,WAAY,CAACl0D,KACrD9Q,KAAKilE,uBACLjlE,KAAK+K,KAAK,oBAAqB,CAAEi6D,WAAY,CAACl0D,KAC9CA,EAAI/F,KAAK,aAAc,CACrBrB,OAAQoH,KAGRA,IAAQ9Q,KAAKklE,iBACfllE,KAAKklE,oBAAiB1kE,EACtBR,KAAKmlE,gBAAkB,IAEzB/kE,MAAMkP,iBAAiBwB,EACzB,CAEAvB,oBAAAA,GACEvP,KAAK+kE,sBAAmBvkE,EACxBJ,MAAMmP,sBACR,CAOA61D,sBAAAA,GACE,MAAMvO,EAAe72D,KAAKwjD,cAC1B,OAAQxjD,KAAKg3D,wBAA0BH,EACnC72D,KAAKgP,SACFxF,OAAQ6F,IAAYA,EAAOq9B,OAASr9B,IAAWwnD,GAC/C3rD,OAAO2rD,GACV72D,KAAKgP,QACX,CAKAoS,SAAAA,GACEphB,KAAKqhB,wBACDrhB,KAAKshB,aAGLthB,KAAKqlE,iBAAoBrlE,KAAKslE,gBAAmBtlE,KAAKulE,gBACxDvlE,KAAK+gB,aAAa/gB,KAAKsxC,YACvBtxC,KAAKqlE,iBAAkB,GAErBrlE,KAAKkgB,iBACPlgB,KAAKwlE,eAAexlE,KAAKsxC,YACzBtxC,KAAKkgB,gBAAiB,IAEvBlgB,KAAK+kE,mBACH/kE,KAAK+kE,iBAAmB/kE,KAAKolE,0BAChCplE,KAAKuhB,aAAavhB,KAAKoD,aAAcpD,KAAK+kE,kBAC5C,CAKAS,cAAAA,CAAe7pD,GACbA,EAAI2G,OACAtiB,KAAKulE,eAAiBvlE,KAAKylE,sBAC7BzlE,KAAK0lE,kBAAoB1lE,KAAK0lE,iBAAiBxyB,UAC/ClzC,KAAKqlE,iBAAkB,GAGrBrlE,KAAK2lE,WAAa3lE,KAAKslE,iBACzBtlE,KAAK4lE,eAAejqD,GACpB3b,KAAKqlE,iBAAkB,GAEzB1pD,EAAI6G,SACN,CAOAqjD,SAAAA,GACE,MAAMlqD,EAAM3b,KAAKsxC,WACjBtxC,KAAK+gB,aAAapF,GAClB3b,KAAKwlE,eAAe7pD,GAEpB3b,KAAK+K,KAAK,eAAgB,CAAE4Q,OAC9B,CAOAmqD,sBAAAA,CAAuBx6D,GACrBA,EAAQ5G,KAAKmpB,MAAMviB,GACnBtL,KAAK+lE,oBAAsBz6D,EAC3B,MAAMkmC,EAASxxC,KAAK2f,mBACdlQ,EAAO/K,KAAKosC,MAAc,EAARxlC,EAAY,GAAKkmC,GACzCxxC,KAAKgmE,kBAAkBh0D,MAAQhS,KAAKgmE,kBAAkB/zD,OAASxC,EAC/DzP,KAAKimE,iBAAiBnqD,MAAM01B,EAAQA,EACtC,CAYA00B,mBAAAA,CAAoBx8D,EAAsBsC,EAAWD,GACnD,MAAM+6C,EAAY9mD,KAAK+lE,oBACjBpqD,EAAM3b,KAAKimE,iBACjBjmE,KAAK+gB,aAAapF,GAClBA,EAAI2G,OACJ3G,EAAIy1B,WAAWplC,EAAI86C,GAAY/6C,EAAI+6C,GACnCnrC,EAAIhN,aAAa3O,KAAK4e,mBACtB,MAAMunD,EAAez8D,EAAO65C,yBAC5B75C,EAAO65C,yBAA2B,GAClC75C,EAAO8Z,OAAO7H,GACdjS,EAAO65C,yBAA2B4iB,EAClCxqD,EAAI6G,UAGJ,MAAM4jD,EAAoB1hE,KAAKmpB,MAAMi5B,EAAY9mD,KAAK2f,oBACtD,OAAOknC,GACLlrC,EACAyqD,EACAA,EACAA,EAEJ,CAOAC,sBAAAA,CAAuBn8C,GACrB,MAAMo8C,EAAOtmE,KAAKumE,aAClB,QAAKD,IAGD1kE,MAAMmN,QAAQu3D,KACPA,EAAK7iE,KAAMlC,KAAUA,IAAkB,IAAX2oB,EAAE3oB,IAEhC2oB,EAAEo8C,GAEb,CAOAE,qBAAAA,CACEt8C,EACAxgB,GAEA,MAAM+sD,EAAgBz2D,KAAKymE,mBACzB5P,EAAe72D,KAAKwjD,cAEtB,UACG95C,GACAA,GACCmtD,GACAJ,EAAcl2D,OAAS,IACW,IAAlCk2D,EAAcxtD,QAAQS,IACtBmtD,IAAiBntD,IAChB1J,KAAKqmE,uBAAuBn8C,IAC9BxgB,IAAWA,EAAO88C,SAClB98C,IAAWA,EAAO2I,YAAcwkD,GAAgBA,IAAiBntD,EAEtE,CAeQg9D,sBAAAA,CACNh9D,EACA04C,EACAukB,GAEA,IAAKj9D,EACH,OAGF,IAAIk9D,EAaJ,OAVExkB,IAAW76C,GACX66C,IAAW56C,GACX46C,IAAW36C,GACX26C,IAAWj7C,EAEXy/D,EAAkB5mE,KAAK4jC,iBAAmBl6B,EAAOk6B,gBACxCwe,IAAWn7C,IACpB2/D,EAAkB5mE,KAAK2jC,kBAAoBj6B,EAAOi6B,kBAG7CijC,GAAmBD,EAAqBA,CACjD,CASAE,oBAAAA,CACEn9D,EACAo9D,GAEA,MAAMx4D,EAAS,CACbtC,EAAGtC,EAAOwjB,QACVnhB,EAAGrC,EAAOyjB,SAGZ,OAAK25C,GAKD,CAAC,KAAM,KAAM,MAAMl2D,SAASk2D,GAC9Bx4D,EAAOtC,EAAIrF,EAEF,CAAC,KAAM,KAAM,MAAMiK,SAASk2D,KACrCx4D,EAAOtC,EAAIxF,GAGT,CAAC,KAAM,KAAM,MAAMoK,SAASk2D,GAC9Bx4D,EAAOvC,EAAIrF,EAEF,CAAC,KAAM,KAAM,MAAMkK,SAASk2D,KACrCx4D,EAAOvC,EAAItF,GAEN6H,GAjBEA,CAkBX,CAQAy4D,sBAAAA,CACE78C,EACAxgB,EACAs9D,GACM,IAAAC,EACN,MAAMx5C,EAAU/jB,EAAOgjC,MAEnBthB,GACEprB,KAAKknE,cAAch9C,QACnB1pB,EACAkJ,EAAOgjC,MAAMzO,uBAEfj+B,KAAKknE,cAAch9C,IACf3oB,IAAKwsB,EAAS,GAAEJ,QAAEA,GAAYjkB,EAAO44C,oBAAsB,CAAA,EACjEzJ,EACEmuB,GAAmBr5C,EAC6B,QADtBs5C,EACtBt5C,EAAQotB,iBAAiB7wB,EAAGxgB,EAAQikB,UAAQ,IAAAs5C,OAAA,EAA5CA,EAA8CpgC,KAAKlZ,GACnDW,GACN8zB,E5E5mB6B+kB,EACjCH,EACAj5C,EACA7D,EACAxgB,KAEA,IAAKqkB,IAAWi5C,EACd,MAAO,OAET,MAAMr5C,EAAUjkB,EAAOskB,SAASD,GAChC,OAAOJ,EAAQ2tB,cAAcpxB,EAAGyD,EAASjkB,I4EkmB5By9D,CAAoBH,EAAiBj5C,EAAQ7D,EAAGxgB,GACzD09D,EAASl9C,EAAElqB,KAAKqnE,aAChB/4D,EAAStO,KAAK0mE,uBAAuBh9D,EAAQ04C,EAAQglB,GAChD,CAAEp7D,EAAGzF,EAAQwF,EAAGxF,GACjBvG,KAAK6mE,qBAAqBn9D,EAAQqkB,GAKtCpf,EAAuB,CACrBjF,OAAQA,EACR04C,SACAvJ,gBACAE,iBAAiB,EACjBhrB,SACAlY,OAAQnM,EAAOmM,OACfC,OAAQpM,EAAOoM,OACfC,MAAOrM,EAAOqM,MACdC,MAAOtM,EAAOsM,MACdqE,QAASoT,EAAQzhB,EAAItC,EAAOoI,KAC5BoS,QAASuJ,EAAQ1hB,EAAIrC,EAAOqI,IAC5Bmb,QAAS5e,EAAOtC,EAChBmhB,QAAS7e,EAAOvC,EAChB4wC,GAAIlvB,EAAQzhB,EACZ4wC,GAAInvB,EAAQ1hB,EACZu7D,MAAO75C,EAAQzhB,EACfu7D,MAAO95C,EAAQ1hB,EACf8wC,MAAOvoC,GAAiB5K,EAAO+B,OAC/BuG,MAAOtI,EAAOsI,MACdC,OAAQvI,EAAOuI,OACfu1D,SAAUt9C,EAAEs9C,SACZJ,SACA7oB,SAAU,IACL1zB,GAAoBnhB,GACvBwjB,QAAS5e,EAAOtC,EAChBmhB,QAAS7e,EAAOvC,IAItB/L,KAAKmiD,kBAAoBxzC,EAEzB3O,KAAK+K,KAAK,mBAAoB,CAC5Bmf,IACAvb,aAEJ,CAOA84D,SAAAA,CAAUn8D,GACRtL,KAAKkkE,cAAc/oD,MAAMusD,OAASp8D,CACpC,CAMAs6D,cAAAA,CAAejqD,GACb,MAAM3P,EAAEA,EAACD,EAAEA,EAAC47D,OAAEA,EAAMhnC,OAAEA,GAAW3gC,KAAKslE,eACpC/9B,EAAQ,IAAIz7B,GAAME,EAAGD,GAAG4C,UAAU3O,KAAK4e,mBACvCgpD,EAAS,IAAI97D,GAAME,EAAI27D,EAAQ57D,EAAI40B,GAAQhyB,UACzC3O,KAAK4e,mBAEPipD,EAAe7nE,KAAK8nE,mBAAqB,EAC3C,IAAIC,EAAOrjE,KAAK8I,IAAI+5B,EAAMv7B,EAAG47D,EAAO57D,GAClCg8D,EAAOtjE,KAAK8I,IAAI+5B,EAAMx7B,EAAG67D,EAAO77D,GAChCk8D,EAAOvjE,KAAKC,IAAI4iC,EAAMv7B,EAAG47D,EAAO57D,GAChCk8D,EAAOxjE,KAAKC,IAAI4iC,EAAMx7B,EAAG67D,EAAO77D,GAE9B/L,KAAKmoE,iBACPxsD,EAAIsI,UAAYjkB,KAAKmoE,eACrBxsD,EAAI43B,SAASw0B,EAAMC,EAAMC,EAAOF,EAAMG,EAAOF,IAG1ChoE,KAAK8nE,oBAAuB9nE,KAAKooE,uBAGtCzsD,EAAIi4B,UAAY5zC,KAAK8nE,mBACrBnsD,EAAIw4B,YAAcn0C,KAAKooE,qBAEvBL,GAAQF,EACRG,GAAQH,EACRI,GAAQJ,EACRK,GAAQL,EAGRj4B,GAAaiW,UAAUvR,aAAa3pC,KAClC3K,KACA2b,EACA3b,KAAKqoE,oBAEP1sD,EAAI6+B,WAAWutB,EAAMC,EAAMC,EAAOF,EAAMG,EAAOF,GACjD,CAOAM,YAAAA,CAAap+C,GACX,GAAIlqB,KAAKuoE,sBAAuB,CAC9B,MAAM96C,EAAUztB,KAAKknE,cAAch9C,GAC7B1a,EAAUxP,KAAKwoE,eACjBxoE,KAAKwoE,eAAet4D,aACpBlQ,KAAKkQ,aACHY,EAAM9Q,KAAKyoE,sBAAsBj5D,EAASie,GAChD,GAAI3c,EAAIpH,OAAQ,CACd,KAAIoH,EAAIpH,kBAAkB6rD,IAUxB,OAAO,EARPv1D,KAAKwoE,eAAiB13D,EAAIpH,OAC1B1J,KAAK0oE,sBAEL53D,EAAIpH,OAAOsF,SAASjO,QAASuP,IAC3BA,EAAEoP,aAMR,MAEE1f,KAAKwoE,eAAiB,KACtBxoE,KAAK0oE,sBAEP,OAAO,CACT,CACA,OAAO,CACT,CAOAC,gBAAAA,CAAiBn5D,GACfxP,KAAK4oE,eAAiBp5D,CACxB,CAMAq5D,gBAAAA,GACE,OACE7oE,KAAK4oE,iBACJ5oE,KAAKwoE,eAAiBxoE,KAAKwoE,eAAex5D,SAAWhP,KAAKgP,SAE/D,CASA85D,UAAAA,CAAW5+C,GAGT,GAAIlqB,KAAK+oE,YACP,OAAO/oE,KAAK+oE,YAGd,GAAI/oE,KAAKgpE,eACP,MAAO,CACLC,WAAY,GACZC,kBAAmB,IAIvB,MAAMz7C,EAAUztB,KAAKknE,cAAch9C,GACjC2sC,EAAe72D,KAAKwjD,cACpB2lB,EAAWnpE,KAAKymE,mBAChB2C,EAAappE,KAAKyoE,sBAAsBzoE,KAAK6oE,mBAAoBp7C,IAGjEw7C,WAAYC,EACZ5E,UAAW+E,EACX3/D,OAAQ4/D,GACNF,EAEEG,EAA+C,IAChDH,EACHF,oBACAG,mBACAC,iBAIF,IAAKzS,EACH,OAAO0S,EAIT,MAAMC,EAAuD,IACxDxpE,KAAKyoE,sBAAsB,CAAC5R,GAAeppC,GAC9Cy7C,oBACAG,mBACAC,iBASF,GAN4BzS,EAAapU,YACvCziD,KAAKypE,iBAAiBv/C,GACtBH,GAAaG,IAKb,MAAO,IACFs/C,EACH9/D,OAAQmtD,GAKZ,GAAI2S,EAAuB9/D,OAAQ,CACjC,GAAIy/D,EAAS5oE,OAAS,EAGpB,OAAOipE,EAKT,IAAKxpE,KAAKg3D,uBAER,OAAOwS,EAMT,GACExpE,KAAKg3D,wBACL9sC,EAAElqB,KAAK0pE,iBAGP,OAAOF,CAEX,CAGA,OAAOD,CACT,CASQI,6BAAAA,CAA8B74D,EAAmByP,GAEvD,IAAIysB,EAASl8B,EAAI+7B,YACjB,MAAM+8B,EAAe5pE,KAAKmgB,UACpB8N,EAAUnd,EAAImd,QAAU27C,EAC9B,GAAI37C,EAAS,CACX,MAAO9b,EAAI0P,EAAIzP,EAAI0P,GAAMkrB,EAKnB68B,EAAenlE,KAAK+Q,MAAMoM,EAAG9V,EAAIoG,EAAGpG,EAAG8V,EAAG7V,EAAImG,EAAGnG,GACrD89D,EAAOt+D,GAAIq+D,GAAgB57C,EAC3B87C,EAAOp+D,GAAIk+D,GAAgB57C,EAC3B+7C,EAAWF,EAAOC,EAClBE,EAAgBH,EAAOC,EAEzB/8B,EAAS,CACP,IAAIlhC,GAAMqG,EAAGnG,EAAIi+D,EAAe93D,EAAGpG,EAAIi+D,GACvC,IAAIl+D,GAAM+V,EAAG7V,EAAIg+D,EAAUnoD,EAAG9V,EAAIk+D,GAClC,IAAIn+D,GAAMsG,EAAGpG,EAAIi+D,EAAe73D,EAAGrG,EAAIi+D,GACvC,IAAIl+D,GAAMgW,EAAG9V,EAAIg+D,EAAUloD,EAAG/V,EAAIk+D,GAStC,CACA,OAAOlhC,GAAaQ,iBAAiBhpB,EAAOysB,EAC9C,CAUAk9B,YAAAA,CAAap5D,EAAmB2c,GAC9B,GACE3c,GACAA,EAAIwB,SACJxB,EAAI01C,SACJxmD,KAAK2pE,8BAA8B74D,EAAK2c,GACxC,CACA,IACGztB,KAAKymD,qBAAsB31C,EAAI21C,oBAC9B31C,EAAyBq5D,UAO3B,OAAO,EANP,CACA,MAAMC,EAAgB38C,EAAQ9e,UAAU3O,KAAK4e,mBAC7C,IAAK5e,KAAKkmE,oBAAoBp1D,EAAKs5D,EAAcp+D,EAAGo+D,EAAcr+D,GAChE,OAAO,CAEX,CAGF,CACA,OAAO,CACT,CAWAs+D,sBAAAA,CACE76D,EACAie,EACAw7C,GAEA,IAAI99D,EAAIqE,EAAQjP,OAGhB,KAAO4K,KAAK,CACV,MAAMzB,EAAS8F,EAAQrE,GACvB,GAAInL,KAAKkqE,aAAaxgE,EAAQ+jB,GAAU,CAEtC,IACGztB,KAAKuoE,uBACN15D,GAAanF,IACbA,EAAO2sD,eACP,CACA,MAAQ3sD,OAAQ4gE,GAActqE,KAAKqqE,uBACjC3gE,EAAOsF,SACPye,EACAw7C,GAEFqB,GAAarB,EAAW7+D,KAAKkgE,EAC/B,CACA,MAAO,CACL5gE,SACAu/D,aAEJ,CACF,CACA,MAAO,CACLA,WAAY,GAEhB,CASAR,qBAAAA,CACEj5D,EACAie,GAEA,MAAM27C,EAAuCppE,KAAKqqE,uBAChD76D,EACAie,EACA,IAIF27C,EAAW9E,UAAY8E,EAAW1/D,OAClC,MAAM46D,UAAEA,EAAS2E,WAAEA,GAAeG,EAElC,GACE9E,GACAz1D,GAAay1D,IACbA,EAAUvM,aACVkR,EAAW,GACX,CAKA,IAAK,IAAI99D,EAAI89D,EAAW1oE,OAAS,EAAG4K,EAAI,EAAGA,IAAK,CAC9C,MAAMoC,EAAI07D,EAAW99D,GACrB,IAAM0D,GAAatB,KAAMA,EAAEwqD,YAIzB,OADAqR,EAAW1/D,OAAS6D,EACb67D,CAEX,CAEA,OADAA,EAAW1/D,OAASu/D,EAAW,GACxBG,CACT,CAEA,OAAOA,CACT,CAgBAK,gBAAAA,CAAiBv/C,GACf,OAAIlqB,KAAKuqE,eACAvqE,KAAKuqE,eAEPvqE,KAAKwqE,gBAAgBtgD,GAAG,EACjC,CAcAg9C,aAAAA,CAAch9C,GACZ,OAAIlqB,KAAKyqE,YACAzqE,KAAKyqE,YAEPzqE,KAAKwqE,gBAAgBtgD,EAC9B,CAWUsgD,eAAAA,CAAgBtgD,GAA+C,IAA7BwgD,EAAYpqE,UAAAC,OAAA,QAAAC,IAAAF,UAAA,IAAAA,UAAA,GACtD,MAAM4jE,EAAgBlkE,KAAKkkE,cACzBvJ,EAASuJ,EAAcxmD,wBACzB,IAAI+P,EAAUnE,GAAWY,GACvBygD,EAAchQ,EAAO3oD,OAAS,EAC9B44D,EAAejQ,EAAO1oD,QAAU,EAE7B04D,GAAgBC,IACfnkE,KAAOk0D,GAAUj0D,KAAUi0D,IAC7BiQ,EAAelmE,KAAKgH,IAAIivD,EAAO5oD,IAAM4oD,EAAOhvC,SAE1ChlB,KAASg0D,GAAUn0D,KAAQm0D,IAC7BgQ,EAAcjmE,KAAKgH,IAAIivD,EAAO/uC,MAAQ+uC,EAAO7oD,QAIjD9R,KAAK8c,aACL2Q,EAAQzhB,EAAIyhB,EAAQzhB,EAAIhM,KAAK4f,QAAQ9N,KACrC2b,EAAQ1hB,EAAI0hB,EAAQ1hB,EAAI/L,KAAK4f,QAAQ7N,IAChC24D,IACHj9C,EAAUrC,GAAiBqC,OAASjtB,EAAWR,KAAK4e,oBAGtD,MAAMhD,EAAgB5b,KAAK2f,mBACL,IAAlB/D,IACF6R,EAAQzhB,GAAK4P,EACb6R,EAAQ1hB,GAAK6P,GAIf,MAAMivD,EACY,IAAhBF,GAAsC,IAAjBC,EACjB,IAAI9+D,GAAM,EAAG,GACb,IAAIA,GACFo4D,EAAclyD,MAAQ24D,EACtBzG,EAAcjyD,OAAS24D,GAG/B,OAAOn9C,EAAQ9gB,SAASk+D,EAC1B,CAMUvrD,kBAAAA,CACRS,EACA7d,GAGAlC,KAAK8qE,2BACL1qE,MAAMkf,mBAAmBS,EAAY7d,GACjClC,KAAKylE,qBACPzlE,KAAK0lE,kBACH1lE,KAAK0lE,iBAAiBqF,gBAAgB/qE,KAAKsxC,WAEjD,CAEUvB,kBAAAA,GACR/vC,KAAKgmE,kBAAoBxyD,KACzBxT,KAAKimE,iBAAmBjmE,KAAKgmE,kBAAkB5iE,WAAW,KAAM,CAC9D4nE,oBAAoB,IAEtBhrE,KAAK8lE,uBAAuB9lE,KAAK+lE,oBACnC,CAMAkF,aAAAA,GACE,OAAOjrE,KAAKgf,SAASolD,MAAMzoD,GAC7B,CAOAuvD,mBAAAA,GACE,OAAOlrE,KAAKgf,SAASolD,MAAMzoD,GAC7B,CAMAwvD,mBAAAA,GACE,OAAOnrE,KAAKgf,SAASolD,MAAM/oD,EAC7B,CAMAw/B,eAAAA,GACE,OAAO76C,KAAKwjD,aACd,CAMAijB,gBAAAA,GACE,MAAM2E,EAASprE,KAAKwjD,cACpB,OAAOlpC,GAAkB8wD,GACrBA,EAAOl7D,aACPk7D,EACE,CAACA,GACD,EACR,CAQAC,oBAAAA,CAAqBC,EAA4BphD,GAC/C,IAAIqhD,GAAmB,EACrBC,GAAa,EACf,MAAMh8D,EAAUxP,KAAKymE,mBACnBgF,EAAwB,GACxB57D,EAA0B,GAE5By7D,EAAWvqE,QAAS2I,IACb8F,EAAQoB,SAASlH,KACpB6hE,GAAmB,EACnB7hE,EAAOqB,KAAK,aAAc,CACxBmf,IACAxgB,WAEFmG,EAAQzF,KAAKV,MAIjB8F,EAAQzO,QAAS2I,IACV4hE,EAAW16D,SAASlH,KACvB6hE,GAAmB,EACnB7hE,EAAOqB,KAAK,WAAY,CACtBmf,IACAxgB,WAEF+hE,EAAMrhE,KAAKV,MAIX4hE,EAAW/qE,OAAS,GAAKiP,EAAQjP,OAAS,GAC5CirE,GAAa,EACbD,GACEvrE,KAAK+K,KAAK,oBAAqB,CAC7Bmf,IACAssC,SAAUiV,EACVzG,WAAYn1D,KAEPL,EAAQjP,OAAS,GAC1BirE,GAAa,EACbxrE,KAAK+K,KAAK,oBAAqB,CAC7Bmf,IACAssC,SAAUiV,KAEHH,EAAW/qE,OAAS,IAC7BirE,GAAa,EACbxrE,KAAK+K,KAAK,oBAAqB,CAC7Bmf,IACA86C,WAAYn1D,KAGhB27D,IAAexrE,KAAK+kE,sBAAmBvkE,EACzC,CAQAkrE,eAAAA,CAAgBr8D,EAAsB6a,GAEpC,MAAMyhD,EAAiB3rE,KAAKymE,mBACtBjQ,EAAWx2D,KAAK4rE,iBAAiBv8D,EAAQ6a,GAE/C,OADAlqB,KAAKqrE,qBAAqBM,EAAgBzhD,GACnCssC,CACT,CAUAoV,gBAAAA,CAAiBv8D,EAAsB6a,GACrC,MAAM2hD,EAAmB7rE,KAAKwjD,cAC9B,OAAIqoB,IAAqBx8D,OAIpBrP,KAAKilE,qBAAqB/6C,EAAG7a,IAAWrP,KAAKwjD,kBAI9Cn0C,EAAO41C,SAAS,CAAE/6B,QAItBlqB,KAAKwjD,cAAgBn0C,EAEjBiL,GAAkBjL,IAAWw8D,IAAqBx8D,GACpDA,EAAO5G,IAAI,SAAUzI,MAEvBqP,EAAOqQ,aAEA,IACT,CAUAulD,oBAAAA,CACE/6C,EACA7a,GAEA,MAAMyB,EAAM9Q,KAAKwjD,cACjB,QAAI1yC,KAEEA,EAAIi0C,WAAW,CAAE76B,IAAG7a,aAGpBrP,KAAKmiD,mBAAqBniD,KAAKmiD,kBAAkBz4C,SAAWoH,GAC9D9Q,KAAK8rE,oBAAoB5hD,GAEvB5P,GAAkBxJ,IAAQA,IAAQ9Q,KAAKklE,iBACzCllE,KAAKklE,oBAAiB1kE,GAExBR,KAAKwjD,mBAAgBhjD,GACd,GAGX,CAUAkoE,mBAAAA,CAAoBx+C,GAClB,MAAMyhD,EAAiB3rE,KAAKymE,mBAC1B5P,EAAe72D,KAAK66C,kBAClB8wB,EAAeprE,QACjBP,KAAK+K,KAAK,2BAA4B,CACpCmf,IACA86C,WAAY,CAACnO,KAGjB,MAAMkV,EAAY/rE,KAAKilE,qBAAqB/6C,GAE5C,OADAlqB,KAAKqrE,qBAAqBM,EAAgBzhD,GACnC6hD,CACT,CAQAD,mBAAAA,CAAoB5hD,GAClB,MAAMvb,EAAY3O,KAAKmiD,kBACvBniD,KAAKgsE,0BAA0B9hD,GAC3Bvb,GAAaA,EAAUjF,SAEzBiF,EAAUjF,OAAO26C,UAAW,GAE9BrkD,KAAKmiD,kBAAoB,IAC3B,CAMA6pB,yBAAAA,CAA0B9hD,GACxB,MAAMvb,EAAY3O,KAAKmiD,kBACrBz4C,EAASiF,EAAUjF,OACnBxH,EAAU,CACRgoB,IACAxgB,SACAiF,YACAyzC,OAAQzzC,EAAUyzC,QAGlB14C,EAAOuiE,WACTviE,EAAOuiE,UAAW,GAGpBviE,EAAOgW,YAEH/Q,EAAUoqC,kBACZ/4C,KAAK+K,KAAK,kBAAmB7I,GAC7BwH,EAAOqB,KAAKjD,EAAU5F,GAE1B,CAMAke,oBAAAA,CAAqBC,GACnBjgB,MAAMggB,qBAAqBC,GAC3B,MAAMw2C,EAAe72D,KAAKwjD,cACtBqT,GACFA,EAAan3C,WAEjB,CAKAyJ,OAAAA,GAEE,MAAM0tC,EAAe72D,KAAKwjD,cACtBlpC,GAAkBu8C,KACpBA,EAAaP,YACbO,EAAaxyD,kBAGRrE,KAAKwjD,cAEZpjD,MAAM+oB,UAMNnpB,KAAKimE,iBAAmB,KAExBjmE,KAAKgmE,uBAAoBxlE,CAC3B,CAKAygB,KAAAA,GAEEjhB,KAAK0oE,sBAEL1oE,KAAKwjD,mBAAgBhjD,EACrBR,KAAK+gB,aAAa/gB,KAAKsxC,YACvBlxC,MAAM6gB,OACR,CAMAc,YAAAA,CAAapG,GACX,MAAMk7C,EAAe72D,KAAKwjD,cAEtBqT,GACFA,EAAa9S,gBAAgBpoC,EAEjC,CAKU6J,SAAAA,CACR5M,EACAyM,EACAJ,GAMA,MAAMinD,EAAqBlsE,KAAKmsE,+BAA+BvzD,GAC7DvJ,EAASjP,MAAMolB,UAAU5M,EAAUyM,EAAYJ,GAGjD,OADArM,EAASnQ,IAAIyjE,GACN78D,CACT,CAQQ88D,8BAAAA,CACNvzD,GAEA,MAAM8zB,MAAEA,GAAU9zB,EAClB,GAAI8zB,GAASpyB,GAAkBoyB,IAAU1sC,KAAKwjD,gBAAkB9W,EAAO,CACrE,MAWM0/B,EAAiBjzD,GAAsBP,EAXzB,CAClB,QACA,QACA,QACApS,EACAgB,EACAC,EACAC,EACAC,EACAlB,IAIF,OADA8jB,GAAqB3R,EAAU8zB,EAAMjiB,iBAC9B2hD,CACT,CACE,MAAO,CAAA,CAEX,CAKA5kD,aAAAA,CACEtB,EACAtN,EACAT,GAIA,MAAM+zD,EAAqBlsE,KAAKmsE,+BAA+BvzD,GAC/DxY,MAAMonB,cAActB,EAAQtN,EAAUT,GACtCS,EAASnQ,IAAIyjE,EACf,EACDnsE,EAr1CY4kE,GAAgB,cCuF0B,CACrDlnB,gBAAgB,EAChBD,YAAa,WACb5Z,iBAAiB,EACjBD,kBAAkB,EAClB0jC,YAAa,SACbrmB,aAAc,WAEd2kB,WAAW,EACXY,aAAc,WACd4B,eAAgB,2BAChBE,mBAAoB,GACpBD,qBAAsB,2BACtBN,mBAAoB,EACpBuE,yBAAyB,EAEzB1lB,YAAa,OACbC,WAAY,OACZ0lB,cAAe,UACfC,kBAAmB,YACnBC,iBAAkB,cAElB/lB,oBAAoB,EACpBsf,oBAAqB,EACrBiD,gBAAgB,EAEhByD,iBAAiB,EACjBC,gBAAgB,EAChBC,iBAAiB,EACjBC,qBAAqB,EAErB3I,eAAgB,mBAChBjN,wBAAwB,IC5RnB,MAAM6V,GAKX/sE,WAAAA,CAAYqD,GAAgBpD,iBAJO,IAAEA,EAAAC,KAAA,kBAAA,GAKnC,MAAM8sE,EAAKA,KACT,MAAMC,eAAEA,GACL5pE,EAAO03C,mBAAuC,CAAA,EACjDkyB,GAAkBA,EAAeC,SAE7B3xD,EAAKlY,EAAO+gE,cAClB7oD,EAAGxD,iBAAiB,QAASi1D,GAC7B9sE,KAAKitE,WAAa,IAAM5xD,EAAGpD,oBAAoB,QAAS60D,EAC1D,CAEAI,eAAAA,GACEltE,KAAK0J,YAASlJ,EACdR,KAAK00D,QAAQ3zD,QAAS2I,IAChBA,EAAOygE,WACTzgE,EAAOyjE,eAGb,CAEAlhE,GAAAA,CAAIvC,GACF1J,KAAK00D,QAAQtqD,KAAKV,EACpB,CAEAX,MAAAA,CAAOW,GACL1J,KAAKkoC,WAAWx+B,GAChB0B,GAAgBpL,KAAK00D,QAAShrD,EAChC,CAEAk+B,QAAAA,CAASl+B,GACP1J,KAAK0J,OAASA,CAChB,CAEAw+B,UAAAA,CAAWx+B,GACLA,IAAW1J,KAAK0J,SAClB1J,KAAK0J,YAASlJ,EAElB,CAEA4sE,WAAAA,CAAYljD,GAAkB,IAAAmjD,GACjB,QAAXA,EAAArtE,KAAK0J,kBAAM2jE,SAAXA,EAAalD,YAAanqE,KAAK0J,OAAO4jE,2BAA2BpjD,EACnE,CAEAjJ,KAAAA,GACEjhB,KAAK00D,QAAU,GACf10D,KAAK0J,YAASlJ,CAChB,CAEA6D,OAAAA,GACErE,KAAKihB,QACLjhB,KAAKitE,oBAEEjtE,KAAKitE,UACd,EC1CF,MAAMM,GAAkB,CAAEC,SAAS,GAE7BC,GAAiBA,CAACtqE,EAAgB+mB,KAG/B,CACLkgD,cAHoBjnE,EAAOsmE,iBAAiBv/C,GAI5CwjD,WAHiBvqE,EAAO+jE,cAAch9C,KAUpCyjD,GAAc,SAClBtyD,GAA0B,IAAA,IAAA3Z,EAAApB,UAAAC,OACvBmK,MAAI9I,MAAAF,EAAA,EAAAA,OAAAG,EAAA,EAAAA,EAAAH,EAAAG,IAAJ6I,EAAI7I,EAAA,GAAAvB,UAAAuB,GAAA,OACJwZ,EAAGxD,oBAAoBnN,EAAK,EAC3BkjE,GAAiB,SACrBvyD,GAA0B,IAAA,IAAA1L,EAAArP,UAAAC,OACvBmK,MAAI9I,MAAA+N,EAAA,EAAAA,OAAAC,EAAA,EAAAA,EAAAD,EAAAC,IAAJlF,EAAIkF,EAAA,GAAAtP,UAAAsP,GAAA,OACJyL,EAAGpD,uBAAuBvN,EAAK,EAE9BmjE,GAAuB,CAC3BC,MAAO,CACLC,GAAI,OACJxM,IAAK,MACLyM,SAAU,YACVC,UAAW,WACXC,SAAU,aACVC,UAAW,aAEbC,KAAM,CACJL,GAAI,QACJxM,IAAK,QACLyM,SAAU,YACVC,UAAW,YACXC,SAAU,aACVC,UAAW,eASR,MAAME,WAAe1J,GAkD1B7kE,WAAAA,CAAYub,GACVjb,MAAMib,EAD4D/a,UAAAC,OAAA,QAAAC,IAAAF,UAAA,GAAAA,UAAA,GAAG,CAAA,GAVvEP,EAAAC,KAAA,gBAAA,GAAAD,EAAAC,KAAA,qBAQqB,IAAI6sE,GAAmB7sE,OAMxC,CACE,eACA,gBACA,eACA,aACA,cACA,YAMA,gBACA,cACA,gBACA,iBACA,WACA,eACA,aACA,kBACA,cACA,eACA,eACA,WAEFe,QAASutE,IAETtuE,KAAKsuE,GAAiBtuE,KAAKsuE,GAA2BznC,KAAK7mC,QAG7DA,KAAKuuE,YAAYZ,GAAa,MAChC,CAMQa,eAAAA,GACN,OAAOxuE,KAAK4sE,oBAAsB,UAAY,OAChD,CAEA2B,WAAAA,CAAYE,EAAcC,GACxB,MAAMC,EAAgB3uE,KAAKkkE,cACzB0K,EAAkB5uE,KAAKwuE,kBACzBC,EAAQlzD,GAAqBozD,GAAgB,SAAU3uE,KAAK6uE,WAC5DJ,EAAQE,EAAeC,EAAkB,OAAQ5uE,KAAK8uE,cACtDL,EACEE,EACA,GAAGC,QACH5uE,KAAK+uE,aACLxB,IAEFkB,EAAQE,EAAe,GAAGC,OAAsB5uE,KAAKgvE,aACrDP,EAAQE,EAAe,GAAGC,SAAwB5uE,KAAKivE,eACvDR,EAAQE,EAAe,QAAS3uE,KAAKkvE,cAAe,CAAE1B,SAAS,IAC/DiB,EAAQE,EAAe,cAAe3uE,KAAKmvE,gBAC3CV,EAAQE,EAAe,QAAS3uE,KAAKovE,UAErCX,EAAQE,EAAe,WAAY3uE,KAAKovE,UACxCX,EAAQE,EAAe,YAAa3uE,KAAKqvE,cACzCZ,EAAQE,EAAe,UAAW3uE,KAAKsvE,YACvCb,EAAQE,EAAe,WAAY3uE,KAAKuvE,aACxCd,EAAQE,EAAe,YAAa3uE,KAAKwvE,cACzCf,EAAQE,EAAe,YAAa3uE,KAAKyvE,cACzChB,EAAQE,EAAe,OAAQ3uE,KAAK0vE,SAC/B1vE,KAAK4sE,qBACR6B,EAAQE,EAAe,aAAc3uE,KAAK2vE,cAAepC,GAa7D,CAKAqC,eAAAA,GACE5vE,KAAKuuE,YAAYX,GAAgB,UAEjC,MAAMgB,EAAkB5uE,KAAKwuE,kBACvBh0D,EAAMC,GAAuBza,KAAKkkE,eACxC0J,GACEpzD,EACA,GAAGo0D,MACH5uE,KAAK6vE,YAEPjC,GACEpzD,EACA,WACAxa,KAAK8vE,YACLvC,IAEFK,GACEpzD,EACA,GAAGo0D,QACH5uE,KAAK+uE,aACLxB,IAEFK,GACEpzD,EACA,YACAxa,KAAK+uE,aACLxB,IAEFwC,aAAa/vE,KAAKgwE,kBACpB,CAMQd,aAAAA,CAAchlD,GACpBlqB,KAAKiwE,yBAAyB/lD,GAC9BlqB,KAAKkwE,aAAahmD,EAAG,SACrBlqB,KAAK8qE,0BACP,CAMQkE,WAAAA,CAAY9kD,GAClB,MAAMxgB,EAAS1J,KAAKklE,eACdiL,EAAS,CACbjmD,OACGujD,GAAeztE,KAAMkqB,IAE1BlqB,KAAK+K,KAAK,YAAa,IAAKolE,EAAQzmE,WACpC1J,KAAKklE,oBAAiB1kE,EACtBkJ,GAAUA,EAAOqB,KAAK,WAAY,IAAKolE,IACvCnwE,KAAKmlE,gBAAgBpkE,QAASqvE,IAC5BpwE,KAAK+K,KAAK,YAAa,IAAKolE,EAAQzmE,OAAQ0mE,IAC5CA,GAAgBA,EAAarlE,KAAK,WAAY,IAAKolE,MAErDnwE,KAAKmlE,gBAAkB,EACzB,CAOQ8J,aAAAA,CAAc/kD,GAOpB,MAAMxgB,OAAEA,GAAW1J,KAAK8oE,WAAW5+C,GAG9BlqB,KAAKmiD,mBAAsBz4C,IAC9B1J,KAAK+K,KAAK,aAAc,CACtBmf,OACGujD,GAAeztE,KAAMkqB,KAE1BlqB,KAAKklE,oBAAiB1kE,EACtBR,KAAKmlE,gBAAkB,GAE3B,CAOQkK,YAAAA,CAAanlD,GACnBlqB,KAAKqwE,UAAW,EAChB,MAAMxZ,EAAe72D,KAAK66C,kBAC1B,GAAIgc,GAAgBA,EAAazR,YAAYl7B,GAAI,CAC/ClqB,KAAKswE,YAAczZ,EACnB,MAAM30D,EAAU,CAAEgoB,IAAGxgB,OAAQmtD,GAQ7B,OAPA72D,KAAK+K,KAAK,YAAa7I,GACvB20D,EAAa9rD,KAAK,YAAa7I,QAC/ByrE,GACE3tE,KAAKkkE,cACL,OACAlkE,KAAKuwE,gBAGT,CACAtmD,GAAUC,EACZ,CAQQsmD,kBAAAA,CACNtmD,EACA9Q,EACA1P,GAEA,IAAIm6B,GAAQ,EAEZ,MAAM4sC,EAAazwE,KAAK0wE,YACpBD,GAAcA,IAAer3D,GAAUq3D,IAAe/mE,IACxD+mE,EAAW5rB,kBACXhhB,GAAQ,GAEVzqB,SAAAA,EAAQyrC,kBACRn7C,IAAW0P,IAAU1P,SAAAA,EAAQm7C,mBAE7B,MAAMlpC,EAAM3b,KAAKsxC,WACjB31B,EAAI2G,OACJ3G,EAAIhN,aAAa3O,KAAK4e,mBAClBxF,IACFuC,EAAI2G,OACJlJ,EAAOzK,UAAUgN,GACjBvC,EAAOksC,uBAAuBp7B,GAC9BvO,EAAI6G,UACJqhB,GAAQ,GAENn6B,IACFiS,EAAI2G,OACJ5Y,EAAOiF,UAAUgN,GACjBjS,EAAO67C,uBAAuBr7B,GAC9BvO,EAAI6G,UACJqhB,GAAQ,GAEVloB,EAAI6G,UACJqhB,IAAU7jC,KAAKqlE,iBAAkB,EACnC,CAQQiK,UAAAA,CAAWplD,GACjB,MAAMg/C,kBAAEA,GAAsBlpE,KAAK8oE,WAAW5+C,GACxCymD,IAAYzmD,EAAE0mD,cAAgB1mD,EAAE0mD,aAAaC,aAAejqE,EAChE6pE,EAAaE,EAAU3wE,KAAKwjD,mBAAgBhjD,EAC5C0B,EAAU,CACRgoB,IACAxgB,OAAQ1J,KAAKswE,YACbrH,WAAYC,EACZ4H,WAAY9wE,KAAKswE,YACjBK,UACAF,WAAYA,GAEhB7C,GACE5tE,KAAKkkE,cACL,OACAlkE,KAAKuwE,iBAEPvwE,KAAK+K,KAAK,UAAW7I,GACrBlC,KAAKswE,aAAetwE,KAAKswE,YAAYvlE,KAAK,UAAW7I,UAC9ClC,KAAKswE,YAEZtwE,KAAK6vE,WAAW3lD,EAClB,CAOQqmD,eAAAA,CAAgBrmD,GACtB,MAAMhoB,EAAU,CACdgoB,IACAxgB,OAAQ1J,KAAKswE,YACbQ,WAAY9wE,KAAKswE,YACjBG,WAAYzwE,KAAK+wE,oBAEnB/wE,KAAK+K,KAAK,OAAQ7I,GAClBlC,KAAKswE,aAAetwE,KAAKswE,YAAYvlE,KAAK,OAAQ7I,EACpD,CAQQqtE,WAAAA,CAAYrlD,GAClB,MAAM8mD,EAAY,YACV3H,iBAAkB3/D,EAAMw/D,kBAAEA,GAAsBlpE,KAAK8oE,WAAW5+C,GAClE4mD,EAAa9wE,KAAKswE,YAClBpuE,EAAU,CACdgoB,IACAxgB,SACAu/D,WAAYC,EACZ4H,aACAzrB,SAAS,EACTorB,gBAAYjwE,GAEd,IAAIiwE,EAEJzwE,KAAK+K,KAAKimE,EAAW9uE,GAGrBlC,KAAKixE,sBAAsB/mD,EAAGxgB,EAAQxH,GAClCwH,IACEA,EAAO27C,QAAQn7B,KACjBumD,EAAa/mE,GAEfA,EAAOqB,KAAKimE,EAAW9uE,IAGzB,IAAK,IAAIiJ,EAAI,EAAGA,EAAI+9D,EAAkB3oE,OAAQ4K,IAAK,CACjD,MAAMm/D,EAAYpB,EAAkB/9D,GAIhCm/D,EAAUjlB,QAAQn7B,KACpBumD,EAAanG,GAEfA,EAAUv/D,KAAKimE,EAAW9uE,EAC5B,CAEAlC,KAAKwwE,mBAAmBtmD,EAAG4mD,EAAYL,GACvCzwE,KAAK0wE,YAAcD,CACrB,CAOQjB,YAAAA,CAAatlD,GACnB,MAAMm/C,iBAAEA,EAAgBH,kBAAEA,GAAsBlpE,KAAK8oE,WAAW5+C,GAC1DhoB,EAAU,CACdgoB,IACAxgB,OAAQ2/D,EACRJ,WAAYC,EACZ4H,WAAY9wE,KAAKswE,aAEnBtwE,KAAK+K,KAAK,YAAa7I,GAEvBlC,KAAKixE,sBAAsB/mD,EAAGm/C,EAAkBnnE,EAClD,CAOQutE,YAAAA,CAAavlD,GACnB,MAAMg/C,kBAAEA,GAAsBlpE,KAAK8oE,WAAW5+C,GACxChoB,EAAU,CACdgoB,IACAxgB,OAAQ1J,KAAK+wE,mBACb9H,WAAYC,EACZ4H,WAAY9wE,KAAKswE,aAEnBtwE,KAAK+K,KAAK,YAAa7I,GAGvBlC,KAAKixE,sBAAsB/mD,OAAG1pB,EAAW0B,GACzClC,KAAKwwE,mBAAmBtmD,EAAGlqB,KAAKswE,aAChCtwE,KAAK0wE,iBAAclwE,EACnBR,KAAKmlE,gBAAkB,EACzB,CAUQuK,OAAAA,CAAQxlD,GACd,MAAMm/C,iBAAEA,EAAgBH,kBAAEA,GAAsBlpE,KAAK8oE,WAAW5+C,GAC1DhoB,EAAUlC,KAAKkxE,mBAAmB,cAAe,CACrDhnD,IACAxgB,OAAQ2/D,EACRJ,WAAYC,EACZ4H,WAAY9wE,KAAKswE,eACd7C,GAAeztE,KAAMkqB,KAG1BhoB,EAAQyuE,SAAU,EAElBzuE,EAAQuuE,gBAAajwE,EAErBR,KAAKkxE,mBAAmB,OAAQhvE,GAIhClC,KAAK+K,KAAK,aAAc7I,EAC1B,CAMQitE,cAAAA,CAAejlD,GACrB,MAAMxgB,OAAEA,EAAMu/D,WAAEA,GAAejpE,KAAK8oE,WAAW5+C,GACzChoB,EAAUlC,KAAKkxE,mBAAmB,qBAAsB,CAC5DhnD,IACAxgB,SACAu/D,eAKF,OAFAjpE,KAAKysE,iBAAmBxiD,GAAUC,GAClClqB,KAAKkxE,mBAAmB,cAAehvE,IAChC,CACT,CAMQktE,QAAAA,CAASllD,GACf,MAAMinD,EAASjnD,EAAEknD,OACbD,EAAS,GAAKA,EAAS,IAC3BnxE,KAAKiwE,yBAAyB/lD,GACpB,GAAVinD,GAA0B,aAAXjnD,EAAExhB,MAAuB1I,KAAKqxE,YAAYnnD,GAC/C,GAAVinD,GAAenxE,KAAKkwE,aAAahmD,EAAG,eACpClqB,KAAK8qE,2BACP,CAMQuG,WAAAA,CAAYnnD,GAClB,GAAIlqB,KAAKsoE,aAAap+C,GAKpB,OAHAlqB,KAAK8qE,2BACL9qE,KAAKsxE,cAAcpnD,QACnBlqB,KAAKuxE,YAAYrnD,GAGnBlqB,KAAKkwE,aAAahmD,EAAG,WACvB,CAQAsnD,YAAAA,CAAaC,GACX,MAAM9nD,EAAkB8nD,EAAmB9nD,eAE3C,OAAIA,EACKA,EAAe,IAAMA,EAAe,GAAG+nD,WAG5C1xE,KAAK4sE,oBACC6E,EAAqBE,WAGxB,CACT,CAOAC,YAAAA,CAAaH,GACX,OAAwC,IAAnCA,EAAqBI,YAGc,IAAnCJ,EAAqBI,YAGT,aAAbJ,EAAI/oE,MAA8D,IAAtC+oE,EAAmBK,QAAQvxE,UAGtDkxE,EAAmB9nD,gBAEnB8nD,EAAmB9nD,eAAe,GAAG+nD,aAAe1xE,KAAK+xE,aAIhE,CAMApC,aAAAA,CAAczlD,GACZlqB,KAAKiwE,yBAAyB/lD,GAE9B,IAAI8nD,GAA0BhyE,KAAK2e,oBACnC,MAAMszD,EAAsBjyE,KAAKwjD,mBACRhjD,IAArBR,KAAK+xE,cACP/xE,KAAK+xE,YAAc/xE,KAAKwxE,aAAatnD,IAEvClqB,KAAKsxE,cAAcpnD,GACnB,MAAMxgB,OAAEA,GAAW1J,KAAK8oE,WAAW5+C,IAKjClqB,KAAKulE,eACJ0M,GAAuBvoE,IAAWuoE,KAEnCD,GAAyB,GAG3BA,GAA0B9nD,EAAEC,iBAC5B,MAAMwkD,EAAgB3uE,KAAKkkE,cACzB0K,EAAkB5uE,KAAKwuE,kBACnBh0D,EAAMC,GAAuBk0D,GACnChB,GACEnzD,EACA,WACAxa,KAAK8vE,YACLvC,IAGFyE,GACErE,GACEnzD,EACA,YACAxa,KAAK+uE,aACLxB,IAGJK,GACEe,EACA,GAAGC,QACH5uE,KAAK8uE,cAEP9uE,KAAK8qE,0BACP,CAMAgE,YAAAA,CAAa5kD,GACXlqB,KAAKiwE,yBAAyB/lD,GAC9BlqB,KAAKsxE,cAAcpnD,GACnB,MAAMykD,EAAgB3uE,KAAKkkE,cACzB0K,EAAkB5uE,KAAKwuE,kBAEzBZ,GACEe,EACA,GAAGC,QACH5uE,KAAK+uE,aACLxB,IAEF,MAAM/yD,EAAMC,GAAuBk0D,GACnChB,GAAYnzD,EAAK,GAAGo0D,MAAqB5uE,KAAK6vE,YAC9ClC,GACEnzD,EACA,GAAGo0D,QACH5uE,KAAK+uE,aACLxB,IAEFvtE,KAAK8qE,0BACP,CAMAgF,WAAAA,CAAY5lD,GACV,GAAIA,EAAE4nD,QAAQvxE,OAAS,EAErB,OAEFP,KAAKiwE,yBAAyB/lD,GAC9BlqB,KAAKuxE,YAAYrnD,GACjBlqB,KAAK8qE,kCACE9qE,KAAK+xE,YACZ,MAAMnD,EAAkB5uE,KAAKwuE,kBACvBh0D,EAAMC,GAAuBza,KAAKkkE,eACxC0J,GACEpzD,EACA,WACAxa,KAAK8vE,YACLvC,IAEFK,GACEpzD,EACA,YACAxa,KAAK+uE,aACLxB,IAEEvtE,KAAKgwE,mBACPD,aAAa/vE,KAAKgwE,mBAEpBhwE,KAAKgwE,kBAAoBnoC,WAAW,KAGlC8lC,GACE3tE,KAAKkkE,cACL,GAAG0K,QACH5uE,KAAK8uE,cAEP9uE,KAAKgwE,kBAAoB,GACxB,IACL,CAMAH,UAAAA,CAAW3lD,GACTlqB,KAAKiwE,yBAAyB/lD,GAC9BlqB,KAAKuxE,YAAYrnD,GACjB,MAAMykD,EAAgB3uE,KAAKkkE,cACzB0K,EAAkB5uE,KAAKwuE,kBACzB,GAAIxuE,KAAK4xE,aAAa1nD,GAAI,CACxB,MAAM1P,EAAMC,GAAuBza,KAAKkkE,eACxC0J,GACEpzD,EACA,GAAGo0D,MACH5uE,KAAK6vE,YAEPjC,GACEpzD,EACA,GAAGo0D,QACH5uE,KAAK+uE,aACLxB,IAEFI,GACEgB,EACA,GAAGC,QACH5uE,KAAK+uE,aACLxB,GAEJ,CACAvtE,KAAK8qE,0BACP,CAMAiE,YAAAA,CAAa7kD,GACXlqB,KAAKiwE,yBAAyB/lD,GAE9B,MAAM2sC,EAAe72D,KAAK66C,mBACzB76C,KAAK2e,uBACFk4C,IAGCA,EAAa3R,oBAAoBh7B,KACpCA,EAAEC,gBACFD,EAAEC,iBACJnqB,KAAKkyE,cAAchoD,GACnBlqB,KAAK8qE,0BACP,CAKA+D,SAAAA,GACE7uE,KAAK8c,aACL9c,KAAK8qE,0BACP,CAOAqH,aAAAA,CAAczoE,GACZ,MAAMmtD,EAAe72D,KAAK66C,kBAI1B,QACIgc,KAAmBntD,GACpBmtD,GAAgBntD,GAAUmtD,IAAiBntD,CAEhD,CASA6nE,WAAAA,CAAYrnD,GAAkB,IAAAkoD,EAC5BpyE,KAAKkwE,aAAahmD,EAAG,aAErB,MAAMvb,EAAY3O,KAAKmiD,kBACjBkwB,EAAUryE,KAAKqwE,UACf3mE,OAAEA,GAAW1J,KAAK8oE,WAAW5+C,IAI7BooD,OAAEA,GAAWpoD,EACnB,GAAIooD,EAIF,aAHEtyE,KAAK2sE,iBAA8B,IAAX2F,GACvBtyE,KAAK0sE,gBAA6B,IAAX4F,IACxBtyE,KAAKkwE,aAAahmD,EAAG,OAIzB,GAAIlqB,KAAKulE,eAAiBvlE,KAAKylE,oBAE7B,YADAzlE,KAAKuyE,wBAAwBroD,GAI/B,IAAKlqB,KAAK4xE,aAAa1nD,GACrB,OAEF,IAcIuD,EAASM,EAdTykD,GAAe,EAKnB,GAJI7jE,IACF3O,KAAKgsE,0BAA0B9hD,GAC/BsoD,EAAe7jE,EAAUoqC,kBAEtBs5B,EAAS,CACZ,MAAMI,EAAkB/oE,IAAW1J,KAAKwjD,cACxCxjD,KAAK0yE,gBAAgBxoD,GAChBsoD,IACHA,EACExyE,KAAKmyE,cAAczoE,KACjB+oE,GAAmB/oE,IAAW1J,KAAKwjD,cAE3C,CAEA,GAAI95C,EAAQ,CACV,MAAMipE,EAAQjpE,EAAO+4C,YACnBziD,KAAKypE,iBAAiBv/C,GACtBH,GAAaG,KAET3oB,IAAEA,EAAGosB,QAAEA,GAAYglD,GAAS,CAAA,EAElC,GADA5kD,EAASxsB,EAEPmI,EAAO2I,YACP3I,IAAW1J,KAAKwjD,eACI,OAApB95C,EAAOg9C,SAEP1mD,KAAK0rE,gBAAgBhiE,EAAQwgB,GAC7BsoD,GAAe,OACV,GAAI7kD,EAAS,CAClB,MAAMwtB,EAAiBxtB,EAAQutB,kBAAkBhxB,EAAGxgB,EAAQikB,GACxDwtB,IACF1tB,EAAUztB,KAAKknE,cAAch9C,GAC7BixB,EAAexwC,KAAKgjB,EAASzD,EAAGvb,EAAY8e,EAAQzhB,EAAGyhB,EAAQ1hB,GAEnE,CACArC,EAAO26C,UAAW,CACpB,CAGA,GACE11C,IACCA,EAAUjF,SAAWA,GAAUiF,EAAUof,SAAWA,GACrD,CACA,MAAM6kD,EACFjkE,EAAUjF,QAAUiF,EAAUjF,OAAOskB,SAASrf,EAAUof,QAC1D8kD,EACED,GACAA,EAAgB13B,kBACdhxB,EACAvb,EAAUjF,OACVkpE,GAENnlD,EAAUA,GAAWztB,KAAKknE,cAAch9C,GACxC2oD,GACEA,EAAuBloE,KACrBioE,EACA1oD,EACAvb,EACA8e,EAAQzhB,EACRyhB,EAAQ1hB,EAEd,CACA/L,KAAK8yE,oBAAoB5oD,EAAGxgB,GAC5B1J,KAAKkwE,aAAahmD,EAAG,MACrBlqB,KAAKslE,eAAiB,KACtBtlE,KAAKmiD,kBAAoB,KAEzBz4C,IAAWA,EAAO64C,cAAW/hD,GACzBgyE,EACFxyE,KAAKyf,mBACK4yD,GAA+B,QAApBD,EAAEpyE,KAAKwjD,yBAAa4uB,GAAnBA,EAA+BjI,WACrDnqE,KAAK6lE,WAET,CAEAqL,kBAAAA,CACEF,EACA9uE,GAEA,MAAMwH,OAAEA,EAAMu/D,WAAEA,EAAa,IAAO/mE,EAIpClC,KAAK+K,KAAKimE,EAAW9uE,GACrBwH,GAAUA,EAAOqB,KAAKimE,EAAW9uE,GACjC,IAAK,IAAIiJ,EAAI,EAAGA,EAAI89D,EAAW1oE,OAAQ4K,IACrC89D,EAAW99D,KAAOzB,GAAUu/D,EAAW99D,GAAGJ,KAAKimE,EAAW9uE,GAE5D,OAAOA,CACT,CAQAguE,YAAAA,CACEhmD,EACA8mD,EACA+B,GAEA,MAAMrpE,OAAEA,EAAMu/D,WAAEA,GAAejpE,KAAK8oE,WAAW5+C,GAC7ChoB,EAAsC,CACpCgoB,IACAxgB,SACAu/D,gBACGwE,GAAeztE,KAAMkqB,GACxBvb,UAAW3O,KAAKmiD,qBACE,gBAAd6uB,GAA6C,SAAdA,EAC/B+B,EACA,CAAA,GAEU,cAAd/B,GAA2C,OAAdA,IAC9B9uE,EAAqCmwE,QAAUryE,KAAKqwE,UAEvDrwE,KAAK+K,KAAK,SAASimE,IAAa9uE,GAEhCwH,GAAUA,EAAOqB,KAAK,QAAQimE,IAAa9uE,GAC3C,IAAK,IAAIiJ,EAAI,EAAGA,EAAI89D,EAAW1oE,OAAQ4K,IACrC89D,EAAW99D,KAAOzB,GAChBu/D,EAAW99D,GAAGJ,KAAK,QAAQimE,IAAa9uE,EAE9C,CAMA8wE,yBAAAA,CAA0B9oD,GACxBlqB,KAAKylE,qBAAsB,EACvBzlE,KAAK66C,oBACP76C,KAAK0oE,oBAAoBx+C,GACzBlqB,KAAKyf,oBAGP,MAAMgO,EAAUztB,KAAKknE,cAAch9C,GACnClqB,KAAK0lE,kBACH1lE,KAAK0lE,iBAAiBuN,YAAYxlD,EAAS,CAAEvD,IAAGuD,YAClDztB,KAAKkwE,aAAahmD,EAAG,OAAQ,CAAE88C,iBAAiB,GAClD,CAMAkM,yBAAAA,CAA0BhpD,GACxB,GAAIlqB,KAAKylE,oBAAqB,CAC5B,MAAMh4C,EAAUztB,KAAKknE,cAAch9C,GACnClqB,KAAK0lE,kBACH1lE,KAAK0lE,iBAAiB0H,YAAY3/C,EAAS,CACzCvD,IAEAuD,WAEN,CACAztB,KAAKynE,UAAUznE,KAAKusE,mBACpBvsE,KAAKkwE,aAAahmD,EAAG,OACvB,CAMAqoD,uBAAAA,CAAwBroD,GACtB,MAAMuD,EAAUztB,KAAKknE,cAAch9C,GAC/BlqB,KAAK0lE,iBACP1lE,KAAKylE,sBAAwBzlE,KAAK0lE,iBAAiByN,UAAU,CAC3DjpD,EAAGA,EAEHuD,YAGFztB,KAAKylE,qBAAsB,EAE7BzlE,KAAKkwE,aAAahmD,EAAG,KACvB,CAUAonD,aAAAA,CAAcpnD,GACZlqB,KAAKqwE,UAAW,EAChBrwE,KAAKkwE,aAAahmD,EAAG,eAErB,IAAIxgB,OAAEA,GAAW1J,KAAK8oE,WAAW5+C,GAC7B88C,IAAoBt9D,GAAUA,IAAW1J,KAAKwjD,cAElD,MAAM8uB,OAAEA,GAAWpoD,EACnB,GAAIooD,EAMF,aALEtyE,KAAK2sE,iBAA8B,IAAX2F,GACvBtyE,KAAK0sE,gBAA6B,IAAX4F,IACxBtyE,KAAKkwE,aAAahmD,EAAG,OAAQ,CAC3B88C,qBAKN,GAAIhnE,KAAKulE,cAEP,YADAvlE,KAAKgzE,0BAA0B9oD,GAIjC,IAAKlqB,KAAK4xE,aAAa1nD,GACrB,OAIF,GAAIlqB,KAAKmiD,kBACP,OAGF,IAAIqwB,EAAexyE,KAAKmyE,cAAczoE,GAClC0pE,GAAU,EACd,GAAIpzE,KAAKqzE,qBAAqBnpD,EAAGxgB,GAE/BA,EAAS1J,KAAKwjD,cACd4vB,GAAU,EACVZ,GAAe,OACV,GAAIxyE,KAAKwmE,sBAAsBt8C,EAAGxgB,KACvC1J,KAAK0oE,oBAAoBx+C,GAGrBlqB,KAAKwoE,iBAAmBxoE,KAAK4oE,gBAAgB,CAC/C5oE,KAAK2oE,iBAAiB,CAAC3oE,KAAKwoE,iBAC5B,MAAM9+D,OAAEA,GAAW1J,KAAK8oE,WAAW5+C,GASnC,OAPIxgB,IAAW1J,KAAKwoE,iBAClBxoE,KAAKwoE,eAAiB,MAExBxoE,KAAK2oE,iBAAiB,MAEtB3oE,KAAK8qE,gCACL9qE,KAAKsxE,cAAcpnD,EAErB,CAQF,GACElqB,KAAK2lE,aACHj8D,IACEA,EAAO2I,aACL3I,EAAiBygE,WACnBzgE,IAAW1J,KAAKwjD,eACpB,CACA,MAAM90C,EAAI1O,KAAKknE,cAAch9C,GAC7BlqB,KAAKslE,eAAiB,CACpBt5D,EAAG0C,EAAE1C,EACLD,EAAG2C,EAAE3C,EACL40B,OAAQ,EACRgnC,OAAQ,EAEZ,CAIA,GADAX,IAAoBt9D,GAAUA,IAAW1J,KAAKwjD,cAC1C95C,EAAQ,CACNA,EAAO2I,YAAkC,SAApB3I,EAAOg9C,UAC9B1mD,KAAK0rE,gBAAgBhiE,EAAQwgB,GAE/B,MAAM9W,EAAS1J,EAAO+4C,YACpBziD,KAAKypE,iBAAiBv/C,GACtBH,GAAaG,IAEf,GAAIxgB,IAAW1J,KAAKwjD,gBAAkBpwC,IAAWggE,GAAU,CACzDpzE,KAAK+mE,uBAAuB78C,EAAGxgB,EAAQs9D,GACvC,MAAMr5C,EAAUva,EAASA,EAAOua,aAAUntB,EACxCitB,EAAUztB,KAAKknE,cAAch9C,GAC7B+wB,EACEttB,GAAWA,EAAQqtB,oBAAoB9wB,EAAGxgB,EAAQikB,GACtDstB,GACEA,EAAiBtwC,KACfgjB,EACAzD,EACAlqB,KAAKmiD,kBACL10B,EAAQzhB,EACRyhB,EAAQ1hB,EAEd,CACF,CAGAymE,IAAiBxyE,KAAK+kE,sBAAmBvkE,GACzCR,KAAKkwE,aAAahmD,EAAG,OAAQ,CAAE88C,gBAAiBA,IAEhDwL,GAAgBxyE,KAAKyf,kBACvB,CAMAqrD,wBAAAA,GACE9qE,KAAK+oE,YAAc/oE,KAAKuqE,eAAiBvqE,KAAKyqE,iBAAcjqE,CAC9D,CAOAyvE,wBAAAA,CAAyB/lD,GAEvBlqB,KAAK8qE,2BACL9qE,KAAKuqE,eAAiBvqE,KAAKypE,iBAAiBv/C,GAC5ClqB,KAAKyqE,YAAcr/C,GACjBprB,KAAKuqE,oBACL/pE,EACAR,KAAK4e,mBAEP5e,KAAK+oE,YAAc/oE,KAAK8oE,WAAW5+C,GAE/BlqB,KAAKmiD,oBACPniD,KAAK+oE,YAAYr/D,OAAS1J,KAAKmiD,kBAAkBz4C,OAErD,CAWAwoE,aAAAA,CAAchoD,GAIZ,GAHAlqB,KAAKqwE,UAAW,EAChBrwE,KAAKkwE,aAAahmD,EAAG,eAEjBlqB,KAAKulE,cAEP,YADAvlE,KAAKkzE,0BAA0BhpD,GAIjC,IAAKlqB,KAAK4xE,aAAa1nD,GACrB,OAGF,MAAMopD,EAAgBtzE,KAAKslE,eAG3B,GAAIgO,EAAe,CACjB,MAAM7lD,EAAUztB,KAAKknE,cAAch9C,GAEnCopD,EAAc3L,OAASl6C,EAAQzhB,EAAIsnE,EAActnE,EACjDsnE,EAAc3yC,OAASlT,EAAQ1hB,EAAIunE,EAAcvnE,EAEjD/L,KAAK6lE,WACP,MAAO,GAAK7lE,KAAKmiD,kBAKfniD,KAAKuzE,iBAAiBrpD,OALY,CAClC,MAAMxgB,OAAEA,GAAW1J,KAAK8oE,WAAW5+C,GACnClqB,KAAK8yE,oBAAoB5oD,EAAGxgB,GAC5B1J,KAAKwzE,mBAAmBtpD,EAAGxgB,EAC7B,CAGA1J,KAAKyzE,mBAAmBrG,YAAYljD,GACpClqB,KAAKkwE,aAAahmD,EAAG,OACvB,CAQAspD,kBAAAA,CAAmBtpD,EAAkBxgB,GACnC,MAAMw7D,eAAEA,EAAcC,gBAAEA,GAAoBnlE,MAC1CipE,WAAEA,GAAejpE,KAAK8oE,WAAW5+C,GACjC3pB,EAASmE,KAAKC,IAAIwgE,EAAgB5kE,OAAQ0oE,EAAW1oE,QAEvDP,KAAK0zE,yBAAyB,QAAS,CACrCxpD,IACAxgB,SACAiqE,UAAWzO,EACX0O,YAAY,IAEd,IAAK,IAAIzoE,EAAI,EAAGA,EAAI5K,EAAQ4K,IAExB89D,EAAW99D,KAAOzB,GACjBy7D,EAAgBh6D,IAAMg6D,EAAgBh6D,KAAO+5D,GAIhDllE,KAAK0zE,yBAAyB,QAAS,CACrCxpD,IACAxgB,OAAQu/D,EAAW99D,GACnBwoE,UAAWxO,EAAgBh6D,KAG/BnL,KAAKklE,eAAiBx7D,EACtB1J,KAAKmlE,gBAAkB8D,CACzB,CAQAgI,qBAAAA,CACE/mD,EACAxgB,EACAkc,GAEA,MAAMiuD,EAAoB7zE,KAAK+wE,mBAC7B5L,EAAkBnlE,KAAKmlE,iBACvB8D,WAAEA,GAAejpE,KAAK8oE,WAAW5+C,GACjC3pB,EAASmE,KAAKC,IAAIwgE,EAAgB5kE,OAAQ0oE,EAAW1oE,QAEvDP,KAAK0zE,yBAAyB,OAAQ,IACjC9tD,EACHlc,SACAiqE,UAAWE,EACXD,YAAY,IAEd,IAAK,IAAIzoE,EAAI,EAAGA,EAAI5K,EAAQ4K,IAC1BnL,KAAK0zE,yBAAyB,OAAQ,IACjC9tD,EACHlc,OAAQu/D,EAAW99D,GACnBwoE,UAAWxO,EAAgBh6D,KAG/BnL,KAAK+wE,mBAAqBrnE,CAC5B,CAcAgqE,wBAAAA,CACEhrE,EAAO5D,GAYP,IAXA4E,OACEA,EAAMiqE,UACNA,EAASC,WACTA,EAAU1pD,EACVA,KACGtE,GAKJ9gB,EAED,MAAMkpE,SAAEA,EAAQC,UAAEA,EAASC,SAAEA,EAAQC,UAAEA,GACrCN,GAAqBnlE,GACjBorE,EAAgBH,IAAcjqE,EAEpC,GAAIiqE,GAAaG,EAAe,CAC9B,MAAMC,EAAyC,IAC1CnuD,EACHsE,IACAxgB,OAAQiqE,EACRK,WAAYtqE,KACT+jE,GAAeztE,KAAMkqB,IAE1B0pD,GAAc5zE,KAAK+K,KAAKojE,EAAW4F,GACnCJ,EAAU5oE,KAAKkjE,EAAW8F,EAC5B,CACA,GAAIrqE,GAAUoqE,EAAe,CAC3B,MAAMG,EAAuC,IACxCruD,EACHsE,IACAxgB,SACAwqE,eAAgBP,KACblG,GAAeztE,KAAMkqB,IAE1B0pD,GAAc5zE,KAAK+K,KAAKmjE,EAAU+F,GAClCvqE,EAAOqB,KAAKijE,EAAUiG,EACxB,CACF,CAMAV,gBAAAA,CAAiBrpD,GACf,MAAMwjD,EAAa1tE,KAAKknE,cAAch9C,GACpCvb,EAAY3O,KAAKmiD,kBACjBz4C,EAASiF,EAAUjF,OAGnByqE,EAAezqE,EAAOgjC,MAClBthB,GACEsiD,OACAltE,EACAkJ,EAAOgjC,MAAMzO,uBAEfyvC,EACN/+D,EAAU64D,SAAWt9C,EAAEs9C,SACvB74D,EAAUy4D,SAAWpnE,KAAKqnE,aAAen9C,EAAElqB,KAAKqnE,aAEhDrnE,KAAKo0E,wBAAwBlqD,EAAGvb,EAAWwlE,GAC3CxlE,EAAUoqC,iBAAmB/4C,KAAKyf,kBACpC,CAKA20D,uBAAAA,CACElqD,EACAvb,EACA8e,GAEA,MAAM20B,OAAEA,EAAMvJ,cAAEA,EAAanvC,OAAEA,GAAWiF,EAEpCoqC,IACFF,GAAiBA,EAAc3uB,EAAGvb,EAAW8e,EAAQzhB,EAAGyhB,EAAQ1hB,GACpEgtC,GAAmBrvC,EAAOgW,YAGX,SAAX0iC,GAAqBrJ,IACvBpqC,EAAUjF,OAAO26C,UAAW,EAC5BrkD,KAAKynE,UAAU94D,EAAUjF,OAAOk9C,YAAc5mD,KAAK4mD,aAErDj4C,EAAUoqC,gBAAkBpqC,EAAUoqC,iBAAmBA,CAC3D,CAQA+5B,mBAAAA,CAAoB5oD,EAAkBxgB,GACpC,IAAKA,EAEH,YADA1J,KAAKynE,UAAUznE,KAAKssE,eAGtB,IAAI3lB,EAAcj9C,EAAOi9C,aAAe3mD,KAAK2mD,YAC7C,MAAM0tB,EAAkB/5D,GAAkBta,KAAKwjD,eACzCxjD,KAAKwjD,cACL,KAEJz1B,IACIsmD,GAAmB3qE,EAAOgjC,QAAU2nC,IAItC3qE,EAAO+4C,YAAYziD,KAAKypE,iBAAiBv/C,IAE7C,GAAK6D,EAaE,CACL,MAAMJ,QAAEA,EAAOC,MAAEA,GAAUG,EAC3B/tB,KAAKynE,UAAU95C,EAAQytB,mBAAmBlxB,EAAGyD,EAASjkB,EAAQkkB,GAChE,KAhBa,CACX,GAAKlkB,EAAiB2sD,eAAgB,CAGpC,MAAM4S,WAAEA,GAAejpE,KAAK8oE,WAAW5+C,GACvC++C,EACG/9D,SACAopE,UACAvzE,QAASwzE,IACR5tB,EAAc4tB,EAAQ5tB,aAAeA,GAE3C,CACA3mD,KAAKynE,UAAU9gB,EACjB,CAIF,CAeU0sB,oBAAAA,CAAqBnpD,EAAkBxgB,GAC/C,MAAMmtD,EAAe72D,KAAKwjD,cACpBgxB,EAAOl6D,GAAkBu8C,GAC/B,GAEIA,GACF72D,KAAKqmE,uBAAuBn8C,IAC5BlqB,KAAK2lE,WAEHj8D,GACFA,EAAO2I,aAGNwkD,IAAiBntD,GAAU8qE,KAG3BA,IACG9qE,EAAOktC,eAAeigB,KACrBA,EAAajgB,eAAeltC,MAEhCA,EAAOu7C,SAAS,CAAE/6B,QAElB2sC,EAAavU,mBACd,CACA,GAAIkyB,EAAM,CACR,MAAMC,EAAoB5d,EAAa3mD,aACvC,IAAI+4D,EAA6B,GAEjC,GAAIv/D,IAAWmtD,EAAc,CAC3B,MAAMppC,EAAUztB,KAAKknE,cAAch9C,GACnC,IAAIk/C,EAAappE,KAAKyoE,sBACpBgM,EACAhnD,GAYF,GATI27C,EAAW1/D,QACbA,EAAS0/D,EAAW1/D,OACpBu/D,EAAaG,EAAWH,aAExBG,EAAappE,KAAKyoE,sBAAsBzoE,KAAKgP,SAAUye,GACvD/jB,EAAS0/D,EAAW1/D,OACpBu/D,EAAaG,EAAWH,aAGrBv/D,IAAWA,EAAO2I,WACrB,OAAO,CAEX,CACI3I,EAAOgjC,QAAUmqB,GAEnBA,EAAa9tD,OAAOW,GACpB1J,KAAKklE,eAAiBx7D,EACtB1J,KAAKmlE,gBAAkB8D,EAEK,IAAxBpS,EAAapnD,QAGfzP,KAAK4rE,iBAAiB/U,EAAarmD,KAAK,GAAI0Z,KAI9C2sC,EAAa6d,eAAehrE,GAC5B1J,KAAKklE,eAAiBrO,EACtB72D,KAAKmlE,gBAAkB8D,GAEzBjpE,KAAKqrE,qBAAqBoJ,EAAmBvqD,EAC/C,KAAO,CACJ2sC,EAAuBsT,WACrBtT,EAAuBsW,cAE1B,MAEMwH,EAAqB,IADzB1sE,EAAcI,SAAiC,mBACtB,CAAU,GAAI,CAKvClF,OAAQnD,OAEV20E,EAAmBD,eAAe7d,EAAcntD,GAChD1J,KAAKklE,eAAiByP,EAItB30E,KAAK4rE,iBAAiB+I,EAAoBzqD,GAC1ClqB,KAAKqrE,qBAAqB,CAACxU,GAAe3sC,EAC5C,CACA,OAAO,CACT,CACA,OAAO,CACT,CASUwoD,eAAAA,CAAgBxoD,GACxB,IAAKlqB,KAAK2lE,YAAc3lE,KAAKslE,eAC3B,OAAO,EAET,MAAMt5D,EAAEA,EAACD,EAAEA,EAAC47D,OAAEA,EAAMhnC,OAAEA,GAAW3gC,KAAKslE,eACpCsP,EAAS,IAAI9oE,GAAME,EAAGD,GACtB8oE,EAASD,EAAO3oE,IAAI,IAAIH,GAAM67D,EAAQhnC,IACtCxuB,EAAKyiE,EAAOpnE,IAAIqnE,GAEhBplE,EADKmlE,EAAOjwE,IAAIkwE,GACNtoE,SAAS4F,GAEf2iE,EAAmB90E,KAAK6R,eAC5B,CACEC,KAAMK,EAAGnG,EACT+F,IAAKI,EAAGpG,EACRiG,MAAOvC,EAAKzD,EACZiG,OAAQxC,EAAK1D,GAEf,CAAEmG,qBAAsBlS,KAAKqsE,0BAGzB78D,EAGJolE,EAAO3nE,GAAG4nE,GACNC,EAAiB,GACf,CAACA,EAAiB,IAClB,GACFA,EAAiBv0E,OAAS,EACxBu0E,EACGtrE,OAAQ6F,IAAYA,EAAO41C,SAAS,CAAE/6B,OACtCoqD,UAEHQ,EAGR,GAAuB,IAAnBtlE,EAAQjP,OAEVP,KAAK0rE,gBAAgBl8D,EAAQ,GAAI0a,QAC5B,GAAI1a,EAAQjP,OAAS,EAAG,CAE7B,MAAMw0E,EACJ9sE,EAAcI,SAAiC,mBACjDrI,KAAK0rE,gBAAgB,IAAIqJ,EAAMvlE,EAAS,CAAErM,OAAQnD,OAASkqB,EAC7D,CAIA,OADAlqB,KAAKslE,eAAiB,MACf,CACT,CAKArkD,KAAAA,GACEjhB,KAAKyzE,mBAAmBxyD,QACxB7gB,MAAM6gB,OACR,CAKAkI,OAAAA,GACEnpB,KAAK4vE,kBACL5vE,KAAKyzE,mBAAmBpvE,UACxBjE,MAAM+oB,SACR,ECzjDK,MAAM6rD,GAAsB,CACjClY,GAAI,EACJC,GAAI,EACJQ,GAAI,EACJC,GAAI,GAGOyX,GAAsB,IAC9BD,GACHppC,GAAI,EACJC,GAAI,GCJOqpC,GAAQA,CAAC5pE,EAAe6pE,IAC5BxpB,MAAMrgD,IAAgC,iBAAf6pE,EAA0BA,EAAa7pE,ECJjE8pE,GAAa,uBAEZ,SAASC,GAAU/pE,GACxB,OAAOA,GAAS8pE,GAAWvmB,KAAKvjD,EAClC,CAQO,SAASgqE,GACdhqE,EACA6pE,GAEA,MAAMxlB,EACa,iBAAVrkD,EACHA,EACiB,iBAAVA,EACLoO,WAAWpO,IAAU+pE,GAAU/pE,GAAS,IAAM,GAC9CiqE,IACR,OAAOnyC,GAAS,EAAG8xC,GAAMvlB,EAAQwlB,GAAa,EAChD,CCrBA,MAAMK,GAAqB,UACrBC,GAAe,UAErB,SAASC,GAAer6D,EAAoBs6D,GAC1C,IAAI/4C,EAAYC,EAChB,MAAM1hB,EAAQE,EAAG+xC,aAAa,SAC9B,GAAIjyC,EAAO,CACT,MAAMy6D,EAAgBz6D,EAAMogB,MAAMi6C,IAEc,KAA5CI,EAAcA,EAAcr1E,OAAS,IACvCq1E,EAAch+B,MAGhB,IAAK,IAAIzsC,EAAIyqE,EAAcr1E,OAAQ4K,KAAO,CACxC,MAAO5J,EAAK+J,GAASsqE,EAAczqE,GAChCowB,MAAMk6C,IACNn9D,IAAKggB,GAAMA,EAAEgE,QACJ,eAAR/6B,EACFq7B,EAAatxB,EACI,iBAAR/J,IACTs7B,EAAevxB,EAEnB,CACF,CAEAsxB,EAAaA,GAAcvhB,EAAG+xC,aAAa,eAAiB,aAC5DvwB,EAAeq4C,GACbx7D,WAAWmjB,GAAgBxhB,EAAG+xC,aAAa,iBAAmB,IAC9D,GAGF,MAAMp0B,EAAQ,IAAID,GAAM6D,GAIxB,OAFA5D,EAAMiB,SAASjB,EAAMgB,WAAa6C,EAAe84C,GAE1C,CACL34D,OAAQs4D,GAAaj6D,EAAG+xC,aAAa,UAAW,GAChDp0B,MAAOA,EAAMU,SAEjB,CAEO,SAASm8C,GACdx6D,EACAy6D,GAEA,MAAMC,EAA0B,GAC9BC,EAAe36D,EAAG46D,qBAAqB,QACvC7tD,EAAaktD,GAAaQ,EAAa,GACzC,IAAK,IAAI3qE,EAAI6qE,EAAaz1E,OAAQ4K,KAChC4qE,EAAW3rE,KAAKsrE,GAAeM,EAAa7qE,GAAIid,IAElD,OAAO2tD,CACT,CCvDO,SAASG,GAAU76D,GACxB,MAAuB,mBAAhBA,EAAG6xC,UAAiD,mBAAhB7xC,EAAG6xC,SAC1C,SACA,QACN,CAEO,SAASipB,GAAmB96D,GACjC,MAA4C,mBAArCA,EAAG+xC,aAAa,iBACnB,SACA,YACN,CC+BA,SAASgpB,GAAS/6D,EAAwB9Z,GACxC,OAAO8Z,EAAG+xC,aAAa7rD,EACzB,CAsBO,SAAS80E,GAAYh7D,EAAwB5L,GAClD,OA/DF,SAIE6mE,EAA2CxxE,GAE3C,IACIyxE,GAFJvkE,MAAEA,EAAKC,OAAEA,EAAMgiC,cAAEA,GAAyDnvC,EAG1E,OAAQrE,OAAOU,KAAKm1E,GAAyBj1E,OAC3C,CAACC,EAAKsR,KACJ,MAAM4jE,EAAYF,EAAgB1jE,GAsBlC,MArBkB,aAAd4jE,EACFD,EAAa,EACU,cAAdC,EACTD,EAAa,GAEbA,EACuB,iBAAdC,EAAyB98D,WAAW88D,GAAaA,EACjC,iBAAdA,GAA0BnB,GAAUmB,KAC7CD,GAAc,IACQ,WAAlBtiC,IAEW,OAATrhC,GAA0B,OAATA,GAA0B,OAATA,IACpC2jE,GAAcvkE,GAEH,OAATY,GAA0B,OAATA,IACnB2jE,GAActkE,MAKtB3Q,EAAIsR,GAAQ2jE,EACLj1E,GAET,CAAA,EAEJ,CA2BSm1E,CACa,WAAlBP,GAAU76D,GAtBP,SAA2BA,GAChC,MAAO,CACLyhD,GAAIsZ,GAAS/6D,EAAI,OAAS,EAC1B0hD,GAAIqZ,GAAS/6D,EAAI,OAAS,EAC1BkiD,GAAI6Y,GAAS/6D,EAAI,OAAS,OAC1BmiD,GAAI4Y,GAAS/6D,EAAI,OAAS,EAE9B,CAeiCq7D,CAAkBr7D,GAb5C,SAA2BA,GAChC,MAAO,CACLyhD,GAAIsZ,GAAS/6D,EAAI,OAAS+6D,GAAS/6D,EAAI,OAAS,MAChD0hD,GAAIqZ,GAAS/6D,EAAI,OAAS+6D,GAAS/6D,EAAI,OAAS,MAChDuwB,GAAI,EACJ2xB,GAAI6Y,GAAS/6D,EAAI,OAAS,MAC1BmiD,GAAI4Y,GAAS/6D,EAAI,OAAS,MAC1BwwB,GAAIuqC,GAAS/6D,EAAI,MAAQ,MAE7B,CAIyDs7D,CAAkBt7D,GACvE,IACK5L,EACHwkC,cAAekiC,GAAmB96D,IAGxC,CC/CO,MAAMu7D,GAyEX92E,WAAAA,CAAYoC,GACV,MAAMwG,KACJA,EAAO,SAAaurC,cACpBA,EAAgB,SAAQjH,OACxBA,EAAS,CAAA,EAAE+oC,WACXA,EAAa,GAAE17D,QACfA,EAAU,EAAC6J,QACXA,EAAU,EAACE,kBACXA,EAAiB9Q,GACjBA,GACEpR,GAAW,CAAA,EACfzB,OAAOC,OAAOV,KAAM,CAClB0I,OACAurC,gBACAjH,OAAQ,IACO,WAATtkC,EAAoBusE,GAAsBD,MAC3ChoC,GAEL+oC,aACA17D,UACA6J,UACAE,oBACA9Q,GAAIA,EAAK,GAAGA,KAAMC,OAAUA,MAEhC,CAOAsjE,YAAAA,CAAad,GACX,IAAK,MAAM36D,KAAY26D,EACrB/1E,KAAK+1E,WAAW3rE,KAAK,CACnB4S,OAAQtD,WAAW0B,GACnB4d,MAAO+8C,EAAW36D,KAGtB,OAAOpb,IACT,CAOAma,QAAAA,CACE8K,GAEA,MAAO,IACF9L,GAAKnZ,KAAMilB,GACdvc,KAAM1I,KAAK0I,KACXskC,OAAQ,IAAKhtC,KAAKgtC,QAClB+oC,WAAY/1E,KAAK+1E,WAAWz9D,IAAKw+D,IAAS,IAAWA,KACrDz8D,QAASra,KAAKqa,QACd6J,QAASlkB,KAAKkkB,QACd+vB,cAAej0C,KAAKi0C,cACpB7vB,kBAAmBpkB,KAAKokB,kBACpB,IAAIpkB,KAAKokB,wBACT5jB,EAER,CAQAylB,KAAAA,CACE5W,GAIA,IAFE6X,oBAAqB6vD,GACYz2E,UAAAC,OAAA,QAAAC,IAAAF,UAAA,GAAAA,UAAA,GAAG,CAAA,EAEtC,MAAM4lB,EAAS,GACbvX,EACE3O,KAAKokB,kBACDpkB,KAAKokB,kBAAkBlZ,SACvB/E,EAAQ+E,SAEd+oC,EACyB,WAAvBj0C,KAAKi0C,cACD,iBACA,oBAEF8hC,EAAa/1E,KAAK+1E,WACrBz9D,IAAKw+D,IAAS,IAAWA,KACzBE,KAAK,CAACliE,EAAGG,IACDH,EAAEkI,OAAS/H,EAAE+H,QAGxB,IAAI3C,GAAWra,KAAKqa,QAClB6J,GAAWlkB,KAAKkkB,QnGhKCpV,MmGiKG,sBAAlBmlC,GACF55B,GAAWhL,EAAO2C,MAClBkS,GAAW7U,EAAO4C,SAElBoI,GAAWhL,EAAO2C,MAAQ,EAC1BkS,GAAW7U,EAAO4C,OAAS,InGtKVnD,EmGyKRO,InGpK2C,mBAA9CP,EAAsBmoE,qBmGoKe,eAAvBj3E,KAAKi0C,gBACzB55B,GAAWhL,EAAOq0D,WAAW13D,EAC7BkY,GAAW7U,EAAOq0D,WAAW33D,GAE/B4C,EAAU,IAAM0L,EAChB1L,EAAU,IAAMuV,EAEhB,MAAMi/C,EAAmB,CACvB,aAAanjE,KAAKsT,MAClB,kBAAkB2gC,KAClB,sBACE8iC,EAAeA,EAAe,IAAM,KACnCn9D,GAAYjL,MACf,IACAmL,KAAK,KAEP,GAAkB,WAAd9Z,KAAK0I,KAAmB,CAC1B,MAAMo0D,GAAEA,EAAEC,GAAEA,EAAEQ,GAAEA,EAAEC,GAAEA,GAAOx9D,KAAKgtC,OAChC9mB,EAAO9b,KACL,mBACA+4D,EACA,QACArG,EACA,SACAC,EACA,SACAQ,EACA,SACAC,EACA,OAEJ,MAAO,GAAkB,WAAdx9D,KAAK0I,KAAmB,CACjC,MAAMo0D,GAAEA,EAAEC,GAAEA,EAAEQ,GAAEA,EAAEC,GAAEA,EAAE5xB,GAAEA,EAAEC,GAAEA,GAAO7rC,KAChCgtC,OACGkqC,EAAYtrC,EAAKC,EAEvB3lB,EAAO9b,KACL,mBACA+4D,EACA,QACA+T,EAAYpa,EAAKS,EACjB,SACA2Z,EAAYna,EAAKS,EACjB,QACA0Z,EAAYtrC,EAAKC,EACjB,SACAqrC,EAAY3Z,EAAKT,EACjB,SACAoa,EAAY1Z,EAAKT,EACjB,QAEEma,IAEFnB,EAAWzB,UACXyB,EAAWh1E,QAAS+1E,IAClBA,EAAU95D,OAAS,EAAI85D,EAAU95D,UAGrC,MAAMm6D,EAAYzyE,KAAK8I,IAAIo+B,EAAIC,GAC/B,GAAIsrC,EAAY,EAAG,CAEjB,MACEC,EAAkBD,EADFzyE,KAAKC,IAAIinC,EAAIC,GAE/BkqC,EAAWh1E,QAAS+1E,IAClBA,EAAU95D,QAAUo6D,GAAmB,EAAIN,EAAU95D,SAEzD,CACF,CAaA,OAXA+4D,EAAWh1E,QAAQ+D,IAAuB,IAAtBk0B,MAAEA,EAAKhc,OAAEA,GAAQlY,EACnCohB,EAAO9b,KACL,iBAA0B,IAAT4S,yBAAoCgc,aAIzD9S,EAAO9b,KACS,WAAdpK,KAAK0I,KAAoB,oBAAsB,oBAC/C,MAGKwd,EAAOpM,KAAK,GACrB,CAQAG,MAAAA,CAAO0B,GACL,MAAMmhD,GAAEA,EAAEC,GAAEA,EAAEQ,GAAEA,EAAEC,GAAEA,EAAE5xB,GAAEA,EAAEC,GAAEA,GAAO7rC,KAAKgtC,OAClCqqC,EACU,WAAdr3E,KAAK0I,KACDiT,EAAI27D,qBAAqBxa,EAAIC,EAAIQ,EAAIC,GACrC7hD,EAAI47D,qBAAqBza,EAAIC,EAAInxB,EAAI2xB,EAAIC,EAAI3xB,GAMnD,OAJA7rC,KAAK+1E,WAAWh1E,QAAQwJ,IAAuB,IAAtByuB,MAAEA,EAAKhc,OAAEA,GAAQzS,EACxC8sE,EAASR,aAAa75D,EAAQgc,KAGzBq+C,CACT,CAQA,uBAAa9+D,CACXrW,GAEA,MAAM6zE,WAAEA,EAAU3xD,kBAAEA,GAAsBliB,EAC1C,OAAO,IAAIlC,KAAK,IACXkC,EACH6zE,WAAYA,EACRA,EAAWz9D,IAAKw+D,IAAS,IAAWA,UACpCt2E,EACJ4jB,kBAAmBA,EAAoB,IAAIA,QAAqB5jB,GAEpE,CA6CA,kBAAOixD,CACLp2C,EACAzC,EACA4+D,GAEA,MAAMvjC,EAAgBkiC,GAAmB96D,GACnC0J,EAASnM,EAAS88B,yBACxB,OAAO,IAAI11C,KAAK,CACdsT,GAAI+H,EAAG+xC,aAAa,YAAS5sD,EAC7BkI,KAAMwtE,GAAU76D,GAChB2xB,OAAQqpC,GAAYh7D,EAAI,CACtBrJ,MAAOwlE,EAAWC,cAAgBD,EAAWxlE,MAC7CC,OAAQulE,EAAWE,eAAiBF,EAAWvlE,SAEjD8jE,WAAYF,GAAgBx6D,EAAIm8D,EAAWz6C,SAC3CkX,gBACA7vB,kBAAmBsqC,GACjBrzC,EAAG+xC,aAAa,sBAAwB,OAEpB,WAAlBnZ,EACA,CACE55B,QAASzB,EAAS5G,MAAQ,EAAI+S,EAAO/Y,EACrCkY,QAAStL,EAAS3G,OAAS,EAAI8S,EAAOhZ,GAExC,CACEsO,QAAS,EACT6J,QAAS,IAGnB,EAhTAnkB,EAjEW62E,GAAQ,OAuEL,YA8ShB3uE,EAAcM,SAASquE,GAAU,YACjC3uE,EAAcM,SAASquE,GAAU,UACjC3uE,EAAcM,SAASquE,GAAU,UChY1B,MAAMe,GAWX,QAAIjvE,GACF,MAAO,SACT,CAEA,QAAIA,CAAK4C,GACP9J,EAAI,OAAQ,6BAA8B8J,EAC5C,CAsDAxL,WAAAA,CAAYoC,GAAyBnC,gBAhDb,UAExBA,iBAIU,GAEVA,iBAIU,GAEVA,qBAG4B,IAgC1BC,KAAKsT,GAAKC,KACV9S,OAAOC,OAAOV,KAAMkC,EACtB,CAKA01E,aAAAA,GACE,QACI53E,KAAKoZ,QAA2D,iBAAzCpZ,KAAKoZ,OAA4BxB,GAE9D,CAKAigE,cAAAA,GACE,QAAS73E,KAAKoZ,UAAapZ,KAAKoZ,OAA6BtF,SAC/D,CAEAgkE,cAAAA,GACE,OAAO93E,KAAK43E,gBACR53E,KAAKoZ,OAAOxB,IACZ5X,KAAK63E,iBACH73E,KAAKoZ,OAAOtF,YACZ,EACR,CAOAmG,MAAAA,CAAO0B,GACL,OAEG3b,KAAKoZ,UAELpZ,KAAK43E,iBACF53E,KAAKoZ,OAAO2+D,UACiB,IAA7B/3E,KAAKoZ,OAAO4+D,cACkB,IAA9Bh4E,KAAKoZ,OAAO6+D,eAKXt8D,EAAI85B,cAAcz1C,KAAKoZ,OAAQpZ,KAAK0nB,QAHlC,IAIX,CAOAvN,QAAAA,GAAkE,IAAzD8K,EAA6B3kB,UAAAC,OAAA,QAAAC,IAAAF,UAAA,GAAAA,UAAA,GAAG,GACvC,MAAMonB,OAAEA,EAAMnQ,YAAEA,GAAgBvX,KAChC,MAAO,IACFmZ,GAAKnZ,KAAMilB,GACdvc,KAAM,UACN0Q,OAAQpZ,KAAK83E,iBACbpwD,SACAnQ,cACA8C,QAASd,GAAQvZ,KAAKqa,QAASla,EAAO0Z,qBACtCqK,QAAS3K,GAAQvZ,KAAKkkB,QAAS/jB,EAAO0Z,qBACtCwK,iBAAkBrkB,KAAKqkB,iBACnB,IAAIrkB,KAAKqkB,kBACT,KAER,CAMA4B,KAAAA,CAAKnhB,GAAmC,IAAlCkN,MAAEA,EAAKC,OAAEA,GAAenN,EAC5B,MAAQsU,OAAQ8+D,EAAaxwD,OAAEA,EAAMpU,GAAEA,GAAOtT,KAC5Cm4E,EAAiBjD,GAAMl1E,KAAKqa,QAAUrI,EAAO,GAC7ComE,EAAiBlD,GAAMl1E,KAAKkkB,QAAUjS,EAAQ,GAUhD,MAAO,CACL,sBAAsBqB,SAAU6kE,SAAsBC,aATzC,aAAX1wD,GAAoC,cAAXA,EACrB,EAAIhjB,KAAKgH,IAAIysE,GAAkB,GAC/BjD,GAAOgD,EAAmClmE,MAAQA,EAAO,eAElD,aAAX0V,GAAoC,cAAXA,EACrB,EAAIhjB,KAAKgH,IAAI0sE,GAAkB,GAC/BlD,GAAOgD,EAAmCjmE,OAASA,EAAQ,OAIjE,6BACGimE,EAAmClmE,kBAEnCkmE,EAAmCjmE,uBACrBjS,KAAK83E,6BACtB,aACA,IACAh+D,KAAK,KACT,CAGA,uBAAavB,CAAUhO,EAOrBrI,GACkB,IAPlBwG,KACEA,EAAI0Q,OACJA,EAAMiL,iBACNA,KACGqG,GACsBngB,EAG3B,MAAMmN,QAAYN,GAAUgC,EAAQ,IAC/BlX,EACHqV,YAAamT,EAAanT,cAE5B,OAAO,IAAIvX,KAAK,IACX0qB,EACHrG,iBACEA,GAAqBA,EAAiB0V,MAAM,GAC9C3gB,OAAQ1B,GAEZ,EACD3X,EAhMY43E,GAAO,OACJ,WAiMhB1vE,EAAcM,SAASovE,IAEvB1vE,EAAcM,SAASovE,GAAS,WC9MzB,MAAeU,GA0DpBv4E,WAAAA,CAAYqD,GAzDZpD,eAIQ,gBAERA,eAIQ,GAERA,gBAMwB,MAExBA,uBAI+B,SAE/BA,wBAIiC,SAEjCA,0BAImB,IAEnBA,yBAImC,MAEnCA,8BAMsB,GAQpBC,KAAKmD,OAASA,CAChB,CAeA4nE,eAAAA,CAAgBpvD,GACdA,EAAIw4B,YAAcn0C,KAAKg5B,MACvBrd,EAAIi4B,UAAY5zC,KAAKgS,MACrB2J,EAAIk4B,QAAU7zC,KAAKu9B,cACnB5hB,EAAIq4B,WAAah0C,KAAKy9B,iBACtB9hB,EAAIo4B,SAAW/zC,KAAKw9B,eACpB7hB,EAAI64B,YAAYx0C,KAAKq9B,iBAAmB,GAC1C,CAOUi7C,iBAAAA,CAAkB38D,GAC1B,MAAMsG,EAAIjiB,KAAKmD,OAAOyb,kBACtBjD,EAAI2G,OACJ3G,EAAIhN,UAAUsT,EAAE,GAAIA,EAAE,GAAIA,EAAE,GAAIA,EAAE,GAAIA,EAAE,GAAIA,EAAE,GAChD,CAEUs2D,eAAAA,GAER,OADc,IAAIx/C,GAAM/4B,KAAKg5B,OAChBgB,WAAa,KAAOh6B,KAAK69B,MACxC,CAMUoU,UAAAA,GACR,IAAKjyC,KAAK69B,SAAW79B,KAAKmD,OACxB,OAGF,MAAMA,EAASnD,KAAKmD,OAClB06B,EAAS79B,KAAK69B,OACdliB,EAAMxY,EAAOmuC,WACb7oB,EAAOtlB,EAAOgd,UAAYhd,EAAOwc,mBAEnChE,EAAIm5B,YAAcjX,EAAO7E,MACzBrd,EAAIo5B,WAAalX,EAAOiF,KAAOra,EAC/B9M,EAAIs5B,cAAgBpX,EAAOxjB,QAAUoO,EACrC9M,EAAIu5B,cAAgBrX,EAAO3Z,QAAUuE,CACvC,CAMU+vD,YAAAA,GACR,MAAM78D,EAAM3b,KAAKmD,OAAOmuC,WAExB31B,EAAIm5B,YAAc,GAClBn5B,EAAIo5B,WAAap5B,EAAIs5B,cAAgBt5B,EAAIu5B,cAAgB,CAC3D,CAOUujC,gBAAAA,CAAiBhrD,GACzB,OACEA,EAAQzhB,EAAI,GACZyhB,EAAQzhB,EAAIhM,KAAKmD,OAAO0c,YACxB4N,EAAQ1hB,EAAI,GACZ0hB,EAAQ1hB,EAAI/L,KAAKmD,OAAO2c,WAE5B,ECxGK,MAAM44D,WAIH9oC,GAuBR9vC,WAAAA,CACEoiB,GAGA,IADEA,KAAM7N,EAACvC,KAAEA,EAAIC,IAAEA,KAAQ7P,GAAyB5B,UAAAC,OAAA,QAAAC,IAAAF,UAAA,GAAAA,UAAA,GAAG,CAAA,EAErDF,QACAK,OAAOC,OAAOV,KAAM04E,GAAKt5D,aACzBpf,KAAK8vC,WAAW5tC,GAChBlC,KAAK24E,SAASz2D,GAAQ,IAAI,GACV,iBAATpQ,GAAqB9R,KAAKyI,IAAIjC,EAAMsL,GAC5B,iBAARC,GAAoB/R,KAAKyI,IAAIhC,EAAKsL,EAC3C,CAQA4mE,QAAAA,CAASz2D,EAAiC02D,GACxC54E,KAAKkiB,KAAO26C,GAAgBj7D,MAAMmN,QAAQmT,GAAQA,EAAO4+C,GAAU5+C,IACnEliB,KAAK64E,eAAeD,EACtB,CAQAljC,sBAAAA,GACE,MAAMzqB,EAAOjrB,KAAK84E,sBAClB,OAAO,IAAIhtE,GAAMmf,EAAKnZ,KAAOmZ,EAAKjZ,MAAQ,EAAGiZ,EAAKlZ,IAAMkZ,EAAKhZ,OAAS,EACxE,CAMAglE,mBAAAA,CAAoBt7D,GAClB,MAAM4c,GAAKv4B,KAAK0jE,WAAW13D,EACzBuB,GAAKvN,KAAK0jE,WAAW33D,EAEvB4P,EAAIkI,YAEJ,IAAK,MAAMu8C,KAAWpgE,KAAKkiB,KACzB,OACEk+C,EAAQ,IAER,IAAK,IACHzkD,EAAIoI,OAAOq8C,EAAQ,GAAK7nC,EAAG6nC,EAAQ,GAAK7yD,GACxC,MAEF,IAAK,IACHoO,EAAImI,OAAOs8C,EAAQ,GAAK7nC,EAAG6nC,EAAQ,GAAK7yD,GACxC,MAEF,IAAK,IACHoO,EAAI61C,cACF4O,EAAQ,GAAK7nC,EACb6nC,EAAQ,GAAK7yD,EACb6yD,EAAQ,GAAK7nC,EACb6nC,EAAQ,GAAK7yD,EACb6yD,EAAQ,GAAK7nC,EACb6nC,EAAQ,GAAK7yD,GAEf,MAEF,IAAK,IACHoO,EAAIo9D,iBACF3Y,EAAQ,GAAK7nC,EACb6nC,EAAQ,GAAK7yD,EACb6yD,EAAQ,GAAK7nC,EACb6nC,EAAQ,GAAK7yD,GAEf,MAEF,IAAK,IACHoO,EAAIqI,YAIZ,CAMAkvB,OAAAA,CAAQv3B,GACN3b,KAAKi3E,oBAAoBt7D,GACzB3b,KAAKm1C,oBAAoBx5B,EAC3B,CAMA9N,QAAAA,GACE,MAAO,WAAW7N,KAAK+Q,2BAA2B/Q,KAAK+R,gBACrD/R,KAAK8R,SAET,CAOAqI,QAAAA,GAGsD,IAApD8K,EAAwB3kB,UAAAC,OAAA,QAAAC,IAAAF,UAAA,GAAAA,UAAA,GAAG,GAC3B,MAAO,IACFF,MAAM+Z,SAAS8K,GAClB/C,KAAMliB,KAAKkiB,KAAK5J,IAAK0gE,GAAYA,EAAQj/C,SAE7C,CAOA7U,gBAAAA,GAGsD,IAApDD,EAAwB3kB,UAAAC,OAAA,QAAAC,IAAAF,UAAA,GAAAA,UAAA,GAAG,GAC3B,MAAMgQ,EAAItQ,KAAKma,SAAe8K,GAK9B,OAJIjlB,KAAKi5E,oBACA3oE,EAAE4R,KACT5R,EAAE2oE,WAAaj5E,KAAKi5E,YAEf3oE,CACT,CAOA4tB,MAAAA,GAEE,MAAO,CACL,SACA,eACA,MAJW+jC,GAASjiE,KAAKkiB,KAAM/hB,EAAO0Z,oDAM1C,CAMAq/D,mBAAAA,GACE,MAAMC,EAASh5E,EAAO0Z,oBACtB,MAAO,cAAcN,IAASvZ,KAAK0jE,WAAW13D,EAAGmtE,OAAY5/D,IAC1DvZ,KAAK0jE,WAAW33D,EACjBotE,KAEJ,CAOAnyD,aAAAA,CAAc7O,GACZ,MAAM+O,EAAsBlnB,KAAKk5E,sBACjC,MACE,KACAl5E,KAAKq+B,6BAA6Br+B,KAAKk+B,SAAU,CAC/C/lB,UACA+O,oBAAqBA,GAG3B,CAOAjB,KAAAA,CAAM9N,GACJ,MAAM+O,EAAsBlnB,KAAKk5E,sBACjC,OAAOl5E,KAAKo+B,qBAAqBp+B,KAAKk+B,SAAU,CAC9C/lB,UACA+O,oBAAqBA,GAEzB,CAMAnW,UAAAA,GACE,OAAO/Q,KAAKkiB,KAAK3hB,MACnB,CAEAsc,aAAAA,GACE7c,KAAK64E,gBACP,CAEAA,cAAAA,CAAeD,GACb,MAAM5mE,MAAEA,EAAKC,OAAEA,EAAMyxD,WAAEA,GAAe1jE,KAAKo5E,kBAC3Cp5E,KAAKyI,IAAI,CAAEuJ,QAAOC,SAAQyxD,eAG1BkV,GAAkB54E,KAAK2qB,oBAAoB+4C,EAAYn9D,EAAQA,EACjE,CAEAuyE,mBAAAA,GACE,MAAMne,EAAe,GACrB,IAAI0e,EAAgB,EAClBC,EAAgB,EAChBttE,EAAI,EACJD,EAAI,EAEN,IAAK,MAAMq0D,KAAWpgE,KAAKkiB,KAEzB,OACEk+C,EAAQ,IAER,IAAK,IACHp0D,EAAIo0D,EAAQ,GACZr0D,EAAIq0D,EAAQ,GACZzF,EAAOvwD,KAAK,CAAE4B,EAAGqtE,EAAettE,EAAGutE,GAAiB,CAAEttE,IAAGD,MACzD,MAEF,IAAK,IACHC,EAAIo0D,EAAQ,GACZr0D,EAAIq0D,EAAQ,GACZiZ,EAAgBrtE,EAChBstE,EAAgBvtE,EAChB,MAEF,IAAK,IACH4uD,EAAOvwD,QACF0vD,GACD9tD,EACAD,EACAq0D,EAAQ,GACRA,EAAQ,GACRA,EAAQ,GACRA,EAAQ,GACRA,EAAQ,GACRA,EAAQ,KAGZp0D,EAAIo0D,EAAQ,GACZr0D,EAAIq0D,EAAQ,GACZ,MAEF,IAAK,IACHzF,EAAOvwD,QACF0vD,GACD9tD,EACAD,EACAq0D,EAAQ,GACRA,EAAQ,GACRA,EAAQ,GACRA,EAAQ,GACRA,EAAQ,GACRA,EAAQ,KAGZp0D,EAAIo0D,EAAQ,GACZr0D,EAAIq0D,EAAQ,GACZ,MAEF,IAAK,IACHp0D,EAAIqtE,EACJttE,EAAIutE,EAIV,OAAOjvD,GAA0BswC,EACnC,CAKAye,eAAAA,GACE,MAAMnuD,EAAOjrB,KAAK84E,sBAElB,MAAO,IACF7tD,EACHy4C,WAAY,IAAI53D,GACdmf,EAAKnZ,KAAOmZ,EAAKjZ,MAAQ,EACzBiZ,EAAKlZ,IAAMkZ,EAAKhZ,OAAS,GAG/B,CAaA,iBAAOsG,CAAoDlJ,GACzD,OAAOrP,KAAKw4C,YAAkBnpC,EAAQ,CACpCqpC,WAAY,QAEhB,CAOA,wBAAa+Y,CACXh+C,EACAvR,EACA6rD,GAEA,MAAMvjD,EAAEA,KAAM+uE,GAAqBjpB,GACjC78C,EACAzT,KAAK2xD,gBACL5D,GAEF,OAAO,IAAI/tD,KAAKwK,EAAG,IACd+uE,KACAr3E,EAEH4P,UAAMtR,EACNuR,SAAKvR,GAET,EAlWAT,EALW24E,GAAI,OAiBD,QAAM34E,EAjBT24E,GAAI,kBAmBU,IAAIp1C,GAAiB,OAAQ,aAAWvjC,EAnBtD24E,GAAI,kBAoUU,IAAI3rB,GAAmB,MAsClD9kD,EAAcM,SAASmwE,IACvBzwE,EAAcY,YAAY6vE,ICzYnB,MAAMc,WAAoBnB,GA4B/Bv4E,WAAAA,CAAYqD,GACV/C,MAAM+C,GA5BRpD,kBAKW,IAEXA,2BAOmB,GAEnBA,yBAKkD,YAQhDC,KAAKy5E,QAAU,GACfz5E,KAAK05E,kBAAmB,CAC1B,CAEAnB,eAAAA,GACE,OAAOn4E,MAAMm4E,mBAAqBv4E,KAAK05E,gBACzC,CAEA,kBAAOC,CAAYh+D,EAA+BgmD,EAAWC,GAC3D,MAAMI,EAAWL,EAAG/zD,aAAag0D,GAEjC,OADAjmD,EAAIo9D,iBAAiBpX,EAAG31D,EAAG21D,EAAG51D,EAAGi2D,EAASh2D,EAAGg2D,EAASj2D,GAC/Ci2D,CACT,CAMAiR,WAAAA,CAAYxlD,EAAc3oB,GAAiB,IAAfolB,EAAEA,GAAWplB,EAClC9E,KAAKmD,OAAOyuE,aAAa1nD,KAG9BlqB,KAAK45E,mBAAqB55E,KAAK65E,iBAAmB3vD,EAAElqB,KAAK65E,iBACzD75E,KAAK85E,mBAAmBrsD,GAGxBztB,KAAK+5E,UAAUtsD,GACfztB,KAAKkzC,UACP,CAMAk6B,WAAAA,CAAY3/C,EAAcljB,GAAiB,IAAf2f,EAAEA,GAAW3f,EACvC,GAAKvK,KAAKmD,OAAOyuE,aAAa1nD,KAG9BlqB,KAAK45E,mBAAqB55E,KAAK65E,iBAAmB3vD,EAAElqB,KAAK65E,mBACxB,IAA7B75E,KAAKg6E,sBAAgCh6E,KAAKy4E,iBAAiBhrD,KAG3DztB,KAAK+5E,UAAUtsD,IAAYztB,KAAKy5E,QAAQl5E,OAAS,GACnD,GAAIP,KAAKu4E,kBAGPv4E,KAAKmD,OAAO4d,aAAa/gB,KAAKmD,OAAOmuC,YACrCtxC,KAAKkzC,cACA,CACL,MAAM5oB,EAAStqB,KAAKy5E,QAClBl5E,EAAS+pB,EAAO/pB,OAChBob,EAAM3b,KAAKmD,OAAOmuC,WAEpBtxC,KAAKs4E,kBAAkB38D,GACnB3b,KAAKi6E,SACPt+D,EAAIkI,YACJlI,EAAImI,OAAO9jB,KAAKi6E,OAAOjuE,EAAGhM,KAAKi6E,OAAOluE,IAExC/L,KAAKi6E,OAAST,GAAYG,YACxBh+D,EACA2O,EAAO/pB,EAAS,GAChB+pB,EAAO/pB,EAAS,IAElBob,EAAIiiB,SACJjiB,EAAI6G,SACN,CAEJ,CAKA2wD,SAAAA,CAASroE,GAAgB,IAAfof,EAAEA,GAAWpf,EACrB,OAAK9K,KAAKmD,OAAOyuE,aAAa1nD,KAG9BlqB,KAAK45E,kBAAmB,EACxB55E,KAAKi6E,YAASz5E,EACdR,KAAKk6E,uBAEE,EACT,CAMAJ,kBAAAA,CAAmBrsD,GACjBztB,KAAKm6E,SACLn6E,KAAK+5E,UAAUtsD,GACfztB,KAAKmD,OAAOmuC,WAAWxtB,OAAO2J,EAAQzhB,EAAGyhB,EAAQ1hB,EACnD,CAMAguE,SAAAA,CAAUx5D,GACR,QACEvgB,KAAKy5E,QAAQl5E,OAAS,GACtBggB,EAAMtT,GAAGjN,KAAKy5E,QAAQz5E,KAAKy5E,QAAQl5E,OAAS,OAI1CP,KAAK45E,kBAAoB55E,KAAKy5E,QAAQl5E,OAAS,IACjDP,KAAK05E,kBAAmB,EACxB15E,KAAKy5E,QAAQ7hC,OAEf53C,KAAKy5E,QAAQrvE,KAAKmW,IACX,EACT,CAMA45D,MAAAA,GACEn6E,KAAKy5E,QAAU,GACfz5E,KAAK+qE,gBAAgB/qE,KAAKmD,OAAOmuC,YACjCtxC,KAAKiyC,aACLjyC,KAAK05E,kBAAmB,CAC1B,CAOAxmC,OAAAA,GAAgE,IAAxDv3B,EAA6Brb,UAAAC,eAAAC,IAAAF,UAAA,GAAAA,UAAA,GAAGN,KAAKmD,OAAOmuC,WAC9CqwB,EAAK3hE,KAAKy5E,QAAQ,GACpB7X,EAAK5hE,KAAKy5E,QAAQ,GAOpB,GANAz5E,KAAKs4E,kBAAkB38D,GACvBA,EAAIkI,YAKwB,IAAxB7jB,KAAKy5E,QAAQl5E,QAAgBohE,EAAG31D,IAAM41D,EAAG51D,GAAK21D,EAAG51D,IAAM61D,EAAG71D,EAAG,CAC/D,MAAMiG,EAAQhS,KAAKgS,MAAQ,IAC3B2vD,EAAG31D,GAAKgG,EACR4vD,EAAG51D,GAAKgG,CACV,CACA2J,EAAImI,OAAO69C,EAAG31D,EAAG21D,EAAG51D,GAEpB,IAAK,IAAIZ,EAAI,EAAGA,EAAInL,KAAKy5E,QAAQl5E,OAAQ4K,IAGvCquE,GAAYG,YAAYh+D,EAAKgmD,EAAIC,GACjCD,EAAK3hE,KAAKy5E,QAAQtuE,GAClBy2D,EAAK5hE,KAAKy5E,QAAQtuE,EAAI,GAKxBwQ,EAAIoI,OAAO49C,EAAG31D,EAAG21D,EAAG51D,GACpB4P,EAAIiiB,SACJjiB,EAAI6G,SACN,CAOA43D,sBAAAA,CAAuB9vD,GACrB,MAAM0qC,EAAah1D,KAAKgS,MAAQ,IAChC,OAAO0vD,GAAwBp3C,EAAQ0qC,EACzC,CAOAqlB,UAAAA,CAAWnY,GACT,MAAMhgD,EAAO,IAAIw2D,GAAKxW,EAAU,CAC9Bx+C,KAAM,KACNka,OAAQ59B,KAAKg5B,MACboE,YAAap9B,KAAKgS,MAClBurB,cAAev9B,KAAKu9B,cACpBE,iBAAkBz9B,KAAKy9B,iBACvBD,eAAgBx9B,KAAKw9B,eACrBH,gBAAiBr9B,KAAKq9B,kBAOxB,OALIr9B,KAAK69B,SACP79B,KAAK69B,OAAOqF,cAAe,EAC3BhhB,EAAK2b,OAAS,IAAI8E,GAAO3iC,KAAK69B,SAGzB3b,CACT,CAKAo4D,cAAAA,CAAehwD,EAAiBg0B,GAC9B,GAAIh0B,EAAO/pB,QAAU,EACnB,OAAO+pB,EAET,IACEiwD,EADEC,EAAYlwD,EAAO,GAEvB,MAAM7B,EAAOzoB,KAAKmD,OAAOgd,UACvBs6D,EAAmB/1E,KAAKkR,IAAI0oC,EAAW71B,EAAM,GAC7C8P,EAAIjO,EAAO/pB,OAAS,EACpBm6E,EAAY,CAACF,GAEf,IAAK,IAAIrvE,EAAI,EAAGA,EAAIotB,EAAI,EAAGptB,IACzBovE,EACE71E,KAAKkR,IAAI4kE,EAAUxuE,EAAIse,EAAOnf,GAAGa,EAAG,GACpCtH,KAAKkR,IAAI4kE,EAAUzuE,EAAIue,EAAOnf,GAAGY,EAAG,GAClCwuE,GAAaE,IACfD,EAAYlwD,EAAOnf,GACnBuvE,EAAUtwE,KAAKowE,IAMnB,OADAE,EAAUtwE,KAAKkgB,EAAOiO,IACfmiD,CACT,CAOAR,mBAAAA,GACcl6E,KAAKmD,OAAOmuC,WACpBttB,YACAhkB,KAAK26E,WACP36E,KAAKy5E,QAAUz5E,KAAKs6E,eAAet6E,KAAKy5E,QAASz5E,KAAK26E,WAExD,MAAMzY,EAAWliE,KAAKo6E,uBAAuBp6E,KAAKy5E,SAClD,GA3QJ,SAAwBvX,GACtB,MAA8B,0BAAvBD,GAASC,EAClB,CAyQQ0Y,CAAe1Y,GAMjB,YADAliE,KAAKmD,OAAOsc,mBAId,MAAMyC,EAAOliB,KAAKq6E,WAAWnY,GAC7BliE,KAAKmD,OAAO4d,aAAa/gB,KAAKmD,OAAOmuC,YACrCtxC,KAAKmD,OAAO4H,KAAK,sBAAuB,CAAEmX,KAAMA,IAChDliB,KAAKmD,OAAO8I,IAAIiW,GAChBliB,KAAKmD,OAAOsc,mBACZyC,EAAKxC,YACL1f,KAAKw4E,eAGLx4E,KAAKmD,OAAO4H,KAAK,eAAgB,CAAEmX,KAAMA,GAC3C,EC1PF,MAAM24D,GAAe,CACnB,SACA,aACA,WACA,oBAUK,MAAMC,WAKHlrC,GAcR,kBAAOzwB,GACL,MAAO,IACF/e,MAAM+e,iBACN27D,GAAO17D,YAEd,CAMAtf,WAAAA,CAAYoC,GACV9B,QACAK,OAAOC,OAAOV,KAAM86E,GAAO17D,aAC3Bpf,KAAK8vC,WAAW5tC,EAClB,CAOA4Q,IAAAA,CAAKvR,EAAa+J,GAOhB,OANAlL,MAAM0S,KAAKvR,EAAK+J,GAEJ,WAAR/J,GACFvB,KAAK+6E,UAAUzvE,GAGVtL,IACT,CAMAkzC,OAAAA,CAAQv3B,GACNA,EAAIkI,YACJlI,EAAIy+B,IACF,EACA,EACAp6C,KAAK+iE,OACLzuD,GAAiBtU,KAAKg7E,YACtB1mE,GAAiBtU,KAAKi7E,UACtBj7E,KAAK2sB,kBAEP3sB,KAAKm1C,oBAAoBx5B,EAC3B,CAMAu/D,UAAAA,GACE,OAAOl7E,KAAKsI,IAAI,UAAYtI,KAAKsI,IAAId,EACvC,CAMA2zE,UAAAA,GACE,OAAOn7E,KAAKsI,IAAI,UAAYtI,KAAKsI,IAAIb,EACvC,CAKAszE,SAAAA,CAAUzvE,GACRtL,KAAK+iE,OAASz3D,EACdtL,KAAKyI,IAAI,CAAEuJ,MAAe,EAAR1G,EAAW2G,OAAgB,EAAR3G,GACvC,CAOA6O,QAAAA,GAGsD,IAApD8K,EAAwB3kB,UAAAC,OAAA,QAAAC,IAAAF,UAAA,GAAAA,UAAA,GAAG,GAC3B,OAAOF,MAAM+Z,SAAS,IAAI0gE,MAAiB51D,GAC7C,CASAiZ,MAAAA,GACE,MAAMzyB,GAASzL,KAAKi7E,SAAWj7E,KAAKg7E,YAAc,IAElD,GAAc,IAAVvvE,EACF,MAAO,CACL,WACA,eACA,iBACA,MACA,GAAGzL,KAAK+iE,SACR,UAEG,CACL,MAAMA,OAAEA,GAAW/iE,KACbunC,EAAQjzB,GAAiBtU,KAAKg7E,YAClCruB,EAAMr4C,GAAiBtU,KAAKi7E,UAC5BG,EAAS5vE,GAAI+7B,GAASw7B,EACtBsY,EAAS1vE,GAAI47B,GAASw7B,EACtBuY,EAAO9vE,GAAImhD,GAAOoW,EAClBwY,EAAO5vE,GAAIghD,GAAOoW,EAGpB,MAAO,CACL,cAAcqY,KAAUC,OAAYtY,KAAUA,OAHlCt3D,EAAQ,IAAM,EAAI,KAClBzL,KAAK2sB,iBAAmB,EAAI,KAE4C2uD,KAAQC,MAC5F,eACA,QAEJ,CACF,CAgBA,wBAAa9pB,CACXh+C,EACAvR,EACA6rD,GAEA,MAAMj8C,KACJA,EAAO,EAACC,IACRA,EAAM,EAACgxD,OACPA,EAAS,KACNyY,GACDlrB,GACF78C,EACAzT,KAAK2xD,gBACL5D,GAKF,OAAO,IAAI/tD,KAAK,IACXw7E,EACHzY,SACAjxD,KAAMA,EAAOixD,EACbhxD,IAAKA,EAAMgxD,GAEf,CAOA,iBAAOxqD,CAAsDlJ,GAC3D,OAAOjP,MAAMo4C,YAAoBnpC,EACnC,EACDtP,EA7LY+6E,GAAM,OAaH,UAAQ/6E,EAbX+6E,GAAM,kBAeQ,IAAIx3C,MAAoBu3C,KAAa96E,EAfnD+6E,GAAM,cAPmD,CACpE/X,OAAQ,EACRiY,WAAY,EACZC,SAAU,IACVtuD,kBAAkB,IAoBsB5sB,EAjB7B+6E,GAAM,kBAmJQ,CAAC,KAAM,KAAM,OAAQ/tB,KA4ChD9kD,EAAcM,SAASuyE,IACvB7yE,EAAcY,YAAYiyE,ICjP1B,MAAMW,GAAa,CAAC,KAAM,KAAM,KAAM,MAoB/B,MAAMC,WAKH9rC,GAoCR9vC,WAAAA,GAA2E,IAA9Dg9D,EAAIC,EAAIQ,EAAIC,GAAGl9D,UAAAC,OAAA,QAAAC,IAAAF,UAAA,GAAAA,UAAA,GAAG,CAAC,EAAG,EAAG,EAAG,GAAI4B,EAAuB5B,UAAAC,OAAA,QAAAC,IAAAF,UAAA,GAAAA,UAAA,GAAG,CAAA,EACrEF,QACAK,OAAOC,OAAOV,KAAM07E,GAAKt8D,aACzBpf,KAAK8vC,WAAW5tC,GAChBlC,KAAK88D,GAAKA,EACV98D,KAAKu9D,GAAKA,EACVv9D,KAAK+8D,GAAKA,EACV/8D,KAAKw9D,GAAKA,EACVx9D,KAAK27E,kBACL,MAAM7pE,KAAEA,EAAIC,IAAEA,GAAQ7P,EACN,iBAAT4P,GAAqB9R,KAAKyI,IAAIjC,EAAMsL,GAC5B,iBAARC,GAAoB/R,KAAKyI,IAAIhC,EAAKsL,EAC3C,CAMA4pE,eAAAA,GACE,MAAM7e,GAAEA,EAAEC,GAAEA,EAAEQ,GAAEA,EAAEC,GAAEA,GAAOx9D,KAC3BA,KAAKgS,MAAQtN,KAAKgH,IAAI6xD,EAAKT,GAC3B98D,KAAKiS,OAASvN,KAAKgH,IAAI8xD,EAAKT,GAC5B,MAAMjrD,KAAEA,EAAIC,IAAEA,EAAGC,MAAEA,EAAKC,OAAEA,GAAWoY,GAA0B,CAC7D,CAAEre,EAAG8wD,EAAI/wD,EAAGgxD,GACZ,CAAE/wD,EAAGuxD,EAAIxxD,EAAGyxD,KAERpiD,EAAW,IAAItP,GAAMgG,EAAOE,EAAQ,EAAGD,EAAME,EAAS,GAC5DjS,KAAK2qB,oBAAoBvP,EAAU7U,EAAQA,EAC7C,CAOAuM,IAAAA,CAAKvR,EAAa+J,GAWhB,OAVAlL,MAAM0S,KAAKvR,EAAK+J,GACZmwE,GAAW7qE,SAASrP,IAOtBvB,KAAK27E,kBAEA37E,IACT,CAMAkzC,OAAAA,CAAQv3B,GACNA,EAAIkI,YAEJ,MAAMnV,EAAI1O,KAAK47E,iBACfjgE,EAAImI,OAAOpV,EAAEouD,GAAIpuD,EAAEquD,IACnBphD,EAAIoI,OAAOrV,EAAE6uD,GAAI7uD,EAAE8uD,IAEnB7hD,EAAIi4B,UAAY5zC,KAAKo9B,YAKrB,MAAMy+C,EAAkBlgE,EAAIw4B,YAGrB,IAAA2nC,EAFH/hE,GAAS/Z,KAAK49B,QAChBjiB,EAAIw4B,YAAcn0C,KAAK49B,OAAO3jB,OAAO0B,GAErCA,EAAIw4B,YAAyB,QAAd2nC,EAAG97E,KAAK49B,cAAM,IAAAk+C,EAAAA,EAAIngE,EAAIsI,UAEvCjkB,KAAK49B,QAAU59B,KAAKo1C,cAAcz5B,GAClCA,EAAIw4B,YAAc0nC,CACpB,CAQAnmC,sBAAAA,GACE,OAAO,IAAI5pC,IAAO9L,KAAK88D,GAAK98D,KAAKu9D,IAAM,GAAIv9D,KAAK+8D,GAAK/8D,KAAKw9D,IAAM,EAClE,CAOArjD,QAAAA,GAGsD,IAApD8K,EAAwB3kB,UAAAC,OAAA,QAAAC,IAAAF,UAAA,GAAAA,UAAA,GAAG,GAC3B,MAAO,IACFF,MAAM+Z,SAAS8K,MACfjlB,KAAK47E,iBAEZ,CAMAhtC,4BAAAA,GACE,MAAMP,EAAMjuC,MAAMwuC,+BASlB,MAR2B,SAAvB5uC,KAAKu9B,gBACY,IAAfv9B,KAAKgS,QACPq8B,EAAItiC,GAAK/L,KAAKo9B,aAEI,IAAhBp9B,KAAKiS,SACPo8B,EAAIriC,GAAKhM,KAAKo9B,cAGXiR,CACT,CASAutC,cAAAA,GACE,MAAQ9e,GAAIif,EAAKxe,GAAIye,EAAKjf,GAAIkf,EAAKze,GAAI0e,EAAGlqE,MAAEA,EAAKC,OAAEA,GAAWjS,KACxDm8E,EAAQJ,GAAOC,GAAM,EAAK,EAC9BI,EAAQH,GAAOC,GAAM,EAAK,EAM5B,MAAO,CACLpf,GANMqf,EAAQnqE,EAAS,EAOvBurD,GALM4e,GAASnqE,EAAS,EAMxB+qD,GAPMqf,EAAQnqE,EAAU,EAQxBurD,GANM4e,GAASnqE,EAAU,EAQ7B,CASAisB,MAAAA,GACE,MAAM4+B,GAAEA,EAAES,GAAEA,EAAER,GAAEA,EAAES,GAAEA,GAAOx9D,KAAK47E,iBAChC,MAAO,CACL,SACA,eACA,OAAO9e,UAAWC,UAAWQ,UAAWC,UAE5C,CAcA,wBAAa/L,CACXh+C,EACAvR,EACA6rD,GAEA,MAAM+O,GACJA,EAAK,EAACC,GACNA,EAAK,EAACQ,GACNA,EAAK,EAACC,GACNA,EAAK,KACF+b,GACDjpB,GAAgB78C,EAASzT,KAAK2xD,gBAAiB5D,GACnD,OAAO,IAAI/tD,KAAK,CAAC88D,EAAIC,EAAIQ,EAAIC,GAAK+b,EACpC,CASA,iBAAOhhE,CAAUzT,GAMX,IANqDg4D,GACzDA,EAAEC,GACFA,EAAEQ,GACFA,EAAEC,GACFA,KACGnuD,GACDvK,EACF,OAAO9E,KAAKw4C,YACV,IACKnpC,EACHib,OAAQ,CAACwyC,EAAIC,EAAIQ,EAAIC,IAEvB,CACE9kB,WAAY,UAGlB,EA9NA34C,EA1BW27E,GAAI,OAgCD,QAAM37E,EAhCT27E,GAAI,kBAkCU,IAAIp4C,MAAoBm4C,KAAW17E,EAlCjD27E,GAAI,kBA0MU3uB,GAAkB7hD,OAAOuwE,KAiDpDxzE,EAAcM,SAASmzE,IACvBzzE,EAAcY,YAAY6yE,ICpRnB,MAAMW,WAKHzsC,GAOR,kBAAOzwB,GACL,MAAO,IAAK/e,MAAM+e,iBAAkBk9D,GAASj9D,YAC/C,CAMAtf,WAAAA,CAAYoC,GACV9B,QACAK,OAAOC,OAAOV,KAAMq8E,GAASj9D,aAC7Bpf,KAAK8vC,WAAW5tC,EAClB,CAMAgxC,OAAAA,CAAQv3B,GACN,MAAM2gE,EAAWt8E,KAAKgS,MAAQ,EAC5BuqE,EAAYv8E,KAAKiS,OAAS,EAE5B0J,EAAIkI,YACJlI,EAAImI,QAAQw4D,EAAUC,GACtB5gE,EAAIoI,OAAO,GAAIw4D,GACf5gE,EAAIoI,OAAOu4D,EAAUC,GACrB5gE,EAAIqI,YAEJhkB,KAAKm1C,oBAAoBx5B,EAC3B,CAOAuiB,MAAAA,GACE,MAAMo+C,EAAWt8E,KAAKgS,MAAQ,EAC5BuqE,EAAYv8E,KAAKiS,OAAS,EAE5B,MAAO,CAAC,YAAa,eAAgB,WAD1B,IAAIqqE,KAAYC,QAAgBA,KAAaD,KAAYC,IACX,OAC3D,EACDx8E,EAtDYs8E,GAAQ,OAQL,YAAUt8E,EARbs8E,GAAQ,cALqD,CACxErqE,MAAO,IACPC,OAAQ,MA2DVhK,EAAcM,SAAS8zE,IACvBp0E,EAAcY,YAAYwzE,IC1DnB,MAgBDG,GAAgB,CAAC,KAAM,MAEtB,MAAMC,WAKH7sC,GAqBR,kBAAOzwB,GACL,MAAO,IACF/e,MAAM+e,iBACNs9D,GAAQr9D,YAEf,CAMAtf,WAAAA,CAAYoC,GACV9B,QACAK,OAAOC,OAAOV,KAAMy8E,GAAQr9D,aAC5Bpf,KAAK8vC,WAAW5tC,EAClB,CAQA4Q,IAAAA,CAAKvR,EAAa+J,GAEhB,OADAlL,MAAM0S,KAAKvR,EAAK+J,GACR/J,GACN,IAAK,KACHvB,KAAKqxD,GAAK/lD,EACVtL,KAAKyI,IAAI,QAAiB,EAAR6C,GAClB,MAEF,IAAK,KACHtL,KAAKsxD,GAAKhmD,EACVtL,KAAKyI,IAAI,SAAkB,EAAR6C,GAGvB,OAAOtL,IACT,CAMA08E,KAAAA,GACE,OAAO18E,KAAKsI,IAAI,MAAQtI,KAAKsI,IAAId,EACnC,CAMAm1E,KAAAA,GACE,OAAO38E,KAAKsI,IAAI,MAAQtI,KAAKsI,IAAIb,EACnC,CAOA0S,QAAAA,GAGsD,IAApD8K,EAAwB3kB,UAAAC,OAAA,QAAAC,IAAAF,UAAA,GAAAA,UAAA,GAAG,GAC3B,OAAOF,MAAM+Z,SAAS,IAAIqiE,MAAkBv3D,GAC9C,CAOAiZ,MAAAA,GACE,MAAO,CACL,YACA,eACA,qBAAqBl+B,KAAKqxD,WAAWrxD,KAAKsxD,WAE9C,CAMApe,OAAAA,CAAQv3B,GACNA,EAAIkI,YACJlI,EAAI2G,OACJ3G,EAAIhN,UAAU,EAAG,EAAG,EAAG3O,KAAKsxD,GAAKtxD,KAAKqxD,GAAI,EAAG,GAC7C11C,EAAIy+B,IAAI,EAAG,EAAGp6C,KAAKqxD,GAAI,EAAGprD,GAAW,GACrC0V,EAAI6G,UACJxiB,KAAKm1C,oBAAoBx5B,EAC3B,CAeA,wBAAa81C,CACXh+C,EACAvR,EACA6rD,GAEA,MAAMwrB,EAAmBjpB,GACvB78C,EACAzT,KAAK2xD,gBACL5D,GAKF,OAFAwrB,EAAiBznE,MAAQynE,EAAiBznE,MAAQ,GAAKynE,EAAiBloB,GACxEkoB,EAAiBxnE,KAAOwnE,EAAiBxnE,KAAO,GAAKwnE,EAAiBjoB,GAC/D,IAAItxD,KAAKu5E,EAClB,EApIAx5E,EAdW08E,GAAO,OAoBJ,WAAS18E,EApBZ08E,GAAO,kBAsBO,IAAIn5C,MAAoBk5C,KAAcz8E,EAtBpD08E,GAAO,cAlBoD,CACtEprB,GAAI,EACJC,GAAI,IAwCqCvxD,EAxB9B08E,GAAO,kBA6HO,IAAI1vB,GAAmB,KAAM,KAAM,KAAM,OA0BpE9kD,EAAcM,SAASk0E,IACvBx0E,EAAcY,YAAY4zE,ICxJnB,MAAMG,GAA6D,CAIxEC,kBAAkB,GAOb,MAAMC,WAIHltC,GAwBR,kBAAOzwB,GACL,MAAO,IACF/e,MAAM+e,iBACN29D,GAAS19D,YAEhB,CA4CAtf,WAAAA,GAA6D,IAAjDwqB,EAAYhqB,UAAAC,OAAA,QAAAC,IAAAF,UAAA,GAAAA,UAAA,GAAG,GAAI4B,EAAc5B,UAAAC,OAAA,QAAAC,IAAAF,UAAA,GAAAA,UAAA,GAAG,CAAA,EAC9CF,QAAQL,EAAAC,KAAA,kBAAA,GACRS,OAAOC,OAAOV,KAAM88E,GAAS19D,aAC7Bpf,KAAK8vC,WAAW5tC,GAChBlC,KAAKsqB,OAASA,EACd,MAAMxY,KAAEA,EAAIC,IAAEA,GAAQ7P,EACtBlC,KAAK+8E,aAAc,EACnB/8E,KAAK64E,gBAAe,GACJ,iBAAT/mE,GAAqB9R,KAAKyI,IAAIjC,EAAMsL,GAC5B,iBAARC,GAAoB/R,KAAKyI,IAAIhC,EAAKsL,EAC3C,CAEUirE,MAAAA,GACR,OAAO,CACT,CAEQC,sBAAAA,CAAuB/6E,GAC7B,OAAOioD,GAAsBnqD,KAAKsqB,OAAQpoB,EAASlC,KAAKg9E,SAC1D,CAMA5D,eAAAA,CAAgBl3E,GACdA,EAAU,CACR2T,OAAQ7V,KAAK6V,OACbC,OAAQ9V,KAAK8V,OACbC,MAAO/V,KAAK+V,MACZC,MAAOhW,KAAKgW,MACZunB,cAAev9B,KAAKu9B,cACpBC,eAAgBx9B,KAAKw9B,eACrBC,iBAAkBz9B,KAAKy9B,iBACvBoB,cAAe7+B,KAAK6+B,cACpBzB,YAAap9B,KAAKo9B,eACdl7B,GAAW,CAAA,GAEjB,MAAMooB,EAAStqB,KAAK68E,iBAChB78E,KAAKi9E,uBACH/6E,GACAoW,IAAKyxC,GAAeA,EAAWH,gBACjC5pD,KAAKsqB,OACT,GAAsB,IAAlBA,EAAO/pB,OACT,MAAO,CACLuR,KAAM,EACNC,IAAK,EACLC,MAAO,EACPC,OAAQ,EACRyxD,WAAY,IAAI53D,GAChB+7D,aAAc,IAAI/7D,GAClBoxE,WAAY,IAAIpxE,IAGpB,MAAMmf,EAAOZ,GAA0BC,GAErCrT,EAASH,GAAqB,IAAK5U,EAAS2T,OAAQ,EAAGC,OAAQ,IAC/DqnE,EAAe9yD,GACbrqB,KAAKsqB,OAAOhS,IAAK5J,GAAMkG,GAAelG,EAAGuI,GAAQ,KAEnD6E,EAAQ,IAAIhQ,GAAM9L,KAAK6V,OAAQ7V,KAAK8V,QACtC,IAAIuE,EAAU4Q,EAAKnZ,KAAOmZ,EAAKjZ,MAAQ,EACrCkS,EAAU+G,EAAKlZ,IAAMkZ,EAAKhZ,OAAS,EAQrC,OAPIjS,KAAK68E,mBACPxiE,GAAoB6J,EAAUxf,KAAKgS,IAAIpC,GAAiBtU,KAAK+V,QAG7DmO,GAAoB7J,EAAU3V,KAAKgS,IAAIpC,GAAiBtU,KAAKgW,SAGxD,IACFiV,EACHy4C,WAAY,IAAI53D,GAAMuO,EAAS6J,GAC/B2jD,aAAc,IAAI/7D,GAAMqxE,EAAarrE,KAAMqrE,EAAaprE,KACrDxF,SAAS,IAAIT,GAAMmf,EAAKnZ,KAAMmZ,EAAKlZ,MACnCpF,SAASmP,GACZohE,WAAY,IAAIpxE,GAAMmf,EAAKjZ,MAAOiZ,EAAKhZ,QACpC1F,SAAS,IAAIT,GAAMqxE,EAAanrE,MAAOmrE,EAAalrE,SACpDtF,SAASmP,GAEhB,CAQA45B,sBAAAA,GACE,MAAMzqB,EAAOZ,GAA0BrqB,KAAKsqB,QAC5C,OAAO,IAAIxe,GAAMmf,EAAKnZ,KAAOmZ,EAAKjZ,MAAQ,EAAGiZ,EAAKlZ,IAAMkZ,EAAKhZ,OAAS,EACxE,CAEA4K,aAAAA,GACE7c,KAAK64E,gBACP,CAEAA,cAAAA,CAAeD,GACb,MAAM9mE,KAAEA,EAAIC,IAAEA,EAAGC,MAAEA,EAAKC,OAAEA,EAAMyxD,WAAEA,EAAUmE,aAAEA,EAAYqV,WAAEA,GAC1Dl9E,KAAKo5E,kBACPp5E,KAAKyI,IAAI,CAAEuJ,QAAOC,SAAQyxD,aAAYmE,eAAcqV,eACpDtE,GACE54E,KAAK2qB,oBACH,IAAI7e,GAAMgG,EAAOE,EAAQ,EAAGD,EAAME,EAAS,GAC3C1L,EACAA,EAEN,CAKUqmC,gCAAAA,GACR,OAAO5sC,KAAK68E,gBACd,CAKAjuC,4BAAAA,GACE,OAAO5uC,KAAK68E,iBAER,IAAI/wE,GAAM9L,KAAKgS,MAAOhS,KAAKiS,QAC3B7R,MAAMwuC,8BACZ,CASApB,yBAAAA,GAA6C,IAAnBtrC,EAAY5B,UAAAC,OAAA,QAAAC,IAAAF,UAAA,GAAAA,UAAA,GAAG,CAAA,EACvC,GAAIN,KAAK68E,iBAAkB,CACzB,IAAIptE,EAKJ,GACEhP,OAAOU,KAAKe,GAAS2O,KAClBtP,GACCvB,KAAK6+B,eACJ7+B,KAAKF,YAAgCs9E,iBAAiBxsE,SACrDrP,IAGN,CAAA,IAAA87E,EAAAC,EACA,MAAMtrE,MAAEA,EAAKC,OAAEA,GAAWjS,KAAKo5E,gBAAgBl3E,GAC/CuN,EAAO,IAAI3D,GAAmB,QAAduxE,EAACn7E,EAAQ8P,aAAK,IAAAqrE,EAAAA,EAAIrrE,EAAqB,QAAhBsrE,EAAEp7E,EAAQ+P,cAAM,IAAAqrE,EAAAA,EAAIrrE,EAC7D,KAAO,CAAA,IAAAsrE,EAAAC,EACL/tE,EAAO,IAAI3D,GACI,QADCyxE,EACdr7E,EAAQ8P,aAAK,IAAAurE,EAAAA,EAAIv9E,KAAKgS,MACR,QADawrE,EAC3Bt7E,EAAQ+P,cAAM,IAAAurE,EAAAA,EAAIx9E,KAAKiS,OAE3B,CACA,OAAOxC,EAAK9C,SACV,IAAIb,GAAM5J,EAAQ2T,QAAU7V,KAAK6V,OAAQ3T,EAAQ4T,QAAU9V,KAAK8V,QAEpE,CACE,OAAO1V,MAAMotC,0BAA0BtrC,EAE3C,CAMA4Q,IAAAA,CAAKvR,EAAa+J,GAChB,MAAMk1C,EAAUxgD,KAAK+8E,aAAe/8E,KAAKuB,KAAuB+J,EAC1DmyE,EAASr9E,MAAM0S,KAAKvR,EAAK+J,GAe/B,OAbEtL,KAAK68E,kBACLr8B,KACGj/C,IAAQiG,GAAWjG,IAAQkG,IAC5BzH,KAAK6+B,eACJ7+B,KAAKF,YAAgCs9E,iBAAiBxsE,SACrD,kBAED5Q,KAAKF,YAAgCs9E,iBAAiBxsE,SACrDrP,KAGJvB,KAAK6c,gBAEA4gE,CACT,CAOAtjE,QAAAA,GAGsD,IAApD8K,EAAwB3kB,UAAAC,OAAA,QAAAC,IAAAF,UAAA,GAAAA,UAAA,GAAG,GAC3B,MAAO,IACFF,MAAM+Z,SAAS8K,GAClBqF,OAAQtqB,KAAKsqB,OAAOhS,IAAIxT,IAAA,IAACkH,EAAEA,EAACD,EAAEA,GAAGjH,EAAA,MAAM,CAAEkH,IAAGD,OAEhD,CAOAmyB,MAAAA,GACE,MAAM5T,EAAS,GACbozD,EAAQ19E,KAAK0jE,WAAW13D,EACxB2xE,EAAQ39E,KAAK0jE,WAAW33D,EACxB8N,EAAsB1Z,EAAO0Z,oBAE/B,IAAK,IAAI1O,EAAI,EAAGoY,EAAMvjB,KAAKsqB,OAAO/pB,OAAQ4K,EAAIoY,EAAKpY,IACjDmf,EAAOlgB,KACLmP,GAAQvZ,KAAKsqB,OAAOnf,GAAGa,EAAI0xE,EAAO7jE,GAClC,IACAN,GAAQvZ,KAAKsqB,OAAOnf,GAAGY,EAAI4xE,EAAO9jE,GAClC,KAGJ,MAAO,CACL,IACG7Z,KAAKF,YAAgC4I,KAAKzD,iBAI7C,eACA,WAAWqlB,EAAOxQ,KAAK,YAE3B,CAMAo5B,OAAAA,CAAQv3B,GACN,MAAM4H,EAAMvjB,KAAKsqB,OAAO/pB,OACtByL,EAAIhM,KAAK0jE,WAAW13D,EACpBD,EAAI/L,KAAK0jE,WAAW33D,EAEtB,GAAKwX,IAAOooC,MAAM3rD,KAAKsqB,OAAO/G,EAAM,GAAGxX,GAAvC,CAKA4P,EAAIkI,YACJlI,EAAImI,OAAO9jB,KAAKsqB,OAAO,GAAGte,EAAIA,EAAGhM,KAAKsqB,OAAO,GAAGve,EAAIA,GACpD,IAAK,IAAIZ,EAAI,EAAGA,EAAIoY,EAAKpY,IAAK,CAC5B,MAAMoV,EAAQvgB,KAAKsqB,OAAOnf,GAC1BwQ,EAAIoI,OAAOxD,EAAMvU,EAAIA,EAAGuU,EAAMxU,EAAIA,EACpC,EACC/L,KAAKg9E,UAAYrhE,EAAIqI,YACtBhkB,KAAKm1C,oBAAoBx5B,EARzB,CASF,CAMA5K,UAAAA,GACE,OAAO/Q,KAAKsqB,OAAO/pB,MACrB,CAeA,wBAAakxD,CACXh+C,EACAvR,EACA6rD,GAEA,MAAMzjC,ECxYH,SAA8BA,GAEnC,IAAKA,EACH,MAAO,GAIT,MAAMszD,EAAwBtzD,EAAOyY,QAAQ,KAAM,KAAKzG,OAAOf,MAAM,OAE/DsiD,EAAe,GAErB,IAAK,IAAI1yE,EAAI,EAAGA,EAAIyyE,EAAYr9E,OAAQ4K,GAAK,EAC3C0yE,EAAazzE,KAAK,CAChB4B,EAAG0N,WAAWkkE,EAAYzyE,IAC1BY,EAAG2N,WAAWkkE,EAAYzyE,EAAI,MAQlC,OAAO0yE,CACT,CDiXmBC,CAAqBrqE,EAAQ25C,aAAa,YAGvDt7C,KAAEA,EAAIC,IAAEA,KAAQwnE,GAAqBjpB,GACnC78C,EACAzT,KAAK2xD,gBACL5D,GAEJ,OAAO,IAAI/tD,KAAKsqB,EAAQ,IACnBivD,KACAr3E,GAEP,CASA,iBAAOqW,CAAwDlJ,GAC7D,OAAOrP,KAAKw4C,YAAsBnpC,EAAQ,CACxCqpC,WAAY,UAEhB,EAtXA34C,EAXW+8E,GAAQ,cAwBEF,IAAqB78E,EAxB/B+8E,GAAQ,OA0BL,YAAU/8E,EA1Bb+8E,GAAQ,mBAuC2B,CAC5Cp1E,EACAC,EACA,gBACA,iBACA,mBACA,cACA,gBACA,WACD5H,EAhDU+8E,GAAQ,kBAsDM,IAAIx5C,GAAiB,WAASvjC,EAtD5C+8E,GAAQ,kBA4VM,IAAI/vB,KAwC/B9kD,EAAcM,SAASu0E,IACvB70E,EAAcY,YAAYi0E,IEzanB,MAAMiB,WAAgBjB,GAKjBE,MAAAA,GACR,OAAO,CACT,EACDj9E,EARYg+E,GAAO,cACGnB,IAAqB78E,EAD/Bg+E,GAAO,OAGJ,WAOhB91E,EAAcM,SAASw1E,IACvB91E,EAAcY,YAAYk1E,ICOnB,MAAeC,WAIZpuC,GAeRquC,aAAAA,CAAcC,GACZ,IAAKl+E,KAAKqnB,OACR,OAAO,EAET,QAAyB,IAAd62D,IAA8Bl+E,KAAKqnB,OAAO62D,GACnD,OAAO,EAET,MAAMptE,OACiB,IAAdotE,EACHl+E,KAAKqnB,OACL,CAAE82D,KAAMn+E,KAAKqnB,OAAO62D,IAC1B,IAAK,MAAMvc,KAAM7wD,EACf,IAAK,MAAM8wD,KAAM9wD,EAAI6wD,GAEnB,IAAK,MAAMyc,KAAMttE,EAAI6wD,GAAIC,GACvB,OAAO,EAIb,OAAO,CACT,CASAyc,QAAAA,CAASrrE,EAAsCkrE,GAC7C,IAAKl+E,KAAKqnB,OACR,OAAO,EAET,QAAyB,IAAd62D,IAA8Bl+E,KAAKqnB,OAAO62D,GACnD,OAAO,EAET,MAAMptE,OACiB,IAAdotE,EACHl+E,KAAKqnB,OACL,CAAE,EAAGrnB,KAAKqnB,OAAO62D,IAEvB,IAAK,MAAMvc,KAAM7wD,EAEf,IAAK,MAAM8wD,KAAM9wD,EAAI6wD,GACnB,QAAqC,IAA1B7wD,EAAI6wD,GAAIC,GAAI5uD,GACrB,OAAO,EAIb,OAAO,CACT,CAUAsrE,UAAAA,CAAWtrE,GACT,IAAKhT,KAAKqnB,OACR,OAAO,EAET,MAAMvW,EAAM9Q,KAAKqnB,OACjB,IACEk3D,EACAC,EAFEC,EAAc,EAGhBC,GAAgC,EAChCC,EAAgB,EAClB,IAAK,MAAMhd,KAAM7wD,EAAK,CACpBytE,EAAc,EACd,IAAK,MAAM3c,KAAM9wD,EAAI6wD,GAAK,CACxB,MAAMid,EAAc9tE,EAAI6wD,GAAIC,IAAO,CAAA,EAGnC6c,SAFsDj+E,IAA1Bo+E,EAAY5rE,IAKjCwrE,EAEMI,EAAY5rE,KAAcwrE,IACnCE,GAAgC,GAFhCF,EAAqBI,EAAY5rE,GAK/B4rE,EAAY5rE,KAAchT,KAAKgT,WAC1B4rE,EAAY5rE,IAGrB0rE,GAAgC,EAGM,IAApCj+E,OAAOU,KAAKy9E,GAAar+E,OAC3Bg+E,WAEOztE,EAAI6wD,GAAIC,EAEnB,CAEoB,IAAhB2c,UACKztE,EAAI6wD,EAEf,CAGA,IAAK,IAAIx2D,EAAI,EAAGA,EAAInL,KAAK6+E,WAAWt+E,OAAQ4K,IAC1CwzE,GAAiB3+E,KAAK6+E,WAAW1zE,GAAG5K,OAElCm+E,GAAiCD,IAAgBE,IACnD3+E,KAAKgT,GAA0BwrE,EAC/Bx+E,KAAK8+E,YAAY9rE,GAErB,CASA8rE,WAAAA,CAAY9rE,GACV,IAAKhT,KAAKqnB,OACR,OAEF,MAAMvW,EAAM9Q,KAAKqnB,OACjB,IAAI82D,EAAMY,EAASC,EACnB,IAAKD,KAAWjuE,EAAK,CAEnB,IAAKkuE,KADLb,EAAOrtE,EAAIiuE,GACKZ,SACPA,EAAKa,GAAShsE,GACqB,IAAtCvS,OAAOU,KAAKg9E,EAAKa,IAAUz+E,eACtB49E,EAAKa,GAGiB,IAA7Bv+E,OAAOU,KAAKg9E,GAAM59E,eACbuQ,EAAIiuE,EAEf,CACF,CAEQE,aAAAA,CAAcj2E,EAAemS,GACnC,MAAM+iE,UAAEA,EAASzxB,UAAEA,GAAczsD,KAAKk/E,oBAAoBl2E,GAErDhJ,KAAKm/E,cAAcjB,IACtBl+E,KAAKo/E,cAAclB,GAGrB,MAAMmB,EAAWhmE,GACf,IAEKrZ,KAAKs/E,qBAAqBpB,EAAWzxB,MACrCtxC,GAGJ7P,QAAoB9K,IAAV8K,GAIbtL,KAAKu/E,qBAAqBrB,EAAWzxB,EAAW4yB,EAClD,CASAG,kBAAAA,CACEC,EACAC,EACA3H,GAEA,MAAM1wD,EAAiC,GACvC,IAAK,IAAIlc,EAAIs0E,EAAYt0E,GAAKu0E,GAAYD,GAAat0E,IACrDkc,EAAOjd,KAAKpK,KAAK2/E,mBAAmBx0E,EAAG4sE,IAEzC,OAAO1wD,CACT,CASAs4D,kBAAAA,CAAmBvkE,EAAkB28D,GACnC,MAAMmG,UAAEA,EAASzxB,UAAEA,GAAczsD,KAAKk/E,oBAAoB9jE,GAC1D,OAAO28D,EACH/3E,KAAK4/E,4BAA4B1B,EAAWzxB,GAC5CzsD,KAAKs/E,qBAAqBpB,EAAWzxB,EAC3C,CAQAozB,kBAAAA,CAAmBx4D,EAAgBo4D,EAAoBC,GACrD,IAAK,IAAIv0E,EAAIs0E,EAAYt0E,GAAKu0E,GAAYD,GAAat0E,IACrDnL,KAAKi/E,cAAc9zE,EAAGkc,GAGxBrnB,KAAK8/E,kBAAmB,CAC1B,CAaAR,oBAAAA,CACEpB,EACAzxB,GACsB,IAAAszB,EACtB,MAAMC,EAAYhgF,KAAKqnB,QAAUrnB,KAAKqnB,OAAO62D,GAC7C,OAAO8B,GAAiC,QAAxBD,EAAIC,EAAUvzB,cAAUszB,EAAAA,EAAU,CAAA,CACpD,CASAH,2BAAAA,CACE1B,EACAzxB,GAEA,MAAO,IACFtzC,GACDnZ,KACCA,KAAKF,YACHmgF,qBAEFjgF,KAAKs/E,qBAAqBpB,EAAWzxB,GAE5C,CAQU8yB,oBAAAA,CACRrB,EACAzxB,EACAtxC,GAEAnb,KAAKqnB,OAAO62D,GAAWzxB,GAAatxC,CACtC,CAQU+kE,uBAAAA,CAAwBhC,EAAmBzxB,UAC5CzsD,KAAKqnB,OAAO62D,GAAWzxB,EAChC,CAOU0yB,aAAAA,CAAcjB,GACtB,QAASl+E,KAAKqnB,OAAO62D,EACvB,CAOUkB,aAAAA,CAAclB,GACtBl+E,KAAKqnB,OAAO62D,GAAa,CAAA,CAC3B,CAEUiC,gBAAAA,CAAiBjC,UAClBl+E,KAAKqnB,OAAO62D,EACrB,EACDn+E,EAzTqBi+E,GAAU,mBAQ6Br+C,ICb7D,MAAMygD,GAAsB,OACtBC,GAAgB,KAEtB,SAASC,GACPtnD,EACAlnB,EACAC,EACAC,EACAC,GAEA,MAAO,O7FkIoB,SAC3B+mB,EAAal0B,GAGV,IAFHgN,KAAEA,EAAIC,IAAEA,EAAGC,MAAEA,EAAKC,OAAEA,GAAenN,EACnCrC,EAASnC,UAAAC,OAAA,QAAAC,IAAAF,UAAA,GAAAA,UAAA,GAAGH,EAAO0Z,oBAEnB,MAAM0mE,EAAW5jD,GAAe/0B,EAAMoxB,GAAO,IACtChtB,EAAGD,EAAGuiC,EAAGjW,GAAK,CAACvmB,EAAMC,EAAKC,EAAOC,GAAQqG,IAAKhN,GACnDiO,GAAQjO,EAAO7I,IAEjB,MAAO,SAAS89E,QAAev0E,SAASD,aAAauiC,cAAcjW,YACrE,C6F5IgBmoD,CAAcxnD,EAAO,CAAElnB,OAAMC,MAAKC,QAAOC,cACzD,CCuBA,IAAIwuE,GA6EG,MAAMC,WAKH1C,GAyRR,kBAAO7+D,GACL,MAAO,IAAK/e,MAAM+e,iBAAkBuhE,GAAWthE,YACjD,CAEAtf,WAAAA,CAAYwsD,EAAcpqD,GACxB9B,QArDFL,sBAMiC,IAgD/BU,OAAOC,OAAOV,KAAM0gF,GAAWthE,aAC/Bpf,KAAK8vC,WAAW5tC,GACXlC,KAAKqnB,SACRrnB,KAAKqnB,OAAS,CAAA,GAEhBrnB,KAAKssD,KAAOA,EACZtsD,KAAK+8E,aAAc,EACf/8E,KAAKkiB,MACPliB,KAAK2gF,cAEP3gF,KAAK4gF,iBACL5gF,KAAK0f,WACP,CAMAihE,WAAAA,GACE,MAAMz+D,EAAOliB,KAAKkiB,KACdA,IACFA,EAAK2+D,aAAe9gB,GAAoB79C,EAAKA,MAEjD,CAMA4+D,UAAAA,GACE,MAAMC,EAAW/gF,KAAKghF,oBAAoBhhF,KAAKssD,MAK/C,OAJAtsD,KAAKusD,UAAYw0B,EAASE,MAC1BjhF,KAAK6+E,WAAakC,EAASG,cAC3BlhF,KAAKmhF,oBAAsBJ,EAASK,gBACpCphF,KAAKqhF,MAAQN,EAASO,aACfP,CACT,CAOAH,cAAAA,GACE5gF,KAAK8gF,aACL9gF,KAAKuhF,cACLvhF,KAAK6jC,OAAQ,EACT7jC,KAAKkiB,MACPliB,KAAKgS,MAAQhS,KAAKkiB,KAAKlQ,MACvBhS,KAAKiS,OAASjS,KAAKkiB,KAAKjQ,SAExBjS,KAAKgS,MACHhS,KAAKwhF,iBAAmBxhF,KAAKyhF,aAAezhF,KAAK8gC,eACnD9gC,KAAKiS,OAASjS,KAAK0hF,kBAEjB1hF,KAAKogC,UAAUxvB,SAASywB,KAE1BrhC,KAAK2hF,eAET,CAKAA,aAAAA,GACE,IAAIC,EACFC,EACAC,EACAC,EACA5D,EACA6D,EACAC,EACF,IAAK,IAAI92E,EAAI,EAAGoY,EAAMvjB,KAAK6+E,WAAWt+E,OAAQ4K,EAAIoY,EAAKpY,IACrD,IACEnL,KAAKogC,YAAciB,IAClBl2B,IAAMoY,EAAM,IAAKvjB,KAAKkiF,gBAAgB/2E,MAIzC42E,EAAmB,EACnB5D,EAAOn+E,KAAK6+E,WAAW1zE,GACvB02E,EAAmB7hF,KAAKmiF,aAAah3E,GAEnC02E,EAAmB7hF,KAAKgS,QACvBiwE,EAASjiF,KAAKusD,UAAUphD,GAAG6vB,MAAMh7B,KAAK8/B,oBACvC,CACAgiD,EAAiBG,EAAO1hF,OACxBqhF,GAAa5hF,KAAKgS,MAAQ6vE,GAAoBC,EAC9C,IAAK,IAAIzqC,EAAI,EAAGA,GAAK8mC,EAAK59E,OAAQ82C,IAChC2qC,EAAYhiF,KAAKoiF,aAAaj3E,GAAGksC,GAC7Br3C,KAAK+/B,eAAe8uB,KAAKsvB,EAAK9mC,KAChC2qC,EAAUhwE,OAAS4vE,EACnBI,EAAUK,aAAeT,EACzBI,EAAUlwE,MAAQiwE,EAClBA,GAAoBH,GAEpBI,EAAUlwE,MAAQiwE,CAGxB,CAEJ,CAOAG,eAAAA,CAAgBhE,GACd,OAAOA,IAAcl+E,KAAK6+E,WAAWt+E,OAAS,CAChD,CASA+hF,oBAAAA,CAAqBC,GACnB,OAAO,CACT,CAOArD,mBAAAA,CAAoBsD,EAAwBC,GAC1C,MAAMxB,EAAQwB,EAAeziF,KAAKmhF,oBAAsBnhF,KAAK6+E,WAC7D,IAAI1zE,EACJ,IAAKA,EAAI,EAAGA,EAAI81E,EAAM1gF,OAAQ4K,IAAK,CACjC,GAAIq3E,GAAkBvB,EAAM91E,GAAG5K,OAC7B,MAAO,CACL29E,UAAW/yE,EACXshD,UAAW+1B,GAGfA,GACEvB,EAAM91E,GAAG5K,OAASP,KAAKsiF,qBAAqBn3E,EAAGs3E,EACnD,CACA,MAAO,CACLvE,UAAW/yE,EAAI,EACfshD,UACEw0B,EAAM91E,EAAI,GAAG5K,OAASiiF,EAClBvB,EAAM91E,EAAI,GAAG5K,OACbiiF,EAEV,CAMA30E,QAAAA,GACE,MAAO,WAAW7N,KAAK+Q,6BACrB/Q,KAAKssD,yBACctsD,KAAKgB,gBAC5B,CAaAyvC,yBAAAA,GACE,MAAMN,EAAO/vC,MAAMqwC,4BACb5U,EAAW77B,KAAK67B,SAGtB,OAFAsU,EAAKn+B,OAAS6pB,EAAWsU,EAAKltB,MAC9BktB,EAAKl+B,QAAU4pB,EAAWsU,EAAKjtB,MACxBitB,CACT,CAMA+C,OAAAA,CAAQv3B,GACN,MAAMuG,EAAOliB,KAAKkiB,KAClBA,IAASA,EAAK2vB,gBAAkB3vB,EAAKgxB,QAAQv3B,GAC7C3b,KAAK0iF,eAAe/mE,GACpB3b,KAAK2iF,2BAA2BhnE,GAChC3b,KAAK4iF,sBAAsBjnE,EAAK,aAChC3b,KAAKonB,YAAYzL,GACjB3b,KAAK4iF,sBAAsBjnE,EAAK,YAChC3b,KAAK4iF,sBAAsBjnE,EAAK,cAClC,CAMAyL,WAAAA,CAAYzL,GACN3b,KAAKk/B,aAAer3B,GACtB7H,KAAK6iF,kBAAkBlnE,GACvB3b,KAAK8iF,gBAAgBnnE,KAErB3b,KAAK8iF,gBAAgBnnE,GACrB3b,KAAK6iF,kBAAkBlnE,GAE3B,CAYA+mE,cAAAA,CACE/mE,EACAonE,EACAC,GAGA,GADArnE,EAAIsnE,aAAe,aACfjjF,KAAKkiB,KACP,OAAQliB,KAAKygC,WACX,KAAKl6B,EACHoV,EAAIsnE,aAAe,SACnB,MACF,IAAK,WACHtnE,EAAIsnE,aAAex8E,EACnB,MACF,IAAK,YACHkV,EAAIsnE,aAAev8E,EAIzBiV,EAAIk1C,KAAO7wD,KAAKkjF,oBAAoBH,EAAWC,EACjD,CAQAxB,aAAAA,GACE,IAAI2B,EAAWnjF,KAAKmiF,aAAa,GAEjC,IAAK,IAAIh3E,EAAI,EAAGoY,EAAMvjB,KAAK6+E,WAAWt+E,OAAQ4K,EAAIoY,EAAKpY,IAAK,CAC1D,MAAM02E,EAAmB7hF,KAAKmiF,aAAah3E,GACvC02E,EAAmBsB,IACrBA,EAAWtB,EAEf,CACA,OAAOsB,CACT,CAWAC,eAAAA,CACEjsB,EACAx7C,EACAwiE,EACArsE,EACAC,EACAmsE,GAEAl+E,KAAKqjF,aAAalsB,EAAQx7C,EAAKwiE,EAAMrsE,EAAMC,EAAKmsE,EAClD,CAOAyE,0BAAAA,CAA2BhnE,GACzB,IAAK3b,KAAKsgC,sBAAwBtgC,KAAKq+E,SAAS,uBAC9C,OAEF,MAAMtrC,EAAep3B,EAAIsI,UACvBq/D,EAAatjF,KAAKujF,iBACpB,IAAIC,EAAgBxjF,KAAKyjF,gBAEzB,IAAK,IAAIt4E,EAAI,EAAGoY,EAAMvjB,KAAK6+E,WAAWt+E,OAAQ4K,EAAIoY,EAAKpY,IAAK,CAC1D,MAAMu4E,EAAe1jF,KAAK2jF,gBAAgBx4E,GAC1C,IACGnL,KAAKsgC,sBACLtgC,KAAKq+E,SAAS,sBAAuBlzE,GACtC,CACAq4E,GAAiBE,EACjB,QACF,CACA,MAAM1oB,EAAOh7D,KAAK6+E,WAAW1zE,GAAG5K,OAC1BqjF,EAAiB5jF,KAAK6jF,mBAAmB14E,GAC/C,IAEI24E,EACAC,EAHAC,EAAW,EACXC,EAAW,EAGXC,EAAYlkF,KAAKmkF,qBAAqBh5E,EAAG,EAAG,uBAChD,IAAK,IAAIksC,EAAI,EAAGA,EAAI2jB,EAAM3jB,IAAK,CAE7B,MAAM+sC,EAAUpkF,KAAKoiF,aAAaj3E,GAAGksC,GACrC0sC,EAAe/jF,KAAKmkF,qBAAqBh5E,EAAGksC,EAAG,uBAC3Cr3C,KAAKkiB,MACPvG,EAAI2G,OACJ3G,EAAIy1B,UAAUgzC,EAAQC,WAAYD,EAAQve,WAC1ClqD,EAAIvN,OAAOg2E,EAAQ34E,OACnBkQ,EAAIsI,UAAY8/D,EAChBA,GACEpoE,EAAI43B,UACD6wC,EAAQpyE,MAAQ,GACf0xE,EAAe1jF,KAAKqgC,YAAe,EAAIrgC,KAAKkhC,mBAC9CkjD,EAAQpyE,MACR0xE,EAAe1jF,KAAKqgC,YAExB1kB,EAAI6G,WACKuhE,IAAiBG,GAC1BJ,EAAYR,EAAaM,EAAiBK,EACnB,QAAnBjkF,KAAK4gC,YACPkjD,EAAY9jF,KAAKgS,MAAQ8xE,EAAYE,GAEvCroE,EAAIsI,UAAYigE,EAChBA,GACEvoE,EAAI43B,SACFuwC,EACAN,EACAQ,EACAN,EAAe1jF,KAAKqgC,YAExB4jD,EAAWG,EAAQtyE,KACnBkyE,EAAWI,EAAQpyE,MACnBkyE,EAAYH,GAEZC,GAAYI,EAAQ/B,WAExB,CACI0B,IAAiB/jF,KAAKkiB,OACxB4hE,EAAYR,EAAaM,EAAiBK,EACnB,QAAnBjkF,KAAK4gC,YACPkjD,EAAY9jF,KAAKgS,MAAQ8xE,EAAYE,GAEvCroE,EAAIsI,UAAY8/D,EAChBpoE,EAAI43B,SACFuwC,EACAN,EACAQ,EACAN,EAAe1jF,KAAKqgC,aAGxBmjD,GAAiBE,CACnB,CACA/nE,EAAIsI,UAAY8uB,EAGhB/yC,KAAKwzC,cAAc73B,EACrB,CAYA2oE,YAAAA,CACEC,EACAxB,EACAyB,EACAC,GAEA,MAAMt/E,EAAYP,EAAMC,aAAak+E,GACnC2B,EAAkB1kF,KAAKkjF,oBAAoBH,GAC3C4B,EAASH,EAAeD,EACxBK,EACEJ,GACAE,IAAoB1kF,KAAKkjF,oBAAoBuB,GAC/CI,EAAiB9B,EAAUlnD,SAAW77B,KAAK6gC,gBAC7C,IAAI7uB,EACF8yE,EACAC,EACA1C,EAYF,GAVImC,QAA4ChkF,IAA5B2E,EAAUq/E,KAC5BO,EAAgB5/E,EAAUq/E,SAEHhkF,IAArB2E,EAAUo/E,KACZlC,EAAcrwE,EAAQ7M,EAAUo/E,IAE9BK,QAAwCpkF,IAAtB2E,EAAUw/E,KAC9BG,EAAc3/E,EAAUw/E,GACxBtC,EAAcyC,EAAcC,QAGlBvkF,IAAVwR,QACkBxR,IAAlBukF,QACgBvkF,IAAhBskF,EACA,CACA,MAAMnpE,EAnwBZ,WACE,IAAK8kE,GAAkB,CACrB,MAAMt9E,EAASyQ,GAAuB,CACpC5B,MAAO,EACPC,OAAQ,IAEVwuE,GAAmBt9E,EAAOC,WAAW,KACvC,CACA,OAAOq9E,EACT,CA0vBkBuE,GAEZhlF,KAAK0iF,eAAe/mE,EAAKonE,GAAW,QACtBviF,IAAVwR,IACFqwE,EAAcrwE,EAAQ2J,EAAIspE,YAAYV,GAAOvyE,MAC7C7M,EAAUo/E,GAASvyE,QAECxR,IAAlBukF,GAA+BH,GAAkBJ,IACnDO,EAAgBppE,EAAIspE,YAAYT,GAAcxyE,MAC9C7M,EAAUq/E,GAAgBO,GAExBH,QAAkCpkF,IAAhBskF,IAEpBA,EAAcnpE,EAAIspE,YAAYN,GAAQ3yE,MACtC7M,EAAUw/E,GAAUG,EAEpBzC,EAAcyC,EAAcC,EAEhC,CACA,MAAO,CACL/yE,MAAOA,EAAQ6yE,EACfxC,YAAaA,EAAewC,EAEhC,CAQAK,eAAAA,CAAgB/G,EAAcoG,GAC5B,OAAOvkF,KAAKmkF,qBAAqBhG,EAAMoG,EAAO,WAChD,CAMAY,WAAAA,CAAYjH,GACV,MAAMkH,EAAWplF,KAAKqlF,aAAanH,GAOnC,OANyB,IAArBl+E,KAAK0gC,cACP0kD,EAASpzE,OAAShS,KAAKslF,0BAErBF,EAASpzE,MAAQ,IACnBozE,EAASpzE,MAAQ,GAEZozE,CACT,CAQAC,YAAAA,CAAanH,GACX,IACEqH,EACAC,EAFExzE,EAAQ,EAIZ,MAAMsiE,EAAUt0E,KAAKwgC,WAAa75B,EAChCub,EAAOliB,KAAKkiB,KACZi8D,EAAOn+E,KAAK6+E,WAAWX,GACvBuH,EAAUtH,EAAK59E,OACfmlF,EAAa,IAAI9jF,MAAoB6jF,GAEvCzlF,KAAKoiF,aAAalE,GAAawH,EAC/B,IAAK,IAAIv6E,EAAI,EAAGA,EAAIs6E,EAASt6E,IAAK,CAChC,MAAMw6E,EAAWxH,EAAKhzE,GACtBq6E,EAAexlF,KAAK4lF,gBAAgBD,EAAUzH,EAAW/yE,EAAGo6E,GAC5DG,EAAWv6E,GAAKq6E,EAChBxzE,GAASwzE,EAAanD,YACtBkD,EAAeI,CACjB,CAUA,GAPAD,EAAWD,GAAW,CACpB3zE,KAAM0zE,EAAeA,EAAa1zE,KAAO0zE,EAAaxzE,MAAQ,EAC9DA,MAAO,EACPqwE,YAAa,EACbpwE,OAAQjS,KAAK67B,SACb8E,OAAQ,GAENze,GAAQA,EAAK2+D,aAAc,CAC7B,IAAIgF,EAAiB,EACrB,MAAMC,EACJ5jE,EAAK2+D,aAAa3+D,EAAK2+D,aAAatgF,OAAS,GAAGA,OAClD,OAAQP,KAAKogC,WACX,KAAK55B,EACHq/E,EAAiBvR,EAAUwR,EAAkB9zE,EAAQ,EACrD,MACF,KAAKzL,EACHs/E,GAAkBC,EAAkB9zE,GAAS,EAC7C,MACF,KAAKrL,EACHk/E,EAAiBvR,EAAU,EAAIwR,EAAkB9zE,EAIrD6zE,GAAkB7lF,KAAKugC,iBAAmB+zC,GAAU,EAAK,GACzD,IACE,IAAInpE,EAAImpE,EAAUmR,EAAU,EAAI,EAChCnR,EAAUnpE,GAAK,EAAIA,EAAIs6E,EACvBnR,EAAUnpE,IAAMA,IAEhBq6E,EAAeE,EAAWv6E,GACtB06E,EAAiBC,EACnBD,GAAkBC,EACTD,EAAiB,IAC1BA,GAAkBC,GAIpB9lF,KAAK+lF,mBAAmBF,EAAgBL,GACxCK,GAAkBL,EAAanD,WAEnC,CACA,MAAO,CAAErwE,MAAOA,EAAOg0E,YAAa,EACtC,CAUAD,kBAAAA,CAAmBF,EAAwBL,GACzC,MAAMS,EAAiBJ,EAAiBL,EAAanD,YAAc,EACjEngE,EAAOliB,KAAKkiB,KAGRg+C,EAAOK,GAAer+C,EAAKA,KAAM+jE,EAAgB/jE,EAAK2+D,cAC5D2E,EAAanB,WAAankB,EAAKl0D,EAAIkW,EAAKwhD,WAAW13D,EACnDw5E,EAAa3f,UAAY3F,EAAKn0D,EAAImW,EAAKwhD,WAAW33D,EAClDy5E,EAAa/5E,MAAQy0D,EAAKz0D,OAASzL,KAAKwgC,WAAa75B,EAAQjC,KAAKqB,GAAK,EACzE,CAUA6/E,eAAAA,CACED,EACAzH,EACAzxB,EACA84B,EACAW,GAEA,MAAM/qE,EAAQnb,KAAK4/E,4BAA4B1B,EAAWzxB,GACxDR,EAAYs5B,EACRvlF,KAAK4/E,4BAA4B1B,EAAWzxB,EAAY,GACxD,CAAA,EACJyT,EAAOlgE,KAAKskF,aAAaqB,EAAUxqE,EAAOoqE,EAAct5B,GAC1D,IAEEvrB,EAFE2hD,EAAcniB,EAAKmiB,YACrBrwE,EAAQkuD,EAAKluD,MAGU,IAArBhS,KAAK0gC,cACPA,EAAc1gC,KAAKslF,yBACnBtzE,GAAS0uB,EACT2hD,GAAe3hD,GAGjB,MAAMljB,EAAoB,CACxBxL,QACAF,KAAM,EACNG,OAAQkJ,EAAM0gB,SACdwmD,cACA1hD,OAAQxlB,EAAMwlB,QAEhB,GAAI8rB,EAAY,IAAMy5B,EAAU,CAC9B,MAAMC,EAAcnmF,KAAKoiF,aAAalE,GAAWzxB,EAAY,GAC7DjvC,EAAI1L,KACFq0E,EAAYr0E,KAAOq0E,EAAYn0E,MAAQkuD,EAAKmiB,YAAcniB,EAAKluD,KACnE,CACA,OAAOwL,CACT,CAOAmmE,eAAAA,CAAgBzF,GACd,GAAIl+E,KAAKomF,cAAclI,GACrB,OAAOl+E,KAAKomF,cAAclI,GAK5B,IAAImI,EAAYrmF,KAAKklF,gBAAgBhH,EAAW,GAChD,IAAK,IAAI/yE,EAAI,EAAGoY,EAAMvjB,KAAK6+E,WAAWX,GAAW39E,OAAQ4K,EAAIoY,EAAKpY,IAChEk7E,EAAY3hF,KAAKC,IAAI3E,KAAKklF,gBAAgBhH,EAAW/yE,GAAIk7E,GAG3D,OAAQrmF,KAAKomF,cAAclI,GACzBmI,EAAYrmF,KAAKqgC,WAAargC,KAAKohC,aACvC,CAKAsgD,cAAAA,GACE,IAAIrhD,EACFpuB,EAAS,EACX,IAAK,IAAI9G,EAAI,EAAGoY,EAAMvjB,KAAK6+E,WAAWt+E,OAAQ4K,EAAIoY,EAAKpY,IACrDk1B,EAAargC,KAAK2jF,gBAAgBx4E,GAClC8G,GAAU9G,IAAMoY,EAAM,EAAI8c,EAAargC,KAAKqgC,WAAaA,EAE3D,OAAOpuB,CACT,CAMAsxE,cAAAA,GACE,MAA0B,QAAnBvjF,KAAK4gC,WAAuB5gC,KAAKgS,MAAQ,EAAIhS,KAAKgS,MAAQ,CACnE,CAMAyxE,aAAAA,GACE,OAAQzjF,KAAKiS,OAAS,CACxB,CAOAq0E,iBAAAA,CACE3qE,EACAw7C,GAEAx7C,EAAI2G,OACJ,IAAIikE,EAAc,EAClB,MAAMz0E,EAAO9R,KAAKujF,iBAChBxxE,EAAM/R,KAAKyjF,gBACb,IAAK,IAAIt4E,EAAI,EAAGoY,EAAMvjB,KAAK6+E,WAAWt+E,OAAQ4K,EAAIoY,EAAKpY,IAAK,CAC1D,MAAMu4E,EAAe1jF,KAAK2jF,gBAAgBx4E,GACxCk7E,EAAY3C,EAAe1jF,KAAKqgC,WAChCijD,EAAatjF,KAAK6jF,mBAAmB14E,GACvCnL,KAAKojF,gBACHjsB,EACAx7C,EACA3b,KAAK6+E,WAAW1zE,GAChB2G,EAAOwxE,EACPvxE,EAAMw0E,EAAcF,EACpBl7E,GAEFo7E,GAAe7C,CACjB,CACA/nE,EAAI6G,SACN,CAMAsgE,eAAAA,CAAgBnnE,IACT3b,KAAK0jB,MAAS1jB,KAAKq+E,SAASz2E,KAIjC5H,KAAKsmF,kBAAkB3qE,EAAK,WAC9B,CAMAknE,iBAAAA,CAAkBlnE,IACV3b,KAAK49B,QAA+B,IAArB59B,KAAKo9B,cAAsBp9B,KAAKi+E,mBAIjDj+E,KAAK69B,SAAW79B,KAAK69B,OAAOqF,cAC9BljC,KAAKwzC,cAAc73B,GAGrBA,EAAI2G,OACJtiB,KAAKs0C,aAAa34B,EAAK3b,KAAKq9B,iBAC5B1hB,EAAIkI,YACJ7jB,KAAKsmF,kBAAkB3qE,EAAK,cAC5BA,EAAIqI,YACJrI,EAAI6G,UACN,CAWA6gE,YAAAA,CACElsB,EACAx7C,EACAwiE,EACArsE,EACAC,EACAmsE,GAEA,MAAM79C,EAAargC,KAAK2jF,gBAAgBzF,GACtCsI,EAAYxmF,KAAKogC,UAAUxvB,SAASywB,IACpCnf,EAAOliB,KAAKkiB,KACZukE,GACGD,GACoB,IAArBxmF,KAAK0gC,aACL1gC,KAAKi+E,cAAcC,KAClBh8D,EACHwkE,EAA2B,QAAnB1mF,KAAK4gC,UACb/0B,EAA0B,QAAnB7L,KAAK4gC,UAAsB,GAAI,EAGtC+lD,EAAmBhrE,EAAIilB,UAEzB,IAAIgmD,EACFC,EAEAzC,EAEA0C,EACAC,EAJAC,EAAgB,GAEhBhD,EAAW,EAWb,GAPAroE,EAAI2G,OACAqkE,IAAqB3mF,KAAK4gC,YAC5BjlB,EAAIxY,OAAO0Y,aAAa,MAAO6qE,EAAQ,MAAQ,OAC/C/qE,EAAIilB,UAAY8lD,EAAQ,MAAQ,MAChC/qE,EAAIykB,UAAYsmD,EAAQlgF,EAAOG,GAEjCoL,GAAQsuB,EAAargC,KAAKkhC,kBAAqBlhC,KAAKqgC,WAChDomD,EAKF,OAFAzmF,KAAKinF,YAAY9vB,EAAQx7C,EAAKuiE,EAAW,EAAGC,EAAKrkE,KAAK,IAAKhI,EAAMC,QACjE4J,EAAI6G,UAGN,IAAK,IAAIrX,EAAI,EAAGoY,EAAM46D,EAAK59E,OAAS,EAAG4K,GAAKoY,EAAKpY,IAC/C27E,EAAe37E,IAAMoY,GAAOvjB,KAAK0gC,aAAexe,EAChD8kE,GAAiB7I,EAAKhzE,GACtBi5E,EAAUpkF,KAAKoiF,aAAalE,GAAW/yE,GACtB,IAAb64E,GACFlyE,GAAQjG,GAAQu4E,EAAQ/B,YAAc+B,EAAQpyE,OAC9CgyE,GAAYI,EAAQpyE,OAEpBgyE,GAAYI,EAAQ/B,YAElBmE,IAAcM,GACZ9mF,KAAK+/B,eAAe8uB,KAAKsvB,EAAKhzE,MAChC27E,GAAe,GAGdA,IAEHF,EACEA,GAAe5mF,KAAK4/E,4BAA4B1B,EAAW/yE,GAC7D07E,EAAY7mF,KAAK4/E,4BAA4B1B,EAAW/yE,EAAI,GAC5D27E,EAAe96B,GAAgB46B,EAAaC,GAAW,IAErDC,IACE5kE,GACFvG,EAAI2G,OACJ3G,EAAIy1B,UAAUgzC,EAAQC,WAAYD,EAAQve,WAC1ClqD,EAAIvN,OAAOg2E,EAAQ34E,OACnBzL,KAAKinF,YACH9vB,EACAx7C,EACAuiE,EACA/yE,EACA67E,GACChD,EAAW,EACZ,GAEFroE,EAAI6G,YAEJukE,EAAcj1E,EACd9R,KAAKinF,YACH9vB,EACAx7C,EACAuiE,EACA/yE,EACA67E,EACAD,EACAh1E,IAGJi1E,EAAgB,GAChBJ,EAAcC,EACd/0E,GAAQjG,EAAOm4E,EACfA,EAAW,GAGfroE,EAAI6G,SACN,CAaA0kE,kCAAAA,CAAmCltE,GAEjC,MAAMhI,EAAQhS,KAAKgS,MAAQhS,KAAKo9B,YAC9BnrB,EAASjS,KAAKiS,OAASjS,KAAKo9B,YAC5BmY,EAAU3hC,GAAuB,CAC/B5B,QACAC,WAEFujC,EAAOD,EAAQnyC,WAAW,MAa5B,OAZAmyC,EAAQvjC,MAAQA,EAChBujC,EAAQtjC,OAASA,EACjBujC,EAAK3xB,YACL2xB,EAAK1xB,OAAO,EAAG,GACf0xB,EAAKzxB,OAAO/R,EAAO,GACnBwjC,EAAKzxB,OAAO/R,EAAOC,GACnBujC,EAAKzxB,OAAO,EAAG9R,GACfujC,EAAKxxB,YACLwxB,EAAKpE,UAAUp/B,EAAQ,EAAGC,EAAS,GACnCujC,EAAKvxB,UAAYjK,EAAOC,OAAOu7B,GAC/Bx1C,KAAKo0C,+BAA+BoB,EAAMx7B,GAC1Cw7B,EAAK9xB,OACE8xB,EAAKC,cAAcF,EAAS,YACrC,CAEA4xC,YAAAA,CACExrE,EACA3I,EACAgH,GAEA,IAAIK,EAAiB6J,EACrB,OAAInK,GAASC,GAEwC,eAAhDA,EAA8Bi6B,eAC9Bj6B,EAA8BoK,mBAC9BpK,EAAmBqK,kBAMpBhK,GAAWra,KAAKgS,MAAQ,EACxBkS,GAAWlkB,KAAKiS,OAAS,EACzB0J,EAAIy1B,UAAU/2B,EAAS6J,GACvBvI,EAAI3I,GAAYhT,KAAKknF,mCAAmCltE,GACjD,CAAEK,UAAS6J,aAGlBvI,EAAI3I,GAAYgH,EAAOC,OAAO0B,GACvB3b,KAAKo0C,+BAA+Bz4B,EAAK3B,KAIlD2B,EAAI3I,GAAYgH,EAEX,CAAEK,QAAS,EAAG6J,QAAS,GAChC,CASAwvB,gBAAAA,CACE/3B,EAA6B7W,GAK7B,IAJA84B,OACEA,EAAMR,YACNA,GAC6Dt4B,EAO/D,OALA6W,EAAIi4B,UAAYxW,EAChBzhB,EAAIk4B,QAAU7zC,KAAKu9B,cACnB5hB,EAAIm4B,eAAiB9zC,KAAKs9B,iBAC1B3hB,EAAIo4B,SAAW/zC,KAAKw9B,eACpB7hB,EAAIq4B,WAAah0C,KAAKy9B,iBACfz9B,KAAKmnF,aAAaxrE,EAAK,cAAeiiB,EAC/C,CASAyW,cAAAA,CAAe14B,EAA6BpR,GAAgC,IAA9BmZ,KAAEA,GAA0BnZ,EACxE,OAAOvK,KAAKmnF,aAAaxrE,EAAK,YAAa+H,EAC7C,CAaAujE,WAAAA,CACE9vB,EACAx7C,EACAuiE,EACAzxB,EACA83B,EACAzyE,EACAC,GAEA,MAAM4hC,EAAO3zC,KAAKs/E,qBAAqBpB,EAAWzxB,GAChD26B,EAAWpnF,KAAK4/E,4BAA4B1B,EAAWzxB,GACvD46B,EAAwB,aAAXlwB,GAAyBiwB,EAAS1jE,KAC/C+gC,EACa,eAAX0S,GAA2BiwB,EAASxpD,QAAUwpD,EAAShqD,YAE3D,GAAKqnB,GAAiB4iC,EAAtB,CAcA,GAXA1rE,EAAI2G,OAEJ3G,EAAIk1C,KAAO7wD,KAAKkjF,oBAAoBkE,GAEhCzzC,EAAKrT,qBACPtgC,KAAKwzC,cAAc73B,GAEjBg4B,EAAKhT,SACP5uB,GAAO4hC,EAAKhT,QAGV0mD,EAAY,CACd,MAAMC,EAActnF,KAAKq0C,eAAe14B,EAAKyrE,GAC7CzrE,EAAI4rE,SACFhD,EACAzyE,EAAOw1E,EAAYjtE,QACnBtI,EAAMu1E,EAAYpjE,QAEtB,CAEA,GAAIugC,EAAc,CAChB,MAAM+iC,EAAgBxnF,KAAK0zC,iBAAiB/3B,EAAKyrE,GACjDzrE,EAAI8rE,WACFlD,EACAzyE,EAAO01E,EAAcntE,QACrBtI,EAAMy1E,EAActjE,QAExB,CAEAvI,EAAI6G,SA9BJ,CA+BF,CAOAklE,cAAAA,CAAengD,EAAeolB,GAC5B3sD,KAAK2nF,WAAWpgD,EAAOolB,EAAK3sD,KAAK+gC,YACnC,CAOA6mD,YAAAA,CAAargD,EAAeolB,GAC1B3sD,KAAK2nF,WAAWpgD,EAAOolB,EAAK3sD,KAAKihC,UACnC,CASU0mD,UAAAA,CACRpgD,EACAolB,EACAk7B,GAKA,MAAMC,EAAM9nF,KAAKk/E,oBAAoB33C,GAAO,GAC1C1L,EAAW77B,KAAKmkF,qBACd2D,EAAI5J,UACJ4J,EAAIr7B,UACJ,YAEF9+C,EAAK3N,KAAKmkF,qBAAqB2D,EAAI5J,UAAW4J,EAAIr7B,UAAW,UAC7DtxC,EAAQ,CACN0gB,SAAUA,EAAWgsD,EAAOp4E,KAC5BkxB,OAAQhzB,EAAKkuB,EAAWgsD,EAAO7mD,UAEnChhC,KAAK6/E,mBAAmB1kE,EAAOosB,EAAOolB,EACxC,CAOAk3B,kBAAAA,CAAmB3F,GACjB,MAAMtqC,EAAY5zC,KAAKmiF,aAAajE,GAClC6J,EAAW/nF,KAAKgS,MAAQ4hC,EACxBxT,EAAYpgC,KAAKogC,UACjBQ,EAAY5gC,KAAK4gC,UACjBshD,EAAkBliF,KAAKkiF,gBAAgBhE,GACzC,IAAIoF,EAAa,EACjB,OACEljD,IAAciB,IACbjB,IAAcoB,KAAmB0gD,GACjC9hD,IAAcmB,KAAkB2gD,GAChC9hD,IAAckB,KAAiB4gD,EAEzB,GAEL9hD,IAAc75B,IAChB+8E,EAAayE,EAAW,GAEtB3nD,IAAcz5B,IAChB28E,EAAayE,GAEX3nD,IAAcoB,KAChB8hD,EAAayE,EAAW,GAEtB3nD,IAAcmB,KAChB+hD,EAAayE,GAEG,QAAdnnD,IAEAR,IAAcz5B,GACdy5B,IAAciB,IACdjB,IAAcmB,GAEd+hD,EAAa,EACJljD,IAAc55B,GAAQ45B,IAAckB,GAC7CgiD,GAAcyE,EACL3nD,IAAc75B,GAAU65B,IAAcoB,KAC/C8hD,GAAcyE,EAAW,IAGtBzE,EACT,CAKA/B,WAAAA,GACEvhF,KAAK8/E,kBAAmB,EACxB9/E,KAAKgoF,aAAe,GACpBhoF,KAAKomF,cAAgB,GACrBpmF,KAAKoiF,aAAe,EACtB,CASAD,YAAAA,CAAajE,GACX,QAAqC19E,IAAjCR,KAAKgoF,aAAa9J,GACpB,OAAOl+E,KAAKgoF,aAAa9J,GAG3B,MAAMlsE,MAAEA,GAAUhS,KAAKmlF,YAAYjH,GAEnC,OADAl+E,KAAKgoF,aAAa9J,GAAalsE,EACxBA,CACT,CAEAszE,sBAAAA,GACE,OAAyB,IAArBtlF,KAAK0gC,YACC1gC,KAAK67B,SAAW77B,KAAK0gC,YAAe,IAEvC,CACT,CASAyjD,oBAAAA,CACEjG,EACAzxB,EACAz5C,GACS,IAAAi1E,EAET,OAA2B,QAA3BA,EADkBjoF,KAAKs/E,qBAAqBpB,EAAWzxB,GACrCz5C,UAAS,IAAAi1E,EAAAA,EAAIjoF,KAAKgT,EACtC,CAMA4vE,qBAAAA,CACEjnE,EACAjT,GAEA,IAAK1I,KAAK0I,KAAU1I,KAAKq+E,SAAS31E,GAChC,OAEF,IAAIw/E,EAAYloF,KAAKyjF,gBACrB,MAAMH,EAAatjF,KAAKujF,iBACtBrhE,EAAOliB,KAAKkiB,KACZwe,EAAc1gC,KAAKslF,yBACnB6C,EACW,gBAATz/E,EAAyB,GAAe,aAATA,EAAsB,EAAI,EAC3Dwb,EAAUlkB,KAAKmhC,QAAQz4B,GACzB,IAAK,IAAIyC,EAAI,EAAGoY,EAAMvjB,KAAK6+E,WAAWt+E,OAAQ4K,EAAIoY,EAAKpY,IAAK,CAC1D,MAAMu4E,EAAe1jF,KAAK2jF,gBAAgBx4E,GAC1C,IAAKnL,KAAK0I,KAAU1I,KAAKq+E,SAAS31E,EAAMyC,GAAI,CAC1C+8E,GAAaxE,EACb,QACF,CACA,MAAMvF,EAAOn+E,KAAK6+E,WAAW1zE,GACvBk7E,EAAY3C,EAAe1jF,KAAKqgC,WAChCujD,EAAiB5jF,KAAK6jF,mBAAmB14E,GAC/C,IAAI84E,EAAW,EACXD,EAAW,EACXoE,EAAiBpoF,KAAKmkF,qBAAqBh5E,EAAG,EAAGzC,GACjD2/E,EAAWroF,KAAKmkF,qBAAqBh5E,EAAG,EAAGvD,GAC3C0gF,EAAetoF,KAAKmkF,qBACtBh5E,EACA,EACAm0B,IAEEipD,EAAoBH,EACpBI,EAAcH,EACdI,EAAkBH,EACtB,MAAMv2E,EAAMm2E,EAAY7B,GAAa,EAAIrmF,KAAKkhC,mBAC9C,IAAIzxB,EAAOzP,KAAKklF,gBAAgB/5E,EAAG,GAC/BwC,EAAK3N,KAAKmkF,qBAAqBh5E,EAAG,EAAG,UACzC,IAAK,IAAIksC,EAAI,EAAG2jB,EAAOmjB,EAAK59E,OAAQ82C,EAAI2jB,EAAM3jB,IAAK,CACjD,MAAM+sC,EAAUpkF,KAAKoiF,aAAaj3E,GAAGksC,GACrCkxC,EAAoBvoF,KAAKmkF,qBAAqBh5E,EAAGksC,EAAG3uC,GACpD8/E,EAAcxoF,KAAKmkF,qBAAqBh5E,EAAGksC,EAAGzvC,GAC9C6gF,EAAkBzoF,KAAKmkF,qBACrBh5E,EACAksC,EACA/X,IAEF,MAAMopD,EAAc1oF,KAAKklF,gBAAgB/5E,EAAGksC,GACtCsxC,EAAY3oF,KAAKmkF,qBAAqBh5E,EAAGksC,EAAG,UAClD,GAAIn1B,GAAQqmE,GAAqBC,EAAa,CAC5C,MAAMI,EAAiB5oF,KAAK67B,SAAW4sD,EAAmB,IAC1D9sE,EAAI2G,OAEJ3G,EAAIsI,UAAYokE,EAChB1sE,EAAIy1B,UAAUgzC,EAAQC,WAAYD,EAAQve,WAC1ClqD,EAAIvN,OAAOg2E,EAAQ34E,OACnBkQ,EAAI43B,UACD6wC,EAAQ/B,YAAc,EACvBn+D,EAAUwkE,EAAcC,EAAYR,EAAgBS,EACpDxE,EAAQ/B,YACRuG,GAEFjtE,EAAI6G,SACN,MAAO,IACJ+lE,IAAsBH,GACrBI,IAAgBH,GAChBK,IAAgBj5E,GAChBg5E,IAAoBH,GACpBK,IAAch7E,IAChBq2E,EAAW,EACX,CACA,MAAM4E,EAAiB5oF,KAAK67B,SAAWysD,EAAgB,IACvD,IAAIxE,EAAYR,EAAaM,EAAiBK,EACvB,QAAnBjkF,KAAK4gC,YACPkjD,EAAY9jF,KAAKgS,MAAQ8xE,EAAYE,GAEnCoE,GAAkBC,GAAYC,IAEhC3sE,EAAIsI,UAAYokE,EAChB1sE,EAAI43B,SACFuwC,EACA/xE,EAAMmS,EAAUzU,EAAO9B,EAAKw6E,EAAgBS,EAC5C5E,EACA4E,IAGJ3E,EAAWG,EAAQtyE,KACnBkyE,EAAWI,EAAQpyE,MACnBo2E,EAAiBG,EACjBD,EAAeG,EACfJ,EAAWG,EACX/4E,EAAOi5E,EACP/6E,EAAKg7E,CACP,MACE3E,GAAYI,EAAQ/B,WAExB,CACA,IAAIyB,EAAYR,EAAaM,EAAiBK,EACvB,QAAnBjkF,KAAK4gC,YACPkjD,EAAY9jF,KAAKgS,MAAQ8xE,EAAYE,GAEvCroE,EAAIsI,UAAYukE,EAChB,MAAMI,EAAiB5oF,KAAK67B,SAAW4sD,EAAmB,IAC1DF,GACEC,GACAC,GACA9sE,EAAI43B,SACFuwC,EACA/xE,EAAMmS,EAAUzU,EAAO9B,EAAKw6E,EAAgBS,EAC5C5E,EAAWtjD,EACXkoD,GAEJV,GAAaxE,CACf,CAGA1jF,KAAKwzC,cAAc73B,EACrB,CAOAunE,mBAAAA,GAaU,IAZRliF,WACEA,EAAahB,KAAKgB,WAAU+D,UAC5BA,EAAY/E,KAAK+E,UAASC,WAC1BA,EAAahF,KAAKgF,WAAU62B,SAC5BA,EAAW77B,KAAK67B,UAMjBv7B,UAAAC,OAAA,QAAAC,IAAAF,UAAA,GAAAA,UAAA,GAAG,CAAA,EACJ0iF,EAAsB1iF,UAAAC,OAAA,EAAAD,kBAAAE,EAEtB,MAAMqoF,EACJ7nF,EAAW4P,SAAS,MACpB5P,EAAW4P,SAAS,MACpB5P,EAAW4P,SAAS,MACpB8vE,GAAWoI,aAAal4E,SAAS5P,EAAWiE,eACxCjE,EACA,IAAIA,KACV,MAAO,CACL+D,EACAC,EACA,GAAGg+E,EAAehjF,KAAK6gC,gBAAkBhF,MACzCgtD,GACA/uE,KAAK,IACT,CAMA0J,MAAAA,CAAO7H,GACA3b,KAAKsS,UAIRtS,KAAKmD,QACLnD,KAAKmD,OAAOob,gBACXve,KAAK0sC,QACL1sC,KAAKqtC,eAIJrtC,KAAK8/E,kBACP9/E,KAAK4gF,iBAEPxgF,MAAMojB,OAAO7H,IACf,CAUAkvC,aAAAA,CAAcv/C,GACZ,OAAOu/C,GAAcv/C,EACvB,CAOA01E,mBAAAA,CAAoB10B,GAClB,MAAM20B,EAAQ30B,EAAK/wB,MAAMv7B,KAAK6/B,YAC5BkhD,EAAW,IAAIn/E,MAAgBq/E,EAAM1gF,QACrCwoF,EAAU,CAAC,MACb,IAAIC,EAAoB,GACxB,IAAK,IAAI79E,EAAI,EAAGA,EAAI81E,EAAM1gF,OAAQ4K,IAChC41E,EAAS51E,GAAKnL,KAAK6qD,cAAco2B,EAAM91E,IACvC69E,EAAUA,EAAQ99E,OAAO61E,EAAS51E,GAAI49E,GAGxC,OADAC,EAAQpxC,MACD,CACLwpC,gBAAiBL,EACjBE,MAAOA,EACPK,aAAc0H,EACd9H,cAAeH,EAEnB,CAOA5mE,QAAAA,GAGsD,IAApD8K,EAAwB3kB,UAAAC,OAAA,QAAAC,IAAAF,UAAA,GAAAA,UAAA,GAAG,GAC3B,MAAO,IACFF,MAAM+Z,SAAS,IAAIulB,MAAoBza,IAC1CoC,OAAQglC,GAAcrsD,KAAKqnB,OAAQrnB,KAAKssD,SACpCtsD,KAAKkiB,KAAO,CAAEA,KAAMliB,KAAKkiB,KAAK/H,YAAe,CAAA,EAErD,CAEA1R,GAAAA,CAAIlH,EAAmB+J,GACrB,MAAMm0B,qBAAEA,GAAyBz/B,KAAKF,YACtCM,MAAMqI,IAAIlH,EAAK+J,GACf,IAAI29E,GAAY,EACZC,GAAe,EACnB,GAAmB,iBAAR3nF,EACT,IAAK,MAAMM,KAAQN,EACJ,SAATM,GACF7B,KAAK2gF,cAEPsI,EAAYA,GAAaxpD,EAAqB7uB,SAAS/O,GACvDqnF,EAAeA,GAAyB,SAATrnF,OAGjConF,EAAYxpD,EAAqB7uB,SAASrP,GAC1C2nF,EAAuB,SAAR3nF,EASjB,OAPI2nF,GACFlpF,KAAK2gF,cAEHsI,GAAajpF,KAAK+8E,cACpB/8E,KAAK4gF,iBACL5gF,KAAK0f,aAEA1f,IACT,CAMA+Q,UAAAA,GACE,OAAO,CACT,CA+CA,wBAAa0gD,CACXh+C,EACAvR,EACA6rD,GAEA,MAAMwrB,EAAmBjpB,GACvB78C,EACAitE,GAAW/uB,gBACX5D,IAGIo7B,WACJA,EAAa3iF,EAAkD4iF,eAC/DA,EAAiB,GAAE17E,GACnBA,EAAK,EAACC,GACNA,EAAK,EAACoE,IACNA,EAAM,EAACD,KACPA,EAAO,EAAC+pB,SACRA,EAAWx1B,EAAqB+2B,YAChCA,EAAc,KACXisD,GACD,IAAKnnF,KAAYq3E,GASfjtB,EAAO,IAAItsD,MAPIyT,EAAQ61E,aAAe,IACzCvmD,QAAQ,iBAAkB,IAC1BA,QAAQ,OAAQ,KAKgB,CAC/BjxB,KAAMA,EAAOpE,EACbqE,IAAKA,EAAMpE,EACXsyB,UAAWmpD,EAAex4E,SAAS,aACnCsvB,SAAUkpD,EAAex4E,SAAS,YAClCuvB,YAAaipD,EAAex4E,SAAS,gBAErCwsB,YAAa,EACbvB,cACGwtD,IAELE,EAAwBj9B,EAAK7e,kBAAoB6e,EAAKr6C,OAGtDu3E,IADGl9B,EAAKr6C,OAASq6C,EAAKlvB,aAAekvB,EAAKjsB,WAAaisB,EAAKr6C,QAC9Bs3E,EAC9BE,EAAan9B,EAAK7e,kBAAoB+7C,EAExC,IAAIE,EAAO,EAoBX,OAdIP,IAAe5iF,IACjBmjF,EAAOp9B,EAAK/e,iBAAmB,GAE7B47C,IAAexiF,IACjB+iF,EAAOp9B,EAAK/e,kBAEd+e,EAAK7jD,IAAI,CACPqJ,KAAMw6C,EAAKx6C,KAAO43E,EAClB33E,IACEu6C,EAAKv6C,KACJ03E,EAAan9B,EAAKzwB,UAAY,IAAOywB,EAAKprB,oBACzCorB,EAAKjsB,WACTjD,gBAEKkvB,CACT,CASA,iBAAO/zC,CAGLlJ,GACA,OAAOrP,KAAKw4C,YACV,IACKnpC,EACHgY,OAAQulC,GAAgBv9C,EAAOgY,QAAU,CAAA,EAAIhY,EAAOi9C,OAEtD,CACE5T,WAAY,QAGlB,EAhxDA34C,EARW2gF,GAAU,uBAamBjhD,IAAoB1/B,EAbjD2gF,GAAU,kBAwRI,IAAIp9C,MAAoB5D,KAAgB3/B,EAxRtD2gF,GAAU,cA0RA9gD,IAAiB7/B,EA1R3B2gF,GAAU,OA4RP,QAAM3gF,EA5RT2gF,GAAU,eAqpDC,CACpB,QACA,aACA,YACA,UACA,UACA,YACA,WACA,gBACA,eACA,aACA,OACA,QACA,aAKF3gF,EAvqDW2gF,GAAU,kBA2qDI3zB,GAAkB7hD,OACzC,IACA,IACA,KACA,KACA,cACA,aACA,cACA,YACA,iBACA,kBACA,gBAqGJs6C,GAAYk7B,GAAY,CD73DjB,cAAiC1jD,GACtCkB,MAAAA,GACE,MAAMiD,EAAUnhC,KAAK2pF,wBACnBC,EAAY5pF,KAAK6pF,iBAAiB1oD,EAAQ2oD,QAAS3oD,EAAQ4oD,UAC7D,OAAO/pF,KAAKgqF,kBAAkBJ,EAChC,CAEA3jE,KAAAA,CAA6C9N,GAC3C,MAAM8xE,EAAUjqF,KAAKo+B,qBAAqBp+B,KAAKk+B,SAAU,CACrD/lB,UACAqmB,SAAS,EACTC,YAAY,IAEdvc,EAAOliB,KAAKkiB,KACd,OAAIA,EAEA+nE,EACA/nE,EAAKkc,qBAAqBlc,EAAKgc,SAAU,CACvC/lB,UACAsmB,YAAY,EACZvX,oBAAqBtN,GAAY5Z,KAAKyqB,mBAIrCw/D,CACT,CAEQN,qBAAAA,GACN,MAAO,CACLI,UAAW/pF,KAAKgS,MAAQ,EACxB83E,SAAU9pF,KAAKiS,OAAS,EACxBi4E,QAASlqF,KAAK2jF,gBAAgB,GAElC,CAEQqG,iBAAAA,CAAiBllF,GASvB,IAPAqlF,YACEA,EAAWC,UACXA,GAIDtlF,EAED,MACEskF,EAAiBppF,KAAKqqF,qBAAqBrqF,MAC7C,MAAO,CACLmqF,EAAYrwE,KAAK,IACjB,kCACA,gBAAgB9Z,KAAKgB,WAAW+hC,QAAQs9C,GAAe,SACvD,cAAcrgF,KAAK67B,aACnB77B,KAAK+E,UAAY,eAAe/E,KAAK+E,cAAgB,GACrD/E,KAAKgF,WAAa,gBAAgBhF,KAAKgF,eAAiB,GACxDokF,EAAiB,oBAAoBA,MAAqB,GACvC,QAAnBppF,KAAK4gC,UAAsB,cAAc5gC,KAAK4gC,cAAgB,GAC9D,UACA5gC,KAAKi9B,cAZU,GAaf,IACAj9B,KAAKi/B,gBACL,KACAmrD,EAAUtwE,KAAK,IACf,YAEJ,CAQQ+vE,gBAAAA,CAENS,EACAC,GAEA,MAAMH,EAAsB,GAC1BD,EAAwB,GAC1B,IACEK,EADEv4E,EAASq4E,EAIbtqF,KAAKie,iBACHksE,EAAY//E,QACPk2E,GACDtgF,KAAKie,iBACJje,KAAKgS,MAAQ,GACbhS,KAAKiS,OAAS,EACfjS,KAAKgS,MACLhS,KAAKiS,SAKX,IAAK,IAAI9G,EAAI,EAAGoY,EAAMvjB,KAAK6+E,WAAWt+E,OAAQ4K,EAAIoY,EAAKpY,IACrDq/E,EAAaxqF,KAAK6jF,mBAAmB14E,GACd,QAAnBnL,KAAK4gC,YACP4pD,GAAcxqF,KAAKgS,QAEjBhS,KAAKsgC,qBAAuBtgC,KAAKq+E,SAAS,sBAAuBlzE,KACnEnL,KAAKyqF,kBACHN,EACAh/E,EACAo/E,EAAiBC,EACjBv4E,GAGJjS,KAAK0qF,oBACHN,EACAj/E,EACAo/E,EAAiBC,EACjBv4E,GAEFA,GAAUjS,KAAK2jF,gBAAgBx4E,GAGjC,MAAO,CACLi/E,YACAD,cAEJ,CAEQQ,mBAAAA,CAENC,EACAC,EACA/4E,EACAC,EACAqyE,GAEA,MAAM0G,EAAmB3qF,EAAO0Z,oBAC1BkxE,EAAa/qF,KAAKgrF,iBACpBH,EACAD,IAASA,EAAKtuD,UAAYsuD,EAAK5vD,MAAMolD,KAEvC6K,EAAaF,EAAa,UAAUA,KAAgB,GACpDp9E,EAAKk9E,EAAUlqD,OACfuqD,EAASv9E,EAAK,QAAQ4L,GAAQ5L,EAAIm9E,OAAwB,IAC1Dr/E,MAAEA,EAAK44E,WAAEA,EAAUxe,UAAEA,EAAS7zD,MAAEA,GAAUoyE,EAC5C,IAAI+G,EAAY,GAChB,QAAmB3qF,IAAf6jF,EAA0B,CAC5B,MAAM+G,EAAOp5E,EAAQ,EACrBvG,IACG0/E,EAAY,YAAY5xE,GAAQ/E,GAAiB/I,GAAQq/E,OAC5D,MAAM3mE,EAAI/N,GAAmB,CAAE3K,MAAO+I,GAAiB/I,KACvD0Y,EAAE,GAAKkgE,EACPlgE,EAAE,GAAK0hD,EACP,MAAMwlB,EAAc,IAAIv/E,IAAOs/E,EAAM,GAAGz8E,UAAUwV,GAClDrS,EAAOu5E,EAAYr/E,EACnB+F,EAAMs5E,EAAYt/E,CACpB,CAEA,MAAO,aAAawN,GAAQzH,EAAMg5E,UAAyBvxE,GACzDxH,EACA+4E,OACII,IAASC,IAAYF,KAAcvgC,GAAUkgC,YACrD,CAEQF,mBAAAA,CAENN,EACAlM,EACAqM,EACAD,GAEA,MAAMjqD,EAAargC,KAAK2jF,gBAAgBzF,GACtCsI,EAAYxmF,KAAKogC,UAAUxvB,SAASywB,IACpC88C,EAAOn+E,KAAK6+E,WAAWX,GACzB,IAAI0I,EACFC,EAEAzC,EACAjpE,EAEA2rE,EAJAE,EAAgB,GAGhBhD,EAAW,EAGbsG,GACGjqD,GAAc,EAAIrgC,KAAKkhC,mBAAsBlhC,KAAKqgC,WACrD,IAAK,IAAIl1B,EAAI,EAAGoY,EAAM46D,EAAK59E,OAAS,EAAG4K,GAAKoY,EAAKpY,IAC/C27E,EAAe37E,IAAMoY,GAAOvjB,KAAK0gC,aAAe1gC,KAAKkiB,KACrD8kE,GAAiB7I,EAAKhzE,GACtBi5E,EAAUpkF,KAAKoiF,aAAalE,GAAW/yE,GACtB,IAAb64E,GACFuG,GAAkBnG,EAAQ/B,YAAc+B,EAAQpyE,MAChDgyE,GAAYI,EAAQpyE,OAEpBgyE,GAAYI,EAAQ/B,YAElBmE,IAAcM,GACZ9mF,KAAK+/B,eAAe8uB,KAAKsvB,EAAKhzE,MAChC27E,GAAe,GAGdA,IAEHF,EACEA,GAAe5mF,KAAK4/E,4BAA4B1B,EAAW/yE,GAC7D07E,EAAY7mF,KAAK4/E,4BAA4B1B,EAAW/yE,EAAI,GAC5D27E,EAAe96B,GAAgB46B,EAAaC,GAAW,IAErDC,IACF3rE,EAAQnb,KAAKs/E,qBAAqBpB,EAAW/yE,GAC7Ci/E,EAAUhgF,KACRpK,KAAK2qF,oBACH3D,EACA7rE,EACAovE,EACAD,EACAlG,IAGJ4C,EAAgB,GAChBJ,EAAcC,EACS,QAAnB7mF,KAAK4gC,UACP2pD,GAAkBvG,EAElBuG,GAAkBvG,EAEpBA,EAAW,EAGjB,CAEQyG,iBAAAA,CAENN,EACAh/E,EACAm4E,EACAgH,GAEA,MAAMnM,EAAOn+E,KAAK6+E,WAAW1zE,GAC3Bu4E,EAAe1jF,KAAK2jF,gBAAgBx4E,GAAKnL,KAAKqgC,WAChD,IAEE0jD,EAFEC,EAAW,EACbC,EAAW,EAEXC,EAAYlkF,KAAKmkF,qBAAqBh5E,EAAG,EAAG,uBAC9C,IAAK,IAAIksC,EAAI,EAAGA,EAAI8mC,EAAK59E,OAAQ82C,IAAK,CACpC,MAAMvlC,KAAEA,EAAIE,MAAEA,EAAKqwE,YAAEA,GAAgBriF,KAAKoiF,aAAaj3E,GAAGksC,GAC1D0sC,EAAe/jF,KAAKmkF,qBAAqBh5E,EAAGksC,EAAG,uBAC3C0sC,IAAiBG,GACnBA,GACEiG,EAAY//E,QACPk2E,GACD4D,EACAZ,EAAaW,EACbqG,EACAtG,EACAN,IAGNO,EAAWnyE,EACXkyE,EAAWhyE,EACXkyE,EAAYH,GAEZC,GAAY3B,CAEhB,CACA0B,GACEoG,EAAY//E,QACPk2E,GACD4D,EACAZ,EAAaW,EACbqG,EACAtG,EACAN,GAGR,CAOAzmD,YAAAA,CAAoDC,GAClD,MAAO,GAAG98B,MAAM68B,aAAaC,iCAA0C3jB,GAASvZ,KAAKosD,wBAA0BpsD,KAAKuxC,mBAAmBxlC,EAAK,GAAI5L,EAAO0Z,0CACzJ,CAQAmxE,gBAAAA,CAEE7vE,EACAmwE,GAEA,MAAMtqF,WACJA,EAAUo8B,YACVA,EAAWQ,OACXA,EAAMla,KACNA,EAAImY,SACJA,EAAQ92B,UACRA,EAASC,WACTA,EAAU27B,OACVA,EAAMyrB,wBACNA,EAAuBjsB,YACvBA,EAAWD,SACXA,EAAQD,UACRA,GACE9kB,EAEEiuE,EAAiBppF,KAAKqqF,qBAAqB,CAC/CpqD,UAAWA,QAAAA,EAAajgC,KAAKigC,UAC7BC,SAAUA,QAAAA,EAAYlgC,KAAKkgC,SAC3BC,YAAaA,QAAAA,EAAengC,KAAKmgC,cAE7BorD,EAAYn/B,GAA2BpsD,KAAKosD,wBAClD,MAAO,CACLxuB,EAASjB,GAAe90B,EAAQ+1B,GAAU,GAC1CR,EAAc,iBAAiBA,MAAkB,GACjDp8B,EACI,gBACGA,EAAW4P,SAAS,MAAS5P,EAAW4P,SAAS,KAE9C5P,EADA,IAAIA,SAGV,GACJ66B,EAAW,cAAcA,QAAiB,GAC1C92B,EAAY,eAAeA,MAAgB,GAC3CC,EAAa,gBAAgBA,MAAiB,GAC9CokF,EACI,oBAAoBA,iCAA8C7vE,GAASgyE,EAAYvrF,KAAKuxC,mBAAmBxlC,EAAK,GAAI5L,EAAO0Z,0BAC/H,GACJ6J,EAAOiZ,GAAe/0B,EAAM8b,GAAQ,GACpCid,EAAS,oBAAoBA,MAAa,GAC1C2qD,EAAgB,qBAAuB,IACvCxxE,KAAK,GACT,CAOAuwE,oBAAAA,CAEElvE,GAEA,MAAQ,CAAC,WAAY,YAAa,gBAC/B3R,OACEgiF,GACCrwE,EACEqwE,EAAWzoD,QAAQ,IAAK,MAM7BjpB,KAAK,IACV,KC6hDF7R,EAAcM,SAASm4E,IACvBz4E,EAAcY,YAAY63E,ICr4DnB,MAAM+K,GAYX3rF,WAAAA,CAAY4J,GAAe3J,EAAAC,KAAA,cAAA,GAAAD,6BAVE,GAAKA,2BACP,GAAKA,2BACL,GAAKA,EAAAC,KAAA,4BAAA,GAAAD,EAAAC,KAAA,2BAAA,GAAAD,EAAAC,KAAA,gBAAA,GAS9BA,KAAK0J,OAASA,EACd,MAAMY,EAAY,CAChBtK,KAAK0J,OAAOG,GAAG,YAAa7J,KAAK0rF,iBAAiB7kD,KAAK7mC,OACvDA,KAAK0J,OAAOG,GAAG,WAAY7J,KAAK2rF,gBAAgB9kD,KAAK7mC,OACrDA,KAAK0J,OAAOG,GAAG,YAAa7J,KAAK4rF,iBAAiB/kD,KAAK7mC,OACvDA,KAAK0J,OAAOG,GAAG,UAAW7J,KAAK6rF,eAAehlD,KAAK7mC,OACnDA,KAAK0J,OAAOG,GAAG,OAAQ7J,KAAK8rF,YAAYjlD,KAAK7mC,QAE/CA,KAAK+rF,SAAW,KACdzhF,EAAUvJ,QAASyJ,GAAMA,KACzBxK,KAAK+rF,cAAWvrF,EAEpB,CAEAwrF,sBAAAA,CAAuB9hE,GACrB,MAAMxgB,EAAS1J,KAAK0J,OACduiF,EAAeviF,EAAOwiF,6BAA6BhiE,GACzD,OACExgB,EAAOygE,WACP8hB,GAAgBviF,EAAO84E,gBACvByJ,GAAgBviF,EAAOyiF,cACvBziF,EAAO84E,eAAiB94E,EAAOyiF,YAEnC,CAKA5kD,KAAAA,CAAMrd,GACJ,OAAQlqB,KAAKosF,mBAAqBpsF,KAAKgsF,uBAAuB9hE,EAChE,CAKAmiE,QAAAA,GACE,OAAOrsF,KAAKosF,kBACd,CAMAz/B,GAAAA,CAAIziC,GACF,MAAMkhD,EAASprE,KAAKqsF,WAWpB,OAVIjhB,IAAWprE,KAAKssF,mBAIlBtsF,KAAK0J,OAAO6iF,iBAAiBriE,GAC7BlqB,KAAK0J,OAAO8iF,mBAAkB,IAEhCxsF,KAAKosF,oBAAqB,EAC1BpsF,KAAKssF,kBAAmB,EACxBtsF,KAAKysF,kBAAmB,EACjBrhB,CACT,CAEAshB,qBAAAA,GACE,OAAO1sF,KAAK2sF,oBACd,CAMAC,YAAAA,CACE1iE,EAAYplB,GAQZ,IAAA+nF,EAAA,IAPArK,eACEA,EAAc2J,aACdA,GAIDrnF,EAED,MAAM4E,EAAS1J,KAAK0J,OACdvG,EAASuG,EAAOvG,OAChB2pF,EAAa,IAAIhhF,GAAMpC,EAAOqN,SAAa,EAAGrN,EAAOsN,OAAQ,EAAK,GAClE+1E,EAAarjF,EAAOsjF,qBAAqBxK,GAKzC9yC,EAJoB,IAAI5jC,GAC5BihF,EAAWj7E,KAAOi7E,EAAWzJ,WAC7ByJ,EAAWh7E,IAAMg7E,EAAW7E,WAC5Bv7E,SAASmgF,GACmBn+E,UAAUjF,EAAOu0B,uBAEzCgvD,EADU9pF,EAAO+jE,cAAch9C,GAChB3d,SAASmjC,GACxB9zB,EAAgBlS,EAAOmkC,yBACvB5iB,EAAOvhB,EAAO0jC,kBACd4nB,EAAatlB,EAAInjC,SAAS,IAAIT,GAAMmf,EAAKnZ,KAAMmZ,EAAKlZ,MACpDsO,EAAMld,EAAOyb,kBACb5B,EAASg4C,EAAW/oD,IAAIghF,GAAMt+E,UAAU0R,GAAK,GAE7C6sE,EAAMxjF,EAAOuU,gBACboJ,EAASkjC,GAAY7gD,EAAO2d,QAClC3d,EAAOuU,gBAAkB,GACzB,MAAMw7B,EAAgB,CACpB7b,OAAQ,cACRla,KAAM,cACN4c,oBAAqB,eAEvB52B,EAAOm2E,mBAAmBpmC,EAAe,EAAG+oC,GAC5C94E,EAAOm2E,mBAAmBpmC,EAAe0yC,EAAcziF,EAAO4iD,KAAK/rD,QACnEmJ,EAAOm6B,OAAQ,EACf,MAAMspD,EAAYzjF,EAAO4e,gBAAgB,CACvC9J,oBAAqBrb,EAAOqb,oBAC5BI,mBAAmB,IAGrBlV,EAAOuU,gBAAkBivE,EACzBxjF,EAAO2d,OAASA,EAChB3d,EAAOm6B,OAAQ,EAEfggC,GAASspB,EAAW,CAClB/xE,SAAU,QACVtJ,MAAUq7E,EAAUn7E,MAAd,KACNo7E,OAAQxmF,EACRoL,MAAUm7E,EAAUn7E,MAAQ4J,EAArB,KACP3J,OAAWk7E,EAAUl7E,OAAS2J,EAAtB,OAEV5b,KAAKqtF,qBAAuBrtF,KAAKqtF,sBACjCrtF,KAAKqtF,oBAAsB,KACzBF,EAAUpkF,UAEZ0R,GACGyP,EAAExgB,QAAU1J,KAAK0J,OAAOqjE,gBACzBlyD,KAAKyyE,YAAYH,GACL,QAAdN,EAAA3iE,EAAE0mD,wBAAYic,GAAdA,EAAgBD,aAAaO,EAAWnwE,EAAOhR,EAAGgR,EAAOjR,EAC3D,CAKAq5C,WAAAA,CAAYl7B,GACVlqB,KAAKssF,kBAAmB,EACxB,MAAM5iF,EAAS1J,KAAK0J,OACd0hE,EAASprE,KAAKqsF,WACpB,GAAIjhB,GAAUlhD,EAAE0mD,aAAc,CAC5B,MAAMjL,EAAa3lE,KAAK2sF,qBAAuB,CAC7CnK,eAAgB94E,EAAO84E,eACvB2J,aAAcziF,EAAOyiF,cAEjB7gF,EAAQ5B,EAAO23E,MAClBtnD,MAAM4rC,EAAU6c,eAAgB7c,EAAUwmB,cAC1CryE,KAAK,IACF8L,EAAO,CAAE0mC,KAAM5iD,EAAO4iD,KAAMhhD,WAAUq6D,GAC5Cz7C,EAAE0mD,aAAa2c,QAAQ,aAAcjiF,GACrC4e,EAAE0mD,aAAa2c,QACb,qBACAxlF,KAAKylF,UAAU,CACbliF,MAAOA,EACP+b,OAAQ3d,EAAO81E,mBACb7Z,EAAU6c,eACV7c,EAAUwmB,cACV,MAINjiE,EAAE0mD,aAAa6c,cAAgB,WAC/BztF,KAAK4sF,aAAa1iE,EAAGtE,EACvB,CAEA,OADAlc,EAAOgkF,uBACAtiB,CACT,CAMA/lB,OAAAA,CAAQn7B,GACN,GACElqB,KAAK0J,OAAOikF,WACX3tF,KAAK0J,OAAO44C,qBACZp4B,EAAE0jE,iBACH,CACA,GAAI5tF,KAAKqsF,YAAcrsF,KAAK2sF,qBAAsB,CAGhD,MAAM3jF,EAAQhJ,KAAK0J,OAAOwiF,6BAA6BhiE,GACjD2jE,EAAqB7tF,KAAK2sF,qBAChC,OACE3jF,EAAQ6kF,EAAmBrL,gBAC3Bx5E,EAAQ6kF,EAAmB1B,YAE/B,CACA,OAAO,CACT,CACA,OAAO,CACT,CAKU2B,aAAAA,CAAc5jE,GACtB,OAAOlqB,KAAK0J,OAAO27C,QAAQn7B,EAC7B,CAEAwhE,gBAAAA,CAAgBnhF,GAAuB,IAAtB2f,EAAEA,GAAkB3f,EACnC,MAAM86C,EAAUrlD,KAAK8tF,cAAc5jE,IAC9BlqB,KAAKysF,kBAAoBpnC,IAC5BrlD,KAAKysF,kBAAmB,EAE5B,CAEAd,eAAAA,CAAgBoC,GACd,MAAM7jE,EAAEA,GAAM6jE,EACR1oC,EAAUrlD,KAAK8tF,cAAc5jE,IAC9BlqB,KAAKysF,kBAAoBpnC,EAC5BrlD,KAAKysF,kBAAmB,EACfzsF,KAAKysF,mBAAqBpnC,IAEnCrlD,KAAKysF,kBAAmB,GAEtBzsF,KAAKysF,mBAEPviE,EAAEC,iBAEF4jE,EAAG1oC,SAAU,EACb0oC,EAAGtd,WAAazwE,KAAK0J,OAEzB,CAEAkiF,gBAAAA,IACM5rF,KAAKysF,kBAAoBzsF,KAAKqsF,cAChCrsF,KAAKysF,kBAAmB,EAE5B,CAOAX,WAAAA,CAAYiC,GAAmB,IAAAC,EAC7B,MAAM9jE,EAAEA,GAAM6jE,EACRpd,EAAUzmD,EAAE0jE,iBAClB5tF,KAAKysF,kBAAmB,EAExBviE,EAAEC,iBACF,IAAI8jE,EAAuB,QAAjBD,EAAG9jE,EAAE0mD,wBAAYod,SAAdA,EAAgBE,QAAQ,cACrC,GAAID,IAAWtd,EAAS,CACtB,MAAMjnE,EAAS1J,KAAK0J,OACdvG,EAASuG,EAAOvG,OACtB,IAAIuM,EAAWhG,EAAOwiF,6BAA6BhiE,GACnD,MAAM7C,OAAEA,GACN6C,EAAE0mD,aAAcxgE,MAAMQ,SAAS,sBAC3B7I,KAAKigB,MAAMkC,EAAE0mD,aAAcsd,QAAQ,uBACnC,CAAA,EAEAC,EAAWF,EAAOvpF,KAAKC,IAAI,EAAGspF,EAAO1tF,OAAS,IAC9C6tF,EAAuB,EAE7B,GAAIpuF,KAAK2sF,qBAAsB,CAC7B,MAAMnK,EAAiBxiF,KAAK2sF,qBAAqBnK,eAC3C2J,EAAensF,KAAK2sF,qBAAqBR,aAC3Cz8E,EAAW8yE,GAAkB9yE,GAAYy8E,EAC3Cz8E,EAAW8yE,EACF9yE,EAAWy8E,IACpBz8E,GAAYy8E,EAAe3J,GAE7B94E,EAAO2kF,YAAY7L,EAAgB2J,UAE5BnsF,KAAK2sF,oBACd,CAGEjjF,EAAOm2B,WAAWgvB,KAAKs/B,KACtBzkF,EAAOm2B,WAAWgvB,KAAKnlD,EAAO23E,MAAM3xE,KACnCA,IAAahG,EAAO23E,MAAM9gF,UAE5B0tF,EAASA,EAAOK,WAGlBP,EAAGpd,SAAU,EACbod,EAAGtd,WAAa/mE,EAEhBA,EAAO6kF,YAAYN,EAAQ5mE,EAAQ3X,GAEnCvM,EAAOuoE,gBAAgBhiE,GACvBA,EAAO8kF,aAAatkE,GACpBxgB,EAAO84E,eAAiB99E,KAAK8I,IAC3BkC,EAAW0+E,EACX1kF,EAAO23E,MAAM9gF,QAEfmJ,EAAOyiF,aAAeznF,KAAK8I,IACzB9D,EAAO84E,eAAiByL,EAAO1tF,OAC/BmJ,EAAO23E,MAAM9gF,QAEfmJ,EAAOqjE,eAAgBzhE,MAAQ5B,EAAO4iD,KACtC5iD,EAAO+kF,kBACP/kF,EAAOqjE,eAAgBC,QACvBtjE,EAAOqB,KAAKzD,EAAS,CACnB0B,MAAO0G,EAAW0+E,EAClBhsC,OAAQ,SAEVj/C,EAAO4H,KAAK,eAAgB,CAAErB,WAC9BvG,EAAOkiE,iBAAkB,EACzBliE,EAAOsc,kBACT,CACF,CAOAosE,cAAAA,CAAc/gF,GAAuB,IAAtBof,EAAEA,GAAkBpf,EACjC,GAAI9K,KAAKqsF,YAAcrsF,KAAKssF,kBAGtBtsF,KAAK2sF,qBAAsB,CAAA,IAAA+B,EAC7B,MAAMhlF,EAAS1J,KAAK0J,OACdvG,EAASnD,KAAK0J,OAAOvG,QACrBq/E,eAAEA,EAAc2J,aAAEA,GAAiBnsF,KAAK2sF,qBACxC9b,GAA2B,QAAd6d,EAAAxkE,EAAE0mD,oBAAY,IAAA8d,OAAA,EAAdA,EAAgB7d,aAAcjqE,EAC7CiqE,IAAejqE,GAEjB8C,EAAO84E,eAAiBA,EACxB94E,EAAOyiF,aAAeA,EACtBziF,EAAO+kF,kBACP/kF,EAAOqjE,eAAgBC,UAEvBtjE,EAAOm7C,kBACY,SAAfgsB,IACFnnE,EAAO2kF,YAAY7L,EAAgB2J,GACnCziF,EAAO84E,eAAiB94E,EAAOyiF,aAAe3J,EAC9C94E,EAAOqjE,iBACJrjE,EAAOqjE,eAAezhE,MAAQ5B,EAAO4iD,MACxC5iD,EAAO+kF,kBACP/kF,EAAOqB,KAAKzD,EAAS,CACnB0B,MAAOw5E,EACPpgC,OAAQ,YAEVj/C,EAAO4H,KAAK,eAAgB,CAAErB,WAC9BvG,EAAOsc,oBAET/V,EAAOyjE,cAEX,CAGFntE,KAAKqtF,qBAAuBrtF,KAAKqtF,6BAC1BrtF,KAAKqtF,2BACLrtF,KAAK2sF,qBACZ3sF,KAAKysF,kBAAmB,CAC1B,CAEApoF,OAAAA,GACErE,KAAK+rF,UAAY/rF,KAAK+rF,UACxB,ECtWF,MAAM4C,GAAY,iBASX,MAAeC,WAIZlO,GAAqC5gF,WAAAA,GAAAM,SAAAE,WAc7CP,+BASkC,EAAC,CAuCnC8uF,YAAAA,GACE7uF,KAAK8uF,MAAQ9uF,KAAK8uF,MAAMjoD,KAAK7mC,MAC7BA,KAAK+uF,gBAAkB/uF,KAAK+uF,gBAAgBloD,KAAK7mC,MACjDA,KAAKstE,2BACHttE,KAAKstE,2BAA2BzmC,KAAK7mC,KACzC,CAEA+kD,UAAAA,CAAW7iD,GAGT,OAFAlC,KAAKmqE,WAAanqE,KAAKmtE,cACvBntE,KAAKw2D,UAAW,EACTp2D,MAAM2kD,WAAW7iD,EAC1B,CAKA8sF,cAAAA,CAAclqF,GAUX,IAVYmqF,QACbA,EAAO3oD,SACPA,EAAQC,MACRA,EAAKI,WACLA,GAMD7hC,EACC,OAAO8jC,GAAQ,CACbxC,WAAYpmC,KAAKkvF,sBACjBhoD,SAAU+nD,EACV3oD,WACAC,QACAI,aACAr9B,MAAOA,KACJtJ,KAAKmD,QAENnD,KAAKwiF,iBAAmBxiF,KAAKmsF,aAC/BzlD,SAAWp7B,IACTtL,KAAKkvF,sBAAwB5jF,EAC7BtL,KAAKmvF,4BAGX,CAKQL,KAAAA,CAAMvoD,GACZvmC,KAAKovF,kBAAoBpvF,KAAKgvF,eAAe,CAC3CC,QAAS,EACT3oD,SAAUtmC,KAAKqvF,eAAiB,EAChC9oD,MAAO7hC,KAAKC,IAAI4hC,GAAS,EAAG,KAC5BI,WAAY3mC,KAAK+uF,iBAErB,CAKQA,eAAAA,GAAkB,IAAAO,EACM,QAA9BA,EAAAtvF,KAAKuvF,iCAAyB,IAAAD,GAA9BA,EAAgChmF,QAChCtJ,KAAKuvF,0BAA4BvvF,KAAKgvF,eAAe,CACnDC,QAAS,EACT3oD,SAAUtmC,KAAKqvF,eACf1oD,WAAY3mC,KAAK8uF,OAErB,CAKAtC,iBAAAA,CAAkBgD,GAChBxvF,KAAK0tF,uBACL1tF,KAAK8uF,MAAMU,EAAU,EAAIxvF,KAAKyvF,YAChC,CAKA/B,oBAAAA,GACE,IAAIgC,GAAc,EAClB,CAAC1vF,KAAKovF,kBAAmBpvF,KAAKuvF,2BAA2BxuF,QACtD4uF,IACKA,IAAoBA,EAAgBroD,WACtCooD,GAAc,EACdC,EAAgBrmF,WAKtBtJ,KAAKkvF,sBAAwB,EAGzBQ,GACF1vF,KAAK6kD,iBAET,CAMA+qC,qBAAAA,GAEI,CAAC5vF,KAAKovF,kBAAmBpvF,KAAKuvF,2BAA2B1+E,KACtD8+E,IAAqBA,GAAmBA,EAAgBroD,WAG3DtnC,KAAKwsF,mBAET,CAKAqD,SAAAA,GAKE,OAJA7vF,KAAKwiF,eAAiB,EACtBxiF,KAAKmsF,aAAensF,KAAKqhF,MAAM9gF,OAC/BP,KAAK8vF,wBACL9vF,KAAKyuF,kBACEzuF,IACT,CAKA+vF,MAAAA,GACE/vF,KAAK6vF,YACL7vF,KAAKmvF,yBACP,CAMAa,eAAAA,GACE,OAAOhwF,KAAKqhF,MAAMtnD,MAAM/5B,KAAKwiF,eAAgBxiF,KAAKmsF,cAAcryE,KAAK,GACvE,CAOAm2E,oBAAAA,CAAqBC,GACnB,IAAIlzE,EAAS,EACXhU,EAAQknF,EAAY,EAGtB,GAAIlwF,KAAKmwF,SAASthC,KAAK7uD,KAAKqhF,MAAMr4E,IAChC,KAAOhJ,KAAKmwF,SAASthC,KAAK7uD,KAAKqhF,MAAMr4E,KACnCgU,IACAhU,IAGJ,KAAO,KAAK6lD,KAAK7uD,KAAKqhF,MAAMr4E,KAAWA,MACrCgU,IACAhU,IAGF,OAAOknF,EAAYlzE,CACrB,CAOAozE,qBAAAA,CAAsBF,GACpB,IAAIlzE,EAAS,EACXhU,EAAQknF,EAGV,GAAIlwF,KAAKmwF,SAASthC,KAAK7uD,KAAKqhF,MAAMr4E,IAChC,KAAOhJ,KAAKmwF,SAASthC,KAAK7uD,KAAKqhF,MAAMr4E,KACnCgU,IACAhU,IAGJ,KAAO,KAAK6lD,KAAK7uD,KAAKqhF,MAAMr4E,KAAWA,EAAQhJ,KAAKqhF,MAAM9gF,QACxDyc,IACAhU,IAGF,OAAOknF,EAAYlzE,CACrB,CAOAqzE,oBAAAA,CAAqBH,GACnB,IAAIlzE,EAAS,EACXhU,EAAQknF,EAAY,EAEtB,MAAQ,KAAKrhC,KAAK7uD,KAAKqhF,MAAMr4E,KAAWA,MACtCgU,IACAhU,IAGF,OAAOknF,EAAYlzE,CACrB,CAOAszE,qBAAAA,CAAsBJ,GACpB,IAAIlzE,EAAS,EACXhU,EAAQknF,EAEV,MAAQ,KAAKrhC,KAAK7uD,KAAKqhF,MAAMr4E,KAAWA,EAAQhJ,KAAKqhF,MAAM9gF,QACzDyc,IACAhU,IAGF,OAAOknF,EAAYlzE,CACrB,CAQAuzE,kBAAAA,CAAmB/N,EAAwB5hD,GACzC,MAAM0rB,EAAOtsD,KAAKqhF,MAGlB,IAAIr4E,EACAw5E,EAAiB,GACjBxiF,KAAKmwF,SAASthC,KAAKvC,EAAKk2B,OACT,IAAd5hD,IAAqB/5B,EAAUgoD,KAAKvC,EAAKk2B,EAAiB,KACvDA,EAAiB,EACjBA,EACN+B,EAAQj4B,EAAKtjD,GACf,KAAOA,EAAQ,GAAKA,EAAQsjD,EAAK/rD,SAAWouF,GAAU9/B,KAAK01B,IACzDv7E,GAAS43B,EACT2jD,EAAQj4B,EAAKtjD,GAKf,OAHkB,IAAd43B,GAAoB+tD,GAAU9/B,KAAK01B,IACrCv7E,IAEKA,CACT,CAMAwnF,UAAAA,CAAWhO,GACTA,EAAiBA,QAAAA,EAAkBxiF,KAAKwiF,eAExC,MAAMiO,EAAoBzwF,KAAKuwF,mBAAmB/N,GAAgB,GAEhEkO,EAAkBhsF,KAAKC,IACrB8rF,EACAzwF,KAAKuwF,mBAAmB/N,EAAgB,IAG5CxiF,KAAKwiF,eAAiBiO,EACtBzwF,KAAKmsF,aAAeuE,EACpB1wF,KAAK8vF,wBACL9vF,KAAKyuF,kBAELzuF,KAAKmvF,yBACP,CAMAwB,UAAAA,CAAWnO,GACTA,EAAiBA,QAAAA,EAAkBxiF,KAAKwiF,eACxC,MAAMiO,EAAoBzwF,KAAKqwF,qBAAqB7N,GAClDkO,EAAkB1wF,KAAKswF,sBAAsB9N,GAE/CxiF,KAAKwiF,eAAiBiO,EACtBzwF,KAAKmsF,aAAeuE,EACpB1wF,KAAK8vF,wBACL9vF,KAAKyuF,iBACP,CAKAD,YAAAA,CAAatkE,IACPlqB,KAAKmqE,WAAcnqE,KAAK2tF,WAG5B3tF,KAAK4wF,mBACL5wF,KAAK+K,KAAK,kBAAmBmf,EAAI,CAAEA,UAAM1pB,GACzCR,KAAK8vF,wBACD9vF,KAAKmD,SACPnD,KAAKmD,OAAO4H,KAAK,uBAAwB,CACvCrB,OAAQ1J,KACRkqB,MAEFlqB,KAAKmD,OAAOsc,oBAEhB,CAKAmxE,gBAAAA,GACM5wF,KAAKmD,SACPnD,KAAKmD,OAAO2Z,aACZ9c,KAAKmD,OAAOswE,mBAAmBvG,mBAGjCltE,KAAKmqE,WAAY,EAEjBnqE,KAAK6wF,qBACL7wF,KAAK+sE,eAAgBC,QACrBhtE,KAAK+sE,eAAgBzhE,MAAQtL,KAAKssD,KAClCtsD,KAAKyuF,kBACLzuF,KAAK8wF,oBACL9wF,KAAK+wF,mBACL/wF,KAAKgxF,gBAAkBhxF,KAAKssD,KAE5BtsD,KAAK8uF,OACP,CAKAxhB,0BAAAA,CAA2BpjD,GACzB,GAAIlqB,KAAKsiD,mBACP,OAGF,MAAMjnC,EAAKrb,KAAK+sE,eAEhBtyD,GAAuBY,GAAI41E,gBAAkB51E,GAAMA,EAAG2xD,QAEtD,MAAMyjB,EAAoBzwF,KAAKksF,6BAA6BhiE,GAC1DgnE,EAAelxF,KAAKwiF,eACpB2O,EAAanxF,KAAKmsF,cAEjBsE,IAAsBzwF,KAAKoxF,6BAC1BF,IAAiBC,GAClBD,IAAiBT,GAAqBU,IAAeV,KAIpDA,EAAoBzwF,KAAKoxF,6BAC3BpxF,KAAKwiF,eAAiBxiF,KAAKoxF,4BAC3BpxF,KAAKmsF,aAAesE,IAEpBzwF,KAAKwiF,eAAiBiO,EACtBzwF,KAAKmsF,aAAensF,KAAKoxF,6BAGzBpxF,KAAKwiF,iBAAmB0O,GACxBlxF,KAAKmsF,eAAiBgF,IAEtBnxF,KAAK8vF,wBACL9vF,KAAKyuF,kBACLzuF,KAAKmvF,2BAET,CAKA4B,gBAAAA,GACE/wF,KAAK2mD,YAAc,OAEf3mD,KAAKmD,SACPnD,KAAKmD,OAAOmpE,cAAgBtsE,KAAKmD,OAAOyjD,WAAa,QAGvD5mD,KAAK4jD,YAAc5jD,KAAKqxF,mBACxBrxF,KAAK2iD,YAAc3iD,KAAKqS,YAAa,EACrCrS,KAAKimD,cAAgBjmD,KAAKkmD,eAAgB,CAC5C,CAKAorC,6BAAAA,CAA8B/pD,EAAeolB,EAAaL,GACxD,MAAMilC,EAAmBjlC,EAAKvyB,MAAM,EAAGwN,GACrCiqD,EAAgBxxF,KAAK6qD,cAAc0mC,GAAkBhxF,OACvD,GAAIgnC,IAAUolB,EACZ,MAAO,CAAE61B,eAAgBgP,EAAerF,aAAcqF,GAExD,MAAMC,EAAiBnlC,EAAKvyB,MAAMwN,EAAOolB,GAEzC,MAAO,CACL61B,eAAgBgP,EAChBrF,aAAcqF,EAHAxxF,KAAK6qD,cAAc4mC,GAAgBlxF,OAKrD,CAKAmxF,6BAAAA,CACEnqD,EACAolB,EACAtB,GAEA,MACEmmC,EADuBnmC,EAAUtxB,MAAM,EAAGwN,GACTztB,KAAK,IAAIvZ,OAC5C,GAAIgnC,IAAUolB,EACZ,MAAO,CAAE61B,eAAgBgP,EAAerF,aAAcqF,GAIxD,MAAO,CACLhP,eAAgBgP,EAChBrF,aAAcqF,EAJOnmC,EAAUtxB,MAAMwN,EAAOolB,GACf7yC,KAAK,IAAIvZ,OAK1C,CAKAkuF,eAAAA,GAEE,GADAzuF,KAAK2xF,kBAAoB,CAAA,EACpB3xF,KAAK+sE,eAAV,CAGA,IAAK/sE,KAAK4xF,kBAAmB,CAC3B,MAAM3F,EAAejsF,KAAK0xF,8BACxB1xF,KAAKwiF,eACLxiF,KAAKmsF,aACLnsF,KAAKqhF,OAEPrhF,KAAK+sE,eAAeyV,eAAiByJ,EAAazJ,eAClDxiF,KAAK+sE,eAAeof,aAAeF,EAAaE,YAClD,CACAnsF,KAAK6xF,wBAVL,CAWF,CAKAC,kBAAAA,GACE,IAAK9xF,KAAK+sE,eACR,OAEF/sE,KAAK2xF,kBAAoB,CAAA,EACzB,MAAMI,EAAW/xF,KAAK+sE,eACtB/sE,KAAKssD,KAAOylC,EAASzmF,MACrBtL,KAAKyI,IAAI,SAAS,GAClBzI,KAAK4gF,iBACL5gF,KAAK0f,YACL,MAAMusE,EAAejsF,KAAKsxF,8BACxBS,EAASvP,eACTuP,EAAS5F,aACT4F,EAASzmF,OAEXtL,KAAKmsF,aAAensF,KAAKwiF,eAAiByJ,EAAaE,aAClDnsF,KAAK4xF,oBACR5xF,KAAKwiF,eAAiByJ,EAAazJ,gBAErCxiF,KAAK6xF,wBACP,CAKAA,sBAAAA,GACE,GAAI7xF,KAAKwiF,iBAAmBxiF,KAAKmsF,aAAc,CAC7C,MAAMhxE,EAAQnb,KAAKgyF,wBACnBhyF,KAAK+sE,eAAgB5xD,MAAMrJ,KAAOqJ,EAAMrJ,KACxC9R,KAAK+sE,eAAgB5xD,MAAMpJ,IAAMoJ,EAAMpJ,GACzC,CACF,CAMAigF,qBAAAA,GACE,IAAKhyF,KAAKmD,OACR,MAAO,CAAE2O,KAAM,MAAOC,IAAK,OAE7B,MAAMkgF,EAAkBjyF,KAAK4xF,kBACvB5xF,KAAKkyF,iBACLlyF,KAAKwiF,eACTuK,EAAa/sF,KAAKgtF,qBAAqBiF,GACvCE,EAAiBnyF,KAAKk/E,oBAAoB+S,GAC1C/T,EAAYiU,EAAejU,UAC3BzxB,EAAY0lC,EAAe1lC,UAC3B2lC,EACEpyF,KAAKmkF,qBAAqBjG,EAAWzxB,EAAW,YAChDzsD,KAAKqgC,WACPijD,EAAayJ,EAAWzJ,WACxB1nE,EAAgB5b,KAAK6tC,yBACrBwkD,EAAcryF,KAAKmD,OAAO+gE,cAC1BouB,EAAmBD,EAAYrgF,MAAQ4J,EACvC22E,EAAoBF,EAAYpgF,OAAS2J,EACzCunE,EAAWmP,EAAmBF,EAC9B/L,EAAYkM,EAAoBH,EAE5B1jF,EAAI,IAAI5C,GACZihF,EAAWj7E,KAAOwxE,EAClByJ,EAAWh7E,IAAMg7E,EAAW7E,UAAYkK,GAEvCzjF,UAAU3O,KAAKi+B,uBACftvB,UAAU3O,KAAKmD,OAAOyb,mBACtBjS,SACC,IAAIb,GACFumF,EAAYG,YAAcF,EAC1BD,EAAYI,aAAeF,IAqBjC,OAjBI7jF,EAAE1C,EAAI,IACR0C,EAAE1C,EAAI,GAEJ0C,EAAE1C,EAAIm3E,IACRz0E,EAAE1C,EAAIm3E,GAEJz0E,EAAE3C,EAAI,IACR2C,EAAE3C,EAAI,GAEJ2C,EAAE3C,EAAIs6E,IACR33E,EAAE3C,EAAIs6E,GAIR33E,EAAE1C,GAAKhM,KAAKmD,OAAOyc,QAAQ9N,KAC3BpD,EAAE3C,GAAK/L,KAAKmD,OAAOyc,QAAQ7N,IAEpB,CACLD,KAAM,GAAGpD,EAAE1C,MACX+F,IAAK,GAAGrD,EAAE3C,MACV8vB,SAAU,GAAGu2D,MACbA,WAAYA,EAEhB,CAKAtB,iBAAAA,GACE9wF,KAAK0yF,YAAc,CACjB/vC,YAAa3iD,KAAK2iD,YAClBiB,YAAa5jD,KAAK4jD,YAClBqC,cAAejmD,KAAKimD,cACpBC,cAAelmD,KAAKkmD,cACpBS,YAAa3mD,KAAK2mD,YAClBt0C,WAAYrS,KAAKqS,WACjBi6D,cAAetsE,KAAKmD,QAAUnD,KAAKmD,OAAOmpE,cAC1C1lB,WAAY5mD,KAAKmD,QAAUnD,KAAKmD,OAAOyjD,WAE3C,CAKA+rC,oBAAAA,GACO3yF,KAAK0yF,cAIV1yF,KAAK2mD,YAAc3mD,KAAK0yF,YAAY/rC,YACpC3mD,KAAK2iD,YAAc3iD,KAAK0yF,YAAY/vC,YACpC3iD,KAAK4jD,YAAc5jD,KAAK0yF,YAAY9uC,YACpC5jD,KAAKqS,WAAarS,KAAK0yF,YAAYrgF,WACnCrS,KAAKimD,cAAgBjmD,KAAK0yF,YAAYzsC,cACtCjmD,KAAKkmD,cAAgBlmD,KAAK0yF,YAAYxsC,cAElClmD,KAAKmD,SACPnD,KAAKmD,OAAOmpE,cACVtsE,KAAK0yF,YAAYpmB,eAAiBtsE,KAAKmD,OAAOmpE,cAChDtsE,KAAKmD,OAAOyjD,WACV5mD,KAAK0yF,YAAY9rC,YAAc5mD,KAAKmD,OAAOyjD,mBAGxC5mD,KAAK0yF,YACd,CAMAE,eAAAA,GACE,MAAM7lB,EAAiB/sE,KAAK+sE,eAC5B/sE,KAAKw2D,UAAW,EAChBx2D,KAAKmqE,WAAY,EAEb4C,IACFA,EAAejqC,MAAQiqC,EAAejqC,OACtCiqC,EAAe/xD,YACb+xD,EAAe/xD,WAAW0pD,YAAYqI,IAE1C/sE,KAAK+sE,eAAiB,KACtB/sE,KAAK0tF,uBACL1tF,KAAKwiF,iBAAmBxiF,KAAKmsF,cAAgBnsF,KAAK6kD,kBAClD7kD,KAAKmsF,aAAensF,KAAKwiF,eACzBxiF,KAAK2yF,uBACD3yF,KAAK8/E,mBACP9/E,KAAK4gF,iBACL5gF,KAAK0f,YAET,CAKAytD,WAAAA,GACE,MAAM0lB,EAAgB7yF,KAAKgxF,kBAAoBhxF,KAAKssD,KAYpD,OAXAtsD,KAAK4yF,kBAEL5yF,KAAK+K,KAAK,kBACV8nF,GAAiB7yF,KAAK+K,KAAKjD,GACvB9H,KAAKmD,SACPnD,KAAKmD,OAAO4H,KAAK,sBAAuB,CACtCrB,OAAQ1J,OAGV6yF,GAAiB7yF,KAAKmD,OAAO4H,KAAK,kBAAmB,CAAErB,OAAQ1J,QAE1DA,IACT,CAKA8yF,uBAAAA,GACE,IAAK,MAAMlgF,KAAQ5S,KAAKqnB,OACjBrnB,KAAK6+E,WAAWjsE,WACZ5S,KAAKqnB,OAAOzU,EAGzB,CAOAmgF,iBAAAA,CAAkBxrD,EAAeolB,GAC/B,MAAQuxB,UAAW8U,EAAWvmC,UAAWwmC,GACrCjzF,KAAKk/E,oBAAoB33C,GAAO,IAChC22C,UAAWgV,EAASzmC,UAAW0mC,GAAYnzF,KAAKk/E,oBAChDvyB,GACA,GAEJ,GAAIqmC,IAAcE,EAAS,CAEzB,GAAIlzF,KAAKqnB,OAAO2rE,GACd,IACE,IAAI7nF,EAAI8nF,EACR9nF,EAAInL,KAAKmhF,oBAAoB6R,GAAWzyF,OACxC4K,WAEOnL,KAAKqnB,OAAO2rE,GAAW7nF,GAIlC,GAAInL,KAAKqnB,OAAO6rE,GACd,IACE,IAAI/nF,EAAIgoF,EACRhoF,EAAInL,KAAKmhF,oBAAoB+R,GAAS3yF,OACtC4K,IACA,CACA,MAAMioF,EAAWpzF,KAAKqnB,OAAO6rE,GAAS/nF,GAClCioF,IACFpzF,KAAKqnB,OAAO2rE,KAAehzF,KAAKqnB,OAAO2rE,GAAa,IACpDhzF,KAAKqnB,OAAO2rE,GAAWC,EAAY9nF,EAAIgoF,GAAWC,EAEtD,CAGF,IAAK,IAAIjoF,EAAI6nF,EAAY,EAAG7nF,GAAK+nF,EAAS/nF,WACjCnL,KAAKqnB,OAAOlc,GAGrBnL,KAAKqzF,gBAAgBH,EAASF,EAAYE,EAC5C,MAEE,GAAIlzF,KAAKqnB,OAAO2rE,GAAY,CAC1B,MAAMI,EAAWpzF,KAAKqnB,OAAO2rE,GACvB/F,EAAOkG,EAAUF,EACvB,IAAK,IAAI9nF,EAAI8nF,EAAW9nF,EAAIgoF,EAAShoF,WAC5BioF,EAASjoF,GAElB,IAAK,MAAMy/E,KAAQ5qF,KAAKqnB,OAAO2rE,GAAY,CACzC,MAAMM,EAAcn2E,SAASytE,EAAM,IAC/B0I,GAAeH,IACjBC,EAASE,EAAcrG,GAAQmG,EAASxI,UACjCwI,EAASxI,GAEpB,CACF,CAEJ,CAOAyI,eAAAA,CAAgBnV,EAAmBlhE,GACjC,MAAMu2E,EAAe9yF,OAAOC,OAAO,CAAA,EAAIV,KAAKqnB,QAC5C,IAAK,MAAM82D,KAAQn+E,KAAKqnB,OAAQ,CAC9B,MAAMmsE,EAAcr2E,SAASghE,EAAM,IAC/BqV,EAActV,IAChBl+E,KAAKqnB,OAAOmsE,EAAcx2E,GAAUu2E,EAAaC,GAC5CD,EAAaC,EAAcx2E,WACvBhd,KAAKqnB,OAAOmsE,GAGzB,CACF,CAYAC,wBAAAA,CACEvV,EACAzxB,EACAinC,EACAC,GAEA,MAAMC,EAA2D,CAAA,EAC3DC,EAAqB7zF,KAAKmhF,oBAAoBjD,GAAW39E,OACzDuzF,EAAcD,IAAuBpnC,EAE3C,IAAIsnC,GAA0B,EAC9BL,IAAQA,EAAM,GACd1zF,KAAKqzF,gBAAgBnV,EAAWwV,GAChC,MAAMM,EAAmBh0F,KAAKqnB,OAAO62D,GACjCl+E,KAAKqnB,OAAO62D,GAAyB,IAAdzxB,EAAkBA,EAAYA,EAAY,QACjEjsD,EAIJ,IAAK,MAAMwI,KAAShJ,KAAKqnB,OAAO62D,GAAY,CAC1C,MAAM+V,EAAW92E,SAASnU,EAAO,IAC7BirF,GAAYxnC,IACdsnC,GAA0B,EAC1BH,EAAcK,EAAWxnC,GAAazsD,KAAKqnB,OAAO62D,GAAWl1E,GAEvD8qF,GAA6B,IAAdrnC,UACZzsD,KAAKqnB,OAAO62D,GAAWl1E,GAGpC,CACA,IAAIkrF,GAAmB,EAevB,IAdIH,IAA4BD,IAG9B9zF,KAAKqnB,OAAO62D,EAAYwV,GAAOE,EAC/BM,GAAmB,IAEjBA,GAAoBL,EAAqBpnC,IAI3CinC,IAIKA,EAAM,GACPC,GAAeA,EAAYD,EAAM,GACnC1zF,KAAKqnB,OAAO62D,EAAYwV,GAAO,CAC7B,EAAG,IAAKC,EAAYD,EAAM,KAEnBM,EACTh0F,KAAKqnB,OAAO62D,EAAYwV,GAAO,CAC7B,EAAG,IAAKM,WAGHh0F,KAAKqnB,OAAO62D,EAAYwV,GAEjCA,IAEF1zF,KAAK8/E,kBAAmB,CAC1B,CASAqU,qBAAAA,CACEjW,EACAzxB,EACA2nC,EACAT,GAEK3zF,KAAKqnB,SACRrnB,KAAKqnB,OAAS,CAAA,GAEhB,MAAMgtE,EAAoBr0F,KAAKqnB,OAAO62D,GACpCoW,EAA0BD,EACtB,IAAKA,GACL,CAAA,EAEND,IAAaA,EAAW,GAGxB,IAAK,MAAMprF,KAASsrF,EAAyB,CAC3C,MAAMC,EAAep3E,SAASnU,EAAO,IACjCurF,GAAgB9nC,IAClB4nC,EAAkBE,EAAeH,GAC/BE,EAAwBC,GAErBD,EAAwBC,EAAeH,WACnCC,EAAkBE,GAG/B,CAEA,GADAv0F,KAAK8/E,kBAAmB,EACpB6T,EAAa,CACf,KAAOS,KACA3zF,OAAOU,KAAKwyF,EAAYS,IAAW7zF,SAGnCP,KAAKqnB,OAAO62D,KACfl+E,KAAKqnB,OAAO62D,GAAa,CAAA,GAE3Bl+E,KAAKqnB,OAAO62D,GAAWzxB,EAAY2nC,GAAY,IAC1CT,EAAYS,KAGnB,MACF,CACA,IAAKC,EACH,OAEF,MAAMhV,EAAWgV,EAAkB5nC,EAAYA,EAAY,EAAI,GAC/D,KAAO4yB,GAAY+U,KACjBp0F,KAAKqnB,OAAO62D,GAAWzxB,EAAY2nC,GAAY,IAAK/U,EAExD,CAQAmV,mBAAAA,CACEC,EACAltD,EACAosD,GAEA,MAAMe,EAAY10F,KAAKk/E,oBAAoB33C,GAAO,GAChDotD,EAAa,CAAC,GAChB,IA0BIxpF,EA1BAypF,EAAc,EAElB,IAAK,IAAIzpF,EAAI,EAAGA,EAAIspF,EAAal0F,OAAQ4K,IACf,OAApBspF,EAAatpF,IACfypF,IACAD,EAAWC,GAAe,GAE1BD,EAAWC,KAoBf,IAhBID,EAAW,GAAK,IAClB30F,KAAKm0F,sBACHO,EAAUxW,UACVwW,EAAUjoC,UACVkoC,EAAW,GACXhB,GAEFA,EAAcA,GAAeA,EAAY55D,MAAM46D,EAAW,GAAK,IAEjEC,GACE50F,KAAKyzF,yBACHiB,EAAUxW,UACVwW,EAAUjoC,UAAYkoC,EAAW,GACjCC,GAGCzpF,EAAI,EAAGA,EAAIypF,EAAazpF,IACvBwpF,EAAWxpF,GAAK,EAClBnL,KAAKm0F,sBACHO,EAAUxW,UAAY/yE,EACtB,EACAwpF,EAAWxpF,GACXwoF,GAEOA,GAKL3zF,KAAKqnB,OAAOqtE,EAAUxW,UAAY/yE,IAAMwoF,EAAY,KACtD3zF,KAAKqnB,OAAOqtE,EAAUxW,UAAY/yE,GAAG,GAAKwoF,EAAY,IAG1DA,EAAcA,GAAeA,EAAY55D,MAAM46D,EAAWxpF,GAAK,GAE7DwpF,EAAWxpF,GAAK,GAClBnL,KAAKm0F,sBACHO,EAAUxW,UAAY/yE,EACtB,EACAwpF,EAAWxpF,GACXwoF,EAGN,CASAtF,WAAAA,CAAY9mD,GAAwC,IAAzBolB,EAAWrsD,UAAAC,OAAA,QAAAC,IAAAF,UAAA,GAAAA,UAAA,GAAGinC,EAAQ,EAC/CvnC,KAAK+yF,kBAAkBxrD,EAAOolB,GAC9B3sD,KAAKqhF,MAAMn4E,OAAOq+B,EAAOolB,EAAMplB,GAC/BvnC,KAAKssD,KAAOtsD,KAAKqhF,MAAMvnE,KAAK,IAC5B9Z,KAAKyI,IAAI,SAAS,GAClBzI,KAAK4gF,iBACL5gF,KAAK0f,YACL1f,KAAK8yF,yBACP,CAcAvE,WAAAA,CACEjiC,EACAnxC,EACAosB,GAEA,IADAolB,EAAWrsD,UAAAC,OAAA,QAAAC,IAAAF,UAAA,GAAAA,UAAA,GAAGinC,EAEVolB,EAAMplB,GACRvnC,KAAK+yF,kBAAkBxrD,EAAOolB,GAEhC,MAAMtB,EAAYrrD,KAAK6qD,cAAcyB,GACrCtsD,KAAKw0F,oBAAoBnpC,EAAW9jB,EAAOpsB,GAC3Cnb,KAAKqhF,MAAQ,IACRrhF,KAAKqhF,MAAMtnD,MAAM,EAAGwN,MACpB8jB,KACArrD,KAAKqhF,MAAMtnD,MAAM4yB,IAEtB3sD,KAAKssD,KAAOtsD,KAAKqhF,MAAMvnE,KAAK,IAC5B9Z,KAAKyI,IAAI,SAAS,GAClBzI,KAAK4gF,iBACL5gF,KAAK0f,YACL1f,KAAK8yF,yBACP,CAMA+B,6BAAAA,CACEttD,EACAolB,EACAs/B,GAEIA,GAAgB1kD,GACdolB,IAAQplB,EACVvnC,KAAK80F,oBAAsBtuF,EAClBxG,KAAK80F,sBAAwBnuF,IACtC3G,KAAK80F,oBAAsBtuF,EAC3BxG,KAAKmsF,aAAe5kD,GAEtBvnC,KAAKwiF,eAAiByJ,GACbA,EAAe1kD,GAAS0kD,EAAet/B,EAC5C3sD,KAAK80F,sBAAwBnuF,EAC/B3G,KAAKmsF,aAAeF,EAEpBjsF,KAAKwiF,eAAiByJ,GAIpBt/B,IAAQplB,EACVvnC,KAAK80F,oBAAsBnuF,EAClB3G,KAAK80F,sBAAwBtuF,IACtCxG,KAAK80F,oBAAsBnuF,EAC3B3G,KAAKwiF,eAAiB71B,GAExB3sD,KAAKmsF,aAAeF,EAExB,EChkCK,MAAe8I,WAIZnG,GA4CRiC,kBAAAA,GACE,MAAMr2E,EACHxa,KAAKmD,QAAUsX,GAAuBza,KAAKmD,OAAO2d,eACnDxc,IACIytF,EAAWv3E,EAAI9G,cAAc,YACnCjT,OAAOwJ,QAAQ,CACb+qF,eAAgB,MAChBC,YAAa,MACbC,aAAc,MACdC,WAAY,QACZ,cAAe,WACfC,KAAM,MACNvlD,KAAM,mBACLv3B,IAAIxT,IAAA,IAAEq3B,EAAW7wB,GAAMxG,EAAA,OAAKitF,EAASl2E,aAAasgB,EAAW7wB,KAChE,MAAMyG,IAAEA,EAAGD,KAAEA,EAAI+pB,SAAEA,GAAa77B,KAAKgyF,wBAGrCD,EAAS52E,MAAMsB,QAAU,4BAA4B1K,YAAcD,uFAA0F+pB,MAE5J77B,KAAKq1F,yBAA2B76E,EAAIK,MAAMyyE,YAAYyE,GAEvDtxF,OAAOwJ,QAAQ,CACb64B,KAAM,OACNwyD,QAAS,YACTC,MAAO,UACPC,MAAO,UACPC,KAAM,OACNC,IAAK,OACLC,MAAO,QACPC,iBAAkB,qBAClBC,kBAAmB,sBACnBC,eAAgB,qBACex9E,IAAI/N,IAAA,IAAEL,EAAWH,GAAQQ,EAAA,OACxDwnF,EAASl6E,iBACP3N,EACClK,KAAK+J,GAA2B88B,KAAK7mC,SAG1CA,KAAK+sE,eAAiBglB,CACxB,CAKAjvD,IAAAA,GACE9iC,KAAK0tF,sBACP,CAOAqI,SAAAA,CAAU7rE,GACR,IAAKlqB,KAAKmqE,UACR,OAEF,MAAM6rB,EAA4B,QAAnBh2F,KAAK4gC,UAAsB5gC,KAAKi2F,WAAaj2F,KAAKk2F,QACjE,GAAIhsE,EAAEisE,WAAWH,EACdh2F,KAAKg2F,EAAO9rE,EAAEisE,UACbjsE,OAEG,MAAIA,EAAEisE,WAAWn2F,KAAKo2F,mBAAoBlsE,EAAEmsE,UAAWnsE,EAAEosE,QAO9D,OALEt2F,KAAKA,KAAKo2F,gBAAgBlsE,EAAEisE,UAG5BjsE,EAGJ,CACAA,EAAEqsE,2BACFrsE,EAAEC,iBACED,EAAEisE,SAAW,IAAMjsE,EAAEisE,SAAW,IAElCn2F,KAAK4xF,mBAAoB,EACzB5xF,KAAK6kD,kBACL7kD,KAAKmvF,2BAELnvF,KAAKmD,QAAUnD,KAAKmD,OAAOsc,kBAE/B,CAQA+2E,OAAAA,CAAQtsE,IACDlqB,KAAKmqE,WAAanqE,KAAKy2F,WAAaz2F,KAAK4xF,kBAC5C5xF,KAAKy2F,WAAY,EAGfvsE,EAAEisE,WAAWn2F,KAAK02F,gBAAkBxsE,EAAEmsE,SAAWnsE,EAAEosE,WAEnDt2F,KAAKA,KAAK02F,cAAcxsE,EAAEisE,UAG1BjsE,GAIJA,EAAEqsE,2BACFrsE,EAAEC,iBACFnqB,KAAKmD,QAAUnD,KAAKmD,OAAOsc,mBAC7B,CAMAk3E,OAAAA,CAA8DzsE,GAC5D,MAAM0sE,EAAY52F,KAAK42F,WACjBtrF,MAAEA,EAAKk3E,eAAEA,EAAc2J,aAAEA,GAAiBnsF,KAAK+sE,eAGrD,GAFA/sE,KAAK42F,WAAY,EACjB1sE,GAAKA,EAAEE,mBACFpqB,KAAKmqE,UACR,OAEF,MAAM0sB,EAAgBA,KACpB72F,KAAK8xF,qBACL9xF,KAAK+K,KAAKzD,GACNtH,KAAKmD,SACPnD,KAAKmD,OAAO4H,KAAK,eAAgB,CAAErB,OAAQ1J,OAC3CA,KAAKmD,OAAOsc,qBAGhB,GAAkC,KAA9Bzf,KAAK+sE,eAAezhE,MAGtB,OAFAtL,KAAKqnB,OAAS,CAAA,OACdwvE,IAIF,MAAMC,EAAW92F,KAAKghF,oBAAoB11E,GAAOg2E,aAC/CyV,EAAY/2F,KAAKqhF,MAAM9gF,OACvBy2F,EAAgBF,EAASv2F,OACzB02F,EAAkBj3F,KAAKwiF,eACvB0U,EAAgBl3F,KAAKmsF,aACrBxmB,EAAYsxB,IAAoBC,EAClC,IAAIvD,EACFwD,EAEAC,EACAC,EAFAC,EAAWN,EAAgBD,EAI7B,MAAMQ,EAAoBv3F,KAAKsxF,8BAC7B9O,EACA2J,EACA7gF,GAEIksF,EAAaP,EAAkBM,EAAkB/U,eAEnD7c,GACFwxB,EAAcn3F,KAAKqhF,MAAMtnD,MAAMk9D,EAAiBC,GAChDI,GAAYJ,EAAgBD,GACnBD,EAAgBD,IAEvBI,EADEK,EACYx3F,KAAKqhF,MAAMtnD,MAAMm9D,EAAgBI,EAAUJ,GAE3Cl3F,KAAKqhF,MAAMtnD,MACvBk9D,EACAA,EAAkBK,IAIxB,MAAM7C,EAAeqC,EAAS/8D,MAC5Bw9D,EAAkBpL,aAAemL,EACjCC,EAAkBpL,cAiCpB,GA/BIgL,GAAeA,EAAY52F,SACzBk0F,EAAal0F,SAIfozF,EAAc3zF,KAAKw/E,mBACjByX,EACAA,EAAkB,GAClB,GAGFtD,EAAcc,EAAan8E,IACzB,IAGEq7E,EAAa,KAGfhuB,GACFyxB,EAAaH,EACbI,EAAWH,GACFM,GAETJ,EAAaF,EAAgBC,EAAY52F,OACzC82F,EAAWH,IAEXE,EAAaF,EACbG,EAAWH,EAAgBC,EAAY52F,QAEzCP,KAAK+yF,kBAAkBqE,EAAYC,IAEjC5C,EAAal0F,OAAQ,CACvB,MAAMuD,cAAEA,GAAkBE,IAExB4yF,GACAnC,EAAa36E,KAAK,MAAQhW,EAAc2zF,aACvCt3F,EAAOu3F,wBAER/D,EAAc7vF,EAAc6zF,iBAE9B33F,KAAKw0F,oBAAoBC,EAAcwC,EAAiBtD,EAC1D,CACAkD,GACF,CAKAe,kBAAAA,GACE53F,KAAK4xF,mBAAoB,CAC3B,CAKAiG,gBAAAA,GACE73F,KAAK4xF,mBAAoB,CAC3B,CAEAkG,mBAAAA,CAAmBhtF,GAA+B,IAA9BpB,OAAEA,GAA0BoB,EAC9C,MAAM03E,eAAEA,EAAc2J,aAAEA,GAAiBziF,EACzC1J,KAAKkyF,iBAAmB1P,EACxBxiF,KAAK+3F,eAAiB5L,EACtBnsF,KAAK6xF,wBACP,CAKA4D,IAAAA,GACE,GAAIz1F,KAAKwiF,iBAAmBxiF,KAAKmsF,aAE/B,OAEF,MAAMroF,cAAEA,GAAkBE,IAC1BF,EAAc2zF,WAAaz3F,KAAKgwF,kBAC3B7vF,EAAOu3F,sBAOV5zF,EAAc6zF,qBAAkBn3F,EANhCsD,EAAc6zF,gBAAkB33F,KAAKw/E,mBACnCx/E,KAAKwiF,eACLxiF,KAAKmsF,cACL,GAKJnsF,KAAKy2F,WAAY,CACnB,CAKAd,KAAAA,GACE31F,KAAK42F,WAAY,CACnB,CASAoB,qBAAAA,CAAsB9Z,EAAmBzxB,GACvC,IACEwrC,EADEC,EAAoBl4F,KAAK6jF,mBAAmB3F,GAOhD,OAJIzxB,EAAY,IACdwrC,EAAQj4F,KAAKoiF,aAAalE,GAAWzxB,EAAY,GACjDyrC,GAAqBD,EAAMnmF,KAAOmmF,EAAMjmF,OAEnCkmF,CACT,CAQAC,mBAAAA,CAAoBjuE,EAAkBkuE,GACpC,MAAMC,EAAgBr4F,KAAKs4F,uBAAuBpuE,EAAGkuE,GACnDjG,EAAiBnyF,KAAKk/E,oBAAoBmZ,GAC1Cna,EAAYiU,EAAejU,UAE7B,GACEA,IAAcl+E,KAAK6+E,WAAWt+E,OAAS,GACvC2pB,EAAEosE,SACY,KAAdpsE,EAAEisE,QAGF,OAAOn2F,KAAKqhF,MAAM9gF,OAAS83F,EAE7B,MAAM5rC,EAAY0lC,EAAe1lC,UAC/ByrC,EAAoBl4F,KAAKg4F,sBAAsB9Z,EAAWzxB,GAC1D8rC,EAAmBv4F,KAAKw4F,gBAAgBta,EAAY,EAAGga,GAEzD,OADoBl4F,KAAK6+E,WAAWX,GAAWnkD,MAAM0yB,GAEnClsD,OAChBg4F,EACA,EACAv4F,KAAKsiF,qBAAqBpE,EAE9B,CASAoa,sBAAAA,CAAuBpuE,EAAkBkuE,GACvC,OAAIluE,EAAEs9C,UAAYxnE,KAAKwiF,iBAAmBxiF,KAAKmsF,cAAgBiM,EACtDp4F,KAAKmsF,aAELnsF,KAAKwiF,cAEhB,CAOAiW,iBAAAA,CAAkBvuE,EAAkBkuE,GAClC,MAAMC,EAAgBr4F,KAAKs4F,uBAAuBpuE,EAAGkuE,GACnDjG,EAAiBnyF,KAAKk/E,oBAAoBmZ,GAC1Cna,EAAYiU,EAAejU,UAC7B,GAAkB,IAAdA,GAAmBh0D,EAAEosE,SAAyB,KAAdpsE,EAAEisE,QAEpC,OAAQkC,EAEV,MAAM5rC,EAAY0lC,EAAe1lC,UAC/ByrC,EAAoBl4F,KAAKg4F,sBAAsB9Z,EAAWzxB,GAC1D8rC,EAAmBv4F,KAAKw4F,gBAAgBta,EAAY,EAAGga,GACvDQ,EAAmB14F,KAAK6+E,WAAWX,GAAWnkD,MAAM,EAAG0yB,GACvD61B,EAAuBtiF,KAAKsiF,qBAAqBpE,EAAY,GAE/D,OACGl+E,KAAK6+E,WAAWX,EAAY,GAAG39E,OAChCg4F,EACAG,EAAiBn4F,QAChB,EAAI+hF,EAET,CAMAkW,eAAAA,CAAgBta,EAAmBlsE,GACjC,MAAMmsE,EAAOn+E,KAAK6+E,WAAWX,GAE7B,IAEEya,EACAC,EAHEC,EADe74F,KAAK6jF,mBAAmB3F,GAEzC4a,EAAc,EAIhB,IAAK,IAAIzhD,EAAI,EAAG2jB,EAAOmjB,EAAK59E,OAAQ82C,EAAI2jB,EAAM3jB,IAG5C,GAFAshD,EAAY34F,KAAKoiF,aAAalE,GAAW7mC,GAAGrlC,MAC5C6mF,GAAsBF,EAClBE,EAAqB7mF,EAAO,CAC9B4mF,GAAa,EACb,MAAMG,EAAWF,EAAqBF,EACpCK,EAAYH,EACZI,EAAqBv0F,KAAKgH,IAAIqtF,EAAW/mF,GAG3C8mF,EAFwBp0F,KAAKgH,IAAIstF,EAAYhnF,GAETinF,EAAqB5hD,EAAIA,EAAI,EACjE,KACF,CAQF,OAJKuhD,IACHE,EAAc3a,EAAK59E,OAAS,GAGvBu4F,CACT,CAMAI,cAAAA,CAAehvE,GAEXlqB,KAAKwiF,gBAAkBxiF,KAAKqhF,MAAM9gF,QAClCP,KAAKmsF,cAAgBnsF,KAAKqhF,MAAM9gF,QAIlCP,KAAKm5F,oBAAoB,OAAQjvE,EACnC,CAMAkvE,YAAAA,CAAalvE,GACiB,IAAxBlqB,KAAKwiF,gBAA8C,IAAtBxiF,KAAKmsF,cAGtCnsF,KAAKm5F,oBAAoB,KAAMjvE,EACjC,CAOAivE,mBAAAA,CAAoBv4D,EAA0B1W,GAC5C,MAAMlN,EAAShd,KAAK,MAAM4gC,iBACxB1W,EACAlqB,KAAK80F,sBAAwBnuF,GAO/B,GALIujB,EAAEs9C,SACJxnE,KAAKq5F,oBAAoBr8E,GAEzBhd,KAAKs5F,uBAAuBt8E,GAEf,IAAXA,EAAc,CAChB,MAAMrY,EAAM3E,KAAKssD,KAAK/rD,OACtBP,KAAKwiF,eAAiBp/C,GAAS,EAAGpjC,KAAKwiF,eAAgB79E,GACvD3E,KAAKmsF,aAAe/oD,GAAS,EAAGpjC,KAAKmsF,aAAcxnF,GAGnD3E,KAAK0tF,uBACL1tF,KAAKwsF,oBACLxsF,KAAK8vF,wBACL9vF,KAAKyuF,iBACP,CACF,CAMA4K,mBAAAA,CAAoBr8E,GAClB,MAAMivE,EACJjsF,KAAK80F,sBAAwBtuF,EACzBxG,KAAKwiF,eAAiBxlE,EACtBhd,KAAKmsF,aAAenvE,EAM1B,OALAhd,KAAK60F,8BACH70F,KAAKwiF,eACLxiF,KAAKmsF,aACLF,GAEgB,IAAXjvE,CACT,CAMAs8E,sBAAAA,CAAuBt8E,GAQrB,OAPIA,EAAS,GACXhd,KAAKwiF,gBAAkBxlE,EACvBhd,KAAKmsF,aAAensF,KAAKwiF,iBAEzBxiF,KAAKmsF,cAAgBnvE,EACrBhd,KAAKwiF,eAAiBxiF,KAAKmsF,cAEX,IAAXnvE,CACT,CAMAu8E,cAAAA,CAAervE,GACe,IAAxBlqB,KAAKwiF,gBAA8C,IAAtBxiF,KAAKmsF,cAGtCnsF,KAAKw5F,uBAAuB,OAAQtvE,EACtC,CAQAuvE,KAAAA,CACEvvE,EACAtX,EACAguB,GAEA,IAAI84D,EACJ,GAAIxvE,EAAEk9C,OACJsyB,EAAW15F,KAAK,mBAAmB4gC,KAAa5gC,KAAK4S,QAChD,KAAIsX,EAAEosE,SAAyB,KAAdpsE,EAAEisE,SAAgC,KAAdjsE,EAAEisE,QAI5C,OADAn2F,KAAK4S,IAAuB,SAAdguB,GAAuB,EAAK,GACnC,EAHP84D,EAAW15F,KAAK,mBAAmB4gC,KAAa5gC,KAAK4S,GAIvD,CACA,YAAwB,IAAb8mF,GAA4B15F,KAAK4S,KAAU8mF,IACpD15F,KAAK4S,GAAQ8mF,GACN,EAGX,CAKAC,SAAAA,CAAUzvE,EAAkBtX,GAC1B,OAAO5S,KAAKy5F,MAAMvvE,EAAGtX,EAAM,OAC7B,CAKAgnF,UAAAA,CAAW1vE,EAAkBtX,GAC3B,OAAO5S,KAAKy5F,MAAMvvE,EAAGtX,EAAM,QAC7B,CAMAinF,0BAAAA,CAA2B3vE,GACzB,IAAI4vE,GAAS,EAYb,OAXA95F,KAAK80F,oBAAsBtuF,EAKzBxG,KAAKmsF,eAAiBnsF,KAAKwiF,gBACH,IAAxBxiF,KAAKwiF,iBAELsX,EAAS95F,KAAK25F,UAAUzvE,EAAG,mBAE7BlqB,KAAKmsF,aAAensF,KAAKwiF,eAClBsX,CACT,CAMAC,uBAAAA,CAAwB7vE,GACtB,OACElqB,KAAK80F,sBAAwBnuF,GAC7B3G,KAAKwiF,iBAAmBxiF,KAAKmsF,aAEtBnsF,KAAK25F,UAAUzvE,EAAG,gBACQ,IAAxBlqB,KAAKwiF,gBACdxiF,KAAK80F,oBAAsBtuF,EACpBxG,KAAK25F,UAAUzvE,EAAG,wBAFpB,CAIT,CAMA8vE,eAAAA,CAAgB9vE,GAEZlqB,KAAKwiF,gBAAkBxiF,KAAKqhF,MAAM9gF,QAClCP,KAAKmsF,cAAgBnsF,KAAKqhF,MAAM9gF,QAIlCP,KAAKw5F,uBAAuB,QAAStvE,EACvC,CAOAsvE,sBAAAA,CAAuB54D,EAA6B1W,GAClD,MAAMqxB,EAAa,aAAa3a,IAC9B1W,EAAEs9C,SAAW,YAAc,iBAE7BxnE,KAAKkvF,sBAAwB,EACzBlvF,KAAKu7C,GAAYrxB,KAGnBlqB,KAAK0tF,uBACL1tF,KAAKwsF,oBACLxsF,KAAK8vF,wBACL9vF,KAAKyuF,kBAET,CAMAwL,wBAAAA,CAAyB/vE,GACvB,OACElqB,KAAK80F,sBAAwBtuF,GAC7BxG,KAAKwiF,iBAAmBxiF,KAAKmsF,aAEtBnsF,KAAK45F,WAAW1vE,EAAG,kBACjBlqB,KAAKmsF,eAAiBnsF,KAAKqhF,MAAM9gF,QAC1CP,KAAK80F,oBAAsBnuF,EACpB3G,KAAK45F,WAAW1vE,EAAG,sBAFrB,CAIT,CAMAgwE,2BAAAA,CAA4BhwE,GAC1B,IAAIs2B,GAAU,EASd,OARAxgD,KAAK80F,oBAAsBnuF,EAEvB3G,KAAKwiF,iBAAmBxiF,KAAKmsF,cAC/B3rC,EAAUxgD,KAAK45F,WAAW1vE,EAAG,kBAC7BlqB,KAAKmsF,aAAensF,KAAKwiF,gBAEzBxiF,KAAKwiF,eAAiBxiF,KAAKmsF,aAEtB3rC,CACT,EClqBF,MAAM25C,GAAiBjwE,KAAgBA,EAAiBooD,OAEjD,MAAe8nB,WAIZrF,GAA2Cj1F,WAAAA,GAAAM,SAAAE,WAAAP,EAAAC,KAAA,6BAAA,EAAA,CAGnD6uF,YAAAA,GAEE7uF,KAAK6J,GAAG,YAAa7J,KAAKq6F,mBAC1Br6F,KAAK6J,GAAG,UAAW7J,KAAKm7C,gBACxBn7C,KAAK6J,GAAG,gBAAiB7J,KAAKs6F,oBAC9Bt6F,KAAK6J,GAAG,mBAAoB7J,KAAKu6F,oBAEjCv6F,KAAKw6F,sBAAwB,IAAI/O,GAC/BzrF,MAGFI,MAAMyuF,cACR,CASA3pC,mBAAAA,GACE,OAAOllD,KAAKw6F,sBAAsBnO,UACpC,CAQAjnC,WAAAA,CAAYl7B,GACV,OAAOlqB,KAAKw6F,sBAAsBp1C,YAAYl7B,EAChD,CAKAm7B,OAAAA,CAAQn7B,GACN,OAAOlqB,KAAKw6F,sBAAsBn1C,QAAQn7B,EAC5C,CAKAowE,kBAAAA,CAAmBp4F,GACZlC,KAAKmqE,YAGVnqE,KAAKwwF,WAAWxwF,KAAKksF,6BAA6BhqF,EAAQgoB,IAC1DlqB,KAAKmvF,0BACP,CAKAoL,kBAAAA,CAAmBr4F,GACZlC,KAAKmqE,YAGVnqE,KAAK2wF,WAAW3wF,KAAKksF,6BAA6BhqF,EAAQgoB,IAC1DlqB,KAAKmvF,0BACP,CAUAkL,iBAAAA,CAAiBv1F,GAA2D,IAA1DolB,EAAEA,EAAC88C,gBAAEA,GAAmDliE,EAErE9E,KAAKmD,QACLnD,KAAK2tF,WACNwM,GAAcjwE,KACdlqB,KAAKsiD,qBAKHtiD,KAAKw6F,sBAAsBjzD,MAAMrd,KAIrClqB,KAAKmD,OAAOswE,mBAAmB7rC,SAAS5nC,MAEpCgnE,IACFhnE,KAAK4xF,mBAAoB,EACzB5xF,KAAKusF,iBAAiBriE,IAGpBlqB,KAAKmqE,YACPnqE,KAAKoxF,4BAA8BpxF,KAAKwiF,eACpCxiF,KAAKwiF,iBAAmBxiF,KAAKmsF,cAC/BnsF,KAAK0tF,uBAEP1tF,KAAKmvF,2BAEPnvF,KAAKw2D,WAALx2D,KAAKw2D,SAAawQ,GAAmBhnE,KAAKmqE,YAC5C,CAMAhvB,cAAAA,CAAc5wC,GAAmD,IAAlD2f,EAAEA,EAACvb,UAAEA,GAA2CpE,EAC7D,MAAMkwF,EAAUz6F,KAAKw6F,sBAAsB7tC,IAAIziC,GAE/C,GAAIlqB,KAAKmD,OAAQ,CACfnD,KAAKmD,OAAOswE,mBAAmBvrC,WAAWloC,MAE1C,MAAM62D,EAAe72D,KAAKmD,OAAOqgD,cACjC,GAAIqT,GAAgBA,IAAiB72D,KAInC,MAEJ,EAGGA,KAAK2tF,UACL3tF,KAAK0sC,QAAU1sC,KAAK0sC,MAAMqrB,aAC1BppD,GAAaA,EAAUoqC,iBACxBohD,GAAcjwE,IACduwE,GAKEz6F,KAAKw2D,WAAax2D,KAAKsiD,qBACzBtiD,KAAKwuF,aAAatkE,GACdlqB,KAAKwiF,iBAAmBxiF,KAAKmsF,aAC/BnsF,KAAKwsF,mBAAkB,GAEvBxsF,KAAKmvF,0BAGX,CAMA5C,gBAAAA,CAAiBriE,GACf,MAAM+hE,EAAejsF,KAAKksF,6BAA6BhiE,GACrDqd,EAAQvnC,KAAKwiF,eACb71B,EAAM3sD,KAAKmsF,aACTjiE,EAAEs9C,SACJxnE,KAAK60F,8BAA8BttD,EAAOolB,EAAKs/B,IAE/CjsF,KAAKwiF,eAAiByJ,EACtBjsF,KAAKmsF,aAAeF,GAElBjsF,KAAKmqE,YACPnqE,KAAK8vF,wBACL9vF,KAAKyuF,kBAET,CAOAvC,4BAAAA,CAA6BhiE,GAC3B,MAAMwwE,EAAc16F,KAAKmD,OAAQ+jE,cAAch9C,GAC5Cvb,UAAUkG,GAAgB7U,KAAKi+B,wBAC/BhyB,IAAI,IAAIH,IAAO9L,KAAKujF,kBAAmBvjF,KAAKyjF,kBAC/C,IAAIxxE,EAAS,EACXw6C,EAAY,EACZyxB,EAAY,EAEd,IAAK,IAAI/yE,EAAI,EAAGA,EAAInL,KAAK6+E,WAAWt+E,QAC9B0R,GAAUyoF,EAAY3uF,EADgBZ,IAExC8G,GAAUjS,KAAK2jF,gBAAgBx4E,GAC/B+yE,EAAY/yE,EACRA,EAAI,IACNshD,GACEzsD,KAAK6+E,WAAW1zE,EAAI,GAAG5K,OAASP,KAAKsiF,qBAAqBn3E,EAAI,IAOtE,IAAI6G,EADmBtN,KAAKgH,IAAI1L,KAAK6jF,mBAAmB3F,IAExD,MAAMyc,EAAa36F,KAAK6+E,WAAWX,GAAW39E,OACxCmsD,EAAQ1sD,KAAKoiF,aAAalE,GAChC,IAAK,IAAI7mC,EAAI,EAAGA,EAAIsjD,EAAYtjD,IAAK,CAEnC,MACMujD,EAAa5oF,EADD06C,EAAMrV,GAAGgrC,YAE3B,GAAIqY,EAAY1uF,GAAK4uF,EAAY,CAI7Bl2F,KAAKgH,IAAIgvF,EAAY1uF,EAAI4uF,IACzBl2F,KAAKgH,IAAIgvF,EAAY1uF,EAAIgG,IAEzBy6C,IAEF,KACF,CACAz6C,EAAQ4oF,EACRnuC,GACF,CAEA,OAAO/nD,KAAK8I,IAEVxN,KAAK+W,MAAQ4jF,EAAaluC,EAAYA,EACtCzsD,KAAKqhF,MAAM9gF,OAEf,ECjOF,MAAMs6F,GAAwC,eACxCC,GAA0C,iBAC1CC,GAA0C,iBAC1CC,GAA2C,kBAC3CC,GAAsC,cCT/BC,GAAuBA,CAClCv/E,EACAxY,KAEA,MAAM2Y,EAAQ3Y,EAAOwc,mBACrBhE,EAAIs1B,aAAan1B,EAAO,EAAG,EAAGA,EAAO,EAAG,GACxC,MAAMmG,EAAI9e,EAAOyb,kBACjBjD,EAAIhN,UAAUsT,EAAE,GAAIA,EAAE,GAAIA,EAAE,GAAIA,EAAE,GAAIA,EAAE,GAAIA,EAAE,KC8BnCk5E,GAAuD,CAClE3Y,eAAgB,EAChB2J,aAAc,EACdhkB,eAAgB,uBAChBgC,WAAW,EACXwjB,UAAU,EACV0D,mBAAoB,yBACpB5P,YAAa,EACb2Z,YAAa,GACb3L,YAAa,IACbJ,eAAgB,IAChBgM,SAAS,EACThG,wBAAyB,KACzBa,QFpCmC,CACnC,EAAG+E,GACH,GAAIA,GACJ,GAAIJ,GACJ,GAAIC,GACJ,GAAIE,GACJ,GAAID,GACJ,GAAIA,GACJ,GAAIF,GACJ,GAAIG,GACJ,GAAIF,IE2BJ7E,WFxBsC,CACtC,EAAGgF,GACH,GAAIA,GACJ,GAAIJ,GACJ,GAAIC,GACJ,GAAIC,GACJ,GAAIC,GACJ,GAAIA,GACJ,GAAIH,GACJ,GAAIE,GACJ,GAAID,IEeJ1E,gBFA2C,CAC3C,GAAI,UEAJM,cFVyC,CACzC,GAAI,OAEJ,GAAI,OEdJ5B,oBAAqB,KACrB3E,SAAU,WACVyB,mBAAmB,GA8Ed,MAAM0J,WAKHlB,GAgFR,kBAAOj7E,GACL,MAAO,IAAK/e,MAAM+e,iBAAkBm8E,GAAMl8E,YAC5C,CAIA,QAAI1W,GACF,MAAMA,EAAOtI,MAAMsI,KAEnB,MAAgB,UAATA,EAAmB,SAAWA,CACvC,CAOA5I,WAAAA,CAAYwsD,EAAcpqD,GACxB9B,MAAMksD,EAAM,IAAKgvC,GAAMl8E,eAAgBld,IACvClC,KAAK6uF,cACP,CAQA/7E,IAAAA,CAAKvR,EAAa+J,GAChB,OAAItL,KAAKmqE,WAAanqE,KAAK0yF,aAAenxF,KAAOvB,KAAK0yF,aAEpD1yF,KAAK0yF,YAAYnxF,GAAO+J,EACjBtL,OAEG,WAARuB,IACFvB,KAAKmD,kBAAkBkrE,IACrBruE,KAAKmD,OAAOswE,mBAAmB1qE,OAAO/I,MACxCsL,aAAiB+iE,IAAU/iE,EAAMmoE,mBAAmBxnE,IAAIjM,OAEnDI,MAAM0S,KAAKvR,EAAK+J,GACzB,CAMAiwF,iBAAAA,CAAkBvyF,GAChBA,EAAQtE,KAAKC,IAAIqE,EAAO,GACxBhJ,KAAKw7F,eAAe,iBAAkBxyF,EACxC,CAMAyyF,eAAAA,CAAgBzyF,GACdA,EAAQtE,KAAK8I,IAAIxE,EAAOhJ,KAAKssD,KAAK/rD,QAClCP,KAAKw7F,eAAe,eAAgBxyF,EACtC,CAOUwyF,cAAAA,CACRxoF,EACAhK,GAEIhJ,KAAKgT,KAAchK,IACrBhJ,KAAK8vF,wBACL9vF,KAAKgT,GAAYhK,GAEnBhJ,KAAKyuF,iBACP,CAMAqB,qBAAAA,GACE9vF,KAAK+K,KAAK,qBACV/K,KAAKmD,QAAUnD,KAAKmD,OAAO4H,KAAK,yBAA0B,CAAErB,OAAQ1J,MACtE,CASA4gF,cAAAA,GACE5gF,KAAKmqE,WAAanqE,KAAKwsF,oBACvBpsF,MAAMwgF,gBACR,CAUApB,kBAAAA,GAIE,IAHAC,EAAkBn/E,UAAAC,eAAAC,IAAAF,UAAA,GAAAA,UAAA,GAAGN,KAAKwiF,gBAAkB,EAC5C9C,EAAgBp/E,UAAAC,OAAA,QAAAC,IAAAF,UAAA,GAAAA,UAAA,GAAGN,KAAKmsF,aACxBpU,EAAkBz3E,UAAAC,OAAA,EAAAD,kBAAAE,EAElB,OAAOJ,MAAMo/E,mBAAmBC,EAAYC,EAAU3H,EACxD,CAQA8H,kBAAAA,CACEx4D,GAGA,IAFAo4D,EAAkBn/E,UAAAC,eAAAC,IAAAF,UAAA,GAAAA,UAAA,GAAGN,KAAKwiF,gBAAkB,EAC5C9C,EAAgBp/E,UAAAC,OAAA,QAAAC,IAAAF,UAAA,GAAAA,UAAA,GAAGN,KAAKmsF,aAExB,OAAO/rF,MAAMy/E,mBAAmBx4D,EAAQo4D,EAAYC,EACtD,CAOAR,mBAAAA,GAGE,IAFAsD,EAAcliF,UAAAC,OAAA,QAAAC,IAAAF,UAAA,GAAAA,UAAA,GAAGN,KAAKwiF,eACtBC,EAAsBniF,UAAAC,OAAA,EAAAD,kBAAAE,EAEtB,OAAOJ,MAAM8+E,oBAAoBsD,EAAgBC,EACnD,CAMAj/D,MAAAA,CAAO7H,GACLvb,MAAMojB,OAAO7H,GAGb3b,KAAK2xF,kBAAoB,CAAA,EACzB3xF,KAAKmvF,yBACP,CAMA7mE,eAAAA,CAAgBpmB,GACd,MAAMioE,EAAYnqE,KAAKmqE,UACvBnqE,KAAKmqE,WAAY,EACjB,MAAMhnE,EAAS/C,MAAMkoB,gBAAgBpmB,GAErC,OADAlC,KAAKmqE,UAAYA,EACVhnE,CACT,CAMAgsF,uBAAAA,GACE,IAAKnvF,KAAKmqE,YAAcnqE,KAAKmD,OAC3B,OAEF,MAAMwY,EAAM3b,KAAK6kD,iBAAgB,GACjC,IAAKlpC,EACH,OAEF,MAAMoxE,EAAa/sF,KAAKgtF,uBAElBl2C,EAAY92C,KAAK07F,4BACjBC,EAA2B7kD,EAAUv2C,OAAS,EACpD,IACIq7F,EADAC,EAAuClgF,EAE3C,GAAIggF,EAA0B,CAE5BC,EAAgBhoF,GAAuB+H,EAAIxY,QAC3C04F,EAAaD,EAAcx4F,WAAW,MACtC83F,GAAqBW,EAAY77F,KAAKmD,QACtC,MAAMghB,EAAInkB,KAAKi+B,sBACf49D,EAAWltF,UAAUwV,EAAE,GAAIA,EAAE,GAAIA,EAAE,GAAIA,EAAE,GAAIA,EAAE,GAAIA,EAAE,GACvD,CAQA,GANInkB,KAAKwiF,iBAAmBxiF,KAAKmsF,cAAiBnsF,KAAK4xF,kBAGrD5xF,KAAK87F,gBAAgBD,EAAY9O,GAFjC/sF,KAAK+7F,aAAaF,EAAY9O,GAK5B4O,EAIF,IAAK,MAAMvkD,KAAYN,EAAW,CAChC,MAAM30B,EAAWi1B,EAASj1B,SACpB65E,EAAiBpoF,GAAuB+H,EAAIxY,QAC5C84F,EAAcD,EAAe54F,WAAW,MAG9C,GAFA83F,GAAqBe,EAAaj8F,KAAKmD,SAElCgf,EAAS4c,mBAAoB,CAChC,MAAM5a,EAAIizB,EAASnZ,sBACnBg+D,EAAYttF,UAAUwV,EAAE,GAAIA,EAAE,GAAIA,EAAE,GAAIA,EAAE,GAAIA,EAAE,GAAIA,EAAE,GACxD,CACAhC,EAASxT,UAAUstF,GAEnB95E,EAASiwB,WAAW6pD,GAAa,EAAM,CAAA,GACvCj8F,KAAK6yC,oBAAoBgpD,EAAY15E,EAAU65E,EACjD,CAGEL,IACFhgF,EAAIs1B,aAAa,EAAG,EAAG,EAAG,EAAG,EAAG,GAChCt1B,EAAIwH,UAAUy4E,EAAgB,EAAG,IAGnC57F,KAAKmD,OAAOkiE,iBAAkB,EAC9B1pD,EAAI6G,SACN,CASAk5E,yBAAAA,GACE,MAAMQ,EAAoC,GAE1C,IAAIprF,EAAgC9Q,KACpC,KAAO8Q,GACDA,EAAIqR,UACN+5E,EAAkB9xF,KAAK0G,GAEzBA,EAAMA,EAAI8gC,OAGZ,OAAOsqD,CACT,CAUAlP,oBAAAA,GAGoB,IAFlBhkF,EAAa1I,UAAAC,OAAA,QAAAC,IAAAF,UAAA,GAAAA,UAAA,GAAGN,KAAKwiF,eACrB2Z,EAAqB77F,UAAAC,OAAA,EAAAD,kBAAAE,EAErB,MAAMsR,EAAO9R,KAAKujF,iBAChBxxE,EAAM/R,KAAKyjF,gBACXtiD,EAAUnhC,KAAKo8F,4BAA4BpzF,EAAOmzF,GACpD,MAAO,CACLrqF,KAAMA,EACNC,IAAKA,EACLuxE,WAAYniD,EAAQrvB,KACpBo2E,UAAW/mD,EAAQpvB,IAEvB,CAQAqqF,2BAAAA,CACEpzF,EACAmzF,GAEA,OAAIA,EACKn8F,KAAKq8F,6BAA6BrzF,GAEvChJ,KAAK2xF,mBAAqB,QAAS3xF,KAAK2xF,kBACnC3xF,KAAK2xF,kBAEN3xF,KAAK2xF,kBAAoB3xF,KAAKq8F,6BAA6BrzF,EACrE,CAOAqzF,4BAAAA,CAA6BrzF,GAC3B,IAAIk/E,EAAY,EACd5E,EAAa,EACf,MAAM72B,UAAEA,EAASyxB,UAAEA,GAAcl+E,KAAKk/E,oBAAoBl2E,GAE1D,IAAK,IAAImC,EAAI,EAAGA,EAAI+yE,EAAW/yE,IAC7B+8E,GAAaloF,KAAK2jF,gBAAgBx4E,GAEpC,MAAMy4E,EAAiB5jF,KAAK6jF,mBAAmB3F,GACzC+Z,EAAQj4F,KAAKoiF,aAAalE,GAAWzxB,GAC3CwrC,IAAU3U,EAAa2U,EAAMnmF,MAEN,IAArB9R,KAAK0gC,aACL+rB,IAAczsD,KAAK6+E,WAAWX,GAAW39E,SAEzC+iF,GAActjF,KAAKslF,0BAErB,MAAMyH,EAAa,CACjBh7E,IAAKm2E,EACLp2E,KAAM8xE,GAAkBN,EAAa,EAAIA,EAAa,IAkBxD,MAhBuB,QAAnBtjF,KAAK4gC,YAEL5gC,KAAKogC,YAAcz5B,GACnB3G,KAAKogC,YAAciB,IACnBrhC,KAAKogC,YAAcmB,GAEnBwrD,EAAWj7E,OAAQ,EACV9R,KAAKogC,YAAc55B,GAAQxG,KAAKogC,YAAckB,GACvDyrD,EAAWj7E,KAAO8xE,GAAkBN,EAAa,EAAIA,EAAa,GAElEtjF,KAAKogC,YAAc75B,GACnBvG,KAAKogC,YAAcoB,KAEnBurD,EAAWj7E,KAAO8xE,GAAkBN,EAAa,EAAIA,EAAa,KAG/DyJ,CACT,CAOAuP,cAAAA,CAAe9Z,GACbxiF,KAAKu8F,cACHv8F,KAAKmD,OAAQmuC,WACbtxC,KAAKgtF,qBAAqBxK,GAAgB,GAC1CA,EAEJ,CAOAuZ,YAAAA,CAAapgF,EAA+BoxE,GAC1C/sF,KAAKu8F,cAAc5gF,EAAKoxE,EAAY/sF,KAAKwiF,eAC3C,CAQAga,sBAAAA,GAGuB,IAFrBha,EAAsBliF,UAAAC,OAAA,QAAAC,IAAAF,UAAA,GAAAA,UAAA,GAAGN,KAAKwiF,eAC9BuK,EAA4BzsF,UAAAC,eAAAC,IAAAF,UAAA,GAAAA,UAAA,GAAGN,KAAKgtF,qBAAqBxK,GAEzD,MAAM2P,EAAiBnyF,KAAKk/E,oBAAoBsD,GAC9CtE,EAAYiU,EAAejU,UAC3BzxB,EACE0lC,EAAe1lC,UAAY,EAAI0lC,EAAe1lC,UAAY,EAAI,EAChE2lC,EAAapyF,KAAKmkF,qBAAqBjG,EAAWzxB,EAAW,YAC7DrkC,EAAapoB,KAAKuxC,mBAAmBvlC,EAAIhM,KAAKmD,OAAQgd,UACtDshE,EAAczhF,KAAKyhF,YAAcr5D,EACjCza,EAAK3N,KAAKmkF,qBAAqBjG,EAAWzxB,EAAW,UACrDy7B,EACE6E,EAAW7E,WACT,EAAIloF,KAAKkhC,mBAAqBlhC,KAAK2jF,gBAAgBzF,GACnDl+E,KAAKqgC,WACP+xD,GAAc,EAAIpyF,KAAKkhC,mBAE3B,MAAO,CACLlI,MACEh5B,KAAKo7F,aACJp7F,KAAKmkF,qBAAqBjG,EAAWzxB,EAAW,QACnD1vB,QAAS/8B,KAAKkvF,sBACdp9E,KAAMi7E,EAAWj7E,KAAOi7E,EAAWzJ,WAAa7B,EAAc,EAC9D1vE,IAAKm2E,EAAY6E,EAAWh7E,IAAMpE,EAClCqE,MAAOyvE,EACPxvE,OAAQmgF,EAEZ,CAMAmK,aAAAA,CACE5gF,EACAoxE,EACAvK,GAEA,MAAMxpD,MAAEA,EAAK+D,QAAEA,EAAOjrB,KAAEA,EAAIC,IAAEA,EAAGC,MAAEA,EAAKC,OAAEA,GACxCjS,KAAKw8F,uBAAuBha,EAAgBuK,GAC9CpxE,EAAIsI,UAAY+U,EAChBrd,EAAI83B,YAAc1W,EAClBphB,EAAI43B,SAASzhC,EAAMC,EAAKC,EAAOC,EACjC,CAOA6pF,eAAAA,CAAgBngF,EAA+BoxE,GAC7C,MAAMpnB,EAAY,CAChB6c,eAAgBxiF,KAAK4xF,kBACjB5xF,KAAK+sE,eAAgByV,eACrBxiF,KAAKwiF,eACT2J,aAAcnsF,KAAK4xF,kBACf5xF,KAAK+sE,eAAgBof,aACrBnsF,KAAKmsF,cAEXnsF,KAAKy8F,iBAAiB9gF,EAAKgqD,EAAWonB,EACxC,CAKAznC,sBAAAA,GACE,MAAMuoC,EACJ7tF,KAAKw6F,sBAAsB9N,wBAC7B1sF,KAAKy8F,iBACHz8F,KAAKmD,OAAQmuC,WACbu8C,EACA7tF,KAAKgtF,qBAAqBa,EAAmBrL,gBAAgB,GAEjE,CAEAj9B,sBAAAA,CAAuBr7B,GACrB,MAAMwyE,EAAgB18F,KAAKksF,6BAA6BhiE,GACxDlqB,KAAKs8F,eAAeI,EACtB,CASAD,gBAAAA,CACE9gF,EACAgqD,EACAonB,GAEA,MAAMvK,EAAiB7c,EAAU6c,eAC/B2J,EAAexmB,EAAUwmB,aACzB3F,EAAYxmF,KAAKogC,UAAUxvB,SAASywB,IACpCkG,EAAQvnC,KAAKk/E,oBAAoBsD,GACjC71B,EAAM3sD,KAAKk/E,oBAAoBiN,GAC/BwQ,EAAYp1D,EAAM22C,UAClB0e,EAAUjwC,EAAIuxB,UACd2e,EAAYt1D,EAAMklB,UAAY,EAAI,EAAIllB,EAAMklB,UAC5CqwC,EAAUnwC,EAAIF,UAAY,EAAI,EAAIE,EAAIF,UAExC,IAAK,IAAIthD,EAAIwxF,EAAWxxF,GAAKyxF,EAASzxF,IAAK,CACzC,MAAMq/E,EAAaxqF,KAAK6jF,mBAAmB14E,IAAM,EACjD,IAAIk1B,EAAargC,KAAK2jF,gBAAgBx4E,GACpC4xF,EAAiB,EACjB9Y,EAAW,EACX+Y,EAAS,EAKX,GAHI7xF,IAAMwxF,IACR1Y,EAAWjkF,KAAKoiF,aAAaua,GAAWE,GAAW/qF,MAEjD3G,GAAKwxF,GAAaxxF,EAAIyxF,EACxBI,EACExW,IAAcxmF,KAAKkiF,gBAAgB/2E,GAC/BnL,KAAKgS,MACLhS,KAAKmiF,aAAah3E,IAAM,OACzB,GAAIA,IAAMyxF,EACf,GAAgB,IAAZE,EACFE,EAASh9F,KAAKoiF,aAAawa,GAASE,GAAShrF,SACxC,CACL,MAAM4uB,EAAc1gC,KAAKslF,yBACzB0X,EACEh9F,KAAKoiF,aAAawa,GAASE,EAAU,GAAGhrF,KACxC9R,KAAKoiF,aAAawa,GAASE,EAAU,GAAG9qF,MACxC0uB,CACJ,CAEFq8D,EAAiB18D,GACbrgC,KAAKqgC,WAAa,GAAMl1B,IAAMyxF,GAAW58F,KAAKqgC,WAAa,KAC7DA,GAAcrgC,KAAKqgC,YAErB,IAAIyjD,EAAYiJ,EAAWj7E,KAAO04E,EAAavG,EAC7CgZ,EAAa58D,EACb68D,EAAW,EACb,MAAMC,EAAYH,EAAS/Y,EACvBjkF,KAAK4xF,mBACPj2E,EAAIsI,UAAYjkB,KAAKo9F,kBAAoB,QACzCH,EAAa,EACbC,EAAW78D,GAEX1kB,EAAIsI,UAAYjkB,KAAKmoE,eAEA,QAAnBnoE,KAAK4gC,YAEL5gC,KAAKogC,YAAcz5B,GACnB3G,KAAKogC,YAAciB,IACnBrhC,KAAKogC,YAAcmB,GAEnBuiD,EAAY9jF,KAAKgS,MAAQ8xE,EAAYqZ,EAC5Bn9F,KAAKogC,YAAc55B,GAAQxG,KAAKogC,YAAckB,GACvDwiD,EAAYiJ,EAAWj7E,KAAO04E,EAAawS,EAE3Ch9F,KAAKogC,YAAc75B,GACnBvG,KAAKogC,YAAcoB,KAEnBsiD,EAAYiJ,EAAWj7E,KAAO04E,EAAawS,IAG/CrhF,EAAI43B,SACFuwC,EACAiJ,EAAWh7E,IAAMg7E,EAAW7E,UAAYgV,EACxCC,EACAF,GAEFlQ,EAAW7E,WAAa6U,CAC1B,CACF,CASAM,sBAAAA,GACE,MAAMC,EAAKt9F,KAAKu9F,uBAChB,OAAOv9F,KAAKmkF,qBAAqBmZ,EAAG/kE,EAAG+kE,EAAGv5D,EAAG,WAC/C,CAUAy5D,mBAAAA,GACE,MAAMF,EAAKt9F,KAAKu9F,uBAChB,OAAOv9F,KAAKmkF,qBAAqBmZ,EAAG/kE,EAAG+kE,EAAGv5D,EAAGn8B,EAC/C,CAMA21F,oBAAAA,GACE,MAAME,EAAiBz9F,KAAKk/E,oBAAoBl/E,KAAKwiF,gBAAgB,GACnE/1B,EACEgxC,EAAehxC,UAAY,EAAIgxC,EAAehxC,UAAY,EAAI,EAClE,MAAO,CAAEl0B,EAAGklE,EAAevf,UAAWn6C,EAAG0oB,EAC3C,CAEApoD,OAAAA,GACErE,KAAK4yF,kBACL5yF,KAAKw6F,sBAAsBn2F,UAC3BjE,MAAMiE,SACR,EApkBAtE,EA7EWu7F,GAAK,cAmFKH,IAAkBp7F,EAnF5Bu7F,GAAK,OAyFF,SA2jBhBrzF,EAAcM,SAAS+yF,IAEvBrzF,EAAcM,SAAS+yF,GAAO,UC3tBvB,MAAMoC,WAKHpC,GAqCR,kBAAOn8E,GACL,MAAO,IACF/e,MAAM+e,iBACNu+E,GAAQt+E,YAEf,CAOAtf,WAAAA,CAAYwsD,EAAcpqD,GACxB9B,MAAMksD,EAAM,IAAKoxC,GAAQt+E,eAAgBld,GAC3C,CAOA,qBAAO8/C,GACL,MAAO,CAAEh0B,SAAU8zB,KACrB,CAQA8+B,cAAAA,GACO5gF,KAAK+8E,cAGV/8E,KAAKmqE,WAAanqE,KAAKwsF,oBACvBxsF,KAAKuhF,cAELvhF,KAAK29F,gBAAkB,EAEvB39F,KAAK49F,UAAY59F,KAAK69F,kBAAkB79F,KAAK8gF,cAEzC9gF,KAAK29F,gBAAkB39F,KAAKgS,OAC9BhS,KAAK8S,KAAK,QAAS9S,KAAK29F,iBAEtB39F,KAAKogC,UAAUxvB,SAASywB,KAE1BrhC,KAAK2hF,gBAGP3hF,KAAKiS,OAASjS,KAAK0hF,iBACrB,CASAmc,iBAAAA,CAAkBC,GAChB,IAAIC,EAAgB,EAClBC,EAAoB,EACpBjH,EAAY,EACd,MAAMz+E,EAAgB,CAAA,EAEtB,IAAK,IAAInN,EAAI,EAAGA,EAAI2yF,EAAS5c,cAAc3gF,OAAQ4K,IACR,OAArC2yF,EAASxc,aAAayV,IAAuB5rF,EAAI,GACnD6yF,EAAoB,EACpBjH,IACAgH,MAEC/9F,KAAKi+F,iBACNj+F,KAAK+/B,eAAe8uB,KAAKivC,EAASxc,aAAayV,KAC/C5rF,EAAI,IAGJ6yF,IACAjH,KAGFz+E,EAAInN,GAAK,CAAEgzE,KAAM4f,EAAe/gF,OAAQghF,GAExCjH,GAAa+G,EAAS5c,cAAc/1E,GAAG5K,OACvCy9F,GAAqBF,EAAS5c,cAAc/1E,GAAG5K,OAGjD,OAAO+X,CACT,CAOA+lE,QAAAA,CAASrrE,EAAsCkrE,GAC7C,GAAIl+E,KAAK49F,YAAc59F,KAAKk+F,WAAY,CACtC,MAAM5lF,EAAMtY,KAAK49F,UAAU1f,GACvB5lE,IACF4lE,EAAY5lE,EAAI6lE,KAEpB,CACA,OAAO/9E,MAAMi+E,SAASrrE,EAAUkrE,EAClC,CAOAD,aAAAA,CAAcC,GACZ,IAAKl+E,KAAKqnB,OACR,OAAO,EAET,IAEE82E,EAFEnhF,EAAS,EACXohF,EAAgBlgB,EAAY,EAE5BmgB,GAAc,EAChB,MAAM/lF,EAAMtY,KAAK49F,UAAU1f,GACzBogB,EAAct+F,KAAK49F,UAAU1f,EAAY,GACvC5lE,IACF4lE,EAAY5lE,EAAI6lE,KAChBnhE,EAAS1E,EAAI0E,QAEXshF,IACFF,EAAgBE,EAAYngB,KAC5BkgB,EAAcD,IAAkBlgB,EAChCigB,EAAaG,EAAYthF,QAE3B,MAAMlM,OACiB,IAAdotE,EACHl+E,KAAKqnB,OACL,CAAE82D,KAAMn+E,KAAKqnB,OAAO62D,IAC1B,IAAK,MAAMvc,KAAM7wD,EACf,IAAK,MAAM8wD,KAAM9wD,EAAI6wD,GAAK,CACxB,MAAM48B,EAAWphF,SAASykD,EAAI,IAC9B,GAAI28B,GAAYvhF,KAAYqhF,GAAeE,EAAWJ,GACpD,IAAK,MAAM/f,KAAMttE,EAAI6wD,GAAIC,GACvB,OAAO,CAGb,CAEF,OAAO,CACT,CAQA0d,oBAAAA,CACEpB,EACAzxB,GAEA,GAAIzsD,KAAK49F,YAAc59F,KAAKk+F,WAAY,CACtC,MAAM5lF,EAAMtY,KAAK49F,UAAU1f,GAC3B,IAAK5lE,EACH,MAAO,CAAA,EAET4lE,EAAY5lE,EAAI6lE,KAChB1xB,EAAYn0C,EAAI0E,OAASyvC,CAC3B,CACA,OAAOrsD,MAAMk/E,qBAAqBpB,EAAWzxB,EAC/C,CAQU8yB,oBAAAA,CACRrB,EACAzxB,EACAtxC,GAEA,MAAM7C,EAAMtY,KAAK49F,UAAU1f,GAC3B99E,MAAMm/E,qBAAqBjnE,EAAI6lE,KAAM7lE,EAAI0E,OAASyvC,EAAWtxC,EAC/D,CAOU+kE,uBAAAA,CAAwBhC,EAAmBzxB,GACnD,MAAMn0C,EAAMtY,KAAK49F,UAAU1f,GAC3B99E,MAAM8/E,wBAAwB5nE,EAAI6lE,KAAM7lE,EAAI0E,OAASyvC,EACvD,CAUU0yB,aAAAA,CAAcjB,GACtB,MAAM5lE,EAAMtY,KAAK49F,UAAU1f,GAC3B,QAASl+E,KAAKqnB,OAAO/O,EAAI6lE,KAC3B,CAQUiB,aAAAA,CAAclB,GACtB,MAAM5lE,EAAMtY,KAAK49F,UAAU1f,GAC3B99E,MAAMg/E,cAAc9mE,EAAI6lE,KAC1B,CAWAqgB,SAAAA,CAAUvd,EAAiBwd,GACzBz+F,KAAKk+F,YAAa,EAElB,MAAMt4E,EAAO5lB,KAAK0+F,yBAAyBzd,GACrC0d,EAAsB,GAC5B,IAAK,IAAIxzF,EAAI,EAAGA,EAAIya,EAAKg5E,UAAUr+F,OAAQ4K,IACzCwzF,EAAQv0F,QAAQpK,KAAK6+F,UAAU1zF,EAAGszF,EAAc74E,IAGlD,OADA5lB,KAAKk+F,YAAa,EACXS,CACT,CASAD,wBAAAA,CAAyBzd,GACvB,MAAMgd,EAAkBj+F,KAAKi+F,gBAC3Ba,EAAQb,EAAkB,GAAK,IAEjC,IAAIc,EAAmB,EAwBvB,MAAO,CACLH,UAvBW3d,EAAM3oE,IAAI,CAAC6lE,EAAMD,KAC5B,IAAIlhE,EAAS,EACb,MAAMgiF,EAAmBf,EACrBj+F,KAAK6qD,cAAcszB,GACnBn+E,KAAKi/F,UAAU9gB,GAEnB,OAAgC,IAA5B6gB,EAAiBz+F,OACZ,CAAC,CAAE2+F,KAAM,GAAIltF,MAAO,IAGtBgtF,EAAiB1mF,IAAK4mF,IAE3B,MAAMC,EAAgBlB,EAClB,CAACiB,GACDl/F,KAAK6qD,cAAcq0C,GACjBltF,EAAQhS,KAAKo/F,aAAaD,EAAejhB,EAAWlhE,GAG1D,OAFA+hF,EAAmBr6F,KAAKC,IAAIqN,EAAO+sF,GACnC/hF,GAAUmiF,EAAc5+F,OAASu+F,EAAMv+F,OAChC,CAAE2+F,KAAMC,EAAentF,aAMhC+sF,mBAEJ,CAcAK,YAAAA,CAAaF,EAAgBhhB,GAA2C,IAEpEqH,EAF4C8Z,EAAU/+F,UAAAC,OAAA,QAAAC,IAAAF,UAAA,GAAAA,UAAA,GAAG,EACvD0R,EAAQ,EAGZ,IAAK,IAAI7G,EAAI,EAAGoY,EAAM27E,EAAK3+F,OAAQ4K,EAAIoY,EAAKpY,IAAK,CAQ/C6G,GAPYhS,KAAK4lF,gBACfsZ,EAAK/zF,GACL+yE,EACA/yE,EAAIk0F,EACJ9Z,EANa,MASFlD,YACbkD,EAAe2Z,EAAK/zF,EACtB,CACA,OAAO6G,CACT,CAQAitF,SAAAA,CAAU3zF,GACR,OAAOA,EAAMiwB,MAAMv7B,KAAKs/F,aAC1B,CAaAT,SAAAA,CACE3gB,EACAugB,EAAoB35F,GAGR,IAFZi6F,iBAAEA,EAAgBH,UAAEA,GAAyB95F,EAC7Cy6F,EAAaj/F,UAAAC,OAAA,QAAAC,IAAAF,UAAA,GAAAA,UAAA,GAAG,EAEhB,MAAMk/F,EAAkBx/F,KAAKslF,yBAC3B2Y,EAAkBj+F,KAAKi+F,gBACvB/c,EAAgB,GAChB4d,EAAQb,EAAkB,GAAK,IAEjC,IAAIrqD,EAAY,EACduqC,EAAiB,GAEjBnhE,EAAS,EACTyiF,EAAa,EACbC,GAAkB,EAEpBjB,GAAgBc,EAEhB,MAAMpc,EAAWz+E,KAAKC,IACpB85F,EACAM,EACA/+F,KAAK29F,iBAGD/3E,EAAOg5E,EAAU1gB,GAEvB,IAAI/yE,EACJ,IAFA6R,EAAS,EAEJ7R,EAAI,EAAGA,EAAIya,EAAKrlB,OAAQ4K,IAAK,CAChC,MAAM+zF,KAAEA,EAAMltF,MAAO2tF,GAAc/5E,EAAKza,GACxC6R,GAAUkiF,EAAK3+F,OAEfqzC,GAAa6rD,EAAaE,EAAYH,EAClC5rD,EAAYuvC,IAAauc,GAC3Bxe,EAAc92E,KAAK+zE,GACnBA,EAAO,GACPvqC,EAAY+rD,EACZD,GAAkB,GAElB9rD,GAAa4rD,EAGVE,GAAoBzB,GACvB9f,EAAK/zE,KAAK00F,GAEZ3gB,EAAOA,EAAKjzE,OAAOg0F,GAEnBO,EAAaxB,EACT,EACAj+F,KAAKo/F,aAAa,CAACN,GAAQ5gB,EAAWlhE,GAC1CA,IACA0iF,GAAkB,CACpB,CAUA,OARAv0F,GAAK+1E,EAAc92E,KAAK+zE,GAKpB4gB,EAAmBQ,EAAgBv/F,KAAK29F,kBAC1C39F,KAAK29F,gBAAkBoB,EAAmBS,EAAkBD,GAEvDre,CACT,CAQAgB,eAAAA,CAAgBhE,GACd,OAAKl+E,KAAK49F,UAAU1f,EAAY,IAI5Bl+E,KAAK49F,UAAU1f,EAAY,GAAGC,OAASn+E,KAAK49F,UAAU1f,GAAWC,IAKvE,CASAmE,oBAAAA,CAAqBpE,EAAmBuE,GACtC,OAAIziF,KAAKi+F,kBAAoBxb,EACpBziF,KAAKkiF,gBAAgBhE,GAAa,EAAI,EAExC,CACT,CASA8C,mBAAAA,CAAoB10B,GAClB,MAAM08B,EAAU5oF,MAAM4gF,oBAAoB10B,GACxC40B,EAAgBlhF,KAAKw+F,UAAUxV,EAAQ/H,MAAOjhF,KAAKgS,OACnDivE,EAAQ,IAAIr/E,MAAMs/E,EAAc3gF,QAClC,IAAK,IAAI4K,EAAI,EAAGA,EAAI+1E,EAAc3gF,OAAQ4K,IACxC81E,EAAM91E,GAAK+1E,EAAc/1E,GAAG2O,KAAK,IAInC,OAFAkvE,EAAQ/H,MAAQA,EAChB+H,EAAQ9H,cAAgBA,EACjB8H,CACT,CAEA4W,WAAAA,GACE,OAAOl7F,KAAKC,IAAI3E,KAAK6/F,SAAU7/F,KAAK29F,gBACtC,CAEA7K,uBAAAA,GACE,MAAMgN,EAAc,IAAI53F,IACxB,IAAK,MAAM0K,KAAQ5S,KAAK49F,UAAW,CACjC,MAAMmC,EAAa5iF,SAASvK,EAAM,IAClC,GAAI5S,KAAK6+E,WAAWkhB,GAAa,CAC/B,MAAM7hB,EAAYl+E,KAAK49F,UAAUhrF,GAAMurE,KACvC2hB,EAAYr3F,IAAI,GAAGy1E,KAAa,EAClC,CACF,CACA,IAAK,MAAMtrE,KAAQ5S,KAAKqnB,OACjBy4E,EAAY33F,IAAIyK,WACZ5S,KAAKqnB,OAAOzU,EAGzB,CAOAuH,QAAAA,GAGsD,IAApD8K,EAAwB3kB,UAAAC,OAAA,QAAAC,IAAAF,UAAA,GAAAA,UAAA,GAAG,GAC3B,OAAOF,MAAM+Z,SAAe,CAC1B,WACA,qBACG8K,GAEP,EApfAllB,EAtBW29F,GAAO,OAoCJ,WAAS39F,EApCZ29F,GAAO,uBAsCY,IAAIpC,GAAM77D,qBAAsB,UAAQ1/B,EAtC3D29F,GAAO,cAvCoD,CACtEmC,SAAU,GACVlC,gBAAiB,EACjBp3C,iBAAiB,EACjBrE,cAAc,EACdo9C,aAAc,UACdrB,iBAAiB,IA8iBnBh2F,EAAcM,SAASm1F,ICtjBhB,MAAMsC,WAAuBvtC,GAGlCE,mBAAAA,CAAoBvwD,GAClB,QAASA,EAAQsH,OAAOyY,UAAY/hB,MAAMuyD,oBAAoBvwD,EAChE,CAEA2wD,oBAAAA,GACE,OAAO,CACT,CAEAL,gBAAAA,CACEtwD,EACAoN,GAEA,MAAM9F,OAAEA,GAAWtH,GACb+f,SAAEA,EAAQuqB,MAAEA,GAAUhjC,EAC5B,IAAKyY,IAAaniB,KAAK2yD,oBAAoBvwD,GACzC,OAGF,MAAM4P,MAAEA,EAAKC,OAAEA,GAAWoY,GACxB4nC,GAAgBvoD,EAAQyY,IAEpB1S,EAAO,IAAI3D,GAAMkG,EAAOC,GAC9B,GAAIkQ,EAAS4c,mBAAoB,CAO/B,MAAO,CACLha,OANqBqG,GACrBjJ,EAASgM,8BACT3tB,EACAksC,EAAQA,EAAMzO,2BAAwBz9B,GAItCiP,OAEJ,CAAO,CAEL,MAAMwwF,EAAiB99E,EACpBgM,yBACAxf,UAAUjF,EAAO+gB,iBAAiB,GACrC,GAAIzqB,KAAK2yD,oBAAoBvwD,GAAU,CAGrC,MAAM2iB,OAAEA,EAAS,IAAIjZ,GAAOkpD,WAAEA,EAAa,IAAIlpD,IAC7C9L,KAAK4yD,gBAAgBpjD,EAASpN,IAAY,CAAA,EAC5C,MAAO,CACL2iB,OAAQA,EAAO9Y,IAAIg0F,GACnBjrC,WAAYA,EAAWzoD,SAAS0zF,GAChCxwF,OAEJ,CACE,MAAO,CACLsV,OAAQrb,EAAOykB,yBAAyBliB,IAAIg0F,GAC5CxwF,OAGN,CACF,EACD1P,EA3DYigG,GAAc,OACF,aA4DzB/3F,EAAcM,SAASy3F,IC7DhB,MAAME,WAAoBztC,GAM/BO,cAAAA,CAAcluD,EAAAyF,GAGL,IAFPb,OAAEA,GAA2D5E,GAC7D2K,KAAEA,GAAqDlF,EAEvD,OAAO,IAAIuB,GAAMpC,EAAOsI,OAASvC,EAAKzD,EAAGtC,EAAOuI,QAAUxC,EAAK1D,EACjE,EACDhM,EAZYmgG,GAAW,OACC,SAazBj4F,EAAcM,SAAS23F,ICVhB,MAAMC,WAAqC3sC,GAChDmB,gBAAAA,CACEvyD,GAEA,MAAMiyE,EAAkBjyE,EAAQsH,OAChBtH,EAAQsyD,QAAQrzD,OAAO,CAAC++F,EAAS12F,KAC/CA,EAAOkoC,QAAUwuD,EAAQn0F,IAAIvC,EAAOkoC,QAC7BwuD,GACN,IAAIC,KACCt/F,QAAS6wC,IACfA,EAAOijB,cAAcF,iBAAiB,CACpCjrD,OAAQkoC,EACR8iB,QAAS,CAAC2f,MAGhB,CAKA5f,kBAAAA,CACEryD,GAEA,MAAMiyE,EAAkBjyE,EAAQsH,OAC1B42F,EAAkBjsB,EAAgBnkE,aACxB9N,EAAQsyD,QAAQrzD,OAAO,CAAC++F,EAAS12F,KAC/CA,EAAOkoC,QAAUwuD,EAAQn0F,IAAIvC,EAAOkoC,QAC7BwuD,GACN,IAAIC,KACCt/F,QAAS6wC,KACd0uD,EAAgBzvF,KAAMxB,GAAWA,EAAOuiC,SAAWA,IAClDA,EAAOijB,cAAcJ,mBAAmB,CACtC/qD,OAAQkoC,EACR8iB,QAAS,CAAC2f,MAGlB,ECjBK,MAAMksB,WAAwBhrC,GAKnC,kBAAOp2C,GACL,MAAO,IAAK/e,MAAM+e,iBAAkBohF,GAAgBnhF,YACtD,CAiBAtf,WAAAA,GAGE,IAFA0P,EAAuBlP,UAAAC,OAAA,QAAAC,IAAAF,UAAA,GAAAA,UAAA,GAAG,GAC1B4B,EAAwC5B,UAAAC,OAAA,QAAAC,IAAAF,UAAA,GAAAA,UAAA,GAAG,CAAA,EAE3CF,QACAK,OAAOC,OAAOV,KAAMugG,GAAgBnhF,aACpCpf,KAAK8vC,WAAW5tC,GAChB,MAAM4P,KAAEA,EAAIC,IAAEA,EAAG8iD,cAAEA,GAAkB3yD,EACrClC,KAAKw1D,UAAUhmD,EAAS,CACtBsC,OACAC,MACA8iD,cAAeA,QAAAA,EAAiB,IAAIsrC,IAExC,CAKA/pC,sBAAAA,GACE,OAAO,CACT,CAMAT,wBAAAA,GACE,CAOF+e,cAAAA,GAA2C,IAAA,IAAAhzE,EAAApB,UAAAC,OAAzBm0D,EAAO,IAAA9yD,MAAAF,GAAAG,EAAA,EAAAA,EAAAH,EAAAG,IAAP6yD,EAAO7yD,GAAAvB,UAAAuB,GACa,oBAAhC7B,KAAKwgG,uBACPxgG,KAAKiM,OAAOyoD,GAIZA,EAAQ3zD,QAAS2I,IACf,MAAMV,EAAQhJ,KAAKgP,SAASyxF,UAAW3vF,GAAQA,EAAI0mC,YAAY9tC,IACzDgG,GACM,IAAV1G,EAEIhJ,KAAKyP,OACLzG,EACNhJ,KAAK0P,SAASA,EAAUhG,IAG9B,CAKAosD,aAAAA,CAAczmD,GACZ,OACErP,KAAKkQ,aAAaW,KACfP,GAAMA,EAAEsmC,eAAevnC,IAAWA,EAAOunC,eAAetmC,KAI3D9O,EACE,QACA,sFAEK,GAGFpB,MAAM01D,cAAczmD,EAC7B,CASAwmD,UAAAA,CAAWxmD,EAAsB6mD,GAI3B7mD,EAAOuiC,QAAUviC,EAAOuiC,SAAWviC,EAAOq9B,MAG5Cr9B,EAAOuiC,OAAOklB,WAAWznD,GAEhBA,EAAOq9B,OAASr9B,EAAOuiC,SAAWviC,EAAOq9B,OAElDr9B,EAAOq9B,MAAM3jC,OAAOsG,GAKtBrP,KAAK42D,YAAYvnD,EAAQ6mD,EAC3B,CAQAC,SAAAA,CAAU9mD,EAAsB6mD,GAC9Bl2D,KAAK82D,WAAWznD,EAAQ6mD,GAExB7mD,EAAOuiC,QAAUviC,EAAOuiC,OAAOglB,YAAYvnD,GAAQ,EACrD,CAOA4mD,qBAAAA,CAAsBvtD,EAA2BgsD,GAC/Ct0D,MAAM61D,sBAAsBvtD,EAAMgsD,GAClC,MAAMgsC,EAAS,IAAIL,IACnB3rC,EAAQ3zD,QAASsO,IACf,MAAMuiC,OAAEA,GAAWviC,EACnBuiC,GAAU8uD,EAAOz0F,IAAI2lC,KAEnBlpC,IAASqpD,GAEX2uC,EAAO3/F,QAAS2rC,IACdA,EAAMupB,sBAAsBnE,GAAmB4C,KAIjDgsC,EAAO3/F,QAAS2rC,IACdA,EAAM55B,KAAK,SAAS,IAG1B,CAKAiyC,UAAAA,GAEE,OADA/kD,KAAKs2D,aACE,CACT,CAMAzoD,QAAAA,GACE,MAAO,uBAAuB7N,KAAK+Q,gBACrC,CAMA0R,WAAAA,GACE,OAAO,CACT,CAMAkwB,UAAAA,GACE,OAAO,CACT,CAQAoR,eAAAA,CACEpoC,EACA89B,EACAknD,GAEAhlF,EAAI2G,OACJ3G,EAAI83B,YAAczzC,KAAKqkD,SAAWrkD,KAAKskD,wBAA0B,EACjE,MAAMpiD,EAAU,CACdygD,aAAa,KACVg+C,EACHn8C,oBAAoB,GAEtB,IAAK,IAAIr5C,EAAI,EAAGA,EAAInL,KAAKgP,SAASzO,OAAQ4K,IACxCnL,KAAKgP,SAAS7D,GAAG44C,gBAAgBpoC,EAAKzZ,GAExC9B,MAAM2jD,gBAAgBpoC,EAAK89B,GAC3B99B,EAAI6G,SACN,EACDziB,EAvNYwgG,GAAe,OACZ,mBAAiBxgG,EADpBwgG,GAAe,cAf1B,CACEC,uBAAwB,oBAuO5Bv4F,EAAcM,SAASg4F,IACvBt4F,EAAcM,SAASg4F,GAAiB,mBCvPjC,MAAMK,GAAsB9gG,WAAAA,GACjCC,EAAAC,KAAA,YAOgC,GAAE,CAYlC6gG,YAAAA,CACEC,EACAC,EACAC,EACAC,EACAh/C,GAEA,MAAMtmC,EAAMsmC,EAAa7+C,WAAW,KAAM,CACxC4nE,oBAAoB,EACpBk2B,gBAAgB,IAElB,IAAKvlF,EACH,OAEFA,EAAIwH,UAAU49E,EAAe,EAAG,EAAGC,EAAaC,GAChD,MAEME,EAAkC,CACtCH,cACAC,eACAG,UALgBzlF,EAAIorC,aAAa,EAAG,EAAGi6C,EAAaC,GAMpDI,WAAYN,EACZO,kBANwB3lF,EAAIorC,aAAa,EAAG,EAAGi6C,EAAaC,GAO5DltF,SAAUkuC,EACVtmC,MACA4lF,cAAevhG,MAEjB8gG,EAAQ//F,QAASyI,IACfA,EAAOg4F,QAAQL,KAEjB,MAAQC,UAAWK,GAAwBN,EAS3C,OAPEM,EAAoBzvF,QAAUgvF,GAC9BS,EAAoBxvF,SAAWgvF,IAE/Bh/C,EAAajwC,MAAQyvF,EAAoBzvF,MACzCiwC,EAAahwC,OAASwvF,EAAoBxvF,QAE5C0J,EAAI+lF,aAAaD,EAAqB,EAAG,GAClCN,CACT,ECxDK,MAAMQ,GA6CX7hG,WAAAA,GAAoD,IAAxC8hG,SAAEA,EAAWzhG,EAAO0D,aAAavD,UAAAC,OAAA,QAAAC,IAAAF,UAAA,GAAAA,UAAA,GAAG,CAAA,EA1ChDP,EAAAC,KAAA,YAG0B,IAAI6hG,aAAa,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,KA8BjE9hG,EAAAC,KAAA,YAOgC,IAG9BA,KAAK4hG,SAAWA,EAChB5hG,KAAK8hG,eAAeF,EAAUA,GAC9B5hG,KAAK+hG,gBACP,CAKAD,cAAAA,CAAe9vF,EAAeC,GAC5BjS,KAAKqE,UACLrE,KAAKgiG,kBAAkBhwF,EAAOC,EAChC,CAMA+vF,iBAAAA,CAAkBhwF,EAAeC,GAC/B,MAAM9O,EAASyQ,GAAuB,CAAE5B,QAAOC,WAQ7CzP,EAAKW,EAAOC,WAAW,QAPP,CACd82B,OAAO,EACP+nE,oBAAoB,EACpBC,OAAO,EACPC,SAAS,EACTC,WAAW,IAIV5/F,IAGLA,EAAG6/F,WAAW,EAAG,EAAG,EAAG,GAEvBriG,KAAKmD,OAASA,EACdnD,KAAKwC,GAAKA,EACZ,CAcAq+F,YAAAA,CACEC,EACA1nF,EACApH,EACAC,EACAgwC,EACA78C,GAEA,MAAM5C,EAAKxC,KAAKwC,GACVmZ,EAAMsmC,EAAa7+C,WAAW,MACpC,IAAKZ,IAAOmZ,EACV,OAEF,IAAI2mF,EACAl9F,IACFk9F,EAAgBtiG,KAAKuiG,iBAAiBn9F,EAAUgU,IAElD,MAAM+nF,EAAqC,CACzCz4E,cACGtP,EAA4BpH,OAC5BoH,EAA4B4+D,cAC7B,EACFrvD,eACGvP,EAA4BnH,QAC5BmH,EAA4B6+D,eAC7B,EACF+oB,YAAahvF,EACbivF,aAAchvF,EACduwF,iBAAkBxwF,EAClBywF,kBAAmBxwF,EACnB7P,QAASI,EACTkgG,cAAe1iG,KAAK2iG,cAClBngG,EACAwP,EACAC,EACCqwF,OAAyB9hG,EAAT4Y,GAEnBwpF,cAAe5iG,KAAK2iG,cAAcngG,EAAIwP,EAAOC,GAC7C4wF,gBACEP,GACAtiG,KAAK2iG,cACHngG,EACAwP,EACAC,EACCqwF,OAAyB9hG,EAAT4Y,GAErB0pF,OAAQhC,EAAQvgG,OAChBwiG,OAAO,EACPC,UAAWhjG,KAAKgjG,UAChBC,aAAcjjG,KAAKijG,aACnBC,KAAM,EACN3B,cAAevhG,KACfiiD,aAAcA,GAEVkhD,EAAU3gG,EAAG4gG,oBAYnB,OAXA5gG,EAAG6gG,gBAAgB7gG,EAAG8gG,YAAaH,GACnCrC,EAAQ//F,QAASyI,IACfA,GAAUA,EAAOg4F,QAAQL,KAkP/B,SAA8BA,GAC5B,MAAMl/C,EAAek/C,EAAcl/C,aACjCjwC,EAAQiwC,EAAajwC,MACrBC,EAASgwC,EAAahwC,OACtBsxF,EAASpC,EAAcqB,iBACvBgB,EAAUrC,EAAcsB,kBAEtBzwF,IAAUuxF,GAAUtxF,IAAWuxF,IACjCvhD,EAAajwC,MAAQuxF,EACrBthD,EAAahwC,OAASuxF,EAE1B,CA3PIC,CAAqBtC,GACrBnhG,KAAK0jG,WAAWlhG,EAAI2+F,GACpB3+F,EAAGmhG,YAAYnhG,EAAGohG,WAAY,MAC9BphG,EAAGqhG,cAAc1C,EAAcuB,eAC/BlgG,EAAGqhG,cAAc1C,EAAcyB,eAC/BpgG,EAAGshG,kBAAkBX,GACrBxnF,EAAIs1B,aAAa,EAAG,EAAG,EAAG,EAAG,EAAG,GACzBkwD,CACT,CAKA98F,OAAAA,GACMrE,KAAKmD,SAIPnD,KAAKmD,OAAS,KAEdnD,KAAKwC,GAAK,MAEZxC,KAAK+jG,kBACP,CAKAA,gBAAAA,GACE/jG,KAAKijG,aAAe,CAAA,EACpBjjG,KAAKgkG,aAAe,CAAA,CACtB,CAeArB,aAAAA,CACEngG,EACAwP,EACAC,EACAgyF,EACAz6F,GAIA,MAAM06F,QACJA,EAAON,WACPA,EAAUO,KACVA,EAAIC,cACJA,EAAaC,cACbA,EAAaC,mBACbA,EAAkBC,mBAClBA,EAAkBC,eAClBA,EAAcC,eACdA,GACEjiG,EACEkiG,EAAUliG,EAAGmgG,gBA8BnB,OA7BAngG,EAAGmhG,YAAYC,EAAYc,GAC3BliG,EAAGmiG,cAAcf,EAAYU,EAAoB96F,GAAU06F,GAC3D1hG,EAAGmiG,cAAcf,EAAYW,EAAoB/6F,GAAU06F,GAC3D1hG,EAAGmiG,cAAcf,EAAYY,EAAgBH,GAC7C7hG,EAAGmiG,cAAcf,EAAYa,EAAgBJ,GACzCJ,EACFzhG,EAAGoiG,WACDhB,EACA,EACAO,EACAA,EACAC,EACAH,GAGFzhG,EAAGoiG,WACDhB,EACA,EACAO,EACAnyF,EACAC,EACA,EACAkyF,EACAC,EACA,MAKGM,CACT,CAWAnC,gBAAAA,CACEsC,EACAZ,EACAz6F,GAIA,MAAMw6F,aAAEA,GAAiBhkG,KACzB,GAAIgkG,EAAaa,GACf,OAAOb,EAAaa,GACf,CACL,MAAMH,EAAU1kG,KAAK2iG,cACnB3iG,KAAKwC,GACJyhG,EAAwCjyF,MACxCiyF,EAAwChyF,OACzCgyF,EACAz6F,GAKF,OAHIk7F,IACFV,EAAaa,GAAYH,GAEpBA,CACT,CACF,CAQAI,iBAAAA,CAAkB1/F,GACZpF,KAAKgkG,aAAa5+F,KACpBpF,KAAKwC,GAAGqhG,cAAc7jG,KAAKgkG,aAAa5+F,WACjCpF,KAAKgkG,aAAa5+F,GAE7B,CAWAs+F,UAAAA,CAAWlhG,EAA2B2+F,GACpC,MAAM4D,EAAWviG,EAAGW,OAClB8+C,EAAek/C,EAAcl/C,aAC7BtmC,EAAMsmC,EAAa7+C,WAAW,MAChC,IAAKuY,EACH,OAEFA,EAAIy1B,UAAU,EAAG6Q,EAAahwC,QAC9B0J,EAAIG,MAAM,GAAG,GAEb,MAAMkpF,EAAUD,EAAS9yF,OAASgwC,EAAahwC,OAC/C0J,EAAIwH,UACF4hF,EACA,EACAC,EACA/iD,EAAajwC,MACbiwC,EAAahwC,OACb,EACA,EACAgwC,EAAajwC,MACbiwC,EAAahwC,OAEjB,CAUAgzF,sBAAAA,CAEEziG,EACA2+F,GAEA,MACExlF,EADmBwlF,EAAcl/C,aACd7+C,WAAW,MAC9BmgG,EAASpC,EAAcqB,iBACvBgB,EAAUrC,EAAcsB,kBACxByC,EAAW3B,EAASC,EAAU,EAChC,IAAK7nF,EACH,OAEF,MAAMwpF,EAAK,IAAIC,WAAWplG,KAAKqlG,YAAa,EAAGH,GACzCI,EAAY,IAAIC,kBAAkBvlG,KAAKqlG,YAAa,EAAGH,GAE7D1iG,EAAGgjG,WAAW,EAAG,EAAGjC,EAAQC,EAAShhG,EAAG2hG,KAAM3hG,EAAG4hG,cAAee,GAChE,MAAMM,EAAU,IAAIC,UAAUJ,EAAW/B,EAAQC,GACjD7nF,EAAI+lF,aAAa+D,EAAS,EAAG,EAC/B,CASA1D,cAAAA,GACE,GAAI/hG,KAAK2lG,QACP,OAAO3lG,KAAK2lG,QAEd,MAAMnjG,EAAKxC,KAAKwC,GACdmjG,EAAU,CAAEC,SAAU,GAAIC,OAAQ,IACpC,IAAKrjG,EACH,OAAOmjG,EAET,MAAMG,EAAMtjG,EAAGkB,aAAa,6BAC5B,GAAIoiG,EAAK,CACP,MAAMF,EAAWpjG,EAAGc,aAAawiG,EAAIC,yBAC/BF,EAASrjG,EAAGc,aAAawiG,EAAIE,uBAC/BJ,IACFD,EAAQC,SAAWA,EAAS3gG,eAE1B4gG,IACFF,EAAQE,OAASA,EAAO5gG,cAE5B,CAEA,OADAjF,KAAK2lG,QAAUA,EACRA,CACT,ECzYF,IAAIpE,GAKG,SAAS0E,KACd,MAAM3jG,WAAEA,GAAe0B,IAEvB,OADA1B,EAAWY,WAAWsQ,MAClBrT,EAAO+lG,mBAAqB5jG,EAAWsB,YAAYzD,EAAO0D,aACrD,IAAI89F,GAAmB,CAAEC,SAAUzhG,EAAO0D,cAE1C,IAAI+8F,EAEf,CAOO,SAASuF,KAId,OAHK5E,OADgCjhG,UAAAC,OAAA,QAAAC,IAAAF,UAAA,KAAAA,UAAA,MAEnCihG,GAAgB0E,MAEX1E,EACT,CCkBO,MAoBD6E,GAAc,CAAC,QAAS,SAKvB,MAAMC,WAKHz2D,GAgGR,kBAAOzwB,GACL,MAAO,IACF/e,MAAM+e,iBACNknF,GAAYjnF,YAEnB,CAYAtf,WAAAA,CAAYgK,EAA4B5H,GACtC9B,QAtGFL,qBAMwB,GAExBA,qBAMwB,GAExBA,yBAK4B,GAE5BA,yBAK4B,GA2E1BC,KAAK8gG,QAAU,GACfrgG,OAAOC,OAAOV,KAAMqmG,GAAYjnF,aAChCpf,KAAK8vC,WAAW5tC,GAChBlC,KAAKoF,SAAW,UAAUmO,OAC1BvT,KAAKsmG,WACa,iBAATx8F,GAEA9J,KAAKmD,QAAUsX,GAAuBza,KAAKmD,OAAO2d,eACnDxc,KACAgY,eAAexS,GACjBA,EACJ5H,EAEJ,CAKA4e,UAAAA,GACE,OAAO9gB,KAAKumG,QACd,CASAD,UAAAA,CAAW7yF,GAAiD,IAA3BhE,EAAoBnP,UAAAC,OAAA,QAAAC,IAAAF,UAAA,GAAAA,UAAA,GAAG,CAAA,EACtDN,KAAKwmG,cAAcxmG,KAAKoF,UACxBpF,KAAKwmG,cAAc,GAAGxmG,KAAKoF,qBAC3BpF,KAAKumG,SAAW9yF,EAChBzT,KAAKymG,iBAAmBhzF,EACxBzT,KAAK27E,gBAAgBlsE,GACO,IAAxBzP,KAAK8gG,QAAQvgG,QACfP,KAAK6gG,eAMH7gG,KAAK0mG,cACP1mG,KAAK2mG,oBAET,CAKAH,aAAAA,CAAcjlG,GACZ,MAAMqlG,EAAUT,IAAiB,GAC7BS,aAAmBjF,IACrBiF,EAAQ9B,kBAAkBvjG,EAE9B,CAKA8C,OAAAA,GACEjE,MAAMiE,UACNrE,KAAKwmG,cAAcxmG,KAAKoF,UACxBpF,KAAKwmG,cAAc,GAAGxmG,KAAKoF,qBAC3BpF,KAAKgwC,cAAgB,KAEnB,CAAC,mBAAoB,WAAY,cAAe,gBAChDjvC,QAAS8lG,IACT,MAAMxrF,EAAKrb,KAAK6mG,GAChBxrF,GAAMrX,IAASK,QAAQgX,GAEvBrb,KAAK6mG,QAAcrmG,GAEvB,CAKAsmG,cAAAA,GACE,OACE9mG,KAAKymG,mBACHzmG,KAAKymG,iBAAyBlvF,aAAe,KAEnD,CAKAwvF,eAAAA,GACE,MAAMtzF,EAAUzT,KAAK8gB,aACrB,OAAKrN,EAME,CACLzB,MAAOyB,EAAQukE,cAAgBvkE,EAAQzB,MACvCC,OAAQwB,EAAQwkE,eAAiBxkE,EAAQxB,QAPlC,CACLD,MAAO,EACPC,OAAQ,EAOd,CAMA+0F,OAAAA,CAAQrrF,GACN,IAAK3b,KAAK49B,QAA+B,IAArB59B,KAAKo9B,YACvB,OAEF,MAAMkR,EAAItuC,KAAKgS,MAAQ,EACrBqmB,EAAIr4B,KAAKiS,OAAS,EACpB0J,EAAIkI,YACJlI,EAAImI,QAAQwqB,GAAIjW,GAChB1c,EAAIoI,OAAOuqB,GAAIjW,GACf1c,EAAIoI,OAAOuqB,EAAGjW,GACd1c,EAAIoI,QAAQuqB,EAAGjW,GACf1c,EAAIoI,QAAQuqB,GAAIjW,GAChB1c,EAAIqI,WACN,CAOA7J,QAAAA,GAGsD,IAApD8K,EAAwB3kB,UAAAC,OAAA,QAAAC,IAAAF,UAAA,GAAAA,UAAA,GAAG,GAC3B,MAAMwgG,EAAiC,GAIvC,OAHA9gG,KAAK8gG,QAAQ//F,QAASkmG,IACpBA,GAAanG,EAAQ12F,KAAK68F,EAAU9sF,cAE/B,IACF/Z,MAAM+Z,SAAS,IAAIisF,MAAgBnhF,IACtCrN,IAAK5X,KAAKknG,SACV3vF,YAAavX,KAAK8mG,iBAClBhG,aACI9gG,KAAK0mG,aACL,CAAEA,aAAc1mG,KAAK0mG,aAAavsF,YAClC,CAAA,EAER,CAMAgtF,OAAAA,GACE,QACInnG,KAAKwiE,SACLxiE,KAAKyiE,OACPziE,KAAKgS,MAAQhS,KAAKumG,SAASv0F,OAC3BhS,KAAKiS,OAASjS,KAAKumG,SAASt0F,MAEhC,CAOAisB,MAAAA,GACE,MAAMkpE,EAAwB,GAC5B3zF,EAAUzT,KAAKumG,SACfv6F,GAAKhM,KAAKgS,MAAQ,EAClBjG,GAAK/L,KAAKiS,OAAS,EACrB,IAAIwlD,EAAsB,GACxB4vC,EAAsB,GACtBllF,EAAW,GACXmlF,EAAiB,GACnB,IAAK7zF,EACH,MAAO,GAET,GAAIzT,KAAKmnG,UAAW,CAClB,MAAM9gF,EAAa9S,KACnBkkD,EAAUrtD,KACR,2BAA6Bic,EAAa,OAC1C,cACEra,EACA,QACAD,EACA,YACA/L,KAAKgS,MACL,aACAhS,KAAKiS,OACL,SACF,iBAEFkQ,EAAW,8BAAgCkE,EAAa,KAC1D,CAmBA,GAlBKrmB,KAAKunG,iBACRD,EAAiB,oCAEnBF,EAAYh9F,KACV,YACA,eACA,eAAepK,KAAKwnG,WAAU,UAAax7F,EAAIhM,KAAKwiE,aAClDz2D,EAAI/L,KAAKyiE,iBAKThvD,EAAQzB,OAAUyB,EAA6BukE,yBAE/CvkE,EAAQxB,QAAWwB,EAA6BwkE,iBAC9CqvB,IAAiBnlF,gBAGnBniB,KAAK49B,QAAU59B,KAAKq9B,gBAAiB,CACvC,MAAMoqE,EAAWznG,KAAK0jB,KACtB1jB,KAAK0jB,KAAO,KACZ2jF,EAAY,CACV,cAAcr7F,SAASD,aAAa/L,KAAKgS,kBACvChS,KAAKiS,kBACKjS,KAAKi9B,wBAEnBj9B,KAAK0jB,KAAO+jF,CACd,CAMA,OAJEhwC,EADEz3D,KAAKk/B,aAAet3B,EACV6vD,EAAUvsD,OAAOm8F,EAAWD,GAE5B3vC,EAAUvsD,OAAOk8F,EAAaC,GAErC5vC,CACT,CAOAyvC,MAAAA,CAAOQ,GACL,MAAMj0F,EAAUi0F,EAAW1nG,KAAKumG,SAAWvmG,KAAKymG,iBAChD,OAAIhzF,EACGA,EAA8BK,UACzBL,EAA8BK,YAGpC9T,KAAK2nG,iBACAl0F,EAAQ25C,aAAa,QAAU,GAE9B35C,EAA6BmE,IAGhC5X,KAAK4X,KAAO,EAEvB,CAOA4vF,SAAAA,CAAUE,GACR,OAAO1nG,KAAKknG,OAAOQ,EACrB,CAQAE,MAAAA,CAAOhwF,GAA6D,IAAhDL,YAAEA,EAAWD,OAAEA,GAA0BhX,UAAAC,OAAA,QAAAC,IAAAF,UAAA,GAAAA,UAAA,GAAG,CAAA,EAC9D,OAAO8W,GAAUQ,EAAK,CAAEL,cAAaD,WAAUkB,KAAMd,SAC5B,IAAhBH,GAA+BvX,KAAKyI,IAAI,CAAE8O,gBACjDvX,KAAKsmG,WAAW5uF,IAEpB,CAMA7J,QAAAA,GACE,MAAO,oBAAoB7N,KAAKknG,cAClC,CAEAP,kBAAAA,GACE,MAAMn9F,EAASxJ,KAAK0mG,aAClBmB,EAAe7nG,KAAK8nG,oBACpBp3D,EAAc1wC,KAAK2wC,wBACnB96B,EAAS66B,EAAY1kC,EACrB8J,EAAS46B,EAAY3kC,EACrBg8F,EAAkB/nG,KAAKgoG,aAAehoG,KAAKymG,iBAI7C,GAHIzmG,KAAK0sC,OACP1sC,KAAKyI,IAAI,SAAS,IAEfe,GAAWqM,EAASgyF,GAAgB/xF,EAAS+xF,EAMhD,OALA7nG,KAAKumG,SAAWwB,EAChB/nG,KAAKioG,gBAAkB,EACvBjoG,KAAKkoG,gBAAkB,EACvBloG,KAAKmoG,YAActyF,OACnB7V,KAAKooG,YAActyF,GAGrB,MAAM/B,EAAWH,GAAuBm0F,IACtC/1F,MAAEA,EAAKC,OAAEA,GAAW81F,EACtB/nG,KAAKumG,SAAWxyF,EAChB/T,KAAKmoG,YAAc3+F,EAAOqM,OAASA,EACnC7V,KAAKooG,YAAc5+F,EAAOsM,OAASA,EACnCqwF,KAAmBtF,aACjB,CAACr3F,GACDu+F,EACA/1F,EACAC,EACAjS,KAAKumG,UAEPvmG,KAAKioG,gBAAkBl0F,EAAS/B,MAAQhS,KAAKymG,iBAAiBz0F,MAC9DhS,KAAKkoG,gBAAkBn0F,EAAS9B,OAASjS,KAAKymG,iBAAiBx0F,MACjE,CAOA4uF,YAAAA,GAEE,IADAC,EAAkDxgG,UAAAC,eAAAC,IAAAF,UAAA,GAAAA,UAAA,GAAGN,KAAK8gG,SAAW,GAQrE,GANAA,EAAUA,EAAQt3F,OAAQA,GAAWA,IAAWA,EAAO6+F,kBACvDroG,KAAKyI,IAAI,SAAS,GAGlBzI,KAAKwmG,cAAc,GAAGxmG,KAAKoF,qBAEJ,IAAnB07F,EAAQvgG,OAMV,OALAP,KAAKumG,SAAWvmG,KAAKymG,iBAErBzmG,KAAKgoG,iBAAcxnG,EACnBR,KAAKioG,gBAAkB,OACvBjoG,KAAKkoG,gBAAkB,GAIzB,MAAMI,EAAatoG,KAAKymG,iBACtBzF,EACGsH,EAAgCtwB,cAAgBswB,EAAWt2F,MAC9DivF,EACGqH,EAAgCrwB,eAAiBqwB,EAAWr2F,OAEjE,GAAIjS,KAAKumG,WAAavmG,KAAKymG,iBAAkB,CAG3C,MAAM1yF,EAAWH,GAAuB,CACtC5B,MAAOgvF,EACP/uF,OAAQgvF,IAEVjhG,KAAKumG,SAAWxyF,EAChB/T,KAAKgoG,YAAcj0F,CACrB,MAAW/T,KAAKgoG,cAKdhoG,KAAKumG,SAAWvmG,KAAKgoG,YACrBhoG,KAAKgoG,YACF5kG,WAAW,MACX4d,UAAU,EAAG,EAAGggF,EAAaC,GAEhCjhG,KAAKmoG,YAAc,EACnBnoG,KAAKooG,YAAc,GAErBjC,KAAmBtF,aACjBC,EACA9gG,KAAKymG,iBACLzF,EACAC,EACAjhG,KAAKumG,SACLvmG,KAAKoF,UAGLpF,KAAKymG,iBAAiBz0F,QAAUhS,KAAKumG,SAASv0F,OAC9ChS,KAAKymG,iBAAiBx0F,SAAWjS,KAAKumG,SAASt0F,SAE/CjS,KAAKioG,gBAAkBjoG,KAAKumG,SAASv0F,MAAQhS,KAAKymG,iBAAiBz0F,MACnEhS,KAAKkoG,gBACHloG,KAAKumG,SAASt0F,OAASjS,KAAKymG,iBAAiBx0F,OAEnD,CAMAihC,OAAAA,CAAQv3B,GACNA,EAAI8C,sBAAwBze,KAAKunG,gBACX,IAAlBvnG,KAAKqkD,UAAqBrkD,KAAK0mG,cAAgB1mG,KAAKuoG,gBACtDvoG,KAAK2mG,qBAEP3mG,KAAKgnG,QAAQrrF,GACb3b,KAAKm1C,oBAAoBx5B,EAC3B,CAOAu2B,iBAAAA,CAEEv2B,GAEAA,EAAI8C,sBAAwBze,KAAKunG,eACjCnnG,MAAM8xC,kBAAkBv2B,EAC1B,CAaA8G,WAAAA,GACE,OAAOziB,KAAKyyC,kBACd,CAEA4C,WAAAA,CAAY15B,GACV,MAAM6sF,EAAgBxoG,KAAKumG,SAC3B,IAAKiC,EACH,OAEF,MAAM3yF,EAAS7V,KAAKioG,gBAClBnyF,EAAS9V,KAAKkoG,gBACd55D,EAAItuC,KAAKgS,MACTqmB,EAAIr4B,KAAKiS,OAETuwD,EAAQ99D,KAAKC,IAAI3E,KAAKwiE,MAAO,GAC7BC,EAAQ/9D,KAAKC,IAAI3E,KAAKyiE,MAAO,GAC7BgmC,EACGD,EAAmCxwB,cAAgBwwB,EAAcx2F,MACpE02F,EACGF,EAAmCvwB,eACpCuwB,EAAcv2F,OAChB02F,EAAKnmC,EAAQ3sD,EACb+yF,EAAKnmC,EAAQ3sD,EAEb+yF,EAAKnkG,KAAK8I,IAAI8gC,EAAIz4B,EAAQ4yF,EAAUE,GACpCG,EAAKpkG,KAAK8I,IAAI6qB,EAAIviB,EAAQ4yF,EAAWE,GACrC58F,GAAKsiC,EAAI,EACTviC,GAAKssB,EAAI,EACT0wE,EAAWrkG,KAAK8I,IAAI8gC,EAAGm6D,EAAU5yF,EAAS2sD,GAC1CwmC,EAAWtkG,KAAK8I,IAAI6qB,EAAGqwE,EAAW5yF,EAAS2sD,GAE7C+lC,GACE7sF,EAAIwH,UAAUqlF,EAAeG,EAAIC,EAAIC,EAAIC,EAAI98F,EAAGD,EAAGg9F,EAAUC,EACjE,CAMAT,YAAAA,GACE,MAAMzsF,EAAQ9b,KAAK2wC,wBACnB,OAAO70B,EAAM9P,IAAMhM,KAAKmoG,aAAersF,EAAM/P,IAAM/L,KAAKooG,WAC1D,CAMAa,iBAAAA,GACEjpG,KAAKyI,IAAIzI,KAAK+mG,kBAChB,CAOAprB,eAAAA,GAAwD,IAAxC3pE,MAAEA,EAAKC,OAAEA,GAAwB3R,UAAAC,OAAA,QAAAC,IAAAF,UAAA,GAAAA,UAAA,GAAG,CAAA,EAClD,MAAMmP,EAAOzP,KAAK+mG,kBAClB/mG,KAAKgS,MAAQA,GAASvC,EAAKuC,MAC3BhS,KAAKiS,OAASA,GAAUxC,EAAKwC,MAC/B,CAOAiqB,iCAAAA,GACE,MAAMgtE,EAAMhtE,GACRl8B,KAAKmpG,qBAAuB,IAE9BC,EAASppG,KAAKgS,MACdq3F,EAAUrpG,KAAKiS,OACfsnE,EAAmB,CAAEvnE,MAAOo3F,EAAQn3F,OAAQo3F,GAC9C,IAQErsF,EAREssF,EAAStpG,KAAKumG,SAASv0F,MACzBu3F,EAAUvpG,KAAKumG,SAASt0F,OACxB4D,EAAS,EACTC,EAAS,EACT4sD,EAAa,EACbC,EAAY,EACZH,EAAQ,EACRC,EAAQ,EA4CV,OAzCIymC,GAAQA,EAAI3sE,SAAW31B,GAAQsiG,EAAI1sE,SAAW51B,GAsChDiP,EAASuzF,EAASE,EAClBxzF,EAASuzF,EAAUE,IAtCK,SAApBL,EAAIxsE,cACN7mB,EAASC,EAASkiD,GAAeh4D,KAAKumG,SAAUhtB,GAChDv8D,GAAUosF,EAASE,EAASzzF,GAAU,EACnB,QAAfqzF,EAAI3sE,SACNmmC,GAAc1lD,GAEG,QAAfksF,EAAI3sE,SACNmmC,EAAa1lD,GAEfA,GAAUqsF,EAAUE,EAAUzzF,GAAU,EACrB,QAAfozF,EAAI1sE,SACNmmC,GAAa3lD,GAEI,QAAfksF,EAAI1sE,SACNmmC,EAAY3lD,IAGQ,UAApBksF,EAAIxsE,cACN7mB,EAASC,EAASoiD,GAAiBl4D,KAAKumG,SAAUhtB,GAClDv8D,EAASssF,EAASF,EAASvzF,EACR,QAAfqzF,EAAI3sE,SACNimC,EAAQxlD,EAAS,GAEA,QAAfksF,EAAI3sE,SACNimC,EAAQxlD,GAEVA,EAASusF,EAAUF,EAAUvzF,EACV,QAAfozF,EAAI1sE,SACNimC,EAAQzlD,EAAS,GAEA,QAAfksF,EAAI1sE,SACNimC,EAAQzlD,GAEVssF,EAASF,EAASvzF,EAClB0zF,EAAUF,EAAUvzF,IAMjB,CACL9D,MAAOs3F,EACPr3F,OAAQs3F,EACR1zF,SACAC,SACA4sD,aACAC,YACAH,QACAC,QAEJ,CA0BA,iBAAOlqD,CAAUzT,EAEf5C,GACA,IAFE4+F,QAAS0I,EAAG9C,aAAc+C,EAAE7xF,IAAEA,EAAGL,YAAEA,EAAW7O,KAAEA,KAAS2G,GAAWvK,EAGtE,OAAOqP,QAAQkE,IAAI,CACjBjB,GAAUQ,EAAM,IAAK1V,EAASqV,gBAC9BiyF,GAAKtxF,GAAmCsxF,EAAGtnG,GAE3CunG,EAAKvxF,GAAuB,CAACuxF,GAAKvnG,GAAW,GAC7C4W,GAAwBzJ,EAAQnN,KAC/BsW,KAAKjO,IAA4D,IAA1D8Q,EAAIylF,EAAU,IAAK4F,GAAegD,EAAgB,CAAA,GAAGn/F,EAC7D,OAAO,IAAIvK,KAAKqb,EAAI,IACfhM,EAEHuI,MACAkpF,UACA4F,kBACGgD,KAGT,CAQA,cAAOC,CACLtyF,GAGsB,IAFtBE,YAAEA,EAAc,KAAID,OAAEA,GAA0BhX,UAAAC,OAAA,QAAAC,IAAAF,UAAA,GAAAA,UAAA,GAAG,CAAA,EACnDspG,EAAgBtpG,UAAAC,OAAA,EAAAD,kBAAAE,EAEhB,OAAO4W,GAAUC,EAAK,CAAEE,cAAaD,WAAUkB,KAC5Cd,GAAQ,IAAI1X,KAAK0X,EAAKkyF,GAE3B,CASA,wBAAan4C,CACXh+C,GAGA,IAFAvR,EAAkB5B,UAAAC,OAAA,QAAAC,IAAAF,UAAA,GAAAA,UAAA,GAAG,CAAA,EACrBytD,EAAmBztD,UAAAC,OAAA,EAAAD,kBAAAE,EAEnB,MAAM+4E,EAAmBjpB,GACvB78C,EACAzT,KAAK2xD,gBACL5D,GAEF,OAAO/tD,KAAK2pG,QACVpwB,EAAiB,eAAiBA,EAAuB,KACzDr3E,EACAq3E,GACA7gE,MAAOf,IACPnW,EAAI,MAAO,wBAAyBmW,GAC7B,MAEX,ECrzBK,SAASkyF,GACdp2F,GAEA,IAAK6uB,GAAwBusB,KAAKp7C,EAAQy5C,UACxC,MAAO,CAAA,EAET,MAAM48C,EAA6Br2F,EAAQ25C,aAAa,WACxD,IAIIn2C,EACAoE,EALAxF,EAAS,EACTC,EAAS,EACTiyD,EAAO,EACPC,EAAO,EAGX,MAAM+hC,EAAYt2F,EAAQ25C,aAAa,SACjC48C,EAAav2F,EAAQ25C,aAAa,UAClCphD,EAAIyH,EAAQ25C,aAAa,MAAQ,EACjCrhD,EAAI0H,EAAQ25C,aAAa,MAAQ,EAEjC68C,IADcH,GAAetnE,GAAmBqsB,KAAKi7C,IAErDI,GACHH,IAAcC,GAA4B,SAAdD,GAAuC,SAAfC,EAEvD,IAAIG,EAAkB,GAClBC,EAAY,EACZC,EAAa,EAiBjB,GAfIJ,IAECj+F,GAAKD,IACN0H,EAAQuH,YACwB,cAAhCvH,EAAQuH,WAAWkyC,WAEnBi9C,EACE,cAAgBvuE,GAAU5vB,GAAK,KAAO,IAAM4vB,GAAU7vB,GAAK,KAAO,KACpEkL,GAAUxD,EAAQ25C,aAAa,cAAgB,IAAM+8C,EACrD12F,EAAQoI,aAAa,YAAa5E,GAClCxD,EAAQmJ,gBAAgB,KACxBnJ,EAAQmJ,gBAAgB,MAIxBqtF,GAAkBC,EACpB,MAAO,CACLl4F,MAAO,EACPC,OAAQ,GAIZ,MAAMq4F,EAAoC,CACxCt4F,MAAO,EACPC,OAAQ,GAGV,GAAIg4F,EAIF,OAHAK,EAAUt4F,MAAQ4pB,GAAUmuE,GAC5BO,EAAUr4F,OAAS2pB,GAAUouE,GAEtBM,EAGT,MAAMC,EAAeT,EAAY9uE,MAAMwH,IACvCulC,GAAQruD,WAAW6wF,EAAa,IAChCviC,GAAQtuD,WAAW6wF,EAAa,IAChC,MAAM9yB,EAAe/9D,WAAW6wF,EAAa,IACvC7yB,EAAgBh+D,WAAW6wF,EAAa,IAC9CD,EAAUviC,KAAOA,EACjBuiC,EAAUtiC,KAAOA,EACjBsiC,EAAU7yB,aAAeA,EACzB6yB,EAAU5yB,cAAgBA,EACrBwyB,GAMHI,EAAUt4F,MAAQylE,EAClB6yB,EAAUr4F,OAASylE,IANnB4yB,EAAUt4F,MAAQ4pB,GAAUmuE,GAC5BO,EAAUr4F,OAAS2pB,GAAUouE,GAC7Bn0F,EAASy0F,EAAUt4F,MAAQylE,EAC3B3hE,EAASw0F,EAAUr4F,OAASylE,GAO9B,MAAMyxB,EAAsBjtE,GAC1BzoB,EAAQ25C,aAAa,wBAA0B,IA4BjD,GA1BI+7C,EAAoB5sE,SAAW31B,IAEO,SAApCuiG,EAAoBzsE,cACtB5mB,EAASD,EAASA,EAASC,EAASA,EAASD,GAGP,UAApCszF,EAAoBzsE,cACtB5mB,EAASD,EAASA,EAASC,EAASD,EAASC,GAG/Cs0F,EAAYE,EAAUt4F,MAAQylE,EAAe5hE,EAC7Cw0F,EAAaC,EAAUr4F,OAASylE,EAAgB7hE,EACb,QAA/BszF,EAAoB5sE,SACtB6tE,GAAa,GAEoB,QAA/BjB,EAAoB3sE,SACtB6tE,GAAc,GAEmB,QAA/BlB,EAAoB5sE,SACtB6tE,EAAY,GAEqB,QAA/BjB,EAAoB3sE,SACtB6tE,EAAa,IAKJ,IAAXx0F,GACW,IAAXC,GACS,IAATiyD,GACS,IAATC,GACM,IAANh8D,GACM,IAAND,EAEA,OAAOu+F,EAqBT,IAnBKt+F,GAAKD,IAAuC,cAAjC0H,EAAQuH,WAAYkyC,WAClCi9C,EACE,cAAgBvuE,GAAU5vB,GAAK,KAAO,IAAM4vB,GAAU7vB,GAAK,KAAO,MAGtEkL,EACEkzF,EACA,WACAt0F,EAFAs0F,QAKAr0F,EACA,KACCiyD,EAAOlyD,EAASu0F,GACjB,KACCpiC,EAAOlyD,EAASu0F,GACjB,KAGuB,QAArB52F,EAAQy5C,SAAoB,CAG9B,IAFA7xC,EAAK5H,EAAQ6H,cAAckvF,gBAAgB3oE,GAAO,KAE3CpuB,EAAQg3F,YACbpvF,EAAGiyE,YAAY75E,EAAQg3F,YAEzBh3F,EAAQ65E,YAAYjyE,EACtB,MACEA,EAAK5H,EACL4H,EAAGuB,gBAAgB,KACnBvB,EAAGuB,gBAAgB,KACnB3F,EAASoE,EAAG+xC,aAAa,aAAen2C,EAG1C,OADAoE,EAAGQ,aAAa,YAAa5E,GACtBqzF,CACT,CD6pBCvqG,EA9vBYsmG,GAAW,OA+FR,SAAOtmG,EA/FVsmG,GAAW,kBAiGG,IAAI/iE,MAAoB8iE,KAAYrmG,EAjGlDsmG,GAAW,cAzBkD,CACxEjpE,YAAa,EACbuqE,kBAAkB,EAClBG,oBAAqB,GACrBtlC,MAAO,EACPC,MAAO,EACP8kC,gBAAgB,IAsHuBxnG,EAnG5BsmG,GAAW,kBA0qBG,IACpBt5C,GACH,IACA,IACA,QACA,SACA,sBACA,aACA,OACA,cACA,oBA4EJ9kD,EAAcM,SAAS89F,IACvBp+F,EAAcY,YAAYw9F,IE70BnB,MAAMqE,GAAcC,GAAkBA,EAAKC,QAAQ7nE,QAAQ,OAAQ,ICIpE8nE,GAA2B1rE,G7G2BT,CACpB,UACA,OACA,SACA,WACA,WACA,OACA,S8GtCG,SAAS2rE,GACdtwF,EACAuwF,GAEA,IAAI79C,EAEF89C,EACA7/F,EACAoY,EAHA0nF,EAAuB,GAIzB,IAAK9/F,EAAI,EAAGoY,EAAMwnF,EAAUxqG,OAAQ4K,EAAIoY,EAAKpY,IAC3C+hD,EAAW69C,EAAU5/F,GACrB6/F,EAAWxwF,EAAI0wF,uBACb,6BACAh+C,GAEF+9C,EAAYA,EAAU//F,OAAOtJ,MAAMupB,KAAK6/E,IAE1C,OAAOC,CACT,CClBA,MAAME,GAAiB,CACrB,oBACA,KACA,KACA,KACA,KACA,gBACA,KACA,KACA,IACA,KACA,MAEIC,GAAY,aAEX,SAASC,GACd7wF,EACA68D,GACA,IAAAi0B,EACA,MAAMC,GAAwC,QAAhCD,EAAAj0B,EAASjqB,aAAag+C,eAAUE,SAAhCA,EAAkCvxE,MAAM,KAAM,GAC1DyxE,EAAqBhxF,EAAI8B,eAAeivF,GAI1C,GAHIC,GAAsBA,EAAmBp+C,aAAag+C,KACxDC,GAA+B7wF,EAAKgxF,GAElCA,IACFL,GAAepqG,QAASmtD,IACtB,MAAM5iD,EAAQkgG,EAAmBp+C,aAAac,IACzCmpB,EAAS96D,aAAa2xC,IAAS5iD,GAClC+rE,EAASx7D,aAAaqyC,EAAM5iD,MAG3B+rE,EAASo0B,SAASlrG,QAAQ,CAC7B,MAAMmrG,EAAiBF,EAAmBG,WAAU,GACpD,KAAOD,EAAejB,YACpBpzB,EAASiW,YAAYoe,EAAejB,WAExC,CAEFpzB,EAASz6D,gBAAgBwuF,GAC3B,CCpCA,MAAMQ,GAAW,CACf,iBACA,iBACA,qBACA,sBCeF,MAAMC,GAAWxwF,GACfpT,EAAcU,YAAY+hG,GAAWrvF,GAAIpW,eAepC,MAAM6mG,GAUXhsG,WAAAA,CACEkf,EACA9c,EACAiW,EACAqC,EACAuxF,GAEA/rG,KAAKgf,SAAWA,EAChBhf,KAAKkC,QAAUA,EACflC,KAAKmY,QAAUA,EACfnY,KAAKgsG,SAAW,+BAChBhsG,KAAKwa,IAAMA,EACXxa,KAAK+rG,UAAYA,EACjB/rG,KAAKisG,aD9CF,SACLzxF,GAEA,MAAM0xF,EAASpB,GAAiBtwF,EAAKoxF,IAC/BK,EAAmD,CAAA,EACzD,IAAI50D,EAAI60D,EAAO3rG,OACf,KAAO82C,KAAK,CACV,MAAMh8B,EAAK6wF,EAAO70D,GACdh8B,EAAG+xC,aAAa,eAClBi+C,GAA+B7wF,EAAKa,GAEtC,MAAM/H,EAAK+H,EAAG+xC,aAAa,MACvB95C,IACF24F,EAAa34F,GAAM+H,EAEvB,CACA,OAAO4wF,CACT,CC6BwBE,CAAgB3xF,GACpCxa,KAAK+tD,SCvDF,SAAqBvzC,GAC1B,MAAM6M,EAAS7M,EAAIy7D,qBAAqB,SAClCm2B,EAAqB,CAAA,EAG3B,IAAK,IAAIjhG,EAAI,EAAGA,EAAIkc,EAAO9mB,OAAQ4K,IAAK,CACtC,MAAMkhG,GAAiBhlF,EAAOlc,GAAGm+E,aAAe,IAAIvmD,QAElD,oBACA,IAG2B,KAAzBspE,EAAc/vE,QAKlB+vE,EACG9wE,MAAM,KAEN/xB,OAAO,CAACwkD,EAAMhlD,EAAOqC,IAAUA,EAAM9K,OAAS,GAAKytD,EAAK1xB,QAExDv7B,QAASitD,IAIR,IACGA,EAAKhzB,MAAM,OAAS,IAAIz6B,OAAS,GAClCytD,EAAK1xB,OAAO+lB,WAAW,KAEvB,OAGF,MAAMrnB,EAAQgzB,EAAKzyB,MAAM,KACvB+wE,EAAkC,CAAA,EAElCC,EADcvxE,EAAM,GAAGsB,OACUf,MAAM,KAAK/xB,OAAO,SAAUgjG,GAC3D,OAAOA,EAAKlwE,MACd,GAEF,IAAK,IAAI+a,EAAI,EAAGA,EAAIk1D,EAAmBhsG,OAAQ82C,IAAK,CAClD,MAAMm1D,EAAOD,EAAmBl1D,GAAG9b,MAAM,KACvCvoB,EAAWw5F,EAAK,GAAGlwE,OACnBhxB,EAAQkhG,EAAK,GAAGlwE,OAClBgwE,EAAQt5F,GAAY1H,CACtB,EACA0iD,EAAOhzB,EAAM,GAAGsB,QACXf,MAAM,KAAKx6B,QAAS0rG,IAET,MADdA,EAAQA,EAAM1pE,QAAQ,QAAS,IAAIzG,UAInC8vE,EAASK,GAAS,IACZL,EAASK,IAAU,MACpBH,OAIb,CACA,OAAOF,CACT,CDLoBM,CAAYlyF,EAC9B,CAEAwN,KAAAA,GACE,OAAO7T,QAAQkE,IACbrY,KAAKgf,SAAS1G,IAAK7E,GAAYzT,KAAK2sG,aAAal5F,IAErD,CAEA,kBAAMk5F,CAAatxF,GACjB,MAAM05D,EAAQ82B,GAAQxwF,GACtB,GAAI05D,EAAO,CACT,MAAMjkE,QAAmCikE,EAAMtjB,YAC7Cp2C,EACArb,KAAKkC,QACLlC,KAAK+tD,UAcP,OAZA/tD,KAAK4sG,gBAAgB97F,EAAKuK,EAAIzT,GAC9B5H,KAAK4sG,gBAAgB97F,EAAKuK,EAAIxT,GAC1BiJ,aAAeu1F,IAAev1F,EAAI21F,iBACpCpkC,GACEvxD,EACAA,EAAIorB,qCAGNmmC,GAAmCvxD,SAE/B9Q,KAAK6sG,gBAAgB/7F,EAAKuK,GAChCrb,KAAKmY,SAAWnY,KAAKmY,QAAQkD,EAAIvK,GAC1BA,CACT,CACA,OAAO,IACT,CAEAg8F,yBAAAA,CACEh8F,EACAkC,EACA+5F,GAEA,MAAMzhG,EAAQwF,EAAIkC,GAChBo7C,EAAQpuD,KAAKgsG,SACf,IAAK59C,EAAMS,KAAKvjD,GACd,OAGF8iD,EAAMkT,UAAY,EAElB,MAAMhuD,EAAK86C,EAAMryB,KAAKzwB,GAAQ,GAG9B,OAFA8iD,EAAMkT,UAAY,EAEXyrC,EAAQz5F,EACjB,CAEAs5F,eAAAA,CACE97F,EACAuK,EACArI,GAEA,MAAMg6F,EAAchtG,KAAK8sG,0BACvBh8F,EACAkC,EACAhT,KAAKisG,cAEP,GAAIe,EAAa,CACf,MAAMl3B,EAAcz6D,EAAG+xC,aAAap6C,EAAW,YACzCqkE,EAAWT,GAASnlB,YAAYu7C,EAAal8F,EAAK,IACnD9Q,KAAKkC,QACR66B,QAAS+4C,IAEXhlE,EAAIrI,IAAIuK,EAAUqkE,EACpB,CACF,CAIA,qBAAMw1B,CACJ/7F,EACAm8F,EACAC,GAEA,MAAMC,EAAmBntG,KAAK8sG,0BAC5Bh8F,EACA,WACA9Q,KAAK+rG,WAEP,GAAIoB,EAAkB,CACpB,MAAMC,EAAkBv4F,GAAgB/D,EAAImtB,uBACtCovE,EAAcF,EAAiB,GAAGv/C,cACxC,IAAI0/C,EAAgBL,EACpB,MACGC,GACDI,EAAc1/C,eACd0/C,EAAclgD,aAAa,eAAiBt8C,EAAIqR,UAEhDmrF,EAAgBA,EAAc1/C,cAGhC0/C,EAAc1/C,cAAe0/B,YAAY+f,GAMzC,MAAM7pC,EAAiB9U,GACrB,GAAG4+C,EAAclgD,aAAa,cAAgB,MAC5CigD,EAAYjgD,aAAa,sBAAwB,MAIrDigD,EAAYxxF,aACV,YACA,UAAU2nD,EAAe1pD,KAAK,SAGhC,MAAMwqD,QAAkBnwD,QAAQkE,IAC9B80F,EAAiB70F,IAAKi1F,GACb1B,GAAQ0B,GACZ97C,YAAY87C,EAAiBvtG,KAAKkC,QAASlC,KAAK+tD,UAChDv1C,KAAMg1F,IACLnrC,GAAmCmrC,GACnCA,EAAgBrwE,SAAWqwE,EAAgBC,gBACpCD,EAAgBC,SAChBD,MAITrrF,EACiB,IAArBmiD,EAAU/jE,OAAe+jE,EAAU,GAAK,IAAI/O,GAAM+O,GAC9CopC,EAAa14F,GACjBo4F,EACAjrF,EAAS8b,uBAEP9b,EAASA,gBACLniB,KAAK6sG,gBACT1qF,EACAmrF,EAIAD,EAAYjgD,aAAa,aAAekgD,OAAgB9sG,GAG5D,MAAMqV,OAAEA,EAAMC,OAAEA,EAAMrK,MAAEA,EAAKsK,MAAEA,EAAKE,WAAEA,EAAUC,WAAEA,GAChDR,GAAYg4F,GACdvrF,EAAS1Z,IAAI,CACXsO,OAAO,EACPC,OAAO,IAETmL,EAAS1Z,IAAI,CACXoN,SACAC,SACArK,QACAsK,QACAC,MAAO,IAETmM,EAASwI,oBACP,IAAI7e,GAAMmK,EAAYC,GACtB3P,EACAA,GAEFuK,EAAIqR,SAAWA,CACjB,aAESrR,EAAIqR,QAGf,EE1NF,MAAMwrF,GAAiBtyF,GACrBgnB,GAAsBwsB,KAAK67C,GAAWrvF,IAuBjCuyF,eAAeC,GACpBrzF,EACArC,GAE2B,IAD3BZ,YAAEA,EAAWD,OAAEA,GAA0BhX,UAAAC,OAAA,QAAAC,IAAAF,UAAA,GAAAA,UAAA,GAAG,CAAA,EAE5C,GAAIgX,GAAUA,EAAOG,QAGnB,OAFAjW,EAAI,MAAO,IAAIW,EAAmB,qBA3BH2rG,CACjCt+F,QAAS,GACTwP,SAAU,GACV9c,QAAS,CAAA,EACT6rG,YAAa,IA2Bb,MAAMnzF,EAAkBJ,EAAII,iBCvCvB,SAA4BJ,GACjC,MAAMwzF,EAAWlD,GAAiBtwF,EAAK,CAAC,MAAO,YACzCyzF,EAAiB,CAAC,IAAK,IAAK,aAAc,OAAQ,aAExD,IAAK,MAAMC,KAAcF,EAAU,CACjC,MAAMG,EAA8BD,EAAW39C,WAEzC69C,EAAqC,CAAA,EAC3C,IAAK,MAAMlgD,KAAQigD,EACjBjgD,EAAK5iD,QAAU8iG,EAAWlgD,EAAKre,MAAQqe,EAAK5iD,OAG9C,MAAM+iG,GAASD,EAAW,eAAiBA,EAAWE,MAAQ,IAAIv0E,MAAM,GAExE,GAAc,KAAVs0E,EACF,OAEF,MAAME,EAAoB/zF,EAAI8B,eAAe+xF,GAC7C,GAA0B,OAAtBE,EAEF,OAEF,IAAIC,EAAiBD,EAAkB5C,WAAU,GAEjD,MAAM8C,EAAmCD,EAAej+C,WAElDm+C,EAA0C,CAAA,EAChD,IAAK,MAAMxgD,KAAQugD,EACjBvgD,EAAK5iD,QAAUojG,EAAgBxgD,EAAKre,MAAQqe,EAAK5iD,OAInD,MAAMU,EAAEA,EAAI,EAACD,EAAEA,EAAI,EAAC4C,UAAEA,EAAY,IAAOy/F,EACnCO,EAAe,GAAGhgG,KACtB+/F,EAAgB//F,WAAa,gBACjB3C,MAAMD,KAIpB,GAFA89F,GAAsB2E,GAElB,SAAS3/C,KAAK2/C,EAAethD,UAAW,CAE1C,MAAM0hD,EAAMJ,EAAelzF,cAAckvF,gBAAgB3oE,GAAO,KAChEphC,OAAOwJ,QAAQykG,GAAiB3tG,QAAQ+D,IAAA,IAAE+qC,EAAMvkC,GAAMxG,EAAA,OACpD8pG,EAAIC,eAAehtE,GAAOgO,EAAMvkC,KAElCsjG,EAAI3lE,UAAUulE,EAAeM,YAC7BN,EAAiBI,CACnB,CAEA,IAAK,MAAM1gD,KAAQigD,EAAe,CAChC,IAAKjgD,EACH,SAEF,MAAMre,KAAEA,EAAIvkC,MAAEA,GAAU4iD,EACxB,IAAI+/C,EAAer9F,SAASi/B,GAI5B,GAAa,UAATA,EAAkB,CAIpB,MAAMk/D,EAAmC,CAAA,EACzC/+C,GAAiB1kD,EAAOyjG,GAExBtuG,OAAOwJ,QAAQykG,GAAiB3tG,QAAQwJ,IAAmB,IAAjBslC,EAAMvkC,GAAMf,EACpDwkG,EAAYl/D,GAAQvkC,IAGtB0kD,GAAiB0+C,EAAgBvzF,OAAS,GAAI4zF,GAC9C,MAAMC,EAAevuG,OAAOwJ,QAAQ8kG,GACjCz2F,IAAK22F,GAAUA,EAAMn1F,KAAK,MAC1BA,KAAK,KACR00F,EAAe3yF,aAAag0B,EAAMm/D,EACpC,MAEGN,EAAgB7+D,IAAS2+D,EAAe3yF,aAAag0B,EAAMvkC,EAEhE,CAEAkjG,EAAe3yF,aAAa,YAAa8yF,GACzCH,EAAe3yF,aAAa,sBAAuB,KACnD2yF,EAAe5xF,gBAAgB,MAC/BsxF,EAAWlzF,WAAYwpD,aAAagqC,EAAgBN,EACtD,CACF,CD7CEgB,CAAmB10F,GAEnB,MAAM20F,EAAcvtG,MAAMupB,KAAKvQ,EAAgBq7D,qBAAqB,MAClE/zE,EAAU,IACL2nG,GAAsBjvF,GACzBrD,cACAD,UAEE0H,EAAWmwF,EAAY3lG,OAAQ6R,IACnCwuF,GAAsBxuF,GACfsyF,GAActyF,KNjDlB,SAA4B5H,GACjC,IAAI8yF,EAA2B9yF,EAC/B,KAAO8yF,IAAaA,EAAWA,EAAS34C,gBACtC,GACE24C,GACAA,EAASr5C,UACT29C,GAAyBh8C,KAAK67C,GAAWnE,MACxCA,EAASn5C,aAAa,uBAEvB,OAAO,EAGX,OAAO,CACT,CMoCiCgiD,CAAmB/zF,KAElD,IAAK2D,GAAaA,IAAaA,EAASze,OACtC,MAAO,CA5CTiP,QAAS,GACTwP,SAAU,GACV9c,QAAS,CAAA,EACT6rG,YAAa,GA2CT7rG,UACA6rG,YAAaoB,GAGjB,MAAME,EAA4C,CAAA,EAClDF,EACG3lG,OAAQ6R,GAA0B,aAAnBqvF,GAAWrvF,IAC1Bta,QAASsa,IACRA,EAAGQ,aAAa,oBAAqBR,EAAG+xC,aAAa,cAAgB,IACrE,MAAM95C,EAAK+H,EAAG+xC,aAAa,MAC3BiiD,EAAe/7F,GAAM1R,MAAMupB,KAAK9P,EAAG46D,qBAAqB,MAAMzsE,OAC3D6R,GAAOsyF,GAActyF,MAK5B,MAAMi0F,EAAgB,IAAIxD,GACxB9sF,EACA9c,EACAiW,EACAqC,EACA60F,GAKF,MAAO,CACL7/F,cAHsB8/F,EAActnF,QAIpChJ,WACA9c,UACA6rG,YAAaoB,EAEjB,CE1EO,SAASI,GACd5kD,EACAxyC,EACAjW,GAKA,OAAO2rG,IAHQ,IAAKtpG,IAA2B,YAEhCirG,gBAAgB7kD,EAAOruB,OAAQ,YACjBnkB,EAASjW,EACxC,CCZA,MAAMutG,GAAmCroG,EAQ5BsoG,GAA6BC,GACjC,SAAUthE,EAAYD,EAAqBwhE,GAChD,MAAMtlF,OAAEA,EAAMo5C,WAAEA,GAAeksC,EAC/B,OAAO,IAAI9jG,GAAMwe,EAAOqlF,IACrBpjG,SAASm3D,GACT/0D,UACCqG,GACE46F,EAAW5hE,uBACX4hE,EAAW3xE,uBAGnB,EAUW4xE,GAAoBA,CAC/BriF,EACA7e,EACA3C,EACAD,KAEA,MAAMrC,OAAEA,EAAMimG,WAAEA,GAAehhG,EACzBmhG,EAAOpmG,EACPqmG,EAAqB3kF,GACzB,IAAItf,GAAME,EAAGD,QACbvL,EACAsvG,EAAKrlF,iBAMP,OAHAqlF,EAAKxlF,OAAOqlF,GAAcI,EAAmB9jG,IAAI6jG,EAAKpsC,YACtDosC,EAAKjzF,gBACLizF,EAAKrnG,IAAI,SAAS,IACX,GAMIunG,GAA2BA,CACtCL,EACArsD,IAEO,SACL91B,EACA7e,EACA3C,EACAD,GAEA,MAAM+jG,EAAOnhG,EAAUjF,OACrBumG,EAAc,IAAInkG,GAChBgkG,EAAKxlF,QAAQqlF,EAAa,EAAIA,EAAaG,EAAKxlF,OAAO/pB,QAAU,IAEnE2vG,EAA2BD,EACxB1jG,SAASujG,EAAKpsC,YACd/0D,UAAUmhG,EAAKrlF,iBAClBsuB,EAAkBuK,EAAG91B,EAAW,IAAK7e,EAAWghG,cAAc3jG,EAAGD,GAM7DkhF,EAJ8BgjB,EACjC1jG,SAASujG,EAAKpsC,YACd/0D,UAAUmhG,EAAKrlF,iBAEuBle,SAAS2jG,GAIlD,OAHAJ,EAAKh+F,MAAQm7E,EAAKjhF,EAClB8jG,EAAK/9F,KAAOk7E,EAAKlhF,EAEVgtC,CACT,EAGWo3D,GAA2BR,GACtC/2D,GACE62D,GACAO,GAAyBL,EAAYE,KCrFzC,MAUMO,GAAwBA,CAC5BC,EACAC,EACAX,KAEA,MAAMztF,KAAEA,EAAIwhD,WAAEA,GAAe2sC,EACvBjwC,EAAUl+C,EAAKouF,GACrB,OAAO,IAAIxkG,GACRs0D,EAAQuvC,GAAyBjsC,EAAW13D,EAC5Co0D,EAAQuvC,EAAa,GAAgBjsC,EAAW33D,GACjD4C,UACAqG,GACEq7F,EAAWriE,uBACXqiE,EAAWpyE,yBAkDjB,SAASsyE,GAEPliE,EACAD,EACAiiE,GAEA,MAAMC,aAAEA,EAAYX,WAAEA,GAAe3vG,KACrC,OAAOowG,GAAsBC,EAAYC,EAAcX,EACzD,CASA,SAASa,GAEPhjF,EACA7e,EACA3C,EACAD,GAEA,MAAMrC,OAAEA,GAAWiF,GACb2hG,aAAEA,EAAYX,WAAEA,GAAe3vG,KAC/B+4C,EAvEc03D,EACpBJ,EACArkG,EACAD,EACAukG,EACAX,KAEA,MAAMztF,KAAEA,EAAIwhD,WAAEA,GAAe2sC,EAEvBK,EACJxuF,GAAMouF,EAAe,EAAIA,EAAepuF,EAAK3hB,QAAU,GACnD0vG,EAAc,IAAInkG,GACtB4kG,EAAcf,GACde,EAAcf,EAAa,IAGvBO,EAA2BD,EAC9B1jG,SAASm3D,GACT/0D,UAAU0hG,EAAW5lF,iBAElBslF,EAAqB3kF,GACzB,IAAItf,GAAME,EAAGD,QACbvL,EACA6vG,EAAW5lF,iBAGbvI,EAAKouF,GAAcX,GAAcI,EAAmB/jG,EAAI03D,EAAW13D,EACnEkW,EAAKouF,GAAcX,EAAa,GAAKI,EAAmBhkG,EAAI23D,EAAW33D,EACvEskG,EAAWxzF,gBAEX,MAIMowE,EAJ8BgjB,EACjC1jG,SAAS8jG,EAAW3sC,YACpB/0D,UAAU0hG,EAAW5lF,iBAEiBle,SAAS2jG,GAIlD,OAHAG,EAAWv+F,MAAQm7E,EAAKjhF,EACxBqkG,EAAWt+F,KAAOk7E,EAAKlhF,EACvBskG,EAAW5nG,IAAI,SAAS,IACjB,GAiCiBgoG,CACtB/mG,EACAsC,EACAD,EACAukG,EACAX,GASF,OANEnkF,GAAUxrB,KAAKu7C,WAAmC,IAC7ChuB,GAAgBC,EAAW7e,EAAW3C,EAAGD,GAC5CukG,eACAX,eAGG52D,CACT,CAKA,MAAM43D,WAAyBl2D,GAK7B36C,WAAAA,CAAYoC,GACV9B,MAAM8B,EACR,CAEAshB,MAAAA,CACE7H,EACA7J,EACAC,EACA0nC,EACA3qC,GAEA,MAAMmkD,EAA2C,IAC5CxZ,EACHU,YAAan6C,KAAK4wG,YAClB52D,kBAAmBh6C,KAAK6wG,cACxB92D,oBAAqB/5C,KAAK4wG,aAE5BxwG,MAAMojB,OAAO7H,EAAK7J,EAAMC,EAAKkhD,EAAWnkD,EAC1C,EAGF,MAAMgiG,WAAgCH,GAIpC7wG,WAAAA,CAAYoC,GACV9B,MAAM8B,EACR,CAEAshB,MAAAA,CAEE7H,EACA7J,EACAC,EACA0nC,EACA3qC,GAEA,MAAMoT,KAAEA,GAASpT,GACXwhG,aACJA,EAAYX,WACZA,EAAUoB,sBACVA,EAAqBC,oBACrBA,GACEhxG,KACJ2b,EAAI2G,OACJ3G,EAAIw4B,YAAcn0C,KAAK6wG,cACnB7wG,KAAKixG,qBACPt1F,EAAI64B,YAAYx0C,KAAKixG,qBAEvB,MAAOC,GAAehvF,EAAKouF,GACrB/vF,EAAQ6vF,GACZthG,EACAiiG,EACAC,GAGF,GAAoB,MAAhBE,EAAqB,CAEvB,MAAMr8B,EAASu7B,GACbthG,EACAwhG,EACAX,EAAa,GAEfh0F,EAAImI,OAAO+wD,EAAO7oE,EAAG6oE,EAAO9oE,GAC5B4P,EAAIoI,OAAOjS,EAAMC,EACnB,MACE4J,EAAImI,OAAOhS,EAAMC,GAEnB4J,EAAIoI,OAAOxD,EAAMvU,EAAGuU,EAAMxU,GAC1B4P,EAAIiiB,SACJjiB,EAAI6G,UAEJpiB,MAAMojB,OAAO7H,EAAK7J,EAAMC,EAAK0nC,EAAe3qC,EAC9C,EAGF,MAAMqiG,GAAgBA,CACpBC,EACAC,EACAC,EACApvG,EAIA6uG,EACAC,IAEA,IAAKM,EAAiBR,GAA0BH,IAAkB,CAChEL,aAAcc,EACdzB,WAAY0B,EACZ91D,WAtNqC,aAuNrCM,gBAAiB00D,GACjB13D,cAAe23D,GACfO,wBACAC,yBACG9uG,KACCovG,EAAiBpvG,EAAQqvG,kBAAoBrvG,EAAQsvG,mHAGtD,SACLtvF,GAKyB,IAJzBhgB,EAGC5B,UAAAC,OAAA,QAAAC,IAAAF,UAAA,GAAAA,UAAA,GAAG,CAAA,EAEJ,MAAM0tB,EAAW,CAAA,EACjB,IAAIyjF,EAA+C,IA4CnD,OA3CAvvF,EAAKA,KAAKnhB,QAAQ,CAACq/D,EAASkwC,KAC1B,MAAMY,EAAc9wC,EAAQ,GAU5B,OARoB,MAAhB8wC,IACFljF,EAAS,KAAKsiF,KAAgBY,KAAiBC,GAC7Cb,EACAlwC,EAAQ7/D,OAAS,GACjB,EACA2B,IAGIgvG,GACN,IAAK,IACHljF,EAAS,KAAKsiF,YAAyBa,GACrCb,EACA,GACA,EACApuG,EACAouG,EAAe,EAtIKmB,IACJ,MAAxBA,EAA8B,EAA4B,MAAxBA,EAA8B,EAAI,EAsI5DC,CAAqBD,IAEvBzjF,EAAS,KAAKsiF,YAAyBa,GACrCb,EACA,GACA,EACApuG,EACAouG,EACA,GAEF,MACF,IAAK,IACHtiF,EAAS,KAAKsiF,YAAyBa,GACrCb,EACA,GACA,EACApuG,EACAouG,EACA,GAINmB,EAAsBP,IAEjBljF,CACT,gDDpLO,SACLlkB,GAEA,IADA5H,EAAyB5B,UAAAC,OAAA,QAAAC,IAAAF,UAAA,GAAAA,UAAA,GAAG,CAAA,EAE5B,MAAM0tB,EAAW,CAAA,EACjB,IACE,IAAIziB,EAAM,EACVA,GAAuB,iBAATzB,EAAoBA,EAAOA,EAAKwgB,OAAO/pB,QACrDgL,IAEAyiB,EAAS,IAAIziB,KAAS,IAAIkvC,GAAQ,CAChCc,WAAYk0D,GACZ5zD,gBAAiB6zD,GAA0BnkG,GAC3CstC,cAAes3D,GAAwB5kG,MACpCrJ,IAGP,OAAO8rB,CACT,uhBE7HO,MAAM2jF,GACXzvG,QAEkD1B,IAA1C0B,EAAgC6gG,MCR7B6O,GAAkB,wBAElBC,GAAyB,SAChCD,oJCeAxjD,GAAQ,IAAI/uB,OAAOuyE,GAAiB,KAEnC,MAAME,GAQX,QAAIppG,GACF,OAAQ1I,KAAKF,YAAkC4I,IACjD,CAwBA5I,WAAAA,GAGoE,IAHxD4I,KACVA,KACGxG,GACwD5B,UAAAC,OAAA,QAAAC,IAAAF,UAAA,GAAAA,UAAA,GAAG,CAAA,EAC9DG,OAAOC,OACLV,KACCA,KAAKF,YAAkCsB,SACxCc,EAEJ,CAEU6vG,iBAAAA,GACR,OAAOF,EACT,CAEAG,eAAAA,GACE,MD5DwB,kLC6D1B,CASAC,aAAAA,CACEzvG,GAGA,IAFAE,EAAsBpC,UAAAC,eAAAC,IAAAF,UAAA,GAAAA,UAAA,GAAGN,KAAK+xG,oBAC9BG,EAAoB5xG,UAAAC,eAAAC,IAAAF,UAAA,GAAAA,UAAA,GAAGN,KAAKgyG,kBAE5B,MACE1vG,YAAYkB,YAAEA,EAAc,UAC1BQ,IACgB,UAAhBR,IACFd,EAAiBA,EAAeqgC,QAC9BqrB,GACAwjD,GAAgB7uE,QAAQ,QAASv/B,KAGrC,MAAM2uG,EAAe3vG,EAAGI,aAAaJ,EAAG4vG,eAClCzvG,EAAiBH,EAAGI,aAAaJ,EAAGK,iBACpCwvG,EAAU7vG,EAAGyvG,gBAEnB,IAAKE,IAAiBxvG,IAAmB0vG,EACvC,MAAM,IAAItwG,EACR,qDAKJ,GAFAS,EAAGM,aAAaqvG,EAAcD,GAC9B1vG,EAAGO,cAAcovG,IACZ3vG,EAAGQ,mBAAmBmvG,EAAc3vG,EAAGS,gBAC1C,MAAM,IAAIlB,EACR,mCAAmC/B,KAAK0I,SAASlG,EAAG8vG,iBAClDH,MAON,GAFA3vG,EAAGM,aAAaH,EAAgBD,GAChCF,EAAGO,cAAcJ,IACZH,EAAGQ,mBAAmBL,EAAgBH,EAAGS,gBAC5C,MAAM,IAAIlB,EACR,qCAAqC/B,KAAK0I,SAASlG,EAAG8vG,iBACpD3vG,MAQN,GAHAH,EAAG+vG,aAAaF,EAASF,GACzB3vG,EAAG+vG,aAAaF,EAAS1vG,GACzBH,EAAGgwG,YAAYH,IACV7vG,EAAGiwG,oBAAoBJ,EAAS7vG,EAAGkwG,aACtC,MAAM,IAAI3wG,EACR,0BAA0B/B,KAAK0I,SAASlG,EAAGmwG,kBAAkBN,MAIjE,MAAMO,EAAmB5yG,KAAK6yG,oBAAoBrwG,EAAI6vG,IAAY,CAAA,EAIlE,OAHAO,EAAiBE,OAAStwG,EAAGuwG,mBAAmBV,EAAS,UACzDO,EAAiBI,OAASxwG,EAAGuwG,mBAAmBV,EAAS,UAElD,CACLA,UACAY,mBAAoBjzG,KAAKkzG,sBAAsB1wG,EAAI6vG,GACnDO,mBAEJ,CASAM,qBAAAA,CACE1wG,EACA6vG,GAEA,MAAO,CACLrP,UAAWxgG,EAAG2wG,kBAAkBd,EAAS,aAE7C,CASAQ,mBAAAA,CACErwG,EACA6vG,GAEA,MAAMe,EAAapzG,KAAKF,YACrB8yG,iBAEGA,EAAgE,CAAA,EACtE,IAAK,IAAIznG,EAAI,EAAGA,EAAIioG,EAAU7yG,OAAQ4K,IACpCynG,EAAiBQ,EAAUjoG,IAAM3I,EAAGuwG,mBAClCV,EACAe,EAAUjoG,IAGd,OAAOynG,CACT,CAQAS,iBAAAA,CACE7wG,EACAywG,EACAK,GAEA,MAAMC,EAAoBN,EAAmBjQ,UACvCwQ,EAAShxG,EAAGixG,eAClBjxG,EAAGkxG,WAAWlxG,EAAGmxG,aAAcH,GAC/BhxG,EAAGoxG,wBAAwBL,GAC3B/wG,EAAGqxG,oBAAoBN,EAAmB,EAAG/wG,EAAGsxG,OAAO,EAAO,EAAG,GACjEtxG,EAAGuxG,WAAWvxG,EAAGmxG,aAAcL,EAAe9wG,EAAGwxG,YACnD,CAEAC,iBAAAA,CAAkB/xG,GAChB,MAAMM,EAAKN,EAAQE,QACnB,GAAIF,EAAQ4gG,OAAS,EAAG,CACtB,MAAM9wF,EAAQ9P,EAAQsgG,iBAChBvwF,EAAS/P,EAAQugG,kBACnBvgG,EAAQ8+F,cAAgBhvF,GAAS9P,EAAQ++F,eAAiBhvF,IAC5DzP,EAAGqhG,cAAc3hG,EAAQ0gG,eACzB1gG,EAAQ0gG,cAAgB1gG,EAAQq/F,cAAcoB,cAC5CngG,EACAwP,EACAC,IAGJzP,EAAG0xG,qBACD1xG,EAAG8gG,YACH9gG,EAAG2xG,kBACH3xG,EAAGohG,WACH1hG,EAAQ0gG,cACR,EAEJ,MAEEpgG,EAAG6gG,gBAAgB7gG,EAAG8gG,YAAa,MACnC9gG,EAAG4xG,QAEP,CAEAC,aAAAA,CAAcnyG,GACZA,EAAQ4gG,SACR5gG,EAAQghG,OACR,MAAMoR,EAAOpyG,EAAQ0gG,cACrB1gG,EAAQ0gG,cAAgB1gG,EAAQwgG,cAChCxgG,EAAQwgG,cAAgB4R,CAC1B,CAUAjM,cAAAA,CAAenmG,GACb,OAAO,CACT,CAeAs/F,OAAAA,CAAQt/F,GACFyvG,GAAqBzvG,IACvBlC,KAAKi0G,kBAAkB/xG,GACvBlC,KAAKu0G,aAAaryG,GAClBlC,KAAKq0G,cAAcnyG,IAEnBlC,KAAKw0G,UAAUtyG,EAEnB,CAEAsyG,SAAAA,CAAUxvD,GACR,CAQFyvD,WAAAA,GACE,OAAOz0G,KAAK0I,IACd,CASAgsG,cAAAA,CAAexyG,GACb,MAAMX,EAAMvB,KAAKy0G,cAIjB,OAHKvyG,EAAQ+gG,aAAa1hG,KACxBW,EAAQ+gG,aAAa1hG,GAAOvB,KAAKiyG,cAAc/vG,EAAQE,UAElDF,EAAQ+gG,aAAa1hG,EAC9B,CAcAgzG,YAAAA,CAAaryG,GACX,MAAMM,EAAKN,EAAQE,QACbuyG,EAAS30G,KAAK00G,eAAexyG,GACd,IAAjBA,EAAQghG,MAAchhG,EAAQ2gG,gBAChCrgG,EAAGmhG,YAAYnhG,EAAGohG,WAAY1hG,EAAQ2gG,iBAEtCrgG,EAAGmhG,YAAYnhG,EAAGohG,WAAY1hG,EAAQwgG,eAExClgG,EAAGoyG,WAAWD,EAAOtC,SACrBryG,KAAKqzG,kBAAkB7wG,EAAImyG,EAAO1B,mBAAoB/wG,EAAQ8gG,WAE9DxgG,EAAGqyG,UAAUF,EAAO/B,iBAAiBE,OAAQ,EAAI5wG,EAAQ8+F,aACzDx+F,EAAGqyG,UAAUF,EAAO/B,iBAAiBI,OAAQ,EAAI9wG,EAAQ++F,cAEzDjhG,KAAK80G,gBAAgBtyG,EAAImyG,EAAO/B,kBAChCpwG,EAAGuyG,SAAS,EAAG,EAAG7yG,EAAQsgG,iBAAkBtgG,EAAQugG,mBACpDjgG,EAAGwyG,WAAWxyG,EAAGyyG,eAAgB,EAAG,EACtC,CAEAC,qBAAAA,CACE1yG,EACAkiG,EACAyQ,GAEA3yG,EAAG4yG,cAAcD,GACjB3yG,EAAGmhG,YAAYnhG,EAAGohG,WAAYc,GAE9BliG,EAAG4yG,cAAc5yG,EAAG6yG,SACtB,CAEAC,uBAAAA,CAAwB9yG,EAA2B2yG,GACjD3yG,EAAG4yG,cAAcD,GACjB3yG,EAAGmhG,YAAYnhG,EAAGohG,WAAY,MAC9BphG,EAAG4yG,cAAc5yG,EAAG6yG,SACtB,CAUAP,eAAAA,CACES,EACAC,GAEA,CAOFC,eAAAA,CAAgBvzG,GACd,IAAKA,EAAQwzG,UAAW,CACtB,MAAM1U,YAAEA,EAAWC,aAAEA,GAAiB/+F,EAChCwzG,EAAY9hG,GAAuB,CACvC5B,MAAOgvF,EACP/uF,OAAQgvF,IAEV/+F,EAAQwzG,UAAYA,CACtB,CACF,CAQAv7F,QAAAA,GACE,MAAMw7F,EAAcl1G,OAAOU,KACxBnB,KAAKF,YAAkCsB,UAAY,IAGtD,MAAO,CACLsH,KAAM1I,KAAK0I,QACRitG,EAAYt0G,OAAwB,CAACC,EAAKC,KAC3CD,EAAIC,GAAOvB,KACTuB,GAEKD,GACN,CAAA,GAEP,CAMA8jB,MAAAA,GAEE,OAAOplB,KAAKma,UACd,CAEA,uBAAa5B,CAAUzT,EAErBkgD,GAC6B,IAF7Bt8C,KAAEA,KAASktG,GAAoC9wG,EAG/C,OAAO,IAAI9E,KAAK41G,EAClB,EACD71G,EA3YY+xG,GAAU,OAmBP,cAEd/xG,EArBW+xG,GAAU,mBA0Be,IC9C/B,MAAM+D,GAA2B,CACtClpG,SAAU,oCACVmpG,OACE,4EACF7pG,IAAK,oCACL8pG,WAAY,2DACZxpG,SAAU,oCACVypG,QAAS,0DACTC,OAAQ,0DACRC,UACE,4EACFlwF,QAAS,igBAiBTmwF,KAAM,0FCkBD,MAAMC,WAAmBtE,GA0B9B2C,WAAAA,GACE,MAAO,GAAGz0G,KAAK0I,QAAQ1I,KAAKq2G,MAC9B,CAEUtE,iBAAAA,GACR,MAAO,mRASC8D,GAAyB71G,KAAKq2G,mCAIxC,CAQA7B,SAAAA,CAAS1vG,GAA4C,IAAzCs8F,WAAWx7E,KAAEA,IAA0B9gB,EACjD,MAAMsU,EAAS,IAAI2f,GAAM/4B,KAAKg5B,OAAOQ,YAC/BU,EAAQl6B,KAAKk6B,MACbrY,EAAKzI,EAAO,GAAK8gB,EACjBo8E,EAAKl9F,EAAO,GAAK8gB,EACjB2/B,EAAKzgD,EAAO,GAAK8gB,EACjBq8E,EAAS,EAAIr8E,EAEnB,IAAK,IAAI/uB,EAAI,EAAGA,EAAIya,EAAKrlB,OAAQ4K,GAAK,EAAG,CACvC,MAAM4J,EAAI6Q,EAAKza,GACT+sB,EAAItS,EAAKza,EAAI,GACb8J,EAAI2Q,EAAKza,EAAI,GACnB,IAAIqrG,EAAIC,EAAIC,EACZ,OAAQ12G,KAAKq2G,MACX,IAAK,WACHG,EAAMzhG,EAAI8M,EAAM,IAChB40F,EAAMv+E,EAAIo+E,EAAM,IAChBI,EAAMzhG,EAAI4kD,EAAM,IAChB,MACF,IAAK,SACH28C,EAAK,KAAQ,IAAMzhG,IAAM,IAAM8M,GAAO,IACtC40F,EAAK,KAAQ,IAAMv+E,IAAM,IAAMo+E,GAAO,IACtCI,EAAK,KAAQ,IAAMzhG,IAAM,IAAM4kD,GAAO,IACtC,MACF,IAAK,MACH28C,EAAKzhG,EAAI8M,EACT40F,EAAKv+E,EAAIo+E,EACTI,EAAKzhG,EAAI4kD,EACT,MACF,IAAK,aACH28C,EAAK9xG,KAAKgH,IAAIqJ,EAAI8M,GAClB40F,EAAK/xG,KAAKgH,IAAIwsB,EAAIo+E,GAClBI,EAAKhyG,KAAKgH,IAAIuJ,EAAI4kD,GAClB,MACF,IAAK,WACH28C,EAAKzhG,EAAI8M,EACT40F,EAAKv+E,EAAIo+E,EACTI,EAAKzhG,EAAI4kD,EACT,MACF,IAAK,SACH28C,EAAK9xG,KAAK8I,IAAIuH,EAAG8M,GACjB40F,EAAK/xG,KAAK8I,IAAI0qB,EAAGo+E,GACjBI,EAAKhyG,KAAK8I,IAAIyH,EAAG4kD,GACjB,MACF,IAAK,UACH28C,EAAK9xG,KAAKC,IAAIoQ,EAAG8M,GACjB40F,EAAK/xG,KAAKC,IAAIuzB,EAAGo+E,GACjBI,EAAKhyG,KAAKC,IAAIsQ,EAAG4kD,GACjB,MACF,IAAK,UACH28C,EACE30F,EAAK,IACA,EAAI9M,EAAI8M,EAAM,IACf,IAAO,GAAK,IAAM9M,IAAM,IAAM8M,GAAO,IAC3C40F,EACEH,EAAK,IACA,EAAIp+E,EAAIo+E,EAAM,IACf,IAAO,GAAK,IAAMp+E,IAAM,IAAMo+E,GAAO,IAC3CI,EACE78C,EAAK,IACA,EAAI5kD,EAAI4kD,EAAM,IACf,IAAO,GAAK,IAAM5kD,IAAM,IAAM4kD,GAAO,IAC3C,MACF,IAAK,YACH28C,EAAK30F,EAAK9M,EAAK,EAAI8M,EAAK9M,EAAK,IAC7B0hG,EAAKH,EAAKp+E,EAAK,EAAIo+E,EAAKp+E,EAAK,IAC7Bw+E,EAAK78C,EAAK5kD,EAAK,EAAI4kD,EAAK5kD,EAAK,IAC7B,MACF,IAAK,OACHuhG,EAAK30F,EAAK9M,EAAIwhG,EACdE,EAAKH,EAAKp+E,EAAIq+E,EACdG,EAAK78C,EAAK5kD,EAAIshG,EAElB3wF,EAAKza,GAAKqrG,EACV5wF,EAAKza,EAAI,GAAKsrG,EACd7wF,EAAKza,EAAI,GAAKurG,CAChB,CACF,CAQA5B,eAAAA,CACEtyG,EACAowG,GAEA,MAAMx5F,EAAS,IAAI2f,GAAM/4B,KAAKg5B,OAAOQ,YACrCpgB,EAAO,GAAMpZ,KAAKk6B,MAAQ9gB,EAAO,GAAM,IACvCA,EAAO,GAAMpZ,KAAKk6B,MAAQ9gB,EAAO,GAAM,IACvCA,EAAO,GAAMpZ,KAAKk6B,MAAQ9gB,EAAO,GAAM,IACvCA,EAAO,GAAKpZ,KAAKk6B,MACjB13B,EAAGm0G,WAAW/D,EAAiBgE,OAAQx9F,EACzC,EArIArZ,EAdWq2G,GAAU,WAtBoC,CACzDp9E,MAAO,UACPq9E,KAAM,WACNn8E,MAAO,IAuCkCn6B,EApB9Bq2G,GAAU,OAsBP,cAAYr2G,EAtBfq2G,GAAU,mBAwBK,CAAC,WA8H7BnuG,EAAcM,SAAS6tG,IClMhB,MAAM1zG,GAAkD,CAC7DiK,SAAU,2XAcVkqG,KAAM,qXCuBD,MAAMC,WAAmBhF,GA4B9B2C,WAAAA,GACE,MAAO,GAAGz0G,KAAK0I,QAAQ1I,KAAKq2G,MAC9B,CAEAtE,iBAAAA,GACE,OAAOrvG,GAAe1C,KAAKq2G,KAC7B,CAEArE,eAAAA,GACE,MD5CwB,4TC6C1B,CAEAuC,YAAAA,CAAaryG,GACX,MAAMM,EAAKN,EAAQE,QACjBsiG,EAAU1kG,KAAK2iG,cAAczgG,EAAQq/F,cAAevhG,KAAK+2G,OAC3D/2G,KAAKk1G,sBAAsB1yG,EAAIkiG,EAAUliG,EAAGw0G,UAC5C52G,MAAMm0G,aAAaryG,GACnBlC,KAAKs1G,wBAAwB9yG,EAAIA,EAAGw0G,SACtC,CAEArU,aAAAA,CAAciE,EAA6BmQ,GACzC,OAAOnQ,EAAQrE,iBAAiBwU,EAAM3xG,SAAU2xG,EAAMj2F,aACxD,CAQAm2F,eAAAA,GACE,MAAMF,EAAQ/2G,KAAK+2G,OACjB/kG,MAAEA,EAAKC,OAAEA,GAAW8kG,EAAMj2F,aAC5B,MAAO,CACL,EAAIi2F,EAAMlhG,OACV,EACA,EACA,EACA,EAAIkhG,EAAMjhG,OACV,GACCihG,EAAMjlG,KAAOE,GACb+kG,EAAMhlG,IAAME,EACb,EAEJ,CAQAuiG,SAAAA,CAAS1vG,GAGY,IAFnBs8F,WAAWx7E,KAAEA,EAAI5T,MAAEA,EAAKC,OAAEA,GAC1BsvF,eAAe2V,UAAEA,IACApyG,EACjB,MAAMiyG,EAAQ/2G,KAAK+2G,MACdG,EAAUC,aACbD,EAAUC,WAAa3jG,MAEzB,MAAM4jG,EAAUF,EAAUC,WACpB/0G,EAAUg1G,EAAQh0G,WAAW,MAC/Bg0G,EAAQplG,QAAUA,GAASolG,EAAQnlG,SAAWA,GAChDmlG,EAAQplG,MAAQA,EAChBolG,EAAQnlG,OAASA,GAEjB7P,EAAQ4e,UAAU,EAAG,EAAGhP,EAAOC,GAEjC7P,EAAQ6uC,aACN8lE,EAAMlhG,OACN,EACA,EACAkhG,EAAMjhG,OACNihG,EAAMjlG,KACNilG,EAAMhlG,KAER3P,EAAQ+gB,UAAU4zF,EAAMj2F,aAAc,EAAG,EAAG9O,EAAOC,GACnD,MAAMolG,EAAYj1G,EAAQ2kD,aAAa,EAAG,EAAG/0C,EAAOC,GAAQ2T,KAC5D,IAAK,IAAIza,EAAI,EAAGA,EAAIya,EAAKrlB,OAAQ4K,GAAK,EAAG,CACvC,MAAM4J,EAAI6Q,EAAKza,GACT+sB,EAAItS,EAAKza,EAAI,GACb8J,EAAI2Q,EAAKza,EAAI,GACb2J,EAAI8Q,EAAKza,EAAI,GAEb0W,EAAKw1F,EAAUlsG,GACfmrG,EAAKe,EAAUlsG,EAAI,GACnB0uD,EAAKw9C,EAAUlsG,EAAI,GACnByuD,EAAKy9C,EAAUlsG,EAAI,GAEzB,OAAQnL,KAAKq2G,MACX,IAAK,WACHzwF,EAAKza,GAAM4J,EAAI8M,EAAM,IACrB+D,EAAKza,EAAI,GAAM+sB,EAAIo+E,EAAM,IACzB1wF,EAAKza,EAAI,GAAM8J,EAAI4kD,EAAM,IACzBj0C,EAAKza,EAAI,GAAM2J,EAAI8kD,EAAM,IACzB,MACF,IAAK,OACHh0C,EAAKza,EAAI,GAAKyuD,EAGpB,CACF,CAQAk7C,eAAAA,CACEtyG,EACAowG,GAEA,MAAM37F,EAASjX,KAAKi3G,kBACpBz0G,EAAG80G,UAAU1E,EAAiB2E,OAAQ,GACtC/0G,EAAGg1G,iBAAiB5E,EAAiB6E,kBAAkB,EAAOxgG,EAChE,CAQAkD,QAAAA,GAIE,MAAO,IACF/Z,MAAM+Z,WACT48F,MAAO/2G,KAAK+2G,OAAS/2G,KAAK+2G,MAAM58F,WAEpC,CASA,uBAAa5B,CAAUhO,EAErBrI,GACuD,IAFvDwG,KAAEA,EAAIquG,MAAEA,KAAUnB,GAAoCrrG,EAGtD,OAAO87F,GAAY9tF,WAAWw+F,EAAO70G,GAASsW,KAC3Ck/F,GAAiB,IAAI13G,KAAK,IAAK41G,EAAemB,MAAOW,IAE1D,EAhKA33G,EAhBW+2G,GAAU,OAsBP,cAAY/2G,EAtBf+2G,GAAU,WArBoC,CACzDT,KAAM,WACNn8E,MAAO,IA2CkCn6B,EAxB9B+2G,GAAU,mBA0BK,CAAC,mBAAoB,WAyJjD7uG,EAAcM,SAASuuG,IC/LhB,MAAMa,WAAa7F,GAkBxBC,iBAAAA,GACE,MC/C0B,qgCDgD5B,CAEAvQ,OAAAA,CAAQt/F,GACFyvG,GAAqBzvG,IAEvBlC,KAAK43G,YAAc11G,EAAQ8+F,YAAc9+F,EAAQ++F,aACjD/+F,EAAQ4gG,SACR9iG,KAAKi0G,kBAAkB/xG,GACvBlC,KAAK63G,YAAa,EAClB73G,KAAKu0G,aAAaryG,GAClBlC,KAAKq0G,cAAcnyG,GACnBlC,KAAKi0G,kBAAkB/xG,GACvBlC,KAAK63G,YAAa,EAClB73G,KAAKu0G,aAAaryG,GAClBlC,KAAKq0G,cAAcnyG,IAEnBlC,KAAKw0G,UAAUtyG,EAEnB,CAEAsyG,SAAAA,CAAS1vG,GAA2D,IAAxDs8F,WAAWx7E,KAAEA,EAAI5T,MAAEA,EAAKC,OAAEA,IAA4BnN,EAGhE9E,KAAK43G,YAAc5lG,EAAQC,EAC3BjS,KAAK63G,YAAa,EAClB,IAAIC,EAAY93G,KAAK+3G,eAAiB/lG,EACtC,MAAMovF,EAAY,IAAImE,kBAAkB3/E,GAClCoyF,EAAU,GACVC,EAAa,EAAIjmG,EACvB,IAAK,IAAI7G,EAAI,EAAGA,EAAIya,EAAKrlB,OAAQ4K,GAAK,EAAG,CACvC,IAAI4J,EAAI,EACNmjB,EAAI,EACJjjB,EAAI,EACJH,EAAI,EACJojG,EAAS,EACX,MAAMC,EAAUhtG,EAAKA,EAAI8sG,EACnBG,EAAUD,EAAUF,EAS1B,IAAK,IAAI5gE,GAAI,GAAcA,EAAI2gE,EAAS3gE,IAAK,CAC3C,MAAMghE,EAAUhhE,EAAI2gE,EACd15D,EAA6C,EAAlC55C,KAAKiB,MAAMmyG,EAAYO,GAClCC,EAAS,EAAI5zG,KAAKgH,IAAI2sG,GAC5B,IAAIE,EAAeptG,EAAImzC,EAEnBi6D,EAAeJ,EACjBI,EAAeJ,EACNI,EAAeH,IACxBG,EAAeH,GAEjB,MAAMI,EAAa5yF,EAAK2yF,EAAe,GAAKD,EAC5CvjG,GAAK6Q,EAAK2yF,GAAgBC,EAC1BtgF,GAAKtS,EAAK2yF,EAAe,GAAKC,EAC9BvjG,GAAK2Q,EAAK2yF,EAAe,GAAKC,EAC9B1jG,GAAK0jG,EACLN,GAAUI,CACZ,CACAlX,EAAUj2F,GAAK4J,EAAID,EACnBssF,EAAUj2F,EAAI,GAAK+sB,EAAIpjB,EACvBssF,EAAUj2F,EAAI,GAAK8J,EAAIH,EACvBssF,EAAUj2F,EAAI,GAAK2J,EAAIojG,CACzB,CACAl4G,KAAK63G,YAAa,EAClBC,EAAY93G,KAAK+3G,eAAiB9lG,EAClC,IAAK,IAAI9G,EAAI,EAAGA,EAAIi2F,EAAU7gG,OAAQ4K,GAAK,EAAG,CAC5C,IAAI4J,EAAI,EACNmjB,EAAI,EACJjjB,EAAI,EACJH,EAAI,EACJojG,EAAS,EACX,MAAMC,EAAUhtG,EAAI8sG,EACdG,EAAUhX,EAAU7gG,OAAS03G,EAAaE,EAShD,IAAK,IAAI9gE,GAAI,GAAcA,EAAI2gE,EAAS3gE,IAAK,CAC3C,MAAMghE,EAAUhhE,EAAI2gE,EACd15D,EAAW55C,KAAKiB,MAAMmyG,EAAYO,GAAWJ,EAC7CK,EAAS,EAAI5zG,KAAKgH,IAAI2sG,GAC5B,IAAIE,EAAeptG,EAAImzC,EAEnBi6D,EAAeJ,EACjBI,EAAeJ,EACNI,EAAeH,IACxBG,EAAeH,GAEjB,MAAMI,EAAapX,EAAUmX,EAAe,GAAKD,EACjDvjG,GAAKqsF,EAAUmX,GAAgBC,EAC/BtgF,GAAKkpE,EAAUmX,EAAe,GAAKC,EACnCvjG,GAAKmsF,EAAUmX,EAAe,GAAKC,EACnC1jG,GAAK0jG,EACLN,GAAUI,CACZ,CACA1yF,EAAKza,GAAK4J,EAAID,EACd8Q,EAAKza,EAAI,GAAK+sB,EAAIpjB,EAClB8Q,EAAKza,EAAI,GAAK8J,EAAIH,EAClB8Q,EAAKza,EAAI,GAAK2J,EAAIojG,CACpB,CACF,CAQApD,eAAAA,CACEtyG,EACAowG,GAEA,MAAM6F,EAAQz4G,KAAK04G,mBACnBl2G,EAAGm2G,WAAW/F,EAAiBgG,OAAQH,EACzC,CAEApQ,cAAAA,GACE,OAAqB,IAAdroG,KAAK8iC,IACd,CAEAi1E,YAAAA,GACE,IAAIc,EAAY,EAChB,MAAMhB,WAAEA,EAAUD,YAAEA,GAAgB53G,KAYpC,OAXI63G,EACED,EAAc,IAEhBiB,EAAY,EAAIjB,GAGdA,EAAc,IAEhBiB,EAAYjB,GAGTiB,EAAY74G,KAAK8iC,KAAO,GACjC,CAMA41E,gBAAAA,GACE,MAAM51E,EAAO9iC,KAAK+3G,eAClB,OAAO/3G,KAAK63G,WAAa,CAAC/0E,EAAM,GAAK,CAAC,EAAGA,EAC3C,EA5KA/iC,EADW43G,GAAI,OAYD,QAAM53G,EAZT43G,GAAI,WAd8B,CAC7C70E,KAAM,IA2B6B/iC,EAdxB43G,GAAI,mBAgBW,CAAC,WAgK7B1vG,EAAcM,SAASovG,IEtLhB,MAAMmB,WAAmBhH,GAe9BC,iBAAAA,GACE,MCtC0B,wPDuC5B,CAQAyC,SAAAA,CAAS1vG,GAA4C,IAAzCs8F,WAAWx7E,KAAEA,IAA0B9gB,EACjD,MAAMi0G,EAAar0G,KAAKmpB,MAAwB,IAAlB7tB,KAAK+4G,YACnC,IAAK,IAAI5tG,EAAI,EAAGA,EAAIya,EAAKrlB,OAAQ4K,GAAK,EACpCya,EAAKza,IAAM4tG,EACXnzF,EAAKza,EAAI,IAAM4tG,EACfnzF,EAAKza,EAAI,IAAM4tG,CAEnB,CAEA1Q,cAAAA,GACE,OAA2B,IAApBroG,KAAK+4G,UACd,CAQAjE,eAAAA,CACEtyG,EACAowG,GAEApwG,EAAGqyG,UAAUjC,EAAiBoG,YAAah5G,KAAK+4G,WAClD,EAhDAh5G,EADW+4G,GAAU,OASP,cAAY/4G,EATf+4G,GAAU,WAboC,CACzDC,WAAY,IAuB6Bh5G,EAX9B+4G,GAAU,mBAaK,CAAC,gBAuC7B7wG,EAAcM,SAASuwG,IE1EhB,MCcMG,GAAgD,CAC3DhiG,OAAQ,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,GAClEiiG,YAAY,GAmBP,MAAMC,WAIHrH,GAwBRC,iBAAAA,GACE,MDhE0B,ySCiE5B,CAQAyC,SAAAA,CAAUtyG,GACR,MACE0jB,EADgB1jB,EAAQk/F,UACPx7E,KACjBzB,EAAInkB,KAAKiX,OACTiiG,EAAal5G,KAAKk5G,WAEpB,IAAK,IAAI/tG,EAAI,EAAGA,EAAIya,EAAKrlB,OAAQ4K,GAAK,EAAG,CACvC,MAAM4J,EAAI6Q,EAAKza,GACT+sB,EAAItS,EAAKza,EAAI,GACb8J,EAAI2Q,EAAKza,EAAI,GAKnB,GAHAya,EAAKza,GAAK4J,EAAIoP,EAAE,GAAK+T,EAAI/T,EAAE,GAAKlP,EAAIkP,EAAE,GAAY,IAAPA,EAAE,GAC7CyB,EAAKza,EAAI,GAAK4J,EAAIoP,EAAE,GAAK+T,EAAI/T,EAAE,GAAKlP,EAAIkP,EAAE,GAAY,IAAPA,EAAE,GACjDyB,EAAKza,EAAI,GAAK4J,EAAIoP,EAAE,IAAM+T,EAAI/T,EAAE,IAAMlP,EAAIkP,EAAE,IAAc,IAARA,EAAE,KAC/C+0F,EAAY,CACf,MAAMpkG,EAAI8Q,EAAKza,EAAI,GACnBya,EAAKza,IAAM2J,EAAIqP,EAAE,GACjByB,EAAKza,EAAI,IAAM2J,EAAIqP,EAAE,GACrByB,EAAKza,EAAI,IAAM2J,EAAIqP,EAAE,IACrByB,EAAKza,EAAI,GACP4J,EAAIoP,EAAE,IAAM+T,EAAI/T,EAAE,IAAMlP,EAAIkP,EAAE,IAAMrP,EAAIqP,EAAE,IAAc,IAARA,EAAE,GACtD,CACF,CACF,CAQA2wF,eAAAA,CACEtyG,EACAowG,GAEA,MAAMzuF,EAAInkB,KAAKiX,OACbA,EAAS,CACPkN,EAAE,GACFA,EAAE,GACFA,EAAE,GACFA,EAAE,GACFA,EAAE,GACFA,EAAE,GACFA,EAAE,GACFA,EAAE,GACFA,EAAE,IACFA,EAAE,IACFA,EAAE,IACFA,EAAE,IACFA,EAAE,IACFA,EAAE,IACFA,EAAE,IACFA,EAAE,KAEJi1F,EAAY,CAACj1F,EAAE,GAAIA,EAAE,GAAIA,EAAE,IAAKA,EAAE,KACpC3hB,EAAG62G,iBAAiBzG,EAAiB0G,cAAc,EAAOriG,GAC1DzU,EAAGm0G,WAAW/D,EAAiB2G,WAAYH,EAC7C,CAEAj/F,QAAAA,GACE,MAAO,IACF/Z,MAAM+Z,WACTlD,OAAQ,IAAIjX,KAAKiX,QAErB,ECjIK,SAASuiG,GAAwBj4G,EAAa0V,GAAyB,IAAAwiG,EAC5E,MAAMC,GAeL35G,EAfa05G,EAAG,cAAcN,GAY7Bh/F,QAAAA,GACE,MAAO,CAAEzR,KAAM1I,KAAK0I,KAAMwwG,WAAYl5G,KAAKk5G,WAC7C,GACD,OAVe33G,GAAGxB,EAAA05G,EAAA,WAEC,CAChBP,YAAY,EACZjiG,WACDwiG,GAOH,OADAxxG,EAAcM,SAASmxG,EAAUn4G,GAC1Bm4G,CACT,CDsBE35G,EAdWo5G,GAAW,OAsBR,eAAap5G,EAtBhBo5G,GAAW,WAwBJF,IAAwBl5G,EAxB/Bo5G,GAAW,mBA0BI,CAAC,eAAgB,eA+E7ClxG,EAAcM,SAAS4wG,IC/GhB,MAAMQ,GAAUH,GACrB,UACA,CACE,MAAQ,QAAS,OAAU,EAAG,MAAO,MAAS,OAAS,OAAS,GAAG,MACnE,eAAmB,OAAS,GAAG,OAAU,EAAG,EAAG,EAAG,EAAG,IAI5CI,GAAUJ,GACrB,UACA,CACE,OAAS,QAAS,OAAU,EAAG,OAAS,OAAS,OAAS,OAAS,EACnE,OAAS,cAAkB,OAAS,EAAG,OAAS,EAAG,EAAG,EAAG,EAAG,IAInDK,GAAaL,GACxB,aACA,CACE,SAAS,QAAU,OAAU,EAAG,QAAS,OAAU,SAAS,OAAU,EACtE,QAAS,eAAoB,QAAS,EAAG,OAAS,EAAG,EAAG,EAAG,EAAG,IAIrDM,GAAcN,GACzB,cACA,CACE,SAAS,QAAU,OAAU,EAAG,QAAS,OAAU,SAAS,OAAU,GACtE,QAAU,cAAmB,QAAS,EAAG,OAAS,EAAG,EAAG,EAAG,EAAG,IAIrDO,GAAWP,GACtB,WACA,CACE,OAAO,MAAQ,KAAQ,EAAG,GAAG,KAAQ,OAAO,KAAQ,EAAG,GAAG,WAC1D,MAAO,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,IAIhBQ,GAAQR,GACnB,QACA,CACE,KAAO,KAAO,KAAO,EAAG,EAAG,KAAO,KAAO,KAAO,EAAG,EAAG,KAAO,KAAO,KACpE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,IAITS,GAAaT,GACxB,aACA,CACE,IAAK,IAAK,IAAK,GAAG,EAAI,IAAK,IAAK,IAAK,GAAG,EAAI,IAAK,IAAK,IAAK,GAAG,EAAI,EAAG,EAAG,EACxE,EAAG,ICjEA,MAAMU,WAAiBpI,GAY5BhyG,WAAAA,GAEE,IADAoC,EAAoE5B,UAAAC,OAAA,QAAAC,IAAAF,UAAA,GAAAA,UAAA,GAAG,CAAA,EAEvEF,MAAM8B,GACNlC,KAAKm6G,WAAaj4G,EAAQi4G,YAAc,EAC1C,CAQA3Y,OAAAA,CAAQt/F,GACFyvG,GAAqBzvG,KACvBA,EAAQ4gG,QAAU9iG,KAAKm6G,WAAW55G,OAAS,GAE7CP,KAAKm6G,WAAWp5G,QAASyI,IACvBA,EAAOg4F,QAAQt/F,IAEnB,CAMAiY,QAAAA,GACE,MAAO,CACLzR,KAAM1I,KAAK0I,KACXyxG,WAAYn6G,KAAKm6G,WAAW7hG,IAAK9O,GAAWA,EAAO2Q,YAEvD,CAEAkuF,cAAAA,GACE,OAAQroG,KAAKm6G,WAAWtpG,KAAMrH,IAAYA,EAAO6+F,iBACnD,CASA,iBAAO9vF,CACLlJ,EACAnN,GAEA,OAAOiS,QAAQkE,KACXhJ,EAAO8qG,YAAc,IAA6B7hG,IAAK9O,GACvDvB,EACGI,SAA4BmB,EAAOd,MACnC6P,WAAW/O,EAAQtH,KAExBsW,KAAM4hG,GAAmB,IAAIp6G,KAAK,CAAEm6G,WAAYC,IACpD,EA9DAr6G,EALWm6G,GAAQ,OAUL,YA4DhBjyG,EAAcM,SAAS2xG,IChEhB,MAAMG,WAAiBvI,GAc5BC,iBAAAA,GACE,MCrC0B,2VDsC5B,CAEA1J,cAAAA,GACE,OAAyB,IAAlBroG,KAAKs6G,QACd,CAQA9F,SAAAA,CAAS1vG,GAA4C,IAAzCs8F,WAAWx7E,KAAEA,IAA0B9gB,EACjD,MAAMw1G,EAAW51G,KAAKiB,MAAsB,IAAhB3F,KAAKs6G,UAC/BC,EAAa,KAAOD,EAAW,MAAS,KAAO,IAAMA,IAEvD,IAAK,IAAInvG,EAAI,EAAGA,EAAIya,EAAKrlB,OAAQ4K,GAAK,EACpCya,EAAKza,GAAKovG,GAAa30F,EAAKza,GAAK,KAAO,IACxCya,EAAKza,EAAI,GAAKovG,GAAa30F,EAAKza,EAAI,GAAK,KAAO,IAChDya,EAAKza,EAAI,GAAKovG,GAAa30F,EAAKza,EAAI,GAAK,KAAO,GAEpD,CAQA2pG,eAAAA,CACEtyG,EACAowG,GAEApwG,EAAGqyG,UAAUjC,EAAiB4H,UAAWx6G,KAAKs6G,SAChD,EAjDAv6G,EADWs6G,GAAQ,OAQL,YAAUt6G,EARbs6G,GAAQ,WAbkC,CACrDC,SAAU,IAsB6Bv6G,EAV5Bs6G,GAAQ,mBAYO,CAAC,cAyC7BpyG,EAAcM,SAAS8xG,IE3EhB,MAAM33G,GAAiB,CAC5B+3G,cAAe,yiBAkBfC,cAAe,2oBAoBfC,cAAe,8iBAkBfC,cAAe,4oBAoBfC,cAAe,8iBAkBfC,cAAe,4oBAoBfC,cAAe,8iBAkBfC,cAAe,6oBC9EV,MAAMC,WAAkBnJ,GAiB7B2C,WAAAA,GACE,MAAO,GAAGz0G,KAAK0I,QAAQhE,KAAKgB,KAAK1F,KAAKiX,OAAO1W,WAC3CP,KAAKk7G,OAAS,EAAI,GAEtB,CAEAnJ,iBAAAA,GACE,OAAOrvG,GAAe1C,KAAKy0G,cAC7B,CAQAD,SAAAA,CAAUtyG,GACR,MAAMk/F,EAAYl/F,EAAQk/F,UACxBx7E,EAAOw7E,EAAUx7E,KACjBu1F,EAAUn7G,KAAKiX,OACfmkG,EAAO12G,KAAKmpB,MAAMnpB,KAAKgB,KAAKy1G,EAAQ56G,SACpC86G,EAAW32G,KAAKiB,MAAMy1G,EAAO,GAC7BE,EAAKla,EAAUpvF,MACfupG,EAAKna,EAAUnvF,OACfwrE,EAASv7E,EAAQyZ,IAAI6/F,gBAAgBF,EAAIC,GACzCE,EAAMh+B,EAAO73D,KAEb81F,EAAW17G,KAAKk7G,OAAS,EAAI,EAC/B,IAAInmG,EAAGmjB,EAAGjjB,EAAGH,EAAG6mG,EAAQC,EAAKC,EAAKC,EAAQC,EAAI/vG,EAAGD,EAAGi2B,EAAIC,EAExD,IAAKl2B,EAAI,EAAGA,EAAIwvG,EAAIxvG,IAClB,IAAKC,EAAI,EAAGA,EAAIsvG,EAAItvG,IAAK,CASvB,IARA2vG,EAAwB,GAAd5vG,EAAIuvG,EAAKtvG,GAGnB+I,EAAI,EACJmjB,EAAI,EACJjjB,EAAI,EACJH,EAAI,EAECmtB,EAAK,EAAGA,EAAKm5E,EAAMn5E,IACtB,IAAKD,EAAK,EAAGA,EAAKo5E,EAAMp5E,IACtB65E,EAAM9vG,EAAIk2B,EAAKo5E,EACfO,EAAM5vG,EAAIg2B,EAAKq5E,EAGXQ,EAAM,GAAKA,GAAON,GAAMK,EAAM,GAAKA,GAAON,IAI9CQ,EAA4B,GAAlBD,EAAMP,EAAKM,GACrBG,EAAKZ,EAAQl5E,EAAKm5E,EAAOp5E,GAEzBjtB,GAAK6Q,EAAKk2F,GAAUC,EACpB7jF,GAAKtS,EAAKk2F,EAAS,GAAKC,EACxB9mG,GAAK2Q,EAAKk2F,EAAS,GAAKC,EAEnBL,IACH5mG,GAAK8Q,EAAKk2F,EAAS,GAAKC,IAI9BN,EAAIE,GAAU5mG,EACd0mG,EAAIE,EAAS,GAAKzjF,EAClBujF,EAAIE,EAAS,GAAK1mG,EAIhBwmG,EAAIE,EAAS,GAHVD,EAGe91F,EAAK+1F,EAAS,GAFd7mG,CAItB,CAEF5S,EAAQk/F,UAAY3jB,CACtB,CAQAq3B,eAAAA,CACEtyG,EACAowG,GAEApwG,EAAGw5G,WAAWpJ,EAAiBqJ,QAASj8G,KAAKiX,OAC/C,CAMAkD,QAAAA,GACE,MAAO,IACF/Z,MAAM+Z,WACT+gG,OAAQl7G,KAAKk7G,OACbjkG,OAAQ,IAAIjX,KAAKiX,QAErB,EA7GAlX,EANWk7G,GAAS,OAWN,aAAWl7G,EAXdk7G,GAAS,WA7CmC,CACvDC,QAAQ,EACRjkG,OAAQ,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,KAwDOlX,EAb7Bk7G,GAAS,mBAeM,CAAC,UAAW,UAAW,YAAa,UAuGhEhzG,EAAcM,SAAS0yG,IC7KhB,MCKDiB,GAAQ,QAqBP,MAAMC,WAAcrK,GAkBzBC,iBAAAA,GACE,MD7C0B,6ZC8C5B,CAEAjyG,WAAAA,GAAkD,IAAtCoC,EAA+B5B,UAAAC,OAAA,QAAAC,IAAAF,UAAA,GAAAA,UAAA,GAAG,CAAA,EAC5CF,MAAM8B,GACNlC,KAAKo8G,MACHl6G,EAAQk6G,OAENp8G,KAAKF,YACLsB,SAASg7G,MAAMlxG,QACrB,CAQAspG,SAAAA,CAAS1vG,GAA4C,IAAzCs8F,WAAWx7E,KAAEA,IAA0B9gB,EACjD,MAAMs3G,EAAQp8G,KAAKo8G,MACjBC,EAAO,EAAID,EAAM,GACjBE,EAAO,EAAIF,EAAM,GACjBG,EAAO,EAAIH,EAAM,GAEdp8G,KAAKw8G,YACRx8G,KAAKw8G,UAAY,CACfznG,EAAG,IAAIqwF,WAAW,KAClBltE,EAAG,IAAIktE,WAAW,KAClBnwF,EAAG,IAAImwF,WAAW,OAMtB,MAAMqX,EAAMz8G,KAAKw8G,UACjB,IAAK,IAAIrxG,EAAI,EAAGA,EAAI,IAAKA,IACvBsxG,EAAI1nG,EAAE5J,GAA+B,IAA1BzG,KAAKkR,IAAIzK,EAAI,IAAKkxG,GAC7BI,EAAIvkF,EAAE/sB,GAA+B,IAA1BzG,KAAKkR,IAAIzK,EAAI,IAAKmxG,GAC7BG,EAAIxnG,EAAE9J,GAA+B,IAA1BzG,KAAKkR,IAAIzK,EAAI,IAAKoxG,GAE/B,IAAK,IAAIpxG,EAAI,EAAGA,EAAIya,EAAKrlB,OAAQ4K,GAAK,EACpCya,EAAKza,GAAKsxG,EAAI1nG,EAAE6Q,EAAKza,IACrBya,EAAKza,EAAI,GAAKsxG,EAAIvkF,EAAEtS,EAAKza,EAAI,IAC7Bya,EAAKza,EAAI,GAAKsxG,EAAIxnG,EAAE2Q,EAAKza,EAAI,GAEjC,CAQA2pG,eAAAA,CACEtyG,EACAowG,GAEApwG,EAAGk6G,WAAW9J,EAAiB+J,OAAQ38G,KAAKo8G,MAC9C,CAEA/T,cAAAA,GACE,MAAM+T,MAAEA,GAAUp8G,KAClB,OAAoB,IAAbo8G,EAAM,IAAyB,IAAbA,EAAM,IAAyB,IAAbA,EAAM,EACnD,CAEAjiG,QAAAA,GACE,MAAO,CACLzR,KAAMwzG,GACNE,MAAOp8G,KAAKo8G,MAAMlxG,SAEtB,EAxFAnL,EADWo8G,GAAK,OAYFD,IAAKn8G,EAZRo8G,GAAK,WAb+B,CAC/CC,MAAO,CAAC,EAAG,EAAG,KA0BsBr8G,EAdzBo8G,GAAK,mBAgBU,CAAC,WA4E7Bl0G,EAAcM,SAAS4zG,ICpHhB,MAAMz5G,GAAiD,CAC5D43B,QAAS,6SAUTsiF,UAAW,iWAWXC,WAAY,yUCFP,MAAMC,WAAkBhL,GAe7B0C,SAAAA,CAAS1vG,GAA4C,IAAzCs8F,WAAWx7E,KAAEA,IAA0B9gB,EACjD,IAAK,IAAWwG,EAAPH,EAAI,EAAkBA,EAAIya,EAAKrlB,OAAQ4K,GAAK,EAAG,CACtD,MAAM4J,EAAI6Q,EAAKza,GACT+sB,EAAItS,EAAKza,EAAI,GACb8J,EAAI2Q,EAAKza,EAAI,GACnB,OAAQnL,KAAKq2G,MACX,IAAK,UACH/qG,GAASyJ,EAAImjB,EAAIjjB,GAAK,EACtB,MACF,IAAK,YACH3J,GAAS5G,KAAK8I,IAAIuH,EAAGmjB,EAAGjjB,GAAKvQ,KAAKC,IAAIoQ,EAAGmjB,EAAGjjB,IAAM,EAClD,MACF,IAAK,aACH3J,EAAQ,IAAOyJ,EAAI,IAAOmjB,EAAI,IAAOjjB,EAIzC2Q,EAAKza,EAAI,GAAKya,EAAKza,EAAI,GAAKya,EAAKza,GAAKG,CACxC,CACF,CAEAmpG,WAAAA,GACE,MAAO,GAAGz0G,KAAK0I,QAAQ1I,KAAKq2G,MAC9B,CAEAtE,iBAAAA,GACE,OAAOrvG,GAAe1C,KAAKq2G,KAC7B,CAQAvB,eAAAA,CACEtyG,EACAowG,GAGApwG,EAAG80G,UAAU1E,EAAiBmK,MADjB,EAEf,CAOA1U,cAAAA,GACE,OAAO,CACT,EACDtoG,EAlEY+8G,GAAS,OAGN,aAAW/8G,EAHd+8G,GAAS,WAXmC,CACvDzG,KAAM,YAekCt2G,EAL7B+8G,GAAS,mBAOM,CAAC,UA6D7B70G,EAAcM,SAASu0G,ICxEhB,MAAME,GAAgD,IACxD/D,GACHgE,SAAU,GAYL,MAAMC,WAAoB/D,GAc/BlC,eAAAA,GACE,MAAM/zC,EAAMljE,KAAKi9G,SAAWv4G,KAAKqB,GAC/Bo3G,EAAS3xG,GAAI03D,GACbk6C,EAAOzxG,GAAIu3D,GACXm6C,EAAS,EAAI,EACbC,EAAe54G,KAAKgB,KAAK23G,GAAUD,EACnCG,EAAc,EAAIJ,EACpBn9G,KAAKiX,OAAS,CACZkmG,EAASI,EAAc,EACvBF,EAASE,EAAcD,EACvBD,EAASE,EAAcD,EACvB,EACA,EACAD,EAASE,EAAcD,EACvBH,EAASE,EAASE,EAClBF,EAASE,EAAcD,EACvB,EACA,EACAD,EAASE,EAAcD,EACvBD,EAASE,EAAcD,EACvBH,EAASE,EAASE,EAClB,EACA,EACA,EACA,EACA,EACA,EACA,EAEJ,CAEAlV,cAAAA,GACE,OAAyB,IAAlBroG,KAAKi9G,QACd,CAEAzb,OAAAA,CAAQt/F,GACNlC,KAAKi3G,kBACL72G,MAAMohG,QAAQt/F,EAChB,CAEAiY,QAAAA,GACE,MAAO,CACLzR,KAAM1I,KAAK0I,KACXu0G,SAAUj9G,KAAKi9G,SAEnB,EAtDAl9G,EALWm9G,GAAW,OAUR,eAAan9G,EAVhBm9G,GAAW,WAYJF,IAkDpB/0G,EAAcM,SAAS20G,ICzEhB,MAAMM,WAAe1L,GAyB1B0C,SAAAA,CAAS1vG,GAA4C,IAAzCs8F,WAAWx7E,KAAEA,IAA0B9gB,EACjD,IAAK,IAAIqG,EAAI,EAAGA,EAAIya,EAAKrlB,OAAQ4K,GAAK,EACpCya,EAAKza,GAAK,IAAMya,EAAKza,GACrBya,EAAKza,EAAI,GAAK,IAAMya,EAAKza,EAAI,GAC7Bya,EAAKza,EAAI,GAAK,IAAMya,EAAKza,EAAI,GAEzBnL,KAAKk6B,QACPtU,EAAKza,EAAI,GAAK,IAAMya,EAAKza,EAAI,GAGnC,CAEU4mG,iBAAAA,GACR,MC3D0B,gfD4D5B,CAQA1J,cAAAA,GACE,OAAQroG,KAAKy9G,MACf,CAQA3I,eAAAA,CACEtyG,EACAowG,GAEApwG,EAAG80G,UAAU1E,EAAiB8K,QAAS/jG,OAAO3Z,KAAKy9G,SACnDj7G,EAAG80G,UAAU1E,EAAiB+K,OAAQhkG,OAAO3Z,KAAKk6B,OACpD,EAxDAn6B,EAPWy9G,GAAM,OAaH,UAAQz9G,EAbXy9G,GAAM,WAXgC,CACjDtjF,OAAO,EACPujF,QAAQ,IAwB6B19G,EAf1By9G,GAAM,mBAiBS,CAAC,UAAW,WAiDxCv1G,EAAcM,SAASi1G,IEhEhB,MAAMI,WAAc9L,GAazBC,iBAAAA,GACE,MCrC0B,8eDsC5B,CAQAyC,SAAAA,CAAS1vG,GAA4C,IAAzCs8F,WAAWx7E,KAAEA,IAA0B9gB,EACjD,MAAM+4G,EAAQ79G,KAAK69G,MACnB,IAAK,IAAI1yG,EAAI,EAAGA,EAAIya,EAAKrlB,OAAQ4K,GAAK,EAAG,CACvC,MAAM2yG,GAAQ,GAAMp5G,KAAK09D,UAAYy7C,EACrCj4F,EAAKza,IAAM2yG,EACXl4F,EAAKza,EAAI,IAAM2yG,EACfl4F,EAAKza,EAAI,IAAM2yG,CACjB,CACF,CAQAhJ,eAAAA,CACEtyG,EACAowG,GAEApwG,EAAGqyG,UAAUjC,EAAiBmL,OAAQ/9G,KAAK69G,MAAQ,KACnDr7G,EAAGqyG,UAAUjC,EAAiBoL,MAAOt5G,KAAK09D,SAC5C,CAEAimC,cAAAA,GACE,OAAsB,IAAfroG,KAAK69G,KACd,EAhDA99G,EADW69G,GAAK,OAOF,SAAO79G,EAPV69G,GAAK,WAd+B,CAC/CC,MAAO,IAsB6B99G,EATzB69G,GAAK,mBAWU,CAAC,SAAU,UAyCvC31G,EAAcM,SAASq1G,IErDhB,MAAMK,WAAiBnM,GAe5B0C,SAAAA,CAAS1vG,GAA2D,IAAxDs8F,WAAWx7E,KAAEA,EAAI5T,MAAEA,EAAKC,OAAEA,IAA4BnN,EAChE,IAAK,IAAIqG,EAAI,EAAGA,EAAI8G,EAAQ9G,GAAKnL,KAAKk+G,UACpC,IAAK,IAAI7mE,EAAI,EAAGA,EAAIrlC,EAAOqlC,GAAKr3C,KAAKk+G,UAAW,CAC9C,MAAMl1G,EAAY,EAAJmC,EAAQ6G,EAAY,EAAJqlC,EACxBtiC,EAAI6Q,EAAK5c,GACTkvB,EAAItS,EAAK5c,EAAQ,GACjBiM,EAAI2Q,EAAK5c,EAAQ,GACjB8L,EAAI8Q,EAAK5c,EAAQ,GAEvB,IAAK,IAAIm1G,EAAKhzG,EAAGgzG,EAAKz5G,KAAK8I,IAAIrC,EAAInL,KAAKk+G,UAAWjsG,GAASksG,IAC1D,IAAK,IAAIC,EAAK/mE,EAAG+mE,EAAK15G,KAAK8I,IAAI6pC,EAAIr3C,KAAKk+G,UAAWlsG,GAAQosG,IAAM,CAC/D,MAAMp1G,EAAa,EAALm1G,EAASnsG,EAAa,EAALosG,EAC/Bx4F,EAAK5c,GAAS+L,EACd6Q,EAAK5c,EAAQ,GAAKkvB,EAClBtS,EAAK5c,EAAQ,GAAKiM,EAClB2Q,EAAK5c,EAAQ,GAAK8L,CACpB,CAEJ,CAEJ,CAKAuzF,cAAAA,GACE,OAA0B,IAAnBroG,KAAKk+G,SACd,CAEUnM,iBAAAA,GACR,MCnE0B,ojBDoE5B,CAQA+C,eAAAA,CACEtyG,EACAowG,GAEApwG,EAAGqyG,UAAUjC,EAAiByL,WAAYr+G,KAAKk+G,UACjD,EACDn+G,EA5DYk+G,GAAQ,OAGL,YAAUl+G,EAHbk+G,GAAQ,WAbkC,CACrDC,UAAW,IAiB4Bn+G,EAL5Bk+G,GAAQ,mBAOO,CAAC,eAuD7Bh2G,EAAcM,SAAS01G,IExDhB,MAAMK,WAAoBxM,GA2B/BC,iBAAAA,GACE,MCxD0B,oUDyD5B,CAMAyC,SAAAA,CAAS1vG,GAA4C,IAAzCs8F,WAAWx7E,KAAEA,IAA0B9gB,EACjD,MAAMw5C,EAA2B,IAAhBt+C,KAAKs+C,SACpBllC,EAAS,IAAI2f,GAAM/4B,KAAKg5B,OAAOQ,YAC/B+kF,EAAO,CAACnlG,EAAO,GAAKklC,EAAUllC,EAAO,GAAKklC,EAAUllC,EAAO,GAAKklC,GAChEkgE,EAAQ,CACNplG,EAAO,GAAKklC,EACZllC,EAAO,GAAKklC,EACZllC,EAAO,GAAKklC,GAGhB,IAAK,IAAInzC,EAAI,EAAGA,EAAIya,EAAKrlB,OAAQ4K,GAAK,EAAG,CACvC,MAAM4J,EAAI6Q,EAAKza,GACT+sB,EAAItS,EAAKza,EAAI,GACb8J,EAAI2Q,EAAKza,EAAI,GAGjB4J,EAAIwpG,EAAK,IACTrmF,EAAIqmF,EAAK,IACTtpG,EAAIspG,EAAK,IACTxpG,EAAIypG,EAAM,IACVtmF,EAAIsmF,EAAM,IACVvpG,EAAIupG,EAAM,KAEV54F,EAAKza,EAAI,GAAK,EAElB,CACF,CAQA2pG,eAAAA,CACEtyG,EACAowG,GAEA,MAAMx5F,EAAS,IAAI2f,GAAM/4B,KAAKg5B,OAAOQ,YACnC8kB,EAAWt+C,KAAKs+C,SAChBigE,EAAO,CACL,EAAInlG,EAAO,GAAK,IAAMklC,EACtB,EAAIllC,EAAO,GAAK,IAAMklC,EACtB,EAAIllC,EAAO,GAAK,IAAMklC,EACtB,GAEFkgE,EAAQ,CACNplG,EAAO,GAAK,IAAMklC,EAClBllC,EAAO,GAAK,IAAMklC,EAClBllC,EAAO,GAAK,IAAMklC,EAClB,GAEJ97C,EAAGm0G,WAAW/D,EAAiB6L,KAAMF,GACrC/7G,EAAGm0G,WAAW/D,EAAiB8L,MAAOF,EACxC,EA1EAz+G,EAfWu+G,GAAW,OAqBR,eAAav+G,EArBhBu+G,GAAW,WAhBqC,CAC3DtlF,MAAO,UACPslB,SAAU,IACVqgE,UAAU,IAoCgC5+G,EAvB/Bu+G,GAAW,mBAyBI,CAAC,OAAQ,UAmErCr2G,EAAcM,SAAS+1G,IEnEhB,MAAMM,WAAe9M,GAsC1BgD,eAAAA,CAEEtyG,EACAowG,GAEApwG,EAAGm2G,WACD/F,EAAiBgG,OACjB54G,KAAK63G,WAAa,CAAC,EAAI73G,KAAKgS,MAAO,GAAK,CAAC,EAAG,EAAIhS,KAAKiS,SAEvDzP,EAAGw5G,WAAWpJ,EAAiBiM,MAAO7+G,KAAK8+G,KAC7C,CAEAC,eAAAA,GACE,MAAMjjG,EAAQ9b,KAAKg/G,UACnB,OAAOt6G,KAAKosC,KAAK9wC,KAAKi/G,aAAenjG,EACvC,CAEA24F,WAAAA,GACE,MAAMyK,EAAel/G,KAAK++G,kBAC1B,MAAO,GAAG/+G,KAAK0I,QAAQw2G,GACzB,CAEAnN,iBAAAA,GACE,MAAMmN,EAAel/G,KAAK++G,kBAC1B,OAAO/+G,KAAKm/G,eAAeD,EAC7B,CAEAE,OAAAA,GACE,MAAMC,EAAer/G,KAAKs/G,cAAct/G,KAAKi/G,cAC3CnjG,EAAQ9b,KAAKg/G,UACbE,EAAel/G,KAAK++G,kBACpBD,EAAO,IAAIl9G,MAAMs9G,GACnB,IAAK,IAAI/zG,EAAI,EAAGA,GAAK+zG,EAAc/zG,IACjC2zG,EAAK3zG,EAAI,GAAKk0G,EAAal0G,EAAI2Q,GAEjC,OAAOgjG,CACT,CAMAK,cAAAA,CAAeD,GACb,MAAM/9E,EAAU,IAAIv/B,MAAMs9G,GAC1B,IAAK,IAAI/zG,EAAI,EAAGA,GAAK+zG,EAAc/zG,IACjCg2B,EAAQh2B,EAAI,GAAK,GAAGA,eAEtB,MAAO,2JAKiB+zG,qHAIlB/9E,EACC7oB,IACC,CAAC0E,EAAQ7R,IAAM,4DAC8B6R,cAAmB7R,wCAAwC6R,cAAmB7R,yCACpGA,qBAGxB2O,KAAK,2DAId,CAEAylG,eAAAA,CAA+Cr9G,GAC7CA,EAAQ4gG,SACR9iG,KAAKgS,MAAQ9P,EAAQ8+F,YACrBhhG,KAAK63G,YAAa,EAClB73G,KAAKw/G,GAAK96G,KAAKmpB,MAAM7tB,KAAKgS,MAAQhS,KAAK6V,QACvC7V,KAAKy/G,GAAKv9G,EAAQ++F,aAClBjhG,KAAKg/G,UAAYh/G,KAAKw/G,GAAKx/G,KAAKgS,MAChChS,KAAK8+G,KAAO9+G,KAAKo/G,UACjBl9G,EAAQsgG,iBAAmBxiG,KAAKw/G,GAChCp/G,MAAMohG,QAAQt/F,GACdA,EAAQ8+F,YAAc9+F,EAAQsgG,iBAE9BxiG,KAAKiS,OAAS/P,EAAQ++F,aACtBjhG,KAAK63G,YAAa,EAClB73G,KAAKy/G,GAAK/6G,KAAKmpB,MAAM7tB,KAAKiS,OAASjS,KAAK8V,QACxC9V,KAAKg/G,UAAYh/G,KAAKy/G,GAAKz/G,KAAKiS,OAChCjS,KAAK8+G,KAAO9+G,KAAKo/G,UACjBl9G,EAAQugG,kBAAoBziG,KAAKy/G,GACjCr/G,MAAMohG,QAAQt/F,GACdA,EAAQ++F,aAAe/+F,EAAQugG,iBACjC,CAcAjB,OAAAA,CAAQt/F,GACFyvG,GAAqBzvG,GACtBlC,KAA4Cu/G,gBAAgBr9G,GAE5DlC,KAAyCw0G,UAAUtyG,EAExD,CAEAmmG,cAAAA,GACE,OAAuB,IAAhBroG,KAAK6V,QAAgC,IAAhB7V,KAAK8V,MACnC,CAEAwpG,aAAAA,CAAcI,GACZ,OAAQ1zG,IACN,GAAIA,GAAK0zG,GAAS1zG,IAAM0zG,EACtB,OAAO,EAET,GAAI1zG,EAAI,cAAgBA,gBACtB,OAAO,EAGT,MAAM2zG,GADN3zG,GAAKtH,KAAKqB,IACK25G,EACf,OAASh7G,KAAKiH,IAAIK,GAAKA,EAAKtH,KAAKiH,IAAIg0G,GAAOA,EAEhD,CAEAnL,SAAAA,CAAsCtyG,GACpC,MAAMk/F,EAAYl/F,EAAQk/F,UACxBvrF,EAAS7V,KAAK6V,OACdC,EAAS9V,KAAK8V,OAEhB9V,KAAK4/G,UAAY,EAAI/pG,EACrB7V,KAAK6/G,UAAY,EAAI/pG,EAErB,MAAMgqG,EAAK1e,EAAUpvF,MACf+tG,EAAK3e,EAAUnvF,OACfutG,EAAK96G,KAAKmpB,MAAMiyF,EAAKjqG,GACrB4pG,EAAK/6G,KAAKmpB,MAAMkyF,EAAKjqG,GAC3B,IAAIkqG,EAGFA,EADsB,cAApBhgH,KAAKigH,WACGjgH,KAAKkgH,WAAWh+G,EAAS49G,EAAIC,EAAIP,EAAIC,GAClB,YAApBz/G,KAAKigH,WACJjgH,KAAKmgH,kBAAkBj+G,EAAS49G,EAAIC,EAAIP,EAAIC,GACzB,aAApBz/G,KAAKigH,WACJjgH,KAAKogH,kBAAkBl+G,EAAS49G,EAAIC,EAAIP,EAAIC,GACzB,YAApBz/G,KAAKigH,WACJjgH,KAAKqgH,cAAcn+G,EAAS49G,EAAIC,EAAIP,EAAIC,GAGxC,IAAI/Z,UAAU8Z,EAAIC,GAE9Bv9G,EAAQk/F,UAAY4e,CACtB,CAWAE,UAAAA,CACEh+G,EACA49G,EACAC,EACAP,EACAC,GAEA,MAAMre,EAAYl/F,EAAQk/F,UACpBkf,EAAO,GACb,IAAIC,GAAQ,EACRC,GAAQ,EACRC,EAAQX,EAAKQ,EACbI,EAAQX,EAAKO,EACjB,MAAMpJ,EAAYh1G,EAAQq/F,cAAc2V,UACxC,IAAIvO,EAAK,EACLC,EAAK,EACT,MAAM+X,EAAKb,EACX,IAAIc,EAAK,EACJ1J,EAAUgJ,aACbhJ,EAAUgJ,WAAa1sG,MAEzB,MAAMqtG,EAAY3J,EAAUgJ,YACxBW,EAAU7uG,MAAa,IAAL8tG,GAAYe,EAAU5uG,OAAS8tG,KACnDc,EAAU7uG,MAAa,IAAL8tG,EAClBe,EAAU5uG,OAAS8tG,GAErB,MAAMpkG,EAAMklG,EAAUz9G,WAAW,MAOjC,IANAuY,EAAIqF,UAAU,EAAG,EAAQ,IAAL8+F,EAAUC,GAC9BpkG,EAAI+lF,aAAaN,EAAW,EAAG,GAE/Boe,EAAK96G,KAAKiB,MAAM65G,GAChBC,EAAK/6G,KAAKiB,MAAM85G,IAERc,IAAUC,GAChBV,EAAKW,EACLV,EAAKW,EACDlB,EAAK96G,KAAKiB,MAAM86G,EAAQH,GAC1BG,EAAQ/7G,KAAKiB,MAAM86G,EAAQH,IAE3BG,EAAQjB,EACRe,GAAQ,GAENd,EAAK/6G,KAAKiB,MAAM+6G,EAAQJ,GAC1BI,EAAQh8G,KAAKiB,MAAM+6G,EAAQJ,IAE3BI,EAAQjB,EACRe,GAAQ,GAEV7kG,EAAIwH,UAAU09F,EAAWlY,EAAIC,EAAIkX,EAAIC,EAAIY,EAAIC,EAAIH,EAAOC,GACxD/X,EAAKgY,EACL/X,EAAKgY,EACLA,GAAMF,EAER,OAAO/kG,EAAIorC,aAAa4hD,EAAIC,EAAI4W,EAAIC,EACtC,CAWAY,aAAAA,CAEEn+G,EACA49G,EACAC,EACAP,EACAC,GA2DA,MAAMqB,EAAU5+G,EAAQk/F,UAAUx7E,KAChCm7F,EAAU7+G,EAAQyZ,IAAI6/F,gBAAgBgE,EAAIC,GAC1CuB,EAAWD,EAAQn7F,KACnBq7F,EAAUjhH,KAAKs/G,cAAct/G,KAAKi/G,cAClCiC,EAASlhH,KAAK4/G,UACduB,EAASnhH,KAAK6/G,UACduB,EAAY,EAAIphH,KAAK4/G,UACrByB,EAAY,EAAIrhH,KAAK6/G,UACrByB,EAAU58G,KAAKosC,KAAMowE,EAASlhH,KAAKi/G,aAAgB,GACnDsC,EAAU78G,KAAKosC,KAAMqwE,EAASnhH,KAAKi/G,aAAgB,GACnDuC,EAAoD,CAAA,EACpDz8F,EAAa,CAAE/Y,EAAG,EAAGD,EAAG,GACxB01G,EAAc,CAAEz1G,EAAG,EAAGD,EAAG,GAE3B,OAvEA,SAAS21G,EAAQC,GACf,IAAI1/F,EAAG9W,EAAGmtG,EAAQ/sG,EAAKuJ,EAAGshB,EAAKjE,EAAO9C,EAAM6K,EAAO0nF,EAAIC,EAGvD,IAFA98F,EAAO/Y,GAAK21G,EAAI,IAAOT,EACvBO,EAAQz1G,EAAItH,KAAKiB,MAAMof,EAAO/Y,GACzBiW,EAAI,EAAGA,EAAIw9F,EAAIx9F,IAAK,CAQvB,IAPA8C,EAAOhZ,GAAKkW,EAAI,IAAOk/F,EACvBM,EAAQ11G,EAAIrH,KAAKiB,MAAMof,EAAOhZ,GAC9B+I,EAAI,EACJshB,EAAM,EACNjE,EAAQ,EACR9C,EAAO,EACP6K,EAAQ,EACH/uB,EAAIs2G,EAAQz1G,EAAIs1G,EAASn2G,GAAKs2G,EAAQz1G,EAAIs1G,EAASn2G,IACtD,KAAIA,EAAI,GAAKA,GAAK20G,GAAlB,CAGA8B,EAAKl9G,KAAKiB,MAAM,IAAOjB,KAAKgH,IAAIP,EAAI4Z,EAAO/Y,IACtCw1G,EAAUI,KACbJ,EAAUI,GAAM,CAAA,GAElB,IAAK,IAAIvqE,EAAIoqE,EAAQ11G,EAAIw1G,EAASlqE,GAAKoqE,EAAQ11G,EAAIw1G,EAASlqE,IACtDA,EAAI,GAAKA,GAAK0oE,IAGlB8B,EAAKn9G,KAAKiB,MAAM,IAAOjB,KAAKgH,IAAI2rC,EAAItyB,EAAOhZ,IACtCy1G,EAAUI,GAAIC,KACjBL,EAAUI,GAAIC,GAAMZ,EAClBv8G,KAAKgB,KACHhB,KAAKkR,IAAIgsG,EAAKR,EAAW,GAAK18G,KAAKkR,IAAIisG,EAAKR,EAAW,IACrD,MAGR/I,EAASkJ,EAAUI,GAAIC,GACnBvJ,EAAS,IACX/sG,EAAqB,GAAd8rC,EAAIyoE,EAAK30G,GAChB2J,GAAKwjG,EACLliF,GAAOkiF,EAASwI,EAAQv1G,GACxB4mB,GAASmmF,EAASwI,EAAQv1G,EAAM,GAChC8jB,GAAQipF,EAASwI,EAAQv1G,EAAM,GAC/B2uB,GAASo+E,EAASwI,EAAQv1G,EAAM,IAxBpC,CA4BFA,EAAqB,GAAd0W,EAAIu9F,EAAKmC,GAChBX,EAASz1G,GAAO6qB,EAAMthB,EACtBksG,EAASz1G,EAAM,GAAK4mB,EAAQrd,EAC5BksG,EAASz1G,EAAM,GAAK8jB,EAAOva,EAC3BksG,EAASz1G,EAAM,GAAK2uB,EAAQplB,CAC9B,CAEA,QAAM6sG,EAAInC,EACDkC,EAAQC,GAERZ,CAEX,CAgBOW,CAAQ,EACjB,CAWAtB,iBAAAA,CAEEl+G,EACA49G,EACAC,EACAP,EACAC,GAEA,IAAI3qG,EACAG,EACA8uB,EACAv5B,EACAwB,EACAD,EACAZ,EACAksC,EACAyqE,EACAC,EACAC,EACAhpF,EAEAipF,EADAjlG,EAAS,EAEb,MAAMkkG,EAASlhH,KAAK4/G,UACduB,EAASnhH,KAAK6/G,UACdqC,EAAK,GAAKpC,EAAK,GAEfqC,EADMjgH,EAAQk/F,UACDx7E,KACbw8F,EAAYlgH,EAAQyZ,IAAI6/F,gBAAgBgE,EAAIC,GAC5C4C,EAAaD,EAAUx8F,KAC7B,IAAKza,EAAI,EAAGA,EAAIs0G,EAAIt0G,IAClB,IAAKksC,EAAI,EAAGA,EAAImoE,EAAInoE,IAOlB,IANArrC,EAAItH,KAAKiB,MAAMu7G,EAAS7pE,GACxBtrC,EAAIrH,KAAKiB,MAAMw7G,EAASh2G,GACxB22G,EAAQZ,EAAS7pE,EAAIrrC,EACrB+1G,EAAQZ,EAASh2G,EAAIY,EACrBk2G,EAAU,GAAKl2G,EAAI+zG,EAAK9zG,GAEnBg2G,EAAO,EAAGA,EAAO,EAAGA,IACvBltG,EAAIqtG,EAAOF,EAAUD,GACrB/sG,EAAIktG,EAAOF,EAAU,EAAID,GACzBj+E,EAAIo+E,EAAOF,EAAUC,EAAKF,GAC1Bx3G,EAAI23G,EAAOF,EAAUC,EAAK,EAAIF,GAC9BhpF,EACElkB,GAAK,EAAIgtG,IAAU,EAAIC,GACvB9sG,EAAI6sG,GAAS,EAAIC,GACjBh+E,EAAIg+E,GAAS,EAAID,GACjBt3G,EAAIs3G,EAAQC,EACdM,EAAWrlG,KAAYgc,EAI7B,OAAOopF,CACT,CAWAjC,iBAAAA,CAEEj+G,EACA49G,EACAC,EACAP,EACAC,GAEA,MAAM6C,EAAStiH,KAAK4/G,UAClB2C,EAASviH,KAAK6/G,UACd2C,EAAa99G,KAAKosC,KAAKwxE,EAAS,GAChCG,EAAa/9G,KAAKosC,KAAKyxE,EAAS,GAEhC38F,EADM1jB,EAAQk/F,UACHx7E,KACX88F,EAAOxgH,EAAQyZ,IAAI6/F,gBAAgBgE,EAAIC,GACvCkD,EAAQD,EAAK98F,KACf,IAAK,IAAIyxB,EAAI,EAAGA,EAAIooE,EAAIpoE,IACtB,IAAK,IAAIlsC,EAAI,EAAGA,EAAIq0G,EAAIr0G,IAAK,CAC3B,MAAMoyD,EAAoB,GAAdpyD,EAAIksC,EAAImoE,GACpB,IAAIlH,EAAS,EACT6C,EAAU,EACVyH,EAAe,EACfC,EAAM,EACNC,EAAM,EACNC,EAAM,EACNC,EAAM,EACV,MAAM9mE,GAAW7E,EAAI,IAAOkrE,EAC5B,IAAK,IAAIU,EAAKv+G,KAAKiB,MAAM0xC,EAAIkrE,GAASU,GAAM5rE,EAAI,GAAKkrE,EAAQU,IAAM,CACjE,MAAMt1G,EAAKjJ,KAAKgH,IAAIwwC,GAAW+mE,EAAK,KAAQR,EAC1CxmE,GAAW9wC,EAAI,IAAOm3G,EACtBY,EAAKv1G,EAAKA,EACZ,IAAK,IAAIgyG,EAAKj7G,KAAKiB,MAAMwF,EAAIm3G,GAAS3C,GAAMx0G,EAAI,GAAKm3G,EAAQ3C,IAAM,CACjE,IAAIjyG,EAAKhJ,KAAKgH,IAAIuwC,GAAW0jE,EAAK,KAAQ6C,EAC1C,MAAMl0E,EAAI5pC,KAAKgB,KAAKw9G,EAAKx1G,EAAKA,GAE1B4gC,EAAI,GAAKA,OAIbgqE,EAAS,EAAIhqE,EAAIA,EAAIA,EAAI,EAAIA,EAAIA,EAAI,EACjCgqE,EAAS,IACX5qG,EAAK,GAAKiyG,EAAKsD,EAAKnD,GAEpBkD,GAAO1K,EAAS1yF,EAAKlY,EAAK,GAC1Bk1G,GAAgBtK,EAEZ1yF,EAAKlY,EAAK,GAAK,MACjB4qG,EAAUA,EAAS1yF,EAAKlY,EAAK,GAAM,KAErCm1G,GAAOvK,EAAS1yF,EAAKlY,GACrBo1G,GAAOxK,EAAS1yF,EAAKlY,EAAK,GAC1Bq1G,GAAOzK,EAAS1yF,EAAKlY,EAAK,GAC1BytG,GAAW7C,GAGf,CACF,CACAqK,EAAMplD,GAAMslD,EAAM1H,EAClBwH,EAAMplD,EAAK,GAAKulD,EAAM3H,EACtBwH,EAAMplD,EAAK,GAAKwlD,EAAM5H,EACtBwH,EAAMplD,EAAK,GAAKylD,EAAMJ,CACxB,CAEF,OAAOF,CACT,EApdA3iH,EApBW6+G,GAAM,OA0BH,UAAQ7+G,EA1BX6+G,GAAM,WA/BgC,CACjDqB,WAAY,UACZpqG,OAAQ,EACRC,OAAQ,EACRmpG,aAAc,IAuDuBl/G,EA5B1B6+G,GAAM,mBA8BS,CAAC,SAAU,UA6cvC32G,EAAcM,SAASq2G,IC1gBhB,MAAMuE,WAAmBrR,GAgB9BC,iBAAAA,GACE,MCvC0B,mhBDwC5B,CAQAyC,SAAAA,CAAS1vG,GAA4C,IAAzCs8F,WAAWx7E,KAAEA,IAA0B9gB,EACjD,MAAMs+G,GAAUpjH,KAAKqjH,WACrB,IAAK,IAAIl4G,EAAI,EAAGA,EAAIya,EAAKrlB,OAAQ4K,GAAK,EAAG,CACvC,MAAM4J,EAAI6Q,EAAKza,GACT+sB,EAAItS,EAAKza,EAAI,GACb8J,EAAI2Q,EAAKza,EAAI,GACbxG,EAAMD,KAAKC,IAAIoQ,EAAGmjB,EAAGjjB,GAC3B2Q,EAAKza,IAAMxG,IAAQoQ,GAAKpQ,EAAMoQ,GAAKquG,EAAS,EAC5Cx9F,EAAKza,EAAI,IAAMxG,IAAQuzB,GAAKvzB,EAAMuzB,GAAKkrF,EAAS,EAChDx9F,EAAKza,EAAI,IAAMxG,IAAQsQ,GAAKtQ,EAAMsQ,GAAKmuG,EAAS,CAClD,CACF,CAQAtO,eAAAA,CACEtyG,EACAowG,GAEApwG,EAAGqyG,UAAUjC,EAAiB0Q,aAActjH,KAAKqjH,WACnD,CAEAhb,cAAAA,GACE,OAA2B,IAApBroG,KAAKqjH,UACd,EArDAtjH,EADWojH,GAAU,OAUP,cAAYpjH,EAVfojH,GAAU,WAboC,CACzDE,WAAY,IAwB6BtjH,EAZ9BojH,GAAU,mBAcK,CAAC,gBA2C7Bl7G,EAAcM,SAAS46G,IEzDhB,MAAMI,WAAiBzR,GAgB5BC,iBAAAA,GACE,MCvC0B,qjBDwC5B,CAQAyC,SAAAA,CAAS1vG,GAA4C,IAAzCs8F,WAAWx7E,KAAEA,IAA0B9gB,EACjD,MAAMs+G,GAAUpjH,KAAKwjH,SACrB,IAAK,IAAIr4G,EAAI,EAAGA,EAAIya,EAAKrlB,OAAQ4K,GAAK,EAAG,CACvC,MAAM4J,EAAI6Q,EAAKza,GACT+sB,EAAItS,EAAKza,EAAI,GACb8J,EAAI2Q,EAAKza,EAAI,GACbxG,EAAMD,KAAKC,IAAIoQ,EAAGmjB,EAAGjjB,GACrB6jB,GAAO/jB,EAAImjB,EAAIjjB,GAAK,EACpBwuG,EAA8B,EAAtB/+G,KAAKgH,IAAI/G,EAAMm0B,GAAY,IAAOsqF,EAChDx9F,EAAKza,IAAMxG,IAAQoQ,GAAKpQ,EAAMoQ,GAAK0uG,EAAM,EACzC79F,EAAKza,EAAI,IAAMxG,IAAQuzB,GAAKvzB,EAAMuzB,GAAKurF,EAAM,EAC7C79F,EAAKza,EAAI,IAAMxG,IAAQsQ,GAAKtQ,EAAMsQ,GAAKwuG,EAAM,CAC/C,CACF,CAQA3O,eAAAA,CACEtyG,EACAowG,GAEApwG,EAAGqyG,UAAUjC,EAAiB8Q,WAAY1jH,KAAKwjH,SACjD,CAEAnb,cAAAA,GACE,OAAyB,IAAlBroG,KAAKwjH,QACd,EAvDAzjH,EADWwjH,GAAQ,OAUL,YAAUxjH,EAVbwjH,GAAQ,WAbkC,CACrDC,SAAU,IAwB6BzjH,EAZ5BwjH,GAAQ,mBAcO,CAAC,cA6C7Bt7G,EAAcM,SAASg7G,6fEtEhB,cAA0BlrC,GAS/Bv4E,WAAAA,CAAYqD,GACV/C,MAAM+C,GATRpD,eAIQ,IAMNC,KAAKsqB,OAAS,EAChB,CAMAq5F,OAAAA,CAAQl2F,GACN,MAAMlN,EAAQvgB,KAAK4jH,SAASn2F,GAC1B9R,EAAM3b,KAAKmD,OAAOmuC,WACpBtxC,KAAKs4E,kBAAkB38D,GACvB3b,KAAK6jH,IAAIloG,EAAK4E,GACd5E,EAAI6G,SACN,CAEAqhG,GAAAA,CAAIloG,EAA+B4E,GACjC5E,EAAIsI,UAAY1D,EAAMmD,KACtB/H,EAAIkI,YACJlI,EAAIy+B,IAAI75B,EAAMvU,EAAGuU,EAAMxU,EAAGwU,EAAMwiD,OAAQ,EAAa,EAAVr+D,KAAKqB,IAAQ,GACxD4V,EAAIqI,YACJrI,EAAI+H,MACN,CAKAuvD,WAAAA,CAAYxlD,GACVztB,KAAKsqB,OAAS,GACdtqB,KAAKmD,OAAO4d,aAAa/gB,KAAKmD,OAAOmuC,YACrCtxC,KAAKiyC,aACLjyC,KAAK2jH,QAAQl2F,EACf,CAMAylB,OAAAA,GACE,MAAMv3B,EAAM3b,KAAKmD,OAAOmuC,WACtBhnB,EAAStqB,KAAKsqB,OAChBtqB,KAAKs4E,kBAAkB38D,GACvB,IAAK,IAAIxQ,EAAI,EAAGA,EAAImf,EAAO/pB,OAAQ4K,IACjCnL,KAAK6jH,IAAIloG,EAAK2O,EAAOnf,IAEvBwQ,EAAI6G,SACN,CAMA4qD,WAAAA,CAAY3/C,IACuB,IAA7BztB,KAAKg6E,qBAAgCh6E,KAAKy4E,iBAAiBhrD,KAG3DztB,KAAKu4E,mBACPv4E,KAAKmD,OAAO4d,aAAa/gB,KAAKmD,OAAOmuC,YACrCtxC,KAAK4jH,SAASn2F,GACdztB,KAAKkzC,WAELlzC,KAAK2jH,QAAQl2F,GAEjB,CAKA0lD,SAAAA,GACE,MAAM2wC,EAA4B9jH,KAAKmD,OAAOmb,kBAC9Cte,KAAKmD,OAAOmb,mBAAoB,EAEhC,MAAMylG,EAAoB,GAE1B,IAAK,IAAI54G,EAAI,EAAGA,EAAInL,KAAKsqB,OAAO/pB,OAAQ4K,IAAK,CAC3C,MAAMoV,EAAQvgB,KAAKsqB,OAAOnf,GACxB64G,EAAS,IAAIlpC,GAAO,CAClB/X,OAAQxiD,EAAMwiD,OACdjxD,KAAMyO,EAAMvU,EACZ+F,IAAKwO,EAAMxU,EACXmhB,QAAS3mB,EACT4mB,QAAS5mB,EACTmd,KAAMnD,EAAMmD,OAGhB1jB,KAAK69B,SAAWmmF,EAAOnmF,OAAS,IAAI8E,GAAO3iC,KAAK69B,SAEhDkmF,EAAQ35G,KAAK45G,EACf,CACA,MAAMt3E,EAAQ,IAAI6oB,GAAMwuD,EAAS,CAAE5gH,OAAQnD,KAAKmD,SAEhDnD,KAAKmD,OAAO4H,KAAK,sBAAuB,CAAEmX,KAAMwqB,IAChD1sC,KAAKmD,OAAO8I,IAAIygC,GAChB1sC,KAAKmD,OAAO4H,KAAK,eAAgB,CAAEmX,KAAMwqB,IAEzC1sC,KAAKmD,OAAO4d,aAAa/gB,KAAKmD,OAAOmuC,YACrCtxC,KAAKw4E,eACLx4E,KAAKmD,OAAOmb,kBAAoBwlG,EAChC9jH,KAAKmD,OAAOsc,kBACd,CAMAmkG,QAAAA,CAAQ9+G,GAAkB,IAAjBkH,EAAEA,EAACD,EAAEA,GAAUjH,EACtB,MAAMm/G,EAAiC,CACrCj4G,IACAD,IACAg3D,OAAQZ,GAAaz9D,KAAKC,IAAI,EAAG3E,KAAKgS,MAAQ,IAAKhS,KAAKgS,MAAQ,IAAM,EACtE0R,KAAM,IAAIqV,GAAM/4B,KAAKg5B,OAAOiB,SAASkoC,GAAa,EAAG,KAAO,KAAKzoC,UAKnE,OAFA15B,KAAKsqB,OAAOlgB,KAAK65G,GAEVA,CACT,sWCnIK,cAA2BzqC,GAGhC15E,WAAAA,CAAYqD,GACV/C,MAAM+C,EACR,CAEA+gH,aAAAA,GACE,MAEEC,EAAgB3wG,KAChB4wG,EAAaD,EAAc/gH,WAAW,MAiBxC,OAfA+gH,EAAcnyG,MAAQmyG,EAAclyG,OAASoyG,GACzCD,IACFA,EAAWngG,UAAYjkB,KAAKg5B,MAC5BorF,EAAWvgG,YACXugG,EAAWhqE,IACTiqE,GACAA,GACAA,GACA,EACU,EAAV3/G,KAAKqB,IACL,GAEFq+G,EAAWpgG,YACXogG,EAAW1gG,QAENygG,CACT,CAMAG,UAAAA,CAAW3oG,GACT,OAAOA,EAAI85B,cAAcz1C,KAAKoZ,QAAUpZ,KAAKkkH,gBAAiB,SAChE,CAMAn5C,eAAAA,CAAgBpvD,GACdvb,MAAM2qE,gBAAgBpvD,GACtB,MAAM4oG,EAAUvkH,KAAKskH,WAAW3oG,GAChC4oG,IAAY5oG,EAAIw4B,YAAcowE,EAChC,CAKAlqC,UAAAA,CAAWnY,GACT,MAAMhgD,EAAO9hB,MAAMi6E,WAAWnY,GAC5BsiD,EAAUtiG,EAAKytB,oBAAoBvjC,UAAU8V,EAAKkb,YAAc,GAOlE,OALAlb,EAAK0b,OAAS,IAAI+5C,GAAQ,CACxBv+D,OAAQpZ,KAAKoZ,QAAUpZ,KAAKkkH,gBAC5B7pG,SAAUmqG,EAAQx4G,EAClBkY,SAAUsgG,EAAQz4G,IAEbmW,CACT,6FCtCK,cAAyBm2D,GA8C9Bv4E,WAAAA,CAAYqD,GACV/C,MAAM+C,GA9CRpD,eAIQ,IAERA,iBAIU,IAEVA,kBAIW,GAEXA,0BAImB,GAEnBA,wBAIgB,GAEhBA,8BAIsB,GAapBC,KAAKykH,YAAc,GACnBzkH,KAAK0kH,WAAa,EACpB,CAMAzxC,WAAAA,CAAYxlD,GACVztB,KAAKykH,YAAc,GACnBzkH,KAAKmD,OAAO4d,aAAa/gB,KAAKmD,OAAOmuC,YACrCtxC,KAAKiyC,aAELjyC,KAAK2kH,cAAcl3F,GACnBztB,KAAK4kH,aAAa5kH,KAAK0kH,WACzB,CAMAt3C,WAAAA,CAAY3/C,IACuB,IAA7BztB,KAAKg6E,qBAAgCh6E,KAAKy4E,iBAAiBhrD,KAG/DztB,KAAK2kH,cAAcl3F,GACnBztB,KAAK4kH,aAAa5kH,KAAK0kH,YACzB,CAKAvxC,SAAAA,GACE,MAAM2wC,EAA4B9jH,KAAKmD,OAAOmb,kBAC9Cte,KAAKmD,OAAOmb,mBAAoB,EAEhC,MAAMumG,EAAgB,GAEtB,IAAK,IAAI15G,EAAI,EAAGA,EAAInL,KAAKykH,YAAYlkH,OAAQ4K,IAAK,CAChD,MAAMu5G,EAAa1kH,KAAKykH,YAAYt5G,GACpC,IAAK,IAAIksC,EAAI,EAAGA,EAAIqtE,EAAWnkH,OAAQ82C,IAAK,CAC1C,MAAMytE,EAASJ,EAAWrtE,GACpB0tE,EAAO,IAAI5zD,GAAK,CACpBn/C,MAAO8yG,EAAO9yG,MACdC,OAAQ6yG,EAAO9yG,MACfF,KAAMgzG,EAAO94G,EAAI,EACjB+F,IAAK+yG,EAAO/4G,EAAI,EAChBmhB,QAAS3mB,EACT4mB,QAAS5mB,EACTmd,KAAM1jB,KAAKg5B,QAEb6rF,EAAMz6G,KAAK26G,EACb,CACF,CAEA,MAAMr4E,EAAQ,IAAI6oB,GAChBv1D,KAAKglH,oBAvHX,SAAwBH,GACtB,MAAMI,EAAuC,CAAA,EACvCC,EAA2B,GAEjC,IAAK,IAAW3jH,EAAP4J,EAAI,EAAgBA,EAAI05G,EAAMtkH,OAAQ4K,IAC7C5J,EAAM,GAAGsjH,EAAM15G,GAAG2G,OAAO+yG,EAAM15G,GAAG4G,MAC7BkzG,EAAY1jH,KACf0jH,EAAY1jH,IAAO,EACnB2jH,EAAiB96G,KAAKy6G,EAAM15G,KAIhC,OAAO+5G,CACT,CA0GiCC,CAAeN,GAASA,EACnD,CACEphF,eAAe,EACf4yB,gBAAgB,EAChB0B,aAAa,IAGjB/3D,KAAK69B,QAAU6O,EAAMjkC,IAAI,SAAU,IAAIk6B,GAAO3iC,KAAK69B,SACnD79B,KAAKmD,OAAO4H,KAAK,sBAAuB,CAAEmX,KAAMwqB,IAChD1sC,KAAKmD,OAAO8I,IAAIygC,GAChB1sC,KAAKmD,OAAO4H,KAAK,eAAgB,CAAEmX,KAAMwqB,IAEzC1sC,KAAKmD,OAAO4d,aAAa/gB,KAAKmD,OAAOmuC,YACrCtxC,KAAKw4E,eACLx4E,KAAKmD,OAAOmb,kBAAoBwlG,EAChC9jH,KAAKmD,OAAOsc,kBACd,CAEAmlG,YAAAA,CAAaQ,GACX,MAAMzpG,EAAM3b,KAAKmD,OAAOmuC,WACxB31B,EAAIsI,UAAYjkB,KAAKg5B,MAErBh5B,KAAKs4E,kBAAkB38D,GAEvB,IAAK,IAAIxQ,EAAI,EAAGA,EAAIi6G,EAAY7kH,OAAQ4K,IAAK,CAC3C,MAAMoV,EAAQ6kG,EAAYj6G,GAC1BwQ,EAAI83B,YAAclzB,EAAMwc,QACxBphB,EAAI43B,SAAShzB,EAAMvU,EAAGuU,EAAMxU,EAAGwU,EAAMvO,MAAOuO,EAAMvO,MACpD,CAEA2J,EAAI6G,SACN,CAKA0wB,OAAAA,GACE,MAAMv3B,EAAM3b,KAAKmD,OAAOmuC,WACxB31B,EAAIsI,UAAYjkB,KAAKg5B,MAErBh5B,KAAKs4E,kBAAkB38D,GAEvB,IAAK,IAAIxQ,EAAI,EAAGA,EAAInL,KAAKykH,YAAYlkH,OAAQ4K,IAC3CnL,KAAK4kH,aAAa5kH,KAAKykH,YAAYt5G,IAErCwQ,EAAI6G,SACN,CAKAmiG,aAAAA,CAAcl3F,GACZztB,KAAK0kH,WAAa,GAClB,MAAM3hD,EAAS/iE,KAAKgS,MAAQ,EAE5B,IAAK,IAAI7G,EAAI,EAAGA,EAAInL,KAAKqlH,QAASl6G,IAChCnL,KAAK0kH,WAAWt6G,KAAK,CACnB4B,EAAGm2D,GAAa10C,EAAQzhB,EAAI+2D,EAAQt1C,EAAQzhB,EAAI+2D,GAChDh3D,EAAGo2D,GAAa10C,EAAQ1hB,EAAIg3D,EAAQt1C,EAAQ1hB,EAAIg3D,GAChD/wD,MAAOhS,KAAKslH,iBACRnjD,GAEEz9D,KAAKC,IAAI,EAAG3E,KAAKqkH,SAAWrkH,KAAKslH,kBACjCtlH,KAAKqkH,SAAWrkH,KAAKslH,kBAEvBtlH,KAAKqkH,SACTtnF,QAAS/8B,KAAKulH,cAAgBpjD,GAAa,EAAG,KAAO,IAAM,IAI/DniE,KAAKykH,YAAYr6G,KAAKpK,KAAK0kH,WAC7B,iVvC5L8Bc,CAACxzG,EAAeC,KAC9C,MAAMgwC,EAAeruC,GAAuB,CAAE5B,QAAOC,WAE/CzP,EADegR,KACGpQ,WAAW,SAI7BqiH,EAAc,CAClBpgB,YAHkB,IAAIqgB,YAAY1zG,EAAQC,EAAS,IAK/C0zG,EAAoB,CACxBnjB,iBAAkBxwF,EAClBywF,kBAAmBxwF,EACnBgwC,aAAcA,GAEhB,IAAIva,EAEJA,EAAYnjC,IAAkBqhH,YAAYC,MAC1ClkB,GAAmB97C,UAAU69C,WAAW/4F,KACtC86G,EACAjjH,EACAmjH,GAEF,MAAMG,EAAgBvhH,IAAkBqhH,YAAYC,MAAQn+E,EAE5DA,EAAYnjC,IAAkBqhH,YAAYC,MAC1ClkB,GAAmB97C,UAAUo/C,uBAAuBt6F,KAClD86G,EACAjjH,EACAmjH,GAIF,OAAOG,EAFkBvhH,IAAkBqhH,YAAYC,MAAQn+E,qEwC5B1D,SACLrwB,EACAc,GAE2B,IAD3BjW,EAAyB5B,UAAAC,OAAA,QAAAC,IAAAF,UAAA,GAAAA,UAAA,GAAG,CAAA,EAE5B,OAAOylH,MAAM1uG,EAAI0rB,QAAQ,SAAU,IAAIzG,OAAQ,CAC7ChlB,OAAQpV,EAAQoV,SAEfkB,KAAMwtG,IACL,IAAKA,EAASC,GACZ,MAAM,IAAIlkH,EAAY,uBAAuBikH,EAASh9E,UAExD,OAAOg9E,EAAS15D,SAEjB9zC,KAAM0tG,GACE3W,GAAkB2W,EAAS/tG,EAASjW,IAE5CwW,MAAM,K7CxBwBo1F,CACjCt+F,QAAS,GACTwP,SAAU,GACV9c,QAAS,CAAA,EACT6rG,YAAa,K6CwBf,uD5MbuBziG,IACrBvH,EAAMuH,sBqJMD,SAA0Bs7F,GAC/BrF,GAAgBqF,CAClB"} \ No newline at end of file diff --git a/dist/index.min.mjs b/dist/index.min.mjs index 30b88c8be26..510a6a385fd 100644 --- a/dist/index.min.mjs +++ b/dist/index.min.mjs @@ -1,2 +1,2 @@ -function t(t,e,s){return(e=function(t){var e=function(t,e){if("object"!=typeof t||!t)return t;var s=t[Symbol.toPrimitive];if(void 0!==s){var i=s.call(t,e);if("object"!=typeof i)return i;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===e?String:Number)(t)}(t,"string");return"symbol"==typeof e?e:e+""}(e))in t?Object.defineProperty(t,e,{value:s,enumerable:!0,configurable:!0,writable:!0}):t[e]=s,t}class e{constructor(){t(this,"browserShadowBlurConstant",1),t(this,"DPI",96),t(this,"devicePixelRatio","undefined"!=typeof window?window.devicePixelRatio:1),t(this,"perfLimitSizeTotal",2097152),t(this,"maxCacheSideLimit",4096),t(this,"minCacheSideLimit",256),t(this,"disableStyleCopyPaste",!1),t(this,"enableGLFiltering",!0),t(this,"textureSize",4096),t(this,"forceGLPutImageData",!1),t(this,"cachesBoundsOfCurve",!1),t(this,"fontPaths",{}),t(this,"NUM_FRACTION_DIGITS",4)}}const s=new class extends e{constructor(t){super(),this.configure(t)}configure(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};Object.assign(this,t)}addFonts(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};this.fontPaths={...this.fontPaths,...t}}removeFonts(){(arguments.length>0&&void 0!==arguments[0]?arguments[0]:[]).forEach(t=>{delete this.fontPaths[t]})}clearFonts(){this.fontPaths={}}restoreDefaults(t){const s=new e,i=(null==t?void 0:t.reduce((t,e)=>(t[e]=s[e],t),{}))||s;this.configure(i)}},i=function(t){for(var e=arguments.length,s=new Array(e>1?e-1:0),i=1;ithis.testPrecision(e,t)),e.getExtension("WEBGL_lose_context").loseContext(),i("log",`WebGL: max texture size ${this.maxTextureSize}`))}isSupported(t){return!!this.maxTextureSize&&this.maxTextureSize>=t}}const h={};let l;const c=t=>{l=t},u=()=>l||(l={document:document,window:window,isTouchSupported:"ontouchstart"in window||"ontouchstart"in document||window&&window.navigator&&window.navigator.maxTouchPoints>0,WebGLProbe:new a,dispose(){},copyPasteData:h}),d=()=>u().document,g=()=>u().window,f=()=>{var t;return Math.max(null!==(t=s.devicePixelRatio)&&void 0!==t?t:g().devicePixelRatio,1)};const p=new class{constructor(){t(this,"charWidthsCache",{}),t(this,"boundsOfCurveCache",{})}getFontCache(t){let{fontFamily:e,fontStyle:s,fontWeight:i}=t;e=e.toLowerCase(),this.charWidthsCache[e]||(this.charWidthsCache[e]={});const r=this.charWidthsCache[e],n=`${s.toLowerCase()}_${(i+"").toLowerCase()}`;return r[n]||(r[n]={}),r[n]}clearFontCache(t){(t=(t||"").toLowerCase())?this.charWidthsCache[t]&&delete this.charWidthsCache[t]:this.charWidthsCache={}}limitDimsByArea(t){const{perfLimitSizeTotal:e}=s,i=Math.sqrt(e*t);return[Math.floor(i),Math.floor(e/i)]}};const m="7.0.0-beta1";function v(){}const y=Math.PI/2,_=Math.PI/4,x=2*Math.PI,C=Math.PI/180,S=Object.freeze([1,0,0,1,0,0]),b=16,w=.4477152502,T="center",O="left",k="top",D="bottom",M="right",E="none",P=/\r?\n/,A="moving",j="scaling",F="rotating",L="rotate",R="skewing",I="resizing",B="modifyPoly",$="modifyPath",X="changed",Y="scale",W="scaleX",V="scaleY",G="skewX",z="skewY",H="fill",N="stroke",U="modified",q="json",K="svg";const J=new class{constructor(){this[q]=new Map,this[K]=new Map}has(t){return this[q].has(t)}getClass(t){const e=this[q].get(t);if(!e)throw new r(`No class registered for ${t}`);return e}setClass(t,e){e?this[q].set(e,t):(this[q].set(t.type,t),this[q].set(t.type.toLowerCase(),t))}getSVGClass(t){return this[K].get(t)}setSVGClass(t,e){this[K].set(null!=e?e:t.type.toLowerCase(),t)}};const Q=new class extends Array{remove(t){const e=this.indexOf(t);e>-1&&this.splice(e,1)}cancelAll(){const t=this.splice(0);return t.forEach(t=>t.abort()),t}cancelByCanvas(t){if(!t)return[];const e=this.filter(e=>{var s;return e.target===t||"object"==typeof e.target&&(null===(s=e.target)||void 0===s?void 0:s.canvas)===t});return e.forEach(t=>t.abort()),e}cancelByTarget(t){if(!t)return[];const e=this.filter(e=>e.target===t);return e.forEach(t=>t.abort()),e}};class Z{constructor(){t(this,"__eventListeners",{})}on(t,e){if(this.__eventListeners||(this.__eventListeners={}),"object"==typeof t)return Object.entries(t).forEach(t=>{let[e,s]=t;this.on(e,s)}),()=>this.off(t);if(e){const s=t;return this.__eventListeners[s]||(this.__eventListeners[s]=[]),this.__eventListeners[s].push(e),()=>this.off(s,e)}return()=>!1}once(t,e){if("object"==typeof t){const e=[];return Object.entries(t).forEach(t=>{let[s,i]=t;e.push(this.once(s,i))}),()=>e.forEach(t=>t())}if(e){const s=this.on(t,function(){for(var t=arguments.length,i=new Array(t),r=0;r!1}_removeEventListener(t,e){if(this.__eventListeners[t])if(e){const s=this.__eventListeners[t],i=s.indexOf(e);i>-1&&s.splice(i,1)}else this.__eventListeners[t]=[]}off(t,e){if(this.__eventListeners)if(void 0===t)for(const t in this.__eventListeners)this._removeEventListener(t);else"object"==typeof t?Object.entries(t).forEach(t=>{let[e,s]=t;this._removeEventListener(e,s)}):this._removeEventListener(t,e)}fire(t,e){var s;if(!this.__eventListeners)return;const i=null===(s=this.__eventListeners[t])||void 0===s?void 0:s.concat();if(i)for(let t=0;t{const s=t.indexOf(e);return-1!==s&&t.splice(s,1),t},et=t=>{if(0===t)return 1;switch(Math.abs(t)/y){case 1:case 3:return 0;case 2:return-1}return Math.cos(t)},st=t=>{if(0===t)return 0;const e=t/y,s=Math.sign(t);switch(e){case 1:return s;case 2:return 0;case 3:return-s}return Math.sin(t)};class it{constructor(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0,e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0;"object"==typeof t?(this.x=t.x,this.y=t.y):(this.x=t,this.y=e)}add(t){return new it(this.x+t.x,this.y+t.y)}addEquals(t){return this.x+=t.x,this.y+=t.y,this}scalarAdd(t){return new it(this.x+t,this.y+t)}scalarAddEquals(t){return this.x+=t,this.y+=t,this}subtract(t){return new it(this.x-t.x,this.y-t.y)}subtractEquals(t){return this.x-=t.x,this.y-=t.y,this}scalarSubtract(t){return new it(this.x-t,this.y-t)}scalarSubtractEquals(t){return this.x-=t,this.y-=t,this}multiply(t){return new it(this.x*t.x,this.y*t.y)}scalarMultiply(t){return new it(this.x*t,this.y*t)}scalarMultiplyEquals(t){return this.x*=t,this.y*=t,this}divide(t){return new it(this.x/t.x,this.y/t.y)}scalarDivide(t){return new it(this.x/t,this.y/t)}scalarDivideEquals(t){return this.x/=t,this.y/=t,this}eq(t){return this.x===t.x&&this.y===t.y}lt(t){return this.xt.x&&this.y>t.y}gte(t){return this.x>=t.x&&this.y>=t.y}lerp(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:.5;return e=Math.max(Math.min(1,e),0),new it(this.x+(t.x-this.x)*e,this.y+(t.y-this.y)*e)}distanceFrom(t){const e=this.x-t.x,s=this.y-t.y;return Math.sqrt(e*e+s*s)}midPointFrom(t){return this.lerp(t)}min(t){return new it(Math.min(this.x,t.x),Math.min(this.y,t.y))}max(t){return new it(Math.max(this.x,t.x),Math.max(this.y,t.y))}toString(){return`${this.x},${this.y}`}setXY(t,e){return this.x=t,this.y=e,this}setX(t){return this.x=t,this}setY(t){return this.y=t,this}setFromPoint(t){return this.x=t.x,this.y=t.y,this}swap(t){const e=this.x,s=this.y;this.x=t.x,this.y=t.y,t.x=e,t.y=s}clone(){return new it(this.x,this.y)}rotate(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:rt;const s=st(t),i=et(t),r=this.subtract(e);return new it(r.x*i-r.y*s,r.x*s+r.y*i).add(e)}transform(t){let e=arguments.length>1&&void 0!==arguments[1]&&arguments[1];return new it(t[0]*this.x+t[2]*this.y+(e?0:t[4]),t[1]*this.x+t[3]*this.y+(e?0:t[5]))}}const rt=new it(0,0),nt=t=>!!t&&Array.isArray(t._objects);function ot(e){class s extends e{constructor(){super(...arguments),t(this,"_objects",[])}_onObjectAdded(t){}_onObjectRemoved(t){}_onStackOrderChanged(t){}add(){for(var t=arguments.length,e=new Array(t),s=0;sthis._onObjectAdded(t)),i}insertAt(t){for(var e=arguments.length,s=new Array(e>1?e-1:0),i=1;ithis._onObjectAdded(t)),this._objects.length}remove(){const t=this._objects,e=[];for(var s=arguments.length,i=new Array(s),r=0;r{const i=t.indexOf(s);-1!==i&&(t.splice(i,1),e.push(s),this._onObjectRemoved(s))}),e}forEachObject(t){this.getObjects().forEach((e,s,i)=>t(e,s,i))}getObjects(){for(var t=arguments.length,e=new Array(t),s=0;st.isType(...e))}item(t){return this._objects[t]}isEmpty(){return 0===this._objects.length}size(){return this._objects.length}contains(t,e){return!!this._objects.includes(t)||!!e&&this._objects.some(e=>e instanceof s&&e.contains(t,!0))}complexity(){return this._objects.reduce((t,e)=>t+=e.complexity?e.complexity():0,0)}sendObjectToBack(t){return!(!t||t===this._objects[0])&&(tt(this._objects,t),this._objects.unshift(t),this._onStackOrderChanged(t),!0)}bringObjectToFront(t){return!(!t||t===this._objects[this._objects.length-1])&&(tt(this._objects,t),this._objects.push(t),this._onStackOrderChanged(t),!0)}sendObjectBackwards(t,e){if(!t)return!1;const s=this._objects.indexOf(t);if(0!==s){const i=this.findNewLowerIndex(t,s,e);return tt(this._objects,t),this._objects.splice(i,0,t),this._onStackOrderChanged(t),!0}return!1}bringObjectForward(t,e){if(!t)return!1;const s=this._objects.indexOf(t);if(s!==this._objects.length-1){const i=this.findNewUpperIndex(t,s,e);return tt(this._objects,t),this._objects.splice(i,0,t),this._onStackOrderChanged(t),!0}return!1}moveObjectTo(t,e){return t!==this._objects[e]&&(tt(this._objects,t),this._objects.splice(e,0,t),this._onStackOrderChanged(t),!0)}findNewLowerIndex(t,e,s){let i;if(s){i=e;for(let s=e-1;s>=0;--s)if(t.isOverlapping(this._objects[s])){i=s;break}}else i=e-1;return i}findNewUpperIndex(t,e,s){let i;if(s){i=e;for(let s=e+1;s1&&void 0!==arguments[1]?arguments[1]:{};const o=[],a=new it(e,s),h=a.add(new it(i,r));for(let t=this._objects.length-1;t>=0;t--){const e=this._objects[t];e.selectable&&e.visible&&(n&&e.intersectsWithRect(a,h)||e.isContainedWithinRect(a,h)||n&&e.containsPoint(a)||n&&e.containsPoint(h))&&o.push(e)}return o}}return s}class at extends Z{_setOptions(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};for(const e in t)this.set(e,t[e])}_setObject(t){for(const e in t)this._set(e,t[e])}set(t,e){return"object"==typeof t?this._setObject(t):this._set(t,e),this}_set(t,e){this[t]=e}toggle(t){const e=this.get(t);return"boolean"==typeof e&&this.set(t,!e),this}get(t){return this[t]}}function ht(t){return g().requestAnimationFrame(t)}function lt(t){return g().cancelAnimationFrame(t)}let ct=0;const ut=()=>ct++,dt=()=>{const t=d().createElement("canvas");if(!t||void 0===t.getContext)throw new r("Failed to create `canvas` element");return t},gt=()=>d().createElement("img"),ft=t=>{const e=dt();return e.width=t.width,e.height=t.height,e},pt=(t,e,s)=>t.toDataURL(`image/${e}`,s),mt=(t,e,s)=>new Promise((i,r)=>{t.toBlob(i,`image/${e}`,s)}),vt=t=>t*C,yt=t=>t/C,_t=t=>t.every((t,e)=>t===S[e]),xt=(t,e,s)=>new it(t).transform(e,s),Ct=t=>{const e=1/(t[0]*t[3]-t[1]*t[2]),s=[e*t[3],-e*t[1],-e*t[2],e*t[0],0,0],{x:i,y:r}=new it(t[4],t[5]).transform(s,!0);return s[4]=-i,s[5]=-r,s},St=(t,e,s)=>[t[0]*e[0]+t[2]*e[1],t[1]*e[0]+t[3]*e[1],t[0]*e[2]+t[2]*e[3],t[1]*e[2]+t[3]*e[3],s?0:t[0]*e[4]+t[2]*e[5]+t[4],s?0:t[1]*e[4]+t[3]*e[5]+t[5]],bt=(t,e)=>t.reduceRight((t,s)=>s&&t?St(s,t,e):s||t,void 0)||S.concat(),wt=t=>{let[e,s]=t;return Math.atan2(s,e)},Tt=t=>{const e=wt(t),s=Math.pow(t[0],2)+Math.pow(t[1],2),i=Math.sqrt(s),r=(t[0]*t[3]-t[2]*t[1])/i,n=Math.atan2(t[0]*t[2]+t[1]*t[3],s);return{angle:yt(e),scaleX:i,scaleY:r,skewX:yt(n),skewY:0,translateX:t[4]||0,translateY:t[5]||0}},Ot=function(t){return[1,0,0,1,t,arguments.length>1&&void 0!==arguments[1]?arguments[1]:0]};function kt(){let{angle:t=0}=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},{x:e=0,y:s=0}=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};const i=vt(t),r=et(i),n=st(i);return[r,n,-n,r,e?e-(r*e-n*s):0,s?s-(n*e+r*s):0]}const Dt=function(t){return[t,0,0,arguments.length>1&&void 0!==arguments[1]?arguments[1]:t,0,0]},Mt=t=>Math.tan(vt(t)),Et=t=>[1,0,Mt(t),1,0,0],Pt=t=>[1,Mt(t),0,1,0,0],At=t=>{let{scaleX:e=1,scaleY:s=1,flipX:i=!1,flipY:r=!1,skewX:n=0,skewY:o=0}=t,a=Dt(i?-e:e,r?-s:s);return n&&(a=St(a,Et(n),!0)),o&&(a=St(a,Pt(o),!0)),a},jt=t=>{const{translateX:e=0,translateY:s=0,angle:i=0}=t;let r=Ot(e,s);i&&(r=St(r,kt({angle:i})));const n=At(t);return _t(n)||(r=St(r,n)),r},Ft=function(t){let{signal:e,crossOrigin:s=null}=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return new Promise(function(i,o){if(e&&e.aborted)return o(new n("loadImage"));const a=gt();let h;e&&(h=function(t){a.src="",o(t)},e.addEventListener("abort",h,{once:!0}));const l=function(){a.onload=a.onerror=null,h&&(null==e||e.removeEventListener("abort",h)),i(a)};t?(a.onload=l,a.onerror=function(){h&&(null==e||e.removeEventListener("abort",h)),o(new r(`Error loading ${a.src}`))},s&&(a.crossOrigin=s),a.src=t):l()})},Lt=function(t){let{signal:e,reviver:s=v}=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return new Promise((i,r)=>{const n=[];e&&e.addEventListener("abort",r,{once:!0}),Promise.all(t.map(t=>J.getClass(t.type).fromObject(t,{signal:e}).then(e=>(s(t,e),n.push(e),e)))).then(i).catch(t=>{n.forEach(t=>{t.dispose&&t.dispose()}),r(t)}).finally(()=>{e&&e.removeEventListener("abort",r)})})},Rt=function(t){let{signal:e}=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return new Promise((s,i)=>{const r=[];e&&e.addEventListener("abort",i,{once:!0});const n=Object.values(t).map(t=>t&&t.type&&J.has(t.type)?Lt([t],{signal:e}).then(t=>{let[e]=t;return r.push(e),e}):t),o=Object.keys(t);Promise.all(n).then(t=>t.reduce((t,e,s)=>(t[o[s]]=e,t),{})).then(s).catch(t=>{r.forEach(t=>{t.dispose&&t.dispose()}),i(t)}).finally(()=>{e&&e.removeEventListener("abort",i)})})},It=function(t){return(arguments.length>1&&void 0!==arguments[1]?arguments[1]:[]).reduce((e,s)=>(s in t&&(e[s]=t[s]),e),{})},Bt=(t,e)=>Object.keys(t).reduce((s,i)=>(e(t[i],i,t)&&(s[i]=t[i]),s),{}),$t=(t,e)=>parseFloat(Number(t).toFixed(e)),Xt=t=>"matrix("+t.map(t=>$t(t,s.NUM_FRACTION_DIGITS)).join(" ")+")",Yt=t=>!!t&&void 0!==t.toLive,Wt=t=>!!t&&"function"==typeof t.toObject,Vt=t=>!!t&&void 0!==t.offsetX&&"source"in t,Gt=t=>!!t&&"multiSelectionStacking"in t;function zt(t){const e=t&&Ht(t);let s=0,i=0;if(!t||!e)return{left:s,top:i};let r=t;const n=e.documentElement,o=e.body||{scrollLeft:0,scrollTop:0};for(;r&&(r.parentNode||r.host)&&(r=r.parentNode||r.host,r===e?(s=o.scrollLeft||n.scrollLeft||0,i=o.scrollTop||n.scrollTop||0):(s+=r.scrollLeft||0,i+=r.scrollTop||0),1!==r.nodeType||"fixed"!==r.style.position););return{left:s,top:i}}const Ht=t=>t.ownerDocument||null,Nt=t=>{var e;return(null===(e=t.ownerDocument)||void 0===e?void 0:e.defaultView)||null},Ut=function(t,e,s){let{width:i,height:r}=s,n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:1;t.width=i,t.height=r,n>1&&(t.setAttribute("width",(i*n).toString()),t.setAttribute("height",(r*n).toString()),e.scale(n,n))},qt=(t,e)=>{let{width:s,height:i}=e;s&&(t.style.width="number"==typeof s?`${s}px`:s),i&&(t.style.height="number"==typeof i?`${i}px`:i)};function Kt(t){return void 0!==t.onselectstart&&(t.onselectstart=()=>!1),t.style.userSelect=E,t}class Jt{constructor(e){t(this,"_originalCanvasStyle",void 0),t(this,"lower",void 0);const s=this.createLowerCanvas(e);this.lower={el:s,ctx:s.getContext("2d")}}createLowerCanvas(t){const e=(s=t)&&void 0!==s.getContext?t:t&&d().getElementById(t)||dt();var s;if(e.hasAttribute("data-fabric"))throw new r("Trying to initialize a canvas that has already been initialized. Did you forget to dispose the canvas?");return this._originalCanvasStyle=e.style.cssText,e.setAttribute("data-fabric","main"),e.classList.add("lower-canvas"),e}cleanupDOM(t){let{width:e,height:s}=t;const{el:i}=this.lower;i.classList.remove("lower-canvas"),i.removeAttribute("data-fabric"),i.setAttribute("width",`${e}`),i.setAttribute("height",`${s}`),i.style.cssText=this._originalCanvasStyle||"",this._originalCanvasStyle=void 0}setDimensions(t,e){const{el:s,ctx:i}=this.lower;Ut(s,i,t,e)}setCSSDimensions(t){qt(this.lower.el,t)}calcOffset(){return function(t){var e;const s=t&&Ht(t),i={left:0,top:0};if(!s)return i;const r=(null===(e=Nt(t))||void 0===e?void 0:e.getComputedStyle(t,null))||{};i.left+=parseInt(r.borderLeftWidth,10)||0,i.top+=parseInt(r.borderTopWidth,10)||0,i.left+=parseInt(r.paddingLeft,10)||0,i.top+=parseInt(r.paddingTop,10)||0;let n={left:0,top:0};const o=s.documentElement;void 0!==t.getBoundingClientRect&&(n=t.getBoundingClientRect());const a=zt(t);return{left:n.left+a.left-(o.clientLeft||0)+i.left,top:n.top+a.top-(o.clientTop||0)+i.top}}(this.lower.el)}dispose(){u().dispose(this.lower.el),delete this.lower}}const Qt={backgroundVpt:!0,backgroundColor:"",overlayVpt:!0,overlayColor:"",includeDefaultValues:!0,svgViewportTransformation:!0,renderOnAddRemove:!0,skipOffscreen:!0,enableRetinaScaling:!0,imageSmoothingEnabled:!0,controlsAboveOverlay:!1,allowTouchScrolling:!1,viewportTransform:[...S]};class Zt extends(ot(at)){get lowerCanvasEl(){var t;return null===(t=this.elements.lower)||void 0===t?void 0:t.el}get contextContainer(){var t;return null===(t=this.elements.lower)||void 0===t?void 0:t.ctx}static getDefaults(){return Zt.ownDefaults}constructor(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};super(),Object.assign(this,this.constructor.getDefaults()),this.set(e),this.initElements(t),this._setDimensionsImpl({width:this.width||this.elements.lower.el.width||0,height:this.height||this.elements.lower.el.height||0}),this.skipControlsDrawing=!1,this.viewportTransform=[...this.viewportTransform],this.calcViewportBoundaries()}initElements(t){this.elements=new Jt(t)}add(){const t=super.add(...arguments);return arguments.length>0&&this.renderOnAddRemove&&this.requestRenderAll(),t}insertAt(t){for(var e=arguments.length,s=new Array(e>1?e-1:0),i=1;i0&&this.renderOnAddRemove&&this.requestRenderAll(),r}remove(){const t=super.remove(...arguments);return t.length>0&&this.renderOnAddRemove&&this.requestRenderAll(),t}_onObjectAdded(t){t.canvas&&t.canvas!==this&&(i("warn","Canvas is trying to add an object that belongs to a different canvas.\nResulting to default behavior: removing object from previous canvas and adding to new canvas"),t.canvas.remove(t)),t._set("canvas",this),t.setCoords(),this.fire("object:added",{target:t}),t.fire("added",{target:this})}_onObjectRemoved(t){t._set("canvas",void 0),this.fire("object:removed",{target:t}),t.fire("removed",{target:this})}_onStackOrderChanged(){this.renderOnAddRemove&&this.requestRenderAll()}getRetinaScaling(){return this.enableRetinaScaling?f():1}calcOffset(){return this._offset=this.elements.calcOffset()}getWidth(){return this.width}getHeight(){return this.height}_setDimensionsImpl(t){let{cssOnly:e=!1,backstoreOnly:s=!1}=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if(!e){const e={width:this.width,height:this.height,...t};this.elements.setDimensions(e,this.getRetinaScaling()),this.hasLostContext=!0,this.width=e.width,this.height=e.height}s||this.elements.setCSSDimensions(t),this.calcOffset()}setDimensions(t,e){this._setDimensionsImpl(t,e),e&&e.cssOnly||this.requestRenderAll()}getZoom(){return this.viewportTransform[0]}setViewportTransform(t){this.viewportTransform=t,this.calcViewportBoundaries(),this.renderOnAddRemove&&this.requestRenderAll()}zoomToPoint(t,e){const s=t,i=[...this.viewportTransform],r=xt(t,Ct(i));i[0]=e,i[3]=e;const n=xt(r,i);i[4]+=s.x-n.x,i[5]+=s.y-n.y,this.setViewportTransform(i)}setZoom(t){this.zoomToPoint(new it(0,0),t)}absolutePan(t){const e=[...this.viewportTransform];return e[4]=-t.x,e[5]=-t.y,this.setViewportTransform(e)}relativePan(t){return this.absolutePan(new it(-t.x-this.viewportTransform[4],-t.y-this.viewportTransform[5]))}getElement(){return this.elements.lower.el}clearContext(t){t.clearRect(0,0,this.width,this.height)}getContext(){return this.elements.lower.ctx}clear(){this.remove(...this.getObjects()),this.backgroundImage=void 0,this.overlayImage=void 0,this.backgroundColor="",this.overlayColor="",this.clearContext(this.getContext()),this.fire("canvas:cleared"),this.renderOnAddRemove&&this.requestRenderAll()}renderAll(){this.cancelRequestedRender(),this.destroyed||this.renderCanvas(this.getContext(),this._objects)}renderAndReset(){this.nextRenderHandle=0,this.renderAll()}requestRenderAll(){this.nextRenderHandle||this.disposed||this.destroyed||(this.nextRenderHandle=ht(()=>this.renderAndReset()))}calcViewportBoundaries(){const t=this.width,e=this.height,s=Ct(this.viewportTransform),i=xt({x:0,y:0},s),r=xt({x:t,y:e},s),n=i.min(r),o=i.max(r);return this.vptCoords={tl:n,tr:new it(o.x,n.y),bl:new it(n.x,o.y),br:o}}cancelRequestedRender(){this.nextRenderHandle&&(lt(this.nextRenderHandle),this.nextRenderHandle=0)}drawControls(t){}renderCanvas(t,e){if(this.destroyed)return;const s=this.viewportTransform,i=this.clipPath;this.calcViewportBoundaries(),this.clearContext(t),t.imageSmoothingEnabled=this.imageSmoothingEnabled,t.patternQuality="best",this.fire("before:render",{ctx:t}),this._renderBackground(t),t.save(),t.transform(s[0],s[1],s[2],s[3],s[4],s[5]),this._renderObjects(t,e),t.restore(),this.controlsAboveOverlay||this.skipControlsDrawing||this.drawControls(t),i&&(i._set("canvas",this),i.shouldCache(),i._transformDone=!0,i.renderCache({forClipping:!0}),this.drawClipPathOnCanvas(t,i)),this._renderOverlay(t),this.controlsAboveOverlay&&!this.skipControlsDrawing&&this.drawControls(t),this.fire("after:render",{ctx:t}),this.__cleanupTask&&(this.__cleanupTask(),this.__cleanupTask=void 0)}drawClipPathOnCanvas(t,e){const s=this.viewportTransform;t.save(),t.transform(...s),t.globalCompositeOperation="destination-in",e.transform(t),t.scale(1/e.zoomX,1/e.zoomY),t.drawImage(e._cacheCanvas,-e.cacheTranslationX,-e.cacheTranslationY),t.restore()}_renderObjects(t,e){for(let s=0,i=e.length;s!t.excludeFromExport).map(s=>this._toObject(s,t,e)),...this.__serializeBgOverlay(t,e),...i?{clipPath:i}:null}}_toObject(t,e,s){let i;this.includeDefaultValues||(i=t.includeDefaultValues,t.includeDefaultValues=!1);const r=t[e](s);return this.includeDefaultValues||(t.includeDefaultValues=!!i),r}__serializeBgOverlay(t,e){const s={},i=this.backgroundImage,r=this.overlayImage,n=this.backgroundColor,o=this.overlayColor;return Yt(n)?n.excludeFromExport||(s.background=n.toObject(e)):n&&(s.background=n),Yt(o)?o.excludeFromExport||(s.overlay=o.toObject(e)):o&&(s.overlay=o),i&&!i.excludeFromExport&&(s.backgroundImage=this._toObject(i,t,e)),r&&!r.excludeFromExport&&(s.overlayImage=this._toObject(r,t,e)),s}toSVG(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},e=arguments.length>1?arguments[1]:void 0;t.reviver=e;const s=[];return this._setSVGPreamble(s,t),this._setSVGHeader(s,t),this.clipPath&&s.push(`\n`),this._setSVGBgOverlayColor(s,"background"),this._setSVGBgOverlayImage(s,"backgroundImage",e),this._setSVGObjects(s,e),this.clipPath&&s.push("\n"),this._setSVGBgOverlayColor(s,"overlay"),this._setSVGBgOverlayImage(s,"overlayImage",e),s.push(""),s.join("")}_setSVGPreamble(t,e){e.suppressPreamble||t.push('\n','\n')}_setSVGHeader(t,e){const i=e.width||`${this.width}`,r=e.height||`${this.height}`,n=s.NUM_FRACTION_DIGITS,o=e.viewBox;let a;if(o)a=`viewBox="${o.x} ${o.y} ${o.width} ${o.height}" `;else if(this.svgViewportTransformation){const t=this.viewportTransform;a=`viewBox="${$t(-t[4]/t[0],n)} ${$t(-t[5]/t[3],n)} ${$t(this.width/t[0],n)} ${$t(this.height/t[3],n)}" `}else a=`viewBox="0 0 ${this.width} ${this.height}" `;t.push("\n',"Created with Fabric.js ",m,"\n","\n",this.createSVGFontFacesMarkup(),this.createSVGRefElementsMarkup(),this.createSVGClipPathMarkup(e),"\n")}createSVGClipPathMarkup(t){const e=this.clipPath;return e?(e.clipPathId=`CLIPPATH_${ut()}`,`\n${e.toClipPathSVG(t.reviver)}\n`):""}createSVGRefElementsMarkup(){return["background","overlay"].map(t=>{const e=this[`${t}Color`];if(Yt(e)){const s=this[`${t}Vpt`],i=this.viewportTransform,r={isType:()=>!1,width:this.width/(s?i[0]:1),height:this.height/(s?i[3]:1)};return e.toSVG(r,{additionalTransform:s?Xt(i):""})}}).join("")}createSVGFontFacesMarkup(){const t=[],e={},i=s.fontPaths;this._objects.forEach(function e(s){t.push(s),nt(s)&&s._objects.forEach(e)}),t.forEach(t=>{if(!(s=t)||"function"!=typeof s._renderText)return;var s;const{styles:r,fontFamily:n}=t;!e[n]&&i[n]&&(e[n]=!0,r&&Object.values(r).forEach(t=>{Object.values(t).forEach(t=>{let{fontFamily:s=""}=t;!e[s]&&i[s]&&(e[s]=!0)})}))});const r=Object.keys(e).map(t=>`\t\t@font-face {\n\t\t\tfont-family: '${t}';\n\t\t\tsrc: url('${i[t]}');\n\t\t}\n`).join("");return r?`\t\n`:""}_setSVGObjects(t,e){this.forEachObject(s=>{s.excludeFromExport||this._setSVGObject(t,s,e)})}_setSVGObject(t,e,s){t.push(e.toSVG(s))}_setSVGBgOverlayImage(t,e,s){const i=this[e];i&&!i.excludeFromExport&&i.toSVG&&t.push(i.toSVG(s))}_setSVGBgOverlayColor(t,e){const s=this[`${e}Color`];if(s)if(Yt(s)){const i=s.repeat||"",r=this.width,n=this.height,o=this[`${e}Vpt`]?Xt(Ct(this.viewportTransform)):"";t.push(`\n`)}else t.push('\n")}loadFromJSON(t,e){let{signal:s}=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};if(!t)return Promise.reject(new r("`json` is undefined"));const i="string"==typeof t?JSON.parse(t):t,{objects:n=[],backgroundImage:o,background:a,overlayImage:h,overlay:l,clipPath:c}=i,u=this.renderOnAddRemove;return this.renderOnAddRemove=!1,Promise.all([Lt(n,{reviver:e,signal:s}),Rt({backgroundImage:o,backgroundColor:a,overlayImage:h,overlayColor:l,clipPath:c},{signal:s})]).then(t=>{let[e,s]=t;return this.clear(),this.add(...e),this.set(i),this.set(s),this.renderOnAddRemove=u,this})}clone(t){const e=this.toObject(t);return this.cloneWithoutData().loadFromJSON(e)}cloneWithoutData(){const t=ft(this);return new this.constructor(t)}toDataURL(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};const{format:e="png",quality:s=1,multiplier:i=1,enableRetinaScaling:r=!1}=t,n=i*(r?this.getRetinaScaling():1);return pt(this.toCanvasElement(n,t),e,s)}toBlob(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};const{format:e="png",quality:s=1,multiplier:i=1,enableRetinaScaling:r=!1}=t,n=i*(r?this.getRetinaScaling():1);return mt(this.toCanvasElement(n,t),e,s)}toCanvasElement(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:1,{width:e,height:s,left:i,top:r,filter:n}=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};const o=(e||this.width)*t,a=(s||this.height)*t,h=this.getZoom(),l=this.width,c=this.height,u=this.skipControlsDrawing,d=h*t,g=this.viewportTransform,f=[d,0,0,d,(g[4]-(i||0))*t,(g[5]-(r||0))*t],p=this.enableRetinaScaling,m=ft({width:o,height:a}),v=n?this._objects.filter(t=>n(t)):this._objects;return this.enableRetinaScaling=!1,this.viewportTransform=f,this.width=o,this.height=a,this.skipControlsDrawing=!0,this.calcViewportBoundaries(),this.renderCanvas(m.getContext("2d"),v),this.viewportTransform=g,this.width=l,this.height=c,this.calcViewportBoundaries(),this.enableRetinaScaling=p,this.skipControlsDrawing=u,m}dispose(){return!this.disposed&&this.elements.cleanupDOM({width:this.width,height:this.height}),Q.cancelByCanvas(this),this.disposed=!0,new Promise((t,e)=>{const s=()=>{this.destroy(),t(!0)};s.kill=e,this.__cleanupTask&&this.__cleanupTask.kill("aborted"),this.destroyed?t(!1):this.nextRenderHandle?this.__cleanupTask=s:s()})}destroy(){this.destroyed=!0,this.cancelRequestedRender(),this.forEachObject(t=>t.dispose()),this._objects=[],this.backgroundImage&&this.backgroundImage.dispose(),this.backgroundImage=void 0,this.overlayImage&&this.overlayImage.dispose(),this.overlayImage=void 0,this.elements.dispose()}toString(){return`#`}}t(Zt,"ownDefaults",Qt);const te=["touchstart","touchmove","touchend"];const ee=t=>{const e=zt(t.target),s=function(t){const e=t.changedTouches;return e&&e[0]?e[0]:t}(t);return new it(s.clientX+e.left,s.clientY+e.top)},se=t=>te.includes(t.type)||"touch"===t.pointerType,ie=t=>{t.preventDefault(),t.stopPropagation()},re=t=>{let e=0,s=0,i=0,r=0;for(let n=0,o=t.length;ni||!n)&&(i=o),(or||!n)&&(r=a),(aoe(t,St(e,t.calcOwnMatrix())),oe=(t,e)=>{const{translateX:s,translateY:i,scaleX:r,scaleY:n,...o}=Tt(e),a=new it(s,i);t.flipX=!1,t.flipY=!1,Object.assign(t,o),t.set({scaleX:r,scaleY:n}),t.setPositionByOrigin(a,T,T)},ae=t=>{t.scaleX=1,t.scaleY=1,t.skewX=0,t.skewY=0,t.flipX=!1,t.flipY=!1,t.rotate(0)},he=t=>({scaleX:t.scaleX,scaleY:t.scaleY,skewX:t.skewX,skewY:t.skewY,angle:t.angle,left:t.left,flipX:t.flipX,flipY:t.flipY,top:t.top}),le=(t,e,s)=>{const i=t/2,r=e/2,n=[new it(-i,-r),new it(i,-r),new it(-i,r),new it(i,r)].map(t=>t.transform(s)),o=re(n);return new it(o.width,o.height)},ce=function(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:S;return St(Ct(arguments.length>1&&void 0!==arguments[1]?arguments[1]:S),t)},ue=function(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:S,s=arguments.length>2&&void 0!==arguments[2]?arguments[2]:S;return t.transform(ce(e,s))},de=function(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:S,s=arguments.length>2&&void 0!==arguments[2]?arguments[2]:S;return t.transform(ce(e,s),!0)},ge=(t,e,s)=>{const i=ce(e,s);return oe(t,St(i,t.calcOwnMatrix())),i},fe=(t,e)=>{var s;const{transform:{target:i}}=e;null===(s=i.canvas)||void 0===s||s.fire(`object:${t}`,{...e,target:i}),i.fire(t,e)},pe={left:-.5,top:-.5,center:0,bottom:.5,right:.5},me=t=>"string"==typeof t?pe[t]:t-.5,ve=new it(1,0),ye=new it,_e=(t,e)=>t.rotate(e),xe=(t,e)=>new it(e).subtract(t),Ce=t=>t.distanceFrom(ye),Se=(t,e)=>Math.atan2(Oe(t,e),ke(t,e)),be=t=>Se(ve,t),we=t=>t.eq(ye)?t:t.scalarDivide(Ce(t)),Te=function(t){let e=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];return we(new it(-t.y,t.x).scalarMultiply(e?1:-1))},Oe=(t,e)=>t.x*e.y-t.y*e.x,ke=(t,e)=>t.x*e.x+t.y*e.y,De=(t,e,s)=>{if(t.eq(e)||t.eq(s))return!0;const i=Oe(e,s),r=Oe(e,t),n=Oe(s,t);return i>=0?r>=0&&n<=0:!(r<=0&&n>=0)},Me="not-allowed";function Ee(t){return me(t.originX)===me(T)&&me(t.originY)===me(T)}function Pe(t){return.5-me(t)}const Ae=(t,e)=>t[e],je=(t,e,s,i)=>({e:t,transform:e,pointer:new it(s,i)});function Fe(t,e,s){const i=s,r=ue(t.getCenterPoint(),t.canvas.viewportTransform,void 0),n=be(xe(r,i))+x;return Math.round(n%x/_)}function Le(t,e,s,i,r){var n;let{target:o,corner:a}=t;const h=o.controls[a],l=(null===(n=o.canvas)||void 0===n?void 0:n.getZoom())||1,c=o.padding/l,u=function(t,e,s,i){const r=t.getRelativeCenterPoint(),n=void 0!==s&&void 0!==i?t.translateToGivenOrigin(r,T,T,s,i):new it(t.left,t.top);return(t.angle?e.rotate(-vt(t.angle),r):e).subtract(n)}(o,new it(i,r),e,s);return u.x>=c&&(u.x-=c),u.x<=-c&&(u.x+=c),u.y>=c&&(u.y-=c),u.y<=c&&(u.y+=c),u.x-=h.offsetX,u.y-=h.offsetY,u}const Re=(t,e,s,i)=>{const{target:r,offsetX:n,offsetY:o}=e,a=s-n,h=i-o,l=!Ae(r,"lockMovementX")&&r.left!==a,c=!Ae(r,"lockMovementY")&&r.top!==h;return l&&r.set(O,a),c&&r.set(k,h),(l||c)&&fe(A,je(t,e,s,i)),l||c},Ie={aliceblue:"#F0F8FF",antiquewhite:"#FAEBD7",aqua:"#0FF",aquamarine:"#7FFFD4",azure:"#F0FFFF",beige:"#F5F5DC",bisque:"#FFE4C4",black:"#000",blanchedalmond:"#FFEBCD",blue:"#00F",blueviolet:"#8A2BE2",brown:"#A52A2A",burlywood:"#DEB887",cadetblue:"#5F9EA0",chartreuse:"#7FFF00",chocolate:"#D2691E",coral:"#FF7F50",cornflowerblue:"#6495ED",cornsilk:"#FFF8DC",crimson:"#DC143C",cyan:"#0FF",darkblue:"#00008B",darkcyan:"#008B8B",darkgoldenrod:"#B8860B",darkgray:"#A9A9A9",darkgrey:"#A9A9A9",darkgreen:"#006400",darkkhaki:"#BDB76B",darkmagenta:"#8B008B",darkolivegreen:"#556B2F",darkorange:"#FF8C00",darkorchid:"#9932CC",darkred:"#8B0000",darksalmon:"#E9967A",darkseagreen:"#8FBC8F",darkslateblue:"#483D8B",darkslategray:"#2F4F4F",darkslategrey:"#2F4F4F",darkturquoise:"#00CED1",darkviolet:"#9400D3",deeppink:"#FF1493",deepskyblue:"#00BFFF",dimgray:"#696969",dimgrey:"#696969",dodgerblue:"#1E90FF",firebrick:"#B22222",floralwhite:"#FFFAF0",forestgreen:"#228B22",fuchsia:"#F0F",gainsboro:"#DCDCDC",ghostwhite:"#F8F8FF",gold:"#FFD700",goldenrod:"#DAA520",gray:"#808080",grey:"#808080",green:"#008000",greenyellow:"#ADFF2F",honeydew:"#F0FFF0",hotpink:"#FF69B4",indianred:"#CD5C5C",indigo:"#4B0082",ivory:"#FFFFF0",khaki:"#F0E68C",lavender:"#E6E6FA",lavenderblush:"#FFF0F5",lawngreen:"#7CFC00",lemonchiffon:"#FFFACD",lightblue:"#ADD8E6",lightcoral:"#F08080",lightcyan:"#E0FFFF",lightgoldenrodyellow:"#FAFAD2",lightgray:"#D3D3D3",lightgrey:"#D3D3D3",lightgreen:"#90EE90",lightpink:"#FFB6C1",lightsalmon:"#FFA07A",lightseagreen:"#20B2AA",lightskyblue:"#87CEFA",lightslategray:"#789",lightslategrey:"#789",lightsteelblue:"#B0C4DE",lightyellow:"#FFFFE0",lime:"#0F0",limegreen:"#32CD32",linen:"#FAF0E6",magenta:"#F0F",maroon:"#800000",mediumaquamarine:"#66CDAA",mediumblue:"#0000CD",mediumorchid:"#BA55D3",mediumpurple:"#9370DB",mediumseagreen:"#3CB371",mediumslateblue:"#7B68EE",mediumspringgreen:"#00FA9A",mediumturquoise:"#48D1CC",mediumvioletred:"#C71585",midnightblue:"#191970",mintcream:"#F5FFFA",mistyrose:"#FFE4E1",moccasin:"#FFE4B5",navajowhite:"#FFDEAD",navy:"#000080",oldlace:"#FDF5E6",olive:"#808000",olivedrab:"#6B8E23",orange:"#FFA500",orangered:"#FF4500",orchid:"#DA70D6",palegoldenrod:"#EEE8AA",palegreen:"#98FB98",paleturquoise:"#AFEEEE",palevioletred:"#DB7093",papayawhip:"#FFEFD5",peachpuff:"#FFDAB9",peru:"#CD853F",pink:"#FFC0CB",plum:"#DDA0DD",powderblue:"#B0E0E6",purple:"#800080",rebeccapurple:"#639",red:"#F00",rosybrown:"#BC8F8F",royalblue:"#4169E1",saddlebrown:"#8B4513",salmon:"#FA8072",sandybrown:"#F4A460",seagreen:"#2E8B57",seashell:"#FFF5EE",sienna:"#A0522D",silver:"#C0C0C0",skyblue:"#87CEEB",slateblue:"#6A5ACD",slategray:"#708090",slategrey:"#708090",snow:"#FFFAFA",springgreen:"#00FF7F",steelblue:"#4682B4",tan:"#D2B48C",teal:"#008080",thistle:"#D8BFD8",tomato:"#FF6347",turquoise:"#40E0D0",violet:"#EE82EE",wheat:"#F5DEB3",white:"#FFF",whitesmoke:"#F5F5F5",yellow:"#FF0",yellowgreen:"#9ACD32"},Be=(t,e,s)=>(s<0&&(s+=1),s>1&&(s-=1),s<1/6?t+6*(e-t)*s:s<.5?e:s<2/3?t+(e-t)*(2/3-s)*6:t),$e=(t,e,s,i)=>{t/=255,e/=255,s/=255;const r=Math.max(t,e,s),n=Math.min(t,e,s);let o,a;const h=(r+n)/2;if(r===n)o=a=0;else{const i=r-n;switch(a=h>.5?i/(2-r-n):i/(r+n),r){case t:o=(e-s)/i+(e0&&void 0!==arguments[0]?arguments[0]:"1";return parseFloat(t)/(t.endsWith("%")?100:1)},Ye=t=>Math.min(Math.round(t),255).toString(16).toUpperCase().padStart(2,"0"),We=t=>{let[e,s,i,r=1]=t;const n=Math.round(.3*e+.59*s+.11*i);return[n,n,n,r]};class Ve{constructor(e){if(t(this,"isUnrecognised",!1),e)if(e instanceof Ve)this.setSource([...e._source]);else if(Array.isArray(e)){const[t,s,i,r=1]=e;this.setSource([t,s,i,r])}else this.setSource(this._tryParsingColor(e));else this.setSource([0,0,0,1])}_tryParsingColor(t){return(t=t.toLowerCase())in Ie&&(t=Ie[t]),"transparent"===t?[255,255,255,0]:Ve.sourceFromHex(t)||Ve.sourceFromRgb(t)||Ve.sourceFromHsl(t)||(this.isUnrecognised=!0)&&[0,0,0,1]}getSource(){return this._source}setSource(t){this._source=t}toRgb(){const[t,e,s]=this.getSource();return`rgb(${t},${e},${s})`}toRgba(){return`rgba(${this.getSource().join(",")})`}toHsl(){const[t,e,s]=$e(...this.getSource());return`hsl(${t},${e}%,${s}%)`}toHsla(){const[t,e,s,i]=$e(...this.getSource());return`hsla(${t},${e}%,${s}%,${i})`}toHex(){return this.toHexa().slice(0,6)}toHexa(){const[t,e,s,i]=this.getSource();return`${Ye(t)}${Ye(e)}${Ye(s)}${Ye(Math.round(255*i))}`}getAlpha(){return this.getSource()[3]}setAlpha(t){return this._source[3]=t,this}toGrayscale(){return this.setSource(We(this.getSource())),this}toBlackWhite(t){const[e,,,s]=We(this.getSource()),i=e<(t||127)?0:255;return this.setSource([i,i,i,s]),this}overlayWith(t){t instanceof Ve||(t=new Ve(t));const e=this.getSource(),s=t.getSource(),[i,r,n]=e.map((t,e)=>Math.round(.5*t+.5*s[e]));return this.setSource([i,r,n,e[3]]),this}static fromRgb(t){return Ve.fromRgba(t)}static fromRgba(t){return new Ve(Ve.sourceFromRgb(t))}static sourceFromRgb(t){const e=t.match(/^rgba?\(\s*(\d{0,3}(?:\.\d+)?%?)\s*[\s|,]\s*(\d{0,3}(?:\.\d+)?%?)\s*[\s|,]\s*(\d{0,3}(?:\.\d+)?%?)\s*(?:\s*[,/]\s*(\d{0,3}(?:\.\d+)?%?)\s*)?\)$/i);if(e){const[t,s,i]=e.slice(1,4).map(t=>{const e=parseFloat(t);return t.endsWith("%")?Math.round(2.55*e):e});return[t,s,i,Xe(e[4])]}}static fromHsl(t){return Ve.fromHsla(t)}static fromHsla(t){return new Ve(Ve.sourceFromHsl(t))}static sourceFromHsl(t){const e=t.match(/^hsla?\(\s*([+-]?\d{0,3}(?:\.\d+)?(?:deg|turn|rad)?)\s*[\s|,]\s*(\d{0,3}(?:\.\d+)?%?)\s*[\s|,]\s*(\d{0,3}(?:\.\d+)?%?)\s*(?:\s*[,/]\s*(\d*(?:\.\d+)?%?)\s*)?\)$/i);if(!e)return;const s=(Ve.parseAngletoDegrees(e[1])%360+360)%360/360,i=parseFloat(e[2])/100,r=parseFloat(e[3])/100;let n,o,a;if(0===i)n=o=a=r;else{const t=r<=.5?r*(i+1):r+i-r*i,e=2*r-t;n=Be(e,t,s+1/3),o=Be(e,t,s),a=Be(e,t,s-1/3)}return[Math.round(255*n),Math.round(255*o),Math.round(255*a),Xe(e[4])]}static fromHex(t){return new Ve(Ve.sourceFromHex(t))}static sourceFromHex(t){if(t.match(/^#?(([0-9a-f]){3,4}|([0-9a-f]{2}){3,4})$/i)){const e=t.slice(t.indexOf("#")+1);let s;s=e.length<=4?e.split("").map(t=>t+t):e.match(/.{2}/g);const[i,r,n,o=255]=s.map(t=>parseInt(t,16));return[i,r,n,o/255]}}static parseAngletoDegrees(t){const e=t.toLowerCase(),s=parseFloat(e);return e.includes("rad")?yt(s):e.includes("turn")?360*s:s}}const Ge=function(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:b;const i=/\D{0,2}$/.exec(t),r=parseFloat(t),n=s.DPI;switch(null==i?void 0:i[0]){case"mm":return r*n/25.4;case"cm":return r*n/2.54;case"in":return r*n;case"pt":return r*n/72;case"pc":return r*n/72*12;case"em":return r*e;default:return r}},ze=t=>{const[e,s]=t.trim().split(" "),[i,r]=(n=e)&&n!==E?[n.slice(1,4),n.slice(5,8)]:n===E?[n,n]:["Mid","Mid"];var n;return{meetOrSlice:s||"meet",alignX:i,alignY:r}},He=function(t,e){let s,i,r=!(arguments.length>2&&void 0!==arguments[2])||arguments[2];if(e)if(e.toLive)s=`url(#SVGID_${e.id})`;else{const t=new Ve(e),r=t.getAlpha();s=t.toRgb(),1!==r&&(i=r.toString())}else s="none";return r?`${t}: ${s}; ${i?`${t}-opacity: ${i}; `:""}`:`${t}="${s}" ${i?`${t}-opacity="${i}" `:""}`};class Ne{getSvgStyles(t){const e=this.fillRule?this.fillRule:"nonzero",s=this.strokeWidth?this.strokeWidth:"0",i=this.strokeDashArray?this.strokeDashArray.join(" "):E,r=this.strokeDashOffset?this.strokeDashOffset:"0",n=this.strokeLineCap?this.strokeLineCap:"butt",o=this.strokeLineJoin?this.strokeLineJoin:"miter",a=this.strokeMiterLimit?this.strokeMiterLimit:"4",h=void 0!==this.opacity?this.opacity:"1",l=this.visible?"":" visibility: hidden;",c=t?"":this.getSvgFilter(),u=He(H,this.fill);return[He(N,this.stroke),"stroke-width: ",s,"; ","stroke-dasharray: ",i,"; ","stroke-linecap: ",n,"; ","stroke-dashoffset: ",r,"; ","stroke-linejoin: ",o,"; ","stroke-miterlimit: ",a,"; ",u,"fill-rule: ",e,"; ","opacity: ",h,";",c,l].join("")}getSvgFilter(){return this.shadow?`filter: url(#SVGID_${this.shadow.id});`:""}getSvgCommons(){return[this.id?`id="${this.id}" `:"",this.clipPath?`clip-path="url(#${this.clipPath.clipPathId})" `:""].join("")}getSvgTransform(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"";const s=t?this.calcTransformMatrix():this.calcOwnMatrix();return`${`transform="${Xt(s)}`}${e}" `}_toSVG(t){return[""]}toSVG(t){return this._createBaseSVGMarkup(this._toSVG(t),{reviver:t})}toClipPathSVG(t){return"\t"+this._createBaseClipPathSVGMarkup(this._toSVG(t),{reviver:t})}_createBaseClipPathSVGMarkup(t){let{reviver:e,additionalTransform:s=""}=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};const i=[this.getSvgTransform(!0,s),this.getSvgCommons()].join(""),r=t.indexOf("COMMON_PARTS");return t[r]=i,e?e(t.join("")):t.join("")}_createBaseSVGMarkup(t){let{noStyle:e,reviver:s,withShadow:i,additionalTransform:r}=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};const n=e?"":`style="${this.getSvgStyles()}" `,o=i?`style="${this.getSvgFilter()}" `:"",a=this.clipPath,h=this.strokeUniform?'vector-effect="non-scaling-stroke" ':"",l=a&&a.absolutePositioned,c=this.stroke,u=this.fill,d=this.shadow,g=[],f=t.indexOf("COMMON_PARTS");let p;a&&(a.clipPathId=`CLIPPATH_${ut()}`,p=`\n${a.toClipPathSVG(s)}\n`),l&&g.push("\n"),g.push("\n");const m=[n,h,e?"":this.addPaintOrder()," ",r?`transform="${r}" `:""].join("");return t[f]=m,Yt(u)&&g.push(u.toSVG(this)),Yt(c)&&g.push(c.toSVG(this)),d&&g.push(d.toSVG(this)),a&&g.push(p),g.push(t.join("")),g.push("\n"),l&&g.push("\n"),s?s(g.join("")):g.join("")}addPaintOrder(){return this.paintFirst!==H?` paint-order="${this.paintFirst}" `:""}}function Ue(t){return new RegExp("^("+t.join("|")+")\\b","i")}const qe="textDecorationThickness",Ke=["fontSize","fontWeight","fontFamily","fontStyle"],Je=["underline","overline","linethrough"],Qe=[...Ke,"lineHeight","text","charSpacing","textAlign","styles","path","pathStartOffset","pathSide","pathAlign"],Ze=[...Qe,...Je,"textBackgroundColor","direction",qe],ts=[...Ke,...Je,N,"strokeWidth",H,"deltaY","textBackgroundColor",qe],es={_reNewline:P,_reSpacesAndTabs:/[ \t\r]/g,_reSpaceAndTab:/[ \t\r]/,_reWords:/\S+/g,fontSize:40,fontWeight:"normal",fontFamily:"Times New Roman",underline:!1,overline:!1,linethrough:!1,textAlign:O,fontStyle:"normal",lineHeight:1.16,textBackgroundColor:"",stroke:null,shadow:null,path:void 0,pathStartOffset:0,pathSide:O,pathAlign:"baseline",charSpacing:0,deltaY:0,direction:"ltr",CACHE_FONT_SIZE:400,MIN_TEXT_WIDTH:2,superscript:{size:.6,baseline:-.35},subscript:{size:.6,baseline:.11},_fontSizeFraction:.222,offsets:{underline:.1,linethrough:-.28167,overline:-.81333},_fontSizeMult:1.13,[qe]:66.667},ss="justify",is="justify-left",rs="justify-right",ns="justify-center",os=String.raw`[-+]?(?:\d*\.\d+|\d+\.?)(?:[eE][-+]?\d+)?`,as=String.raw`(?:\s*,?\s+|\s*,\s*)`,hs="http://www.w3.org/2000/svg",ls=new RegExp("(normal|italic)?\\s*(normal|small-caps)?\\s*(normal|bold|bolder|lighter|100|200|300|400|500|600|700|800|900)?\\s*("+os+"(?:px|cm|mm|em|pt|pc|in)*)(?:\\/(normal|"+os+"))?\\s+(.*)"),cs={cx:O,x:O,r:"radius",cy:k,y:k,display:"visible",visibility:"visible",transform:"transformMatrix","fill-opacity":"fillOpacity","fill-rule":"fillRule","font-family":"fontFamily","font-size":"fontSize","font-style":"fontStyle","font-weight":"fontWeight","letter-spacing":"charSpacing","paint-order":"paintFirst","stroke-dasharray":"strokeDashArray","stroke-dashoffset":"strokeDashOffset","stroke-linecap":"strokeLineCap","stroke-linejoin":"strokeLineJoin","stroke-miterlimit":"strokeMiterLimit","stroke-opacity":"strokeOpacity","stroke-width":"strokeWidth","text-decoration":"textDecoration","text-anchor":"textAnchor",opacity:"opacity","clip-path":"clipPath","clip-rule":"clipRule","vector-effect":"strokeUniform","image-rendering":"imageSmoothing","text-decoration-thickness":qe},us="font-size",ds="clip-path",gs=Ue(["path","circle","polygon","polyline","ellipse","rect","line","image","text"]),fs=Ue(["symbol","image","marker","pattern","view","svg"]),ps=Ue(["symbol","g","a","svg","clipPath","defs"]),ms=new RegExp(String.raw`^\s*(${os})${as}(${os})${as}(${os})${as}(${os})\s*$`),vs="(-?\\d+(?:\\.\\d*)?(?:px)?(?:\\s?|$))?",ys=new RegExp("(?:\\s|^)"+vs+vs+"("+os+"?(?:px)?)?(?:\\s?|$)(?:$|\\s)");class _s{constructor(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};const e="string"==typeof t?_s.parseShadow(t):t;Object.assign(this,_s.ownDefaults,e),this.id=ut()}static parseShadow(t){const e=t.trim(),[,s=0,i=0,r=0]=(ys.exec(e)||[]).map(t=>parseFloat(t)||0);return{color:(e.replace(ys,"")||"rgb(0,0,0)").trim(),offsetX:s,offsetY:i,blur:r}}toString(){return[this.offsetX,this.offsetY,this.blur,this.color].join("px ")}toSVG(t){const e=_e(new it(this.offsetX,this.offsetY),vt(-t.angle)),i=new Ve(this.color);let r=40,n=40;return t.width&&t.height&&(r=100*$t((Math.abs(e.x)+this.blur)/t.width,s.NUM_FRACTION_DIGITS)+20,n=100*$t((Math.abs(e.y)+this.blur)/t.height,s.NUM_FRACTION_DIGITS)+20),t.flipX&&(e.x*=-1),t.flipY&&(e.y*=-1),`\n\t\n\t\n\t\n\t\n\t\n\t\t\n\t\t\n\t\n\n`}toObject(){const t={color:this.color,blur:this.blur,offsetX:this.offsetX,offsetY:this.offsetY,affectStroke:this.affectStroke,nonScaling:this.nonScaling,type:this.constructor.type},e=_s.ownDefaults;return this.includeDefaultValues?t:Bt(t,(t,s)=>t!==e[s])}static async fromObject(t){return new this(t)}}t(_s,"ownDefaults",{color:"rgb(0,0,0)",blur:0,offsetX:0,offsetY:0,affectStroke:!1,includeDefaultValues:!0,nonScaling:!1}),t(_s,"type","shadow"),J.setClass(_s,"shadow");const xs=(t,e,s)=>Math.max(t,Math.min(e,s)),Cs=[k,O,W,V,"flipX","flipY","originX","originY","angle","opacity","globalCompositeOperation","shadow","visible",G,z],Ss=[H,N,"strokeWidth","strokeDashArray","width","height","paintFirst","strokeUniform","strokeLineCap","strokeDashOffset","strokeLineJoin","strokeMiterLimit","backgroundColor","clipPath"],bs={top:0,left:0,width:0,height:0,angle:0,flipX:!1,flipY:!1,scaleX:1,scaleY:1,minScaleLimit:0,skewX:0,skewY:0,originX:O,originY:k,strokeWidth:1,strokeUniform:!1,padding:0,opacity:1,paintFirst:H,fill:"rgb(0,0,0)",fillRule:"nonzero",stroke:null,strokeDashArray:null,strokeDashOffset:0,strokeLineCap:"butt",strokeLineJoin:"miter",strokeMiterLimit:4,globalCompositeOperation:"source-over",backgroundColor:"",shadow:null,visible:!0,includeDefaultValues:!0,excludeFromExport:!1,objectCaching:!0,clipPath:void 0,inverted:!1,absolutePositioned:!1,centeredRotation:!0,centeredScaling:!1,dirty:!0},ws=(t,e,s,i)=>(tt*Math.pow(2,10*(i-=1))*Math.sin((i*r-e)*x/s),Os=(t,e,s,i)=>-s*Math.cos(t/i*y)+s+e,ks=(t,e,s,i)=>(t/=i)<1/2.75?s*(7.5625*t*t)+e:t<2/2.75?s*(7.5625*(t-=1.5/2.75)*t+.75)+e:t<2.5/2.75?s*(7.5625*(t-=2.25/2.75)*t+.9375)+e:s*(7.5625*(t-=2.625/2.75)*t+.984375)+e,Ds=(t,e,s,i)=>s-ks(i-t,0,s,i)+e;var Ms=Object.freeze({__proto__:null,defaultEasing:Os,easeInBack:function(t,e,s,i){let r=arguments.length>4&&void 0!==arguments[4]?arguments[4]:1.70158;return s*(t/=i)*t*((r+1)*t-r)+e},easeInBounce:Ds,easeInCirc:(t,e,s,i)=>-s*(Math.sqrt(1-(t/=i)*t)-1)+e,easeInCubic:(t,e,s,i)=>s*(t/i)**3+e,easeInElastic:(t,e,s,i)=>{const r=s;let n=0;if(0===t)return e;if(1===(t/=i))return e+s;n||(n=.3*i);const{a:o,s:a,p:h}=ws(r,s,n,1.70158);return-Ts(o,a,h,t,i)+e},easeInExpo:(t,e,s,i)=>0===t?e:s*2**(10*(t/i-1))+e,easeInOutBack:function(t,e,s,i){let r=arguments.length>4&&void 0!==arguments[4]?arguments[4]:1.70158;return(t/=i/2)<1?s/2*(t*t*((1+(r*=1.525))*t-r))+e:s/2*((t-=2)*t*((1+(r*=1.525))*t+r)+2)+e},easeInOutBounce:(t,e,s,i)=>t(t/=i/2)<1?-s/2*(Math.sqrt(1-t**2)-1)+e:s/2*(Math.sqrt(1-(t-=2)*t)+1)+e,easeInOutCubic:(t,e,s,i)=>(t/=i/2)<1?s/2*t**3+e:s/2*((t-2)**3+2)+e,easeInOutElastic:(t,e,s,i)=>{const r=s;let n=0;if(0===t)return e;if(2===(t/=i/2))return e+s;n||(n=i*(.3*1.5));const{a:o,s:a,p:h,c:l}=ws(r,s,n,1.70158);return t<1?-.5*Ts(o,a,h,t,i)+e:o*Math.pow(2,-10*(t-=1))*Math.sin((t*i-a)*x/h)*.5+l+e},easeInOutExpo:(t,e,s,i)=>0===t?e:t===i?e+s:(t/=i/2)<1?s/2*2**(10*(t-1))+e:s/2*-(2**(-10*--t)+2)+e,easeInOutQuad:(t,e,s,i)=>(t/=i/2)<1?s/2*t**2+e:-s/2*(--t*(t-2)-1)+e,easeInOutQuart:(t,e,s,i)=>(t/=i/2)<1?s/2*t**4+e:-s/2*((t-=2)*t**3-2)+e,easeInOutQuint:(t,e,s,i)=>(t/=i/2)<1?s/2*t**5+e:s/2*((t-2)**5+2)+e,easeInOutSine:(t,e,s,i)=>-s/2*(Math.cos(Math.PI*t/i)-1)+e,easeInQuad:(t,e,s,i)=>s*(t/=i)*t+e,easeInQuart:(t,e,s,i)=>s*(t/=i)*t**3+e,easeInQuint:(t,e,s,i)=>s*(t/i)**5+e,easeInSine:(t,e,s,i)=>-s*Math.cos(t/i*y)+s+e,easeOutBack:function(t,e,s,i){let r=arguments.length>4&&void 0!==arguments[4]?arguments[4]:1.70158;return s*((t=t/i-1)*t*((r+1)*t+r)+1)+e},easeOutBounce:ks,easeOutCirc:(t,e,s,i)=>s*Math.sqrt(1-(t=t/i-1)*t)+e,easeOutCubic:(t,e,s,i)=>s*((t/i-1)**3+1)+e,easeOutElastic:(t,e,s,i)=>{const r=s;let n=0;if(0===t)return e;if(1===(t/=i))return e+s;n||(n=.3*i);const{a:o,s:a,p:h,c:l}=ws(r,s,n,1.70158);return o*2**(-10*t)*Math.sin((t*i-a)*x/h)+l+e},easeOutExpo:(t,e,s,i)=>t===i?e+s:s*-(2**(-10*t/i)+1)+e,easeOutQuad:(t,e,s,i)=>-s*(t/=i)*(t-2)+e,easeOutQuart:(t,e,s,i)=>-s*((t=t/i-1)*t**3-1)+e,easeOutQuint:(t,e,s,i)=>s*((t/i-1)**5+1)+e,easeOutSine:(t,e,s,i)=>s*Math.sin(t/i*y)+e});const Es=()=>!1;class Ps{constructor(e){let{startValue:s,byValue:i,duration:r=500,delay:n=0,easing:o=Os,onStart:a=v,onChange:h=v,onComplete:l=v,abort:c=Es,target:u}=e;t(this,"_state","pending"),t(this,"durationProgress",0),t(this,"valueProgress",0),this.tick=this.tick.bind(this),this.duration=r,this.delay=n,this.easing=o,this._onStart=a,this._onChange=h,this._onComplete=l,this._abort=c,this.target=u,this.startValue=s,this.byValue=i,this.value=this.startValue,this.endValue=Object.freeze(this.calculate(this.duration).value)}get state(){return this._state}isDone(){return"aborted"===this._state||"completed"===this._state}start(){const t=t=>{"pending"===this._state&&(this.startTime=t||+new Date,this._state="running",this._onStart(),this.tick(this.startTime))};this.register(),this.delay>0?setTimeout(()=>ht(t),this.delay):ht(t)}tick(t){const e=(t||+new Date)-this.startTime,s=Math.min(e,this.duration);this.durationProgress=s/this.duration;const{value:i,valueProgress:r}=this.calculate(s);this.value=Object.freeze(i),this.valueProgress=r,"aborted"!==this._state&&(this._abort(this.value,this.valueProgress,this.durationProgress)?(this._state="aborted",this.unregister()):e>=this.duration?(this.durationProgress=this.valueProgress=1,this._onChange(this.endValue,this.valueProgress,this.durationProgress),this._state="completed",this._onComplete(this.endValue,this.valueProgress,this.durationProgress),this.unregister()):(this._onChange(this.value,this.valueProgress,this.durationProgress),ht(this.tick)))}register(){Q.push(this)}unregister(){Q.remove(this)}abort(){this._state="aborted",this.unregister()}}class As extends Ps{constructor(t){let{startValue:e=0,endValue:s=100,...i}=t;super({...i,startValue:e,byValue:s-e})}calculate(t){const e=this.easing(t,this.startValue,this.byValue,this.duration);return{value:e,valueProgress:Math.abs((e-this.startValue)/this.byValue)}}}class js extends Ps{constructor(t){let{startValue:e=[0],endValue:s=[100],...i}=t;super({...i,startValue:e,byValue:s.map((t,s)=>t-e[s])})}calculate(t){const e=this.startValue.map((e,s)=>this.easing(t,e,this.byValue[s],this.duration,s));return{value:e,valueProgress:Math.abs((e[0]-this.startValue[0])/this.byValue[0])}}}const Fs=(t,e,s,i)=>e+s*(1-Math.cos(t/i*y)),Ls=t=>t&&((e,s,i)=>t(new Ve(e).toRgba(),s,i));class Rs extends Ps{constructor(t){let{startValue:e,endValue:s,easing:i=Fs,onChange:r,onComplete:n,abort:o,...a}=t;const h=new Ve(e).getSource(),l=new Ve(s).getSource();super({...a,startValue:h,byValue:l.map((t,e)=>t-h[e]),easing:i,onChange:Ls(r),onComplete:Ls(n),abort:Ls(o)})}calculate(t){const[e,s,i,r]=this.startValue.map((e,s)=>this.easing(t,e,this.byValue[s],this.duration,s)),n=[...[e,s,i].map(Math.round),xs(0,r,1)];return{value:n,valueProgress:n.map((t,e)=>0!==this.byValue[e]?Math.abs((t-this.startValue[e])/this.byValue[e]):0).find(t=>0!==t)||0}}}function Is(t){const e=(t=>Array.isArray(t.startValue)||Array.isArray(t.endValue))(t)?new js(t):new As(t);return e.start(),e}function Bs(t){const e=new Rs(t);return e.start(),e}class $s{constructor(t){this.status=t,this.points=[]}includes(t){return this.points.some(e=>e.eq(t))}append(){for(var t=arguments.length,e=new Array(t),s=0;s!this.includes(t))),this}static isPointContained(t,e,s){let i=arguments.length>3&&void 0!==arguments[3]&&arguments[3];if(e.eq(s))return t.eq(e);if(e.x===s.x)return t.x===e.x&&(i||t.y>=Math.min(e.y,s.y)&&t.y<=Math.max(e.y,s.y));if(e.y===s.y)return t.y===e.y&&(i||t.x>=Math.min(e.x,s.x)&&t.x<=Math.max(e.x,s.x));{const r=xe(e,s),n=xe(e,t).divide(r);return i?Math.abs(n.x)===Math.abs(n.y):n.x===n.y&&n.x>=0&&n.x<=1}}static isPointInPolygon(t,e){const s=new it(t).setX(Math.min(t.x-1,...e.map(t=>t.x)));let i=0;for(let r=0;r4&&void 0!==arguments[4])||arguments[4],n=!(arguments.length>5&&void 0!==arguments[5])||arguments[5];const o=e.x-t.x,a=e.y-t.y,h=i.x-s.x,l=i.y-s.y,c=t.x-s.x,u=t.y-s.y,d=h*u-l*c,g=o*u-a*c,f=l*o-h*a;if(0!==f){const e=d/f,s=g/f;return(r||0<=e&&e<=1)&&(n||0<=s&&s<=1)?new $s("Intersection").append(new it(t.x+e*o,t.y+e*a)):new $s}if(0===d||0===g){const o=r||n||$s.isPointContained(t,s,i)||$s.isPointContained(e,s,i)||$s.isPointContained(s,t,e)||$s.isPointContained(i,t,e);return new $s(o?"Coincident":void 0)}return new $s("Parallel")}static intersectSegmentLine(t,e,s,i){return $s.intersectLineLine(t,e,s,i,!1,!0)}static intersectSegmentSegment(t,e,s,i){return $s.intersectLineLine(t,e,s,i,!1,!1)}static intersectLinePolygon(t,e,s){let i=!(arguments.length>3&&void 0!==arguments[3])||arguments[3];const r=new $s,n=s.length;for(let o,a,h,l=0;l0&&(r.status="Intersection"),r}static intersectSegmentPolygon(t,e,s){return $s.intersectLinePolygon(t,e,s,!1)}static intersectPolygonPolygon(t,e){const s=new $s,i=t.length,r=[];for(let n=0;n0&&r.length===t.length?new $s("Coincident"):(s.points.length>0&&(s.status="Intersection"),s)}static intersectPolygonRectangle(t,e,s){const i=e.min(s),r=e.max(s),n=new it(r.x,i.y),o=new it(i.x,r.y);return $s.intersectPolygonPolygon(t,[i,n,r,o])}}class Xs extends at{getX(){return this.getXY().x}setX(t){this.setXY(this.getXY().setX(t))}getY(){return this.getXY().y}setY(t){this.setXY(this.getXY().setY(t))}getRelativeX(){return this.left}setRelativeX(t){this.left=t}getRelativeY(){return this.top}setRelativeY(t){this.top=t}getXY(){const t=this.getRelativeXY();return this.group?xt(t,this.group.calcTransformMatrix()):t}setXY(t,e,s){this.group&&(t=xt(t,Ct(this.group.calcTransformMatrix()))),this.setRelativeXY(t,e,s)}getRelativeXY(){return new it(this.left,this.top)}setRelativeXY(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:this.originX,s=arguments.length>2&&void 0!==arguments[2]?arguments[2]:this.originY;this.setPositionByOrigin(t,e,s)}isStrokeAccountedForInDimensions(){return!1}getCoords(){const{tl:t,tr:e,br:s,bl:i}=this.aCoords||(this.aCoords=this.calcACoords()),r=[t,e,s,i];if(this.group){const t=this.group.calcTransformMatrix();return r.map(e=>xt(e,t))}return r}intersectsWithRect(t,e){return"Intersection"===$s.intersectPolygonRectangle(this.getCoords(),t,e).status}intersectsWithObject(t){const e=$s.intersectPolygonPolygon(this.getCoords(),t.getCoords());return"Intersection"===e.status||"Coincident"===e.status||t.isContainedWithinObject(this)||this.isContainedWithinObject(t)}isContainedWithinObject(t){return this.getCoords().every(e=>t.containsPoint(e))}isContainedWithinRect(t,e){const{left:s,top:i,width:r,height:n}=this.getBoundingRect();return s>=t.x&&s+r<=e.x&&i>=t.y&&i+n<=e.y}isOverlapping(t){return this.intersectsWithObject(t)||this.isContainedWithinObject(t)||t.isContainedWithinObject(this)}containsPoint(t){return $s.isPointInPolygon(t,this.getCoords())}isOnScreen(){if(!this.canvas)return!1;const{tl:t,br:e}=this.canvas.vptCoords;return!!this.getCoords().some(s=>s.x<=e.x&&s.x>=t.x&&s.y<=e.y&&s.y>=t.y)||(!!this.intersectsWithRect(t,e)||this.containsPoint(t.midPointFrom(e)))}isPartiallyOnScreen(){if(!this.canvas)return!1;const{tl:t,br:e}=this.canvas.vptCoords;if(this.intersectsWithRect(t,e))return!0;return this.getCoords().every(s=>(s.x>=e.x||s.x<=t.x)&&(s.y>=e.y||s.y<=t.y))&&this.containsPoint(t.midPointFrom(e))}getBoundingRect(){return re(this.getCoords())}getScaledWidth(){return this._getTransformedDimensions().x}getScaledHeight(){return this._getTransformedDimensions().y}scale(t){this._set(W,t),this._set(V,t),this.setCoords()}scaleToWidth(t){const e=this.getBoundingRect().width/this.getScaledWidth();return this.scale(t/this.width/e)}scaleToHeight(t){const e=this.getBoundingRect().height/this.getScaledHeight();return this.scale(t/this.height/e)}getCanvasRetinaScaling(){var t;return(null===(t=this.canvas)||void 0===t?void 0:t.getRetinaScaling())||1}getTotalAngle(){return this.group?yt(wt(this.calcTransformMatrix())):this.angle}getViewportTransform(){var t;return(null===(t=this.canvas)||void 0===t?void 0:t.viewportTransform)||S.concat()}calcACoords(){const t=kt({angle:this.angle}),{x:e,y:s}=this.getRelativeCenterPoint(),i=Ot(e,s),r=St(i,t),n=this._getTransformedDimensions(),o=n.x/2,a=n.y/2;return{tl:xt({x:-o,y:-a},r),tr:xt({x:o,y:-a},r),bl:xt({x:-o,y:a},r),br:xt({x:o,y:a},r)}}setCoords(){this.aCoords=this.calcACoords()}transformMatrixKey(){let t=arguments.length>0&&void 0!==arguments[0]&&arguments[0],e=[];return!t&&this.group&&(e=this.group.transformMatrixKey(t)),e.push(this.top,this.left,this.width,this.height,this.scaleX,this.scaleY,this.angle,this.strokeWidth,this.skewX,this.skewY,+this.flipX,+this.flipY,me(this.originX),me(this.originY)),e}calcTransformMatrix(){let t=arguments.length>0&&void 0!==arguments[0]&&arguments[0],e=this.calcOwnMatrix();if(t||!this.group)return e;const s=this.transformMatrixKey(t),i=this.matrixCache;return i&&i.key.every((t,e)=>t===s[e])?i.value:(this.group&&(e=St(this.group.calcTransformMatrix(!1),e)),this.matrixCache={key:s,value:e},e)}calcOwnMatrix(){const t=this.transformMatrixKey(!0),e=this.ownMatrixCache;if(e&&e.key===t)return e.value;const s=this.getRelativeCenterPoint(),i={angle:this.angle,translateX:s.x,translateY:s.y,scaleX:this.scaleX,scaleY:this.scaleY,skewX:this.skewX,skewY:this.skewY,flipX:this.flipX,flipY:this.flipY},r=jt(i);return this.ownMatrixCache={key:t,value:r},r}_getNonTransformedDimensions(){return new it(this.width,this.height).scalarAdd(this.strokeWidth)}_calculateCurrentDimensions(t){return this._getTransformedDimensions(t).transform(this.getViewportTransform(),!0).scalarAdd(2*this.padding)}_getTransformedDimensions(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};const e={scaleX:this.scaleX,scaleY:this.scaleY,skewX:this.skewX,skewY:this.skewY,width:this.width,height:this.height,strokeWidth:this.strokeWidth,...t},s=e.strokeWidth;let i=s,r=0;this.strokeUniform&&(i=0,r=s);const n=e.width+i,o=e.height+i;let a;return a=0===e.skewX&&0===e.skewY?new it(n*e.scaleX,o*e.scaleY):le(n,o,At(e)),a.scalarAdd(r)}translateToGivenOrigin(t,e,s,i,r){let n=t.x,o=t.y;const a=me(i)-me(e),h=me(r)-me(s);if(a||h){const t=this._getTransformedDimensions();n+=a*t.x,o+=h*t.y}return new it(n,o)}translateToCenterPoint(t,e,s){if(e===T&&s===T)return t;const i=this.translateToGivenOrigin(t,e,s,T,T);return this.angle?i.rotate(vt(this.angle),t):i}translateToOriginPoint(t,e,s){const i=this.translateToGivenOrigin(t,T,T,e,s);return this.angle?i.rotate(vt(this.angle),t):i}getCenterPoint(){const t=this.getRelativeCenterPoint();return this.group?xt(t,this.group.calcTransformMatrix()):t}getRelativeCenterPoint(){return this.translateToCenterPoint(new it(this.left,this.top),this.originX,this.originY)}getPointByOrigin(t,e){return this.translateToOriginPoint(this.getRelativeCenterPoint(),t,e)}setPositionByOrigin(t,e,s){const i=this.translateToCenterPoint(t,e,s),r=this.translateToOriginPoint(i,this.originX,this.originY);this.set({left:r.x,top:r.y})}_getLeftTopCoords(){return this.translateToOriginPoint(this.getRelativeCenterPoint(),O,k)}}let Ys=class e extends Xs{static getDefaults(){return e.ownDefaults}get type(){const t=this.constructor.type;return"FabricObject"===t?"object":t.toLowerCase()}set type(t){i("warn","Setting type has no effect",t)}constructor(s){super(),t(this,"_cacheContext",null),Object.assign(this,e.ownDefaults),this.setOptions(s)}_createCacheCanvas(){this._cacheCanvas=dt(),this._cacheContext=this._cacheCanvas.getContext("2d"),this._updateCacheCanvas(),this.dirty=!0}_limitCacheSize(t){const e=t.width,i=t.height,r=s.maxCacheSideLimit,n=s.minCacheSideLimit;if(e<=r&&i<=r&&e*i<=s.perfLimitSizeTotal)return el&&(t.zoomX/=e/l,t.width=l,t.capped=!0),i>c&&(t.zoomY/=i/c,t.height=c,t.capped=!0),t}_getCacheCanvasDimensions(){const t=this.getTotalObjectScaling(),e=this._getTransformedDimensions({skewX:0,skewY:0}),s=e.x*t.x/this.scaleX,i=e.y*t.y/this.scaleY;return{width:Math.ceil(s+2),height:Math.ceil(i+2),zoomX:t.x,zoomY:t.y,x:s,y:i}}_updateCacheCanvas(){const t=this._cacheCanvas,e=this._cacheContext,{width:s,height:i,zoomX:r,zoomY:n,x:o,y:a}=this._limitCacheSize(this._getCacheCanvasDimensions()),h=s!==t.width||i!==t.height,l=this.zoomX!==r||this.zoomY!==n;if(!t||!e)return!1;if(h||l){s!==t.width||i!==t.height?(t.width=s,t.height=i):(e.setTransform(1,0,0,1,0,0),e.clearRect(0,0,t.width,t.height));const h=o/2,l=a/2;return this.cacheTranslationX=Math.round(t.width/2-h)+h,this.cacheTranslationY=Math.round(t.height/2-l)+l,e.translate(this.cacheTranslationX,this.cacheTranslationY),e.scale(r,n),this.zoomX=r,this.zoomY=n,!0}return!1}setOptions(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};this._setOptions(t)}transform(t){const e=this.group&&!this.group._transformDone||this.group&&this.canvas&&t===this.canvas.contextTop,s=this.calcTransformMatrix(!e);t.transform(s[0],s[1],s[2],s[3],s[4],s[5])}getObjectScaling(){if(!this.group)return new it(Math.abs(this.scaleX),Math.abs(this.scaleY));const t=Tt(this.calcTransformMatrix());return new it(Math.abs(t.scaleX),Math.abs(t.scaleY))}getTotalObjectScaling(){const t=this.getObjectScaling();if(this.canvas){const e=this.canvas.getZoom(),s=this.getCanvasRetinaScaling();return t.scalarMultiply(e*s)}return t}getObjectOpacity(){let t=this.opacity;return this.group&&(t*=this.group.getObjectOpacity()),t}_constrainScale(t){return Math.abs(t){t.transform(i)}),e.parentClipPaths.push(t),t.absolutePositioned){const t=Ct(this.calcTransformMatrix());i.transform(t[0],t[1],t[2],t[3],t[4],t[5])}return t.transform(i),t.drawObject(i,!0,e),s}_drawClipPath(t,e,s){if(!e)return;e._transformDone=!0;const i=this.createClipPathLayer(e,s);this.drawClipPathOnCache(t,e,i)}drawCacheOnCanvas(t){t.scale(1/this.zoomX,1/this.zoomY),t.drawImage(this._cacheCanvas,-this.cacheTranslationX,-this.cacheTranslationY)}isCacheDirty(){let t=arguments.length>0&&void 0!==arguments[0]&&arguments[0];if(this.isNotVisible())return!1;const e=this._cacheCanvas,s=this._cacheContext;return!(!e||!s||t||!this._updateCacheCanvas())||!!(this.dirty||this.clipPath&&this.clipPath.absolutePositioned)&&(e&&s&&!t&&(s.save(),s.setTransform(1,0,0,1,0,0),s.clearRect(0,0,e.width,e.height),s.restore()),!0)}_renderBackground(t){if(!this.backgroundColor)return;const e=this._getNonTransformedDimensions();t.fillStyle=this.backgroundColor,t.fillRect(-e.x/2,-e.y/2,e.x,e.y),this._removeShadow(t)}_setOpacity(t){this.group&&!this.group._transformDone?t.globalAlpha=this.getObjectOpacity():t.globalAlpha*=this.opacity}_setStrokeStyles(t,e){const s=e.stroke;s&&(t.lineWidth=e.strokeWidth,t.lineCap=e.strokeLineCap,t.lineDashOffset=e.strokeDashOffset,t.lineJoin=e.strokeLineJoin,t.miterLimit=e.strokeMiterLimit,Yt(s)?"percentage"===s.gradientUnits||s.gradientTransform||s.patternTransform?this._applyPatternForTransformedGradient(t,s):(t.strokeStyle=s.toLive(t),this._applyPatternGradientTransform(t,s)):t.strokeStyle=e.stroke)}_setFillStyles(t,e){let{fill:s}=e;s&&(Yt(s)?(t.fillStyle=s.toLive(t),this._applyPatternGradientTransform(t,s)):t.fillStyle=s)}_setClippingProperties(t){t.globalAlpha=1,t.strokeStyle="transparent",t.fillStyle="#000000"}_setLineDash(t,e){e&&0!==e.length&&t.setLineDash(e)}_setShadow(t){if(!this.shadow)return;const e=this.shadow,i=this.canvas,r=this.getCanvasRetinaScaling(),[n,,,o]=(null==i?void 0:i.viewportTransform)||S,a=n*r,h=o*r,l=e.nonScaling?new it(1,1):this.getObjectScaling();t.shadowColor=e.color,t.shadowBlur=e.blur*s.browserShadowBlurConstant*(a+h)*(l.x+l.y)/4,t.shadowOffsetX=e.offsetX*a*l.x,t.shadowOffsetY=e.offsetY*h*l.y}_removeShadow(t){this.shadow&&(t.shadowColor="",t.shadowBlur=t.shadowOffsetX=t.shadowOffsetY=0)}_applyPatternGradientTransform(t,e){if(!Yt(e))return{offsetX:0,offsetY:0};const s=e.gradientTransform||e.patternTransform,i=-this.width/2+e.offsetX||0,r=-this.height/2+e.offsetY||0;return"percentage"===e.gradientUnits?t.transform(this.width,0,0,this.height,i,r):t.transform(1,0,0,1,i,r),s&&t.transform(s[0],s[1],s[2],s[3],s[4],s[5]),{offsetX:i,offsetY:r}}_renderPaintInOrder(t){this.paintFirst===N?(this._renderStroke(t),this._renderFill(t)):(this._renderFill(t),this._renderStroke(t))}_render(t){}_renderFill(t){this.fill&&(t.save(),this._setFillStyles(t,this),"evenodd"===this.fillRule?t.fill("evenodd"):t.fill(),t.restore())}_renderStroke(t){if(this.stroke&&0!==this.strokeWidth){if(this.shadow&&!this.shadow.affectStroke&&this._removeShadow(t),t.save(),this.strokeUniform){const e=this.getObjectScaling();t.scale(1/e.x,1/e.y)}this._setLineDash(t,this.strokeDashArray),this._setStrokeStyles(t,this),t.stroke(),t.restore()}}_applyPatternForTransformedGradient(t,e){var s;const i=this._limitCacheSize(this._getCacheCanvasDimensions()),r=this.getCanvasRetinaScaling(),n=i.x/this.scaleX/r,o=i.y/this.scaleY/r,a=ft({width:Math.ceil(n),height:Math.ceil(o)}),h=a.getContext("2d");h&&(h.beginPath(),h.moveTo(0,0),h.lineTo(n,0),h.lineTo(n,o),h.lineTo(0,o),h.closePath(),h.translate(n/2,o/2),h.scale(i.zoomX/this.scaleX/r,i.zoomY/this.scaleY/r),this._applyPatternGradientTransform(h,e),h.fillStyle=e.toLive(t),h.fill(),t.translate(-this.width/2-this.strokeWidth/2,-this.height/2-this.strokeWidth/2),t.scale(r*this.scaleX/i.zoomX,r*this.scaleY/i.zoomY),t.strokeStyle=null!==(s=h.createPattern(a,"no-repeat"))&&void 0!==s?s:"")}_findCenterFromElement(){return new it(this.left+this.width/2,this.top+this.height/2)}clone(t){const e=this.toObject(t);return this.constructor.fromObject(e)}cloneAsImage(t){const e=this.toCanvasElement(t);return new(J.getClass("image"))(e)}toCanvasElement(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};const e=he(this),s=this.group,i=this.shadow,r=Math.abs,n=t.enableRetinaScaling?f():1,o=(t.multiplier||1)*n,a=t.canvasProvider||(t=>new Zt(t,{enableRetinaScaling:!1,renderOnAddRemove:!1,skipOffscreen:!1}));delete this.group,t.withoutTransform&&ae(this),t.withoutShadow&&(this.shadow=null),t.viewportTransform&&ge(this,this.getViewportTransform()),this.setCoords();const h=dt(),l=this.getBoundingRect(),c=this.shadow,u=new it;if(c){const t=c.blur,e=c.nonScaling?new it(1,1):this.getObjectScaling();u.x=2*Math.round(r(c.offsetX)+t)*r(e.x),u.y=2*Math.round(r(c.offsetY)+t)*r(e.y)}const d=l.width+u.x,g=l.height+u.y;h.width=Math.ceil(d),h.height=Math.ceil(g);const p=a(h);"jpeg"===t.format&&(p.backgroundColor="#fff"),this.setPositionByOrigin(new it(p.width/2,p.height/2),T,T);const m=this.canvas;p._objects=[this],this.set("canvas",p),this.setCoords();const v=p.toCanvasElement(o||1,t);return this.set("canvas",m),this.shadow=i,s&&(this.group=s),this.set(e),this.setCoords(),p._objects=[],p.destroy(),v}toDataURL(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};return pt(this.toCanvasElement(t),t.format||"png",t.quality||1)}toBlob(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};return mt(this.toCanvasElement(t),t.format||"png",t.quality||1)}isType(){for(var t=arguments.length,e=new Array(t),s=0;s{let[i,r]=s;return t[i]=this._animate(i,r,e),t},{})}_animate(t,e){let s=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};const i=t.split("."),r=this.constructor.colorProperties.includes(i[i.length-1]),{abort:n,startValue:o,onChange:a,onComplete:h}=s,l={...s,target:this,startValue:null!=o?o:i.reduce((t,e)=>t[e],this),endValue:e,abort:null==n?void 0:n.bind(this),onChange:(t,e,s)=>{i.reduce((e,s,r)=>(r===i.length-1&&(e[s]=t),e[s]),this),a&&a(t,e,s)},onComplete:(t,e,s)=>{this.setCoords(),h&&h(t,e,s)}};return r?Bs(l):Is(l)}isDescendantOf(t){const{parent:e,group:s}=this;return e===t||s===t||!!e&&e.isDescendantOf(t)||!!s&&s!==e&&s.isDescendantOf(t)}getAncestors(){const t=[];let e=this;do{e=e.parent,e&&t.push(e)}while(e);return t}findCommonAncestors(t){if(this===t)return{fork:[],otherFork:[],common:[this,...this.getAncestors()]};const e=this.getAncestors(),s=t.getAncestors();if(0===e.length&&s.length>0&&this===s[s.length-1])return{fork:[],otherFork:[t,...s.slice(0,s.length-1)],common:[this]};for(let i,r=0;r-1&&n>o}toObject(){const t=(arguments.length>0&&void 0!==arguments[0]?arguments[0]:[]).concat(e.customProperties,this.constructor.customProperties||[]);let i;const r=s.NUM_FRACTION_DIGITS,{clipPath:n,fill:o,stroke:a,shadow:h,strokeDashArray:l,left:c,top:u,originX:d,originY:g,width:f,height:p,strokeWidth:v,strokeLineCap:y,strokeDashOffset:_,strokeLineJoin:x,strokeUniform:C,strokeMiterLimit:S,scaleX:b,scaleY:w,angle:T,flipX:O,flipY:k,opacity:D,visible:M,backgroundColor:E,fillRule:P,paintFirst:A,globalCompositeOperation:j,skewX:F,skewY:L}=this;n&&!n.excludeFromExport&&(i=n.toObject(t.concat("inverted","absolutePositioned")));const R=t=>$t(t,r),I={...It(this,t),type:this.constructor.type,version:m,originX:d,originY:g,left:R(c),top:R(u),width:R(f),height:R(p),fill:Wt(o)?o.toObject():o,stroke:Wt(a)?a.toObject():a,strokeWidth:R(v),strokeDashArray:l?l.concat():l,strokeLineCap:y,strokeDashOffset:_,strokeLineJoin:x,strokeUniform:C,strokeMiterLimit:R(S),scaleX:R(b),scaleY:R(w),angle:R(T),flipX:O,flipY:k,opacity:R(D),shadow:h?h.toObject():h,visible:M,backgroundColor:E,fillRule:P,paintFirst:A,globalCompositeOperation:j,skewX:R(F),skewY:R(L),...i?{clipPath:i}:null};return this.includeDefaultValues?I:this._removeDefaultValues(I)}toDatalessObject(t){return this.toObject(t)}_removeDefaultValues(t){const e=this.constructor.getDefaults(),s=Object.keys(e).length>0?e:Object.getPrototypeOf(this);return Bt(t,(t,e)=>{if(e===O||e===k||"type"===e)return!0;const i=s[e];return t!==i&&!(Array.isArray(t)&&Array.isArray(i)&&0===t.length&&0===i.length)})}toString(){return`#<${this.constructor.type}>`}static _fromObject(t){let{type:e,...s}=t,{extraParam:i,...r}=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return Rt(s,r).then(t=>i?(delete t[i],new this(s[i],t)):new this(t))}static fromObject(t,e){return this._fromObject(t,e)}};t(Ys,"stateProperties",Cs),t(Ys,"cacheProperties",Ss),t(Ys,"ownDefaults",bs),t(Ys,"type","FabricObject"),t(Ys,"colorProperties",[H,N,"backgroundColor"]),t(Ys,"customProperties",[]),J.setClass(Ys),J.setClass(Ys,"object");const Ws=(t,e,s)=>(i,r,n,o)=>{const a=e(i,r,n,o);return a&&fe(t,{...je(i,r,n,o),...s}),a};function Vs(t){return(e,s,i,r)=>{const{target:n,originX:o,originY:a}=s,h=n.getRelativeCenterPoint(),l=n.translateToOriginPoint(h,o,a),c=t(e,s,i,r);return n.setPositionByOrigin(l,s.originX,s.originY),c}}const Gs=Ws(I,Vs((t,e,s,i)=>{const r=Le(e,e.originX,e.originY,s,i);if(me(e.originX)===me(T)||me(e.originX)===me(M)&&r.x<0||me(e.originX)===me(O)&&r.x>0){const{target:t}=e,s=t.strokeWidth/(t.strokeUniform?t.scaleX:1),i=Ee(e)?2:1,n=t.width,o=Math.abs(r.x*i/t.scaleX)-s;return t.set("width",Math.max(o,1)),n!==t.width}return!1}));function zs(t,e,s,i,r){i=i||{};const n=this.sizeX||i.cornerSize||r.cornerSize,o=this.sizeY||i.cornerSize||r.cornerSize,a=void 0!==i.transparentCorners?i.transparentCorners:r.transparentCorners,h=a?N:H,l=!a&&(i.cornerStrokeColor||r.cornerStrokeColor);let c,u=e,d=s;t.save(),t.fillStyle=i.cornerColor||r.cornerColor||"",t.strokeStyle=i.cornerStrokeColor||r.cornerStrokeColor||"",n>o?(c=n,t.scale(1,o/n),d=s*n/o):o>n?(c=o,t.scale(n/o,1),u=e*o/n):c=n,t.beginPath(),t.arc(u,d,c/2,0,x,!1),t[h](),l&&t.stroke(),t.restore()}function Hs(t,e,s,i,r){i=i||{};const n=this.sizeX||i.cornerSize||r.cornerSize,o=this.sizeY||i.cornerSize||r.cornerSize,a=void 0!==i.transparentCorners?i.transparentCorners:r.transparentCorners,h=a?N:H,l=!a&&(i.cornerStrokeColor||r.cornerStrokeColor),c=n/2,u=o/2;t.save(),t.fillStyle=i.cornerColor||r.cornerColor||"",t.strokeStyle=i.cornerStrokeColor||r.cornerStrokeColor||"",t.translate(e,s);const d=r.getTotalAngle();t.rotate(vt(d)),t[`${h}Rect`](-c,-u,n,o),l&&t.strokeRect(-c,-u,n,o),t.restore()}class Ns{constructor(e){t(this,"visible",!0),t(this,"actionName",Y),t(this,"angle",0),t(this,"x",0),t(this,"y",0),t(this,"offsetX",0),t(this,"offsetY",0),t(this,"sizeX",0),t(this,"sizeY",0),t(this,"touchSizeX",0),t(this,"touchSizeY",0),t(this,"cursorStyle","crosshair"),t(this,"withConnection",!1),Object.assign(this,e)}shouldActivate(t,e,s,i){var r;let{tl:n,tr:o,br:a,bl:h}=i;return(null===(r=e.canvas)||void 0===r?void 0:r.getActiveObject())===e&&e.isControlVisible(t)&&$s.isPointInPolygon(s,[n,o,a,h])}getActionHandler(t,e,s){return this.actionHandler}getMouseDownHandler(t,e,s){return this.mouseDownHandler}getMouseUpHandler(t,e,s){return this.mouseUpHandler}cursorStyleHandler(t,e,s,i){return e.cursorStyle}getActionName(t,e,s){return e.actionName}getVisibility(t,e){var s,i;return null!==(s=null===(i=t._controlsVisibility)||void 0===i?void 0:i[e])&&void 0!==s?s:this.visible}setVisibility(t,e,s){this.visible=t}positionHandler(t,e,s,i){return new it(this.x*t.x+this.offsetX,this.y*t.y+this.offsetY).transform(e)}calcCornerCoords(t,e,s,i,r,n){const o=bt([Ot(s,i),kt({angle:t}),Dt((r?this.touchSizeX:this.sizeX)||e,(r?this.touchSizeY:this.sizeY)||e)]);return{tl:new it(-.5,-.5).transform(o),tr:new it(.5,-.5).transform(o),br:new it(.5,.5).transform(o),bl:new it(-.5,.5).transform(o)}}render(t,e,s,i,r){if("circle"===((i=i||{}).cornerStyle||r.cornerStyle))zs.call(this,t,e,s,i,r);else Hs.call(this,t,e,s,i,r)}}const Us=(t,e,s)=>s.lockRotation?Me:e.cursorStyle,qs=Ws(F,Vs((t,e,s,i)=>{let{target:r,ex:n,ey:o,theta:a,originX:h,originY:l}=e;const c=r.translateToOriginPoint(r.getRelativeCenterPoint(),h,l);if(Ae(r,"lockRotation"))return!1;const u=Math.atan2(o-c.y,n-c.x),d=Math.atan2(i-c.y,s-c.x);let g=yt(d-u+a);if(r.snapAngle&&r.snapAngle>0){const t=r.snapAngle,e=r.snapThreshold||t,s=Math.ceil(g/t)*t,i=Math.floor(g/t)*t;Math.abs(g-i){const r=Ks(t,s);if(Js(s,0!==e.x&&0===e.y?"x":0===e.x&&0!==e.y?"y":"",r))return Me;const n=Fe(s,0,i);return`${Qs[n]}-resize`};function ti(t,e,s,i){let r=arguments.length>4&&void 0!==arguments[4]?arguments[4]:{};const n=e.target,o=r.by,a=Ks(t,n);let h,l,c,u,d,g;if(Js(n,o,a))return!1;if(e.gestureScale)l=e.scaleX*e.gestureScale,c=e.scaleY*e.gestureScale;else{if(h=Le(e,e.originX,e.originY,s,i),d="y"!==o?Math.sign(h.x||e.signX||1):1,g="x"!==o?Math.sign(h.y||e.signY||1):1,e.signX||(e.signX=d),e.signY||(e.signY=g),Ae(n,"lockScalingFlip")&&(e.signX!==d||e.signY!==g))return!1;if(u=n._getTransformedDimensions(),a&&!o){const t=Math.abs(h.x)+Math.abs(h.y),{original:s}=e,i=t/(Math.abs(u.x*s.scaleX/n.scaleX)+Math.abs(u.y*s.scaleY/n.scaleY));l=s.scaleX*i,c=s.scaleY*i}else l=Math.abs(h.x*n.scaleX/u.x),c=Math.abs(h.y*n.scaleY/u.y);Ee(e)&&(l*=2,c*=2),e.signX!==d&&"y"!==o&&(e.originX=Pe(e.originX),l*=-1,e.signX=d),e.signY!==g&&"x"!==o&&(e.originY=Pe(e.originY),c*=-1,e.signY=g)}const f=n.scaleX,p=n.scaleY;return o?("x"===o&&n.set(W,l),"y"===o&&n.set(V,c)):(!Ae(n,"lockScalingX")&&n.set(W,l),!Ae(n,"lockScalingY")&&n.set(V,c)),f!==n.scaleX||p!==n.scaleY}const ei=Ws(j,Vs((t,e,s,i)=>ti(t,e,s,i))),si=Ws(j,Vs((t,e,s,i)=>ti(t,e,s,i,{by:"x"}))),ii=Ws(j,Vs((t,e,s,i)=>ti(t,e,s,i,{by:"y"}))),ri={x:{counterAxis:"y",scale:W,skew:G,lockSkewing:"lockSkewingX",origin:"originX",flip:"flipX"},y:{counterAxis:"x",scale:V,skew:z,lockSkewing:"lockSkewingY",origin:"originY",flip:"flipY"}},ni=["ns","nesw","ew","nwse"],oi=(t,e,s,i)=>{if(0!==e.x&&Ae(s,"lockSkewingY"))return Me;if(0!==e.y&&Ae(s,"lockSkewingX"))return Me;const r=Fe(s,0,i)%4;return`${ni[r]}-resize`};function ai(t,e,s,i,r){const{target:n}=s,{counterAxis:o,origin:a,lockSkewing:h,skew:l,flip:c}=ri[t];if(Ae(n,h))return!1;const{origin:u,flip:d}=ri[o],g=me(s[u])*(n[d]?-1:1),f=-Math.sign(g)*(n[c]?-1:1),p=.5*-((0===n[l]&&Le(s,T,T,i,r)[t]>0||n[l]>0?1:-1)*f)+.5,m=Ws(R,Vs((e,s,i,r)=>function(t,e,s){let{target:i,ex:r,ey:n,skewingSide:o,...a}=e;const{skew:h}=ri[t],l=s.subtract(new it(r,n)).divide(new it(i.scaleX,i.scaleY))[t],c=i[h],u=a[h],d=Math.tan(vt(u)),g="y"===t?i._getTransformedDimensions({scaleX:1,scaleY:1,skewX:0}).x:i._getTransformedDimensions({scaleX:1,scaleY:1}).y,f=2*l*o/Math.max(g,1)+d,p=yt(Math.atan(f));i.set(h,p);const m=c!==i[h];if(m&&"y"===t){const{skewX:t,scaleX:e}=i,s=i._getTransformedDimensions({skewY:c}),r=i._getTransformedDimensions(),n=0!==t?s.x/r.x:1;1!==n&&i.set(W,n*e)}return m}(t,s,new it(i,r))));return m(e,{...s,[a]:p,skewingSide:f},i,r)}const hi=(t,e,s,i)=>ai("x",t,e,s,i),li=(t,e,s,i)=>ai("y",t,e,s,i);function ci(t,e){return t[e.canvas.altActionKey]}const ui=(t,e,s)=>{const i=ci(t,s);return 0===e.x?i?G:V:0===e.y?i?z:W:""},di=(t,e,s,i)=>ci(t,s)?oi(0,e,s,i):Zs(t,e,s,i),gi=(t,e,s,i)=>ci(t,e.target)?li(t,e,s,i):si(t,e,s,i),fi=(t,e,s,i)=>ci(t,e.target)?hi(t,e,s,i):ii(t,e,s,i),pi=()=>({ml:new Ns({x:-.5,y:0,cursorStyleHandler:di,actionHandler:gi,getActionName:ui}),mr:new Ns({x:.5,y:0,cursorStyleHandler:di,actionHandler:gi,getActionName:ui}),mb:new Ns({x:0,y:.5,cursorStyleHandler:di,actionHandler:fi,getActionName:ui}),mt:new Ns({x:0,y:-.5,cursorStyleHandler:di,actionHandler:fi,getActionName:ui}),tl:new Ns({x:-.5,y:-.5,cursorStyleHandler:Zs,actionHandler:ei}),tr:new Ns({x:.5,y:-.5,cursorStyleHandler:Zs,actionHandler:ei}),bl:new Ns({x:-.5,y:.5,cursorStyleHandler:Zs,actionHandler:ei}),br:new Ns({x:.5,y:.5,cursorStyleHandler:Zs,actionHandler:ei}),mtr:new Ns({x:0,y:-.5,actionHandler:qs,cursorStyleHandler:Us,offsetY:-40,withConnection:!0,actionName:L})}),mi=()=>({mr:new Ns({x:.5,y:0,actionHandler:Gs,cursorStyleHandler:di,actionName:I}),ml:new Ns({x:-.5,y:0,actionHandler:Gs,cursorStyleHandler:di,actionName:I})}),vi=()=>({...pi(),...mi()});class yi extends Ys{static getDefaults(){return{...super.getDefaults(),...yi.ownDefaults}}constructor(t){super(),Object.assign(this,this.constructor.createControls(),yi.ownDefaults),this.setOptions(t)}static createControls(){return{controls:pi()}}_updateCacheCanvas(){const t=this.canvas;if(this.noScaleCache&&t&&t._currentTransform){const e=t._currentTransform,s=e.target,i=e.action;if(this===s&&i&&i.startsWith(Y))return!1}return super._updateCacheCanvas()}getActiveControl(){const t=this.__corner;return t?{key:t,control:this.controls[t],coord:this.oCoords[t]}:void 0}findControl(t){let e=arguments.length>1&&void 0!==arguments[1]&&arguments[1];if(!this.hasControls||!this.canvas)return;this.__corner=void 0;const s=Object.entries(this.oCoords);for(let i=s.length-1;i>=0;i--){const[r,n]=s[i],o=this.controls[r];if(o.shouldActivate(r,this,t,e?n.touchCorner:n.corner))return this.__corner=r,{key:r,control:o,coord:this.oCoords[r]}}}calcOCoords(){const t=this.getViewportTransform(),e=this.getCenterPoint(),s=Ot(e.x,e.y),i=kt({angle:this.getTotalAngle()-(this.group&&this.flipX?180:0)}),r=St(s,i),n=St(t,r),o=St(n,[1/t[0],0,0,1/t[3],0,0]),a=this.group?Tt(this.calcTransformMatrix()):void 0;a&&(a.scaleX=Math.abs(a.scaleX),a.scaleY=Math.abs(a.scaleY));const h=this._calculateCurrentDimensions(a),l={};return this.forEachControl((t,e)=>{const s=t.positionHandler(h,o,this,t);l[e]=Object.assign(s,this._calcCornerCoords(t,s))}),l}_calcCornerCoords(t,e){const s=this.getTotalAngle();return{corner:t.calcCornerCoords(s,this.cornerSize,e.x,e.y,!1,this),touchCorner:t.calcCornerCoords(s,this.touchCornerSize,e.x,e.y,!0,this)}}setCoords(){super.setCoords(),this.canvas&&(this.oCoords=this.calcOCoords())}forEachControl(t){for(const e in this.controls)t(this.controls[e],e,this)}drawSelectionBackground(t){if(!this.selectionBackgroundColor||this.canvas&&this.canvas._activeObject!==this)return;t.save();const e=this.getRelativeCenterPoint(),s=this._calculateCurrentDimensions(),i=this.getViewportTransform();t.translate(e.x,e.y),t.scale(1/i[0],1/i[3]),t.rotate(vt(this.angle)),t.fillStyle=this.selectionBackgroundColor,t.fillRect(-s.x/2,-s.y/2,s.x,s.y),t.restore()}strokeBorders(t,e){t.strokeRect(-e.x/2,-e.y/2,e.x,e.y)}_drawBorders(t,e){let s=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};const i={hasControls:this.hasControls,borderColor:this.borderColor,borderDashArray:this.borderDashArray,...s};t.save(),t.strokeStyle=i.borderColor,this._setLineDash(t,i.borderDashArray),this.strokeBorders(t,e),i.hasControls&&this.drawControlsConnectingLines(t,e),t.restore()}_renderControls(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};const{hasBorders:s,hasControls:i}=this,r={hasBorders:s,hasControls:i,...e},n=this.getViewportTransform(),o=r.hasBorders,a=r.hasControls,h=St(n,this.calcTransformMatrix()),l=Tt(h);t.save(),t.translate(l.translateX,l.translateY),t.lineWidth=this.borderScaleFactor,this.group===this.parent&&(t.globalAlpha=this.isMoving?this.borderOpacityWhenMoving:1),this.flipX&&(l.angle-=180),t.rotate(vt(this.group?l.angle:this.angle)),o&&this.drawBorders(t,l,e),a&&this.drawControls(t,e),t.restore()}drawBorders(t,e,s){let i;if(s&&s.forActiveSelection||this.group){const t=le(this.width,this.height,At(e)),s=this.isStrokeAccountedForInDimensions()?rt:(this.strokeUniform?(new it).scalarAdd(this.canvas?this.canvas.getZoom():1):new it(e.scaleX,e.scaleY)).scalarMultiply(this.strokeWidth);i=t.add(s).scalarAdd(this.borderScaleFactor).scalarAdd(2*this.padding)}else i=this._calculateCurrentDimensions().scalarAdd(this.borderScaleFactor);this._drawBorders(t,i,s)}drawControlsConnectingLines(t,e){let s=!1;t.beginPath(),this.forEachControl((i,r)=>{i.withConnection&&i.getVisibility(this,r)&&(s=!0,t.moveTo(i.x*e.x,i.y*e.y),t.lineTo(i.x*e.x+i.offsetX,i.y*e.y+i.offsetY))}),s&&t.stroke()}drawControls(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};t.save();const s=this.getCanvasRetinaScaling(),{cornerStrokeColor:i,cornerDashArray:r,cornerColor:n}=this,o={cornerStrokeColor:i,cornerDashArray:r,cornerColor:n,...e};t.setTransform(s,0,0,s,0,0),t.strokeStyle=t.fillStyle=o.cornerColor,this.transparentCorners||(t.strokeStyle=o.cornerStrokeColor),this._setLineDash(t,o.cornerDashArray),this.forEachControl((e,s)=>{if(e.getVisibility(this,s)){const i=this.oCoords[s];e.render(t,i.x,i.y,o,this)}}),t.restore()}isControlVisible(t){return this.controls[t]&&this.controls[t].getVisibility(this,t)}setControlVisible(t,e){this._controlsVisibility||(this._controlsVisibility={}),this._controlsVisibility[t]=e}setControlsVisibility(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};Object.entries(t).forEach(t=>{let[e,s]=t;return this.setControlVisible(e,s)})}clearContextTop(t){if(!this.canvas)return;const e=this.canvas.contextTop;if(!e)return;const s=this.canvas.viewportTransform;e.save(),e.transform(s[0],s[1],s[2],s[3],s[4],s[5]),this.transform(e);const i=this.width+4,r=this.height+4;return e.clearRect(-i/2,-r/2,i,r),t||e.restore(),e}onDeselect(t){return!1}onSelect(t){return!1}shouldStartDragging(t){return!1}onDragStart(t){return!1}canDrop(t){return!1}renderDragSourceEffect(t){}renderDropTargetEffect(t){}}function _i(t,e){return e.forEach(e=>{Object.getOwnPropertyNames(e.prototype).forEach(s=>{"constructor"!==s&&Object.defineProperty(t.prototype,s,Object.getOwnPropertyDescriptor(e.prototype,s)||Object.create(null))})}),t}t(yi,"ownDefaults",{noScaleCache:!0,lockMovementX:!1,lockMovementY:!1,lockRotation:!1,lockScalingX:!1,lockScalingY:!1,lockSkewingX:!1,lockSkewingY:!1,lockScalingFlip:!1,cornerSize:13,touchCornerSize:24,transparentCorners:!0,cornerColor:"rgb(178,204,255)",cornerStrokeColor:"",cornerStyle:"rect",cornerDashArray:null,hasControls:!0,borderColor:"rgb(178,204,255)",borderDashArray:null,borderOpacityWhenMoving:.4,borderScaleFactor:1,hasBorders:!0,selectionBackgroundColor:"",selectable:!0,evented:!0,perPixelTargetFind:!1,activeOn:"down",hoverCursor:null,moveCursor:null});class xi extends yi{}_i(xi,[Ne]),J.setClass(xi),J.setClass(xi,"object");const Ci=(t,e,s,i)=>{const r=2*(i=Math.round(i))+1,{data:n}=t.getImageData(e-i,s-i,r,r);for(let t=3;t0)return!1}return!0};class Si{constructor(t){this.options=t,this.strokeProjectionMagnitude=this.options.strokeWidth/2,this.scale=new it(this.options.scaleX,this.options.scaleY),this.strokeUniformScalar=this.options.strokeUniform?new it(1/this.options.scaleX,1/this.options.scaleY):new it(1,1)}createSideVector(t,e){const s=xe(t,e);return this.options.strokeUniform?s.multiply(this.scale):s}projectOrthogonally(t,e,s){return this.applySkew(t.add(this.calcOrthogonalProjection(t,e,s)))}isSkewed(){return 0!==this.options.skewX||0!==this.options.skewY}applySkew(t){const e=new it(t);return e.y+=e.x*Math.tan(vt(this.options.skewY)),e.x+=e.y*Math.tan(vt(this.options.skewX)),e}scaleUnitVector(t,e){return t.multiply(this.strokeUniformScalar).scalarMultiply(e)}}const bi=new it;class wi extends Si{static getOrthogonalRotationFactor(t,e){const s=e?Se(t,e):be(t);return Math.abs(s)2&&void 0!==arguments[2]?arguments[2]:this.strokeProjectionMagnitude;const i=this.createSideVector(t,e),r=Te(i),n=wi.getOrthogonalRotationFactor(r,this.bisector);return this.scaleUnitVector(r,s*n)}projectBevel(){const t=[];return(this.alpha%x===0?[this.B]:[this.B,this.C]).forEach(e=>{t.push(this.projectOrthogonally(this.A,e)),t.push(this.projectOrthogonally(this.A,e,-this.strokeProjectionMagnitude))}),t}projectMiter(){const t=[],e=Math.abs(this.alpha),s=1/Math.sin(e/2),i=this.scaleUnitVector(this.bisector,-this.strokeProjectionMagnitude*s),r=this.options.strokeUniform?Ce(this.scaleUnitVector(this.bisector,this.options.strokeMiterLimit)):this.options.strokeMiterLimit;return Ce(i)/this.strokeProjectionMagnitude<=r&&t.push(this.applySkew(this.A.add(i))),t.push(...this.projectBevel()),t}projectRoundNoSkew(t,e){const s=[],i=new it(wi.getOrthogonalRotationFactor(this.bisector),wi.getOrthogonalRotationFactor(new it(this.bisector.y,this.bisector.x)));return[new it(1,0).scalarMultiply(this.strokeProjectionMagnitude).multiply(this.strokeUniformScalar).multiply(i),new it(0,1).scalarMultiply(this.strokeProjectionMagnitude).multiply(this.strokeUniformScalar).multiply(i)].forEach(i=>{De(i,t,e)&&s.push(this.A.add(i))}),s}projectRoundWithSkew(t,e){const s=[],{skewX:i,skewY:r,scaleX:n,scaleY:o,strokeUniform:a}=this.options,h=new it(Math.tan(vt(i)),Math.tan(vt(r))),l=this.strokeProjectionMagnitude,c=a?l/o/Math.sqrt(1/o**2+1/n**2*h.y**2):l/Math.sqrt(1+h.y**2),u=new it(Math.sqrt(Math.max(l**2-c**2,0)),c),d=a?l/Math.sqrt(1+h.x**2*(1/o)**2/(1/n+1/n*h.x*h.y)**2):l/Math.sqrt(1+h.x**2/(1+h.x*h.y)**2),g=new it(d,Math.sqrt(Math.max(l**2-d**2,0)));return[g,g.scalarMultiply(-1),u,u.scalarMultiply(-1)].map(t=>this.applySkew(a?t.multiply(this.strokeUniformScalar):t)).forEach(i=>{De(i,t,e)&&s.push(this.applySkew(this.A).add(i))}),s}projectRound(){const t=[];t.push(...this.projectBevel());const e=this.alpha%x===0,s=this.applySkew(this.A),i=t[e?0:2].subtract(s),r=t[e?1:0].subtract(s),n=e?this.applySkew(this.AB.scalarMultiply(-1)):this.applySkew(this.bisector.multiply(this.strokeUniformScalar).scalarMultiply(-1)),o=Oe(i,n)>0,a=o?i:r,h=o?r:i;return this.isSkewed()?t.push(...this.projectRoundWithSkew(a,h)):t.push(...this.projectRoundNoSkew(a,h)),t}projectPoints(){switch(this.options.strokeLineJoin){case"miter":return this.projectMiter();case"round":return this.projectRound();default:return this.projectBevel()}}project(){return this.projectPoints().map(t=>({originPoint:this.A,projectedPoint:t,angle:this.alpha,bisector:this.bisector}))}}class Ti extends Si{constructor(t,e,s){super(s),this.A=new it(t),this.T=new it(e)}calcOrthogonalProjection(t,e){let s=arguments.length>2&&void 0!==arguments[2]?arguments[2]:this.strokeProjectionMagnitude;const i=this.createSideVector(t,e);return this.scaleUnitVector(Te(i),s)}projectButt(){return[this.projectOrthogonally(this.A,this.T,this.strokeProjectionMagnitude),this.projectOrthogonally(this.A,this.T,-this.strokeProjectionMagnitude)]}projectRound(){const t=[];if(!this.isSkewed()&&this.A.eq(this.T)){const e=new it(1,1).scalarMultiply(this.strokeProjectionMagnitude).multiply(this.strokeUniformScalar);t.push(this.applySkew(this.A.add(e)),this.applySkew(this.A.subtract(e)))}else t.push(...new wi(this.A,this.T,this.T,this.options).projectRound());return t}projectSquare(){const t=[];if(this.A.eq(this.T)){const e=new it(1,1).scalarMultiply(this.strokeProjectionMagnitude).multiply(this.strokeUniformScalar);t.push(this.A.add(e),this.A.subtract(e))}else{const e=this.calcOrthogonalProjection(this.A,this.T,this.strokeProjectionMagnitude),s=this.scaleUnitVector(we(this.createSideVector(this.A,this.T)),-this.strokeProjectionMagnitude),i=this.A.add(s);t.push(i.add(e),i.subtract(e))}return t.map(t=>this.applySkew(t))}projectPoints(){switch(this.options.strokeLineCap){case"round":return this.projectRound();case"square":return this.projectSquare();default:return this.projectButt()}}project(){return this.projectPoints().map(t=>({originPoint:this.A,projectedPoint:t}))}}const Oi=function(t,e){let s=arguments.length>2&&void 0!==arguments[2]&&arguments[2];const i=[];if(0===t.length)return i;const r=t.reduce((t,e)=>(t[t.length-1].eq(e)||t.push(new it(e)),t),[new it(t[0])]);if(1===r.length)s=!0;else if(!s){const t=r[0],e=((t,e)=>{for(let s=t.length-1;s>=0;s--)if(e(t[s],s,t))return s;return-1})(r,e=>!e.eq(t));r.splice(e+1)}return r.forEach((t,r,n)=>{let o,a;0===r?(a=n[1],o=s?t:n[n.length-1]):r===n.length-1?(o=n[r-1],a=s?t:n[0]):(o=n[r-1],a=n[r+1]),s&&1===n.length?i.push(...new Ti(t,t,e).project()):!s||0!==r&&r!==n.length-1?i.push(...new wi(t,o,a,e).project()):i.push(...new Ti(t,0===r?a:o,e).project())}),i},ki=t=>{const e={};return Object.keys(t).forEach(s=>{e[s]={},Object.keys(t[s]).forEach(i=>{e[s][i]={...t[s][i]}})}),e},Di=t=>t.replace(/&/g,"&").replace(/"/g,""").replace(/'/g,"'").replace(//g,">");let Mi;const Ei=t=>{if(Mi||Mi||(Mi="Intl"in g()&&"Segmenter"in Intl&&new Intl.Segmenter(void 0,{granularity:"grapheme"})),Mi){const e=Mi.segment(t);return Array.from(e).map(t=>{let{segment:e}=t;return e})}return Pi(t)},Pi=t=>{const e=[];for(let s,i=0;i{const s=t.charCodeAt(e);if(isNaN(s))return"";if(s<55296||s>57343)return t.charAt(e);if(55296<=s&&s<=56319){if(t.length<=e+1)throw"High surrogate without following low surrogate";const s=t.charCodeAt(e+1);if(56320>s||s>57343)throw"High surrogate without following low surrogate";return t.charAt(e)+t.charAt(e+1)}if(0===e)throw"Low surrogate without preceding high surrogate";const i=t.charCodeAt(e-1);if(55296>i||i>56319)throw"Low surrogate without preceding high surrogate";return!1};var ji=Object.freeze({__proto__:null,capitalize:function(t){let e=arguments.length>1&&void 0!==arguments[1]&&arguments[1];return`${t.charAt(0).toUpperCase()}${e?t.slice(1):t.slice(1).toLowerCase()}`},escapeXml:Di,graphemeSplit:Ei});const Fi=function(t,e){let s=arguments.length>2&&void 0!==arguments[2]&&arguments[2];return t.fill!==e.fill||t.stroke!==e.stroke||t.strokeWidth!==e.strokeWidth||t.fontSize!==e.fontSize||t.fontFamily!==e.fontFamily||t.fontWeight!==e.fontWeight||t.fontStyle!==e.fontStyle||t.textDecorationThickness!==e.textDecorationThickness||t.textBackgroundColor!==e.textBackgroundColor||t.deltaY!==e.deltaY||s&&(t.overline!==e.overline||t.underline!==e.underline||t.linethrough!==e.linethrough)},Li=(t,e)=>{const s=e.split("\n"),i=[];let r=-1,n={};t=ki(t);for(let e=0;e0&&(Fi(n,o,!0)?i.push({start:r,end:r+1,style:o}):i[i.length-1].end++),n=o||{}}else r+=o.length,n={}}return i},Ri=(t,e)=>{if(!Array.isArray(t))return ki(t);const s=e.split(P),i={};let r=-1,n=0;for(let e=0;e1&&void 0!==arguments[1]?arguments[1]:{},s={};for(const i in e)$i(t,i.split(" "))&&(s={...s,...e[i]});return s}const Yi=t=>{var e;return null!==(e=cs[t])&&void 0!==e?e:t},Wi=new RegExp(`(${os})`,"gi"),Vi=`(${os})`,Gi=String.raw`(skewX)\(${Vi}\)`,zi=String.raw`(skewY)\(${Vi}\)`,Hi=String.raw`(rotate)\(${Vi}(?: ${Vi} ${Vi})?\)`,Ni=String.raw`(scale)\(${Vi}(?: ${Vi})?\)`,Ui=String.raw`(translate)\(${Vi}(?: ${Vi})?\)`,qi=`(?:${String.raw`(matrix)\(${Vi} ${Vi} ${Vi} ${Vi} ${Vi} ${Vi}\)`}|${Ui}|${Hi}|${Ni}|${Gi}|${zi})`,Ki=`(?:${qi}*)`,Ji=String.raw`^\s*(?:${Ki}?)\s*$`,Qi=new RegExp(Ji),Zi=new RegExp(qi),tr=new RegExp(qi,"g");function er(t){const e=[];if(!(t=(t=>t.replace(Wi," $1 ").replace(/,/gi," ").replace(/\s+/gi," "))(t).replace(/\s*([()])\s*/gi,"$1"))||t&&!Qi.test(t))return[...S];for(const s of t.matchAll(tr)){const t=Zi.exec(s[0]);if(!t)continue;let i=S;const r=t.filter(t=>!!t),[,n,...o]=r,[a,h,l,c,u,d]=o.map(t=>parseFloat(t));switch(n){case"translate":i=Ot(a,h);break;case L:i=kt({angle:a},{x:h,y:l});break;case Y:i=Dt(a,h);break;case G:i=Et(a);break;case z:i=Pt(a);break;case"matrix":i=[a,h,l,c,u,d]}e.push(i)}return bt(e)}function sr(t,e,s,i){const r=Array.isArray(e);let n,o=e;if(t!==H&&t!==N||e!==E){if("strokeUniform"===t)return"non-scaling-stroke"===e;if("strokeDashArray"===t)o=e===E?null:e.replace(/,/g," ").split(/\s+/).map(parseFloat);else if("transformMatrix"===t)o=s&&s.transformMatrix?St(s.transformMatrix,er(e)):er(e);else if("visible"===t)o=e!==E&&"hidden"!==e,s&&!1===s.visible&&(o=!1);else if("opacity"===t)o=parseFloat(e),s&&void 0!==s.opacity&&(o*=s.opacity);else if("textAnchor"===t)o="start"===e?O:"end"===e?M:T;else if("charSpacing"===t||t===qe)n=Ge(e,i)/i*1e3;else if("paintFirst"===t){const t=e.indexOf(H),s=e.indexOf(N);o=H,(t>-1&&s>-1&&s-1)&&(o=N)}else{if("href"===t||"xlink:href"===t||"font"===t||"id"===t)return e;if("imageSmoothing"===t)return"optimizeQuality"===e;n=r?e.map(Ge):Ge(e,i)}}else o="";return!r&&isNaN(n)?o:n}function ir(t,e){t.replace(/;\s*$/,"").split(";").forEach(t=>{if(!t)return;const[s,i]=t.split(":");e[s.trim().toLowerCase()]=i.trim()})}function rr(t){const e={},s=t.getAttribute("style");return s?("string"==typeof s?ir(s,e):function(t,e){Object.entries(t).forEach(t=>{let[s,i]=t;void 0!==i&&(e[s.toLowerCase()]=i)})}(s,e),e):e}const nr={stroke:"strokeOpacity",fill:"fillOpacity"};function or(t,e,s){if(!t)return{};let i,r={},n=b;t.parentNode&&ps.test(t.parentNode.nodeName)&&(r=or(t.parentElement,e,s),r.fontSize&&(i=n=Ge(r.fontSize)));const o={...e.reduce((e,s)=>{const i=t.getAttribute(s);return i&&(e[s]=i),e},{}),...Xi(t,s),...rr(t)};o[ds]&&t.setAttribute(ds,o[ds]),o[us]&&(i=Ge(o[us],n),o[us]=`${i}`);const a={};for(const t in o){const e=Yi(t),s=sr(e,o[t],r,i);a[e]=s}a&&a.font&&function(t,e){const s=t.match(ls);if(!s)return;const i=s[1],r=s[3],n=s[4],o=s[5],a=s[6];i&&(e.fontStyle=i),r&&(e.fontWeight=isNaN(parseFloat(r))?r:parseFloat(r)),n&&(e.fontSize=Ge(n)),a&&(e.fontFamily=a),o&&(e.lineHeight="normal"===o?1:o)}(a.font,a);const h={...r,...a};return ps.test(t.nodeName)?h:function(t){const e=xi.getDefaults();return Object.entries(nr).forEach(s=>{let[i,r]=s;if(void 0===t[r]||""===t[i])return;if(void 0===t[i]){if(!e[i])return;t[i]=e[i]}if(0===t[i].indexOf("url("))return;const n=new Ve(t[i]);t[i]=n.setAlpha($t(n.getAlpha()*t[r],2)).toRgba()}),t}(h)}const ar=["rx","ry"];class hr extends xi{static getDefaults(){return{...super.getDefaults(),...hr.ownDefaults}}constructor(t){super(),Object.assign(this,hr.ownDefaults),this.setOptions(t),this._initRxRy()}_initRxRy(){const{rx:t,ry:e}=this;t&&!e?this.ry=t:e&&!t&&(this.rx=e)}_render(t){const{width:e,height:s}=this,i=-e/2,r=-s/2,n=this.rx?Math.min(this.rx,e/2):0,o=this.ry?Math.min(this.ry,s/2):0,a=0!==n||0!==o;t.beginPath(),t.moveTo(i+n,r),t.lineTo(i+e-n,r),a&&t.bezierCurveTo(i+e-w*n,r,i+e,r+w*o,i+e,r+o),t.lineTo(i+e,r+s-o),a&&t.bezierCurveTo(i+e,r+s-w*o,i+e-w*n,r+s,i+e-n,r+s),t.lineTo(i+n,r+s),a&&t.bezierCurveTo(i+w*n,r+s,i,r+s-w*o,i,r+s-o),t.lineTo(i,r+o),a&&t.bezierCurveTo(i,r+w*o,i+w*n,r,i+n,r),t.closePath(),this._renderPaintInOrder(t)}toObject(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[];return super.toObject([...ar,...t])}_toSVG(){const{width:t,height:e,rx:s,ry:i}=this;return["\n`]}static async fromElement(t,e,s){const{left:i=0,top:r=0,width:n=0,height:o=0,visible:a=!0,...h}=or(t,this.ATTRIBUTE_NAMES,s);return new this({...e,...h,left:i,top:r,width:n,height:o,visible:Boolean(a&&n&&o)})}}t(hr,"type","Rect"),t(hr,"cacheProperties",[...Ss,...ar]),t(hr,"ownDefaults",{rx:0,ry:0}),t(hr,"ATTRIBUTE_NAMES",[...Ii,"x","y","rx","ry","width","height"]),J.setClass(hr),J.setSVGClass(hr);const lr="initialization",cr="added",ur="removed",dr="imperative",gr=(t,e)=>{const{strokeUniform:s,strokeWidth:i,width:r,height:n,group:o}=e,a=o&&o!==t?ce(o.calcTransformMatrix(),t.calcTransformMatrix()):null,h=a?e.getRelativeCenterPoint().transform(a):e.getRelativeCenterPoint(),l=!e.isStrokeAccountedForInDimensions(),c=s&&l?de(new it(i,i),void 0,t.calcTransformMatrix()):rt,u=!s&&l?i:0,d=le(r+u,n+u,bt([a,e.calcOwnMatrix()],!0)).add(c).scalarDivide(2);return[h.subtract(d),h.add(d)]};class fr{calcLayoutResult(t,e){if(this.shouldPerformLayout(t))return this.calcBoundingBox(e,t)}shouldPerformLayout(t){let{type:e,prevStrategy:s,strategy:i}=t;return e===lr||e===dr||!!s&&i!==s}shouldLayoutClipPath(t){let{type:e,target:{clipPath:s}}=t;return e!==lr&&s&&!s.absolutePositioned}getInitialSize(t,e){return e.size}calcBoundingBox(t,e){const{type:s,target:i}=e;if(s===dr&&e.overrides)return e.overrides;if(0===t.length)return;const{left:r,top:n,width:o,height:a}=re(t.map(t=>gr(i,t)).reduce((t,e)=>t.concat(e),[])),h=new it(o,a),l=new it(r,n).add(h.scalarDivide(2));if(s===lr){const t=this.getInitialSize(e,{size:h,center:l});return{center:l,relativeCorrection:new it(0,0),size:t}}return{center:l.transform(i.calcOwnMatrix()),size:h}}}t(fr,"type","strategy");class pr extends fr{shouldPerformLayout(t){return!0}}t(pr,"type","fit-content"),J.setClass(pr);const mr="layoutManager";class vr{constructor(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:new pr;t(this,"strategy",void 0),this.strategy=e,this._subscriptions=new Map}performLayout(t){const e={bubbles:!0,strategy:this.strategy,...t,prevStrategy:this._prevLayoutStrategy,stopPropagation(){this.bubbles=!1}};this.onBeforeLayout(e);const s=this.getLayoutResult(e);s&&this.commitLayout(e,s),this.onAfterLayout(e,s),this._prevLayoutStrategy=e.strategy}attachHandlers(t,e){const{target:s}=e;return[U,A,I,F,j,R,X,B,$].map(e=>t.on(e,t=>this.performLayout(e===U?{type:"object_modified",trigger:e,e:t,target:s}:{type:"object_modifying",trigger:e,e:t,target:s})))}subscribe(t,e){this.unsubscribe(t,e);const s=this.attachHandlers(t,e);this._subscriptions.set(t,s)}unsubscribe(t,e){(this._subscriptions.get(t)||[]).forEach(t=>t()),this._subscriptions.delete(t)}unsubscribeTargets(t){t.targets.forEach(e=>this.unsubscribe(e,t))}subscribeTargets(t){t.targets.forEach(e=>this.subscribe(e,t))}onBeforeLayout(t){const{target:e,type:s}=t,{canvas:i}=e;if(s===lr||s===cr?this.subscribeTargets(t):s===ur&&this.unsubscribeTargets(t),e.fire("layout:before",{context:t}),i&&i.fire("object:layout:before",{target:e,context:t}),s===dr&&t.deep){const{strategy:s,...i}=t;e.forEachObject(t=>t.layoutManager&&t.layoutManager.performLayout({...i,bubbles:!1,target:t}))}}getLayoutResult(t){const{target:e,strategy:s,type:i}=t,r=s.calcLayoutResult(t,e.getObjects());if(!r)return;const n=i===lr?new it:e.getRelativeCenterPoint(),{center:o,correction:a=new it,relativeCorrection:h=new it}=r,l=n.subtract(o).add(a).transform(i===lr?S:Ct(e.calcOwnMatrix()),!0).add(h);return{result:r,prevCenter:n,nextCenter:o,offset:l}}commitLayout(t,e){const{target:s}=t,{result:{size:i},nextCenter:r}=e;var n,o;(s.set({width:i.x,height:i.y}),this.layoutObjects(t,e),t.type===lr)?s.set({left:null!==(n=t.x)&&void 0!==n?n:r.x+i.x*me(s.originX),top:null!==(o=t.y)&&void 0!==o?o:r.y+i.y*me(s.originY)}):(s.setPositionByOrigin(r,T,T),s.setCoords(),s.set("dirty",!0))}layoutObjects(t,e){const{target:s}=t;s.forEachObject(i=>{i.group===s&&this.layoutObject(t,e,i)}),t.strategy.shouldLayoutClipPath(t)&&this.layoutObject(t,e,s.clipPath)}layoutObject(t,e,s){let{offset:i}=e;s.set({left:s.left+i.x,top:s.top+i.y})}onAfterLayout(t,e){const{target:s,strategy:i,bubbles:r,prevStrategy:n,...o}=t,{canvas:a}=s;s.fire("layout:after",{context:t,result:e}),a&&a.fire("object:layout:after",{context:t,result:e,target:s});const h=s.parent;r&&null!=h&&h.layoutManager&&((o.path||(o.path=[])).push(s),h.layoutManager.performLayout({...o,target:h})),s.set("dirty",!0)}dispose(){const{_subscriptions:t}=this;t.forEach(t=>t.forEach(t=>t())),t.clear()}toObject(){return{type:mr,strategy:this.strategy.constructor.type}}toJSON(){return this.toObject()}}J.setClass(vr,mr);class yr extends vr{performLayout(){}}class _r extends(ot(xi)){static getDefaults(){return{...super.getDefaults(),..._r.ownDefaults}}constructor(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[],s=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};super(),t(this,"_activeObjects",[]),t(this,"__objectSelectionTracker",void 0),t(this,"__objectSelectionDisposer",void 0),Object.assign(this,_r.ownDefaults),this.setOptions(s),this.groupInit(e,s)}groupInit(t,e){var s;this._objects=[...t],this.__objectSelectionTracker=this.__objectSelectionMonitor.bind(this,!0),this.__objectSelectionDisposer=this.__objectSelectionMonitor.bind(this,!1),this.forEachObject(t=>{this.enterGroup(t,!1)}),this.layoutManager=null!==(s=e.layoutManager)&&void 0!==s?s:new vr,this.layoutManager.performLayout({type:lr,target:this,targets:[...t],x:e.left,y:e.top})}canEnterGroup(t){return t===this||this.isDescendantOf(t)?(i("error","Group: circular object trees are not supported, this call has no effect"),!1):-1===this._objects.indexOf(t)||(i("error","Group: duplicate objects are not supported inside group, this call has no effect"),!1)}_filterObjectsBeforeEnteringGroup(t){return t.filter((t,e,s)=>this.canEnterGroup(t)&&s.indexOf(t)===e)}add(){for(var t=arguments.length,e=new Array(t),s=0;s1?e-1:0),i=1;i{s._set(t,e)}),this}_shouldSetNestedCoords(){return this.subTargetCheck}removeAll(){return this._activeObjects=[],this.remove(...this._objects)}__objectSelectionMonitor(t,e){let{target:s}=e;const i=this._activeObjects;if(t)i.push(s),this._set("dirty",!0);else if(i.length>0){const t=i.indexOf(s);t>-1&&(i.splice(t,1),this._set("dirty",!0))}}_watchObject(t,e){t&&this._watchObject(!1,e),t?(e.on("selected",this.__objectSelectionTracker),e.on("deselected",this.__objectSelectionDisposer)):(e.off("selected",this.__objectSelectionTracker),e.off("deselected",this.__objectSelectionDisposer))}enterGroup(t,e){t.group&&t.group.remove(t),t._set("parent",this),this._enterGroup(t,e)}_enterGroup(t,e){e&&oe(t,St(Ct(this.calcTransformMatrix()),t.calcTransformMatrix())),this._shouldSetNestedCoords()&&t.setCoords(),t._set("group",this),t._set("canvas",this.canvas),this._watchObject(!0,t);const s=this.canvas&&this.canvas.getActiveObject&&this.canvas.getActiveObject();s&&(s===t||t.isDescendantOf(s))&&this._activeObjects.push(t)}exitGroup(t,e){this._exitGroup(t,e),t._set("parent",void 0),t._set("canvas",void 0)}_exitGroup(t,e){t._set("group",void 0),e||(oe(t,St(this.calcTransformMatrix(),t.calcTransformMatrix())),t.setCoords()),this._watchObject(!1,t);const s=this._activeObjects.length>0?this._activeObjects.indexOf(t):-1;s>-1&&this._activeObjects.splice(s,1)}shouldCache(){const t=xi.prototype.shouldCache.call(this);if(t)for(let t=0;tt.setCoords())}triggerLayout(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};this.layoutManager.performLayout({target:this,type:dr,...t})}render(t){this._transformDone=!0,super.render(t),this._transformDone=!1}__serializeObjects(t,e){const s=this.includeDefaultValues;return this._objects.filter(function(t){return!t.excludeFromExport}).map(function(i){const r=i.includeDefaultValues;i.includeDefaultValues=s;const n=i[t||"toObject"](e);return i.includeDefaultValues=r,n})}toObject(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[];const e=this.layoutManager.toObject();return{...super.toObject(["subTargetCheck","interactive",...t]),..."fit-content"!==e.strategy||this.includeDefaultValues?{layoutManager:e}:{},objects:this.__serializeObjects("toObject",t)}}toString(){return`#`}dispose(){this.layoutManager.unsubscribeTargets({targets:this.getObjects(),target:this}),this._activeObjects=[],this.forEachObject(t=>{this._watchObject(!1,t),t.dispose()}),super.dispose()}_createSVGBgRect(t){if(!this.backgroundColor)return"";const e=hr.prototype._toSVG.call(this),s=e.indexOf("COMMON_PARTS");e[s]='for="group" ';const i=e.join("");return t?t(i):i}_toSVG(t){const e=["\n"],s=this._createSVGBgRect(t);s&&e.push("\t\t",s);for(let s=0;s\n"),e}getSvgStyles(){const t=void 0!==this.opacity&&1!==this.opacity?`opacity: ${this.opacity};`:"",e=this.visible?"":" visibility: hidden;";return[t,this.getSvgFilter(),e].join("")}toClipPathSVG(t){const e=[],s=this._createSVGBgRect(t);s&&e.push("\t",s);for(let s=0;s{let[e,s]=t;const i=new this(e,{...n,...s,layoutManager:new yr});if(r){const t=J.getClass(r.type),e=J.getClass(r.strategy);i.layoutManager=new t(new e)}else i.layoutManager=new vr;return i.layoutManager.subscribeTargets({type:lr,target:i,targets:i.getObjects()}),i.setCoords(),i})}}t(_r,"type","Group"),t(_r,"ownDefaults",{strokeWidth:0,subTargetCheck:!1,interactive:!1}),J.setClass(_r);const xr=(t,e)=>Math.min(e.width/t.width,e.height/t.height),Cr=(t,e)=>Math.max(e.width/t.width,e.height/t.height),Sr="\\s*,?\\s*",br=`${Sr}(${os})`,wr=`${br}${br}${br}${Sr}([01])${Sr}([01])${br}${br}`,Tr={m:"l",M:"L"},Or=(t,e,s,i,r,n,o,a,h,l,c)=>{const u=et(t),d=st(t),g=et(e),f=st(e),p=s*r*g-i*n*f+o,m=i*r*g+s*n*f+a;return["C",l+h*(-s*r*d-i*n*u),c+h*(-i*r*d+s*n*u),p+h*(s*r*f+i*n*g),m+h*(i*r*f-s*n*g),p,m]},kr=(t,e,s,i)=>{const r=Math.atan2(e,t),n=Math.atan2(i,s);return n>=r?n-r:2*Math.PI-(r-n)};function Dr(t,e,i,r,n,o,a,h){let l;if(s.cachesBoundsOfCurve&&(l=[...arguments].join(),p.boundsOfCurveCache[l]))return p.boundsOfCurveCache[l];const c=Math.sqrt,u=Math.abs,d=[],g=[[0,0],[0,0]];let f=6*t-12*i+6*n,m=-3*t+9*i-9*n+3*a,v=3*i-3*t;for(let t=0;t<2;++t){if(t>0&&(f=6*e-12*r+6*o,m=-3*e+9*r-9*o+3*h,v=3*r-3*e),u(m)<1e-12){if(u(f)<1e-12)continue;const t=-v/f;0{let[i,r,n,o,a,h,l,c]=s;const u=((t,e,s,i,r,n,o)=>{if(0===s||0===i)return[];let a=0,h=0,l=0;const c=Math.PI,u=o*C,d=st(u),g=et(u),f=.5*(-g*t-d*e),p=.5*(-g*e+d*t),m=s**2,v=i**2,y=p**2,_=f**2,x=m*v-m*y-v*_;let S=Math.abs(s),b=Math.abs(i);if(x<0){const t=Math.sqrt(1-x/(m*v));S*=t,b*=t}else l=(r===n?-1:1)*Math.sqrt(x/(m*y+v*_));const w=l*S*p/b,T=-l*b*f/S,O=g*w-d*T+.5*t,k=d*w+g*T+.5*e;let D=kr(1,0,(f-w)/S,(p-T)/b),M=kr((f-w)/S,(p-T)/b,(-f-w)/S,(-p-T)/b);0===n&&M>0?M-=2*c:1===n&&M<0&&(M+=2*c);const E=Math.ceil(Math.abs(M/c*2)),P=[],A=M/E,j=8/3*Math.sin(A/4)*Math.sin(A/4)/Math.sin(A/2);let F=D+A;for(let t=0;t{let e=0,s=0,i=0,r=0;const n=[];let o,a=0,h=0;for(const l of t){const t=[...l];let c;switch(t[0]){case"l":t[1]+=e,t[2]+=s;case"L":e=t[1],s=t[2],c=["L",e,s];break;case"h":t[1]+=e;case"H":e=t[1],c=["L",e,s];break;case"v":t[1]+=s;case"V":s=t[1],c=["L",e,s];break;case"m":t[1]+=e,t[2]+=s;case"M":e=t[1],s=t[2],i=t[1],r=t[2],c=["M",e,s];break;case"c":t[1]+=e,t[2]+=s,t[3]+=e,t[4]+=s,t[5]+=e,t[6]+=s;case"C":a=t[3],h=t[4],e=t[5],s=t[6],c=["C",t[1],t[2],a,h,e,s];break;case"s":t[1]+=e,t[2]+=s,t[3]+=e,t[4]+=s;case"S":"C"===o?(a=2*e-a,h=2*s-h):(a=e,h=s),e=t[3],s=t[4],c=["C",a,h,t[1],t[2],e,s],a=c[3],h=c[4];break;case"q":t[1]+=e,t[2]+=s,t[3]+=e,t[4]+=s;case"Q":a=t[1],h=t[2],e=t[3],s=t[4],c=["Q",a,h,e,s];break;case"t":t[1]+=e,t[2]+=s;case"T":"Q"===o?(a=2*e-a,h=2*s-h):(a=e,h=s),e=t[1],s=t[2],c=["Q",a,h,e,s];break;case"a":t[6]+=e,t[7]+=s;case"A":Mr(e,s,t).forEach(t=>n.push(t)),e=t[6],s=t[7];break;case"z":case"Z":e=i,s=r,c=["Z"]}c?(n.push(c),o=c[0]):o=""}return n},Pr=(t,e,s,i)=>Math.sqrt((s-t)**2+(i-e)**2),Ar=(t,e,s,i,r,n,o,a)=>h=>{const l=h**3,c=(t=>3*t**2*(1-t))(h),u=(t=>3*t*(1-t)**2)(h),d=(t=>(1-t)**3)(h);return new it(o*l+r*c+s*u+t*d,a*l+n*c+i*u+e*d)},jr=t=>t**2,Fr=t=>2*t*(1-t),Lr=t=>(1-t)**2,Rr=(t,e,s,i,r,n,o,a)=>h=>{const l=jr(h),c=Fr(h),u=Lr(h),d=3*(u*(s-t)+c*(r-s)+l*(o-r)),g=3*(u*(i-e)+c*(n-i)+l*(a-n));return Math.atan2(g,d)},Ir=(t,e,s,i,r,n)=>o=>{const a=jr(o),h=Fr(o),l=Lr(o);return new it(r*a+s*h+t*l,n*a+i*h+e*l)},Br=(t,e,s,i,r,n)=>o=>{const a=1-o,h=2*(a*(s-t)+o*(r-s)),l=2*(a*(i-e)+o*(n-i));return Math.atan2(l,h)},$r=(t,e,s)=>{let i=new it(e,s),r=0;for(let e=1;e<=100;e+=1){const s=t(e/100);r+=Pr(i.x,i.y,s.x,s.y),i=s}return r},Xr=(t,e)=>{let s,i=0,r=0,n={x:t.x,y:t.y},o={...n},a=.01,h=0;const l=t.iterator,c=t.angleFinder;for(;r1e-4;)o=l(i),h=i,s=Pr(n.x,n.y,o.x,o.y),s+r>e?(i-=a,a/=2):(n=o,i+=a,r+=s);return{...o,angle:c(h)}},Yr=t=>{let e,s,i=0,r=0,n=0,o=0,a=0;const h=[];for(const l of t){const t={x:r,y:n,command:l[0],length:0};switch(l[0]){case"M":s=t,s.x=o=r=l[1],s.y=a=n=l[2];break;case"L":s=t,s.length=Pr(r,n,l[1],l[2]),r=l[1],n=l[2];break;case"C":e=Ar(r,n,l[1],l[2],l[3],l[4],l[5],l[6]),s=t,s.iterator=e,s.angleFinder=Rr(r,n,l[1],l[2],l[3],l[4],l[5],l[6]),s.length=$r(e,r,n),r=l[5],n=l[6];break;case"Q":e=Ir(r,n,l[1],l[2],l[3],l[4]),s=t,s.iterator=e,s.angleFinder=Br(r,n,l[1],l[2],l[3],l[4]),s.length=$r(e,r,n),r=l[3],n=l[4];break;case"Z":s=t,s.destX=o,s.destY=a,s.length=Pr(r,n,o,a),r=o,n=a}i+=s.length,h.push(s)}return h.push({length:i,x:r,y:n}),h},Wr=function(t,e){let s=arguments.length>2&&void 0!==arguments[2]?arguments[2]:Yr(t),i=0;for(;e-s[i].length>0&&i{var e;const s=[],i=null!==(e=t.match(Vr))&&void 0!==e?e:[];for(const t of i){const e=t[0];if("z"===e||"Z"===e){s.push([e]);continue}const i=Hr[e.toLowerCase()];let r=[];if("a"===e||"A"===e){Gr.lastIndex=0;for(let e=null;e=Gr.exec(t);)r.push(...e.slice(1))}else r=t.match(zr)||[];for(let t=0;t0&&o?o:e;for(let e=0;e1&&void 0!==arguments[1]?arguments[1]:0,s=new it(t[0]),i=new it(t[1]),r=1,n=0;const o=[],a=t.length,h=a>2;let l;for(h&&(r=t[2].xt[l-2].x?1:s.x===t[l-2].x?0:-1,n=s.y>t[l-2].y?1:s.y===t[l-2].y?0:-1),o.push(["L",s.x+r*e,s.y+n*e]),o},qr=(t,e)=>t.map(t=>t.map((t,s)=>0===s||void 0===e?t:$t(t,e)).join(" ")).join(" "),Kr=(t,e)=>Math.floor(Math.random()*(e-t+1))+t,Jr=(t,e)=>{let s=t._findCenterFromElement();t.transformMatrix&&((t=>{if(t.transformMatrix){const{scaleX:e,scaleY:s,angle:i,skewX:r}=Tt(t.transformMatrix);t.flipX=!1,t.flipY=!1,t.set(W,e),t.set(V,s),t.angle=i,t.skewX=r,t.skewY=0}})(t),s=s.transform(t.transformMatrix)),delete t.transformMatrix,e&&(t.scaleX*=e.scaleX,t.scaleY*=e.scaleY,t.cropX=e.cropX,t.cropY=e.cropY,s.x+=e.offsetLeft,s.y+=e.offsetTop,t.width=e.width,t.height=e.height),t.setPositionByOrigin(s,T,T)};var Qr=Object.freeze({__proto__:null,addTransformToObject:ne,animate:Is,animateColor:Bs,applyTransformToObject:oe,calcAngleBetweenVectors:Se,calcDimensionsMatrix:At,calcPlaneChangeMatrix:ce,calcVectorRotation:be,cancelAnimFrame:lt,capValue:xs,composeMatrix:jt,copyCanvasElement:t=>{var e;const s=ft(t);return null===(e=s.getContext("2d"))||void 0===e||e.drawImage(t,0,0),s},cos:et,createCanvasElement:dt,createImage:gt,createRotateMatrix:kt,createScaleMatrix:Dt,createSkewXMatrix:Et,createSkewYMatrix:Pt,createTranslateMatrix:Ot,createVector:xe,crossProduct:Oe,degreesToRadians:vt,dotProduct:ke,ease:Ms,enlivenObjectEnlivables:Rt,enlivenObjects:Lt,findScaleToCover:Cr,findScaleToFit:xr,getBoundsOfCurve:Dr,getOrthonormalVector:Te,getPathSegmentsInfo:Yr,getPointOnPath:Wr,getPointer:ee,getRandomInt:Kr,getRegularPolygonPath:(t,e)=>{const s=2*Math.PI/t;let i=-y;t%2==0&&(i+=s/2);const r=new Array(t+1);for(let n=0;n{const e=["instantiated_by_use","style","id","class"];switch(t){case"linearGradient":return e.concat(["x1","y1","x2","y2","gradientUnits","gradientTransform"]);case"radialGradient":return e.concat(["gradientUnits","gradientTransform","cx","cy","r","fx","fy","fr"]);case"stop":return e.concat(["offset","stop-color","stop-opacity"])}return e},getUnitVector:we,groupSVGElements:(t,e)=>t&&1===t.length?t[0]:new _r(t,e),hasStyleChanged:Fi,invertTransform:Ct,isBetweenVectors:De,isIdentityMatrix:_t,isTouchEvent:se,isTransparent:Ci,joinPath:qr,loadImage:Ft,magnitude:Ce,makeBoundingBoxFromPoints:re,makePathSimpler:Er,matrixToSVG:Xt,mergeClipPaths:(t,e)=>{var s;let i=t,r=e;i.inverted&&!r.inverted&&(i=e,r=t),ge(r,null===(s=r.group)||void 0===s?void 0:s.calcTransformMatrix(),i.calcTransformMatrix());const n=i.inverted&&r.inverted;return n&&(i.inverted=r.inverted=!1),new _r([i],{clipPath:r,inverted:n})},multiplyTransformMatrices:St,multiplyTransformMatrixArray:bt,parsePath:Nr,parsePreserveAspectRatioAttribute:ze,parseUnit:Ge,pick:It,projectStrokeOnPoints:Oi,qrDecompose:Tt,radiansToDegrees:yt,removeFromArray:tt,removeTransformFromObject:(t,e)=>{const s=Ct(e),i=St(s,t.calcOwnMatrix());oe(t,i)},removeTransformMatrixForSvgParsing:Jr,requestAnimFrame:ht,resetObjectTransform:ae,rotateVector:_e,saveObjectTransform:he,sendObjectToPlane:ge,sendPointToPlane:ue,sendVectorToPlane:de,sin:st,sizeAfterTransform:le,string:ji,stylesFromArray:Ri,stylesToArray:Li,toBlob:mt,toDataURL:pt,toFixed:$t,transformPath:(t,e,s)=>(s&&(e=St(e,[1,0,0,1,-s.x,-s.y])),t.map(t=>{const s=[...t];for(let i=1;i{let[e,i]=t;return s.setProperty(e,i)})}class tn extends Jt{constructor(e){let{allowTouchScrolling:s=!1,containerClass:i=""}=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};super(e),t(this,"upper",void 0),t(this,"container",void 0);const{el:r}=this.lower,n=this.createUpperCanvas();this.upper={el:n,ctx:n.getContext("2d")},this.applyCanvasStyle(r,{allowTouchScrolling:s}),this.applyCanvasStyle(n,{allowTouchScrolling:s,styles:{position:"absolute",left:"0",top:"0"}});const o=this.createContainerElement();o.classList.add(i),r.parentNode&&r.parentNode.replaceChild(o,r),o.append(r,n),this.container=o}createUpperCanvas(){const{el:t}=this.lower,e=dt();return e.className=t.className,e.classList.remove("lower-canvas"),e.classList.add("upper-canvas"),e.setAttribute("data-fabric","top"),e.style.cssText=t.style.cssText,e.setAttribute("draggable","true"),e}createContainerElement(){const t=d().createElement("div");return t.setAttribute("data-fabric","wrapper"),Zr(t,{position:"relative"}),Kt(t),t}applyCanvasStyle(t,e){const{styles:s,allowTouchScrolling:i}=e;Zr(t,{...s,"touch-action":i?"manipulation":E}),Kt(t)}setDimensions(t,e){super.setDimensions(t,e);const{el:s,ctx:i}=this.upper;Ut(s,i,t,e)}setCSSDimensions(t){super.setCSSDimensions(t),qt(this.upper.el,t),qt(this.container,t)}cleanupDOM(t){const e=this.container,{el:s}=this.lower,{el:i}=this.upper;super.cleanupDOM(t),e.removeChild(i),e.removeChild(s),e.parentNode&&e.parentNode.replaceChild(s,e)}dispose(){super.dispose(),u().dispose(this.upper.el),delete this.upper,delete this.container}}class en extends Zt{constructor(){super(...arguments),t(this,"_hoveredTargets",[]),t(this,"_objectsToRender",void 0),t(this,"_currentTransform",null),t(this,"_groupSelector",null),t(this,"contextTopDirty",!1)}static getDefaults(){return{...super.getDefaults(),...en.ownDefaults}}get upperCanvasEl(){var t;return null===(t=this.elements.upper)||void 0===t?void 0:t.el}get contextTop(){var t;return null===(t=this.elements.upper)||void 0===t?void 0:t.ctx}get wrapperEl(){return this.elements.container}initElements(t){this.elements=new tn(t,{allowTouchScrolling:this.allowTouchScrolling,containerClass:this.containerClass}),this._createCacheCanvas()}_onObjectAdded(t){this._objectsToRender=void 0,super._onObjectAdded(t)}_onObjectRemoved(t){this._objectsToRender=void 0,t===this._activeObject&&(this.fire("before:selection:cleared",{deselected:[t]}),this._discardActiveObject(),this.fire("selection:cleared",{deselected:[t]}),t.fire("deselected",{target:t})),t===this._hoveredTarget&&(this._hoveredTarget=void 0,this._hoveredTargets=[]),super._onObjectRemoved(t)}_onStackOrderChanged(){this._objectsToRender=void 0,super._onStackOrderChanged()}_chooseObjectsToRender(){const t=this._activeObject;return!this.preserveObjectStacking&&t?this._objects.filter(e=>!e.group&&e!==t).concat(t):this._objects}renderAll(){this.cancelRequestedRender(),this.destroyed||(!this.contextTopDirty||this._groupSelector||this.isDrawingMode||(this.clearContext(this.contextTop),this.contextTopDirty=!1),this.hasLostContext&&(this.renderTopLayer(this.contextTop),this.hasLostContext=!1),!this._objectsToRender&&(this._objectsToRender=this._chooseObjectsToRender()),this.renderCanvas(this.getContext(),this._objectsToRender))}renderTopLayer(t){t.save(),this.isDrawingMode&&this._isCurrentlyDrawing&&(this.freeDrawingBrush&&this.freeDrawingBrush._render(),this.contextTopDirty=!0),this.selection&&this._groupSelector&&(this._drawSelection(t),this.contextTopDirty=!0),t.restore()}renderTop(){const t=this.contextTop;this.clearContext(t),this.renderTopLayer(t),this.fire("after:render",{ctx:t})}setTargetFindTolerance(t){t=Math.round(t),this.targetFindTolerance=t;const e=this.getRetinaScaling(),s=Math.ceil((2*t+1)*e);this.pixelFindCanvasEl.width=this.pixelFindCanvasEl.height=s,this.pixelFindContext.scale(e,e)}isTargetTransparent(t,e,s){const i=this.targetFindTolerance,r=this.pixelFindContext;this.clearContext(r),r.save(),r.translate(-e+i,-s+i),r.transform(...this.viewportTransform);const n=t.selectionBackgroundColor;t.selectionBackgroundColor="",t.render(r),t.selectionBackgroundColor=n,r.restore();const o=Math.round(i*this.getRetinaScaling());return Ci(r,o,o,o)}_isSelectionKeyPressed(t){const e=this.selectionKey;return!!e&&(Array.isArray(e)?!!e.find(e=>!!e&&!0===t[e]):t[e])}_shouldClearSelection(t,e){const s=this.getActiveObjects(),i=this._activeObject;return!!(!e||e&&i&&s.length>1&&-1===s.indexOf(e)&&i!==e&&!this._isSelectionKeyPressed(t)||e&&!e.evented||e&&!e.selectable&&i&&i!==e)}_shouldCenterTransform(t,e,s){if(!t)return;let i;return e===Y||e===W||e===V||e===I?i=this.centeredScaling||t.centeredScaling:e===L&&(i=this.centeredRotation||t.centeredRotation),i?!s:s}_getOriginFromCorner(t,e){const s={x:t.originX,y:t.originY};return e?(["ml","tl","bl"].includes(e)?s.x=M:["mr","tr","br"].includes(e)&&(s.x=O),["tl","mt","tr"].includes(e)?s.y=D:["bl","mb","br"].includes(e)&&(s.y=k),s):s}_setupCurrentTransform(t,e,s){var i;const r=e.group?ue(this.getScenePoint(t),void 0,e.group.calcTransformMatrix()):this.getScenePoint(t),{key:n="",control:o}=e.getActiveControl()||{},a=s&&o?null===(i=o.getActionHandler(t,e,o))||void 0===i?void 0:i.bind(o):Re,h=((t,e,s,i)=>{if(!e||!t)return"drag";const r=i.controls[e];return r.getActionName(s,r,i)})(s,n,t,e),l=t[this.centeredKey],c=this._shouldCenterTransform(e,h,l)?{x:T,y:T}:this._getOriginFromCorner(e,n),u={target:e,action:h,actionHandler:a,actionPerformed:!1,corner:n,scaleX:e.scaleX,scaleY:e.scaleY,skewX:e.skewX,skewY:e.skewY,offsetX:r.x-e.left,offsetY:r.y-e.top,originX:c.x,originY:c.y,ex:r.x,ey:r.y,lastX:r.x,lastY:r.y,theta:vt(e.angle),width:e.width,height:e.height,shiftKey:t.shiftKey,altKey:l,original:{...he(e),originX:c.x,originY:c.y}};this._currentTransform=u,this.fire("before:transform",{e:t,transform:u})}setCursor(t){this.upperCanvasEl.style.cursor=t}_drawSelection(t){const{x:e,y:s,deltaX:i,deltaY:r}=this._groupSelector,n=new it(e,s).transform(this.viewportTransform),o=new it(e+i,s+r).transform(this.viewportTransform),a=this.selectionLineWidth/2;let h=Math.min(n.x,o.x),l=Math.min(n.y,o.y),c=Math.max(n.x,o.x),u=Math.max(n.y,o.y);this.selectionColor&&(t.fillStyle=this.selectionColor,t.fillRect(h,l,c-h,u-l)),this.selectionLineWidth&&this.selectionBorderColor&&(t.lineWidth=this.selectionLineWidth,t.strokeStyle=this.selectionBorderColor,h+=a,l+=a,c-=a,u-=a,xi.prototype._setLineDash.call(this,t,this.selectionDashArray),t.strokeRect(h,l,c-h,u-l))}findTarget(t){if(this._targetInfo)return this._targetInfo;if(this.skipTargetFind)return{subTargets:[],currentSubTargets:[]};const e=this.getScenePoint(t),s=this._activeObject,i=this.getActiveObjects(),r=this.searchPossibleTargets(this._objects,e),{subTargets:n,container:o,target:a}=r,h={...r,currentSubTargets:n,currentContainer:o,currentTarget:a};if(!s)return h;const l={...this.searchPossibleTargets([s],e),currentSubTargets:n,currentContainer:o,currentTarget:a};if(s.findControl(this.getViewportPoint(t),se(t)))return{...l,target:s};if(l.target){if(i.length>1)return l;if(!this.preserveObjectStacking)return l;if(this.preserveObjectStacking&&t[this.altSelectionKey])return l}return h}_pointIsInObjectSelectionArea(t,e){let s=t.getCoords();const i=this.getZoom(),r=t.padding/i;if(r){const[t,e,i,n]=s,o=Math.atan2(e.y-t.y,e.x-t.x),a=et(o)*r,h=st(o)*r,l=a+h,c=a-h;s=[new it(t.x-c,t.y-l),new it(e.x+l,e.y-c),new it(i.x+c,i.y+l),new it(n.x-l,n.y+c)]}return $s.isPointInPolygon(e,s)}_checkTarget(t,e){if(t&&t.visible&&t.evented&&this._pointIsInObjectSelectionArea(t,e)){if(!this.perPixelTargetFind&&!t.perPixelTargetFind||t.isEditing)return!0;{const s=e.transform(this.viewportTransform);if(!this.isTargetTransparent(t,s.x,s.y))return!0}}return!1}_searchPossibleTargets(t,e,s){let i=t.length;for(;i--;){const r=t[i];if(this._checkTarget(r,e)){if(nt(r)&&r.subTargetCheck){const{target:t}=this._searchPossibleTargets(r._objects,e,s);t&&s.push(t)}return{target:r,subTargets:s}}}return{subTargets:[]}}searchPossibleTargets(t,e){const s=this._searchPossibleTargets(t,e,[]);s.container=s.target;const{container:i,subTargets:r}=s;if(i&&nt(i)&&i.interactive&&r[0]){for(let t=r.length-1;t>0;t--){const e=r[t];if(!nt(e)||!e.interactive)return s.target=e,s}return s.target=r[0],s}return s}getViewportPoint(t){return this._viewportPoint?this._viewportPoint:this._getPointerImpl(t,!0)}getScenePoint(t){return this._scenePoint?this._scenePoint:this._getPointerImpl(t)}_getPointerImpl(t){let e=arguments.length>1&&void 0!==arguments[1]&&arguments[1];const s=this.upperCanvasEl,i=s.getBoundingClientRect();let r=ee(t),n=i.width||0,o=i.height||0;n&&o||(k in i&&D in i&&(o=Math.abs(i.top-i.bottom)),M in i&&O in i&&(n=Math.abs(i.right-i.left))),this.calcOffset(),r.x=r.x-this._offset.left,r.y=r.y-this._offset.top,e||(r=ue(r,void 0,this.viewportTransform));const a=this.getRetinaScaling();1!==a&&(r.x/=a,r.y/=a);const h=0===n||0===o?new it(1,1):new it(s.width/n,s.height/o);return r.multiply(h)}_setDimensionsImpl(t,e){this._resetTransformEventData(),super._setDimensionsImpl(t,e),this._isCurrentlyDrawing&&this.freeDrawingBrush&&this.freeDrawingBrush._setBrushStyles(this.contextTop)}_createCacheCanvas(){this.pixelFindCanvasEl=dt(),this.pixelFindContext=this.pixelFindCanvasEl.getContext("2d",{willReadFrequently:!0}),this.setTargetFindTolerance(this.targetFindTolerance)}getTopContext(){return this.elements.upper.ctx}getSelectionContext(){return this.elements.upper.ctx}getSelectionElement(){return this.elements.upper.el}getActiveObject(){return this._activeObject}getActiveObjects(){const t=this._activeObject;return Gt(t)?t.getObjects():t?[t]:[]}_fireSelectionEvents(t,e){let s=!1,i=!1;const r=this.getActiveObjects(),n=[],o=[];t.forEach(t=>{r.includes(t)||(s=!0,t.fire("deselected",{e:e,target:t}),o.push(t))}),r.forEach(i=>{t.includes(i)||(s=!0,i.fire("selected",{e:e,target:i}),n.push(i))}),t.length>0&&r.length>0?(i=!0,s&&this.fire("selection:updated",{e:e,selected:n,deselected:o})):r.length>0?(i=!0,this.fire("selection:created",{e:e,selected:n})):t.length>0&&(i=!0,this.fire("selection:cleared",{e:e,deselected:o})),i&&(this._objectsToRender=void 0)}setActiveObject(t,e){const s=this.getActiveObjects(),i=this._setActiveObject(t,e);return this._fireSelectionEvents(s,e),i}_setActiveObject(t,e){const s=this._activeObject;return s!==t&&(!(!this._discardActiveObject(e,t)&&this._activeObject)&&(!t.onSelect({e:e})&&(this._activeObject=t,Gt(t)&&s!==t&&t.set("canvas",this),t.setCoords(),!0)))}_discardActiveObject(t,e){const s=this._activeObject;return!!s&&(!s.onDeselect({e:t,object:e})&&(this._currentTransform&&this._currentTransform.target===s&&this.endCurrentTransform(t),Gt(s)&&s===this._hoveredTarget&&(this._hoveredTarget=void 0),this._activeObject=void 0,!0))}discardActiveObject(t){const e=this.getActiveObjects(),s=this.getActiveObject();e.length&&this.fire("before:selection:cleared",{e:t,deselected:[s]});const i=this._discardActiveObject(t);return this._fireSelectionEvents(e,t),i}endCurrentTransform(t){const e=this._currentTransform;this._finalizeCurrentTransform(t),e&&e.target&&(e.target.isMoving=!1),this._currentTransform=null}_finalizeCurrentTransform(t){const e=this._currentTransform,s=e.target,i={e:t,target:s,transform:e,action:e.action};s._scaling&&(s._scaling=!1),s.setCoords(),e.actionPerformed&&(this.fire("object:modified",i),s.fire(U,i))}setViewportTransform(t){super.setViewportTransform(t);const e=this._activeObject;e&&e.setCoords()}destroy(){const t=this._activeObject;Gt(t)&&(t.removeAll(),t.dispose()),delete this._activeObject,super.destroy(),this.pixelFindContext=null,this.pixelFindCanvasEl=void 0}clear(){this.discardActiveObject(),this._activeObject=void 0,this.clearContext(this.contextTop),super.clear()}drawControls(t){const e=this._activeObject;e&&e._renderControls(t)}_toObject(t,e,s){const i=this._realizeGroupTransformOnObject(t),r=super._toObject(t,e,s);return t.set(i),r}_realizeGroupTransformOnObject(t){const{group:e}=t;if(e&&Gt(e)&&this._activeObject===e){const s=It(t,["angle","flipX","flipY",O,W,V,G,z,k]);return ne(t,e.calcOwnMatrix()),s}return{}}_setSVGObject(t,e,s){const i=this._realizeGroupTransformOnObject(e);super._setSVGObject(t,e,s),e.set(i)}}t(en,"ownDefaults",{uniformScaling:!0,uniScaleKey:"shiftKey",centeredScaling:!1,centeredRotation:!1,centeredKey:"altKey",altActionKey:"shiftKey",selection:!0,selectionKey:"shiftKey",selectionColor:"rgba(100, 100, 255, 0.3)",selectionDashArray:[],selectionBorderColor:"rgba(255, 255, 255, 0.3)",selectionLineWidth:1,selectionFullyContained:!1,hoverCursor:"move",moveCursor:"move",defaultCursor:"default",freeDrawingCursor:"crosshair",notAllowedCursor:"not-allowed",perPixelTargetFind:!1,targetFindTolerance:0,skipTargetFind:!1,stopContextMenu:!1,fireRightClick:!1,fireMiddleClick:!1,enablePointerEvents:!1,containerClass:"canvas-container",preserveObjectStacking:!0});class sn{constructor(e){t(this,"targets",[]),t(this,"__disposer",void 0);const s=()=>{const{hiddenTextarea:t}=e.getActiveObject()||{};t&&t.focus()},i=e.upperCanvasEl;i.addEventListener("click",s),this.__disposer=()=>i.removeEventListener("click",s)}exitTextEditing(){this.target=void 0,this.targets.forEach(t=>{t.isEditing&&t.exitEditing()})}add(t){this.targets.push(t)}remove(t){this.unregister(t),tt(this.targets,t)}register(t){this.target=t}unregister(t){t===this.target&&(this.target=void 0)}onMouseMove(t){var e;(null===(e=this.target)||void 0===e?void 0:e.isEditing)&&this.target.updateSelectionOnMouseMove(t)}clear(){this.targets=[],this.target=void 0}dispose(){this.clear(),this.__disposer(),delete this.__disposer}}const rn={passive:!1},nn=(t,e)=>({viewportPoint:t.getViewportPoint(e),scenePoint:t.getScenePoint(e)}),on=function(t){for(var e=arguments.length,s=new Array(e>1?e-1:0),i=1;i1?e-1:0),i=1;i1&&void 0!==arguments[1]?arguments[1]:{}),t(this,"_isClick",void 0),t(this,"textEditingManager",new sn(this)),["_onMouseDown","_onTouchStart","_onMouseMove","_onMouseUp","_onTouchEnd","_onResize","_onMouseWheel","_onMouseOut","_onMouseEnter","_onContextMenu","_onClick","_onDragStart","_onDragEnd","_onDragProgress","_onDragOver","_onDragEnter","_onDragLeave","_onDrop"].forEach(t=>{this[t]=this[t].bind(this)}),this.addOrRemove(on,"add")}_getEventPrefix(){return this.enablePointerEvents?"pointer":"mouse"}addOrRemove(t,e){const s=this.upperCanvasEl,i=this._getEventPrefix();t(Nt(s),"resize",this._onResize),t(s,i+"down",this._onMouseDown),t(s,`${i}move`,this._onMouseMove,rn),t(s,`${i}out`,this._onMouseOut),t(s,`${i}enter`,this._onMouseEnter),t(s,"wheel",this._onMouseWheel),t(s,"contextmenu",this._onContextMenu),t(s,"click",this._onClick),t(s,"dblclick",this._onClick),t(s,"dragstart",this._onDragStart),t(s,"dragend",this._onDragEnd),t(s,"dragover",this._onDragOver),t(s,"dragenter",this._onDragEnter),t(s,"dragleave",this._onDragLeave),t(s,"drop",this._onDrop),this.enablePointerEvents||t(s,"touchstart",this._onTouchStart,rn)}removeListeners(){this.addOrRemove(an,"remove");const t=this._getEventPrefix(),e=Ht(this.upperCanvasEl);an(e,`${t}up`,this._onMouseUp),an(e,"touchend",this._onTouchEnd,rn),an(e,`${t}move`,this._onMouseMove,rn),an(e,"touchmove",this._onMouseMove,rn),clearTimeout(this._willAddMouseDown)}_onMouseWheel(t){this._cacheTransformEventData(t),this._handleEvent(t,"wheel"),this._resetTransformEventData()}_onMouseOut(t){const e=this._hoveredTarget,s={e:t,...nn(this,t)};this.fire("mouse:out",{...s,target:e}),this._hoveredTarget=void 0,e&&e.fire("mouseout",{...s}),this._hoveredTargets.forEach(t=>{this.fire("mouse:out",{...s,target:t}),t&&t.fire("mouseout",{...s})}),this._hoveredTargets=[]}_onMouseEnter(t){const{target:e}=this.findTarget(t);this._currentTransform||e||(this.fire("mouse:over",{e:t,...nn(this,t)}),this._hoveredTarget=void 0,this._hoveredTargets=[])}_onDragStart(t){this._isClick=!1;const e=this.getActiveObject();if(e&&e.onDragStart(t)){this._dragSource=e;const s={e:t,target:e};return this.fire("dragstart",s),e.fire("dragstart",s),void on(this.upperCanvasEl,"drag",this._onDragProgress)}ie(t)}_renderDragEffects(t,e,s){let i=!1;const r=this._dropTarget;r&&r!==e&&r!==s&&(r.clearContextTop(),i=!0),null==e||e.clearContextTop(),s!==e&&(null==s||s.clearContextTop());const n=this.contextTop;n.save(),n.transform(...this.viewportTransform),e&&(n.save(),e.transform(n),e.renderDragSourceEffect(t),n.restore(),i=!0),s&&(n.save(),s.transform(n),s.renderDropTargetEffect(t),n.restore(),i=!0),n.restore(),i&&(this.contextTopDirty=!0)}_onDragEnd(t){const{currentSubTargets:e}=this.findTarget(t),s=!!t.dataTransfer&&t.dataTransfer.dropEffect!==E,i=s?this._activeObject:void 0,r={e:t,target:this._dragSource,subTargets:e,dragSource:this._dragSource,didDrop:s,dropTarget:i};an(this.upperCanvasEl,"drag",this._onDragProgress),this.fire("dragend",r),this._dragSource&&this._dragSource.fire("dragend",r),delete this._dragSource,this._onMouseUp(t)}_onDragProgress(t){const e={e:t,target:this._dragSource,dragSource:this._dragSource,dropTarget:this._draggedoverTarget};this.fire("drag",e),this._dragSource&&this._dragSource.fire("drag",e)}_onDragOver(t){const e="dragover",{currentContainer:s,currentSubTargets:i}=this.findTarget(t),r=this._dragSource,n={e:t,target:s,subTargets:i,dragSource:r,canDrop:!1,dropTarget:void 0};let o;this.fire(e,n),this._fireEnterLeaveEvents(t,s,n),s&&(s.canDrop(t)&&(o=s),s.fire(e,n));for(let s=0;s3||e<2||(this._cacheTransformEventData(t),2==e&&"dblclick"===t.type&&this._handleEvent(t,"dblclick"),3==e&&this._handleEvent(t,"tripleclick"),this._resetTransformEventData())}getPointerId(t){const e=t.changedTouches;return e?e[0]&&e[0].identifier:this.enablePointerEvents?t.pointerId:-1}_isMainEvent(t){return!0===t.isPrimary||!1!==t.isPrimary&&("touchend"===t.type&&0===t.touches.length||(!t.changedTouches||t.changedTouches[0].identifier===this.mainTouchId))}_onTouchStart(t){this._cacheTransformEventData(t);let e=!this.allowTouchScrolling;const s=this._activeObject;void 0===this.mainTouchId&&(this.mainTouchId=this.getPointerId(t)),this.__onMouseDown(t);const{target:i}=this.findTarget(t);(this.isDrawingMode||s&&i===s)&&(e=!0),e&&t.preventDefault();const r=this.upperCanvasEl,n=this._getEventPrefix(),o=Ht(r);on(o,"touchend",this._onTouchEnd,rn),e&&on(o,"touchmove",this._onMouseMove,rn),an(r,`${n}down`,this._onMouseDown),this._resetTransformEventData()}_onMouseDown(t){this._cacheTransformEventData(t),this.__onMouseDown(t);const e=this.upperCanvasEl,s=this._getEventPrefix();an(e,`${s}move`,this._onMouseMove,rn);const i=Ht(e);on(i,`${s}up`,this._onMouseUp),on(i,`${s}move`,this._onMouseMove,rn),this._resetTransformEventData()}_onTouchEnd(t){if(t.touches.length>0)return;this._cacheTransformEventData(t),this.__onMouseUp(t),this._resetTransformEventData(),delete this.mainTouchId;const e=this._getEventPrefix(),s=Ht(this.upperCanvasEl);an(s,"touchend",this._onTouchEnd,rn),an(s,"touchmove",this._onMouseMove,rn),this._willAddMouseDown&&clearTimeout(this._willAddMouseDown),this._willAddMouseDown=setTimeout(()=>{on(this.upperCanvasEl,`${e}down`,this._onMouseDown),this._willAddMouseDown=0},400)}_onMouseUp(t){this._cacheTransformEventData(t),this.__onMouseUp(t);const e=this.upperCanvasEl,s=this._getEventPrefix();if(this._isMainEvent(t)){const t=Ht(this.upperCanvasEl);an(t,`${s}up`,this._onMouseUp),an(t,`${s}move`,this._onMouseMove,rn),on(e,`${s}move`,this._onMouseMove,rn)}this._resetTransformEventData()}_onMouseMove(t){this._cacheTransformEventData(t);const e=this.getActiveObject();!this.allowTouchScrolling&&(!e||!e.shouldStartDragging(t))&&t.preventDefault&&t.preventDefault(),this.__onMouseMove(t),this._resetTransformEventData()}_onResize(){this.calcOffset(),this._resetTransformEventData()}_shouldRender(t){const e=this.getActiveObject();return!!e!=!!t||e&&t&&e!==t}__onMouseUp(t){var e;this._handleEvent(t,"up:before");const s=this._currentTransform,i=this._isClick,{target:r}=this.findTarget(t),{button:n}=t;if(n)return void((this.fireMiddleClick&&1===n||this.fireRightClick&&2===n)&&this._handleEvent(t,"up"));if(this.isDrawingMode&&this._isCurrentlyDrawing)return void this._onMouseUpInDrawingMode(t);if(!this._isMainEvent(t))return;let o,a,h=!1;if(s&&(this._finalizeCurrentTransform(t),h=s.actionPerformed),!i){const e=r===this._activeObject;this.handleSelection(t),h||(h=this._shouldRender(r)||!e&&r===this._activeObject)}if(r){const e=r.findControl(this.getViewportPoint(t),se(t)),{key:i,control:n}=e||{};if(a=i,r.selectable&&r!==this._activeObject&&"up"===r.activeOn)this.setActiveObject(r,t),h=!0;else if(n){const e=n.getMouseUpHandler(t,r,n);e&&(o=this.getScenePoint(t),e.call(n,t,s,o.x,o.y))}r.isMoving=!1}if(s&&(s.target!==r||s.corner!==a)){const e=s.target&&s.target.controls[s.corner],i=e&&e.getMouseUpHandler(t,s.target,e);o=o||this.getScenePoint(t),i&&i.call(e,t,s,o.x,o.y)}this._setCursorFromEvent(t,r),this._handleEvent(t,"up"),this._groupSelector=null,this._currentTransform=null,r&&(r.__corner=void 0),h?this.requestRenderAll():i||null!==(e=this._activeObject)&&void 0!==e&&e.isEditing||this.renderTop()}_basicEventHandler(t,e){const{target:s,subTargets:i=[]}=e;this.fire(t,e),s&&s.fire(t,e);for(let r=0;r{s=t.hoverCursor||s})}this.setCursor(s)}}handleMultiSelection(t,e){const s=this._activeObject,i=Gt(s);if(s&&this._isSelectionKeyPressed(t)&&this.selection&&e&&e.selectable&&(s!==e||i)&&(i||!e.isDescendantOf(s)&&!s.isDescendantOf(e))&&!e.onSelect({e:t})&&!s.getActiveControl()){if(i){const i=s.getObjects();let r=[];if(e===s){const s=this.getScenePoint(t);let n=this.searchPossibleTargets(i,s);if(n.target?(e=n.target,r=n.subTargets):(n=this.searchPossibleTargets(this._objects,s),e=n.target,r=n.subTargets),!e||!e.selectable)return!1}e.group===s?(s.remove(e),this._hoveredTarget=e,this._hoveredTargets=r,1===s.size()&&this._setActiveObject(s.item(0),t)):(s.multiSelectAdd(e),this._hoveredTarget=s,this._hoveredTargets=r),this._fireSelectionEvents(i,t)}else{s.isEditing&&s.exitEditing();const i=new(J.getClass("ActiveSelection"))([],{canvas:this});i.multiSelectAdd(s,e),this._hoveredTarget=i,this._setActiveObject(i,t),this._fireSelectionEvents([s],t)}return!0}return!1}handleSelection(t){if(!this.selection||!this._groupSelector)return!1;const{x:e,y:s,deltaX:i,deltaY:r}=this._groupSelector,n=new it(e,s),o=n.add(new it(i,r)),a=n.min(o),h=n.max(o).subtract(a),l=this.collectObjects({left:a.x,top:a.y,width:h.x,height:h.y},{includeIntersecting:!this.selectionFullyContained}),c=n.eq(o)?l[0]?[l[0]]:[]:l.length>1?l.filter(e=>!e.onSelect({e:t})).reverse():l;if(1===c.length)this.setActiveObject(c[0],t);else if(c.length>1){const e=J.getClass("ActiveSelection");this.setActiveObject(new e(c,{canvas:this}),t)}return this._groupSelector=null,!0}clear(){this.textEditingManager.clear(),super.clear()}destroy(){this.removeListeners(),this.textEditingManager.dispose(),super.destroy()}}const cn={x1:0,y1:0,x2:0,y2:0},un={...cn,r1:0,r2:0},dn=(t,e)=>isNaN(t)&&"number"==typeof e?e:t,gn=/^(\d+\.\d+)%|(\d+)%$/;function fn(t){return t&&gn.test(t)}function pn(t,e){const s="number"==typeof t?t:"string"==typeof t?parseFloat(t)/(fn(t)?100:1):NaN;return xs(0,dn(s,e),1)}const mn=/\s*;\s*/,vn=/\s*:\s*/;function yn(t,e){let s,i;const r=t.getAttribute("style");if(r){const t=r.split(mn);""===t[t.length-1]&&t.pop();for(let e=t.length;e--;){const[r,n]=t[e].split(vn).map(t=>t.trim());"stop-color"===r?s=n:"stop-opacity"===r&&(i=n)}}s=s||t.getAttribute("stop-color")||"rgb(0,0,0)",i=dn(parseFloat(i||t.getAttribute("stop-opacity")||""),1);const n=new Ve(s);return n.setAlpha(n.getAlpha()*i*e),{offset:pn(t.getAttribute("offset"),0),color:n.toRgba()}}function _n(t,e){const s=[],i=t.getElementsByTagName("stop"),r=pn(e,1);for(let t=i.length;t--;)s.push(yn(i[t],r));return s}function xn(t){return"linearGradient"===t.nodeName||"LINEARGRADIENT"===t.nodeName?"linear":"radial"}function Cn(t){return"userSpaceOnUse"===t.getAttribute("gradientUnits")?"pixels":"percentage"}function Sn(t,e){return t.getAttribute(e)}function bn(t,e){return function(t,e){let s,{width:i,height:r,gradientUnits:n}=e;return Object.keys(t).reduce((e,o)=>{const a=t[o];return"Infinity"===a?s=1:"-Infinity"===a?s=0:(s="string"==typeof a?parseFloat(a):a,"string"==typeof a&&fn(a)&&(s*=.01,"pixels"===n&&("x1"!==o&&"x2"!==o&&"r2"!==o||(s*=i),"y1"!==o&&"y2"!==o||(s*=r)))),e[o]=s,e},{})}("linear"===xn(t)?function(t){return{x1:Sn(t,"x1")||0,y1:Sn(t,"y1")||0,x2:Sn(t,"x2")||"100%",y2:Sn(t,"y2")||0}}(t):function(t){return{x1:Sn(t,"fx")||Sn(t,"cx")||"50%",y1:Sn(t,"fy")||Sn(t,"cy")||"50%",r1:0,x2:Sn(t,"cx")||"50%",y2:Sn(t,"cy")||"50%",r2:Sn(t,"r")||"50%"}}(t),{...e,gradientUnits:Cn(t)})}class wn{constructor(t){const{type:e="linear",gradientUnits:s="pixels",coords:i={},colorStops:r=[],offsetX:n=0,offsetY:o=0,gradientTransform:a,id:h}=t||{};Object.assign(this,{type:e,gradientUnits:s,coords:{..."radial"===e?un:cn,...i},colorStops:r,offsetX:n,offsetY:o,gradientTransform:a,id:h?`${h}_${ut()}`:ut()})}addColorStop(t){for(const e in t)this.colorStops.push({offset:parseFloat(e),color:t[e]});return this}toObject(t){return{...It(this,t),type:this.type,coords:{...this.coords},colorStops:this.colorStops.map(t=>({...t})),offsetX:this.offsetX,offsetY:this.offsetY,gradientUnits:this.gradientUnits,gradientTransform:this.gradientTransform?[...this.gradientTransform]:void 0}}toSVG(t){let{additionalTransform:e}=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};const s=[],i=this.gradientTransform?this.gradientTransform.concat():S.concat(),r="pixels"===this.gradientUnits?"userSpaceOnUse":"objectBoundingBox",n=this.colorStops.map(t=>({...t})).sort((t,e)=>t.offset-e.offset);let o=-this.offsetX,a=-this.offsetY;var h;"objectBoundingBox"===r?(o/=t.width,a/=t.height):(o+=t.width/2,a+=t.height/2),(h=t)&&"function"==typeof h._renderPathCommands&&"percentage"!==this.gradientUnits&&(o-=t.pathOffset.x,a-=t.pathOffset.y),i[4]-=o,i[5]-=a;const l=[`id="SVGID_${this.id}"`,`gradientUnits="${r}"`,`gradientTransform="${e?e+" ":""}${Xt(i)}"`,""].join(" ");if("linear"===this.type){const{x1:t,y1:e,x2:i,y2:r}=this.coords;s.push("\n')}else if("radial"===this.type){const{x1:t,y1:e,x2:i,y2:r,r1:o,r2:a}=this.coords,h=o>a;s.push("\n'),h&&(n.reverse(),n.forEach(t=>{t.offset=1-t.offset}));const c=Math.min(o,a);if(c>0){const t=c/Math.max(o,a);n.forEach(e=>{e.offset+=t*(1-e.offset)})}}return n.forEach(t=>{let{color:e,offset:i}=t;s.push(`\n`)}),s.push("linear"===this.type?"":"","\n"),s.join("")}toLive(t){const{x1:e,y1:s,x2:i,y2:r,r1:n,r2:o}=this.coords,a="linear"===this.type?t.createLinearGradient(e,s,i,r):t.createRadialGradient(e,s,n,i,r,o);return this.colorStops.forEach(t=>{let{color:e,offset:s}=t;a.addColorStop(s,e)}),a}static async fromObject(t){const{colorStops:e,gradientTransform:s}=t;return new this({...t,colorStops:e?e.map(t=>({...t})):void 0,gradientTransform:s?[...s]:void 0})}static fromElement(t,e,s){const i=Cn(t),r=e._findCenterFromElement();return new this({id:t.getAttribute("id")||void 0,type:xn(t),coords:bn(t,{width:s.viewBoxWidth||s.width,height:s.viewBoxHeight||s.height}),colorStops:_n(t,s.opacity),gradientUnits:i,gradientTransform:er(t.getAttribute("gradientTransform")||""),..."pixels"===i?{offsetX:e.width/2-r.x,offsetY:e.height/2-r.y}:{offsetX:0,offsetY:0}})}}t(wn,"type","Gradient"),J.setClass(wn,"gradient"),J.setClass(wn,"linear"),J.setClass(wn,"radial");class Tn{get type(){return"pattern"}set type(t){i("warn","Setting type has no effect",t)}constructor(e){t(this,"repeat","repeat"),t(this,"offsetX",0),t(this,"offsetY",0),t(this,"crossOrigin",""),this.id=ut(),Object.assign(this,e)}isImageSource(){return!!this.source&&"string"==typeof this.source.src}isCanvasSource(){return!!this.source&&!!this.source.toDataURL}sourceToString(){return this.isImageSource()?this.source.src:this.isCanvasSource()?this.source.toDataURL():""}toLive(t){return this.source&&(!this.isImageSource()||this.source.complete&&0!==this.source.naturalWidth&&0!==this.source.naturalHeight)?t.createPattern(this.source,this.repeat):null}toObject(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[];const{repeat:e,crossOrigin:i}=this;return{...It(this,t),type:"pattern",source:this.sourceToString(),repeat:e,crossOrigin:i,offsetX:$t(this.offsetX,s.NUM_FRACTION_DIGITS),offsetY:$t(this.offsetY,s.NUM_FRACTION_DIGITS),patternTransform:this.patternTransform?[...this.patternTransform]:null}}toSVG(t){let{width:e,height:s}=t;const{source:i,repeat:r,id:n}=this,o=dn(this.offsetX/e,0),a=dn(this.offsetY/s,0);return[``,``,"",""].join("\n")}static async fromObject(t,e){let{type:s,source:i,patternTransform:r,...n}=t;const o=await Ft(i,{...e,crossOrigin:n.crossOrigin});return new this({...n,patternTransform:r&&r.slice(0),source:o})}}t(Tn,"type","Pattern"),J.setClass(Tn),J.setClass(Tn,"pattern");class On{constructor(e){t(this,"color","rgb(0, 0, 0)"),t(this,"width",1),t(this,"shadow",null),t(this,"strokeLineCap","round"),t(this,"strokeLineJoin","round"),t(this,"strokeMiterLimit",10),t(this,"strokeDashArray",null),t(this,"limitedToCanvasSize",!1),this.canvas=e}_setBrushStyles(t){t.strokeStyle=this.color,t.lineWidth=this.width,t.lineCap=this.strokeLineCap,t.miterLimit=this.strokeMiterLimit,t.lineJoin=this.strokeLineJoin,t.setLineDash(this.strokeDashArray||[])}_saveAndTransform(t){const e=this.canvas.viewportTransform;t.save(),t.transform(e[0],e[1],e[2],e[3],e[4],e[5])}needsFullRender(){return new Ve(this.color).getAlpha()<1||!!this.shadow}_setShadow(){if(!this.shadow||!this.canvas)return;const t=this.canvas,e=this.shadow,s=t.contextTop,i=t.getZoom()*t.getRetinaScaling();s.shadowColor=e.color,s.shadowBlur=e.blur*i,s.shadowOffsetX=e.offsetX*i,s.shadowOffsetY=e.offsetY*i}_resetShadow(){const t=this.canvas.contextTop;t.shadowColor="",t.shadowBlur=t.shadowOffsetX=t.shadowOffsetY=0}_isOutSideCanvas(t){return t.x<0||t.x>this.canvas.getWidth()||t.y<0||t.y>this.canvas.getHeight()}}class kn extends xi{constructor(t){let{path:e,left:s,top:i,...r}=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};super(),Object.assign(this,kn.ownDefaults),this.setOptions(r),this._setPath(t||[],!0),"number"==typeof s&&this.set(O,s),"number"==typeof i&&this.set(k,i)}_setPath(t,e){this.path=Er(Array.isArray(t)?t:Nr(t)),this.setBoundingBox(e)}_findCenterFromElement(){const t=this._calcBoundsFromPath();return new it(t.left+t.width/2,t.top+t.height/2)}_renderPathCommands(t){const e=-this.pathOffset.x,s=-this.pathOffset.y;t.beginPath();for(const i of this.path)switch(i[0]){case"L":t.lineTo(i[1]+e,i[2]+s);break;case"M":t.moveTo(i[1]+e,i[2]+s);break;case"C":t.bezierCurveTo(i[1]+e,i[2]+s,i[3]+e,i[4]+s,i[5]+e,i[6]+s);break;case"Q":t.quadraticCurveTo(i[1]+e,i[2]+s,i[3]+e,i[4]+s);break;case"Z":t.closePath()}}_render(t){this._renderPathCommands(t),this._renderPaintInOrder(t)}toString(){return`#`}toObject(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[];return{...super.toObject(t),path:this.path.map(t=>t.slice())}}toDatalessObject(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[];const e=this.toObject(t);return this.sourcePath&&(delete e.path,e.sourcePath=this.sourcePath),e}_toSVG(){return["\n`]}_getOffsetTransform(){const t=s.NUM_FRACTION_DIGITS;return` translate(${$t(-this.pathOffset.x,t)}, ${$t(-this.pathOffset.y,t)})`}toClipPathSVG(t){const e=this._getOffsetTransform();return"\t"+this._createBaseClipPathSVGMarkup(this._toSVG(),{reviver:t,additionalTransform:e})}toSVG(t){const e=this._getOffsetTransform();return this._createBaseSVGMarkup(this._toSVG(),{reviver:t,additionalTransform:e})}complexity(){return this.path.length}setDimensions(){this.setBoundingBox()}setBoundingBox(t){const{width:e,height:s,pathOffset:i}=this._calcDimensions();this.set({width:e,height:s,pathOffset:i}),t&&this.setPositionByOrigin(i,T,T)}_calcBoundsFromPath(){const t=[];let e=0,s=0,i=0,r=0;for(const n of this.path)switch(n[0]){case"L":i=n[1],r=n[2],t.push({x:e,y:s},{x:i,y:r});break;case"M":i=n[1],r=n[2],e=i,s=r;break;case"C":t.push(...Dr(i,r,n[1],n[2],n[3],n[4],n[5],n[6])),i=n[5],r=n[6];break;case"Q":t.push(...Dr(i,r,n[1],n[2],n[1],n[2],n[3],n[4])),i=n[3],r=n[4];break;case"Z":i=e,r=s}return re(t)}_calcDimensions(){const t=this._calcBoundsFromPath();return{...t,pathOffset:new it(t.left+t.width/2,t.top+t.height/2)}}static fromObject(t){return this._fromObject(t,{extraParam:"path"})}static async fromElement(t,e,s){const{d:i,...r}=or(t,this.ATTRIBUTE_NAMES,s);return new this(i,{...r,...e,left:void 0,top:void 0})}}t(kn,"type","Path"),t(kn,"cacheProperties",[...Ss,"path","fillRule"]),t(kn,"ATTRIBUTE_NAMES",[...Ii,"d"]),J.setClass(kn),J.setSVGClass(kn);class Dn extends On{constructor(e){super(e),t(this,"decimate",.4),t(this,"drawStraightLine",!1),t(this,"straightLineKey","shiftKey"),this._points=[],this._hasStraightLine=!1}needsFullRender(){return super.needsFullRender()||this._hasStraightLine}static drawSegment(t,e,s){const i=e.midPointFrom(s);return t.quadraticCurveTo(e.x,e.y,i.x,i.y),i}onMouseDown(t,e){let{e:s}=e;this.canvas._isMainEvent(s)&&(this.drawStraightLine=!!this.straightLineKey&&s[this.straightLineKey],this._prepareForDrawing(t),this._addPoint(t),this._render())}onMouseMove(t,e){let{e:s}=e;if(this.canvas._isMainEvent(s)&&(this.drawStraightLine=!!this.straightLineKey&&s[this.straightLineKey],(!0!==this.limitedToCanvasSize||!this._isOutSideCanvas(t))&&this._addPoint(t)&&this._points.length>1))if(this.needsFullRender())this.canvas.clearContext(this.canvas.contextTop),this._render();else{const t=this._points,e=t.length,s=this.canvas.contextTop;this._saveAndTransform(s),this.oldEnd&&(s.beginPath(),s.moveTo(this.oldEnd.x,this.oldEnd.y)),this.oldEnd=Dn.drawSegment(s,t[e-2],t[e-1]),s.stroke(),s.restore()}}onMouseUp(t){let{e:e}=t;return!this.canvas._isMainEvent(e)||(this.drawStraightLine=!1,this.oldEnd=void 0,this._finalizeAndAddPath(),!1)}_prepareForDrawing(t){this._reset(),this._addPoint(t),this.canvas.contextTop.moveTo(t.x,t.y)}_addPoint(t){return!(this._points.length>1&&t.eq(this._points[this._points.length-1]))&&(this.drawStraightLine&&this._points.length>1&&(this._hasStraightLine=!0,this._points.pop()),this._points.push(t),!0)}_reset(){this._points=[],this._setBrushStyles(this.canvas.contextTop),this._setShadow(),this._hasStraightLine=!1}_render(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.canvas.contextTop,e=this._points[0],s=this._points[1];if(this._saveAndTransform(t),t.beginPath(),2===this._points.length&&e.x===s.x&&e.y===s.y){const t=this.width/1e3;e.x-=t,s.x+=t}t.moveTo(e.x,e.y);for(let i=1;i=n&&(i=t[e],a.push(i));return a.push(t[o]),a}_finalizeAndAddPath(){this.canvas.contextTop.closePath(),this.decimate&&(this._points=this.decimatePoints(this._points,this.decimate));const t=this.convertPointsToSVGPath(this._points);if(function(t){return"M 0 0 Q 0 0 0 0 L 0 0"===qr(t)}(t))return void this.canvas.requestRenderAll();const e=this.createPath(t);this.canvas.clearContext(this.canvas.contextTop),this.canvas.fire("before:path:created",{path:e}),this.canvas.add(e),this.canvas.requestRenderAll(),e.setCoords(),this._resetShadow(),this.canvas.fire("path:created",{path:e})}}const Mn=["radius","startAngle","endAngle","counterClockwise"];class En extends xi{static getDefaults(){return{...super.getDefaults(),...En.ownDefaults}}constructor(t){super(),Object.assign(this,En.ownDefaults),this.setOptions(t)}_set(t,e){return super._set(t,e),"radius"===t&&this.setRadius(e),this}_render(t){t.beginPath(),t.arc(0,0,this.radius,vt(this.startAngle),vt(this.endAngle),this.counterClockwise),this._renderPaintInOrder(t)}getRadiusX(){return this.get("radius")*this.get(W)}getRadiusY(){return this.get("radius")*this.get(V)}setRadius(t){this.radius=t,this.set({width:2*t,height:2*t})}toObject(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[];return super.toObject([...Mn,...t])}_toSVG(){const t=(this.endAngle-this.startAngle)%360;if(0===t)return["\n'];{const{radius:e}=this,s=vt(this.startAngle),i=vt(this.endAngle),r=et(s)*e,n=st(s)*e,o=et(i)*e,a=st(i)*e;return[`\n"]}}static async fromElement(t,e,s){const{left:i=0,top:r=0,radius:n=0,...o}=or(t,this.ATTRIBUTE_NAMES,s);return new this({...o,radius:n,left:i-n,top:r-n})}static fromObject(t){return super._fromObject(t)}}t(En,"type","Circle"),t(En,"cacheProperties",[...Ss,...Mn]),t(En,"ownDefaults",{radius:0,startAngle:0,endAngle:360,counterClockwise:!1}),t(En,"ATTRIBUTE_NAMES",["cx","cy","r",...Ii]),J.setClass(En),J.setSVGClass(En);class Pn extends On{constructor(e){super(e),t(this,"width",10),this.points=[]}drawDot(t){const e=this.addPoint(t),s=this.canvas.contextTop;this._saveAndTransform(s),this.dot(s,e),s.restore()}dot(t,e){t.fillStyle=e.fill,t.beginPath(),t.arc(e.x,e.y,e.radius,0,2*Math.PI,!1),t.closePath(),t.fill()}onMouseDown(t){this.points=[],this.canvas.clearContext(this.canvas.contextTop),this._setShadow(),this.drawDot(t)}_render(){const t=this.canvas.contextTop,e=this.points;this._saveAndTransform(t);for(let s=0;s0&&void 0!==arguments[0]?arguments[0]:[0,0,0,0],r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};super(),Object.assign(this,Ln.ownDefaults),this.setOptions(r),this.x1=t,this.x2=s,this.y1=e,this.y2=i,this._setWidthHeight();const{left:n,top:o}=r;"number"==typeof n&&this.set(O,n),"number"==typeof o&&this.set(k,o)}_setWidthHeight(){const{x1:t,y1:e,x2:s,y2:i}=this;this.width=Math.abs(s-t),this.height=Math.abs(i-e);const{left:r,top:n,width:o,height:a}=re([{x:t,y:e},{x:s,y:i}]),h=new it(r+o/2,n+a/2);this.setPositionByOrigin(h,T,T)}_set(t,e){return super._set(t,e),Fn.includes(t)&&this._setWidthHeight(),this}_render(t){t.beginPath();const e=this.calcLinePoints();t.moveTo(e.x1,e.y1),t.lineTo(e.x2,e.y2),t.lineWidth=this.strokeWidth;const s=t.strokeStyle;var i;Yt(this.stroke)?t.strokeStyle=this.stroke.toLive(t):t.strokeStyle=null!==(i=this.stroke)&&void 0!==i?i:t.fillStyle;this.stroke&&this._renderStroke(t),t.strokeStyle=s}_findCenterFromElement(){return new it((this.x1+this.x2)/2,(this.y1+this.y2)/2)}toObject(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[];return{...super.toObject(t),...this.calcLinePoints()}}_getNonTransformedDimensions(){const t=super._getNonTransformedDimensions();return"butt"===this.strokeLineCap&&(0===this.width&&(t.y-=this.strokeWidth),0===this.height&&(t.x-=this.strokeWidth)),t}calcLinePoints(){const{x1:t,x2:e,y1:s,y2:i,width:r,height:n}=this,o=t<=e?-1:1,a=s<=i?-1:1;return{x1:o*r/2,x2:o*-r/2,y1:a*n/2,y2:a*-n/2}}_toSVG(){const{x1:t,x2:e,y1:s,y2:i}=this.calcLinePoints();return["\n`]}static async fromElement(t,e,s){const{x1:i=0,y1:r=0,x2:n=0,y2:o=0,...a}=or(t,this.ATTRIBUTE_NAMES,s);return new this([i,r,n,o],a)}static fromObject(t){let{x1:e,y1:s,x2:i,y2:r,...n}=t;return this._fromObject({...n,points:[e,s,i,r]},{extraParam:"points"})}}t(Ln,"type","Line"),t(Ln,"cacheProperties",[...Ss,...Fn]),t(Ln,"ATTRIBUTE_NAMES",Ii.concat(Fn)),J.setClass(Ln),J.setSVGClass(Ln);class Rn extends xi{static getDefaults(){return{...super.getDefaults(),...Rn.ownDefaults}}constructor(t){super(),Object.assign(this,Rn.ownDefaults),this.setOptions(t)}_render(t){const e=this.width/2,s=this.height/2;t.beginPath(),t.moveTo(-e,s),t.lineTo(0,-s),t.lineTo(e,s),t.closePath(),this._renderPaintInOrder(t)}_toSVG(){const t=this.width/2,e=this.height/2;return["']}}t(Rn,"type","Triangle"),t(Rn,"ownDefaults",{width:100,height:100}),J.setClass(Rn),J.setSVGClass(Rn);const In=["rx","ry"];class Bn extends xi{static getDefaults(){return{...super.getDefaults(),...Bn.ownDefaults}}constructor(t){super(),Object.assign(this,Bn.ownDefaults),this.setOptions(t)}_set(t,e){switch(super._set(t,e),t){case"rx":this.rx=e,this.set("width",2*e);break;case"ry":this.ry=e,this.set("height",2*e)}return this}getRx(){return this.get("rx")*this.get(W)}getRy(){return this.get("ry")*this.get(V)}toObject(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[];return super.toObject([...In,...t])}_toSVG(){return["\n`]}_render(t){t.beginPath(),t.save(),t.transform(1,0,0,this.ry/this.rx,0,0),t.arc(0,0,this.rx,0,x,!1),t.restore(),this._renderPaintInOrder(t)}static async fromElement(t,e,s){const i=or(t,this.ATTRIBUTE_NAMES,s);return i.left=(i.left||0)-i.rx,i.top=(i.top||0)-i.ry,new this(i)}}t(Bn,"type","Ellipse"),t(Bn,"cacheProperties",[...Ss,...In]),t(Bn,"ownDefaults",{rx:0,ry:0}),t(Bn,"ATTRIBUTE_NAMES",[...Ii,"cx","cy","rx","ry"]),J.setClass(Bn),J.setSVGClass(Bn);const $n={exactBoundingBox:!1};class Xn extends xi{static getDefaults(){return{...super.getDefaults(),...Xn.ownDefaults}}constructor(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[],s=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};super(),t(this,"strokeDiff",void 0),Object.assign(this,Xn.ownDefaults),this.setOptions(s),this.points=e;const{left:i,top:r}=s;this.initialized=!0,this.setBoundingBox(!0),"number"==typeof i&&this.set(O,i),"number"==typeof r&&this.set(k,r)}isOpen(){return!0}_projectStrokeOnPoints(t){return Oi(this.points,t,this.isOpen())}_calcDimensions(t){t={scaleX:this.scaleX,scaleY:this.scaleY,skewX:this.skewX,skewY:this.skewY,strokeLineCap:this.strokeLineCap,strokeLineJoin:this.strokeLineJoin,strokeMiterLimit:this.strokeMiterLimit,strokeUniform:this.strokeUniform,strokeWidth:this.strokeWidth,...t||{}};const e=this.exactBoundingBox?this._projectStrokeOnPoints(t).map(t=>t.projectedPoint):this.points;if(0===e.length)return{left:0,top:0,width:0,height:0,pathOffset:new it,strokeOffset:new it,strokeDiff:new it};const s=re(e),i=At({...t,scaleX:1,scaleY:1}),r=re(this.points.map(t=>xt(t,i,!0))),n=new it(this.scaleX,this.scaleY);let o=s.left+s.width/2,a=s.top+s.height/2;return this.exactBoundingBox&&(o-=a*Math.tan(vt(this.skewX)),a-=o*Math.tan(vt(this.skewY))),{...s,pathOffset:new it(o,a),strokeOffset:new it(r.left,r.top).subtract(new it(s.left,s.top)).multiply(n),strokeDiff:new it(s.width,s.height).subtract(new it(r.width,r.height)).multiply(n)}}_findCenterFromElement(){const t=re(this.points);return new it(t.left+t.width/2,t.top+t.height/2)}setDimensions(){this.setBoundingBox()}setBoundingBox(t){const{left:e,top:s,width:i,height:r,pathOffset:n,strokeOffset:o,strokeDiff:a}=this._calcDimensions();this.set({width:i,height:r,pathOffset:n,strokeOffset:o,strokeDiff:a}),t&&this.setPositionByOrigin(new it(e+i/2,s+r/2),T,T)}isStrokeAccountedForInDimensions(){return this.exactBoundingBox}_getNonTransformedDimensions(){return this.exactBoundingBox?new it(this.width,this.height):super._getNonTransformedDimensions()}_getTransformedDimensions(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};if(this.exactBoundingBox){let n;if(Object.keys(t).some(t=>this.strokeUniform||this.constructor.layoutProperties.includes(t))){var e,s;const{width:i,height:r}=this._calcDimensions(t);n=new it(null!==(e=t.width)&&void 0!==e?e:i,null!==(s=t.height)&&void 0!==s?s:r)}else{var i,r;n=new it(null!==(i=t.width)&&void 0!==i?i:this.width,null!==(r=t.height)&&void 0!==r?r:this.height)}return n.multiply(new it(t.scaleX||this.scaleX,t.scaleY||this.scaleY))}return super._getTransformedDimensions(t)}_set(t,e){const s=this.initialized&&this[t]!==e,i=super._set(t,e);return this.exactBoundingBox&&s&&((t===W||t===V)&&this.strokeUniform&&this.constructor.layoutProperties.includes("strokeUniform")||this.constructor.layoutProperties.includes(t))&&this.setDimensions(),i}toObject(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[];return{...super.toObject(t),points:this.points.map(t=>{let{x:e,y:s}=t;return{x:e,y:s}})}}_toSVG(){const t=[],e=this.pathOffset.x,i=this.pathOffset.y,r=s.NUM_FRACTION_DIGITS;for(let s=0,n=this.points.length;s\n`]}_render(t){const e=this.points.length,s=this.pathOffset.x,i=this.pathOffset.y;if(e&&!isNaN(this.points[e-1].y)){t.beginPath(),t.moveTo(this.points[0].x-s,this.points[0].y-i);for(let r=0;rvoid 0!==t);this._setStyleDeclaration(s,i,r)}getSelectionStyles(t,e,s){const i=[];for(let r=t;r<(e||t);r++)i.push(this.getStyleAtPosition(r,s));return i}getStyleAtPosition(t,e){const{lineIndex:s,charIndex:i}=this.get2DCursorLocation(t);return e?this.getCompleteStyleDeclaration(s,i):this._getStyleDeclaration(s,i)}setSelectionStyles(t,e,s){for(let i=e;i<(s||e);i++)this._extendStyles(i,t);this._forceClearCache=!0}_getStyleDeclaration(t,e){var s;const i=this.styles&&this.styles[t];return i&&null!==(s=i[e])&&void 0!==s?s:{}}getCompleteStyleDeclaration(t,e){return{...It(this,this.constructor._styleProperties),...this._getStyleDeclaration(t,e)}}_setStyleDeclaration(t,e,s){this.styles[t][e]=s}_deleteStyleDeclaration(t,e){delete this.styles[t][e]}_getLineStyle(t){return!!this.styles[t]}_setLineStyle(t){this.styles[t]={}}_deleteLineStyle(t){delete this.styles[t]}}t(Wn,"_styleProperties",ts);const Vn=/ +/g,Gn=/"/g;function zn(t,e,i,r,n){return`\t\t${function(t,e){let{left:i,top:r,width:n,height:o}=e,a=arguments.length>2&&void 0!==arguments[2]?arguments[2]:s.NUM_FRACTION_DIGITS;const h=He(H,t,!1),[l,c,u,d]=[i,r,n,o].map(t=>$t(t,a));return``}(t,{left:e,top:i,width:r,height:n})}\n`}let Hn;class Nn extends Wn{static getDefaults(){return{...super.getDefaults(),...Nn.ownDefaults}}constructor(e,s){super(),t(this,"__charBounds",[]),Object.assign(this,Nn.ownDefaults),this.setOptions(s),this.styles||(this.styles={}),this.text=e,this.initialized=!0,this.path&&this.setPathInfo(),this.initDimensions(),this.setCoords()}setPathInfo(){const t=this.path;t&&(t.segmentsInfo=Yr(t.path))}_splitText(){const t=this._splitTextIntoLines(this.text);return this.textLines=t.lines,this._textLines=t.graphemeLines,this._unwrappedTextLines=t._unwrappedLines,this._text=t.graphemeText,t}initDimensions(){this._splitText(),this._clearCache(),this.dirty=!0,this.path?(this.width=this.path.width,this.height=this.path.height):(this.width=this.calcTextWidth()||this.cursorWidth||this.MIN_TEXT_WIDTH,this.height=this.calcTextHeight()),this.textAlign.includes(ss)&&this.enlargeSpaces()}enlargeSpaces(){let t,e,s,i,r,n,o;for(let a=0,h=this._textLines.length;a`}_getCacheCanvasDimensions(){const t=super._getCacheCanvasDimensions(),e=this.fontSize;return t.width+=e*t.zoomX,t.height+=e*t.zoomY,t}_render(t){const e=this.path;e&&!e.isNotVisible()&&e._render(t),this._setTextStyles(t),this._renderTextLinesBackground(t),this._renderTextDecoration(t,"underline"),this._renderText(t),this._renderTextDecoration(t,"overline"),this._renderTextDecoration(t,"linethrough")}_renderText(t){this.paintFirst===N?(this._renderTextStroke(t),this._renderTextFill(t)):(this._renderTextFill(t),this._renderTextStroke(t))}_setTextStyles(t,e,s){if(t.textBaseline="alphabetic",this.path)switch(this.pathAlign){case T:t.textBaseline="middle";break;case"ascender":t.textBaseline=k;break;case"descender":t.textBaseline=D}t.font=this._getFontDeclaration(e,s)}calcTextWidth(){let t=this.getLineWidth(0);for(let e=1,s=this._textLines.length;et&&(t=s)}return t}_renderTextLine(t,e,s,i,r,n){this._renderChars(t,e,s,i,r,n)}_renderTextLinesBackground(t){if(!this.textBackgroundColor&&!this.styleHas("textBackgroundColor"))return;const e=t.fillStyle,s=this._getLeftOffset();let i=this._getTopOffset();for(let e=0,r=this._textLines.length;e=0:ie?t%=e:t<0&&(t+=e),this._setGraphemeOnPath(t,s),t+=s.kernedWidth}return{width:i,numOfSpaces:0}}_setGraphemeOnPath(t,e){const s=t+e.kernedWidth/2,i=this.path,r=Wr(i.path,s,i.segmentsInfo);e.renderLeft=r.x-i.pathOffset.x,e.renderTop=r.y-i.pathOffset.y,e.angle=r.angle+(this.pathSide===M?Math.PI:0)}_getGraphemeBox(t,e,s,i,r){const n=this.getCompleteStyleDeclaration(e,s),o=i?this.getCompleteStyleDeclaration(e,s-1):{},a=this._measureChar(t,n,i,o);let h,l=a.kernedWidth,c=a.width;0!==this.charSpacing&&(h=this._getWidthOfCharSpacing(),c+=h,l+=h);const u={width:c,left:0,height:n.fontSize,kernedWidth:l,deltaY:n.deltaY};if(s>0&&!r){const t=this.__charBounds[e][s-1];u.left=t.left+t.width+a.kernedWidth-a.width}return u}getHeightOfLine(t){if(this.__lineHeights[t])return this.__lineHeights[t];let e=this.getHeightOfChar(t,0);for(let s=1,i=this._textLines[t].length;s0){const e=this.fontSize*v/1e3;let s=i+d+g;"rtl"===this.direction&&(s=this.width-s-f),p&&m&&v&&(t.fillStyle=m,t.fillRect(s,C+a*S+b-o*e,f,e)),g=n.left,f=n.width,p=y,v=x,m=_,S=l,b=c}else f+=n.kernedWidth}let w=i+d+g;"rtl"===this.direction&&(w=this.width-w-f),t.fillStyle=_;const T=this.fontSize*x/1e3;y&&_&&x&&t.fillRect(w,C+a*S+b-o*T,f-n,T),s+=l}this._removeShadow(t)}_getFontDeclaration(){let{fontFamily:t=this.fontFamily,fontStyle:e=this.fontStyle,fontWeight:s=this.fontWeight,fontSize:i=this.fontSize}=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},r=arguments.length>1?arguments[1]:void 0;const n=t.includes("'")||t.includes('"')||t.includes(",")||Nn.genericFonts.includes(t.toLowerCase())?t:`"${t}"`;return[e,s,`${r?this.CACHE_FONT_SIZE:i}px`,n].join(" ")}render(t){this.visible&&(this.canvas&&this.canvas.skipOffscreen&&!this.group&&!this.isOnScreen()||(this._forceClearCache&&this.initDimensions(),super.render(t)))}graphemeSplit(t){return Ei(t)}_splitTextIntoLines(t){const e=t.split(this._reNewline),s=new Array(e.length),i=["\n"];let r=[];for(let t=0;t0&&void 0!==arguments[0]?arguments[0]:[];return{...super.toObject([...Ze,...t]),styles:Li(this.styles,this.text),...this.path?{path:this.path.toObject()}:{}}}set(t,e){const{textLayoutProperties:s}=this.constructor;super.set(t,e);let i=!1,r=!1;if("object"==typeof t)for(const e in t)"path"===e&&this.setPathInfo(),i=i||s.includes(e),r=r||"path"===e;else i=s.includes(t),r="path"===t;return r&&this.setPathInfo(),i&&this.initialized&&(this.initDimensions(),this.setCoords()),this}complexity(){return 1}static async fromElement(t,e,s){const i=or(t,Nn.ATTRIBUTE_NAMES,s),{textAnchor:r=O,textDecoration:n="",dx:o=0,dy:a=0,top:h=0,left:l=0,fontSize:c=b,strokeWidth:u=1,...d}={...e,...i},g=new this((t.textContent||"").replace(/^\s+|\s+$|\n+/g,"").replace(/\s+/g," "),{left:l+o,top:h+a,underline:n.includes("underline"),overline:n.includes("overline"),linethrough:n.includes("line-through"),strokeWidth:0,fontSize:c,...d}),f=g.getScaledHeight()/g.height,p=((g.height+g.strokeWidth)*g.lineHeight-g.height)*f,m=g.getScaledHeight()+p;let v=0;return r===T&&(v=g.getScaledWidth()/2),r===M&&(v=g.getScaledWidth()),g.set({left:g.left-v,top:g.top-(m-g.fontSize*(.07+g._fontSizeFraction))/g.lineHeight,strokeWidth:u}),g}static fromObject(t){return this._fromObject({...t,styles:Ri(t.styles||{},t.text)},{extraParam:"text"})}}t(Nn,"textLayoutProperties",Qe),t(Nn,"cacheProperties",[...Ss,...Ze]),t(Nn,"ownDefaults",es),t(Nn,"type","Text"),t(Nn,"genericFonts",["serif","sans-serif","monospace","cursive","fantasy","system-ui","ui-serif","ui-sans-serif","ui-monospace","ui-rounded","math","emoji","fangsong"]),t(Nn,"ATTRIBUTE_NAMES",Ii.concat("x","y","dx","dy","font-family","font-style","font-weight","font-size","letter-spacing","text-decoration","text-anchor")),_i(Nn,[class extends Ne{_toSVG(){const t=this._getSVGLeftTopOffsets(),e=this._getSVGTextAndBg(t.textTop,t.textLeft);return this._wrapSVGTextAndBg(e)}toSVG(t){const e=this._createBaseSVGMarkup(this._toSVG(),{reviver:t,noStyle:!0,withShadow:!0}),s=this.path;return s?e+s._createBaseSVGMarkup(s._toSVG(),{reviver:t,withShadow:!0,additionalTransform:Xt(this.calcOwnMatrix())}):e}_getSVGLeftTopOffsets(){return{textLeft:-this.width/2,textTop:-this.height/2,lineTop:this.getHeightOfLine(0)}}_wrapSVGTextAndBg(t){let{textBgRects:e,textSpans:s}=t;const i=this.getSvgTextDecoration(this);return[e.join(""),'\t\t",s.join(""),"\n"]}_getSVGTextAndBg(t,e){const s=[],i=[];let r,n=t;this.backgroundColor&&i.push(...zn(this.backgroundColor,-this.width/2,-this.height/2,this.width,this.height));for(let t=0,o=this._textLines.length;t${Di(t)}`}_setSVGTextLineText(t,e,s,i){const r=this.getHeightOfLine(e),n=this.textAlign.includes(ss),o=this._textLines[e];let a,h,l,c,u,d="",g=0;i+=r*(1-this._fontSizeFraction)/this.lineHeight;for(let r=0,f=o.length-1;r<=f;r++)u=r===f||this.charSpacing||this.path,d+=o[r],l=this.__charBounds[e][r],0===g?(s+=l.kernedWidth-l.width,g+=l.width):g+=l.kernedWidth,n&&!u&&this._reSpaceAndTab.test(o[r])&&(u=!0),u||(a=a||this.getCompleteStyleDeclaration(e,r),h=this.getCompleteStyleDeclaration(e,r+1),u=Fi(a,h,!0)),u&&(c=this._getStyleDeclaration(e,r),t.push(this._createTextCharSpan(d,c,s,i,l)),d="",a=h,"rtl"===this.direction?s-=g:s+=g,g=0)}_setSVGTextLineBg(t,e,s,i){const r=this._textLines[e],n=this.getHeightOfLine(e)/this.lineHeight;let o,a=0,h=0,l=this.getValueOfPropertyAt(e,0,"textBackgroundColor");for(let c=0;ct[e.replace("-","")]).join(" ")}}]),J.setClass(Nn),J.setSVGClass(Nn);class Un{constructor(e){t(this,"target",void 0),t(this,"__mouseDownInPlace",!1),t(this,"__dragStartFired",!1),t(this,"__isDraggingOver",!1),t(this,"__dragStartSelection",void 0),t(this,"__dragImageDisposer",void 0),t(this,"_dispose",void 0),this.target=e;const s=[this.target.on("dragenter",this.dragEnterHandler.bind(this)),this.target.on("dragover",this.dragOverHandler.bind(this)),this.target.on("dragleave",this.dragLeaveHandler.bind(this)),this.target.on("dragend",this.dragEndHandler.bind(this)),this.target.on("drop",this.dropHandler.bind(this))];this._dispose=()=>{s.forEach(t=>t()),this._dispose=void 0}}isPointerOverSelection(t){const e=this.target,s=e.getSelectionStartFromPointer(t);return e.isEditing&&s>=e.selectionStart&&s<=e.selectionEnd&&e.selectionStart{_.remove()},Ht(t.target||this.target.hiddenTextarea).body.appendChild(_),null===(s=t.dataTransfer)||void 0===s||s.setDragImage(_,p.x,p.y)}onDragStart(t){this.__dragStartFired=!0;const e=this.target,s=this.isActive();if(s&&t.dataTransfer){const s=this.__dragStartSelection={selectionStart:e.selectionStart,selectionEnd:e.selectionEnd},i=e._text.slice(s.selectionStart,s.selectionEnd).join(""),r={text:e.text,value:i,...s};t.dataTransfer.setData("text/plain",i),t.dataTransfer.setData("application/fabric",JSON.stringify({value:i,styles:e.getSelectionStyles(s.selectionStart,s.selectionEnd,!0)})),t.dataTransfer.effectAllowed="copyMove",this.setDragImage(t,r)}return e.abortCursorAnimation(),s}canDrop(t){if(this.target.editable&&!this.target.getActiveControl()&&!t.defaultPrevented){if(this.isActive()&&this.__dragStartSelection){const e=this.target.getSelectionStartFromPointer(t),s=this.__dragStartSelection;return es.selectionEnd}return!0}return!1}targetCanDrop(t){return this.target.canDrop(t)}dragEnterHandler(t){let{e:e}=t;const s=this.targetCanDrop(e);!this.__isDraggingOver&&s&&(this.__isDraggingOver=!0)}dragOverHandler(t){const{e:e}=t,s=this.targetCanDrop(e);!this.__isDraggingOver&&s?this.__isDraggingOver=!0:this.__isDraggingOver&&!s&&(this.__isDraggingOver=!1),this.__isDraggingOver&&(e.preventDefault(),t.canDrop=!0,t.dropTarget=this.target)}dragLeaveHandler(){(this.__isDraggingOver||this.isActive())&&(this.__isDraggingOver=!1)}dropHandler(t){var e;const{e:s}=t,i=s.defaultPrevented;this.__isDraggingOver=!1,s.preventDefault();let r=null===(e=s.dataTransfer)||void 0===e?void 0:e.getData("text/plain");if(r&&!i){const e=this.target,i=e.canvas;let n=e.getSelectionStartFromPointer(s);const{styles:o}=s.dataTransfer.types.includes("application/fabric")?JSON.parse(s.dataTransfer.getData("application/fabric")):{},a=r[Math.max(0,r.length-1)],h=0;if(this.__dragStartSelection){const t=this.__dragStartSelection.selectionStart,s=this.__dragStartSelection.selectionEnd;n>t&&n<=s?n=t:n>s&&(n-=s-t),e.removeChars(t,s),delete this.__dragStartSelection}e._reNewline.test(a)&&(e._reNewline.test(e._text[n])||n===e._text.length)&&(r=r.trimEnd()),t.didDrop=!0,t.dropTarget=e,e.insertChars(r,o,n),i.setActiveObject(e),e.enterEditing(s),e.selectionStart=Math.min(n+h,e._text.length),e.selectionEnd=Math.min(e.selectionStart+r.length,e._text.length),e.hiddenTextarea.value=e.text,e._updateTextarea(),e.hiddenTextarea.focus(),e.fire(X,{index:n+h,action:"drop"}),i.fire("text:changed",{target:e}),i.contextTopDirty=!0,i.requestRenderAll()}}dragEndHandler(t){let{e:e}=t;if(this.isActive()&&this.__dragStartFired&&this.__dragStartSelection){var s;const t=this.target,i=this.target.canvas,{selectionStart:r,selectionEnd:n}=this.__dragStartSelection,o=(null===(s=e.dataTransfer)||void 0===s?void 0:s.dropEffect)||E;o===E?(t.selectionStart=r,t.selectionEnd=n,t._updateTextarea(),t.hiddenTextarea.focus()):(t.clearContextTop(),"move"===o&&(t.removeChars(r,n),t.selectionStart=t.selectionEnd=r,t.hiddenTextarea&&(t.hiddenTextarea.value=t.text),t._updateTextarea(),t.fire(X,{index:r,action:"dragend"}),i.fire("text:changed",{target:t}),i.requestRenderAll()),t.exitEditing())}this.__dragImageDisposer&&this.__dragImageDisposer(),delete this.__dragImageDisposer,delete this.__dragStartSelection,this.__isDraggingOver=!1}dispose(){this._dispose&&this._dispose()}}const qn=/[ \n\.,;!\?\-]/;class Kn extends Nn{constructor(){super(...arguments),t(this,"_currentCursorOpacity",1)}initBehavior(){this._tick=this._tick.bind(this),this._onTickComplete=this._onTickComplete.bind(this),this.updateSelectionOnMouseMove=this.updateSelectionOnMouseMove.bind(this)}onDeselect(t){return this.isEditing&&this.exitEditing(),this.selected=!1,super.onDeselect(t)}_animateCursor(t){let{toValue:e,duration:s,delay:i,onComplete:r}=t;return Is({startValue:this._currentCursorOpacity,endValue:e,duration:s,delay:i,onComplete:r,abort:()=>!this.canvas||this.selectionStart!==this.selectionEnd,onChange:t=>{this._currentCursorOpacity=t,this.renderCursorOrSelection()}})}_tick(t){this._currentTickState=this._animateCursor({toValue:0,duration:this.cursorDuration/2,delay:Math.max(t||0,100),onComplete:this._onTickComplete})}_onTickComplete(){var t;null===(t=this._currentTickCompleteState)||void 0===t||t.abort(),this._currentTickCompleteState=this._animateCursor({toValue:1,duration:this.cursorDuration,onComplete:this._tick})}initDelayedCursor(t){this.abortCursorAnimation(),this._tick(t?0:this.cursorDelay)}abortCursorAnimation(){let t=!1;[this._currentTickState,this._currentTickCompleteState].forEach(e=>{e&&!e.isDone()&&(t=!0,e.abort())}),this._currentCursorOpacity=1,t&&this.clearContextTop()}restartCursorIfNeeded(){[this._currentTickState,this._currentTickCompleteState].some(t=>!t||t.isDone())&&this.initDelayedCursor()}selectAll(){return this.selectionStart=0,this.selectionEnd=this._text.length,this._fireSelectionChanged(),this._updateTextarea(),this}cmdAll(){this.selectAll(),this.renderCursorOrSelection()}getSelectedText(){return this._text.slice(this.selectionStart,this.selectionEnd).join("")}findWordBoundaryLeft(t){let e=0,s=t-1;if(this._reSpace.test(this._text[s]))for(;this._reSpace.test(this._text[s]);)e++,s--;for(;/\S/.test(this._text[s])&&s>-1;)e++,s--;return t-e}findWordBoundaryRight(t){let e=0,s=t;if(this._reSpace.test(this._text[s]))for(;this._reSpace.test(this._text[s]);)e++,s++;for(;/\S/.test(this._text[s])&&s-1;)e++,s--;return t-e}findLineBoundaryRight(t){let e=0,s=t;for(;!/\n/.test(this._text[s])&&s0&&this._reSpace.test(s[t])&&(-1===e||!P.test(s[t-1]))?t-1:t,r=s[i];for(;i>0&&ithis.__selectionStartOnMouseDown?(this.selectionStart=this.__selectionStartOnMouseDown,this.selectionEnd=s):(this.selectionStart=s,this.selectionEnd=this.__selectionStartOnMouseDown),this.selectionStart===i&&this.selectionEnd===r||(this._fireSelectionChanged(),this._updateTextarea(),this.renderCursorOrSelection()))}_setEditingProps(){this.hoverCursor="text",this.canvas&&(this.canvas.defaultCursor=this.canvas.moveCursor="text"),this.borderColor=this.editingBorderColor,this.hasControls=this.selectable=!1,this.lockMovementX=this.lockMovementY=!0}fromStringToGraphemeSelection(t,e,s){const i=s.slice(0,t),r=this.graphemeSplit(i).length;if(t===e)return{selectionStart:r,selectionEnd:r};const n=s.slice(t,e);return{selectionStart:r,selectionEnd:r+this.graphemeSplit(n).length}}fromGraphemeToStringSelection(t,e,s){const i=s.slice(0,t).join("").length;if(t===e)return{selectionStart:i,selectionEnd:i};return{selectionStart:i,selectionEnd:i+s.slice(t,e).join("").length}}_updateTextarea(){if(this.cursorOffsetCache={},this.hiddenTextarea){if(!this.inCompositionMode){const t=this.fromGraphemeToStringSelection(this.selectionStart,this.selectionEnd,this._text);this.hiddenTextarea.selectionStart=t.selectionStart,this.hiddenTextarea.selectionEnd=t.selectionEnd}this.updateTextareaPosition()}}updateFromTextArea(){if(!this.hiddenTextarea)return;this.cursorOffsetCache={};const t=this.hiddenTextarea;this.text=t.value,this.set("dirty",!0),this.initDimensions(),this.setCoords();const e=this.fromStringToGraphemeSelection(t.selectionStart,t.selectionEnd,t.value);this.selectionEnd=this.selectionStart=e.selectionEnd,this.inCompositionMode||(this.selectionStart=e.selectionStart),this.updateTextareaPosition()}updateTextareaPosition(){if(this.selectionStart===this.selectionEnd){const t=this._calcTextareaPosition();this.hiddenTextarea.style.left=t.left,this.hiddenTextarea.style.top=t.top}}_calcTextareaPosition(){if(!this.canvas)return{left:"1px",top:"1px"};const t=this.inCompositionMode?this.compositionStart:this.selectionStart,e=this._getCursorBoundaries(t),s=this.get2DCursorLocation(t),i=s.lineIndex,r=s.charIndex,n=this.getValueOfPropertyAt(i,r,"fontSize")*this.lineHeight,o=e.leftOffset,a=this.getCanvasRetinaScaling(),h=this.canvas.upperCanvasEl,l=h.width/a,c=h.height/a,u=l-n,d=c-n,g=new it(e.left+o,e.top+e.topOffset+n).transform(this.calcTransformMatrix()).transform(this.canvas.viewportTransform).multiply(new it(h.clientWidth/l,h.clientHeight/c));return g.x<0&&(g.x=0),g.x>u&&(g.x=u),g.y<0&&(g.y=0),g.y>d&&(g.y=d),g.x+=this.canvas._offset.left,g.y+=this.canvas._offset.top,{left:`${g.x}px`,top:`${g.y}px`,fontSize:`${n}px`,charHeight:n}}_saveEditingProps(){this._savedProps={hasControls:this.hasControls,borderColor:this.borderColor,lockMovementX:this.lockMovementX,lockMovementY:this.lockMovementY,hoverCursor:this.hoverCursor,selectable:this.selectable,defaultCursor:this.canvas&&this.canvas.defaultCursor,moveCursor:this.canvas&&this.canvas.moveCursor}}_restoreEditingProps(){this._savedProps&&(this.hoverCursor=this._savedProps.hoverCursor,this.hasControls=this._savedProps.hasControls,this.borderColor=this._savedProps.borderColor,this.selectable=this._savedProps.selectable,this.lockMovementX=this._savedProps.lockMovementX,this.lockMovementY=this._savedProps.lockMovementY,this.canvas&&(this.canvas.defaultCursor=this._savedProps.defaultCursor||this.canvas.defaultCursor,this.canvas.moveCursor=this._savedProps.moveCursor||this.canvas.moveCursor),delete this._savedProps)}exitEditingImpl(){const t=this.hiddenTextarea;this.selected=!1,this.isEditing=!1,t&&(t.blur&&t.blur(),t.parentNode&&t.parentNode.removeChild(t)),this.hiddenTextarea=null,this.abortCursorAnimation(),this.selectionStart!==this.selectionEnd&&this.clearContextTop(),this.selectionEnd=this.selectionStart,this._restoreEditingProps(),this._forceClearCache&&(this.initDimensions(),this.setCoords())}exitEditing(){const t=this._textBeforeEdit!==this.text;return this.exitEditingImpl(),this.fire("editing:exited"),t&&this.fire(U),this.canvas&&(this.canvas.fire("text:editing:exited",{target:this}),t&&this.canvas.fire("object:modified",{target:this})),this}_removeExtraneousStyles(){for(const t in this.styles)this._textLines[t]||delete this.styles[t]}removeStyleFromTo(t,e){const{lineIndex:s,charIndex:i}=this.get2DCursorLocation(t,!0),{lineIndex:r,charIndex:n}=this.get2DCursorLocation(e,!0);if(s!==r){if(this.styles[s])for(let t=i;t=n&&(t[s-e]=t[i],delete t[i])}}}shiftLineStyles(t,e){const s=Object.assign({},this.styles);for(const i in this.styles){const r=parseInt(i,10);r>t&&(this.styles[r+e]=s[r],s[r-e]||delete this.styles[r])}}insertNewlineStyleObject(t,e,s,i){const r={},n=this._unwrappedTextLines[t].length,o=n===e;let a=!1;s||(s=1),this.shiftLineStyles(t,s);const h=this.styles[t]?this.styles[t][0===e?e:e-1]:void 0;for(const s in this.styles[t]){const i=parseInt(s,10);i>=e&&(a=!0,r[i-e]=this.styles[t][s],o&&0===e||delete this.styles[t][s])}let l=!1;for(a&&!o&&(this.styles[t+s]=r,l=!0),(l||n>e)&&s--;s>0;)i&&i[s-1]?this.styles[t+s]={0:{...i[s-1]}}:h?this.styles[t+s]={0:{...h}}:delete this.styles[t+s],s--;this._forceClearCache=!0}insertCharStyleObject(t,e,s,i){this.styles||(this.styles={});const r=this.styles[t],n=r?{...r}:{};s||(s=1);for(const t in n){const i=parseInt(t,10);i>=e&&(r[i+s]=n[i],n[i-s]||delete r[i])}if(this._forceClearCache=!0,i){for(;s--;)Object.keys(i[s]).length&&(this.styles[t]||(this.styles[t]={}),this.styles[t][e+s]={...i[s]});return}if(!r)return;const o=r[e?e-1:1];for(;o&&s--;)this.styles[t][e+s]={...o}}insertNewStyleBlock(t,e,s){const i=this.get2DCursorLocation(e,!0),r=[0];let n,o=0;for(let e=0;e0&&(this.insertCharStyleObject(i.lineIndex,i.charIndex,r[0],s),s=s&&s.slice(r[0]+1)),o&&this.insertNewlineStyleObject(i.lineIndex,i.charIndex+r[0],o),n=1;n0?this.insertCharStyleObject(i.lineIndex+n,0,r[n],s):s&&this.styles[i.lineIndex+n]&&s[0]&&(this.styles[i.lineIndex+n][0]=s[0]),s=s&&s.slice(r[n]+1);r[n]>0&&this.insertCharStyleObject(i.lineIndex+n,0,r[n],s)}removeChars(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:t+1;this.removeStyleFromTo(t,e),this._text.splice(t,e-t),this.text=this._text.join(""),this.set("dirty",!0),this.initDimensions(),this.setCoords(),this._removeExtraneousStyles()}insertChars(t,e,s){let i=arguments.length>3&&void 0!==arguments[3]?arguments[3]:s;i>s&&this.removeStyleFromTo(s,i);const r=this.graphemeSplit(t);this.insertNewStyleBlock(r,s,e),this._text=[...this._text.slice(0,s),...r,...this._text.slice(i)],this.text=this._text.join(""),this.set("dirty",!0),this.initDimensions(),this.setCoords(),this._removeExtraneousStyles()}setSelectionStartEndWithShift(t,e,s){s<=t?(e===t?this._selectionDirection=O:this._selectionDirection===M&&(this._selectionDirection=O,this.selectionEnd=t),this.selectionStart=s):s>t&&s{let[s,i]=t;return e.setAttribute(s,i)});const{top:s,left:i,fontSize:r}=this._calcTextareaPosition();e.style.cssText=`position: absolute; top: ${s}; left: ${i}; z-index: -999; opacity: 0; width: 1px; height: 1px; font-size: 1px; padding-top: ${r};`,(this.hiddenTextareaContainer||t.body).appendChild(e),Object.entries({blur:"blur",keydown:"onKeyDown",keyup:"onKeyUp",input:"onInput",copy:"copy",cut:"copy",paste:"paste",compositionstart:"onCompositionStart",compositionupdate:"onCompositionUpdate",compositionend:"onCompositionEnd"}).map(t=>{let[s,i]=t;return e.addEventListener(s,this[i].bind(this))}),this.hiddenTextarea=e}blur(){this.abortCursorAnimation()}onKeyDown(t){if(!this.isEditing)return;const e="rtl"===this.direction?this.keysMapRtl:this.keysMap;if(t.keyCode in e)this[e[t.keyCode]](t);else{if(!(t.keyCode in this.ctrlKeysMapDown)||!t.ctrlKey&&!t.metaKey)return;this[this.ctrlKeysMapDown[t.keyCode]](t)}t.stopImmediatePropagation(),t.preventDefault(),t.keyCode>=33&&t.keyCode<=40?(this.inCompositionMode=!1,this.clearContextTop(),this.renderCursorOrSelection()):this.canvas&&this.canvas.requestRenderAll()}onKeyUp(t){!this.isEditing||this._copyDone||this.inCompositionMode?this._copyDone=!1:t.keyCode in this.ctrlKeysMapUp&&(t.ctrlKey||t.metaKey)&&(this[this.ctrlKeysMapUp[t.keyCode]](t),t.stopImmediatePropagation(),t.preventDefault(),this.canvas&&this.canvas.requestRenderAll())}onInput(t){const e=this.fromPaste,{value:i,selectionStart:r,selectionEnd:n}=this.hiddenTextarea;if(this.fromPaste=!1,t&&t.stopPropagation(),!this.isEditing)return;const o=()=>{this.updateFromTextArea(),this.fire(X),this.canvas&&(this.canvas.fire("text:changed",{target:this}),this.canvas.requestRenderAll())};if(""===this.hiddenTextarea.value)return this.styles={},void o();const a=this._splitTextIntoLines(i).graphemeText,h=this._text.length,l=a.length,c=this.selectionStart,d=this.selectionEnd,g=c!==d;let f,p,m,v,y=l-h;const _=this.fromStringToGraphemeSelection(r,n,i),x=c>_.selectionStart;g?(p=this._text.slice(c,d),y+=d-c):lf[0])),g?(m=c,v=d):x?(m=d-p.length,v=d):(m=d,v=d+p.length),this.removeStyleFromTo(m,v)),C.length){const{copyPasteData:t}=u();e&&C.join("")===t.copiedText&&!s.disableStyleCopyPaste&&(f=t.copiedTextStyle),this.insertNewStyleBlock(C,c,f)}o()}onCompositionStart(){this.inCompositionMode=!0}onCompositionEnd(){this.inCompositionMode=!1}onCompositionUpdate(t){let{target:e}=t;const{selectionStart:s,selectionEnd:i}=e;this.compositionStart=s,this.compositionEnd=i,this.updateTextareaPosition()}copy(){if(this.selectionStart===this.selectionEnd)return;const{copyPasteData:t}=u();t.copiedText=this.getSelectedText(),s.disableStyleCopyPaste?t.copiedTextStyle=void 0:t.copiedTextStyle=this.getSelectionStyles(this.selectionStart,this.selectionEnd,!0),this._copyDone=!0}paste(){this.fromPaste=!0}_getWidthBeforeCursor(t,e){let s,i=this._getLineLeftOffset(t);return e>0&&(s=this.__charBounds[t][e-1],i+=s.left+s.width),i}getDownCursorOffset(t,e){const s=this._getSelectionForOffset(t,e),i=this.get2DCursorLocation(s),r=i.lineIndex;if(r===this._textLines.length-1||t.metaKey||34===t.keyCode)return this._text.length-s;const n=i.charIndex,o=this._getWidthBeforeCursor(r,n),a=this._getIndexOnLine(r+1,o);return this._textLines[r].slice(n).length+a+1+this.missingNewlineOffset(r)}_getSelectionForOffset(t,e){return t.shiftKey&&this.selectionStart!==this.selectionEnd&&e?this.selectionEnd:this.selectionStart}getUpCursorOffset(t,e){const s=this._getSelectionForOffset(t,e),i=this.get2DCursorLocation(s),r=i.lineIndex;if(0===r||t.metaKey||33===t.keyCode)return-s;const n=i.charIndex,o=this._getWidthBeforeCursor(r,n),a=this._getIndexOnLine(r-1,o),h=this._textLines[r].slice(0,n),l=this.missingNewlineOffset(r-1);return-this._textLines[r-1].length+a-h.length+(1-l)}_getIndexOnLine(t,e){const s=this._textLines[t];let i,r,n=this._getLineLeftOffset(t),o=0;for(let a=0,h=s.length;ae){r=!0;const t=n-i,s=n,h=Math.abs(t-e);o=Math.abs(s-e)=this._text.length&&this.selectionEnd>=this._text.length||this._moveCursorUpOrDown("Down",t)}moveCursorUp(t){0===this.selectionStart&&0===this.selectionEnd||this._moveCursorUpOrDown("Up",t)}_moveCursorUpOrDown(t,e){const s=this[`get${t}CursorOffset`](e,this._selectionDirection===M);if(e.shiftKey?this.moveCursorWithShift(s):this.moveCursorWithoutShift(s),0!==s){const t=this.text.length;this.selectionStart=xs(0,this.selectionStart,t),this.selectionEnd=xs(0,this.selectionEnd,t),this.abortCursorAnimation(),this.initDelayedCursor(),this._fireSelectionChanged(),this._updateTextarea()}}moveCursorWithShift(t){const e=this._selectionDirection===O?this.selectionStart+t:this.selectionEnd+t;return this.setSelectionStartEndWithShift(this.selectionStart,this.selectionEnd,e),0!==t}moveCursorWithoutShift(t){return t<0?(this.selectionStart+=t,this.selectionEnd=this.selectionStart):(this.selectionEnd+=t,this.selectionStart=this.selectionEnd),0!==t}moveCursorLeft(t){0===this.selectionStart&&0===this.selectionEnd||this._moveCursorLeftOrRight("Left",t)}_move(t,e,s){let i;if(t.altKey)i=this[`findWordBoundary${s}`](this[e]);else{if(!t.metaKey&&35!==t.keyCode&&36!==t.keyCode)return this[e]+="Left"===s?-1:1,!0;i=this[`findLineBoundary${s}`](this[e])}return void 0!==i&&this[e]!==i&&(this[e]=i,!0)}_moveLeft(t,e){return this._move(t,e,"Left")}_moveRight(t,e){return this._move(t,e,"Right")}moveCursorLeftWithoutShift(t){let e=!0;return this._selectionDirection=O,this.selectionEnd===this.selectionStart&&0!==this.selectionStart&&(e=this._moveLeft(t,"selectionStart")),this.selectionEnd=this.selectionStart,e}moveCursorLeftWithShift(t){return this._selectionDirection===M&&this.selectionStart!==this.selectionEnd?this._moveLeft(t,"selectionEnd"):0!==this.selectionStart?(this._selectionDirection=O,this._moveLeft(t,"selectionStart")):void 0}moveCursorRight(t){this.selectionStart>=this._text.length&&this.selectionEnd>=this._text.length||this._moveCursorLeftOrRight("Right",t)}_moveCursorLeftOrRight(t,e){const s=`moveCursor${t}${e.shiftKey?"WithShift":"WithoutShift"}`;this._currentCursorOpacity=1,this[s](e)&&(this.abortCursorAnimation(),this.initDelayedCursor(),this._fireSelectionChanged(),this._updateTextarea())}moveCursorRightWithShift(t){return this._selectionDirection===O&&this.selectionStart!==this.selectionEnd?this._moveRight(t,"selectionStart"):this.selectionEnd!==this._text.length?(this._selectionDirection=M,this._moveRight(t,"selectionEnd")):void 0}moveCursorRightWithoutShift(t){let e=!0;return this._selectionDirection=M,this.selectionStart===this.selectionEnd?(e=this._moveRight(t,"selectionStart"),this.selectionEnd=this.selectionStart):this.selectionStart=this.selectionEnd,e}}const Qn=t=>!!t.button;class Zn extends Jn{constructor(){super(...arguments),t(this,"draggableTextDelegate",void 0)}initBehavior(){this.on("mousedown",this._mouseDownHandler),this.on("mouseup",this.mouseUpHandler),this.on("mousedblclick",this.doubleClickHandler),this.on("mousetripleclick",this.tripleClickHandler),this.draggableTextDelegate=new Un(this),super.initBehavior()}shouldStartDragging(){return this.draggableTextDelegate.isActive()}onDragStart(t){return this.draggableTextDelegate.onDragStart(t)}canDrop(t){return this.draggableTextDelegate.canDrop(t)}doubleClickHandler(t){this.isEditing&&(this.selectWord(this.getSelectionStartFromPointer(t.e)),this.renderCursorOrSelection())}tripleClickHandler(t){this.isEditing&&(this.selectLine(this.getSelectionStartFromPointer(t.e)),this.renderCursorOrSelection())}_mouseDownHandler(t){let{e:e,alreadySelected:s}=t;this.canvas&&this.editable&&!Qn(e)&&!this.getActiveControl()&&(this.draggableTextDelegate.start(e)||(this.canvas.textEditingManager.register(this),s&&(this.inCompositionMode=!1,this.setCursorByClick(e)),this.isEditing&&(this.__selectionStartOnMouseDown=this.selectionStart,this.selectionStart===this.selectionEnd&&this.abortCursorAnimation(),this.renderCursorOrSelection()),this.selected||(this.selected=s||this.isEditing)))}mouseUpHandler(t){let{e:e,transform:s}=t;const i=this.draggableTextDelegate.end(e);if(this.canvas){this.canvas.textEditingManager.unregister(this);const t=this.canvas._activeObject;if(t&&t!==this)return}!this.editable||this.group&&!this.group.interactive||s&&s.actionPerformed||Qn(e)||i||this.selected&&!this.getActiveControl()&&(this.enterEditing(e),this.selectionStart===this.selectionEnd?this.initDelayedCursor(!0):this.renderCursorOrSelection())}setCursorByClick(t){const e=this.getSelectionStartFromPointer(t),s=this.selectionStart,i=this.selectionEnd;t.shiftKey?this.setSelectionStartEndWithShift(s,i,e):(this.selectionStart=e,this.selectionEnd=e),this.isEditing&&(this._fireSelectionChanged(),this._updateTextarea())}getSelectionStartFromPointer(t){const e=this.canvas.getScenePoint(t).transform(Ct(this.calcTransformMatrix())).add(new it(-this._getLeftOffset(),-this._getTopOffset()));let s=0,i=0,r=0;for(let t=0;t0&&(i+=this._textLines[t-1].length+this.missingNewlineOffset(t-1));let n=Math.abs(this._getLineLeftOffset(r));const o=this._textLines[r].length,a=this.__charBounds[r];for(let t=0;t{const s=e.getRetinaScaling();t.setTransform(s,0,0,s,0,0);const i=e.viewportTransform;t.transform(i[0],i[1],i[2],i[3],i[4],i[5])},oo={selectionStart:0,selectionEnd:0,selectionColor:"rgba(17,119,255,0.3)",isEditing:!1,editable:!0,editingBorderColor:"rgba(102,153,255,0.25)",cursorWidth:2,cursorColor:"",cursorDelay:1e3,cursorDuration:600,caching:!0,hiddenTextareaContainer:null,keysMap:{9:ro,27:ro,33:to,34:eo,35:io,36:so,37:so,38:to,39:io,40:eo},keysMapRtl:{9:ro,27:ro,33:to,34:eo,35:so,36:io,37:io,38:to,39:so,40:eo},ctrlKeysMapDown:{65:"cmdAll"},ctrlKeysMapUp:{67:"copy",88:"cut"},_selectionDirection:null,_reSpace:/\s|\r?\n/,inCompositionMode:!1};class ao extends Zn{static getDefaults(){return{...super.getDefaults(),...ao.ownDefaults}}get type(){const t=super.type;return"itext"===t?"i-text":t}constructor(t,e){super(t,{...ao.ownDefaults,...e}),this.initBehavior()}_set(t,e){return this.isEditing&&this._savedProps&&t in this._savedProps?(this._savedProps[t]=e,this):("canvas"===t&&(this.canvas instanceof ln&&this.canvas.textEditingManager.remove(this),e instanceof ln&&e.textEditingManager.add(this)),super._set(t,e))}setSelectionStart(t){t=Math.max(t,0),this._updateAndFire("selectionStart",t)}setSelectionEnd(t){t=Math.min(t,this.text.length),this._updateAndFire("selectionEnd",t)}_updateAndFire(t,e){this[t]!==e&&(this._fireSelectionChanged(),this[t]=e),this._updateTextarea()}_fireSelectionChanged(){this.fire("selection:changed"),this.canvas&&this.canvas.fire("text:selection:changed",{target:this})}initDimensions(){this.isEditing&&this.initDelayedCursor(),super.initDimensions()}getSelectionStyles(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.selectionStart||0,e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:this.selectionEnd,s=arguments.length>2?arguments[2]:void 0;return super.getSelectionStyles(t,e,s)}setSelectionStyles(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:this.selectionStart||0,s=arguments.length>2&&void 0!==arguments[2]?arguments[2]:this.selectionEnd;return super.setSelectionStyles(t,e,s)}get2DCursorLocation(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.selectionStart,e=arguments.length>1?arguments[1]:void 0;return super.get2DCursorLocation(t,e)}render(t){super.render(t),this.cursorOffsetCache={},this.renderCursorOrSelection()}toCanvasElement(t){const e=this.isEditing;this.isEditing=!1;const s=super.toCanvasElement(t);return this.isEditing=e,s}renderCursorOrSelection(){if(!this.isEditing||!this.canvas)return;const t=this.clearContextTop(!0);if(!t)return;const e=this._getCursorBoundaries(),s=this.findAncestorsWithClipPath(),i=s.length>0;let r,n=t;if(i){r=ft(t.canvas),n=r.getContext("2d"),no(n,this.canvas);const e=this.calcTransformMatrix();n.transform(e[0],e[1],e[2],e[3],e[4],e[5])}if(this.selectionStart!==this.selectionEnd||this.inCompositionMode?this.renderSelection(n,e):this.renderCursor(n,e),i)for(const e of s){const s=e.clipPath,i=ft(t.canvas),r=i.getContext("2d");if(no(r,this.canvas),!s.absolutePositioned){const t=e.calcTransformMatrix();r.transform(t[0],t[1],t[2],t[3],t[4],t[5])}s.transform(r),s.drawObject(r,!0,{}),this.drawClipPathOnCache(n,s,i)}i&&(t.setTransform(1,0,0,1,0,0),t.drawImage(r,0,0)),this.canvas.contextTopDirty=!0,t.restore()}findAncestorsWithClipPath(){const t=[];let e=this;for(;e;)e.clipPath&&t.push(e),e=e.parent;return t}_getCursorBoundaries(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.selectionStart,e=arguments.length>1?arguments[1]:void 0;const s=this._getLeftOffset(),i=this._getTopOffset(),r=this._getCursorBoundariesOffsets(t,e);return{left:s,top:i,leftOffset:r.left,topOffset:r.top}}_getCursorBoundariesOffsets(t,e){return e?this.__getCursorBoundariesOffsets(t):this.cursorOffsetCache&&"top"in this.cursorOffsetCache?this.cursorOffsetCache:this.cursorOffsetCache=this.__getCursorBoundariesOffsets(t)}__getCursorBoundariesOffsets(t){let e=0,s=0;const{charIndex:i,lineIndex:r}=this.get2DCursorLocation(t);for(let t=0;t0?s:0)};return"rtl"===this.direction&&(this.textAlign===M||this.textAlign===ss||this.textAlign===rs?a.left*=-1:this.textAlign===O||this.textAlign===is?a.left=n-(s>0?s:0):this.textAlign!==T&&this.textAlign!==ns||(a.left=n-(s>0?s:0))),a}renderCursorAt(t){this._renderCursor(this.canvas.contextTop,this._getCursorBoundaries(t,!0),t)}renderCursor(t,e){this._renderCursor(t,e,this.selectionStart)}getCursorRenderingData(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.selectionStart,e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:this._getCursorBoundaries(t);const s=this.get2DCursorLocation(t),i=s.lineIndex,r=s.charIndex>0?s.charIndex-1:0,n=this.getValueOfPropertyAt(i,r,"fontSize"),o=this.getObjectScaling().x*this.canvas.getZoom(),a=this.cursorWidth/o,h=this.getValueOfPropertyAt(i,r,"deltaY"),l=e.topOffset+(1-this._fontSizeFraction)*this.getHeightOfLine(i)/this.lineHeight-n*(1-this._fontSizeFraction);return{color:this.cursorColor||this.getValueOfPropertyAt(i,r,"fill"),opacity:this._currentCursorOpacity,left:e.left+e.leftOffset-a/2,top:l+e.top+h,width:a,height:n}}_renderCursor(t,e,s){const{color:i,opacity:r,left:n,top:o,width:a,height:h}=this.getCursorRenderingData(s,e);t.fillStyle=i,t.globalAlpha=r,t.fillRect(n,o,a,h)}renderSelection(t,e){const s={selectionStart:this.inCompositionMode?this.hiddenTextarea.selectionStart:this.selectionStart,selectionEnd:this.inCompositionMode?this.hiddenTextarea.selectionEnd:this.selectionEnd};this._renderSelection(t,s,e)}renderDragSourceEffect(){const t=this.draggableTextDelegate.getDragStartSelection();this._renderSelection(this.canvas.contextTop,t,this._getCursorBoundaries(t.selectionStart,!0))}renderDropTargetEffect(t){const e=this.getSelectionStartFromPointer(t);this.renderCursorAt(e)}_renderSelection(t,e,s){const i=e.selectionStart,r=e.selectionEnd,n=this.textAlign.includes(ss),o=this.get2DCursorLocation(i),a=this.get2DCursorLocation(r),h=o.lineIndex,l=a.lineIndex,c=o.charIndex<0?0:o.charIndex,u=a.charIndex<0?0:a.charIndex;for(let e=h;e<=l;e++){const i=this._getLineLeftOffset(e)||0;let r=this.getHeightOfLine(e),o=0,a=0,d=0;if(e===h&&(a=this.__charBounds[h][c].left),e>=h&&e1)&&(r/=this.lineHeight);let g=s.left+i+a,f=r,p=0;const m=d-a;this.inCompositionMode?(t.fillStyle=this.compositionColor||"black",f=1,p=r):t.fillStyle=this.selectionColor,"rtl"===this.direction&&(this.textAlign===M||this.textAlign===ss||this.textAlign===rs?g=this.width-g-m:this.textAlign===O||this.textAlign===is?g=s.left+i-d:this.textAlign!==T&&this.textAlign!==ns||(g=s.left+i-d)),t.fillRect(g,s.top+s.topOffset+p,m,f),s.topOffset+=o}}getCurrentCharFontSize(){const t=this._getCurrentCharIndex();return this.getValueOfPropertyAt(t.l,t.c,"fontSize")}getCurrentCharColor(){const t=this._getCurrentCharIndex();return this.getValueOfPropertyAt(t.l,t.c,H)}_getCurrentCharIndex(){const t=this.get2DCursorLocation(this.selectionStart,!0),e=t.charIndex>0?t.charIndex-1:0;return{l:t.lineIndex,c:e}}dispose(){this.exitEditingImpl(),this.draggableTextDelegate.dispose(),super.dispose()}}t(ao,"ownDefaults",oo),t(ao,"type","IText"),J.setClass(ao),J.setClass(ao,"i-text");class ho extends ao{static getDefaults(){return{...super.getDefaults(),...ho.ownDefaults}}constructor(t,e){super(t,{...ho.ownDefaults,...e})}static createControls(){return{controls:vi()}}initDimensions(){this.initialized&&(this.isEditing&&this.initDelayedCursor(),this._clearCache(),this.dynamicMinWidth=0,this._styleMap=this._generateStyleMap(this._splitText()),this.dynamicMinWidth>this.width&&this._set("width",this.dynamicMinWidth),this.textAlign.includes(ss)&&this.enlargeSpaces(),this.height=this.calcTextHeight())}_generateStyleMap(t){let e=0,s=0,i=0;const r={};for(let n=0;n0?(s=0,i++,e++):!this.splitByGrapheme&&this._reSpaceAndTab.test(t.graphemeText[i])&&n>0&&(s++,i++),r[n]={line:e,offset:s},i+=t.graphemeLines[n].length,s+=t.graphemeLines[n].length;return r}styleHas(t,e){if(this._styleMap&&!this.isWrapping){const t=this._styleMap[e];t&&(e=t.line)}return super.styleHas(t,e)}isEmptyStyles(t){if(!this.styles)return!0;let e,s=0,i=t+1,r=!1;const n=this._styleMap[t],o=this._styleMap[t+1];n&&(t=n.line,s=n.offset),o&&(i=o.line,r=i===t,e=o.offset);const a=void 0===t?this.styles:{line:this.styles[t]};for(const t in a)for(const i in a[t]){const n=parseInt(i,10);if(n>=s&&(!r||n{let n=0;const o=e?this.graphemeSplit(t):this.wordSplit(t);return 0===o.length?[{word:[],width:0}]:o.map(t=>{const o=e?[t]:this.graphemeSplit(t),a=this._measureWord(o,r,n);return i=Math.max(a,i),n+=o.length+s.length,{word:o,width:a}})}),largestWordWidth:i}}_measureWord(t,e){let s,i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:0,r=0;for(let n=0,o=t.length;n3&&void 0!==arguments[3]?arguments[3]:0;const o=this._getWidthOfCharSpacing(),a=this.splitByGrapheme,h=[],l=a?"":" ";let c=0,u=[],d=0,g=0,f=!0;e-=n;const p=Math.max(e,i,this.dynamicMinWidth),m=r[t];let v;for(d=0,v=0;vp&&!f?(h.push(u),u=[],c=s,f=!0):c+=o,f||a||u.push(l),u=u.concat(e),g=a?0:this._measureWord([l],t,d),d++,f=!1}return v&&h.push(u),i+n>this.dynamicMinWidth&&(this.dynamicMinWidth=i-o+n),h}isEndOfWrapping(t){return!this._styleMap[t+1]||this._styleMap[t+1].line!==this._styleMap[t].line}missingNewlineOffset(t,e){return this.splitByGrapheme&&!e?this.isEndOfWrapping(t)?1:0:1}_splitTextIntoLines(t){const e=super._splitTextIntoLines(t),s=this._wrapText(e.lines,this.width),i=new Array(s.length);for(let t=0;t0&&void 0!==arguments[0]?arguments[0]:[];return super.toObject(["minWidth","splitByGrapheme",...t])}}t(ho,"type","Textbox"),t(ho,"textLayoutProperties",[...ao.textLayoutProperties,"width"]),t(ho,"ownDefaults",{minWidth:20,dynamicMinWidth:2,lockScalingFlip:!0,noScaleCache:!1,_wordJoiners:/[ \t\r]/,splitByGrapheme:!1}),J.setClass(ho);class lo extends fr{shouldPerformLayout(t){return!!t.target.clipPath&&super.shouldPerformLayout(t)}shouldLayoutClipPath(){return!1}calcLayoutResult(t,e){const{target:s}=t,{clipPath:i,group:r}=s;if(!i||!this.shouldPerformLayout(t))return;const{width:n,height:o}=re(gr(s,i)),a=new it(n,o);if(i.absolutePositioned){return{center:ue(i.getRelativeCenterPoint(),void 0,r?r.calcTransformMatrix():void 0),size:a}}{const r=i.getRelativeCenterPoint().transform(s.calcOwnMatrix(),!0);if(this.shouldPerformLayout(t)){const{center:s=new it,correction:i=new it}=this.calcBoundingBox(e,t)||{};return{center:s.add(r),correction:i.subtract(r),size:a}}return{center:s.getRelativeCenterPoint().add(r),size:a}}}}t(lo,"type","clip-path"),J.setClass(lo);class co extends fr{getInitialSize(t,e){let{target:s}=t,{size:i}=e;return new it(s.width||i.x,s.height||i.y)}}t(co,"type","fixed"),J.setClass(co);class uo extends vr{subscribeTargets(t){const e=t.target;t.targets.reduce((t,e)=>(e.parent&&t.add(e.parent),t),new Set).forEach(t=>{t.layoutManager.subscribeTargets({target:t,targets:[e]})})}unsubscribeTargets(t){const e=t.target,s=e.getObjects();t.targets.reduce((t,e)=>(e.parent&&t.add(e.parent),t),new Set).forEach(t=>{!s.some(e=>e.parent===t)&&t.layoutManager.unsubscribeTargets({target:t,targets:[e]})})}}class go extends _r{static getDefaults(){return{...super.getDefaults(),...go.ownDefaults}}constructor(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[],e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};super(),Object.assign(this,go.ownDefaults),this.setOptions(e);const{left:s,top:i,layoutManager:r}=e;this.groupInit(t,{left:s,top:i,layoutManager:null!=r?r:new uo})}_shouldSetNestedCoords(){return!0}__objectSelectionMonitor(){}multiSelectAdd(){for(var t=arguments.length,e=new Array(t),s=0;s{const e=this._objects.findIndex(e=>e.isInFrontOf(t)),s=-1===e?this.size():e;this.insertAt(s,t)})}canEnterGroup(t){return this.getObjects().some(e=>e.isDescendantOf(t)||t.isDescendantOf(e))?(i("error","ActiveSelection: circular object trees are not supported, this call has no effect"),!1):super.canEnterGroup(t)}enterGroup(t,e){t.parent&&t.parent===t.group?t.parent._exitGroup(t):t.group&&t.parent!==t.group&&t.group.remove(t),this._enterGroup(t,e)}exitGroup(t,e){this._exitGroup(t,e),t.parent&&t.parent._enterGroup(t,!0)}_onAfterObjectsChange(t,e){super._onAfterObjectsChange(t,e);const s=new Set;e.forEach(t=>{const{parent:e}=t;e&&s.add(e)}),t===ur?s.forEach(t=>{t._onAfterObjectsChange(cr,e)}):s.forEach(t=>{t._set("dirty",!0)})}onDeselect(){return this.removeAll(),!1}toString(){return`#`}shouldCache(){return!1}isOnACache(){return!1}_renderControls(t,e,s){t.save(),t.globalAlpha=this.isMoving?this.borderOpacityWhenMoving:1;const i={hasControls:!1,...s,forActiveSelection:!0};for(let e=0;e{t.applyTo(o)});const{imageData:a}=o;return a.width===s&&a.height===i||(r.width=a.width,r.height=a.height),n.putImageData(a,0,0),o}}class po{constructor(){let{tileSize:e=s.textureSize}=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};t(this,"aPosition",new Float32Array([0,0,0,1,1,0,1,1])),t(this,"resources",{}),this.tileSize=e,this.setupGLContext(e,e),this.captureGPUInfo()}setupGLContext(t,e){this.dispose(),this.createWebGLCanvas(t,e)}createWebGLCanvas(t,e){const s=ft({width:t,height:e}),i=s.getContext("webgl",{alpha:!0,premultipliedAlpha:!1,depth:!1,stencil:!1,antialias:!1});i&&(i.clearColor(0,0,0,0),this.canvas=s,this.gl=i)}applyFilters(t,e,s,i,r,n){const o=this.gl,a=r.getContext("2d");if(!o||!a)return;let h;n&&(h=this.getCachedTexture(n,e));const l={originalWidth:e.width||e.naturalWidth||0,originalHeight:e.height||e.naturalHeight||0,sourceWidth:s,sourceHeight:i,destinationWidth:s,destinationHeight:i,context:o,sourceTexture:this.createTexture(o,s,i,h?void 0:e),targetTexture:this.createTexture(o,s,i),originalTexture:h||this.createTexture(o,s,i,h?void 0:e),passes:t.length,webgl:!0,aPosition:this.aPosition,programCache:this.programCache,pass:0,filterBackend:this,targetCanvas:r},c=o.createFramebuffer();return o.bindFramebuffer(o.FRAMEBUFFER,c),t.forEach(t=>{t&&t.applyTo(l)}),function(t){const e=t.targetCanvas,s=e.width,i=e.height,r=t.destinationWidth,n=t.destinationHeight;s===r&&i===n||(e.width=r,e.height=n)}(l),this.copyGLTo2D(o,l),o.bindTexture(o.TEXTURE_2D,null),o.deleteTexture(l.sourceTexture),o.deleteTexture(l.targetTexture),o.deleteFramebuffer(c),a.setTransform(1,0,0,1,0,0),l}dispose(){this.canvas&&(this.canvas=null,this.gl=null),this.clearWebGLCaches()}clearWebGLCaches(){this.programCache={},this.textureCache={}}createTexture(t,e,s,i,r){const{NEAREST:n,TEXTURE_2D:o,RGBA:a,UNSIGNED_BYTE:h,CLAMP_TO_EDGE:l,TEXTURE_MAG_FILTER:c,TEXTURE_MIN_FILTER:u,TEXTURE_WRAP_S:d,TEXTURE_WRAP_T:g}=t,f=t.createTexture();return t.bindTexture(o,f),t.texParameteri(o,c,r||n),t.texParameteri(o,u,r||n),t.texParameteri(o,d,l),t.texParameteri(o,g,l),i?t.texImage2D(o,0,a,a,h,i):t.texImage2D(o,0,a,e,s,0,a,h,null),f}getCachedTexture(t,e,s){const{textureCache:i}=this;if(i[t])return i[t];{const r=this.createTexture(this.gl,e.width,e.height,e,s);return r&&(i[t]=r),r}}evictCachesForKey(t){this.textureCache[t]&&(this.gl.deleteTexture(this.textureCache[t]),delete this.textureCache[t])}copyGLTo2D(t,e){const s=t.canvas,i=e.targetCanvas,r=i.getContext("2d");if(!r)return;r.translate(0,i.height),r.scale(1,-1);const n=s.height-i.height;r.drawImage(s,0,n,i.width,i.height,0,0,i.width,i.height)}copyGLTo2DPutImageData(t,e){const s=e.targetCanvas.getContext("2d"),i=e.destinationWidth,r=e.destinationHeight,n=i*r*4;if(!s)return;const o=new Uint8Array(this.imageBuffer,0,n),a=new Uint8ClampedArray(this.imageBuffer,0,n);t.readPixels(0,0,i,r,t.RGBA,t.UNSIGNED_BYTE,o);const h=new ImageData(a,i,r);s.putImageData(h,0,0)}captureGPUInfo(){if(this.gpuInfo)return this.gpuInfo;const t=this.gl,e={renderer:"",vendor:""};if(!t)return e;const s=t.getExtension("WEBGL_debug_renderer_info");if(s){const i=t.getParameter(s.UNMASKED_RENDERER_WEBGL),r=t.getParameter(s.UNMASKED_VENDOR_WEBGL);i&&(e.renderer=i.toLowerCase()),r&&(e.vendor=r.toLowerCase())}return this.gpuInfo=e,e}}let mo;function vo(){const{WebGLProbe:t}=u();return t.queryWebGL(dt()),s.enableGLFiltering&&t.isSupported(s.textureSize)?new po({tileSize:s.textureSize}):new fo}function yo(){return!mo&&(!(arguments.length>0&&void 0!==arguments[0])||arguments[0])&&(mo=vo()),mo}function _o(t){mo=t}const xo=["cropX","cropY"];class Co extends xi{static getDefaults(){return{...super.getDefaults(),...Co.ownDefaults}}constructor(e,s){super(),t(this,"_lastScaleX",1),t(this,"_lastScaleY",1),t(this,"_filterScalingX",1),t(this,"_filterScalingY",1),this.filters=[],Object.assign(this,Co.ownDefaults),this.setOptions(s),this.cacheKey=`texture${ut()}`,this.setElement("string"==typeof e?(this.canvas&&Ht(this.canvas.getElement())||d()).getElementById(e):e,s)}getElement(){return this._element}setElement(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};this.removeTexture(this.cacheKey),this.removeTexture(`${this.cacheKey}_filtered`),this._element=t,this._originalElement=t,this._setWidthHeight(e),0!==this.filters.length&&this.applyFilters(),this.resizeFilter&&this.applyResizeFilters()}removeTexture(t){const e=yo(!1);e instanceof po&&e.evictCachesForKey(t)}dispose(){super.dispose(),this.removeTexture(this.cacheKey),this.removeTexture(`${this.cacheKey}_filtered`),this._cacheContext=null,["_originalElement","_element","_filteredEl","_cacheCanvas"].forEach(t=>{const e=this[t];e&&u().dispose(e),this[t]=void 0})}getCrossOrigin(){return this._originalElement&&(this._originalElement.crossOrigin||null)}getOriginalSize(){const t=this.getElement();return t?{width:t.naturalWidth||t.width,height:t.naturalHeight||t.height}:{width:0,height:0}}_stroke(t){if(!this.stroke||0===this.strokeWidth)return;const e=this.width/2,s=this.height/2;t.beginPath(),t.moveTo(-e,-s),t.lineTo(e,-s),t.lineTo(e,s),t.lineTo(-e,s),t.lineTo(-e,-s),t.closePath()}toObject(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[];const e=[];return this.filters.forEach(t=>{t&&e.push(t.toObject())}),{...super.toObject([...xo,...t]),src:this.getSrc(),crossOrigin:this.getCrossOrigin(),filters:e,...this.resizeFilter?{resizeFilter:this.resizeFilter.toObject()}:{}}}hasCrop(){return!!this.cropX||!!this.cropY||this.width\n','\t\n',"\n"),o=' clip-path="url(#imageCrop_'+t+')" '}if(this.imageSmoothing||(a=' image-rendering="optimizeSpeed"'),t.push("\t\n`),this.stroke||this.strokeDashArray){const t=this.fill;this.fill=null,n=[`\t\n`],this.fill=t}return r=this.paintFirst!==H?r.concat(n,t):r.concat(t,n),r}getSrc(t){const e=t?this._element:this._originalElement;return e?e.toDataURL?e.toDataURL():this.srcFromAttribute?e.getAttribute("src")||"":e.src:this.src||""}getSvgSrc(t){return this.getSrc(t)}setSrc(t){let{crossOrigin:e,signal:s}=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return Ft(t,{crossOrigin:e,signal:s}).then(t=>{void 0!==e&&this.set({crossOrigin:e}),this.setElement(t)})}toString(){return`#`}applyResizeFilters(){const t=this.resizeFilter,e=this.minimumScaleTrigger,s=this.getTotalObjectScaling(),i=s.x,r=s.y,n=this._filteredEl||this._originalElement;if(this.group&&this.set("dirty",!0),!t||i>e&&r>e)return this._element=n,this._filterScalingX=1,this._filterScalingY=1,this._lastScaleX=i,void(this._lastScaleY=r);const o=ft(n),{width:a,height:h}=n;this._element=o,this._lastScaleX=t.scaleX=i,this._lastScaleY=t.scaleY=r,yo().applyFilters([t],n,a,h,this._element),this._filterScalingX=o.width/this._originalElement.width,this._filterScalingY=o.height/this._originalElement.height}applyFilters(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.filters||[];if(t=t.filter(t=>t&&!t.isNeutralState()),this.set("dirty",!0),this.removeTexture(`${this.cacheKey}_filtered`),0===t.length)return this._element=this._originalElement,this._filteredEl=void 0,this._filterScalingX=1,void(this._filterScalingY=1);const e=this._originalElement,s=e.naturalWidth||e.width,i=e.naturalHeight||e.height;if(this._element===this._originalElement){const t=ft({width:s,height:i});this._element=t,this._filteredEl=t}else this._filteredEl&&(this._element=this._filteredEl,this._filteredEl.getContext("2d").clearRect(0,0,s,i),this._lastScaleX=1,this._lastScaleY=1);yo().applyFilters(t,this._originalElement,s,i,this._element,this.cacheKey),this._originalElement.width===this._element.width&&this._originalElement.height===this._element.height||(this._filterScalingX=this._element.width/this._originalElement.width,this._filterScalingY=this._element.height/this._originalElement.height)}_render(t){t.imageSmoothingEnabled=this.imageSmoothing,!0!==this.isMoving&&this.resizeFilter&&this._needsResize()&&this.applyResizeFilters(),this._stroke(t),this._renderPaintInOrder(t)}drawCacheOnCanvas(t){t.imageSmoothingEnabled=this.imageSmoothing,super.drawCacheOnCanvas(t)}shouldCache(){return this.needsItsOwnCache()}_renderFill(t){const e=this._element;if(!e)return;const s=this._filterScalingX,i=this._filterScalingY,r=this.width,n=this.height,o=Math.max(this.cropX,0),a=Math.max(this.cropY,0),h=e.naturalWidth||e.width,l=e.naturalHeight||e.height,c=o*s,u=a*i,d=Math.min(r*s,h-c),g=Math.min(n*i,l-u),f=-r/2,p=-n/2,m=Math.min(r,h/s-o),v=Math.min(n,l/i-a);e&&t.drawImage(e,c,u,d,g,f,p,m,v)}_needsResize(){const t=this.getTotalObjectScaling();return t.x!==this._lastScaleX||t.y!==this._lastScaleY}_resetWidthHeight(){this.set(this.getOriginalSize())}_setWidthHeight(){let{width:t,height:e}=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};const s=this.getOriginalSize();this.width=t||s.width,this.height=e||s.height}parsePreserveAspectRatioAttribute(){const t=ze(this.preserveAspectRatio||""),e=this.width,s=this.height,i={width:e,height:s};let r,n=this._element.width,o=this._element.height,a=1,h=1,l=0,c=0,u=0,d=0;return!t||t.alignX===E&&t.alignY===E?(a=e/n,h=s/o):("meet"===t.meetOrSlice&&(a=h=xr(this._element,i),r=(e-n*a)/2,"Min"===t.alignX&&(l=-r),"Max"===t.alignX&&(l=r),r=(s-o*h)/2,"Min"===t.alignY&&(c=-r),"Max"===t.alignY&&(c=r)),"slice"===t.meetOrSlice&&(a=h=Cr(this._element,i),r=n-e/a,"Mid"===t.alignX&&(u=r/2),"Max"===t.alignX&&(u=r),r=o-s/h,"Mid"===t.alignY&&(d=r/2),"Max"===t.alignY&&(d=r),n=e/a,o=s/h)),{width:n,height:o,scaleX:a,scaleY:h,offsetLeft:l,offsetTop:c,cropX:u,cropY:d}}static fromObject(t,e){let{filters:s,resizeFilter:i,src:r,crossOrigin:n,type:o,...a}=t;return Promise.all([Ft(r,{...e,crossOrigin:n}),s&&Lt(s,e),i?Lt([i],e):[],Rt(a,e)]).then(t=>{let[e,s=[],[i],n={}]=t;return new this(e,{...a,src:r,filters:s,resizeFilter:i,...n})})}static fromURL(t){let{crossOrigin:e=null,signal:s}=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},i=arguments.length>2?arguments[2]:void 0;return Ft(t,{crossOrigin:e,signal:s}).then(t=>new this(t,i))}static async fromElement(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},s=arguments.length>2?arguments[2]:void 0;const r=or(t,this.ATTRIBUTE_NAMES,s);return this.fromURL(r["xlink:href"]||r.href,e,r).catch(t=>(i("log","Unable to parse Image",t),null))}}function So(t){if(!fs.test(t.nodeName))return{};const e=t.getAttribute("viewBox");let s,i,r=1,n=1,o=0,a=0;const h=t.getAttribute("width"),l=t.getAttribute("height"),c=t.getAttribute("x")||0,u=t.getAttribute("y")||0,d=!(e&&ms.test(e)),g=!h||!l||"100%"===h||"100%"===l;let f="",p=0,m=0;if(d&&(c||u)&&t.parentNode&&"#document"!==t.parentNode.nodeName&&(f=" translate("+Ge(c||"0")+" "+Ge(u||"0")+") ",s=(t.getAttribute("transform")||"")+f,t.setAttribute("transform",s),t.removeAttribute("x"),t.removeAttribute("y")),d&&g)return{width:0,height:0};const v={width:0,height:0};if(d)return v.width=Ge(h),v.height=Ge(l),v;const y=e.match(ms);o=-parseFloat(y[1]),a=-parseFloat(y[2]);const _=parseFloat(y[3]),x=parseFloat(y[4]);v.minX=o,v.minY=a,v.viewBoxWidth=_,v.viewBoxHeight=x,g?(v.width=_,v.height=x):(v.width=Ge(h),v.height=Ge(l),r=v.width/_,n=v.height/x);const C=ze(t.getAttribute("preserveAspectRatio")||"");if(C.alignX!==E&&("meet"===C.meetOrSlice&&(n=r=r>n?n:r),"slice"===C.meetOrSlice&&(n=r=r>n?r:n),p=v.width-_*r,m=v.height-x*r,"Mid"===C.alignX&&(p/=2),"Mid"===C.alignY&&(m/=2),"Min"===C.alignX&&(p=0),"Min"===C.alignY&&(m=0)),1===r&&1===n&&0===o&&0===a&&0===c&&0===u)return v;if((c||u)&&"#document"!==t.parentNode.nodeName&&(f=" translate("+Ge(c||"0")+" "+Ge(u||"0")+") "),s=f+" matrix("+r+" 0 0 "+n+" "+(o*r+p)+" "+(a*n+m)+") ","svg"===t.nodeName){for(i=t.ownerDocument.createElementNS(hs,"g");t.firstChild;)i.appendChild(t.firstChild);t.appendChild(i)}else i=t,i.removeAttribute("x"),i.removeAttribute("y"),s=i.getAttribute("transform")+s;return i.setAttribute("transform",s),v}t(Co,"type","Image"),t(Co,"cacheProperties",[...Ss,...xo]),t(Co,"ownDefaults",{strokeWidth:0,srcFromAttribute:!1,minimumScaleTrigger:.5,cropX:0,cropY:0,imageSmoothing:!0}),t(Co,"ATTRIBUTE_NAMES",[...Ii,"x","y","width","height","preserveAspectRatio","xlink:href","href","crossOrigin","image-rendering"]),J.setClass(Co),J.setSVGClass(Co);const bo=t=>t.tagName.replace("svg:",""),wo=Ue(["pattern","defs","symbol","metadata","clipPath","mask","desc"]);function To(t,e){let s,i,r,n,o=[];for(r=0,n=e.length;r{const s=r.getAttribute(t);!e.hasAttribute(t)&&s&&e.setAttribute(t,s)}),!e.children.length)){const t=r.cloneNode(!0);for(;t.firstChild;)e.appendChild(t.firstChild)}e.removeAttribute(ko)}const Mo=["linearGradient","radialGradient","svg:linearGradient","svg:radialGradient"];const Eo=t=>J.getSVGClass(bo(t).toLowerCase());class Po{constructor(t,e,s,i,r){this.elements=t,this.options=e,this.reviver=s,this.regexUrl=/^url\(['"]?#([^'"]+)['"]?\)/g,this.doc=i,this.clipPaths=r,this.gradientDefs=function(t){const e=To(t,Mo),s={};let i=e.length;for(;i--;){const r=e[i];r.getAttribute("xlink:href")&&Do(t,r);const n=r.getAttribute("id");n&&(s[n]=r)}return s}(i),this.cssRules=function(t){const e=t.getElementsByTagName("style"),s={};for(let t=0;ts.length>1&&t.trim()).forEach(t=>{if((t.match(/{/g)||[]).length>1&&t.trim().startsWith("@"))return;const e=t.split("{"),i={},r=e[1].trim().split(";").filter(function(t){return t.trim()});for(let t=0;t{""!==(t=t.replace(/^svg/i,"").trim())&&(s[t]={...s[t]||{},...i})})})}return s}(i)}parse(){return Promise.all(this.elements.map(t=>this.createObject(t)))}async createObject(t){const e=Eo(t);if(e){const s=await e.fromElement(t,this.options,this.cssRules);return this.resolveGradient(s,t,H),this.resolveGradient(s,t,N),s instanceof Co&&s._originalElement?Jr(s,s.parsePreserveAspectRatioAttribute()):Jr(s),await this.resolveClipPath(s,t),this.reviver&&this.reviver(t,s),s}return null}extractPropertyDefinition(t,e,s){const i=t[e],r=this.regexUrl;if(!r.test(i))return;r.lastIndex=0;const n=r.exec(i)[1];return r.lastIndex=0,s[n]}resolveGradient(t,e,s){const i=this.extractPropertyDefinition(t,s,this.gradientDefs);if(i){const r=e.getAttribute(s+"-opacity"),n=wn.fromElement(i,t,{...this.options,opacity:r});t.set(s,n)}}async resolveClipPath(t,e,s){const i=this.extractPropertyDefinition(t,"clipPath",this.clipPaths);if(i){const r=Ct(t.calcTransformMatrix()),n=i[0].parentElement;let o=e;for(;!s&&o.parentElement&&o.getAttribute("clip-path")!==t.clipPath;)o=o.parentElement;o.parentElement.appendChild(n);const a=er(`${o.getAttribute("transform")||""} ${n.getAttribute("originalTransform")||""}`);n.setAttribute("transform",`matrix(${a.join(",")})`);const h=await Promise.all(i.map(t=>Eo(t).fromElement(t,this.options,this.cssRules).then(t=>(Jr(t),t.fillRule=t.clipRule,delete t.clipRule,t)))),l=1===h.length?h[0]:new _r(h),c=St(r,l.calcTransformMatrix());l.clipPath&&await this.resolveClipPath(l,o,n.getAttribute("clip-path")?o:void 0);const{scaleX:u,scaleY:d,angle:g,skewX:f,translateX:p,translateY:m}=Tt(c);l.set({flipX:!1,flipY:!1}),l.set({scaleX:u,scaleY:d,angle:g,skewX:f,skewY:0}),l.setPositionByOrigin(new it(p,m),T,T),t.clipPath=l}else delete t.clipPath}}const Ao=t=>gs.test(bo(t));async function jo(t,e){let{crossOrigin:s,signal:r}=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};if(r&&r.aborted)return i("log",new n("parseSVGDocument")),{objects:[],elements:[],options:{},allElements:[]};const o=t.documentElement;!function(t){const e=To(t,["use","svg:use"]),s=["x","y","xlink:href","href","transform"];for(const i of e){const e=i.attributes,r={};for(const t of e)t.value&&(r[t.name]=t.value);const n=(r["xlink:href"]||r.href||"").slice(1);if(""===n)return;const o=t.getElementById(n);if(null===o)return;let a=o.cloneNode(!0);const h=a.attributes,l={};for(const t of h)t.value&&(l[t.name]=t.value);const{x:c=0,y:u=0,transform:d=""}=r,g=`${d} ${l.transform||""} translate(${c}, ${u})`;if(So(a),/^svg$/i.test(a.nodeName)){const t=a.ownerDocument.createElementNS(hs,"g");Object.entries(l).forEach(e=>{let[s,i]=e;return t.setAttributeNS(hs,s,i)}),t.append(...a.childNodes),a=t}for(const t of e){if(!t)continue;const{name:e,value:i}=t;if(!s.includes(e))if("style"===e){const t={};ir(i,t),Object.entries(l).forEach(e=>{let[s,i]=e;t[s]=i}),ir(l.style||"",t);const s=Object.entries(t).map(t=>t.join(":")).join(";");a.setAttribute(e,s)}else!l[e]&&a.setAttribute(e,i)}a.setAttribute("transform",g),a.setAttribute("instantiated_by_use","1"),a.removeAttribute("id"),i.parentNode.replaceChild(a,i)}}(t);const a=Array.from(o.getElementsByTagName("*")),h={...So(o),crossOrigin:s,signal:r},l=a.filter(t=>(So(t),Ao(t)&&!function(t){let e=t;for(;e&&(e=e.parentElement);)if(e&&e.nodeName&&wo.test(bo(e))&&!e.getAttribute("instantiated_by_use"))return!0;return!1}(t)));if(!l||l&&!l.length)return{objects:[],elements:[],options:{},allElements:[],options:h,allElements:a};const c={};a.filter(t=>"clipPath"===bo(t)).forEach(t=>{t.setAttribute("originalTransform",t.getAttribute("transform")||"");const e=t.getAttribute("id");c[e]=Array.from(t.getElementsByTagName("*")).filter(t=>Ao(t))});const u=new Po(l,h,e,t,c);return{objects:await u.parse(),elements:l,options:h,allElements:a}}function Fo(t,e,s){return jo((new(g().DOMParser)).parseFromString(t.trim(),"text/xml"),e,s)}function Lo(t,e){let s=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};return fetch(t.replace(/^\n\s*/,"").trim(),{signal:s.signal}).then(t=>{if(!t.ok)throw new r(`HTTP error! status: ${t.status}`);return t.text()}).then(t=>Fo(t,e,s)).catch(()=>({objects:[],elements:[],options:{},allElements:[]}))}const Ro=B,Io=t=>function(e,s,i){const{points:r,pathOffset:n}=i;return new it(r[t]).subtract(n).transform(St(i.getViewportTransform(),i.calcTransformMatrix()))},Bo=(t,e,s,i)=>{const{target:r,pointIndex:n}=e,o=r,a=ue(new it(s,i),void 0,o.calcOwnMatrix());return o.points[n]=a.add(o.pathOffset),o.setDimensions(),o.set("dirty",!0),!0},$o=(t,e)=>function(s,i,r,n){const o=i.target,a=new it(o.points[(t>0?t:o.points.length)-1]),h=a.subtract(o.pathOffset).transform(o.calcOwnMatrix()),l=e(s,{...i,pointIndex:t},r,n),c=a.subtract(o.pathOffset).transform(o.calcOwnMatrix()).subtract(h);return o.left-=c.x,o.top-=c.y,l},Xo=t=>Ws(Ro,$o(t,Bo));const Yo=(t,e,s)=>{const{path:i,pathOffset:r}=t,n=i[e];return new it(n[s]-r.x,n[s+1]-r.y).transform(St(t.getViewportTransform(),t.calcTransformMatrix()))};function Wo(t,e,s){const{commandIndex:i,pointIndex:r}=this;return Yo(s,i,r)}function Vo(t,e,s,i){const{target:r}=e,{commandIndex:n,pointIndex:o}=this,a=((t,e,s,i,r)=>{const{path:n,pathOffset:o}=t,a=n[(i>0?i:n.length)-1],h=new it(a[r],a[r+1]),l=h.subtract(o).transform(t.calcOwnMatrix()),c=ue(new it(e,s),void 0,t.calcOwnMatrix());n[i][r]=c.x+o.x,n[i][r+1]=c.y+o.y,t.setDimensions();const u=h.subtract(t.pathOffset).transform(t.calcOwnMatrix()).subtract(l);return t.left-=u.x,t.top-=u.y,t.set("dirty",!0),!0})(r,s,i,n,o);return fe(this.actionName,{...je(t,e,s,i),commandIndex:n,pointIndex:o}),a}class Go extends Ns{constructor(t){super(t)}render(t,e,s,i,r){const n={...i,cornerColor:this.controlFill,cornerStrokeColor:this.controlStroke,transparentCorners:!this.controlFill};super.render(t,e,s,n,r)}}class zo extends Go{constructor(t){super(t)}render(t,e,s,i,r){const{path:n}=r,{commandIndex:o,pointIndex:a,connectToCommandIndex:h,connectToPointIndex:l}=this;t.save(),t.strokeStyle=this.controlStroke,this.connectionDashArray&&t.setLineDash(this.connectionDashArray);const[c]=n[o],u=Yo(r,h,l);if("Q"===c){const i=Yo(r,o,a+2);t.moveTo(i.x,i.y),t.lineTo(e,s)}else t.moveTo(e,s);t.lineTo(u.x,u.y),t.stroke(),t.restore(),super.render(t,e,s,i,r)}}const Ho=(t,e,s,i,r,n)=>new(s?zo:Go)({commandIndex:t,pointIndex:e,actionName:"modifyPath",positionHandler:Wo,actionHandler:Vo,connectToCommandIndex:r,connectToPointIndex:n,...i,...s?i.controlPointStyle:i.pointStyle});var No=Object.freeze({__proto__:null,changeWidth:Gs,createObjectDefaultControls:pi,createPathControls:function(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};const s={};let i="M";return t.path.forEach((t,r)=>{const n=t[0];switch("Z"!==n&&(s[`c_${r}_${n}`]=Ho(r,t.length-2,!1,e)),n){case"C":s[`c_${r}_C_CP_1`]=Ho(r,1,!0,e,r-1,(t=>"C"===t?5:"Q"===t?3:1)(i)),s[`c_${r}_C_CP_2`]=Ho(r,3,!0,e,r,5);break;case"Q":s[`c_${r}_Q_CP_1`]=Ho(r,1,!0,e,r,3)}i=n}),s},createPolyActionHandler:Xo,createPolyControls:function(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};const s={};for(let i=0;i<("number"==typeof t?t:t.points.length);i++)s[`p${i}`]=new Ns({actionName:Ro,positionHandler:Io(i),actionHandler:Xo(i),...e});return s},createPolyPositionHandler:Io,createResizeControls:mi,createTextboxDefaultControls:vi,dragHandler:Re,factoryPolyActionHandler:$o,getLocalPoint:Le,polyActionHandler:Bo,renderCircleControl:zs,renderSquareControl:Hs,rotationStyleHandler:Us,rotationWithSnapping:qs,scaleCursorStyleHandler:Zs,scaleOrSkewActionName:ui,scaleSkewCursorStyleHandler:di,scalingEqually:ei,scalingX:si,scalingXOrSkewingY:gi,scalingY:ii,scalingYOrSkewingX:fi,skewCursorStyleHandler:oi,skewHandlerX:hi,skewHandlerY:li,wrapWithFireEvent:Ws,wrapWithFixedAnchor:Vs});const Uo=t=>void 0!==t.webgl,qo=(t,e)=>{const s=ft({width:t,height:e}),i=dt().getContext("webgl"),r={imageBuffer:new ArrayBuffer(t*e*4)},n={destinationWidth:t,destinationHeight:e,targetCanvas:s};let o;o=g().performance.now(),po.prototype.copyGLTo2D.call(r,i,n);const a=g().performance.now()-o;o=g().performance.now(),po.prototype.copyGLTo2DPutImageData.call(r,i,n);return a>g().performance.now()-o},Ko="precision highp float",Jo=`\n ${Ko};\n varying vec2 vTexCoord;\n uniform sampler2D uTexture;\n void main() {\n gl_FragColor = texture2D(uTexture, vTexCoord);\n }`,Qo=new RegExp(Ko,"g");class Zo{get type(){return this.constructor.type}constructor(){let{type:t,...e}=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};Object.assign(this,this.constructor.defaults,e)}getFragmentSource(){return Jo}getVertexSource(){return"\n attribute vec2 aPosition;\n varying vec2 vTexCoord;\n void main() {\n vTexCoord = aPosition;\n gl_Position = vec4(aPosition * 2.0 - 1.0, 0.0, 1.0);\n }"}createProgram(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:this.getFragmentSource(),s=arguments.length>2&&void 0!==arguments[2]?arguments[2]:this.getVertexSource();const{WebGLProbe:{GLPrecision:i="highp"}}=u();"highp"!==i&&(e=e.replace(Qo,Ko.replace("highp",i)));const n=t.createShader(t.VERTEX_SHADER),o=t.createShader(t.FRAGMENT_SHADER),a=t.createProgram();if(!n||!o||!a)throw new r("Vertex, fragment shader or program creation error");if(t.shaderSource(n,s),t.compileShader(n),!t.getShaderParameter(n,t.COMPILE_STATUS))throw new r(`Vertex shader compile error for ${this.type}: ${t.getShaderInfoLog(n)}`);if(t.shaderSource(o,e),t.compileShader(o),!t.getShaderParameter(o,t.COMPILE_STATUS))throw new r(`Fragment shader compile error for ${this.type}: ${t.getShaderInfoLog(o)}`);if(t.attachShader(a,n),t.attachShader(a,o),t.linkProgram(a),!t.getProgramParameter(a,t.LINK_STATUS))throw new r(`Shader link error for "${this.type}" ${t.getProgramInfoLog(a)}`);const h=this.getUniformLocations(t,a)||{};return h.uStepW=t.getUniformLocation(a,"uStepW"),h.uStepH=t.getUniformLocation(a,"uStepH"),{program:a,attributeLocations:this.getAttributeLocations(t,a),uniformLocations:h}}getAttributeLocations(t,e){return{aPosition:t.getAttribLocation(e,"aPosition")}}getUniformLocations(t,e){const s=this.constructor.uniformLocations,i={};for(let r=0;r1){const s=t.destinationWidth,i=t.destinationHeight;t.sourceWidth===s&&t.sourceHeight===i||(e.deleteTexture(t.targetTexture),t.targetTexture=t.filterBackend.createTexture(e,s,i)),e.framebufferTexture2D(e.FRAMEBUFFER,e.COLOR_ATTACHMENT0,e.TEXTURE_2D,t.targetTexture,0)}else e.bindFramebuffer(e.FRAMEBUFFER,null),e.finish()}_swapTextures(t){t.passes--,t.pass++;const e=t.targetTexture;t.targetTexture=t.sourceTexture,t.sourceTexture=e}isNeutralState(t){return!1}applyTo(t){Uo(t)?(this._setupFrameBuffer(t),this.applyToWebGL(t),this._swapTextures(t)):this.applyTo2d(t)}applyTo2d(t){}getCacheKey(){return this.type}retrieveShader(t){const e=this.getCacheKey();return t.programCache[e]||(t.programCache[e]=this.createProgram(t.context)),t.programCache[e]}applyToWebGL(t){const e=t.context,s=this.retrieveShader(t);0===t.pass&&t.originalTexture?e.bindTexture(e.TEXTURE_2D,t.originalTexture):e.bindTexture(e.TEXTURE_2D,t.sourceTexture),e.useProgram(s.program),this.sendAttributeData(e,s.attributeLocations,t.aPosition),e.uniform1f(s.uniformLocations.uStepW,1/t.sourceWidth),e.uniform1f(s.uniformLocations.uStepH,1/t.sourceHeight),this.sendUniformData(e,s.uniformLocations),e.viewport(0,0,t.destinationWidth,t.destinationHeight),e.drawArrays(e.TRIANGLE_STRIP,0,4)}bindAdditionalTexture(t,e,s){t.activeTexture(s),t.bindTexture(t.TEXTURE_2D,e),t.activeTexture(t.TEXTURE0)}unbindAdditionalTexture(t,e){t.activeTexture(e),t.bindTexture(t.TEXTURE_2D,null),t.activeTexture(t.TEXTURE0)}sendUniformData(t,e){}createHelpLayer(t){if(!t.helpLayer){const{sourceWidth:e,sourceHeight:s}=t,i=ft({width:e,height:s});t.helpLayer=i}}toObject(){const t=Object.keys(this.constructor.defaults||{});return{type:this.type,...t.reduce((t,e)=>(t[e]=this[e],t),{})}}toJSON(){return this.toObject()}static async fromObject(t,e){let{type:s,...i}=t;return new this(i)}}t(Zo,"type","BaseFilter"),t(Zo,"uniformLocations",[]);const ta={multiply:"gl_FragColor.rgb *= uColor.rgb;\n",screen:"gl_FragColor.rgb = 1.0 - (1.0 - gl_FragColor.rgb) * (1.0 - uColor.rgb);\n",add:"gl_FragColor.rgb += uColor.rgb;\n",difference:"gl_FragColor.rgb = abs(gl_FragColor.rgb - uColor.rgb);\n",subtract:"gl_FragColor.rgb -= uColor.rgb;\n",lighten:"gl_FragColor.rgb = max(gl_FragColor.rgb, uColor.rgb);\n",darken:"gl_FragColor.rgb = min(gl_FragColor.rgb, uColor.rgb);\n",exclusion:"gl_FragColor.rgb += uColor.rgb - 2.0 * (uColor.rgb * gl_FragColor.rgb);\n",overlay:"\n if (uColor.r < 0.5) {\n gl_FragColor.r *= 2.0 * uColor.r;\n } else {\n gl_FragColor.r = 1.0 - 2.0 * (1.0 - gl_FragColor.r) * (1.0 - uColor.r);\n }\n if (uColor.g < 0.5) {\n gl_FragColor.g *= 2.0 * uColor.g;\n } else {\n gl_FragColor.g = 1.0 - 2.0 * (1.0 - gl_FragColor.g) * (1.0 - uColor.g);\n }\n if (uColor.b < 0.5) {\n gl_FragColor.b *= 2.0 * uColor.b;\n } else {\n gl_FragColor.b = 1.0 - 2.0 * (1.0 - gl_FragColor.b) * (1.0 - uColor.b);\n }\n ",tint:"\n gl_FragColor.rgb *= (1.0 - uColor.a);\n gl_FragColor.rgb += uColor.rgb;\n "};class ea extends Zo{getCacheKey(){return`${this.type}_${this.mode}`}getFragmentSource(){return`\n precision highp float;\n uniform sampler2D uTexture;\n uniform vec4 uColor;\n varying vec2 vTexCoord;\n void main() {\n vec4 color = texture2D(uTexture, vTexCoord);\n gl_FragColor = color;\n if (color.a > 0.0) {\n ${ta[this.mode]}\n }\n }\n `}applyTo2d(t){let{imageData:{data:e}}=t;const s=new Ve(this.color).getSource(),i=this.alpha,r=s[0]*i,n=s[1]*i,o=s[2]*i,a=1-i;for(let t=0;tnew this({...r,image:t}))}}t(ia,"type","BlendImage"),t(ia,"defaults",{mode:"multiply",alpha:1}),t(ia,"uniformLocations",["uTransformMatrix","uImage"]),J.setClass(ia);class ra extends Zo{getFragmentSource(){return"\n precision highp float;\n uniform sampler2D uTexture;\n uniform vec2 uDelta;\n varying vec2 vTexCoord;\n const float nSamples = 15.0;\n vec3 v3offset = vec3(12.9898, 78.233, 151.7182);\n float random(vec3 scale) {\n /* use the fragment position for a different seed per-pixel */\n return fract(sin(dot(gl_FragCoord.xyz, scale)) * 43758.5453);\n }\n void main() {\n vec4 color = vec4(0.0);\n float totalC = 0.0;\n float totalA = 0.0;\n float offset = random(v3offset);\n for (float t = -nSamples; t <= nSamples; t++) {\n float percent = (t + offset - 0.5) / nSamples;\n vec4 sample = texture2D(uTexture, vTexCoord + uDelta * percent);\n float weight = 1.0 - abs(percent);\n float alpha = weight * sample.a;\n color.rgb += sample.rgb * alpha;\n color.a += alpha;\n totalA += weight;\n totalC += alpha;\n }\n gl_FragColor.rgb = color.rgb / totalC;\n gl_FragColor.a = color.a / totalA;\n }\n "}applyTo(t){Uo(t)?(this.aspectRatio=t.sourceWidth/t.sourceHeight,t.passes++,this._setupFrameBuffer(t),this.horizontal=!0,this.applyToWebGL(t),this._swapTextures(t),this._setupFrameBuffer(t),this.horizontal=!1,this.applyToWebGL(t),this._swapTextures(t)):this.applyTo2d(t)}applyTo2d(t){let{imageData:{data:e,width:s,height:i}}=t;this.aspectRatio=s/i,this.horizontal=!0;let r=this.getBlurValue()*s;const n=new Uint8ClampedArray(e),o=15,a=4*s;for(let t=0;td&&(p=d);const m=e[p+3]*f;s+=e[p]*m,i+=e[p+1]*m,h+=e[p+2]*m,l+=m,c+=f}n[t]=s/l,n[t+1]=i/l,n[t+2]=h/l,n[t+3]=l/c}this.horizontal=!1,r=this.getBlurValue()*i;for(let t=0;td&&(m=d);const v=n[m+3]*p;s+=n[m]*v,i+=n[m+1]*v,h+=n[m+2]*v,l+=v,c+=p}e[t]=s/l,e[t+1]=i/l,e[t+2]=h/l,e[t+3]=l/c}}sendUniformData(t,e){const s=this.chooseRightDelta();t.uniform2fv(e.uDelta,s)}isNeutralState(){return 0===this.blur}getBlurValue(){let t=1;const{horizontal:e,aspectRatio:s}=this;return e?s>1&&(t=1/s):s<1&&(t=s),t*this.blur*.12}chooseRightDelta(){const t=this.getBlurValue();return this.horizontal?[t,0]:[0,t]}}t(ra,"type","Blur"),t(ra,"defaults",{blur:0}),t(ra,"uniformLocations",["uDelta"]),J.setClass(ra);class na extends Zo{getFragmentSource(){return"\n precision highp float;\n uniform sampler2D uTexture;\n uniform float uBrightness;\n varying vec2 vTexCoord;\n void main() {\n vec4 color = texture2D(uTexture, vTexCoord);\n color.rgb += uBrightness;\n gl_FragColor = color;\n }\n"}applyTo2d(t){let{imageData:{data:e}}=t;const s=Math.round(255*this.brightness);for(let t=0;t0&&void 0!==arguments[0]?arguments[0]:{};super(t),this.subFilters=t.subFilters||[]}applyTo(t){Uo(t)&&(t.passes+=this.subFilters.length-1),this.subFilters.forEach(e=>{e.applyTo(t)})}toObject(){return{type:this.type,subFilters:this.subFilters.map(t=>t.toObject())}}isNeutralState(){return!this.subFilters.some(t=>!t.isNeutralState())}static fromObject(t,e){return Promise.all((t.subFilters||[]).map(t=>J.getClass(t.type).fromObject(t,e))).then(t=>new this({subFilters:t}))}}t(ma,"type","Composed"),J.setClass(ma);class va extends Zo{getFragmentSource(){return"\n precision highp float;\n uniform sampler2D uTexture;\n uniform float uContrast;\n varying vec2 vTexCoord;\n void main() {\n vec4 color = texture2D(uTexture, vTexCoord);\n float contrastF = 1.015 * (uContrast + 1.0) / (1.0 * (1.015 - uContrast));\n color.rgb = contrastF * (color.rgb - 0.5) + 0.5;\n gl_FragColor = color;\n }"}isNeutralState(){return 0===this.contrast}applyTo2d(t){let{imageData:{data:e}}=t;const s=Math.floor(255*this.contrast),i=259*(s+255)/(255*(259-s));for(let t=0;t=a||m<0||m>=o||(y=4*(v*o+m),_=i[b*r+S],u+=s[y]*_,d+=s[y+1]*_,g+=s[y+2]*_,c||(f+=s[y+3]*_));l[p]=u,l[p+1]=d,l[p+2]=g,l[p+3]=c?s[p+3]:f}t.imageData=h}sendUniformData(t,e){t.uniform1fv(e.uMatrix,this.matrix)}toObject(){return{...super.toObject(),opaque:this.opaque,matrix:[...this.matrix]}}}t(_a,"type","Convolute"),t(_a,"defaults",{opaque:!1,matrix:[0,0,0,0,1,0,0,0,0]}),t(_a,"uniformLocations",["uMatrix","uOpaque","uHalfSize","uSize"]),J.setClass(_a);const xa="Gamma";class Ca extends Zo{getFragmentSource(){return"\n precision highp float;\n uniform sampler2D uTexture;\n uniform vec3 uGamma;\n varying vec2 vTexCoord;\n void main() {\n vec4 color = texture2D(uTexture, vTexCoord);\n vec3 correction = (1.0 / uGamma);\n color.r = pow(color.r, correction.r);\n color.g = pow(color.g, correction.g);\n color.b = pow(color.b, correction.b);\n gl_FragColor = color;\n gl_FragColor.rgb *= color.a;\n }\n"}constructor(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};super(t),this.gamma=t.gamma||this.constructor.defaults.gamma.concat()}applyTo2d(t){let{imageData:{data:e}}=t;const s=this.gamma,i=1/s[0],r=1/s[1],n=1/s[2];this.rgbValues||(this.rgbValues={r:new Uint8Array(256),g:new Uint8Array(256),b:new Uint8Array(256)});const o=this.rgbValues;for(let t=0;t<256;t++)o.r[t]=255*Math.pow(t/255,i),o.g[t]=255*Math.pow(t/255,r),o.b[t]=255*Math.pow(t/255,n);for(let t=0;tr[0]&&i>r[1]&&o>r[2]&&s`\n color += texture2D(uTexture, vTexCoord + ${t}) * uTaps[${e}] + texture2D(uTexture, vTexCoord - ${t}) * uTaps[${e}];\n sum += 2.0 * uTaps[${e}];\n `).join("\n")}\n gl_FragColor = color / sum;\n }\n `}applyToForWebgl(t){t.passes++,this.width=t.sourceWidth,this.horizontal=!0,this.dW=Math.round(this.width*this.scaleX),this.dH=t.sourceHeight,this.tempScale=this.dW/this.width,this.taps=this.getTaps(),t.destinationWidth=this.dW,super.applyTo(t),t.sourceWidth=t.destinationWidth,this.height=t.sourceHeight,this.horizontal=!1,this.dH=Math.round(this.height*this.scaleY),this.tempScale=this.dH/this.height,this.taps=this.getTaps(),t.destinationHeight=this.dH,super.applyTo(t),t.sourceHeight=t.destinationHeight}applyTo(t){Uo(t)?this.applyToForWebgl(t):this.applyTo2d(t)}isNeutralState(){return 1===this.scaleX&&1===this.scaleY}lanczosCreate(t){return e=>{if(e>=t||e<=-t)return 0;if(e<1.1920929e-7&&e>-1.1920929e-7)return 1;const s=(e*=Math.PI)/t;return Math.sin(e)/e*Math.sin(s)/s}}applyTo2d(t){const e=t.imageData,s=this.scaleX,i=this.scaleY;this.rcpScaleX=1/s,this.rcpScaleY=1/i;const r=e.width,n=e.height,o=Math.round(r*s),a=Math.round(n*i);let h;h="sliceHack"===this.resizeType?this.sliceByTwo(t,r,n,o,a):"hermite"===this.resizeType?this.hermiteFastResize(t,r,n,o,a):"bilinear"===this.resizeType?this.bilinearFiltering(t,r,n,o,a):"lanczos"===this.resizeType?this.lanczosResize(t,r,n,o,a):new ImageData(o,a),t.imageData=h}sliceByTwo(t,e,s,i,r){const n=t.imageData,o=.5;let a=!1,h=!1,l=e*o,c=s*o;const u=t.filterBackend.resources;let d=0,g=0;const f=e;let p=0;u.sliceByTwo||(u.sliceByTwo=dt());const m=u.sliceByTwo;(m.width<1.5*e||m.height=e)){D=Math.floor(1e3*Math.abs(x-m.x)),p[D]||(p[D]={});for(let t=v.y-f;t<=v.y+f;t++)t<0||t>=s||(M=Math.floor(1e3*Math.abs(t-m.y)),p[D][M]||(p[D][M]=h(Math.sqrt(Math.pow(D*u,2)+Math.pow(M*d,2))/1e3)),C=p[D][M],C>0&&(S=4*(t*e+x),b+=C,w+=C*n[S],T+=C*n[S+1],O+=C*n[S+2],k+=C*n[S+3]))}S=4*(_*i+y),a[S]=w/b,a[S+1]=T/b,a[S+2]=O/b,a[S+3]=k/b}return++y1&&n<-1||(c=2*n*n*n-3*n*n+1,c>0&&(s=4*(t+i*e),v+=c*l[s+3],g+=c,l[s+3]<255&&(c=c*l[s+3]/250),f+=c*l[s],p+=c*l[s+1],m+=c*l[s+2],d+=c))}}u[r]=f/d,u[r+1]=p/d,u[r+2]=m/d,u[r+3]=v/g}return c}}t(Ea,"type","Resize"),t(Ea,"defaults",{resizeType:"hermite",scaleX:1,scaleY:1,lanczosLobes:3}),t(Ea,"uniformLocations",["uDelta","uTaps"]),J.setClass(Ea);class Pa extends Zo{getFragmentSource(){return"\n precision highp float;\n uniform sampler2D uTexture;\n uniform float uSaturation;\n varying vec2 vTexCoord;\n void main() {\n vec4 color = texture2D(uTexture, vTexCoord);\n float rgMax = max(color.r, color.g);\n float rgbMax = max(rgMax, color.b);\n color.r += rgbMax != color.r ? (rgbMax - color.r) * uSaturation : 0.00;\n color.g += rgbMax != color.g ? (rgbMax - color.g) * uSaturation : 0.00;\n color.b += rgbMax != color.b ? (rgbMax - color.b) * uSaturation : 0.00;\n gl_FragColor = color;\n }\n"}applyTo2d(t){let{imageData:{data:e}}=t;const s=-this.saturation;for(let t=0;t0&&void 0!==arguments[0]?arguments[0]:{};Object.assign(this,t)}addFonts(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};this.fontPaths={...this.fontPaths,...t}}removeFonts(){(arguments.length>0&&void 0!==arguments[0]?arguments[0]:[]).forEach(t=>{delete this.fontPaths[t]})}clearFonts(){this.fontPaths={}}restoreDefaults(t){const s=new e,i=(null==t?void 0:t.reduce((t,e)=>(t[e]=s[e],t),{}))||s;this.configure(i)}},i=function(t){for(var e=arguments.length,s=new Array(e>1?e-1:0),i=1;ithis.testPrecision(e,t)),e.getExtension("WEBGL_lose_context").loseContext(),i("log",`WebGL: max texture size ${this.maxTextureSize}`))}isSupported(t){return!!this.maxTextureSize&&this.maxTextureSize>=t}}const h={};let l;const c=t=>{l=t},u=()=>l||(l={document:document,window:window,isTouchSupported:"ontouchstart"in window||"ontouchstart"in document||window&&window.navigator&&window.navigator.maxTouchPoints>0,WebGLProbe:new a,dispose(){},copyPasteData:h}),d=()=>u().document,g=()=>u().window,f=()=>{var t;return Math.max(null!==(t=s.devicePixelRatio)&&void 0!==t?t:g().devicePixelRatio,1)};const p=new class{constructor(){t(this,"charWidthsCache",{}),t(this,"boundsOfCurveCache",{})}getFontCache(t){let{fontFamily:e,fontStyle:s,fontWeight:i}=t;e=e.toLowerCase(),this.charWidthsCache[e]||(this.charWidthsCache[e]={});const r=this.charWidthsCache[e],n=`${s.toLowerCase()}_${(i+"").toLowerCase()}`;return r[n]||(r[n]={}),r[n]}clearFontCache(t){(t=(t||"").toLowerCase())?this.charWidthsCache[t]&&delete this.charWidthsCache[t]:this.charWidthsCache={}}limitDimsByArea(t){const{perfLimitSizeTotal:e}=s,i=Math.sqrt(e*t);return[Math.floor(i),Math.floor(e/i)]}};const m="7.0.0-beta1";function v(){}const y=Math.PI/2,_=Math.PI/4,x=2*Math.PI,C=Math.PI/180,b=Object.freeze([1,0,0,1,0,0]),S=16,w=.4477152502,T="center",O="left",k="top",D="bottom",M="right",E="none",P=/\r?\n/,A="moving",j="scaling",F="rotating",L="rotate",R="skewing",I="resizing",B="modifyPoly",$="modifyPath",X="changed",Y="scale",W="scaleX",V="scaleY",G="skewX",z="skewY",H="fill",N="stroke",U="modified",q="json",K="svg";const J=new class{constructor(){this[q]=new Map,this[K]=new Map}has(t){return this[q].has(t)}getClass(t){const e=this[q].get(t);if(!e)throw new r(`No class registered for ${t}`);return e}setClass(t,e){e?this[q].set(e,t):(this[q].set(t.type,t),this[q].set(t.type.toLowerCase(),t))}getSVGClass(t){return this[K].get(t)}setSVGClass(t,e){this[K].set(null!=e?e:t.type.toLowerCase(),t)}};const Q=new class extends Array{remove(t){const e=this.indexOf(t);e>-1&&this.splice(e,1)}cancelAll(){const t=this.splice(0);return t.forEach(t=>t.abort()),t}cancelByCanvas(t){if(!t)return[];const e=this.filter(e=>{var s;return e.target===t||"object"==typeof e.target&&(null===(s=e.target)||void 0===s?void 0:s.canvas)===t});return e.forEach(t=>t.abort()),e}cancelByTarget(t){if(!t)return[];const e=this.filter(e=>e.target===t);return e.forEach(t=>t.abort()),e}};class Z{constructor(){t(this,"__eventListeners",{})}on(t,e){if(this.__eventListeners||(this.__eventListeners={}),"object"==typeof t)return Object.entries(t).forEach(t=>{let[e,s]=t;this.on(e,s)}),()=>this.off(t);if(e){const s=t;return this.__eventListeners[s]||(this.__eventListeners[s]=[]),this.__eventListeners[s].push(e),()=>this.off(s,e)}return()=>!1}once(t,e){if("object"==typeof t){const e=[];return Object.entries(t).forEach(t=>{let[s,i]=t;e.push(this.once(s,i))}),()=>e.forEach(t=>t())}if(e){const s=this.on(t,function(){for(var t=arguments.length,i=new Array(t),r=0;r!1}_removeEventListener(t,e){if(this.__eventListeners[t])if(e){const s=this.__eventListeners[t],i=s.indexOf(e);i>-1&&s.splice(i,1)}else this.__eventListeners[t]=[]}off(t,e){if(this.__eventListeners)if(void 0===t)for(const t in this.__eventListeners)this._removeEventListener(t);else"object"==typeof t?Object.entries(t).forEach(t=>{let[e,s]=t;this._removeEventListener(e,s)}):this._removeEventListener(t,e)}fire(t,e){var s;if(!this.__eventListeners)return;const i=null===(s=this.__eventListeners[t])||void 0===s?void 0:s.concat();if(i)for(let t=0;t{const s=t.indexOf(e);return-1!==s&&t.splice(s,1),t},et=t=>{if(0===t)return 1;switch(Math.abs(t)/y){case 1:case 3:return 0;case 2:return-1}return Math.cos(t)},st=t=>{if(0===t)return 0;const e=t/y,s=Math.sign(t);switch(e){case 1:return s;case 2:return 0;case 3:return-s}return Math.sin(t)};class it{constructor(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0,e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0;"object"==typeof t?(this.x=t.x,this.y=t.y):(this.x=t,this.y=e)}add(t){return new it(this.x+t.x,this.y+t.y)}addEquals(t){return this.x+=t.x,this.y+=t.y,this}scalarAdd(t){return new it(this.x+t,this.y+t)}scalarAddEquals(t){return this.x+=t,this.y+=t,this}subtract(t){return new it(this.x-t.x,this.y-t.y)}subtractEquals(t){return this.x-=t.x,this.y-=t.y,this}scalarSubtract(t){return new it(this.x-t,this.y-t)}scalarSubtractEquals(t){return this.x-=t,this.y-=t,this}multiply(t){return new it(this.x*t.x,this.y*t.y)}scalarMultiply(t){return new it(this.x*t,this.y*t)}scalarMultiplyEquals(t){return this.x*=t,this.y*=t,this}divide(t){return new it(this.x/t.x,this.y/t.y)}scalarDivide(t){return new it(this.x/t,this.y/t)}scalarDivideEquals(t){return this.x/=t,this.y/=t,this}eq(t){return this.x===t.x&&this.y===t.y}lt(t){return this.xt.x&&this.y>t.y}gte(t){return this.x>=t.x&&this.y>=t.y}lerp(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:.5;return e=Math.max(Math.min(1,e),0),new it(this.x+(t.x-this.x)*e,this.y+(t.y-this.y)*e)}distanceFrom(t){const e=this.x-t.x,s=this.y-t.y;return Math.sqrt(e*e+s*s)}midPointFrom(t){return this.lerp(t)}min(t){return new it(Math.min(this.x,t.x),Math.min(this.y,t.y))}max(t){return new it(Math.max(this.x,t.x),Math.max(this.y,t.y))}toString(){return`${this.x},${this.y}`}setXY(t,e){return this.x=t,this.y=e,this}setX(t){return this.x=t,this}setY(t){return this.y=t,this}setFromPoint(t){return this.x=t.x,this.y=t.y,this}swap(t){const e=this.x,s=this.y;this.x=t.x,this.y=t.y,t.x=e,t.y=s}clone(){return new it(this.x,this.y)}rotate(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:rt;const s=st(t),i=et(t),r=this.subtract(e);return new it(r.x*i-r.y*s,r.x*s+r.y*i).add(e)}transform(t){let e=arguments.length>1&&void 0!==arguments[1]&&arguments[1];return new it(t[0]*this.x+t[2]*this.y+(e?0:t[4]),t[1]*this.x+t[3]*this.y+(e?0:t[5]))}}const rt=new it(0,0),nt=t=>!!t&&Array.isArray(t._objects);function ot(e){class s extends e{constructor(){super(...arguments),t(this,"_objects",[])}_onObjectAdded(t){}_onObjectRemoved(t){}_onStackOrderChanged(t){}add(){for(var t=arguments.length,e=new Array(t),s=0;sthis._onObjectAdded(t)),i}insertAt(t){for(var e=arguments.length,s=new Array(e>1?e-1:0),i=1;ithis._onObjectAdded(t)),this._objects.length}remove(){const t=this._objects,e=[];for(var s=arguments.length,i=new Array(s),r=0;r{const i=t.indexOf(s);-1!==i&&(t.splice(i,1),e.push(s),this._onObjectRemoved(s))}),e}forEachObject(t){this.getObjects().forEach((e,s,i)=>t(e,s,i))}getObjects(){for(var t=arguments.length,e=new Array(t),s=0;st.isType(...e))}item(t){return this._objects[t]}isEmpty(){return 0===this._objects.length}size(){return this._objects.length}contains(t,e){return!!this._objects.includes(t)||!!e&&this._objects.some(e=>e instanceof s&&e.contains(t,!0))}complexity(){return this._objects.reduce((t,e)=>t+=e.complexity?e.complexity():0,0)}sendObjectToBack(t){return!(!t||t===this._objects[0])&&(tt(this._objects,t),this._objects.unshift(t),this._onStackOrderChanged(t),!0)}bringObjectToFront(t){return!(!t||t===this._objects[this._objects.length-1])&&(tt(this._objects,t),this._objects.push(t),this._onStackOrderChanged(t),!0)}sendObjectBackwards(t,e){if(!t)return!1;const s=this._objects.indexOf(t);if(0!==s){const i=this.findNewLowerIndex(t,s,e);return tt(this._objects,t),this._objects.splice(i,0,t),this._onStackOrderChanged(t),!0}return!1}bringObjectForward(t,e){if(!t)return!1;const s=this._objects.indexOf(t);if(s!==this._objects.length-1){const i=this.findNewUpperIndex(t,s,e);return tt(this._objects,t),this._objects.splice(i,0,t),this._onStackOrderChanged(t),!0}return!1}moveObjectTo(t,e){return t!==this._objects[e]&&(tt(this._objects,t),this._objects.splice(e,0,t),this._onStackOrderChanged(t),!0)}findNewLowerIndex(t,e,s){let i;if(s){i=e;for(let s=e-1;s>=0;--s)if(t.isOverlapping(this._objects[s])){i=s;break}}else i=e-1;return i}findNewUpperIndex(t,e,s){let i;if(s){i=e;for(let s=e+1;s1&&void 0!==arguments[1]?arguments[1]:{};const o=[],a=new it(e,s),h=a.add(new it(i,r));for(let t=this._objects.length-1;t>=0;t--){const e=this._objects[t];e.selectable&&e.visible&&(n&&e.intersectsWithRect(a,h)||e.isContainedWithinRect(a,h)||n&&e.containsPoint(a)||n&&e.containsPoint(h))&&o.push(e)}return o}}return s}class at extends Z{_setOptions(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};for(const e in t)this.set(e,t[e])}_setObject(t){for(const e in t)this._set(e,t[e])}set(t,e){return"object"==typeof t?this._setObject(t):this._set(t,e),this}_set(t,e){this[t]=e}toggle(t){const e=this.get(t);return"boolean"==typeof e&&this.set(t,!e),this}get(t){return this[t]}}function ht(t){return g().requestAnimationFrame(t)}function lt(t){return g().cancelAnimationFrame(t)}let ct=0;const ut=()=>ct++,dt=()=>{const t=d().createElement("canvas");if(!t||void 0===t.getContext)throw new r("Failed to create `canvas` element");return t},gt=()=>d().createElement("img"),ft=t=>{const e=dt();return e.width=t.width,e.height=t.height,e},pt=(t,e,s)=>t.toDataURL(`image/${e}`,s),mt=(t,e,s)=>new Promise((i,r)=>{t.toBlob(i,`image/${e}`,s)}),vt=t=>t*C,yt=t=>t/C,_t=t=>t.every((t,e)=>t===b[e]),xt=(t,e,s)=>new it(t).transform(e,s),Ct=t=>{const e=1/(t[0]*t[3]-t[1]*t[2]),s=[e*t[3],-e*t[1],-e*t[2],e*t[0],0,0],{x:i,y:r}=new it(t[4],t[5]).transform(s,!0);return s[4]=-i,s[5]=-r,s},bt=(t,e,s)=>[t[0]*e[0]+t[2]*e[1],t[1]*e[0]+t[3]*e[1],t[0]*e[2]+t[2]*e[3],t[1]*e[2]+t[3]*e[3],s?0:t[0]*e[4]+t[2]*e[5]+t[4],s?0:t[1]*e[4]+t[3]*e[5]+t[5]],St=(t,e)=>t.reduceRight((t,s)=>s&&t?bt(s,t,e):s||t,void 0)||b.concat(),wt=t=>{let[e,s]=t;return Math.atan2(s,e)},Tt=t=>{const e=wt(t),s=Math.pow(t[0],2)+Math.pow(t[1],2),i=Math.sqrt(s),r=(t[0]*t[3]-t[2]*t[1])/i,n=Math.atan2(t[0]*t[2]+t[1]*t[3],s);return{angle:yt(e),scaleX:i,scaleY:r,skewX:yt(n),skewY:0,translateX:t[4]||0,translateY:t[5]||0}},Ot=function(t){return[1,0,0,1,t,arguments.length>1&&void 0!==arguments[1]?arguments[1]:0]};function kt(){let{angle:t=0}=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},{x:e=0,y:s=0}=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};const i=vt(t),r=et(i),n=st(i);return[r,n,-n,r,e?e-(r*e-n*s):0,s?s-(n*e+r*s):0]}const Dt=function(t){return[t,0,0,arguments.length>1&&void 0!==arguments[1]?arguments[1]:t,0,0]},Mt=t=>Math.tan(vt(t)),Et=t=>[1,0,Mt(t),1,0,0],Pt=t=>[1,Mt(t),0,1,0,0],At=t=>{let{scaleX:e=1,scaleY:s=1,flipX:i=!1,flipY:r=!1,skewX:n=0,skewY:o=0}=t,a=Dt(i?-e:e,r?-s:s);return n&&(a=bt(a,Et(n),!0)),o&&(a=bt(a,Pt(o),!0)),a},jt=t=>{const{translateX:e=0,translateY:s=0,angle:i=0}=t;let r=Ot(e,s);i&&(r=bt(r,kt({angle:i})));const n=At(t);return _t(n)||(r=bt(r,n)),r},Ft=function(t){let{signal:e,crossOrigin:s=null}=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return new Promise(function(i,o){if(e&&e.aborted)return o(new n("loadImage"));const a=gt();let h;e&&(h=function(t){a.src="",o(t)},e.addEventListener("abort",h,{once:!0}));const l=function(){a.onload=a.onerror=null,h&&(null==e||e.removeEventListener("abort",h)),i(a)};t?(a.onload=l,a.onerror=function(){h&&(null==e||e.removeEventListener("abort",h)),o(new r(`Error loading ${a.src}`))},s&&(a.crossOrigin=s),a.src=t):l()})},Lt=function(t){let{signal:e,reviver:s=v}=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return new Promise((i,r)=>{const n=[];e&&e.addEventListener("abort",r,{once:!0}),Promise.all(t.map(t=>J.getClass(t.type).fromObject(t,{signal:e}).then(e=>(s(t,e),n.push(e),e)))).then(i).catch(t=>{n.forEach(t=>{t.dispose&&t.dispose()}),r(t)}).finally(()=>{e&&e.removeEventListener("abort",r)})})},Rt=function(t){let{signal:e}=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return new Promise((s,i)=>{const r=[];e&&e.addEventListener("abort",i,{once:!0});const n=Object.values(t).map(t=>t&&t.type&&J.has(t.type)?Lt([t],{signal:e}).then(t=>{let[e]=t;return r.push(e),e}):t),o=Object.keys(t);Promise.all(n).then(t=>t.reduce((t,e,s)=>(t[o[s]]=e,t),{})).then(s).catch(t=>{r.forEach(t=>{t.dispose&&t.dispose()}),i(t)}).finally(()=>{e&&e.removeEventListener("abort",i)})})},It=function(t){return(arguments.length>1&&void 0!==arguments[1]?arguments[1]:[]).reduce((e,s)=>(s in t&&(e[s]=t[s]),e),{})},Bt=(t,e)=>Object.keys(t).reduce((s,i)=>(e(t[i],i,t)&&(s[i]=t[i]),s),{}),$t=(t,e)=>parseFloat(Number(t).toFixed(e)),Xt=t=>"matrix("+t.map(t=>$t(t,s.NUM_FRACTION_DIGITS)).join(" ")+")",Yt=t=>!!t&&void 0!==t.toLive,Wt=t=>!!t&&"function"==typeof t.toObject,Vt=t=>!!t&&void 0!==t.offsetX&&"source"in t,Gt=t=>!!t&&"multiSelectionStacking"in t;function zt(t){const e=t&&Ht(t);let s=0,i=0;if(!t||!e)return{left:s,top:i};let r=t;const n=e.documentElement,o=e.body||{scrollLeft:0,scrollTop:0};for(;r&&(r.parentNode||r.host)&&(r=r.parentNode||r.host,r===e?(s=o.scrollLeft||n.scrollLeft||0,i=o.scrollTop||n.scrollTop||0):(s+=r.scrollLeft||0,i+=r.scrollTop||0),1!==r.nodeType||"fixed"!==r.style.position););return{left:s,top:i}}const Ht=t=>t.ownerDocument||null,Nt=t=>{var e;return(null===(e=t.ownerDocument)||void 0===e?void 0:e.defaultView)||null},Ut=function(t,e,s){let{width:i,height:r}=s,n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:1;t.width=i,t.height=r,n>1&&(t.setAttribute("width",(i*n).toString()),t.setAttribute("height",(r*n).toString()),e.scale(n,n))},qt=(t,e)=>{let{width:s,height:i}=e;s&&(t.style.width="number"==typeof s?`${s}px`:s),i&&(t.style.height="number"==typeof i?`${i}px`:i)};function Kt(t){return void 0!==t.onselectstart&&(t.onselectstart=()=>!1),t.style.userSelect=E,t}class Jt{constructor(e){t(this,"_originalCanvasStyle",void 0),t(this,"lower",void 0);const s=this.createLowerCanvas(e);this.lower={el:s,ctx:s.getContext("2d")}}createLowerCanvas(t){const e=(s=t)&&void 0!==s.getContext?t:t&&d().getElementById(t)||dt();var s;if(e.hasAttribute("data-fabric"))throw new r("Trying to initialize a canvas that has already been initialized. Did you forget to dispose the canvas?");return this._originalCanvasStyle=e.style.cssText,e.setAttribute("data-fabric","main"),e.classList.add("lower-canvas"),e}cleanupDOM(t){let{width:e,height:s}=t;const{el:i}=this.lower;i.classList.remove("lower-canvas"),i.removeAttribute("data-fabric"),i.setAttribute("width",`${e}`),i.setAttribute("height",`${s}`),i.style.cssText=this._originalCanvasStyle||"",this._originalCanvasStyle=void 0}setDimensions(t,e){const{el:s,ctx:i}=this.lower;Ut(s,i,t,e)}setCSSDimensions(t){qt(this.lower.el,t)}calcOffset(){return function(t){var e;const s=t&&Ht(t),i={left:0,top:0};if(!s)return i;const r=(null===(e=Nt(t))||void 0===e?void 0:e.getComputedStyle(t,null))||{};i.left+=parseInt(r.borderLeftWidth,10)||0,i.top+=parseInt(r.borderTopWidth,10)||0,i.left+=parseInt(r.paddingLeft,10)||0,i.top+=parseInt(r.paddingTop,10)||0;let n={left:0,top:0};const o=s.documentElement;void 0!==t.getBoundingClientRect&&(n=t.getBoundingClientRect());const a=zt(t);return{left:n.left+a.left-(o.clientLeft||0)+i.left,top:n.top+a.top-(o.clientTop||0)+i.top}}(this.lower.el)}dispose(){u().dispose(this.lower.el),delete this.lower}}const Qt={backgroundVpt:!0,backgroundColor:"",overlayVpt:!0,overlayColor:"",includeDefaultValues:!0,svgViewportTransformation:!0,renderOnAddRemove:!0,skipOffscreen:!0,enableRetinaScaling:!0,imageSmoothingEnabled:!0,controlsAboveOverlay:!1,allowTouchScrolling:!1,viewportTransform:[...b]};class Zt extends(ot(at)){get lowerCanvasEl(){var t;return null===(t=this.elements.lower)||void 0===t?void 0:t.el}get contextContainer(){var t;return null===(t=this.elements.lower)||void 0===t?void 0:t.ctx}static getDefaults(){return Zt.ownDefaults}constructor(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};super(),Object.assign(this,this.constructor.getDefaults()),this.set(e),this.initElements(t),this._setDimensionsImpl({width:this.width||this.elements.lower.el.width||0,height:this.height||this.elements.lower.el.height||0}),this.skipControlsDrawing=!1,this.viewportTransform=[...this.viewportTransform],this.calcViewportBoundaries()}initElements(t){this.elements=new Jt(t)}add(){const t=super.add(...arguments);return arguments.length>0&&this.renderOnAddRemove&&this.requestRenderAll(),t}insertAt(t){for(var e=arguments.length,s=new Array(e>1?e-1:0),i=1;i0&&this.renderOnAddRemove&&this.requestRenderAll(),r}remove(){const t=super.remove(...arguments);return t.length>0&&this.renderOnAddRemove&&this.requestRenderAll(),t}_onObjectAdded(t){t.canvas&&t.canvas!==this&&(i("warn","Canvas is trying to add an object that belongs to a different canvas.\nResulting to default behavior: removing object from previous canvas and adding to new canvas"),t.canvas.remove(t)),t._set("canvas",this),t.setCoords(),this.fire("object:added",{target:t}),t.fire("added",{target:this})}_onObjectRemoved(t){t._set("canvas",void 0),this.fire("object:removed",{target:t}),t.fire("removed",{target:this})}_onStackOrderChanged(){this.renderOnAddRemove&&this.requestRenderAll()}getRetinaScaling(){return this.enableRetinaScaling?f():1}calcOffset(){return this._offset=this.elements.calcOffset()}getWidth(){return this.width}getHeight(){return this.height}_setDimensionsImpl(t){let{cssOnly:e=!1,backstoreOnly:s=!1}=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if(!e){const e={width:this.width,height:this.height,...t};this.elements.setDimensions(e,this.getRetinaScaling()),this.hasLostContext=!0,this.width=e.width,this.height=e.height}s||this.elements.setCSSDimensions(t),this.calcOffset()}setDimensions(t,e){this._setDimensionsImpl(t,e),e&&e.cssOnly||this.requestRenderAll()}getZoom(){return this.viewportTransform[0]}setViewportTransform(t){this.viewportTransform=t,this.calcViewportBoundaries(),this.renderOnAddRemove&&this.requestRenderAll()}zoomToPoint(t,e){const s=t,i=[...this.viewportTransform],r=xt(t,Ct(i));i[0]=e,i[3]=e;const n=xt(r,i);i[4]+=s.x-n.x,i[5]+=s.y-n.y,this.setViewportTransform(i)}setZoom(t){this.zoomToPoint(new it(0,0),t)}absolutePan(t){const e=[...this.viewportTransform];return e[4]=-t.x,e[5]=-t.y,this.setViewportTransform(e)}relativePan(t){return this.absolutePan(new it(-t.x-this.viewportTransform[4],-t.y-this.viewportTransform[5]))}getElement(){return this.elements.lower.el}clearContext(t){t.clearRect(0,0,this.width,this.height)}getContext(){return this.elements.lower.ctx}clear(){this.remove(...this.getObjects()),this.backgroundImage=void 0,this.overlayImage=void 0,this.backgroundColor="",this.overlayColor="",this.clearContext(this.getContext()),this.fire("canvas:cleared"),this.renderOnAddRemove&&this.requestRenderAll()}renderAll(){this.cancelRequestedRender(),this.destroyed||this.renderCanvas(this.getContext(),this._objects)}renderAndReset(){this.nextRenderHandle=0,this.renderAll()}requestRenderAll(){this.nextRenderHandle||this.disposed||this.destroyed||(this.nextRenderHandle=ht(()=>this.renderAndReset()))}calcViewportBoundaries(){const t=this.width,e=this.height,s=Ct(this.viewportTransform),i=xt({x:0,y:0},s),r=xt({x:t,y:e},s),n=i.min(r),o=i.max(r);return this.vptCoords={tl:n,tr:new it(o.x,n.y),bl:new it(n.x,o.y),br:o}}cancelRequestedRender(){this.nextRenderHandle&&(lt(this.nextRenderHandle),this.nextRenderHandle=0)}drawControls(t){}renderCanvas(t,e){if(this.destroyed)return;const s=this.viewportTransform,i=this.clipPath;this.calcViewportBoundaries(),this.clearContext(t),t.imageSmoothingEnabled=this.imageSmoothingEnabled,t.patternQuality="best",this.fire("before:render",{ctx:t}),this._renderBackground(t),t.save(),t.transform(s[0],s[1],s[2],s[3],s[4],s[5]),this._renderObjects(t,e),t.restore(),this.controlsAboveOverlay||this.skipControlsDrawing||this.drawControls(t),i&&(i._set("canvas",this),i.shouldCache(),i._transformDone=!0,i.renderCache({forClipping:!0}),this.drawClipPathOnCanvas(t,i)),this._renderOverlay(t),this.controlsAboveOverlay&&!this.skipControlsDrawing&&this.drawControls(t),this.fire("after:render",{ctx:t}),this.__cleanupTask&&(this.__cleanupTask(),this.__cleanupTask=void 0)}drawClipPathOnCanvas(t,e){const s=this.viewportTransform;t.save(),t.transform(...s),t.globalCompositeOperation="destination-in",e.transform(t),t.scale(1/e.zoomX,1/e.zoomY),t.drawImage(e._cacheCanvas,-e.cacheTranslationX,-e.cacheTranslationY),t.restore()}_renderObjects(t,e){for(let s=0,i=e.length;s!t.excludeFromExport).map(s=>this._toObject(s,t,e)),...this.__serializeBgOverlay(t,e),...i?{clipPath:i}:null}}_toObject(t,e,s){let i;this.includeDefaultValues||(i=t.includeDefaultValues,t.includeDefaultValues=!1);const r=t[e](s);return this.includeDefaultValues||(t.includeDefaultValues=!!i),r}__serializeBgOverlay(t,e){const s={},i=this.backgroundImage,r=this.overlayImage,n=this.backgroundColor,o=this.overlayColor;return Yt(n)?n.excludeFromExport||(s.background=n.toObject(e)):n&&(s.background=n),Yt(o)?o.excludeFromExport||(s.overlay=o.toObject(e)):o&&(s.overlay=o),i&&!i.excludeFromExport&&(s.backgroundImage=this._toObject(i,t,e)),r&&!r.excludeFromExport&&(s.overlayImage=this._toObject(r,t,e)),s}toSVG(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},e=arguments.length>1?arguments[1]:void 0;t.reviver=e;const s=[];return this._setSVGPreamble(s,t),this._setSVGHeader(s,t),this.clipPath&&s.push(`\n`),this._setSVGBgOverlayColor(s,"background"),this._setSVGBgOverlayImage(s,"backgroundImage",e),this._setSVGObjects(s,e),this.clipPath&&s.push("\n"),this._setSVGBgOverlayColor(s,"overlay"),this._setSVGBgOverlayImage(s,"overlayImage",e),s.push(""),s.join("")}_setSVGPreamble(t,e){e.suppressPreamble||t.push('\n','\n')}_setSVGHeader(t,e){const i=e.width||`${this.width}`,r=e.height||`${this.height}`,n=s.NUM_FRACTION_DIGITS,o=e.viewBox;let a;if(o)a=`viewBox="${o.x} ${o.y} ${o.width} ${o.height}" `;else if(this.svgViewportTransformation){const t=this.viewportTransform;a=`viewBox="${$t(-t[4]/t[0],n)} ${$t(-t[5]/t[3],n)} ${$t(this.width/t[0],n)} ${$t(this.height/t[3],n)}" `}else a=`viewBox="0 0 ${this.width} ${this.height}" `;t.push("\n',"Created with Fabric.js ",m,"\n","\n",this.createSVGFontFacesMarkup(),this.createSVGRefElementsMarkup(),this.createSVGClipPathMarkup(e),"\n")}createSVGClipPathMarkup(t){const e=this.clipPath;return e?(e.clipPathId=`CLIPPATH_${ut()}`,`\n${e.toClipPathSVG(t.reviver)}\n`):""}createSVGRefElementsMarkup(){return["background","overlay"].map(t=>{const e=this[`${t}Color`];if(Yt(e)){const s=this[`${t}Vpt`],i=this.viewportTransform,r={isType:()=>!1,width:this.width/(s?i[0]:1),height:this.height/(s?i[3]:1)};return e.toSVG(r,{additionalTransform:s?Xt(i):""})}}).join("")}createSVGFontFacesMarkup(){const t=[],e={},i=s.fontPaths;this._objects.forEach(function e(s){t.push(s),nt(s)&&s._objects.forEach(e)}),t.forEach(t=>{if(!(s=t)||"function"!=typeof s._renderText)return;var s;const{styles:r,fontFamily:n}=t;!e[n]&&i[n]&&(e[n]=!0,r&&Object.values(r).forEach(t=>{Object.values(t).forEach(t=>{let{fontFamily:s=""}=t;!e[s]&&i[s]&&(e[s]=!0)})}))});const r=Object.keys(e).map(t=>`\t\t@font-face {\n\t\t\tfont-family: '${t}';\n\t\t\tsrc: url('${i[t]}');\n\t\t}\n`).join("");return r?`\t\n`:""}_setSVGObjects(t,e){this.forEachObject(s=>{s.excludeFromExport||this._setSVGObject(t,s,e)})}_setSVGObject(t,e,s){t.push(e.toSVG(s))}_setSVGBgOverlayImage(t,e,s){const i=this[e];i&&!i.excludeFromExport&&i.toSVG&&t.push(i.toSVG(s))}_setSVGBgOverlayColor(t,e){const s=this[`${e}Color`];if(s)if(Yt(s)){const i=s.repeat||"",r=this.width,n=this.height,o=this[`${e}Vpt`]?Xt(Ct(this.viewportTransform)):"";t.push(`\n`)}else t.push('\n")}loadFromJSON(t,e){let{signal:s}=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};if(!t)return Promise.reject(new r("`json` is undefined"));const{objects:i=[],...n}="string"==typeof t?JSON.parse(t):t,{backgroundImage:o,background:a,overlayImage:h,overlay:l,clipPath:c}=n,u=this.renderOnAddRemove;return this.renderOnAddRemove=!1,Promise.all([Lt(i,{reviver:e,signal:s}),Rt({backgroundImage:o,backgroundColor:a,overlayImage:h,overlayColor:l,clipPath:c},{signal:s})]).then(t=>{let[e,s]=t;return this.clear(),this.add(...e),this.set(n),this.set(s),this.renderOnAddRemove=u,this})}clone(t){const e=this.toObject(t);return this.cloneWithoutData().loadFromJSON(e)}cloneWithoutData(){const t=ft(this);return new this.constructor(t)}toDataURL(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};const{format:e="png",quality:s=1,multiplier:i=1,enableRetinaScaling:r=!1}=t,n=i*(r?this.getRetinaScaling():1);return pt(this.toCanvasElement(n,t),e,s)}toBlob(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};const{format:e="png",quality:s=1,multiplier:i=1,enableRetinaScaling:r=!1}=t,n=i*(r?this.getRetinaScaling():1);return mt(this.toCanvasElement(n,t),e,s)}toCanvasElement(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:1,{width:e,height:s,left:i,top:r,filter:n}=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};const o=(e||this.width)*t,a=(s||this.height)*t,h=this.getZoom(),l=this.width,c=this.height,u=this.skipControlsDrawing,d=h*t,g=this.viewportTransform,f=[d,0,0,d,(g[4]-(i||0))*t,(g[5]-(r||0))*t],p=this.enableRetinaScaling,m=ft({width:o,height:a}),v=n?this._objects.filter(t=>n(t)):this._objects;return this.enableRetinaScaling=!1,this.viewportTransform=f,this.width=o,this.height=a,this.skipControlsDrawing=!0,this.calcViewportBoundaries(),this.renderCanvas(m.getContext("2d"),v),this.viewportTransform=g,this.width=l,this.height=c,this.calcViewportBoundaries(),this.enableRetinaScaling=p,this.skipControlsDrawing=u,m}dispose(){return!this.disposed&&this.elements.cleanupDOM({width:this.width,height:this.height}),Q.cancelByCanvas(this),this.disposed=!0,new Promise((t,e)=>{const s=()=>{this.destroy(),t(!0)};s.kill=e,this.__cleanupTask&&this.__cleanupTask.kill("aborted"),this.destroyed?t(!1):this.nextRenderHandle?this.__cleanupTask=s:s()})}destroy(){this.destroyed=!0,this.cancelRequestedRender(),this.forEachObject(t=>t.dispose()),this._objects=[],this.backgroundImage&&this.backgroundImage.dispose(),this.backgroundImage=void 0,this.overlayImage&&this.overlayImage.dispose(),this.overlayImage=void 0,this.elements.dispose()}toString(){return`#`}}t(Zt,"ownDefaults",Qt);const te=["touchstart","touchmove","touchend"];const ee=t=>{const e=zt(t.target),s=function(t){const e=t.changedTouches;return e&&e[0]?e[0]:t}(t);return new it(s.clientX+e.left,s.clientY+e.top)},se=t=>te.includes(t.type)||"touch"===t.pointerType,ie=t=>{t.preventDefault(),t.stopPropagation()},re=t=>{let e=0,s=0,i=0,r=0;for(let n=0,o=t.length;ni||!n)&&(i=o),(or||!n)&&(r=a),(aoe(t,bt(e,t.calcOwnMatrix())),oe=(t,e)=>{const{translateX:s,translateY:i,scaleX:r,scaleY:n,...o}=Tt(e),a=new it(s,i);t.flipX=!1,t.flipY=!1,Object.assign(t,o),t.set({scaleX:r,scaleY:n}),t.setPositionByOrigin(a,T,T)},ae=t=>{t.scaleX=1,t.scaleY=1,t.skewX=0,t.skewY=0,t.flipX=!1,t.flipY=!1,t.rotate(0)},he=t=>({scaleX:t.scaleX,scaleY:t.scaleY,skewX:t.skewX,skewY:t.skewY,angle:t.angle,left:t.left,flipX:t.flipX,flipY:t.flipY,top:t.top}),le=(t,e,s)=>{const i=t/2,r=e/2,n=[new it(-i,-r),new it(i,-r),new it(-i,r),new it(i,r)].map(t=>t.transform(s)),o=re(n);return new it(o.width,o.height)},ce=function(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:b;return bt(Ct(arguments.length>1&&void 0!==arguments[1]?arguments[1]:b),t)},ue=function(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:b,s=arguments.length>2&&void 0!==arguments[2]?arguments[2]:b;return t.transform(ce(e,s))},de=function(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:b,s=arguments.length>2&&void 0!==arguments[2]?arguments[2]:b;return t.transform(ce(e,s),!0)},ge=(t,e,s)=>{const i=ce(e,s);return oe(t,bt(i,t.calcOwnMatrix())),i},fe=(t,e)=>{var s;const{transform:{target:i}}=e;null===(s=i.canvas)||void 0===s||s.fire(`object:${t}`,{...e,target:i}),i.fire(t,e)},pe={left:-.5,top:-.5,center:0,bottom:.5,right:.5},me=t=>"string"==typeof t?pe[t]:t-.5,ve=new it(1,0),ye=new it,_e=(t,e)=>t.rotate(e),xe=(t,e)=>new it(e).subtract(t),Ce=t=>t.distanceFrom(ye),be=(t,e)=>Math.atan2(Oe(t,e),ke(t,e)),Se=t=>be(ve,t),we=t=>t.eq(ye)?t:t.scalarDivide(Ce(t)),Te=function(t){let e=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];return we(new it(-t.y,t.x).scalarMultiply(e?1:-1))},Oe=(t,e)=>t.x*e.y-t.y*e.x,ke=(t,e)=>t.x*e.x+t.y*e.y,De=(t,e,s)=>{if(t.eq(e)||t.eq(s))return!0;const i=Oe(e,s),r=Oe(e,t),n=Oe(s,t);return i>=0?r>=0&&n<=0:!(r<=0&&n>=0)},Me="not-allowed";function Ee(t){return me(t.originX)===me(T)&&me(t.originY)===me(T)}function Pe(t){return.5-me(t)}const Ae=(t,e)=>t[e],je=(t,e,s,i)=>({e:t,transform:e,pointer:new it(s,i)});function Fe(t,e,s){const i=s,r=ue(t.getCenterPoint(),t.canvas.viewportTransform,void 0),n=Se(xe(r,i))+x;return Math.round(n%x/_)}function Le(t,e,s,i,r){var n;let{target:o,corner:a}=t;const h=o.controls[a],l=(null===(n=o.canvas)||void 0===n?void 0:n.getZoom())||1,c=o.padding/l,u=function(t,e,s,i){const r=t.getRelativeCenterPoint(),n=void 0!==s&&void 0!==i?t.translateToGivenOrigin(r,T,T,s,i):new it(t.left,t.top);return(t.angle?e.rotate(-vt(t.angle),r):e).subtract(n)}(o,new it(i,r),e,s);return u.x>=c&&(u.x-=c),u.x<=-c&&(u.x+=c),u.y>=c&&(u.y-=c),u.y<=c&&(u.y+=c),u.x-=h.offsetX,u.y-=h.offsetY,u}const Re=(t,e,s,i)=>{const{target:r,offsetX:n,offsetY:o}=e,a=s-n,h=i-o,l=!Ae(r,"lockMovementX")&&r.left!==a,c=!Ae(r,"lockMovementY")&&r.top!==h;return l&&r.set(O,a),c&&r.set(k,h),(l||c)&&fe(A,je(t,e,s,i)),l||c},Ie={aliceblue:"#F0F8FF",antiquewhite:"#FAEBD7",aqua:"#0FF",aquamarine:"#7FFFD4",azure:"#F0FFFF",beige:"#F5F5DC",bisque:"#FFE4C4",black:"#000",blanchedalmond:"#FFEBCD",blue:"#00F",blueviolet:"#8A2BE2",brown:"#A52A2A",burlywood:"#DEB887",cadetblue:"#5F9EA0",chartreuse:"#7FFF00",chocolate:"#D2691E",coral:"#FF7F50",cornflowerblue:"#6495ED",cornsilk:"#FFF8DC",crimson:"#DC143C",cyan:"#0FF",darkblue:"#00008B",darkcyan:"#008B8B",darkgoldenrod:"#B8860B",darkgray:"#A9A9A9",darkgrey:"#A9A9A9",darkgreen:"#006400",darkkhaki:"#BDB76B",darkmagenta:"#8B008B",darkolivegreen:"#556B2F",darkorange:"#FF8C00",darkorchid:"#9932CC",darkred:"#8B0000",darksalmon:"#E9967A",darkseagreen:"#8FBC8F",darkslateblue:"#483D8B",darkslategray:"#2F4F4F",darkslategrey:"#2F4F4F",darkturquoise:"#00CED1",darkviolet:"#9400D3",deeppink:"#FF1493",deepskyblue:"#00BFFF",dimgray:"#696969",dimgrey:"#696969",dodgerblue:"#1E90FF",firebrick:"#B22222",floralwhite:"#FFFAF0",forestgreen:"#228B22",fuchsia:"#F0F",gainsboro:"#DCDCDC",ghostwhite:"#F8F8FF",gold:"#FFD700",goldenrod:"#DAA520",gray:"#808080",grey:"#808080",green:"#008000",greenyellow:"#ADFF2F",honeydew:"#F0FFF0",hotpink:"#FF69B4",indianred:"#CD5C5C",indigo:"#4B0082",ivory:"#FFFFF0",khaki:"#F0E68C",lavender:"#E6E6FA",lavenderblush:"#FFF0F5",lawngreen:"#7CFC00",lemonchiffon:"#FFFACD",lightblue:"#ADD8E6",lightcoral:"#F08080",lightcyan:"#E0FFFF",lightgoldenrodyellow:"#FAFAD2",lightgray:"#D3D3D3",lightgrey:"#D3D3D3",lightgreen:"#90EE90",lightpink:"#FFB6C1",lightsalmon:"#FFA07A",lightseagreen:"#20B2AA",lightskyblue:"#87CEFA",lightslategray:"#789",lightslategrey:"#789",lightsteelblue:"#B0C4DE",lightyellow:"#FFFFE0",lime:"#0F0",limegreen:"#32CD32",linen:"#FAF0E6",magenta:"#F0F",maroon:"#800000",mediumaquamarine:"#66CDAA",mediumblue:"#0000CD",mediumorchid:"#BA55D3",mediumpurple:"#9370DB",mediumseagreen:"#3CB371",mediumslateblue:"#7B68EE",mediumspringgreen:"#00FA9A",mediumturquoise:"#48D1CC",mediumvioletred:"#C71585",midnightblue:"#191970",mintcream:"#F5FFFA",mistyrose:"#FFE4E1",moccasin:"#FFE4B5",navajowhite:"#FFDEAD",navy:"#000080",oldlace:"#FDF5E6",olive:"#808000",olivedrab:"#6B8E23",orange:"#FFA500",orangered:"#FF4500",orchid:"#DA70D6",palegoldenrod:"#EEE8AA",palegreen:"#98FB98",paleturquoise:"#AFEEEE",palevioletred:"#DB7093",papayawhip:"#FFEFD5",peachpuff:"#FFDAB9",peru:"#CD853F",pink:"#FFC0CB",plum:"#DDA0DD",powderblue:"#B0E0E6",purple:"#800080",rebeccapurple:"#639",red:"#F00",rosybrown:"#BC8F8F",royalblue:"#4169E1",saddlebrown:"#8B4513",salmon:"#FA8072",sandybrown:"#F4A460",seagreen:"#2E8B57",seashell:"#FFF5EE",sienna:"#A0522D",silver:"#C0C0C0",skyblue:"#87CEEB",slateblue:"#6A5ACD",slategray:"#708090",slategrey:"#708090",snow:"#FFFAFA",springgreen:"#00FF7F",steelblue:"#4682B4",tan:"#D2B48C",teal:"#008080",thistle:"#D8BFD8",tomato:"#FF6347",turquoise:"#40E0D0",violet:"#EE82EE",wheat:"#F5DEB3",white:"#FFF",whitesmoke:"#F5F5F5",yellow:"#FF0",yellowgreen:"#9ACD32"},Be=(t,e,s)=>(s<0&&(s+=1),s>1&&(s-=1),s<1/6?t+6*(e-t)*s:s<.5?e:s<2/3?t+(e-t)*(2/3-s)*6:t),$e=(t,e,s,i)=>{t/=255,e/=255,s/=255;const r=Math.max(t,e,s),n=Math.min(t,e,s);let o,a;const h=(r+n)/2;if(r===n)o=a=0;else{const i=r-n;switch(a=h>.5?i/(2-r-n):i/(r+n),r){case t:o=(e-s)/i+(e0&&void 0!==arguments[0]?arguments[0]:"1";return parseFloat(t)/(t.endsWith("%")?100:1)},Ye=t=>Math.min(Math.round(t),255).toString(16).toUpperCase().padStart(2,"0"),We=t=>{let[e,s,i,r=1]=t;const n=Math.round(.3*e+.59*s+.11*i);return[n,n,n,r]};class Ve{constructor(e){if(t(this,"isUnrecognised",!1),e)if(e instanceof Ve)this.setSource([...e._source]);else if(Array.isArray(e)){const[t,s,i,r=1]=e;this.setSource([t,s,i,r])}else this.setSource(this._tryParsingColor(e));else this.setSource([0,0,0,1])}_tryParsingColor(t){return(t=t.toLowerCase())in Ie&&(t=Ie[t]),"transparent"===t?[255,255,255,0]:Ve.sourceFromHex(t)||Ve.sourceFromRgb(t)||Ve.sourceFromHsl(t)||(this.isUnrecognised=!0)&&[0,0,0,1]}getSource(){return this._source}setSource(t){this._source=t}toRgb(){const[t,e,s]=this.getSource();return`rgb(${t},${e},${s})`}toRgba(){return`rgba(${this.getSource().join(",")})`}toHsl(){const[t,e,s]=$e(...this.getSource());return`hsl(${t},${e}%,${s}%)`}toHsla(){const[t,e,s,i]=$e(...this.getSource());return`hsla(${t},${e}%,${s}%,${i})`}toHex(){return this.toHexa().slice(0,6)}toHexa(){const[t,e,s,i]=this.getSource();return`${Ye(t)}${Ye(e)}${Ye(s)}${Ye(Math.round(255*i))}`}getAlpha(){return this.getSource()[3]}setAlpha(t){return this._source[3]=t,this}toGrayscale(){return this.setSource(We(this.getSource())),this}toBlackWhite(t){const[e,,,s]=We(this.getSource()),i=e<(t||127)?0:255;return this.setSource([i,i,i,s]),this}overlayWith(t){t instanceof Ve||(t=new Ve(t));const e=this.getSource(),s=t.getSource(),[i,r,n]=e.map((t,e)=>Math.round(.5*t+.5*s[e]));return this.setSource([i,r,n,e[3]]),this}static fromRgb(t){return Ve.fromRgba(t)}static fromRgba(t){return new Ve(Ve.sourceFromRgb(t))}static sourceFromRgb(t){const e=t.match(/^rgba?\(\s*(\d{0,3}(?:\.\d+)?%?)\s*[\s|,]\s*(\d{0,3}(?:\.\d+)?%?)\s*[\s|,]\s*(\d{0,3}(?:\.\d+)?%?)\s*(?:\s*[,/]\s*(\d{0,3}(?:\.\d+)?%?)\s*)?\)$/i);if(e){const[t,s,i]=e.slice(1,4).map(t=>{const e=parseFloat(t);return t.endsWith("%")?Math.round(2.55*e):e});return[t,s,i,Xe(e[4])]}}static fromHsl(t){return Ve.fromHsla(t)}static fromHsla(t){return new Ve(Ve.sourceFromHsl(t))}static sourceFromHsl(t){const e=t.match(/^hsla?\(\s*([+-]?\d{0,3}(?:\.\d+)?(?:deg|turn|rad)?)\s*[\s|,]\s*(\d{0,3}(?:\.\d+)?%?)\s*[\s|,]\s*(\d{0,3}(?:\.\d+)?%?)\s*(?:\s*[,/]\s*(\d*(?:\.\d+)?%?)\s*)?\)$/i);if(!e)return;const s=(Ve.parseAngletoDegrees(e[1])%360+360)%360/360,i=parseFloat(e[2])/100,r=parseFloat(e[3])/100;let n,o,a;if(0===i)n=o=a=r;else{const t=r<=.5?r*(i+1):r+i-r*i,e=2*r-t;n=Be(e,t,s+1/3),o=Be(e,t,s),a=Be(e,t,s-1/3)}return[Math.round(255*n),Math.round(255*o),Math.round(255*a),Xe(e[4])]}static fromHex(t){return new Ve(Ve.sourceFromHex(t))}static sourceFromHex(t){if(t.match(/^#?(([0-9a-f]){3,4}|([0-9a-f]{2}){3,4})$/i)){const e=t.slice(t.indexOf("#")+1);let s;s=e.length<=4?e.split("").map(t=>t+t):e.match(/.{2}/g);const[i,r,n,o=255]=s.map(t=>parseInt(t,16));return[i,r,n,o/255]}}static parseAngletoDegrees(t){const e=t.toLowerCase(),s=parseFloat(e);return e.includes("rad")?yt(s):e.includes("turn")?360*s:s}}const Ge=function(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:S;const i=/\D{0,2}$/.exec(t),r=parseFloat(t),n=s.DPI;switch(null==i?void 0:i[0]){case"mm":return r*n/25.4;case"cm":return r*n/2.54;case"in":return r*n;case"pt":return r*n/72;case"pc":return r*n/72*12;case"em":return r*e;default:return r}},ze=t=>{const[e,s]=t.trim().split(" "),[i,r]=(n=e)&&n!==E?[n.slice(1,4),n.slice(5,8)]:n===E?[n,n]:["Mid","Mid"];var n;return{meetOrSlice:s||"meet",alignX:i,alignY:r}},He=function(t,e){let s,i,r=!(arguments.length>2&&void 0!==arguments[2])||arguments[2];if(e)if(e.toLive)s=`url(#SVGID_${e.id})`;else{const t=new Ve(e),r=t.getAlpha();s=t.toRgb(),1!==r&&(i=r.toString())}else s="none";return r?`${t}: ${s}; ${i?`${t}-opacity: ${i}; `:""}`:`${t}="${s}" ${i?`${t}-opacity="${i}" `:""}`};class Ne{getSvgStyles(t){const e=this.fillRule?this.fillRule:"nonzero",s=this.strokeWidth?this.strokeWidth:"0",i=this.strokeDashArray?this.strokeDashArray.join(" "):E,r=this.strokeDashOffset?this.strokeDashOffset:"0",n=this.strokeLineCap?this.strokeLineCap:"butt",o=this.strokeLineJoin?this.strokeLineJoin:"miter",a=this.strokeMiterLimit?this.strokeMiterLimit:"4",h=void 0!==this.opacity?this.opacity:"1",l=this.visible?"":" visibility: hidden;",c=t?"":this.getSvgFilter(),u=He(H,this.fill);return[He(N,this.stroke),"stroke-width: ",s,"; ","stroke-dasharray: ",i,"; ","stroke-linecap: ",n,"; ","stroke-dashoffset: ",r,"; ","stroke-linejoin: ",o,"; ","stroke-miterlimit: ",a,"; ",u,"fill-rule: ",e,"; ","opacity: ",h,";",c,l].join("")}getSvgFilter(){return this.shadow?`filter: url(#SVGID_${this.shadow.id});`:""}getSvgCommons(){return[this.id?`id="${this.id}" `:"",this.clipPath?`clip-path="url(#${this.clipPath.clipPathId})" `:""].join("")}getSvgTransform(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"";const s=t?this.calcTransformMatrix():this.calcOwnMatrix();return`${`transform="${Xt(s)}`}${e}" `}_toSVG(t){return[""]}toSVG(t){return this._createBaseSVGMarkup(this._toSVG(t),{reviver:t})}toClipPathSVG(t){return"\t"+this._createBaseClipPathSVGMarkup(this._toSVG(t),{reviver:t})}_createBaseClipPathSVGMarkup(t){let{reviver:e,additionalTransform:s=""}=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};const i=[this.getSvgTransform(!0,s),this.getSvgCommons()].join(""),r=t.indexOf("COMMON_PARTS");return t[r]=i,e?e(t.join("")):t.join("")}_createBaseSVGMarkup(t){let{noStyle:e,reviver:s,withShadow:i,additionalTransform:r}=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};const n=e?"":`style="${this.getSvgStyles()}" `,o=i?`style="${this.getSvgFilter()}" `:"",a=this.clipPath,h=this.strokeUniform?'vector-effect="non-scaling-stroke" ':"",l=a&&a.absolutePositioned,c=this.stroke,u=this.fill,d=this.shadow,g=[],f=t.indexOf("COMMON_PARTS");let p;a&&(a.clipPathId=`CLIPPATH_${ut()}`,p=`\n${a.toClipPathSVG(s)}\n`),l&&g.push("\n"),g.push("\n");const m=[n,h,e?"":this.addPaintOrder()," ",r?`transform="${r}" `:""].join("");return t[f]=m,Yt(u)&&g.push(u.toSVG(this)),Yt(c)&&g.push(c.toSVG(this)),d&&g.push(d.toSVG(this)),a&&g.push(p),g.push(t.join("")),g.push("\n"),l&&g.push("\n"),s?s(g.join("")):g.join("")}addPaintOrder(){return this.paintFirst!==H?` paint-order="${this.paintFirst}" `:""}}function Ue(t){return new RegExp("^("+t.join("|")+")\\b","i")}const qe="textDecorationThickness",Ke=["fontSize","fontWeight","fontFamily","fontStyle"],Je=["underline","overline","linethrough"],Qe=[...Ke,"lineHeight","text","charSpacing","textAlign","styles","path","pathStartOffset","pathSide","pathAlign"],Ze=[...Qe,...Je,"textBackgroundColor","direction",qe],ts=[...Ke,...Je,N,"strokeWidth",H,"deltaY","textBackgroundColor",qe],es={_reNewline:P,_reSpacesAndTabs:/[ \t\r]/g,_reSpaceAndTab:/[ \t\r]/,_reWords:/\S+/g,fontSize:40,fontWeight:"normal",fontFamily:"Times New Roman",underline:!1,overline:!1,linethrough:!1,textAlign:O,fontStyle:"normal",lineHeight:1.16,textBackgroundColor:"",stroke:null,shadow:null,path:void 0,pathStartOffset:0,pathSide:O,pathAlign:"baseline",charSpacing:0,deltaY:0,direction:"ltr",CACHE_FONT_SIZE:400,MIN_TEXT_WIDTH:2,superscript:{size:.6,baseline:-.35},subscript:{size:.6,baseline:.11},_fontSizeFraction:.222,offsets:{underline:.1,linethrough:-.28167,overline:-.81333},_fontSizeMult:1.13,[qe]:66.667},ss="justify",is="justify-left",rs="justify-right",ns="justify-center",os=String.raw`[-+]?(?:\d*\.\d+|\d+\.?)(?:[eE][-+]?\d+)?`,as=String.raw`(?:\s*,?\s+|\s*,\s*)`,hs="http://www.w3.org/2000/svg",ls=new RegExp("(normal|italic)?\\s*(normal|small-caps)?\\s*(normal|bold|bolder|lighter|100|200|300|400|500|600|700|800|900)?\\s*("+os+"(?:px|cm|mm|em|pt|pc|in)*)(?:\\/(normal|"+os+"))?\\s+(.*)"),cs={cx:O,x:O,r:"radius",cy:k,y:k,display:"visible",visibility:"visible",transform:"transformMatrix","fill-opacity":"fillOpacity","fill-rule":"fillRule","font-family":"fontFamily","font-size":"fontSize","font-style":"fontStyle","font-weight":"fontWeight","letter-spacing":"charSpacing","paint-order":"paintFirst","stroke-dasharray":"strokeDashArray","stroke-dashoffset":"strokeDashOffset","stroke-linecap":"strokeLineCap","stroke-linejoin":"strokeLineJoin","stroke-miterlimit":"strokeMiterLimit","stroke-opacity":"strokeOpacity","stroke-width":"strokeWidth","text-decoration":"textDecoration","text-anchor":"textAnchor",opacity:"opacity","clip-path":"clipPath","clip-rule":"clipRule","vector-effect":"strokeUniform","image-rendering":"imageSmoothing","text-decoration-thickness":qe},us="font-size",ds="clip-path",gs=Ue(["path","circle","polygon","polyline","ellipse","rect","line","image","text"]),fs=Ue(["symbol","image","marker","pattern","view","svg"]),ps=Ue(["symbol","g","a","svg","clipPath","defs"]),ms=new RegExp(String.raw`^\s*(${os})${as}(${os})${as}(${os})${as}(${os})\s*$`),vs="(-?\\d+(?:\\.\\d*)?(?:px)?(?:\\s?|$))?",ys=new RegExp("(?:\\s|^)"+vs+vs+"("+os+"?(?:px)?)?(?:\\s?|$)(?:$|\\s)");class _s{constructor(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};const e="string"==typeof t?_s.parseShadow(t):t;Object.assign(this,_s.ownDefaults,e),this.id=ut()}static parseShadow(t){const e=t.trim(),[,s=0,i=0,r=0]=(ys.exec(e)||[]).map(t=>parseFloat(t)||0);return{color:(e.replace(ys,"")||"rgb(0,0,0)").trim(),offsetX:s,offsetY:i,blur:r}}toString(){return[this.offsetX,this.offsetY,this.blur,this.color].join("px ")}toSVG(t){const e=_e(new it(this.offsetX,this.offsetY),vt(-t.angle)),i=new Ve(this.color);let r=40,n=40;return t.width&&t.height&&(r=100*$t((Math.abs(e.x)+this.blur)/t.width,s.NUM_FRACTION_DIGITS)+20,n=100*$t((Math.abs(e.y)+this.blur)/t.height,s.NUM_FRACTION_DIGITS)+20),t.flipX&&(e.x*=-1),t.flipY&&(e.y*=-1),`\n\t\n\t\n\t\n\t\n\t\n\t\t\n\t\t\n\t\n\n`}toObject(){const t={color:this.color,blur:this.blur,offsetX:this.offsetX,offsetY:this.offsetY,affectStroke:this.affectStroke,nonScaling:this.nonScaling,type:this.constructor.type},e=_s.ownDefaults;return this.includeDefaultValues?t:Bt(t,(t,s)=>t!==e[s])}static async fromObject(t){return new this(t)}}t(_s,"ownDefaults",{color:"rgb(0,0,0)",blur:0,offsetX:0,offsetY:0,affectStroke:!1,includeDefaultValues:!0,nonScaling:!1}),t(_s,"type","shadow"),J.setClass(_s,"shadow");const xs=(t,e,s)=>Math.max(t,Math.min(e,s)),Cs=[k,O,W,V,"flipX","flipY","originX","originY","angle","opacity","globalCompositeOperation","shadow","visible",G,z],bs=[H,N,"strokeWidth","strokeDashArray","width","height","paintFirst","strokeUniform","strokeLineCap","strokeDashOffset","strokeLineJoin","strokeMiterLimit","backgroundColor","clipPath"],Ss={top:0,left:0,width:0,height:0,angle:0,flipX:!1,flipY:!1,scaleX:1,scaleY:1,minScaleLimit:0,skewX:0,skewY:0,originX:O,originY:k,strokeWidth:1,strokeUniform:!1,padding:0,opacity:1,paintFirst:H,fill:"rgb(0,0,0)",fillRule:"nonzero",stroke:null,strokeDashArray:null,strokeDashOffset:0,strokeLineCap:"butt",strokeLineJoin:"miter",strokeMiterLimit:4,globalCompositeOperation:"source-over",backgroundColor:"",shadow:null,visible:!0,includeDefaultValues:!0,excludeFromExport:!1,objectCaching:!0,clipPath:void 0,inverted:!1,absolutePositioned:!1,centeredRotation:!0,centeredScaling:!1,dirty:!0},ws=(t,e,s,i)=>(tt*Math.pow(2,10*(i-=1))*Math.sin((i*r-e)*x/s),Os=(t,e,s,i)=>-s*Math.cos(t/i*y)+s+e,ks=(t,e,s,i)=>(t/=i)<1/2.75?s*(7.5625*t*t)+e:t<2/2.75?s*(7.5625*(t-=1.5/2.75)*t+.75)+e:t<2.5/2.75?s*(7.5625*(t-=2.25/2.75)*t+.9375)+e:s*(7.5625*(t-=2.625/2.75)*t+.984375)+e,Ds=(t,e,s,i)=>s-ks(i-t,0,s,i)+e;var Ms=Object.freeze({__proto__:null,defaultEasing:Os,easeInBack:function(t,e,s,i){let r=arguments.length>4&&void 0!==arguments[4]?arguments[4]:1.70158;return s*(t/=i)*t*((r+1)*t-r)+e},easeInBounce:Ds,easeInCirc:(t,e,s,i)=>-s*(Math.sqrt(1-(t/=i)*t)-1)+e,easeInCubic:(t,e,s,i)=>s*(t/i)**3+e,easeInElastic:(t,e,s,i)=>{const r=s;let n=0;if(0===t)return e;if(1===(t/=i))return e+s;n||(n=.3*i);const{a:o,s:a,p:h}=ws(r,s,n,1.70158);return-Ts(o,a,h,t,i)+e},easeInExpo:(t,e,s,i)=>0===t?e:s*2**(10*(t/i-1))+e,easeInOutBack:function(t,e,s,i){let r=arguments.length>4&&void 0!==arguments[4]?arguments[4]:1.70158;return(t/=i/2)<1?s/2*(t*t*((1+(r*=1.525))*t-r))+e:s/2*((t-=2)*t*((1+(r*=1.525))*t+r)+2)+e},easeInOutBounce:(t,e,s,i)=>t(t/=i/2)<1?-s/2*(Math.sqrt(1-t**2)-1)+e:s/2*(Math.sqrt(1-(t-=2)*t)+1)+e,easeInOutCubic:(t,e,s,i)=>(t/=i/2)<1?s/2*t**3+e:s/2*((t-2)**3+2)+e,easeInOutElastic:(t,e,s,i)=>{const r=s;let n=0;if(0===t)return e;if(2===(t/=i/2))return e+s;n||(n=i*(.3*1.5));const{a:o,s:a,p:h,c:l}=ws(r,s,n,1.70158);return t<1?-.5*Ts(o,a,h,t,i)+e:o*Math.pow(2,-10*(t-=1))*Math.sin((t*i-a)*x/h)*.5+l+e},easeInOutExpo:(t,e,s,i)=>0===t?e:t===i?e+s:(t/=i/2)<1?s/2*2**(10*(t-1))+e:s/2*-(2**(-10*--t)+2)+e,easeInOutQuad:(t,e,s,i)=>(t/=i/2)<1?s/2*t**2+e:-s/2*(--t*(t-2)-1)+e,easeInOutQuart:(t,e,s,i)=>(t/=i/2)<1?s/2*t**4+e:-s/2*((t-=2)*t**3-2)+e,easeInOutQuint:(t,e,s,i)=>(t/=i/2)<1?s/2*t**5+e:s/2*((t-2)**5+2)+e,easeInOutSine:(t,e,s,i)=>-s/2*(Math.cos(Math.PI*t/i)-1)+e,easeInQuad:(t,e,s,i)=>s*(t/=i)*t+e,easeInQuart:(t,e,s,i)=>s*(t/=i)*t**3+e,easeInQuint:(t,e,s,i)=>s*(t/i)**5+e,easeInSine:(t,e,s,i)=>-s*Math.cos(t/i*y)+s+e,easeOutBack:function(t,e,s,i){let r=arguments.length>4&&void 0!==arguments[4]?arguments[4]:1.70158;return s*((t=t/i-1)*t*((r+1)*t+r)+1)+e},easeOutBounce:ks,easeOutCirc:(t,e,s,i)=>s*Math.sqrt(1-(t=t/i-1)*t)+e,easeOutCubic:(t,e,s,i)=>s*((t/i-1)**3+1)+e,easeOutElastic:(t,e,s,i)=>{const r=s;let n=0;if(0===t)return e;if(1===(t/=i))return e+s;n||(n=.3*i);const{a:o,s:a,p:h,c:l}=ws(r,s,n,1.70158);return o*2**(-10*t)*Math.sin((t*i-a)*x/h)+l+e},easeOutExpo:(t,e,s,i)=>t===i?e+s:s*-(2**(-10*t/i)+1)+e,easeOutQuad:(t,e,s,i)=>-s*(t/=i)*(t-2)+e,easeOutQuart:(t,e,s,i)=>-s*((t=t/i-1)*t**3-1)+e,easeOutQuint:(t,e,s,i)=>s*((t/i-1)**5+1)+e,easeOutSine:(t,e,s,i)=>s*Math.sin(t/i*y)+e});const Es=()=>!1;class Ps{constructor(e){let{startValue:s,byValue:i,duration:r=500,delay:n=0,easing:o=Os,onStart:a=v,onChange:h=v,onComplete:l=v,abort:c=Es,target:u}=e;t(this,"_state","pending"),t(this,"durationProgress",0),t(this,"valueProgress",0),this.tick=this.tick.bind(this),this.duration=r,this.delay=n,this.easing=o,this._onStart=a,this._onChange=h,this._onComplete=l,this._abort=c,this.target=u,this.startValue=s,this.byValue=i,this.value=this.startValue,this.endValue=Object.freeze(this.calculate(this.duration).value)}get state(){return this._state}isDone(){return"aborted"===this._state||"completed"===this._state}start(){const t=t=>{"pending"===this._state&&(this.startTime=t||+new Date,this._state="running",this._onStart(),this.tick(this.startTime))};this.register(),this.delay>0?setTimeout(()=>ht(t),this.delay):ht(t)}tick(t){const e=(t||+new Date)-this.startTime,s=Math.min(e,this.duration);this.durationProgress=s/this.duration;const{value:i,valueProgress:r}=this.calculate(s);this.value=Object.freeze(i),this.valueProgress=r,"aborted"!==this._state&&(this._abort(this.value,this.valueProgress,this.durationProgress)?(this._state="aborted",this.unregister()):e>=this.duration?(this.durationProgress=this.valueProgress=1,this._onChange(this.endValue,this.valueProgress,this.durationProgress),this._state="completed",this._onComplete(this.endValue,this.valueProgress,this.durationProgress),this.unregister()):(this._onChange(this.value,this.valueProgress,this.durationProgress),ht(this.tick)))}register(){Q.push(this)}unregister(){Q.remove(this)}abort(){this._state="aborted",this.unregister()}}class As extends Ps{constructor(t){let{startValue:e=0,endValue:s=100,...i}=t;super({...i,startValue:e,byValue:s-e})}calculate(t){const e=this.easing(t,this.startValue,this.byValue,this.duration);return{value:e,valueProgress:Math.abs((e-this.startValue)/this.byValue)}}}class js extends Ps{constructor(t){let{startValue:e=[0],endValue:s=[100],...i}=t;super({...i,startValue:e,byValue:s.map((t,s)=>t-e[s])})}calculate(t){const e=this.startValue.map((e,s)=>this.easing(t,e,this.byValue[s],this.duration,s));return{value:e,valueProgress:Math.abs((e[0]-this.startValue[0])/this.byValue[0])}}}const Fs=(t,e,s,i)=>e+s*(1-Math.cos(t/i*y)),Ls=t=>t&&((e,s,i)=>t(new Ve(e).toRgba(),s,i));class Rs extends Ps{constructor(t){let{startValue:e,endValue:s,easing:i=Fs,onChange:r,onComplete:n,abort:o,...a}=t;const h=new Ve(e).getSource(),l=new Ve(s).getSource();super({...a,startValue:h,byValue:l.map((t,e)=>t-h[e]),easing:i,onChange:Ls(r),onComplete:Ls(n),abort:Ls(o)})}calculate(t){const[e,s,i,r]=this.startValue.map((e,s)=>this.easing(t,e,this.byValue[s],this.duration,s)),n=[...[e,s,i].map(Math.round),xs(0,r,1)];return{value:n,valueProgress:n.map((t,e)=>0!==this.byValue[e]?Math.abs((t-this.startValue[e])/this.byValue[e]):0).find(t=>0!==t)||0}}}function Is(t){const e=(t=>Array.isArray(t.startValue)||Array.isArray(t.endValue))(t)?new js(t):new As(t);return e.start(),e}function Bs(t){const e=new Rs(t);return e.start(),e}class $s{constructor(t){this.status=t,this.points=[]}includes(t){return this.points.some(e=>e.eq(t))}append(){for(var t=arguments.length,e=new Array(t),s=0;s!this.includes(t))),this}static isPointContained(t,e,s){let i=arguments.length>3&&void 0!==arguments[3]&&arguments[3];if(e.eq(s))return t.eq(e);if(e.x===s.x)return t.x===e.x&&(i||t.y>=Math.min(e.y,s.y)&&t.y<=Math.max(e.y,s.y));if(e.y===s.y)return t.y===e.y&&(i||t.x>=Math.min(e.x,s.x)&&t.x<=Math.max(e.x,s.x));{const r=xe(e,s),n=xe(e,t).divide(r);return i?Math.abs(n.x)===Math.abs(n.y):n.x===n.y&&n.x>=0&&n.x<=1}}static isPointInPolygon(t,e){const s=new it(t).setX(Math.min(t.x-1,...e.map(t=>t.x)));let i=0;for(let r=0;r4&&void 0!==arguments[4])||arguments[4],n=!(arguments.length>5&&void 0!==arguments[5])||arguments[5];const o=e.x-t.x,a=e.y-t.y,h=i.x-s.x,l=i.y-s.y,c=t.x-s.x,u=t.y-s.y,d=h*u-l*c,g=o*u-a*c,f=l*o-h*a;if(0!==f){const e=d/f,s=g/f;return(r||0<=e&&e<=1)&&(n||0<=s&&s<=1)?new $s("Intersection").append(new it(t.x+e*o,t.y+e*a)):new $s}if(0===d||0===g){const o=r||n||$s.isPointContained(t,s,i)||$s.isPointContained(e,s,i)||$s.isPointContained(s,t,e)||$s.isPointContained(i,t,e);return new $s(o?"Coincident":void 0)}return new $s("Parallel")}static intersectSegmentLine(t,e,s,i){return $s.intersectLineLine(t,e,s,i,!1,!0)}static intersectSegmentSegment(t,e,s,i){return $s.intersectLineLine(t,e,s,i,!1,!1)}static intersectLinePolygon(t,e,s){let i=!(arguments.length>3&&void 0!==arguments[3])||arguments[3];const r=new $s,n=s.length;for(let o,a,h,l=0;l0&&(r.status="Intersection"),r}static intersectSegmentPolygon(t,e,s){return $s.intersectLinePolygon(t,e,s,!1)}static intersectPolygonPolygon(t,e){const s=new $s,i=t.length,r=[];for(let n=0;n0&&r.length===t.length?new $s("Coincident"):(s.points.length>0&&(s.status="Intersection"),s)}static intersectPolygonRectangle(t,e,s){const i=e.min(s),r=e.max(s),n=new it(r.x,i.y),o=new it(i.x,r.y);return $s.intersectPolygonPolygon(t,[i,n,r,o])}}class Xs extends at{getX(){return this.getXY().x}setX(t){this.setXY(this.getXY().setX(t))}getY(){return this.getXY().y}setY(t){this.setXY(this.getXY().setY(t))}getRelativeX(){return this.left}setRelativeX(t){this.left=t}getRelativeY(){return this.top}setRelativeY(t){this.top=t}getXY(){const t=this.getRelativeXY();return this.group?xt(t,this.group.calcTransformMatrix()):t}setXY(t,e,s){this.group&&(t=xt(t,Ct(this.group.calcTransformMatrix()))),this.setRelativeXY(t,e,s)}getRelativeXY(){return new it(this.left,this.top)}setRelativeXY(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:this.originX,s=arguments.length>2&&void 0!==arguments[2]?arguments[2]:this.originY;this.setPositionByOrigin(t,e,s)}isStrokeAccountedForInDimensions(){return!1}getCoords(){const{tl:t,tr:e,br:s,bl:i}=this.aCoords||(this.aCoords=this.calcACoords()),r=[t,e,s,i];if(this.group){const t=this.group.calcTransformMatrix();return r.map(e=>xt(e,t))}return r}intersectsWithRect(t,e){return"Intersection"===$s.intersectPolygonRectangle(this.getCoords(),t,e).status}intersectsWithObject(t){const e=$s.intersectPolygonPolygon(this.getCoords(),t.getCoords());return"Intersection"===e.status||"Coincident"===e.status||t.isContainedWithinObject(this)||this.isContainedWithinObject(t)}isContainedWithinObject(t){return this.getCoords().every(e=>t.containsPoint(e))}isContainedWithinRect(t,e){const{left:s,top:i,width:r,height:n}=this.getBoundingRect();return s>=t.x&&s+r<=e.x&&i>=t.y&&i+n<=e.y}isOverlapping(t){return this.intersectsWithObject(t)||this.isContainedWithinObject(t)||t.isContainedWithinObject(this)}containsPoint(t){return $s.isPointInPolygon(t,this.getCoords())}isOnScreen(){if(!this.canvas)return!1;const{tl:t,br:e}=this.canvas.vptCoords;return!!this.getCoords().some(s=>s.x<=e.x&&s.x>=t.x&&s.y<=e.y&&s.y>=t.y)||(!!this.intersectsWithRect(t,e)||this.containsPoint(t.midPointFrom(e)))}isPartiallyOnScreen(){if(!this.canvas)return!1;const{tl:t,br:e}=this.canvas.vptCoords;if(this.intersectsWithRect(t,e))return!0;return this.getCoords().every(s=>(s.x>=e.x||s.x<=t.x)&&(s.y>=e.y||s.y<=t.y))&&this.containsPoint(t.midPointFrom(e))}getBoundingRect(){return re(this.getCoords())}getScaledWidth(){return this._getTransformedDimensions().x}getScaledHeight(){return this._getTransformedDimensions().y}scale(t){this._set(W,t),this._set(V,t),this.setCoords()}scaleToWidth(t){const e=this.getBoundingRect().width/this.getScaledWidth();return this.scale(t/this.width/e)}scaleToHeight(t){const e=this.getBoundingRect().height/this.getScaledHeight();return this.scale(t/this.height/e)}getCanvasRetinaScaling(){var t;return(null===(t=this.canvas)||void 0===t?void 0:t.getRetinaScaling())||1}getTotalAngle(){return this.group?yt(wt(this.calcTransformMatrix())):this.angle}getViewportTransform(){var t;return(null===(t=this.canvas)||void 0===t?void 0:t.viewportTransform)||b.concat()}calcACoords(){const t=kt({angle:this.angle}),{x:e,y:s}=this.getRelativeCenterPoint(),i=Ot(e,s),r=bt(i,t),n=this._getTransformedDimensions(),o=n.x/2,a=n.y/2;return{tl:xt({x:-o,y:-a},r),tr:xt({x:o,y:-a},r),bl:xt({x:-o,y:a},r),br:xt({x:o,y:a},r)}}setCoords(){this.aCoords=this.calcACoords()}transformMatrixKey(){let t=arguments.length>0&&void 0!==arguments[0]&&arguments[0],e=[];return!t&&this.group&&(e=this.group.transformMatrixKey(t)),e.push(this.top,this.left,this.width,this.height,this.scaleX,this.scaleY,this.angle,this.strokeWidth,this.skewX,this.skewY,+this.flipX,+this.flipY,me(this.originX),me(this.originY)),e}calcTransformMatrix(){let t=arguments.length>0&&void 0!==arguments[0]&&arguments[0],e=this.calcOwnMatrix();if(t||!this.group)return e;const s=this.transformMatrixKey(t),i=this.matrixCache;return i&&i.key.every((t,e)=>t===s[e])?i.value:(this.group&&(e=bt(this.group.calcTransformMatrix(!1),e)),this.matrixCache={key:s,value:e},e)}calcOwnMatrix(){const t=this.transformMatrixKey(!0),e=this.ownMatrixCache;if(e&&e.key===t)return e.value;const s=this.getRelativeCenterPoint(),i={angle:this.angle,translateX:s.x,translateY:s.y,scaleX:this.scaleX,scaleY:this.scaleY,skewX:this.skewX,skewY:this.skewY,flipX:this.flipX,flipY:this.flipY},r=jt(i);return this.ownMatrixCache={key:t,value:r},r}_getNonTransformedDimensions(){return new it(this.width,this.height).scalarAdd(this.strokeWidth)}_calculateCurrentDimensions(t){return this._getTransformedDimensions(t).transform(this.getViewportTransform(),!0).scalarAdd(2*this.padding)}_getTransformedDimensions(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};const e={scaleX:this.scaleX,scaleY:this.scaleY,skewX:this.skewX,skewY:this.skewY,width:this.width,height:this.height,strokeWidth:this.strokeWidth,...t},s=e.strokeWidth;let i=s,r=0;this.strokeUniform&&(i=0,r=s);const n=e.width+i,o=e.height+i;let a;return a=0===e.skewX&&0===e.skewY?new it(n*e.scaleX,o*e.scaleY):le(n,o,At(e)),a.scalarAdd(r)}translateToGivenOrigin(t,e,s,i,r){let n=t.x,o=t.y;const a=me(i)-me(e),h=me(r)-me(s);if(a||h){const t=this._getTransformedDimensions();n+=a*t.x,o+=h*t.y}return new it(n,o)}translateToCenterPoint(t,e,s){if(e===T&&s===T)return t;const i=this.translateToGivenOrigin(t,e,s,T,T);return this.angle?i.rotate(vt(this.angle),t):i}translateToOriginPoint(t,e,s){const i=this.translateToGivenOrigin(t,T,T,e,s);return this.angle?i.rotate(vt(this.angle),t):i}getCenterPoint(){const t=this.getRelativeCenterPoint();return this.group?xt(t,this.group.calcTransformMatrix()):t}getRelativeCenterPoint(){return this.translateToCenterPoint(new it(this.left,this.top),this.originX,this.originY)}getPointByOrigin(t,e){return this.translateToOriginPoint(this.getRelativeCenterPoint(),t,e)}setPositionByOrigin(t,e,s){const i=this.translateToCenterPoint(t,e,s),r=this.translateToOriginPoint(i,this.originX,this.originY);this.set({left:r.x,top:r.y})}_getLeftTopCoords(){return this.translateToOriginPoint(this.getRelativeCenterPoint(),O,k)}}let Ys=class e extends Xs{static getDefaults(){return e.ownDefaults}get type(){const t=this.constructor.type;return"FabricObject"===t?"object":t.toLowerCase()}set type(t){i("warn","Setting type has no effect",t)}constructor(s){super(),t(this,"_cacheContext",null),Object.assign(this,e.ownDefaults),this.setOptions(s)}_createCacheCanvas(){this._cacheCanvas=dt(),this._cacheContext=this._cacheCanvas.getContext("2d"),this._updateCacheCanvas(),this.dirty=!0}_limitCacheSize(t){const e=t.width,i=t.height,r=s.maxCacheSideLimit,n=s.minCacheSideLimit;if(e<=r&&i<=r&&e*i<=s.perfLimitSizeTotal)return el&&(t.zoomX/=e/l,t.width=l,t.capped=!0),i>c&&(t.zoomY/=i/c,t.height=c,t.capped=!0),t}_getCacheCanvasDimensions(){const t=this.getTotalObjectScaling(),e=this._getTransformedDimensions({skewX:0,skewY:0}),s=e.x*t.x/this.scaleX,i=e.y*t.y/this.scaleY;return{width:Math.ceil(s+2),height:Math.ceil(i+2),zoomX:t.x,zoomY:t.y,x:s,y:i}}_updateCacheCanvas(){const t=this._cacheCanvas,e=this._cacheContext,{width:s,height:i,zoomX:r,zoomY:n,x:o,y:a}=this._limitCacheSize(this._getCacheCanvasDimensions()),h=s!==t.width||i!==t.height,l=this.zoomX!==r||this.zoomY!==n;if(!t||!e)return!1;if(h||l){s!==t.width||i!==t.height?(t.width=s,t.height=i):(e.setTransform(1,0,0,1,0,0),e.clearRect(0,0,t.width,t.height));const h=o/2,l=a/2;return this.cacheTranslationX=Math.round(t.width/2-h)+h,this.cacheTranslationY=Math.round(t.height/2-l)+l,e.translate(this.cacheTranslationX,this.cacheTranslationY),e.scale(r,n),this.zoomX=r,this.zoomY=n,!0}return!1}setOptions(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};this._setOptions(t)}transform(t){const e=this.group&&!this.group._transformDone||this.group&&this.canvas&&t===this.canvas.contextTop,s=this.calcTransformMatrix(!e);t.transform(s[0],s[1],s[2],s[3],s[4],s[5])}getObjectScaling(){if(!this.group)return new it(Math.abs(this.scaleX),Math.abs(this.scaleY));const t=Tt(this.calcTransformMatrix());return new it(Math.abs(t.scaleX),Math.abs(t.scaleY))}getTotalObjectScaling(){const t=this.getObjectScaling();if(this.canvas){const e=this.canvas.getZoom(),s=this.getCanvasRetinaScaling();return t.scalarMultiply(e*s)}return t}getObjectOpacity(){let t=this.opacity;return this.group&&(t*=this.group.getObjectOpacity()),t}_constrainScale(t){return Math.abs(t){t.transform(i)}),e.parentClipPaths.push(t),t.absolutePositioned){const t=Ct(this.calcTransformMatrix());i.transform(t[0],t[1],t[2],t[3],t[4],t[5])}return t.transform(i),t.drawObject(i,!0,e),s}_drawClipPath(t,e,s){if(!e)return;e._transformDone=!0;const i=this.createClipPathLayer(e,s);this.drawClipPathOnCache(t,e,i)}drawCacheOnCanvas(t){t.scale(1/this.zoomX,1/this.zoomY),t.drawImage(this._cacheCanvas,-this.cacheTranslationX,-this.cacheTranslationY)}isCacheDirty(){let t=arguments.length>0&&void 0!==arguments[0]&&arguments[0];if(this.isNotVisible())return!1;const e=this._cacheCanvas,s=this._cacheContext;return!(!e||!s||t||!this._updateCacheCanvas())||!!(this.dirty||this.clipPath&&this.clipPath.absolutePositioned)&&(e&&s&&!t&&(s.save(),s.setTransform(1,0,0,1,0,0),s.clearRect(0,0,e.width,e.height),s.restore()),!0)}_renderBackground(t){if(!this.backgroundColor)return;const e=this._getNonTransformedDimensions();t.fillStyle=this.backgroundColor,t.fillRect(-e.x/2,-e.y/2,e.x,e.y),this._removeShadow(t)}_setOpacity(t){this.group&&!this.group._transformDone?t.globalAlpha=this.getObjectOpacity():t.globalAlpha*=this.opacity}_setStrokeStyles(t,e){const s=e.stroke;s&&(t.lineWidth=e.strokeWidth,t.lineCap=e.strokeLineCap,t.lineDashOffset=e.strokeDashOffset,t.lineJoin=e.strokeLineJoin,t.miterLimit=e.strokeMiterLimit,Yt(s)?"percentage"===s.gradientUnits||s.gradientTransform||s.patternTransform?this._applyPatternForTransformedGradient(t,s):(t.strokeStyle=s.toLive(t),this._applyPatternGradientTransform(t,s)):t.strokeStyle=e.stroke)}_setFillStyles(t,e){let{fill:s}=e;s&&(Yt(s)?(t.fillStyle=s.toLive(t),this._applyPatternGradientTransform(t,s)):t.fillStyle=s)}_setClippingProperties(t){t.globalAlpha=1,t.strokeStyle="transparent",t.fillStyle="#000000"}_setLineDash(t,e){e&&0!==e.length&&t.setLineDash(e)}_setShadow(t){if(!this.shadow)return;const e=this.shadow,i=this.canvas,r=this.getCanvasRetinaScaling(),[n,,,o]=(null==i?void 0:i.viewportTransform)||b,a=n*r,h=o*r,l=e.nonScaling?new it(1,1):this.getObjectScaling();t.shadowColor=e.color,t.shadowBlur=e.blur*s.browserShadowBlurConstant*(a+h)*(l.x+l.y)/4,t.shadowOffsetX=e.offsetX*a*l.x,t.shadowOffsetY=e.offsetY*h*l.y}_removeShadow(t){this.shadow&&(t.shadowColor="",t.shadowBlur=t.shadowOffsetX=t.shadowOffsetY=0)}_applyPatternGradientTransform(t,e){if(!Yt(e))return{offsetX:0,offsetY:0};const s=e.gradientTransform||e.patternTransform,i=-this.width/2+e.offsetX||0,r=-this.height/2+e.offsetY||0;return"percentage"===e.gradientUnits?t.transform(this.width,0,0,this.height,i,r):t.transform(1,0,0,1,i,r),s&&t.transform(s[0],s[1],s[2],s[3],s[4],s[5]),{offsetX:i,offsetY:r}}_renderPaintInOrder(t){this.paintFirst===N?(this._renderStroke(t),this._renderFill(t)):(this._renderFill(t),this._renderStroke(t))}_render(t){}_renderFill(t){this.fill&&(t.save(),this._setFillStyles(t,this),"evenodd"===this.fillRule?t.fill("evenodd"):t.fill(),t.restore())}_renderStroke(t){if(this.stroke&&0!==this.strokeWidth){if(this.shadow&&!this.shadow.affectStroke&&this._removeShadow(t),t.save(),this.strokeUniform){const e=this.getObjectScaling();t.scale(1/e.x,1/e.y)}this._setLineDash(t,this.strokeDashArray),this._setStrokeStyles(t,this),t.stroke(),t.restore()}}_applyPatternForTransformedGradient(t,e){var s;const i=this._limitCacheSize(this._getCacheCanvasDimensions()),r=this.getCanvasRetinaScaling(),n=i.x/this.scaleX/r,o=i.y/this.scaleY/r,a=ft({width:Math.ceil(n),height:Math.ceil(o)}),h=a.getContext("2d");h&&(h.beginPath(),h.moveTo(0,0),h.lineTo(n,0),h.lineTo(n,o),h.lineTo(0,o),h.closePath(),h.translate(n/2,o/2),h.scale(i.zoomX/this.scaleX/r,i.zoomY/this.scaleY/r),this._applyPatternGradientTransform(h,e),h.fillStyle=e.toLive(t),h.fill(),t.translate(-this.width/2-this.strokeWidth/2,-this.height/2-this.strokeWidth/2),t.scale(r*this.scaleX/i.zoomX,r*this.scaleY/i.zoomY),t.strokeStyle=null!==(s=h.createPattern(a,"no-repeat"))&&void 0!==s?s:"")}_findCenterFromElement(){return new it(this.left+this.width/2,this.top+this.height/2)}clone(t){const e=this.toObject(t);return this.constructor.fromObject(e)}cloneAsImage(t){const e=this.toCanvasElement(t);return new(J.getClass("image"))(e)}toCanvasElement(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};const e=he(this),s=this.group,i=this.shadow,r=Math.abs,n=t.enableRetinaScaling?f():1,o=(t.multiplier||1)*n,a=t.canvasProvider||(t=>new Zt(t,{enableRetinaScaling:!1,renderOnAddRemove:!1,skipOffscreen:!1}));delete this.group,t.withoutTransform&&ae(this),t.withoutShadow&&(this.shadow=null),t.viewportTransform&&ge(this,this.getViewportTransform()),this.setCoords();const h=dt(),l=this.getBoundingRect(),c=this.shadow,u=new it;if(c){const t=c.blur,e=c.nonScaling?new it(1,1):this.getObjectScaling();u.x=2*Math.round(r(c.offsetX)+t)*r(e.x),u.y=2*Math.round(r(c.offsetY)+t)*r(e.y)}const d=l.width+u.x,g=l.height+u.y;h.width=Math.ceil(d),h.height=Math.ceil(g);const p=a(h);"jpeg"===t.format&&(p.backgroundColor="#fff"),this.setPositionByOrigin(new it(p.width/2,p.height/2),T,T);const m=this.canvas;p._objects=[this],this.set("canvas",p),this.setCoords();const v=p.toCanvasElement(o||1,t);return this.set("canvas",m),this.shadow=i,s&&(this.group=s),this.set(e),this.setCoords(),p._objects=[],p.destroy(),v}toDataURL(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};return pt(this.toCanvasElement(t),t.format||"png",t.quality||1)}toBlob(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};return mt(this.toCanvasElement(t),t.format||"png",t.quality||1)}isType(){for(var t=arguments.length,e=new Array(t),s=0;s{let[i,r]=s;return t[i]=this._animate(i,r,e),t},{})}_animate(t,e){let s=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};const i=t.split("."),r=this.constructor.colorProperties.includes(i[i.length-1]),{abort:n,startValue:o,onChange:a,onComplete:h}=s,l={...s,target:this,startValue:null!=o?o:i.reduce((t,e)=>t[e],this),endValue:e,abort:null==n?void 0:n.bind(this),onChange:(t,e,s)=>{i.reduce((e,s,r)=>(r===i.length-1&&(e[s]=t),e[s]),this),a&&a(t,e,s)},onComplete:(t,e,s)=>{this.setCoords(),h&&h(t,e,s)}};return r?Bs(l):Is(l)}isDescendantOf(t){const{parent:e,group:s}=this;return e===t||s===t||!!e&&e.isDescendantOf(t)||!!s&&s!==e&&s.isDescendantOf(t)}getAncestors(){const t=[];let e=this;do{e=e.parent,e&&t.push(e)}while(e);return t}findCommonAncestors(t){if(this===t)return{fork:[],otherFork:[],common:[this,...this.getAncestors()]};const e=this.getAncestors(),s=t.getAncestors();if(0===e.length&&s.length>0&&this===s[s.length-1])return{fork:[],otherFork:[t,...s.slice(0,s.length-1)],common:[this]};for(let i,r=0;r-1&&n>o}toObject(){const t=(arguments.length>0&&void 0!==arguments[0]?arguments[0]:[]).concat(e.customProperties,this.constructor.customProperties||[]);let i;const r=s.NUM_FRACTION_DIGITS,{clipPath:n,fill:o,stroke:a,shadow:h,strokeDashArray:l,left:c,top:u,originX:d,originY:g,width:f,height:p,strokeWidth:v,strokeLineCap:y,strokeDashOffset:_,strokeLineJoin:x,strokeUniform:C,strokeMiterLimit:b,scaleX:S,scaleY:w,angle:T,flipX:O,flipY:k,opacity:D,visible:M,backgroundColor:E,fillRule:P,paintFirst:A,globalCompositeOperation:j,skewX:F,skewY:L}=this;n&&!n.excludeFromExport&&(i=n.toObject(t.concat("inverted","absolutePositioned")));const R=t=>$t(t,r),I={...It(this,t),type:this.constructor.type,version:m,originX:d,originY:g,left:R(c),top:R(u),width:R(f),height:R(p),fill:Wt(o)?o.toObject():o,stroke:Wt(a)?a.toObject():a,strokeWidth:R(v),strokeDashArray:l?l.concat():l,strokeLineCap:y,strokeDashOffset:_,strokeLineJoin:x,strokeUniform:C,strokeMiterLimit:R(b),scaleX:R(S),scaleY:R(w),angle:R(T),flipX:O,flipY:k,opacity:R(D),shadow:h?h.toObject():h,visible:M,backgroundColor:E,fillRule:P,paintFirst:A,globalCompositeOperation:j,skewX:R(F),skewY:R(L),...i?{clipPath:i}:null};return this.includeDefaultValues?I:this._removeDefaultValues(I)}toDatalessObject(t){return this.toObject(t)}_removeDefaultValues(t){const e=this.constructor.getDefaults(),s=Object.keys(e).length>0?e:Object.getPrototypeOf(this);return Bt(t,(t,e)=>{if(e===O||e===k||"type"===e)return!0;const i=s[e];return t!==i&&!(Array.isArray(t)&&Array.isArray(i)&&0===t.length&&0===i.length)})}toString(){return`#<${this.constructor.type}>`}static _fromObject(t){let{type:e,...s}=t,{extraParam:i,...r}=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return Rt(s,r).then(t=>i?(delete t[i],new this(s[i],t)):new this(t))}static fromObject(t,e){return this._fromObject(t,e)}};t(Ys,"stateProperties",Cs),t(Ys,"cacheProperties",bs),t(Ys,"ownDefaults",Ss),t(Ys,"type","FabricObject"),t(Ys,"colorProperties",[H,N,"backgroundColor"]),t(Ys,"customProperties",[]),J.setClass(Ys),J.setClass(Ys,"object");const Ws=(t,e,s)=>(i,r,n,o)=>{const a=e(i,r,n,o);return a&&fe(t,{...je(i,r,n,o),...s}),a};function Vs(t){return(e,s,i,r)=>{const{target:n,originX:o,originY:a}=s,h=n.getRelativeCenterPoint(),l=n.translateToOriginPoint(h,o,a),c=t(e,s,i,r);return n.setPositionByOrigin(l,s.originX,s.originY),c}}const Gs=Ws(I,Vs((t,e,s,i)=>{const r=Le(e,e.originX,e.originY,s,i);if(me(e.originX)===me(T)||me(e.originX)===me(M)&&r.x<0||me(e.originX)===me(O)&&r.x>0){const{target:t}=e,s=t.strokeWidth/(t.strokeUniform?t.scaleX:1),i=Ee(e)?2:1,n=t.width,o=Math.abs(r.x*i/t.scaleX)-s;return t.set("width",Math.max(o,1)),n!==t.width}return!1}));function zs(t,e,s,i,r){i=i||{};const n=this.sizeX||i.cornerSize||r.cornerSize,o=this.sizeY||i.cornerSize||r.cornerSize,a=void 0!==i.transparentCorners?i.transparentCorners:r.transparentCorners,h=a?N:H,l=!a&&(i.cornerStrokeColor||r.cornerStrokeColor);let c,u=e,d=s;t.save(),t.fillStyle=i.cornerColor||r.cornerColor||"",t.strokeStyle=i.cornerStrokeColor||r.cornerStrokeColor||"",n>o?(c=n,t.scale(1,o/n),d=s*n/o):o>n?(c=o,t.scale(n/o,1),u=e*o/n):c=n,t.beginPath(),t.arc(u,d,c/2,0,x,!1),t[h](),l&&t.stroke(),t.restore()}function Hs(t,e,s,i,r){i=i||{};const n=this.sizeX||i.cornerSize||r.cornerSize,o=this.sizeY||i.cornerSize||r.cornerSize,a=void 0!==i.transparentCorners?i.transparentCorners:r.transparentCorners,h=a?N:H,l=!a&&(i.cornerStrokeColor||r.cornerStrokeColor),c=n/2,u=o/2;t.save(),t.fillStyle=i.cornerColor||r.cornerColor||"",t.strokeStyle=i.cornerStrokeColor||r.cornerStrokeColor||"",t.translate(e,s);const d=r.getTotalAngle();t.rotate(vt(d)),t[`${h}Rect`](-c,-u,n,o),l&&t.strokeRect(-c,-u,n,o),t.restore()}class Ns{constructor(e){t(this,"visible",!0),t(this,"actionName",Y),t(this,"angle",0),t(this,"x",0),t(this,"y",0),t(this,"offsetX",0),t(this,"offsetY",0),t(this,"sizeX",0),t(this,"sizeY",0),t(this,"touchSizeX",0),t(this,"touchSizeY",0),t(this,"cursorStyle","crosshair"),t(this,"withConnection",!1),Object.assign(this,e)}shouldActivate(t,e,s,i){var r;let{tl:n,tr:o,br:a,bl:h}=i;return(null===(r=e.canvas)||void 0===r?void 0:r.getActiveObject())===e&&e.isControlVisible(t)&&$s.isPointInPolygon(s,[n,o,a,h])}getActionHandler(t,e,s){return this.actionHandler}getMouseDownHandler(t,e,s){return this.mouseDownHandler}getMouseUpHandler(t,e,s){return this.mouseUpHandler}cursorStyleHandler(t,e,s,i){return e.cursorStyle}getActionName(t,e,s){return e.actionName}getVisibility(t,e){var s,i;return null!==(s=null===(i=t._controlsVisibility)||void 0===i?void 0:i[e])&&void 0!==s?s:this.visible}setVisibility(t,e,s){this.visible=t}positionHandler(t,e,s,i){return new it(this.x*t.x+this.offsetX,this.y*t.y+this.offsetY).transform(e)}calcCornerCoords(t,e,s,i,r,n){const o=St([Ot(s,i),kt({angle:t}),Dt((r?this.touchSizeX:this.sizeX)||e,(r?this.touchSizeY:this.sizeY)||e)]);return{tl:new it(-.5,-.5).transform(o),tr:new it(.5,-.5).transform(o),br:new it(.5,.5).transform(o),bl:new it(-.5,.5).transform(o)}}render(t,e,s,i,r){if("circle"===((i=i||{}).cornerStyle||r.cornerStyle))zs.call(this,t,e,s,i,r);else Hs.call(this,t,e,s,i,r)}}const Us=(t,e,s)=>s.lockRotation?Me:e.cursorStyle,qs=Ws(F,Vs((t,e,s,i)=>{let{target:r,ex:n,ey:o,theta:a,originX:h,originY:l}=e;const c=r.translateToOriginPoint(r.getRelativeCenterPoint(),h,l);if(Ae(r,"lockRotation"))return!1;const u=Math.atan2(o-c.y,n-c.x),d=Math.atan2(i-c.y,s-c.x);let g=yt(d-u+a);if(r.snapAngle&&r.snapAngle>0){const t=r.snapAngle,e=r.snapThreshold||t,s=Math.ceil(g/t)*t,i=Math.floor(g/t)*t;Math.abs(g-i){const r=Ks(t,s);if(Js(s,0!==e.x&&0===e.y?"x":0===e.x&&0!==e.y?"y":"",r))return Me;const n=Fe(s,0,i);return`${Qs[n]}-resize`};function ti(t,e,s,i){let r=arguments.length>4&&void 0!==arguments[4]?arguments[4]:{};const n=e.target,o=r.by,a=Ks(t,n);let h,l,c,u,d,g;if(Js(n,o,a))return!1;if(e.gestureScale)l=e.scaleX*e.gestureScale,c=e.scaleY*e.gestureScale;else{if(h=Le(e,e.originX,e.originY,s,i),d="y"!==o?Math.sign(h.x||e.signX||1):1,g="x"!==o?Math.sign(h.y||e.signY||1):1,e.signX||(e.signX=d),e.signY||(e.signY=g),Ae(n,"lockScalingFlip")&&(e.signX!==d||e.signY!==g))return!1;if(u=n._getTransformedDimensions(),a&&!o){const t=Math.abs(h.x)+Math.abs(h.y),{original:s}=e,i=t/(Math.abs(u.x*s.scaleX/n.scaleX)+Math.abs(u.y*s.scaleY/n.scaleY));l=s.scaleX*i,c=s.scaleY*i}else l=Math.abs(h.x*n.scaleX/u.x),c=Math.abs(h.y*n.scaleY/u.y);Ee(e)&&(l*=2,c*=2),e.signX!==d&&"y"!==o&&(e.originX=Pe(e.originX),l*=-1,e.signX=d),e.signY!==g&&"x"!==o&&(e.originY=Pe(e.originY),c*=-1,e.signY=g)}const f=n.scaleX,p=n.scaleY;return o?("x"===o&&n.set(W,l),"y"===o&&n.set(V,c)):(!Ae(n,"lockScalingX")&&n.set(W,l),!Ae(n,"lockScalingY")&&n.set(V,c)),f!==n.scaleX||p!==n.scaleY}const ei=Ws(j,Vs((t,e,s,i)=>ti(t,e,s,i))),si=Ws(j,Vs((t,e,s,i)=>ti(t,e,s,i,{by:"x"}))),ii=Ws(j,Vs((t,e,s,i)=>ti(t,e,s,i,{by:"y"}))),ri={x:{counterAxis:"y",scale:W,skew:G,lockSkewing:"lockSkewingX",origin:"originX",flip:"flipX"},y:{counterAxis:"x",scale:V,skew:z,lockSkewing:"lockSkewingY",origin:"originY",flip:"flipY"}},ni=["ns","nesw","ew","nwse"],oi=(t,e,s,i)=>{if(0!==e.x&&Ae(s,"lockSkewingY"))return Me;if(0!==e.y&&Ae(s,"lockSkewingX"))return Me;const r=Fe(s,0,i)%4;return`${ni[r]}-resize`};function ai(t,e,s,i,r){const{target:n}=s,{counterAxis:o,origin:a,lockSkewing:h,skew:l,flip:c}=ri[t];if(Ae(n,h))return!1;const{origin:u,flip:d}=ri[o],g=me(s[u])*(n[d]?-1:1),f=-Math.sign(g)*(n[c]?-1:1),p=.5*-((0===n[l]&&Le(s,T,T,i,r)[t]>0||n[l]>0?1:-1)*f)+.5,m=Ws(R,Vs((e,s,i,r)=>function(t,e,s){let{target:i,ex:r,ey:n,skewingSide:o,...a}=e;const{skew:h}=ri[t],l=s.subtract(new it(r,n)).divide(new it(i.scaleX,i.scaleY))[t],c=i[h],u=a[h],d=Math.tan(vt(u)),g="y"===t?i._getTransformedDimensions({scaleX:1,scaleY:1,skewX:0}).x:i._getTransformedDimensions({scaleX:1,scaleY:1}).y,f=2*l*o/Math.max(g,1)+d,p=yt(Math.atan(f));i.set(h,p);const m=c!==i[h];if(m&&"y"===t){const{skewX:t,scaleX:e}=i,s=i._getTransformedDimensions({skewY:c}),r=i._getTransformedDimensions(),n=0!==t?s.x/r.x:1;1!==n&&i.set(W,n*e)}return m}(t,s,new it(i,r))));return m(e,{...s,[a]:p,skewingSide:f},i,r)}const hi=(t,e,s,i)=>ai("x",t,e,s,i),li=(t,e,s,i)=>ai("y",t,e,s,i);function ci(t,e){return t[e.canvas.altActionKey]}const ui=(t,e,s)=>{const i=ci(t,s);return 0===e.x?i?G:V:0===e.y?i?z:W:""},di=(t,e,s,i)=>ci(t,s)?oi(0,e,s,i):Zs(t,e,s,i),gi=(t,e,s,i)=>ci(t,e.target)?li(t,e,s,i):si(t,e,s,i),fi=(t,e,s,i)=>ci(t,e.target)?hi(t,e,s,i):ii(t,e,s,i),pi=()=>({ml:new Ns({x:-.5,y:0,cursorStyleHandler:di,actionHandler:gi,getActionName:ui}),mr:new Ns({x:.5,y:0,cursorStyleHandler:di,actionHandler:gi,getActionName:ui}),mb:new Ns({x:0,y:.5,cursorStyleHandler:di,actionHandler:fi,getActionName:ui}),mt:new Ns({x:0,y:-.5,cursorStyleHandler:di,actionHandler:fi,getActionName:ui}),tl:new Ns({x:-.5,y:-.5,cursorStyleHandler:Zs,actionHandler:ei}),tr:new Ns({x:.5,y:-.5,cursorStyleHandler:Zs,actionHandler:ei}),bl:new Ns({x:-.5,y:.5,cursorStyleHandler:Zs,actionHandler:ei}),br:new Ns({x:.5,y:.5,cursorStyleHandler:Zs,actionHandler:ei}),mtr:new Ns({x:0,y:-.5,actionHandler:qs,cursorStyleHandler:Us,offsetY:-40,withConnection:!0,actionName:L})}),mi=()=>({mr:new Ns({x:.5,y:0,actionHandler:Gs,cursorStyleHandler:di,actionName:I}),ml:new Ns({x:-.5,y:0,actionHandler:Gs,cursorStyleHandler:di,actionName:I})}),vi=()=>({...pi(),...mi()});class yi extends Ys{static getDefaults(){return{...super.getDefaults(),...yi.ownDefaults}}constructor(t){super(),Object.assign(this,this.constructor.createControls(),yi.ownDefaults),this.setOptions(t)}static createControls(){return{controls:pi()}}_updateCacheCanvas(){const t=this.canvas;if(this.noScaleCache&&t&&t._currentTransform){const e=t._currentTransform,s=e.target,i=e.action;if(this===s&&i&&i.startsWith(Y))return!1}return super._updateCacheCanvas()}getActiveControl(){const t=this.__corner;return t?{key:t,control:this.controls[t],coord:this.oCoords[t]}:void 0}findControl(t){let e=arguments.length>1&&void 0!==arguments[1]&&arguments[1];if(!this.hasControls||!this.canvas)return;this.__corner=void 0;const s=Object.entries(this.oCoords);for(let i=s.length-1;i>=0;i--){const[r,n]=s[i],o=this.controls[r];if(o.shouldActivate(r,this,t,e?n.touchCorner:n.corner))return this.__corner=r,{key:r,control:o,coord:this.oCoords[r]}}}calcOCoords(){const t=this.getViewportTransform(),e=this.getCenterPoint(),s=Ot(e.x,e.y),i=kt({angle:this.getTotalAngle()-(this.group&&this.flipX?180:0)}),r=bt(s,i),n=bt(t,r),o=bt(n,[1/t[0],0,0,1/t[3],0,0]),a=this.group?Tt(this.calcTransformMatrix()):void 0;a&&(a.scaleX=Math.abs(a.scaleX),a.scaleY=Math.abs(a.scaleY));const h=this._calculateCurrentDimensions(a),l={};return this.forEachControl((t,e)=>{const s=t.positionHandler(h,o,this,t);l[e]=Object.assign(s,this._calcCornerCoords(t,s))}),l}_calcCornerCoords(t,e){const s=this.getTotalAngle();return{corner:t.calcCornerCoords(s,this.cornerSize,e.x,e.y,!1,this),touchCorner:t.calcCornerCoords(s,this.touchCornerSize,e.x,e.y,!0,this)}}setCoords(){super.setCoords(),this.canvas&&(this.oCoords=this.calcOCoords())}forEachControl(t){for(const e in this.controls)t(this.controls[e],e,this)}drawSelectionBackground(t){if(!this.selectionBackgroundColor||this.canvas&&this.canvas._activeObject!==this)return;t.save();const e=this.getRelativeCenterPoint(),s=this._calculateCurrentDimensions(),i=this.getViewportTransform();t.translate(e.x,e.y),t.scale(1/i[0],1/i[3]),t.rotate(vt(this.angle)),t.fillStyle=this.selectionBackgroundColor,t.fillRect(-s.x/2,-s.y/2,s.x,s.y),t.restore()}strokeBorders(t,e){t.strokeRect(-e.x/2,-e.y/2,e.x,e.y)}_drawBorders(t,e){let s=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};const i={hasControls:this.hasControls,borderColor:this.borderColor,borderDashArray:this.borderDashArray,...s};t.save(),t.strokeStyle=i.borderColor,this._setLineDash(t,i.borderDashArray),this.strokeBorders(t,e),i.hasControls&&this.drawControlsConnectingLines(t,e),t.restore()}_renderControls(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};const{hasBorders:s,hasControls:i}=this,r={hasBorders:s,hasControls:i,...e},n=this.getViewportTransform(),o=r.hasBorders,a=r.hasControls,h=bt(n,this.calcTransformMatrix()),l=Tt(h);t.save(),t.translate(l.translateX,l.translateY),t.lineWidth=this.borderScaleFactor,this.group===this.parent&&(t.globalAlpha=this.isMoving?this.borderOpacityWhenMoving:1),this.flipX&&(l.angle-=180),t.rotate(vt(this.group?l.angle:this.angle)),o&&this.drawBorders(t,l,e),a&&this.drawControls(t,e),t.restore()}drawBorders(t,e,s){let i;if(s&&s.forActiveSelection||this.group){const t=le(this.width,this.height,At(e)),s=this.isStrokeAccountedForInDimensions()?rt:(this.strokeUniform?(new it).scalarAdd(this.canvas?this.canvas.getZoom():1):new it(e.scaleX,e.scaleY)).scalarMultiply(this.strokeWidth);i=t.add(s).scalarAdd(this.borderScaleFactor).scalarAdd(2*this.padding)}else i=this._calculateCurrentDimensions().scalarAdd(this.borderScaleFactor);this._drawBorders(t,i,s)}drawControlsConnectingLines(t,e){let s=!1;t.beginPath(),this.forEachControl((i,r)=>{i.withConnection&&i.getVisibility(this,r)&&(s=!0,t.moveTo(i.x*e.x,i.y*e.y),t.lineTo(i.x*e.x+i.offsetX,i.y*e.y+i.offsetY))}),s&&t.stroke()}drawControls(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};t.save();const s=this.getCanvasRetinaScaling(),{cornerStrokeColor:i,cornerDashArray:r,cornerColor:n}=this,o={cornerStrokeColor:i,cornerDashArray:r,cornerColor:n,...e};t.setTransform(s,0,0,s,0,0),t.strokeStyle=t.fillStyle=o.cornerColor,this.transparentCorners||(t.strokeStyle=o.cornerStrokeColor),this._setLineDash(t,o.cornerDashArray),this.forEachControl((e,s)=>{if(e.getVisibility(this,s)){const i=this.oCoords[s];e.render(t,i.x,i.y,o,this)}}),t.restore()}isControlVisible(t){return this.controls[t]&&this.controls[t].getVisibility(this,t)}setControlVisible(t,e){this._controlsVisibility||(this._controlsVisibility={}),this._controlsVisibility[t]=e}setControlsVisibility(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};Object.entries(t).forEach(t=>{let[e,s]=t;return this.setControlVisible(e,s)})}clearContextTop(t){if(!this.canvas)return;const e=this.canvas.contextTop;if(!e)return;const s=this.canvas.viewportTransform;e.save(),e.transform(s[0],s[1],s[2],s[3],s[4],s[5]),this.transform(e);const i=this.width+4,r=this.height+4;return e.clearRect(-i/2,-r/2,i,r),t||e.restore(),e}onDeselect(t){return!1}onSelect(t){return!1}shouldStartDragging(t){return!1}onDragStart(t){return!1}canDrop(t){return!1}renderDragSourceEffect(t){}renderDropTargetEffect(t){}}function _i(t,e){return e.forEach(e=>{Object.getOwnPropertyNames(e.prototype).forEach(s=>{"constructor"!==s&&Object.defineProperty(t.prototype,s,Object.getOwnPropertyDescriptor(e.prototype,s)||Object.create(null))})}),t}t(yi,"ownDefaults",{noScaleCache:!0,lockMovementX:!1,lockMovementY:!1,lockRotation:!1,lockScalingX:!1,lockScalingY:!1,lockSkewingX:!1,lockSkewingY:!1,lockScalingFlip:!1,cornerSize:13,touchCornerSize:24,transparentCorners:!0,cornerColor:"rgb(178,204,255)",cornerStrokeColor:"",cornerStyle:"rect",cornerDashArray:null,hasControls:!0,borderColor:"rgb(178,204,255)",borderDashArray:null,borderOpacityWhenMoving:.4,borderScaleFactor:1,hasBorders:!0,selectionBackgroundColor:"",selectable:!0,evented:!0,perPixelTargetFind:!1,activeOn:"down",hoverCursor:null,moveCursor:null});class xi extends yi{}_i(xi,[Ne]),J.setClass(xi),J.setClass(xi,"object");const Ci=(t,e,s,i)=>{const r=2*(i=Math.round(i))+1,{data:n}=t.getImageData(e-i,s-i,r,r);for(let t=3;t0)return!1}return!0};class bi{constructor(t){this.options=t,this.strokeProjectionMagnitude=this.options.strokeWidth/2,this.scale=new it(this.options.scaleX,this.options.scaleY),this.strokeUniformScalar=this.options.strokeUniform?new it(1/this.options.scaleX,1/this.options.scaleY):new it(1,1)}createSideVector(t,e){const s=xe(t,e);return this.options.strokeUniform?s.multiply(this.scale):s}projectOrthogonally(t,e,s){return this.applySkew(t.add(this.calcOrthogonalProjection(t,e,s)))}isSkewed(){return 0!==this.options.skewX||0!==this.options.skewY}applySkew(t){const e=new it(t);return e.y+=e.x*Math.tan(vt(this.options.skewY)),e.x+=e.y*Math.tan(vt(this.options.skewX)),e}scaleUnitVector(t,e){return t.multiply(this.strokeUniformScalar).scalarMultiply(e)}}const Si=new it;class wi extends bi{static getOrthogonalRotationFactor(t,e){const s=e?be(t,e):Se(t);return Math.abs(s)2&&void 0!==arguments[2]?arguments[2]:this.strokeProjectionMagnitude;const i=this.createSideVector(t,e),r=Te(i),n=wi.getOrthogonalRotationFactor(r,this.bisector);return this.scaleUnitVector(r,s*n)}projectBevel(){const t=[];return(this.alpha%x===0?[this.B]:[this.B,this.C]).forEach(e=>{t.push(this.projectOrthogonally(this.A,e)),t.push(this.projectOrthogonally(this.A,e,-this.strokeProjectionMagnitude))}),t}projectMiter(){const t=[],e=Math.abs(this.alpha),s=1/Math.sin(e/2),i=this.scaleUnitVector(this.bisector,-this.strokeProjectionMagnitude*s),r=this.options.strokeUniform?Ce(this.scaleUnitVector(this.bisector,this.options.strokeMiterLimit)):this.options.strokeMiterLimit;return Ce(i)/this.strokeProjectionMagnitude<=r&&t.push(this.applySkew(this.A.add(i))),t.push(...this.projectBevel()),t}projectRoundNoSkew(t,e){const s=[],i=new it(wi.getOrthogonalRotationFactor(this.bisector),wi.getOrthogonalRotationFactor(new it(this.bisector.y,this.bisector.x)));return[new it(1,0).scalarMultiply(this.strokeProjectionMagnitude).multiply(this.strokeUniformScalar).multiply(i),new it(0,1).scalarMultiply(this.strokeProjectionMagnitude).multiply(this.strokeUniformScalar).multiply(i)].forEach(i=>{De(i,t,e)&&s.push(this.A.add(i))}),s}projectRoundWithSkew(t,e){const s=[],{skewX:i,skewY:r,scaleX:n,scaleY:o,strokeUniform:a}=this.options,h=new it(Math.tan(vt(i)),Math.tan(vt(r))),l=this.strokeProjectionMagnitude,c=a?l/o/Math.sqrt(1/o**2+1/n**2*h.y**2):l/Math.sqrt(1+h.y**2),u=new it(Math.sqrt(Math.max(l**2-c**2,0)),c),d=a?l/Math.sqrt(1+h.x**2*(1/o)**2/(1/n+1/n*h.x*h.y)**2):l/Math.sqrt(1+h.x**2/(1+h.x*h.y)**2),g=new it(d,Math.sqrt(Math.max(l**2-d**2,0)));return[g,g.scalarMultiply(-1),u,u.scalarMultiply(-1)].map(t=>this.applySkew(a?t.multiply(this.strokeUniformScalar):t)).forEach(i=>{De(i,t,e)&&s.push(this.applySkew(this.A).add(i))}),s}projectRound(){const t=[];t.push(...this.projectBevel());const e=this.alpha%x===0,s=this.applySkew(this.A),i=t[e?0:2].subtract(s),r=t[e?1:0].subtract(s),n=e?this.applySkew(this.AB.scalarMultiply(-1)):this.applySkew(this.bisector.multiply(this.strokeUniformScalar).scalarMultiply(-1)),o=Oe(i,n)>0,a=o?i:r,h=o?r:i;return this.isSkewed()?t.push(...this.projectRoundWithSkew(a,h)):t.push(...this.projectRoundNoSkew(a,h)),t}projectPoints(){switch(this.options.strokeLineJoin){case"miter":return this.projectMiter();case"round":return this.projectRound();default:return this.projectBevel()}}project(){return this.projectPoints().map(t=>({originPoint:this.A,projectedPoint:t,angle:this.alpha,bisector:this.bisector}))}}class Ti extends bi{constructor(t,e,s){super(s),this.A=new it(t),this.T=new it(e)}calcOrthogonalProjection(t,e){let s=arguments.length>2&&void 0!==arguments[2]?arguments[2]:this.strokeProjectionMagnitude;const i=this.createSideVector(t,e);return this.scaleUnitVector(Te(i),s)}projectButt(){return[this.projectOrthogonally(this.A,this.T,this.strokeProjectionMagnitude),this.projectOrthogonally(this.A,this.T,-this.strokeProjectionMagnitude)]}projectRound(){const t=[];if(!this.isSkewed()&&this.A.eq(this.T)){const e=new it(1,1).scalarMultiply(this.strokeProjectionMagnitude).multiply(this.strokeUniformScalar);t.push(this.applySkew(this.A.add(e)),this.applySkew(this.A.subtract(e)))}else t.push(...new wi(this.A,this.T,this.T,this.options).projectRound());return t}projectSquare(){const t=[];if(this.A.eq(this.T)){const e=new it(1,1).scalarMultiply(this.strokeProjectionMagnitude).multiply(this.strokeUniformScalar);t.push(this.A.add(e),this.A.subtract(e))}else{const e=this.calcOrthogonalProjection(this.A,this.T,this.strokeProjectionMagnitude),s=this.scaleUnitVector(we(this.createSideVector(this.A,this.T)),-this.strokeProjectionMagnitude),i=this.A.add(s);t.push(i.add(e),i.subtract(e))}return t.map(t=>this.applySkew(t))}projectPoints(){switch(this.options.strokeLineCap){case"round":return this.projectRound();case"square":return this.projectSquare();default:return this.projectButt()}}project(){return this.projectPoints().map(t=>({originPoint:this.A,projectedPoint:t}))}}const Oi=function(t,e){let s=arguments.length>2&&void 0!==arguments[2]&&arguments[2];const i=[];if(0===t.length)return i;const r=t.reduce((t,e)=>(t[t.length-1].eq(e)||t.push(new it(e)),t),[new it(t[0])]);if(1===r.length)s=!0;else if(!s){const t=r[0],e=((t,e)=>{for(let s=t.length-1;s>=0;s--)if(e(t[s],s,t))return s;return-1})(r,e=>!e.eq(t));r.splice(e+1)}return r.forEach((t,r,n)=>{let o,a;0===r?(a=n[1],o=s?t:n[n.length-1]):r===n.length-1?(o=n[r-1],a=s?t:n[0]):(o=n[r-1],a=n[r+1]),s&&1===n.length?i.push(...new Ti(t,t,e).project()):!s||0!==r&&r!==n.length-1?i.push(...new wi(t,o,a,e).project()):i.push(...new Ti(t,0===r?a:o,e).project())}),i},ki=t=>{const e={};return Object.keys(t).forEach(s=>{e[s]={},Object.keys(t[s]).forEach(i=>{e[s][i]={...t[s][i]}})}),e},Di=t=>t.replace(/&/g,"&").replace(/"/g,""").replace(/'/g,"'").replace(//g,">");let Mi;const Ei=t=>{if(Mi||Mi||(Mi="Intl"in g()&&"Segmenter"in Intl&&new Intl.Segmenter(void 0,{granularity:"grapheme"})),Mi){const e=Mi.segment(t);return Array.from(e).map(t=>{let{segment:e}=t;return e})}return Pi(t)},Pi=t=>{const e=[];for(let s,i=0;i{const s=t.charCodeAt(e);if(isNaN(s))return"";if(s<55296||s>57343)return t.charAt(e);if(55296<=s&&s<=56319){if(t.length<=e+1)throw"High surrogate without following low surrogate";const s=t.charCodeAt(e+1);if(56320>s||s>57343)throw"High surrogate without following low surrogate";return t.charAt(e)+t.charAt(e+1)}if(0===e)throw"Low surrogate without preceding high surrogate";const i=t.charCodeAt(e-1);if(55296>i||i>56319)throw"Low surrogate without preceding high surrogate";return!1};var ji=Object.freeze({__proto__:null,capitalize:function(t){let e=arguments.length>1&&void 0!==arguments[1]&&arguments[1];return`${t.charAt(0).toUpperCase()}${e?t.slice(1):t.slice(1).toLowerCase()}`},escapeXml:Di,graphemeSplit:Ei});const Fi=function(t,e){let s=arguments.length>2&&void 0!==arguments[2]&&arguments[2];return t.fill!==e.fill||t.stroke!==e.stroke||t.strokeWidth!==e.strokeWidth||t.fontSize!==e.fontSize||t.fontFamily!==e.fontFamily||t.fontWeight!==e.fontWeight||t.fontStyle!==e.fontStyle||t.textDecorationThickness!==e.textDecorationThickness||t.textBackgroundColor!==e.textBackgroundColor||t.deltaY!==e.deltaY||s&&(t.overline!==e.overline||t.underline!==e.underline||t.linethrough!==e.linethrough)},Li=(t,e)=>{const s=e.split("\n"),i=[];let r=-1,n={};t=ki(t);for(let e=0;e0&&(Fi(n,o,!0)?i.push({start:r,end:r+1,style:o}):i[i.length-1].end++),n=o||{}}else r+=o.length,n={}}return i},Ri=(t,e)=>{if(!Array.isArray(t))return ki(t);const s=e.split(P),i={};let r=-1,n=0;for(let e=0;e1&&void 0!==arguments[1]?arguments[1]:{},s={};for(const i in e)$i(t,i.split(" "))&&(s={...s,...e[i]});return s}const Yi=t=>{var e;return null!==(e=cs[t])&&void 0!==e?e:t},Wi=new RegExp(`(${os})`,"gi"),Vi=`(${os})`,Gi=String.raw`(skewX)\(${Vi}\)`,zi=String.raw`(skewY)\(${Vi}\)`,Hi=String.raw`(rotate)\(${Vi}(?: ${Vi} ${Vi})?\)`,Ni=String.raw`(scale)\(${Vi}(?: ${Vi})?\)`,Ui=String.raw`(translate)\(${Vi}(?: ${Vi})?\)`,qi=`(?:${String.raw`(matrix)\(${Vi} ${Vi} ${Vi} ${Vi} ${Vi} ${Vi}\)`}|${Ui}|${Hi}|${Ni}|${Gi}|${zi})`,Ki=`(?:${qi}*)`,Ji=String.raw`^\s*(?:${Ki}?)\s*$`,Qi=new RegExp(Ji),Zi=new RegExp(qi),tr=new RegExp(qi,"g");function er(t){const e=[];if(!(t=(t=>t.replace(Wi," $1 ").replace(/,/gi," ").replace(/\s+/gi," "))(t).replace(/\s*([()])\s*/gi,"$1"))||t&&!Qi.test(t))return[...b];for(const s of t.matchAll(tr)){const t=Zi.exec(s[0]);if(!t)continue;let i=b;const r=t.filter(t=>!!t),[,n,...o]=r,[a,h,l,c,u,d]=o.map(t=>parseFloat(t));switch(n){case"translate":i=Ot(a,h);break;case L:i=kt({angle:a},{x:h,y:l});break;case Y:i=Dt(a,h);break;case G:i=Et(a);break;case z:i=Pt(a);break;case"matrix":i=[a,h,l,c,u,d]}e.push(i)}return St(e)}function sr(t,e,s,i){const r=Array.isArray(e);let n,o=e;if(t!==H&&t!==N||e!==E){if("strokeUniform"===t)return"non-scaling-stroke"===e;if("strokeDashArray"===t)o=e===E?null:e.replace(/,/g," ").split(/\s+/).map(parseFloat);else if("transformMatrix"===t)o=s&&s.transformMatrix?bt(s.transformMatrix,er(e)):er(e);else if("visible"===t)o=e!==E&&"hidden"!==e,s&&!1===s.visible&&(o=!1);else if("opacity"===t)o=parseFloat(e),s&&void 0!==s.opacity&&(o*=s.opacity);else if("textAnchor"===t)o="start"===e?O:"end"===e?M:T;else if("charSpacing"===t||t===qe)n=Ge(e,i)/i*1e3;else if("paintFirst"===t){const t=e.indexOf(H),s=e.indexOf(N);o=H,(t>-1&&s>-1&&s-1)&&(o=N)}else{if("href"===t||"xlink:href"===t||"font"===t||"id"===t)return e;if("imageSmoothing"===t)return"optimizeQuality"===e;n=r?e.map(Ge):Ge(e,i)}}else o="";return!r&&isNaN(n)?o:n}function ir(t,e){t.replace(/;\s*$/,"").split(";").forEach(t=>{if(!t)return;const[s,i]=t.split(":");e[s.trim().toLowerCase()]=i.trim()})}function rr(t){const e={},s=t.getAttribute("style");return s?("string"==typeof s?ir(s,e):function(t,e){Object.entries(t).forEach(t=>{let[s,i]=t;void 0!==i&&(e[s.toLowerCase()]=i)})}(s,e),e):e}const nr={stroke:"strokeOpacity",fill:"fillOpacity"};function or(t,e,s){if(!t)return{};let i,r={},n=S;t.parentNode&&ps.test(t.parentNode.nodeName)&&(r=or(t.parentElement,e,s),r.fontSize&&(i=n=Ge(r.fontSize)));const o={...e.reduce((e,s)=>{const i=t.getAttribute(s);return i&&(e[s]=i),e},{}),...Xi(t,s),...rr(t)};o[ds]&&t.setAttribute(ds,o[ds]),o[us]&&(i=Ge(o[us],n),o[us]=`${i}`);const a={};for(const t in o){const e=Yi(t),s=sr(e,o[t],r,i);a[e]=s}a&&a.font&&function(t,e){const s=t.match(ls);if(!s)return;const i=s[1],r=s[3],n=s[4],o=s[5],a=s[6];i&&(e.fontStyle=i),r&&(e.fontWeight=isNaN(parseFloat(r))?r:parseFloat(r)),n&&(e.fontSize=Ge(n)),a&&(e.fontFamily=a),o&&(e.lineHeight="normal"===o?1:o)}(a.font,a);const h={...r,...a};return ps.test(t.nodeName)?h:function(t){const e=xi.getDefaults();return Object.entries(nr).forEach(s=>{let[i,r]=s;if(void 0===t[r]||""===t[i])return;if(void 0===t[i]){if(!e[i])return;t[i]=e[i]}if(0===t[i].indexOf("url("))return;const n=new Ve(t[i]);t[i]=n.setAlpha($t(n.getAlpha()*t[r],2)).toRgba()}),t}(h)}const ar=["rx","ry"];class hr extends xi{static getDefaults(){return{...super.getDefaults(),...hr.ownDefaults}}constructor(t){super(),Object.assign(this,hr.ownDefaults),this.setOptions(t),this._initRxRy()}_initRxRy(){const{rx:t,ry:e}=this;t&&!e?this.ry=t:e&&!t&&(this.rx=e)}_render(t){const{width:e,height:s}=this,i=-e/2,r=-s/2,n=this.rx?Math.min(this.rx,e/2):0,o=this.ry?Math.min(this.ry,s/2):0,a=0!==n||0!==o;t.beginPath(),t.moveTo(i+n,r),t.lineTo(i+e-n,r),a&&t.bezierCurveTo(i+e-w*n,r,i+e,r+w*o,i+e,r+o),t.lineTo(i+e,r+s-o),a&&t.bezierCurveTo(i+e,r+s-w*o,i+e-w*n,r+s,i+e-n,r+s),t.lineTo(i+n,r+s),a&&t.bezierCurveTo(i+w*n,r+s,i,r+s-w*o,i,r+s-o),t.lineTo(i,r+o),a&&t.bezierCurveTo(i,r+w*o,i+w*n,r,i+n,r),t.closePath(),this._renderPaintInOrder(t)}toObject(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[];return super.toObject([...ar,...t])}_toSVG(){const{width:t,height:e,rx:s,ry:i}=this;return["\n`]}static async fromElement(t,e,s){const{left:i=0,top:r=0,width:n=0,height:o=0,visible:a=!0,...h}=or(t,this.ATTRIBUTE_NAMES,s);return new this({...e,...h,left:i,top:r,width:n,height:o,visible:Boolean(a&&n&&o)})}}t(hr,"type","Rect"),t(hr,"cacheProperties",[...bs,...ar]),t(hr,"ownDefaults",{rx:0,ry:0}),t(hr,"ATTRIBUTE_NAMES",[...Ii,"x","y","rx","ry","width","height"]),J.setClass(hr),J.setSVGClass(hr);const lr="initialization",cr="added",ur="removed",dr="imperative",gr=(t,e)=>{const{strokeUniform:s,strokeWidth:i,width:r,height:n,group:o}=e,a=o&&o!==t?ce(o.calcTransformMatrix(),t.calcTransformMatrix()):null,h=a?e.getRelativeCenterPoint().transform(a):e.getRelativeCenterPoint(),l=!e.isStrokeAccountedForInDimensions(),c=s&&l?de(new it(i,i),void 0,t.calcTransformMatrix()):rt,u=!s&&l?i:0,d=le(r+u,n+u,St([a,e.calcOwnMatrix()],!0)).add(c).scalarDivide(2);return[h.subtract(d),h.add(d)]};class fr{calcLayoutResult(t,e){if(this.shouldPerformLayout(t))return this.calcBoundingBox(e,t)}shouldPerformLayout(t){let{type:e,prevStrategy:s,strategy:i}=t;return e===lr||e===dr||!!s&&i!==s}shouldLayoutClipPath(t){let{type:e,target:{clipPath:s}}=t;return e!==lr&&s&&!s.absolutePositioned}getInitialSize(t,e){return e.size}calcBoundingBox(t,e){const{type:s,target:i}=e;if(s===dr&&e.overrides)return e.overrides;if(0===t.length)return;const{left:r,top:n,width:o,height:a}=re(t.map(t=>gr(i,t)).reduce((t,e)=>t.concat(e),[])),h=new it(o,a),l=new it(r,n).add(h.scalarDivide(2));if(s===lr){const t=this.getInitialSize(e,{size:h,center:l});return{center:l,relativeCorrection:new it(0,0),size:t}}return{center:l.transform(i.calcOwnMatrix()),size:h}}}t(fr,"type","strategy");class pr extends fr{shouldPerformLayout(t){return!0}}t(pr,"type","fit-content"),J.setClass(pr);const mr="layoutManager";class vr{constructor(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:new pr;t(this,"strategy",void 0),this.strategy=e,this._subscriptions=new Map}performLayout(t){const e={bubbles:!0,strategy:this.strategy,...t,prevStrategy:this._prevLayoutStrategy,stopPropagation(){this.bubbles=!1}};this.onBeforeLayout(e);const s=this.getLayoutResult(e);s&&this.commitLayout(e,s),this.onAfterLayout(e,s),this._prevLayoutStrategy=e.strategy}attachHandlers(t,e){const{target:s}=e;return[U,A,I,F,j,R,X,B,$].map(e=>t.on(e,t=>this.performLayout(e===U?{type:"object_modified",trigger:e,e:t,target:s}:{type:"object_modifying",trigger:e,e:t,target:s})))}subscribe(t,e){this.unsubscribe(t,e);const s=this.attachHandlers(t,e);this._subscriptions.set(t,s)}unsubscribe(t,e){(this._subscriptions.get(t)||[]).forEach(t=>t()),this._subscriptions.delete(t)}unsubscribeTargets(t){t.targets.forEach(e=>this.unsubscribe(e,t))}subscribeTargets(t){t.targets.forEach(e=>this.subscribe(e,t))}onBeforeLayout(t){const{target:e,type:s}=t,{canvas:i}=e;if(s===lr||s===cr?this.subscribeTargets(t):s===ur&&this.unsubscribeTargets(t),e.fire("layout:before",{context:t}),i&&i.fire("object:layout:before",{target:e,context:t}),s===dr&&t.deep){const{strategy:s,...i}=t;e.forEachObject(t=>t.layoutManager&&t.layoutManager.performLayout({...i,bubbles:!1,target:t}))}}getLayoutResult(t){const{target:e,strategy:s,type:i}=t,r=s.calcLayoutResult(t,e.getObjects());if(!r)return;const n=i===lr?new it:e.getRelativeCenterPoint(),{center:o,correction:a=new it,relativeCorrection:h=new it}=r,l=n.subtract(o).add(a).transform(i===lr?b:Ct(e.calcOwnMatrix()),!0).add(h);return{result:r,prevCenter:n,nextCenter:o,offset:l}}commitLayout(t,e){const{target:s}=t,{result:{size:i},nextCenter:r}=e;var n,o;(s.set({width:i.x,height:i.y}),this.layoutObjects(t,e),t.type===lr)?s.set({left:null!==(n=t.x)&&void 0!==n?n:r.x+i.x*me(s.originX),top:null!==(o=t.y)&&void 0!==o?o:r.y+i.y*me(s.originY)}):(s.setPositionByOrigin(r,T,T),s.setCoords(),s.set("dirty",!0))}layoutObjects(t,e){const{target:s}=t;s.forEachObject(i=>{i.group===s&&this.layoutObject(t,e,i)}),t.strategy.shouldLayoutClipPath(t)&&this.layoutObject(t,e,s.clipPath)}layoutObject(t,e,s){let{offset:i}=e;s.set({left:s.left+i.x,top:s.top+i.y})}onAfterLayout(t,e){const{target:s,strategy:i,bubbles:r,prevStrategy:n,...o}=t,{canvas:a}=s;s.fire("layout:after",{context:t,result:e}),a&&a.fire("object:layout:after",{context:t,result:e,target:s});const h=s.parent;r&&null!=h&&h.layoutManager&&((o.path||(o.path=[])).push(s),h.layoutManager.performLayout({...o,target:h})),s.set("dirty",!0)}dispose(){const{_subscriptions:t}=this;t.forEach(t=>t.forEach(t=>t())),t.clear()}toObject(){return{type:mr,strategy:this.strategy.constructor.type}}toJSON(){return this.toObject()}}J.setClass(vr,mr);class yr extends vr{performLayout(){}}class _r extends(ot(xi)){static getDefaults(){return{...super.getDefaults(),..._r.ownDefaults}}constructor(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[],s=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};super(),t(this,"_activeObjects",[]),t(this,"__objectSelectionTracker",void 0),t(this,"__objectSelectionDisposer",void 0),Object.assign(this,_r.ownDefaults),this.setOptions(s),this.groupInit(e,s)}groupInit(t,e){var s;this._objects=[...t],this.__objectSelectionTracker=this.__objectSelectionMonitor.bind(this,!0),this.__objectSelectionDisposer=this.__objectSelectionMonitor.bind(this,!1),this.forEachObject(t=>{this.enterGroup(t,!1)}),this.layoutManager=null!==(s=e.layoutManager)&&void 0!==s?s:new vr,this.layoutManager.performLayout({type:lr,target:this,targets:[...t],x:e.left,y:e.top})}canEnterGroup(t){return t===this||this.isDescendantOf(t)?(i("error","Group: circular object trees are not supported, this call has no effect"),!1):-1===this._objects.indexOf(t)||(i("error","Group: duplicate objects are not supported inside group, this call has no effect"),!1)}_filterObjectsBeforeEnteringGroup(t){return t.filter((t,e,s)=>this.canEnterGroup(t)&&s.indexOf(t)===e)}add(){for(var t=arguments.length,e=new Array(t),s=0;s1?e-1:0),i=1;i{s._set(t,e)}),this}_shouldSetNestedCoords(){return this.subTargetCheck}removeAll(){return this._activeObjects=[],this.remove(...this._objects)}__objectSelectionMonitor(t,e){let{target:s}=e;const i=this._activeObjects;if(t)i.push(s),this._set("dirty",!0);else if(i.length>0){const t=i.indexOf(s);t>-1&&(i.splice(t,1),this._set("dirty",!0))}}_watchObject(t,e){t&&this._watchObject(!1,e),t?(e.on("selected",this.__objectSelectionTracker),e.on("deselected",this.__objectSelectionDisposer)):(e.off("selected",this.__objectSelectionTracker),e.off("deselected",this.__objectSelectionDisposer))}enterGroup(t,e){t.group&&t.group.remove(t),t._set("parent",this),this._enterGroup(t,e)}_enterGroup(t,e){e&&oe(t,bt(Ct(this.calcTransformMatrix()),t.calcTransformMatrix())),this._shouldSetNestedCoords()&&t.setCoords(),t._set("group",this),t._set("canvas",this.canvas),this._watchObject(!0,t);const s=this.canvas&&this.canvas.getActiveObject&&this.canvas.getActiveObject();s&&(s===t||t.isDescendantOf(s))&&this._activeObjects.push(t)}exitGroup(t,e){this._exitGroup(t,e),t._set("parent",void 0),t._set("canvas",void 0)}_exitGroup(t,e){t._set("group",void 0),e||(oe(t,bt(this.calcTransformMatrix(),t.calcTransformMatrix())),t.setCoords()),this._watchObject(!1,t);const s=this._activeObjects.length>0?this._activeObjects.indexOf(t):-1;s>-1&&this._activeObjects.splice(s,1)}shouldCache(){const t=xi.prototype.shouldCache.call(this);if(t)for(let t=0;tt.setCoords())}triggerLayout(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};this.layoutManager.performLayout({target:this,type:dr,...t})}render(t){this._transformDone=!0,super.render(t),this._transformDone=!1}__serializeObjects(t,e){const s=this.includeDefaultValues;return this._objects.filter(function(t){return!t.excludeFromExport}).map(function(i){const r=i.includeDefaultValues;i.includeDefaultValues=s;const n=i[t||"toObject"](e);return i.includeDefaultValues=r,n})}toObject(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[];const e=this.layoutManager.toObject();return{...super.toObject(["subTargetCheck","interactive",...t]),..."fit-content"!==e.strategy||this.includeDefaultValues?{layoutManager:e}:{},objects:this.__serializeObjects("toObject",t)}}toString(){return`#`}dispose(){this.layoutManager.unsubscribeTargets({targets:this.getObjects(),target:this}),this._activeObjects=[],this.forEachObject(t=>{this._watchObject(!1,t),t.dispose()}),super.dispose()}_createSVGBgRect(t){if(!this.backgroundColor)return"";const e=hr.prototype._toSVG.call(this),s=e.indexOf("COMMON_PARTS");e[s]='for="group" ';const i=e.join("");return t?t(i):i}_toSVG(t){const e=["\n"],s=this._createSVGBgRect(t);s&&e.push("\t\t",s);for(let s=0;s\n"),e}getSvgStyles(){const t=void 0!==this.opacity&&1!==this.opacity?`opacity: ${this.opacity};`:"",e=this.visible?"":" visibility: hidden;";return[t,this.getSvgFilter(),e].join("")}toClipPathSVG(t){const e=[],s=this._createSVGBgRect(t);s&&e.push("\t",s);for(let s=0;s{let[e,s]=t;const i=new this(e,{...n,...s,layoutManager:new yr});if(r){const t=J.getClass(r.type),e=J.getClass(r.strategy);i.layoutManager=new t(new e)}else i.layoutManager=new vr;return i.layoutManager.subscribeTargets({type:lr,target:i,targets:i.getObjects()}),i.setCoords(),i})}}t(_r,"type","Group"),t(_r,"ownDefaults",{strokeWidth:0,subTargetCheck:!1,interactive:!1}),J.setClass(_r);const xr=(t,e)=>Math.min(e.width/t.width,e.height/t.height),Cr=(t,e)=>Math.max(e.width/t.width,e.height/t.height),br="\\s*,?\\s*",Sr=`${br}(${os})`,wr=`${Sr}${Sr}${Sr}${br}([01])${br}([01])${Sr}${Sr}`,Tr={m:"l",M:"L"},Or=(t,e,s,i,r,n,o,a,h,l,c)=>{const u=et(t),d=st(t),g=et(e),f=st(e),p=s*r*g-i*n*f+o,m=i*r*g+s*n*f+a;return["C",l+h*(-s*r*d-i*n*u),c+h*(-i*r*d+s*n*u),p+h*(s*r*f+i*n*g),m+h*(i*r*f-s*n*g),p,m]},kr=(t,e,s,i)=>{const r=Math.atan2(e,t),n=Math.atan2(i,s);return n>=r?n-r:2*Math.PI-(r-n)};function Dr(t,e,i,r,n,o,a,h){let l;if(s.cachesBoundsOfCurve&&(l=[...arguments].join(),p.boundsOfCurveCache[l]))return p.boundsOfCurveCache[l];const c=Math.sqrt,u=Math.abs,d=[],g=[[0,0],[0,0]];let f=6*t-12*i+6*n,m=-3*t+9*i-9*n+3*a,v=3*i-3*t;for(let t=0;t<2;++t){if(t>0&&(f=6*e-12*r+6*o,m=-3*e+9*r-9*o+3*h,v=3*r-3*e),u(m)<1e-12){if(u(f)<1e-12)continue;const t=-v/f;0{let[i,r,n,o,a,h,l,c]=s;const u=((t,e,s,i,r,n,o)=>{if(0===s||0===i)return[];let a=0,h=0,l=0;const c=Math.PI,u=o*C,d=st(u),g=et(u),f=.5*(-g*t-d*e),p=.5*(-g*e+d*t),m=s**2,v=i**2,y=p**2,_=f**2,x=m*v-m*y-v*_;let b=Math.abs(s),S=Math.abs(i);if(x<0){const t=Math.sqrt(1-x/(m*v));b*=t,S*=t}else l=(r===n?-1:1)*Math.sqrt(x/(m*y+v*_));const w=l*b*p/S,T=-l*S*f/b,O=g*w-d*T+.5*t,k=d*w+g*T+.5*e;let D=kr(1,0,(f-w)/b,(p-T)/S),M=kr((f-w)/b,(p-T)/S,(-f-w)/b,(-p-T)/S);0===n&&M>0?M-=2*c:1===n&&M<0&&(M+=2*c);const E=Math.ceil(Math.abs(M/c*2)),P=[],A=M/E,j=8/3*Math.sin(A/4)*Math.sin(A/4)/Math.sin(A/2);let F=D+A;for(let t=0;t{let e=0,s=0,i=0,r=0;const n=[];let o,a=0,h=0;for(const l of t){const t=[...l];let c;switch(t[0]){case"l":t[1]+=e,t[2]+=s;case"L":e=t[1],s=t[2],c=["L",e,s];break;case"h":t[1]+=e;case"H":e=t[1],c=["L",e,s];break;case"v":t[1]+=s;case"V":s=t[1],c=["L",e,s];break;case"m":t[1]+=e,t[2]+=s;case"M":e=t[1],s=t[2],i=t[1],r=t[2],c=["M",e,s];break;case"c":t[1]+=e,t[2]+=s,t[3]+=e,t[4]+=s,t[5]+=e,t[6]+=s;case"C":a=t[3],h=t[4],e=t[5],s=t[6],c=["C",t[1],t[2],a,h,e,s];break;case"s":t[1]+=e,t[2]+=s,t[3]+=e,t[4]+=s;case"S":"C"===o?(a=2*e-a,h=2*s-h):(a=e,h=s),e=t[3],s=t[4],c=["C",a,h,t[1],t[2],e,s],a=c[3],h=c[4];break;case"q":t[1]+=e,t[2]+=s,t[3]+=e,t[4]+=s;case"Q":a=t[1],h=t[2],e=t[3],s=t[4],c=["Q",a,h,e,s];break;case"t":t[1]+=e,t[2]+=s;case"T":"Q"===o?(a=2*e-a,h=2*s-h):(a=e,h=s),e=t[1],s=t[2],c=["Q",a,h,e,s];break;case"a":t[6]+=e,t[7]+=s;case"A":Mr(e,s,t).forEach(t=>n.push(t)),e=t[6],s=t[7];break;case"z":case"Z":e=i,s=r,c=["Z"]}c?(n.push(c),o=c[0]):o=""}return n},Pr=(t,e,s,i)=>Math.sqrt((s-t)**2+(i-e)**2),Ar=(t,e,s,i,r,n,o,a)=>h=>{const l=h**3,c=(t=>3*t**2*(1-t))(h),u=(t=>3*t*(1-t)**2)(h),d=(t=>(1-t)**3)(h);return new it(o*l+r*c+s*u+t*d,a*l+n*c+i*u+e*d)},jr=t=>t**2,Fr=t=>2*t*(1-t),Lr=t=>(1-t)**2,Rr=(t,e,s,i,r,n,o,a)=>h=>{const l=jr(h),c=Fr(h),u=Lr(h),d=3*(u*(s-t)+c*(r-s)+l*(o-r)),g=3*(u*(i-e)+c*(n-i)+l*(a-n));return Math.atan2(g,d)},Ir=(t,e,s,i,r,n)=>o=>{const a=jr(o),h=Fr(o),l=Lr(o);return new it(r*a+s*h+t*l,n*a+i*h+e*l)},Br=(t,e,s,i,r,n)=>o=>{const a=1-o,h=2*(a*(s-t)+o*(r-s)),l=2*(a*(i-e)+o*(n-i));return Math.atan2(l,h)},$r=(t,e,s)=>{let i=new it(e,s),r=0;for(let e=1;e<=100;e+=1){const s=t(e/100);r+=Pr(i.x,i.y,s.x,s.y),i=s}return r},Xr=(t,e)=>{let s,i=0,r=0,n={x:t.x,y:t.y},o={...n},a=.01,h=0;const l=t.iterator,c=t.angleFinder;for(;r1e-4;)o=l(i),h=i,s=Pr(n.x,n.y,o.x,o.y),s+r>e?(i-=a,a/=2):(n=o,i+=a,r+=s);return{...o,angle:c(h)}},Yr=t=>{let e,s,i=0,r=0,n=0,o=0,a=0;const h=[];for(const l of t){const t={x:r,y:n,command:l[0],length:0};switch(l[0]){case"M":s=t,s.x=o=r=l[1],s.y=a=n=l[2];break;case"L":s=t,s.length=Pr(r,n,l[1],l[2]),r=l[1],n=l[2];break;case"C":e=Ar(r,n,l[1],l[2],l[3],l[4],l[5],l[6]),s=t,s.iterator=e,s.angleFinder=Rr(r,n,l[1],l[2],l[3],l[4],l[5],l[6]),s.length=$r(e,r,n),r=l[5],n=l[6];break;case"Q":e=Ir(r,n,l[1],l[2],l[3],l[4]),s=t,s.iterator=e,s.angleFinder=Br(r,n,l[1],l[2],l[3],l[4]),s.length=$r(e,r,n),r=l[3],n=l[4];break;case"Z":s=t,s.destX=o,s.destY=a,s.length=Pr(r,n,o,a),r=o,n=a}i+=s.length,h.push(s)}return h.push({length:i,x:r,y:n}),h},Wr=function(t,e){let s=arguments.length>2&&void 0!==arguments[2]?arguments[2]:Yr(t),i=0;for(;e-s[i].length>0&&i{var e;const s=[],i=null!==(e=t.match(Vr))&&void 0!==e?e:[];for(const t of i){const e=t[0];if("z"===e||"Z"===e){s.push([e]);continue}const i=Hr[e.toLowerCase()];let r=[];if("a"===e||"A"===e){Gr.lastIndex=0;for(let e=null;e=Gr.exec(t);)r.push(...e.slice(1))}else r=t.match(zr)||[];for(let t=0;t0&&o?o:e;for(let e=0;e1&&void 0!==arguments[1]?arguments[1]:0,s=new it(t[0]),i=new it(t[1]),r=1,n=0;const o=[],a=t.length,h=a>2;let l;for(h&&(r=t[2].xt[l-2].x?1:s.x===t[l-2].x?0:-1,n=s.y>t[l-2].y?1:s.y===t[l-2].y?0:-1),o.push(["L",s.x+r*e,s.y+n*e]),o},qr=(t,e)=>t.map(t=>t.map((t,s)=>0===s||void 0===e?t:$t(t,e)).join(" ")).join(" "),Kr=(t,e)=>Math.floor(Math.random()*(e-t+1))+t,Jr=(t,e)=>{let s=t._findCenterFromElement();t.transformMatrix&&((t=>{if(t.transformMatrix){const{scaleX:e,scaleY:s,angle:i,skewX:r}=Tt(t.transformMatrix);t.flipX=!1,t.flipY=!1,t.set(W,e),t.set(V,s),t.angle=i,t.skewX=r,t.skewY=0}})(t),s=s.transform(t.transformMatrix)),delete t.transformMatrix,e&&(t.scaleX*=e.scaleX,t.scaleY*=e.scaleY,t.cropX=e.cropX,t.cropY=e.cropY,s.x+=e.offsetLeft,s.y+=e.offsetTop,t.width=e.width,t.height=e.height),t.setPositionByOrigin(s,T,T)};var Qr=Object.freeze({__proto__:null,addTransformToObject:ne,animate:Is,animateColor:Bs,applyTransformToObject:oe,calcAngleBetweenVectors:be,calcDimensionsMatrix:At,calcPlaneChangeMatrix:ce,calcVectorRotation:Se,cancelAnimFrame:lt,capValue:xs,composeMatrix:jt,copyCanvasElement:t=>{var e;const s=ft(t);return null===(e=s.getContext("2d"))||void 0===e||e.drawImage(t,0,0),s},cos:et,createCanvasElement:dt,createImage:gt,createRotateMatrix:kt,createScaleMatrix:Dt,createSkewXMatrix:Et,createSkewYMatrix:Pt,createTranslateMatrix:Ot,createVector:xe,crossProduct:Oe,degreesToRadians:vt,dotProduct:ke,ease:Ms,enlivenObjectEnlivables:Rt,enlivenObjects:Lt,findScaleToCover:Cr,findScaleToFit:xr,getBoundsOfCurve:Dr,getOrthonormalVector:Te,getPathSegmentsInfo:Yr,getPointOnPath:Wr,getPointer:ee,getRandomInt:Kr,getRegularPolygonPath:(t,e)=>{const s=2*Math.PI/t;let i=-y;t%2==0&&(i+=s/2);const r=new Array(t+1);for(let n=0;n{const e=["instantiated_by_use","style","id","class"];switch(t){case"linearGradient":return e.concat(["x1","y1","x2","y2","gradientUnits","gradientTransform"]);case"radialGradient":return e.concat(["gradientUnits","gradientTransform","cx","cy","r","fx","fy","fr"]);case"stop":return e.concat(["offset","stop-color","stop-opacity"])}return e},getUnitVector:we,groupSVGElements:(t,e)=>t&&1===t.length?t[0]:new _r(t,e),hasStyleChanged:Fi,invertTransform:Ct,isBetweenVectors:De,isIdentityMatrix:_t,isTouchEvent:se,isTransparent:Ci,joinPath:qr,loadImage:Ft,magnitude:Ce,makeBoundingBoxFromPoints:re,makePathSimpler:Er,matrixToSVG:Xt,mergeClipPaths:(t,e)=>{var s;let i=t,r=e;i.inverted&&!r.inverted&&(i=e,r=t),ge(r,null===(s=r.group)||void 0===s?void 0:s.calcTransformMatrix(),i.calcTransformMatrix());const n=i.inverted&&r.inverted;return n&&(i.inverted=r.inverted=!1),new _r([i],{clipPath:r,inverted:n})},multiplyTransformMatrices:bt,multiplyTransformMatrixArray:St,parsePath:Nr,parsePreserveAspectRatioAttribute:ze,parseUnit:Ge,pick:It,projectStrokeOnPoints:Oi,qrDecompose:Tt,radiansToDegrees:yt,removeFromArray:tt,removeTransformFromObject:(t,e)=>{const s=Ct(e),i=bt(s,t.calcOwnMatrix());oe(t,i)},removeTransformMatrixForSvgParsing:Jr,requestAnimFrame:ht,resetObjectTransform:ae,rotateVector:_e,saveObjectTransform:he,sendObjectToPlane:ge,sendPointToPlane:ue,sendVectorToPlane:de,sin:st,sizeAfterTransform:le,string:ji,stylesFromArray:Ri,stylesToArray:Li,toBlob:mt,toDataURL:pt,toFixed:$t,transformPath:(t,e,s)=>(s&&(e=bt(e,[1,0,0,1,-s.x,-s.y])),t.map(t=>{const s=[...t];for(let i=1;i{let[e,i]=t;return s.setProperty(e,i)})}class tn extends Jt{constructor(e){let{allowTouchScrolling:s=!1,containerClass:i=""}=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};super(e),t(this,"upper",void 0),t(this,"container",void 0);const{el:r}=this.lower,n=this.createUpperCanvas();this.upper={el:n,ctx:n.getContext("2d")},this.applyCanvasStyle(r,{allowTouchScrolling:s}),this.applyCanvasStyle(n,{allowTouchScrolling:s,styles:{position:"absolute",left:"0",top:"0"}});const o=this.createContainerElement();o.classList.add(i),r.parentNode&&r.parentNode.replaceChild(o,r),o.append(r,n),this.container=o}createUpperCanvas(){const{el:t}=this.lower,e=dt();return e.className=t.className,e.classList.remove("lower-canvas"),e.classList.add("upper-canvas"),e.setAttribute("data-fabric","top"),e.style.cssText=t.style.cssText,e.setAttribute("draggable","true"),e}createContainerElement(){const t=d().createElement("div");return t.setAttribute("data-fabric","wrapper"),Zr(t,{position:"relative"}),Kt(t),t}applyCanvasStyle(t,e){const{styles:s,allowTouchScrolling:i}=e;Zr(t,{...s,"touch-action":i?"manipulation":E}),Kt(t)}setDimensions(t,e){super.setDimensions(t,e);const{el:s,ctx:i}=this.upper;Ut(s,i,t,e)}setCSSDimensions(t){super.setCSSDimensions(t),qt(this.upper.el,t),qt(this.container,t)}cleanupDOM(t){const e=this.container,{el:s}=this.lower,{el:i}=this.upper;super.cleanupDOM(t),e.removeChild(i),e.removeChild(s),e.parentNode&&e.parentNode.replaceChild(s,e)}dispose(){super.dispose(),u().dispose(this.upper.el),delete this.upper,delete this.container}}class en extends Zt{constructor(){super(...arguments),t(this,"isolatedObject",void 0),t(this,"_searchTargets",void 0),t(this,"_hoveredTargets",[]),t(this,"_currentTransform",null),t(this,"_groupSelector",null),t(this,"contextTopDirty",!1)}static getDefaults(){return{...super.getDefaults(),...en.ownDefaults}}get upperCanvasEl(){var t;return null===(t=this.elements.upper)||void 0===t?void 0:t.el}get contextTop(){var t;return null===(t=this.elements.upper)||void 0===t?void 0:t.ctx}get wrapperEl(){return this.elements.container}initElements(t){this.elements=new tn(t,{allowTouchScrolling:this.allowTouchScrolling,containerClass:this.containerClass}),this._createCacheCanvas()}_onObjectAdded(t){this._objectsToRender=void 0,super._onObjectAdded(t)}_onObjectRemoved(t){this._objectsToRender=void 0,t===this._activeObject&&(this.fire("before:selection:cleared",{deselected:[t]}),this._discardActiveObject(),this.fire("selection:cleared",{deselected:[t]}),t.fire("deselected",{target:t})),t===this._hoveredTarget&&(this._hoveredTarget=void 0,this._hoveredTargets=[]),super._onObjectRemoved(t)}_onStackOrderChanged(){this._objectsToRender=void 0,super._onStackOrderChanged()}_chooseObjectsToRender(){const t=this._activeObject;return!this.preserveObjectStacking&&t?this._objects.filter(e=>!e.group&&e!==t).concat(t):this._objects}renderAll(){this.cancelRequestedRender(),this.destroyed||(!this.contextTopDirty||this._groupSelector||this.isDrawingMode||(this.clearContext(this.contextTop),this.contextTopDirty=!1),this.hasLostContext&&(this.renderTopLayer(this.contextTop),this.hasLostContext=!1),!this._objectsToRender&&(this._objectsToRender=this._chooseObjectsToRender()),this.renderCanvas(this.getContext(),this._objectsToRender))}renderTopLayer(t){t.save(),this.isDrawingMode&&this._isCurrentlyDrawing&&(this.freeDrawingBrush&&this.freeDrawingBrush._render(),this.contextTopDirty=!0),this.selection&&this._groupSelector&&(this._drawSelection(t),this.contextTopDirty=!0),t.restore()}renderTop(){const t=this.contextTop;this.clearContext(t),this.renderTopLayer(t),this.fire("after:render",{ctx:t})}setTargetFindTolerance(t){t=Math.round(t),this.targetFindTolerance=t;const e=this.getRetinaScaling(),s=Math.ceil((2*t+1)*e);this.pixelFindCanvasEl.width=this.pixelFindCanvasEl.height=s,this.pixelFindContext.scale(e,e)}isTargetTransparent(t,e,s){const i=this.targetFindTolerance,r=this.pixelFindContext;this.clearContext(r),r.save(),r.translate(-e+i,-s+i),r.transform(...this.viewportTransform);const n=t.selectionBackgroundColor;t.selectionBackgroundColor="",t.render(r),t.selectionBackgroundColor=n,r.restore();const o=Math.round(i*this.getRetinaScaling());return Ci(r,o,o,o)}_isSelectionKeyPressed(t){const e=this.selectionKey;return!!e&&(Array.isArray(e)?!!e.find(e=>!!e&&!0===t[e]):t[e])}_shouldClearSelection(t,e){const s=this.getActiveObjects(),i=this._activeObject;return!!(!e||e&&i&&s.length>1&&-1===s.indexOf(e)&&i!==e&&!this._isSelectionKeyPressed(t)||e&&!e.evented||e&&!e.selectable&&i&&i!==e)}_shouldCenterTransform(t,e,s){if(!t)return;let i;return e===Y||e===W||e===V||e===I?i=this.centeredScaling||t.centeredScaling:e===L&&(i=this.centeredRotation||t.centeredRotation),i?!s:s}_getOriginFromCorner(t,e){const s={x:t.originX,y:t.originY};return e?(["ml","tl","bl"].includes(e)?s.x=M:["mr","tr","br"].includes(e)&&(s.x=O),["tl","mt","tr"].includes(e)?s.y=D:["bl","mb","br"].includes(e)&&(s.y=k),s):s}_setupCurrentTransform(t,e,s){var i;const r=e.group?ue(this.getScenePoint(t),void 0,e.group.calcTransformMatrix()):this.getScenePoint(t),{key:n="",control:o}=e.getActiveControl()||{},a=s&&o?null===(i=o.getActionHandler(t,e,o))||void 0===i?void 0:i.bind(o):Re,h=((t,e,s,i)=>{if(!e||!t)return"drag";const r=i.controls[e];return r.getActionName(s,r,i)})(s,n,t,e),l=t[this.centeredKey],c=this._shouldCenterTransform(e,h,l)?{x:T,y:T}:this._getOriginFromCorner(e,n),u={target:e,action:h,actionHandler:a,actionPerformed:!1,corner:n,scaleX:e.scaleX,scaleY:e.scaleY,skewX:e.skewX,skewY:e.skewY,offsetX:r.x-e.left,offsetY:r.y-e.top,originX:c.x,originY:c.y,ex:r.x,ey:r.y,lastX:r.x,lastY:r.y,theta:vt(e.angle),width:e.width,height:e.height,shiftKey:t.shiftKey,altKey:l,original:{...he(e),originX:c.x,originY:c.y}};this._currentTransform=u,this.fire("before:transform",{e:t,transform:u})}setCursor(t){this.upperCanvasEl.style.cursor=t}_drawSelection(t){const{x:e,y:s,deltaX:i,deltaY:r}=this._groupSelector,n=new it(e,s).transform(this.viewportTransform),o=new it(e+i,s+r).transform(this.viewportTransform),a=this.selectionLineWidth/2;let h=Math.min(n.x,o.x),l=Math.min(n.y,o.y),c=Math.max(n.x,o.x),u=Math.max(n.y,o.y);this.selectionColor&&(t.fillStyle=this.selectionColor,t.fillRect(h,l,c-h,u-l)),this.selectionLineWidth&&this.selectionBorderColor&&(t.lineWidth=this.selectionLineWidth,t.strokeStyle=this.selectionBorderColor,h+=a,l+=a,c-=a,u-=a,xi.prototype._setLineDash.call(this,t,this.selectionDashArray),t.strokeRect(h,l,c-h,u-l))}dblClickLock(t){if(this.dblClickIsolateObject){const e=this.getScenePoint(t),s=this.isolatedObject?this.isolatedObject.getObjects():this.getObjects(),i=this.searchPossibleTargets(s,e);if(i.target){if(!(i.target instanceof _r))return!1;this.isolatedObject=i.target,this.discardActiveObject(),i.target._objects.forEach(t=>{t.setCoords()})}else this.isolatedObject=null,this.discardActiveObject();return!0}return!1}setSearchTargets(t){this._searchTargets=t}getSearchTargets(){return this._searchTargets||(this.isolatedObject?this.isolatedObject._objects:this._objects)}findTarget(t){if(this._targetInfo)return this._targetInfo;if(this.skipTargetFind)return{subTargets:[],currentSubTargets:[]};const e=this.getScenePoint(t),s=this._activeObject,i=this.getActiveObjects(),r=this.searchPossibleTargets(this.getSearchTargets(),e),{subTargets:n,container:o,target:a}=r,h={...r,currentSubTargets:n,currentContainer:o,currentTarget:a};if(!s)return h;const l={...this.searchPossibleTargets([s],e),currentSubTargets:n,currentContainer:o,currentTarget:a};if(s.findControl(this.getViewportPoint(t),se(t)))return{...l,target:s};if(l.target){if(i.length>1)return l;if(!this.preserveObjectStacking)return l;if(this.preserveObjectStacking&&t[this.altSelectionKey])return l}return h}_pointIsInObjectSelectionArea(t,e){let s=t.getCoords();const i=this.getZoom(),r=t.padding/i;if(r){const[t,e,i,n]=s,o=Math.atan2(e.y-t.y,e.x-t.x),a=et(o)*r,h=st(o)*r,l=a+h,c=a-h;s=[new it(t.x-c,t.y-l),new it(e.x+l,e.y-c),new it(i.x+c,i.y+l),new it(n.x-l,n.y+c)]}return $s.isPointInPolygon(e,s)}_checkTarget(t,e){if(t&&t.visible&&t.evented&&this._pointIsInObjectSelectionArea(t,e)){if(!this.perPixelTargetFind&&!t.perPixelTargetFind||t.isEditing)return!0;{const s=e.transform(this.viewportTransform);if(!this.isTargetTransparent(t,s.x,s.y))return!0}}return!1}_searchPossibleTargets(t,e,s){let i=t.length;for(;i--;){const r=t[i];if(this._checkTarget(r,e)){if(!this.dblClickIsolateObject&&nt(r)&&r.subTargetCheck){const{target:t}=this._searchPossibleTargets(r._objects,e,s);t&&s.push(t)}return{target:r,subTargets:s}}}return{subTargets:[]}}searchPossibleTargets(t,e){const s=this._searchPossibleTargets(t,e,[]);s.container=s.target;const{container:i,subTargets:r}=s;if(i&&nt(i)&&i.interactive&&r[0]){for(let t=r.length-1;t>0;t--){const e=r[t];if(!nt(e)||!e.interactive)return s.target=e,s}return s.target=r[0],s}return s}getViewportPoint(t){return this._viewportPoint?this._viewportPoint:this._getPointerImpl(t,!0)}getScenePoint(t){return this._scenePoint?this._scenePoint:this._getPointerImpl(t)}_getPointerImpl(t){let e=arguments.length>1&&void 0!==arguments[1]&&arguments[1];const s=this.upperCanvasEl,i=s.getBoundingClientRect();let r=ee(t),n=i.width||0,o=i.height||0;n&&o||(k in i&&D in i&&(o=Math.abs(i.top-i.bottom)),M in i&&O in i&&(n=Math.abs(i.right-i.left))),this.calcOffset(),r.x=r.x-this._offset.left,r.y=r.y-this._offset.top,e||(r=ue(r,void 0,this.viewportTransform));const a=this.getRetinaScaling();1!==a&&(r.x/=a,r.y/=a);const h=0===n||0===o?new it(1,1):new it(s.width/n,s.height/o);return r.multiply(h)}_setDimensionsImpl(t,e){this._resetTransformEventData(),super._setDimensionsImpl(t,e),this._isCurrentlyDrawing&&this.freeDrawingBrush&&this.freeDrawingBrush._setBrushStyles(this.contextTop)}_createCacheCanvas(){this.pixelFindCanvasEl=dt(),this.pixelFindContext=this.pixelFindCanvasEl.getContext("2d",{willReadFrequently:!0}),this.setTargetFindTolerance(this.targetFindTolerance)}getTopContext(){return this.elements.upper.ctx}getSelectionContext(){return this.elements.upper.ctx}getSelectionElement(){return this.elements.upper.el}getActiveObject(){return this._activeObject}getActiveObjects(){const t=this._activeObject;return Gt(t)?t.getObjects():t?[t]:[]}_fireSelectionEvents(t,e){let s=!1,i=!1;const r=this.getActiveObjects(),n=[],o=[];t.forEach(t=>{r.includes(t)||(s=!0,t.fire("deselected",{e:e,target:t}),o.push(t))}),r.forEach(i=>{t.includes(i)||(s=!0,i.fire("selected",{e:e,target:i}),n.push(i))}),t.length>0&&r.length>0?(i=!0,s&&this.fire("selection:updated",{e:e,selected:n,deselected:o})):r.length>0?(i=!0,this.fire("selection:created",{e:e,selected:n})):t.length>0&&(i=!0,this.fire("selection:cleared",{e:e,deselected:o})),i&&(this._objectsToRender=void 0)}setActiveObject(t,e){const s=this.getActiveObjects(),i=this._setActiveObject(t,e);return this._fireSelectionEvents(s,e),i}_setActiveObject(t,e){const s=this._activeObject;return s!==t&&(!(!this._discardActiveObject(e,t)&&this._activeObject)&&(!t.onSelect({e:e})&&(this._activeObject=t,Gt(t)&&s!==t&&t.set("canvas",this),t.setCoords(),!0)))}_discardActiveObject(t,e){const s=this._activeObject;return!!s&&(!s.onDeselect({e:t,object:e})&&(this._currentTransform&&this._currentTransform.target===s&&this.endCurrentTransform(t),Gt(s)&&s===this._hoveredTarget&&(this._hoveredTarget=void 0),this._activeObject=void 0,!0))}discardActiveObject(t){const e=this.getActiveObjects(),s=this.getActiveObject();e.length&&this.fire("before:selection:cleared",{e:t,deselected:[s]});const i=this._discardActiveObject(t);return this._fireSelectionEvents(e,t),i}endCurrentTransform(t){const e=this._currentTransform;this._finalizeCurrentTransform(t),e&&e.target&&(e.target.isMoving=!1),this._currentTransform=null}_finalizeCurrentTransform(t){const e=this._currentTransform,s=e.target,i={e:t,target:s,transform:e,action:e.action};s._scaling&&(s._scaling=!1),s.setCoords(),e.actionPerformed&&(this.fire("object:modified",i),s.fire(U,i))}setViewportTransform(t){super.setViewportTransform(t);const e=this._activeObject;e&&e.setCoords()}destroy(){const t=this._activeObject;Gt(t)&&(t.removeAll(),t.dispose()),delete this._activeObject,super.destroy(),this.pixelFindContext=null,this.pixelFindCanvasEl=void 0}clear(){this.discardActiveObject(),this._activeObject=void 0,this.clearContext(this.contextTop),super.clear()}drawControls(t){const e=this._activeObject;e&&e._renderControls(t)}_toObject(t,e,s){const i=this._realizeGroupTransformOnObject(t),r=super._toObject(t,e,s);return t.set(i),r}_realizeGroupTransformOnObject(t){const{group:e}=t;if(e&&Gt(e)&&this._activeObject===e){const s=It(t,["angle","flipX","flipY",O,W,V,G,z,k]);return ne(t,e.calcOwnMatrix()),s}return{}}_setSVGObject(t,e,s){const i=this._realizeGroupTransformOnObject(e);super._setSVGObject(t,e,s),e.set(i)}}t(en,"ownDefaults",{uniformScaling:!0,uniScaleKey:"shiftKey",centeredScaling:!1,centeredRotation:!1,centeredKey:"altKey",altActionKey:"shiftKey",selection:!0,selectionKey:"shiftKey",selectionColor:"rgba(100, 100, 255, 0.3)",selectionDashArray:[],selectionBorderColor:"rgba(255, 255, 255, 0.3)",selectionLineWidth:1,selectionFullyContained:!1,hoverCursor:"move",moveCursor:"move",defaultCursor:"default",freeDrawingCursor:"crosshair",notAllowedCursor:"not-allowed",perPixelTargetFind:!1,targetFindTolerance:0,skipTargetFind:!1,stopContextMenu:!0,fireRightClick:!0,fireMiddleClick:!0,enablePointerEvents:!1,containerClass:"canvas-container",preserveObjectStacking:!0});class sn{constructor(e){t(this,"targets",[]),t(this,"__disposer",void 0);const s=()=>{const{hiddenTextarea:t}=e.getActiveObject()||{};t&&t.focus()},i=e.upperCanvasEl;i.addEventListener("click",s),this.__disposer=()=>i.removeEventListener("click",s)}exitTextEditing(){this.target=void 0,this.targets.forEach(t=>{t.isEditing&&t.exitEditing()})}add(t){this.targets.push(t)}remove(t){this.unregister(t),tt(this.targets,t)}register(t){this.target=t}unregister(t){t===this.target&&(this.target=void 0)}onMouseMove(t){var e;(null===(e=this.target)||void 0===e?void 0:e.isEditing)&&this.target.updateSelectionOnMouseMove(t)}clear(){this.targets=[],this.target=void 0}dispose(){this.clear(),this.__disposer(),delete this.__disposer}}const rn={passive:!1},nn=(t,e)=>({viewportPoint:t.getViewportPoint(e),scenePoint:t.getScenePoint(e)}),on=function(t){for(var e=arguments.length,s=new Array(e>1?e-1:0),i=1;i1?e-1:0),i=1;i1&&void 0!==arguments[1]?arguments[1]:{}),t(this,"_isClick",void 0),t(this,"textEditingManager",new sn(this)),["_onMouseDown","_onTouchStart","_onMouseMove","_onMouseUp","_onTouchEnd","_onResize","_onMouseWheel","_onMouseOut","_onMouseEnter","_onContextMenu","_onClick","_onDragStart","_onDragEnd","_onDragProgress","_onDragOver","_onDragEnter","_onDragLeave","_onDrop"].forEach(t=>{this[t]=this[t].bind(this)}),this.addOrRemove(on,"add")}_getEventPrefix(){return this.enablePointerEvents?"pointer":"mouse"}addOrRemove(t,e){const s=this.upperCanvasEl,i=this._getEventPrefix();t(Nt(s),"resize",this._onResize),t(s,i+"down",this._onMouseDown),t(s,`${i}move`,this._onMouseMove,rn),t(s,`${i}out`,this._onMouseOut),t(s,`${i}enter`,this._onMouseEnter),t(s,"wheel",this._onMouseWheel,{passive:!1}),t(s,"contextmenu",this._onContextMenu),t(s,"click",this._onClick),t(s,"dblclick",this._onClick),t(s,"dragstart",this._onDragStart),t(s,"dragend",this._onDragEnd),t(s,"dragover",this._onDragOver),t(s,"dragenter",this._onDragEnter),t(s,"dragleave",this._onDragLeave),t(s,"drop",this._onDrop),this.enablePointerEvents||t(s,"touchstart",this._onTouchStart,rn)}removeListeners(){this.addOrRemove(an,"remove");const t=this._getEventPrefix(),e=Ht(this.upperCanvasEl);an(e,`${t}up`,this._onMouseUp),an(e,"touchend",this._onTouchEnd,rn),an(e,`${t}move`,this._onMouseMove,rn),an(e,"touchmove",this._onMouseMove,rn),clearTimeout(this._willAddMouseDown)}_onMouseWheel(t){this._cacheTransformEventData(t),this._handleEvent(t,"wheel"),this._resetTransformEventData()}_onMouseOut(t){const e=this._hoveredTarget,s={e:t,...nn(this,t)};this.fire("mouse:out",{...s,target:e}),this._hoveredTarget=void 0,e&&e.fire("mouseout",{...s}),this._hoveredTargets.forEach(t=>{this.fire("mouse:out",{...s,target:t}),t&&t.fire("mouseout",{...s})}),this._hoveredTargets=[]}_onMouseEnter(t){const{target:e}=this.findTarget(t);this._currentTransform||e||(this.fire("mouse:over",{e:t,...nn(this,t)}),this._hoveredTarget=void 0,this._hoveredTargets=[])}_onDragStart(t){this._isClick=!1;const e=this.getActiveObject();if(e&&e.onDragStart(t)){this._dragSource=e;const s={e:t,target:e};return this.fire("dragstart",s),e.fire("dragstart",s),void on(this.upperCanvasEl,"drag",this._onDragProgress)}ie(t)}_renderDragEffects(t,e,s){let i=!1;const r=this._dropTarget;r&&r!==e&&r!==s&&(r.clearContextTop(),i=!0),null==e||e.clearContextTop(),s!==e&&(null==s||s.clearContextTop());const n=this.contextTop;n.save(),n.transform(...this.viewportTransform),e&&(n.save(),e.transform(n),e.renderDragSourceEffect(t),n.restore(),i=!0),s&&(n.save(),s.transform(n),s.renderDropTargetEffect(t),n.restore(),i=!0),n.restore(),i&&(this.contextTopDirty=!0)}_onDragEnd(t){const{currentSubTargets:e}=this.findTarget(t),s=!!t.dataTransfer&&t.dataTransfer.dropEffect!==E,i=s?this._activeObject:void 0,r={e:t,target:this._dragSource,subTargets:e,dragSource:this._dragSource,didDrop:s,dropTarget:i};an(this.upperCanvasEl,"drag",this._onDragProgress),this.fire("dragend",r),this._dragSource&&this._dragSource.fire("dragend",r),delete this._dragSource,this._onMouseUp(t)}_onDragProgress(t){const e={e:t,target:this._dragSource,dragSource:this._dragSource,dropTarget:this._draggedoverTarget};this.fire("drag",e),this._dragSource&&this._dragSource.fire("drag",e)}_onDragOver(t){const e="dragover",{currentContainer:s,currentSubTargets:i}=this.findTarget(t),r=this._dragSource,n={e:t,target:s,subTargets:i,dragSource:r,canDrop:!1,dropTarget:void 0};let o;this.fire(e,n),this._fireEnterLeaveEvents(t,s,n),s&&(s.canDrop(t)&&(o=s),s.fire(e,n));for(let s=0;s3||e<2||(this._cacheTransformEventData(t),2==e&&"dblclick"===t.type&&this._onDblClick(t),3==e&&this._handleEvent(t,"tripleclick"),this._resetTransformEventData())}_onDblClick(t){if(this.dblClickLock(t))return this._resetTransformEventData(),this.__onMouseDown(t),void this.__onMouseUp(t);this._handleEvent(t,"dblclick")}getPointerId(t){const e=t.changedTouches;return e?e[0]&&e[0].identifier:this.enablePointerEvents?t.pointerId:-1}_isMainEvent(t){return!0===t.isPrimary||!1!==t.isPrimary&&("touchend"===t.type&&0===t.touches.length||(!t.changedTouches||t.changedTouches[0].identifier===this.mainTouchId))}_onTouchStart(t){this._cacheTransformEventData(t);let e=!this.allowTouchScrolling;const s=this._activeObject;void 0===this.mainTouchId&&(this.mainTouchId=this.getPointerId(t)),this.__onMouseDown(t);const{target:i}=this.findTarget(t);(this.isDrawingMode||s&&i===s)&&(e=!0),e&&t.preventDefault();const r=this.upperCanvasEl,n=this._getEventPrefix(),o=Ht(r);on(o,"touchend",this._onTouchEnd,rn),e&&on(o,"touchmove",this._onMouseMove,rn),an(r,`${n}down`,this._onMouseDown),this._resetTransformEventData()}_onMouseDown(t){this._cacheTransformEventData(t),this.__onMouseDown(t);const e=this.upperCanvasEl,s=this._getEventPrefix();an(e,`${s}move`,this._onMouseMove,rn);const i=Ht(e);on(i,`${s}up`,this._onMouseUp),on(i,`${s}move`,this._onMouseMove,rn),this._resetTransformEventData()}_onTouchEnd(t){if(t.touches.length>0)return;this._cacheTransformEventData(t),this.__onMouseUp(t),this._resetTransformEventData(),delete this.mainTouchId;const e=this._getEventPrefix(),s=Ht(this.upperCanvasEl);an(s,"touchend",this._onTouchEnd,rn),an(s,"touchmove",this._onMouseMove,rn),this._willAddMouseDown&&clearTimeout(this._willAddMouseDown),this._willAddMouseDown=setTimeout(()=>{on(this.upperCanvasEl,`${e}down`,this._onMouseDown),this._willAddMouseDown=0},400)}_onMouseUp(t){this._cacheTransformEventData(t),this.__onMouseUp(t);const e=this.upperCanvasEl,s=this._getEventPrefix();if(this._isMainEvent(t)){const t=Ht(this.upperCanvasEl);an(t,`${s}up`,this._onMouseUp),an(t,`${s}move`,this._onMouseMove,rn),on(e,`${s}move`,this._onMouseMove,rn)}this._resetTransformEventData()}_onMouseMove(t){this._cacheTransformEventData(t);const e=this.getActiveObject();!this.allowTouchScrolling&&(!e||!e.shouldStartDragging(t))&&t.preventDefault&&t.preventDefault(),this.__onMouseMove(t),this._resetTransformEventData()}_onResize(){this.calcOffset(),this._resetTransformEventData()}_shouldRender(t){const e=this.getActiveObject();return!!e!=!!t||e&&t&&e!==t}__onMouseUp(t){var e;this._handleEvent(t,"up:before");const s=this._currentTransform,i=this._isClick,{target:r}=this.findTarget(t),{button:n}=t;if(n)return void((this.fireMiddleClick&&1===n||this.fireRightClick&&2===n)&&this._handleEvent(t,"up"));if(this.isDrawingMode&&this._isCurrentlyDrawing)return void this._onMouseUpInDrawingMode(t);if(!this._isMainEvent(t))return;let o,a,h=!1;if(s&&(this._finalizeCurrentTransform(t),h=s.actionPerformed),!i){const e=r===this._activeObject;this.handleSelection(t),h||(h=this._shouldRender(r)||!e&&r===this._activeObject)}if(r){const e=r.findControl(this.getViewportPoint(t),se(t)),{key:i,control:n}=e||{};if(a=i,r.selectable&&r!==this._activeObject&&"up"===r.activeOn)this.setActiveObject(r,t),h=!0;else if(n){const e=n.getMouseUpHandler(t,r,n);e&&(o=this.getScenePoint(t),e.call(n,t,s,o.x,o.y))}r.isMoving=!1}if(s&&(s.target!==r||s.corner!==a)){const e=s.target&&s.target.controls[s.corner],i=e&&e.getMouseUpHandler(t,s.target,e);o=o||this.getScenePoint(t),i&&i.call(e,t,s,o.x,o.y)}this._setCursorFromEvent(t,r),this._handleEvent(t,"up"),this._groupSelector=null,this._currentTransform=null,r&&(r.__corner=void 0),h?this.requestRenderAll():i||null!==(e=this._activeObject)&&void 0!==e&&e.isEditing||this.renderTop()}_basicEventHandler(t,e){const{target:s,subTargets:i=[]}=e;this.fire(t,e),s&&s.fire(t,e);for(let r=0;r{s=t.hoverCursor||s})}this.setCursor(s)}}handleMultiSelection(t,e){const s=this._activeObject,i=Gt(s);if(s&&this._isSelectionKeyPressed(t)&&this.selection&&e&&e.selectable&&(s!==e||i)&&(i||!e.isDescendantOf(s)&&!s.isDescendantOf(e))&&!e.onSelect({e:t})&&!s.getActiveControl()){if(i){const i=s.getObjects();let r=[];if(e===s){const s=this.getScenePoint(t);let n=this.searchPossibleTargets(i,s);if(n.target?(e=n.target,r=n.subTargets):(n=this.searchPossibleTargets(this._objects,s),e=n.target,r=n.subTargets),!e||!e.selectable)return!1}e.group===s?(s.remove(e),this._hoveredTarget=e,this._hoveredTargets=r,1===s.size()&&this._setActiveObject(s.item(0),t)):(s.multiSelectAdd(e),this._hoveredTarget=s,this._hoveredTargets=r),this._fireSelectionEvents(i,t)}else{s.isEditing&&s.exitEditing();const i=new(J.getClass("ActiveSelection"))([],{canvas:this});i.multiSelectAdd(s,e),this._hoveredTarget=i,this._setActiveObject(i,t),this._fireSelectionEvents([s],t)}return!0}return!1}handleSelection(t){if(!this.selection||!this._groupSelector)return!1;const{x:e,y:s,deltaX:i,deltaY:r}=this._groupSelector,n=new it(e,s),o=n.add(new it(i,r)),a=n.min(o),h=n.max(o).subtract(a),l=this.collectObjects({left:a.x,top:a.y,width:h.x,height:h.y},{includeIntersecting:!this.selectionFullyContained}),c=n.eq(o)?l[0]?[l[0]]:[]:l.length>1?l.filter(e=>!e.onSelect({e:t})).reverse():l;if(1===c.length)this.setActiveObject(c[0],t);else if(c.length>1){const e=J.getClass("ActiveSelection");this.setActiveObject(new e(c,{canvas:this}),t)}return this._groupSelector=null,!0}clear(){this.textEditingManager.clear(),super.clear()}destroy(){this.removeListeners(),this.textEditingManager.dispose(),super.destroy()}}const cn={x1:0,y1:0,x2:0,y2:0},un={...cn,r1:0,r2:0},dn=(t,e)=>isNaN(t)&&"number"==typeof e?e:t,gn=/^(\d+\.\d+)%|(\d+)%$/;function fn(t){return t&&gn.test(t)}function pn(t,e){const s="number"==typeof t?t:"string"==typeof t?parseFloat(t)/(fn(t)?100:1):NaN;return xs(0,dn(s,e),1)}const mn=/\s*;\s*/,vn=/\s*:\s*/;function yn(t,e){let s,i;const r=t.getAttribute("style");if(r){const t=r.split(mn);""===t[t.length-1]&&t.pop();for(let e=t.length;e--;){const[r,n]=t[e].split(vn).map(t=>t.trim());"stop-color"===r?s=n:"stop-opacity"===r&&(i=n)}}s=s||t.getAttribute("stop-color")||"rgb(0,0,0)",i=dn(parseFloat(i||t.getAttribute("stop-opacity")||""),1);const n=new Ve(s);return n.setAlpha(n.getAlpha()*i*e),{offset:pn(t.getAttribute("offset"),0),color:n.toRgba()}}function _n(t,e){const s=[],i=t.getElementsByTagName("stop"),r=pn(e,1);for(let t=i.length;t--;)s.push(yn(i[t],r));return s}function xn(t){return"linearGradient"===t.nodeName||"LINEARGRADIENT"===t.nodeName?"linear":"radial"}function Cn(t){return"userSpaceOnUse"===t.getAttribute("gradientUnits")?"pixels":"percentage"}function bn(t,e){return t.getAttribute(e)}function Sn(t,e){return function(t,e){let s,{width:i,height:r,gradientUnits:n}=e;return Object.keys(t).reduce((e,o)=>{const a=t[o];return"Infinity"===a?s=1:"-Infinity"===a?s=0:(s="string"==typeof a?parseFloat(a):a,"string"==typeof a&&fn(a)&&(s*=.01,"pixels"===n&&("x1"!==o&&"x2"!==o&&"r2"!==o||(s*=i),"y1"!==o&&"y2"!==o||(s*=r)))),e[o]=s,e},{})}("linear"===xn(t)?function(t){return{x1:bn(t,"x1")||0,y1:bn(t,"y1")||0,x2:bn(t,"x2")||"100%",y2:bn(t,"y2")||0}}(t):function(t){return{x1:bn(t,"fx")||bn(t,"cx")||"50%",y1:bn(t,"fy")||bn(t,"cy")||"50%",r1:0,x2:bn(t,"cx")||"50%",y2:bn(t,"cy")||"50%",r2:bn(t,"r")||"50%"}}(t),{...e,gradientUnits:Cn(t)})}class wn{constructor(t){const{type:e="linear",gradientUnits:s="pixels",coords:i={},colorStops:r=[],offsetX:n=0,offsetY:o=0,gradientTransform:a,id:h}=t||{};Object.assign(this,{type:e,gradientUnits:s,coords:{..."radial"===e?un:cn,...i},colorStops:r,offsetX:n,offsetY:o,gradientTransform:a,id:h?`${h}_${ut()}`:ut()})}addColorStop(t){for(const e in t)this.colorStops.push({offset:parseFloat(e),color:t[e]});return this}toObject(t){return{...It(this,t),type:this.type,coords:{...this.coords},colorStops:this.colorStops.map(t=>({...t})),offsetX:this.offsetX,offsetY:this.offsetY,gradientUnits:this.gradientUnits,gradientTransform:this.gradientTransform?[...this.gradientTransform]:void 0}}toSVG(t){let{additionalTransform:e}=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};const s=[],i=this.gradientTransform?this.gradientTransform.concat():b.concat(),r="pixels"===this.gradientUnits?"userSpaceOnUse":"objectBoundingBox",n=this.colorStops.map(t=>({...t})).sort((t,e)=>t.offset-e.offset);let o=-this.offsetX,a=-this.offsetY;var h;"objectBoundingBox"===r?(o/=t.width,a/=t.height):(o+=t.width/2,a+=t.height/2),(h=t)&&"function"==typeof h._renderPathCommands&&"percentage"!==this.gradientUnits&&(o-=t.pathOffset.x,a-=t.pathOffset.y),i[4]-=o,i[5]-=a;const l=[`id="SVGID_${this.id}"`,`gradientUnits="${r}"`,`gradientTransform="${e?e+" ":""}${Xt(i)}"`,""].join(" ");if("linear"===this.type){const{x1:t,y1:e,x2:i,y2:r}=this.coords;s.push("\n')}else if("radial"===this.type){const{x1:t,y1:e,x2:i,y2:r,r1:o,r2:a}=this.coords,h=o>a;s.push("\n'),h&&(n.reverse(),n.forEach(t=>{t.offset=1-t.offset}));const c=Math.min(o,a);if(c>0){const t=c/Math.max(o,a);n.forEach(e=>{e.offset+=t*(1-e.offset)})}}return n.forEach(t=>{let{color:e,offset:i}=t;s.push(`\n`)}),s.push("linear"===this.type?"":"","\n"),s.join("")}toLive(t){const{x1:e,y1:s,x2:i,y2:r,r1:n,r2:o}=this.coords,a="linear"===this.type?t.createLinearGradient(e,s,i,r):t.createRadialGradient(e,s,n,i,r,o);return this.colorStops.forEach(t=>{let{color:e,offset:s}=t;a.addColorStop(s,e)}),a}static async fromObject(t){const{colorStops:e,gradientTransform:s}=t;return new this({...t,colorStops:e?e.map(t=>({...t})):void 0,gradientTransform:s?[...s]:void 0})}static fromElement(t,e,s){const i=Cn(t),r=e._findCenterFromElement();return new this({id:t.getAttribute("id")||void 0,type:xn(t),coords:Sn(t,{width:s.viewBoxWidth||s.width,height:s.viewBoxHeight||s.height}),colorStops:_n(t,s.opacity),gradientUnits:i,gradientTransform:er(t.getAttribute("gradientTransform")||""),..."pixels"===i?{offsetX:e.width/2-r.x,offsetY:e.height/2-r.y}:{offsetX:0,offsetY:0}})}}t(wn,"type","Gradient"),J.setClass(wn,"gradient"),J.setClass(wn,"linear"),J.setClass(wn,"radial");class Tn{get type(){return"pattern"}set type(t){i("warn","Setting type has no effect",t)}constructor(e){t(this,"repeat","repeat"),t(this,"offsetX",0),t(this,"offsetY",0),t(this,"crossOrigin",""),this.id=ut(),Object.assign(this,e)}isImageSource(){return!!this.source&&"string"==typeof this.source.src}isCanvasSource(){return!!this.source&&!!this.source.toDataURL}sourceToString(){return this.isImageSource()?this.source.src:this.isCanvasSource()?this.source.toDataURL():""}toLive(t){return this.source&&(!this.isImageSource()||this.source.complete&&0!==this.source.naturalWidth&&0!==this.source.naturalHeight)?t.createPattern(this.source,this.repeat):null}toObject(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[];const{repeat:e,crossOrigin:i}=this;return{...It(this,t),type:"pattern",source:this.sourceToString(),repeat:e,crossOrigin:i,offsetX:$t(this.offsetX,s.NUM_FRACTION_DIGITS),offsetY:$t(this.offsetY,s.NUM_FRACTION_DIGITS),patternTransform:this.patternTransform?[...this.patternTransform]:null}}toSVG(t){let{width:e,height:s}=t;const{source:i,repeat:r,id:n}=this,o=dn(this.offsetX/e,0),a=dn(this.offsetY/s,0);return[``,``,"",""].join("\n")}static async fromObject(t,e){let{type:s,source:i,patternTransform:r,...n}=t;const o=await Ft(i,{...e,crossOrigin:n.crossOrigin});return new this({...n,patternTransform:r&&r.slice(0),source:o})}}t(Tn,"type","Pattern"),J.setClass(Tn),J.setClass(Tn,"pattern");class On{constructor(e){t(this,"color","rgb(0, 0, 0)"),t(this,"width",1),t(this,"shadow",null),t(this,"strokeLineCap","round"),t(this,"strokeLineJoin","round"),t(this,"strokeMiterLimit",10),t(this,"strokeDashArray",null),t(this,"limitedToCanvasSize",!1),this.canvas=e}_setBrushStyles(t){t.strokeStyle=this.color,t.lineWidth=this.width,t.lineCap=this.strokeLineCap,t.miterLimit=this.strokeMiterLimit,t.lineJoin=this.strokeLineJoin,t.setLineDash(this.strokeDashArray||[])}_saveAndTransform(t){const e=this.canvas.viewportTransform;t.save(),t.transform(e[0],e[1],e[2],e[3],e[4],e[5])}needsFullRender(){return new Ve(this.color).getAlpha()<1||!!this.shadow}_setShadow(){if(!this.shadow||!this.canvas)return;const t=this.canvas,e=this.shadow,s=t.contextTop,i=t.getZoom()*t.getRetinaScaling();s.shadowColor=e.color,s.shadowBlur=e.blur*i,s.shadowOffsetX=e.offsetX*i,s.shadowOffsetY=e.offsetY*i}_resetShadow(){const t=this.canvas.contextTop;t.shadowColor="",t.shadowBlur=t.shadowOffsetX=t.shadowOffsetY=0}_isOutSideCanvas(t){return t.x<0||t.x>this.canvas.getWidth()||t.y<0||t.y>this.canvas.getHeight()}}class kn extends xi{constructor(t){let{path:e,left:s,top:i,...r}=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};super(),Object.assign(this,kn.ownDefaults),this.setOptions(r),this._setPath(t||[],!0),"number"==typeof s&&this.set(O,s),"number"==typeof i&&this.set(k,i)}_setPath(t,e){this.path=Er(Array.isArray(t)?t:Nr(t)),this.setBoundingBox(e)}_findCenterFromElement(){const t=this._calcBoundsFromPath();return new it(t.left+t.width/2,t.top+t.height/2)}_renderPathCommands(t){const e=-this.pathOffset.x,s=-this.pathOffset.y;t.beginPath();for(const i of this.path)switch(i[0]){case"L":t.lineTo(i[1]+e,i[2]+s);break;case"M":t.moveTo(i[1]+e,i[2]+s);break;case"C":t.bezierCurveTo(i[1]+e,i[2]+s,i[3]+e,i[4]+s,i[5]+e,i[6]+s);break;case"Q":t.quadraticCurveTo(i[1]+e,i[2]+s,i[3]+e,i[4]+s);break;case"Z":t.closePath()}}_render(t){this._renderPathCommands(t),this._renderPaintInOrder(t)}toString(){return`#`}toObject(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[];return{...super.toObject(t),path:this.path.map(t=>t.slice())}}toDatalessObject(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[];const e=this.toObject(t);return this.sourcePath&&(delete e.path,e.sourcePath=this.sourcePath),e}_toSVG(){return["\n`]}_getOffsetTransform(){const t=s.NUM_FRACTION_DIGITS;return` translate(${$t(-this.pathOffset.x,t)}, ${$t(-this.pathOffset.y,t)})`}toClipPathSVG(t){const e=this._getOffsetTransform();return"\t"+this._createBaseClipPathSVGMarkup(this._toSVG(),{reviver:t,additionalTransform:e})}toSVG(t){const e=this._getOffsetTransform();return this._createBaseSVGMarkup(this._toSVG(),{reviver:t,additionalTransform:e})}complexity(){return this.path.length}setDimensions(){this.setBoundingBox()}setBoundingBox(t){const{width:e,height:s,pathOffset:i}=this._calcDimensions();this.set({width:e,height:s,pathOffset:i}),t&&this.setPositionByOrigin(i,T,T)}_calcBoundsFromPath(){const t=[];let e=0,s=0,i=0,r=0;for(const n of this.path)switch(n[0]){case"L":i=n[1],r=n[2],t.push({x:e,y:s},{x:i,y:r});break;case"M":i=n[1],r=n[2],e=i,s=r;break;case"C":t.push(...Dr(i,r,n[1],n[2],n[3],n[4],n[5],n[6])),i=n[5],r=n[6];break;case"Q":t.push(...Dr(i,r,n[1],n[2],n[1],n[2],n[3],n[4])),i=n[3],r=n[4];break;case"Z":i=e,r=s}return re(t)}_calcDimensions(){const t=this._calcBoundsFromPath();return{...t,pathOffset:new it(t.left+t.width/2,t.top+t.height/2)}}static fromObject(t){return this._fromObject(t,{extraParam:"path"})}static async fromElement(t,e,s){const{d:i,...r}=or(t,this.ATTRIBUTE_NAMES,s);return new this(i,{...r,...e,left:void 0,top:void 0})}}t(kn,"type","Path"),t(kn,"cacheProperties",[...bs,"path","fillRule"]),t(kn,"ATTRIBUTE_NAMES",[...Ii,"d"]),J.setClass(kn),J.setSVGClass(kn);class Dn extends On{constructor(e){super(e),t(this,"decimate",.4),t(this,"drawStraightLine",!1),t(this,"straightLineKey","shiftKey"),this._points=[],this._hasStraightLine=!1}needsFullRender(){return super.needsFullRender()||this._hasStraightLine}static drawSegment(t,e,s){const i=e.midPointFrom(s);return t.quadraticCurveTo(e.x,e.y,i.x,i.y),i}onMouseDown(t,e){let{e:s}=e;this.canvas._isMainEvent(s)&&(this.drawStraightLine=!!this.straightLineKey&&s[this.straightLineKey],this._prepareForDrawing(t),this._addPoint(t),this._render())}onMouseMove(t,e){let{e:s}=e;if(this.canvas._isMainEvent(s)&&(this.drawStraightLine=!!this.straightLineKey&&s[this.straightLineKey],(!0!==this.limitedToCanvasSize||!this._isOutSideCanvas(t))&&this._addPoint(t)&&this._points.length>1))if(this.needsFullRender())this.canvas.clearContext(this.canvas.contextTop),this._render();else{const t=this._points,e=t.length,s=this.canvas.contextTop;this._saveAndTransform(s),this.oldEnd&&(s.beginPath(),s.moveTo(this.oldEnd.x,this.oldEnd.y)),this.oldEnd=Dn.drawSegment(s,t[e-2],t[e-1]),s.stroke(),s.restore()}}onMouseUp(t){let{e:e}=t;return!this.canvas._isMainEvent(e)||(this.drawStraightLine=!1,this.oldEnd=void 0,this._finalizeAndAddPath(),!1)}_prepareForDrawing(t){this._reset(),this._addPoint(t),this.canvas.contextTop.moveTo(t.x,t.y)}_addPoint(t){return!(this._points.length>1&&t.eq(this._points[this._points.length-1]))&&(this.drawStraightLine&&this._points.length>1&&(this._hasStraightLine=!0,this._points.pop()),this._points.push(t),!0)}_reset(){this._points=[],this._setBrushStyles(this.canvas.contextTop),this._setShadow(),this._hasStraightLine=!1}_render(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.canvas.contextTop,e=this._points[0],s=this._points[1];if(this._saveAndTransform(t),t.beginPath(),2===this._points.length&&e.x===s.x&&e.y===s.y){const t=this.width/1e3;e.x-=t,s.x+=t}t.moveTo(e.x,e.y);for(let i=1;i=n&&(i=t[e],a.push(i));return a.push(t[o]),a}_finalizeAndAddPath(){this.canvas.contextTop.closePath(),this.decimate&&(this._points=this.decimatePoints(this._points,this.decimate));const t=this.convertPointsToSVGPath(this._points);if(function(t){return"M 0 0 Q 0 0 0 0 L 0 0"===qr(t)}(t))return void this.canvas.requestRenderAll();const e=this.createPath(t);this.canvas.clearContext(this.canvas.contextTop),this.canvas.fire("before:path:created",{path:e}),this.canvas.add(e),this.canvas.requestRenderAll(),e.setCoords(),this._resetShadow(),this.canvas.fire("path:created",{path:e})}}const Mn=["radius","startAngle","endAngle","counterClockwise"];class En extends xi{static getDefaults(){return{...super.getDefaults(),...En.ownDefaults}}constructor(t){super(),Object.assign(this,En.ownDefaults),this.setOptions(t)}_set(t,e){return super._set(t,e),"radius"===t&&this.setRadius(e),this}_render(t){t.beginPath(),t.arc(0,0,this.radius,vt(this.startAngle),vt(this.endAngle),this.counterClockwise),this._renderPaintInOrder(t)}getRadiusX(){return this.get("radius")*this.get(W)}getRadiusY(){return this.get("radius")*this.get(V)}setRadius(t){this.radius=t,this.set({width:2*t,height:2*t})}toObject(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[];return super.toObject([...Mn,...t])}_toSVG(){const t=(this.endAngle-this.startAngle)%360;if(0===t)return["\n'];{const{radius:e}=this,s=vt(this.startAngle),i=vt(this.endAngle),r=et(s)*e,n=st(s)*e,o=et(i)*e,a=st(i)*e;return[`\n"]}}static async fromElement(t,e,s){const{left:i=0,top:r=0,radius:n=0,...o}=or(t,this.ATTRIBUTE_NAMES,s);return new this({...o,radius:n,left:i-n,top:r-n})}static fromObject(t){return super._fromObject(t)}}t(En,"type","Circle"),t(En,"cacheProperties",[...bs,...Mn]),t(En,"ownDefaults",{radius:0,startAngle:0,endAngle:360,counterClockwise:!1}),t(En,"ATTRIBUTE_NAMES",["cx","cy","r",...Ii]),J.setClass(En),J.setSVGClass(En);class Pn extends On{constructor(e){super(e),t(this,"width",10),this.points=[]}drawDot(t){const e=this.addPoint(t),s=this.canvas.contextTop;this._saveAndTransform(s),this.dot(s,e),s.restore()}dot(t,e){t.fillStyle=e.fill,t.beginPath(),t.arc(e.x,e.y,e.radius,0,2*Math.PI,!1),t.closePath(),t.fill()}onMouseDown(t){this.points=[],this.canvas.clearContext(this.canvas.contextTop),this._setShadow(),this.drawDot(t)}_render(){const t=this.canvas.contextTop,e=this.points;this._saveAndTransform(t);for(let s=0;s0&&void 0!==arguments[0]?arguments[0]:[0,0,0,0],r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};super(),Object.assign(this,Ln.ownDefaults),this.setOptions(r),this.x1=t,this.x2=s,this.y1=e,this.y2=i,this._setWidthHeight();const{left:n,top:o}=r;"number"==typeof n&&this.set(O,n),"number"==typeof o&&this.set(k,o)}_setWidthHeight(){const{x1:t,y1:e,x2:s,y2:i}=this;this.width=Math.abs(s-t),this.height=Math.abs(i-e);const{left:r,top:n,width:o,height:a}=re([{x:t,y:e},{x:s,y:i}]),h=new it(r+o/2,n+a/2);this.setPositionByOrigin(h,T,T)}_set(t,e){return super._set(t,e),Fn.includes(t)&&this._setWidthHeight(),this}_render(t){t.beginPath();const e=this.calcLinePoints();t.moveTo(e.x1,e.y1),t.lineTo(e.x2,e.y2),t.lineWidth=this.strokeWidth;const s=t.strokeStyle;var i;Yt(this.stroke)?t.strokeStyle=this.stroke.toLive(t):t.strokeStyle=null!==(i=this.stroke)&&void 0!==i?i:t.fillStyle;this.stroke&&this._renderStroke(t),t.strokeStyle=s}_findCenterFromElement(){return new it((this.x1+this.x2)/2,(this.y1+this.y2)/2)}toObject(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[];return{...super.toObject(t),...this.calcLinePoints()}}_getNonTransformedDimensions(){const t=super._getNonTransformedDimensions();return"butt"===this.strokeLineCap&&(0===this.width&&(t.y-=this.strokeWidth),0===this.height&&(t.x-=this.strokeWidth)),t}calcLinePoints(){const{x1:t,x2:e,y1:s,y2:i,width:r,height:n}=this,o=t<=e?-1:1,a=s<=i?-1:1;return{x1:o*r/2,x2:o*-r/2,y1:a*n/2,y2:a*-n/2}}_toSVG(){const{x1:t,x2:e,y1:s,y2:i}=this.calcLinePoints();return["\n`]}static async fromElement(t,e,s){const{x1:i=0,y1:r=0,x2:n=0,y2:o=0,...a}=or(t,this.ATTRIBUTE_NAMES,s);return new this([i,r,n,o],a)}static fromObject(t){let{x1:e,y1:s,x2:i,y2:r,...n}=t;return this._fromObject({...n,points:[e,s,i,r]},{extraParam:"points"})}}t(Ln,"type","Line"),t(Ln,"cacheProperties",[...bs,...Fn]),t(Ln,"ATTRIBUTE_NAMES",Ii.concat(Fn)),J.setClass(Ln),J.setSVGClass(Ln);class Rn extends xi{static getDefaults(){return{...super.getDefaults(),...Rn.ownDefaults}}constructor(t){super(),Object.assign(this,Rn.ownDefaults),this.setOptions(t)}_render(t){const e=this.width/2,s=this.height/2;t.beginPath(),t.moveTo(-e,s),t.lineTo(0,-s),t.lineTo(e,s),t.closePath(),this._renderPaintInOrder(t)}_toSVG(){const t=this.width/2,e=this.height/2;return["']}}t(Rn,"type","Triangle"),t(Rn,"ownDefaults",{width:100,height:100}),J.setClass(Rn),J.setSVGClass(Rn);const In=["rx","ry"];class Bn extends xi{static getDefaults(){return{...super.getDefaults(),...Bn.ownDefaults}}constructor(t){super(),Object.assign(this,Bn.ownDefaults),this.setOptions(t)}_set(t,e){switch(super._set(t,e),t){case"rx":this.rx=e,this.set("width",2*e);break;case"ry":this.ry=e,this.set("height",2*e)}return this}getRx(){return this.get("rx")*this.get(W)}getRy(){return this.get("ry")*this.get(V)}toObject(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[];return super.toObject([...In,...t])}_toSVG(){return["\n`]}_render(t){t.beginPath(),t.save(),t.transform(1,0,0,this.ry/this.rx,0,0),t.arc(0,0,this.rx,0,x,!1),t.restore(),this._renderPaintInOrder(t)}static async fromElement(t,e,s){const i=or(t,this.ATTRIBUTE_NAMES,s);return i.left=(i.left||0)-i.rx,i.top=(i.top||0)-i.ry,new this(i)}}t(Bn,"type","Ellipse"),t(Bn,"cacheProperties",[...bs,...In]),t(Bn,"ownDefaults",{rx:0,ry:0}),t(Bn,"ATTRIBUTE_NAMES",[...Ii,"cx","cy","rx","ry"]),J.setClass(Bn),J.setSVGClass(Bn);const $n={exactBoundingBox:!1};class Xn extends xi{static getDefaults(){return{...super.getDefaults(),...Xn.ownDefaults}}constructor(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[],s=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};super(),t(this,"strokeDiff",void 0),Object.assign(this,Xn.ownDefaults),this.setOptions(s),this.points=e;const{left:i,top:r}=s;this.initialized=!0,this.setBoundingBox(!0),"number"==typeof i&&this.set(O,i),"number"==typeof r&&this.set(k,r)}isOpen(){return!0}_projectStrokeOnPoints(t){return Oi(this.points,t,this.isOpen())}_calcDimensions(t){t={scaleX:this.scaleX,scaleY:this.scaleY,skewX:this.skewX,skewY:this.skewY,strokeLineCap:this.strokeLineCap,strokeLineJoin:this.strokeLineJoin,strokeMiterLimit:this.strokeMiterLimit,strokeUniform:this.strokeUniform,strokeWidth:this.strokeWidth,...t||{}};const e=this.exactBoundingBox?this._projectStrokeOnPoints(t).map(t=>t.projectedPoint):this.points;if(0===e.length)return{left:0,top:0,width:0,height:0,pathOffset:new it,strokeOffset:new it,strokeDiff:new it};const s=re(e),i=At({...t,scaleX:1,scaleY:1}),r=re(this.points.map(t=>xt(t,i,!0))),n=new it(this.scaleX,this.scaleY);let o=s.left+s.width/2,a=s.top+s.height/2;return this.exactBoundingBox&&(o-=a*Math.tan(vt(this.skewX)),a-=o*Math.tan(vt(this.skewY))),{...s,pathOffset:new it(o,a),strokeOffset:new it(r.left,r.top).subtract(new it(s.left,s.top)).multiply(n),strokeDiff:new it(s.width,s.height).subtract(new it(r.width,r.height)).multiply(n)}}_findCenterFromElement(){const t=re(this.points);return new it(t.left+t.width/2,t.top+t.height/2)}setDimensions(){this.setBoundingBox()}setBoundingBox(t){const{left:e,top:s,width:i,height:r,pathOffset:n,strokeOffset:o,strokeDiff:a}=this._calcDimensions();this.set({width:i,height:r,pathOffset:n,strokeOffset:o,strokeDiff:a}),t&&this.setPositionByOrigin(new it(e+i/2,s+r/2),T,T)}isStrokeAccountedForInDimensions(){return this.exactBoundingBox}_getNonTransformedDimensions(){return this.exactBoundingBox?new it(this.width,this.height):super._getNonTransformedDimensions()}_getTransformedDimensions(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};if(this.exactBoundingBox){let n;if(Object.keys(t).some(t=>this.strokeUniform||this.constructor.layoutProperties.includes(t))){var e,s;const{width:i,height:r}=this._calcDimensions(t);n=new it(null!==(e=t.width)&&void 0!==e?e:i,null!==(s=t.height)&&void 0!==s?s:r)}else{var i,r;n=new it(null!==(i=t.width)&&void 0!==i?i:this.width,null!==(r=t.height)&&void 0!==r?r:this.height)}return n.multiply(new it(t.scaleX||this.scaleX,t.scaleY||this.scaleY))}return super._getTransformedDimensions(t)}_set(t,e){const s=this.initialized&&this[t]!==e,i=super._set(t,e);return this.exactBoundingBox&&s&&((t===W||t===V)&&this.strokeUniform&&this.constructor.layoutProperties.includes("strokeUniform")||this.constructor.layoutProperties.includes(t))&&this.setDimensions(),i}toObject(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[];return{...super.toObject(t),points:this.points.map(t=>{let{x:e,y:s}=t;return{x:e,y:s}})}}_toSVG(){const t=[],e=this.pathOffset.x,i=this.pathOffset.y,r=s.NUM_FRACTION_DIGITS;for(let s=0,n=this.points.length;s\n`]}_render(t){const e=this.points.length,s=this.pathOffset.x,i=this.pathOffset.y;if(e&&!isNaN(this.points[e-1].y)){t.beginPath(),t.moveTo(this.points[0].x-s,this.points[0].y-i);for(let r=0;rvoid 0!==t);this._setStyleDeclaration(s,i,r)}getSelectionStyles(t,e,s){const i=[];for(let r=t;r<(e||t);r++)i.push(this.getStyleAtPosition(r,s));return i}getStyleAtPosition(t,e){const{lineIndex:s,charIndex:i}=this.get2DCursorLocation(t);return e?this.getCompleteStyleDeclaration(s,i):this._getStyleDeclaration(s,i)}setSelectionStyles(t,e,s){for(let i=e;i<(s||e);i++)this._extendStyles(i,t);this._forceClearCache=!0}_getStyleDeclaration(t,e){var s;const i=this.styles&&this.styles[t];return i&&null!==(s=i[e])&&void 0!==s?s:{}}getCompleteStyleDeclaration(t,e){return{...It(this,this.constructor._styleProperties),...this._getStyleDeclaration(t,e)}}_setStyleDeclaration(t,e,s){this.styles[t][e]=s}_deleteStyleDeclaration(t,e){delete this.styles[t][e]}_getLineStyle(t){return!!this.styles[t]}_setLineStyle(t){this.styles[t]={}}_deleteLineStyle(t){delete this.styles[t]}}t(Wn,"_styleProperties",ts);const Vn=/ +/g,Gn=/"/g;function zn(t,e,i,r,n){return`\t\t${function(t,e){let{left:i,top:r,width:n,height:o}=e,a=arguments.length>2&&void 0!==arguments[2]?arguments[2]:s.NUM_FRACTION_DIGITS;const h=He(H,t,!1),[l,c,u,d]=[i,r,n,o].map(t=>$t(t,a));return``}(t,{left:e,top:i,width:r,height:n})}\n`}let Hn;class Nn extends Wn{static getDefaults(){return{...super.getDefaults(),...Nn.ownDefaults}}constructor(e,s){super(),t(this,"__charBounds",[]),Object.assign(this,Nn.ownDefaults),this.setOptions(s),this.styles||(this.styles={}),this.text=e,this.initialized=!0,this.path&&this.setPathInfo(),this.initDimensions(),this.setCoords()}setPathInfo(){const t=this.path;t&&(t.segmentsInfo=Yr(t.path))}_splitText(){const t=this._splitTextIntoLines(this.text);return this.textLines=t.lines,this._textLines=t.graphemeLines,this._unwrappedTextLines=t._unwrappedLines,this._text=t.graphemeText,t}initDimensions(){this._splitText(),this._clearCache(),this.dirty=!0,this.path?(this.width=this.path.width,this.height=this.path.height):(this.width=this.calcTextWidth()||this.cursorWidth||this.MIN_TEXT_WIDTH,this.height=this.calcTextHeight()),this.textAlign.includes(ss)&&this.enlargeSpaces()}enlargeSpaces(){let t,e,s,i,r,n,o;for(let a=0,h=this._textLines.length;a`}_getCacheCanvasDimensions(){const t=super._getCacheCanvasDimensions(),e=this.fontSize;return t.width+=e*t.zoomX,t.height+=e*t.zoomY,t}_render(t){const e=this.path;e&&!e.isNotVisible()&&e._render(t),this._setTextStyles(t),this._renderTextLinesBackground(t),this._renderTextDecoration(t,"underline"),this._renderText(t),this._renderTextDecoration(t,"overline"),this._renderTextDecoration(t,"linethrough")}_renderText(t){this.paintFirst===N?(this._renderTextStroke(t),this._renderTextFill(t)):(this._renderTextFill(t),this._renderTextStroke(t))}_setTextStyles(t,e,s){if(t.textBaseline="alphabetic",this.path)switch(this.pathAlign){case T:t.textBaseline="middle";break;case"ascender":t.textBaseline=k;break;case"descender":t.textBaseline=D}t.font=this._getFontDeclaration(e,s)}calcTextWidth(){let t=this.getLineWidth(0);for(let e=1,s=this._textLines.length;et&&(t=s)}return t}_renderTextLine(t,e,s,i,r,n){this._renderChars(t,e,s,i,r,n)}_renderTextLinesBackground(t){if(!this.textBackgroundColor&&!this.styleHas("textBackgroundColor"))return;const e=t.fillStyle,s=this._getLeftOffset();let i=this._getTopOffset();for(let e=0,r=this._textLines.length;e=0:ie?t%=e:t<0&&(t+=e),this._setGraphemeOnPath(t,s),t+=s.kernedWidth}return{width:i,numOfSpaces:0}}_setGraphemeOnPath(t,e){const s=t+e.kernedWidth/2,i=this.path,r=Wr(i.path,s,i.segmentsInfo);e.renderLeft=r.x-i.pathOffset.x,e.renderTop=r.y-i.pathOffset.y,e.angle=r.angle+(this.pathSide===M?Math.PI:0)}_getGraphemeBox(t,e,s,i,r){const n=this.getCompleteStyleDeclaration(e,s),o=i?this.getCompleteStyleDeclaration(e,s-1):{},a=this._measureChar(t,n,i,o);let h,l=a.kernedWidth,c=a.width;0!==this.charSpacing&&(h=this._getWidthOfCharSpacing(),c+=h,l+=h);const u={width:c,left:0,height:n.fontSize,kernedWidth:l,deltaY:n.deltaY};if(s>0&&!r){const t=this.__charBounds[e][s-1];u.left=t.left+t.width+a.kernedWidth-a.width}return u}getHeightOfLine(t){if(this.__lineHeights[t])return this.__lineHeights[t];let e=this.getHeightOfChar(t,0);for(let s=1,i=this._textLines[t].length;s0){const e=this.fontSize*v/1e3;let s=i+d+g;"rtl"===this.direction&&(s=this.width-s-f),p&&m&&v&&(t.fillStyle=m,t.fillRect(s,C+a*b+S-o*e,f,e)),g=n.left,f=n.width,p=y,v=x,m=_,b=l,S=c}else f+=n.kernedWidth}let w=i+d+g;"rtl"===this.direction&&(w=this.width-w-f),t.fillStyle=_;const T=this.fontSize*x/1e3;y&&_&&x&&t.fillRect(w,C+a*b+S-o*T,f-n,T),s+=l}this._removeShadow(t)}_getFontDeclaration(){let{fontFamily:t=this.fontFamily,fontStyle:e=this.fontStyle,fontWeight:s=this.fontWeight,fontSize:i=this.fontSize}=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},r=arguments.length>1?arguments[1]:void 0;const n=t.includes("'")||t.includes('"')||t.includes(",")||Nn.genericFonts.includes(t.toLowerCase())?t:`"${t}"`;return[e,s,`${r?this.CACHE_FONT_SIZE:i}px`,n].join(" ")}render(t){this.visible&&(this.canvas&&this.canvas.skipOffscreen&&!this.group&&!this.isOnScreen()||(this._forceClearCache&&this.initDimensions(),super.render(t)))}graphemeSplit(t){return Ei(t)}_splitTextIntoLines(t){const e=t.split(this._reNewline),s=new Array(e.length),i=["\n"];let r=[];for(let t=0;t0&&void 0!==arguments[0]?arguments[0]:[];return{...super.toObject([...Ze,...t]),styles:Li(this.styles,this.text),...this.path?{path:this.path.toObject()}:{}}}set(t,e){const{textLayoutProperties:s}=this.constructor;super.set(t,e);let i=!1,r=!1;if("object"==typeof t)for(const e in t)"path"===e&&this.setPathInfo(),i=i||s.includes(e),r=r||"path"===e;else i=s.includes(t),r="path"===t;return r&&this.setPathInfo(),i&&this.initialized&&(this.initDimensions(),this.setCoords()),this}complexity(){return 1}static async fromElement(t,e,s){const i=or(t,Nn.ATTRIBUTE_NAMES,s),{textAnchor:r=O,textDecoration:n="",dx:o=0,dy:a=0,top:h=0,left:l=0,fontSize:c=S,strokeWidth:u=1,...d}={...e,...i},g=new this((t.textContent||"").replace(/^\s+|\s+$|\n+/g,"").replace(/\s+/g," "),{left:l+o,top:h+a,underline:n.includes("underline"),overline:n.includes("overline"),linethrough:n.includes("line-through"),strokeWidth:0,fontSize:c,...d}),f=g.getScaledHeight()/g.height,p=((g.height+g.strokeWidth)*g.lineHeight-g.height)*f,m=g.getScaledHeight()+p;let v=0;return r===T&&(v=g.getScaledWidth()/2),r===M&&(v=g.getScaledWidth()),g.set({left:g.left-v,top:g.top-(m-g.fontSize*(.07+g._fontSizeFraction))/g.lineHeight,strokeWidth:u}),g}static fromObject(t){return this._fromObject({...t,styles:Ri(t.styles||{},t.text)},{extraParam:"text"})}}t(Nn,"textLayoutProperties",Qe),t(Nn,"cacheProperties",[...bs,...Ze]),t(Nn,"ownDefaults",es),t(Nn,"type","Text"),t(Nn,"genericFonts",["serif","sans-serif","monospace","cursive","fantasy","system-ui","ui-serif","ui-sans-serif","ui-monospace","ui-rounded","math","emoji","fangsong"]),t(Nn,"ATTRIBUTE_NAMES",Ii.concat("x","y","dx","dy","font-family","font-style","font-weight","font-size","letter-spacing","text-decoration","text-anchor")),_i(Nn,[class extends Ne{_toSVG(){const t=this._getSVGLeftTopOffsets(),e=this._getSVGTextAndBg(t.textTop,t.textLeft);return this._wrapSVGTextAndBg(e)}toSVG(t){const e=this._createBaseSVGMarkup(this._toSVG(),{reviver:t,noStyle:!0,withShadow:!0}),s=this.path;return s?e+s._createBaseSVGMarkup(s._toSVG(),{reviver:t,withShadow:!0,additionalTransform:Xt(this.calcOwnMatrix())}):e}_getSVGLeftTopOffsets(){return{textLeft:-this.width/2,textTop:-this.height/2,lineTop:this.getHeightOfLine(0)}}_wrapSVGTextAndBg(t){let{textBgRects:e,textSpans:s}=t;const i=this.getSvgTextDecoration(this);return[e.join(""),'\t\t",s.join(""),"\n"]}_getSVGTextAndBg(t,e){const s=[],i=[];let r,n=t;this.backgroundColor&&i.push(...zn(this.backgroundColor,-this.width/2,-this.height/2,this.width,this.height));for(let t=0,o=this._textLines.length;t${Di(t)}`}_setSVGTextLineText(t,e,s,i){const r=this.getHeightOfLine(e),n=this.textAlign.includes(ss),o=this._textLines[e];let a,h,l,c,u,d="",g=0;i+=r*(1-this._fontSizeFraction)/this.lineHeight;for(let r=0,f=o.length-1;r<=f;r++)u=r===f||this.charSpacing||this.path,d+=o[r],l=this.__charBounds[e][r],0===g?(s+=l.kernedWidth-l.width,g+=l.width):g+=l.kernedWidth,n&&!u&&this._reSpaceAndTab.test(o[r])&&(u=!0),u||(a=a||this.getCompleteStyleDeclaration(e,r),h=this.getCompleteStyleDeclaration(e,r+1),u=Fi(a,h,!0)),u&&(c=this._getStyleDeclaration(e,r),t.push(this._createTextCharSpan(d,c,s,i,l)),d="",a=h,"rtl"===this.direction?s-=g:s+=g,g=0)}_setSVGTextLineBg(t,e,s,i){const r=this._textLines[e],n=this.getHeightOfLine(e)/this.lineHeight;let o,a=0,h=0,l=this.getValueOfPropertyAt(e,0,"textBackgroundColor");for(let c=0;ct[e.replace("-","")]).join(" ")}}]),J.setClass(Nn),J.setSVGClass(Nn);class Un{constructor(e){t(this,"target",void 0),t(this,"__mouseDownInPlace",!1),t(this,"__dragStartFired",!1),t(this,"__isDraggingOver",!1),t(this,"__dragStartSelection",void 0),t(this,"__dragImageDisposer",void 0),t(this,"_dispose",void 0),this.target=e;const s=[this.target.on("dragenter",this.dragEnterHandler.bind(this)),this.target.on("dragover",this.dragOverHandler.bind(this)),this.target.on("dragleave",this.dragLeaveHandler.bind(this)),this.target.on("dragend",this.dragEndHandler.bind(this)),this.target.on("drop",this.dropHandler.bind(this))];this._dispose=()=>{s.forEach(t=>t()),this._dispose=void 0}}isPointerOverSelection(t){const e=this.target,s=e.getSelectionStartFromPointer(t);return e.isEditing&&s>=e.selectionStart&&s<=e.selectionEnd&&e.selectionStart{_.remove()},Ht(t.target||this.target.hiddenTextarea).body.appendChild(_),null===(s=t.dataTransfer)||void 0===s||s.setDragImage(_,p.x,p.y)}onDragStart(t){this.__dragStartFired=!0;const e=this.target,s=this.isActive();if(s&&t.dataTransfer){const s=this.__dragStartSelection={selectionStart:e.selectionStart,selectionEnd:e.selectionEnd},i=e._text.slice(s.selectionStart,s.selectionEnd).join(""),r={text:e.text,value:i,...s};t.dataTransfer.setData("text/plain",i),t.dataTransfer.setData("application/fabric",JSON.stringify({value:i,styles:e.getSelectionStyles(s.selectionStart,s.selectionEnd,!0)})),t.dataTransfer.effectAllowed="copyMove",this.setDragImage(t,r)}return e.abortCursorAnimation(),s}canDrop(t){if(this.target.editable&&!this.target.getActiveControl()&&!t.defaultPrevented){if(this.isActive()&&this.__dragStartSelection){const e=this.target.getSelectionStartFromPointer(t),s=this.__dragStartSelection;return es.selectionEnd}return!0}return!1}targetCanDrop(t){return this.target.canDrop(t)}dragEnterHandler(t){let{e:e}=t;const s=this.targetCanDrop(e);!this.__isDraggingOver&&s&&(this.__isDraggingOver=!0)}dragOverHandler(t){const{e:e}=t,s=this.targetCanDrop(e);!this.__isDraggingOver&&s?this.__isDraggingOver=!0:this.__isDraggingOver&&!s&&(this.__isDraggingOver=!1),this.__isDraggingOver&&(e.preventDefault(),t.canDrop=!0,t.dropTarget=this.target)}dragLeaveHandler(){(this.__isDraggingOver||this.isActive())&&(this.__isDraggingOver=!1)}dropHandler(t){var e;const{e:s}=t,i=s.defaultPrevented;this.__isDraggingOver=!1,s.preventDefault();let r=null===(e=s.dataTransfer)||void 0===e?void 0:e.getData("text/plain");if(r&&!i){const e=this.target,i=e.canvas;let n=e.getSelectionStartFromPointer(s);const{styles:o}=s.dataTransfer.types.includes("application/fabric")?JSON.parse(s.dataTransfer.getData("application/fabric")):{},a=r[Math.max(0,r.length-1)],h=0;if(this.__dragStartSelection){const t=this.__dragStartSelection.selectionStart,s=this.__dragStartSelection.selectionEnd;n>t&&n<=s?n=t:n>s&&(n-=s-t),e.removeChars(t,s),delete this.__dragStartSelection}e._reNewline.test(a)&&(e._reNewline.test(e._text[n])||n===e._text.length)&&(r=r.trimEnd()),t.didDrop=!0,t.dropTarget=e,e.insertChars(r,o,n),i.setActiveObject(e),e.enterEditing(s),e.selectionStart=Math.min(n+h,e._text.length),e.selectionEnd=Math.min(e.selectionStart+r.length,e._text.length),e.hiddenTextarea.value=e.text,e._updateTextarea(),e.hiddenTextarea.focus(),e.fire(X,{index:n+h,action:"drop"}),i.fire("text:changed",{target:e}),i.contextTopDirty=!0,i.requestRenderAll()}}dragEndHandler(t){let{e:e}=t;if(this.isActive()&&this.__dragStartFired&&this.__dragStartSelection){var s;const t=this.target,i=this.target.canvas,{selectionStart:r,selectionEnd:n}=this.__dragStartSelection,o=(null===(s=e.dataTransfer)||void 0===s?void 0:s.dropEffect)||E;o===E?(t.selectionStart=r,t.selectionEnd=n,t._updateTextarea(),t.hiddenTextarea.focus()):(t.clearContextTop(),"move"===o&&(t.removeChars(r,n),t.selectionStart=t.selectionEnd=r,t.hiddenTextarea&&(t.hiddenTextarea.value=t.text),t._updateTextarea(),t.fire(X,{index:r,action:"dragend"}),i.fire("text:changed",{target:t}),i.requestRenderAll()),t.exitEditing())}this.__dragImageDisposer&&this.__dragImageDisposer(),delete this.__dragImageDisposer,delete this.__dragStartSelection,this.__isDraggingOver=!1}dispose(){this._dispose&&this._dispose()}}const qn=/[ \n\.,;!\?\-]/;class Kn extends Nn{constructor(){super(...arguments),t(this,"_currentCursorOpacity",1)}initBehavior(){this._tick=this._tick.bind(this),this._onTickComplete=this._onTickComplete.bind(this),this.updateSelectionOnMouseMove=this.updateSelectionOnMouseMove.bind(this)}onDeselect(t){return this.isEditing&&this.exitEditing(),this.selected=!1,super.onDeselect(t)}_animateCursor(t){let{toValue:e,duration:s,delay:i,onComplete:r}=t;return Is({startValue:this._currentCursorOpacity,endValue:e,duration:s,delay:i,onComplete:r,abort:()=>!this.canvas||this.selectionStart!==this.selectionEnd,onChange:t=>{this._currentCursorOpacity=t,this.renderCursorOrSelection()}})}_tick(t){this._currentTickState=this._animateCursor({toValue:0,duration:this.cursorDuration/2,delay:Math.max(t||0,100),onComplete:this._onTickComplete})}_onTickComplete(){var t;null===(t=this._currentTickCompleteState)||void 0===t||t.abort(),this._currentTickCompleteState=this._animateCursor({toValue:1,duration:this.cursorDuration,onComplete:this._tick})}initDelayedCursor(t){this.abortCursorAnimation(),this._tick(t?0:this.cursorDelay)}abortCursorAnimation(){let t=!1;[this._currentTickState,this._currentTickCompleteState].forEach(e=>{e&&!e.isDone()&&(t=!0,e.abort())}),this._currentCursorOpacity=1,t&&this.clearContextTop()}restartCursorIfNeeded(){[this._currentTickState,this._currentTickCompleteState].some(t=>!t||t.isDone())&&this.initDelayedCursor()}selectAll(){return this.selectionStart=0,this.selectionEnd=this._text.length,this._fireSelectionChanged(),this._updateTextarea(),this}cmdAll(){this.selectAll(),this.renderCursorOrSelection()}getSelectedText(){return this._text.slice(this.selectionStart,this.selectionEnd).join("")}findWordBoundaryLeft(t){let e=0,s=t-1;if(this._reSpace.test(this._text[s]))for(;this._reSpace.test(this._text[s]);)e++,s--;for(;/\S/.test(this._text[s])&&s>-1;)e++,s--;return t-e}findWordBoundaryRight(t){let e=0,s=t;if(this._reSpace.test(this._text[s]))for(;this._reSpace.test(this._text[s]);)e++,s++;for(;/\S/.test(this._text[s])&&s-1;)e++,s--;return t-e}findLineBoundaryRight(t){let e=0,s=t;for(;!/\n/.test(this._text[s])&&s0&&this._reSpace.test(s[t])&&(-1===e||!P.test(s[t-1]))?t-1:t,r=s[i];for(;i>0&&ithis.__selectionStartOnMouseDown?(this.selectionStart=this.__selectionStartOnMouseDown,this.selectionEnd=s):(this.selectionStart=s,this.selectionEnd=this.__selectionStartOnMouseDown),this.selectionStart===i&&this.selectionEnd===r||(this._fireSelectionChanged(),this._updateTextarea(),this.renderCursorOrSelection()))}_setEditingProps(){this.hoverCursor="text",this.canvas&&(this.canvas.defaultCursor=this.canvas.moveCursor="text"),this.borderColor=this.editingBorderColor,this.hasControls=this.selectable=!1,this.lockMovementX=this.lockMovementY=!0}fromStringToGraphemeSelection(t,e,s){const i=s.slice(0,t),r=this.graphemeSplit(i).length;if(t===e)return{selectionStart:r,selectionEnd:r};const n=s.slice(t,e);return{selectionStart:r,selectionEnd:r+this.graphemeSplit(n).length}}fromGraphemeToStringSelection(t,e,s){const i=s.slice(0,t).join("").length;if(t===e)return{selectionStart:i,selectionEnd:i};return{selectionStart:i,selectionEnd:i+s.slice(t,e).join("").length}}_updateTextarea(){if(this.cursorOffsetCache={},this.hiddenTextarea){if(!this.inCompositionMode){const t=this.fromGraphemeToStringSelection(this.selectionStart,this.selectionEnd,this._text);this.hiddenTextarea.selectionStart=t.selectionStart,this.hiddenTextarea.selectionEnd=t.selectionEnd}this.updateTextareaPosition()}}updateFromTextArea(){if(!this.hiddenTextarea)return;this.cursorOffsetCache={};const t=this.hiddenTextarea;this.text=t.value,this.set("dirty",!0),this.initDimensions(),this.setCoords();const e=this.fromStringToGraphemeSelection(t.selectionStart,t.selectionEnd,t.value);this.selectionEnd=this.selectionStart=e.selectionEnd,this.inCompositionMode||(this.selectionStart=e.selectionStart),this.updateTextareaPosition()}updateTextareaPosition(){if(this.selectionStart===this.selectionEnd){const t=this._calcTextareaPosition();this.hiddenTextarea.style.left=t.left,this.hiddenTextarea.style.top=t.top}}_calcTextareaPosition(){if(!this.canvas)return{left:"1px",top:"1px"};const t=this.inCompositionMode?this.compositionStart:this.selectionStart,e=this._getCursorBoundaries(t),s=this.get2DCursorLocation(t),i=s.lineIndex,r=s.charIndex,n=this.getValueOfPropertyAt(i,r,"fontSize")*this.lineHeight,o=e.leftOffset,a=this.getCanvasRetinaScaling(),h=this.canvas.upperCanvasEl,l=h.width/a,c=h.height/a,u=l-n,d=c-n,g=new it(e.left+o,e.top+e.topOffset+n).transform(this.calcTransformMatrix()).transform(this.canvas.viewportTransform).multiply(new it(h.clientWidth/l,h.clientHeight/c));return g.x<0&&(g.x=0),g.x>u&&(g.x=u),g.y<0&&(g.y=0),g.y>d&&(g.y=d),g.x+=this.canvas._offset.left,g.y+=this.canvas._offset.top,{left:`${g.x}px`,top:`${g.y}px`,fontSize:`${n}px`,charHeight:n}}_saveEditingProps(){this._savedProps={hasControls:this.hasControls,borderColor:this.borderColor,lockMovementX:this.lockMovementX,lockMovementY:this.lockMovementY,hoverCursor:this.hoverCursor,selectable:this.selectable,defaultCursor:this.canvas&&this.canvas.defaultCursor,moveCursor:this.canvas&&this.canvas.moveCursor}}_restoreEditingProps(){this._savedProps&&(this.hoverCursor=this._savedProps.hoverCursor,this.hasControls=this._savedProps.hasControls,this.borderColor=this._savedProps.borderColor,this.selectable=this._savedProps.selectable,this.lockMovementX=this._savedProps.lockMovementX,this.lockMovementY=this._savedProps.lockMovementY,this.canvas&&(this.canvas.defaultCursor=this._savedProps.defaultCursor||this.canvas.defaultCursor,this.canvas.moveCursor=this._savedProps.moveCursor||this.canvas.moveCursor),delete this._savedProps)}exitEditingImpl(){const t=this.hiddenTextarea;this.selected=!1,this.isEditing=!1,t&&(t.blur&&t.blur(),t.parentNode&&t.parentNode.removeChild(t)),this.hiddenTextarea=null,this.abortCursorAnimation(),this.selectionStart!==this.selectionEnd&&this.clearContextTop(),this.selectionEnd=this.selectionStart,this._restoreEditingProps(),this._forceClearCache&&(this.initDimensions(),this.setCoords())}exitEditing(){const t=this._textBeforeEdit!==this.text;return this.exitEditingImpl(),this.fire("editing:exited"),t&&this.fire(U),this.canvas&&(this.canvas.fire("text:editing:exited",{target:this}),t&&this.canvas.fire("object:modified",{target:this})),this}_removeExtraneousStyles(){for(const t in this.styles)this._textLines[t]||delete this.styles[t]}removeStyleFromTo(t,e){const{lineIndex:s,charIndex:i}=this.get2DCursorLocation(t,!0),{lineIndex:r,charIndex:n}=this.get2DCursorLocation(e,!0);if(s!==r){if(this.styles[s])for(let t=i;t=n&&(t[s-e]=t[i],delete t[i])}}}shiftLineStyles(t,e){const s=Object.assign({},this.styles);for(const i in this.styles){const r=parseInt(i,10);r>t&&(this.styles[r+e]=s[r],s[r-e]||delete this.styles[r])}}insertNewlineStyleObject(t,e,s,i){const r={},n=this._unwrappedTextLines[t].length,o=n===e;let a=!1;s||(s=1),this.shiftLineStyles(t,s);const h=this.styles[t]?this.styles[t][0===e?e:e-1]:void 0;for(const s in this.styles[t]){const i=parseInt(s,10);i>=e&&(a=!0,r[i-e]=this.styles[t][s],o&&0===e||delete this.styles[t][s])}let l=!1;for(a&&!o&&(this.styles[t+s]=r,l=!0),(l||n>e)&&s--;s>0;)i&&i[s-1]?this.styles[t+s]={0:{...i[s-1]}}:h?this.styles[t+s]={0:{...h}}:delete this.styles[t+s],s--;this._forceClearCache=!0}insertCharStyleObject(t,e,s,i){this.styles||(this.styles={});const r=this.styles[t],n=r?{...r}:{};s||(s=1);for(const t in n){const i=parseInt(t,10);i>=e&&(r[i+s]=n[i],n[i-s]||delete r[i])}if(this._forceClearCache=!0,i){for(;s--;)Object.keys(i[s]).length&&(this.styles[t]||(this.styles[t]={}),this.styles[t][e+s]={...i[s]});return}if(!r)return;const o=r[e?e-1:1];for(;o&&s--;)this.styles[t][e+s]={...o}}insertNewStyleBlock(t,e,s){const i=this.get2DCursorLocation(e,!0),r=[0];let n,o=0;for(let e=0;e0&&(this.insertCharStyleObject(i.lineIndex,i.charIndex,r[0],s),s=s&&s.slice(r[0]+1)),o&&this.insertNewlineStyleObject(i.lineIndex,i.charIndex+r[0],o),n=1;n0?this.insertCharStyleObject(i.lineIndex+n,0,r[n],s):s&&this.styles[i.lineIndex+n]&&s[0]&&(this.styles[i.lineIndex+n][0]=s[0]),s=s&&s.slice(r[n]+1);r[n]>0&&this.insertCharStyleObject(i.lineIndex+n,0,r[n],s)}removeChars(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:t+1;this.removeStyleFromTo(t,e),this._text.splice(t,e-t),this.text=this._text.join(""),this.set("dirty",!0),this.initDimensions(),this.setCoords(),this._removeExtraneousStyles()}insertChars(t,e,s){let i=arguments.length>3&&void 0!==arguments[3]?arguments[3]:s;i>s&&this.removeStyleFromTo(s,i);const r=this.graphemeSplit(t);this.insertNewStyleBlock(r,s,e),this._text=[...this._text.slice(0,s),...r,...this._text.slice(i)],this.text=this._text.join(""),this.set("dirty",!0),this.initDimensions(),this.setCoords(),this._removeExtraneousStyles()}setSelectionStartEndWithShift(t,e,s){s<=t?(e===t?this._selectionDirection=O:this._selectionDirection===M&&(this._selectionDirection=O,this.selectionEnd=t),this.selectionStart=s):s>t&&s{let[s,i]=t;return e.setAttribute(s,i)});const{top:s,left:i,fontSize:r}=this._calcTextareaPosition();e.style.cssText=`position: absolute; top: ${s}; left: ${i}; z-index: -999; opacity: 0; width: 1px; height: 1px; font-size: 1px; padding-top: ${r};`,(this.hiddenTextareaContainer||t.body).appendChild(e),Object.entries({blur:"blur",keydown:"onKeyDown",keyup:"onKeyUp",input:"onInput",copy:"copy",cut:"copy",paste:"paste",compositionstart:"onCompositionStart",compositionupdate:"onCompositionUpdate",compositionend:"onCompositionEnd"}).map(t=>{let[s,i]=t;return e.addEventListener(s,this[i].bind(this))}),this.hiddenTextarea=e}blur(){this.abortCursorAnimation()}onKeyDown(t){if(!this.isEditing)return;const e="rtl"===this.direction?this.keysMapRtl:this.keysMap;if(t.keyCode in e)this[e[t.keyCode]](t);else{if(!(t.keyCode in this.ctrlKeysMapDown)||!t.ctrlKey&&!t.metaKey)return;this[this.ctrlKeysMapDown[t.keyCode]](t)}t.stopImmediatePropagation(),t.preventDefault(),t.keyCode>=33&&t.keyCode<=40?(this.inCompositionMode=!1,this.clearContextTop(),this.renderCursorOrSelection()):this.canvas&&this.canvas.requestRenderAll()}onKeyUp(t){!this.isEditing||this._copyDone||this.inCompositionMode?this._copyDone=!1:t.keyCode in this.ctrlKeysMapUp&&(t.ctrlKey||t.metaKey)&&(this[this.ctrlKeysMapUp[t.keyCode]](t),t.stopImmediatePropagation(),t.preventDefault(),this.canvas&&this.canvas.requestRenderAll())}onInput(t){const e=this.fromPaste,{value:i,selectionStart:r,selectionEnd:n}=this.hiddenTextarea;if(this.fromPaste=!1,t&&t.stopPropagation(),!this.isEditing)return;const o=()=>{this.updateFromTextArea(),this.fire(X),this.canvas&&(this.canvas.fire("text:changed",{target:this}),this.canvas.requestRenderAll())};if(""===this.hiddenTextarea.value)return this.styles={},void o();const a=this._splitTextIntoLines(i).graphemeText,h=this._text.length,l=a.length,c=this.selectionStart,d=this.selectionEnd,g=c!==d;let f,p,m,v,y=l-h;const _=this.fromStringToGraphemeSelection(r,n,i),x=c>_.selectionStart;g?(p=this._text.slice(c,d),y+=d-c):lf[0])),g?(m=c,v=d):x?(m=d-p.length,v=d):(m=d,v=d+p.length),this.removeStyleFromTo(m,v)),C.length){const{copyPasteData:t}=u();e&&C.join("")===t.copiedText&&!s.disableStyleCopyPaste&&(f=t.copiedTextStyle),this.insertNewStyleBlock(C,c,f)}o()}onCompositionStart(){this.inCompositionMode=!0}onCompositionEnd(){this.inCompositionMode=!1}onCompositionUpdate(t){let{target:e}=t;const{selectionStart:s,selectionEnd:i}=e;this.compositionStart=s,this.compositionEnd=i,this.updateTextareaPosition()}copy(){if(this.selectionStart===this.selectionEnd)return;const{copyPasteData:t}=u();t.copiedText=this.getSelectedText(),s.disableStyleCopyPaste?t.copiedTextStyle=void 0:t.copiedTextStyle=this.getSelectionStyles(this.selectionStart,this.selectionEnd,!0),this._copyDone=!0}paste(){this.fromPaste=!0}_getWidthBeforeCursor(t,e){let s,i=this._getLineLeftOffset(t);return e>0&&(s=this.__charBounds[t][e-1],i+=s.left+s.width),i}getDownCursorOffset(t,e){const s=this._getSelectionForOffset(t,e),i=this.get2DCursorLocation(s),r=i.lineIndex;if(r===this._textLines.length-1||t.metaKey||34===t.keyCode)return this._text.length-s;const n=i.charIndex,o=this._getWidthBeforeCursor(r,n),a=this._getIndexOnLine(r+1,o);return this._textLines[r].slice(n).length+a+1+this.missingNewlineOffset(r)}_getSelectionForOffset(t,e){return t.shiftKey&&this.selectionStart!==this.selectionEnd&&e?this.selectionEnd:this.selectionStart}getUpCursorOffset(t,e){const s=this._getSelectionForOffset(t,e),i=this.get2DCursorLocation(s),r=i.lineIndex;if(0===r||t.metaKey||33===t.keyCode)return-s;const n=i.charIndex,o=this._getWidthBeforeCursor(r,n),a=this._getIndexOnLine(r-1,o),h=this._textLines[r].slice(0,n),l=this.missingNewlineOffset(r-1);return-this._textLines[r-1].length+a-h.length+(1-l)}_getIndexOnLine(t,e){const s=this._textLines[t];let i,r,n=this._getLineLeftOffset(t),o=0;for(let a=0,h=s.length;ae){r=!0;const t=n-i,s=n,h=Math.abs(t-e);o=Math.abs(s-e)=this._text.length&&this.selectionEnd>=this._text.length||this._moveCursorUpOrDown("Down",t)}moveCursorUp(t){0===this.selectionStart&&0===this.selectionEnd||this._moveCursorUpOrDown("Up",t)}_moveCursorUpOrDown(t,e){const s=this[`get${t}CursorOffset`](e,this._selectionDirection===M);if(e.shiftKey?this.moveCursorWithShift(s):this.moveCursorWithoutShift(s),0!==s){const t=this.text.length;this.selectionStart=xs(0,this.selectionStart,t),this.selectionEnd=xs(0,this.selectionEnd,t),this.abortCursorAnimation(),this.initDelayedCursor(),this._fireSelectionChanged(),this._updateTextarea()}}moveCursorWithShift(t){const e=this._selectionDirection===O?this.selectionStart+t:this.selectionEnd+t;return this.setSelectionStartEndWithShift(this.selectionStart,this.selectionEnd,e),0!==t}moveCursorWithoutShift(t){return t<0?(this.selectionStart+=t,this.selectionEnd=this.selectionStart):(this.selectionEnd+=t,this.selectionStart=this.selectionEnd),0!==t}moveCursorLeft(t){0===this.selectionStart&&0===this.selectionEnd||this._moveCursorLeftOrRight("Left",t)}_move(t,e,s){let i;if(t.altKey)i=this[`findWordBoundary${s}`](this[e]);else{if(!t.metaKey&&35!==t.keyCode&&36!==t.keyCode)return this[e]+="Left"===s?-1:1,!0;i=this[`findLineBoundary${s}`](this[e])}return void 0!==i&&this[e]!==i&&(this[e]=i,!0)}_moveLeft(t,e){return this._move(t,e,"Left")}_moveRight(t,e){return this._move(t,e,"Right")}moveCursorLeftWithoutShift(t){let e=!0;return this._selectionDirection=O,this.selectionEnd===this.selectionStart&&0!==this.selectionStart&&(e=this._moveLeft(t,"selectionStart")),this.selectionEnd=this.selectionStart,e}moveCursorLeftWithShift(t){return this._selectionDirection===M&&this.selectionStart!==this.selectionEnd?this._moveLeft(t,"selectionEnd"):0!==this.selectionStart?(this._selectionDirection=O,this._moveLeft(t,"selectionStart")):void 0}moveCursorRight(t){this.selectionStart>=this._text.length&&this.selectionEnd>=this._text.length||this._moveCursorLeftOrRight("Right",t)}_moveCursorLeftOrRight(t,e){const s=`moveCursor${t}${e.shiftKey?"WithShift":"WithoutShift"}`;this._currentCursorOpacity=1,this[s](e)&&(this.abortCursorAnimation(),this.initDelayedCursor(),this._fireSelectionChanged(),this._updateTextarea())}moveCursorRightWithShift(t){return this._selectionDirection===O&&this.selectionStart!==this.selectionEnd?this._moveRight(t,"selectionStart"):this.selectionEnd!==this._text.length?(this._selectionDirection=M,this._moveRight(t,"selectionEnd")):void 0}moveCursorRightWithoutShift(t){let e=!0;return this._selectionDirection=M,this.selectionStart===this.selectionEnd?(e=this._moveRight(t,"selectionStart"),this.selectionEnd=this.selectionStart):this.selectionStart=this.selectionEnd,e}}const Qn=t=>!!t.button;class Zn extends Jn{constructor(){super(...arguments),t(this,"draggableTextDelegate",void 0)}initBehavior(){this.on("mousedown",this._mouseDownHandler),this.on("mouseup",this.mouseUpHandler),this.on("mousedblclick",this.doubleClickHandler),this.on("mousetripleclick",this.tripleClickHandler),this.draggableTextDelegate=new Un(this),super.initBehavior()}shouldStartDragging(){return this.draggableTextDelegate.isActive()}onDragStart(t){return this.draggableTextDelegate.onDragStart(t)}canDrop(t){return this.draggableTextDelegate.canDrop(t)}doubleClickHandler(t){this.isEditing&&(this.selectWord(this.getSelectionStartFromPointer(t.e)),this.renderCursorOrSelection())}tripleClickHandler(t){this.isEditing&&(this.selectLine(this.getSelectionStartFromPointer(t.e)),this.renderCursorOrSelection())}_mouseDownHandler(t){let{e:e,alreadySelected:s}=t;this.canvas&&this.editable&&!Qn(e)&&!this.getActiveControl()&&(this.draggableTextDelegate.start(e)||(this.canvas.textEditingManager.register(this),s&&(this.inCompositionMode=!1,this.setCursorByClick(e)),this.isEditing&&(this.__selectionStartOnMouseDown=this.selectionStart,this.selectionStart===this.selectionEnd&&this.abortCursorAnimation(),this.renderCursorOrSelection()),this.selected||(this.selected=s||this.isEditing)))}mouseUpHandler(t){let{e:e,transform:s}=t;const i=this.draggableTextDelegate.end(e);if(this.canvas){this.canvas.textEditingManager.unregister(this);const t=this.canvas._activeObject;if(t&&t!==this)return}!this.editable||this.group&&!this.group.interactive||s&&s.actionPerformed||Qn(e)||i||this.selected&&!this.getActiveControl()&&(this.enterEditing(e),this.selectionStart===this.selectionEnd?this.initDelayedCursor(!0):this.renderCursorOrSelection())}setCursorByClick(t){const e=this.getSelectionStartFromPointer(t),s=this.selectionStart,i=this.selectionEnd;t.shiftKey?this.setSelectionStartEndWithShift(s,i,e):(this.selectionStart=e,this.selectionEnd=e),this.isEditing&&(this._fireSelectionChanged(),this._updateTextarea())}getSelectionStartFromPointer(t){const e=this.canvas.getScenePoint(t).transform(Ct(this.calcTransformMatrix())).add(new it(-this._getLeftOffset(),-this._getTopOffset()));let s=0,i=0,r=0;for(let t=0;t0&&(i+=this._textLines[t-1].length+this.missingNewlineOffset(t-1));let n=Math.abs(this._getLineLeftOffset(r));const o=this._textLines[r].length,a=this.__charBounds[r];for(let t=0;t{const s=e.getRetinaScaling();t.setTransform(s,0,0,s,0,0);const i=e.viewportTransform;t.transform(i[0],i[1],i[2],i[3],i[4],i[5])},oo={selectionStart:0,selectionEnd:0,selectionColor:"rgba(17,119,255,0.3)",isEditing:!1,editable:!0,editingBorderColor:"rgba(102,153,255,0.25)",cursorWidth:2,cursorColor:"",cursorDelay:1e3,cursorDuration:600,caching:!0,hiddenTextareaContainer:null,keysMap:{9:ro,27:ro,33:to,34:eo,35:io,36:so,37:so,38:to,39:io,40:eo},keysMapRtl:{9:ro,27:ro,33:to,34:eo,35:so,36:io,37:io,38:to,39:so,40:eo},ctrlKeysMapDown:{65:"cmdAll"},ctrlKeysMapUp:{67:"copy",88:"cut"},_selectionDirection:null,_reSpace:/\s|\r?\n/,inCompositionMode:!1};class ao extends Zn{static getDefaults(){return{...super.getDefaults(),...ao.ownDefaults}}get type(){const t=super.type;return"itext"===t?"i-text":t}constructor(t,e){super(t,{...ao.ownDefaults,...e}),this.initBehavior()}_set(t,e){return this.isEditing&&this._savedProps&&t in this._savedProps?(this._savedProps[t]=e,this):("canvas"===t&&(this.canvas instanceof ln&&this.canvas.textEditingManager.remove(this),e instanceof ln&&e.textEditingManager.add(this)),super._set(t,e))}setSelectionStart(t){t=Math.max(t,0),this._updateAndFire("selectionStart",t)}setSelectionEnd(t){t=Math.min(t,this.text.length),this._updateAndFire("selectionEnd",t)}_updateAndFire(t,e){this[t]!==e&&(this._fireSelectionChanged(),this[t]=e),this._updateTextarea()}_fireSelectionChanged(){this.fire("selection:changed"),this.canvas&&this.canvas.fire("text:selection:changed",{target:this})}initDimensions(){this.isEditing&&this.initDelayedCursor(),super.initDimensions()}getSelectionStyles(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.selectionStart||0,e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:this.selectionEnd,s=arguments.length>2?arguments[2]:void 0;return super.getSelectionStyles(t,e,s)}setSelectionStyles(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:this.selectionStart||0,s=arguments.length>2&&void 0!==arguments[2]?arguments[2]:this.selectionEnd;return super.setSelectionStyles(t,e,s)}get2DCursorLocation(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.selectionStart,e=arguments.length>1?arguments[1]:void 0;return super.get2DCursorLocation(t,e)}render(t){super.render(t),this.cursorOffsetCache={},this.renderCursorOrSelection()}toCanvasElement(t){const e=this.isEditing;this.isEditing=!1;const s=super.toCanvasElement(t);return this.isEditing=e,s}renderCursorOrSelection(){if(!this.isEditing||!this.canvas)return;const t=this.clearContextTop(!0);if(!t)return;const e=this._getCursorBoundaries(),s=this.findAncestorsWithClipPath(),i=s.length>0;let r,n=t;if(i){r=ft(t.canvas),n=r.getContext("2d"),no(n,this.canvas);const e=this.calcTransformMatrix();n.transform(e[0],e[1],e[2],e[3],e[4],e[5])}if(this.selectionStart!==this.selectionEnd||this.inCompositionMode?this.renderSelection(n,e):this.renderCursor(n,e),i)for(const e of s){const s=e.clipPath,i=ft(t.canvas),r=i.getContext("2d");if(no(r,this.canvas),!s.absolutePositioned){const t=e.calcTransformMatrix();r.transform(t[0],t[1],t[2],t[3],t[4],t[5])}s.transform(r),s.drawObject(r,!0,{}),this.drawClipPathOnCache(n,s,i)}i&&(t.setTransform(1,0,0,1,0,0),t.drawImage(r,0,0)),this.canvas.contextTopDirty=!0,t.restore()}findAncestorsWithClipPath(){const t=[];let e=this;for(;e;)e.clipPath&&t.push(e),e=e.parent;return t}_getCursorBoundaries(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.selectionStart,e=arguments.length>1?arguments[1]:void 0;const s=this._getLeftOffset(),i=this._getTopOffset(),r=this._getCursorBoundariesOffsets(t,e);return{left:s,top:i,leftOffset:r.left,topOffset:r.top}}_getCursorBoundariesOffsets(t,e){return e?this.__getCursorBoundariesOffsets(t):this.cursorOffsetCache&&"top"in this.cursorOffsetCache?this.cursorOffsetCache:this.cursorOffsetCache=this.__getCursorBoundariesOffsets(t)}__getCursorBoundariesOffsets(t){let e=0,s=0;const{charIndex:i,lineIndex:r}=this.get2DCursorLocation(t);for(let t=0;t0?s:0)};return"rtl"===this.direction&&(this.textAlign===M||this.textAlign===ss||this.textAlign===rs?a.left*=-1:this.textAlign===O||this.textAlign===is?a.left=n-(s>0?s:0):this.textAlign!==T&&this.textAlign!==ns||(a.left=n-(s>0?s:0))),a}renderCursorAt(t){this._renderCursor(this.canvas.contextTop,this._getCursorBoundaries(t,!0),t)}renderCursor(t,e){this._renderCursor(t,e,this.selectionStart)}getCursorRenderingData(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.selectionStart,e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:this._getCursorBoundaries(t);const s=this.get2DCursorLocation(t),i=s.lineIndex,r=s.charIndex>0?s.charIndex-1:0,n=this.getValueOfPropertyAt(i,r,"fontSize"),o=this.getObjectScaling().x*this.canvas.getZoom(),a=this.cursorWidth/o,h=this.getValueOfPropertyAt(i,r,"deltaY"),l=e.topOffset+(1-this._fontSizeFraction)*this.getHeightOfLine(i)/this.lineHeight-n*(1-this._fontSizeFraction);return{color:this.cursorColor||this.getValueOfPropertyAt(i,r,"fill"),opacity:this._currentCursorOpacity,left:e.left+e.leftOffset-a/2,top:l+e.top+h,width:a,height:n}}_renderCursor(t,e,s){const{color:i,opacity:r,left:n,top:o,width:a,height:h}=this.getCursorRenderingData(s,e);t.fillStyle=i,t.globalAlpha=r,t.fillRect(n,o,a,h)}renderSelection(t,e){const s={selectionStart:this.inCompositionMode?this.hiddenTextarea.selectionStart:this.selectionStart,selectionEnd:this.inCompositionMode?this.hiddenTextarea.selectionEnd:this.selectionEnd};this._renderSelection(t,s,e)}renderDragSourceEffect(){const t=this.draggableTextDelegate.getDragStartSelection();this._renderSelection(this.canvas.contextTop,t,this._getCursorBoundaries(t.selectionStart,!0))}renderDropTargetEffect(t){const e=this.getSelectionStartFromPointer(t);this.renderCursorAt(e)}_renderSelection(t,e,s){const i=e.selectionStart,r=e.selectionEnd,n=this.textAlign.includes(ss),o=this.get2DCursorLocation(i),a=this.get2DCursorLocation(r),h=o.lineIndex,l=a.lineIndex,c=o.charIndex<0?0:o.charIndex,u=a.charIndex<0?0:a.charIndex;for(let e=h;e<=l;e++){const i=this._getLineLeftOffset(e)||0;let r=this.getHeightOfLine(e),o=0,a=0,d=0;if(e===h&&(a=this.__charBounds[h][c].left),e>=h&&e1)&&(r/=this.lineHeight);let g=s.left+i+a,f=r,p=0;const m=d-a;this.inCompositionMode?(t.fillStyle=this.compositionColor||"black",f=1,p=r):t.fillStyle=this.selectionColor,"rtl"===this.direction&&(this.textAlign===M||this.textAlign===ss||this.textAlign===rs?g=this.width-g-m:this.textAlign===O||this.textAlign===is?g=s.left+i-d:this.textAlign!==T&&this.textAlign!==ns||(g=s.left+i-d)),t.fillRect(g,s.top+s.topOffset+p,m,f),s.topOffset+=o}}getCurrentCharFontSize(){const t=this._getCurrentCharIndex();return this.getValueOfPropertyAt(t.l,t.c,"fontSize")}getCurrentCharColor(){const t=this._getCurrentCharIndex();return this.getValueOfPropertyAt(t.l,t.c,H)}_getCurrentCharIndex(){const t=this.get2DCursorLocation(this.selectionStart,!0),e=t.charIndex>0?t.charIndex-1:0;return{l:t.lineIndex,c:e}}dispose(){this.exitEditingImpl(),this.draggableTextDelegate.dispose(),super.dispose()}}t(ao,"ownDefaults",oo),t(ao,"type","IText"),J.setClass(ao),J.setClass(ao,"i-text");class ho extends ao{static getDefaults(){return{...super.getDefaults(),...ho.ownDefaults}}constructor(t,e){super(t,{...ho.ownDefaults,...e})}static createControls(){return{controls:vi()}}initDimensions(){this.initialized&&(this.isEditing&&this.initDelayedCursor(),this._clearCache(),this.dynamicMinWidth=0,this._styleMap=this._generateStyleMap(this._splitText()),this.dynamicMinWidth>this.width&&this._set("width",this.dynamicMinWidth),this.textAlign.includes(ss)&&this.enlargeSpaces(),this.height=this.calcTextHeight())}_generateStyleMap(t){let e=0,s=0,i=0;const r={};for(let n=0;n0?(s=0,i++,e++):!this.splitByGrapheme&&this._reSpaceAndTab.test(t.graphemeText[i])&&n>0&&(s++,i++),r[n]={line:e,offset:s},i+=t.graphemeLines[n].length,s+=t.graphemeLines[n].length;return r}styleHas(t,e){if(this._styleMap&&!this.isWrapping){const t=this._styleMap[e];t&&(e=t.line)}return super.styleHas(t,e)}isEmptyStyles(t){if(!this.styles)return!0;let e,s=0,i=t+1,r=!1;const n=this._styleMap[t],o=this._styleMap[t+1];n&&(t=n.line,s=n.offset),o&&(i=o.line,r=i===t,e=o.offset);const a=void 0===t?this.styles:{line:this.styles[t]};for(const t in a)for(const i in a[t]){const n=parseInt(i,10);if(n>=s&&(!r||n{let n=0;const o=e?this.graphemeSplit(t):this.wordSplit(t);return 0===o.length?[{word:[],width:0}]:o.map(t=>{const o=e?[t]:this.graphemeSplit(t),a=this._measureWord(o,r,n);return i=Math.max(a,i),n+=o.length+s.length,{word:o,width:a}})}),largestWordWidth:i}}_measureWord(t,e){let s,i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:0,r=0;for(let n=0,o=t.length;n3&&void 0!==arguments[3]?arguments[3]:0;const o=this._getWidthOfCharSpacing(),a=this.splitByGrapheme,h=[],l=a?"":" ";let c=0,u=[],d=0,g=0,f=!0;e-=n;const p=Math.max(e,i,this.dynamicMinWidth),m=r[t];let v;for(d=0,v=0;vp&&!f?(h.push(u),u=[],c=s,f=!0):c+=o,f||a||u.push(l),u=u.concat(e),g=a?0:this._measureWord([l],t,d),d++,f=!1}return v&&h.push(u),i+n>this.dynamicMinWidth&&(this.dynamicMinWidth=i-o+n),h}isEndOfWrapping(t){return!this._styleMap[t+1]||this._styleMap[t+1].line!==this._styleMap[t].line}missingNewlineOffset(t,e){return this.splitByGrapheme&&!e?this.isEndOfWrapping(t)?1:0:1}_splitTextIntoLines(t){const e=super._splitTextIntoLines(t),s=this._wrapText(e.lines,this.width),i=new Array(s.length);for(let t=0;t0&&void 0!==arguments[0]?arguments[0]:[];return super.toObject(["minWidth","splitByGrapheme",...t])}}t(ho,"type","Textbox"),t(ho,"textLayoutProperties",[...ao.textLayoutProperties,"width"]),t(ho,"ownDefaults",{minWidth:20,dynamicMinWidth:2,lockScalingFlip:!0,noScaleCache:!1,_wordJoiners:/[ \t\r]/,splitByGrapheme:!1}),J.setClass(ho);class lo extends fr{shouldPerformLayout(t){return!!t.target.clipPath&&super.shouldPerformLayout(t)}shouldLayoutClipPath(){return!1}calcLayoutResult(t,e){const{target:s}=t,{clipPath:i,group:r}=s;if(!i||!this.shouldPerformLayout(t))return;const{width:n,height:o}=re(gr(s,i)),a=new it(n,o);if(i.absolutePositioned){return{center:ue(i.getRelativeCenterPoint(),void 0,r?r.calcTransformMatrix():void 0),size:a}}{const r=i.getRelativeCenterPoint().transform(s.calcOwnMatrix(),!0);if(this.shouldPerformLayout(t)){const{center:s=new it,correction:i=new it}=this.calcBoundingBox(e,t)||{};return{center:s.add(r),correction:i.subtract(r),size:a}}return{center:s.getRelativeCenterPoint().add(r),size:a}}}}t(lo,"type","clip-path"),J.setClass(lo);class co extends fr{getInitialSize(t,e){let{target:s}=t,{size:i}=e;return new it(s.width||i.x,s.height||i.y)}}t(co,"type","fixed"),J.setClass(co);class uo extends vr{subscribeTargets(t){const e=t.target;t.targets.reduce((t,e)=>(e.parent&&t.add(e.parent),t),new Set).forEach(t=>{t.layoutManager.subscribeTargets({target:t,targets:[e]})})}unsubscribeTargets(t){const e=t.target,s=e.getObjects();t.targets.reduce((t,e)=>(e.parent&&t.add(e.parent),t),new Set).forEach(t=>{!s.some(e=>e.parent===t)&&t.layoutManager.unsubscribeTargets({target:t,targets:[e]})})}}class go extends _r{static getDefaults(){return{...super.getDefaults(),...go.ownDefaults}}constructor(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[],e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};super(),Object.assign(this,go.ownDefaults),this.setOptions(e);const{left:s,top:i,layoutManager:r}=e;this.groupInit(t,{left:s,top:i,layoutManager:null!=r?r:new uo})}_shouldSetNestedCoords(){return!0}__objectSelectionMonitor(){}multiSelectAdd(){for(var t=arguments.length,e=new Array(t),s=0;s{const e=this._objects.findIndex(e=>e.isInFrontOf(t)),s=-1===e?this.size():e;this.insertAt(s,t)})}canEnterGroup(t){return this.getObjects().some(e=>e.isDescendantOf(t)||t.isDescendantOf(e))?(i("error","ActiveSelection: circular object trees are not supported, this call has no effect"),!1):super.canEnterGroup(t)}enterGroup(t,e){t.parent&&t.parent===t.group?t.parent._exitGroup(t):t.group&&t.parent!==t.group&&t.group.remove(t),this._enterGroup(t,e)}exitGroup(t,e){this._exitGroup(t,e),t.parent&&t.parent._enterGroup(t,!0)}_onAfterObjectsChange(t,e){super._onAfterObjectsChange(t,e);const s=new Set;e.forEach(t=>{const{parent:e}=t;e&&s.add(e)}),t===ur?s.forEach(t=>{t._onAfterObjectsChange(cr,e)}):s.forEach(t=>{t._set("dirty",!0)})}onDeselect(){return this.removeAll(),!1}toString(){return`#`}shouldCache(){return!1}isOnACache(){return!1}_renderControls(t,e,s){t.save(),t.globalAlpha=this.isMoving?this.borderOpacityWhenMoving:1;const i={hasControls:!1,...s,forActiveSelection:!0};for(let e=0;e{t.applyTo(o)});const{imageData:a}=o;return a.width===s&&a.height===i||(r.width=a.width,r.height=a.height),n.putImageData(a,0,0),o}}class po{constructor(){let{tileSize:e=s.textureSize}=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};t(this,"aPosition",new Float32Array([0,0,0,1,1,0,1,1])),t(this,"resources",{}),this.tileSize=e,this.setupGLContext(e,e),this.captureGPUInfo()}setupGLContext(t,e){this.dispose(),this.createWebGLCanvas(t,e)}createWebGLCanvas(t,e){const s=ft({width:t,height:e}),i=s.getContext("webgl",{alpha:!0,premultipliedAlpha:!1,depth:!1,stencil:!1,antialias:!1});i&&(i.clearColor(0,0,0,0),this.canvas=s,this.gl=i)}applyFilters(t,e,s,i,r,n){const o=this.gl,a=r.getContext("2d");if(!o||!a)return;let h;n&&(h=this.getCachedTexture(n,e));const l={originalWidth:e.width||e.naturalWidth||0,originalHeight:e.height||e.naturalHeight||0,sourceWidth:s,sourceHeight:i,destinationWidth:s,destinationHeight:i,context:o,sourceTexture:this.createTexture(o,s,i,h?void 0:e),targetTexture:this.createTexture(o,s,i),originalTexture:h||this.createTexture(o,s,i,h?void 0:e),passes:t.length,webgl:!0,aPosition:this.aPosition,programCache:this.programCache,pass:0,filterBackend:this,targetCanvas:r},c=o.createFramebuffer();return o.bindFramebuffer(o.FRAMEBUFFER,c),t.forEach(t=>{t&&t.applyTo(l)}),function(t){const e=t.targetCanvas,s=e.width,i=e.height,r=t.destinationWidth,n=t.destinationHeight;s===r&&i===n||(e.width=r,e.height=n)}(l),this.copyGLTo2D(o,l),o.bindTexture(o.TEXTURE_2D,null),o.deleteTexture(l.sourceTexture),o.deleteTexture(l.targetTexture),o.deleteFramebuffer(c),a.setTransform(1,0,0,1,0,0),l}dispose(){this.canvas&&(this.canvas=null,this.gl=null),this.clearWebGLCaches()}clearWebGLCaches(){this.programCache={},this.textureCache={}}createTexture(t,e,s,i,r){const{NEAREST:n,TEXTURE_2D:o,RGBA:a,UNSIGNED_BYTE:h,CLAMP_TO_EDGE:l,TEXTURE_MAG_FILTER:c,TEXTURE_MIN_FILTER:u,TEXTURE_WRAP_S:d,TEXTURE_WRAP_T:g}=t,f=t.createTexture();return t.bindTexture(o,f),t.texParameteri(o,c,r||n),t.texParameteri(o,u,r||n),t.texParameteri(o,d,l),t.texParameteri(o,g,l),i?t.texImage2D(o,0,a,a,h,i):t.texImage2D(o,0,a,e,s,0,a,h,null),f}getCachedTexture(t,e,s){const{textureCache:i}=this;if(i[t])return i[t];{const r=this.createTexture(this.gl,e.width,e.height,e,s);return r&&(i[t]=r),r}}evictCachesForKey(t){this.textureCache[t]&&(this.gl.deleteTexture(this.textureCache[t]),delete this.textureCache[t])}copyGLTo2D(t,e){const s=t.canvas,i=e.targetCanvas,r=i.getContext("2d");if(!r)return;r.translate(0,i.height),r.scale(1,-1);const n=s.height-i.height;r.drawImage(s,0,n,i.width,i.height,0,0,i.width,i.height)}copyGLTo2DPutImageData(t,e){const s=e.targetCanvas.getContext("2d"),i=e.destinationWidth,r=e.destinationHeight,n=i*r*4;if(!s)return;const o=new Uint8Array(this.imageBuffer,0,n),a=new Uint8ClampedArray(this.imageBuffer,0,n);t.readPixels(0,0,i,r,t.RGBA,t.UNSIGNED_BYTE,o);const h=new ImageData(a,i,r);s.putImageData(h,0,0)}captureGPUInfo(){if(this.gpuInfo)return this.gpuInfo;const t=this.gl,e={renderer:"",vendor:""};if(!t)return e;const s=t.getExtension("WEBGL_debug_renderer_info");if(s){const i=t.getParameter(s.UNMASKED_RENDERER_WEBGL),r=t.getParameter(s.UNMASKED_VENDOR_WEBGL);i&&(e.renderer=i.toLowerCase()),r&&(e.vendor=r.toLowerCase())}return this.gpuInfo=e,e}}let mo;function vo(){const{WebGLProbe:t}=u();return t.queryWebGL(dt()),s.enableGLFiltering&&t.isSupported(s.textureSize)?new po({tileSize:s.textureSize}):new fo}function yo(){return!mo&&(!(arguments.length>0&&void 0!==arguments[0])||arguments[0])&&(mo=vo()),mo}function _o(t){mo=t}const xo=["cropX","cropY"];class Co extends xi{static getDefaults(){return{...super.getDefaults(),...Co.ownDefaults}}constructor(e,s){super(),t(this,"_lastScaleX",1),t(this,"_lastScaleY",1),t(this,"_filterScalingX",1),t(this,"_filterScalingY",1),this.filters=[],Object.assign(this,Co.ownDefaults),this.setOptions(s),this.cacheKey=`texture${ut()}`,this.setElement("string"==typeof e?(this.canvas&&Ht(this.canvas.getElement())||d()).getElementById(e):e,s)}getElement(){return this._element}setElement(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};this.removeTexture(this.cacheKey),this.removeTexture(`${this.cacheKey}_filtered`),this._element=t,this._originalElement=t,this._setWidthHeight(e),0!==this.filters.length&&this.applyFilters(),this.resizeFilter&&this.applyResizeFilters()}removeTexture(t){const e=yo(!1);e instanceof po&&e.evictCachesForKey(t)}dispose(){super.dispose(),this.removeTexture(this.cacheKey),this.removeTexture(`${this.cacheKey}_filtered`),this._cacheContext=null,["_originalElement","_element","_filteredEl","_cacheCanvas"].forEach(t=>{const e=this[t];e&&u().dispose(e),this[t]=void 0})}getCrossOrigin(){return this._originalElement&&(this._originalElement.crossOrigin||null)}getOriginalSize(){const t=this.getElement();return t?{width:t.naturalWidth||t.width,height:t.naturalHeight||t.height}:{width:0,height:0}}_stroke(t){if(!this.stroke||0===this.strokeWidth)return;const e=this.width/2,s=this.height/2;t.beginPath(),t.moveTo(-e,-s),t.lineTo(e,-s),t.lineTo(e,s),t.lineTo(-e,s),t.lineTo(-e,-s),t.closePath()}toObject(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[];const e=[];return this.filters.forEach(t=>{t&&e.push(t.toObject())}),{...super.toObject([...xo,...t]),src:this.getSrc(),crossOrigin:this.getCrossOrigin(),filters:e,...this.resizeFilter?{resizeFilter:this.resizeFilter.toObject()}:{}}}hasCrop(){return!!this.cropX||!!this.cropY||this.width\n','\t\n',"\n"),o=' clip-path="url(#imageCrop_'+t+')" '}if(this.imageSmoothing||(a=' image-rendering="optimizeSpeed"'),t.push("\t\n`),this.stroke||this.strokeDashArray){const t=this.fill;this.fill=null,n=[`\t\n`],this.fill=t}return r=this.paintFirst!==H?r.concat(n,t):r.concat(t,n),r}getSrc(t){const e=t?this._element:this._originalElement;return e?e.toDataURL?e.toDataURL():this.srcFromAttribute?e.getAttribute("src")||"":e.src:this.src||""}getSvgSrc(t){return this.getSrc(t)}setSrc(t){let{crossOrigin:e,signal:s}=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return Ft(t,{crossOrigin:e,signal:s}).then(t=>{void 0!==e&&this.set({crossOrigin:e}),this.setElement(t)})}toString(){return`#`}applyResizeFilters(){const t=this.resizeFilter,e=this.minimumScaleTrigger,s=this.getTotalObjectScaling(),i=s.x,r=s.y,n=this._filteredEl||this._originalElement;if(this.group&&this.set("dirty",!0),!t||i>e&&r>e)return this._element=n,this._filterScalingX=1,this._filterScalingY=1,this._lastScaleX=i,void(this._lastScaleY=r);const o=ft(n),{width:a,height:h}=n;this._element=o,this._lastScaleX=t.scaleX=i,this._lastScaleY=t.scaleY=r,yo().applyFilters([t],n,a,h,this._element),this._filterScalingX=o.width/this._originalElement.width,this._filterScalingY=o.height/this._originalElement.height}applyFilters(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.filters||[];if(t=t.filter(t=>t&&!t.isNeutralState()),this.set("dirty",!0),this.removeTexture(`${this.cacheKey}_filtered`),0===t.length)return this._element=this._originalElement,this._filteredEl=void 0,this._filterScalingX=1,void(this._filterScalingY=1);const e=this._originalElement,s=e.naturalWidth||e.width,i=e.naturalHeight||e.height;if(this._element===this._originalElement){const t=ft({width:s,height:i});this._element=t,this._filteredEl=t}else this._filteredEl&&(this._element=this._filteredEl,this._filteredEl.getContext("2d").clearRect(0,0,s,i),this._lastScaleX=1,this._lastScaleY=1);yo().applyFilters(t,this._originalElement,s,i,this._element,this.cacheKey),this._originalElement.width===this._element.width&&this._originalElement.height===this._element.height||(this._filterScalingX=this._element.width/this._originalElement.width,this._filterScalingY=this._element.height/this._originalElement.height)}_render(t){t.imageSmoothingEnabled=this.imageSmoothing,!0!==this.isMoving&&this.resizeFilter&&this._needsResize()&&this.applyResizeFilters(),this._stroke(t),this._renderPaintInOrder(t)}drawCacheOnCanvas(t){t.imageSmoothingEnabled=this.imageSmoothing,super.drawCacheOnCanvas(t)}shouldCache(){return this.needsItsOwnCache()}_renderFill(t){const e=this._element;if(!e)return;const s=this._filterScalingX,i=this._filterScalingY,r=this.width,n=this.height,o=Math.max(this.cropX,0),a=Math.max(this.cropY,0),h=e.naturalWidth||e.width,l=e.naturalHeight||e.height,c=o*s,u=a*i,d=Math.min(r*s,h-c),g=Math.min(n*i,l-u),f=-r/2,p=-n/2,m=Math.min(r,h/s-o),v=Math.min(n,l/i-a);e&&t.drawImage(e,c,u,d,g,f,p,m,v)}_needsResize(){const t=this.getTotalObjectScaling();return t.x!==this._lastScaleX||t.y!==this._lastScaleY}_resetWidthHeight(){this.set(this.getOriginalSize())}_setWidthHeight(){let{width:t,height:e}=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};const s=this.getOriginalSize();this.width=t||s.width,this.height=e||s.height}parsePreserveAspectRatioAttribute(){const t=ze(this.preserveAspectRatio||""),e=this.width,s=this.height,i={width:e,height:s};let r,n=this._element.width,o=this._element.height,a=1,h=1,l=0,c=0,u=0,d=0;return!t||t.alignX===E&&t.alignY===E?(a=e/n,h=s/o):("meet"===t.meetOrSlice&&(a=h=xr(this._element,i),r=(e-n*a)/2,"Min"===t.alignX&&(l=-r),"Max"===t.alignX&&(l=r),r=(s-o*h)/2,"Min"===t.alignY&&(c=-r),"Max"===t.alignY&&(c=r)),"slice"===t.meetOrSlice&&(a=h=Cr(this._element,i),r=n-e/a,"Mid"===t.alignX&&(u=r/2),"Max"===t.alignX&&(u=r),r=o-s/h,"Mid"===t.alignY&&(d=r/2),"Max"===t.alignY&&(d=r),n=e/a,o=s/h)),{width:n,height:o,scaleX:a,scaleY:h,offsetLeft:l,offsetTop:c,cropX:u,cropY:d}}static fromObject(t,e){let{filters:s,resizeFilter:i,src:r,crossOrigin:n,type:o,...a}=t;return Promise.all([Ft(r,{...e,crossOrigin:n}),s&&Lt(s,e),i?Lt([i],e):[],Rt(a,e)]).then(t=>{let[e,s=[],[i],n={}]=t;return new this(e,{...a,src:r,filters:s,resizeFilter:i,...n})})}static fromURL(t){let{crossOrigin:e=null,signal:s}=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},i=arguments.length>2?arguments[2]:void 0;return Ft(t,{crossOrigin:e,signal:s}).then(t=>new this(t,i))}static async fromElement(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},s=arguments.length>2?arguments[2]:void 0;const r=or(t,this.ATTRIBUTE_NAMES,s);return this.fromURL(r["xlink:href"]||r.href,e,r).catch(t=>(i("log","Unable to parse Image",t),null))}}function bo(t){if(!fs.test(t.nodeName))return{};const e=t.getAttribute("viewBox");let s,i,r=1,n=1,o=0,a=0;const h=t.getAttribute("width"),l=t.getAttribute("height"),c=t.getAttribute("x")||0,u=t.getAttribute("y")||0,d=!(e&&ms.test(e)),g=!h||!l||"100%"===h||"100%"===l;let f="",p=0,m=0;if(d&&(c||u)&&t.parentNode&&"#document"!==t.parentNode.nodeName&&(f=" translate("+Ge(c||"0")+" "+Ge(u||"0")+") ",s=(t.getAttribute("transform")||"")+f,t.setAttribute("transform",s),t.removeAttribute("x"),t.removeAttribute("y")),d&&g)return{width:0,height:0};const v={width:0,height:0};if(d)return v.width=Ge(h),v.height=Ge(l),v;const y=e.match(ms);o=-parseFloat(y[1]),a=-parseFloat(y[2]);const _=parseFloat(y[3]),x=parseFloat(y[4]);v.minX=o,v.minY=a,v.viewBoxWidth=_,v.viewBoxHeight=x,g?(v.width=_,v.height=x):(v.width=Ge(h),v.height=Ge(l),r=v.width/_,n=v.height/x);const C=ze(t.getAttribute("preserveAspectRatio")||"");if(C.alignX!==E&&("meet"===C.meetOrSlice&&(n=r=r>n?n:r),"slice"===C.meetOrSlice&&(n=r=r>n?r:n),p=v.width-_*r,m=v.height-x*r,"Mid"===C.alignX&&(p/=2),"Mid"===C.alignY&&(m/=2),"Min"===C.alignX&&(p=0),"Min"===C.alignY&&(m=0)),1===r&&1===n&&0===o&&0===a&&0===c&&0===u)return v;if((c||u)&&"#document"!==t.parentNode.nodeName&&(f=" translate("+Ge(c||"0")+" "+Ge(u||"0")+") "),s=f+" matrix("+r+" 0 0 "+n+" "+(o*r+p)+" "+(a*n+m)+") ","svg"===t.nodeName){for(i=t.ownerDocument.createElementNS(hs,"g");t.firstChild;)i.appendChild(t.firstChild);t.appendChild(i)}else i=t,i.removeAttribute("x"),i.removeAttribute("y"),s=i.getAttribute("transform")+s;return i.setAttribute("transform",s),v}t(Co,"type","Image"),t(Co,"cacheProperties",[...bs,...xo]),t(Co,"ownDefaults",{strokeWidth:0,srcFromAttribute:!1,minimumScaleTrigger:.5,cropX:0,cropY:0,imageSmoothing:!0}),t(Co,"ATTRIBUTE_NAMES",[...Ii,"x","y","width","height","preserveAspectRatio","xlink:href","href","crossOrigin","image-rendering"]),J.setClass(Co),J.setSVGClass(Co);const So=t=>t.tagName.replace("svg:",""),wo=Ue(["pattern","defs","symbol","metadata","clipPath","mask","desc"]);function To(t,e){let s,i,r,n,o=[];for(r=0,n=e.length;r{const s=r.getAttribute(t);!e.hasAttribute(t)&&s&&e.setAttribute(t,s)}),!e.children.length)){const t=r.cloneNode(!0);for(;t.firstChild;)e.appendChild(t.firstChild)}e.removeAttribute(ko)}const Mo=["linearGradient","radialGradient","svg:linearGradient","svg:radialGradient"];const Eo=t=>J.getSVGClass(So(t).toLowerCase());class Po{constructor(t,e,s,i,r){this.elements=t,this.options=e,this.reviver=s,this.regexUrl=/^url\(['"]?#([^'"]+)['"]?\)/g,this.doc=i,this.clipPaths=r,this.gradientDefs=function(t){const e=To(t,Mo),s={};let i=e.length;for(;i--;){const r=e[i];r.getAttribute("xlink:href")&&Do(t,r);const n=r.getAttribute("id");n&&(s[n]=r)}return s}(i),this.cssRules=function(t){const e=t.getElementsByTagName("style"),s={};for(let t=0;ts.length>1&&t.trim()).forEach(t=>{if((t.match(/{/g)||[]).length>1&&t.trim().startsWith("@"))return;const e=t.split("{"),i={},r=e[1].trim().split(";").filter(function(t){return t.trim()});for(let t=0;t{""!==(t=t.replace(/^svg/i,"").trim())&&(s[t]={...s[t]||{},...i})})})}return s}(i)}parse(){return Promise.all(this.elements.map(t=>this.createObject(t)))}async createObject(t){const e=Eo(t);if(e){const s=await e.fromElement(t,this.options,this.cssRules);return this.resolveGradient(s,t,H),this.resolveGradient(s,t,N),s instanceof Co&&s._originalElement?Jr(s,s.parsePreserveAspectRatioAttribute()):Jr(s),await this.resolveClipPath(s,t),this.reviver&&this.reviver(t,s),s}return null}extractPropertyDefinition(t,e,s){const i=t[e],r=this.regexUrl;if(!r.test(i))return;r.lastIndex=0;const n=r.exec(i)[1];return r.lastIndex=0,s[n]}resolveGradient(t,e,s){const i=this.extractPropertyDefinition(t,s,this.gradientDefs);if(i){const r=e.getAttribute(s+"-opacity"),n=wn.fromElement(i,t,{...this.options,opacity:r});t.set(s,n)}}async resolveClipPath(t,e,s){const i=this.extractPropertyDefinition(t,"clipPath",this.clipPaths);if(i){const r=Ct(t.calcTransformMatrix()),n=i[0].parentElement;let o=e;for(;!s&&o.parentElement&&o.getAttribute("clip-path")!==t.clipPath;)o=o.parentElement;o.parentElement.appendChild(n);const a=er(`${o.getAttribute("transform")||""} ${n.getAttribute("originalTransform")||""}`);n.setAttribute("transform",`matrix(${a.join(",")})`);const h=await Promise.all(i.map(t=>Eo(t).fromElement(t,this.options,this.cssRules).then(t=>(Jr(t),t.fillRule=t.clipRule,delete t.clipRule,t)))),l=1===h.length?h[0]:new _r(h),c=bt(r,l.calcTransformMatrix());l.clipPath&&await this.resolveClipPath(l,o,n.getAttribute("clip-path")?o:void 0);const{scaleX:u,scaleY:d,angle:g,skewX:f,translateX:p,translateY:m}=Tt(c);l.set({flipX:!1,flipY:!1}),l.set({scaleX:u,scaleY:d,angle:g,skewX:f,skewY:0}),l.setPositionByOrigin(new it(p,m),T,T),t.clipPath=l}else delete t.clipPath}}const Ao=t=>gs.test(So(t));async function jo(t,e){let{crossOrigin:s,signal:r}=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};if(r&&r.aborted)return i("log",new n("parseSVGDocument")),{objects:[],elements:[],options:{},allElements:[]};const o=t.documentElement;!function(t){const e=To(t,["use","svg:use"]),s=["x","y","xlink:href","href","transform"];for(const i of e){const e=i.attributes,r={};for(const t of e)t.value&&(r[t.name]=t.value);const n=(r["xlink:href"]||r.href||"").slice(1);if(""===n)return;const o=t.getElementById(n);if(null===o)return;let a=o.cloneNode(!0);const h=a.attributes,l={};for(const t of h)t.value&&(l[t.name]=t.value);const{x:c=0,y:u=0,transform:d=""}=r,g=`${d} ${l.transform||""} translate(${c}, ${u})`;if(bo(a),/^svg$/i.test(a.nodeName)){const t=a.ownerDocument.createElementNS(hs,"g");Object.entries(l).forEach(e=>{let[s,i]=e;return t.setAttributeNS(hs,s,i)}),t.append(...a.childNodes),a=t}for(const t of e){if(!t)continue;const{name:e,value:i}=t;if(!s.includes(e))if("style"===e){const t={};ir(i,t),Object.entries(l).forEach(e=>{let[s,i]=e;t[s]=i}),ir(l.style||"",t);const s=Object.entries(t).map(t=>t.join(":")).join(";");a.setAttribute(e,s)}else!l[e]&&a.setAttribute(e,i)}a.setAttribute("transform",g),a.setAttribute("instantiated_by_use","1"),a.removeAttribute("id"),i.parentNode.replaceChild(a,i)}}(t);const a=Array.from(o.getElementsByTagName("*")),h={...bo(o),crossOrigin:s,signal:r},l=a.filter(t=>(bo(t),Ao(t)&&!function(t){let e=t;for(;e&&(e=e.parentElement);)if(e&&e.nodeName&&wo.test(So(e))&&!e.getAttribute("instantiated_by_use"))return!0;return!1}(t)));if(!l||l&&!l.length)return{objects:[],elements:[],options:{},allElements:[],options:h,allElements:a};const c={};a.filter(t=>"clipPath"===So(t)).forEach(t=>{t.setAttribute("originalTransform",t.getAttribute("transform")||"");const e=t.getAttribute("id");c[e]=Array.from(t.getElementsByTagName("*")).filter(t=>Ao(t))});const u=new Po(l,h,e,t,c);return{objects:await u.parse(),elements:l,options:h,allElements:a}}function Fo(t,e,s){return jo((new(g().DOMParser)).parseFromString(t.trim(),"text/xml"),e,s)}function Lo(t,e){let s=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};return fetch(t.replace(/^\n\s*/,"").trim(),{signal:s.signal}).then(t=>{if(!t.ok)throw new r(`HTTP error! status: ${t.status}`);return t.text()}).then(t=>Fo(t,e,s)).catch(()=>({objects:[],elements:[],options:{},allElements:[]}))}const Ro=B,Io=t=>function(e,s,i){const{points:r,pathOffset:n}=i;return new it(r[t]).subtract(n).transform(bt(i.getViewportTransform(),i.calcTransformMatrix()))},Bo=(t,e,s,i)=>{const{target:r,pointIndex:n}=e,o=r,a=ue(new it(s,i),void 0,o.calcOwnMatrix());return o.points[n]=a.add(o.pathOffset),o.setDimensions(),o.set("dirty",!0),!0},$o=(t,e)=>function(s,i,r,n){const o=i.target,a=new it(o.points[(t>0?t:o.points.length)-1]),h=a.subtract(o.pathOffset).transform(o.calcOwnMatrix()),l=e(s,{...i,pointIndex:t},r,n),c=a.subtract(o.pathOffset).transform(o.calcOwnMatrix()).subtract(h);return o.left-=c.x,o.top-=c.y,l},Xo=t=>Ws(Ro,$o(t,Bo));const Yo=(t,e,s)=>{const{path:i,pathOffset:r}=t,n=i[e];return new it(n[s]-r.x,n[s+1]-r.y).transform(bt(t.getViewportTransform(),t.calcTransformMatrix()))};function Wo(t,e,s){const{commandIndex:i,pointIndex:r}=this;return Yo(s,i,r)}function Vo(t,e,s,i){const{target:r}=e,{commandIndex:n,pointIndex:o}=this,a=((t,e,s,i,r)=>{const{path:n,pathOffset:o}=t,a=n[(i>0?i:n.length)-1],h=new it(a[r],a[r+1]),l=h.subtract(o).transform(t.calcOwnMatrix()),c=ue(new it(e,s),void 0,t.calcOwnMatrix());n[i][r]=c.x+o.x,n[i][r+1]=c.y+o.y,t.setDimensions();const u=h.subtract(t.pathOffset).transform(t.calcOwnMatrix()).subtract(l);return t.left-=u.x,t.top-=u.y,t.set("dirty",!0),!0})(r,s,i,n,o);return fe(this.actionName,{...je(t,e,s,i),commandIndex:n,pointIndex:o}),a}class Go extends Ns{constructor(t){super(t)}render(t,e,s,i,r){const n={...i,cornerColor:this.controlFill,cornerStrokeColor:this.controlStroke,transparentCorners:!this.controlFill};super.render(t,e,s,n,r)}}class zo extends Go{constructor(t){super(t)}render(t,e,s,i,r){const{path:n}=r,{commandIndex:o,pointIndex:a,connectToCommandIndex:h,connectToPointIndex:l}=this;t.save(),t.strokeStyle=this.controlStroke,this.connectionDashArray&&t.setLineDash(this.connectionDashArray);const[c]=n[o],u=Yo(r,h,l);if("Q"===c){const i=Yo(r,o,a+2);t.moveTo(i.x,i.y),t.lineTo(e,s)}else t.moveTo(e,s);t.lineTo(u.x,u.y),t.stroke(),t.restore(),super.render(t,e,s,i,r)}}const Ho=(t,e,s,i,r,n)=>new(s?zo:Go)({commandIndex:t,pointIndex:e,actionName:"modifyPath",positionHandler:Wo,actionHandler:Vo,connectToCommandIndex:r,connectToPointIndex:n,...i,...s?i.controlPointStyle:i.pointStyle});var No=Object.freeze({__proto__:null,changeWidth:Gs,createObjectDefaultControls:pi,createPathControls:function(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};const s={};let i="M";return t.path.forEach((t,r)=>{const n=t[0];switch("Z"!==n&&(s[`c_${r}_${n}`]=Ho(r,t.length-2,!1,e)),n){case"C":s[`c_${r}_C_CP_1`]=Ho(r,1,!0,e,r-1,(t=>"C"===t?5:"Q"===t?3:1)(i)),s[`c_${r}_C_CP_2`]=Ho(r,3,!0,e,r,5);break;case"Q":s[`c_${r}_Q_CP_1`]=Ho(r,1,!0,e,r,3)}i=n}),s},createPolyActionHandler:Xo,createPolyControls:function(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};const s={};for(let i=0;i<("number"==typeof t?t:t.points.length);i++)s[`p${i}`]=new Ns({actionName:Ro,positionHandler:Io(i),actionHandler:Xo(i),...e});return s},createPolyPositionHandler:Io,createResizeControls:mi,createTextboxDefaultControls:vi,dragHandler:Re,factoryPolyActionHandler:$o,getLocalPoint:Le,polyActionHandler:Bo,renderCircleControl:zs,renderSquareControl:Hs,rotationStyleHandler:Us,rotationWithSnapping:qs,scaleCursorStyleHandler:Zs,scaleOrSkewActionName:ui,scaleSkewCursorStyleHandler:di,scalingEqually:ei,scalingX:si,scalingXOrSkewingY:gi,scalingY:ii,scalingYOrSkewingX:fi,skewCursorStyleHandler:oi,skewHandlerX:hi,skewHandlerY:li,wrapWithFireEvent:Ws,wrapWithFixedAnchor:Vs});const Uo=t=>void 0!==t.webgl,qo=(t,e)=>{const s=ft({width:t,height:e}),i=dt().getContext("webgl"),r={imageBuffer:new ArrayBuffer(t*e*4)},n={destinationWidth:t,destinationHeight:e,targetCanvas:s};let o;o=g().performance.now(),po.prototype.copyGLTo2D.call(r,i,n);const a=g().performance.now()-o;o=g().performance.now(),po.prototype.copyGLTo2DPutImageData.call(r,i,n);return a>g().performance.now()-o},Ko="precision highp float",Jo=`\n ${Ko};\n varying vec2 vTexCoord;\n uniform sampler2D uTexture;\n void main() {\n gl_FragColor = texture2D(uTexture, vTexCoord);\n }`,Qo=new RegExp(Ko,"g");class Zo{get type(){return this.constructor.type}constructor(){let{type:t,...e}=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};Object.assign(this,this.constructor.defaults,e)}getFragmentSource(){return Jo}getVertexSource(){return"\n attribute vec2 aPosition;\n varying vec2 vTexCoord;\n void main() {\n vTexCoord = aPosition;\n gl_Position = vec4(aPosition * 2.0 - 1.0, 0.0, 1.0);\n }"}createProgram(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:this.getFragmentSource(),s=arguments.length>2&&void 0!==arguments[2]?arguments[2]:this.getVertexSource();const{WebGLProbe:{GLPrecision:i="highp"}}=u();"highp"!==i&&(e=e.replace(Qo,Ko.replace("highp",i)));const n=t.createShader(t.VERTEX_SHADER),o=t.createShader(t.FRAGMENT_SHADER),a=t.createProgram();if(!n||!o||!a)throw new r("Vertex, fragment shader or program creation error");if(t.shaderSource(n,s),t.compileShader(n),!t.getShaderParameter(n,t.COMPILE_STATUS))throw new r(`Vertex shader compile error for ${this.type}: ${t.getShaderInfoLog(n)}`);if(t.shaderSource(o,e),t.compileShader(o),!t.getShaderParameter(o,t.COMPILE_STATUS))throw new r(`Fragment shader compile error for ${this.type}: ${t.getShaderInfoLog(o)}`);if(t.attachShader(a,n),t.attachShader(a,o),t.linkProgram(a),!t.getProgramParameter(a,t.LINK_STATUS))throw new r(`Shader link error for "${this.type}" ${t.getProgramInfoLog(a)}`);const h=this.getUniformLocations(t,a)||{};return h.uStepW=t.getUniformLocation(a,"uStepW"),h.uStepH=t.getUniformLocation(a,"uStepH"),{program:a,attributeLocations:this.getAttributeLocations(t,a),uniformLocations:h}}getAttributeLocations(t,e){return{aPosition:t.getAttribLocation(e,"aPosition")}}getUniformLocations(t,e){const s=this.constructor.uniformLocations,i={};for(let r=0;r1){const s=t.destinationWidth,i=t.destinationHeight;t.sourceWidth===s&&t.sourceHeight===i||(e.deleteTexture(t.targetTexture),t.targetTexture=t.filterBackend.createTexture(e,s,i)),e.framebufferTexture2D(e.FRAMEBUFFER,e.COLOR_ATTACHMENT0,e.TEXTURE_2D,t.targetTexture,0)}else e.bindFramebuffer(e.FRAMEBUFFER,null),e.finish()}_swapTextures(t){t.passes--,t.pass++;const e=t.targetTexture;t.targetTexture=t.sourceTexture,t.sourceTexture=e}isNeutralState(t){return!1}applyTo(t){Uo(t)?(this._setupFrameBuffer(t),this.applyToWebGL(t),this._swapTextures(t)):this.applyTo2d(t)}applyTo2d(t){}getCacheKey(){return this.type}retrieveShader(t){const e=this.getCacheKey();return t.programCache[e]||(t.programCache[e]=this.createProgram(t.context)),t.programCache[e]}applyToWebGL(t){const e=t.context,s=this.retrieveShader(t);0===t.pass&&t.originalTexture?e.bindTexture(e.TEXTURE_2D,t.originalTexture):e.bindTexture(e.TEXTURE_2D,t.sourceTexture),e.useProgram(s.program),this.sendAttributeData(e,s.attributeLocations,t.aPosition),e.uniform1f(s.uniformLocations.uStepW,1/t.sourceWidth),e.uniform1f(s.uniformLocations.uStepH,1/t.sourceHeight),this.sendUniformData(e,s.uniformLocations),e.viewport(0,0,t.destinationWidth,t.destinationHeight),e.drawArrays(e.TRIANGLE_STRIP,0,4)}bindAdditionalTexture(t,e,s){t.activeTexture(s),t.bindTexture(t.TEXTURE_2D,e),t.activeTexture(t.TEXTURE0)}unbindAdditionalTexture(t,e){t.activeTexture(e),t.bindTexture(t.TEXTURE_2D,null),t.activeTexture(t.TEXTURE0)}sendUniformData(t,e){}createHelpLayer(t){if(!t.helpLayer){const{sourceWidth:e,sourceHeight:s}=t,i=ft({width:e,height:s});t.helpLayer=i}}toObject(){const t=Object.keys(this.constructor.defaults||{});return{type:this.type,...t.reduce((t,e)=>(t[e]=this[e],t),{})}}toJSON(){return this.toObject()}static async fromObject(t,e){let{type:s,...i}=t;return new this(i)}}t(Zo,"type","BaseFilter"),t(Zo,"uniformLocations",[]);const ta={multiply:"gl_FragColor.rgb *= uColor.rgb;\n",screen:"gl_FragColor.rgb = 1.0 - (1.0 - gl_FragColor.rgb) * (1.0 - uColor.rgb);\n",add:"gl_FragColor.rgb += uColor.rgb;\n",difference:"gl_FragColor.rgb = abs(gl_FragColor.rgb - uColor.rgb);\n",subtract:"gl_FragColor.rgb -= uColor.rgb;\n",lighten:"gl_FragColor.rgb = max(gl_FragColor.rgb, uColor.rgb);\n",darken:"gl_FragColor.rgb = min(gl_FragColor.rgb, uColor.rgb);\n",exclusion:"gl_FragColor.rgb += uColor.rgb - 2.0 * (uColor.rgb * gl_FragColor.rgb);\n",overlay:"\n if (uColor.r < 0.5) {\n gl_FragColor.r *= 2.0 * uColor.r;\n } else {\n gl_FragColor.r = 1.0 - 2.0 * (1.0 - gl_FragColor.r) * (1.0 - uColor.r);\n }\n if (uColor.g < 0.5) {\n gl_FragColor.g *= 2.0 * uColor.g;\n } else {\n gl_FragColor.g = 1.0 - 2.0 * (1.0 - gl_FragColor.g) * (1.0 - uColor.g);\n }\n if (uColor.b < 0.5) {\n gl_FragColor.b *= 2.0 * uColor.b;\n } else {\n gl_FragColor.b = 1.0 - 2.0 * (1.0 - gl_FragColor.b) * (1.0 - uColor.b);\n }\n ",tint:"\n gl_FragColor.rgb *= (1.0 - uColor.a);\n gl_FragColor.rgb += uColor.rgb;\n "};class ea extends Zo{getCacheKey(){return`${this.type}_${this.mode}`}getFragmentSource(){return`\n precision highp float;\n uniform sampler2D uTexture;\n uniform vec4 uColor;\n varying vec2 vTexCoord;\n void main() {\n vec4 color = texture2D(uTexture, vTexCoord);\n gl_FragColor = color;\n if (color.a > 0.0) {\n ${ta[this.mode]}\n }\n }\n `}applyTo2d(t){let{imageData:{data:e}}=t;const s=new Ve(this.color).getSource(),i=this.alpha,r=s[0]*i,n=s[1]*i,o=s[2]*i,a=1-i;for(let t=0;tnew this({...r,image:t}))}}t(ia,"type","BlendImage"),t(ia,"defaults",{mode:"multiply",alpha:1}),t(ia,"uniformLocations",["uTransformMatrix","uImage"]),J.setClass(ia);class ra extends Zo{getFragmentSource(){return"\n precision highp float;\n uniform sampler2D uTexture;\n uniform vec2 uDelta;\n varying vec2 vTexCoord;\n const float nSamples = 15.0;\n vec3 v3offset = vec3(12.9898, 78.233, 151.7182);\n float random(vec3 scale) {\n /* use the fragment position for a different seed per-pixel */\n return fract(sin(dot(gl_FragCoord.xyz, scale)) * 43758.5453);\n }\n void main() {\n vec4 color = vec4(0.0);\n float totalC = 0.0;\n float totalA = 0.0;\n float offset = random(v3offset);\n for (float t = -nSamples; t <= nSamples; t++) {\n float percent = (t + offset - 0.5) / nSamples;\n vec4 sample = texture2D(uTexture, vTexCoord + uDelta * percent);\n float weight = 1.0 - abs(percent);\n float alpha = weight * sample.a;\n color.rgb += sample.rgb * alpha;\n color.a += alpha;\n totalA += weight;\n totalC += alpha;\n }\n gl_FragColor.rgb = color.rgb / totalC;\n gl_FragColor.a = color.a / totalA;\n }\n "}applyTo(t){Uo(t)?(this.aspectRatio=t.sourceWidth/t.sourceHeight,t.passes++,this._setupFrameBuffer(t),this.horizontal=!0,this.applyToWebGL(t),this._swapTextures(t),this._setupFrameBuffer(t),this.horizontal=!1,this.applyToWebGL(t),this._swapTextures(t)):this.applyTo2d(t)}applyTo2d(t){let{imageData:{data:e,width:s,height:i}}=t;this.aspectRatio=s/i,this.horizontal=!0;let r=this.getBlurValue()*s;const n=new Uint8ClampedArray(e),o=15,a=4*s;for(let t=0;td&&(p=d);const m=e[p+3]*f;s+=e[p]*m,i+=e[p+1]*m,h+=e[p+2]*m,l+=m,c+=f}n[t]=s/l,n[t+1]=i/l,n[t+2]=h/l,n[t+3]=l/c}this.horizontal=!1,r=this.getBlurValue()*i;for(let t=0;td&&(m=d);const v=n[m+3]*p;s+=n[m]*v,i+=n[m+1]*v,h+=n[m+2]*v,l+=v,c+=p}e[t]=s/l,e[t+1]=i/l,e[t+2]=h/l,e[t+3]=l/c}}sendUniformData(t,e){const s=this.chooseRightDelta();t.uniform2fv(e.uDelta,s)}isNeutralState(){return 0===this.blur}getBlurValue(){let t=1;const{horizontal:e,aspectRatio:s}=this;return e?s>1&&(t=1/s):s<1&&(t=s),t*this.blur*.12}chooseRightDelta(){const t=this.getBlurValue();return this.horizontal?[t,0]:[0,t]}}t(ra,"type","Blur"),t(ra,"defaults",{blur:0}),t(ra,"uniformLocations",["uDelta"]),J.setClass(ra);class na extends Zo{getFragmentSource(){return"\n precision highp float;\n uniform sampler2D uTexture;\n uniform float uBrightness;\n varying vec2 vTexCoord;\n void main() {\n vec4 color = texture2D(uTexture, vTexCoord);\n color.rgb += uBrightness;\n gl_FragColor = color;\n }\n"}applyTo2d(t){let{imageData:{data:e}}=t;const s=Math.round(255*this.brightness);for(let t=0;t0&&void 0!==arguments[0]?arguments[0]:{};super(t),this.subFilters=t.subFilters||[]}applyTo(t){Uo(t)&&(t.passes+=this.subFilters.length-1),this.subFilters.forEach(e=>{e.applyTo(t)})}toObject(){return{type:this.type,subFilters:this.subFilters.map(t=>t.toObject())}}isNeutralState(){return!this.subFilters.some(t=>!t.isNeutralState())}static fromObject(t,e){return Promise.all((t.subFilters||[]).map(t=>J.getClass(t.type).fromObject(t,e))).then(t=>new this({subFilters:t}))}}t(ma,"type","Composed"),J.setClass(ma);class va extends Zo{getFragmentSource(){return"\n precision highp float;\n uniform sampler2D uTexture;\n uniform float uContrast;\n varying vec2 vTexCoord;\n void main() {\n vec4 color = texture2D(uTexture, vTexCoord);\n float contrastF = 1.015 * (uContrast + 1.0) / (1.0 * (1.015 - uContrast));\n color.rgb = contrastF * (color.rgb - 0.5) + 0.5;\n gl_FragColor = color;\n }"}isNeutralState(){return 0===this.contrast}applyTo2d(t){let{imageData:{data:e}}=t;const s=Math.floor(255*this.contrast),i=259*(s+255)/(255*(259-s));for(let t=0;t=a||m<0||m>=o||(y=4*(v*o+m),_=i[S*r+b],u+=s[y]*_,d+=s[y+1]*_,g+=s[y+2]*_,c||(f+=s[y+3]*_));l[p]=u,l[p+1]=d,l[p+2]=g,l[p+3]=c?s[p+3]:f}t.imageData=h}sendUniformData(t,e){t.uniform1fv(e.uMatrix,this.matrix)}toObject(){return{...super.toObject(),opaque:this.opaque,matrix:[...this.matrix]}}}t(_a,"type","Convolute"),t(_a,"defaults",{opaque:!1,matrix:[0,0,0,0,1,0,0,0,0]}),t(_a,"uniformLocations",["uMatrix","uOpaque","uHalfSize","uSize"]),J.setClass(_a);const xa="Gamma";class Ca extends Zo{getFragmentSource(){return"\n precision highp float;\n uniform sampler2D uTexture;\n uniform vec3 uGamma;\n varying vec2 vTexCoord;\n void main() {\n vec4 color = texture2D(uTexture, vTexCoord);\n vec3 correction = (1.0 / uGamma);\n color.r = pow(color.r, correction.r);\n color.g = pow(color.g, correction.g);\n color.b = pow(color.b, correction.b);\n gl_FragColor = color;\n gl_FragColor.rgb *= color.a;\n }\n"}constructor(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};super(t),this.gamma=t.gamma||this.constructor.defaults.gamma.concat()}applyTo2d(t){let{imageData:{data:e}}=t;const s=this.gamma,i=1/s[0],r=1/s[1],n=1/s[2];this.rgbValues||(this.rgbValues={r:new Uint8Array(256),g:new Uint8Array(256),b:new Uint8Array(256)});const o=this.rgbValues;for(let t=0;t<256;t++)o.r[t]=255*Math.pow(t/255,i),o.g[t]=255*Math.pow(t/255,r),o.b[t]=255*Math.pow(t/255,n);for(let t=0;tr[0]&&i>r[1]&&o>r[2]&&s`\n color += texture2D(uTexture, vTexCoord + ${t}) * uTaps[${e}] + texture2D(uTexture, vTexCoord - ${t}) * uTaps[${e}];\n sum += 2.0 * uTaps[${e}];\n `).join("\n")}\n gl_FragColor = color / sum;\n }\n `}applyToForWebgl(t){t.passes++,this.width=t.sourceWidth,this.horizontal=!0,this.dW=Math.round(this.width*this.scaleX),this.dH=t.sourceHeight,this.tempScale=this.dW/this.width,this.taps=this.getTaps(),t.destinationWidth=this.dW,super.applyTo(t),t.sourceWidth=t.destinationWidth,this.height=t.sourceHeight,this.horizontal=!1,this.dH=Math.round(this.height*this.scaleY),this.tempScale=this.dH/this.height,this.taps=this.getTaps(),t.destinationHeight=this.dH,super.applyTo(t),t.sourceHeight=t.destinationHeight}applyTo(t){Uo(t)?this.applyToForWebgl(t):this.applyTo2d(t)}isNeutralState(){return 1===this.scaleX&&1===this.scaleY}lanczosCreate(t){return e=>{if(e>=t||e<=-t)return 0;if(e<1.1920929e-7&&e>-1.1920929e-7)return 1;const s=(e*=Math.PI)/t;return Math.sin(e)/e*Math.sin(s)/s}}applyTo2d(t){const e=t.imageData,s=this.scaleX,i=this.scaleY;this.rcpScaleX=1/s,this.rcpScaleY=1/i;const r=e.width,n=e.height,o=Math.round(r*s),a=Math.round(n*i);let h;h="sliceHack"===this.resizeType?this.sliceByTwo(t,r,n,o,a):"hermite"===this.resizeType?this.hermiteFastResize(t,r,n,o,a):"bilinear"===this.resizeType?this.bilinearFiltering(t,r,n,o,a):"lanczos"===this.resizeType?this.lanczosResize(t,r,n,o,a):new ImageData(o,a),t.imageData=h}sliceByTwo(t,e,s,i,r){const n=t.imageData,o=.5;let a=!1,h=!1,l=e*o,c=s*o;const u=t.filterBackend.resources;let d=0,g=0;const f=e;let p=0;u.sliceByTwo||(u.sliceByTwo=dt());const m=u.sliceByTwo;(m.width<1.5*e||m.height=e)){D=Math.floor(1e3*Math.abs(x-m.x)),p[D]||(p[D]={});for(let t=v.y-f;t<=v.y+f;t++)t<0||t>=s||(M=Math.floor(1e3*Math.abs(t-m.y)),p[D][M]||(p[D][M]=h(Math.sqrt(Math.pow(D*u,2)+Math.pow(M*d,2))/1e3)),C=p[D][M],C>0&&(b=4*(t*e+x),S+=C,w+=C*n[b],T+=C*n[b+1],O+=C*n[b+2],k+=C*n[b+3]))}b=4*(_*i+y),a[b]=w/S,a[b+1]=T/S,a[b+2]=O/S,a[b+3]=k/S}return++y1&&n<-1||(c=2*n*n*n-3*n*n+1,c>0&&(s=4*(t+i*e),v+=c*l[s+3],g+=c,l[s+3]<255&&(c=c*l[s+3]/250),f+=c*l[s],p+=c*l[s+1],m+=c*l[s+2],d+=c))}}u[r]=f/d,u[r+1]=p/d,u[r+2]=m/d,u[r+3]=v/g}return c}}t(Ea,"type","Resize"),t(Ea,"defaults",{resizeType:"hermite",scaleX:1,scaleY:1,lanczosLobes:3}),t(Ea,"uniformLocations",["uDelta","uTaps"]),J.setClass(Ea);class Pa extends Zo{getFragmentSource(){return"\n precision highp float;\n uniform sampler2D uTexture;\n uniform float uSaturation;\n varying vec2 vTexCoord;\n void main() {\n vec4 color = texture2D(uTexture, vTexCoord);\n float rgMax = max(color.r, color.g);\n float rgbMax = max(rgMax, color.b);\n color.r += rgbMax != color.r ? (rgbMax - color.r) * uSaturation : 0.00;\n color.g += rgbMax != color.g ? (rgbMax - color.g) * uSaturation : 0.00;\n color.b += rgbMax != color.b ? (rgbMax - color.b) * uSaturation : 0.00;\n gl_FragColor = color;\n }\n"}applyTo2d(t){let{imageData:{data:e}}=t;const s=-this.saturation;for(let t=0;t;\n\nclass BaseConfiguration {\n /**\n * Browser-specific constant to adjust CanvasRenderingContext2D.shadowBlur value,\n * which is unitless and not rendered equally across browsers.\n *\n * Values that work quite well (as of October 2017) are:\n * - Chrome: 1.5\n * - Edge: 1.75\n * - Firefox: 0.9\n * - Safari: 0.95\n *\n * @since 2.0.0\n * @type Number\n * @default 1\n */\n browserShadowBlurConstant = 1;\n\n /**\n * Pixel per Inch as a default value set to 96. Can be changed for more realistic conversion.\n */\n DPI = 96;\n\n /**\n * Device Pixel Ratio\n * @see https://developer.apple.com/library/safari/documentation/AudioVideo/Conceptual/HTML-canvas-guide/SettingUptheCanvas/SettingUptheCanvas.html\n */\n devicePixelRatio =\n typeof window !== 'undefined' ? window.devicePixelRatio : 1; // eslint-disable-line no-restricted-globals\n\n /**\n * Pixel limit for cache canvases. 1Mpx , 4Mpx should be fine.\n * @since 1.7.14\n * @type Number\n */\n perfLimitSizeTotal = 2097152;\n\n /**\n * Pixel limit for cache canvases width or height. IE fixes the maximum at 5000\n * @since 1.7.14\n * @type Number\n */\n maxCacheSideLimit = 4096;\n\n /**\n * Lowest pixel limit for cache canvases, set at 256PX\n * @since 1.7.14\n * @type Number\n */\n minCacheSideLimit = 256;\n\n /**\n * When 'true', style information is not retained when copy/pasting text, making\n * pasted text use destination style.\n * Defaults to 'false'.\n * @type Boolean\n * @deprecated\n */\n disableStyleCopyPaste = false;\n\n /**\n * Enable webgl for filtering picture is available\n * A filtering backend will be initialized, this will both take memory and\n * time since a default 2048x2048 canvas will be created for the gl context\n * @since 2.0.0\n * @type Boolean\n */\n enableGLFiltering = true;\n\n /**\n * if webgl is enabled and available, textureSize will determine the size\n * of the canvas backend\n *\n * In order to support old hardware set to `2048` to avoid OOM\n *\n * @since 2.0.0\n * @type Number\n */\n textureSize = 4096;\n\n /**\n * Skip performance testing of setupGLContext and force the use of putImageData that seems to be the one that works best on\n * Chrome + old hardware. if your users are experiencing empty images after filtering you may try to force this to true\n * this has to be set before instantiating the filtering backend ( before filtering the first image )\n * @type Boolean\n * @default false\n */\n forceGLPutImageData = false;\n\n /**\n * If disabled boundsOfCurveCache is not used. For apps that make heavy usage of pencil drawing probably disabling it is better\n * With the standard behaviour of fabric to translate all curves in absolute commands and by not subtracting the starting point from\n * the curve is very hard to hit any cache.\n * Enable only if you know why it could be useful.\n * Candidate for removal/simplification\n * @default false\n */\n cachesBoundsOfCurve = false;\n\n /**\n * Map of font files\n * Map of font files\n */\n fontPaths: Record = {};\n\n /**\n * Defines the number of fraction digits to use when serializing object values.\n * Used in exporting methods (`toObject`, `toJSON`, `toSVG`)\n * You can use it to increase/decrease precision of such values like left, top, scaleX, scaleY, etc.\n */\n NUM_FRACTION_DIGITS = 4;\n}\n\nexport class Configuration extends BaseConfiguration {\n constructor(config?: TConfiguration) {\n super();\n this.configure(config);\n }\n\n configure(config: TConfiguration = {}) {\n Object.assign(this, config);\n }\n\n /**\n * Map of font files\n */\n addFonts(\n paths: Record = {},\n ) {\n this.fontPaths = {\n ...this.fontPaths,\n ...paths,\n };\n }\n\n removeFonts(fontFamilys: string[] = []) {\n fontFamilys.forEach((fontFamily) => {\n delete this.fontPaths[fontFamily];\n });\n }\n\n clearFonts() {\n this.fontPaths = {};\n }\n\n restoreDefaults(keys?: (keyof T)[]) {\n const defaults = new BaseConfiguration() as T;\n const config =\n keys?.reduce((acc, key) => {\n acc[key] = defaults[key];\n return acc;\n }, {} as T) || defaults;\n this.configure(config);\n }\n}\n\nexport const config = new Configuration();\n","export const log = (\n severity: 'log' | 'warn' | 'error',\n ...optionalParams: any[]\n) =>\n // eslint-disable-next-line no-restricted-syntax\n console[severity]('fabric', ...optionalParams);\n\nexport class FabricError extends Error {\n constructor(message?: string, options?: ErrorOptions) {\n super(`fabric: ${message}`, options);\n }\n}\n\nexport class SignalAbortedError extends FabricError {\n constructor(context: string) {\n super(`${context} 'options.signal' is in 'aborted' state`);\n }\n}\n","export type GLPrecision = 'lowp' | 'mediump' | 'highp';\n\nexport abstract class GLProbe {\n declare GLPrecision: GLPrecision | undefined;\n abstract queryWebGL(canvas: HTMLCanvasElement): void;\n abstract isSupported(textureSize: number): boolean;\n}\n","import { log } from '../../util/internals/console';\nimport { GLProbe } from './GLProbe';\nimport type { GLPrecision } from './GLProbe';\n\n/**\n * Lazy initialize WebGL constants\n */\nexport class WebGLProbe extends GLProbe {\n declare maxTextureSize?: number;\n\n /**\n * Tests if webgl supports certain precision\n * @param {WebGL} Canvas WebGL context to test on\n * @param {GLPrecision} Precision to test can be any of following\n * @returns {Boolean} Whether the user's browser WebGL supports given precision.\n */\n private testPrecision(\n gl: WebGLRenderingContext,\n precision: GLPrecision,\n ): boolean {\n const fragmentSource = `precision ${precision} float;\\nvoid main(){}`;\n const fragmentShader = gl.createShader(gl.FRAGMENT_SHADER);\n if (!fragmentShader) {\n return false;\n }\n gl.shaderSource(fragmentShader, fragmentSource);\n gl.compileShader(fragmentShader);\n return !!gl.getShaderParameter(fragmentShader, gl.COMPILE_STATUS);\n }\n\n /**\n * query browser for WebGL\n */\n queryWebGL(canvas: HTMLCanvasElement) {\n const gl = canvas.getContext('webgl');\n if (gl) {\n this.maxTextureSize = gl.getParameter(gl.MAX_TEXTURE_SIZE);\n this.GLPrecision = (['highp', 'mediump', 'lowp'] as const).find(\n (precision) => this.testPrecision(gl, precision),\n );\n gl.getExtension('WEBGL_lose_context')!.loseContext();\n log('log', `WebGL: max texture size ${this.maxTextureSize}`);\n }\n }\n\n isSupported(textureSize: number) {\n return !!this.maxTextureSize && this.maxTextureSize >= textureSize;\n }\n}\n","/* eslint-disable no-restricted-globals */\nimport { WebGLProbe } from '../filters/GLProbes/WebGLProbe';\nimport type { TCopyPasteData, TFabricEnv } from './types';\n\nconst copyPasteData: TCopyPasteData = {};\n\nexport const getEnv = (): TFabricEnv => {\n return {\n document,\n window,\n isTouchSupported:\n 'ontouchstart' in window ||\n 'ontouchstart' in document ||\n (window && window.navigator && window.navigator.maxTouchPoints > 0),\n WebGLProbe: new WebGLProbe(),\n dispose() {\n // noop\n },\n copyPasteData,\n };\n};\n","/**\n * This file is consumed by fabric.\n * The `./node` and `./browser` files define the env variable that is used by this module.\n * The `./browser` module is defined to be the default env and doesn't set the env at all.\n * This is done in order to support isomorphic usage for browser and node applications\n * since window and document aren't defined at time of import in SSR, we can't set env so we avoid it by deferring to the default env.\n */\n\nimport { config } from '../config';\nimport { getEnv as getBrowserEnv } from './browser';\nimport type { TFabricEnv } from './types';\nimport type { DOMWindow } from 'jsdom';\n\nlet env: TFabricEnv;\n\n/**\n * Sets the environment variables used by fabric.\\\n * This is exposed for special cases, such as configuring a test environment, and should be used with care.\n *\n * **CAUTION**: Must be called before using the package.\n *\n * @example\n * Passing `window` and `document` objects to fabric (in case they are mocked or something)\n * import { getEnv, setEnv } from 'fabric';\n * // we want fabric to use the `window` and `document` objects exposed by the environment we are running in.\n * setEnv({ ...getEnv(), window, document });\n * // done with setup, using fabric is now safe\n */\nexport const setEnv = (value: TFabricEnv) => {\n env = value;\n};\n\n/**\n * In order to support SSR we **MUST** access the browser env only after the window has loaded\n */\nexport const getEnv = () => env || (env = getBrowserEnv());\n\nexport const getFabricDocument = (): Document => getEnv().document;\n\nexport const getFabricWindow = (): (Window & typeof globalThis) | DOMWindow =>\n getEnv().window;\n\n/**\n * @returns the config value if defined, fallbacks to the environment value\n */\nexport const getDevicePixelRatio = () =>\n Math.max(config.devicePixelRatio ?? getFabricWindow().devicePixelRatio, 1);\n","import { config } from './config';\nimport type { TRectBounds } from './typedefs';\n\nexport class Cache {\n /**\n * Cache of widths of chars in text rendering.\n */\n charWidthsCache: Record<\n /** fontFamily */ string,\n Record<\n /** fontStyleCacheKey */ string,\n Record\n >\n > = {};\n\n /**\n * @return {Object} reference to cache\n */\n getFontCache({\n fontFamily,\n fontStyle,\n fontWeight,\n }: {\n fontFamily: string;\n fontStyle: string;\n fontWeight: string | number;\n }) {\n fontFamily = fontFamily.toLowerCase();\n if (!this.charWidthsCache[fontFamily]) {\n this.charWidthsCache[fontFamily] = {};\n }\n const fontCache = this.charWidthsCache[fontFamily];\n const cacheKey = `${fontStyle.toLowerCase()}_${(\n fontWeight + ''\n ).toLowerCase()}`;\n if (!fontCache[cacheKey]) {\n fontCache[cacheKey] = {};\n }\n return fontCache[cacheKey];\n }\n\n /**\n * Clear char widths cache for the given font family or all the cache if no\n * fontFamily is specified.\n * Use it if you know you are loading fonts in a lazy way and you are not waiting\n * for custom fonts to load properly when adding text objects to the canvas.\n * If a text object is added when its own font is not loaded yet, you will get wrong\n * measurement and so wrong bounding boxes.\n * After the font cache is cleared, either change the textObject text content or call\n * initDimensions() to trigger a recalculation\n * @param {String} [fontFamily] font family to clear\n */\n clearFontCache(fontFamily?: string) {\n fontFamily = (fontFamily || '').toLowerCase();\n if (!fontFamily) {\n this.charWidthsCache = {};\n } else if (this.charWidthsCache[fontFamily]) {\n delete this.charWidthsCache[fontFamily];\n }\n }\n\n /**\n * Given current aspect ratio, determines the max width and height that can\n * respect the total allowed area for the cache.\n * @param {number} ar aspect ratio\n * @return {number[]} Limited dimensions X and Y\n */\n limitDimsByArea(ar: number) {\n const { perfLimitSizeTotal } = config;\n const roughWidth = Math.sqrt(perfLimitSizeTotal * ar);\n // we are not returning a point on purpose, to avoid circular dependencies\n // this is an internal utility\n return [\n Math.floor(roughWidth),\n Math.floor(perfLimitSizeTotal / roughWidth),\n ];\n }\n\n /**\n * This object keeps the results of the boundsOfCurve calculation mapped by the joined arguments necessary to calculate it.\n * It does speed up calculation, if you parse and add always the same paths, but in case of heavy usage of freedrawing\n * you do not get any speed benefit and you get a big object in memory.\n * The object was a private variable before, while now is appended to the lib so that you have access to it and you\n * can eventually clear it.\n * It was an internal variable, is accessible since version 2.3.4\n */\n boundsOfCurveCache: Record = {};\n}\n\nexport const cache = new Cache();\n","import type { TMat2D } from './typedefs';\n// use this syntax so babel plugin see this import here\nimport { version } from '../package.json';\n\nexport const VERSION = version;\n// eslint-disable-next-line @typescript-eslint/no-empty-function\nexport function noop() {}\n\nexport const halfPI = Math.PI / 2;\nexport const quarterPI = Math.PI / 4;\nexport const twoMathPi = Math.PI * 2;\nexport const PiBy180 = Math.PI / 180;\n\nexport const iMatrix = Object.freeze([1, 0, 0, 1, 0, 0]) as TMat2D;\nexport const DEFAULT_SVG_FONT_SIZE = 16;\nexport const ALIASING_LIMIT = 2;\n\n/* \"magic number\" for bezier approximations of arcs (http://itc.ktu.lt/itc354/Riskus354.pdf) */\nexport const kRect = 1 - 0.5522847498;\n\nexport const CENTER = 'center';\nexport const LEFT = 'left';\nexport const TOP = 'top';\nexport const BOTTOM = 'bottom';\nexport const RIGHT = 'right';\nexport const NONE = 'none';\n\nexport const reNewline = /\\r?\\n/;\n\nexport const MOVING = 'moving';\nexport const SCALING = 'scaling';\nexport const ROTATING = 'rotating';\nexport const ROTATE = 'rotate';\nexport const SKEWING = 'skewing';\nexport const RESIZING = 'resizing';\nexport const MODIFY_POLY = 'modifyPoly';\nexport const MODIFY_PATH = 'modifyPath';\nexport const CHANGED = 'changed';\nexport const SCALE = 'scale';\nexport const SCALE_X = 'scaleX';\nexport const SCALE_Y = 'scaleY';\nexport const SKEW_X = 'skewX';\nexport const SKEW_Y = 'skewY';\nexport const FILL = 'fill';\nexport const STROKE = 'stroke';\nexport const MODIFIED = 'modified';\n","import { FabricError } from './util/internals/console';\n\n/*\n * This Map connects the objects type value with their\n * class implementation. It used from any object to understand which are\n * the classes to enlive when requesting a object.type = 'path' for example.\n * Objects uses it for clipPath, Canvas uses it for everything.\n * This is necessary for generic code to run and enlive instances from serialized representation.\n * You can customize which classes get enlived from SVG parsing using this classRegistry.\n * The Registry start empty and gets filled in depending which files you import.\n * If you want to be able to parse arbitrary SVGs or JSON representation of canvases, coming from\n * different sources you will need to import all fabric because you may need all classes.\n */\n\nexport const JSON = 'json';\nexport const SVG = 'svg';\n\nexport class ClassRegistry {\n declare [JSON]: Map;\n declare [SVG]: Map;\n\n constructor() {\n this[JSON] = new Map();\n this[SVG] = new Map();\n }\n\n has(classType: string): boolean {\n return this[JSON].has(classType);\n }\n\n getClass(classType: string): T {\n const constructor = this[JSON].get(classType);\n if (!constructor) {\n throw new FabricError(`No class registered for ${classType}`);\n }\n return constructor;\n }\n\n setClass(classConstructor: any, classType?: string) {\n if (classType) {\n this[JSON].set(classType, classConstructor);\n } else {\n this[JSON].set(classConstructor.type, classConstructor);\n // legacy\n // @TODO: needs to be removed in fabric 7 or 8\n this[JSON].set(classConstructor.type.toLowerCase(), classConstructor);\n }\n }\n\n getSVGClass(SVGTagName: string): any {\n return this[SVG].get(SVGTagName);\n }\n\n setSVGClass(classConstructor: any, SVGTagName?: string) {\n this[SVG].set(\n SVGTagName ?? classConstructor.type.toLowerCase(),\n classConstructor,\n );\n }\n}\n\nexport const classRegistry = new ClassRegistry();\n","import type { StaticCanvas } from '../../canvas/StaticCanvas';\nimport type { FabricObject } from '../../shapes/Object/FabricObject';\nimport type { AnimationBase } from './AnimationBase';\n\n/**\n * Array holding all running animations\n */\nclass AnimationRegistry extends Array {\n /**\n * Remove a single animation using an animation context\n * @param {AnimationBase} context\n */\n remove(context: AnimationBase) {\n const index = this.indexOf(context);\n index > -1 && this.splice(index, 1);\n }\n\n /**\n * Cancel all running animations on the next frame\n */\n cancelAll() {\n const animations = this.splice(0);\n animations.forEach((animation) => animation.abort());\n return animations;\n }\n\n /**\n * Cancel all running animations attached to a canvas on the next frame\n * @param {StaticCanvas} canvas\n */\n cancelByCanvas(canvas: StaticCanvas) {\n if (!canvas) {\n return [];\n }\n const animations = this.filter(\n (animation) =>\n animation.target === canvas ||\n (typeof animation.target === 'object' &&\n (animation.target as FabricObject)?.canvas === canvas),\n );\n animations.forEach((animation) => animation.abort());\n return animations;\n }\n\n /**\n * Cancel all running animations for target on the next frame\n * @param target\n */\n cancelByTarget(target: AnimationBase['target']) {\n if (!target) {\n return [];\n }\n const animations = this.filter((animation) => animation.target === target);\n animations.forEach((animation) => animation.abort());\n return animations;\n }\n}\n\nexport const runningAnimations = new AnimationRegistry();\n","export type TEventCallback = (options: T) => any;\n\ntype EventRegistryObject = {\n [K in keyof E]?: TEventCallback;\n};\n\n/**\n * @tutorial {@link http://fabricjs.com/fabric-intro-part-2#events}\n * @see {@link http://fabricjs.com/events|Events demo}\n */\nexport class Observable {\n private __eventListeners: Record =\n {} as Record;\n\n /**\n * Observes specified event\n * @alias on\n * @param {string} eventName Event name (eg. 'after:render')\n * @param {EventRegistryObject} handlers key/value pairs (eg. {'after:render': handler, 'selection:cleared': handler})\n * @param {Function} handler Function that receives a notification when an event of the specified type occurs\n * @return {Function} disposer\n */\n on(\n eventName: K,\n handler: TEventCallback,\n ): VoidFunction;\n on(handlers: EventRegistryObject): VoidFunction;\n on(\n arg0: K | EventRegistryObject,\n handler?: TEventCallback,\n ): VoidFunction {\n if (!this.__eventListeners) {\n this.__eventListeners = {} as Record;\n }\n if (typeof arg0 === 'object') {\n // one object with key/value pairs was passed\n Object.entries(arg0).forEach(([eventName, handler]) => {\n this.on(eventName as K, handler as TEventCallback);\n });\n return () => this.off(arg0);\n } else if (handler) {\n const eventName = arg0;\n if (!this.__eventListeners[eventName]) {\n this.__eventListeners[eventName] = [];\n }\n this.__eventListeners[eventName].push(handler);\n return () => this.off(eventName, handler);\n } else {\n // noop\n return () => false;\n }\n }\n\n /**\n * Observes specified event **once**\n * @alias once\n * @param {string} eventName Event name (eg. 'after:render')\n * @param {EventRegistryObject} handlers key/value pairs (eg. {'after:render': handler, 'selection:cleared': handler})\n * @param {Function} handler Function that receives a notification when an event of the specified type occurs\n * @return {Function} disposer\n */\n once(\n eventName: K,\n handler: TEventCallback,\n ): VoidFunction;\n once(handlers: EventRegistryObject): VoidFunction;\n once(\n arg0: K | EventRegistryObject,\n handler?: TEventCallback,\n ): VoidFunction {\n if (typeof arg0 === 'object') {\n // one object with key/value pairs was passed\n const disposers: VoidFunction[] = [];\n Object.entries(arg0).forEach(([eventName, handler]) => {\n disposers.push(this.once(eventName as K, handler as TEventCallback));\n });\n return () => disposers.forEach((d) => d());\n } else if (handler) {\n const disposer = this.on(\n arg0,\n function onceHandler(this: Observable, ...args) {\n handler.call(this, ...args);\n disposer();\n },\n );\n return disposer;\n } else {\n // noop\n return () => false;\n }\n }\n\n /**\n * @private\n * @param {string} eventName\n * @param {Function} [handler]\n */\n private _removeEventListener(\n eventName: K,\n handler?: TEventCallback,\n ) {\n if (!this.__eventListeners[eventName]) {\n return;\n }\n\n if (handler) {\n const eventListener = this.__eventListeners[eventName];\n const index = eventListener.indexOf(handler);\n index > -1 && eventListener.splice(index, 1);\n } else {\n this.__eventListeners[eventName] = [];\n }\n }\n\n /**\n * Unsubscribe all event listeners for eventname.\n * Do not use this pattern. You could kill internal fabricJS events.\n * We know we should have protected events for internal flows, but we don't have yet\n * @deprecated\n * @param {string} eventName event name (eg. 'after:render')\n */\n off(eventName: K): void;\n /**\n * unsubscribe an event listener\n * @param {string} eventName event name (eg. 'after:render')\n * @param {TEventCallback} handler event listener to unsubscribe\n */\n off(eventName: K, handler: TEventCallback): void;\n /**\n * unsubscribe event listeners\n * @param handlers handlers key/value pairs (eg. {'after:render': handler, 'selection:cleared': handler})\n */\n off(handlers: EventRegistryObject): void;\n /**\n * unsubscribe all event listeners\n */\n off(): void;\n off(\n arg0?: K | EventRegistryObject,\n handler?: TEventCallback,\n ) {\n if (!this.__eventListeners) {\n return;\n }\n\n // remove all key/value pairs (event name -> event handler)\n if (typeof arg0 === 'undefined') {\n for (const eventName in this.__eventListeners) {\n this._removeEventListener(eventName);\n }\n }\n // one object with key/value pairs was passed\n else if (typeof arg0 === 'object') {\n Object.entries(arg0).forEach(([eventName, handler]) => {\n this._removeEventListener(eventName as K, handler as TEventCallback);\n });\n } else {\n this._removeEventListener(arg0, handler);\n }\n }\n\n /**\n * Fires event with an optional options object\n * @param {String} eventName Event name to fire\n * @param {Object} [options] Options object\n */\n fire(eventName: K, options?: EventSpec[K]) {\n if (!this.__eventListeners) {\n return;\n }\n\n const listenersForEvent = this.__eventListeners[eventName]?.concat();\n if (listenersForEvent) {\n for (let i = 0; i < listenersForEvent.length; i++) {\n listenersForEvent[i].call(this, options || {});\n }\n }\n }\n}\n","/**\n * Removes value from an array.\n * Presence of value (and its position in an array) is determined via `Array.prototype.indexOf`\n * @param {Array} array\n * @param {*} value\n * @return {Array} original array\n */\nexport const removeFromArray = (array: T[], value: T): T[] => {\n const idx = array.indexOf(value);\n if (idx !== -1) {\n array.splice(idx, 1);\n }\n return array;\n};\n","import type { TRadian } from '../../typedefs';\nimport { halfPI } from '../../constants';\n\n/**\n * Calculate the cos of an angle, avoiding returning floats for known results\n * This function is here just to avoid getting 0.999999999999999 when dealing\n * with numbers that are really 1 or 0.\n * @param {TRadian} angle the angle\n * @return {Number} the cosin value for angle.\n */\nexport const cos = (angle: TRadian): number => {\n if (angle === 0) {\n return 1;\n }\n const angleSlice = Math.abs(angle) / halfPI;\n switch (angleSlice) {\n case 1:\n case 3:\n return 0;\n case 2:\n return -1;\n }\n return Math.cos(angle);\n};\n","import type { TRadian } from '../../typedefs';\nimport { halfPI } from '../../constants';\n\n/**\n * Calculate the cos of an angle, avoiding returning floats for known results\n * This function is here just to avoid getting 0.999999999999999 when dealing\n * with numbers that are really 1 or 0.\n * @param {TRadian} angle the angle\n * @return {Number} the sin value for angle.\n */\nexport const sin = (angle: TRadian): number => {\n if (angle === 0) {\n return 0;\n }\n const angleSlice = angle / halfPI;\n const value = Math.sign(angle);\n switch (angleSlice) {\n case 1:\n return value;\n case 2:\n return 0;\n case 3:\n return -value;\n }\n return Math.sin(angle);\n};\n","import type { TMat2D, TRadian } from './typedefs';\nimport { cos } from './util/misc/cos';\nimport { sin } from './util/misc/sin';\n\nexport interface XY {\n x: number;\n y: number;\n}\n\n/**\n * Adaptation of work of Kevin Lindsey(kevin@kevlindev.com)\n */\nexport class Point implements XY {\n declare x: number;\n\n declare y: number;\n\n constructor();\n constructor(x: number, y: number);\n constructor(point?: XY);\n constructor(arg0: number | XY = 0, y = 0) {\n if (typeof arg0 === 'object') {\n this.x = arg0.x;\n this.y = arg0.y;\n } else {\n this.x = arg0;\n this.y = y;\n }\n }\n\n /**\n * Adds another point to this one and returns a new one with the sum\n * @param {XY} that\n * @return {Point} new Point instance with added values\n */\n add(that: XY): Point {\n return new Point(this.x + that.x, this.y + that.y);\n }\n\n /**\n * Adds another point to this one\n * @param {XY} that\n * @return {Point} thisArg\n * @chainable\n * @deprecated\n */\n addEquals(that: XY): Point {\n this.x += that.x;\n this.y += that.y;\n return this;\n }\n\n /**\n * Adds value to this point and returns a new one\n * @param {Number} scalar\n * @return {Point} new Point with added value\n */\n scalarAdd(scalar: number): Point {\n return new Point(this.x + scalar, this.y + scalar);\n }\n\n /**\n * Adds value to this point\n * @param {Number} scalar\n * @return {Point} thisArg\n * @chainable\n * @deprecated\n */\n scalarAddEquals(scalar: number): Point {\n this.x += scalar;\n this.y += scalar;\n return this;\n }\n\n /**\n * Subtracts another point from this point and returns a new one\n * @param {XY} that\n * @return {Point} new Point object with subtracted values\n */\n subtract(that: XY): Point {\n return new Point(this.x - that.x, this.y - that.y);\n }\n\n /**\n * Subtracts another point from this point\n * @param {XY} that\n * @return {Point} thisArg\n * @chainable\n * @deprecated\n */\n subtractEquals(that: XY): Point {\n this.x -= that.x;\n this.y -= that.y;\n return this;\n }\n\n /**\n * Subtracts value from this point and returns a new one\n * @param {Number} scalar\n * @return {Point}\n */\n scalarSubtract(scalar: number): Point {\n return new Point(this.x - scalar, this.y - scalar);\n }\n\n /**\n * Subtracts value from this point\n * @param {Number} scalar\n * @return {Point} thisArg\n * @chainable\n * @deprecated\n */\n scalarSubtractEquals(scalar: number): Point {\n this.x -= scalar;\n this.y -= scalar;\n return this;\n }\n\n /**\n * Multiplies this point by another value and returns a new one\n * @param {XY} that\n * @return {Point}\n */\n multiply(that: XY): Point {\n return new Point(this.x * that.x, this.y * that.y);\n }\n\n /**\n * Multiplies this point by a value and returns a new one\n * @param {Number} scalar\n * @return {Point}\n */\n scalarMultiply(scalar: number): Point {\n return new Point(this.x * scalar, this.y * scalar);\n }\n\n /**\n * Multiplies this point by a value\n * @param {Number} scalar\n * @return {Point} thisArg\n * @chainable\n * @deprecated\n */\n scalarMultiplyEquals(scalar: number): Point {\n this.x *= scalar;\n this.y *= scalar;\n return this;\n }\n\n /**\n * Divides this point by another and returns a new one\n * @param {XY} that\n * @return {Point}\n */\n divide(that: XY): Point {\n return new Point(this.x / that.x, this.y / that.y);\n }\n\n /**\n * Divides this point by a value and returns a new one\n * @param {Number} scalar\n * @return {Point}\n */\n scalarDivide(scalar: number): Point {\n return new Point(this.x / scalar, this.y / scalar);\n }\n\n /**\n * Divides this point by a value\n * @param {Number} scalar\n * @return {Point} thisArg\n * @chainable\n * @deprecated\n */\n scalarDivideEquals(scalar: number): Point {\n this.x /= scalar;\n this.y /= scalar;\n return this;\n }\n\n /**\n * Returns true if this point is equal to another one\n * @param {XY} that\n * @return {Boolean}\n */\n eq(that: XY): boolean {\n return this.x === that.x && this.y === that.y;\n }\n\n /**\n * Returns true if this point is less than another one\n * @param {XY} that\n * @return {Boolean}\n */\n lt(that: XY): boolean {\n return this.x < that.x && this.y < that.y;\n }\n\n /**\n * Returns true if this point is less than or equal to another one\n * @param {XY} that\n * @return {Boolean}\n */\n lte(that: XY): boolean {\n return this.x <= that.x && this.y <= that.y;\n }\n\n /**\n\n * Returns true if this point is greater another one\n * @param {XY} that\n * @return {Boolean}\n */\n gt(that: XY): boolean {\n return this.x > that.x && this.y > that.y;\n }\n\n /**\n * Returns true if this point is greater than or equal to another one\n * @param {XY} that\n * @return {Boolean}\n */\n gte(that: XY): boolean {\n return this.x >= that.x && this.y >= that.y;\n }\n\n /**\n * Returns new point which is the result of linear interpolation with this one and another one\n * @param {XY} that\n * @param {Number} t , position of interpolation, between 0 and 1 default 0.5\n * @return {Point}\n */\n lerp(that: XY, t = 0.5): Point {\n t = Math.max(Math.min(1, t), 0);\n return new Point(\n this.x + (that.x - this.x) * t,\n this.y + (that.y - this.y) * t,\n );\n }\n\n /**\n * Returns distance from this point and another one\n * @param {XY} that\n * @return {Number}\n */\n distanceFrom(that: XY): number {\n const dx = this.x - that.x,\n dy = this.y - that.y;\n return Math.sqrt(dx * dx + dy * dy);\n }\n\n /**\n * Returns the point between this point and another one\n * @param {XY} that\n * @return {Point}\n */\n midPointFrom(that: XY): Point {\n return this.lerp(that);\n }\n\n /**\n * Returns a new point which is the min of this and another one\n * @param {XY} that\n * @return {Point}\n */\n min(that: XY): Point {\n return new Point(Math.min(this.x, that.x), Math.min(this.y, that.y));\n }\n\n /**\n * Returns a new point which is the max of this and another one\n * @param {XY} that\n * @return {Point}\n */\n max(that: XY): Point {\n return new Point(Math.max(this.x, that.x), Math.max(this.y, that.y));\n }\n\n /**\n * Returns string representation of this point\n * @return {String}\n */\n toString(): string {\n return `${this.x},${this.y}`;\n }\n\n /**\n * Sets x/y of this point\n * @param {Number} x\n * @param {Number} y\n * @chainable\n */\n setXY(x: number, y: number) {\n this.x = x;\n this.y = y;\n return this;\n }\n\n /**\n * Sets x of this point\n * @param {Number} x\n * @chainable\n */\n setX(x: number) {\n this.x = x;\n return this;\n }\n\n /**\n * Sets y of this point\n * @param {Number} y\n * @chainable\n */\n setY(y: number) {\n this.y = y;\n return this;\n }\n\n /**\n * Sets x/y of this point from another point\n * @param {XY} that\n * @chainable\n */\n setFromPoint(that: XY) {\n this.x = that.x;\n this.y = that.y;\n return this;\n }\n\n /**\n * Swaps x/y of this point and another point\n * @param {XY} that\n */\n swap(that: XY) {\n const x = this.x,\n y = this.y;\n this.x = that.x;\n this.y = that.y;\n that.x = x;\n that.y = y;\n }\n\n /**\n * return a cloned instance of the point\n * @return {Point}\n */\n clone(): Point {\n return new Point(this.x, this.y);\n }\n\n /**\n * Rotates `point` around `origin` with `radians`\n * @param {XY} origin The origin of the rotation\n * @param {TRadian} radians The radians of the angle for the rotation\n * @return {Point} The new rotated point\n */\n rotate(radians: TRadian, origin: XY = ZERO): Point {\n // TODO benchmark and verify the add and subtract how much cost\n // and then in case early return if no origin is passed\n const sinus = sin(radians),\n cosinus = cos(radians);\n const p = this.subtract(origin);\n const rotated = new Point(\n p.x * cosinus - p.y * sinus,\n p.x * sinus + p.y * cosinus,\n );\n return rotated.add(origin);\n }\n\n /**\n * Apply transform t to point p\n * @param {TMat2D} t The transform\n * @param {Boolean} [ignoreOffset] Indicates that the offset should not be applied\n * @return {Point} The transformed point\n */\n transform(t: TMat2D, ignoreOffset = false): Point {\n return new Point(\n t[0] * this.x + t[2] * this.y + (ignoreOffset ? 0 : t[4]),\n t[1] * this.x + t[3] * this.y + (ignoreOffset ? 0 : t[5]),\n );\n }\n}\n\nexport const ZERO = new Point(0, 0);\n","import type { Constructor, TBBox } from './typedefs';\nimport { removeFromArray } from './util/internals/removeFromArray';\nimport { Point } from './Point';\nimport type { ActiveSelection } from './shapes/ActiveSelection';\nimport type { Group } from './shapes/Group';\nimport type { InteractiveFabricObject } from './shapes/Object/InteractiveObject';\nimport type { FabricObject } from './shapes/Object/FabricObject';\n\nexport const isCollection = (\n fabricObject?: FabricObject,\n): fabricObject is Group | ActiveSelection => {\n return !!fabricObject && Array.isArray((fabricObject as Group)._objects);\n};\n\nexport function createCollectionMixin(Base: TBase) {\n class Collection extends Base {\n /**\n * @type {FabricObject[]}\n * @TODO needs to end up in the constructor too\n */\n _objects: FabricObject[] = [];\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n _onObjectAdded(object: FabricObject) {\n // subclasses should override this method\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n _onObjectRemoved(object: FabricObject) {\n // subclasses should override this method\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n _onStackOrderChanged(object: FabricObject) {\n // subclasses should override this method\n }\n\n /**\n * Adds objects to collection\n * Objects should be instances of (or inherit from) FabricObject\n * @param {...FabricObject[]} objects to add\n * @returns {number} new array length\n */\n add(...objects: FabricObject[]): number {\n const size = this._objects.push(...objects);\n objects.forEach((object) => this._onObjectAdded(object));\n return size;\n }\n\n /**\n * Inserts an object into collection at specified index\n * @param {number} index Index to insert object at\n * @param {...FabricObject[]} objects Object(s) to insert\n * @returns {number} new array length\n */\n insertAt(index: number, ...objects: FabricObject[]) {\n this._objects.splice(index, 0, ...objects);\n objects.forEach((object) => this._onObjectAdded(object));\n return this._objects.length;\n }\n\n /**\n * Removes objects from a collection, then renders canvas (if `renderOnAddRemove` is not `false`)\n * @private\n * @param {...FabricObject[]} objects objects to remove\n * @returns {FabricObject[]} removed objects\n */\n remove(...objects: FabricObject[]) {\n const array = this._objects,\n removed: FabricObject[] = [];\n objects.forEach((object) => {\n const index = array.indexOf(object);\n // only call onObjectRemoved if an object was actually removed\n if (index !== -1) {\n array.splice(index, 1);\n removed.push(object);\n this._onObjectRemoved(object);\n }\n });\n return removed;\n }\n\n /**\n * Executes given function for each object in this group\n * A simple shortcut for getObjects().forEach, before es6 was more complicated,\n * now is just a shortcut.\n * @param {Function} callback\n * Callback invoked with current object as first argument,\n * index - as second and an array of all objects - as third.\n */\n forEachObject(\n callback: (\n object: FabricObject,\n index: number,\n array: FabricObject[],\n ) => any,\n ) {\n this.getObjects().forEach((object, index, objects) =>\n callback(object, index, objects),\n );\n }\n\n /**\n * Returns an array of children objects of this instance\n * @param {...String} [types] When specified, only objects of these types are returned\n * @return {Array}\n */\n getObjects(...types: string[]) {\n if (types.length === 0) {\n return [...this._objects];\n }\n return this._objects.filter((o) => o.isType(...types));\n }\n\n /**\n * Returns object at specified index\n * @param {Number} index\n * @return {Object} object at index\n */\n item(index: number) {\n return this._objects[index];\n }\n\n /**\n * Returns true if collection contains no objects\n * @return {Boolean} true if collection is empty\n */\n isEmpty() {\n return this._objects.length === 0;\n }\n\n /**\n * Returns a size of a collection (i.e: length of an array containing its objects)\n * @return {Number} Collection size\n */\n size() {\n return this._objects.length;\n }\n\n /**\n * Returns true if collection contains an object.\\\n * **Prefer using {@link FabricObject#isDescendantOf} for performance reasons**\n * instead of `a.contains(b)` use `b.isDescendantOf(a)`\n * @param {Object} object Object to check against\n * @param {Boolean} [deep=false] `true` to check all descendants, `false` to check only `_objects`\n * @return {Boolean} `true` if collection contains an object\n */\n contains(object: FabricObject, deep?: boolean): boolean {\n if (this._objects.includes(object)) {\n return true;\n } else if (deep) {\n return this._objects.some(\n (obj) =>\n obj instanceof Collection &&\n (obj as unknown as Collection).contains(object, true),\n );\n }\n return false;\n }\n\n /**\n * Returns number representation of a collection complexity\n * @return {Number} complexity\n */\n complexity() {\n return this._objects.reduce((memo, current) => {\n memo += current.complexity ? current.complexity() : 0;\n return memo;\n }, 0);\n }\n\n /**\n * Moves an object or the objects of a multiple selection\n * to the bottom of the stack of drawn objects\n * @param {fabric.Object} object Object to send to back\n * @returns {boolean} true if change occurred\n */\n sendObjectToBack(object: FabricObject) {\n if (!object || object === this._objects[0]) {\n return false;\n }\n removeFromArray(this._objects, object);\n this._objects.unshift(object);\n this._onStackOrderChanged(object);\n return true;\n }\n\n /**\n * Moves an object or the objects of a multiple selection\n * to the top of the stack of drawn objects\n * @param {fabric.Object} object Object to send\n * @returns {boolean} true if change occurred\n */\n bringObjectToFront(object: FabricObject) {\n if (!object || object === this._objects[this._objects.length - 1]) {\n return false;\n }\n removeFromArray(this._objects, object);\n this._objects.push(object);\n this._onStackOrderChanged(object);\n return true;\n }\n\n /**\n * Moves an object or a selection down in stack of drawn objects\n * An optional parameter, `intersecting` allows to move the object in behind\n * the first intersecting object. Where intersection is calculated with\n * bounding box. If no intersection is found, there will not be change in the\n * stack.\n * @param {fabric.Object} object Object to send\n * @param {boolean} [intersecting] If `true`, send object behind next lower intersecting object\n * @returns {boolean} true if change occurred\n */\n sendObjectBackwards(object: FabricObject, intersecting?: boolean) {\n if (!object) {\n return false;\n }\n const idx = this._objects.indexOf(object);\n if (idx !== 0) {\n // if object is not on the bottom of stack\n const newIdx = this.findNewLowerIndex(object, idx, intersecting);\n removeFromArray(this._objects, object);\n this._objects.splice(newIdx, 0, object);\n this._onStackOrderChanged(object);\n return true;\n }\n return false;\n }\n\n /**\n * Moves an object or a selection up in stack of drawn objects\n * An optional parameter, intersecting allows to move the object in front\n * of the first intersecting object. Where intersection is calculated with\n * bounding box. If no intersection is found, there will not be change in the\n * stack.\n * @param {fabric.Object} object Object to send\n * @param {boolean} [intersecting] If `true`, send object in front of next upper intersecting object\n * @returns {boolean} true if change occurred\n */\n bringObjectForward(object: FabricObject, intersecting?: boolean) {\n if (!object) {\n return false;\n }\n const idx = this._objects.indexOf(object);\n if (idx !== this._objects.length - 1) {\n // if object is not on top of stack (last item in an array)\n const newIdx = this.findNewUpperIndex(object, idx, intersecting);\n removeFromArray(this._objects, object);\n this._objects.splice(newIdx, 0, object);\n this._onStackOrderChanged(object);\n return true;\n }\n return false;\n }\n\n /**\n * Moves an object to specified level in stack of drawn objects\n * @param {fabric.Object} object Object to send\n * @param {number} index Position to move to\n * @returns {boolean} true if change occurred\n */\n moveObjectTo(object: FabricObject, index: number) {\n if (object === this._objects[index]) {\n return false;\n }\n removeFromArray(this._objects, object);\n this._objects.splice(index, 0, object);\n this._onStackOrderChanged(object);\n return true;\n }\n\n findNewLowerIndex(\n object: FabricObject,\n idx: number,\n intersecting?: boolean,\n ) {\n let newIdx;\n\n if (intersecting) {\n newIdx = idx;\n // traverse down the stack looking for the nearest intersecting object\n for (let i = idx - 1; i >= 0; --i) {\n if (object.isOverlapping(this._objects[i])) {\n newIdx = i;\n break;\n }\n }\n } else {\n newIdx = idx - 1;\n }\n\n return newIdx;\n }\n\n findNewUpperIndex(\n object: FabricObject,\n idx: number,\n intersecting?: boolean,\n ) {\n let newIdx;\n\n if (intersecting) {\n newIdx = idx;\n // traverse up the stack looking for the nearest intersecting object\n for (let i = idx + 1; i < this._objects.length; ++i) {\n if (object.isOverlapping(this._objects[i])) {\n newIdx = i;\n break;\n }\n }\n } else {\n newIdx = idx + 1;\n }\n\n return newIdx;\n }\n\n /**\n * Given a bounding box, return all the objects of the collection that are contained in the bounding box.\n * If `includeIntersecting` is true, return also the objects that intersect the bounding box as well.\n * This is meant to work with selection. Is not a generic method.\n * @param {TBBox} bbox a bounding box in scene coordinates\n * @param {{ includeIntersecting?: boolean }} options an object with includeIntersecting\n * @returns array of objects contained in the bounding box, ordered from top to bottom stacking wise\n */\n collectObjects(\n { left, top, width, height }: TBBox,\n { includeIntersecting = true }: { includeIntersecting?: boolean } = {},\n ) {\n const objects: InteractiveFabricObject[] = [],\n tl = new Point(left, top),\n br = tl.add(new Point(width, height));\n\n // we iterate reverse order to collect top first in case of click.\n for (let i = this._objects.length - 1; i >= 0; i--) {\n const object = this._objects[i] as unknown as InteractiveFabricObject;\n if (\n object.selectable &&\n object.visible &&\n ((includeIntersecting && object.intersectsWithRect(tl, br)) ||\n object.isContainedWithinRect(tl, br) ||\n (includeIntersecting && object.containsPoint(tl)) ||\n (includeIntersecting && object.containsPoint(br)))\n ) {\n objects.push(object);\n }\n }\n\n return objects;\n }\n }\n\n // https://github.com/microsoft/TypeScript/issues/32080\n return Collection;\n}\n","import { Observable } from './Observable';\n\nexport class CommonMethods extends Observable {\n /**\n * Sets object's properties from options, for initialization only\n * @protected\n * @param {Object} [options] Options object\n */\n protected _setOptions(options: any = {}) {\n for (const prop in options) {\n this.set(prop, options[prop]);\n }\n }\n\n /**\n * @private\n */\n _setObject(obj: Record) {\n for (const prop in obj) {\n this._set(prop, obj[prop]);\n }\n }\n\n /**\n * Sets property to a given value. When changing position/dimension -related properties (left, top, scale, angle, etc.) `set` does not update position of object's borders/controls. If you need to update those, call `setCoords()`.\n * @param {String|Object} key Property name or object (if object, iterate over the object properties)\n * @param {Object|Function} value Property value (if function, the value is passed into it and its return value is used as a new one)\n */\n set(key: string | Record, value?: any) {\n if (typeof key === 'object') {\n this._setObject(key);\n } else {\n this._set(key, value);\n }\n return this;\n }\n\n _set(key: string, value: any) {\n this[key as keyof this] = value;\n }\n\n /**\n * Toggles specified property from `true` to `false` or from `false` to `true`\n * @param {String} property Property to toggle\n */\n toggle(property: string) {\n const value = this.get(property);\n if (typeof value === 'boolean') {\n this.set(property, !value);\n }\n return this;\n }\n\n /**\n * Basic getter\n * @param {String} property Property name\n * @return {*} value of a property\n */\n get(property: string): any {\n return this[property as keyof this];\n }\n}\n","import { getFabricWindow } from '../../env';\n\nexport function requestAnimFrame(callback: FrameRequestCallback): number {\n return getFabricWindow().requestAnimationFrame(callback);\n}\n\nexport function cancelAnimFrame(handle: number): void {\n return getFabricWindow().cancelAnimationFrame(handle);\n}\n","let id = 0;\n\nexport const uid = () => id++;\n","import { getFabricDocument } from '../../env';\nimport type { ImageFormat, TSize } from '../../typedefs';\nimport { FabricError } from '../internals/console';\n/**\n * Creates canvas element\n * @return {CanvasElement} initialized canvas element\n */\nexport const createCanvasElement = (): HTMLCanvasElement => {\n const element = getFabricDocument().createElement('canvas');\n if (!element || typeof element.getContext === 'undefined') {\n throw new FabricError('Failed to create `canvas` element');\n }\n return element;\n};\n\n/**\n * Creates image element (works on client and node)\n * @return {HTMLImageElement} HTML image element\n */\nexport const createImage = (): HTMLImageElement =>\n getFabricDocument().createElement('img');\n\n/**\n * Creates a canvas element that is a copy of another and is also painted\n * @param {CanvasElement} canvas to copy size and content of\n * @return {CanvasElement} initialized canvas element\n */\nexport const copyCanvasElement = (\n canvas: HTMLCanvasElement,\n): HTMLCanvasElement => {\n const newCanvas = createCanvasElementFor(canvas);\n newCanvas.getContext('2d')?.drawImage(canvas, 0, 0);\n return newCanvas;\n};\n\n/**\n * Creates a canvas element as big as another\n * @param {CanvasElement} canvas to copy size and content of\n * @return {CanvasElement} initialized canvas element\n */\nexport const createCanvasElementFor = (\n canvas: HTMLCanvasElement | ImageData | HTMLImageElement | TSize,\n): HTMLCanvasElement => {\n const newCanvas = createCanvasElement();\n newCanvas.width = canvas.width;\n newCanvas.height = canvas.height;\n return newCanvas;\n};\n\n/**\n * since 2.6.0 moved from canvas instance to utility.\n * possibly useless\n * @param {CanvasElement} canvasEl to copy size and content of\n * @param {String} format 'jpeg' or 'png', in some browsers 'webp' is ok too\n * @param {number} quality <= 1 and > 0\n * @return {String} data url\n */\nexport const toDataURL = (\n canvasEl: HTMLCanvasElement,\n format: ImageFormat,\n quality: number,\n) => canvasEl.toDataURL(`image/${format}`, quality);\n\nexport const isHTMLCanvas = (\n canvas?: HTMLCanvasElement | string,\n): canvas is HTMLCanvasElement => {\n return !!canvas && (canvas as HTMLCanvasElement).getContext !== undefined;\n};\n\nexport const toBlob = (\n canvasEl: HTMLCanvasElement,\n format?: ImageFormat,\n quality?: number,\n): Promise =>\n new Promise((resolve, _) => {\n canvasEl.toBlob(resolve, `image/${format}`, quality);\n });\n","import type { TRadian, TDegree } from '../../typedefs';\nimport { PiBy180 } from '../../constants';\n\n/**\n * Transforms degrees to radians.\n * @param {TDegree} degrees value in degrees\n * @return {TRadian} value in radians\n */\nexport const degreesToRadians = (degrees: TDegree): TRadian =>\n (degrees * PiBy180) as TRadian;\n\n/**\n * Transforms radians to degrees.\n * @param {TRadian} radians value in radians\n * @return {TDegree} value in degrees\n */\nexport const radiansToDegrees = (radians: TRadian): TDegree =>\n (radians / PiBy180) as TDegree;\n","import { iMatrix } from '../../constants';\nimport type { XY } from '../../Point';\nimport { Point } from '../../Point';\nimport type { TDegree, TRadian, TMat2D } from '../../typedefs';\nimport { cos } from './cos';\nimport { degreesToRadians, radiansToDegrees } from './radiansDegreesConversion';\nimport { sin } from './sin';\n\nexport type TRotateMatrixArgs = {\n angle?: TDegree;\n};\n\nexport type TTranslateMatrixArgs = {\n translateX?: number;\n translateY?: number;\n};\n\nexport type TScaleMatrixArgs = {\n scaleX?: number;\n scaleY?: number;\n flipX?: boolean;\n flipY?: boolean;\n skewX?: TDegree;\n skewY?: TDegree;\n};\n\nexport type TComposeMatrixArgs = TTranslateMatrixArgs &\n TRotateMatrixArgs &\n TScaleMatrixArgs;\n\nexport type TQrDecomposeOut = Required<\n Omit\n>;\n\nexport const isIdentityMatrix = (mat: TMat2D) =>\n mat.every((value, index) => value === iMatrix[index]);\n\n/**\n * Apply transform t to point p\n * @deprecated use {@link Point#transform}\n * @param {Point | XY} p The point to transform\n * @param {Array} t The transform\n * @param {Boolean} [ignoreOffset] Indicates that the offset should not be applied\n * @return {Point} The transformed point\n */\nexport const transformPoint = (\n p: XY,\n t: TMat2D,\n ignoreOffset?: boolean,\n): Point => new Point(p).transform(t, ignoreOffset);\n\n/**\n * Invert transformation t\n * @param {Array} t The transform\n * @return {Array} The inverted transform\n */\nexport const invertTransform = (t: TMat2D): TMat2D => {\n const a = 1 / (t[0] * t[3] - t[1] * t[2]),\n r = [a * t[3], -a * t[1], -a * t[2], a * t[0], 0, 0] as TMat2D,\n { x, y } = new Point(t[4], t[5]).transform(r, true);\n r[4] = -x;\n r[5] = -y;\n return r;\n};\n\n/**\n * Multiply matrix A by matrix B to nest transformations\n * @param {TMat2D} a First transformMatrix\n * @param {TMat2D} b Second transformMatrix\n * @param {Boolean} is2x2 flag to multiply matrices as 2x2 matrices\n * @return {TMat2D} The product of the two transform matrices\n */\nexport const multiplyTransformMatrices = (\n a: TMat2D,\n b: TMat2D,\n is2x2?: boolean,\n): TMat2D =>\n [\n a[0] * b[0] + a[2] * b[1],\n a[1] * b[0] + a[3] * b[1],\n a[0] * b[2] + a[2] * b[3],\n a[1] * b[2] + a[3] * b[3],\n is2x2 ? 0 : a[0] * b[4] + a[2] * b[5] + a[4],\n is2x2 ? 0 : a[1] * b[4] + a[3] * b[5] + a[5],\n ] as TMat2D;\n\n/**\n * Multiplies {@link matrices} such that a matrix defines the plane for the rest of the matrices **after** it\n *\n * `multiplyTransformMatrixArray([A, B, C, D])` is equivalent to `A(B(C(D)))`\n *\n * @param matrices an array of matrices\n * @param [is2x2] flag to multiply matrices as 2x2 matrices\n * @returns the multiplication product\n */\nexport const multiplyTransformMatrixArray = (\n matrices: (TMat2D | undefined | null | false)[],\n is2x2?: boolean,\n) =>\n matrices.reduceRight(\n (product: TMat2D, curr) =>\n curr && product\n ? multiplyTransformMatrices(curr, product, is2x2)\n : curr || product,\n undefined as unknown as TMat2D,\n ) || iMatrix.concat();\n\nexport const calcPlaneRotation = ([a, b]: TMat2D) =>\n Math.atan2(b, a) as TRadian;\n\n/**\n * Decomposes standard 2x3 matrix into transform components\n * @param {TMat2D} a transformMatrix\n * @return {Object} Components of transform\n */\nexport const qrDecompose = (a: TMat2D): TQrDecomposeOut => {\n const angle = calcPlaneRotation(a),\n denom = Math.pow(a[0], 2) + Math.pow(a[1], 2),\n scaleX = Math.sqrt(denom),\n scaleY = (a[0] * a[3] - a[2] * a[1]) / scaleX,\n skewX = Math.atan2(a[0] * a[2] + a[1] * a[3], denom);\n return {\n angle: radiansToDegrees(angle),\n scaleX,\n scaleY,\n skewX: radiansToDegrees(skewX),\n skewY: 0 as TDegree,\n translateX: a[4] || 0,\n translateY: a[5] || 0,\n };\n};\n\n/**\n * Generate a translation matrix\n *\n * A translation matrix in the form of\n * [ 1 0 x ]\n * [ 0 1 y ]\n * [ 0 0 1 ]\n *\n * See @link https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/transform#translate for more details\n *\n * @param {number} x translation on X axis\n * @param {number} [y] translation on Y axis\n * @returns {TMat2D} matrix\n */\nexport const createTranslateMatrix = (x: number, y = 0): TMat2D => [\n 1,\n 0,\n 0,\n 1,\n x,\n y,\n];\n\n/**\n * Generate a rotation matrix around around a point (x,y), defaulting to (0,0)\n *\n * A matrix in the form of\n * [cos(a) -sin(a) -x*cos(a)+y*sin(a)+x]\n * [sin(a) cos(a) -x*sin(a)-y*cos(a)+y]\n * [0 0 1 ]\n *\n *\n * @param {TDegree} angle rotation in degrees\n * @param {XY} [pivotPoint] pivot point to rotate around\n * @returns {TMat2D} matrix\n */\nexport function createRotateMatrix(\n { angle = 0 }: TRotateMatrixArgs = {},\n { x = 0, y = 0 }: Partial = {},\n): TMat2D {\n const angleRadiant = degreesToRadians(angle),\n cosValue = cos(angleRadiant),\n sinValue = sin(angleRadiant);\n return [\n cosValue,\n sinValue,\n -sinValue,\n cosValue,\n x ? x - (cosValue * x - sinValue * y) : 0,\n y ? y - (sinValue * x + cosValue * y) : 0,\n ];\n}\n\n/**\n * Generate a scale matrix around the point (0,0)\n *\n * A matrix in the form of\n * [x 0 0]\n * [0 y 0]\n * [0 0 1]\n *\n * @link https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/transform#scale\n *\n * @param {number} x scale on X axis\n * @param {number} [y] scale on Y axis\n * @returns {TMat2D} matrix\n */\nexport const createScaleMatrix = (x: number, y: number = x): TMat2D => [\n x,\n 0,\n 0,\n y,\n 0,\n 0,\n];\n\nexport const angleToSkew = (angle: TDegree) =>\n Math.tan(degreesToRadians(angle));\n\nexport const skewToAngle = (value: TRadian) =>\n radiansToDegrees(Math.atan(value));\n\n/**\n * Generate a skew matrix for the X axis\n *\n * A matrix in the form of\n * [1 x 0]\n * [0 1 0]\n * [0 0 1]\n *\n * @link https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/transform#skewx\n *\n * @param {TDegree} skewValue translation on X axis\n * @returns {TMat2D} matrix\n */\nexport const createSkewXMatrix = (skewValue: TDegree): TMat2D => [\n 1,\n 0,\n angleToSkew(skewValue),\n 1,\n 0,\n 0,\n];\n\n/**\n * Generate a skew matrix for the Y axis\n *\n * A matrix in the form of\n * [1 0 0]\n * [y 1 0]\n * [0 0 1]\n *\n * @link https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/transform#skewy\n *\n * @param {TDegree} skewValue translation on Y axis\n * @returns {TMat2D} matrix\n */\nexport const createSkewYMatrix = (skewValue: TDegree): TMat2D => [\n 1,\n angleToSkew(skewValue),\n 0,\n 1,\n 0,\n 0,\n];\n\n/**\n * Returns a transform matrix starting from an object of the same kind of\n * the one returned from qrDecompose, useful also if you want to calculate some\n * transformations from an object that is not enlived yet.\n * is called DimensionsTransformMatrix because those properties are the one that influence\n * the size of the resulting box of the object.\n * @param {Object} options\n * @param {Number} [options.scaleX]\n * @param {Number} [options.scaleY]\n * @param {Boolean} [options.flipX]\n * @param {Boolean} [options.flipY]\n * @param {Number} [options.skewX]\n * @param {Number} [options.skewY]\n * @return {Number[]} transform matrix\n */\nexport const calcDimensionsMatrix = ({\n scaleX = 1,\n scaleY = 1,\n flipX = false,\n flipY = false,\n skewX = 0 as TDegree,\n skewY = 0 as TDegree,\n}: TScaleMatrixArgs) => {\n let matrix = createScaleMatrix(\n flipX ? -scaleX : scaleX,\n flipY ? -scaleY : scaleY,\n );\n if (skewX) {\n matrix = multiplyTransformMatrices(matrix, createSkewXMatrix(skewX), true);\n }\n if (skewY) {\n matrix = multiplyTransformMatrices(matrix, createSkewYMatrix(skewY), true);\n }\n return matrix;\n};\n\n/**\n * Returns a transform matrix starting from an object of the same kind of\n * the one returned from qrDecompose, useful also if you want to calculate some\n * transformations from an object that is not enlived yet\n * Before changing this function look at: src/benchmarks/calcTransformMatrix.mjs\n * @param {Object} options\n * @param {Number} [options.angle]\n * @param {Number} [options.scaleX]\n * @param {Number} [options.scaleY]\n * @param {Boolean} [options.flipX]\n * @param {Boolean} [options.flipY]\n * @param {Number} [options.skewX]\n * @param {Number} [options.skewY]\n * @param {Number} [options.translateX]\n * @param {Number} [options.translateY]\n * @return {Number[]} transform matrix\n */\nexport const composeMatrix = (options: TComposeMatrixArgs): TMat2D => {\n const { translateX = 0, translateY = 0, angle = 0 as TDegree } = options;\n let matrix = createTranslateMatrix(translateX, translateY);\n if (angle) {\n matrix = multiplyTransformMatrices(matrix, createRotateMatrix({ angle }));\n }\n const scaleMatrix = calcDimensionsMatrix(options);\n if (!isIdentityMatrix(scaleMatrix)) {\n matrix = multiplyTransformMatrices(matrix, scaleMatrix);\n }\n return matrix;\n};\n","import { noop } from '../../constants';\nimport type { FabricObject } from '../../shapes/Object/FabricObject';\nimport type {\n Abortable,\n Constructor,\n TCrossOrigin,\n TFiller,\n} from '../../typedefs';\nimport { createImage } from './dom';\nimport { classRegistry } from '../../ClassRegistry';\nimport type { BaseFilter } from '../../filters/BaseFilter';\nimport type { FabricObject as BaseFabricObject } from '../../shapes/Object/Object';\nimport { FabricError, SignalAbortedError } from '../internals/console';\nimport type { Shadow } from '../../Shadow';\n\nexport type LoadImageOptions = Abortable & {\n /**\n * cors value for the image loading, default to anonymous\n */\n crossOrigin?: TCrossOrigin;\n};\n\n/**\n * Loads image element from given url and resolve it, or catch.\n * @param {String} url URL representing an image\n * @param {LoadImageOptions} [options] image loading options\n * @returns {Promise} the loaded image.\n */\nexport const loadImage = (\n url: string,\n { signal, crossOrigin = null }: LoadImageOptions = {},\n) =>\n new Promise(function (resolve, reject) {\n if (signal && signal.aborted) {\n return reject(new SignalAbortedError('loadImage'));\n }\n const img = createImage();\n let abort: EventListenerOrEventListenerObject;\n if (signal) {\n abort = function (err: Event) {\n img.src = '';\n reject(err);\n };\n signal.addEventListener('abort', abort, { once: true });\n }\n const done = function () {\n img.onload = img.onerror = null;\n abort && signal?.removeEventListener('abort', abort);\n resolve(img);\n };\n if (!url) {\n done();\n return;\n }\n img.onload = done;\n img.onerror = function () {\n abort && signal?.removeEventListener('abort', abort);\n reject(new FabricError(`Error loading ${img.src}`));\n };\n crossOrigin && (img.crossOrigin = crossOrigin);\n img.src = url;\n });\n\nexport type EnlivenObjectOptions = Abortable & {\n /**\n * Method for further parsing of object elements,\n * called after each fabric object created.\n */\n reviver?: <\n T extends\n | BaseFabricObject\n | FabricObject\n | BaseFilter\n | Shadow\n | TFiller,\n >(\n serializedObj: Record,\n instance: T,\n ) => void;\n};\n\n/**\n * @TODO type this correctly.\n * Creates corresponding fabric instances from their object representations\n * @param {Object[]} objects Objects to enliven\n * @param {EnlivenObjectOptions} [options]\n * @param {(serializedObj: object, instance: FabricObject) => any} [options.reviver] Method for further parsing of object elements,\n * called after each fabric object created.\n * @param {AbortSignal} [options.signal] handle aborting, see https://developer.mozilla.org/en-US/docs/Web/API/AbortController/signal\n * @returns {Promise}\n */\nexport const enlivenObjects = <\n T extends\n | BaseFabricObject\n | FabricObject\n | BaseFilter\n | Shadow\n | TFiller,\n>(\n objects: any[],\n { signal, reviver = noop }: EnlivenObjectOptions = {},\n) =>\n new Promise((resolve, reject) => {\n const instances: T[] = [];\n signal && signal.addEventListener('abort', reject, { once: true });\n Promise.all(\n objects.map((obj) =>\n classRegistry\n .getClass<\n Constructor & {\n fromObject(options: any, context: Abortable): Promise;\n }\n >(obj.type)\n .fromObject(obj, { signal })\n .then((fabricInstance) => {\n reviver(obj, fabricInstance);\n instances.push(fabricInstance);\n return fabricInstance;\n }),\n ),\n )\n .then(resolve)\n .catch((error) => {\n // cleanup\n instances.forEach((instance) => {\n (instance as FabricObject).dispose &&\n (instance as FabricObject).dispose();\n });\n reject(error);\n })\n .finally(() => {\n signal && signal.removeEventListener('abort', reject);\n });\n });\n\n/**\n * Creates corresponding fabric instances residing in an object, e.g. `clipPath`\n * @param {Object} object with properties to enlive ( fill, stroke, clipPath, path )\n * @param {object} [options]\n * @param {AbortSignal} [options.signal] handle aborting, see https://developer.mozilla.org/en-US/docs/Web/API/AbortController/signal\n * @returns {Promise>} the input object with enlived values\n */\nexport const enlivenObjectEnlivables = <\n R = Record,\n>(\n serializedObject: any,\n { signal }: Abortable = {},\n) =>\n new Promise((resolve, reject) => {\n const instances: (FabricObject | TFiller | Shadow)[] = [];\n signal && signal.addEventListener('abort', reject, { once: true });\n // enlive every possible property\n const promises = Object.values(serializedObject).map((value: any) => {\n if (!value) {\n return value;\n }\n /**\n * clipPath or shadow or gradient or text on a path or a pattern,\n * or the backgroundImage or overlayImage of canvas\n * If we have a type and there is a classe registered for it, we enlive it.\n * If there is no class registered for it we return the value as is\n * */\n if (value.type && classRegistry.has(value.type)) {\n return enlivenObjects([value], {\n signal,\n }).then(([enlived]) => {\n instances.push(enlived);\n return enlived;\n });\n }\n return value;\n });\n const keys = Object.keys(serializedObject);\n Promise.all(promises)\n .then((enlived) => {\n return enlived.reduce((acc, instance, index) => {\n acc[keys[index]] = instance;\n return acc;\n }, {});\n })\n .then(resolve)\n .catch((error) => {\n // cleanup\n instances.forEach((instance: any) => {\n instance.dispose && instance.dispose();\n });\n reject(error);\n })\n .finally(() => {\n signal && signal.removeEventListener('abort', reject);\n });\n });\n","/**\n * Populates an object with properties of another object\n * @param {Object} source Source object\n * @param {string[]} properties Properties names to include\n * @returns object populated with the picked keys\n */\nexport const pick = >(\n source: T,\n keys: (keyof T)[] = [],\n) => {\n return keys.reduce((o, key) => {\n if (key in source) {\n o[key] = source[key];\n }\n return o;\n }, {} as Partial);\n};\n\nexport const pickBy = >(\n source: T,\n predicate: (value: T[K], key: K, collection: T) => boolean,\n) => {\n return (Object.keys(source) as (keyof T)[]).reduce((o, key) => {\n if (predicate(source[key], key, source)) {\n o[key] = source[key];\n }\n return o;\n }, {} as Partial);\n};\n","/**\n * A wrapper around Number#toFixed, which contrary to native method returns number, not string.\n * @param {number|string} number number to operate on\n * @param {number} fractionDigits number of fraction digits to \"leave\"\n * @return {number}\n */\nexport const toFixed = (number: number | string, fractionDigits: number) =>\n parseFloat(Number(number).toFixed(fractionDigits));\n","import type { TMat2D } from '../../typedefs';\nimport { toFixed } from './toFixed';\nimport { config } from '../../config';\n\n/**\n * given an array of 6 number returns something like `\"matrix(...numbers)\"`\n * @param {TMat2D} transform an array with 6 numbers\n * @return {String} transform matrix for svg\n */\nexport const matrixToSVG = (transform: TMat2D) =>\n 'matrix(' +\n transform\n .map((value) => toFixed(value, config.NUM_FRACTION_DIGITS))\n .join(' ') +\n ')';\n","import type { FabricObject } from '../shapes/Object/Object';\nimport type { TFiller } from '../typedefs';\nimport type { FabricText } from '../shapes/Text/Text';\nimport type { Pattern } from '../Pattern';\nimport type { Path } from '../shapes/Path';\nimport type { ActiveSelection } from '../shapes/ActiveSelection';\n\nexport const isFiller = (\n filler: TFiller | string | null,\n): filler is TFiller => {\n return !!filler && (filler as TFiller).toLive !== undefined;\n};\n\nexport const isSerializableFiller = (\n filler: TFiller | string | null,\n): filler is TFiller => {\n return !!filler && typeof (filler as TFiller).toObject === 'function';\n};\n\nexport const isPattern = (filler: TFiller): filler is Pattern => {\n return (\n !!filler && (filler as Pattern).offsetX !== undefined && 'source' in filler\n );\n};\n\nexport const isTextObject = (\n fabricObject?: FabricObject,\n): fabricObject is FabricText => {\n return (\n !!fabricObject &&\n typeof (fabricObject as FabricText)._renderText === 'function'\n );\n};\n\nexport const isPath = (fabricObject?: FabricObject): fabricObject is Path => {\n // we could use instanceof but that would mean pulling in Text code for a simple check\n // @todo discuss what to do and how to do\n return (\n !!fabricObject &&\n typeof (fabricObject as Path)._renderPathCommands === 'function'\n );\n};\n\nexport const isActiveSelection = (\n fabricObject?: FabricObject,\n): fabricObject is ActiveSelection =>\n !!fabricObject && 'multiSelectionStacking' in fabricObject;\n","/**\n * Returns element scroll offsets\n * @param {HTMLElement} element Element to operate on\n * @return {Object} Object with left/top values\n */\nexport function getScrollLeftTop(element: HTMLElement | null) {\n const doc = element && getDocumentFromElement(element);\n let left = 0,\n top = 0;\n if (!element || !doc) {\n return { left, top };\n }\n let elementLoop: HTMLElement | Document | ShadowRoot = element;\n const docElement = doc.documentElement,\n body = doc.body || {\n scrollLeft: 0,\n scrollTop: 0,\n };\n // While loop checks (and then sets element to) .parentNode OR .host\n // to account for ShadowDOM. We still want to traverse up out of ShadowDOM,\n // but the .parentNode of a root ShadowDOM node will always be null, instead\n // it should be accessed through .host. See http://stackoverflow.com/a/24765528/4383938\n while (\n elementLoop &&\n (elementLoop.parentNode || (elementLoop as unknown as ShadowRoot).host)\n ) {\n elementLoop = (elementLoop.parentNode ||\n (elementLoop as unknown as ShadowRoot).host) as\n | HTMLElement\n | Document\n | ShadowRoot;\n if (elementLoop === doc) {\n left = body.scrollLeft || docElement.scrollLeft || 0;\n top = body.scrollTop || docElement.scrollTop || 0;\n } else {\n left += (elementLoop as HTMLElement).scrollLeft || 0;\n top += (elementLoop as HTMLElement).scrollTop || 0;\n }\n\n if (\n elementLoop.nodeType === 1 &&\n (elementLoop as HTMLElement).style.position === 'fixed'\n ) {\n break;\n }\n }\n\n return { left, top };\n}\n\nexport const getDocumentFromElement = (el: HTMLElement) =>\n el.ownerDocument || null;\n\nexport const getWindowFromElement = (el: HTMLElement) =>\n el.ownerDocument?.defaultView || null;\n","import { NONE } from '../../constants';\nimport type { TSize } from '../../typedefs';\nimport {\n getDocumentFromElement,\n getWindowFromElement,\n getScrollLeftTop,\n} from '../../util/dom_misc';\n\nexport const setCanvasDimensions = (\n el: HTMLCanvasElement,\n ctx: CanvasRenderingContext2D,\n { width, height }: TSize,\n retinaScaling = 1,\n) => {\n el.width = width;\n el.height = height;\n if (retinaScaling > 1) {\n el.setAttribute('width', (width * retinaScaling).toString());\n el.setAttribute('height', (height * retinaScaling).toString());\n ctx.scale(retinaScaling, retinaScaling);\n }\n};\n\nexport type CSSDimensions = {\n width: number | string;\n height: number | string;\n};\n\nexport const setCSSDimensions = (\n el: HTMLElement,\n { width, height }: Partial,\n) => {\n width && (el.style.width = typeof width === 'number' ? `${width}px` : width);\n height &&\n (el.style.height = typeof height === 'number' ? `${height}px` : height);\n};\n\n/**\n * Returns offset for a given element\n * @param {HTMLElement} element Element to get offset for\n * @return {Object} Object with \"left\" and \"top\" properties\n */\nexport function getElementOffset(element: HTMLElement) {\n const doc = element && getDocumentFromElement(element),\n offset = { left: 0, top: 0 };\n\n if (!doc) {\n return offset;\n }\n const elemStyle: CSSStyleDeclaration =\n getWindowFromElement(element)?.getComputedStyle(element, null) ||\n ({} as CSSStyleDeclaration);\n offset.left += parseInt(elemStyle.borderLeftWidth, 10) || 0;\n offset.top += parseInt(elemStyle.borderTopWidth, 10) || 0;\n offset.left += parseInt(elemStyle.paddingLeft, 10) || 0;\n offset.top += parseInt(elemStyle.paddingTop, 10) || 0;\n\n let box = { left: 0, top: 0 };\n\n const docElem = doc.documentElement;\n if (typeof element.getBoundingClientRect !== 'undefined') {\n box = element.getBoundingClientRect();\n }\n\n const scrollLeftTop = getScrollLeftTop(element);\n\n return {\n left:\n box.left + scrollLeftTop.left - (docElem.clientLeft || 0) + offset.left,\n top: box.top + scrollLeftTop.top - (docElem.clientTop || 0) + offset.top,\n };\n}\n\n/**\n * Makes element unselectable\n * @param {HTMLElement} element Element to make unselectable\n * @return {HTMLElement} Element that was passed in\n */\nexport function makeElementUnselectable(element: HTMLElement) {\n if (typeof element.onselectstart !== 'undefined') {\n element.onselectstart = () => false;\n }\n element.style.userSelect = NONE;\n return element;\n}\n","import { getEnv, getFabricDocument } from '../../env';\nimport type { TSize } from '../../typedefs';\nimport type { CSSDimensions } from './util';\nimport { setCSSDimensions, getElementOffset } from './util';\nimport { createCanvasElement, isHTMLCanvas } from '../../util/misc/dom';\nimport { setCanvasDimensions } from './util';\nimport { FabricError } from '../../util/internals/console';\n\nexport type CanvasItem = {\n el: HTMLCanvasElement;\n ctx: CanvasRenderingContext2D;\n};\n\nexport class StaticCanvasDOMManager {\n /**\n * Keeps a copy of the canvas style before setting retina scaling and other potions\n * in order to return it to original state on dispose\n * @type string\n */\n private _originalCanvasStyle?: string;\n\n lower: CanvasItem;\n\n constructor(arg0?: string | HTMLCanvasElement) {\n const el = this.createLowerCanvas(arg0);\n this.lower = { el, ctx: el.getContext('2d')! };\n }\n\n protected createLowerCanvas(arg0?: HTMLCanvasElement | string) {\n // canvasEl === 'HTMLCanvasElement' does not work on jsdom/node\n const el = isHTMLCanvas(arg0)\n ? arg0\n : (arg0 &&\n (getFabricDocument().getElementById(arg0) as HTMLCanvasElement)) ||\n createCanvasElement();\n if (el.hasAttribute('data-fabric')) {\n throw new FabricError(\n 'Trying to initialize a canvas that has already been initialized. Did you forget to dispose the canvas?',\n );\n }\n this._originalCanvasStyle = el.style.cssText;\n el.setAttribute('data-fabric', 'main');\n el.classList.add('lower-canvas');\n return el;\n }\n\n cleanupDOM({ width, height }: TSize) {\n const { el } = this.lower;\n // restore canvas style and attributes\n el.classList.remove('lower-canvas');\n el.removeAttribute('data-fabric');\n // restore canvas size to original size in case retina scaling was applied\n el.setAttribute('width', `${width}`);\n el.setAttribute('height', `${height}`);\n el.style.cssText = this._originalCanvasStyle || '';\n this._originalCanvasStyle = undefined;\n }\n\n setDimensions(size: TSize, retinaScaling: number) {\n const { el, ctx } = this.lower;\n setCanvasDimensions(el, ctx, size, retinaScaling);\n }\n\n setCSSDimensions(size: Partial) {\n setCSSDimensions(this.lower.el, size);\n }\n\n /**\n * Calculates canvas element offset relative to the document\n */\n calcOffset() {\n return getElementOffset(this.lower.el);\n }\n\n dispose() {\n getEnv().dispose(this.lower.el);\n // @ts-expect-error disposing\n delete this.lower;\n }\n}\n","import { iMatrix } from '../constants';\nimport type { FabricObject } from '../shapes/Object/FabricObject';\nimport type { TFiller, TMat2D, TOptions } from '../typedefs';\n\ninterface CanvasDrawableOptions {\n /**\n * if set to false background image is not affected by viewport transform\n * @since 1.6.3\n * @type Boolean\n * @todo we should really find a different way to do this\n */\n backgroundVpt: boolean;\n\n /**\n * Background color of canvas instance.\n * @type {(String|TFiller)}\n */\n backgroundColor: TFiller | string;\n\n /**\n * Background image of canvas instance.\n * since 2.4.0 image caching is active, please when putting an image as background, add to the\n * canvas property a reference to the canvas it is on. Otherwise the image cannot detect the zoom\n * vale. As an alternative you can disable image objectCaching\n * @type FabricObject\n */\n backgroundImage?: FabricObject;\n\n /**\n * if set to false overlay image is not affected by viewport transform\n * @since 1.6.3\n * @type Boolean\n * @todo we should really find a different way to do this\n */\n overlayVpt: boolean;\n\n /**\n * Overlay color of canvas instance.\n * @since 1.3.9\n * @type {(String|TFiller)}\n */\n overlayColor: TFiller | string;\n\n /**\n * Overlay image of canvas instance.\n * since 2.4.0 image caching is active, please when putting an image as overlay, add to the\n * canvas property a reference to the canvas it is on. Otherwise the image cannot detect the zoom\n * vale. As an alternative you can disable image objectCaching\n * @type FabricObject\n */\n overlayImage?: FabricObject;\n}\n\ninterface CanvasRenderingOptions {\n /**\n * Indicates whether {@link StaticCanvas#add}, {@link StaticCanvas#insertAt} and {@link StaticCanvas#remove},\n * {@link StaticCanvas#moveTo}, {@link StaticCanvas#clear} and many more, should also re-render canvas.\n * Disabling this option will not give a performance boost when adding/removing a lot of objects to/from canvas at once\n * since the renders are queued and executed one per frame.\n * Disabling is suggested anyway and managing the renders of the app manually is not a big effort ( canvas.requestRenderAll() )\n * Left default to true to do not break documentation and old app, fiddles.\n * @type Boolean\n */\n renderOnAddRemove: boolean;\n\n /**\n * Based on vptCoords and object.aCoords, skip rendering of objects that\n * are not included in current viewport.\n * May greatly help in applications with crowded canvas and use of zoom/pan\n * If One of the corner of the bounding box of the object is on the canvas\n * the objects get rendered.\n * @type Boolean\n * @default true\n */\n skipOffscreen: boolean;\n\n /**\n * When true, canvas is scaled by devicePixelRatio for better rendering on retina screens\n * @type Boolean\n */\n enableRetinaScaling: boolean;\n\n /**\n * Indicates whether this canvas will use image smoothing, this is on by default in browsers\n * @type Boolean\n */\n imageSmoothingEnabled: boolean;\n\n /**\n * a fabricObject that, without stroke define a clipping area with their shape. filled in black\n * the clipPath object gets used when the canvas has rendered, and the context is placed in the\n * top left corner of the canvas.\n * clipPath will clip away controls, if you do not want this to happen use controlsAboveOverlay = true\n * @type FabricObject\n */\n clipPath?: FabricObject;\n}\n\nexport interface CanvasExportOptions {\n /**\n * Indicates whether toObject/toDatalessObject should include default values\n * if set to false, takes precedence over the object value.\n * @type Boolean\n */\n includeDefaultValues: boolean;\n\n /**\n * When true, getSvgTransform() will apply the StaticCanvas.viewportTransform to the SVG transformation. When true,\n * a zoomed canvas will then produce zoomed SVG output.\n * @type Boolean\n */\n svgViewportTransformation: boolean;\n}\n\nexport interface StaticCanvasOptions\n extends CanvasDrawableOptions,\n CanvasRenderingOptions,\n CanvasExportOptions {\n /**\n * Width in virtual/logical pixels of the canvas.\n * The canvas can be larger than width if retina scaling is active\n * @type number\n */\n width: number;\n\n /**\n * Height in virtual/logical pixels of the canvas.\n * The canvas can be taller than width if retina scaling is active\n * @type height\n */\n height: number;\n\n /**\n * Indicates whether object controls (borders/controls) are rendered above overlay image\n * @type Boolean\n *\n * @todo move to Canvas\n */\n controlsAboveOverlay: boolean;\n\n /**\n * Indicates whether the browser can be scrolled when using a touchscreen and dragging on the canvas\n * It gives PRIORITY to DOM scrolling, it doesn't make it always possible.\n * If is true, when using a touch event on the canvas, the canvas will scroll if scroll is possible.\n * If we are in drawing mode or if we are selecting an object the canvas preventDefault and so it won't scroll\n * @type Boolean\n *\n * @todo move to Canvas\n */\n allowTouchScrolling: boolean;\n\n /**\n * The transformation (a Canvas 2D API transform matrix) which focuses the viewport\n * @type Array\n * @example Default transform\n * canvas.viewportTransform = [1, 0, 0, 1, 0, 0];\n * @example Scale by 70% and translate toward bottom-right by 50, without skewing\n * canvas.viewportTransform = [0.7, 0, 0, 0.7, 50, 50];\n */\n viewportTransform: TMat2D;\n}\n\nexport const staticCanvasDefaults: TOptions = {\n backgroundVpt: true,\n backgroundColor: '',\n overlayVpt: true,\n overlayColor: '',\n\n includeDefaultValues: true,\n svgViewportTransformation: true,\n\n renderOnAddRemove: true,\n skipOffscreen: true,\n enableRetinaScaling: true,\n imageSmoothingEnabled: true,\n\n /**\n * @todo move to Canvas\n */\n controlsAboveOverlay: false,\n /**\n * @todo move to Canvas\n */\n allowTouchScrolling: false,\n\n viewportTransform: [...iMatrix],\n};\n","import { config } from '../config';\nimport { CENTER, VERSION } from '../constants';\nimport type { CanvasEvents, StaticCanvasEvents } from '../EventTypeDefs';\nimport type { Gradient } from '../gradient/Gradient';\nimport { createCollectionMixin, isCollection } from '../Collection';\nimport { CommonMethods } from '../CommonMethods';\nimport type { Pattern } from '../Pattern';\nimport { Point } from '../Point';\nimport type { TCachedFabricObject } from '../shapes/Object/Object';\nimport type {\n Abortable,\n Constructor,\n TCornerPoint,\n TDataUrlOptions,\n TFiller,\n TMat2D,\n TSize,\n TSVGReviver,\n TToCanvasElementOptions,\n TValidToObjectMethod,\n TOptions,\n} from '../typedefs';\nimport {\n cancelAnimFrame,\n requestAnimFrame,\n} from '../util/animation/AnimationFrameProvider';\nimport { runningAnimations } from '../util/animation/AnimationRegistry';\nimport { uid } from '../util/internals/uid';\nimport { createCanvasElementFor, toBlob, toDataURL } from '../util/misc/dom';\nimport { invertTransform, transformPoint } from '../util/misc/matrix';\nimport type { EnlivenObjectOptions } from '../util/misc/objectEnlive';\nimport {\n enlivenObjectEnlivables,\n enlivenObjects,\n} from '../util/misc/objectEnlive';\nimport { pick } from '../util/misc/pick';\nimport { matrixToSVG } from '../util/misc/svgExport';\nimport { toFixed } from '../util/misc/toFixed';\nimport { isFiller, isPattern, isTextObject } from '../util/typeAssertions';\nimport { StaticCanvasDOMManager } from './DOMManagers/StaticCanvasDOMManager';\nimport type { CSSDimensions } from './DOMManagers/util';\nimport type { FabricObject } from '../shapes/Object/FabricObject';\nimport type { StaticCanvasOptions } from './StaticCanvasOptions';\nimport { staticCanvasDefaults } from './StaticCanvasOptions';\nimport { log, FabricError } from '../util/internals/console';\nimport { getDevicePixelRatio } from '../env';\n\n/**\n * Having both options in TCanvasSizeOptions set to true transform the call in a calcOffset\n * Better try to restrict with types to avoid confusion.\n */\nexport type TCanvasSizeOptions =\n | {\n backstoreOnly?: true;\n cssOnly?: false;\n }\n | {\n backstoreOnly?: false;\n cssOnly?: true;\n };\n\nexport type TSVGExportOptions = {\n suppressPreamble?: boolean;\n viewBox?: {\n x: number;\n y: number;\n width: number;\n height: number;\n };\n encoding?: 'UTF-8'; // test Encoding type and see what happens\n width?: string;\n height?: string;\n reviver?: TSVGReviver;\n};\n\n/**\n * Static canvas class\n * @see {@link http://fabricjs.com/static_canvas|StaticCanvas demo}\n * @fires before:render\n * @fires after:render\n * @fires canvas:cleared\n * @fires object:added\n * @fires object:removed\n */\n// TODO: fix `EventSpec` inheritance https://github.com/microsoft/TypeScript/issues/26154#issuecomment-1366616260\nexport class StaticCanvas<\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n EventSpec extends StaticCanvasEvents = StaticCanvasEvents,\n >\n extends createCollectionMixin(CommonMethods)\n implements StaticCanvasOptions\n{\n declare width: number;\n declare height: number;\n\n // background\n declare backgroundVpt: boolean;\n declare backgroundColor: TFiller | string;\n declare backgroundImage?: FabricObject;\n // overlay\n declare overlayVpt: boolean;\n declare overlayColor: TFiller | string;\n declare overlayImage?: FabricObject;\n\n declare clipPath?: FabricObject;\n\n declare includeDefaultValues: boolean;\n\n // rendering config\n declare renderOnAddRemove: boolean;\n declare skipOffscreen: boolean;\n declare enableRetinaScaling: boolean;\n declare imageSmoothingEnabled: boolean;\n\n /**\n * @todo move to Canvas\n */\n declare controlsAboveOverlay: boolean;\n\n /**\n * @todo move to Canvas\n */\n declare allowTouchScrolling: boolean;\n\n declare viewportTransform: TMat2D;\n\n /**\n * The viewport bounding box in scene plane coordinates, see {@link calcViewportBoundaries}\n */\n declare vptCoords: TCornerPoint;\n\n /**\n * A reference to the canvas actual HTMLCanvasElement.\n * Can be use to read the raw pixels, but never write or manipulate\n * @type HTMLCanvasElement\n */\n get lowerCanvasEl() {\n return this.elements.lower?.el;\n }\n\n get contextContainer() {\n return this.elements.lower?.ctx;\n }\n\n /**\n * If true the Canvas is in the process or has been disposed/destroyed.\n * No more rendering operation will be executed on this canvas.\n * @type boolean\n */\n declare destroyed?: boolean;\n\n /**\n * Started the process of disposing but not done yet.\n * WIll likely complete the render cycle already scheduled but stopping adding more.\n * @type boolean\n */\n declare disposed?: boolean;\n\n declare _offset: { left: number; top: number };\n declare protected hasLostContext: boolean;\n declare protected nextRenderHandle: number;\n\n declare elements: StaticCanvasDOMManager;\n\n /**\n * When true control drawing is skipped.\n * This boolean is used to avoid toDataURL to export controls.\n * Usage of this boolean to build up other flows and features is not supported\n * @type Boolean\n * @default false\n */\n declare protected skipControlsDrawing: boolean;\n\n static ownDefaults = staticCanvasDefaults;\n\n // reference to\n declare protected __cleanupTask?: {\n (): void;\n kill: (reason?: any) => void;\n };\n\n static getDefaults(): Record {\n return StaticCanvas.ownDefaults;\n }\n\n constructor(\n el?: string | HTMLCanvasElement,\n options: TOptions = {},\n ) {\n super();\n Object.assign(\n this,\n (this.constructor as typeof StaticCanvas).getDefaults(),\n );\n this.set(options);\n this.initElements(el);\n this._setDimensionsImpl({\n width: this.width || this.elements.lower.el.width || 0,\n height: this.height || this.elements.lower.el.height || 0,\n });\n this.skipControlsDrawing = false;\n this.viewportTransform = [...this.viewportTransform];\n this.calcViewportBoundaries();\n }\n\n protected initElements(el?: string | HTMLCanvasElement) {\n this.elements = new StaticCanvasDOMManager(el);\n }\n\n add(...objects: FabricObject[]) {\n const size = super.add(...objects);\n objects.length > 0 && this.renderOnAddRemove && this.requestRenderAll();\n return size;\n }\n\n insertAt(index: number, ...objects: FabricObject[]) {\n const size = super.insertAt(index, ...objects);\n objects.length > 0 && this.renderOnAddRemove && this.requestRenderAll();\n return size;\n }\n\n remove(...objects: FabricObject[]) {\n const removed = super.remove(...objects);\n removed.length > 0 && this.renderOnAddRemove && this.requestRenderAll();\n return removed;\n }\n\n _onObjectAdded(obj: FabricObject) {\n if (obj.canvas && (obj.canvas as StaticCanvas) !== this) {\n log(\n 'warn',\n 'Canvas is trying to add an object that belongs to a different canvas.\\n' +\n 'Resulting to default behavior: removing object from previous canvas and adding to new canvas',\n );\n obj.canvas.remove(obj);\n }\n obj._set('canvas', this);\n obj.setCoords();\n this.fire('object:added', { target: obj });\n obj.fire('added', { target: this });\n }\n\n _onObjectRemoved(obj: FabricObject) {\n obj._set('canvas', undefined);\n this.fire('object:removed', { target: obj });\n obj.fire('removed', { target: this });\n }\n\n _onStackOrderChanged() {\n this.renderOnAddRemove && this.requestRenderAll();\n }\n\n /**\n * @private\n * @see https://developer.apple.com/library/safari/documentation/AudioVideo/Conceptual/HTML-canvas-guide/SettingUptheCanvas/SettingUptheCanvas.html\n * @return {Number} retinaScaling if applied, otherwise 1;\n */\n getRetinaScaling() {\n return this.enableRetinaScaling ? getDevicePixelRatio() : 1;\n }\n\n /**\n * Calculates canvas element offset relative to the document\n * This method is also attached as \"resize\" event handler of window\n */\n calcOffset() {\n return (this._offset = this.elements.calcOffset());\n }\n\n /**\n * Returns canvas width (in px)\n * @return {Number}\n */\n getWidth(): number {\n return this.width;\n }\n\n /**\n * Returns canvas height (in px)\n * @return {Number}\n */\n getHeight(): number {\n return this.height;\n }\n\n /**\n * Internal use only\n * @protected\n */\n protected _setDimensionsImpl(\n dimensions: Partial,\n { cssOnly = false, backstoreOnly = false }: TCanvasSizeOptions = {},\n ) {\n if (!cssOnly) {\n const size = {\n width: this.width,\n height: this.height,\n ...(dimensions as Partial),\n };\n this.elements.setDimensions(size, this.getRetinaScaling());\n this.hasLostContext = true;\n this.width = size.width;\n this.height = size.height;\n }\n if (!backstoreOnly) {\n this.elements.setCSSDimensions(dimensions);\n }\n\n this.calcOffset();\n }\n\n /**\n * Sets dimensions (width, height) of this canvas instance. when options.cssOnly flag active you should also supply the unit of measure (px/%/em)\n * @param {Object} dimensions Object with width/height properties\n * @param {Number|String} [dimensions.width] Width of canvas element\n * @param {Number|String} [dimensions.height] Height of canvas element\n * @param {Object} [options] Options object\n * @param {Boolean} [options.backstoreOnly=false] Set the given dimensions only as canvas backstore dimensions\n * @param {Boolean} [options.cssOnly=false] Set the given dimensions only as css dimensions\n */\n setDimensions(\n dimensions: Partial,\n options?: { cssOnly?: true; backstoreOnly?: false },\n ): void;\n setDimensions(\n dimensions: Partial,\n options?: { backstoreOnly?: true; cssOnly?: false },\n ): void;\n setDimensions(dimensions: Partial, options?: never): void;\n setDimensions(\n dimensions: Partial,\n options?: TCanvasSizeOptions,\n ) {\n this._setDimensionsImpl(dimensions, options);\n if (!options || !options.cssOnly) {\n this.requestRenderAll();\n }\n }\n\n /**\n * Returns canvas zoom level\n * @return {Number}\n */\n getZoom() {\n return this.viewportTransform[0];\n }\n\n /**\n * Sets viewport transformation of this canvas instance\n * @param {Array} vpt a Canvas 2D API transform matrix\n */\n setViewportTransform(vpt: TMat2D) {\n this.viewportTransform = vpt;\n this.calcViewportBoundaries();\n this.renderOnAddRemove && this.requestRenderAll();\n }\n\n /**\n * Sets zoom level of this canvas instance, the zoom centered around point\n * meaning that following zoom to point with the same point will have the visual\n * effect of the zoom originating from that point. The point won't move.\n * It has nothing to do with canvas center or visual center of the viewport.\n * @param {Point} point to zoom with respect to\n * @param {Number} value to set zoom to, less than 1 zooms out\n */\n zoomToPoint(point: Point, value: number) {\n // TODO: just change the scale, preserve other transformations\n const before = point,\n vpt: TMat2D = [...this.viewportTransform];\n const newPoint = transformPoint(point, invertTransform(vpt));\n vpt[0] = value;\n vpt[3] = value;\n const after = transformPoint(newPoint, vpt);\n vpt[4] += before.x - after.x;\n vpt[5] += before.y - after.y;\n this.setViewportTransform(vpt);\n }\n\n /**\n * Sets zoom level of this canvas instance\n * @param {Number} value to set zoom to, less than 1 zooms out\n */\n setZoom(value: number) {\n this.zoomToPoint(new Point(0, 0), value);\n }\n\n /**\n * Pan viewport so as to place point at top left corner of canvas\n * @param {Point} point to move to\n */\n absolutePan(point: Point) {\n const vpt: TMat2D = [...this.viewportTransform];\n vpt[4] = -point.x;\n vpt[5] = -point.y;\n return this.setViewportTransform(vpt);\n }\n\n /**\n * Pans viewpoint relatively\n * @param {Point} point (position vector) to move by\n */\n relativePan(point: Point) {\n return this.absolutePan(\n new Point(\n -point.x - this.viewportTransform[4],\n -point.y - this.viewportTransform[5],\n ),\n );\n }\n\n /**\n * Returns <canvas> element corresponding to this instance\n * @return {HTMLCanvasElement}\n */\n getElement(): HTMLCanvasElement {\n return this.elements.lower.el;\n }\n\n /**\n * Clears specified context of canvas element\n * @param {CanvasRenderingContext2D} ctx Context to clear\n */\n clearContext(ctx: CanvasRenderingContext2D) {\n ctx.clearRect(0, 0, this.width, this.height);\n }\n\n /**\n * Returns context of canvas where objects are drawn\n * @return {CanvasRenderingContext2D}\n */\n getContext(): CanvasRenderingContext2D {\n return this.elements.lower.ctx;\n }\n\n /**\n * Clears all contexts (background, main, top) of an instance\n */\n clear() {\n this.remove(...this.getObjects());\n this.backgroundImage = undefined;\n this.overlayImage = undefined;\n this.backgroundColor = '';\n this.overlayColor = '';\n this.clearContext(this.getContext());\n this.fire('canvas:cleared');\n this.renderOnAddRemove && this.requestRenderAll();\n }\n\n /**\n * Renders the canvas\n */\n renderAll() {\n this.cancelRequestedRender();\n if (this.destroyed) {\n return;\n }\n this.renderCanvas(this.getContext(), this._objects);\n }\n\n /**\n * Function created to be instance bound at initialization\n * used in requestAnimationFrame rendering\n * Let the fabricJS call it. If you call it manually you could have more\n * animationFrame stacking on to of each other\n * for an imperative rendering, use canvas.renderAll\n * @private\n */\n renderAndReset() {\n this.nextRenderHandle = 0;\n this.renderAll();\n }\n\n /**\n * Append a renderAll request to next animation frame.\n * unless one is already in progress, in that case nothing is done\n * a boolean flag will avoid appending more.\n */\n requestRenderAll() {\n if (!this.nextRenderHandle && !this.disposed && !this.destroyed) {\n this.nextRenderHandle = requestAnimFrame(() => this.renderAndReset());\n }\n }\n\n /**\n * Calculate the position of the 4 corner of canvas with current viewportTransform.\n * helps to determinate when an object is in the current rendering viewport\n */\n calcViewportBoundaries(): TCornerPoint {\n const width = this.width,\n height = this.height,\n iVpt = invertTransform(this.viewportTransform),\n a = transformPoint({ x: 0, y: 0 }, iVpt),\n b = transformPoint({ x: width, y: height }, iVpt),\n // we don't support vpt flipping\n // but the code is robust enough to mostly work with flipping\n min = a.min(b),\n max = a.max(b);\n return (this.vptCoords = {\n tl: min,\n tr: new Point(max.x, min.y),\n bl: new Point(min.x, max.y),\n br: max,\n });\n }\n\n cancelRequestedRender() {\n if (this.nextRenderHandle) {\n cancelAnimFrame(this.nextRenderHandle);\n this.nextRenderHandle = 0;\n }\n }\n\n drawControls(_ctx: CanvasRenderingContext2D) {\n // Static canvas has no controls\n }\n\n /**\n * Renders background, objects, overlay and controls.\n * @param {CanvasRenderingContext2D} ctx\n * @param {Array} objects to render\n */\n renderCanvas(ctx: CanvasRenderingContext2D, objects: FabricObject[]) {\n if (this.destroyed) {\n return;\n }\n\n const v = this.viewportTransform,\n path = this.clipPath;\n this.calcViewportBoundaries();\n this.clearContext(ctx);\n ctx.imageSmoothingEnabled = this.imageSmoothingEnabled;\n // @ts-expect-error node-canvas stuff\n ctx.patternQuality = 'best';\n this.fire('before:render', { ctx });\n this._renderBackground(ctx);\n\n ctx.save();\n //apply viewport transform once for all rendering process\n ctx.transform(v[0], v[1], v[2], v[3], v[4], v[5]);\n this._renderObjects(ctx, objects);\n ctx.restore();\n if (!this.controlsAboveOverlay && !this.skipControlsDrawing) {\n this.drawControls(ctx);\n }\n if (path) {\n path._set('canvas', this);\n // needed to setup a couple of variables\n // todo migrate to the newer one\n path.shouldCache();\n path._transformDone = true;\n (path as TCachedFabricObject).renderCache({ forClipping: true });\n this.drawClipPathOnCanvas(ctx, path as TCachedFabricObject);\n }\n this._renderOverlay(ctx);\n if (this.controlsAboveOverlay && !this.skipControlsDrawing) {\n this.drawControls(ctx);\n }\n this.fire('after:render', { ctx });\n\n if (this.__cleanupTask) {\n this.__cleanupTask();\n this.__cleanupTask = undefined;\n }\n }\n\n /**\n * Paint the cached clipPath on the lowerCanvasEl\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n drawClipPathOnCanvas(\n ctx: CanvasRenderingContext2D,\n clipPath: TCachedFabricObject,\n ) {\n const v = this.viewportTransform;\n ctx.save();\n ctx.transform(...v);\n // DEBUG: uncomment this line, comment the following\n // ctx.globalAlpha = 0.4;\n ctx.globalCompositeOperation = 'destination-in';\n clipPath.transform(ctx);\n ctx.scale(1 / clipPath.zoomX, 1 / clipPath.zoomY);\n ctx.drawImage(\n clipPath._cacheCanvas,\n -clipPath.cacheTranslationX,\n -clipPath.cacheTranslationY,\n );\n ctx.restore();\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n * @param {Array} objects to render\n */\n _renderObjects(ctx: CanvasRenderingContext2D, objects: FabricObject[]) {\n for (let i = 0, len = objects.length; i < len; ++i) {\n objects[i] && objects[i].render(ctx);\n }\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n * @param {string} property 'background' or 'overlay'\n */\n _renderBackgroundOrOverlay(\n ctx: CanvasRenderingContext2D,\n property: 'background' | 'overlay',\n ) {\n const fill = this[`${property}Color`],\n object = this[`${property}Image`],\n v = this.viewportTransform,\n needsVpt = this[`${property}Vpt`];\n if (!fill && !object) {\n return;\n }\n const isAFiller = isFiller(fill);\n if (fill) {\n ctx.save();\n ctx.beginPath();\n ctx.moveTo(0, 0);\n ctx.lineTo(this.width, 0);\n ctx.lineTo(this.width, this.height);\n ctx.lineTo(0, this.height);\n ctx.closePath();\n ctx.fillStyle = isAFiller ? fill.toLive(ctx /* this */)! : fill;\n if (needsVpt) {\n ctx.transform(...v);\n }\n if (isAFiller) {\n ctx.transform(1, 0, 0, 1, fill.offsetX || 0, fill.offsetY || 0);\n const m = ((fill as Gradient<'linear'>).gradientTransform ||\n (fill as Pattern).patternTransform) as TMat2D;\n m && ctx.transform(...m);\n }\n ctx.fill();\n ctx.restore();\n }\n if (object) {\n ctx.save();\n const { skipOffscreen } = this;\n // if the object doesn't move with the viewport,\n // the offscreen concept does not apply;\n this.skipOffscreen = needsVpt;\n if (needsVpt) {\n ctx.transform(...v);\n }\n object.render(ctx);\n this.skipOffscreen = skipOffscreen;\n ctx.restore();\n }\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _renderBackground(ctx: CanvasRenderingContext2D) {\n this._renderBackgroundOrOverlay(ctx, 'background');\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _renderOverlay(ctx: CanvasRenderingContext2D) {\n this._renderBackgroundOrOverlay(ctx, 'overlay');\n }\n\n /**\n * Returns coordinates of a center of canvas.\n * @return {Point}\n */\n getCenterPoint() {\n return new Point(this.width / 2, this.height / 2);\n }\n\n /**\n * Centers object horizontally in the canvas\n */\n centerObjectH(object: FabricObject) {\n return this._centerObject(\n object,\n new Point(this.getCenterPoint().x, object.getCenterPoint().y),\n );\n }\n\n /**\n * Centers object vertically in the canvas\n * @param {FabricObject} object Object to center vertically\n */\n centerObjectV(object: FabricObject) {\n return this._centerObject(\n object,\n new Point(object.getCenterPoint().x, this.getCenterPoint().y),\n );\n }\n\n /**\n * Centers object vertically and horizontally in the canvas\n * @param {FabricObject} object Object to center vertically and horizontally\n */\n centerObject(object: FabricObject) {\n return this._centerObject(object, this.getCenterPoint());\n }\n\n /**\n * Centers object vertically and horizontally in the viewport\n * @param {FabricObject} object Object to center vertically and horizontally\n */\n viewportCenterObject(object: FabricObject) {\n return this._centerObject(object, this.getVpCenter());\n }\n\n /**\n * Centers object horizontally in the viewport, object.top is unchanged\n * @param {FabricObject} object Object to center vertically and horizontally\n */\n viewportCenterObjectH(object: FabricObject) {\n return this._centerObject(\n object,\n new Point(this.getVpCenter().x, object.getCenterPoint().y),\n );\n }\n\n /**\n * Centers object Vertically in the viewport, object.top is unchanged\n * @param {FabricObject} object Object to center vertically and horizontally\n */\n viewportCenterObjectV(object: FabricObject) {\n return this._centerObject(\n object,\n new Point(object.getCenterPoint().x, this.getVpCenter().y),\n );\n }\n\n /**\n * Calculate the point in canvas that correspond to the center of actual viewport.\n * @return {Point} vpCenter, viewport center\n */\n getVpCenter(): Point {\n return transformPoint(\n this.getCenterPoint(),\n invertTransform(this.viewportTransform),\n );\n }\n\n /**\n * @private\n * @param {FabricObject} object Object to center\n * @param {Point} center Center point\n */\n _centerObject(object: FabricObject, center: Point) {\n object.setXY(center, CENTER, CENTER);\n object.setCoords();\n this.renderOnAddRemove && this.requestRenderAll();\n }\n\n /**\n * Returns dataless JSON representation of canvas\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {String} json string\n */\n toDatalessJSON(propertiesToInclude?: string[]) {\n return this.toDatalessObject(propertiesToInclude);\n }\n\n /**\n * Returns object representation of canvas\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} object representation of an instance\n */\n toObject(propertiesToInclude?: string[]) {\n return this._toObjectMethod('toObject', propertiesToInclude);\n }\n\n /**\n * Returns Object representation of canvas\n * this alias is provided because if you call JSON.stringify on an instance,\n * the toJSON object will be invoked if it exists.\n * Having a toJSON method means you can do JSON.stringify(myCanvas)\n * JSON does not support additional properties because toJSON has its own signature\n * @return {Object} JSON compatible object\n * @tutorial {@link http://fabricjs.com/fabric-intro-part-3#serialization}\n * @see {@link http://jsfiddle.net/fabricjs/pec86/|jsFiddle demo}\n * @example JSON representation of canvas \n * const json = canvas.toJSON();\n * @example JSON representation of canvas \n * const json = JSON.stringify(canvas);\n */\n toJSON() {\n return this.toObject();\n }\n\n /**\n * Returns dataless object representation of canvas\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} object representation of an instance\n */\n toDatalessObject(propertiesToInclude?: string[]) {\n return this._toObjectMethod('toDatalessObject', propertiesToInclude);\n }\n\n /**\n * @private\n */\n _toObjectMethod(\n methodName: TValidToObjectMethod,\n propertiesToInclude?: string[],\n ) {\n const clipPath = this.clipPath;\n const clipPathData =\n clipPath && !clipPath.excludeFromExport\n ? this._toObject(clipPath, methodName, propertiesToInclude)\n : null;\n return {\n version: VERSION,\n ...pick(this, propertiesToInclude as (keyof this)[]),\n objects: this._objects\n .filter((object) => !object.excludeFromExport)\n .map((instance) =>\n this._toObject(instance, methodName, propertiesToInclude),\n ),\n ...this.__serializeBgOverlay(methodName, propertiesToInclude),\n ...(clipPathData ? { clipPath: clipPathData } : null),\n };\n }\n\n /**\n * @private\n */\n protected _toObject(\n instance: FabricObject,\n methodName: TValidToObjectMethod,\n propertiesToInclude?: string[],\n ) {\n let originalValue;\n\n if (!this.includeDefaultValues) {\n originalValue = instance.includeDefaultValues;\n instance.includeDefaultValues = false;\n }\n\n const object = instance[methodName](propertiesToInclude);\n if (!this.includeDefaultValues) {\n instance.includeDefaultValues = !!originalValue;\n }\n return object;\n }\n\n /**\n * @private\n */\n __serializeBgOverlay(\n methodName: TValidToObjectMethod,\n propertiesToInclude?: string[],\n ) {\n const data: any = {},\n bgImage = this.backgroundImage,\n overlayImage = this.overlayImage,\n bgColor = this.backgroundColor,\n overlayColor = this.overlayColor;\n\n if (isFiller(bgColor)) {\n if (!bgColor.excludeFromExport) {\n data.background = bgColor.toObject(propertiesToInclude);\n }\n } else if (bgColor) {\n data.background = bgColor;\n }\n\n if (isFiller(overlayColor)) {\n if (!overlayColor.excludeFromExport) {\n data.overlay = overlayColor.toObject(propertiesToInclude);\n }\n } else if (overlayColor) {\n data.overlay = overlayColor;\n }\n\n if (bgImage && !bgImage.excludeFromExport) {\n data.backgroundImage = this._toObject(\n bgImage,\n methodName,\n propertiesToInclude,\n );\n }\n if (overlayImage && !overlayImage.excludeFromExport) {\n data.overlayImage = this._toObject(\n overlayImage,\n methodName,\n propertiesToInclude,\n );\n }\n\n return data;\n }\n\n /* _TO_SVG_START_ */\n\n declare svgViewportTransformation: boolean;\n\n /**\n * Returns SVG representation of canvas\n * @function\n * @param {Object} [options] Options object for SVG output\n * @param {Boolean} [options.suppressPreamble=false] If true xml tag is not included\n * @param {Object} [options.viewBox] SVG viewbox object\n * @param {Number} [options.viewBox.x] x-coordinate of viewbox\n * @param {Number} [options.viewBox.y] y-coordinate of viewbox\n * @param {Number} [options.viewBox.width] Width of viewbox\n * @param {Number} [options.viewBox.height] Height of viewbox\n * @param {String} [options.encoding=UTF-8] Encoding of SVG output\n * @param {String} [options.width] desired width of svg with or without units\n * @param {String} [options.height] desired height of svg with or without units\n * @param {Function} [reviver] Method for further parsing of svg elements, called after each fabric object converted into svg representation.\n * @return {String} SVG string\n * @tutorial {@link http://fabricjs.com/fabric-intro-part-3#serialization}\n * @see {@link http://jsfiddle.net/fabricjs/jQ3ZZ/|jsFiddle demo}\n * @example Normal SVG output\n * var svg = canvas.toSVG();\n * @example SVG output without preamble (without <?xml ../>)\n * var svg = canvas.toSVG({suppressPreamble: true});\n * @example SVG output with viewBox attribute\n * var svg = canvas.toSVG({\n * viewBox: {\n * x: 100,\n * y: 100,\n * width: 200,\n * height: 300\n * }\n * });\n * @example SVG output with different encoding (default: UTF-8)\n * var svg = canvas.toSVG({encoding: 'ISO-8859-1'});\n * @example Modify SVG output with reviver function\n * var svg = canvas.toSVG(null, function(svg) {\n * return svg.replace('stroke-dasharray: ; stroke-linecap: butt; stroke-linejoin: miter; stroke-miterlimit: 10; ', '');\n * });\n */\n toSVG(options: TSVGExportOptions = {}, reviver?: TSVGReviver) {\n options.reviver = reviver;\n const markup: string[] = [];\n\n this._setSVGPreamble(markup, options);\n this._setSVGHeader(markup, options);\n if (this.clipPath) {\n markup.push(`\\n`);\n }\n this._setSVGBgOverlayColor(markup, 'background');\n this._setSVGBgOverlayImage(markup, 'backgroundImage', reviver);\n this._setSVGObjects(markup, reviver);\n if (this.clipPath) {\n markup.push('\\n');\n }\n this._setSVGBgOverlayColor(markup, 'overlay');\n this._setSVGBgOverlayImage(markup, 'overlayImage', reviver);\n\n markup.push('');\n\n return markup.join('');\n }\n\n /**\n * @private\n */\n _setSVGPreamble(markup: string[], options: TSVGExportOptions): void {\n if (options.suppressPreamble) {\n return;\n }\n markup.push(\n '\\n',\n '\\n',\n );\n }\n\n /**\n * @private\n */\n _setSVGHeader(markup: string[], options: TSVGExportOptions): void {\n const width = options.width || `${this.width}`,\n height = options.height || `${this.height}`,\n NUM_FRACTION_DIGITS = config.NUM_FRACTION_DIGITS,\n optViewBox = options.viewBox;\n let viewBox: string;\n if (optViewBox) {\n viewBox = `viewBox=\"${optViewBox.x} ${optViewBox.y} ${optViewBox.width} ${optViewBox.height}\" `;\n } else if (this.svgViewportTransformation) {\n const vpt = this.viewportTransform;\n viewBox = `viewBox=\"${toFixed(\n -vpt[4] / vpt[0],\n NUM_FRACTION_DIGITS,\n )} ${toFixed(-vpt[5] / vpt[3], NUM_FRACTION_DIGITS)} ${toFixed(\n this.width / vpt[0],\n NUM_FRACTION_DIGITS,\n )} ${toFixed(this.height / vpt[3], NUM_FRACTION_DIGITS)}\" `;\n } else {\n viewBox = `viewBox=\"0 0 ${this.width} ${this.height}\" `;\n }\n\n markup.push(\n '\\n',\n 'Created with Fabric.js ',\n VERSION,\n '\\n',\n '\\n',\n this.createSVGFontFacesMarkup(),\n this.createSVGRefElementsMarkup(),\n this.createSVGClipPathMarkup(options),\n '\\n',\n );\n }\n\n createSVGClipPathMarkup(options: TSVGExportOptions): string {\n const clipPath = this.clipPath;\n if (clipPath) {\n clipPath.clipPathId = `CLIPPATH_${uid()}`;\n return `\\n${clipPath.toClipPathSVG(\n options.reviver,\n )}\\n`;\n }\n return '';\n }\n\n /**\n * Creates markup containing SVG referenced elements like patterns, gradients etc.\n * @return {String}\n */\n createSVGRefElementsMarkup(): string {\n return (['background', 'overlay'] as const)\n .map((prop) => {\n const fill = this[`${prop}Color`];\n if (isFiller(fill)) {\n const shouldTransform = this[`${prop}Vpt`],\n vpt = this.viewportTransform,\n object = {\n // otherwise circular dependency\n isType: () => false,\n width: this.width / (shouldTransform ? vpt[0] : 1),\n height: this.height / (shouldTransform ? vpt[3] : 1),\n };\n return fill.toSVG(object as FabricObject, {\n additionalTransform: shouldTransform ? matrixToSVG(vpt) : '',\n });\n }\n })\n .join('');\n }\n\n /**\n * Creates markup containing SVG font faces,\n * font URLs for font faces must be collected by developers\n * and are not extracted from the DOM by fabricjs\n * @param {Array} objects Array of fabric objects\n * @return {String}\n */\n createSVGFontFacesMarkup(): string {\n const objects: FabricObject[] = [],\n fontList: Record = {},\n fontPaths = config.fontPaths;\n\n this._objects.forEach(function add(object) {\n objects.push(object);\n if (isCollection(object)) {\n object._objects.forEach(add);\n }\n });\n\n objects.forEach((obj) => {\n if (!isTextObject(obj)) {\n return;\n }\n const { styles, fontFamily } = obj;\n if (fontList[fontFamily] || !fontPaths[fontFamily]) {\n return;\n }\n fontList[fontFamily] = true;\n if (!styles) {\n return;\n }\n Object.values(styles).forEach((styleRow) => {\n Object.values(styleRow).forEach(({ fontFamily = '' }) => {\n if (!fontList[fontFamily] && fontPaths[fontFamily]) {\n fontList[fontFamily] = true;\n }\n });\n });\n });\n\n const fontListMarkup = Object.keys(fontList)\n .map(\n (fontFamily) =>\n `\\t\\t@font-face {\\n\\t\\t\\tfont-family: '${fontFamily}';\\n\\t\\t\\tsrc: url('${fontPaths[fontFamily]}');\\n\\t\\t}\\n`,\n )\n .join('');\n\n if (fontListMarkup) {\n return `\\t\\n`;\n }\n return '';\n }\n\n /**\n * @private\n */\n _setSVGObjects(markup: string[], reviver?: TSVGReviver) {\n this.forEachObject((fabricObject) => {\n if (fabricObject.excludeFromExport) {\n return;\n }\n this._setSVGObject(markup, fabricObject, reviver);\n });\n }\n\n /**\n * This is its own function because the Canvas ( non static ) requires extra code here\n * @private\n */\n _setSVGObject(\n markup: string[],\n instance: FabricObject,\n reviver?: TSVGReviver,\n ) {\n markup.push(instance.toSVG(reviver));\n }\n\n /**\n * @private\n */\n _setSVGBgOverlayImage(\n markup: string[],\n property: 'overlayImage' | 'backgroundImage',\n reviver?: TSVGReviver,\n ) {\n const bgOrOverlay = this[property];\n if (bgOrOverlay && !bgOrOverlay.excludeFromExport && bgOrOverlay.toSVG) {\n markup.push(bgOrOverlay.toSVG(reviver));\n }\n }\n\n /**\n * @TODO this seems to handle patterns but fail at gradients.\n * @private\n */\n _setSVGBgOverlayColor(markup: string[], property: 'background' | 'overlay') {\n const filler = this[`${property}Color`];\n if (!filler) {\n return;\n }\n if (isFiller(filler)) {\n const repeat = (filler as Pattern).repeat || '',\n finalWidth = this.width,\n finalHeight = this.height,\n shouldInvert = this[`${property}Vpt`],\n additionalTransform = shouldInvert\n ? matrixToSVG(invertTransform(this.viewportTransform))\n : '';\n markup.push(\n `\\n`,\n );\n } else {\n markup.push(\n '\\n',\n );\n }\n }\n /* _TO_SVG_END_ */\n\n /**\n * Populates canvas with data from the specified JSON.\n * JSON format must conform to the one of {@link fabric.Canvas#toJSON}\n *\n * **IMPORTANT**: It is recommended to abort loading tasks before calling this method to prevent race conditions and unnecessary networking\n *\n * @param {String|Object} json JSON string or object\n * @param {Function} [reviver] Method for further parsing of JSON elements, called after each fabric object created.\n * @param {Object} [options] options\n * @param {AbortSignal} [options.signal] see https://developer.mozilla.org/en-US/docs/Web/API/AbortController/signal\n * @return {Promise} instance\n * @tutorial {@link http://fabricjs.com/fabric-intro-part-3#deserialization}\n * @see {@link http://jsfiddle.net/fabricjs/fmgXt/|jsFiddle demo}\n * @example loadFromJSON\n * canvas.loadFromJSON(json).then((canvas) => canvas.requestRenderAll());\n * @example loadFromJSON with reviver\n * canvas.loadFromJSON(json, function(o, object) {\n * // `o` = json object\n * // `object` = fabric.Object instance\n * // ... do some stuff ...\n * }).then((canvas) => {\n * ... canvas is restored, add your code.\n * });\n *\n */\n loadFromJSON(\n json: string | Record,\n reviver?: EnlivenObjectOptions['reviver'],\n { signal }: Abortable = {},\n ): Promise {\n if (!json) {\n return Promise.reject(new FabricError('`json` is undefined'));\n }\n\n // parse json if it wasn't already\n const serialized = typeof json === 'string' ? JSON.parse(json) : json;\n const {\n objects = [],\n backgroundImage,\n background,\n overlayImage,\n overlay,\n clipPath,\n } = serialized;\n const renderOnAddRemove = this.renderOnAddRemove;\n this.renderOnAddRemove = false;\n\n return Promise.all([\n enlivenObjects(objects, {\n reviver,\n signal,\n }),\n enlivenObjectEnlivables(\n {\n backgroundImage,\n backgroundColor: background,\n overlayImage,\n overlayColor: overlay,\n clipPath,\n },\n { signal },\n ),\n ]).then(([enlived, enlivedMap]) => {\n this.clear();\n this.add(...enlived);\n this.set(serialized);\n this.set(enlivedMap);\n this.renderOnAddRemove = renderOnAddRemove;\n return this;\n });\n }\n\n /**\n * Clones canvas instance\n * @param {string[]} [properties] Array of properties to include in the cloned canvas and children\n */\n clone(properties: string[]) {\n const data = this.toObject(properties);\n const canvas = this.cloneWithoutData();\n return canvas.loadFromJSON(data);\n }\n\n /**\n * Clones canvas instance without cloning existing data.\n * This essentially copies canvas dimensions since loadFromJSON does not affect canvas size.\n */\n cloneWithoutData() {\n const el = createCanvasElementFor(this);\n return new (this.constructor as Constructor)(el);\n }\n\n /**\n * Exports canvas element to a dataurl image. Note that when multiplier is used, cropping is scaled appropriately\n * @param {Object} [options] Options object\n * @param {String} [options.format=png] The format of the output image. Either \"jpeg\" or \"png\"\n * @param {Number} [options.quality=1] Quality level (0..1). Only used for jpeg.\n * @param {Number} [options.multiplier=1] Multiplier to scale by, to have consistent\n * @param {Number} [options.left] Cropping left offset. Introduced in v1.2.14\n * @param {Number} [options.top] Cropping top offset. Introduced in v1.2.14\n * @param {Number} [options.width] Cropping width. Introduced in v1.2.14\n * @param {Number} [options.height] Cropping height. Introduced in v1.2.14\n * @param {Boolean} [options.enableRetinaScaling] Enable retina scaling for clone image. Introduce in 2.0.0\n * @param {(object: fabric.Object) => boolean} [options.filter] Function to filter objects.\n * @return {String} Returns a data: URL containing a representation of the object in the format specified by options.format\n * @see {@link https://jsfiddle.net/xsjua1rd/ demo}\n * @example Generate jpeg dataURL with lower quality\n * var dataURL = canvas.toDataURL({\n * format: 'jpeg',\n * quality: 0.8\n * });\n * @example Generate cropped png dataURL (clipping of canvas)\n * var dataURL = canvas.toDataURL({\n * format: 'png',\n * left: 100,\n * top: 100,\n * width: 200,\n * height: 200\n * });\n * @example Generate double scaled png dataURL\n * var dataURL = canvas.toDataURL({\n * format: 'png',\n * multiplier: 2\n * });\n * @example Generate dataURL with objects that overlap a specified object\n * var myObject;\n * var dataURL = canvas.toDataURL({\n * filter: (object) => object.isContainedWithinObject(myObject) || object.intersectsWithObject(myObject)\n * });\n */\n toDataURL(options = {} as TDataUrlOptions): string {\n const {\n format = 'png',\n quality = 1,\n multiplier = 1,\n enableRetinaScaling = false,\n } = options;\n const finalMultiplier =\n multiplier * (enableRetinaScaling ? this.getRetinaScaling() : 1);\n\n return toDataURL(\n this.toCanvasElement(finalMultiplier, options),\n format,\n quality,\n );\n }\n toBlob(options = {} as TDataUrlOptions): Promise {\n const {\n format = 'png',\n quality = 1,\n multiplier = 1,\n enableRetinaScaling = false,\n } = options;\n const finalMultiplier =\n multiplier * (enableRetinaScaling ? this.getRetinaScaling() : 1);\n\n return toBlob(\n this.toCanvasElement(finalMultiplier, options),\n format,\n quality,\n );\n }\n\n /**\n * Create a new HTMLCanvas element painted with the current canvas content.\n * No need to resize the actual one or repaint it.\n * Will transfer object ownership to a new canvas, paint it, and set everything back.\n * This is an intermediary step used to get to a dataUrl but also it is useful to\n * create quick image copies of a canvas without passing for the dataUrl string\n * @param {Number} [multiplier] a zoom factor.\n * @param {Object} [options] Cropping informations\n * @param {Number} [options.left] Cropping left offset.\n * @param {Number} [options.top] Cropping top offset.\n * @param {Number} [options.width] Cropping width.\n * @param {Number} [options.height] Cropping height.\n * @param {(object: fabric.Object) => boolean} [options.filter] Function to filter objects.\n */\n toCanvasElement(\n multiplier = 1,\n { width, height, left, top, filter } = {} as TToCanvasElementOptions,\n ): HTMLCanvasElement {\n const scaledWidth = (width || this.width) * multiplier,\n scaledHeight = (height || this.height) * multiplier,\n zoom = this.getZoom(),\n originalWidth = this.width,\n originalHeight = this.height,\n originalSkipControlsDrawing = this.skipControlsDrawing,\n newZoom = zoom * multiplier,\n vp = this.viewportTransform,\n translateX = (vp[4] - (left || 0)) * multiplier,\n translateY = (vp[5] - (top || 0)) * multiplier,\n newVp = [newZoom, 0, 0, newZoom, translateX, translateY] as TMat2D,\n originalRetina = this.enableRetinaScaling,\n canvasEl = createCanvasElementFor({\n width: scaledWidth,\n height: scaledHeight,\n }),\n objectsToRender = filter\n ? this._objects.filter((obj) => filter(obj))\n : this._objects;\n this.enableRetinaScaling = false;\n this.viewportTransform = newVp;\n this.width = scaledWidth;\n this.height = scaledHeight;\n this.skipControlsDrawing = true;\n this.calcViewportBoundaries();\n this.renderCanvas(canvasEl.getContext('2d')!, objectsToRender);\n this.viewportTransform = vp;\n this.width = originalWidth;\n this.height = originalHeight;\n this.calcViewportBoundaries();\n this.enableRetinaScaling = originalRetina;\n this.skipControlsDrawing = originalSkipControlsDrawing;\n return canvasEl;\n }\n\n /**\n * Waits until rendering has settled to destroy the canvas\n * @returns {Promise} a promise resolving to `true` once the canvas has been destroyed or to `false` if the canvas has was already destroyed\n * @throws if aborted by a consequent call\n */\n dispose() {\n !this.disposed &&\n this.elements.cleanupDOM({ width: this.width, height: this.height });\n runningAnimations.cancelByCanvas(this);\n this.disposed = true;\n return new Promise((resolve, reject) => {\n const task = () => {\n this.destroy();\n resolve(true);\n };\n task.kill = reject;\n if (this.__cleanupTask) {\n this.__cleanupTask.kill('aborted');\n }\n\n if (this.destroyed) {\n resolve(false);\n } else if (this.nextRenderHandle) {\n this.__cleanupTask = task;\n } else {\n task();\n }\n });\n }\n\n /**\n * Clears the canvas element, disposes objects and frees resources.\n *\n * Invoked as part of the **async** operation of {@link dispose}.\n *\n * **CAUTION**:\n *\n * This method is **UNSAFE**.\n * You may encounter a race condition using it if there's a requested render.\n * Call this method only if you are sure rendering has settled.\n * Consider using {@link dispose} as it is **SAFE**\n *\n * @private\n */\n destroy() {\n this.destroyed = true;\n this.cancelRequestedRender();\n this.forEachObject((object) => object.dispose());\n this._objects = [];\n if (this.backgroundImage) {\n this.backgroundImage.dispose();\n }\n this.backgroundImage = undefined;\n if (this.overlayImage) {\n this.overlayImage.dispose();\n }\n this.overlayImage = undefined;\n this.elements.dispose();\n }\n\n /**\n * Returns a string representation of an instance\n * @return {String} string representation of an instance\n */\n toString() {\n return `#`;\n }\n}\n","import type { TPointerEvent } from '../EventTypeDefs';\nimport { Point } from '../Point';\nimport { getScrollLeftTop } from './dom_misc';\n\nconst touchEvents = ['touchstart', 'touchmove', 'touchend'];\n\nfunction getTouchInfo(event: TouchEvent | MouseEvent): MouseEvent | Touch {\n const touchProp = (event as TouchEvent).changedTouches;\n if (touchProp && touchProp[0]) {\n return touchProp[0];\n }\n return event as MouseEvent;\n}\n\nexport const getPointer = (event: TPointerEvent): Point => {\n const element = event.target as HTMLElement,\n scroll = getScrollLeftTop(element),\n _evt = getTouchInfo(event);\n return new Point(_evt.clientX + scroll.left, _evt.clientY + scroll.top);\n};\n\nexport const isTouchEvent = (event: TPointerEvent) =>\n touchEvents.includes(event.type) ||\n (event as PointerEvent).pointerType === 'touch';\n\nexport const stopEvent = (e: Event) => {\n e.preventDefault();\n e.stopPropagation();\n};\n","import type { XY } from '../../Point';\nimport type { TBBox } from '../../typedefs';\n\n/**\n * Calculates bounding box (left, top, width, height) from given `points`\n * @param {XY[]} points\n * @return {Object} Object with left, top, width, height properties\n */\nexport const makeBoundingBoxFromPoints = (points: XY[]): TBBox => {\n let left = 0,\n top = 0,\n width = 0,\n height = 0;\n\n for (let i = 0, len = points.length; i < len; i++) {\n const { x, y } = points[i];\n if (x > width || !i) width = x;\n if (x < left || !i) left = x;\n if (y > height || !i) height = y;\n if (y < top || !i) top = y;\n }\n\n return {\n left,\n top,\n width: width - left,\n height: height - top,\n };\n};\n","import { Point } from '../../Point';\nimport { CENTER } from '../../constants';\nimport type { FabricObject } from '../../shapes/Object/Object';\nimport type { TMat2D } from '../../typedefs';\nimport { makeBoundingBoxFromPoints } from './boundingBoxFromPoints';\nimport {\n invertTransform,\n multiplyTransformMatrices,\n qrDecompose,\n} from './matrix';\n\n/**\n * given an object and a transform, apply the inverse transform to the object,\n * this is equivalent to remove from that object that transformation, so that\n * added in a space with the removed transform, the object will be the same as before.\n * Removing from an object a transform that scale by 2 is like scaling it by 1/2.\n * Removing from an object a transform that rotate by 30deg is like rotating by 30deg\n * in the opposite direction.\n * This util is used to add objects inside transformed groups or nested groups.\n * @param {FabricObject} object the object you want to transform\n * @param {TMat2D} transform the destination transform\n */\nexport const removeTransformFromObject = (\n object: FabricObject,\n transform: TMat2D,\n) => {\n const inverted = invertTransform(transform),\n finalTransform = multiplyTransformMatrices(\n inverted,\n object.calcOwnMatrix(),\n );\n applyTransformToObject(object, finalTransform);\n};\n\n/**\n * given an object and a transform, apply the transform to the object.\n * this is equivalent to change the space where the object is drawn.\n * Adding to an object a transform that scale by 2 is like scaling it by 2.\n * This is used when removing an object from an active selection for example.\n * @param {FabricObject} object the object you want to transform\n * @param {Array} transform the destination transform\n */\nexport const addTransformToObject = (object: FabricObject, transform: TMat2D) =>\n applyTransformToObject(\n object,\n multiplyTransformMatrices(transform, object.calcOwnMatrix()),\n );\n\n/**\n * discard an object transform state and apply the one from the matrix.\n * @param {FabricObject} object the object you want to transform\n * @param {Array} transform the destination transform\n */\nexport const applyTransformToObject = (\n object: FabricObject,\n transform: TMat2D,\n) => {\n const { translateX, translateY, scaleX, scaleY, ...otherOptions } =\n qrDecompose(transform),\n center = new Point(translateX, translateY);\n object.flipX = false;\n object.flipY = false;\n Object.assign(object, otherOptions);\n object.set({ scaleX, scaleY });\n object.setPositionByOrigin(center, CENTER, CENTER);\n};\n/**\n * reset an object transform state to neutral. Top and left are not accounted for\n * @param {FabricObject} target object to transform\n */\nexport const resetObjectTransform = (target: FabricObject) => {\n target.scaleX = 1;\n target.scaleY = 1;\n target.skewX = 0;\n target.skewY = 0;\n target.flipX = false;\n target.flipY = false;\n target.rotate(0);\n};\n\n/**\n * Extract Object transform values\n * @param {FabricObject} target object to read from\n * @return {Object} Components of transform\n */\nexport const saveObjectTransform = (target: FabricObject) => ({\n scaleX: target.scaleX,\n scaleY: target.scaleY,\n skewX: target.skewX,\n skewY: target.skewY,\n angle: target.angle,\n left: target.left,\n flipX: target.flipX,\n flipY: target.flipY,\n top: target.top,\n});\n\n/**\n * given a width and height, return the size of the bounding box\n * that can contains the box with width/height with applied transform.\n * Use to calculate the boxes around objects for controls.\n * @param {Number} width\n * @param {Number} height\n * @param {TMat2D} t\n * @returns {Point} size\n */\nexport const sizeAfterTransform = (\n width: number,\n height: number,\n t: TMat2D,\n) => {\n const dimX = width / 2,\n dimY = height / 2,\n points = [\n new Point(-dimX, -dimY),\n new Point(dimX, -dimY),\n new Point(-dimX, dimY),\n new Point(dimX, dimY),\n ].map((p) => p.transform(t)),\n bbox = makeBoundingBoxFromPoints(points);\n return new Point(bbox.width, bbox.height);\n};\n","import { iMatrix } from '../../constants';\nimport type { Point } from '../../Point';\nimport type { FabricObject } from '../../shapes/Object/Object';\nimport type { TMat2D } from '../../typedefs';\nimport { invertTransform, multiplyTransformMatrices } from './matrix';\nimport { applyTransformToObject } from './objectTransforms';\n\n/**\n * We are actually looking for the transformation from the destination plane to the source plane (change of basis matrix)\\\n * The object will exist on the destination plane and we want it to seem unchanged by it so we invert the destination matrix (`to`) and then apply the source matrix (`from`)\n * @param [from]\n * @param [to]\n * @returns\n */\nexport const calcPlaneChangeMatrix = (\n from: TMat2D = iMatrix,\n to: TMat2D = iMatrix,\n) => multiplyTransformMatrices(invertTransform(to), from);\n\n/**\n * Sends a point from the source coordinate plane to the destination coordinate plane.\\\n * From the canvas/viewer's perspective the point remains unchanged.\n *\n * @example Send point from canvas plane to group plane\n * var obj = new Rect({ left: 20, top: 20, width: 60, height: 60, strokeWidth: 0 });\n * var group = new Group([obj], { strokeWidth: 0 });\n * var sentPoint1 = sendPointToPlane(new Point(50, 50), undefined, group.calcTransformMatrix());\n * var sentPoint2 = sendPointToPlane(new Point(50, 50), iMatrix, group.calcTransformMatrix());\n * console.log(sentPoint1, sentPoint2) // both points print (0,0) which is the center of group\n *\n * @param {Point} point\n * @param {TMat2D} [from] plane matrix containing object. Passing `undefined` is equivalent to passing the identity matrix, which means `point` exists in the canvas coordinate plane.\n * @param {TMat2D} [to] destination plane matrix to contain object. Passing `undefined` means `point` should be sent to the canvas coordinate plane.\n * @returns {Point} transformed point\n */\nexport const sendPointToPlane = (\n point: Point,\n from: TMat2D = iMatrix,\n to: TMat2D = iMatrix,\n): Point => point.transform(calcPlaneChangeMatrix(from, to));\n\n/**\n * See {@link sendPointToPlane}\n */\nexport const sendVectorToPlane = (\n point: Point,\n from: TMat2D = iMatrix,\n to: TMat2D = iMatrix,\n): Point => point.transform(calcPlaneChangeMatrix(from, to), true);\n\n/**\n *\n * A util that abstracts applying transform to objects.\\\n * Sends `object` to the destination coordinate plane by applying the relevant transformations.\\\n * Changes the space/plane where `object` is drawn.\\\n * From the canvas/viewer's perspective `object` remains unchanged.\n *\n * @example Move clip path from one object to another while preserving it's appearance as viewed by canvas/viewer\n * let obj, obj2;\n * let clipPath = new Circle({ radius: 50 });\n * obj.clipPath = clipPath;\n * // render\n * sendObjectToPlane(clipPath, obj.calcTransformMatrix(), obj2.calcTransformMatrix());\n * obj.clipPath = undefined;\n * obj2.clipPath = clipPath;\n * // render, clipPath now clips obj2 but seems unchanged from the eyes of the viewer\n *\n * @example Clip an object's clip path with an existing object\n * let obj, existingObj;\n * let clipPath = new Circle({ radius: 50 });\n * obj.clipPath = clipPath;\n * let transformTo = multiplyTransformMatrices(obj.calcTransformMatrix(), clipPath.calcTransformMatrix());\n * sendObjectToPlane(existingObj, existingObj.group?.calcTransformMatrix(), transformTo);\n * clipPath.clipPath = existingObj;\n *\n * @param {FabricObject} object\n * @param {Matrix} [from] plane matrix containing object. Passing `undefined` is equivalent to passing the identity matrix, which means `object` is a direct child of canvas.\n * @param {Matrix} [to] destination plane matrix to contain object. Passing `undefined` means `object` should be sent to the canvas coordinate plane.\n * @returns {Matrix} the transform matrix that was applied to `object`\n */\nexport const sendObjectToPlane = (\n object: FabricObject,\n from?: TMat2D,\n to?: TMat2D,\n): TMat2D => {\n const t = calcPlaneChangeMatrix(from, to);\n applyTransformToObject(\n object,\n multiplyTransformMatrices(t, object.calcOwnMatrix()),\n );\n return t;\n};\n","import type {\n ObjectModificationEvents,\n TModificationEvents,\n} from '../EventTypeDefs';\n\nexport const fireEvent = (\n eventName: TModificationEvents,\n options: ObjectModificationEvents[typeof eventName],\n) => {\n const {\n transform: { target },\n } = options;\n target.canvas?.fire(`object:${eventName}`, {\n ...options,\n target,\n });\n target.fire(eventName, options);\n};\n","import type { TOriginX, TOriginY } from '../../typedefs';\n\nconst originOffset = {\n left: -0.5,\n top: -0.5,\n center: 0,\n bottom: 0.5,\n right: 0.5,\n};\n/**\n * Resolves origin value relative to center\n * @private\n * @param {TOriginX | TOriginY} originValue originX / originY\n * @returns number\n */\n\nexport const resolveOrigin = (\n originValue: TOriginX | TOriginY | number,\n): number =>\n typeof originValue === 'string'\n ? originOffset[originValue]\n : originValue - 0.5;\n","import type { XY } from '../../Point';\nimport { Point } from '../../Point';\nimport type { TRadian } from '../../typedefs';\n\nconst unitVectorX = new Point(1, 0);\nconst zero = new Point();\n\n/**\n * Rotates `vector` with `radians`\n * @param {Point} vector The vector to rotate (x and y)\n * @param {Number} radians The radians of the angle for the rotation\n * @return {Point} The new rotated point\n */\nexport const rotateVector = (vector: Point, radians: TRadian) =>\n vector.rotate(radians);\n\n/**\n * Creates a vector from points represented as a point\n *\n * @param {Point} from\n * @param {Point} to\n * @returns {Point} vector\n */\nexport const createVector = (from: XY, to: XY): Point =>\n new Point(to).subtract(from);\n\n/**\n * return the magnitude of a vector\n * @return {number}\n */\nexport const magnitude = (point: Point) => point.distanceFrom(zero);\n\n/**\n * Calculates the angle between 2 vectors\n * @param {Point} a\n * @param {Point} b\n * @returns the angle in radians from `a` to `b`\n */\nexport const calcAngleBetweenVectors = (a: Point, b: Point): TRadian =>\n Math.atan2(crossProduct(a, b), dotProduct(a, b)) as TRadian;\n\n/**\n * Calculates the angle between the x axis and the vector\n * @param {Point} v\n * @returns the angle in radians of `v`\n */\nexport const calcVectorRotation = (v: Point) =>\n calcAngleBetweenVectors(unitVectorX, v);\n\n/**\n * @param {Point} v\n * @returns {Point} vector representing the unit vector pointing to the direction of `v`\n */\nexport const getUnitVector = (v: Point): Point =>\n v.eq(zero) ? v : v.scalarDivide(magnitude(v));\n\n/**\n * @param {Point} v\n * @param {Boolean} [counterClockwise] the direction of the orthogonal vector, defaults to `true`\n * @returns {Point} the unit orthogonal vector\n */\nexport const getOrthonormalVector = (\n v: Point,\n counterClockwise = true,\n): Point =>\n getUnitVector(new Point(-v.y, v.x).scalarMultiply(counterClockwise ? 1 : -1));\n\n/**\n * Cross product of two vectors in 2D\n * @param {Point} a\n * @param {Point} b\n * @returns {number} the magnitude of Z vector\n */\nexport const crossProduct = (a: Point, b: Point): number =>\n a.x * b.y - a.y * b.x;\n\n/**\n * Dot product of two vectors in 2D\n * @param {Point} a\n * @param {Point} b\n * @returns {number}\n */\nexport const dotProduct = (a: Point, b: Point): number => a.x * b.x + a.y * b.y;\n\n/**\n * Checks if the vector is between two others. It is considered\n * to be inside when the vector to be tested is between the\n * initial vector and the final vector (included) in a counterclockwise direction.\n * @param {Point} t vector to be tested\n * @param {Point} a initial vector\n * @param {Point} b final vector\n * @returns {boolean} true if the vector is among the others\n */\nexport const isBetweenVectors = (t: Point, a: Point, b: Point): boolean => {\n if (t.eq(a) || t.eq(b)) return true;\n const AxB = crossProduct(a, b),\n AxT = crossProduct(a, t),\n BxT = crossProduct(b, t);\n return AxB >= 0 ? AxT >= 0 && BxT <= 0 : !(AxT <= 0 && BxT >= 0);\n};\n","import type {\n TPointerEvent,\n Transform,\n TransformAction,\n BasicTransformEvent,\n} from '../EventTypeDefs';\nimport { resolveOrigin } from '../util/misc/resolveOrigin';\nimport { Point } from '../Point';\nimport type { FabricObject } from '../shapes/Object/FabricObject';\nimport type { TOriginX, TOriginY } from '../typedefs';\nimport { degreesToRadians } from '../util/misc/radiansDegreesConversion';\nimport type { Control } from './Control';\nimport { CENTER, quarterPI, twoMathPi } from '../constants';\nimport { calcVectorRotation, createVector } from '../util/misc/vectors';\nimport type { TOCoord } from '../shapes/Object/InteractiveObject';\nimport { sendPointToPlane } from '../util/misc/planeChange';\n\nexport const NOT_ALLOWED_CURSOR = 'not-allowed';\n\n/**\n * @param {Boolean} alreadySelected true if target is already selected\n * @param {String} corner a string representing the corner ml, mr, tl ...\n * @param {Event} e Event object\n * @param {FabricObject} [target] inserted back to help overriding. Unused\n */\nexport const getActionFromCorner = (\n alreadySelected: boolean,\n corner: string | undefined,\n e: TPointerEvent,\n target: FabricObject,\n) => {\n if (!corner || !alreadySelected) {\n return 'drag';\n }\n const control = target.controls[corner];\n return control.getActionName(e, control, target);\n};\n\n/**\n * Checks if transform is centered\n * @param {Object} transform transform data\n * @return {Boolean} true if transform is centered\n */\nexport function isTransformCentered(transform: Transform) {\n return (\n resolveOrigin(transform.originX) === resolveOrigin(CENTER) &&\n resolveOrigin(transform.originY) === resolveOrigin(CENTER)\n );\n}\n\nexport function invertOrigin(origin: TOriginX | TOriginY) {\n return -resolveOrigin(origin) + 0.5;\n}\n\nexport const isLocked = (\n target: FabricObject,\n lockingKey:\n | 'lockMovementX'\n | 'lockMovementY'\n | 'lockRotation'\n | 'lockScalingX'\n | 'lockScalingY'\n | 'lockSkewingX'\n | 'lockSkewingY'\n | 'lockScalingFlip',\n) => target[lockingKey];\n\nexport const commonEventInfo: TransformAction<\n Transform,\n BasicTransformEvent\n> = (eventData, transform, x, y) => {\n return {\n e: eventData,\n transform,\n pointer: new Point(x, y),\n };\n};\n\n/**\n * Combine control position and object angle to find the control direction compared\n * to the object center.\n * @param {FabricObject} fabricObject the fabric object for which we are rendering controls\n * @param {Control} control the control class\n * @return {Number} 0 - 7 a quadrant number\n */\nexport function findCornerQuadrant(\n fabricObject: FabricObject,\n control: Control,\n coord: TOCoord,\n): number {\n const target = coord;\n const center = sendPointToPlane(\n fabricObject.getCenterPoint(),\n fabricObject.canvas!.viewportTransform,\n undefined,\n );\n const angle = calcVectorRotation(createVector(center, target)) + twoMathPi;\n return Math.round((angle % twoMathPi) / quarterPI);\n}\n\n/**\n * @returns the normalized point (rotated relative to center) in local coordinates\n */\nfunction normalizePoint(\n target: FabricObject,\n point: Point,\n originX: TOriginX,\n originY: TOriginY,\n): Point {\n const center = target.getRelativeCenterPoint(),\n p =\n typeof originX !== 'undefined' && typeof originY !== 'undefined'\n ? target.translateToGivenOrigin(\n center,\n CENTER,\n CENTER,\n originX,\n originY,\n )\n : new Point(target.left, target.top),\n p2 = target.angle\n ? point.rotate(-degreesToRadians(target.angle), center)\n : point;\n return p2.subtract(p);\n}\n\n/**\n * Transforms a point to the offset from the given origin\n * @param {Object} transform\n * @param {String} originX\n * @param {String} originY\n * @param {number} x\n * @param {number} y\n * @return {Fabric.Point} the normalized point\n */\nexport function getLocalPoint(\n { target, corner }: Transform,\n originX: TOriginX,\n originY: TOriginY,\n x: number,\n y: number,\n) {\n const control = target.controls[corner],\n zoom = target.canvas?.getZoom() || 1,\n padding = target.padding / zoom,\n localPoint = normalizePoint(target, new Point(x, y), originX, originY);\n if (localPoint.x >= padding) {\n localPoint.x -= padding;\n }\n if (localPoint.x <= -padding) {\n localPoint.x += padding;\n }\n if (localPoint.y >= padding) {\n localPoint.y -= padding;\n }\n if (localPoint.y <= padding) {\n localPoint.y += padding;\n }\n localPoint.x -= control.offsetX;\n localPoint.y -= control.offsetY;\n return localPoint;\n}\n","import type { TransformActionHandler } from '../EventTypeDefs';\nimport { LEFT, TOP, MOVING } from '../constants';\nimport { fireEvent } from './fireEvent';\nimport { commonEventInfo, isLocked } from './util';\n\n/**\n * Action handler\n * @private\n * @param {Event} eventData javascript event that is doing the transform\n * @param {Object} transform javascript object containing a series of information around the current transform\n * @param {number} x current mouse x position, canvas normalized\n * @param {number} y current mouse y position, canvas normalized\n * @return {Boolean} true if the translation occurred\n */\nexport const dragHandler: TransformActionHandler = (\n eventData,\n transform,\n x,\n y,\n) => {\n const { target, offsetX, offsetY } = transform,\n newLeft = x - offsetX,\n newTop = y - offsetY,\n moveX = !isLocked(target, 'lockMovementX') && target.left !== newLeft,\n moveY = !isLocked(target, 'lockMovementY') && target.top !== newTop;\n moveX && target.set(LEFT, newLeft);\n moveY && target.set(TOP, newTop);\n if (moveX || moveY) {\n fireEvent(MOVING, commonEventInfo(eventData, transform, x, y));\n }\n return moveX || moveY;\n};\n","/**\n * Map of the 148 color names with HEX code\n * @see: https://www.w3.org/TR/css3-color/#svg-color\n */\nexport const ColorNameMap = {\n aliceblue: '#F0F8FF',\n antiquewhite: '#FAEBD7',\n aqua: '#0FF',\n aquamarine: '#7FFFD4',\n azure: '#F0FFFF',\n beige: '#F5F5DC',\n bisque: '#FFE4C4',\n black: '#000',\n blanchedalmond: '#FFEBCD',\n blue: '#00F',\n blueviolet: '#8A2BE2',\n brown: '#A52A2A',\n burlywood: '#DEB887',\n cadetblue: '#5F9EA0',\n chartreuse: '#7FFF00',\n chocolate: '#D2691E',\n coral: '#FF7F50',\n cornflowerblue: '#6495ED',\n cornsilk: '#FFF8DC',\n crimson: '#DC143C',\n cyan: '#0FF',\n darkblue: '#00008B',\n darkcyan: '#008B8B',\n darkgoldenrod: '#B8860B',\n darkgray: '#A9A9A9',\n darkgrey: '#A9A9A9',\n darkgreen: '#006400',\n darkkhaki: '#BDB76B',\n darkmagenta: '#8B008B',\n darkolivegreen: '#556B2F',\n darkorange: '#FF8C00',\n darkorchid: '#9932CC',\n darkred: '#8B0000',\n darksalmon: '#E9967A',\n darkseagreen: '#8FBC8F',\n darkslateblue: '#483D8B',\n darkslategray: '#2F4F4F',\n darkslategrey: '#2F4F4F',\n darkturquoise: '#00CED1',\n darkviolet: '#9400D3',\n deeppink: '#FF1493',\n deepskyblue: '#00BFFF',\n dimgray: '#696969',\n dimgrey: '#696969',\n dodgerblue: '#1E90FF',\n firebrick: '#B22222',\n floralwhite: '#FFFAF0',\n forestgreen: '#228B22',\n fuchsia: '#F0F',\n gainsboro: '#DCDCDC',\n ghostwhite: '#F8F8FF',\n gold: '#FFD700',\n goldenrod: '#DAA520',\n gray: '#808080',\n grey: '#808080',\n green: '#008000',\n greenyellow: '#ADFF2F',\n honeydew: '#F0FFF0',\n hotpink: '#FF69B4',\n indianred: '#CD5C5C',\n indigo: '#4B0082',\n ivory: '#FFFFF0',\n khaki: '#F0E68C',\n lavender: '#E6E6FA',\n lavenderblush: '#FFF0F5',\n lawngreen: '#7CFC00',\n lemonchiffon: '#FFFACD',\n lightblue: '#ADD8E6',\n lightcoral: '#F08080',\n lightcyan: '#E0FFFF',\n lightgoldenrodyellow: '#FAFAD2',\n lightgray: '#D3D3D3',\n lightgrey: '#D3D3D3',\n lightgreen: '#90EE90',\n lightpink: '#FFB6C1',\n lightsalmon: '#FFA07A',\n lightseagreen: '#20B2AA',\n lightskyblue: '#87CEFA',\n lightslategray: '#789',\n lightslategrey: '#789',\n lightsteelblue: '#B0C4DE',\n lightyellow: '#FFFFE0',\n lime: '#0F0',\n limegreen: '#32CD32',\n linen: '#FAF0E6',\n magenta: '#F0F',\n maroon: '#800000',\n mediumaquamarine: '#66CDAA',\n mediumblue: '#0000CD',\n mediumorchid: '#BA55D3',\n mediumpurple: '#9370DB',\n mediumseagreen: '#3CB371',\n mediumslateblue: '#7B68EE',\n mediumspringgreen: '#00FA9A',\n mediumturquoise: '#48D1CC',\n mediumvioletred: '#C71585',\n midnightblue: '#191970',\n mintcream: '#F5FFFA',\n mistyrose: '#FFE4E1',\n moccasin: '#FFE4B5',\n navajowhite: '#FFDEAD',\n navy: '#000080',\n oldlace: '#FDF5E6',\n olive: '#808000',\n olivedrab: '#6B8E23',\n orange: '#FFA500',\n orangered: '#FF4500',\n orchid: '#DA70D6',\n palegoldenrod: '#EEE8AA',\n palegreen: '#98FB98',\n paleturquoise: '#AFEEEE',\n palevioletred: '#DB7093',\n papayawhip: '#FFEFD5',\n peachpuff: '#FFDAB9',\n peru: '#CD853F',\n pink: '#FFC0CB',\n plum: '#DDA0DD',\n powderblue: '#B0E0E6',\n purple: '#800080',\n rebeccapurple: '#639',\n red: '#F00',\n rosybrown: '#BC8F8F',\n royalblue: '#4169E1',\n saddlebrown: '#8B4513',\n salmon: '#FA8072',\n sandybrown: '#F4A460',\n seagreen: '#2E8B57',\n seashell: '#FFF5EE',\n sienna: '#A0522D',\n silver: '#C0C0C0',\n skyblue: '#87CEEB',\n slateblue: '#6A5ACD',\n slategray: '#708090',\n slategrey: '#708090',\n snow: '#FFFAFA',\n springgreen: '#00FF7F',\n steelblue: '#4682B4',\n tan: '#D2B48C',\n teal: '#008080',\n thistle: '#D8BFD8',\n tomato: '#FF6347',\n turquoise: '#40E0D0',\n violet: '#EE82EE',\n wheat: '#F5DEB3',\n white: '#FFF',\n whitesmoke: '#F5F5F5',\n yellow: '#FF0',\n yellowgreen: '#9ACD32',\n};\n","import type { TRGBAColorSource } from './typedefs';\n\n/**\n * @param {Number} p\n * @param {Number} q\n * @param {Number} t\n * @return {Number}\n */\nexport const hue2rgb = (p: number, q: number, t: number): number => {\n if (t < 0) {\n t += 1;\n }\n if (t > 1) {\n t -= 1;\n }\n if (t < 1 / 6) {\n return p + (q - p) * 6 * t;\n }\n if (t < 1 / 2) {\n return q;\n }\n if (t < 2 / 3) {\n return p + (q - p) * (2 / 3 - t) * 6;\n }\n return p;\n};\n\n/**\n * Adapted from {@link https://gist.github.com/mjackson/5311256 https://gist.github.com/mjackson}\n * @param {Number} r Red color value\n * @param {Number} g Green color value\n * @param {Number} b Blue color value\n * @param {Number} a Alpha color value pass through\n * @return {TRGBColorSource} Hsl color\n */\nexport const rgb2Hsl = (\n r: number,\n g: number,\n b: number,\n a: number,\n): TRGBAColorSource => {\n r /= 255;\n g /= 255;\n b /= 255;\n const maxValue = Math.max(r, g, b),\n minValue = Math.min(r, g, b);\n\n let h!: number, s: number;\n const l = (maxValue + minValue) / 2;\n\n if (maxValue === minValue) {\n h = s = 0; // achromatic\n } else {\n const d = maxValue - minValue;\n s = l > 0.5 ? d / (2 - maxValue - minValue) : d / (maxValue + minValue);\n switch (maxValue) {\n case r:\n h = (g - b) / d + (g < b ? 6 : 0);\n break;\n case g:\n h = (b - r) / d + 2;\n break;\n case b:\n h = (r - g) / d + 4;\n break;\n }\n h /= 6;\n }\n\n return [Math.round(h * 360), Math.round(s * 100), Math.round(l * 100), a];\n};\n\nexport const fromAlphaToFloat = (value = '1') =>\n parseFloat(value) / (value.endsWith('%') ? 100 : 1);\n\n/**\n * Convert a value in the inclusive range [0, 255] to hex\n */\nexport const hexify = (value: number) =>\n Math.min(Math.round(value), 255).toString(16).toUpperCase().padStart(2, '0');\n\n/**\n * Calculate the grey average value for rgb and pass through alpha\n */\nexport const greyAverage = ([\n r,\n g,\n b,\n a = 1,\n]: TRGBAColorSource): TRGBAColorSource => {\n const avg = Math.round(r * 0.3 + g * 0.59 + b * 0.11);\n return [avg, avg, avg, a];\n};\n","import { radiansToDegrees } from '../util/misc/radiansDegreesConversion';\nimport { ColorNameMap } from './color_map';\nimport { reHSLa, reHex, reRGBa } from './constants';\nimport type { TRGBAColorSource, TColorArg } from './typedefs';\nimport {\n hue2rgb,\n hexify,\n rgb2Hsl,\n fromAlphaToFloat,\n greyAverage,\n} from './util';\n\n/**\n * @class Color common color operations\n * @tutorial {@link http://fabricjs.com/fabric-intro-part-2/#colors colors}\n */\nexport class Color {\n declare private _source: TRGBAColorSource;\n isUnrecognised = false;\n\n /**\n *\n * @param {string} [color] optional in hex or rgb(a) or hsl format or from known color list\n */\n constructor(color?: TColorArg) {\n if (!color) {\n // we default to black as canvas does\n this.setSource([0, 0, 0, 1]);\n } else if (color instanceof Color) {\n this.setSource([...color._source]);\n } else if (Array.isArray(color)) {\n const [r, g, b, a = 1] = color;\n this.setSource([r, g, b, a]);\n } else {\n this.setSource(this._tryParsingColor(color));\n }\n }\n\n /**\n * @private\n * @param {string} [color] Color value to parse\n * @returns {TRGBAColorSource}\n */\n protected _tryParsingColor(color: string) {\n color = color.toLowerCase();\n if (color in ColorNameMap) {\n color = ColorNameMap[color as keyof typeof ColorNameMap];\n }\n return color === 'transparent'\n ? ([255, 255, 255, 0] as TRGBAColorSource)\n : Color.sourceFromHex(color) ||\n Color.sourceFromRgb(color) ||\n Color.sourceFromHsl(color) ||\n // color is not recognized\n // we default to black as canvas does\n // eslint-disable-next-line no-constant-binary-expression\n ((this.isUnrecognised = true) && ([0, 0, 0, 1] as TRGBAColorSource));\n }\n\n /**\n * Returns source of this color (where source is an array representation; ex: [200, 200, 100, 1])\n * @return {TRGBAColorSource}\n */\n getSource() {\n return this._source;\n }\n\n /**\n * Sets source of this color (where source is an array representation; ex: [200, 200, 100, 1])\n * @param {TRGBAColorSource} source\n */\n setSource(source: TRGBAColorSource) {\n this._source = source;\n }\n\n /**\n * Returns color representation in RGB format\n * @return {String} ex: rgb(0-255,0-255,0-255)\n */\n toRgb() {\n const [r, g, b] = this.getSource();\n return `rgb(${r},${g},${b})`;\n }\n\n /**\n * Returns color representation in RGBA format\n * @return {String} ex: rgba(0-255,0-255,0-255,0-1)\n */\n toRgba() {\n return `rgba(${this.getSource().join(',')})`;\n }\n\n /**\n * Returns color representation in HSL format\n * @return {String} ex: hsl(0-360,0%-100%,0%-100%)\n */\n toHsl() {\n const [h, s, l] = rgb2Hsl(...this.getSource());\n return `hsl(${h},${s}%,${l}%)`;\n }\n\n /**\n * Returns color representation in HSLA format\n * @return {String} ex: hsla(0-360,0%-100%,0%-100%,0-1)\n */\n toHsla() {\n const [h, s, l, a] = rgb2Hsl(...this.getSource());\n return `hsla(${h},${s}%,${l}%,${a})`;\n }\n\n /**\n * Returns color representation in HEX format\n * @return {String} ex: FF5555\n */\n toHex() {\n const fullHex = this.toHexa();\n return fullHex.slice(0, 6);\n }\n\n /**\n * Returns color representation in HEXA format\n * @return {String} ex: FF5555CC\n */\n toHexa() {\n const [r, g, b, a] = this.getSource();\n return `${hexify(r)}${hexify(g)}${hexify(b)}${hexify(Math.round(a * 255))}`;\n }\n\n /**\n * Gets value of alpha channel for this color\n * @return {Number} 0-1\n */\n getAlpha() {\n return this.getSource()[3];\n }\n\n /**\n * Sets value of alpha channel for this color\n * @param {Number} alpha Alpha value 0-1\n * @return {Color} thisArg\n */\n setAlpha(alpha: number) {\n this._source[3] = alpha;\n return this;\n }\n\n /**\n * Transforms color to its grayscale representation\n * @return {Color} thisArg\n */\n toGrayscale() {\n this.setSource(greyAverage(this.getSource()));\n return this;\n }\n\n /**\n * Transforms color to its black and white representation\n * @param {Number} threshold\n * @return {Color} thisArg\n */\n toBlackWhite(threshold: number) {\n const [average, , , a] = greyAverage(this.getSource()),\n bOrW = average < (threshold || 127) ? 0 : 255;\n this.setSource([bOrW, bOrW, bOrW, a]);\n return this;\n }\n\n /**\n * Overlays color with another color\n * @param {String|Color} otherColor\n * @return {Color} thisArg\n */\n overlayWith(otherColor: string | Color) {\n if (!(otherColor instanceof Color)) {\n otherColor = new Color(otherColor);\n }\n\n const source = this.getSource(),\n otherAlpha = 0.5,\n otherSource = otherColor.getSource(),\n [R, G, B] = source.map((value, index) =>\n Math.round(value * (1 - otherAlpha) + otherSource[index] * otherAlpha),\n );\n\n this.setSource([R, G, B, source[3]]);\n return this;\n }\n\n /**\n * Returns new color object, when given a color in RGB format\n * @param {String} color Color value ex: rgb(0-255,0-255,0-255)\n * @return {Color}\n */\n static fromRgb(color: string): Color {\n return Color.fromRgba(color);\n }\n\n /**\n * Returns new color object, when given a color in RGBA format\n * @function\n * @param {String} color\n * @return {Color}\n */\n static fromRgba(color: string): Color {\n return new Color(Color.sourceFromRgb(color));\n }\n\n /**\n * Returns array representation (ex: [100, 100, 200, 1]) of a color that's in RGB or RGBA format\n * @param {String} color Color value ex: rgb(0-255,0-255,0-255), rgb(0%-100%,0%-100%,0%-100%)\n * @return {TRGBAColorSource | undefined} source\n */\n static sourceFromRgb(color: string): TRGBAColorSource | undefined {\n const match = color.match(reRGBa());\n if (match) {\n const [r, g, b] = match.slice(1, 4).map((value) => {\n const parsedValue = parseFloat(value);\n return value.endsWith('%')\n ? Math.round(parsedValue * 2.55)\n : parsedValue;\n });\n return [r, g, b, fromAlphaToFloat(match[4])];\n }\n }\n\n /**\n * Returns new color object, when given a color in HSL format\n * @param {String} color Color value ex: hsl(0-260,0%-100%,0%-100%)\n * @return {Color}\n */\n static fromHsl(color: string): Color {\n return Color.fromHsla(color);\n }\n\n /**\n * Returns new color object, when given a color in HSLA format\n * @function\n * @param {String} color\n * @return {Color}\n */\n static fromHsla(color: string): Color {\n return new Color(Color.sourceFromHsl(color));\n }\n\n /**\n * Returns array representation (ex: [100, 100, 200, 1]) of a color that's in HSL or HSLA format.\n * Adapted from https://github.com/mjijackson\n * @param {String} color Color value ex: hsl(0-360,0%-100%,0%-100%) or hsla(0-360,0%-100%,0%-100%, 0-1)\n * @return {TRGBAColorSource | undefined} source\n * @see http://http://www.w3.org/TR/css3-color/#hsl-color\n */\n static sourceFromHsl(color: string): TRGBAColorSource | undefined {\n const match = color.match(reHSLa());\n if (!match) {\n return;\n }\n const match1degrees = Color.parseAngletoDegrees(match[1]);\n\n const h = (((match1degrees % 360) + 360) % 360) / 360,\n s = parseFloat(match[2]) / 100,\n l = parseFloat(match[3]) / 100;\n let r: number, g: number, b: number;\n\n if (s === 0) {\n r = g = b = l;\n } else {\n const q = l <= 0.5 ? l * (s + 1) : l + s - l * s,\n p = l * 2 - q;\n\n r = hue2rgb(p, q, h + 1 / 3);\n g = hue2rgb(p, q, h);\n b = hue2rgb(p, q, h - 1 / 3);\n }\n\n return [\n Math.round(r * 255),\n Math.round(g * 255),\n Math.round(b * 255),\n fromAlphaToFloat(match[4]),\n ];\n }\n\n /**\n * Returns new color object, when given a color in HEX format\n * @param {String} color Color value ex: FF5555\n * @return {Color}\n */\n static fromHex(color: string): Color {\n return new Color(Color.sourceFromHex(color));\n }\n\n /**\n * Returns array representation (ex: [100, 100, 200, 1]) of a color that's in HEX format\n * @param {String} color ex: FF5555 or FF5544CC (RGBa)\n * @return {TRGBAColorSource | undefined} source\n */\n static sourceFromHex(color: string): TRGBAColorSource | undefined {\n if (color.match(reHex())) {\n const value = color.slice(color.indexOf('#') + 1),\n isShortNotation = value.length <= 4;\n let expandedValue: string[];\n if (isShortNotation) {\n expandedValue = value.split('').map((hex) => hex + hex);\n } else {\n expandedValue = value.match(/.{2}/g)!;\n }\n const [r, g, b, a = 255] = expandedValue.map((hexCouple) =>\n parseInt(hexCouple, 16),\n );\n return [r, g, b, a / 255];\n }\n }\n\n /**\n * Converts a string that could be any angle notation (50deg, 0.5turn, 2rad)\n * into degrees without the 'deg' suffix\n * @param {String} value ex: 0deg, 0.5turn, 2rad\n * @return {Number} number in degrees or NaN if inputs are invalid\n */\n static parseAngletoDegrees(value: string): number {\n const lowercase = value.toLowerCase();\n const numeric = parseFloat(lowercase);\n\n if (lowercase.includes('rad')) {\n return radiansToDegrees(numeric);\n }\n\n if (lowercase.includes('turn')) {\n return numeric * 360;\n }\n\n // Value is probably just a number already in degrees eg '50'\n return numeric;\n }\n}\n","/**\n * Regex matching color in RGB or RGBA formats (ex: `rgb(0, 0, 0)`, `rgba(255, 100, 10, 0.5)`, `rgba( 255 , 100 , 10 , 0.5 )`, `rgb(1,1,1)`, `rgba(100%, 60%, 10%, 0.5)`)\n * Also matching rgba(r g b / a) as per new specs\n * https://developer.mozilla.org/en-US/docs/Web/CSS/color_value/rgb\n * Formal syntax at the time of writing:\n * =\n * rgb( [ | none ]{3} [ / [ | none ] ]? ) |\n * rgb( [ | none ]{3} [ / [ | none ] ]? )\n * = | \n *\n * For learners this is how you can read this regex\n * Regular expression for matching an rgba or rgb CSS color value\n *\n * /^ # Beginning of the string\n * rgba? # \"rgb\" or \"rgba\"\n * \\(\\s* # Opening parenthesis and optional whitespace\n * (\\d{0,3} # 0 to three digits R channel\n * (?:\\.\\d+)? # Optional decimal with one or more digits\n * ) # End of capturing group for the first color component\n * %? # Optional percent sign after the first color component\n * \\s* # Optional whitespace\n * [\\s|,] # Separator between color components can be a space or comma\n * \\s* # Optional whitespace\n * (\\d{0,3} # 0 to three digits G channel\n * (?:\\.\\d+)? # Optional decimal with one or more digits\n * ) # End of capturing group for the second color component\n * %? # Optional percent sign after the second color component\n * \\s* # Optional whitespace\n * [\\s|,] # Separator between color components can be a space or comma\n * \\s* # Optional whitespace\n * (\\d{0,3} # 0 to three digits B channel\n * (?:\\.\\d+)? # Optional decimal with one or more digits\n * ) # End of capturing group for the third color component\n * %? # Optional percent sign after the third color component\n * \\s* # Optional whitespace\n * (?: # Beginning of non-capturing group for alpha value\n * \\s* # Optional whitespace\n * [,/] # Comma or slash separator for alpha value\n * \\s* # Optional whitespace\n * (\\d{0,3} # Zero to three digits\n * (?:\\.\\d+)? # Optional decimal with one or more digits\n * ) # End of capturing group for alpha value\n * %? # Optional percent sign after alpha value\n * \\s* # Optional whitespace\n * )? # End of non-capturing group for alpha value (optional)\n * \\) # Closing parenthesis\n * $ # End of the string\n *\n * The alpha channel can be in the format 0.4 .7 or 1 or 73%\n *\n * WARNING this regex doesn't fail on off spec colors. it matches everything that could be a color.\n * So the spec does not allow for `rgba(30 , 45% 35, 49%)` but this will work anyways for us\n */\nexport const reRGBa = () =>\n /^rgba?\\(\\s*(\\d{0,3}(?:\\.\\d+)?%?)\\s*[\\s|,]\\s*(\\d{0,3}(?:\\.\\d+)?%?)\\s*[\\s|,]\\s*(\\d{0,3}(?:\\.\\d+)?%?)\\s*(?:\\s*[,/]\\s*(\\d{0,3}(?:\\.\\d+)?%?)\\s*)?\\)$/i;\n\n/**\n * Regex matching color in HSL or HSLA formats (ex: hsl(0, 0, 0), rgba(255, 100, 10, 0.5), rgba( 255 , 100 , 10 , 0.5 ), rgb(1,1,1), rgba(100%, 60%, 10%, 0.5))\n * Also matching rgba(r g b / a) as per new specs\n * https://developer.mozilla.org/en-US/docs/Web/CSS/color_value/hsl\n * Formal syntax at the time of writing:\n * =\n * hsl( [ | none ] [ | none ] [ | none ] [ / [ | none ] ]? )\n *\n * =\n * |\n * \n *\n * =\n * |\n * \n *\n * For learners this is how you can read this regex\n * Regular expression for matching an hsla or hsl CSS color value\n *\n * /^hsla?\\( // Matches the beginning of the string and the opening parenthesis of \"hsl\" or \"hsla\"\n * \\s* // Matches any whitespace characters (space, tab, etc.) zero or more times\n * (\\d{0,3} // Hue: 0 to three digits - start capture in a group\n * (?:\\.\\d+)? // Hue: Optional (non capture group) decimal with one or more digits.\n * (?:deg|turn|rad)? // Hue: Optionally include suffix deg or turn or rad\n * ) // Hue: End capture group\n * \\s* // Matches any whitespace characters zero or more times\n * [\\s|,] // Matches a space, tab or comma\n * \\s* // Matches any whitespace characters zero or more times\n * (\\d{0,3} // Saturation: 0 to three digits - start capture in a group\n * (?:\\.\\d+)? // Saturation: Optional decimal with one or more digits in a non-capturing group\n * %?) // Saturation: match optional % character and end capture group\n * \\s* // Matches any whitespace characters zero or more times\n * [\\s|,] // Matches a space, tab or comma\n * \\s* // Matches any whitespace characters zero or more times\n * (\\d{0,3} // Lightness: 0 to three digits - start capture in a group\n * (?:\\.\\d+)? // Lightness: Optional decimal with one or more digits in a non-capturing group\n * %?) // Lightness: match % character and end capture group\n * \\s* // Matches any whitespace characters zero or more times\n * (?: // Alpha: Begins a non-capturing group for the alpha value\n * \\s* // Matches any whitespace characters zero or more times\n * [,/] // Matches a comma or forward slash\n * \\s* // Matches any whitespace characters zero or more times\n * (\\d*(?:\\.\\d+)?%?) // Matches zero or more digits, optionally followed by a decimal point and one or more digits, followed by an optional percentage sign and captures it in a group\n * \\s* // Matches any whitespace characters zero or more times\n * )? // Makes the alpha value group optional\n * \\) // Matches the closing parenthesis\n * $/i // Matches the end of the string and sets the regular expression to case-insensitive mode\n *\n * WARNING this regex doesn't fail on off spec colors. It matches everything that could be a color.\n * So the spec does not allow `hsl(30 , 45% 35, 49%)` but this will work anyways for us.\n */\nexport const reHSLa = () =>\n /^hsla?\\(\\s*([+-]?\\d{0,3}(?:\\.\\d+)?(?:deg|turn|rad)?)\\s*[\\s|,]\\s*(\\d{0,3}(?:\\.\\d+)?%?)\\s*[\\s|,]\\s*(\\d{0,3}(?:\\.\\d+)?%?)\\s*(?:\\s*[,/]\\s*(\\d*(?:\\.\\d+)?%?)\\s*)?\\)$/i;\n\n/**\n * Regex matching color in HEX format (ex: #FF5544CC, #FF5555, 010155, aff)\n */\nexport const reHex = () => /^#?(([0-9a-f]){3,4}|([0-9a-f]{2}){3,4})$/i;\n","import { Color } from '../../color/Color';\nimport { config } from '../../config';\nimport { DEFAULT_SVG_FONT_SIZE, FILL, NONE } from '../../constants';\nimport type { TBBox, SVGElementName, SupportedSVGUnit } from '../../typedefs';\nimport { toFixed } from './toFixed';\n\n/**\n * Returns array of attributes for given svg that fabric parses\n * @param {SVGElementName} type Type of svg element (eg. 'circle')\n * @return {Array} string names of supported attributes\n */\nexport const getSvgAttributes = (type: SVGElementName) => {\n const commonAttributes = ['instantiated_by_use', 'style', 'id', 'class'];\n switch (type) {\n case 'linearGradient':\n return commonAttributes.concat([\n 'x1',\n 'y1',\n 'x2',\n 'y2',\n 'gradientUnits',\n 'gradientTransform',\n ]);\n case 'radialGradient':\n return commonAttributes.concat([\n 'gradientUnits',\n 'gradientTransform',\n 'cx',\n 'cy',\n 'r',\n 'fx',\n 'fy',\n 'fr',\n ]);\n case 'stop':\n return commonAttributes.concat(['offset', 'stop-color', 'stop-opacity']);\n }\n return commonAttributes;\n};\n\n/**\n * Converts from attribute value to pixel value if applicable.\n * Returns converted pixels or original value not converted.\n * @param {string} value number to operate on\n * @param {number} fontSize\n * @return {number}\n */\nexport const parseUnit = (value: string, fontSize = DEFAULT_SVG_FONT_SIZE) => {\n const unit = /\\D{0,2}$/.exec(value),\n number = parseFloat(value);\n const dpi = config.DPI;\n switch (unit?.[0] as SupportedSVGUnit) {\n case 'mm':\n return (number * dpi) / 25.4;\n\n case 'cm':\n return (number * dpi) / 2.54;\n\n case 'in':\n return number * dpi;\n\n case 'pt':\n return (number * dpi) / 72; // or * 4 / 3\n\n case 'pc':\n return ((number * dpi) / 72) * 12; // or * 16\n\n case 'em':\n return number * fontSize;\n\n default:\n return number;\n }\n};\n\nexport type MeetOrSlice = 'meet' | 'slice';\n\nexport type MinMidMax = 'Min' | 'Mid' | 'Max' | 'none';\n\nexport type TPreserveArParsed = {\n meetOrSlice: MeetOrSlice;\n alignX: MinMidMax;\n alignY: MinMidMax;\n};\n\n// align can be either none or undefined or a combination of mid/max\nconst parseAlign = (align: string): MinMidMax[] => {\n //divide align in alignX and alignY\n if (align && align !== NONE) {\n return [align.slice(1, 4) as MinMidMax, align.slice(5, 8) as MinMidMax];\n } else if (align === NONE) {\n return [align, align];\n }\n return ['Mid', 'Mid'];\n};\n\n/**\n * Parse preserveAspectRatio attribute from element\n * https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/preserveAspectRatio\n * @param {string} attribute to be parsed\n * @return {Object} an object containing align and meetOrSlice attribute\n */\nexport const parsePreserveAspectRatioAttribute = (\n attribute: string,\n): TPreserveArParsed => {\n const [firstPart, secondPart] = attribute.trim().split(' ') as [\n MinMidMax,\n MeetOrSlice | undefined,\n ];\n const [alignX, alignY] = parseAlign(firstPart);\n return {\n meetOrSlice: secondPart || 'meet',\n alignX,\n alignY,\n };\n};\n\n/**\n * Adobe Illustrator (at least CS5) is unable to render rgba()-based fill values\n * we work around it by \"moving\" alpha channel into opacity attribute and setting fill's alpha to 1\n * @param prop\n * @param value\n * @param {boolean} inlineStyle The default is inline style, the separator used is \":\", The other is \"=\"\n * @returns\n */\nexport const colorPropToSVG = (\n prop: string,\n value?: any,\n inlineStyle = true,\n) => {\n let colorValue;\n let opacityValue;\n if (!value) {\n colorValue = 'none';\n } else if (value.toLive) {\n colorValue = `url(#SVGID_${value.id})`;\n } else {\n const color = new Color(value),\n opacity = color.getAlpha();\n\n colorValue = color.toRgb();\n if (opacity !== 1) {\n opacityValue = opacity.toString();\n }\n }\n if (inlineStyle) {\n return `${prop}: ${colorValue}; ${\n opacityValue ? `${prop}-opacity: ${opacityValue}; ` : ''\n }`;\n } else {\n return `${prop}=\"${colorValue}\" ${\n opacityValue ? `${prop}-opacity=\"${opacityValue}\" ` : ''\n }`;\n }\n};\n\nexport const createSVGRect = (\n color: string,\n { left, top, width, height }: TBBox,\n precision = config.NUM_FRACTION_DIGITS,\n) => {\n const svgColor = colorPropToSVG(FILL, color, false);\n const [x, y, w, h] = [left, top, width, height].map((value) =>\n toFixed(value, precision),\n );\n return ``;\n};\n","import type { TSVGReviver } from '../../typedefs';\nimport { uid } from '../../util/internals/uid';\nimport { colorPropToSVG } from '../../util/misc/svgParsing';\nimport { FILL, NONE, STROKE } from '../../constants';\nimport type { FabricObject } from './FabricObject';\nimport { isFiller } from '../../util/typeAssertions';\nimport { matrixToSVG } from '../../util/misc/svgExport';\n\nexport class FabricObjectSVGExportMixin {\n /**\n * When an object is being exported as SVG as a clippath, a reference inside the SVG is needed.\n * This reference is a UID in the fabric namespace and is temporary stored here.\n * @type {String}\n */\n declare clipPathId?: string;\n\n /**\n * Returns styles-string for svg-export\n * @param {Boolean} skipShadow a boolean to skip shadow filter output\n * @return {String}\n */\n getSvgStyles(\n this: FabricObjectSVGExportMixin & FabricObject,\n skipShadow?: boolean,\n ) {\n const fillRule = this.fillRule ? this.fillRule : 'nonzero',\n strokeWidth = this.strokeWidth ? this.strokeWidth : '0',\n strokeDashArray = this.strokeDashArray\n ? this.strokeDashArray.join(' ')\n : NONE,\n strokeDashOffset = this.strokeDashOffset ? this.strokeDashOffset : '0',\n strokeLineCap = this.strokeLineCap ? this.strokeLineCap : 'butt',\n strokeLineJoin = this.strokeLineJoin ? this.strokeLineJoin : 'miter',\n strokeMiterLimit = this.strokeMiterLimit ? this.strokeMiterLimit : '4',\n opacity = typeof this.opacity !== 'undefined' ? this.opacity : '1',\n visibility = this.visible ? '' : ' visibility: hidden;',\n filter = skipShadow ? '' : this.getSvgFilter(),\n fill = colorPropToSVG(FILL, this.fill),\n stroke = colorPropToSVG(STROKE, this.stroke);\n\n return [\n stroke,\n 'stroke-width: ',\n strokeWidth,\n '; ',\n 'stroke-dasharray: ',\n strokeDashArray,\n '; ',\n 'stroke-linecap: ',\n strokeLineCap,\n '; ',\n 'stroke-dashoffset: ',\n strokeDashOffset,\n '; ',\n 'stroke-linejoin: ',\n strokeLineJoin,\n '; ',\n 'stroke-miterlimit: ',\n strokeMiterLimit,\n '; ',\n fill,\n 'fill-rule: ',\n fillRule,\n '; ',\n 'opacity: ',\n opacity,\n ';',\n filter,\n visibility,\n ].join('');\n }\n\n /**\n * Returns filter for svg shadow\n * @return {String}\n */\n getSvgFilter(this: FabricObjectSVGExportMixin & FabricObject) {\n return this.shadow ? `filter: url(#SVGID_${this.shadow.id});` : '';\n }\n\n /**\n * Returns id attribute for svg output\n * @return {String}\n */\n getSvgCommons(\n this: FabricObjectSVGExportMixin & FabricObject & { id?: string },\n ) {\n return [\n this.id ? `id=\"${this.id}\" ` : '',\n this.clipPath\n ? `clip-path=\"url(#${\n (this.clipPath as FabricObjectSVGExportMixin & FabricObject)\n .clipPathId\n })\" `\n : '',\n ].join('');\n }\n\n /**\n * Returns transform-string for svg-export\n * @param {Boolean} use the full transform or the single object one.\n * @return {String}\n */\n getSvgTransform(\n this: FabricObjectSVGExportMixin & FabricObject,\n full?: boolean,\n additionalTransform = '',\n ) {\n const transform = full ? this.calcTransformMatrix() : this.calcOwnMatrix(),\n svgTransform = `transform=\"${matrixToSVG(transform)}`;\n return `${svgTransform}${additionalTransform}\" `;\n }\n\n /**\n * Returns svg representation of an instance\n * This function is implemented in each subclass\n * This is just because typescript otherwise cryies all the time\n * @return {Array} an array of strings with the specific svg representation\n * of the instance\n */\n _toSVG(_reviver?: TSVGReviver): string[] {\n return [''];\n }\n\n /**\n * Returns svg representation of an instance\n * @param {TSVGReviver} [reviver] Method for further parsing of svg representation.\n * @return {String} svg representation of an instance\n */\n toSVG(\n this: FabricObjectSVGExportMixin & FabricObject,\n reviver?: TSVGReviver,\n ) {\n return this._createBaseSVGMarkup(this._toSVG(reviver), {\n reviver,\n });\n }\n\n /**\n * Returns svg clipPath representation of an instance\n * @param {TSVGReviver} [reviver] Method for further parsing of svg representation.\n * @return {String} svg representation of an instance\n */\n toClipPathSVG(\n this: FabricObjectSVGExportMixin & FabricObject,\n reviver?: TSVGReviver,\n ) {\n return (\n '\\t' +\n this._createBaseClipPathSVGMarkup(this._toSVG(reviver), {\n reviver,\n })\n );\n }\n\n /**\n * @private\n */\n _createBaseClipPathSVGMarkup(\n this: FabricObjectSVGExportMixin & FabricObject,\n objectMarkup: string[],\n {\n reviver,\n additionalTransform = '',\n }: { reviver?: TSVGReviver; additionalTransform?: string } = {},\n ) {\n const commonPieces = [\n this.getSvgTransform(true, additionalTransform),\n this.getSvgCommons(),\n ].join(''),\n // insert commons in the markup, style and svgCommons\n index = objectMarkup.indexOf('COMMON_PARTS');\n objectMarkup[index] = commonPieces;\n return reviver ? reviver(objectMarkup.join('')) : objectMarkup.join('');\n }\n\n /**\n * @private\n */\n _createBaseSVGMarkup(\n this: FabricObjectSVGExportMixin & FabricObject,\n objectMarkup: string[],\n {\n noStyle,\n reviver,\n withShadow,\n additionalTransform,\n }: {\n noStyle?: boolean;\n reviver?: TSVGReviver;\n withShadow?: boolean;\n additionalTransform?: string;\n } = {},\n ): string {\n const styleInfo = noStyle ? '' : `style=\"${this.getSvgStyles()}\" `,\n shadowInfo = withShadow ? `style=\"${this.getSvgFilter()}\" ` : '',\n clipPath = this.clipPath as FabricObjectSVGExportMixin & FabricObject,\n vectorEffect = this.strokeUniform\n ? 'vector-effect=\"non-scaling-stroke\" '\n : '',\n absoluteClipPath = clipPath && clipPath.absolutePositioned,\n stroke = this.stroke,\n fill = this.fill,\n shadow = this.shadow,\n markup = [],\n // insert commons in the markup, style and svgCommons\n index = objectMarkup.indexOf('COMMON_PARTS');\n let clipPathMarkup;\n if (clipPath) {\n clipPath.clipPathId = `CLIPPATH_${uid()}`;\n clipPathMarkup = `\\n${clipPath.toClipPathSVG(reviver)}\\n`;\n }\n if (absoluteClipPath) {\n markup.push('\\n');\n }\n markup.push(\n '\\n',\n );\n const commonPieces = [\n styleInfo,\n vectorEffect,\n noStyle ? '' : this.addPaintOrder(),\n ' ',\n additionalTransform ? `transform=\"${additionalTransform}\" ` : '',\n ].join('');\n objectMarkup[index] = commonPieces;\n if (isFiller(fill)) {\n markup.push(fill.toSVG(this));\n }\n if (isFiller(stroke)) {\n markup.push(stroke.toSVG(this));\n }\n if (shadow) {\n markup.push(shadow.toSVG(this));\n }\n if (clipPath) {\n markup.push(clipPathMarkup);\n }\n markup.push(objectMarkup.join(''));\n markup.push('\\n');\n absoluteClipPath && markup.push('\\n');\n return reviver ? reviver(markup.join('')) : markup.join('');\n }\n\n addPaintOrder(this: FabricObjectSVGExportMixin & FabricObject) {\n return this.paintFirst !== FILL ? ` paint-order=\"${this.paintFirst}\" ` : '';\n }\n}\n","export function getSvgRegex(arr: string[]) {\n return new RegExp('^(' + arr.join('|') + ')\\\\b', 'i');\n}\n","import { FILL, LEFT, STROKE, reNewline } from '../../constants';\nimport type { TClassProperties } from '../../typedefs';\nimport type { FabricText } from './Text';\n\nexport const TEXT_DECORATION_THICKNESS = 'textDecorationThickness';\n\nconst fontProperties = [\n 'fontSize',\n 'fontWeight',\n 'fontFamily',\n 'fontStyle',\n] as const;\n\nexport const textDecorationProperties = [\n 'underline',\n 'overline',\n 'linethrough',\n] as const;\n\nexport const textLayoutProperties: string[] = [\n ...fontProperties,\n 'lineHeight',\n 'text',\n 'charSpacing',\n 'textAlign',\n 'styles',\n 'path',\n 'pathStartOffset',\n 'pathSide',\n 'pathAlign',\n];\n\nexport const additionalProps = [\n ...textLayoutProperties,\n ...textDecorationProperties,\n 'textBackgroundColor',\n 'direction',\n TEXT_DECORATION_THICKNESS,\n] as const;\n\nexport type StylePropertiesType =\n | 'fill'\n | 'stroke'\n | 'strokeWidth'\n | 'fontSize'\n | 'fontFamily'\n | 'fontWeight'\n | 'fontStyle'\n | 'textBackgroundColor'\n | 'deltaY'\n | 'overline'\n | 'underline'\n | 'linethrough'\n | typeof TEXT_DECORATION_THICKNESS;\n\nexport const styleProperties: Readonly = [\n ...fontProperties,\n ...textDecorationProperties,\n STROKE,\n 'strokeWidth',\n FILL,\n 'deltaY',\n 'textBackgroundColor',\n TEXT_DECORATION_THICKNESS,\n] as const;\n\n// @TODO: Many things here are configuration related and shouldn't be on the class nor prototype\n// regexes, list of properties that are not suppose to change by instances, magic consts.\n// this will be a separated effort\nexport const textDefaultValues: Partial> = {\n _reNewline: reNewline,\n _reSpacesAndTabs: /[ \\t\\r]/g,\n _reSpaceAndTab: /[ \\t\\r]/,\n _reWords: /\\S+/g,\n fontSize: 40,\n fontWeight: 'normal',\n fontFamily: 'Times New Roman',\n underline: false,\n overline: false,\n linethrough: false,\n textAlign: LEFT,\n fontStyle: 'normal',\n lineHeight: 1.16,\n textBackgroundColor: '',\n stroke: null,\n shadow: null,\n path: undefined,\n pathStartOffset: 0,\n pathSide: LEFT,\n pathAlign: 'baseline',\n charSpacing: 0,\n deltaY: 0,\n direction: 'ltr',\n CACHE_FONT_SIZE: 400,\n MIN_TEXT_WIDTH: 2,\n // Text magic numbers\n superscript: {\n size: 0.6, // fontSize factor\n baseline: -0.35, // baseline-shift factor (upwards)\n },\n subscript: {\n size: 0.6, // fontSize factor\n baseline: 0.11, // baseline-shift factor (downwards)\n },\n _fontSizeFraction: 0.222,\n offsets: {\n underline: 0.1,\n linethrough: -0.28167, // added 1/30 to original number\n overline: -0.81333, // added 1/15 to original number\n },\n _fontSizeMult: 1.13,\n [TEXT_DECORATION_THICKNESS]: 66.667, // before implementation was 1/15\n};\n\nexport const JUSTIFY = 'justify';\nexport const JUSTIFY_LEFT = 'justify-left';\nexport const JUSTIFY_RIGHT = 'justify-right';\nexport const JUSTIFY_CENTER = 'justify-center';\n","import { getSvgRegex } from './getSvgRegex';\nimport { LEFT, TOP } from '../constants';\nimport { TEXT_DECORATION_THICKNESS } from '../shapes/Text/constants';\n\n// matches, e.g.: +14.56e-12, etc.\nexport const reNum = String.raw`[-+]?(?:\\d*\\.\\d+|\\d+\\.?)(?:[eE][-+]?\\d+)?`;\nexport const viewportSeparator = String.raw`(?:\\s*,?\\s+|\\s*,\\s*)`;\n\nexport const svgNS = 'http://www.w3.org/2000/svg';\n\nexport const reFontDeclaration = new RegExp(\n '(normal|italic)?\\\\s*(normal|small-caps)?\\\\s*' +\n '(normal|bold|bolder|lighter|100|200|300|400|500|600|700|800|900)?\\\\s*(' +\n reNum +\n '(?:px|cm|mm|em|pt|pc|in)*)(?:\\\\/(normal|' +\n reNum +\n '))?\\\\s+(.*)',\n);\n\nexport const svgValidTagNames = [\n 'path',\n 'circle',\n 'polygon',\n 'polyline',\n 'ellipse',\n 'rect',\n 'line',\n 'image',\n 'text',\n ],\n svgViewBoxElements = ['symbol', 'image', 'marker', 'pattern', 'view', 'svg'],\n svgInvalidAncestors = [\n 'pattern',\n 'defs',\n 'symbol',\n 'metadata',\n 'clipPath',\n 'mask',\n 'desc',\n ],\n svgValidParents = ['symbol', 'g', 'a', 'svg', 'clipPath', 'defs'],\n attributesMap = {\n cx: LEFT,\n x: LEFT,\n r: 'radius',\n cy: TOP,\n y: TOP,\n display: 'visible',\n visibility: 'visible',\n transform: 'transformMatrix',\n 'fill-opacity': 'fillOpacity',\n 'fill-rule': 'fillRule',\n 'font-family': 'fontFamily',\n 'font-size': 'fontSize',\n 'font-style': 'fontStyle',\n 'font-weight': 'fontWeight',\n 'letter-spacing': 'charSpacing',\n 'paint-order': 'paintFirst',\n 'stroke-dasharray': 'strokeDashArray',\n 'stroke-dashoffset': 'strokeDashOffset',\n 'stroke-linecap': 'strokeLineCap',\n 'stroke-linejoin': 'strokeLineJoin',\n 'stroke-miterlimit': 'strokeMiterLimit',\n 'stroke-opacity': 'strokeOpacity',\n 'stroke-width': 'strokeWidth',\n 'text-decoration': 'textDecoration',\n 'text-anchor': 'textAnchor',\n opacity: 'opacity',\n 'clip-path': 'clipPath',\n 'clip-rule': 'clipRule',\n 'vector-effect': 'strokeUniform',\n 'image-rendering': 'imageSmoothing',\n 'text-decoration-thickness': TEXT_DECORATION_THICKNESS,\n },\n fSize = 'font-size',\n cPath = 'clip-path';\n\nexport const svgValidTagNamesRegEx = getSvgRegex(svgValidTagNames);\n\nexport const svgViewBoxElementsRegEx = getSvgRegex(svgViewBoxElements);\n\nexport const svgValidParentsRegEx = getSvgRegex(svgValidParents);\n\n// http://www.w3.org/TR/SVG/coords.html#ViewBoxAttribute\n\nexport const reViewBoxAttrValue = new RegExp(\n String.raw`^\\s*(${reNum})${viewportSeparator}(${reNum})${viewportSeparator}(${reNum})${viewportSeparator}(${reNum})\\s*$`,\n);\n","import { classRegistry } from './ClassRegistry';\nimport { Color } from './color/Color';\nimport { config } from './config';\nimport { reNum } from './parser/constants';\nimport { Point } from './Point';\nimport type { FabricObject } from './shapes/Object/FabricObject';\nimport type { TClassProperties } from './typedefs';\nimport { uid } from './util/internals/uid';\nimport { pickBy } from './util/misc/pick';\nimport { degreesToRadians } from './util/misc/radiansDegreesConversion';\nimport { toFixed } from './util/misc/toFixed';\nimport { rotateVector } from './util/misc/vectors';\n\n/**\n * Regex matching shadow offsetX, offsetY and blur (ex: \"2px 2px 10px rgba(0,0,0,0.2)\", \"rgb(0,255,0) 2px 2px\")\n * - (?:\\s|^): This part captures either a whitespace character (\\s) or the beginning of a line (^). It's non-capturing (due to (?:...)), meaning it doesn't create a capturing group.\n * - (-?\\d+(?:\\.\\d*)?(?:px)?(?:\\s?|$))?: This captures the first component of the shadow, which is the horizontal offset. Breaking it down:\n * - (-?\\d+): Captures an optional minus sign followed by one or more digits (integer part of the number).\n * - (?:\\.\\d*)?: Optionally captures a decimal point followed by zero or more digits (decimal part of the number).\n * - (?:px)?: Optionally captures the \"px\" unit.\n * - (?:\\s?|$): Captures either an optional whitespace or the end of the line. This whole part is wrapped in a non-capturing group and marked as optional with ?.\n * - (-?\\d+(?:\\.\\d*)?(?:px)?(?:\\s?|$))?: Similar to the previous step, this captures the vertical offset.\n\n(\\d+(?:\\.\\d*)?(?:px)?)?: This captures the blur radius. It's similar to the horizontal offset but without the optional minus sign.\n\n(?:\\s+(-?\\d+(?:\\.\\d*)?(?:px)?(?:\\s?|$))?){0,1}: This captures an optional part for the color. It allows for whitespace followed by a component with an optional minus sign, digits, decimal point, and \"px\" unit.\n\n(?:$|\\s): This captures either the end of the line or a whitespace character. It ensures that the match ends either at the end of the string or with a whitespace character.\n */\n// eslint-disable-next-line max-len\n\nconst shadowOffsetRegex = '(-?\\\\d+(?:\\\\.\\\\d*)?(?:px)?(?:\\\\s?|$))?';\n\nconst reOffsetsAndBlur = new RegExp(\n '(?:\\\\s|^)' +\n shadowOffsetRegex +\n shadowOffsetRegex +\n '(' +\n reNum +\n '?(?:px)?)?(?:\\\\s?|$)(?:$|\\\\s)',\n);\n\nexport const shadowDefaultValues: Partial> = {\n color: 'rgb(0,0,0)',\n blur: 0,\n offsetX: 0,\n offsetY: 0,\n affectStroke: false,\n includeDefaultValues: true,\n nonScaling: false,\n};\n\nexport type SerializedShadowOptions = {\n color: string;\n blur: number;\n offsetX: number;\n offsetY: number;\n affectStroke: boolean;\n nonScaling: boolean;\n type: string;\n};\n\nexport class Shadow {\n /**\n * Shadow color\n * @type String\n */\n declare color: string;\n\n /**\n * Shadow blur\n * @type Number\n */\n declare blur: number;\n\n /**\n * Shadow horizontal offset\n * @type Number\n */\n declare offsetX: number;\n\n /**\n * Shadow vertical offset\n * @type Number\n */\n declare offsetY: number;\n\n /**\n * Whether the shadow should affect stroke operations\n * @type Boolean\n */\n declare affectStroke: boolean;\n\n /**\n * Indicates whether toObject should include default values\n * @type Boolean\n */\n declare includeDefaultValues: boolean;\n\n /**\n * When `false`, the shadow will scale with the object.\n * When `true`, the shadow's offsetX, offsetY, and blur will not be affected by the object's scale.\n * default to false\n * @type Boolean\n */\n declare nonScaling: boolean;\n\n declare id: number;\n\n static ownDefaults = shadowDefaultValues;\n\n static type = 'shadow';\n\n /**\n * @see {@link http://fabricjs.com/shadows|Shadow demo}\n * @param {Object|String} [options] Options object with any of color, blur, offsetX, offsetY properties or string (e.g. \"rgba(0,0,0,0.2) 2px 2px 10px\")\n */\n constructor(options?: Partial>);\n constructor(svgAttribute: string);\n constructor(arg0: string | Partial> = {}) {\n const options: Partial> =\n typeof arg0 === 'string' ? Shadow.parseShadow(arg0) : arg0;\n Object.assign(this, Shadow.ownDefaults, options);\n this.id = uid();\n }\n\n /**\n * @param {String} value Shadow value to parse\n * @return {Object} Shadow object with color, offsetX, offsetY and blur\n */\n static parseShadow(value: string) {\n const shadowStr = value.trim(),\n [, offsetX = 0, offsetY = 0, blur = 0] = (\n reOffsetsAndBlur.exec(shadowStr) || []\n ).map((value) => parseFloat(value) || 0),\n color = (shadowStr.replace(reOffsetsAndBlur, '') || 'rgb(0,0,0)').trim();\n\n return {\n color,\n offsetX,\n offsetY,\n blur,\n };\n }\n\n /**\n * Returns a string representation of an instance\n * @see http://www.w3.org/TR/css-text-decor-3/#text-shadow\n * @return {String} Returns CSS3 text-shadow declaration\n */\n toString() {\n return [this.offsetX, this.offsetY, this.blur, this.color].join('px ');\n }\n\n /**\n * Returns SVG representation of a shadow\n * @param {FabricObject} object\n * @return {String} SVG representation of a shadow\n */\n toSVG(object: FabricObject) {\n const offset = rotateVector(\n new Point(this.offsetX, this.offsetY),\n degreesToRadians(-object.angle),\n ),\n BLUR_BOX = 20,\n color = new Color(this.color);\n let fBoxX = 40,\n fBoxY = 40;\n\n if (object.width && object.height) {\n //http://www.w3.org/TR/SVG/filters.html#FilterEffectsRegion\n // we add some extra space to filter box to contain the blur ( 20 )\n fBoxX =\n toFixed(\n (Math.abs(offset.x) + this.blur) / object.width,\n config.NUM_FRACTION_DIGITS,\n ) *\n 100 +\n BLUR_BOX;\n fBoxY =\n toFixed(\n (Math.abs(offset.y) + this.blur) / object.height,\n config.NUM_FRACTION_DIGITS,\n ) *\n 100 +\n BLUR_BOX;\n }\n if (object.flipX) {\n offset.x *= -1;\n }\n if (object.flipY) {\n offset.y *= -1;\n }\n\n return `\\n\\t\\n\\t\\n\\t\\n\\t\\n\\t\\n\\t\\t\\n\\t\\t\\n\\t\\n\\n`;\n }\n\n /**\n * Returns object representation of a shadow\n * @return {Object} Object representation of a shadow instance\n */\n toObject() {\n const data: SerializedShadowOptions = {\n color: this.color,\n blur: this.blur,\n offsetX: this.offsetX,\n offsetY: this.offsetY,\n affectStroke: this.affectStroke,\n nonScaling: this.nonScaling,\n type: (this.constructor as typeof Shadow).type,\n };\n const defaults = Shadow.ownDefaults as SerializedShadowOptions;\n return !this.includeDefaultValues\n ? pickBy(data, (value, key) => value !== defaults[key])\n : data;\n }\n\n static async fromObject(options: Partial>) {\n return new this(options);\n }\n}\n\nclassRegistry.setClass(Shadow, 'shadow');\n","export const capValue = (min: number, value: number, max: number) =>\n Math.max(min, Math.min(value, max));\n","import {\n TOP,\n LEFT,\n SCALE_Y,\n SCALE_X,\n SKEW_X,\n SKEW_Y,\n FILL,\n STROKE,\n} from '../../constants';\nimport type { TClassProperties } from '../../typedefs';\nimport type { InteractiveFabricObject } from './InteractiveObject';\nimport type { FabricObject } from './Object';\n\nexport const stateProperties = [\n TOP,\n LEFT,\n SCALE_X,\n SCALE_Y,\n 'flipX',\n 'flipY',\n 'originX',\n 'originY',\n 'angle',\n 'opacity',\n 'globalCompositeOperation',\n 'shadow',\n 'visible',\n SKEW_X,\n SKEW_Y,\n];\n\nexport const cacheProperties = [\n FILL,\n STROKE,\n 'strokeWidth',\n 'strokeDashArray',\n 'width',\n 'height',\n 'paintFirst',\n 'strokeUniform',\n 'strokeLineCap',\n 'strokeDashOffset',\n 'strokeLineJoin',\n 'strokeMiterLimit',\n 'backgroundColor',\n 'clipPath',\n];\n\nexport const fabricObjectDefaultValues: Partial<\n TClassProperties\n> = {\n // see composeMatrix() to see order of transforms. First defaults listed based on this\n top: 0,\n left: 0,\n width: 0,\n height: 0,\n angle: 0,\n flipX: false,\n flipY: false,\n scaleX: 1,\n scaleY: 1,\n minScaleLimit: 0,\n skewX: 0,\n skewY: 0,\n originX: LEFT,\n originY: TOP,\n strokeWidth: 1,\n strokeUniform: false,\n padding: 0,\n opacity: 1,\n paintFirst: FILL,\n fill: 'rgb(0,0,0)',\n fillRule: 'nonzero',\n stroke: null,\n strokeDashArray: null,\n strokeDashOffset: 0,\n strokeLineCap: 'butt',\n strokeLineJoin: 'miter',\n strokeMiterLimit: 4,\n globalCompositeOperation: 'source-over',\n backgroundColor: '',\n shadow: null,\n visible: true,\n includeDefaultValues: true,\n excludeFromExport: false,\n objectCaching: true,\n clipPath: undefined,\n inverted: false,\n absolutePositioned: false,\n centeredRotation: true,\n centeredScaling: false,\n dirty: true,\n} as const;\n\nexport const interactiveObjectDefaultValues: Partial<\n TClassProperties\n> = {\n noScaleCache: true,\n lockMovementX: false,\n lockMovementY: false,\n lockRotation: false,\n lockScalingX: false,\n lockScalingY: false,\n lockSkewingX: false,\n lockSkewingY: false,\n lockScalingFlip: false,\n cornerSize: 13,\n touchCornerSize: 24,\n transparentCorners: true,\n cornerColor: 'rgb(178,204,255)',\n cornerStrokeColor: '',\n cornerStyle: 'rect',\n cornerDashArray: null,\n hasControls: true,\n borderColor: 'rgb(178,204,255)',\n borderDashArray: null,\n borderOpacityWhenMoving: 0.4,\n borderScaleFactor: 1,\n hasBorders: true,\n selectionBackgroundColor: '',\n selectable: true,\n evented: true,\n perPixelTargetFind: false,\n activeOn: 'down',\n hoverCursor: null,\n moveCursor: null,\n};\n","/**\n * Easing functions\n * @see {@link http://gizma.com/easing/ Easing Equations by Robert Penner}\n */\n\nimport { twoMathPi, halfPI } from '../../constants';\nimport type { TEasingFunction } from './types';\n\nconst normalize = (a: number, c: number, p: number, s: number) => {\n if (a < Math.abs(c)) {\n a = c;\n s = p / 4;\n } else {\n //handle the 0/0 case:\n if (c === 0 && a === 0) {\n s = (p / twoMathPi) * Math.asin(1);\n } else {\n s = (p / twoMathPi) * Math.asin(c / a);\n }\n }\n return { a, c, p, s };\n};\n\nconst elastic = (\n a: number,\n s: number,\n p: number,\n t: number,\n d: number,\n): number =>\n a * Math.pow(2, 10 * (t -= 1)) * Math.sin(((t * d - s) * twoMathPi) / p);\n\n/**\n * Default sinusoidal easing\n */\nexport const defaultEasing: TEasingFunction = (t, b, c, d) =>\n -c * Math.cos((t / d) * halfPI) + c + b;\n\n/**\n * Cubic easing in\n */\nexport const easeInCubic: TEasingFunction = (t, b, c, d) =>\n c * (t / d) ** 3 + b;\n\n/**\n * Cubic easing out\n */\nexport const easeOutCubic: TEasingFunction = (t, b, c, d) =>\n c * ((t / d - 1) ** 3 + 1) + b;\n\n/**\n * Cubic easing in and out\n */\nexport const easeInOutCubic: TEasingFunction = (t, b, c, d) => {\n t /= d / 2;\n if (t < 1) {\n return (c / 2) * t ** 3 + b;\n }\n return (c / 2) * ((t - 2) ** 3 + 2) + b;\n};\n\n/**\n * Quartic easing in\n */\nexport const easeInQuart: TEasingFunction = (t, b, c, d) =>\n c * (t /= d) * t ** 3 + b;\n\n/**\n * Quartic easing out\n */\nexport const easeOutQuart: TEasingFunction = (t, b, c, d) =>\n -c * ((t = t / d - 1) * t ** 3 - 1) + b;\n\n/**\n * Quartic easing in and out\n */\nexport const easeInOutQuart: TEasingFunction = (t, b, c, d) => {\n t /= d / 2;\n if (t < 1) {\n return (c / 2) * t ** 4 + b;\n }\n return (-c / 2) * ((t -= 2) * t ** 3 - 2) + b;\n};\n\n/**\n * Quintic easing in\n */\nexport const easeInQuint: TEasingFunction = (t, b, c, d) =>\n c * (t / d) ** 5 + b;\n\n/**\n * Quintic easing out\n */\nexport const easeOutQuint: TEasingFunction = (t, b, c, d) =>\n c * ((t / d - 1) ** 5 + 1) + b;\n\n/**\n * Quintic easing in and out\n */\nexport const easeInOutQuint: TEasingFunction = (t, b, c, d) => {\n t /= d / 2;\n if (t < 1) {\n return (c / 2) * t ** 5 + b;\n }\n return (c / 2) * ((t - 2) ** 5 + 2) + b;\n};\n\n/**\n * Sinusoidal easing in\n */\nexport const easeInSine: TEasingFunction = (t, b, c, d) =>\n -c * Math.cos((t / d) * halfPI) + c + b;\n\n/**\n * Sinusoidal easing out\n */\nexport const easeOutSine: TEasingFunction = (t, b, c, d) =>\n c * Math.sin((t / d) * halfPI) + b;\n\n/**\n * Sinusoidal easing in and out\n */\nexport const easeInOutSine: TEasingFunction = (t, b, c, d) =>\n (-c / 2) * (Math.cos((Math.PI * t) / d) - 1) + b;\n\n/**\n * Exponential easing in\n */\nexport const easeInExpo: TEasingFunction = (t, b, c, d) =>\n t === 0 ? b : c * 2 ** (10 * (t / d - 1)) + b;\n\n/**\n * Exponential easing out\n */\nexport const easeOutExpo: TEasingFunction = (t, b, c, d) =>\n t === d ? b + c : c * -(2 ** ((-10 * t) / d) + 1) + b;\n\n/**\n * Exponential easing in and out\n */\nexport const easeInOutExpo: TEasingFunction = (t, b, c, d) => {\n if (t === 0) {\n return b;\n }\n if (t === d) {\n return b + c;\n }\n t /= d / 2;\n if (t < 1) {\n return (c / 2) * 2 ** (10 * (t - 1)) + b;\n }\n return (c / 2) * -(2 ** (-10 * --t) + 2) + b;\n};\n\n/**\n * Circular easing in\n */\nexport const easeInCirc: TEasingFunction = (t, b, c, d) =>\n -c * (Math.sqrt(1 - (t /= d) * t) - 1) + b;\n\n/**\n * Circular easing out\n */\nexport const easeOutCirc: TEasingFunction = (t, b, c, d) =>\n c * Math.sqrt(1 - (t = t / d - 1) * t) + b;\n\n/**\n * Circular easing in and out\n */\nexport const easeInOutCirc: TEasingFunction = (t, b, c, d) => {\n t /= d / 2;\n if (t < 1) {\n return (-c / 2) * (Math.sqrt(1 - t ** 2) - 1) + b;\n }\n return (c / 2) * (Math.sqrt(1 - (t -= 2) * t) + 1) + b;\n};\n\n/**\n * Elastic easing in\n */\nexport const easeInElastic: TEasingFunction = (t, b, c, d) => {\n const s = 1.70158,\n a = c;\n let p = 0;\n if (t === 0) {\n return b;\n }\n t /= d;\n if (t === 1) {\n return b + c;\n }\n if (!p) {\n p = d * 0.3;\n }\n const { a: normA, s: normS, p: normP } = normalize(a, c, p, s);\n return -elastic(normA, normS, normP, t, d) + b;\n};\n\n/**\n * Elastic easing out\n */\nexport const easeOutElastic: TEasingFunction = (t, b, c, d) => {\n const s = 1.70158,\n a = c;\n let p = 0;\n if (t === 0) {\n return b;\n }\n t /= d;\n if (t === 1) {\n return b + c;\n }\n if (!p) {\n p = d * 0.3;\n }\n const { a: normA, s: normS, p: normP, c: normC } = normalize(a, c, p, s);\n return (\n normA * 2 ** (-10 * t) * Math.sin(((t * d - normS) * twoMathPi) / normP) +\n normC +\n b\n );\n};\n\n/**\n * Elastic easing in and out\n */\nexport const easeInOutElastic: TEasingFunction = (t, b, c, d) => {\n const s = 1.70158,\n a = c;\n let p = 0;\n if (t === 0) {\n return b;\n }\n t /= d / 2;\n if (t === 2) {\n return b + c;\n }\n if (!p) {\n p = d * (0.3 * 1.5);\n }\n const { a: normA, s: normS, p: normP, c: normC } = normalize(a, c, p, s);\n if (t < 1) {\n return -0.5 * elastic(normA, normS, normP, t, d) + b;\n }\n return (\n normA *\n Math.pow(2, -10 * (t -= 1)) *\n Math.sin(((t * d - normS) * twoMathPi) / normP) *\n 0.5 +\n normC +\n b\n );\n};\n\n/**\n * Backwards easing in\n */\nexport const easeInBack: TEasingFunction = (t, b, c, d, s = 1.70158) =>\n c * (t /= d) * t * ((s + 1) * t - s) + b;\n\n/**\n * Backwards easing out\n */\nexport const easeOutBack: TEasingFunction = (t, b, c, d, s = 1.70158) =>\n c * ((t = t / d - 1) * t * ((s + 1) * t + s) + 1) + b;\n\n/**\n * Backwards easing in and out\n */\nexport const easeInOutBack: TEasingFunction = (t, b, c, d, s = 1.70158) => {\n t /= d / 2;\n if (t < 1) {\n return (c / 2) * (t * t * (((s *= 1.525) + 1) * t - s)) + b;\n }\n return (c / 2) * ((t -= 2) * t * (((s *= 1.525) + 1) * t + s) + 2) + b;\n};\n\n/**\n * Bouncing easing out\n */\nexport const easeOutBounce: TEasingFunction = (t, b, c, d) => {\n if ((t /= d) < 1 / 2.75) {\n return c * (7.5625 * t * t) + b;\n } else if (t < 2 / 2.75) {\n return c * (7.5625 * (t -= 1.5 / 2.75) * t + 0.75) + b;\n } else if (t < 2.5 / 2.75) {\n return c * (7.5625 * (t -= 2.25 / 2.75) * t + 0.9375) + b;\n } else {\n return c * (7.5625 * (t -= 2.625 / 2.75) * t + 0.984375) + b;\n }\n};\n\n/**\n * Bouncing easing in\n */\nexport const easeInBounce: TEasingFunction = (t, b, c, d) =>\n c - easeOutBounce(d - t, 0, c, d) + b;\n\n/**\n * Bouncing easing in and out\n */\nexport const easeInOutBounce: TEasingFunction = (t, b, c, d) =>\n t < d / 2\n ? easeInBounce(t * 2, 0, c, d) * 0.5 + b\n : easeOutBounce(t * 2 - d, 0, c, d) * 0.5 + c * 0.5 + b;\n\n/**\n * Quadratic easing in\n */\nexport const easeInQuad: TEasingFunction = (t, b, c, d) => c * (t /= d) * t + b;\n\n/**\n * Quadratic easing out\n */\nexport const easeOutQuad: TEasingFunction = (t, b, c, d) =>\n -c * (t /= d) * (t - 2) + b;\n\n/**\n * Quadratic easing in and out\n */\nexport const easeInOutQuad: TEasingFunction = (t, b, c, d) => {\n t /= d / 2;\n if (t < 1) {\n return (c / 2) * t ** 2 + b;\n }\n return (-c / 2) * (--t * (t - 2) - 1) + b;\n};\n","import { noop } from '../../constants';\nimport { requestAnimFrame } from './AnimationFrameProvider';\nimport { runningAnimations } from './AnimationRegistry';\nimport { defaultEasing } from './easing';\nimport type {\n AnimationState,\n TAbortCallback,\n TBaseAnimationOptions,\n TEasingFunction,\n TOnAnimationChangeCallback,\n} from './types';\n\nconst defaultAbort = () => false;\n\nexport abstract class AnimationBase<\n T extends number | number[] = number | number[],\n> {\n declare readonly startValue: T;\n declare readonly endValue: T;\n declare readonly duration: number;\n declare readonly delay: number;\n\n declare protected readonly byValue: T;\n declare protected readonly easing: TEasingFunction;\n\n declare private readonly _onStart: VoidFunction;\n declare private readonly _onChange: TOnAnimationChangeCallback;\n declare private readonly _onComplete: TOnAnimationChangeCallback;\n declare private readonly _abort: TAbortCallback;\n\n /**\n * Used to register the animation to a target object\n * so that it can be cancelled within the object context\n */\n declare readonly target?: unknown;\n\n private _state: AnimationState = 'pending';\n /**\n * Time %, or the ratio of `timeElapsed / duration`\n * @see tick\n */\n durationProgress = 0;\n /**\n * Value %, or the ratio of `(currentValue - startValue) / (endValue - startValue)`\n */\n valueProgress = 0;\n /**\n * Current value\n */\n declare value: T;\n /**\n * Animation start time ms\n */\n declare private startTime: number;\n\n constructor({\n startValue,\n byValue,\n duration = 500,\n delay = 0,\n easing = defaultEasing,\n onStart = noop,\n onChange = noop,\n onComplete = noop,\n abort = defaultAbort,\n target,\n }: TBaseAnimationOptions) {\n this.tick = this.tick.bind(this);\n\n this.duration = duration;\n this.delay = delay;\n this.easing = easing;\n this._onStart = onStart;\n this._onChange = onChange;\n this._onComplete = onComplete;\n this._abort = abort;\n this.target = target;\n\n this.startValue = startValue;\n this.byValue = byValue;\n this.value = this.startValue;\n this.endValue = Object.freeze(this.calculate(this.duration).value);\n }\n\n get state() {\n return this._state;\n }\n\n isDone() {\n return this._state === 'aborted' || this._state === 'completed';\n }\n\n /**\n * Calculate the current value based on the easing parameters\n * @param timeElapsed in ms\n * @protected\n */\n protected abstract calculate(timeElapsed: number): {\n value: T;\n valueProgress: number;\n };\n\n start() {\n const firstTick: FrameRequestCallback = (timestamp) => {\n if (this._state !== 'pending') return;\n this.startTime = timestamp || +new Date();\n this._state = 'running';\n this._onStart();\n this.tick(this.startTime);\n };\n\n this.register();\n\n // setTimeout(cb, 0) will run cb on the next frame, causing a delay\n // we don't want that\n if (this.delay > 0) {\n setTimeout(() => requestAnimFrame(firstTick), this.delay);\n } else {\n requestAnimFrame(firstTick);\n }\n }\n\n private tick(t: number) {\n const durationMs = (t || +new Date()) - this.startTime;\n const boundDurationMs = Math.min(durationMs, this.duration);\n this.durationProgress = boundDurationMs / this.duration;\n const { value, valueProgress } = this.calculate(boundDurationMs);\n this.value = Object.freeze(value);\n this.valueProgress = valueProgress;\n\n if (this._state === 'aborted') {\n return;\n } else if (\n this._abort(this.value, this.valueProgress, this.durationProgress)\n ) {\n this._state = 'aborted';\n this.unregister();\n } else if (durationMs >= this.duration) {\n this.durationProgress = this.valueProgress = 1;\n this._onChange(this.endValue, this.valueProgress, this.durationProgress);\n this._state = 'completed';\n this._onComplete(\n this.endValue,\n this.valueProgress,\n this.durationProgress,\n );\n this.unregister();\n } else {\n this._onChange(this.value, this.valueProgress, this.durationProgress);\n requestAnimFrame(this.tick);\n }\n }\n\n private register() {\n runningAnimations.push(this as unknown as AnimationBase);\n }\n\n private unregister() {\n runningAnimations.remove(this as unknown as AnimationBase);\n }\n\n abort() {\n this._state = 'aborted';\n this.unregister();\n }\n}\n","import { AnimationBase } from './AnimationBase';\nimport type { ValueAnimationOptions } from './types';\n\nexport class ValueAnimation extends AnimationBase {\n constructor({\n startValue = 0,\n endValue = 100,\n ...otherOptions\n }: ValueAnimationOptions) {\n super({\n ...otherOptions,\n startValue,\n byValue: endValue - startValue,\n });\n }\n\n protected calculate(timeElapsed: number) {\n const value = this.easing(\n timeElapsed,\n this.startValue,\n this.byValue,\n this.duration,\n );\n return {\n value,\n valueProgress: Math.abs((value - this.startValue) / this.byValue),\n };\n }\n}\n","import { AnimationBase } from './AnimationBase';\nimport type { ArrayAnimationOptions } from './types';\n\nexport class ArrayAnimation extends AnimationBase {\n constructor({\n startValue = [0],\n endValue = [100],\n ...options\n }: ArrayAnimationOptions) {\n super({\n ...options,\n startValue,\n byValue: endValue.map((value, i) => value - startValue[i]),\n });\n }\n protected calculate(timeElapsed: number) {\n const values = this.startValue.map((value, i) =>\n this.easing(timeElapsed, value, this.byValue[i], this.duration, i),\n );\n return {\n value: values,\n valueProgress: Math.abs(\n (values[0] - this.startValue[0]) / this.byValue[0],\n ),\n };\n }\n}\n","import { Color } from '../../color/Color';\nimport type { TRGBAColorSource } from '../../color/typedefs';\nimport { halfPI } from '../../constants';\nimport { capValue } from '../misc/capValue';\nimport { AnimationBase } from './AnimationBase';\nimport type {\n ColorAnimationOptions,\n TEasingFunction,\n TOnAnimationChangeCallback,\n} from './types';\n\nconst defaultColorEasing: TEasingFunction = (\n timeElapsed,\n startValue,\n byValue,\n duration,\n) => {\n const durationProgress = 1 - Math.cos((timeElapsed / duration) * halfPI);\n return startValue + byValue * durationProgress;\n};\n\nconst wrapColorCallback = (\n callback?: TOnAnimationChangeCallback,\n) =>\n callback &&\n ((rgba: TRGBAColorSource, valueProgress: number, durationProgress: number) =>\n callback(new Color(rgba).toRgba(), valueProgress, durationProgress));\n\nexport class ColorAnimation extends AnimationBase {\n constructor({\n startValue,\n endValue,\n easing = defaultColorEasing,\n onChange,\n onComplete,\n abort,\n ...options\n }: ColorAnimationOptions) {\n const startColor = new Color(startValue).getSource();\n const endColor = new Color(endValue).getSource();\n super({\n ...options,\n startValue: startColor,\n byValue: endColor.map(\n (value, i) => value - startColor[i],\n ) as TRGBAColorSource,\n easing,\n onChange: wrapColorCallback(onChange),\n onComplete: wrapColorCallback(onComplete),\n abort: wrapColorCallback(abort),\n });\n }\n protected calculate(timeElapsed: number) {\n const [r, g, b, a] = this.startValue.map((value, i) =>\n this.easing(timeElapsed, value, this.byValue[i], this.duration, i),\n ) as TRGBAColorSource;\n const value = [\n ...[r, g, b].map(Math.round),\n capValue(0, a, 1),\n ] as TRGBAColorSource;\n return {\n value,\n valueProgress:\n // to correctly calculate the change ratio we must find a changed value\n value\n .map((p, i) =>\n this.byValue[i] !== 0\n ? Math.abs((p - this.startValue[i]) / this.byValue[i])\n : 0,\n )\n .find((p) => p !== 0) || 0,\n };\n }\n}\n","import { ValueAnimation } from './ValueAnimation';\nimport { ArrayAnimation } from './ArrayAnimation';\nimport { ColorAnimation } from './ColorAnimation';\nimport type {\n ValueAnimationOptions,\n ArrayAnimationOptions,\n ColorAnimationOptions,\n} from './types';\nimport type { TColorArg } from '../../color/typedefs';\n\nexport type TAnimation =\n T extends TColorArg\n ? ColorAnimation\n : T extends number[]\n ? ArrayAnimation\n : ValueAnimation;\n\nconst isArrayAnimation = (\n options: ArrayAnimationOptions | ValueAnimationOptions,\n): options is ArrayAnimationOptions => {\n return Array.isArray(options.startValue) || Array.isArray(options.endValue);\n};\n\n/**\n * Changes value(s) from startValue to endValue within a certain period of time,\n * invoking callbacks as the value(s) change.\n *\n * @example\n * animate({\n * startValue: 1,\n * endValue: 0,\n * onChange: (v) => {\n * obj.set('opacity', v);\n * // since we are running in a requested frame we should call `renderAll` and not `requestRenderAll`\n * canvas.renderAll();\n * }\n * });\n *\n * @example Using lists:\n * animate({\n * startValue: [1, 2, 3],\n * endValue: [2, 4, 6],\n * onChange: ([x, y, zoom]) => {\n * canvas.zoomToPoint(new Point(x, y), zoom);\n * canvas.renderAll();\n * }\n * });\n *\n */\nexport function animate(options: ArrayAnimationOptions): ArrayAnimation;\nexport function animate(options: ValueAnimationOptions): ValueAnimation;\nexport function animate<\n T extends ValueAnimationOptions | ArrayAnimationOptions,\n>(\n options: T,\n): T extends ArrayAnimationOptions ? ArrayAnimation : ValueAnimation;\nexport function animate<\n T extends ValueAnimationOptions | ArrayAnimationOptions,\n R extends T extends ArrayAnimationOptions ? ArrayAnimation : ValueAnimation,\n>(options: T): R {\n const animation = (\n isArrayAnimation(options)\n ? new ArrayAnimation(options)\n : new ValueAnimation(options)\n ) as R;\n animation.start();\n return animation;\n}\n\nexport function animateColor(options: ColorAnimationOptions) {\n const animation = new ColorAnimation(options);\n animation.start();\n return animation;\n}\n","import { Point } from './Point';\nimport { createVector } from './util/misc/vectors';\n\n/* Adaptation of work of Kevin Lindsey (kevin@kevlindev.com) */\n\nexport type IntersectionType = 'Intersection' | 'Coincident' | 'Parallel';\n\nexport class Intersection {\n declare points: Point[];\n\n declare status?: IntersectionType;\n\n constructor(status?: IntersectionType) {\n this.status = status;\n this.points = [];\n }\n\n /**\n * Used to verify if a point is alredy in the collection\n * @param {Point} point\n * @returns {boolean}\n */\n private includes(point: Point): boolean {\n return this.points.some((p) => p.eq(point));\n }\n\n /**\n * Appends points of intersection\n * @param {...Point[]} points\n * @return {Intersection} thisArg\n * @chainable\n */\n private append(...points: Point[]): Intersection {\n this.points = this.points.concat(\n points.filter((point) => {\n return !this.includes(point);\n }),\n );\n return this;\n }\n\n /**\n * check if point T is on the segment or line defined between A and B\n *\n * @param {Point} T the point we are checking for\n * @param {Point} A one extremity of the segment\n * @param {Point} B the other extremity of the segment\n * @param [infinite] if true checks if `T` is on the line defined by `A` and `B`\n * @returns true if `T` is contained\n */\n static isPointContained(T: Point, A: Point, B: Point, infinite = false) {\n if (A.eq(B)) {\n // Edge case: the segment is a point, we check for coincidence,\n // infinite param has no meaning because there are infinite lines to consider\n return T.eq(A);\n } else if (A.x === B.x) {\n // Edge case: horizontal line.\n // we first check if T.x has the same value, and then if T.y is contained between A.y and B.y\n return (\n T.x === A.x &&\n (infinite || (T.y >= Math.min(A.y, B.y) && T.y <= Math.max(A.y, B.y)))\n );\n } else if (A.y === B.y) {\n // Edge case: vertical line.\n // we first check if T.y has the same value, and then if T.x is contained between A.x and B.x\n return (\n T.y === A.y &&\n (infinite || (T.x >= Math.min(A.x, B.x) && T.x <= Math.max(A.x, B.x)))\n );\n } else {\n // Generic case: sloped line.\n // we check that AT has the same slope as AB\n // for the segment case we need both the vectors to have the same direction and for AT to be lte AB in size\n // for the infinite case we check the absolute value of the slope, since direction is meaningless\n const AB = createVector(A, B);\n const AT = createVector(A, T);\n const s = AT.divide(AB);\n return infinite\n ? Math.abs(s.x) === Math.abs(s.y)\n : s.x === s.y && s.x >= 0 && s.x <= 1;\n }\n }\n\n /**\n * Use the ray casting algorithm to determine if {@link point} is in the polygon defined by {@link points}\n * @see https://en.wikipedia.org/wiki/Point_in_polygon\n * @param point\n * @param points polygon points\n * @returns\n */\n static isPointInPolygon(point: Point, points: Point[]) {\n const other = new Point(point).setX(\n Math.min(point.x - 1, ...points.map((p) => p.x)),\n );\n let hits = 0;\n for (let index = 0; index < points.length; index++) {\n const inter = this.intersectSegmentSegment(\n // polygon side\n points[index],\n points[(index + 1) % points.length],\n // ray\n point,\n other,\n );\n if (inter.includes(point)) {\n // point is on the polygon side\n return true;\n }\n hits += Number(inter.status === 'Intersection');\n }\n return hits % 2 === 1;\n }\n\n /**\n * Checks if a line intersects another\n * @see {@link https://en.wikipedia.org/wiki/Line%E2%80%93line_intersection line intersection}\n * @see {@link https://en.wikipedia.org/wiki/Cramer%27s_rule Cramer's rule}\n * @param {Point} a1\n * @param {Point} a2\n * @param {Point} b1\n * @param {Point} b2\n * @param {boolean} [aInfinite=true] check segment intersection by passing `false`\n * @param {boolean} [bInfinite=true] check segment intersection by passing `false`\n * @return {Intersection}\n */\n static intersectLineLine(\n a1: Point,\n a2: Point,\n b1: Point,\n b2: Point,\n aInfinite = true,\n bInfinite = true,\n ): Intersection {\n const a2xa1x = a2.x - a1.x,\n a2ya1y = a2.y - a1.y,\n b2xb1x = b2.x - b1.x,\n b2yb1y = b2.y - b1.y,\n a1xb1x = a1.x - b1.x,\n a1yb1y = a1.y - b1.y,\n uaT = b2xb1x * a1yb1y - b2yb1y * a1xb1x,\n ubT = a2xa1x * a1yb1y - a2ya1y * a1xb1x,\n uB = b2yb1y * a2xa1x - b2xb1x * a2ya1y;\n if (uB !== 0) {\n const ua = uaT / uB,\n ub = ubT / uB;\n if (\n (aInfinite || (0 <= ua && ua <= 1)) &&\n (bInfinite || (0 <= ub && ub <= 1))\n ) {\n return new Intersection('Intersection').append(\n new Point(a1.x + ua * a2xa1x, a1.y + ua * a2ya1y),\n );\n } else {\n return new Intersection();\n }\n } else {\n if (uaT === 0 || ubT === 0) {\n const segmentsCoincide =\n aInfinite ||\n bInfinite ||\n Intersection.isPointContained(a1, b1, b2) ||\n Intersection.isPointContained(a2, b1, b2) ||\n Intersection.isPointContained(b1, a1, a2) ||\n Intersection.isPointContained(b2, a1, a2);\n return new Intersection(segmentsCoincide ? 'Coincident' : undefined);\n } else {\n return new Intersection('Parallel');\n }\n }\n }\n\n /**\n * Checks if a segment intersects a line\n * @see {@link intersectLineLine} for line intersection\n * @param {Point} s1 boundary point of segment\n * @param {Point} s2 other boundary point of segment\n * @param {Point} l1 point on line\n * @param {Point} l2 other point on line\n * @return {Intersection}\n */\n static intersectSegmentLine(\n s1: Point,\n s2: Point,\n l1: Point,\n l2: Point,\n ): Intersection {\n return Intersection.intersectLineLine(s1, s2, l1, l2, false, true);\n }\n\n /**\n * Checks if a segment intersects another\n * @see {@link intersectLineLine} for line intersection\n * @param {Point} a1 boundary point of segment\n * @param {Point} a2 other boundary point of segment\n * @param {Point} b1 boundary point of segment\n * @param {Point} b2 other boundary point of segment\n * @return {Intersection}\n */\n static intersectSegmentSegment(\n a1: Point,\n a2: Point,\n b1: Point,\n b2: Point,\n ): Intersection {\n return Intersection.intersectLineLine(a1, a2, b1, b2, false, false);\n }\n\n /**\n * Checks if line intersects polygon\n *\n * @todo account for stroke\n *\n * @see {@link intersectSegmentPolygon} for segment intersection\n * @param {Point} a1 point on line\n * @param {Point} a2 other point on line\n * @param {Point[]} points polygon points\n * @param {boolean} [infinite=true] check segment intersection by passing `false`\n * @return {Intersection}\n */\n static intersectLinePolygon(\n a1: Point,\n a2: Point,\n points: Point[],\n infinite = true,\n ): Intersection {\n const result = new Intersection();\n const length = points.length;\n\n for (let i = 0, b1, b2, inter; i < length; i++) {\n b1 = points[i];\n b2 = points[(i + 1) % length];\n inter = Intersection.intersectLineLine(a1, a2, b1, b2, infinite, false);\n if (inter.status === 'Coincident') {\n return inter;\n }\n result.append(...inter.points);\n }\n\n if (result.points.length > 0) {\n result.status = 'Intersection';\n }\n\n return result;\n }\n\n /**\n * Checks if segment intersects polygon\n * @see {@link intersectLinePolygon} for line intersection\n * @param {Point} a1 boundary point of segment\n * @param {Point} a2 other boundary point of segment\n * @param {Point[]} points polygon points\n * @return {Intersection}\n */\n static intersectSegmentPolygon(\n a1: Point,\n a2: Point,\n points: Point[],\n ): Intersection {\n return Intersection.intersectLinePolygon(a1, a2, points, false);\n }\n\n /**\n * Checks if polygon intersects another polygon\n *\n * @todo account for stroke\n *\n * @param {Point[]} points1\n * @param {Point[]} points2\n * @return {Intersection}\n */\n static intersectPolygonPolygon(\n points1: Point[],\n points2: Point[],\n ): Intersection {\n const result = new Intersection(),\n length = points1.length;\n const coincidences: Intersection[] = [];\n\n for (let i = 0; i < length; i++) {\n const a1 = points1[i],\n a2 = points1[(i + 1) % length],\n inter = Intersection.intersectSegmentPolygon(a1, a2, points2);\n if (inter.status === 'Coincident') {\n coincidences.push(inter);\n result.append(a1, a2);\n } else {\n result.append(...inter.points);\n }\n }\n\n if (coincidences.length > 0 && coincidences.length === points1.length) {\n return new Intersection('Coincident');\n } else if (result.points.length > 0) {\n result.status = 'Intersection';\n }\n\n return result;\n }\n\n /**\n * Checks if polygon intersects rectangle\n * @see {@link intersectPolygonPolygon} for polygon intersection\n * @param {Point[]} points polygon points\n * @param {Point} r1 top left point of rect\n * @param {Point} r2 bottom right point of rect\n * @return {Intersection}\n */\n static intersectPolygonRectangle(\n points: Point[],\n r1: Point,\n r2: Point,\n ): Intersection {\n const min = r1.min(r2),\n max = r1.max(r2),\n topRight = new Point(max.x, min.y),\n bottomLeft = new Point(min.x, max.y);\n\n return Intersection.intersectPolygonPolygon(points, [\n min,\n topRight,\n max,\n bottomLeft,\n ]);\n }\n}\n","import type {\n TBBox,\n TCornerPoint,\n TDegree,\n TMat2D,\n TOriginX,\n TOriginY,\n} from '../../typedefs';\nimport { SCALE_X, SCALE_Y, iMatrix } from '../../constants';\nimport { Intersection } from '../../Intersection';\nimport { Point } from '../../Point';\nimport { makeBoundingBoxFromPoints } from '../../util/misc/boundingBoxFromPoints';\nimport {\n createRotateMatrix,\n createTranslateMatrix,\n composeMatrix,\n invertTransform,\n multiplyTransformMatrices,\n transformPoint,\n calcPlaneRotation,\n} from '../../util/misc/matrix';\nimport { radiansToDegrees } from '../../util/misc/radiansDegreesConversion';\nimport type { Canvas } from '../../canvas/Canvas';\nimport type { StaticCanvas } from '../../canvas/StaticCanvas';\nimport type { ObjectEvents } from '../../EventTypeDefs';\nimport type { ControlProps } from './types/ControlProps';\nimport { resolveOrigin } from '../../util/misc/resolveOrigin';\nimport type { Group } from '../Group';\nimport { calcDimensionsMatrix } from '../../util/misc/matrix';\nimport { sizeAfterTransform } from '../../util/misc/objectTransforms';\nimport { degreesToRadians } from '../../util/misc/radiansDegreesConversion';\nimport { CommonMethods } from '../../CommonMethods';\nimport type { BaseProps } from './types/BaseProps';\nimport type { FillStrokeProps } from './types/FillStrokeProps';\nimport { CENTER, LEFT, TOP } from '../../constants';\n\ntype TMatrixCache = {\n key: number[];\n value: TMat2D;\n};\n\ntype TACoords = TCornerPoint;\n\nexport class ObjectGeometry\n extends CommonMethods\n implements\n Pick,\n BaseProps,\n Pick\n{\n // #region Geometry\n\n declare padding: number;\n\n /**\n * Describe object's corner position in scene coordinates.\n * The coordinates are derived from the following:\n * left, top, width, height, scaleX, scaleY, skewX, skewY, angle, strokeWidth.\n * The coordinates do not depend on viewport changes.\n * The coordinates get updated with {@link setCoords}.\n * You can calculate them without updating with {@link calcACoords()}\n */\n declare aCoords: TACoords;\n\n /**\n * storage cache for object transform matrix\n */\n declare ownMatrixCache?: TMatrixCache;\n\n /**\n * storage cache for object full transform matrix\n */\n declare matrixCache?: TMatrixCache;\n\n /**\n * A Reference of the Canvas where the object is actually added\n * @type StaticCanvas | Canvas;\n * @default undefined\n * @private\n */\n declare canvas?: StaticCanvas | Canvas;\n\n /**\n * @returns {number} x position according to object's {@link originX} property in canvas coordinate plane\n */\n getX(): number {\n return this.getXY().x;\n }\n\n /**\n * @param {number} value x position according to object's {@link originX} property in canvas coordinate plane\n */\n setX(value: number) {\n this.setXY(this.getXY().setX(value));\n }\n\n /**\n * @returns {number} y position according to object's {@link originY} property in canvas coordinate plane\n */\n getY(): number {\n return this.getXY().y;\n }\n\n /**\n * @param {number} value y position according to object's {@link originY} property in canvas coordinate plane\n */\n setY(value: number) {\n this.setXY(this.getXY().setY(value));\n }\n\n /**\n * @returns {number} x position according to object's {@link originX} property in parent's coordinate plane\\\n * if parent is canvas then this property is identical to {@link getX}\n */\n getRelativeX(): number {\n return this.left;\n }\n\n /**\n * @param {number} value x position according to object's {@link originX} property in parent's coordinate plane\\\n * if parent is canvas then this method is identical to {@link setX}\n */\n setRelativeX(value: number) {\n this.left = value;\n }\n\n /**\n * @returns {number} y position according to object's {@link originY} property in parent's coordinate plane\\\n * if parent is canvas then this property is identical to {@link getY}\n */\n getRelativeY(): number {\n return this.top;\n }\n\n /**\n * @param {number} value y position according to object's {@link originY} property in parent's coordinate plane\\\n * if parent is canvas then this property is identical to {@link setY}\n */\n setRelativeY(value: number) {\n this.top = value;\n }\n\n /**\n * @returns {Point} x position according to object's {@link originX} {@link originY} properties in canvas coordinate plane\n */\n getXY(): Point {\n const relativePosition = this.getRelativeXY();\n return this.group\n ? transformPoint(relativePosition, this.group.calcTransformMatrix())\n : relativePosition;\n }\n\n /**\n * Set an object position to a particular point, the point is intended in absolute ( canvas ) coordinate.\n * You can specify {@link originX} and {@link originY} values,\n * that otherwise are the object's current values.\n * @example Set object's bottom left corner to point (5,5) on canvas\n * object.setXY(new Point(5, 5), 'left', 'bottom').\n * @param {Point} point position in scene coordinate plane\n * @param {TOriginX} [originX] Horizontal origin: 'left', 'center' or 'right'\n * @param {TOriginY} [originY] Vertical origin: 'top', 'center' or 'bottom'\n */\n setXY(point: Point, originX?: TOriginX, originY?: TOriginY) {\n if (this.group) {\n point = transformPoint(\n point,\n invertTransform(this.group.calcTransformMatrix()),\n );\n }\n this.setRelativeXY(point, originX, originY);\n }\n\n /**\n * @returns {Point} x,y position according to object's {@link originX} {@link originY} properties in parent's coordinate plane\n */\n getRelativeXY(): Point {\n return new Point(this.left, this.top);\n }\n\n /**\n * As {@link setXY}, but in current parent's coordinate plane (the current group if any or the canvas)\n * @param {Point} point position according to object's {@link originX} {@link originY} properties in parent's coordinate plane\n * @param {TOriginX} [originX] Horizontal origin: 'left', 'center' or 'right'\n * @param {TOriginY} [originY] Vertical origin: 'top', 'center' or 'bottom'\n */\n setRelativeXY(\n point: Point,\n originX: TOriginX = this.originX,\n originY: TOriginY = this.originY,\n ) {\n this.setPositionByOrigin(point, originX, originY);\n }\n\n /**\n * @deprecated intermidiate method to be removed, do not use\n */\n protected isStrokeAccountedForInDimensions() {\n return false;\n }\n\n /**\n * @return {Point[]} [tl, tr, br, bl] in the scene plane\n */\n getCoords(): Point[] {\n const { tl, tr, br, bl } =\n this.aCoords || (this.aCoords = this.calcACoords());\n const coords = [tl, tr, br, bl];\n if (this.group) {\n const t = this.group.calcTransformMatrix();\n return coords.map((p) => transformPoint(p, t));\n }\n return coords;\n }\n\n /**\n * Checks if object intersects with the scene rect formed by {@link tl} and {@link br}\n */\n intersectsWithRect(tl: Point, br: Point): boolean {\n const intersection = Intersection.intersectPolygonRectangle(\n this.getCoords(),\n tl,\n br,\n );\n return intersection.status === 'Intersection';\n }\n\n /**\n * Checks if object intersects with another object\n * @param {Object} other Object to test\n * @return {Boolean} true if object intersects with another object\n */\n intersectsWithObject(other: ObjectGeometry): boolean {\n const intersection = Intersection.intersectPolygonPolygon(\n this.getCoords(),\n other.getCoords(),\n );\n\n return (\n intersection.status === 'Intersection' ||\n intersection.status === 'Coincident' ||\n other.isContainedWithinObject(this) ||\n this.isContainedWithinObject(other)\n );\n }\n\n /**\n * Checks if object is fully contained within area of another object\n * @param {Object} other Object to test\n * @return {Boolean} true if object is fully contained within area of another object\n */\n isContainedWithinObject(other: ObjectGeometry): boolean {\n const points = this.getCoords();\n return points.every((point) => other.containsPoint(point));\n }\n\n /**\n * Checks if object is fully contained within the scene rect formed by {@link tl} and {@link br}\n */\n isContainedWithinRect(tl: Point, br: Point): boolean {\n const { left, top, width, height } = this.getBoundingRect();\n return (\n left >= tl.x &&\n left + width <= br.x &&\n top >= tl.y &&\n top + height <= br.y\n );\n }\n\n isOverlapping(other: T): boolean {\n return (\n this.intersectsWithObject(other) ||\n this.isContainedWithinObject(other) ||\n other.isContainedWithinObject(this)\n );\n }\n\n /**\n * Checks if point is inside the object\n * @param {Point} point Point to check against\n * @return {Boolean} true if point is inside the object\n */\n containsPoint(point: Point): boolean {\n return Intersection.isPointInPolygon(point, this.getCoords());\n }\n\n /**\n * Checks if object is contained within the canvas with current viewportTransform\n * the check is done stopping at first point that appears on screen\n * @return {Boolean} true if object is fully or partially contained within canvas\n */\n isOnScreen(): boolean {\n if (!this.canvas) {\n return false;\n }\n const { tl, br } = this.canvas.vptCoords;\n const points = this.getCoords();\n // if some point is on screen, the object is on screen.\n if (\n points.some(\n (point) =>\n point.x <= br.x &&\n point.x >= tl.x &&\n point.y <= br.y &&\n point.y >= tl.y,\n )\n ) {\n return true;\n }\n // no points on screen, check intersection with absolute coordinates\n if (this.intersectsWithRect(tl, br)) {\n return true;\n }\n // check if the object is so big that it contains the entire viewport\n return this.containsPoint(tl.midPointFrom(br));\n }\n\n /**\n * Checks if object is partially contained within the canvas with current viewportTransform\n * @return {Boolean} true if object is partially contained within canvas\n */\n isPartiallyOnScreen(): boolean {\n if (!this.canvas) {\n return false;\n }\n const { tl, br } = this.canvas.vptCoords;\n if (this.intersectsWithRect(tl, br)) {\n return true;\n }\n const allPointsAreOutside = this.getCoords().every(\n (point) =>\n (point.x >= br.x || point.x <= tl.x) &&\n (point.y >= br.y || point.y <= tl.y),\n );\n // check if the object is so big that it contains the entire viewport\n return allPointsAreOutside && this.containsPoint(tl.midPointFrom(br));\n }\n\n /**\n * Returns coordinates of object's bounding rectangle (left, top, width, height)\n * the box is intended as aligned to axis of canvas.\n * @return {Object} Object with left, top, width, height properties\n */\n getBoundingRect(): TBBox {\n return makeBoundingBoxFromPoints(this.getCoords());\n }\n\n /**\n * Returns width of an object's bounding box counting transformations\n * @todo shouldn't this account for group transform and return the actual size in canvas coordinate plane?\n * @return {Number} width value\n */\n getScaledWidth(): number {\n return this._getTransformedDimensions().x;\n }\n\n /**\n * Returns height of an object bounding box counting transformations\n * @todo shouldn't this account for group transform and return the actual size in canvas coordinate plane?\n * @return {Number} height value\n */\n getScaledHeight(): number {\n return this._getTransformedDimensions().y;\n }\n\n /**\n * Scales an object (equally by x and y)\n * @param {Number} value Scale factor\n * @return {void}\n */\n scale(value: number): void {\n this._set(SCALE_X, value);\n this._set(SCALE_Y, value);\n this.setCoords();\n }\n\n /**\n * Scales an object to a given width, with respect to bounding box (scaling by x/y equally)\n * @param {Number} value New width value\n * @return {void}\n */\n scaleToWidth(value: number) {\n // adjust to bounding rect factor so that rotated shapes would fit as well\n const boundingRectFactor =\n this.getBoundingRect().width / this.getScaledWidth();\n return this.scale(value / this.width / boundingRectFactor);\n }\n\n /**\n * Scales an object to a given height, with respect to bounding box (scaling by x/y equally)\n * @param {Number} value New height value\n * @return {void}\n */\n scaleToHeight(value: number) {\n // adjust to bounding rect factor so that rotated shapes would fit as well\n const boundingRectFactor =\n this.getBoundingRect().height / this.getScaledHeight();\n return this.scale(value / this.height / boundingRectFactor);\n }\n\n getCanvasRetinaScaling() {\n return this.canvas?.getRetinaScaling() || 1;\n }\n\n /**\n * Returns the object angle relative to canvas counting also the group property\n * @returns {TDegree}\n */\n getTotalAngle(): TDegree {\n return this.group\n ? radiansToDegrees(calcPlaneRotation(this.calcTransformMatrix()))\n : this.angle;\n }\n\n /**\n * Retrieves viewportTransform from Object's canvas if available\n * @return {TMat2D}\n */\n getViewportTransform(): TMat2D {\n return this.canvas?.viewportTransform || (iMatrix.concat() as TMat2D);\n }\n\n /**\n * Calculates the coordinates of the 4 corner of the bbox, in absolute coordinates.\n * those never change with zoom or viewport changes.\n * @return {TCornerPoint}\n */\n calcACoords(): TCornerPoint {\n const rotateMatrix = createRotateMatrix({ angle: this.angle }),\n { x, y } = this.getRelativeCenterPoint(),\n tMatrix = createTranslateMatrix(x, y),\n finalMatrix = multiplyTransformMatrices(tMatrix, rotateMatrix),\n dim = this._getTransformedDimensions(),\n w = dim.x / 2,\n h = dim.y / 2;\n return {\n // corners\n tl: transformPoint({ x: -w, y: -h }, finalMatrix),\n tr: transformPoint({ x: w, y: -h }, finalMatrix),\n bl: transformPoint({ x: -w, y: h }, finalMatrix),\n br: transformPoint({ x: w, y: h }, finalMatrix),\n };\n }\n\n /**\n * Sets corner and controls position coordinates based on current angle, width and height, left and top.\n * aCoords are used to quickly find an object on the canvas.\n * See {@link https://github.com/fabricjs/fabric.js/wiki/When-to-call-setCoords} and {@link http://fabricjs.com/fabric-gotchas}\n */\n setCoords(): void {\n this.aCoords = this.calcACoords();\n }\n\n transformMatrixKey(skipGroup = false): number[] {\n let prefix: number[] = [];\n if (!skipGroup && this.group) {\n prefix = this.group.transformMatrixKey(skipGroup);\n }\n prefix.push(\n this.top,\n this.left,\n this.width,\n this.height,\n this.scaleX,\n this.scaleY,\n this.angle,\n this.strokeWidth,\n this.skewX,\n this.skewY,\n +this.flipX,\n +this.flipY,\n resolveOrigin(this.originX),\n resolveOrigin(this.originY),\n );\n\n return prefix;\n }\n\n /**\n * calculate transform matrix that represents the current transformations from the\n * object's properties.\n * @param {Boolean} [skipGroup] return transform matrix for object not counting parent transformations\n * There are some situation in which this is useful to avoid the fake rotation.\n * @return {TMat2D} transform matrix for the object\n */\n calcTransformMatrix(skipGroup = false): TMat2D {\n let matrix = this.calcOwnMatrix();\n if (skipGroup || !this.group) {\n return matrix;\n }\n const key = this.transformMatrixKey(skipGroup),\n cache = this.matrixCache;\n if (cache && cache.key.every((x, i) => x === key[i])) {\n return cache.value;\n }\n if (this.group) {\n matrix = multiplyTransformMatrices(\n this.group.calcTransformMatrix(false),\n matrix,\n );\n }\n this.matrixCache = {\n key,\n value: matrix,\n };\n return matrix;\n }\n\n /**\n * calculate transform matrix that represents the current transformations from the\n * object's properties, this matrix does not include the group transformation\n * @return {TMat2D} transform matrix for the object\n */\n calcOwnMatrix(): TMat2D {\n const key = this.transformMatrixKey(true),\n cache = this.ownMatrixCache;\n if (cache && cache.key === key) {\n return cache.value;\n }\n const center = this.getRelativeCenterPoint(),\n options = {\n angle: this.angle,\n translateX: center.x,\n translateY: center.y,\n scaleX: this.scaleX,\n scaleY: this.scaleY,\n skewX: this.skewX,\n skewY: this.skewY,\n flipX: this.flipX,\n flipY: this.flipY,\n },\n value = composeMatrix(options);\n this.ownMatrixCache = {\n key,\n value,\n };\n return value;\n }\n\n /**\n * Calculate object dimensions from its properties\n * @private\n * @returns {Point} dimensions\n */\n _getNonTransformedDimensions(): Point {\n return new Point(this.width, this.height).scalarAdd(this.strokeWidth);\n }\n\n /**\n * Calculate object dimensions for controls box, including padding and canvas zoom.\n * and active selection\n * @private\n * @param {object} [options] transform options\n * @returns {Point} dimensions\n */\n _calculateCurrentDimensions(options?: any): Point {\n return this._getTransformedDimensions(options)\n .transform(this.getViewportTransform(), true)\n .scalarAdd(2 * this.padding);\n }\n\n // #region Origin\n\n declare top: number;\n declare left: number;\n declare width: number;\n declare height: number;\n declare flipX: boolean;\n declare flipY: boolean;\n declare scaleX: number;\n declare scaleY: number;\n declare skewX: number;\n declare skewY: number;\n /**\n * @deprecated please use 'center' as value in new projects\n * */\n declare originX: TOriginX;\n /**\n * @deprecated please use 'center' as value in new projects\n * */\n declare originY: TOriginY;\n declare angle: TDegree;\n declare strokeWidth: number;\n declare strokeUniform: boolean;\n\n /**\n * Object containing this object.\n * can influence its size and position\n */\n declare group?: Group;\n\n /**\n * Calculate object bounding box dimensions from its properties scale, skew.\n * This bounding box is aligned with object angle and not with canvas axis or screen.\n * @param {Object} [options]\n * @param {Number} [options.scaleX]\n * @param {Number} [options.scaleY]\n * @param {Number} [options.skewX]\n * @param {Number} [options.skewY]\n * @private\n * @returns {Point} dimensions\n */\n _getTransformedDimensions(options: any = {}): Point {\n const dimOptions = {\n // if scaleX or scaleY are negative numbers,\n // this will return dimensions that are negative.\n // and this will break assumptions around the codebase\n scaleX: this.scaleX,\n scaleY: this.scaleY,\n skewX: this.skewX,\n skewY: this.skewY,\n width: this.width,\n height: this.height,\n strokeWidth: this.strokeWidth,\n // TODO remove this spread. is visible in the performance inspection\n ...options,\n };\n // stroke is applied before/after transformations are applied according to `strokeUniform`\n const strokeWidth = dimOptions.strokeWidth;\n let preScalingStrokeValue = strokeWidth,\n postScalingStrokeValue = 0;\n\n if (this.strokeUniform) {\n preScalingStrokeValue = 0;\n postScalingStrokeValue = strokeWidth;\n }\n const dimX = dimOptions.width + preScalingStrokeValue,\n dimY = dimOptions.height + preScalingStrokeValue,\n noSkew = dimOptions.skewX === 0 && dimOptions.skewY === 0;\n let finalDimensions;\n if (noSkew) {\n finalDimensions = new Point(\n dimX * dimOptions.scaleX,\n dimY * dimOptions.scaleY,\n );\n } else {\n finalDimensions = sizeAfterTransform(\n dimX,\n dimY,\n calcDimensionsMatrix(dimOptions),\n );\n }\n\n return finalDimensions.scalarAdd(postScalingStrokeValue);\n }\n\n /**\n * Translates the coordinates from a set of origin to another (based on the object's dimensions)\n * @param {Point} point The point which corresponds to the originX and originY params\n * @param {TOriginX} fromOriginX Horizontal origin: 'left', 'center' or 'right'\n * @param {TOriginY} fromOriginY Vertical origin: 'top', 'center' or 'bottom'\n * @param {TOriginX} toOriginX Horizontal origin: 'left', 'center' or 'right'\n * @param {TOriginY} toOriginY Vertical origin: 'top', 'center' or 'bottom'\n * @return {Point}\n */\n translateToGivenOrigin(\n point: Point,\n fromOriginX: TOriginX,\n fromOriginY: TOriginY,\n toOriginX: TOriginX,\n toOriginY: TOriginY,\n ): Point {\n let x = point.x,\n y = point.y;\n const offsetX = resolveOrigin(toOriginX) - resolveOrigin(fromOriginX),\n offsetY = resolveOrigin(toOriginY) - resolveOrigin(fromOriginY);\n\n if (offsetX || offsetY) {\n const dim = this._getTransformedDimensions();\n x += offsetX * dim.x;\n y += offsetY * dim.y;\n }\n\n return new Point(x, y);\n }\n\n /**\n * Translates the coordinates from origin to center coordinates (based on the object's dimensions)\n * @param {Point} point The point which corresponds to the originX and originY params\n * @param {TOriginX} originX Horizontal origin: 'left', 'center' or 'right'\n * @param {TOriginY} originY Vertical origin: 'top', 'center' or 'bottom'\n * @return {Point}\n */\n translateToCenterPoint(\n point: Point,\n originX: TOriginX,\n originY: TOriginY,\n ): Point {\n if (originX === CENTER && originY === CENTER) {\n return point;\n }\n const p = this.translateToGivenOrigin(\n point,\n originX,\n originY,\n CENTER,\n CENTER,\n );\n if (this.angle) {\n return p.rotate(degreesToRadians(this.angle), point);\n }\n return p;\n }\n\n /**\n * Translates the coordinates from center to origin coordinates (based on the object's dimensions)\n * @param {Point} center The point which corresponds to center of the object\n * @param {OriginX} originX Horizontal origin: 'left', 'center' or 'right'\n * @param {OriginY} originY Vertical origin: 'top', 'center' or 'bottom'\n * @return {Point}\n */\n translateToOriginPoint(\n center: Point,\n originX: TOriginX,\n originY: TOriginY,\n ): Point {\n const p = this.translateToGivenOrigin(\n center,\n CENTER,\n CENTER,\n originX,\n originY,\n );\n if (this.angle) {\n return p.rotate(degreesToRadians(this.angle), center);\n }\n return p;\n }\n\n /**\n * Returns the center coordinates of the object relative to canvas\n * @return {Point}\n */\n getCenterPoint(): Point {\n const relCenter = this.getRelativeCenterPoint();\n return this.group\n ? transformPoint(relCenter, this.group.calcTransformMatrix())\n : relCenter;\n }\n\n /**\n * Returns the center coordinates of the object relative to it's parent\n * @return {Point}\n */\n getRelativeCenterPoint(): Point {\n return this.translateToCenterPoint(\n new Point(this.left, this.top),\n this.originX,\n this.originY,\n );\n }\n\n /**\n * Returns the position of the object as if it has a different origin.\n * Take an object that has left, top set to 100, 100 with origin 'left', 'top'.\n * Return the values of left top ( wrapped in a point ) that you would need to keep\n * the same position if origin where different.\n * Alternatively you can use this to also find which point in the parent plane is a specific origin\n * ( where is the bottom right corner of my object? )\n * @param {TOriginX} originX Horizontal origin: 'left', 'center' or 'right'\n * @param {TOriginY} originY Vertical origin: 'top', 'center' or 'bottom'\n * @return {Point}\n */\n getPointByOrigin(originX: TOriginX, originY: TOriginY): Point {\n return this.translateToOriginPoint(\n this.getRelativeCenterPoint(),\n originX,\n originY,\n );\n }\n\n /**\n * Sets the position of the object taking into consideration the object's origin\n * @param {Point} pos The new position of the object\n * @param {TOriginX} originX Horizontal origin: 'left', 'center' or 'right'\n * @param {TOriginY} originY Vertical origin: 'top', 'center' or 'bottom'\n * @return {void}\n */\n setPositionByOrigin(pos: Point, originX: TOriginX, originY: TOriginY) {\n const center = this.translateToCenterPoint(pos, originX, originY),\n position = this.translateToOriginPoint(\n center,\n this.originX,\n this.originY,\n );\n this.set({ left: position.x, top: position.y });\n }\n\n /**\n * @private\n */\n _getLeftTopCoords() {\n return this.translateToOriginPoint(\n this.getRelativeCenterPoint(),\n LEFT,\n TOP,\n );\n }\n}\n","import { cache } from '../../cache';\nimport { config } from '../../config';\nimport {\n ALIASING_LIMIT,\n CENTER,\n iMatrix,\n LEFT,\n SCALE_X,\n SCALE_Y,\n STROKE,\n FILL,\n TOP,\n VERSION,\n} from '../../constants';\nimport type { ObjectEvents } from '../../EventTypeDefs';\nimport { Point } from '../../Point';\nimport { Shadow } from '../../Shadow';\nimport type {\n TDegree,\n TFiller,\n TSize,\n TCacheCanvasDimensions,\n Abortable,\n TOptions,\n ImageFormat,\n} from '../../typedefs';\nimport { classRegistry } from '../../ClassRegistry';\nimport { runningAnimations } from '../../util/animation/AnimationRegistry';\nimport { capValue } from '../../util/misc/capValue';\nimport {\n createCanvasElement,\n createCanvasElementFor,\n toDataURL,\n toBlob,\n} from '../../util/misc/dom';\nimport { invertTransform, qrDecompose } from '../../util/misc/matrix';\nimport { enlivenObjectEnlivables } from '../../util/misc/objectEnlive';\nimport {\n resetObjectTransform,\n saveObjectTransform,\n} from '../../util/misc/objectTransforms';\nimport { sendObjectToPlane } from '../../util/misc/planeChange';\nimport { pick, pickBy } from '../../util/misc/pick';\nimport { toFixed } from '../../util/misc/toFixed';\nimport type { Group } from '../Group';\nimport { StaticCanvas } from '../../canvas/StaticCanvas';\nimport { isFiller, isSerializableFiller } from '../../util/typeAssertions';\nimport type { FabricImage } from '../Image';\nimport {\n cacheProperties,\n fabricObjectDefaultValues,\n stateProperties,\n} from './defaultValues';\nimport type { Gradient } from '../../gradient/Gradient';\nimport type { Pattern } from '../../Pattern';\nimport type { Canvas } from '../../canvas/Canvas';\nimport type { SerializedObjectProps } from './types/SerializedObjectProps';\nimport type { ObjectProps } from './types/ObjectProps';\nimport { getDevicePixelRatio, getEnv } from '../../env';\nimport { log } from '../../util/internals/console';\nimport type { TColorArg } from '../../color/typedefs';\nimport type { TAnimation } from '../../util/animation/animate';\nimport { animate, animateColor } from '../../util/animation/animate';\nimport type {\n AnimationOptions,\n ArrayAnimationOptions,\n ColorAnimationOptions,\n ValueAnimationOptions,\n} from '../../util/animation/types';\nimport { ObjectGeometry } from './ObjectGeometry';\n\ntype TAncestor = FabricObject;\ntype TCollection = Group;\n\nexport type Ancestors =\n | [FabricObject | Group]\n | [FabricObject | Group, ...Group[]]\n | Group[];\n\nexport type AncestryComparison = {\n /**\n * common ancestors of `this` and`other`(may include`this` | `other`)\n */\n common: Ancestors;\n /**\n * ancestors that are of `this` only\n */\n fork: Ancestors;\n /**\n * ancestors that are of `other` only\n */\n otherFork: Ancestors;\n};\n\nexport type TCachedFabricObject = T &\n Required<\n Pick<\n T,\n | 'zoomX'\n | 'zoomY'\n | '_cacheCanvas'\n | '_cacheContext'\n | 'cacheTranslationX'\n | 'cacheTranslationY'\n >\n > & {\n _cacheContext: CanvasRenderingContext2D;\n };\n\nexport type ObjectToCanvasElementOptions = {\n format?: ImageFormat;\n /** Multiplier to scale by */\n multiplier?: number;\n /** Cropping left offset. Introduced in v1.2.14 */\n left?: number;\n /** Cropping top offset. Introduced in v1.2.14 */\n top?: number;\n /** Cropping width. Introduced in v1.2.14 */\n width?: number;\n /** Cropping height. Introduced in v1.2.14 */\n height?: number;\n /** Enable retina scaling for clone image. Introduce in 1.6.4 */\n enableRetinaScaling?: boolean;\n /** Remove current object transform ( no scale , no angle, no flip, no skew ). Introduced in 2.3.4 */\n withoutTransform?: boolean;\n /** Remove current object shadow. Introduced in 2.4.2 */\n withoutShadow?: boolean;\n /** Account for canvas viewport transform */\n viewportTransform?: boolean;\n /** Function to create the output canvas to export onto */\n canvasProvider?: (el?: HTMLCanvasElement) => T;\n};\n\ntype toDataURLOptions = ObjectToCanvasElementOptions & {\n quality?: number;\n};\n\nexport type DrawContext =\n | {\n parentClipPaths: FabricObject[];\n width: number;\n height: number;\n cacheTranslationX: number;\n cacheTranslationY: number;\n zoomX: number;\n zoomY: number;\n }\n | Record;\n\n/**\n * Root object class from which all 2d shape classes inherit from\n * @tutorial {@link http://fabricjs.com/fabric-intro-part-1#objects}\n *\n * @fires added\n * @fires removed\n *\n * @fires selected\n * @fires deselected\n *\n * @fires rotating\n * @fires scaling\n * @fires moving\n * @fires skewing\n * @fires modified\n *\n * @fires mousedown\n * @fires mouseup\n * @fires mouseover\n * @fires mouseout\n * @fires mousewheel\n * @fires mousedblclick\n *\n * @fires dragover\n * @fires dragenter\n * @fires dragleave\n * @fires drop\n */\nexport class FabricObject<\n Props extends TOptions = Partial,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n SProps extends SerializedObjectProps = SerializedObjectProps,\n EventSpec extends ObjectEvents = ObjectEvents,\n >\n extends ObjectGeometry\n implements ObjectProps\n{\n declare minScaleLimit: number;\n\n declare opacity: number;\n\n declare paintFirst: 'fill' | 'stroke';\n declare fill: string | TFiller | null;\n declare fillRule: CanvasFillRule;\n declare stroke: string | TFiller | null;\n declare strokeDashArray: number[] | null;\n declare strokeDashOffset: number;\n declare strokeLineCap: CanvasLineCap;\n declare strokeLineJoin: CanvasLineJoin;\n declare strokeMiterLimit: number;\n\n declare globalCompositeOperation: GlobalCompositeOperation;\n declare backgroundColor: string;\n\n declare shadow: Shadow | null;\n\n declare visible: boolean;\n\n declare includeDefaultValues: boolean;\n declare excludeFromExport: boolean;\n\n declare objectCaching: boolean;\n\n declare clipPath?: FabricObject;\n declare inverted: boolean;\n declare absolutePositioned: boolean;\n declare centeredRotation: boolean;\n declare centeredScaling: boolean;\n\n /**\n * This list of properties is used to check if the state of an object is changed.\n * This state change now is only used for children of groups to understand if a group\n * needs its cache regenerated during a .set call\n * @type Array\n */\n static stateProperties: string[] = stateProperties;\n\n /**\n * List of properties to consider when checking if cache needs refresh\n * Those properties are checked by\n * calls to Object.set(key, value). If the key is in this list, the object is marked as dirty\n * and refreshed at the next render\n * @type Array\n */\n static cacheProperties: string[] = cacheProperties;\n\n /**\n * When set to `true`, object's cache will be rerendered next render call.\n * since 1.7.0\n * @type Boolean\n * @default true\n */\n declare dirty: boolean;\n\n /**\n * Quick access for the _cacheCanvas rendering context\n * This is part of the objectCaching feature\n * since 1.7.0\n * @type boolean\n * @default undefined\n * @private\n */\n _cacheContext: CanvasRenderingContext2D | null = null;\n\n /**\n * A reference to the HTMLCanvasElement that is used to contain the cache of the object\n * this canvas element is resized and cleared as needed\n * Is marked private, you can read it, don't use it since it is handled by fabric\n * since 1.7.0\n * @type HTMLCanvasElement\n * @default undefined\n * @private\n */\n declare _cacheCanvas?: HTMLCanvasElement;\n\n /**\n * zoom level used on the cacheCanvas to draw the cache, X axe\n * since 1.7.0\n * @type number\n * @default undefined\n * @private\n */\n declare zoomX?: number;\n\n /**\n * zoom level used on the cacheCanvas to draw the cache, Y axe\n * since 1.7.0\n * @type number\n * @default undefined\n * @private\n */\n declare zoomY?: number;\n\n /**\n * zoom level used on the cacheCanvas to draw the cache, Y axe\n * since 1.7.0\n * @type number\n * @default undefined\n * @private\n */\n declare cacheTranslationX?: number;\n\n /**\n * translation of the cacheCanvas away from the center, for subpixel accuracy and crispness\n * since 1.7.0\n * @type number\n * @default undefined\n * @private\n */\n declare cacheTranslationY?: number;\n\n /**\n * A reference to the parent of the object, usually a Group\n * @type number\n * @default undefined\n * @private\n */\n declare group?: Group;\n\n /**\n * Indicate if the object is sitting on a cache dedicated to it\n * or is part of a larger cache for many object ( a group for example)\n * @type number\n * @default undefined\n * @private\n */\n declare ownCaching?: boolean;\n\n /**\n * Private. indicates if the object inside a group is on a transformed context or not\n * or is part of a larger cache for many object ( a group for example)\n * @type boolean\n * @default undefined\n * @private\n */\n declare _transformDone?: boolean;\n\n static ownDefaults = fabricObjectDefaultValues;\n\n static getDefaults(): Record {\n return FabricObject.ownDefaults;\n }\n\n /**\n * The class type.\n * This is used for serialization and deserialization purposes and internally it can be used\n * to identify classes.\n * When we transform a class in a plain JS object we need a way to recognize which class it was,\n * and the type is the way we do that. It has no other purposes and you should not give one.\n * Hard to reach on instances and please do not use to drive instance's logic (this.constructor.type).\n * To idenfity a class use instanceof class ( instanceof Rect ).\n * We do not do that in fabricJS code because we want to try to have code splitting possible.\n */\n static type = 'FabricObject';\n\n /**\n * Legacy identifier of the class. Prefer using utils like isType or instanceOf\n * Will be removed in fabric 7 or 8.\n * The setter exists to avoid type errors in old code and possibly current deserialization code.\n * DO NOT build new code around this type value\n * @TODO add sustainable warning message\n * @type string\n * @deprecated\n */\n get type() {\n const name = (this.constructor as typeof FabricObject).type;\n if (name === 'FabricObject') {\n return 'object';\n }\n return name.toLowerCase();\n }\n\n set type(value) {\n log('warn', 'Setting type has no effect', value);\n }\n\n /**\n * Constructor\n * @param {Object} [options] Options object\n */\n constructor(options?: Props) {\n super();\n Object.assign(this, FabricObject.ownDefaults);\n this.setOptions(options);\n }\n\n /**\n * Create a the canvas used to keep the cached copy of the object\n * @private\n */\n _createCacheCanvas() {\n this._cacheCanvas = createCanvasElement();\n this._cacheContext = this._cacheCanvas.getContext('2d');\n this._updateCacheCanvas();\n // if canvas gets created, is empty, so dirty.\n this.dirty = true;\n }\n\n /**\n * Limit the cache dimensions so that X * Y do not cross config.perfLimitSizeTotal\n * and each side do not cross fabric.cacheSideLimit\n * those numbers are configurable so that you can get as much detail as you want\n * making bargain with performances.\n * It mutates the input object dims.\n * @param {TCacheCanvasDimensions} dims\n * @return {TCacheCanvasDimensions} dims\n */\n _limitCacheSize(\n dims: TCacheCanvasDimensions & { capped?: boolean },\n ): TCacheCanvasDimensions & { capped?: boolean } {\n const width = dims.width,\n height = dims.height,\n max = config.maxCacheSideLimit,\n min = config.minCacheSideLimit;\n if (\n width <= max &&\n height <= max &&\n width * height <= config.perfLimitSizeTotal\n ) {\n if (width < min) {\n dims.width = min;\n }\n if (height < min) {\n dims.height = min;\n }\n return dims;\n }\n const ar = width / height,\n [limX, limY] = cache.limitDimsByArea(ar),\n x = capValue(min, limX, max),\n y = capValue(min, limY, max);\n if (width > x) {\n dims.zoomX /= width / x;\n dims.width = x;\n dims.capped = true;\n }\n if (height > y) {\n dims.zoomY /= height / y;\n dims.height = y;\n dims.capped = true;\n }\n return dims;\n }\n\n /**\n * Return the dimension and the zoom level needed to create a cache canvas\n * big enough to host the object to be cached.\n * @private\n * @return {TCacheCanvasDimensions} Informations about the object to be cached\n */\n _getCacheCanvasDimensions(): TCacheCanvasDimensions {\n const objectScale = this.getTotalObjectScaling(),\n // calculate dimensions without skewing\n dim = this._getTransformedDimensions({ skewX: 0, skewY: 0 }),\n neededX = (dim.x * objectScale.x) / this.scaleX,\n neededY = (dim.y * objectScale.y) / this.scaleY;\n return {\n // for sure this ALIASING_LIMIT is slightly creating problem\n // in situation in which the cache canvas gets an upper limit\n // also objectScale contains already scaleX and scaleY\n width: Math.ceil(neededX + ALIASING_LIMIT),\n height: Math.ceil(neededY + ALIASING_LIMIT),\n zoomX: objectScale.x,\n zoomY: objectScale.y,\n x: neededX,\n y: neededY,\n };\n }\n\n /**\n * Update width and height of the canvas for cache\n * returns true or false if canvas needed resize.\n * @private\n * @return {Boolean} true if the canvas has been resized\n */\n _updateCacheCanvas() {\n const canvas = this._cacheCanvas!,\n context = this._cacheContext,\n { width, height, zoomX, zoomY, x, y } = this._limitCacheSize(\n this._getCacheCanvasDimensions(),\n ),\n dimensionsChanged = width !== canvas.width || height !== canvas.height,\n zoomChanged = this.zoomX !== zoomX || this.zoomY !== zoomY;\n\n if (!canvas || !context) {\n return false;\n }\n\n const shouldRedraw = dimensionsChanged || zoomChanged;\n\n if (shouldRedraw) {\n if (width !== canvas.width || height !== canvas.height) {\n canvas.width = width;\n canvas.height = height;\n } else {\n context.setTransform(1, 0, 0, 1, 0, 0);\n context.clearRect(0, 0, canvas.width, canvas.height);\n }\n const drawingWidth = x / 2;\n const drawingHeight = y / 2;\n this.cacheTranslationX =\n Math.round(canvas.width / 2 - drawingWidth) + drawingWidth;\n this.cacheTranslationY =\n Math.round(canvas.height / 2 - drawingHeight) + drawingHeight;\n context.translate(this.cacheTranslationX, this.cacheTranslationY);\n context.scale(zoomX, zoomY);\n this.zoomX = zoomX;\n this.zoomY = zoomY;\n return true;\n }\n return false;\n }\n\n /**\n * Sets object's properties from options, for class constructor only.\n * Needs to be overridden for different defaults.\n * @protected\n * @param {Object} [options] Options object\n */\n protected setOptions(options: Record = {}) {\n this._setOptions(options);\n }\n\n /**\n * Transforms context when rendering an object\n * @param {CanvasRenderingContext2D} ctx Context\n */\n transform(ctx: CanvasRenderingContext2D) {\n const needFullTransform =\n (this.group && !this.group._transformDone) ||\n (this.group && this.canvas && ctx === (this.canvas as Canvas).contextTop);\n const m = this.calcTransformMatrix(!needFullTransform);\n ctx.transform(m[0], m[1], m[2], m[3], m[4], m[5]);\n }\n\n /**\n * Return the object scale factor counting also the group scaling\n * @return {Point}\n */\n getObjectScaling() {\n // if the object is a top level one, on the canvas, we go for simple aritmetic\n // otherwise the complex method with angles will return approximations and decimals\n // and will likely kill the cache when not needed\n // https://github.com/fabricjs/fabric.js/issues/7157\n if (!this.group) {\n return new Point(Math.abs(this.scaleX), Math.abs(this.scaleY));\n }\n // if we are inside a group total zoom calculation is complex, we defer to generic matrices\n const options = qrDecompose(this.calcTransformMatrix());\n return new Point(Math.abs(options.scaleX), Math.abs(options.scaleY));\n }\n\n /**\n * Return the object scale factor counting also the group scaling, zoom and retina\n * @return {Object} object with scaleX and scaleY properties\n */\n getTotalObjectScaling() {\n const scale = this.getObjectScaling();\n if (this.canvas) {\n const zoom = this.canvas.getZoom();\n const retina = this.getCanvasRetinaScaling();\n return scale.scalarMultiply(zoom * retina);\n }\n return scale;\n }\n\n /**\n * Return the object opacity counting also the group property\n * @return {Number}\n */\n getObjectOpacity() {\n let opacity = this.opacity;\n if (this.group) {\n opacity *= this.group.getObjectOpacity();\n }\n return opacity;\n }\n\n /**\n * Makes sure the scale is valid and modifies it if necessary\n * @todo: this is a control action issue, not a geometry one\n * @private\n * @param {Number} value, unconstrained\n * @return {Number} constrained value;\n */\n _constrainScale(value: number): number {\n if (Math.abs(value) < this.minScaleLimit) {\n if (value < 0) {\n return -this.minScaleLimit;\n } else {\n return this.minScaleLimit;\n }\n } else if (value === 0) {\n return 0.0001;\n }\n return value;\n }\n\n /**\n * Handles setting values on the instance and handling internal side effects\n * @protected\n * @param {String} key\n * @param {*} value\n */\n _set(key: string, value: any) {\n if (key === SCALE_X || key === SCALE_Y) {\n value = this._constrainScale(value);\n }\n if (key === SCALE_X && value < 0) {\n this.flipX = !this.flipX;\n value *= -1;\n } else if (key === 'scaleY' && value < 0) {\n this.flipY = !this.flipY;\n value *= -1;\n // i don't like this automatic initialization here\n } else if (key === 'shadow' && value && !(value instanceof Shadow)) {\n value = new Shadow(value);\n }\n\n const isChanged = this[key as keyof this] !== value;\n this[key as keyof this] = value;\n\n // invalidate caches\n if (\n isChanged &&\n (this.constructor as typeof FabricObject).cacheProperties.includes(key)\n ) {\n this.dirty = true;\n }\n // a dirty child makes the parent dirty.\n // but a non dirty child does not make the parent not dirty.\n // the parent could be dirty for some other reason.\n this.parent &&\n (this.dirty ||\n (isChanged &&\n (this.constructor as typeof FabricObject).stateProperties.includes(\n key,\n ))) &&\n this.parent._set('dirty', true);\n\n return this;\n }\n\n /**\n * return if the object would be visible in rendering\n * @return {Boolean}\n */\n isNotVisible() {\n return (\n this.opacity === 0 ||\n (!this.width && !this.height && this.strokeWidth === 0) ||\n !this.visible\n );\n }\n\n /**\n * Renders an object on a specified context\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n render(ctx: CanvasRenderingContext2D) {\n // do not render if width/height are zeros or object is not visible\n if (this.isNotVisible()) {\n return;\n }\n if (\n this.canvas &&\n this.canvas.skipOffscreen &&\n !this.group &&\n !this.isOnScreen()\n ) {\n return;\n }\n ctx.save();\n this._setupCompositeOperation(ctx);\n this.drawSelectionBackground(ctx);\n this.transform(ctx);\n this._setOpacity(ctx);\n this._setShadow(ctx);\n if (this.shouldCache()) {\n (this as TCachedFabricObject).renderCache();\n (this as TCachedFabricObject).drawCacheOnCanvas(ctx);\n } else {\n this._removeCacheCanvas();\n this.drawObject(ctx, false, {});\n this.dirty = false;\n }\n ctx.restore();\n }\n\n drawSelectionBackground(_ctx: CanvasRenderingContext2D) {\n /* no op */\n }\n\n renderCache(this: TCachedFabricObject, options?: any) {\n options = options || {};\n if (!this._cacheCanvas || !this._cacheContext) {\n this._createCacheCanvas();\n }\n if (this.isCacheDirty() && this._cacheContext) {\n const { zoomX, zoomY, cacheTranslationX, cacheTranslationY } = this;\n const { width, height } = this._cacheCanvas;\n this.drawObject(this._cacheContext, options.forClipping, {\n zoomX,\n zoomY,\n cacheTranslationX,\n cacheTranslationY,\n width,\n height,\n parentClipPaths: [],\n });\n this.dirty = false;\n }\n }\n\n /**\n * Remove cacheCanvas and its dimensions from the objects\n */\n _removeCacheCanvas() {\n this._cacheCanvas = undefined;\n this._cacheContext = null;\n }\n\n /**\n * return true if the object will draw a stroke\n * Does not consider text styles. This is just a shortcut used at rendering time\n * We want it to be an approximation and be fast.\n * wrote to avoid extra caching, it has to return true when stroke happens,\n * can guess when it will not happen at 100% chance, does not matter if it misses\n * some use case where the stroke is invisible.\n * @since 3.0.0\n * @returns Boolean\n */\n hasStroke(): boolean {\n return (\n !!this.stroke && this.stroke !== 'transparent' && this.strokeWidth !== 0\n );\n }\n\n /**\n * return true if the object will draw a fill\n * Does not consider text styles. This is just a shortcut used at rendering time\n * We want it to be an approximation and be fast.\n * wrote to avoid extra caching, it has to return true when fill happens,\n * can guess when it will not happen at 100% chance, does not matter if it misses\n * some use case where the fill is invisible.\n * @since 3.0.0\n * @returns Boolean\n */\n hasFill(): boolean {\n return !!this.fill && this.fill !== 'transparent';\n }\n\n /**\n * When returns `true`, force the object to have its own cache, even if it is inside a group\n * it may be needed when your object behave in a particular way on the cache and always needs\n * its own isolated canvas to render correctly.\n * Created to be overridden\n * since 1.7.12\n * @returns Boolean\n */\n needsItsOwnCache() {\n // TODO re-evaluate this shadow condition\n if (\n this.paintFirst === STROKE &&\n this.hasFill() &&\n this.hasStroke() &&\n !!this.shadow\n ) {\n return true;\n }\n if (this.clipPath) {\n return true;\n }\n return false;\n }\n\n /**\n * Decide if the object should cache or not. Create its own cache level\n * objectCaching is a global flag, wins over everything\n * needsItsOwnCache should be used when the object drawing method requires\n * a cache step.\n * Generally you do not cache objects in groups because the group outside is cached.\n * Read as: cache if is needed, or if the feature is enabled but we are not already caching.\n * @return {Boolean}\n */\n shouldCache() {\n this.ownCaching =\n (this.objectCaching && (!this.parent || !this.parent.isOnACache())) ||\n this.needsItsOwnCache();\n return this.ownCaching;\n }\n\n /**\n * Check if this object will cast a shadow with an offset.\n * used by Group.shouldCache to know if child has a shadow recursively\n * @return {Boolean}\n * @deprecated\n */\n willDrawShadow() {\n return (\n !!this.shadow && (this.shadow.offsetX !== 0 || this.shadow.offsetY !== 0)\n );\n }\n\n /**\n * Execute the drawing operation for an object clipPath\n * @param {CanvasRenderingContext2D} ctx Context to render on\n * @param {FabricObject} clipPath\n */\n drawClipPathOnCache(\n ctx: CanvasRenderingContext2D,\n clipPath: FabricObject,\n canvasWithClipPath: HTMLCanvasElement,\n ) {\n ctx.save();\n // DEBUG: uncomment this line, comment the following\n // ctx.globalAlpha = 0.4\n if (clipPath.inverted) {\n ctx.globalCompositeOperation = 'destination-out';\n } else {\n ctx.globalCompositeOperation = 'destination-in';\n }\n ctx.setTransform(1, 0, 0, 1, 0, 0);\n ctx.drawImage(canvasWithClipPath, 0, 0);\n ctx.restore();\n }\n\n /**\n * Execute the drawing operation for an object on a specified context\n * @param {CanvasRenderingContext2D} ctx Context to render on\n * @param {boolean} forClipping apply clipping styles\n * @param {DrawContext} context additional context for rendering\n */\n drawObject(\n ctx: CanvasRenderingContext2D,\n forClipping: boolean | undefined,\n context: DrawContext,\n ) {\n const originalFill = this.fill,\n originalStroke = this.stroke;\n if (forClipping) {\n this.fill = 'black';\n this.stroke = '';\n this._setClippingProperties(ctx);\n } else {\n this._renderBackground(ctx);\n }\n this._render(ctx);\n this._drawClipPath(ctx, this.clipPath, context);\n this.fill = originalFill;\n this.stroke = originalStroke;\n }\n\n private createClipPathLayer(\n this: TCachedFabricObject,\n clipPath: FabricObject,\n context: DrawContext,\n ) {\n const canvas = createCanvasElementFor(context as TSize);\n const ctx = canvas.getContext('2d')!;\n ctx.translate(context.cacheTranslationX, context.cacheTranslationY);\n ctx.scale(context.zoomX, context.zoomY);\n clipPath._cacheCanvas = canvas;\n context.parentClipPaths.forEach((prevClipPath) => {\n prevClipPath.transform(ctx);\n });\n context.parentClipPaths.push(clipPath);\n if (clipPath.absolutePositioned) {\n const m = invertTransform(this.calcTransformMatrix());\n ctx.transform(m[0], m[1], m[2], m[3], m[4], m[5]);\n }\n clipPath.transform(ctx);\n clipPath.drawObject(ctx, true, context);\n return canvas;\n }\n\n /**\n * Prepare clipPath state and cache and draw it on instance's cache\n * @param {CanvasRenderingContext2D} ctx\n * @param {FabricObject} clipPath\n */\n _drawClipPath(\n ctx: CanvasRenderingContext2D,\n clipPath: FabricObject | undefined,\n context: DrawContext,\n ) {\n if (!clipPath) {\n return;\n }\n // needed to setup _transformDone\n // TODO find a better solution?\n clipPath._transformDone = true;\n const canvas = (this as TCachedFabricObject).createClipPathLayer(\n clipPath,\n context,\n );\n this.drawClipPathOnCache(ctx, clipPath, canvas);\n }\n\n /**\n * Paint the cached copy of the object on the target context.\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n drawCacheOnCanvas(this: TCachedFabricObject, ctx: CanvasRenderingContext2D) {\n ctx.scale(1 / this.zoomX, 1 / this.zoomY);\n ctx.drawImage(\n this._cacheCanvas,\n -this.cacheTranslationX,\n -this.cacheTranslationY,\n );\n }\n\n /**\n * Check if cache is dirty and if is dirty clear the context.\n * This check has a big side effect, it changes the underlying cache canvas if necessary.\n * Do not call this method on your own to check if the cache is dirty, because if it is,\n * it is also going to wipe the cache. This is badly designed and needs to be fixed.\n * @param {Boolean} skipCanvas skip canvas checks because this object is painted\n * on parent canvas.\n */\n isCacheDirty(skipCanvas = false) {\n if (this.isNotVisible()) {\n return false;\n }\n const canvas = this._cacheCanvas;\n const ctx = this._cacheContext;\n if (canvas && ctx && !skipCanvas && this._updateCacheCanvas()) {\n // in this case the context is already cleared.\n return true;\n } else {\n if (this.dirty || (this.clipPath && this.clipPath.absolutePositioned)) {\n if (canvas && ctx && !skipCanvas) {\n ctx.save();\n ctx.setTransform(1, 0, 0, 1, 0, 0);\n ctx.clearRect(0, 0, canvas.width, canvas.height);\n ctx.restore();\n }\n return true;\n }\n }\n return false;\n }\n\n /**\n * Draws a background for the object big as its untransformed dimensions\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _renderBackground(ctx: CanvasRenderingContext2D) {\n if (!this.backgroundColor) {\n return;\n }\n const dim = this._getNonTransformedDimensions();\n ctx.fillStyle = this.backgroundColor;\n\n ctx.fillRect(-dim.x / 2, -dim.y / 2, dim.x, dim.y);\n // if there is background color no other shadows\n // should be casted\n this._removeShadow(ctx);\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _setOpacity(ctx: CanvasRenderingContext2D) {\n if (this.group && !this.group._transformDone) {\n ctx.globalAlpha = this.getObjectOpacity();\n } else {\n ctx.globalAlpha *= this.opacity;\n }\n }\n\n _setStrokeStyles(\n ctx: CanvasRenderingContext2D,\n decl: Pick<\n this,\n | 'stroke'\n | 'strokeWidth'\n | 'strokeLineCap'\n | 'strokeDashOffset'\n | 'strokeLineJoin'\n | 'strokeMiterLimit'\n >,\n ) {\n const stroke = decl.stroke;\n if (stroke) {\n ctx.lineWidth = decl.strokeWidth;\n ctx.lineCap = decl.strokeLineCap;\n ctx.lineDashOffset = decl.strokeDashOffset;\n ctx.lineJoin = decl.strokeLineJoin;\n ctx.miterLimit = decl.strokeMiterLimit;\n if (isFiller(stroke)) {\n if (\n (stroke as Gradient<'linear'>).gradientUnits === 'percentage' ||\n (stroke as Gradient<'linear'>).gradientTransform ||\n (stroke as Pattern).patternTransform\n ) {\n // need to transform gradient in a pattern.\n // this is a slow process. If you are hitting this codepath, and the object\n // is not using caching, you should consider switching it on.\n // we need a canvas as big as the current object caching canvas.\n this._applyPatternForTransformedGradient(ctx, stroke);\n } else {\n // is a simple gradient or pattern\n ctx.strokeStyle = stroke.toLive(ctx)!;\n this._applyPatternGradientTransform(ctx, stroke);\n }\n } else {\n // is a color\n ctx.strokeStyle = decl.stroke as string;\n }\n }\n }\n\n _setFillStyles(ctx: CanvasRenderingContext2D, { fill }: Pick) {\n if (fill) {\n if (isFiller(fill)) {\n ctx.fillStyle = fill.toLive(ctx)!;\n this._applyPatternGradientTransform(ctx, fill);\n } else {\n ctx.fillStyle = fill;\n }\n }\n }\n\n _setClippingProperties(ctx: CanvasRenderingContext2D) {\n ctx.globalAlpha = 1;\n ctx.strokeStyle = 'transparent';\n ctx.fillStyle = '#000000';\n }\n\n /**\n * @private\n * Sets line dash\n * @param {CanvasRenderingContext2D} ctx Context to set the dash line on\n * @param {Array} dashArray array representing dashes\n */\n _setLineDash(ctx: CanvasRenderingContext2D, dashArray?: number[] | null) {\n if (!dashArray || dashArray.length === 0) {\n return;\n }\n ctx.setLineDash(dashArray);\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _setShadow(ctx: CanvasRenderingContext2D) {\n if (!this.shadow) {\n return;\n }\n\n const shadow = this.shadow,\n canvas = this.canvas,\n retinaScaling = this.getCanvasRetinaScaling(),\n [sx, , , sy] = canvas?.viewportTransform || iMatrix,\n multX = sx * retinaScaling,\n multY = sy * retinaScaling,\n scaling = shadow.nonScaling ? new Point(1, 1) : this.getObjectScaling();\n ctx.shadowColor = shadow.color;\n ctx.shadowBlur =\n (shadow.blur *\n config.browserShadowBlurConstant *\n (multX + multY) *\n (scaling.x + scaling.y)) /\n 4;\n ctx.shadowOffsetX = shadow.offsetX * multX * scaling.x;\n ctx.shadowOffsetY = shadow.offsetY * multY * scaling.y;\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _removeShadow(ctx: CanvasRenderingContext2D) {\n if (!this.shadow) {\n return;\n }\n\n ctx.shadowColor = '';\n ctx.shadowBlur = ctx.shadowOffsetX = ctx.shadowOffsetY = 0;\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n * @param {TFiller} filler {@link Pattern} or {@link Gradient}\n */\n _applyPatternGradientTransform(\n ctx: CanvasRenderingContext2D,\n filler: TFiller,\n ) {\n if (!isFiller(filler)) {\n return { offsetX: 0, offsetY: 0 };\n }\n const t =\n (filler as Gradient<'linear'>).gradientTransform ||\n (filler as Pattern).patternTransform;\n const offsetX = -this.width / 2 + filler.offsetX || 0,\n offsetY = -this.height / 2 + filler.offsetY || 0;\n\n if ((filler as Gradient<'linear'>).gradientUnits === 'percentage') {\n ctx.transform(this.width, 0, 0, this.height, offsetX, offsetY);\n } else {\n ctx.transform(1, 0, 0, 1, offsetX, offsetY);\n }\n if (t) {\n ctx.transform(t[0], t[1], t[2], t[3], t[4], t[5]);\n }\n return { offsetX: offsetX, offsetY: offsetY };\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _renderPaintInOrder(ctx: CanvasRenderingContext2D) {\n if (this.paintFirst === STROKE) {\n this._renderStroke(ctx);\n this._renderFill(ctx);\n } else {\n this._renderFill(ctx);\n this._renderStroke(ctx);\n }\n }\n\n /**\n * @private\n * function that actually render something on the context.\n * empty here to allow Obects to work on tests to benchmark fabric functionalites\n * not related to rendering\n * @param {CanvasRenderingContext2D} _ctx Context to render on\n */\n _render(_ctx: CanvasRenderingContext2D) {\n // placeholder to be overridden\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _renderFill(ctx: CanvasRenderingContext2D) {\n if (!this.fill) {\n return;\n }\n\n ctx.save();\n this._setFillStyles(ctx, this);\n if (this.fillRule === 'evenodd') {\n ctx.fill('evenodd');\n } else {\n ctx.fill();\n }\n ctx.restore();\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _renderStroke(ctx: CanvasRenderingContext2D) {\n if (!this.stroke || this.strokeWidth === 0) {\n return;\n }\n\n if (this.shadow && !this.shadow.affectStroke) {\n this._removeShadow(ctx);\n }\n\n ctx.save();\n if (this.strokeUniform) {\n const scaling = this.getObjectScaling();\n ctx.scale(1 / scaling.x, 1 / scaling.y);\n }\n this._setLineDash(ctx, this.strokeDashArray);\n this._setStrokeStyles(ctx, this);\n ctx.stroke();\n ctx.restore();\n }\n\n /**\n * This function try to patch the missing gradientTransform on canvas gradients.\n * transforming a context to transform the gradient, is going to transform the stroke too.\n * we want to transform the gradient but not the stroke operation, so we create\n * a transformed gradient on a pattern and then we use the pattern instead of the gradient.\n * this method has drawbacks: is slow, is in low resolution, needs a patch for when the size\n * is limited.\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n * @param {Gradient} filler\n */\n _applyPatternForTransformedGradient(\n ctx: CanvasRenderingContext2D,\n filler: TFiller,\n ) {\n const dims = this._limitCacheSize(this._getCacheCanvasDimensions()),\n retinaScaling = this.getCanvasRetinaScaling(),\n width = dims.x / this.scaleX / retinaScaling,\n height = dims.y / this.scaleY / retinaScaling,\n pCanvas = createCanvasElementFor({\n // in case width and height are less than 1px, we have to round up.\n // since the pattern is no-repeat, this is fine\n width: Math.ceil(width),\n height: Math.ceil(height),\n });\n\n const pCtx = pCanvas.getContext('2d');\n if (!pCtx) {\n return;\n }\n pCtx.beginPath();\n pCtx.moveTo(0, 0);\n pCtx.lineTo(width, 0);\n pCtx.lineTo(width, height);\n pCtx.lineTo(0, height);\n pCtx.closePath();\n pCtx.translate(width / 2, height / 2);\n pCtx.scale(\n dims.zoomX / this.scaleX / retinaScaling,\n dims.zoomY / this.scaleY / retinaScaling,\n );\n this._applyPatternGradientTransform(pCtx, filler);\n pCtx.fillStyle = filler.toLive(ctx)!;\n pCtx.fill();\n ctx.translate(\n -this.width / 2 - this.strokeWidth / 2,\n -this.height / 2 - this.strokeWidth / 2,\n );\n ctx.scale(\n (retinaScaling * this.scaleX) / dims.zoomX,\n (retinaScaling * this.scaleY) / dims.zoomY,\n );\n ctx.strokeStyle = pCtx.createPattern(pCanvas, 'no-repeat') ?? '';\n }\n\n /**\n * This function is an helper for svg import. it returns the center of the object in the svg\n * untransformed coordinates\n * @private\n * @return {Point} center point from element coordinates\n */\n _findCenterFromElement() {\n return new Point(this.left + this.width / 2, this.top + this.height / 2);\n }\n\n /**\n * Clones an instance.\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @returns {Promise}\n */\n clone(propertiesToInclude?: string[]): Promise {\n const objectForm = this.toObject(propertiesToInclude);\n return (this.constructor as typeof FabricObject).fromObject(\n objectForm,\n ) as unknown as Promise;\n }\n\n /**\n * Creates an instance of Image out of an object\n * makes use of toCanvasElement.\n * Once this method was based on toDataUrl and loadImage, so it also had a quality\n * and format option. toCanvasElement is faster and produce no loss of quality.\n * If you need to get a real Jpeg or Png from an object, using toDataURL is the right way to do it.\n * toCanvasElement and then toBlob from the obtained canvas is also a good option.\n * @todo fix the export type, it could not be Image but the type that getClass return for 'image'.\n * @param {ObjectToCanvasElementOptions} [options] for clone as image, passed to toDataURL\n * @param {Number} [options.multiplier=1] Multiplier to scale by\n * @param {Number} [options.left] Cropping left offset. Introduced in v1.2.14\n * @param {Number} [options.top] Cropping top offset. Introduced in v1.2.14\n * @param {Number} [options.width] Cropping width. Introduced in v1.2.14\n * @param {Number} [options.height] Cropping height. Introduced in v1.2.14\n * @param {Boolean} [options.enableRetinaScaling] Enable retina scaling for clone image. Introduce in 1.6.4\n * @param {Boolean} [options.withoutTransform] Remove current object transform ( no scale , no angle, no flip, no skew ). Introduced in 2.3.4\n * @param {Boolean} [options.withoutShadow] Remove current object shadow. Introduced in 2.4.2\n * @return {FabricImage} Object cloned as image.\n */\n cloneAsImage(options: ObjectToCanvasElementOptions): FabricImage {\n const canvasEl = this.toCanvasElement(options);\n // TODO: how to import Image w/o an import cycle?\n const ImageClass = classRegistry.getClass('image');\n return new ImageClass(canvasEl);\n }\n\n /**\n * Converts an object into a HTMLCanvas element\n * @param {ObjectToCanvasElementOptions} options Options object\n * @param {Number} [options.multiplier=1] Multiplier to scale by\n * @param {Number} [options.left] Cropping left offset. Introduced in v1.2.14\n * @param {Number} [options.top] Cropping top offset. Introduced in v1.2.14\n * @param {Number} [options.width] Cropping width. Introduced in v1.2.14\n * @param {Number} [options.height] Cropping height. Introduced in v1.2.14\n * @param {Boolean} [options.enableRetinaScaling] Enable retina scaling for clone image. Introduce in 1.6.4\n * @param {Boolean} [options.withoutTransform] Remove current object transform ( no scale , no angle, no flip, no skew ). Introduced in 2.3.4\n * @param {Boolean} [options.withoutShadow] Remove current object shadow. Introduced in 2.4.2\n * @param {Boolean} [options.viewportTransform] Account for canvas viewport transform\n * @param {(el?: HTMLCanvasElement) => StaticCanvas} [options.canvasProvider] Create the output canvas\n * @return {HTMLCanvasElement} Returns DOM element with the FabricObject\n */\n toCanvasElement(options: ObjectToCanvasElementOptions = {}) {\n const origParams = saveObjectTransform(this),\n originalGroup = this.group,\n originalShadow = this.shadow,\n abs = Math.abs,\n retinaScaling = options.enableRetinaScaling ? getDevicePixelRatio() : 1,\n multiplier = (options.multiplier || 1) * retinaScaling,\n canvasProvider: (el: HTMLCanvasElement) => StaticCanvas =\n options.canvasProvider ||\n ((el: HTMLCanvasElement) =>\n new StaticCanvas(el, {\n enableRetinaScaling: false,\n renderOnAddRemove: false,\n skipOffscreen: false,\n }));\n delete this.group;\n if (options.withoutTransform) {\n resetObjectTransform(this);\n }\n if (options.withoutShadow) {\n this.shadow = null;\n }\n if (options.viewportTransform) {\n sendObjectToPlane(this, this.getViewportTransform());\n }\n\n this.setCoords();\n const el = createCanvasElement(),\n boundingRect = this.getBoundingRect(),\n shadow = this.shadow,\n shadowOffset = new Point();\n\n if (shadow) {\n const shadowBlur = shadow.blur;\n const scaling = shadow.nonScaling\n ? new Point(1, 1)\n : this.getObjectScaling();\n // consider non scaling shadow.\n shadowOffset.x =\n 2 * Math.round(abs(shadow.offsetX) + shadowBlur) * abs(scaling.x);\n shadowOffset.y =\n 2 * Math.round(abs(shadow.offsetY) + shadowBlur) * abs(scaling.y);\n }\n const width = boundingRect.width + shadowOffset.x,\n height = boundingRect.height + shadowOffset.y;\n // if the current width/height is not an integer\n // we need to make it so.\n el.width = Math.ceil(width);\n el.height = Math.ceil(height);\n const canvas = canvasProvider(el);\n if (options.format === 'jpeg') {\n canvas.backgroundColor = '#fff';\n }\n this.setPositionByOrigin(\n new Point(canvas.width / 2, canvas.height / 2),\n CENTER,\n CENTER,\n );\n const originalCanvas = this.canvas;\n // static canvas and canvas have both an array of InteractiveObjects\n // @ts-expect-error this needs to be fixed somehow, or ignored globally\n canvas._objects = [this];\n this.set('canvas', canvas);\n this.setCoords();\n const canvasEl = canvas.toCanvasElement(multiplier || 1, options);\n this.set('canvas', originalCanvas);\n this.shadow = originalShadow;\n if (originalGroup) {\n this.group = originalGroup;\n }\n this.set(origParams);\n this.setCoords();\n // canvas.dispose will call image.dispose that will nullify the elements\n // since this canvas is a simple element for the process, we remove references\n // to objects in this way in order to avoid object trashing.\n canvas._objects = [];\n // since render has settled it is safe to destroy canvas\n canvas.destroy();\n return canvasEl;\n }\n\n /**\n * Converts an object into a data-url-like string\n * @param {Object} options Options object\n * @param {String} [options.format=png] The format of the output image. Either \"jpeg\" or \"png\"\n * @param {Number} [options.quality=1] Quality level (0..1). Only used for jpeg.\n * @param {Number} [options.multiplier=1] Multiplier to scale by\n * @param {Number} [options.left] Cropping left offset. Introduced in v1.2.14\n * @param {Number} [options.top] Cropping top offset. Introduced in v1.2.14\n * @param {Number} [options.width] Cropping width. Introduced in v1.2.14\n * @param {Number} [options.height] Cropping height. Introduced in v1.2.14\n * @param {Boolean} [options.enableRetinaScaling] Enable retina scaling for clone image. Introduce in 1.6.4\n * @param {Boolean} [options.withoutTransform] Remove current object transform ( no scale , no angle, no flip, no skew ). Introduced in 2.3.4\n * @param {Boolean} [options.withoutShadow] Remove current object shadow. Introduced in 2.4.2\n * @return {String} Returns a data: URL containing a representation of the object in the format specified by options.format\n */\n toDataURL(options: toDataURLOptions = {}) {\n return toDataURL(\n this.toCanvasElement(options),\n options.format || 'png',\n options.quality || 1,\n );\n }\n toBlob(options: toDataURLOptions = {}) {\n return toBlob(\n this.toCanvasElement(options),\n options.format || 'png',\n options.quality || 1,\n );\n }\n\n /**\n * Checks if the instance is of any of the specified types.\n * We use this to filter a list of objects for the `getObjects` function.\n *\n * For detecting an instance type `instanceOf` is a better check,\n * but to avoid to make specific classes a dependency of generic code\n * internally we use this.\n *\n * This compares both the static class `type` and the instance's own `type` property\n * against the provided list of types.\n *\n * @param types - A list of type strings to check against.\n * @returns `true` if the object's type or class type matches any in the list, otherwise `false`.\n */\n isType(...types: string[]) {\n return (\n types.includes((this.constructor as typeof FabricObject).type) ||\n types.includes(this.type)\n );\n }\n\n /**\n * Returns complexity of an instance\n * @return {Number} complexity of this instance (is 1 unless subclassed)\n */\n complexity() {\n return 1;\n }\n\n /**\n * Returns a JSON representation of an instance\n * @return {Object} JSON\n */\n toJSON() {\n // delegate, not alias\n return this.toObject();\n }\n\n /**\n * Sets \"angle\" of an instance with centered rotation\n * @param {TDegree} angle Angle value (in degrees)\n */\n rotate(angle: TDegree) {\n const { centeredRotation, originX, originY } = this;\n\n if (centeredRotation) {\n const { x, y } = this.getRelativeCenterPoint();\n this.originX = CENTER;\n this.originY = CENTER;\n this.left = x;\n this.top = y;\n }\n\n this.set('angle', angle);\n\n if (centeredRotation) {\n const { x, y } = this.translateToOriginPoint(\n this.getRelativeCenterPoint(),\n originX,\n originY,\n );\n this.left = x;\n this.top = y;\n this.originX = originX;\n this.originY = originY;\n }\n }\n\n /**\n * This callback function is called by the parent group of an object every\n * time a non-delegated property changes on the group. It is passed the key\n * and value as parameters. Not adding in this function's signature to avoid\n * Travis build error about unused variables.\n */\n setOnGroup() {\n // implemented by sub-classes, as needed.\n }\n\n /**\n * Sets canvas globalCompositeOperation for specific object\n * custom composition operation for the particular object can be specified using globalCompositeOperation property\n * @param {CanvasRenderingContext2D} ctx Rendering canvas context\n */\n _setupCompositeOperation(ctx: CanvasRenderingContext2D) {\n if (this.globalCompositeOperation) {\n ctx.globalCompositeOperation = this.globalCompositeOperation;\n }\n }\n\n /**\n * cancel instance's running animations\n * override if necessary to dispose artifacts such as `clipPath`\n */\n dispose() {\n runningAnimations.cancelByTarget(this);\n this.off();\n this._set('canvas', undefined);\n // clear caches\n this._cacheCanvas && getEnv().dispose(this._cacheCanvas);\n this._cacheCanvas = undefined;\n this._cacheContext = null;\n }\n\n // #region Animation methods\n /**\n * List of properties to consider for animating colors.\n * @type String[]\n */\n static colorProperties: string[] = [FILL, STROKE, 'backgroundColor'];\n\n /**\n * Animates object's properties\n * @param {Record} animatable map of keys and end values\n * @param {Partial>} options\n * @tutorial {@link http://fabricjs.com/fabric-intro-part-2#animation}\n * @return {Record>} map of animation contexts\n *\n * As object — multiple properties\n *\n * object.animate({ left: ..., top: ... });\n * object.animate({ left: ..., top: ... }, { duration: ... });\n */\n animate(\n animatable: Record,\n options?: Partial>,\n ): Record> {\n return Object.entries(animatable).reduce(\n (acc, [key, endValue]) => {\n acc[key] = this._animate(key, endValue, options);\n return acc;\n },\n {} as Record>,\n );\n }\n\n /**\n * @private\n * @param {String} key Property to animate\n * @param {String} to Value to animate to\n * @param {Object} [options] Options object\n */\n _animate(\n key: string,\n endValue: T,\n options: Partial> = {},\n ): TAnimation {\n const path = key.split('.');\n const propIsColor = (\n this.constructor as typeof FabricObject\n ).colorProperties.includes(path[path.length - 1]);\n const { abort, startValue, onChange, onComplete } = options;\n const animationOptions = {\n ...options,\n target: this,\n // path.reduce... is the current value in case start value isn't provided\n startValue:\n startValue ?? path.reduce((deep: any, key) => deep[key], this),\n endValue,\n abort: abort?.bind(this),\n onChange: (\n value: number | number[] | string,\n valueProgress: number,\n durationProgress: number,\n ) => {\n path.reduce((deep: Record, key, index) => {\n if (index === path.length - 1) {\n deep[key] = value;\n }\n return deep[key];\n }, this);\n onChange &&\n // @ts-expect-error generic callback arg0 is wrong\n onChange(value, valueProgress, durationProgress);\n },\n onComplete: (\n value: number | number[] | string,\n valueProgress: number,\n durationProgress: number,\n ) => {\n this.setCoords();\n onComplete &&\n // @ts-expect-error generic callback arg0 is wrong\n onComplete(value, valueProgress, durationProgress);\n },\n } as AnimationOptions;\n\n return (\n propIsColor\n ? animateColor(animationOptions as ColorAnimationOptions)\n : animate(\n animationOptions as ValueAnimationOptions | ArrayAnimationOptions,\n )\n ) as TAnimation;\n }\n\n // #region Object stacking methods\n\n /**\n * A reference to the parent of the object\n * Used to keep the original parent ref when the object has been added to an ActiveSelection, hence loosing the `group` ref\n */\n declare parent?: Group;\n\n /**\n * Checks if object is descendant of target\n * Should be used instead of {@link Group.contains} or {@link StaticCanvas.contains} for performance reasons\n * @param {TAncestor} target\n * @returns {boolean}\n */\n isDescendantOf(target: TAncestor): boolean {\n const { parent, group } = this;\n return (\n parent === target ||\n group === target ||\n // walk up\n (!!parent && parent.isDescendantOf(target)) ||\n (!!group && group !== parent && group.isDescendantOf(target))\n );\n }\n\n /**\n * @returns {Ancestors} ancestors (excluding `ActiveSelection`) from bottom to top\n */\n getAncestors(): Ancestors {\n const ancestors: TAncestor[] = [];\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n let parent: TAncestor | undefined = this;\n do {\n parent = parent.parent;\n parent && ancestors.push(parent);\n } while (parent);\n return ancestors as Ancestors;\n }\n\n /**\n * Compare ancestors\n *\n * @param {StackedObject} other\n * @returns {AncestryComparison} an object that represent the ancestry situation.\n */\n findCommonAncestors(other: T): AncestryComparison {\n if (this === other) {\n return {\n fork: [],\n otherFork: [],\n common: [this, ...this.getAncestors()],\n } as AncestryComparison;\n }\n const ancestors = this.getAncestors();\n const otherAncestors = other.getAncestors();\n // if `this` has no ancestors and `this` is top ancestor of `other` we must handle the following case\n if (\n ancestors.length === 0 &&\n otherAncestors.length > 0 &&\n this === otherAncestors[otherAncestors.length - 1]\n ) {\n return {\n fork: [],\n otherFork: [\n other,\n ...otherAncestors.slice(0, otherAncestors.length - 1),\n ],\n common: [this],\n } as AncestryComparison;\n }\n // compare ancestors\n for (let i = 0, ancestor; i < ancestors.length; i++) {\n ancestor = ancestors[i];\n if (ancestor === other) {\n return {\n fork: [this, ...ancestors.slice(0, i)],\n otherFork: [],\n common: ancestors.slice(i),\n } as AncestryComparison;\n }\n for (let j = 0; j < otherAncestors.length; j++) {\n if (this === otherAncestors[j]) {\n return {\n fork: [],\n otherFork: [other, ...otherAncestors.slice(0, j)],\n common: [this, ...ancestors],\n } as AncestryComparison;\n }\n if (ancestor === otherAncestors[j]) {\n return {\n fork: [this, ...ancestors.slice(0, i)],\n otherFork: [other, ...otherAncestors.slice(0, j)],\n common: ancestors.slice(i),\n } as AncestryComparison;\n }\n }\n }\n // nothing shared\n return {\n fork: [this, ...ancestors],\n otherFork: [other, ...otherAncestors],\n common: [],\n } as AncestryComparison;\n }\n\n /**\n *\n * @param {StackedObject} other\n * @returns {boolean}\n */\n hasCommonAncestors(other: T): boolean {\n const commonAncestors = this.findCommonAncestors(other);\n return commonAncestors && !!commonAncestors.common.length;\n }\n\n /**\n *\n * @param {FabricObject} other object to compare against\n * @returns {boolean | undefined} if objects do not share a common ancestor or they are strictly equal it is impossible to determine which is in front of the other; in such cases the function returns `undefined`\n */\n isInFrontOf(other: T): boolean | undefined {\n if (this === other) {\n return undefined;\n }\n const ancestorData = this.findCommonAncestors(other);\n\n if (ancestorData.fork.includes(other as any)) {\n return true;\n }\n if (ancestorData.otherFork.includes(this as any)) {\n return false;\n }\n // if there isn't a common ancestor, we take the canvas.\n // if there is no canvas, there is nothing to compare\n const firstCommonAncestor = ancestorData.common[0] || this.canvas;\n if (!firstCommonAncestor) {\n return undefined;\n }\n const headOfFork = ancestorData.fork.pop(),\n headOfOtherFork = ancestorData.otherFork.pop(),\n thisIndex = (firstCommonAncestor as TCollection)._objects.indexOf(\n headOfFork as any,\n ),\n otherIndex = (firstCommonAncestor as TCollection)._objects.indexOf(\n headOfOtherFork as any,\n );\n return thisIndex > -1 && thisIndex > otherIndex;\n }\n\n // #region Serialization\n /**\n * Define a list of custom properties that will be serialized when\n * instance.toObject() gets called\n */\n static customProperties: string[] = [];\n\n /**\n * Returns an object representation of an instance\n * @param {string[]} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} Object representation of an instance\n */\n toObject(propertiesToInclude: any[] = []): any {\n const propertiesToSerialize = propertiesToInclude.concat(\n FabricObject.customProperties,\n (this.constructor as typeof FabricObject).customProperties || [],\n );\n let clipPathData: Partial | undefined;\n const NUM_FRACTION_DIGITS = config.NUM_FRACTION_DIGITS;\n const {\n clipPath,\n fill,\n stroke,\n shadow,\n strokeDashArray,\n left,\n top,\n originX,\n originY,\n width,\n height,\n strokeWidth,\n strokeLineCap,\n strokeDashOffset,\n strokeLineJoin,\n strokeUniform,\n strokeMiterLimit,\n scaleX,\n scaleY,\n angle,\n flipX,\n flipY,\n opacity,\n visible,\n backgroundColor,\n fillRule,\n paintFirst,\n globalCompositeOperation,\n skewX,\n skewY,\n } = this;\n if (clipPath && !clipPath.excludeFromExport) {\n clipPathData = clipPath.toObject(\n propertiesToSerialize.concat('inverted', 'absolutePositioned'),\n );\n }\n const toFixedBound = (val: number) => toFixed(val, NUM_FRACTION_DIGITS);\n const object = {\n ...pick(this, propertiesToSerialize as (keyof this)[]),\n type: (this.constructor as typeof FabricObject).type,\n version: VERSION,\n originX,\n originY,\n left: toFixedBound(left),\n top: toFixedBound(top),\n width: toFixedBound(width),\n height: toFixedBound(height),\n fill: isSerializableFiller(fill) ? fill.toObject() : fill,\n stroke: isSerializableFiller(stroke) ? stroke.toObject() : stroke,\n strokeWidth: toFixedBound(strokeWidth),\n strokeDashArray: strokeDashArray\n ? strokeDashArray.concat()\n : strokeDashArray,\n strokeLineCap,\n strokeDashOffset,\n strokeLineJoin,\n strokeUniform,\n strokeMiterLimit: toFixedBound(strokeMiterLimit),\n scaleX: toFixedBound(scaleX),\n scaleY: toFixedBound(scaleY),\n angle: toFixedBound(angle),\n flipX,\n flipY,\n opacity: toFixedBound(opacity),\n shadow: shadow ? shadow.toObject() : shadow,\n visible,\n backgroundColor,\n fillRule,\n paintFirst,\n globalCompositeOperation,\n skewX: toFixedBound(skewX),\n skewY: toFixedBound(skewY),\n ...(clipPathData ? { clipPath: clipPathData } : null),\n };\n\n return !this.includeDefaultValues\n ? this._removeDefaultValues(object)\n : object;\n }\n\n /**\n * Returns (dataless) object representation of an instance\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} Object representation of an instance\n */\n toDatalessObject(propertiesToInclude?: any[]): any {\n // will be overwritten by subclasses\n return this.toObject(propertiesToInclude);\n }\n\n /**\n * @private\n * @param {Object} object\n */\n _removeDefaultValues(object: T): Partial {\n // getDefaults() ( get from static ownDefaults ) should win over prototype since anyway they get assigned to instance\n // ownDefault vs prototype is swappable only if you change all the fabric objects consistently.\n const defaults = (this.constructor as typeof FabricObject).getDefaults();\n const hasStaticDefaultValues = Object.keys(defaults).length > 0;\n const baseValues = hasStaticDefaultValues\n ? defaults\n : Object.getPrototypeOf(this);\n\n return pickBy(object, (value, key) => {\n if (key === LEFT || key === TOP || key === 'type') {\n return true;\n }\n const baseValue = baseValues[key];\n return (\n value !== baseValue &&\n // basically a check for [] === []\n !(\n Array.isArray(value) &&\n Array.isArray(baseValue) &&\n value.length === 0 &&\n baseValue.length === 0\n )\n );\n });\n }\n\n /**\n * Returns a string representation of an instance\n * @return {String}\n */\n toString() {\n return `#<${(this.constructor as typeof FabricObject).type}>`;\n }\n\n /**\n *\n * @param {Function} klass\n * @param {object} object\n * @param {object} [options]\n * @param {string} [options.extraParam] property to pass as first argument to the constructor\n * @param {AbortSignal} [options.signal] handle aborting, see https://developer.mozilla.org/en-US/docs/Web/API/AbortController/signal\n * @returns {Promise}\n */\n static _fromObject(\n { type, ...serializedObjectOptions }: Record,\n { extraParam, ...options }: Abortable & { extraParam?: string } = {},\n ): Promise {\n return enlivenObjectEnlivables(serializedObjectOptions, options).then(\n (enlivedObjectOptions) => {\n // from the resulting enlived options, extract options.extraParam to arg0\n // to avoid accidental overrides later\n if (extraParam) {\n delete enlivedObjectOptions[extraParam];\n return new this(\n serializedObjectOptions[extraParam],\n // @ts-expect-error different signature\n enlivedObjectOptions,\n );\n } else {\n return new this(enlivedObjectOptions);\n }\n },\n ) as Promise;\n }\n\n /**\n *\n * @param {object} object\n * @param {object} [options]\n * @param {AbortSignal} [options.signal] handle aborting, see https://developer.mozilla.org/en-US/docs/Web/API/AbortController/signal\n * @returns {Promise}\n */\n static fromObject>(\n object: T,\n options?: Abortable,\n ) {\n return this._fromObject(object, options);\n }\n}\n\nclassRegistry.setClass(FabricObject);\nclassRegistry.setClass(FabricObject, 'object');\n","import type {\n TModificationEvents,\n Transform,\n TransformActionHandler,\n} from '../EventTypeDefs';\nimport { fireEvent } from './fireEvent';\nimport { commonEventInfo } from './util';\n\n/**\n * Wrap an action handler with firing an event if the action is performed\n * @param {TModificationEvents} eventName the event we want to fire\n * @param {TransformActionHandler} actionHandler the function to wrap\n * @param {object} extraEventInfo extra information to pas to the event handler\n * @return {TransformActionHandler} a function with an action handler signature\n */\nexport const wrapWithFireEvent = <\n T extends Transform,\n P extends object = Record,\n>(\n eventName: TModificationEvents,\n actionHandler: TransformActionHandler,\n extraEventInfo?: P,\n) => {\n return ((eventData, transform, x, y) => {\n const actionPerformed = actionHandler(eventData, transform, x, y);\n if (actionPerformed) {\n fireEvent(eventName, {\n ...commonEventInfo(eventData, transform, x, y),\n ...extraEventInfo,\n });\n }\n return actionPerformed;\n }) as TransformActionHandler;\n};\n","import type { Transform, TransformActionHandler } from '../EventTypeDefs';\n\n/**\n * Wrap an action handler with saving/restoring object position on the transform.\n * this is the code that permits to objects to keep their position while transforming.\n * @param {Function} actionHandler the function to wrap\n * @return {Function} a function with an action handler signature\n */\nexport function wrapWithFixedAnchor(\n actionHandler: TransformActionHandler,\n) {\n return ((eventData, transform, x, y) => {\n const { target, originX, originY } = transform,\n centerPoint = target.getRelativeCenterPoint(),\n constraint = target.translateToOriginPoint(centerPoint, originX, originY),\n actionPerformed = actionHandler(eventData, transform, x, y);\n // flipping requires to change the transform origin, so we read from the mutated transform\n // instead of leveraging the one destructured before\n target.setPositionByOrigin(\n constraint,\n transform.originX,\n transform.originY,\n );\n return actionPerformed;\n }) as TransformActionHandler;\n}\n","import type { TransformActionHandler } from '../EventTypeDefs';\nimport { CENTER, LEFT, RESIZING, RIGHT } from '../constants';\nimport { resolveOrigin } from '../util/misc/resolveOrigin';\nimport { getLocalPoint, isTransformCentered } from './util';\nimport { wrapWithFireEvent } from './wrapWithFireEvent';\nimport { wrapWithFixedAnchor } from './wrapWithFixedAnchor';\n\n/**\n * Action handler to change object's width\n * Needs to be wrapped with `wrapWithFixedAnchor` to be effective\n * @param {Event} eventData javascript event that is doing the transform\n * @param {Object} transform javascript object containing a series of information around the current transform\n * @param {number} x current mouse x position, canvas normalized\n * @param {number} y current mouse y position, canvas normalized\n * @return {Boolean} true if some change happened\n */\nexport const changeObjectWidth: TransformActionHandler = (\n eventData,\n transform,\n x,\n y,\n) => {\n const localPoint = getLocalPoint(\n transform,\n transform.originX,\n transform.originY,\n x,\n y,\n );\n // make sure the control changes width ONLY from it's side of target\n if (\n resolveOrigin(transform.originX) === resolveOrigin(CENTER) ||\n (resolveOrigin(transform.originX) === resolveOrigin(RIGHT) &&\n localPoint.x < 0) ||\n (resolveOrigin(transform.originX) === resolveOrigin(LEFT) &&\n localPoint.x > 0)\n ) {\n const { target } = transform,\n strokePadding =\n target.strokeWidth / (target.strokeUniform ? target.scaleX : 1),\n multiplier = isTransformCentered(transform) ? 2 : 1,\n oldWidth = target.width,\n newWidth =\n Math.abs((localPoint.x * multiplier) / target.scaleX) - strokePadding;\n target.set('width', Math.max(newWidth, 1));\n // check against actual target width in case `newWidth` was rejected\n return oldWidth !== target.width;\n }\n return false;\n};\n\nexport const changeWidth = wrapWithFireEvent(\n RESIZING,\n wrapWithFixedAnchor(changeObjectWidth),\n);\n","import { FILL, STROKE, twoMathPi } from '../constants';\nimport type { InteractiveFabricObject } from '../shapes/Object/InteractiveObject';\nimport { degreesToRadians } from '../util/misc/radiansDegreesConversion';\nimport type { Control } from './Control';\n\nexport type ControlRenderingStyleOverride = Partial<\n Pick<\n InteractiveFabricObject,\n | 'cornerStyle'\n | 'cornerSize'\n | 'cornerColor'\n | 'cornerStrokeColor'\n | 'cornerDashArray'\n | 'transparentCorners'\n >\n>;\n\nexport type ControlRenderer<\n O extends InteractiveFabricObject = InteractiveFabricObject,\n> = (\n ctx: CanvasRenderingContext2D,\n left: number,\n top: number,\n styleOverride: ControlRenderingStyleOverride,\n fabricObject: O,\n) => void;\n\n/**\n * Render a round control, as per fabric features.\n * This function is written to respect object properties like transparentCorners, cornerSize\n * cornerColor, cornerStrokeColor\n * plus the addition of offsetY and offsetX.\n * @param {CanvasRenderingContext2D} ctx context to render on\n * @param {Number} left x coordinate where the control center should be\n * @param {Number} top y coordinate where the control center should be\n * @param {Object} styleOverride override for FabricObject controls style\n * @param {FabricObject} fabricObject the fabric object for which we are rendering controls\n */\nexport function renderCircleControl(\n this: Control,\n ctx: CanvasRenderingContext2D,\n left: number,\n top: number,\n styleOverride: ControlRenderingStyleOverride,\n fabricObject: InteractiveFabricObject,\n) {\n styleOverride = styleOverride || {};\n const xSize =\n this.sizeX || styleOverride.cornerSize || fabricObject.cornerSize,\n ySize = this.sizeY || styleOverride.cornerSize || fabricObject.cornerSize,\n transparentCorners =\n typeof styleOverride.transparentCorners !== 'undefined'\n ? styleOverride.transparentCorners\n : fabricObject.transparentCorners,\n methodName = transparentCorners ? STROKE : FILL,\n stroke =\n !transparentCorners &&\n (styleOverride.cornerStrokeColor || fabricObject.cornerStrokeColor);\n let myLeft = left,\n myTop = top,\n size;\n ctx.save();\n ctx.fillStyle = styleOverride.cornerColor || fabricObject.cornerColor || '';\n ctx.strokeStyle =\n styleOverride.cornerStrokeColor || fabricObject.cornerStrokeColor || '';\n // TODO: use proper ellipse code.\n if (xSize > ySize) {\n size = xSize;\n ctx.scale(1.0, ySize / xSize);\n myTop = (top * xSize) / ySize;\n } else if (ySize > xSize) {\n size = ySize;\n ctx.scale(xSize / ySize, 1.0);\n myLeft = (left * ySize) / xSize;\n } else {\n size = xSize;\n }\n ctx.beginPath();\n ctx.arc(myLeft, myTop, size / 2, 0, twoMathPi, false);\n ctx[methodName]();\n if (stroke) {\n ctx.stroke();\n }\n ctx.restore();\n}\n\n/**\n * Render a square control, as per fabric features.\n * This function is written to respect object properties like transparentCorners, cornerSize\n * cornerColor, cornerStrokeColor\n * plus the addition of offsetY and offsetX.\n * @param {CanvasRenderingContext2D} ctx context to render on\n * @param {Number} left x coordinate where the control center should be\n * @param {Number} top y coordinate where the control center should be\n * @param {Object} styleOverride override for FabricObject controls style\n * @param {FabricObject} fabricObject the fabric object for which we are rendering controls\n */\nexport function renderSquareControl(\n this: Control,\n ctx: CanvasRenderingContext2D,\n left: number,\n top: number,\n styleOverride: ControlRenderingStyleOverride,\n fabricObject: InteractiveFabricObject,\n) {\n styleOverride = styleOverride || {};\n const xSize =\n this.sizeX || styleOverride.cornerSize || fabricObject.cornerSize,\n ySize = this.sizeY || styleOverride.cornerSize || fabricObject.cornerSize,\n transparentCorners =\n typeof styleOverride.transparentCorners !== 'undefined'\n ? styleOverride.transparentCorners\n : fabricObject.transparentCorners,\n methodName = transparentCorners ? STROKE : FILL,\n stroke =\n !transparentCorners &&\n (styleOverride.cornerStrokeColor || fabricObject.cornerStrokeColor),\n xSizeBy2 = xSize / 2,\n ySizeBy2 = ySize / 2;\n ctx.save();\n ctx.fillStyle = styleOverride.cornerColor || fabricObject.cornerColor || '';\n ctx.strokeStyle =\n styleOverride.cornerStrokeColor || fabricObject.cornerStrokeColor || '';\n ctx.translate(left, top);\n // angle is relative to canvas plane\n const angle = fabricObject.getTotalAngle();\n ctx.rotate(degreesToRadians(angle));\n // this does not work, and fixed with ( && ) does not make sense.\n // to have real transparent corners we need the controls on upperCanvas\n // transparentCorners || ctx.clearRect(-xSizeBy2, -ySizeBy2, xSize, ySize);\n ctx[`${methodName}Rect`](-xSizeBy2, -ySizeBy2, xSize, ySize);\n if (stroke) {\n ctx.strokeRect(-xSizeBy2, -ySizeBy2, xSize, ySize);\n }\n ctx.restore();\n}\n","/* eslint-disable @typescript-eslint/no-unused-vars */\nimport type {\n ControlActionHandler,\n TPointerEvent,\n TransformActionHandler,\n} from '../EventTypeDefs';\nimport { Intersection } from '../Intersection';\nimport { Point } from '../Point';\nimport { SCALE } from '../constants';\nimport type {\n InteractiveFabricObject,\n TOCoord,\n} from '../shapes/Object/InteractiveObject';\nimport type { TCornerPoint, TDegree, TMat2D } from '../typedefs';\nimport {\n createRotateMatrix,\n createScaleMatrix,\n createTranslateMatrix,\n multiplyTransformMatrixArray,\n} from '../util/misc/matrix';\nimport type { ControlRenderingStyleOverride } from './controlRendering';\nimport { renderCircleControl, renderSquareControl } from './controlRendering';\n\nexport class Control {\n /**\n * keep track of control visibility.\n * mainly for backward compatibility.\n * if you do not want to see a control, you can remove it\n * from the control set.\n * @type {Boolean}\n * @default true\n */\n visible = true;\n\n /**\n * Name of the action that the control will likely execute.\n * This is optional. FabricJS uses to identify what the user is doing for some\n * extra optimizations. If you are writing a custom control and you want to know\n * somewhere else in the code what is going on, you can use this string here.\n * you can also provide a custom getActionName if your control run multiple actions\n * depending on some external state.\n * default to scale since is the most common, used on 4 corners by default\n * @type {String}\n * @default 'scale'\n */\n actionName = SCALE;\n\n /**\n * Drawing angle of the control.\n * NOT used for now, but name marked as needed for internal logic\n * example: to reuse the same drawing function for different rotated controls\n * @type {Number}\n * @default 0\n */\n angle = 0;\n\n /**\n * Relative position of the control. X\n * 0,0 is the center of the Object, while -0.5 (left) or 0.5 (right) are the extremities\n * of the bounding box.\n * @type {Number}\n * @default 0\n */\n x = 0;\n\n /**\n * Relative position of the control. Y\n * 0,0 is the center of the Object, while -0.5 (top) or 0.5 (bottom) are the extremities\n * of the bounding box.\n * @type {Number}\n * @default 0\n */\n y = 0;\n\n /**\n * Horizontal offset of the control from the defined position. In pixels\n * Positive offset moves the control to the right, negative to the left.\n * It used when you want to have position of control that does not scale with\n * the bounding box. Example: rotation control is placed at x:0, y: 0.5 on\n * the boundind box, with an offset of 30 pixels vertically. Those 30 pixels will\n * stay 30 pixels no matter how the object is big. Another example is having 2\n * controls in the corner, that stay in the same position when the object scale.\n * of the bounding box.\n * @type {Number}\n * @default 0\n */\n offsetX = 0;\n\n /**\n * Vertical offset of the control from the defined position. In pixels\n * Positive offset moves the control to the bottom, negative to the top.\n * @type {Number}\n * @default 0\n */\n offsetY = 0;\n\n /**\n * Sets the length of the control. If null, defaults to object's cornerSize.\n * Expects both sizeX and sizeY to be set when set.\n * @type {?Number}\n * @default null\n */\n sizeX = 0;\n\n /**\n * Sets the height of the control. If null, defaults to object's cornerSize.\n * Expects both sizeX and sizeY to be set when set.\n * @type {?Number}\n * @default null\n */\n sizeY = 0;\n\n /**\n * Sets the length of the touch area of the control. If null, defaults to object's touchCornerSize.\n * Expects both touchSizeX and touchSizeY to be set when set.\n * @type {?Number}\n * @default null\n */\n touchSizeX = 0;\n\n /**\n * Sets the height of the touch area of the control. If null, defaults to object's touchCornerSize.\n * Expects both touchSizeX and touchSizeY to be set when set.\n * @type {?Number}\n * @default null\n */\n touchSizeY = 0;\n\n /**\n * Css cursor style to display when the control is hovered.\n * if the method `cursorStyleHandler` is provided, this property is ignored.\n * @type {String}\n * @default 'crosshair'\n */\n cursorStyle = 'crosshair';\n\n /**\n * If controls has an offsetY or offsetX, draw a line that connects\n * the control to the bounding box\n * @type {Boolean}\n * @default false\n */\n withConnection = false;\n\n constructor(options?: Partial) {\n Object.assign(this, options);\n }\n\n /**\n * The control actionHandler, provide one to handle action ( control being moved )\n * @param {Event} eventData the native mouse event\n * @param {Transform} transformData properties of the current transform\n * @param {Number} x x position of the cursor\n * @param {Number} y y position of the cursor\n * @return {Boolean} true if the action/event modified the object\n */\n declare actionHandler: TransformActionHandler;\n\n /**\n * The control handler for mouse down, provide one to handle mouse down on control\n * @param {Event} eventData the native mouse event\n * @param {Transform} transformData properties of the current transform\n * @param {Number} x x position of the cursor\n * @param {Number} y y position of the cursor\n * @return {Boolean} true if the action/event modified the object\n */\n declare mouseDownHandler?: ControlActionHandler;\n\n /**\n * The control mouseUpHandler, provide one to handle an effect on mouse up.\n * @param {Event} eventData the native mouse event\n * @param {Transform} transformData properties of the current transform\n * @param {Number} x x position of the cursor\n * @param {Number} y y position of the cursor\n * @return {Boolean} true if the action/event modified the object\n */\n declare mouseUpHandler?: ControlActionHandler;\n\n shouldActivate(\n controlKey: string,\n fabricObject: InteractiveFabricObject,\n pointer: Point,\n { tl, tr, br, bl }: TCornerPoint,\n ) {\n // TODO: locking logic can be handled here instead of in the control handler logic\n return (\n fabricObject.canvas?.getActiveObject() === fabricObject &&\n fabricObject.isControlVisible(controlKey) &&\n Intersection.isPointInPolygon(pointer, [tl, tr, br, bl])\n );\n }\n\n /**\n * Returns control actionHandler\n * @param {Event} eventData the native mouse event\n * @param {FabricObject} fabricObject on which the control is displayed\n * @param {Control} control control for which the action handler is being asked\n * @return {Function} the action handler\n */\n getActionHandler(\n eventData: TPointerEvent,\n fabricObject: InteractiveFabricObject,\n control: Control,\n ): TransformActionHandler | undefined {\n return this.actionHandler;\n }\n\n /**\n * Returns control mouseDown handler\n * @param {Event} eventData the native mouse event\n * @param {FabricObject} fabricObject on which the control is displayed\n * @param {Control} control control for which the action handler is being asked\n * @return {Function} the action handler\n */\n getMouseDownHandler(\n eventData: TPointerEvent,\n fabricObject: InteractiveFabricObject,\n control: Control,\n ): ControlActionHandler | undefined {\n return this.mouseDownHandler;\n }\n\n /**\n * Returns control mouseUp handler.\n * During actions the fabricObject or the control can be of different obj\n * @param {Event} eventData the native mouse event\n * @param {FabricObject} fabricObject on which the control is displayed\n * @param {Control} control control for which the action handler is being asked\n * @return {Function} the action handler\n */\n getMouseUpHandler(\n eventData: TPointerEvent,\n fabricObject: InteractiveFabricObject,\n control: Control,\n ): ControlActionHandler | undefined {\n return this.mouseUpHandler;\n }\n\n /**\n * Returns control cursorStyle for css using cursorStyle. If you need a more elaborate\n * function you can pass one in the constructor\n * the cursorStyle property\n * @param {Event} eventData the native mouse event\n * @param {Control} control the current control ( likely this)\n * @param {FabricObject} object on which the control is displayed\n * @return {String}\n */\n cursorStyleHandler(\n eventData: TPointerEvent,\n control: Control,\n fabricObject: InteractiveFabricObject,\n coord: TOCoord,\n ) {\n return control.cursorStyle;\n }\n\n /**\n * Returns the action name. The basic implementation just return the actionName property.\n * @param {Event} eventData the native mouse event\n * @param {Control} control the current control ( likely this)\n * @param {FabricObject} object on which the control is displayed\n * @return {String}\n */\n getActionName(\n eventData: TPointerEvent,\n control: Control,\n fabricObject: InteractiveFabricObject,\n ) {\n return control.actionName;\n }\n\n /**\n * Returns controls visibility\n * @param {FabricObject} object on which the control is displayed\n * @param {String} controlKey key where the control is memorized on the\n * @return {Boolean}\n */\n getVisibility(fabricObject: InteractiveFabricObject, controlKey: string) {\n return fabricObject._controlsVisibility?.[controlKey] ?? this.visible;\n }\n\n /**\n * Sets controls visibility\n * @param {Boolean} visibility for the object\n * @return {Void}\n */\n setVisibility(\n visibility: boolean,\n name?: string,\n fabricObject?: InteractiveFabricObject,\n ) {\n this.visible = visibility;\n }\n\n positionHandler(\n dim: Point,\n finalMatrix: TMat2D,\n fabricObject: InteractiveFabricObject,\n currentControl: Control,\n ) {\n return new Point(\n this.x * dim.x + this.offsetX,\n this.y * dim.y + this.offsetY,\n ).transform(finalMatrix);\n }\n\n /**\n * Returns the coords for this control based on object values.\n * @param {Number} objectAngle angle from the fabric object holding the control\n * @param {Number} objectCornerSize cornerSize from the fabric object holding the control (or touchCornerSize if\n * isTouch is true)\n * @param {Number} centerX x coordinate where the control center should be\n * @param {Number} centerY y coordinate where the control center should be\n * @param {boolean} isTouch true if touch corner, false if normal corner\n */\n calcCornerCoords(\n angle: TDegree,\n objectCornerSize: number,\n centerX: number,\n centerY: number,\n isTouch: boolean,\n fabricObject: InteractiveFabricObject,\n ) {\n const t = multiplyTransformMatrixArray([\n createTranslateMatrix(centerX, centerY),\n createRotateMatrix({ angle }),\n createScaleMatrix(\n (isTouch ? this.touchSizeX : this.sizeX) || objectCornerSize,\n (isTouch ? this.touchSizeY : this.sizeY) || objectCornerSize,\n ),\n ]);\n return {\n tl: new Point(-0.5, -0.5).transform(t),\n tr: new Point(0.5, -0.5).transform(t),\n br: new Point(0.5, 0.5).transform(t),\n bl: new Point(-0.5, 0.5).transform(t),\n };\n }\n\n /**\n * Render function for the control.\n * When this function runs the context is unscaled. unrotate. Just retina scaled.\n * all the functions will have to translate to the point left,top before starting Drawing\n * if they want to draw a control where the position is detected.\n * left and top are the result of the positionHandler function\n * @param {RenderingContext2D} ctx the context where the control will be drawn\n * @param {Number} left position of the canvas where we are about to render the control.\n * @param {Number} top position of the canvas where we are about to render the control.\n * @param {Object} styleOverride\n * @param {FabricObject} fabricObject the object where the control is about to be rendered\n */\n render(\n ctx: CanvasRenderingContext2D,\n left: number,\n top: number,\n styleOverride: ControlRenderingStyleOverride | undefined,\n fabricObject: InteractiveFabricObject,\n ) {\n styleOverride = styleOverride || {};\n switch (styleOverride.cornerStyle || fabricObject.cornerStyle) {\n case 'circle':\n renderCircleControl.call(\n this,\n ctx,\n left,\n top,\n styleOverride,\n fabricObject,\n );\n break;\n default:\n renderSquareControl.call(\n this,\n ctx,\n left,\n top,\n styleOverride,\n fabricObject,\n );\n }\n }\n}\n","import type {\n ControlCursorCallback,\n TransformActionHandler,\n} from '../EventTypeDefs';\nimport { ROTATING } from '../constants';\nimport { radiansToDegrees } from '../util/misc/radiansDegreesConversion';\nimport { isLocked, NOT_ALLOWED_CURSOR } from './util';\nimport { wrapWithFireEvent } from './wrapWithFireEvent';\nimport { wrapWithFixedAnchor } from './wrapWithFixedAnchor';\n\n/**\n * Find the correct style for the control that is used for rotation.\n * this function is very simple and it just take care of not-allowed or standard cursor\n * @param {Event} eventData the javascript event that is causing the scale\n * @param {Control} control the control that is interested in the action\n * @param {FabricObject} fabricObject the fabric object that is interested in the action\n * @return {String} a valid css string for the cursor\n */\nexport const rotationStyleHandler: ControlCursorCallback = (\n eventData,\n control,\n fabricObject,\n) => {\n if (fabricObject.lockRotation) {\n return NOT_ALLOWED_CURSOR;\n }\n return control.cursorStyle;\n};\n\n/**\n * Action handler for rotation and snapping, without anchor point.\n * Needs to be wrapped with `wrapWithFixedAnchor` to be effective\n * @param {Event} eventData javascript event that is doing the transform\n * @param {Object} transform javascript object containing a series of information around the current transform\n * @param {number} x current mouse x position, canvas normalized\n * @param {number} y current mouse y position, canvas normalized\n * @return {Boolean} true if some change happened\n * @private\n */\nconst rotateObjectWithSnapping: TransformActionHandler = (\n eventData,\n { target, ex, ey, theta, originX, originY },\n x,\n y,\n) => {\n const pivotPoint = target.translateToOriginPoint(\n target.getRelativeCenterPoint(),\n originX,\n originY,\n );\n\n if (isLocked(target, 'lockRotation')) {\n return false;\n }\n\n const lastAngle = Math.atan2(ey - pivotPoint.y, ex - pivotPoint.x),\n curAngle = Math.atan2(y - pivotPoint.y, x - pivotPoint.x);\n let angle = radiansToDegrees(curAngle - lastAngle + theta);\n\n if (target.snapAngle && target.snapAngle > 0) {\n const snapAngle = target.snapAngle,\n snapThreshold = target.snapThreshold || snapAngle,\n rightAngleLocked = Math.ceil(angle / snapAngle) * snapAngle,\n leftAngleLocked = Math.floor(angle / snapAngle) * snapAngle;\n\n if (Math.abs(angle - leftAngleLocked) < snapThreshold) {\n angle = leftAngleLocked;\n } else if (Math.abs(angle - rightAngleLocked) < snapThreshold) {\n angle = rightAngleLocked;\n }\n }\n\n // normalize angle to positive value\n if (angle < 0) {\n angle = 360 + angle;\n }\n angle %= 360;\n\n const hasRotated = target.angle !== angle;\n // TODO: why aren't we using set?\n target.angle = angle;\n return hasRotated;\n};\n\nexport const rotationWithSnapping = wrapWithFireEvent(\n ROTATING,\n wrapWithFixedAnchor(rotateObjectWithSnapping),\n);\n","import type {\n ControlCursorCallback,\n TPointerEvent,\n Transform,\n TransformActionHandler,\n} from '../EventTypeDefs';\nimport type { FabricObject } from '../shapes/Object/FabricObject';\nimport type { TAxis } from '../typedefs';\nimport type { Canvas } from '../canvas/Canvas';\nimport {\n findCornerQuadrant,\n getLocalPoint,\n invertOrigin,\n isLocked,\n isTransformCentered,\n NOT_ALLOWED_CURSOR,\n} from './util';\nimport { wrapWithFireEvent } from './wrapWithFireEvent';\nimport { wrapWithFixedAnchor } from './wrapWithFixedAnchor';\nimport { SCALE_X, SCALE_Y, SCALING } from '../constants';\n\ntype ScaleTransform = Transform & {\n gestureScale?: number;\n signX?: number;\n signY?: number;\n};\n\ntype ScaleBy = TAxis | 'equally' | '' | undefined;\n\n/**\n * Inspect event and fabricObject properties to understand if the scaling action\n * @param {Event} eventData from the user action\n * @param {FabricObject} fabricObject the fabric object about to scale\n * @return {Boolean} true if scale is proportional\n */\nexport function scaleIsProportional(\n eventData: TPointerEvent,\n fabricObject: FabricObject,\n): boolean {\n const canvas = fabricObject.canvas as Canvas,\n uniformIsToggled = eventData[canvas.uniScaleKey!];\n return (\n (canvas.uniformScaling && !uniformIsToggled) ||\n (!canvas.uniformScaling && uniformIsToggled)\n );\n}\n\n/**\n * Inspect fabricObject to understand if the current scaling action is allowed\n * @param {FabricObject} fabricObject the fabric object about to scale\n * @param {String} by 'x' or 'y' or ''\n * @param {Boolean} scaleProportionally true if we are trying to scale proportionally\n * @return {Boolean} true if scaling is not allowed at current conditions\n */\nexport function scalingIsForbidden(\n fabricObject: FabricObject,\n by: ScaleBy,\n scaleProportionally: boolean,\n) {\n const lockX = isLocked(fabricObject, 'lockScalingX'),\n lockY = isLocked(fabricObject, 'lockScalingY');\n if (lockX && lockY) {\n return true;\n }\n if (!by && (lockX || lockY) && scaleProportionally) {\n return true;\n }\n if (lockX && by === 'x') {\n return true;\n }\n if (lockY && by === 'y') {\n return true;\n }\n // code crashes because of a division by 0 if a 0 sized object is scaled\n // forbid to prevent scaling to happen. ISSUE-9475\n const { width, height, strokeWidth } = fabricObject;\n if (width === 0 && strokeWidth === 0 && by !== 'y') {\n return true;\n }\n if (height === 0 && strokeWidth === 0 && by !== 'x') {\n return true;\n }\n return false;\n}\n\nconst scaleMap = ['e', 'se', 's', 'sw', 'w', 'nw', 'n', 'ne', 'e'];\n\n/**\n * return the correct cursor style for the scale action\n * @param {Event} eventData the javascript event that is causing the scale\n * @param {Control} control the control that is interested in the action\n * @param {FabricObject} fabricObject the fabric object that is interested in the action\n * @return {String} a valid css string for the cursor\n */\nexport const scaleCursorStyleHandler: ControlCursorCallback = (\n eventData,\n control,\n fabricObject,\n coord,\n) => {\n const scaleProportionally = scaleIsProportional(eventData, fabricObject),\n by =\n control.x !== 0 && control.y === 0\n ? 'x'\n : control.x === 0 && control.y !== 0\n ? 'y'\n : '';\n if (scalingIsForbidden(fabricObject, by, scaleProportionally)) {\n return NOT_ALLOWED_CURSOR;\n }\n const n = findCornerQuadrant(fabricObject, control, coord);\n return `${scaleMap[n]}-resize`;\n};\n\n/**\n * Basic scaling logic, reused with different constrain for scaling X,Y, freely or equally.\n * Needs to be wrapped with `wrapWithFixedAnchor` to be effective\n * @param {Event} eventData javascript event that is doing the transform\n * @param {Object} transform javascript object containing a series of information around the current transform\n * @param {number} x current mouse x position, canvas normalized\n * @param {number} y current mouse y position, canvas normalized\n * @param {Object} options additional information for scaling\n * @param {String} options.by 'x', 'y', 'equally' or '' to indicate type of scaling\n * @return {Boolean} true if some change happened\n * @private\n */\nfunction scaleObject(\n eventData: TPointerEvent,\n transform: ScaleTransform,\n x: number,\n y: number,\n options: { by?: ScaleBy } = {},\n) {\n const target = transform.target,\n by = options.by,\n scaleProportionally = scaleIsProportional(eventData, target),\n forbidScaling = scalingIsForbidden(target, by, scaleProportionally);\n let newPoint, scaleX, scaleY, dim, signX, signY;\n\n if (forbidScaling) {\n return false;\n }\n if (transform.gestureScale) {\n scaleX = transform.scaleX * transform.gestureScale;\n scaleY = transform.scaleY * transform.gestureScale;\n } else {\n newPoint = getLocalPoint(\n transform,\n transform.originX,\n transform.originY,\n x,\n y,\n );\n // use of sign: We use sign to detect change of direction of an action. sign usually change when\n // we cross the origin point with the mouse. So a scale flip for example. There is an issue when scaling\n // by center and scaling using one middle control ( default: mr, mt, ml, mb), the mouse movement can easily\n // cross many time the origin point and flip the object. so we need a way to filter out the noise.\n // This ternary here should be ok to filter out X scaling when we want Y only and vice versa.\n signX = by !== 'y' ? Math.sign(newPoint.x || transform.signX || 1) : 1;\n signY = by !== 'x' ? Math.sign(newPoint.y || transform.signY || 1) : 1;\n if (!transform.signX) {\n transform.signX = signX;\n }\n if (!transform.signY) {\n transform.signY = signY;\n }\n\n if (\n isLocked(target, 'lockScalingFlip') &&\n (transform.signX !== signX || transform.signY !== signY)\n ) {\n return false;\n }\n\n dim = target._getTransformedDimensions();\n // missing detection of flip and logic to switch the origin\n if (scaleProportionally && !by) {\n // uniform scaling\n const distance = Math.abs(newPoint.x) + Math.abs(newPoint.y),\n { original } = transform,\n originalDistance =\n Math.abs((dim.x * original.scaleX) / target.scaleX) +\n Math.abs((dim.y * original.scaleY) / target.scaleY),\n scale = distance / originalDistance;\n scaleX = original.scaleX * scale;\n scaleY = original.scaleY * scale;\n } else {\n scaleX = Math.abs((newPoint.x * target.scaleX) / dim.x);\n scaleY = Math.abs((newPoint.y * target.scaleY) / dim.y);\n }\n // if we are scaling by center, we need to double the scale\n if (isTransformCentered(transform)) {\n scaleX *= 2;\n scaleY *= 2;\n }\n if (transform.signX !== signX && by !== 'y') {\n transform.originX = invertOrigin(transform.originX);\n scaleX *= -1;\n transform.signX = signX;\n }\n if (transform.signY !== signY && by !== 'x') {\n transform.originY = invertOrigin(transform.originY);\n scaleY *= -1;\n transform.signY = signY;\n }\n }\n // minScale is taken care of in the setter.\n const oldScaleX = target.scaleX,\n oldScaleY = target.scaleY;\n if (!by) {\n !isLocked(target, 'lockScalingX') && target.set(SCALE_X, scaleX);\n !isLocked(target, 'lockScalingY') && target.set(SCALE_Y, scaleY);\n } else {\n // forbidden cases already handled on top here.\n by === 'x' && target.set(SCALE_X, scaleX);\n by === 'y' && target.set(SCALE_Y, scaleY);\n }\n return oldScaleX !== target.scaleX || oldScaleY !== target.scaleY;\n}\n\n/**\n * Generic scaling logic, to scale from corners either equally or freely.\n * Needs to be wrapped with `wrapWithFixedAnchor` to be effective\n * @param {Event} eventData javascript event that is doing the transform\n * @param {Object} transform javascript object containing a series of information around the current transform\n * @param {number} x current mouse x position, canvas normalized\n * @param {number} y current mouse y position, canvas normalized\n * @return {Boolean} true if some change happened\n */\nexport const scaleObjectFromCorner: TransformActionHandler = (\n eventData,\n transform,\n x,\n y,\n) => {\n return scaleObject(eventData, transform, x, y);\n};\n\n/**\n * Scaling logic for the X axis.\n * Needs to be wrapped with `wrapWithFixedAnchor` to be effective\n * @param {Event} eventData javascript event that is doing the transform\n * @param {Object} transform javascript object containing a series of information around the current transform\n * @param {number} x current mouse x position, canvas normalized\n * @param {number} y current mouse y position, canvas normalized\n * @return {Boolean} true if some change happened\n */\nconst scaleObjectX: TransformActionHandler = (\n eventData,\n transform,\n x,\n y,\n) => {\n return scaleObject(eventData, transform, x, y, { by: 'x' });\n};\n\n/**\n * Scaling logic for the Y axis.\n * Needs to be wrapped with `wrapWithFixedAnchor` to be effective\n * @param {Event} eventData javascript event that is doing the transform\n * @param {Object} transform javascript object containing a series of information around the current transform\n * @param {number} x current mouse x position, canvas normalized\n * @param {number} y current mouse y position, canvas normalized\n * @return {Boolean} true if some change happened\n */\nconst scaleObjectY: TransformActionHandler = (\n eventData,\n transform,\n x,\n y,\n) => {\n return scaleObject(eventData, transform, x, y, { by: 'y' });\n};\n\nexport const scalingEqually = wrapWithFireEvent(\n SCALING,\n wrapWithFixedAnchor(scaleObjectFromCorner),\n);\n\nexport const scalingX = wrapWithFireEvent(\n SCALING,\n wrapWithFixedAnchor(scaleObjectX),\n);\n\nexport const scalingY = wrapWithFireEvent(\n SCALING,\n wrapWithFixedAnchor(scaleObjectY),\n);\n","import type {\n ControlCursorCallback,\n TPointerEvent,\n Transform,\n TransformActionHandler,\n} from '../EventTypeDefs';\nimport { resolveOrigin } from '../util/misc/resolveOrigin';\nimport { Point } from '../Point';\nimport type { TAxis, TAxisKey } from '../typedefs';\nimport {\n degreesToRadians,\n radiansToDegrees,\n} from '../util/misc/radiansDegreesConversion';\nimport {\n findCornerQuadrant,\n getLocalPoint,\n isLocked,\n NOT_ALLOWED_CURSOR,\n} from './util';\nimport { wrapWithFireEvent } from './wrapWithFireEvent';\nimport { wrapWithFixedAnchor } from './wrapWithFixedAnchor';\nimport {\n CENTER,\n SCALE_X,\n SCALE_Y,\n SKEWING,\n SKEW_X,\n SKEW_Y,\n} from '../constants';\n\nexport type SkewTransform = Transform & { skewingSide: -1 | 1 };\n\nconst AXIS_KEYS: Record<\n TAxis,\n {\n counterAxis: TAxis;\n scale: TAxisKey<'scale'>;\n skew: TAxisKey<'skew'>;\n lockSkewing: TAxisKey<'lockSkewing'>;\n origin: TAxisKey<'origin'>;\n flip: TAxisKey<'flip'>;\n }\n> = {\n x: {\n counterAxis: 'y',\n scale: SCALE_X,\n skew: SKEW_X,\n lockSkewing: 'lockSkewingX',\n origin: 'originX',\n flip: 'flipX',\n },\n y: {\n counterAxis: 'x',\n scale: SCALE_Y,\n skew: SKEW_Y,\n lockSkewing: 'lockSkewingY',\n origin: 'originY',\n flip: 'flipY',\n },\n};\n\nconst skewMap = ['ns', 'nesw', 'ew', 'nwse'];\n\n/**\n * return the correct cursor style for the skew action\n * @param {Event} eventData the javascript event that is causing the scale\n * @param {Control} control the control that is interested in the action\n * @param {FabricObject} fabricObject the fabric object that is interested in the action\n * @return {String} a valid css string for the cursor\n */\nexport const skewCursorStyleHandler: ControlCursorCallback = (\n eventData,\n control,\n fabricObject,\n coord,\n) => {\n if (control.x !== 0 && isLocked(fabricObject, 'lockSkewingY')) {\n return NOT_ALLOWED_CURSOR;\n }\n if (control.y !== 0 && isLocked(fabricObject, 'lockSkewingX')) {\n return NOT_ALLOWED_CURSOR;\n }\n const n = findCornerQuadrant(fabricObject, control, coord) % 4;\n return `${skewMap[n]}-resize`;\n};\n\n/**\n * Since skewing is applied before scaling, calculations are done in a scaleless plane\n * @see https://github.com/fabricjs/fabric.js/pull/8380\n */\nfunction skewObject(\n axis: TAxis,\n { target, ex, ey, skewingSide, ...transform }: SkewTransform,\n pointer: Point,\n) {\n const { skew: skewKey } = AXIS_KEYS[axis],\n offset = pointer\n .subtract(new Point(ex, ey))\n .divide(new Point(target.scaleX, target.scaleY))[axis],\n skewingBefore = target[skewKey],\n skewingStart = transform[skewKey],\n shearingStart = Math.tan(degreesToRadians(skewingStart)),\n // let a, b be the size of target\n // let a' be the value of a after applying skewing\n // then:\n // a' = a + b * skewA => skewA = (a' - a) / b\n // the value b is tricky since skewY is applied before skewX\n b =\n axis === 'y'\n ? target._getTransformedDimensions({\n scaleX: 1,\n scaleY: 1,\n // since skewY is applied before skewX, b (=width) is not affected by skewX\n skewX: 0,\n }).x\n : target._getTransformedDimensions({\n scaleX: 1,\n scaleY: 1,\n }).y;\n\n const shearing =\n (2 * offset * skewingSide) /\n // we max out fractions to safeguard from asymptotic behavior\n Math.max(b, 1) +\n // add starting state\n shearingStart;\n\n const skewing = radiansToDegrees(Math.atan(shearing));\n\n target.set(skewKey, skewing);\n const changed = skewingBefore !== target[skewKey];\n\n if (changed && axis === 'y') {\n // we don't want skewing to affect scaleX\n // so we factor it by the inverse skewing diff to make it seem unchanged to the viewer\n const { skewX, scaleX } = target,\n dimBefore = target._getTransformedDimensions({ skewY: skewingBefore }),\n dimAfter = target._getTransformedDimensions(),\n compensationFactor = skewX !== 0 ? dimBefore.x / dimAfter.x : 1;\n compensationFactor !== 1 &&\n target.set(SCALE_X, compensationFactor * scaleX);\n }\n\n return changed;\n}\n\n/**\n * Wrapped Action handler for skewing on a given axis, takes care of the\n * skew direction and determines the correct transform origin for the anchor point\n * @param {Event} eventData javascript event that is doing the transform\n * @param {Object} transform javascript object containing a series of information around the current transform\n * @param {number} x current mouse x position, canvas normalized\n * @param {number} y current mouse y position, canvas normalized\n * @return {Boolean} true if some change happened\n */\nfunction skewHandler(\n axis: TAxis,\n eventData: TPointerEvent,\n transform: Transform,\n x: number,\n y: number,\n) {\n const { target } = transform,\n {\n counterAxis,\n origin: originKey,\n lockSkewing: lockSkewingKey,\n skew: skewKey,\n flip: flipKey,\n } = AXIS_KEYS[axis];\n if (isLocked(target, lockSkewingKey)) {\n return false;\n }\n\n const { origin: counterOriginKey, flip: counterFlipKey } =\n AXIS_KEYS[counterAxis],\n counterOriginFactor =\n resolveOrigin(transform[counterOriginKey]) *\n (target[counterFlipKey] ? -1 : 1),\n // if the counter origin is top/left (= -0.5) then we are skewing x/y values on the bottom/right side of target respectively.\n // if the counter origin is bottom/right (= 0.5) then we are skewing x/y values on the top/left side of target respectively.\n // skewing direction on the top/left side of target is OPPOSITE to the direction of the movement of the pointer,\n // so we factor skewing direction by this value.\n skewingSide = (-Math.sign(counterOriginFactor) *\n (target[flipKey] ? -1 : 1)) as 1 | -1,\n skewingDirection =\n ((target[skewKey] === 0 &&\n // in case skewing equals 0 we use the pointer offset from target center to determine the direction of skewing\n getLocalPoint(transform, CENTER, CENTER, x, y)[axis] > 0) ||\n // in case target has skewing we use that as the direction\n target[skewKey] > 0\n ? 1\n : -1) * skewingSide,\n // anchor to the opposite side of the skewing direction\n // normalize value from [-1, 1] to origin value [0, 1]\n origin = -skewingDirection * 0.5 + 0.5;\n\n const finalHandler = wrapWithFireEvent(\n SKEWING,\n wrapWithFixedAnchor((eventData, transform, x, y) =>\n skewObject(axis, transform, new Point(x, y)),\n ),\n );\n\n return finalHandler(\n eventData,\n {\n ...transform,\n [originKey]: origin,\n skewingSide,\n },\n x,\n y,\n );\n}\n\n/**\n * Wrapped Action handler for skewing on the X axis, takes care of the\n * skew direction and determines the correct transform origin for the anchor point\n * @param {Event} eventData javascript event that is doing the transform\n * @param {Object} transform javascript object containing a series of information around the current transform\n * @param {number} x current mouse x position, canvas normalized\n * @param {number} y current mouse y position, canvas normalized\n * @return {Boolean} true if some change happened\n */\nexport const skewHandlerX: TransformActionHandler = (\n eventData,\n transform,\n x,\n y,\n) => {\n return skewHandler('x', eventData, transform, x, y);\n};\n\n/**\n * Wrapped Action handler for skewing on the Y axis, takes care of the\n * skew direction and determines the correct transform origin for the anchor point\n * @param {Event} eventData javascript event that is doing the transform\n * @param {Object} transform javascript object containing a series of information around the current transform\n * @param {number} x current mouse x position, canvas normalized\n * @param {number} y current mouse y position, canvas normalized\n * @return {Boolean} true if some change happened\n */\nexport const skewHandlerY: TransformActionHandler = (\n eventData,\n transform,\n x,\n y,\n) => {\n return skewHandler('y', eventData, transform, x, y);\n};\n","import type {\n ControlCallback,\n ControlCursorCallback,\n TPointerEvent,\n TransformActionHandler,\n} from '../EventTypeDefs';\nimport { SCALE_X, SCALE_Y, SKEW_X, SKEW_Y } from '../constants';\nimport type { FabricObject } from '../shapes/Object/FabricObject';\nimport type { TAxisKey } from '../typedefs';\nimport { scaleCursorStyleHandler, scalingX, scalingY } from './scale';\nimport { skewCursorStyleHandler, skewHandlerX, skewHandlerY } from './skew';\n\nfunction isAltAction(eventData: TPointerEvent, target: FabricObject) {\n return eventData[target.canvas!.altActionKey!];\n}\n\n/**\n * Inspect event, control and fabricObject to return the correct action name\n * @param {Event} eventData the javascript event that is causing the scale\n * @param {Control} control the control that is interested in the action\n * @param {FabricObject} fabricObject the fabric object that is interested in the action\n * @return {String} an action name\n */\nexport const scaleOrSkewActionName: ControlCallback<\n TAxisKey<'skew' | 'scale'> | ''\n> = (eventData, control, fabricObject) => {\n const isAlternative = isAltAction(eventData, fabricObject);\n if (control.x === 0) {\n // then is scaleY or skewX\n return isAlternative ? SKEW_X : SCALE_Y;\n }\n if (control.y === 0) {\n // then is scaleY or skewX\n return isAlternative ? SKEW_Y : SCALE_X;\n }\n return '';\n};\n\n/**\n * Combine skew and scale style handlers to cover fabric standard use case\n * @param {Event} eventData the javascript event that is causing the scale\n * @param {Control} control the control that is interested in the action\n * @param {FabricObject} fabricObject the fabric object that is interested in the action\n * @return {String} a valid css string for the cursor\n */\nexport const scaleSkewCursorStyleHandler: ControlCursorCallback = (\n eventData,\n control,\n fabricObject,\n coord,\n) => {\n return isAltAction(eventData, fabricObject)\n ? skewCursorStyleHandler(eventData, control, fabricObject, coord)\n : scaleCursorStyleHandler(eventData, control, fabricObject, coord);\n};\n/**\n * Composed action handler to either scale X or skew Y\n * Needs to be wrapped with `wrapWithFixedAnchor` to be effective\n * @param {Event} eventData javascript event that is doing the transform\n * @param {Object} transform javascript object containing a series of information around the current transform\n * @param {number} x current mouse x position, canvas normalized\n * @param {number} y current mouse y position, canvas normalized\n * @return {Boolean} true if some change happened\n */\nexport const scalingXOrSkewingY: TransformActionHandler = (\n eventData,\n transform,\n x,\n y,\n) => {\n return isAltAction(eventData, transform.target)\n ? skewHandlerY(eventData, transform, x, y)\n : scalingX(eventData, transform, x, y);\n};\n\n/**\n * Composed action handler to either scale Y or skew X\n * Needs to be wrapped with `wrapWithFixedAnchor` to be effective\n * @param {Event} eventData javascript event that is doing the transform\n * @param {Object} transform javascript object containing a series of information around the current transform\n * @param {number} x current mouse x position, canvas normalized\n * @param {number} y current mouse y position, canvas normalized\n * @return {Boolean} true if some change happened\n */\nexport const scalingYOrSkewingX: TransformActionHandler = (\n eventData,\n transform,\n x,\n y,\n) => {\n return isAltAction(eventData, transform.target)\n ? skewHandlerX(eventData, transform, x, y)\n : scalingY(eventData, transform, x, y);\n};\n","import { RESIZING, ROTATE } from '../constants';\nimport { changeWidth } from './changeWidth';\nimport { Control } from './Control';\nimport { rotationStyleHandler, rotationWithSnapping } from './rotate';\nimport { scaleCursorStyleHandler, scalingEqually } from './scale';\nimport {\n scaleOrSkewActionName,\n scaleSkewCursorStyleHandler,\n scalingXOrSkewingY,\n scalingYOrSkewingX,\n} from './scaleSkew';\n\n// use this function if you want to generate new controls for every instance\nexport const createObjectDefaultControls = () => ({\n ml: new Control({\n x: -0.5,\n y: 0,\n cursorStyleHandler: scaleSkewCursorStyleHandler,\n actionHandler: scalingXOrSkewingY,\n getActionName: scaleOrSkewActionName,\n }),\n\n mr: new Control({\n x: 0.5,\n y: 0,\n cursorStyleHandler: scaleSkewCursorStyleHandler,\n actionHandler: scalingXOrSkewingY,\n getActionName: scaleOrSkewActionName,\n }),\n\n mb: new Control({\n x: 0,\n y: 0.5,\n cursorStyleHandler: scaleSkewCursorStyleHandler,\n actionHandler: scalingYOrSkewingX,\n getActionName: scaleOrSkewActionName,\n }),\n\n mt: new Control({\n x: 0,\n y: -0.5,\n cursorStyleHandler: scaleSkewCursorStyleHandler,\n actionHandler: scalingYOrSkewingX,\n getActionName: scaleOrSkewActionName,\n }),\n\n tl: new Control({\n x: -0.5,\n y: -0.5,\n cursorStyleHandler: scaleCursorStyleHandler,\n actionHandler: scalingEqually,\n }),\n\n tr: new Control({\n x: 0.5,\n y: -0.5,\n cursorStyleHandler: scaleCursorStyleHandler,\n actionHandler: scalingEqually,\n }),\n\n bl: new Control({\n x: -0.5,\n y: 0.5,\n cursorStyleHandler: scaleCursorStyleHandler,\n actionHandler: scalingEqually,\n }),\n\n br: new Control({\n x: 0.5,\n y: 0.5,\n cursorStyleHandler: scaleCursorStyleHandler,\n actionHandler: scalingEqually,\n }),\n\n mtr: new Control({\n x: 0,\n y: -0.5,\n actionHandler: rotationWithSnapping,\n cursorStyleHandler: rotationStyleHandler,\n offsetY: -40,\n withConnection: true,\n actionName: ROTATE,\n }),\n});\n\nexport const createResizeControls = () => ({\n mr: new Control({\n x: 0.5,\n y: 0,\n actionHandler: changeWidth,\n cursorStyleHandler: scaleSkewCursorStyleHandler,\n actionName: RESIZING,\n }),\n ml: new Control({\n x: -0.5,\n y: 0,\n actionHandler: changeWidth,\n cursorStyleHandler: scaleSkewCursorStyleHandler,\n actionName: RESIZING,\n }),\n});\n\nexport const createTextboxDefaultControls = () => ({\n ...createObjectDefaultControls(),\n ...createResizeControls(),\n});\n","import { Point, ZERO } from '../../Point';\nimport type { TCornerPoint, TDegree } from '../../typedefs';\nimport { FabricObject } from './Object';\nimport { degreesToRadians } from '../../util/misc/radiansDegreesConversion';\nimport type { TQrDecomposeOut } from '../../util/misc/matrix';\nimport {\n calcDimensionsMatrix,\n createRotateMatrix,\n createTranslateMatrix,\n multiplyTransformMatrices,\n qrDecompose,\n} from '../../util/misc/matrix';\nimport type { Control } from '../../controls/Control';\nimport { sizeAfterTransform } from '../../util/misc/objectTransforms';\nimport type { ObjectEvents, TPointerEvent } from '../../EventTypeDefs';\nimport type { Canvas } from '../../canvas/Canvas';\nimport type { ControlRenderingStyleOverride } from '../../controls/controlRendering';\nimport type { FabricObjectProps } from './types/FabricObjectProps';\nimport type { TFabricObjectProps, SerializedObjectProps } from './types';\nimport { createObjectDefaultControls } from '../../controls/commonControls';\nimport { interactiveObjectDefaultValues } from './defaultValues';\nimport { SCALE } from '../../constants';\n\nexport type TOCoord = Point & {\n corner: TCornerPoint;\n touchCorner: TCornerPoint;\n};\n\nexport type TControlSet = Record;\n\nexport type TBorderRenderingStyleOverride = Partial<\n Pick\n>;\n\nexport type TStyleOverride = ControlRenderingStyleOverride &\n TBorderRenderingStyleOverride &\n Partial<\n Pick & {\n forActiveSelection: boolean;\n }\n >;\n\nexport class InteractiveFabricObject<\n Props extends TFabricObjectProps = Partial,\n SProps extends SerializedObjectProps = SerializedObjectProps,\n EventSpec extends ObjectEvents = ObjectEvents,\n >\n extends FabricObject\n implements FabricObjectProps\n{\n declare noScaleCache: boolean;\n\n declare snapAngle?: TDegree;\n declare snapThreshold?: TDegree;\n\n declare lockMovementX: boolean;\n declare lockMovementY: boolean;\n declare lockRotation: boolean;\n declare lockScalingX: boolean;\n declare lockScalingY: boolean;\n declare lockSkewingX: boolean;\n declare lockSkewingY: boolean;\n declare lockScalingFlip: boolean;\n\n declare cornerSize: number;\n declare touchCornerSize: number;\n declare transparentCorners: boolean;\n declare cornerColor: string;\n declare cornerStrokeColor: string;\n declare cornerStyle: 'rect' | 'circle';\n declare cornerDashArray: number[] | null;\n declare hasControls: boolean;\n\n declare borderColor: string;\n declare borderDashArray: number[] | null;\n declare borderOpacityWhenMoving: number;\n declare borderScaleFactor: number;\n declare hasBorders: boolean;\n declare selectionBackgroundColor: string;\n\n declare selectable: boolean;\n declare evented: boolean;\n declare perPixelTargetFind: boolean;\n declare activeOn: 'down' | 'up';\n\n declare hoverCursor: CSSStyleDeclaration['cursor'] | null;\n declare moveCursor: CSSStyleDeclaration['cursor'] | null;\n\n /**\n * The object's controls' position in viewport coordinates\n * Calculated by {@link Control#positionHandler} and {@link Control#calcCornerCoords}, depending on {@link padding}.\n * `corner/touchCorner` describe the 4 points forming the interactive area of the corner.\n * Used to draw and locate controls.\n */\n declare oCoords: Record;\n\n /**\n * keeps the value of the last hovered corner during mouse move.\n * 0 is no corner, or 'mt', 'ml', 'mtr' etc..\n * It should be private, but there is no harm in using it as\n * a read-only property.\n * this isn't cleaned automatically. Non selected objects may have wrong values\n * @type [string]\n */\n declare __corner?: string;\n\n /**\n * a map of control visibility for this object.\n * this was left when controls were introduced to not break the api too much\n * this takes priority over the generic control visibility\n */\n declare _controlsVisibility: Record;\n\n /**\n * holds the controls for the object.\n * controls are added by default_controls.js\n */\n declare controls: TControlSet;\n\n /**\n * internal boolean to signal the code that the object is\n * part of the move action.\n */\n declare isMoving?: boolean;\n\n /**\n * A boolean used from the gesture module to keep tracking of a scaling\n * action when there is no scaling transform in place.\n * This is an edge case and is used twice in all codebase.\n * Probably added to keep track of some performance issues\n * @TODO use git blame to investigate why it was added\n * DON'T USE IT. WE WILL TRY TO REMOVE IT\n */\n declare _scaling?: boolean;\n\n declare canvas?: Canvas;\n\n static ownDefaults = interactiveObjectDefaultValues;\n\n static getDefaults(): Record {\n return {\n ...super.getDefaults(),\n ...InteractiveFabricObject.ownDefaults,\n };\n }\n\n /**\n * Constructor\n * @param {Object} [options] Options object\n */\n constructor(options?: Props) {\n super();\n Object.assign(\n this,\n (this.constructor as typeof InteractiveFabricObject).createControls(),\n InteractiveFabricObject.ownDefaults,\n );\n this.setOptions(options);\n }\n\n /**\n * Creates the default control object.\n * If you prefer to have on instance of controls shared among all objects\n * make this function return an empty object and add controls to the ownDefaults\n * @param {Object} [options] Options object\n */\n static createControls(): { controls: Record } {\n return { controls: createObjectDefaultControls() };\n }\n\n /**\n * Update width and height of the canvas for cache\n * returns true or false if canvas needed resize.\n * @private\n * @return {Boolean} true if the canvas has been resized\n */\n _updateCacheCanvas() {\n const targetCanvas = this.canvas;\n if (this.noScaleCache && targetCanvas && targetCanvas._currentTransform) {\n const transform = targetCanvas._currentTransform,\n target = transform.target,\n action = transform.action;\n if (\n this === (target as unknown as this) &&\n action &&\n action.startsWith(SCALE)\n ) {\n return false;\n }\n }\n return super._updateCacheCanvas();\n }\n\n getActiveControl() {\n const key = this.__corner;\n return key\n ? {\n key,\n control: this.controls[key],\n coord: this.oCoords[key],\n }\n : undefined;\n }\n\n /**\n * Determines which corner is under the mouse cursor, represented by `pointer`.\n * This function returns a corner only if the object is the active one.\n * This is done to avoid selecting corner of non active object and activating transformations\n * rather than drag action. The default behavior of fabricJS is that if you want to transform\n * an object, first you select it to show the control set\n * @private\n * @param {Object} pointer The pointer indicating the mouse position\n * @param {boolean} forTouch indicates if we are looking for interaction area with a touch action\n * @return {String|Boolean} corner code (tl, tr, bl, br, etc.), or 0 if nothing is found.\n */\n findControl(\n pointer: Point,\n forTouch = false,\n ): { key: string; control: Control; coord: TOCoord } | undefined {\n if (!this.hasControls || !this.canvas) {\n return undefined;\n }\n\n this.__corner = undefined;\n const cornerEntries = Object.entries(this.oCoords);\n for (let i = cornerEntries.length - 1; i >= 0; i--) {\n const [key, corner] = cornerEntries[i];\n const control = this.controls[key];\n\n if (\n control.shouldActivate(\n key,\n this,\n pointer,\n forTouch ? corner.touchCorner : corner.corner,\n )\n ) {\n // this.canvas.contextTop.fillRect(pointer.x - 1, pointer.y - 1, 2, 2);\n this.__corner = key;\n\n return { key, control, coord: this.oCoords[key] };\n }\n }\n\n return undefined;\n }\n\n /**\n * Calculates the coordinates of the center of each control plus the corners of the control itself\n * This basically just delegates to each control positionHandler\n * WARNING: changing what is passed to positionHandler is a breaking change, since position handler\n * is a public api and should be done just if extremely necessary\n * @return {Record}\n */\n calcOCoords(): Record {\n const vpt = this.getViewportTransform(),\n center = this.getCenterPoint(),\n tMatrix = createTranslateMatrix(center.x, center.y),\n rMatrix = createRotateMatrix({\n angle: this.getTotalAngle() - (!!this.group && this.flipX ? 180 : 0),\n }),\n positionMatrix = multiplyTransformMatrices(tMatrix, rMatrix),\n startMatrix = multiplyTransformMatrices(vpt, positionMatrix),\n finalMatrix = multiplyTransformMatrices(startMatrix, [\n 1 / vpt[0],\n 0,\n 0,\n 1 / vpt[3],\n 0,\n 0,\n ]),\n transformOptions = this.group\n ? qrDecompose(this.calcTransformMatrix())\n : undefined;\n // decomposing could bring negative scaling and `_calculateCurrentDimensions` can't take it\n if (transformOptions) {\n transformOptions.scaleX = Math.abs(transformOptions.scaleX);\n transformOptions.scaleY = Math.abs(transformOptions.scaleY);\n }\n const dim = this._calculateCurrentDimensions(transformOptions),\n coords: Record = {};\n\n this.forEachControl((control, key) => {\n const position = control.positionHandler(dim, finalMatrix, this, control);\n // coords[key] are sometimes used as points. Those are points to which we add\n // the property corner and touchCorner from `_calcCornerCoords`.\n // don't remove this assign for an object spread.\n coords[key] = Object.assign(\n position,\n this._calcCornerCoords(control, position),\n );\n });\n\n // debug code\n /*\n const canvas = this.canvas;\n setTimeout(function () {\n if (!canvas) return;\n canvas.contextTop.clearRect(0, 0, 700, 700);\n canvas.contextTop.fillStyle = 'green';\n Object.keys(coords).forEach(function(key) {\n const control = coords[key];\n canvas.contextTop.fillRect(control.x, control.y, 3, 3);\n });\n } 50);\n */\n return coords;\n }\n\n /**\n * Sets the coordinates that determine the interaction area of each control\n * note: if we would switch to ROUND corner area, all of this would disappear.\n * everything would resolve to a single point and a pythagorean theorem for the distance\n * @todo evaluate simplification of code switching to circle interaction area at runtime\n * @private\n */\n private _calcCornerCoords(control: Control, position: Point) {\n const angle = this.getTotalAngle();\n const corner = control.calcCornerCoords(\n angle,\n this.cornerSize,\n position.x,\n position.y,\n false,\n this,\n );\n const touchCorner = control.calcCornerCoords(\n angle,\n this.touchCornerSize,\n position.x,\n position.y,\n true,\n this,\n );\n return { corner, touchCorner };\n }\n\n /**\n * @override set controls' coordinates as well\n * See {@link https://github.com/fabricjs/fabric.js/wiki/When-to-call-setCoords} and {@link http://fabricjs.com/fabric-gotchas}\n * @return {void}\n */\n setCoords(): void {\n super.setCoords();\n this.canvas && (this.oCoords = this.calcOCoords());\n }\n\n /**\n * Calls a function for each control. The function gets called,\n * with the control, the control's key and the object that is calling the iterator\n * @param {Function} fn function to iterate over the controls over\n */\n forEachControl(\n fn: (\n control: Control,\n key: string,\n fabricObject: InteractiveFabricObject,\n ) => any,\n ) {\n for (const i in this.controls) {\n fn(this.controls[i], i, this);\n }\n }\n\n /**\n * Draws a colored layer behind the object, inside its selection borders.\n * Requires public options: padding, selectionBackgroundColor\n * this function is called when the context is transformed\n * has checks to be skipped when the object is on a staticCanvas\n * @todo evaluate if make this disappear in favor of a pre-render hook for objects\n * this was added by Andrea Bogazzi to make possible some feature for work reasons\n * it seemed a good option, now is an edge case\n * @param {CanvasRenderingContext2D} ctx Context to draw on\n */\n drawSelectionBackground(ctx: CanvasRenderingContext2D): void {\n if (\n !this.selectionBackgroundColor ||\n (this.canvas && (this.canvas._activeObject as unknown as this) !== this)\n ) {\n return;\n }\n ctx.save();\n const center = this.getRelativeCenterPoint(),\n wh = this._calculateCurrentDimensions(),\n vpt = this.getViewportTransform();\n ctx.translate(center.x, center.y);\n ctx.scale(1 / vpt[0], 1 / vpt[3]);\n ctx.rotate(degreesToRadians(this.angle));\n ctx.fillStyle = this.selectionBackgroundColor;\n ctx.fillRect(-wh.x / 2, -wh.y / 2, wh.x, wh.y);\n ctx.restore();\n }\n\n /**\n * @public override this function in order to customize the drawing of the control box, e.g. rounded corners, different border style.\n * @param {CanvasRenderingContext2D} ctx ctx is rotated and translated so that (0,0) is at object's center\n * @param {Point} size the control box size used\n */\n strokeBorders(ctx: CanvasRenderingContext2D, size: Point): void {\n ctx.strokeRect(-size.x / 2, -size.y / 2, size.x, size.y);\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to draw on\n * @param {Point} size\n * @param {TStyleOverride} styleOverride object to override the object style\n */\n _drawBorders(\n ctx: CanvasRenderingContext2D,\n size: Point,\n styleOverride: TStyleOverride = {},\n ): void {\n const options = {\n hasControls: this.hasControls,\n borderColor: this.borderColor,\n borderDashArray: this.borderDashArray,\n ...styleOverride,\n };\n ctx.save();\n ctx.strokeStyle = options.borderColor;\n this._setLineDash(ctx, options.borderDashArray);\n this.strokeBorders(ctx, size);\n options.hasControls && this.drawControlsConnectingLines(ctx, size);\n ctx.restore();\n }\n\n /**\n * Renders controls and borders for the object\n * the context here is not transformed\n * @todo move to interactivity\n * @param {CanvasRenderingContext2D} ctx Context to render on\n * @param {TStyleOverride} [styleOverride] properties to override the object style\n */\n _renderControls(\n ctx: CanvasRenderingContext2D,\n styleOverride: TStyleOverride = {},\n ) {\n const { hasBorders, hasControls } = this;\n const styleOptions = {\n hasBorders,\n hasControls,\n ...styleOverride,\n };\n const vpt = this.getViewportTransform(),\n shouldDrawBorders = styleOptions.hasBorders,\n shouldDrawControls = styleOptions.hasControls;\n const matrix = multiplyTransformMatrices(vpt, this.calcTransformMatrix());\n const options = qrDecompose(matrix);\n ctx.save();\n ctx.translate(options.translateX, options.translateY);\n ctx.lineWidth = this.borderScaleFactor; // 1 * this.borderScaleFactor;\n // since interactive groups have been introduced, an object could be inside a group and needing controls\n // the following equality check `this.group === this.parent` covers:\n // object without a group ( undefined === undefined )\n // object inside a group\n // excludes object inside a group but multi selected since group and parent will differ in value\n if (this.group === this.parent) {\n ctx.globalAlpha = this.isMoving ? this.borderOpacityWhenMoving : 1;\n }\n if (this.flipX) {\n options.angle -= 180;\n }\n ctx.rotate(degreesToRadians(this.group ? options.angle : this.angle));\n shouldDrawBorders && this.drawBorders(ctx, options, styleOverride);\n shouldDrawControls && this.drawControls(ctx, styleOverride);\n ctx.restore();\n }\n\n /**\n * Draws borders of an object's bounding box.\n * Requires public properties: width, height\n * Requires public options: padding, borderColor\n * @param {CanvasRenderingContext2D} ctx Context to draw on\n * @param {object} options object representing current object parameters\n * @param {TStyleOverride} [styleOverride] object to override the object style\n */\n drawBorders(\n ctx: CanvasRenderingContext2D,\n options: TQrDecomposeOut,\n styleOverride: TStyleOverride,\n ): void {\n let size;\n if ((styleOverride && styleOverride.forActiveSelection) || this.group) {\n const bbox = sizeAfterTransform(\n this.width,\n this.height,\n calcDimensionsMatrix(options),\n ),\n stroke = !this.isStrokeAccountedForInDimensions()\n ? (this.strokeUniform\n ? new Point().scalarAdd(this.canvas ? this.canvas.getZoom() : 1)\n : // this is extremely confusing. options comes from the upper function\n // and is the qrDecompose of a matrix that takes in account zoom too\n new Point(options.scaleX, options.scaleY)\n ).scalarMultiply(this.strokeWidth)\n : ZERO;\n size = bbox\n .add(stroke)\n .scalarAdd(this.borderScaleFactor)\n .scalarAdd(this.padding * 2);\n } else {\n size = this._calculateCurrentDimensions().scalarAdd(\n this.borderScaleFactor,\n );\n }\n this._drawBorders(ctx, size, styleOverride);\n }\n\n /**\n * Draws lines from a borders of an object's bounding box to controls that have `withConnection` property set.\n * Requires public properties: width, height\n * Requires public options: padding, borderColor\n * @param {CanvasRenderingContext2D} ctx Context to draw on\n * @param {Point} size object size x = width, y = height\n */\n drawControlsConnectingLines(\n ctx: CanvasRenderingContext2D,\n size: Point,\n ): void {\n let shouldStroke = false;\n\n ctx.beginPath();\n this.forEachControl((control, key) => {\n // in this moment, the ctx is centered on the object.\n // width and height of the above function are the size of the bbox.\n if (control.withConnection && control.getVisibility(this, key)) {\n // reset movement for each control\n shouldStroke = true;\n ctx.moveTo(control.x * size.x, control.y * size.y);\n ctx.lineTo(\n control.x * size.x + control.offsetX,\n control.y * size.y + control.offsetY,\n );\n }\n });\n shouldStroke && ctx.stroke();\n }\n\n /**\n * Draws corners of an object's bounding box.\n * Requires public properties: width, height\n * Requires public options: cornerSize, padding\n * Be aware that since fabric 6.0 this function does not call setCoords anymore.\n * setCoords needs to be called manually if the object of which we are rendering controls\n * is outside the standard selection and transform process.\n * @param {CanvasRenderingContext2D} ctx Context to draw on\n * @param {ControlRenderingStyleOverride} styleOverride object to override the object style\n */\n drawControls(\n ctx: CanvasRenderingContext2D,\n styleOverride: ControlRenderingStyleOverride = {},\n ) {\n ctx.save();\n const retinaScaling = this.getCanvasRetinaScaling();\n const { cornerStrokeColor, cornerDashArray, cornerColor } = this;\n const options = {\n cornerStrokeColor,\n cornerDashArray,\n cornerColor,\n ...styleOverride,\n };\n ctx.setTransform(retinaScaling, 0, 0, retinaScaling, 0, 0);\n ctx.strokeStyle = ctx.fillStyle = options.cornerColor;\n if (!this.transparentCorners) {\n ctx.strokeStyle = options.cornerStrokeColor;\n }\n this._setLineDash(ctx, options.cornerDashArray);\n this.forEachControl((control, key) => {\n if (control.getVisibility(this, key)) {\n const p = this.oCoords[key];\n control.render(ctx, p.x, p.y, options, this);\n }\n });\n ctx.restore();\n }\n\n /**\n * Returns true if the specified control is visible, false otherwise.\n * @param {string} controlKey The key of the control. Possible values are usually 'tl', 'tr', 'br', 'bl', 'ml', 'mt', 'mr', 'mb', 'mtr',\n * but since the control api allow for any control name, can be any string.\n * @returns {boolean} true if the specified control is visible, false otherwise\n */\n isControlVisible(controlKey: string): boolean {\n return (\n this.controls[controlKey] &&\n this.controls[controlKey].getVisibility(this, controlKey)\n );\n }\n\n /**\n * Sets the visibility of the specified control.\n * please do not use.\n * @param {String} controlKey The key of the control. Possible values are 'tl', 'tr', 'br', 'bl', 'ml', 'mt', 'mr', 'mb', 'mtr'.\n * but since the control api allow for any control name, can be any string.\n * @param {Boolean} visible true to set the specified control visible, false otherwise\n * @todo discuss this overlap of priority here with the team. Andrea Bogazzi for details\n */\n setControlVisible(controlKey: string, visible: boolean) {\n if (!this._controlsVisibility) {\n this._controlsVisibility = {};\n }\n this._controlsVisibility[controlKey] = visible;\n }\n\n /**\n * Sets the visibility state of object controls, this is just a bulk option for setControlVisible;\n * @param {Record} [options] with an optional key per control\n * example: {Boolean} [options.bl] true to enable the bottom-left control, false to disable it\n */\n setControlsVisibility(options: Record = {}) {\n Object.entries(options).forEach(([controlKey, visibility]) =>\n this.setControlVisible(controlKey, visibility),\n );\n }\n\n /**\n * Clears the canvas.contextTop in a specific area that corresponds to the object's bounding box\n * that is in the canvas.contextContainer.\n * This function is used to clear pieces of contextTop where we render ephemeral effects on top of the object.\n * Example: blinking cursor text selection, drag effects.\n * @todo discuss swapping restoreManually with a renderCallback, but think of async issues\n * @param {Boolean} [restoreManually] When true won't restore the context after clear, in order to draw something else.\n * @return {CanvasRenderingContext2D|undefined} canvas.contextTop that is either still transformed\n * with the object transformMatrix, or restored to neutral transform\n */\n clearContextTop(\n restoreManually?: boolean,\n ): CanvasRenderingContext2D | undefined {\n if (!this.canvas) {\n return;\n }\n const ctx = this.canvas.contextTop;\n if (!ctx) {\n return;\n }\n const v = this.canvas.viewportTransform;\n ctx.save();\n ctx.transform(v[0], v[1], v[2], v[3], v[4], v[5]);\n this.transform(ctx);\n // we add 4 pixel, to be sure to do not leave any pixel out\n const width = this.width + 4,\n height = this.height + 4;\n ctx.clearRect(-width / 2, -height / 2, width, height);\n\n restoreManually || ctx.restore();\n return ctx;\n }\n\n /**\n * This callback function is called every time _discardActiveObject or _setActiveObject\n * try to to deselect this object. If the function returns true, the process is cancelled\n * @param {Object} [_options] options sent from the upper functions\n * @param {TPointerEvent} [options.e] event if the process is generated by an event\n * @param {FabricObject} [options.object] next object we are setting as active, and reason why\n * this is being deselected\n */\n onDeselect(_options?: {\n e?: TPointerEvent;\n object?: InteractiveFabricObject;\n }): boolean {\n // implemented by sub-classes, as needed.\n return false;\n }\n\n /**\n * This callback function is called every time _discardActiveObject or _setActiveObject\n * try to to select this object. If the function returns true, the process is cancelled\n * @param {Object} [_options] options sent from the upper functions\n * @param {Event} [_options.e] event if the process is generated by an event\n */\n onSelect(_options?: { e?: TPointerEvent }): boolean {\n // implemented by sub-classes, as needed.\n return false;\n }\n\n /**\n * Override to customize Drag behavior\n * Fired from {@link Canvas#_onMouseMove}\n * @returns true in order for the window to start a drag session\n */\n shouldStartDragging(_e: TPointerEvent) {\n return false;\n }\n\n /**\n * Override to customize Drag behavior\\\n * Fired once a drag session has started\n * @returns true to handle the drag event\n */\n onDragStart(_e: DragEvent) {\n return false;\n }\n\n /**\n * Override to customize drag and drop behavior\n * @public\n * @param {DragEvent} _e\n * @returns {boolean} true if the object currently dragged can be dropped on the target\n */\n canDrop(_e: DragEvent): boolean {\n return false;\n }\n\n /**\n * Override to customize drag and drop behavior\n * render a specific effect when an object is the source of a drag event\n * example: render the selection status for the part of text that is being dragged from a text object\n * @public\n * @param {DragEvent} _e\n */\n renderDragSourceEffect(_e: DragEvent) {\n // for subclasses\n }\n\n /**\n * Override to customize drag and drop behavior\n * render a specific effect when an object is the target of a drag event\n * used to show that the underly object can receive a drop, or to show how the\n * object will change when dropping. example: show the cursor where the text is about to be dropped\n * @public\n * @param {DragEvent} _e\n */\n renderDropTargetEffect(_e: DragEvent) {\n // for subclasses\n }\n}\n","import type { Constructor } from '../typedefs';\n\n/***\n * https://www.typescriptlang.org/docs/handbook/mixins.html#alternative-pattern\n */\nexport function applyMixins(\n derivedCtor: T,\n constructors: S[],\n) {\n constructors.forEach((baseCtor) => {\n Object.getOwnPropertyNames(baseCtor.prototype).forEach((name) => {\n name !== 'constructor' &&\n Object.defineProperty(\n derivedCtor.prototype,\n name,\n Object.getOwnPropertyDescriptor(baseCtor.prototype, name) ||\n Object.create(null),\n );\n });\n });\n return derivedCtor as T & { prototype: InstanceType };\n}\n","import type { ObjectEvents } from '../../EventTypeDefs';\nimport { FabricObjectSVGExportMixin } from './FabricObjectSVGExportMixin';\nimport { InteractiveFabricObject } from './InteractiveObject';\nimport { applyMixins } from '../../util/applyMixins';\nimport type { FabricObjectProps } from './types/FabricObjectProps';\nimport type { TFabricObjectProps, SerializedObjectProps } from './types';\nimport { classRegistry } from '../../ClassRegistry';\n\n// TODO somehow we have to make a tree-shakeable import\n\n// eslint-disable-next-line @typescript-eslint/no-empty-object-type\nexport interface FabricObject<\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n Props extends TFabricObjectProps = Partial,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n SProps extends SerializedObjectProps = SerializedObjectProps,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n EventSpec extends ObjectEvents = ObjectEvents,\n> extends FabricObjectSVGExportMixin {}\n\n// eslint-disable-next-line @typescript-eslint/no-unsafe-declaration-merging\nexport class FabricObject<\n Props extends TFabricObjectProps = Partial,\n SProps extends SerializedObjectProps = SerializedObjectProps,\n EventSpec extends ObjectEvents = ObjectEvents,\n> extends InteractiveFabricObject {}\n\napplyMixins(FabricObject, [FabricObjectSVGExportMixin]);\n\nclassRegistry.setClass(FabricObject);\nclassRegistry.setClass(FabricObject, 'object');\n\nexport { cacheProperties } from './defaultValues';\n","/**\n * Returns true if context has transparent pixel\n * at specified location (taking tolerance into account)\n * @param {CanvasRenderingContext2D} ctx context\n * @param {Number} x x coordinate in canvasElementCoordinate, not fabric space. integer\n * @param {Number} y y coordinate in canvasElementCoordinate, not fabric space. integer\n * @param {Number} tolerance Tolerance pixels around the point, not alpha tolerance, integer\n * @return {boolean} true if transparent\n */\nexport const isTransparent = (\n ctx: CanvasRenderingContext2D,\n x: number,\n y: number,\n tolerance: number,\n): boolean => {\n tolerance = Math.round(tolerance);\n const size = tolerance * 2 + 1;\n const { data } = ctx.getImageData(x - tolerance, y - tolerance, size, size);\n\n // Split image data - for tolerance > 1, pixelDataSize = 4;\n for (let i = 3; i < data.length; i += 4) {\n const alphaChannel = data[i];\n if (alphaChannel > 0) {\n return false;\n }\n }\n return true;\n};\n","import type { XY } from '../../../Point';\nimport { Point } from '../../../Point';\nimport { degreesToRadians } from '../radiansDegreesConversion';\nimport { createVector } from '../vectors';\nimport type { TProjectStrokeOnPointsOptions, TProjection } from './types';\n\n/**\n * @see https://github.com/fabricjs/fabric.js/pull/8344\n * @todo consider removing skewing from points before calculating stroke projection,\n * see https://github.com/fabricjs/fabric.js/commit/494a10ee2f8c2278ae9a55b20bf50cf6ee25b064#commitcomment-94751537\n */\nexport abstract class StrokeProjectionsBase {\n declare options: TProjectStrokeOnPointsOptions;\n declare scale: Point;\n declare strokeUniformScalar: Point;\n declare strokeProjectionMagnitude: number;\n\n constructor(options: TProjectStrokeOnPointsOptions) {\n this.options = options;\n this.strokeProjectionMagnitude = this.options.strokeWidth / 2;\n this.scale = new Point(this.options.scaleX, this.options.scaleY);\n this.strokeUniformScalar = this.options.strokeUniform\n ? new Point(1 / this.options.scaleX, 1 / this.options.scaleY)\n : new Point(1, 1);\n }\n\n /**\n * When the stroke is uniform, scaling affects the arrangement of points. So we must take it into account.\n */\n protected createSideVector(from: XY, to: XY) {\n const v = createVector(from, to);\n return this.options.strokeUniform ? v.multiply(this.scale) : v;\n }\n\n protected abstract calcOrthogonalProjection(\n from: Point,\n to: Point,\n magnitude?: number,\n ): Point;\n\n protected projectOrthogonally(from: Point, to: Point, magnitude?: number) {\n return this.applySkew(\n from.add(this.calcOrthogonalProjection(from, to, magnitude)),\n );\n }\n\n protected isSkewed() {\n return this.options.skewX !== 0 || this.options.skewY !== 0;\n }\n\n protected applySkew(point: Point) {\n const p = new Point(point);\n // skewY must be applied before skewX as this distortion affects skewX calculation\n p.y += p.x * Math.tan(degreesToRadians(this.options.skewY));\n p.x += p.y * Math.tan(degreesToRadians(this.options.skewX));\n return p;\n }\n\n protected scaleUnitVector(unitVector: Point, scalar: number) {\n return unitVector.multiply(this.strokeUniformScalar).scalarMultiply(scalar);\n }\n\n protected abstract projectPoints(): Point[];\n\n public abstract project(): TProjection[];\n}\n","import type { XY } from '../../../Point';\nimport { Point } from '../../../Point';\nimport { halfPI, twoMathPi } from '../../../constants';\nimport type { TRadian } from '../../../typedefs';\nimport { degreesToRadians } from '../radiansDegreesConversion';\nimport {\n calcAngleBetweenVectors,\n calcVectorRotation,\n crossProduct,\n getOrthonormalVector,\n getUnitVector,\n isBetweenVectors,\n magnitude,\n rotateVector,\n} from '../vectors';\nimport { StrokeProjectionsBase } from './StrokeProjectionsBase';\nimport type { TProjection, TProjectStrokeOnPointsOptions } from './types';\n\nconst zeroVector = new Point();\n\n/**\n * class in charge of finding projections for each type of line join\n * @see {@link [Closed path projections at #8344](https://github.com/fabricjs/fabric.js/pull/8344#2-closed-path)}\n *\n * - MDN:\n * - https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/lineJoin\n * - https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/stroke-linejoin\n * - Spec: https://svgwg.org/svg2-draft/painting.html#StrokeLinejoinProperty\n * - Playground to understand how the line joins works: https://hypertolosana.github.io/efficient-webgl-stroking/index.html\n * - View the calculated projections for each of the control points: https://codesandbox.io/s/project-stroke-points-with-context-to-trace-b8jc4j?file=/src/index.js\n *\n */\nexport class StrokeLineJoinProjections extends StrokeProjectionsBase {\n /**\n * The point being projected (the angle ∠BAC)\n */\n declare A: Point;\n /**\n * The point before A\n */\n declare B: Point;\n /**\n * The point after A\n */\n declare C: Point;\n /**\n * The AB vector\n */\n AB: Point;\n /**\n * The AC vector\n */\n AC: Point;\n /**\n * The angle of A (∠BAC)\n */\n alpha: TRadian;\n /**\n * The bisector of A (∠BAC)\n */\n bisector: Point;\n\n static getOrthogonalRotationFactor(vector1: Point, vector2?: Point) {\n const angle = vector2\n ? calcAngleBetweenVectors(vector1, vector2)\n : calcVectorRotation(vector1);\n return Math.abs(angle) < halfPI ? -1 : 1;\n }\n\n constructor(A: XY, B: XY, C: XY, options: TProjectStrokeOnPointsOptions) {\n super(options);\n this.A = new Point(A);\n this.B = new Point(B);\n this.C = new Point(C);\n this.AB = this.createSideVector(this.A, this.B);\n this.AC = this.createSideVector(this.A, this.C);\n this.alpha = calcAngleBetweenVectors(this.AB, this.AC);\n this.bisector = getUnitVector(\n // if AC is also the zero vector nothing will be projected\n // in that case the next point will handle the projection\n rotateVector(this.AB.eq(zeroVector) ? this.AC : this.AB, this.alpha / 2),\n );\n }\n\n calcOrthogonalProjection(\n from: Point,\n to: Point,\n magnitude: number = this.strokeProjectionMagnitude,\n ) {\n const vector = this.createSideVector(from, to);\n const orthogonalProjection = getOrthonormalVector(vector);\n const correctSide = StrokeLineJoinProjections.getOrthogonalRotationFactor(\n orthogonalProjection,\n this.bisector,\n );\n return this.scaleUnitVector(orthogonalProjection, magnitude * correctSide);\n }\n\n /**\n * BEVEL\n * Calculation: the projection points are formed by the vector orthogonal to the vertex.\n *\n * @see https://github.com/fabricjs/fabric.js/pull/8344#2-2-bevel\n */\n projectBevel() {\n const projections: Point[] = [];\n // if `alpha` equals 0 or 2*PI, the projections are the same for `B` and `C`\n (this.alpha % twoMathPi === 0 ? [this.B] : [this.B, this.C]).forEach(\n (to) => {\n projections.push(this.projectOrthogonally(this.A, to));\n projections.push(\n this.projectOrthogonally(this.A, to, -this.strokeProjectionMagnitude),\n );\n },\n );\n return projections;\n }\n\n /**\n * MITER\n * Calculation: the corner is formed by extending the outer edges of the stroke\n * at the tangents of the path segments until they intersect.\n *\n * @see https://github.com/fabricjs/fabric.js/pull/8344#2-1-miter\n */\n projectMiter() {\n const projections: Point[] = [],\n alpha = Math.abs(this.alpha),\n hypotUnitScalar = 1 / Math.sin(alpha / 2),\n miterVector = this.scaleUnitVector(\n this.bisector,\n -this.strokeProjectionMagnitude * hypotUnitScalar,\n );\n\n // When two line segments meet at a sharp angle, it is possible for the join to extend,\n // far beyond the thickness of the line stroking the path. The stroke-miterlimit imposes\n // a limit on the extent of the line join.\n // MDN: https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/stroke-miterlimit\n // When the stroke is uniform, scaling changes the arrangement of points, this changes the miter-limit\n const strokeMiterLimit = this.options.strokeUniform\n ? magnitude(\n this.scaleUnitVector(this.bisector, this.options.strokeMiterLimit),\n )\n : this.options.strokeMiterLimit;\n\n if (\n magnitude(miterVector) / this.strokeProjectionMagnitude <=\n strokeMiterLimit\n ) {\n projections.push(this.applySkew(this.A.add(miterVector)));\n }\n /* when the miter-limit is reached, the stroke line join becomes of type bevel.\n We always need two orthogonal projections which are basically bevel-type projections,\n so regardless of whether the miter-limit was reached or not, we include these projections.\n */\n projections.push(...this.projectBevel());\n\n return projections;\n }\n\n /**\n * ROUND (without skew)\n * Calculation: the projections are the two vectors parallel to X and Y axes\n *\n * @see https://github.com/fabricjs/fabric.js/pull/8344#2-3-1-round-without-skew\n */\n private projectRoundNoSkew(startCircle: Point, endCircle: Point) {\n const projections: Point[] = [],\n // correctSide is used to only consider projecting for the outer side\n correctSide = new Point(\n StrokeLineJoinProjections.getOrthogonalRotationFactor(this.bisector),\n StrokeLineJoinProjections.getOrthogonalRotationFactor(\n new Point(this.bisector.y, this.bisector.x),\n ),\n ),\n radiusOnAxisX = new Point(1, 0)\n .scalarMultiply(this.strokeProjectionMagnitude)\n .multiply(this.strokeUniformScalar)\n .multiply(correctSide),\n radiusOnAxisY = new Point(0, 1)\n .scalarMultiply(this.strokeProjectionMagnitude)\n .multiply(this.strokeUniformScalar)\n .multiply(correctSide);\n\n [radiusOnAxisX, radiusOnAxisY].forEach((vector) => {\n if (isBetweenVectors(vector, startCircle, endCircle)) {\n projections.push(this.A.add(vector));\n }\n });\n return projections;\n }\n\n /**\n * ROUND (with skew)\n * Calculation: the projections are the points furthest from the vertex in\n * the direction of the X and Y axes after distortion.\n *\n * @see https://github.com/fabricjs/fabric.js/pull/8344#2-3-2-round-skew\n */\n private projectRoundWithSkew(startCircle: Point, endCircle: Point) {\n const projections: Point[] = [];\n\n const { skewX, skewY, scaleX, scaleY, strokeUniform } = this.options,\n shearing = new Point(\n Math.tan(degreesToRadians(skewX)),\n Math.tan(degreesToRadians(skewY)),\n );\n // The points furthest from the vertex in the direction of the X and Y axes after distortion\n const circleRadius = this.strokeProjectionMagnitude,\n newY = strokeUniform\n ? circleRadius /\n scaleY /\n Math.sqrt(1 / scaleY ** 2 + (1 / scaleX ** 2) * shearing.y ** 2)\n : circleRadius / Math.sqrt(1 + shearing.y ** 2),\n furthestY = new Point(\n // Safe guard due to floating point precision. In some situations the square root\n // was returning NaN because of a negative number close to zero.\n Math.sqrt(Math.max(circleRadius ** 2 - newY ** 2, 0)),\n newY,\n ),\n newX = strokeUniform\n ? circleRadius /\n Math.sqrt(\n 1 +\n (shearing.x ** 2 * (1 / scaleY) ** 2) /\n (1 / scaleX + (1 / scaleX) * shearing.x * shearing.y) ** 2,\n )\n : circleRadius /\n Math.sqrt(1 + shearing.x ** 2 / (1 + shearing.x * shearing.y) ** 2),\n furthestX = new Point(\n newX,\n Math.sqrt(Math.max(circleRadius ** 2 - newX ** 2, 0)),\n );\n\n [\n furthestX,\n furthestX.scalarMultiply(-1),\n furthestY,\n furthestY.scalarMultiply(-1),\n ]\n // We need to skew the vector here as this information is used to check if\n // it is between the start and end of the circle segment\n .map((vector) =>\n this.applySkew(\n strokeUniform ? vector.multiply(this.strokeUniformScalar) : vector,\n ),\n )\n .forEach((vector) => {\n if (isBetweenVectors(vector, startCircle, endCircle)) {\n projections.push(this.applySkew(this.A).add(vector));\n }\n });\n\n return projections;\n }\n\n projectRound() {\n const projections: Point[] = [];\n /* Include the start and end points of the circle segment, so that only\n the projections contained within it are included */\n // add the orthogonal projections (start and end points of circle segment)\n projections.push(...this.projectBevel());\n // let's determines which one of the orthogonal projection is the beginning and end of the circle segment.\n // when `alpha` equals 0 or 2*PI, we have a straight line, so the way to find the start/end is different.\n const isStraightLine = this.alpha % twoMathPi === 0,\n // change the origin of the projections to point A\n // so that the cross product calculation is correct\n newOrigin = this.applySkew(this.A),\n proj0 = projections[isStraightLine ? 0 : 2].subtract(newOrigin),\n proj1 = projections[isStraightLine ? 1 : 0].subtract(newOrigin),\n // when `isStraightLine` === true, we compare with the vector opposite AB, otherwise we compare with the bisector.\n comparisonVector = isStraightLine\n ? this.applySkew(this.AB.scalarMultiply(-1))\n : this.applySkew(\n this.bisector.multiply(this.strokeUniformScalar).scalarMultiply(-1),\n ),\n // the beginning of the circle segment is always to the right of the comparison vector (cross product > 0)\n isProj0Start = crossProduct(proj0, comparisonVector) > 0,\n startCircle = isProj0Start ? proj0 : proj1,\n endCircle = isProj0Start ? proj1 : proj0;\n if (!this.isSkewed()) {\n projections.push(...this.projectRoundNoSkew(startCircle, endCircle));\n } else {\n projections.push(...this.projectRoundWithSkew(startCircle, endCircle));\n }\n return projections;\n }\n\n /**\n * Project stroke width on points returning projections for each point as follows:\n * - `miter`: 1 point corresponding to the outer boundary. If the miter limit is exceeded, it will be 2 points (becomes bevel)\n * - `bevel`: 2 points corresponding to the bevel possible boundaries, orthogonal to the stroke.\n * - `round`: same as `bevel` when it has no skew, with skew are 4 points.\n */\n protected projectPoints() {\n switch (this.options.strokeLineJoin) {\n case 'miter':\n return this.projectMiter();\n case 'round':\n return this.projectRound();\n default:\n return this.projectBevel();\n }\n }\n\n public project(): TProjection[] {\n return this.projectPoints().map((point) => ({\n originPoint: this.A,\n projectedPoint: point,\n angle: this.alpha,\n bisector: this.bisector,\n }));\n }\n}\n","import type { XY } from '../../../Point';\nimport { Point } from '../../../Point';\nimport { getOrthonormalVector, getUnitVector } from '../vectors';\nimport { StrokeLineJoinProjections } from './StrokeLineJoinProjections';\nimport { StrokeProjectionsBase } from './StrokeProjectionsBase';\nimport type { TProjection, TProjectStrokeOnPointsOptions } from './types';\n\n/**\n * class in charge of finding projections for each type of line cap for start/end of an open path\n * @see {@link [Open path projections at #8344](https://github.com/fabricjs/fabric.js/pull/8344#1-open-path)}\n *\n * Reference:\n * - MDN:\n * - https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/lineCap\n * - https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/stroke-linecap\n * - Spec: https://html.spec.whatwg.org/multipage/canvas.html#dom-context-2d-linecap-dev\n * - Playground to understand how the line joins works: https://hypertolosana.github.io/efficient-webgl-stroking/index.html\n * - View the calculated projections for each of the control points: https://codesandbox.io/s/project-stroke-points-with-context-to-trace-b8jc4j?file=/src/index.js\n */\nexport class StrokeLineCapProjections extends StrokeProjectionsBase {\n /**\n * edge point\n */\n declare A: Point;\n /**\n * point next to edge point\n */\n declare T: Point;\n\n constructor(A: XY, T: XY, options: TProjectStrokeOnPointsOptions) {\n super(options);\n this.A = new Point(A);\n this.T = new Point(T);\n }\n\n calcOrthogonalProjection(\n from: Point,\n to: Point,\n magnitude: number = this.strokeProjectionMagnitude,\n ) {\n const vector = this.createSideVector(from, to);\n return this.scaleUnitVector(getOrthonormalVector(vector), magnitude);\n }\n\n /**\n * OPEN PATH START/END - Line cap: Butt\n * Calculation: to find the projections, just find the points orthogonal to the stroke\n *\n * @see https://github.com/fabricjs/fabric.js/pull/8344#1-1-butt\n */\n projectButt() {\n return [\n this.projectOrthogonally(this.A, this.T, this.strokeProjectionMagnitude),\n this.projectOrthogonally(this.A, this.T, -this.strokeProjectionMagnitude),\n ];\n }\n\n /**\n * OPEN PATH START/END - Line cap: Round\n * Calculation: same as stroke line join `round`\n *\n * @see https://github.com/fabricjs/fabric.js/pull/8344#1-2-round\n */\n projectRound() {\n const projections: Point[] = [];\n\n if (!this.isSkewed() && this.A.eq(this.T)) {\n /* 1 point case without `skew`\n When `strokeUniform` is true, scaling has no effect.\n So we divide by scale, to remove its effect.\n */\n const projection = new Point(1, 1)\n .scalarMultiply(this.strokeProjectionMagnitude)\n .multiply(this.strokeUniformScalar);\n projections.push(\n this.applySkew(this.A.add(projection)),\n this.applySkew(this.A.subtract(projection)),\n );\n } else {\n projections.push(\n ...new StrokeLineJoinProjections(\n this.A,\n this.T,\n this.T,\n this.options,\n ).projectRound(),\n );\n }\n\n return projections;\n }\n\n /**\n * OPEN PATH START/END - Line cap: Square\n * Calculation: project a rectangle of points on the stroke in the opposite direction of the vector `AT`\n *\n * @see https://github.com/fabricjs/fabric.js/pull/8344#1-3-square\n */\n projectSquare() {\n const projections: Point[] = [];\n\n if (this.A.eq(this.T)) {\n /* 1 point case without `skew`\n When `strokeUniform` is true, scaling has no effect.\n So we divide by scale, to remove its effect.\n */\n const projection = new Point(1, 1)\n .scalarMultiply(this.strokeProjectionMagnitude)\n .multiply(this.strokeUniformScalar);\n projections.push(this.A.add(projection), this.A.subtract(projection));\n } else {\n const orthogonalProjection = this.calcOrthogonalProjection(\n this.A,\n this.T,\n this.strokeProjectionMagnitude,\n );\n const strokePointingOut = this.scaleUnitVector(\n getUnitVector(this.createSideVector(this.A, this.T)),\n -this.strokeProjectionMagnitude,\n );\n const projectedA = this.A.add(strokePointingOut);\n projections.push(\n projectedA.add(orthogonalProjection),\n projectedA.subtract(orthogonalProjection),\n );\n }\n\n return projections.map((p) => this.applySkew(p));\n }\n\n protected projectPoints() {\n switch (this.options.strokeLineCap) {\n case 'round':\n return this.projectRound();\n case 'square':\n return this.projectSquare();\n default:\n return this.projectButt();\n }\n }\n\n public project(): TProjection[] {\n return this.projectPoints().map((point) => ({\n originPoint: this.A,\n projectedPoint: point,\n }));\n }\n}\n","import { Point, type XY } from '../../../Point';\nimport { findIndexRight } from '../../internals/findRight';\nimport { StrokeLineCapProjections } from './StrokeLineCapProjections';\nimport { StrokeLineJoinProjections } from './StrokeLineJoinProjections';\nimport type { TProjection, TProjectStrokeOnPointsOptions } from './types';\n\nexport type * from './types';\n\n/**\n *\n * Used to calculate object's bounding box\n *\n * @see https://github.com/fabricjs/fabric.js/pull/8344\n *\n */\nexport const projectStrokeOnPoints = (\n points: XY[],\n options: TProjectStrokeOnPointsOptions,\n openPath = false,\n): TProjection[] => {\n const projections: TProjection[] = [];\n\n if (points.length === 0) {\n return projections;\n }\n\n // first we remove duplicate neighboring points\n const reduced = points.reduce(\n (reduced, point) => {\n if (!reduced[reduced.length - 1].eq(point)) {\n reduced.push(new Point(point));\n }\n return reduced;\n },\n [new Point(points[0])],\n );\n\n if (reduced.length === 1) {\n openPath = true;\n } else if (!openPath) {\n // remove points from end in case they equal the first point\n // in order to correctly project the first point\n const start = reduced[0];\n const index = findIndexRight(reduced, (point) => !point.eq(start));\n reduced.splice(index + 1);\n }\n\n reduced.forEach((A, index, points) => {\n let B: XY, C: XY;\n if (index === 0) {\n C = points[1];\n B = openPath ? A : points[points.length - 1];\n } else if (index === points.length - 1) {\n B = points[index - 1];\n C = openPath ? A : points[0];\n } else {\n B = points[index - 1];\n C = points[index + 1];\n }\n\n if (openPath && points.length === 1) {\n projections.push(\n ...new StrokeLineCapProjections(A, A, options).project(),\n );\n } else if (openPath && (index === 0 || index === points.length - 1)) {\n projections.push(\n ...new StrokeLineCapProjections(\n A,\n index === 0 ? C : B,\n options,\n ).project(),\n );\n } else {\n projections.push(\n ...new StrokeLineJoinProjections(A, B, C, options).project(),\n );\n }\n });\n\n return projections;\n};\n","export const findIndexRight = (\n array: T[],\n predicate: (value: T, index: number, array: T[]) => boolean,\n) => {\n for (let index = array.length - 1; index >= 0; index--) {\n if (predicate(array[index], index, array)) {\n return index;\n }\n }\n return -1;\n};\n","import type { TextStyle } from '../../shapes/Text/StyledText';\n\nexport const cloneStyles = (style: TextStyle): TextStyle => {\n const newObj: TextStyle = {};\n Object.keys(style).forEach((key) => {\n newObj[key] = {};\n Object.keys(style[key]).forEach((keyInner) => {\n newObj[key][keyInner] = { ...style[key][keyInner] };\n });\n });\n return newObj;\n};\n","import { getFabricWindow } from '../env';\n\n/**\n * Capitalizes a string\n * @param {String} string String to capitalize\n * @param {Boolean} [firstLetterOnly] If true only first letter is capitalized\n * and other letters stay untouched, if false first letter is capitalized\n * and other letters are converted to lowercase.\n * @return {String} Capitalized version of a string\n */\nexport const capitalize = (string: string, firstLetterOnly = false): string =>\n `${string.charAt(0).toUpperCase()}${\n firstLetterOnly ? string.slice(1) : string.slice(1).toLowerCase()\n }`;\n\n/**\n * Escapes XML in a string\n * @param {String} string String to escape\n * @return {String} Escaped version of a string\n */\nexport const escapeXml = (string: string): string =>\n string\n .replace(/&/g, '&')\n .replace(/\"/g, '"')\n .replace(/'/g, ''')\n .replace(//g, '>');\n\nlet segmenter: Intl.Segmenter | false;\n\nconst getSegmenter = () => {\n if (!segmenter) {\n segmenter =\n 'Intl' in getFabricWindow() &&\n 'Segmenter' in Intl &&\n new Intl.Segmenter(undefined, {\n granularity: 'grapheme',\n });\n }\n return segmenter;\n};\n\n/**\n * Divide a string in the user perceived single units\n * @param {String} textstring String to escape\n * @return {Array} array containing the graphemes\n */\nexport const graphemeSplit = (textstring: string): string[] => {\n segmenter || getSegmenter();\n if (segmenter) {\n const segments = segmenter.segment(textstring);\n return Array.from(segments).map(({ segment }) => segment);\n }\n\n //Fallback\n return graphemeSplitImpl(textstring);\n};\n\nconst graphemeSplitImpl = (textstring: string): string[] => {\n const graphemes: string[] = [];\n for (let i = 0, chr; i < textstring.length; i++) {\n if ((chr = getWholeChar(textstring, i)) === false) {\n continue;\n }\n graphemes.push(chr);\n }\n return graphemes;\n};\n\n// taken from mdn in the charAt doc page.\nconst getWholeChar = (str: string, i: number): string | false => {\n const code = str.charCodeAt(i);\n if (isNaN(code)) {\n return ''; // Position not found\n }\n if (code < 0xd800 || code > 0xdfff) {\n return str.charAt(i);\n }\n\n // High surrogate (could change last hex to 0xDB7F to treat high private\n // surrogates as single characters)\n if (0xd800 <= code && code <= 0xdbff) {\n if (str.length <= i + 1) {\n throw 'High surrogate without following low surrogate';\n }\n const next = str.charCodeAt(i + 1);\n if (0xdc00 > next || next > 0xdfff) {\n throw 'High surrogate without following low surrogate';\n }\n return str.charAt(i) + str.charAt(i + 1);\n }\n // Low surrogate (0xDC00 <= code && code <= 0xDFFF)\n if (i === 0) {\n throw 'Low surrogate without preceding high surrogate';\n }\n const prev = str.charCodeAt(i - 1);\n\n // (could change last hex to 0xDB7F to treat high private\n // surrogates as single characters)\n if (0xd800 > prev || prev > 0xdbff) {\n throw 'Low surrogate without preceding high surrogate';\n }\n // We can pass over low surrogates now as the second component\n // in a pair which we have already processed\n return false;\n};\n","import { reNewline } from '../../constants';\nimport type {\n TextStyle,\n TextStyleDeclaration,\n} from '../../shapes/Text/StyledText';\nimport { cloneStyles } from '../internals/cloneStyles';\nimport { graphemeSplit } from '../lang_string';\n\nexport type TextStyleArray = {\n start: number;\n end: number;\n style: TextStyleDeclaration;\n}[];\n\n/**\n * @param {Object} prevStyle first style to compare\n * @param {Object} thisStyle second style to compare\n * @param {boolean} forTextSpans whether to check overline, underline, and line-through properties\n * @return {boolean} true if the style changed\n */\nexport const hasStyleChanged = (\n prevStyle: TextStyleDeclaration,\n thisStyle: TextStyleDeclaration,\n forTextSpans = false,\n) =>\n prevStyle.fill !== thisStyle.fill ||\n prevStyle.stroke !== thisStyle.stroke ||\n prevStyle.strokeWidth !== thisStyle.strokeWidth ||\n prevStyle.fontSize !== thisStyle.fontSize ||\n prevStyle.fontFamily !== thisStyle.fontFamily ||\n prevStyle.fontWeight !== thisStyle.fontWeight ||\n prevStyle.fontStyle !== thisStyle.fontStyle ||\n prevStyle.textDecorationThickness !== thisStyle.textDecorationThickness ||\n prevStyle.textBackgroundColor !== thisStyle.textBackgroundColor ||\n prevStyle.deltaY !== thisStyle.deltaY ||\n (forTextSpans &&\n (prevStyle.overline !== thisStyle.overline ||\n prevStyle.underline !== thisStyle.underline ||\n prevStyle.linethrough !== thisStyle.linethrough));\n\n/**\n * Returns the array form of a text object's inline styles property with styles grouped in ranges\n * rather than per character. This format is less verbose, and is better suited for storage\n * so it is used in serialization (not during runtime).\n * @param {object} styles per character styles for a text object\n * @param {String} text the text string that the styles are applied to\n * @return {{start: number, end: number, style: object}[]}\n */\nexport const stylesToArray = (\n styles: TextStyle,\n text: string,\n): TextStyleArray => {\n const textLines = text.split('\\n'),\n stylesArray = [];\n let charIndex = -1,\n prevStyle = {};\n // clone style structure to prevent mutation\n styles = cloneStyles(styles);\n\n //loop through each textLine\n for (let i = 0; i < textLines.length; i++) {\n const chars = graphemeSplit(textLines[i]);\n if (!styles[i]) {\n //no styles exist for this line, so add the line's length to the charIndex total and reset prevStyle\n charIndex += chars.length;\n prevStyle = {};\n continue;\n }\n //loop through each character of the current line\n for (let c = 0; c < chars.length; c++) {\n charIndex++;\n const thisStyle = styles[i][c];\n //check if style exists for this character\n if (thisStyle && Object.keys(thisStyle).length > 0) {\n if (hasStyleChanged(prevStyle, thisStyle, true)) {\n stylesArray.push({\n start: charIndex,\n end: charIndex + 1,\n style: thisStyle,\n });\n } else {\n //if style is the same as previous character, increase end index\n stylesArray[stylesArray.length - 1].end++;\n }\n }\n prevStyle = thisStyle || {};\n }\n }\n return stylesArray;\n};\n\n/**\n * Returns the object form of the styles property with styles that are assigned per\n * character rather than grouped by range. This format is more verbose, and is\n * only used during runtime (not for serialization/storage)\n * @param {Array} styles the serialized form of a text object's styles\n * @param {String} text the text string that the styles are applied to\n * @return {Object}\n */\nexport const stylesFromArray = (\n styles: TextStyleArray | TextStyle,\n text: string,\n): TextStyle => {\n if (!Array.isArray(styles)) {\n // clone to prevent mutation\n return cloneStyles(styles);\n }\n const textLines = text.split(reNewline),\n stylesObject: TextStyle = {};\n let charIndex = -1,\n styleIndex = 0;\n //loop through each textLine\n for (let i = 0; i < textLines.length; i++) {\n const chars = graphemeSplit(textLines[i]);\n\n //loop through each character of the current line\n for (let c = 0; c < chars.length; c++) {\n charIndex++;\n //check if there's a style collection that includes the current character\n if (\n styles[styleIndex] &&\n styles[styleIndex].start <= charIndex &&\n charIndex < styles[styleIndex].end\n ) {\n //create object for line index if it doesn't exist\n stylesObject[i] = stylesObject[i] || {};\n //assign a style at this character's index\n stylesObject[i][c] = { ...styles[styleIndex].style };\n //if character is at the end of the current style collection, move to the next\n if (charIndex === styles[styleIndex].end - 1) {\n styleIndex++;\n }\n }\n }\n }\n return stylesObject;\n};\n","import { FILL, STROKE } from '../constants';\n\n/**\n * Attributes parsed from all SVG elements\n * @type array\n */\nexport const SHARED_ATTRIBUTES = [\n 'display',\n 'transform',\n FILL,\n 'fill-opacity',\n 'fill-rule',\n 'opacity',\n STROKE,\n 'stroke-dasharray',\n 'stroke-linecap',\n 'stroke-dashoffset',\n 'stroke-linejoin',\n 'stroke-miterlimit',\n 'stroke-opacity',\n 'stroke-width',\n 'id',\n 'paint-order',\n 'vector-effect',\n 'instantiated_by_use',\n 'clip-path',\n];\n","export function selectorMatches(\n element: HTMLElement | SVGElement,\n selector: string,\n) {\n const nodeName = element.nodeName;\n const classNames = element.getAttribute('class');\n const id = element.getAttribute('id');\n const azAz = '(?![a-zA-Z\\\\-]+)';\n let matcher;\n // i check if a selector matches slicing away part from it.\n // if i get empty string i should match\n matcher = new RegExp('^' + nodeName, 'i');\n selector = selector.replace(matcher, '');\n if (id && selector.length) {\n matcher = new RegExp('#' + id + azAz, 'i');\n selector = selector.replace(matcher, '');\n }\n if (classNames && selector.length) {\n const splitClassNames = classNames.split(' ');\n for (let i = splitClassNames.length; i--; ) {\n matcher = new RegExp('\\\\.' + splitClassNames[i] + azAz, 'i');\n selector = selector.replace(matcher, '');\n }\n }\n return selector.length === 0;\n}\n","import { selectorMatches } from './selectorMatches';\nimport { doesSomeParentMatch } from './doesSomeParentMatch';\n\n/**\n * @private\n */\n\nexport function elementMatchesRule(\n element: HTMLElement | SVGElement,\n selectors: string[],\n) {\n let parentMatching = true;\n // start from rightmost selector.\n const firstMatching = selectorMatches(element, selectors.pop()!);\n if (firstMatching && selectors.length) {\n parentMatching = doesSomeParentMatch(element, selectors);\n }\n return firstMatching && parentMatching && selectors.length === 0;\n}\n","import { selectorMatches } from './selectorMatches';\n\nexport function doesSomeParentMatch(\n element: HTMLElement | SVGElement,\n selectors: string[],\n) {\n let selector: string,\n parentMatching = true;\n while (\n element.parentElement &&\n element.parentElement.nodeType === 1 &&\n selectors.length\n ) {\n if (parentMatching) {\n selector = selectors.pop()!;\n }\n element = element.parentElement;\n parentMatching = selectorMatches(element, selector!);\n }\n return selectors.length === 0;\n}\n","import { elementMatchesRule } from './elementMatchesRule';\nimport type { CSSRules } from './typedefs';\n\n/**\n * @private\n */\n\nexport function getGlobalStylesForElement(\n element: HTMLElement | SVGElement,\n cssRules: CSSRules = {},\n) {\n let styles: Record = {};\n for (const rule in cssRules) {\n if (elementMatchesRule(element, rule.split(' '))) {\n styles = {\n ...styles,\n ...cssRules[rule],\n };\n }\n }\n return styles;\n}\n","import { attributesMap } from './constants';\n\nexport const normalizeAttr = (\n attr: keyof typeof attributesMap | string,\n): string => attributesMap[attr as keyof typeof attributesMap] ?? attr;\n","import { reNum } from '../../parser/constants';\n\nconst regex = new RegExp(`(${reNum})`, 'gi');\n\nexport const cleanupSvgAttribute = (attributeValue: string) =>\n attributeValue\n .replace(regex, ' $1 ')\n // replace annoying commas and arbitrary whitespace with single spaces\n .replace(/,/gi, ' ')\n .replace(/\\s+/gi, ' ');\n","import { ROTATE, SCALE, SKEW_X, SKEW_Y, iMatrix } from '../constants';\nimport { reNum } from './constants';\nimport type { TMat2D } from '../typedefs';\nimport { cleanupSvgAttribute } from '../util/internals/cleanupSvgAttribute';\nimport {\n createRotateMatrix,\n createScaleMatrix,\n createSkewXMatrix,\n createSkewYMatrix,\n createTranslateMatrix,\n multiplyTransformMatrixArray,\n} from '../util/misc/matrix';\n\n// == begin transform regexp\nconst p = `(${reNum})`;\nconst skewX = String.raw`(skewX)\\(${p}\\)`;\nconst skewY = String.raw`(skewY)\\(${p}\\)`;\nconst rotate = String.raw`(rotate)\\(${p}(?: ${p} ${p})?\\)`;\nconst scale = String.raw`(scale)\\(${p}(?: ${p})?\\)`;\nconst translate = String.raw`(translate)\\(${p}(?: ${p})?\\)`;\nconst matrix = String.raw`(matrix)\\(${p} ${p} ${p} ${p} ${p} ${p}\\)`;\nconst transform = `(?:${matrix}|${translate}|${rotate}|${scale}|${skewX}|${skewY})`;\nconst transforms = `(?:${transform}*)`;\nconst transformList = String.raw`^\\s*(?:${transforms}?)\\s*$`;\n// http://www.w3.org/TR/SVG/coords.html#TransformAttribute\nconst reTransformList = new RegExp(transformList);\nconst reTransform = new RegExp(transform);\nconst reTransformAll = new RegExp(transform, 'g');\n// == end transform regexp\n\n/**\n * Parses \"transform\" attribute, returning an array of values\n * @static\n * @function\n * @param {String} attributeValue String containing attribute value\n * @return {TTransformMatrix} Array of 6 elements representing transformation matrix\n */\nexport function parseTransformAttribute(attributeValue: string): TMat2D {\n // first we clean the string\n attributeValue = cleanupSvgAttribute(attributeValue)\n // remove spaces around front parentheses\n .replace(/\\s*([()])\\s*/gi, '$1');\n\n // start with identity matrix\n const matrices: TMat2D[] = [];\n\n // return if no argument was given or\n // an argument does not match transform attribute regexp\n if (\n !attributeValue ||\n (attributeValue && !reTransformList.test(attributeValue))\n ) {\n return [...iMatrix];\n }\n\n for (const match of attributeValue.matchAll(reTransformAll)) {\n const transformMatch = reTransform.exec(match[0]);\n if (!transformMatch) {\n continue;\n }\n let matrix: TMat2D = iMatrix;\n const matchedParams = transformMatch.filter((m) => !!m);\n const [, operation, ...rawArgs] = matchedParams;\n const [arg0, arg1, arg2, arg3, arg4, arg5] = rawArgs.map((arg) =>\n parseFloat(arg),\n );\n\n switch (operation) {\n case 'translate':\n matrix = createTranslateMatrix(arg0, arg1);\n break;\n case ROTATE:\n matrix = createRotateMatrix({ angle: arg0 }, { x: arg1, y: arg2 });\n break;\n case SCALE:\n matrix = createScaleMatrix(arg0, arg1);\n break;\n case SKEW_X:\n matrix = createSkewXMatrix(arg0);\n break;\n case SKEW_Y:\n matrix = createSkewYMatrix(arg0);\n break;\n case 'matrix':\n matrix = [arg0, arg1, arg2, arg3, arg4, arg5];\n break;\n }\n\n // snapshot current matrix into matrices array\n matrices.push(matrix);\n }\n\n return multiplyTransformMatrixArray(matrices);\n}\n","import { multiplyTransformMatrices } from '../util/misc/matrix';\nimport { parseUnit } from '../util/misc/svgParsing';\nimport { parseTransformAttribute } from './parseTransformAttribute';\nimport { CENTER, LEFT, RIGHT, NONE, FILL, STROKE } from '../constants';\nimport { TEXT_DECORATION_THICKNESS } from '../shapes/Text/constants';\n\nexport function normalizeValue(\n attr: string,\n value: any,\n parentAttributes: Record,\n fontSize: number,\n): string | null | boolean | number[] | number {\n const isArray = Array.isArray(value);\n let parsed: number | number[];\n let ouputValue: string | null | boolean | number[] | number = value;\n if ((attr === FILL || attr === STROKE) && value === NONE) {\n ouputValue = '';\n } else if (attr === 'strokeUniform') {\n return value === 'non-scaling-stroke';\n } else if (attr === 'strokeDashArray') {\n if (value === NONE) {\n ouputValue = null;\n } else {\n ouputValue = value.replace(/,/g, ' ').split(/\\s+/).map(parseFloat);\n }\n } else if (attr === 'transformMatrix') {\n if (parentAttributes && parentAttributes.transformMatrix) {\n ouputValue = multiplyTransformMatrices(\n parentAttributes.transformMatrix,\n parseTransformAttribute(value),\n );\n } else {\n ouputValue = parseTransformAttribute(value);\n }\n } else if (attr === 'visible') {\n ouputValue = value !== NONE && value !== 'hidden';\n // display=none on parent element always takes precedence over child element\n if (parentAttributes && parentAttributes.visible === false) {\n ouputValue = false;\n }\n } else if (attr === 'opacity') {\n ouputValue = parseFloat(value);\n if (parentAttributes && typeof parentAttributes.opacity !== 'undefined') {\n ouputValue *= parentAttributes.opacity as number;\n }\n } else if (attr === 'textAnchor' /* text-anchor */) {\n ouputValue = value === 'start' ? LEFT : value === 'end' ? RIGHT : CENTER;\n } else if (attr === 'charSpacing' || attr === TEXT_DECORATION_THICKNESS) {\n // parseUnit returns px and we convert it to em\n parsed = (parseUnit(value, fontSize) / fontSize) * 1000;\n } else if (attr === 'paintFirst') {\n const fillIndex = value.indexOf(FILL);\n const strokeIndex = value.indexOf(STROKE);\n ouputValue = FILL;\n if (fillIndex > -1 && strokeIndex > -1 && strokeIndex < fillIndex) {\n ouputValue = STROKE;\n } else if (fillIndex === -1 && strokeIndex > -1) {\n ouputValue = STROKE;\n }\n } else if (\n attr === 'href' ||\n attr === 'xlink:href' ||\n attr === 'font' ||\n attr === 'id'\n ) {\n return value;\n } else if (attr === 'imageSmoothing') {\n return value === 'optimizeQuality';\n } else {\n parsed = isArray\n ? (value as string[]).map(parseUnit)\n : parseUnit(value, fontSize);\n }\n\n return !isArray && isNaN(parsed! as number) ? ouputValue : parsed!;\n}\n","/**\n * Takes a style string and parses it in one that has only defined values\n * and lowercases properties\n * @param style\n * @param oStyle\n */\nexport function parseStyleString(\n style: string,\n oStyle: Record,\n): void {\n style\n .replace(/;\\s*$/, '')\n .split(';')\n .forEach((chunk) => {\n if (!chunk) return;\n const [attr, value] = chunk.split(':');\n oStyle[attr.trim().toLowerCase()] = value.trim();\n });\n}\n","import { parseStyleObject } from './parseStyleObject';\nimport { parseStyleString } from './parseStyleString';\n\n/**\n * Parses \"style\" attribute, retuning an object with values\n * @static\n * @param {SVGElement} element Element to parse\n * @return {Object} Objects with values parsed from style attribute of an element\n */\nexport function parseStyleAttribute(\n element: HTMLElement | SVGElement,\n): Record {\n const oStyle: Record = {},\n style = element.getAttribute('style');\n\n if (!style) {\n return oStyle;\n }\n\n if (typeof style === 'string') {\n parseStyleString(style, oStyle);\n } else {\n parseStyleObject(style, oStyle);\n }\n\n return oStyle;\n}\n","/**\n * Takes a style object and parses it in one that has only defined values\n * and lowercases properties\n * @param style\n * @param oStyle\n */\nexport function parseStyleObject(\n style: Record,\n oStyle: Record,\n): void {\n Object.entries(style).forEach(([prop, value]) => {\n if (value === undefined) {\n return;\n }\n oStyle[prop.toLowerCase()] = value;\n });\n}\n","import { Color } from '../color/Color';\nimport { toFixed } from '../util/misc/toFixed';\nimport { FabricObject } from '../shapes/Object/FabricObject';\n\nconst colorAttributesMap = {\n stroke: 'strokeOpacity',\n fill: 'fillOpacity',\n};\n\n/**\n * @private\n * @param {Object} attributes Array of attributes to parse\n */\n\nexport function setStrokeFillOpacity(\n attributes: Record,\n): Record {\n const defaults = FabricObject.getDefaults();\n Object.entries(colorAttributesMap).forEach(([attr, colorAttr]) => {\n if (\n typeof attributes[colorAttr] === 'undefined' ||\n attributes[attr] === ''\n ) {\n return;\n }\n if (typeof attributes[attr] === 'undefined') {\n if (!defaults[attr]) {\n return;\n }\n attributes[attr] = defaults[attr];\n }\n if (attributes[attr].indexOf('url(') === 0) {\n return;\n }\n const color = new Color(attributes[attr]);\n attributes[attr] = color\n .setAlpha(toFixed(color.getAlpha() * attributes[colorAttr], 2))\n .toRgba();\n });\n return attributes;\n}\n","import { DEFAULT_SVG_FONT_SIZE } from '../constants';\nimport { parseUnit } from '../util/misc/svgParsing';\nimport { cPath, fSize, svgValidParentsRegEx } from './constants';\nimport { getGlobalStylesForElement } from './getGlobalStylesForElement';\nimport { normalizeAttr } from './normalizeAttr';\nimport { normalizeValue } from './normalizeValue';\nimport { parseFontDeclaration } from './parseFontDeclaration';\nimport { parseStyleAttribute } from './parseStyleAttribute';\nimport { setStrokeFillOpacity } from './setStrokeFillOpacity';\nimport type { CSSRules } from './typedefs';\n\n/**\n * Returns an object of attributes' name/value, given element and an array of attribute names;\n * Parses parent \"g\" nodes recursively upwards.\n * @param {SVGElement | HTMLElement} element Element to parse\n * @param {Array} attributes Array of attributes to parse\n * @return {Object} object containing parsed attributes' names/values\n */\nexport function parseAttributes(\n element: HTMLElement | SVGElement | null,\n attributes: string[],\n cssRules?: CSSRules,\n): Record {\n if (!element) {\n return {};\n }\n\n let parentAttributes: Record = {},\n fontSize: number,\n parentFontSize = DEFAULT_SVG_FONT_SIZE;\n\n // if there's a parent container (`g` or `a` or `symbol` node), parse its attributes recursively upwards\n if (\n element.parentNode &&\n svgValidParentsRegEx.test(element.parentNode.nodeName)\n ) {\n parentAttributes = parseAttributes(\n element.parentElement,\n attributes,\n cssRules,\n );\n if (parentAttributes.fontSize) {\n fontSize = parentFontSize = parseUnit(parentAttributes.fontSize);\n }\n }\n\n const ownAttributes: Record = {\n ...attributes.reduce>((memo, attr) => {\n const value = element.getAttribute(attr);\n if (value) {\n memo[attr] = value;\n }\n return memo;\n }, {}),\n // add values parsed from style, which take precedence over attributes\n // (see: http://www.w3.org/TR/SVG/styling.html#UsingPresentationAttributes)\n ...getGlobalStylesForElement(element, cssRules),\n ...parseStyleAttribute(element),\n };\n\n if (ownAttributes[cPath]) {\n element.setAttribute(cPath, ownAttributes[cPath]);\n }\n if (ownAttributes[fSize]) {\n // looks like the minimum should be 9px when dealing with ems. this is what looks like in browsers.\n fontSize = parseUnit(ownAttributes[fSize], parentFontSize);\n ownAttributes[fSize] = `${fontSize}`;\n }\n\n // this should have its own complex type\n const normalizedStyle: Record<\n string,\n string | boolean | number | number[] | null\n > = {};\n for (const attr in ownAttributes) {\n const normalizedAttr = normalizeAttr(attr);\n const normalizedValue = normalizeValue(\n normalizedAttr,\n ownAttributes[attr],\n parentAttributes,\n fontSize!,\n );\n normalizedStyle[normalizedAttr] = normalizedValue;\n }\n if (normalizedStyle && normalizedStyle.font) {\n parseFontDeclaration(normalizedStyle.font as string, normalizedStyle);\n }\n const mergedAttrs = { ...parentAttributes, ...normalizedStyle };\n return svgValidParentsRegEx.test(element.nodeName)\n ? mergedAttrs\n : setStrokeFillOpacity(mergedAttrs);\n}\n","import { parseUnit } from '../util/misc/svgParsing';\nimport { reFontDeclaration } from './constants';\n\n/**\n * Parses a short font declaration, building adding its properties to a style object\n * @static\n * @function\n * @param {String} value font declaration\n * @param {Object} oStyle definition\n */\nexport function parseFontDeclaration(\n value: string,\n oStyle: Record,\n): void {\n const match = value.match(reFontDeclaration);\n\n if (!match) {\n return;\n }\n const fontStyle = match[1],\n // font variant is not used\n // fontVariant = match[2],\n fontWeight = match[3],\n fontSize = match[4],\n lineHeight = match[5],\n fontFamily = match[6];\n\n if (fontStyle) {\n oStyle.fontStyle = fontStyle;\n }\n if (fontWeight) {\n oStyle.fontWeight = isNaN(parseFloat(fontWeight))\n ? fontWeight\n : parseFloat(fontWeight);\n }\n if (fontSize) {\n oStyle.fontSize = parseUnit(fontSize);\n }\n if (fontFamily) {\n oStyle.fontFamily = fontFamily;\n }\n if (lineHeight) {\n oStyle.lineHeight = lineHeight === 'normal' ? 1 : lineHeight;\n }\n}\n","import { kRect } from '../constants';\nimport { SHARED_ATTRIBUTES } from '../parser/attributes';\nimport { parseAttributes } from '../parser/parseAttributes';\nimport type { Abortable, TClassProperties, TOptions } from '../typedefs';\nimport { classRegistry } from '../ClassRegistry';\nimport { FabricObject, cacheProperties } from './Object/FabricObject';\nimport type { FabricObjectProps, SerializedObjectProps } from './Object/types';\nimport type { ObjectEvents } from '../EventTypeDefs';\nimport type { CSSRules } from '../parser/typedefs';\n\nexport const rectDefaultValues: Partial> = {\n rx: 0,\n ry: 0,\n};\n\ninterface UniqueRectProps {\n rx: number;\n ry: number;\n}\n\nexport interface SerializedRectProps\n extends SerializedObjectProps,\n UniqueRectProps {}\n\nexport interface RectProps extends FabricObjectProps, UniqueRectProps {}\n\nconst RECT_PROPS = ['rx', 'ry'] as const;\n\nexport class Rect<\n Props extends TOptions = Partial,\n SProps extends SerializedRectProps = SerializedRectProps,\n EventSpec extends ObjectEvents = ObjectEvents,\n >\n extends FabricObject\n implements RectProps\n{\n /**\n * Horizontal border radius\n * @type Number\n */\n declare rx: number;\n\n /**\n * Vertical border radius\n * @type Number\n */\n declare ry: number;\n\n static type = 'Rect';\n\n static cacheProperties = [...cacheProperties, ...RECT_PROPS];\n\n static ownDefaults = rectDefaultValues;\n\n static getDefaults(): Record {\n return {\n ...super.getDefaults(),\n ...Rect.ownDefaults,\n };\n }\n\n /**\n * Constructor\n * @param {Object} [options] Options object\n */\n constructor(options?: Props) {\n super();\n Object.assign(this, Rect.ownDefaults);\n this.setOptions(options);\n this._initRxRy();\n }\n /**\n * Initializes rx/ry attributes\n * @private\n */\n _initRxRy() {\n const { rx, ry } = this;\n if (rx && !ry) {\n this.ry = rx;\n } else if (ry && !rx) {\n this.rx = ry;\n }\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _render(ctx: CanvasRenderingContext2D) {\n const { width: w, height: h } = this;\n const x = -w / 2;\n const y = -h / 2;\n const rx = this.rx ? Math.min(this.rx, w / 2) : 0;\n const ry = this.ry ? Math.min(this.ry, h / 2) : 0;\n const isRounded = rx !== 0 || ry !== 0;\n\n ctx.beginPath();\n\n ctx.moveTo(x + rx, y);\n\n ctx.lineTo(x + w - rx, y);\n isRounded &&\n ctx.bezierCurveTo(\n x + w - kRect * rx,\n y,\n x + w,\n y + kRect * ry,\n x + w,\n y + ry,\n );\n\n ctx.lineTo(x + w, y + h - ry);\n isRounded &&\n ctx.bezierCurveTo(\n x + w,\n y + h - kRect * ry,\n x + w - kRect * rx,\n y + h,\n x + w - rx,\n y + h,\n );\n\n ctx.lineTo(x + rx, y + h);\n isRounded &&\n ctx.bezierCurveTo(\n x + kRect * rx,\n y + h,\n x,\n y + h - kRect * ry,\n x,\n y + h - ry,\n );\n\n ctx.lineTo(x, y + ry);\n isRounded &&\n ctx.bezierCurveTo(x, y + kRect * ry, x + kRect * rx, y, x + rx, y);\n\n ctx.closePath();\n\n this._renderPaintInOrder(ctx);\n }\n\n /**\n * Returns object representation of an instance\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} object representation of an instance\n */\n toObject<\n T extends Omit, keyof SProps>,\n K extends keyof T = never,\n >(propertiesToInclude: K[] = []): Pick & SProps {\n return super.toObject([...RECT_PROPS, ...propertiesToInclude]);\n }\n\n /**\n * Returns svg representation of an instance\n * @return {Array} an array of strings with the specific svg representation\n * of the instance\n */\n _toSVG() {\n const { width, height, rx, ry } = this;\n return [\n '\\n`,\n ];\n }\n\n /**\n * List of attribute names to account for when parsing SVG element (used by `Rect.fromElement`)\n * @see: http://www.w3.org/TR/SVG/shapes.html#RectElement\n */\n static ATTRIBUTE_NAMES = [\n ...SHARED_ATTRIBUTES,\n 'x',\n 'y',\n 'rx',\n 'ry',\n 'width',\n 'height',\n ];\n\n /* _FROM_SVG_START_ */\n\n /**\n * Returns {@link Rect} instance from an SVG element\n * @param {HTMLElement} element Element to parse\n * @param {Object} [options] Options object\n */\n static async fromElement(\n element: HTMLElement | SVGElement,\n options?: Abortable,\n cssRules?: CSSRules,\n ) {\n const {\n left = 0,\n top = 0,\n width = 0,\n height = 0,\n visible = true,\n ...restOfparsedAttributes\n } = parseAttributes(element, this.ATTRIBUTE_NAMES, cssRules);\n\n return new this({\n ...options,\n ...restOfparsedAttributes,\n left,\n top,\n width,\n height,\n visible: Boolean(visible && width && height),\n });\n }\n\n /* _FROM_SVG_END_ */\n}\n\nclassRegistry.setClass(Rect);\nclassRegistry.setSVGClass(Rect);\n","export const LAYOUT_TYPE_INITIALIZATION = 'initialization';\nexport const LAYOUT_TYPE_ADDED = 'added';\nexport const LAYOUT_TYPE_REMOVED = 'removed';\nexport const LAYOUT_TYPE_IMPERATIVE = 'imperative';\nexport const LAYOUT_TYPE_OBJECT_MODIFIED = 'object_modified';\nexport const LAYOUT_TYPE_OBJECT_MODIFYING = 'object_modifying';\n","import { Point, ZERO } from '../../Point';\nimport type { Group } from '../../shapes/Group';\nimport type { FabricObject } from '../../shapes/Object/FabricObject';\nimport { multiplyTransformMatrixArray } from '../../util/misc/matrix';\nimport { sizeAfterTransform } from '../../util/misc/objectTransforms';\nimport {\n calcPlaneChangeMatrix,\n sendVectorToPlane,\n} from '../../util/misc/planeChange';\n\n/**\n * @returns 2 points, the tl and br corners of the non rotated bounding box of an object\n * in the {@link group} plane, taking into account objects that {@link group} is their parent\n * but also belong to the active selection.\n */\nexport const getObjectBounds = (\n destinationGroup: Group,\n object: FabricObject,\n): Point[] => {\n const {\n strokeUniform,\n strokeWidth,\n width,\n height,\n group: currentGroup,\n } = object;\n const t =\n currentGroup && currentGroup !== destinationGroup\n ? calcPlaneChangeMatrix(\n currentGroup.calcTransformMatrix(),\n destinationGroup.calcTransformMatrix(),\n )\n : null;\n const objectCenter = t\n ? object.getRelativeCenterPoint().transform(t)\n : object.getRelativeCenterPoint();\n const accountForStroke = !object['isStrokeAccountedForInDimensions']();\n const strokeUniformVector =\n strokeUniform && accountForStroke\n ? sendVectorToPlane(\n new Point(strokeWidth, strokeWidth),\n undefined,\n destinationGroup.calcTransformMatrix(),\n )\n : ZERO;\n const scalingStrokeWidth =\n !strokeUniform && accountForStroke ? strokeWidth : 0;\n const sizeVector = sizeAfterTransform(\n width + scalingStrokeWidth,\n height + scalingStrokeWidth,\n multiplyTransformMatrixArray([t, object.calcOwnMatrix()], true),\n )\n .add(strokeUniformVector)\n .scalarDivide(2);\n return [objectCenter.subtract(sizeVector), objectCenter.add(sizeVector)];\n};\n","import { Point } from '../../Point';\nimport type { FabricObject } from '../../shapes/Object/FabricObject';\nimport { makeBoundingBoxFromPoints } from '../../util/misc/boundingBoxFromPoints';\nimport {\n LAYOUT_TYPE_INITIALIZATION,\n LAYOUT_TYPE_IMPERATIVE,\n} from '../constants';\nimport type {\n InitializationLayoutContext,\n LayoutStrategyResult,\n StrictLayoutContext,\n} from '../types';\nimport { getObjectBounds } from './utils';\n\n/**\n * Exposes a main public method {@link calcLayoutResult} that is used by the `LayoutManager` to perform layout.\n * Returning `undefined` signals the `LayoutManager` to skip the layout.\n *\n * In charge of calculating the bounding box of the passed objects.\n */\nexport abstract class LayoutStrategy {\n /**\n * override by subclass for persistence (TS does not support `static abstract`)\n */\n static type = 'strategy';\n\n /**\n * Used by the `LayoutManager` to perform layout\n * @TODO/fix: if this method is calcResult, should calc unconditionally.\n * the condition to not calc should be evaluated by the layoutManager.\n * @returns layout result **OR** `undefined` to skip layout\n */\n public calcLayoutResult(\n context: StrictLayoutContext,\n objects: FabricObject[],\n ): LayoutStrategyResult | undefined {\n if (this.shouldPerformLayout(context)) {\n return this.calcBoundingBox(objects, context);\n }\n }\n\n shouldPerformLayout({ type, prevStrategy, strategy }: StrictLayoutContext) {\n return (\n type === LAYOUT_TYPE_INITIALIZATION ||\n type === LAYOUT_TYPE_IMPERATIVE ||\n (!!prevStrategy && strategy !== prevStrategy)\n );\n }\n\n shouldLayoutClipPath({ type, target: { clipPath } }: StrictLayoutContext) {\n return (\n type !== LAYOUT_TYPE_INITIALIZATION &&\n clipPath &&\n !clipPath.absolutePositioned\n );\n }\n\n getInitialSize(\n context: StrictLayoutContext & InitializationLayoutContext,\n result: Pick,\n ) {\n return result.size;\n }\n\n /**\n * Override this method to customize layout.\n */\n calcBoundingBox(\n objects: FabricObject[],\n context: StrictLayoutContext,\n ): LayoutStrategyResult | undefined {\n const { type, target } = context;\n if (type === LAYOUT_TYPE_IMPERATIVE && context.overrides) {\n return context.overrides;\n }\n if (objects.length === 0) {\n return;\n }\n const { left, top, width, height } = makeBoundingBoxFromPoints(\n objects\n .map((object) => getObjectBounds(target, object))\n .reduce((coords, curr) => coords.concat(curr), []),\n );\n const bboxSize = new Point(width, height);\n const bboxLeftTop = new Point(left, top);\n const bboxCenter = bboxLeftTop.add(bboxSize.scalarDivide(2));\n\n if (type === LAYOUT_TYPE_INITIALIZATION) {\n const actualSize = this.getInitialSize(context, {\n size: bboxSize,\n center: bboxCenter,\n });\n return {\n // in `initialization` we do not account for target's transformation matrix\n center: bboxCenter,\n // TODO: investigate if this is still necessary\n relativeCorrection: new Point(0, 0),\n size: actualSize,\n };\n } else {\n // we send `relativeCenter` up to group's containing plane\n const center = bboxCenter.transform(target.calcOwnMatrix());\n return {\n center,\n size: bboxSize,\n };\n }\n }\n}\n","import type { StrictLayoutContext } from '../types';\nimport { LayoutStrategy } from './LayoutStrategy';\nimport { classRegistry } from '../../ClassRegistry';\n\n/**\n * Layout will adjust the bounding box to fit target's objects.\n */\nexport class FitContentLayout extends LayoutStrategy {\n static readonly type = 'fit-content';\n\n /**\n * @override layout on all triggers\n * Override at will\n */\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n shouldPerformLayout(context: StrictLayoutContext) {\n return true;\n }\n}\n\nclassRegistry.setClass(FitContentLayout);\n","import { Point } from '../Point';\nimport {\n CENTER,\n CHANGED,\n MODIFIED,\n MODIFY_PATH,\n MODIFY_POLY,\n MOVING,\n RESIZING,\n ROTATING,\n SCALING,\n SKEWING,\n iMatrix,\n} from '../constants';\nimport type { Group } from '../shapes/Group';\nimport type { FabricObject } from '../shapes/Object/FabricObject';\nimport { invertTransform } from '../util/misc/matrix';\nimport { resolveOrigin } from '../util/misc/resolveOrigin';\nimport { FitContentLayout } from './LayoutStrategies/FitContentLayout';\nimport type { LayoutStrategy } from './LayoutStrategies/LayoutStrategy';\nimport {\n LAYOUT_TYPE_INITIALIZATION,\n LAYOUT_TYPE_ADDED,\n LAYOUT_TYPE_REMOVED,\n LAYOUT_TYPE_IMPERATIVE,\n LAYOUT_TYPE_OBJECT_MODIFIED,\n LAYOUT_TYPE_OBJECT_MODIFYING,\n} from './constants';\nimport type {\n LayoutContext,\n LayoutResult,\n RegistrationContext,\n StrictLayoutContext,\n} from './types';\nimport { classRegistry } from '../ClassRegistry';\nimport type { TModificationEvents } from '../EventTypeDefs';\n\nconst LAYOUT_MANAGER = 'layoutManager';\n\nexport type SerializedLayoutManager = {\n type: string;\n strategy: string;\n};\n\nexport class LayoutManager {\n declare private _prevLayoutStrategy?: LayoutStrategy;\n declare protected _subscriptions: Map;\n\n strategy: LayoutStrategy;\n\n constructor(strategy: LayoutStrategy = new FitContentLayout()) {\n this.strategy = strategy;\n this._subscriptions = new Map();\n }\n\n public performLayout(context: LayoutContext) {\n const strictContext: StrictLayoutContext = {\n bubbles: true,\n strategy: this.strategy,\n ...context,\n prevStrategy: this._prevLayoutStrategy,\n stopPropagation() {\n this.bubbles = false;\n },\n };\n\n this.onBeforeLayout(strictContext);\n\n const layoutResult = this.getLayoutResult(strictContext);\n if (layoutResult) {\n this.commitLayout(strictContext, layoutResult);\n }\n\n this.onAfterLayout(strictContext, layoutResult);\n this._prevLayoutStrategy = strictContext.strategy;\n }\n\n /**\n * Attach handlers for events that we know will invalidate the layout when\n * performed on child objects ( general transforms ).\n * Returns the disposers for later unsubscribing and cleanup\n * @param {FabricObject} object\n * @param {RegistrationContext & Partial} context\n * @returns {VoidFunction[]} disposers remove the handlers\n */\n protected attachHandlers(\n object: FabricObject,\n context: RegistrationContext & Partial,\n ): VoidFunction[] {\n const { target } = context;\n return (\n [\n MODIFIED,\n MOVING,\n RESIZING,\n ROTATING,\n SCALING,\n SKEWING,\n CHANGED,\n MODIFY_POLY,\n MODIFY_PATH,\n ] as (TModificationEvents & 'modified')[]\n ).map((key) =>\n object.on(key, (e) =>\n this.performLayout(\n key === MODIFIED\n ? {\n type: LAYOUT_TYPE_OBJECT_MODIFIED,\n trigger: key,\n e,\n target,\n }\n : {\n type: LAYOUT_TYPE_OBJECT_MODIFYING,\n trigger: key,\n e,\n target,\n },\n ),\n ),\n );\n }\n\n /**\n * Subscribe an object to transform events that will trigger a layout change on the parent\n * This is important only for interactive groups.\n * @param object\n * @param context\n */\n protected subscribe(\n object: FabricObject,\n context: RegistrationContext & Partial,\n ) {\n this.unsubscribe(object, context);\n const disposers = this.attachHandlers(object, context);\n this._subscriptions.set(object, disposers);\n }\n\n /**\n * unsubscribe object layout triggers\n */\n protected unsubscribe(\n object: FabricObject,\n _context?: RegistrationContext & Partial,\n ) {\n (this._subscriptions.get(object) || []).forEach((d) => d());\n this._subscriptions.delete(object);\n }\n\n unsubscribeTargets(\n context: RegistrationContext & Partial,\n ) {\n context.targets.forEach((object) => this.unsubscribe(object, context));\n }\n\n subscribeTargets(\n context: RegistrationContext & Partial,\n ) {\n context.targets.forEach((object) => this.subscribe(object, context));\n }\n\n protected onBeforeLayout(context: StrictLayoutContext) {\n const { target, type } = context;\n const { canvas } = target;\n // handle layout triggers subscription\n // @TODO: gate the registration when the group is interactive\n if (type === LAYOUT_TYPE_INITIALIZATION || type === LAYOUT_TYPE_ADDED) {\n this.subscribeTargets(context);\n } else if (type === LAYOUT_TYPE_REMOVED) {\n this.unsubscribeTargets(context);\n }\n // fire layout event (event will fire only for layouts after initialization layout)\n target.fire('layout:before', {\n context,\n });\n canvas &&\n canvas.fire('object:layout:before', {\n target,\n context,\n });\n\n if (type === LAYOUT_TYPE_IMPERATIVE && context.deep) {\n const { strategy: _, ...tricklingContext } = context;\n // traverse the tree\n target.forEachObject(\n (object) =>\n (object as Group).layoutManager &&\n (object as Group).layoutManager.performLayout({\n ...tricklingContext,\n bubbles: false,\n target: object as Group,\n }),\n );\n }\n }\n\n protected getLayoutResult(\n context: StrictLayoutContext,\n ): Required | undefined {\n const { target, strategy, type } = context;\n\n const result = strategy.calcLayoutResult(context, target.getObjects());\n\n if (!result) {\n return;\n }\n\n const prevCenter =\n type === LAYOUT_TYPE_INITIALIZATION\n ? new Point()\n : target.getRelativeCenterPoint();\n\n const {\n center: nextCenter,\n correction = new Point(),\n relativeCorrection = new Point(),\n } = result;\n const offset = prevCenter\n .subtract(nextCenter)\n .add(correction)\n .transform(\n // in `initialization` we do not account for target's transformation matrix\n type === LAYOUT_TYPE_INITIALIZATION\n ? iMatrix\n : invertTransform(target.calcOwnMatrix()),\n true,\n )\n .add(relativeCorrection);\n\n return {\n result,\n prevCenter,\n nextCenter,\n offset,\n };\n }\n\n protected commitLayout(\n context: StrictLayoutContext,\n layoutResult: Required,\n ) {\n const { target } = context;\n const {\n result: { size },\n nextCenter,\n } = layoutResult;\n // set dimensions\n target.set({ width: size.x, height: size.y });\n // layout descendants\n this.layoutObjects(context, layoutResult);\n // set position\n // in `initialization` we do not account for target's transformation matrix\n if (context.type === LAYOUT_TYPE_INITIALIZATION) {\n // TODO: what about strokeWidth?\n target.set({\n left:\n context.x ?? nextCenter.x + size.x * resolveOrigin(target.originX),\n top: context.y ?? nextCenter.y + size.y * resolveOrigin(target.originY),\n });\n } else {\n target.setPositionByOrigin(nextCenter, CENTER, CENTER);\n // invalidate\n target.setCoords();\n target.set('dirty', true);\n }\n }\n\n protected layoutObjects(\n context: StrictLayoutContext,\n layoutResult: Required,\n ) {\n const { target } = context;\n // adjust objects to account for new center\n target.forEachObject((object) => {\n object.group === target &&\n this.layoutObject(context, layoutResult, object);\n });\n // adjust clip path to account for new center\n context.strategy.shouldLayoutClipPath(context) &&\n this.layoutObject(context, layoutResult, target.clipPath as FabricObject);\n }\n\n /**\n * @param {FabricObject} object\n * @param {Point} offset\n */\n protected layoutObject(\n context: StrictLayoutContext,\n { offset }: Required,\n object: FabricObject,\n ) {\n // TODO: this is here for cache invalidation.\n // verify if this is necessary since we have explicit\n // cache invalidation at the end of commitLayout\n object.set({\n left: object.left + offset.x,\n top: object.top + offset.y,\n });\n }\n\n protected onAfterLayout(\n context: StrictLayoutContext,\n layoutResult?: LayoutResult,\n ) {\n const {\n target,\n strategy,\n bubbles,\n prevStrategy: _,\n ...bubblingContext\n } = context;\n const { canvas } = target;\n\n // fire layout event (event will fire only for layouts after initialization layout)\n target.fire('layout:after', {\n context,\n result: layoutResult,\n });\n canvas &&\n canvas.fire('object:layout:after', {\n context,\n result: layoutResult,\n target,\n });\n\n // bubble\n const parent = target.parent;\n if (bubbles && parent?.layoutManager) {\n // add target to context#path\n (bubblingContext.path || (bubblingContext.path = [])).push(target);\n // all parents should invalidate their layout\n parent.layoutManager.performLayout({\n ...bubblingContext,\n target: parent,\n });\n }\n target.set('dirty', true);\n }\n\n dispose() {\n const { _subscriptions } = this;\n _subscriptions.forEach((disposers) => disposers.forEach((d) => d()));\n _subscriptions.clear();\n }\n\n toObject() {\n return {\n type: LAYOUT_MANAGER,\n strategy: (this.strategy.constructor as typeof LayoutStrategy).type,\n };\n }\n\n toJSON() {\n return this.toObject();\n }\n}\n\nclassRegistry.setClass(LayoutManager, LAYOUT_MANAGER);\n","import type { CollectionEvents, ObjectEvents } from '../EventTypeDefs';\nimport { createCollectionMixin } from '../Collection';\nimport type {\n TClassProperties,\n TSVGReviver,\n TOptions,\n Abortable,\n} from '../typedefs';\nimport {\n invertTransform,\n multiplyTransformMatrices,\n} from '../util/misc/matrix';\nimport {\n enlivenObjectEnlivables,\n enlivenObjects,\n} from '../util/misc/objectEnlive';\nimport { applyTransformToObject } from '../util/misc/objectTransforms';\nimport { FabricObject } from './Object/FabricObject';\nimport { Rect } from './Rect';\nimport { classRegistry } from '../ClassRegistry';\nimport type { FabricObjectProps, SerializedObjectProps } from './Object/types';\nimport { log } from '../util/internals/console';\nimport type {\n ImperativeLayoutOptions,\n LayoutBeforeEvent,\n LayoutAfterEvent,\n} from '../LayoutManager/types';\nimport { LayoutManager } from '../LayoutManager/LayoutManager';\nimport {\n LAYOUT_TYPE_ADDED,\n LAYOUT_TYPE_IMPERATIVE,\n LAYOUT_TYPE_INITIALIZATION,\n LAYOUT_TYPE_REMOVED,\n} from '../LayoutManager/constants';\nimport type { SerializedLayoutManager } from '../LayoutManager/LayoutManager';\nimport type { FitContentLayout } from '../LayoutManager';\nimport type { DrawContext } from './Object/Object';\n\n/**\n * This class handles the specific case of creating a group using {@link Group#fromObject} and is not meant to be used in any other case.\n * We could have used a boolean in the constructor, as we did previously, but we think the boolean\n * would stay in the group's constructor interface and create confusion, therefore it was removed.\n * This layout manager doesn't do anything and therefore keeps the exact layout the group had when {@link Group#toObject} was called.\n */\nclass NoopLayoutManager extends LayoutManager {\n performLayout() {}\n}\n\nexport interface GroupEvents extends ObjectEvents, CollectionEvents {\n 'layout:before': LayoutBeforeEvent;\n 'layout:after': LayoutAfterEvent;\n}\n\nexport interface GroupOwnProps {\n subTargetCheck: boolean;\n interactive: boolean;\n}\n\nexport interface SerializedGroupProps\n extends SerializedObjectProps,\n GroupOwnProps {\n objects: SerializedObjectProps[];\n layoutManager: SerializedLayoutManager;\n}\n\nexport interface GroupProps extends FabricObjectProps, GroupOwnProps {\n layoutManager: LayoutManager;\n}\n\nexport const groupDefaultValues: Partial> = {\n strokeWidth: 0,\n subTargetCheck: false,\n interactive: false,\n};\n\n/**\n * @fires object:added\n * @fires object:removed\n * @fires layout:before\n * @fires layout:after\n */\nexport class Group\n extends createCollectionMixin(\n FabricObject,\n )\n implements GroupProps\n{\n /**\n * Used to optimize performance\n * set to `false` if you don't need contained objects to be targets of events\n * @type boolean\n */\n declare subTargetCheck: boolean;\n\n /**\n * Used to allow targeting of object inside groups.\n * set to true if you want to select an object inside a group.\\\n * **REQUIRES** `subTargetCheck` set to true\n * This will be not removed but slowly replaced with a method setInteractive\n * that will take care of enabling subTargetCheck and necessary object events.\n * There is too much attached to group interactivity to just be evaluated by a\n * boolean in the code\n * @deprecated\n * @type boolean\n */\n declare interactive: boolean;\n\n declare layoutManager: LayoutManager;\n\n /**\n * Used internally to optimize performance\n * Once an object is selected, instance is rendered without the selected object.\n * This way instance is cached only once for the entire interaction with the selected object.\n * @private\n */\n protected _activeObjects: FabricObject[] = [];\n\n static type = 'Group';\n\n static ownDefaults: Record = groupDefaultValues;\n private __objectSelectionTracker: (ev: ObjectEvents['selected']) => void;\n private __objectSelectionDisposer: (ev: ObjectEvents['deselected']) => void;\n\n static getDefaults(): Record {\n return {\n ...super.getDefaults(),\n ...Group.ownDefaults,\n };\n }\n\n /**\n * Constructor\n *\n * @param {FabricObject[]} [objects] instance objects\n * @param {Object} [options] Options object\n */\n constructor(objects: FabricObject[] = [], options: Partial = {}) {\n super();\n Object.assign(this, Group.ownDefaults);\n this.setOptions(options);\n this.groupInit(objects, options);\n }\n\n /**\n * Shared code between group and active selection\n * Meant to be used by the constructor.\n */\n protected groupInit(\n objects: FabricObject[],\n options: {\n layoutManager?: LayoutManager;\n top?: number;\n left?: number;\n },\n ) {\n this._objects = [...objects]; // Avoid unwanted mutations of Collection to affect the caller\n\n this.__objectSelectionTracker = this.__objectSelectionMonitor.bind(\n this,\n true,\n );\n this.__objectSelectionDisposer = this.__objectSelectionMonitor.bind(\n this,\n false,\n );\n\n this.forEachObject((object) => {\n this.enterGroup(object, false);\n });\n\n // perform initial layout\n this.layoutManager = options.layoutManager ?? new LayoutManager();\n this.layoutManager.performLayout({\n type: LAYOUT_TYPE_INITIALIZATION,\n target: this,\n targets: [...objects],\n // @TODO remove this concept from the layout manager.\n // Layout manager will calculate the correct position,\n // group options can override it later.\n x: options.left,\n y: options.top,\n });\n }\n\n /**\n * Checks if object can enter group and logs relevant warnings\n * @private\n * @param {FabricObject} object\n * @returns\n */\n canEnterGroup(object: FabricObject) {\n if (object === this || this.isDescendantOf(object)) {\n // prevent circular object tree\n log(\n 'error',\n 'Group: circular object trees are not supported, this call has no effect',\n );\n return false;\n } else if (this._objects.indexOf(object) !== -1) {\n // is already in the objects array\n log(\n 'error',\n 'Group: duplicate objects are not supported inside group, this call has no effect',\n );\n return false;\n }\n return true;\n }\n\n /**\n * Override this method to enhance performance (for groups with a lot of objects).\n * If Overriding, be sure not pass illegal objects to group - it will break your app.\n * @private\n */\n protected _filterObjectsBeforeEnteringGroup(objects: FabricObject[]) {\n return objects.filter((object, index, array) => {\n // can enter AND is the first occurrence of the object in the passed args (to prevent adding duplicates)\n return this.canEnterGroup(object) && array.indexOf(object) === index;\n });\n }\n\n /**\n * Add objects\n * @param {...FabricObject[]} objects\n */\n add(...objects: FabricObject[]) {\n const allowedObjects = this._filterObjectsBeforeEnteringGroup(objects);\n const size = super.add(...allowedObjects);\n this._onAfterObjectsChange(LAYOUT_TYPE_ADDED, allowedObjects);\n return size;\n }\n\n /**\n * Inserts an object into collection at specified index\n * @param {FabricObject[]} objects Object to insert\n * @param {Number} index Index to insert object at\n */\n insertAt(index: number, ...objects: FabricObject[]) {\n const allowedObjects = this._filterObjectsBeforeEnteringGroup(objects);\n const size = super.insertAt(index, ...allowedObjects);\n this._onAfterObjectsChange(LAYOUT_TYPE_ADDED, allowedObjects);\n return size;\n }\n\n /**\n * Remove objects\n * @param {...FabricObject[]} objects\n * @returns {FabricObject[]} removed objects\n */\n remove(...objects: FabricObject[]) {\n const removed = super.remove(...objects);\n this._onAfterObjectsChange(LAYOUT_TYPE_REMOVED, removed);\n return removed;\n }\n\n _onObjectAdded(object: FabricObject) {\n this.enterGroup(object, true);\n this.fire('object:added', { target: object });\n object.fire('added', { target: this });\n }\n\n /**\n * @private\n * @param {FabricObject} object\n * @param {boolean} [removeParentTransform] true if object should exit group without applying group's transform to it\n */\n _onObjectRemoved(object: FabricObject, removeParentTransform?: boolean) {\n this.exitGroup(object, removeParentTransform);\n this.fire('object:removed', { target: object });\n object.fire('removed', { target: this });\n }\n\n /**\n * @private\n * @param {'added'|'removed'} type\n * @param {FabricObject[]} targets\n */\n _onAfterObjectsChange(type: 'added' | 'removed', targets: FabricObject[]) {\n this.layoutManager.performLayout({\n type,\n targets,\n target: this,\n });\n }\n\n _onStackOrderChanged() {\n this._set('dirty', true);\n }\n\n /**\n * @private\n * @param {string} key\n * @param {*} value\n */\n _set(key: string, value: any) {\n const prev = this[key as keyof this];\n super._set(key, value);\n if (key === 'canvas' && prev !== value) {\n (this._objects || []).forEach((object) => {\n object._set(key, value);\n });\n }\n return this;\n }\n\n /**\n * @private\n */\n _shouldSetNestedCoords() {\n return this.subTargetCheck;\n }\n\n /**\n * Remove all objects\n * @returns {FabricObject[]} removed objects\n */\n removeAll() {\n this._activeObjects = [];\n return this.remove(...this._objects);\n }\n\n /**\n * keeps track of the selected objects\n * @private\n */\n __objectSelectionMonitor(\n selected: T,\n {\n target: object,\n }: ObjectEvents[T extends true ? 'selected' : 'deselected'],\n ) {\n const activeObjects = this._activeObjects;\n if (selected) {\n activeObjects.push(object);\n this._set('dirty', true);\n } else if (activeObjects.length > 0) {\n const index = activeObjects.indexOf(object);\n if (index > -1) {\n activeObjects.splice(index, 1);\n this._set('dirty', true);\n }\n }\n }\n\n /**\n * @private\n * @param {boolean} watch\n * @param {FabricObject} object\n */\n _watchObject(watch: boolean, object: FabricObject) {\n // make sure we listen only once\n watch && this._watchObject(false, object);\n if (watch) {\n object.on('selected', this.__objectSelectionTracker);\n object.on('deselected', this.__objectSelectionDisposer);\n } else {\n object.off('selected', this.__objectSelectionTracker);\n object.off('deselected', this.__objectSelectionDisposer);\n }\n }\n\n /**\n * @private\n * @param {FabricObject} object\n * @param {boolean} [removeParentTransform] true if object is in canvas coordinate plane\n */\n enterGroup(object: FabricObject, removeParentTransform?: boolean) {\n object.group && object.group.remove(object);\n object._set('parent', this);\n this._enterGroup(object, removeParentTransform);\n }\n\n /**\n * @private\n * @param {FabricObject} object\n * @param {boolean} [removeParentTransform] true if object is in canvas coordinate plane\n */\n _enterGroup(object: FabricObject, removeParentTransform?: boolean) {\n if (removeParentTransform) {\n // can this be converted to utils (sendObjectToPlane)?\n applyTransformToObject(\n object,\n multiplyTransformMatrices(\n invertTransform(this.calcTransformMatrix()),\n object.calcTransformMatrix(),\n ),\n );\n }\n this._shouldSetNestedCoords() && object.setCoords();\n object._set('group', this);\n object._set('canvas', this.canvas);\n this._watchObject(true, object);\n const activeObject =\n this.canvas &&\n this.canvas.getActiveObject &&\n this.canvas.getActiveObject();\n // if we are adding the activeObject in a group\n if (\n activeObject &&\n (activeObject === object || object.isDescendantOf(activeObject))\n ) {\n this._activeObjects.push(object);\n }\n }\n\n /**\n * @private\n * @param {FabricObject} object\n * @param {boolean} [removeParentTransform] true if object should exit group without applying group's transform to it\n */\n exitGroup(object: FabricObject, removeParentTransform?: boolean) {\n this._exitGroup(object, removeParentTransform);\n object._set('parent', undefined);\n object._set('canvas', undefined);\n }\n\n /**\n * Executes the inner fabric logic of exiting a group.\n * - Stop watching the object\n * - Remove the object from the optimization map this._activeObjects\n * - unset the group property of the object\n * @protected\n * @param {FabricObject} object\n * @param {boolean} [removeParentTransform] true if object should exit group without applying group's transform to it\n */\n _exitGroup(object: FabricObject, removeParentTransform?: boolean) {\n object._set('group', undefined);\n if (!removeParentTransform) {\n applyTransformToObject(\n object,\n multiplyTransformMatrices(\n this.calcTransformMatrix(),\n object.calcTransformMatrix(),\n ),\n );\n object.setCoords();\n }\n this._watchObject(false, object);\n const index =\n this._activeObjects.length > 0 ? this._activeObjects.indexOf(object) : -1;\n if (index > -1) {\n this._activeObjects.splice(index, 1);\n }\n }\n\n /**\n * Decide if the group should cache or not. Create its own cache level\n * needsItsOwnCache should be used when the object drawing method requires\n * a cache step.\n * Generally you do not cache objects in groups because the group is already cached.\n * @return {Boolean}\n */\n shouldCache() {\n const ownCache = FabricObject.prototype.shouldCache.call(this);\n if (ownCache) {\n for (let i = 0; i < this._objects.length; i++) {\n if (this._objects[i].willDrawShadow()) {\n this.ownCaching = false;\n return false;\n }\n }\n }\n return ownCache;\n }\n\n /**\n * Check if this object or a child object will cast a shadow\n * @return {Boolean}\n */\n willDrawShadow() {\n if (super.willDrawShadow()) {\n return true;\n }\n for (let i = 0; i < this._objects.length; i++) {\n if (this._objects[i].willDrawShadow()) {\n return true;\n }\n }\n return false;\n }\n\n /**\n * Check if instance or its group are caching, recursively up\n * @return {Boolean}\n */\n isOnACache(): boolean {\n return this.ownCaching || (!!this.parent && this.parent.isOnACache());\n }\n\n /**\n * Execute the drawing operation for an object on a specified context\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n drawObject(\n ctx: CanvasRenderingContext2D,\n forClipping: boolean | undefined,\n context: DrawContext,\n ) {\n this._renderBackground(ctx);\n for (let i = 0; i < this._objects.length; i++) {\n const obj = this._objects[i];\n // TODO: handle rendering edge case somehow\n if (this.canvas?.preserveObjectStacking && obj.group !== this) {\n ctx.save();\n ctx.transform(...invertTransform(this.calcTransformMatrix()));\n obj.render(ctx);\n ctx.restore();\n } else if (obj.group === this) {\n obj.render(ctx);\n }\n }\n this._drawClipPath(ctx, this.clipPath, context);\n }\n\n /**\n * @override\n * @return {Boolean}\n */\n setCoords() {\n super.setCoords();\n this._shouldSetNestedCoords() &&\n this.forEachObject((object) => object.setCoords());\n }\n\n triggerLayout(options: ImperativeLayoutOptions = {}) {\n this.layoutManager.performLayout({\n target: this,\n type: LAYOUT_TYPE_IMPERATIVE,\n ...options,\n });\n }\n\n /**\n * Renders instance on a given context\n * @param {CanvasRenderingContext2D} ctx context to render instance on\n */\n render(ctx: CanvasRenderingContext2D) {\n this._transformDone = true;\n super.render(ctx);\n this._transformDone = false;\n }\n\n /**\n *\n * @private\n * @param {'toObject'|'toDatalessObject'} [method]\n * @param {string[]} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @returns {FabricObject[]} serialized objects\n */\n __serializeObjects(\n method: 'toObject' | 'toDatalessObject',\n propertiesToInclude?: string[],\n ) {\n const _includeDefaultValues = this.includeDefaultValues;\n return this._objects\n .filter(function (obj) {\n return !obj.excludeFromExport;\n })\n .map(function (obj) {\n const originalDefaults = obj.includeDefaultValues;\n obj.includeDefaultValues = _includeDefaultValues;\n const data = obj[method || 'toObject'](propertiesToInclude);\n obj.includeDefaultValues = originalDefaults;\n // delete data.version;\n return data;\n });\n }\n\n /**\n * Returns object representation of an instance\n * @param {string[]} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} object representation of an instance\n */\n toObject<\n T extends Omit<\n GroupProps & TClassProperties,\n keyof SerializedGroupProps\n >,\n K extends keyof T = never,\n >(propertiesToInclude: K[] = []): Pick & SerializedGroupProps {\n const layoutManager = this.layoutManager.toObject();\n\n return {\n ...super.toObject([\n 'subTargetCheck',\n 'interactive',\n ...propertiesToInclude,\n ]),\n ...(layoutManager.strategy !== 'fit-content' || this.includeDefaultValues\n ? { layoutManager }\n : {}),\n objects: this.__serializeObjects(\n 'toObject',\n propertiesToInclude as string[],\n ),\n };\n }\n\n toString() {\n return `#`;\n }\n\n dispose() {\n this.layoutManager.unsubscribeTargets({\n targets: this.getObjects(),\n target: this,\n });\n this._activeObjects = [];\n this.forEachObject((object) => {\n this._watchObject(false, object);\n object.dispose();\n });\n super.dispose();\n }\n\n /**\n * @private\n */\n _createSVGBgRect(reviver?: TSVGReviver) {\n if (!this.backgroundColor) {\n return '';\n }\n const fillStroke = Rect.prototype._toSVG.call(this);\n const commons = fillStroke.indexOf('COMMON_PARTS');\n fillStroke[commons] = 'for=\"group\" ';\n const markup = fillStroke.join('');\n return reviver ? reviver(markup) : markup;\n }\n\n /**\n * Returns svg representation of an instance\n * @param {TSVGReviver} [reviver] Method for further parsing of svg representation.\n * @return {String} svg representation of an instance\n */\n _toSVG(reviver?: TSVGReviver) {\n const svgString = ['\\n'];\n const bg = this._createSVGBgRect(reviver);\n bg && svgString.push('\\t\\t', bg);\n for (let i = 0; i < this._objects.length; i++) {\n svgString.push('\\t\\t', this._objects[i].toSVG(reviver));\n }\n svgString.push('\\n');\n return svgString;\n }\n\n /**\n * Returns styles-string for svg-export, specific version for group\n * @return {String}\n */\n getSvgStyles(): string {\n const opacity =\n typeof this.opacity !== 'undefined' && this.opacity !== 1\n ? `opacity: ${this.opacity};`\n : '',\n visibility = this.visible ? '' : ' visibility: hidden;';\n return [opacity, this.getSvgFilter(), visibility].join('');\n }\n\n /**\n * Returns svg clipPath representation of an instance\n * @param {Function} [reviver] Method for further parsing of svg representation.\n * @return {String} svg representation of an instance\n */\n toClipPathSVG(reviver?: TSVGReviver): string {\n const svgString = [];\n const bg = this._createSVGBgRect(reviver);\n bg && svgString.push('\\t', bg);\n for (let i = 0; i < this._objects.length; i++) {\n svgString.push('\\t', this._objects[i].toClipPathSVG(reviver));\n }\n return this._createBaseClipPathSVGMarkup(svgString, {\n reviver,\n });\n }\n\n /**\n * @todo support loading from svg\n * @private\n * @param {Object} object Object to create a group from\n * @returns {Promise}\n */\n static fromObject>(\n { type, objects = [], layoutManager, ...options }: T,\n abortable?: Abortable,\n ) {\n return Promise.all([\n enlivenObjects(objects, abortable),\n enlivenObjectEnlivables(options, abortable),\n ]).then(([objects, hydratedOptions]) => {\n const group = new this(objects, {\n ...options,\n ...hydratedOptions,\n layoutManager: new NoopLayoutManager(),\n });\n if (layoutManager) {\n const layoutClass = classRegistry.getClass(\n layoutManager.type,\n );\n const strategyClass = classRegistry.getClass(\n layoutManager.strategy,\n );\n group.layoutManager = new layoutClass(new strategyClass());\n } else {\n group.layoutManager = new LayoutManager();\n }\n group.layoutManager.subscribeTargets({\n type: LAYOUT_TYPE_INITIALIZATION,\n target: group,\n targets: group.getObjects(),\n });\n group.setCoords();\n return group;\n });\n }\n}\n\nclassRegistry.setClass(Group);\n","import type { GroupProps } from '../../shapes/Group';\nimport { Group } from '../../shapes/Group';\nimport type { FabricObject } from '../../shapes/Object/FabricObject';\n\n/**\n * TODO experiment with different layout manager and svg results ( fixed fit content )\n * Groups SVG elements (usually those retrieved from SVG document)\n * @static\n * @param {FabricObject[]} elements FabricObject(s) parsed from svg, to group\n * @return {FabricObject | Group}\n */\nexport const groupSVGElements = (\n elements: FabricObject[],\n options?: Partial,\n) => {\n if (elements && elements.length === 1) {\n return elements[0];\n }\n return new Group(elements, options);\n};\n","import type { TSize } from '../../typedefs';\n\n/**\n * Finds the scale for the object source to fit inside the object destination,\n * keeping aspect ratio intact.\n * respect the total allowed area for the cache.\n * @param {TSize} source natural unscaled size of the object\n * @param {TSize} destination natural unscaled size of the object\n * @return {Number} scale factor to apply to source to fit into destination\n */\nexport const findScaleToFit = (source: TSize, destination: TSize) =>\n Math.min(\n destination.width / source.width,\n destination.height / source.height,\n );\n\n/**\n * Finds the scale for the object source to cover entirely the object destination,\n * keeping aspect ratio intact.\n * respect the total allowed area for the cache.\n * @param {TSize} source natural unscaled size of the object\n * @param {TSize} destination natural unscaled size of the object\n * @return {Number} scale factor to apply to source to cover destination\n */\nexport const findScaleToCover = (source: TSize, destination: TSize) =>\n Math.max(\n destination.width / source.width,\n destination.height / source.height,\n );\n","import { reNum } from '../../parser/constants';\n\nconst commaWsp = `\\\\s*,?\\\\s*`;\n\n/**\n * p for param\n * using \"bad naming\" here because it makes the regex much easier to read\n * p is a number that is preceded by an arbitary number of spaces, maybe 0,\n * a comma or not, and then possibly more spaces or not.\n */\nconst p = `${commaWsp}(${reNum})`;\n\n// const reMoveToCommand = `(M) ?(?:${p}${p} ?)+`;\n\n// const reLineCommand = `(L) ?(?:${p}${p} ?)+`;\n\n// const reHorizontalLineCommand = `(H) ?(?:${p} ?)+`;\n\n// const reVerticalLineCommand = `(V) ?(?:${p} ?)+`;\n\n// const reClosePathCommand = String.raw`(Z)\\s*`;\n\n// const reCubicCurveCommand = `(C) ?(?:${p}${p}${p}${p}${p}${p} ?)+`;\n\n// const reCubicCurveShortcutCommand = `(S) ?(?:${p}${p}${p}${p} ?)+`;\n\n// const reQuadraticCurveCommand = `(Q) ?(?:${p}${p}${p}${p} ?)+`;\n\n// const reQuadraticCurveShortcutCommand = `(T) ?(?:${p}${p} ?)+`;\n\nexport const reArcCommandPoints = `${p}${p}${p}${commaWsp}([01])${commaWsp}([01])${p}${p}`;\n// const reArcCommand = `(A) ?(?:${reArcCommandPoints} ?)+`;\n\n// export const rePathCommandGroups =\n// `(?:(?:${reMoveToCommand})` +\n// `|(?:${reLineCommand})` +\n// `|(?:${reHorizontalLineCommand})` +\n// `|(?:${reVerticalLineCommand})` +\n// `|(?:${reClosePathCommand})` +\n// `|(?:${reCubicCurveCommand})` +\n// `|(?:${reCubicCurveShortcutCommand})` +\n// `|(?:${reQuadraticCurveCommand})` +\n// `|(?:${reQuadraticCurveShortcutCommand})` +\n// `|(?:${reArcCommand}))`;\n\nexport const rePathCommand = '[mzlhvcsqta][^mzlhvcsqta]*';\n","import { cache } from '../../cache';\nimport { config } from '../../config';\nimport { halfPI, PiBy180 } from '../../constants';\nimport type { TMat2D, TRadian, TRectBounds } from '../../typedefs';\nimport { cos } from '../misc/cos';\nimport { multiplyTransformMatrices, transformPoint } from '../misc/matrix';\nimport { sin } from '../misc/sin';\nimport { toFixed } from '../misc/toFixed';\nimport type {\n TCurveInfo,\n TComplexPathData,\n TParsedAbsoluteCubicCurveCommand,\n TPathSegmentInfo,\n TPointAngle,\n TSimpleParsedCommand,\n TSimplePathData,\n TPathSegmentCommandInfo,\n TComplexParsedCommand,\n TPathSegmentInfoCommon,\n TEndPathInfo,\n TParsedArcCommand,\n TComplexParsedCommandType,\n} from './typedefs';\nimport type { XY } from '../../Point';\nimport { Point } from '../../Point';\nimport { reArcCommandPoints, rePathCommand } from './regex';\nimport { reNum } from '../../parser/constants';\n\n/**\n * Commands that may be repeated\n */\nconst repeatedCommands: Record = {\n m: 'l',\n M: 'L',\n};\n\n/**\n * Convert an arc of a rotated ellipse to a Bezier Curve\n * @param {TRadian} theta1 start of the arc\n * @param {TRadian} theta2 end of the arc\n * @param cosTh cosine of the angle of rotation\n * @param sinTh sine of the angle of rotation\n * @param rx x-axis radius (before rotation)\n * @param ry y-axis radius (before rotation)\n * @param cx1 center x of the ellipse\n * @param cy1 center y of the ellipse\n * @param mT\n * @param fromX starting point of arc x\n * @param fromY starting point of arc y\n */\nconst segmentToBezier = (\n theta1: TRadian,\n theta2: TRadian,\n cosTh: number,\n sinTh: number,\n rx: number,\n ry: number,\n cx1: number,\n cy1: number,\n mT: number,\n fromX: number,\n fromY: number,\n): TParsedAbsoluteCubicCurveCommand => {\n const costh1 = cos(theta1),\n sinth1 = sin(theta1),\n costh2 = cos(theta2),\n sinth2 = sin(theta2),\n toX = cosTh * rx * costh2 - sinTh * ry * sinth2 + cx1,\n toY = sinTh * rx * costh2 + cosTh * ry * sinth2 + cy1,\n cp1X = fromX + mT * (-cosTh * rx * sinth1 - sinTh * ry * costh1),\n cp1Y = fromY + mT * (-sinTh * rx * sinth1 + cosTh * ry * costh1),\n cp2X = toX + mT * (cosTh * rx * sinth2 + sinTh * ry * costh2),\n cp2Y = toY + mT * (sinTh * rx * sinth2 - cosTh * ry * costh2);\n\n return ['C', cp1X, cp1Y, cp2X, cp2Y, toX, toY];\n};\n\n/**\n * Adapted from {@link http://dxr.mozilla.org/mozilla-central/source/dom/svg/SVGPathDataParser.cpp}\n * by Andrea Bogazzi code is under MPL. if you don't have a copy of the license you can take it here\n * http://mozilla.org/MPL/2.0/\n * @param toX\n * @param toY\n * @param rx\n * @param ry\n * @param {number} large 0 or 1 flag\n * @param {number} sweep 0 or 1 flag\n * @param rotateX\n */\nconst arcToSegments = (\n toX: number,\n toY: number,\n rx: number,\n ry: number,\n large: number,\n sweep: number,\n rotateX: TRadian,\n): TParsedAbsoluteCubicCurveCommand[] => {\n if (rx === 0 || ry === 0) {\n return [];\n }\n let fromX = 0,\n fromY = 0,\n root = 0;\n const PI = Math.PI,\n theta = rotateX * PiBy180,\n sinTheta = sin(theta),\n cosTh = cos(theta),\n px = 0.5 * (-cosTh * toX - sinTheta * toY),\n py = 0.5 * (-cosTh * toY + sinTheta * toX),\n rx2 = rx ** 2,\n ry2 = ry ** 2,\n py2 = py ** 2,\n px2 = px ** 2,\n pl = rx2 * ry2 - rx2 * py2 - ry2 * px2;\n let _rx = Math.abs(rx);\n let _ry = Math.abs(ry);\n\n if (pl < 0) {\n const s = Math.sqrt(1 - pl / (rx2 * ry2));\n _rx *= s;\n _ry *= s;\n } else {\n root =\n (large === sweep ? -1.0 : 1.0) * Math.sqrt(pl / (rx2 * py2 + ry2 * px2));\n }\n\n const cx = (root * _rx * py) / _ry,\n cy = (-root * _ry * px) / _rx,\n cx1 = cosTh * cx - sinTheta * cy + toX * 0.5,\n cy1 = sinTheta * cx + cosTh * cy + toY * 0.5;\n let mTheta = calcVectorAngle(1, 0, (px - cx) / _rx, (py - cy) / _ry);\n let dtheta = calcVectorAngle(\n (px - cx) / _rx,\n (py - cy) / _ry,\n (-px - cx) / _rx,\n (-py - cy) / _ry,\n );\n\n if (sweep === 0 && dtheta > 0) {\n dtheta -= 2 * PI;\n } else if (sweep === 1 && dtheta < 0) {\n dtheta += 2 * PI;\n }\n\n // Convert into cubic bezier segments <= 90deg\n const segments = Math.ceil(Math.abs((dtheta / PI) * 2)),\n result = [],\n mDelta = dtheta / segments,\n mT =\n ((8 / 3) * Math.sin(mDelta / 4) * Math.sin(mDelta / 4)) /\n Math.sin(mDelta / 2);\n let th3 = mTheta + mDelta;\n\n for (let i = 0; i < segments; i++) {\n result[i] = segmentToBezier(\n mTheta,\n th3,\n cosTh,\n sinTheta,\n _rx,\n _ry,\n cx1,\n cy1,\n mT,\n fromX,\n fromY,\n );\n fromX = result[i][5];\n fromY = result[i][6];\n mTheta = th3;\n th3 += mDelta;\n }\n return result;\n};\n\n/**\n * @private\n * Calculate the angle between two vectors\n * @param ux u endpoint x\n * @param uy u endpoint y\n * @param vx v endpoint x\n * @param vy v endpoint y\n */\nconst calcVectorAngle = (\n ux: number,\n uy: number,\n vx: number,\n vy: number,\n): TRadian => {\n const ta = Math.atan2(uy, ux),\n tb = Math.atan2(vy, vx);\n if (tb >= ta) {\n return tb - ta;\n } else {\n return 2 * Math.PI - (ta - tb);\n }\n};\n\n// functions for the Cubic beizer\n// taken from: https://github.com/konvajs/konva/blob/7.0.5/src/shapes/Path.ts#L350\nconst CB1 = (t: number) => t ** 3;\nconst CB2 = (t: number) => 3 * t ** 2 * (1 - t);\nconst CB3 = (t: number) => 3 * t * (1 - t) ** 2;\nconst CB4 = (t: number) => (1 - t) ** 3;\n\n/**\n * Calculate bounding box of a cubic Bezier curve\n * Taken from http://jsbin.com/ivomiq/56/edit (no credits available)\n * TODO: can we normalize this with the starting points set at 0 and then translated the bbox?\n * @param {number} begx starting point\n * @param {number} begy\n * @param {number} cp1x first control point\n * @param {number} cp1y\n * @param {number} cp2x second control point\n * @param {number} cp2y\n * @param {number} endx end of bezier\n * @param {number} endy\n * @return {TRectBounds} the rectangular bounds\n */\nexport function getBoundsOfCurve(\n begx: number,\n begy: number,\n cp1x: number,\n cp1y: number,\n cp2x: number,\n cp2y: number,\n endx: number,\n endy: number,\n): TRectBounds {\n let argsString: string;\n if (config.cachesBoundsOfCurve) {\n // eslint-disable-next-line\n argsString = [...arguments].join();\n if (cache.boundsOfCurveCache[argsString]) {\n return cache.boundsOfCurveCache[argsString];\n }\n }\n\n const sqrt = Math.sqrt,\n abs = Math.abs,\n tvalues = [],\n bounds: [[x: number, y: number], [x: number, y: number]] = [\n [0, 0],\n [0, 0],\n ];\n\n let b = 6 * begx - 12 * cp1x + 6 * cp2x;\n let a = -3 * begx + 9 * cp1x - 9 * cp2x + 3 * endx;\n let c = 3 * cp1x - 3 * begx;\n\n for (let i = 0; i < 2; ++i) {\n if (i > 0) {\n b = 6 * begy - 12 * cp1y + 6 * cp2y;\n a = -3 * begy + 9 * cp1y - 9 * cp2y + 3 * endy;\n c = 3 * cp1y - 3 * begy;\n }\n\n if (abs(a) < 1e-12) {\n if (abs(b) < 1e-12) {\n continue;\n }\n const t = -c / b;\n if (0 < t && t < 1) {\n tvalues.push(t);\n }\n continue;\n }\n const b2ac = b * b - 4 * c * a;\n if (b2ac < 0) {\n continue;\n }\n const sqrtb2ac = sqrt(b2ac);\n const t1 = (-b + sqrtb2ac) / (2 * a);\n if (0 < t1 && t1 < 1) {\n tvalues.push(t1);\n }\n const t2 = (-b - sqrtb2ac) / (2 * a);\n if (0 < t2 && t2 < 1) {\n tvalues.push(t2);\n }\n }\n\n let j = tvalues.length;\n const jlen = j;\n const iterator = getPointOnCubicBezierIterator(\n begx,\n begy,\n cp1x,\n cp1y,\n cp2x,\n cp2y,\n endx,\n endy,\n );\n while (j--) {\n const { x, y } = iterator(tvalues[j]);\n bounds[0][j] = x;\n bounds[1][j] = y;\n }\n\n bounds[0][jlen] = begx;\n bounds[1][jlen] = begy;\n bounds[0][jlen + 1] = endx;\n bounds[1][jlen + 1] = endy;\n const result: TRectBounds = [\n new Point(Math.min(...bounds[0]), Math.min(...bounds[1])),\n new Point(Math.max(...bounds[0]), Math.max(...bounds[1])),\n ];\n if (config.cachesBoundsOfCurve) {\n cache.boundsOfCurveCache[argsString!] = result;\n }\n return result;\n}\n\n/**\n * Converts arc to a bunch of cubic Bezier curves\n * @param {number} fx starting point x\n * @param {number} fy starting point y\n * @param {TParsedArcCommand} coords Arc command\n */\nexport const fromArcToBeziers = (\n fx: number,\n fy: number,\n [_, rx, ry, rot, large, sweep, tx, ty]: TParsedArcCommand,\n): TParsedAbsoluteCubicCurveCommand[] => {\n const segsNorm = arcToSegments(tx - fx, ty - fy, rx, ry, large, sweep, rot);\n\n for (let i = 0, len = segsNorm.length; i < len; i++) {\n segsNorm[i][1] += fx;\n segsNorm[i][2] += fy;\n segsNorm[i][3] += fx;\n segsNorm[i][4] += fy;\n segsNorm[i][5] += fx;\n segsNorm[i][6] += fy;\n }\n return segsNorm;\n};\n\n/**\n * This function takes a parsed SVG path and makes it simpler for fabricJS logic.\n * Simplification consist of:\n * - All commands converted to absolute (lowercase to uppercase)\n * - S converted to C\n * - T converted to Q\n * - A converted to C\n * @param {TComplexPathData} path the array of commands of a parsed SVG path for `Path`\n * @return {TSimplePathData} the simplified array of commands of a parsed SVG path for `Path`\n * TODO: figure out how to remove the type assertions in a nice way\n */\nexport const makePathSimpler = (path: TComplexPathData): TSimplePathData => {\n // x and y represent the last point of the path, AKA the previous command point.\n // we add them to each relative command to make it an absolute comment.\n // we also swap the v V h H with L, because are easier to transform.\n let x = 0,\n y = 0;\n // x1 and y1 represent the last point of the subpath. the subpath is started with\n // m or M command. When a z or Z command is drawn, x and y need to be resetted to\n // the last x1 and y1.\n let x1 = 0,\n y1 = 0;\n // previous will host the letter of the previous command, to handle S and T.\n // controlX and controlY will host the previous reflected control point\n const destinationPath: TSimplePathData = [];\n let previous,\n // placeholders\n controlX = 0,\n controlY = 0;\n for (const parsedCommand of path) {\n const current: TComplexParsedCommand = [...parsedCommand];\n let converted: TSimpleParsedCommand | undefined;\n switch (\n current[0] // first letter\n ) {\n case 'l': // lineto, relative\n current[1] += x;\n current[2] += y;\n // falls through\n case 'L':\n x = current[1];\n y = current[2];\n converted = ['L', x, y];\n break;\n case 'h': // horizontal lineto, relative\n current[1] += x;\n // falls through\n case 'H':\n x = current[1];\n converted = ['L', x, y];\n break;\n case 'v': // vertical lineto, relative\n current[1] += y;\n // falls through\n case 'V':\n y = current[1];\n converted = ['L', x, y];\n break;\n case 'm': // moveTo, relative\n current[1] += x;\n current[2] += y;\n // falls through\n case 'M':\n x = current[1];\n y = current[2];\n x1 = current[1];\n y1 = current[2];\n converted = ['M', x, y];\n break;\n case 'c': // bezierCurveTo, relative\n current[1] += x;\n current[2] += y;\n current[3] += x;\n current[4] += y;\n current[5] += x;\n current[6] += y;\n // falls through\n case 'C':\n controlX = current[3];\n controlY = current[4];\n x = current[5];\n y = current[6];\n converted = ['C', current[1], current[2], controlX, controlY, x, y];\n break;\n case 's': // shorthand cubic bezierCurveTo, relative\n current[1] += x;\n current[2] += y;\n current[3] += x;\n current[4] += y;\n // falls through\n case 'S':\n // would be sScC but since we are swapping sSc for C, we check just that.\n if (previous === 'C') {\n // calculate reflection of previous control points\n controlX = 2 * x - controlX;\n controlY = 2 * y - controlY;\n } else {\n // If there is no previous command or if the previous command was not a C, c, S, or s,\n // the control point is coincident with the current point\n controlX = x;\n controlY = y;\n }\n x = current[3];\n y = current[4];\n converted = ['C', controlX, controlY, current[1], current[2], x, y];\n // converted[3] and converted[4] are NOW the second control point.\n // we keep it for the next reflection.\n controlX = converted[3];\n controlY = converted[4];\n break;\n case 'q': // quadraticCurveTo, relative\n current[1] += x;\n current[2] += y;\n current[3] += x;\n current[4] += y;\n // falls through\n case 'Q':\n controlX = current[1];\n controlY = current[2];\n x = current[3];\n y = current[4];\n converted = ['Q', controlX, controlY, x, y];\n break;\n case 't': // shorthand quadraticCurveTo, relative\n current[1] += x;\n current[2] += y;\n // falls through\n case 'T':\n if (previous === 'Q') {\n // calculate reflection of previous control point\n controlX = 2 * x - controlX;\n controlY = 2 * y - controlY;\n } else {\n // If there is no previous command or if the previous command was not a Q, q, T or t,\n // assume the control point is coincident with the current point\n controlX = x;\n controlY = y;\n }\n x = current[1];\n y = current[2];\n converted = ['Q', controlX, controlY, x, y];\n break;\n case 'a':\n current[6] += x;\n current[7] += y;\n // falls through\n case 'A':\n fromArcToBeziers(x, y, current).forEach((b) => destinationPath.push(b));\n x = current[6];\n y = current[7];\n break;\n case 'z':\n case 'Z':\n x = x1;\n y = y1;\n converted = ['Z'];\n break;\n default:\n }\n if (converted) {\n destinationPath.push(converted);\n previous = converted[0];\n } else {\n previous = '';\n }\n }\n return destinationPath;\n};\n\n// todo verify if we can just use the point class here\n/**\n * Calc length from point x1,y1 to x2,y2\n * @param {number} x1 starting point x\n * @param {number} y1 starting point y\n * @param {number} x2 starting point x\n * @param {number} y2 starting point y\n * @return {number} length of segment\n */\nconst calcLineLength = (\n x1: number,\n y1: number,\n x2: number,\n y2: number,\n): number => Math.sqrt((x2 - x1) ** 2 + (y2 - y1) ** 2);\n\n/**\n * Get an iterator that takes a percentage and returns a point\n * @param {number} begx\n * @param {number} begy\n * @param {number} cp1x\n * @param {number} cp1y\n * @param {number} cp2x\n * @param {number} cp2y\n * @param {number} endx\n * @param {number} endy\n */\nconst getPointOnCubicBezierIterator =\n (\n begx: number,\n begy: number,\n cp1x: number,\n cp1y: number,\n cp2x: number,\n cp2y: number,\n endx: number,\n endy: number,\n ) =>\n (pct: number) => {\n const c1 = CB1(pct),\n c2 = CB2(pct),\n c3 = CB3(pct),\n c4 = CB4(pct);\n return new Point(\n endx * c1 + cp2x * c2 + cp1x * c3 + begx * c4,\n endy * c1 + cp2y * c2 + cp1y * c3 + begy * c4,\n );\n };\n\nconst QB1 = (t: number) => t ** 2;\nconst QB2 = (t: number) => 2 * t * (1 - t);\nconst QB3 = (t: number) => (1 - t) ** 2;\n\nconst getTangentCubicIterator =\n (\n p1x: number,\n p1y: number,\n p2x: number,\n p2y: number,\n p3x: number,\n p3y: number,\n p4x: number,\n p4y: number,\n ) =>\n (pct: number) => {\n const qb1 = QB1(pct),\n qb2 = QB2(pct),\n qb3 = QB3(pct),\n tangentX =\n 3 * (qb3 * (p2x - p1x) + qb2 * (p3x - p2x) + qb1 * (p4x - p3x)),\n tangentY =\n 3 * (qb3 * (p2y - p1y) + qb2 * (p3y - p2y) + qb1 * (p4y - p3y));\n return Math.atan2(tangentY, tangentX);\n };\n\nconst getPointOnQuadraticBezierIterator =\n (\n p1x: number,\n p1y: number,\n p2x: number,\n p2y: number,\n p3x: number,\n p3y: number,\n ) =>\n (pct: number) => {\n const c1 = QB1(pct),\n c2 = QB2(pct),\n c3 = QB3(pct);\n return new Point(\n p3x * c1 + p2x * c2 + p1x * c3,\n p3y * c1 + p2y * c2 + p1y * c3,\n );\n };\n\nconst getTangentQuadraticIterator =\n (\n p1x: number,\n p1y: number,\n p2x: number,\n p2y: number,\n p3x: number,\n p3y: number,\n ) =>\n (pct: number) => {\n const invT = 1 - pct,\n tangentX = 2 * (invT * (p2x - p1x) + pct * (p3x - p2x)),\n tangentY = 2 * (invT * (p2y - p1y) + pct * (p3y - p2y));\n return Math.atan2(tangentY, tangentX);\n };\n\n// this will run over a path segment (a cubic or quadratic segment) and approximate it\n// with 100 segments. This will good enough to calculate the length of the curve\nconst pathIterator = (\n iterator: (pct: number) => Point,\n x1: number,\n y1: number,\n) => {\n let tempP = new Point(x1, y1),\n tmpLen = 0;\n for (let perc = 1; perc <= 100; perc += 1) {\n const p = iterator(perc / 100);\n tmpLen += calcLineLength(tempP.x, tempP.y, p.x, p.y);\n tempP = p;\n }\n return tmpLen;\n};\n\n/**\n * Given a pathInfo, and a distance in pixels, find the percentage from 0 to 1\n * that correspond to that pixels run over the path.\n * The percentage will be then used to find the correct point on the canvas for the path.\n * @param {Array} segInfo fabricJS collection of information on a parsed path\n * @param {number} distance from starting point, in pixels.\n * @return {TPointAngle} info object with x and y ( the point on canvas ) and angle, the tangent on that point;\n */\nconst findPercentageForDistance = (\n segInfo: TCurveInfo<'Q' | 'C'>,\n distance: number,\n): TPointAngle => {\n let perc = 0,\n tmpLen = 0,\n tempP: XY = { x: segInfo.x, y: segInfo.y },\n p: XY = { ...tempP },\n nextLen: number,\n nextStep = 0.01,\n lastPerc = 0;\n // nextStep > 0.0001 covers 0.00015625 that 1/64th of 1/100\n // the path\n const iterator = segInfo.iterator,\n angleFinder = segInfo.angleFinder;\n while (tmpLen < distance && nextStep > 0.0001) {\n p = iterator(perc);\n lastPerc = perc;\n nextLen = calcLineLength(tempP.x, tempP.y, p.x, p.y);\n // compare tmpLen each cycle with distance, decide next perc to test.\n if (nextLen + tmpLen > distance) {\n // we discard this step and we make smaller steps.\n perc -= nextStep;\n nextStep /= 2;\n } else {\n tempP = p;\n perc += nextStep;\n tmpLen += nextLen;\n }\n }\n return { ...p, angle: angleFinder(lastPerc) };\n};\n\n/**\n * Run over a parsed and simplified path and extract some information (length of each command and starting point)\n * @param {TSimplePathData} path parsed path commands\n * @return {TPathSegmentInfo[]} path commands information\n */\nexport const getPathSegmentsInfo = (\n path: TSimplePathData,\n): TPathSegmentInfo[] => {\n let totalLength = 0,\n //x2 and y2 are the coords of segment start\n //x1 and y1 are the coords of the current point\n x1 = 0,\n y1 = 0,\n x2 = 0,\n y2 = 0,\n iterator,\n tempInfo: TPathSegmentInfo;\n const info: TPathSegmentInfo[] = [];\n for (const current of path) {\n const basicInfo: TPathSegmentInfoCommon = {\n x: x1,\n y: y1,\n command: current[0],\n length: 0,\n };\n switch (\n current[0] //first letter\n ) {\n case 'M':\n tempInfo = >basicInfo;\n tempInfo.x = x2 = x1 = current[1];\n tempInfo.y = y2 = y1 = current[2];\n break;\n case 'L':\n tempInfo = >basicInfo;\n tempInfo.length = calcLineLength(x1, y1, current[1], current[2]);\n x1 = current[1];\n y1 = current[2];\n break;\n case 'C':\n iterator = getPointOnCubicBezierIterator(\n x1,\n y1,\n current[1],\n current[2],\n current[3],\n current[4],\n current[5],\n current[6],\n );\n tempInfo = >basicInfo;\n tempInfo.iterator = iterator;\n tempInfo.angleFinder = getTangentCubicIterator(\n x1,\n y1,\n current[1],\n current[2],\n current[3],\n current[4],\n current[5],\n current[6],\n );\n tempInfo.length = pathIterator(iterator, x1, y1);\n\n x1 = current[5];\n y1 = current[6];\n break;\n case 'Q':\n iterator = getPointOnQuadraticBezierIterator(\n x1,\n y1,\n current[1],\n current[2],\n current[3],\n current[4],\n );\n tempInfo = >basicInfo;\n tempInfo.iterator = iterator;\n tempInfo.angleFinder = getTangentQuadraticIterator(\n x1,\n y1,\n current[1],\n current[2],\n current[3],\n current[4],\n );\n tempInfo.length = pathIterator(iterator, x1, y1);\n x1 = current[3];\n y1 = current[4];\n break;\n case 'Z':\n // we add those in order to ease calculations later\n tempInfo = basicInfo;\n tempInfo.destX = x2;\n tempInfo.destY = y2;\n tempInfo.length = calcLineLength(x1, y1, x2, y2);\n x1 = x2;\n y1 = y2;\n break;\n }\n totalLength += tempInfo.length;\n info.push(tempInfo);\n }\n info.push({ length: totalLength, x: x1, y: y1 });\n return info;\n};\n\n/**\n * Get the point on the path that is distance along the path\n * @param path\n * @param distance\n * @param infos\n */\nexport const getPointOnPath = (\n path: TSimplePathData,\n distance: number,\n infos: TPathSegmentInfo[] = getPathSegmentsInfo(path),\n): TPointAngle | undefined => {\n let i = 0;\n while (distance - infos[i].length > 0 && i < infos.length - 2) {\n distance -= infos[i].length;\n i++;\n }\n const segInfo = infos[i],\n segPercent = distance / segInfo.length,\n segment = path[i];\n\n switch (segInfo.command) {\n case 'M':\n return { x: segInfo.x, y: segInfo.y, angle: 0 };\n case 'Z':\n return {\n ...new Point(segInfo.x, segInfo.y).lerp(\n new Point(segInfo.destX, segInfo.destY),\n segPercent,\n ),\n angle: Math.atan2(segInfo.destY - segInfo.y, segInfo.destX - segInfo.x),\n };\n case 'L':\n return {\n ...new Point(segInfo.x, segInfo.y).lerp(\n new Point(segment[1]!, segment[2]!),\n segPercent,\n ),\n angle: Math.atan2(segment[2]! - segInfo.y, segment[1]! - segInfo.x),\n };\n case 'C':\n return findPercentageForDistance(segInfo, distance);\n case 'Q':\n return findPercentageForDistance(segInfo, distance);\n default:\n // throw Error('Invalid command');\n }\n};\n\nconst rePathCmdAll = new RegExp(rePathCommand, 'gi');\nconst regExpArcCommandPoints = new RegExp(reArcCommandPoints, 'g');\nconst reMyNum = new RegExp(reNum, 'gi');\nconst commandLengths = {\n m: 2,\n l: 2,\n h: 1,\n v: 1,\n c: 6,\n s: 4,\n q: 4,\n t: 2,\n a: 7,\n} as const;\n/**\n *\n * @param {string} pathString\n * @return {TComplexPathData} An array of SVG path commands\n * @example Usage\n * parsePath('M 3 4 Q 3 5 2 1 4 0 Q 9 12 2 1 4 0') === [\n * ['M', 3, 4],\n * ['Q', 3, 5, 2, 1, 4, 0],\n * ['Q', 9, 12, 2, 1, 4, 0],\n * ];\n */\nexport const parsePath = (pathString: string): TComplexPathData => {\n const chain: TComplexPathData = [];\n const all = pathString.match(rePathCmdAll) ?? [];\n for (const matchStr of all) {\n // take match string and save the first letter as the command\n const commandLetter = matchStr[0] as TComplexParsedCommandType;\n // in case of Z we have very little to do\n if (commandLetter === 'z' || commandLetter === 'Z') {\n chain.push([commandLetter]);\n continue;\n }\n const commandLength =\n commandLengths[\n commandLetter.toLowerCase() as keyof typeof commandLengths\n ];\n\n let paramArr = [];\n if (commandLetter === 'a' || commandLetter === 'A') {\n // the arc command ha some peculariaties that requires a special regex other than numbers\n // it is possible to avoid using a space between the sweep and large arc flags, making them either\n // 00, 01, 10 or 11, making them identical to a plain number for the regex reMyNum\n // reset the regexp\n regExpArcCommandPoints.lastIndex = 0;\n for (let out = null; (out = regExpArcCommandPoints.exec(matchStr)); ) {\n paramArr.push(...out.slice(1));\n }\n } else {\n paramArr = matchStr.match(reMyNum) || [];\n }\n\n // inspect the length of paramArr, if is longer than commandLength\n // we are dealing with repeated commands\n for (let i = 0; i < paramArr.length; i += commandLength) {\n const newCommand = new Array(commandLength) as TComplexParsedCommand;\n const transformedCommand = repeatedCommands[commandLetter];\n newCommand[0] =\n i > 0 && transformedCommand ? transformedCommand : commandLetter;\n for (let j = 0; j < commandLength; j++) {\n newCommand[j + 1] = parseFloat(paramArr[i + j]);\n }\n chain.push(newCommand);\n }\n }\n return chain;\n};\n\n/**\n *\n * Converts points to a smooth SVG path\n * @param {XY[]} points Array of points\n * @param {number} [correction] Apply a correction to the path (usually we use `width / 1000`). If value is undefined 0 is used as the correction value.\n * @return {(string|number)[][]} An array of SVG path commands\n */\nexport const getSmoothPathFromPoints = (\n points: Point[],\n correction = 0,\n): TSimplePathData => {\n let p1 = new Point(points[0]),\n p2 = new Point(points[1]),\n multSignX = 1,\n multSignY = 0;\n const path: TSimplePathData = [],\n len = points.length,\n manyPoints = len > 2;\n\n if (manyPoints) {\n multSignX = points[2].x < p2.x ? -1 : points[2].x === p2.x ? 0 : 1;\n multSignY = points[2].y < p2.y ? -1 : points[2].y === p2.y ? 0 : 1;\n }\n path.push([\n 'M',\n p1.x - multSignX * correction,\n p1.y - multSignY * correction,\n ]);\n let i;\n for (i = 1; i < len; i++) {\n if (!p1.eq(p2)) {\n const midPoint = p1.midPointFrom(p2);\n // p1 is our bezier control point\n // midpoint is our endpoint\n // start point is p(i-1) value.\n path.push(['Q', p1.x, p1.y, midPoint.x, midPoint.y]);\n }\n p1 = points[i];\n if (i + 1 < points.length) {\n p2 = points[i + 1];\n }\n }\n if (manyPoints) {\n multSignX = p1.x > points[i - 2].x ? 1 : p1.x === points[i - 2].x ? 0 : -1;\n multSignY = p1.y > points[i - 2].y ? 1 : p1.y === points[i - 2].y ? 0 : -1;\n }\n path.push([\n 'L',\n p1.x + multSignX * correction,\n p1.y + multSignY * correction,\n ]);\n return path;\n};\n\n/**\n * Transform a path by transforming each segment.\n * it has to be a simplified path or it won't work.\n * WARNING: this depends from pathOffset for correct operation\n * @param {TSimplePathData} path fabricJS parsed and simplified path commands\n * @param {TMat2D} transform matrix that represent the transformation\n * @param {Point} [pathOffset] `Path.pathOffset`\n * @returns {TSimplePathData} the transformed path\n */\nexport const transformPath = (\n path: TSimplePathData,\n transform: TMat2D,\n pathOffset: Point,\n): TSimplePathData => {\n if (pathOffset) {\n transform = multiplyTransformMatrices(transform, [\n 1,\n 0,\n 0,\n 1,\n -pathOffset.x,\n -pathOffset.y,\n ]);\n }\n return path.map((pathSegment) => {\n const newSegment: TSimpleParsedCommand = [...pathSegment];\n for (let i = 1; i < pathSegment.length - 1; i += 2) {\n // TODO: is there a way to get around casting to any?\n const { x, y } = transformPoint(\n {\n x: pathSegment[i] as number,\n y: pathSegment[i + 1] as number,\n },\n transform,\n );\n newSegment[i] = x;\n newSegment[i + 1] = y;\n }\n return newSegment;\n });\n};\n\n/**\n * Returns an array of path commands to create a regular polygon\n * @param {number} numVertexes\n * @param {number} radius\n * @returns {TSimplePathData} An array of SVG path commands\n */\nexport const getRegularPolygonPath = (\n numVertexes: number,\n radius: number,\n): TSimplePathData => {\n const interiorAngle = (Math.PI * 2) / numVertexes;\n // rotationAdjustment rotates the path by 1/2 the interior angle so that the polygon always has a flat side on the bottom\n // This isn't strictly necessary, but it's how we tend to think of and expect polygons to be drawn\n let rotationAdjustment = -halfPI;\n if (numVertexes % 2 === 0) {\n rotationAdjustment += interiorAngle / 2;\n }\n const d = new Array(numVertexes + 1);\n for (let i = 0; i < numVertexes; i++) {\n const rad = i * interiorAngle + rotationAdjustment;\n const { x, y } = new Point(cos(rad), sin(rad)).scalarMultiply(radius);\n d[i] = [i === 0 ? 'M' : 'L', x, y];\n }\n d[numVertexes] = ['Z'];\n return d;\n};\n\n/**\n * Join path commands to go back to svg format\n * @param {TSimplePathData} pathData fabricJS parsed path commands\n * @param {number} fractionDigits number of fraction digits to \"leave\"\n * @return {String} joined path 'M 0 0 L 20 30'\n */\nexport const joinPath = (pathData: TSimplePathData, fractionDigits?: number) =>\n pathData\n .map((segment) => {\n return segment\n .map((arg, i) => {\n if (i === 0) return arg;\n return fractionDigits === undefined\n ? arg\n : toFixed(arg, fractionDigits);\n })\n .join(' ');\n })\n .join(' ');\n","/**\n * Returns random number between 2 specified ones.\n * @param {Number} min lower limit\n * @param {Number} max upper limit\n * @return {Number} random value (between min and max)\n */\nexport const getRandomInt = (min: number, max: number): number =>\n Math.floor(Math.random() * (max - min + 1)) + min;\n","import { CENTER, SCALE_X, SCALE_Y } from '../constants';\nimport type { FabricImage } from '../shapes/Image';\nimport type { FabricObject } from '../shapes/Object/FabricObject';\nimport type { TMat2D } from '../typedefs';\nimport { qrDecompose } from './misc/matrix';\n\ntype FabricObjectWithTransformMatrix = FabricObject & {\n transformMatrix?: TMat2D;\n};\n\n/**\n * This function is an helper for svg import. it decompose the transformMatrix\n * and assign properties to object.\n * untransformed coordinates\n * @private\n */\nconst _assignTransformMatrixProps = (\n object: FabricObjectWithTransformMatrix,\n) => {\n if (object.transformMatrix) {\n const { scaleX, scaleY, angle, skewX } = qrDecompose(\n object.transformMatrix,\n );\n object.flipX = false;\n object.flipY = false;\n object.set(SCALE_X, scaleX);\n object.set(SCALE_Y, scaleY);\n object.angle = angle;\n object.skewX = skewX;\n object.skewY = 0;\n }\n};\n\n/**\n * This function is an helper for svg import. it removes the transform matrix\n * and set to object properties that fabricjs can handle\n * @private\n * @param {Object} preserveAspectRatioOptions\n */\nexport const removeTransformMatrixForSvgParsing = (\n object: FabricObjectWithTransformMatrix,\n preserveAspectRatioOptions?: any,\n) => {\n let center = object._findCenterFromElement();\n if (object.transformMatrix) {\n _assignTransformMatrixProps(object);\n center = center.transform(object.transformMatrix);\n }\n delete object.transformMatrix;\n if (preserveAspectRatioOptions) {\n object.scaleX *= preserveAspectRatioOptions.scaleX;\n object.scaleY *= preserveAspectRatioOptions.scaleY;\n (object as FabricImage).cropX = preserveAspectRatioOptions.cropX;\n (object as FabricImage).cropY = preserveAspectRatioOptions.cropY;\n center.x += preserveAspectRatioOptions.offsetLeft;\n center.y += preserveAspectRatioOptions.offsetTop;\n object.width = preserveAspectRatioOptions.width;\n object.height = preserveAspectRatioOptions.height;\n }\n object.setPositionByOrigin(center, CENTER, CENTER);\n};\n","import type { FabricObject } from '../../shapes/Object/FabricObject';\nimport { sendObjectToPlane } from './planeChange';\nimport { Group } from '../../shapes/Group';\n/**\n * Merges 2 clip paths into one visually equal clip path\n *\n * **IMPORTANT**:\\\n * Does **NOT** clone the arguments, clone them proir if necessary.\n *\n * Creates a wrapper (group) that contains one clip path and is clipped by the other so content is kept where both overlap.\n * Use this method if both the clip paths may have nested clip paths of their own, so assigning one to the other's clip path property is not possible.\n *\n * In order to handle the `inverted` property we follow logic described in the following cases:\\\n * **(1)** both clip paths are inverted - the clip paths pass the inverted prop to the wrapper and loose it themselves.\\\n * **(2)** one is inverted and the other isn't - the wrapper shouldn't become inverted and the inverted clip path must clip the non inverted one to produce an identical visual effect.\\\n * **(3)** both clip paths are not inverted - wrapper and clip paths remain unchanged.\n *\n * @param {fabric.Object} c1\n * @param {fabric.Object} c2\n * @returns {fabric.Object} merged clip path\n */\nexport const mergeClipPaths = (c1: FabricObject, c2: FabricObject) => {\n let a = c1,\n b = c2;\n if (a.inverted && !b.inverted) {\n // case (2)\n a = c2;\n b = c1;\n }\n // `b` becomes `a`'s clip path so we transform `b` to `a` coordinate plane\n sendObjectToPlane(b, b.group?.calcTransformMatrix(), a.calcTransformMatrix());\n // assign the `inverted` prop to the wrapping group\n const inverted = a.inverted && b.inverted;\n if (inverted) {\n // case (1)\n a.inverted = b.inverted = false;\n }\n return new Group([a], { clipPath: b, inverted });\n};\n","// TODO this file needs to go away, cross browser style support is not fabricjs domain.\n\n/**\n * wrapper for setting element's style\n * @param {HTMLElement} element an HTMLElement\n * @param {Object} styles to apply to element\n */\nexport function setStyle(element: HTMLElement, styles: Record) {\n const elementStyle = element.style;\n if (!elementStyle) {\n return;\n }\n Object.entries(styles).forEach(([property, value]) =>\n elementStyle.setProperty(property, value),\n );\n}\n","import { getEnv, getFabricDocument } from '../../env';\nimport type { TSize } from '../../typedefs';\nimport { createCanvasElement } from '../../util/misc/dom';\nimport { setStyle } from '../../util/internals/dom_style';\nimport type { CSSDimensions } from './util';\nimport { makeElementUnselectable, setCSSDimensions } from './util';\nimport type { CanvasItem } from './StaticCanvasDOMManager';\nimport { StaticCanvasDOMManager } from './StaticCanvasDOMManager';\nimport { setCanvasDimensions } from './util';\nimport { NONE } from '../../constants';\n\nexport class CanvasDOMManager extends StaticCanvasDOMManager {\n upper: CanvasItem;\n container: HTMLDivElement;\n\n constructor(\n arg0?: string | HTMLCanvasElement,\n {\n allowTouchScrolling = false,\n containerClass = '',\n }: {\n allowTouchScrolling?: boolean;\n /**\n * @deprecated here only for backward compatibility\n */\n containerClass?: string;\n } = {},\n ) {\n super(arg0);\n const { el: lowerCanvasEl } = this.lower;\n const upperCanvasEl = this.createUpperCanvas();\n this.upper = { el: upperCanvasEl, ctx: upperCanvasEl.getContext('2d')! };\n this.applyCanvasStyle(lowerCanvasEl, {\n allowTouchScrolling,\n });\n this.applyCanvasStyle(upperCanvasEl, {\n allowTouchScrolling,\n styles: {\n position: 'absolute',\n left: '0',\n top: '0',\n },\n });\n const container = this.createContainerElement();\n container.classList.add(containerClass);\n if (lowerCanvasEl.parentNode) {\n lowerCanvasEl.parentNode.replaceChild(container, lowerCanvasEl);\n }\n container.append(lowerCanvasEl, upperCanvasEl);\n this.container = container;\n }\n\n protected createUpperCanvas() {\n const { el: lowerCanvasEl } = this.lower;\n const el = createCanvasElement();\n // we assign the same classname of the lowerCanvas\n el.className = lowerCanvasEl.className;\n // but then we remove the lower-canvas specific className\n el.classList.remove('lower-canvas');\n // we add the specific upper-canvas class\n el.classList.add('upper-canvas');\n el.setAttribute('data-fabric', 'top');\n el.style.cssText = lowerCanvasEl.style.cssText;\n el.setAttribute('draggable', 'true');\n return el;\n }\n\n protected createContainerElement() {\n const container = getFabricDocument().createElement('div');\n container.setAttribute('data-fabric', 'wrapper');\n setStyle(container, {\n position: 'relative',\n });\n makeElementUnselectable(container);\n return container;\n }\n\n /**\n * @private\n * @param {HTMLCanvasElement} element canvas element to apply styles on\n */\n protected applyCanvasStyle(\n element: HTMLCanvasElement,\n options: {\n allowTouchScrolling?: boolean;\n styles?: Record;\n },\n ) {\n const { styles, allowTouchScrolling } = options;\n setStyle(element, {\n ...styles,\n 'touch-action': allowTouchScrolling ? 'manipulation' : NONE,\n });\n makeElementUnselectable(element);\n }\n\n setDimensions(size: TSize, retinaScaling: number) {\n super.setDimensions(size, retinaScaling);\n const { el, ctx } = this.upper;\n setCanvasDimensions(el, ctx, size, retinaScaling);\n }\n\n setCSSDimensions(size: Partial): void {\n super.setCSSDimensions(size);\n setCSSDimensions(this.upper.el, size);\n setCSSDimensions(this.container, size);\n }\n\n cleanupDOM(size: TSize) {\n const container = this.container,\n { el: lowerCanvasEl } = this.lower,\n { el: upperCanvasEl } = this.upper;\n super.cleanupDOM(size);\n container.removeChild(upperCanvasEl);\n container.removeChild(lowerCanvasEl);\n if (container.parentNode) {\n container.parentNode.replaceChild(lowerCanvasEl, container);\n }\n }\n\n dispose() {\n super.dispose();\n getEnv().dispose(this.upper.el);\n // @ts-expect-error disposing\n delete this.upper;\n // @ts-expect-error disposing\n delete this.container;\n }\n}\n","import { dragHandler } from '../controls/drag';\nimport { getActionFromCorner } from '../controls/util';\nimport { Point } from '../Point';\nimport { FabricObject } from '../shapes/Object/FabricObject';\nimport type {\n CanvasEvents,\n ModifierKey,\n TOptionalModifierKey,\n TPointerEvent,\n Transform,\n} from '../EventTypeDefs';\nimport {\n addTransformToObject,\n saveObjectTransform,\n} from '../util/misc/objectTransforms';\nimport type { TCanvasSizeOptions } from './StaticCanvas';\nimport { StaticCanvas } from './StaticCanvas';\nimport { isCollection } from '../Collection';\nimport { isTransparent } from '../util/misc/isTransparent';\nimport type {\n TMat2D,\n TOriginX,\n TOriginY,\n TSize,\n TSVGReviver,\n} from '../typedefs';\nimport { degreesToRadians } from '../util/misc/radiansDegreesConversion';\nimport { getPointer, isTouchEvent } from '../util/dom_event';\nimport type { IText } from '../shapes/IText/IText';\nimport type { BaseBrush } from '../brushes/BaseBrush';\nimport { pick } from '../util/misc/pick';\nimport { sendPointToPlane } from '../util/misc/planeChange';\nimport { cos, createCanvasElement, sin } from '../util';\nimport { CanvasDOMManager } from './DOMManagers/CanvasDOMManager';\nimport {\n BOTTOM,\n CENTER,\n LEFT,\n MODIFIED,\n RESIZING,\n RIGHT,\n ROTATE,\n SCALE,\n SCALE_X,\n SCALE_Y,\n SKEW_X,\n SKEW_Y,\n TOP,\n} from '../constants';\nimport type { CanvasOptions } from './CanvasOptions';\nimport { canvasDefaults } from './CanvasOptions';\nimport { Intersection } from '../Intersection';\nimport { isActiveSelection } from '../util/typeAssertions';\n\nexport type TargetsInfo = {\n target?: FabricObject;\n subTargets: FabricObject[];\n};\n\nexport type TargetsInfoWithContainer = {\n // the target we think is the most continuing the selection action.\n // could be hoveredTarget or the currently selected object\n target?: FabricObject;\n // the nested targets under the pointer for container\n subTargets: FabricObject[];\n // the container for target, or target itself if there are no selectable nested targets\n container?: FabricObject;\n};\n\nexport type FullTargetsInfoWithContainer = TargetsInfoWithContainer & {\n // hoveredTarget\n currentTarget?: FabricObject;\n // the container for hoveredTarget, or container itself\n currentContainer?: FabricObject;\n // nested targets of current container\n currentSubTargets: FabricObject[];\n};\n\n/**\n * Canvas class\n * @class Canvas\n * @extends StaticCanvas\n * @tutorial {@link http://fabricjs.com/fabric-intro-part-1#canvas}\n *\n * @fires object:modified at the end of a transform\n * @fires object:rotating while an object is being rotated from the control\n * @fires object:scaling while an object is being scaled by controls\n * @fires object:moving while an object is being dragged\n * @fires object:skewing while an object is being skewed from the controls\n *\n * @fires before:transform before a transform is is started\n * @fires before:selection:cleared\n * @fires selection:cleared\n * @fires selection:updated\n * @fires selection:created\n *\n * @fires path:created after a drawing operation ends and the path is added\n * @fires mouse:down\n * @fires mouse:move\n * @fires mouse:up\n * @fires mouse:down:before on mouse down, before the inner fabric logic runs\n * @fires mouse:move:before on mouse move, before the inner fabric logic runs\n * @fires mouse:up:before on mouse up, before the inner fabric logic runs\n * @fires mouse:over\n * @fires mouse:out\n * @fires mouse:dblclick whenever a native dbl click event fires on the canvas.\n *\n * @fires dragover\n * @fires dragenter\n * @fires dragleave\n * @fires drag:enter object drag enter\n * @fires drag:leave object drag leave\n * @fires drop:before before drop event. Prepare for the drop event (same native event).\n * @fires drop\n * @fires drop:after after drop event. Run logic on canvas after event has been accepted/declined (same native event).\n * @example\n * let a: fabric.Object, b: fabric.Object;\n * let flag = false;\n * canvas.add(a, b);\n * a.on('drop:before', opt => {\n * // we want a to accept the drop even though it's below b in the stack\n * flag = this.canDrop(opt.e);\n * });\n * b.canDrop = function(e) {\n * !flag && this.draggableTextDelegate.canDrop(e);\n * }\n * b.on('dragover', opt => b.set('fill', opt.dropTarget === b ? 'pink' : 'black'));\n * a.on('drop', opt => {\n * opt.e.defaultPrevented // drop occurred\n * opt.didDrop // drop occurred on canvas\n * opt.target // drop target\n * opt.target !== a && a.set('text', 'I lost');\n * });\n * canvas.on('drop:after', opt => {\n * // inform user who won\n * if(!opt.e.defaultPrevented) {\n * // no winners\n * }\n * else if(!opt.didDrop) {\n * // my objects didn't win, some other lucky object\n * }\n * else {\n * // we have a winner it's opt.target!!\n * }\n * })\n *\n * @fires after:render at the end of the render process, receives the context in the callback\n * @fires before:render at start the render process, receives the context in the callback\n *\n * @fires contextmenu:before\n * @fires contextmenu\n * @example\n * let handler;\n * targets.forEach(target => {\n * target.on('contextmenu:before', opt => {\n * // decide which target should handle the event before canvas hijacks it\n * if (someCaseHappens && opt.targets.includes(target)) {\n * handler = target;\n * }\n * });\n * target.on('contextmenu', opt => {\n * // do something fantastic\n * });\n * });\n * canvas.on('contextmenu', opt => {\n * if (!handler) {\n * // no one takes responsibility, it's always left to me\n * // let's show them how it's done!\n * }\n * });\n *\n */\nexport class SelectableCanvas\n extends StaticCanvas\n implements Omit\n{\n declare _objects: FabricObject[];\n\n // transform config\n declare uniformScaling: boolean;\n declare uniScaleKey: TOptionalModifierKey;\n declare centeredScaling: boolean;\n declare centeredRotation: boolean;\n declare centeredKey: TOptionalModifierKey;\n declare altActionKey: TOptionalModifierKey;\n\n // selection config\n declare selection: boolean;\n declare selectionKey: TOptionalModifierKey | ModifierKey[];\n declare altSelectionKey: TOptionalModifierKey;\n declare selectionColor: string;\n declare selectionDashArray: number[];\n declare selectionBorderColor: string;\n declare selectionLineWidth: number;\n declare selectionFullyContained: boolean;\n\n // cursors\n declare hoverCursor: CSSStyleDeclaration['cursor'];\n declare moveCursor: CSSStyleDeclaration['cursor'];\n declare defaultCursor: CSSStyleDeclaration['cursor'];\n declare freeDrawingCursor: CSSStyleDeclaration['cursor'];\n declare notAllowedCursor: CSSStyleDeclaration['cursor'];\n\n declare containerClass: string;\n\n // target find config\n declare perPixelTargetFind: boolean;\n declare targetFindTolerance: number;\n declare skipTargetFind: boolean;\n\n /**\n * When true, mouse events on canvas (mousedown/mousemove/mouseup) result in free drawing.\n * After mousedown, mousemove creates a shape,\n * and then mouseup finalizes it and adds an instance of `fabric.Path` onto canvas.\n * @tutorial {@link http://fabricjs.com/fabric-intro-part-4#free_drawing}\n * @type Boolean\n */\n declare isDrawingMode: boolean;\n\n declare preserveObjectStacking: boolean;\n\n // event config\n declare stopContextMenu: boolean;\n declare fireRightClick: boolean;\n declare fireMiddleClick: boolean;\n\n /**\n * Keep track of the hovered target\n * @type FabricObject | null\n * @private\n */\n declare _hoveredTarget?: FabricObject;\n\n /**\n * hold the list of nested targets hovered\n * @type FabricObject[]\n * @private\n */\n _hoveredTargets: FabricObject[] = [];\n\n /**\n * hold the list of objects to render\n * @type FabricObject[]\n * @private\n */\n _objectsToRender?: FabricObject[];\n\n /**\n * hold a reference to a data structure that contains information\n * on the current on going transform\n * @type\n * @private\n */\n _currentTransform: Transform | null = null;\n\n /**\n * hold a reference to a data structure used to track the selection\n * box on canvas drag\n * on the current on going transform\n * x, y, deltaX and deltaY are in scene plane\n * @type\n * @private\n */\n protected _groupSelector: {\n x: number;\n y: number;\n deltaX: number;\n deltaY: number;\n } | null = null;\n\n /**\n * internal flag used to understand if the context top requires a cleanup\n * in case this is true, the contextTop will be cleared at the next render\n * @type boolean\n * @private\n */\n contextTopDirty = false;\n\n /**\n * During a mouse event we may need the pointer multiple times in multiple functions.\n * _scenePoint holds a reference to the pointer in fabricCanvas/design coordinates that is valid for the event\n * lifespan. Every fabricJS mouse event create and delete the cache every time\n * We do this because there are some HTML DOM inspection functions to get the actual pointer coordinates\n * @type {Point}\n */\n declare protected _scenePoint?: Point;\n\n /**\n * During a mouse event we may need the pointer multiple times in multiple functions.\n * _viewportPoint holds a reference to the pointer in html coordinates that is valid for the event\n * lifespan. Every fabricJS mouse event create and delete the cache every time\n * We do this because there are some HTML DOM inspection functions to get the actual pointer coordinates\n * @type {Point}\n */\n declare protected _viewportPoint?: Point;\n\n /**\n * Holds the informations we cache during an event lifespan\n * This data is needed many times during an event and we want to avoid to recalculate it\n * multuple times.\n */\n declare protected _targetInfo: FullTargetsInfoWithContainer | undefined;\n\n static ownDefaults = canvasDefaults;\n\n static getDefaults(): Record {\n return { ...super.getDefaults(), ...SelectableCanvas.ownDefaults };\n }\n\n declare elements: CanvasDOMManager;\n get upperCanvasEl() {\n return this.elements.upper?.el;\n }\n get contextTop() {\n return this.elements.upper?.ctx;\n }\n get wrapperEl() {\n return this.elements.container;\n }\n declare private pixelFindCanvasEl: HTMLCanvasElement;\n declare private pixelFindContext: CanvasRenderingContext2D;\n\n declare protected _isCurrentlyDrawing: boolean;\n declare freeDrawingBrush?: BaseBrush;\n declare _activeObject?: FabricObject;\n\n protected initElements(el?: string | HTMLCanvasElement) {\n this.elements = new CanvasDOMManager(el, {\n allowTouchScrolling: this.allowTouchScrolling,\n containerClass: this.containerClass,\n });\n this._createCacheCanvas();\n }\n\n /**\n * @private\n * @param {FabricObject} obj Object that was added\n */\n _onObjectAdded(obj: FabricObject) {\n this._objectsToRender = undefined;\n super._onObjectAdded(obj);\n }\n\n /**\n * @private\n * @param {FabricObject} obj Object that was removed\n */\n _onObjectRemoved(obj: FabricObject) {\n this._objectsToRender = undefined;\n // removing active object should fire \"selection:cleared\" events\n if (obj === this._activeObject) {\n this.fire('before:selection:cleared', { deselected: [obj] });\n this._discardActiveObject();\n this.fire('selection:cleared', { deselected: [obj] });\n obj.fire('deselected', {\n target: obj,\n });\n }\n if (obj === this._hoveredTarget) {\n this._hoveredTarget = undefined;\n this._hoveredTargets = [];\n }\n super._onObjectRemoved(obj);\n }\n\n _onStackOrderChanged() {\n this._objectsToRender = undefined;\n super._onStackOrderChanged();\n }\n\n /**\n * Divides objects in two groups, one to render immediately\n * and one to render as activeGroup.\n * @return {Array} objects to render immediately and pushes the other in the activeGroup.\n */\n _chooseObjectsToRender(): FabricObject[] {\n const activeObject = this._activeObject;\n return !this.preserveObjectStacking && activeObject\n ? this._objects\n .filter((object) => !object.group && object !== activeObject)\n .concat(activeObject)\n : this._objects;\n }\n\n /**\n * Renders both the top canvas and the secondary container canvas.\n */\n renderAll() {\n this.cancelRequestedRender();\n if (this.destroyed) {\n return;\n }\n if (this.contextTopDirty && !this._groupSelector && !this.isDrawingMode) {\n this.clearContext(this.contextTop);\n this.contextTopDirty = false;\n }\n if (this.hasLostContext) {\n this.renderTopLayer(this.contextTop);\n this.hasLostContext = false;\n }\n !this._objectsToRender &&\n (this._objectsToRender = this._chooseObjectsToRender());\n this.renderCanvas(this.getContext(), this._objectsToRender);\n }\n\n /**\n * text selection is rendered by the active text instance during the rendering cycle\n */\n renderTopLayer(ctx: CanvasRenderingContext2D): void {\n ctx.save();\n if (this.isDrawingMode && this._isCurrentlyDrawing) {\n this.freeDrawingBrush && this.freeDrawingBrush._render();\n this.contextTopDirty = true;\n }\n // we render the top context - last object\n if (this.selection && this._groupSelector) {\n this._drawSelection(ctx);\n this.contextTopDirty = true;\n }\n ctx.restore();\n }\n\n /**\n * Method to render only the top canvas.\n * Also used to render the group selection box.\n * Does not render text selection.\n */\n renderTop() {\n const ctx = this.contextTop;\n this.clearContext(ctx);\n this.renderTopLayer(ctx);\n // todo: how do i know if the after:render is for the top or normal contex?\n this.fire('after:render', { ctx });\n }\n\n /**\n * Set the canvas tolerance value for pixel taret find.\n * Use only integer numbers.\n * @private\n */\n setTargetFindTolerance(value: number) {\n value = Math.round(value);\n this.targetFindTolerance = value;\n const retina = this.getRetinaScaling();\n const size = Math.ceil((value * 2 + 1) * retina);\n this.pixelFindCanvasEl.width = this.pixelFindCanvasEl.height = size;\n this.pixelFindContext.scale(retina, retina);\n }\n\n /**\n * Returns true if object is transparent at a certain location\n * Clarification: this is `is target transparent at location X or are controls there`\n * @TODO this seems dumb that we treat controls with transparency. we can find controls\n * programmatically without painting them, the cache canvas optimization is always valid\n * @param {FabricObject} target Object to check\n * @param {Number} x Left coordinate in viewport space\n * @param {Number} y Top coordinate in viewport space\n * @return {Boolean}\n */\n isTargetTransparent(target: FabricObject, x: number, y: number): boolean {\n const tolerance = this.targetFindTolerance;\n const ctx = this.pixelFindContext;\n this.clearContext(ctx);\n ctx.save();\n ctx.translate(-x + tolerance, -y + tolerance);\n ctx.transform(...this.viewportTransform);\n const selectionBgc = target.selectionBackgroundColor;\n target.selectionBackgroundColor = '';\n target.render(ctx);\n target.selectionBackgroundColor = selectionBgc;\n ctx.restore();\n // our canvas is square, and made around tolerance.\n // so tolerance in this case also represent the center of the canvas.\n const enhancedTolerance = Math.round(tolerance * this.getRetinaScaling());\n return isTransparent(\n ctx,\n enhancedTolerance,\n enhancedTolerance,\n enhancedTolerance,\n );\n }\n\n /**\n * takes an event and determines if selection key has been pressed\n * @private\n * @param {TPointerEvent} e Event object\n */\n _isSelectionKeyPressed(e: TPointerEvent): boolean {\n const sKey = this.selectionKey;\n if (!sKey) {\n return false;\n }\n if (Array.isArray(sKey)) {\n return !!sKey.find((key) => !!key && e[key] === true);\n } else {\n return e[sKey];\n }\n }\n\n /**\n * @private\n * @param {TPointerEvent} e Event object\n * @param {FabricObject} target\n */\n _shouldClearSelection(\n e: TPointerEvent,\n target?: FabricObject,\n ): target is undefined {\n const activeObjects = this.getActiveObjects(),\n activeObject = this._activeObject;\n\n return !!(\n !target ||\n (target &&\n activeObject &&\n activeObjects.length > 1 &&\n activeObjects.indexOf(target) === -1 &&\n activeObject !== target &&\n !this._isSelectionKeyPressed(e)) ||\n (target && !target.evented) ||\n (target && !target.selectable && activeObject && activeObject !== target)\n );\n }\n\n /**\n * This method will take in consideration a modifier key pressed and the control we are\n * about to drag, and try to guess the anchor point ( origin ) of the transormation.\n * This should be really in the realm of controls, and we should remove specific code for legacy\n * embedded actions.\n * @TODO this probably deserve discussion/rediscovery and change/refactor\n * @private\n * @deprecated\n * @param {FabricObject} target\n * @param {string} action\n * @param {boolean} altKey\n * @returns {boolean} true if the transformation should be centered\n */\n private _shouldCenterTransform(\n target: FabricObject,\n action: string,\n modifierKeyPressed: boolean,\n ) {\n if (!target) {\n return;\n }\n\n let centerTransform;\n\n if (\n action === SCALE ||\n action === SCALE_X ||\n action === SCALE_Y ||\n action === RESIZING\n ) {\n centerTransform = this.centeredScaling || target.centeredScaling;\n } else if (action === ROTATE) {\n centerTransform = this.centeredRotation || target.centeredRotation;\n }\n\n return centerTransform ? !modifierKeyPressed : modifierKeyPressed;\n }\n\n /**\n * Given the control clicked, determine the origin of the transform.\n * This is bad because controls can totally have custom names\n * should disappear before release 4.0\n * @private\n * @deprecated\n */\n _getOriginFromCorner(\n target: FabricObject,\n controlName: string,\n ): { x: TOriginX; y: TOriginY } {\n const origin = {\n x: target.originX,\n y: target.originY,\n };\n\n if (!controlName) {\n return origin;\n }\n\n // is a left control ?\n if (['ml', 'tl', 'bl'].includes(controlName)) {\n origin.x = RIGHT;\n // is a right control ?\n } else if (['mr', 'tr', 'br'].includes(controlName)) {\n origin.x = LEFT;\n }\n // is a top control ?\n if (['tl', 'mt', 'tr'].includes(controlName)) {\n origin.y = BOTTOM;\n // is a bottom control ?\n } else if (['bl', 'mb', 'br'].includes(controlName)) {\n origin.y = TOP;\n }\n return origin;\n }\n\n /**\n * @private\n * @param {Event} e Event object\n * @param {FabricObject} target\n * @param {boolean} [alreadySelected] pass true to setup the active control\n */\n _setupCurrentTransform(\n e: TPointerEvent,\n target: FabricObject,\n alreadySelected: boolean,\n ): void {\n const pointer = target.group\n ? // transform pointer to target's containing coordinate plane\n sendPointToPlane(\n this.getScenePoint(e),\n undefined,\n target.group.calcTransformMatrix(),\n )\n : this.getScenePoint(e);\n const { key: corner = '', control } = target.getActiveControl() || {},\n actionHandler =\n alreadySelected && control\n ? control.getActionHandler(e, target, control)?.bind(control)\n : dragHandler,\n action = getActionFromCorner(alreadySelected, corner, e, target),\n altKey = e[this.centeredKey as ModifierKey],\n origin = this._shouldCenterTransform(target, action, altKey)\n ? ({ x: CENTER, y: CENTER } as const)\n : this._getOriginFromCorner(target, corner),\n /**\n * relative to target's containing coordinate plane\n * both agree on every point\n **/\n transform: Transform = {\n target: target,\n action,\n actionHandler,\n actionPerformed: false,\n corner,\n scaleX: target.scaleX,\n scaleY: target.scaleY,\n skewX: target.skewX,\n skewY: target.skewY,\n offsetX: pointer.x - target.left,\n offsetY: pointer.y - target.top,\n originX: origin.x,\n originY: origin.y,\n ex: pointer.x,\n ey: pointer.y,\n lastX: pointer.x,\n lastY: pointer.y,\n theta: degreesToRadians(target.angle),\n width: target.width,\n height: target.height,\n shiftKey: e.shiftKey,\n altKey,\n original: {\n ...saveObjectTransform(target),\n originX: origin.x,\n originY: origin.y,\n },\n };\n\n this._currentTransform = transform;\n\n this.fire('before:transform', {\n e,\n transform,\n });\n }\n\n /**\n * Set the cursor type of the canvas element\n * @param {String} value Cursor type of the canvas element.\n * @see http://www.w3.org/TR/css3-ui/#cursor\n */\n setCursor(value: CSSStyleDeclaration['cursor']): void {\n this.upperCanvasEl.style.cursor = value;\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx to draw the selection on\n */\n _drawSelection(ctx: CanvasRenderingContext2D): void {\n const { x, y, deltaX, deltaY } = this._groupSelector!,\n start = new Point(x, y).transform(this.viewportTransform),\n extent = new Point(x + deltaX, y + deltaY).transform(\n this.viewportTransform,\n ),\n strokeOffset = this.selectionLineWidth / 2;\n let minX = Math.min(start.x, extent.x),\n minY = Math.min(start.y, extent.y),\n maxX = Math.max(start.x, extent.x),\n maxY = Math.max(start.y, extent.y);\n\n if (this.selectionColor) {\n ctx.fillStyle = this.selectionColor;\n ctx.fillRect(minX, minY, maxX - minX, maxY - minY);\n }\n\n if (!this.selectionLineWidth || !this.selectionBorderColor) {\n return;\n }\n ctx.lineWidth = this.selectionLineWidth;\n ctx.strokeStyle = this.selectionBorderColor;\n\n minX += strokeOffset;\n minY += strokeOffset;\n maxX -= strokeOffset;\n maxY -= strokeOffset;\n // selection border\n // @TODO: is _setLineDash still necessary on modern canvas?\n FabricObject.prototype._setLineDash.call(\n this,\n ctx,\n this.selectionDashArray,\n );\n ctx.strokeRect(minX, minY, maxX - minX, maxY - minY);\n }\n\n /**\n * This function is in charge of deciding which is the object that is the current target of an interaction event.\n * For interaction event we mean a pointer related action on the canvas.\n * Which is the\n * 11/09/2018 TODO: would be cool if findTarget could discern between being a full target\n * or the outside part of the corner.\n * @param {Event} e mouse event\n * @return {TargetsInfoWithContainer} the target found\n */\n findTarget(e: TPointerEvent): FullTargetsInfoWithContainer {\n // this._targetInfo is cached by _cacheTransformEventData\n // and destroyed by _resetTransformEventData\n if (this._targetInfo) {\n return this._targetInfo;\n }\n\n if (this.skipTargetFind) {\n return {\n subTargets: [],\n currentSubTargets: [],\n };\n }\n\n const pointer = this.getScenePoint(e),\n activeObject = this._activeObject,\n aObjects = this.getActiveObjects(),\n targetInfo = this.searchPossibleTargets(this._objects, pointer);\n\n const {\n subTargets: currentSubTargets,\n container: currentContainer,\n target: currentTarget,\n } = targetInfo;\n\n const fullTargetInfo: FullTargetsInfoWithContainer = {\n ...targetInfo,\n currentSubTargets,\n currentContainer,\n currentTarget,\n };\n\n // simplest case no active object, return a new target\n if (!activeObject) {\n return fullTargetInfo;\n }\n\n // check pointer is over active selection and possibly perform `subTargetCheck`\n const activeObjectTargetInfo: FullTargetsInfoWithContainer = {\n ...this.searchPossibleTargets([activeObject], pointer),\n currentSubTargets,\n currentContainer,\n currentTarget,\n };\n\n const activeObjectControl = activeObject.findControl(\n this.getViewportPoint(e),\n isTouchEvent(e),\n );\n\n // we are clicking exactly the control of an active object, shortcut to that object.\n if (activeObjectControl) {\n return {\n ...activeObjectTargetInfo,\n target: activeObject, // we override target in case we are in the outside part of the corner.\n };\n }\n\n // in case we are over the active object\n if (activeObjectTargetInfo.target) {\n if (aObjects.length > 1) {\n // in case of active selection and target hit over the activeSelection, just exit\n // TODO Verify if we need to override target with container\n return activeObjectTargetInfo;\n }\n // from here onward not an active selection, just an activeOject that maybe is a group\n\n // preserveObjectStacking is false, so activeObject is drawn on top, just return activeObject\n if (!this.preserveObjectStacking) {\n // TODO Verify if we need to override target with container\n return activeObjectTargetInfo;\n }\n\n // In case we are in preserveObjectStacking ( selection in stack )\n // there is the possibility to force with `altSelectionKey` to return the activeObject\n // from any point in the stack, even if we have another object completely on top of it.\n if (\n this.preserveObjectStacking &&\n e[this.altSelectionKey as ModifierKey]\n ) {\n // TODO Verify if we need to override target with container\n return activeObjectTargetInfo;\n }\n }\n\n // we have an active object, but we ruled out it being our target in any way.\n return fullTargetInfo;\n }\n\n /**\n * Checks if the point is inside the object selection area including padding\n * @param {FabricObject} obj Object to test against\n * @param {Object} [pointer] point in scene coordinates\n * @return {Boolean} true if point is contained within an area of given object\n * @private\n */\n private _pointIsInObjectSelectionArea(obj: FabricObject, point: Point) {\n // getCoords will already take care of group de-nesting\n let coords = obj.getCoords();\n const viewportZoom = this.getZoom();\n const padding = obj.padding / viewportZoom;\n if (padding) {\n const [tl, tr, br, bl] = coords;\n // what is the angle of the object?\n // we could use getTotalAngle, but is way easier to look at it\n // from how coords are oriented, since if something went wrong\n // at least we are consistent.\n const angleRadians = Math.atan2(tr.y - tl.y, tr.x - tl.x),\n cosP = cos(angleRadians) * padding,\n sinP = sin(angleRadians) * padding,\n cosPSinP = cosP + sinP,\n cosPMinusSinP = cosP - sinP;\n\n coords = [\n new Point(tl.x - cosPMinusSinP, tl.y - cosPSinP),\n new Point(tr.x + cosPSinP, tr.y - cosPMinusSinP),\n new Point(br.x + cosPMinusSinP, br.y + cosPSinP),\n new Point(bl.x - cosPSinP, bl.y + cosPMinusSinP),\n ];\n // in case of padding we calculate the new coords on the fly.\n // otherwise we have to maintain 2 sets of coordinates for everything.\n // we can reiterate on storing them.\n // if this is slow, for now the semplification is large and doesn't impact\n // rendering.\n // the idea behind this is that outside target check we don't need ot know\n // where those coords are\n }\n return Intersection.isPointInPolygon(point, coords);\n }\n\n /**\n * Checks point is inside the object selection condition. Either area with padding\n * or over pixels if perPixelTargetFind is enabled\n * @param {FabricObject} obj Object to test against\n * @param {Point} pointer point from scene.\n * @return {Boolean} true if point is contained within an area of given object\n * @private\n */\n _checkTarget(obj: FabricObject, pointer: Point): boolean {\n if (\n obj &&\n obj.visible &&\n obj.evented &&\n this._pointIsInObjectSelectionArea(obj, pointer)\n ) {\n if (\n (this.perPixelTargetFind || obj.perPixelTargetFind) &&\n !(obj as unknown as IText).isEditing\n ) {\n const viewportPoint = pointer.transform(this.viewportTransform);\n if (!this.isTargetTransparent(obj, viewportPoint.x, viewportPoint.y)) {\n return true;\n }\n } else {\n return true;\n }\n }\n return false;\n }\n\n /**\n * Given an array of objects search possible targets under the pointer position\n * Returns an\n * @param {Array} objects objects array to look into\n * @param {Object} pointer x,y object of point of scene coordinates we want to check.\n * @param {Object} subTargets If passed, subtargets will be collected inside the array\n * @return {TargetsInfo} **top most object from given `objects`** that contains pointer\n * @private\n */\n _searchPossibleTargets(\n objects: FabricObject[],\n pointer: Point,\n subTargets: FabricObject[],\n ): TargetsInfo {\n let i = objects.length;\n // Do not check for currently grouped objects, since we check the parent group itself.\n // until we call this function specifically to search inside the activeGroup\n while (i--) {\n const target = objects[i];\n if (this._checkTarget(target, pointer)) {\n if (isCollection(target) && target.subTargetCheck) {\n const { target: subTarget } = this._searchPossibleTargets(\n target._objects,\n pointer,\n subTargets,\n );\n subTarget && subTargets.push(subTarget);\n }\n return {\n target,\n subTargets,\n };\n }\n }\n return {\n subTargets: [],\n };\n }\n\n /**\n * Search inside an objects array the fiurst object that contains pointer\n * Collect subTargets of that object inside the subTargets array passed as parameter\n * @param {FabricObject[]} objects objects array to look into\n * @param {Point} pointer coordinates from viewport to check.\n * @return {FabricObject} **top most object on screen** that contains pointer\n */\n searchPossibleTargets(\n objects: FabricObject[],\n pointer: Point,\n ): TargetsInfoWithContainer {\n const targetInfo: TargetsInfoWithContainer = this._searchPossibleTargets(\n objects,\n pointer,\n [],\n );\n\n // outermost target is the container.\n targetInfo.container = targetInfo.target;\n const { container, subTargets } = targetInfo;\n\n if (\n container &&\n isCollection(container) &&\n container.interactive &&\n subTargets[0]\n ) {\n /** subTargets[0] is the innermost nested target, but it could be inside non interactive groups\n * and so not a possible selection target.\n * We loop the array from the end that is outermost innertarget.\n */\n for (let i = subTargets.length - 1; i > 0; i--) {\n const t = subTargets[i];\n if (!(isCollection(t) && t.interactive)) {\n // one of the subtargets was not interactive. that is the last subtarget we can return.\n // we can't dig more deep;\n targetInfo.target = t;\n return targetInfo;\n }\n }\n targetInfo.target = subTargets[0];\n return targetInfo;\n }\n\n return targetInfo;\n }\n\n /**\n * @returns point existing in the same plane as the {@link HTMLCanvasElement},\n * `(0, 0)` being the top left corner of the {@link HTMLCanvasElement}.\n * This means that changes to the {@link viewportTransform} do not change the values of the point\n * and it remains unchanged from the viewer's perspective.\n *\n * @example\n * const scenePoint = sendPointToPlane(\n * this.getViewportPoint(e),\n * undefined,\n * canvas.viewportTransform\n * );\n *\n */\n getViewportPoint(e: TPointerEvent) {\n if (this._viewportPoint) {\n return this._viewportPoint;\n }\n return this._getPointerImpl(e, true);\n }\n\n /**\n * @returns point existing in the scene (the same plane as the plane {@link FabricObject#getCenterPoint} exists in).\n * This means that changes to the {@link viewportTransform} do not change the values of the point,\n * however, from the viewer's perspective, the point is changed.\n *\n * @example\n * const viewportPoint = sendPointToPlane(\n * this.getScenePoint(e),\n * canvas.viewportTransform\n * );\n *\n */\n getScenePoint(e: TPointerEvent) {\n if (this._scenePoint) {\n return this._scenePoint;\n }\n return this._getPointerImpl(e);\n }\n\n /**\n * Returns pointer relative to canvas.\n *\n * Use {@link getViewportPoint} or {@link getScenePoint} instead.\n *\n * @param {Event} e\n * @param {Boolean} [fromViewport] whether to return the point from the viewport or in the scene\n * @return {Point}\n */\n protected _getPointerImpl(e: TPointerEvent, fromViewport = false): Point {\n const upperCanvasEl = this.upperCanvasEl,\n bounds = upperCanvasEl.getBoundingClientRect();\n let pointer = getPointer(e),\n boundsWidth = bounds.width || 0,\n boundsHeight = bounds.height || 0;\n\n if (!boundsWidth || !boundsHeight) {\n if (TOP in bounds && BOTTOM in bounds) {\n boundsHeight = Math.abs(bounds.top - bounds.bottom);\n }\n if (RIGHT in bounds && LEFT in bounds) {\n boundsWidth = Math.abs(bounds.right - bounds.left);\n }\n }\n\n this.calcOffset();\n pointer.x = pointer.x - this._offset.left;\n pointer.y = pointer.y - this._offset.top;\n if (!fromViewport) {\n pointer = sendPointToPlane(pointer, undefined, this.viewportTransform);\n }\n\n const retinaScaling = this.getRetinaScaling();\n if (retinaScaling !== 1) {\n pointer.x /= retinaScaling;\n pointer.y /= retinaScaling;\n }\n\n // If bounds are not available (i.e. not visible), do not apply scale.\n const cssScale =\n boundsWidth === 0 || boundsHeight === 0\n ? new Point(1, 1)\n : new Point(\n upperCanvasEl.width / boundsWidth,\n upperCanvasEl.height / boundsHeight,\n );\n\n return pointer.multiply(cssScale);\n }\n\n /**\n * Internal use only\n * @protected\n */\n protected _setDimensionsImpl(\n dimensions: TSize,\n options?: TCanvasSizeOptions,\n ) {\n // @ts-expect-error this method exists in the subclass - should be moved or declared as abstract\n this._resetTransformEventData();\n super._setDimensionsImpl(dimensions, options);\n if (this._isCurrentlyDrawing) {\n this.freeDrawingBrush &&\n this.freeDrawingBrush._setBrushStyles(this.contextTop);\n }\n }\n\n protected _createCacheCanvas() {\n this.pixelFindCanvasEl = createCanvasElement();\n this.pixelFindContext = this.pixelFindCanvasEl.getContext('2d', {\n willReadFrequently: true,\n })!;\n this.setTargetFindTolerance(this.targetFindTolerance);\n }\n\n /**\n * Returns context of top canvas where interactions are drawn\n * @returns {CanvasRenderingContext2D}\n */\n getTopContext(): CanvasRenderingContext2D {\n return this.elements.upper.ctx;\n }\n\n /**\n * Returns context of canvas where object selection is drawn\n * @alias\n * @return {CanvasRenderingContext2D}\n */\n getSelectionContext(): CanvasRenderingContext2D {\n return this.elements.upper.ctx;\n }\n\n /**\n * Returns <canvas> element on which object selection is drawn\n * @return {HTMLCanvasElement}\n */\n getSelectionElement(): HTMLCanvasElement {\n return this.elements.upper.el;\n }\n\n /**\n * Returns currently active object\n * @return {FabricObject | null} active object\n */\n getActiveObject(): FabricObject | undefined {\n return this._activeObject;\n }\n\n /**\n * Returns an array with the current selected objects\n * @return {FabricObject[]} active objects array\n */\n getActiveObjects(): FabricObject[] {\n const active = this._activeObject;\n return isActiveSelection(active)\n ? active.getObjects()\n : active\n ? [active]\n : [];\n }\n\n /**\n * @private\n * Compares the old activeObject with the current one and fires correct events\n * @param {FabricObject[]} oldObjects old activeObject\n * @param {TPointerEvent} e mouse event triggering the selection events\n */\n _fireSelectionEvents(oldObjects: FabricObject[], e?: TPointerEvent) {\n let somethingChanged = false,\n invalidate = false;\n const objects = this.getActiveObjects(),\n added: FabricObject[] = [],\n removed: FabricObject[] = [];\n\n oldObjects.forEach((target) => {\n if (!objects.includes(target)) {\n somethingChanged = true;\n target.fire('deselected', {\n e,\n target,\n });\n removed.push(target);\n }\n });\n\n objects.forEach((target) => {\n if (!oldObjects.includes(target)) {\n somethingChanged = true;\n target.fire('selected', {\n e,\n target,\n });\n added.push(target);\n }\n });\n\n if (oldObjects.length > 0 && objects.length > 0) {\n invalidate = true;\n somethingChanged &&\n this.fire('selection:updated', {\n e,\n selected: added,\n deselected: removed,\n });\n } else if (objects.length > 0) {\n invalidate = true;\n this.fire('selection:created', {\n e,\n selected: added,\n });\n } else if (oldObjects.length > 0) {\n invalidate = true;\n this.fire('selection:cleared', {\n e,\n deselected: removed,\n });\n }\n invalidate && (this._objectsToRender = undefined);\n }\n\n /**\n * Sets given object as the only active object on canvas\n * @param {FabricObject} object Object to set as an active one\n * @param {TPointerEvent} [e] Event (passed along when firing \"object:selected\")\n * @return {Boolean} true if the object has been selected\n */\n setActiveObject(object: FabricObject, e?: TPointerEvent) {\n // we can't inline this, since _setActiveObject will change what getActiveObjects returns\n const currentActives = this.getActiveObjects();\n const selected = this._setActiveObject(object, e);\n this._fireSelectionEvents(currentActives, e);\n return selected;\n }\n\n /**\n * This is supposed to be equivalent to setActiveObject but without firing\n * any event. There is commitment to have this stay this way.\n * This is the functional part of setActiveObject.\n * @param {Object} object to set as active\n * @param {Event} [e] Event (passed along when firing \"object:selected\")\n * @return {Boolean} true if the object has been selected\n */\n _setActiveObject(object: FabricObject, e?: TPointerEvent) {\n const prevActiveObject = this._activeObject;\n if (prevActiveObject === object) {\n return false;\n }\n // after calling this._discardActiveObject, this,_activeObject could be undefined\n if (!this._discardActiveObject(e, object) && this._activeObject) {\n // refused to deselect\n return false;\n }\n if (object.onSelect({ e })) {\n return false;\n }\n\n this._activeObject = object;\n\n if (isActiveSelection(object) && prevActiveObject !== object) {\n object.set('canvas', this);\n }\n object.setCoords();\n\n return true;\n }\n\n /**\n * This is supposed to be equivalent to discardActiveObject but without firing\n * any selection events ( can still fire object transformation events ). There is commitment to have this stay this way.\n * This is the functional part of discardActiveObject.\n * @param {Event} [e] Event (passed along when firing \"object:deselected\")\n * @param {Object} object the next object to set as active, reason why we are discarding this\n * @return {Boolean} true if the active object has been discarded\n */\n _discardActiveObject(\n e?: TPointerEvent,\n object?: FabricObject,\n ): this is { _activeObject: undefined } {\n const obj = this._activeObject;\n if (obj) {\n // onDeselect return TRUE to cancel selection;\n if (obj.onDeselect({ e, object })) {\n return false;\n }\n if (this._currentTransform && this._currentTransform.target === obj) {\n this.endCurrentTransform(e);\n }\n if (isActiveSelection(obj) && obj === this._hoveredTarget) {\n this._hoveredTarget = undefined;\n }\n this._activeObject = undefined;\n return true;\n }\n return false;\n }\n\n /**\n * Discards currently active object and fire events. If the function is called by fabric\n * as a consequence of a mouse event, the event is passed as a parameter and\n * sent to the fire function for the custom events. When used as a method the\n * e param does not have any application.\n * @param {event} e\n * @return {Boolean} true if the active object has been discarded\n */\n discardActiveObject(e?: TPointerEvent): this is { _activeObject: undefined } {\n const currentActives = this.getActiveObjects(),\n activeObject = this.getActiveObject();\n if (currentActives.length) {\n this.fire('before:selection:cleared', {\n e,\n deselected: [activeObject!],\n });\n }\n const discarded = this._discardActiveObject(e);\n this._fireSelectionEvents(currentActives, e);\n return discarded;\n }\n\n /**\n * End the current transform.\n * You don't usually need to call this method unless you are interrupting a user initiated transform\n * because of some other event ( a press of key combination, or something that block the user UX )\n * @param {Event} [e] send the mouse event that generate the finalize down, so it can be used in the event\n */\n endCurrentTransform(e?: TPointerEvent) {\n const transform = this._currentTransform;\n this._finalizeCurrentTransform(e);\n if (transform && transform.target) {\n // this could probably go inside _finalizeCurrentTransform\n transform.target.isMoving = false;\n }\n this._currentTransform = null;\n }\n\n /**\n * @private\n * @param {Event} e send the mouse event that generate the finalize down, so it can be used in the event\n */\n _finalizeCurrentTransform(e?: TPointerEvent) {\n const transform = this._currentTransform!,\n target = transform.target,\n options = {\n e,\n target,\n transform,\n action: transform.action,\n };\n\n if (target._scaling) {\n target._scaling = false;\n }\n\n target.setCoords();\n\n if (transform.actionPerformed) {\n this.fire('object:modified', options);\n target.fire(MODIFIED, options);\n }\n }\n\n /**\n * Sets viewport transformation of this canvas instance\n * @param {Array} vpt a Canvas 2D API transform matrix\n */\n setViewportTransform(vpt: TMat2D) {\n super.setViewportTransform(vpt);\n const activeObject = this._activeObject;\n if (activeObject) {\n activeObject.setCoords();\n }\n }\n\n /**\n * @override clears active selection ref and interactive canvas elements and contexts\n */\n destroy() {\n // dispose of active selection\n const activeObject = this._activeObject;\n if (isActiveSelection(activeObject)) {\n activeObject.removeAll();\n activeObject.dispose();\n }\n\n delete this._activeObject;\n\n super.destroy();\n\n // free resources\n\n // pixel find canvas\n // @ts-expect-error disposing\n this.pixelFindContext = null;\n // @ts-expect-error disposing\n this.pixelFindCanvasEl = undefined;\n }\n\n /**\n * Clears all contexts (background, main, top) of an instance\n */\n clear() {\n // discard active object and fire events\n this.discardActiveObject();\n // make sure we clear the active object in case it refused to be discarded\n this._activeObject = undefined;\n this.clearContext(this.contextTop);\n super.clear();\n }\n\n /**\n * Draws objects' controls (borders/controls)\n * @param {CanvasRenderingContext2D} ctx Context to render controls on\n */\n drawControls(ctx: CanvasRenderingContext2D) {\n const activeObject = this._activeObject;\n\n if (activeObject) {\n activeObject._renderControls(ctx);\n }\n }\n\n /**\n * @private\n */\n protected _toObject(\n instance: FabricObject,\n methodName: 'toObject' | 'toDatalessObject',\n propertiesToInclude: string[],\n ): Record {\n // If the object is part of the current selection group, it should\n // be transformed appropriately\n // i.e. it should be serialised as it would appear if the selection group\n // were to be destroyed.\n const originalProperties = this._realizeGroupTransformOnObject(instance),\n object = super._toObject(instance, methodName, propertiesToInclude);\n //Undo the damage we did by changing all of its properties\n instance.set(originalProperties);\n return object;\n }\n\n /**\n * Realizes an object's group transformation on it\n * @private\n * @param {FabricObject} [instance] the object to transform (gets mutated)\n * @returns the original values of instance which were changed\n */\n private _realizeGroupTransformOnObject(\n instance: FabricObject,\n ): Partial {\n const { group } = instance;\n if (group && isActiveSelection(group) && this._activeObject === group) {\n const layoutProps = [\n 'angle',\n 'flipX',\n 'flipY',\n LEFT,\n SCALE_X,\n SCALE_Y,\n SKEW_X,\n SKEW_Y,\n TOP,\n ] as (keyof typeof instance)[];\n const originalValues = pick(instance, layoutProps);\n addTransformToObject(instance, group.calcOwnMatrix());\n return originalValues;\n } else {\n return {};\n }\n }\n\n /**\n * @private\n */\n _setSVGObject(\n markup: string[],\n instance: FabricObject,\n reviver?: TSVGReviver,\n ) {\n // If the object is in a selection group, simulate what would happen to that\n // object when the group is deselected\n const originalProperties = this._realizeGroupTransformOnObject(instance);\n super._setSVGObject(markup, instance, reviver);\n instance.set(originalProperties);\n }\n}\n","import type { ModifierKey, TOptionalModifierKey } from '../EventTypeDefs';\nimport type { TOptions } from '../typedefs';\nimport type { StaticCanvasOptions } from './StaticCanvasOptions';\n\nexport interface CanvasTransformOptions {\n /**\n * When true, objects can be transformed by one side (unproportionately)\n * when dragged on the corners that normally would not do that.\n * @type Boolean\n * @since fabric 4.0 // changed name and default value\n */\n uniformScaling: boolean;\n\n /**\n * Indicates which key switches uniform scaling.\n * values: 'altKey', 'shiftKey', 'ctrlKey'.\n * If `null` or 'none' or any other string that is not a modifier key\n * feature is disabled.\n * totally wrong named. this sounds like `uniform scaling`\n * if Canvas.uniformScaling is true, pressing this will set it to false\n * and viceversa.\n * @since 1.6.2\n * @type ModifierKey\n */\n uniScaleKey: TOptionalModifierKey;\n\n /**\n * When true, objects use center point as the origin of scale transformation.\n * Backwards incompatibility note: This property replaces \"centerTransform\" (Boolean).\n * @since 1.3.4\n * @type Boolean\n */\n centeredScaling: boolean;\n\n /**\n * When true, objects use center point as the origin of rotate transformation.\n * Backwards incompatibility note: This property replaces \"centerTransform\" (Boolean).\n * @since 1.3.4\n * @type Boolean\n */\n centeredRotation: boolean;\n\n /**\n * Indicates which key enable centered Transform\n * values: 'altKey', 'shiftKey', 'ctrlKey'.\n * If `null` or 'none' or any other string that is not a modifier key\n * feature is disabled feature disabled.\n * @since 1.6.2\n * @type ModifierKey\n */\n centeredKey: TOptionalModifierKey;\n\n /**\n * Indicates which key enable alternate action on corner\n * values: 'altKey', 'shiftKey', 'ctrlKey'.\n * If `null` or 'none' or any other string that is not a modifier key\n * feature is disabled feature disabled.\n * @since 1.6.2\n * @type ModifierKey\n */\n altActionKey: TOptionalModifierKey;\n}\n\nexport interface CanvasSelectionOptions {\n /**\n * Indicates whether group selection should be enabled\n * @type Boolean\n */\n selection: boolean;\n\n /**\n * Indicates which key or keys enable multiple click selection\n * Pass value as a string or array of strings\n * values: 'altKey', 'shiftKey', 'ctrlKey'.\n * If `null` or empty or containing any other string that is not a modifier key\n * feature is disabled.\n * @since 1.6.2\n * @type ModifierKey|ModifierKey[]\n */\n selectionKey: TOptionalModifierKey | ModifierKey[];\n\n /**\n * Indicates which key enable alternative selection\n * in case of a target overlapping with active object and we don't want to loose the\n * active selection, we can press this modifier key and continue selecting the current\n * selected object also when is covered by another or many valid targets for selection.\n * values: 'altKey', 'shiftKey', 'ctrlKey'.\n * For a series of reason that come from the general expectations on how\n * things should work, this feature works only for preserveObjectStacking true.\n * If `null` or 'none' or any other string that is not a modifier key\n * feature is disabled.\n * @since 1.6.5\n * @type null|ModifierKey\n */\n altSelectionKey: TOptionalModifierKey;\n\n /**\n * Color of selection\n * @type String\n */\n selectionColor: string;\n\n /**\n * Default dash array pattern\n * If not empty the selection border is dashed\n * @type Array\n */\n selectionDashArray: number[];\n\n /**\n * Color of the border of selection (usually slightly darker than color of selection itself)\n * @type String\n */\n selectionBorderColor: string;\n\n /**\n * Width of a line used in object/group selection\n * @type Number\n */\n selectionLineWidth: number;\n\n /**\n * Select only shapes that are fully contained in the dragged selection rectangle.\n * @type Boolean\n */\n selectionFullyContained: boolean;\n}\n\nexport interface CanvasCursorOptions {\n /**\n * Default cursor value used when hovering over an object on canvas\n * @type CSSStyleDeclaration['cursor']\n * @default move\n */\n hoverCursor: CSSStyleDeclaration['cursor'];\n\n /**\n * Default cursor value used when moving an object on canvas\n * @type CSSStyleDeclaration['cursor']\n * @default move\n */\n moveCursor: CSSStyleDeclaration['cursor'];\n\n /**\n * Default cursor value used for the entire canvas\n * @type String\n * @default default\n */\n defaultCursor: CSSStyleDeclaration['cursor'];\n\n /**\n * Cursor value used during free drawing\n * @type String\n * @default crosshair\n */\n freeDrawingCursor: CSSStyleDeclaration['cursor'];\n\n /**\n * Cursor value used for disabled elements ( corners with disabled action )\n * @type String\n * @since 2.0.0\n * @default not-allowed\n */\n notAllowedCursor: CSSStyleDeclaration['cursor'];\n}\n\nexport interface TargetFindOptions {\n /**\n * When true, object detection happens on per-pixel basis rather than on per-bounding-box\n * @type Boolean\n */\n perPixelTargetFind: boolean;\n\n /**\n * Number of pixels around target pixel to tolerate (consider active) during object detection\n * @type Number\n */\n targetFindTolerance: number;\n\n /**\n * When true, target detection is skipped. Target detection will return always undefined.\n * click selection won't work anymore, events will fire with no targets.\n * if something is selected before setting it to true, it will be deselected at the first click.\n * area selection will still work. check the `selection` property too.\n * if you deactivate both, you should look into staticCanvas.\n * @type Boolean\n */\n skipTargetFind: boolean;\n}\n\nexport interface CanvasEventsOptions {\n /**\n * Indicates if the right click on canvas can output the context menu or not\n * @type Boolean\n * @since 1.6.5\n */\n stopContextMenu: boolean;\n\n /**\n * Indicates if the canvas can fire right click events\n * @type Boolean\n * @since 1.6.5\n */\n fireRightClick: boolean;\n\n /**\n * Indicates if the canvas can fire middle click events\n * @type Boolean\n * @since 1.7.8\n */\n fireMiddleClick: boolean;\n\n /**\n * When the option is enabled, PointerEvent is used instead of TPointerEvent.\n * @type Boolean\n */\n enablePointerEvents: boolean;\n}\n\nexport interface CanvasOptions\n extends StaticCanvasOptions,\n CanvasTransformOptions,\n CanvasSelectionOptions,\n CanvasCursorOptions,\n TargetFindOptions,\n CanvasEventsOptions {\n /**\n * Default element class that's given to wrapper (div) element of canvas\n * @type String\n * @deprecated customize {@link CanvasDOMManager} instead or access {@link elements} directly\n */\n containerClass: string;\n\n /**\n * Indicates whether objects should remain in current stack position when selected.\n * When false objects are brought to top and rendered as part of the selection group\n * @type Boolean\n * @default true\n */\n preserveObjectStacking: boolean;\n}\n\nexport type TCanvasOptions = TOptions;\n\nexport const canvasDefaults: TOptions = {\n uniformScaling: true,\n uniScaleKey: 'shiftKey',\n centeredScaling: false,\n centeredRotation: false,\n centeredKey: 'altKey',\n altActionKey: 'shiftKey',\n\n selection: true,\n selectionKey: 'shiftKey',\n selectionColor: 'rgba(100, 100, 255, 0.3)',\n selectionDashArray: [],\n selectionBorderColor: 'rgba(255, 255, 255, 0.3)',\n selectionLineWidth: 1,\n selectionFullyContained: false,\n\n hoverCursor: 'move',\n moveCursor: 'move',\n defaultCursor: 'default',\n freeDrawingCursor: 'crosshair',\n notAllowedCursor: 'not-allowed',\n\n perPixelTargetFind: false,\n targetFindTolerance: 0,\n skipTargetFind: false,\n\n stopContextMenu: false,\n fireRightClick: false,\n fireMiddleClick: false,\n enablePointerEvents: false,\n\n containerClass: 'canvas-container',\n preserveObjectStacking: true,\n};\n","import type { TPointerEvent } from '../EventTypeDefs';\nimport type { ITextBehavior } from '../shapes/IText/ITextBehavior';\nimport { removeFromArray } from '../util/internals/removeFromArray';\nimport type { Canvas } from './Canvas';\n\n/**\n * In charge of synchronizing all interactive text instances of a canvas\n */\nexport class TextEditingManager {\n private targets: ITextBehavior[] = [];\n declare private target?: ITextBehavior;\n private __disposer: VoidFunction;\n\n constructor(canvas: Canvas) {\n const cb = () => {\n const { hiddenTextarea } =\n (canvas.getActiveObject() as ITextBehavior) || {};\n hiddenTextarea && hiddenTextarea.focus();\n };\n const el = canvas.upperCanvasEl;\n el.addEventListener('click', cb);\n this.__disposer = () => el.removeEventListener('click', cb);\n }\n\n exitTextEditing() {\n this.target = undefined;\n this.targets.forEach((target) => {\n if (target.isEditing) {\n target.exitEditing();\n }\n });\n }\n\n add(target: ITextBehavior) {\n this.targets.push(target);\n }\n\n remove(target: ITextBehavior) {\n this.unregister(target);\n removeFromArray(this.targets, target);\n }\n\n register(target: ITextBehavior) {\n this.target = target;\n }\n\n unregister(target: ITextBehavior) {\n if (target === this.target) {\n this.target = undefined;\n }\n }\n\n onMouseMove(e: TPointerEvent) {\n this.target?.isEditing && this.target.updateSelectionOnMouseMove(e);\n }\n\n clear() {\n this.targets = [];\n this.target = undefined;\n }\n\n dispose() {\n this.clear();\n this.__disposer();\n // @ts-expect-error disposing\n delete this.__disposer;\n }\n}\n","import { classRegistry } from '../ClassRegistry';\nimport { NONE } from '../constants';\nimport type {\n CanvasEvents,\n DragEventData,\n ObjectEvents,\n TEventsExtraData,\n TPointerEvent,\n TPointerEventNames,\n Transform,\n} from '../EventTypeDefs';\nimport { Point } from '../Point';\nimport type { ActiveSelection } from '../shapes/ActiveSelection';\nimport type { Group } from '../shapes/Group';\nimport type { IText } from '../shapes/IText/IText';\nimport type { FabricObject } from '../shapes/Object/FabricObject';\nimport { isTouchEvent, stopEvent } from '../util/dom_event';\nimport { getDocumentFromElement, getWindowFromElement } from '../util/dom_misc';\nimport { sendPointToPlane } from '../util/misc/planeChange';\nimport { isActiveSelection } from '../util/typeAssertions';\nimport type { CanvasOptions, TCanvasOptions } from './CanvasOptions';\nimport { SelectableCanvas } from './SelectableCanvas';\nimport { TextEditingManager } from './TextEditingManager';\n\nconst addEventOptions = { passive: false } as EventListenerOptions;\n\nconst getEventPoints = (canvas: Canvas, e: TPointerEvent) => {\n const viewportPoint = canvas.getViewportPoint(e);\n const scenePoint = canvas.getScenePoint(e);\n return {\n viewportPoint,\n scenePoint,\n };\n};\n\n// just to be clear, the utils are now deprecated and those are here exactly as minifier helpers\n// because el.addEventListener can't me be minified while a const yes and we use it 47 times in this file.\n// few bytes but why give it away.\nconst addListener = (\n el: HTMLElement | Document,\n ...args: Parameters\n) => el.addEventListener(...args);\nconst removeListener = (\n el: HTMLElement | Document,\n ...args: Parameters\n) => el.removeEventListener(...args);\n\nconst syntheticEventConfig = {\n mouse: {\n in: 'over',\n out: 'out',\n targetIn: 'mouseover',\n targetOut: 'mouseout',\n canvasIn: 'mouse:over',\n canvasOut: 'mouse:out',\n },\n drag: {\n in: 'enter',\n out: 'leave',\n targetIn: 'dragenter',\n targetOut: 'dragleave',\n canvasIn: 'drag:enter',\n canvasOut: 'drag:leave',\n },\n} as const;\n\ntype TSyntheticEventContext = {\n mouse: { e: TPointerEvent };\n drag: DragEventData;\n};\n\nexport class Canvas extends SelectableCanvas implements CanvasOptions {\n /**\n * Contains the id of the touch event that owns the fabric transform\n * @type Number\n * @private\n */\n declare mainTouchId?: number;\n\n declare enablePointerEvents: boolean;\n\n /**\n * Holds a reference to a setTimeout timer for event synchronization\n * @type number\n * @private\n */\n declare private _willAddMouseDown: number;\n\n /**\n * Holds a reference to an object on the canvas that is receiving the drag over event.\n * @type FabricObject\n * @private\n */\n declare private _draggedoverTarget?: FabricObject;\n\n /**\n * Holds a reference to an object on the canvas from where the drag operation started\n * @type FabricObject\n * @private\n */\n declare private _dragSource?: FabricObject;\n\n /**\n * Holds a reference to an object on the canvas that is the current drop target\n * May differ from {@link _draggedoverTarget}\n * @todo inspect whether {@link _draggedoverTarget} and {@link _dropTarget} should be merged somehow\n * @type FabricObject\n * @private\n */\n declare private _dropTarget: FabricObject | undefined;\n\n /**\n * a boolean that keeps track of the click state during a cycle of mouse down/up.\n * If a mouse move occurs it becomes false.\n * Is true by default, turns false on mouse move.\n * Used to determine if a mouseUp is a click\n */\n private _isClick: boolean;\n\n textEditingManager = new TextEditingManager(this);\n\n constructor(el?: string | HTMLCanvasElement, options: TCanvasOptions = {}) {\n super(el, options);\n // bind event handlers\n (\n [\n '_onMouseDown',\n '_onTouchStart',\n '_onMouseMove',\n '_onMouseUp',\n '_onTouchEnd',\n '_onResize',\n // '_onGesture',\n // '_onDrag',\n // '_onShake',\n // '_onLongPress',\n // '_onOrientationChange',\n '_onMouseWheel',\n '_onMouseOut',\n '_onMouseEnter',\n '_onContextMenu',\n '_onClick',\n '_onDragStart',\n '_onDragEnd',\n '_onDragProgress',\n '_onDragOver',\n '_onDragEnter',\n '_onDragLeave',\n '_onDrop',\n ] as (keyof this)[]\n ).forEach((eventHandler) => {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-function-type\n this[eventHandler] = (this[eventHandler] as Function).bind(this);\n });\n // register event handlers\n this.addOrRemove(addListener, 'add');\n }\n\n /**\n * return an event prefix pointer or mouse.\n * @private\n */\n private _getEventPrefix() {\n return this.enablePointerEvents ? 'pointer' : 'mouse';\n }\n\n addOrRemove(functor: any, _eventjsFunctor: 'add' | 'remove') {\n const canvasElement = this.upperCanvasEl,\n eventTypePrefix = this._getEventPrefix();\n functor(getWindowFromElement(canvasElement), 'resize', this._onResize);\n functor(canvasElement, eventTypePrefix + 'down', this._onMouseDown);\n functor(\n canvasElement,\n `${eventTypePrefix}move`,\n this._onMouseMove,\n addEventOptions,\n );\n functor(canvasElement, `${eventTypePrefix}out`, this._onMouseOut);\n functor(canvasElement, `${eventTypePrefix}enter`, this._onMouseEnter);\n functor(canvasElement, 'wheel', this._onMouseWheel);\n functor(canvasElement, 'contextmenu', this._onContextMenu);\n functor(canvasElement, 'click', this._onClick);\n // decide if to remove in fabric 7.0\n functor(canvasElement, 'dblclick', this._onClick);\n functor(canvasElement, 'dragstart', this._onDragStart);\n functor(canvasElement, 'dragend', this._onDragEnd);\n functor(canvasElement, 'dragover', this._onDragOver);\n functor(canvasElement, 'dragenter', this._onDragEnter);\n functor(canvasElement, 'dragleave', this._onDragLeave);\n functor(canvasElement, 'drop', this._onDrop);\n if (!this.enablePointerEvents) {\n functor(canvasElement, 'touchstart', this._onTouchStart, addEventOptions);\n }\n // if (typeof eventjs !== 'undefined' && eventjsFunctor in eventjs) {\n // eventjs[eventjsFunctor](canvasElement, 'gesture', this._onGesture);\n // eventjs[eventjsFunctor](canvasElement, 'drag', this._onDrag);\n // eventjs[eventjsFunctor](\n // canvasElement,\n // 'orientation',\n // this._onOrientationChange\n // );\n // eventjs[eventjsFunctor](canvasElement, 'shake', this._onShake);\n // eventjs[eventjsFunctor](canvasElement, 'longpress', this._onLongPress);\n // }\n }\n\n /**\n * Removes all event listeners, used when disposing the instance\n */\n removeListeners() {\n this.addOrRemove(removeListener, 'remove');\n // if you dispose on a mouseDown, before mouse up, you need to clean document to...\n const eventTypePrefix = this._getEventPrefix();\n const doc = getDocumentFromElement(this.upperCanvasEl);\n removeListener(\n doc,\n `${eventTypePrefix}up`,\n this._onMouseUp as EventListener,\n );\n removeListener(\n doc,\n 'touchend',\n this._onTouchEnd as EventListener,\n addEventOptions,\n );\n removeListener(\n doc,\n `${eventTypePrefix}move`,\n this._onMouseMove as EventListener,\n addEventOptions,\n );\n removeListener(\n doc,\n 'touchmove',\n this._onMouseMove as EventListener,\n addEventOptions,\n );\n clearTimeout(this._willAddMouseDown);\n }\n\n /**\n * @private\n * @param {Event} [e] Event object fired on wheel event\n */\n private _onMouseWheel(e: MouseEvent) {\n this._cacheTransformEventData(e);\n this._handleEvent(e, 'wheel');\n this._resetTransformEventData();\n }\n\n /**\n * @private\n * @param {Event} e Event object fired on mousedown\n */\n private _onMouseOut(e: TPointerEvent) {\n const target = this._hoveredTarget;\n const shared = {\n e,\n ...getEventPoints(this, e),\n };\n this.fire('mouse:out', { ...shared, target });\n this._hoveredTarget = undefined;\n target && target.fire('mouseout', { ...shared });\n this._hoveredTargets.forEach((nestedTarget) => {\n this.fire('mouse:out', { ...shared, target: nestedTarget });\n nestedTarget && nestedTarget.fire('mouseout', { ...shared });\n });\n this._hoveredTargets = [];\n }\n\n /**\n * @private\n * Used when the mouse cursor enter the canvas from outside\n * @param {Event} e Event object fired on mouseenter\n */\n private _onMouseEnter(e: TPointerEvent) {\n // This find target and consequent 'mouse:over' is used to\n // clear old instances on hovered target.\n // calling findTarget has the side effect of killing target.__corner.\n // as a short term fix we are not firing this if we are currently transforming.\n // as a long term fix we need to separate the action of finding a target with the\n // side effects we added to it.\n const { target } = this.findTarget(e);\n // we fire the event only when there is no target, if there is a target, the specific\n // target event will fire.\n if (!this._currentTransform && !target) {\n this.fire('mouse:over', {\n e,\n ...getEventPoints(this, e),\n });\n this._hoveredTarget = undefined;\n this._hoveredTargets = [];\n }\n }\n\n /**\n * supports native like text dragging\n * @private\n * @param {DragEvent} e\n */\n private _onDragStart(e: DragEvent) {\n this._isClick = false;\n const activeObject = this.getActiveObject();\n if (activeObject && activeObject.onDragStart(e)) {\n this._dragSource = activeObject;\n const options = { e, target: activeObject };\n this.fire('dragstart', options);\n activeObject.fire('dragstart', options);\n addListener(\n this.upperCanvasEl,\n 'drag',\n this._onDragProgress as EventListener,\n );\n return;\n }\n stopEvent(e);\n }\n\n /**\n * First we clear top context where the effects are being rendered.\n * Then we render the effects.\n * Doing so will render the correct effect for all cases including an overlap between `source` and `target`.\n * @private\n */\n private _renderDragEffects(\n e: DragEvent,\n source?: FabricObject,\n target?: FabricObject,\n ) {\n let dirty = false;\n // clear top context\n const dropTarget = this._dropTarget;\n if (dropTarget && dropTarget !== source && dropTarget !== target) {\n dropTarget.clearContextTop();\n dirty = true;\n }\n source?.clearContextTop();\n target !== source && target?.clearContextTop();\n // render effects\n const ctx = this.contextTop;\n ctx.save();\n ctx.transform(...this.viewportTransform);\n if (source) {\n ctx.save();\n source.transform(ctx);\n source.renderDragSourceEffect(e);\n ctx.restore();\n dirty = true;\n }\n if (target) {\n ctx.save();\n target.transform(ctx);\n target.renderDropTargetEffect(e);\n ctx.restore();\n dirty = true;\n }\n ctx.restore();\n dirty && (this.contextTopDirty = true);\n }\n\n /**\n * supports native like text dragging\n * https://developer.mozilla.org/en-US/docs/Web/API/HTML_Drag_and_Drop_API/Drag_operations#finishing_a_drag\n * @private\n * @param {DragEvent} e\n */\n private _onDragEnd(e: DragEvent) {\n const { currentSubTargets } = this.findTarget(e);\n const didDrop = !!e.dataTransfer && e.dataTransfer.dropEffect !== NONE,\n dropTarget = didDrop ? this._activeObject : undefined,\n options = {\n e,\n target: this._dragSource as FabricObject,\n subTargets: currentSubTargets,\n dragSource: this._dragSource as FabricObject,\n didDrop,\n dropTarget: dropTarget as FabricObject,\n };\n removeListener(\n this.upperCanvasEl,\n 'drag',\n this._onDragProgress as EventListener,\n );\n this.fire('dragend', options);\n this._dragSource && this._dragSource.fire('dragend', options);\n delete this._dragSource;\n // we need to call mouse up synthetically because the browser won't\n this._onMouseUp(e);\n }\n\n /**\n * fire `drag` event on canvas and drag source\n * @private\n * @param {DragEvent} e\n */\n private _onDragProgress(e: DragEvent) {\n const options = {\n e,\n target: this._dragSource,\n dragSource: this._dragSource,\n dropTarget: this._draggedoverTarget as FabricObject,\n };\n this.fire('drag', options);\n this._dragSource && this._dragSource.fire('drag', options);\n }\n\n /**\n * prevent default to allow drop event to be fired\n * https://developer.mozilla.org/en-US/docs/Web/API/HTML_Drag_and_Drop_API/Drag_operations#specifying_drop_targets\n * @private\n * @param {DragEvent} [e] Event object fired on Event.js shake\n */\n private _onDragOver(e: DragEvent) {\n const eventType = 'dragover';\n const { currentContainer: target, currentSubTargets } = this.findTarget(e);\n const dragSource = this._dragSource as FabricObject;\n const options = {\n e,\n target,\n subTargets: currentSubTargets,\n dragSource,\n canDrop: false,\n dropTarget: undefined,\n };\n let dropTarget;\n // fire on canvas\n this.fire(eventType, options);\n // make sure we fire dragenter events before dragover\n // if dragleave is needed, object will not fire dragover so we don't need to trouble ourselves with it\n this._fireEnterLeaveEvents(e, target, options);\n if (target) {\n if (target.canDrop(e)) {\n dropTarget = target;\n }\n target.fire(eventType, options);\n }\n // propagate the event to subtargets\n for (let i = 0; i < currentSubTargets.length; i++) {\n const subTarget = currentSubTargets[i];\n // accept event only if previous targets didn't (the accepting target calls `preventDefault` to inform that the event is taken)\n // TODO: verify if those should loop in inverse order then?\n // what is the order of subtargets?\n if (subTarget.canDrop(e)) {\n dropTarget = subTarget;\n }\n subTarget.fire(eventType, options);\n }\n // render drag effects now that relations between source and target is clear\n this._renderDragEffects(e, dragSource, dropTarget);\n this._dropTarget = dropTarget;\n }\n\n /**\n * fire `dragleave` on `dragover` targets\n * @private\n * @param {Event} [e] Event object fired on Event.js shake\n */\n private _onDragEnter(e: DragEvent) {\n const { currentContainer, currentSubTargets } = this.findTarget(e);\n const options = {\n e,\n target: currentContainer,\n subTargets: currentSubTargets,\n dragSource: this._dragSource,\n };\n this.fire('dragenter', options);\n // fire dragenter on targets\n this._fireEnterLeaveEvents(e, currentContainer, options);\n }\n\n /**\n * fire `dragleave` on `dragover` targets\n * @private\n * @param {Event} [e] Event object fired on Event.js shake\n */\n private _onDragLeave(e: DragEvent) {\n const { currentSubTargets } = this.findTarget(e);\n const options = {\n e,\n target: this._draggedoverTarget,\n subTargets: currentSubTargets,\n dragSource: this._dragSource,\n };\n this.fire('dragleave', options);\n\n // fire dragleave on targets\n this._fireEnterLeaveEvents(e, undefined, options);\n this._renderDragEffects(e, this._dragSource);\n this._dropTarget = undefined;\n this._hoveredTargets = [];\n }\n\n /**\n * `drop:before` is a an event that allows you to schedule logic\n * before the `drop` event. Prefer `drop` event always, but if you need\n * to run some drop-disabling logic on an event, since there is no way\n * to handle event handlers ordering, use `drop:before`\n * @private\n * @param {Event} e\n */\n private _onDrop(e: DragEvent) {\n const { currentContainer, currentSubTargets } = this.findTarget(e);\n const options = this._basicEventHandler('drop:before', {\n e,\n target: currentContainer,\n subTargets: currentSubTargets,\n dragSource: this._dragSource,\n ...getEventPoints(this, e),\n });\n // will be set by the drop target\n options.didDrop = false;\n // will be set by the drop target, used in case options.target refuses the drop\n options.dropTarget = undefined;\n // fire `drop`\n this._basicEventHandler('drop', options);\n // inform canvas of the drop\n // we do this because canvas was unaware of what happened at the time the `drop` event was fired on it\n // use for side effects\n this.fire('drop:after', options);\n }\n\n /**\n * @private\n * @param {Event} e Event object fired on mousedown\n */\n private _onContextMenu(e: TPointerEvent): false {\n const { target, subTargets } = this.findTarget(e);\n const options = this._basicEventHandler('contextmenu:before', {\n e,\n target,\n subTargets,\n });\n // TODO: this line is silly because the dev can subscribe to the event and prevent it themselves\n this.stopContextMenu && stopEvent(e);\n this._basicEventHandler('contextmenu', options);\n return false;\n }\n\n /**\n * @private\n * @param {Event} e Event object fired on mousedown\n */\n private _onClick(e: TPointerEvent) {\n const clicks = e.detail;\n if (clicks > 3 || clicks < 2) return;\n this._cacheTransformEventData(e);\n clicks == 2 && e.type === 'dblclick' && this._handleEvent(e, 'dblclick');\n clicks == 3 && this._handleEvent(e, 'tripleclick');\n this._resetTransformEventData();\n }\n\n /**\n * Return a the id of an event.\n * returns either the pointerId or the identifier or 0 for the mouse event\n * @private\n * @param {Event} evt Event object\n */\n getPointerId(evt: TouchEvent | PointerEvent): number {\n const changedTouches = (evt as TouchEvent).changedTouches;\n\n if (changedTouches) {\n return changedTouches[0] && changedTouches[0].identifier;\n }\n\n if (this.enablePointerEvents) {\n return (evt as PointerEvent).pointerId;\n }\n\n return -1;\n }\n\n /**\n * Determines if an event has the id of the event that is considered main\n * @private\n * @param {evt} event Event object\n */\n _isMainEvent(evt: TPointerEvent): boolean {\n if ((evt as PointerEvent).isPrimary === true) {\n return true;\n }\n if ((evt as PointerEvent).isPrimary === false) {\n return false;\n }\n if (evt.type === 'touchend' && (evt as TouchEvent).touches.length === 0) {\n return true;\n }\n if ((evt as TouchEvent).changedTouches) {\n return (\n (evt as TouchEvent).changedTouches[0].identifier === this.mainTouchId\n );\n }\n return true;\n }\n\n /**\n * @private\n * @param {Event} e Event object fired on mousedown\n */\n _onTouchStart(e: TouchEvent) {\n this._cacheTransformEventData(e);\n // we will prevent scrolling if allowTouchScrolling is not enabled and\n let shouldPreventScrolling = !this.allowTouchScrolling;\n const currentActiveObject = this._activeObject;\n if (this.mainTouchId === undefined) {\n this.mainTouchId = this.getPointerId(e);\n }\n this.__onMouseDown(e);\n const { target } = this.findTarget(e);\n // after executing fabric logic for mouse down let's see\n // if we didn't change target or if we are drawing\n // we want to prevent scrolling anyway\n if (\n this.isDrawingMode ||\n (currentActiveObject && target === currentActiveObject)\n ) {\n shouldPreventScrolling = true;\n }\n // prevent default, will block scrolling from start\n shouldPreventScrolling && e.preventDefault();\n const canvasElement = this.upperCanvasEl,\n eventTypePrefix = this._getEventPrefix();\n const doc = getDocumentFromElement(canvasElement);\n addListener(\n doc,\n 'touchend',\n this._onTouchEnd as EventListener,\n addEventOptions,\n );\n // if we scroll don't register the touch move event\n shouldPreventScrolling &&\n addListener(\n doc,\n 'touchmove',\n this._onMouseMove as EventListener,\n addEventOptions,\n );\n // Unbind mousedown to prevent double triggers from touch devices\n removeListener(\n canvasElement,\n `${eventTypePrefix}down`,\n this._onMouseDown as EventListener,\n );\n this._resetTransformEventData();\n }\n\n /**\n * @private\n * @param {Event} e Event object fired on mousedown\n */\n _onMouseDown(e: TPointerEvent) {\n this._cacheTransformEventData(e);\n this.__onMouseDown(e);\n const canvasElement = this.upperCanvasEl,\n eventTypePrefix = this._getEventPrefix();\n // switch from moving on the canvas element to moving on the document\n removeListener(\n canvasElement,\n `${eventTypePrefix}move`,\n this._onMouseMove as EventListener,\n addEventOptions,\n );\n const doc = getDocumentFromElement(canvasElement);\n addListener(doc, `${eventTypePrefix}up`, this._onMouseUp as EventListener);\n addListener(\n doc,\n `${eventTypePrefix}move`,\n this._onMouseMove as EventListener,\n addEventOptions,\n );\n this._resetTransformEventData();\n }\n\n /**\n * @private\n * @param {Event} e Event object fired on mousedown\n */\n _onTouchEnd(e: TouchEvent) {\n if (e.touches.length > 0) {\n // if there are still touches stop here\n return;\n }\n this._cacheTransformEventData(e);\n this.__onMouseUp(e);\n this._resetTransformEventData();\n delete this.mainTouchId;\n const eventTypePrefix = this._getEventPrefix();\n const doc = getDocumentFromElement(this.upperCanvasEl);\n removeListener(\n doc,\n 'touchend',\n this._onTouchEnd as EventListener,\n addEventOptions,\n );\n removeListener(\n doc,\n 'touchmove',\n this._onMouseMove as EventListener,\n addEventOptions,\n );\n if (this._willAddMouseDown) {\n clearTimeout(this._willAddMouseDown);\n }\n this._willAddMouseDown = setTimeout(() => {\n // Wait 400ms before rebinding mousedown to prevent double triggers\n // from touch devices\n addListener(\n this.upperCanvasEl,\n `${eventTypePrefix}down`,\n this._onMouseDown as EventListener,\n );\n this._willAddMouseDown = 0;\n }, 400) as unknown as number;\n }\n\n /**\n * @private\n * @param {Event} e Event object fired on mouseup\n */\n _onMouseUp(e: TPointerEvent) {\n this._cacheTransformEventData(e);\n this.__onMouseUp(e);\n const canvasElement = this.upperCanvasEl,\n eventTypePrefix = this._getEventPrefix();\n if (this._isMainEvent(e)) {\n const doc = getDocumentFromElement(this.upperCanvasEl);\n removeListener(\n doc,\n `${eventTypePrefix}up`,\n this._onMouseUp as EventListener,\n );\n removeListener(\n doc,\n `${eventTypePrefix}move`,\n this._onMouseMove as EventListener,\n addEventOptions,\n );\n addListener(\n canvasElement,\n `${eventTypePrefix}move`,\n this._onMouseMove as EventListener,\n addEventOptions,\n );\n }\n this._resetTransformEventData();\n }\n\n /**\n * @private\n * @param {Event} e Event object fired on mousemove\n */\n _onMouseMove(e: TPointerEvent) {\n this._cacheTransformEventData(e);\n\n const activeObject = this.getActiveObject();\n !this.allowTouchScrolling &&\n (!activeObject ||\n // a drag event sequence is started by the active object flagging itself on mousedown / mousedown:before\n // we must not prevent the event's default behavior in order for the window to start dragging\n !activeObject.shouldStartDragging(e)) &&\n e.preventDefault &&\n e.preventDefault();\n this.__onMouseMove(e);\n this._resetTransformEventData();\n }\n\n /**\n * @private\n */\n _onResize() {\n this.calcOffset();\n this._resetTransformEventData();\n }\n\n /**\n * Decides whether the canvas should be redrawn in mouseup and mousedown events.\n * @private\n * @param {Object} target\n */\n _shouldRender(target: FabricObject | undefined) {\n const activeObject = this.getActiveObject();\n // if just one of them is available or if they are both but are different objects\n // this covers: switch of target, from target to no target, selection of target\n // multiSelection with key and mouse\n return (\n !!activeObject !== !!target ||\n (activeObject && target && activeObject !== target)\n );\n }\n\n /**\n * Method that defines the actions when mouse is released on canvas.\n * The method resets the currentTransform parameters, store the image corner\n * position in the image object and render the canvas on top.\n * @private\n * @param {Event} e Event object fired on mouseup\n */\n __onMouseUp(e: TPointerEvent) {\n this._handleEvent(e, 'up:before');\n\n const transform = this._currentTransform;\n const isClick = this._isClick;\n const { target } = this.findTarget(e);\n\n // if right/middle click just fire events and return\n // target undefined will make the _handleEvent search the target\n const { button } = e as MouseEvent;\n if (button) {\n ((this.fireMiddleClick && button === 1) ||\n (this.fireRightClick && button === 2)) &&\n this._handleEvent(e, 'up');\n return;\n }\n\n if (this.isDrawingMode && this._isCurrentlyDrawing) {\n this._onMouseUpInDrawingMode(e);\n return;\n }\n\n if (!this._isMainEvent(e)) {\n return;\n }\n let shouldRender = false;\n if (transform) {\n this._finalizeCurrentTransform(e);\n shouldRender = transform.actionPerformed;\n }\n if (!isClick) {\n const targetWasActive = target === this._activeObject;\n this.handleSelection(e);\n if (!shouldRender) {\n shouldRender =\n this._shouldRender(target) ||\n (!targetWasActive && target === this._activeObject);\n }\n }\n let pointer, corner;\n if (target) {\n const found = target.findControl(\n this.getViewportPoint(e),\n isTouchEvent(e),\n );\n const { key, control } = found || {};\n corner = key;\n if (\n target.selectable &&\n target !== this._activeObject &&\n target.activeOn === 'up'\n ) {\n this.setActiveObject(target, e);\n shouldRender = true;\n } else if (control) {\n const mouseUpHandler = control.getMouseUpHandler(e, target, control);\n if (mouseUpHandler) {\n pointer = this.getScenePoint(e);\n mouseUpHandler.call(control, e, transform!, pointer.x, pointer.y);\n }\n }\n target.isMoving = false;\n }\n // if we are ending up a transform on a different control or a new object\n // fire the original mouse up from the corner that started the transform\n if (\n transform &&\n (transform.target !== target || transform.corner !== corner)\n ) {\n const originalControl =\n transform.target && transform.target.controls[transform.corner],\n originalMouseUpHandler =\n originalControl &&\n originalControl.getMouseUpHandler(\n e,\n transform.target,\n originalControl,\n );\n pointer = pointer || this.getScenePoint(e);\n originalMouseUpHandler &&\n originalMouseUpHandler.call(\n originalControl,\n e,\n transform,\n pointer.x,\n pointer.y,\n );\n }\n this._setCursorFromEvent(e, target);\n this._handleEvent(e, 'up');\n this._groupSelector = null;\n this._currentTransform = null;\n // reset the target information about which corner is selected\n target && (target.__corner = undefined);\n if (shouldRender) {\n this.requestRenderAll();\n } else if (!isClick && !(this._activeObject as IText)?.isEditing) {\n this.renderTop();\n }\n }\n\n _basicEventHandler(\n eventType: T,\n options: (CanvasEvents & ObjectEvents)[T],\n ) {\n const { target, subTargets = [] } = options as {\n target?: FabricObject;\n subTargets: FabricObject[];\n };\n this.fire(eventType, options);\n target && target.fire(eventType, options);\n for (let i = 0; i < subTargets.length; i++) {\n subTargets[i] !== target && subTargets[i].fire(eventType, options);\n }\n return options;\n }\n\n /**\n * @private\n * Handle event firing for target and subtargets\n * @param {TPointerEvent} e event from mouse\n * @param {TPointerEventNames} eventType\n */\n _handleEvent(\n e: TPointerEvent,\n eventType: T,\n extraData?: TEventsExtraData[T],\n ) {\n const { target, subTargets } = this.findTarget(e),\n options: CanvasEvents[`mouse:${T}`] = {\n e,\n target,\n subTargets,\n ...getEventPoints(this, e),\n transform: this._currentTransform,\n ...(eventType === 'down:before' || eventType === 'down'\n ? extraData\n : {}),\n } as CanvasEvents[`mouse:${T}`];\n if (eventType === 'up:before' || eventType === 'up') {\n (options as CanvasEvents[`mouse:up`]).isClick = this._isClick;\n }\n this.fire(`mouse:${eventType}`, options);\n // this may be a little be more complicated of what we want to handle\n target && target.fire(`mouse${eventType}`, options);\n for (let i = 0; i < subTargets.length; i++) {\n subTargets[i] !== target &&\n subTargets[i].fire(`mouse${eventType}`, options);\n }\n }\n\n /**\n * @private\n * @param {Event} e Event object fired on mousedown\n */\n _onMouseDownInDrawingMode(e: TPointerEvent) {\n this._isCurrentlyDrawing = true;\n if (this.getActiveObject()) {\n this.discardActiveObject(e);\n this.requestRenderAll();\n }\n // TODO: this is a scene point so it should be renamed\n const pointer = this.getScenePoint(e);\n this.freeDrawingBrush &&\n this.freeDrawingBrush.onMouseDown(pointer, { e, pointer });\n this._handleEvent(e, 'down', { alreadySelected: false });\n }\n\n /**\n * @private\n * @param {Event} e Event object fired on mousemove\n */\n _onMouseMoveInDrawingMode(e: TPointerEvent) {\n if (this._isCurrentlyDrawing) {\n const pointer = this.getScenePoint(e);\n this.freeDrawingBrush &&\n this.freeDrawingBrush.onMouseMove(pointer, {\n e,\n // this is an absolute pointer, the naming is wrong\n pointer,\n });\n }\n this.setCursor(this.freeDrawingCursor);\n this._handleEvent(e, 'move');\n }\n\n /**\n * @private\n * @param {Event} e Event object fired on mouseup\n */\n _onMouseUpInDrawingMode(e: TPointerEvent) {\n const pointer = this.getScenePoint(e);\n if (this.freeDrawingBrush) {\n this._isCurrentlyDrawing = !!this.freeDrawingBrush.onMouseUp({\n e: e,\n // this is an absolute pointer, the naming is wrong\n pointer,\n });\n } else {\n this._isCurrentlyDrawing = false;\n }\n this._handleEvent(e, 'up');\n }\n\n /**\n * Method that defines the actions when mouse is clicked on canvas.\n * The method inits the currentTransform parameters and renders all the\n * canvas so the current image can be placed on the top canvas and the rest\n * in on the container one.\n * @private\n * @param {Event} e Event object fired on mousedown\n */\n __onMouseDown(e: TPointerEvent) {\n this._isClick = true;\n this._handleEvent(e, 'down:before');\n\n let { target } = this.findTarget(e);\n let alreadySelected = !!target && target === this._activeObject;\n // if right/middle click just fire events\n const { button } = e as MouseEvent;\n if (button) {\n ((this.fireMiddleClick && button === 1) ||\n (this.fireRightClick && button === 2)) &&\n this._handleEvent(e, 'down', {\n alreadySelected,\n });\n return;\n }\n\n if (this.isDrawingMode) {\n this._onMouseDownInDrawingMode(e);\n return;\n }\n\n if (!this._isMainEvent(e)) {\n return;\n }\n\n // ignore if some object is being transformed at this moment\n if (this._currentTransform) {\n return;\n }\n\n let shouldRender = this._shouldRender(target);\n let grouped = false;\n if (this.handleMultiSelection(e, target)) {\n // active object might have changed while grouping\n target = this._activeObject;\n grouped = true;\n shouldRender = true;\n } else if (this._shouldClearSelection(e, target)) {\n this.discardActiveObject(e);\n }\n // we start a group selector rectangle if\n // selection is enabled\n // and there is no target, or the following 3 conditions are satisfied:\n // target is not selectable ( otherwise we selected it )\n // target is not editing\n // target is not already selected ( otherwise we drag )\n if (\n this.selection &&\n (!target ||\n (!target.selectable &&\n !(target as IText).isEditing &&\n target !== this._activeObject))\n ) {\n const p = this.getScenePoint(e);\n this._groupSelector = {\n x: p.x,\n y: p.y,\n deltaY: 0,\n deltaX: 0,\n };\n }\n\n // check again because things could have changed\n alreadySelected = !!target && target === this._activeObject;\n if (target) {\n if (target.selectable && target.activeOn === 'down') {\n this.setActiveObject(target, e);\n }\n const handle = target.findControl(\n this.getViewportPoint(e),\n isTouchEvent(e),\n );\n if (target === this._activeObject && (handle || !grouped)) {\n this._setupCurrentTransform(e, target, alreadySelected);\n const control = handle ? handle.control : undefined,\n pointer = this.getScenePoint(e),\n mouseDownHandler =\n control && control.getMouseDownHandler(e, target, control);\n mouseDownHandler &&\n mouseDownHandler.call(\n control,\n e,\n this._currentTransform!,\n pointer.x,\n pointer.y,\n );\n }\n }\n // we clear `_objectsToRender` in case of a change in order to repopulate it at rendering\n // run before firing the `down` event to give the dev a chance to populate it themselves\n shouldRender && (this._objectsToRender = undefined);\n this._handleEvent(e, 'down', { alreadySelected: alreadySelected });\n // we must renderAll so that we update the visuals\n shouldRender && this.requestRenderAll();\n }\n\n /**\n * reset cache form common information needed during event processing\n * @private\n */\n _resetTransformEventData() {\n this._targetInfo = this._viewportPoint = this._scenePoint = undefined;\n }\n\n /**\n * Cache common information needed during event processing\n * @private\n * @param {Event} e Event object fired on event\n */\n _cacheTransformEventData(e: TPointerEvent) {\n // reset in order to avoid stale caching\n this._resetTransformEventData();\n this._viewportPoint = this.getViewportPoint(e);\n this._scenePoint = sendPointToPlane(\n this._viewportPoint,\n undefined,\n this.viewportTransform,\n );\n this._targetInfo = this.findTarget(e);\n // TODO: investigate better if this can be made less implicit in the code\n if (this._currentTransform) {\n this._targetInfo.target = this._currentTransform.target;\n }\n }\n\n /**\n * Method that defines the actions when mouse is hovering the canvas.\n * The currentTransform parameter will define whether the user is rotating/scaling/translating\n * an image or neither of them (only hovering). A group selection is also possible and would cancel\n * all any other type of action.\n * In case of an image transformation only the top canvas will be rendered.\n * @private\n * @param {Event} e Event object fired on mousemove\n */\n __onMouseMove(e: TPointerEvent) {\n this._isClick = false;\n this._handleEvent(e, 'move:before');\n\n if (this.isDrawingMode) {\n this._onMouseMoveInDrawingMode(e);\n return;\n }\n\n if (!this._isMainEvent(e)) {\n return;\n }\n\n const groupSelector = this._groupSelector;\n\n // We initially clicked in an empty area, so we draw a box for multiple selection\n if (groupSelector) {\n const pointer = this.getScenePoint(e);\n\n groupSelector.deltaX = pointer.x - groupSelector.x;\n groupSelector.deltaY = pointer.y - groupSelector.y;\n\n this.renderTop();\n } else if (!this._currentTransform) {\n const { target } = this.findTarget(e);\n this._setCursorFromEvent(e, target);\n this._fireOverOutEvents(e, target);\n } else {\n this._transformObject(e);\n }\n this.textEditingManager.onMouseMove(e);\n this._handleEvent(e, 'move');\n }\n\n /**\n * Manage the mouseout, mouseover events for the fabric object on the canvas\n * @param {Fabric.Object} target the target where the target from the mousemove event\n * @param {Event} e Event object fired on mousemove\n * @private\n */\n _fireOverOutEvents(e: TPointerEvent, target?: FabricObject) {\n const _hoveredTarget = this._hoveredTarget,\n _hoveredTargets = this._hoveredTargets,\n { subTargets } = this.findTarget(e),\n length = Math.max(_hoveredTargets.length, subTargets.length);\n\n this.fireSyntheticInOutEvents('mouse', {\n e,\n target,\n oldTarget: _hoveredTarget,\n fireCanvas: true,\n });\n for (let i = 0; i < length; i++) {\n this.fireSyntheticInOutEvents('mouse', {\n e,\n target: subTargets[i],\n oldTarget: _hoveredTargets[i],\n });\n }\n this._hoveredTarget = target;\n this._hoveredTargets = subTargets;\n }\n\n /**\n * Manage the dragEnter, dragLeave events for the fabric objects on the canvas\n * @param {Fabric.Object} target the target where the target from the onDrag event\n * @param {Object} data Event object fired on dragover\n * @private\n */\n _fireEnterLeaveEvents(\n e: TPointerEvent,\n target: FabricObject | undefined,\n data: DragEventData,\n ) {\n const draggedoverTarget = this._draggedoverTarget,\n _hoveredTargets = this._hoveredTargets,\n { subTargets } = this.findTarget(e),\n length = Math.max(_hoveredTargets.length, subTargets.length);\n\n this.fireSyntheticInOutEvents('drag', {\n ...data,\n target,\n oldTarget: draggedoverTarget,\n fireCanvas: true,\n });\n for (let i = 0; i < length; i++) {\n this.fireSyntheticInOutEvents('drag', {\n ...data,\n target: subTargets[i],\n oldTarget: _hoveredTargets[i],\n });\n }\n this._draggedoverTarget = target;\n }\n\n /**\n * Manage the synthetic in/out events for the fabric objects on the canvas\n * @param {Fabric.Object} target the target where the target from the supported events\n * @param {Object} data Event object fired\n * @param {Object} config configuration for the function to work\n * @param {String} config.targetName property on the canvas where the old target is stored\n * @param {String} [config.canvasEvtOut] name of the event to fire at canvas level for out\n * @param {String} config.evtOut name of the event to fire for out\n * @param {String} [config.canvasEvtIn] name of the event to fire at canvas level for in\n * @param {String} config.evtIn name of the event to fire for in\n * @private\n */\n fireSyntheticInOutEvents(\n type: T,\n {\n target,\n oldTarget,\n fireCanvas,\n e,\n ...data\n }: TSyntheticEventContext[T] & {\n target?: FabricObject;\n oldTarget?: FabricObject;\n fireCanvas?: boolean;\n },\n ) {\n const { targetIn, targetOut, canvasIn, canvasOut } =\n syntheticEventConfig[type];\n const targetChanged = oldTarget !== target;\n\n if (oldTarget && targetChanged) {\n const outOpt: CanvasEvents[typeof canvasOut] = {\n ...data,\n e,\n target: oldTarget,\n nextTarget: target,\n ...getEventPoints(this, e),\n };\n fireCanvas && this.fire(canvasOut, outOpt);\n oldTarget.fire(targetOut, outOpt);\n }\n if (target && targetChanged) {\n const inOpt: CanvasEvents[typeof canvasIn] = {\n ...data,\n e,\n target,\n previousTarget: oldTarget,\n ...getEventPoints(this, e),\n };\n fireCanvas && this.fire(canvasIn, inOpt);\n target.fire(targetIn, inOpt);\n }\n }\n\n /**\n * @private\n * @param {Event} e Event fired on mousemove\n */\n _transformObject(e: TPointerEvent) {\n const scenePoint = this.getScenePoint(e),\n transform = this._currentTransform!,\n target = transform.target,\n // transform pointer to target's containing coordinate plane\n // both pointer and object should agree on every point\n localPointer = target.group\n ? sendPointToPlane(\n scenePoint,\n undefined,\n target.group.calcTransformMatrix(),\n )\n : scenePoint;\n transform.shiftKey = e.shiftKey;\n transform.altKey = !!this.centeredKey && e[this.centeredKey];\n\n this._performTransformAction(e, transform, localPointer);\n transform.actionPerformed && this.requestRenderAll();\n }\n\n /**\n * @private\n */\n _performTransformAction(\n e: TPointerEvent,\n transform: Transform,\n pointer: Point,\n ) {\n const { action, actionHandler, target } = transform;\n\n const actionPerformed =\n !!actionHandler && actionHandler(e, transform, pointer.x, pointer.y);\n actionPerformed && target.setCoords();\n\n // this object could be created from the function in the control handlers\n if (action === 'drag' && actionPerformed) {\n transform.target.isMoving = true;\n this.setCursor(transform.target.moveCursor || this.moveCursor);\n }\n transform.actionPerformed = transform.actionPerformed || actionPerformed;\n }\n\n /**\n * Sets the cursor depending on where the canvas is being hovered.\n * Note: very buggy in Opera\n * @param {Event} e Event object\n * @param {Object} target Object that the mouse is hovering, if so.\n */\n _setCursorFromEvent(e: TPointerEvent, target?: FabricObject) {\n if (!target) {\n this.setCursor(this.defaultCursor);\n return;\n }\n let hoverCursor = target.hoverCursor || this.hoverCursor;\n const activeSelection = isActiveSelection(this._activeObject)\n ? this._activeObject\n : null,\n // only show proper corner when group selection is not active\n corner =\n (!activeSelection || target.group !== activeSelection) &&\n // here we call findTargetCorner always with undefined for the touch parameter.\n // we assume that if you are using a cursor you do not need to interact with\n // the bigger touch area.\n target.findControl(this.getViewportPoint(e));\n\n if (!corner) {\n if ((target as Group).subTargetCheck) {\n // hoverCursor should come from top-most subTarget,\n // so we walk the array backwards\n const { subTargets } = this.findTarget(e);\n subTargets\n .concat()\n .reverse()\n .forEach((_target) => {\n hoverCursor = _target.hoverCursor || hoverCursor;\n });\n }\n this.setCursor(hoverCursor);\n } else {\n const { control, coord } = corner;\n this.setCursor(control.cursorStyleHandler(e, control, target, coord));\n }\n }\n\n /**\n * ## Handles multiple selection\n * - toggles `target` selection (selects/deselects `target` if it isn't/is selected respectively)\n * - sets the active object in case it is not set or in case there is a single active object left under active selection.\n * ---\n * - If the active object is the active selection we add/remove `target` from it\n * - If not, add the active object and `target` to the active selection and make it the active object.\n * @TODO rewrite this after find target is refactored\n * @private\n * @param {TPointerEvent} e Event object\n * @param {FabricObject} target target of event to select/deselect\n * @returns true if grouping occurred\n */\n protected handleMultiSelection(e: TPointerEvent, target?: FabricObject) {\n const activeObject = this._activeObject;\n const isAS = isActiveSelection(activeObject);\n if (\n // check if an active object exists on canvas and if the user is pressing the `selectionKey` while canvas supports multi selection.\n !!activeObject &&\n this._isSelectionKeyPressed(e) &&\n this.selection &&\n // on top of that the user also has to hit a target that is selectable.\n !!target &&\n target.selectable &&\n // group target and active object only if they are different objects\n // else we try to find a subtarget of `ActiveSelection`\n (activeObject !== target || isAS) &&\n // make sure `activeObject` and `target` aren't ancestors of each other in case `activeObject` is not `ActiveSelection`\n // if it is then we want to remove `target` from it\n (isAS ||\n (!target.isDescendantOf(activeObject) &&\n !activeObject.isDescendantOf(target))) &&\n // target accepts selection\n !target.onSelect({ e }) &&\n // make sure we are not on top of a control\n !activeObject.getActiveControl()\n ) {\n if (isAS) {\n const prevActiveObjects = activeObject.getObjects();\n let subTargets: FabricObject[] = [];\n // const { subTargets: testSubTargets } = this.findTarget(e);\n if (target === activeObject) {\n const pointer = this.getScenePoint(e);\n let targetInfo = this.searchPossibleTargets(\n prevActiveObjects,\n pointer,\n );\n // console.log(testSubTargets.includes(targetInfo.target));\n if (targetInfo.target) {\n target = targetInfo.target;\n subTargets = targetInfo.subTargets;\n } else {\n targetInfo = this.searchPossibleTargets(this._objects, pointer);\n target = targetInfo.target;\n subTargets = targetInfo.subTargets;\n }\n // if nothing is found bail out\n if (!target || !target.selectable) {\n return false;\n }\n }\n if (target.group === activeObject) {\n // `target` is part of active selection => remove it\n activeObject.remove(target);\n this._hoveredTarget = target;\n this._hoveredTargets = subTargets;\n // if after removing an object we are left with one only...\n if (activeObject.size() === 1) {\n // activate last remaining object\n // deselecting the active selection will remove the remaining object from it\n this._setActiveObject(activeObject.item(0), e);\n }\n } else {\n // `target` isn't part of active selection => add it\n activeObject.multiSelectAdd(target);\n this._hoveredTarget = activeObject;\n this._hoveredTargets = subTargets;\n }\n this._fireSelectionEvents(prevActiveObjects, e);\n } else {\n (activeObject as IText).isEditing &&\n (activeObject as IText).exitEditing();\n // add the active object and the target to the active selection and set it as the active object\n const klass =\n classRegistry.getClass('ActiveSelection');\n const newActiveSelection = new klass([], {\n /**\n * it is crucial to pass the canvas ref before calling {@link ActiveSelection#multiSelectAdd}\n * since it uses {@link FabricObject#isInFrontOf} which relies on the canvas ref\n */\n canvas: this,\n });\n newActiveSelection.multiSelectAdd(activeObject, target);\n this._hoveredTarget = newActiveSelection;\n // ISSUE 4115: should we consider subTargets here?\n // this._hoveredTargets = [];\n // this._hoveredTargets = this.targets.concat();\n this._setActiveObject(newActiveSelection, e);\n this._fireSelectionEvents([activeObject], e);\n }\n return true;\n }\n return false;\n }\n\n /**\n * ## Handles selection\n * - selects objects that are contained in (and possibly intersecting) the selection bounding box\n * - sets the active object\n * ---\n * runs on mouse up after a mouse move\n */\n protected handleSelection(e: TPointerEvent) {\n if (!this.selection || !this._groupSelector) {\n return false;\n }\n const { x, y, deltaX, deltaY } = this._groupSelector,\n point1 = new Point(x, y),\n point2 = point1.add(new Point(deltaX, deltaY)),\n tl = point1.min(point2),\n br = point1.max(point2),\n size = br.subtract(tl);\n\n const collectedObjects = this.collectObjects(\n {\n left: tl.x,\n top: tl.y,\n width: size.x,\n height: size.y,\n },\n { includeIntersecting: !this.selectionFullyContained },\n ) as FabricObject[];\n\n const objects =\n // though this method runs only after mouse move the pointer could do a mouse up on the same position as mouse down\n // should it be handled as is?\n point1.eq(point2)\n ? collectedObjects[0]\n ? [collectedObjects[0]]\n : []\n : collectedObjects.length > 1\n ? collectedObjects\n .filter((object) => !object.onSelect({ e }))\n .reverse()\n : // `setActiveObject` will call `onSelect(collectedObjects[0])` in this case\n collectedObjects;\n\n // set active object\n if (objects.length === 1) {\n // set as active object\n this.setActiveObject(objects[0], e);\n } else if (objects.length > 1) {\n // add to active selection and make it the active object\n const klass =\n classRegistry.getClass('ActiveSelection');\n this.setActiveObject(new klass(objects, { canvas: this }), e);\n }\n\n // cleanup\n this._groupSelector = null;\n return true;\n }\n\n /**\n * @override clear {@link textEditingManager}\n */\n clear() {\n this.textEditingManager.clear();\n super.clear();\n }\n\n /**\n * @override clear {@link textEditingManager}\n */\n destroy() {\n this.removeListeners();\n this.textEditingManager.dispose();\n super.destroy();\n }\n}\n","export const linearDefaultCoords = {\n x1: 0,\n y1: 0,\n x2: 0,\n y2: 0,\n};\n\nexport const radialDefaultCoords = {\n ...linearDefaultCoords,\n r1: 0,\n r2: 0,\n};\n","/**\n *\n * @param value value to check if NaN\n * @param [valueIfNaN]\n * @returns `fallback` is `value is NaN\n */\nexport const ifNaN = (value: number, valueIfNaN?: number) => {\n return isNaN(value) && typeof valueIfNaN === 'number' ? valueIfNaN : value;\n};\n","import { ifNaN } from '../util/internals/ifNaN';\nimport { capValue } from '../util/misc/capValue';\n\nconst RE_PERCENT = /^(\\d+\\.\\d+)%|(\\d+)%$/;\n\nexport function isPercent(value: string | null) {\n return value && RE_PERCENT.test(value);\n}\n\n/**\n *\n * @param value\n * @param valueIfNaN\n * @returns ∈ [0, 1]\n */\nexport function parsePercent(\n value: string | number | null | undefined,\n valueIfNaN?: number,\n) {\n const parsed =\n typeof value === 'number'\n ? value\n : typeof value === 'string'\n ? parseFloat(value) / (isPercent(value) ? 100 : 1)\n : NaN;\n return capValue(0, ifNaN(parsed, valueIfNaN), 1);\n}\n","import { Color } from '../../color/Color';\nimport { parsePercent } from '../../parser/percent';\nimport { ifNaN } from '../../util/internals/ifNaN';\nimport type { ColorStop } from '../typedefs';\n\nconst RE_KEY_VALUE_PAIRS = /\\s*;\\s*/;\nconst RE_KEY_VALUE = /\\s*:\\s*/;\n\nfunction parseColorStop(el: SVGStopElement, opacityMultiplier: number) {\n let colorValue, opacityValue;\n const style = el.getAttribute('style');\n if (style) {\n const keyValuePairs = style.split(RE_KEY_VALUE_PAIRS);\n\n if (keyValuePairs[keyValuePairs.length - 1] === '') {\n keyValuePairs.pop();\n }\n\n for (let i = keyValuePairs.length; i--; ) {\n const [key, value] = keyValuePairs[i]\n .split(RE_KEY_VALUE)\n .map((s) => s.trim());\n if (key === 'stop-color') {\n colorValue = value;\n } else if (key === 'stop-opacity') {\n opacityValue = value;\n }\n }\n }\n\n colorValue = colorValue || el.getAttribute('stop-color') || 'rgb(0,0,0)';\n opacityValue = ifNaN(\n parseFloat(opacityValue || el.getAttribute('stop-opacity') || ''),\n 1,\n );\n\n const color = new Color(colorValue);\n\n color.setAlpha(color.getAlpha() * opacityValue * opacityMultiplier);\n\n return {\n offset: parsePercent(el.getAttribute('offset'), 0),\n color: color.toRgba(),\n };\n}\n\nexport function parseColorStops(\n el: SVGGradientElement,\n opacityAttr: string | null,\n) {\n const colorStops: ColorStop[] = [],\n colorStopEls = el.getElementsByTagName('stop'),\n multiplier = parsePercent(opacityAttr, 1);\n for (let i = colorStopEls.length; i--; ) {\n colorStops.push(parseColorStop(colorStopEls[i], multiplier));\n }\n return colorStops;\n}\n","import type { GradientType, GradientUnits } from '../typedefs';\n\nexport function parseType(el: SVGGradientElement): GradientType {\n return el.nodeName === 'linearGradient' || el.nodeName === 'LINEARGRADIENT'\n ? 'linear'\n : 'radial';\n}\n\nexport function parseGradientUnits(el: SVGGradientElement): GradientUnits {\n return el.getAttribute('gradientUnits') === 'userSpaceOnUse'\n ? 'pixels'\n : 'percentage';\n}\n","import { isPercent } from '../../parser/percent';\nimport type { TSize } from '../../typedefs';\nimport type { GradientCoords, GradientType, GradientUnits } from '../typedefs';\nimport { parseGradientUnits, parseType } from './misc';\n\nfunction convertPercentUnitsToValues<\n T extends GradientType,\n K extends keyof GradientCoords,\n>(\n valuesToConvert: Record,\n { width, height, gradientUnits }: TSize & { gradientUnits: GradientUnits },\n) {\n let finalValue;\n return (Object.keys(valuesToConvert) as K[]).reduce(\n (acc, prop) => {\n const propValue = valuesToConvert[prop];\n if (propValue === 'Infinity') {\n finalValue = 1;\n } else if (propValue === '-Infinity') {\n finalValue = 0;\n } else {\n finalValue =\n typeof propValue === 'string' ? parseFloat(propValue) : propValue;\n if (typeof propValue === 'string' && isPercent(propValue)) {\n finalValue *= 0.01;\n if (gradientUnits === 'pixels') {\n // then we need to fix those percentages here in svg parsing\n if (prop === 'x1' || prop === 'x2' || prop === 'r2') {\n finalValue *= width;\n }\n if (prop === 'y1' || prop === 'y2') {\n finalValue *= height;\n }\n }\n }\n }\n acc[prop] = finalValue;\n return acc;\n },\n {} as Record,\n );\n}\n\nfunction getValue(el: SVGGradientElement, key: string) {\n return el.getAttribute(key);\n}\n\nexport function parseLinearCoords(el: SVGGradientElement) {\n return {\n x1: getValue(el, 'x1') || 0,\n y1: getValue(el, 'y1') || 0,\n x2: getValue(el, 'x2') || '100%',\n y2: getValue(el, 'y2') || 0,\n };\n}\n\nexport function parseRadialCoords(el: SVGGradientElement) {\n return {\n x1: getValue(el, 'fx') || getValue(el, 'cx') || '50%',\n y1: getValue(el, 'fy') || getValue(el, 'cy') || '50%',\n r1: 0,\n x2: getValue(el, 'cx') || '50%',\n y2: getValue(el, 'cy') || '50%',\n r2: getValue(el, 'r') || '50%',\n };\n}\n\nexport function parseCoords(el: SVGGradientElement, size: TSize) {\n return convertPercentUnitsToValues(\n parseType(el) === 'linear' ? parseLinearCoords(el) : parseRadialCoords(el),\n {\n ...size,\n gradientUnits: parseGradientUnits(el),\n },\n );\n}\n","import { iMatrix } from '../constants';\nimport { parseTransformAttribute } from '../parser/parseTransformAttribute';\nimport type { FabricObject } from '../shapes/Object/FabricObject';\nimport type { TMat2D } from '../typedefs';\nimport { uid } from '../util/internals/uid';\nimport { pick } from '../util/misc/pick';\nimport { matrixToSVG } from '../util/misc/svgExport';\nimport { linearDefaultCoords, radialDefaultCoords } from './constants';\nimport { parseColorStops } from './parser/parseColorStops';\nimport { parseCoords } from './parser/parseCoords';\nimport { parseType, parseGradientUnits } from './parser/misc';\nimport type {\n ColorStop,\n GradientCoords,\n GradientOptions,\n GradientType,\n GradientUnits,\n SVGOptions,\n SerializedGradientProps,\n} from './typedefs';\nimport { classRegistry } from '../ClassRegistry';\nimport { isPath } from '../util/typeAssertions';\n\n/**\n * Gradient class\n * @class Gradient\n * @tutorial {@link http://fabricjs.com/fabric-intro-part-2#gradients}\n */\nexport class Gradient<\n S,\n T extends GradientType = S extends GradientType ? S : 'linear',\n> {\n /**\n * Horizontal offset for aligning gradients coming from SVG when outside pathgroups\n * @type Number\n * @default 0\n */\n declare offsetX: number;\n\n /**\n * Vertical offset for aligning gradients coming from SVG when outside pathgroups\n * @type Number\n * @default 0\n */\n declare offsetY: number;\n\n /**\n * A transform matrix to apply to the gradient before painting.\n * Imported from svg gradients, is not applied with the current transform in the center.\n * Before this transform is applied, the origin point is at the top left corner of the object\n * plus the addition of offsetY and offsetX.\n * @type Number[]\n * @default null\n */\n declare gradientTransform?: TMat2D;\n\n /**\n * coordinates units for coords.\n * If `pixels`, the number of coords are in the same unit of width / height.\n * If set as `percentage` the coords are still a number, but 1 means 100% of width\n * for the X and 100% of the height for the y. It can be bigger than 1 and negative.\n * allowed values pixels or percentage.\n * @type GradientUnits\n * @default 'pixels'\n */\n declare gradientUnits: GradientUnits;\n\n /**\n * Gradient type linear or radial\n * @type GradientType\n * @default 'linear'\n */\n declare type: T;\n\n /**\n * Defines how the gradient is located in space and spread\n * @type GradientCoords\n */\n declare coords: GradientCoords;\n\n /**\n * Defines how many colors a gradient has and how they are located on the axis\n * defined by coords\n * @type GradientCoords\n */\n declare colorStops: ColorStop[];\n\n /**\n * If true, this object will not be exported during the serialization of a canvas\n * @type boolean\n */\n declare excludeFromExport?: boolean;\n\n /**\n * ID used for SVG export functionalities\n * @type number | string\n */\n declare readonly id: string | number;\n\n static type = 'Gradient';\n\n constructor(options: GradientOptions) {\n const {\n type = 'linear' as T,\n gradientUnits = 'pixels',\n coords = {},\n colorStops = [],\n offsetX = 0,\n offsetY = 0,\n gradientTransform,\n id,\n } = options || {};\n Object.assign(this, {\n type,\n gradientUnits,\n coords: {\n ...(type === 'radial' ? radialDefaultCoords : linearDefaultCoords),\n ...coords,\n },\n colorStops,\n offsetX,\n offsetY,\n gradientTransform,\n id: id ? `${id}_${uid()}` : uid(),\n });\n }\n\n /**\n * Adds another colorStop\n * @param {Record} colorStop Object with offset and color\n * @return {Gradient} thisArg\n */\n addColorStop(colorStops: Record) {\n for (const position in colorStops) {\n this.colorStops.push({\n offset: parseFloat(position),\n color: colorStops[position],\n });\n }\n return this;\n }\n\n /**\n * Returns object representation of a gradient\n * @param {string[]} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {object}\n */\n toObject(\n propertiesToInclude?: (keyof this | string)[],\n ): SerializedGradientProps {\n return {\n ...pick(this, propertiesToInclude as (keyof this)[]),\n type: this.type,\n coords: { ...this.coords },\n colorStops: this.colorStops.map((colorStop) => ({ ...colorStop })),\n offsetX: this.offsetX,\n offsetY: this.offsetY,\n gradientUnits: this.gradientUnits,\n gradientTransform: this.gradientTransform\n ? [...this.gradientTransform]\n : undefined,\n };\n }\n\n /* _TO_SVG_START_ */\n /**\n * Returns SVG representation of an gradient\n * @param {FabricObject} object Object to create a gradient for\n * @return {String} SVG representation of an gradient (linear/radial)\n */\n toSVG(\n object: FabricObject,\n {\n additionalTransform: preTransform,\n }: { additionalTransform?: string } = {},\n ) {\n const markup = [],\n transform = (\n this.gradientTransform\n ? this.gradientTransform.concat()\n : iMatrix.concat()\n ) as TMat2D,\n gradientUnits =\n this.gradientUnits === 'pixels'\n ? 'userSpaceOnUse'\n : 'objectBoundingBox';\n // colorStops must be sorted ascending, and guarded against deep mutations\n const colorStops = this.colorStops\n .map((colorStop) => ({ ...colorStop }))\n .sort((a, b) => {\n return a.offset - b.offset;\n });\n\n let offsetX = -this.offsetX,\n offsetY = -this.offsetY;\n if (gradientUnits === 'objectBoundingBox') {\n offsetX /= object.width;\n offsetY /= object.height;\n } else {\n offsetX += object.width / 2;\n offsetY += object.height / 2;\n }\n // todo what about polygon/polyline?\n if (isPath(object) && this.gradientUnits !== 'percentage') {\n offsetX -= object.pathOffset.x;\n offsetY -= object.pathOffset.y;\n }\n transform[4] -= offsetX;\n transform[5] -= offsetY;\n\n const commonAttributes = [\n `id=\"SVGID_${this.id}\"`,\n `gradientUnits=\"${gradientUnits}\"`,\n `gradientTransform=\"${\n preTransform ? preTransform + ' ' : ''\n }${matrixToSVG(transform)}\"`,\n '',\n ].join(' ');\n\n if (this.type === 'linear') {\n const { x1, y1, x2, y2 } = this.coords;\n markup.push(\n '\\n',\n );\n } else if (this.type === 'radial') {\n const { x1, y1, x2, y2, r1, r2 } = this\n .coords as GradientCoords<'radial'>;\n const needsSwap = r1 > r2;\n // svg radial gradient has just 1 radius. the biggest.\n markup.push(\n '\\n',\n );\n if (needsSwap) {\n // svg goes from internal to external radius. if radius are inverted, swap color stops.\n colorStops.reverse(); // mutates array\n colorStops.forEach((colorStop) => {\n colorStop.offset = 1 - colorStop.offset;\n });\n }\n const minRadius = Math.min(r1, r2);\n if (minRadius > 0) {\n // i have to shift all colorStops and add new one in 0.\n const maxRadius = Math.max(r1, r2),\n percentageShift = minRadius / maxRadius;\n colorStops.forEach((colorStop) => {\n colorStop.offset += percentageShift * (1 - colorStop.offset);\n });\n }\n }\n\n colorStops.forEach(({ color, offset }) => {\n markup.push(\n `\\n`,\n );\n });\n\n markup.push(\n this.type === 'linear' ? '' : '',\n '\\n',\n );\n\n return markup.join('');\n }\n /* _TO_SVG_END_ */\n\n /**\n * Returns an instance of CanvasGradient\n * @param {CanvasRenderingContext2D} ctx Context to render on\n * @return {CanvasGradient}\n */\n toLive(ctx: CanvasRenderingContext2D): CanvasGradient {\n const { x1, y1, x2, y2, r1, r2 } = this.coords as GradientCoords<'radial'>;\n const gradient =\n this.type === 'linear'\n ? ctx.createLinearGradient(x1, y1, x2, y2)\n : ctx.createRadialGradient(x1, y1, r1, x2, y2, r2);\n\n this.colorStops.forEach(({ color, offset }) => {\n gradient.addColorStop(offset, color);\n });\n\n return gradient;\n }\n\n static async fromObject(\n options: GradientOptions<'linear'>,\n ): Promise>;\n static async fromObject(\n options: GradientOptions<'radial'>,\n ): Promise>;\n static async fromObject(\n options: GradientOptions<'linear'> | GradientOptions<'radial'>,\n ) {\n const { colorStops, gradientTransform } = options;\n return new this({\n ...options,\n colorStops: colorStops\n ? colorStops.map((colorStop) => ({ ...colorStop }))\n : undefined,\n gradientTransform: gradientTransform ? [...gradientTransform] : undefined,\n });\n }\n\n /* _FROM_SVG_START_ */\n /**\n * Returns {@link Gradient} instance from an SVG element\n * @param {SVGGradientElement} el SVG gradient element\n * @param {FabricObject} instance\n * @param {String} opacity A fill-opacity or stroke-opacity attribute to multiply to each stop's opacity.\n * @param {SVGOptions} svgOptions an object containing the size of the SVG in order to parse correctly gradients\n * that uses gradientUnits as 'userSpaceOnUse' and percentages.\n * @return {Gradient} Gradient instance\n * @see http://www.w3.org/TR/SVG/pservers.html#LinearGradientElement\n * @see http://www.w3.org/TR/SVG/pservers.html#RadialGradientElement\n *\n * @example\n *\n * \n * \n * \n * \n *\n * OR\n *\n * \n * \n * \n * \n *\n * OR\n *\n * \n * \n * \n * \n * \n *\n * OR\n *\n * \n * \n * \n * \n * \n *\n */\n static fromElement(\n el: SVGGradientElement,\n instance: FabricObject,\n svgOptions: SVGOptions,\n ): Gradient {\n const gradientUnits = parseGradientUnits(el);\n const center = instance._findCenterFromElement();\n return new this({\n id: el.getAttribute('id') || undefined,\n type: parseType(el),\n coords: parseCoords(el, {\n width: svgOptions.viewBoxWidth || svgOptions.width,\n height: svgOptions.viewBoxHeight || svgOptions.height,\n }),\n colorStops: parseColorStops(el, svgOptions.opacity),\n gradientUnits,\n gradientTransform: parseTransformAttribute(\n el.getAttribute('gradientTransform') || '',\n ),\n ...(gradientUnits === 'pixels'\n ? {\n offsetX: instance.width / 2 - center.x,\n offsetY: instance.height / 2 - center.y,\n }\n : {\n offsetX: 0,\n offsetY: 0,\n }),\n });\n }\n /* _FROM_SVG_END_ */\n}\n\nclassRegistry.setClass(Gradient, 'gradient');\nclassRegistry.setClass(Gradient, 'linear');\nclassRegistry.setClass(Gradient, 'radial');\n","import { config } from '../config';\nimport type { Abortable, TCrossOrigin, TMat2D, TSize } from '../typedefs';\nimport { ifNaN } from '../util/internals/ifNaN';\nimport { uid } from '../util/internals/uid';\nimport { loadImage } from '../util/misc/objectEnlive';\nimport { pick } from '../util/misc/pick';\nimport { toFixed } from '../util/misc/toFixed';\nimport { classRegistry } from '../ClassRegistry';\nimport type {\n PatternRepeat,\n PatternOptions,\n SerializedPatternOptions,\n} from './types';\nimport { log } from '../util/internals/console';\n\n/**\n * @see {@link http://fabricjs.com/patterns demo}\n * @see {@link http://fabricjs.com/dynamic-patterns demo}\n */\nexport class Pattern {\n static type = 'Pattern';\n\n /**\n * Legacy identifier of the class. Prefer using this.constructor.type 'Pattern'\n * or utils like isPattern, or instance of to indentify a pattern in your code.\n * Will be removed in future versiones\n * @TODO add sustainable warning message\n * @type string\n * @deprecated\n */\n get type() {\n return 'pattern';\n }\n\n set type(value) {\n log('warn', 'Setting type has no effect', value);\n }\n\n /**\n * @type PatternRepeat\n * @defaults\n */\n repeat: PatternRepeat = 'repeat';\n\n /**\n * Pattern horizontal offset from object's left/top corner\n * @type Number\n */\n offsetX = 0;\n\n /**\n * Pattern vertical offset from object's left/top corner\n * @type Number\n */\n offsetY = 0;\n\n /**\n * @type TCrossOrigin\n */\n crossOrigin: TCrossOrigin = '';\n\n /**\n * transform matrix to change the pattern, imported from svgs.\n * @todo verify if using the identity matrix as default makes the rest of the code more easy\n * @type Array\n */\n declare patternTransform?: TMat2D;\n\n /**\n * The actual pixel source of the pattern\n */\n declare source: CanvasImageSource;\n\n /**\n * If true, this object will not be exported during the serialization of a canvas\n * @type boolean\n */\n declare excludeFromExport?: boolean;\n\n /**\n * ID used for SVG export functionalities\n * @type number\n */\n declare readonly id: number;\n\n /**\n * Constructor\n * @param {Object} [options] Options object\n * @param {option.source} [source] the pattern source, eventually empty or a drawable\n */\n constructor(options: PatternOptions) {\n this.id = uid();\n Object.assign(this, options);\n }\n\n /**\n * @returns true if {@link source} is an element\n */\n isImageSource(): this is { source: HTMLImageElement } {\n return (\n !!this.source && typeof (this.source as HTMLImageElement).src === 'string'\n );\n }\n\n /**\n * @returns true if {@link source} is a element\n */\n isCanvasSource(): this is { source: HTMLCanvasElement } {\n return !!this.source && !!(this.source as HTMLCanvasElement).toDataURL;\n }\n\n sourceToString(): string {\n return this.isImageSource()\n ? this.source.src\n : this.isCanvasSource()\n ? this.source.toDataURL()\n : '';\n }\n\n /**\n * Returns an instance of CanvasPattern\n * @param {CanvasRenderingContext2D} ctx Context to create pattern\n * @return {CanvasPattern}\n */\n toLive(ctx: CanvasRenderingContext2D): CanvasPattern | null {\n if (\n // if the image failed to load, return, and allow rest to continue loading\n !this.source ||\n // if an image\n (this.isImageSource() &&\n (!this.source.complete ||\n this.source.naturalWidth === 0 ||\n this.source.naturalHeight === 0))\n ) {\n return null;\n }\n\n return ctx.createPattern(this.source, this.repeat)!;\n }\n\n /**\n * Returns object representation of a pattern\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {object} Object representation of a pattern instance\n */\n toObject(propertiesToInclude: string[] = []): Record {\n const { repeat, crossOrigin } = this;\n return {\n ...pick(this, propertiesToInclude as (keyof this)[]),\n type: 'pattern',\n source: this.sourceToString(),\n repeat,\n crossOrigin,\n offsetX: toFixed(this.offsetX, config.NUM_FRACTION_DIGITS),\n offsetY: toFixed(this.offsetY, config.NUM_FRACTION_DIGITS),\n patternTransform: this.patternTransform\n ? [...this.patternTransform]\n : null,\n };\n }\n\n /* _TO_SVG_START_ */\n /**\n * Returns SVG representation of a pattern\n */\n toSVG({ width, height }: TSize): string {\n const { source: patternSource, repeat, id } = this,\n patternOffsetX = ifNaN(this.offsetX / width, 0),\n patternOffsetY = ifNaN(this.offsetY / height, 0),\n patternWidth =\n repeat === 'repeat-y' || repeat === 'no-repeat'\n ? 1 + Math.abs(patternOffsetX || 0)\n : ifNaN((patternSource as HTMLImageElement).width / width, 0),\n patternHeight =\n repeat === 'repeat-x' || repeat === 'no-repeat'\n ? 1 + Math.abs(patternOffsetY || 0)\n : ifNaN((patternSource as HTMLImageElement).height / height, 0);\n\n return [\n ``,\n ``,\n ``,\n '',\n ].join('\\n');\n }\n /* _TO_SVG_END_ */\n\n static async fromObject(\n {\n type,\n source,\n patternTransform,\n ...otherOptions\n }: SerializedPatternOptions,\n options?: Abortable,\n ): Promise {\n const img = await loadImage(source, {\n ...options,\n crossOrigin: otherOptions.crossOrigin,\n });\n return new this({\n ...otherOptions,\n patternTransform:\n patternTransform && (patternTransform.slice(0) as TMat2D),\n source: img,\n });\n }\n}\n\nclassRegistry.setClass(Pattern);\n// kept for compatibility reason\nclassRegistry.setClass(Pattern, 'pattern');\n","import { Color } from '../color/Color';\nimport type { Point } from '../Point';\nimport type { Shadow } from '../Shadow';\nimport type { Canvas } from '../canvas/Canvas';\nimport type { TBrushEventData } from './typedefs';\n\n/**\n * @see {@link http://fabricjs.com/freedrawing|Freedrawing demo}\n */\nexport abstract class BaseBrush {\n /**\n * Color of a brush\n * @type String\n */\n color = 'rgb(0, 0, 0)';\n\n /**\n * Width of a brush, has to be a Number, no string literals\n * @type Number\n */\n width = 1;\n\n /**\n * Shadow object representing shadow of this shape.\n * Backwards incompatibility note: This property replaces \"shadowColor\" (String), \"shadowOffsetX\" (Number),\n * \"shadowOffsetY\" (Number) and \"shadowBlur\" (Number) since v1.2.12\n * @type Shadow\n */\n shadow: Shadow | null = null;\n\n /**\n * Line endings style of a brush (one of \"butt\", \"round\", \"square\")\n * @type String\n */\n strokeLineCap: CanvasLineCap = 'round';\n\n /**\n * Corner style of a brush (one of \"bevel\", \"round\", \"miter\")\n * @type String\n */\n strokeLineJoin: CanvasLineJoin = 'round';\n\n /**\n * Maximum miter length (used for strokeLineJoin = \"miter\") of a brush's\n * @type Number\n */\n strokeMiterLimit = 10;\n\n /**\n * Stroke Dash Array.\n * @type Array\n */\n strokeDashArray: number[] | null = null;\n\n /**\n * When `true`, the free drawing is limited to the whiteboard size. Default to false.\n * @type Boolean\n * @default false\n */\n\n limitedToCanvasSize = false;\n\n /**\n * @todo add type\n */\n declare canvas: Canvas;\n\n constructor(canvas: Canvas) {\n this.canvas = canvas;\n }\n\n abstract _render(): void;\n abstract onMouseDown(pointer: Point, ev: TBrushEventData): void;\n abstract onMouseMove(pointer: Point, ev: TBrushEventData): void;\n /**\n * @returns true if brush should continue blocking interaction\n */\n abstract onMouseUp(ev: TBrushEventData): boolean | void;\n\n /**\n * Sets brush styles\n * @private\n * @param {CanvasRenderingContext2D} ctx\n */\n _setBrushStyles(ctx: CanvasRenderingContext2D) {\n ctx.strokeStyle = this.color;\n ctx.lineWidth = this.width;\n ctx.lineCap = this.strokeLineCap;\n ctx.miterLimit = this.strokeMiterLimit;\n ctx.lineJoin = this.strokeLineJoin;\n ctx.setLineDash(this.strokeDashArray || []);\n }\n\n /**\n * Sets the transformation on given context\n * @param {CanvasRenderingContext2D} ctx context to render on\n * @private\n */\n protected _saveAndTransform(ctx: CanvasRenderingContext2D) {\n const v = this.canvas.viewportTransform;\n ctx.save();\n ctx.transform(v[0], v[1], v[2], v[3], v[4], v[5]);\n }\n\n protected needsFullRender() {\n const color = new Color(this.color);\n return color.getAlpha() < 1 || !!this.shadow;\n }\n\n /**\n * Sets brush shadow styles\n * @private\n */\n protected _setShadow() {\n if (!this.shadow || !this.canvas) {\n return;\n }\n\n const canvas = this.canvas,\n shadow = this.shadow,\n ctx = canvas.contextTop,\n zoom = canvas.getZoom() * canvas.getRetinaScaling();\n\n ctx.shadowColor = shadow.color;\n ctx.shadowBlur = shadow.blur * zoom;\n ctx.shadowOffsetX = shadow.offsetX * zoom;\n ctx.shadowOffsetY = shadow.offsetY * zoom;\n }\n\n /**\n * Removes brush shadow styles\n * @private\n */\n protected _resetShadow() {\n const ctx = this.canvas.contextTop;\n\n ctx.shadowColor = '';\n ctx.shadowBlur = ctx.shadowOffsetX = ctx.shadowOffsetY = 0;\n }\n\n /**\n * Check is pointer is outside canvas boundaries\n * @param {Object} pointer\n * @private\n */\n protected _isOutSideCanvas(pointer: Point) {\n return (\n pointer.x < 0 ||\n pointer.x > this.canvas.getWidth() ||\n pointer.y < 0 ||\n pointer.y > this.canvas.getHeight()\n );\n }\n}\n","import { config } from '../config';\nimport { SHARED_ATTRIBUTES } from '../parser/attributes';\nimport { parseAttributes } from '../parser/parseAttributes';\nimport type { XY } from '../Point';\nimport { Point } from '../Point';\nimport { makeBoundingBoxFromPoints } from '../util/misc/boundingBoxFromPoints';\nimport { toFixed } from '../util/misc/toFixed';\nimport {\n getBoundsOfCurve,\n joinPath,\n makePathSimpler,\n parsePath,\n} from '../util/path';\nimport { classRegistry } from '../ClassRegistry';\nimport { FabricObject, cacheProperties } from './Object/FabricObject';\nimport type {\n TComplexPathData,\n TPathSegmentInfo,\n TSimplePathData,\n} from '../util/path/typedefs';\nimport type { FabricObjectProps, SerializedObjectProps } from './Object/types';\nimport type { ObjectEvents } from '../EventTypeDefs';\nimport type {\n TBBox,\n TClassProperties,\n TSVGReviver,\n TOptions,\n} from '../typedefs';\nimport { CENTER, LEFT, TOP } from '../constants';\nimport type { CSSRules } from '../parser/typedefs';\n\ninterface UniquePathProps {\n sourcePath?: string;\n path?: TSimplePathData;\n}\n\nexport interface SerializedPathProps\n extends SerializedObjectProps,\n UniquePathProps {}\n\nexport interface PathProps extends FabricObjectProps, UniquePathProps {}\n\nexport interface IPathBBox extends TBBox {\n left: number;\n top: number;\n pathOffset: Point;\n}\n\nexport class Path<\n Props extends TOptions = Partial,\n SProps extends SerializedPathProps = SerializedPathProps,\n EventSpec extends ObjectEvents = ObjectEvents,\n> extends FabricObject {\n /**\n * Array of path points\n * @type Array\n */\n declare path: TSimplePathData;\n\n declare pathOffset: Point;\n\n declare sourcePath?: string;\n\n declare segmentsInfo?: TPathSegmentInfo[];\n\n static type = 'Path';\n\n static cacheProperties = [...cacheProperties, 'path', 'fillRule'];\n\n /**\n * Constructor\n * @param {TComplexPathData} path Path data (sequence of coordinates and corresponding \"command\" tokens)\n * @param {Partial} [options] Options object\n * @return {Path} thisArg\n */\n constructor(\n path: TComplexPathData | string,\n // todo: evaluate this spread here\n { path: _, left, top, ...options }: Partial = {},\n ) {\n super();\n Object.assign(this, Path.ownDefaults);\n this.setOptions(options);\n this._setPath(path || [], true);\n typeof left === 'number' && this.set(LEFT, left);\n typeof top === 'number' && this.set(TOP, top);\n }\n\n /**\n * @private\n * @param {TComplexPathData | string} path Path data (sequence of coordinates and corresponding \"command\" tokens)\n * @param {boolean} [adjustPosition] pass true to reposition the object according to the bounding box\n * @returns {Point} top left position of the bounding box, useful for complementary positioning\n */\n _setPath(path: TComplexPathData | string, adjustPosition?: boolean) {\n this.path = makePathSimpler(Array.isArray(path) ? path : parsePath(path));\n this.setBoundingBox(adjustPosition);\n }\n\n /**\n * This function is an helper for svg import. it returns the center of the object in the svg\n * untransformed coordinates, by look at the polyline/polygon points.\n * @private\n * @return {Point} center point from element coordinates\n */\n _findCenterFromElement(): Point {\n const bbox = this._calcBoundsFromPath();\n return new Point(bbox.left + bbox.width / 2, bbox.top + bbox.height / 2);\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx context to render path on\n */\n _renderPathCommands(ctx: CanvasRenderingContext2D) {\n const l = -this.pathOffset.x,\n t = -this.pathOffset.y;\n\n ctx.beginPath();\n\n for (const command of this.path) {\n switch (\n command[0] // first letter\n ) {\n case 'L': // lineto, absolute\n ctx.lineTo(command[1] + l, command[2] + t);\n break;\n\n case 'M': // moveTo, absolute\n ctx.moveTo(command[1] + l, command[2] + t);\n break;\n\n case 'C': // bezierCurveTo, absolute\n ctx.bezierCurveTo(\n command[1] + l,\n command[2] + t,\n command[3] + l,\n command[4] + t,\n command[5] + l,\n command[6] + t,\n );\n break;\n\n case 'Q': // quadraticCurveTo, absolute\n ctx.quadraticCurveTo(\n command[1] + l,\n command[2] + t,\n command[3] + l,\n command[4] + t,\n );\n break;\n\n case 'Z':\n ctx.closePath();\n break;\n }\n }\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx context to render path on\n */\n _render(ctx: CanvasRenderingContext2D) {\n this._renderPathCommands(ctx);\n this._renderPaintInOrder(ctx);\n }\n\n /**\n * Returns string representation of an instance\n * @return {string} string representation of an instance\n */\n toString() {\n return `#`;\n }\n\n /**\n * Returns object representation of an instance\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} object representation of an instance\n */\n toObject<\n T extends Omit, keyof SProps>,\n K extends keyof T = never,\n >(propertiesToInclude: K[] = []): Pick & SProps {\n return {\n ...super.toObject(propertiesToInclude),\n path: this.path.map((pathCmd) => pathCmd.slice()),\n };\n }\n\n /**\n * Returns dataless object representation of an instance\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} object representation of an instance\n */\n toDatalessObject<\n T extends Omit, keyof SProps>,\n K extends keyof T = never,\n >(propertiesToInclude: K[] = []): Pick & SProps {\n const o = this.toObject(propertiesToInclude);\n if (this.sourcePath) {\n delete o.path;\n o.sourcePath = this.sourcePath;\n }\n return o;\n }\n\n /**\n * Returns svg representation of an instance\n * @return {Array} an array of strings with the specific svg representation\n * of the instance\n */\n _toSVG() {\n const path = joinPath(this.path, config.NUM_FRACTION_DIGITS);\n return [\n '\\n`,\n ];\n }\n\n /**\n * @private\n * @return the path command's translate transform attribute\n */\n _getOffsetTransform() {\n const digits = config.NUM_FRACTION_DIGITS;\n return ` translate(${toFixed(-this.pathOffset.x, digits)}, ${toFixed(\n -this.pathOffset.y,\n digits,\n )})`;\n }\n\n /**\n * Returns svg clipPath representation of an instance\n * @param {Function} [reviver] Method for further parsing of svg representation.\n * @return {string} svg representation of an instance\n */\n toClipPathSVG(reviver?: TSVGReviver): string {\n const additionalTransform = this._getOffsetTransform();\n return (\n '\\t' +\n this._createBaseClipPathSVGMarkup(this._toSVG(), {\n reviver,\n additionalTransform: additionalTransform,\n })\n );\n }\n\n /**\n * Returns svg representation of an instance\n * @param {Function} [reviver] Method for further parsing of svg representation.\n * @return {string} svg representation of an instance\n */\n toSVG(reviver?: TSVGReviver): string {\n const additionalTransform = this._getOffsetTransform();\n return this._createBaseSVGMarkup(this._toSVG(), {\n reviver,\n additionalTransform: additionalTransform,\n });\n }\n\n /**\n * Returns number representation of an instance complexity\n * @return {number} complexity of this instance\n */\n complexity() {\n return this.path.length;\n }\n\n setDimensions() {\n this.setBoundingBox();\n }\n\n setBoundingBox(adjustPosition?: boolean) {\n const { width, height, pathOffset } = this._calcDimensions();\n this.set({ width, height, pathOffset });\n // using pathOffset because it match the use case.\n // if pathOffset change here we need to use left + width/2 , top + height/2\n adjustPosition && this.setPositionByOrigin(pathOffset, CENTER, CENTER);\n }\n\n _calcBoundsFromPath(): TBBox {\n const bounds: XY[] = [];\n let subpathStartX = 0,\n subpathStartY = 0,\n x = 0, // current x\n y = 0; // current y\n\n for (const command of this.path) {\n // current instruction\n switch (\n command[0] // first letter\n ) {\n case 'L': // lineto, absolute\n x = command[1];\n y = command[2];\n bounds.push({ x: subpathStartX, y: subpathStartY }, { x, y });\n break;\n\n case 'M': // moveTo, absolute\n x = command[1];\n y = command[2];\n subpathStartX = x;\n subpathStartY = y;\n break;\n\n case 'C': // bezierCurveTo, absolute\n bounds.push(\n ...getBoundsOfCurve(\n x,\n y,\n command[1],\n command[2],\n command[3],\n command[4],\n command[5],\n command[6],\n ),\n );\n x = command[5];\n y = command[6];\n break;\n\n case 'Q': // quadraticCurveTo, absolute\n bounds.push(\n ...getBoundsOfCurve(\n x,\n y,\n command[1],\n command[2],\n command[1],\n command[2],\n command[3],\n command[4],\n ),\n );\n x = command[3];\n y = command[4];\n break;\n\n case 'Z':\n x = subpathStartX;\n y = subpathStartY;\n break;\n }\n }\n return makeBoundingBoxFromPoints(bounds);\n }\n\n /**\n * @private\n */\n _calcDimensions(): IPathBBox {\n const bbox = this._calcBoundsFromPath();\n\n return {\n ...bbox,\n pathOffset: new Point(\n bbox.left + bbox.width / 2,\n bbox.top + bbox.height / 2,\n ),\n };\n }\n\n /**\n * List of attribute names to account for when parsing SVG element (used by `Path.fromElement`)\n * @see http://www.w3.org/TR/SVG/paths.html#PathElement\n */\n static ATTRIBUTE_NAMES = [...SHARED_ATTRIBUTES, 'd'];\n\n /**\n * Creates an instance of Path from an object\n * @param {Object} object\n * @returns {Promise}\n */\n static fromObject>(object: T) {\n return this._fromObject(object, {\n extraParam: 'path',\n });\n }\n\n /**\n * Creates an instance of Path from an SVG element\n * @param {HTMLElement} element to parse\n * @param {Partial} [options] Options object\n */\n static async fromElement(\n element: HTMLElement | SVGElement,\n options?: Partial,\n cssRules?: CSSRules,\n ) {\n const { d, ...parsedAttributes } = parseAttributes(\n element,\n this.ATTRIBUTE_NAMES,\n cssRules,\n );\n return new this(d, {\n ...parsedAttributes,\n ...options,\n // we pass undefined to instruct the constructor to position the object using the bbox\n left: undefined,\n top: undefined,\n });\n }\n}\n\nclassRegistry.setClass(Path);\nclassRegistry.setSVGClass(Path);\n\n/* _FROM_SVG_START_ */\n","import type { ModifierKey, TEvent } from '../EventTypeDefs';\nimport type { Point } from '../Point';\nimport { Shadow } from '../Shadow';\nimport { Path } from '../shapes/Path';\nimport { getSmoothPathFromPoints, joinPath } from '../util/path';\nimport type { Canvas } from '../canvas/Canvas';\nimport { BaseBrush } from './BaseBrush';\nimport type { TSimplePathData } from '../util/path/typedefs';\n\n/**\n * @private\n * @param {TSimplePathData} pathData SVG path commands\n * @returns {boolean}\n */\nfunction isEmptySVGPath(pathData: TSimplePathData): boolean {\n return joinPath(pathData) === 'M 0 0 Q 0 0 0 0 L 0 0';\n}\n\nexport class PencilBrush extends BaseBrush {\n /**\n * Discard points that are less than `decimate` pixel distant from each other\n * @type Number\n * @default 0.4\n */\n decimate = 0.4;\n\n /**\n * Draws a straight line between last recorded point to current pointer\n * Used for `shift` functionality\n *\n * @type boolean\n * @default false\n */\n drawStraightLine = false;\n\n /**\n * The event modifier key that makes the brush draw a straight line.\n * If `null` or 'none' or any other string that is not a modifier key the feature is disabled.\n * @type {ModifierKey | undefined | null}\n */\n straightLineKey: ModifierKey | undefined | null = 'shiftKey';\n\n declare protected _points: Point[];\n declare protected _hasStraightLine: boolean;\n declare protected oldEnd?: Point;\n\n constructor(canvas: Canvas) {\n super(canvas);\n this._points = [];\n this._hasStraightLine = false;\n }\n\n needsFullRender() {\n return super.needsFullRender() || this._hasStraightLine;\n }\n\n static drawSegment(ctx: CanvasRenderingContext2D, p1: Point, p2: Point) {\n const midPoint = p1.midPointFrom(p2);\n ctx.quadraticCurveTo(p1.x, p1.y, midPoint.x, midPoint.y);\n return midPoint;\n }\n\n /**\n * Invoked on mouse down\n * @param {Point} pointer\n */\n onMouseDown(pointer: Point, { e }: TEvent) {\n if (!this.canvas._isMainEvent(e)) {\n return;\n }\n this.drawStraightLine = !!this.straightLineKey && e[this.straightLineKey];\n this._prepareForDrawing(pointer);\n // capture coordinates immediately\n // this allows to draw dots (when movement never occurs)\n this._addPoint(pointer);\n this._render();\n }\n\n /**\n * Invoked on mouse move\n * @param {Point} pointer\n */\n onMouseMove(pointer: Point, { e }: TEvent) {\n if (!this.canvas._isMainEvent(e)) {\n return;\n }\n this.drawStraightLine = !!this.straightLineKey && e[this.straightLineKey];\n if (this.limitedToCanvasSize === true && this._isOutSideCanvas(pointer)) {\n return;\n }\n if (this._addPoint(pointer) && this._points.length > 1) {\n if (this.needsFullRender()) {\n // redraw curve\n // clear top canvas\n this.canvas.clearContext(this.canvas.contextTop);\n this._render();\n } else {\n const points = this._points,\n length = points.length,\n ctx = this.canvas.contextTop;\n // draw the curve update\n this._saveAndTransform(ctx);\n if (this.oldEnd) {\n ctx.beginPath();\n ctx.moveTo(this.oldEnd.x, this.oldEnd.y);\n }\n this.oldEnd = PencilBrush.drawSegment(\n ctx,\n points[length - 2],\n points[length - 1],\n );\n ctx.stroke();\n ctx.restore();\n }\n }\n }\n\n /**\n * Invoked on mouse up\n */\n onMouseUp({ e }: TEvent) {\n if (!this.canvas._isMainEvent(e)) {\n return true;\n }\n this.drawStraightLine = false;\n this.oldEnd = undefined;\n this._finalizeAndAddPath();\n\n return false;\n }\n\n /**\n * @private\n * @param {Point} pointer Actual mouse position related to the canvas.\n */\n _prepareForDrawing(pointer: Point) {\n this._reset();\n this._addPoint(pointer);\n this.canvas.contextTop.moveTo(pointer.x, pointer.y);\n }\n\n /**\n * @private\n * @param {Point} point Point to be added to points array\n */\n _addPoint(point: Point) {\n if (\n this._points.length > 1 &&\n point.eq(this._points[this._points.length - 1])\n ) {\n return false;\n }\n if (this.drawStraightLine && this._points.length > 1) {\n this._hasStraightLine = true;\n this._points.pop();\n }\n this._points.push(point);\n return true;\n }\n\n /**\n * Clear points array and set contextTop canvas style.\n * @private\n */\n _reset() {\n this._points = [];\n this._setBrushStyles(this.canvas.contextTop);\n this._setShadow();\n this._hasStraightLine = false;\n }\n\n /**\n * Draw a smooth path on the topCanvas using quadraticCurveTo\n * @private\n * @param {CanvasRenderingContext2D} [ctx]\n */\n _render(ctx: CanvasRenderingContext2D = this.canvas.contextTop) {\n let p1 = this._points[0],\n p2 = this._points[1];\n this._saveAndTransform(ctx);\n ctx.beginPath();\n //if we only have 2 points in the path and they are the same\n //it means that the user only clicked the canvas without moving the mouse\n //then we should be drawing a dot. A path isn't drawn between two identical dots\n //that's why we set them apart a bit\n if (this._points.length === 2 && p1.x === p2.x && p1.y === p2.y) {\n const width = this.width / 1000;\n p1.x -= width;\n p2.x += width;\n }\n ctx.moveTo(p1.x, p1.y);\n\n for (let i = 1; i < this._points.length; i++) {\n // we pick the point between pi + 1 & pi + 2 as the\n // end point and p1 as our control point.\n PencilBrush.drawSegment(ctx, p1, p2);\n p1 = this._points[i];\n p2 = this._points[i + 1];\n }\n // Draw last line as a straight line while\n // we wait for the next point to be able to calculate\n // the bezier control point\n ctx.lineTo(p1.x, p1.y);\n ctx.stroke();\n ctx.restore();\n }\n\n /**\n * Converts points to SVG path\n * @param {Point[]} points Array of points\n * @return {TSimplePathData} SVG path commands\n */\n convertPointsToSVGPath(points: Point[]): TSimplePathData {\n const correction = this.width / 1000;\n return getSmoothPathFromPoints(points, correction);\n }\n\n /**\n * Creates a Path object to add on canvas\n * @param {TSimplePathData} pathData Path data\n * @return {Path} Path to add on canvas\n */\n createPath(pathData: TSimplePathData): Path {\n const path = new Path(pathData, {\n fill: null,\n stroke: this.color,\n strokeWidth: this.width,\n strokeLineCap: this.strokeLineCap,\n strokeMiterLimit: this.strokeMiterLimit,\n strokeLineJoin: this.strokeLineJoin,\n strokeDashArray: this.strokeDashArray,\n });\n if (this.shadow) {\n this.shadow.affectStroke = true;\n path.shadow = new Shadow(this.shadow);\n }\n\n return path;\n }\n\n /**\n * Decimate points array with the decimate value\n */\n decimatePoints(points: Point[], distance: number) {\n if (points.length <= 2) {\n return points;\n }\n let lastPoint = points[0],\n cDistance;\n const zoom = this.canvas.getZoom(),\n adjustedDistance = Math.pow(distance / zoom, 2),\n l = points.length - 1,\n newPoints = [lastPoint];\n // TODO investigate why this is not i < l\n for (let i = 1; i < l - 1; i++) {\n cDistance =\n Math.pow(lastPoint.x - points[i].x, 2) +\n Math.pow(lastPoint.y - points[i].y, 2);\n if (cDistance >= adjustedDistance) {\n lastPoint = points[i];\n newPoints.push(lastPoint);\n }\n }\n // Add the last point from the original line to the end of the array.\n // This ensures decimate doesn't delete the last point on the line, and ensures the line is > 1 point.\n newPoints.push(points[l]);\n return newPoints;\n }\n\n /**\n * On mouseup after drawing the path on contextTop canvas\n * we use the points captured to create an new Path object\n * and add it to the canvas.\n */\n _finalizeAndAddPath() {\n const ctx = this.canvas.contextTop;\n ctx.closePath();\n if (this.decimate) {\n this._points = this.decimatePoints(this._points, this.decimate);\n }\n const pathData = this.convertPointsToSVGPath(this._points);\n if (isEmptySVGPath(pathData)) {\n // do not create 0 width/height paths, as they are\n // rendered inconsistently across browsers\n // Firefox 4, for example, renders a dot,\n // whereas Chrome 10 renders nothing\n this.canvas.requestRenderAll();\n return;\n }\n\n const path = this.createPath(pathData);\n this.canvas.clearContext(this.canvas.contextTop);\n this.canvas.fire('before:path:created', { path: path });\n this.canvas.add(path);\n this.canvas.requestRenderAll();\n path.setCoords();\n this._resetShadow();\n\n // fire event 'path' created\n this.canvas.fire('path:created', { path: path });\n }\n}\n","import type { ObjectEvents } from '../EventTypeDefs';\nimport { SHARED_ATTRIBUTES } from '../parser/attributes';\nimport { parseAttributes } from '../parser/parseAttributes';\nimport { cos } from '../util/misc/cos';\nimport { degreesToRadians } from '../util/misc/radiansDegreesConversion';\nimport { sin } from '../util/misc/sin';\nimport { classRegistry } from '../ClassRegistry';\nimport { FabricObject, cacheProperties } from './Object/FabricObject';\nimport type { Abortable, TClassProperties, TOptions } from '../typedefs';\nimport type { FabricObjectProps, SerializedObjectProps } from './Object/types';\nimport type { CSSRules } from '../parser/typedefs';\nimport { SCALE_X, SCALE_Y } from '../constants';\n\ninterface UniqueCircleProps {\n /**\n * Radius of this circle\n * @type Number\n * @default 0\n */\n radius: number;\n\n /**\n * Angle for the start of the circle, in degrees.\n * @type TDegree 0 - 359\n * @default 0\n */\n startAngle: number;\n\n /**\n * Angle for the end of the circle, in degrees\n * @type TDegree 1 - 360\n * @default 360\n */\n endAngle: number;\n\n /**\n * Orientation for the direction of the circle.\n * Setting to true will switch the arc of the circle to traverse from startAngle to endAngle in a counter-clockwise direction.\n * Note: this will only change how the circle is drawn, and does not affect rotational transformation.\n * @default false\n */\n counterClockwise: boolean;\n}\n\nexport interface SerializedCircleProps\n extends SerializedObjectProps,\n UniqueCircleProps {}\n\nexport interface CircleProps extends FabricObjectProps, UniqueCircleProps {}\n\nconst CIRCLE_PROPS = [\n 'radius',\n 'startAngle',\n 'endAngle',\n 'counterClockwise',\n] as const;\n\nexport const circleDefaultValues: Partial> = {\n radius: 0,\n startAngle: 0,\n endAngle: 360,\n counterClockwise: false,\n};\n\nexport class Circle<\n Props extends TOptions = Partial,\n SProps extends SerializedCircleProps = SerializedCircleProps,\n EventSpec extends ObjectEvents = ObjectEvents,\n >\n extends FabricObject\n implements UniqueCircleProps\n{\n declare radius: number;\n declare startAngle: number;\n declare endAngle: number;\n declare counterClockwise: boolean;\n\n static type = 'Circle';\n\n static cacheProperties = [...cacheProperties, ...CIRCLE_PROPS];\n\n static ownDefaults = circleDefaultValues;\n\n static getDefaults(): Record {\n return {\n ...super.getDefaults(),\n ...Circle.ownDefaults,\n };\n }\n\n /**\n * Constructor\n * @param {Object} [options] Options object\n */\n constructor(options?: Props) {\n super();\n Object.assign(this, Circle.ownDefaults);\n this.setOptions(options);\n }\n\n /**\n * @private\n * @param {String} key\n * @param {*} value\n */\n _set(key: string, value: any) {\n super._set(key, value);\n\n if (key === 'radius') {\n this.setRadius(value);\n }\n\n return this;\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx context to render on\n */\n _render(ctx: CanvasRenderingContext2D) {\n ctx.beginPath();\n ctx.arc(\n 0,\n 0,\n this.radius,\n degreesToRadians(this.startAngle),\n degreesToRadians(this.endAngle),\n this.counterClockwise,\n );\n this._renderPaintInOrder(ctx);\n }\n\n /**\n * Returns horizontal radius of an object (according to how an object is scaled)\n * @return {Number}\n */\n getRadiusX(): number {\n return this.get('radius') * this.get(SCALE_X);\n }\n\n /**\n * Returns vertical radius of an object (according to how an object is scaled)\n * @return {Number}\n */\n getRadiusY(): number {\n return this.get('radius') * this.get(SCALE_Y);\n }\n\n /**\n * Sets radius of an object (and updates width accordingly)\n */\n setRadius(value: number) {\n this.radius = value;\n this.set({ width: value * 2, height: value * 2 });\n }\n\n /**\n * Returns object representation of an instance\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} object representation of an instance\n */\n toObject<\n T extends Omit, keyof SProps>,\n K extends keyof T = never,\n >(propertiesToInclude: K[] = []): Pick & SProps {\n return super.toObject([...CIRCLE_PROPS, ...propertiesToInclude]);\n }\n\n /* _TO_SVG_START_ */\n\n /**\n * Returns svg representation of an instance\n * @return {Array} an array of strings with the specific svg representation\n * of the instance\n */\n _toSVG(): string[] {\n const angle = (this.endAngle - this.startAngle) % 360;\n\n if (angle === 0) {\n return [\n '\\n',\n ];\n } else {\n const { radius } = this;\n const start = degreesToRadians(this.startAngle),\n end = degreesToRadians(this.endAngle),\n startX = cos(start) * radius,\n startY = sin(start) * radius,\n endX = cos(end) * radius,\n endY = sin(end) * radius,\n largeFlag = angle > 180 ? 1 : 0,\n sweepFlag = this.counterClockwise ? 0 : 1;\n return [\n `\\n',\n ];\n }\n }\n /* _TO_SVG_END_ */\n\n /* _FROM_SVG_START_ */\n /**\n * List of attribute names to account for when parsing SVG element (used by {@link Circle.fromElement})\n * @see: http://www.w3.org/TR/SVG/shapes.html#CircleElement\n */\n static ATTRIBUTE_NAMES = ['cx', 'cy', 'r', ...SHARED_ATTRIBUTES];\n\n /**\n * Returns {@link Circle} instance from an SVG element\n * @param {HTMLElement} element Element to parse\n * @param {Object} [options] Partial Circle object to default missing properties on the element.\n * @throws {Error} If value of `r` attribute is missing or invalid\n */\n static async fromElement(\n element: HTMLElement,\n options: Abortable,\n cssRules?: CSSRules,\n ): Promise {\n const {\n left = 0,\n top = 0,\n radius = 0,\n ...otherParsedAttributes\n } = parseAttributes(\n element,\n this.ATTRIBUTE_NAMES,\n cssRules,\n ) as Partial;\n\n // this probably requires to be fixed for default origins not being top/left.\n\n return new this({\n ...otherParsedAttributes,\n radius,\n left: left - radius,\n top: top - radius,\n });\n }\n\n /* _FROM_SVG_END_ */\n\n /**\n * @todo how do we declare this??\n */\n static fromObject>(object: T) {\n return super._fromObject(object);\n }\n}\n\nclassRegistry.setClass(Circle);\nclassRegistry.setSVGClass(Circle);\n","import { Color } from '../color/Color';\nimport type { Point } from '../Point';\nimport { Shadow } from '../Shadow';\nimport { Circle } from '../shapes/Circle';\nimport { Group } from '../shapes/Group';\nimport { getRandomInt } from '../util/internals/getRandomInt';\nimport type { Canvas } from '../canvas/Canvas';\nimport { BaseBrush } from './BaseBrush';\nimport type { CircleBrushPoint } from './typedefs';\nimport { CENTER } from '../constants';\n\nexport class CircleBrush extends BaseBrush {\n /**\n * Width of a brush\n * @type Number\n */\n width = 10;\n\n declare points: CircleBrushPoint[];\n\n constructor(canvas: Canvas) {\n super(canvas);\n this.points = [];\n }\n\n /**\n * Invoked inside on mouse down and mouse move\n * @param {Point} pointer\n */\n drawDot(pointer: Point) {\n const point = this.addPoint(pointer),\n ctx = this.canvas.contextTop;\n this._saveAndTransform(ctx);\n this.dot(ctx, point);\n ctx.restore();\n }\n\n dot(ctx: CanvasRenderingContext2D, point: CircleBrushPoint) {\n ctx.fillStyle = point.fill;\n ctx.beginPath();\n ctx.arc(point.x, point.y, point.radius, 0, Math.PI * 2, false);\n ctx.closePath();\n ctx.fill();\n }\n\n /**\n * Invoked on mouse down\n */\n onMouseDown(pointer: Point) {\n this.points = [];\n this.canvas.clearContext(this.canvas.contextTop);\n this._setShadow();\n this.drawDot(pointer);\n }\n\n /**\n * Render the full state of the brush\n * @private\n */\n _render() {\n const ctx = this.canvas.contextTop,\n points = this.points;\n this._saveAndTransform(ctx);\n for (let i = 0; i < points.length; i++) {\n this.dot(ctx, points[i]);\n }\n ctx.restore();\n }\n\n /**\n * Invoked on mouse move\n * @param {Point} pointer\n */\n onMouseMove(pointer: Point) {\n if (this.limitedToCanvasSize === true && this._isOutSideCanvas(pointer)) {\n return;\n }\n if (this.needsFullRender()) {\n this.canvas.clearContext(this.canvas.contextTop);\n this.addPoint(pointer);\n this._render();\n } else {\n this.drawDot(pointer);\n }\n }\n\n /**\n * Invoked on mouse up\n */\n onMouseUp() {\n const originalRenderOnAddRemove = this.canvas.renderOnAddRemove;\n this.canvas.renderOnAddRemove = false;\n\n const circles: Circle[] = [];\n\n for (let i = 0; i < this.points.length; i++) {\n const point = this.points[i],\n circle = new Circle({\n radius: point.radius,\n left: point.x,\n top: point.y,\n originX: CENTER,\n originY: CENTER,\n fill: point.fill,\n });\n\n this.shadow && (circle.shadow = new Shadow(this.shadow));\n\n circles.push(circle);\n }\n const group = new Group(circles, { canvas: this.canvas });\n\n this.canvas.fire('before:path:created', { path: group });\n this.canvas.add(group);\n this.canvas.fire('path:created', { path: group });\n\n this.canvas.clearContext(this.canvas.contextTop);\n this._resetShadow();\n this.canvas.renderOnAddRemove = originalRenderOnAddRemove;\n this.canvas.requestRenderAll();\n }\n\n /**\n * @param {Object} pointer\n * @return {Point} Just added pointer point\n */\n addPoint({ x, y }: Point) {\n const pointerPoint: CircleBrushPoint = {\n x,\n y,\n radius: getRandomInt(Math.max(0, this.width - 20), this.width + 20) / 2,\n fill: new Color(this.color).setAlpha(getRandomInt(0, 100) / 100).toRgba(),\n };\n\n this.points.push(pointerPoint);\n\n return pointerPoint;\n }\n}\n","import type { Point } from '../Point';\nimport { Group } from '../shapes/Group';\nimport { Shadow } from '../Shadow';\nimport { Rect } from '../shapes/Rect';\nimport { getRandomInt } from '../util/internals/getRandomInt';\nimport type { Canvas } from '../canvas/Canvas';\nimport { BaseBrush } from './BaseBrush';\nimport type { SprayBrushPoint } from './typedefs';\nimport { CENTER } from '../constants';\n\n/**\n *\n * @param rects\n * @returns\n */\nfunction getUniqueRects(rects: Rect[]) {\n const uniqueRects: Record = {};\n const uniqueRectsArray: Rect[] = [];\n\n for (let i = 0, key: string; i < rects.length; i++) {\n key = `${rects[i].left}${rects[i].top}`;\n if (!uniqueRects[key]) {\n uniqueRects[key] = true;\n uniqueRectsArray.push(rects[i]);\n }\n }\n\n return uniqueRectsArray;\n}\n\nexport class SprayBrush extends BaseBrush {\n /**\n * Width of a spray\n * @type Number\n */\n width = 10;\n\n /**\n * Density of a spray (number of dots per chunk)\n * @type Number\n */\n density = 20;\n\n /**\n * Width of spray dots\n * @type Number\n */\n dotWidth = 1;\n\n /**\n * Width variance of spray dots\n * @type Number\n */\n dotWidthVariance = 1;\n\n /**\n * Whether opacity of a dot should be random\n * @type Boolean\n */\n randomOpacity = false;\n\n /**\n * Whether overlapping dots (rectangles) should be removed (for performance reasons)\n * @type Boolean\n */\n optimizeOverlapping = true;\n\n declare private sprayChunks: SprayBrushPoint[][];\n\n declare private sprayChunk: SprayBrushPoint[];\n\n /**\n * Constructor\n * @param {Canvas} canvas\n * @return {SprayBrush} Instance of a spray brush\n */\n constructor(canvas: Canvas) {\n super(canvas);\n this.sprayChunks = [];\n this.sprayChunk = [];\n }\n\n /**\n * Invoked on mouse down\n * @param {Point} pointer\n */\n onMouseDown(pointer: Point) {\n this.sprayChunks = [];\n this.canvas.clearContext(this.canvas.contextTop);\n this._setShadow();\n\n this.addSprayChunk(pointer);\n this.renderChunck(this.sprayChunk);\n }\n\n /**\n * Invoked on mouse move\n * @param {Point} pointer\n */\n onMouseMove(pointer: Point) {\n if (this.limitedToCanvasSize === true && this._isOutSideCanvas(pointer)) {\n return;\n }\n this.addSprayChunk(pointer);\n this.renderChunck(this.sprayChunk);\n }\n\n /**\n * Invoked on mouse up\n */\n onMouseUp() {\n const originalRenderOnAddRemove = this.canvas.renderOnAddRemove;\n this.canvas.renderOnAddRemove = false;\n\n const rects: Rect[] = [];\n\n for (let i = 0; i < this.sprayChunks.length; i++) {\n const sprayChunk = this.sprayChunks[i];\n for (let j = 0; j < sprayChunk.length; j++) {\n const chunck = sprayChunk[j];\n const rect = new Rect({\n width: chunck.width,\n height: chunck.width,\n left: chunck.x + 1,\n top: chunck.y + 1,\n originX: CENTER,\n originY: CENTER,\n fill: this.color,\n });\n rects.push(rect);\n }\n }\n\n const group = new Group(\n this.optimizeOverlapping ? getUniqueRects(rects) : rects,\n {\n objectCaching: true,\n subTargetCheck: false,\n interactive: false,\n },\n );\n this.shadow && group.set('shadow', new Shadow(this.shadow));\n this.canvas.fire('before:path:created', { path: group });\n this.canvas.add(group);\n this.canvas.fire('path:created', { path: group });\n\n this.canvas.clearContext(this.canvas.contextTop);\n this._resetShadow();\n this.canvas.renderOnAddRemove = originalRenderOnAddRemove;\n this.canvas.requestRenderAll();\n }\n\n renderChunck(sprayChunck: SprayBrushPoint[]) {\n const ctx = this.canvas.contextTop;\n ctx.fillStyle = this.color;\n\n this._saveAndTransform(ctx);\n\n for (let i = 0; i < sprayChunck.length; i++) {\n const point = sprayChunck[i];\n ctx.globalAlpha = point.opacity;\n ctx.fillRect(point.x, point.y, point.width, point.width);\n }\n\n ctx.restore();\n }\n\n /**\n * Render all spray chunks\n */\n _render() {\n const ctx = this.canvas.contextTop;\n ctx.fillStyle = this.color;\n\n this._saveAndTransform(ctx);\n\n for (let i = 0; i < this.sprayChunks.length; i++) {\n this.renderChunck(this.sprayChunks[i]);\n }\n ctx.restore();\n }\n\n /**\n * @param {Point} pointer\n */\n addSprayChunk(pointer: Point) {\n this.sprayChunk = [];\n const radius = this.width / 2;\n\n for (let i = 0; i < this.density; i++) {\n this.sprayChunk.push({\n x: getRandomInt(pointer.x - radius, pointer.x + radius),\n y: getRandomInt(pointer.y - radius, pointer.y + radius),\n width: this.dotWidthVariance\n ? getRandomInt(\n // bottom clamp width to 1\n Math.max(1, this.dotWidth - this.dotWidthVariance),\n this.dotWidth + this.dotWidthVariance,\n )\n : this.dotWidth,\n opacity: this.randomOpacity ? getRandomInt(0, 100) / 100 : 1,\n });\n }\n\n this.sprayChunks.push(this.sprayChunk);\n }\n}\n","import { Pattern } from '../Pattern';\nimport { createCanvasElement } from '../util/misc/dom';\nimport type { Canvas } from '../canvas/Canvas';\nimport { PencilBrush } from './PencilBrush';\nimport type { TSimplePathData } from '../util/path/typedefs';\n\nexport class PatternBrush extends PencilBrush {\n declare source?: CanvasImageSource;\n\n constructor(canvas: Canvas) {\n super(canvas);\n }\n\n getPatternSrc() {\n const dotWidth = 20,\n dotDistance = 5,\n patternCanvas = createCanvasElement(),\n patternCtx = patternCanvas.getContext('2d');\n\n patternCanvas.width = patternCanvas.height = dotWidth + dotDistance;\n if (patternCtx) {\n patternCtx.fillStyle = this.color;\n patternCtx.beginPath();\n patternCtx.arc(\n dotWidth / 2,\n dotWidth / 2,\n dotWidth / 2,\n 0,\n Math.PI * 2,\n false,\n );\n patternCtx.closePath();\n patternCtx.fill();\n }\n return patternCanvas;\n }\n\n /**\n * Creates \"pattern\" instance property\n * @param {CanvasRenderingContext2D} ctx\n */\n getPattern(ctx: CanvasRenderingContext2D) {\n return ctx.createPattern(this.source || this.getPatternSrc(), 'repeat');\n }\n\n /**\n * Sets brush styles\n * @param {CanvasRenderingContext2D} ctx\n */\n _setBrushStyles(ctx: CanvasRenderingContext2D) {\n super._setBrushStyles(ctx);\n const pattern = this.getPattern(ctx);\n pattern && (ctx.strokeStyle = pattern);\n }\n\n /**\n * Creates path\n */\n createPath(pathData: TSimplePathData) {\n const path = super.createPath(pathData),\n topLeft = path._getLeftTopCoords().scalarAdd(path.strokeWidth / 2);\n\n path.stroke = new Pattern({\n source: this.source || this.getPatternSrc(),\n offsetX: -topLeft.x,\n offsetY: -topLeft.y,\n });\n return path;\n }\n}\n","import { SHARED_ATTRIBUTES } from '../parser/attributes';\nimport { parseAttributes } from '../parser/parseAttributes';\nimport type { Abortable, TClassProperties, TOptions } from '../typedefs';\nimport { classRegistry } from '../ClassRegistry';\nimport { FabricObject, cacheProperties } from './Object/FabricObject';\nimport { Point } from '../Point';\nimport { isFiller } from '../util/typeAssertions';\nimport type { FabricObjectProps, SerializedObjectProps } from './Object/types';\nimport type { ObjectEvents } from '../EventTypeDefs';\nimport { makeBoundingBoxFromPoints } from '../util';\nimport { CENTER, LEFT, TOP } from '../constants';\nimport type { CSSRules } from '../parser/typedefs';\n\n// @TODO this code is terrible and Line should be a special case of polyline.\n\nconst coordProps = ['x1', 'x2', 'y1', 'y2'] as const;\n\ninterface UniqueLineProps {\n x1: number;\n x2: number;\n y1: number;\n y2: number;\n}\n\nexport interface SerializedLineProps\n extends SerializedObjectProps,\n UniqueLineProps {}\n\n/**\n * A Class to draw a line\n * A bunch of methods will be added to Polyline to handle the line case\n * The line class is very strange to work with, is all special, it hardly aligns\n * to what a developer want everytime there is an angle\n * @deprecated\n */\nexport class Line<\n Props extends TOptions = Partial,\n SProps extends SerializedLineProps = SerializedLineProps,\n EventSpec extends ObjectEvents = ObjectEvents,\n >\n extends FabricObject\n implements UniqueLineProps\n{\n /**\n * x value or first line edge\n * @type number\n */\n declare x1: number;\n\n /**\n * y value or first line edge\n * @type number\n */\n declare y1: number;\n\n /**\n * x value or second line edge\n * @type number\n */\n declare x2: number;\n\n /**\n * y value or second line edge\n * @type number\n */\n declare y2: number;\n\n static type = 'Line';\n\n static cacheProperties = [...cacheProperties, ...coordProps];\n /**\n * Constructor\n * @param {Array} [points] Array of points\n * @param {Object} [options] Options object\n * @return {Line} thisArg\n */\n constructor([x1, y1, x2, y2] = [0, 0, 0, 0], options: Partial = {}) {\n super();\n Object.assign(this, Line.ownDefaults);\n this.setOptions(options);\n this.x1 = x1;\n this.x2 = x2;\n this.y1 = y1;\n this.y2 = y2;\n this._setWidthHeight();\n const { left, top } = options;\n typeof left === 'number' && this.set(LEFT, left);\n typeof top === 'number' && this.set(TOP, top);\n }\n\n /**\n * @private\n * @param {Object} [options] Options\n */\n _setWidthHeight() {\n const { x1, y1, x2, y2 } = this;\n this.width = Math.abs(x2 - x1);\n this.height = Math.abs(y2 - y1);\n const { left, top, width, height } = makeBoundingBoxFromPoints([\n { x: x1, y: y1 },\n { x: x2, y: y2 },\n ]);\n const position = new Point(left + width / 2, top + height / 2);\n this.setPositionByOrigin(position, CENTER, CENTER);\n }\n\n /**\n * @private\n * @param {String} key\n * @param {*} value\n */\n _set(key: string, value: any) {\n super._set(key, value);\n if (coordProps.includes(key as keyof UniqueLineProps)) {\n // this doesn't make sense very much, since setting x1 when top or left\n // are already set, is just going to show a strange result since the\n // line will move way more than the developer expect.\n // in fabric5 it worked only when the line didn't have extra transformations,\n // in fabric6 too. With extra transform they behave bad in different ways.\n // This needs probably a good rework or a tutorial if you have to create a dynamic line\n this._setWidthHeight();\n }\n return this;\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _render(ctx: CanvasRenderingContext2D) {\n ctx.beginPath();\n\n const p = this.calcLinePoints();\n ctx.moveTo(p.x1, p.y1);\n ctx.lineTo(p.x2, p.y2);\n\n ctx.lineWidth = this.strokeWidth;\n\n // TODO: test this\n // make sure setting \"fill\" changes color of a line\n // (by copying fillStyle to strokeStyle, since line is stroked, not filled)\n const origStrokeStyle = ctx.strokeStyle;\n if (isFiller(this.stroke)) {\n ctx.strokeStyle = this.stroke.toLive(ctx)!;\n } else {\n ctx.strokeStyle = this.stroke ?? ctx.fillStyle;\n }\n this.stroke && this._renderStroke(ctx);\n ctx.strokeStyle = origStrokeStyle;\n }\n\n /**\n * This function is an helper for svg import. it returns the center of the object in the svg\n * untransformed coordinates\n * @private\n * @return {Point} center point from element coordinates\n */\n _findCenterFromElement(): Point {\n return new Point((this.x1 + this.x2) / 2, (this.y1 + this.y2) / 2);\n }\n\n /**\n * Returns object representation of an instance\n * @method toObject\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} object representation of an instance\n */\n toObject<\n T extends Omit, keyof SProps>,\n K extends keyof T = never,\n >(propertiesToInclude: K[] = []): Pick & SProps {\n return {\n ...super.toObject(propertiesToInclude),\n ...this.calcLinePoints(),\n };\n }\n\n /*\n * Calculate object dimensions from its properties\n * @private\n */\n _getNonTransformedDimensions(): Point {\n const dim = super._getNonTransformedDimensions();\n if (this.strokeLineCap === 'butt') {\n if (this.width === 0) {\n dim.y -= this.strokeWidth;\n }\n if (this.height === 0) {\n dim.x -= this.strokeWidth;\n }\n }\n return dim;\n }\n\n /**\n * Recalculates line points given width and height\n * Those points are simply placed around the center,\n * This is not useful outside internal render functions and svg output\n * Is not meant to be for the developer.\n * @private\n */\n calcLinePoints(): UniqueLineProps {\n const { x1: _x1, x2: _x2, y1: _y1, y2: _y2, width, height } = this;\n const xMult = _x1 <= _x2 ? -1 : 1,\n yMult = _y1 <= _y2 ? -1 : 1,\n x1 = (xMult * width) / 2,\n y1 = (yMult * height) / 2,\n x2 = (xMult * -width) / 2,\n y2 = (yMult * -height) / 2;\n\n return {\n x1,\n x2,\n y1,\n y2,\n };\n }\n\n /* _FROM_SVG_START_ */\n\n /**\n * Returns svg representation of an instance\n * @return {Array} an array of strings with the specific svg representation\n * of the instance\n */\n _toSVG() {\n const { x1, x2, y1, y2 } = this.calcLinePoints();\n return [\n '\\n`,\n ];\n }\n\n /**\n * List of attribute names to account for when parsing SVG element (used by {@link Line.fromElement})\n * @see http://www.w3.org/TR/SVG/shapes.html#LineElement\n */\n static ATTRIBUTE_NAMES = SHARED_ATTRIBUTES.concat(coordProps);\n\n /**\n * Returns Line instance from an SVG element\n * @param {HTMLElement} element Element to parse\n * @param {Object} [options] Options object\n * @param {Function} [callback] callback function invoked after parsing\n */\n static async fromElement(\n element: HTMLElement,\n options?: Abortable,\n cssRules?: CSSRules,\n ) {\n const {\n x1 = 0,\n y1 = 0,\n x2 = 0,\n y2 = 0,\n ...parsedAttributes\n } = parseAttributes(element, this.ATTRIBUTE_NAMES, cssRules);\n return new this([x1, y1, x2, y2], parsedAttributes);\n }\n\n /* _FROM_SVG_END_ */\n\n /**\n * Returns Line instance from an object representation\n * @param {Object} object Object to create an instance from\n * @returns {Promise}\n */\n static fromObject>({\n x1,\n y1,\n x2,\n y2,\n ...object\n }: T) {\n return this._fromObject(\n {\n ...object,\n points: [x1, y1, x2, y2],\n },\n {\n extraParam: 'points',\n },\n );\n }\n}\n\nclassRegistry.setClass(Line);\nclassRegistry.setSVGClass(Line);\n","import { classRegistry } from '../ClassRegistry';\nimport { FabricObject } from './Object/FabricObject';\nimport type { FabricObjectProps, SerializedObjectProps } from './Object/types';\nimport type { TClassProperties, TOptions } from '../typedefs';\nimport type { ObjectEvents } from '../EventTypeDefs';\n\nexport const triangleDefaultValues: Partial> = {\n width: 100,\n height: 100,\n};\n\nexport class Triangle<\n Props extends TOptions = Partial,\n SProps extends SerializedObjectProps = SerializedObjectProps,\n EventSpec extends ObjectEvents = ObjectEvents,\n >\n extends FabricObject\n implements FabricObjectProps\n{\n static type = 'Triangle';\n\n static ownDefaults = triangleDefaultValues;\n\n static getDefaults(): Record {\n return { ...super.getDefaults(), ...Triangle.ownDefaults };\n }\n\n /**\n * Constructor\n * @param {Object} [options] Options object\n */\n constructor(options?: Props) {\n super();\n Object.assign(this, Triangle.ownDefaults);\n this.setOptions(options);\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _render(ctx: CanvasRenderingContext2D) {\n const widthBy2 = this.width / 2,\n heightBy2 = this.height / 2;\n\n ctx.beginPath();\n ctx.moveTo(-widthBy2, heightBy2);\n ctx.lineTo(0, -heightBy2);\n ctx.lineTo(widthBy2, heightBy2);\n ctx.closePath();\n\n this._renderPaintInOrder(ctx);\n }\n\n /**\n * Returns svg representation of an instance\n * @return {Array} an array of strings with the specific svg representation\n * of the instance\n */\n _toSVG() {\n const widthBy2 = this.width / 2,\n heightBy2 = this.height / 2,\n points = `${-widthBy2} ${heightBy2},0 ${-heightBy2},${widthBy2} ${heightBy2}`;\n return [''];\n }\n}\n\nclassRegistry.setClass(Triangle);\nclassRegistry.setSVGClass(Triangle);\n","import { SCALE_X, SCALE_Y, twoMathPi } from '../constants';\nimport { SHARED_ATTRIBUTES } from '../parser/attributes';\nimport { parseAttributes } from '../parser/parseAttributes';\nimport type { Abortable, TClassProperties, TOptions } from '../typedefs';\nimport { classRegistry } from '../ClassRegistry';\nimport { FabricObject, cacheProperties } from './Object/FabricObject';\nimport type { FabricObjectProps, SerializedObjectProps } from './Object/types';\nimport type { ObjectEvents } from '../EventTypeDefs';\nimport type { CSSRules } from '../parser/typedefs';\n\nexport const ellipseDefaultValues: Partial> = {\n rx: 0,\n ry: 0,\n};\n\ninterface UniqueEllipseProps {\n rx: number;\n ry: number;\n}\n\nexport interface SerializedEllipseProps\n extends SerializedObjectProps,\n UniqueEllipseProps {}\n\nexport interface EllipseProps extends FabricObjectProps, UniqueEllipseProps {}\n\nconst ELLIPSE_PROPS = ['rx', 'ry'] as const;\n\nexport class Ellipse<\n Props extends TOptions = Partial,\n SProps extends SerializedEllipseProps = SerializedEllipseProps,\n EventSpec extends ObjectEvents = ObjectEvents,\n >\n extends FabricObject\n implements EllipseProps\n{\n /**\n * Horizontal radius\n * @type Number\n */\n declare rx: number;\n\n /**\n * Vertical radius\n * @type Number\n */\n declare ry: number;\n\n static type = 'Ellipse';\n\n static cacheProperties = [...cacheProperties, ...ELLIPSE_PROPS];\n\n static ownDefaults = ellipseDefaultValues;\n\n static getDefaults(): Record {\n return {\n ...super.getDefaults(),\n ...Ellipse.ownDefaults,\n };\n }\n\n /**\n * Constructor\n * @param {Object} [options] Options object\n */\n constructor(options?: Props) {\n super();\n Object.assign(this, Ellipse.ownDefaults);\n this.setOptions(options);\n }\n\n /**\n * @private\n * @param {String} key\n * @param {*} value\n * @return {Ellipse} thisArg\n */\n _set(key: string, value: any) {\n super._set(key, value);\n switch (key) {\n case 'rx':\n this.rx = value;\n this.set('width', value * 2);\n break;\n\n case 'ry':\n this.ry = value;\n this.set('height', value * 2);\n break;\n }\n return this;\n }\n\n /**\n * Returns horizontal radius of an object (according to how an object is scaled)\n * @return {Number}\n */\n getRx() {\n return this.get('rx') * this.get(SCALE_X);\n }\n\n /**\n * Returns Vertical radius of an object (according to how an object is scaled)\n * @return {Number}\n */\n getRy() {\n return this.get('ry') * this.get(SCALE_Y);\n }\n\n /**\n * Returns object representation of an instance\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} object representation of an instance\n */\n toObject<\n T extends Omit, keyof SProps>,\n K extends keyof T = never,\n >(propertiesToInclude: K[] = []): Pick & SProps {\n return super.toObject([...ELLIPSE_PROPS, ...propertiesToInclude]);\n }\n\n /**\n * Returns svg representation of an instance\n * @return {Array} an array of strings with the specific svg representation\n * of the instance\n */\n _toSVG(): string[] {\n return [\n '\\n`,\n ];\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx context to render on\n */\n _render(ctx: CanvasRenderingContext2D) {\n ctx.beginPath();\n ctx.save();\n ctx.transform(1, 0, 0, this.ry / this.rx, 0, 0);\n ctx.arc(0, 0, this.rx, 0, twoMathPi, false);\n ctx.restore();\n this._renderPaintInOrder(ctx);\n }\n\n /* _FROM_SVG_START_ */\n\n /**\n * List of attribute names to account for when parsing SVG element (used by {@link Ellipse.fromElement})\n * @see http://www.w3.org/TR/SVG/shapes.html#EllipseElement\n */\n static ATTRIBUTE_NAMES = [...SHARED_ATTRIBUTES, 'cx', 'cy', 'rx', 'ry'];\n\n /**\n * Returns {@link Ellipse} instance from an SVG element\n * @param {HTMLElement} element Element to parse\n * @return {Ellipse}\n */\n static async fromElement(\n element: HTMLElement,\n options?: Abortable,\n cssRules?: CSSRules,\n ) {\n const parsedAttributes = parseAttributes(\n element,\n this.ATTRIBUTE_NAMES,\n cssRules,\n );\n\n parsedAttributes.left = (parsedAttributes.left || 0) - parsedAttributes.rx;\n parsedAttributes.top = (parsedAttributes.top || 0) - parsedAttributes.ry;\n return new this(parsedAttributes);\n }\n\n /* _FROM_SVG_END_ */\n}\n\nclassRegistry.setClass(Ellipse);\nclassRegistry.setSVGClass(Ellipse);\n","import { config } from '../config';\nimport { SHARED_ATTRIBUTES } from '../parser/attributes';\nimport { parseAttributes } from '../parser/parseAttributes';\nimport { parsePointsAttribute } from '../parser/parsePointsAttribute';\nimport type { XY } from '../Point';\nimport { Point } from '../Point';\nimport type { Abortable, TClassProperties, TOptions } from '../typedefs';\nimport { classRegistry } from '../ClassRegistry';\nimport { makeBoundingBoxFromPoints } from '../util/misc/boundingBoxFromPoints';\nimport { calcDimensionsMatrix, transformPoint } from '../util/misc/matrix';\nimport { projectStrokeOnPoints } from '../util/misc/projectStroke';\nimport type { TProjectStrokeOnPointsOptions } from '../util/misc/projectStroke/types';\nimport { degreesToRadians } from '../util/misc/radiansDegreesConversion';\nimport { toFixed } from '../util/misc/toFixed';\nimport { FabricObject, cacheProperties } from './Object/FabricObject';\nimport type { FabricObjectProps, SerializedObjectProps } from './Object/types';\nimport type { ObjectEvents } from '../EventTypeDefs';\nimport {\n CENTER,\n LEFT,\n SCALE_X,\n SCALE_Y,\n SKEW_X,\n SKEW_Y,\n TOP,\n} from '../constants';\nimport type { CSSRules } from '../parser/typedefs';\n\nexport const polylineDefaultValues: Partial> = {\n /**\n * @deprecated transient option soon to be removed in favor of a different design\n */\n exactBoundingBox: false,\n};\n\nexport interface SerializedPolylineProps extends SerializedObjectProps {\n points: XY[];\n}\n\nexport class Polyline<\n Props extends TOptions = Partial,\n SProps extends SerializedPolylineProps = SerializedPolylineProps,\n EventSpec extends ObjectEvents = ObjectEvents,\n> extends FabricObject {\n /**\n * Points array\n * @type Array\n */\n declare points: XY[];\n\n /**\n * WARNING: Feature in progress\n * Calculate the exact bounding box taking in account strokeWidth on acute angles\n * this will be turned to true by default on fabric 6.0\n * maybe will be left in as an optimization since calculations may be slow\n * @deprecated transient option soon to be removed in favor of a different design\n * @type Boolean\n * @default false\n */\n declare exactBoundingBox: boolean;\n\n declare private initialized: true | undefined;\n\n static ownDefaults = polylineDefaultValues;\n\n static type = 'Polyline';\n\n static getDefaults(): Record {\n return {\n ...super.getDefaults(),\n ...Polyline.ownDefaults,\n };\n }\n\n /**\n * A list of properties that if changed trigger a recalculation of dimensions\n * @todo check if you really need to recalculate for all cases\n */\n static layoutProperties: (keyof Polyline)[] = [\n SKEW_X,\n SKEW_Y,\n 'strokeLineCap',\n 'strokeLineJoin',\n 'strokeMiterLimit',\n 'strokeWidth',\n 'strokeUniform',\n 'points',\n ];\n\n declare pathOffset: Point;\n\n declare strokeOffset: Point;\n\n static cacheProperties = [...cacheProperties, 'points'];\n\n strokeDiff: Point;\n\n /**\n * Constructor\n * @param {Array} points Array of points (where each point is an object with x and y)\n * @param {Object} [options] Options object\n * @return {Polyline} thisArg\n * @example\n * var poly = new Polyline([\n * { x: 10, y: 10 },\n * { x: 50, y: 30 },\n * { x: 40, y: 70 },\n * { x: 60, y: 50 },\n * { x: 100, y: 150 },\n * { x: 40, y: 100 }\n * ], {\n * stroke: 'red',\n * left: 100,\n * top: 100\n * });\n */\n constructor(points: XY[] = [], options: Props = {} as Props) {\n super();\n Object.assign(this, Polyline.ownDefaults);\n this.setOptions(options);\n this.points = points;\n const { left, top } = options;\n this.initialized = true;\n this.setBoundingBox(true);\n typeof left === 'number' && this.set(LEFT, left);\n typeof top === 'number' && this.set(TOP, top);\n }\n\n protected isOpen() {\n return true;\n }\n\n private _projectStrokeOnPoints(options: TProjectStrokeOnPointsOptions) {\n return projectStrokeOnPoints(this.points, options, this.isOpen());\n }\n\n /**\n * Calculate the polygon bounding box\n * @private\n */\n _calcDimensions(options?: Partial) {\n options = {\n scaleX: this.scaleX,\n scaleY: this.scaleY,\n skewX: this.skewX,\n skewY: this.skewY,\n strokeLineCap: this.strokeLineCap,\n strokeLineJoin: this.strokeLineJoin,\n strokeMiterLimit: this.strokeMiterLimit,\n strokeUniform: this.strokeUniform,\n strokeWidth: this.strokeWidth,\n ...(options || {}),\n };\n const points = this.exactBoundingBox\n ? this._projectStrokeOnPoints(\n options as TProjectStrokeOnPointsOptions,\n ).map((projection) => projection.projectedPoint)\n : this.points;\n if (points.length === 0) {\n return {\n left: 0,\n top: 0,\n width: 0,\n height: 0,\n pathOffset: new Point(),\n strokeOffset: new Point(),\n strokeDiff: new Point(),\n };\n }\n const bbox = makeBoundingBoxFromPoints(points),\n // Remove scale effect, since it's applied after\n matrix = calcDimensionsMatrix({ ...options, scaleX: 1, scaleY: 1 }),\n bboxNoStroke = makeBoundingBoxFromPoints(\n this.points.map((p) => transformPoint(p, matrix, true)),\n ),\n scale = new Point(this.scaleX, this.scaleY);\n let offsetX = bbox.left + bbox.width / 2,\n offsetY = bbox.top + bbox.height / 2;\n if (this.exactBoundingBox) {\n offsetX = offsetX - offsetY * Math.tan(degreesToRadians(this.skewX));\n // Order of those assignments is important.\n // offsetY relies on offsetX being already changed by the line above\n offsetY = offsetY - offsetX * Math.tan(degreesToRadians(this.skewY));\n }\n\n return {\n ...bbox,\n pathOffset: new Point(offsetX, offsetY),\n strokeOffset: new Point(bboxNoStroke.left, bboxNoStroke.top)\n .subtract(new Point(bbox.left, bbox.top))\n .multiply(scale),\n strokeDiff: new Point(bbox.width, bbox.height)\n .subtract(new Point(bboxNoStroke.width, bboxNoStroke.height))\n .multiply(scale),\n };\n }\n\n /**\n * This function is an helper for svg import. it returns the center of the object in the svg\n * untransformed coordinates, by look at the polyline/polygon points.\n * @private\n * @return {Point} center point from element coordinates\n */\n _findCenterFromElement(): Point {\n const bbox = makeBoundingBoxFromPoints(this.points);\n return new Point(bbox.left + bbox.width / 2, bbox.top + bbox.height / 2);\n }\n\n setDimensions() {\n this.setBoundingBox();\n }\n\n setBoundingBox(adjustPosition?: boolean) {\n const { left, top, width, height, pathOffset, strokeOffset, strokeDiff } =\n this._calcDimensions();\n this.set({ width, height, pathOffset, strokeOffset, strokeDiff });\n adjustPosition &&\n this.setPositionByOrigin(\n new Point(left + width / 2, top + height / 2),\n CENTER,\n CENTER,\n );\n }\n\n /**\n * @deprecated intermidiate method to be removed, do not use\n */\n protected isStrokeAccountedForInDimensions() {\n return this.exactBoundingBox;\n }\n\n /**\n * @override stroke is taken in account in size\n */\n _getNonTransformedDimensions() {\n return this.exactBoundingBox\n ? // TODO: fix this\n new Point(this.width, this.height)\n : super._getNonTransformedDimensions();\n }\n\n /**\n * @override stroke and skewing are taken into account when projecting stroke on points,\n * therefore we don't want the default calculation to account for skewing as well.\n * Though it is possible to pass `width` and `height` in `options`, doing so is very strange, use with discretion.\n *\n * @private\n */\n _getTransformedDimensions(options: any = {}) {\n if (this.exactBoundingBox) {\n let size: Point;\n /* When `strokeUniform = true`, any changes to the properties require recalculating the `width` and `height` because\n the stroke projections are affected.\n When `strokeUniform = false`, we don't need to recalculate for scale transformations, as the effect of scale on\n projections follows a linear function (e.g. scaleX of 2 just multiply width by 2)*/\n if (\n Object.keys(options).some(\n (key) =>\n this.strokeUniform ||\n (this.constructor as typeof Polyline).layoutProperties.includes(\n key as keyof TProjectStrokeOnPointsOptions,\n ),\n )\n ) {\n const { width, height } = this._calcDimensions(options);\n size = new Point(options.width ?? width, options.height ?? height);\n } else {\n size = new Point(\n options.width ?? this.width,\n options.height ?? this.height,\n );\n }\n return size.multiply(\n new Point(options.scaleX || this.scaleX, options.scaleY || this.scaleY),\n );\n } else {\n return super._getTransformedDimensions(options);\n }\n }\n\n /**\n * Recalculates dimensions when changing skew and scale\n * @private\n */\n _set(key: string, value: any) {\n const changed = this.initialized && this[key as keyof this] !== value;\n const output = super._set(key, value);\n if (\n this.exactBoundingBox &&\n changed &&\n (((key === SCALE_X || key === SCALE_Y) &&\n this.strokeUniform &&\n (this.constructor as typeof Polyline).layoutProperties.includes(\n 'strokeUniform',\n )) ||\n (this.constructor as typeof Polyline).layoutProperties.includes(\n key as keyof Polyline,\n ))\n ) {\n this.setDimensions();\n }\n return output;\n }\n\n /**\n * Returns object representation of an instance\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} Object representation of an instance\n */\n toObject<\n T extends Omit, keyof SProps>,\n K extends keyof T = never,\n >(propertiesToInclude: K[] = []): Pick & SProps {\n return {\n ...super.toObject(propertiesToInclude),\n points: this.points.map(({ x, y }) => ({ x, y })),\n };\n }\n\n /**\n * Returns svg representation of an instance\n * @return {Array} an array of strings with the specific svg representation\n * of the instance\n */\n _toSVG() {\n const points = [],\n diffX = this.pathOffset.x,\n diffY = this.pathOffset.y,\n NUM_FRACTION_DIGITS = config.NUM_FRACTION_DIGITS;\n\n for (let i = 0, len = this.points.length; i < len; i++) {\n points.push(\n toFixed(this.points[i].x - diffX, NUM_FRACTION_DIGITS),\n ',',\n toFixed(this.points[i].y - diffY, NUM_FRACTION_DIGITS),\n ' ',\n );\n }\n return [\n `<${\n (this.constructor as typeof Polyline).type.toLowerCase() as\n | 'polyline'\n | 'polygon'\n } `,\n 'COMMON_PARTS',\n `points=\"${points.join('')}\" />\\n`,\n ];\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _render(ctx: CanvasRenderingContext2D) {\n const len = this.points.length,\n x = this.pathOffset.x,\n y = this.pathOffset.y;\n\n if (!len || isNaN(this.points[len - 1].y)) {\n // do not draw if no points or odd points\n // NaN comes from parseFloat of a empty string in parser\n return;\n }\n ctx.beginPath();\n ctx.moveTo(this.points[0].x - x, this.points[0].y - y);\n for (let i = 0; i < len; i++) {\n const point = this.points[i];\n ctx.lineTo(point.x - x, point.y - y);\n }\n !this.isOpen() && ctx.closePath();\n this._renderPaintInOrder(ctx);\n }\n\n /**\n * Returns complexity of an instance\n * @return {Number} complexity of this instance\n */\n complexity(): number {\n return this.points.length;\n }\n\n /* _FROM_SVG_START_ */\n\n /**\n * List of attribute names to account for when parsing SVG element (used by {@link Polyline.fromElement})\n * @see: http://www.w3.org/TR/SVG/shapes.html#PolylineElement\n */\n static ATTRIBUTE_NAMES = [...SHARED_ATTRIBUTES];\n\n /**\n * Returns Polyline instance from an SVG element\n * @param {HTMLElement} element Element to parser\n * @param {Object} [options] Options object\n */\n static async fromElement(\n element: HTMLElement | SVGElement,\n options?: Abortable,\n cssRules?: CSSRules,\n ) {\n const points = parsePointsAttribute(element.getAttribute('points')),\n // we omit left and top to instruct the constructor to position the object using the bbox\n\n { left, top, ...parsedAttributes } = parseAttributes(\n element,\n this.ATTRIBUTE_NAMES,\n cssRules,\n );\n return new this(points, {\n ...parsedAttributes,\n ...options,\n });\n }\n\n /* _FROM_SVG_END_ */\n\n /**\n * Returns Polyline instance from an object representation\n * @param {Object} object Object to create an instance from\n * @returns {Promise}\n */\n static fromObject>(object: T) {\n return this._fromObject(object, {\n extraParam: 'points',\n });\n }\n}\n\nclassRegistry.setClass(Polyline);\nclassRegistry.setSVGClass(Polyline);\n","import type { XY } from '../Point';\n\n/**\n * Parses \"points\" attribute, returning an array of values\n * @static\n * @param {String} points points attribute string\n * @return {Array} array of points\n */\nexport function parsePointsAttribute(points: string | null): XY[] {\n // points attribute is required and must not be empty\n if (!points) {\n return [];\n }\n\n // replace commas with whitespace and remove bookending whitespace\n const pointsSplit: string[] = points.replace(/,/g, ' ').trim().split(/\\s+/);\n\n const parsedPoints = [];\n\n for (let i = 0; i < pointsSplit.length; i += 2) {\n parsedPoints.push({\n x: parseFloat(pointsSplit[i]),\n y: parseFloat(pointsSplit[i + 1]),\n });\n }\n\n // odd number of points is an error\n // if (parsedPoints.length % 2 !== 0) {\n // return null;\n // }\n return parsedPoints;\n}\n","import { classRegistry } from '../ClassRegistry';\nimport { Polyline, polylineDefaultValues } from './Polyline';\n\nexport class Polygon extends Polyline {\n static ownDefaults = polylineDefaultValues;\n\n static type = 'Polygon';\n\n protected isOpen() {\n return false;\n }\n}\n\nclassRegistry.setClass(Polygon);\nclassRegistry.setSVGClass(Polygon);\n","import type { ObjectEvents } from '../../EventTypeDefs';\nimport type { FabricObjectProps, SerializedObjectProps } from '../Object/types';\nimport type { TOptions } from '../../typedefs';\nimport { FabricObject } from '../Object/FabricObject';\nimport { styleProperties } from './constants';\nimport type { StylePropertiesType } from './constants';\nimport type { FabricText } from './Text';\nimport { pick } from '../../util';\nimport { pickBy } from '../../util/misc/pick';\n\nexport type CompleteTextStyleDeclaration = Pick<\n FabricText,\n StylePropertiesType\n>;\n\nexport type TextStyleDeclaration = Partial;\n\nexport type TextStyle = {\n [line: number | string]: { [char: number | string]: TextStyleDeclaration };\n};\n\nexport abstract class StyledText<\n Props extends TOptions = Partial,\n SProps extends SerializedObjectProps = SerializedObjectProps,\n EventSpec extends ObjectEvents = ObjectEvents,\n> extends FabricObject {\n declare abstract styles: TextStyle;\n declare protected abstract _textLines: string[][];\n declare protected _forceClearCache: boolean;\n static _styleProperties: Readonly = styleProperties;\n abstract get2DCursorLocation(\n selectionStart: number,\n skipWrapping?: boolean,\n ): { charIndex: number; lineIndex: number };\n\n /**\n * Returns true if object has no styling or no styling in a line\n * @param {Number} lineIndex , lineIndex is on wrapped lines.\n * @return {Boolean}\n */\n isEmptyStyles(lineIndex?: number): boolean {\n if (!this.styles) {\n return true;\n }\n if (typeof lineIndex !== 'undefined' && !this.styles[lineIndex]) {\n return true;\n }\n const obj =\n typeof lineIndex === 'undefined'\n ? this.styles\n : { line: this.styles[lineIndex] };\n for (const p1 in obj) {\n for (const p2 in obj[p1]) {\n // eslint-disable-next-line no-unused-vars\n for (const p3 in obj[p1][p2]) {\n return false;\n }\n }\n }\n return true;\n }\n\n /**\n * Returns true if object has a style property or has it ina specified line\n * This function is used to detect if a text will use a particular property or not.\n * @param {String} property to check for\n * @param {Number} lineIndex to check the style on\n * @return {Boolean}\n */\n styleHas(property: keyof TextStyleDeclaration, lineIndex?: number): boolean {\n if (!this.styles) {\n return false;\n }\n if (typeof lineIndex !== 'undefined' && !this.styles[lineIndex]) {\n return false;\n }\n const obj =\n typeof lineIndex === 'undefined'\n ? this.styles\n : { 0: this.styles[lineIndex] };\n // eslint-disable-next-line\n for (const p1 in obj) {\n // eslint-disable-next-line\n for (const p2 in obj[p1]) {\n if (typeof obj[p1][p2][property] !== 'undefined') {\n return true;\n }\n }\n }\n return false;\n }\n\n /**\n * Check if characters in a text have a value for a property\n * whose value matches the textbox's value for that property. If so,\n * the character-level property is deleted. If the character\n * has no other properties, then it is also deleted. Finally,\n * if the line containing that character has no other characters\n * then it also is deleted.\n */\n cleanStyle(property: keyof TextStyleDeclaration) {\n if (!this.styles) {\n return false;\n }\n const obj = this.styles;\n let stylesCount = 0,\n letterCount,\n stylePropertyValue,\n allStyleObjectPropertiesMatch = true,\n graphemeCount = 0;\n for (const p1 in obj) {\n letterCount = 0;\n for (const p2 in obj[p1]) {\n const styleObject = obj[p1][p2] || {},\n stylePropertyHasBeenSet = styleObject[property] !== undefined;\n\n stylesCount++;\n\n if (stylePropertyHasBeenSet) {\n if (!stylePropertyValue) {\n stylePropertyValue = styleObject[property];\n } else if (styleObject[property] !== stylePropertyValue) {\n allStyleObjectPropertiesMatch = false;\n }\n\n if (styleObject[property] === this[property as keyof this]) {\n delete styleObject[property];\n }\n } else {\n allStyleObjectPropertiesMatch = false;\n }\n\n if (Object.keys(styleObject).length !== 0) {\n letterCount++;\n } else {\n delete obj[p1][p2];\n }\n }\n\n if (letterCount === 0) {\n delete obj[p1];\n }\n }\n // if every grapheme has the same style set then\n // delete those styles and set it on the parent\n for (let i = 0; i < this._textLines.length; i++) {\n graphemeCount += this._textLines[i].length;\n }\n if (allStyleObjectPropertiesMatch && stylesCount === graphemeCount) {\n this[property as keyof this] = stylePropertyValue as any;\n this.removeStyle(property);\n }\n }\n\n /**\n * Remove a style property or properties from all individual character styles\n * in a text object. Deletes the character style object if it contains no other style\n * props. Deletes a line style object if it contains no other character styles.\n *\n * @param {String} props The property to remove from character styles.\n */\n removeStyle(property: keyof TextStyleDeclaration) {\n if (!this.styles) {\n return;\n }\n const obj = this.styles;\n let line, lineNum, charNum;\n for (lineNum in obj) {\n line = obj[lineNum];\n for (charNum in line) {\n delete line[charNum][property];\n if (Object.keys(line[charNum]).length === 0) {\n delete line[charNum];\n }\n }\n if (Object.keys(line).length === 0) {\n delete obj[lineNum];\n }\n }\n }\n\n private _extendStyles(index: number, style: TextStyleDeclaration): void {\n const { lineIndex, charIndex } = this.get2DCursorLocation(index);\n\n if (!this._getLineStyle(lineIndex)) {\n this._setLineStyle(lineIndex);\n }\n\n const newStyle = pickBy(\n {\n // first create a new object that is a merge of existing and new\n ...this._getStyleDeclaration(lineIndex, charIndex),\n ...style,\n // use the predicate to discard undefined values\n },\n (value) => value !== undefined,\n );\n\n // finally assign to the old position the new style\n this._setStyleDeclaration(lineIndex, charIndex, newStyle);\n }\n\n /**\n * Gets style of a current selection/cursor (at the start position)\n * @param {Number} startIndex Start index to get styles at\n * @param {Number} endIndex End index to get styles at, if not specified startIndex + 1\n * @param {Boolean} [complete] get full style or not\n * @return {Array} styles an array with one, zero or more Style objects\n */\n getSelectionStyles(\n startIndex: number,\n endIndex?: number,\n complete?: boolean,\n ): TextStyleDeclaration[] {\n const styles: TextStyleDeclaration[] = [];\n for (let i = startIndex; i < (endIndex || startIndex); i++) {\n styles.push(this.getStyleAtPosition(i, complete));\n }\n return styles;\n }\n\n /**\n * Gets style of a current selection/cursor position\n * @param {Number} position to get styles at\n * @param {Boolean} [complete] full style if true\n * @return {Object} style Style object at a specified index\n * @private\n */\n getStyleAtPosition(position: number, complete?: boolean) {\n const { lineIndex, charIndex } = this.get2DCursorLocation(position);\n return complete\n ? this.getCompleteStyleDeclaration(lineIndex, charIndex)\n : this._getStyleDeclaration(lineIndex, charIndex);\n }\n\n /**\n * Sets style of a current selection, if no selection exist, do not set anything.\n * @param {Object} styles Styles object\n * @param {Number} startIndex Start index to get styles at\n * @param {Number} [endIndex] End index to get styles at, if not specified startIndex + 1\n */\n setSelectionStyles(styles: object, startIndex: number, endIndex?: number) {\n for (let i = startIndex; i < (endIndex || startIndex); i++) {\n this._extendStyles(i, styles);\n }\n /* not included in _extendStyles to avoid clearing cache more than once */\n this._forceClearCache = true;\n }\n\n /**\n * Get a reference, not a clone, to the style object for a given character,\n * if no style is set for a line or char, return a new empty object.\n * This is tricky and confusing because when you get an empty object you can't\n * determine if it is a reference or a new one.\n * @TODO this should always return a reference or always a clone or undefined when necessary.\n * @protected\n * @param {Number} lineIndex\n * @param {Number} charIndex\n * @return {TextStyleDeclaration} a style object reference to the existing one or a new empty object when undefined\n */\n _getStyleDeclaration(\n lineIndex: number,\n charIndex: number,\n ): TextStyleDeclaration {\n const lineStyle = this.styles && this.styles[lineIndex];\n return lineStyle ? (lineStyle[charIndex] ?? {}) : {};\n }\n\n /**\n * return a new object that contains all the style property for a character\n * the object returned is newly created\n * @param {Number} lineIndex of the line where the character is\n * @param {Number} charIndex position of the character on the line\n * @return {Object} style object\n */\n getCompleteStyleDeclaration(\n lineIndex: number,\n charIndex: number,\n ): CompleteTextStyleDeclaration {\n return {\n ...pick(\n this,\n (this.constructor as typeof StyledText)\n ._styleProperties as (keyof this)[],\n ),\n ...this._getStyleDeclaration(lineIndex, charIndex),\n } as CompleteTextStyleDeclaration;\n }\n\n /**\n * @param {Number} lineIndex\n * @param {Number} charIndex\n * @param {Object} style\n * @private\n */\n protected _setStyleDeclaration(\n lineIndex: number,\n charIndex: number,\n style: object,\n ) {\n this.styles[lineIndex][charIndex] = style;\n }\n\n /**\n *\n * @param {Number} lineIndex\n * @param {Number} charIndex\n * @private\n */\n protected _deleteStyleDeclaration(lineIndex: number, charIndex: number) {\n delete this.styles[lineIndex][charIndex];\n }\n\n /**\n * @param {Number} lineIndex\n * @return {Boolean} if the line exists or not\n * @private\n */\n protected _getLineStyle(lineIndex: number): boolean {\n return !!this.styles[lineIndex];\n }\n\n /**\n * Set the line style to an empty object so that is initialized\n * @param {Number} lineIndex\n * @private\n */\n protected _setLineStyle(lineIndex: number) {\n this.styles[lineIndex] = {};\n }\n\n protected _deleteLineStyle(lineIndex: number) {\n delete this.styles[lineIndex];\n }\n}\n","import { config } from '../../config';\nimport type { TSVGReviver } from '../../typedefs';\nimport { escapeXml } from '../../util/lang_string';\nimport { colorPropToSVG, createSVGRect } from '../../util/misc/svgParsing';\nimport { hasStyleChanged } from '../../util/misc/textStyles';\nimport { toFixed } from '../../util/misc/toFixed';\nimport { FabricObjectSVGExportMixin } from '../Object/FabricObjectSVGExportMixin';\nimport { type TextStyleDeclaration } from './StyledText';\nimport { JUSTIFY } from '../Text/constants';\nimport type { FabricText, GraphemeBBox } from './Text';\nimport { STROKE, FILL } from '../../constants';\nimport { createRotateMatrix } from '../../util/misc/matrix';\nimport { radiansToDegrees } from '../../util/misc/radiansDegreesConversion';\nimport { Point } from '../../Point';\nimport { matrixToSVG } from '../../util/misc/svgExport';\n\nconst multipleSpacesRegex = / +/g;\nconst dblQuoteRegex = /\"/g;\n\nfunction createSVGInlineRect(\n color: string,\n left: number,\n top: number,\n width: number,\n height: number,\n) {\n return `\\t\\t${createSVGRect(color, { left, top, width, height })}\\n`;\n}\n\nexport class TextSVGExportMixin extends FabricObjectSVGExportMixin {\n _toSVG(this: TextSVGExportMixin & FabricText): string[] {\n const offsets = this._getSVGLeftTopOffsets(),\n textAndBg = this._getSVGTextAndBg(offsets.textTop, offsets.textLeft);\n return this._wrapSVGTextAndBg(textAndBg);\n }\n\n toSVG(this: TextSVGExportMixin & FabricText, reviver?: TSVGReviver): string {\n const textSvg = this._createBaseSVGMarkup(this._toSVG(), {\n reviver,\n noStyle: true,\n withShadow: true,\n }),\n path = this.path;\n if (path) {\n return (\n textSvg +\n path._createBaseSVGMarkup(path._toSVG(), {\n reviver,\n withShadow: true,\n additionalTransform: matrixToSVG(this.calcOwnMatrix()),\n })\n );\n }\n return textSvg;\n }\n\n private _getSVGLeftTopOffsets(this: TextSVGExportMixin & FabricText) {\n return {\n textLeft: -this.width / 2,\n textTop: -this.height / 2,\n lineTop: this.getHeightOfLine(0),\n };\n }\n\n private _wrapSVGTextAndBg(\n this: TextSVGExportMixin & FabricText,\n {\n textBgRects,\n textSpans,\n }: {\n textSpans: string[];\n textBgRects: string[];\n },\n ) {\n const noShadow = true,\n textDecoration = this.getSvgTextDecoration(this);\n return [\n textBgRects.join(''),\n '\\t\\t',\n textSpans.join(''),\n '\\n',\n ];\n }\n\n /**\n * @private\n * @param {Number} textTopOffset Text top offset\n * @param {Number} textLeftOffset Text left offset\n * @return {Object}\n */\n private _getSVGTextAndBg(\n this: TextSVGExportMixin & FabricText,\n textTopOffset: number,\n textLeftOffset: number,\n ) {\n const textSpans: string[] = [],\n textBgRects: string[] = [];\n let height = textTopOffset,\n lineOffset;\n\n // bounding-box background\n this.backgroundColor &&\n textBgRects.push(\n ...createSVGInlineRect(\n this.backgroundColor,\n -this.width / 2,\n -this.height / 2,\n this.width,\n this.height,\n ),\n );\n\n // text and text-background\n for (let i = 0, len = this._textLines.length; i < len; i++) {\n lineOffset = this._getLineLeftOffset(i);\n if (this.direction === 'rtl') {\n lineOffset += this.width;\n }\n if (this.textBackgroundColor || this.styleHas('textBackgroundColor', i)) {\n this._setSVGTextLineBg(\n textBgRects,\n i,\n textLeftOffset + lineOffset,\n height,\n );\n }\n this._setSVGTextLineText(\n textSpans,\n i,\n textLeftOffset + lineOffset,\n height,\n );\n height += this.getHeightOfLine(i);\n }\n\n return {\n textSpans,\n textBgRects,\n };\n }\n\n private _createTextCharSpan(\n this: TextSVGExportMixin & FabricText,\n char: string,\n styleDecl: TextStyleDeclaration,\n left: number,\n top: number,\n charBox: GraphemeBBox,\n ) {\n const numFractionDigit = config.NUM_FRACTION_DIGITS;\n const styleProps = this.getSvgSpanStyles(\n styleDecl,\n char !== char.trim() || !!char.match(multipleSpacesRegex),\n ),\n fillStyles = styleProps ? `style=\"${styleProps}\"` : '',\n dy = styleDecl.deltaY,\n dySpan = dy ? ` dy=\"${toFixed(dy, numFractionDigit)}\" ` : '',\n { angle, renderLeft, renderTop, width } = charBox;\n let angleAttr = '';\n if (renderLeft !== undefined) {\n const wBy2 = width / 2;\n angle &&\n (angleAttr = ` rotate=\"${toFixed(radiansToDegrees(angle), numFractionDigit)}\"`);\n const m = createRotateMatrix({ angle: radiansToDegrees(angle!) });\n m[4] = renderLeft!;\n m[5] = renderTop!;\n const renderPoint = new Point(-wBy2, 0).transform(m);\n left = renderPoint.x;\n top = renderPoint.y;\n }\n\n return `${escapeXml(char)}`;\n }\n\n private _setSVGTextLineText(\n this: TextSVGExportMixin & FabricText,\n textSpans: string[],\n lineIndex: number,\n textLeftOffset: number,\n textTopOffset: number,\n ) {\n const lineHeight = this.getHeightOfLine(lineIndex),\n isJustify = this.textAlign.includes(JUSTIFY),\n line = this._textLines[lineIndex];\n let actualStyle,\n nextStyle,\n charsToRender = '',\n charBox,\n style,\n boxWidth = 0,\n timeToRender;\n\n textTopOffset +=\n (lineHeight * (1 - this._fontSizeFraction)) / this.lineHeight;\n for (let i = 0, len = line.length - 1; i <= len; i++) {\n timeToRender = i === len || this.charSpacing || this.path;\n charsToRender += line[i];\n charBox = this.__charBounds[lineIndex][i];\n if (boxWidth === 0) {\n textLeftOffset += charBox.kernedWidth - charBox.width;\n boxWidth += charBox.width;\n } else {\n boxWidth += charBox.kernedWidth;\n }\n if (isJustify && !timeToRender) {\n if (this._reSpaceAndTab.test(line[i])) {\n timeToRender = true;\n }\n }\n if (!timeToRender) {\n // if we have charSpacing or a path, we render char by char\n actualStyle =\n actualStyle || this.getCompleteStyleDeclaration(lineIndex, i);\n nextStyle = this.getCompleteStyleDeclaration(lineIndex, i + 1);\n timeToRender = hasStyleChanged(actualStyle, nextStyle, true);\n }\n if (timeToRender) {\n style = this._getStyleDeclaration(lineIndex, i);\n textSpans.push(\n this._createTextCharSpan(\n charsToRender,\n style,\n textLeftOffset,\n textTopOffset,\n charBox,\n ),\n );\n charsToRender = '';\n actualStyle = nextStyle;\n if (this.direction === 'rtl') {\n textLeftOffset -= boxWidth;\n } else {\n textLeftOffset += boxWidth;\n }\n boxWidth = 0;\n }\n }\n }\n\n private _setSVGTextLineBg(\n this: TextSVGExportMixin & FabricText,\n textBgRects: (string | number)[],\n i: number,\n leftOffset: number,\n textTopOffset: number,\n ) {\n const line = this._textLines[i],\n heightOfLine = this.getHeightOfLine(i) / this.lineHeight;\n let boxWidth = 0,\n boxStart = 0,\n currentColor,\n lastColor = this.getValueOfPropertyAt(i, 0, 'textBackgroundColor');\n for (let j = 0; j < line.length; j++) {\n const { left, width, kernedWidth } = this.__charBounds[i][j];\n currentColor = this.getValueOfPropertyAt(i, j, 'textBackgroundColor');\n if (currentColor !== lastColor) {\n lastColor &&\n textBgRects.push(\n ...createSVGInlineRect(\n lastColor,\n leftOffset + boxStart,\n textTopOffset,\n boxWidth,\n heightOfLine,\n ),\n );\n boxStart = left;\n boxWidth = width;\n lastColor = currentColor;\n } else {\n boxWidth += kernedWidth;\n }\n }\n currentColor &&\n textBgRects.push(\n ...createSVGInlineRect(\n lastColor,\n leftOffset + boxStart,\n textTopOffset,\n boxWidth,\n heightOfLine,\n ),\n );\n }\n\n /**\n * Returns styles-string for svg-export\n * @param {Boolean} skipShadow a boolean to skip shadow filter output\n * @return {String}\n */\n getSvgStyles(this: TextSVGExportMixin & FabricText, skipShadow?: boolean) {\n return `${super.getSvgStyles(skipShadow)} text-decoration-thickness: ${toFixed((this.textDecorationThickness * this.getObjectScaling().y) / 10, config.NUM_FRACTION_DIGITS)}%; white-space: pre;`;\n }\n\n /**\n * Returns styles-string for svg-export\n * @param {Object} style the object from which to retrieve style properties\n * @param {Boolean} useWhiteSpace a boolean to include an additional attribute in the style.\n * @return {String}\n */\n getSvgSpanStyles(\n this: TextSVGExportMixin & FabricText,\n style: TextStyleDeclaration,\n useWhiteSpace?: boolean,\n ) {\n const {\n fontFamily,\n strokeWidth,\n stroke,\n fill,\n fontSize,\n fontStyle,\n fontWeight,\n deltaY,\n textDecorationThickness,\n linethrough,\n overline,\n underline,\n } = style;\n\n const textDecoration = this.getSvgTextDecoration({\n underline: underline ?? this.underline,\n overline: overline ?? this.overline,\n linethrough: linethrough ?? this.linethrough,\n });\n const thickness = textDecorationThickness || this.textDecorationThickness;\n return [\n stroke ? colorPropToSVG(STROKE, stroke) : '',\n strokeWidth ? `stroke-width: ${strokeWidth}; ` : '',\n fontFamily\n ? `font-family: ${\n !fontFamily.includes(\"'\") && !fontFamily.includes('\"')\n ? `'${fontFamily}'`\n : fontFamily\n }; `\n : '',\n fontSize ? `font-size: ${fontSize}px; ` : '',\n fontStyle ? `font-style: ${fontStyle}; ` : '',\n fontWeight ? `font-weight: ${fontWeight}; ` : '',\n textDecoration\n ? `text-decoration: ${textDecoration}; text-decoration-thickness: ${toFixed((thickness * this.getObjectScaling().y) / 10, config.NUM_FRACTION_DIGITS)}%; `\n : '',\n fill ? colorPropToSVG(FILL, fill) : '',\n deltaY ? `baseline-shift: ${-deltaY}; ` : '',\n useWhiteSpace ? 'white-space: pre; ' : '',\n ].join('');\n }\n\n /**\n * Returns text-decoration property for svg-export\n * @param {Object} style the object from which to retrieve style properties\n * @return {String}\n */\n getSvgTextDecoration(\n this: TextSVGExportMixin & FabricText,\n style: TextStyleDeclaration,\n ) {\n return (['overline', 'underline', 'line-through'] as const)\n .filter(\n (decoration) =>\n style[\n decoration.replace('-', '') as\n | 'overline'\n | 'underline'\n | 'linethrough'\n ],\n )\n .join(' ');\n }\n}\n","import { cache } from '../../cache';\nimport { DEFAULT_SVG_FONT_SIZE, FILL, STROKE } from '../../constants';\nimport type { ObjectEvents } from '../../EventTypeDefs';\nimport type {\n CompleteTextStyleDeclaration,\n TextStyle,\n TextStyleDeclaration,\n} from './StyledText';\nimport { StyledText } from './StyledText';\nimport { SHARED_ATTRIBUTES } from '../../parser/attributes';\nimport { parseAttributes } from '../../parser/parseAttributes';\nimport type {\n Abortable,\n TCacheCanvasDimensions,\n TClassProperties,\n TFiller,\n TOptions,\n} from '../../typedefs';\nimport { classRegistry } from '../../ClassRegistry';\nimport { graphemeSplit } from '../../util/lang_string';\nimport { createCanvasElementFor } from '../../util/misc/dom';\nimport type { TextStyleArray } from '../../util/misc/textStyles';\nimport {\n hasStyleChanged,\n stylesFromArray,\n stylesToArray,\n} from '../../util/misc/textStyles';\nimport { getPathSegmentsInfo, getPointOnPath } from '../../util/path';\nimport { cacheProperties } from '../Object/FabricObject';\nimport type { Path } from '../Path';\nimport { TextSVGExportMixin } from './TextSVGExportMixin';\nimport { applyMixins } from '../../util/applyMixins';\nimport type { FabricObjectProps, SerializedObjectProps } from '../Object/types';\nimport type { StylePropertiesType } from './constants';\nimport {\n additionalProps,\n textDefaultValues,\n textLayoutProperties,\n JUSTIFY,\n JUSTIFY_CENTER,\n JUSTIFY_LEFT,\n JUSTIFY_RIGHT,\n TEXT_DECORATION_THICKNESS,\n} from './constants';\nimport { CENTER, LEFT, RIGHT, TOP, BOTTOM } from '../../constants';\nimport { isFiller } from '../../util/typeAssertions';\nimport type { Gradient } from '../../gradient/Gradient';\nimport type { Pattern } from '../../Pattern';\nimport type { CSSRules } from '../../parser/typedefs';\n\nlet measuringContext: CanvasRenderingContext2D | null;\n\n/**\n * Return a context for measurement of text string.\n * if created it gets stored for reuse\n */\nfunction getMeasuringContext() {\n if (!measuringContext) {\n const canvas = createCanvasElementFor({\n width: 0,\n height: 0,\n });\n measuringContext = canvas.getContext('2d');\n }\n return measuringContext;\n}\n\nexport type TPathSide = 'left' | 'right';\n\nexport type TPathAlign = 'baseline' | 'center' | 'ascender' | 'descender';\n\nexport type TextLinesInfo = {\n lines: string[];\n graphemeLines: string[][];\n graphemeText: string[];\n _unwrappedLines: string[][];\n};\n\n/**\n * Measure and return the info of a single grapheme.\n * needs the the info of previous graphemes already filled\n * Override to customize measuring\n */\nexport type GraphemeBBox = {\n width: number;\n height: number;\n kernedWidth: number;\n left: number;\n deltaY: number;\n renderLeft?: number;\n renderTop?: number;\n angle?: number;\n};\n\n// @TODO this is not complete\ninterface UniqueTextProps {\n charSpacing: number;\n lineHeight: number;\n fontSize: number;\n fontWeight: string | number;\n fontFamily: string;\n fontStyle: string;\n pathSide: TPathSide;\n pathAlign: TPathAlign;\n underline: boolean;\n overline: boolean;\n linethrough: boolean;\n textAlign: string;\n direction: CanvasDirection;\n path?: Path;\n textDecorationThickness: number;\n}\n\nexport interface SerializedTextProps\n extends SerializedObjectProps,\n UniqueTextProps {\n styles: TextStyleArray | TextStyle;\n}\n\nexport interface TextProps extends FabricObjectProps, UniqueTextProps {\n styles: TextStyle;\n}\n\n/**\n * Text class\n * @tutorial {@link http://fabricjs.com/fabric-intro-part-2#text}\n */\nexport class FabricText<\n Props extends TOptions = Partial,\n SProps extends SerializedTextProps = SerializedTextProps,\n EventSpec extends ObjectEvents = ObjectEvents,\n >\n extends StyledText\n implements UniqueTextProps\n{\n /**\n * Properties that requires a text layout recalculation when changed\n * @type string[]\n * @protected\n */\n static textLayoutProperties: string[] = textLayoutProperties;\n\n /**\n * @private\n */\n declare _reNewline: RegExp;\n\n /**\n * Use this regular expression to filter for whitespaces that is not a new line.\n * Mostly used when text is 'justify' aligned.\n * @private\n */\n declare _reSpacesAndTabs: RegExp;\n\n /**\n * Use this regular expression to filter for whitespace that is not a new line.\n * Mostly used when text is 'justify' aligned.\n * @private\n */\n declare _reSpaceAndTab: RegExp;\n\n /**\n * Use this regular expression to filter consecutive groups of non spaces.\n * Mostly used when text is 'justify' aligned.\n * @private\n */\n declare _reWords: RegExp;\n\n declare text: string;\n\n /**\n * Font size (in pixels)\n * @type Number\n */\n declare fontSize: number;\n\n /**\n * Font weight (e.g. bold, normal, 400, 600, 800)\n * @type {(Number|String)}\n */\n declare fontWeight: string | number;\n\n /**\n * Font family\n * @type String\n */\n declare fontFamily: string;\n\n /**\n * Text decoration underline.\n * @type Boolean\n */\n declare underline: boolean;\n\n /**\n * Text decoration overline.\n * @type Boolean\n */\n declare overline: boolean;\n\n /**\n * Text decoration linethrough.\n * @type Boolean\n */\n declare linethrough: boolean;\n\n /**\n * Text alignment. Possible values: \"left\", \"center\", \"right\", \"justify\",\n * \"justify-left\", \"justify-center\" or \"justify-right\".\n * @type String\n */\n declare textAlign: string;\n\n /**\n * Font style . Possible values: \"\", \"normal\", \"italic\" or \"oblique\".\n * @type String\n */\n declare fontStyle: string;\n\n /**\n * Line height\n * @type Number\n */\n declare lineHeight: number;\n\n /**\n * Superscript schema object (minimum overlap)\n */\n declare superscript: {\n /**\n * fontSize factor\n * @default 0.6\n */\n size: number;\n /**\n * baseline-shift factor (upwards)\n * @default -0.35\n */\n baseline: number;\n };\n\n /**\n * Subscript schema object (minimum overlap)\n */\n declare subscript: {\n /**\n * fontSize factor\n * @default 0.6\n */\n size: number;\n /**\n * baseline-shift factor (downwards)\n * @default 0.11\n */\n baseline: number;\n };\n\n /**\n * Background color of text lines\n * @type String\n */\n declare textBackgroundColor: string;\n\n declare styles: TextStyle;\n\n /**\n * Path that the text should follow.\n * since 4.6.0 the path will be drawn automatically.\n * if you want to make the path visible, give it a stroke and strokeWidth or fill value\n * if you want it to be hidden, assign visible = false to the path.\n * This feature is in BETA, and SVG import/export is not yet supported.\n * @type Path\n * @example\n * const textPath = new Text('Text on a path', {\n * top: 150,\n * left: 150,\n * textAlign: 'center',\n * charSpacing: -50,\n * path: new Path('M 0 0 C 50 -100 150 -100 200 0', {\n * strokeWidth: 1,\n * visible: false\n * }),\n * pathSide: 'left',\n * pathStartOffset: 0\n * });\n */\n declare path?: Path;\n\n /**\n * The text decoration tickness for underline, overline and strikethrough\n * The tickness is expressed in thousandths of fontSize ( em ).\n * The original value was 1/15 that translates to 66.6667 thousandths.\n * The choice of unit of measure is to align with charSpacing.\n * You can slim the tickness without issues, while large underline or overline may end up\n * outside the bounding box of the text. In order to fix that a bigger refactor of the code\n * is needed and is out of scope for now. If you need such large overline on the first line\n * of text or large underline on the last line of text, consider disabling caching as a\n * workaround\n * @default 66.667\n */\n declare textDecorationThickness: number;\n\n /**\n * Offset amount for text path starting position\n * Only used when text has a path\n */\n declare pathStartOffset: number;\n\n /**\n * Which side of the path the text should be drawn on.\n * Only used when text has a path\n * @type {TPathSide} 'left|right'\n */\n declare pathSide: TPathSide;\n\n /**\n * How text is aligned to the path. This property determines\n * the perpendicular position of each character relative to the path.\n * (one of \"baseline\", \"center\", \"ascender\", \"descender\")\n * This feature is in BETA, and its behavior may change\n * @type TPathAlign\n */\n declare pathAlign: TPathAlign;\n\n /**\n * @private\n */\n declare _fontSizeFraction: number;\n\n /**\n * @private\n */\n declare offsets: { underline: number; linethrough: number; overline: number };\n\n /**\n * Text Line proportion to font Size (in pixels)\n * @type Number\n */\n declare _fontSizeMult: number;\n\n /**\n * additional space between characters\n * expressed in thousands of em unit\n * @type Number\n */\n declare charSpacing: number;\n\n /**\n * Baseline shift, styles only, keep at 0 for the main text object\n * @type {Number}\n */\n declare deltaY: number;\n\n /**\n * WARNING: EXPERIMENTAL. NOT SUPPORTED YET\n * determine the direction of the text.\n * This has to be set manually together with textAlign and originX for proper\n * experience.\n * some interesting link for the future\n * https://www.w3.org/International/questions/qa-bidi-unicode-controls\n * @since 4.5.0\n * @type {CanvasDirection} 'ltr|rtl'\n */\n declare direction: CanvasDirection;\n\n /**\n * contains characters bounding boxes\n * This variable is considered to be protected.\n * But for how mixins are implemented right now, we can't leave it private\n * @protected\n */\n __charBounds: GraphemeBBox[][] = [];\n\n /**\n * use this size when measuring text. To avoid IE11 rounding errors\n * @type {Number}\n * @readonly\n * @private\n */\n declare CACHE_FONT_SIZE: number;\n\n /**\n * contains the min text width to avoid getting 0\n * @type {Number}\n */\n declare MIN_TEXT_WIDTH: number;\n\n /**\n * contains the the text of the object, divided in lines as they are displayed\n * on screen. Wrapping will divide the text independently of line breaks\n * @type {string[]}\n */\n declare textLines: string[];\n\n /**\n * same as textlines, but each line is an array of graphemes as split by splitByGrapheme\n * @type {string[]}\n */\n declare _textLines: string[][];\n\n declare _unwrappedTextLines: string[][];\n declare _text: string[];\n declare cursorWidth: number;\n declare __lineHeights: number[];\n declare __lineWidths: number[];\n declare initialized?: true;\n\n static cacheProperties = [...cacheProperties, ...additionalProps];\n\n static ownDefaults = textDefaultValues;\n\n static type = 'Text';\n\n static getDefaults(): Record {\n return { ...super.getDefaults(), ...FabricText.ownDefaults };\n }\n\n constructor(text: string, options?: Props) {\n super();\n Object.assign(this, FabricText.ownDefaults);\n this.setOptions(options);\n if (!this.styles) {\n this.styles = {};\n }\n this.text = text;\n this.initialized = true;\n if (this.path) {\n this.setPathInfo();\n }\n this.initDimensions();\n this.setCoords();\n }\n\n /**\n * If text has a path, it will add the extra information needed\n * for path and text calculations\n */\n setPathInfo() {\n const path = this.path;\n if (path) {\n path.segmentsInfo = getPathSegmentsInfo(path.path);\n }\n }\n\n /**\n * @private\n * Divides text into lines of text and lines of graphemes.\n */\n _splitText(): TextLinesInfo {\n const newLines = this._splitTextIntoLines(this.text);\n this.textLines = newLines.lines;\n this._textLines = newLines.graphemeLines;\n this._unwrappedTextLines = newLines._unwrappedLines;\n this._text = newLines.graphemeText;\n return newLines;\n }\n\n /**\n * Initialize or update text dimensions.\n * Updates this.width and this.height with the proper values.\n * Does not return dimensions.\n */\n initDimensions() {\n this._splitText();\n this._clearCache();\n this.dirty = true;\n if (this.path) {\n this.width = this.path.width;\n this.height = this.path.height;\n } else {\n this.width =\n this.calcTextWidth() || this.cursorWidth || this.MIN_TEXT_WIDTH;\n this.height = this.calcTextHeight();\n }\n if (this.textAlign.includes(JUSTIFY)) {\n // once text is measured we need to make space fatter to make justified text.\n this.enlargeSpaces();\n }\n }\n\n /**\n * Enlarge space boxes and shift the others\n */\n enlargeSpaces() {\n let diffSpace,\n currentLineWidth,\n numberOfSpaces,\n accumulatedSpace,\n line,\n charBound,\n spaces;\n for (let i = 0, len = this._textLines.length; i < len; i++) {\n if (\n this.textAlign !== JUSTIFY &&\n (i === len - 1 || this.isEndOfWrapping(i))\n ) {\n continue;\n }\n accumulatedSpace = 0;\n line = this._textLines[i];\n currentLineWidth = this.getLineWidth(i);\n if (\n currentLineWidth < this.width &&\n (spaces = this.textLines[i].match(this._reSpacesAndTabs))\n ) {\n numberOfSpaces = spaces.length;\n diffSpace = (this.width - currentLineWidth) / numberOfSpaces;\n for (let j = 0; j <= line.length; j++) {\n charBound = this.__charBounds[i][j];\n if (this._reSpaceAndTab.test(line[j])) {\n charBound.width += diffSpace;\n charBound.kernedWidth += diffSpace;\n charBound.left += accumulatedSpace;\n accumulatedSpace += diffSpace;\n } else {\n charBound.left += accumulatedSpace;\n }\n }\n }\n }\n }\n\n /**\n * Detect if the text line is ended with an hard break\n * text and itext do not have wrapping, return false\n * @return {Boolean}\n */\n isEndOfWrapping(lineIndex: number): boolean {\n return lineIndex === this._textLines.length - 1;\n }\n\n /**\n * Detect if a line has a linebreak and so we need to account for it when moving\n * and counting style.\n * It return always 1 for text and Itext. Textbox has its own implementation\n * @return Number\n */\n missingNewlineOffset(lineIndex: number, skipWrapping?: boolean): 0 | 1;\n missingNewlineOffset(_lineIndex: number): 1 {\n return 1;\n }\n\n /**\n * Returns 2d representation (lineIndex and charIndex) of cursor\n * @param {Number} selectionStart\n * @param {Boolean} [skipWrapping] consider the location for unwrapped lines. useful to manage styles.\n */\n get2DCursorLocation(selectionStart: number, skipWrapping?: boolean) {\n const lines = skipWrapping ? this._unwrappedTextLines : this._textLines;\n let i: number;\n for (i = 0; i < lines.length; i++) {\n if (selectionStart <= lines[i].length) {\n return {\n lineIndex: i,\n charIndex: selectionStart,\n };\n }\n selectionStart -=\n lines[i].length + this.missingNewlineOffset(i, skipWrapping);\n }\n return {\n lineIndex: i - 1,\n charIndex:\n lines[i - 1].length < selectionStart\n ? lines[i - 1].length\n : selectionStart,\n };\n }\n\n /**\n * Returns string representation of an instance\n * @return {String} String representation of text object\n */\n toString(): string {\n return `#`;\n }\n\n /**\n * Return the dimension and the zoom level needed to create a cache canvas\n * big enough to host the object to be cached.\n * @private\n * @param {Object} dim.x width of object to be cached\n * @param {Object} dim.y height of object to be cached\n * @return {Object}.width width of canvas\n * @return {Object}.height height of canvas\n * @return {Object}.zoomX zoomX zoom value to unscale the canvas before drawing cache\n * @return {Object}.zoomY zoomY zoom value to unscale the canvas before drawing cache\n */\n _getCacheCanvasDimensions(): TCacheCanvasDimensions {\n const dims = super._getCacheCanvasDimensions();\n const fontSize = this.fontSize;\n dims.width += fontSize * dims.zoomX;\n dims.height += fontSize * dims.zoomY;\n return dims;\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _render(ctx: CanvasRenderingContext2D) {\n const path = this.path;\n path && !path.isNotVisible() && path._render(ctx);\n this._setTextStyles(ctx);\n this._renderTextLinesBackground(ctx);\n this._renderTextDecoration(ctx, 'underline');\n this._renderText(ctx);\n this._renderTextDecoration(ctx, 'overline');\n this._renderTextDecoration(ctx, 'linethrough');\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _renderText(ctx: CanvasRenderingContext2D) {\n if (this.paintFirst === STROKE) {\n this._renderTextStroke(ctx);\n this._renderTextFill(ctx);\n } else {\n this._renderTextFill(ctx);\n this._renderTextStroke(ctx);\n }\n }\n\n /**\n * Set the font parameter of the context with the object properties or with charStyle\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n * @param {Object} [charStyle] object with font style properties\n * @param {String} [charStyle.fontFamily] Font Family\n * @param {Number} [charStyle.fontSize] Font size in pixels. ( without px suffix )\n * @param {String} [charStyle.fontWeight] Font weight\n * @param {String} [charStyle.fontStyle] Font style (italic|normal)\n */\n _setTextStyles(\n ctx: CanvasRenderingContext2D,\n charStyle?: any,\n forMeasuring?: boolean,\n ) {\n ctx.textBaseline = 'alphabetic';\n if (this.path) {\n switch (this.pathAlign) {\n case CENTER:\n ctx.textBaseline = 'middle';\n break;\n case 'ascender':\n ctx.textBaseline = TOP;\n break;\n case 'descender':\n ctx.textBaseline = BOTTOM;\n break;\n }\n }\n ctx.font = this._getFontDeclaration(charStyle, forMeasuring);\n }\n\n /**\n * calculate and return the text Width measuring each line.\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n * @return {Number} Maximum width of Text object\n */\n calcTextWidth(): number {\n let maxWidth = this.getLineWidth(0);\n\n for (let i = 1, len = this._textLines.length; i < len; i++) {\n const currentLineWidth = this.getLineWidth(i);\n if (currentLineWidth > maxWidth) {\n maxWidth = currentLineWidth;\n }\n }\n return maxWidth;\n }\n\n /**\n * @private\n * @param {String} method Method name (\"fillText\" or \"strokeText\")\n * @param {CanvasRenderingContext2D} ctx Context to render on\n * @param {String} line Text to render\n * @param {Number} left Left position of text\n * @param {Number} top Top position of text\n * @param {Number} lineIndex Index of a line in a text\n */\n _renderTextLine(\n method: 'fillText' | 'strokeText',\n ctx: CanvasRenderingContext2D,\n line: string[],\n left: number,\n top: number,\n lineIndex: number,\n ) {\n this._renderChars(method, ctx, line, left, top, lineIndex);\n }\n\n /**\n * Renders the text background for lines, taking care of style\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _renderTextLinesBackground(ctx: CanvasRenderingContext2D) {\n if (!this.textBackgroundColor && !this.styleHas('textBackgroundColor')) {\n return;\n }\n const originalFill = ctx.fillStyle,\n leftOffset = this._getLeftOffset();\n let lineTopOffset = this._getTopOffset();\n\n for (let i = 0, len = this._textLines.length; i < len; i++) {\n const heightOfLine = this.getHeightOfLine(i);\n if (\n !this.textBackgroundColor &&\n !this.styleHas('textBackgroundColor', i)\n ) {\n lineTopOffset += heightOfLine;\n continue;\n }\n const jlen = this._textLines[i].length;\n const lineLeftOffset = this._getLineLeftOffset(i);\n let boxWidth = 0;\n let boxStart = 0;\n let drawStart;\n let currentColor;\n let lastColor = this.getValueOfPropertyAt(i, 0, 'textBackgroundColor');\n for (let j = 0; j < jlen; j++) {\n // at this point charbox are either standard or full with pathInfo if there is a path.\n const charBox = this.__charBounds[i][j] as Required;\n currentColor = this.getValueOfPropertyAt(i, j, 'textBackgroundColor');\n if (this.path) {\n ctx.save();\n ctx.translate(charBox.renderLeft, charBox.renderTop);\n ctx.rotate(charBox.angle);\n ctx.fillStyle = currentColor;\n currentColor &&\n ctx.fillRect(\n -charBox.width / 2,\n (-heightOfLine / this.lineHeight) * (1 - this._fontSizeFraction),\n charBox.width,\n heightOfLine / this.lineHeight,\n );\n ctx.restore();\n } else if (currentColor !== lastColor) {\n drawStart = leftOffset + lineLeftOffset + boxStart;\n if (this.direction === 'rtl') {\n drawStart = this.width - drawStart - boxWidth;\n }\n ctx.fillStyle = lastColor;\n lastColor &&\n ctx.fillRect(\n drawStart,\n lineTopOffset,\n boxWidth,\n heightOfLine / this.lineHeight,\n );\n boxStart = charBox.left;\n boxWidth = charBox.width;\n lastColor = currentColor;\n } else {\n boxWidth += charBox.kernedWidth;\n }\n }\n if (currentColor && !this.path) {\n drawStart = leftOffset + lineLeftOffset + boxStart;\n if (this.direction === 'rtl') {\n drawStart = this.width - drawStart - boxWidth;\n }\n ctx.fillStyle = currentColor;\n ctx.fillRect(\n drawStart,\n lineTopOffset,\n boxWidth,\n heightOfLine / this.lineHeight,\n );\n }\n lineTopOffset += heightOfLine;\n }\n ctx.fillStyle = originalFill;\n // if there is text background color no\n // other shadows should be casted\n this._removeShadow(ctx);\n }\n\n /**\n * measure and return the width of a single character.\n * possibly overridden to accommodate different measure logic or\n * to hook some external lib for character measurement\n * @private\n * @param {String} _char, char to be measured\n * @param {Object} charStyle style of char to be measured\n * @param {String} [previousChar] previous char\n * @param {Object} [prevCharStyle] style of previous char\n */\n _measureChar(\n _char: string,\n charStyle: CompleteTextStyleDeclaration,\n previousChar: string | undefined,\n prevCharStyle: CompleteTextStyleDeclaration | Record,\n ) {\n const fontCache = cache.getFontCache(charStyle),\n fontDeclaration = this._getFontDeclaration(charStyle),\n couple = previousChar + _char,\n stylesAreEqual =\n previousChar &&\n fontDeclaration === this._getFontDeclaration(prevCharStyle),\n fontMultiplier = charStyle.fontSize / this.CACHE_FONT_SIZE;\n let width: number | undefined,\n coupleWidth: number | undefined,\n previousWidth: number | undefined,\n kernedWidth: number | undefined;\n\n if (previousChar && fontCache[previousChar] !== undefined) {\n previousWidth = fontCache[previousChar];\n }\n if (fontCache[_char] !== undefined) {\n kernedWidth = width = fontCache[_char];\n }\n if (stylesAreEqual && fontCache[couple] !== undefined) {\n coupleWidth = fontCache[couple];\n kernedWidth = coupleWidth - previousWidth!;\n }\n if (\n width === undefined ||\n previousWidth === undefined ||\n coupleWidth === undefined\n ) {\n const ctx = getMeasuringContext()!;\n // send a TRUE to specify measuring font size CACHE_FONT_SIZE\n this._setTextStyles(ctx, charStyle, true);\n if (width === undefined) {\n kernedWidth = width = ctx.measureText(_char).width;\n fontCache[_char] = width;\n }\n if (previousWidth === undefined && stylesAreEqual && previousChar) {\n previousWidth = ctx.measureText(previousChar).width;\n fontCache[previousChar] = previousWidth;\n }\n if (stylesAreEqual && coupleWidth === undefined) {\n // we can measure the kerning couple and subtract the width of the previous character\n coupleWidth = ctx.measureText(couple).width;\n fontCache[couple] = coupleWidth;\n // safe to use the non-null since if undefined we defined it before.\n kernedWidth = coupleWidth - previousWidth!;\n }\n }\n return {\n width: width * fontMultiplier,\n kernedWidth: kernedWidth! * fontMultiplier,\n };\n }\n\n /**\n * Computes height of character at given position\n * @param {Number} line the line index number\n * @param {Number} _char the character index number\n * @return {Number} fontSize of the character\n */\n getHeightOfChar(line: number, _char: number): number {\n return this.getValueOfPropertyAt(line, _char, 'fontSize');\n }\n\n /**\n * measure a text line measuring all characters.\n * @param {Number} lineIndex line number\n */\n measureLine(lineIndex: number) {\n const lineInfo = this._measureLine(lineIndex);\n if (this.charSpacing !== 0) {\n lineInfo.width -= this._getWidthOfCharSpacing();\n }\n if (lineInfo.width < 0) {\n lineInfo.width = 0;\n }\n return lineInfo;\n }\n\n /**\n * measure every grapheme of a line, populating __charBounds\n * @param {Number} lineIndex\n * @return {Object} object.width total width of characters\n * @return {Object} object.numOfSpaces length of chars that match this._reSpacesAndTabs\n */\n _measureLine(lineIndex: number) {\n let width = 0,\n prevGrapheme: string | undefined,\n graphemeInfo: GraphemeBBox | undefined;\n\n const reverse = this.pathSide === RIGHT,\n path = this.path,\n line = this._textLines[lineIndex],\n llength = line.length,\n lineBounds = new Array(llength);\n\n this.__charBounds[lineIndex] = lineBounds;\n for (let i = 0; i < llength; i++) {\n const grapheme = line[i];\n graphemeInfo = this._getGraphemeBox(grapheme, lineIndex, i, prevGrapheme);\n lineBounds[i] = graphemeInfo;\n width += graphemeInfo.kernedWidth;\n prevGrapheme = grapheme;\n }\n // this latest bound box represent the last character of the line\n // to simplify cursor handling in interactive mode.\n lineBounds[llength] = {\n left: graphemeInfo ? graphemeInfo.left + graphemeInfo.width : 0,\n width: 0,\n kernedWidth: 0,\n height: this.fontSize,\n deltaY: 0,\n } as GraphemeBBox;\n if (path && path.segmentsInfo) {\n let positionInPath = 0;\n const totalPathLength =\n path.segmentsInfo[path.segmentsInfo.length - 1].length;\n switch (this.textAlign) {\n case LEFT:\n positionInPath = reverse ? totalPathLength - width : 0;\n break;\n case CENTER:\n positionInPath = (totalPathLength - width) / 2;\n break;\n case RIGHT:\n positionInPath = reverse ? 0 : totalPathLength - width;\n break;\n //todo - add support for justify\n }\n positionInPath += this.pathStartOffset * (reverse ? -1 : 1);\n for (\n let i = reverse ? llength - 1 : 0;\n reverse ? i >= 0 : i < llength;\n reverse ? i-- : i++\n ) {\n graphemeInfo = lineBounds[i];\n if (positionInPath > totalPathLength) {\n positionInPath %= totalPathLength;\n } else if (positionInPath < 0) {\n positionInPath += totalPathLength;\n }\n // it would probably much faster to send all the grapheme position for a line\n // and calculate path position/angle at once.\n this._setGraphemeOnPath(positionInPath, graphemeInfo);\n positionInPath += graphemeInfo.kernedWidth;\n }\n }\n return { width: width, numOfSpaces: 0 };\n }\n\n /**\n * Calculate the angle and the left,top position of the char that follow a path.\n * It appends it to graphemeInfo to be reused later at rendering\n * @private\n * @param {Number} positionInPath to be measured\n * @param {GraphemeBBox} graphemeInfo current grapheme box information\n * @param {Object} startingPoint position of the point\n */\n _setGraphemeOnPath(positionInPath: number, graphemeInfo: GraphemeBBox) {\n const centerPosition = positionInPath + graphemeInfo.kernedWidth / 2,\n path = this.path!;\n\n // we are at currentPositionOnPath. we want to know what point on the path is.\n const info = getPointOnPath(path.path, centerPosition, path.segmentsInfo)!;\n graphemeInfo.renderLeft = info.x - path.pathOffset.x;\n graphemeInfo.renderTop = info.y - path.pathOffset.y;\n graphemeInfo.angle = info.angle + (this.pathSide === RIGHT ? Math.PI : 0);\n }\n\n /**\n *\n * @param {String} grapheme to be measured\n * @param {Number} lineIndex index of the line where the char is\n * @param {Number} charIndex position in the line\n * @param {String} [prevGrapheme] character preceding the one to be measured\n * @returns {GraphemeBBox} grapheme bbox\n */\n _getGraphemeBox(\n grapheme: string,\n lineIndex: number,\n charIndex: number,\n prevGrapheme?: string,\n skipLeft?: boolean,\n ): GraphemeBBox {\n const style = this.getCompleteStyleDeclaration(lineIndex, charIndex),\n prevStyle = prevGrapheme\n ? this.getCompleteStyleDeclaration(lineIndex, charIndex - 1)\n : {},\n info = this._measureChar(grapheme, style, prevGrapheme, prevStyle);\n let kernedWidth = info.kernedWidth,\n width = info.width,\n charSpacing;\n\n if (this.charSpacing !== 0) {\n charSpacing = this._getWidthOfCharSpacing();\n width += charSpacing;\n kernedWidth += charSpacing;\n }\n\n const box: GraphemeBBox = {\n width,\n left: 0,\n height: style.fontSize,\n kernedWidth,\n deltaY: style.deltaY,\n };\n if (charIndex > 0 && !skipLeft) {\n const previousBox = this.__charBounds[lineIndex][charIndex - 1];\n box.left =\n previousBox.left + previousBox.width + info.kernedWidth - info.width;\n }\n return box;\n }\n\n /**\n * Calculate height of line at 'lineIndex'\n * @param {Number} lineIndex index of line to calculate\n * @return {Number}\n */\n getHeightOfLine(lineIndex: number): number {\n if (this.__lineHeights[lineIndex]) {\n return this.__lineHeights[lineIndex];\n }\n\n // char 0 is measured before the line cycle because it needs to char\n // emptylines\n let maxHeight = this.getHeightOfChar(lineIndex, 0);\n for (let i = 1, len = this._textLines[lineIndex].length; i < len; i++) {\n maxHeight = Math.max(this.getHeightOfChar(lineIndex, i), maxHeight);\n }\n\n return (this.__lineHeights[lineIndex] =\n maxHeight * this.lineHeight * this._fontSizeMult);\n }\n\n /**\n * Calculate text box height\n */\n calcTextHeight() {\n let lineHeight,\n height = 0;\n for (let i = 0, len = this._textLines.length; i < len; i++) {\n lineHeight = this.getHeightOfLine(i);\n height += i === len - 1 ? lineHeight / this.lineHeight : lineHeight;\n }\n return height;\n }\n\n /**\n * @private\n * @return {Number} Left offset\n */\n _getLeftOffset(): number {\n return this.direction === 'ltr' ? -this.width / 2 : this.width / 2;\n }\n\n /**\n * @private\n * @return {Number} Top offset\n */\n _getTopOffset(): number {\n return -this.height / 2;\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n * @param {String} method Method name (\"fillText\" or \"strokeText\")\n */\n _renderTextCommon(\n ctx: CanvasRenderingContext2D,\n method: 'fillText' | 'strokeText',\n ) {\n ctx.save();\n let lineHeights = 0;\n const left = this._getLeftOffset(),\n top = this._getTopOffset();\n for (let i = 0, len = this._textLines.length; i < len; i++) {\n const heightOfLine = this.getHeightOfLine(i),\n maxHeight = heightOfLine / this.lineHeight,\n leftOffset = this._getLineLeftOffset(i);\n this._renderTextLine(\n method,\n ctx,\n this._textLines[i],\n left + leftOffset,\n top + lineHeights + maxHeight,\n i,\n );\n lineHeights += heightOfLine;\n }\n ctx.restore();\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _renderTextFill(ctx: CanvasRenderingContext2D) {\n if (!this.fill && !this.styleHas(FILL)) {\n return;\n }\n\n this._renderTextCommon(ctx, 'fillText');\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _renderTextStroke(ctx: CanvasRenderingContext2D) {\n if ((!this.stroke || this.strokeWidth === 0) && this.isEmptyStyles()) {\n return;\n }\n\n if (this.shadow && !this.shadow.affectStroke) {\n this._removeShadow(ctx);\n }\n\n ctx.save();\n this._setLineDash(ctx, this.strokeDashArray);\n ctx.beginPath();\n this._renderTextCommon(ctx, 'strokeText');\n ctx.closePath();\n ctx.restore();\n }\n\n /**\n * @private\n * @param {String} method fillText or strokeText.\n * @param {CanvasRenderingContext2D} ctx Context to render on\n * @param {Array} line Content of the line, splitted in an array by grapheme\n * @param {Number} left\n * @param {Number} top\n * @param {Number} lineIndex\n */\n _renderChars(\n method: 'fillText' | 'strokeText',\n ctx: CanvasRenderingContext2D,\n line: Array,\n left: number,\n top: number,\n lineIndex: number,\n ) {\n const lineHeight = this.getHeightOfLine(lineIndex),\n isJustify = this.textAlign.includes(JUSTIFY),\n path = this.path,\n shortCut =\n !isJustify &&\n this.charSpacing === 0 &&\n this.isEmptyStyles(lineIndex) &&\n !path,\n isLtr = this.direction === 'ltr',\n sign = this.direction === 'ltr' ? 1 : -1,\n // this was changed in the PR #7674\n // currentDirection = ctx.canvas.getAttribute('dir');\n currentDirection = ctx.direction;\n\n let actualStyle,\n nextStyle,\n charsToRender = '',\n charBox,\n boxWidth = 0,\n timeToRender,\n drawingLeft;\n\n ctx.save();\n if (currentDirection !== this.direction) {\n ctx.canvas.setAttribute('dir', isLtr ? 'ltr' : 'rtl');\n ctx.direction = isLtr ? 'ltr' : 'rtl';\n ctx.textAlign = isLtr ? LEFT : RIGHT;\n }\n top -= (lineHeight * this._fontSizeFraction) / this.lineHeight;\n if (shortCut) {\n // render all the line in one pass without checking\n // drawingLeft = isLtr ? left : left - this.getLineWidth(lineIndex);\n this._renderChar(method, ctx, lineIndex, 0, line.join(''), left, top);\n ctx.restore();\n return;\n }\n for (let i = 0, len = line.length - 1; i <= len; i++) {\n timeToRender = i === len || this.charSpacing || path;\n charsToRender += line[i];\n charBox = this.__charBounds[lineIndex][i] as Required;\n if (boxWidth === 0) {\n left += sign * (charBox.kernedWidth - charBox.width);\n boxWidth += charBox.width;\n } else {\n boxWidth += charBox.kernedWidth;\n }\n if (isJustify && !timeToRender) {\n if (this._reSpaceAndTab.test(line[i])) {\n timeToRender = true;\n }\n }\n if (!timeToRender) {\n // if we have charSpacing, we render char by char\n actualStyle =\n actualStyle || this.getCompleteStyleDeclaration(lineIndex, i);\n nextStyle = this.getCompleteStyleDeclaration(lineIndex, i + 1);\n timeToRender = hasStyleChanged(actualStyle, nextStyle, false);\n }\n if (timeToRender) {\n if (path) {\n ctx.save();\n ctx.translate(charBox.renderLeft, charBox.renderTop);\n ctx.rotate(charBox.angle);\n this._renderChar(\n method,\n ctx,\n lineIndex,\n i,\n charsToRender,\n -boxWidth / 2,\n 0,\n );\n ctx.restore();\n } else {\n drawingLeft = left;\n this._renderChar(\n method,\n ctx,\n lineIndex,\n i,\n charsToRender,\n drawingLeft,\n top,\n );\n }\n charsToRender = '';\n actualStyle = nextStyle;\n left += sign * boxWidth;\n boxWidth = 0;\n }\n }\n ctx.restore();\n }\n\n /**\n * This function try to patch the missing gradientTransform on canvas gradients.\n * transforming a context to transform the gradient, is going to transform the stroke too.\n * we want to transform the gradient but not the stroke operation, so we create\n * a transformed gradient on a pattern and then we use the pattern instead of the gradient.\n * this method has drawbacks: is slow, is in low resolution, needs a patch for when the size\n * is limited.\n * @private\n * @param {TFiller} filler a fabric gradient instance\n * @return {CanvasPattern} a pattern to use as fill/stroke style\n */\n _applyPatternGradientTransformText(filler: TFiller) {\n // TODO: verify compatibility with strokeUniform\n const width = this.width + this.strokeWidth,\n height = this.height + this.strokeWidth,\n pCanvas = createCanvasElementFor({\n width,\n height,\n }),\n pCtx = pCanvas.getContext('2d')!;\n pCanvas.width = width;\n pCanvas.height = height;\n pCtx.beginPath();\n pCtx.moveTo(0, 0);\n pCtx.lineTo(width, 0);\n pCtx.lineTo(width, height);\n pCtx.lineTo(0, height);\n pCtx.closePath();\n pCtx.translate(width / 2, height / 2);\n pCtx.fillStyle = filler.toLive(pCtx)!;\n this._applyPatternGradientTransform(pCtx, filler);\n pCtx.fill();\n return pCtx.createPattern(pCanvas, 'no-repeat')!;\n }\n\n handleFiller(\n ctx: CanvasRenderingContext2D,\n property: `${T}Style`,\n filler: TFiller | string,\n ): { offsetX: number; offsetY: number } {\n let offsetX: number, offsetY: number;\n if (isFiller(filler)) {\n if (\n (filler as Gradient<'linear'>).gradientUnits === 'percentage' ||\n (filler as Gradient<'linear'>).gradientTransform ||\n (filler as Pattern).patternTransform\n ) {\n // need to transform gradient in a pattern.\n // this is a slow process. If you are hitting this codepath, and the object\n // is not using caching, you should consider switching it on.\n // we need a canvas as big as the current object caching canvas.\n offsetX = -this.width / 2;\n offsetY = -this.height / 2;\n ctx.translate(offsetX, offsetY);\n ctx[property] = this._applyPatternGradientTransformText(filler);\n return { offsetX, offsetY };\n } else {\n // is a simple gradient or pattern\n ctx[property] = filler.toLive(ctx)!;\n return this._applyPatternGradientTransform(ctx, filler);\n }\n } else {\n // is a color\n ctx[property] = filler;\n }\n return { offsetX: 0, offsetY: 0 };\n }\n\n /**\n * This function prepare the canvas for a stroke style, and stroke and strokeWidth\n * need to be sent in as defined\n * @param {CanvasRenderingContext2D} ctx\n * @param {CompleteTextStyleDeclaration} style with stroke and strokeWidth defined\n * @returns\n */\n _setStrokeStyles(\n ctx: CanvasRenderingContext2D,\n {\n stroke,\n strokeWidth,\n }: Pick,\n ) {\n ctx.lineWidth = strokeWidth;\n ctx.lineCap = this.strokeLineCap;\n ctx.lineDashOffset = this.strokeDashOffset;\n ctx.lineJoin = this.strokeLineJoin;\n ctx.miterLimit = this.strokeMiterLimit;\n return this.handleFiller(ctx, 'strokeStyle', stroke!);\n }\n\n /**\n * This function prepare the canvas for a ill style, and fill\n * need to be sent in as defined\n * @param {CanvasRenderingContext2D} ctx\n * @param {CompleteTextStyleDeclaration} style with ill defined\n * @returns\n */\n _setFillStyles(ctx: CanvasRenderingContext2D, { fill }: Pick) {\n return this.handleFiller(ctx, 'fillStyle', fill!);\n }\n\n /**\n * @private\n * @param {String} method\n * @param {CanvasRenderingContext2D} ctx Context to render on\n * @param {Number} lineIndex\n * @param {Number} charIndex\n * @param {String} _char\n * @param {Number} left Left coordinate\n * @param {Number} top Top coordinate\n * @param {Number} lineHeight Height of the line\n */\n _renderChar(\n method: 'fillText' | 'strokeText',\n ctx: CanvasRenderingContext2D,\n lineIndex: number,\n charIndex: number,\n _char: string,\n left: number,\n top: number,\n ) {\n const decl = this._getStyleDeclaration(lineIndex, charIndex),\n fullDecl = this.getCompleteStyleDeclaration(lineIndex, charIndex),\n shouldFill = method === 'fillText' && fullDecl.fill,\n shouldStroke =\n method === 'strokeText' && fullDecl.stroke && fullDecl.strokeWidth;\n\n if (!shouldStroke && !shouldFill) {\n return;\n }\n ctx.save();\n\n ctx.font = this._getFontDeclaration(fullDecl);\n\n if (decl.textBackgroundColor) {\n this._removeShadow(ctx);\n }\n if (decl.deltaY) {\n top += decl.deltaY;\n }\n\n if (shouldFill) {\n const fillOffsets = this._setFillStyles(ctx, fullDecl);\n ctx.fillText(\n _char,\n left - fillOffsets.offsetX,\n top - fillOffsets.offsetY,\n );\n }\n\n if (shouldStroke) {\n const strokeOffsets = this._setStrokeStyles(ctx, fullDecl);\n ctx.strokeText(\n _char,\n left - strokeOffsets.offsetX,\n top - strokeOffsets.offsetY,\n );\n }\n\n ctx.restore();\n }\n\n /**\n * Turns the character into a 'superior figure' (i.e. 'superscript')\n * @param {Number} start selection start\n * @param {Number} end selection end\n */\n setSuperscript(start: number, end: number) {\n this._setScript(start, end, this.superscript);\n }\n\n /**\n * Turns the character into an 'inferior figure' (i.e. 'subscript')\n * @param {Number} start selection start\n * @param {Number} end selection end\n */\n setSubscript(start: number, end: number) {\n this._setScript(start, end, this.subscript);\n }\n\n /**\n * Applies 'schema' at given position\n * @private\n * @param {Number} start selection start\n * @param {Number} end selection end\n * @param {Number} schema\n */\n protected _setScript(\n start: number,\n end: number,\n schema: {\n size: number;\n baseline: number;\n },\n ) {\n const loc = this.get2DCursorLocation(start, true),\n fontSize = this.getValueOfPropertyAt(\n loc.lineIndex,\n loc.charIndex,\n 'fontSize',\n ),\n dy = this.getValueOfPropertyAt(loc.lineIndex, loc.charIndex, 'deltaY'),\n style = {\n fontSize: fontSize * schema.size,\n deltaY: dy + fontSize * schema.baseline,\n };\n this.setSelectionStyles(style, start, end);\n }\n\n /**\n * @private\n * @param {Number} lineIndex index text line\n * @return {Number} Line left offset\n */\n _getLineLeftOffset(lineIndex: number): number {\n const lineWidth = this.getLineWidth(lineIndex),\n lineDiff = this.width - lineWidth,\n textAlign = this.textAlign,\n direction = this.direction,\n isEndOfWrapping = this.isEndOfWrapping(lineIndex);\n let leftOffset = 0;\n if (\n textAlign === JUSTIFY ||\n (textAlign === JUSTIFY_CENTER && !isEndOfWrapping) ||\n (textAlign === JUSTIFY_RIGHT && !isEndOfWrapping) ||\n (textAlign === JUSTIFY_LEFT && !isEndOfWrapping)\n ) {\n return 0;\n }\n if (textAlign === CENTER) {\n leftOffset = lineDiff / 2;\n }\n if (textAlign === RIGHT) {\n leftOffset = lineDiff;\n }\n if (textAlign === JUSTIFY_CENTER) {\n leftOffset = lineDiff / 2;\n }\n if (textAlign === JUSTIFY_RIGHT) {\n leftOffset = lineDiff;\n }\n if (direction === 'rtl') {\n if (\n textAlign === RIGHT ||\n textAlign === JUSTIFY ||\n textAlign === JUSTIFY_RIGHT\n ) {\n leftOffset = 0;\n } else if (textAlign === LEFT || textAlign === JUSTIFY_LEFT) {\n leftOffset = -lineDiff;\n } else if (textAlign === CENTER || textAlign === JUSTIFY_CENTER) {\n leftOffset = -lineDiff / 2;\n }\n }\n return leftOffset;\n }\n\n /**\n * @private\n */\n _clearCache() {\n this._forceClearCache = false;\n this.__lineWidths = [];\n this.__lineHeights = [];\n this.__charBounds = [];\n }\n\n /**\n * Measure a single line given its index. Used to calculate the initial\n * text bounding box. The values are calculated and stored in __lineWidths cache.\n * @private\n * @param {Number} lineIndex line number\n * @return {Number} Line width\n */\n getLineWidth(lineIndex: number): number {\n if (this.__lineWidths[lineIndex] !== undefined) {\n return this.__lineWidths[lineIndex];\n }\n\n const { width } = this.measureLine(lineIndex);\n this.__lineWidths[lineIndex] = width;\n return width;\n }\n\n _getWidthOfCharSpacing() {\n if (this.charSpacing !== 0) {\n return (this.fontSize * this.charSpacing) / 1000;\n }\n return 0;\n }\n\n /**\n * Retrieves the value of property at given character position\n * @param {Number} lineIndex the line number\n * @param {Number} charIndex the character number\n * @param {String} property the property name\n * @returns the value of 'property'\n */\n getValueOfPropertyAt(\n lineIndex: number,\n charIndex: number,\n property: T,\n ): this[T] {\n const charStyle = this._getStyleDeclaration(lineIndex, charIndex);\n return (charStyle[property] ?? this[property]) as this[T];\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _renderTextDecoration(\n ctx: CanvasRenderingContext2D,\n type: 'underline' | 'linethrough' | 'overline',\n ) {\n if (!this[type] && !this.styleHas(type)) {\n return;\n }\n let topOffset = this._getTopOffset();\n const leftOffset = this._getLeftOffset(),\n path = this.path,\n charSpacing = this._getWidthOfCharSpacing(),\n offsetAligner =\n type === 'linethrough' ? 0.5 : type === 'overline' ? 1 : 0,\n offsetY = this.offsets[type];\n for (let i = 0, len = this._textLines.length; i < len; i++) {\n const heightOfLine = this.getHeightOfLine(i);\n if (!this[type] && !this.styleHas(type, i)) {\n topOffset += heightOfLine;\n continue;\n }\n const line = this._textLines[i];\n const maxHeight = heightOfLine / this.lineHeight;\n const lineLeftOffset = this._getLineLeftOffset(i);\n let boxStart = 0;\n let boxWidth = 0;\n let lastDecoration = this.getValueOfPropertyAt(i, 0, type);\n let lastFill = this.getValueOfPropertyAt(i, 0, FILL);\n let lastTickness = this.getValueOfPropertyAt(\n i,\n 0,\n TEXT_DECORATION_THICKNESS,\n );\n let currentDecoration = lastDecoration;\n let currentFill = lastFill;\n let currentTickness = lastTickness;\n const top = topOffset + maxHeight * (1 - this._fontSizeFraction);\n let size = this.getHeightOfChar(i, 0);\n let dy = this.getValueOfPropertyAt(i, 0, 'deltaY');\n for (let j = 0, jlen = line.length; j < jlen; j++) {\n const charBox = this.__charBounds[i][j] as Required;\n currentDecoration = this.getValueOfPropertyAt(i, j, type);\n currentFill = this.getValueOfPropertyAt(i, j, FILL);\n currentTickness = this.getValueOfPropertyAt(\n i,\n j,\n TEXT_DECORATION_THICKNESS,\n );\n const currentSize = this.getHeightOfChar(i, j);\n const currentDy = this.getValueOfPropertyAt(i, j, 'deltaY');\n if (path && currentDecoration && currentFill) {\n const finalTickness = (this.fontSize * currentTickness) / 1000;\n ctx.save();\n // bug? verify lastFill is a valid fill here.\n ctx.fillStyle = lastFill as string;\n ctx.translate(charBox.renderLeft, charBox.renderTop);\n ctx.rotate(charBox.angle);\n ctx.fillRect(\n -charBox.kernedWidth / 2,\n offsetY * currentSize + currentDy - offsetAligner * finalTickness,\n charBox.kernedWidth,\n finalTickness,\n );\n ctx.restore();\n } else if (\n (currentDecoration !== lastDecoration ||\n currentFill !== lastFill ||\n currentSize !== size ||\n currentTickness !== lastTickness ||\n currentDy !== dy) &&\n boxWidth > 0\n ) {\n const finalTickness = (this.fontSize * lastTickness) / 1000;\n let drawStart = leftOffset + lineLeftOffset + boxStart;\n if (this.direction === 'rtl') {\n drawStart = this.width - drawStart - boxWidth;\n }\n if (lastDecoration && lastFill && lastTickness) {\n // bug? verify lastFill is a valid fill here.\n ctx.fillStyle = lastFill as string;\n ctx.fillRect(\n drawStart,\n top + offsetY * size + dy - offsetAligner * finalTickness,\n boxWidth,\n finalTickness,\n );\n }\n boxStart = charBox.left;\n boxWidth = charBox.width;\n lastDecoration = currentDecoration;\n lastTickness = currentTickness;\n lastFill = currentFill;\n size = currentSize;\n dy = currentDy;\n } else {\n boxWidth += charBox.kernedWidth;\n }\n }\n let drawStart = leftOffset + lineLeftOffset + boxStart;\n if (this.direction === 'rtl') {\n drawStart = this.width - drawStart - boxWidth;\n }\n ctx.fillStyle = currentFill as string;\n const finalTickness = (this.fontSize * currentTickness) / 1000;\n currentDecoration &&\n currentFill &&\n currentTickness &&\n ctx.fillRect(\n drawStart,\n top + offsetY * size + dy - offsetAligner * finalTickness,\n boxWidth - charSpacing,\n finalTickness,\n );\n topOffset += heightOfLine;\n }\n // if there is text background color no\n // other shadows should be casted\n this._removeShadow(ctx);\n }\n\n /**\n * return font declaration string for canvas context\n * @param {Object} [styleObject] object\n * @returns {String} font declaration formatted for canvas context.\n */\n _getFontDeclaration(\n {\n fontFamily = this.fontFamily,\n fontStyle = this.fontStyle,\n fontWeight = this.fontWeight,\n fontSize = this.fontSize,\n }: Partial<\n Pick<\n TextStyleDeclaration,\n 'fontFamily' | 'fontStyle' | 'fontWeight' | 'fontSize'\n >\n > = {},\n forMeasuring?: boolean,\n ): string {\n const parsedFontFamily =\n fontFamily.includes(\"'\") ||\n fontFamily.includes('\"') ||\n fontFamily.includes(',') ||\n FabricText.genericFonts.includes(fontFamily.toLowerCase())\n ? fontFamily\n : `\"${fontFamily}\"`;\n return [\n fontStyle,\n fontWeight,\n `${forMeasuring ? this.CACHE_FONT_SIZE : fontSize}px`,\n parsedFontFamily,\n ].join(' ');\n }\n\n /**\n * Renders text instance on a specified context\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n render(ctx: CanvasRenderingContext2D) {\n if (!this.visible) {\n return;\n }\n if (\n this.canvas &&\n this.canvas.skipOffscreen &&\n !this.group &&\n !this.isOnScreen()\n ) {\n return;\n }\n if (this._forceClearCache) {\n this.initDimensions();\n }\n super.render(ctx);\n }\n\n /**\n * Override this method to customize grapheme splitting\n * @todo the util `graphemeSplit` needs to be injectable in some way.\n * is more comfortable to inject the correct util rather than having to override text\n * in the middle of the prototype chain\n * @param {string} value\n * @returns {string[]} array of graphemes\n */\n graphemeSplit(value: string): string[] {\n return graphemeSplit(value);\n }\n\n /**\n * Returns the text as an array of lines.\n * @param {String} text text to split\n * @returns Lines in the text\n */\n _splitTextIntoLines(text: string): TextLinesInfo {\n const lines = text.split(this._reNewline),\n newLines = new Array(lines.length),\n newLine = ['\\n'];\n let newText: string[] = [];\n for (let i = 0; i < lines.length; i++) {\n newLines[i] = this.graphemeSplit(lines[i]);\n newText = newText.concat(newLines[i], newLine);\n }\n newText.pop();\n return {\n _unwrappedLines: newLines,\n lines: lines,\n graphemeText: newText,\n graphemeLines: newLines,\n };\n }\n\n /**\n * Returns object representation of an instance\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} Object representation of an instance\n */\n toObject<\n T extends Omit, keyof SProps>,\n K extends keyof T = never,\n >(propertiesToInclude: K[] = []): Pick & SProps {\n return {\n ...super.toObject([...additionalProps, ...propertiesToInclude] as K[]),\n styles: stylesToArray(this.styles, this.text),\n ...(this.path ? { path: this.path.toObject() } : {}),\n };\n }\n\n set(key: string | any, value?: any) {\n const { textLayoutProperties } = this.constructor as typeof FabricText;\n super.set(key, value);\n let needsDims = false;\n let isAddingPath = false;\n if (typeof key === 'object') {\n for (const _key in key) {\n if (_key === 'path') {\n this.setPathInfo();\n }\n needsDims = needsDims || textLayoutProperties.includes(_key);\n isAddingPath = isAddingPath || _key === 'path';\n }\n } else {\n needsDims = textLayoutProperties.includes(key);\n isAddingPath = key === 'path';\n }\n if (isAddingPath) {\n this.setPathInfo();\n }\n if (needsDims && this.initialized) {\n this.initDimensions();\n this.setCoords();\n }\n return this;\n }\n\n /**\n * Returns complexity of an instance\n * @return {Number} complexity\n */\n complexity(): number {\n return 1;\n }\n\n /**\n * List of generic font families\n * @see https://developer.mozilla.org/en-US/docs/Web/CSS/font-family#generic-name\n */\n static genericFonts = [\n 'serif',\n 'sans-serif',\n 'monospace',\n 'cursive',\n 'fantasy',\n 'system-ui',\n 'ui-serif',\n 'ui-sans-serif',\n 'ui-monospace',\n 'ui-rounded',\n 'math',\n 'emoji',\n 'fangsong',\n ];\n\n /* _FROM_SVG_START_ */\n\n /**\n * List of attribute names to account for when parsing SVG element (used by {@link FabricText.fromElement})\n * @see: http://www.w3.org/TR/SVG/text.html#TextElement\n */\n static ATTRIBUTE_NAMES = SHARED_ATTRIBUTES.concat(\n 'x',\n 'y',\n 'dx',\n 'dy',\n 'font-family',\n 'font-style',\n 'font-weight',\n 'font-size',\n 'letter-spacing',\n 'text-decoration',\n 'text-anchor',\n );\n\n /**\n * Returns FabricText instance from an SVG element (not yet implemented)\n * @param {HTMLElement} element Element to parse\n * @param {Object} [options] Options object\n */\n static async fromElement(\n element: HTMLElement | SVGElement,\n options?: Abortable,\n cssRules?: CSSRules,\n ) {\n const parsedAttributes = parseAttributes(\n element,\n FabricText.ATTRIBUTE_NAMES,\n cssRules,\n );\n\n const {\n textAnchor = LEFT as typeof LEFT | typeof CENTER | typeof RIGHT,\n textDecoration = '',\n dx = 0,\n dy = 0,\n top = 0,\n left = 0,\n fontSize = DEFAULT_SVG_FONT_SIZE,\n strokeWidth = 1,\n ...restOfOptions\n } = { ...options, ...parsedAttributes };\n\n const textContent = (element.textContent || '')\n .replace(/^\\s+|\\s+$|\\n+/g, '')\n .replace(/\\s+/g, ' ');\n\n // this code here is probably the usual issue for SVG center find\n // this can later looked at again and probably removed.\n\n const text = new this(textContent, {\n left: left + dx,\n top: top + dy,\n underline: textDecoration.includes('underline'),\n overline: textDecoration.includes('overline'),\n linethrough: textDecoration.includes('line-through'),\n // we initialize this as 0\n strokeWidth: 0,\n fontSize,\n ...restOfOptions,\n }),\n textHeightScaleFactor = text.getScaledHeight() / text.height,\n lineHeightDiff =\n (text.height + text.strokeWidth) * text.lineHeight - text.height,\n scaledDiff = lineHeightDiff * textHeightScaleFactor,\n textHeight = text.getScaledHeight() + scaledDiff;\n\n let offX = 0;\n /*\n Adjust positioning:\n x/y attributes in SVG correspond to the bottom-left corner of text bounding box\n fabric output by default at top, left.\n */\n if (textAnchor === CENTER) {\n offX = text.getScaledWidth() / 2;\n }\n if (textAnchor === RIGHT) {\n offX = text.getScaledWidth();\n }\n text.set({\n left: text.left - offX,\n top:\n text.top -\n (textHeight - text.fontSize * (0.07 + text._fontSizeFraction)) /\n text.lineHeight,\n strokeWidth,\n });\n return text;\n }\n\n /* _FROM_SVG_END_ */\n\n /**\n * Returns FabricText instance from an object representation\n * @param {Object} object plain js Object to create an instance from\n * @returns {Promise}\n */\n static fromObject<\n T extends TOptions,\n S extends FabricText,\n >(object: T) {\n return this._fromObject(\n {\n ...object,\n styles: stylesFromArray(object.styles || {}, object.text),\n },\n {\n extraParam: 'text',\n },\n );\n }\n}\n\napplyMixins(FabricText, [TextSVGExportMixin]);\nclassRegistry.setClass(FabricText);\nclassRegistry.setSVGClass(FabricText);\n","import type {\n DragEventData,\n DropEventData,\n TPointerEvent,\n} from '../../EventTypeDefs';\nimport { Point } from '../../Point';\nimport type { IText } from './IText';\nimport { setStyle } from '../../util/internals/dom_style';\nimport { cloneStyles } from '../../util/internals/cloneStyles';\nimport type { TextStyleDeclaration } from '../Text/StyledText';\nimport { getDocumentFromElement } from '../../util/dom_misc';\nimport { CHANGED, NONE } from '../../constants';\n\n/**\n * #### Dragging IText/Textbox Lifecycle\n * - {@link start} is called from `mousedown` {@link IText#_mouseDownHandler} and determines if dragging should start by testing {@link isPointerOverSelection}\n * - if true `mousedown` {@link IText#_mouseDownHandler} is blocked to keep selection\n * - if the pointer moves, canvas fires numerous mousemove {@link Canvas#_onMouseMove} that we make sure **aren't** prevented ({@link IText#shouldStartDragging}) in order for the window to start a drag session\n * - once/if the session starts canvas calls {@link onDragStart} on the active object to determine if dragging should occur\n * - canvas fires relevant drag events that are handled by the handlers defined in this scope\n * - {@link end} is called from `mouseup` {@link IText#mouseUpHandler}, blocking IText default click behavior\n * - in case the drag session didn't occur, {@link end} handles a click, since logic to do so was blocked during `mousedown`\n */\nexport class DraggableTextDelegate {\n readonly target: IText;\n private __mouseDownInPlace = false;\n private __dragStartFired = false;\n private __isDraggingOver = false;\n private __dragStartSelection?: {\n selectionStart: number;\n selectionEnd: number;\n };\n private __dragImageDisposer?: VoidFunction;\n private _dispose?: () => void;\n\n constructor(target: IText) {\n this.target = target;\n const disposers = [\n this.target.on('dragenter', this.dragEnterHandler.bind(this)),\n this.target.on('dragover', this.dragOverHandler.bind(this)),\n this.target.on('dragleave', this.dragLeaveHandler.bind(this)),\n this.target.on('dragend', this.dragEndHandler.bind(this)),\n this.target.on('drop', this.dropHandler.bind(this)),\n ];\n this._dispose = () => {\n disposers.forEach((d) => d());\n this._dispose = undefined;\n };\n }\n\n isPointerOverSelection(e: TPointerEvent) {\n const target = this.target;\n const newSelection = target.getSelectionStartFromPointer(e);\n return (\n target.isEditing &&\n newSelection >= target.selectionStart &&\n newSelection <= target.selectionEnd &&\n target.selectionStart < target.selectionEnd\n );\n }\n\n /**\n * @public override this method to disable dragging and default to mousedown logic\n */\n start(e: TPointerEvent) {\n return (this.__mouseDownInPlace = this.isPointerOverSelection(e));\n }\n\n /**\n * @public override this method to disable dragging without discarding selection\n */\n isActive() {\n return this.__mouseDownInPlace;\n }\n\n /**\n * Ends interaction and sets cursor in case of a click\n * @returns true if was active\n */\n end(e: TPointerEvent) {\n const active = this.isActive();\n if (active && !this.__dragStartFired) {\n // mousedown has been blocked since `active` is true => cursor has not been set.\n // `__dragStartFired` is false => dragging didn't occur, pointer didn't move and is over selection.\n // meaning this is actually a click, `active` is a false positive.\n this.target.setCursorByClick(e);\n this.target.initDelayedCursor(true);\n }\n this.__mouseDownInPlace = false;\n this.__dragStartFired = false;\n this.__isDraggingOver = false;\n return active;\n }\n\n getDragStartSelection() {\n return this.__dragStartSelection;\n }\n\n /**\n * Override to customize the drag image\n * https://developer.mozilla.org/en-US/docs/Web/API/DataTransfer/setDragImage\n */\n setDragImage(\n e: DragEvent,\n {\n selectionStart,\n selectionEnd,\n }: {\n selectionStart: number;\n selectionEnd: number;\n },\n ) {\n const target = this.target;\n const canvas = target.canvas!;\n const flipFactor = new Point(target.flipX ? -1 : 1, target.flipY ? -1 : 1);\n const boundaries = target._getCursorBoundaries(selectionStart);\n const selectionPosition = new Point(\n boundaries.left + boundaries.leftOffset,\n boundaries.top + boundaries.topOffset,\n ).multiply(flipFactor);\n const pos = selectionPosition.transform(target.calcTransformMatrix());\n const pointer = canvas.getScenePoint(e);\n const diff = pointer.subtract(pos);\n const retinaScaling = target.getCanvasRetinaScaling();\n const bbox = target.getBoundingRect();\n const correction = pos.subtract(new Point(bbox.left, bbox.top));\n const vpt = canvas.viewportTransform;\n const offset = correction.add(diff).transform(vpt, true);\n // prepare instance for drag image snapshot by making all non selected text invisible\n const bgc = target.backgroundColor;\n const styles = cloneStyles(target.styles);\n target.backgroundColor = '';\n const styleOverride = {\n stroke: 'transparent',\n fill: 'transparent',\n textBackgroundColor: 'transparent',\n };\n target.setSelectionStyles(styleOverride, 0, selectionStart);\n target.setSelectionStyles(styleOverride, selectionEnd, target.text.length);\n target.dirty = true;\n const dragImage = target.toCanvasElement({\n enableRetinaScaling: canvas.enableRetinaScaling,\n viewportTransform: true,\n });\n // restore values\n target.backgroundColor = bgc;\n target.styles = styles;\n target.dirty = true;\n // position drag image offscreen\n setStyle(dragImage, {\n position: 'fixed',\n left: `${-dragImage.width}px`,\n border: NONE,\n width: `${dragImage.width / retinaScaling}px`,\n height: `${dragImage.height / retinaScaling}px`,\n });\n this.__dragImageDisposer && this.__dragImageDisposer();\n this.__dragImageDisposer = () => {\n dragImage.remove();\n };\n getDocumentFromElement(\n (e.target || this.target.hiddenTextarea)! as HTMLElement,\n ).body.appendChild(dragImage);\n e.dataTransfer?.setDragImage(dragImage, offset.x, offset.y);\n }\n\n /**\n * @returns {boolean} determines whether {@link target} should/shouldn't become a drag source\n */\n onDragStart(e: DragEvent): boolean {\n this.__dragStartFired = true;\n const target = this.target;\n const active = this.isActive();\n if (active && e.dataTransfer) {\n const selection = (this.__dragStartSelection = {\n selectionStart: target.selectionStart,\n selectionEnd: target.selectionEnd,\n });\n const value = target._text\n .slice(selection.selectionStart, selection.selectionEnd)\n .join('');\n const data = { text: target.text, value, ...selection };\n e.dataTransfer.setData('text/plain', value);\n e.dataTransfer.setData(\n 'application/fabric',\n JSON.stringify({\n value: value,\n styles: target.getSelectionStyles(\n selection.selectionStart,\n selection.selectionEnd,\n true,\n ),\n }),\n );\n e.dataTransfer.effectAllowed = 'copyMove';\n this.setDragImage(e, data);\n }\n target.abortCursorAnimation();\n return active;\n }\n\n /**\n * use {@link targetCanDrop} to respect overriding\n * @returns {boolean} determines whether {@link target} should/shouldn't become a drop target\n */\n canDrop(e: DragEvent): boolean {\n if (\n this.target.editable &&\n !this.target.getActiveControl() &&\n !e.defaultPrevented\n ) {\n if (this.isActive() && this.__dragStartSelection) {\n // drag source trying to drop over itself\n // allow dropping only outside of drag start selection\n const index = this.target.getSelectionStartFromPointer(e);\n const dragStartSelection = this.__dragStartSelection;\n return (\n index < dragStartSelection.selectionStart ||\n index > dragStartSelection.selectionEnd\n );\n }\n return true;\n }\n return false;\n }\n\n /**\n * in order to respect overriding {@link IText#canDrop} we call that instead of calling {@link canDrop} directly\n */\n protected targetCanDrop(e: DragEvent) {\n return this.target.canDrop(e);\n }\n\n dragEnterHandler({ e }: DragEventData) {\n const canDrop = this.targetCanDrop(e);\n if (!this.__isDraggingOver && canDrop) {\n this.__isDraggingOver = true;\n }\n }\n\n dragOverHandler(ev: DragEventData) {\n const { e } = ev;\n const canDrop = this.targetCanDrop(e);\n if (!this.__isDraggingOver && canDrop) {\n this.__isDraggingOver = true;\n } else if (this.__isDraggingOver && !canDrop) {\n // drop state has changed\n this.__isDraggingOver = false;\n }\n if (this.__isDraggingOver) {\n // can be dropped, inform browser\n e.preventDefault();\n // inform event subscribers\n ev.canDrop = true;\n ev.dropTarget = this.target;\n }\n }\n\n dragLeaveHandler() {\n if (this.__isDraggingOver || this.isActive()) {\n this.__isDraggingOver = false;\n }\n }\n\n /**\n * Override the `text/plain | application/fabric` types of {@link DragEvent#dataTransfer}\n * in order to change the drop value or to customize styling respectively, by listening to the `drop:before` event\n * https://developer.mozilla.org/en-US/docs/Web/API/HTML_Drag_and_Drop_API/Drag_operations#performing_a_drop\n */\n dropHandler(ev: DropEventData) {\n const { e } = ev;\n const didDrop = e.defaultPrevented;\n this.__isDraggingOver = false;\n // inform browser that the drop has been accepted\n e.preventDefault();\n let insert = e.dataTransfer?.getData('text/plain');\n if (insert && !didDrop) {\n const target = this.target;\n const canvas = target.canvas!;\n let insertAt = target.getSelectionStartFromPointer(e);\n const { styles } = (\n e.dataTransfer!.types.includes('application/fabric')\n ? JSON.parse(e.dataTransfer!.getData('application/fabric'))\n : {}\n ) as { styles: TextStyleDeclaration[] };\n const trailing = insert[Math.max(0, insert.length - 1)];\n const selectionStartOffset = 0;\n // drag and drop in same instance\n if (this.__dragStartSelection) {\n const selectionStart = this.__dragStartSelection.selectionStart;\n const selectionEnd = this.__dragStartSelection.selectionEnd;\n if (insertAt > selectionStart && insertAt <= selectionEnd) {\n insertAt = selectionStart;\n } else if (insertAt > selectionEnd) {\n insertAt -= selectionEnd - selectionStart;\n }\n target.removeChars(selectionStart, selectionEnd);\n // prevent `dragend` from handling event\n delete this.__dragStartSelection;\n }\n // remove redundant line break\n if (\n target._reNewline.test(trailing) &&\n (target._reNewline.test(target._text[insertAt]) ||\n insertAt === target._text.length)\n ) {\n insert = insert.trimEnd();\n }\n // inform subscribers\n ev.didDrop = true;\n ev.dropTarget = target;\n // finalize\n target.insertChars(insert, styles, insertAt);\n // can this part be moved in an outside event? andrea to check.\n canvas.setActiveObject(target);\n target.enterEditing(e);\n target.selectionStart = Math.min(\n insertAt + selectionStartOffset,\n target._text.length,\n );\n target.selectionEnd = Math.min(\n target.selectionStart + insert.length,\n target._text.length,\n );\n target.hiddenTextarea!.value = target.text;\n target._updateTextarea();\n target.hiddenTextarea!.focus();\n target.fire(CHANGED, {\n index: insertAt + selectionStartOffset,\n action: 'drop',\n });\n canvas.fire('text:changed', { target });\n canvas.contextTopDirty = true;\n canvas.requestRenderAll();\n }\n }\n\n /**\n * fired only on the drag source after drop (if occurred)\n * handle changes to the drag source in case of a drop on another object or a cancellation\n * https://developer.mozilla.org/en-US/docs/Web/API/HTML_Drag_and_Drop_API/Drag_operations#finishing_a_drag\n */\n dragEndHandler({ e }: DragEventData) {\n if (this.isActive() && this.__dragStartFired) {\n // once the drop event finishes we check if we need to change the drag source\n // if the drag source received the drop we bail out since the drop handler has already handled logic\n if (this.__dragStartSelection) {\n const target = this.target;\n const canvas = this.target.canvas!;\n const { selectionStart, selectionEnd } = this.__dragStartSelection;\n const dropEffect = e.dataTransfer?.dropEffect || NONE;\n if (dropEffect === NONE) {\n // pointer is back over selection\n target.selectionStart = selectionStart;\n target.selectionEnd = selectionEnd;\n target._updateTextarea();\n target.hiddenTextarea!.focus();\n } else {\n target.clearContextTop();\n if (dropEffect === 'move') {\n target.removeChars(selectionStart, selectionEnd);\n target.selectionStart = target.selectionEnd = selectionStart;\n target.hiddenTextarea &&\n (target.hiddenTextarea.value = target.text);\n target._updateTextarea();\n target.fire(CHANGED, {\n index: selectionStart,\n action: 'dragend',\n });\n canvas.fire('text:changed', { target });\n canvas.requestRenderAll();\n }\n target.exitEditing();\n }\n }\n }\n\n this.__dragImageDisposer && this.__dragImageDisposer();\n delete this.__dragImageDisposer;\n delete this.__dragStartSelection;\n this.__isDraggingOver = false;\n }\n\n dispose() {\n this._dispose && this._dispose();\n }\n}\n","import type { ObjectEvents, TPointerEvent } from '../../EventTypeDefs';\nimport { Point } from '../../Point';\nimport type { FabricObject } from '../Object/FabricObject';\nimport { FabricText } from '../Text/Text';\nimport { animate } from '../../util/animation/animate';\nimport type { TOnAnimationChangeCallback } from '../../util/animation/types';\nimport type { ValueAnimation } from '../../util/animation/ValueAnimation';\nimport type { TextStyleDeclaration } from '../Text/StyledText';\nimport type { SerializedTextProps, TextProps } from '../Text/Text';\nimport type { TOptions } from '../../typedefs';\nimport { getDocumentFromElement } from '../../util/dom_misc';\nimport { LEFT, MODIFIED, RIGHT, reNewline } from '../../constants';\nimport type { IText } from './IText';\n\n/**\n * extend this regex to support non english languages\n *\n * - ` ` Matches a SPACE character (char code 32).\n * - `\\n` Matches a LINE FEED character (char code 10).\n * - `\\.` Matches a \".\" character (char code 46).\n * - `,` Matches a \",\" character (char code 44).\n * - `;` Matches a \";\" character (char code 59).\n * - `!` Matches a \"!\" character (char code 33).\n * - `\\?` Matches a \"?\" character (char code 63).\n * - `\\-` Matches a \"-\" character (char code 45).\n */\n// eslint-disable-next-line no-useless-escape\nconst reNonWord = /[ \\n\\.,;!\\?\\-]/;\n\nexport type ITextEvents = ObjectEvents & {\n 'selection:changed': never;\n changed: never | { index: number; action: string };\n 'editing:entered': never | { e: TPointerEvent };\n 'editing:exited': never;\n};\n\nexport abstract class ITextBehavior<\n Props extends TOptions = Partial,\n SProps extends SerializedTextProps = SerializedTextProps,\n EventSpec extends ITextEvents = ITextEvents,\n> extends FabricText {\n declare abstract isEditing: boolean;\n declare abstract cursorDelay: number;\n declare abstract selectionStart: number;\n declare abstract selectionEnd: number;\n declare abstract cursorDuration: number;\n declare abstract editable: boolean;\n declare abstract editingBorderColor: string;\n\n declare abstract compositionStart: number;\n declare abstract compositionEnd: number;\n\n declare abstract hiddenTextarea: HTMLTextAreaElement | null;\n\n /**\n * Helps determining when the text is in composition, so that the cursor\n * rendering is altered.\n */\n declare protected inCompositionMode: boolean;\n\n declare protected _reSpace: RegExp;\n declare private _currentTickState?: ValueAnimation;\n declare private _currentTickCompleteState?: ValueAnimation;\n protected _currentCursorOpacity = 1;\n declare private _textBeforeEdit: string;\n declare protected __selectionStartOnMouseDown: number;\n\n /**\n * Keeps track if the IText object was selected before the actual click.\n * This because we want to delay enter editing by a click.\n */\n declare protected selected: boolean;\n declare protected cursorOffsetCache: { left?: number; top?: number };\n declare protected _savedProps?: {\n hasControls: boolean;\n borderColor: string;\n lockMovementX: boolean;\n lockMovementY: boolean;\n selectable: boolean;\n hoverCursor: CSSStyleDeclaration['cursor'] | null;\n defaultCursor?: CSSStyleDeclaration['cursor'];\n moveCursor?: CSSStyleDeclaration['cursor'];\n };\n declare protected _selectionDirection: 'left' | 'right' | null;\n\n abstract initHiddenTextarea(): void;\n abstract _fireSelectionChanged(): void;\n abstract renderCursorOrSelection(): void;\n abstract getSelectionStartFromPointer(e: TPointerEvent): number;\n abstract _getCursorBoundaries(\n index: number,\n skipCaching?: boolean,\n ): {\n left: number;\n top: number;\n leftOffset: number;\n topOffset: number;\n };\n\n /**\n * Initializes all the interactive behavior of IText\n */\n initBehavior() {\n this._tick = this._tick.bind(this);\n this._onTickComplete = this._onTickComplete.bind(this);\n this.updateSelectionOnMouseMove =\n this.updateSelectionOnMouseMove.bind(this);\n }\n\n onDeselect(options?: { e?: TPointerEvent; object?: FabricObject }) {\n this.isEditing && this.exitEditing();\n this.selected = false;\n return super.onDeselect(options);\n }\n\n /**\n * @private\n */\n _animateCursor({\n toValue,\n duration,\n delay,\n onComplete,\n }: {\n toValue: number;\n duration: number;\n delay?: number;\n onComplete?: TOnAnimationChangeCallback;\n }) {\n return animate({\n startValue: this._currentCursorOpacity,\n endValue: toValue,\n duration,\n delay,\n onComplete,\n abort: () =>\n !this.canvas ||\n // we do not want to animate a selection, only cursor\n this.selectionStart !== this.selectionEnd,\n onChange: (value) => {\n this._currentCursorOpacity = value;\n this.renderCursorOrSelection();\n },\n });\n }\n\n /**\n * changes the cursor from visible to invisible\n */\n private _tick(delay?: number) {\n this._currentTickState = this._animateCursor({\n toValue: 0,\n duration: this.cursorDuration / 2,\n delay: Math.max(delay || 0, 100),\n onComplete: this._onTickComplete,\n });\n }\n\n /**\n * Changes the cursor from invisible to visible\n */\n private _onTickComplete() {\n this._currentTickCompleteState?.abort();\n this._currentTickCompleteState = this._animateCursor({\n toValue: 1,\n duration: this.cursorDuration,\n onComplete: this._tick,\n });\n }\n\n /**\n * Initializes delayed cursor\n */\n initDelayedCursor(restart?: boolean) {\n this.abortCursorAnimation();\n this._tick(restart ? 0 : this.cursorDelay);\n }\n\n /**\n * Aborts cursor animation, clears all timeouts and clear textarea context if necessary\n */\n abortCursorAnimation() {\n let shouldClear = false;\n [this._currentTickState, this._currentTickCompleteState].forEach(\n (cursorAnimation) => {\n if (cursorAnimation && !cursorAnimation.isDone()) {\n shouldClear = true;\n cursorAnimation.abort();\n }\n },\n );\n\n this._currentCursorOpacity = 1;\n\n // make sure we clear context even if instance is not editing\n if (shouldClear) {\n this.clearContextTop();\n }\n }\n\n /**\n * Restart tue cursor animation if either is in complete state ( between animations )\n * or if it never started before\n */\n restartCursorIfNeeded() {\n if (\n [this._currentTickState, this._currentTickCompleteState].some(\n (cursorAnimation) => !cursorAnimation || cursorAnimation.isDone(),\n )\n ) {\n this.initDelayedCursor();\n }\n }\n\n /**\n * Selects entire text\n */\n selectAll() {\n this.selectionStart = 0;\n this.selectionEnd = this._text.length;\n this._fireSelectionChanged();\n this._updateTextarea();\n return this;\n }\n\n /**\n * Selects entire text and updates the visual state\n */\n cmdAll() {\n this.selectAll();\n this.renderCursorOrSelection();\n }\n\n /**\n * Returns selected text\n * @return {String}\n */\n getSelectedText(): string {\n return this._text.slice(this.selectionStart, this.selectionEnd).join('');\n }\n\n /**\n * Find new selection index representing start of current word according to current selection index\n * @param {Number} startFrom Current selection index\n * @return {Number} New selection index\n */\n findWordBoundaryLeft(startFrom: number): number {\n let offset = 0,\n index = startFrom - 1;\n\n // remove space before cursor first\n if (this._reSpace.test(this._text[index])) {\n while (this._reSpace.test(this._text[index])) {\n offset++;\n index--;\n }\n }\n while (/\\S/.test(this._text[index]) && index > -1) {\n offset++;\n index--;\n }\n\n return startFrom - offset;\n }\n\n /**\n * Find new selection index representing end of current word according to current selection index\n * @param {Number} startFrom Current selection index\n * @return {Number} New selection index\n */\n findWordBoundaryRight(startFrom: number): number {\n let offset = 0,\n index = startFrom;\n\n // remove space after cursor first\n if (this._reSpace.test(this._text[index])) {\n while (this._reSpace.test(this._text[index])) {\n offset++;\n index++;\n }\n }\n while (/\\S/.test(this._text[index]) && index < this._text.length) {\n offset++;\n index++;\n }\n\n return startFrom + offset;\n }\n\n /**\n * Find new selection index representing start of current line according to current selection index\n * @param {Number} startFrom Current selection index\n * @return {Number} New selection index\n */\n findLineBoundaryLeft(startFrom: number): number {\n let offset = 0,\n index = startFrom - 1;\n\n while (!/\\n/.test(this._text[index]) && index > -1) {\n offset++;\n index--;\n }\n\n return startFrom - offset;\n }\n\n /**\n * Find new selection index representing end of current line according to current selection index\n * @param {Number} startFrom Current selection index\n * @return {Number} New selection index\n */\n findLineBoundaryRight(startFrom: number): number {\n let offset = 0,\n index = startFrom;\n\n while (!/\\n/.test(this._text[index]) && index < this._text.length) {\n offset++;\n index++;\n }\n\n return startFrom + offset;\n }\n\n /**\n * Finds index corresponding to beginning or end of a word\n * @param {Number} selectionStart Index of a character\n * @param {Number} direction 1 or -1\n * @return {Number} Index of the beginning or end of a word\n */\n searchWordBoundary(selectionStart: number, direction: 1 | -1): number {\n const text = this._text;\n // if we land on a space we move the cursor backwards\n // if we are searching boundary end we move the cursor backwards ONLY if we don't land on a line break\n let index =\n selectionStart > 0 &&\n this._reSpace.test(text[selectionStart]) &&\n (direction === -1 || !reNewline.test(text[selectionStart - 1]))\n ? selectionStart - 1\n : selectionStart,\n _char = text[index];\n while (index > 0 && index < text.length && !reNonWord.test(_char)) {\n index += direction;\n _char = text[index];\n }\n if (direction === -1 && reNonWord.test(_char)) {\n index++;\n }\n return index;\n }\n\n /**\n * Selects the word that contains the char at index selectionStart\n * @param {Number} selectionStart Index of a character\n */\n selectWord(selectionStart?: number) {\n selectionStart = selectionStart ?? this.selectionStart;\n // search backwards\n const newSelectionStart = this.searchWordBoundary(selectionStart, -1),\n // search forward\n newSelectionEnd = Math.max(\n newSelectionStart,\n this.searchWordBoundary(selectionStart, 1),\n );\n\n this.selectionStart = newSelectionStart;\n this.selectionEnd = newSelectionEnd;\n this._fireSelectionChanged();\n this._updateTextarea();\n // remove next major, for now it renders twice :(\n this.renderCursorOrSelection();\n }\n\n /**\n * Selects the line that contains selectionStart\n * @param {Number} selectionStart Index of a character\n */\n selectLine(selectionStart?: number) {\n selectionStart = selectionStart ?? this.selectionStart;\n const newSelectionStart = this.findLineBoundaryLeft(selectionStart),\n newSelectionEnd = this.findLineBoundaryRight(selectionStart);\n\n this.selectionStart = newSelectionStart;\n this.selectionEnd = newSelectionEnd;\n this._fireSelectionChanged();\n this._updateTextarea();\n }\n\n /**\n * Enters editing state\n */\n enterEditing(e?: TPointerEvent) {\n if (this.isEditing || !this.editable) {\n return;\n }\n this.enterEditingImpl();\n this.fire('editing:entered', e ? { e } : undefined);\n this._fireSelectionChanged();\n if (this.canvas) {\n this.canvas.fire('text:editing:entered', {\n target: this as unknown as IText,\n e,\n });\n this.canvas.requestRenderAll();\n }\n }\n\n /**\n * runs the actual logic that enter from editing state, see {@link enterEditing}\n */\n enterEditingImpl() {\n if (this.canvas) {\n this.canvas.calcOffset();\n this.canvas.textEditingManager.exitTextEditing();\n }\n\n this.isEditing = true;\n\n this.initHiddenTextarea();\n this.hiddenTextarea!.focus();\n this.hiddenTextarea!.value = this.text;\n this._updateTextarea();\n this._saveEditingProps();\n this._setEditingProps();\n this._textBeforeEdit = this.text;\n\n this._tick();\n }\n\n /**\n * called by {@link Canvas#textEditingManager}\n */\n updateSelectionOnMouseMove(e: TPointerEvent) {\n if (this.getActiveControl()) {\n return;\n }\n\n const el = this.hiddenTextarea!;\n // regain focus\n getDocumentFromElement(el).activeElement !== el && el.focus();\n\n const newSelectionStart = this.getSelectionStartFromPointer(e),\n currentStart = this.selectionStart,\n currentEnd = this.selectionEnd;\n if (\n (newSelectionStart !== this.__selectionStartOnMouseDown ||\n currentStart === currentEnd) &&\n (currentStart === newSelectionStart || currentEnd === newSelectionStart)\n ) {\n return;\n }\n if (newSelectionStart > this.__selectionStartOnMouseDown) {\n this.selectionStart = this.__selectionStartOnMouseDown;\n this.selectionEnd = newSelectionStart;\n } else {\n this.selectionStart = newSelectionStart;\n this.selectionEnd = this.__selectionStartOnMouseDown;\n }\n if (\n this.selectionStart !== currentStart ||\n this.selectionEnd !== currentEnd\n ) {\n this._fireSelectionChanged();\n this._updateTextarea();\n this.renderCursorOrSelection();\n }\n }\n\n /**\n * @private\n */\n _setEditingProps() {\n this.hoverCursor = 'text';\n\n if (this.canvas) {\n this.canvas.defaultCursor = this.canvas.moveCursor = 'text';\n }\n\n this.borderColor = this.editingBorderColor;\n this.hasControls = this.selectable = false;\n this.lockMovementX = this.lockMovementY = true;\n }\n\n /**\n * convert from textarea to grapheme indexes\n */\n fromStringToGraphemeSelection(start: number, end: number, text: string) {\n const smallerTextStart = text.slice(0, start),\n graphemeStart = this.graphemeSplit(smallerTextStart).length;\n if (start === end) {\n return { selectionStart: graphemeStart, selectionEnd: graphemeStart };\n }\n const smallerTextEnd = text.slice(start, end),\n graphemeEnd = this.graphemeSplit(smallerTextEnd).length;\n return {\n selectionStart: graphemeStart,\n selectionEnd: graphemeStart + graphemeEnd,\n };\n }\n\n /**\n * convert from fabric to textarea values\n */\n fromGraphemeToStringSelection(\n start: number,\n end: number,\n graphemes: string[],\n ) {\n const smallerTextStart = graphemes.slice(0, start),\n graphemeStart = smallerTextStart.join('').length;\n if (start === end) {\n return { selectionStart: graphemeStart, selectionEnd: graphemeStart };\n }\n const smallerTextEnd = graphemes.slice(start, end),\n graphemeEnd = smallerTextEnd.join('').length;\n return {\n selectionStart: graphemeStart,\n selectionEnd: graphemeStart + graphemeEnd,\n };\n }\n\n /**\n * @private\n */\n _updateTextarea() {\n this.cursorOffsetCache = {};\n if (!this.hiddenTextarea) {\n return;\n }\n if (!this.inCompositionMode) {\n const newSelection = this.fromGraphemeToStringSelection(\n this.selectionStart,\n this.selectionEnd,\n this._text,\n );\n this.hiddenTextarea.selectionStart = newSelection.selectionStart;\n this.hiddenTextarea.selectionEnd = newSelection.selectionEnd;\n }\n this.updateTextareaPosition();\n }\n\n /**\n * @private\n */\n updateFromTextArea() {\n if (!this.hiddenTextarea) {\n return;\n }\n this.cursorOffsetCache = {};\n const textarea = this.hiddenTextarea;\n this.text = textarea.value;\n this.set('dirty', true);\n this.initDimensions();\n this.setCoords();\n const newSelection = this.fromStringToGraphemeSelection(\n textarea.selectionStart,\n textarea.selectionEnd,\n textarea.value,\n );\n this.selectionEnd = this.selectionStart = newSelection.selectionEnd;\n if (!this.inCompositionMode) {\n this.selectionStart = newSelection.selectionStart;\n }\n this.updateTextareaPosition();\n }\n\n /**\n * @private\n */\n updateTextareaPosition() {\n if (this.selectionStart === this.selectionEnd) {\n const style = this._calcTextareaPosition();\n this.hiddenTextarea!.style.left = style.left;\n this.hiddenTextarea!.style.top = style.top;\n }\n }\n\n /**\n * @private\n * @return {Object} style contains style for hiddenTextarea\n */\n _calcTextareaPosition() {\n if (!this.canvas) {\n return { left: '1px', top: '1px' };\n }\n const desiredPosition = this.inCompositionMode\n ? this.compositionStart\n : this.selectionStart,\n boundaries = this._getCursorBoundaries(desiredPosition),\n cursorLocation = this.get2DCursorLocation(desiredPosition),\n lineIndex = cursorLocation.lineIndex,\n charIndex = cursorLocation.charIndex,\n charHeight =\n this.getValueOfPropertyAt(lineIndex, charIndex, 'fontSize') *\n this.lineHeight,\n leftOffset = boundaries.leftOffset,\n retinaScaling = this.getCanvasRetinaScaling(),\n upperCanvas = this.canvas.upperCanvasEl,\n upperCanvasWidth = upperCanvas.width / retinaScaling,\n upperCanvasHeight = upperCanvas.height / retinaScaling,\n maxWidth = upperCanvasWidth - charHeight,\n maxHeight = upperCanvasHeight - charHeight;\n\n const p = new Point(\n boundaries.left + leftOffset,\n boundaries.top + boundaries.topOffset + charHeight,\n )\n .transform(this.calcTransformMatrix())\n .transform(this.canvas.viewportTransform)\n .multiply(\n new Point(\n upperCanvas.clientWidth / upperCanvasWidth,\n upperCanvas.clientHeight / upperCanvasHeight,\n ),\n );\n\n if (p.x < 0) {\n p.x = 0;\n }\n if (p.x > maxWidth) {\n p.x = maxWidth;\n }\n if (p.y < 0) {\n p.y = 0;\n }\n if (p.y > maxHeight) {\n p.y = maxHeight;\n }\n\n // add canvas offset on document\n p.x += this.canvas._offset.left;\n p.y += this.canvas._offset.top;\n\n return {\n left: `${p.x}px`,\n top: `${p.y}px`,\n fontSize: `${charHeight}px`,\n charHeight: charHeight,\n };\n }\n\n /**\n * @private\n */\n _saveEditingProps() {\n this._savedProps = {\n hasControls: this.hasControls,\n borderColor: this.borderColor,\n lockMovementX: this.lockMovementX,\n lockMovementY: this.lockMovementY,\n hoverCursor: this.hoverCursor,\n selectable: this.selectable,\n defaultCursor: this.canvas && this.canvas.defaultCursor,\n moveCursor: this.canvas && this.canvas.moveCursor,\n };\n }\n\n /**\n * @private\n */\n _restoreEditingProps() {\n if (!this._savedProps) {\n return;\n }\n\n this.hoverCursor = this._savedProps.hoverCursor;\n this.hasControls = this._savedProps.hasControls;\n this.borderColor = this._savedProps.borderColor;\n this.selectable = this._savedProps.selectable;\n this.lockMovementX = this._savedProps.lockMovementX;\n this.lockMovementY = this._savedProps.lockMovementY;\n\n if (this.canvas) {\n this.canvas.defaultCursor =\n this._savedProps.defaultCursor || this.canvas.defaultCursor;\n this.canvas.moveCursor =\n this._savedProps.moveCursor || this.canvas.moveCursor;\n }\n\n delete this._savedProps;\n }\n\n /**\n * runs the actual logic that exits from editing state, see {@link exitEditing}\n * But it does not fire events\n */\n exitEditingImpl() {\n const hiddenTextarea = this.hiddenTextarea;\n this.selected = false;\n this.isEditing = false;\n\n if (hiddenTextarea) {\n hiddenTextarea.blur && hiddenTextarea.blur();\n hiddenTextarea.parentNode &&\n hiddenTextarea.parentNode.removeChild(hiddenTextarea);\n }\n this.hiddenTextarea = null;\n this.abortCursorAnimation();\n this.selectionStart !== this.selectionEnd && this.clearContextTop();\n this.selectionEnd = this.selectionStart;\n this._restoreEditingProps();\n if (this._forceClearCache) {\n this.initDimensions();\n this.setCoords();\n }\n }\n\n /**\n * Exits from editing state and fires relevant events\n */\n exitEditing() {\n const isTextChanged = this._textBeforeEdit !== this.text;\n this.exitEditingImpl();\n\n this.fire('editing:exited');\n isTextChanged && this.fire(MODIFIED);\n if (this.canvas) {\n this.canvas.fire('text:editing:exited', {\n target: this as unknown as IText,\n });\n // todo: evaluate add an action to this event\n isTextChanged && this.canvas.fire('object:modified', { target: this });\n }\n return this;\n }\n\n /**\n * @private\n */\n _removeExtraneousStyles() {\n for (const prop in this.styles) {\n if (!this._textLines[prop as unknown as number]) {\n delete this.styles[prop];\n }\n }\n }\n\n /**\n * remove and reflow a style block from start to end.\n * @param {Number} start linear start position for removal (included in removal)\n * @param {Number} end linear end position for removal ( excluded from removal )\n */\n removeStyleFromTo(start: number, end: number) {\n const { lineIndex: lineStart, charIndex: charStart } =\n this.get2DCursorLocation(start, true),\n { lineIndex: lineEnd, charIndex: charEnd } = this.get2DCursorLocation(\n end,\n true,\n );\n if (lineStart !== lineEnd) {\n // step1 remove the trailing of lineStart\n if (this.styles[lineStart]) {\n for (\n let i = charStart;\n i < this._unwrappedTextLines[lineStart].length;\n i++\n ) {\n delete this.styles[lineStart][i];\n }\n }\n // step2 move the trailing of lineEnd to lineStart if needed\n if (this.styles[lineEnd]) {\n for (\n let i = charEnd;\n i < this._unwrappedTextLines[lineEnd].length;\n i++\n ) {\n const styleObj = this.styles[lineEnd][i];\n if (styleObj) {\n this.styles[lineStart] || (this.styles[lineStart] = {});\n this.styles[lineStart][charStart + i - charEnd] = styleObj;\n }\n }\n }\n // step3 detects lines will be completely removed.\n for (let i = lineStart + 1; i <= lineEnd; i++) {\n delete this.styles[i];\n }\n // step4 shift remaining lines.\n this.shiftLineStyles(lineEnd, lineStart - lineEnd);\n } else {\n // remove and shift left on the same line\n if (this.styles[lineStart]) {\n const styleObj = this.styles[lineStart];\n const diff = charEnd - charStart;\n for (let i = charStart; i < charEnd; i++) {\n delete styleObj[i];\n }\n for (const char in this.styles[lineStart]) {\n const numericChar = parseInt(char, 10);\n if (numericChar >= charEnd) {\n styleObj[numericChar - diff] = styleObj[char];\n delete styleObj[char];\n }\n }\n }\n }\n }\n\n /**\n * Shifts line styles up or down\n * @param {Number} lineIndex Index of a line\n * @param {Number} offset Can any number?\n */\n shiftLineStyles(lineIndex: number, offset: number) {\n const clonedStyles = Object.assign({}, this.styles);\n for (const line in this.styles) {\n const numericLine = parseInt(line, 10);\n if (numericLine > lineIndex) {\n this.styles[numericLine + offset] = clonedStyles[numericLine];\n if (!clonedStyles[numericLine - offset]) {\n delete this.styles[numericLine];\n }\n }\n }\n }\n\n /**\n * Handle insertion of more consecutive style lines for when one or more\n * newlines gets added to the text. Since current style needs to be shifted\n * first we shift the current style of the number lines needed, then we add\n * new lines from the last to the first.\n * @param {Number} lineIndex Index of a line\n * @param {Number} charIndex Index of a char\n * @param {Number} qty number of lines to add\n * @param {Array} copiedStyle Array of objects styles\n */\n insertNewlineStyleObject(\n lineIndex: number,\n charIndex: number,\n qty: number,\n copiedStyle?: { [index: number]: TextStyleDeclaration },\n ) {\n const newLineStyles: { [index: number]: TextStyleDeclaration } = {};\n const originalLineLength = this._unwrappedTextLines[lineIndex].length;\n const isEndOfLine = originalLineLength === charIndex;\n\n let someStyleIsCarryingOver = false;\n qty || (qty = 1);\n this.shiftLineStyles(lineIndex, qty);\n const currentCharStyle = this.styles[lineIndex]\n ? this.styles[lineIndex][charIndex === 0 ? charIndex : charIndex - 1]\n : undefined;\n\n // we clone styles of all chars\n // after cursor onto the current line\n for (const index in this.styles[lineIndex]) {\n const numIndex = parseInt(index, 10);\n if (numIndex >= charIndex) {\n someStyleIsCarryingOver = true;\n newLineStyles[numIndex - charIndex] = this.styles[lineIndex][index];\n // remove lines from the previous line since they're on a new line now\n if (!(isEndOfLine && charIndex === 0)) {\n delete this.styles[lineIndex][index];\n }\n }\n }\n let styleCarriedOver = false;\n if (someStyleIsCarryingOver && !isEndOfLine) {\n // if is end of line, the extra style we copied\n // is probably not something we want\n this.styles[lineIndex + qty] = newLineStyles;\n styleCarriedOver = true;\n }\n if (styleCarriedOver || originalLineLength > charIndex) {\n // skip the last line of since we already prepared it.\n // or contains text without style that we don't want to style\n // just because it changed lines\n qty--;\n }\n // for the all the lines or all the other lines\n // we clone current char style onto the next (otherwise empty) line\n while (qty > 0) {\n if (copiedStyle && copiedStyle[qty - 1]) {\n this.styles[lineIndex + qty] = {\n 0: { ...copiedStyle[qty - 1] },\n };\n } else if (currentCharStyle) {\n this.styles[lineIndex + qty] = {\n 0: { ...currentCharStyle },\n };\n } else {\n delete this.styles[lineIndex + qty];\n }\n qty--;\n }\n this._forceClearCache = true;\n }\n\n /**\n * Inserts style object for a given line/char index\n * @param {Number} lineIndex Index of a line\n * @param {Number} charIndex Index of a char\n * @param {Number} quantity number Style object to insert, if given\n * @param {Array} copiedStyle array of style objects\n */\n insertCharStyleObject(\n lineIndex: number,\n charIndex: number,\n quantity: number,\n copiedStyle?: TextStyleDeclaration[],\n ) {\n if (!this.styles) {\n this.styles = {};\n }\n const currentLineStyles = this.styles[lineIndex],\n currentLineStylesCloned = currentLineStyles\n ? { ...currentLineStyles }\n : {};\n\n quantity || (quantity = 1);\n // shift all char styles by quantity forward\n // 0,1,2,3 -> (charIndex=2) -> 0,1,3,4 -> (insert 2) -> 0,1,2,3,4\n for (const index in currentLineStylesCloned) {\n const numericIndex = parseInt(index, 10);\n if (numericIndex >= charIndex) {\n currentLineStyles[numericIndex + quantity] =\n currentLineStylesCloned[numericIndex];\n // only delete the style if there was nothing moved there\n if (!currentLineStylesCloned[numericIndex - quantity]) {\n delete currentLineStyles[numericIndex];\n }\n }\n }\n this._forceClearCache = true;\n if (copiedStyle) {\n while (quantity--) {\n if (!Object.keys(copiedStyle[quantity]).length) {\n continue;\n }\n if (!this.styles[lineIndex]) {\n this.styles[lineIndex] = {};\n }\n this.styles[lineIndex][charIndex + quantity] = {\n ...copiedStyle[quantity],\n };\n }\n return;\n }\n if (!currentLineStyles) {\n return;\n }\n const newStyle = currentLineStyles[charIndex ? charIndex - 1 : 1];\n while (newStyle && quantity--) {\n this.styles[lineIndex][charIndex + quantity] = { ...newStyle };\n }\n }\n\n /**\n * Inserts style object(s)\n * @param {Array} insertedText Characters at the location where style is inserted\n * @param {Number} start cursor index for inserting style\n * @param {Array} [copiedStyle] array of style objects to insert.\n */\n insertNewStyleBlock(\n insertedText: string[],\n start: number,\n copiedStyle?: TextStyleDeclaration[],\n ) {\n const cursorLoc = this.get2DCursorLocation(start, true),\n addedLines = [0];\n let linesLength = 0;\n // get an array of how many char per lines are being added.\n for (let i = 0; i < insertedText.length; i++) {\n if (insertedText[i] === '\\n') {\n linesLength++;\n addedLines[linesLength] = 0;\n } else {\n addedLines[linesLength]++;\n }\n }\n // for the first line copy the style from the current char position.\n if (addedLines[0] > 0) {\n this.insertCharStyleObject(\n cursorLoc.lineIndex,\n cursorLoc.charIndex,\n addedLines[0],\n copiedStyle,\n );\n copiedStyle = copiedStyle && copiedStyle.slice(addedLines[0] + 1);\n }\n linesLength &&\n this.insertNewlineStyleObject(\n cursorLoc.lineIndex,\n cursorLoc.charIndex + addedLines[0],\n linesLength,\n );\n let i;\n for (i = 1; i < linesLength; i++) {\n if (addedLines[i] > 0) {\n this.insertCharStyleObject(\n cursorLoc.lineIndex + i,\n 0,\n addedLines[i],\n copiedStyle,\n );\n } else if (copiedStyle) {\n // this test is required in order to close #6841\n // when a pasted buffer begins with a newline then\n // this.styles[cursorLoc.lineIndex + i] and copiedStyle[0]\n // may be undefined for some reason\n if (this.styles[cursorLoc.lineIndex + i] && copiedStyle[0]) {\n this.styles[cursorLoc.lineIndex + i][0] = copiedStyle[0];\n }\n }\n copiedStyle = copiedStyle && copiedStyle.slice(addedLines[i] + 1);\n }\n if (addedLines[i] > 0) {\n this.insertCharStyleObject(\n cursorLoc.lineIndex + i,\n 0,\n addedLines[i],\n copiedStyle,\n );\n }\n }\n\n /**\n * Removes characters from start/end\n * start/end ar per grapheme position in _text array.\n *\n * @param {Number} start\n * @param {Number} end default to start + 1\n */\n removeChars(start: number, end: number = start + 1) {\n this.removeStyleFromTo(start, end);\n this._text.splice(start, end - start);\n this.text = this._text.join('');\n this.set('dirty', true);\n this.initDimensions();\n this.setCoords();\n this._removeExtraneousStyles();\n }\n\n /**\n * insert characters at start position, before start position.\n * start equal 1 it means the text get inserted between actual grapheme 0 and 1\n * if style array is provided, it must be as the same length of text in graphemes\n * if end is provided and is bigger than start, old text is replaced.\n * start/end ar per grapheme position in _text array.\n *\n * @param {String} text text to insert\n * @param {Array} style array of style objects\n * @param {Number} start\n * @param {Number} end default to start + 1\n */\n insertChars(\n text: string,\n style: TextStyleDeclaration[] | undefined,\n start: number,\n end: number = start,\n ) {\n if (end > start) {\n this.removeStyleFromTo(start, end);\n }\n const graphemes = this.graphemeSplit(text);\n this.insertNewStyleBlock(graphemes, start, style);\n this._text = [\n ...this._text.slice(0, start),\n ...graphemes,\n ...this._text.slice(end),\n ];\n this.text = this._text.join('');\n this.set('dirty', true);\n this.initDimensions();\n this.setCoords();\n this._removeExtraneousStyles();\n }\n\n /**\n * Set the selectionStart and selectionEnd according to the new position of cursor\n * mimic the key - mouse navigation when shift is pressed.\n */\n setSelectionStartEndWithShift(\n start: number,\n end: number,\n newSelection: number,\n ) {\n if (newSelection <= start) {\n if (end === start) {\n this._selectionDirection = LEFT;\n } else if (this._selectionDirection === RIGHT) {\n this._selectionDirection = LEFT;\n this.selectionEnd = start;\n }\n this.selectionStart = newSelection;\n } else if (newSelection > start && newSelection < end) {\n if (this._selectionDirection === RIGHT) {\n this.selectionEnd = newSelection;\n } else {\n this.selectionStart = newSelection;\n }\n } else {\n // newSelection is > selection start and end\n if (end === start) {\n this._selectionDirection = RIGHT;\n } else if (this._selectionDirection === LEFT) {\n this._selectionDirection = RIGHT;\n this.selectionStart = end;\n }\n this.selectionEnd = newSelection;\n }\n }\n}\n","import { config } from '../../config';\nimport { getFabricDocument, getEnv } from '../../env';\nimport { capValue } from '../../util/misc/capValue';\nimport type { ITextEvents } from './ITextBehavior';\nimport { ITextBehavior } from './ITextBehavior';\nimport type { TKeyMapIText } from './constants';\nimport type { TOptions } from '../../typedefs';\nimport type { TextProps, SerializedTextProps } from '../Text/Text';\nimport { getDocumentFromElement } from '../../util/dom_misc';\nimport { CHANGED, LEFT, RIGHT } from '../../constants';\nimport type { IText } from './IText';\nimport type { TextStyleDeclaration } from '../Text/StyledText';\n\nexport abstract class ITextKeyBehavior<\n Props extends TOptions = Partial,\n SProps extends SerializedTextProps = SerializedTextProps,\n EventSpec extends ITextEvents = ITextEvents,\n> extends ITextBehavior {\n /**\n * For functionalities on keyDown\n * Map a special key to a function of the instance/prototype\n * If you need different behavior for ESC or TAB or arrows, you have to change\n * this map setting the name of a function that you build on the IText or\n * your prototype.\n * the map change will affect all Instances unless you need for only some text Instances\n * in that case you have to clone this object and assign your Instance.\n * this.keysMap = Object.assign({}, this.keysMap);\n * The function must be in IText.prototype.myFunction And will receive event as args[0]\n */\n declare keysMap: TKeyMapIText;\n\n declare keysMapRtl: TKeyMapIText;\n\n /**\n * For functionalities on keyUp + ctrl || cmd\n */\n declare ctrlKeysMapUp: TKeyMapIText;\n\n /**\n * For functionalities on keyDown + ctrl || cmd\n */\n declare ctrlKeysMapDown: TKeyMapIText;\n\n declare hiddenTextarea: HTMLTextAreaElement | null;\n\n /**\n * DOM container to append the hiddenTextarea.\n * An alternative to attaching to the document.body.\n * Useful to reduce laggish redraw of the full document.body tree and\n * also with modals event capturing that won't let the textarea take focus.\n * @type HTMLElement\n */\n declare hiddenTextareaContainer?: HTMLElement | null;\n\n declare private _clickHandlerInitialized: boolean;\n declare private _copyDone: boolean;\n declare private fromPaste: boolean;\n\n /**\n * Initializes hidden textarea (needed to bring up keyboard in iOS)\n */\n initHiddenTextarea() {\n const doc =\n (this.canvas && getDocumentFromElement(this.canvas.getElement())) ||\n getFabricDocument();\n const textarea = doc.createElement('textarea');\n Object.entries({\n autocapitalize: 'off',\n autocorrect: 'off',\n autocomplete: 'off',\n spellcheck: 'false',\n 'data-fabric': 'textarea',\n wrap: 'off',\n }).map(([attribute, value]) => textarea.setAttribute(attribute, value));\n const { top, left, fontSize } = this._calcTextareaPosition();\n // line-height: 1px; was removed from the style to fix this:\n // https://bugs.chromium.org/p/chromium/issues/detail?id=870966\n textarea.style.cssText = `position: absolute; top: ${top}; left: ${left}; z-index: -999; opacity: 0; width: 1px; height: 1px; font-size: 1px; padding-top: ${fontSize};`;\n\n (this.hiddenTextareaContainer || doc.body).appendChild(textarea);\n\n Object.entries({\n blur: 'blur',\n keydown: 'onKeyDown',\n keyup: 'onKeyUp',\n input: 'onInput',\n copy: 'copy',\n cut: 'copy',\n paste: 'paste',\n compositionstart: 'onCompositionStart',\n compositionupdate: 'onCompositionUpdate',\n compositionend: 'onCompositionEnd',\n } as Record).map(([eventName, handler]) =>\n textarea.addEventListener(\n eventName,\n (this[handler] as EventListener).bind(this),\n ),\n );\n this.hiddenTextarea = textarea;\n }\n\n /**\n * Override this method to customize cursor behavior on textbox blur\n */\n blur() {\n this.abortCursorAnimation();\n }\n\n /**\n * Handles keydown event\n * only used for arrows and combination of modifier keys.\n * @param {KeyboardEvent} e Event object\n */\n onKeyDown(e: KeyboardEvent) {\n if (!this.isEditing) {\n return;\n }\n const keyMap = this.direction === 'rtl' ? this.keysMapRtl : this.keysMap;\n if (e.keyCode in keyMap) {\n (this[keyMap[e.keyCode] as keyof this] as (arg: KeyboardEvent) => void)(\n e,\n );\n } else if (e.keyCode in this.ctrlKeysMapDown && (e.ctrlKey || e.metaKey)) {\n (\n this[this.ctrlKeysMapDown[e.keyCode] as keyof this] as (\n arg: KeyboardEvent,\n ) => void\n )(e);\n } else {\n return;\n }\n e.stopImmediatePropagation();\n e.preventDefault();\n if (e.keyCode >= 33 && e.keyCode <= 40) {\n // if i press an arrow key just update selection\n this.inCompositionMode = false;\n this.clearContextTop();\n this.renderCursorOrSelection();\n } else {\n this.canvas && this.canvas.requestRenderAll();\n }\n }\n\n /**\n * Handles keyup event\n * We handle KeyUp because ie11 and edge have difficulties copy/pasting\n * if a copy/cut event fired, keyup is dismissed\n * @param {KeyboardEvent} e Event object\n */\n onKeyUp(e: KeyboardEvent) {\n if (!this.isEditing || this._copyDone || this.inCompositionMode) {\n this._copyDone = false;\n return;\n }\n if (e.keyCode in this.ctrlKeysMapUp && (e.ctrlKey || e.metaKey)) {\n (\n this[this.ctrlKeysMapUp[e.keyCode] as keyof this] as (\n arg: KeyboardEvent,\n ) => void\n )(e);\n } else {\n return;\n }\n e.stopImmediatePropagation();\n e.preventDefault();\n this.canvas && this.canvas.requestRenderAll();\n }\n\n /**\n * Handles onInput event\n * @param {Event} e Event object\n */\n onInput(this: this & { hiddenTextarea: HTMLTextAreaElement }, e: Event) {\n const fromPaste = this.fromPaste;\n const { value, selectionStart, selectionEnd } = this.hiddenTextarea;\n this.fromPaste = false;\n e && e.stopPropagation();\n if (!this.isEditing) {\n return;\n }\n const updateAndFire = () => {\n this.updateFromTextArea();\n this.fire(CHANGED);\n if (this.canvas) {\n this.canvas.fire('text:changed', { target: this as unknown as IText });\n this.canvas.requestRenderAll();\n }\n };\n if (this.hiddenTextarea.value === '') {\n this.styles = {};\n updateAndFire();\n return;\n }\n // decisions about style changes.\n const nextText = this._splitTextIntoLines(value).graphemeText,\n charCount = this._text.length,\n nextCharCount = nextText.length,\n _selectionStart = this.selectionStart,\n _selectionEnd = this.selectionEnd,\n selection = _selectionStart !== _selectionEnd;\n let copiedStyle: TextStyleDeclaration[] | undefined,\n removedText,\n charDiff = nextCharCount - charCount,\n removeFrom,\n removeTo;\n\n const textareaSelection = this.fromStringToGraphemeSelection(\n selectionStart,\n selectionEnd,\n value,\n );\n const backDelete = _selectionStart > textareaSelection.selectionStart;\n\n if (selection) {\n removedText = this._text.slice(_selectionStart, _selectionEnd);\n charDiff += _selectionEnd - _selectionStart;\n } else if (nextCharCount < charCount) {\n if (backDelete) {\n removedText = this._text.slice(_selectionEnd + charDiff, _selectionEnd);\n } else {\n removedText = this._text.slice(\n _selectionStart,\n _selectionStart - charDiff,\n );\n }\n }\n const insertedText = nextText.slice(\n textareaSelection.selectionEnd - charDiff,\n textareaSelection.selectionEnd,\n );\n if (removedText && removedText.length) {\n if (insertedText.length) {\n // let's copy some style before deleting.\n // we want to copy the style before the cursor OR the style at the cursor if selection\n // is bigger than 0.\n copiedStyle = this.getSelectionStyles(\n _selectionStart,\n _selectionStart + 1,\n false,\n );\n // now duplicate the style one for each inserted text.\n copiedStyle = insertedText.map(\n () =>\n // this return an array of references, but that is fine since we are\n // copying the style later.\n copiedStyle![0],\n );\n }\n if (selection) {\n removeFrom = _selectionStart;\n removeTo = _selectionEnd;\n } else if (backDelete) {\n // detect differences between forwardDelete and backDelete\n removeFrom = _selectionEnd - removedText.length;\n removeTo = _selectionEnd;\n } else {\n removeFrom = _selectionEnd;\n removeTo = _selectionEnd + removedText.length;\n }\n this.removeStyleFromTo(removeFrom, removeTo);\n }\n if (insertedText.length) {\n const { copyPasteData } = getEnv();\n if (\n fromPaste &&\n insertedText.join('') === copyPasteData.copiedText &&\n !config.disableStyleCopyPaste\n ) {\n copiedStyle = copyPasteData.copiedTextStyle;\n }\n this.insertNewStyleBlock(insertedText, _selectionStart, copiedStyle);\n }\n updateAndFire();\n }\n\n /**\n * Composition start\n */\n onCompositionStart() {\n this.inCompositionMode = true;\n }\n\n /**\n * Composition end\n */\n onCompositionEnd() {\n this.inCompositionMode = false;\n }\n\n onCompositionUpdate({ target }: CompositionEvent) {\n const { selectionStart, selectionEnd } = target as HTMLTextAreaElement;\n this.compositionStart = selectionStart;\n this.compositionEnd = selectionEnd;\n this.updateTextareaPosition();\n }\n\n /**\n * Copies selected text\n */\n copy() {\n if (this.selectionStart === this.selectionEnd) {\n //do not cut-copy if no selection\n return;\n }\n const { copyPasteData } = getEnv();\n copyPasteData.copiedText = this.getSelectedText();\n if (!config.disableStyleCopyPaste) {\n copyPasteData.copiedTextStyle = this.getSelectionStyles(\n this.selectionStart,\n this.selectionEnd,\n true,\n );\n } else {\n copyPasteData.copiedTextStyle = undefined;\n }\n this._copyDone = true;\n }\n\n /**\n * Pastes text\n */\n paste() {\n this.fromPaste = true;\n }\n\n /**\n * Finds the width in pixels before the cursor on the same line\n * @private\n * @param {Number} lineIndex\n * @param {Number} charIndex\n * @return {Number} widthBeforeCursor width before cursor\n */\n _getWidthBeforeCursor(lineIndex: number, charIndex: number): number {\n let widthBeforeCursor = this._getLineLeftOffset(lineIndex),\n bound;\n\n if (charIndex > 0) {\n bound = this.__charBounds[lineIndex][charIndex - 1];\n widthBeforeCursor += bound.left + bound.width;\n }\n return widthBeforeCursor;\n }\n\n /**\n * Gets start offset of a selection\n * @param {KeyboardEvent} e Event object\n * @param {Boolean} isRight\n * @return {Number}\n */\n getDownCursorOffset(e: KeyboardEvent, isRight: boolean): number {\n const selectionProp = this._getSelectionForOffset(e, isRight),\n cursorLocation = this.get2DCursorLocation(selectionProp),\n lineIndex = cursorLocation.lineIndex;\n // if on last line, down cursor goes to end of line\n if (\n lineIndex === this._textLines.length - 1 ||\n e.metaKey ||\n e.keyCode === 34\n ) {\n // move to the end of a text\n return this._text.length - selectionProp;\n }\n const charIndex = cursorLocation.charIndex,\n widthBeforeCursor = this._getWidthBeforeCursor(lineIndex, charIndex),\n indexOnOtherLine = this._getIndexOnLine(lineIndex + 1, widthBeforeCursor),\n textAfterCursor = this._textLines[lineIndex].slice(charIndex);\n return (\n textAfterCursor.length +\n indexOnOtherLine +\n 1 +\n this.missingNewlineOffset(lineIndex)\n );\n }\n\n /**\n * private\n * Helps finding if the offset should be counted from Start or End\n * @param {KeyboardEvent} e Event object\n * @param {Boolean} isRight\n * @return {Number}\n */\n _getSelectionForOffset(e: KeyboardEvent, isRight: boolean): number {\n if (e.shiftKey && this.selectionStart !== this.selectionEnd && isRight) {\n return this.selectionEnd;\n } else {\n return this.selectionStart;\n }\n }\n\n /**\n * @param {KeyboardEvent} e Event object\n * @param {Boolean} isRight\n * @return {Number}\n */\n getUpCursorOffset(e: KeyboardEvent, isRight: boolean): number {\n const selectionProp = this._getSelectionForOffset(e, isRight),\n cursorLocation = this.get2DCursorLocation(selectionProp),\n lineIndex = cursorLocation.lineIndex;\n if (lineIndex === 0 || e.metaKey || e.keyCode === 33) {\n // if on first line, up cursor goes to start of line\n return -selectionProp;\n }\n const charIndex = cursorLocation.charIndex,\n widthBeforeCursor = this._getWidthBeforeCursor(lineIndex, charIndex),\n indexOnOtherLine = this._getIndexOnLine(lineIndex - 1, widthBeforeCursor),\n textBeforeCursor = this._textLines[lineIndex].slice(0, charIndex),\n missingNewlineOffset = this.missingNewlineOffset(lineIndex - 1);\n // return a negative offset\n return (\n -this._textLines[lineIndex - 1].length +\n indexOnOtherLine -\n textBeforeCursor.length +\n (1 - missingNewlineOffset)\n );\n }\n\n /**\n * for a given width it founds the matching character.\n * @private\n */\n _getIndexOnLine(lineIndex: number, width: number) {\n const line = this._textLines[lineIndex],\n lineLeftOffset = this._getLineLeftOffset(lineIndex);\n let widthOfCharsOnLine = lineLeftOffset,\n indexOnLine = 0,\n charWidth,\n foundMatch;\n\n for (let j = 0, jlen = line.length; j < jlen; j++) {\n charWidth = this.__charBounds[lineIndex][j].width;\n widthOfCharsOnLine += charWidth;\n if (widthOfCharsOnLine > width) {\n foundMatch = true;\n const leftEdge = widthOfCharsOnLine - charWidth,\n rightEdge = widthOfCharsOnLine,\n offsetFromLeftEdge = Math.abs(leftEdge - width),\n offsetFromRightEdge = Math.abs(rightEdge - width);\n\n indexOnLine = offsetFromRightEdge < offsetFromLeftEdge ? j : j - 1;\n break;\n }\n }\n\n // reached end\n if (!foundMatch) {\n indexOnLine = line.length - 1;\n }\n\n return indexOnLine;\n }\n\n /**\n * Moves cursor down\n * @param {KeyboardEvent} e Event object\n */\n moveCursorDown(e: KeyboardEvent) {\n if (\n this.selectionStart >= this._text.length &&\n this.selectionEnd >= this._text.length\n ) {\n return;\n }\n this._moveCursorUpOrDown('Down', e);\n }\n\n /**\n * Moves cursor up\n * @param {KeyboardEvent} e Event object\n */\n moveCursorUp(e: KeyboardEvent) {\n if (this.selectionStart === 0 && this.selectionEnd === 0) {\n return;\n }\n this._moveCursorUpOrDown('Up', e);\n }\n\n /**\n * Moves cursor up or down, fires the events\n * @param {String} direction 'Up' or 'Down'\n * @param {KeyboardEvent} e Event object\n */\n _moveCursorUpOrDown(direction: 'Up' | 'Down', e: KeyboardEvent) {\n const offset = this[`get${direction}CursorOffset`](\n e,\n this._selectionDirection === RIGHT,\n );\n if (e.shiftKey) {\n this.moveCursorWithShift(offset);\n } else {\n this.moveCursorWithoutShift(offset);\n }\n if (offset !== 0) {\n const max = this.text.length;\n this.selectionStart = capValue(0, this.selectionStart, max);\n this.selectionEnd = capValue(0, this.selectionEnd, max);\n // TODO fix: abort and init should be an alternative depending\n // on selectionStart/End being equal or different\n this.abortCursorAnimation();\n this.initDelayedCursor();\n this._fireSelectionChanged();\n this._updateTextarea();\n }\n }\n\n /**\n * Moves cursor with shift\n * @param {Number} offset\n */\n moveCursorWithShift(offset: number) {\n const newSelection =\n this._selectionDirection === LEFT\n ? this.selectionStart + offset\n : this.selectionEnd + offset;\n this.setSelectionStartEndWithShift(\n this.selectionStart,\n this.selectionEnd,\n newSelection,\n );\n return offset !== 0;\n }\n\n /**\n * Moves cursor up without shift\n * @param {Number} offset\n */\n moveCursorWithoutShift(offset: number) {\n if (offset < 0) {\n this.selectionStart += offset;\n this.selectionEnd = this.selectionStart;\n } else {\n this.selectionEnd += offset;\n this.selectionStart = this.selectionEnd;\n }\n return offset !== 0;\n }\n\n /**\n * Moves cursor left\n * @param {KeyboardEvent} e Event object\n */\n moveCursorLeft(e: KeyboardEvent) {\n if (this.selectionStart === 0 && this.selectionEnd === 0) {\n return;\n }\n this._moveCursorLeftOrRight('Left', e);\n }\n\n /**\n * @private\n * @return {Boolean} true if a change happened\n *\n * @todo refactor not to use method name composition\n */\n _move(\n e: KeyboardEvent,\n prop: 'selectionStart' | 'selectionEnd',\n direction: 'Left' | 'Right',\n ): boolean {\n let newValue: number | undefined;\n if (e.altKey) {\n newValue = this[`findWordBoundary${direction}`](this[prop]);\n } else if (e.metaKey || e.keyCode === 35 || e.keyCode === 36) {\n newValue = this[`findLineBoundary${direction}`](this[prop]);\n } else {\n this[prop] += direction === 'Left' ? -1 : 1;\n return true;\n }\n if (typeof newValue !== 'undefined' && this[prop] !== newValue) {\n this[prop] = newValue;\n return true;\n }\n return false;\n }\n\n /**\n * @private\n */\n _moveLeft(e: KeyboardEvent, prop: 'selectionStart' | 'selectionEnd') {\n return this._move(e, prop, 'Left');\n }\n\n /**\n * @private\n */\n _moveRight(e: KeyboardEvent, prop: 'selectionStart' | 'selectionEnd') {\n return this._move(e, prop, 'Right');\n }\n\n /**\n * Moves cursor left without keeping selection\n * @param {KeyboardEvent} e\n */\n moveCursorLeftWithoutShift(e: KeyboardEvent) {\n let change = true;\n this._selectionDirection = LEFT;\n\n // only move cursor when there is no selection,\n // otherwise we discard it, and leave cursor on same place\n if (\n this.selectionEnd === this.selectionStart &&\n this.selectionStart !== 0\n ) {\n change = this._moveLeft(e, 'selectionStart');\n }\n this.selectionEnd = this.selectionStart;\n return change;\n }\n\n /**\n * Moves cursor left while keeping selection\n * @param {KeyboardEvent} e\n */\n moveCursorLeftWithShift(e: KeyboardEvent) {\n if (\n this._selectionDirection === RIGHT &&\n this.selectionStart !== this.selectionEnd\n ) {\n return this._moveLeft(e, 'selectionEnd');\n } else if (this.selectionStart !== 0) {\n this._selectionDirection = LEFT;\n return this._moveLeft(e, 'selectionStart');\n }\n }\n\n /**\n * Moves cursor right\n * @param {KeyboardEvent} e Event object\n */\n moveCursorRight(e: KeyboardEvent) {\n if (\n this.selectionStart >= this._text.length &&\n this.selectionEnd >= this._text.length\n ) {\n return;\n }\n this._moveCursorLeftOrRight('Right', e);\n }\n\n /**\n * Moves cursor right or Left, fires event\n * @param {String} direction 'Left', 'Right'\n * @param {KeyboardEvent} e Event object\n */\n _moveCursorLeftOrRight(direction: 'Left' | 'Right', e: KeyboardEvent) {\n const actionName = `moveCursor${direction}${\n e.shiftKey ? 'WithShift' : 'WithoutShift'\n }` as const;\n this._currentCursorOpacity = 1;\n if (this[actionName](e)) {\n // TODO fix: abort and init should be an alternative depending\n // on selectionStart/End being equal or different\n this.abortCursorAnimation();\n this.initDelayedCursor();\n this._fireSelectionChanged();\n this._updateTextarea();\n }\n }\n\n /**\n * Moves cursor right while keeping selection\n * @param {KeyboardEvent} e\n */\n moveCursorRightWithShift(e: KeyboardEvent) {\n if (\n this._selectionDirection === LEFT &&\n this.selectionStart !== this.selectionEnd\n ) {\n return this._moveRight(e, 'selectionStart');\n } else if (this.selectionEnd !== this._text.length) {\n this._selectionDirection = RIGHT;\n return this._moveRight(e, 'selectionEnd');\n }\n }\n\n /**\n * Moves cursor right without keeping selection\n * @param {KeyboardEvent} e Event object\n */\n moveCursorRightWithoutShift(e: KeyboardEvent) {\n let changed = true;\n this._selectionDirection = RIGHT;\n\n if (this.selectionStart === this.selectionEnd) {\n changed = this._moveRight(e, 'selectionStart');\n this.selectionEnd = this.selectionStart;\n } else {\n this.selectionStart = this.selectionEnd;\n }\n return changed;\n }\n}\n","import type {\n ObjectPointerEvents,\n TPointerEvent,\n TPointerEventInfo,\n} from '../../EventTypeDefs';\nimport { Point } from '../../Point';\nimport { invertTransform } from '../../util/misc/matrix';\nimport { DraggableTextDelegate } from './DraggableTextDelegate';\nimport type { ITextEvents } from './ITextBehavior';\nimport { ITextKeyBehavior } from './ITextKeyBehavior';\nimport type { TOptions } from '../../typedefs';\nimport type { TextProps, SerializedTextProps } from '../Text/Text';\nimport type { IText } from './IText';\n/**\n * `LEFT_CLICK === 0`\n */\nconst notALeftClick = (e: Event) => !!(e as MouseEvent).button;\n\nexport abstract class ITextClickBehavior<\n Props extends TOptions = Partial,\n SProps extends SerializedTextProps = SerializedTextProps,\n EventSpec extends ITextEvents = ITextEvents,\n> extends ITextKeyBehavior {\n protected draggableTextDelegate: DraggableTextDelegate;\n\n initBehavior() {\n // Initializes event handlers related to cursor or selection\n this.on('mousedown', this._mouseDownHandler);\n this.on('mouseup', this.mouseUpHandler);\n this.on('mousedblclick', this.doubleClickHandler);\n this.on('mousetripleclick', this.tripleClickHandler);\n\n this.draggableTextDelegate = new DraggableTextDelegate(\n this as unknown as IText,\n );\n\n super.initBehavior();\n }\n\n /**\n * If this method returns true a mouse move operation over a text selection\n * will not prevent the native mouse event allowing the browser to start a drag operation.\n * shouldStartDragging can be read 'do not prevent default for mouse move event'\n * To prevent drag and drop between objects both shouldStartDragging and onDragStart should return false\n * @returns\n */\n shouldStartDragging() {\n return this.draggableTextDelegate.isActive();\n }\n\n /**\n * @public override this method to control whether instance should/shouldn't become a drag source,\n * @see also {@link DraggableTextDelegate#isActive}\n * To prevent drag and drop between objects both shouldStartDragging and onDragStart should return false\n * @returns {boolean} should handle event\n */\n onDragStart(e: DragEvent) {\n return this.draggableTextDelegate.onDragStart(e);\n }\n\n /**\n * @public override this method to control whether instance should/shouldn't become a drop target\n */\n canDrop(e: DragEvent) {\n return this.draggableTextDelegate.canDrop(e);\n }\n\n /**\n * Default handler for double click, select a word\n */\n doubleClickHandler(options: TPointerEventInfo) {\n if (!this.isEditing) {\n return;\n }\n this.selectWord(this.getSelectionStartFromPointer(options.e));\n this.renderCursorOrSelection();\n }\n\n /**\n * Default handler for triple click, select a line\n */\n tripleClickHandler(options: TPointerEventInfo) {\n if (!this.isEditing) {\n return;\n }\n this.selectLine(this.getSelectionStartFromPointer(options.e));\n this.renderCursorOrSelection();\n }\n\n /**\n * Default event handler for the basic functionalities needed on _mouseDown\n * can be overridden to do something different.\n * Scope of this implementation is: find the click position, set selectionStart\n * find selectionEnd, initialize the drawing of either cursor or selection area\n * initializing a mousedDown on a text area will cancel fabricjs knowledge of\n * current compositionMode. It will be set to false.\n */\n _mouseDownHandler({ e, alreadySelected }: ObjectPointerEvents['mousedown']) {\n if (\n !this.canvas ||\n !this.editable ||\n notALeftClick(e) ||\n this.getActiveControl()\n ) {\n return;\n }\n\n if (this.draggableTextDelegate.start(e)) {\n return;\n }\n\n this.canvas.textEditingManager.register(this);\n\n if (alreadySelected) {\n this.inCompositionMode = false;\n this.setCursorByClick(e);\n }\n\n if (this.isEditing) {\n this.__selectionStartOnMouseDown = this.selectionStart;\n if (this.selectionStart === this.selectionEnd) {\n this.abortCursorAnimation();\n }\n this.renderCursorOrSelection();\n }\n this.selected ||= alreadySelected || this.isEditing;\n }\n\n /**\n * standard handler for mouse up, overridable\n * @private\n */\n mouseUpHandler({ e, transform }: ObjectPointerEvents['mouseup']) {\n const didDrag = this.draggableTextDelegate.end(e);\n\n if (this.canvas) {\n this.canvas.textEditingManager.unregister(this);\n\n const activeObject = this.canvas._activeObject;\n if (activeObject && activeObject !== this) {\n // avoid running this logic when there is an active object\n // this because is possible with shift click and fast clicks,\n // to rapidly deselect and reselect this object and trigger an enterEdit\n return;\n }\n }\n\n if (\n !this.editable ||\n (this.group && !this.group.interactive) ||\n (transform && transform.actionPerformed) ||\n notALeftClick(e) ||\n didDrag\n ) {\n return;\n }\n\n if (this.selected && !this.getActiveControl()) {\n this.enterEditing(e);\n if (this.selectionStart === this.selectionEnd) {\n this.initDelayedCursor(true);\n } else {\n this.renderCursorOrSelection();\n }\n }\n }\n\n /**\n * Changes cursor location in a text depending on passed pointer (x/y) object\n * @param {TPointerEvent} e Event object\n */\n setCursorByClick(e: TPointerEvent) {\n const newSelection = this.getSelectionStartFromPointer(e),\n start = this.selectionStart,\n end = this.selectionEnd;\n if (e.shiftKey) {\n this.setSelectionStartEndWithShift(start, end, newSelection);\n } else {\n this.selectionStart = newSelection;\n this.selectionEnd = newSelection;\n }\n if (this.isEditing) {\n this._fireSelectionChanged();\n this._updateTextarea();\n }\n }\n\n /**\n * Returns index of a character corresponding to where an object was clicked\n * @param {TPointerEvent} e Event object\n * @return {Number} Index of a character\n */\n getSelectionStartFromPointer(e: TPointerEvent): number {\n const mouseOffset = this.canvas!.getScenePoint(e)\n .transform(invertTransform(this.calcTransformMatrix()))\n .add(new Point(-this._getLeftOffset(), -this._getTopOffset()));\n let height = 0,\n charIndex = 0,\n lineIndex = 0;\n\n for (let i = 0; i < this._textLines.length; i++) {\n if (height <= mouseOffset.y) {\n height += this.getHeightOfLine(i);\n lineIndex = i;\n if (i > 0) {\n charIndex +=\n this._textLines[i - 1].length + this.missingNewlineOffset(i - 1);\n }\n } else {\n break;\n }\n }\n const lineLeftOffset = Math.abs(this._getLineLeftOffset(lineIndex));\n let width = lineLeftOffset;\n const charLength = this._textLines[lineIndex].length;\n const chars = this.__charBounds[lineIndex];\n for (let j = 0; j < charLength; j++) {\n // i removed something about flipX here, check.\n const charWidth = chars[j].kernedWidth;\n const widthAfter = width + charWidth;\n if (mouseOffset.x <= widthAfter) {\n // if the pointer is closer to the end of the char we increment charIndex\n // in order to position the cursor after the char\n if (\n Math.abs(mouseOffset.x - widthAfter) <=\n Math.abs(mouseOffset.x - width)\n ) {\n charIndex++;\n }\n break;\n }\n width = widthAfter;\n charIndex++;\n }\n\n return Math.min(\n // if object is horizontally flipped, mirror cursor location from the end\n this.flipX ? charLength - charIndex : charIndex,\n this._text.length,\n );\n }\n}\n","export type TKeyMapIText = Record<\n KeyboardEvent['keyCode'],\n CursorHandlingMethods\n>;\n\nexport type CursorHandlingMethods =\n | 'moveCursorUp'\n | 'moveCursorDown'\n | 'moveCursorLeft'\n | 'moveCursorRight'\n | 'exitEditing'\n | 'copy'\n | 'cut'\n | 'cmdAll';\n\nconst MOVE_CURSOR_UP: CursorHandlingMethods = 'moveCursorUp';\nconst MOVE_CURSOR_DOWN: CursorHandlingMethods = 'moveCursorDown';\nconst MOVE_CURSOR_LEFT: CursorHandlingMethods = 'moveCursorLeft';\nconst MOVE_CURSOR_RIGHT: CursorHandlingMethods = 'moveCursorRight';\nconst EXIT_EDITING: CursorHandlingMethods = 'exitEditing';\n\n// @TODO look into import { Key } from 'ts-key-enum';\n// and transition from keyCode to Key\n// also reduce string duplication\nexport const keysMap: TKeyMapIText = {\n 9: EXIT_EDITING,\n 27: EXIT_EDITING,\n 33: MOVE_CURSOR_UP,\n 34: MOVE_CURSOR_DOWN,\n 35: MOVE_CURSOR_RIGHT,\n 36: MOVE_CURSOR_LEFT,\n 37: MOVE_CURSOR_LEFT,\n 38: MOVE_CURSOR_UP,\n 39: MOVE_CURSOR_RIGHT,\n 40: MOVE_CURSOR_DOWN,\n};\n\nexport const keysMapRtl: TKeyMapIText = {\n 9: EXIT_EDITING,\n 27: EXIT_EDITING,\n 33: MOVE_CURSOR_UP,\n 34: MOVE_CURSOR_DOWN,\n 35: MOVE_CURSOR_LEFT,\n 36: MOVE_CURSOR_RIGHT,\n 37: MOVE_CURSOR_RIGHT,\n 38: MOVE_CURSOR_UP,\n 39: MOVE_CURSOR_LEFT,\n 40: MOVE_CURSOR_DOWN,\n};\n\n/**\n * For functionalities on keyUp + ctrl || cmd\n */\nexport const ctrlKeysMapUp: TKeyMapIText = {\n 67: 'copy',\n // there was a reason this wasn't deleted. for now leave it here\n 88: 'cut',\n};\n\n/**\n * For functionalities on keyDown + ctrl || cmd\n */\nexport const ctrlKeysMapDown: TKeyMapIText = {\n 65: 'cmdAll',\n};\n","import type { StaticCanvas } from '../../canvas/StaticCanvas';\n\n/**\n * Set the transform of the passed context to the same of a specific Canvas or StaticCanvas.\n * setTransform is used since this utility will RESET the ctx transform to the basic value\n * of retina scaling and viewport transform\n * It is not meant to be added to other transforms, it is used internally to preapre canvases to draw\n * @param ctx\n * @param canvas\n */\nexport const applyCanvasTransform = (\n ctx: CanvasRenderingContext2D,\n canvas: StaticCanvas,\n) => {\n const scale = canvas.getRetinaScaling();\n ctx.setTransform(scale, 0, 0, scale, 0, 0);\n const v = canvas.viewportTransform;\n ctx.transform(v[0], v[1], v[2], v[3], v[4], v[5]);\n};\n","import { Canvas } from '../../canvas/Canvas';\nimport type { ITextEvents } from './ITextBehavior';\nimport { ITextClickBehavior } from './ITextClickBehavior';\nimport {\n ctrlKeysMapDown,\n ctrlKeysMapUp,\n keysMap,\n keysMapRtl,\n} from './constants';\nimport type { TClassProperties, TFiller, TOptions } from '../../typedefs';\nimport { classRegistry } from '../../ClassRegistry';\nimport type { SerializedTextProps, TextProps } from '../Text/Text';\nimport {\n JUSTIFY,\n JUSTIFY_CENTER,\n JUSTIFY_LEFT,\n JUSTIFY_RIGHT,\n} from '../Text/constants';\nimport { CENTER, FILL, LEFT, RIGHT } from '../../constants';\nimport type { ObjectToCanvasElementOptions } from '../Object/Object';\nimport type { FabricObject } from '../Object/FabricObject';\nimport { createCanvasElementFor } from '../../util/misc/dom';\nimport { applyCanvasTransform } from '../../util/internals/applyCanvasTransform';\n\nexport type CursorBoundaries = {\n left: number;\n top: number;\n leftOffset: number;\n topOffset: number;\n};\n\nexport type CursorRenderingData = {\n color: string;\n opacity: number;\n left: number;\n top: number;\n width: number;\n height: number;\n};\n\n// Declare IText protected properties to workaround TS\nconst protectedDefaultValues = {\n _selectionDirection: null,\n _reSpace: /\\s|\\r?\\n/,\n inCompositionMode: false,\n};\n\nexport const iTextDefaultValues: Partial> = {\n selectionStart: 0,\n selectionEnd: 0,\n selectionColor: 'rgba(17,119,255,0.3)',\n isEditing: false,\n editable: true,\n editingBorderColor: 'rgba(102,153,255,0.25)',\n cursorWidth: 2,\n cursorColor: '',\n cursorDelay: 1000,\n cursorDuration: 600,\n caching: true,\n hiddenTextareaContainer: null,\n keysMap,\n keysMapRtl,\n ctrlKeysMapDown,\n ctrlKeysMapUp,\n ...protectedDefaultValues,\n};\n\n// @TODO this is not complete\ninterface UniqueITextProps {\n selectionStart: number;\n selectionEnd: number;\n}\n\nexport interface SerializedITextProps\n extends SerializedTextProps,\n UniqueITextProps {}\n\nexport interface ITextProps extends TextProps, UniqueITextProps {}\n\n/**\n * @fires changed\n * @fires selection:changed\n * @fires editing:entered\n * @fires editing:exited\n * @fires dragstart\n * @fires drag drag event firing on the drag source\n * @fires dragend\n * @fires copy\n * @fires cut\n * @fires paste\n *\n * #### Supported key combinations\n * ```\n * Move cursor: left, right, up, down\n * Select character: shift + left, shift + right\n * Select text vertically: shift + up, shift + down\n * Move cursor by word: alt + left, alt + right\n * Select words: shift + alt + left, shift + alt + right\n * Move cursor to line start/end: cmd + left, cmd + right or home, end\n * Select till start/end of line: cmd + shift + left, cmd + shift + right or shift + home, shift + end\n * Jump to start/end of text: cmd + up, cmd + down\n * Select till start/end of text: cmd + shift + up, cmd + shift + down or shift + pgUp, shift + pgDown\n * Delete character: backspace\n * Delete word: alt + backspace\n * Delete line: cmd + backspace\n * Forward delete: delete\n * Copy text: ctrl/cmd + c\n * Paste text: ctrl/cmd + v\n * Cut text: ctrl/cmd + x\n * Select entire text: ctrl/cmd + a\n * Quit editing tab or esc\n * ```\n *\n * #### Supported mouse/touch combination\n * ```\n * Position cursor: click/touch\n * Create selection: click/touch & drag\n * Create selection: click & shift + click\n * Select word: double click\n * Select line: triple click\n * ```\n */\nexport class IText<\n Props extends TOptions = Partial,\n SProps extends SerializedITextProps = SerializedITextProps,\n EventSpec extends ITextEvents = ITextEvents,\n >\n extends ITextClickBehavior\n implements UniqueITextProps\n{\n /**\n * Index where text selection starts (or where cursor is when there is no selection)\n * @type Number\n */\n declare selectionStart: number;\n\n /**\n * Index where text selection ends\n * @type Number\n */\n declare selectionEnd: number;\n\n declare compositionStart: number;\n\n declare compositionEnd: number;\n\n /**\n * Color of text selection\n * @type String\n */\n declare selectionColor: string;\n\n /**\n * Indicates whether text is in editing mode\n * @type Boolean\n */\n declare isEditing: boolean;\n\n /**\n * Indicates whether a text can be edited\n * @type Boolean\n */\n declare editable: boolean;\n\n /**\n * Border color of text object while it's in editing mode\n * @type String\n */\n declare editingBorderColor: string;\n\n /**\n * Width of cursor (in px)\n * @type Number\n */\n declare cursorWidth: number;\n\n /**\n * Color of text cursor color in editing mode.\n * if not set (default) will take color from the text.\n * if set to a color value that fabric can understand, it will\n * be used instead of the color of the text at the current position.\n * @type String\n */\n declare cursorColor: string;\n\n /**\n * Delay between cursor blink (in ms)\n * @type Number\n */\n declare cursorDelay: number;\n\n /**\n * Duration of cursor fade in (in ms)\n * @type Number\n */\n declare cursorDuration: number;\n\n declare compositionColor: string;\n\n /**\n * Indicates whether internal text char widths can be cached\n * @type Boolean\n */\n declare caching: boolean;\n\n static ownDefaults = iTextDefaultValues;\n\n static getDefaults(): Record {\n return { ...super.getDefaults(), ...IText.ownDefaults };\n }\n\n static type = 'IText';\n\n get type() {\n const type = super.type;\n // backward compatibility\n return type === 'itext' ? 'i-text' : type;\n }\n\n /**\n * Constructor\n * @param {String} text Text string\n * @param {Object} [options] Options object\n */\n constructor(text: string, options?: Props) {\n super(text, { ...IText.ownDefaults, ...options } as Props);\n this.initBehavior();\n }\n\n /**\n * While editing handle differently\n * @private\n * @param {string} key\n * @param {*} value\n */\n _set(key: string, value: any) {\n if (this.isEditing && this._savedProps && key in this._savedProps) {\n // @ts-expect-error irritating TS\n this._savedProps[key] = value;\n return this;\n }\n if (key === 'canvas') {\n this.canvas instanceof Canvas &&\n this.canvas.textEditingManager.remove(this);\n value instanceof Canvas && value.textEditingManager.add(this);\n }\n return super._set(key, value);\n }\n\n /**\n * Sets selection start (left boundary of a selection)\n * @param {Number} index Index to set selection start to\n */\n setSelectionStart(index: number) {\n index = Math.max(index, 0);\n this._updateAndFire('selectionStart', index);\n }\n\n /**\n * Sets selection end (right boundary of a selection)\n * @param {Number} index Index to set selection end to\n */\n setSelectionEnd(index: number) {\n index = Math.min(index, this.text.length);\n this._updateAndFire('selectionEnd', index);\n }\n\n /**\n * @private\n * @param {String} property 'selectionStart' or 'selectionEnd'\n * @param {Number} index new position of property\n */\n protected _updateAndFire(\n property: 'selectionStart' | 'selectionEnd',\n index: number,\n ) {\n if (this[property] !== index) {\n this._fireSelectionChanged();\n this[property] = index;\n }\n this._updateTextarea();\n }\n\n /**\n * Fires the even of selection changed\n * @private\n */\n _fireSelectionChanged() {\n this.fire('selection:changed');\n this.canvas && this.canvas.fire('text:selection:changed', { target: this });\n }\n\n /**\n * Initialize text dimensions. Render all text on given context\n * or on a offscreen canvas to get the text width with measureText.\n * Updates this.width and this.height with the proper values.\n * Does not return dimensions.\n * @private\n */\n initDimensions() {\n this.isEditing && this.initDelayedCursor();\n super.initDimensions();\n }\n\n /**\n * Gets style of a current selection/cursor (at the start position)\n * if startIndex or endIndex are not provided, selectionStart or selectionEnd will be used.\n * @param {Number} startIndex Start index to get styles at\n * @param {Number} endIndex End index to get styles at, if not specified selectionEnd or startIndex + 1\n * @param {Boolean} [complete] get full style or not\n * @return {Array} styles an array with one, zero or more Style objects\n */\n getSelectionStyles(\n startIndex: number = this.selectionStart || 0,\n endIndex: number = this.selectionEnd,\n complete?: boolean,\n ) {\n return super.getSelectionStyles(startIndex, endIndex, complete);\n }\n\n /**\n * Sets style of a current selection, if no selection exist, do not set anything.\n * @param {Object} [styles] Styles object\n * @param {Number} [startIndex] Start index to get styles at\n * @param {Number} [endIndex] End index to get styles at, if not specified selectionEnd or startIndex + 1\n */\n setSelectionStyles(\n styles: object,\n startIndex: number = this.selectionStart || 0,\n endIndex: number = this.selectionEnd,\n ) {\n return super.setSelectionStyles(styles, startIndex, endIndex);\n }\n\n /**\n * Returns 2d representation (lineIndex and charIndex) of cursor (or selection start)\n * @param {Number} [selectionStart] Optional index. When not given, current selectionStart is used.\n * @param {Boolean} [skipWrapping] consider the location for unwrapped lines. useful to manage styles.\n */\n get2DCursorLocation(\n selectionStart = this.selectionStart,\n skipWrapping?: boolean,\n ) {\n return super.get2DCursorLocation(selectionStart, skipWrapping);\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n render(ctx: CanvasRenderingContext2D) {\n super.render(ctx);\n // clear the cursorOffsetCache, so we ensure to calculate once per renderCursor\n // the correct position but not at every cursor animation.\n this.cursorOffsetCache = {};\n this.renderCursorOrSelection();\n }\n\n /**\n * @override block cursor/selection logic while rendering the exported canvas\n * @todo this workaround should be replaced with a more robust solution\n */\n toCanvasElement(options?: ObjectToCanvasElementOptions): HTMLCanvasElement {\n const isEditing = this.isEditing;\n this.isEditing = false;\n const canvas = super.toCanvasElement(options);\n this.isEditing = isEditing;\n return canvas;\n }\n\n /**\n * Renders cursor or selection (depending on what exists)\n * it does on the contextTop. If contextTop is not available, do nothing.\n */\n renderCursorOrSelection() {\n if (!this.isEditing || !this.canvas) {\n return;\n }\n const ctx = this.clearContextTop(true);\n if (!ctx) {\n return;\n }\n const boundaries = this._getCursorBoundaries();\n\n const ancestors = this.findAncestorsWithClipPath();\n const hasAncestorsWithClipping = ancestors.length > 0;\n let drawingCtx: CanvasRenderingContext2D = ctx;\n let drawingCanvas: HTMLCanvasElement | undefined = undefined;\n if (hasAncestorsWithClipping) {\n // we have some clipPath, we need to draw the selection on an intermediate layer.\n drawingCanvas = createCanvasElementFor(ctx.canvas);\n drawingCtx = drawingCanvas.getContext('2d')!;\n applyCanvasTransform(drawingCtx, this.canvas);\n const m = this.calcTransformMatrix();\n drawingCtx.transform(m[0], m[1], m[2], m[3], m[4], m[5]);\n }\n\n if (this.selectionStart === this.selectionEnd && !this.inCompositionMode) {\n this.renderCursor(drawingCtx, boundaries);\n } else {\n this.renderSelection(drawingCtx, boundaries);\n }\n\n if (hasAncestorsWithClipping) {\n // we need a neutral context.\n // this won't work for nested clippaths in which a clippath\n // has its own clippath\n for (const ancestor of ancestors) {\n const clipPath = ancestor.clipPath!;\n const clippingCanvas = createCanvasElementFor(ctx.canvas);\n const clippingCtx = clippingCanvas.getContext('2d')!;\n applyCanvasTransform(clippingCtx, this.canvas);\n // position the ctx in the center of the outer ancestor\n if (!clipPath.absolutePositioned) {\n const m = ancestor.calcTransformMatrix();\n clippingCtx.transform(m[0], m[1], m[2], m[3], m[4], m[5]);\n }\n clipPath.transform(clippingCtx);\n // we assign an empty drawing context, we don't plan to have this working for nested clippaths for now\n clipPath.drawObject(clippingCtx, true, {});\n this.drawClipPathOnCache(drawingCtx, clipPath, clippingCanvas);\n }\n }\n\n if (hasAncestorsWithClipping) {\n ctx.setTransform(1, 0, 0, 1, 0, 0);\n ctx.drawImage(drawingCanvas!, 0, 0);\n }\n\n this.canvas.contextTopDirty = true;\n ctx.restore();\n }\n\n /**\n * Finds and returns an array of clip paths that are applied to the parent\n * group(s) of the current FabricObject instance. The object's hierarchy is\n * traversed upwards (from the current object towards the root of the canvas),\n * checking each parent object for the presence of a `clipPath` that is not\n * absolutely positioned.\n */\n findAncestorsWithClipPath(): FabricObject[] {\n const clipPathAncestors: FabricObject[] = [];\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n let obj: FabricObject | undefined = this;\n while (obj) {\n if (obj.clipPath) {\n clipPathAncestors.push(obj);\n }\n obj = obj.parent;\n }\n\n return clipPathAncestors;\n }\n\n /**\n * Returns cursor boundaries (left, top, leftOffset, topOffset)\n * left/top are left/top of entire text box\n * leftOffset/topOffset are offset from that left/top point of a text box\n * @private\n * @param {number} [index] index from start\n * @param {boolean} [skipCaching]\n */\n _getCursorBoundaries(\n index: number = this.selectionStart,\n skipCaching?: boolean,\n ): CursorBoundaries {\n const left = this._getLeftOffset(),\n top = this._getTopOffset(),\n offsets = this._getCursorBoundariesOffsets(index, skipCaching);\n return {\n left: left,\n top: top,\n leftOffset: offsets.left,\n topOffset: offsets.top,\n };\n }\n\n /**\n * Caches and returns cursor left/top offset relative to instance's center point\n * @private\n * @param {number} index index from start\n * @param {boolean} [skipCaching]\n */\n _getCursorBoundariesOffsets(\n index: number,\n skipCaching?: boolean,\n ): { left: number; top: number } {\n if (skipCaching) {\n return this.__getCursorBoundariesOffsets(index);\n }\n if (this.cursorOffsetCache && 'top' in this.cursorOffsetCache) {\n return this.cursorOffsetCache as { left: number; top: number };\n }\n return (this.cursorOffsetCache = this.__getCursorBoundariesOffsets(index));\n }\n\n /**\n * Calculates cursor left/top offset relative to instance's center point\n * @private\n * @param {number} index index from start\n */\n __getCursorBoundariesOffsets(index: number) {\n let topOffset = 0,\n leftOffset = 0;\n const { charIndex, lineIndex } = this.get2DCursorLocation(index);\n\n for (let i = 0; i < lineIndex; i++) {\n topOffset += this.getHeightOfLine(i);\n }\n const lineLeftOffset = this._getLineLeftOffset(lineIndex);\n const bound = this.__charBounds[lineIndex][charIndex];\n bound && (leftOffset = bound.left);\n if (\n this.charSpacing !== 0 &&\n charIndex === this._textLines[lineIndex].length\n ) {\n leftOffset -= this._getWidthOfCharSpacing();\n }\n const boundaries = {\n top: topOffset,\n left: lineLeftOffset + (leftOffset > 0 ? leftOffset : 0),\n };\n if (this.direction === 'rtl') {\n if (\n this.textAlign === RIGHT ||\n this.textAlign === JUSTIFY ||\n this.textAlign === JUSTIFY_RIGHT\n ) {\n boundaries.left *= -1;\n } else if (this.textAlign === LEFT || this.textAlign === JUSTIFY_LEFT) {\n boundaries.left = lineLeftOffset - (leftOffset > 0 ? leftOffset : 0);\n } else if (\n this.textAlign === CENTER ||\n this.textAlign === JUSTIFY_CENTER\n ) {\n boundaries.left = lineLeftOffset - (leftOffset > 0 ? leftOffset : 0);\n }\n }\n return boundaries;\n }\n\n /**\n * Renders cursor on context Top, outside the animation cycle, on request\n * Used for the drag/drop effect.\n * If contextTop is not available, do nothing.\n */\n renderCursorAt(selectionStart: number) {\n this._renderCursor(\n this.canvas!.contextTop,\n this._getCursorBoundaries(selectionStart, true),\n selectionStart,\n );\n }\n\n /**\n * Renders cursor\n * @param {Object} boundaries\n * @param {CanvasRenderingContext2D} ctx transformed context to draw on\n */\n renderCursor(ctx: CanvasRenderingContext2D, boundaries: CursorBoundaries) {\n this._renderCursor(ctx, boundaries, this.selectionStart);\n }\n\n /**\n * Return the data needed to render the cursor for given selection start\n * The left,top are relative to the object, while width and height are prescaled\n * to look think with canvas zoom and object scaling,\n * so they depend on canvas and object scaling\n */\n getCursorRenderingData(\n selectionStart: number = this.selectionStart,\n boundaries: CursorBoundaries = this._getCursorBoundaries(selectionStart),\n ): CursorRenderingData {\n const cursorLocation = this.get2DCursorLocation(selectionStart),\n lineIndex = cursorLocation.lineIndex,\n charIndex =\n cursorLocation.charIndex > 0 ? cursorLocation.charIndex - 1 : 0,\n charHeight = this.getValueOfPropertyAt(lineIndex, charIndex, 'fontSize'),\n multiplier = this.getObjectScaling().x * this.canvas!.getZoom(),\n cursorWidth = this.cursorWidth / multiplier,\n dy = this.getValueOfPropertyAt(lineIndex, charIndex, 'deltaY'),\n topOffset =\n boundaries.topOffset +\n ((1 - this._fontSizeFraction) * this.getHeightOfLine(lineIndex)) /\n this.lineHeight -\n charHeight * (1 - this._fontSizeFraction);\n\n return {\n color:\n this.cursorColor ||\n (this.getValueOfPropertyAt(lineIndex, charIndex, 'fill') as string),\n opacity: this._currentCursorOpacity,\n left: boundaries.left + boundaries.leftOffset - cursorWidth / 2,\n top: topOffset + boundaries.top + dy,\n width: cursorWidth,\n height: charHeight,\n };\n }\n\n /**\n * Render the cursor at the given selectionStart.\n * @param {CanvasRenderingContext2D} ctx transformed context to draw on\n */\n _renderCursor(\n ctx: CanvasRenderingContext2D,\n boundaries: CursorBoundaries,\n selectionStart: number,\n ) {\n const { color, opacity, left, top, width, height } =\n this.getCursorRenderingData(selectionStart, boundaries);\n ctx.fillStyle = color;\n ctx.globalAlpha = opacity;\n ctx.fillRect(left, top, width, height);\n }\n\n /**\n * Renders text selection\n * @param {Object} boundaries Object with left/top/leftOffset/topOffset\n * @param {CanvasRenderingContext2D} ctx transformed context to draw on\n */\n renderSelection(ctx: CanvasRenderingContext2D, boundaries: CursorBoundaries) {\n const selection = {\n selectionStart: this.inCompositionMode\n ? this.hiddenTextarea!.selectionStart\n : this.selectionStart,\n selectionEnd: this.inCompositionMode\n ? this.hiddenTextarea!.selectionEnd\n : this.selectionEnd,\n };\n this._renderSelection(ctx, selection, boundaries);\n }\n\n /**\n * Renders drag start text selection\n */\n renderDragSourceEffect() {\n const dragStartSelection =\n this.draggableTextDelegate.getDragStartSelection()!;\n this._renderSelection(\n this.canvas!.contextTop,\n dragStartSelection,\n this._getCursorBoundaries(dragStartSelection.selectionStart, true),\n );\n }\n\n renderDropTargetEffect(e: DragEvent) {\n const dragSelection = this.getSelectionStartFromPointer(e);\n this.renderCursorAt(dragSelection);\n }\n\n /**\n * Renders text selection\n * @private\n * @param {{ selectionStart: number, selectionEnd: number }} selection\n * @param {Object} boundaries Object with left/top/leftOffset/topOffset\n * @param {CanvasRenderingContext2D} ctx transformed context to draw on\n */\n _renderSelection(\n ctx: CanvasRenderingContext2D,\n selection: { selectionStart: number; selectionEnd: number },\n boundaries: CursorBoundaries,\n ) {\n const selectionStart = selection.selectionStart,\n selectionEnd = selection.selectionEnd,\n isJustify = this.textAlign.includes(JUSTIFY),\n start = this.get2DCursorLocation(selectionStart),\n end = this.get2DCursorLocation(selectionEnd),\n startLine = start.lineIndex,\n endLine = end.lineIndex,\n startChar = start.charIndex < 0 ? 0 : start.charIndex,\n endChar = end.charIndex < 0 ? 0 : end.charIndex;\n\n for (let i = startLine; i <= endLine; i++) {\n const lineOffset = this._getLineLeftOffset(i) || 0;\n let lineHeight = this.getHeightOfLine(i),\n realLineHeight = 0,\n boxStart = 0,\n boxEnd = 0;\n\n if (i === startLine) {\n boxStart = this.__charBounds[startLine][startChar].left;\n }\n if (i >= startLine && i < endLine) {\n boxEnd =\n isJustify && !this.isEndOfWrapping(i)\n ? this.width\n : this.getLineWidth(i) || 5; // WTF is this 5?\n } else if (i === endLine) {\n if (endChar === 0) {\n boxEnd = this.__charBounds[endLine][endChar].left;\n } else {\n const charSpacing = this._getWidthOfCharSpacing();\n boxEnd =\n this.__charBounds[endLine][endChar - 1].left +\n this.__charBounds[endLine][endChar - 1].width -\n charSpacing;\n }\n }\n realLineHeight = lineHeight;\n if (this.lineHeight < 1 || (i === endLine && this.lineHeight > 1)) {\n lineHeight /= this.lineHeight;\n }\n let drawStart = boundaries.left + lineOffset + boxStart,\n drawHeight = lineHeight,\n extraTop = 0;\n const drawWidth = boxEnd - boxStart;\n if (this.inCompositionMode) {\n ctx.fillStyle = this.compositionColor || 'black';\n drawHeight = 1;\n extraTop = lineHeight;\n } else {\n ctx.fillStyle = this.selectionColor;\n }\n if (this.direction === 'rtl') {\n if (\n this.textAlign === RIGHT ||\n this.textAlign === JUSTIFY ||\n this.textAlign === JUSTIFY_RIGHT\n ) {\n drawStart = this.width - drawStart - drawWidth;\n } else if (this.textAlign === LEFT || this.textAlign === JUSTIFY_LEFT) {\n drawStart = boundaries.left + lineOffset - boxEnd;\n } else if (\n this.textAlign === CENTER ||\n this.textAlign === JUSTIFY_CENTER\n ) {\n drawStart = boundaries.left + lineOffset - boxEnd;\n }\n }\n ctx.fillRect(\n drawStart,\n boundaries.top + boundaries.topOffset + extraTop,\n drawWidth,\n drawHeight,\n );\n boundaries.topOffset += realLineHeight;\n }\n }\n\n /**\n * High level function to know the height of the cursor.\n * the currentChar is the one that precedes the cursor\n * Returns fontSize of char at the current cursor\n * Unused from the library, is for the end user\n * @return {Number} Character font size\n */\n getCurrentCharFontSize(): number {\n const cp = this._getCurrentCharIndex();\n return this.getValueOfPropertyAt(cp.l, cp.c, 'fontSize');\n }\n\n /**\n * High level function to know the color of the cursor.\n * the currentChar is the one that precedes the cursor\n * Returns color (fill) of char at the current cursor\n * if the text object has a pattern or gradient for filler, it will return that.\n * Unused by the library, is for the end user\n * @return {String | TFiller} Character color (fill)\n */\n getCurrentCharColor(): string | TFiller | null {\n const cp = this._getCurrentCharIndex();\n return this.getValueOfPropertyAt(cp.l, cp.c, FILL);\n }\n\n /**\n * Returns the cursor position for the getCurrent.. functions\n * @private\n */\n _getCurrentCharIndex() {\n const cursorPosition = this.get2DCursorLocation(this.selectionStart, true),\n charIndex =\n cursorPosition.charIndex > 0 ? cursorPosition.charIndex - 1 : 0;\n return { l: cursorPosition.lineIndex, c: charIndex };\n }\n\n dispose() {\n this.exitEditingImpl();\n this.draggableTextDelegate.dispose();\n super.dispose();\n }\n}\n\nclassRegistry.setClass(IText);\n// legacy\nclassRegistry.setClass(IText, 'i-text');\n","import type { TClassProperties, TOptions } from '../typedefs';\nimport { IText } from './IText/IText';\nimport { classRegistry } from '../ClassRegistry';\nimport { createTextboxDefaultControls } from '../controls/commonControls';\nimport { JUSTIFY } from './Text/constants';\nimport type { TextStyleDeclaration } from './Text/StyledText';\nimport type { SerializedITextProps, ITextProps } from './IText/IText';\nimport type { ITextEvents } from './IText/ITextBehavior';\nimport type { TextLinesInfo } from './Text/Text';\nimport type { Control } from '../controls/Control';\n\n// @TODO: Many things here are configuration related and shouldn't be on the class nor prototype\n// regexes, list of properties that are not suppose to change by instances, magic consts.\n// this will be a separated effort\nexport const textboxDefaultValues: Partial> = {\n minWidth: 20,\n dynamicMinWidth: 2,\n lockScalingFlip: true,\n noScaleCache: false,\n _wordJoiners: /[ \\t\\r]/,\n splitByGrapheme: false,\n};\n\nexport type GraphemeData = {\n wordsData: {\n word: string[];\n width: number;\n }[][];\n largestWordWidth: number;\n};\n\nexport type StyleMap = Record;\n\n// @TODO this is not complete\ninterface UniqueTextboxProps {\n minWidth: number;\n splitByGrapheme: boolean;\n dynamicMinWidth: number;\n _wordJoiners: RegExp;\n}\n\nexport interface SerializedTextboxProps\n extends SerializedITextProps,\n Pick {}\n\nexport interface TextboxProps extends ITextProps, UniqueTextboxProps {}\n\n/**\n * Textbox class, based on IText, allows the user to resize the text rectangle\n * and wraps lines automatically. Textboxes have their Y scaling locked, the\n * user can only change width. Height is adjusted automatically based on the\n * wrapping of lines.\n */\nexport class Textbox<\n Props extends TOptions = Partial,\n SProps extends SerializedTextboxProps = SerializedTextboxProps,\n EventSpec extends ITextEvents = ITextEvents,\n >\n extends IText\n implements UniqueTextboxProps\n{\n /**\n * Minimum width of textbox, in pixels.\n * @type Number\n */\n declare minWidth: number;\n\n /**\n * Minimum calculated width of a textbox, in pixels.\n * fixed to 2 so that an empty textbox cannot go to 0\n * and is still selectable without text.\n * @type Number\n */\n declare dynamicMinWidth: number;\n\n /**\n * Use this boolean property in order to split strings that have no white space concept.\n * this is a cheap way to help with chinese/japanese\n * @type Boolean\n * @since 2.6.0\n */\n declare splitByGrapheme: boolean;\n\n declare _wordJoiners: RegExp;\n\n declare _styleMap: StyleMap;\n\n declare isWrapping: boolean;\n\n static type = 'Textbox';\n\n static textLayoutProperties = [...IText.textLayoutProperties, 'width'];\n\n static ownDefaults = textboxDefaultValues;\n\n static getDefaults(): Record {\n return {\n ...super.getDefaults(),\n ...Textbox.ownDefaults,\n };\n }\n\n /**\n * Constructor\n * @param {String} text Text string\n * @param {Object} [options] Options object\n */\n constructor(text: string, options?: Props) {\n super(text, { ...Textbox.ownDefaults, ...options } as Props);\n }\n\n /**\n * Creates the default control object.\n * If you prefer to have on instance of controls shared among all objects\n * make this function return an empty object and add controls to the ownDefaults object\n */\n static createControls(): { controls: Record } {\n return { controls: createTextboxDefaultControls() };\n }\n\n /**\n * Unlike superclass's version of this function, Textbox does not update\n * its width.\n * @private\n * @override\n */\n initDimensions() {\n if (!this.initialized) {\n return;\n }\n this.isEditing && this.initDelayedCursor();\n this._clearCache();\n // clear dynamicMinWidth as it will be different after we re-wrap line\n this.dynamicMinWidth = 0;\n // wrap lines\n this._styleMap = this._generateStyleMap(this._splitText());\n // if after wrapping, the width is smaller than dynamicMinWidth, change the width and re-wrap\n if (this.dynamicMinWidth > this.width) {\n this._set('width', this.dynamicMinWidth);\n }\n if (this.textAlign.includes(JUSTIFY)) {\n // once text is measured we need to make space fatter to make justified text.\n this.enlargeSpaces();\n }\n // clear cache and re-calculate height\n this.height = this.calcTextHeight();\n }\n\n /**\n * Generate an object that translates the style object so that it is\n * broken up by visual lines (new lines and automatic wrapping).\n * The original text styles object is broken up by actual lines (new lines only),\n * which is only sufficient for Text / IText\n * @private\n */\n _generateStyleMap(textInfo: TextLinesInfo): StyleMap {\n let realLineCount = 0,\n realLineCharCount = 0,\n charCount = 0;\n const map: StyleMap = {};\n\n for (let i = 0; i < textInfo.graphemeLines.length; i++) {\n if (textInfo.graphemeText[charCount] === '\\n' && i > 0) {\n realLineCharCount = 0;\n charCount++;\n realLineCount++;\n } else if (\n !this.splitByGrapheme &&\n this._reSpaceAndTab.test(textInfo.graphemeText[charCount]) &&\n i > 0\n ) {\n // this case deals with space's that are removed from end of lines when wrapping\n realLineCharCount++;\n charCount++;\n }\n\n map[i] = { line: realLineCount, offset: realLineCharCount };\n\n charCount += textInfo.graphemeLines[i].length;\n realLineCharCount += textInfo.graphemeLines[i].length;\n }\n\n return map;\n }\n\n /**\n * Returns true if object has a style property or has it on a specified line\n * @param {Number} lineIndex\n * @return {Boolean}\n */\n styleHas(property: keyof TextStyleDeclaration, lineIndex: number): boolean {\n if (this._styleMap && !this.isWrapping) {\n const map = this._styleMap[lineIndex];\n if (map) {\n lineIndex = map.line;\n }\n }\n return super.styleHas(property, lineIndex);\n }\n\n /**\n * Returns true if object has no styling or no styling in a line\n * @param {Number} lineIndex , lineIndex is on wrapped lines.\n * @return {Boolean}\n */\n isEmptyStyles(lineIndex: number): boolean {\n if (!this.styles) {\n return true;\n }\n let offset = 0,\n nextLineIndex = lineIndex + 1,\n nextOffset: number,\n shouldLimit = false;\n const map = this._styleMap[lineIndex],\n mapNextLine = this._styleMap[lineIndex + 1];\n if (map) {\n lineIndex = map.line;\n offset = map.offset;\n }\n if (mapNextLine) {\n nextLineIndex = mapNextLine.line;\n shouldLimit = nextLineIndex === lineIndex;\n nextOffset = mapNextLine.offset;\n }\n const obj =\n typeof lineIndex === 'undefined'\n ? this.styles\n : { line: this.styles[lineIndex] };\n for (const p1 in obj) {\n for (const p2 in obj[p1]) {\n const p2Number = parseInt(p2, 10);\n if (p2Number >= offset && (!shouldLimit || p2Number < nextOffset!)) {\n for (const p3 in obj[p1][p2]) {\n return false;\n }\n }\n }\n }\n return true;\n }\n\n /**\n * @protected\n * @param {Number} lineIndex\n * @param {Number} charIndex\n * @return {TextStyleDeclaration} a style object reference to the existing one or a new empty object when undefined\n */\n _getStyleDeclaration(\n lineIndex: number,\n charIndex: number,\n ): TextStyleDeclaration {\n if (this._styleMap && !this.isWrapping) {\n const map = this._styleMap[lineIndex];\n if (!map) {\n return {};\n }\n lineIndex = map.line;\n charIndex = map.offset + charIndex;\n }\n return super._getStyleDeclaration(lineIndex, charIndex);\n }\n\n /**\n * @param {Number} lineIndex\n * @param {Number} charIndex\n * @param {Object} style\n * @private\n */\n protected _setStyleDeclaration(\n lineIndex: number,\n charIndex: number,\n style: object,\n ) {\n const map = this._styleMap[lineIndex];\n super._setStyleDeclaration(map.line, map.offset + charIndex, style);\n }\n\n /**\n * @param {Number} lineIndex\n * @param {Number} charIndex\n * @private\n */\n protected _deleteStyleDeclaration(lineIndex: number, charIndex: number) {\n const map = this._styleMap[lineIndex];\n super._deleteStyleDeclaration(map.line, map.offset + charIndex);\n }\n\n /**\n * probably broken need a fix\n * Returns the real style line that correspond to the wrapped lineIndex line\n * Used just to verify if the line does exist or not.\n * @param {Number} lineIndex\n * @returns {Boolean} if the line exists or not\n * @private\n */\n protected _getLineStyle(lineIndex: number): boolean {\n const map = this._styleMap[lineIndex];\n return !!this.styles[map.line];\n }\n\n /**\n * Set the line style to an empty object so that is initialized\n * @param {Number} lineIndex\n * @param {Object} style\n * @private\n */\n protected _setLineStyle(lineIndex: number) {\n const map = this._styleMap[lineIndex];\n super._setLineStyle(map.line);\n }\n\n /**\n * Wraps text using the 'width' property of Textbox. First this function\n * splits text on newlines, so we preserve newlines entered by the user.\n * Then it wraps each line using the width of the Textbox by calling\n * _wrapLine().\n * @param {Array} lines The string array of text that is split into lines\n * @param {Number} desiredWidth width you want to wrap to\n * @returns {Array} Array of lines\n */\n _wrapText(lines: string[], desiredWidth: number): string[][] {\n this.isWrapping = true;\n // extract all thewords and the widths to optimally wrap lines.\n const data = this.getGraphemeDataForRender(lines);\n const wrapped: string[][] = [];\n for (let i = 0; i < data.wordsData.length; i++) {\n wrapped.push(...this._wrapLine(i, desiredWidth, data));\n }\n this.isWrapping = false;\n return wrapped;\n }\n\n /**\n * For each line of text terminated by an hard line stop,\n * measure each word width and extract the largest word from all.\n * The returned words here are the one that at the end will be rendered.\n * @param {string[]} lines the lines we need to measure\n *\n */\n getGraphemeDataForRender(lines: string[]): GraphemeData {\n const splitByGrapheme = this.splitByGrapheme,\n infix = splitByGrapheme ? '' : ' ';\n\n let largestWordWidth = 0;\n\n const data = lines.map((line, lineIndex) => {\n let offset = 0;\n const wordsOrGraphemes = splitByGrapheme\n ? this.graphemeSplit(line)\n : this.wordSplit(line);\n\n if (wordsOrGraphemes.length === 0) {\n return [{ word: [], width: 0 }];\n }\n\n return wordsOrGraphemes.map((word: string) => {\n // if using splitByGrapheme words are already in graphemes.\n const graphemeArray = splitByGrapheme\n ? [word]\n : this.graphemeSplit(word);\n const width = this._measureWord(graphemeArray, lineIndex, offset);\n largestWordWidth = Math.max(width, largestWordWidth);\n offset += graphemeArray.length + infix.length;\n return { word: graphemeArray, width };\n });\n });\n\n return {\n wordsData: data,\n largestWordWidth,\n };\n }\n\n /**\n * Helper function to measure a string of text, given its lineIndex and charIndex offset\n * It gets called when charBounds are not available yet.\n * Override if necessary\n * Use with {@link Textbox#wordSplit}\n *\n * @param {CanvasRenderingContext2D} ctx\n * @param {String} text\n * @param {number} lineIndex\n * @param {number} charOffset\n * @returns {number}\n */\n _measureWord(word: string[], lineIndex: number, charOffset = 0): number {\n let width = 0,\n prevGrapheme;\n const skipLeft = true;\n for (let i = 0, len = word.length; i < len; i++) {\n const box = this._getGraphemeBox(\n word[i],\n lineIndex,\n i + charOffset,\n prevGrapheme,\n skipLeft,\n );\n width += box.kernedWidth;\n prevGrapheme = word[i];\n }\n return width;\n }\n\n /**\n * Override this method to customize word splitting\n * Use with {@link Textbox#_measureWord}\n * @param {string} value\n * @returns {string[]} array of words\n */\n wordSplit(value: string): string[] {\n return value.split(this._wordJoiners);\n }\n\n /**\n * Wraps a line of text using the width of the Textbox as desiredWidth\n * and leveraging the known width o words from GraphemeData\n * @private\n * @param {Number} lineIndex\n * @param {Number} desiredWidth width you want to wrap the line to\n * @param {GraphemeData} graphemeData an object containing all the lines' words width.\n * @param {Number} reservedSpace space to remove from wrapping for custom functionalities\n * @returns {Array} Array of line(s) into which the given text is wrapped\n * to.\n */\n _wrapLine(\n lineIndex: number,\n desiredWidth: number,\n { largestWordWidth, wordsData }: GraphemeData,\n reservedSpace = 0,\n ): string[][] {\n const additionalSpace = this._getWidthOfCharSpacing(),\n splitByGrapheme = this.splitByGrapheme,\n graphemeLines = [],\n infix = splitByGrapheme ? '' : ' ';\n\n let lineWidth = 0,\n line: string[] = [],\n // spaces in different languages?\n offset = 0,\n infixWidth = 0,\n lineJustStarted = true;\n\n desiredWidth -= reservedSpace;\n\n const maxWidth = Math.max(\n desiredWidth,\n largestWordWidth,\n this.dynamicMinWidth,\n );\n // layout words\n const data = wordsData[lineIndex];\n offset = 0;\n let i;\n for (i = 0; i < data.length; i++) {\n const { word, width: wordWidth } = data[i];\n offset += word.length;\n\n lineWidth += infixWidth + wordWidth - additionalSpace;\n if (lineWidth > maxWidth && !lineJustStarted) {\n graphemeLines.push(line);\n line = [];\n lineWidth = wordWidth;\n lineJustStarted = true;\n } else {\n lineWidth += additionalSpace;\n }\n\n if (!lineJustStarted && !splitByGrapheme) {\n line.push(infix);\n }\n line = line.concat(word);\n\n infixWidth = splitByGrapheme\n ? 0\n : this._measureWord([infix], lineIndex, offset);\n offset++;\n lineJustStarted = false;\n }\n\n i && graphemeLines.push(line);\n\n // TODO: this code is probably not necessary anymore.\n // it can be moved out of this function since largestWordWidth is now\n // known in advance\n if (largestWordWidth + reservedSpace > this.dynamicMinWidth) {\n this.dynamicMinWidth = largestWordWidth - additionalSpace + reservedSpace;\n }\n return graphemeLines;\n }\n\n /**\n * Detect if the text line is ended with an hard break\n * text and itext do not have wrapping, return false\n * @param {Number} lineIndex text to split\n * @return {Boolean}\n */\n isEndOfWrapping(lineIndex: number): boolean {\n if (!this._styleMap[lineIndex + 1]) {\n // is last line, return true;\n return true;\n }\n if (this._styleMap[lineIndex + 1].line !== this._styleMap[lineIndex].line) {\n // this is last line before a line break, return true;\n return true;\n }\n return false;\n }\n\n /**\n * Detect if a line has a linebreak and so we need to account for it when moving\n * and counting style.\n * This is important only for splitByGrapheme at the end of wrapping.\n * If we are not wrapping the offset is always 1\n * @return Number\n */\n missingNewlineOffset(lineIndex: number, skipWrapping?: boolean): 0 | 1 {\n if (this.splitByGrapheme && !skipWrapping) {\n return this.isEndOfWrapping(lineIndex) ? 1 : 0;\n }\n return 1;\n }\n\n /**\n * Gets lines of text to render in the Textbox. This function calculates\n * text wrapping on the fly every time it is called.\n * @param {String} text text to split\n * @returns {Array} Array of lines in the Textbox.\n * @override\n */\n _splitTextIntoLines(text: string) {\n const newText = super._splitTextIntoLines(text),\n graphemeLines = this._wrapText(newText.lines, this.width),\n lines = new Array(graphemeLines.length);\n for (let i = 0; i < graphemeLines.length; i++) {\n lines[i] = graphemeLines[i].join('');\n }\n newText.lines = lines;\n newText.graphemeLines = graphemeLines;\n return newText;\n }\n\n getMinWidth() {\n return Math.max(this.minWidth, this.dynamicMinWidth);\n }\n\n _removeExtraneousStyles() {\n const linesToKeep = new Map();\n for (const prop in this._styleMap) {\n const propNumber = parseInt(prop, 10);\n if (this._textLines[propNumber]) {\n const lineIndex = this._styleMap[prop].line;\n linesToKeep.set(`${lineIndex}`, true);\n }\n }\n for (const prop in this.styles) {\n if (!linesToKeep.has(prop)) {\n delete this.styles[prop];\n }\n }\n }\n\n /**\n * Returns object representation of an instance\n * @method toObject\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} object representation of an instance\n */\n toObject<\n T extends Omit, keyof SProps>,\n K extends keyof T = never,\n >(propertiesToInclude: K[] = []): Pick & SProps {\n return super.toObject([\n 'minWidth',\n 'splitByGrapheme',\n ...propertiesToInclude,\n ] as K[]);\n }\n}\n\nclassRegistry.setClass(Textbox);\n","import { Point } from '../../Point';\nimport type { FabricObject } from '../../shapes/Object/FabricObject';\nimport { makeBoundingBoxFromPoints } from '../../util/misc/boundingBoxFromPoints';\nimport { sendPointToPlane } from '../../util/misc/planeChange';\nimport type { LayoutStrategyResult, StrictLayoutContext } from '../types';\nimport { LayoutStrategy } from './LayoutStrategy';\nimport { getObjectBounds } from './utils';\nimport { classRegistry } from '../../ClassRegistry';\n\n/**\n * Layout will adjust the bounding box to match the clip path bounding box.\n */\nexport class ClipPathLayout extends LayoutStrategy {\n static readonly type = 'clip-path';\n\n shouldPerformLayout(context: StrictLayoutContext): boolean {\n return !!context.target.clipPath && super.shouldPerformLayout(context);\n }\n\n shouldLayoutClipPath() {\n return false;\n }\n\n calcLayoutResult(\n context: StrictLayoutContext,\n objects: FabricObject[],\n ): LayoutStrategyResult | undefined {\n const { target } = context;\n const { clipPath, group } = target;\n if (!clipPath || !this.shouldPerformLayout(context)) {\n return;\n }\n // TODO: remove stroke calculation from this case\n const { width, height } = makeBoundingBoxFromPoints(\n getObjectBounds(target, clipPath as FabricObject),\n );\n const size = new Point(width, height);\n if (clipPath.absolutePositioned) {\n // we want the center point to exist in group's containing plane\n const clipPathCenter = sendPointToPlane(\n clipPath.getRelativeCenterPoint(),\n undefined,\n group ? group.calcTransformMatrix() : undefined,\n );\n return {\n center: clipPathCenter,\n size,\n };\n } else {\n // we want the center point to exist in group's containing plane, so we send it upwards\n const clipPathCenter = clipPath\n .getRelativeCenterPoint()\n .transform(target.calcOwnMatrix(), true);\n if (this.shouldPerformLayout(context)) {\n // the clip path is positioned relative to the group's center which is affected by the bbox\n // so we first calculate the bbox\n const { center = new Point(), correction = new Point() } =\n this.calcBoundingBox(objects, context) || {};\n return {\n center: center.add(clipPathCenter),\n correction: correction.subtract(clipPathCenter),\n size,\n };\n } else {\n return {\n center: target.getRelativeCenterPoint().add(clipPathCenter),\n size,\n };\n }\n }\n }\n}\n\nclassRegistry.setClass(ClipPathLayout);\n","import { Point } from '../../Point';\nimport type {\n InitializationLayoutContext,\n LayoutStrategyResult,\n StrictLayoutContext,\n} from '../types';\nimport { LayoutStrategy } from './LayoutStrategy';\nimport { classRegistry } from '../../ClassRegistry';\n\n/**\n * Layout will keep target's initial size.\n */\nexport class FixedLayout extends LayoutStrategy {\n static readonly type = 'fixed';\n\n /**\n * @override respect target's initial size\n */\n getInitialSize(\n { target }: StrictLayoutContext & InitializationLayoutContext,\n { size }: Pick,\n ): Point {\n return new Point(target.width || size.x, target.height || size.y);\n }\n}\n\nclassRegistry.setClass(FixedLayout);\n","import { LayoutManager } from './LayoutManager';\nimport type { RegistrationContext, StrictLayoutContext } from './types';\nimport type { Group } from '../shapes/Group';\n\n/**\n * Today the LayoutManager class also takes care of subscribing event handlers\n * to update the group layout when the group is interactive and a transform is applied\n * to a child object.\n * The ActiveSelection is never interactive, but it could contain objects from\n * groups that are.\n * The standard LayoutManager would subscribe the children of the activeSelection to\n * perform layout changes to the active selection itself, what we need instead is that\n * the transformation applied to the active selection will trigger changes to the\n * original group of the children ( the one referenced under the parent property )\n * This subclass of the LayoutManager has a single duty to fill the gap of this difference.`\n */\nexport class ActiveSelectionLayoutManager extends LayoutManager {\n subscribeTargets(\n context: RegistrationContext & Partial,\n ): void {\n const activeSelection = context.target;\n const parents = context.targets.reduce((parents, target) => {\n target.parent && parents.add(target.parent);\n return parents;\n }, new Set());\n parents.forEach((parent) => {\n parent.layoutManager.subscribeTargets({\n target: parent,\n targets: [activeSelection],\n });\n });\n }\n\n /**\n * unsubscribe from parent only if all its children were deselected\n */\n unsubscribeTargets(\n context: RegistrationContext & Partial,\n ): void {\n const activeSelection = context.target;\n const selectedObjects = activeSelection.getObjects();\n const parents = context.targets.reduce((parents, target) => {\n target.parent && parents.add(target.parent);\n return parents;\n }, new Set());\n parents.forEach((parent) => {\n !selectedObjects.some((object) => object.parent === parent) &&\n parent.layoutManager.unsubscribeTargets({\n target: parent,\n targets: [activeSelection],\n });\n });\n }\n}\n","import type { ControlRenderingStyleOverride } from '../controls/controlRendering';\nimport { classRegistry } from '../ClassRegistry';\nimport type { GroupProps } from './Group';\nimport { Group } from './Group';\nimport type { FabricObject } from './Object/FabricObject';\nimport {\n LAYOUT_TYPE_ADDED,\n LAYOUT_TYPE_REMOVED,\n} from '../LayoutManager/constants';\nimport type { TClassProperties } from '../typedefs';\nimport { log } from '../util/internals/console';\nimport { ActiveSelectionLayoutManager } from '../LayoutManager/ActiveSelectionLayoutManager';\n\nexport type MultiSelectionStacking = 'canvas-stacking' | 'selection-order';\n\nexport interface ActiveSelectionOptions extends GroupProps {\n multiSelectionStacking: MultiSelectionStacking;\n}\n\nconst activeSelectionDefaultValues: Partial> =\n {\n multiSelectionStacking: 'canvas-stacking',\n };\n\n/**\n * Used by Canvas to manage selection.\n *\n * @example\n * class MyActiveSelection extends ActiveSelection {\n * ...\n * }\n *\n * // override the default `ActiveSelection` class\n * classRegistry.setClass(MyActiveSelection)\n */\nexport class ActiveSelection extends Group {\n static type = 'ActiveSelection';\n\n static ownDefaults: Record = activeSelectionDefaultValues;\n\n static getDefaults(): Record {\n return { ...super.getDefaults(), ...ActiveSelection.ownDefaults };\n }\n\n /**\n * The ActiveSelection needs to use the ActiveSelectionLayoutManager\n * or selections on interactive groups may be broken\n */\n declare layoutManager: ActiveSelectionLayoutManager;\n\n /**\n * controls how selected objects are added during a multiselection event\n * - `canvas-stacking` adds the selected object to the active selection while respecting canvas object stacking order\n * - `selection-order` adds the selected object to the top of the stack,\n * meaning that the stack is ordered by the order in which objects were selected\n * @default `canvas-stacking`\n */\n declare multiSelectionStacking: MultiSelectionStacking;\n\n constructor(\n objects: FabricObject[] = [],\n options: Partial = {},\n ) {\n super();\n Object.assign(this, ActiveSelection.ownDefaults);\n this.setOptions(options);\n const { left, top, layoutManager } = options;\n this.groupInit(objects, {\n left,\n top,\n layoutManager: layoutManager ?? new ActiveSelectionLayoutManager(),\n });\n }\n\n /**\n * @private\n */\n _shouldSetNestedCoords() {\n return true;\n }\n\n /**\n * @private\n * @override we don't want the selection monitor to be active\n */\n __objectSelectionMonitor() {\n // noop\n }\n\n /**\n * Adds objects with respect to {@link multiSelectionStacking}\n * @param targets object to add to selection\n */\n multiSelectAdd(...targets: FabricObject[]) {\n if (this.multiSelectionStacking === 'selection-order') {\n this.add(...targets);\n } else {\n // respect object stacking as it is on canvas\n // perf enhancement for large ActiveSelection: consider a binary search of `isInFrontOf`\n targets.forEach((target) => {\n const index = this._objects.findIndex((obj) => obj.isInFrontOf(target));\n const insertAt =\n index === -1\n ? // `target` is in front of all other objects\n this.size()\n : index;\n this.insertAt(insertAt, target);\n });\n }\n }\n\n /**\n * @override block ancestors/descendants of selected objects from being selected to prevent a circular object tree\n */\n canEnterGroup(object: FabricObject) {\n if (\n this.getObjects().some(\n (o) => o.isDescendantOf(object) || object.isDescendantOf(o),\n )\n ) {\n // prevent circular object tree\n log(\n 'error',\n 'ActiveSelection: circular object trees are not supported, this call has no effect',\n );\n return false;\n }\n\n return super.canEnterGroup(object);\n }\n\n /**\n * Change an object so that it can be part of an active selection.\n * this method is called by multiselectAdd from canvas code.\n * @private\n * @param {FabricObject} object\n * @param {boolean} [removeParentTransform] true if object is in canvas coordinate plane\n */\n enterGroup(object: FabricObject, removeParentTransform?: boolean) {\n // This condition check that the object has currently a group, and the group\n // is also its parent, meaning that is not in an active selection, but is\n // in a normal group.\n if (object.parent && object.parent === object.group) {\n // Disconnect the object from the group functionalities, but keep the ref parent intact\n // for later re-enter\n object.parent._exitGroup(object);\n // in this case the object is probably inside an active selection.\n } else if (object.group && object.parent !== object.group) {\n // in this case group.remove will also clear the old parent reference.\n object.group.remove(object);\n }\n // enter the active selection from a render perspective\n // the object will be in the objects array of both the ActiveSelection and the Group\n // but referenced in the group's _activeObjects so that it won't be rendered twice.\n this._enterGroup(object, removeParentTransform);\n }\n\n /**\n * we want objects to retain their canvas ref when exiting instance\n * @private\n * @param {FabricObject} object\n * @param {boolean} [removeParentTransform] true if object should exit group without applying group's transform to it\n */\n exitGroup(object: FabricObject, removeParentTransform?: boolean) {\n this._exitGroup(object, removeParentTransform);\n // return to parent\n object.parent && object.parent._enterGroup(object, true);\n }\n\n /**\n * @private\n * @param {'added'|'removed'} type\n * @param {FabricObject[]} targets\n */\n _onAfterObjectsChange(type: 'added' | 'removed', targets: FabricObject[]) {\n super._onAfterObjectsChange(type, targets);\n const groups = new Set();\n targets.forEach((object) => {\n const { parent } = object;\n parent && groups.add(parent);\n });\n if (type === LAYOUT_TYPE_REMOVED) {\n // invalidate groups' layout and mark as dirty\n groups.forEach((group) => {\n group._onAfterObjectsChange(LAYOUT_TYPE_ADDED, targets);\n });\n } else {\n // mark groups as dirty\n groups.forEach((group) => {\n group._set('dirty', true);\n });\n }\n }\n\n /**\n * @override remove all objects\n */\n onDeselect() {\n this.removeAll();\n return false;\n }\n\n /**\n * Returns string representation of a group\n * @return {String}\n */\n toString() {\n return `#`;\n }\n\n /**\n * Decide if the object should cache or not. The Active selection never caches\n * @return {Boolean}\n */\n shouldCache() {\n return false;\n }\n\n /**\n * Check if this group or its parent group are caching, recursively up\n * @return {Boolean}\n */\n isOnACache() {\n return false;\n }\n\n /**\n * Renders controls and borders for the object\n * @param {CanvasRenderingContext2D} ctx Context to render on\n * @param {Object} [styleOverride] properties to override the object style\n * @param {Object} [childrenOverride] properties to override the children overrides\n */\n _renderControls(\n ctx: CanvasRenderingContext2D,\n styleOverride?: ControlRenderingStyleOverride,\n childrenOverride?: ControlRenderingStyleOverride,\n ) {\n ctx.save();\n ctx.globalAlpha = this.isMoving ? this.borderOpacityWhenMoving : 1;\n const options = {\n hasControls: false,\n ...childrenOverride,\n forActiveSelection: true,\n };\n for (let i = 0; i < this._objects.length; i++) {\n this._objects[i]._renderControls(ctx, options);\n }\n super._renderControls(ctx, styleOverride);\n ctx.restore();\n }\n}\n\nclassRegistry.setClass(ActiveSelection);\nclassRegistry.setClass(ActiveSelection, 'activeSelection');\n","/**\n * Canvas 2D filter backend.\n */\nimport type { BaseFilter } from './BaseFilter';\nimport type { T2DPipelineState, TPipelineResources } from './typedefs';\n\nexport class Canvas2dFilterBackend {\n /**\n * Experimental. This object is a sort of repository of help layers used to avoid\n * of recreating them during frequent filtering. If you are previewing a filter with\n * a slider you probably do not want to create help layers every filter step.\n * in this object there will be appended some canvases, created once, resized sometimes\n * cleared never. Clearing is left to the developer.\n **/\n resources: TPipelineResources = {};\n\n /**\n * Apply a set of filters against a source image and draw the filtered output\n * to the provided destination canvas.\n *\n * @param {EnhancedFilter} filters The filter to apply.\n * @param {HTMLImageElement|HTMLCanvasElement} sourceElement The source to be filtered.\n * @param {Number} sourceWidth The width of the source input.\n * @param {Number} sourceHeight The height of the source input.\n * @param {HTMLCanvasElement} targetCanvas The destination for filtered output to be drawn.\n */\n applyFilters(\n filters: BaseFilter>[],\n sourceElement: CanvasImageSource,\n sourceWidth: number,\n sourceHeight: number,\n targetCanvas: HTMLCanvasElement,\n ): T2DPipelineState | void {\n const ctx = targetCanvas.getContext('2d', {\n willReadFrequently: true,\n desynchronized: true,\n });\n if (!ctx) {\n return;\n }\n ctx.drawImage(sourceElement, 0, 0, sourceWidth, sourceHeight);\n const imageData = ctx.getImageData(0, 0, sourceWidth, sourceHeight);\n const originalImageData = ctx.getImageData(0, 0, sourceWidth, sourceHeight);\n const pipelineState: T2DPipelineState = {\n sourceWidth,\n sourceHeight,\n imageData,\n originalEl: sourceElement,\n originalImageData,\n canvasEl: targetCanvas,\n ctx,\n filterBackend: this,\n };\n filters.forEach((filter) => {\n filter.applyTo(pipelineState);\n });\n const { imageData: imageDataPostFilter } = pipelineState;\n if (\n imageDataPostFilter.width !== sourceWidth ||\n imageDataPostFilter.height !== sourceHeight\n ) {\n targetCanvas.width = imageDataPostFilter.width;\n targetCanvas.height = imageDataPostFilter.height;\n }\n ctx.putImageData(imageDataPostFilter, 0, 0);\n return pipelineState;\n }\n}\n","import { config } from '../config';\nimport { createCanvasElementFor } from '../util/misc/dom';\nimport type {\n TWebGLPipelineState,\n TProgramCache,\n TTextureCache,\n TPipelineResources,\n} from './typedefs';\nimport type { BaseFilter } from './BaseFilter';\n\nexport class WebGLFilterBackend {\n declare tileSize: number;\n\n /**\n * Define ...\n **/\n aPosition: Float32Array = new Float32Array([0, 0, 0, 1, 1, 0, 1, 1]);\n\n /**\n * If GLPut data is the fastest operation, or if forced, this buffer will be used\n * to transfer the data back in the 2d logic\n **/\n declare imageBuffer?: ArrayBuffer;\n\n declare canvas: HTMLCanvasElement;\n\n /**\n * The Webgl context that will execute the operations for filtering\n **/\n declare gl: WebGLRenderingContext;\n\n /**\n * Keyed map for shader cache\n **/\n declare programCache: TProgramCache;\n\n /**\n * Keyed map for texture cache\n **/\n declare textureCache: TTextureCache;\n\n /**\n * Contains GPU info for debug\n **/\n declare gpuInfo: any;\n\n /**\n * Experimental. This object is a sort of repository of help layers used to avoid\n * of recreating them during frequent filtering. If you are previewing a filter with\n * a slider you probably do not want to create help layers every filter step.\n * in this object there will be appended some canvases, created once, resized sometimes\n * cleared never. Clearing is left to the developer.\n **/\n resources: TPipelineResources = {};\n\n constructor({ tileSize = config.textureSize } = {}) {\n this.tileSize = tileSize;\n this.setupGLContext(tileSize, tileSize);\n this.captureGPUInfo();\n }\n\n /**\n * Setup a WebGL context suitable for filtering, and bind any needed event handlers.\n */\n setupGLContext(width: number, height: number): void {\n this.dispose();\n this.createWebGLCanvas(width, height);\n }\n\n /**\n * Create a canvas element and associated WebGL context and attaches them as\n * class properties to the GLFilterBackend class.\n */\n createWebGLCanvas(width: number, height: number): void {\n const canvas = createCanvasElementFor({ width, height });\n const glOptions = {\n alpha: true,\n premultipliedAlpha: false,\n depth: false,\n stencil: false,\n antialias: false,\n },\n gl = canvas.getContext('webgl', glOptions) as WebGLRenderingContext;\n\n if (!gl) {\n return;\n }\n gl.clearColor(0, 0, 0, 0);\n // this canvas can fire webglcontextlost and webglcontextrestored\n this.canvas = canvas;\n this.gl = gl;\n }\n\n /**\n * Attempts to apply the requested filters to the source provided, drawing the filtered output\n * to the provided target canvas.\n *\n * @param {Array} filters The filters to apply.\n * @param {TexImageSource} source The source to be filtered.\n * @param {Number} width The width of the source input.\n * @param {Number} height The height of the source input.\n * @param {HTMLCanvasElement} targetCanvas The destination for filtered output to be drawn.\n * @param {String|undefined} cacheKey A key used to cache resources related to the source. If\n * omitted, caching will be skipped.\n */\n applyFilters(\n filters: BaseFilter>[],\n source: TexImageSource,\n width: number,\n height: number,\n targetCanvas: HTMLCanvasElement,\n cacheKey?: string,\n ): TWebGLPipelineState | undefined {\n const gl = this.gl;\n const ctx = targetCanvas.getContext('2d');\n if (!gl || !ctx) {\n return;\n }\n let cachedTexture;\n if (cacheKey) {\n cachedTexture = this.getCachedTexture(cacheKey, source);\n }\n const pipelineState: TWebGLPipelineState = {\n originalWidth:\n (source as HTMLImageElement).width ||\n (source as HTMLImageElement).naturalWidth ||\n 0,\n originalHeight:\n (source as HTMLImageElement).height ||\n (source as HTMLImageElement).naturalHeight ||\n 0,\n sourceWidth: width,\n sourceHeight: height,\n destinationWidth: width,\n destinationHeight: height,\n context: gl,\n sourceTexture: this.createTexture(\n gl,\n width,\n height,\n !cachedTexture ? source : undefined,\n ),\n targetTexture: this.createTexture(gl, width, height),\n originalTexture:\n cachedTexture ||\n this.createTexture(\n gl,\n width,\n height,\n !cachedTexture ? source : undefined,\n ),\n passes: filters.length,\n webgl: true,\n aPosition: this.aPosition,\n programCache: this.programCache,\n pass: 0,\n filterBackend: this,\n targetCanvas: targetCanvas,\n };\n const tempFbo = gl.createFramebuffer();\n gl.bindFramebuffer(gl.FRAMEBUFFER, tempFbo);\n filters.forEach((filter: any) => {\n filter && filter.applyTo(pipelineState);\n });\n resizeCanvasIfNeeded(pipelineState);\n this.copyGLTo2D(gl, pipelineState);\n gl.bindTexture(gl.TEXTURE_2D, null);\n gl.deleteTexture(pipelineState.sourceTexture);\n gl.deleteTexture(pipelineState.targetTexture);\n gl.deleteFramebuffer(tempFbo);\n ctx.setTransform(1, 0, 0, 1, 0, 0);\n return pipelineState;\n }\n\n /**\n * Detach event listeners, remove references, and clean up caches.\n */\n dispose() {\n if (this.canvas) {\n // we are disposing, we don't care about the fact\n // that the canvas shouldn't be null.\n // @ts-expect-error disposing\n this.canvas = null;\n // @ts-expect-error disposing\n this.gl = null;\n }\n this.clearWebGLCaches();\n }\n\n /**\n * Wipe out WebGL-related caches.\n */\n clearWebGLCaches() {\n this.programCache = {};\n this.textureCache = {};\n }\n\n /**\n * Create a WebGL texture object.\n *\n * Accepts specific dimensions to initialize the texture to or a source image.\n *\n * @param {WebGLRenderingContext} gl The GL context to use for creating the texture.\n * @param {number} width The width to initialize the texture at.\n * @param {number} height The height to initialize the texture.\n * @param {TexImageSource} textureImageSource A source for the texture data.\n * @param {number} filter gl.NEAREST default or gl.LINEAR filters for the texture.\n * This filter is very useful for LUTs filters. If you need interpolation use gl.LINEAR\n * @returns {WebGLTexture}\n */\n createTexture(\n gl: WebGLRenderingContext,\n width: number,\n height: number,\n textureImageSource?: TexImageSource,\n filter?:\n | WebGLRenderingContextBase['NEAREST']\n | WebGLRenderingContextBase['LINEAR'],\n ) {\n const {\n NEAREST,\n TEXTURE_2D,\n RGBA,\n UNSIGNED_BYTE,\n CLAMP_TO_EDGE,\n TEXTURE_MAG_FILTER,\n TEXTURE_MIN_FILTER,\n TEXTURE_WRAP_S,\n TEXTURE_WRAP_T,\n } = gl;\n const texture = gl.createTexture();\n gl.bindTexture(TEXTURE_2D, texture);\n gl.texParameteri(TEXTURE_2D, TEXTURE_MAG_FILTER, filter || NEAREST);\n gl.texParameteri(TEXTURE_2D, TEXTURE_MIN_FILTER, filter || NEAREST);\n gl.texParameteri(TEXTURE_2D, TEXTURE_WRAP_S, CLAMP_TO_EDGE);\n gl.texParameteri(TEXTURE_2D, TEXTURE_WRAP_T, CLAMP_TO_EDGE);\n if (textureImageSource) {\n gl.texImage2D(\n TEXTURE_2D,\n 0,\n RGBA,\n RGBA,\n UNSIGNED_BYTE,\n textureImageSource,\n );\n } else {\n gl.texImage2D(\n TEXTURE_2D,\n 0,\n RGBA,\n width,\n height,\n 0,\n RGBA,\n UNSIGNED_BYTE,\n null,\n );\n }\n return texture;\n }\n\n /**\n * Can be optionally used to get a texture from the cache array\n *\n * If an existing texture is not found, a new texture is created and cached.\n *\n * @param {String} uniqueId A cache key to use to find an existing texture.\n * @param {HTMLImageElement|HTMLCanvasElement} textureImageSource A source to use to create the\n * texture cache entry if one does not already exist.\n */\n getCachedTexture(\n uniqueId: string,\n textureImageSource: TexImageSource,\n filter?:\n | WebGLRenderingContextBase['NEAREST']\n | WebGLRenderingContextBase['LINEAR'],\n ): WebGLTexture | null {\n const { textureCache } = this;\n if (textureCache[uniqueId]) {\n return textureCache[uniqueId];\n } else {\n const texture = this.createTexture(\n this.gl,\n (textureImageSource as HTMLImageElement).width,\n (textureImageSource as HTMLImageElement).height,\n textureImageSource,\n filter,\n );\n if (texture) {\n textureCache[uniqueId] = texture;\n }\n return texture;\n }\n }\n\n /**\n * Clear out cached resources related to a source image that has been\n * filtered previously.\n *\n * @param {String} cacheKey The cache key provided when the source image was filtered.\n */\n evictCachesForKey(cacheKey: string) {\n if (this.textureCache[cacheKey]) {\n this.gl.deleteTexture(this.textureCache[cacheKey]);\n delete this.textureCache[cacheKey];\n }\n }\n\n /**\n * Copy an input WebGL canvas on to an output 2D canvas.\n *\n * The WebGL canvas is assumed to be upside down, with the top-left pixel of the\n * desired output image appearing in the bottom-left corner of the WebGL canvas.\n *\n * @param {WebGLRenderingContext} sourceContext The WebGL context to copy from.\n * @param {Object} pipelineState The 2D target canvas to copy on to.\n */\n copyGLTo2D(gl: WebGLRenderingContext, pipelineState: TWebGLPipelineState) {\n const glCanvas = gl.canvas,\n targetCanvas = pipelineState.targetCanvas,\n ctx = targetCanvas.getContext('2d');\n if (!ctx) {\n return;\n }\n ctx.translate(0, targetCanvas.height); // move it down again\n ctx.scale(1, -1); // vertical flip\n // where is my image on the big glcanvas?\n const sourceY = glCanvas.height - targetCanvas.height;\n ctx.drawImage(\n glCanvas,\n 0,\n sourceY,\n targetCanvas.width,\n targetCanvas.height,\n 0,\n 0,\n targetCanvas.width,\n targetCanvas.height,\n );\n }\n\n /**\n * Copy an input WebGL canvas on to an output 2D canvas using 2d canvas' putImageData\n * API. Measurably faster than using ctx.drawImage in Firefox (version 54 on OSX Sierra).\n *\n * @param {WebGLRenderingContext} sourceContext The WebGL context to copy from.\n * @param {HTMLCanvasElement} targetCanvas The 2D target canvas to copy on to.\n * @param {Object} pipelineState The 2D target canvas to copy on to.\n */\n copyGLTo2DPutImageData(\n this: Required,\n gl: WebGLRenderingContext,\n pipelineState: TWebGLPipelineState,\n ) {\n const targetCanvas = pipelineState.targetCanvas,\n ctx = targetCanvas.getContext('2d'),\n dWidth = pipelineState.destinationWidth,\n dHeight = pipelineState.destinationHeight,\n numBytes = dWidth * dHeight * 4;\n if (!ctx) {\n return;\n }\n const u8 = new Uint8Array(this.imageBuffer, 0, numBytes);\n const u8Clamped = new Uint8ClampedArray(this.imageBuffer, 0, numBytes);\n\n gl.readPixels(0, 0, dWidth, dHeight, gl.RGBA, gl.UNSIGNED_BYTE, u8);\n const imgData = new ImageData(u8Clamped, dWidth, dHeight);\n ctx.putImageData(imgData, 0, 0);\n }\n\n /**\n * Attempt to extract GPU information strings from a WebGL context.\n *\n * Useful information when debugging or blacklisting specific GPUs.\n *\n * @returns {Object} A GPU info object with renderer and vendor strings.\n */\n captureGPUInfo() {\n if (this.gpuInfo) {\n return this.gpuInfo;\n }\n const gl = this.gl,\n gpuInfo = { renderer: '', vendor: '' };\n if (!gl) {\n return gpuInfo;\n }\n const ext = gl.getExtension('WEBGL_debug_renderer_info');\n if (ext) {\n const renderer = gl.getParameter(ext.UNMASKED_RENDERER_WEBGL);\n const vendor = gl.getParameter(ext.UNMASKED_VENDOR_WEBGL);\n if (renderer) {\n gpuInfo.renderer = renderer.toLowerCase();\n }\n if (vendor) {\n gpuInfo.vendor = vendor.toLowerCase();\n }\n }\n this.gpuInfo = gpuInfo;\n return gpuInfo;\n }\n}\n\nfunction resizeCanvasIfNeeded(pipelineState: TWebGLPipelineState): void {\n const targetCanvas = pipelineState.targetCanvas,\n width = targetCanvas.width,\n height = targetCanvas.height,\n dWidth = pipelineState.destinationWidth,\n dHeight = pipelineState.destinationHeight;\n\n if (width !== dWidth || height !== dHeight) {\n targetCanvas.width = dWidth;\n targetCanvas.height = dHeight;\n }\n}\n","import { config } from '../config';\nimport { getEnv } from '../env';\nimport { createCanvasElement } from '../util/misc/dom';\nimport { Canvas2dFilterBackend } from './Canvas2dFilterBackend';\nimport { WebGLFilterBackend } from './WebGLFilterBackend';\n\nexport type FilterBackend = WebGLFilterBackend | Canvas2dFilterBackend;\n\nlet filterBackend: FilterBackend;\n\n/**\n * Verifies if it is possible to initialize webgl or fallback on a canvas2d filtering backend\n */\nexport function initFilterBackend(): FilterBackend {\n const { WebGLProbe } = getEnv();\n WebGLProbe.queryWebGL(createCanvasElement());\n if (config.enableGLFiltering && WebGLProbe.isSupported(config.textureSize)) {\n return new WebGLFilterBackend({ tileSize: config.textureSize });\n } else {\n return new Canvas2dFilterBackend();\n }\n}\n\n/**\n * Get the current fabricJS filter backend or initialize one if not available yet\n * @param [strict] pass `true` to create the backend if it wasn't created yet (default behavior),\n * pass `false` to get the backend ref without mutating it\n */\nexport function getFilterBackend(strict = true): FilterBackend {\n if (!filterBackend && strict) {\n filterBackend = initFilterBackend();\n }\n return filterBackend;\n}\n\nexport function setFilterBackend(backend: FilterBackend) {\n filterBackend = backend;\n}\n","import { getFabricDocument, getEnv } from '../env';\nimport type { BaseFilter } from '../filters/BaseFilter';\nimport { getFilterBackend } from '../filters/FilterBackend';\nimport { SHARED_ATTRIBUTES } from '../parser/attributes';\nimport { parseAttributes } from '../parser/parseAttributes';\nimport type {\n TClassProperties,\n TCrossOrigin,\n TSize,\n Abortable,\n TOptions,\n} from '../typedefs';\nimport { uid } from '../util/internals/uid';\nimport { createCanvasElementFor } from '../util/misc/dom';\nimport { findScaleToCover, findScaleToFit } from '../util/misc/findScaleTo';\nimport type { LoadImageOptions } from '../util/misc/objectEnlive';\nimport {\n enlivenObjectEnlivables,\n enlivenObjects,\n loadImage,\n} from '../util/misc/objectEnlive';\nimport { parsePreserveAspectRatioAttribute } from '../util/misc/svgParsing';\nimport { classRegistry } from '../ClassRegistry';\nimport { FabricObject, cacheProperties } from './Object/FabricObject';\nimport type { FabricObjectProps, SerializedObjectProps } from './Object/types';\nimport type { ObjectEvents } from '../EventTypeDefs';\nimport { WebGLFilterBackend } from '../filters/WebGLFilterBackend';\nimport { FILL, NONE } from '../constants';\nimport { getDocumentFromElement } from '../util/dom_misc';\nimport type { CSSRules } from '../parser/typedefs';\nimport type { Resize, ResizeSerializedProps } from '../filters/Resize';\nimport type { TCachedFabricObject } from './Object/Object';\nimport { log } from '../util/internals/console';\n\n// @todo Would be nice to have filtering code not imported directly.\n\nexport type ImageSource =\n | HTMLImageElement\n | HTMLVideoElement\n | HTMLCanvasElement;\n\ninterface UniqueImageProps {\n srcFromAttribute: boolean;\n minimumScaleTrigger: number;\n cropX: number;\n cropY: number;\n imageSmoothing: boolean;\n filters: BaseFilter>[];\n resizeFilter?: Resize;\n}\n\nexport const imageDefaultValues: Partial> = {\n strokeWidth: 0,\n srcFromAttribute: false,\n minimumScaleTrigger: 0.5,\n cropX: 0,\n cropY: 0,\n imageSmoothing: true,\n};\n\nexport interface SerializedImageProps extends SerializedObjectProps {\n src: string;\n crossOrigin: TCrossOrigin;\n filters: any[];\n resizeFilter?: ResizeSerializedProps;\n cropX: number;\n cropY: number;\n}\n\nexport interface ImageProps extends FabricObjectProps, UniqueImageProps {}\n\nconst IMAGE_PROPS = ['cropX', 'cropY'] as const;\n\n/**\n * @tutorial {@link http://fabricjs.com/fabric-intro-part-1#images}\n */\nexport class FabricImage<\n Props extends TOptions = Partial,\n SProps extends SerializedImageProps = SerializedImageProps,\n EventSpec extends ObjectEvents = ObjectEvents,\n >\n extends FabricObject\n implements ImageProps\n{\n /**\n * When calling {@link FabricImage.getSrc}, return value from element src with `element.getAttribute('src')`.\n * This allows for relative urls as image src.\n * @since 2.7.0\n * @type Boolean\n * @default false\n */\n declare srcFromAttribute: boolean;\n\n /**\n * private\n * contains last value of scaleX to detect\n * if the Image got resized after the last Render\n * @type Number\n */\n protected _lastScaleX = 1;\n\n /**\n * private\n * contains last value of scaleY to detect\n * if the Image got resized after the last Render\n * @type Number\n */\n protected _lastScaleY = 1;\n\n /**\n * private\n * contains last value of scaling applied by the apply filter chain\n * @type Number\n */\n protected _filterScalingX = 1;\n\n /**\n * private\n * contains last value of scaling applied by the apply filter chain\n * @type Number\n */\n protected _filterScalingY = 1;\n\n /**\n * minimum scale factor under which any resizeFilter is triggered to resize the image\n * 0 will disable the automatic resize. 1 will trigger automatically always.\n * number bigger than 1 are not implemented yet.\n * @type Number\n */\n declare minimumScaleTrigger: number;\n\n /**\n * key used to retrieve the texture representing this image\n * @since 2.0.0\n * @type String\n */\n declare cacheKey: string;\n\n /**\n * Image crop in pixels from original image size.\n * @since 2.0.0\n * @type Number\n */\n declare cropX: number;\n\n /**\n * Image crop in pixels from original image size.\n * @since 2.0.0\n * @type Number\n */\n declare cropY: number;\n\n /**\n * Indicates whether this canvas will use image smoothing when painting this image.\n * Also influence if the cacheCanvas for this image uses imageSmoothing\n * @since 4.0.0-beta.11\n * @type Boolean\n */\n declare imageSmoothing: boolean;\n\n declare preserveAspectRatio: string;\n\n declare protected src: string;\n\n declare filters: BaseFilter>[];\n declare resizeFilter: Resize;\n\n declare _element: ImageSource;\n declare _filteredEl?: HTMLCanvasElement;\n declare _originalElement: ImageSource;\n\n static type = 'Image';\n\n static cacheProperties = [...cacheProperties, ...IMAGE_PROPS];\n\n static ownDefaults = imageDefaultValues;\n\n static getDefaults(): Record {\n return {\n ...super.getDefaults(),\n ...FabricImage.ownDefaults,\n };\n }\n /**\n * Constructor\n * Image can be initialized with any canvas drawable or a string.\n * The string should be a url and will be loaded as an image.\n * Canvas and Image element work out of the box, while videos require extra code to work.\n * Please check video element events for seeking.\n * @param {ImageSource | string} element Image element\n * @param {Object} [options] Options object\n */\n constructor(elementId: string, options?: Props);\n constructor(element: ImageSource, options?: Props);\n constructor(arg0: ImageSource | string, options?: Props) {\n super();\n this.filters = [];\n Object.assign(this, FabricImage.ownDefaults);\n this.setOptions(options);\n this.cacheKey = `texture${uid()}`;\n this.setElement(\n typeof arg0 === 'string'\n ? ((\n (this.canvas && getDocumentFromElement(this.canvas.getElement())) ||\n getFabricDocument()\n ).getElementById(arg0) as ImageSource)\n : arg0,\n options,\n );\n }\n\n /**\n * Returns image element which this instance if based on\n */\n getElement() {\n return this._element;\n }\n\n /**\n * Sets image element for this instance to a specified one.\n * If filters defined they are applied to new image.\n * You might need to call `canvas.renderAll` and `object.setCoords` after replacing, to render new image and update controls area.\n * @param {HTMLImageElement} element\n * @param {Partial} [size] Options object\n */\n setElement(element: ImageSource, size: Partial = {}) {\n this.removeTexture(this.cacheKey);\n this.removeTexture(`${this.cacheKey}_filtered`);\n this._element = element;\n this._originalElement = element;\n this._setWidthHeight(size);\n if (this.filters.length !== 0) {\n this.applyFilters();\n }\n // resizeFilters work on the already filtered copy.\n // we need to apply resizeFilters AFTER normal filters.\n // applyResizeFilters is run more often than normal filters\n // and is triggered by user interactions rather than dev code\n if (this.resizeFilter) {\n this.applyResizeFilters();\n }\n }\n\n /**\n * Delete a single texture if in webgl mode\n */\n removeTexture(key: string) {\n const backend = getFilterBackend(false);\n if (backend instanceof WebGLFilterBackend) {\n backend.evictCachesForKey(key);\n }\n }\n\n /**\n * Delete textures, reference to elements and eventually JSDOM cleanup\n */\n dispose() {\n super.dispose();\n this.removeTexture(this.cacheKey);\n this.removeTexture(`${this.cacheKey}_filtered`);\n this._cacheContext = null;\n (\n ['_originalElement', '_element', '_filteredEl', '_cacheCanvas'] as const\n ).forEach((elementKey) => {\n const el = this[elementKey];\n el && getEnv().dispose(el);\n // @ts-expect-error disposing\n this[elementKey] = undefined;\n });\n }\n\n /**\n * Get the crossOrigin value (of the corresponding image element)\n */\n getCrossOrigin(): string | null {\n return (\n this._originalElement &&\n ((this._originalElement as any).crossOrigin || null)\n );\n }\n\n /**\n * Returns original size of an image\n */\n getOriginalSize() {\n const element = this.getElement() as any;\n if (!element) {\n return {\n width: 0,\n height: 0,\n };\n }\n return {\n width: element.naturalWidth || element.width,\n height: element.naturalHeight || element.height,\n };\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _stroke(ctx: CanvasRenderingContext2D) {\n if (!this.stroke || this.strokeWidth === 0) {\n return;\n }\n const w = this.width / 2,\n h = this.height / 2;\n ctx.beginPath();\n ctx.moveTo(-w, -h);\n ctx.lineTo(w, -h);\n ctx.lineTo(w, h);\n ctx.lineTo(-w, h);\n ctx.lineTo(-w, -h);\n ctx.closePath();\n }\n\n /**\n * Returns object representation of an instance\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} Object representation of an instance\n */\n toObject<\n T extends Omit, keyof SProps>,\n K extends keyof T = never,\n >(propertiesToInclude: K[] = []): Pick & SProps {\n const filters: Record[] = [];\n this.filters.forEach((filterObj) => {\n filterObj && filters.push(filterObj.toObject());\n });\n return {\n ...super.toObject([...IMAGE_PROPS, ...propertiesToInclude]),\n src: this.getSrc(),\n crossOrigin: this.getCrossOrigin(),\n filters,\n ...(this.resizeFilter\n ? { resizeFilter: this.resizeFilter.toObject() }\n : {}),\n };\n }\n\n /**\n * Returns true if an image has crop applied, inspecting values of cropX,cropY,width,height.\n * @return {Boolean}\n */\n hasCrop() {\n return (\n !!this.cropX ||\n !!this.cropY ||\n this.width < this._element.width ||\n this.height < this._element.height\n );\n }\n\n /**\n * Returns svg representation of an instance\n * @return {string[]} an array of strings with the specific svg representation\n * of the instance\n */\n _toSVG() {\n const imageMarkup: string[] = [],\n element = this._element,\n x = -this.width / 2,\n y = -this.height / 2;\n let svgString: string[] = [],\n strokeSvg: string[] = [],\n clipPath = '',\n imageRendering = '';\n if (!element) {\n return [];\n }\n if (this.hasCrop()) {\n const clipPathId = uid();\n svgString.push(\n '\\n',\n '\\t\\n',\n '\\n',\n );\n clipPath = ' clip-path=\"url(#imageCrop_' + clipPathId + ')\" ';\n }\n if (!this.imageSmoothing) {\n imageRendering = ' image-rendering=\"optimizeSpeed\"';\n }\n imageMarkup.push(\n '\\t element with actual transformation, then offsetting object to the top/left\n // so that object's center aligns with container's left/top\n }\" width=\"${\n element.width || (element as HTMLImageElement).naturalWidth\n }\" height=\"${\n element.height || (element as HTMLImageElement).naturalHeight\n }\"${imageRendering}${clipPath}>\\n`,\n );\n\n if (this.stroke || this.strokeDashArray) {\n const origFill = this.fill;\n this.fill = null;\n strokeSvg = [\n `\\t\\n`,\n ];\n this.fill = origFill;\n }\n if (this.paintFirst !== FILL) {\n svgString = svgString.concat(strokeSvg, imageMarkup);\n } else {\n svgString = svgString.concat(imageMarkup, strokeSvg);\n }\n return svgString;\n }\n\n /**\n * Returns source of an image\n * @param {Boolean} filtered indicates if the src is needed for svg\n * @return {String} Source of an image\n */\n getSrc(filtered?: boolean): string {\n const element = filtered ? this._element : this._originalElement;\n if (element) {\n if ((element as HTMLCanvasElement).toDataURL) {\n return (element as HTMLCanvasElement).toDataURL();\n }\n\n if (this.srcFromAttribute) {\n return element.getAttribute('src') || '';\n } else {\n return (element as HTMLImageElement).src;\n }\n } else {\n return this.src || '';\n }\n }\n\n /**\n * Alias for getSrc\n * @param filtered\n * @deprecated\n */\n getSvgSrc(filtered?: boolean) {\n return this.getSrc(filtered);\n }\n\n /**\n * Loads and sets source of an image\\\n * **IMPORTANT**: It is recommended to abort loading tasks before calling this method to prevent race conditions and unnecessary networking\n * @param {String} src Source string (URL)\n * @param {LoadImageOptions} [options] Options object\n */\n setSrc(src: string, { crossOrigin, signal }: LoadImageOptions = {}) {\n return loadImage(src, { crossOrigin, signal }).then((img) => {\n typeof crossOrigin !== 'undefined' && this.set({ crossOrigin });\n this.setElement(img);\n });\n }\n\n /**\n * Returns string representation of an instance\n * @return {String} String representation of an instance\n */\n toString() {\n return `#`;\n }\n\n applyResizeFilters() {\n const filter = this.resizeFilter,\n minimumScale = this.minimumScaleTrigger,\n objectScale = this.getTotalObjectScaling(),\n scaleX = objectScale.x,\n scaleY = objectScale.y,\n elementToFilter = this._filteredEl || this._originalElement;\n if (this.group) {\n this.set('dirty', true);\n }\n if (!filter || (scaleX > minimumScale && scaleY > minimumScale)) {\n this._element = elementToFilter;\n this._filterScalingX = 1;\n this._filterScalingY = 1;\n this._lastScaleX = scaleX;\n this._lastScaleY = scaleY;\n return;\n }\n const canvasEl = createCanvasElementFor(elementToFilter),\n { width, height } = elementToFilter;\n this._element = canvasEl;\n this._lastScaleX = filter.scaleX = scaleX;\n this._lastScaleY = filter.scaleY = scaleY;\n getFilterBackend().applyFilters(\n [filter],\n elementToFilter,\n width,\n height,\n this._element,\n );\n this._filterScalingX = canvasEl.width / this._originalElement.width;\n this._filterScalingY = canvasEl.height / this._originalElement.height;\n }\n\n /**\n * Applies filters assigned to this image (from \"filters\" array) or from filter param\n * @method applyFilters\n * @param {Array} filters to be applied\n * @param {Boolean} forResizing specify if the filter operation is a resize operation\n */\n applyFilters(\n filters: BaseFilter>[] = this.filters || [],\n ) {\n filters = filters.filter((filter) => filter && !filter.isNeutralState());\n this.set('dirty', true);\n\n // needs to clear out or WEBGL will not resize correctly\n this.removeTexture(`${this.cacheKey}_filtered`);\n\n if (filters.length === 0) {\n this._element = this._originalElement;\n // this is unsafe and needs to be rethinkend\n this._filteredEl = undefined;\n this._filterScalingX = 1;\n this._filterScalingY = 1;\n return;\n }\n\n const imgElement = this._originalElement,\n sourceWidth =\n (imgElement as HTMLImageElement).naturalWidth || imgElement.width,\n sourceHeight =\n (imgElement as HTMLImageElement).naturalHeight || imgElement.height;\n\n if (this._element === this._originalElement) {\n // if the _element a reference to _originalElement\n // we need to create a new element to host the filtered pixels\n const canvasEl = createCanvasElementFor({\n width: sourceWidth,\n height: sourceHeight,\n });\n this._element = canvasEl;\n this._filteredEl = canvasEl;\n } else if (this._filteredEl) {\n // if the _element is it own element,\n // and we also have a _filteredEl, then we clean up _filteredEl\n // and we assign it to _element.\n // in this way we invalidate the eventual old resize filtered element\n this._element = this._filteredEl;\n this._filteredEl\n .getContext('2d')!\n .clearRect(0, 0, sourceWidth, sourceHeight);\n // we also need to resize again at next renderAll, so remove saved _lastScaleX/Y\n this._lastScaleX = 1;\n this._lastScaleY = 1;\n }\n getFilterBackend().applyFilters(\n filters,\n this._originalElement,\n sourceWidth,\n sourceHeight,\n this._element as HTMLCanvasElement,\n this.cacheKey,\n );\n if (\n this._originalElement.width !== this._element.width ||\n this._originalElement.height !== this._element.height\n ) {\n this._filterScalingX = this._element.width / this._originalElement.width;\n this._filterScalingY =\n this._element.height / this._originalElement.height;\n }\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _render(ctx: CanvasRenderingContext2D) {\n ctx.imageSmoothingEnabled = this.imageSmoothing;\n if (this.isMoving !== true && this.resizeFilter && this._needsResize()) {\n this.applyResizeFilters();\n }\n this._stroke(ctx);\n this._renderPaintInOrder(ctx);\n }\n\n /**\n * Paint the cached copy of the object on the target context.\n * it will set the imageSmoothing for the draw operation\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n drawCacheOnCanvas(\n this: TCachedFabricObject,\n ctx: CanvasRenderingContext2D,\n ) {\n ctx.imageSmoothingEnabled = this.imageSmoothing;\n super.drawCacheOnCanvas(ctx);\n }\n\n /**\n * Decide if the FabricImage should cache or not. Create its own cache level\n * needsItsOwnCache should be used when the object drawing method requires\n * a cache step.\n * Generally you do not cache objects in groups because the group outside is cached.\n * This is the special Image version where we would like to avoid caching where possible.\n * Essentially images do not benefit from caching. They may require caching, and in that\n * case we do it. Also caching an image usually ends in a loss of details.\n * A full performance audit should be done.\n * @return {Boolean}\n */\n shouldCache() {\n return this.needsItsOwnCache();\n }\n\n _renderFill(ctx: CanvasRenderingContext2D) {\n const elementToDraw = this._element;\n if (!elementToDraw) {\n return;\n }\n const scaleX = this._filterScalingX,\n scaleY = this._filterScalingY,\n w = this.width,\n h = this.height,\n // crop values cannot be lesser than 0.\n cropX = Math.max(this.cropX, 0),\n cropY = Math.max(this.cropY, 0),\n elWidth =\n (elementToDraw as HTMLImageElement).naturalWidth || elementToDraw.width,\n elHeight =\n (elementToDraw as HTMLImageElement).naturalHeight ||\n elementToDraw.height,\n sX = cropX * scaleX,\n sY = cropY * scaleY,\n // the width height cannot exceed element width/height, starting from the crop offset.\n sW = Math.min(w * scaleX, elWidth - sX),\n sH = Math.min(h * scaleY, elHeight - sY),\n x = -w / 2,\n y = -h / 2,\n maxDestW = Math.min(w, elWidth / scaleX - cropX),\n maxDestH = Math.min(h, elHeight / scaleY - cropY);\n\n elementToDraw &&\n ctx.drawImage(elementToDraw, sX, sY, sW, sH, x, y, maxDestW, maxDestH);\n }\n\n /**\n * needed to check if image needs resize\n * @private\n */\n _needsResize() {\n const scale = this.getTotalObjectScaling();\n return scale.x !== this._lastScaleX || scale.y !== this._lastScaleY;\n }\n\n /**\n * @private\n * @deprecated unused\n */\n _resetWidthHeight() {\n this.set(this.getOriginalSize());\n }\n\n /**\n * @private\n * Set the width and the height of the image object, using the element or the\n * options.\n */\n _setWidthHeight({ width, height }: Partial = {}) {\n const size = this.getOriginalSize();\n this.width = width || size.width;\n this.height = height || size.height;\n }\n\n /**\n * Calculate offset for center and scale factor for the image in order to respect\n * the preserveAspectRatio attribute\n * @private\n */\n parsePreserveAspectRatioAttribute() {\n const pAR = parsePreserveAspectRatioAttribute(\n this.preserveAspectRatio || '',\n ),\n pWidth = this.width,\n pHeight = this.height,\n parsedAttributes = { width: pWidth, height: pHeight };\n let rWidth = this._element.width,\n rHeight = this._element.height,\n scaleX = 1,\n scaleY = 1,\n offsetLeft = 0,\n offsetTop = 0,\n cropX = 0,\n cropY = 0,\n offset;\n\n if (pAR && (pAR.alignX !== NONE || pAR.alignY !== NONE)) {\n if (pAR.meetOrSlice === 'meet') {\n scaleX = scaleY = findScaleToFit(this._element, parsedAttributes);\n offset = (pWidth - rWidth * scaleX) / 2;\n if (pAR.alignX === 'Min') {\n offsetLeft = -offset;\n }\n if (pAR.alignX === 'Max') {\n offsetLeft = offset;\n }\n offset = (pHeight - rHeight * scaleY) / 2;\n if (pAR.alignY === 'Min') {\n offsetTop = -offset;\n }\n if (pAR.alignY === 'Max') {\n offsetTop = offset;\n }\n }\n if (pAR.meetOrSlice === 'slice') {\n scaleX = scaleY = findScaleToCover(this._element, parsedAttributes);\n offset = rWidth - pWidth / scaleX;\n if (pAR.alignX === 'Mid') {\n cropX = offset / 2;\n }\n if (pAR.alignX === 'Max') {\n cropX = offset;\n }\n offset = rHeight - pHeight / scaleY;\n if (pAR.alignY === 'Mid') {\n cropY = offset / 2;\n }\n if (pAR.alignY === 'Max') {\n cropY = offset;\n }\n rWidth = pWidth / scaleX;\n rHeight = pHeight / scaleY;\n }\n } else {\n scaleX = pWidth / rWidth;\n scaleY = pHeight / rHeight;\n }\n return {\n width: rWidth,\n height: rHeight,\n scaleX,\n scaleY,\n offsetLeft,\n offsetTop,\n cropX,\n cropY,\n };\n }\n\n /**\n * List of attribute names to account for when parsing SVG element (used by {@link FabricImage.fromElement})\n * @see {@link http://www.w3.org/TR/SVG/struct.html#ImageElement}\n */\n static ATTRIBUTE_NAMES = [\n ...SHARED_ATTRIBUTES,\n 'x',\n 'y',\n 'width',\n 'height',\n 'preserveAspectRatio',\n 'xlink:href',\n 'href',\n 'crossOrigin',\n 'image-rendering',\n ];\n\n /**\n * Creates an instance of FabricImage from its object representation\n * @param {Object} object Object to create an instance from\n * @param {object} [options] Options object\n * @param {AbortSignal} [options.signal] handle aborting, see https://developer.mozilla.org/en-US/docs/Web/API/AbortController/signal\n * @returns {Promise}\n */\n static fromObject>(\n { filters: f, resizeFilter: rf, src, crossOrigin, type, ...object }: T,\n options?: Abortable,\n ) {\n return Promise.all([\n loadImage(src!, { ...options, crossOrigin }),\n f && enlivenObjects>(f, options),\n // redundant - handled by enlivenObjectEnlivables, but nicely explicit\n rf ? enlivenObjects([rf], options) : [],\n enlivenObjectEnlivables(object, options),\n ]).then(([el, filters = [], [resizeFilter], hydratedProps = {}]) => {\n return new this(el, {\n ...object,\n // TODO: passing src creates a difference between image creation and restoring from JSON\n src,\n filters,\n resizeFilter,\n ...hydratedProps,\n });\n });\n }\n\n /**\n * Creates an instance of Image from an URL string\n * @param {String} url URL to create an image from\n * @param {LoadImageOptions} [options] Options object\n * @returns {Promise}\n */\n static fromURL>(\n url: string,\n { crossOrigin = null, signal }: LoadImageOptions = {},\n imageOptions?: T,\n ): Promise {\n return loadImage(url, { crossOrigin, signal }).then(\n (img) => new this(img, imageOptions),\n );\n }\n\n /**\n * Returns {@link FabricImage} instance from an SVG element\n * @param {HTMLElement} element Element to parse\n * @param {Object} [options] Options object\n * @param {AbortSignal} [options.signal] handle aborting, see https://developer.mozilla.org/en-US/docs/Web/API/AbortController/signal\n * @param {Function} callback Callback to execute when Image object is created\n */\n static async fromElement(\n element: HTMLElement,\n options: Abortable = {},\n cssRules?: CSSRules,\n ) {\n const parsedAttributes = parseAttributes(\n element,\n this.ATTRIBUTE_NAMES,\n cssRules,\n );\n return this.fromURL(\n parsedAttributes['xlink:href'] || parsedAttributes['href'],\n options,\n parsedAttributes,\n ).catch((err) => {\n log('log', 'Unable to parse Image', err);\n return null;\n });\n }\n}\n\nclassRegistry.setClass(FabricImage);\nclassRegistry.setSVGClass(FabricImage);\n","import { svgNS } from './constants';\nimport {\n parsePreserveAspectRatioAttribute,\n parseUnit,\n} from '../util/misc/svgParsing';\nimport { svgViewBoxElementsRegEx, reViewBoxAttrValue } from './constants';\nimport { NONE } from '../constants';\n\nexport type ParsedViewboxTransform = Partial<{\n width: number;\n height: number;\n minX: number;\n minY: number;\n viewBoxWidth: number;\n viewBoxHeight: number;\n}>;\n\n/**\n * Add a element that envelop all child elements and makes the viewbox transformMatrix descend on all elements\n */\nexport function applyViewboxTransform(\n element: Element,\n): ParsedViewboxTransform {\n if (!svgViewBoxElementsRegEx.test(element.nodeName)) {\n return {};\n }\n const viewBoxAttr: string | null = element.getAttribute('viewBox');\n let scaleX = 1;\n let scaleY = 1;\n let minX = 0;\n let minY = 0;\n let matrix;\n let el;\n const widthAttr = element.getAttribute('width');\n const heightAttr = element.getAttribute('height');\n const x = element.getAttribute('x') || 0;\n const y = element.getAttribute('y') || 0;\n const goodViewbox = viewBoxAttr && reViewBoxAttrValue.test(viewBoxAttr);\n const missingViewBox = !goodViewbox;\n const missingDimAttr =\n !widthAttr || !heightAttr || widthAttr === '100%' || heightAttr === '100%';\n\n let translateMatrix = '';\n let widthDiff = 0;\n let heightDiff = 0;\n\n if (missingViewBox) {\n if (\n (x || y) &&\n element.parentNode &&\n element.parentNode.nodeName !== '#document'\n ) {\n translateMatrix =\n ' translate(' + parseUnit(x || '0') + ' ' + parseUnit(y || '0') + ') ';\n matrix = (element.getAttribute('transform') || '') + translateMatrix;\n element.setAttribute('transform', matrix);\n element.removeAttribute('x');\n element.removeAttribute('y');\n }\n }\n\n if (missingViewBox && missingDimAttr) {\n return {\n width: 0,\n height: 0,\n };\n }\n\n const parsedDim: ParsedViewboxTransform = {\n width: 0,\n height: 0,\n };\n\n if (missingViewBox) {\n parsedDim.width = parseUnit(widthAttr!);\n parsedDim.height = parseUnit(heightAttr!);\n // set a transform for elements that have x y and are inner(only) SVGs\n return parsedDim;\n }\n\n const pasedViewBox = viewBoxAttr.match(reViewBoxAttrValue)!;\n minX = -parseFloat(pasedViewBox[1]);\n minY = -parseFloat(pasedViewBox[2]);\n const viewBoxWidth = parseFloat(pasedViewBox[3]);\n const viewBoxHeight = parseFloat(pasedViewBox[4]);\n parsedDim.minX = minX;\n parsedDim.minY = minY;\n parsedDim.viewBoxWidth = viewBoxWidth;\n parsedDim.viewBoxHeight = viewBoxHeight;\n if (!missingDimAttr) {\n parsedDim.width = parseUnit(widthAttr);\n parsedDim.height = parseUnit(heightAttr);\n scaleX = parsedDim.width / viewBoxWidth;\n scaleY = parsedDim.height / viewBoxHeight;\n } else {\n parsedDim.width = viewBoxWidth;\n parsedDim.height = viewBoxHeight;\n }\n\n // default is to preserve aspect ratio\n const preserveAspectRatio = parsePreserveAspectRatioAttribute(\n element.getAttribute('preserveAspectRatio') || '',\n );\n if (preserveAspectRatio.alignX !== NONE) {\n //translate all container for the effect of Mid, Min, Max\n if (preserveAspectRatio.meetOrSlice === 'meet') {\n scaleY = scaleX = scaleX > scaleY ? scaleY : scaleX;\n // calculate additional translation to move the viewbox\n }\n if (preserveAspectRatio.meetOrSlice === 'slice') {\n scaleY = scaleX = scaleX > scaleY ? scaleX : scaleY;\n // calculate additional translation to move the viewbox\n }\n widthDiff = parsedDim.width - viewBoxWidth * scaleX;\n heightDiff = parsedDim.height - viewBoxHeight * scaleX;\n if (preserveAspectRatio.alignX === 'Mid') {\n widthDiff /= 2;\n }\n if (preserveAspectRatio.alignY === 'Mid') {\n heightDiff /= 2;\n }\n if (preserveAspectRatio.alignX === 'Min') {\n widthDiff = 0;\n }\n if (preserveAspectRatio.alignY === 'Min') {\n heightDiff = 0;\n }\n }\n\n if (\n scaleX === 1 &&\n scaleY === 1 &&\n minX === 0 &&\n minY === 0 &&\n x === 0 &&\n y === 0\n ) {\n return parsedDim;\n }\n if ((x || y) && element.parentNode!.nodeName !== '#document') {\n translateMatrix =\n ' translate(' + parseUnit(x || '0') + ' ' + parseUnit(y || '0') + ') ';\n }\n\n matrix =\n translateMatrix +\n ' matrix(' +\n scaleX +\n ' 0' +\n ' 0 ' +\n scaleY +\n ' ' +\n (minX * scaleX + widthDiff) +\n ' ' +\n (minY * scaleY + heightDiff) +\n ') ';\n // seems unused.\n // parsedDim.viewboxTransform = parseTransformAttribute(matrix);\n if (element.nodeName === 'svg') {\n el = element.ownerDocument.createElementNS(svgNS, 'g');\n // element.firstChild != null\n while (element.firstChild) {\n el.appendChild(element.firstChild);\n }\n element.appendChild(el);\n } else {\n el = element;\n el.removeAttribute('x');\n el.removeAttribute('y');\n matrix = el.getAttribute('transform') + matrix;\n }\n el.setAttribute('transform', matrix);\n return parsedDim;\n}\n","export const getTagName = (node: Element) => node.tagName.replace('svg:', '');\n","import { svgInvalidAncestors } from './constants';\nimport { getSvgRegex } from './getSvgRegex';\nimport { getTagName } from './getTagName';\n\nconst svgInvalidAncestorsRegEx = getSvgRegex(svgInvalidAncestors);\n\nexport function hasInvalidAncestor(element: Element) {\n let _element: Element | null = element;\n while (_element && (_element = _element.parentElement)) {\n if (\n _element &&\n _element.nodeName &&\n svgInvalidAncestorsRegEx.test(getTagName(_element)) &&\n !_element.getAttribute('instantiated_by_use')\n ) {\n return true;\n }\n }\n return false;\n}\n","export function getMultipleNodes(\n doc: Document,\n nodeNames: string[],\n): Element[] {\n let nodeName,\n nodeArray: Element[] = [],\n nodeList,\n i,\n len;\n for (i = 0, len = nodeNames.length; i < len; i++) {\n nodeName = nodeNames[i];\n nodeList = doc.getElementsByTagNameNS(\n 'http://www.w3.org/2000/svg',\n nodeName,\n );\n nodeArray = nodeArray.concat(Array.from(nodeList));\n }\n return nodeArray;\n}\n","const gradientsAttrs = [\n 'gradientTransform',\n 'x1',\n 'x2',\n 'y1',\n 'y2',\n 'gradientUnits',\n 'cx',\n 'cy',\n 'r',\n 'fx',\n 'fy',\n];\nconst xlinkAttr = 'xlink:href';\n\nexport function recursivelyParseGradientsXlink(\n doc: Document,\n gradient: Element,\n) {\n const xLink = gradient.getAttribute(xlinkAttr)?.slice(1) || '',\n referencedGradient = doc.getElementById(xLink);\n if (referencedGradient && referencedGradient.getAttribute(xlinkAttr)) {\n recursivelyParseGradientsXlink(doc, referencedGradient as Element);\n }\n if (referencedGradient) {\n gradientsAttrs.forEach((attr) => {\n const value = referencedGradient.getAttribute(attr);\n if (!gradient.hasAttribute(attr) && value) {\n gradient.setAttribute(attr, value);\n }\n });\n if (!gradient.children.length) {\n const referenceClone = referencedGradient.cloneNode(true);\n while (referenceClone.firstChild) {\n gradient.appendChild(referenceClone.firstChild);\n }\n }\n }\n gradient.removeAttribute(xlinkAttr);\n}\n","import { getMultipleNodes } from './getMultipleNodes';\nimport { recursivelyParseGradientsXlink } from './recursivelyParseGradientsXlink';\n\nconst tagArray = [\n 'linearGradient',\n 'radialGradient',\n 'svg:linearGradient',\n 'svg:radialGradient',\n];\n\n/**\n * Parses an SVG document, returning all of the gradient declarations found in it\n * @param {SVGDocument} doc SVG document to parse\n * @return {Object} Gradient definitions; key corresponds to element id, value -- to gradient definition element\n */\nexport function getGradientDefs(\n doc: Document,\n): Record {\n const elList = getMultipleNodes(doc, tagArray);\n const gradientDefs: Record = {};\n let j = elList.length;\n while (j--) {\n const el = elList[j];\n if (el.getAttribute('xlink:href')) {\n recursivelyParseGradientsXlink(doc, el);\n }\n const id = el.getAttribute('id');\n if (id) {\n gradientDefs[id] = el as SVGGradientElement;\n }\n }\n return gradientDefs;\n}\n","import { Gradient } from '../gradient/Gradient';\nimport { Group } from '../shapes/Group';\nimport { FabricImage } from '../shapes/Image';\nimport { classRegistry } from '../ClassRegistry';\nimport {\n invertTransform,\n multiplyTransformMatrices,\n qrDecompose,\n} from '../util/misc/matrix';\nimport { removeTransformMatrixForSvgParsing } from '../util/transform_matrix_removal';\nimport type { FabricObject } from '../shapes/Object/FabricObject';\nimport { Point } from '../Point';\nimport { CENTER, FILL, STROKE } from '../constants';\nimport { getGradientDefs } from './getGradientDefs';\nimport { getCSSRules } from './getCSSRules';\nimport type { LoadImageOptions } from '../util';\nimport type { CSSRules, TSvgReviverCallback } from './typedefs';\nimport type { ParsedViewboxTransform } from './applyViewboxTransform';\nimport type { SVGOptions } from '../gradient';\nimport { getTagName } from './getTagName';\nimport { parseTransformAttribute } from './parseTransformAttribute';\n\nconst findTag = (el: Element) =>\n classRegistry.getSVGClass(getTagName(el).toLowerCase());\n\ntype StorageType = {\n fill: SVGGradientElement;\n stroke: SVGGradientElement;\n clipPath: Element[];\n};\n\ntype NotParsedFabricObject = FabricObject & {\n fill: string;\n stroke: string;\n clipPath?: string;\n clipRule?: CanvasFillRule;\n};\n\nexport class ElementsParser {\n declare elements: Element[];\n declare options: LoadImageOptions & ParsedViewboxTransform;\n declare reviver?: TSvgReviverCallback;\n declare regexUrl: RegExp;\n declare doc: Document;\n declare clipPaths: Record;\n declare gradientDefs: Record;\n declare cssRules: CSSRules;\n\n constructor(\n elements: Element[],\n options: LoadImageOptions & ParsedViewboxTransform,\n reviver: TSvgReviverCallback | undefined,\n doc: Document,\n clipPaths: Record,\n ) {\n this.elements = elements;\n this.options = options;\n this.reviver = reviver;\n this.regexUrl = /^url\\(['\"]?#([^'\"]+)['\"]?\\)/g;\n this.doc = doc;\n this.clipPaths = clipPaths;\n this.gradientDefs = getGradientDefs(doc);\n this.cssRules = getCSSRules(doc);\n }\n\n parse(): Promise> {\n return Promise.all(\n this.elements.map((element) => this.createObject(element)),\n );\n }\n\n async createObject(el: Element): Promise {\n const klass = findTag(el);\n if (klass) {\n const obj: NotParsedFabricObject = await klass.fromElement(\n el,\n this.options,\n this.cssRules,\n );\n this.resolveGradient(obj, el, FILL);\n this.resolveGradient(obj, el, STROKE);\n if (obj instanceof FabricImage && obj._originalElement) {\n removeTransformMatrixForSvgParsing(\n obj,\n obj.parsePreserveAspectRatioAttribute(),\n );\n } else {\n removeTransformMatrixForSvgParsing(obj);\n }\n await this.resolveClipPath(obj, el);\n this.reviver && this.reviver(el, obj);\n return obj;\n }\n return null;\n }\n\n extractPropertyDefinition(\n obj: NotParsedFabricObject,\n property: 'fill' | 'stroke' | 'clipPath',\n storage: Record,\n ): StorageType[typeof property] | undefined {\n const value = obj[property]!,\n regex = this.regexUrl;\n if (!regex.test(value)) {\n return undefined;\n }\n // verify: can we remove the 'g' flag? and remove lastIndex changes?\n regex.lastIndex = 0;\n // we passed the regex test, so we know is not null;\n const id = regex.exec(value)![1];\n regex.lastIndex = 0;\n // @todo fix this\n return storage[id];\n }\n\n resolveGradient(\n obj: NotParsedFabricObject,\n el: Element,\n property: 'fill' | 'stroke',\n ) {\n const gradientDef = this.extractPropertyDefinition(\n obj,\n property,\n this.gradientDefs,\n ) as SVGGradientElement;\n if (gradientDef) {\n const opacityAttr = el.getAttribute(property + '-opacity');\n const gradient = Gradient.fromElement(gradientDef, obj, {\n ...this.options,\n opacity: opacityAttr,\n } as SVGOptions);\n obj.set(property, gradient);\n }\n }\n\n // TODO: resolveClipPath could be run once per clippath with minor work per object.\n // is a refactor that i m not sure is worth on this code\n async resolveClipPath(\n obj: NotParsedFabricObject,\n usingElement: Element,\n exactOwner?: Element,\n ) {\n const clipPathElements = this.extractPropertyDefinition(\n obj,\n 'clipPath',\n this.clipPaths,\n ) as Element[];\n if (clipPathElements) {\n const objTransformInv = invertTransform(obj.calcTransformMatrix());\n const clipPathTag = clipPathElements[0].parentElement!;\n let clipPathOwner = usingElement;\n while (\n !exactOwner &&\n clipPathOwner.parentElement &&\n clipPathOwner.getAttribute('clip-path') !== obj.clipPath\n ) {\n clipPathOwner = clipPathOwner.parentElement;\n }\n // move the clipPath tag as sibling to the real element that is using it\n clipPathOwner.parentElement!.appendChild(clipPathTag);\n\n // this multiplication order could be opposite.\n // but i don't have an svg to test it\n // at the first SVG that has a transform on both places and is misplaced\n // try to invert this multiplication order\n const finalTransform = parseTransformAttribute(\n `${clipPathOwner.getAttribute('transform') || ''} ${\n clipPathTag.getAttribute('originalTransform') || ''\n }`,\n );\n\n clipPathTag.setAttribute(\n 'transform',\n `matrix(${finalTransform.join(',')})`,\n );\n\n const container = await Promise.all(\n clipPathElements.map((clipPathElement) => {\n return findTag(clipPathElement)\n .fromElement(clipPathElement, this.options, this.cssRules)\n .then((enlivedClippath: NotParsedFabricObject) => {\n removeTransformMatrixForSvgParsing(enlivedClippath);\n enlivedClippath.fillRule = enlivedClippath.clipRule!;\n delete enlivedClippath.clipRule;\n return enlivedClippath;\n });\n }),\n );\n const clipPath =\n container.length === 1 ? container[0] : new Group(container);\n const gTransform = multiplyTransformMatrices(\n objTransformInv,\n clipPath.calcTransformMatrix(),\n );\n if (clipPath.clipPath) {\n await this.resolveClipPath(\n clipPath,\n clipPathOwner,\n // this is tricky.\n // it tries to differentiate from when clipPaths are inherited by outside groups\n // or when are really clipPaths referencing other clipPaths\n clipPathTag.getAttribute('clip-path') ? clipPathOwner : undefined,\n );\n }\n const { scaleX, scaleY, angle, skewX, translateX, translateY } =\n qrDecompose(gTransform);\n clipPath.set({\n flipX: false,\n flipY: false,\n });\n clipPath.set({\n scaleX,\n scaleY,\n angle,\n skewX,\n skewY: 0,\n });\n clipPath.setPositionByOrigin(\n new Point(translateX, translateY),\n CENTER,\n CENTER,\n );\n obj.clipPath = clipPath;\n } else {\n // if clip-path does not resolve to any element, delete the property.\n delete obj.clipPath;\n return;\n }\n }\n}\n","import type { CSSRules } from './typedefs';\n\n/**\n * Returns CSS rules for a given SVG document\n * @param {HTMLElement} doc SVG document to parse\n * @return {Object} CSS rules of this document\n */\nexport function getCSSRules(doc: Document) {\n const styles = doc.getElementsByTagName('style');\n const allRules: CSSRules = {};\n\n // very crude parsing of style contents\n for (let i = 0; i < styles.length; i++) {\n const styleContents = (styles[i].textContent || '').replace(\n // remove comments\n /\\/\\*[\\s\\S]*?\\*\\//g,\n '',\n );\n\n if (styleContents.trim() === '') {\n continue;\n }\n // recovers all the rule in this form `body { style code... }`\n // rules = styleContents.match(/[^{]*\\{[\\s\\S]*?\\}/g);\n styleContents\n .split('}')\n // remove empty rules and remove everything if we didn't split in at least 2 pieces\n .filter((rule, index, array) => array.length > 1 && rule.trim())\n // at this point we have hopefully an array of rules `body { style code... `\n .forEach((rule) => {\n // if there is more than one opening bracket and the rule starts with '@', it is likely\n // a nested at-rule like @media, @supports, @scope, etc. Ignore these as the code below\n // can not handle it.\n if (\n (rule.match(/{/g) || []).length > 1 &&\n rule.trim().startsWith('@')\n ) {\n return;\n }\n\n const match = rule.split('{'),\n ruleObj: Record = {},\n declaration = match[1].trim(),\n propertyValuePairs = declaration.split(';').filter(function (pair) {\n return pair.trim();\n });\n\n for (let j = 0; j < propertyValuePairs.length; j++) {\n const pair = propertyValuePairs[j].split(':'),\n property = pair[0].trim(),\n value = pair[1].trim();\n ruleObj[property] = value;\n }\n rule = match[0].trim();\n rule.split(',').forEach((_rule) => {\n _rule = _rule.replace(/^svg/i, '').trim();\n if (_rule === '') {\n return;\n }\n allRules[_rule] = {\n ...(allRules[_rule] || {}),\n ...ruleObj,\n };\n });\n });\n }\n return allRules;\n}\n","import { applyViewboxTransform } from './applyViewboxTransform';\nimport { svgValidTagNamesRegEx } from './constants';\nimport { hasInvalidAncestor } from './hasInvalidAncestor';\nimport { parseUseDirectives } from './parseUseDirectives';\nimport type { SVGParsingOutput, TSvgReviverCallback } from './typedefs';\nimport type { LoadImageOptions } from '../util/misc/objectEnlive';\nimport { ElementsParser } from './elements_parser';\nimport { log, SignalAbortedError } from '../util/internals/console';\nimport { getTagName } from './getTagName';\n\nconst isValidSvgTag = (el: Element) =>\n svgValidTagNamesRegEx.test(getTagName(el));\n\nexport const createEmptyResponse = (): SVGParsingOutput => ({\n objects: [],\n elements: [],\n options: {},\n allElements: [],\n});\n\n/**\n * Parses an SVG document, converts it to an array of corresponding fabric.* instances and passes them to a callback\n * @static\n * @function\n * @param {HTMLElement} doc SVG document to parse\n * @param {TSvgParsedCallback} callback Invoked when the parsing is done, with null if parsing wasn't possible with the list of svg nodes.\n * @param {TSvgReviverCallback} [reviver] Extra callback for further parsing of SVG elements, called after each fabric object has been created.\n * Takes as input the original svg element and the generated `FabricObject` as arguments. Used to inspect extra properties not parsed by fabric,\n * or extra custom manipulation\n * @param {Object} [options] Object containing options for parsing\n * @param {String} [options.crossOrigin] crossOrigin setting to use for external resources\n * @param {AbortSignal} [options.signal] handle aborting, see https://developer.mozilla.org/en-US/docs/Web/API/AbortController/signal\n * @return {SVGParsingOutput}\n * {@link SVGParsingOutput} also receives `allElements` array as the last argument. This is the full list of svg nodes available in the document.\n * You may want to use it if you are trying to regroup the objects as they were originally grouped in the SVG. ( This was the reason why it was added )\n */\nexport async function parseSVGDocument(\n doc: Document,\n reviver?: TSvgReviverCallback,\n { crossOrigin, signal }: LoadImageOptions = {},\n): Promise {\n if (signal && signal.aborted) {\n log('log', new SignalAbortedError('parseSVGDocument'));\n // this is an unhappy path, we dont care about speed\n return createEmptyResponse();\n }\n const documentElement = doc.documentElement;\n parseUseDirectives(doc);\n\n const descendants = Array.from(documentElement.getElementsByTagName('*')),\n options = {\n ...applyViewboxTransform(documentElement),\n crossOrigin,\n signal,\n };\n const elements = descendants.filter((el) => {\n applyViewboxTransform(el);\n return isValidSvgTag(el) && !hasInvalidAncestor(el); // http://www.w3.org/TR/SVG/struct.html#DefsElement\n });\n if (!elements || (elements && !elements.length)) {\n return {\n ...createEmptyResponse(),\n options,\n allElements: descendants,\n };\n }\n const localClipPaths: Record = {};\n descendants\n .filter((el) => getTagName(el) === 'clipPath')\n .forEach((el) => {\n el.setAttribute('originalTransform', el.getAttribute('transform') || '');\n const id = el.getAttribute('id')!;\n localClipPaths[id] = Array.from(el.getElementsByTagName('*')).filter(\n (el) => isValidSvgTag(el),\n );\n });\n\n // Precedence of rules: style > class > attribute\n const elementParser = new ElementsParser(\n elements,\n options,\n reviver,\n doc,\n localClipPaths,\n );\n\n const instances = await elementParser.parse();\n\n return {\n objects: instances,\n elements,\n options,\n allElements: descendants,\n };\n}\n","import { svgNS } from './constants';\nimport { getMultipleNodes } from './getMultipleNodes';\nimport { applyViewboxTransform } from './applyViewboxTransform';\nimport { parseStyleString } from './parseStyleString';\n\nexport function parseUseDirectives(doc: Document) {\n const nodelist = getMultipleNodes(doc, ['use', 'svg:use']);\n const skipAttributes = ['x', 'y', 'xlink:href', 'href', 'transform'];\n\n for (const useElement of nodelist) {\n const useAttributes: NamedNodeMap = useElement.attributes;\n\n const useAttrMap: Record = {};\n for (const attr of useAttributes) {\n attr.value && (useAttrMap[attr.name] = attr.value);\n }\n\n const xlink = (useAttrMap['xlink:href'] || useAttrMap.href || '').slice(1);\n\n if (xlink === '') {\n return;\n }\n const referencedElement = doc.getElementById(xlink);\n if (referencedElement === null) {\n // if we can't find the target of the xlink, consider this use tag bad, similar to no xlink\n return;\n }\n let clonedOriginal = referencedElement.cloneNode(true) as Element;\n\n const originalAttributes: NamedNodeMap = clonedOriginal.attributes;\n\n const originalAttrMap: Record = {};\n for (const attr of originalAttributes) {\n attr.value && (originalAttrMap[attr.name] = attr.value);\n }\n\n // Transform attribute needs to be merged in a particular way\n const { x = 0, y = 0, transform = '' } = useAttrMap;\n const currentTrans = `${transform} ${\n originalAttrMap.transform || ''\n } translate(${x}, ${y})`;\n\n applyViewboxTransform(clonedOriginal);\n\n if (/^svg$/i.test(clonedOriginal.nodeName)) {\n // if is an SVG, create a group and apply all the attributes on top of it\n const el3 = clonedOriginal.ownerDocument.createElementNS(svgNS, 'g');\n Object.entries(originalAttrMap).forEach(([name, value]) =>\n el3.setAttributeNS(svgNS, name, value),\n );\n el3.append(...clonedOriginal.childNodes);\n clonedOriginal = el3;\n }\n\n for (const attr of useAttributes) {\n if (!attr) {\n continue;\n }\n const { name, value } = attr;\n if (skipAttributes.includes(name)) {\n continue;\n }\n\n if (name === 'style') {\n // when use has a style, merge the two styles, with the ref being priority (not use)\n // priority is by feature. an attribute for fill on the original element\n // will overwrite the fill in style or attribute for tha use\n const styleRecord: Record = {};\n parseStyleString(value, styleRecord);\n // cleanup styleRecord from attributes of original\n Object.entries(originalAttrMap).forEach(([name, value]) => {\n styleRecord[name] = value;\n });\n // now we can put in the style of the original that will overwrite the original attributes\n parseStyleString(originalAttrMap.style || '', styleRecord);\n const mergedStyles = Object.entries(styleRecord)\n .map((entry) => entry.join(':'))\n .join(';');\n clonedOriginal.setAttribute(name, mergedStyles);\n } else {\n // set the attribute from use element only if the original does not have it already\n !originalAttrMap[name] && clonedOriginal.setAttribute(name, value);\n }\n }\n\n clonedOriginal.setAttribute('transform', currentTrans);\n clonedOriginal.setAttribute('instantiated_by_use', '1');\n clonedOriginal.removeAttribute('id');\n useElement.parentNode!.replaceChild(clonedOriginal, useElement);\n }\n}\n","import { getFabricWindow } from '../env';\nimport type { LoadImageOptions } from '../util/misc/objectEnlive';\nimport { parseSVGDocument } from './parseSVGDocument';\nimport type { SVGParsingOutput, TSvgReviverCallback } from './typedefs';\n\n/**\n * Takes string corresponding to an SVG document, and parses it into a set of fabric objects\n * @param {String} string representing the svg\n * @param {TSvgParsedCallback} callback Invoked when the parsing is done, with null if parsing wasn't possible with the list of svg nodes.\n * {@link TSvgParsedCallback} also receives `allElements` array as the last argument. This is the full list of svg nodes available in the document.\n * You may want to use it if you are trying to regroup the objects as they were originally grouped in the SVG. ( This was the reason why it was added )\n * @param {TSvgReviverCallback} [reviver] Extra callback for further parsing of SVG elements, called after each fabric object has been created.\n * Takes as input the original svg element and the generated `FabricObject` as arguments. Used to inspect extra properties not parsed by fabric,\n * or extra custom manipulation\n * @param {Object} [options] Object containing options for parsing\n * @param {String} [options.crossOrigin] crossOrigin setting to use for external resources\n * @param {AbortSignal} [options.signal] handle aborting, see https://developer.mozilla.org/en-US/docs/Web/API/AbortController/signal\n */\nexport function loadSVGFromString(\n string: string,\n reviver?: TSvgReviverCallback,\n options?: LoadImageOptions,\n): Promise {\n const parser = new (getFabricWindow().DOMParser)(),\n // should we use `image/svg+xml` here?\n doc = parser.parseFromString(string.trim(), 'text/xml');\n return parseSVGDocument(doc, reviver, options);\n}\n","import { createEmptyResponse } from './parseSVGDocument';\nimport { loadSVGFromString } from './loadSVGFromString';\nimport type { SVGParsingOutput, TSvgReviverCallback } from './typedefs';\nimport type { LoadImageOptions } from '../util/misc/objectEnlive';\nimport { FabricError } from '../util/internals/console';\n\n/**\n * Takes url corresponding to an SVG document, and parses it into a set of fabric objects.\n * Note that SVG is fetched via fetch API, so it needs to conform to SOP (Same Origin Policy)\n * @param {string} url where the SVG is\n * @param {TSvgParsedCallback} callback Invoked when the parsing is done, with null if parsing wasn't possible with the list of svg nodes.\n * {@link TSvgParsedCallback} also receives `allElements` array as the last argument. This is the full list of svg nodes available in the document.\n * You may want to use it if you are trying to regroup the objects as they were originally grouped in the SVG. ( This was the reason why it was added )\n * @param {TSvgReviverCallback} [reviver] Extra callback for further parsing of SVG elements, called after each fabric object has been created.\n * Takes as input the original svg element and the generated `FabricObject` as arguments. Used to inspect extra properties not parsed by fabric,\n * or extra custom manipulation\n * @param {Object} [options] Object containing options for parsing\n * @param {String} [options.crossOrigin] crossOrigin setting to use for external resources\n * @param {AbortSignal} [options.signal] handle aborting, see https://developer.mozilla.org/en-US/docs/Web/API/AbortController/signal\n */\nexport function loadSVGFromURL(\n url: string,\n reviver?: TSvgReviverCallback,\n options: LoadImageOptions = {},\n): Promise {\n return fetch(url.replace(/^\\n\\s*/, '').trim(), {\n signal: options.signal,\n })\n .then((response) => {\n if (!response.ok) {\n throw new FabricError(`HTTP error! status: ${response.status}`);\n }\n return response.text();\n })\n .then((svgText) => {\n return loadSVGFromString(svgText, reviver, options);\n })\n .catch(() => {\n // this is an unhappy path, we dont care about speed\n return createEmptyResponse();\n });\n}\n","import { Point } from '../Point';\nimport { Control } from './Control';\nimport type { TMat2D } from '../typedefs';\nimport type { Polyline } from '../shapes/Polyline';\nimport { multiplyTransformMatrices } from '../util/misc/matrix';\nimport type {\n TModificationEvents,\n TPointerEvent,\n Transform,\n TransformActionHandler,\n} from '../EventTypeDefs';\nimport { wrapWithFireEvent } from './wrapWithFireEvent';\nimport { sendPointToPlane } from '../util/misc/planeChange';\nimport { MODIFY_POLY } from '../constants';\n\nconst ACTION_NAME: TModificationEvents = MODIFY_POLY;\n\ntype TTransformAnchor = Transform & { pointIndex: number };\n\n/**\n * This function locates the controls.\n * It'll be used both for drawing and for interaction.\n */\nexport const createPolyPositionHandler = (pointIndex: number) => {\n return function (dim: Point, finalMatrix: TMat2D, polyObject: Polyline) {\n const { points, pathOffset } = polyObject;\n return new Point(points[pointIndex])\n .subtract(pathOffset)\n .transform(\n multiplyTransformMatrices(\n polyObject.getViewportTransform(),\n polyObject.calcTransformMatrix(),\n ),\n );\n };\n};\n\n/**\n * This function defines what the control does.\n * It'll be called on every mouse move after a control has been clicked and is being dragged.\n * The function receives as argument the mouse event, the current transform object\n * and the current position in canvas coordinate `transform.target` is a reference to the\n * current object being transformed.\n */\nexport const polyActionHandler = (\n eventData: TPointerEvent,\n transform: TTransformAnchor,\n x: number,\n y: number,\n) => {\n const { target, pointIndex } = transform;\n const poly = target as Polyline;\n const mouseLocalPosition = sendPointToPlane(\n new Point(x, y),\n undefined,\n poly.calcOwnMatrix(),\n );\n\n poly.points[pointIndex] = mouseLocalPosition.add(poly.pathOffset);\n poly.setDimensions();\n poly.set('dirty', true);\n return true;\n};\n\n/**\n * Keep the polygon in the same position when we change its `width`/`height`/`top`/`left`.\n */\nexport const factoryPolyActionHandler = (\n pointIndex: number,\n fn: TransformActionHandler,\n) => {\n return function (\n eventData: TPointerEvent,\n transform: Transform,\n x: number,\n y: number,\n ) {\n const poly = transform.target as Polyline,\n anchorPoint = new Point(\n poly.points[(pointIndex > 0 ? pointIndex : poly.points.length) - 1],\n ),\n anchorPointInParentPlane = anchorPoint\n .subtract(poly.pathOffset)\n .transform(poly.calcOwnMatrix()),\n actionPerformed = fn(eventData, { ...transform, pointIndex }, x, y);\n\n const newAnchorPointInParentPlane = anchorPoint\n .subtract(poly.pathOffset)\n .transform(poly.calcOwnMatrix());\n\n const diff = newAnchorPointInParentPlane.subtract(anchorPointInParentPlane);\n poly.left -= diff.x;\n poly.top -= diff.y;\n\n return actionPerformed;\n };\n};\n\nexport const createPolyActionHandler = (pointIndex: number) =>\n wrapWithFireEvent(\n ACTION_NAME,\n factoryPolyActionHandler(pointIndex, polyActionHandler),\n );\n\nexport function createPolyControls(\n poly: Polyline,\n options?: Partial,\n): Record;\nexport function createPolyControls(\n numOfControls: number,\n options?: Partial,\n): Record;\nexport function createPolyControls(\n arg0: number | Polyline,\n options: Partial = {},\n) {\n const controls = {} as Record;\n for (\n let idx = 0;\n idx < (typeof arg0 === 'number' ? arg0 : arg0.points.length);\n idx++\n ) {\n controls[`p${idx}`] = new Control({\n actionName: ACTION_NAME,\n positionHandler: createPolyPositionHandler(idx),\n actionHandler: createPolyActionHandler(idx),\n ...options,\n });\n }\n return controls;\n}\n","import { Point } from '../Point';\nimport { Control } from './Control';\nimport type { TMat2D } from '../typedefs';\nimport type { Path } from '../shapes/Path';\nimport { multiplyTransformMatrices } from '../util/misc/matrix';\nimport type {\n TModificationEvents,\n TPointerEvent,\n Transform,\n} from '../EventTypeDefs';\nimport { sendPointToPlane } from '../util/misc/planeChange';\nimport type { TSimpleParseCommandType } from '../util/path/typedefs';\nimport type { ControlRenderingStyleOverride } from './controlRendering';\nimport { fireEvent } from './fireEvent';\nimport { commonEventInfo } from './util';\n\nconst ACTION_NAME: TModificationEvents = 'modifyPath' as const;\n\ntype TTransformAnchor = Transform;\n\nexport type PathPointControlStyle = {\n controlFill?: string;\n controlStroke?: string;\n connectionDashArray?: number[];\n};\n\nconst calcPathPointPosition = (\n pathObject: Path,\n commandIndex: number,\n pointIndex: number,\n) => {\n const { path, pathOffset } = pathObject;\n const command = path[commandIndex];\n return new Point(\n (command[pointIndex] as number) - pathOffset.x,\n (command[pointIndex + 1] as number) - pathOffset.y,\n ).transform(\n multiplyTransformMatrices(\n pathObject.getViewportTransform(),\n pathObject.calcTransformMatrix(),\n ),\n );\n};\n\nconst movePathPoint = (\n pathObject: Path,\n x: number,\n y: number,\n commandIndex: number,\n pointIndex: number,\n) => {\n const { path, pathOffset } = pathObject;\n\n const anchorCommand =\n path[(commandIndex > 0 ? commandIndex : path.length) - 1];\n const anchorPoint = new Point(\n anchorCommand[pointIndex] as number,\n anchorCommand[pointIndex + 1] as number,\n );\n\n const anchorPointInParentPlane = anchorPoint\n .subtract(pathOffset)\n .transform(pathObject.calcOwnMatrix());\n\n const mouseLocalPosition = sendPointToPlane(\n new Point(x, y),\n undefined,\n pathObject.calcOwnMatrix(),\n );\n\n path[commandIndex][pointIndex] = mouseLocalPosition.x + pathOffset.x;\n path[commandIndex][pointIndex + 1] = mouseLocalPosition.y + pathOffset.y;\n pathObject.setDimensions();\n\n const newAnchorPointInParentPlane = anchorPoint\n .subtract(pathObject.pathOffset)\n .transform(pathObject.calcOwnMatrix());\n\n const diff = newAnchorPointInParentPlane.subtract(anchorPointInParentPlane);\n pathObject.left -= diff.x;\n pathObject.top -= diff.y;\n pathObject.set('dirty', true);\n return true;\n};\n\n/**\n * This function locates the controls.\n * It'll be used both for drawing and for interaction.\n */\nfunction pathPositionHandler(\n this: PathPointControl,\n dim: Point,\n finalMatrix: TMat2D,\n pathObject: Path,\n) {\n const { commandIndex, pointIndex } = this;\n return calcPathPointPosition(pathObject, commandIndex, pointIndex);\n}\n\n/**\n * This function defines what the control does.\n * It'll be called on every mouse move after a control has been clicked and is being dragged.\n * The function receives as argument the mouse event, the current transform object\n * and the current position in canvas coordinate `transform.target` is a reference to the\n * current object being transformed.\n */\nfunction pathActionHandler(\n this: PathPointControl,\n eventData: TPointerEvent,\n transform: TTransformAnchor,\n x: number,\n y: number,\n) {\n const { target } = transform;\n const { commandIndex, pointIndex } = this;\n const actionPerformed = movePathPoint(\n target as Path,\n x,\n y,\n commandIndex,\n pointIndex,\n );\n if (actionPerformed) {\n fireEvent(this.actionName as TModificationEvents, {\n ...commonEventInfo(eventData, transform, x, y),\n commandIndex,\n pointIndex,\n });\n }\n return actionPerformed;\n}\n\nconst indexFromPrevCommand = (previousCommandType: TSimpleParseCommandType) =>\n previousCommandType === 'C' ? 5 : previousCommandType === 'Q' ? 3 : 1;\n\nclass PathPointControl extends Control {\n declare commandIndex: number;\n declare pointIndex: number;\n declare controlFill: string;\n declare controlStroke: string;\n constructor(options?: Partial) {\n super(options);\n }\n\n render(\n ctx: CanvasRenderingContext2D,\n left: number,\n top: number,\n styleOverride: ControlRenderingStyleOverride | undefined,\n fabricObject: Path,\n ) {\n const overrides: ControlRenderingStyleOverride = {\n ...styleOverride,\n cornerColor: this.controlFill,\n cornerStrokeColor: this.controlStroke,\n transparentCorners: !this.controlFill,\n };\n super.render(ctx, left, top, overrides, fabricObject);\n }\n}\n\nclass PathControlPointControl extends PathPointControl {\n declare connectionDashArray?: number[];\n declare connectToCommandIndex: number;\n declare connectToPointIndex: number;\n constructor(options?: Partial) {\n super(options);\n }\n\n render(\n this: PathControlPointControl,\n ctx: CanvasRenderingContext2D,\n left: number,\n top: number,\n styleOverride: ControlRenderingStyleOverride | undefined,\n fabricObject: Path,\n ) {\n const { path } = fabricObject;\n const {\n commandIndex,\n pointIndex,\n connectToCommandIndex,\n connectToPointIndex,\n } = this;\n ctx.save();\n ctx.strokeStyle = this.controlStroke;\n if (this.connectionDashArray) {\n ctx.setLineDash(this.connectionDashArray);\n }\n const [commandType] = path[commandIndex];\n const point = calcPathPointPosition(\n fabricObject,\n connectToCommandIndex,\n connectToPointIndex,\n );\n\n if (commandType === 'Q') {\n // one control point connects to 2 points\n const point2 = calcPathPointPosition(\n fabricObject,\n commandIndex,\n pointIndex + 2,\n );\n ctx.moveTo(point2.x, point2.y);\n ctx.lineTo(left, top);\n } else {\n ctx.moveTo(left, top);\n }\n ctx.lineTo(point.x, point.y);\n ctx.stroke();\n ctx.restore();\n\n super.render(ctx, left, top, styleOverride, fabricObject);\n }\n}\n\nconst createControl = (\n commandIndexPos: number,\n pointIndexPos: number,\n isControlPoint: boolean,\n options: Partial & {\n controlPointStyle?: PathPointControlStyle;\n pointStyle?: PathPointControlStyle;\n },\n connectToCommandIndex?: number,\n connectToPointIndex?: number,\n) =>\n new (isControlPoint ? PathControlPointControl : PathPointControl)({\n commandIndex: commandIndexPos,\n pointIndex: pointIndexPos,\n actionName: ACTION_NAME,\n positionHandler: pathPositionHandler,\n actionHandler: pathActionHandler,\n connectToCommandIndex,\n connectToPointIndex,\n ...options,\n ...(isControlPoint ? options.controlPointStyle : options.pointStyle),\n } as Partial);\n\nexport function createPathControls(\n path: Path,\n options: Partial & {\n controlPointStyle?: PathPointControlStyle;\n pointStyle?: PathPointControlStyle;\n } = {},\n): Record {\n const controls = {} as Record;\n let previousCommandType: TSimpleParseCommandType = 'M';\n path.path.forEach((command, commandIndex) => {\n const commandType = command[0];\n\n if (commandType !== 'Z') {\n controls[`c_${commandIndex}_${commandType}`] = createControl(\n commandIndex,\n command.length - 2,\n false,\n options,\n );\n }\n switch (commandType) {\n case 'C':\n controls[`c_${commandIndex}_C_CP_1`] = createControl(\n commandIndex,\n 1,\n true,\n options,\n commandIndex - 1,\n indexFromPrevCommand(previousCommandType),\n );\n controls[`c_${commandIndex}_C_CP_2`] = createControl(\n commandIndex,\n 3,\n true,\n options,\n commandIndex,\n 5,\n );\n break;\n case 'Q':\n controls[`c_${commandIndex}_Q_CP_1`] = createControl(\n commandIndex,\n 1,\n true,\n options,\n commandIndex,\n 3,\n );\n break;\n }\n previousCommandType = commandType;\n });\n return controls;\n}\n","import { getFabricWindow } from '../env';\nimport { createCanvasElement, createCanvasElementFor } from '../util/misc/dom';\nimport { WebGLFilterBackend } from './WebGLFilterBackend';\nimport type { TWebGLPipelineState, T2DPipelineState } from './typedefs';\n\nexport const isWebGLPipelineState = (\n options: TWebGLPipelineState | T2DPipelineState,\n): options is TWebGLPipelineState => {\n return (options as TWebGLPipelineState).webgl !== undefined;\n};\n\n/**\n * Pick a method to copy data from GL context to 2d canvas. In some browsers using\n * drawImage should be faster, but is also bugged for a small combination of old hardware\n * and drivers.\n * putImageData is faster than drawImage for that specific operation.\n */\nexport const isPutImageFaster = (width: number, height: number): boolean => {\n const targetCanvas = createCanvasElementFor({ width, height });\n const sourceCanvas = createCanvasElement();\n const gl = sourceCanvas.getContext('webgl')!;\n // eslint-disable-next-line no-undef\n const imageBuffer = new ArrayBuffer(width * height * 4);\n\n const testContext = {\n imageBuffer: imageBuffer,\n } as unknown as Required;\n const testPipelineState = {\n destinationWidth: width,\n destinationHeight: height,\n targetCanvas: targetCanvas,\n } as unknown as TWebGLPipelineState;\n let startTime;\n\n startTime = getFabricWindow().performance.now();\n WebGLFilterBackend.prototype.copyGLTo2D.call(\n testContext,\n gl,\n testPipelineState,\n );\n const drawImageTime = getFabricWindow().performance.now() - startTime;\n\n startTime = getFabricWindow().performance.now();\n WebGLFilterBackend.prototype.copyGLTo2DPutImageData.call(\n testContext,\n gl,\n testPipelineState,\n );\n const putImageDataTime = getFabricWindow().performance.now() - startTime;\n\n return drawImageTime > putImageDataTime;\n};\n","export const highPsourceCode = `precision highp float`;\n\nexport const identityFragmentShader = `\n ${highPsourceCode};\n varying vec2 vTexCoord;\n uniform sampler2D uTexture;\n void main() {\n gl_FragColor = texture2D(uTexture, vTexCoord);\n }`;\n\nexport const vertexSource = `\n attribute vec2 aPosition;\n varying vec2 vTexCoord;\n void main() {\n vTexCoord = aPosition;\n gl_Position = vec4(aPosition * 2.0 - 1.0, 0.0, 1.0);\n }`;\n","import { getEnv } from '../env';\nimport type {\n T2DPipelineState,\n TWebGLAttributeLocationMap,\n TWebGLPipelineState,\n TWebGLProgramCacheItem,\n TWebGLUniformLocationMap,\n} from './typedefs';\nimport { isWebGLPipelineState } from './utils';\nimport {\n highPsourceCode,\n identityFragmentShader,\n vertexSource,\n} from './shaders/baseFilter';\nimport type { Abortable } from '../typedefs';\nimport { FabricError } from '../util/internals/console';\nimport { createCanvasElementFor } from '../util/misc/dom';\n\nconst regex = new RegExp(highPsourceCode, 'g');\n\nexport class BaseFilter<\n Name extends string,\n OwnProps extends Record = object,\n SerializedProps extends Record = OwnProps,\n> {\n /**\n * Filter type\n */\n get type(): Name {\n return (this.constructor as typeof BaseFilter).type as Name;\n }\n\n /**\n * The class type. Used to identify which class this is.\n * This is used for serialization purposes and internally it can be used\n * to identify classes. As a developer you could use `instance of Class`\n * but to avoid importing all the code and blocking tree shaking we try\n * to avoid doing that.\n */\n static type = 'BaseFilter';\n\n /**\n * Contains the uniform locations for the fragment shader.\n * uStepW and uStepH are handled by the BaseFilter, each filter class\n * needs to specify all the one that are needed\n */\n static uniformLocations: string[] = [];\n\n declare static defaults: Record;\n\n /**\n * Constructor\n * @param {Object} [options] Options object\n */\n constructor({\n type,\n ...options\n }: { type?: never } & Partial & Record = {}) {\n Object.assign(\n this,\n (this.constructor as typeof BaseFilter).defaults,\n options,\n );\n }\n\n protected getFragmentSource(): string {\n return identityFragmentShader;\n }\n\n getVertexSource(): string {\n return vertexSource;\n }\n\n /**\n * Compile this filter's shader program.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context to use for shader compilation.\n * @param {String} fragmentSource fragmentShader source for compilation\n * @param {String} vertexSource vertexShader source for compilation\n */\n createProgram(\n gl: WebGLRenderingContext,\n fragmentSource: string = this.getFragmentSource(),\n vertexSource: string = this.getVertexSource(),\n ) {\n const {\n WebGLProbe: { GLPrecision = 'highp' },\n } = getEnv();\n if (GLPrecision !== 'highp') {\n fragmentSource = fragmentSource.replace(\n regex,\n highPsourceCode.replace('highp', GLPrecision),\n );\n }\n const vertexShader = gl.createShader(gl.VERTEX_SHADER);\n const fragmentShader = gl.createShader(gl.FRAGMENT_SHADER);\n const program = gl.createProgram();\n\n if (!vertexShader || !fragmentShader || !program) {\n throw new FabricError(\n 'Vertex, fragment shader or program creation error',\n );\n }\n gl.shaderSource(vertexShader, vertexSource);\n gl.compileShader(vertexShader);\n if (!gl.getShaderParameter(vertexShader, gl.COMPILE_STATUS)) {\n throw new FabricError(\n `Vertex shader compile error for ${this.type}: ${gl.getShaderInfoLog(\n vertexShader,\n )}`,\n );\n }\n\n gl.shaderSource(fragmentShader, fragmentSource);\n gl.compileShader(fragmentShader);\n if (!gl.getShaderParameter(fragmentShader, gl.COMPILE_STATUS)) {\n throw new FabricError(\n `Fragment shader compile error for ${this.type}: ${gl.getShaderInfoLog(\n fragmentShader,\n )}`,\n );\n }\n\n gl.attachShader(program, vertexShader);\n gl.attachShader(program, fragmentShader);\n gl.linkProgram(program);\n if (!gl.getProgramParameter(program, gl.LINK_STATUS)) {\n throw new FabricError(\n `Shader link error for \"${this.type}\" ${gl.getProgramInfoLog(program)}`,\n );\n }\n\n const uniformLocations = this.getUniformLocations(gl, program) || {};\n uniformLocations.uStepW = gl.getUniformLocation(program, 'uStepW');\n uniformLocations.uStepH = gl.getUniformLocation(program, 'uStepH');\n\n return {\n program,\n attributeLocations: this.getAttributeLocations(gl, program),\n uniformLocations,\n };\n }\n\n /**\n * Return a map of attribute names to WebGLAttributeLocation objects.\n *\n * @param {WebGLRenderingContext} gl The canvas context used to compile the shader program.\n * @param {WebGLShaderProgram} program The shader program from which to take attribute locations.\n * @returns {Object} A map of attribute names to attribute locations.\n */\n getAttributeLocations(\n gl: WebGLRenderingContext,\n program: WebGLProgram,\n ): TWebGLAttributeLocationMap {\n return {\n aPosition: gl.getAttribLocation(program, 'aPosition'),\n };\n }\n\n /**\n * Return a map of uniform names to WebGLUniformLocation objects.\n *\n * @param {WebGLRenderingContext} gl The canvas context used to compile the shader program.\n * @param {WebGLShaderProgram} program The shader program from which to take uniform locations.\n * @returns {Object} A map of uniform names to uniform locations.\n */\n getUniformLocations(\n gl: WebGLRenderingContext,\n program: WebGLProgram,\n ): TWebGLUniformLocationMap {\n const locations = (this.constructor as unknown as typeof BaseFilter)\n .uniformLocations;\n\n const uniformLocations: Record = {};\n for (let i = 0; i < locations.length; i++) {\n uniformLocations[locations[i]] = gl.getUniformLocation(\n program,\n locations[i],\n );\n }\n return uniformLocations;\n }\n\n /**\n * Send attribute data from this filter to its shader program on the GPU.\n *\n * @param {WebGLRenderingContext} gl The canvas context used to compile the shader program.\n * @param {Object} attributeLocations A map of shader attribute names to their locations.\n */\n sendAttributeData(\n gl: WebGLRenderingContext,\n attributeLocations: Record,\n aPositionData: Float32Array,\n ) {\n const attributeLocation = attributeLocations.aPosition;\n const buffer = gl.createBuffer();\n gl.bindBuffer(gl.ARRAY_BUFFER, buffer);\n gl.enableVertexAttribArray(attributeLocation);\n gl.vertexAttribPointer(attributeLocation, 2, gl.FLOAT, false, 0, 0);\n gl.bufferData(gl.ARRAY_BUFFER, aPositionData, gl.STATIC_DRAW);\n }\n\n _setupFrameBuffer(options: TWebGLPipelineState) {\n const gl = options.context;\n if (options.passes > 1) {\n const width = options.destinationWidth;\n const height = options.destinationHeight;\n if (options.sourceWidth !== width || options.sourceHeight !== height) {\n gl.deleteTexture(options.targetTexture);\n options.targetTexture = options.filterBackend.createTexture(\n gl,\n width,\n height,\n );\n }\n gl.framebufferTexture2D(\n gl.FRAMEBUFFER,\n gl.COLOR_ATTACHMENT0,\n gl.TEXTURE_2D,\n options.targetTexture,\n 0,\n );\n } else {\n // draw last filter on canvas and not to framebuffer.\n gl.bindFramebuffer(gl.FRAMEBUFFER, null);\n gl.finish();\n }\n }\n\n _swapTextures(options: TWebGLPipelineState) {\n options.passes--;\n options.pass++;\n const temp = options.targetTexture;\n options.targetTexture = options.sourceTexture;\n options.sourceTexture = temp;\n }\n\n /**\n * Generic isNeutral implementation for one parameter based filters.\n * Used only in image applyFilters to discard filters that will not have an effect\n * on the image\n * Other filters may need their own version ( ColorMatrix, HueRotation, gamma, ComposedFilter )\n * @param {Object} options\n **/\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n isNeutralState(options?: any): boolean {\n return false;\n }\n\n /**\n * Apply this filter to the input image data provided.\n *\n * Determines whether to use WebGL or Canvas2D based on the options.webgl flag.\n *\n * @param {Object} options\n * @param {Number} options.passes The number of filters remaining to be executed\n * @param {Boolean} options.webgl Whether to use webgl to render the filter.\n * @param {WebGLTexture} options.sourceTexture The texture setup as the source to be filtered.\n * @param {WebGLTexture} options.targetTexture The texture where filtered output should be drawn.\n * @param {WebGLRenderingContext} options.context The GL context used for rendering.\n * @param {Object} options.programCache A map of compiled shader programs, keyed by filter type.\n */\n applyTo(options: TWebGLPipelineState | T2DPipelineState) {\n if (isWebGLPipelineState(options)) {\n this._setupFrameBuffer(options);\n this.applyToWebGL(options);\n this._swapTextures(options);\n } else {\n this.applyTo2d(options);\n }\n }\n\n applyTo2d(_options: T2DPipelineState): void {\n // override by subclass\n }\n\n /**\n * Returns a string that represent the current selected shader code for the filter.\n * Used to force recompilation when parameters change or to retrieve the shader from cache\n * @type string\n **/\n getCacheKey(): string {\n return this.type;\n }\n\n /**\n * Retrieves the cached shader.\n * @param {Object} options\n * @param {WebGLRenderingContext} options.context The GL context used for rendering.\n * @param {Object} options.programCache A map of compiled shader programs, keyed by filter type.\n * @return {WebGLProgram} the compiled program shader\n */\n retrieveShader(options: TWebGLPipelineState): TWebGLProgramCacheItem {\n const key = this.getCacheKey();\n if (!options.programCache[key]) {\n options.programCache[key] = this.createProgram(options.context);\n }\n return options.programCache[key];\n }\n\n /**\n * Apply this filter using webgl.\n *\n * @param {Object} options\n * @param {Number} options.passes The number of filters remaining to be executed\n * @param {Boolean} options.webgl Whether to use webgl to render the filter.\n * @param {WebGLTexture} options.originalTexture The texture of the original input image.\n * @param {WebGLTexture} options.sourceTexture The texture setup as the source to be filtered.\n * @param {WebGLTexture} options.targetTexture The texture where filtered output should be drawn.\n * @param {WebGLRenderingContext} options.context The GL context used for rendering.\n * @param {Object} options.programCache A map of compiled shader programs, keyed by filter type.\n */\n applyToWebGL(options: TWebGLPipelineState) {\n const gl = options.context;\n const shader = this.retrieveShader(options);\n if (options.pass === 0 && options.originalTexture) {\n gl.bindTexture(gl.TEXTURE_2D, options.originalTexture);\n } else {\n gl.bindTexture(gl.TEXTURE_2D, options.sourceTexture);\n }\n gl.useProgram(shader.program);\n this.sendAttributeData(gl, shader.attributeLocations, options.aPosition);\n\n gl.uniform1f(shader.uniformLocations.uStepW, 1 / options.sourceWidth);\n gl.uniform1f(shader.uniformLocations.uStepH, 1 / options.sourceHeight);\n\n this.sendUniformData(gl, shader.uniformLocations);\n gl.viewport(0, 0, options.destinationWidth, options.destinationHeight);\n gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4);\n }\n\n bindAdditionalTexture(\n gl: WebGLRenderingContext,\n texture: WebGLTexture,\n textureUnit: number,\n ) {\n gl.activeTexture(textureUnit);\n gl.bindTexture(gl.TEXTURE_2D, texture);\n // reset active texture to 0 as usual\n gl.activeTexture(gl.TEXTURE0);\n }\n\n unbindAdditionalTexture(gl: WebGLRenderingContext, textureUnit: number) {\n gl.activeTexture(textureUnit);\n gl.bindTexture(gl.TEXTURE_2D, null);\n gl.activeTexture(gl.TEXTURE0);\n }\n\n /**\n * Send uniform data from this filter to its shader program on the GPU.\n *\n * Intended to be overridden by subclasses.\n *\n * @param {WebGLRenderingContext} _gl The canvas context used to compile the shader program.\n * @param {Object} _uniformLocations A map of shader uniform names to their locations.\n */\n sendUniformData(\n _gl: WebGLRenderingContext,\n _uniformLocations: TWebGLUniformLocationMap,\n ): void {\n // override by subclass\n }\n\n /**\n * If needed by a 2d filter, this functions can create an helper canvas to be used\n * remember that options.targetCanvas is available for use till end of chain.\n */\n createHelpLayer(options: T2DPipelineState) {\n if (!options.helpLayer) {\n const { sourceWidth, sourceHeight } = options;\n const helpLayer = createCanvasElementFor({\n width: sourceWidth,\n height: sourceHeight,\n });\n options.helpLayer = helpLayer;\n }\n }\n\n /**\n * Returns object representation of an instance\n * It will automatically export the default values of a filter,\n * stored in the static defaults property.\n * @return {Object} Object representation of an instance\n */\n toObject(): { type: Name } & SerializedProps {\n const defaultKeys = Object.keys(\n (this.constructor as typeof BaseFilter).defaults || {},\n ) as (keyof SerializedProps)[];\n\n return {\n type: this.type,\n ...defaultKeys.reduce((acc, key) => {\n acc[key] = this[\n key as keyof this\n ] as unknown as (typeof acc)[typeof key];\n return acc;\n }, {} as SerializedProps),\n };\n }\n\n /**\n * Returns a JSON representation of an instance\n * @return {Object} JSON\n */\n toJSON() {\n // delegate, not alias\n return this.toObject();\n }\n\n static async fromObject(\n { type, ...filterOptions }: Record,\n _options?: Abortable,\n ): Promise> {\n return new this(filterOptions);\n }\n}\n","export const blendColorFragmentSource = {\n multiply: 'gl_FragColor.rgb *= uColor.rgb;\\n',\n screen:\n 'gl_FragColor.rgb = 1.0 - (1.0 - gl_FragColor.rgb) * (1.0 - uColor.rgb);\\n',\n add: 'gl_FragColor.rgb += uColor.rgb;\\n',\n difference: 'gl_FragColor.rgb = abs(gl_FragColor.rgb - uColor.rgb);\\n',\n subtract: 'gl_FragColor.rgb -= uColor.rgb;\\n',\n lighten: 'gl_FragColor.rgb = max(gl_FragColor.rgb, uColor.rgb);\\n',\n darken: 'gl_FragColor.rgb = min(gl_FragColor.rgb, uColor.rgb);\\n',\n exclusion:\n 'gl_FragColor.rgb += uColor.rgb - 2.0 * (uColor.rgb * gl_FragColor.rgb);\\n',\n overlay: `\n if (uColor.r < 0.5) {\n gl_FragColor.r *= 2.0 * uColor.r;\n } else {\n gl_FragColor.r = 1.0 - 2.0 * (1.0 - gl_FragColor.r) * (1.0 - uColor.r);\n }\n if (uColor.g < 0.5) {\n gl_FragColor.g *= 2.0 * uColor.g;\n } else {\n gl_FragColor.g = 1.0 - 2.0 * (1.0 - gl_FragColor.g) * (1.0 - uColor.g);\n }\n if (uColor.b < 0.5) {\n gl_FragColor.b *= 2.0 * uColor.b;\n } else {\n gl_FragColor.b = 1.0 - 2.0 * (1.0 - gl_FragColor.b) * (1.0 - uColor.b);\n }\n `,\n tint: `\n gl_FragColor.rgb *= (1.0 - uColor.a);\n gl_FragColor.rgb += uColor.rgb;\n `,\n} as const;\n","import { Color } from '../color/Color';\nimport { BaseFilter } from './BaseFilter';\nimport type { T2DPipelineState, TWebGLUniformLocationMap } from './typedefs';\nimport { classRegistry } from '../ClassRegistry';\nimport { blendColorFragmentSource } from './shaders/blendColor';\n\nexport type TBlendMode =\n | 'multiply'\n | 'add'\n | 'difference'\n | 'screen'\n | 'subtract'\n | 'darken'\n | 'lighten'\n | 'overlay'\n | 'exclusion'\n | 'tint';\n\ntype BlendColorOwnProps = {\n color: string;\n mode: TBlendMode;\n alpha: number;\n};\n\nexport const blendColorDefaultValues: BlendColorOwnProps = {\n color: '#F95C63',\n mode: 'multiply',\n alpha: 1,\n};\n\n/**\n * Color Blend filter class\n * @example\n * const filter = new BlendColor({\n * color: '#000',\n * mode: 'multiply'\n * });\n *\n * const filter = new BlendImage({\n * image: fabricImageObject,\n * mode: 'multiply'\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n * canvas.renderAll();\n */\nexport class BlendColor extends BaseFilter<'BlendColor', BlendColorOwnProps> {\n /**\n * Color to make the blend operation with. default to a reddish color since black or white\n * gives always strong result.\n * @type String\n **/\n declare color: BlendColorOwnProps['color'];\n\n /**\n * Blend mode for the filter: one of multiply, add, difference, screen, subtract,\n * darken, lighten, overlay, exclusion, tint.\n * @type String\n **/\n declare mode: BlendColorOwnProps['mode'];\n /**\n * alpha value. represent the strength of the blend color operation.\n * @type Number\n **/\n declare alpha: BlendColorOwnProps['alpha'];\n\n static defaults = blendColorDefaultValues;\n\n static type = 'BlendColor';\n\n static uniformLocations = ['uColor'];\n\n getCacheKey() {\n return `${this.type}_${this.mode}`;\n }\n\n protected getFragmentSource(): string {\n return `\n precision highp float;\n uniform sampler2D uTexture;\n uniform vec4 uColor;\n varying vec2 vTexCoord;\n void main() {\n vec4 color = texture2D(uTexture, vTexCoord);\n gl_FragColor = color;\n if (color.a > 0.0) {\n ${blendColorFragmentSource[this.mode]}\n }\n }\n `;\n }\n\n /**\n * Apply the Blend operation to a Uint8ClampedArray representing the pixels of an image.\n *\n * @param {Object} options\n * @param {ImageData} options.imageData The Uint8ClampedArray to be filtered.\n */\n applyTo2d({ imageData: { data } }: T2DPipelineState) {\n const source = new Color(this.color).getSource();\n const alpha = this.alpha;\n const tr = source[0] * alpha;\n const tg = source[1] * alpha;\n const tb = source[2] * alpha;\n const alpha1 = 1 - alpha;\n\n for (let i = 0; i < data.length; i += 4) {\n const r = data[i];\n const g = data[i + 1];\n const b = data[i + 2];\n let oR, oG, oB;\n switch (this.mode) {\n case 'multiply':\n oR = (r * tr) / 255;\n oG = (g * tg) / 255;\n oB = (b * tb) / 255;\n break;\n case 'screen':\n oR = 255 - ((255 - r) * (255 - tr)) / 255;\n oG = 255 - ((255 - g) * (255 - tg)) / 255;\n oB = 255 - ((255 - b) * (255 - tb)) / 255;\n break;\n case 'add':\n oR = r + tr;\n oG = g + tg;\n oB = b + tb;\n break;\n case 'difference':\n oR = Math.abs(r - tr);\n oG = Math.abs(g - tg);\n oB = Math.abs(b - tb);\n break;\n case 'subtract':\n oR = r - tr;\n oG = g - tg;\n oB = b - tb;\n break;\n case 'darken':\n oR = Math.min(r, tr);\n oG = Math.min(g, tg);\n oB = Math.min(b, tb);\n break;\n case 'lighten':\n oR = Math.max(r, tr);\n oG = Math.max(g, tg);\n oB = Math.max(b, tb);\n break;\n case 'overlay':\n oR =\n tr < 128\n ? (2 * r * tr) / 255\n : 255 - (2 * (255 - r) * (255 - tr)) / 255;\n oG =\n tg < 128\n ? (2 * g * tg) / 255\n : 255 - (2 * (255 - g) * (255 - tg)) / 255;\n oB =\n tb < 128\n ? (2 * b * tb) / 255\n : 255 - (2 * (255 - b) * (255 - tb)) / 255;\n break;\n case 'exclusion':\n oR = tr + r - (2 * tr * r) / 255;\n oG = tg + g - (2 * tg * g) / 255;\n oB = tb + b - (2 * tb * b) / 255;\n break;\n case 'tint':\n oR = tr + r * alpha1;\n oG = tg + g * alpha1;\n oB = tb + b * alpha1;\n }\n data[i] = oR;\n data[i + 1] = oG;\n data[i + 2] = oB;\n }\n }\n\n /**\n * Send data from this filter to its shader program's uniforms.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n */\n sendUniformData(\n gl: WebGLRenderingContext,\n uniformLocations: TWebGLUniformLocationMap,\n ) {\n const source = new Color(this.color).getSource();\n source[0] = (this.alpha * source[0]) / 255;\n source[1] = (this.alpha * source[1]) / 255;\n source[2] = (this.alpha * source[2]) / 255;\n source[3] = this.alpha;\n gl.uniform4fv(uniformLocations.uColor, source);\n }\n}\n\nclassRegistry.setClass(BlendColor);\n","import type { TBlendImageMode } from '../BlendImage';\n\nexport const fragmentSource: Record = {\n multiply: `\n precision highp float;\n uniform sampler2D uTexture;\n uniform sampler2D uImage;\n uniform vec4 uColor;\n varying vec2 vTexCoord;\n varying vec2 vTexCoord2;\n void main() {\n vec4 color = texture2D(uTexture, vTexCoord);\n vec4 color2 = texture2D(uImage, vTexCoord2);\n color.rgba *= color2.rgba;\n gl_FragColor = color;\n }\n `,\n mask: `\n precision highp float;\n uniform sampler2D uTexture;\n uniform sampler2D uImage;\n uniform vec4 uColor;\n varying vec2 vTexCoord;\n varying vec2 vTexCoord2;\n void main() {\n vec4 color = texture2D(uTexture, vTexCoord);\n vec4 color2 = texture2D(uImage, vTexCoord2);\n color.a = color2.a;\n gl_FragColor = color;\n }\n `,\n} as const;\n\nexport const vertexSource = `\n attribute vec2 aPosition;\n varying vec2 vTexCoord;\n varying vec2 vTexCoord2;\n uniform mat3 uTransformMatrix;\n void main() {\n vTexCoord = aPosition;\n vTexCoord2 = (uTransformMatrix * vec3(aPosition, 1.0)).xy;\n gl_Position = vec4(aPosition * 2.0 - 1.0, 0.0, 1.0);\n }\n ` as const;\n","import { FabricImage } from '../shapes/Image';\nimport { createCanvasElement } from '../util/misc/dom';\nimport { BaseFilter } from './BaseFilter';\nimport type {\n T2DPipelineState,\n TWebGLPipelineState,\n TWebGLUniformLocationMap,\n} from './typedefs';\nimport type { WebGLFilterBackend } from './WebGLFilterBackend';\nimport { classRegistry } from '../ClassRegistry';\nimport { fragmentSource, vertexSource } from './shaders/blendImage';\n\nexport type TBlendImageMode = 'multiply' | 'mask';\n\ntype BlendImageOwnProps = {\n mode: TBlendImageMode;\n alpha: number;\n};\n\nexport const blendImageDefaultValues: BlendImageOwnProps = {\n mode: 'multiply',\n alpha: 1,\n};\n\n/**\n * Image Blend filter class\n * @example\n * const filter = new filters.BlendColor({\n * color: '#000',\n * mode: 'multiply'\n * });\n *\n * const filter = new BlendImage({\n * image: fabricImageObject,\n * mode: 'multiply'\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n * canvas.renderAll();\n */\nexport class BlendImage extends BaseFilter<'BlendImage', BlendImageOwnProps> {\n /**\n * Image to make the blend operation with.\n **/\n declare image: FabricImage;\n\n /**\n * Blend mode for the filter: either 'multiply' or 'mask'. 'multiply' will\n * multiply the values of each channel (R, G, B, and A) of the filter image by\n * their corresponding values in the base image. 'mask' will only look at the\n * alpha channel of the filter image, and apply those values to the base\n * image's alpha channel.\n * @type String\n **/\n declare mode: BlendImageOwnProps['mode'];\n\n /**\n * alpha value. represent the strength of the blend image operation.\n * not implemented.\n **/\n declare alpha: BlendImageOwnProps['alpha'];\n\n static type = 'BlendImage';\n\n static defaults = blendImageDefaultValues;\n\n static uniformLocations = ['uTransformMatrix', 'uImage'];\n\n getCacheKey() {\n return `${this.type}_${this.mode}`;\n }\n\n getFragmentSource(): string {\n return fragmentSource[this.mode];\n }\n\n getVertexSource(): string {\n return vertexSource;\n }\n\n applyToWebGL(options: TWebGLPipelineState) {\n const gl = options.context,\n texture = this.createTexture(options.filterBackend, this.image);\n this.bindAdditionalTexture(gl, texture!, gl.TEXTURE1);\n super.applyToWebGL(options);\n this.unbindAdditionalTexture(gl, gl.TEXTURE1);\n }\n\n createTexture(backend: WebGLFilterBackend, image: FabricImage) {\n return backend.getCachedTexture(image.cacheKey, image.getElement());\n }\n\n /**\n * Calculate a transformMatrix to adapt the image to blend over\n * @param {Object} options\n * @param {WebGLRenderingContext} options.context The GL context used for rendering.\n * @param {Object} options.programCache A map of compiled shader programs, keyed by filter type.\n */\n calculateMatrix() {\n const image = this.image,\n { width, height } = image.getElement();\n return [\n 1 / image.scaleX,\n 0,\n 0,\n 0,\n 1 / image.scaleY,\n 0,\n -image.left / width,\n -image.top / height,\n 1,\n ];\n }\n\n /**\n * Apply the Blend operation to a Uint8ClampedArray representing the pixels of an image.\n *\n * @param {Object} options\n * @param {ImageData} options.imageData The Uint8ClampedArray to be filtered.\n */\n applyTo2d({\n imageData: { data, width, height },\n filterBackend: { resources },\n }: T2DPipelineState) {\n const image = this.image;\n if (!resources.blendImage) {\n resources.blendImage = createCanvasElement();\n }\n const canvas1 = resources.blendImage;\n const context = canvas1.getContext('2d')!;\n if (canvas1.width !== width || canvas1.height !== height) {\n canvas1.width = width;\n canvas1.height = height;\n } else {\n context.clearRect(0, 0, width, height);\n }\n context.setTransform(\n image.scaleX,\n 0,\n 0,\n image.scaleY,\n image.left,\n image.top,\n );\n context.drawImage(image.getElement(), 0, 0, width, height);\n const blendData = context.getImageData(0, 0, width, height).data;\n for (let i = 0; i < data.length; i += 4) {\n const r = data[i];\n const g = data[i + 1];\n const b = data[i + 2];\n const a = data[i + 3];\n\n const tr = blendData[i];\n const tg = blendData[i + 1];\n const tb = blendData[i + 2];\n const ta = blendData[i + 3];\n\n switch (this.mode) {\n case 'multiply':\n data[i] = (r * tr) / 255;\n data[i + 1] = (g * tg) / 255;\n data[i + 2] = (b * tb) / 255;\n data[i + 3] = (a * ta) / 255;\n break;\n case 'mask':\n data[i + 3] = ta;\n break;\n }\n }\n }\n\n /**\n * Send data from this filter to its shader program's uniforms.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n */\n sendUniformData(\n gl: WebGLRenderingContext,\n uniformLocations: TWebGLUniformLocationMap,\n ) {\n const matrix = this.calculateMatrix();\n gl.uniform1i(uniformLocations.uImage, 1); // texture unit 1.\n gl.uniformMatrix3fv(uniformLocations.uTransformMatrix, false, matrix);\n }\n\n /**\n * Returns object representation of an instance\n * TODO: Handle the possibility of missing image better.\n * As of now a BlendImage filter without image can't be used with fromObject\n * @return {Object} Object representation of an instance\n */\n toObject(): {\n type: 'BlendImage';\n image: ReturnType;\n } & BlendImageOwnProps {\n return {\n ...super.toObject(),\n image: this.image && this.image.toObject(),\n };\n }\n\n /**\n * Create filter instance from an object representation\n * @param {object} object Object to create an instance from\n * @param {object} [options]\n * @param {AbortSignal} [options.signal] handle aborting image loading, see https://developer.mozilla.org/en-US/docs/Web/API/AbortController/signal\n * @returns {Promise}\n */\n static async fromObject(\n { type, image, ...filterOptions }: Record,\n options: { signal: AbortSignal },\n ): Promise> {\n return FabricImage.fromObject(image, options).then(\n (enlivedImage) => new this({ ...filterOptions, image: enlivedImage }),\n );\n }\n}\n\nclassRegistry.setClass(BlendImage);\n","import { BaseFilter } from './BaseFilter';\nimport type {\n TWebGLPipelineState,\n T2DPipelineState,\n TWebGLUniformLocationMap,\n} from './typedefs';\nimport { isWebGLPipelineState } from './utils';\nimport { classRegistry } from '../ClassRegistry';\nimport { fragmentSource } from './shaders/blur';\n\ntype BlurOwnProps = {\n blur: number;\n};\n\nexport const blurDefaultValues: BlurOwnProps = {\n blur: 0,\n};\n\n/**\n * Blur filter class\n * @example\n * const filter = new Blur({\n * blur: 0.5\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n * canvas.renderAll();\n */\nexport class Blur extends BaseFilter<'Blur', BlurOwnProps> {\n /**\n * blur value, in percentage of image dimensions.\n * specific to keep the image blur constant at different resolutions\n * range between 0 and 1.\n * @type Number\n */\n declare blur: BlurOwnProps['blur'];\n\n declare horizontal: boolean;\n declare aspectRatio: number;\n\n static type = 'Blur';\n\n static defaults = blurDefaultValues;\n\n static uniformLocations = ['uDelta'];\n\n getFragmentSource(): string {\n return fragmentSource;\n }\n\n applyTo(options: TWebGLPipelineState | T2DPipelineState) {\n if (isWebGLPipelineState(options)) {\n // this aspectRatio is used to give the same blur to vertical and horizontal\n this.aspectRatio = options.sourceWidth / options.sourceHeight;\n options.passes++;\n this._setupFrameBuffer(options);\n this.horizontal = true;\n this.applyToWebGL(options);\n this._swapTextures(options);\n this._setupFrameBuffer(options);\n this.horizontal = false;\n this.applyToWebGL(options);\n this._swapTextures(options);\n } else {\n this.applyTo2d(options);\n }\n }\n\n applyTo2d({ imageData: { data, width, height } }: T2DPipelineState) {\n // this code mimic the shader for output consistency\n // it samples 31 pixels across the image over a distance that depends from the blur value.\n this.aspectRatio = width / height;\n this.horizontal = true;\n let blurValue = this.getBlurValue() * width;\n const imageData = new Uint8ClampedArray(data);\n const samples = 15;\n const bytesInRow = 4 * width;\n for (let i = 0; i < data.length; i += 4) {\n let r = 0.0,\n g = 0.0,\n b = 0.0,\n a = 0.0,\n totalA = 0;\n const minIRow = i - (i % bytesInRow);\n const maxIRow = minIRow + bytesInRow;\n // for now let's keep noise out of the way\n // let pixelOffset = 0;\n // const offset = Math.random() * 3;\n // if (offset > 2) {\n // pixelOffset = 4;\n // } else if (offset < 1) {\n // pixelOffset = -4;\n // }\n for (let j = -samples + 1; j < samples; j++) {\n const percent = j / samples;\n const distance = Math.floor(blurValue * percent) * 4;\n const weight = 1 - Math.abs(percent);\n let sampledPixel = i + distance; // + pixelOffset;\n // try to implement edge mirroring\n if (sampledPixel < minIRow) {\n sampledPixel = minIRow;\n } else if (sampledPixel > maxIRow) {\n sampledPixel = maxIRow;\n }\n const localAlpha = data[sampledPixel + 3] * weight;\n r += data[sampledPixel] * localAlpha;\n g += data[sampledPixel + 1] * localAlpha;\n b += data[sampledPixel + 2] * localAlpha;\n a += localAlpha;\n totalA += weight;\n }\n imageData[i] = r / a;\n imageData[i + 1] = g / a;\n imageData[i + 2] = b / a;\n imageData[i + 3] = a / totalA;\n }\n this.horizontal = false;\n blurValue = this.getBlurValue() * height;\n for (let i = 0; i < imageData.length; i += 4) {\n let r = 0.0,\n g = 0.0,\n b = 0.0,\n a = 0.0,\n totalA = 0;\n const minIRow = i % bytesInRow;\n const maxIRow = imageData.length - bytesInRow + minIRow;\n // for now let's keep noise out of the way\n // let pixelOffset = 0;\n // const offset = Math.random() * 3;\n // if (offset > 2) {\n // pixelOffset = bytesInRow;\n // } else if (offset < 1) {\n // pixelOffset = -bytesInRow;\n // }\n for (let j = -samples + 1; j < samples; j++) {\n const percent = j / samples;\n const distance = Math.floor(blurValue * percent) * bytesInRow;\n const weight = 1 - Math.abs(percent);\n let sampledPixel = i + distance; // + pixelOffset;\n // try to implement edge mirroring\n if (sampledPixel < minIRow) {\n sampledPixel = minIRow;\n } else if (sampledPixel > maxIRow) {\n sampledPixel = maxIRow;\n }\n const localAlpha = imageData[sampledPixel + 3] * weight;\n r += imageData[sampledPixel] * localAlpha;\n g += imageData[sampledPixel + 1] * localAlpha;\n b += imageData[sampledPixel + 2] * localAlpha;\n a += localAlpha;\n totalA += weight;\n }\n data[i] = r / a;\n data[i + 1] = g / a;\n data[i + 2] = b / a;\n data[i + 3] = a / totalA;\n }\n }\n\n /**\n * Send data from this filter to its shader program's uniforms.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n */\n sendUniformData(\n gl: WebGLRenderingContext,\n uniformLocations: TWebGLUniformLocationMap,\n ) {\n const delta = this.chooseRightDelta();\n gl.uniform2fv(uniformLocations.uDelta, delta);\n }\n\n isNeutralState() {\n return this.blur === 0;\n }\n\n getBlurValue(): number {\n let blurScale = 1;\n const { horizontal, aspectRatio } = this;\n if (horizontal) {\n if (aspectRatio > 1) {\n // image is wide, i want to shrink radius horizontal\n blurScale = 1 / aspectRatio;\n }\n } else {\n if (aspectRatio < 1) {\n // image is tall, i want to shrink radius vertical\n blurScale = aspectRatio;\n }\n }\n return blurScale * this.blur * 0.12;\n }\n\n /**\n * choose right value of image percentage to blur with\n * @returns {Array} a numeric array with delta values\n */\n chooseRightDelta() {\n const blur = this.getBlurValue();\n return this.horizontal ? [blur, 0] : [0, blur];\n }\n}\n\nclassRegistry.setClass(Blur);\n","export const fragmentSource = `\n precision highp float;\n uniform sampler2D uTexture;\n uniform vec2 uDelta;\n varying vec2 vTexCoord;\n const float nSamples = 15.0;\n vec3 v3offset = vec3(12.9898, 78.233, 151.7182);\n float random(vec3 scale) {\n /* use the fragment position for a different seed per-pixel */\n return fract(sin(dot(gl_FragCoord.xyz, scale)) * 43758.5453);\n }\n void main() {\n vec4 color = vec4(0.0);\n float totalC = 0.0;\n float totalA = 0.0;\n float offset = random(v3offset);\n for (float t = -nSamples; t <= nSamples; t++) {\n float percent = (t + offset - 0.5) / nSamples;\n vec4 sample = texture2D(uTexture, vTexCoord + uDelta * percent);\n float weight = 1.0 - abs(percent);\n float alpha = weight * sample.a;\n color.rgb += sample.rgb * alpha;\n color.a += alpha;\n totalA += weight;\n totalC += alpha;\n }\n gl_FragColor.rgb = color.rgb / totalC;\n gl_FragColor.a = color.a / totalA;\n }\n ` as const;\n","import { BaseFilter } from './BaseFilter';\nimport type { T2DPipelineState, TWebGLUniformLocationMap } from './typedefs';\nimport { classRegistry } from '../ClassRegistry';\nimport { fragmentSource } from './shaders/brightness';\n\ntype BrightnessOwnProps = {\n brightness: number;\n};\n\nexport const brightnessDefaultValues: BrightnessOwnProps = {\n brightness: 0,\n};\n\n/**\n * Brightness filter class\n * @example\n * const filter = new Brightness({\n * brightness: 0.05\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n */\nexport class Brightness extends BaseFilter<'Brightness', BrightnessOwnProps> {\n /**\n * Brightness value, from -1 to 1.\n * translated to -255 to 255 for 2d\n * 0.0039215686 is the part of 1 that get translated to 1 in 2d\n * @param {Number} brightness\n */\n declare brightness: BrightnessOwnProps['brightness'];\n\n static type = 'Brightness';\n\n static defaults = brightnessDefaultValues;\n\n static uniformLocations = ['uBrightness'];\n\n getFragmentSource() {\n return fragmentSource;\n }\n\n /**\n * Apply the Brightness operation to a Uint8ClampedArray representing the pixels of an image.\n *\n * @param {Object} options\n * @param {ImageData} options.imageData The Uint8ClampedArray to be filtered.\n */\n applyTo2d({ imageData: { data } }: T2DPipelineState) {\n const brightness = Math.round(this.brightness * 255);\n for (let i = 0; i < data.length; i += 4) {\n data[i] += brightness;\n data[i + 1] += brightness;\n data[i + 2] += brightness;\n }\n }\n\n isNeutralState() {\n return this.brightness === 0;\n }\n\n /**\n * Send data from this filter to its shader program's uniforms.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n */\n sendUniformData(\n gl: WebGLRenderingContext,\n uniformLocations: TWebGLUniformLocationMap,\n ) {\n gl.uniform1f(uniformLocations.uBrightness, this.brightness);\n }\n}\n\nclassRegistry.setClass(Brightness);\n","export const fragmentSource = `\n precision highp float;\n uniform sampler2D uTexture;\n uniform float uBrightness;\n varying vec2 vTexCoord;\n void main() {\n vec4 color = texture2D(uTexture, vTexCoord);\n color.rgb += uBrightness;\n gl_FragColor = color;\n }\n`;\n","export const fragmentSource = `\n precision highp float;\n uniform sampler2D uTexture;\n varying vec2 vTexCoord;\n uniform mat4 uColorMatrix;\n uniform vec4 uConstants;\n void main() {\n vec4 color = texture2D(uTexture, vTexCoord);\n color *= uColorMatrix;\n color += uConstants;\n gl_FragColor = color;\n }`;\n","import { BaseFilter } from './BaseFilter';\nimport type {\n T2DPipelineState,\n TMatColorMatrix,\n TWebGLUniformLocationMap,\n} from './typedefs';\nimport { classRegistry } from '../ClassRegistry';\nimport { fragmentSource } from './shaders/colorMatrix';\n\nexport type ColorMatrixOwnProps = {\n matrix: TMatColorMatrix;\n colorsOnly: boolean;\n};\n\nexport const colorMatrixDefaultValues: ColorMatrixOwnProps = {\n matrix: [1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0],\n colorsOnly: true,\n};\n\n/**\n * Color Matrix filter class\n * @see {@link http://fabricjs.com/image-filters|ImageFilters demo}\n * @see {@Link http://phoboslab.org/log/2013/11/fast-image-filters-with-webgl demo}\n * @example Kodachrome filter\n * const filter = new ColorMatrix({\n * matrix: [\n 1.1285582396593525, -0.3967382283601348, -0.03992559172921793, 0, 63.72958762196502,\n -0.16404339962244616, 1.0835251566291304, -0.05498805115633132, 0, 24.732407896706203,\n -0.16786010706155763, -0.5603416277695248, 1.6014850761964943, 0, 35.62982807460946,\n 0, 0, 0, 1, 0\n ]\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n */\nexport class ColorMatrix<\n Name extends string = 'ColorMatrix',\n OwnProps extends object = ColorMatrixOwnProps,\n SerializedProps extends object = ColorMatrixOwnProps,\n> extends BaseFilter {\n /**\n * Colormatrix for pixels.\n * array of 20 floats. Numbers in positions 4, 9, 14, 19 loose meaning\n * outside the -1, 1 range.\n * 0.0039215686 is the part of 1 that get translated to 1 in 2d\n * @param {Array} matrix array of 20 numbers.\n */\n declare matrix: ColorMatrixOwnProps['matrix'];\n\n /**\n * Lock the colormatrix on the color part, skipping alpha, mainly for non webgl scenario\n * to save some calculation\n * @type Boolean\n * @default true\n */\n declare colorsOnly: ColorMatrixOwnProps['colorsOnly'];\n\n static type = 'ColorMatrix';\n\n static defaults = colorMatrixDefaultValues;\n\n static uniformLocations = ['uColorMatrix', 'uConstants'];\n\n getFragmentSource(): string {\n return fragmentSource;\n }\n\n /**\n * Apply the ColorMatrix operation to a Uint8Array representing the pixels of an image.\n *\n * @param {Object} options\n * @param {ImageData} options.imageData The Uint8Array to be filtered.\n */\n applyTo2d(options: T2DPipelineState) {\n const imageData = options.imageData,\n data = imageData.data,\n m = this.matrix,\n colorsOnly = this.colorsOnly;\n\n for (let i = 0; i < data.length; i += 4) {\n const r = data[i];\n const g = data[i + 1];\n const b = data[i + 2];\n\n data[i] = r * m[0] + g * m[1] + b * m[2] + m[4] * 255;\n data[i + 1] = r * m[5] + g * m[6] + b * m[7] + m[9] * 255;\n data[i + 2] = r * m[10] + g * m[11] + b * m[12] + m[14] * 255;\n if (!colorsOnly) {\n const a = data[i + 3];\n data[i] += a * m[3];\n data[i + 1] += a * m[8];\n data[i + 2] += a * m[13];\n data[i + 3] =\n r * m[15] + g * m[16] + b * m[17] + a * m[18] + m[19] * 255;\n }\n }\n }\n\n /**\n * Send data from this filter to its shader program's uniforms.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n */\n sendUniformData(\n gl: WebGLRenderingContext,\n uniformLocations: TWebGLUniformLocationMap,\n ) {\n const m = this.matrix,\n matrix = [\n m[0],\n m[1],\n m[2],\n m[3],\n m[5],\n m[6],\n m[7],\n m[8],\n m[10],\n m[11],\n m[12],\n m[13],\n m[15],\n m[16],\n m[17],\n m[18],\n ],\n constants = [m[4], m[9], m[14], m[19]];\n gl.uniformMatrix4fv(uniformLocations.uColorMatrix, false, matrix);\n gl.uniform4fv(uniformLocations.uConstants, constants);\n }\n\n toObject(): { type: Name } & SerializedProps {\n return {\n ...super.toObject(),\n matrix: [...this.matrix] as TMatColorMatrix,\n };\n }\n}\n\nclassRegistry.setClass(ColorMatrix);\n","import { ColorMatrix } from './ColorMatrix';\nimport { classRegistry } from '../ClassRegistry';\nimport type { TMatColorMatrix } from './typedefs';\n\ntype FixedFiltersOwnProps = {\n colorsOnly: boolean;\n};\n\nexport function createColorMatrixFilter(key: string, matrix: TMatColorMatrix) {\n const newClass = class extends ColorMatrix<\n typeof key,\n FixedFiltersOwnProps,\n FixedFiltersOwnProps\n > {\n static type = key;\n\n static defaults = {\n colorsOnly: false,\n matrix,\n };\n\n toObject(): { type: string } & FixedFiltersOwnProps {\n return { type: this.type, colorsOnly: this.colorsOnly };\n }\n };\n classRegistry.setClass(newClass, key);\n return newClass as typeof ColorMatrix;\n}\n\nexport const Brownie = createColorMatrixFilter(\n 'Brownie',\n [\n 0.5997, 0.34553, -0.27082, 0, 0.186, -0.0377, 0.86095, 0.15059, 0, -0.1449,\n 0.24113, -0.07441, 0.44972, 0, -0.02965, 0, 0, 0, 1, 0,\n ],\n);\n\nexport const Vintage = createColorMatrixFilter(\n 'Vintage',\n [\n 0.62793, 0.32021, -0.03965, 0, 0.03784, 0.02578, 0.64411, 0.03259, 0,\n 0.02926, 0.0466, -0.08512, 0.52416, 0, 0.02023, 0, 0, 0, 1, 0,\n ],\n);\n\nexport const Kodachrome = createColorMatrixFilter(\n 'Kodachrome',\n [\n 1.12855, -0.39673, -0.03992, 0, 0.24991, -0.16404, 1.08352, -0.05498, 0,\n 0.09698, -0.16786, -0.56034, 1.60148, 0, 0.13972, 0, 0, 0, 1, 0,\n ],\n);\n\nexport const Technicolor = createColorMatrixFilter(\n 'Technicolor',\n [\n 1.91252, -0.85453, -0.09155, 0, 0.04624, -0.30878, 1.76589, -0.10601, 0,\n -0.27589, -0.2311, -0.75018, 1.84759, 0, 0.12137, 0, 0, 0, 1, 0,\n ],\n);\n\nexport const Polaroid = createColorMatrixFilter(\n 'Polaroid',\n [\n 1.438, -0.062, -0.062, 0, 0, -0.122, 1.378, -0.122, 0, 0, -0.016, -0.016,\n 1.483, 0, 0, 0, 0, 0, 1, 0,\n ],\n);\n\nexport const Sepia = createColorMatrixFilter(\n 'Sepia',\n [\n 0.393, 0.769, 0.189, 0, 0, 0.349, 0.686, 0.168, 0, 0, 0.272, 0.534, 0.131,\n 0, 0, 0, 0, 0, 1, 0,\n ],\n);\n\nexport const BlackWhite = createColorMatrixFilter(\n 'BlackWhite',\n [\n 1.5, 1.5, 1.5, 0, -1, 1.5, 1.5, 1.5, 0, -1, 1.5, 1.5, 1.5, 0, -1, 0, 0, 0,\n 1, 0,\n ],\n);\n","import { BaseFilter } from './BaseFilter';\nimport type { T2DPipelineState, TWebGLPipelineState } from './typedefs';\nimport { isWebGLPipelineState } from './utils';\nimport { classRegistry } from '../ClassRegistry';\n\ntype ComposedOwnProps = {\n subFilters: BaseFilter[];\n};\n\ntype ComposedSerializedProps = {\n subFilters: Record[];\n};\n\n/**\n * A container class that knows how to apply a sequence of filters to an input image.\n */\nexport class Composed extends BaseFilter<\n 'Composed',\n ComposedOwnProps,\n ComposedSerializedProps\n> {\n /**\n * A non sparse array of filters to apply\n */\n declare subFilters: ComposedOwnProps['subFilters'];\n\n static type = 'Composed';\n\n constructor(\n options: { subFilters?: BaseFilter[] } & Record = {},\n ) {\n super(options);\n this.subFilters = options.subFilters || [];\n }\n\n /**\n * Apply this container's filters to the input image provided.\n *\n * @param {Object} options\n * @param {Number} options.passes The number of filters remaining to be applied.\n */\n applyTo(options: TWebGLPipelineState | T2DPipelineState) {\n if (isWebGLPipelineState(options)) {\n options.passes += this.subFilters.length - 1;\n }\n this.subFilters.forEach((filter) => {\n filter.applyTo(options);\n });\n }\n\n /**\n * Serialize this filter into JSON.\n * @returns {Object} A JSON representation of this filter.\n */\n toObject() {\n return {\n type: this.type,\n subFilters: this.subFilters.map((filter) => filter.toObject()),\n };\n }\n\n isNeutralState() {\n return !this.subFilters.some((filter) => !filter.isNeutralState());\n }\n\n /**\n * Deserialize a JSON definition of a ComposedFilter into a concrete instance.\n * @param {oject} object Object to create an instance from\n * @param {object} [options]\n * @param {AbortSignal} [options.signal] handle aborting `BlendImage` filter loading, see https://developer.mozilla.org/en-US/docs/Web/API/AbortController/signal\n * @returns {Promise}\n */\n static fromObject(\n object: Record,\n options?: { signal: AbortSignal },\n ): Promise {\n return Promise.all(\n ((object.subFilters || []) as BaseFilter[]).map((filter) =>\n classRegistry\n .getClass(filter.type)\n .fromObject(filter, options),\n ),\n ).then((enlivedFilters) => new this({ subFilters: enlivedFilters }));\n }\n}\n\nclassRegistry.setClass(Composed);\n","import { BaseFilter } from './BaseFilter';\nimport type { T2DPipelineState, TWebGLUniformLocationMap } from './typedefs';\nimport { classRegistry } from '../ClassRegistry';\nimport { fragmentSource } from './shaders/constrast';\n\ntype ContrastOwnProps = {\n contrast: number;\n};\n\nexport const contrastDefaultValues: ContrastOwnProps = {\n contrast: 0,\n};\n\n/**\n * Contrast filter class\n * @example\n * const filter = new Contrast({\n * contrast: 0.25\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n */\nexport class Contrast extends BaseFilter<'Contrast', ContrastOwnProps> {\n /**\n * contrast value, range from -1 to 1.\n * @param {Number} contrast\n * @default 0\n */\n declare contrast: ContrastOwnProps['contrast'];\n\n static type = 'Contrast';\n\n static defaults = contrastDefaultValues;\n\n static uniformLocations = ['uContrast'];\n\n getFragmentSource() {\n return fragmentSource;\n }\n\n isNeutralState() {\n return this.contrast === 0;\n }\n\n /**\n * Apply the Contrast operation to a Uint8Array representing the pixels of an image.\n *\n * @param {Object} options\n * @param {ImageData} options.imageData The Uint8Array to be filtered.\n */\n applyTo2d({ imageData: { data } }: T2DPipelineState) {\n const contrast = Math.floor(this.contrast * 255),\n contrastF = (259 * (contrast + 255)) / (255 * (259 - contrast));\n\n for (let i = 0; i < data.length; i += 4) {\n data[i] = contrastF * (data[i] - 128) + 128;\n data[i + 1] = contrastF * (data[i + 1] - 128) + 128;\n data[i + 2] = contrastF * (data[i + 2] - 128) + 128;\n }\n }\n\n /**\n * Send data from this filter to its shader program's uniforms.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n */\n sendUniformData(\n gl: WebGLRenderingContext,\n uniformLocations: TWebGLUniformLocationMap,\n ) {\n gl.uniform1f(uniformLocations.uContrast, this.contrast);\n }\n}\n\nclassRegistry.setClass(Contrast);\n","export const fragmentSource = `\n precision highp float;\n uniform sampler2D uTexture;\n uniform float uContrast;\n varying vec2 vTexCoord;\n void main() {\n vec4 color = texture2D(uTexture, vTexCoord);\n float contrastF = 1.015 * (uContrast + 1.0) / (1.0 * (1.015 - uContrast));\n color.rgb = contrastF * (color.rgb - 0.5) + 0.5;\n gl_FragColor = color;\n }`;\n","export const fragmentSource = {\n Convolute_3_1: `\n precision highp float;\n uniform sampler2D uTexture;\n uniform float uMatrix[9];\n uniform float uStepW;\n uniform float uStepH;\n varying vec2 vTexCoord;\n void main() {\n vec4 color = vec4(0, 0, 0, 0);\n for (float h = 0.0; h < 3.0; h+=1.0) {\n for (float w = 0.0; w < 3.0; w+=1.0) {\n vec2 matrixPos = vec2(uStepW * (w - 1), uStepH * (h - 1));\n color += texture2D(uTexture, vTexCoord + matrixPos) * uMatrix[int(h * 3.0 + w)];\n }\n }\n gl_FragColor = color;\n }\n `,\n Convolute_3_0: `\n precision highp float;\n uniform sampler2D uTexture;\n uniform float uMatrix[9];\n uniform float uStepW;\n uniform float uStepH;\n varying vec2 vTexCoord;\n void main() {\n vec4 color = vec4(0, 0, 0, 1);\n for (float h = 0.0; h < 3.0; h+=1.0) {\n for (float w = 0.0; w < 3.0; w+=1.0) {\n vec2 matrixPos = vec2(uStepW * (w - 1.0), uStepH * (h - 1.0));\n color.rgb += texture2D(uTexture, vTexCoord + matrixPos).rgb * uMatrix[int(h * 3.0 + w)];\n }\n }\n float alpha = texture2D(uTexture, vTexCoord).a;\n gl_FragColor = color;\n gl_FragColor.a = alpha;\n }\n `,\n Convolute_5_1: `\n precision highp float;\n uniform sampler2D uTexture;\n uniform float uMatrix[25];\n uniform float uStepW;\n uniform float uStepH;\n varying vec2 vTexCoord;\n void main() {\n vec4 color = vec4(0, 0, 0, 0);\n for (float h = 0.0; h < 5.0; h+=1.0) {\n for (float w = 0.0; w < 5.0; w+=1.0) {\n vec2 matrixPos = vec2(uStepW * (w - 2.0), uStepH * (h - 2.0));\n color += texture2D(uTexture, vTexCoord + matrixPos) * uMatrix[int(h * 5.0 + w)];\n }\n }\n gl_FragColor = color;\n }\n `,\n Convolute_5_0: `\n precision highp float;\n uniform sampler2D uTexture;\n uniform float uMatrix[25];\n uniform float uStepW;\n uniform float uStepH;\n varying vec2 vTexCoord;\n void main() {\n vec4 color = vec4(0, 0, 0, 1);\n for (float h = 0.0; h < 5.0; h+=1.0) {\n for (float w = 0.0; w < 5.0; w+=1.0) {\n vec2 matrixPos = vec2(uStepW * (w - 2.0), uStepH * (h - 2.0));\n color.rgb += texture2D(uTexture, vTexCoord + matrixPos).rgb * uMatrix[int(h * 5.0 + w)];\n }\n }\n float alpha = texture2D(uTexture, vTexCoord).a;\n gl_FragColor = color;\n gl_FragColor.a = alpha;\n }\n `,\n Convolute_7_1: `\n precision highp float;\n uniform sampler2D uTexture;\n uniform float uMatrix[49];\n uniform float uStepW;\n uniform float uStepH;\n varying vec2 vTexCoord;\n void main() {\n vec4 color = vec4(0, 0, 0, 0);\n for (float h = 0.0; h < 7.0; h+=1.0) {\n for (float w = 0.0; w < 7.0; w+=1.0) {\n vec2 matrixPos = vec2(uStepW * (w - 3.0), uStepH * (h - 3.0));\n color += texture2D(uTexture, vTexCoord + matrixPos) * uMatrix[int(h * 7.0 + w)];\n }\n }\n gl_FragColor = color;\n }\n `,\n Convolute_7_0: `\n precision highp float;\n uniform sampler2D uTexture;\n uniform float uMatrix[49];\n uniform float uStepW;\n uniform float uStepH;\n varying vec2 vTexCoord;\n void main() {\n vec4 color = vec4(0, 0, 0, 1);\n for (float h = 0.0; h < 7.0; h+=1.0) {\n for (float w = 0.0; w < 7.0; w+=1.0) {\n vec2 matrixPos = vec2(uStepW * (w - 3.0), uStepH * (h - 3.0));\n color.rgb += texture2D(uTexture, vTexCoord + matrixPos).rgb * uMatrix[int(h * 7.0 + w)];\n }\n }\n float alpha = texture2D(uTexture, vTexCoord).a;\n gl_FragColor = color;\n gl_FragColor.a = alpha;\n }\n `,\n Convolute_9_1: `\n precision highp float;\n uniform sampler2D uTexture;\n uniform float uMatrix[81];\n uniform float uStepW;\n uniform float uStepH;\n varying vec2 vTexCoord;\n void main() {\n vec4 color = vec4(0, 0, 0, 0);\n for (float h = 0.0; h < 9.0; h+=1.0) {\n for (float w = 0.0; w < 9.0; w+=1.0) {\n vec2 matrixPos = vec2(uStepW * (w - 4.0), uStepH * (h - 4.0));\n color += texture2D(uTexture, vTexCoord + matrixPos) * uMatrix[int(h * 9.0 + w)];\n }\n }\n gl_FragColor = color;\n }\n `,\n Convolute_9_0: `\n precision highp float;\n uniform sampler2D uTexture;\n uniform float uMatrix[81];\n uniform float uStepW;\n uniform float uStepH;\n varying vec2 vTexCoord;\n void main() {\n vec4 color = vec4(0, 0, 0, 1);\n for (float h = 0.0; h < 9.0; h+=1.0) {\n for (float w = 0.0; w < 9.0; w+=1.0) {\n vec2 matrixPos = vec2(uStepW * (w - 4.0), uStepH * (h - 4.0));\n color.rgb += texture2D(uTexture, vTexCoord + matrixPos).rgb * uMatrix[int(h * 9.0 + w)];\n }\n }\n float alpha = texture2D(uTexture, vTexCoord).a;\n gl_FragColor = color;\n gl_FragColor.a = alpha;\n }\n `,\n};\n","import { BaseFilter } from './BaseFilter';\nimport type { T2DPipelineState, TWebGLUniformLocationMap } from './typedefs';\nimport { classRegistry } from '../ClassRegistry';\nimport { fragmentSource } from './shaders/convolute';\n\nexport type ConvoluteOwnProps = {\n opaque: boolean;\n matrix: number[];\n};\n\nexport const convoluteDefaultValues: ConvoluteOwnProps = {\n opaque: false,\n matrix: [0, 0, 0, 0, 1, 0, 0, 0, 0],\n};\n\n/**\n * Adapted from html5rocks article\n * @example Sharpen filter\n * const filter = new Convolute({\n * matrix: [ 0, -1, 0,\n * -1, 5, -1,\n * 0, -1, 0 ]\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n * canvas.renderAll();\n * @example Blur filter\n * const filter = new Convolute({\n * matrix: [ 1/9, 1/9, 1/9,\n * 1/9, 1/9, 1/9,\n * 1/9, 1/9, 1/9 ]\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n * canvas.renderAll();\n * @example Emboss filter\n * const filter = new Convolute({\n * matrix: [ 1, 1, 1,\n * 1, 0.7, -1,\n * -1, -1, -1 ]\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n * canvas.renderAll();\n * @example Emboss filter with opaqueness\n * const filter = new Convolute({\n * opaque: true,\n * matrix: [ 1, 1, 1,\n * 1, 0.7, -1,\n * -1, -1, -1 ]\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n * canvas.renderAll();\n */\nexport class Convolute extends BaseFilter<'Convolute', ConvoluteOwnProps> {\n /*\n * Opaque value (true/false)\n */\n declare opaque: ConvoluteOwnProps['opaque'];\n\n /*\n * matrix for the filter, max 9x9\n */\n declare matrix: ConvoluteOwnProps['matrix'];\n\n static type = 'Convolute';\n\n static defaults = convoluteDefaultValues;\n\n static uniformLocations = ['uMatrix', 'uOpaque', 'uHalfSize', 'uSize'];\n\n getCacheKey() {\n return `${this.type}_${Math.sqrt(this.matrix.length)}_${\n this.opaque ? 1 : 0\n }` as keyof typeof fragmentSource;\n }\n\n getFragmentSource() {\n return fragmentSource[this.getCacheKey()];\n }\n\n /**\n * Apply the Brightness operation to a Uint8ClampedArray representing the pixels of an image.\n *\n * @param {Object} options\n * @param {ImageData} options.imageData The Uint8ClampedArray to be filtered.\n */\n applyTo2d(options: T2DPipelineState) {\n const imageData = options.imageData,\n data = imageData.data,\n weights = this.matrix,\n side = Math.round(Math.sqrt(weights.length)),\n halfSide = Math.floor(side / 2),\n sw = imageData.width,\n sh = imageData.height,\n output = options.ctx.createImageData(sw, sh),\n dst = output.data,\n // go through the destination image pixels\n alphaFac = this.opaque ? 1 : 0;\n let r, g, b, a, dstOff, scx, scy, srcOff, wt, x, y, cx, cy;\n\n for (y = 0; y < sh; y++) {\n for (x = 0; x < sw; x++) {\n dstOff = (y * sw + x) * 4;\n // calculate the weighed sum of the source image pixels that\n // fall under the convolution matrix\n r = 0;\n g = 0;\n b = 0;\n a = 0;\n\n for (cy = 0; cy < side; cy++) {\n for (cx = 0; cx < side; cx++) {\n scy = y + cy - halfSide;\n scx = x + cx - halfSide;\n\n // eslint-disable-next-line max-depth\n if (scy < 0 || scy >= sh || scx < 0 || scx >= sw) {\n continue;\n }\n\n srcOff = (scy * sw + scx) * 4;\n wt = weights[cy * side + cx];\n\n r += data[srcOff] * wt;\n g += data[srcOff + 1] * wt;\n b += data[srcOff + 2] * wt;\n // eslint-disable-next-line max-depth\n if (!alphaFac) {\n a += data[srcOff + 3] * wt;\n }\n }\n }\n dst[dstOff] = r;\n dst[dstOff + 1] = g;\n dst[dstOff + 2] = b;\n if (!alphaFac) {\n dst[dstOff + 3] = a;\n } else {\n dst[dstOff + 3] = data[dstOff + 3];\n }\n }\n }\n options.imageData = output;\n }\n\n /**\n * Send data from this filter to its shader program's uniforms.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n */\n sendUniformData(\n gl: WebGLRenderingContext,\n uniformLocations: TWebGLUniformLocationMap,\n ) {\n gl.uniform1fv(uniformLocations.uMatrix, this.matrix);\n }\n\n /**\n * Returns object representation of an instance\n * @return {Object} Object representation of an instance\n */\n toObject() {\n return {\n ...super.toObject(),\n opaque: this.opaque,\n matrix: [...this.matrix],\n };\n }\n}\n\nclassRegistry.setClass(Convolute);\n","export const fragmentSource = `\n precision highp float;\n uniform sampler2D uTexture;\n uniform vec3 uGamma;\n varying vec2 vTexCoord;\n void main() {\n vec4 color = texture2D(uTexture, vTexCoord);\n vec3 correction = (1.0 / uGamma);\n color.r = pow(color.r, correction.r);\n color.g = pow(color.g, correction.g);\n color.b = pow(color.b, correction.b);\n gl_FragColor = color;\n gl_FragColor.rgb *= color.a;\n }\n`;\n","import { BaseFilter } from './BaseFilter';\nimport { classRegistry } from '../ClassRegistry';\nimport { fragmentSource } from './shaders/gamma';\nimport type { T2DPipelineState, TWebGLUniformLocationMap } from './typedefs';\n\nconst GAMMA = 'Gamma' as const;\n\nexport type GammaInput = [number, number, number];\n\nexport type GammaOwnProps = {\n gamma: GammaInput;\n};\n\nexport const gammaDefaultValues: GammaOwnProps = {\n gamma: [1, 1, 1],\n};\n\n/**\n * Gamma filter class\n * @example\n * const filter = new Gamma({\n * gamma: [1, 0.5, 2.1]\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n */\nexport class Gamma extends BaseFilter {\n /**\n * Gamma array value, from 0.01 to 2.2.\n * @param {Array} gamma\n */\n declare gamma: GammaOwnProps['gamma'];\n declare rgbValues?: {\n r: Uint8Array;\n g: Uint8Array;\n b: Uint8Array;\n };\n\n static type = GAMMA;\n\n static defaults = gammaDefaultValues;\n\n static uniformLocations = ['uGamma'];\n\n getFragmentSource() {\n return fragmentSource;\n }\n\n constructor(options: { gamma?: GammaInput } = {}) {\n super(options);\n this.gamma =\n options.gamma ||\n ((\n this.constructor as typeof Gamma\n ).defaults.gamma.concat() as GammaInput);\n }\n\n /**\n * Apply the Gamma operation to a Uint8Array representing the pixels of an image.\n *\n * @param {Object} options\n * @param {ImageData} options.imageData The Uint8Array to be filtered.\n */\n applyTo2d({ imageData: { data } }: T2DPipelineState) {\n const gamma = this.gamma,\n rInv = 1 / gamma[0],\n gInv = 1 / gamma[1],\n bInv = 1 / gamma[2];\n\n if (!this.rgbValues) {\n this.rgbValues = {\n r: new Uint8Array(256),\n g: new Uint8Array(256),\n b: new Uint8Array(256),\n };\n }\n\n // This is an optimization - pre-compute a look-up table for each color channel\n // instead of performing these pow calls for each pixel in the image.\n const rgb = this.rgbValues;\n for (let i = 0; i < 256; i++) {\n rgb.r[i] = Math.pow(i / 255, rInv) * 255;\n rgb.g[i] = Math.pow(i / 255, gInv) * 255;\n rgb.b[i] = Math.pow(i / 255, bInv) * 255;\n }\n for (let i = 0; i < data.length; i += 4) {\n data[i] = rgb.r[data[i]];\n data[i + 1] = rgb.g[data[i + 1]];\n data[i + 2] = rgb.b[data[i + 2]];\n }\n }\n\n /**\n * Send data from this filter to its shader program's uniforms.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n */\n sendUniformData(\n gl: WebGLRenderingContext,\n uniformLocations: TWebGLUniformLocationMap,\n ) {\n gl.uniform3fv(uniformLocations.uGamma, this.gamma);\n }\n\n isNeutralState() {\n const { gamma } = this;\n return gamma[0] === 1 && gamma[1] === 1 && gamma[2] === 1;\n }\n\n toObject(): { type: typeof GAMMA; gamma: GammaInput } {\n return {\n type: GAMMA,\n gamma: this.gamma.concat() as GammaInput,\n };\n }\n}\n\nclassRegistry.setClass(Gamma);\n","import type { TGrayscaleMode } from '../Grayscale';\n\nexport const fragmentSource: Record = {\n average: `\n precision highp float;\n uniform sampler2D uTexture;\n varying vec2 vTexCoord;\n void main() {\n vec4 color = texture2D(uTexture, vTexCoord);\n float average = (color.r + color.b + color.g) / 3.0;\n gl_FragColor = vec4(average, average, average, color.a);\n }\n `,\n lightness: `\n precision highp float;\n uniform sampler2D uTexture;\n uniform int uMode;\n varying vec2 vTexCoord;\n void main() {\n vec4 col = texture2D(uTexture, vTexCoord);\n float average = (max(max(col.r, col.g),col.b) + min(min(col.r, col.g),col.b)) / 2.0;\n gl_FragColor = vec4(average, average, average, col.a);\n }\n `,\n luminosity: `\n precision highp float;\n uniform sampler2D uTexture;\n uniform int uMode;\n varying vec2 vTexCoord;\n void main() {\n vec4 col = texture2D(uTexture, vTexCoord);\n float average = 0.21 * col.r + 0.72 * col.g + 0.07 * col.b;\n gl_FragColor = vec4(average, average, average, col.a);\n }\n `,\n};\n","import { BaseFilter } from './BaseFilter';\nimport type { T2DPipelineState, TWebGLUniformLocationMap } from './typedefs';\nimport { classRegistry } from '../ClassRegistry';\nimport { fragmentSource } from './shaders/grayscale';\n\nexport type TGrayscaleMode = 'average' | 'lightness' | 'luminosity';\n\ntype GrayscaleOwnProps = {\n mode: TGrayscaleMode;\n};\n\nexport const grayscaleDefaultValues: GrayscaleOwnProps = {\n mode: 'average',\n};\n\n/**\n * Grayscale image filter class\n * @example\n * const filter = new Grayscale();\n * object.filters.push(filter);\n * object.applyFilters();\n */\nexport class Grayscale extends BaseFilter<'Grayscale', GrayscaleOwnProps> {\n declare mode: TGrayscaleMode;\n\n static type = 'Grayscale';\n\n static defaults = grayscaleDefaultValues;\n\n static uniformLocations = ['uMode'];\n\n /**\n * Apply the Grayscale operation to a Uint8Array representing the pixels of an image.\n *\n * @param {Object} options\n * @param {ImageData} options.imageData The Uint8Array to be filtered.\n */\n applyTo2d({ imageData: { data } }: T2DPipelineState) {\n for (let i = 0, value: number; i < data.length; i += 4) {\n const r = data[i];\n const g = data[i + 1];\n const b = data[i + 2];\n switch (this.mode) {\n case 'average':\n value = (r + g + b) / 3;\n break;\n case 'lightness':\n value = (Math.min(r, g, b) + Math.max(r, g, b)) / 2;\n break;\n case 'luminosity':\n value = 0.21 * r + 0.72 * g + 0.07 * b;\n break;\n }\n\n data[i + 2] = data[i + 1] = data[i] = value;\n }\n }\n\n getCacheKey() {\n return `${this.type}_${this.mode}`;\n }\n\n getFragmentSource() {\n return fragmentSource[this.mode];\n }\n\n /**\n * Send data from this filter to its shader program's uniforms.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n */\n sendUniformData(\n gl: WebGLRenderingContext,\n uniformLocations: TWebGLUniformLocationMap,\n ) {\n const mode = 1;\n gl.uniform1i(uniformLocations.uMode, mode);\n }\n\n /**\n * Grayscale filter isNeutralState implementation\n * The filter is never neutral\n * on the image\n **/\n isNeutralState() {\n return false;\n }\n}\n\nclassRegistry.setClass(Grayscale);\n","import { cos } from '../util/misc/cos';\nimport { sin } from '../util/misc/sin';\nimport {\n ColorMatrix,\n type ColorMatrixOwnProps,\n colorMatrixDefaultValues,\n} from './ColorMatrix';\nimport type { TWebGLPipelineState, T2DPipelineState } from './typedefs';\nimport { classRegistry } from '../ClassRegistry';\n\nexport type HueRotationOwnProps = ColorMatrixOwnProps & {\n rotation: number;\n};\n\nexport type HueRotationSerializedProps = {\n rotation: number;\n};\n\nexport const hueRotationDefaultValues: HueRotationOwnProps = {\n ...colorMatrixDefaultValues,\n rotation: 0,\n};\n\n/**\n * HueRotation filter class\n * @example\n * const filter = new HueRotation({\n * rotation: -0.5\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n */\nexport class HueRotation extends ColorMatrix<\n 'HueRotation',\n HueRotationOwnProps,\n HueRotationSerializedProps\n> {\n /**\n * HueRotation value, from -1 to 1.\n */\n declare rotation: HueRotationOwnProps['rotation'];\n\n static type = 'HueRotation';\n\n static defaults = hueRotationDefaultValues;\n\n calculateMatrix() {\n const rad = this.rotation * Math.PI,\n cosine = cos(rad),\n sine = sin(rad),\n aThird = 1 / 3,\n aThirdSqtSin = Math.sqrt(aThird) * sine,\n OneMinusCos = 1 - cosine;\n this.matrix = [\n cosine + OneMinusCos / 3,\n aThird * OneMinusCos - aThirdSqtSin,\n aThird * OneMinusCos + aThirdSqtSin,\n 0,\n 0,\n aThird * OneMinusCos + aThirdSqtSin,\n cosine + aThird * OneMinusCos,\n aThird * OneMinusCos - aThirdSqtSin,\n 0,\n 0,\n aThird * OneMinusCos - aThirdSqtSin,\n aThird * OneMinusCos + aThirdSqtSin,\n cosine + aThird * OneMinusCos,\n 0,\n 0,\n 0,\n 0,\n 0,\n 1,\n 0,\n ];\n }\n\n isNeutralState() {\n return this.rotation === 0;\n }\n\n applyTo(options: TWebGLPipelineState | T2DPipelineState) {\n this.calculateMatrix();\n super.applyTo(options);\n }\n\n toObject() {\n return {\n type: this.type,\n rotation: this.rotation,\n };\n }\n}\n\nclassRegistry.setClass(HueRotation);\n","import { BaseFilter } from './BaseFilter';\nimport type { T2DPipelineState, TWebGLUniformLocationMap } from './typedefs';\nimport { classRegistry } from '../ClassRegistry';\nimport { fragmentSource } from './shaders/invert';\n\nexport type InvertOwnProps = {\n alpha: boolean;\n invert: boolean;\n};\n\nexport const invertDefaultValues: InvertOwnProps = {\n alpha: false,\n invert: true,\n};\n\n/**\n * @example\n * const filter = new Invert();\n * object.filters.push(filter);\n * object.applyFilters(canvas.renderAll.bind(canvas));\n */\nexport class Invert extends BaseFilter<'Invert', InvertOwnProps> {\n /**\n * Invert also alpha.\n * @param {Boolean} alpha\n **/\n declare alpha: InvertOwnProps['alpha'];\n\n /**\n * Filter invert. if false, does nothing\n * @param {Boolean} invert\n */\n declare invert: InvertOwnProps['invert'];\n\n static type = 'Invert';\n\n static defaults = invertDefaultValues;\n\n static uniformLocations = ['uInvert', 'uAlpha'];\n\n /**\n * Apply the Invert operation to a Uint8Array representing the pixels of an image.\n *\n * @param {Object} options\n * @param {ImageData} options.imageData The Uint8Array to be filtered.\n */\n applyTo2d({ imageData: { data } }: T2DPipelineState) {\n for (let i = 0; i < data.length; i += 4) {\n data[i] = 255 - data[i];\n data[i + 1] = 255 - data[i + 1];\n data[i + 2] = 255 - data[i + 2];\n\n if (this.alpha) {\n data[i + 3] = 255 - data[i + 3];\n }\n }\n }\n\n protected getFragmentSource(): string {\n return fragmentSource;\n }\n\n /**\n * Invert filter isNeutralState implementation\n * Used only in image applyFilters to discard filters that will not have an effect\n * on the image\n * @param {Object} options\n **/\n isNeutralState() {\n return !this.invert;\n }\n\n /**\n * Send data from this filter to its shader program's uniforms.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n */\n sendUniformData(\n gl: WebGLRenderingContext,\n uniformLocations: TWebGLUniformLocationMap,\n ) {\n gl.uniform1i(uniformLocations.uInvert, Number(this.invert));\n gl.uniform1i(uniformLocations.uAlpha, Number(this.alpha));\n }\n}\n\nclassRegistry.setClass(Invert);\n","export const fragmentSource = `\n precision highp float;\n uniform sampler2D uTexture;\n uniform int uInvert;\n uniform int uAlpha;\n varying vec2 vTexCoord;\n void main() {\n vec4 color = texture2D(uTexture, vTexCoord);\n if (uInvert == 1) {\n if (uAlpha == 1) {\n gl_FragColor = vec4(1.0 - color.r,1.0 -color.g,1.0 -color.b,1.0 -color.a);\n } else {\n gl_FragColor = vec4(1.0 - color.r,1.0 -color.g,1.0 -color.b,color.a);\n }\n } else {\n gl_FragColor = color;\n }\n }\n`;\n","import { BaseFilter } from './BaseFilter';\nimport type { T2DPipelineState, TWebGLUniformLocationMap } from './typedefs';\nimport { classRegistry } from '../ClassRegistry';\nimport { fragmentSource } from './shaders/noise';\n\nexport type NoiseOwnProps = {\n noise: number;\n};\n\nexport const noiseDefaultValues: NoiseOwnProps = {\n noise: 0,\n};\n\n/**\n * Noise filter class\n * @example\n * const filter = new Noise({\n * noise: 700\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n * canvas.renderAll();\n */\nexport class Noise extends BaseFilter<'Noise', NoiseOwnProps> {\n /**\n * Noise value, from\n * @param {Number} noise\n */\n declare noise: NoiseOwnProps['noise'];\n\n static type = 'Noise';\n\n static defaults = noiseDefaultValues;\n\n static uniformLocations = ['uNoise', 'uSeed'];\n\n getFragmentSource() {\n return fragmentSource;\n }\n\n /**\n * Apply the Brightness operation to a Uint8ClampedArray representing the pixels of an image.\n *\n * @param {Object} options\n * @param {ImageData} options.imageData The Uint8ClampedArray to be filtered.\n */\n applyTo2d({ imageData: { data } }: T2DPipelineState) {\n const noise = this.noise;\n for (let i = 0; i < data.length; i += 4) {\n const rand = (0.5 - Math.random()) * noise;\n data[i] += rand;\n data[i + 1] += rand;\n data[i + 2] += rand;\n }\n }\n\n /**\n * Send data from this filter to its shader program's uniforms.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n */\n sendUniformData(\n gl: WebGLRenderingContext,\n uniformLocations: TWebGLUniformLocationMap,\n ) {\n gl.uniform1f(uniformLocations.uNoise, this.noise / 255);\n gl.uniform1f(uniformLocations.uSeed, Math.random());\n }\n\n isNeutralState() {\n return this.noise === 0;\n }\n}\n\nclassRegistry.setClass(Noise);\n","export const fragmentSource = `\n precision highp float;\n uniform sampler2D uTexture;\n uniform float uStepH;\n uniform float uNoise;\n uniform float uSeed;\n varying vec2 vTexCoord;\n float rand(vec2 co, float seed, float vScale) {\n return fract(sin(dot(co.xy * vScale ,vec2(12.9898 , 78.233))) * 43758.5453 * (seed + 0.01) / 2.0);\n }\n void main() {\n vec4 color = texture2D(uTexture, vTexCoord);\n color.rgb += (0.5 - rand(vTexCoord, uSeed, 0.1 / uStepH)) * uNoise;\n gl_FragColor = color;\n }\n`;\n","import { BaseFilter } from './BaseFilter';\nimport type { T2DPipelineState, TWebGLUniformLocationMap } from './typedefs';\nimport { classRegistry } from '../ClassRegistry';\nimport { fragmentSource } from './shaders/pixelate';\n\nexport type PixelateOwnProps = {\n blocksize: number;\n};\n\nexport const pixelateDefaultValues: PixelateOwnProps = {\n blocksize: 4,\n};\n\n/**\n * Pixelate filter class\n * @example\n * const filter = new Pixelate({\n * blocksize: 8\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n */\nexport class Pixelate extends BaseFilter<'Pixelate', PixelateOwnProps> {\n declare blocksize: PixelateOwnProps['blocksize'];\n\n static type = 'Pixelate';\n\n static defaults = pixelateDefaultValues;\n\n static uniformLocations = ['uBlocksize'];\n\n /**\n * Apply the Pixelate operation to a Uint8ClampedArray representing the pixels of an image.\n *\n * @param {Object} options\n * @param {ImageData} options.imageData The Uint8ClampedArray to be filtered.\n */\n applyTo2d({ imageData: { data, width, height } }: T2DPipelineState) {\n for (let i = 0; i < height; i += this.blocksize) {\n for (let j = 0; j < width; j += this.blocksize) {\n const index = i * 4 * width + j * 4;\n const r = data[index];\n const g = data[index + 1];\n const b = data[index + 2];\n const a = data[index + 3];\n\n for (let _i = i; _i < Math.min(i + this.blocksize, height); _i++) {\n for (let _j = j; _j < Math.min(j + this.blocksize, width); _j++) {\n const index = _i * 4 * width + _j * 4;\n data[index] = r;\n data[index + 1] = g;\n data[index + 2] = b;\n data[index + 3] = a;\n }\n }\n }\n }\n }\n\n /**\n * Indicate when the filter is not gonna apply changes to the image\n **/\n isNeutralState() {\n return this.blocksize === 1;\n }\n\n protected getFragmentSource(): string {\n return fragmentSource;\n }\n\n /**\n * Send data from this filter to its shader program's uniforms.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n */\n sendUniformData(\n gl: WebGLRenderingContext,\n uniformLocations: TWebGLUniformLocationMap,\n ) {\n gl.uniform1f(uniformLocations.uBlocksize, this.blocksize);\n }\n}\n\nclassRegistry.setClass(Pixelate);\n","export const fragmentSource = `\n precision highp float;\n uniform sampler2D uTexture;\n uniform float uBlocksize;\n uniform float uStepW;\n uniform float uStepH;\n varying vec2 vTexCoord;\n void main() {\n float blockW = uBlocksize * uStepW;\n float blockH = uBlocksize * uStepH;\n int posX = int(vTexCoord.x / blockW);\n int posY = int(vTexCoord.y / blockH);\n float fposX = float(posX);\n float fposY = float(posY);\n vec2 squareCoords = vec2(fposX * blockW, fposY * blockH);\n vec4 color = texture2D(uTexture, squareCoords);\n gl_FragColor = color;\n }\n`;\n","import { classRegistry } from '../ClassRegistry';\nimport { Color } from '../color/Color';\nimport { BaseFilter } from './BaseFilter';\nimport { fragmentShader } from './shaders/removeColor';\nimport type { T2DPipelineState, TWebGLUniformLocationMap } from './typedefs';\n\nexport type RemoveColorOwnProps = {\n color: string;\n distance: number;\n useAlpha: boolean;\n};\n\nexport const removeColorDefaultValues: RemoveColorOwnProps = {\n color: '#FFFFFF',\n distance: 0.02,\n useAlpha: false,\n};\n\n/**\n * Remove white filter class\n * @example\n * const filter = new RemoveColor({\n * threshold: 0.2,\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n * canvas.renderAll();\n */\nexport class RemoveColor extends BaseFilter<\n 'RemoveColor',\n RemoveColorOwnProps\n> {\n /**\n * Color to remove, in any format understood by {@link Color}.\n */\n declare color: RemoveColorOwnProps['color'];\n\n /**\n * distance to actual color, as value up or down from each r,g,b\n * between 0 and 1\n **/\n declare distance: RemoveColorOwnProps['distance'];\n\n /**\n * For color to remove inside distance, use alpha channel for a smoother deletion\n * NOT IMPLEMENTED YET\n **/\n declare useAlpha: RemoveColorOwnProps['useAlpha'];\n\n static type = 'RemoveColor';\n\n static defaults = removeColorDefaultValues;\n\n static uniformLocations = ['uLow', 'uHigh'];\n\n getFragmentSource() {\n return fragmentShader;\n }\n\n /**\n * Applies filter to canvas element\n * @param {Object} canvasEl Canvas element to apply filter to\n */\n applyTo2d({ imageData: { data } }: T2DPipelineState) {\n const distance = this.distance * 255,\n source = new Color(this.color).getSource(),\n lowC = [source[0] - distance, source[1] - distance, source[2] - distance],\n highC = [\n source[0] + distance,\n source[1] + distance,\n source[2] + distance,\n ];\n\n for (let i = 0; i < data.length; i += 4) {\n const r = data[i];\n const g = data[i + 1];\n const b = data[i + 2];\n\n if (\n r > lowC[0] &&\n g > lowC[1] &&\n b > lowC[2] &&\n r < highC[0] &&\n g < highC[1] &&\n b < highC[2]\n ) {\n data[i + 3] = 0;\n }\n }\n }\n\n /**\n * Send data from this filter to its shader program's uniforms.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n */\n sendUniformData(\n gl: WebGLRenderingContext,\n uniformLocations: TWebGLUniformLocationMap,\n ) {\n const source = new Color(this.color).getSource(),\n distance = this.distance,\n lowC = [\n 0 + source[0] / 255 - distance,\n 0 + source[1] / 255 - distance,\n 0 + source[2] / 255 - distance,\n 1,\n ],\n highC = [\n source[0] / 255 + distance,\n source[1] / 255 + distance,\n source[2] / 255 + distance,\n 1,\n ];\n gl.uniform4fv(uniformLocations.uLow, lowC);\n gl.uniform4fv(uniformLocations.uHigh, highC);\n }\n}\n\nclassRegistry.setClass(RemoveColor);\n","export const fragmentShader = `\nprecision highp float;\nuniform sampler2D uTexture;\nuniform vec4 uLow;\nuniform vec4 uHigh;\nvarying vec2 vTexCoord;\nvoid main() {\n gl_FragColor = texture2D(uTexture, vTexCoord);\n if(all(greaterThan(gl_FragColor.rgb,uLow.rgb)) && all(greaterThan(uHigh.rgb,gl_FragColor.rgb))) {\n gl_FragColor.a = 0.0;\n }\n}\n`;\n","import { BaseFilter } from './BaseFilter';\nimport type {\n T2DPipelineState,\n TWebGLPipelineState,\n TWebGLUniformLocationMap,\n} from './typedefs';\nimport { isWebGLPipelineState } from './utils';\nimport { classRegistry } from '../ClassRegistry';\nimport { createCanvasElement } from '../util/misc/dom';\nimport type { XY } from '../Point';\n\nexport type TResizeType = 'bilinear' | 'hermite' | 'sliceHack' | 'lanczos';\n\nexport type ResizeOwnProps = {\n resizeType: TResizeType;\n scaleX: number;\n scaleY: number;\n lanczosLobes: number;\n};\n\nexport type ResizeSerializedProps = ResizeOwnProps;\n\nexport const resizeDefaultValues: ResizeOwnProps = {\n resizeType: 'hermite',\n scaleX: 1,\n scaleY: 1,\n lanczosLobes: 3,\n};\n\ntype ResizeDuring2DResize = Resize & {\n rcpScaleX: number;\n rcpScaleY: number;\n};\n\ntype ResizeDuringWEBGLResize = Resize & {\n rcpScaleX: number;\n rcpScaleY: number;\n horizontal: boolean;\n width: number;\n height: number;\n taps: number[];\n tempScale: number;\n dH: number;\n dW: number;\n};\n\n/**\n * Resize image filter class\n * @example\n * const filter = new Resize();\n * object.filters.push(filter);\n * object.applyFilters(canvas.renderAll.bind(canvas));\n */\nexport class Resize extends BaseFilter<'Resize', ResizeOwnProps> {\n /**\n * Resize type\n * for webgl resizeType is just lanczos, for canvas2d can be:\n * bilinear, hermite, sliceHack, lanczos.\n */\n declare resizeType: ResizeOwnProps['resizeType'];\n\n /**\n * Scale factor for resizing, x axis\n * @param {Number} scaleX\n */\n declare scaleX: ResizeOwnProps['scaleX'];\n\n /**\n * Scale factor for resizing, y axis\n * @param {Number} scaleY\n */\n declare scaleY: ResizeOwnProps['scaleY'];\n\n /**\n * LanczosLobes parameter for lanczos filter, valid for resizeType lanczos\n * @param {Number} lanczosLobes\n */\n declare lanczosLobes: ResizeOwnProps['lanczosLobes'];\n\n static type = 'Resize';\n\n static defaults = resizeDefaultValues;\n\n static uniformLocations = ['uDelta', 'uTaps'];\n\n /**\n * Send data from this filter to its shader program's uniforms.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n */\n sendUniformData(\n this: ResizeDuringWEBGLResize,\n gl: WebGLRenderingContext,\n uniformLocations: TWebGLUniformLocationMap,\n ) {\n gl.uniform2fv(\n uniformLocations.uDelta,\n this.horizontal ? [1 / this.width, 0] : [0, 1 / this.height],\n );\n gl.uniform1fv(uniformLocations.uTaps, this.taps);\n }\n\n getFilterWindow(this: ResizeDuringWEBGLResize) {\n const scale = this.tempScale;\n return Math.ceil(this.lanczosLobes / scale);\n }\n\n getCacheKey(this: ResizeDuringWEBGLResize): string {\n const filterWindow = this.getFilterWindow();\n return `${this.type}_${filterWindow}`;\n }\n\n getFragmentSource(this: ResizeDuringWEBGLResize): string {\n const filterWindow = this.getFilterWindow();\n return this.generateShader(filterWindow);\n }\n\n getTaps(this: ResizeDuringWEBGLResize) {\n const lobeFunction = this.lanczosCreate(this.lanczosLobes),\n scale = this.tempScale,\n filterWindow = this.getFilterWindow(),\n taps = new Array(filterWindow);\n for (let i = 1; i <= filterWindow; i++) {\n taps[i - 1] = lobeFunction(i * scale);\n }\n return taps;\n }\n\n /**\n * Generate vertex and shader sources from the necessary steps numbers\n * @param {Number} filterWindow\n */\n generateShader(filterWindow: number) {\n const offsets = new Array(filterWindow);\n for (let i = 1; i <= filterWindow; i++) {\n offsets[i - 1] = `${i}.0 * uDelta`;\n }\n return `\n precision highp float;\n uniform sampler2D uTexture;\n uniform vec2 uDelta;\n varying vec2 vTexCoord;\n uniform float uTaps[${filterWindow}];\n void main() {\n vec4 color = texture2D(uTexture, vTexCoord);\n float sum = 1.0;\n ${offsets\n .map(\n (offset, i) => `\n color += texture2D(uTexture, vTexCoord + ${offset}) * uTaps[${i}] + texture2D(uTexture, vTexCoord - ${offset}) * uTaps[${i}];\n sum += 2.0 * uTaps[${i}];\n `,\n )\n .join('\\n')}\n gl_FragColor = color / sum;\n }\n `;\n }\n\n applyToForWebgl(this: ResizeDuringWEBGLResize, options: TWebGLPipelineState) {\n options.passes++;\n this.width = options.sourceWidth;\n this.horizontal = true;\n this.dW = Math.round(this.width * this.scaleX);\n this.dH = options.sourceHeight;\n this.tempScale = this.dW / this.width;\n this.taps = this.getTaps();\n options.destinationWidth = this.dW;\n super.applyTo(options);\n options.sourceWidth = options.destinationWidth;\n\n this.height = options.sourceHeight;\n this.horizontal = false;\n this.dH = Math.round(this.height * this.scaleY);\n this.tempScale = this.dH / this.height;\n this.taps = this.getTaps();\n options.destinationHeight = this.dH;\n super.applyTo(options);\n options.sourceHeight = options.destinationHeight;\n }\n\n /**\n * Apply the resize filter to the image\n * Determines whether to use WebGL or Canvas2D based on the options.webgl flag.\n *\n * @param {Object} options\n * @param {Number} options.passes The number of filters remaining to be executed\n * @param {Boolean} options.webgl Whether to use webgl to render the filter.\n * @param {WebGLTexture} options.sourceTexture The texture setup as the source to be filtered.\n * @param {WebGLTexture} options.targetTexture The texture where filtered output should be drawn.\n * @param {WebGLRenderingContext} options.context The GL context used for rendering.\n * @param {Object} options.programCache A map of compiled shader programs, keyed by filter type.\n */\n applyTo(options: TWebGLPipelineState | T2DPipelineState) {\n if (isWebGLPipelineState(options)) {\n (this as unknown as ResizeDuringWEBGLResize).applyToForWebgl(options);\n } else {\n (this as unknown as ResizeDuring2DResize).applyTo2d(options);\n }\n }\n\n isNeutralState() {\n return this.scaleX === 1 && this.scaleY === 1;\n }\n\n lanczosCreate(lobes: number) {\n return (x: number) => {\n if (x >= lobes || x <= -lobes) {\n return 0.0;\n }\n if (x < 1.1920929e-7 && x > -1.1920929e-7) {\n return 1.0;\n }\n x *= Math.PI;\n const xx = x / lobes;\n return ((Math.sin(x) / x) * Math.sin(xx)) / xx;\n };\n }\n\n applyTo2d(this: ResizeDuring2DResize, options: T2DPipelineState) {\n const imageData = options.imageData,\n scaleX = this.scaleX,\n scaleY = this.scaleY;\n\n this.rcpScaleX = 1 / scaleX;\n this.rcpScaleY = 1 / scaleY;\n\n const oW = imageData.width;\n const oH = imageData.height;\n const dW = Math.round(oW * scaleX);\n const dH = Math.round(oH * scaleY);\n let newData: ImageData;\n\n if (this.resizeType === 'sliceHack') {\n newData = this.sliceByTwo(options, oW, oH, dW, dH);\n } else if (this.resizeType === 'hermite') {\n newData = this.hermiteFastResize(options, oW, oH, dW, dH);\n } else if (this.resizeType === 'bilinear') {\n newData = this.bilinearFiltering(options, oW, oH, dW, dH);\n } else if (this.resizeType === 'lanczos') {\n newData = this.lanczosResize(options, oW, oH, dW, dH);\n } else {\n // this should never trigger, is here just for safety net.\n newData = new ImageData(dW, dH);\n }\n options.imageData = newData;\n }\n\n /**\n * Filter sliceByTwo\n * @param {Object} canvasEl Canvas element to apply filter to\n * @param {Number} oW Original Width\n * @param {Number} oH Original Height\n * @param {Number} dW Destination Width\n * @param {Number} dH Destination Height\n * @returns {ImageData}\n */\n sliceByTwo(\n options: T2DPipelineState,\n oW: number,\n oH: number,\n dW: number,\n dH: number,\n ) {\n const imageData = options.imageData;\n const mult = 0.5;\n let doneW = false;\n let doneH = false;\n let stepW = oW * mult;\n let stepH = oH * mult;\n const resources = options.filterBackend.resources;\n let sX = 0;\n let sY = 0;\n const dX = oW;\n let dY = 0;\n if (!resources.sliceByTwo) {\n resources.sliceByTwo = createCanvasElement();\n }\n const tmpCanvas = resources.sliceByTwo;\n if (tmpCanvas.width < oW * 1.5 || tmpCanvas.height < oH) {\n tmpCanvas.width = oW * 1.5;\n tmpCanvas.height = oH;\n }\n const ctx = tmpCanvas.getContext('2d')!;\n ctx.clearRect(0, 0, oW * 1.5, oH);\n ctx.putImageData(imageData, 0, 0);\n\n dW = Math.floor(dW);\n dH = Math.floor(dH);\n\n while (!doneW || !doneH) {\n oW = stepW;\n oH = stepH;\n if (dW < Math.floor(stepW * mult)) {\n stepW = Math.floor(stepW * mult);\n } else {\n stepW = dW;\n doneW = true;\n }\n if (dH < Math.floor(stepH * mult)) {\n stepH = Math.floor(stepH * mult);\n } else {\n stepH = dH;\n doneH = true;\n }\n ctx.drawImage(tmpCanvas, sX, sY, oW, oH, dX, dY, stepW, stepH);\n sX = dX;\n sY = dY;\n dY += stepH;\n }\n return ctx.getImageData(sX, sY, dW, dH);\n }\n\n /**\n * Filter lanczosResize\n * @param {Object} canvasEl Canvas element to apply filter to\n * @param {Number} oW Original Width\n * @param {Number} oH Original Height\n * @param {Number} dW Destination Width\n * @param {Number} dH Destination Height\n * @returns {ImageData}\n */\n lanczosResize(\n this: ResizeDuring2DResize,\n options: T2DPipelineState,\n oW: number,\n oH: number,\n dW: number,\n dH: number,\n ): ImageData {\n function process(u: number): ImageData {\n let v, i, weight, idx, a, red, green, blue, alpha, fX, fY;\n center.x = (u + 0.5) * ratioX;\n icenter.x = Math.floor(center.x);\n for (v = 0; v < dH; v++) {\n center.y = (v + 0.5) * ratioY;\n icenter.y = Math.floor(center.y);\n a = 0;\n red = 0;\n green = 0;\n blue = 0;\n alpha = 0;\n for (i = icenter.x - range2X; i <= icenter.x + range2X; i++) {\n if (i < 0 || i >= oW) {\n continue;\n }\n fX = Math.floor(1000 * Math.abs(i - center.x));\n if (!cacheLanc[fX]) {\n cacheLanc[fX] = {};\n }\n for (let j = icenter.y - range2Y; j <= icenter.y + range2Y; j++) {\n if (j < 0 || j >= oH) {\n continue;\n }\n fY = Math.floor(1000 * Math.abs(j - center.y));\n if (!cacheLanc[fX][fY]) {\n cacheLanc[fX][fY] = lanczos(\n Math.sqrt(\n Math.pow(fX * rcpRatioX, 2) + Math.pow(fY * rcpRatioY, 2),\n ) / 1000,\n );\n }\n weight = cacheLanc[fX][fY];\n if (weight > 0) {\n idx = (j * oW + i) * 4;\n a += weight;\n red += weight * srcData[idx];\n green += weight * srcData[idx + 1];\n blue += weight * srcData[idx + 2];\n alpha += weight * srcData[idx + 3];\n }\n }\n }\n idx = (v * dW + u) * 4;\n destData[idx] = red / a;\n destData[idx + 1] = green / a;\n destData[idx + 2] = blue / a;\n destData[idx + 3] = alpha / a;\n }\n\n if (++u < dW) {\n return process(u);\n } else {\n return destImg;\n }\n }\n\n const srcData = options.imageData.data,\n destImg = options.ctx.createImageData(dW, dH),\n destData = destImg.data,\n lanczos = this.lanczosCreate(this.lanczosLobes),\n ratioX = this.rcpScaleX,\n ratioY = this.rcpScaleY,\n rcpRatioX = 2 / this.rcpScaleX,\n rcpRatioY = 2 / this.rcpScaleY,\n range2X = Math.ceil((ratioX * this.lanczosLobes) / 2),\n range2Y = Math.ceil((ratioY * this.lanczosLobes) / 2),\n cacheLanc: Record> = {},\n center: XY = { x: 0, y: 0 },\n icenter: XY = { x: 0, y: 0 };\n\n return process(0);\n }\n\n /**\n * bilinearFiltering\n * @param {Object} canvasEl Canvas element to apply filter to\n * @param {Number} oW Original Width\n * @param {Number} oH Original Height\n * @param {Number} dW Destination Width\n * @param {Number} dH Destination Height\n * @returns {ImageData}\n */\n bilinearFiltering(\n this: ResizeDuring2DResize,\n options: T2DPipelineState,\n oW: number,\n oH: number,\n dW: number,\n dH: number,\n ) {\n let a;\n let b;\n let c;\n let d;\n let x;\n let y;\n let i;\n let j;\n let xDiff;\n let yDiff;\n let chnl;\n let color;\n let offset = 0;\n let origPix;\n const ratioX = this.rcpScaleX;\n const ratioY = this.rcpScaleY;\n const w4 = 4 * (oW - 1);\n const img = options.imageData;\n const pixels = img.data;\n const destImage = options.ctx.createImageData(dW, dH);\n const destPixels = destImage.data;\n for (i = 0; i < dH; i++) {\n for (j = 0; j < dW; j++) {\n x = Math.floor(ratioX * j);\n y = Math.floor(ratioY * i);\n xDiff = ratioX * j - x;\n yDiff = ratioY * i - y;\n origPix = 4 * (y * oW + x);\n\n for (chnl = 0; chnl < 4; chnl++) {\n a = pixels[origPix + chnl];\n b = pixels[origPix + 4 + chnl];\n c = pixels[origPix + w4 + chnl];\n d = pixels[origPix + w4 + 4 + chnl];\n color =\n a * (1 - xDiff) * (1 - yDiff) +\n b * xDiff * (1 - yDiff) +\n c * yDiff * (1 - xDiff) +\n d * xDiff * yDiff;\n destPixels[offset++] = color;\n }\n }\n }\n return destImage;\n }\n\n /**\n * hermiteFastResize\n * @param {Object} canvasEl Canvas element to apply filter to\n * @param {Number} oW Original Width\n * @param {Number} oH Original Height\n * @param {Number} dW Destination Width\n * @param {Number} dH Destination Height\n * @returns {ImageData}\n */\n hermiteFastResize(\n this: ResizeDuring2DResize,\n options: T2DPipelineState,\n oW: number,\n oH: number,\n dW: number,\n dH: number,\n ) {\n const ratioW = this.rcpScaleX,\n ratioH = this.rcpScaleY,\n ratioWHalf = Math.ceil(ratioW / 2),\n ratioHHalf = Math.ceil(ratioH / 2),\n img = options.imageData,\n data = img.data,\n img2 = options.ctx.createImageData(dW, dH),\n data2 = img2.data;\n for (let j = 0; j < dH; j++) {\n for (let i = 0; i < dW; i++) {\n const x2 = (i + j * dW) * 4;\n let weight = 0;\n let weights = 0;\n let weightsAlpha = 0;\n let gxR = 0;\n let gxG = 0;\n let gxB = 0;\n let gxA = 0;\n const centerY = (j + 0.5) * ratioH;\n for (let yy = Math.floor(j * ratioH); yy < (j + 1) * ratioH; yy++) {\n const dy = Math.abs(centerY - (yy + 0.5)) / ratioHHalf,\n centerX = (i + 0.5) * ratioW,\n w0 = dy * dy;\n for (let xx = Math.floor(i * ratioW); xx < (i + 1) * ratioW; xx++) {\n let dx = Math.abs(centerX - (xx + 0.5)) / ratioWHalf;\n const w = Math.sqrt(w0 + dx * dx);\n /* eslint-disable max-depth */\n if (w > 1 && w < -1) {\n continue;\n }\n //hermite filter\n weight = 2 * w * w * w - 3 * w * w + 1;\n if (weight > 0) {\n dx = 4 * (xx + yy * oW);\n //alpha\n gxA += weight * data[dx + 3];\n weightsAlpha += weight;\n //colors\n if (data[dx + 3] < 255) {\n weight = (weight * data[dx + 3]) / 250;\n }\n gxR += weight * data[dx];\n gxG += weight * data[dx + 1];\n gxB += weight * data[dx + 2];\n weights += weight;\n }\n /* eslint-enable max-depth */\n }\n }\n data2[x2] = gxR / weights;\n data2[x2 + 1] = gxG / weights;\n data2[x2 + 2] = gxB / weights;\n data2[x2 + 3] = gxA / weightsAlpha;\n }\n }\n return img2;\n }\n}\n\nclassRegistry.setClass(Resize);\n","import { BaseFilter } from './BaseFilter';\nimport type { T2DPipelineState, TWebGLUniformLocationMap } from './typedefs';\nimport { classRegistry } from '../ClassRegistry';\nimport { fragmentSource } from './shaders/saturation';\n\nexport type SaturationOwnProps = {\n saturation: number;\n};\n\nexport const saturationDefaultValues: SaturationOwnProps = {\n saturation: 0,\n};\n\n/**\n * Saturate filter class\n * @example\n * const filter = new Saturation({\n * saturation: 1\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n */\nexport class Saturation extends BaseFilter<'Saturation', SaturationOwnProps> {\n /**\n * Saturation value, from -1 to 1.\n * Increases/decreases the color saturation.\n * A value of 0 has no effect.\n *\n * @param {Number} saturation\n */\n declare saturation: SaturationOwnProps['saturation'];\n\n static type = 'Saturation';\n\n static defaults = saturationDefaultValues;\n\n static uniformLocations = ['uSaturation'];\n\n getFragmentSource() {\n return fragmentSource;\n }\n\n /**\n * Apply the Saturation operation to a Uint8ClampedArray representing the pixels of an image.\n *\n * @param {Object} options\n * @param {ImageData} options.imageData The Uint8ClampedArray to be filtered.\n */\n applyTo2d({ imageData: { data } }: T2DPipelineState) {\n const adjust = -this.saturation;\n for (let i = 0; i < data.length; i += 4) {\n const r = data[i];\n const g = data[i + 1];\n const b = data[i + 2];\n const max = Math.max(r, g, b);\n data[i] += max !== r ? (max - r) * adjust : 0;\n data[i + 1] += max !== g ? (max - g) * adjust : 0;\n data[i + 2] += max !== b ? (max - b) * adjust : 0;\n }\n }\n\n /**\n * Send data from this filter to its shader program's uniforms.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n */\n sendUniformData(\n gl: WebGLRenderingContext,\n uniformLocations: TWebGLUniformLocationMap,\n ) {\n gl.uniform1f(uniformLocations.uSaturation, -this.saturation);\n }\n\n isNeutralState() {\n return this.saturation === 0;\n }\n}\n\nclassRegistry.setClass(Saturation);\n","export const fragmentSource = `\n precision highp float;\n uniform sampler2D uTexture;\n uniform float uSaturation;\n varying vec2 vTexCoord;\n void main() {\n vec4 color = texture2D(uTexture, vTexCoord);\n float rgMax = max(color.r, color.g);\n float rgbMax = max(rgMax, color.b);\n color.r += rgbMax != color.r ? (rgbMax - color.r) * uSaturation : 0.00;\n color.g += rgbMax != color.g ? (rgbMax - color.g) * uSaturation : 0.00;\n color.b += rgbMax != color.b ? (rgbMax - color.b) * uSaturation : 0.00;\n gl_FragColor = color;\n }\n`;\n","import { BaseFilter } from './BaseFilter';\nimport type { T2DPipelineState, TWebGLUniformLocationMap } from './typedefs';\nimport { classRegistry } from '../ClassRegistry';\nimport { fragmentSource } from './shaders/vibrance';\n\nexport type VibranceOwnProps = {\n vibrance: number;\n};\n\nexport const vibranceDefaultValues: VibranceOwnProps = {\n vibrance: 0,\n};\n\n/**\n * Vibrance filter class\n * @example\n * const filter = new Vibrance({\n * vibrance: 1\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n */\nexport class Vibrance extends BaseFilter<'Vibrance', VibranceOwnProps> {\n /**\n * Vibrance value, from -1 to 1.\n * Increases/decreases the saturation of more muted colors with less effect on saturated colors.\n * A value of 0 has no effect.\n *\n * @param {Number} vibrance\n */\n declare vibrance: VibranceOwnProps['vibrance'];\n\n static type = 'Vibrance';\n\n static defaults = vibranceDefaultValues;\n\n static uniformLocations = ['uVibrance'];\n\n getFragmentSource() {\n return fragmentSource;\n }\n\n /**\n * Apply the Vibrance operation to a Uint8ClampedArray representing the pixels of an image.\n *\n * @param {Object} options\n * @param {ImageData} options.imageData The Uint8ClampedArray to be filtered.\n */\n applyTo2d({ imageData: { data } }: T2DPipelineState) {\n const adjust = -this.vibrance;\n for (let i = 0; i < data.length; i += 4) {\n const r = data[i];\n const g = data[i + 1];\n const b = data[i + 2];\n const max = Math.max(r, g, b);\n const avg = (r + g + b) / 3;\n const amt = ((Math.abs(max - avg) * 2) / 255) * adjust;\n data[i] += max !== r ? (max - r) * amt : 0;\n data[i + 1] += max !== g ? (max - g) * amt : 0;\n data[i + 2] += max !== b ? (max - b) * amt : 0;\n }\n }\n\n /**\n * Send data from this filter to its shader program's uniforms.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {TWebGLUniformLocationMap} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n */\n sendUniformData(\n gl: WebGLRenderingContext,\n uniformLocations: TWebGLUniformLocationMap,\n ) {\n gl.uniform1f(uniformLocations.uVibrance, -this.vibrance);\n }\n\n isNeutralState() {\n return this.vibrance === 0;\n }\n}\n\nclassRegistry.setClass(Vibrance);\n","export const fragmentSource = `\n precision highp float;\n uniform sampler2D uTexture;\n uniform float uVibrance;\n varying vec2 vTexCoord;\n void main() {\n vec4 color = texture2D(uTexture, vTexCoord);\n float max = max(color.r, max(color.g, color.b));\n float avg = (color.r + color.g + color.b) / 3.0;\n float amt = (abs(max - avg) * 2.0) * uVibrance;\n color.r += max != color.r ? (max - color.r) * amt : 0.00;\n color.g += max != color.g ? (max - color.g) * amt : 0.00;\n color.b += max != color.b ? (max - color.b) * amt : 0.00;\n gl_FragColor = color;\n }\n`;\n"],"names":["BaseConfiguration","constructor","_defineProperty","this","window","devicePixelRatio","config","super","configure","arguments","length","undefined","Object","assign","addFonts","paths","fontPaths","removeFonts","forEach","fontFamily","clearFonts","restoreDefaults","keys","defaults","reduce","acc","key","log","severity","_len","optionalParams","Array","_key","console","FabricError","Error","message","options","SignalAbortedError","context","GLProbe","WebGLProbe","testPrecision","gl","precision","fragmentSource","fragmentShader","createShader","FRAGMENT_SHADER","shaderSource","compileShader","getShaderParameter","COMPILE_STATUS","queryWebGL","canvas","getContext","maxTextureSize","getParameter","MAX_TEXTURE_SIZE","GLPrecision","find","getExtension","loseContext","isSupported","textureSize","copyPasteData","env","setEnv","value","getEnv","document","isTouchSupported","navigator","maxTouchPoints","dispose","getFabricDocument","getFabricWindow","getDevicePixelRatio","_config$devicePixelRa","Math","max","cache","getFontCache","_ref","fontStyle","fontWeight","toLowerCase","charWidthsCache","fontCache","cacheKey","clearFontCache","limitDimsByArea","ar","perfLimitSizeTotal","roughWidth","sqrt","floor","VERSION","noop","halfPI","PI","quarterPI","twoMathPi","PiBy180","iMatrix","freeze","DEFAULT_SVG_FONT_SIZE","kRect","CENTER","LEFT","TOP","BOTTOM","RIGHT","NONE","reNewline","MOVING","SCALING","ROTATING","ROTATE","SKEWING","RESIZING","MODIFY_POLY","MODIFY_PATH","CHANGED","SCALE","SCALE_X","SCALE_Y","SKEW_X","SKEW_Y","FILL","STROKE","MODIFIED","JSON","SVG","classRegistry","Map","has","classType","getClass","get","setClass","classConstructor","set","type","getSVGClass","SVGTagName","setSVGClass","runningAnimations","remove","index","indexOf","splice","cancelAll","animations","animation","abort","cancelByCanvas","filter","_animation$target","target","cancelByTarget","Observable","on","arg0","handler","__eventListeners","entries","eventName","off","push","once","disposers","_ref2","d","disposer","args","call","_removeEventListener","eventListener","_ref3","fire","_this$__eventListener","listenersForEvent","concat","i","removeFromArray","array","idx","cos","angle","abs","sin","angleSlice","sign","Point","y","x","add","that","addEquals","scalarAdd","scalar","scalarAddEquals","subtract","subtractEquals","scalarSubtract","scalarSubtractEquals","multiply","scalarMultiply","scalarMultiplyEquals","divide","scalarDivide","scalarDivideEquals","eq","lt","lte","gt","gte","lerp","t","min","distanceFrom","dx","dy","midPointFrom","toString","setXY","setX","setY","setFromPoint","swap","clone","rotate","radians","origin","ZERO","sinus","cosinus","p","transform","ignoreOffset","isCollection","fabricObject","isArray","_objects","createCollectionMixin","Base","Collection","_onObjectAdded","object","_onObjectRemoved","_onStackOrderChanged","objects","size","insertAt","_len2","_key2","removed","_len3","_key3","forEachObject","callback","getObjects","_len4","types","_key4","o","isType","item","isEmpty","contains","deep","includes","some","obj","complexity","memo","current","sendObjectToBack","unshift","bringObjectToFront","sendObjectBackwards","intersecting","newIdx","findNewLowerIndex","bringObjectForward","findNewUpperIndex","moveObjectTo","isOverlapping","collectObjects","left","top","width","height","includeIntersecting","tl","br","selectable","visible","intersectsWithRect","isContainedWithinRect","containsPoint","CommonMethods","_setOptions","prop","_setObject","_set","toggle","property","requestAnimFrame","requestAnimationFrame","cancelAnimFrame","handle","cancelAnimationFrame","id","uid","createCanvasElement","element","createElement","createImage","createCanvasElementFor","newCanvas","toDataURL","canvasEl","format","quality","toBlob","Promise","resolve","_","degreesToRadians","degrees","radiansToDegrees","isIdentityMatrix","mat","every","transformPoint","invertTransform","a","r","multiplyTransformMatrices","b","is2x2","multiplyTransformMatrixArray","matrices","reduceRight","product","curr","calcPlaneRotation","atan2","qrDecompose","denom","pow","scaleX","scaleY","skewX","skewY","translateX","translateY","createTranslateMatrix","createRotateMatrix","angleRadiant","cosValue","sinValue","createScaleMatrix","angleToSkew","tan","createSkewXMatrix","skewValue","createSkewYMatrix","calcDimensionsMatrix","flipX","flipY","matrix","composeMatrix","scaleMatrix","loadImage","url","signal","crossOrigin","reject","aborted","img","err","src","addEventListener","done","onload","onerror","removeEventListener","enlivenObjects","reviver","instances","all","map","fromObject","then","fabricInstance","catch","error","instance","finally","enlivenObjectEnlivables","serializedObject","promises","values","enlived","pick","source","pickBy","predicate","toFixed","number","fractionDigits","parseFloat","Number","matrixToSVG","NUM_FRACTION_DIGITS","join","isFiller","filler","toLive","isSerializableFiller","toObject","isPattern","offsetX","isActiveSelection","getScrollLeftTop","doc","getDocumentFromElement","elementLoop","docElement","documentElement","body","scrollLeft","scrollTop","parentNode","host","nodeType","style","position","el","ownerDocument","getWindowFromElement","_el$ownerDocument","defaultView","setCanvasDimensions","ctx","retinaScaling","setAttribute","scale","setCSSDimensions","makeElementUnselectable","onselectstart","userSelect","StaticCanvasDOMManager","createLowerCanvas","lower","getElementById","hasAttribute","_originalCanvasStyle","cssText","classList","cleanupDOM","removeAttribute","setDimensions","calcOffset","_getWindowFromElement","offset","elemStyle","getComputedStyle","parseInt","borderLeftWidth","borderTopWidth","paddingLeft","paddingTop","box","docElem","getBoundingClientRect","scrollLeftTop","clientLeft","clientTop","getElementOffset","staticCanvasDefaults","backgroundVpt","backgroundColor","overlayVpt","overlayColor","includeDefaultValues","svgViewportTransformation","renderOnAddRemove","skipOffscreen","enableRetinaScaling","imageSmoothingEnabled","controlsAboveOverlay","allowTouchScrolling","viewportTransform","StaticCanvas","lowerCanvasEl","_this$elements$lower","elements","contextContainer","_this$elements$lower2","getDefaults","ownDefaults","initElements","_setDimensionsImpl","skipControlsDrawing","calcViewportBoundaries","requestRenderAll","setCoords","getRetinaScaling","_offset","getWidth","getHeight","dimensions","cssOnly","backstoreOnly","hasLostContext","getZoom","setViewportTransform","vpt","zoomToPoint","point","before","newPoint","after","setZoom","absolutePan","relativePan","getElement","clearContext","clearRect","clear","backgroundImage","overlayImage","renderAll","cancelRequestedRender","destroyed","renderCanvas","renderAndReset","nextRenderHandle","disposed","iVpt","vptCoords","tr","bl","drawControls","_ctx","v","path","clipPath","patternQuality","_renderBackground","save","_renderObjects","restore","shouldCache","_transformDone","renderCache","forClipping","drawClipPathOnCanvas","_renderOverlay","__cleanupTask","globalCompositeOperation","zoomX","zoomY","drawImage","_cacheCanvas","cacheTranslationX","cacheTranslationY","len","render","_renderBackgroundOrOverlay","fill","needsVpt","isAFiller","beginPath","moveTo","lineTo","closePath","fillStyle","offsetY","m","gradientTransform","patternTransform","getCenterPoint","centerObjectH","_centerObject","centerObjectV","centerObject","viewportCenterObject","getVpCenter","viewportCenterObjectH","viewportCenterObjectV","center","toDatalessJSON","propertiesToInclude","toDatalessObject","_toObjectMethod","toJSON","methodName","clipPathData","excludeFromExport","_toObject","version","__serializeBgOverlay","originalValue","data","bgImage","bgColor","background","overlay","toSVG","markup","_setSVGPreamble","_setSVGHeader","clipPathId","_setSVGBgOverlayColor","_setSVGBgOverlayImage","_setSVGObjects","suppressPreamble","encoding","optViewBox","viewBox","createSVGFontFacesMarkup","createSVGRefElementsMarkup","createSVGClipPathMarkup","toClipPathSVG","shouldTransform","additionalTransform","fontList","_renderText","styles","styleRow","fontListMarkup","_setSVGObject","bgOrOverlay","repeat","finalWidth","finalHeight","loadFromJSON","json","serialized","parse","enlivedMap","properties","cloneWithoutData","multiplier","finalMultiplier","toCanvasElement","scaledWidth","scaledHeight","zoom","originalWidth","originalHeight","originalSkipControlsDrawing","newZoom","vp","newVp","originalRetina","objectsToRender","task","destroy","kill","touchEvents","getPointer","event","scroll","_evt","touchProp","changedTouches","getTouchInfo","clientX","clientY","isTouchEvent","pointerType","stopEvent","e","preventDefault","stopPropagation","makeBoundingBoxFromPoints","points","addTransformToObject","applyTransformToObject","calcOwnMatrix","otherOptions","setPositionByOrigin","resetObjectTransform","saveObjectTransform","sizeAfterTransform","dimX","dimY","bbox","calcPlaneChangeMatrix","from","sendPointToPlane","to","sendVectorToPlane","sendObjectToPlane","fireEvent","_target$canvas","originOffset","bottom","right","resolveOrigin","originValue","unitVectorX","zero","rotateVector","vector","createVector","magnitude","calcAngleBetweenVectors","crossProduct","dotProduct","calcVectorRotation","getUnitVector","getOrthonormalVector","counterClockwise","isBetweenVectors","AxB","AxT","BxT","NOT_ALLOWED_CURSOR","isTransformCentered","originX","originY","invertOrigin","isLocked","lockingKey","commonEventInfo","eventData","pointer","findCornerQuadrant","control","coord","round","getLocalPoint","corner","controls","padding","localPoint","getRelativeCenterPoint","translateToGivenOrigin","normalizePoint","dragHandler","newLeft","newTop","moveX","moveY","ColorNameMap","aliceblue","antiquewhite","aqua","aquamarine","azure","beige","bisque","black","blanchedalmond","blue","blueviolet","brown","burlywood","cadetblue","chartreuse","chocolate","coral","cornflowerblue","cornsilk","crimson","cyan","darkblue","darkcyan","darkgoldenrod","darkgray","darkgrey","darkgreen","darkkhaki","darkmagenta","darkolivegreen","darkorange","darkorchid","darkred","darksalmon","darkseagreen","darkslateblue","darkslategray","darkslategrey","darkturquoise","darkviolet","deeppink","deepskyblue","dimgray","dimgrey","dodgerblue","firebrick","floralwhite","forestgreen","fuchsia","gainsboro","ghostwhite","gold","goldenrod","gray","grey","green","greenyellow","honeydew","hotpink","indianred","indigo","ivory","khaki","lavender","lavenderblush","lawngreen","lemonchiffon","lightblue","lightcoral","lightcyan","lightgoldenrodyellow","lightgray","lightgrey","lightgreen","lightpink","lightsalmon","lightseagreen","lightskyblue","lightslategray","lightslategrey","lightsteelblue","lightyellow","lime","limegreen","linen","magenta","maroon","mediumaquamarine","mediumblue","mediumorchid","mediumpurple","mediumseagreen","mediumslateblue","mediumspringgreen","mediumturquoise","mediumvioletred","midnightblue","mintcream","mistyrose","moccasin","navajowhite","navy","oldlace","olive","olivedrab","orange","orangered","orchid","palegoldenrod","palegreen","paleturquoise","palevioletred","papayawhip","peachpuff","peru","pink","plum","powderblue","purple","rebeccapurple","red","rosybrown","royalblue","saddlebrown","salmon","sandybrown","seagreen","seashell","sienna","silver","skyblue","slateblue","slategray","slategrey","snow","springgreen","steelblue","teal","thistle","tomato","turquoise","violet","wheat","white","whitesmoke","yellow","yellowgreen","hue2rgb","q","rgb2Hsl","g","maxValue","minValue","h","s","l","fromAlphaToFloat","endsWith","hexify","toUpperCase","padStart","greyAverage","avg","Color","color","setSource","_source","_tryParsingColor","sourceFromHex","sourceFromRgb","sourceFromHsl","isUnrecognised","getSource","toRgb","toRgba","toHsl","toHsla","toHex","toHexa","slice","getAlpha","setAlpha","alpha","toGrayscale","toBlackWhite","threshold","average","bOrW","overlayWith","otherColor","otherSource","R","G","B","fromRgb","fromRgba","match","parsedValue","fromHsl","fromHsla","parseAngletoDegrees","fromHex","expandedValue","split","hex","hexCouple","lowercase","numeric","parseUnit","fontSize","unit","exec","dpi","DPI","parsePreserveAspectRatioAttribute","attribute","firstPart","secondPart","trim","alignX","alignY","align","meetOrSlice","colorPropToSVG","colorValue","opacityValue","inlineStyle","opacity","FabricObjectSVGExportMixin","getSvgStyles","skipShadow","fillRule","strokeWidth","strokeDashArray","strokeDashOffset","strokeLineCap","strokeLineJoin","strokeMiterLimit","visibility","getSvgFilter","stroke","shadow","getSvgCommons","getSvgTransform","full","calcTransformMatrix","_toSVG","_reviver","_createBaseSVGMarkup","_createBaseClipPathSVGMarkup","objectMarkup","commonPieces","noStyle","withShadow","styleInfo","shadowInfo","vectorEffect","strokeUniform","absoluteClipPath","absolutePositioned","clipPathMarkup","addPaintOrder","paintFirst","getSvgRegex","arr","RegExp","TEXT_DECORATION_THICKNESS","fontProperties","textDecorationProperties","textLayoutProperties","additionalProps","styleProperties","textDefaultValues","_reNewline","_reSpacesAndTabs","_reSpaceAndTab","_reWords","underline","overline","linethrough","textAlign","lineHeight","textBackgroundColor","pathStartOffset","pathSide","pathAlign","charSpacing","deltaY","direction","CACHE_FONT_SIZE","MIN_TEXT_WIDTH","superscript","baseline","subscript","_fontSizeFraction","offsets","_fontSizeMult","JUSTIFY","JUSTIFY_LEFT","JUSTIFY_RIGHT","JUSTIFY_CENTER","reNum","String","raw","viewportSeparator","svgNS","reFontDeclaration","attributesMap","cx","cy","display","fSize","cPath","svgValidTagNamesRegEx","svgViewBoxElementsRegEx","svgValidParentsRegEx","reViewBoxAttrValue","shadowOffsetRegex","reOffsetsAndBlur","Shadow","parseShadow","shadowStr","blur","replace","fBoxX","fBoxY","affectStroke","nonScaling","capValue","stateProperties","cacheProperties","fabricObjectDefaultValues","minScaleLimit","objectCaching","inverted","centeredRotation","centeredScaling","dirty","normalize","c","asin","elastic","defaultEasing","easeOutBounce","easeInBounce","easeInCirc","easeInCubic","easeInElastic","normA","normS","normP","easeInExpo","easeInOutBounce","easeInOutCirc","easeInOutCubic","easeInOutElastic","normC","easeInOutExpo","easeInOutQuad","easeInOutQuart","easeInOutQuint","easeInOutSine","easeInQuad","easeInQuart","easeInQuint","easeInSine","easeOutCirc","easeOutCubic","easeOutElastic","easeOutExpo","easeOutQuad","easeOutQuart","easeOutQuint","easeOutSine","defaultAbort","AnimationBase","startValue","byValue","duration","delay","easing","onStart","onChange","onComplete","tick","bind","_onStart","_onChange","_onComplete","_abort","endValue","calculate","state","_state","isDone","start","firstTick","timestamp","startTime","Date","register","setTimeout","durationMs","boundDurationMs","durationProgress","valueProgress","unregister","ValueAnimation","timeElapsed","ArrayAnimation","defaultColorEasing","wrapColorCallback","rgba","ColorAnimation","startColor","endColor","animate","isArrayAnimation","animateColor","Intersection","status","append","isPointContained","T","A","infinite","AB","isPointInPolygon","other","hits","inter","intersectSegmentSegment","intersectLineLine","a1","a2","b1","b2","aInfinite","bInfinite","a2xa1x","a2ya1y","b2xb1x","b2yb1y","a1xb1x","a1yb1y","uaT","ubT","uB","ua","ub","segmentsCoincide","intersectSegmentLine","s1","s2","l1","l2","intersectLinePolygon","result","intersectSegmentPolygon","intersectPolygonPolygon","points1","points2","coincidences","intersectPolygonRectangle","r1","r2","topRight","bottomLeft","ObjectGeometry","getX","getXY","getY","getRelativeX","setRelativeX","getRelativeY","setRelativeY","relativePosition","getRelativeXY","group","setRelativeXY","isStrokeAccountedForInDimensions","getCoords","aCoords","calcACoords","coords","intersectsWithObject","intersection","isContainedWithinObject","getBoundingRect","isOnScreen","isPartiallyOnScreen","getScaledWidth","_getTransformedDimensions","getScaledHeight","scaleToWidth","boundingRectFactor","scaleToHeight","getCanvasRetinaScaling","_this$canvas","getTotalAngle","getViewportTransform","_this$canvas2","rotateMatrix","tMatrix","finalMatrix","dim","w","transformMatrixKey","skipGroup","prefix","matrixCache","ownMatrixCache","_getNonTransformedDimensions","_calculateCurrentDimensions","dimOptions","preScalingStrokeValue","postScalingStrokeValue","finalDimensions","fromOriginX","fromOriginY","toOriginX","toOriginY","translateToCenterPoint","translateToOriginPoint","relCenter","getPointByOrigin","pos","_getLeftTopCoords","FabricObject","name","setOptions","_createCacheCanvas","_cacheContext","_updateCacheCanvas","_limitCacheSize","dims","maxCacheSideLimit","minCacheSideLimit","limX","limY","capped","_getCacheCanvasDimensions","objectScale","getTotalObjectScaling","neededX","neededY","ceil","dimensionsChanged","zoomChanged","setTransform","drawingWidth","drawingHeight","translate","needFullTransform","contextTop","getObjectScaling","retina","getObjectOpacity","_constrainScale","isChanged","parent","isNotVisible","_setupCompositeOperation","drawSelectionBackground","_setOpacity","_setShadow","drawCacheOnCanvas","_removeCacheCanvas","drawObject","isCacheDirty","parentClipPaths","hasStroke","hasFill","needsItsOwnCache","ownCaching","isOnACache","willDrawShadow","drawClipPathOnCache","canvasWithClipPath","originalFill","originalStroke","_setClippingProperties","_render","_drawClipPath","createClipPathLayer","prevClipPath","skipCanvas","fillRect","_removeShadow","globalAlpha","_setStrokeStyles","decl","lineWidth","lineCap","lineDashOffset","lineJoin","miterLimit","gradientUnits","_applyPatternForTransformedGradient","strokeStyle","_applyPatternGradientTransform","_setFillStyles","_setLineDash","dashArray","setLineDash","sx","sy","multX","multY","scaling","shadowColor","shadowBlur","browserShadowBlurConstant","shadowOffsetX","shadowOffsetY","_renderPaintInOrder","_renderStroke","_renderFill","_pCtx$createPattern","pCanvas","pCtx","createPattern","_findCenterFromElement","objectForm","cloneAsImage","origParams","originalGroup","originalShadow","canvasProvider","withoutTransform","withoutShadow","boundingRect","shadowOffset","originalCanvas","setOnGroup","animatable","_animate","propIsColor","colorProperties","animationOptions","isDescendantOf","getAncestors","ancestors","findCommonAncestors","fork","otherFork","common","otherAncestors","ancestor","j","hasCommonAncestors","commonAncestors","isInFrontOf","ancestorData","firstCommonAncestor","headOfFork","pop","headOfOtherFork","thisIndex","otherIndex","propertiesToSerialize","customProperties","toFixedBound","val","_removeDefaultValues","baseValues","getPrototypeOf","baseValue","_fromObject","serializedObjectOptions","extraParam","enlivedObjectOptions","wrapWithFireEvent","actionHandler","extraEventInfo","actionPerformed","wrapWithFixedAnchor","centerPoint","constraint","changeWidth","changeObjectWidth","strokePadding","oldWidth","newWidth","renderCircleControl","styleOverride","xSize","sizeX","cornerSize","ySize","sizeY","transparentCorners","cornerStrokeColor","myLeft","myTop","cornerColor","arc","renderSquareControl","xSizeBy2","ySizeBy2","strokeRect","Control","shouldActivate","controlKey","_fabricObject$canvas","getActiveObject","isControlVisible","getActionHandler","getMouseDownHandler","mouseDownHandler","getMouseUpHandler","mouseUpHandler","cursorStyleHandler","cursorStyle","getActionName","actionName","getVisibility","_fabricObject$_contro","_fabricObject$_contro2","_controlsVisibility","setVisibility","positionHandler","currentControl","calcCornerCoords","objectCornerSize","centerX","centerY","isTouch","touchSizeX","touchSizeY","cornerStyle","rotationStyleHandler","lockRotation","rotationWithSnapping","rotateObjectWithSnapping","ex","ey","theta","pivotPoint","lastAngle","curAngle","snapAngle","snapThreshold","rightAngleLocked","leftAngleLocked","hasRotated","scaleIsProportional","uniformIsToggled","uniScaleKey","uniformScaling","scalingIsForbidden","by","scaleProportionally","lockX","lockY","scaleMap","scaleCursorStyleHandler","n","scaleObject","signX","signY","gestureScale","distance","original","oldScaleX","oldScaleY","scalingEqually","scaleObjectFromCorner","scalingX","scaleObjectX","scalingY","scaleObjectY","AXIS_KEYS","counterAxis","skew","lockSkewing","flip","skewMap","skewCursorStyleHandler","skewHandler","axis","originKey","lockSkewingKey","skewKey","flipKey","counterOriginKey","counterFlipKey","counterOriginFactor","skewingSide","finalHandler","skewingBefore","skewingStart","shearingStart","shearing","skewing","atan","changed","dimBefore","dimAfter","compensationFactor","skewObject","skewHandlerX","skewHandlerY","isAltAction","altActionKey","scaleOrSkewActionName","isAlternative","scaleSkewCursorStyleHandler","scalingXOrSkewingY","scalingYOrSkewingX","createObjectDefaultControls","ml","mr","mb","mt","mtr","withConnection","createResizeControls","createTextboxDefaultControls","InteractiveFabricObject","createControls","targetCanvas","noScaleCache","_currentTransform","action","startsWith","getActiveControl","__corner","oCoords","findControl","forTouch","hasControls","cornerEntries","touchCorner","calcOCoords","rMatrix","positionMatrix","startMatrix","transformOptions","forEachControl","_calcCornerCoords","touchCornerSize","fn","selectionBackgroundColor","_activeObject","wh","strokeBorders","_drawBorders","borderColor","borderDashArray","drawControlsConnectingLines","_renderControls","hasBorders","styleOptions","shouldDrawBorders","shouldDrawControls","borderScaleFactor","isMoving","borderOpacityWhenMoving","drawBorders","forActiveSelection","shouldStroke","cornerDashArray","setControlVisible","setControlsVisibility","clearContextTop","restoreManually","onDeselect","_options","onSelect","shouldStartDragging","_e","onDragStart","canDrop","renderDragSourceEffect","renderDropTargetEffect","applyMixins","derivedCtor","constructors","baseCtor","getOwnPropertyNames","prototype","defineProperty","getOwnPropertyDescriptor","create","lockMovementX","lockMovementY","lockScalingX","lockScalingY","lockSkewingX","lockSkewingY","lockScalingFlip","evented","perPixelTargetFind","activeOn","hoverCursor","moveCursor","isTransparent","tolerance","getImageData","StrokeProjectionsBase","strokeProjectionMagnitude","strokeUniformScalar","createSideVector","projectOrthogonally","applySkew","calcOrthogonalProjection","isSkewed","scaleUnitVector","unitVector","zeroVector","StrokeLineJoinProjections","getOrthogonalRotationFactor","vector1","vector2","C","AC","bisector","orthogonalProjection","correctSide","projectBevel","projections","projectMiter","hypotUnitScalar","miterVector","projectRoundNoSkew","startCircle","endCircle","projectRoundWithSkew","circleRadius","newY","furthestY","newX","furthestX","projectRound","isStraightLine","newOrigin","proj0","proj1","comparisonVector","isProj0Start","projectPoints","project","originPoint","projectedPoint","StrokeLineCapProjections","projectButt","projection","projectSquare","strokePointingOut","projectedA","projectStrokeOnPoints","openPath","reduced","findIndexRight","cloneStyles","newObj","keyInner","escapeXml","string","segmenter","graphemeSplit","textstring","Intl","Segmenter","granularity","segments","segment","graphemeSplitImpl","graphemes","chr","getWholeChar","str","code","charCodeAt","isNaN","charAt","next","prev","firstLetterOnly","hasStyleChanged","prevStyle","thisStyle","forTextSpans","textDecorationThickness","stylesToArray","text","textLines","stylesArray","charIndex","chars","end","stylesFromArray","stylesObject","styleIndex","SHARED_ATTRIBUTES","selectorMatches","selector","nodeName","classNames","getAttribute","azAz","matcher","splitClassNames","elementMatchesRule","selectors","parentMatching","firstMatching","parentElement","doesSomeParentMatch","getGlobalStylesForElement","cssRules","rule","normalizeAttr","attr","_attributesMap","regex","transforms","transformList","reTransformList","reTransform","reTransformAll","parseTransformAttribute","attributeValue","cleanupSvgAttribute","test","matchAll","transformMatch","matchedParams","operation","rawArgs","arg1","arg2","arg3","arg4","arg5","arg","normalizeValue","parentAttributes","parsed","ouputValue","transformMatrix","fillIndex","strokeIndex","parseStyleString","oStyle","chunk","parseStyleAttribute","parseStyleObject","colorAttributesMap","parseAttributes","attributes","parentFontSize","ownAttributes","normalizedStyle","normalizedAttr","normalizedValue","font","parseFontDeclaration","mergedAttrs","colorAttr","setStrokeFillOpacity","RECT_PROPS","Rect","_initRxRy","rx","ry","isRounded","bezierCurveTo","fromElement","restOfparsedAttributes","ATTRIBUTE_NAMES","Boolean","LAYOUT_TYPE_INITIALIZATION","LAYOUT_TYPE_ADDED","LAYOUT_TYPE_REMOVED","LAYOUT_TYPE_IMPERATIVE","getObjectBounds","destinationGroup","currentGroup","objectCenter","accountForStroke","strokeUniformVector","scalingStrokeWidth","sizeVector","LayoutStrategy","calcLayoutResult","shouldPerformLayout","calcBoundingBox","prevStrategy","strategy","shouldLayoutClipPath","getInitialSize","overrides","bboxSize","bboxCenter","actualSize","relativeCorrection","FitContentLayout","LAYOUT_MANAGER","LayoutManager","_subscriptions","performLayout","strictContext","bubbles","_prevLayoutStrategy","onBeforeLayout","layoutResult","getLayoutResult","commitLayout","onAfterLayout","attachHandlers","trigger","subscribe","unsubscribe","_context","delete","unsubscribeTargets","targets","subscribeTargets","tricklingContext","layoutManager","prevCenter","nextCenter","correction","_context$x","_context$y","layoutObjects","layoutObject","bubblingContext","NoopLayoutManager","Group","groupInit","_options$layoutManage","__objectSelectionTracker","__objectSelectionMonitor","__objectSelectionDisposer","enterGroup","canEnterGroup","_filterObjectsBeforeEnteringGroup","allowedObjects","_onAfterObjectsChange","removeParentTransform","exitGroup","_shouldSetNestedCoords","subTargetCheck","removeAll","_activeObjects","selected","activeObjects","_watchObject","watch","_enterGroup","activeObject","_exitGroup","ownCache","preserveObjectStacking","triggerLayout","__serializeObjects","method","_includeDefaultValues","originalDefaults","_createSVGBgRect","fillStroke","commons","svgString","bg","abortable","hydratedOptions","layoutClass","strategyClass","interactive","findScaleToFit","destination","findScaleToCover","commaWsp","reArcCommandPoints","repeatedCommands","M","segmentToBezier","theta1","theta2","cosTh","sinTh","cx1","cy1","mT","fromX","fromY","costh1","sinth1","costh2","sinth2","toX","toY","calcVectorAngle","ux","uy","vx","vy","ta","tb","getBoundsOfCurve","begx","begy","cp1x","cp1y","cp2x","cp2y","endx","endy","argsString","cachesBoundsOfCurve","boundsOfCurveCache","tvalues","bounds","b2ac","sqrtb2ac","t1","t2","jlen","iterator","getPointOnCubicBezierIterator","fromArcToBeziers","fx","fy","rot","large","sweep","tx","ty","segsNorm","arcToSegments","rotateX","root","sinTheta","px","py","rx2","ry2","py2","px2","pl","_rx","_ry","mTheta","dtheta","mDelta","th3","makePathSimpler","x1","y1","destinationPath","previous","controlX","controlY","parsedCommand","converted","calcLineLength","x2","y2","pct","c1","c2","CB2","c3","CB3","c4","CB4","QB1","QB2","QB3","getTangentCubicIterator","p1x","p1y","p2x","p2y","p3x","p3y","p4x","p4y","qb1","qb2","qb3","tangentX","tangentY","getPointOnQuadraticBezierIterator","getTangentQuadraticIterator","invT","pathIterator","tempP","tmpLen","perc","findPercentageForDistance","segInfo","nextLen","nextStep","lastPerc","angleFinder","getPathSegmentsInfo","tempInfo","totalLength","info","basicInfo","command","destX","destY","getPointOnPath","infos","segPercent","rePathCmdAll","regExpArcCommandPoints","reMyNum","commandLengths","parsePath","pathString","_pathString$match","chain","matchStr","commandLetter","commandLength","paramArr","lastIndex","out","newCommand","transformedCommand","getSmoothPathFromPoints","p1","p2","multSignX","multSignY","manyPoints","midPoint","joinPath","pathData","getRandomInt","random","removeTransformMatrixForSvgParsing","preserveAspectRatioOptions","_assignTransformMatrixProps","cropX","cropY","offsetLeft","offsetTop","_newCanvas$getContext","getRegularPolygonPath","numVertexes","radius","interiorAngle","rotationAdjustment","rad","commonAttributes","groupSVGElements","mergeClipPaths","_b$group","removeTransformFromObject","finalTransform","transformPath","pathOffset","pathSegment","newSegment","setStyle","elementStyle","setProperty","CanvasDOMManager","containerClass","upperCanvasEl","createUpperCanvas","upper","applyCanvasStyle","container","createContainerElement","replaceChild","className","removeChild","SelectableCanvas","_this$elements$upper","_this$elements$upper2","wrapperEl","_objectsToRender","deselected","_discardActiveObject","_hoveredTarget","_hoveredTargets","_chooseObjectsToRender","contextTopDirty","_groupSelector","isDrawingMode","renderTopLayer","_isCurrentlyDrawing","freeDrawingBrush","selection","_drawSelection","renderTop","setTargetFindTolerance","targetFindTolerance","pixelFindCanvasEl","pixelFindContext","isTargetTransparent","selectionBgc","enhancedTolerance","_isSelectionKeyPressed","sKey","selectionKey","_shouldClearSelection","getActiveObjects","_shouldCenterTransform","modifierKeyPressed","centerTransform","_getOriginFromCorner","controlName","_setupCurrentTransform","alreadySelected","_control$getActionHan","getScenePoint","getActionFromCorner","altKey","centeredKey","lastX","lastY","shiftKey","setCursor","cursor","deltaX","extent","strokeOffset","selectionLineWidth","minX","minY","maxX","maxY","selectionColor","selectionBorderColor","selectionDashArray","findTarget","_targetInfo","skipTargetFind","subTargets","currentSubTargets","aObjects","targetInfo","searchPossibleTargets","currentContainer","currentTarget","fullTargetInfo","activeObjectTargetInfo","getViewportPoint","altSelectionKey","_pointIsInObjectSelectionArea","viewportZoom","angleRadians","cosP","sinP","cosPSinP","cosPMinusSinP","_checkTarget","isEditing","viewportPoint","_searchPossibleTargets","subTarget","_viewportPoint","_getPointerImpl","_scenePoint","fromViewport","boundsWidth","boundsHeight","cssScale","_resetTransformEventData","_setBrushStyles","willReadFrequently","getTopContext","getSelectionContext","getSelectionElement","active","_fireSelectionEvents","oldObjects","somethingChanged","invalidate","added","setActiveObject","currentActives","_setActiveObject","prevActiveObject","endCurrentTransform","discardActiveObject","discarded","_finalizeCurrentTransform","_scaling","originalProperties","_realizeGroupTransformOnObject","originalValues","selectionFullyContained","defaultCursor","freeDrawingCursor","notAllowedCursor","stopContextMenu","fireRightClick","fireMiddleClick","enablePointerEvents","TextEditingManager","cb","hiddenTextarea","focus","__disposer","exitTextEditing","exitEditing","onMouseMove","_this$target","updateSelectionOnMouseMove","addEventOptions","passive","getEventPoints","scenePoint","addListener","removeListener","syntheticEventConfig","mouse","in","targetIn","targetOut","canvasIn","canvasOut","drag","Canvas","eventHandler","addOrRemove","_getEventPrefix","functor","_eventjsFunctor","canvasElement","eventTypePrefix","_onResize","_onMouseDown","_onMouseMove","_onMouseOut","_onMouseEnter","_onMouseWheel","_onContextMenu","_onClick","_onDragStart","_onDragEnd","_onDragOver","_onDragEnter","_onDragLeave","_onDrop","_onTouchStart","removeListeners","_onMouseUp","_onTouchEnd","clearTimeout","_willAddMouseDown","_cacheTransformEventData","_handleEvent","shared","nestedTarget","_isClick","_dragSource","_onDragProgress","_renderDragEffects","dropTarget","_dropTarget","didDrop","dataTransfer","dropEffect","dragSource","_draggedoverTarget","eventType","_fireEnterLeaveEvents","_basicEventHandler","clicks","detail","getPointerId","evt","identifier","pointerId","_isMainEvent","isPrimary","touches","mainTouchId","shouldPreventScrolling","currentActiveObject","__onMouseDown","__onMouseUp","__onMouseMove","_shouldRender","_this$_activeObject","isClick","button","_onMouseUpInDrawingMode","shouldRender","targetWasActive","handleSelection","found","originalControl","originalMouseUpHandler","_setCursorFromEvent","extraData","_onMouseDownInDrawingMode","onMouseDown","_onMouseMoveInDrawingMode","onMouseUp","grouped","handleMultiSelection","groupSelector","_transformObject","_fireOverOutEvents","textEditingManager","fireSyntheticInOutEvents","oldTarget","fireCanvas","draggedoverTarget","targetChanged","outOpt","nextTarget","inOpt","previousTarget","localPointer","_performTransformAction","activeSelection","reverse","_target","isAS","prevActiveObjects","multiSelectAdd","newActiveSelection","point1","point2","collectedObjects","klass","linearDefaultCoords","radialDefaultCoords","ifNaN","valueIfNaN","RE_PERCENT","isPercent","parsePercent","NaN","RE_KEY_VALUE_PAIRS","RE_KEY_VALUE","parseColorStop","opacityMultiplier","keyValuePairs","parseColorStops","opacityAttr","colorStops","colorStopEls","getElementsByTagName","parseType","parseGradientUnits","getValue","parseCoords","valuesToConvert","finalValue","propValue","convertPercentUnitsToValues","parseLinearCoords","parseRadialCoords","Gradient","addColorStop","colorStop","preTransform","sort","_renderPathCommands","needsSwap","minRadius","percentageShift","gradient","createLinearGradient","createRadialGradient","svgOptions","viewBoxWidth","viewBoxHeight","Pattern","isImageSource","isCanvasSource","sourceToString","complete","naturalWidth","naturalHeight","patternSource","patternOffsetX","patternOffsetY","BaseBrush","_saveAndTransform","needsFullRender","_resetShadow","_isOutSideCanvas","Path","_setPath","adjustPosition","setBoundingBox","_calcBoundsFromPath","quadraticCurveTo","pathCmd","sourcePath","_getOffsetTransform","digits","_calcDimensions","subpathStartX","subpathStartY","parsedAttributes","PencilBrush","_points","_hasStraightLine","drawSegment","drawStraightLine","straightLineKey","_prepareForDrawing","_addPoint","limitedToCanvasSize","oldEnd","_finalizeAndAddPath","_reset","convertPointsToSVGPath","createPath","decimatePoints","cDistance","lastPoint","adjustedDistance","newPoints","decimate","isEmptySVGPath","CIRCLE_PROPS","Circle","setRadius","startAngle","endAngle","getRadiusX","getRadiusY","startX","startY","endX","endY","otherParsedAttributes","CircleBrush","drawDot","addPoint","dot","originalRenderOnAddRemove","circles","circle","pointerPoint","SprayBrush","sprayChunks","sprayChunk","addSprayChunk","renderChunck","rects","chunck","rect","optimizeOverlapping","uniqueRects","uniqueRectsArray","getUniqueRects","sprayChunck","density","dotWidthVariance","dotWidth","randomOpacity","PatternBrush","getPatternSrc","patternCanvas","patternCtx","getPattern","pattern","topLeft","coordProps","Line","_setWidthHeight","calcLinePoints","origStrokeStyle","_this$stroke","_x1","_x2","_y1","_y2","xMult","yMult","Triangle","widthBy2","heightBy2","ELLIPSE_PROPS","Ellipse","getRx","getRy","polylineDefaultValues","exactBoundingBox","Polyline","initialized","isOpen","_projectStrokeOnPoints","strokeDiff","bboxNoStroke","layoutProperties","_options$width","_options$height","_options$width2","_options$height2","output","diffX","diffY","pointsSplit","parsedPoints","parsePointsAttribute","Polygon","StyledText","isEmptyStyles","lineIndex","line","p3","styleHas","cleanStyle","letterCount","stylePropertyValue","stylesCount","allStyleObjectPropertiesMatch","graphemeCount","styleObject","_textLines","removeStyle","lineNum","charNum","_extendStyles","get2DCursorLocation","_getLineStyle","_setLineStyle","newStyle","_getStyleDeclaration","_setStyleDeclaration","getSelectionStyles","startIndex","endIndex","getStyleAtPosition","getCompleteStyleDeclaration","setSelectionStyles","_forceClearCache","_lineStyle$charIndex","lineStyle","_styleProperties","_deleteStyleDeclaration","_deleteLineStyle","multipleSpacesRegex","dblQuoteRegex","createSVGInlineRect","svgColor","createSVGRect","measuringContext","FabricText","setPathInfo","initDimensions","segmentsInfo","_splitText","newLines","_splitTextIntoLines","lines","graphemeLines","_unwrappedTextLines","_unwrappedLines","_text","graphemeText","_clearCache","calcTextWidth","cursorWidth","calcTextHeight","enlargeSpaces","diffSpace","currentLineWidth","numberOfSpaces","accumulatedSpace","charBound","spaces","isEndOfWrapping","getLineWidth","__charBounds","kernedWidth","missingNewlineOffset","_lineIndex","selectionStart","skipWrapping","_setTextStyles","_renderTextLinesBackground","_renderTextDecoration","_renderTextStroke","_renderTextFill","charStyle","forMeasuring","textBaseline","_getFontDeclaration","maxWidth","_renderTextLine","_renderChars","leftOffset","_getLeftOffset","lineTopOffset","_getTopOffset","heightOfLine","getHeightOfLine","lineLeftOffset","_getLineLeftOffset","drawStart","currentColor","boxWidth","boxStart","lastColor","getValueOfPropertyAt","charBox","renderLeft","_measureChar","_char","previousChar","prevCharStyle","fontDeclaration","couple","stylesAreEqual","fontMultiplier","coupleWidth","previousWidth","getMeasuringContext","measureText","getHeightOfChar","measureLine","lineInfo","_measureLine","_getWidthOfCharSpacing","prevGrapheme","graphemeInfo","llength","lineBounds","grapheme","_getGraphemeBox","positionInPath","totalPathLength","_setGraphemeOnPath","numOfSpaces","centerPosition","skipLeft","previousBox","__lineHeights","maxHeight","_renderTextCommon","lineHeights","isJustify","shortCut","isLtr","currentDirection","actualStyle","nextStyle","timeToRender","drawingLeft","charsToRender","_renderChar","_applyPatternGradientTransformText","handleFiller","fullDecl","shouldFill","fillOffsets","fillText","strokeOffsets","strokeText","setSuperscript","_setScript","setSubscript","schema","loc","lineDiff","__lineWidths","_charStyle$property","topOffset","offsetAligner","lastDecoration","lastFill","lastTickness","currentDecoration","currentFill","currentTickness","currentSize","currentDy","finalTickness","parsedFontFamily","genericFonts","newLine","newText","needsDims","isAddingPath","textAnchor","textDecoration","restOfOptions","textContent","textHeightScaleFactor","scaledDiff","textHeight","offX","_getSVGLeftTopOffsets","textAndBg","_getSVGTextAndBg","textTop","textLeft","_wrapSVGTextAndBg","textSvg","lineTop","textBgRects","textSpans","getSvgTextDecoration","textTopOffset","textLeftOffset","lineOffset","_setSVGTextLineBg","_setSVGTextLineText","_createTextCharSpan","char","styleDecl","numFractionDigit","styleProps","getSvgSpanStyles","fillStyles","dySpan","angleAttr","wBy2","renderPoint","useWhiteSpace","thickness","decoration","DraggableTextDelegate","dragEnterHandler","dragOverHandler","dragLeaveHandler","dragEndHandler","dropHandler","_dispose","isPointerOverSelection","newSelection","getSelectionStartFromPointer","selectionEnd","__mouseDownInPlace","isActive","__dragStartFired","setCursorByClick","initDelayedCursor","__isDraggingOver","getDragStartSelection","__dragStartSelection","setDragImage","_e$dataTransfer","flipFactor","boundaries","_getCursorBoundaries","diff","bgc","dragImage","border","__dragImageDisposer","appendChild","setData","stringify","effectAllowed","abortCursorAnimation","editable","defaultPrevented","dragStartSelection","targetCanDrop","ev","_e$dataTransfer2","insert","getData","trailing","selectionStartOffset","removeChars","trimEnd","insertChars","enterEditing","_updateTextarea","_e$dataTransfer3","reNonWord","ITextBehavior","initBehavior","_tick","_onTickComplete","_animateCursor","toValue","_currentCursorOpacity","renderCursorOrSelection","_currentTickState","cursorDuration","_this$_currentTickCom","_currentTickCompleteState","restart","cursorDelay","shouldClear","cursorAnimation","restartCursorIfNeeded","selectAll","_fireSelectionChanged","cmdAll","getSelectedText","findWordBoundaryLeft","startFrom","_reSpace","findWordBoundaryRight","findLineBoundaryLeft","findLineBoundaryRight","searchWordBoundary","selectWord","newSelectionStart","newSelectionEnd","selectLine","enterEditingImpl","initHiddenTextarea","_saveEditingProps","_setEditingProps","_textBeforeEdit","activeElement","currentStart","currentEnd","__selectionStartOnMouseDown","editingBorderColor","fromStringToGraphemeSelection","smallerTextStart","graphemeStart","smallerTextEnd","fromGraphemeToStringSelection","cursorOffsetCache","inCompositionMode","updateTextareaPosition","updateFromTextArea","textarea","_calcTextareaPosition","desiredPosition","compositionStart","cursorLocation","charHeight","upperCanvas","upperCanvasWidth","upperCanvasHeight","clientWidth","clientHeight","_savedProps","_restoreEditingProps","exitEditingImpl","isTextChanged","_removeExtraneousStyles","removeStyleFromTo","lineStart","charStart","lineEnd","charEnd","styleObj","shiftLineStyles","numericChar","clonedStyles","numericLine","insertNewlineStyleObject","qty","copiedStyle","newLineStyles","originalLineLength","isEndOfLine","someStyleIsCarryingOver","currentCharStyle","numIndex","styleCarriedOver","insertCharStyleObject","quantity","currentLineStyles","currentLineStylesCloned","numericIndex","insertNewStyleBlock","insertedText","cursorLoc","addedLines","linesLength","setSelectionStartEndWithShift","_selectionDirection","ITextKeyBehavior","autocapitalize","autocorrect","autocomplete","spellcheck","wrap","hiddenTextareaContainer","keydown","keyup","input","copy","cut","paste","compositionstart","compositionupdate","compositionend","onKeyDown","keyMap","keysMapRtl","keysMap","keyCode","ctrlKeysMapDown","ctrlKey","metaKey","stopImmediatePropagation","onKeyUp","_copyDone","ctrlKeysMapUp","onInput","fromPaste","updateAndFire","nextText","charCount","nextCharCount","_selectionStart","_selectionEnd","removedText","removeFrom","removeTo","charDiff","textareaSelection","backDelete","copiedText","disableStyleCopyPaste","copiedTextStyle","onCompositionStart","onCompositionEnd","onCompositionUpdate","compositionEnd","_getWidthBeforeCursor","bound","widthBeforeCursor","getDownCursorOffset","isRight","selectionProp","_getSelectionForOffset","indexOnOtherLine","_getIndexOnLine","getUpCursorOffset","textBeforeCursor","charWidth","foundMatch","widthOfCharsOnLine","indexOnLine","leftEdge","rightEdge","offsetFromLeftEdge","moveCursorDown","_moveCursorUpOrDown","moveCursorUp","moveCursorWithShift","moveCursorWithoutShift","moveCursorLeft","_moveCursorLeftOrRight","_move","newValue","_moveLeft","_moveRight","moveCursorLeftWithoutShift","change","moveCursorLeftWithShift","moveCursorRight","moveCursorRightWithShift","moveCursorRightWithoutShift","notALeftClick","ITextClickBehavior","_mouseDownHandler","doubleClickHandler","tripleClickHandler","draggableTextDelegate","didDrag","mouseOffset","charLength","widthAfter","MOVE_CURSOR_UP","MOVE_CURSOR_DOWN","MOVE_CURSOR_LEFT","MOVE_CURSOR_RIGHT","EXIT_EDITING","applyCanvasTransform","iTextDefaultValues","cursorColor","caching","IText","setSelectionStart","_updateAndFire","setSelectionEnd","findAncestorsWithClipPath","hasAncestorsWithClipping","drawingCanvas","drawingCtx","renderSelection","renderCursor","clippingCanvas","clippingCtx","clipPathAncestors","skipCaching","_getCursorBoundariesOffsets","__getCursorBoundariesOffsets","renderCursorAt","_renderCursor","getCursorRenderingData","_renderSelection","dragSelection","startLine","endLine","startChar","endChar","realLineHeight","boxEnd","drawHeight","extraTop","drawWidth","compositionColor","getCurrentCharFontSize","cp","_getCurrentCharIndex","getCurrentCharColor","cursorPosition","Textbox","dynamicMinWidth","_styleMap","_generateStyleMap","textInfo","realLineCount","realLineCharCount","splitByGrapheme","isWrapping","nextOffset","nextLineIndex","shouldLimit","mapNextLine","p2Number","_wrapText","desiredWidth","getGraphemeDataForRender","wrapped","wordsData","_wrapLine","infix","largestWordWidth","wordsOrGraphemes","wordSplit","word","graphemeArray","_measureWord","charOffset","_wordJoiners","reservedSpace","additionalSpace","infixWidth","lineJustStarted","wordWidth","getMinWidth","minWidth","linesToKeep","propNumber","ClipPathLayout","clipPathCenter","FixedLayout","ActiveSelectionLayoutManager","parents","Set","selectedObjects","ActiveSelection","multiSelectionStacking","findIndex","groups","childrenOverride","Canvas2dFilterBackend","applyFilters","filters","sourceElement","sourceWidth","sourceHeight","desynchronized","pipelineState","imageData","originalEl","originalImageData","filterBackend","applyTo","imageDataPostFilter","putImageData","WebGLFilterBackend","tileSize","Float32Array","setupGLContext","captureGPUInfo","createWebGLCanvas","premultipliedAlpha","depth","stencil","antialias","clearColor","cachedTexture","getCachedTexture","destinationWidth","destinationHeight","sourceTexture","createTexture","targetTexture","originalTexture","passes","webgl","aPosition","programCache","pass","tempFbo","createFramebuffer","bindFramebuffer","FRAMEBUFFER","dWidth","dHeight","resizeCanvasIfNeeded","copyGLTo2D","bindTexture","TEXTURE_2D","deleteTexture","deleteFramebuffer","clearWebGLCaches","textureCache","textureImageSource","NEAREST","RGBA","UNSIGNED_BYTE","CLAMP_TO_EDGE","TEXTURE_MAG_FILTER","TEXTURE_MIN_FILTER","TEXTURE_WRAP_S","TEXTURE_WRAP_T","texture","texParameteri","texImage2D","uniqueId","evictCachesForKey","glCanvas","sourceY","copyGLTo2DPutImageData","numBytes","u8","Uint8Array","imageBuffer","u8Clamped","Uint8ClampedArray","readPixels","imgData","ImageData","gpuInfo","renderer","vendor","ext","UNMASKED_RENDERER_WEBGL","UNMASKED_VENDOR_WEBGL","initFilterBackend","enableGLFiltering","getFilterBackend","setFilterBackend","backend","IMAGE_PROPS","FabricImage","setElement","_element","removeTexture","_originalElement","resizeFilter","applyResizeFilters","elementKey","getCrossOrigin","getOriginalSize","_stroke","filterObj","getSrc","hasCrop","imageMarkup","strokeSvg","imageRendering","imageSmoothing","getSvgSrc","origFill","filtered","srcFromAttribute","setSrc","minimumScale","minimumScaleTrigger","elementToFilter","_filteredEl","_filterScalingX","_filterScalingY","_lastScaleX","_lastScaleY","isNeutralState","imgElement","_needsResize","elementToDraw","elWidth","elHeight","sX","sY","sW","sH","maxDestW","maxDestH","_resetWidthHeight","pAR","preserveAspectRatio","pWidth","pHeight","rWidth","rHeight","f","rf","hydratedProps","fromURL","imageOptions","applyViewboxTransform","viewBoxAttr","widthAttr","heightAttr","missingViewBox","missingDimAttr","translateMatrix","widthDiff","heightDiff","parsedDim","pasedViewBox","createElementNS","firstChild","getTagName","node","tagName","svgInvalidAncestorsRegEx","getMultipleNodes","nodeNames","nodeList","nodeArray","getElementsByTagNameNS","gradientsAttrs","xlinkAttr","recursivelyParseGradientsXlink","_gradient$getAttribut","xLink","referencedGradient","children","referenceClone","cloneNode","tagArray","findTag","ElementsParser","clipPaths","regexUrl","gradientDefs","elList","getGradientDefs","allRules","styleContents","ruleObj","propertyValuePairs","pair","_rule","getCSSRules","createObject","resolveGradient","resolveClipPath","extractPropertyDefinition","storage","gradientDef","usingElement","exactOwner","clipPathElements","objTransformInv","clipPathTag","clipPathOwner","clipPathElement","enlivedClippath","clipRule","gTransform","isValidSvgTag","async","parseSVGDocument","createEmptyResponse","allElements","nodelist","skipAttributes","useElement","useAttributes","useAttrMap","xlink","href","referencedElement","clonedOriginal","originalAttributes","originalAttrMap","currentTrans","el3","setAttributeNS","childNodes","styleRecord","mergedStyles","entry","parseUseDirectives","descendants","hasInvalidAncestor","localClipPaths","elementParser","loadSVGFromString","parseFromString","loadSVGFromURL","fetch","response","ok","svgText","ACTION_NAME","createPolyPositionHandler","pointIndex","polyObject","polyActionHandler","poly","mouseLocalPosition","factoryPolyActionHandler","anchorPoint","anchorPointInParentPlane","createPolyActionHandler","calcPathPointPosition","pathObject","commandIndex","pathPositionHandler","pathActionHandler","movePathPoint","anchorCommand","PathPointControl","controlFill","controlStroke","PathControlPointControl","connectToCommandIndex","connectToPointIndex","connectionDashArray","commandType","createControl","commandIndexPos","pointIndexPos","isControlPoint","controlPointStyle","pointStyle","previousCommandType","indexFromPrevCommand","isWebGLPipelineState","isPutImageFaster","testContext","ArrayBuffer","testPipelineState","performance","now","drawImageTime","highPsourceCode","identityFragmentShader","BaseFilter","getFragmentSource","getVertexSource","createProgram","vertexSource","vertexShader","VERTEX_SHADER","program","getShaderInfoLog","attachShader","linkProgram","getProgramParameter","LINK_STATUS","getProgramInfoLog","uniformLocations","getUniformLocations","uStepW","getUniformLocation","uStepH","attributeLocations","getAttributeLocations","getAttribLocation","locations","sendAttributeData","aPositionData","attributeLocation","buffer","createBuffer","bindBuffer","ARRAY_BUFFER","enableVertexAttribArray","vertexAttribPointer","FLOAT","bufferData","STATIC_DRAW","_setupFrameBuffer","framebufferTexture2D","COLOR_ATTACHMENT0","finish","_swapTextures","temp","applyToWebGL","applyTo2d","getCacheKey","retrieveShader","shader","useProgram","uniform1f","sendUniformData","viewport","drawArrays","TRIANGLE_STRIP","bindAdditionalTexture","textureUnit","activeTexture","TEXTURE0","unbindAdditionalTexture","_gl","_uniformLocations","createHelpLayer","helpLayer","defaultKeys","filterOptions","blendColorFragmentSource","screen","difference","lighten","darken","exclusion","tint","BlendColor","mode","tg","alpha1","oR","oG","oB","uniform4fv","uColor","mask","BlendImage","image","TEXTURE1","calculateMatrix","resources","blendImage","canvas1","blendData","uniform1i","uImage","uniformMatrix3fv","uTransformMatrix","enlivedImage","Blur","aspectRatio","horizontal","blurValue","getBlurValue","samples","bytesInRow","totalA","minIRow","maxIRow","percent","weight","sampledPixel","localAlpha","delta","chooseRightDelta","uniform2fv","uDelta","blurScale","Brightness","brightness","uBrightness","colorMatrixDefaultValues","colorsOnly","ColorMatrix","constants","uniformMatrix4fv","uColorMatrix","uConstants","createColorMatrixFilter","_Class","newClass","Brownie","Vintage","Kodachrome","Technicolor","Polaroid","Sepia","BlackWhite","Composed","subFilters","enlivedFilters","Contrast","contrast","contrastF","uContrast","Convolute_3_1","Convolute_3_0","Convolute_5_1","Convolute_5_0","Convolute_7_1","Convolute_7_0","Convolute_9_1","Convolute_9_0","Convolute","opaque","weights","side","halfSide","sw","sh","createImageData","dst","alphaFac","dstOff","scx","scy","srcOff","wt","uniform1fv","uMatrix","GAMMA","Gamma","gamma","rInv","gInv","bInv","rgbValues","rgb","uniform3fv","uGamma","lightness","luminosity","Grayscale","uMode","hueRotationDefaultValues","rotation","HueRotation","cosine","sine","aThird","aThirdSqtSin","OneMinusCos","Invert","invert","uInvert","uAlpha","Noise","noise","rand","uNoise","uSeed","Pixelate","blocksize","_i","_j","uBlocksize","RemoveColor","lowC","highC","uLow","uHigh","useAlpha","Resize","uTaps","taps","getFilterWindow","tempScale","lanczosLobes","filterWindow","generateShader","getTaps","lobeFunction","lanczosCreate","applyToForWebgl","dW","dH","lobes","xx","rcpScaleX","rcpScaleY","oW","oH","newData","resizeType","sliceByTwo","hermiteFastResize","bilinearFiltering","lanczosResize","mult","doneW","doneH","stepW","stepH","dX","dY","tmpCanvas","srcData","destImg","destData","lanczos","ratioX","ratioY","rcpRatioX","rcpRatioY","range2X","range2Y","cacheLanc","icenter","process","u","fX","fY","xDiff","yDiff","chnl","origPix","w4","pixels","destImage","destPixels","ratioW","ratioH","ratioWHalf","ratioHHalf","img2","data2","weightsAlpha","gxR","gxG","gxB","gxA","yy","w0","Saturation","adjust","saturation","uSaturation","Vibrance","vibrance","amt","uVibrance"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"index.min.mjs","sources":["../src/config.ts","../src/util/internals/console.ts","../src/filters/GLProbes/GLProbe.ts","../src/filters/GLProbes/WebGLProbe.ts","../src/env/browser.ts","../src/env/index.ts","../src/cache.ts","../src/constants.ts","../src/ClassRegistry.ts","../src/util/animation/AnimationRegistry.ts","../src/Observable.ts","../src/util/internals/removeFromArray.ts","../src/util/misc/cos.ts","../src/util/misc/sin.ts","../src/Point.ts","../src/Collection.ts","../src/CommonMethods.ts","../src/util/animation/AnimationFrameProvider.ts","../src/util/internals/uid.ts","../src/util/misc/dom.ts","../src/util/misc/radiansDegreesConversion.ts","../src/util/misc/matrix.ts","../src/util/misc/objectEnlive.ts","../src/util/misc/pick.ts","../src/util/misc/toFixed.ts","../src/util/misc/svgExport.ts","../src/util/typeAssertions.ts","../src/util/dom_misc.ts","../src/canvas/DOMManagers/util.ts","../src/canvas/DOMManagers/StaticCanvasDOMManager.ts","../src/canvas/StaticCanvasOptions.ts","../src/canvas/StaticCanvas.ts","../src/util/dom_event.ts","../src/util/misc/boundingBoxFromPoints.ts","../src/util/misc/objectTransforms.ts","../src/util/misc/planeChange.ts","../src/controls/fireEvent.ts","../src/util/misc/resolveOrigin.ts","../src/util/misc/vectors.ts","../src/controls/util.ts","../src/controls/drag.ts","../src/color/color_map.ts","../src/color/util.ts","../src/color/Color.ts","../src/color/constants.ts","../src/util/misc/svgParsing.ts","../src/shapes/Object/FabricObjectSVGExportMixin.ts","../src/parser/getSvgRegex.ts","../src/shapes/Text/constants.ts","../src/parser/constants.ts","../src/Shadow.ts","../src/util/misc/capValue.ts","../src/shapes/Object/defaultValues.ts","../src/util/animation/easing.ts","../src/util/animation/AnimationBase.ts","../src/util/animation/ValueAnimation.ts","../src/util/animation/ArrayAnimation.ts","../src/util/animation/ColorAnimation.ts","../src/util/animation/animate.ts","../src/Intersection.ts","../src/shapes/Object/ObjectGeometry.ts","../src/shapes/Object/Object.ts","../src/controls/wrapWithFireEvent.ts","../src/controls/wrapWithFixedAnchor.ts","../src/controls/changeWidth.ts","../src/controls/controlRendering.ts","../src/controls/Control.ts","../src/controls/rotate.ts","../src/controls/scale.ts","../src/controls/skew.ts","../src/controls/scaleSkew.ts","../src/controls/commonControls.ts","../src/shapes/Object/InteractiveObject.ts","../src/util/applyMixins.ts","../src/shapes/Object/FabricObject.ts","../src/util/misc/isTransparent.ts","../src/util/misc/projectStroke/StrokeProjectionsBase.ts","../src/util/misc/projectStroke/StrokeLineJoinProjections.ts","../src/util/misc/projectStroke/StrokeLineCapProjections.ts","../src/util/misc/projectStroke/index.ts","../src/util/internals/findRight.ts","../src/util/internals/cloneStyles.ts","../src/util/lang_string.ts","../src/util/misc/textStyles.ts","../src/parser/attributes.ts","../src/parser/selectorMatches.ts","../src/parser/elementMatchesRule.ts","../src/parser/doesSomeParentMatch.ts","../src/parser/getGlobalStylesForElement.ts","../src/parser/normalizeAttr.ts","../src/util/internals/cleanupSvgAttribute.ts","../src/parser/parseTransformAttribute.ts","../src/parser/normalizeValue.ts","../src/parser/parseStyleString.ts","../src/parser/parseStyleAttribute.ts","../src/parser/parseStyleObject.ts","../src/parser/setStrokeFillOpacity.ts","../src/parser/parseAttributes.ts","../src/parser/parseFontDeclaration.ts","../src/shapes/Rect.ts","../src/LayoutManager/constants.ts","../src/LayoutManager/LayoutStrategies/utils.ts","../src/LayoutManager/LayoutStrategies/LayoutStrategy.ts","../src/LayoutManager/LayoutStrategies/FitContentLayout.ts","../src/LayoutManager/LayoutManager.ts","../src/shapes/Group.ts","../src/util/misc/groupSVGElements.ts","../src/util/misc/findScaleTo.ts","../src/util/path/regex.ts","../src/util/path/index.ts","../src/util/internals/getRandomInt.ts","../src/util/transform_matrix_removal.ts","../src/util/misc/mergeClipPaths.ts","../src/util/internals/dom_style.ts","../src/canvas/DOMManagers/CanvasDOMManager.ts","../src/canvas/SelectableCanvas.ts","../src/canvas/CanvasOptions.ts","../src/canvas/TextEditingManager.ts","../src/canvas/Canvas.ts","../src/gradient/constants.ts","../src/util/internals/ifNaN.ts","../src/parser/percent.ts","../src/gradient/parser/parseColorStops.ts","../src/gradient/parser/misc.ts","../src/gradient/parser/parseCoords.ts","../src/gradient/Gradient.ts","../src/Pattern/Pattern.ts","../src/brushes/BaseBrush.ts","../src/shapes/Path.ts","../src/brushes/PencilBrush.ts","../src/shapes/Circle.ts","../src/brushes/CircleBrush.ts","../src/brushes/SprayBrush.ts","../src/brushes/PatternBrush.ts","../src/shapes/Line.ts","../src/shapes/Triangle.ts","../src/shapes/Ellipse.ts","../src/shapes/Polyline.ts","../src/parser/parsePointsAttribute.ts","../src/shapes/Polygon.ts","../src/shapes/Text/StyledText.ts","../src/shapes/Text/TextSVGExportMixin.ts","../src/shapes/Text/Text.ts","../src/shapes/IText/DraggableTextDelegate.ts","../src/shapes/IText/ITextBehavior.ts","../src/shapes/IText/ITextKeyBehavior.ts","../src/shapes/IText/ITextClickBehavior.ts","../src/shapes/IText/constants.ts","../src/util/internals/applyCanvasTransform.ts","../src/shapes/IText/IText.ts","../src/shapes/Textbox.ts","../src/LayoutManager/LayoutStrategies/ClipPathLayout.ts","../src/LayoutManager/LayoutStrategies/FixedLayout.ts","../src/LayoutManager/ActiveSelectionLayoutManager.ts","../src/shapes/ActiveSelection.ts","../src/filters/Canvas2dFilterBackend.ts","../src/filters/WebGLFilterBackend.ts","../src/filters/FilterBackend.ts","../src/shapes/Image.ts","../src/parser/applyViewboxTransform.ts","../src/parser/getTagName.ts","../src/parser/hasInvalidAncestor.ts","../src/parser/getMultipleNodes.ts","../src/parser/recursivelyParseGradientsXlink.ts","../src/parser/getGradientDefs.ts","../src/parser/elements_parser.ts","../src/parser/getCSSRules.ts","../src/parser/parseSVGDocument.ts","../src/parser/parseUseDirectives.ts","../src/parser/loadSVGFromString.ts","../src/parser/loadSVGFromURL.ts","../src/controls/polyControl.ts","../src/controls/pathControl.ts","../src/filters/utils.ts","../src/filters/shaders/baseFilter.ts","../src/filters/BaseFilter.ts","../src/filters/shaders/blendColor.ts","../src/filters/BlendColor.ts","../src/filters/shaders/blendImage.ts","../src/filters/BlendImage.ts","../src/filters/Blur.ts","../src/filters/shaders/blur.ts","../src/filters/Brightness.ts","../src/filters/shaders/brightness.ts","../src/filters/shaders/colorMatrix.ts","../src/filters/ColorMatrix.ts","../src/filters/ColorMatrixFilters.ts","../src/filters/Composed.ts","../src/filters/Contrast.ts","../src/filters/shaders/constrast.ts","../src/filters/shaders/convolute.ts","../src/filters/Convolute.ts","../src/filters/shaders/gamma.ts","../src/filters/Gamma.ts","../src/filters/shaders/grayscale.ts","../src/filters/Grayscale.ts","../src/filters/HueRotation.ts","../src/filters/Invert.ts","../src/filters/shaders/invert.ts","../src/filters/Noise.ts","../src/filters/shaders/noise.ts","../src/filters/Pixelate.ts","../src/filters/shaders/pixelate.ts","../src/filters/RemoveColor.ts","../src/filters/shaders/removeColor.ts","../src/filters/Resize.ts","../src/filters/Saturation.ts","../src/filters/shaders/saturation.ts","../src/filters/Vibrance.ts","../src/filters/shaders/vibrance.ts"],"sourcesContent":["export type TConfiguration = Partial;\n\nclass BaseConfiguration {\n /**\n * Browser-specific constant to adjust CanvasRenderingContext2D.shadowBlur value,\n * which is unitless and not rendered equally across browsers.\n *\n * Values that work quite well (as of October 2017) are:\n * - Chrome: 1.5\n * - Edge: 1.75\n * - Firefox: 0.9\n * - Safari: 0.95\n *\n * @since 2.0.0\n * @type Number\n * @default 1\n */\n browserShadowBlurConstant = 1;\n\n /**\n * Pixel per Inch as a default value set to 96. Can be changed for more realistic conversion.\n */\n DPI = 96;\n\n /**\n * Device Pixel Ratio\n * @see https://developer.apple.com/library/safari/documentation/AudioVideo/Conceptual/HTML-canvas-guide/SettingUptheCanvas/SettingUptheCanvas.html\n */\n devicePixelRatio =\n typeof window !== 'undefined' ? window.devicePixelRatio : 1; // eslint-disable-line no-restricted-globals\n\n /**\n * Pixel limit for cache canvases. 1Mpx , 4Mpx should be fine.\n * @since 1.7.14\n * @type Number\n */\n perfLimitSizeTotal = 2097152;\n\n /**\n * Pixel limit for cache canvases width or height. IE fixes the maximum at 5000\n * @since 1.7.14\n * @type Number\n */\n maxCacheSideLimit = 4096;\n\n /**\n * Lowest pixel limit for cache canvases, set at 256PX\n * @since 1.7.14\n * @type Number\n */\n minCacheSideLimit = 256;\n\n /**\n * When 'true', style information is not retained when copy/pasting text, making\n * pasted text use destination style.\n * Defaults to 'false'.\n * @type Boolean\n * @deprecated\n */\n disableStyleCopyPaste = false;\n\n /**\n * Enable webgl for filtering picture is available\n * A filtering backend will be initialized, this will both take memory and\n * time since a default 2048x2048 canvas will be created for the gl context\n * @since 2.0.0\n * @type Boolean\n */\n enableGLFiltering = true;\n\n /**\n * if webgl is enabled and available, textureSize will determine the size\n * of the canvas backend\n *\n * In order to support old hardware set to `2048` to avoid OOM\n *\n * @since 2.0.0\n * @type Number\n */\n textureSize = 4096;\n\n /**\n * Skip performance testing of setupGLContext and force the use of putImageData that seems to be the one that works best on\n * Chrome + old hardware. if your users are experiencing empty images after filtering you may try to force this to true\n * this has to be set before instantiating the filtering backend ( before filtering the first image )\n * @type Boolean\n * @default false\n */\n forceGLPutImageData = false;\n\n /**\n * If disabled boundsOfCurveCache is not used. For apps that make heavy usage of pencil drawing probably disabling it is better\n * With the standard behaviour of fabric to translate all curves in absolute commands and by not subtracting the starting point from\n * the curve is very hard to hit any cache.\n * Enable only if you know why it could be useful.\n * Candidate for removal/simplification\n * @default false\n */\n cachesBoundsOfCurve = false;\n\n /**\n * Map of font files\n * Map of font files\n */\n fontPaths: Record = {};\n\n /**\n * Defines the number of fraction digits to use when serializing object values.\n * Used in exporting methods (`toObject`, `toJSON`, `toSVG`)\n * You can use it to increase/decrease precision of such values like left, top, scaleX, scaleY, etc.\n */\n NUM_FRACTION_DIGITS = 4;\n}\n\nexport class Configuration extends BaseConfiguration {\n constructor(config?: TConfiguration) {\n super();\n this.configure(config);\n }\n\n configure(config: TConfiguration = {}) {\n Object.assign(this, config);\n }\n\n /**\n * Map of font files\n */\n addFonts(\n paths: Record = {},\n ) {\n this.fontPaths = {\n ...this.fontPaths,\n ...paths,\n };\n }\n\n removeFonts(fontFamilys: string[] = []) {\n fontFamilys.forEach((fontFamily) => {\n delete this.fontPaths[fontFamily];\n });\n }\n\n clearFonts() {\n this.fontPaths = {};\n }\n\n restoreDefaults(keys?: (keyof T)[]) {\n const defaults = new BaseConfiguration() as T;\n const config =\n keys?.reduce((acc, key) => {\n acc[key] = defaults[key];\n return acc;\n }, {} as T) || defaults;\n this.configure(config);\n }\n}\n\nexport const config = new Configuration();\n","export const log = (\n severity: 'log' | 'warn' | 'error',\n ...optionalParams: any[]\n) =>\n // eslint-disable-next-line no-restricted-syntax\n console[severity]('fabric', ...optionalParams);\n\nexport class FabricError extends Error {\n constructor(message?: string, options?: ErrorOptions) {\n super(`fabric: ${message}`, options);\n }\n}\n\nexport class SignalAbortedError extends FabricError {\n constructor(context: string) {\n super(`${context} 'options.signal' is in 'aborted' state`);\n }\n}\n","export type GLPrecision = 'lowp' | 'mediump' | 'highp';\n\nexport abstract class GLProbe {\n declare GLPrecision: GLPrecision | undefined;\n abstract queryWebGL(canvas: HTMLCanvasElement): void;\n abstract isSupported(textureSize: number): boolean;\n}\n","import { log } from '../../util/internals/console';\nimport { GLProbe } from './GLProbe';\nimport type { GLPrecision } from './GLProbe';\n\n/**\n * Lazy initialize WebGL constants\n */\nexport class WebGLProbe extends GLProbe {\n declare maxTextureSize?: number;\n\n /**\n * Tests if webgl supports certain precision\n * @param {WebGL} Canvas WebGL context to test on\n * @param {GLPrecision} Precision to test can be any of following\n * @returns {Boolean} Whether the user's browser WebGL supports given precision.\n */\n private testPrecision(\n gl: WebGLRenderingContext,\n precision: GLPrecision,\n ): boolean {\n const fragmentSource = `precision ${precision} float;\\nvoid main(){}`;\n const fragmentShader = gl.createShader(gl.FRAGMENT_SHADER);\n if (!fragmentShader) {\n return false;\n }\n gl.shaderSource(fragmentShader, fragmentSource);\n gl.compileShader(fragmentShader);\n return !!gl.getShaderParameter(fragmentShader, gl.COMPILE_STATUS);\n }\n\n /**\n * query browser for WebGL\n */\n queryWebGL(canvas: HTMLCanvasElement) {\n const gl = canvas.getContext('webgl');\n if (gl) {\n this.maxTextureSize = gl.getParameter(gl.MAX_TEXTURE_SIZE);\n this.GLPrecision = (['highp', 'mediump', 'lowp'] as const).find(\n (precision) => this.testPrecision(gl, precision),\n );\n gl.getExtension('WEBGL_lose_context')!.loseContext();\n log('log', `WebGL: max texture size ${this.maxTextureSize}`);\n }\n }\n\n isSupported(textureSize: number) {\n return !!this.maxTextureSize && this.maxTextureSize >= textureSize;\n }\n}\n","/* eslint-disable no-restricted-globals */\nimport { WebGLProbe } from '../filters/GLProbes/WebGLProbe';\nimport type { TCopyPasteData, TFabricEnv } from './types';\n\nconst copyPasteData: TCopyPasteData = {};\n\nexport const getEnv = (): TFabricEnv => {\n return {\n document,\n window,\n isTouchSupported:\n 'ontouchstart' in window ||\n 'ontouchstart' in document ||\n (window && window.navigator && window.navigator.maxTouchPoints > 0),\n WebGLProbe: new WebGLProbe(),\n dispose() {\n // noop\n },\n copyPasteData,\n };\n};\n","/**\n * This file is consumed by fabric.\n * The `./node` and `./browser` files define the env variable that is used by this module.\n * The `./browser` module is defined to be the default env and doesn't set the env at all.\n * This is done in order to support isomorphic usage for browser and node applications\n * since window and document aren't defined at time of import in SSR, we can't set env so we avoid it by deferring to the default env.\n */\n\nimport { config } from '../config';\nimport { getEnv as getBrowserEnv } from './browser';\nimport type { TFabricEnv } from './types';\nimport type { DOMWindow } from 'jsdom';\n\nlet env: TFabricEnv;\n\n/**\n * Sets the environment variables used by fabric.\\\n * This is exposed for special cases, such as configuring a test environment, and should be used with care.\n *\n * **CAUTION**: Must be called before using the package.\n *\n * @example\n * Passing `window` and `document` objects to fabric (in case they are mocked or something)\n * import { getEnv, setEnv } from 'fabric';\n * // we want fabric to use the `window` and `document` objects exposed by the environment we are running in.\n * setEnv({ ...getEnv(), window, document });\n * // done with setup, using fabric is now safe\n */\nexport const setEnv = (value: TFabricEnv) => {\n env = value;\n};\n\n/**\n * In order to support SSR we **MUST** access the browser env only after the window has loaded\n */\nexport const getEnv = () => env || (env = getBrowserEnv());\n\nexport const getFabricDocument = (): Document => getEnv().document;\n\nexport const getFabricWindow = (): (Window & typeof globalThis) | DOMWindow =>\n getEnv().window;\n\n/**\n * @returns the config value if defined, fallbacks to the environment value\n */\nexport const getDevicePixelRatio = () =>\n Math.max(config.devicePixelRatio ?? getFabricWindow().devicePixelRatio, 1);\n","import { config } from './config';\nimport type { TRectBounds } from './typedefs';\n\nexport class Cache {\n /**\n * Cache of widths of chars in text rendering.\n */\n charWidthsCache: Record<\n /** fontFamily */ string,\n Record<\n /** fontStyleCacheKey */ string,\n Record\n >\n > = {};\n\n /**\n * @return {Object} reference to cache\n */\n getFontCache({\n fontFamily,\n fontStyle,\n fontWeight,\n }: {\n fontFamily: string;\n fontStyle: string;\n fontWeight: string | number;\n }) {\n fontFamily = fontFamily.toLowerCase();\n if (!this.charWidthsCache[fontFamily]) {\n this.charWidthsCache[fontFamily] = {};\n }\n const fontCache = this.charWidthsCache[fontFamily];\n const cacheKey = `${fontStyle.toLowerCase()}_${(\n fontWeight + ''\n ).toLowerCase()}`;\n if (!fontCache[cacheKey]) {\n fontCache[cacheKey] = {};\n }\n return fontCache[cacheKey];\n }\n\n /**\n * Clear char widths cache for the given font family or all the cache if no\n * fontFamily is specified.\n * Use it if you know you are loading fonts in a lazy way and you are not waiting\n * for custom fonts to load properly when adding text objects to the canvas.\n * If a text object is added when its own font is not loaded yet, you will get wrong\n * measurement and so wrong bounding boxes.\n * After the font cache is cleared, either change the textObject text content or call\n * initDimensions() to trigger a recalculation\n * @param {String} [fontFamily] font family to clear\n */\n clearFontCache(fontFamily?: string) {\n fontFamily = (fontFamily || '').toLowerCase();\n if (!fontFamily) {\n this.charWidthsCache = {};\n } else if (this.charWidthsCache[fontFamily]) {\n delete this.charWidthsCache[fontFamily];\n }\n }\n\n /**\n * Given current aspect ratio, determines the max width and height that can\n * respect the total allowed area for the cache.\n * @param {number} ar aspect ratio\n * @return {number[]} Limited dimensions X and Y\n */\n limitDimsByArea(ar: number) {\n const { perfLimitSizeTotal } = config;\n const roughWidth = Math.sqrt(perfLimitSizeTotal * ar);\n // we are not returning a point on purpose, to avoid circular dependencies\n // this is an internal utility\n return [\n Math.floor(roughWidth),\n Math.floor(perfLimitSizeTotal / roughWidth),\n ];\n }\n\n /**\n * This object keeps the results of the boundsOfCurve calculation mapped by the joined arguments necessary to calculate it.\n * It does speed up calculation, if you parse and add always the same paths, but in case of heavy usage of freedrawing\n * you do not get any speed benefit and you get a big object in memory.\n * The object was a private variable before, while now is appended to the lib so that you have access to it and you\n * can eventually clear it.\n * It was an internal variable, is accessible since version 2.3.4\n */\n boundsOfCurveCache: Record = {};\n}\n\nexport const cache = new Cache();\n","import type { TMat2D } from './typedefs';\n// use this syntax so babel plugin see this import here\nimport { version } from '../package.json';\n\nexport const VERSION = version;\n// eslint-disable-next-line @typescript-eslint/no-empty-function\nexport function noop() {}\n\nexport const halfPI = Math.PI / 2;\nexport const quarterPI = Math.PI / 4;\nexport const twoMathPi = Math.PI * 2;\nexport const PiBy180 = Math.PI / 180;\n\nexport const iMatrix = Object.freeze([1, 0, 0, 1, 0, 0]) as TMat2D;\nexport const DEFAULT_SVG_FONT_SIZE = 16;\nexport const ALIASING_LIMIT = 2;\n\n/* \"magic number\" for bezier approximations of arcs (http://itc.ktu.lt/itc354/Riskus354.pdf) */\nexport const kRect = 1 - 0.5522847498;\n\nexport const CENTER = 'center';\nexport const LEFT = 'left';\nexport const TOP = 'top';\nexport const BOTTOM = 'bottom';\nexport const RIGHT = 'right';\nexport const NONE = 'none';\n\nexport const reNewline = /\\r?\\n/;\n\nexport const MOVING = 'moving';\nexport const SCALING = 'scaling';\nexport const ROTATING = 'rotating';\nexport const ROTATE = 'rotate';\nexport const SKEWING = 'skewing';\nexport const RESIZING = 'resizing';\nexport const MODIFY_POLY = 'modifyPoly';\nexport const MODIFY_PATH = 'modifyPath';\nexport const CHANGED = 'changed';\nexport const SCALE = 'scale';\nexport const SCALE_X = 'scaleX';\nexport const SCALE_Y = 'scaleY';\nexport const SKEW_X = 'skewX';\nexport const SKEW_Y = 'skewY';\nexport const FILL = 'fill';\nexport const STROKE = 'stroke';\nexport const MODIFIED = 'modified';\n","import { FabricError } from './util/internals/console';\n\n/*\n * This Map connects the objects type value with their\n * class implementation. It used from any object to understand which are\n * the classes to enlive when requesting a object.type = 'path' for example.\n * Objects uses it for clipPath, Canvas uses it for everything.\n * This is necessary for generic code to run and enlive instances from serialized representation.\n * You can customize which classes get enlived from SVG parsing using this classRegistry.\n * The Registry start empty and gets filled in depending which files you import.\n * If you want to be able to parse arbitrary SVGs or JSON representation of canvases, coming from\n * different sources you will need to import all fabric because you may need all classes.\n */\n\nexport const JSON = 'json';\nexport const SVG = 'svg';\n\nexport class ClassRegistry {\n declare [JSON]: Map;\n declare [SVG]: Map;\n\n constructor() {\n this[JSON] = new Map();\n this[SVG] = new Map();\n }\n\n has(classType: string): boolean {\n return this[JSON].has(classType);\n }\n\n getClass(classType: string): T {\n const constructor = this[JSON].get(classType);\n if (!constructor) {\n throw new FabricError(`No class registered for ${classType}`);\n }\n return constructor;\n }\n\n setClass(classConstructor: any, classType?: string) {\n if (classType) {\n this[JSON].set(classType, classConstructor);\n } else {\n this[JSON].set(classConstructor.type, classConstructor);\n // legacy\n // @TODO: needs to be removed in fabric 7 or 8\n this[JSON].set(classConstructor.type.toLowerCase(), classConstructor);\n }\n }\n\n getSVGClass(SVGTagName: string): any {\n return this[SVG].get(SVGTagName);\n }\n\n setSVGClass(classConstructor: any, SVGTagName?: string) {\n this[SVG].set(\n SVGTagName ?? classConstructor.type.toLowerCase(),\n classConstructor,\n );\n }\n}\n\nexport const classRegistry = new ClassRegistry();\n","import type { StaticCanvas } from '../../canvas/StaticCanvas';\nimport type { FabricObject } from '../../shapes/Object/FabricObject';\nimport type { AnimationBase } from './AnimationBase';\n\n/**\n * Array holding all running animations\n */\nclass AnimationRegistry extends Array {\n /**\n * Remove a single animation using an animation context\n * @param {AnimationBase} context\n */\n remove(context: AnimationBase) {\n const index = this.indexOf(context);\n index > -1 && this.splice(index, 1);\n }\n\n /**\n * Cancel all running animations on the next frame\n */\n cancelAll() {\n const animations = this.splice(0);\n animations.forEach((animation) => animation.abort());\n return animations;\n }\n\n /**\n * Cancel all running animations attached to a canvas on the next frame\n * @param {StaticCanvas} canvas\n */\n cancelByCanvas(canvas: StaticCanvas) {\n if (!canvas) {\n return [];\n }\n const animations = this.filter(\n (animation) =>\n animation.target === canvas ||\n (typeof animation.target === 'object' &&\n (animation.target as FabricObject)?.canvas === canvas),\n );\n animations.forEach((animation) => animation.abort());\n return animations;\n }\n\n /**\n * Cancel all running animations for target on the next frame\n * @param target\n */\n cancelByTarget(target: AnimationBase['target']) {\n if (!target) {\n return [];\n }\n const animations = this.filter((animation) => animation.target === target);\n animations.forEach((animation) => animation.abort());\n return animations;\n }\n}\n\nexport const runningAnimations = new AnimationRegistry();\n","export type TEventCallback = (options: T) => any;\n\ntype EventRegistryObject = {\n [K in keyof E]?: TEventCallback;\n};\n\n/**\n * @see {@link http://fabric5.fabricjs.com/fabric-intro-part-2#events}\n * @see {@link http://fabric5.fabricjs.com/events|Events demo}\n */\nexport class Observable {\n private __eventListeners: Record =\n {} as Record;\n\n /**\n * Observes specified event\n * @alias on\n * @param {string} eventName Event name (eg. 'after:render')\n * @param {EventRegistryObject} handlers key/value pairs (eg. {'after:render': handler, 'selection:cleared': handler})\n * @param {Function} handler Function that receives a notification when an event of the specified type occurs\n * @return {Function} disposer\n */\n on(\n eventName: K,\n handler: TEventCallback,\n ): VoidFunction;\n on(handlers: EventRegistryObject): VoidFunction;\n on(\n arg0: K | EventRegistryObject,\n handler?: TEventCallback,\n ): VoidFunction {\n if (!this.__eventListeners) {\n this.__eventListeners = {} as Record;\n }\n if (typeof arg0 === 'object') {\n // one object with key/value pairs was passed\n Object.entries(arg0).forEach(([eventName, handler]) => {\n this.on(eventName as K, handler as TEventCallback);\n });\n return () => this.off(arg0);\n } else if (handler) {\n const eventName = arg0;\n if (!this.__eventListeners[eventName]) {\n this.__eventListeners[eventName] = [];\n }\n this.__eventListeners[eventName].push(handler);\n return () => this.off(eventName, handler);\n } else {\n // noop\n return () => false;\n }\n }\n\n /**\n * Observes specified event **once**\n * @alias once\n * @param {string} eventName Event name (eg. 'after:render')\n * @param {EventRegistryObject} handlers key/value pairs (eg. {'after:render': handler, 'selection:cleared': handler})\n * @param {Function} handler Function that receives a notification when an event of the specified type occurs\n * @return {Function} disposer\n */\n once(\n eventName: K,\n handler: TEventCallback,\n ): VoidFunction;\n once(handlers: EventRegistryObject): VoidFunction;\n once(\n arg0: K | EventRegistryObject,\n handler?: TEventCallback,\n ): VoidFunction {\n if (typeof arg0 === 'object') {\n // one object with key/value pairs was passed\n const disposers: VoidFunction[] = [];\n Object.entries(arg0).forEach(([eventName, handler]) => {\n disposers.push(this.once(eventName as K, handler as TEventCallback));\n });\n return () => disposers.forEach((d) => d());\n } else if (handler) {\n const disposer = this.on(\n arg0,\n function onceHandler(this: Observable, ...args) {\n handler.call(this, ...args);\n disposer();\n },\n );\n return disposer;\n } else {\n // noop\n return () => false;\n }\n }\n\n /**\n * @private\n * @param {string} eventName\n * @param {Function} [handler]\n */\n private _removeEventListener(\n eventName: K,\n handler?: TEventCallback,\n ) {\n if (!this.__eventListeners[eventName]) {\n return;\n }\n\n if (handler) {\n const eventListener = this.__eventListeners[eventName];\n const index = eventListener.indexOf(handler);\n index > -1 && eventListener.splice(index, 1);\n } else {\n this.__eventListeners[eventName] = [];\n }\n }\n\n /**\n * Unsubscribe all event listeners for eventname.\n * Do not use this pattern. You could kill internal fabricJS events.\n * We know we should have protected events for internal flows, but we don't have yet\n * @deprecated\n * @param {string} eventName event name (eg. 'after:render')\n */\n off(eventName: K): void;\n /**\n * unsubscribe an event listener\n * @param {string} eventName event name (eg. 'after:render')\n * @param {TEventCallback} handler event listener to unsubscribe\n */\n off(eventName: K, handler: TEventCallback): void;\n /**\n * unsubscribe event listeners\n * @param handlers handlers key/value pairs (eg. {'after:render': handler, 'selection:cleared': handler})\n */\n off(handlers: EventRegistryObject): void;\n /**\n * unsubscribe all event listeners\n */\n off(): void;\n off(\n arg0?: K | EventRegistryObject,\n handler?: TEventCallback,\n ) {\n if (!this.__eventListeners) {\n return;\n }\n\n // remove all key/value pairs (event name -> event handler)\n if (typeof arg0 === 'undefined') {\n for (const eventName in this.__eventListeners) {\n this._removeEventListener(eventName);\n }\n }\n // one object with key/value pairs was passed\n else if (typeof arg0 === 'object') {\n Object.entries(arg0).forEach(([eventName, handler]) => {\n this._removeEventListener(eventName as K, handler as TEventCallback);\n });\n } else {\n this._removeEventListener(arg0, handler);\n }\n }\n\n /**\n * Fires event with an optional options object\n * @param {String} eventName Event name to fire\n * @param {Object} [options] Options object\n */\n fire(eventName: K, options?: EventSpec[K]) {\n if (!this.__eventListeners) {\n return;\n }\n\n const listenersForEvent = this.__eventListeners[eventName]?.concat();\n if (listenersForEvent) {\n for (let i = 0; i < listenersForEvent.length; i++) {\n listenersForEvent[i].call(this, options || {});\n }\n }\n }\n}\n","/**\n * Removes value from an array.\n * Presence of value (and its position in an array) is determined via `Array.prototype.indexOf`\n * @param {Array} array\n * @param {*} value\n * @return {Array} original array\n */\nexport const removeFromArray = (array: T[], value: T): T[] => {\n const idx = array.indexOf(value);\n if (idx !== -1) {\n array.splice(idx, 1);\n }\n return array;\n};\n","import type { TRadian } from '../../typedefs';\nimport { halfPI } from '../../constants';\n\n/**\n * Calculate the cos of an angle, avoiding returning floats for known results\n * This function is here just to avoid getting 0.999999999999999 when dealing\n * with numbers that are really 1 or 0.\n * @param {TRadian} angle the angle\n * @return {Number} the cosin value for angle.\n */\nexport const cos = (angle: TRadian): number => {\n if (angle === 0) {\n return 1;\n }\n const angleSlice = Math.abs(angle) / halfPI;\n switch (angleSlice) {\n case 1:\n case 3:\n return 0;\n case 2:\n return -1;\n }\n return Math.cos(angle);\n};\n","import type { TRadian } from '../../typedefs';\nimport { halfPI } from '../../constants';\n\n/**\n * Calculate the cos of an angle, avoiding returning floats for known results\n * This function is here just to avoid getting 0.999999999999999 when dealing\n * with numbers that are really 1 or 0.\n * @param {TRadian} angle the angle\n * @return {Number} the sin value for angle.\n */\nexport const sin = (angle: TRadian): number => {\n if (angle === 0) {\n return 0;\n }\n const angleSlice = angle / halfPI;\n const value = Math.sign(angle);\n switch (angleSlice) {\n case 1:\n return value;\n case 2:\n return 0;\n case 3:\n return -value;\n }\n return Math.sin(angle);\n};\n","import type { TMat2D, TRadian } from './typedefs';\nimport { cos } from './util/misc/cos';\nimport { sin } from './util/misc/sin';\n\nexport interface XY {\n x: number;\n y: number;\n}\n\n/**\n * Adaptation of work of Kevin Lindsey(kevin@kevlindev.com)\n */\nexport class Point implements XY {\n declare x: number;\n\n declare y: number;\n\n constructor();\n constructor(x: number, y: number);\n constructor(point?: XY);\n constructor(arg0: number | XY = 0, y = 0) {\n if (typeof arg0 === 'object') {\n this.x = arg0.x;\n this.y = arg0.y;\n } else {\n this.x = arg0;\n this.y = y;\n }\n }\n\n /**\n * Adds another point to this one and returns a new one with the sum\n * @param {XY} that\n * @return {Point} new Point instance with added values\n */\n add(that: XY): Point {\n return new Point(this.x + that.x, this.y + that.y);\n }\n\n /**\n * Adds another point to this one\n * @param {XY} that\n * @return {Point} thisArg\n * @deprecated\n */\n addEquals(that: XY): Point {\n this.x += that.x;\n this.y += that.y;\n return this;\n }\n\n /**\n * Adds value to this point and returns a new one\n * @param {Number} scalar\n * @return {Point} new Point with added value\n */\n scalarAdd(scalar: number): Point {\n return new Point(this.x + scalar, this.y + scalar);\n }\n\n /**\n * Adds value to this point\n * @param {Number} scalar\n * @return {Point} thisArg\n * @deprecated\n */\n scalarAddEquals(scalar: number): Point {\n this.x += scalar;\n this.y += scalar;\n return this;\n }\n\n /**\n * Subtracts another point from this point and returns a new one\n * @param {XY} that\n * @return {Point} new Point object with subtracted values\n */\n subtract(that: XY): Point {\n return new Point(this.x - that.x, this.y - that.y);\n }\n\n /**\n * Subtracts another point from this point\n * @param {XY} that\n * @return {Point} thisArg\n * @deprecated\n */\n subtractEquals(that: XY): Point {\n this.x -= that.x;\n this.y -= that.y;\n return this;\n }\n\n /**\n * Subtracts value from this point and returns a new one\n * @param {Number} scalar\n * @return {Point}\n */\n scalarSubtract(scalar: number): Point {\n return new Point(this.x - scalar, this.y - scalar);\n }\n\n /**\n * Subtracts value from this point\n * @param {Number} scalar\n * @return {Point} thisArg\n * @deprecated\n */\n scalarSubtractEquals(scalar: number): Point {\n this.x -= scalar;\n this.y -= scalar;\n return this;\n }\n\n /**\n * Multiplies this point by another value and returns a new one\n * @param {XY} that\n * @return {Point}\n */\n multiply(that: XY): Point {\n return new Point(this.x * that.x, this.y * that.y);\n }\n\n /**\n * Multiplies this point by a value and returns a new one\n * @param {Number} scalar\n * @return {Point}\n */\n scalarMultiply(scalar: number): Point {\n return new Point(this.x * scalar, this.y * scalar);\n }\n\n /**\n * Multiplies this point by a value\n * @param {Number} scalar\n * @return {Point} thisArg\n * @deprecated\n */\n scalarMultiplyEquals(scalar: number): Point {\n this.x *= scalar;\n this.y *= scalar;\n return this;\n }\n\n /**\n * Divides this point by another and returns a new one\n * @param {XY} that\n * @return {Point}\n */\n divide(that: XY): Point {\n return new Point(this.x / that.x, this.y / that.y);\n }\n\n /**\n * Divides this point by a value and returns a new one\n * @param {Number} scalar\n * @return {Point}\n */\n scalarDivide(scalar: number): Point {\n return new Point(this.x / scalar, this.y / scalar);\n }\n\n /**\n * Divides this point by a value\n * @param {Number} scalar\n * @return {Point} thisArg\n * @deprecated\n */\n scalarDivideEquals(scalar: number): Point {\n this.x /= scalar;\n this.y /= scalar;\n return this;\n }\n\n /**\n * Returns true if this point is equal to another one\n * @param {XY} that\n * @return {Boolean}\n */\n eq(that: XY): boolean {\n return this.x === that.x && this.y === that.y;\n }\n\n /**\n * Returns true if this point is less than another one\n * @param {XY} that\n * @return {Boolean}\n */\n lt(that: XY): boolean {\n return this.x < that.x && this.y < that.y;\n }\n\n /**\n * Returns true if this point is less than or equal to another one\n * @param {XY} that\n * @return {Boolean}\n */\n lte(that: XY): boolean {\n return this.x <= that.x && this.y <= that.y;\n }\n\n /**\n\n * Returns true if this point is greater another one\n * @param {XY} that\n * @return {Boolean}\n */\n gt(that: XY): boolean {\n return this.x > that.x && this.y > that.y;\n }\n\n /**\n * Returns true if this point is greater than or equal to another one\n * @param {XY} that\n * @return {Boolean}\n */\n gte(that: XY): boolean {\n return this.x >= that.x && this.y >= that.y;\n }\n\n /**\n * Returns new point which is the result of linear interpolation with this one and another one\n * @param {XY} that\n * @param {Number} t , position of interpolation, between 0 and 1 default 0.5\n * @return {Point}\n */\n lerp(that: XY, t = 0.5): Point {\n t = Math.max(Math.min(1, t), 0);\n return new Point(\n this.x + (that.x - this.x) * t,\n this.y + (that.y - this.y) * t,\n );\n }\n\n /**\n * Returns distance from this point and another one\n * @param {XY} that\n * @return {Number}\n */\n distanceFrom(that: XY): number {\n const dx = this.x - that.x,\n dy = this.y - that.y;\n return Math.sqrt(dx * dx + dy * dy);\n }\n\n /**\n * Returns the point between this point and another one\n * @param {XY} that\n * @return {Point}\n */\n midPointFrom(that: XY): Point {\n return this.lerp(that);\n }\n\n /**\n * Returns a new point which is the min of this and another one\n * @param {XY} that\n * @return {Point}\n */\n min(that: XY): Point {\n return new Point(Math.min(this.x, that.x), Math.min(this.y, that.y));\n }\n\n /**\n * Returns a new point which is the max of this and another one\n * @param {XY} that\n * @return {Point}\n */\n max(that: XY): Point {\n return new Point(Math.max(this.x, that.x), Math.max(this.y, that.y));\n }\n\n /**\n * Returns string representation of this point\n * @return {String}\n */\n toString(): string {\n return `${this.x},${this.y}`;\n }\n\n /**\n * Sets x/y of this point\n * @param {Number} x\n * @param {Number} y\n */\n setXY(x: number, y: number) {\n this.x = x;\n this.y = y;\n return this;\n }\n\n /**\n * Sets x of this point\n * @param {Number} x\n */\n setX(x: number) {\n this.x = x;\n return this;\n }\n\n /**\n * Sets y of this point\n * @param {Number} y\n */\n setY(y: number) {\n this.y = y;\n return this;\n }\n\n /**\n * Sets x/y of this point from another point\n * @param {XY} that\n */\n setFromPoint(that: XY) {\n this.x = that.x;\n this.y = that.y;\n return this;\n }\n\n /**\n * Swaps x/y of this point and another point\n * @param {XY} that\n */\n swap(that: XY) {\n const x = this.x,\n y = this.y;\n this.x = that.x;\n this.y = that.y;\n that.x = x;\n that.y = y;\n }\n\n /**\n * return a cloned instance of the point\n * @return {Point}\n */\n clone(): Point {\n return new Point(this.x, this.y);\n }\n\n /**\n * Rotates `point` around `origin` with `radians`\n * @param {XY} origin The origin of the rotation\n * @param {TRadian} radians The radians of the angle for the rotation\n * @return {Point} The new rotated point\n */\n rotate(radians: TRadian, origin: XY = ZERO): Point {\n // TODO benchmark and verify the add and subtract how much cost\n // and then in case early return if no origin is passed\n const sinus = sin(radians),\n cosinus = cos(radians);\n const p = this.subtract(origin);\n const rotated = new Point(\n p.x * cosinus - p.y * sinus,\n p.x * sinus + p.y * cosinus,\n );\n return rotated.add(origin);\n }\n\n /**\n * Apply transform t to point p\n * @param {TMat2D} t The transform\n * @param {Boolean} [ignoreOffset] Indicates that the offset should not be applied\n * @return {Point} The transformed point\n */\n transform(t: TMat2D, ignoreOffset = false): Point {\n return new Point(\n t[0] * this.x + t[2] * this.y + (ignoreOffset ? 0 : t[4]),\n t[1] * this.x + t[3] * this.y + (ignoreOffset ? 0 : t[5]),\n );\n }\n}\n\nexport const ZERO = new Point(0, 0);\n","import type { Constructor, TBBox } from './typedefs';\nimport { removeFromArray } from './util/internals/removeFromArray';\nimport { Point } from './Point';\nimport type { ActiveSelection } from './shapes/ActiveSelection';\nimport type { Group } from './shapes/Group';\nimport type { InteractiveFabricObject } from './shapes/Object/InteractiveObject';\nimport type { FabricObject } from './shapes/Object/FabricObject';\n\nexport const isCollection = (\n fabricObject?: FabricObject,\n): fabricObject is Group | ActiveSelection => {\n return !!fabricObject && Array.isArray((fabricObject as Group)._objects);\n};\n\nexport function createCollectionMixin(Base: TBase) {\n class Collection extends Base {\n /**\n * @type {FabricObject[]}\n * @TODO needs to end up in the constructor too\n */\n _objects: FabricObject[] = [];\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n _onObjectAdded(object: FabricObject) {\n // subclasses should override this method\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n _onObjectRemoved(object: FabricObject) {\n // subclasses should override this method\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n _onStackOrderChanged(object: FabricObject) {\n // subclasses should override this method\n }\n\n /**\n * Adds objects to collection\n * Objects should be instances of (or inherit from) FabricObject\n * @param {...FabricObject[]} objects to add\n * @returns {number} new array length\n */\n add(...objects: FabricObject[]): number {\n const size = this._objects.push(...objects);\n objects.forEach((object) => this._onObjectAdded(object));\n return size;\n }\n\n /**\n * Inserts an object into collection at specified index\n * @param {number} index Index to insert object at\n * @param {...FabricObject[]} objects Object(s) to insert\n * @returns {number} new array length\n */\n insertAt(index: number, ...objects: FabricObject[]) {\n this._objects.splice(index, 0, ...objects);\n objects.forEach((object) => this._onObjectAdded(object));\n return this._objects.length;\n }\n\n /**\n * Removes objects from a collection, then renders canvas (if `renderOnAddRemove` is not `false`)\n * @private\n * @param {...FabricObject[]} objects objects to remove\n * @returns {FabricObject[]} removed objects\n */\n remove(...objects: FabricObject[]) {\n const array = this._objects,\n removed: FabricObject[] = [];\n objects.forEach((object) => {\n const index = array.indexOf(object);\n // only call onObjectRemoved if an object was actually removed\n if (index !== -1) {\n array.splice(index, 1);\n removed.push(object);\n this._onObjectRemoved(object);\n }\n });\n return removed;\n }\n\n /**\n * Executes given function for each object in this group\n * A simple shortcut for getObjects().forEach, before es6 was more complicated,\n * now is just a shortcut.\n * @param {Function} callback\n * Callback invoked with current object as first argument,\n * index - as second and an array of all objects - as third.\n */\n forEachObject(\n callback: (\n object: FabricObject,\n index: number,\n array: FabricObject[],\n ) => any,\n ) {\n this.getObjects().forEach((object, index, objects) =>\n callback(object, index, objects),\n );\n }\n\n /**\n * Returns an array of children objects of this instance\n * @param {...String} [types] When specified, only objects of these types are returned\n * @return {Array}\n */\n getObjects(...types: string[]) {\n if (types.length === 0) {\n return [...this._objects];\n }\n return this._objects.filter((o) => o.isType(...types));\n }\n\n /**\n * Returns object at specified index\n * @param {Number} index\n * @return {Object} object at index\n */\n item(index: number) {\n return this._objects[index];\n }\n\n /**\n * Returns true if collection contains no objects\n * @return {Boolean} true if collection is empty\n */\n isEmpty() {\n return this._objects.length === 0;\n }\n\n /**\n * Returns a size of a collection (i.e: length of an array containing its objects)\n * @return {Number} Collection size\n */\n size() {\n return this._objects.length;\n }\n\n /**\n * Returns true if collection contains an object.\\\n * **Prefer using {@link FabricObject#isDescendantOf} for performance reasons**\n * instead of `a.contains(b)` use `b.isDescendantOf(a)`\n * @param {Object} object Object to check against\n * @param {Boolean} [deep=false] `true` to check all descendants, `false` to check only `_objects`\n * @return {Boolean} `true` if collection contains an object\n */\n contains(object: FabricObject, deep?: boolean): boolean {\n if (this._objects.includes(object)) {\n return true;\n } else if (deep) {\n return this._objects.some(\n (obj) =>\n obj instanceof Collection &&\n (obj as unknown as Collection).contains(object, true),\n );\n }\n return false;\n }\n\n /**\n * Returns number representation of a collection complexity\n * @return {Number} complexity\n */\n complexity() {\n return this._objects.reduce((memo, current) => {\n memo += current.complexity ? current.complexity() : 0;\n return memo;\n }, 0);\n }\n\n /**\n * Moves an object or the objects of a multiple selection\n * to the bottom of the stack of drawn objects\n * @param {fabric.Object} object Object to send to back\n * @returns {boolean} true if change occurred\n */\n sendObjectToBack(object: FabricObject) {\n if (!object || object === this._objects[0]) {\n return false;\n }\n removeFromArray(this._objects, object);\n this._objects.unshift(object);\n this._onStackOrderChanged(object);\n return true;\n }\n\n /**\n * Moves an object or the objects of a multiple selection\n * to the top of the stack of drawn objects\n * @param {fabric.Object} object Object to send\n * @returns {boolean} true if change occurred\n */\n bringObjectToFront(object: FabricObject) {\n if (!object || object === this._objects[this._objects.length - 1]) {\n return false;\n }\n removeFromArray(this._objects, object);\n this._objects.push(object);\n this._onStackOrderChanged(object);\n return true;\n }\n\n /**\n * Moves an object or a selection down in stack of drawn objects\n * An optional parameter, `intersecting` allows to move the object in behind\n * the first intersecting object. Where intersection is calculated with\n * bounding box. If no intersection is found, there will not be change in the\n * stack.\n * @param {fabric.Object} object Object to send\n * @param {boolean} [intersecting] If `true`, send object behind next lower intersecting object\n * @returns {boolean} true if change occurred\n */\n sendObjectBackwards(object: FabricObject, intersecting?: boolean) {\n if (!object) {\n return false;\n }\n const idx = this._objects.indexOf(object);\n if (idx !== 0) {\n // if object is not on the bottom of stack\n const newIdx = this.findNewLowerIndex(object, idx, intersecting);\n removeFromArray(this._objects, object);\n this._objects.splice(newIdx, 0, object);\n this._onStackOrderChanged(object);\n return true;\n }\n return false;\n }\n\n /**\n * Moves an object or a selection up in stack of drawn objects\n * An optional parameter, intersecting allows to move the object in front\n * of the first intersecting object. Where intersection is calculated with\n * bounding box. If no intersection is found, there will not be change in the\n * stack.\n * @param {fabric.Object} object Object to send\n * @param {boolean} [intersecting] If `true`, send object in front of next upper intersecting object\n * @returns {boolean} true if change occurred\n */\n bringObjectForward(object: FabricObject, intersecting?: boolean) {\n if (!object) {\n return false;\n }\n const idx = this._objects.indexOf(object);\n if (idx !== this._objects.length - 1) {\n // if object is not on top of stack (last item in an array)\n const newIdx = this.findNewUpperIndex(object, idx, intersecting);\n removeFromArray(this._objects, object);\n this._objects.splice(newIdx, 0, object);\n this._onStackOrderChanged(object);\n return true;\n }\n return false;\n }\n\n /**\n * Moves an object to specified level in stack of drawn objects\n * @param {fabric.Object} object Object to send\n * @param {number} index Position to move to\n * @returns {boolean} true if change occurred\n */\n moveObjectTo(object: FabricObject, index: number) {\n if (object === this._objects[index]) {\n return false;\n }\n removeFromArray(this._objects, object);\n this._objects.splice(index, 0, object);\n this._onStackOrderChanged(object);\n return true;\n }\n\n findNewLowerIndex(\n object: FabricObject,\n idx: number,\n intersecting?: boolean,\n ) {\n let newIdx;\n\n if (intersecting) {\n newIdx = idx;\n // traverse down the stack looking for the nearest intersecting object\n for (let i = idx - 1; i >= 0; --i) {\n if (object.isOverlapping(this._objects[i])) {\n newIdx = i;\n break;\n }\n }\n } else {\n newIdx = idx - 1;\n }\n\n return newIdx;\n }\n\n findNewUpperIndex(\n object: FabricObject,\n idx: number,\n intersecting?: boolean,\n ) {\n let newIdx;\n\n if (intersecting) {\n newIdx = idx;\n // traverse up the stack looking for the nearest intersecting object\n for (let i = idx + 1; i < this._objects.length; ++i) {\n if (object.isOverlapping(this._objects[i])) {\n newIdx = i;\n break;\n }\n }\n } else {\n newIdx = idx + 1;\n }\n\n return newIdx;\n }\n\n /**\n * Given a bounding box, return all the objects of the collection that are contained in the bounding box.\n * If `includeIntersecting` is true, return also the objects that intersect the bounding box as well.\n * This is meant to work with selection. Is not a generic method.\n * @param {TBBox} bbox a bounding box in scene coordinates\n * @param {{ includeIntersecting?: boolean }} options an object with includeIntersecting\n * @returns array of objects contained in the bounding box, ordered from top to bottom stacking wise\n */\n collectObjects(\n { left, top, width, height }: TBBox,\n { includeIntersecting = true }: { includeIntersecting?: boolean } = {},\n ) {\n const objects: InteractiveFabricObject[] = [],\n tl = new Point(left, top),\n br = tl.add(new Point(width, height));\n\n // we iterate reverse order to collect top first in case of click.\n for (let i = this._objects.length - 1; i >= 0; i--) {\n const object = this._objects[i] as unknown as InteractiveFabricObject;\n if (\n object.selectable &&\n object.visible &&\n ((includeIntersecting && object.intersectsWithRect(tl, br)) ||\n object.isContainedWithinRect(tl, br) ||\n (includeIntersecting && object.containsPoint(tl)) ||\n (includeIntersecting && object.containsPoint(br)))\n ) {\n objects.push(object);\n }\n }\n\n return objects;\n }\n }\n\n // https://github.com/microsoft/TypeScript/issues/32080\n return Collection;\n}\n","import { Observable } from './Observable';\n\nexport class CommonMethods extends Observable {\n /**\n * Sets object's properties from options, for initialization only\n * @protected\n * @param {Object} [options] Options object\n */\n protected _setOptions(options: any = {}) {\n for (const prop in options) {\n this.set(prop, options[prop]);\n }\n }\n\n /**\n * @private\n */\n _setObject(obj: Record) {\n for (const prop in obj) {\n this._set(prop, obj[prop]);\n }\n }\n\n /**\n * Sets property to a given value. When changing position/dimension -related properties (left, top, scale, angle, etc.) `set` does not update position of object's borders/controls. If you need to update those, call `setCoords()`.\n * @param {String|Object} key Property name or object (if object, iterate over the object properties)\n * @param {Object|Function} value Property value (if function, the value is passed into it and its return value is used as a new one)\n */\n set(key: string | Record, value?: any) {\n if (typeof key === 'object') {\n this._setObject(key);\n } else {\n this._set(key, value);\n }\n return this;\n }\n\n _set(key: string, value: any) {\n this[key as keyof this] = value;\n }\n\n /**\n * Toggles specified property from `true` to `false` or from `false` to `true`\n * @param {String} property Property to toggle\n */\n toggle(property: string) {\n const value = this.get(property);\n if (typeof value === 'boolean') {\n this.set(property, !value);\n }\n return this;\n }\n\n /**\n * Basic getter\n * @param {String} property Property name\n * @return {*} value of a property\n */\n get(property: string): any {\n return this[property as keyof this];\n }\n}\n","import { getFabricWindow } from '../../env';\n\nexport function requestAnimFrame(callback: FrameRequestCallback): number {\n return getFabricWindow().requestAnimationFrame(callback);\n}\n\nexport function cancelAnimFrame(handle: number): void {\n return getFabricWindow().cancelAnimationFrame(handle);\n}\n","let id = 0;\n\nexport const uid = () => id++;\n","import { getFabricDocument } from '../../env';\nimport type { ImageFormat, TSize } from '../../typedefs';\nimport { FabricError } from '../internals/console';\n/**\n * Creates canvas element\n * @return {CanvasElement} initialized canvas element\n */\nexport const createCanvasElement = (): HTMLCanvasElement => {\n const element = getFabricDocument().createElement('canvas');\n if (!element || typeof element.getContext === 'undefined') {\n throw new FabricError('Failed to create `canvas` element');\n }\n return element;\n};\n\n/**\n * Creates image element (works on client and node)\n * @return {HTMLImageElement} HTML image element\n */\nexport const createImage = (): HTMLImageElement =>\n getFabricDocument().createElement('img');\n\n/**\n * Creates a canvas element that is a copy of another and is also painted\n * @param {CanvasElement} canvas to copy size and content of\n * @return {CanvasElement} initialized canvas element\n */\nexport const copyCanvasElement = (\n canvas: HTMLCanvasElement,\n): HTMLCanvasElement => {\n const newCanvas = createCanvasElementFor(canvas);\n newCanvas.getContext('2d')?.drawImage(canvas, 0, 0);\n return newCanvas;\n};\n\n/**\n * Creates a canvas element as big as another\n * @param {CanvasElement} canvas to copy size and content of\n * @return {CanvasElement} initialized canvas element\n */\nexport const createCanvasElementFor = (\n canvas: HTMLCanvasElement | ImageData | HTMLImageElement | TSize,\n): HTMLCanvasElement => {\n const newCanvas = createCanvasElement();\n newCanvas.width = canvas.width;\n newCanvas.height = canvas.height;\n return newCanvas;\n};\n\n/**\n * since 2.6.0 moved from canvas instance to utility.\n * possibly useless\n * @param {CanvasElement} canvasEl to copy size and content of\n * @param {String} format 'jpeg' or 'png', in some browsers 'webp' is ok too\n * @param {number} quality <= 1 and > 0\n * @return {String} data url\n */\nexport const toDataURL = (\n canvasEl: HTMLCanvasElement,\n format: ImageFormat,\n quality: number,\n) => canvasEl.toDataURL(`image/${format}`, quality);\n\nexport const isHTMLCanvas = (\n canvas?: HTMLCanvasElement | string,\n): canvas is HTMLCanvasElement => {\n return !!canvas && (canvas as HTMLCanvasElement).getContext !== undefined;\n};\n\nexport const toBlob = (\n canvasEl: HTMLCanvasElement,\n format?: ImageFormat,\n quality?: number,\n): Promise =>\n new Promise((resolve, _) => {\n canvasEl.toBlob(resolve, `image/${format}`, quality);\n });\n","import type { TRadian, TDegree } from '../../typedefs';\nimport { PiBy180 } from '../../constants';\n\n/**\n * Transforms degrees to radians.\n * @param {TDegree} degrees value in degrees\n * @return {TRadian} value in radians\n */\nexport const degreesToRadians = (degrees: TDegree): TRadian =>\n (degrees * PiBy180) as TRadian;\n\n/**\n * Transforms radians to degrees.\n * @param {TRadian} radians value in radians\n * @return {TDegree} value in degrees\n */\nexport const radiansToDegrees = (radians: TRadian): TDegree =>\n (radians / PiBy180) as TDegree;\n","import { iMatrix } from '../../constants';\nimport type { XY } from '../../Point';\nimport { Point } from '../../Point';\nimport type { TDegree, TRadian, TMat2D } from '../../typedefs';\nimport { cos } from './cos';\nimport { degreesToRadians, radiansToDegrees } from './radiansDegreesConversion';\nimport { sin } from './sin';\n\nexport type TRotateMatrixArgs = {\n angle?: TDegree;\n};\n\nexport type TTranslateMatrixArgs = {\n translateX?: number;\n translateY?: number;\n};\n\nexport type TScaleMatrixArgs = {\n scaleX?: number;\n scaleY?: number;\n flipX?: boolean;\n flipY?: boolean;\n skewX?: TDegree;\n skewY?: TDegree;\n};\n\nexport type TComposeMatrixArgs = TTranslateMatrixArgs &\n TRotateMatrixArgs &\n TScaleMatrixArgs;\n\nexport type TQrDecomposeOut = Required<\n Omit\n>;\n\nexport const isIdentityMatrix = (mat: TMat2D) =>\n mat.every((value, index) => value === iMatrix[index]);\n\n/**\n * Apply transform t to point p\n * @deprecated use {@link Point#transform}\n * @param {Point | XY} p The point to transform\n * @param {Array} t The transform\n * @param {Boolean} [ignoreOffset] Indicates that the offset should not be applied\n * @return {Point} The transformed point\n */\nexport const transformPoint = (\n p: XY,\n t: TMat2D,\n ignoreOffset?: boolean,\n): Point => new Point(p).transform(t, ignoreOffset);\n\n/**\n * Invert transformation t\n * @param {Array} t The transform\n * @return {Array} The inverted transform\n */\nexport const invertTransform = (t: TMat2D): TMat2D => {\n const a = 1 / (t[0] * t[3] - t[1] * t[2]),\n r = [a * t[3], -a * t[1], -a * t[2], a * t[0], 0, 0] as TMat2D,\n { x, y } = new Point(t[4], t[5]).transform(r, true);\n r[4] = -x;\n r[5] = -y;\n return r;\n};\n\n/**\n * Multiply matrix A by matrix B to nest transformations\n * @param {TMat2D} a First transformMatrix\n * @param {TMat2D} b Second transformMatrix\n * @param {Boolean} is2x2 flag to multiply matrices as 2x2 matrices\n * @return {TMat2D} The product of the two transform matrices\n */\nexport const multiplyTransformMatrices = (\n a: TMat2D,\n b: TMat2D,\n is2x2?: boolean,\n): TMat2D =>\n [\n a[0] * b[0] + a[2] * b[1],\n a[1] * b[0] + a[3] * b[1],\n a[0] * b[2] + a[2] * b[3],\n a[1] * b[2] + a[3] * b[3],\n is2x2 ? 0 : a[0] * b[4] + a[2] * b[5] + a[4],\n is2x2 ? 0 : a[1] * b[4] + a[3] * b[5] + a[5],\n ] as TMat2D;\n\n/**\n * Multiplies the matrices array such that a matrix defines the plane for the rest of the matrices **after** it\n *\n * `multiplyTransformMatrixArray([A, B, C, D])` is equivalent to `A(B(C(D)))`\n *\n * @param matrices an array of matrices\n * @param [is2x2] flag to multiply matrices as 2x2 matrices\n * @returns the multiplication product\n */\nexport const multiplyTransformMatrixArray = (\n matrices: (TMat2D | undefined | null | false)[],\n is2x2?: boolean,\n) =>\n matrices.reduceRight(\n (product: TMat2D, curr) =>\n curr && product\n ? multiplyTransformMatrices(curr, product, is2x2)\n : curr || product,\n undefined as unknown as TMat2D,\n ) || iMatrix.concat();\n\nexport const calcPlaneRotation = ([a, b]: TMat2D) =>\n Math.atan2(b, a) as TRadian;\n\n/**\n * Decomposes standard 2x3 matrix into transform components\n * @param {TMat2D} a transformMatrix\n * @return {Object} Components of transform\n */\nexport const qrDecompose = (a: TMat2D): TQrDecomposeOut => {\n const angle = calcPlaneRotation(a),\n denom = Math.pow(a[0], 2) + Math.pow(a[1], 2),\n scaleX = Math.sqrt(denom),\n scaleY = (a[0] * a[3] - a[2] * a[1]) / scaleX,\n skewX = Math.atan2(a[0] * a[2] + a[1] * a[3], denom);\n return {\n angle: radiansToDegrees(angle),\n scaleX,\n scaleY,\n skewX: radiansToDegrees(skewX),\n skewY: 0 as TDegree,\n translateX: a[4] || 0,\n translateY: a[5] || 0,\n };\n};\n\n/**\n * Generate a translation matrix\n *\n * A translation matrix in the form of\n * [ 1 0 x ]\n * [ 0 1 y ]\n * [ 0 0 1 ]\n *\n * See {@link https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/transform#translate} for more details\n *\n * @param {number} x translation on X axis\n * @param {number} [y] translation on Y axis\n * @returns {TMat2D} matrix\n */\nexport const createTranslateMatrix = (x: number, y = 0): TMat2D => [\n 1,\n 0,\n 0,\n 1,\n x,\n y,\n];\n\n/**\n * Generate a rotation matrix around around a point (x,y), defaulting to (0,0)\n *\n * A matrix in the form of\n * [cos(a) -sin(a) -x*cos(a)+y*sin(a)+x]\n * [sin(a) cos(a) -x*sin(a)-y*cos(a)+y]\n * [0 0 1 ]\n *\n *\n * @param {TDegree} angle rotation in degrees\n * @param {XY} [pivotPoint] pivot point to rotate around\n * @returns {TMat2D} matrix\n */\nexport function createRotateMatrix(\n { angle = 0 }: TRotateMatrixArgs = {},\n { x = 0, y = 0 }: Partial = {},\n): TMat2D {\n const angleRadiant = degreesToRadians(angle),\n cosValue = cos(angleRadiant),\n sinValue = sin(angleRadiant);\n return [\n cosValue,\n sinValue,\n -sinValue,\n cosValue,\n x ? x - (cosValue * x - sinValue * y) : 0,\n y ? y - (sinValue * x + cosValue * y) : 0,\n ];\n}\n\n/**\n * Generate a scale matrix around the point (0,0)\n *\n * A matrix in the form of\n * [x 0 0]\n * [0 y 0]\n * [0 0 1]\n *\n * {@link https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/transform#scale}\n *\n * @param {number} x scale on X axis\n * @param {number} [y] scale on Y axis\n * @returns {TMat2D} matrix\n */\nexport const createScaleMatrix = (x: number, y: number = x): TMat2D => [\n x,\n 0,\n 0,\n y,\n 0,\n 0,\n];\n\nexport const angleToSkew = (angle: TDegree) =>\n Math.tan(degreesToRadians(angle));\n\nexport const skewToAngle = (value: TRadian) =>\n radiansToDegrees(Math.atan(value));\n\n/**\n * Generate a skew matrix for the X axis\n *\n * A matrix in the form of\n * [1 x 0]\n * [0 1 0]\n * [0 0 1]\n *\n * {@link https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/transform#skewx}\n *\n * @param {TDegree} skewValue translation on X axis\n * @returns {TMat2D} matrix\n */\nexport const createSkewXMatrix = (skewValue: TDegree): TMat2D => [\n 1,\n 0,\n angleToSkew(skewValue),\n 1,\n 0,\n 0,\n];\n\n/**\n * Generate a skew matrix for the Y axis\n *\n * A matrix in the form of\n * [1 0 0]\n * [y 1 0]\n * [0 0 1]\n *\n * {@link https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/transform#skewy}\n *\n * @param {TDegree} skewValue translation on Y axis\n * @returns {TMat2D} matrix\n */\nexport const createSkewYMatrix = (skewValue: TDegree): TMat2D => [\n 1,\n angleToSkew(skewValue),\n 0,\n 1,\n 0,\n 0,\n];\n\n/**\n * Returns a transform matrix starting from an object of the same kind of\n * the one returned from qrDecompose, useful also if you want to calculate some\n * transformations from an object that is not enlived yet.\n * is called DimensionsTransformMatrix because those properties are the one that influence\n * the size of the resulting box of the object.\n * @param {Object} options\n * @param {Number} [options.scaleX]\n * @param {Number} [options.scaleY]\n * @param {Boolean} [options.flipX]\n * @param {Boolean} [options.flipY]\n * @param {Number} [options.skewX]\n * @param {Number} [options.skewY]\n * @return {Number[]} transform matrix\n */\nexport const calcDimensionsMatrix = ({\n scaleX = 1,\n scaleY = 1,\n flipX = false,\n flipY = false,\n skewX = 0 as TDegree,\n skewY = 0 as TDegree,\n}: TScaleMatrixArgs) => {\n let matrix = createScaleMatrix(\n flipX ? -scaleX : scaleX,\n flipY ? -scaleY : scaleY,\n );\n if (skewX) {\n matrix = multiplyTransformMatrices(matrix, createSkewXMatrix(skewX), true);\n }\n if (skewY) {\n matrix = multiplyTransformMatrices(matrix, createSkewYMatrix(skewY), true);\n }\n return matrix;\n};\n\n/**\n * Returns a transform matrix starting from an object of the same kind of\n * the one returned from qrDecompose, useful also if you want to calculate some\n * transformations from an object that is not enlived yet\n * Before changing this function look at: src/benchmarks/calcTransformMatrix.mjs\n * @param {Object} options\n * @param {Number} [options.angle]\n * @param {Number} [options.scaleX]\n * @param {Number} [options.scaleY]\n * @param {Boolean} [options.flipX]\n * @param {Boolean} [options.flipY]\n * @param {Number} [options.skewX]\n * @param {Number} [options.skewY]\n * @param {Number} [options.translateX]\n * @param {Number} [options.translateY]\n * @return {Number[]} transform matrix\n */\nexport const composeMatrix = (options: TComposeMatrixArgs): TMat2D => {\n const { translateX = 0, translateY = 0, angle = 0 as TDegree } = options;\n let matrix = createTranslateMatrix(translateX, translateY);\n if (angle) {\n matrix = multiplyTransformMatrices(matrix, createRotateMatrix({ angle }));\n }\n const scaleMatrix = calcDimensionsMatrix(options);\n if (!isIdentityMatrix(scaleMatrix)) {\n matrix = multiplyTransformMatrices(matrix, scaleMatrix);\n }\n return matrix;\n};\n","import { noop } from '../../constants';\nimport type { FabricObject } from '../../shapes/Object/FabricObject';\nimport type {\n Abortable,\n Constructor,\n TCrossOrigin,\n TFiller,\n} from '../../typedefs';\nimport { createImage } from './dom';\nimport { classRegistry } from '../../ClassRegistry';\nimport type { BaseFilter } from '../../filters/BaseFilter';\nimport type { FabricObject as BaseFabricObject } from '../../shapes/Object/Object';\nimport { FabricError, SignalAbortedError } from '../internals/console';\nimport type { Shadow } from '../../Shadow';\n\nexport type LoadImageOptions = Abortable & {\n /**\n * cors value for the image loading, default to anonymous\n */\n crossOrigin?: TCrossOrigin;\n};\n\n/**\n * Loads image element from given url and resolve it, or catch.\n * @param {String} url URL representing an image\n * @param {LoadImageOptions} [options] image loading options\n * @returns {Promise} the loaded image.\n */\nexport const loadImage = (\n url: string,\n { signal, crossOrigin = null }: LoadImageOptions = {},\n) =>\n new Promise(function (resolve, reject) {\n if (signal && signal.aborted) {\n return reject(new SignalAbortedError('loadImage'));\n }\n const img = createImage();\n let abort: EventListenerOrEventListenerObject;\n if (signal) {\n abort = function (err: Event) {\n img.src = '';\n reject(err);\n };\n signal.addEventListener('abort', abort, { once: true });\n }\n const done = function () {\n img.onload = img.onerror = null;\n abort && signal?.removeEventListener('abort', abort);\n resolve(img);\n };\n if (!url) {\n done();\n return;\n }\n img.onload = done;\n img.onerror = function () {\n abort && signal?.removeEventListener('abort', abort);\n reject(new FabricError(`Error loading ${img.src}`));\n };\n crossOrigin && (img.crossOrigin = crossOrigin);\n img.src = url;\n });\n\nexport type EnlivenObjectOptions = Abortable & {\n /**\n * Method for further parsing of object elements,\n * called after each fabric object created.\n */\n reviver?: <\n T extends\n | BaseFabricObject\n | FabricObject\n | BaseFilter\n | Shadow\n | TFiller,\n >(\n serializedObj: Record,\n instance: T,\n ) => void;\n};\n\n/**\n * @TODO type this correctly.\n * Creates corresponding fabric instances from their object representations\n * @param {Object[]} objects Objects to enliven\n * @param {EnlivenObjectOptions} [options]\n * @param {(serializedObj: object, instance: FabricObject) => any} [options.reviver] Method for further parsing of object elements,\n * called after each fabric object created.\n * @param {AbortSignal} [options.signal] handle aborting, see https://developer.mozilla.org/en-US/docs/Web/API/AbortController/signal\n * @returns {Promise}\n */\nexport const enlivenObjects = <\n T extends\n | BaseFabricObject\n | FabricObject\n | BaseFilter\n | Shadow\n | TFiller,\n>(\n objects: any[],\n { signal, reviver = noop }: EnlivenObjectOptions = {},\n) =>\n new Promise((resolve, reject) => {\n const instances: T[] = [];\n signal && signal.addEventListener('abort', reject, { once: true });\n Promise.all(\n objects.map((obj) =>\n classRegistry\n .getClass<\n Constructor & {\n fromObject(options: any, context: Abortable): Promise;\n }\n >(obj.type)\n .fromObject(obj, { signal })\n .then((fabricInstance) => {\n reviver(obj, fabricInstance);\n instances.push(fabricInstance);\n return fabricInstance;\n }),\n ),\n )\n .then(resolve)\n .catch((error) => {\n // cleanup\n instances.forEach((instance) => {\n (instance as FabricObject).dispose &&\n (instance as FabricObject).dispose();\n });\n reject(error);\n })\n .finally(() => {\n signal && signal.removeEventListener('abort', reject);\n });\n });\n\n/**\n * Creates corresponding fabric instances residing in an object, e.g. `clipPath`\n * @param {Object} object with properties to enlive ( fill, stroke, clipPath, path )\n * @param {object} [options]\n * @param {AbortSignal} [options.signal] handle aborting, see https://developer.mozilla.org/en-US/docs/Web/API/AbortController/signal\n * @returns {Promise>} the input object with enlived values\n */\nexport const enlivenObjectEnlivables = <\n R = Record,\n>(\n serializedObject: any,\n { signal }: Abortable = {},\n) =>\n new Promise((resolve, reject) => {\n const instances: (FabricObject | TFiller | Shadow)[] = [];\n signal && signal.addEventListener('abort', reject, { once: true });\n // enlive every possible property\n const promises = Object.values(serializedObject).map((value: any) => {\n if (!value) {\n return value;\n }\n /**\n * clipPath or shadow or gradient or text on a path or a pattern,\n * or the backgroundImage or overlayImage of canvas\n * If we have a type and there is a classe registered for it, we enlive it.\n * If there is no class registered for it we return the value as is\n * */\n if (value.type && classRegistry.has(value.type)) {\n return enlivenObjects([value], {\n signal,\n }).then(([enlived]) => {\n instances.push(enlived);\n return enlived;\n });\n }\n return value;\n });\n const keys = Object.keys(serializedObject);\n Promise.all(promises)\n .then((enlived) => {\n return enlived.reduce((acc, instance, index) => {\n acc[keys[index]] = instance;\n return acc;\n }, {});\n })\n .then(resolve)\n .catch((error) => {\n // cleanup\n instances.forEach((instance: any) => {\n instance.dispose && instance.dispose();\n });\n reject(error);\n })\n .finally(() => {\n signal && signal.removeEventListener('abort', reject);\n });\n });\n","/**\n * Populates an object with properties of another object\n * @param {Object} source Source object\n * @param {string[]} properties Properties names to include\n * @returns object populated with the picked keys\n */\nexport const pick = >(\n source: T,\n keys: (keyof T)[] = [],\n) => {\n return keys.reduce((o, key) => {\n if (key in source) {\n o[key] = source[key];\n }\n return o;\n }, {} as Partial);\n};\n\nexport const pickBy = >(\n source: T,\n predicate: (value: T[K], key: K, collection: T) => boolean,\n) => {\n return (Object.keys(source) as (keyof T)[]).reduce((o, key) => {\n if (predicate(source[key], key, source)) {\n o[key] = source[key];\n }\n return o;\n }, {} as Partial);\n};\n","/**\n * A wrapper around Number#toFixed, which contrary to native method returns number, not string.\n * @param {number|string} number number to operate on\n * @param {number} fractionDigits number of fraction digits to \"leave\"\n * @return {number}\n */\nexport const toFixed = (number: number | string, fractionDigits: number) =>\n parseFloat(Number(number).toFixed(fractionDigits));\n","import type { TMat2D } from '../../typedefs';\nimport { toFixed } from './toFixed';\nimport { config } from '../../config';\n\n/**\n * given an array of 6 number returns something like `\"matrix(...numbers)\"`\n * @param {TMat2D} transform an array with 6 numbers\n * @return {String} transform matrix for svg\n */\nexport const matrixToSVG = (transform: TMat2D) =>\n 'matrix(' +\n transform\n .map((value) => toFixed(value, config.NUM_FRACTION_DIGITS))\n .join(' ') +\n ')';\n","import type { FabricObject } from '../shapes/Object/Object';\nimport type { TFiller } from '../typedefs';\nimport type { FabricText } from '../shapes/Text/Text';\nimport type { Pattern } from '../Pattern';\nimport type { Path } from '../shapes/Path';\nimport type { ActiveSelection } from '../shapes/ActiveSelection';\n\nexport const isFiller = (\n filler: TFiller | string | null,\n): filler is TFiller => {\n return !!filler && (filler as TFiller).toLive !== undefined;\n};\n\nexport const isSerializableFiller = (\n filler: TFiller | string | null,\n): filler is TFiller => {\n return !!filler && typeof (filler as TFiller).toObject === 'function';\n};\n\nexport const isPattern = (filler: TFiller): filler is Pattern => {\n return (\n !!filler && (filler as Pattern).offsetX !== undefined && 'source' in filler\n );\n};\n\nexport const isTextObject = (\n fabricObject?: FabricObject,\n): fabricObject is FabricText => {\n return (\n !!fabricObject &&\n typeof (fabricObject as FabricText)._renderText === 'function'\n );\n};\n\nexport const isPath = (fabricObject?: FabricObject): fabricObject is Path => {\n // we could use instanceof but that would mean pulling in Text code for a simple check\n // @todo discuss what to do and how to do\n return (\n !!fabricObject &&\n typeof (fabricObject as Path)._renderPathCommands === 'function'\n );\n};\n\nexport const isActiveSelection = (\n fabricObject?: FabricObject,\n): fabricObject is ActiveSelection =>\n !!fabricObject && 'multiSelectionStacking' in fabricObject;\n","/**\n * Returns element scroll offsets\n * @param {HTMLElement} element Element to operate on\n * @return {Object} Object with left/top values\n */\nexport function getScrollLeftTop(element: HTMLElement | null) {\n const doc = element && getDocumentFromElement(element);\n let left = 0,\n top = 0;\n if (!element || !doc) {\n return { left, top };\n }\n let elementLoop: HTMLElement | Document | ShadowRoot = element;\n const docElement = doc.documentElement,\n body = doc.body || {\n scrollLeft: 0,\n scrollTop: 0,\n };\n // While loop checks (and then sets element to) .parentNode OR .host\n // to account for ShadowDOM. We still want to traverse up out of ShadowDOM,\n // but the .parentNode of a root ShadowDOM node will always be null, instead\n // it should be accessed through .host. See http://stackoverflow.com/a/24765528/4383938\n while (\n elementLoop &&\n (elementLoop.parentNode || (elementLoop as unknown as ShadowRoot).host)\n ) {\n elementLoop = (elementLoop.parentNode ||\n (elementLoop as unknown as ShadowRoot).host) as\n | HTMLElement\n | Document\n | ShadowRoot;\n if (elementLoop === doc) {\n left = body.scrollLeft || docElement.scrollLeft || 0;\n top = body.scrollTop || docElement.scrollTop || 0;\n } else {\n left += (elementLoop as HTMLElement).scrollLeft || 0;\n top += (elementLoop as HTMLElement).scrollTop || 0;\n }\n\n if (\n elementLoop.nodeType === 1 &&\n (elementLoop as HTMLElement).style.position === 'fixed'\n ) {\n break;\n }\n }\n\n return { left, top };\n}\n\nexport const getDocumentFromElement = (el: HTMLElement) =>\n el.ownerDocument || null;\n\nexport const getWindowFromElement = (el: HTMLElement) =>\n el.ownerDocument?.defaultView || null;\n","import { NONE } from '../../constants';\nimport type { TSize } from '../../typedefs';\nimport {\n getDocumentFromElement,\n getWindowFromElement,\n getScrollLeftTop,\n} from '../../util/dom_misc';\n\nexport const setCanvasDimensions = (\n el: HTMLCanvasElement,\n ctx: CanvasRenderingContext2D,\n { width, height }: TSize,\n retinaScaling = 1,\n) => {\n el.width = width;\n el.height = height;\n if (retinaScaling > 1) {\n el.setAttribute('width', (width * retinaScaling).toString());\n el.setAttribute('height', (height * retinaScaling).toString());\n ctx.scale(retinaScaling, retinaScaling);\n }\n};\n\nexport type CSSDimensions = {\n width: number | string;\n height: number | string;\n};\n\nexport const setCSSDimensions = (\n el: HTMLElement,\n { width, height }: Partial,\n) => {\n width && (el.style.width = typeof width === 'number' ? `${width}px` : width);\n height &&\n (el.style.height = typeof height === 'number' ? `${height}px` : height);\n};\n\n/**\n * Returns offset for a given element\n * @param {HTMLElement} element Element to get offset for\n * @return {Object} Object with \"left\" and \"top\" properties\n */\nexport function getElementOffset(element: HTMLElement) {\n const doc = element && getDocumentFromElement(element),\n offset = { left: 0, top: 0 };\n\n if (!doc) {\n return offset;\n }\n const elemStyle: CSSStyleDeclaration =\n getWindowFromElement(element)?.getComputedStyle(element, null) ||\n ({} as CSSStyleDeclaration);\n offset.left += parseInt(elemStyle.borderLeftWidth, 10) || 0;\n offset.top += parseInt(elemStyle.borderTopWidth, 10) || 0;\n offset.left += parseInt(elemStyle.paddingLeft, 10) || 0;\n offset.top += parseInt(elemStyle.paddingTop, 10) || 0;\n\n let box = { left: 0, top: 0 };\n\n const docElem = doc.documentElement;\n if (typeof element.getBoundingClientRect !== 'undefined') {\n box = element.getBoundingClientRect();\n }\n\n const scrollLeftTop = getScrollLeftTop(element);\n\n return {\n left:\n box.left + scrollLeftTop.left - (docElem.clientLeft || 0) + offset.left,\n top: box.top + scrollLeftTop.top - (docElem.clientTop || 0) + offset.top,\n };\n}\n\n/**\n * Makes element unselectable\n * @param {HTMLElement} element Element to make unselectable\n * @return {HTMLElement} Element that was passed in\n */\nexport function makeElementUnselectable(element: HTMLElement) {\n if (typeof element.onselectstart !== 'undefined') {\n element.onselectstart = () => false;\n }\n element.style.userSelect = NONE;\n return element;\n}\n","import { getEnv, getFabricDocument } from '../../env';\nimport type { TSize } from '../../typedefs';\nimport type { CSSDimensions } from './util';\nimport { setCSSDimensions, getElementOffset } from './util';\nimport { createCanvasElement, isHTMLCanvas } from '../../util/misc/dom';\nimport { setCanvasDimensions } from './util';\nimport { FabricError } from '../../util/internals/console';\n\nexport type CanvasItem = {\n el: HTMLCanvasElement;\n ctx: CanvasRenderingContext2D;\n};\n\nexport class StaticCanvasDOMManager {\n /**\n * Keeps a copy of the canvas style before setting retina scaling and other potions\n * in order to return it to original state on dispose\n * @type string\n */\n private _originalCanvasStyle?: string;\n\n lower: CanvasItem;\n\n constructor(arg0?: string | HTMLCanvasElement) {\n const el = this.createLowerCanvas(arg0);\n this.lower = { el, ctx: el.getContext('2d')! };\n }\n\n protected createLowerCanvas(arg0?: HTMLCanvasElement | string) {\n // canvasEl === 'HTMLCanvasElement' does not work on jsdom/node\n const el = isHTMLCanvas(arg0)\n ? arg0\n : (arg0 &&\n (getFabricDocument().getElementById(arg0) as HTMLCanvasElement)) ||\n createCanvasElement();\n if (el.hasAttribute('data-fabric')) {\n throw new FabricError(\n 'Trying to initialize a canvas that has already been initialized. Did you forget to dispose the canvas?',\n );\n }\n this._originalCanvasStyle = el.style.cssText;\n el.setAttribute('data-fabric', 'main');\n el.classList.add('lower-canvas');\n return el;\n }\n\n cleanupDOM({ width, height }: TSize) {\n const { el } = this.lower;\n // restore canvas style and attributes\n el.classList.remove('lower-canvas');\n el.removeAttribute('data-fabric');\n // restore canvas size to original size in case retina scaling was applied\n el.setAttribute('width', `${width}`);\n el.setAttribute('height', `${height}`);\n el.style.cssText = this._originalCanvasStyle || '';\n this._originalCanvasStyle = undefined;\n }\n\n setDimensions(size: TSize, retinaScaling: number) {\n const { el, ctx } = this.lower;\n setCanvasDimensions(el, ctx, size, retinaScaling);\n }\n\n setCSSDimensions(size: Partial) {\n setCSSDimensions(this.lower.el, size);\n }\n\n /**\n * Calculates canvas element offset relative to the document\n */\n calcOffset() {\n return getElementOffset(this.lower.el);\n }\n\n dispose() {\n getEnv().dispose(this.lower.el);\n // @ts-expect-error disposing\n delete this.lower;\n }\n}\n","import { iMatrix } from '../constants';\nimport type { FabricObject } from '../shapes/Object/FabricObject';\nimport type { TFiller, TMat2D, TOptions } from '../typedefs';\n\ninterface CanvasDrawableOptions {\n /**\n * if set to false background image is not affected by viewport transform\n * @since 1.6.3\n * @type Boolean\n * @todo we should really find a different way to do this\n */\n backgroundVpt: boolean;\n\n /**\n * Background color of canvas instance.\n * @type {(String|TFiller)}\n */\n backgroundColor: TFiller | string;\n\n /**\n * Background image of canvas instance.\n * since 2.4.0 image caching is active, please when putting an image as background, add to the\n * canvas property a reference to the canvas it is on. Otherwise the image cannot detect the zoom\n * vale. As an alternative you can disable image objectCaching\n * @type FabricObject\n */\n backgroundImage?: FabricObject;\n\n /**\n * if set to false overlay image is not affected by viewport transform\n * @since 1.6.3\n * @type Boolean\n * @todo we should really find a different way to do this\n */\n overlayVpt: boolean;\n\n /**\n * Overlay color of canvas instance.\n * @since 1.3.9\n * @type {(String|TFiller)}\n */\n overlayColor: TFiller | string;\n\n /**\n * Overlay image of canvas instance.\n * since 2.4.0 image caching is active, please when putting an image as overlay, add to the\n * canvas property a reference to the canvas it is on. Otherwise the image cannot detect the zoom\n * vale. As an alternative you can disable image objectCaching\n * @type FabricObject\n */\n overlayImage?: FabricObject;\n}\n\ninterface CanvasRenderingOptions {\n /**\n * Indicates whether {@link StaticCanvas#add}, {@link StaticCanvas#insertAt} and {@link StaticCanvas#remove},\n * {@link StaticCanvas#moveTo}, {@link StaticCanvas#clear} and many more, should also re-render canvas.\n * Disabling this option will not give a performance boost when adding/removing a lot of objects to/from canvas at once\n * since the renders are queued and executed one per frame.\n * Disabling is suggested anyway and managing the renders of the app manually is not a big effort ( canvas.requestRenderAll() )\n * Left default to true to do not break documentation and old app, fiddles.\n * @type Boolean\n */\n renderOnAddRemove: boolean;\n\n /**\n * Based on vptCoords and object.aCoords, skip rendering of objects that\n * are not included in current viewport.\n * May greatly help in applications with crowded canvas and use of zoom/pan\n * If One of the corner of the bounding box of the object is on the canvas\n * the objects get rendered.\n * @type Boolean\n * @default true\n */\n skipOffscreen: boolean;\n\n /**\n * When true, canvas is scaled by devicePixelRatio for better rendering on retina screens\n * @type Boolean\n */\n enableRetinaScaling: boolean;\n\n /**\n * Indicates whether this canvas will use image smoothing, this is on by default in browsers\n * @type Boolean\n */\n imageSmoothingEnabled: boolean;\n\n /**\n * a fabricObject that, without stroke define a clipping area with their shape. filled in black\n * the clipPath object gets used when the canvas has rendered, and the context is placed in the\n * top left corner of the canvas.\n * clipPath will clip away controls, if you do not want this to happen use controlsAboveOverlay = true\n * @type FabricObject\n */\n clipPath?: FabricObject;\n}\n\nexport interface CanvasExportOptions {\n /**\n * Indicates whether toObject/toDatalessObject should include default values\n * if set to false, takes precedence over the object value.\n * @type Boolean\n */\n includeDefaultValues: boolean;\n\n /**\n * When true, getSvgTransform() will apply the StaticCanvas.viewportTransform to the SVG transformation. When true,\n * a zoomed canvas will then produce zoomed SVG output.\n * @type Boolean\n */\n svgViewportTransformation: boolean;\n}\n\nexport interface StaticCanvasOptions\n extends CanvasDrawableOptions,\n CanvasRenderingOptions,\n CanvasExportOptions {\n /**\n * Width in virtual/logical pixels of the canvas.\n * The canvas can be larger than width if retina scaling is active\n * @type number\n */\n width: number;\n\n /**\n * Height in virtual/logical pixels of the canvas.\n * The canvas can be taller than width if retina scaling is active\n * @type height\n */\n height: number;\n\n /**\n * Indicates whether object controls (borders/controls) are rendered above overlay image\n * @type Boolean\n *\n * @todo move to Canvas\n */\n controlsAboveOverlay: boolean;\n\n /**\n * Indicates whether the browser can be scrolled when using a touchscreen and dragging on the canvas\n * It gives PRIORITY to DOM scrolling, it doesn't make it always possible.\n * If is true, when using a touch event on the canvas, the canvas will scroll if scroll is possible.\n * If we are in drawing mode or if we are selecting an object the canvas preventDefault and so it won't scroll\n * @type Boolean\n *\n * @todo move to Canvas\n */\n allowTouchScrolling: boolean;\n\n /**\n * The transformation (a Canvas 2D API transform matrix) which focuses the viewport\n * @type Array\n * @example Default transform\n * canvas.viewportTransform = [1, 0, 0, 1, 0, 0];\n * @example Scale by 70% and translate toward bottom-right by 50, without skewing\n * canvas.viewportTransform = [0.7, 0, 0, 0.7, 50, 50];\n */\n viewportTransform: TMat2D;\n}\n\nexport const staticCanvasDefaults: TOptions = {\n backgroundVpt: true,\n backgroundColor: '',\n overlayVpt: true,\n overlayColor: '',\n\n includeDefaultValues: true,\n svgViewportTransformation: true,\n\n renderOnAddRemove: true,\n skipOffscreen: true,\n enableRetinaScaling: true,\n imageSmoothingEnabled: true,\n\n /**\n * @todo move to Canvas\n */\n controlsAboveOverlay: false,\n /**\n * @todo move to Canvas\n */\n allowTouchScrolling: false,\n\n viewportTransform: [...iMatrix],\n};\n","import { config } from '../config';\nimport { CENTER, VERSION } from '../constants';\nimport type { CanvasEvents, StaticCanvasEvents } from '../EventTypeDefs';\nimport type { Gradient } from '../gradient/Gradient';\nimport { createCollectionMixin, isCollection } from '../Collection';\nimport { CommonMethods } from '../CommonMethods';\nimport type { Pattern } from '../Pattern';\nimport { Point } from '../Point';\nimport type { TCachedFabricObject } from '../shapes/Object/Object';\nimport type {\n Abortable,\n Constructor,\n TCornerPoint,\n TDataUrlOptions,\n TFiller,\n TMat2D,\n TSize,\n TSVGReviver,\n TToCanvasElementOptions,\n TValidToObjectMethod,\n TOptions,\n} from '../typedefs';\nimport {\n cancelAnimFrame,\n requestAnimFrame,\n} from '../util/animation/AnimationFrameProvider';\nimport { runningAnimations } from '../util/animation/AnimationRegistry';\nimport { uid } from '../util/internals/uid';\nimport { createCanvasElementFor, toBlob, toDataURL } from '../util/misc/dom';\nimport { invertTransform, transformPoint } from '../util/misc/matrix';\nimport type { EnlivenObjectOptions } from '../util/misc/objectEnlive';\nimport {\n enlivenObjectEnlivables,\n enlivenObjects,\n} from '../util/misc/objectEnlive';\nimport { pick } from '../util/misc/pick';\nimport { matrixToSVG } from '../util/misc/svgExport';\nimport { toFixed } from '../util/misc/toFixed';\nimport { isFiller, isPattern, isTextObject } from '../util/typeAssertions';\nimport { StaticCanvasDOMManager } from './DOMManagers/StaticCanvasDOMManager';\nimport type { CSSDimensions } from './DOMManagers/util';\nimport type { FabricObject } from '../shapes/Object/FabricObject';\nimport type { StaticCanvasOptions } from './StaticCanvasOptions';\nimport { staticCanvasDefaults } from './StaticCanvasOptions';\nimport { log, FabricError } from '../util/internals/console';\nimport { getDevicePixelRatio } from '../env';\n\n/**\n * Having both options in TCanvasSizeOptions set to true transform the call in a calcOffset\n * Better try to restrict with types to avoid confusion.\n */\nexport type TCanvasSizeOptions =\n | {\n backstoreOnly?: true;\n cssOnly?: false;\n }\n | {\n backstoreOnly?: false;\n cssOnly?: true;\n };\n\nexport type TSVGExportOptions = {\n suppressPreamble?: boolean;\n viewBox?: {\n x: number;\n y: number;\n width: number;\n height: number;\n };\n encoding?: 'UTF-8'; // test Encoding type and see what happens\n width?: string;\n height?: string;\n reviver?: TSVGReviver;\n};\n\n/**\n * Static canvas class\n * @see {@link http://fabric5.fabricjs.com/static_canvas|StaticCanvas demo}\n * @fires before:render\n * @fires after:render\n * @fires canvas:cleared\n * @fires object:added\n * @fires object:removed\n */\n// TODO: fix `EventSpec` inheritance https://github.com/microsoft/TypeScript/issues/26154#issuecomment-1366616260\nexport class StaticCanvas<\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n EventSpec extends StaticCanvasEvents = StaticCanvasEvents,\n >\n extends createCollectionMixin(CommonMethods)\n implements StaticCanvasOptions\n{\n declare width: number;\n declare height: number;\n\n // background\n declare backgroundVpt: boolean;\n declare backgroundColor: TFiller | string;\n declare backgroundImage?: FabricObject;\n // overlay\n declare overlayVpt: boolean;\n declare overlayColor: TFiller | string;\n declare overlayImage?: FabricObject;\n\n declare clipPath?: FabricObject;\n\n declare includeDefaultValues: boolean;\n\n // rendering config\n declare renderOnAddRemove: boolean;\n declare skipOffscreen: boolean;\n declare enableRetinaScaling: boolean;\n declare imageSmoothingEnabled: boolean;\n\n /**\n * @todo move to Canvas\n */\n declare controlsAboveOverlay: boolean;\n\n /**\n * @todo move to Canvas\n */\n declare allowTouchScrolling: boolean;\n\n declare viewportTransform: TMat2D;\n\n /**\n * The viewport bounding box in scene plane coordinates, see {@link calcViewportBoundaries}\n */\n declare vptCoords: TCornerPoint;\n\n /**\n * A reference to the canvas actual HTMLCanvasElement.\n * Can be use to read the raw pixels, but never write or manipulate\n * @type HTMLCanvasElement\n */\n get lowerCanvasEl() {\n return this.elements.lower?.el;\n }\n\n get contextContainer() {\n return this.elements.lower?.ctx;\n }\n\n /**\n * If true the Canvas is in the process or has been disposed/destroyed.\n * No more rendering operation will be executed on this canvas.\n * @type boolean\n */\n declare destroyed?: boolean;\n\n /**\n * Started the process of disposing but not done yet.\n * WIll likely complete the render cycle already scheduled but stopping adding more.\n * @type boolean\n */\n declare disposed?: boolean;\n\n declare _offset: { left: number; top: number };\n declare protected hasLostContext: boolean;\n declare protected nextRenderHandle: number;\n\n declare elements: StaticCanvasDOMManager;\n\n /**\n * When true control drawing is skipped.\n * This boolean is used to avoid toDataURL to export controls.\n * Usage of this boolean to build up other flows and features is not supported\n * @type Boolean\n * @default false\n */\n declare protected skipControlsDrawing: boolean;\n\n static ownDefaults = staticCanvasDefaults;\n\n // reference to\n declare protected __cleanupTask?: {\n (): void;\n kill: (reason?: any) => void;\n };\n\n static getDefaults(): Record {\n return StaticCanvas.ownDefaults;\n }\n\n constructor(\n el?: string | HTMLCanvasElement,\n options: TOptions = {},\n ) {\n super();\n Object.assign(\n this,\n (this.constructor as typeof StaticCanvas).getDefaults(),\n );\n this.set(options);\n this.initElements(el);\n this._setDimensionsImpl({\n width: this.width || this.elements.lower.el.width || 0,\n height: this.height || this.elements.lower.el.height || 0,\n });\n this.skipControlsDrawing = false;\n this.viewportTransform = [...this.viewportTransform];\n this.calcViewportBoundaries();\n }\n\n protected initElements(el?: string | HTMLCanvasElement) {\n this.elements = new StaticCanvasDOMManager(el);\n }\n\n add(...objects: FabricObject[]) {\n const size = super.add(...objects);\n objects.length > 0 && this.renderOnAddRemove && this.requestRenderAll();\n return size;\n }\n\n insertAt(index: number, ...objects: FabricObject[]) {\n const size = super.insertAt(index, ...objects);\n objects.length > 0 && this.renderOnAddRemove && this.requestRenderAll();\n return size;\n }\n\n remove(...objects: FabricObject[]) {\n const removed = super.remove(...objects);\n removed.length > 0 && this.renderOnAddRemove && this.requestRenderAll();\n return removed;\n }\n\n _onObjectAdded(obj: FabricObject) {\n if (obj.canvas && (obj.canvas as StaticCanvas) !== this) {\n log(\n 'warn',\n 'Canvas is trying to add an object that belongs to a different canvas.\\n' +\n 'Resulting to default behavior: removing object from previous canvas and adding to new canvas',\n );\n obj.canvas.remove(obj);\n }\n obj._set('canvas', this);\n obj.setCoords();\n this.fire('object:added', { target: obj });\n obj.fire('added', { target: this });\n }\n\n _onObjectRemoved(obj: FabricObject) {\n obj._set('canvas', undefined);\n this.fire('object:removed', { target: obj });\n obj.fire('removed', { target: this });\n }\n\n _onStackOrderChanged() {\n this.renderOnAddRemove && this.requestRenderAll();\n }\n\n /**\n * @private\n * @see https://developer.apple.com/library/safari/documentation/AudioVideo/Conceptual/HTML-canvas-guide/SettingUptheCanvas/SettingUptheCanvas.html\n * @return {Number} retinaScaling if applied, otherwise 1;\n */\n getRetinaScaling() {\n return this.enableRetinaScaling ? getDevicePixelRatio() : 1;\n }\n\n /**\n * Calculates canvas element offset relative to the document\n * This method is also attached as \"resize\" event handler of window\n */\n calcOffset() {\n return (this._offset = this.elements.calcOffset());\n }\n\n /**\n * Returns canvas width (in px)\n * @return {Number}\n */\n getWidth(): number {\n return this.width;\n }\n\n /**\n * Returns canvas height (in px)\n * @return {Number}\n */\n getHeight(): number {\n return this.height;\n }\n\n /**\n * Internal use only\n * @protected\n */\n protected _setDimensionsImpl(\n dimensions: Partial,\n { cssOnly = false, backstoreOnly = false }: TCanvasSizeOptions = {},\n ) {\n if (!cssOnly) {\n const size = {\n width: this.width,\n height: this.height,\n ...(dimensions as Partial),\n };\n this.elements.setDimensions(size, this.getRetinaScaling());\n this.hasLostContext = true;\n this.width = size.width;\n this.height = size.height;\n }\n if (!backstoreOnly) {\n this.elements.setCSSDimensions(dimensions);\n }\n\n this.calcOffset();\n }\n\n /**\n * Sets dimensions (width, height) of this canvas instance. when options.cssOnly flag active you should also supply the unit of measure (px/%/em)\n * @param {Object} dimensions Object with width/height properties\n * @param {Number|String} [dimensions.width] Width of canvas element\n * @param {Number|String} [dimensions.height] Height of canvas element\n * @param {Object} [options] Options object\n * @param {Boolean} [options.backstoreOnly=false] Set the given dimensions only as canvas backstore dimensions\n * @param {Boolean} [options.cssOnly=false] Set the given dimensions only as css dimensions\n */\n setDimensions(\n dimensions: Partial,\n options?: { cssOnly?: true; backstoreOnly?: false },\n ): void;\n setDimensions(\n dimensions: Partial,\n options?: { backstoreOnly?: true; cssOnly?: false },\n ): void;\n setDimensions(dimensions: Partial, options?: never): void;\n setDimensions(\n dimensions: Partial,\n options?: TCanvasSizeOptions,\n ) {\n this._setDimensionsImpl(dimensions, options);\n if (!options || !options.cssOnly) {\n this.requestRenderAll();\n }\n }\n\n /**\n * Returns canvas zoom level\n * @return {Number}\n */\n getZoom() {\n return this.viewportTransform[0];\n }\n\n /**\n * Sets viewport transformation of this canvas instance\n * @param {Array} vpt a Canvas 2D API transform matrix\n */\n setViewportTransform(vpt: TMat2D) {\n this.viewportTransform = vpt;\n this.calcViewportBoundaries();\n this.renderOnAddRemove && this.requestRenderAll();\n }\n\n /**\n * Sets zoom level of this canvas instance, the zoom centered around point\n * meaning that following zoom to point with the same point will have the visual\n * effect of the zoom originating from that point. The point won't move.\n * It has nothing to do with canvas center or visual center of the viewport.\n * @param {Point} point to zoom with respect to\n * @param {Number} value to set zoom to, less than 1 zooms out\n */\n zoomToPoint(point: Point, value: number) {\n // TODO: just change the scale, preserve other transformations\n const before = point,\n vpt: TMat2D = [...this.viewportTransform];\n const newPoint = transformPoint(point, invertTransform(vpt));\n vpt[0] = value;\n vpt[3] = value;\n const after = transformPoint(newPoint, vpt);\n vpt[4] += before.x - after.x;\n vpt[5] += before.y - after.y;\n this.setViewportTransform(vpt);\n }\n\n /**\n * Sets zoom level of this canvas instance\n * @param {Number} value to set zoom to, less than 1 zooms out\n */\n setZoom(value: number) {\n this.zoomToPoint(new Point(0, 0), value);\n }\n\n /**\n * Pan viewport so as to place point at top left corner of canvas\n * @param {Point} point to move to\n */\n absolutePan(point: Point) {\n const vpt: TMat2D = [...this.viewportTransform];\n vpt[4] = -point.x;\n vpt[5] = -point.y;\n return this.setViewportTransform(vpt);\n }\n\n /**\n * Pans viewpoint relatively\n * @param {Point} point (position vector) to move by\n */\n relativePan(point: Point) {\n return this.absolutePan(\n new Point(\n -point.x - this.viewportTransform[4],\n -point.y - this.viewportTransform[5],\n ),\n );\n }\n\n /**\n * Returns <canvas> element corresponding to this instance\n * @return {HTMLCanvasElement}\n */\n getElement(): HTMLCanvasElement {\n return this.elements.lower.el;\n }\n\n /**\n * Clears specified context of canvas element\n * @param {CanvasRenderingContext2D} ctx Context to clear\n */\n clearContext(ctx: CanvasRenderingContext2D) {\n ctx.clearRect(0, 0, this.width, this.height);\n }\n\n /**\n * Returns context of canvas where objects are drawn\n * @return {CanvasRenderingContext2D}\n */\n getContext(): CanvasRenderingContext2D {\n return this.elements.lower.ctx;\n }\n\n /**\n * Clears all contexts (background, main, top) of an instance\n */\n clear() {\n this.remove(...this.getObjects());\n this.backgroundImage = undefined;\n this.overlayImage = undefined;\n this.backgroundColor = '';\n this.overlayColor = '';\n this.clearContext(this.getContext());\n this.fire('canvas:cleared');\n this.renderOnAddRemove && this.requestRenderAll();\n }\n\n /**\n * Renders the canvas\n */\n renderAll() {\n this.cancelRequestedRender();\n if (this.destroyed) {\n return;\n }\n this.renderCanvas(this.getContext(), this._objects);\n }\n\n /**\n * Function created to be instance bound at initialization\n * used in requestAnimationFrame rendering\n * Let the fabricJS call it. If you call it manually you could have more\n * animationFrame stacking on to of each other\n * for an imperative rendering, use canvas.renderAll\n * @private\n */\n renderAndReset() {\n this.nextRenderHandle = 0;\n this.renderAll();\n }\n\n /**\n * Append a renderAll request to next animation frame.\n * unless one is already in progress, in that case nothing is done\n * a boolean flag will avoid appending more.\n */\n requestRenderAll() {\n if (!this.nextRenderHandle && !this.disposed && !this.destroyed) {\n this.nextRenderHandle = requestAnimFrame(() => this.renderAndReset());\n }\n }\n\n /**\n * Calculate the position of the 4 corner of canvas with current viewportTransform.\n * helps to determinate when an object is in the current rendering viewport\n */\n calcViewportBoundaries(): TCornerPoint {\n const width = this.width,\n height = this.height,\n iVpt = invertTransform(this.viewportTransform),\n a = transformPoint({ x: 0, y: 0 }, iVpt),\n b = transformPoint({ x: width, y: height }, iVpt),\n // we don't support vpt flipping\n // but the code is robust enough to mostly work with flipping\n min = a.min(b),\n max = a.max(b);\n return (this.vptCoords = {\n tl: min,\n tr: new Point(max.x, min.y),\n bl: new Point(min.x, max.y),\n br: max,\n });\n }\n\n cancelRequestedRender() {\n if (this.nextRenderHandle) {\n cancelAnimFrame(this.nextRenderHandle);\n this.nextRenderHandle = 0;\n }\n }\n\n drawControls(_ctx: CanvasRenderingContext2D) {\n // Static canvas has no controls\n }\n\n /**\n * Renders background, objects, overlay and controls.\n * @param {CanvasRenderingContext2D} ctx\n * @param {Array} objects to render\n */\n renderCanvas(ctx: CanvasRenderingContext2D, objects: FabricObject[]) {\n if (this.destroyed) {\n return;\n }\n\n const v = this.viewportTransform,\n path = this.clipPath;\n this.calcViewportBoundaries();\n this.clearContext(ctx);\n ctx.imageSmoothingEnabled = this.imageSmoothingEnabled;\n // @ts-expect-error node-canvas stuff\n ctx.patternQuality = 'best';\n this.fire('before:render', { ctx });\n this._renderBackground(ctx);\n\n ctx.save();\n //apply viewport transform once for all rendering process\n ctx.transform(v[0], v[1], v[2], v[3], v[4], v[5]);\n this._renderObjects(ctx, objects);\n ctx.restore();\n if (!this.controlsAboveOverlay && !this.skipControlsDrawing) {\n this.drawControls(ctx);\n }\n if (path) {\n path._set('canvas', this);\n // needed to setup a couple of variables\n // todo migrate to the newer one\n path.shouldCache();\n path._transformDone = true;\n (path as TCachedFabricObject).renderCache({ forClipping: true });\n this.drawClipPathOnCanvas(ctx, path as TCachedFabricObject);\n }\n this._renderOverlay(ctx);\n if (this.controlsAboveOverlay && !this.skipControlsDrawing) {\n this.drawControls(ctx);\n }\n this.fire('after:render', { ctx });\n\n if (this.__cleanupTask) {\n this.__cleanupTask();\n this.__cleanupTask = undefined;\n }\n }\n\n /**\n * Paint the cached clipPath on the lowerCanvasEl\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n drawClipPathOnCanvas(\n ctx: CanvasRenderingContext2D,\n clipPath: TCachedFabricObject,\n ) {\n const v = this.viewportTransform;\n ctx.save();\n ctx.transform(...v);\n // DEBUG: uncomment this line, comment the following\n // ctx.globalAlpha = 0.4;\n ctx.globalCompositeOperation = 'destination-in';\n clipPath.transform(ctx);\n ctx.scale(1 / clipPath.zoomX, 1 / clipPath.zoomY);\n ctx.drawImage(\n clipPath._cacheCanvas,\n -clipPath.cacheTranslationX,\n -clipPath.cacheTranslationY,\n );\n ctx.restore();\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n * @param {Array} objects to render\n */\n _renderObjects(ctx: CanvasRenderingContext2D, objects: FabricObject[]) {\n for (let i = 0, len = objects.length; i < len; ++i) {\n objects[i] && objects[i].render(ctx);\n }\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n * @param {string} property 'background' or 'overlay'\n */\n _renderBackgroundOrOverlay(\n ctx: CanvasRenderingContext2D,\n property: 'background' | 'overlay',\n ) {\n const fill = this[`${property}Color`],\n object = this[`${property}Image`],\n v = this.viewportTransform,\n needsVpt = this[`${property}Vpt`];\n if (!fill && !object) {\n return;\n }\n const isAFiller = isFiller(fill);\n if (fill) {\n ctx.save();\n ctx.beginPath();\n ctx.moveTo(0, 0);\n ctx.lineTo(this.width, 0);\n ctx.lineTo(this.width, this.height);\n ctx.lineTo(0, this.height);\n ctx.closePath();\n ctx.fillStyle = isAFiller ? fill.toLive(ctx /* this */)! : fill;\n if (needsVpt) {\n ctx.transform(...v);\n }\n if (isAFiller) {\n ctx.transform(1, 0, 0, 1, fill.offsetX || 0, fill.offsetY || 0);\n const m = ((fill as Gradient<'linear'>).gradientTransform ||\n (fill as Pattern).patternTransform) as TMat2D;\n m && ctx.transform(...m);\n }\n ctx.fill();\n ctx.restore();\n }\n if (object) {\n ctx.save();\n const { skipOffscreen } = this;\n // if the object doesn't move with the viewport,\n // the offscreen concept does not apply;\n this.skipOffscreen = needsVpt;\n if (needsVpt) {\n ctx.transform(...v);\n }\n object.render(ctx);\n this.skipOffscreen = skipOffscreen;\n ctx.restore();\n }\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _renderBackground(ctx: CanvasRenderingContext2D) {\n this._renderBackgroundOrOverlay(ctx, 'background');\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _renderOverlay(ctx: CanvasRenderingContext2D) {\n this._renderBackgroundOrOverlay(ctx, 'overlay');\n }\n\n /**\n * Returns coordinates of a center of canvas.\n * @return {Point}\n */\n getCenterPoint() {\n return new Point(this.width / 2, this.height / 2);\n }\n\n /**\n * Centers object horizontally in the canvas\n */\n centerObjectH(object: FabricObject) {\n return this._centerObject(\n object,\n new Point(this.getCenterPoint().x, object.getCenterPoint().y),\n );\n }\n\n /**\n * Centers object vertically in the canvas\n * @param {FabricObject} object Object to center vertically\n */\n centerObjectV(object: FabricObject) {\n return this._centerObject(\n object,\n new Point(object.getCenterPoint().x, this.getCenterPoint().y),\n );\n }\n\n /**\n * Centers object vertically and horizontally in the canvas\n * @param {FabricObject} object Object to center vertically and horizontally\n */\n centerObject(object: FabricObject) {\n return this._centerObject(object, this.getCenterPoint());\n }\n\n /**\n * Centers object vertically and horizontally in the viewport\n * @param {FabricObject} object Object to center vertically and horizontally\n */\n viewportCenterObject(object: FabricObject) {\n return this._centerObject(object, this.getVpCenter());\n }\n\n /**\n * Centers object horizontally in the viewport, object.top is unchanged\n * @param {FabricObject} object Object to center vertically and horizontally\n */\n viewportCenterObjectH(object: FabricObject) {\n return this._centerObject(\n object,\n new Point(this.getVpCenter().x, object.getCenterPoint().y),\n );\n }\n\n /**\n * Centers object Vertically in the viewport, object.top is unchanged\n * @param {FabricObject} object Object to center vertically and horizontally\n */\n viewportCenterObjectV(object: FabricObject) {\n return this._centerObject(\n object,\n new Point(object.getCenterPoint().x, this.getVpCenter().y),\n );\n }\n\n /**\n * Calculate the point in canvas that correspond to the center of actual viewport.\n * @return {Point} vpCenter, viewport center\n */\n getVpCenter(): Point {\n return transformPoint(\n this.getCenterPoint(),\n invertTransform(this.viewportTransform),\n );\n }\n\n /**\n * @private\n * @param {FabricObject} object Object to center\n * @param {Point} center Center point\n */\n _centerObject(object: FabricObject, center: Point) {\n object.setXY(center, CENTER, CENTER);\n object.setCoords();\n this.renderOnAddRemove && this.requestRenderAll();\n }\n\n /**\n * Returns dataless JSON representation of canvas\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {String} json string\n */\n toDatalessJSON(propertiesToInclude?: string[]) {\n return this.toDatalessObject(propertiesToInclude);\n }\n\n /**\n * Returns object representation of canvas\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} object representation of an instance\n */\n toObject(propertiesToInclude?: string[]) {\n return this._toObjectMethod('toObject', propertiesToInclude);\n }\n\n /**\n * Returns Object representation of canvas\n * this alias is provided because if you call JSON.stringify on an instance,\n * the toJSON object will be invoked if it exists.\n * Having a toJSON method means you can do JSON.stringify(myCanvas)\n * JSON does not support additional properties because toJSON has its own signature\n * @return {Object} JSON compatible object\n * @see {@link http://fabric5.fabricjs.com/fabric-intro-part-3#serialization}\n * @see {@link http://jsfiddle.net/fabricjs/pec86/|jsFiddle demo}\n * @example JSON representation of canvas \n * const json = canvas.toJSON();\n * @example JSON representation of canvas \n * const json = JSON.stringify(canvas);\n */\n toJSON() {\n return this.toObject();\n }\n\n /**\n * Returns dataless object representation of canvas\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} object representation of an instance\n */\n toDatalessObject(propertiesToInclude?: string[]) {\n return this._toObjectMethod('toDatalessObject', propertiesToInclude);\n }\n\n /**\n * @private\n */\n _toObjectMethod(\n methodName: TValidToObjectMethod,\n propertiesToInclude?: string[],\n ) {\n const clipPath = this.clipPath;\n const clipPathData =\n clipPath && !clipPath.excludeFromExport\n ? this._toObject(clipPath, methodName, propertiesToInclude)\n : null;\n return {\n version: VERSION,\n ...pick(this, propertiesToInclude as (keyof this)[]),\n objects: this._objects\n .filter((object) => !object.excludeFromExport)\n .map((instance) =>\n this._toObject(instance, methodName, propertiesToInclude),\n ),\n ...this.__serializeBgOverlay(methodName, propertiesToInclude),\n ...(clipPathData ? { clipPath: clipPathData } : null),\n };\n }\n\n /**\n * @private\n */\n protected _toObject(\n instance: FabricObject,\n methodName: TValidToObjectMethod,\n propertiesToInclude?: string[],\n ) {\n let originalValue;\n\n if (!this.includeDefaultValues) {\n originalValue = instance.includeDefaultValues;\n instance.includeDefaultValues = false;\n }\n\n const object = instance[methodName](propertiesToInclude);\n if (!this.includeDefaultValues) {\n instance.includeDefaultValues = !!originalValue;\n }\n return object;\n }\n\n /**\n * @private\n */\n __serializeBgOverlay(\n methodName: TValidToObjectMethod,\n propertiesToInclude?: string[],\n ) {\n const data: any = {},\n bgImage = this.backgroundImage,\n overlayImage = this.overlayImage,\n bgColor = this.backgroundColor,\n overlayColor = this.overlayColor;\n\n if (isFiller(bgColor)) {\n if (!bgColor.excludeFromExport) {\n data.background = bgColor.toObject(propertiesToInclude);\n }\n } else if (bgColor) {\n data.background = bgColor;\n }\n\n if (isFiller(overlayColor)) {\n if (!overlayColor.excludeFromExport) {\n data.overlay = overlayColor.toObject(propertiesToInclude);\n }\n } else if (overlayColor) {\n data.overlay = overlayColor;\n }\n\n if (bgImage && !bgImage.excludeFromExport) {\n data.backgroundImage = this._toObject(\n bgImage,\n methodName,\n propertiesToInclude,\n );\n }\n if (overlayImage && !overlayImage.excludeFromExport) {\n data.overlayImage = this._toObject(\n overlayImage,\n methodName,\n propertiesToInclude,\n );\n }\n\n return data;\n }\n\n /* _TO_SVG_START_ */\n\n declare svgViewportTransformation: boolean;\n\n /**\n * Returns SVG representation of canvas\n * @param {Object} [options] Options object for SVG output\n * @param {Boolean} [options.suppressPreamble=false] If true xml tag is not included\n * @param {Object} [options.viewBox] SVG viewbox object\n * @param {Number} [options.viewBox.x] x-coordinate of viewbox\n * @param {Number} [options.viewBox.y] y-coordinate of viewbox\n * @param {Number} [options.viewBox.width] Width of viewbox\n * @param {Number} [options.viewBox.height] Height of viewbox\n * @param {String} [options.encoding=UTF-8] Encoding of SVG output\n * @param {String} [options.width] desired width of svg with or without units\n * @param {String} [options.height] desired height of svg with or without units\n * @param {Function} [reviver] Method for further parsing of svg elements, called after each fabric object converted into svg representation.\n * @return {String} SVG string\n * @see {@link http://fabric5.fabricjs.com/fabric-intro-part-3#serialization}\n * @see {@link http://jsfiddle.net/fabricjs/jQ3ZZ/|jsFiddle demo}\n * @example Normal SVG output\n * var svg = canvas.toSVG();\n * @example SVG output without preamble (without <?xml ../>)\n * var svg = canvas.toSVG({suppressPreamble: true});\n * @example SVG output with viewBox attribute\n * var svg = canvas.toSVG({\n * viewBox: {\n * x: 100,\n * y: 100,\n * width: 200,\n * height: 300\n * }\n * });\n * @example SVG output with different encoding (default: UTF-8)\n * var svg = canvas.toSVG({encoding: 'ISO-8859-1'});\n * @example Modify SVG output with reviver function\n * var svg = canvas.toSVG(null, function(svg) {\n * return svg.replace('stroke-dasharray: ; stroke-linecap: butt; stroke-linejoin: miter; stroke-miterlimit: 10; ', '');\n * });\n */\n toSVG(options: TSVGExportOptions = {}, reviver?: TSVGReviver) {\n options.reviver = reviver;\n const markup: string[] = [];\n\n this._setSVGPreamble(markup, options);\n this._setSVGHeader(markup, options);\n if (this.clipPath) {\n markup.push(`\\n`);\n }\n this._setSVGBgOverlayColor(markup, 'background');\n this._setSVGBgOverlayImage(markup, 'backgroundImage', reviver);\n this._setSVGObjects(markup, reviver);\n if (this.clipPath) {\n markup.push('\\n');\n }\n this._setSVGBgOverlayColor(markup, 'overlay');\n this._setSVGBgOverlayImage(markup, 'overlayImage', reviver);\n\n markup.push('');\n\n return markup.join('');\n }\n\n /**\n * @private\n */\n _setSVGPreamble(markup: string[], options: TSVGExportOptions): void {\n if (options.suppressPreamble) {\n return;\n }\n markup.push(\n '\\n',\n '\\n',\n );\n }\n\n /**\n * @private\n */\n _setSVGHeader(markup: string[], options: TSVGExportOptions): void {\n const width = options.width || `${this.width}`,\n height = options.height || `${this.height}`,\n NUM_FRACTION_DIGITS = config.NUM_FRACTION_DIGITS,\n optViewBox = options.viewBox;\n let viewBox: string;\n if (optViewBox) {\n viewBox = `viewBox=\"${optViewBox.x} ${optViewBox.y} ${optViewBox.width} ${optViewBox.height}\" `;\n } else if (this.svgViewportTransformation) {\n const vpt = this.viewportTransform;\n viewBox = `viewBox=\"${toFixed(\n -vpt[4] / vpt[0],\n NUM_FRACTION_DIGITS,\n )} ${toFixed(-vpt[5] / vpt[3], NUM_FRACTION_DIGITS)} ${toFixed(\n this.width / vpt[0],\n NUM_FRACTION_DIGITS,\n )} ${toFixed(this.height / vpt[3], NUM_FRACTION_DIGITS)}\" `;\n } else {\n viewBox = `viewBox=\"0 0 ${this.width} ${this.height}\" `;\n }\n\n markup.push(\n '\\n',\n 'Created with Fabric.js ',\n VERSION,\n '\\n',\n '\\n',\n this.createSVGFontFacesMarkup(),\n this.createSVGRefElementsMarkup(),\n this.createSVGClipPathMarkup(options),\n '\\n',\n );\n }\n\n createSVGClipPathMarkup(options: TSVGExportOptions): string {\n const clipPath = this.clipPath;\n if (clipPath) {\n clipPath.clipPathId = `CLIPPATH_${uid()}`;\n return `\\n${clipPath.toClipPathSVG(\n options.reviver,\n )}\\n`;\n }\n return '';\n }\n\n /**\n * Creates markup containing SVG referenced elements like patterns, gradients etc.\n * @return {String}\n */\n createSVGRefElementsMarkup(): string {\n return (['background', 'overlay'] as const)\n .map((prop) => {\n const fill = this[`${prop}Color`];\n if (isFiller(fill)) {\n const shouldTransform = this[`${prop}Vpt`],\n vpt = this.viewportTransform,\n object = {\n // otherwise circular dependency\n isType: () => false,\n width: this.width / (shouldTransform ? vpt[0] : 1),\n height: this.height / (shouldTransform ? vpt[3] : 1),\n };\n return fill.toSVG(object as FabricObject, {\n additionalTransform: shouldTransform ? matrixToSVG(vpt) : '',\n });\n }\n })\n .join('');\n }\n\n /**\n * Creates markup containing SVG font faces,\n * font URLs for font faces must be collected by developers\n * and are not extracted from the DOM by fabricjs\n * @param {Array} objects Array of fabric objects\n * @return {String}\n */\n createSVGFontFacesMarkup(): string {\n const objects: FabricObject[] = [],\n fontList: Record = {},\n fontPaths = config.fontPaths;\n\n this._objects.forEach(function add(object) {\n objects.push(object);\n if (isCollection(object)) {\n object._objects.forEach(add);\n }\n });\n\n objects.forEach((obj) => {\n if (!isTextObject(obj)) {\n return;\n }\n const { styles, fontFamily } = obj;\n if (fontList[fontFamily] || !fontPaths[fontFamily]) {\n return;\n }\n fontList[fontFamily] = true;\n if (!styles) {\n return;\n }\n Object.values(styles).forEach((styleRow) => {\n Object.values(styleRow).forEach(({ fontFamily = '' }) => {\n if (!fontList[fontFamily] && fontPaths[fontFamily]) {\n fontList[fontFamily] = true;\n }\n });\n });\n });\n\n const fontListMarkup = Object.keys(fontList)\n .map(\n (fontFamily) =>\n `\\t\\t@font-face {\\n\\t\\t\\tfont-family: '${fontFamily}';\\n\\t\\t\\tsrc: url('${fontPaths[fontFamily]}');\\n\\t\\t}\\n`,\n )\n .join('');\n\n if (fontListMarkup) {\n return `\\t\\n`;\n }\n return '';\n }\n\n /**\n * @private\n */\n _setSVGObjects(markup: string[], reviver?: TSVGReviver) {\n this.forEachObject((fabricObject) => {\n if (fabricObject.excludeFromExport) {\n return;\n }\n this._setSVGObject(markup, fabricObject, reviver);\n });\n }\n\n /**\n * This is its own function because the Canvas ( non static ) requires extra code here\n * @private\n */\n _setSVGObject(\n markup: string[],\n instance: FabricObject,\n reviver?: TSVGReviver,\n ) {\n markup.push(instance.toSVG(reviver));\n }\n\n /**\n * @private\n */\n _setSVGBgOverlayImage(\n markup: string[],\n property: 'overlayImage' | 'backgroundImage',\n reviver?: TSVGReviver,\n ) {\n const bgOrOverlay = this[property];\n if (bgOrOverlay && !bgOrOverlay.excludeFromExport && bgOrOverlay.toSVG) {\n markup.push(bgOrOverlay.toSVG(reviver));\n }\n }\n\n /**\n * @TODO this seems to handle patterns but fail at gradients.\n * @private\n */\n _setSVGBgOverlayColor(markup: string[], property: 'background' | 'overlay') {\n const filler = this[`${property}Color`];\n if (!filler) {\n return;\n }\n if (isFiller(filler)) {\n const repeat = (filler as Pattern).repeat || '',\n finalWidth = this.width,\n finalHeight = this.height,\n shouldInvert = this[`${property}Vpt`],\n additionalTransform = shouldInvert\n ? matrixToSVG(invertTransform(this.viewportTransform))\n : '';\n markup.push(\n `\\n`,\n );\n } else {\n markup.push(\n '\\n',\n );\n }\n }\n /* _TO_SVG_END_ */\n\n /**\n * Populates canvas with data from the specified JSON.\n * JSON format must conform to the one of {@link fabric.Canvas#toJSON}\n *\n * **IMPORTANT**: It is recommended to abort loading tasks before calling this method to prevent race conditions and unnecessary networking\n *\n * @param {String|Object} json JSON string or object\n * @param {Function} [reviver] Method for further parsing of JSON elements, called after each fabric object created.\n * @param {Object} [options] options\n * @param {AbortSignal} [options.signal] see https://developer.mozilla.org/en-US/docs/Web/API/AbortController/signal\n * @return {Promise} instance\n * @see {@link http://fabric5.fabricjs.com/fabric-intro-part-3#deserialization}\n * @see {@link http://jsfiddle.net/fabricjs/fmgXt/|jsFiddle demo}\n * @example loadFromJSON\n * canvas.loadFromJSON(json).then((canvas) => canvas.requestRenderAll());\n * @example loadFromJSON with reviver\n * canvas.loadFromJSON(json, function(o, object) {\n * // `o` = json object\n * // `object` = fabric.Object instance\n * // ... do some stuff ...\n * }).then((canvas) => {\n * ... canvas is restored, add your code.\n * });\n *\n */\n loadFromJSON(\n json: string | Record,\n reviver?: EnlivenObjectOptions['reviver'],\n { signal }: Abortable = {},\n ): Promise {\n if (!json) {\n return Promise.reject(new FabricError('`json` is undefined'));\n }\n\n // parse json if it wasn't already\n const { objects = [], ...serialized } =\n typeof json === 'string' ? JSON.parse(json) : json;\n const { backgroundImage, background, overlayImage, overlay, clipPath } =\n serialized;\n const renderOnAddRemove = this.renderOnAddRemove;\n this.renderOnAddRemove = false;\n\n return Promise.all([\n enlivenObjects(objects, {\n reviver,\n signal,\n }),\n enlivenObjectEnlivables(\n {\n backgroundImage,\n backgroundColor: background,\n overlayImage,\n overlayColor: overlay,\n clipPath,\n },\n { signal },\n ),\n ]).then(([enlived, enlivedMap]) => {\n this.clear();\n this.add(...enlived);\n this.set(serialized);\n this.set(enlivedMap);\n this.renderOnAddRemove = renderOnAddRemove;\n return this;\n });\n }\n\n /**\n * Clones canvas instance\n * @param {string[]} [properties] Array of properties to include in the cloned canvas and children\n */\n clone(properties: string[]) {\n const data = this.toObject(properties);\n const canvas = this.cloneWithoutData();\n return canvas.loadFromJSON(data);\n }\n\n /**\n * Clones canvas instance without cloning existing data.\n * This essentially copies canvas dimensions since loadFromJSON does not affect canvas size.\n */\n cloneWithoutData() {\n const el = createCanvasElementFor(this);\n return new (this.constructor as Constructor)(el);\n }\n\n /**\n * Exports canvas element to a dataurl image. Note that when multiplier is used, cropping is scaled appropriately\n * @param {Object} [options] Options object\n * @param {String} [options.format=png] The format of the output image. Either \"jpeg\" or \"png\"\n * @param {Number} [options.quality=1] Quality level (0..1). Only used for jpeg.\n * @param {Number} [options.multiplier=1] Multiplier to scale by, to have consistent\n * @param {Number} [options.left] Cropping left offset. Introduced in v1.2.14\n * @param {Number} [options.top] Cropping top offset. Introduced in v1.2.14\n * @param {Number} [options.width] Cropping width. Introduced in v1.2.14\n * @param {Number} [options.height] Cropping height. Introduced in v1.2.14\n * @param {Boolean} [options.enableRetinaScaling] Enable retina scaling for clone image. Introduce in 2.0.0\n * @param {(object: fabric.Object) => boolean} [options.filter] Function to filter objects.\n * @return {String} Returns a data: URL containing a representation of the object in the format specified by options.format\n * @see {@link https://jsfiddle.net/xsjua1rd/ demo}\n * @example Generate jpeg dataURL with lower quality\n * var dataURL = canvas.toDataURL({\n * format: 'jpeg',\n * quality: 0.8\n * });\n * @example Generate cropped png dataURL (clipping of canvas)\n * var dataURL = canvas.toDataURL({\n * format: 'png',\n * left: 100,\n * top: 100,\n * width: 200,\n * height: 200\n * });\n * @example Generate double scaled png dataURL\n * var dataURL = canvas.toDataURL({\n * format: 'png',\n * multiplier: 2\n * });\n * @example Generate dataURL with objects that overlap a specified object\n * var myObject;\n * var dataURL = canvas.toDataURL({\n * filter: (object) => object.isContainedWithinObject(myObject) || object.intersectsWithObject(myObject)\n * });\n */\n toDataURL(options = {} as TDataUrlOptions): string {\n const {\n format = 'png',\n quality = 1,\n multiplier = 1,\n enableRetinaScaling = false,\n } = options;\n const finalMultiplier =\n multiplier * (enableRetinaScaling ? this.getRetinaScaling() : 1);\n\n return toDataURL(\n this.toCanvasElement(finalMultiplier, options),\n format,\n quality,\n );\n }\n toBlob(options = {} as TDataUrlOptions): Promise {\n const {\n format = 'png',\n quality = 1,\n multiplier = 1,\n enableRetinaScaling = false,\n } = options;\n const finalMultiplier =\n multiplier * (enableRetinaScaling ? this.getRetinaScaling() : 1);\n\n return toBlob(\n this.toCanvasElement(finalMultiplier, options),\n format,\n quality,\n );\n }\n\n /**\n * Create a new HTMLCanvas element painted with the current canvas content.\n * No need to resize the actual one or repaint it.\n * Will transfer object ownership to a new canvas, paint it, and set everything back.\n * This is an intermediary step used to get to a dataUrl but also it is useful to\n * create quick image copies of a canvas without passing for the dataUrl string\n * @param {Number} [multiplier] a zoom factor.\n * @param {Object} [options] Cropping informations\n * @param {Number} [options.left] Cropping left offset.\n * @param {Number} [options.top] Cropping top offset.\n * @param {Number} [options.width] Cropping width.\n * @param {Number} [options.height] Cropping height.\n * @param {(object: fabric.Object) => boolean} [options.filter] Function to filter objects.\n */\n toCanvasElement(\n multiplier = 1,\n { width, height, left, top, filter } = {} as TToCanvasElementOptions,\n ): HTMLCanvasElement {\n const scaledWidth = (width || this.width) * multiplier,\n scaledHeight = (height || this.height) * multiplier,\n zoom = this.getZoom(),\n originalWidth = this.width,\n originalHeight = this.height,\n originalSkipControlsDrawing = this.skipControlsDrawing,\n newZoom = zoom * multiplier,\n vp = this.viewportTransform,\n translateX = (vp[4] - (left || 0)) * multiplier,\n translateY = (vp[5] - (top || 0)) * multiplier,\n newVp = [newZoom, 0, 0, newZoom, translateX, translateY] as TMat2D,\n originalRetina = this.enableRetinaScaling,\n canvasEl = createCanvasElementFor({\n width: scaledWidth,\n height: scaledHeight,\n }),\n objectsToRender = filter\n ? this._objects.filter((obj) => filter(obj))\n : this._objects;\n this.enableRetinaScaling = false;\n this.viewportTransform = newVp;\n this.width = scaledWidth;\n this.height = scaledHeight;\n this.skipControlsDrawing = true;\n this.calcViewportBoundaries();\n this.renderCanvas(canvasEl.getContext('2d')!, objectsToRender);\n this.viewportTransform = vp;\n this.width = originalWidth;\n this.height = originalHeight;\n this.calcViewportBoundaries();\n this.enableRetinaScaling = originalRetina;\n this.skipControlsDrawing = originalSkipControlsDrawing;\n return canvasEl;\n }\n\n /**\n * Waits until rendering has settled to destroy the canvas\n * @returns {Promise} a promise resolving to `true` once the canvas has been destroyed or to `false` if the canvas has was already destroyed\n * @throws if aborted by a consequent call\n */\n dispose() {\n !this.disposed &&\n this.elements.cleanupDOM({ width: this.width, height: this.height });\n runningAnimations.cancelByCanvas(this);\n this.disposed = true;\n return new Promise((resolve, reject) => {\n const task = () => {\n this.destroy();\n resolve(true);\n };\n task.kill = reject;\n if (this.__cleanupTask) {\n this.__cleanupTask.kill('aborted');\n }\n\n if (this.destroyed) {\n resolve(false);\n } else if (this.nextRenderHandle) {\n this.__cleanupTask = task;\n } else {\n task();\n }\n });\n }\n\n /**\n * Clears the canvas element, disposes objects and frees resources.\n *\n * Invoked as part of the **async** operation of {@link dispose}.\n *\n * **CAUTION**:\n *\n * This method is **UNSAFE**.\n * You may encounter a race condition using it if there's a requested render.\n * Call this method only if you are sure rendering has settled.\n * Consider using {@link dispose} as it is **SAFE**\n *\n * @private\n */\n destroy() {\n this.destroyed = true;\n this.cancelRequestedRender();\n this.forEachObject((object) => object.dispose());\n this._objects = [];\n if (this.backgroundImage) {\n this.backgroundImage.dispose();\n }\n this.backgroundImage = undefined;\n if (this.overlayImage) {\n this.overlayImage.dispose();\n }\n this.overlayImage = undefined;\n this.elements.dispose();\n }\n\n /**\n * Returns a string representation of an instance\n * @return {String} string representation of an instance\n */\n toString() {\n return `#`;\n }\n}\n","import type { TPointerEvent } from '../EventTypeDefs';\nimport { Point } from '../Point';\nimport { getScrollLeftTop } from './dom_misc';\n\nconst touchEvents = ['touchstart', 'touchmove', 'touchend'];\n\nfunction getTouchInfo(event: TouchEvent | MouseEvent): MouseEvent | Touch {\n const touchProp = (event as TouchEvent).changedTouches;\n if (touchProp && touchProp[0]) {\n return touchProp[0];\n }\n return event as MouseEvent;\n}\n\nexport const getPointer = (event: TPointerEvent): Point => {\n const element = event.target as HTMLElement,\n scroll = getScrollLeftTop(element),\n _evt = getTouchInfo(event);\n return new Point(_evt.clientX + scroll.left, _evt.clientY + scroll.top);\n};\n\nexport const isTouchEvent = (event: TPointerEvent) =>\n touchEvents.includes(event.type) ||\n (event as PointerEvent).pointerType === 'touch';\n\nexport const stopEvent = (e: Event) => {\n e.preventDefault();\n e.stopPropagation();\n};\n","import type { XY } from '../../Point';\nimport type { TBBox } from '../../typedefs';\n\n/**\n * Calculates bounding box (left, top, width, height) from given `points`\n * @param {XY[]} points\n * @return {Object} Object with left, top, width, height properties\n */\nexport const makeBoundingBoxFromPoints = (points: XY[]): TBBox => {\n let left = 0,\n top = 0,\n width = 0,\n height = 0;\n\n for (let i = 0, len = points.length; i < len; i++) {\n const { x, y } = points[i];\n if (x > width || !i) width = x;\n if (x < left || !i) left = x;\n if (y > height || !i) height = y;\n if (y < top || !i) top = y;\n }\n\n return {\n left,\n top,\n width: width - left,\n height: height - top,\n };\n};\n","import { Point } from '../../Point';\nimport { CENTER } from '../../constants';\nimport type { FabricObject } from '../../shapes/Object/Object';\nimport type { TMat2D } from '../../typedefs';\nimport { makeBoundingBoxFromPoints } from './boundingBoxFromPoints';\nimport {\n invertTransform,\n multiplyTransformMatrices,\n qrDecompose,\n} from './matrix';\n\n/**\n * given an object and a transform, apply the inverse transform to the object,\n * this is equivalent to remove from that object that transformation, so that\n * added in a space with the removed transform, the object will be the same as before.\n * Removing from an object a transform that scale by 2 is like scaling it by 1/2.\n * Removing from an object a transform that rotate by 30deg is like rotating by 30deg\n * in the opposite direction.\n * This util is used to add objects inside transformed groups or nested groups.\n * @param {FabricObject} object the object you want to transform\n * @param {TMat2D} transform the destination transform\n */\nexport const removeTransformFromObject = (\n object: FabricObject,\n transform: TMat2D,\n) => {\n const inverted = invertTransform(transform),\n finalTransform = multiplyTransformMatrices(\n inverted,\n object.calcOwnMatrix(),\n );\n applyTransformToObject(object, finalTransform);\n};\n\n/**\n * given an object and a transform, apply the transform to the object.\n * this is equivalent to change the space where the object is drawn.\n * Adding to an object a transform that scale by 2 is like scaling it by 2.\n * This is used when removing an object from an active selection for example.\n * @param {FabricObject} object the object you want to transform\n * @param {Array} transform the destination transform\n */\nexport const addTransformToObject = (object: FabricObject, transform: TMat2D) =>\n applyTransformToObject(\n object,\n multiplyTransformMatrices(transform, object.calcOwnMatrix()),\n );\n\n/**\n * discard an object transform state and apply the one from the matrix.\n * @param {FabricObject} object the object you want to transform\n * @param {Array} transform the destination transform\n */\nexport const applyTransformToObject = (\n object: FabricObject,\n transform: TMat2D,\n) => {\n const { translateX, translateY, scaleX, scaleY, ...otherOptions } =\n qrDecompose(transform),\n center = new Point(translateX, translateY);\n object.flipX = false;\n object.flipY = false;\n Object.assign(object, otherOptions);\n object.set({ scaleX, scaleY });\n object.setPositionByOrigin(center, CENTER, CENTER);\n};\n/**\n * reset an object transform state to neutral. Top and left are not accounted for\n * @param {FabricObject} target object to transform\n */\nexport const resetObjectTransform = (target: FabricObject) => {\n target.scaleX = 1;\n target.scaleY = 1;\n target.skewX = 0;\n target.skewY = 0;\n target.flipX = false;\n target.flipY = false;\n target.rotate(0);\n};\n\n/**\n * Extract Object transform values\n * @param {FabricObject} target object to read from\n * @return {Object} Components of transform\n */\nexport const saveObjectTransform = (target: FabricObject) => ({\n scaleX: target.scaleX,\n scaleY: target.scaleY,\n skewX: target.skewX,\n skewY: target.skewY,\n angle: target.angle,\n left: target.left,\n flipX: target.flipX,\n flipY: target.flipY,\n top: target.top,\n});\n\n/**\n * given a width and height, return the size of the bounding box\n * that can contains the box with width/height with applied transform.\n * Use to calculate the boxes around objects for controls.\n * @param {Number} width\n * @param {Number} height\n * @param {TMat2D} t\n * @returns {Point} size\n */\nexport const sizeAfterTransform = (\n width: number,\n height: number,\n t: TMat2D,\n) => {\n const dimX = width / 2,\n dimY = height / 2,\n points = [\n new Point(-dimX, -dimY),\n new Point(dimX, -dimY),\n new Point(-dimX, dimY),\n new Point(dimX, dimY),\n ].map((p) => p.transform(t)),\n bbox = makeBoundingBoxFromPoints(points);\n return new Point(bbox.width, bbox.height);\n};\n","import { iMatrix } from '../../constants';\nimport type { Point } from '../../Point';\nimport type { FabricObject } from '../../shapes/Object/Object';\nimport type { TMat2D } from '../../typedefs';\nimport { invertTransform, multiplyTransformMatrices } from './matrix';\nimport { applyTransformToObject } from './objectTransforms';\n\n/**\n * We are actually looking for the transformation from the destination plane to the source plane (change of basis matrix)\\\n * The object will exist on the destination plane and we want it to seem unchanged by it so we invert the destination matrix (`to`) and then apply the source matrix (`from`)\n * @param [from]\n * @param [to]\n * @returns\n */\nexport const calcPlaneChangeMatrix = (\n from: TMat2D = iMatrix,\n to: TMat2D = iMatrix,\n) => multiplyTransformMatrices(invertTransform(to), from);\n\n/**\n * Sends a point from the source coordinate plane to the destination coordinate plane.\\\n * From the canvas/viewer's perspective the point remains unchanged.\n *\n * @example Send point from canvas plane to group plane\n * var obj = new Rect({ left: 20, top: 20, width: 60, height: 60, strokeWidth: 0 });\n * var group = new Group([obj], { strokeWidth: 0 });\n * var sentPoint1 = sendPointToPlane(new Point(50, 50), undefined, group.calcTransformMatrix());\n * var sentPoint2 = sendPointToPlane(new Point(50, 50), iMatrix, group.calcTransformMatrix());\n * console.log(sentPoint1, sentPoint2) // both points print (0,0) which is the center of group\n *\n * @param {Point} point\n * @param {TMat2D} [from] plane matrix containing object. Passing `undefined` is equivalent to passing the identity matrix, which means `point` exists in the canvas coordinate plane.\n * @param {TMat2D} [to] destination plane matrix to contain object. Passing `undefined` means `point` should be sent to the canvas coordinate plane.\n * @returns {Point} transformed point\n */\nexport const sendPointToPlane = (\n point: Point,\n from: TMat2D = iMatrix,\n to: TMat2D = iMatrix,\n): Point => point.transform(calcPlaneChangeMatrix(from, to));\n\n/**\n * See {@link sendPointToPlane}\n */\nexport const sendVectorToPlane = (\n point: Point,\n from: TMat2D = iMatrix,\n to: TMat2D = iMatrix,\n): Point => point.transform(calcPlaneChangeMatrix(from, to), true);\n\n/**\n *\n * A util that abstracts applying transform to objects.\\\n * Sends `object` to the destination coordinate plane by applying the relevant transformations.\\\n * Changes the space/plane where `object` is drawn.\\\n * From the canvas/viewer's perspective `object` remains unchanged.\n *\n * @example Move clip path from one object to another while preserving it's appearance as viewed by canvas/viewer\n * let obj, obj2;\n * let clipPath = new Circle({ radius: 50 });\n * obj.clipPath = clipPath;\n * // render\n * sendObjectToPlane(clipPath, obj.calcTransformMatrix(), obj2.calcTransformMatrix());\n * obj.clipPath = undefined;\n * obj2.clipPath = clipPath;\n * // render, clipPath now clips obj2 but seems unchanged from the eyes of the viewer\n *\n * @example Clip an object's clip path with an existing object\n * let obj, existingObj;\n * let clipPath = new Circle({ radius: 50 });\n * obj.clipPath = clipPath;\n * let transformTo = multiplyTransformMatrices(obj.calcTransformMatrix(), clipPath.calcTransformMatrix());\n * sendObjectToPlane(existingObj, existingObj.group?.calcTransformMatrix(), transformTo);\n * clipPath.clipPath = existingObj;\n *\n * @param {FabricObject} object\n * @param {Matrix} [from] plane matrix containing object. Passing `undefined` is equivalent to passing the identity matrix, which means `object` is a direct child of canvas.\n * @param {Matrix} [to] destination plane matrix to contain object. Passing `undefined` means `object` should be sent to the canvas coordinate plane.\n * @returns {Matrix} the transform matrix that was applied to `object`\n */\nexport const sendObjectToPlane = (\n object: FabricObject,\n from?: TMat2D,\n to?: TMat2D,\n): TMat2D => {\n const t = calcPlaneChangeMatrix(from, to);\n applyTransformToObject(\n object,\n multiplyTransformMatrices(t, object.calcOwnMatrix()),\n );\n return t;\n};\n","import type {\n ObjectModificationEvents,\n TModificationEvents,\n} from '../EventTypeDefs';\n\nexport const fireEvent = (\n eventName: TModificationEvents,\n options: ObjectModificationEvents[typeof eventName],\n) => {\n const {\n transform: { target },\n } = options;\n target.canvas?.fire(`object:${eventName}`, {\n ...options,\n target,\n });\n target.fire(eventName, options);\n};\n","import type { TOriginX, TOriginY } from '../../typedefs';\n\nconst originOffset = {\n left: -0.5,\n top: -0.5,\n center: 0,\n bottom: 0.5,\n right: 0.5,\n};\n/**\n * Resolves origin value relative to center\n * @private\n * @param {TOriginX | TOriginY} originValue originX / originY\n * @returns number\n */\n\nexport const resolveOrigin = (\n originValue: TOriginX | TOriginY | number,\n): number =>\n typeof originValue === 'string'\n ? originOffset[originValue]\n : originValue - 0.5;\n","import type { XY } from '../../Point';\nimport { Point } from '../../Point';\nimport type { TRadian } from '../../typedefs';\n\nconst unitVectorX = new Point(1, 0);\nconst zero = new Point();\n\n/**\n * Rotates `vector` with `radians`\n * @param {Point} vector The vector to rotate (x and y)\n * @param {Number} radians The radians of the angle for the rotation\n * @return {Point} The new rotated point\n */\nexport const rotateVector = (vector: Point, radians: TRadian) =>\n vector.rotate(radians);\n\n/**\n * Creates a vector from points represented as a point\n *\n * @param {Point} from\n * @param {Point} to\n * @returns {Point} vector\n */\nexport const createVector = (from: XY, to: XY): Point =>\n new Point(to).subtract(from);\n\n/**\n * return the magnitude of a vector\n * @return {number}\n */\nexport const magnitude = (point: Point) => point.distanceFrom(zero);\n\n/**\n * Calculates the angle between 2 vectors\n * @param {Point} a\n * @param {Point} b\n * @returns the angle in radians from `a` to `b`\n */\nexport const calcAngleBetweenVectors = (a: Point, b: Point): TRadian =>\n Math.atan2(crossProduct(a, b), dotProduct(a, b)) as TRadian;\n\n/**\n * Calculates the angle between the x axis and the vector\n * @param {Point} v\n * @returns the angle in radians of `v`\n */\nexport const calcVectorRotation = (v: Point) =>\n calcAngleBetweenVectors(unitVectorX, v);\n\n/**\n * @param {Point} v\n * @returns {Point} vector representing the unit vector pointing to the direction of `v`\n */\nexport const getUnitVector = (v: Point): Point =>\n v.eq(zero) ? v : v.scalarDivide(magnitude(v));\n\n/**\n * @param {Point} v\n * @param {Boolean} [counterClockwise] the direction of the orthogonal vector, defaults to `true`\n * @returns {Point} the unit orthogonal vector\n */\nexport const getOrthonormalVector = (\n v: Point,\n counterClockwise = true,\n): Point =>\n getUnitVector(new Point(-v.y, v.x).scalarMultiply(counterClockwise ? 1 : -1));\n\n/**\n * Cross product of two vectors in 2D\n * @param {Point} a\n * @param {Point} b\n * @returns {number} the magnitude of Z vector\n */\nexport const crossProduct = (a: Point, b: Point): number =>\n a.x * b.y - a.y * b.x;\n\n/**\n * Dot product of two vectors in 2D\n * @param {Point} a\n * @param {Point} b\n * @returns {number}\n */\nexport const dotProduct = (a: Point, b: Point): number => a.x * b.x + a.y * b.y;\n\n/**\n * Checks if the vector is between two others. It is considered\n * to be inside when the vector to be tested is between the\n * initial vector and the final vector (included) in a counterclockwise direction.\n * @param {Point} t vector to be tested\n * @param {Point} a initial vector\n * @param {Point} b final vector\n * @returns {boolean} true if the vector is among the others\n */\nexport const isBetweenVectors = (t: Point, a: Point, b: Point): boolean => {\n if (t.eq(a) || t.eq(b)) return true;\n const AxB = crossProduct(a, b),\n AxT = crossProduct(a, t),\n BxT = crossProduct(b, t);\n return AxB >= 0 ? AxT >= 0 && BxT <= 0 : !(AxT <= 0 && BxT >= 0);\n};\n","import type {\n TPointerEvent,\n Transform,\n TransformAction,\n BasicTransformEvent,\n} from '../EventTypeDefs';\nimport { resolveOrigin } from '../util/misc/resolveOrigin';\nimport { Point } from '../Point';\nimport type { FabricObject } from '../shapes/Object/FabricObject';\nimport type { TOriginX, TOriginY } from '../typedefs';\nimport { degreesToRadians } from '../util/misc/radiansDegreesConversion';\nimport type { Control } from './Control';\nimport { CENTER, quarterPI, twoMathPi } from '../constants';\nimport { calcVectorRotation, createVector } from '../util/misc/vectors';\nimport type { TOCoord } from '../shapes/Object/InteractiveObject';\nimport { sendPointToPlane } from '../util/misc/planeChange';\n\nexport const NOT_ALLOWED_CURSOR = 'not-allowed';\n\n/**\n * @param {Boolean} alreadySelected true if target is already selected\n * @param {String} corner a string representing the corner ml, mr, tl ...\n * @param {Event} e Event object\n * @param {FabricObject} [target] inserted back to help overriding. Unused\n */\nexport const getActionFromCorner = (\n alreadySelected: boolean,\n corner: string | undefined,\n e: TPointerEvent,\n target: FabricObject,\n) => {\n if (!corner || !alreadySelected) {\n return 'drag';\n }\n const control = target.controls[corner];\n return control.getActionName(e, control, target);\n};\n\n/**\n * Checks if transform is centered\n * @param {Object} transform transform data\n * @return {Boolean} true if transform is centered\n */\nexport function isTransformCentered(transform: Transform) {\n return (\n resolveOrigin(transform.originX) === resolveOrigin(CENTER) &&\n resolveOrigin(transform.originY) === resolveOrigin(CENTER)\n );\n}\n\nexport function invertOrigin(origin: TOriginX | TOriginY) {\n return -resolveOrigin(origin) + 0.5;\n}\n\nexport const isLocked = (\n target: FabricObject,\n lockingKey:\n | 'lockMovementX'\n | 'lockMovementY'\n | 'lockRotation'\n | 'lockScalingX'\n | 'lockScalingY'\n | 'lockSkewingX'\n | 'lockSkewingY'\n | 'lockScalingFlip',\n) => target[lockingKey];\n\nexport const commonEventInfo: TransformAction<\n Transform,\n BasicTransformEvent\n> = (eventData, transform, x, y) => {\n return {\n e: eventData,\n transform,\n pointer: new Point(x, y),\n };\n};\n\n/**\n * Combine control position and object angle to find the control direction compared\n * to the object center.\n * @param {FabricObject} fabricObject the fabric object for which we are rendering controls\n * @param {Control} control the control class\n * @return {Number} 0 - 7 a quadrant number\n */\nexport function findCornerQuadrant(\n fabricObject: FabricObject,\n control: Control,\n coord: TOCoord,\n): number {\n const target = coord;\n const center = sendPointToPlane(\n fabricObject.getCenterPoint(),\n fabricObject.canvas!.viewportTransform,\n undefined,\n );\n const angle = calcVectorRotation(createVector(center, target)) + twoMathPi;\n return Math.round((angle % twoMathPi) / quarterPI);\n}\n\n/**\n * @returns the normalized point (rotated relative to center) in local coordinates\n */\nfunction normalizePoint(\n target: FabricObject,\n point: Point,\n originX: TOriginX,\n originY: TOriginY,\n): Point {\n const center = target.getRelativeCenterPoint(),\n p =\n typeof originX !== 'undefined' && typeof originY !== 'undefined'\n ? target.translateToGivenOrigin(\n center,\n CENTER,\n CENTER,\n originX,\n originY,\n )\n : new Point(target.left, target.top),\n p2 = target.angle\n ? point.rotate(-degreesToRadians(target.angle), center)\n : point;\n return p2.subtract(p);\n}\n\n/**\n * Transforms a point to the offset from the given origin\n * @param {Object} transform\n * @param {String} originX\n * @param {String} originY\n * @param {number} x\n * @param {number} y\n * @return {Fabric.Point} the normalized point\n */\nexport function getLocalPoint(\n { target, corner }: Transform,\n originX: TOriginX,\n originY: TOriginY,\n x: number,\n y: number,\n) {\n const control = target.controls[corner],\n zoom = target.canvas?.getZoom() || 1,\n padding = target.padding / zoom,\n localPoint = normalizePoint(target, new Point(x, y), originX, originY);\n if (localPoint.x >= padding) {\n localPoint.x -= padding;\n }\n if (localPoint.x <= -padding) {\n localPoint.x += padding;\n }\n if (localPoint.y >= padding) {\n localPoint.y -= padding;\n }\n if (localPoint.y <= padding) {\n localPoint.y += padding;\n }\n localPoint.x -= control.offsetX;\n localPoint.y -= control.offsetY;\n return localPoint;\n}\n","import type { TransformActionHandler } from '../EventTypeDefs';\nimport { LEFT, TOP, MOVING } from '../constants';\nimport { fireEvent } from './fireEvent';\nimport { commonEventInfo, isLocked } from './util';\n\n/**\n * Action handler\n * @private\n * @param {Event} eventData javascript event that is doing the transform\n * @param {Object} transform javascript object containing a series of information around the current transform\n * @param {number} x current mouse x position, canvas normalized\n * @param {number} y current mouse y position, canvas normalized\n * @return {Boolean} true if the translation occurred\n */\nexport const dragHandler: TransformActionHandler = (\n eventData,\n transform,\n x,\n y,\n) => {\n const { target, offsetX, offsetY } = transform,\n newLeft = x - offsetX,\n newTop = y - offsetY,\n moveX = !isLocked(target, 'lockMovementX') && target.left !== newLeft,\n moveY = !isLocked(target, 'lockMovementY') && target.top !== newTop;\n moveX && target.set(LEFT, newLeft);\n moveY && target.set(TOP, newTop);\n if (moveX || moveY) {\n fireEvent(MOVING, commonEventInfo(eventData, transform, x, y));\n }\n return moveX || moveY;\n};\n","/**\n * Map of the 148 color names with HEX code\n * @see: https://www.w3.org/TR/css3-color/#svg-color\n */\nexport const ColorNameMap = {\n aliceblue: '#F0F8FF',\n antiquewhite: '#FAEBD7',\n aqua: '#0FF',\n aquamarine: '#7FFFD4',\n azure: '#F0FFFF',\n beige: '#F5F5DC',\n bisque: '#FFE4C4',\n black: '#000',\n blanchedalmond: '#FFEBCD',\n blue: '#00F',\n blueviolet: '#8A2BE2',\n brown: '#A52A2A',\n burlywood: '#DEB887',\n cadetblue: '#5F9EA0',\n chartreuse: '#7FFF00',\n chocolate: '#D2691E',\n coral: '#FF7F50',\n cornflowerblue: '#6495ED',\n cornsilk: '#FFF8DC',\n crimson: '#DC143C',\n cyan: '#0FF',\n darkblue: '#00008B',\n darkcyan: '#008B8B',\n darkgoldenrod: '#B8860B',\n darkgray: '#A9A9A9',\n darkgrey: '#A9A9A9',\n darkgreen: '#006400',\n darkkhaki: '#BDB76B',\n darkmagenta: '#8B008B',\n darkolivegreen: '#556B2F',\n darkorange: '#FF8C00',\n darkorchid: '#9932CC',\n darkred: '#8B0000',\n darksalmon: '#E9967A',\n darkseagreen: '#8FBC8F',\n darkslateblue: '#483D8B',\n darkslategray: '#2F4F4F',\n darkslategrey: '#2F4F4F',\n darkturquoise: '#00CED1',\n darkviolet: '#9400D3',\n deeppink: '#FF1493',\n deepskyblue: '#00BFFF',\n dimgray: '#696969',\n dimgrey: '#696969',\n dodgerblue: '#1E90FF',\n firebrick: '#B22222',\n floralwhite: '#FFFAF0',\n forestgreen: '#228B22',\n fuchsia: '#F0F',\n gainsboro: '#DCDCDC',\n ghostwhite: '#F8F8FF',\n gold: '#FFD700',\n goldenrod: '#DAA520',\n gray: '#808080',\n grey: '#808080',\n green: '#008000',\n greenyellow: '#ADFF2F',\n honeydew: '#F0FFF0',\n hotpink: '#FF69B4',\n indianred: '#CD5C5C',\n indigo: '#4B0082',\n ivory: '#FFFFF0',\n khaki: '#F0E68C',\n lavender: '#E6E6FA',\n lavenderblush: '#FFF0F5',\n lawngreen: '#7CFC00',\n lemonchiffon: '#FFFACD',\n lightblue: '#ADD8E6',\n lightcoral: '#F08080',\n lightcyan: '#E0FFFF',\n lightgoldenrodyellow: '#FAFAD2',\n lightgray: '#D3D3D3',\n lightgrey: '#D3D3D3',\n lightgreen: '#90EE90',\n lightpink: '#FFB6C1',\n lightsalmon: '#FFA07A',\n lightseagreen: '#20B2AA',\n lightskyblue: '#87CEFA',\n lightslategray: '#789',\n lightslategrey: '#789',\n lightsteelblue: '#B0C4DE',\n lightyellow: '#FFFFE0',\n lime: '#0F0',\n limegreen: '#32CD32',\n linen: '#FAF0E6',\n magenta: '#F0F',\n maroon: '#800000',\n mediumaquamarine: '#66CDAA',\n mediumblue: '#0000CD',\n mediumorchid: '#BA55D3',\n mediumpurple: '#9370DB',\n mediumseagreen: '#3CB371',\n mediumslateblue: '#7B68EE',\n mediumspringgreen: '#00FA9A',\n mediumturquoise: '#48D1CC',\n mediumvioletred: '#C71585',\n midnightblue: '#191970',\n mintcream: '#F5FFFA',\n mistyrose: '#FFE4E1',\n moccasin: '#FFE4B5',\n navajowhite: '#FFDEAD',\n navy: '#000080',\n oldlace: '#FDF5E6',\n olive: '#808000',\n olivedrab: '#6B8E23',\n orange: '#FFA500',\n orangered: '#FF4500',\n orchid: '#DA70D6',\n palegoldenrod: '#EEE8AA',\n palegreen: '#98FB98',\n paleturquoise: '#AFEEEE',\n palevioletred: '#DB7093',\n papayawhip: '#FFEFD5',\n peachpuff: '#FFDAB9',\n peru: '#CD853F',\n pink: '#FFC0CB',\n plum: '#DDA0DD',\n powderblue: '#B0E0E6',\n purple: '#800080',\n rebeccapurple: '#639',\n red: '#F00',\n rosybrown: '#BC8F8F',\n royalblue: '#4169E1',\n saddlebrown: '#8B4513',\n salmon: '#FA8072',\n sandybrown: '#F4A460',\n seagreen: '#2E8B57',\n seashell: '#FFF5EE',\n sienna: '#A0522D',\n silver: '#C0C0C0',\n skyblue: '#87CEEB',\n slateblue: '#6A5ACD',\n slategray: '#708090',\n slategrey: '#708090',\n snow: '#FFFAFA',\n springgreen: '#00FF7F',\n steelblue: '#4682B4',\n tan: '#D2B48C',\n teal: '#008080',\n thistle: '#D8BFD8',\n tomato: '#FF6347',\n turquoise: '#40E0D0',\n violet: '#EE82EE',\n wheat: '#F5DEB3',\n white: '#FFF',\n whitesmoke: '#F5F5F5',\n yellow: '#FF0',\n yellowgreen: '#9ACD32',\n};\n","import type { TRGBAColorSource } from './typedefs';\n\n/**\n * @param {Number} p\n * @param {Number} q\n * @param {Number} t\n * @return {Number}\n */\nexport const hue2rgb = (p: number, q: number, t: number): number => {\n if (t < 0) {\n t += 1;\n }\n if (t > 1) {\n t -= 1;\n }\n if (t < 1 / 6) {\n return p + (q - p) * 6 * t;\n }\n if (t < 1 / 2) {\n return q;\n }\n if (t < 2 / 3) {\n return p + (q - p) * (2 / 3 - t) * 6;\n }\n return p;\n};\n\n/**\n * Adapted from {@link https://gist.github.com/mjackson/5311256 https://gist.github.com/mjackson}\n * @param {Number} r Red color value\n * @param {Number} g Green color value\n * @param {Number} b Blue color value\n * @param {Number} a Alpha color value pass through\n * @return {TRGBColorSource} Hsl color\n */\nexport const rgb2Hsl = (\n r: number,\n g: number,\n b: number,\n a: number,\n): TRGBAColorSource => {\n r /= 255;\n g /= 255;\n b /= 255;\n const maxValue = Math.max(r, g, b),\n minValue = Math.min(r, g, b);\n\n let h!: number, s: number;\n const l = (maxValue + minValue) / 2;\n\n if (maxValue === minValue) {\n h = s = 0; // achromatic\n } else {\n const d = maxValue - minValue;\n s = l > 0.5 ? d / (2 - maxValue - minValue) : d / (maxValue + minValue);\n switch (maxValue) {\n case r:\n h = (g - b) / d + (g < b ? 6 : 0);\n break;\n case g:\n h = (b - r) / d + 2;\n break;\n case b:\n h = (r - g) / d + 4;\n break;\n }\n h /= 6;\n }\n\n return [Math.round(h * 360), Math.round(s * 100), Math.round(l * 100), a];\n};\n\nexport const fromAlphaToFloat = (value = '1') =>\n parseFloat(value) / (value.endsWith('%') ? 100 : 1);\n\n/**\n * Convert a value in the inclusive range [0, 255] to hex\n */\nexport const hexify = (value: number) =>\n Math.min(Math.round(value), 255).toString(16).toUpperCase().padStart(2, '0');\n\n/**\n * Calculate the grey average value for rgb and pass through alpha\n */\nexport const greyAverage = ([\n r,\n g,\n b,\n a = 1,\n]: TRGBAColorSource): TRGBAColorSource => {\n const avg = Math.round(r * 0.3 + g * 0.59 + b * 0.11);\n return [avg, avg, avg, a];\n};\n","import { radiansToDegrees } from '../util/misc/radiansDegreesConversion';\nimport { ColorNameMap } from './color_map';\nimport { reHSLa, reHex, reRGBa } from './constants';\nimport type { TRGBAColorSource, TColorArg } from './typedefs';\nimport {\n hue2rgb,\n hexify,\n rgb2Hsl,\n fromAlphaToFloat,\n greyAverage,\n} from './util';\n\n/**\n * @class Color common color operations\n * @see {@link http://fabric5.fabricjs.com/fabric-intro-part-2#colors colors}\n */\nexport class Color {\n declare private _source: TRGBAColorSource;\n isUnrecognised = false;\n\n /**\n *\n * @param {string} [color] optional in hex or rgb(a) or hsl format or from known color list\n */\n constructor(color?: TColorArg) {\n if (!color) {\n // we default to black as canvas does\n this.setSource([0, 0, 0, 1]);\n } else if (color instanceof Color) {\n this.setSource([...color._source]);\n } else if (Array.isArray(color)) {\n const [r, g, b, a = 1] = color;\n this.setSource([r, g, b, a]);\n } else {\n this.setSource(this._tryParsingColor(color));\n }\n }\n\n /**\n * @private\n * @param {string} [color] Color value to parse\n * @returns {TRGBAColorSource}\n */\n protected _tryParsingColor(color: string) {\n color = color.toLowerCase();\n if (color in ColorNameMap) {\n color = ColorNameMap[color as keyof typeof ColorNameMap];\n }\n return color === 'transparent'\n ? ([255, 255, 255, 0] as TRGBAColorSource)\n : Color.sourceFromHex(color) ||\n Color.sourceFromRgb(color) ||\n Color.sourceFromHsl(color) ||\n // color is not recognized\n // we default to black as canvas does\n // eslint-disable-next-line no-constant-binary-expression\n ((this.isUnrecognised = true) && ([0, 0, 0, 1] as TRGBAColorSource));\n }\n\n /**\n * Returns source of this color (where source is an array representation; ex: [200, 200, 100, 1])\n * @return {TRGBAColorSource}\n */\n getSource() {\n return this._source;\n }\n\n /**\n * Sets source of this color (where source is an array representation; ex: [200, 200, 100, 1])\n * @param {TRGBAColorSource} source\n */\n setSource(source: TRGBAColorSource) {\n this._source = source;\n }\n\n /**\n * Returns color representation in RGB format\n * @return {String} ex: rgb(0-255,0-255,0-255)\n */\n toRgb() {\n const [r, g, b] = this.getSource();\n return `rgb(${r},${g},${b})`;\n }\n\n /**\n * Returns color representation in RGBA format\n * @return {String} ex: rgba(0-255,0-255,0-255,0-1)\n */\n toRgba() {\n return `rgba(${this.getSource().join(',')})`;\n }\n\n /**\n * Returns color representation in HSL format\n * @return {String} ex: hsl(0-360,0%-100%,0%-100%)\n */\n toHsl() {\n const [h, s, l] = rgb2Hsl(...this.getSource());\n return `hsl(${h},${s}%,${l}%)`;\n }\n\n /**\n * Returns color representation in HSLA format\n * @return {String} ex: hsla(0-360,0%-100%,0%-100%,0-1)\n */\n toHsla() {\n const [h, s, l, a] = rgb2Hsl(...this.getSource());\n return `hsla(${h},${s}%,${l}%,${a})`;\n }\n\n /**\n * Returns color representation in HEX format\n * @return {String} ex: FF5555\n */\n toHex() {\n const fullHex = this.toHexa();\n return fullHex.slice(0, 6);\n }\n\n /**\n * Returns color representation in HEXA format\n * @return {String} ex: FF5555CC\n */\n toHexa() {\n const [r, g, b, a] = this.getSource();\n return `${hexify(r)}${hexify(g)}${hexify(b)}${hexify(Math.round(a * 255))}`;\n }\n\n /**\n * Gets value of alpha channel for this color\n * @return {Number} 0-1\n */\n getAlpha() {\n return this.getSource()[3];\n }\n\n /**\n * Sets value of alpha channel for this color\n * @param {Number} alpha Alpha value 0-1\n * @return {Color} thisArg\n */\n setAlpha(alpha: number) {\n this._source[3] = alpha;\n return this;\n }\n\n /**\n * Transforms color to its grayscale representation\n * @return {Color} thisArg\n */\n toGrayscale() {\n this.setSource(greyAverage(this.getSource()));\n return this;\n }\n\n /**\n * Transforms color to its black and white representation\n * @param {Number} threshold\n * @return {Color} thisArg\n */\n toBlackWhite(threshold: number) {\n const [average, , , a] = greyAverage(this.getSource()),\n bOrW = average < (threshold || 127) ? 0 : 255;\n this.setSource([bOrW, bOrW, bOrW, a]);\n return this;\n }\n\n /**\n * Overlays color with another color\n * @param {String|Color} otherColor\n * @return {Color} thisArg\n */\n overlayWith(otherColor: string | Color) {\n if (!(otherColor instanceof Color)) {\n otherColor = new Color(otherColor);\n }\n\n const source = this.getSource(),\n otherAlpha = 0.5,\n otherSource = otherColor.getSource(),\n [R, G, B] = source.map((value, index) =>\n Math.round(value * (1 - otherAlpha) + otherSource[index] * otherAlpha),\n );\n\n this.setSource([R, G, B, source[3]]);\n return this;\n }\n\n /**\n * Returns new color object, when given a color in RGB format\n * @param {String} color Color value ex: rgb(0-255,0-255,0-255)\n * @return {Color}\n */\n static fromRgb(color: string): Color {\n return Color.fromRgba(color);\n }\n\n /**\n * Returns new color object, when given a color in RGBA format\n * @param {String} color\n * @return {Color}\n */\n static fromRgba(color: string): Color {\n return new Color(Color.sourceFromRgb(color));\n }\n\n /**\n * Returns array representation (ex: [100, 100, 200, 1]) of a color that's in RGB or RGBA format\n * @param {String} color Color value ex: rgb(0-255,0-255,0-255), rgb(0%-100%,0%-100%,0%-100%)\n * @return {TRGBAColorSource | undefined} source\n */\n static sourceFromRgb(color: string): TRGBAColorSource | undefined {\n const match = color.match(reRGBa());\n if (match) {\n const [r, g, b] = match.slice(1, 4).map((value) => {\n const parsedValue = parseFloat(value);\n return value.endsWith('%')\n ? Math.round(parsedValue * 2.55)\n : parsedValue;\n });\n return [r, g, b, fromAlphaToFloat(match[4])];\n }\n }\n\n /**\n * Returns new color object, when given a color in HSL format\n * @param {String} color Color value ex: hsl(0-260,0%-100%,0%-100%)\n * @return {Color}\n */\n static fromHsl(color: string): Color {\n return Color.fromHsla(color);\n }\n\n /**\n * Returns new color object, when given a color in HSLA format\n * @param {String} color\n * @return {Color}\n */\n static fromHsla(color: string): Color {\n return new Color(Color.sourceFromHsl(color));\n }\n\n /**\n * Returns array representation (ex: [100, 100, 200, 1]) of a color that's in HSL or HSLA format.\n * Adapted from https://github.com/mjijackson\n * @param {String} color Color value ex: hsl(0-360,0%-100%,0%-100%) or hsla(0-360,0%-100%,0%-100%, 0-1)\n * @return {TRGBAColorSource | undefined} source\n * @see http://http://www.w3.org/TR/css3-color/#hsl-color\n */\n static sourceFromHsl(color: string): TRGBAColorSource | undefined {\n const match = color.match(reHSLa());\n if (!match) {\n return;\n }\n const match1degrees = Color.parseAngletoDegrees(match[1]);\n\n const h = (((match1degrees % 360) + 360) % 360) / 360,\n s = parseFloat(match[2]) / 100,\n l = parseFloat(match[3]) / 100;\n let r: number, g: number, b: number;\n\n if (s === 0) {\n r = g = b = l;\n } else {\n const q = l <= 0.5 ? l * (s + 1) : l + s - l * s,\n p = l * 2 - q;\n\n r = hue2rgb(p, q, h + 1 / 3);\n g = hue2rgb(p, q, h);\n b = hue2rgb(p, q, h - 1 / 3);\n }\n\n return [\n Math.round(r * 255),\n Math.round(g * 255),\n Math.round(b * 255),\n fromAlphaToFloat(match[4]),\n ];\n }\n\n /**\n * Returns new color object, when given a color in HEX format\n * @param {String} color Color value ex: FF5555\n * @return {Color}\n */\n static fromHex(color: string): Color {\n return new Color(Color.sourceFromHex(color));\n }\n\n /**\n * Returns array representation (ex: [100, 100, 200, 1]) of a color that's in HEX format\n * @param {String} color ex: FF5555 or FF5544CC (RGBa)\n * @return {TRGBAColorSource | undefined} source\n */\n static sourceFromHex(color: string): TRGBAColorSource | undefined {\n if (color.match(reHex())) {\n const value = color.slice(color.indexOf('#') + 1),\n isShortNotation = value.length <= 4;\n let expandedValue: string[];\n if (isShortNotation) {\n expandedValue = value.split('').map((hex) => hex + hex);\n } else {\n expandedValue = value.match(/.{2}/g)!;\n }\n const [r, g, b, a = 255] = expandedValue.map((hexCouple) =>\n parseInt(hexCouple, 16),\n );\n return [r, g, b, a / 255];\n }\n }\n\n /**\n * Converts a string that could be any angle notation (50deg, 0.5turn, 2rad)\n * into degrees without the 'deg' suffix\n * @param {String} value ex: 0deg, 0.5turn, 2rad\n * @return {Number} number in degrees or NaN if inputs are invalid\n */\n static parseAngletoDegrees(value: string): number {\n const lowercase = value.toLowerCase();\n const numeric = parseFloat(lowercase);\n\n if (lowercase.includes('rad')) {\n return radiansToDegrees(numeric);\n }\n\n if (lowercase.includes('turn')) {\n return numeric * 360;\n }\n\n // Value is probably just a number already in degrees eg '50'\n return numeric;\n }\n}\n","/**\n * Regex matching color in RGB or RGBA formats (ex: `rgb(0, 0, 0)`, `rgba(255, 100, 10, 0.5)`, `rgba( 255 , 100 , 10 , 0.5 )`, `rgb(1,1,1)`, `rgba(100%, 60%, 10%, 0.5)`)\n * Also matching rgba(r g b / a) as per new specs\n * https://developer.mozilla.org/en-US/docs/Web/CSS/color_value/rgb\n * Formal syntax at the time of writing:\n * =\n * rgb( [ | none ]{3} [ / [ | none ] ]? ) |\n * rgb( [ | none ]{3} [ / [ | none ] ]? )\n * = | \n *\n * For learners this is how you can read this regex\n * Regular expression for matching an rgba or rgb CSS color value\n *\n * /^ # Beginning of the string\n * rgba? # \"rgb\" or \"rgba\"\n * \\(\\s* # Opening parenthesis and optional whitespace\n * (\\d{0,3} # 0 to three digits R channel\n * (?:\\.\\d+)? # Optional decimal with one or more digits\n * ) # End of capturing group for the first color component\n * %? # Optional percent sign after the first color component\n * \\s* # Optional whitespace\n * [\\s|,] # Separator between color components can be a space or comma\n * \\s* # Optional whitespace\n * (\\d{0,3} # 0 to three digits G channel\n * (?:\\.\\d+)? # Optional decimal with one or more digits\n * ) # End of capturing group for the second color component\n * %? # Optional percent sign after the second color component\n * \\s* # Optional whitespace\n * [\\s|,] # Separator between color components can be a space or comma\n * \\s* # Optional whitespace\n * (\\d{0,3} # 0 to three digits B channel\n * (?:\\.\\d+)? # Optional decimal with one or more digits\n * ) # End of capturing group for the third color component\n * %? # Optional percent sign after the third color component\n * \\s* # Optional whitespace\n * (?: # Beginning of non-capturing group for alpha value\n * \\s* # Optional whitespace\n * [,/] # Comma or slash separator for alpha value\n * \\s* # Optional whitespace\n * (\\d{0,3} # Zero to three digits\n * (?:\\.\\d+)? # Optional decimal with one or more digits\n * ) # End of capturing group for alpha value\n * %? # Optional percent sign after alpha value\n * \\s* # Optional whitespace\n * )? # End of non-capturing group for alpha value (optional)\n * \\) # Closing parenthesis\n * $ # End of the string\n *\n * The alpha channel can be in the format 0.4 .7 or 1 or 73%\n *\n * WARNING this regex doesn't fail on off spec colors. it matches everything that could be a color.\n * So the spec does not allow for `rgba(30 , 45% 35, 49%)` but this will work anyways for us\n */\nexport const reRGBa = () =>\n /^rgba?\\(\\s*(\\d{0,3}(?:\\.\\d+)?%?)\\s*[\\s|,]\\s*(\\d{0,3}(?:\\.\\d+)?%?)\\s*[\\s|,]\\s*(\\d{0,3}(?:\\.\\d+)?%?)\\s*(?:\\s*[,/]\\s*(\\d{0,3}(?:\\.\\d+)?%?)\\s*)?\\)$/i;\n\n/**\n * Regex matching color in HSL or HSLA formats (ex: hsl(0, 0, 0), rgba(255, 100, 10, 0.5), rgba( 255 , 100 , 10 , 0.5 ), rgb(1,1,1), rgba(100%, 60%, 10%, 0.5))\n * Also matching rgba(r g b / a) as per new specs\n * https://developer.mozilla.org/en-US/docs/Web/CSS/color_value/hsl\n * Formal syntax at the time of writing:\n * =\n * hsl( [ | none ] [ | none ] [ | none ] [ / [ | none ] ]? )\n *\n * =\n * |\n * \n *\n * =\n * |\n * \n *\n * For learners this is how you can read this regex\n * Regular expression for matching an hsla or hsl CSS color value\n *\n * /^hsla?\\( // Matches the beginning of the string and the opening parenthesis of \"hsl\" or \"hsla\"\n * \\s* // Matches any whitespace characters (space, tab, etc.) zero or more times\n * (\\d{0,3} // Hue: 0 to three digits - start capture in a group\n * (?:\\.\\d+)? // Hue: Optional (non capture group) decimal with one or more digits.\n * (?:deg|turn|rad)? // Hue: Optionally include suffix deg or turn or rad\n * ) // Hue: End capture group\n * \\s* // Matches any whitespace characters zero or more times\n * [\\s|,] // Matches a space, tab or comma\n * \\s* // Matches any whitespace characters zero or more times\n * (\\d{0,3} // Saturation: 0 to three digits - start capture in a group\n * (?:\\.\\d+)? // Saturation: Optional decimal with one or more digits in a non-capturing group\n * %?) // Saturation: match optional % character and end capture group\n * \\s* // Matches any whitespace characters zero or more times\n * [\\s|,] // Matches a space, tab or comma\n * \\s* // Matches any whitespace characters zero or more times\n * (\\d{0,3} // Lightness: 0 to three digits - start capture in a group\n * (?:\\.\\d+)? // Lightness: Optional decimal with one or more digits in a non-capturing group\n * %?) // Lightness: match % character and end capture group\n * \\s* // Matches any whitespace characters zero or more times\n * (?: // Alpha: Begins a non-capturing group for the alpha value\n * \\s* // Matches any whitespace characters zero or more times\n * [,/] // Matches a comma or forward slash\n * \\s* // Matches any whitespace characters zero or more times\n * (\\d*(?:\\.\\d+)?%?) // Matches zero or more digits, optionally followed by a decimal point and one or more digits, followed by an optional percentage sign and captures it in a group\n * \\s* // Matches any whitespace characters zero or more times\n * )? // Makes the alpha value group optional\n * \\) // Matches the closing parenthesis\n * $/i // Matches the end of the string and sets the regular expression to case-insensitive mode\n *\n * WARNING this regex doesn't fail on off spec colors. It matches everything that could be a color.\n * So the spec does not allow `hsl(30 , 45% 35, 49%)` but this will work anyways for us.\n */\nexport const reHSLa = () =>\n /^hsla?\\(\\s*([+-]?\\d{0,3}(?:\\.\\d+)?(?:deg|turn|rad)?)\\s*[\\s|,]\\s*(\\d{0,3}(?:\\.\\d+)?%?)\\s*[\\s|,]\\s*(\\d{0,3}(?:\\.\\d+)?%?)\\s*(?:\\s*[,/]\\s*(\\d*(?:\\.\\d+)?%?)\\s*)?\\)$/i;\n\n/**\n * Regex matching color in HEX format (ex: #FF5544CC, #FF5555, 010155, aff)\n */\nexport const reHex = () => /^#?(([0-9a-f]){3,4}|([0-9a-f]{2}){3,4})$/i;\n","import { Color } from '../../color/Color';\nimport { config } from '../../config';\nimport { DEFAULT_SVG_FONT_SIZE, FILL, NONE } from '../../constants';\nimport type { TBBox, SVGElementName, SupportedSVGUnit } from '../../typedefs';\nimport { toFixed } from './toFixed';\n\n/**\n * Returns array of attributes for given svg that fabric parses\n * @param {SVGElementName} type Type of svg element (eg. 'circle')\n * @return {Array} string names of supported attributes\n */\nexport const getSvgAttributes = (type: SVGElementName) => {\n const commonAttributes = ['instantiated_by_use', 'style', 'id', 'class'];\n switch (type) {\n case 'linearGradient':\n return commonAttributes.concat([\n 'x1',\n 'y1',\n 'x2',\n 'y2',\n 'gradientUnits',\n 'gradientTransform',\n ]);\n case 'radialGradient':\n return commonAttributes.concat([\n 'gradientUnits',\n 'gradientTransform',\n 'cx',\n 'cy',\n 'r',\n 'fx',\n 'fy',\n 'fr',\n ]);\n case 'stop':\n return commonAttributes.concat(['offset', 'stop-color', 'stop-opacity']);\n }\n return commonAttributes;\n};\n\n/**\n * Converts from attribute value to pixel value if applicable.\n * Returns converted pixels or original value not converted.\n * @param {string} value number to operate on\n * @param {number} fontSize\n * @return {number}\n */\nexport const parseUnit = (value: string, fontSize = DEFAULT_SVG_FONT_SIZE) => {\n const unit = /\\D{0,2}$/.exec(value),\n number = parseFloat(value);\n const dpi = config.DPI;\n switch (unit?.[0] as SupportedSVGUnit) {\n case 'mm':\n return (number * dpi) / 25.4;\n\n case 'cm':\n return (number * dpi) / 2.54;\n\n case 'in':\n return number * dpi;\n\n case 'pt':\n return (number * dpi) / 72; // or * 4 / 3\n\n case 'pc':\n return ((number * dpi) / 72) * 12; // or * 16\n\n case 'em':\n return number * fontSize;\n\n default:\n return number;\n }\n};\n\nexport type MeetOrSlice = 'meet' | 'slice';\n\nexport type MinMidMax = 'Min' | 'Mid' | 'Max' | 'none';\n\nexport type TPreserveArParsed = {\n meetOrSlice: MeetOrSlice;\n alignX: MinMidMax;\n alignY: MinMidMax;\n};\n\n// align can be either none or undefined or a combination of mid/max\nconst parseAlign = (align: string): MinMidMax[] => {\n //divide align in alignX and alignY\n if (align && align !== NONE) {\n return [align.slice(1, 4) as MinMidMax, align.slice(5, 8) as MinMidMax];\n } else if (align === NONE) {\n return [align, align];\n }\n return ['Mid', 'Mid'];\n};\n\n/**\n * Parse preserveAspectRatio attribute from element\n * https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/preserveAspectRatio\n * @param {string} attribute to be parsed\n * @return {Object} an object containing align and meetOrSlice attribute\n */\nexport const parsePreserveAspectRatioAttribute = (\n attribute: string,\n): TPreserveArParsed => {\n const [firstPart, secondPart] = attribute.trim().split(' ') as [\n MinMidMax,\n MeetOrSlice | undefined,\n ];\n const [alignX, alignY] = parseAlign(firstPart);\n return {\n meetOrSlice: secondPart || 'meet',\n alignX,\n alignY,\n };\n};\n\n/**\n * Adobe Illustrator (at least CS5) is unable to render rgba()-based fill values\n * we work around it by \"moving\" alpha channel into opacity attribute and setting fill's alpha to 1\n * @param prop\n * @param value\n * @param {boolean} inlineStyle The default is inline style, the separator used is \":\", The other is \"=\"\n * @returns\n */\nexport const colorPropToSVG = (\n prop: string,\n value?: any,\n inlineStyle = true,\n) => {\n let colorValue;\n let opacityValue;\n if (!value) {\n colorValue = 'none';\n } else if (value.toLive) {\n colorValue = `url(#SVGID_${value.id})`;\n } else {\n const color = new Color(value),\n opacity = color.getAlpha();\n\n colorValue = color.toRgb();\n if (opacity !== 1) {\n opacityValue = opacity.toString();\n }\n }\n if (inlineStyle) {\n return `${prop}: ${colorValue}; ${\n opacityValue ? `${prop}-opacity: ${opacityValue}; ` : ''\n }`;\n } else {\n return `${prop}=\"${colorValue}\" ${\n opacityValue ? `${prop}-opacity=\"${opacityValue}\" ` : ''\n }`;\n }\n};\n\nexport const createSVGRect = (\n color: string,\n { left, top, width, height }: TBBox,\n precision = config.NUM_FRACTION_DIGITS,\n) => {\n const svgColor = colorPropToSVG(FILL, color, false);\n const [x, y, w, h] = [left, top, width, height].map((value) =>\n toFixed(value, precision),\n );\n return ``;\n};\n","import type { TSVGReviver } from '../../typedefs';\nimport { uid } from '../../util/internals/uid';\nimport { colorPropToSVG } from '../../util/misc/svgParsing';\nimport { FILL, NONE, STROKE } from '../../constants';\nimport type { FabricObject } from './FabricObject';\nimport { isFiller } from '../../util/typeAssertions';\nimport { matrixToSVG } from '../../util/misc/svgExport';\n\nexport class FabricObjectSVGExportMixin {\n /**\n * When an object is being exported as SVG as a clippath, a reference inside the SVG is needed.\n * This reference is a UID in the fabric namespace and is temporary stored here.\n * @type {String}\n */\n declare clipPathId?: string;\n\n /**\n * Returns styles-string for svg-export\n * @param {Boolean} skipShadow a boolean to skip shadow filter output\n * @return {String}\n */\n getSvgStyles(\n this: FabricObjectSVGExportMixin & FabricObject,\n skipShadow?: boolean,\n ) {\n const fillRule = this.fillRule ? this.fillRule : 'nonzero',\n strokeWidth = this.strokeWidth ? this.strokeWidth : '0',\n strokeDashArray = this.strokeDashArray\n ? this.strokeDashArray.join(' ')\n : NONE,\n strokeDashOffset = this.strokeDashOffset ? this.strokeDashOffset : '0',\n strokeLineCap = this.strokeLineCap ? this.strokeLineCap : 'butt',\n strokeLineJoin = this.strokeLineJoin ? this.strokeLineJoin : 'miter',\n strokeMiterLimit = this.strokeMiterLimit ? this.strokeMiterLimit : '4',\n opacity = typeof this.opacity !== 'undefined' ? this.opacity : '1',\n visibility = this.visible ? '' : ' visibility: hidden;',\n filter = skipShadow ? '' : this.getSvgFilter(),\n fill = colorPropToSVG(FILL, this.fill),\n stroke = colorPropToSVG(STROKE, this.stroke);\n\n return [\n stroke,\n 'stroke-width: ',\n strokeWidth,\n '; ',\n 'stroke-dasharray: ',\n strokeDashArray,\n '; ',\n 'stroke-linecap: ',\n strokeLineCap,\n '; ',\n 'stroke-dashoffset: ',\n strokeDashOffset,\n '; ',\n 'stroke-linejoin: ',\n strokeLineJoin,\n '; ',\n 'stroke-miterlimit: ',\n strokeMiterLimit,\n '; ',\n fill,\n 'fill-rule: ',\n fillRule,\n '; ',\n 'opacity: ',\n opacity,\n ';',\n filter,\n visibility,\n ].join('');\n }\n\n /**\n * Returns filter for svg shadow\n * @return {String}\n */\n getSvgFilter(this: FabricObjectSVGExportMixin & FabricObject) {\n return this.shadow ? `filter: url(#SVGID_${this.shadow.id});` : '';\n }\n\n /**\n * Returns id attribute for svg output\n * @return {String}\n */\n getSvgCommons(\n this: FabricObjectSVGExportMixin & FabricObject & { id?: string },\n ) {\n return [\n this.id ? `id=\"${this.id}\" ` : '',\n this.clipPath\n ? `clip-path=\"url(#${\n (this.clipPath as FabricObjectSVGExportMixin & FabricObject)\n .clipPathId\n })\" `\n : '',\n ].join('');\n }\n\n /**\n * Returns transform-string for svg-export\n * @param {Boolean} use the full transform or the single object one.\n * @return {String}\n */\n getSvgTransform(\n this: FabricObjectSVGExportMixin & FabricObject,\n full?: boolean,\n additionalTransform = '',\n ) {\n const transform = full ? this.calcTransformMatrix() : this.calcOwnMatrix(),\n svgTransform = `transform=\"${matrixToSVG(transform)}`;\n return `${svgTransform}${additionalTransform}\" `;\n }\n\n /**\n * Returns svg representation of an instance\n * This function is implemented in each subclass\n * This is just because typescript otherwise cryies all the time\n * @return {Array} an array of strings with the specific svg representation\n * of the instance\n */\n _toSVG(_reviver?: TSVGReviver): string[] {\n return [''];\n }\n\n /**\n * Returns svg representation of an instance\n * @param {TSVGReviver} [reviver] Method for further parsing of svg representation.\n * @return {String} svg representation of an instance\n */\n toSVG(\n this: FabricObjectSVGExportMixin & FabricObject,\n reviver?: TSVGReviver,\n ) {\n return this._createBaseSVGMarkup(this._toSVG(reviver), {\n reviver,\n });\n }\n\n /**\n * Returns svg clipPath representation of an instance\n * @param {TSVGReviver} [reviver] Method for further parsing of svg representation.\n * @return {String} svg representation of an instance\n */\n toClipPathSVG(\n this: FabricObjectSVGExportMixin & FabricObject,\n reviver?: TSVGReviver,\n ) {\n return (\n '\\t' +\n this._createBaseClipPathSVGMarkup(this._toSVG(reviver), {\n reviver,\n })\n );\n }\n\n /**\n * @private\n */\n _createBaseClipPathSVGMarkup(\n this: FabricObjectSVGExportMixin & FabricObject,\n objectMarkup: string[],\n {\n reviver,\n additionalTransform = '',\n }: { reviver?: TSVGReviver; additionalTransform?: string } = {},\n ) {\n const commonPieces = [\n this.getSvgTransform(true, additionalTransform),\n this.getSvgCommons(),\n ].join(''),\n // insert commons in the markup, style and svgCommons\n index = objectMarkup.indexOf('COMMON_PARTS');\n objectMarkup[index] = commonPieces;\n return reviver ? reviver(objectMarkup.join('')) : objectMarkup.join('');\n }\n\n /**\n * @private\n */\n _createBaseSVGMarkup(\n this: FabricObjectSVGExportMixin & FabricObject,\n objectMarkup: string[],\n {\n noStyle,\n reviver,\n withShadow,\n additionalTransform,\n }: {\n noStyle?: boolean;\n reviver?: TSVGReviver;\n withShadow?: boolean;\n additionalTransform?: string;\n } = {},\n ): string {\n const styleInfo = noStyle ? '' : `style=\"${this.getSvgStyles()}\" `,\n shadowInfo = withShadow ? `style=\"${this.getSvgFilter()}\" ` : '',\n clipPath = this.clipPath as FabricObjectSVGExportMixin & FabricObject,\n vectorEffect = this.strokeUniform\n ? 'vector-effect=\"non-scaling-stroke\" '\n : '',\n absoluteClipPath = clipPath && clipPath.absolutePositioned,\n stroke = this.stroke,\n fill = this.fill,\n shadow = this.shadow,\n markup = [],\n // insert commons in the markup, style and svgCommons\n index = objectMarkup.indexOf('COMMON_PARTS');\n let clipPathMarkup;\n if (clipPath) {\n clipPath.clipPathId = `CLIPPATH_${uid()}`;\n clipPathMarkup = `\\n${clipPath.toClipPathSVG(reviver)}\\n`;\n }\n if (absoluteClipPath) {\n markup.push('\\n');\n }\n markup.push(\n '\\n',\n );\n const commonPieces = [\n styleInfo,\n vectorEffect,\n noStyle ? '' : this.addPaintOrder(),\n ' ',\n additionalTransform ? `transform=\"${additionalTransform}\" ` : '',\n ].join('');\n objectMarkup[index] = commonPieces;\n if (isFiller(fill)) {\n markup.push(fill.toSVG(this));\n }\n if (isFiller(stroke)) {\n markup.push(stroke.toSVG(this));\n }\n if (shadow) {\n markup.push(shadow.toSVG(this));\n }\n if (clipPath) {\n markup.push(clipPathMarkup);\n }\n markup.push(objectMarkup.join(''));\n markup.push('\\n');\n absoluteClipPath && markup.push('\\n');\n return reviver ? reviver(markup.join('')) : markup.join('');\n }\n\n addPaintOrder(this: FabricObjectSVGExportMixin & FabricObject) {\n return this.paintFirst !== FILL ? ` paint-order=\"${this.paintFirst}\" ` : '';\n }\n}\n","export function getSvgRegex(arr: string[]) {\n return new RegExp('^(' + arr.join('|') + ')\\\\b', 'i');\n}\n","import { FILL, LEFT, STROKE, reNewline } from '../../constants';\nimport type { TClassProperties } from '../../typedefs';\nimport type { FabricText } from './Text';\n\nexport const TEXT_DECORATION_THICKNESS = 'textDecorationThickness';\n\nconst fontProperties = [\n 'fontSize',\n 'fontWeight',\n 'fontFamily',\n 'fontStyle',\n] as const;\n\nexport const textDecorationProperties = [\n 'underline',\n 'overline',\n 'linethrough',\n] as const;\n\nexport const textLayoutProperties: string[] = [\n ...fontProperties,\n 'lineHeight',\n 'text',\n 'charSpacing',\n 'textAlign',\n 'styles',\n 'path',\n 'pathStartOffset',\n 'pathSide',\n 'pathAlign',\n];\n\nexport const additionalProps = [\n ...textLayoutProperties,\n ...textDecorationProperties,\n 'textBackgroundColor',\n 'direction',\n TEXT_DECORATION_THICKNESS,\n] as const;\n\nexport type StylePropertiesType =\n | 'fill'\n | 'stroke'\n | 'strokeWidth'\n | 'fontSize'\n | 'fontFamily'\n | 'fontWeight'\n | 'fontStyle'\n | 'textBackgroundColor'\n | 'deltaY'\n | 'overline'\n | 'underline'\n | 'linethrough'\n | typeof TEXT_DECORATION_THICKNESS;\n\nexport const styleProperties: Readonly = [\n ...fontProperties,\n ...textDecorationProperties,\n STROKE,\n 'strokeWidth',\n FILL,\n 'deltaY',\n 'textBackgroundColor',\n TEXT_DECORATION_THICKNESS,\n] as const;\n\n// @TODO: Many things here are configuration related and shouldn't be on the class nor prototype\n// regexes, list of properties that are not suppose to change by instances, magic consts.\n// this will be a separated effort\nexport const textDefaultValues: Partial> = {\n _reNewline: reNewline,\n _reSpacesAndTabs: /[ \\t\\r]/g,\n _reSpaceAndTab: /[ \\t\\r]/,\n _reWords: /\\S+/g,\n fontSize: 40,\n fontWeight: 'normal',\n fontFamily: 'Times New Roman',\n underline: false,\n overline: false,\n linethrough: false,\n textAlign: LEFT,\n fontStyle: 'normal',\n lineHeight: 1.16,\n textBackgroundColor: '',\n stroke: null,\n shadow: null,\n path: undefined,\n pathStartOffset: 0,\n pathSide: LEFT,\n pathAlign: 'baseline',\n charSpacing: 0,\n deltaY: 0,\n direction: 'ltr',\n CACHE_FONT_SIZE: 400,\n MIN_TEXT_WIDTH: 2,\n // Text magic numbers\n superscript: {\n size: 0.6, // fontSize factor\n baseline: -0.35, // baseline-shift factor (upwards)\n },\n subscript: {\n size: 0.6, // fontSize factor\n baseline: 0.11, // baseline-shift factor (downwards)\n },\n _fontSizeFraction: 0.222,\n offsets: {\n underline: 0.1,\n linethrough: -0.28167, // added 1/30 to original number\n overline: -0.81333, // added 1/15 to original number\n },\n _fontSizeMult: 1.13,\n [TEXT_DECORATION_THICKNESS]: 66.667, // before implementation was 1/15\n};\n\nexport const JUSTIFY = 'justify';\nexport const JUSTIFY_LEFT = 'justify-left';\nexport const JUSTIFY_RIGHT = 'justify-right';\nexport const JUSTIFY_CENTER = 'justify-center';\n","import { getSvgRegex } from './getSvgRegex';\nimport { LEFT, TOP } from '../constants';\nimport { TEXT_DECORATION_THICKNESS } from '../shapes/Text/constants';\n\n// matches, e.g.: +14.56e-12, etc.\nexport const reNum = String.raw`[-+]?(?:\\d*\\.\\d+|\\d+\\.?)(?:[eE][-+]?\\d+)?`;\nexport const viewportSeparator = String.raw`(?:\\s*,?\\s+|\\s*,\\s*)`;\n\nexport const svgNS = 'http://www.w3.org/2000/svg';\n\nexport const reFontDeclaration = new RegExp(\n '(normal|italic)?\\\\s*(normal|small-caps)?\\\\s*' +\n '(normal|bold|bolder|lighter|100|200|300|400|500|600|700|800|900)?\\\\s*(' +\n reNum +\n '(?:px|cm|mm|em|pt|pc|in)*)(?:\\\\/(normal|' +\n reNum +\n '))?\\\\s+(.*)',\n);\n\nexport const svgValidTagNames = [\n 'path',\n 'circle',\n 'polygon',\n 'polyline',\n 'ellipse',\n 'rect',\n 'line',\n 'image',\n 'text',\n ],\n svgViewBoxElements = ['symbol', 'image', 'marker', 'pattern', 'view', 'svg'],\n svgInvalidAncestors = [\n 'pattern',\n 'defs',\n 'symbol',\n 'metadata',\n 'clipPath',\n 'mask',\n 'desc',\n ],\n svgValidParents = ['symbol', 'g', 'a', 'svg', 'clipPath', 'defs'],\n attributesMap = {\n cx: LEFT,\n x: LEFT,\n r: 'radius',\n cy: TOP,\n y: TOP,\n display: 'visible',\n visibility: 'visible',\n transform: 'transformMatrix',\n 'fill-opacity': 'fillOpacity',\n 'fill-rule': 'fillRule',\n 'font-family': 'fontFamily',\n 'font-size': 'fontSize',\n 'font-style': 'fontStyle',\n 'font-weight': 'fontWeight',\n 'letter-spacing': 'charSpacing',\n 'paint-order': 'paintFirst',\n 'stroke-dasharray': 'strokeDashArray',\n 'stroke-dashoffset': 'strokeDashOffset',\n 'stroke-linecap': 'strokeLineCap',\n 'stroke-linejoin': 'strokeLineJoin',\n 'stroke-miterlimit': 'strokeMiterLimit',\n 'stroke-opacity': 'strokeOpacity',\n 'stroke-width': 'strokeWidth',\n 'text-decoration': 'textDecoration',\n 'text-anchor': 'textAnchor',\n opacity: 'opacity',\n 'clip-path': 'clipPath',\n 'clip-rule': 'clipRule',\n 'vector-effect': 'strokeUniform',\n 'image-rendering': 'imageSmoothing',\n 'text-decoration-thickness': TEXT_DECORATION_THICKNESS,\n },\n fSize = 'font-size',\n cPath = 'clip-path';\n\nexport const svgValidTagNamesRegEx = getSvgRegex(svgValidTagNames);\n\nexport const svgViewBoxElementsRegEx = getSvgRegex(svgViewBoxElements);\n\nexport const svgValidParentsRegEx = getSvgRegex(svgValidParents);\n\n// http://www.w3.org/TR/SVG/coords.html#ViewBoxAttribute\n\nexport const reViewBoxAttrValue = new RegExp(\n String.raw`^\\s*(${reNum})${viewportSeparator}(${reNum})${viewportSeparator}(${reNum})${viewportSeparator}(${reNum})\\s*$`,\n);\n","import { classRegistry } from './ClassRegistry';\nimport { Color } from './color/Color';\nimport { config } from './config';\nimport { reNum } from './parser/constants';\nimport { Point } from './Point';\nimport type { FabricObject } from './shapes/Object/FabricObject';\nimport type { TClassProperties } from './typedefs';\nimport { uid } from './util/internals/uid';\nimport { pickBy } from './util/misc/pick';\nimport { degreesToRadians } from './util/misc/radiansDegreesConversion';\nimport { toFixed } from './util/misc/toFixed';\nimport { rotateVector } from './util/misc/vectors';\n\n/**\n * Regex matching shadow offsetX, offsetY and blur (ex: \"2px 2px 10px rgba(0,0,0,0.2)\", \"rgb(0,255,0) 2px 2px\")\n * - (?:\\s|^): This part captures either a whitespace character (\\s) or the beginning of a line (^). It's non-capturing (due to (?:...)), meaning it doesn't create a capturing group.\n * - (-?\\d+(?:\\.\\d*)?(?:px)?(?:\\s?|$))?: This captures the first component of the shadow, which is the horizontal offset. Breaking it down:\n * - (-?\\d+): Captures an optional minus sign followed by one or more digits (integer part of the number).\n * - (?:\\.\\d*)?: Optionally captures a decimal point followed by zero or more digits (decimal part of the number).\n * - (?:px)?: Optionally captures the \"px\" unit.\n * - (?:\\s?|$): Captures either an optional whitespace or the end of the line. This whole part is wrapped in a non-capturing group and marked as optional with ?.\n * - (-?\\d+(?:\\.\\d*)?(?:px)?(?:\\s?|$))?: Similar to the previous step, this captures the vertical offset.\n\n(\\d+(?:\\.\\d*)?(?:px)?)?: This captures the blur radius. It's similar to the horizontal offset but without the optional minus sign.\n\n(?:\\s+(-?\\d+(?:\\.\\d*)?(?:px)?(?:\\s?|$))?){0,1}: This captures an optional part for the color. It allows for whitespace followed by a component with an optional minus sign, digits, decimal point, and \"px\" unit.\n\n(?:$|\\s): This captures either the end of the line or a whitespace character. It ensures that the match ends either at the end of the string or with a whitespace character.\n */\n// eslint-disable-next-line max-len\n\nconst shadowOffsetRegex = '(-?\\\\d+(?:\\\\.\\\\d*)?(?:px)?(?:\\\\s?|$))?';\n\nconst reOffsetsAndBlur = new RegExp(\n '(?:\\\\s|^)' +\n shadowOffsetRegex +\n shadowOffsetRegex +\n '(' +\n reNum +\n '?(?:px)?)?(?:\\\\s?|$)(?:$|\\\\s)',\n);\n\nexport const shadowDefaultValues: Partial> = {\n color: 'rgb(0,0,0)',\n blur: 0,\n offsetX: 0,\n offsetY: 0,\n affectStroke: false,\n includeDefaultValues: true,\n nonScaling: false,\n};\n\nexport type SerializedShadowOptions = {\n color: string;\n blur: number;\n offsetX: number;\n offsetY: number;\n affectStroke: boolean;\n nonScaling: boolean;\n type: string;\n};\n\nexport class Shadow {\n /**\n * Shadow color\n * @type String\n */\n declare color: string;\n\n /**\n * Shadow blur\n * @type Number\n */\n declare blur: number;\n\n /**\n * Shadow horizontal offset\n * @type Number\n */\n declare offsetX: number;\n\n /**\n * Shadow vertical offset\n * @type Number\n */\n declare offsetY: number;\n\n /**\n * Whether the shadow should affect stroke operations\n * @type Boolean\n */\n declare affectStroke: boolean;\n\n /**\n * Indicates whether toObject should include default values\n * @type Boolean\n */\n declare includeDefaultValues: boolean;\n\n /**\n * When `false`, the shadow will scale with the object.\n * When `true`, the shadow's offsetX, offsetY, and blur will not be affected by the object's scale.\n * default to false\n * @type Boolean\n */\n declare nonScaling: boolean;\n\n declare id: number;\n\n static ownDefaults = shadowDefaultValues;\n\n static type = 'shadow';\n\n /**\n * @see {@link http://fabric5.fabricjs.com/shadows|Shadow demo}\n * @param {Object|String} [options] Options object with any of color, blur, offsetX, offsetY properties or string (e.g. \"rgba(0,0,0,0.2) 2px 2px 10px\")\n */\n constructor(options?: Partial>);\n constructor(svgAttribute: string);\n constructor(arg0: string | Partial> = {}) {\n const options: Partial> =\n typeof arg0 === 'string' ? Shadow.parseShadow(arg0) : arg0;\n Object.assign(this, Shadow.ownDefaults, options);\n this.id = uid();\n }\n\n /**\n * @param {String} value Shadow value to parse\n * @return {Object} Shadow object with color, offsetX, offsetY and blur\n */\n static parseShadow(value: string) {\n const shadowStr = value.trim(),\n [, offsetX = 0, offsetY = 0, blur = 0] = (\n reOffsetsAndBlur.exec(shadowStr) || []\n ).map((value) => parseFloat(value) || 0),\n color = (shadowStr.replace(reOffsetsAndBlur, '') || 'rgb(0,0,0)').trim();\n\n return {\n color,\n offsetX,\n offsetY,\n blur,\n };\n }\n\n /**\n * Returns a string representation of an instance\n * @see http://www.w3.org/TR/css-text-decor-3/#text-shadow\n * @return {String} Returns CSS3 text-shadow declaration\n */\n toString() {\n return [this.offsetX, this.offsetY, this.blur, this.color].join('px ');\n }\n\n /**\n * Returns SVG representation of a shadow\n * @param {FabricObject} object\n * @return {String} SVG representation of a shadow\n */\n toSVG(object: FabricObject) {\n const offset = rotateVector(\n new Point(this.offsetX, this.offsetY),\n degreesToRadians(-object.angle),\n ),\n BLUR_BOX = 20,\n color = new Color(this.color);\n let fBoxX = 40,\n fBoxY = 40;\n\n if (object.width && object.height) {\n //http://www.w3.org/TR/SVG/filters.html#FilterEffectsRegion\n // we add some extra space to filter box to contain the blur ( 20 )\n fBoxX =\n toFixed(\n (Math.abs(offset.x) + this.blur) / object.width,\n config.NUM_FRACTION_DIGITS,\n ) *\n 100 +\n BLUR_BOX;\n fBoxY =\n toFixed(\n (Math.abs(offset.y) + this.blur) / object.height,\n config.NUM_FRACTION_DIGITS,\n ) *\n 100 +\n BLUR_BOX;\n }\n if (object.flipX) {\n offset.x *= -1;\n }\n if (object.flipY) {\n offset.y *= -1;\n }\n\n return `\\n\\t\\n\\t\\n\\t\\n\\t\\n\\t\\n\\t\\t\\n\\t\\t\\n\\t\\n\\n`;\n }\n\n /**\n * Returns object representation of a shadow\n * @return {Object} Object representation of a shadow instance\n */\n toObject() {\n const data: SerializedShadowOptions = {\n color: this.color,\n blur: this.blur,\n offsetX: this.offsetX,\n offsetY: this.offsetY,\n affectStroke: this.affectStroke,\n nonScaling: this.nonScaling,\n type: (this.constructor as typeof Shadow).type,\n };\n const defaults = Shadow.ownDefaults as SerializedShadowOptions;\n return !this.includeDefaultValues\n ? pickBy(data, (value, key) => value !== defaults[key])\n : data;\n }\n\n static async fromObject(options: Partial>) {\n return new this(options);\n }\n}\n\nclassRegistry.setClass(Shadow, 'shadow');\n","export const capValue = (min: number, value: number, max: number) =>\n Math.max(min, Math.min(value, max));\n","import {\n TOP,\n LEFT,\n SCALE_Y,\n SCALE_X,\n SKEW_X,\n SKEW_Y,\n FILL,\n STROKE,\n} from '../../constants';\nimport type { TClassProperties } from '../../typedefs';\nimport type { InteractiveFabricObject } from './InteractiveObject';\nimport type { FabricObject } from './Object';\n\nexport const stateProperties = [\n TOP,\n LEFT,\n SCALE_X,\n SCALE_Y,\n 'flipX',\n 'flipY',\n 'originX',\n 'originY',\n 'angle',\n 'opacity',\n 'globalCompositeOperation',\n 'shadow',\n 'visible',\n SKEW_X,\n SKEW_Y,\n];\n\nexport const cacheProperties = [\n FILL,\n STROKE,\n 'strokeWidth',\n 'strokeDashArray',\n 'width',\n 'height',\n 'paintFirst',\n 'strokeUniform',\n 'strokeLineCap',\n 'strokeDashOffset',\n 'strokeLineJoin',\n 'strokeMiterLimit',\n 'backgroundColor',\n 'clipPath',\n];\n\nexport const fabricObjectDefaultValues: Partial<\n TClassProperties\n> = {\n // see composeMatrix() to see order of transforms. First defaults listed based on this\n top: 0,\n left: 0,\n width: 0,\n height: 0,\n angle: 0,\n flipX: false,\n flipY: false,\n scaleX: 1,\n scaleY: 1,\n minScaleLimit: 0,\n skewX: 0,\n skewY: 0,\n originX: LEFT,\n originY: TOP,\n strokeWidth: 1,\n strokeUniform: false,\n padding: 0,\n opacity: 1,\n paintFirst: FILL,\n fill: 'rgb(0,0,0)',\n fillRule: 'nonzero',\n stroke: null,\n strokeDashArray: null,\n strokeDashOffset: 0,\n strokeLineCap: 'butt',\n strokeLineJoin: 'miter',\n strokeMiterLimit: 4,\n globalCompositeOperation: 'source-over',\n backgroundColor: '',\n shadow: null,\n visible: true,\n includeDefaultValues: true,\n excludeFromExport: false,\n objectCaching: true,\n clipPath: undefined,\n inverted: false,\n absolutePositioned: false,\n centeredRotation: true,\n centeredScaling: false,\n dirty: true,\n} as const;\n\nexport const interactiveObjectDefaultValues: Partial<\n TClassProperties\n> = {\n noScaleCache: true,\n lockMovementX: false,\n lockMovementY: false,\n lockRotation: false,\n lockScalingX: false,\n lockScalingY: false,\n lockSkewingX: false,\n lockSkewingY: false,\n lockScalingFlip: false,\n cornerSize: 13,\n touchCornerSize: 24,\n transparentCorners: true,\n cornerColor: 'rgb(178,204,255)',\n cornerStrokeColor: '',\n cornerStyle: 'rect',\n cornerDashArray: null,\n hasControls: true,\n borderColor: 'rgb(178,204,255)',\n borderDashArray: null,\n borderOpacityWhenMoving: 0.4,\n borderScaleFactor: 1,\n hasBorders: true,\n selectionBackgroundColor: '',\n selectable: true,\n evented: true,\n perPixelTargetFind: false,\n activeOn: 'down',\n hoverCursor: null,\n moveCursor: null,\n};\n","/**\n * Easing functions\n * @see {@link http://gizma.com/easing/ Easing Equations by Robert Penner}\n */\n\nimport { twoMathPi, halfPI } from '../../constants';\nimport type { TEasingFunction } from './types';\n\nconst normalize = (a: number, c: number, p: number, s: number) => {\n if (a < Math.abs(c)) {\n a = c;\n s = p / 4;\n } else {\n //handle the 0/0 case:\n if (c === 0 && a === 0) {\n s = (p / twoMathPi) * Math.asin(1);\n } else {\n s = (p / twoMathPi) * Math.asin(c / a);\n }\n }\n return { a, c, p, s };\n};\n\nconst elastic = (\n a: number,\n s: number,\n p: number,\n t: number,\n d: number,\n): number =>\n a * Math.pow(2, 10 * (t -= 1)) * Math.sin(((t * d - s) * twoMathPi) / p);\n\n/**\n * Default sinusoidal easing\n */\nexport const defaultEasing: TEasingFunction = (t, b, c, d) =>\n -c * Math.cos((t / d) * halfPI) + c + b;\n\n/**\n * Cubic easing in\n */\nexport const easeInCubic: TEasingFunction = (t, b, c, d) =>\n c * (t / d) ** 3 + b;\n\n/**\n * Cubic easing out\n */\nexport const easeOutCubic: TEasingFunction = (t, b, c, d) =>\n c * ((t / d - 1) ** 3 + 1) + b;\n\n/**\n * Cubic easing in and out\n */\nexport const easeInOutCubic: TEasingFunction = (t, b, c, d) => {\n t /= d / 2;\n if (t < 1) {\n return (c / 2) * t ** 3 + b;\n }\n return (c / 2) * ((t - 2) ** 3 + 2) + b;\n};\n\n/**\n * Quartic easing in\n */\nexport const easeInQuart: TEasingFunction = (t, b, c, d) =>\n c * (t /= d) * t ** 3 + b;\n\n/**\n * Quartic easing out\n */\nexport const easeOutQuart: TEasingFunction = (t, b, c, d) =>\n -c * ((t = t / d - 1) * t ** 3 - 1) + b;\n\n/**\n * Quartic easing in and out\n */\nexport const easeInOutQuart: TEasingFunction = (t, b, c, d) => {\n t /= d / 2;\n if (t < 1) {\n return (c / 2) * t ** 4 + b;\n }\n return (-c / 2) * ((t -= 2) * t ** 3 - 2) + b;\n};\n\n/**\n * Quintic easing in\n */\nexport const easeInQuint: TEasingFunction = (t, b, c, d) =>\n c * (t / d) ** 5 + b;\n\n/**\n * Quintic easing out\n */\nexport const easeOutQuint: TEasingFunction = (t, b, c, d) =>\n c * ((t / d - 1) ** 5 + 1) + b;\n\n/**\n * Quintic easing in and out\n */\nexport const easeInOutQuint: TEasingFunction = (t, b, c, d) => {\n t /= d / 2;\n if (t < 1) {\n return (c / 2) * t ** 5 + b;\n }\n return (c / 2) * ((t - 2) ** 5 + 2) + b;\n};\n\n/**\n * Sinusoidal easing in\n */\nexport const easeInSine: TEasingFunction = (t, b, c, d) =>\n -c * Math.cos((t / d) * halfPI) + c + b;\n\n/**\n * Sinusoidal easing out\n */\nexport const easeOutSine: TEasingFunction = (t, b, c, d) =>\n c * Math.sin((t / d) * halfPI) + b;\n\n/**\n * Sinusoidal easing in and out\n */\nexport const easeInOutSine: TEasingFunction = (t, b, c, d) =>\n (-c / 2) * (Math.cos((Math.PI * t) / d) - 1) + b;\n\n/**\n * Exponential easing in\n */\nexport const easeInExpo: TEasingFunction = (t, b, c, d) =>\n t === 0 ? b : c * 2 ** (10 * (t / d - 1)) + b;\n\n/**\n * Exponential easing out\n */\nexport const easeOutExpo: TEasingFunction = (t, b, c, d) =>\n t === d ? b + c : c * -(2 ** ((-10 * t) / d) + 1) + b;\n\n/**\n * Exponential easing in and out\n */\nexport const easeInOutExpo: TEasingFunction = (t, b, c, d) => {\n if (t === 0) {\n return b;\n }\n if (t === d) {\n return b + c;\n }\n t /= d / 2;\n if (t < 1) {\n return (c / 2) * 2 ** (10 * (t - 1)) + b;\n }\n return (c / 2) * -(2 ** (-10 * --t) + 2) + b;\n};\n\n/**\n * Circular easing in\n */\nexport const easeInCirc: TEasingFunction = (t, b, c, d) =>\n -c * (Math.sqrt(1 - (t /= d) * t) - 1) + b;\n\n/**\n * Circular easing out\n */\nexport const easeOutCirc: TEasingFunction = (t, b, c, d) =>\n c * Math.sqrt(1 - (t = t / d - 1) * t) + b;\n\n/**\n * Circular easing in and out\n */\nexport const easeInOutCirc: TEasingFunction = (t, b, c, d) => {\n t /= d / 2;\n if (t < 1) {\n return (-c / 2) * (Math.sqrt(1 - t ** 2) - 1) + b;\n }\n return (c / 2) * (Math.sqrt(1 - (t -= 2) * t) + 1) + b;\n};\n\n/**\n * Elastic easing in\n */\nexport const easeInElastic: TEasingFunction = (t, b, c, d) => {\n const s = 1.70158,\n a = c;\n let p = 0;\n if (t === 0) {\n return b;\n }\n t /= d;\n if (t === 1) {\n return b + c;\n }\n if (!p) {\n p = d * 0.3;\n }\n const { a: normA, s: normS, p: normP } = normalize(a, c, p, s);\n return -elastic(normA, normS, normP, t, d) + b;\n};\n\n/**\n * Elastic easing out\n */\nexport const easeOutElastic: TEasingFunction = (t, b, c, d) => {\n const s = 1.70158,\n a = c;\n let p = 0;\n if (t === 0) {\n return b;\n }\n t /= d;\n if (t === 1) {\n return b + c;\n }\n if (!p) {\n p = d * 0.3;\n }\n const { a: normA, s: normS, p: normP, c: normC } = normalize(a, c, p, s);\n return (\n normA * 2 ** (-10 * t) * Math.sin(((t * d - normS) * twoMathPi) / normP) +\n normC +\n b\n );\n};\n\n/**\n * Elastic easing in and out\n */\nexport const easeInOutElastic: TEasingFunction = (t, b, c, d) => {\n const s = 1.70158,\n a = c;\n let p = 0;\n if (t === 0) {\n return b;\n }\n t /= d / 2;\n if (t === 2) {\n return b + c;\n }\n if (!p) {\n p = d * (0.3 * 1.5);\n }\n const { a: normA, s: normS, p: normP, c: normC } = normalize(a, c, p, s);\n if (t < 1) {\n return -0.5 * elastic(normA, normS, normP, t, d) + b;\n }\n return (\n normA *\n Math.pow(2, -10 * (t -= 1)) *\n Math.sin(((t * d - normS) * twoMathPi) / normP) *\n 0.5 +\n normC +\n b\n );\n};\n\n/**\n * Backwards easing in\n */\nexport const easeInBack: TEasingFunction = (t, b, c, d, s = 1.70158) =>\n c * (t /= d) * t * ((s + 1) * t - s) + b;\n\n/**\n * Backwards easing out\n */\nexport const easeOutBack: TEasingFunction = (t, b, c, d, s = 1.70158) =>\n c * ((t = t / d - 1) * t * ((s + 1) * t + s) + 1) + b;\n\n/**\n * Backwards easing in and out\n */\nexport const easeInOutBack: TEasingFunction = (t, b, c, d, s = 1.70158) => {\n t /= d / 2;\n if (t < 1) {\n return (c / 2) * (t * t * (((s *= 1.525) + 1) * t - s)) + b;\n }\n return (c / 2) * ((t -= 2) * t * (((s *= 1.525) + 1) * t + s) + 2) + b;\n};\n\n/**\n * Bouncing easing out\n */\nexport const easeOutBounce: TEasingFunction = (t, b, c, d) => {\n if ((t /= d) < 1 / 2.75) {\n return c * (7.5625 * t * t) + b;\n } else if (t < 2 / 2.75) {\n return c * (7.5625 * (t -= 1.5 / 2.75) * t + 0.75) + b;\n } else if (t < 2.5 / 2.75) {\n return c * (7.5625 * (t -= 2.25 / 2.75) * t + 0.9375) + b;\n } else {\n return c * (7.5625 * (t -= 2.625 / 2.75) * t + 0.984375) + b;\n }\n};\n\n/**\n * Bouncing easing in\n */\nexport const easeInBounce: TEasingFunction = (t, b, c, d) =>\n c - easeOutBounce(d - t, 0, c, d) + b;\n\n/**\n * Bouncing easing in and out\n */\nexport const easeInOutBounce: TEasingFunction = (t, b, c, d) =>\n t < d / 2\n ? easeInBounce(t * 2, 0, c, d) * 0.5 + b\n : easeOutBounce(t * 2 - d, 0, c, d) * 0.5 + c * 0.5 + b;\n\n/**\n * Quadratic easing in\n */\nexport const easeInQuad: TEasingFunction = (t, b, c, d) => c * (t /= d) * t + b;\n\n/**\n * Quadratic easing out\n */\nexport const easeOutQuad: TEasingFunction = (t, b, c, d) =>\n -c * (t /= d) * (t - 2) + b;\n\n/**\n * Quadratic easing in and out\n */\nexport const easeInOutQuad: TEasingFunction = (t, b, c, d) => {\n t /= d / 2;\n if (t < 1) {\n return (c / 2) * t ** 2 + b;\n }\n return (-c / 2) * (--t * (t - 2) - 1) + b;\n};\n","import { noop } from '../../constants';\nimport { requestAnimFrame } from './AnimationFrameProvider';\nimport { runningAnimations } from './AnimationRegistry';\nimport { defaultEasing } from './easing';\nimport type {\n AnimationState,\n TAbortCallback,\n TBaseAnimationOptions,\n TEasingFunction,\n TOnAnimationChangeCallback,\n} from './types';\n\nconst defaultAbort = () => false;\n\nexport abstract class AnimationBase<\n T extends number | number[] = number | number[],\n> {\n declare readonly startValue: T;\n declare readonly endValue: T;\n declare readonly duration: number;\n declare readonly delay: number;\n\n declare protected readonly byValue: T;\n declare protected readonly easing: TEasingFunction;\n\n declare private readonly _onStart: VoidFunction;\n declare private readonly _onChange: TOnAnimationChangeCallback;\n declare private readonly _onComplete: TOnAnimationChangeCallback;\n declare private readonly _abort: TAbortCallback;\n\n /**\n * Used to register the animation to a target object\n * so that it can be cancelled within the object context\n */\n declare readonly target?: unknown;\n\n private _state: AnimationState = 'pending';\n /**\n * Time %, or the ratio of `timeElapsed / duration`\n * @see tick\n */\n durationProgress = 0;\n /**\n * Value %, or the ratio of `(currentValue - startValue) / (endValue - startValue)`\n */\n valueProgress = 0;\n /**\n * Current value\n */\n declare value: T;\n /**\n * Animation start time ms\n */\n declare private startTime: number;\n\n constructor({\n startValue,\n byValue,\n duration = 500,\n delay = 0,\n easing = defaultEasing,\n onStart = noop,\n onChange = noop,\n onComplete = noop,\n abort = defaultAbort,\n target,\n }: TBaseAnimationOptions) {\n this.tick = this.tick.bind(this);\n\n this.duration = duration;\n this.delay = delay;\n this.easing = easing;\n this._onStart = onStart;\n this._onChange = onChange;\n this._onComplete = onComplete;\n this._abort = abort;\n this.target = target;\n\n this.startValue = startValue;\n this.byValue = byValue;\n this.value = this.startValue;\n this.endValue = Object.freeze(this.calculate(this.duration).value);\n }\n\n get state() {\n return this._state;\n }\n\n isDone() {\n return this._state === 'aborted' || this._state === 'completed';\n }\n\n /**\n * Calculate the current value based on the easing parameters\n * @param timeElapsed in ms\n * @protected\n */\n protected abstract calculate(timeElapsed: number): {\n value: T;\n valueProgress: number;\n };\n\n start() {\n const firstTick: FrameRequestCallback = (timestamp) => {\n if (this._state !== 'pending') return;\n this.startTime = timestamp || +new Date();\n this._state = 'running';\n this._onStart();\n this.tick(this.startTime);\n };\n\n this.register();\n\n // setTimeout(cb, 0) will run cb on the next frame, causing a delay\n // we don't want that\n if (this.delay > 0) {\n setTimeout(() => requestAnimFrame(firstTick), this.delay);\n } else {\n requestAnimFrame(firstTick);\n }\n }\n\n private tick(t: number) {\n const durationMs = (t || +new Date()) - this.startTime;\n const boundDurationMs = Math.min(durationMs, this.duration);\n this.durationProgress = boundDurationMs / this.duration;\n const { value, valueProgress } = this.calculate(boundDurationMs);\n this.value = Object.freeze(value);\n this.valueProgress = valueProgress;\n\n if (this._state === 'aborted') {\n return;\n } else if (\n this._abort(this.value, this.valueProgress, this.durationProgress)\n ) {\n this._state = 'aborted';\n this.unregister();\n } else if (durationMs >= this.duration) {\n this.durationProgress = this.valueProgress = 1;\n this._onChange(this.endValue, this.valueProgress, this.durationProgress);\n this._state = 'completed';\n this._onComplete(\n this.endValue,\n this.valueProgress,\n this.durationProgress,\n );\n this.unregister();\n } else {\n this._onChange(this.value, this.valueProgress, this.durationProgress);\n requestAnimFrame(this.tick);\n }\n }\n\n private register() {\n runningAnimations.push(this as unknown as AnimationBase);\n }\n\n private unregister() {\n runningAnimations.remove(this as unknown as AnimationBase);\n }\n\n abort() {\n this._state = 'aborted';\n this.unregister();\n }\n}\n","import { AnimationBase } from './AnimationBase';\nimport type { ValueAnimationOptions } from './types';\n\nexport class ValueAnimation extends AnimationBase {\n constructor({\n startValue = 0,\n endValue = 100,\n ...otherOptions\n }: ValueAnimationOptions) {\n super({\n ...otherOptions,\n startValue,\n byValue: endValue - startValue,\n });\n }\n\n protected calculate(timeElapsed: number) {\n const value = this.easing(\n timeElapsed,\n this.startValue,\n this.byValue,\n this.duration,\n );\n return {\n value,\n valueProgress: Math.abs((value - this.startValue) / this.byValue),\n };\n }\n}\n","import { AnimationBase } from './AnimationBase';\nimport type { ArrayAnimationOptions } from './types';\n\nexport class ArrayAnimation extends AnimationBase {\n constructor({\n startValue = [0],\n endValue = [100],\n ...options\n }: ArrayAnimationOptions) {\n super({\n ...options,\n startValue,\n byValue: endValue.map((value, i) => value - startValue[i]),\n });\n }\n protected calculate(timeElapsed: number) {\n const values = this.startValue.map((value, i) =>\n this.easing(timeElapsed, value, this.byValue[i], this.duration, i),\n );\n return {\n value: values,\n valueProgress: Math.abs(\n (values[0] - this.startValue[0]) / this.byValue[0],\n ),\n };\n }\n}\n","import { Color } from '../../color/Color';\nimport type { TRGBAColorSource } from '../../color/typedefs';\nimport { halfPI } from '../../constants';\nimport { capValue } from '../misc/capValue';\nimport { AnimationBase } from './AnimationBase';\nimport type {\n ColorAnimationOptions,\n TEasingFunction,\n TOnAnimationChangeCallback,\n} from './types';\n\nconst defaultColorEasing: TEasingFunction = (\n timeElapsed,\n startValue,\n byValue,\n duration,\n) => {\n const durationProgress = 1 - Math.cos((timeElapsed / duration) * halfPI);\n return startValue + byValue * durationProgress;\n};\n\nconst wrapColorCallback = (\n callback?: TOnAnimationChangeCallback,\n) =>\n callback &&\n ((rgba: TRGBAColorSource, valueProgress: number, durationProgress: number) =>\n callback(new Color(rgba).toRgba(), valueProgress, durationProgress));\n\nexport class ColorAnimation extends AnimationBase {\n constructor({\n startValue,\n endValue,\n easing = defaultColorEasing,\n onChange,\n onComplete,\n abort,\n ...options\n }: ColorAnimationOptions) {\n const startColor = new Color(startValue).getSource();\n const endColor = new Color(endValue).getSource();\n super({\n ...options,\n startValue: startColor,\n byValue: endColor.map(\n (value, i) => value - startColor[i],\n ) as TRGBAColorSource,\n easing,\n onChange: wrapColorCallback(onChange),\n onComplete: wrapColorCallback(onComplete),\n abort: wrapColorCallback(abort),\n });\n }\n protected calculate(timeElapsed: number) {\n const [r, g, b, a] = this.startValue.map((value, i) =>\n this.easing(timeElapsed, value, this.byValue[i], this.duration, i),\n ) as TRGBAColorSource;\n const value = [\n ...[r, g, b].map(Math.round),\n capValue(0, a, 1),\n ] as TRGBAColorSource;\n return {\n value,\n valueProgress:\n // to correctly calculate the change ratio we must find a changed value\n value\n .map((p, i) =>\n this.byValue[i] !== 0\n ? Math.abs((p - this.startValue[i]) / this.byValue[i])\n : 0,\n )\n .find((p) => p !== 0) || 0,\n };\n }\n}\n","import { ValueAnimation } from './ValueAnimation';\nimport { ArrayAnimation } from './ArrayAnimation';\nimport { ColorAnimation } from './ColorAnimation';\nimport type {\n ValueAnimationOptions,\n ArrayAnimationOptions,\n ColorAnimationOptions,\n} from './types';\nimport type { TColorArg } from '../../color/typedefs';\n\nexport type TAnimation =\n T extends TColorArg\n ? ColorAnimation\n : T extends number[]\n ? ArrayAnimation\n : ValueAnimation;\n\nconst isArrayAnimation = (\n options: ArrayAnimationOptions | ValueAnimationOptions,\n): options is ArrayAnimationOptions => {\n return Array.isArray(options.startValue) || Array.isArray(options.endValue);\n};\n\n/**\n * Changes value(s) from startValue to endValue within a certain period of time,\n * invoking callbacks as the value(s) change.\n *\n * @example\n * animate({\n * startValue: 1,\n * endValue: 0,\n * onChange: (v) => {\n * obj.set('opacity', v);\n * // since we are running in a requested frame we should call `renderAll` and not `requestRenderAll`\n * canvas.renderAll();\n * }\n * });\n *\n * @example Using lists:\n * animate({\n * startValue: [1, 2, 3],\n * endValue: [2, 4, 6],\n * onChange: ([x, y, zoom]) => {\n * canvas.zoomToPoint(new Point(x, y), zoom);\n * canvas.renderAll();\n * }\n * });\n *\n */\nexport function animate(options: ArrayAnimationOptions): ArrayAnimation;\nexport function animate(options: ValueAnimationOptions): ValueAnimation;\nexport function animate<\n T extends ValueAnimationOptions | ArrayAnimationOptions,\n>(\n options: T,\n): T extends ArrayAnimationOptions ? ArrayAnimation : ValueAnimation;\nexport function animate<\n T extends ValueAnimationOptions | ArrayAnimationOptions,\n R extends T extends ArrayAnimationOptions ? ArrayAnimation : ValueAnimation,\n>(options: T): R {\n const animation = (\n isArrayAnimation(options)\n ? new ArrayAnimation(options)\n : new ValueAnimation(options)\n ) as R;\n animation.start();\n return animation;\n}\n\nexport function animateColor(options: ColorAnimationOptions) {\n const animation = new ColorAnimation(options);\n animation.start();\n return animation;\n}\n","import { Point } from './Point';\nimport { createVector } from './util/misc/vectors';\n\n/* Adaptation of work of Kevin Lindsey (kevin@kevlindev.com) */\n\nexport type IntersectionType = 'Intersection' | 'Coincident' | 'Parallel';\n\nexport class Intersection {\n declare points: Point[];\n\n declare status?: IntersectionType;\n\n constructor(status?: IntersectionType) {\n this.status = status;\n this.points = [];\n }\n\n /**\n * Used to verify if a point is alredy in the collection\n * @param {Point} point\n * @returns {boolean}\n */\n private includes(point: Point): boolean {\n return this.points.some((p) => p.eq(point));\n }\n\n /**\n * Appends points of intersection\n * @param {...Point[]} points\n * @return {Intersection} thisArg\n */\n private append(...points: Point[]): Intersection {\n this.points = this.points.concat(\n points.filter((point) => {\n return !this.includes(point);\n }),\n );\n return this;\n }\n\n /**\n * check if point T is on the segment or line defined between A and B\n *\n * @param {Point} T the point we are checking for\n * @param {Point} A one extremity of the segment\n * @param {Point} B the other extremity of the segment\n * @param [infinite] if true checks if `T` is on the line defined by `A` and `B`\n * @returns true if `T` is contained\n */\n static isPointContained(T: Point, A: Point, B: Point, infinite = false) {\n if (A.eq(B)) {\n // Edge case: the segment is a point, we check for coincidence,\n // infinite param has no meaning because there are infinite lines to consider\n return T.eq(A);\n } else if (A.x === B.x) {\n // Edge case: horizontal line.\n // we first check if T.x has the same value, and then if T.y is contained between A.y and B.y\n return (\n T.x === A.x &&\n (infinite || (T.y >= Math.min(A.y, B.y) && T.y <= Math.max(A.y, B.y)))\n );\n } else if (A.y === B.y) {\n // Edge case: vertical line.\n // we first check if T.y has the same value, and then if T.x is contained between A.x and B.x\n return (\n T.y === A.y &&\n (infinite || (T.x >= Math.min(A.x, B.x) && T.x <= Math.max(A.x, B.x)))\n );\n } else {\n // Generic case: sloped line.\n // we check that AT has the same slope as AB\n // for the segment case we need both the vectors to have the same direction and for AT to be lte AB in size\n // for the infinite case we check the absolute value of the slope, since direction is meaningless\n const AB = createVector(A, B);\n const AT = createVector(A, T);\n const s = AT.divide(AB);\n return infinite\n ? Math.abs(s.x) === Math.abs(s.y)\n : s.x === s.y && s.x >= 0 && s.x <= 1;\n }\n }\n\n /**\n * Use the ray casting algorithm to determine if point is in the polygon defined by points\n * @see https://en.wikipedia.org/wiki/Point_in_polygon\n * @param point\n * @param points polygon points\n * @returns\n */\n static isPointInPolygon(point: Point, points: Point[]) {\n const other = new Point(point).setX(\n Math.min(point.x - 1, ...points.map((p) => p.x)),\n );\n let hits = 0;\n for (let index = 0; index < points.length; index++) {\n const inter = this.intersectSegmentSegment(\n // polygon side\n points[index],\n points[(index + 1) % points.length],\n // ray\n point,\n other,\n );\n if (inter.includes(point)) {\n // point is on the polygon side\n return true;\n }\n hits += Number(inter.status === 'Intersection');\n }\n return hits % 2 === 1;\n }\n\n /**\n * Checks if a line intersects another\n * @see {@link https://en.wikipedia.org/wiki/Line%E2%80%93line_intersection line intersection}\n * @see {@link https://en.wikipedia.org/wiki/Cramer%27s_rule Cramer's rule}\n * @param {Point} a1\n * @param {Point} a2\n * @param {Point} b1\n * @param {Point} b2\n * @param {boolean} [aInfinite=true] check segment intersection by passing `false`\n * @param {boolean} [bInfinite=true] check segment intersection by passing `false`\n * @return {Intersection}\n */\n static intersectLineLine(\n a1: Point,\n a2: Point,\n b1: Point,\n b2: Point,\n aInfinite = true,\n bInfinite = true,\n ): Intersection {\n const a2xa1x = a2.x - a1.x,\n a2ya1y = a2.y - a1.y,\n b2xb1x = b2.x - b1.x,\n b2yb1y = b2.y - b1.y,\n a1xb1x = a1.x - b1.x,\n a1yb1y = a1.y - b1.y,\n uaT = b2xb1x * a1yb1y - b2yb1y * a1xb1x,\n ubT = a2xa1x * a1yb1y - a2ya1y * a1xb1x,\n uB = b2yb1y * a2xa1x - b2xb1x * a2ya1y;\n if (uB !== 0) {\n const ua = uaT / uB,\n ub = ubT / uB;\n if (\n (aInfinite || (0 <= ua && ua <= 1)) &&\n (bInfinite || (0 <= ub && ub <= 1))\n ) {\n return new Intersection('Intersection').append(\n new Point(a1.x + ua * a2xa1x, a1.y + ua * a2ya1y),\n );\n } else {\n return new Intersection();\n }\n } else {\n if (uaT === 0 || ubT === 0) {\n const segmentsCoincide =\n aInfinite ||\n bInfinite ||\n Intersection.isPointContained(a1, b1, b2) ||\n Intersection.isPointContained(a2, b1, b2) ||\n Intersection.isPointContained(b1, a1, a2) ||\n Intersection.isPointContained(b2, a1, a2);\n return new Intersection(segmentsCoincide ? 'Coincident' : undefined);\n } else {\n return new Intersection('Parallel');\n }\n }\n }\n\n /**\n * Checks if a segment intersects a line\n * @see {@link intersectLineLine} for line intersection\n * @param {Point} s1 boundary point of segment\n * @param {Point} s2 other boundary point of segment\n * @param {Point} l1 point on line\n * @param {Point} l2 other point on line\n * @return {Intersection}\n */\n static intersectSegmentLine(\n s1: Point,\n s2: Point,\n l1: Point,\n l2: Point,\n ): Intersection {\n return Intersection.intersectLineLine(s1, s2, l1, l2, false, true);\n }\n\n /**\n * Checks if a segment intersects another\n * @see {@link intersectLineLine} for line intersection\n * @param {Point} a1 boundary point of segment\n * @param {Point} a2 other boundary point of segment\n * @param {Point} b1 boundary point of segment\n * @param {Point} b2 other boundary point of segment\n * @return {Intersection}\n */\n static intersectSegmentSegment(\n a1: Point,\n a2: Point,\n b1: Point,\n b2: Point,\n ): Intersection {\n return Intersection.intersectLineLine(a1, a2, b1, b2, false, false);\n }\n\n /**\n * Checks if line intersects polygon\n *\n * @todo account for stroke\n *\n * @see {@link intersectSegmentPolygon} for segment intersection\n * @param {Point} a1 point on line\n * @param {Point} a2 other point on line\n * @param {Point[]} points polygon points\n * @param {boolean} [infinite=true] check segment intersection by passing `false`\n * @return {Intersection}\n */\n static intersectLinePolygon(\n a1: Point,\n a2: Point,\n points: Point[],\n infinite = true,\n ): Intersection {\n const result = new Intersection();\n const length = points.length;\n\n for (let i = 0, b1, b2, inter; i < length; i++) {\n b1 = points[i];\n b2 = points[(i + 1) % length];\n inter = Intersection.intersectLineLine(a1, a2, b1, b2, infinite, false);\n if (inter.status === 'Coincident') {\n return inter;\n }\n result.append(...inter.points);\n }\n\n if (result.points.length > 0) {\n result.status = 'Intersection';\n }\n\n return result;\n }\n\n /**\n * Checks if segment intersects polygon\n * @see {@link intersectLinePolygon} for line intersection\n * @param {Point} a1 boundary point of segment\n * @param {Point} a2 other boundary point of segment\n * @param {Point[]} points polygon points\n * @return {Intersection}\n */\n static intersectSegmentPolygon(\n a1: Point,\n a2: Point,\n points: Point[],\n ): Intersection {\n return Intersection.intersectLinePolygon(a1, a2, points, false);\n }\n\n /**\n * Checks if polygon intersects another polygon\n *\n * @todo account for stroke\n *\n * @param {Point[]} points1\n * @param {Point[]} points2\n * @return {Intersection}\n */\n static intersectPolygonPolygon(\n points1: Point[],\n points2: Point[],\n ): Intersection {\n const result = new Intersection(),\n length = points1.length;\n const coincidences: Intersection[] = [];\n\n for (let i = 0; i < length; i++) {\n const a1 = points1[i],\n a2 = points1[(i + 1) % length],\n inter = Intersection.intersectSegmentPolygon(a1, a2, points2);\n if (inter.status === 'Coincident') {\n coincidences.push(inter);\n result.append(a1, a2);\n } else {\n result.append(...inter.points);\n }\n }\n\n if (coincidences.length > 0 && coincidences.length === points1.length) {\n return new Intersection('Coincident');\n } else if (result.points.length > 0) {\n result.status = 'Intersection';\n }\n\n return result;\n }\n\n /**\n * Checks if polygon intersects rectangle\n * @see {@link intersectPolygonPolygon} for polygon intersection\n * @param {Point[]} points polygon points\n * @param {Point} r1 top left point of rect\n * @param {Point} r2 bottom right point of rect\n * @return {Intersection}\n */\n static intersectPolygonRectangle(\n points: Point[],\n r1: Point,\n r2: Point,\n ): Intersection {\n const min = r1.min(r2),\n max = r1.max(r2),\n topRight = new Point(max.x, min.y),\n bottomLeft = new Point(min.x, max.y);\n\n return Intersection.intersectPolygonPolygon(points, [\n min,\n topRight,\n max,\n bottomLeft,\n ]);\n }\n}\n","import type {\n TBBox,\n TCornerPoint,\n TDegree,\n TMat2D,\n TOriginX,\n TOriginY,\n} from '../../typedefs';\nimport { SCALE_X, SCALE_Y, iMatrix } from '../../constants';\nimport { Intersection } from '../../Intersection';\nimport { Point } from '../../Point';\nimport { makeBoundingBoxFromPoints } from '../../util/misc/boundingBoxFromPoints';\nimport {\n createRotateMatrix,\n createTranslateMatrix,\n composeMatrix,\n invertTransform,\n multiplyTransformMatrices,\n transformPoint,\n calcPlaneRotation,\n} from '../../util/misc/matrix';\nimport { radiansToDegrees } from '../../util/misc/radiansDegreesConversion';\nimport type { Canvas } from '../../canvas/Canvas';\nimport type { StaticCanvas } from '../../canvas/StaticCanvas';\nimport type { ObjectEvents } from '../../EventTypeDefs';\nimport type { ControlProps } from './types/ControlProps';\nimport { resolveOrigin } from '../../util/misc/resolveOrigin';\nimport type { Group } from '../Group';\nimport { calcDimensionsMatrix } from '../../util/misc/matrix';\nimport { sizeAfterTransform } from '../../util/misc/objectTransforms';\nimport { degreesToRadians } from '../../util/misc/radiansDegreesConversion';\nimport { CommonMethods } from '../../CommonMethods';\nimport type { BaseProps } from './types/BaseProps';\nimport type { FillStrokeProps } from './types/FillStrokeProps';\nimport { CENTER, LEFT, TOP } from '../../constants';\n\ntype TMatrixCache = {\n key: number[];\n value: TMat2D;\n};\n\ntype TACoords = TCornerPoint;\n\nexport class ObjectGeometry\n extends CommonMethods\n implements\n Pick,\n BaseProps,\n Pick\n{\n // #region Geometry\n\n declare padding: number;\n\n /**\n * Describe object's corner position in scene coordinates.\n * The coordinates are derived from the following:\n * left, top, width, height, scaleX, scaleY, skewX, skewY, angle, strokeWidth.\n * The coordinates do not depend on viewport changes.\n * The coordinates get updated with {@link setCoords}.\n * You can calculate them without updating with {@link calcACoords()}\n */\n declare aCoords: TACoords;\n\n /**\n * storage cache for object transform matrix\n */\n declare ownMatrixCache?: TMatrixCache;\n\n /**\n * storage cache for object full transform matrix\n */\n declare matrixCache?: TMatrixCache;\n\n /**\n * A Reference of the Canvas where the object is actually added\n * @type StaticCanvas | Canvas;\n * @default undefined\n * @private\n */\n declare canvas?: StaticCanvas | Canvas;\n\n /**\n * @returns {number} x position according to object's originX property in canvas coordinate plane\n */\n getX(): number {\n return this.getXY().x;\n }\n\n /**\n * @param {number} value x position according to object's originX property in canvas coordinate plane\n */\n setX(value: number) {\n this.setXY(this.getXY().setX(value));\n }\n\n /**\n * @returns {number} y position according to object's originY property in canvas coordinate plane\n */\n getY(): number {\n return this.getXY().y;\n }\n\n /**\n * @param {number} value y position according to object's originY property in canvas coordinate plane\n */\n setY(value: number) {\n this.setXY(this.getXY().setY(value));\n }\n\n /**\n * @returns {number} x position according to object's originX property in parent's coordinate plane\\\n * if parent is canvas then this property is identical to {@link getX}\n */\n getRelativeX(): number {\n return this.left;\n }\n\n /**\n * @param {number} value x position according to object's originX property in parent's coordinate plane\\\n * if parent is canvas then this method is identical to {@link setX}\n */\n setRelativeX(value: number) {\n this.left = value;\n }\n\n /**\n * @returns {number} y position according to object's originY property in parent's coordinate plane\\\n * if parent is canvas then this property is identical to {@link getY}\n */\n getRelativeY(): number {\n return this.top;\n }\n\n /**\n * @param {number} value y position according to object's originY property in parent's coordinate plane\\\n * if parent is canvas then this property is identical to {@link setY}\n */\n setRelativeY(value: number) {\n this.top = value;\n }\n\n /**\n * @returns {Point} x position according to object's originX originY properties in canvas coordinate plane\n */\n getXY(): Point {\n const relativePosition = this.getRelativeXY();\n return this.group\n ? transformPoint(relativePosition, this.group.calcTransformMatrix())\n : relativePosition;\n }\n\n /**\n * Set an object position to a particular point, the point is intended in absolute ( canvas ) coordinate.\n * You can specify originX and originY values,\n * that otherwise are the object's current values.\n * @example Set object's bottom left corner to point (5,5) on canvas\n * object.setXY(new Point(5, 5), 'left', 'bottom').\n * @param {Point} point position in scene coordinate plane\n * @param {TOriginX} [originX] Horizontal origin: 'left', 'center' or 'right'\n * @param {TOriginY} [originY] Vertical origin: 'top', 'center' or 'bottom'\n */\n setXY(point: Point, originX?: TOriginX, originY?: TOriginY) {\n if (this.group) {\n point = transformPoint(\n point,\n invertTransform(this.group.calcTransformMatrix()),\n );\n }\n this.setRelativeXY(point, originX, originY);\n }\n\n /**\n * @returns {Point} x,y position according to object's originX originY properties in parent's coordinate plane\n */\n getRelativeXY(): Point {\n return new Point(this.left, this.top);\n }\n\n /**\n * As {@link setXY}, but in current parent's coordinate plane (the current group if any or the canvas)\n * @param {Point} point position according to object's originX originY properties in parent's coordinate plane\n * @param {TOriginX} [originX] Horizontal origin: 'left', 'center' or 'right'\n * @param {TOriginY} [originY] Vertical origin: 'top', 'center' or 'bottom'\n */\n setRelativeXY(\n point: Point,\n originX: TOriginX = this.originX,\n originY: TOriginY = this.originY,\n ) {\n this.setPositionByOrigin(point, originX, originY);\n }\n\n /**\n * @deprecated intermidiate method to be removed, do not use\n */\n protected isStrokeAccountedForInDimensions() {\n return false;\n }\n\n /**\n * @return {Point[]} [tl, tr, br, bl] in the scene plane\n */\n getCoords(): Point[] {\n const { tl, tr, br, bl } =\n this.aCoords || (this.aCoords = this.calcACoords());\n const coords = [tl, tr, br, bl];\n if (this.group) {\n const t = this.group.calcTransformMatrix();\n return coords.map((p) => transformPoint(p, t));\n }\n return coords;\n }\n\n /**\n * Checks if object intersects with the scene rect formed by tl and br\n */\n intersectsWithRect(tl: Point, br: Point): boolean {\n const intersection = Intersection.intersectPolygonRectangle(\n this.getCoords(),\n tl,\n br,\n );\n return intersection.status === 'Intersection';\n }\n\n /**\n * Checks if object intersects with another object\n * @param {Object} other Object to test\n * @return {Boolean} true if object intersects with another object\n */\n intersectsWithObject(other: ObjectGeometry): boolean {\n const intersection = Intersection.intersectPolygonPolygon(\n this.getCoords(),\n other.getCoords(),\n );\n\n return (\n intersection.status === 'Intersection' ||\n intersection.status === 'Coincident' ||\n other.isContainedWithinObject(this) ||\n this.isContainedWithinObject(other)\n );\n }\n\n /**\n * Checks if object is fully contained within area of another object\n * @param {Object} other Object to test\n * @return {Boolean} true if object is fully contained within area of another object\n */\n isContainedWithinObject(other: ObjectGeometry): boolean {\n const points = this.getCoords();\n return points.every((point) => other.containsPoint(point));\n }\n\n /**\n * Checks if object is fully contained within the scene rect formed by tl and br\n */\n isContainedWithinRect(tl: Point, br: Point): boolean {\n const { left, top, width, height } = this.getBoundingRect();\n return (\n left >= tl.x &&\n left + width <= br.x &&\n top >= tl.y &&\n top + height <= br.y\n );\n }\n\n isOverlapping(other: T): boolean {\n return (\n this.intersectsWithObject(other) ||\n this.isContainedWithinObject(other) ||\n other.isContainedWithinObject(this)\n );\n }\n\n /**\n * Checks if point is inside the object\n * @param {Point} point Point to check against\n * @return {Boolean} true if point is inside the object\n */\n containsPoint(point: Point): boolean {\n return Intersection.isPointInPolygon(point, this.getCoords());\n }\n\n /**\n * Checks if object is contained within the canvas with current viewportTransform\n * the check is done stopping at first point that appears on screen\n * @return {Boolean} true if object is fully or partially contained within canvas\n */\n isOnScreen(): boolean {\n if (!this.canvas) {\n return false;\n }\n const { tl, br } = this.canvas.vptCoords;\n const points = this.getCoords();\n // if some point is on screen, the object is on screen.\n if (\n points.some(\n (point) =>\n point.x <= br.x &&\n point.x >= tl.x &&\n point.y <= br.y &&\n point.y >= tl.y,\n )\n ) {\n return true;\n }\n // no points on screen, check intersection with absolute coordinates\n if (this.intersectsWithRect(tl, br)) {\n return true;\n }\n // check if the object is so big that it contains the entire viewport\n return this.containsPoint(tl.midPointFrom(br));\n }\n\n /**\n * Checks if object is partially contained within the canvas with current viewportTransform\n * @return {Boolean} true if object is partially contained within canvas\n */\n isPartiallyOnScreen(): boolean {\n if (!this.canvas) {\n return false;\n }\n const { tl, br } = this.canvas.vptCoords;\n if (this.intersectsWithRect(tl, br)) {\n return true;\n }\n const allPointsAreOutside = this.getCoords().every(\n (point) =>\n (point.x >= br.x || point.x <= tl.x) &&\n (point.y >= br.y || point.y <= tl.y),\n );\n // check if the object is so big that it contains the entire viewport\n return allPointsAreOutside && this.containsPoint(tl.midPointFrom(br));\n }\n\n /**\n * Returns coordinates of object's bounding rectangle (left, top, width, height)\n * the box is intended as aligned to axis of canvas.\n * @return {Object} Object with left, top, width, height properties\n */\n getBoundingRect(): TBBox {\n return makeBoundingBoxFromPoints(this.getCoords());\n }\n\n /**\n * Returns width of an object's bounding box counting transformations\n * @todo shouldn't this account for group transform and return the actual size in canvas coordinate plane?\n * @return {Number} width value\n */\n getScaledWidth(): number {\n return this._getTransformedDimensions().x;\n }\n\n /**\n * Returns height of an object bounding box counting transformations\n * @todo shouldn't this account for group transform and return the actual size in canvas coordinate plane?\n * @return {Number} height value\n */\n getScaledHeight(): number {\n return this._getTransformedDimensions().y;\n }\n\n /**\n * Scales an object (equally by x and y)\n * @param {Number} value Scale factor\n * @return {void}\n */\n scale(value: number): void {\n this._set(SCALE_X, value);\n this._set(SCALE_Y, value);\n this.setCoords();\n }\n\n /**\n * Scales an object to a given width, with respect to bounding box (scaling by x/y equally)\n * @param {Number} value New width value\n * @return {void}\n */\n scaleToWidth(value: number) {\n // adjust to bounding rect factor so that rotated shapes would fit as well\n const boundingRectFactor =\n this.getBoundingRect().width / this.getScaledWidth();\n return this.scale(value / this.width / boundingRectFactor);\n }\n\n /**\n * Scales an object to a given height, with respect to bounding box (scaling by x/y equally)\n * @param {Number} value New height value\n * @return {void}\n */\n scaleToHeight(value: number) {\n // adjust to bounding rect factor so that rotated shapes would fit as well\n const boundingRectFactor =\n this.getBoundingRect().height / this.getScaledHeight();\n return this.scale(value / this.height / boundingRectFactor);\n }\n\n getCanvasRetinaScaling() {\n return this.canvas?.getRetinaScaling() || 1;\n }\n\n /**\n * Returns the object angle relative to canvas counting also the group property\n * @returns {TDegree}\n */\n getTotalAngle(): TDegree {\n return this.group\n ? radiansToDegrees(calcPlaneRotation(this.calcTransformMatrix()))\n : this.angle;\n }\n\n /**\n * Retrieves viewportTransform from Object's canvas if available\n * @return {TMat2D}\n */\n getViewportTransform(): TMat2D {\n return this.canvas?.viewportTransform || (iMatrix.concat() as TMat2D);\n }\n\n /**\n * Calculates the coordinates of the 4 corner of the bbox, in absolute coordinates.\n * those never change with zoom or viewport changes.\n * @return {TCornerPoint}\n */\n calcACoords(): TCornerPoint {\n const rotateMatrix = createRotateMatrix({ angle: this.angle }),\n { x, y } = this.getRelativeCenterPoint(),\n tMatrix = createTranslateMatrix(x, y),\n finalMatrix = multiplyTransformMatrices(tMatrix, rotateMatrix),\n dim = this._getTransformedDimensions(),\n w = dim.x / 2,\n h = dim.y / 2;\n return {\n // corners\n tl: transformPoint({ x: -w, y: -h }, finalMatrix),\n tr: transformPoint({ x: w, y: -h }, finalMatrix),\n bl: transformPoint({ x: -w, y: h }, finalMatrix),\n br: transformPoint({ x: w, y: h }, finalMatrix),\n };\n }\n\n /**\n * Sets corner and controls position coordinates based on current angle, width and height, left and top.\n * aCoords are used to quickly find an object on the canvas.\n * See {@link https://github.com/fabricjs/fabric.js/wiki/When-to-call-setCoords} and {@link http://fabric5.fabricjs.com/fabric-gotchas}\n */\n setCoords(): void {\n this.aCoords = this.calcACoords();\n }\n\n transformMatrixKey(skipGroup = false): number[] {\n let prefix: number[] = [];\n if (!skipGroup && this.group) {\n prefix = this.group.transformMatrixKey(skipGroup);\n }\n prefix.push(\n this.top,\n this.left,\n this.width,\n this.height,\n this.scaleX,\n this.scaleY,\n this.angle,\n this.strokeWidth,\n this.skewX,\n this.skewY,\n +this.flipX,\n +this.flipY,\n resolveOrigin(this.originX),\n resolveOrigin(this.originY),\n );\n\n return prefix;\n }\n\n /**\n * calculate transform matrix that represents the current transformations from the\n * object's properties.\n * @param {Boolean} [skipGroup] return transform matrix for object not counting parent transformations\n * There are some situation in which this is useful to avoid the fake rotation.\n * @return {TMat2D} transform matrix for the object\n */\n calcTransformMatrix(skipGroup = false): TMat2D {\n let matrix = this.calcOwnMatrix();\n if (skipGroup || !this.group) {\n return matrix;\n }\n const key = this.transformMatrixKey(skipGroup),\n cache = this.matrixCache;\n if (cache && cache.key.every((x, i) => x === key[i])) {\n return cache.value;\n }\n if (this.group) {\n matrix = multiplyTransformMatrices(\n this.group.calcTransformMatrix(false),\n matrix,\n );\n }\n this.matrixCache = {\n key,\n value: matrix,\n };\n return matrix;\n }\n\n /**\n * calculate transform matrix that represents the current transformations from the\n * object's properties, this matrix does not include the group transformation\n * @return {TMat2D} transform matrix for the object\n */\n calcOwnMatrix(): TMat2D {\n const key = this.transformMatrixKey(true),\n cache = this.ownMatrixCache;\n if (cache && cache.key === key) {\n return cache.value;\n }\n const center = this.getRelativeCenterPoint(),\n options = {\n angle: this.angle,\n translateX: center.x,\n translateY: center.y,\n scaleX: this.scaleX,\n scaleY: this.scaleY,\n skewX: this.skewX,\n skewY: this.skewY,\n flipX: this.flipX,\n flipY: this.flipY,\n },\n value = composeMatrix(options);\n this.ownMatrixCache = {\n key,\n value,\n };\n return value;\n }\n\n /**\n * Calculate object dimensions from its properties\n * @private\n * @returns {Point} dimensions\n */\n _getNonTransformedDimensions(): Point {\n return new Point(this.width, this.height).scalarAdd(this.strokeWidth);\n }\n\n /**\n * Calculate object dimensions for controls box, including padding and canvas zoom.\n * and active selection\n * @private\n * @param {object} [options] transform options\n * @returns {Point} dimensions\n */\n _calculateCurrentDimensions(options?: any): Point {\n return this._getTransformedDimensions(options)\n .transform(this.getViewportTransform(), true)\n .scalarAdd(2 * this.padding);\n }\n\n // #region Origin\n\n declare top: number;\n declare left: number;\n declare width: number;\n declare height: number;\n declare flipX: boolean;\n declare flipY: boolean;\n declare scaleX: number;\n declare scaleY: number;\n declare skewX: number;\n declare skewY: number;\n /**\n * @deprecated please use 'center' as value in new projects\n * */\n declare originX: TOriginX;\n /**\n * @deprecated please use 'center' as value in new projects\n * */\n declare originY: TOriginY;\n declare angle: TDegree;\n declare strokeWidth: number;\n declare strokeUniform: boolean;\n\n /**\n * Object containing this object.\n * can influence its size and position\n */\n declare group?: Group;\n\n /**\n * Calculate object bounding box dimensions from its properties scale, skew.\n * This bounding box is aligned with object angle and not with canvas axis or screen.\n * @param {Object} [options]\n * @param {Number} [options.scaleX]\n * @param {Number} [options.scaleY]\n * @param {Number} [options.skewX]\n * @param {Number} [options.skewY]\n * @private\n * @returns {Point} dimensions\n */\n _getTransformedDimensions(options: any = {}): Point {\n const dimOptions = {\n // if scaleX or scaleY are negative numbers,\n // this will return dimensions that are negative.\n // and this will break assumptions around the codebase\n scaleX: this.scaleX,\n scaleY: this.scaleY,\n skewX: this.skewX,\n skewY: this.skewY,\n width: this.width,\n height: this.height,\n strokeWidth: this.strokeWidth,\n // TODO remove this spread. is visible in the performance inspection\n ...options,\n };\n // stroke is applied before/after transformations are applied according to `strokeUniform`\n const strokeWidth = dimOptions.strokeWidth;\n let preScalingStrokeValue = strokeWidth,\n postScalingStrokeValue = 0;\n\n if (this.strokeUniform) {\n preScalingStrokeValue = 0;\n postScalingStrokeValue = strokeWidth;\n }\n const dimX = dimOptions.width + preScalingStrokeValue,\n dimY = dimOptions.height + preScalingStrokeValue,\n noSkew = dimOptions.skewX === 0 && dimOptions.skewY === 0;\n let finalDimensions;\n if (noSkew) {\n finalDimensions = new Point(\n dimX * dimOptions.scaleX,\n dimY * dimOptions.scaleY,\n );\n } else {\n finalDimensions = sizeAfterTransform(\n dimX,\n dimY,\n calcDimensionsMatrix(dimOptions),\n );\n }\n\n return finalDimensions.scalarAdd(postScalingStrokeValue);\n }\n\n /**\n * Translates the coordinates from a set of origin to another (based on the object's dimensions)\n * @param {Point} point The point which corresponds to the originX and originY params\n * @param {TOriginX} fromOriginX Horizontal origin: 'left', 'center' or 'right'\n * @param {TOriginY} fromOriginY Vertical origin: 'top', 'center' or 'bottom'\n * @param {TOriginX} toOriginX Horizontal origin: 'left', 'center' or 'right'\n * @param {TOriginY} toOriginY Vertical origin: 'top', 'center' or 'bottom'\n * @return {Point}\n */\n translateToGivenOrigin(\n point: Point,\n fromOriginX: TOriginX,\n fromOriginY: TOriginY,\n toOriginX: TOriginX,\n toOriginY: TOriginY,\n ): Point {\n let x = point.x,\n y = point.y;\n const offsetX = resolveOrigin(toOriginX) - resolveOrigin(fromOriginX),\n offsetY = resolveOrigin(toOriginY) - resolveOrigin(fromOriginY);\n\n if (offsetX || offsetY) {\n const dim = this._getTransformedDimensions();\n x += offsetX * dim.x;\n y += offsetY * dim.y;\n }\n\n return new Point(x, y);\n }\n\n /**\n * Translates the coordinates from origin to center coordinates (based on the object's dimensions)\n * @param {Point} point The point which corresponds to the originX and originY params\n * @param {TOriginX} originX Horizontal origin: 'left', 'center' or 'right'\n * @param {TOriginY} originY Vertical origin: 'top', 'center' or 'bottom'\n * @return {Point}\n */\n translateToCenterPoint(\n point: Point,\n originX: TOriginX,\n originY: TOriginY,\n ): Point {\n if (originX === CENTER && originY === CENTER) {\n return point;\n }\n const p = this.translateToGivenOrigin(\n point,\n originX,\n originY,\n CENTER,\n CENTER,\n );\n if (this.angle) {\n return p.rotate(degreesToRadians(this.angle), point);\n }\n return p;\n }\n\n /**\n * Translates the coordinates from center to origin coordinates (based on the object's dimensions)\n * @param {Point} center The point which corresponds to center of the object\n * @param {OriginX} originX Horizontal origin: 'left', 'center' or 'right'\n * @param {OriginY} originY Vertical origin: 'top', 'center' or 'bottom'\n * @return {Point}\n */\n translateToOriginPoint(\n center: Point,\n originX: TOriginX,\n originY: TOriginY,\n ): Point {\n const p = this.translateToGivenOrigin(\n center,\n CENTER,\n CENTER,\n originX,\n originY,\n );\n if (this.angle) {\n return p.rotate(degreesToRadians(this.angle), center);\n }\n return p;\n }\n\n /**\n * Returns the center coordinates of the object relative to canvas\n * @return {Point}\n */\n getCenterPoint(): Point {\n const relCenter = this.getRelativeCenterPoint();\n return this.group\n ? transformPoint(relCenter, this.group.calcTransformMatrix())\n : relCenter;\n }\n\n /**\n * Returns the center coordinates of the object relative to it's parent\n * @return {Point}\n */\n getRelativeCenterPoint(): Point {\n return this.translateToCenterPoint(\n new Point(this.left, this.top),\n this.originX,\n this.originY,\n );\n }\n\n /**\n * Returns the position of the object as if it has a different origin.\n * Take an object that has left, top set to 100, 100 with origin 'left', 'top'.\n * Return the values of left top ( wrapped in a point ) that you would need to keep\n * the same position if origin where different.\n * Alternatively you can use this to also find which point in the parent plane is a specific origin\n * ( where is the bottom right corner of my object? )\n * @param {TOriginX} originX Horizontal origin: 'left', 'center' or 'right'\n * @param {TOriginY} originY Vertical origin: 'top', 'center' or 'bottom'\n * @return {Point}\n */\n getPointByOrigin(originX: TOriginX, originY: TOriginY): Point {\n return this.translateToOriginPoint(\n this.getRelativeCenterPoint(),\n originX,\n originY,\n );\n }\n\n /**\n * Sets the position of the object taking into consideration the object's origin\n * @param {Point} pos The new position of the object\n * @param {TOriginX} originX Horizontal origin: 'left', 'center' or 'right'\n * @param {TOriginY} originY Vertical origin: 'top', 'center' or 'bottom'\n * @return {void}\n */\n setPositionByOrigin(pos: Point, originX: TOriginX, originY: TOriginY) {\n const center = this.translateToCenterPoint(pos, originX, originY),\n position = this.translateToOriginPoint(\n center,\n this.originX,\n this.originY,\n );\n this.set({ left: position.x, top: position.y });\n }\n\n /**\n * @private\n */\n _getLeftTopCoords() {\n return this.translateToOriginPoint(\n this.getRelativeCenterPoint(),\n LEFT,\n TOP,\n );\n }\n}\n","import { cache } from '../../cache';\nimport { config } from '../../config';\nimport {\n ALIASING_LIMIT,\n CENTER,\n iMatrix,\n LEFT,\n SCALE_X,\n SCALE_Y,\n STROKE,\n FILL,\n TOP,\n VERSION,\n} from '../../constants';\nimport type { ObjectEvents } from '../../EventTypeDefs';\nimport { Point } from '../../Point';\nimport { Shadow } from '../../Shadow';\nimport type {\n TDegree,\n TFiller,\n TSize,\n TCacheCanvasDimensions,\n Abortable,\n TOptions,\n ImageFormat,\n} from '../../typedefs';\nimport { classRegistry } from '../../ClassRegistry';\nimport { runningAnimations } from '../../util/animation/AnimationRegistry';\nimport { capValue } from '../../util/misc/capValue';\nimport {\n createCanvasElement,\n createCanvasElementFor,\n toDataURL,\n toBlob,\n} from '../../util/misc/dom';\nimport { invertTransform, qrDecompose } from '../../util/misc/matrix';\nimport { enlivenObjectEnlivables } from '../../util/misc/objectEnlive';\nimport {\n resetObjectTransform,\n saveObjectTransform,\n} from '../../util/misc/objectTransforms';\nimport { sendObjectToPlane } from '../../util/misc/planeChange';\nimport { pick, pickBy } from '../../util/misc/pick';\nimport { toFixed } from '../../util/misc/toFixed';\nimport type { Group } from '../Group';\nimport { StaticCanvas } from '../../canvas/StaticCanvas';\nimport { isFiller, isSerializableFiller } from '../../util/typeAssertions';\nimport type { FabricImage } from '../Image';\nimport {\n cacheProperties,\n fabricObjectDefaultValues,\n stateProperties,\n} from './defaultValues';\nimport type { Gradient } from '../../gradient/Gradient';\nimport type { Pattern } from '../../Pattern';\nimport type { Canvas } from '../../canvas/Canvas';\nimport type { SerializedObjectProps } from './types/SerializedObjectProps';\nimport type { ObjectProps } from './types/ObjectProps';\nimport { getDevicePixelRatio, getEnv } from '../../env';\nimport { log } from '../../util/internals/console';\nimport type { TColorArg } from '../../color/typedefs';\nimport type { TAnimation } from '../../util/animation/animate';\nimport { animate, animateColor } from '../../util/animation/animate';\nimport type {\n AnimationOptions,\n ArrayAnimationOptions,\n ColorAnimationOptions,\n ValueAnimationOptions,\n} from '../../util/animation/types';\nimport { ObjectGeometry } from './ObjectGeometry';\n\ntype TAncestor = FabricObject;\ntype TCollection = Group;\n\nexport type Ancestors =\n | [FabricObject | Group]\n | [FabricObject | Group, ...Group[]]\n | Group[];\n\nexport type AncestryComparison = {\n /**\n * common ancestors of `this` and`other`(may include`this` | `other`)\n */\n common: Ancestors;\n /**\n * ancestors that are of `this` only\n */\n fork: Ancestors;\n /**\n * ancestors that are of `other` only\n */\n otherFork: Ancestors;\n};\n\nexport type TCachedFabricObject = T &\n Required<\n Pick<\n T,\n | 'zoomX'\n | 'zoomY'\n | '_cacheCanvas'\n | '_cacheContext'\n | 'cacheTranslationX'\n | 'cacheTranslationY'\n >\n > & {\n _cacheContext: CanvasRenderingContext2D;\n };\n\nexport type ObjectToCanvasElementOptions = {\n format?: ImageFormat;\n /** Multiplier to scale by */\n multiplier?: number;\n /** Cropping left offset. Introduced in v1.2.14 */\n left?: number;\n /** Cropping top offset. Introduced in v1.2.14 */\n top?: number;\n /** Cropping width. Introduced in v1.2.14 */\n width?: number;\n /** Cropping height. Introduced in v1.2.14 */\n height?: number;\n /** Enable retina scaling for clone image. Introduce in 1.6.4 */\n enableRetinaScaling?: boolean;\n /** Remove current object transform ( no scale , no angle, no flip, no skew ). Introduced in 2.3.4 */\n withoutTransform?: boolean;\n /** Remove current object shadow. Introduced in 2.4.2 */\n withoutShadow?: boolean;\n /** Account for canvas viewport transform */\n viewportTransform?: boolean;\n /** Function to create the output canvas to export onto */\n canvasProvider?: (el?: HTMLCanvasElement) => T;\n};\n\ntype toDataURLOptions = ObjectToCanvasElementOptions & {\n quality?: number;\n};\n\nexport type DrawContext =\n | {\n parentClipPaths: FabricObject[];\n width: number;\n height: number;\n cacheTranslationX: number;\n cacheTranslationY: number;\n zoomX: number;\n zoomY: number;\n }\n | Record;\n\n/**\n * Root object class from which all 2d shape classes inherit from\n * @see {@link http://fabric5.fabricjs.com/fabric-intro-part-1#objects}\n *\n * @fires added\n * @fires removed\n *\n * @fires selected\n * @fires deselected\n *\n * @fires rotating\n * @fires scaling\n * @fires moving\n * @fires skewing\n * @fires modified\n *\n * @fires mousedown\n * @fires mouseup\n * @fires mouseover\n * @fires mouseout\n * @fires mousewheel\n * @fires mousedblclick\n *\n * @fires dragover\n * @fires dragenter\n * @fires dragleave\n * @fires drop\n */\nexport class FabricObject<\n Props extends TOptions = Partial,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n SProps extends SerializedObjectProps = SerializedObjectProps,\n EventSpec extends ObjectEvents = ObjectEvents,\n >\n extends ObjectGeometry\n implements ObjectProps\n{\n declare minScaleLimit: number;\n\n declare opacity: number;\n\n declare paintFirst: 'fill' | 'stroke';\n declare fill: string | TFiller | null;\n declare fillRule: CanvasFillRule;\n declare stroke: string | TFiller | null;\n declare strokeDashArray: number[] | null;\n declare strokeDashOffset: number;\n declare strokeLineCap: CanvasLineCap;\n declare strokeLineJoin: CanvasLineJoin;\n declare strokeMiterLimit: number;\n\n declare globalCompositeOperation: GlobalCompositeOperation;\n declare backgroundColor: string;\n\n declare shadow: Shadow | null;\n\n declare visible: boolean;\n\n declare includeDefaultValues: boolean;\n declare excludeFromExport: boolean;\n\n declare objectCaching: boolean;\n\n declare clipPath?: FabricObject;\n declare inverted: boolean;\n declare absolutePositioned: boolean;\n declare centeredRotation: boolean;\n declare centeredScaling: boolean;\n\n /**\n * This list of properties is used to check if the state of an object is changed.\n * This state change now is only used for children of groups to understand if a group\n * needs its cache regenerated during a .set call\n * @type Array\n */\n static stateProperties: string[] = stateProperties;\n\n /**\n * List of properties to consider when checking if cache needs refresh\n * Those properties are checked by\n * calls to Object.set(key, value). If the key is in this list, the object is marked as dirty\n * and refreshed at the next render\n * @type Array\n */\n static cacheProperties: string[] = cacheProperties;\n\n /**\n * When set to `true`, object's cache will be rerendered next render call.\n * since 1.7.0\n * @type Boolean\n * @default true\n */\n declare dirty: boolean;\n\n /**\n * Quick access for the _cacheCanvas rendering context\n * This is part of the objectCaching feature\n * since 1.7.0\n * @type boolean\n * @default undefined\n * @private\n */\n _cacheContext: CanvasRenderingContext2D | null = null;\n\n /**\n * A reference to the HTMLCanvasElement that is used to contain the cache of the object\n * this canvas element is resized and cleared as needed\n * Is marked private, you can read it, don't use it since it is handled by fabric\n * since 1.7.0\n * @type HTMLCanvasElement\n * @default undefined\n * @private\n */\n declare _cacheCanvas?: HTMLCanvasElement;\n\n /**\n * zoom level used on the cacheCanvas to draw the cache, X axe\n * since 1.7.0\n * @type number\n * @default undefined\n * @private\n */\n declare zoomX?: number;\n\n /**\n * zoom level used on the cacheCanvas to draw the cache, Y axe\n * since 1.7.0\n * @type number\n * @default undefined\n * @private\n */\n declare zoomY?: number;\n\n /**\n * zoom level used on the cacheCanvas to draw the cache, Y axe\n * since 1.7.0\n * @type number\n * @default undefined\n * @private\n */\n declare cacheTranslationX?: number;\n\n /**\n * translation of the cacheCanvas away from the center, for subpixel accuracy and crispness\n * since 1.7.0\n * @type number\n * @default undefined\n * @private\n */\n declare cacheTranslationY?: number;\n\n /**\n * A reference to the parent of the object, usually a Group\n * @type number\n * @default undefined\n * @private\n */\n declare group?: Group;\n\n /**\n * Indicate if the object is sitting on a cache dedicated to it\n * or is part of a larger cache for many object ( a group for example)\n * @type number\n * @default undefined\n * @private\n */\n declare ownCaching?: boolean;\n\n /**\n * Private. indicates if the object inside a group is on a transformed context or not\n * or is part of a larger cache for many object ( a group for example)\n * @type boolean\n * @default undefined\n * @private\n */\n declare _transformDone?: boolean;\n\n static ownDefaults = fabricObjectDefaultValues;\n\n static getDefaults(): Record {\n return FabricObject.ownDefaults;\n }\n\n /**\n * The class type.\n * This is used for serialization and deserialization purposes and internally it can be used\n * to identify classes.\n * When we transform a class in a plain JS object we need a way to recognize which class it was,\n * and the type is the way we do that. It has no other purposes and you should not give one.\n * Hard to reach on instances and please do not use to drive instance's logic (this.constructor.type).\n * To idenfity a class use instanceof class ( instanceof Rect ).\n * We do not do that in fabricJS code because we want to try to have code splitting possible.\n */\n static type = 'FabricObject';\n\n /**\n * Legacy identifier of the class. Prefer using utils like isType or instanceOf\n * Will be removed in fabric 7 or 8.\n * The setter exists to avoid type errors in old code and possibly current deserialization code.\n * DO NOT build new code around this type value\n * @TODO add sustainable warning message\n * @type string\n * @deprecated\n */\n get type() {\n const name = (this.constructor as typeof FabricObject).type;\n if (name === 'FabricObject') {\n return 'object';\n }\n return name.toLowerCase();\n }\n\n set type(value) {\n log('warn', 'Setting type has no effect', value);\n }\n\n /**\n * Constructor\n * @param {Object} [options] Options object\n */\n constructor(options?: Props) {\n super();\n Object.assign(this, FabricObject.ownDefaults);\n this.setOptions(options);\n }\n\n /**\n * Create a the canvas used to keep the cached copy of the object\n * @private\n */\n _createCacheCanvas() {\n this._cacheCanvas = createCanvasElement();\n this._cacheContext = this._cacheCanvas.getContext('2d');\n this._updateCacheCanvas();\n // if canvas gets created, is empty, so dirty.\n this.dirty = true;\n }\n\n /**\n * Limit the cache dimensions so that X * Y do not cross config.perfLimitSizeTotal\n * and each side do not cross fabric.cacheSideLimit\n * those numbers are configurable so that you can get as much detail as you want\n * making bargain with performances.\n * It mutates the input object dims.\n * @param {TCacheCanvasDimensions} dims\n * @return {TCacheCanvasDimensions} dims\n */\n _limitCacheSize(\n dims: TCacheCanvasDimensions & { capped?: boolean },\n ): TCacheCanvasDimensions & { capped?: boolean } {\n const width = dims.width,\n height = dims.height,\n max = config.maxCacheSideLimit,\n min = config.minCacheSideLimit;\n if (\n width <= max &&\n height <= max &&\n width * height <= config.perfLimitSizeTotal\n ) {\n if (width < min) {\n dims.width = min;\n }\n if (height < min) {\n dims.height = min;\n }\n return dims;\n }\n const ar = width / height,\n [limX, limY] = cache.limitDimsByArea(ar),\n x = capValue(min, limX, max),\n y = capValue(min, limY, max);\n if (width > x) {\n dims.zoomX /= width / x;\n dims.width = x;\n dims.capped = true;\n }\n if (height > y) {\n dims.zoomY /= height / y;\n dims.height = y;\n dims.capped = true;\n }\n return dims;\n }\n\n /**\n * Return the dimension and the zoom level needed to create a cache canvas\n * big enough to host the object to be cached.\n * @private\n * @return {TCacheCanvasDimensions} Informations about the object to be cached\n */\n _getCacheCanvasDimensions(): TCacheCanvasDimensions {\n const objectScale = this.getTotalObjectScaling(),\n // calculate dimensions without skewing\n dim = this._getTransformedDimensions({ skewX: 0, skewY: 0 }),\n neededX = (dim.x * objectScale.x) / this.scaleX,\n neededY = (dim.y * objectScale.y) / this.scaleY;\n return {\n // for sure this ALIASING_LIMIT is slightly creating problem\n // in situation in which the cache canvas gets an upper limit\n // also objectScale contains already scaleX and scaleY\n width: Math.ceil(neededX + ALIASING_LIMIT),\n height: Math.ceil(neededY + ALIASING_LIMIT),\n zoomX: objectScale.x,\n zoomY: objectScale.y,\n x: neededX,\n y: neededY,\n };\n }\n\n /**\n * Update width and height of the canvas for cache\n * returns true or false if canvas needed resize.\n * @private\n * @return {Boolean} true if the canvas has been resized\n */\n _updateCacheCanvas() {\n const canvas = this._cacheCanvas!,\n context = this._cacheContext,\n { width, height, zoomX, zoomY, x, y } = this._limitCacheSize(\n this._getCacheCanvasDimensions(),\n ),\n dimensionsChanged = width !== canvas.width || height !== canvas.height,\n zoomChanged = this.zoomX !== zoomX || this.zoomY !== zoomY;\n\n if (!canvas || !context) {\n return false;\n }\n\n const shouldRedraw = dimensionsChanged || zoomChanged;\n\n if (shouldRedraw) {\n if (width !== canvas.width || height !== canvas.height) {\n canvas.width = width;\n canvas.height = height;\n } else {\n context.setTransform(1, 0, 0, 1, 0, 0);\n context.clearRect(0, 0, canvas.width, canvas.height);\n }\n const drawingWidth = x / 2;\n const drawingHeight = y / 2;\n this.cacheTranslationX =\n Math.round(canvas.width / 2 - drawingWidth) + drawingWidth;\n this.cacheTranslationY =\n Math.round(canvas.height / 2 - drawingHeight) + drawingHeight;\n context.translate(this.cacheTranslationX, this.cacheTranslationY);\n context.scale(zoomX, zoomY);\n this.zoomX = zoomX;\n this.zoomY = zoomY;\n return true;\n }\n return false;\n }\n\n /**\n * Sets object's properties from options, for class constructor only.\n * Needs to be overridden for different defaults.\n * @protected\n * @param {Object} [options] Options object\n */\n protected setOptions(options: Record = {}) {\n this._setOptions(options);\n }\n\n /**\n * Transforms context when rendering an object\n * @param {CanvasRenderingContext2D} ctx Context\n */\n transform(ctx: CanvasRenderingContext2D) {\n const needFullTransform =\n (this.group && !this.group._transformDone) ||\n (this.group && this.canvas && ctx === (this.canvas as Canvas).contextTop);\n const m = this.calcTransformMatrix(!needFullTransform);\n ctx.transform(m[0], m[1], m[2], m[3], m[4], m[5]);\n }\n\n /**\n * Return the object scale factor counting also the group scaling\n * @return {Point}\n */\n getObjectScaling() {\n // if the object is a top level one, on the canvas, we go for simple aritmetic\n // otherwise the complex method with angles will return approximations and decimals\n // and will likely kill the cache when not needed\n // https://github.com/fabricjs/fabric.js/issues/7157\n if (!this.group) {\n return new Point(Math.abs(this.scaleX), Math.abs(this.scaleY));\n }\n // if we are inside a group total zoom calculation is complex, we defer to generic matrices\n const options = qrDecompose(this.calcTransformMatrix());\n return new Point(Math.abs(options.scaleX), Math.abs(options.scaleY));\n }\n\n /**\n * Return the object scale factor counting also the group scaling, zoom and retina\n * @return {Object} object with scaleX and scaleY properties\n */\n getTotalObjectScaling() {\n const scale = this.getObjectScaling();\n if (this.canvas) {\n const zoom = this.canvas.getZoom();\n const retina = this.getCanvasRetinaScaling();\n return scale.scalarMultiply(zoom * retina);\n }\n return scale;\n }\n\n /**\n * Return the object opacity counting also the group property\n * @return {Number}\n */\n getObjectOpacity() {\n let opacity = this.opacity;\n if (this.group) {\n opacity *= this.group.getObjectOpacity();\n }\n return opacity;\n }\n\n /**\n * Makes sure the scale is valid and modifies it if necessary\n * @todo: this is a control action issue, not a geometry one\n * @private\n * @param {Number} value, unconstrained\n * @return {Number} constrained value;\n */\n _constrainScale(value: number): number {\n if (Math.abs(value) < this.minScaleLimit) {\n if (value < 0) {\n return -this.minScaleLimit;\n } else {\n return this.minScaleLimit;\n }\n } else if (value === 0) {\n return 0.0001;\n }\n return value;\n }\n\n /**\n * Handles setting values on the instance and handling internal side effects\n * @protected\n * @param {String} key\n * @param {*} value\n */\n _set(key: string, value: any) {\n if (key === SCALE_X || key === SCALE_Y) {\n value = this._constrainScale(value);\n }\n if (key === SCALE_X && value < 0) {\n this.flipX = !this.flipX;\n value *= -1;\n } else if (key === 'scaleY' && value < 0) {\n this.flipY = !this.flipY;\n value *= -1;\n // i don't like this automatic initialization here\n } else if (key === 'shadow' && value && !(value instanceof Shadow)) {\n value = new Shadow(value);\n }\n\n const isChanged = this[key as keyof this] !== value;\n this[key as keyof this] = value;\n\n // invalidate caches\n if (\n isChanged &&\n (this.constructor as typeof FabricObject).cacheProperties.includes(key)\n ) {\n this.dirty = true;\n }\n // a dirty child makes the parent dirty.\n // but a non dirty child does not make the parent not dirty.\n // the parent could be dirty for some other reason.\n this.parent &&\n (this.dirty ||\n (isChanged &&\n (this.constructor as typeof FabricObject).stateProperties.includes(\n key,\n ))) &&\n this.parent._set('dirty', true);\n\n return this;\n }\n\n /**\n * return if the object would be visible in rendering\n * @return {Boolean}\n */\n isNotVisible() {\n return (\n this.opacity === 0 ||\n (!this.width && !this.height && this.strokeWidth === 0) ||\n !this.visible\n );\n }\n\n /**\n * Renders an object on a specified context\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n render(ctx: CanvasRenderingContext2D) {\n // do not render if width/height are zeros or object is not visible\n if (this.isNotVisible()) {\n return;\n }\n if (\n this.canvas &&\n this.canvas.skipOffscreen &&\n !this.group &&\n !this.isOnScreen()\n ) {\n return;\n }\n ctx.save();\n this._setupCompositeOperation(ctx);\n this.drawSelectionBackground(ctx);\n this.transform(ctx);\n this._setOpacity(ctx);\n this._setShadow(ctx);\n if (this.shouldCache()) {\n (this as TCachedFabricObject).renderCache();\n (this as TCachedFabricObject).drawCacheOnCanvas(ctx);\n } else {\n this._removeCacheCanvas();\n this.drawObject(ctx, false, {});\n this.dirty = false;\n }\n ctx.restore();\n }\n\n drawSelectionBackground(_ctx: CanvasRenderingContext2D) {\n /* no op */\n }\n\n renderCache(this: TCachedFabricObject, options?: any) {\n options = options || {};\n if (!this._cacheCanvas || !this._cacheContext) {\n this._createCacheCanvas();\n }\n if (this.isCacheDirty() && this._cacheContext) {\n const { zoomX, zoomY, cacheTranslationX, cacheTranslationY } = this;\n const { width, height } = this._cacheCanvas;\n this.drawObject(this._cacheContext, options.forClipping, {\n zoomX,\n zoomY,\n cacheTranslationX,\n cacheTranslationY,\n width,\n height,\n parentClipPaths: [],\n });\n this.dirty = false;\n }\n }\n\n /**\n * Remove cacheCanvas and its dimensions from the objects\n */\n _removeCacheCanvas() {\n this._cacheCanvas = undefined;\n this._cacheContext = null;\n }\n\n /**\n * return true if the object will draw a stroke\n * Does not consider text styles. This is just a shortcut used at rendering time\n * We want it to be an approximation and be fast.\n * wrote to avoid extra caching, it has to return true when stroke happens,\n * can guess when it will not happen at 100% chance, does not matter if it misses\n * some use case where the stroke is invisible.\n * @since 3.0.0\n * @returns Boolean\n */\n hasStroke(): boolean {\n return (\n !!this.stroke && this.stroke !== 'transparent' && this.strokeWidth !== 0\n );\n }\n\n /**\n * return true if the object will draw a fill\n * Does not consider text styles. This is just a shortcut used at rendering time\n * We want it to be an approximation and be fast.\n * wrote to avoid extra caching, it has to return true when fill happens,\n * can guess when it will not happen at 100% chance, does not matter if it misses\n * some use case where the fill is invisible.\n * @since 3.0.0\n * @returns Boolean\n */\n hasFill(): boolean {\n return !!this.fill && this.fill !== 'transparent';\n }\n\n /**\n * When returns `true`, force the object to have its own cache, even if it is inside a group\n * it may be needed when your object behave in a particular way on the cache and always needs\n * its own isolated canvas to render correctly.\n * Created to be overridden\n * since 1.7.12\n * @returns Boolean\n */\n needsItsOwnCache() {\n // TODO re-evaluate this shadow condition\n if (\n this.paintFirst === STROKE &&\n this.hasFill() &&\n this.hasStroke() &&\n !!this.shadow\n ) {\n return true;\n }\n if (this.clipPath) {\n return true;\n }\n return false;\n }\n\n /**\n * Decide if the object should cache or not. Create its own cache level\n * objectCaching is a global flag, wins over everything\n * needsItsOwnCache should be used when the object drawing method requires\n * a cache step.\n * Generally you do not cache objects in groups because the group outside is cached.\n * Read as: cache if is needed, or if the feature is enabled but we are not already caching.\n * @return {Boolean}\n */\n shouldCache() {\n this.ownCaching =\n (this.objectCaching && (!this.parent || !this.parent.isOnACache())) ||\n this.needsItsOwnCache();\n return this.ownCaching;\n }\n\n /**\n * Check if this object will cast a shadow with an offset.\n * used by Group.shouldCache to know if child has a shadow recursively\n * @return {Boolean}\n * @deprecated\n */\n willDrawShadow() {\n return (\n !!this.shadow && (this.shadow.offsetX !== 0 || this.shadow.offsetY !== 0)\n );\n }\n\n /**\n * Execute the drawing operation for an object clipPath\n * @param {CanvasRenderingContext2D} ctx Context to render on\n * @param {FabricObject} clipPath\n */\n drawClipPathOnCache(\n ctx: CanvasRenderingContext2D,\n clipPath: FabricObject,\n canvasWithClipPath: HTMLCanvasElement,\n ) {\n ctx.save();\n // DEBUG: uncomment this line, comment the following\n // ctx.globalAlpha = 0.4\n if (clipPath.inverted) {\n ctx.globalCompositeOperation = 'destination-out';\n } else {\n ctx.globalCompositeOperation = 'destination-in';\n }\n ctx.setTransform(1, 0, 0, 1, 0, 0);\n ctx.drawImage(canvasWithClipPath, 0, 0);\n ctx.restore();\n }\n\n /**\n * Execute the drawing operation for an object on a specified context\n * @param {CanvasRenderingContext2D} ctx Context to render on\n * @param {boolean} forClipping apply clipping styles\n * @param {DrawContext} context additional context for rendering\n */\n drawObject(\n ctx: CanvasRenderingContext2D,\n forClipping: boolean | undefined,\n context: DrawContext,\n ) {\n const originalFill = this.fill,\n originalStroke = this.stroke;\n if (forClipping) {\n this.fill = 'black';\n this.stroke = '';\n this._setClippingProperties(ctx);\n } else {\n this._renderBackground(ctx);\n }\n this._render(ctx);\n this._drawClipPath(ctx, this.clipPath, context);\n this.fill = originalFill;\n this.stroke = originalStroke;\n }\n\n private createClipPathLayer(\n this: TCachedFabricObject,\n clipPath: FabricObject,\n context: DrawContext,\n ) {\n const canvas = createCanvasElementFor(context as TSize);\n const ctx = canvas.getContext('2d')!;\n ctx.translate(context.cacheTranslationX, context.cacheTranslationY);\n ctx.scale(context.zoomX, context.zoomY);\n clipPath._cacheCanvas = canvas;\n context.parentClipPaths.forEach((prevClipPath) => {\n prevClipPath.transform(ctx);\n });\n context.parentClipPaths.push(clipPath);\n if (clipPath.absolutePositioned) {\n const m = invertTransform(this.calcTransformMatrix());\n ctx.transform(m[0], m[1], m[2], m[3], m[4], m[5]);\n }\n clipPath.transform(ctx);\n clipPath.drawObject(ctx, true, context);\n return canvas;\n }\n\n /**\n * Prepare clipPath state and cache and draw it on instance's cache\n * @param {CanvasRenderingContext2D} ctx\n * @param {FabricObject} clipPath\n */\n _drawClipPath(\n ctx: CanvasRenderingContext2D,\n clipPath: FabricObject | undefined,\n context: DrawContext,\n ) {\n if (!clipPath) {\n return;\n }\n // needed to setup _transformDone\n // TODO find a better solution?\n clipPath._transformDone = true;\n const canvas = (this as TCachedFabricObject).createClipPathLayer(\n clipPath,\n context,\n );\n this.drawClipPathOnCache(ctx, clipPath, canvas);\n }\n\n /**\n * Paint the cached copy of the object on the target context.\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n drawCacheOnCanvas(this: TCachedFabricObject, ctx: CanvasRenderingContext2D) {\n ctx.scale(1 / this.zoomX, 1 / this.zoomY);\n ctx.drawImage(\n this._cacheCanvas,\n -this.cacheTranslationX,\n -this.cacheTranslationY,\n );\n }\n\n /**\n * Check if cache is dirty and if is dirty clear the context.\n * This check has a big side effect, it changes the underlying cache canvas if necessary.\n * Do not call this method on your own to check if the cache is dirty, because if it is,\n * it is also going to wipe the cache. This is badly designed and needs to be fixed.\n * @param {Boolean} skipCanvas skip canvas checks because this object is painted\n * on parent canvas.\n */\n isCacheDirty(skipCanvas = false) {\n if (this.isNotVisible()) {\n return false;\n }\n const canvas = this._cacheCanvas;\n const ctx = this._cacheContext;\n if (canvas && ctx && !skipCanvas && this._updateCacheCanvas()) {\n // in this case the context is already cleared.\n return true;\n } else {\n if (this.dirty || (this.clipPath && this.clipPath.absolutePositioned)) {\n if (canvas && ctx && !skipCanvas) {\n ctx.save();\n ctx.setTransform(1, 0, 0, 1, 0, 0);\n ctx.clearRect(0, 0, canvas.width, canvas.height);\n ctx.restore();\n }\n return true;\n }\n }\n return false;\n }\n\n /**\n * Draws a background for the object big as its untransformed dimensions\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _renderBackground(ctx: CanvasRenderingContext2D) {\n if (!this.backgroundColor) {\n return;\n }\n const dim = this._getNonTransformedDimensions();\n ctx.fillStyle = this.backgroundColor;\n\n ctx.fillRect(-dim.x / 2, -dim.y / 2, dim.x, dim.y);\n // if there is background color no other shadows\n // should be casted\n this._removeShadow(ctx);\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _setOpacity(ctx: CanvasRenderingContext2D) {\n if (this.group && !this.group._transformDone) {\n ctx.globalAlpha = this.getObjectOpacity();\n } else {\n ctx.globalAlpha *= this.opacity;\n }\n }\n\n _setStrokeStyles(\n ctx: CanvasRenderingContext2D,\n decl: Pick<\n this,\n | 'stroke'\n | 'strokeWidth'\n | 'strokeLineCap'\n | 'strokeDashOffset'\n | 'strokeLineJoin'\n | 'strokeMiterLimit'\n >,\n ) {\n const stroke = decl.stroke;\n if (stroke) {\n ctx.lineWidth = decl.strokeWidth;\n ctx.lineCap = decl.strokeLineCap;\n ctx.lineDashOffset = decl.strokeDashOffset;\n ctx.lineJoin = decl.strokeLineJoin;\n ctx.miterLimit = decl.strokeMiterLimit;\n if (isFiller(stroke)) {\n if (\n (stroke as Gradient<'linear'>).gradientUnits === 'percentage' ||\n (stroke as Gradient<'linear'>).gradientTransform ||\n (stroke as Pattern).patternTransform\n ) {\n // need to transform gradient in a pattern.\n // this is a slow process. If you are hitting this codepath, and the object\n // is not using caching, you should consider switching it on.\n // we need a canvas as big as the current object caching canvas.\n this._applyPatternForTransformedGradient(ctx, stroke);\n } else {\n // is a simple gradient or pattern\n ctx.strokeStyle = stroke.toLive(ctx)!;\n this._applyPatternGradientTransform(ctx, stroke);\n }\n } else {\n // is a color\n ctx.strokeStyle = decl.stroke as string;\n }\n }\n }\n\n _setFillStyles(ctx: CanvasRenderingContext2D, { fill }: Pick) {\n if (fill) {\n if (isFiller(fill)) {\n ctx.fillStyle = fill.toLive(ctx)!;\n this._applyPatternGradientTransform(ctx, fill);\n } else {\n ctx.fillStyle = fill;\n }\n }\n }\n\n _setClippingProperties(ctx: CanvasRenderingContext2D) {\n ctx.globalAlpha = 1;\n ctx.strokeStyle = 'transparent';\n ctx.fillStyle = '#000000';\n }\n\n /**\n * @private\n * Sets line dash\n * @param {CanvasRenderingContext2D} ctx Context to set the dash line on\n * @param {Array} dashArray array representing dashes\n */\n _setLineDash(ctx: CanvasRenderingContext2D, dashArray?: number[] | null) {\n if (!dashArray || dashArray.length === 0) {\n return;\n }\n ctx.setLineDash(dashArray);\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _setShadow(ctx: CanvasRenderingContext2D) {\n if (!this.shadow) {\n return;\n }\n\n const shadow = this.shadow,\n canvas = this.canvas,\n retinaScaling = this.getCanvasRetinaScaling(),\n [sx, , , sy] = canvas?.viewportTransform || iMatrix,\n multX = sx * retinaScaling,\n multY = sy * retinaScaling,\n scaling = shadow.nonScaling ? new Point(1, 1) : this.getObjectScaling();\n ctx.shadowColor = shadow.color;\n ctx.shadowBlur =\n (shadow.blur *\n config.browserShadowBlurConstant *\n (multX + multY) *\n (scaling.x + scaling.y)) /\n 4;\n ctx.shadowOffsetX = shadow.offsetX * multX * scaling.x;\n ctx.shadowOffsetY = shadow.offsetY * multY * scaling.y;\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _removeShadow(ctx: CanvasRenderingContext2D) {\n if (!this.shadow) {\n return;\n }\n\n ctx.shadowColor = '';\n ctx.shadowBlur = ctx.shadowOffsetX = ctx.shadowOffsetY = 0;\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n * @param {TFiller} filler {@link Pattern} or {@link Gradient}\n */\n _applyPatternGradientTransform(\n ctx: CanvasRenderingContext2D,\n filler: TFiller,\n ) {\n if (!isFiller(filler)) {\n return { offsetX: 0, offsetY: 0 };\n }\n const t =\n (filler as Gradient<'linear'>).gradientTransform ||\n (filler as Pattern).patternTransform;\n const offsetX = -this.width / 2 + filler.offsetX || 0,\n offsetY = -this.height / 2 + filler.offsetY || 0;\n\n if ((filler as Gradient<'linear'>).gradientUnits === 'percentage') {\n ctx.transform(this.width, 0, 0, this.height, offsetX, offsetY);\n } else {\n ctx.transform(1, 0, 0, 1, offsetX, offsetY);\n }\n if (t) {\n ctx.transform(t[0], t[1], t[2], t[3], t[4], t[5]);\n }\n return { offsetX: offsetX, offsetY: offsetY };\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _renderPaintInOrder(ctx: CanvasRenderingContext2D) {\n if (this.paintFirst === STROKE) {\n this._renderStroke(ctx);\n this._renderFill(ctx);\n } else {\n this._renderFill(ctx);\n this._renderStroke(ctx);\n }\n }\n\n /**\n * @private\n * function that actually render something on the context.\n * empty here to allow Obects to work on tests to benchmark fabric functionalites\n * not related to rendering\n * @param {CanvasRenderingContext2D} _ctx Context to render on\n */\n _render(_ctx: CanvasRenderingContext2D) {\n // placeholder to be overridden\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _renderFill(ctx: CanvasRenderingContext2D) {\n if (!this.fill) {\n return;\n }\n\n ctx.save();\n this._setFillStyles(ctx, this);\n if (this.fillRule === 'evenodd') {\n ctx.fill('evenodd');\n } else {\n ctx.fill();\n }\n ctx.restore();\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _renderStroke(ctx: CanvasRenderingContext2D) {\n if (!this.stroke || this.strokeWidth === 0) {\n return;\n }\n\n if (this.shadow && !this.shadow.affectStroke) {\n this._removeShadow(ctx);\n }\n\n ctx.save();\n if (this.strokeUniform) {\n const scaling = this.getObjectScaling();\n ctx.scale(1 / scaling.x, 1 / scaling.y);\n }\n this._setLineDash(ctx, this.strokeDashArray);\n this._setStrokeStyles(ctx, this);\n ctx.stroke();\n ctx.restore();\n }\n\n /**\n * This function try to patch the missing gradientTransform on canvas gradients.\n * transforming a context to transform the gradient, is going to transform the stroke too.\n * we want to transform the gradient but not the stroke operation, so we create\n * a transformed gradient on a pattern and then we use the pattern instead of the gradient.\n * this method has drawbacks: is slow, is in low resolution, needs a patch for when the size\n * is limited.\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n * @param {Gradient} filler\n */\n _applyPatternForTransformedGradient(\n ctx: CanvasRenderingContext2D,\n filler: TFiller,\n ) {\n const dims = this._limitCacheSize(this._getCacheCanvasDimensions()),\n retinaScaling = this.getCanvasRetinaScaling(),\n width = dims.x / this.scaleX / retinaScaling,\n height = dims.y / this.scaleY / retinaScaling,\n pCanvas = createCanvasElementFor({\n // in case width and height are less than 1px, we have to round up.\n // since the pattern is no-repeat, this is fine\n width: Math.ceil(width),\n height: Math.ceil(height),\n });\n\n const pCtx = pCanvas.getContext('2d');\n if (!pCtx) {\n return;\n }\n pCtx.beginPath();\n pCtx.moveTo(0, 0);\n pCtx.lineTo(width, 0);\n pCtx.lineTo(width, height);\n pCtx.lineTo(0, height);\n pCtx.closePath();\n pCtx.translate(width / 2, height / 2);\n pCtx.scale(\n dims.zoomX / this.scaleX / retinaScaling,\n dims.zoomY / this.scaleY / retinaScaling,\n );\n this._applyPatternGradientTransform(pCtx, filler);\n pCtx.fillStyle = filler.toLive(ctx)!;\n pCtx.fill();\n ctx.translate(\n -this.width / 2 - this.strokeWidth / 2,\n -this.height / 2 - this.strokeWidth / 2,\n );\n ctx.scale(\n (retinaScaling * this.scaleX) / dims.zoomX,\n (retinaScaling * this.scaleY) / dims.zoomY,\n );\n ctx.strokeStyle = pCtx.createPattern(pCanvas, 'no-repeat') ?? '';\n }\n\n /**\n * This function is an helper for svg import. it returns the center of the object in the svg\n * untransformed coordinates\n * @private\n * @return {Point} center point from element coordinates\n */\n _findCenterFromElement() {\n return new Point(this.left + this.width / 2, this.top + this.height / 2);\n }\n\n /**\n * Clones an instance.\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @returns {Promise}\n */\n clone(propertiesToInclude?: string[]): Promise {\n const objectForm = this.toObject(propertiesToInclude);\n return (this.constructor as typeof FabricObject).fromObject(\n objectForm,\n ) as unknown as Promise;\n }\n\n /**\n * Creates an instance of Image out of an object\n * makes use of toCanvasElement.\n * Once this method was based on toDataUrl and loadImage, so it also had a quality\n * and format option. toCanvasElement is faster and produce no loss of quality.\n * If you need to get a real Jpeg or Png from an object, using toDataURL is the right way to do it.\n * toCanvasElement and then toBlob from the obtained canvas is also a good option.\n * @todo fix the export type, it could not be Image but the type that getClass return for 'image'.\n * @param {ObjectToCanvasElementOptions} [options] for clone as image, passed to toDataURL\n * @param {Number} [options.multiplier=1] Multiplier to scale by\n * @param {Number} [options.left] Cropping left offset. Introduced in v1.2.14\n * @param {Number} [options.top] Cropping top offset. Introduced in v1.2.14\n * @param {Number} [options.width] Cropping width. Introduced in v1.2.14\n * @param {Number} [options.height] Cropping height. Introduced in v1.2.14\n * @param {Boolean} [options.enableRetinaScaling] Enable retina scaling for clone image. Introduce in 1.6.4\n * @param {Boolean} [options.withoutTransform] Remove current object transform ( no scale , no angle, no flip, no skew ). Introduced in 2.3.4\n * @param {Boolean} [options.withoutShadow] Remove current object shadow. Introduced in 2.4.2\n * @return {FabricImage} Object cloned as image.\n */\n cloneAsImage(options: ObjectToCanvasElementOptions): FabricImage {\n const canvasEl = this.toCanvasElement(options);\n // TODO: how to import Image w/o an import cycle?\n const ImageClass = classRegistry.getClass('image');\n return new ImageClass(canvasEl);\n }\n\n /**\n * Converts an object into a HTMLCanvas element\n * @param {ObjectToCanvasElementOptions} options Options object\n * @param {Number} [options.multiplier=1] Multiplier to scale by\n * @param {Number} [options.left] Cropping left offset. Introduced in v1.2.14\n * @param {Number} [options.top] Cropping top offset. Introduced in v1.2.14\n * @param {Number} [options.width] Cropping width. Introduced in v1.2.14\n * @param {Number} [options.height] Cropping height. Introduced in v1.2.14\n * @param {Boolean} [options.enableRetinaScaling] Enable retina scaling for clone image. Introduce in 1.6.4\n * @param {Boolean} [options.withoutTransform] Remove current object transform ( no scale , no angle, no flip, no skew ). Introduced in 2.3.4\n * @param {Boolean} [options.withoutShadow] Remove current object shadow. Introduced in 2.4.2\n * @param {Boolean} [options.viewportTransform] Account for canvas viewport transform\n * @param {(el?: HTMLCanvasElement) => StaticCanvas} [options.canvasProvider] Create the output canvas\n * @return {HTMLCanvasElement} Returns DOM element with the FabricObject\n */\n toCanvasElement(options: ObjectToCanvasElementOptions = {}) {\n const origParams = saveObjectTransform(this),\n originalGroup = this.group,\n originalShadow = this.shadow,\n abs = Math.abs,\n retinaScaling = options.enableRetinaScaling ? getDevicePixelRatio() : 1,\n multiplier = (options.multiplier || 1) * retinaScaling,\n canvasProvider: (el: HTMLCanvasElement) => StaticCanvas =\n options.canvasProvider ||\n ((el: HTMLCanvasElement) =>\n new StaticCanvas(el, {\n enableRetinaScaling: false,\n renderOnAddRemove: false,\n skipOffscreen: false,\n }));\n delete this.group;\n if (options.withoutTransform) {\n resetObjectTransform(this);\n }\n if (options.withoutShadow) {\n this.shadow = null;\n }\n if (options.viewportTransform) {\n sendObjectToPlane(this, this.getViewportTransform());\n }\n\n this.setCoords();\n const el = createCanvasElement(),\n boundingRect = this.getBoundingRect(),\n shadow = this.shadow,\n shadowOffset = new Point();\n\n if (shadow) {\n const shadowBlur = shadow.blur;\n const scaling = shadow.nonScaling\n ? new Point(1, 1)\n : this.getObjectScaling();\n // consider non scaling shadow.\n shadowOffset.x =\n 2 * Math.round(abs(shadow.offsetX) + shadowBlur) * abs(scaling.x);\n shadowOffset.y =\n 2 * Math.round(abs(shadow.offsetY) + shadowBlur) * abs(scaling.y);\n }\n const width = boundingRect.width + shadowOffset.x,\n height = boundingRect.height + shadowOffset.y;\n // if the current width/height is not an integer\n // we need to make it so.\n el.width = Math.ceil(width);\n el.height = Math.ceil(height);\n const canvas = canvasProvider(el);\n if (options.format === 'jpeg') {\n canvas.backgroundColor = '#fff';\n }\n this.setPositionByOrigin(\n new Point(canvas.width / 2, canvas.height / 2),\n CENTER,\n CENTER,\n );\n const originalCanvas = this.canvas;\n // static canvas and canvas have both an array of InteractiveObjects\n // @ts-expect-error this needs to be fixed somehow, or ignored globally\n canvas._objects = [this];\n this.set('canvas', canvas);\n this.setCoords();\n const canvasEl = canvas.toCanvasElement(multiplier || 1, options);\n this.set('canvas', originalCanvas);\n this.shadow = originalShadow;\n if (originalGroup) {\n this.group = originalGroup;\n }\n this.set(origParams);\n this.setCoords();\n // canvas.dispose will call image.dispose that will nullify the elements\n // since this canvas is a simple element for the process, we remove references\n // to objects in this way in order to avoid object trashing.\n canvas._objects = [];\n // since render has settled it is safe to destroy canvas\n canvas.destroy();\n return canvasEl;\n }\n\n /**\n * Converts an object into a data-url-like string\n * @param {Object} options Options object\n * @param {String} [options.format=png] The format of the output image. Either \"jpeg\" or \"png\"\n * @param {Number} [options.quality=1] Quality level (0..1). Only used for jpeg.\n * @param {Number} [options.multiplier=1] Multiplier to scale by\n * @param {Number} [options.left] Cropping left offset. Introduced in v1.2.14\n * @param {Number} [options.top] Cropping top offset. Introduced in v1.2.14\n * @param {Number} [options.width] Cropping width. Introduced in v1.2.14\n * @param {Number} [options.height] Cropping height. Introduced in v1.2.14\n * @param {Boolean} [options.enableRetinaScaling] Enable retina scaling for clone image. Introduce in 1.6.4\n * @param {Boolean} [options.withoutTransform] Remove current object transform ( no scale , no angle, no flip, no skew ). Introduced in 2.3.4\n * @param {Boolean} [options.withoutShadow] Remove current object shadow. Introduced in 2.4.2\n * @return {String} Returns a data: URL containing a representation of the object in the format specified by options.format\n */\n toDataURL(options: toDataURLOptions = {}) {\n return toDataURL(\n this.toCanvasElement(options),\n options.format || 'png',\n options.quality || 1,\n );\n }\n toBlob(options: toDataURLOptions = {}) {\n return toBlob(\n this.toCanvasElement(options),\n options.format || 'png',\n options.quality || 1,\n );\n }\n\n /**\n * Checks if the instance is of any of the specified types.\n * We use this to filter a list of objects for the `getObjects` function.\n *\n * For detecting an instance type `instanceOf` is a better check,\n * but to avoid to make specific classes a dependency of generic code\n * internally we use this.\n *\n * This compares both the static class `type` and the instance's own `type` property\n * against the provided list of types.\n *\n * @param types - A list of type strings to check against.\n * @returns `true` if the object's type or class type matches any in the list, otherwise `false`.\n */\n isType(...types: string[]) {\n return (\n types.includes((this.constructor as typeof FabricObject).type) ||\n types.includes(this.type)\n );\n }\n\n /**\n * Returns complexity of an instance\n * @return {Number} complexity of this instance (is 1 unless subclassed)\n */\n complexity() {\n return 1;\n }\n\n /**\n * Returns a JSON representation of an instance\n * @return {Object} JSON\n */\n toJSON() {\n // delegate, not alias\n return this.toObject();\n }\n\n /**\n * Sets \"angle\" of an instance with centered rotation\n * @param {TDegree} angle Angle value (in degrees)\n */\n rotate(angle: TDegree) {\n const { centeredRotation, originX, originY } = this;\n\n if (centeredRotation) {\n const { x, y } = this.getRelativeCenterPoint();\n this.originX = CENTER;\n this.originY = CENTER;\n this.left = x;\n this.top = y;\n }\n\n this.set('angle', angle);\n\n if (centeredRotation) {\n const { x, y } = this.translateToOriginPoint(\n this.getRelativeCenterPoint(),\n originX,\n originY,\n );\n this.left = x;\n this.top = y;\n this.originX = originX;\n this.originY = originY;\n }\n }\n\n /**\n * This callback function is called by the parent group of an object every\n * time a non-delegated property changes on the group. It is passed the key\n * and value as parameters. Not adding in this function's signature to avoid\n * Travis build error about unused variables.\n */\n setOnGroup() {\n // implemented by sub-classes, as needed.\n }\n\n /**\n * Sets canvas globalCompositeOperation for specific object\n * custom composition operation for the particular object can be specified using globalCompositeOperation property\n * @param {CanvasRenderingContext2D} ctx Rendering canvas context\n */\n _setupCompositeOperation(ctx: CanvasRenderingContext2D) {\n if (this.globalCompositeOperation) {\n ctx.globalCompositeOperation = this.globalCompositeOperation;\n }\n }\n\n /**\n * cancel instance's running animations\n * override if necessary to dispose artifacts such as `clipPath`\n */\n dispose() {\n runningAnimations.cancelByTarget(this);\n this.off();\n this._set('canvas', undefined);\n // clear caches\n this._cacheCanvas && getEnv().dispose(this._cacheCanvas);\n this._cacheCanvas = undefined;\n this._cacheContext = null;\n }\n\n // #region Animation methods\n /**\n * List of properties to consider for animating colors.\n * @type String[]\n */\n static colorProperties: string[] = [FILL, STROKE, 'backgroundColor'];\n\n /**\n * Animates object's properties\n * @param {Record} animatable map of keys and end values\n * @param {Partial>} options\n * @see {@link http://fabric5.fabricjs.com/fabric-intro-part-2#animation}\n * @return {Record>} map of animation contexts\n *\n * As object — multiple properties\n *\n * object.animate({ left: ..., top: ... });\n * object.animate({ left: ..., top: ... }, { duration: ... });\n */\n animate(\n animatable: Record,\n options?: Partial>,\n ): Record> {\n return Object.entries(animatable).reduce(\n (acc, [key, endValue]) => {\n acc[key] = this._animate(key, endValue, options);\n return acc;\n },\n {} as Record>,\n );\n }\n\n /**\n * @private\n * @param {String} key Property to animate\n * @param {String} to Value to animate to\n * @param {Object} [options] Options object\n */\n _animate(\n key: string,\n endValue: T,\n options: Partial> = {},\n ): TAnimation {\n const path = key.split('.');\n const propIsColor = (\n this.constructor as typeof FabricObject\n ).colorProperties.includes(path[path.length - 1]);\n const { abort, startValue, onChange, onComplete } = options;\n const animationOptions = {\n ...options,\n target: this,\n // path.reduce... is the current value in case start value isn't provided\n startValue:\n startValue ?? path.reduce((deep: any, key) => deep[key], this),\n endValue,\n abort: abort?.bind(this),\n onChange: (\n value: number | number[] | string,\n valueProgress: number,\n durationProgress: number,\n ) => {\n path.reduce((deep: Record, key, index) => {\n if (index === path.length - 1) {\n deep[key] = value;\n }\n return deep[key];\n }, this);\n onChange &&\n // @ts-expect-error generic callback arg0 is wrong\n onChange(value, valueProgress, durationProgress);\n },\n onComplete: (\n value: number | number[] | string,\n valueProgress: number,\n durationProgress: number,\n ) => {\n this.setCoords();\n onComplete &&\n // @ts-expect-error generic callback arg0 is wrong\n onComplete(value, valueProgress, durationProgress);\n },\n } as AnimationOptions;\n\n return (\n propIsColor\n ? animateColor(animationOptions as ColorAnimationOptions)\n : animate(\n animationOptions as ValueAnimationOptions | ArrayAnimationOptions,\n )\n ) as TAnimation;\n }\n\n // #region Object stacking methods\n\n /**\n * A reference to the parent of the object\n * Used to keep the original parent ref when the object has been added to an ActiveSelection, hence loosing the `group` ref\n */\n declare parent?: Group;\n\n /**\n * Checks if object is descendant of target\n * Should be used instead of {@link Group.contains} or {@link StaticCanvas.contains} for performance reasons\n * @param {TAncestor} target\n * @returns {boolean}\n */\n isDescendantOf(target: TAncestor): boolean {\n const { parent, group } = this;\n return (\n parent === target ||\n group === target ||\n // walk up\n (!!parent && parent.isDescendantOf(target)) ||\n (!!group && group !== parent && group.isDescendantOf(target))\n );\n }\n\n /**\n * @returns {Ancestors} ancestors (excluding `ActiveSelection`) from bottom to top\n */\n getAncestors(): Ancestors {\n const ancestors: TAncestor[] = [];\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n let parent: TAncestor | undefined = this;\n do {\n parent = parent.parent;\n parent && ancestors.push(parent);\n } while (parent);\n return ancestors as Ancestors;\n }\n\n /**\n * Compare ancestors\n *\n * @param {StackedObject} other\n * @returns {AncestryComparison} an object that represent the ancestry situation.\n */\n findCommonAncestors(other: T): AncestryComparison {\n if (this === other) {\n return {\n fork: [],\n otherFork: [],\n common: [this, ...this.getAncestors()],\n } as AncestryComparison;\n }\n const ancestors = this.getAncestors();\n const otherAncestors = other.getAncestors();\n // if `this` has no ancestors and `this` is top ancestor of `other` we must handle the following case\n if (\n ancestors.length === 0 &&\n otherAncestors.length > 0 &&\n this === otherAncestors[otherAncestors.length - 1]\n ) {\n return {\n fork: [],\n otherFork: [\n other,\n ...otherAncestors.slice(0, otherAncestors.length - 1),\n ],\n common: [this],\n } as AncestryComparison;\n }\n // compare ancestors\n for (let i = 0, ancestor; i < ancestors.length; i++) {\n ancestor = ancestors[i];\n if (ancestor === other) {\n return {\n fork: [this, ...ancestors.slice(0, i)],\n otherFork: [],\n common: ancestors.slice(i),\n } as AncestryComparison;\n }\n for (let j = 0; j < otherAncestors.length; j++) {\n if (this === otherAncestors[j]) {\n return {\n fork: [],\n otherFork: [other, ...otherAncestors.slice(0, j)],\n common: [this, ...ancestors],\n } as AncestryComparison;\n }\n if (ancestor === otherAncestors[j]) {\n return {\n fork: [this, ...ancestors.slice(0, i)],\n otherFork: [other, ...otherAncestors.slice(0, j)],\n common: ancestors.slice(i),\n } as AncestryComparison;\n }\n }\n }\n // nothing shared\n return {\n fork: [this, ...ancestors],\n otherFork: [other, ...otherAncestors],\n common: [],\n } as AncestryComparison;\n }\n\n /**\n *\n * @param {StackedObject} other\n * @returns {boolean}\n */\n hasCommonAncestors(other: T): boolean {\n const commonAncestors = this.findCommonAncestors(other);\n return commonAncestors && !!commonAncestors.common.length;\n }\n\n /**\n *\n * @param {FabricObject} other object to compare against\n * @returns {boolean | undefined} if objects do not share a common ancestor or they are strictly equal it is impossible to determine which is in front of the other; in such cases the function returns `undefined`\n */\n isInFrontOf(other: T): boolean | undefined {\n if (this === other) {\n return undefined;\n }\n const ancestorData = this.findCommonAncestors(other);\n\n if (ancestorData.fork.includes(other as any)) {\n return true;\n }\n if (ancestorData.otherFork.includes(this as any)) {\n return false;\n }\n // if there isn't a common ancestor, we take the canvas.\n // if there is no canvas, there is nothing to compare\n const firstCommonAncestor = ancestorData.common[0] || this.canvas;\n if (!firstCommonAncestor) {\n return undefined;\n }\n const headOfFork = ancestorData.fork.pop(),\n headOfOtherFork = ancestorData.otherFork.pop(),\n thisIndex = (firstCommonAncestor as TCollection)._objects.indexOf(\n headOfFork as any,\n ),\n otherIndex = (firstCommonAncestor as TCollection)._objects.indexOf(\n headOfOtherFork as any,\n );\n return thisIndex > -1 && thisIndex > otherIndex;\n }\n\n // #region Serialization\n /**\n * Define a list of custom properties that will be serialized when\n * instance.toObject() gets called\n */\n static customProperties: string[] = [];\n\n /**\n * Returns an object representation of an instance\n * @param {string[]} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} Object representation of an instance\n */\n toObject(propertiesToInclude: any[] = []): any {\n const propertiesToSerialize = propertiesToInclude.concat(\n FabricObject.customProperties,\n (this.constructor as typeof FabricObject).customProperties || [],\n );\n let clipPathData: Partial | undefined;\n const NUM_FRACTION_DIGITS = config.NUM_FRACTION_DIGITS;\n const {\n clipPath,\n fill,\n stroke,\n shadow,\n strokeDashArray,\n left,\n top,\n originX,\n originY,\n width,\n height,\n strokeWidth,\n strokeLineCap,\n strokeDashOffset,\n strokeLineJoin,\n strokeUniform,\n strokeMiterLimit,\n scaleX,\n scaleY,\n angle,\n flipX,\n flipY,\n opacity,\n visible,\n backgroundColor,\n fillRule,\n paintFirst,\n globalCompositeOperation,\n skewX,\n skewY,\n } = this;\n if (clipPath && !clipPath.excludeFromExport) {\n clipPathData = clipPath.toObject(\n propertiesToSerialize.concat('inverted', 'absolutePositioned'),\n );\n }\n const toFixedBound = (val: number) => toFixed(val, NUM_FRACTION_DIGITS);\n const object = {\n ...pick(this, propertiesToSerialize as (keyof this)[]),\n type: (this.constructor as typeof FabricObject).type,\n version: VERSION,\n originX,\n originY,\n left: toFixedBound(left),\n top: toFixedBound(top),\n width: toFixedBound(width),\n height: toFixedBound(height),\n fill: isSerializableFiller(fill) ? fill.toObject() : fill,\n stroke: isSerializableFiller(stroke) ? stroke.toObject() : stroke,\n strokeWidth: toFixedBound(strokeWidth),\n strokeDashArray: strokeDashArray\n ? strokeDashArray.concat()\n : strokeDashArray,\n strokeLineCap,\n strokeDashOffset,\n strokeLineJoin,\n strokeUniform,\n strokeMiterLimit: toFixedBound(strokeMiterLimit),\n scaleX: toFixedBound(scaleX),\n scaleY: toFixedBound(scaleY),\n angle: toFixedBound(angle),\n flipX,\n flipY,\n opacity: toFixedBound(opacity),\n shadow: shadow ? shadow.toObject() : shadow,\n visible,\n backgroundColor,\n fillRule,\n paintFirst,\n globalCompositeOperation,\n skewX: toFixedBound(skewX),\n skewY: toFixedBound(skewY),\n ...(clipPathData ? { clipPath: clipPathData } : null),\n };\n\n return !this.includeDefaultValues\n ? this._removeDefaultValues(object)\n : object;\n }\n\n /**\n * Returns (dataless) object representation of an instance\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} Object representation of an instance\n */\n toDatalessObject(propertiesToInclude?: any[]): any {\n // will be overwritten by subclasses\n return this.toObject(propertiesToInclude);\n }\n\n /**\n * @private\n * @param {Object} object\n */\n _removeDefaultValues(object: T): Partial {\n // getDefaults() ( get from static ownDefaults ) should win over prototype since anyway they get assigned to instance\n // ownDefault vs prototype is swappable only if you change all the fabric objects consistently.\n const defaults = (this.constructor as typeof FabricObject).getDefaults();\n const hasStaticDefaultValues = Object.keys(defaults).length > 0;\n const baseValues = hasStaticDefaultValues\n ? defaults\n : Object.getPrototypeOf(this);\n\n return pickBy(object, (value, key) => {\n if (key === LEFT || key === TOP || key === 'type') {\n return true;\n }\n const baseValue = baseValues[key];\n return (\n value !== baseValue &&\n // basically a check for [] === []\n !(\n Array.isArray(value) &&\n Array.isArray(baseValue) &&\n value.length === 0 &&\n baseValue.length === 0\n )\n );\n });\n }\n\n /**\n * Returns a string representation of an instance\n * @return {String}\n */\n toString() {\n return `#<${(this.constructor as typeof FabricObject).type}>`;\n }\n\n /**\n *\n * @param {Function} klass\n * @param {object} object\n * @param {object} [options]\n * @param {string} [options.extraParam] property to pass as first argument to the constructor\n * @param {AbortSignal} [options.signal] handle aborting, see https://developer.mozilla.org/en-US/docs/Web/API/AbortController/signal\n * @returns {Promise}\n */\n static _fromObject(\n { type, ...serializedObjectOptions }: Record,\n { extraParam, ...options }: Abortable & { extraParam?: string } = {},\n ): Promise {\n return enlivenObjectEnlivables(serializedObjectOptions, options).then(\n (enlivedObjectOptions) => {\n // from the resulting enlived options, extract options.extraParam to arg0\n // to avoid accidental overrides later\n if (extraParam) {\n delete enlivedObjectOptions[extraParam];\n return new this(\n serializedObjectOptions[extraParam],\n // @ts-expect-error different signature\n enlivedObjectOptions,\n );\n } else {\n return new this(enlivedObjectOptions);\n }\n },\n ) as Promise;\n }\n\n /**\n *\n * @param {object} object\n * @param {object} [options]\n * @param {AbortSignal} [options.signal] handle aborting, see https://developer.mozilla.org/en-US/docs/Web/API/AbortController/signal\n * @returns {Promise}\n */\n static fromObject>(\n object: T,\n options?: Abortable,\n ) {\n return this._fromObject(object, options);\n }\n}\n\nclassRegistry.setClass(FabricObject);\nclassRegistry.setClass(FabricObject, 'object');\n","import type {\n TModificationEvents,\n Transform,\n TransformActionHandler,\n} from '../EventTypeDefs';\nimport { fireEvent } from './fireEvent';\nimport { commonEventInfo } from './util';\n\n/**\n * Wrap an action handler with firing an event if the action is performed\n * @param {TModificationEvents} eventName the event we want to fire\n * @param {TransformActionHandler} actionHandler the function to wrap\n * @param {object} extraEventInfo extra information to pas to the event handler\n * @return {TransformActionHandler} a function with an action handler signature\n */\nexport const wrapWithFireEvent = <\n T extends Transform,\n P extends object = Record,\n>(\n eventName: TModificationEvents,\n actionHandler: TransformActionHandler,\n extraEventInfo?: P,\n) => {\n return ((eventData, transform, x, y) => {\n const actionPerformed = actionHandler(eventData, transform, x, y);\n if (actionPerformed) {\n fireEvent(eventName, {\n ...commonEventInfo(eventData, transform, x, y),\n ...extraEventInfo,\n });\n }\n return actionPerformed;\n }) as TransformActionHandler;\n};\n","import type { Transform, TransformActionHandler } from '../EventTypeDefs';\n\n/**\n * Wrap an action handler with saving/restoring object position on the transform.\n * this is the code that permits to objects to keep their position while transforming.\n * @param {Function} actionHandler the function to wrap\n * @return {Function} a function with an action handler signature\n */\nexport function wrapWithFixedAnchor(\n actionHandler: TransformActionHandler,\n) {\n return ((eventData, transform, x, y) => {\n const { target, originX, originY } = transform,\n centerPoint = target.getRelativeCenterPoint(),\n constraint = target.translateToOriginPoint(centerPoint, originX, originY),\n actionPerformed = actionHandler(eventData, transform, x, y);\n // flipping requires to change the transform origin, so we read from the mutated transform\n // instead of leveraging the one destructured before\n target.setPositionByOrigin(\n constraint,\n transform.originX,\n transform.originY,\n );\n return actionPerformed;\n }) as TransformActionHandler;\n}\n","import type { TransformActionHandler } from '../EventTypeDefs';\nimport { CENTER, LEFT, RESIZING, RIGHT } from '../constants';\nimport { resolveOrigin } from '../util/misc/resolveOrigin';\nimport { getLocalPoint, isTransformCentered } from './util';\nimport { wrapWithFireEvent } from './wrapWithFireEvent';\nimport { wrapWithFixedAnchor } from './wrapWithFixedAnchor';\n\n/**\n * Action handler to change object's width\n * Needs to be wrapped with `wrapWithFixedAnchor` to be effective\n * @param {Event} eventData javascript event that is doing the transform\n * @param {Object} transform javascript object containing a series of information around the current transform\n * @param {number} x current mouse x position, canvas normalized\n * @param {number} y current mouse y position, canvas normalized\n * @return {Boolean} true if some change happened\n */\nexport const changeObjectWidth: TransformActionHandler = (\n eventData,\n transform,\n x,\n y,\n) => {\n const localPoint = getLocalPoint(\n transform,\n transform.originX,\n transform.originY,\n x,\n y,\n );\n // make sure the control changes width ONLY from it's side of target\n if (\n resolveOrigin(transform.originX) === resolveOrigin(CENTER) ||\n (resolveOrigin(transform.originX) === resolveOrigin(RIGHT) &&\n localPoint.x < 0) ||\n (resolveOrigin(transform.originX) === resolveOrigin(LEFT) &&\n localPoint.x > 0)\n ) {\n const { target } = transform,\n strokePadding =\n target.strokeWidth / (target.strokeUniform ? target.scaleX : 1),\n multiplier = isTransformCentered(transform) ? 2 : 1,\n oldWidth = target.width,\n newWidth =\n Math.abs((localPoint.x * multiplier) / target.scaleX) - strokePadding;\n target.set('width', Math.max(newWidth, 1));\n // check against actual target width in case `newWidth` was rejected\n return oldWidth !== target.width;\n }\n return false;\n};\n\nexport const changeWidth = wrapWithFireEvent(\n RESIZING,\n wrapWithFixedAnchor(changeObjectWidth),\n);\n","import { FILL, STROKE, twoMathPi } from '../constants';\nimport type { InteractiveFabricObject } from '../shapes/Object/InteractiveObject';\nimport { degreesToRadians } from '../util/misc/radiansDegreesConversion';\nimport type { Control } from './Control';\n\nexport type ControlRenderingStyleOverride = Partial<\n Pick<\n InteractiveFabricObject,\n | 'cornerStyle'\n | 'cornerSize'\n | 'cornerColor'\n | 'cornerStrokeColor'\n | 'cornerDashArray'\n | 'transparentCorners'\n >\n>;\n\nexport type ControlRenderer<\n O extends InteractiveFabricObject = InteractiveFabricObject,\n> = (\n ctx: CanvasRenderingContext2D,\n left: number,\n top: number,\n styleOverride: ControlRenderingStyleOverride,\n fabricObject: O,\n) => void;\n\n/**\n * Render a round control, as per fabric features.\n * This function is written to respect object properties like transparentCorners, cornerSize\n * cornerColor, cornerStrokeColor\n * plus the addition of offsetY and offsetX.\n * @param {CanvasRenderingContext2D} ctx context to render on\n * @param {Number} left x coordinate where the control center should be\n * @param {Number} top y coordinate where the control center should be\n * @param {Object} styleOverride override for FabricObject controls style\n * @param {FabricObject} fabricObject the fabric object for which we are rendering controls\n */\nexport function renderCircleControl(\n this: Control,\n ctx: CanvasRenderingContext2D,\n left: number,\n top: number,\n styleOverride: ControlRenderingStyleOverride,\n fabricObject: InteractiveFabricObject,\n) {\n styleOverride = styleOverride || {};\n const xSize =\n this.sizeX || styleOverride.cornerSize || fabricObject.cornerSize,\n ySize = this.sizeY || styleOverride.cornerSize || fabricObject.cornerSize,\n transparentCorners =\n typeof styleOverride.transparentCorners !== 'undefined'\n ? styleOverride.transparentCorners\n : fabricObject.transparentCorners,\n methodName = transparentCorners ? STROKE : FILL,\n stroke =\n !transparentCorners &&\n (styleOverride.cornerStrokeColor || fabricObject.cornerStrokeColor);\n let myLeft = left,\n myTop = top,\n size;\n ctx.save();\n ctx.fillStyle = styleOverride.cornerColor || fabricObject.cornerColor || '';\n ctx.strokeStyle =\n styleOverride.cornerStrokeColor || fabricObject.cornerStrokeColor || '';\n // TODO: use proper ellipse code.\n if (xSize > ySize) {\n size = xSize;\n ctx.scale(1.0, ySize / xSize);\n myTop = (top * xSize) / ySize;\n } else if (ySize > xSize) {\n size = ySize;\n ctx.scale(xSize / ySize, 1.0);\n myLeft = (left * ySize) / xSize;\n } else {\n size = xSize;\n }\n ctx.beginPath();\n ctx.arc(myLeft, myTop, size / 2, 0, twoMathPi, false);\n ctx[methodName]();\n if (stroke) {\n ctx.stroke();\n }\n ctx.restore();\n}\n\n/**\n * Render a square control, as per fabric features.\n * This function is written to respect object properties like transparentCorners, cornerSize\n * cornerColor, cornerStrokeColor\n * plus the addition of offsetY and offsetX.\n * @param {CanvasRenderingContext2D} ctx context to render on\n * @param {Number} left x coordinate where the control center should be\n * @param {Number} top y coordinate where the control center should be\n * @param {Object} styleOverride override for FabricObject controls style\n * @param {FabricObject} fabricObject the fabric object for which we are rendering controls\n */\nexport function renderSquareControl(\n this: Control,\n ctx: CanvasRenderingContext2D,\n left: number,\n top: number,\n styleOverride: ControlRenderingStyleOverride,\n fabricObject: InteractiveFabricObject,\n) {\n styleOverride = styleOverride || {};\n const xSize =\n this.sizeX || styleOverride.cornerSize || fabricObject.cornerSize,\n ySize = this.sizeY || styleOverride.cornerSize || fabricObject.cornerSize,\n transparentCorners =\n typeof styleOverride.transparentCorners !== 'undefined'\n ? styleOverride.transparentCorners\n : fabricObject.transparentCorners,\n methodName = transparentCorners ? STROKE : FILL,\n stroke =\n !transparentCorners &&\n (styleOverride.cornerStrokeColor || fabricObject.cornerStrokeColor),\n xSizeBy2 = xSize / 2,\n ySizeBy2 = ySize / 2;\n ctx.save();\n ctx.fillStyle = styleOverride.cornerColor || fabricObject.cornerColor || '';\n ctx.strokeStyle =\n styleOverride.cornerStrokeColor || fabricObject.cornerStrokeColor || '';\n ctx.translate(left, top);\n // angle is relative to canvas plane\n const angle = fabricObject.getTotalAngle();\n ctx.rotate(degreesToRadians(angle));\n // this does not work, and fixed with ( && ) does not make sense.\n // to have real transparent corners we need the controls on upperCanvas\n // transparentCorners || ctx.clearRect(-xSizeBy2, -ySizeBy2, xSize, ySize);\n ctx[`${methodName}Rect`](-xSizeBy2, -ySizeBy2, xSize, ySize);\n if (stroke) {\n ctx.strokeRect(-xSizeBy2, -ySizeBy2, xSize, ySize);\n }\n ctx.restore();\n}\n","/* eslint-disable @typescript-eslint/no-unused-vars */\nimport type {\n ControlActionHandler,\n TPointerEvent,\n TransformActionHandler,\n} from '../EventTypeDefs';\nimport { Intersection } from '../Intersection';\nimport { Point } from '../Point';\nimport { SCALE } from '../constants';\nimport type {\n InteractiveFabricObject,\n TOCoord,\n} from '../shapes/Object/InteractiveObject';\nimport type { TCornerPoint, TDegree, TMat2D } from '../typedefs';\nimport {\n createRotateMatrix,\n createScaleMatrix,\n createTranslateMatrix,\n multiplyTransformMatrixArray,\n} from '../util/misc/matrix';\nimport type { ControlRenderingStyleOverride } from './controlRendering';\nimport { renderCircleControl, renderSquareControl } from './controlRendering';\n\nexport class Control {\n /**\n * keep track of control visibility.\n * mainly for backward compatibility.\n * if you do not want to see a control, you can remove it\n * from the control set.\n * @type {Boolean}\n * @default true\n */\n visible = true;\n\n /**\n * Name of the action that the control will likely execute.\n * This is optional. FabricJS uses to identify what the user is doing for some\n * extra optimizations. If you are writing a custom control and you want to know\n * somewhere else in the code what is going on, you can use this string here.\n * you can also provide a custom getActionName if your control run multiple actions\n * depending on some external state.\n * default to scale since is the most common, used on 4 corners by default\n * @type {String}\n * @default 'scale'\n */\n actionName = SCALE;\n\n /**\n * Drawing angle of the control.\n * NOT used for now, but name marked as needed for internal logic\n * example: to reuse the same drawing function for different rotated controls\n * @type {Number}\n * @default 0\n */\n angle = 0;\n\n /**\n * Relative position of the control. X\n * 0,0 is the center of the Object, while -0.5 (left) or 0.5 (right) are the extremities\n * of the bounding box.\n * @type {Number}\n * @default 0\n */\n x = 0;\n\n /**\n * Relative position of the control. Y\n * 0,0 is the center of the Object, while -0.5 (top) or 0.5 (bottom) are the extremities\n * of the bounding box.\n * @type {Number}\n * @default 0\n */\n y = 0;\n\n /**\n * Horizontal offset of the control from the defined position. In pixels\n * Positive offset moves the control to the right, negative to the left.\n * It used when you want to have position of control that does not scale with\n * the bounding box. Example: rotation control is placed at x:0, y: 0.5 on\n * the boundind box, with an offset of 30 pixels vertically. Those 30 pixels will\n * stay 30 pixels no matter how the object is big. Another example is having 2\n * controls in the corner, that stay in the same position when the object scale.\n * of the bounding box.\n * @type {Number}\n * @default 0\n */\n offsetX = 0;\n\n /**\n * Vertical offset of the control from the defined position. In pixels\n * Positive offset moves the control to the bottom, negative to the top.\n * @type {Number}\n * @default 0\n */\n offsetY = 0;\n\n /**\n * Sets the length of the control. If null, defaults to object's cornerSize.\n * Expects both sizeX and sizeY to be set when set.\n * @type {?Number}\n * @default null\n */\n sizeX = 0;\n\n /**\n * Sets the height of the control. If null, defaults to object's cornerSize.\n * Expects both sizeX and sizeY to be set when set.\n * @type {?Number}\n * @default null\n */\n sizeY = 0;\n\n /**\n * Sets the length of the touch area of the control. If null, defaults to object's touchCornerSize.\n * Expects both touchSizeX and touchSizeY to be set when set.\n * @type {?Number}\n * @default null\n */\n touchSizeX = 0;\n\n /**\n * Sets the height of the touch area of the control. If null, defaults to object's touchCornerSize.\n * Expects both touchSizeX and touchSizeY to be set when set.\n * @type {?Number}\n * @default null\n */\n touchSizeY = 0;\n\n /**\n * Css cursor style to display when the control is hovered.\n * if the method `cursorStyleHandler` is provided, this property is ignored.\n * @type {String}\n * @default 'crosshair'\n */\n cursorStyle = 'crosshair';\n\n /**\n * If controls has an offsetY or offsetX, draw a line that connects\n * the control to the bounding box\n * @type {Boolean}\n * @default false\n */\n withConnection = false;\n\n constructor(options?: Partial) {\n Object.assign(this, options);\n }\n\n /**\n * The control actionHandler, provide one to handle action ( control being moved )\n * @param {Event} eventData the native mouse event\n * @param {Transform} transformData properties of the current transform\n * @param {Number} x x position of the cursor\n * @param {Number} y y position of the cursor\n * @return {Boolean} true if the action/event modified the object\n */\n declare actionHandler: TransformActionHandler;\n\n /**\n * The control handler for mouse down, provide one to handle mouse down on control\n * @param {Event} eventData the native mouse event\n * @param {Transform} transformData properties of the current transform\n * @param {Number} x x position of the cursor\n * @param {Number} y y position of the cursor\n * @return {Boolean} true if the action/event modified the object\n */\n declare mouseDownHandler?: ControlActionHandler;\n\n /**\n * The control mouseUpHandler, provide one to handle an effect on mouse up.\n * @param {Event} eventData the native mouse event\n * @param {Transform} transformData properties of the current transform\n * @param {Number} x x position of the cursor\n * @param {Number} y y position of the cursor\n * @return {Boolean} true if the action/event modified the object\n */\n declare mouseUpHandler?: ControlActionHandler;\n\n shouldActivate(\n controlKey: string,\n fabricObject: InteractiveFabricObject,\n pointer: Point,\n { tl, tr, br, bl }: TCornerPoint,\n ) {\n // TODO: locking logic can be handled here instead of in the control handler logic\n return (\n fabricObject.canvas?.getActiveObject() === fabricObject &&\n fabricObject.isControlVisible(controlKey) &&\n Intersection.isPointInPolygon(pointer, [tl, tr, br, bl])\n );\n }\n\n /**\n * Returns control actionHandler\n * @param {Event} eventData the native mouse event\n * @param {FabricObject} fabricObject on which the control is displayed\n * @param {Control} control control for which the action handler is being asked\n * @return {Function} the action handler\n */\n getActionHandler(\n eventData: TPointerEvent,\n fabricObject: InteractiveFabricObject,\n control: Control,\n ): TransformActionHandler | undefined {\n return this.actionHandler;\n }\n\n /**\n * Returns control mouseDown handler\n * @param {Event} eventData the native mouse event\n * @param {FabricObject} fabricObject on which the control is displayed\n * @param {Control} control control for which the action handler is being asked\n * @return {Function} the action handler\n */\n getMouseDownHandler(\n eventData: TPointerEvent,\n fabricObject: InteractiveFabricObject,\n control: Control,\n ): ControlActionHandler | undefined {\n return this.mouseDownHandler;\n }\n\n /**\n * Returns control mouseUp handler.\n * During actions the fabricObject or the control can be of different obj\n * @param {Event} eventData the native mouse event\n * @param {FabricObject} fabricObject on which the control is displayed\n * @param {Control} control control for which the action handler is being asked\n * @return {Function} the action handler\n */\n getMouseUpHandler(\n eventData: TPointerEvent,\n fabricObject: InteractiveFabricObject,\n control: Control,\n ): ControlActionHandler | undefined {\n return this.mouseUpHandler;\n }\n\n /**\n * Returns control cursorStyle for css using cursorStyle. If you need a more elaborate\n * function you can pass one in the constructor\n * the cursorStyle property\n * @param {Event} eventData the native mouse event\n * @param {Control} control the current control ( likely this)\n * @param {FabricObject} object on which the control is displayed\n * @return {String}\n */\n cursorStyleHandler(\n eventData: TPointerEvent,\n control: Control,\n fabricObject: InteractiveFabricObject,\n coord: TOCoord,\n ) {\n return control.cursorStyle;\n }\n\n /**\n * Returns the action name. The basic implementation just return the actionName property.\n * @param {Event} eventData the native mouse event\n * @param {Control} control the current control ( likely this)\n * @param {FabricObject} object on which the control is displayed\n * @return {String}\n */\n getActionName(\n eventData: TPointerEvent,\n control: Control,\n fabricObject: InteractiveFabricObject,\n ) {\n return control.actionName;\n }\n\n /**\n * Returns controls visibility\n * @param {FabricObject} object on which the control is displayed\n * @param {String} controlKey key where the control is memorized on the\n * @return {Boolean}\n */\n getVisibility(fabricObject: InteractiveFabricObject, controlKey: string) {\n return fabricObject._controlsVisibility?.[controlKey] ?? this.visible;\n }\n\n /**\n * Sets controls visibility\n * @param {Boolean} visibility for the object\n * @return {Void}\n */\n setVisibility(\n visibility: boolean,\n name?: string,\n fabricObject?: InteractiveFabricObject,\n ) {\n this.visible = visibility;\n }\n\n positionHandler(\n dim: Point,\n finalMatrix: TMat2D,\n fabricObject: InteractiveFabricObject,\n currentControl: Control,\n ) {\n return new Point(\n this.x * dim.x + this.offsetX,\n this.y * dim.y + this.offsetY,\n ).transform(finalMatrix);\n }\n\n /**\n * Returns the coords for this control based on object values.\n * @param {Number} objectAngle angle from the fabric object holding the control\n * @param {Number} objectCornerSize cornerSize from the fabric object holding the control (or touchCornerSize if\n * isTouch is true)\n * @param {Number} centerX x coordinate where the control center should be\n * @param {Number} centerY y coordinate where the control center should be\n * @param {boolean} isTouch true if touch corner, false if normal corner\n */\n calcCornerCoords(\n angle: TDegree,\n objectCornerSize: number,\n centerX: number,\n centerY: number,\n isTouch: boolean,\n fabricObject: InteractiveFabricObject,\n ) {\n const t = multiplyTransformMatrixArray([\n createTranslateMatrix(centerX, centerY),\n createRotateMatrix({ angle }),\n createScaleMatrix(\n (isTouch ? this.touchSizeX : this.sizeX) || objectCornerSize,\n (isTouch ? this.touchSizeY : this.sizeY) || objectCornerSize,\n ),\n ]);\n return {\n tl: new Point(-0.5, -0.5).transform(t),\n tr: new Point(0.5, -0.5).transform(t),\n br: new Point(0.5, 0.5).transform(t),\n bl: new Point(-0.5, 0.5).transform(t),\n };\n }\n\n /**\n * Render function for the control.\n * When this function runs the context is unscaled. unrotate. Just retina scaled.\n * all the functions will have to translate to the point left,top before starting Drawing\n * if they want to draw a control where the position is detected.\n * left and top are the result of the positionHandler function\n * @param {RenderingContext2D} ctx the context where the control will be drawn\n * @param {Number} left position of the canvas where we are about to render the control.\n * @param {Number} top position of the canvas where we are about to render the control.\n * @param {Object} styleOverride\n * @param {FabricObject} fabricObject the object where the control is about to be rendered\n */\n render(\n ctx: CanvasRenderingContext2D,\n left: number,\n top: number,\n styleOverride: ControlRenderingStyleOverride | undefined,\n fabricObject: InteractiveFabricObject,\n ) {\n styleOverride = styleOverride || {};\n switch (styleOverride.cornerStyle || fabricObject.cornerStyle) {\n case 'circle':\n renderCircleControl.call(\n this,\n ctx,\n left,\n top,\n styleOverride,\n fabricObject,\n );\n break;\n default:\n renderSquareControl.call(\n this,\n ctx,\n left,\n top,\n styleOverride,\n fabricObject,\n );\n }\n }\n}\n","import type {\n ControlCursorCallback,\n TransformActionHandler,\n} from '../EventTypeDefs';\nimport { ROTATING } from '../constants';\nimport { radiansToDegrees } from '../util/misc/radiansDegreesConversion';\nimport { isLocked, NOT_ALLOWED_CURSOR } from './util';\nimport { wrapWithFireEvent } from './wrapWithFireEvent';\nimport { wrapWithFixedAnchor } from './wrapWithFixedAnchor';\n\n/**\n * Find the correct style for the control that is used for rotation.\n * this function is very simple and it just take care of not-allowed or standard cursor\n * @param {Event} eventData the javascript event that is causing the scale\n * @param {Control} control the control that is interested in the action\n * @param {FabricObject} fabricObject the fabric object that is interested in the action\n * @return {String} a valid css string for the cursor\n */\nexport const rotationStyleHandler: ControlCursorCallback = (\n eventData,\n control,\n fabricObject,\n) => {\n if (fabricObject.lockRotation) {\n return NOT_ALLOWED_CURSOR;\n }\n return control.cursorStyle;\n};\n\n/**\n * Action handler for rotation and snapping, without anchor point.\n * Needs to be wrapped with `wrapWithFixedAnchor` to be effective\n * @param {Event} eventData javascript event that is doing the transform\n * @param {Object} transform javascript object containing a series of information around the current transform\n * @param {number} x current mouse x position, canvas normalized\n * @param {number} y current mouse y position, canvas normalized\n * @return {Boolean} true if some change happened\n * @private\n */\nconst rotateObjectWithSnapping: TransformActionHandler = (\n eventData,\n { target, ex, ey, theta, originX, originY },\n x,\n y,\n) => {\n const pivotPoint = target.translateToOriginPoint(\n target.getRelativeCenterPoint(),\n originX,\n originY,\n );\n\n if (isLocked(target, 'lockRotation')) {\n return false;\n }\n\n const lastAngle = Math.atan2(ey - pivotPoint.y, ex - pivotPoint.x),\n curAngle = Math.atan2(y - pivotPoint.y, x - pivotPoint.x);\n let angle = radiansToDegrees(curAngle - lastAngle + theta);\n\n if (target.snapAngle && target.snapAngle > 0) {\n const snapAngle = target.snapAngle,\n snapThreshold = target.snapThreshold || snapAngle,\n rightAngleLocked = Math.ceil(angle / snapAngle) * snapAngle,\n leftAngleLocked = Math.floor(angle / snapAngle) * snapAngle;\n\n if (Math.abs(angle - leftAngleLocked) < snapThreshold) {\n angle = leftAngleLocked;\n } else if (Math.abs(angle - rightAngleLocked) < snapThreshold) {\n angle = rightAngleLocked;\n }\n }\n\n // normalize angle to positive value\n if (angle < 0) {\n angle = 360 + angle;\n }\n angle %= 360;\n\n const hasRotated = target.angle !== angle;\n // TODO: why aren't we using set?\n target.angle = angle;\n return hasRotated;\n};\n\nexport const rotationWithSnapping = wrapWithFireEvent(\n ROTATING,\n wrapWithFixedAnchor(rotateObjectWithSnapping),\n);\n","import type {\n ControlCursorCallback,\n TPointerEvent,\n Transform,\n TransformActionHandler,\n} from '../EventTypeDefs';\nimport type { FabricObject } from '../shapes/Object/FabricObject';\nimport type { TAxis } from '../typedefs';\nimport type { Canvas } from '../canvas/Canvas';\nimport {\n findCornerQuadrant,\n getLocalPoint,\n invertOrigin,\n isLocked,\n isTransformCentered,\n NOT_ALLOWED_CURSOR,\n} from './util';\nimport { wrapWithFireEvent } from './wrapWithFireEvent';\nimport { wrapWithFixedAnchor } from './wrapWithFixedAnchor';\nimport { SCALE_X, SCALE_Y, SCALING } from '../constants';\n\ntype ScaleTransform = Transform & {\n gestureScale?: number;\n signX?: number;\n signY?: number;\n};\n\ntype ScaleBy = TAxis | 'equally' | '' | undefined;\n\n/**\n * Inspect event and fabricObject properties to understand if the scaling action\n * @param {Event} eventData from the user action\n * @param {FabricObject} fabricObject the fabric object about to scale\n * @return {Boolean} true if scale is proportional\n */\nexport function scaleIsProportional(\n eventData: TPointerEvent,\n fabricObject: FabricObject,\n): boolean {\n const canvas = fabricObject.canvas as Canvas,\n uniformIsToggled = eventData[canvas.uniScaleKey!];\n return (\n (canvas.uniformScaling && !uniformIsToggled) ||\n (!canvas.uniformScaling && uniformIsToggled)\n );\n}\n\n/**\n * Inspect fabricObject to understand if the current scaling action is allowed\n * @param {FabricObject} fabricObject the fabric object about to scale\n * @param {String} by 'x' or 'y' or ''\n * @param {Boolean} scaleProportionally true if we are trying to scale proportionally\n * @return {Boolean} true if scaling is not allowed at current conditions\n */\nexport function scalingIsForbidden(\n fabricObject: FabricObject,\n by: ScaleBy,\n scaleProportionally: boolean,\n) {\n const lockX = isLocked(fabricObject, 'lockScalingX'),\n lockY = isLocked(fabricObject, 'lockScalingY');\n if (lockX && lockY) {\n return true;\n }\n if (!by && (lockX || lockY) && scaleProportionally) {\n return true;\n }\n if (lockX && by === 'x') {\n return true;\n }\n if (lockY && by === 'y') {\n return true;\n }\n // code crashes because of a division by 0 if a 0 sized object is scaled\n // forbid to prevent scaling to happen. ISSUE-9475\n const { width, height, strokeWidth } = fabricObject;\n if (width === 0 && strokeWidth === 0 && by !== 'y') {\n return true;\n }\n if (height === 0 && strokeWidth === 0 && by !== 'x') {\n return true;\n }\n return false;\n}\n\nconst scaleMap = ['e', 'se', 's', 'sw', 'w', 'nw', 'n', 'ne', 'e'];\n\n/**\n * return the correct cursor style for the scale action\n * @param {Event} eventData the javascript event that is causing the scale\n * @param {Control} control the control that is interested in the action\n * @param {FabricObject} fabricObject the fabric object that is interested in the action\n * @return {String} a valid css string for the cursor\n */\nexport const scaleCursorStyleHandler: ControlCursorCallback = (\n eventData,\n control,\n fabricObject,\n coord,\n) => {\n const scaleProportionally = scaleIsProportional(eventData, fabricObject),\n by =\n control.x !== 0 && control.y === 0\n ? 'x'\n : control.x === 0 && control.y !== 0\n ? 'y'\n : '';\n if (scalingIsForbidden(fabricObject, by, scaleProportionally)) {\n return NOT_ALLOWED_CURSOR;\n }\n const n = findCornerQuadrant(fabricObject, control, coord);\n return `${scaleMap[n]}-resize`;\n};\n\n/**\n * Basic scaling logic, reused with different constrain for scaling X,Y, freely or equally.\n * Needs to be wrapped with `wrapWithFixedAnchor` to be effective\n * @param {Event} eventData javascript event that is doing the transform\n * @param {Object} transform javascript object containing a series of information around the current transform\n * @param {number} x current mouse x position, canvas normalized\n * @param {number} y current mouse y position, canvas normalized\n * @param {Object} options additional information for scaling\n * @param {String} options.by 'x', 'y', 'equally' or '' to indicate type of scaling\n * @return {Boolean} true if some change happened\n * @private\n */\nfunction scaleObject(\n eventData: TPointerEvent,\n transform: ScaleTransform,\n x: number,\n y: number,\n options: { by?: ScaleBy } = {},\n) {\n const target = transform.target,\n by = options.by,\n scaleProportionally = scaleIsProportional(eventData, target),\n forbidScaling = scalingIsForbidden(target, by, scaleProportionally);\n let newPoint, scaleX, scaleY, dim, signX, signY;\n\n if (forbidScaling) {\n return false;\n }\n if (transform.gestureScale) {\n scaleX = transform.scaleX * transform.gestureScale;\n scaleY = transform.scaleY * transform.gestureScale;\n } else {\n newPoint = getLocalPoint(\n transform,\n transform.originX,\n transform.originY,\n x,\n y,\n );\n // use of sign: We use sign to detect change of direction of an action. sign usually change when\n // we cross the origin point with the mouse. So a scale flip for example. There is an issue when scaling\n // by center and scaling using one middle control ( default: mr, mt, ml, mb), the mouse movement can easily\n // cross many time the origin point and flip the object. so we need a way to filter out the noise.\n // This ternary here should be ok to filter out X scaling when we want Y only and vice versa.\n signX = by !== 'y' ? Math.sign(newPoint.x || transform.signX || 1) : 1;\n signY = by !== 'x' ? Math.sign(newPoint.y || transform.signY || 1) : 1;\n if (!transform.signX) {\n transform.signX = signX;\n }\n if (!transform.signY) {\n transform.signY = signY;\n }\n\n if (\n isLocked(target, 'lockScalingFlip') &&\n (transform.signX !== signX || transform.signY !== signY)\n ) {\n return false;\n }\n\n dim = target._getTransformedDimensions();\n // missing detection of flip and logic to switch the origin\n if (scaleProportionally && !by) {\n // uniform scaling\n const distance = Math.abs(newPoint.x) + Math.abs(newPoint.y),\n { original } = transform,\n originalDistance =\n Math.abs((dim.x * original.scaleX) / target.scaleX) +\n Math.abs((dim.y * original.scaleY) / target.scaleY),\n scale = distance / originalDistance;\n scaleX = original.scaleX * scale;\n scaleY = original.scaleY * scale;\n } else {\n scaleX = Math.abs((newPoint.x * target.scaleX) / dim.x);\n scaleY = Math.abs((newPoint.y * target.scaleY) / dim.y);\n }\n // if we are scaling by center, we need to double the scale\n if (isTransformCentered(transform)) {\n scaleX *= 2;\n scaleY *= 2;\n }\n if (transform.signX !== signX && by !== 'y') {\n transform.originX = invertOrigin(transform.originX);\n scaleX *= -1;\n transform.signX = signX;\n }\n if (transform.signY !== signY && by !== 'x') {\n transform.originY = invertOrigin(transform.originY);\n scaleY *= -1;\n transform.signY = signY;\n }\n }\n // minScale is taken care of in the setter.\n const oldScaleX = target.scaleX,\n oldScaleY = target.scaleY;\n if (!by) {\n !isLocked(target, 'lockScalingX') && target.set(SCALE_X, scaleX);\n !isLocked(target, 'lockScalingY') && target.set(SCALE_Y, scaleY);\n } else {\n // forbidden cases already handled on top here.\n by === 'x' && target.set(SCALE_X, scaleX);\n by === 'y' && target.set(SCALE_Y, scaleY);\n }\n return oldScaleX !== target.scaleX || oldScaleY !== target.scaleY;\n}\n\n/**\n * Generic scaling logic, to scale from corners either equally or freely.\n * Needs to be wrapped with `wrapWithFixedAnchor` to be effective\n * @param {Event} eventData javascript event that is doing the transform\n * @param {Object} transform javascript object containing a series of information around the current transform\n * @param {number} x current mouse x position, canvas normalized\n * @param {number} y current mouse y position, canvas normalized\n * @return {Boolean} true if some change happened\n */\nexport const scaleObjectFromCorner: TransformActionHandler = (\n eventData,\n transform,\n x,\n y,\n) => {\n return scaleObject(eventData, transform, x, y);\n};\n\n/**\n * Scaling logic for the X axis.\n * Needs to be wrapped with `wrapWithFixedAnchor` to be effective\n * @param {Event} eventData javascript event that is doing the transform\n * @param {Object} transform javascript object containing a series of information around the current transform\n * @param {number} x current mouse x position, canvas normalized\n * @param {number} y current mouse y position, canvas normalized\n * @return {Boolean} true if some change happened\n */\nconst scaleObjectX: TransformActionHandler = (\n eventData,\n transform,\n x,\n y,\n) => {\n return scaleObject(eventData, transform, x, y, { by: 'x' });\n};\n\n/**\n * Scaling logic for the Y axis.\n * Needs to be wrapped with `wrapWithFixedAnchor` to be effective\n * @param {Event} eventData javascript event that is doing the transform\n * @param {Object} transform javascript object containing a series of information around the current transform\n * @param {number} x current mouse x position, canvas normalized\n * @param {number} y current mouse y position, canvas normalized\n * @return {Boolean} true if some change happened\n */\nconst scaleObjectY: TransformActionHandler = (\n eventData,\n transform,\n x,\n y,\n) => {\n return scaleObject(eventData, transform, x, y, { by: 'y' });\n};\n\nexport const scalingEqually = wrapWithFireEvent(\n SCALING,\n wrapWithFixedAnchor(scaleObjectFromCorner),\n);\n\nexport const scalingX = wrapWithFireEvent(\n SCALING,\n wrapWithFixedAnchor(scaleObjectX),\n);\n\nexport const scalingY = wrapWithFireEvent(\n SCALING,\n wrapWithFixedAnchor(scaleObjectY),\n);\n","import type {\n ControlCursorCallback,\n TPointerEvent,\n Transform,\n TransformActionHandler,\n} from '../EventTypeDefs';\nimport { resolveOrigin } from '../util/misc/resolveOrigin';\nimport { Point } from '../Point';\nimport type { TAxis, TAxisKey } from '../typedefs';\nimport {\n degreesToRadians,\n radiansToDegrees,\n} from '../util/misc/radiansDegreesConversion';\nimport {\n findCornerQuadrant,\n getLocalPoint,\n isLocked,\n NOT_ALLOWED_CURSOR,\n} from './util';\nimport { wrapWithFireEvent } from './wrapWithFireEvent';\nimport { wrapWithFixedAnchor } from './wrapWithFixedAnchor';\nimport {\n CENTER,\n SCALE_X,\n SCALE_Y,\n SKEWING,\n SKEW_X,\n SKEW_Y,\n} from '../constants';\n\nexport type SkewTransform = Transform & { skewingSide: -1 | 1 };\n\nconst AXIS_KEYS: Record<\n TAxis,\n {\n counterAxis: TAxis;\n scale: TAxisKey<'scale'>;\n skew: TAxisKey<'skew'>;\n lockSkewing: TAxisKey<'lockSkewing'>;\n origin: TAxisKey<'origin'>;\n flip: TAxisKey<'flip'>;\n }\n> = {\n x: {\n counterAxis: 'y',\n scale: SCALE_X,\n skew: SKEW_X,\n lockSkewing: 'lockSkewingX',\n origin: 'originX',\n flip: 'flipX',\n },\n y: {\n counterAxis: 'x',\n scale: SCALE_Y,\n skew: SKEW_Y,\n lockSkewing: 'lockSkewingY',\n origin: 'originY',\n flip: 'flipY',\n },\n};\n\nconst skewMap = ['ns', 'nesw', 'ew', 'nwse'];\n\n/**\n * return the correct cursor style for the skew action\n * @param {Event} eventData the javascript event that is causing the scale\n * @param {Control} control the control that is interested in the action\n * @param {FabricObject} fabricObject the fabric object that is interested in the action\n * @return {String} a valid css string for the cursor\n */\nexport const skewCursorStyleHandler: ControlCursorCallback = (\n eventData,\n control,\n fabricObject,\n coord,\n) => {\n if (control.x !== 0 && isLocked(fabricObject, 'lockSkewingY')) {\n return NOT_ALLOWED_CURSOR;\n }\n if (control.y !== 0 && isLocked(fabricObject, 'lockSkewingX')) {\n return NOT_ALLOWED_CURSOR;\n }\n const n = findCornerQuadrant(fabricObject, control, coord) % 4;\n return `${skewMap[n]}-resize`;\n};\n\n/**\n * Since skewing is applied before scaling, calculations are done in a scaleless plane\n * @see https://github.com/fabricjs/fabric.js/pull/8380\n */\nfunction skewObject(\n axis: TAxis,\n { target, ex, ey, skewingSide, ...transform }: SkewTransform,\n pointer: Point,\n) {\n const { skew: skewKey } = AXIS_KEYS[axis],\n offset = pointer\n .subtract(new Point(ex, ey))\n .divide(new Point(target.scaleX, target.scaleY))[axis],\n skewingBefore = target[skewKey],\n skewingStart = transform[skewKey],\n shearingStart = Math.tan(degreesToRadians(skewingStart)),\n // let a, b be the size of target\n // let a' be the value of a after applying skewing\n // then:\n // a' = a + b * skewA => skewA = (a' - a) / b\n // the value b is tricky since skewY is applied before skewX\n b =\n axis === 'y'\n ? target._getTransformedDimensions({\n scaleX: 1,\n scaleY: 1,\n // since skewY is applied before skewX, b (=width) is not affected by skewX\n skewX: 0,\n }).x\n : target._getTransformedDimensions({\n scaleX: 1,\n scaleY: 1,\n }).y;\n\n const shearing =\n (2 * offset * skewingSide) /\n // we max out fractions to safeguard from asymptotic behavior\n Math.max(b, 1) +\n // add starting state\n shearingStart;\n\n const skewing = radiansToDegrees(Math.atan(shearing));\n\n target.set(skewKey, skewing);\n const changed = skewingBefore !== target[skewKey];\n\n if (changed && axis === 'y') {\n // we don't want skewing to affect scaleX\n // so we factor it by the inverse skewing diff to make it seem unchanged to the viewer\n const { skewX, scaleX } = target,\n dimBefore = target._getTransformedDimensions({ skewY: skewingBefore }),\n dimAfter = target._getTransformedDimensions(),\n compensationFactor = skewX !== 0 ? dimBefore.x / dimAfter.x : 1;\n compensationFactor !== 1 &&\n target.set(SCALE_X, compensationFactor * scaleX);\n }\n\n return changed;\n}\n\n/**\n * Wrapped Action handler for skewing on a given axis, takes care of the\n * skew direction and determines the correct transform origin for the anchor point\n * @param {Event} eventData javascript event that is doing the transform\n * @param {Object} transform javascript object containing a series of information around the current transform\n * @param {number} x current mouse x position, canvas normalized\n * @param {number} y current mouse y position, canvas normalized\n * @return {Boolean} true if some change happened\n */\nfunction skewHandler(\n axis: TAxis,\n eventData: TPointerEvent,\n transform: Transform,\n x: number,\n y: number,\n) {\n const { target } = transform,\n {\n counterAxis,\n origin: originKey,\n lockSkewing: lockSkewingKey,\n skew: skewKey,\n flip: flipKey,\n } = AXIS_KEYS[axis];\n if (isLocked(target, lockSkewingKey)) {\n return false;\n }\n\n const { origin: counterOriginKey, flip: counterFlipKey } =\n AXIS_KEYS[counterAxis],\n counterOriginFactor =\n resolveOrigin(transform[counterOriginKey]) *\n (target[counterFlipKey] ? -1 : 1),\n // if the counter origin is top/left (= -0.5) then we are skewing x/y values on the bottom/right side of target respectively.\n // if the counter origin is bottom/right (= 0.5) then we are skewing x/y values on the top/left side of target respectively.\n // skewing direction on the top/left side of target is OPPOSITE to the direction of the movement of the pointer,\n // so we factor skewing direction by this value.\n skewingSide = (-Math.sign(counterOriginFactor) *\n (target[flipKey] ? -1 : 1)) as 1 | -1,\n skewingDirection =\n ((target[skewKey] === 0 &&\n // in case skewing equals 0 we use the pointer offset from target center to determine the direction of skewing\n getLocalPoint(transform, CENTER, CENTER, x, y)[axis] > 0) ||\n // in case target has skewing we use that as the direction\n target[skewKey] > 0\n ? 1\n : -1) * skewingSide,\n // anchor to the opposite side of the skewing direction\n // normalize value from [-1, 1] to origin value [0, 1]\n origin = -skewingDirection * 0.5 + 0.5;\n\n const finalHandler = wrapWithFireEvent(\n SKEWING,\n wrapWithFixedAnchor((eventData, transform, x, y) =>\n skewObject(axis, transform, new Point(x, y)),\n ),\n );\n\n return finalHandler(\n eventData,\n {\n ...transform,\n [originKey]: origin,\n skewingSide,\n },\n x,\n y,\n );\n}\n\n/**\n * Wrapped Action handler for skewing on the X axis, takes care of the\n * skew direction and determines the correct transform origin for the anchor point\n * @param {Event} eventData javascript event that is doing the transform\n * @param {Object} transform javascript object containing a series of information around the current transform\n * @param {number} x current mouse x position, canvas normalized\n * @param {number} y current mouse y position, canvas normalized\n * @return {Boolean} true if some change happened\n */\nexport const skewHandlerX: TransformActionHandler = (\n eventData,\n transform,\n x,\n y,\n) => {\n return skewHandler('x', eventData, transform, x, y);\n};\n\n/**\n * Wrapped Action handler for skewing on the Y axis, takes care of the\n * skew direction and determines the correct transform origin for the anchor point\n * @param {Event} eventData javascript event that is doing the transform\n * @param {Object} transform javascript object containing a series of information around the current transform\n * @param {number} x current mouse x position, canvas normalized\n * @param {number} y current mouse y position, canvas normalized\n * @return {Boolean} true if some change happened\n */\nexport const skewHandlerY: TransformActionHandler = (\n eventData,\n transform,\n x,\n y,\n) => {\n return skewHandler('y', eventData, transform, x, y);\n};\n","import type {\n ControlCallback,\n ControlCursorCallback,\n TPointerEvent,\n TransformActionHandler,\n} from '../EventTypeDefs';\nimport { SCALE_X, SCALE_Y, SKEW_X, SKEW_Y } from '../constants';\nimport type { FabricObject } from '../shapes/Object/FabricObject';\nimport type { TAxisKey } from '../typedefs';\nimport { scaleCursorStyleHandler, scalingX, scalingY } from './scale';\nimport { skewCursorStyleHandler, skewHandlerX, skewHandlerY } from './skew';\n\nfunction isAltAction(eventData: TPointerEvent, target: FabricObject) {\n return eventData[target.canvas!.altActionKey!];\n}\n\n/**\n * Inspect event, control and fabricObject to return the correct action name\n * @param {Event} eventData the javascript event that is causing the scale\n * @param {Control} control the control that is interested in the action\n * @param {FabricObject} fabricObject the fabric object that is interested in the action\n * @return {String} an action name\n */\nexport const scaleOrSkewActionName: ControlCallback<\n TAxisKey<'skew' | 'scale'> | ''\n> = (eventData, control, fabricObject) => {\n const isAlternative = isAltAction(eventData, fabricObject);\n if (control.x === 0) {\n // then is scaleY or skewX\n return isAlternative ? SKEW_X : SCALE_Y;\n }\n if (control.y === 0) {\n // then is scaleY or skewX\n return isAlternative ? SKEW_Y : SCALE_X;\n }\n return '';\n};\n\n/**\n * Combine skew and scale style handlers to cover fabric standard use case\n * @param {Event} eventData the javascript event that is causing the scale\n * @param {Control} control the control that is interested in the action\n * @param {FabricObject} fabricObject the fabric object that is interested in the action\n * @return {String} a valid css string for the cursor\n */\nexport const scaleSkewCursorStyleHandler: ControlCursorCallback = (\n eventData,\n control,\n fabricObject,\n coord,\n) => {\n return isAltAction(eventData, fabricObject)\n ? skewCursorStyleHandler(eventData, control, fabricObject, coord)\n : scaleCursorStyleHandler(eventData, control, fabricObject, coord);\n};\n/**\n * Composed action handler to either scale X or skew Y\n * Needs to be wrapped with `wrapWithFixedAnchor` to be effective\n * @param {Event} eventData javascript event that is doing the transform\n * @param {Object} transform javascript object containing a series of information around the current transform\n * @param {number} x current mouse x position, canvas normalized\n * @param {number} y current mouse y position, canvas normalized\n * @return {Boolean} true if some change happened\n */\nexport const scalingXOrSkewingY: TransformActionHandler = (\n eventData,\n transform,\n x,\n y,\n) => {\n return isAltAction(eventData, transform.target)\n ? skewHandlerY(eventData, transform, x, y)\n : scalingX(eventData, transform, x, y);\n};\n\n/**\n * Composed action handler to either scale Y or skew X\n * Needs to be wrapped with `wrapWithFixedAnchor` to be effective\n * @param {Event} eventData javascript event that is doing the transform\n * @param {Object} transform javascript object containing a series of information around the current transform\n * @param {number} x current mouse x position, canvas normalized\n * @param {number} y current mouse y position, canvas normalized\n * @return {Boolean} true if some change happened\n */\nexport const scalingYOrSkewingX: TransformActionHandler = (\n eventData,\n transform,\n x,\n y,\n) => {\n return isAltAction(eventData, transform.target)\n ? skewHandlerX(eventData, transform, x, y)\n : scalingY(eventData, transform, x, y);\n};\n","import { RESIZING, ROTATE } from '../constants';\nimport { changeWidth } from './changeWidth';\nimport { Control } from './Control';\nimport { rotationStyleHandler, rotationWithSnapping } from './rotate';\nimport { scaleCursorStyleHandler, scalingEqually } from './scale';\nimport {\n scaleOrSkewActionName,\n scaleSkewCursorStyleHandler,\n scalingXOrSkewingY,\n scalingYOrSkewingX,\n} from './scaleSkew';\n\n// use this function if you want to generate new controls for every instance\nexport const createObjectDefaultControls = () => ({\n ml: new Control({\n x: -0.5,\n y: 0,\n cursorStyleHandler: scaleSkewCursorStyleHandler,\n actionHandler: scalingXOrSkewingY,\n getActionName: scaleOrSkewActionName,\n }),\n\n mr: new Control({\n x: 0.5,\n y: 0,\n cursorStyleHandler: scaleSkewCursorStyleHandler,\n actionHandler: scalingXOrSkewingY,\n getActionName: scaleOrSkewActionName,\n }),\n\n mb: new Control({\n x: 0,\n y: 0.5,\n cursorStyleHandler: scaleSkewCursorStyleHandler,\n actionHandler: scalingYOrSkewingX,\n getActionName: scaleOrSkewActionName,\n }),\n\n mt: new Control({\n x: 0,\n y: -0.5,\n cursorStyleHandler: scaleSkewCursorStyleHandler,\n actionHandler: scalingYOrSkewingX,\n getActionName: scaleOrSkewActionName,\n }),\n\n tl: new Control({\n x: -0.5,\n y: -0.5,\n cursorStyleHandler: scaleCursorStyleHandler,\n actionHandler: scalingEqually,\n }),\n\n tr: new Control({\n x: 0.5,\n y: -0.5,\n cursorStyleHandler: scaleCursorStyleHandler,\n actionHandler: scalingEqually,\n }),\n\n bl: new Control({\n x: -0.5,\n y: 0.5,\n cursorStyleHandler: scaleCursorStyleHandler,\n actionHandler: scalingEqually,\n }),\n\n br: new Control({\n x: 0.5,\n y: 0.5,\n cursorStyleHandler: scaleCursorStyleHandler,\n actionHandler: scalingEqually,\n }),\n\n mtr: new Control({\n x: 0,\n y: -0.5,\n actionHandler: rotationWithSnapping,\n cursorStyleHandler: rotationStyleHandler,\n offsetY: -40,\n withConnection: true,\n actionName: ROTATE,\n }),\n});\n\nexport const createResizeControls = () => ({\n mr: new Control({\n x: 0.5,\n y: 0,\n actionHandler: changeWidth,\n cursorStyleHandler: scaleSkewCursorStyleHandler,\n actionName: RESIZING,\n }),\n ml: new Control({\n x: -0.5,\n y: 0,\n actionHandler: changeWidth,\n cursorStyleHandler: scaleSkewCursorStyleHandler,\n actionName: RESIZING,\n }),\n});\n\nexport const createTextboxDefaultControls = () => ({\n ...createObjectDefaultControls(),\n ...createResizeControls(),\n});\n","import { Point, ZERO } from '../../Point';\nimport type { TCornerPoint, TDegree } from '../../typedefs';\nimport { FabricObject } from './Object';\nimport { degreesToRadians } from '../../util/misc/radiansDegreesConversion';\nimport type { TQrDecomposeOut } from '../../util/misc/matrix';\nimport {\n calcDimensionsMatrix,\n createRotateMatrix,\n createTranslateMatrix,\n multiplyTransformMatrices,\n qrDecompose,\n} from '../../util/misc/matrix';\nimport type { Control } from '../../controls/Control';\nimport { sizeAfterTransform } from '../../util/misc/objectTransforms';\nimport type { ObjectEvents, TPointerEvent } from '../../EventTypeDefs';\nimport type { Canvas } from '../../canvas/Canvas';\nimport type { ControlRenderingStyleOverride } from '../../controls/controlRendering';\nimport type { FabricObjectProps } from './types/FabricObjectProps';\nimport type { TFabricObjectProps, SerializedObjectProps } from './types';\nimport { createObjectDefaultControls } from '../../controls/commonControls';\nimport { interactiveObjectDefaultValues } from './defaultValues';\nimport { SCALE } from '../../constants';\n\nexport type TOCoord = Point & {\n corner: TCornerPoint;\n touchCorner: TCornerPoint;\n};\n\nexport type TControlSet = Record;\n\nexport type TBorderRenderingStyleOverride = Partial<\n Pick\n>;\n\nexport type TStyleOverride = ControlRenderingStyleOverride &\n TBorderRenderingStyleOverride &\n Partial<\n Pick & {\n forActiveSelection: boolean;\n }\n >;\n\nexport class InteractiveFabricObject<\n Props extends TFabricObjectProps = Partial,\n SProps extends SerializedObjectProps = SerializedObjectProps,\n EventSpec extends ObjectEvents = ObjectEvents,\n >\n extends FabricObject\n implements FabricObjectProps\n{\n declare noScaleCache: boolean;\n\n declare snapAngle?: TDegree;\n declare snapThreshold?: TDegree;\n\n declare lockMovementX: boolean;\n declare lockMovementY: boolean;\n declare lockRotation: boolean;\n declare lockScalingX: boolean;\n declare lockScalingY: boolean;\n declare lockSkewingX: boolean;\n declare lockSkewingY: boolean;\n declare lockScalingFlip: boolean;\n\n declare cornerSize: number;\n declare touchCornerSize: number;\n declare transparentCorners: boolean;\n declare cornerColor: string;\n declare cornerStrokeColor: string;\n declare cornerStyle: 'rect' | 'circle';\n declare cornerDashArray: number[] | null;\n declare hasControls: boolean;\n\n declare borderColor: string;\n declare borderDashArray: number[] | null;\n declare borderOpacityWhenMoving: number;\n declare borderScaleFactor: number;\n declare hasBorders: boolean;\n declare selectionBackgroundColor: string;\n\n declare selectable: boolean;\n declare evented: boolean;\n declare perPixelTargetFind: boolean;\n declare activeOn: 'down' | 'up';\n\n declare hoverCursor: CSSStyleDeclaration['cursor'] | null;\n declare moveCursor: CSSStyleDeclaration['cursor'] | null;\n\n /**\n * The object's controls' position in viewport coordinates\n * Calculated by {@link Control#positionHandler} and {@link Control#calcCornerCoords}, depending on {@link padding}.\n * `corner/touchCorner` describe the 4 points forming the interactive area of the corner.\n * Used to draw and locate controls.\n */\n declare oCoords: Record;\n\n /**\n * keeps the value of the last hovered corner during mouse move.\n * 0 is no corner, or 'mt', 'ml', 'mtr' etc..\n * It should be private, but there is no harm in using it as\n * a read-only property.\n * this isn't cleaned automatically. Non selected objects may have wrong values\n * @type [string]\n */\n declare __corner?: string;\n\n /**\n * a map of control visibility for this object.\n * this was left when controls were introduced to not break the api too much\n * this takes priority over the generic control visibility\n */\n declare _controlsVisibility: Record;\n\n /**\n * holds the controls for the object.\n * controls are added by default_controls.js\n */\n declare controls: TControlSet;\n\n /**\n * internal boolean to signal the code that the object is\n * part of the move action.\n */\n declare isMoving?: boolean;\n\n /**\n * A boolean used from the gesture module to keep tracking of a scaling\n * action when there is no scaling transform in place.\n * This is an edge case and is used twice in all codebase.\n * Probably added to keep track of some performance issues\n * @TODO use git blame to investigate why it was added\n * DON'T USE IT. WE WILL TRY TO REMOVE IT\n */\n declare _scaling?: boolean;\n\n declare canvas?: Canvas;\n\n static ownDefaults = interactiveObjectDefaultValues;\n\n static getDefaults(): Record {\n return {\n ...super.getDefaults(),\n ...InteractiveFabricObject.ownDefaults,\n };\n }\n\n /**\n * Constructor\n * @param {Object} [options] Options object\n */\n constructor(options?: Props) {\n super();\n Object.assign(\n this,\n (this.constructor as typeof InteractiveFabricObject).createControls(),\n InteractiveFabricObject.ownDefaults,\n );\n this.setOptions(options);\n }\n\n /**\n * Creates the default control object.\n * If you prefer to have on instance of controls shared among all objects\n * make this function return an empty object and add controls to the ownDefaults\n * @param {Object} [options] Options object\n */\n static createControls(): { controls: Record } {\n return { controls: createObjectDefaultControls() };\n }\n\n /**\n * Update width and height of the canvas for cache\n * returns true or false if canvas needed resize.\n * @private\n * @return {Boolean} true if the canvas has been resized\n */\n _updateCacheCanvas() {\n const targetCanvas = this.canvas;\n if (this.noScaleCache && targetCanvas && targetCanvas._currentTransform) {\n const transform = targetCanvas._currentTransform,\n target = transform.target,\n action = transform.action;\n if (\n this === (target as unknown as this) &&\n action &&\n action.startsWith(SCALE)\n ) {\n return false;\n }\n }\n return super._updateCacheCanvas();\n }\n\n getActiveControl() {\n const key = this.__corner;\n return key\n ? {\n key,\n control: this.controls[key],\n coord: this.oCoords[key],\n }\n : undefined;\n }\n\n /**\n * Determines which corner is under the mouse cursor, represented by `pointer`.\n * This function returns a corner only if the object is the active one.\n * This is done to avoid selecting corner of non active object and activating transformations\n * rather than drag action. The default behavior of fabricJS is that if you want to transform\n * an object, first you select it to show the control set\n * @private\n * @param {Object} pointer The pointer indicating the mouse position\n * @param {boolean} forTouch indicates if we are looking for interaction area with a touch action\n * @return {String|Boolean} corner code (tl, tr, bl, br, etc.), or 0 if nothing is found.\n */\n findControl(\n pointer: Point,\n forTouch = false,\n ): { key: string; control: Control; coord: TOCoord } | undefined {\n if (!this.hasControls || !this.canvas) {\n return undefined;\n }\n\n this.__corner = undefined;\n const cornerEntries = Object.entries(this.oCoords);\n for (let i = cornerEntries.length - 1; i >= 0; i--) {\n const [key, corner] = cornerEntries[i];\n const control = this.controls[key];\n\n if (\n control.shouldActivate(\n key,\n this,\n pointer,\n forTouch ? corner.touchCorner : corner.corner,\n )\n ) {\n // this.canvas.contextTop.fillRect(pointer.x - 1, pointer.y - 1, 2, 2);\n this.__corner = key;\n\n return { key, control, coord: this.oCoords[key] };\n }\n }\n\n return undefined;\n }\n\n /**\n * Calculates the coordinates of the center of each control plus the corners of the control itself\n * This basically just delegates to each control positionHandler\n * WARNING: changing what is passed to positionHandler is a breaking change, since position handler\n * is a public api and should be done just if extremely necessary\n * @return {Record}\n */\n calcOCoords(): Record {\n const vpt = this.getViewportTransform(),\n center = this.getCenterPoint(),\n tMatrix = createTranslateMatrix(center.x, center.y),\n rMatrix = createRotateMatrix({\n angle: this.getTotalAngle() - (!!this.group && this.flipX ? 180 : 0),\n }),\n positionMatrix = multiplyTransformMatrices(tMatrix, rMatrix),\n startMatrix = multiplyTransformMatrices(vpt, positionMatrix),\n finalMatrix = multiplyTransformMatrices(startMatrix, [\n 1 / vpt[0],\n 0,\n 0,\n 1 / vpt[3],\n 0,\n 0,\n ]),\n transformOptions = this.group\n ? qrDecompose(this.calcTransformMatrix())\n : undefined;\n // decomposing could bring negative scaling and `_calculateCurrentDimensions` can't take it\n if (transformOptions) {\n transformOptions.scaleX = Math.abs(transformOptions.scaleX);\n transformOptions.scaleY = Math.abs(transformOptions.scaleY);\n }\n const dim = this._calculateCurrentDimensions(transformOptions),\n coords: Record = {};\n\n this.forEachControl((control, key) => {\n const position = control.positionHandler(dim, finalMatrix, this, control);\n // coords[key] are sometimes used as points. Those are points to which we add\n // the property corner and touchCorner from `_calcCornerCoords`.\n // don't remove this assign for an object spread.\n coords[key] = Object.assign(\n position,\n this._calcCornerCoords(control, position),\n );\n });\n\n // debug code\n /*\n const canvas = this.canvas;\n setTimeout(function () {\n if (!canvas) return;\n canvas.contextTop.clearRect(0, 0, 700, 700);\n canvas.contextTop.fillStyle = 'green';\n Object.keys(coords).forEach(function(key) {\n const control = coords[key];\n canvas.contextTop.fillRect(control.x, control.y, 3, 3);\n });\n } 50);\n */\n return coords;\n }\n\n /**\n * Sets the coordinates that determine the interaction area of each control\n * note: if we would switch to ROUND corner area, all of this would disappear.\n * everything would resolve to a single point and a pythagorean theorem for the distance\n * @todo evaluate simplification of code switching to circle interaction area at runtime\n * @private\n */\n private _calcCornerCoords(control: Control, position: Point) {\n const angle = this.getTotalAngle();\n const corner = control.calcCornerCoords(\n angle,\n this.cornerSize,\n position.x,\n position.y,\n false,\n this,\n );\n const touchCorner = control.calcCornerCoords(\n angle,\n this.touchCornerSize,\n position.x,\n position.y,\n true,\n this,\n );\n return { corner, touchCorner };\n }\n\n /**\n * @override set controls' coordinates as well\n * See {@link https://github.com/fabricjs/fabric.js/wiki/When-to-call-setCoords} and {@link https://fabric5.fabricjs.com/fabric-gotchas}\n * @return {void}\n */\n setCoords(): void {\n super.setCoords();\n this.canvas && (this.oCoords = this.calcOCoords());\n }\n\n /**\n * Calls a function for each control. The function gets called,\n * with the control, the control's key and the object that is calling the iterator\n * @param {Function} fn function to iterate over the controls over\n */\n forEachControl(\n fn: (\n control: Control,\n key: string,\n fabricObject: InteractiveFabricObject,\n ) => any,\n ) {\n for (const i in this.controls) {\n fn(this.controls[i], i, this);\n }\n }\n\n /**\n * Draws a colored layer behind the object, inside its selection borders.\n * Requires public options: padding, selectionBackgroundColor\n * this function is called when the context is transformed\n * has checks to be skipped when the object is on a staticCanvas\n * @todo evaluate if make this disappear in favor of a pre-render hook for objects\n * this was added by Andrea Bogazzi to make possible some feature for work reasons\n * it seemed a good option, now is an edge case\n * @param {CanvasRenderingContext2D} ctx Context to draw on\n */\n drawSelectionBackground(ctx: CanvasRenderingContext2D): void {\n if (\n !this.selectionBackgroundColor ||\n (this.canvas && (this.canvas._activeObject as unknown as this) !== this)\n ) {\n return;\n }\n ctx.save();\n const center = this.getRelativeCenterPoint(),\n wh = this._calculateCurrentDimensions(),\n vpt = this.getViewportTransform();\n ctx.translate(center.x, center.y);\n ctx.scale(1 / vpt[0], 1 / vpt[3]);\n ctx.rotate(degreesToRadians(this.angle));\n ctx.fillStyle = this.selectionBackgroundColor;\n ctx.fillRect(-wh.x / 2, -wh.y / 2, wh.x, wh.y);\n ctx.restore();\n }\n\n /**\n * @public override this function in order to customize the drawing of the control box, e.g. rounded corners, different border style.\n * @param {CanvasRenderingContext2D} ctx ctx is rotated and translated so that (0,0) is at object's center\n * @param {Point} size the control box size used\n */\n strokeBorders(ctx: CanvasRenderingContext2D, size: Point): void {\n ctx.strokeRect(-size.x / 2, -size.y / 2, size.x, size.y);\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to draw on\n * @param {Point} size\n * @param {TStyleOverride} styleOverride object to override the object style\n */\n _drawBorders(\n ctx: CanvasRenderingContext2D,\n size: Point,\n styleOverride: TStyleOverride = {},\n ): void {\n const options = {\n hasControls: this.hasControls,\n borderColor: this.borderColor,\n borderDashArray: this.borderDashArray,\n ...styleOverride,\n };\n ctx.save();\n ctx.strokeStyle = options.borderColor;\n this._setLineDash(ctx, options.borderDashArray);\n this.strokeBorders(ctx, size);\n options.hasControls && this.drawControlsConnectingLines(ctx, size);\n ctx.restore();\n }\n\n /**\n * Renders controls and borders for the object\n * the context here is not transformed\n * @todo move to interactivity\n * @param {CanvasRenderingContext2D} ctx Context to render on\n * @param {TStyleOverride} [styleOverride] properties to override the object style\n */\n _renderControls(\n ctx: CanvasRenderingContext2D,\n styleOverride: TStyleOverride = {},\n ) {\n const { hasBorders, hasControls } = this;\n const styleOptions = {\n hasBorders,\n hasControls,\n ...styleOverride,\n };\n const vpt = this.getViewportTransform(),\n shouldDrawBorders = styleOptions.hasBorders,\n shouldDrawControls = styleOptions.hasControls;\n const matrix = multiplyTransformMatrices(vpt, this.calcTransformMatrix());\n const options = qrDecompose(matrix);\n ctx.save();\n ctx.translate(options.translateX, options.translateY);\n ctx.lineWidth = this.borderScaleFactor; // 1 * this.borderScaleFactor;\n // since interactive groups have been introduced, an object could be inside a group and needing controls\n // the following equality check `this.group === this.parent` covers:\n // object without a group ( undefined === undefined )\n // object inside a group\n // excludes object inside a group but multi selected since group and parent will differ in value\n if (this.group === this.parent) {\n ctx.globalAlpha = this.isMoving ? this.borderOpacityWhenMoving : 1;\n }\n if (this.flipX) {\n options.angle -= 180;\n }\n ctx.rotate(degreesToRadians(this.group ? options.angle : this.angle));\n shouldDrawBorders && this.drawBorders(ctx, options, styleOverride);\n shouldDrawControls && this.drawControls(ctx, styleOverride);\n ctx.restore();\n }\n\n /**\n * Draws borders of an object's bounding box.\n * Requires public properties: width, height\n * Requires public options: padding, borderColor\n * @param {CanvasRenderingContext2D} ctx Context to draw on\n * @param {object} options object representing current object parameters\n * @param {TStyleOverride} [styleOverride] object to override the object style\n */\n drawBorders(\n ctx: CanvasRenderingContext2D,\n options: TQrDecomposeOut,\n styleOverride: TStyleOverride,\n ): void {\n let size;\n if ((styleOverride && styleOverride.forActiveSelection) || this.group) {\n const bbox = sizeAfterTransform(\n this.width,\n this.height,\n calcDimensionsMatrix(options),\n ),\n stroke = !this.isStrokeAccountedForInDimensions()\n ? (this.strokeUniform\n ? new Point().scalarAdd(this.canvas ? this.canvas.getZoom() : 1)\n : // this is extremely confusing. options comes from the upper function\n // and is the qrDecompose of a matrix that takes in account zoom too\n new Point(options.scaleX, options.scaleY)\n ).scalarMultiply(this.strokeWidth)\n : ZERO;\n size = bbox\n .add(stroke)\n .scalarAdd(this.borderScaleFactor)\n .scalarAdd(this.padding * 2);\n } else {\n size = this._calculateCurrentDimensions().scalarAdd(\n this.borderScaleFactor,\n );\n }\n this._drawBorders(ctx, size, styleOverride);\n }\n\n /**\n * Draws lines from a borders of an object's bounding box to controls that have `withConnection` property set.\n * Requires public properties: width, height\n * Requires public options: padding, borderColor\n * @param {CanvasRenderingContext2D} ctx Context to draw on\n * @param {Point} size object size x = width, y = height\n */\n drawControlsConnectingLines(\n ctx: CanvasRenderingContext2D,\n size: Point,\n ): void {\n let shouldStroke = false;\n\n ctx.beginPath();\n this.forEachControl((control, key) => {\n // in this moment, the ctx is centered on the object.\n // width and height of the above function are the size of the bbox.\n if (control.withConnection && control.getVisibility(this, key)) {\n // reset movement for each control\n shouldStroke = true;\n ctx.moveTo(control.x * size.x, control.y * size.y);\n ctx.lineTo(\n control.x * size.x + control.offsetX,\n control.y * size.y + control.offsetY,\n );\n }\n });\n shouldStroke && ctx.stroke();\n }\n\n /**\n * Draws corners of an object's bounding box.\n * Requires public properties: width, height\n * Requires public options: cornerSize, padding\n * Be aware that since fabric 6.0 this function does not call setCoords anymore.\n * setCoords needs to be called manually if the object of which we are rendering controls\n * is outside the standard selection and transform process.\n * @param {CanvasRenderingContext2D} ctx Context to draw on\n * @param {ControlRenderingStyleOverride} styleOverride object to override the object style\n */\n drawControls(\n ctx: CanvasRenderingContext2D,\n styleOverride: ControlRenderingStyleOverride = {},\n ) {\n ctx.save();\n const retinaScaling = this.getCanvasRetinaScaling();\n const { cornerStrokeColor, cornerDashArray, cornerColor } = this;\n const options = {\n cornerStrokeColor,\n cornerDashArray,\n cornerColor,\n ...styleOverride,\n };\n ctx.setTransform(retinaScaling, 0, 0, retinaScaling, 0, 0);\n ctx.strokeStyle = ctx.fillStyle = options.cornerColor;\n if (!this.transparentCorners) {\n ctx.strokeStyle = options.cornerStrokeColor;\n }\n this._setLineDash(ctx, options.cornerDashArray);\n this.forEachControl((control, key) => {\n if (control.getVisibility(this, key)) {\n const p = this.oCoords[key];\n control.render(ctx, p.x, p.y, options, this);\n }\n });\n ctx.restore();\n }\n\n /**\n * Returns true if the specified control is visible, false otherwise.\n * @param {string} controlKey The key of the control. Possible values are usually 'tl', 'tr', 'br', 'bl', 'ml', 'mt', 'mr', 'mb', 'mtr',\n * but since the control api allow for any control name, can be any string.\n * @returns {boolean} true if the specified control is visible, false otherwise\n */\n isControlVisible(controlKey: string): boolean {\n return (\n this.controls[controlKey] &&\n this.controls[controlKey].getVisibility(this, controlKey)\n );\n }\n\n /**\n * Sets the visibility of the specified control.\n * please do not use.\n * @param {String} controlKey The key of the control. Possible values are 'tl', 'tr', 'br', 'bl', 'ml', 'mt', 'mr', 'mb', 'mtr'.\n * but since the control api allow for any control name, can be any string.\n * @param {Boolean} visible true to set the specified control visible, false otherwise\n * @todo discuss this overlap of priority here with the team. Andrea Bogazzi for details\n */\n setControlVisible(controlKey: string, visible: boolean) {\n if (!this._controlsVisibility) {\n this._controlsVisibility = {};\n }\n this._controlsVisibility[controlKey] = visible;\n }\n\n /**\n * Sets the visibility state of object controls, this is just a bulk option for setControlVisible;\n * @param {Record} [options] with an optional key per control\n * example: {Boolean} [options.bl] true to enable the bottom-left control, false to disable it\n */\n setControlsVisibility(options: Record = {}) {\n Object.entries(options).forEach(([controlKey, visibility]) =>\n this.setControlVisible(controlKey, visibility),\n );\n }\n\n /**\n * Clears the canvas.contextTop in a specific area that corresponds to the object's bounding box\n * that is in the canvas.contextContainer.\n * This function is used to clear pieces of contextTop where we render ephemeral effects on top of the object.\n * Example: blinking cursor text selection, drag effects.\n * @todo discuss swapping restoreManually with a renderCallback, but think of async issues\n * @param {Boolean} [restoreManually] When true won't restore the context after clear, in order to draw something else.\n * @return {CanvasRenderingContext2D|undefined} canvas.contextTop that is either still transformed\n * with the object transformMatrix, or restored to neutral transform\n */\n clearContextTop(\n restoreManually?: boolean,\n ): CanvasRenderingContext2D | undefined {\n if (!this.canvas) {\n return;\n }\n const ctx = this.canvas.contextTop;\n if (!ctx) {\n return;\n }\n const v = this.canvas.viewportTransform;\n ctx.save();\n ctx.transform(v[0], v[1], v[2], v[3], v[4], v[5]);\n this.transform(ctx);\n // we add 4 pixel, to be sure to do not leave any pixel out\n const width = this.width + 4,\n height = this.height + 4;\n ctx.clearRect(-width / 2, -height / 2, width, height);\n\n restoreManually || ctx.restore();\n return ctx;\n }\n\n /**\n * This callback function is called every time _discardActiveObject or _setActiveObject\n * try to to deselect this object. If the function returns true, the process is cancelled\n * @param {Object} [_options] options sent from the upper functions\n * @param {TPointerEvent} [options.e] event if the process is generated by an event\n * @param {FabricObject} [options.object] next object we are setting as active, and reason why\n * this is being deselected\n */\n onDeselect(_options?: {\n e?: TPointerEvent;\n object?: InteractiveFabricObject;\n }): boolean {\n // implemented by sub-classes, as needed.\n return false;\n }\n\n /**\n * This callback function is called every time _discardActiveObject or _setActiveObject\n * try to to select this object. If the function returns true, the process is cancelled\n * @param {Object} [_options] options sent from the upper functions\n * @param {Event} [_options.e] event if the process is generated by an event\n */\n onSelect(_options?: { e?: TPointerEvent }): boolean {\n // implemented by sub-classes, as needed.\n return false;\n }\n\n /**\n * Override to customize Drag behavior\n * Fired from {@link Canvas#_onMouseMove}\n * @returns true in order for the window to start a drag session\n */\n shouldStartDragging(_e: TPointerEvent) {\n return false;\n }\n\n /**\n * Override to customize Drag behavior\\\n * Fired once a drag session has started\n * @returns true to handle the drag event\n */\n onDragStart(_e: DragEvent) {\n return false;\n }\n\n /**\n * Override to customize drag and drop behavior\n * @public\n * @param {DragEvent} _e\n * @returns {boolean} true if the object currently dragged can be dropped on the target\n */\n canDrop(_e: DragEvent): boolean {\n return false;\n }\n\n /**\n * Override to customize drag and drop behavior\n * render a specific effect when an object is the source of a drag event\n * example: render the selection status for the part of text that is being dragged from a text object\n * @public\n * @param {DragEvent} _e\n */\n renderDragSourceEffect(_e: DragEvent) {\n // for subclasses\n }\n\n /**\n * Override to customize drag and drop behavior\n * render a specific effect when an object is the target of a drag event\n * used to show that the underly object can receive a drop, or to show how the\n * object will change when dropping. example: show the cursor where the text is about to be dropped\n * @public\n * @param {DragEvent} _e\n */\n renderDropTargetEffect(_e: DragEvent) {\n // for subclasses\n }\n}\n","import type { Constructor } from '../typedefs';\n\n/***\n * https://www.typescriptlang.org/docs/handbook/mixins.html#alternative-pattern\n */\nexport function applyMixins(\n derivedCtor: T,\n constructors: S[],\n) {\n constructors.forEach((baseCtor) => {\n Object.getOwnPropertyNames(baseCtor.prototype).forEach((name) => {\n name !== 'constructor' &&\n Object.defineProperty(\n derivedCtor.prototype,\n name,\n Object.getOwnPropertyDescriptor(baseCtor.prototype, name) ||\n Object.create(null),\n );\n });\n });\n return derivedCtor as T & { prototype: InstanceType };\n}\n","import type { ObjectEvents } from '../../EventTypeDefs';\nimport { FabricObjectSVGExportMixin } from './FabricObjectSVGExportMixin';\nimport { InteractiveFabricObject } from './InteractiveObject';\nimport { applyMixins } from '../../util/applyMixins';\nimport type { FabricObjectProps } from './types/FabricObjectProps';\nimport type { TFabricObjectProps, SerializedObjectProps } from './types';\nimport { classRegistry } from '../../ClassRegistry';\n\n// TODO somehow we have to make a tree-shakeable import\n\n// eslint-disable-next-line @typescript-eslint/no-empty-object-type\nexport interface FabricObject<\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n Props extends TFabricObjectProps = Partial,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n SProps extends SerializedObjectProps = SerializedObjectProps,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n EventSpec extends ObjectEvents = ObjectEvents,\n> extends FabricObjectSVGExportMixin {}\n\n// eslint-disable-next-line @typescript-eslint/no-unsafe-declaration-merging\nexport class FabricObject<\n Props extends TFabricObjectProps = Partial,\n SProps extends SerializedObjectProps = SerializedObjectProps,\n EventSpec extends ObjectEvents = ObjectEvents,\n> extends InteractiveFabricObject {}\n\napplyMixins(FabricObject, [FabricObjectSVGExportMixin]);\n\nclassRegistry.setClass(FabricObject);\nclassRegistry.setClass(FabricObject, 'object');\n\nexport { cacheProperties } from './defaultValues';\n","/**\n * Returns true if context has transparent pixel\n * at specified location (taking tolerance into account)\n * @param {CanvasRenderingContext2D} ctx context\n * @param {Number} x x coordinate in canvasElementCoordinate, not fabric space. integer\n * @param {Number} y y coordinate in canvasElementCoordinate, not fabric space. integer\n * @param {Number} tolerance Tolerance pixels around the point, not alpha tolerance, integer\n * @return {boolean} true if transparent\n */\nexport const isTransparent = (\n ctx: CanvasRenderingContext2D,\n x: number,\n y: number,\n tolerance: number,\n): boolean => {\n tolerance = Math.round(tolerance);\n const size = tolerance * 2 + 1;\n const { data } = ctx.getImageData(x - tolerance, y - tolerance, size, size);\n\n // Split image data - for tolerance > 1, pixelDataSize = 4;\n for (let i = 3; i < data.length; i += 4) {\n const alphaChannel = data[i];\n if (alphaChannel > 0) {\n return false;\n }\n }\n return true;\n};\n","import type { XY } from '../../../Point';\nimport { Point } from '../../../Point';\nimport { degreesToRadians } from '../radiansDegreesConversion';\nimport { createVector } from '../vectors';\nimport type { TProjectStrokeOnPointsOptions, TProjection } from './types';\n\n/**\n * @see https://github.com/fabricjs/fabric.js/pull/8344\n * @todo consider removing skewing from points before calculating stroke projection,\n * see https://github.com/fabricjs/fabric.js/commit/494a10ee2f8c2278ae9a55b20bf50cf6ee25b064#commitcomment-94751537\n */\nexport abstract class StrokeProjectionsBase {\n declare options: TProjectStrokeOnPointsOptions;\n declare scale: Point;\n declare strokeUniformScalar: Point;\n declare strokeProjectionMagnitude: number;\n\n constructor(options: TProjectStrokeOnPointsOptions) {\n this.options = options;\n this.strokeProjectionMagnitude = this.options.strokeWidth / 2;\n this.scale = new Point(this.options.scaleX, this.options.scaleY);\n this.strokeUniformScalar = this.options.strokeUniform\n ? new Point(1 / this.options.scaleX, 1 / this.options.scaleY)\n : new Point(1, 1);\n }\n\n /**\n * When the stroke is uniform, scaling affects the arrangement of points. So we must take it into account.\n */\n protected createSideVector(from: XY, to: XY) {\n const v = createVector(from, to);\n return this.options.strokeUniform ? v.multiply(this.scale) : v;\n }\n\n protected abstract calcOrthogonalProjection(\n from: Point,\n to: Point,\n magnitude?: number,\n ): Point;\n\n protected projectOrthogonally(from: Point, to: Point, magnitude?: number) {\n return this.applySkew(\n from.add(this.calcOrthogonalProjection(from, to, magnitude)),\n );\n }\n\n protected isSkewed() {\n return this.options.skewX !== 0 || this.options.skewY !== 0;\n }\n\n protected applySkew(point: Point) {\n const p = new Point(point);\n // skewY must be applied before skewX as this distortion affects skewX calculation\n p.y += p.x * Math.tan(degreesToRadians(this.options.skewY));\n p.x += p.y * Math.tan(degreesToRadians(this.options.skewX));\n return p;\n }\n\n protected scaleUnitVector(unitVector: Point, scalar: number) {\n return unitVector.multiply(this.strokeUniformScalar).scalarMultiply(scalar);\n }\n\n protected abstract projectPoints(): Point[];\n\n public abstract project(): TProjection[];\n}\n","import type { XY } from '../../../Point';\nimport { Point } from '../../../Point';\nimport { halfPI, twoMathPi } from '../../../constants';\nimport type { TRadian } from '../../../typedefs';\nimport { degreesToRadians } from '../radiansDegreesConversion';\nimport {\n calcAngleBetweenVectors,\n calcVectorRotation,\n crossProduct,\n getOrthonormalVector,\n getUnitVector,\n isBetweenVectors,\n magnitude,\n rotateVector,\n} from '../vectors';\nimport { StrokeProjectionsBase } from './StrokeProjectionsBase';\nimport type { TProjection, TProjectStrokeOnPointsOptions } from './types';\n\nconst zeroVector = new Point();\n\n/**\n * class in charge of finding projections for each type of line join\n * @see {@link [Closed path projections at #8344](https://github.com/fabricjs/fabric.js/pull/8344#2-closed-path)}\n *\n * - MDN:\n * - https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/lineJoin\n * - https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/stroke-linejoin\n * - Spec: https://svgwg.org/svg2-draft/painting.html#StrokeLinejoinProperty\n * - Playground to understand how the line joins works: https://hypertolosana.github.io/efficient-webgl-stroking/index.html\n * - View the calculated projections for each of the control points: https://codesandbox.io/s/project-stroke-points-with-context-to-trace-b8jc4j?file=/src/index.js\n *\n */\nexport class StrokeLineJoinProjections extends StrokeProjectionsBase {\n /**\n * The point being projected (the angle ∠BAC)\n */\n declare A: Point;\n /**\n * The point before A\n */\n declare B: Point;\n /**\n * The point after A\n */\n declare C: Point;\n /**\n * The AB vector\n */\n AB: Point;\n /**\n * The AC vector\n */\n AC: Point;\n /**\n * The angle of A (∠BAC)\n */\n alpha: TRadian;\n /**\n * The bisector of A (∠BAC)\n */\n bisector: Point;\n\n static getOrthogonalRotationFactor(vector1: Point, vector2?: Point) {\n const angle = vector2\n ? calcAngleBetweenVectors(vector1, vector2)\n : calcVectorRotation(vector1);\n return Math.abs(angle) < halfPI ? -1 : 1;\n }\n\n constructor(A: XY, B: XY, C: XY, options: TProjectStrokeOnPointsOptions) {\n super(options);\n this.A = new Point(A);\n this.B = new Point(B);\n this.C = new Point(C);\n this.AB = this.createSideVector(this.A, this.B);\n this.AC = this.createSideVector(this.A, this.C);\n this.alpha = calcAngleBetweenVectors(this.AB, this.AC);\n this.bisector = getUnitVector(\n // if AC is also the zero vector nothing will be projected\n // in that case the next point will handle the projection\n rotateVector(this.AB.eq(zeroVector) ? this.AC : this.AB, this.alpha / 2),\n );\n }\n\n calcOrthogonalProjection(\n from: Point,\n to: Point,\n magnitude: number = this.strokeProjectionMagnitude,\n ) {\n const vector = this.createSideVector(from, to);\n const orthogonalProjection = getOrthonormalVector(vector);\n const correctSide = StrokeLineJoinProjections.getOrthogonalRotationFactor(\n orthogonalProjection,\n this.bisector,\n );\n return this.scaleUnitVector(orthogonalProjection, magnitude * correctSide);\n }\n\n /**\n * BEVEL\n * Calculation: the projection points are formed by the vector orthogonal to the vertex.\n *\n * @see https://github.com/fabricjs/fabric.js/pull/8344#2-2-bevel\n */\n projectBevel() {\n const projections: Point[] = [];\n // if `alpha` equals 0 or 2*PI, the projections are the same for `B` and `C`\n (this.alpha % twoMathPi === 0 ? [this.B] : [this.B, this.C]).forEach(\n (to) => {\n projections.push(this.projectOrthogonally(this.A, to));\n projections.push(\n this.projectOrthogonally(this.A, to, -this.strokeProjectionMagnitude),\n );\n },\n );\n return projections;\n }\n\n /**\n * MITER\n * Calculation: the corner is formed by extending the outer edges of the stroke\n * at the tangents of the path segments until they intersect.\n *\n * @see https://github.com/fabricjs/fabric.js/pull/8344#2-1-miter\n */\n projectMiter() {\n const projections: Point[] = [],\n alpha = Math.abs(this.alpha),\n hypotUnitScalar = 1 / Math.sin(alpha / 2),\n miterVector = this.scaleUnitVector(\n this.bisector,\n -this.strokeProjectionMagnitude * hypotUnitScalar,\n );\n\n // When two line segments meet at a sharp angle, it is possible for the join to extend,\n // far beyond the thickness of the line stroking the path. The stroke-miterlimit imposes\n // a limit on the extent of the line join.\n // MDN: https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/stroke-miterlimit\n // When the stroke is uniform, scaling changes the arrangement of points, this changes the miter-limit\n const strokeMiterLimit = this.options.strokeUniform\n ? magnitude(\n this.scaleUnitVector(this.bisector, this.options.strokeMiterLimit),\n )\n : this.options.strokeMiterLimit;\n\n if (\n magnitude(miterVector) / this.strokeProjectionMagnitude <=\n strokeMiterLimit\n ) {\n projections.push(this.applySkew(this.A.add(miterVector)));\n }\n /* when the miter-limit is reached, the stroke line join becomes of type bevel.\n We always need two orthogonal projections which are basically bevel-type projections,\n so regardless of whether the miter-limit was reached or not, we include these projections.\n */\n projections.push(...this.projectBevel());\n\n return projections;\n }\n\n /**\n * ROUND (without skew)\n * Calculation: the projections are the two vectors parallel to X and Y axes\n *\n * @see https://github.com/fabricjs/fabric.js/pull/8344#2-3-1-round-without-skew\n */\n private projectRoundNoSkew(startCircle: Point, endCircle: Point) {\n const projections: Point[] = [],\n // correctSide is used to only consider projecting for the outer side\n correctSide = new Point(\n StrokeLineJoinProjections.getOrthogonalRotationFactor(this.bisector),\n StrokeLineJoinProjections.getOrthogonalRotationFactor(\n new Point(this.bisector.y, this.bisector.x),\n ),\n ),\n radiusOnAxisX = new Point(1, 0)\n .scalarMultiply(this.strokeProjectionMagnitude)\n .multiply(this.strokeUniformScalar)\n .multiply(correctSide),\n radiusOnAxisY = new Point(0, 1)\n .scalarMultiply(this.strokeProjectionMagnitude)\n .multiply(this.strokeUniformScalar)\n .multiply(correctSide);\n\n [radiusOnAxisX, radiusOnAxisY].forEach((vector) => {\n if (isBetweenVectors(vector, startCircle, endCircle)) {\n projections.push(this.A.add(vector));\n }\n });\n return projections;\n }\n\n /**\n * ROUND (with skew)\n * Calculation: the projections are the points furthest from the vertex in\n * the direction of the X and Y axes after distortion.\n *\n * @see https://github.com/fabricjs/fabric.js/pull/8344#2-3-2-round-skew\n */\n private projectRoundWithSkew(startCircle: Point, endCircle: Point) {\n const projections: Point[] = [];\n\n const { skewX, skewY, scaleX, scaleY, strokeUniform } = this.options,\n shearing = new Point(\n Math.tan(degreesToRadians(skewX)),\n Math.tan(degreesToRadians(skewY)),\n );\n // The points furthest from the vertex in the direction of the X and Y axes after distortion\n const circleRadius = this.strokeProjectionMagnitude,\n newY = strokeUniform\n ? circleRadius /\n scaleY /\n Math.sqrt(1 / scaleY ** 2 + (1 / scaleX ** 2) * shearing.y ** 2)\n : circleRadius / Math.sqrt(1 + shearing.y ** 2),\n furthestY = new Point(\n // Safe guard due to floating point precision. In some situations the square root\n // was returning NaN because of a negative number close to zero.\n Math.sqrt(Math.max(circleRadius ** 2 - newY ** 2, 0)),\n newY,\n ),\n newX = strokeUniform\n ? circleRadius /\n Math.sqrt(\n 1 +\n (shearing.x ** 2 * (1 / scaleY) ** 2) /\n (1 / scaleX + (1 / scaleX) * shearing.x * shearing.y) ** 2,\n )\n : circleRadius /\n Math.sqrt(1 + shearing.x ** 2 / (1 + shearing.x * shearing.y) ** 2),\n furthestX = new Point(\n newX,\n Math.sqrt(Math.max(circleRadius ** 2 - newX ** 2, 0)),\n );\n\n [\n furthestX,\n furthestX.scalarMultiply(-1),\n furthestY,\n furthestY.scalarMultiply(-1),\n ]\n // We need to skew the vector here as this information is used to check if\n // it is between the start and end of the circle segment\n .map((vector) =>\n this.applySkew(\n strokeUniform ? vector.multiply(this.strokeUniformScalar) : vector,\n ),\n )\n .forEach((vector) => {\n if (isBetweenVectors(vector, startCircle, endCircle)) {\n projections.push(this.applySkew(this.A).add(vector));\n }\n });\n\n return projections;\n }\n\n projectRound() {\n const projections: Point[] = [];\n /* Include the start and end points of the circle segment, so that only\n the projections contained within it are included */\n // add the orthogonal projections (start and end points of circle segment)\n projections.push(...this.projectBevel());\n // let's determines which one of the orthogonal projection is the beginning and end of the circle segment.\n // when `alpha` equals 0 or 2*PI, we have a straight line, so the way to find the start/end is different.\n const isStraightLine = this.alpha % twoMathPi === 0,\n // change the origin of the projections to point A\n // so that the cross product calculation is correct\n newOrigin = this.applySkew(this.A),\n proj0 = projections[isStraightLine ? 0 : 2].subtract(newOrigin),\n proj1 = projections[isStraightLine ? 1 : 0].subtract(newOrigin),\n // when `isStraightLine` === true, we compare with the vector opposite AB, otherwise we compare with the bisector.\n comparisonVector = isStraightLine\n ? this.applySkew(this.AB.scalarMultiply(-1))\n : this.applySkew(\n this.bisector.multiply(this.strokeUniformScalar).scalarMultiply(-1),\n ),\n // the beginning of the circle segment is always to the right of the comparison vector (cross product > 0)\n isProj0Start = crossProduct(proj0, comparisonVector) > 0,\n startCircle = isProj0Start ? proj0 : proj1,\n endCircle = isProj0Start ? proj1 : proj0;\n if (!this.isSkewed()) {\n projections.push(...this.projectRoundNoSkew(startCircle, endCircle));\n } else {\n projections.push(...this.projectRoundWithSkew(startCircle, endCircle));\n }\n return projections;\n }\n\n /**\n * Project stroke width on points returning projections for each point as follows:\n * - `miter`: 1 point corresponding to the outer boundary. If the miter limit is exceeded, it will be 2 points (becomes bevel)\n * - `bevel`: 2 points corresponding to the bevel possible boundaries, orthogonal to the stroke.\n * - `round`: same as `bevel` when it has no skew, with skew are 4 points.\n */\n protected projectPoints() {\n switch (this.options.strokeLineJoin) {\n case 'miter':\n return this.projectMiter();\n case 'round':\n return this.projectRound();\n default:\n return this.projectBevel();\n }\n }\n\n public project(): TProjection[] {\n return this.projectPoints().map((point) => ({\n originPoint: this.A,\n projectedPoint: point,\n angle: this.alpha,\n bisector: this.bisector,\n }));\n }\n}\n","import type { XY } from '../../../Point';\nimport { Point } from '../../../Point';\nimport { getOrthonormalVector, getUnitVector } from '../vectors';\nimport { StrokeLineJoinProjections } from './StrokeLineJoinProjections';\nimport { StrokeProjectionsBase } from './StrokeProjectionsBase';\nimport type { TProjection, TProjectStrokeOnPointsOptions } from './types';\n\n/**\n * class in charge of finding projections for each type of line cap for start/end of an open path\n * @see {@link [Open path projections at #8344](https://github.com/fabricjs/fabric.js/pull/8344#1-open-path)}\n *\n * Reference:\n * - MDN:\n * - https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/lineCap\n * - https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/stroke-linecap\n * - Spec: https://html.spec.whatwg.org/multipage/canvas.html#dom-context-2d-linecap-dev\n * - Playground to understand how the line joins works: https://hypertolosana.github.io/efficient-webgl-stroking/index.html\n * - View the calculated projections for each of the control points: https://codesandbox.io/s/project-stroke-points-with-context-to-trace-b8jc4j?file=/src/index.js\n */\nexport class StrokeLineCapProjections extends StrokeProjectionsBase {\n /**\n * edge point\n */\n declare A: Point;\n /**\n * point next to edge point\n */\n declare T: Point;\n\n constructor(A: XY, T: XY, options: TProjectStrokeOnPointsOptions) {\n super(options);\n this.A = new Point(A);\n this.T = new Point(T);\n }\n\n calcOrthogonalProjection(\n from: Point,\n to: Point,\n magnitude: number = this.strokeProjectionMagnitude,\n ) {\n const vector = this.createSideVector(from, to);\n return this.scaleUnitVector(getOrthonormalVector(vector), magnitude);\n }\n\n /**\n * OPEN PATH START/END - Line cap: Butt\n * Calculation: to find the projections, just find the points orthogonal to the stroke\n *\n * @see https://github.com/fabricjs/fabric.js/pull/8344#1-1-butt\n */\n projectButt() {\n return [\n this.projectOrthogonally(this.A, this.T, this.strokeProjectionMagnitude),\n this.projectOrthogonally(this.A, this.T, -this.strokeProjectionMagnitude),\n ];\n }\n\n /**\n * OPEN PATH START/END - Line cap: Round\n * Calculation: same as stroke line join `round`\n *\n * @see https://github.com/fabricjs/fabric.js/pull/8344#1-2-round\n */\n projectRound() {\n const projections: Point[] = [];\n\n if (!this.isSkewed() && this.A.eq(this.T)) {\n /* 1 point case without `skew`\n When `strokeUniform` is true, scaling has no effect.\n So we divide by scale, to remove its effect.\n */\n const projection = new Point(1, 1)\n .scalarMultiply(this.strokeProjectionMagnitude)\n .multiply(this.strokeUniformScalar);\n projections.push(\n this.applySkew(this.A.add(projection)),\n this.applySkew(this.A.subtract(projection)),\n );\n } else {\n projections.push(\n ...new StrokeLineJoinProjections(\n this.A,\n this.T,\n this.T,\n this.options,\n ).projectRound(),\n );\n }\n\n return projections;\n }\n\n /**\n * OPEN PATH START/END - Line cap: Square\n * Calculation: project a rectangle of points on the stroke in the opposite direction of the vector `AT`\n *\n * @see https://github.com/fabricjs/fabric.js/pull/8344#1-3-square\n */\n projectSquare() {\n const projections: Point[] = [];\n\n if (this.A.eq(this.T)) {\n /* 1 point case without `skew`\n When `strokeUniform` is true, scaling has no effect.\n So we divide by scale, to remove its effect.\n */\n const projection = new Point(1, 1)\n .scalarMultiply(this.strokeProjectionMagnitude)\n .multiply(this.strokeUniformScalar);\n projections.push(this.A.add(projection), this.A.subtract(projection));\n } else {\n const orthogonalProjection = this.calcOrthogonalProjection(\n this.A,\n this.T,\n this.strokeProjectionMagnitude,\n );\n const strokePointingOut = this.scaleUnitVector(\n getUnitVector(this.createSideVector(this.A, this.T)),\n -this.strokeProjectionMagnitude,\n );\n const projectedA = this.A.add(strokePointingOut);\n projections.push(\n projectedA.add(orthogonalProjection),\n projectedA.subtract(orthogonalProjection),\n );\n }\n\n return projections.map((p) => this.applySkew(p));\n }\n\n protected projectPoints() {\n switch (this.options.strokeLineCap) {\n case 'round':\n return this.projectRound();\n case 'square':\n return this.projectSquare();\n default:\n return this.projectButt();\n }\n }\n\n public project(): TProjection[] {\n return this.projectPoints().map((point) => ({\n originPoint: this.A,\n projectedPoint: point,\n }));\n }\n}\n","import { Point, type XY } from '../../../Point';\nimport { findIndexRight } from '../../internals/findRight';\nimport { StrokeLineCapProjections } from './StrokeLineCapProjections';\nimport { StrokeLineJoinProjections } from './StrokeLineJoinProjections';\nimport type { TProjection, TProjectStrokeOnPointsOptions } from './types';\n\nexport type * from './types';\n\n/**\n *\n * Used to calculate object's bounding box\n *\n * @see https://github.com/fabricjs/fabric.js/pull/8344\n *\n */\nexport const projectStrokeOnPoints = (\n points: XY[],\n options: TProjectStrokeOnPointsOptions,\n openPath = false,\n): TProjection[] => {\n const projections: TProjection[] = [];\n\n if (points.length === 0) {\n return projections;\n }\n\n // first we remove duplicate neighboring points\n const reduced = points.reduce(\n (reduced, point) => {\n if (!reduced[reduced.length - 1].eq(point)) {\n reduced.push(new Point(point));\n }\n return reduced;\n },\n [new Point(points[0])],\n );\n\n if (reduced.length === 1) {\n openPath = true;\n } else if (!openPath) {\n // remove points from end in case they equal the first point\n // in order to correctly project the first point\n const start = reduced[0];\n const index = findIndexRight(reduced, (point) => !point.eq(start));\n reduced.splice(index + 1);\n }\n\n reduced.forEach((A, index, points) => {\n let B: XY, C: XY;\n if (index === 0) {\n C = points[1];\n B = openPath ? A : points[points.length - 1];\n } else if (index === points.length - 1) {\n B = points[index - 1];\n C = openPath ? A : points[0];\n } else {\n B = points[index - 1];\n C = points[index + 1];\n }\n\n if (openPath && points.length === 1) {\n projections.push(\n ...new StrokeLineCapProjections(A, A, options).project(),\n );\n } else if (openPath && (index === 0 || index === points.length - 1)) {\n projections.push(\n ...new StrokeLineCapProjections(\n A,\n index === 0 ? C : B,\n options,\n ).project(),\n );\n } else {\n projections.push(\n ...new StrokeLineJoinProjections(A, B, C, options).project(),\n );\n }\n });\n\n return projections;\n};\n","export const findIndexRight = (\n array: T[],\n predicate: (value: T, index: number, array: T[]) => boolean,\n) => {\n for (let index = array.length - 1; index >= 0; index--) {\n if (predicate(array[index], index, array)) {\n return index;\n }\n }\n return -1;\n};\n","import type { TextStyle } from '../../shapes/Text/StyledText';\n\nexport const cloneStyles = (style: TextStyle): TextStyle => {\n const newObj: TextStyle = {};\n Object.keys(style).forEach((key) => {\n newObj[key] = {};\n Object.keys(style[key]).forEach((keyInner) => {\n newObj[key][keyInner] = { ...style[key][keyInner] };\n });\n });\n return newObj;\n};\n","import { getFabricWindow } from '../env';\n\n/**\n * Capitalizes a string\n * @param {String} string String to capitalize\n * @param {Boolean} [firstLetterOnly] If true only first letter is capitalized\n * and other letters stay untouched, if false first letter is capitalized\n * and other letters are converted to lowercase.\n * @return {String} Capitalized version of a string\n */\nexport const capitalize = (string: string, firstLetterOnly = false): string =>\n `${string.charAt(0).toUpperCase()}${\n firstLetterOnly ? string.slice(1) : string.slice(1).toLowerCase()\n }`;\n\n/**\n * Escapes XML in a string\n * @param {String} string String to escape\n * @return {String} Escaped version of a string\n */\nexport const escapeXml = (string: string): string =>\n string\n .replace(/&/g, '&')\n .replace(/\"/g, '"')\n .replace(/'/g, ''')\n .replace(//g, '>');\n\nlet segmenter: Intl.Segmenter | false;\n\nconst getSegmenter = () => {\n if (!segmenter) {\n segmenter =\n 'Intl' in getFabricWindow() &&\n 'Segmenter' in Intl &&\n new Intl.Segmenter(undefined, {\n granularity: 'grapheme',\n });\n }\n return segmenter;\n};\n\n/**\n * Divide a string in the user perceived single units\n * @param {String} textstring String to escape\n * @return {Array} array containing the graphemes\n */\nexport const graphemeSplit = (textstring: string): string[] => {\n segmenter || getSegmenter();\n if (segmenter) {\n const segments = segmenter.segment(textstring);\n return Array.from(segments).map(({ segment }) => segment);\n }\n\n //Fallback\n return graphemeSplitImpl(textstring);\n};\n\nconst graphemeSplitImpl = (textstring: string): string[] => {\n const graphemes: string[] = [];\n for (let i = 0, chr; i < textstring.length; i++) {\n if ((chr = getWholeChar(textstring, i)) === false) {\n continue;\n }\n graphemes.push(chr);\n }\n return graphemes;\n};\n\n// taken from mdn in the charAt doc page.\nconst getWholeChar = (str: string, i: number): string | false => {\n const code = str.charCodeAt(i);\n if (isNaN(code)) {\n return ''; // Position not found\n }\n if (code < 0xd800 || code > 0xdfff) {\n return str.charAt(i);\n }\n\n // High surrogate (could change last hex to 0xDB7F to treat high private\n // surrogates as single characters)\n if (0xd800 <= code && code <= 0xdbff) {\n if (str.length <= i + 1) {\n throw 'High surrogate without following low surrogate';\n }\n const next = str.charCodeAt(i + 1);\n if (0xdc00 > next || next > 0xdfff) {\n throw 'High surrogate without following low surrogate';\n }\n return str.charAt(i) + str.charAt(i + 1);\n }\n // Low surrogate (0xDC00 <= code && code <= 0xDFFF)\n if (i === 0) {\n throw 'Low surrogate without preceding high surrogate';\n }\n const prev = str.charCodeAt(i - 1);\n\n // (could change last hex to 0xDB7F to treat high private\n // surrogates as single characters)\n if (0xd800 > prev || prev > 0xdbff) {\n throw 'Low surrogate without preceding high surrogate';\n }\n // We can pass over low surrogates now as the second component\n // in a pair which we have already processed\n return false;\n};\n","import { reNewline } from '../../constants';\nimport type {\n TextStyle,\n TextStyleDeclaration,\n} from '../../shapes/Text/StyledText';\nimport { cloneStyles } from '../internals/cloneStyles';\nimport { graphemeSplit } from '../lang_string';\n\nexport type TextStyleArray = {\n start: number;\n end: number;\n style: TextStyleDeclaration;\n}[];\n\n/**\n * @param {Object} prevStyle first style to compare\n * @param {Object} thisStyle second style to compare\n * @param {boolean} forTextSpans whether to check overline, underline, and line-through properties\n * @return {boolean} true if the style changed\n */\nexport const hasStyleChanged = (\n prevStyle: TextStyleDeclaration,\n thisStyle: TextStyleDeclaration,\n forTextSpans = false,\n) =>\n prevStyle.fill !== thisStyle.fill ||\n prevStyle.stroke !== thisStyle.stroke ||\n prevStyle.strokeWidth !== thisStyle.strokeWidth ||\n prevStyle.fontSize !== thisStyle.fontSize ||\n prevStyle.fontFamily !== thisStyle.fontFamily ||\n prevStyle.fontWeight !== thisStyle.fontWeight ||\n prevStyle.fontStyle !== thisStyle.fontStyle ||\n prevStyle.textDecorationThickness !== thisStyle.textDecorationThickness ||\n prevStyle.textBackgroundColor !== thisStyle.textBackgroundColor ||\n prevStyle.deltaY !== thisStyle.deltaY ||\n (forTextSpans &&\n (prevStyle.overline !== thisStyle.overline ||\n prevStyle.underline !== thisStyle.underline ||\n prevStyle.linethrough !== thisStyle.linethrough));\n\n/**\n * Returns the array form of a text object's inline styles property with styles grouped in ranges\n * rather than per character. This format is less verbose, and is better suited for storage\n * so it is used in serialization (not during runtime).\n * @param {object} styles per character styles for a text object\n * @param {String} text the text string that the styles are applied to\n * @return {{start: number, end: number, style: object}[]}\n */\nexport const stylesToArray = (\n styles: TextStyle,\n text: string,\n): TextStyleArray => {\n const textLines = text.split('\\n'),\n stylesArray = [];\n let charIndex = -1,\n prevStyle = {};\n // clone style structure to prevent mutation\n styles = cloneStyles(styles);\n\n //loop through each textLine\n for (let i = 0; i < textLines.length; i++) {\n const chars = graphemeSplit(textLines[i]);\n if (!styles[i]) {\n //no styles exist for this line, so add the line's length to the charIndex total and reset prevStyle\n charIndex += chars.length;\n prevStyle = {};\n continue;\n }\n //loop through each character of the current line\n for (let c = 0; c < chars.length; c++) {\n charIndex++;\n const thisStyle = styles[i][c];\n //check if style exists for this character\n if (thisStyle && Object.keys(thisStyle).length > 0) {\n if (hasStyleChanged(prevStyle, thisStyle, true)) {\n stylesArray.push({\n start: charIndex,\n end: charIndex + 1,\n style: thisStyle,\n });\n } else {\n //if style is the same as previous character, increase end index\n stylesArray[stylesArray.length - 1].end++;\n }\n }\n prevStyle = thisStyle || {};\n }\n }\n return stylesArray;\n};\n\n/**\n * Returns the object form of the styles property with styles that are assigned per\n * character rather than grouped by range. This format is more verbose, and is\n * only used during runtime (not for serialization/storage)\n * @param {Array} styles the serialized form of a text object's styles\n * @param {String} text the text string that the styles are applied to\n * @return {Object}\n */\nexport const stylesFromArray = (\n styles: TextStyleArray | TextStyle,\n text: string,\n): TextStyle => {\n if (!Array.isArray(styles)) {\n // clone to prevent mutation\n return cloneStyles(styles);\n }\n const textLines = text.split(reNewline),\n stylesObject: TextStyle = {};\n let charIndex = -1,\n styleIndex = 0;\n //loop through each textLine\n for (let i = 0; i < textLines.length; i++) {\n const chars = graphemeSplit(textLines[i]);\n\n //loop through each character of the current line\n for (let c = 0; c < chars.length; c++) {\n charIndex++;\n //check if there's a style collection that includes the current character\n if (\n styles[styleIndex] &&\n styles[styleIndex].start <= charIndex &&\n charIndex < styles[styleIndex].end\n ) {\n //create object for line index if it doesn't exist\n stylesObject[i] = stylesObject[i] || {};\n //assign a style at this character's index\n stylesObject[i][c] = { ...styles[styleIndex].style };\n //if character is at the end of the current style collection, move to the next\n if (charIndex === styles[styleIndex].end - 1) {\n styleIndex++;\n }\n }\n }\n }\n return stylesObject;\n};\n","import { FILL, STROKE } from '../constants';\n\n/**\n * Attributes parsed from all SVG elements\n * @type array\n */\nexport const SHARED_ATTRIBUTES = [\n 'display',\n 'transform',\n FILL,\n 'fill-opacity',\n 'fill-rule',\n 'opacity',\n STROKE,\n 'stroke-dasharray',\n 'stroke-linecap',\n 'stroke-dashoffset',\n 'stroke-linejoin',\n 'stroke-miterlimit',\n 'stroke-opacity',\n 'stroke-width',\n 'id',\n 'paint-order',\n 'vector-effect',\n 'instantiated_by_use',\n 'clip-path',\n];\n","export function selectorMatches(\n element: HTMLElement | SVGElement,\n selector: string,\n) {\n const nodeName = element.nodeName;\n const classNames = element.getAttribute('class');\n const id = element.getAttribute('id');\n const azAz = '(?![a-zA-Z\\\\-]+)';\n let matcher;\n // i check if a selector matches slicing away part from it.\n // if i get empty string i should match\n matcher = new RegExp('^' + nodeName, 'i');\n selector = selector.replace(matcher, '');\n if (id && selector.length) {\n matcher = new RegExp('#' + id + azAz, 'i');\n selector = selector.replace(matcher, '');\n }\n if (classNames && selector.length) {\n const splitClassNames = classNames.split(' ');\n for (let i = splitClassNames.length; i--; ) {\n matcher = new RegExp('\\\\.' + splitClassNames[i] + azAz, 'i');\n selector = selector.replace(matcher, '');\n }\n }\n return selector.length === 0;\n}\n","import { selectorMatches } from './selectorMatches';\nimport { doesSomeParentMatch } from './doesSomeParentMatch';\n\n/**\n * @private\n */\n\nexport function elementMatchesRule(\n element: HTMLElement | SVGElement,\n selectors: string[],\n) {\n let parentMatching = true;\n // start from rightmost selector.\n const firstMatching = selectorMatches(element, selectors.pop()!);\n if (firstMatching && selectors.length) {\n parentMatching = doesSomeParentMatch(element, selectors);\n }\n return firstMatching && parentMatching && selectors.length === 0;\n}\n","import { selectorMatches } from './selectorMatches';\n\nexport function doesSomeParentMatch(\n element: HTMLElement | SVGElement,\n selectors: string[],\n) {\n let selector: string,\n parentMatching = true;\n while (\n element.parentElement &&\n element.parentElement.nodeType === 1 &&\n selectors.length\n ) {\n if (parentMatching) {\n selector = selectors.pop()!;\n }\n element = element.parentElement;\n parentMatching = selectorMatches(element, selector!);\n }\n return selectors.length === 0;\n}\n","import { elementMatchesRule } from './elementMatchesRule';\nimport type { CSSRules } from './typedefs';\n\n/**\n * @private\n */\n\nexport function getGlobalStylesForElement(\n element: HTMLElement | SVGElement,\n cssRules: CSSRules = {},\n) {\n let styles: Record = {};\n for (const rule in cssRules) {\n if (elementMatchesRule(element, rule.split(' '))) {\n styles = {\n ...styles,\n ...cssRules[rule],\n };\n }\n }\n return styles;\n}\n","import { attributesMap } from './constants';\n\nexport const normalizeAttr = (\n attr: keyof typeof attributesMap | string,\n): string => attributesMap[attr as keyof typeof attributesMap] ?? attr;\n","import { reNum } from '../../parser/constants';\n\nconst regex = new RegExp(`(${reNum})`, 'gi');\n\nexport const cleanupSvgAttribute = (attributeValue: string) =>\n attributeValue\n .replace(regex, ' $1 ')\n // replace annoying commas and arbitrary whitespace with single spaces\n .replace(/,/gi, ' ')\n .replace(/\\s+/gi, ' ');\n","import { ROTATE, SCALE, SKEW_X, SKEW_Y, iMatrix } from '../constants';\nimport { reNum } from './constants';\nimport type { TMat2D } from '../typedefs';\nimport { cleanupSvgAttribute } from '../util/internals/cleanupSvgAttribute';\nimport {\n createRotateMatrix,\n createScaleMatrix,\n createSkewXMatrix,\n createSkewYMatrix,\n createTranslateMatrix,\n multiplyTransformMatrixArray,\n} from '../util/misc/matrix';\n\n// == begin transform regexp\nconst p = `(${reNum})`;\nconst skewX = String.raw`(skewX)\\(${p}\\)`;\nconst skewY = String.raw`(skewY)\\(${p}\\)`;\nconst rotate = String.raw`(rotate)\\(${p}(?: ${p} ${p})?\\)`;\nconst scale = String.raw`(scale)\\(${p}(?: ${p})?\\)`;\nconst translate = String.raw`(translate)\\(${p}(?: ${p})?\\)`;\nconst matrix = String.raw`(matrix)\\(${p} ${p} ${p} ${p} ${p} ${p}\\)`;\nconst transform = `(?:${matrix}|${translate}|${rotate}|${scale}|${skewX}|${skewY})`;\nconst transforms = `(?:${transform}*)`;\nconst transformList = String.raw`^\\s*(?:${transforms}?)\\s*$`;\n// http://www.w3.org/TR/SVG/coords.html#TransformAttribute\nconst reTransformList = new RegExp(transformList);\nconst reTransform = new RegExp(transform);\nconst reTransformAll = new RegExp(transform, 'g');\n// == end transform regexp\n\n/**\n * Parses \"transform\" attribute, returning an array of values\n * @param {String} attributeValue String containing attribute value\n * @return {TTransformMatrix} Array of 6 elements representing transformation matrix\n */\nexport function parseTransformAttribute(attributeValue: string): TMat2D {\n // first we clean the string\n attributeValue = cleanupSvgAttribute(attributeValue)\n // remove spaces around front parentheses\n .replace(/\\s*([()])\\s*/gi, '$1');\n\n // start with identity matrix\n const matrices: TMat2D[] = [];\n\n // return if no argument was given or\n // an argument does not match transform attribute regexp\n if (\n !attributeValue ||\n (attributeValue && !reTransformList.test(attributeValue))\n ) {\n return [...iMatrix];\n }\n\n for (const match of attributeValue.matchAll(reTransformAll)) {\n const transformMatch = reTransform.exec(match[0]);\n if (!transformMatch) {\n continue;\n }\n let matrix: TMat2D = iMatrix;\n const matchedParams = transformMatch.filter((m) => !!m);\n const [, operation, ...rawArgs] = matchedParams;\n const [arg0, arg1, arg2, arg3, arg4, arg5] = rawArgs.map((arg) =>\n parseFloat(arg),\n );\n\n switch (operation) {\n case 'translate':\n matrix = createTranslateMatrix(arg0, arg1);\n break;\n case ROTATE:\n matrix = createRotateMatrix({ angle: arg0 }, { x: arg1, y: arg2 });\n break;\n case SCALE:\n matrix = createScaleMatrix(arg0, arg1);\n break;\n case SKEW_X:\n matrix = createSkewXMatrix(arg0);\n break;\n case SKEW_Y:\n matrix = createSkewYMatrix(arg0);\n break;\n case 'matrix':\n matrix = [arg0, arg1, arg2, arg3, arg4, arg5];\n break;\n }\n\n // snapshot current matrix into matrices array\n matrices.push(matrix);\n }\n\n return multiplyTransformMatrixArray(matrices);\n}\n","import { multiplyTransformMatrices } from '../util/misc/matrix';\nimport { parseUnit } from '../util/misc/svgParsing';\nimport { parseTransformAttribute } from './parseTransformAttribute';\nimport { CENTER, LEFT, RIGHT, NONE, FILL, STROKE } from '../constants';\nimport { TEXT_DECORATION_THICKNESS } from '../shapes/Text/constants';\n\nexport function normalizeValue(\n attr: string,\n value: any,\n parentAttributes: Record,\n fontSize: number,\n): string | null | boolean | number[] | number {\n const isArray = Array.isArray(value);\n let parsed: number | number[];\n let ouputValue: string | null | boolean | number[] | number = value;\n if ((attr === FILL || attr === STROKE) && value === NONE) {\n ouputValue = '';\n } else if (attr === 'strokeUniform') {\n return value === 'non-scaling-stroke';\n } else if (attr === 'strokeDashArray') {\n if (value === NONE) {\n ouputValue = null;\n } else {\n ouputValue = value.replace(/,/g, ' ').split(/\\s+/).map(parseFloat);\n }\n } else if (attr === 'transformMatrix') {\n if (parentAttributes && parentAttributes.transformMatrix) {\n ouputValue = multiplyTransformMatrices(\n parentAttributes.transformMatrix,\n parseTransformAttribute(value),\n );\n } else {\n ouputValue = parseTransformAttribute(value);\n }\n } else if (attr === 'visible') {\n ouputValue = value !== NONE && value !== 'hidden';\n // display=none on parent element always takes precedence over child element\n if (parentAttributes && parentAttributes.visible === false) {\n ouputValue = false;\n }\n } else if (attr === 'opacity') {\n ouputValue = parseFloat(value);\n if (parentAttributes && typeof parentAttributes.opacity !== 'undefined') {\n ouputValue *= parentAttributes.opacity as number;\n }\n } else if (attr === 'textAnchor' /* text-anchor */) {\n ouputValue = value === 'start' ? LEFT : value === 'end' ? RIGHT : CENTER;\n } else if (attr === 'charSpacing' || attr === TEXT_DECORATION_THICKNESS) {\n // parseUnit returns px and we convert it to em\n parsed = (parseUnit(value, fontSize) / fontSize) * 1000;\n } else if (attr === 'paintFirst') {\n const fillIndex = value.indexOf(FILL);\n const strokeIndex = value.indexOf(STROKE);\n ouputValue = FILL;\n if (fillIndex > -1 && strokeIndex > -1 && strokeIndex < fillIndex) {\n ouputValue = STROKE;\n } else if (fillIndex === -1 && strokeIndex > -1) {\n ouputValue = STROKE;\n }\n } else if (\n attr === 'href' ||\n attr === 'xlink:href' ||\n attr === 'font' ||\n attr === 'id'\n ) {\n return value;\n } else if (attr === 'imageSmoothing') {\n return value === 'optimizeQuality';\n } else {\n parsed = isArray\n ? (value as string[]).map(parseUnit)\n : parseUnit(value, fontSize);\n }\n\n return !isArray && isNaN(parsed! as number) ? ouputValue : parsed!;\n}\n","/**\n * Takes a style string and parses it in one that has only defined values\n * and lowercases properties\n * @param style\n * @param oStyle\n */\nexport function parseStyleString(\n style: string,\n oStyle: Record,\n): void {\n style\n .replace(/;\\s*$/, '')\n .split(';')\n .forEach((chunk) => {\n if (!chunk) return;\n const [attr, value] = chunk.split(':');\n oStyle[attr.trim().toLowerCase()] = value.trim();\n });\n}\n","import { parseStyleObject } from './parseStyleObject';\nimport { parseStyleString } from './parseStyleString';\n\n/**\n * Parses \"style\" attribute, retuning an object with values\n * @param {SVGElement} element Element to parse\n * @return {Object} Objects with values parsed from style attribute of an element\n */\nexport function parseStyleAttribute(\n element: HTMLElement | SVGElement,\n): Record {\n const oStyle: Record = {},\n style = element.getAttribute('style');\n\n if (!style) {\n return oStyle;\n }\n\n if (typeof style === 'string') {\n parseStyleString(style, oStyle);\n } else {\n parseStyleObject(style, oStyle);\n }\n\n return oStyle;\n}\n","/**\n * Takes a style object and parses it in one that has only defined values\n * and lowercases properties\n * @param style\n * @param oStyle\n */\nexport function parseStyleObject(\n style: Record,\n oStyle: Record,\n): void {\n Object.entries(style).forEach(([prop, value]) => {\n if (value === undefined) {\n return;\n }\n oStyle[prop.toLowerCase()] = value;\n });\n}\n","import { Color } from '../color/Color';\nimport { toFixed } from '../util/misc/toFixed';\nimport { FabricObject } from '../shapes/Object/FabricObject';\n\nconst colorAttributesMap = {\n stroke: 'strokeOpacity',\n fill: 'fillOpacity',\n};\n\n/**\n * @private\n * @param {Object} attributes Array of attributes to parse\n */\n\nexport function setStrokeFillOpacity(\n attributes: Record,\n): Record {\n const defaults = FabricObject.getDefaults();\n Object.entries(colorAttributesMap).forEach(([attr, colorAttr]) => {\n if (\n typeof attributes[colorAttr] === 'undefined' ||\n attributes[attr] === ''\n ) {\n return;\n }\n if (typeof attributes[attr] === 'undefined') {\n if (!defaults[attr]) {\n return;\n }\n attributes[attr] = defaults[attr];\n }\n if (attributes[attr].indexOf('url(') === 0) {\n return;\n }\n const color = new Color(attributes[attr]);\n attributes[attr] = color\n .setAlpha(toFixed(color.getAlpha() * attributes[colorAttr], 2))\n .toRgba();\n });\n return attributes;\n}\n","import { DEFAULT_SVG_FONT_SIZE } from '../constants';\nimport { parseUnit } from '../util/misc/svgParsing';\nimport { cPath, fSize, svgValidParentsRegEx } from './constants';\nimport { getGlobalStylesForElement } from './getGlobalStylesForElement';\nimport { normalizeAttr } from './normalizeAttr';\nimport { normalizeValue } from './normalizeValue';\nimport { parseFontDeclaration } from './parseFontDeclaration';\nimport { parseStyleAttribute } from './parseStyleAttribute';\nimport { setStrokeFillOpacity } from './setStrokeFillOpacity';\nimport type { CSSRules } from './typedefs';\n\n/**\n * Returns an object of attributes' name/value, given element and an array of attribute names;\n * Parses parent \"g\" nodes recursively upwards.\n * @param {SVGElement | HTMLElement} element Element to parse\n * @param {Array} attributes Array of attributes to parse\n * @return {Object} object containing parsed attributes' names/values\n */\nexport function parseAttributes(\n element: HTMLElement | SVGElement | null,\n attributes: string[],\n cssRules?: CSSRules,\n): Record {\n if (!element) {\n return {};\n }\n\n let parentAttributes: Record = {},\n fontSize: number,\n parentFontSize = DEFAULT_SVG_FONT_SIZE;\n\n // if there's a parent container (`g` or `a` or `symbol` node), parse its attributes recursively upwards\n if (\n element.parentNode &&\n svgValidParentsRegEx.test(element.parentNode.nodeName)\n ) {\n parentAttributes = parseAttributes(\n element.parentElement,\n attributes,\n cssRules,\n );\n if (parentAttributes.fontSize) {\n fontSize = parentFontSize = parseUnit(parentAttributes.fontSize);\n }\n }\n\n const ownAttributes: Record = {\n ...attributes.reduce>((memo, attr) => {\n const value = element.getAttribute(attr);\n if (value) {\n memo[attr] = value;\n }\n return memo;\n }, {}),\n // add values parsed from style, which take precedence over attributes\n // (see: http://www.w3.org/TR/SVG/styling.html#UsingPresentationAttributes)\n ...getGlobalStylesForElement(element, cssRules),\n ...parseStyleAttribute(element),\n };\n\n if (ownAttributes[cPath]) {\n element.setAttribute(cPath, ownAttributes[cPath]);\n }\n if (ownAttributes[fSize]) {\n // looks like the minimum should be 9px when dealing with ems. this is what looks like in browsers.\n fontSize = parseUnit(ownAttributes[fSize], parentFontSize);\n ownAttributes[fSize] = `${fontSize}`;\n }\n\n // this should have its own complex type\n const normalizedStyle: Record<\n string,\n string | boolean | number | number[] | null\n > = {};\n for (const attr in ownAttributes) {\n const normalizedAttr = normalizeAttr(attr);\n const normalizedValue = normalizeValue(\n normalizedAttr,\n ownAttributes[attr],\n parentAttributes,\n fontSize!,\n );\n normalizedStyle[normalizedAttr] = normalizedValue;\n }\n if (normalizedStyle && normalizedStyle.font) {\n parseFontDeclaration(normalizedStyle.font as string, normalizedStyle);\n }\n const mergedAttrs = { ...parentAttributes, ...normalizedStyle };\n return svgValidParentsRegEx.test(element.nodeName)\n ? mergedAttrs\n : setStrokeFillOpacity(mergedAttrs);\n}\n","import { parseUnit } from '../util/misc/svgParsing';\nimport { reFontDeclaration } from './constants';\n\n/**\n * Parses a short font declaration, building adding its properties to a style object\n * @param {String} value font declaration\n * @param {Object} oStyle definition\n */\nexport function parseFontDeclaration(\n value: string,\n oStyle: Record,\n): void {\n const match = value.match(reFontDeclaration);\n\n if (!match) {\n return;\n }\n const fontStyle = match[1],\n // font variant is not used\n // fontVariant = match[2],\n fontWeight = match[3],\n fontSize = match[4],\n lineHeight = match[5],\n fontFamily = match[6];\n\n if (fontStyle) {\n oStyle.fontStyle = fontStyle;\n }\n if (fontWeight) {\n oStyle.fontWeight = isNaN(parseFloat(fontWeight))\n ? fontWeight\n : parseFloat(fontWeight);\n }\n if (fontSize) {\n oStyle.fontSize = parseUnit(fontSize);\n }\n if (fontFamily) {\n oStyle.fontFamily = fontFamily;\n }\n if (lineHeight) {\n oStyle.lineHeight = lineHeight === 'normal' ? 1 : lineHeight;\n }\n}\n","import { kRect } from '../constants';\nimport { SHARED_ATTRIBUTES } from '../parser/attributes';\nimport { parseAttributes } from '../parser/parseAttributes';\nimport type { Abortable, TClassProperties, TOptions } from '../typedefs';\nimport { classRegistry } from '../ClassRegistry';\nimport { FabricObject, cacheProperties } from './Object/FabricObject';\nimport type { FabricObjectProps, SerializedObjectProps } from './Object/types';\nimport type { ObjectEvents } from '../EventTypeDefs';\nimport type { CSSRules } from '../parser/typedefs';\n\nexport const rectDefaultValues: Partial> = {\n rx: 0,\n ry: 0,\n};\n\ninterface UniqueRectProps {\n rx: number;\n ry: number;\n}\n\nexport interface SerializedRectProps\n extends SerializedObjectProps,\n UniqueRectProps {}\n\nexport interface RectProps extends FabricObjectProps, UniqueRectProps {}\n\nconst RECT_PROPS = ['rx', 'ry'] as const;\n\nexport class Rect<\n Props extends TOptions = Partial,\n SProps extends SerializedRectProps = SerializedRectProps,\n EventSpec extends ObjectEvents = ObjectEvents,\n >\n extends FabricObject\n implements RectProps\n{\n /**\n * Horizontal border radius\n * @type Number\n */\n declare rx: number;\n\n /**\n * Vertical border radius\n * @type Number\n */\n declare ry: number;\n\n static type = 'Rect';\n\n static cacheProperties = [...cacheProperties, ...RECT_PROPS];\n\n static ownDefaults = rectDefaultValues;\n\n static getDefaults(): Record {\n return {\n ...super.getDefaults(),\n ...Rect.ownDefaults,\n };\n }\n\n /**\n * Constructor\n * @param {Object} [options] Options object\n */\n constructor(options?: Props) {\n super();\n Object.assign(this, Rect.ownDefaults);\n this.setOptions(options);\n this._initRxRy();\n }\n /**\n * Initializes rx/ry attributes\n * @private\n */\n _initRxRy() {\n const { rx, ry } = this;\n if (rx && !ry) {\n this.ry = rx;\n } else if (ry && !rx) {\n this.rx = ry;\n }\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _render(ctx: CanvasRenderingContext2D) {\n const { width: w, height: h } = this;\n const x = -w / 2;\n const y = -h / 2;\n const rx = this.rx ? Math.min(this.rx, w / 2) : 0;\n const ry = this.ry ? Math.min(this.ry, h / 2) : 0;\n const isRounded = rx !== 0 || ry !== 0;\n\n ctx.beginPath();\n\n ctx.moveTo(x + rx, y);\n\n ctx.lineTo(x + w - rx, y);\n isRounded &&\n ctx.bezierCurveTo(\n x + w - kRect * rx,\n y,\n x + w,\n y + kRect * ry,\n x + w,\n y + ry,\n );\n\n ctx.lineTo(x + w, y + h - ry);\n isRounded &&\n ctx.bezierCurveTo(\n x + w,\n y + h - kRect * ry,\n x + w - kRect * rx,\n y + h,\n x + w - rx,\n y + h,\n );\n\n ctx.lineTo(x + rx, y + h);\n isRounded &&\n ctx.bezierCurveTo(\n x + kRect * rx,\n y + h,\n x,\n y + h - kRect * ry,\n x,\n y + h - ry,\n );\n\n ctx.lineTo(x, y + ry);\n isRounded &&\n ctx.bezierCurveTo(x, y + kRect * ry, x + kRect * rx, y, x + rx, y);\n\n ctx.closePath();\n\n this._renderPaintInOrder(ctx);\n }\n\n /**\n * Returns object representation of an instance\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} object representation of an instance\n */\n toObject<\n T extends Omit, keyof SProps>,\n K extends keyof T = never,\n >(propertiesToInclude: K[] = []): Pick & SProps {\n return super.toObject([...RECT_PROPS, ...propertiesToInclude]);\n }\n\n /**\n * Returns svg representation of an instance\n * @return {Array} an array of strings with the specific svg representation\n * of the instance\n */\n _toSVG() {\n const { width, height, rx, ry } = this;\n return [\n '\\n`,\n ];\n }\n\n /**\n * List of attribute names to account for when parsing SVG element (used by `Rect.fromElement`)\n * @see: http://www.w3.org/TR/SVG/shapes.html#RectElement\n */\n static ATTRIBUTE_NAMES = [\n ...SHARED_ATTRIBUTES,\n 'x',\n 'y',\n 'rx',\n 'ry',\n 'width',\n 'height',\n ];\n\n /* _FROM_SVG_START_ */\n\n /**\n * Returns {@link Rect} instance from an SVG element\n * @param {HTMLElement} element Element to parse\n * @param {Object} [options] Options object\n */\n static async fromElement(\n element: HTMLElement | SVGElement,\n options?: Abortable,\n cssRules?: CSSRules,\n ) {\n const {\n left = 0,\n top = 0,\n width = 0,\n height = 0,\n visible = true,\n ...restOfparsedAttributes\n } = parseAttributes(element, this.ATTRIBUTE_NAMES, cssRules);\n\n return new this({\n ...options,\n ...restOfparsedAttributes,\n left,\n top,\n width,\n height,\n visible: Boolean(visible && width && height),\n });\n }\n\n /* _FROM_SVG_END_ */\n}\n\nclassRegistry.setClass(Rect);\nclassRegistry.setSVGClass(Rect);\n","export const LAYOUT_TYPE_INITIALIZATION = 'initialization';\nexport const LAYOUT_TYPE_ADDED = 'added';\nexport const LAYOUT_TYPE_REMOVED = 'removed';\nexport const LAYOUT_TYPE_IMPERATIVE = 'imperative';\nexport const LAYOUT_TYPE_OBJECT_MODIFIED = 'object_modified';\nexport const LAYOUT_TYPE_OBJECT_MODIFYING = 'object_modifying';\n","import { Point, ZERO } from '../../Point';\nimport type { Group } from '../../shapes/Group';\nimport type { FabricObject } from '../../shapes/Object/FabricObject';\nimport { multiplyTransformMatrixArray } from '../../util/misc/matrix';\nimport { sizeAfterTransform } from '../../util/misc/objectTransforms';\nimport {\n calcPlaneChangeMatrix,\n sendVectorToPlane,\n} from '../../util/misc/planeChange';\n\n/**\n * @returns 2 points, the tl and br corners of the non rotated bounding box of an object\n * in the {@link group} plane, taking into account objects that {@link group} is their parent\n * but also belong to the active selection.\n */\nexport const getObjectBounds = (\n destinationGroup: Group,\n object: FabricObject,\n): Point[] => {\n const {\n strokeUniform,\n strokeWidth,\n width,\n height,\n group: currentGroup,\n } = object;\n const t =\n currentGroup && currentGroup !== destinationGroup\n ? calcPlaneChangeMatrix(\n currentGroup.calcTransformMatrix(),\n destinationGroup.calcTransformMatrix(),\n )\n : null;\n const objectCenter = t\n ? object.getRelativeCenterPoint().transform(t)\n : object.getRelativeCenterPoint();\n const accountForStroke = !object['isStrokeAccountedForInDimensions']();\n const strokeUniformVector =\n strokeUniform && accountForStroke\n ? sendVectorToPlane(\n new Point(strokeWidth, strokeWidth),\n undefined,\n destinationGroup.calcTransformMatrix(),\n )\n : ZERO;\n const scalingStrokeWidth =\n !strokeUniform && accountForStroke ? strokeWidth : 0;\n const sizeVector = sizeAfterTransform(\n width + scalingStrokeWidth,\n height + scalingStrokeWidth,\n multiplyTransformMatrixArray([t, object.calcOwnMatrix()], true),\n )\n .add(strokeUniformVector)\n .scalarDivide(2);\n return [objectCenter.subtract(sizeVector), objectCenter.add(sizeVector)];\n};\n","import { Point } from '../../Point';\nimport type { FabricObject } from '../../shapes/Object/FabricObject';\nimport { makeBoundingBoxFromPoints } from '../../util/misc/boundingBoxFromPoints';\nimport {\n LAYOUT_TYPE_INITIALIZATION,\n LAYOUT_TYPE_IMPERATIVE,\n} from '../constants';\nimport type {\n InitializationLayoutContext,\n LayoutStrategyResult,\n StrictLayoutContext,\n} from '../types';\nimport { getObjectBounds } from './utils';\n\n/**\n * Exposes a main public method {@link calcLayoutResult} that is used by the `LayoutManager` to perform layout.\n * Returning `undefined` signals the `LayoutManager` to skip the layout.\n *\n * In charge of calculating the bounding box of the passed objects.\n */\nexport abstract class LayoutStrategy {\n /**\n * override by subclass for persistence (TS does not support `static abstract`)\n */\n static type = 'strategy';\n\n /**\n * Used by the `LayoutManager` to perform layout\n * @TODO/fix: if this method is calcResult, should calc unconditionally.\n * the condition to not calc should be evaluated by the layoutManager.\n * @returns layout result **OR** `undefined` to skip layout\n */\n public calcLayoutResult(\n context: StrictLayoutContext,\n objects: FabricObject[],\n ): LayoutStrategyResult | undefined {\n if (this.shouldPerformLayout(context)) {\n return this.calcBoundingBox(objects, context);\n }\n }\n\n shouldPerformLayout({ type, prevStrategy, strategy }: StrictLayoutContext) {\n return (\n type === LAYOUT_TYPE_INITIALIZATION ||\n type === LAYOUT_TYPE_IMPERATIVE ||\n (!!prevStrategy && strategy !== prevStrategy)\n );\n }\n\n shouldLayoutClipPath({ type, target: { clipPath } }: StrictLayoutContext) {\n return (\n type !== LAYOUT_TYPE_INITIALIZATION &&\n clipPath &&\n !clipPath.absolutePositioned\n );\n }\n\n getInitialSize(\n context: StrictLayoutContext & InitializationLayoutContext,\n result: Pick,\n ) {\n return result.size;\n }\n\n /**\n * Override this method to customize layout.\n */\n calcBoundingBox(\n objects: FabricObject[],\n context: StrictLayoutContext,\n ): LayoutStrategyResult | undefined {\n const { type, target } = context;\n if (type === LAYOUT_TYPE_IMPERATIVE && context.overrides) {\n return context.overrides;\n }\n if (objects.length === 0) {\n return;\n }\n const { left, top, width, height } = makeBoundingBoxFromPoints(\n objects\n .map((object) => getObjectBounds(target, object))\n .reduce((coords, curr) => coords.concat(curr), []),\n );\n const bboxSize = new Point(width, height);\n const bboxLeftTop = new Point(left, top);\n const bboxCenter = bboxLeftTop.add(bboxSize.scalarDivide(2));\n\n if (type === LAYOUT_TYPE_INITIALIZATION) {\n const actualSize = this.getInitialSize(context, {\n size: bboxSize,\n center: bboxCenter,\n });\n return {\n // in `initialization` we do not account for target's transformation matrix\n center: bboxCenter,\n // TODO: investigate if this is still necessary\n relativeCorrection: new Point(0, 0),\n size: actualSize,\n };\n } else {\n // we send `relativeCenter` up to group's containing plane\n const center = bboxCenter.transform(target.calcOwnMatrix());\n return {\n center,\n size: bboxSize,\n };\n }\n }\n}\n","import type { StrictLayoutContext } from '../types';\nimport { LayoutStrategy } from './LayoutStrategy';\nimport { classRegistry } from '../../ClassRegistry';\n\n/**\n * Layout will adjust the bounding box to fit target's objects.\n */\nexport class FitContentLayout extends LayoutStrategy {\n static readonly type = 'fit-content';\n\n /**\n * @override layout on all triggers\n * Override at will\n */\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n shouldPerformLayout(context: StrictLayoutContext) {\n return true;\n }\n}\n\nclassRegistry.setClass(FitContentLayout);\n","import { Point } from '../Point';\nimport {\n CENTER,\n CHANGED,\n MODIFIED,\n MODIFY_PATH,\n MODIFY_POLY,\n MOVING,\n RESIZING,\n ROTATING,\n SCALING,\n SKEWING,\n iMatrix,\n} from '../constants';\nimport type { Group } from '../shapes/Group';\nimport type { FabricObject } from '../shapes/Object/FabricObject';\nimport { invertTransform } from '../util/misc/matrix';\nimport { resolveOrigin } from '../util/misc/resolveOrigin';\nimport { FitContentLayout } from './LayoutStrategies/FitContentLayout';\nimport type { LayoutStrategy } from './LayoutStrategies/LayoutStrategy';\nimport {\n LAYOUT_TYPE_INITIALIZATION,\n LAYOUT_TYPE_ADDED,\n LAYOUT_TYPE_REMOVED,\n LAYOUT_TYPE_IMPERATIVE,\n LAYOUT_TYPE_OBJECT_MODIFIED,\n LAYOUT_TYPE_OBJECT_MODIFYING,\n} from './constants';\nimport type {\n LayoutContext,\n LayoutResult,\n RegistrationContext,\n StrictLayoutContext,\n} from './types';\nimport { classRegistry } from '../ClassRegistry';\nimport type { TModificationEvents } from '../EventTypeDefs';\n\nconst LAYOUT_MANAGER = 'layoutManager';\n\nexport type SerializedLayoutManager = {\n type: string;\n strategy: string;\n};\n\nexport class LayoutManager {\n declare private _prevLayoutStrategy?: LayoutStrategy;\n declare protected _subscriptions: Map;\n\n strategy: LayoutStrategy;\n\n constructor(strategy: LayoutStrategy = new FitContentLayout()) {\n this.strategy = strategy;\n this._subscriptions = new Map();\n }\n\n public performLayout(context: LayoutContext) {\n const strictContext: StrictLayoutContext = {\n bubbles: true,\n strategy: this.strategy,\n ...context,\n prevStrategy: this._prevLayoutStrategy,\n stopPropagation() {\n this.bubbles = false;\n },\n };\n\n this.onBeforeLayout(strictContext);\n\n const layoutResult = this.getLayoutResult(strictContext);\n if (layoutResult) {\n this.commitLayout(strictContext, layoutResult);\n }\n\n this.onAfterLayout(strictContext, layoutResult);\n this._prevLayoutStrategy = strictContext.strategy;\n }\n\n /**\n * Attach handlers for events that we know will invalidate the layout when\n * performed on child objects ( general transforms ).\n * Returns the disposers for later unsubscribing and cleanup\n * @param {FabricObject} object\n * @param {RegistrationContext & Partial} context\n * @returns {VoidFunction[]} disposers remove the handlers\n */\n protected attachHandlers(\n object: FabricObject,\n context: RegistrationContext & Partial,\n ): VoidFunction[] {\n const { target } = context;\n return (\n [\n MODIFIED,\n MOVING,\n RESIZING,\n ROTATING,\n SCALING,\n SKEWING,\n CHANGED,\n MODIFY_POLY,\n MODIFY_PATH,\n ] as (TModificationEvents & 'modified')[]\n ).map((key) =>\n object.on(key, (e) =>\n this.performLayout(\n key === MODIFIED\n ? {\n type: LAYOUT_TYPE_OBJECT_MODIFIED,\n trigger: key,\n e,\n target,\n }\n : {\n type: LAYOUT_TYPE_OBJECT_MODIFYING,\n trigger: key,\n e,\n target,\n },\n ),\n ),\n );\n }\n\n /**\n * Subscribe an object to transform events that will trigger a layout change on the parent\n * This is important only for interactive groups.\n * @param object\n * @param context\n */\n protected subscribe(\n object: FabricObject,\n context: RegistrationContext & Partial,\n ) {\n this.unsubscribe(object, context);\n const disposers = this.attachHandlers(object, context);\n this._subscriptions.set(object, disposers);\n }\n\n /**\n * unsubscribe object layout triggers\n */\n protected unsubscribe(\n object: FabricObject,\n _context?: RegistrationContext & Partial,\n ) {\n (this._subscriptions.get(object) || []).forEach((d) => d());\n this._subscriptions.delete(object);\n }\n\n unsubscribeTargets(\n context: RegistrationContext & Partial,\n ) {\n context.targets.forEach((object) => this.unsubscribe(object, context));\n }\n\n subscribeTargets(\n context: RegistrationContext & Partial,\n ) {\n context.targets.forEach((object) => this.subscribe(object, context));\n }\n\n protected onBeforeLayout(context: StrictLayoutContext) {\n const { target, type } = context;\n const { canvas } = target;\n // handle layout triggers subscription\n // @TODO: gate the registration when the group is interactive\n if (type === LAYOUT_TYPE_INITIALIZATION || type === LAYOUT_TYPE_ADDED) {\n this.subscribeTargets(context);\n } else if (type === LAYOUT_TYPE_REMOVED) {\n this.unsubscribeTargets(context);\n }\n // fire layout event (event will fire only for layouts after initialization layout)\n target.fire('layout:before', {\n context,\n });\n canvas &&\n canvas.fire('object:layout:before', {\n target,\n context,\n });\n\n if (type === LAYOUT_TYPE_IMPERATIVE && context.deep) {\n const { strategy: _, ...tricklingContext } = context;\n // traverse the tree\n target.forEachObject(\n (object) =>\n (object as Group).layoutManager &&\n (object as Group).layoutManager.performLayout({\n ...tricklingContext,\n bubbles: false,\n target: object as Group,\n }),\n );\n }\n }\n\n protected getLayoutResult(\n context: StrictLayoutContext,\n ): Required | undefined {\n const { target, strategy, type } = context;\n\n const result = strategy.calcLayoutResult(context, target.getObjects());\n\n if (!result) {\n return;\n }\n\n const prevCenter =\n type === LAYOUT_TYPE_INITIALIZATION\n ? new Point()\n : target.getRelativeCenterPoint();\n\n const {\n center: nextCenter,\n correction = new Point(),\n relativeCorrection = new Point(),\n } = result;\n const offset = prevCenter\n .subtract(nextCenter)\n .add(correction)\n .transform(\n // in `initialization` we do not account for target's transformation matrix\n type === LAYOUT_TYPE_INITIALIZATION\n ? iMatrix\n : invertTransform(target.calcOwnMatrix()),\n true,\n )\n .add(relativeCorrection);\n\n return {\n result,\n prevCenter,\n nextCenter,\n offset,\n };\n }\n\n protected commitLayout(\n context: StrictLayoutContext,\n layoutResult: Required,\n ) {\n const { target } = context;\n const {\n result: { size },\n nextCenter,\n } = layoutResult;\n // set dimensions\n target.set({ width: size.x, height: size.y });\n // layout descendants\n this.layoutObjects(context, layoutResult);\n // set position\n // in `initialization` we do not account for target's transformation matrix\n if (context.type === LAYOUT_TYPE_INITIALIZATION) {\n // TODO: what about strokeWidth?\n target.set({\n left:\n context.x ?? nextCenter.x + size.x * resolveOrigin(target.originX),\n top: context.y ?? nextCenter.y + size.y * resolveOrigin(target.originY),\n });\n } else {\n target.setPositionByOrigin(nextCenter, CENTER, CENTER);\n // invalidate\n target.setCoords();\n target.set('dirty', true);\n }\n }\n\n protected layoutObjects(\n context: StrictLayoutContext,\n layoutResult: Required,\n ) {\n const { target } = context;\n // adjust objects to account for new center\n target.forEachObject((object) => {\n object.group === target &&\n this.layoutObject(context, layoutResult, object);\n });\n // adjust clip path to account for new center\n context.strategy.shouldLayoutClipPath(context) &&\n this.layoutObject(context, layoutResult, target.clipPath as FabricObject);\n }\n\n /**\n * @param {FabricObject} object\n * @param {Point} offset\n */\n protected layoutObject(\n context: StrictLayoutContext,\n { offset }: Required,\n object: FabricObject,\n ) {\n // TODO: this is here for cache invalidation.\n // verify if this is necessary since we have explicit\n // cache invalidation at the end of commitLayout\n object.set({\n left: object.left + offset.x,\n top: object.top + offset.y,\n });\n }\n\n protected onAfterLayout(\n context: StrictLayoutContext,\n layoutResult?: LayoutResult,\n ) {\n const {\n target,\n strategy,\n bubbles,\n prevStrategy: _,\n ...bubblingContext\n } = context;\n const { canvas } = target;\n\n // fire layout event (event will fire only for layouts after initialization layout)\n target.fire('layout:after', {\n context,\n result: layoutResult,\n });\n canvas &&\n canvas.fire('object:layout:after', {\n context,\n result: layoutResult,\n target,\n });\n\n // bubble\n const parent = target.parent;\n if (bubbles && parent?.layoutManager) {\n // add target to context#path\n (bubblingContext.path || (bubblingContext.path = [])).push(target);\n // all parents should invalidate their layout\n parent.layoutManager.performLayout({\n ...bubblingContext,\n target: parent,\n });\n }\n target.set('dirty', true);\n }\n\n dispose() {\n const { _subscriptions } = this;\n _subscriptions.forEach((disposers) => disposers.forEach((d) => d()));\n _subscriptions.clear();\n }\n\n toObject() {\n return {\n type: LAYOUT_MANAGER,\n strategy: (this.strategy.constructor as typeof LayoutStrategy).type,\n };\n }\n\n toJSON() {\n return this.toObject();\n }\n}\n\nclassRegistry.setClass(LayoutManager, LAYOUT_MANAGER);\n","import type { CollectionEvents, ObjectEvents } from '../EventTypeDefs';\nimport { createCollectionMixin } from '../Collection';\nimport type {\n TClassProperties,\n TSVGReviver,\n TOptions,\n Abortable,\n} from '../typedefs';\nimport {\n invertTransform,\n multiplyTransformMatrices,\n} from '../util/misc/matrix';\nimport {\n enlivenObjectEnlivables,\n enlivenObjects,\n} from '../util/misc/objectEnlive';\nimport { applyTransformToObject } from '../util/misc/objectTransforms';\nimport { FabricObject } from './Object/FabricObject';\nimport { Rect } from './Rect';\nimport { classRegistry } from '../ClassRegistry';\nimport type { FabricObjectProps, SerializedObjectProps } from './Object/types';\nimport { log } from '../util/internals/console';\nimport type {\n ImperativeLayoutOptions,\n LayoutBeforeEvent,\n LayoutAfterEvent,\n} from '../LayoutManager/types';\nimport { LayoutManager } from '../LayoutManager/LayoutManager';\nimport {\n LAYOUT_TYPE_ADDED,\n LAYOUT_TYPE_IMPERATIVE,\n LAYOUT_TYPE_INITIALIZATION,\n LAYOUT_TYPE_REMOVED,\n} from '../LayoutManager/constants';\nimport type { SerializedLayoutManager } from '../LayoutManager/LayoutManager';\nimport type { FitContentLayout } from '../LayoutManager';\nimport type { DrawContext } from './Object/Object';\n\n/**\n * This class handles the specific case of creating a group using {@link Group#fromObject} and is not meant to be used in any other case.\n * We could have used a boolean in the constructor, as we did previously, but we think the boolean\n * would stay in the group's constructor interface and create confusion, therefore it was removed.\n * This layout manager doesn't do anything and therefore keeps the exact layout the group had when {@link Group#toObject} was called.\n */\nclass NoopLayoutManager extends LayoutManager {\n performLayout() {}\n}\n\nexport interface GroupEvents extends ObjectEvents, CollectionEvents {\n 'layout:before': LayoutBeforeEvent;\n 'layout:after': LayoutAfterEvent;\n}\n\nexport interface GroupOwnProps {\n subTargetCheck: boolean;\n interactive: boolean;\n}\n\nexport interface SerializedGroupProps\n extends SerializedObjectProps,\n GroupOwnProps {\n objects: SerializedObjectProps[];\n layoutManager: SerializedLayoutManager;\n}\n\nexport interface GroupProps extends FabricObjectProps, GroupOwnProps {\n layoutManager: LayoutManager;\n}\n\nexport const groupDefaultValues: Partial> = {\n strokeWidth: 0,\n subTargetCheck: false,\n interactive: false,\n};\n\n/**\n * @fires object:added\n * @fires object:removed\n * @fires layout:before\n * @fires layout:after\n */\nexport class Group\n extends createCollectionMixin(\n FabricObject,\n )\n implements GroupProps\n{\n /**\n * Used to optimize performance\n * set to `false` if you don't need contained objects to be targets of events\n * @type boolean\n */\n declare subTargetCheck: boolean;\n\n /**\n * Used to allow targeting of object inside groups.\n * set to true if you want to select an object inside a group.\\\n * **REQUIRES** `subTargetCheck` set to true\n * This will be not removed but slowly replaced with a method setInteractive\n * that will take care of enabling subTargetCheck and necessary object events.\n * There is too much attached to group interactivity to just be evaluated by a\n * boolean in the code\n * @deprecated\n * @type boolean\n */\n declare interactive: boolean;\n\n declare layoutManager: LayoutManager;\n\n /**\n * Used internally to optimize performance\n * Once an object is selected, instance is rendered without the selected object.\n * This way instance is cached only once for the entire interaction with the selected object.\n * @private\n */\n protected _activeObjects: FabricObject[] = [];\n\n static type = 'Group';\n\n static ownDefaults: Record = groupDefaultValues;\n private __objectSelectionTracker: (ev: ObjectEvents['selected']) => void;\n private __objectSelectionDisposer: (ev: ObjectEvents['deselected']) => void;\n\n static getDefaults(): Record {\n return {\n ...super.getDefaults(),\n ...Group.ownDefaults,\n };\n }\n\n /**\n * Constructor\n *\n * @param {FabricObject[]} [objects] instance objects\n * @param {Object} [options] Options object\n */\n constructor(objects: FabricObject[] = [], options: Partial = {}) {\n super();\n Object.assign(this, Group.ownDefaults);\n this.setOptions(options);\n this.groupInit(objects, options);\n }\n\n /**\n * Shared code between group and active selection\n * Meant to be used by the constructor.\n */\n protected groupInit(\n objects: FabricObject[],\n options: {\n layoutManager?: LayoutManager;\n top?: number;\n left?: number;\n },\n ) {\n this._objects = [...objects]; // Avoid unwanted mutations of Collection to affect the caller\n\n this.__objectSelectionTracker = this.__objectSelectionMonitor.bind(\n this,\n true,\n );\n this.__objectSelectionDisposer = this.__objectSelectionMonitor.bind(\n this,\n false,\n );\n\n this.forEachObject((object) => {\n this.enterGroup(object, false);\n });\n\n // perform initial layout\n this.layoutManager = options.layoutManager ?? new LayoutManager();\n this.layoutManager.performLayout({\n type: LAYOUT_TYPE_INITIALIZATION,\n target: this,\n targets: [...objects],\n // @TODO remove this concept from the layout manager.\n // Layout manager will calculate the correct position,\n // group options can override it later.\n x: options.left,\n y: options.top,\n });\n }\n\n /**\n * Checks if object can enter group and logs relevant warnings\n * @private\n * @param {FabricObject} object\n * @returns\n */\n canEnterGroup(object: FabricObject) {\n if (object === this || this.isDescendantOf(object)) {\n // prevent circular object tree\n log(\n 'error',\n 'Group: circular object trees are not supported, this call has no effect',\n );\n return false;\n } else if (this._objects.indexOf(object) !== -1) {\n // is already in the objects array\n log(\n 'error',\n 'Group: duplicate objects are not supported inside group, this call has no effect',\n );\n return false;\n }\n return true;\n }\n\n /**\n * Override this method to enhance performance (for groups with a lot of objects).\n * If Overriding, be sure not pass illegal objects to group - it will break your app.\n * @private\n */\n protected _filterObjectsBeforeEnteringGroup(objects: FabricObject[]) {\n return objects.filter((object, index, array) => {\n // can enter AND is the first occurrence of the object in the passed args (to prevent adding duplicates)\n return this.canEnterGroup(object) && array.indexOf(object) === index;\n });\n }\n\n /**\n * Add objects\n * @param {...FabricObject[]} objects\n */\n add(...objects: FabricObject[]) {\n const allowedObjects = this._filterObjectsBeforeEnteringGroup(objects);\n const size = super.add(...allowedObjects);\n this._onAfterObjectsChange(LAYOUT_TYPE_ADDED, allowedObjects);\n return size;\n }\n\n /**\n * Inserts an object into collection at specified index\n * @param {FabricObject[]} objects Object to insert\n * @param {Number} index Index to insert object at\n */\n insertAt(index: number, ...objects: FabricObject[]) {\n const allowedObjects = this._filterObjectsBeforeEnteringGroup(objects);\n const size = super.insertAt(index, ...allowedObjects);\n this._onAfterObjectsChange(LAYOUT_TYPE_ADDED, allowedObjects);\n return size;\n }\n\n /**\n * Remove objects\n * @param {...FabricObject[]} objects\n * @returns {FabricObject[]} removed objects\n */\n remove(...objects: FabricObject[]) {\n const removed = super.remove(...objects);\n this._onAfterObjectsChange(LAYOUT_TYPE_REMOVED, removed);\n return removed;\n }\n\n _onObjectAdded(object: FabricObject) {\n this.enterGroup(object, true);\n this.fire('object:added', { target: object });\n object.fire('added', { target: this });\n }\n\n /**\n * @private\n * @param {FabricObject} object\n * @param {boolean} [removeParentTransform] true if object should exit group without applying group's transform to it\n */\n _onObjectRemoved(object: FabricObject, removeParentTransform?: boolean) {\n this.exitGroup(object, removeParentTransform);\n this.fire('object:removed', { target: object });\n object.fire('removed', { target: this });\n }\n\n /**\n * @private\n * @param {'added'|'removed'} type\n * @param {FabricObject[]} targets\n */\n _onAfterObjectsChange(type: 'added' | 'removed', targets: FabricObject[]) {\n this.layoutManager.performLayout({\n type,\n targets,\n target: this,\n });\n }\n\n _onStackOrderChanged() {\n this._set('dirty', true);\n }\n\n /**\n * @private\n * @param {string} key\n * @param {*} value\n */\n _set(key: string, value: any) {\n const prev = this[key as keyof this];\n super._set(key, value);\n if (key === 'canvas' && prev !== value) {\n (this._objects || []).forEach((object) => {\n object._set(key, value);\n });\n }\n return this;\n }\n\n /**\n * @private\n */\n _shouldSetNestedCoords() {\n return this.subTargetCheck;\n }\n\n /**\n * Remove all objects\n * @returns {FabricObject[]} removed objects\n */\n removeAll() {\n this._activeObjects = [];\n return this.remove(...this._objects);\n }\n\n /**\n * keeps track of the selected objects\n * @private\n */\n __objectSelectionMonitor(\n selected: T,\n {\n target: object,\n }: ObjectEvents[T extends true ? 'selected' : 'deselected'],\n ) {\n const activeObjects = this._activeObjects;\n if (selected) {\n activeObjects.push(object);\n this._set('dirty', true);\n } else if (activeObjects.length > 0) {\n const index = activeObjects.indexOf(object);\n if (index > -1) {\n activeObjects.splice(index, 1);\n this._set('dirty', true);\n }\n }\n }\n\n /**\n * @private\n * @param {boolean} watch\n * @param {FabricObject} object\n */\n _watchObject(watch: boolean, object: FabricObject) {\n // make sure we listen only once\n watch && this._watchObject(false, object);\n if (watch) {\n object.on('selected', this.__objectSelectionTracker);\n object.on('deselected', this.__objectSelectionDisposer);\n } else {\n object.off('selected', this.__objectSelectionTracker);\n object.off('deselected', this.__objectSelectionDisposer);\n }\n }\n\n /**\n * @private\n * @param {FabricObject} object\n * @param {boolean} [removeParentTransform] true if object is in canvas coordinate plane\n */\n enterGroup(object: FabricObject, removeParentTransform?: boolean) {\n object.group && object.group.remove(object);\n object._set('parent', this);\n this._enterGroup(object, removeParentTransform);\n }\n\n /**\n * @private\n * @param {FabricObject} object\n * @param {boolean} [removeParentTransform] true if object is in canvas coordinate plane\n */\n _enterGroup(object: FabricObject, removeParentTransform?: boolean) {\n if (removeParentTransform) {\n // can this be converted to utils (sendObjectToPlane)?\n applyTransformToObject(\n object,\n multiplyTransformMatrices(\n invertTransform(this.calcTransformMatrix()),\n object.calcTransformMatrix(),\n ),\n );\n }\n this._shouldSetNestedCoords() && object.setCoords();\n object._set('group', this);\n object._set('canvas', this.canvas);\n this._watchObject(true, object);\n const activeObject =\n this.canvas &&\n this.canvas.getActiveObject &&\n this.canvas.getActiveObject();\n // if we are adding the activeObject in a group\n if (\n activeObject &&\n (activeObject === object || object.isDescendantOf(activeObject))\n ) {\n this._activeObjects.push(object);\n }\n }\n\n /**\n * @private\n * @param {FabricObject} object\n * @param {boolean} [removeParentTransform] true if object should exit group without applying group's transform to it\n */\n exitGroup(object: FabricObject, removeParentTransform?: boolean) {\n this._exitGroup(object, removeParentTransform);\n object._set('parent', undefined);\n object._set('canvas', undefined);\n }\n\n /**\n * Executes the inner fabric logic of exiting a group.\n * - Stop watching the object\n * - Remove the object from the optimization map this._activeObjects\n * - unset the group property of the object\n * @protected\n * @param {FabricObject} object\n * @param {boolean} [removeParentTransform] true if object should exit group without applying group's transform to it\n */\n _exitGroup(object: FabricObject, removeParentTransform?: boolean) {\n object._set('group', undefined);\n if (!removeParentTransform) {\n applyTransformToObject(\n object,\n multiplyTransformMatrices(\n this.calcTransformMatrix(),\n object.calcTransformMatrix(),\n ),\n );\n object.setCoords();\n }\n this._watchObject(false, object);\n const index =\n this._activeObjects.length > 0 ? this._activeObjects.indexOf(object) : -1;\n if (index > -1) {\n this._activeObjects.splice(index, 1);\n }\n }\n\n /**\n * Decide if the group should cache or not. Create its own cache level\n * needsItsOwnCache should be used when the object drawing method requires\n * a cache step.\n * Generally you do not cache objects in groups because the group is already cached.\n * @return {Boolean}\n */\n shouldCache() {\n const ownCache = FabricObject.prototype.shouldCache.call(this);\n if (ownCache) {\n for (let i = 0; i < this._objects.length; i++) {\n if (this._objects[i].willDrawShadow()) {\n this.ownCaching = false;\n return false;\n }\n }\n }\n return ownCache;\n }\n\n /**\n * Check if this object or a child object will cast a shadow\n * @return {Boolean}\n */\n willDrawShadow() {\n if (super.willDrawShadow()) {\n return true;\n }\n for (let i = 0; i < this._objects.length; i++) {\n if (this._objects[i].willDrawShadow()) {\n return true;\n }\n }\n return false;\n }\n\n /**\n * Check if instance or its group are caching, recursively up\n * @return {Boolean}\n */\n isOnACache(): boolean {\n return this.ownCaching || (!!this.parent && this.parent.isOnACache());\n }\n\n /**\n * Execute the drawing operation for an object on a specified context\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n drawObject(\n ctx: CanvasRenderingContext2D,\n forClipping: boolean | undefined,\n context: DrawContext,\n ) {\n this._renderBackground(ctx);\n for (let i = 0; i < this._objects.length; i++) {\n const obj = this._objects[i];\n // TODO: handle rendering edge case somehow\n if (this.canvas?.preserveObjectStacking && obj.group !== this) {\n ctx.save();\n ctx.transform(...invertTransform(this.calcTransformMatrix()));\n obj.render(ctx);\n ctx.restore();\n } else if (obj.group === this) {\n obj.render(ctx);\n }\n }\n this._drawClipPath(ctx, this.clipPath, context);\n }\n\n /**\n * @override\n * @return {Boolean}\n */\n setCoords() {\n super.setCoords();\n this._shouldSetNestedCoords() &&\n this.forEachObject((object) => object.setCoords());\n }\n\n triggerLayout(options: ImperativeLayoutOptions = {}) {\n this.layoutManager.performLayout({\n target: this,\n type: LAYOUT_TYPE_IMPERATIVE,\n ...options,\n });\n }\n\n /**\n * Renders instance on a given context\n * @param {CanvasRenderingContext2D} ctx context to render instance on\n */\n render(ctx: CanvasRenderingContext2D) {\n this._transformDone = true;\n super.render(ctx);\n this._transformDone = false;\n }\n\n /**\n *\n * @private\n * @param {'toObject'|'toDatalessObject'} [method]\n * @param {string[]} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @returns {FabricObject[]} serialized objects\n */\n __serializeObjects(\n method: 'toObject' | 'toDatalessObject',\n propertiesToInclude?: string[],\n ) {\n const _includeDefaultValues = this.includeDefaultValues;\n return this._objects\n .filter(function (obj) {\n return !obj.excludeFromExport;\n })\n .map(function (obj) {\n const originalDefaults = obj.includeDefaultValues;\n obj.includeDefaultValues = _includeDefaultValues;\n const data = obj[method || 'toObject'](propertiesToInclude);\n obj.includeDefaultValues = originalDefaults;\n // delete data.version;\n return data;\n });\n }\n\n /**\n * Returns object representation of an instance\n * @param {string[]} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} object representation of an instance\n */\n toObject<\n T extends Omit<\n GroupProps & TClassProperties,\n keyof SerializedGroupProps\n >,\n K extends keyof T = never,\n >(propertiesToInclude: K[] = []): Pick & SerializedGroupProps {\n const layoutManager = this.layoutManager.toObject();\n\n return {\n ...super.toObject([\n 'subTargetCheck',\n 'interactive',\n ...propertiesToInclude,\n ]),\n ...(layoutManager.strategy !== 'fit-content' || this.includeDefaultValues\n ? { layoutManager }\n : {}),\n objects: this.__serializeObjects(\n 'toObject',\n propertiesToInclude as string[],\n ),\n };\n }\n\n toString() {\n return `#`;\n }\n\n dispose() {\n this.layoutManager.unsubscribeTargets({\n targets: this.getObjects(),\n target: this,\n });\n this._activeObjects = [];\n this.forEachObject((object) => {\n this._watchObject(false, object);\n object.dispose();\n });\n super.dispose();\n }\n\n /**\n * @private\n */\n _createSVGBgRect(reviver?: TSVGReviver) {\n if (!this.backgroundColor) {\n return '';\n }\n const fillStroke = Rect.prototype._toSVG.call(this);\n const commons = fillStroke.indexOf('COMMON_PARTS');\n fillStroke[commons] = 'for=\"group\" ';\n const markup = fillStroke.join('');\n return reviver ? reviver(markup) : markup;\n }\n\n /**\n * Returns svg representation of an instance\n * @param {TSVGReviver} [reviver] Method for further parsing of svg representation.\n * @return {String} svg representation of an instance\n */\n _toSVG(reviver?: TSVGReviver) {\n const svgString = ['\\n'];\n const bg = this._createSVGBgRect(reviver);\n bg && svgString.push('\\t\\t', bg);\n for (let i = 0; i < this._objects.length; i++) {\n svgString.push('\\t\\t', this._objects[i].toSVG(reviver));\n }\n svgString.push('\\n');\n return svgString;\n }\n\n /**\n * Returns styles-string for svg-export, specific version for group\n * @return {String}\n */\n getSvgStyles(): string {\n const opacity =\n typeof this.opacity !== 'undefined' && this.opacity !== 1\n ? `opacity: ${this.opacity};`\n : '',\n visibility = this.visible ? '' : ' visibility: hidden;';\n return [opacity, this.getSvgFilter(), visibility].join('');\n }\n\n /**\n * Returns svg clipPath representation of an instance\n * @param {Function} [reviver] Method for further parsing of svg representation.\n * @return {String} svg representation of an instance\n */\n toClipPathSVG(reviver?: TSVGReviver): string {\n const svgString = [];\n const bg = this._createSVGBgRect(reviver);\n bg && svgString.push('\\t', bg);\n for (let i = 0; i < this._objects.length; i++) {\n svgString.push('\\t', this._objects[i].toClipPathSVG(reviver));\n }\n return this._createBaseClipPathSVGMarkup(svgString, {\n reviver,\n });\n }\n\n /**\n * @todo support loading from svg\n * @private\n * @param {Object} object Object to create a group from\n * @returns {Promise}\n */\n static fromObject>(\n { type, objects = [], layoutManager, ...options }: T,\n abortable?: Abortable,\n ) {\n return Promise.all([\n enlivenObjects(objects, abortable),\n enlivenObjectEnlivables(options, abortable),\n ]).then(([objects, hydratedOptions]) => {\n const group = new this(objects, {\n ...options,\n ...hydratedOptions,\n layoutManager: new NoopLayoutManager(),\n });\n if (layoutManager) {\n const layoutClass = classRegistry.getClass(\n layoutManager.type,\n );\n const strategyClass = classRegistry.getClass(\n layoutManager.strategy,\n );\n group.layoutManager = new layoutClass(new strategyClass());\n } else {\n group.layoutManager = new LayoutManager();\n }\n group.layoutManager.subscribeTargets({\n type: LAYOUT_TYPE_INITIALIZATION,\n target: group,\n targets: group.getObjects(),\n });\n group.setCoords();\n return group;\n });\n }\n}\n\nclassRegistry.setClass(Group);\n","import type { GroupProps } from '../../shapes/Group';\nimport { Group } from '../../shapes/Group';\nimport type { FabricObject } from '../../shapes/Object/FabricObject';\n\n/**\n * TODO experiment with different layout manager and svg results ( fixed fit content )\n * Groups SVG elements (usually those retrieved from SVG document)\n * @param {FabricObject[]} elements FabricObject(s) parsed from svg, to group\n * @return {FabricObject | Group}\n */\nexport const groupSVGElements = (\n elements: FabricObject[],\n options?: Partial,\n) => {\n if (elements && elements.length === 1) {\n return elements[0];\n }\n return new Group(elements, options);\n};\n","import type { TSize } from '../../typedefs';\n\n/**\n * Finds the scale for the object source to fit inside the object destination,\n * keeping aspect ratio intact.\n * respect the total allowed area for the cache.\n * @param {TSize} source natural unscaled size of the object\n * @param {TSize} destination natural unscaled size of the object\n * @return {Number} scale factor to apply to source to fit into destination\n */\nexport const findScaleToFit = (source: TSize, destination: TSize) =>\n Math.min(\n destination.width / source.width,\n destination.height / source.height,\n );\n\n/**\n * Finds the scale for the object source to cover entirely the object destination,\n * keeping aspect ratio intact.\n * respect the total allowed area for the cache.\n * @param {TSize} source natural unscaled size of the object\n * @param {TSize} destination natural unscaled size of the object\n * @return {Number} scale factor to apply to source to cover destination\n */\nexport const findScaleToCover = (source: TSize, destination: TSize) =>\n Math.max(\n destination.width / source.width,\n destination.height / source.height,\n );\n","import { reNum } from '../../parser/constants';\n\nconst commaWsp = `\\\\s*,?\\\\s*`;\n\n/**\n * p for param\n * using \"bad naming\" here because it makes the regex much easier to read\n * p is a number that is preceded by an arbitary number of spaces, maybe 0,\n * a comma or not, and then possibly more spaces or not.\n */\nconst p = `${commaWsp}(${reNum})`;\n\n// const reMoveToCommand = `(M) ?(?:${p}${p} ?)+`;\n\n// const reLineCommand = `(L) ?(?:${p}${p} ?)+`;\n\n// const reHorizontalLineCommand = `(H) ?(?:${p} ?)+`;\n\n// const reVerticalLineCommand = `(V) ?(?:${p} ?)+`;\n\n// const reClosePathCommand = String.raw`(Z)\\s*`;\n\n// const reCubicCurveCommand = `(C) ?(?:${p}${p}${p}${p}${p}${p} ?)+`;\n\n// const reCubicCurveShortcutCommand = `(S) ?(?:${p}${p}${p}${p} ?)+`;\n\n// const reQuadraticCurveCommand = `(Q) ?(?:${p}${p}${p}${p} ?)+`;\n\n// const reQuadraticCurveShortcutCommand = `(T) ?(?:${p}${p} ?)+`;\n\nexport const reArcCommandPoints = `${p}${p}${p}${commaWsp}([01])${commaWsp}([01])${p}${p}`;\n// const reArcCommand = `(A) ?(?:${reArcCommandPoints} ?)+`;\n\n// export const rePathCommandGroups =\n// `(?:(?:${reMoveToCommand})` +\n// `|(?:${reLineCommand})` +\n// `|(?:${reHorizontalLineCommand})` +\n// `|(?:${reVerticalLineCommand})` +\n// `|(?:${reClosePathCommand})` +\n// `|(?:${reCubicCurveCommand})` +\n// `|(?:${reCubicCurveShortcutCommand})` +\n// `|(?:${reQuadraticCurveCommand})` +\n// `|(?:${reQuadraticCurveShortcutCommand})` +\n// `|(?:${reArcCommand}))`;\n\nexport const rePathCommand = '[mzlhvcsqta][^mzlhvcsqta]*';\n","import { cache } from '../../cache';\nimport { config } from '../../config';\nimport { halfPI, PiBy180 } from '../../constants';\nimport type { TMat2D, TRadian, TRectBounds } from '../../typedefs';\nimport { cos } from '../misc/cos';\nimport { multiplyTransformMatrices, transformPoint } from '../misc/matrix';\nimport { sin } from '../misc/sin';\nimport { toFixed } from '../misc/toFixed';\nimport type {\n TCurveInfo,\n TComplexPathData,\n TParsedAbsoluteCubicCurveCommand,\n TPathSegmentInfo,\n TPointAngle,\n TSimpleParsedCommand,\n TSimplePathData,\n TPathSegmentCommandInfo,\n TComplexParsedCommand,\n TPathSegmentInfoCommon,\n TEndPathInfo,\n TParsedArcCommand,\n TComplexParsedCommandType,\n} from './typedefs';\nimport type { XY } from '../../Point';\nimport { Point } from '../../Point';\nimport { reArcCommandPoints, rePathCommand } from './regex';\nimport { reNum } from '../../parser/constants';\n\n/**\n * Commands that may be repeated\n */\nconst repeatedCommands: Record = {\n m: 'l',\n M: 'L',\n};\n\n/**\n * Convert an arc of a rotated ellipse to a Bezier Curve\n * @param {TRadian} theta1 start of the arc\n * @param {TRadian} theta2 end of the arc\n * @param cosTh cosine of the angle of rotation\n * @param sinTh sine of the angle of rotation\n * @param rx x-axis radius (before rotation)\n * @param ry y-axis radius (before rotation)\n * @param cx1 center x of the ellipse\n * @param cy1 center y of the ellipse\n * @param mT\n * @param fromX starting point of arc x\n * @param fromY starting point of arc y\n */\nconst segmentToBezier = (\n theta1: TRadian,\n theta2: TRadian,\n cosTh: number,\n sinTh: number,\n rx: number,\n ry: number,\n cx1: number,\n cy1: number,\n mT: number,\n fromX: number,\n fromY: number,\n): TParsedAbsoluteCubicCurveCommand => {\n const costh1 = cos(theta1),\n sinth1 = sin(theta1),\n costh2 = cos(theta2),\n sinth2 = sin(theta2),\n toX = cosTh * rx * costh2 - sinTh * ry * sinth2 + cx1,\n toY = sinTh * rx * costh2 + cosTh * ry * sinth2 + cy1,\n cp1X = fromX + mT * (-cosTh * rx * sinth1 - sinTh * ry * costh1),\n cp1Y = fromY + mT * (-sinTh * rx * sinth1 + cosTh * ry * costh1),\n cp2X = toX + mT * (cosTh * rx * sinth2 + sinTh * ry * costh2),\n cp2Y = toY + mT * (sinTh * rx * sinth2 - cosTh * ry * costh2);\n\n return ['C', cp1X, cp1Y, cp2X, cp2Y, toX, toY];\n};\n\n/**\n * Adapted from {@link http://dxr.mozilla.org/mozilla-central/source/dom/svg/SVGPathDataParser.cpp}\n * by Andrea Bogazzi code is under MPL. if you don't have a copy of the license you can take it here\n * http://mozilla.org/MPL/2.0/\n * @param toX\n * @param toY\n * @param rx\n * @param ry\n * @param {number} large 0 or 1 flag\n * @param {number} sweep 0 or 1 flag\n * @param rotateX\n */\nconst arcToSegments = (\n toX: number,\n toY: number,\n rx: number,\n ry: number,\n large: number,\n sweep: number,\n rotateX: TRadian,\n): TParsedAbsoluteCubicCurveCommand[] => {\n if (rx === 0 || ry === 0) {\n return [];\n }\n let fromX = 0,\n fromY = 0,\n root = 0;\n const PI = Math.PI,\n theta = rotateX * PiBy180,\n sinTheta = sin(theta),\n cosTh = cos(theta),\n px = 0.5 * (-cosTh * toX - sinTheta * toY),\n py = 0.5 * (-cosTh * toY + sinTheta * toX),\n rx2 = rx ** 2,\n ry2 = ry ** 2,\n py2 = py ** 2,\n px2 = px ** 2,\n pl = rx2 * ry2 - rx2 * py2 - ry2 * px2;\n let _rx = Math.abs(rx);\n let _ry = Math.abs(ry);\n\n if (pl < 0) {\n const s = Math.sqrt(1 - pl / (rx2 * ry2));\n _rx *= s;\n _ry *= s;\n } else {\n root =\n (large === sweep ? -1.0 : 1.0) * Math.sqrt(pl / (rx2 * py2 + ry2 * px2));\n }\n\n const cx = (root * _rx * py) / _ry,\n cy = (-root * _ry * px) / _rx,\n cx1 = cosTh * cx - sinTheta * cy + toX * 0.5,\n cy1 = sinTheta * cx + cosTh * cy + toY * 0.5;\n let mTheta = calcVectorAngle(1, 0, (px - cx) / _rx, (py - cy) / _ry);\n let dtheta = calcVectorAngle(\n (px - cx) / _rx,\n (py - cy) / _ry,\n (-px - cx) / _rx,\n (-py - cy) / _ry,\n );\n\n if (sweep === 0 && dtheta > 0) {\n dtheta -= 2 * PI;\n } else if (sweep === 1 && dtheta < 0) {\n dtheta += 2 * PI;\n }\n\n // Convert into cubic bezier segments <= 90deg\n const segments = Math.ceil(Math.abs((dtheta / PI) * 2)),\n result = [],\n mDelta = dtheta / segments,\n mT =\n ((8 / 3) * Math.sin(mDelta / 4) * Math.sin(mDelta / 4)) /\n Math.sin(mDelta / 2);\n let th3 = mTheta + mDelta;\n\n for (let i = 0; i < segments; i++) {\n result[i] = segmentToBezier(\n mTheta,\n th3,\n cosTh,\n sinTheta,\n _rx,\n _ry,\n cx1,\n cy1,\n mT,\n fromX,\n fromY,\n );\n fromX = result[i][5];\n fromY = result[i][6];\n mTheta = th3;\n th3 += mDelta;\n }\n return result;\n};\n\n/**\n * @private\n * Calculate the angle between two vectors\n * @param ux u endpoint x\n * @param uy u endpoint y\n * @param vx v endpoint x\n * @param vy v endpoint y\n */\nconst calcVectorAngle = (\n ux: number,\n uy: number,\n vx: number,\n vy: number,\n): TRadian => {\n const ta = Math.atan2(uy, ux),\n tb = Math.atan2(vy, vx);\n if (tb >= ta) {\n return tb - ta;\n } else {\n return 2 * Math.PI - (ta - tb);\n }\n};\n\n// functions for the Cubic beizer\n// taken from: https://github.com/konvajs/konva/blob/7.0.5/src/shapes/Path.ts#L350\nconst CB1 = (t: number) => t ** 3;\nconst CB2 = (t: number) => 3 * t ** 2 * (1 - t);\nconst CB3 = (t: number) => 3 * t * (1 - t) ** 2;\nconst CB4 = (t: number) => (1 - t) ** 3;\n\n/**\n * Calculate bounding box of a cubic Bezier curve\n * Taken from http://jsbin.com/ivomiq/56/edit (no credits available)\n * TODO: can we normalize this with the starting points set at 0 and then translated the bbox?\n * @param {number} begx starting point\n * @param {number} begy\n * @param {number} cp1x first control point\n * @param {number} cp1y\n * @param {number} cp2x second control point\n * @param {number} cp2y\n * @param {number} endx end of bezier\n * @param {number} endy\n * @return {TRectBounds} the rectangular bounds\n */\nexport function getBoundsOfCurve(\n begx: number,\n begy: number,\n cp1x: number,\n cp1y: number,\n cp2x: number,\n cp2y: number,\n endx: number,\n endy: number,\n): TRectBounds {\n let argsString: string;\n if (config.cachesBoundsOfCurve) {\n // eslint-disable-next-line\n argsString = [...arguments].join();\n if (cache.boundsOfCurveCache[argsString]) {\n return cache.boundsOfCurveCache[argsString];\n }\n }\n\n const sqrt = Math.sqrt,\n abs = Math.abs,\n tvalues = [],\n bounds: [[x: number, y: number], [x: number, y: number]] = [\n [0, 0],\n [0, 0],\n ];\n\n let b = 6 * begx - 12 * cp1x + 6 * cp2x;\n let a = -3 * begx + 9 * cp1x - 9 * cp2x + 3 * endx;\n let c = 3 * cp1x - 3 * begx;\n\n for (let i = 0; i < 2; ++i) {\n if (i > 0) {\n b = 6 * begy - 12 * cp1y + 6 * cp2y;\n a = -3 * begy + 9 * cp1y - 9 * cp2y + 3 * endy;\n c = 3 * cp1y - 3 * begy;\n }\n\n if (abs(a) < 1e-12) {\n if (abs(b) < 1e-12) {\n continue;\n }\n const t = -c / b;\n if (0 < t && t < 1) {\n tvalues.push(t);\n }\n continue;\n }\n const b2ac = b * b - 4 * c * a;\n if (b2ac < 0) {\n continue;\n }\n const sqrtb2ac = sqrt(b2ac);\n const t1 = (-b + sqrtb2ac) / (2 * a);\n if (0 < t1 && t1 < 1) {\n tvalues.push(t1);\n }\n const t2 = (-b - sqrtb2ac) / (2 * a);\n if (0 < t2 && t2 < 1) {\n tvalues.push(t2);\n }\n }\n\n let j = tvalues.length;\n const jlen = j;\n const iterator = getPointOnCubicBezierIterator(\n begx,\n begy,\n cp1x,\n cp1y,\n cp2x,\n cp2y,\n endx,\n endy,\n );\n while (j--) {\n const { x, y } = iterator(tvalues[j]);\n bounds[0][j] = x;\n bounds[1][j] = y;\n }\n\n bounds[0][jlen] = begx;\n bounds[1][jlen] = begy;\n bounds[0][jlen + 1] = endx;\n bounds[1][jlen + 1] = endy;\n const result: TRectBounds = [\n new Point(Math.min(...bounds[0]), Math.min(...bounds[1])),\n new Point(Math.max(...bounds[0]), Math.max(...bounds[1])),\n ];\n if (config.cachesBoundsOfCurve) {\n cache.boundsOfCurveCache[argsString!] = result;\n }\n return result;\n}\n\n/**\n * Converts arc to a bunch of cubic Bezier curves\n * @param {number} fx starting point x\n * @param {number} fy starting point y\n * @param {TParsedArcCommand} coords Arc command\n */\nexport const fromArcToBeziers = (\n fx: number,\n fy: number,\n [_, rx, ry, rot, large, sweep, tx, ty]: TParsedArcCommand,\n): TParsedAbsoluteCubicCurveCommand[] => {\n const segsNorm = arcToSegments(tx - fx, ty - fy, rx, ry, large, sweep, rot);\n\n for (let i = 0, len = segsNorm.length; i < len; i++) {\n segsNorm[i][1] += fx;\n segsNorm[i][2] += fy;\n segsNorm[i][3] += fx;\n segsNorm[i][4] += fy;\n segsNorm[i][5] += fx;\n segsNorm[i][6] += fy;\n }\n return segsNorm;\n};\n\n/**\n * This function takes a parsed SVG path and makes it simpler for fabricJS logic.\n * Simplification consist of:\n * - All commands converted to absolute (lowercase to uppercase)\n * - S converted to C\n * - T converted to Q\n * - A converted to C\n * @param {TComplexPathData} path the array of commands of a parsed SVG path for `Path`\n * @return {TSimplePathData} the simplified array of commands of a parsed SVG path for `Path`\n * TODO: figure out how to remove the type assertions in a nice way\n */\nexport const makePathSimpler = (path: TComplexPathData): TSimplePathData => {\n // x and y represent the last point of the path, AKA the previous command point.\n // we add them to each relative command to make it an absolute comment.\n // we also swap the v V h H with L, because are easier to transform.\n let x = 0,\n y = 0;\n // x1 and y1 represent the last point of the subpath. the subpath is started with\n // m or M command. When a z or Z command is drawn, x and y need to be resetted to\n // the last x1 and y1.\n let x1 = 0,\n y1 = 0;\n // previous will host the letter of the previous command, to handle S and T.\n // controlX and controlY will host the previous reflected control point\n const destinationPath: TSimplePathData = [];\n let previous,\n // placeholders\n controlX = 0,\n controlY = 0;\n for (const parsedCommand of path) {\n const current: TComplexParsedCommand = [...parsedCommand];\n let converted: TSimpleParsedCommand | undefined;\n switch (\n current[0] // first letter\n ) {\n case 'l': // lineto, relative\n current[1] += x;\n current[2] += y;\n // falls through\n case 'L':\n x = current[1];\n y = current[2];\n converted = ['L', x, y];\n break;\n case 'h': // horizontal lineto, relative\n current[1] += x;\n // falls through\n case 'H':\n x = current[1];\n converted = ['L', x, y];\n break;\n case 'v': // vertical lineto, relative\n current[1] += y;\n // falls through\n case 'V':\n y = current[1];\n converted = ['L', x, y];\n break;\n case 'm': // moveTo, relative\n current[1] += x;\n current[2] += y;\n // falls through\n case 'M':\n x = current[1];\n y = current[2];\n x1 = current[1];\n y1 = current[2];\n converted = ['M', x, y];\n break;\n case 'c': // bezierCurveTo, relative\n current[1] += x;\n current[2] += y;\n current[3] += x;\n current[4] += y;\n current[5] += x;\n current[6] += y;\n // falls through\n case 'C':\n controlX = current[3];\n controlY = current[4];\n x = current[5];\n y = current[6];\n converted = ['C', current[1], current[2], controlX, controlY, x, y];\n break;\n case 's': // shorthand cubic bezierCurveTo, relative\n current[1] += x;\n current[2] += y;\n current[3] += x;\n current[4] += y;\n // falls through\n case 'S':\n // would be sScC but since we are swapping sSc for C, we check just that.\n if (previous === 'C') {\n // calculate reflection of previous control points\n controlX = 2 * x - controlX;\n controlY = 2 * y - controlY;\n } else {\n // If there is no previous command or if the previous command was not a C, c, S, or s,\n // the control point is coincident with the current point\n controlX = x;\n controlY = y;\n }\n x = current[3];\n y = current[4];\n converted = ['C', controlX, controlY, current[1], current[2], x, y];\n // converted[3] and converted[4] are NOW the second control point.\n // we keep it for the next reflection.\n controlX = converted[3];\n controlY = converted[4];\n break;\n case 'q': // quadraticCurveTo, relative\n current[1] += x;\n current[2] += y;\n current[3] += x;\n current[4] += y;\n // falls through\n case 'Q':\n controlX = current[1];\n controlY = current[2];\n x = current[3];\n y = current[4];\n converted = ['Q', controlX, controlY, x, y];\n break;\n case 't': // shorthand quadraticCurveTo, relative\n current[1] += x;\n current[2] += y;\n // falls through\n case 'T':\n if (previous === 'Q') {\n // calculate reflection of previous control point\n controlX = 2 * x - controlX;\n controlY = 2 * y - controlY;\n } else {\n // If there is no previous command or if the previous command was not a Q, q, T or t,\n // assume the control point is coincident with the current point\n controlX = x;\n controlY = y;\n }\n x = current[1];\n y = current[2];\n converted = ['Q', controlX, controlY, x, y];\n break;\n case 'a':\n current[6] += x;\n current[7] += y;\n // falls through\n case 'A':\n fromArcToBeziers(x, y, current).forEach((b) => destinationPath.push(b));\n x = current[6];\n y = current[7];\n break;\n case 'z':\n case 'Z':\n x = x1;\n y = y1;\n converted = ['Z'];\n break;\n default:\n }\n if (converted) {\n destinationPath.push(converted);\n previous = converted[0];\n } else {\n previous = '';\n }\n }\n return destinationPath;\n};\n\n// todo verify if we can just use the point class here\n/**\n * Calc length from point x1,y1 to x2,y2\n * @param {number} x1 starting point x\n * @param {number} y1 starting point y\n * @param {number} x2 starting point x\n * @param {number} y2 starting point y\n * @return {number} length of segment\n */\nconst calcLineLength = (\n x1: number,\n y1: number,\n x2: number,\n y2: number,\n): number => Math.sqrt((x2 - x1) ** 2 + (y2 - y1) ** 2);\n\n/**\n * Get an iterator that takes a percentage and returns a point\n * @param {number} begx\n * @param {number} begy\n * @param {number} cp1x\n * @param {number} cp1y\n * @param {number} cp2x\n * @param {number} cp2y\n * @param {number} endx\n * @param {number} endy\n */\nconst getPointOnCubicBezierIterator =\n (\n begx: number,\n begy: number,\n cp1x: number,\n cp1y: number,\n cp2x: number,\n cp2y: number,\n endx: number,\n endy: number,\n ) =>\n (pct: number) => {\n const c1 = CB1(pct),\n c2 = CB2(pct),\n c3 = CB3(pct),\n c4 = CB4(pct);\n return new Point(\n endx * c1 + cp2x * c2 + cp1x * c3 + begx * c4,\n endy * c1 + cp2y * c2 + cp1y * c3 + begy * c4,\n );\n };\n\nconst QB1 = (t: number) => t ** 2;\nconst QB2 = (t: number) => 2 * t * (1 - t);\nconst QB3 = (t: number) => (1 - t) ** 2;\n\nconst getTangentCubicIterator =\n (\n p1x: number,\n p1y: number,\n p2x: number,\n p2y: number,\n p3x: number,\n p3y: number,\n p4x: number,\n p4y: number,\n ) =>\n (pct: number) => {\n const qb1 = QB1(pct),\n qb2 = QB2(pct),\n qb3 = QB3(pct),\n tangentX =\n 3 * (qb3 * (p2x - p1x) + qb2 * (p3x - p2x) + qb1 * (p4x - p3x)),\n tangentY =\n 3 * (qb3 * (p2y - p1y) + qb2 * (p3y - p2y) + qb1 * (p4y - p3y));\n return Math.atan2(tangentY, tangentX);\n };\n\nconst getPointOnQuadraticBezierIterator =\n (\n p1x: number,\n p1y: number,\n p2x: number,\n p2y: number,\n p3x: number,\n p3y: number,\n ) =>\n (pct: number) => {\n const c1 = QB1(pct),\n c2 = QB2(pct),\n c3 = QB3(pct);\n return new Point(\n p3x * c1 + p2x * c2 + p1x * c3,\n p3y * c1 + p2y * c2 + p1y * c3,\n );\n };\n\nconst getTangentQuadraticIterator =\n (\n p1x: number,\n p1y: number,\n p2x: number,\n p2y: number,\n p3x: number,\n p3y: number,\n ) =>\n (pct: number) => {\n const invT = 1 - pct,\n tangentX = 2 * (invT * (p2x - p1x) + pct * (p3x - p2x)),\n tangentY = 2 * (invT * (p2y - p1y) + pct * (p3y - p2y));\n return Math.atan2(tangentY, tangentX);\n };\n\n// this will run over a path segment (a cubic or quadratic segment) and approximate it\n// with 100 segments. This will good enough to calculate the length of the curve\nconst pathIterator = (\n iterator: (pct: number) => Point,\n x1: number,\n y1: number,\n) => {\n let tempP = new Point(x1, y1),\n tmpLen = 0;\n for (let perc = 1; perc <= 100; perc += 1) {\n const p = iterator(perc / 100);\n tmpLen += calcLineLength(tempP.x, tempP.y, p.x, p.y);\n tempP = p;\n }\n return tmpLen;\n};\n\n/**\n * Given a pathInfo, and a distance in pixels, find the percentage from 0 to 1\n * that correspond to that pixels run over the path.\n * The percentage will be then used to find the correct point on the canvas for the path.\n * @param {Array} segInfo fabricJS collection of information on a parsed path\n * @param {number} distance from starting point, in pixels.\n * @return {TPointAngle} info object with x and y ( the point on canvas ) and angle, the tangent on that point;\n */\nconst findPercentageForDistance = (\n segInfo: TCurveInfo<'Q' | 'C'>,\n distance: number,\n): TPointAngle => {\n let perc = 0,\n tmpLen = 0,\n tempP: XY = { x: segInfo.x, y: segInfo.y },\n p: XY = { ...tempP },\n nextLen: number,\n nextStep = 0.01,\n lastPerc = 0;\n // nextStep > 0.0001 covers 0.00015625 that 1/64th of 1/100\n // the path\n const iterator = segInfo.iterator,\n angleFinder = segInfo.angleFinder;\n while (tmpLen < distance && nextStep > 0.0001) {\n p = iterator(perc);\n lastPerc = perc;\n nextLen = calcLineLength(tempP.x, tempP.y, p.x, p.y);\n // compare tmpLen each cycle with distance, decide next perc to test.\n if (nextLen + tmpLen > distance) {\n // we discard this step and we make smaller steps.\n perc -= nextStep;\n nextStep /= 2;\n } else {\n tempP = p;\n perc += nextStep;\n tmpLen += nextLen;\n }\n }\n return { ...p, angle: angleFinder(lastPerc) };\n};\n\n/**\n * Run over a parsed and simplified path and extract some information (length of each command and starting point)\n * @param {TSimplePathData} path parsed path commands\n * @return {TPathSegmentInfo[]} path commands information\n */\nexport const getPathSegmentsInfo = (\n path: TSimplePathData,\n): TPathSegmentInfo[] => {\n let totalLength = 0,\n //x2 and y2 are the coords of segment start\n //x1 and y1 are the coords of the current point\n x1 = 0,\n y1 = 0,\n x2 = 0,\n y2 = 0,\n iterator,\n tempInfo: TPathSegmentInfo;\n const info: TPathSegmentInfo[] = [];\n for (const current of path) {\n const basicInfo: TPathSegmentInfoCommon = {\n x: x1,\n y: y1,\n command: current[0],\n length: 0,\n };\n switch (\n current[0] //first letter\n ) {\n case 'M':\n tempInfo = >basicInfo;\n tempInfo.x = x2 = x1 = current[1];\n tempInfo.y = y2 = y1 = current[2];\n break;\n case 'L':\n tempInfo = >basicInfo;\n tempInfo.length = calcLineLength(x1, y1, current[1], current[2]);\n x1 = current[1];\n y1 = current[2];\n break;\n case 'C':\n iterator = getPointOnCubicBezierIterator(\n x1,\n y1,\n current[1],\n current[2],\n current[3],\n current[4],\n current[5],\n current[6],\n );\n tempInfo = >basicInfo;\n tempInfo.iterator = iterator;\n tempInfo.angleFinder = getTangentCubicIterator(\n x1,\n y1,\n current[1],\n current[2],\n current[3],\n current[4],\n current[5],\n current[6],\n );\n tempInfo.length = pathIterator(iterator, x1, y1);\n\n x1 = current[5];\n y1 = current[6];\n break;\n case 'Q':\n iterator = getPointOnQuadraticBezierIterator(\n x1,\n y1,\n current[1],\n current[2],\n current[3],\n current[4],\n );\n tempInfo = >basicInfo;\n tempInfo.iterator = iterator;\n tempInfo.angleFinder = getTangentQuadraticIterator(\n x1,\n y1,\n current[1],\n current[2],\n current[3],\n current[4],\n );\n tempInfo.length = pathIterator(iterator, x1, y1);\n x1 = current[3];\n y1 = current[4];\n break;\n case 'Z':\n // we add those in order to ease calculations later\n tempInfo = basicInfo;\n tempInfo.destX = x2;\n tempInfo.destY = y2;\n tempInfo.length = calcLineLength(x1, y1, x2, y2);\n x1 = x2;\n y1 = y2;\n break;\n }\n totalLength += tempInfo.length;\n info.push(tempInfo);\n }\n info.push({ length: totalLength, x: x1, y: y1 });\n return info;\n};\n\n/**\n * Get the point on the path that is distance along the path\n * @param path\n * @param distance\n * @param infos\n */\nexport const getPointOnPath = (\n path: TSimplePathData,\n distance: number,\n infos: TPathSegmentInfo[] = getPathSegmentsInfo(path),\n): TPointAngle | undefined => {\n let i = 0;\n while (distance - infos[i].length > 0 && i < infos.length - 2) {\n distance -= infos[i].length;\n i++;\n }\n const segInfo = infos[i],\n segPercent = distance / segInfo.length,\n segment = path[i];\n\n switch (segInfo.command) {\n case 'M':\n return { x: segInfo.x, y: segInfo.y, angle: 0 };\n case 'Z':\n return {\n ...new Point(segInfo.x, segInfo.y).lerp(\n new Point(segInfo.destX, segInfo.destY),\n segPercent,\n ),\n angle: Math.atan2(segInfo.destY - segInfo.y, segInfo.destX - segInfo.x),\n };\n case 'L':\n return {\n ...new Point(segInfo.x, segInfo.y).lerp(\n new Point(segment[1]!, segment[2]!),\n segPercent,\n ),\n angle: Math.atan2(segment[2]! - segInfo.y, segment[1]! - segInfo.x),\n };\n case 'C':\n return findPercentageForDistance(segInfo, distance);\n case 'Q':\n return findPercentageForDistance(segInfo, distance);\n default:\n // throw Error('Invalid command');\n }\n};\n\nconst rePathCmdAll = new RegExp(rePathCommand, 'gi');\nconst regExpArcCommandPoints = new RegExp(reArcCommandPoints, 'g');\nconst reMyNum = new RegExp(reNum, 'gi');\nconst commandLengths = {\n m: 2,\n l: 2,\n h: 1,\n v: 1,\n c: 6,\n s: 4,\n q: 4,\n t: 2,\n a: 7,\n} as const;\n/**\n *\n * @param {string} pathString\n * @return {TComplexPathData} An array of SVG path commands\n * @example Usage\n * parsePath('M 3 4 Q 3 5 2 1 4 0 Q 9 12 2 1 4 0') === [\n * ['M', 3, 4],\n * ['Q', 3, 5, 2, 1, 4, 0],\n * ['Q', 9, 12, 2, 1, 4, 0],\n * ];\n */\nexport const parsePath = (pathString: string): TComplexPathData => {\n const chain: TComplexPathData = [];\n const all = pathString.match(rePathCmdAll) ?? [];\n for (const matchStr of all) {\n // take match string and save the first letter as the command\n const commandLetter = matchStr[0] as TComplexParsedCommandType;\n // in case of Z we have very little to do\n if (commandLetter === 'z' || commandLetter === 'Z') {\n chain.push([commandLetter]);\n continue;\n }\n const commandLength =\n commandLengths[\n commandLetter.toLowerCase() as keyof typeof commandLengths\n ];\n\n let paramArr = [];\n if (commandLetter === 'a' || commandLetter === 'A') {\n // the arc command ha some peculariaties that requires a special regex other than numbers\n // it is possible to avoid using a space between the sweep and large arc flags, making them either\n // 00, 01, 10 or 11, making them identical to a plain number for the regex reMyNum\n // reset the regexp\n regExpArcCommandPoints.lastIndex = 0;\n for (let out = null; (out = regExpArcCommandPoints.exec(matchStr)); ) {\n paramArr.push(...out.slice(1));\n }\n } else {\n paramArr = matchStr.match(reMyNum) || [];\n }\n\n // inspect the length of paramArr, if is longer than commandLength\n // we are dealing with repeated commands\n for (let i = 0; i < paramArr.length; i += commandLength) {\n const newCommand = new Array(commandLength) as TComplexParsedCommand;\n const transformedCommand = repeatedCommands[commandLetter];\n newCommand[0] =\n i > 0 && transformedCommand ? transformedCommand : commandLetter;\n for (let j = 0; j < commandLength; j++) {\n newCommand[j + 1] = parseFloat(paramArr[i + j]);\n }\n chain.push(newCommand);\n }\n }\n return chain;\n};\n\n/**\n *\n * Converts points to a smooth SVG path\n * @param {XY[]} points Array of points\n * @param {number} [correction] Apply a correction to the path (usually we use `width / 1000`). If value is undefined 0 is used as the correction value.\n * @return {(string|number)[][]} An array of SVG path commands\n */\nexport const getSmoothPathFromPoints = (\n points: Point[],\n correction = 0,\n): TSimplePathData => {\n let p1 = new Point(points[0]),\n p2 = new Point(points[1]),\n multSignX = 1,\n multSignY = 0;\n const path: TSimplePathData = [],\n len = points.length,\n manyPoints = len > 2;\n\n if (manyPoints) {\n multSignX = points[2].x < p2.x ? -1 : points[2].x === p2.x ? 0 : 1;\n multSignY = points[2].y < p2.y ? -1 : points[2].y === p2.y ? 0 : 1;\n }\n path.push([\n 'M',\n p1.x - multSignX * correction,\n p1.y - multSignY * correction,\n ]);\n let i;\n for (i = 1; i < len; i++) {\n if (!p1.eq(p2)) {\n const midPoint = p1.midPointFrom(p2);\n // p1 is our bezier control point\n // midpoint is our endpoint\n // start point is p(i-1) value.\n path.push(['Q', p1.x, p1.y, midPoint.x, midPoint.y]);\n }\n p1 = points[i];\n if (i + 1 < points.length) {\n p2 = points[i + 1];\n }\n }\n if (manyPoints) {\n multSignX = p1.x > points[i - 2].x ? 1 : p1.x === points[i - 2].x ? 0 : -1;\n multSignY = p1.y > points[i - 2].y ? 1 : p1.y === points[i - 2].y ? 0 : -1;\n }\n path.push([\n 'L',\n p1.x + multSignX * correction,\n p1.y + multSignY * correction,\n ]);\n return path;\n};\n\n/**\n * Transform a path by transforming each segment.\n * it has to be a simplified path or it won't work.\n * WARNING: this depends from pathOffset for correct operation\n * @param {TSimplePathData} path fabricJS parsed and simplified path commands\n * @param {TMat2D} transform matrix that represent the transformation\n * @param {Point} [pathOffset] `Path.pathOffset`\n * @returns {TSimplePathData} the transformed path\n */\nexport const transformPath = (\n path: TSimplePathData,\n transform: TMat2D,\n pathOffset: Point,\n): TSimplePathData => {\n if (pathOffset) {\n transform = multiplyTransformMatrices(transform, [\n 1,\n 0,\n 0,\n 1,\n -pathOffset.x,\n -pathOffset.y,\n ]);\n }\n return path.map((pathSegment) => {\n const newSegment: TSimpleParsedCommand = [...pathSegment];\n for (let i = 1; i < pathSegment.length - 1; i += 2) {\n // TODO: is there a way to get around casting to any?\n const { x, y } = transformPoint(\n {\n x: pathSegment[i] as number,\n y: pathSegment[i + 1] as number,\n },\n transform,\n );\n newSegment[i] = x;\n newSegment[i + 1] = y;\n }\n return newSegment;\n });\n};\n\n/**\n * Returns an array of path commands to create a regular polygon\n * @param {number} numVertexes\n * @param {number} radius\n * @returns {TSimplePathData} An array of SVG path commands\n */\nexport const getRegularPolygonPath = (\n numVertexes: number,\n radius: number,\n): TSimplePathData => {\n const interiorAngle = (Math.PI * 2) / numVertexes;\n // rotationAdjustment rotates the path by 1/2 the interior angle so that the polygon always has a flat side on the bottom\n // This isn't strictly necessary, but it's how we tend to think of and expect polygons to be drawn\n let rotationAdjustment = -halfPI;\n if (numVertexes % 2 === 0) {\n rotationAdjustment += interiorAngle / 2;\n }\n const d = new Array(numVertexes + 1);\n for (let i = 0; i < numVertexes; i++) {\n const rad = i * interiorAngle + rotationAdjustment;\n const { x, y } = new Point(cos(rad), sin(rad)).scalarMultiply(radius);\n d[i] = [i === 0 ? 'M' : 'L', x, y];\n }\n d[numVertexes] = ['Z'];\n return d;\n};\n\n/**\n * Join path commands to go back to svg format\n * @param {TSimplePathData} pathData fabricJS parsed path commands\n * @param {number} fractionDigits number of fraction digits to \"leave\"\n * @return {String} joined path 'M 0 0 L 20 30'\n */\nexport const joinPath = (pathData: TSimplePathData, fractionDigits?: number) =>\n pathData\n .map((segment) => {\n return segment\n .map((arg, i) => {\n if (i === 0) return arg;\n return fractionDigits === undefined\n ? arg\n : toFixed(arg, fractionDigits);\n })\n .join(' ');\n })\n .join(' ');\n","/**\n * Returns random number between 2 specified ones.\n * @param {Number} min lower limit\n * @param {Number} max upper limit\n * @return {Number} random value (between min and max)\n */\nexport const getRandomInt = (min: number, max: number): number =>\n Math.floor(Math.random() * (max - min + 1)) + min;\n","import { CENTER, SCALE_X, SCALE_Y } from '../constants';\nimport type { FabricImage } from '../shapes/Image';\nimport type { FabricObject } from '../shapes/Object/FabricObject';\nimport type { TMat2D } from '../typedefs';\nimport { qrDecompose } from './misc/matrix';\n\ntype FabricObjectWithTransformMatrix = FabricObject & {\n transformMatrix?: TMat2D;\n};\n\n/**\n * This function is an helper for svg import. it decompose the transformMatrix\n * and assign properties to object.\n * untransformed coordinates\n * @private\n */\nconst _assignTransformMatrixProps = (\n object: FabricObjectWithTransformMatrix,\n) => {\n if (object.transformMatrix) {\n const { scaleX, scaleY, angle, skewX } = qrDecompose(\n object.transformMatrix,\n );\n object.flipX = false;\n object.flipY = false;\n object.set(SCALE_X, scaleX);\n object.set(SCALE_Y, scaleY);\n object.angle = angle;\n object.skewX = skewX;\n object.skewY = 0;\n }\n};\n\n/**\n * This function is an helper for svg import. it removes the transform matrix\n * and set to object properties that fabricjs can handle\n * @private\n * @param {Object} preserveAspectRatioOptions\n */\nexport const removeTransformMatrixForSvgParsing = (\n object: FabricObjectWithTransformMatrix,\n preserveAspectRatioOptions?: any,\n) => {\n let center = object._findCenterFromElement();\n if (object.transformMatrix) {\n _assignTransformMatrixProps(object);\n center = center.transform(object.transformMatrix);\n }\n delete object.transformMatrix;\n if (preserveAspectRatioOptions) {\n object.scaleX *= preserveAspectRatioOptions.scaleX;\n object.scaleY *= preserveAspectRatioOptions.scaleY;\n (object as FabricImage).cropX = preserveAspectRatioOptions.cropX;\n (object as FabricImage).cropY = preserveAspectRatioOptions.cropY;\n center.x += preserveAspectRatioOptions.offsetLeft;\n center.y += preserveAspectRatioOptions.offsetTop;\n object.width = preserveAspectRatioOptions.width;\n object.height = preserveAspectRatioOptions.height;\n }\n object.setPositionByOrigin(center, CENTER, CENTER);\n};\n","import type { FabricObject } from '../../shapes/Object/FabricObject';\nimport { sendObjectToPlane } from './planeChange';\nimport { Group } from '../../shapes/Group';\n/**\n * Merges 2 clip paths into one visually equal clip path\n *\n * **IMPORTANT**:\\\n * Does **NOT** clone the arguments, clone them proir if necessary.\n *\n * Creates a wrapper (group) that contains one clip path and is clipped by the other so content is kept where both overlap.\n * Use this method if both the clip paths may have nested clip paths of their own, so assigning one to the other's clip path property is not possible.\n *\n * In order to handle the `inverted` property we follow logic described in the following cases:\\\n * **(1)** both clip paths are inverted - the clip paths pass the inverted prop to the wrapper and loose it themselves.\\\n * **(2)** one is inverted and the other isn't - the wrapper shouldn't become inverted and the inverted clip path must clip the non inverted one to produce an identical visual effect.\\\n * **(3)** both clip paths are not inverted - wrapper and clip paths remain unchanged.\n *\n * @param {fabric.Object} c1\n * @param {fabric.Object} c2\n * @returns {fabric.Object} merged clip path\n */\nexport const mergeClipPaths = (c1: FabricObject, c2: FabricObject) => {\n let a = c1,\n b = c2;\n if (a.inverted && !b.inverted) {\n // case (2)\n a = c2;\n b = c1;\n }\n // `b` becomes `a`'s clip path so we transform `b` to `a` coordinate plane\n sendObjectToPlane(b, b.group?.calcTransformMatrix(), a.calcTransformMatrix());\n // assign the `inverted` prop to the wrapping group\n const inverted = a.inverted && b.inverted;\n if (inverted) {\n // case (1)\n a.inverted = b.inverted = false;\n }\n return new Group([a], { clipPath: b, inverted });\n};\n","// TODO this file needs to go away, cross browser style support is not fabricjs domain.\n\n/**\n * wrapper for setting element's style\n * @param {HTMLElement} element an HTMLElement\n * @param {Object} styles to apply to element\n */\nexport function setStyle(element: HTMLElement, styles: Record) {\n const elementStyle = element.style;\n if (!elementStyle) {\n return;\n }\n Object.entries(styles).forEach(([property, value]) =>\n elementStyle.setProperty(property, value),\n );\n}\n","import { getEnv, getFabricDocument } from '../../env';\nimport type { TSize } from '../../typedefs';\nimport { createCanvasElement } from '../../util/misc/dom';\nimport { setStyle } from '../../util/internals/dom_style';\nimport type { CSSDimensions } from './util';\nimport { makeElementUnselectable, setCSSDimensions } from './util';\nimport type { CanvasItem } from './StaticCanvasDOMManager';\nimport { StaticCanvasDOMManager } from './StaticCanvasDOMManager';\nimport { setCanvasDimensions } from './util';\nimport { NONE } from '../../constants';\n\nexport class CanvasDOMManager extends StaticCanvasDOMManager {\n upper: CanvasItem;\n container: HTMLDivElement;\n\n constructor(\n arg0?: string | HTMLCanvasElement,\n {\n allowTouchScrolling = false,\n containerClass = '',\n }: {\n allowTouchScrolling?: boolean;\n /**\n * @deprecated here only for backward compatibility\n */\n containerClass?: string;\n } = {},\n ) {\n super(arg0);\n const { el: lowerCanvasEl } = this.lower;\n const upperCanvasEl = this.createUpperCanvas();\n this.upper = { el: upperCanvasEl, ctx: upperCanvasEl.getContext('2d')! };\n this.applyCanvasStyle(lowerCanvasEl, {\n allowTouchScrolling,\n });\n this.applyCanvasStyle(upperCanvasEl, {\n allowTouchScrolling,\n styles: {\n position: 'absolute',\n left: '0',\n top: '0',\n },\n });\n const container = this.createContainerElement();\n container.classList.add(containerClass);\n if (lowerCanvasEl.parentNode) {\n lowerCanvasEl.parentNode.replaceChild(container, lowerCanvasEl);\n }\n container.append(lowerCanvasEl, upperCanvasEl);\n this.container = container;\n }\n\n protected createUpperCanvas() {\n const { el: lowerCanvasEl } = this.lower;\n const el = createCanvasElement();\n // we assign the same classname of the lowerCanvas\n el.className = lowerCanvasEl.className;\n // but then we remove the lower-canvas specific className\n el.classList.remove('lower-canvas');\n // we add the specific upper-canvas class\n el.classList.add('upper-canvas');\n el.setAttribute('data-fabric', 'top');\n el.style.cssText = lowerCanvasEl.style.cssText;\n el.setAttribute('draggable', 'true');\n return el;\n }\n\n protected createContainerElement() {\n const container = getFabricDocument().createElement('div');\n container.setAttribute('data-fabric', 'wrapper');\n setStyle(container, {\n position: 'relative',\n });\n makeElementUnselectable(container);\n return container;\n }\n\n /**\n * @private\n * @param {HTMLCanvasElement} element canvas element to apply styles on\n */\n protected applyCanvasStyle(\n element: HTMLCanvasElement,\n options: {\n allowTouchScrolling?: boolean;\n styles?: Record;\n },\n ) {\n const { styles, allowTouchScrolling } = options;\n setStyle(element, {\n ...styles,\n 'touch-action': allowTouchScrolling ? 'manipulation' : NONE,\n });\n makeElementUnselectable(element);\n }\n\n setDimensions(size: TSize, retinaScaling: number) {\n super.setDimensions(size, retinaScaling);\n const { el, ctx } = this.upper;\n setCanvasDimensions(el, ctx, size, retinaScaling);\n }\n\n setCSSDimensions(size: Partial): void {\n super.setCSSDimensions(size);\n setCSSDimensions(this.upper.el, size);\n setCSSDimensions(this.container, size);\n }\n\n cleanupDOM(size: TSize) {\n const container = this.container,\n { el: lowerCanvasEl } = this.lower,\n { el: upperCanvasEl } = this.upper;\n super.cleanupDOM(size);\n container.removeChild(upperCanvasEl);\n container.removeChild(lowerCanvasEl);\n if (container.parentNode) {\n container.parentNode.replaceChild(lowerCanvasEl, container);\n }\n }\n\n dispose() {\n super.dispose();\n getEnv().dispose(this.upper.el);\n // @ts-expect-error disposing\n delete this.upper;\n // @ts-expect-error disposing\n delete this.container;\n }\n}\n","import { dragHandler } from '../controls/drag';\nimport { getActionFromCorner } from '../controls/util';\nimport { Point } from '../Point';\nimport { FabricObject } from '../shapes/Object/FabricObject';\nimport type {\n CanvasEvents,\n ModifierKey,\n TOptionalModifierKey,\n TPointerEvent,\n Transform,\n} from '../EventTypeDefs';\nimport {\n addTransformToObject,\n saveObjectTransform,\n} from '../util/misc/objectTransforms';\nimport type { TCanvasSizeOptions } from './StaticCanvas';\nimport { StaticCanvas } from './StaticCanvas';\nimport { isCollection } from '../Collection';\nimport { isTransparent } from '../util/misc/isTransparent';\nimport type {\n TMat2D,\n TOriginX,\n TOriginY,\n TSize,\n TSVGReviver,\n} from '../typedefs';\nimport { degreesToRadians } from '../util/misc/radiansDegreesConversion';\nimport { getPointer, isTouchEvent } from '../util/dom_event';\nimport type { IText } from '../shapes/IText/IText';\nimport type { BaseBrush } from '../brushes/BaseBrush';\nimport { pick } from '../util/misc/pick';\nimport { sendPointToPlane } from '../util/misc/planeChange';\nimport { cos, createCanvasElement, sin } from '../util';\nimport { CanvasDOMManager } from './DOMManagers/CanvasDOMManager';\nimport {\n BOTTOM,\n CENTER,\n LEFT,\n MODIFIED,\n RESIZING,\n RIGHT,\n ROTATE,\n SCALE,\n SCALE_X,\n SCALE_Y,\n SKEW_X,\n SKEW_Y,\n TOP,\n} from '../constants';\nimport type { CanvasOptions } from './CanvasOptions';\nimport { canvasDefaults } from './CanvasOptions';\nimport { Intersection } from '../Intersection';\nimport { isActiveSelection } from '../util/typeAssertions';\nimport { Group } from '../shapes/Group';\n\nexport type TargetsInfo = {\n target?: FabricObject;\n subTargets: FabricObject[];\n};\n\nexport type TargetsInfoWithContainer = {\n // the target we think is the most continuing the selection action.\n // could be hoveredTarget or the currently selected object\n target?: FabricObject;\n // the nested targets under the pointer for container\n subTargets: FabricObject[];\n // the container for target, or target itself if there are no selectable nested targets\n container?: FabricObject;\n};\n\nexport type FullTargetsInfoWithContainer = TargetsInfoWithContainer & {\n // hoveredTarget\n currentTarget?: FabricObject;\n // the container for hoveredTarget, or container itself\n currentContainer?: FabricObject;\n // nested targets of current container\n currentSubTargets: FabricObject[];\n};\n\n/**\n * Canvas class\n * @class Canvas\n * @extends StaticCanvas\n * @see {@link http://fabric5.fabricjs.com/fabric-intro-part-1#canvas}\n *\n * @fires object:modified at the end of a transform\n * @fires object:rotating while an object is being rotated from the control\n * @fires object:scaling while an object is being scaled by controls\n * @fires object:moving while an object is being dragged\n * @fires object:skewing while an object is being skewed from the controls\n *\n * @fires before:transform before a transform is is started\n * @fires before:selection:cleared\n * @fires selection:cleared\n * @fires selection:updated\n * @fires selection:created\n *\n * @fires path:created after a drawing operation ends and the path is added\n * @fires mouse:down\n * @fires mouse:move\n * @fires mouse:up\n * @fires mouse:down:before on mouse down, before the inner fabric logic runs\n * @fires mouse:move:before on mouse move, before the inner fabric logic runs\n * @fires mouse:up:before on mouse up, before the inner fabric logic runs\n * @fires mouse:over\n * @fires mouse:out\n * @fires mouse:dblclick whenever a native dbl click event fires on the canvas.\n *\n * @fires dragover\n * @fires dragenter\n * @fires dragleave\n * @fires drag:enter object drag enter\n * @fires drag:leave object drag leave\n * @fires drop:before before drop event. Prepare for the drop event (same native event).\n * @fires drop\n * @fires drop:after after drop event. Run logic on canvas after event has been accepted/declined (same native event).\n * @example\n * let a: fabric.Object, b: fabric.Object;\n * let flag = false;\n * canvas.add(a, b);\n * a.on('drop:before', opt => {\n * // we want a to accept the drop even though it's below b in the stack\n * flag = this.canDrop(opt.e);\n * });\n * b.canDrop = function(e) {\n * !flag && this.draggableTextDelegate.canDrop(e);\n * }\n * b.on('dragover', opt => b.set('fill', opt.dropTarget === b ? 'pink' : 'black'));\n * a.on('drop', opt => {\n * opt.e.defaultPrevented // drop occurred\n * opt.didDrop // drop occurred on canvas\n * opt.target // drop target\n * opt.target !== a && a.set('text', 'I lost');\n * });\n * canvas.on('drop:after', opt => {\n * // inform user who won\n * if(!opt.e.defaultPrevented) {\n * // no winners\n * }\n * else if(!opt.didDrop) {\n * // my objects didn't win, some other lucky object\n * }\n * else {\n * // we have a winner it's opt.target!!\n * }\n * })\n *\n * @fires after:render at the end of the render process, receives the context in the callback\n * @fires before:render at start the render process, receives the context in the callback\n *\n * @fires contextmenu:before\n * @fires contextmenu\n * @example\n * let handler;\n * targets.forEach(target => {\n * target.on('contextmenu:before', opt => {\n * // decide which target should handle the event before canvas hijacks it\n * if (someCaseHappens && opt.targets.includes(target)) {\n * handler = target;\n * }\n * });\n * target.on('contextmenu', opt => {\n * // do something fantastic\n * });\n * });\n * canvas.on('contextmenu', opt => {\n * if (!handler) {\n * // no one takes responsibility, it's always left to me\n * // let's show them how it's done!\n * }\n * });\n *\n */\nexport class SelectableCanvas\n extends StaticCanvas\n implements Omit\n{\n declare _objects: FabricObject[];\n\n // transform config\n declare uniformScaling: boolean;\n declare uniScaleKey: TOptionalModifierKey;\n declare centeredScaling: boolean;\n declare centeredRotation: boolean;\n declare centeredKey: TOptionalModifierKey;\n declare altActionKey: TOptionalModifierKey;\n\n // selection config\n declare selection: boolean;\n declare selectionKey: TOptionalModifierKey | ModifierKey[];\n declare altSelectionKey: TOptionalModifierKey;\n declare selectionColor: string;\n declare selectionDashArray: number[];\n declare selectionBorderColor: string;\n declare selectionLineWidth: number;\n declare selectionFullyContained: boolean;\n\n // cursors\n declare hoverCursor: CSSStyleDeclaration['cursor'];\n declare moveCursor: CSSStyleDeclaration['cursor'];\n declare defaultCursor: CSSStyleDeclaration['cursor'];\n declare freeDrawingCursor: CSSStyleDeclaration['cursor'];\n declare notAllowedCursor: CSSStyleDeclaration['cursor'];\n\n declare containerClass: string;\n\n // target find config\n declare perPixelTargetFind: boolean;\n declare targetFindTolerance: number;\n declare skipTargetFind: boolean;\n\n /**\n * When true, mouse events on canvas (mousedown/mousemove/mouseup) result in free drawing.\n * After mousedown, mousemove creates a shape,\n * and then mouseup finalizes it and adds an instance of `fabric.Path` onto canvas.\n * @see {@link http://fabric5.fabricjs.com/fabric-intro-part-4#free_drawing}\n * @type Boolean\n */\n declare isDrawingMode: boolean;\n\n declare preserveObjectStacking: boolean;\n\n /**\n * 启用双击锁定组对象,锁定后只能选择对象的子节点,无论group中interative和subTargetCheck是否启用\n * @type Boolean\n * @default\n */\n declare dblClickIsolateObject: boolean;\n\n /**\n * 双击锁定的节点, 目前只支持组节点\n * @type Group | null\n * @default\n */\n isolatedObject: Group | null;\n\n /**\n * 指定的搜索对象\n * @type Boolean\n * @default null\n */\n _searchTargets: FabricObject[] | null;\n\n // event config\n declare stopContextMenu: boolean;\n declare fireRightClick: boolean;\n declare fireMiddleClick: boolean;\n\n /**\n * Keep track of the hovered target in the previous event\n * @type FabricObject | null\n * @private\n */\n declare _hoveredTarget?: FabricObject;\n\n /**\n * hold the list of nested targets hovered in the previous events\n * @type FabricObject[]\n * @private\n */\n _hoveredTargets: FabricObject[] = [];\n\n /**\n * hold the list of objects to render\n * @type FabricObject[]\n * @private\n */\n declare _objectsToRender?: FabricObject[];\n\n /**\n * hold a reference to a data structure that contains information\n * on the current on going transform\n * @type\n * @private\n */\n _currentTransform: Transform | null = null;\n\n /**\n * hold a reference to a data structure used to track the selection\n * box on canvas drag\n * on the current on going transform\n * x, y, deltaX and deltaY are in scene plane\n * @type\n * @private\n */\n protected _groupSelector: {\n x: number;\n y: number;\n deltaX: number;\n deltaY: number;\n } | null = null;\n\n /**\n * internal flag used to understand if the context top requires a cleanup\n * in case this is true, the contextTop will be cleared at the next render\n * @type boolean\n * @private\n */\n contextTopDirty = false;\n\n /**\n * During a mouse event we may need the pointer multiple times in multiple functions.\n * _scenePoint holds a reference to the pointer in fabricCanvas/design coordinates that is valid for the event\n * lifespan. Every fabricJS mouse event create and delete the cache every time\n * We do this because there are some HTML DOM inspection functions to get the actual pointer coordinates\n * @type {Point}\n */\n protected declare _scenePoint?: Point;\n\n /**\n * During a mouse event we may need the pointer multiple times in multiple functions.\n * _viewportPoint holds a reference to the pointer in html coordinates that is valid for the event\n * lifespan. Every fabricJS mouse event create and delete the cache every time\n * We do this because there are some HTML DOM inspection functions to get the actual pointer coordinates\n * @type {Point}\n */\n protected declare _viewportPoint?: Point;\n\n /**\n * Holds the informations we cache during an event lifespan\n * This data is needed many times during an event and we want to avoid to recalculate it\n * multuple times.\n */\n protected declare _targetInfo: FullTargetsInfoWithContainer | undefined;\n\n static ownDefaults = canvasDefaults;\n\n static getDefaults(): Record {\n return { ...super.getDefaults(), ...SelectableCanvas.ownDefaults };\n }\n\n declare elements: CanvasDOMManager;\n get upperCanvasEl() {\n return this.elements.upper?.el;\n }\n get contextTop() {\n return this.elements.upper?.ctx;\n }\n get wrapperEl() {\n return this.elements.container;\n }\n private declare pixelFindCanvasEl: HTMLCanvasElement;\n private declare pixelFindContext: CanvasRenderingContext2D;\n\n protected declare _isCurrentlyDrawing: boolean;\n declare freeDrawingBrush?: BaseBrush;\n declare _activeObject?: FabricObject;\n\n protected initElements(el?: string | HTMLCanvasElement) {\n this.elements = new CanvasDOMManager(el, {\n allowTouchScrolling: this.allowTouchScrolling,\n containerClass: this.containerClass,\n });\n this._createCacheCanvas();\n }\n\n /**\n * @private\n * @param {FabricObject} obj Object that was added\n */\n _onObjectAdded(obj: FabricObject) {\n this._objectsToRender = undefined;\n super._onObjectAdded(obj);\n }\n\n /**\n * @private\n * @param {FabricObject} obj Object that was removed\n */\n _onObjectRemoved(obj: FabricObject) {\n this._objectsToRender = undefined;\n // removing active object should fire \"selection:cleared\" events\n if (obj === this._activeObject) {\n this.fire('before:selection:cleared', { deselected: [obj] });\n this._discardActiveObject();\n this.fire('selection:cleared', { deselected: [obj] });\n obj.fire('deselected', {\n target: obj,\n });\n }\n if (obj === this._hoveredTarget) {\n this._hoveredTarget = undefined;\n this._hoveredTargets = [];\n }\n super._onObjectRemoved(obj);\n }\n\n _onStackOrderChanged() {\n this._objectsToRender = undefined;\n super._onStackOrderChanged();\n }\n\n /**\n * Divides objects in two groups, one to render immediately\n * and one to render as activeGroup.\n * @return {Array} objects to render immediately and pushes the other in the activeGroup.\n */\n _chooseObjectsToRender(): FabricObject[] {\n const activeObject = this._activeObject;\n return !this.preserveObjectStacking && activeObject\n ? this._objects\n .filter((object) => !object.group && object !== activeObject)\n .concat(activeObject)\n : this._objects;\n }\n\n /**\n * Renders both the top canvas and the secondary container canvas.\n */\n renderAll() {\n this.cancelRequestedRender();\n if (this.destroyed) {\n return;\n }\n if (this.contextTopDirty && !this._groupSelector && !this.isDrawingMode) {\n this.clearContext(this.contextTop);\n this.contextTopDirty = false;\n }\n if (this.hasLostContext) {\n this.renderTopLayer(this.contextTop);\n this.hasLostContext = false;\n }\n !this._objectsToRender &&\n (this._objectsToRender = this._chooseObjectsToRender());\n this.renderCanvas(this.getContext(), this._objectsToRender);\n }\n\n /**\n * text selection is rendered by the active text instance during the rendering cycle\n */\n renderTopLayer(ctx: CanvasRenderingContext2D): void {\n ctx.save();\n if (this.isDrawingMode && this._isCurrentlyDrawing) {\n this.freeDrawingBrush && this.freeDrawingBrush._render();\n this.contextTopDirty = true;\n }\n // we render the top context - last object\n if (this.selection && this._groupSelector) {\n this._drawSelection(ctx);\n this.contextTopDirty = true;\n }\n ctx.restore();\n }\n\n /**\n * Method to render only the top canvas.\n * Also used to render the group selection box.\n * Does not render text selection.\n */\n renderTop() {\n const ctx = this.contextTop;\n this.clearContext(ctx);\n this.renderTopLayer(ctx);\n // todo: how do i know if the after:render is for the top or normal contex?\n this.fire('after:render', { ctx });\n }\n\n /**\n * Set the canvas tolerance value for pixel taret find.\n * Use only integer numbers.\n * @private\n */\n setTargetFindTolerance(value: number) {\n value = Math.round(value);\n this.targetFindTolerance = value;\n const retina = this.getRetinaScaling();\n const size = Math.ceil((value * 2 + 1) * retina);\n this.pixelFindCanvasEl.width = this.pixelFindCanvasEl.height = size;\n this.pixelFindContext.scale(retina, retina);\n }\n\n /**\n * Returns true if object is transparent at a certain location\n * Clarification: this is `is target transparent at location X or are controls there`\n * @TODO this seems dumb that we treat controls with transparency. we can find controls\n * programmatically without painting them, the cache canvas optimization is always valid\n * @param {FabricObject} target Object to check\n * @param {Number} x Left coordinate in viewport space\n * @param {Number} y Top coordinate in viewport space\n * @return {Boolean}\n */\n isTargetTransparent(target: FabricObject, x: number, y: number): boolean {\n const tolerance = this.targetFindTolerance;\n const ctx = this.pixelFindContext;\n this.clearContext(ctx);\n ctx.save();\n ctx.translate(-x + tolerance, -y + tolerance);\n ctx.transform(...this.viewportTransform);\n const selectionBgc = target.selectionBackgroundColor;\n target.selectionBackgroundColor = '';\n target.render(ctx);\n target.selectionBackgroundColor = selectionBgc;\n ctx.restore();\n // our canvas is square, and made around tolerance.\n // so tolerance in this case also represent the center of the canvas.\n const enhancedTolerance = Math.round(tolerance * this.getRetinaScaling());\n return isTransparent(\n ctx,\n enhancedTolerance,\n enhancedTolerance,\n enhancedTolerance,\n );\n }\n\n /**\n * takes an event and determines if selection key has been pressed\n * @private\n * @param {TPointerEvent} e Event object\n */\n _isSelectionKeyPressed(e: TPointerEvent): boolean {\n const sKey = this.selectionKey;\n if (!sKey) {\n return false;\n }\n if (Array.isArray(sKey)) {\n return !!sKey.find((key) => !!key && e[key] === true);\n } else {\n return e[sKey];\n }\n }\n\n /**\n * @private\n * @param {TPointerEvent} e Event object\n * @param {FabricObject} target\n */\n _shouldClearSelection(\n e: TPointerEvent,\n target?: FabricObject,\n ): target is undefined {\n const activeObjects = this.getActiveObjects(),\n activeObject = this._activeObject;\n\n return !!(\n !target ||\n (target &&\n activeObject &&\n activeObjects.length > 1 &&\n activeObjects.indexOf(target) === -1 &&\n activeObject !== target &&\n !this._isSelectionKeyPressed(e)) ||\n (target && !target.evented) ||\n (target && !target.selectable && activeObject && activeObject !== target)\n );\n }\n\n /**\n * This method will take in consideration a modifier key pressed and the control we are\n * about to drag, and try to guess the anchor point ( origin ) of the transormation.\n * This should be really in the realm of controls, and we should remove specific code for legacy\n * embedded actions.\n * @TODO this probably deserve discussion/rediscovery and change/refactor\n * @private\n * @deprecated\n * @param {FabricObject} target\n * @param {string} action\n * @param {boolean} altKey\n * @returns {boolean} true if the transformation should be centered\n */\n private _shouldCenterTransform(\n target: FabricObject,\n action: string,\n modifierKeyPressed: boolean,\n ) {\n if (!target) {\n return;\n }\n\n let centerTransform;\n\n if (\n action === SCALE ||\n action === SCALE_X ||\n action === SCALE_Y ||\n action === RESIZING\n ) {\n centerTransform = this.centeredScaling || target.centeredScaling;\n } else if (action === ROTATE) {\n centerTransform = this.centeredRotation || target.centeredRotation;\n }\n\n return centerTransform ? !modifierKeyPressed : modifierKeyPressed;\n }\n\n /**\n * Given the control clicked, determine the origin of the transform.\n * This is bad because controls can totally have custom names\n * should disappear before release 4.0\n * @private\n * @deprecated\n */\n _getOriginFromCorner(\n target: FabricObject,\n controlName: string,\n ): { x: TOriginX; y: TOriginY } {\n const origin = {\n x: target.originX,\n y: target.originY,\n };\n\n if (!controlName) {\n return origin;\n }\n\n // is a left control ?\n if (['ml', 'tl', 'bl'].includes(controlName)) {\n origin.x = RIGHT;\n // is a right control ?\n } else if (['mr', 'tr', 'br'].includes(controlName)) {\n origin.x = LEFT;\n }\n // is a top control ?\n if (['tl', 'mt', 'tr'].includes(controlName)) {\n origin.y = BOTTOM;\n // is a bottom control ?\n } else if (['bl', 'mb', 'br'].includes(controlName)) {\n origin.y = TOP;\n }\n return origin;\n }\n\n /**\n * @private\n * @param {Event} e Event object\n * @param {FabricObject} target\n * @param {boolean} [alreadySelected] pass true to setup the active control\n */\n _setupCurrentTransform(\n e: TPointerEvent,\n target: FabricObject,\n alreadySelected: boolean,\n ): void {\n const pointer = target.group\n ? // transform pointer to target's containing coordinate plane\n sendPointToPlane(\n this.getScenePoint(e),\n undefined,\n target.group.calcTransformMatrix(),\n )\n : this.getScenePoint(e);\n const { key: corner = '', control } = target.getActiveControl() || {},\n actionHandler =\n alreadySelected && control\n ? control.getActionHandler(e, target, control)?.bind(control)\n : dragHandler,\n action = getActionFromCorner(alreadySelected, corner, e, target),\n altKey = e[this.centeredKey as ModifierKey],\n origin = this._shouldCenterTransform(target, action, altKey)\n ? ({ x: CENTER, y: CENTER } as const)\n : this._getOriginFromCorner(target, corner),\n /**\n * relative to target's containing coordinate plane\n * both agree on every point\n **/\n transform: Transform = {\n target: target,\n action,\n actionHandler,\n actionPerformed: false,\n corner,\n scaleX: target.scaleX,\n scaleY: target.scaleY,\n skewX: target.skewX,\n skewY: target.skewY,\n offsetX: pointer.x - target.left,\n offsetY: pointer.y - target.top,\n originX: origin.x,\n originY: origin.y,\n ex: pointer.x,\n ey: pointer.y,\n lastX: pointer.x,\n lastY: pointer.y,\n theta: degreesToRadians(target.angle),\n width: target.width,\n height: target.height,\n shiftKey: e.shiftKey,\n altKey,\n original: {\n ...saveObjectTransform(target),\n originX: origin.x,\n originY: origin.y,\n },\n };\n\n this._currentTransform = transform;\n\n this.fire('before:transform', {\n e,\n transform,\n });\n }\n\n /**\n * Set the cursor type of the canvas element\n * @param {String} value Cursor type of the canvas element.\n * @see http://www.w3.org/TR/css3-ui/#cursor\n */\n setCursor(value: CSSStyleDeclaration['cursor']): void {\n this.upperCanvasEl.style.cursor = value;\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx to draw the selection on\n */\n _drawSelection(ctx: CanvasRenderingContext2D): void {\n const { x, y, deltaX, deltaY } = this._groupSelector!,\n start = new Point(x, y).transform(this.viewportTransform),\n extent = new Point(x + deltaX, y + deltaY).transform(\n this.viewportTransform,\n ),\n strokeOffset = this.selectionLineWidth / 2;\n let minX = Math.min(start.x, extent.x),\n minY = Math.min(start.y, extent.y),\n maxX = Math.max(start.x, extent.x),\n maxY = Math.max(start.y, extent.y);\n\n if (this.selectionColor) {\n ctx.fillStyle = this.selectionColor;\n ctx.fillRect(minX, minY, maxX - minX, maxY - minY);\n }\n\n if (!this.selectionLineWidth || !this.selectionBorderColor) {\n return;\n }\n ctx.lineWidth = this.selectionLineWidth;\n ctx.strokeStyle = this.selectionBorderColor;\n\n minX += strokeOffset;\n minY += strokeOffset;\n maxX -= strokeOffset;\n maxY -= strokeOffset;\n // selection border\n // @TODO: is _setLineDash still necessary on modern canvas?\n FabricObject.prototype._setLineDash.call(\n this,\n ctx,\n this.selectionDashArray,\n );\n ctx.strokeRect(minX, minY, maxX - minX, maxY - minY);\n }\n\n /**\n * 双击选择\n * @param e\n * @returns\n */\n dblClickLock(e: TPointerEvent): boolean {\n if (this.dblClickIsolateObject) {\n const pointer = this.getScenePoint(e);\n const objects = this.isolatedObject\n ? this.isolatedObject.getObjects()\n : this.getObjects();\n const obj = this.searchPossibleTargets(objects, pointer);\n if (obj.target) {\n if (obj.target instanceof Group) {\n // 组才修改锁定\n this.isolatedObject = obj.target;\n this.discardActiveObject();\n // 新创建的组对象,子节点coords初始化,否则无法选中\n obj.target._objects.forEach((o) => {\n o.setCoords();\n });\n } else {\n // 非组对象不处理锁定,返回false继续对象自己的双击事件\n return false;\n }\n } else {\n // 取消锁定\n this.isolatedObject = null;\n this.discardActiveObject();\n }\n return true;\n }\n return false;\n }\n\n /**\n * 设置搜索对象\n * 如当编辑path时,设置点为可搜索对象\n * @param objects\n */\n setSearchTargets(objects: FabricObject[] | null) {\n this._searchTargets = objects;\n }\n\n /**\n * 返回搜索对象\n * @returns\n */\n getSearchTargets() {\n return (\n this._searchTargets ||\n (this.isolatedObject ? this.isolatedObject._objects : this._objects)\n );\n }\n\n /**\n * Method that determines what object we are clicking on\n * 11/09/2018 TODO: would be cool if findTarget could discern between being a full target\n * or the outside part of the corner.\n * @param {Event} e mouse event\n * @return {TargetsInfoWithContainer} the target found\n */\n findTarget(e: TPointerEvent): FullTargetsInfoWithContainer {\n // this._targetInfo is cached by _cacheTransformEventData\n // and destroyed by _resetTransformEventData\n if (this._targetInfo) {\n return this._targetInfo;\n }\n\n if (this.skipTargetFind) {\n return {\n subTargets: [],\n currentSubTargets: [],\n };\n }\n\n const pointer = this.getScenePoint(e),\n activeObject = this._activeObject,\n aObjects = this.getActiveObjects(),\n targetInfo = this.searchPossibleTargets(this.getSearchTargets(), pointer);\n\n const {\n subTargets: currentSubTargets,\n container: currentContainer,\n target: currentTarget,\n } = targetInfo;\n\n const fullTargetInfo: FullTargetsInfoWithContainer = {\n ...targetInfo,\n currentSubTargets,\n currentContainer,\n currentTarget,\n };\n\n // simplest case no active object, return a new target\n if (!activeObject) {\n return fullTargetInfo;\n }\n\n // check pointer is over active selection and possibly perform `subTargetCheck`\n const activeObjectTargetInfo: FullTargetsInfoWithContainer = {\n ...this.searchPossibleTargets([activeObject], pointer),\n currentSubTargets,\n currentContainer,\n currentTarget,\n };\n\n const activeObjectControl = activeObject.findControl(\n this.getViewportPoint(e),\n isTouchEvent(e),\n );\n\n // we are clicking exactly the control of an active object, shortcut to that object.\n if (activeObjectControl) {\n return {\n ...activeObjectTargetInfo,\n target: activeObject, // we override target in case we are in the outside part of the corner.\n };\n }\n\n // in case we are over the active object\n if (activeObjectTargetInfo.target) {\n if (aObjects.length > 1) {\n // in case of active selection and target hit over the activeSelection, just exit\n // TODO Verify if we need to override target with container\n return activeObjectTargetInfo;\n }\n // from here onward not an active selection, just an activeOject that maybe is a group\n\n // preserveObjectStacking is false, so activeObject is drawn on top, just return activeObject\n if (!this.preserveObjectStacking) {\n // TODO Verify if we need to override target with container\n return activeObjectTargetInfo;\n }\n\n // In case we are in preserveObjectStacking ( selection in stack )\n // there is the possibility to force with `altSelectionKey` to return the activeObject\n // from any point in the stack, even if we have another object completely on top of it.\n if (\n this.preserveObjectStacking &&\n e[this.altSelectionKey as ModifierKey]\n ) {\n // TODO Verify if we need to override target with container\n return activeObjectTargetInfo;\n }\n }\n\n // we have an active object, but we ruled out it being our target in any way.\n return fullTargetInfo;\n }\n\n /**\n * Checks if the point is inside the object selection area including padding\n * @param {FabricObject} obj Object to test against\n * @param {Object} [pointer] point in scene coordinates\n * @return {Boolean} true if point is contained within an area of given object\n * @private\n */\n private _pointIsInObjectSelectionArea(obj: FabricObject, point: Point) {\n // getCoords will already take care of group de-nesting\n let coords = obj.getCoords();\n const viewportZoom = this.getZoom();\n const padding = obj.padding / viewportZoom;\n if (padding) {\n const [tl, tr, br, bl] = coords;\n // what is the angle of the object?\n // we could use getTotalAngle, but is way easier to look at it\n // from how coords are oriented, since if something went wrong\n // at least we are consistent.\n const angleRadians = Math.atan2(tr.y - tl.y, tr.x - tl.x),\n cosP = cos(angleRadians) * padding,\n sinP = sin(angleRadians) * padding,\n cosPSinP = cosP + sinP,\n cosPMinusSinP = cosP - sinP;\n\n coords = [\n new Point(tl.x - cosPMinusSinP, tl.y - cosPSinP),\n new Point(tr.x + cosPSinP, tr.y - cosPMinusSinP),\n new Point(br.x + cosPMinusSinP, br.y + cosPSinP),\n new Point(bl.x - cosPSinP, bl.y + cosPMinusSinP),\n ];\n // in case of padding we calculate the new coords on the fly.\n // otherwise we have to maintain 2 sets of coordinates for everything.\n // we can reiterate on storing them.\n // if this is slow, for now the semplification is large and doesn't impact\n // rendering.\n // the idea behind this is that outside target check we don't need ot know\n // where those coords are\n }\n return Intersection.isPointInPolygon(point, coords);\n }\n\n /**\n * Checks point is inside the object selection condition. Either area with padding\n * or over pixels if perPixelTargetFind is enabled\n * @param {FabricObject} obj Object to test against\n * @param {Point} pointer point from scene.\n * @return {Boolean} true if point is contained within an area of given object\n * @private\n */\n _checkTarget(obj: FabricObject, pointer: Point): boolean {\n if (\n obj &&\n obj.visible &&\n obj.evented &&\n this._pointIsInObjectSelectionArea(obj, pointer)\n ) {\n if (\n (this.perPixelTargetFind || obj.perPixelTargetFind) &&\n !(obj as unknown as IText).isEditing\n ) {\n const viewportPoint = pointer.transform(this.viewportTransform);\n if (!this.isTargetTransparent(obj, viewportPoint.x, viewportPoint.y)) {\n return true;\n }\n } else {\n return true;\n }\n }\n return false;\n }\n\n /**\n * Given an array of objects search possible targets under the pointer position\n * Returns an\n * @param {Array} objects objects array to look into\n * @param {Object} pointer x,y object of point of scene coordinates we want to check.\n * @param {Object} subTargets If passed, subtargets will be collected inside the array\n * @return {TargetsInfo} **top most object from given `objects`** that contains pointer\n * @private\n */\n _searchPossibleTargets(\n objects: FabricObject[],\n pointer: Point,\n subTargets: FabricObject[],\n ): TargetsInfo {\n let i = objects.length;\n // Do not check for currently grouped objects, since we check the parent group itself.\n // until we call this function specifically to search inside the activeGroup\n while (i--) {\n const target = objects[i];\n if (this._checkTarget(target, pointer)) {\n // 没有开启双击锁定节点才搜索子节点\n if (\n !this.dblClickIsolateObject &&\n isCollection(target) &&\n target.subTargetCheck\n ) {\n const { target: subTarget } = this._searchPossibleTargets(\n target._objects,\n pointer,\n subTargets,\n );\n subTarget && subTargets.push(subTarget);\n }\n return {\n target,\n subTargets,\n };\n }\n }\n return {\n subTargets: [],\n };\n }\n\n /**\n * Search inside an objects array the fiurst object that contains pointer\n * Collect subTargets of that object inside the subTargets array passed as parameter\n * @param {FabricObject[]} objects objects array to look into\n * @param {Point} pointer coordinates from viewport to check.\n * @return {FabricObject} **top most object on screen** that contains pointer\n */\n searchPossibleTargets(\n objects: FabricObject[],\n pointer: Point,\n ): TargetsInfoWithContainer {\n const targetInfo: TargetsInfoWithContainer = this._searchPossibleTargets(\n objects,\n pointer,\n [],\n );\n\n // outermost target is the container.\n targetInfo.container = targetInfo.target;\n const { container, subTargets } = targetInfo;\n\n if (\n container &&\n isCollection(container) &&\n container.interactive &&\n subTargets[0]\n ) {\n /** subTargets[0] is the innermost nested target, but it could be inside non interactive groups\n * and so not a possible selection target.\n * We loop the array from the end that is outermost innertarget.\n */\n for (let i = subTargets.length - 1; i > 0; i--) {\n const t = subTargets[i];\n if (!(isCollection(t) && t.interactive)) {\n // one of the subtargets was not interactive. that is the last subtarget we can return.\n // we can't dig more deep;\n targetInfo.target = t;\n return targetInfo;\n }\n }\n targetInfo.target = subTargets[0];\n return targetInfo;\n }\n\n return targetInfo;\n }\n\n /**\n * @returns point existing in the same plane as the {@link HTMLCanvasElement},\n * `(0, 0)` being the top left corner of the {@link HTMLCanvasElement}.\n * This means that changes to the {@link viewportTransform} do not change the values of the point\n * and it remains unchanged from the viewer's perspective.\n *\n * @example\n * const scenePoint = sendPointToPlane(\n * this.getViewportPoint(e),\n * undefined,\n * canvas.viewportTransform\n * );\n *\n */\n getViewportPoint(e: TPointerEvent) {\n if (this._viewportPoint) {\n return this._viewportPoint;\n }\n return this._getPointerImpl(e, true);\n }\n\n /**\n * @returns point existing in the scene (the same plane as the plane {@link FabricObject#getCenterPoint} exists in).\n * This means that changes to the {@link viewportTransform} do not change the values of the point,\n * however, from the viewer's perspective, the point is changed.\n *\n * @example\n * const viewportPoint = sendPointToPlane(\n * this.getScenePoint(e),\n * canvas.viewportTransform\n * );\n *\n */\n getScenePoint(e: TPointerEvent) {\n if (this._scenePoint) {\n return this._scenePoint;\n }\n return this._getPointerImpl(e);\n }\n\n /**\n * Returns pointer relative to canvas.\n *\n * Use {@link getViewportPoint} or {@link getScenePoint} instead.\n *\n * @param {Event} e\n * @param {Boolean} [fromViewport] whether to return the point from the viewport or in the scene\n * @return {Point}\n */\n protected _getPointerImpl(e: TPointerEvent, fromViewport = false): Point {\n const upperCanvasEl = this.upperCanvasEl,\n bounds = upperCanvasEl.getBoundingClientRect();\n let pointer = getPointer(e),\n boundsWidth = bounds.width || 0,\n boundsHeight = bounds.height || 0;\n\n if (!boundsWidth || !boundsHeight) {\n if (TOP in bounds && BOTTOM in bounds) {\n boundsHeight = Math.abs(bounds.top - bounds.bottom);\n }\n if (RIGHT in bounds && LEFT in bounds) {\n boundsWidth = Math.abs(bounds.right - bounds.left);\n }\n }\n\n this.calcOffset();\n pointer.x = pointer.x - this._offset.left;\n pointer.y = pointer.y - this._offset.top;\n if (!fromViewport) {\n pointer = sendPointToPlane(pointer, undefined, this.viewportTransform);\n }\n\n const retinaScaling = this.getRetinaScaling();\n if (retinaScaling !== 1) {\n pointer.x /= retinaScaling;\n pointer.y /= retinaScaling;\n }\n\n // If bounds are not available (i.e. not visible), do not apply scale.\n const cssScale =\n boundsWidth === 0 || boundsHeight === 0\n ? new Point(1, 1)\n : new Point(\n upperCanvasEl.width / boundsWidth,\n upperCanvasEl.height / boundsHeight,\n );\n\n return pointer.multiply(cssScale);\n }\n\n /**\n * Internal use only\n * @protected\n */\n protected _setDimensionsImpl(\n dimensions: TSize,\n options?: TCanvasSizeOptions,\n ) {\n // @ts-expect-error this method exists in the subclass - should be moved or declared as abstract\n this._resetTransformEventData();\n super._setDimensionsImpl(dimensions, options);\n if (this._isCurrentlyDrawing) {\n this.freeDrawingBrush &&\n this.freeDrawingBrush._setBrushStyles(this.contextTop);\n }\n }\n\n protected _createCacheCanvas() {\n this.pixelFindCanvasEl = createCanvasElement();\n this.pixelFindContext = this.pixelFindCanvasEl.getContext('2d', {\n willReadFrequently: true,\n })!;\n this.setTargetFindTolerance(this.targetFindTolerance);\n }\n\n /**\n * Returns context of top canvas where interactions are drawn\n * @returns {CanvasRenderingContext2D}\n */\n getTopContext(): CanvasRenderingContext2D {\n return this.elements.upper.ctx;\n }\n\n /**\n * Returns context of canvas where object selection is drawn\n * @alias\n * @return {CanvasRenderingContext2D}\n */\n getSelectionContext(): CanvasRenderingContext2D {\n return this.elements.upper.ctx;\n }\n\n /**\n * Returns <canvas> element on which object selection is drawn\n * @return {HTMLCanvasElement}\n */\n getSelectionElement(): HTMLCanvasElement {\n return this.elements.upper.el;\n }\n\n /**\n * Returns currently active object\n * @return {FabricObject | null} active object\n */\n getActiveObject(): FabricObject | undefined {\n return this._activeObject;\n }\n\n /**\n * Returns an array with the current selected objects\n * @return {FabricObject[]} active objects array\n */\n getActiveObjects(): FabricObject[] {\n const active = this._activeObject;\n return isActiveSelection(active)\n ? active.getObjects()\n : active\n ? [active]\n : [];\n }\n\n /**\n * @private\n * Compares the old activeObject with the current one and fires correct events\n * @param {FabricObject[]} oldObjects old activeObject\n * @param {TPointerEvent} e mouse event triggering the selection events\n */\n _fireSelectionEvents(oldObjects: FabricObject[], e?: TPointerEvent) {\n let somethingChanged = false,\n invalidate = false;\n const objects = this.getActiveObjects(),\n added: FabricObject[] = [],\n removed: FabricObject[] = [];\n\n oldObjects.forEach((target) => {\n if (!objects.includes(target)) {\n somethingChanged = true;\n target.fire('deselected', {\n e,\n target,\n });\n removed.push(target);\n }\n });\n\n objects.forEach((target) => {\n if (!oldObjects.includes(target)) {\n somethingChanged = true;\n target.fire('selected', {\n e,\n target,\n });\n added.push(target);\n }\n });\n\n if (oldObjects.length > 0 && objects.length > 0) {\n invalidate = true;\n somethingChanged &&\n this.fire('selection:updated', {\n e,\n selected: added,\n deselected: removed,\n });\n } else if (objects.length > 0) {\n invalidate = true;\n this.fire('selection:created', {\n e,\n selected: added,\n });\n } else if (oldObjects.length > 0) {\n invalidate = true;\n this.fire('selection:cleared', {\n e,\n deselected: removed,\n });\n }\n invalidate && (this._objectsToRender = undefined);\n }\n\n /**\n * Sets given object as the only active object on canvas\n * @param {FabricObject} object Object to set as an active one\n * @param {TPointerEvent} [e] Event (passed along when firing \"object:selected\")\n * @return {Boolean} true if the object has been selected\n */\n setActiveObject(object: FabricObject, e?: TPointerEvent) {\n // we can't inline this, since _setActiveObject will change what getActiveObjects returns\n const currentActives = this.getActiveObjects();\n const selected = this._setActiveObject(object, e);\n this._fireSelectionEvents(currentActives, e);\n return selected;\n }\n\n /**\n * This is supposed to be equivalent to setActiveObject but without firing\n * any event. There is commitment to have this stay this way.\n * This is the functional part of setActiveObject.\n * @param {Object} object to set as active\n * @param {Event} [e] Event (passed along when firing \"object:selected\")\n * @return {Boolean} true if the object has been selected\n */\n _setActiveObject(object: FabricObject, e?: TPointerEvent) {\n const prevActiveObject = this._activeObject;\n if (prevActiveObject === object) {\n return false;\n }\n // after calling this._discardActiveObject, this,_activeObject could be undefined\n if (!this._discardActiveObject(e, object) && this._activeObject) {\n // refused to deselect\n return false;\n }\n if (object.onSelect({ e })) {\n return false;\n }\n\n this._activeObject = object;\n\n if (isActiveSelection(object) && prevActiveObject !== object) {\n object.set('canvas', this);\n }\n object.setCoords();\n\n return true;\n }\n\n /**\n * This is supposed to be equivalent to discardActiveObject but without firing\n * any selection events ( can still fire object transformation events ). There is commitment to have this stay this way.\n * This is the functional part of discardActiveObject.\n * @param {Event} [e] Event (passed along when firing \"object:deselected\")\n * @param {Object} object the next object to set as active, reason why we are discarding this\n * @return {Boolean} true if the active object has been discarded\n */\n _discardActiveObject(\n e?: TPointerEvent,\n object?: FabricObject,\n ): this is { _activeObject: undefined } {\n const obj = this._activeObject;\n if (obj) {\n // onDeselect return TRUE to cancel selection;\n if (obj.onDeselect({ e, object })) {\n return false;\n }\n if (this._currentTransform && this._currentTransform.target === obj) {\n this.endCurrentTransform(e);\n }\n if (isActiveSelection(obj) && obj === this._hoveredTarget) {\n this._hoveredTarget = undefined;\n }\n this._activeObject = undefined;\n return true;\n }\n return false;\n }\n\n /**\n * Discards currently active object and fire events. If the function is called by fabric\n * as a consequence of a mouse event, the event is passed as a parameter and\n * sent to the fire function for the custom events. When used as a method the\n * e param does not have any application.\n * @param {event} e\n * @return {Boolean} true if the active object has been discarded\n */\n discardActiveObject(e?: TPointerEvent): this is { _activeObject: undefined } {\n const currentActives = this.getActiveObjects(),\n activeObject = this.getActiveObject();\n if (currentActives.length) {\n this.fire('before:selection:cleared', {\n e,\n deselected: [activeObject!],\n });\n }\n const discarded = this._discardActiveObject(e);\n this._fireSelectionEvents(currentActives, e);\n return discarded;\n }\n\n /**\n * End the current transform.\n * You don't usually need to call this method unless you are interrupting a user initiated transform\n * because of some other event ( a press of key combination, or something that block the user UX )\n * @param {Event} [e] send the mouse event that generate the finalize down, so it can be used in the event\n */\n endCurrentTransform(e?: TPointerEvent) {\n const transform = this._currentTransform;\n this._finalizeCurrentTransform(e);\n if (transform && transform.target) {\n // this could probably go inside _finalizeCurrentTransform\n transform.target.isMoving = false;\n }\n this._currentTransform = null;\n }\n\n /**\n * @private\n * @param {Event} e send the mouse event that generate the finalize down, so it can be used in the event\n */\n _finalizeCurrentTransform(e?: TPointerEvent) {\n const transform = this._currentTransform!,\n target = transform.target,\n options = {\n e,\n target,\n transform,\n action: transform.action,\n };\n\n if (target._scaling) {\n target._scaling = false;\n }\n\n target.setCoords();\n\n if (transform.actionPerformed) {\n this.fire('object:modified', options);\n target.fire(MODIFIED, options);\n }\n }\n\n /**\n * Sets viewport transformation of this canvas instance\n * @param {Array} vpt a Canvas 2D API transform matrix\n */\n setViewportTransform(vpt: TMat2D) {\n super.setViewportTransform(vpt);\n const activeObject = this._activeObject;\n if (activeObject) {\n activeObject.setCoords();\n }\n }\n\n /**\n * @override clears active selection ref and interactive canvas elements and contexts\n */\n destroy() {\n // dispose of active selection\n const activeObject = this._activeObject;\n if (isActiveSelection(activeObject)) {\n activeObject.removeAll();\n activeObject.dispose();\n }\n\n delete this._activeObject;\n\n super.destroy();\n\n // free resources\n\n // pixel find canvas\n // @ts-expect-error disposing\n this.pixelFindContext = null;\n // @ts-expect-error disposing\n this.pixelFindCanvasEl = undefined;\n }\n\n /**\n * Clears all contexts (background, main, top) of an instance\n */\n clear() {\n // discard active object and fire events\n this.discardActiveObject();\n // make sure we clear the active object in case it refused to be discarded\n this._activeObject = undefined;\n this.clearContext(this.contextTop);\n super.clear();\n }\n\n /**\n * Draws objects' controls (borders/controls)\n * @param {CanvasRenderingContext2D} ctx Context to render controls on\n */\n drawControls(ctx: CanvasRenderingContext2D) {\n const activeObject = this._activeObject;\n\n if (activeObject) {\n activeObject._renderControls(ctx);\n }\n }\n\n /**\n * @private\n */\n protected _toObject(\n instance: FabricObject,\n methodName: 'toObject' | 'toDatalessObject',\n propertiesToInclude: string[],\n ): Record {\n // If the object is part of the current selection group, it should\n // be transformed appropriately\n // i.e. it should be serialised as it would appear if the selection group\n // were to be destroyed.\n const originalProperties = this._realizeGroupTransformOnObject(instance),\n object = super._toObject(instance, methodName, propertiesToInclude);\n //Undo the damage we did by changing all of its properties\n instance.set(originalProperties);\n return object;\n }\n\n /**\n * Realizes an object's group transformation on it\n * @private\n * @param {FabricObject} [instance] the object to transform (gets mutated)\n * @returns the original values of instance which were changed\n */\n private _realizeGroupTransformOnObject(\n instance: FabricObject,\n ): Partial {\n const { group } = instance;\n if (group && isActiveSelection(group) && this._activeObject === group) {\n const layoutProps = [\n 'angle',\n 'flipX',\n 'flipY',\n LEFT,\n SCALE_X,\n SCALE_Y,\n SKEW_X,\n SKEW_Y,\n TOP,\n ] as (keyof typeof instance)[];\n const originalValues = pick(instance, layoutProps);\n addTransformToObject(instance, group.calcOwnMatrix());\n return originalValues;\n } else {\n return {};\n }\n }\n\n /**\n * @private\n */\n _setSVGObject(\n markup: string[],\n instance: FabricObject,\n reviver?: TSVGReviver,\n ) {\n // If the object is in a selection group, simulate what would happen to that\n // object when the group is deselected\n const originalProperties = this._realizeGroupTransformOnObject(instance);\n super._setSVGObject(markup, instance, reviver);\n instance.set(originalProperties);\n }\n}\n","import type { ModifierKey, TOptionalModifierKey } from '../EventTypeDefs';\nimport type { TOptions } from '../typedefs';\nimport type { StaticCanvasOptions } from './StaticCanvasOptions';\n\nexport interface CanvasTransformOptions {\n /**\n * When true, objects can be transformed by one side (unproportionately)\n * when dragged on the corners that normally would not do that.\n * @type Boolean\n * @since fabric 4.0 // changed name and default value\n */\n uniformScaling: boolean;\n\n /**\n * Indicates which key switches uniform scaling.\n * values: 'altKey', 'shiftKey', 'ctrlKey'.\n * If `null` or 'none' or any other string that is not a modifier key\n * feature is disabled.\n * totally wrong named. this sounds like `uniform scaling`\n * if Canvas.uniformScaling is true, pressing this will set it to false\n * and viceversa.\n * @since 1.6.2\n * @type ModifierKey\n */\n uniScaleKey: TOptionalModifierKey;\n\n /**\n * When true, objects use center point as the origin of scale transformation.\n * Backwards incompatibility note: This property replaces \"centerTransform\" (Boolean).\n * @since 1.3.4\n * @type Boolean\n */\n centeredScaling: boolean;\n\n /**\n * When true, objects use center point as the origin of rotate transformation.\n * Backwards incompatibility note: This property replaces \"centerTransform\" (Boolean).\n * @since 1.3.4\n * @type Boolean\n */\n centeredRotation: boolean;\n\n /**\n * Indicates which key enable centered Transform\n * values: 'altKey', 'shiftKey', 'ctrlKey'.\n * If `null` or 'none' or any other string that is not a modifier key\n * feature is disabled feature disabled.\n * @since 1.6.2\n * @type ModifierKey\n */\n centeredKey: TOptionalModifierKey;\n\n /**\n * Indicates which key enable alternate action on corner\n * values: 'altKey', 'shiftKey', 'ctrlKey'.\n * If `null` or 'none' or any other string that is not a modifier key\n * feature is disabled feature disabled.\n * @since 1.6.2\n * @type ModifierKey\n */\n altActionKey: TOptionalModifierKey;\n}\n\nexport interface CanvasSelectionOptions {\n /**\n * Indicates whether group selection should be enabled\n * @type Boolean\n */\n selection: boolean;\n\n /**\n * Indicates which key or keys enable multiple click selection\n * Pass value as a string or array of strings\n * values: 'altKey', 'shiftKey', 'ctrlKey'.\n * If `null` or empty or containing any other string that is not a modifier key\n * feature is disabled.\n * @since 1.6.2\n * @type ModifierKey|ModifierKey[]\n */\n selectionKey: TOptionalModifierKey | ModifierKey[];\n\n /**\n * Indicates which key enable alternative selection\n * in case of a target overlapping with active object and we don't want to loose the\n * active selection, we can press this modifier key and continue selecting the current\n * selected object also when is covered by another or many valid targets for selection.\n * values: 'altKey', 'shiftKey', 'ctrlKey'.\n * For a series of reason that come from the general expectations on how\n * things should work, this feature works only for preserveObjectStacking true.\n * If `null` or 'none' or any other string that is not a modifier key\n * feature is disabled.\n * @since 1.6.5\n * @type null|ModifierKey\n */\n altSelectionKey: TOptionalModifierKey;\n\n /**\n * Color of selection\n * @type String\n */\n selectionColor: string;\n\n /**\n * Default dash array pattern\n * If not empty the selection border is dashed\n * @type Array\n */\n selectionDashArray: number[];\n\n /**\n * Color of the border of selection (usually slightly darker than color of selection itself)\n * @type String\n */\n selectionBorderColor: string;\n\n /**\n * Width of a line used in object/group selection\n * @type Number\n */\n selectionLineWidth: number;\n\n /**\n * Select only shapes that are fully contained in the dragged selection rectangle.\n * @type Boolean\n */\n selectionFullyContained: boolean;\n}\n\nexport interface CanvasCursorOptions {\n /**\n * Default cursor value used when hovering over an object on canvas\n * @type CSSStyleDeclaration['cursor']\n * @default move\n */\n hoverCursor: CSSStyleDeclaration['cursor'];\n\n /**\n * Default cursor value used when moving an object on canvas\n * @type CSSStyleDeclaration['cursor']\n * @default move\n */\n moveCursor: CSSStyleDeclaration['cursor'];\n\n /**\n * Default cursor value used for the entire canvas\n * @type String\n * @default default\n */\n defaultCursor: CSSStyleDeclaration['cursor'];\n\n /**\n * Cursor value used during free drawing\n * @type String\n * @default crosshair\n */\n freeDrawingCursor: CSSStyleDeclaration['cursor'];\n\n /**\n * Cursor value used for disabled elements ( corners with disabled action )\n * @type String\n * @since 2.0.0\n * @default not-allowed\n */\n notAllowedCursor: CSSStyleDeclaration['cursor'];\n}\n\nexport interface TargetFindOptions {\n /**\n * When true, object detection happens on per-pixel basis rather than on per-bounding-box\n * @type Boolean\n */\n perPixelTargetFind: boolean;\n\n /**\n * Number of pixels around target pixel to tolerate (consider active) during object detection\n * @type Number\n */\n targetFindTolerance: number;\n\n /**\n * When true, target detection is skipped. Target detection will return always undefined.\n * click selection won't work anymore, events will fire with no targets.\n * if something is selected before setting it to true, it will be deselected at the first click.\n * area selection will still work. check the `selection` property too.\n * if you deactivate both, you should look into staticCanvas.\n * @type Boolean\n */\n skipTargetFind: boolean;\n}\n\nexport interface CanvasEventsOptions {\n /**\n * Indicates if the right click on canvas can output the context menu or not\n * The default value changed from false to true in Fabric 7.0\n * @see https://fabricjs.com/docs/upgrading/upgrading-to-fabric-70/\n * @deprecated since 7.0, Will be removed in Fabric 8.0\n * @type Boolean\n * @since 1.6.5\n */\n stopContextMenu: boolean;\n\n /**\n * Indicates if the canvas can fire right click events\n * The default value changed from false to true in Fabric 7.0\n * @see https://fabricjs.com/docs/upgrading/upgrading-to-fabric-70/\n * @deprecated since 7.0, Will be removed in Fabric 8.0\n * @type Boolean\n * @since 1.6.5\n */\n fireRightClick: boolean;\n\n /**\n * Indicates if the canvas can fire middle click events\n * The default value changed from false to true in Fabric 7.0\n * @see https://fabricjs.com/docs/upgrading/upgrading-to-fabric-70/\n * @deprecated since 7.0, Will be removed in Fabric 8.0\n * @type Boolean\n * @since 1.7.8\n */\n fireMiddleClick: boolean;\n\n /**\n * When the option is enabled, PointerEvent is used instead of TPointerEvent.\n * @type Boolean\n */\n enablePointerEvents: boolean;\n}\n\nexport interface CanvasOptions\n extends StaticCanvasOptions,\n CanvasTransformOptions,\n CanvasSelectionOptions,\n CanvasCursorOptions,\n TargetFindOptions,\n CanvasEventsOptions {\n /**\n * Default element class that's given to wrapper (div) element of canvas\n * @type String\n * @deprecated customize {@link CanvasDOMManager} instead or access {@link elements} directly\n */\n containerClass: string;\n\n /**\n * Indicates whether objects should remain in current stack position when selected.\n * When false objects are brought to top and rendered as part of the selection group\n * @type Boolean\n * @default true\n */\n preserveObjectStacking: boolean;\n\n /**\n * 启用双击锁定组节点,锁定后可选择组节点中的子节点,无论group中interative和subTargetCheck是否启用\n * @type Boolean\n * @default\n */\n dblClickIsolateObject: boolean;\n}\n\nexport type TCanvasOptions = TOptions;\n\nexport const canvasDefaults: TOptions = {\n uniformScaling: true,\n uniScaleKey: 'shiftKey',\n centeredScaling: false,\n centeredRotation: false,\n centeredKey: 'altKey',\n altActionKey: 'shiftKey',\n\n selection: true,\n selectionKey: 'shiftKey',\n selectionColor: 'rgba(100, 100, 255, 0.3)',\n selectionDashArray: [],\n selectionBorderColor: 'rgba(255, 255, 255, 0.3)',\n selectionLineWidth: 1,\n selectionFullyContained: false,\n\n hoverCursor: 'move',\n moveCursor: 'move',\n defaultCursor: 'default',\n freeDrawingCursor: 'crosshair',\n notAllowedCursor: 'not-allowed',\n\n perPixelTargetFind: false,\n targetFindTolerance: 0,\n skipTargetFind: false,\n\n stopContextMenu: true,\n fireRightClick: true,\n fireMiddleClick: true,\n enablePointerEvents: false,\n\n containerClass: 'canvas-container',\n preserveObjectStacking: true,\n};\n","import type { TPointerEvent } from '../EventTypeDefs';\nimport type { ITextBehavior } from '../shapes/IText/ITextBehavior';\nimport { removeFromArray } from '../util/internals/removeFromArray';\nimport type { Canvas } from './Canvas';\n\n/**\n * In charge of synchronizing all interactive text instances of a canvas\n */\nexport class TextEditingManager {\n private targets: ITextBehavior[] = [];\n declare private target?: ITextBehavior;\n private __disposer: VoidFunction;\n\n constructor(canvas: Canvas) {\n const cb = () => {\n const { hiddenTextarea } =\n (canvas.getActiveObject() as ITextBehavior) || {};\n hiddenTextarea && hiddenTextarea.focus();\n };\n const el = canvas.upperCanvasEl;\n el.addEventListener('click', cb);\n this.__disposer = () => el.removeEventListener('click', cb);\n }\n\n exitTextEditing() {\n this.target = undefined;\n this.targets.forEach((target) => {\n if (target.isEditing) {\n target.exitEditing();\n }\n });\n }\n\n add(target: ITextBehavior) {\n this.targets.push(target);\n }\n\n remove(target: ITextBehavior) {\n this.unregister(target);\n removeFromArray(this.targets, target);\n }\n\n register(target: ITextBehavior) {\n this.target = target;\n }\n\n unregister(target: ITextBehavior) {\n if (target === this.target) {\n this.target = undefined;\n }\n }\n\n onMouseMove(e: TPointerEvent) {\n this.target?.isEditing && this.target.updateSelectionOnMouseMove(e);\n }\n\n clear() {\n this.targets = [];\n this.target = undefined;\n }\n\n dispose() {\n this.clear();\n this.__disposer();\n // @ts-expect-error disposing\n delete this.__disposer;\n }\n}\n","import { classRegistry } from '../ClassRegistry';\nimport { NONE } from '../constants';\nimport type {\n CanvasEvents,\n DragEventData,\n ObjectEvents,\n TEventsExtraData,\n TPointerEvent,\n TPointerEventNames,\n Transform,\n} from '../EventTypeDefs';\nimport { Point } from '../Point';\nimport type { ActiveSelection } from '../shapes/ActiveSelection';\nimport type { Group } from '../shapes/Group';\nimport type { IText } from '../shapes/IText/IText';\nimport type { FabricObject } from '../shapes/Object/FabricObject';\nimport { isTouchEvent, stopEvent } from '../util/dom_event';\nimport { getDocumentFromElement, getWindowFromElement } from '../util/dom_misc';\nimport { sendPointToPlane } from '../util/misc/planeChange';\nimport { isActiveSelection } from '../util/typeAssertions';\nimport type { CanvasOptions, TCanvasOptions } from './CanvasOptions';\nimport { SelectableCanvas } from './SelectableCanvas';\nimport { TextEditingManager } from './TextEditingManager';\n\nconst addEventOptions = { passive: false } as EventListenerOptions;\n\nconst getEventPoints = (canvas: Canvas, e: TPointerEvent) => {\n const viewportPoint = canvas.getViewportPoint(e);\n const scenePoint = canvas.getScenePoint(e);\n return {\n viewportPoint,\n scenePoint,\n };\n};\n\n// just to be clear, the utils are now deprecated and those are here exactly as minifier helpers\n// because el.addEventListener can't me be minified while a const yes and we use it 47 times in this file.\n// few bytes but why give it away.\nconst addListener = (\n el: HTMLElement | Document,\n ...args: Parameters\n) => el.addEventListener(...args);\nconst removeListener = (\n el: HTMLElement | Document,\n ...args: Parameters\n) => el.removeEventListener(...args);\n\nconst syntheticEventConfig = {\n mouse: {\n in: 'over',\n out: 'out',\n targetIn: 'mouseover',\n targetOut: 'mouseout',\n canvasIn: 'mouse:over',\n canvasOut: 'mouse:out',\n },\n drag: {\n in: 'enter',\n out: 'leave',\n targetIn: 'dragenter',\n targetOut: 'dragleave',\n canvasIn: 'drag:enter',\n canvasOut: 'drag:leave',\n },\n} as const;\n\ntype TSyntheticEventContext = {\n mouse: { e: TPointerEvent };\n drag: DragEventData;\n};\n\nexport class Canvas extends SelectableCanvas implements CanvasOptions {\n /**\n * Contains the id of the touch event that owns the fabric transform\n * @type Number\n * @private\n */\n declare mainTouchId?: number;\n\n declare enablePointerEvents: boolean;\n\n /**\n * Holds a reference to a setTimeout timer for event synchronization\n * @type number\n * @private\n */\n private declare _willAddMouseDown: number;\n\n /**\n * Holds a reference to an object on the canvas that is receiving the drag over event.\n * @type FabricObject\n * @private\n */\n private declare _draggedoverTarget?: FabricObject;\n\n /**\n * Holds a reference to an object on the canvas from where the drag operation started\n * @type FabricObject\n * @private\n */\n private declare _dragSource?: FabricObject;\n\n /**\n * Holds a reference to an object on the canvas that is the current drop target\n * May differ from {@link _draggedoverTarget}\n * @todo inspect whether {@link _draggedoverTarget} and {@link _dropTarget} should be merged somehow\n * @type FabricObject\n * @private\n */\n private declare _dropTarget: FabricObject | undefined;\n\n /**\n * a boolean that keeps track of the click state during a cycle of mouse down/up.\n * If a mouse move occurs it becomes false.\n * Is true by default, turns false on mouse move.\n * Used to determine if a mouseUp is a click\n */\n private _isClick: boolean;\n\n textEditingManager = new TextEditingManager(this);\n\n constructor(el?: string | HTMLCanvasElement, options: TCanvasOptions = {}) {\n super(el, options);\n // bind event handlers\n (\n [\n '_onMouseDown',\n '_onTouchStart',\n '_onMouseMove',\n '_onMouseUp',\n '_onTouchEnd',\n '_onResize',\n // '_onGesture',\n // '_onDrag',\n // '_onShake',\n // '_onLongPress',\n // '_onOrientationChange',\n '_onMouseWheel',\n '_onMouseOut',\n '_onMouseEnter',\n '_onContextMenu',\n '_onClick',\n '_onDragStart',\n '_onDragEnd',\n '_onDragProgress',\n '_onDragOver',\n '_onDragEnter',\n '_onDragLeave',\n '_onDrop',\n ] as (keyof this)[]\n ).forEach((eventHandler) => {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-function-type\n this[eventHandler] = (this[eventHandler] as Function).bind(this);\n });\n // register event handlers\n this.addOrRemove(addListener, 'add');\n }\n\n /**\n * return an event prefix pointer or mouse.\n * @private\n */\n private _getEventPrefix() {\n return this.enablePointerEvents ? 'pointer' : 'mouse';\n }\n\n addOrRemove(functor: any, _eventjsFunctor: 'add' | 'remove') {\n const canvasElement = this.upperCanvasEl,\n eventTypePrefix = this._getEventPrefix();\n functor(getWindowFromElement(canvasElement), 'resize', this._onResize);\n functor(canvasElement, eventTypePrefix + 'down', this._onMouseDown);\n functor(\n canvasElement,\n `${eventTypePrefix}move`,\n this._onMouseMove,\n addEventOptions,\n );\n functor(canvasElement, `${eventTypePrefix}out`, this._onMouseOut);\n functor(canvasElement, `${eventTypePrefix}enter`, this._onMouseEnter);\n functor(canvasElement, 'wheel', this._onMouseWheel, { passive: false });\n functor(canvasElement, 'contextmenu', this._onContextMenu);\n functor(canvasElement, 'click', this._onClick);\n // decide if to remove in fabric 7.0\n functor(canvasElement, 'dblclick', this._onClick);\n functor(canvasElement, 'dragstart', this._onDragStart);\n functor(canvasElement, 'dragend', this._onDragEnd);\n functor(canvasElement, 'dragover', this._onDragOver);\n functor(canvasElement, 'dragenter', this._onDragEnter);\n functor(canvasElement, 'dragleave', this._onDragLeave);\n functor(canvasElement, 'drop', this._onDrop);\n if (!this.enablePointerEvents) {\n functor(canvasElement, 'touchstart', this._onTouchStart, addEventOptions);\n }\n // if (typeof eventjs !== 'undefined' && eventjsFunctor in eventjs) {\n // eventjs[eventjsFunctor](canvasElement, 'gesture', this._onGesture);\n // eventjs[eventjsFunctor](canvasElement, 'drag', this._onDrag);\n // eventjs[eventjsFunctor](\n // canvasElement,\n // 'orientation',\n // this._onOrientationChange\n // );\n // eventjs[eventjsFunctor](canvasElement, 'shake', this._onShake);\n // eventjs[eventjsFunctor](canvasElement, 'longpress', this._onLongPress);\n // }\n }\n\n /**\n * Removes all event listeners, used when disposing the instance\n */\n removeListeners() {\n this.addOrRemove(removeListener, 'remove');\n // if you dispose on a mouseDown, before mouse up, you need to clean document to...\n const eventTypePrefix = this._getEventPrefix();\n const doc = getDocumentFromElement(this.upperCanvasEl);\n removeListener(\n doc,\n `${eventTypePrefix}up`,\n this._onMouseUp as EventListener,\n );\n removeListener(\n doc,\n 'touchend',\n this._onTouchEnd as EventListener,\n addEventOptions,\n );\n removeListener(\n doc,\n `${eventTypePrefix}move`,\n this._onMouseMove as EventListener,\n addEventOptions,\n );\n removeListener(\n doc,\n 'touchmove',\n this._onMouseMove as EventListener,\n addEventOptions,\n );\n clearTimeout(this._willAddMouseDown);\n }\n\n /**\n * @private\n * @param {Event} [e] Event object fired on wheel event\n */\n private _onMouseWheel(e: MouseEvent) {\n this._cacheTransformEventData(e);\n this._handleEvent(e, 'wheel');\n this._resetTransformEventData();\n }\n\n /**\n * @private\n * @param {Event} e Event object fired on mousedown\n */\n private _onMouseOut(e: TPointerEvent) {\n const target = this._hoveredTarget;\n const shared = {\n e,\n ...getEventPoints(this, e),\n };\n this.fire('mouse:out', { ...shared, target });\n this._hoveredTarget = undefined;\n target && target.fire('mouseout', { ...shared });\n this._hoveredTargets.forEach((nestedTarget) => {\n this.fire('mouse:out', { ...shared, target: nestedTarget });\n nestedTarget && nestedTarget.fire('mouseout', { ...shared });\n });\n this._hoveredTargets = [];\n }\n\n /**\n * @private\n * Used when the mouse cursor enter the canvas from outside\n * @param {Event} e Event object fired on mouseenter\n */\n private _onMouseEnter(e: TPointerEvent) {\n // This find target and consequent 'mouse:over' is used to\n // clear old instances on hovered target.\n // calling findTarget has the side effect of killing target.__corner.\n // as a short term fix we are not firing this if we are currently transforming.\n // as a long term fix we need to separate the action of finding a target with the\n // side effects we added to it.\n const { target } = this.findTarget(e);\n // we fire the event only when there is no target, if there is a target, the specific\n // target event will fire.\n if (!this._currentTransform && !target) {\n this.fire('mouse:over', {\n e,\n ...getEventPoints(this, e),\n });\n this._hoveredTarget = undefined;\n this._hoveredTargets = [];\n }\n }\n\n /**\n * supports native like text dragging\n * @private\n * @param {DragEvent} e\n */\n private _onDragStart(e: DragEvent) {\n this._isClick = false;\n const activeObject = this.getActiveObject();\n if (activeObject && activeObject.onDragStart(e)) {\n this._dragSource = activeObject;\n const options = { e, target: activeObject };\n this.fire('dragstart', options);\n activeObject.fire('dragstart', options);\n addListener(\n this.upperCanvasEl,\n 'drag',\n this._onDragProgress as EventListener,\n );\n return;\n }\n stopEvent(e);\n }\n\n /**\n * First we clear top context where the effects are being rendered.\n * Then we render the effects.\n * Doing so will render the correct effect for all cases including an overlap between `source` and `target`.\n * @private\n */\n private _renderDragEffects(\n e: DragEvent,\n source?: FabricObject,\n target?: FabricObject,\n ) {\n let dirty = false;\n // clear top context\n const dropTarget = this._dropTarget;\n if (dropTarget && dropTarget !== source && dropTarget !== target) {\n dropTarget.clearContextTop();\n dirty = true;\n }\n source?.clearContextTop();\n target !== source && target?.clearContextTop();\n // render effects\n const ctx = this.contextTop;\n ctx.save();\n ctx.transform(...this.viewportTransform);\n if (source) {\n ctx.save();\n source.transform(ctx);\n source.renderDragSourceEffect(e);\n ctx.restore();\n dirty = true;\n }\n if (target) {\n ctx.save();\n target.transform(ctx);\n target.renderDropTargetEffect(e);\n ctx.restore();\n dirty = true;\n }\n ctx.restore();\n dirty && (this.contextTopDirty = true);\n }\n\n /**\n * supports native like text dragging\n * https://developer.mozilla.org/en-US/docs/Web/API/HTML_Drag_and_Drop_API/Drag_operations#finishing_a_drag\n * @private\n * @param {DragEvent} e\n */\n private _onDragEnd(e: DragEvent) {\n const { currentSubTargets } = this.findTarget(e);\n const didDrop = !!e.dataTransfer && e.dataTransfer.dropEffect !== NONE,\n dropTarget = didDrop ? this._activeObject : undefined,\n options = {\n e,\n target: this._dragSource as FabricObject,\n subTargets: currentSubTargets,\n dragSource: this._dragSource as FabricObject,\n didDrop,\n dropTarget: dropTarget as FabricObject,\n };\n removeListener(\n this.upperCanvasEl,\n 'drag',\n this._onDragProgress as EventListener,\n );\n this.fire('dragend', options);\n this._dragSource && this._dragSource.fire('dragend', options);\n delete this._dragSource;\n // we need to call mouse up synthetically because the browser won't\n this._onMouseUp(e);\n }\n\n /**\n * fire `drag` event on canvas and drag source\n * @private\n * @param {DragEvent} e\n */\n private _onDragProgress(e: DragEvent) {\n const options = {\n e,\n target: this._dragSource,\n dragSource: this._dragSource,\n dropTarget: this._draggedoverTarget as FabricObject,\n };\n this.fire('drag', options);\n this._dragSource && this._dragSource.fire('drag', options);\n }\n\n /**\n * prevent default to allow drop event to be fired\n * https://developer.mozilla.org/en-US/docs/Web/API/HTML_Drag_and_Drop_API/Drag_operations#specifying_drop_targets\n * @private\n * @param {DragEvent} [e] Event object fired on Event.js shake\n */\n private _onDragOver(e: DragEvent) {\n const eventType = 'dragover';\n const { currentContainer: target, currentSubTargets } = this.findTarget(e);\n const dragSource = this._dragSource as FabricObject;\n const options = {\n e,\n target,\n subTargets: currentSubTargets,\n dragSource,\n canDrop: false,\n dropTarget: undefined,\n };\n let dropTarget;\n // fire on canvas\n this.fire(eventType, options);\n // make sure we fire dragenter events before dragover\n // if dragleave is needed, object will not fire dragover so we don't need to trouble ourselves with it\n this._fireEnterLeaveEvents(e, target, options);\n if (target) {\n if (target.canDrop(e)) {\n dropTarget = target;\n }\n target.fire(eventType, options);\n }\n // propagate the event to subtargets\n for (let i = 0; i < currentSubTargets.length; i++) {\n const subTarget = currentSubTargets[i];\n // accept event only if previous targets didn't (the accepting target calls `preventDefault` to inform that the event is taken)\n // TODO: verify if those should loop in inverse order then?\n // what is the order of subtargets?\n if (subTarget.canDrop(e)) {\n dropTarget = subTarget;\n }\n subTarget.fire(eventType, options);\n }\n // render drag effects now that relations between source and target is clear\n this._renderDragEffects(e, dragSource, dropTarget);\n this._dropTarget = dropTarget;\n }\n\n /**\n * fire `dragleave` on `dragover` targets\n * @private\n * @param {Event} [e] Event object fired on Event.js shake\n */\n private _onDragEnter(e: DragEvent) {\n const { currentContainer, currentSubTargets } = this.findTarget(e);\n const options = {\n e,\n target: currentContainer,\n subTargets: currentSubTargets,\n dragSource: this._dragSource,\n };\n this.fire('dragenter', options);\n // fire dragenter on targets\n this._fireEnterLeaveEvents(e, currentContainer, options);\n }\n\n /**\n * fire `dragleave` on `dragover` targets\n * @private\n * @param {Event} [e] Event object fired on Event.js shake\n */\n private _onDragLeave(e: DragEvent) {\n const { currentSubTargets } = this.findTarget(e);\n const options = {\n e,\n target: this._draggedoverTarget,\n subTargets: currentSubTargets,\n dragSource: this._dragSource,\n };\n this.fire('dragleave', options);\n\n // fire dragleave on targets\n this._fireEnterLeaveEvents(e, undefined, options);\n this._renderDragEffects(e, this._dragSource);\n this._dropTarget = undefined;\n this._hoveredTargets = [];\n }\n\n /**\n * `drop:before` is a an event that allows you to schedule logic\n * before the `drop` event. Prefer `drop` event always, but if you need\n * to run some drop-disabling logic on an event, since there is no way\n * to handle event handlers ordering, use `drop:before`\n * @private\n * @param {Event} e\n */\n private _onDrop(e: DragEvent) {\n const { currentContainer, currentSubTargets } = this.findTarget(e);\n const options = this._basicEventHandler('drop:before', {\n e,\n target: currentContainer,\n subTargets: currentSubTargets,\n dragSource: this._dragSource,\n ...getEventPoints(this, e),\n });\n // will be set by the drop target\n options.didDrop = false;\n // will be set by the drop target, used in case options.target refuses the drop\n options.dropTarget = undefined;\n // fire `drop`\n this._basicEventHandler('drop', options);\n // inform canvas of the drop\n // we do this because canvas was unaware of what happened at the time the `drop` event was fired on it\n // use for side effects\n this.fire('drop:after', options);\n }\n\n /**\n * @private\n * @param {Event} e Event object fired on mousedown\n */\n private _onContextMenu(e: TPointerEvent): false {\n const { target, subTargets } = this.findTarget(e);\n const options = this._basicEventHandler('contextmenu:before', {\n e,\n target,\n subTargets,\n });\n // TODO: this line is silly because the dev can subscribe to the event and prevent it themselves\n this.stopContextMenu && stopEvent(e);\n this._basicEventHandler('contextmenu', options);\n return false;\n }\n\n /**\n * @private\n * @param {Event} e Event object fired on mousedown\n */\n private _onClick(e: TPointerEvent) {\n const clicks = e.detail;\n if (clicks > 3 || clicks < 2) return;\n this._cacheTransformEventData(e);\n clicks == 2 && e.type === 'dblclick' && this._onDblClick(e);\n clicks == 3 && this._handleEvent(e, 'tripleclick');\n this._resetTransformEventData();\n }\n\n /**\n * 双击选择锁定组的子节点\n * @param e\n */\n private _onDblClick(e: TPointerEvent) {\n if (this.dblClickLock(e)) {\n // 锁定后立即选中点击子对象\n this._resetTransformEventData();\n this.__onMouseDown(e);\n this.__onMouseUp(e);\n return;\n }\n this._handleEvent(e, 'dblclick');\n }\n\n /**\n * Return a the id of an event.\n * returns either the pointerId or the identifier or 0 for the mouse event\n * @private\n * @param {Event} evt Event object\n */\n getPointerId(evt: TouchEvent | PointerEvent): number {\n const changedTouches = (evt as TouchEvent).changedTouches;\n\n if (changedTouches) {\n return changedTouches[0] && changedTouches[0].identifier;\n }\n\n if (this.enablePointerEvents) {\n return (evt as PointerEvent).pointerId;\n }\n\n return -1;\n }\n\n /**\n * Determines if an event has the id of the event that is considered main\n * @private\n * @param {evt} event Event object\n */\n _isMainEvent(evt: TPointerEvent): boolean {\n if ((evt as PointerEvent).isPrimary === true) {\n return true;\n }\n if ((evt as PointerEvent).isPrimary === false) {\n return false;\n }\n if (evt.type === 'touchend' && (evt as TouchEvent).touches.length === 0) {\n return true;\n }\n if ((evt as TouchEvent).changedTouches) {\n return (\n (evt as TouchEvent).changedTouches[0].identifier === this.mainTouchId\n );\n }\n return true;\n }\n\n /**\n * @private\n * @param {Event} e Event object fired on mousedown\n */\n _onTouchStart(e: TouchEvent) {\n this._cacheTransformEventData(e);\n // we will prevent scrolling if allowTouchScrolling is not enabled and\n let shouldPreventScrolling = !this.allowTouchScrolling;\n const currentActiveObject = this._activeObject;\n if (this.mainTouchId === undefined) {\n this.mainTouchId = this.getPointerId(e);\n }\n this.__onMouseDown(e);\n const { target } = this.findTarget(e);\n // after executing fabric logic for mouse down let's see\n // if we didn't change target or if we are drawing\n // we want to prevent scrolling anyway\n if (\n this.isDrawingMode ||\n (currentActiveObject && target === currentActiveObject)\n ) {\n shouldPreventScrolling = true;\n }\n // prevent default, will block scrolling from start\n shouldPreventScrolling && e.preventDefault();\n const canvasElement = this.upperCanvasEl,\n eventTypePrefix = this._getEventPrefix();\n const doc = getDocumentFromElement(canvasElement);\n addListener(\n doc,\n 'touchend',\n this._onTouchEnd as EventListener,\n addEventOptions,\n );\n // if we scroll don't register the touch move event\n shouldPreventScrolling &&\n addListener(\n doc,\n 'touchmove',\n this._onMouseMove as EventListener,\n addEventOptions,\n );\n // Unbind mousedown to prevent double triggers from touch devices\n removeListener(\n canvasElement,\n `${eventTypePrefix}down`,\n this._onMouseDown as EventListener,\n );\n this._resetTransformEventData();\n }\n\n /**\n * @private\n * @param {Event} e Event object fired on mousedown\n */\n _onMouseDown(e: TPointerEvent) {\n this._cacheTransformEventData(e);\n this.__onMouseDown(e);\n const canvasElement = this.upperCanvasEl,\n eventTypePrefix = this._getEventPrefix();\n // switch from moving on the canvas element to moving on the document\n removeListener(\n canvasElement,\n `${eventTypePrefix}move`,\n this._onMouseMove as EventListener,\n addEventOptions,\n );\n const doc = getDocumentFromElement(canvasElement);\n addListener(doc, `${eventTypePrefix}up`, this._onMouseUp as EventListener);\n addListener(\n doc,\n `${eventTypePrefix}move`,\n this._onMouseMove as EventListener,\n addEventOptions,\n );\n this._resetTransformEventData();\n }\n\n /**\n * @private\n * @param {Event} e Event object fired on mousedown\n */\n _onTouchEnd(e: TouchEvent) {\n if (e.touches.length > 0) {\n // if there are still touches stop here\n return;\n }\n this._cacheTransformEventData(e);\n this.__onMouseUp(e);\n this._resetTransformEventData();\n delete this.mainTouchId;\n const eventTypePrefix = this._getEventPrefix();\n const doc = getDocumentFromElement(this.upperCanvasEl);\n removeListener(\n doc,\n 'touchend',\n this._onTouchEnd as EventListener,\n addEventOptions,\n );\n removeListener(\n doc,\n 'touchmove',\n this._onMouseMove as EventListener,\n addEventOptions,\n );\n if (this._willAddMouseDown) {\n clearTimeout(this._willAddMouseDown);\n }\n this._willAddMouseDown = setTimeout(() => {\n // Wait 400ms before rebinding mousedown to prevent double triggers\n // from touch devices\n addListener(\n this.upperCanvasEl,\n `${eventTypePrefix}down`,\n this._onMouseDown as EventListener,\n );\n this._willAddMouseDown = 0;\n }, 400) as unknown as number;\n }\n\n /**\n * @private\n * @param {Event} e Event object fired on mouseup\n */\n _onMouseUp(e: TPointerEvent) {\n this._cacheTransformEventData(e);\n this.__onMouseUp(e);\n const canvasElement = this.upperCanvasEl,\n eventTypePrefix = this._getEventPrefix();\n if (this._isMainEvent(e)) {\n const doc = getDocumentFromElement(this.upperCanvasEl);\n removeListener(\n doc,\n `${eventTypePrefix}up`,\n this._onMouseUp as EventListener,\n );\n removeListener(\n doc,\n `${eventTypePrefix}move`,\n this._onMouseMove as EventListener,\n addEventOptions,\n );\n addListener(\n canvasElement,\n `${eventTypePrefix}move`,\n this._onMouseMove as EventListener,\n addEventOptions,\n );\n }\n this._resetTransformEventData();\n }\n\n /**\n * @private\n * @param {Event} e Event object fired on mousemove\n */\n _onMouseMove(e: TPointerEvent) {\n this._cacheTransformEventData(e);\n\n const activeObject = this.getActiveObject();\n !this.allowTouchScrolling &&\n (!activeObject ||\n // a drag event sequence is started by the active object flagging itself on mousedown / mousedown:before\n // we must not prevent the event's default behavior in order for the window to start dragging\n !activeObject.shouldStartDragging(e)) &&\n e.preventDefault &&\n e.preventDefault();\n this.__onMouseMove(e);\n this._resetTransformEventData();\n }\n\n /**\n * @private\n */\n _onResize() {\n this.calcOffset();\n this._resetTransformEventData();\n }\n\n /**\n * Decides whether the canvas should be redrawn in mouseup and mousedown events.\n * @private\n * @param {Object} target\n */\n _shouldRender(target: FabricObject | undefined) {\n const activeObject = this.getActiveObject();\n // if just one of them is available or if they are both but are different objects\n // this covers: switch of target, from target to no target, selection of target\n // multiSelection with key and mouse\n return (\n !!activeObject !== !!target ||\n (activeObject && target && activeObject !== target)\n );\n }\n\n /**\n * Method that defines the actions when mouse is released on canvas.\n * The method resets the currentTransform parameters, store the image corner\n * position in the image object and render the canvas on top.\n * @private\n * @param {Event} e Event object fired on mouseup\n */\n __onMouseUp(e: TPointerEvent) {\n this._handleEvent(e, 'up:before');\n\n const transform = this._currentTransform;\n const isClick = this._isClick;\n const { target } = this.findTarget(e);\n\n // if right/middle click just fire events and return\n // target undefined will make the _handleEvent search the target\n const { button } = e as MouseEvent;\n if (button) {\n ((this.fireMiddleClick && button === 1) ||\n (this.fireRightClick && button === 2)) &&\n this._handleEvent(e, 'up');\n return;\n }\n\n if (this.isDrawingMode && this._isCurrentlyDrawing) {\n this._onMouseUpInDrawingMode(e);\n return;\n }\n\n if (!this._isMainEvent(e)) {\n return;\n }\n let shouldRender = false;\n if (transform) {\n this._finalizeCurrentTransform(e);\n shouldRender = transform.actionPerformed;\n }\n if (!isClick) {\n const targetWasActive = target === this._activeObject;\n this.handleSelection(e);\n if (!shouldRender) {\n shouldRender =\n this._shouldRender(target) ||\n (!targetWasActive && target === this._activeObject);\n }\n }\n let pointer, corner;\n if (target) {\n const found = target.findControl(\n this.getViewportPoint(e),\n isTouchEvent(e),\n );\n const { key, control } = found || {};\n corner = key;\n if (\n target.selectable &&\n target !== this._activeObject &&\n target.activeOn === 'up'\n ) {\n this.setActiveObject(target, e);\n shouldRender = true;\n } else if (control) {\n const mouseUpHandler = control.getMouseUpHandler(e, target, control);\n if (mouseUpHandler) {\n pointer = this.getScenePoint(e);\n mouseUpHandler.call(control, e, transform!, pointer.x, pointer.y);\n }\n }\n target.isMoving = false;\n }\n // if we are ending up a transform on a different control or a new object\n // fire the original mouse up from the corner that started the transform\n if (\n transform &&\n (transform.target !== target || transform.corner !== corner)\n ) {\n const originalControl =\n transform.target && transform.target.controls[transform.corner],\n originalMouseUpHandler =\n originalControl &&\n originalControl.getMouseUpHandler(\n e,\n transform.target,\n originalControl,\n );\n pointer = pointer || this.getScenePoint(e);\n originalMouseUpHandler &&\n originalMouseUpHandler.call(\n originalControl,\n e,\n transform,\n pointer.x,\n pointer.y,\n );\n }\n this._setCursorFromEvent(e, target);\n this._handleEvent(e, 'up');\n this._groupSelector = null;\n this._currentTransform = null;\n // reset the target information about which corner is selected\n target && (target.__corner = undefined);\n if (shouldRender) {\n this.requestRenderAll();\n } else if (!isClick && !(this._activeObject as IText)?.isEditing) {\n this.renderTop();\n }\n }\n\n _basicEventHandler(\n eventType: T,\n options: (CanvasEvents & ObjectEvents)[T],\n ) {\n const { target, subTargets = [] } = options as {\n target?: FabricObject;\n subTargets: FabricObject[];\n };\n this.fire(eventType, options);\n target && target.fire(eventType, options);\n for (let i = 0; i < subTargets.length; i++) {\n subTargets[i] !== target && subTargets[i].fire(eventType, options);\n }\n return options;\n }\n\n /**\n * @private\n * Handle event firing for target and subtargets\n * @param {TPointerEvent} e event from mouse\n * @param {TPointerEventNames} eventType\n */\n _handleEvent(\n e: TPointerEvent,\n eventType: T,\n extraData?: TEventsExtraData[T],\n ) {\n const { target, subTargets } = this.findTarget(e),\n options: CanvasEvents[`mouse:${T}`] = {\n e,\n target,\n subTargets,\n ...getEventPoints(this, e),\n transform: this._currentTransform,\n ...(eventType === 'down:before' || eventType === 'down'\n ? extraData\n : {}),\n } as CanvasEvents[`mouse:${T}`];\n if (eventType === 'up:before' || eventType === 'up') {\n (options as CanvasEvents[`mouse:up`]).isClick = this._isClick;\n }\n this.fire(`mouse:${eventType}`, options);\n // this may be a little be more complicated of what we want to handle\n target && target.fire(`mouse${eventType}`, options);\n for (let i = 0; i < subTargets.length; i++) {\n subTargets[i] !== target &&\n subTargets[i].fire(`mouse${eventType}`, options);\n }\n }\n\n /**\n * @private\n * @param {Event} e Event object fired on mousedown\n */\n _onMouseDownInDrawingMode(e: TPointerEvent) {\n this._isCurrentlyDrawing = true;\n if (this.getActiveObject()) {\n this.discardActiveObject(e);\n this.requestRenderAll();\n }\n // TODO: this is a scene point so it should be renamed\n const pointer = this.getScenePoint(e);\n this.freeDrawingBrush &&\n this.freeDrawingBrush.onMouseDown(pointer, { e, pointer });\n this._handleEvent(e, 'down', { alreadySelected: false });\n }\n\n /**\n * @private\n * @param {Event} e Event object fired on mousemove\n */\n _onMouseMoveInDrawingMode(e: TPointerEvent) {\n if (this._isCurrentlyDrawing) {\n const pointer = this.getScenePoint(e);\n this.freeDrawingBrush &&\n this.freeDrawingBrush.onMouseMove(pointer, {\n e,\n // this is an absolute pointer, the naming is wrong\n pointer,\n });\n }\n this.setCursor(this.freeDrawingCursor);\n this._handleEvent(e, 'move');\n }\n\n /**\n * @private\n * @param {Event} e Event object fired on mouseup\n */\n _onMouseUpInDrawingMode(e: TPointerEvent) {\n const pointer = this.getScenePoint(e);\n if (this.freeDrawingBrush) {\n this._isCurrentlyDrawing = !!this.freeDrawingBrush.onMouseUp({\n e: e,\n // this is an absolute pointer, the naming is wrong\n pointer,\n });\n } else {\n this._isCurrentlyDrawing = false;\n }\n this._handleEvent(e, 'up');\n }\n\n /**\n * Method that defines the actions when mouse is clicked on canvas.\n * The method inits the currentTransform parameters and renders all the\n * canvas so the current image can be placed on the top canvas and the rest\n * in on the container one.\n * @private\n * @param {Event} e Event object fired on mousedown\n */\n __onMouseDown(e: TPointerEvent) {\n this._isClick = true;\n this._handleEvent(e, 'down:before');\n\n let { target } = this.findTarget(e);\n let alreadySelected = !!target && target === this._activeObject;\n // if right/middle click just fire events\n const { button } = e as MouseEvent;\n if (button) {\n ((this.fireMiddleClick && button === 1) ||\n (this.fireRightClick && button === 2)) &&\n this._handleEvent(e, 'down', {\n alreadySelected,\n });\n return;\n }\n\n if (this.isDrawingMode) {\n this._onMouseDownInDrawingMode(e);\n return;\n }\n\n if (!this._isMainEvent(e)) {\n return;\n }\n\n // ignore if some object is being transformed at this moment\n if (this._currentTransform) {\n return;\n }\n\n let shouldRender = this._shouldRender(target);\n let grouped = false;\n if (this.handleMultiSelection(e, target)) {\n // active object might have changed while grouping\n target = this._activeObject;\n grouped = true;\n shouldRender = true;\n } else if (this._shouldClearSelection(e, target)) {\n this.discardActiveObject(e);\n\n // 锁定对象时且没有指定选中时,如果点击组外空白或对象,取消锁定\n if (this.isolatedObject && !this._searchTargets) {\n this.setSearchTargets([this.isolatedObject]);\n const { target } = this.findTarget(e);\n // 没有选中任何对象,或者选中的是锁定对象以外的对象\n if (target !== this.isolatedObject) {\n this.isolatedObject = null;\n }\n this.setSearchTargets(null);\n // 在此执行__onMouseDown选中其他对象\n this._resetTransformEventData();\n this.__onMouseDown(e);\n return;\n }\n }\n // we start a group selector rectangle if\n // selection is enabled\n // and there is no target, or the following 3 conditions are satisfied:\n // target is not selectable ( otherwise we selected it )\n // target is not editing\n // target is not already selected ( otherwise we drag )\n if (\n this.selection &&\n (!target ||\n (!target.selectable &&\n !(target as IText).isEditing &&\n target !== this._activeObject))\n ) {\n const p = this.getScenePoint(e);\n this._groupSelector = {\n x: p.x,\n y: p.y,\n deltaY: 0,\n deltaX: 0,\n };\n }\n\n // check again because things could have changed\n alreadySelected = !!target && target === this._activeObject;\n if (target) {\n if (target.selectable && target.activeOn === 'down') {\n this.setActiveObject(target, e);\n }\n const handle = target.findControl(\n this.getViewportPoint(e),\n isTouchEvent(e),\n );\n if (target === this._activeObject && (handle || !grouped)) {\n this._setupCurrentTransform(e, target, alreadySelected);\n const control = handle ? handle.control : undefined,\n pointer = this.getScenePoint(e),\n mouseDownHandler =\n control && control.getMouseDownHandler(e, target, control);\n mouseDownHandler &&\n mouseDownHandler.call(\n control,\n e,\n this._currentTransform!,\n pointer.x,\n pointer.y,\n );\n }\n }\n // we clear `_objectsToRender` in case of a change in order to repopulate it at rendering\n // run before firing the `down` event to give the dev a chance to populate it themselves\n shouldRender && (this._objectsToRender = undefined);\n this._handleEvent(e, 'down', { alreadySelected: alreadySelected });\n // we must renderAll so that we update the visuals\n shouldRender && this.requestRenderAll();\n }\n\n /**\n * reset cache form common information needed during event processing\n * @private\n */\n _resetTransformEventData() {\n this._targetInfo = this._viewportPoint = this._scenePoint = undefined;\n }\n\n /**\n * Cache common information needed during event processing\n * @private\n * @param {Event} e Event object fired on event\n */\n _cacheTransformEventData(e: TPointerEvent) {\n // reset in order to avoid stale caching\n this._resetTransformEventData();\n this._viewportPoint = this.getViewportPoint(e);\n this._scenePoint = sendPointToPlane(\n this._viewportPoint,\n undefined,\n this.viewportTransform,\n );\n this._targetInfo = this.findTarget(e);\n // TODO: investigate better if this can be made less implicit in the code\n if (this._currentTransform) {\n this._targetInfo.target = this._currentTransform.target;\n }\n }\n\n /**\n * Method that defines the actions when mouse is hovering the canvas.\n * The currentTransform parameter will define whether the user is rotating/scaling/translating\n * an image or neither of them (only hovering). A group selection is also possible and would cancel\n * all any other type of action.\n * In case of an image transformation only the top canvas will be rendered.\n * @private\n * @param {Event} e Event object fired on mousemove\n */\n __onMouseMove(e: TPointerEvent) {\n this._isClick = false;\n this._handleEvent(e, 'move:before');\n\n if (this.isDrawingMode) {\n this._onMouseMoveInDrawingMode(e);\n return;\n }\n\n if (!this._isMainEvent(e)) {\n return;\n }\n\n const groupSelector = this._groupSelector;\n\n // We initially clicked in an empty area, so we draw a box for multiple selection\n if (groupSelector) {\n const pointer = this.getScenePoint(e);\n\n groupSelector.deltaX = pointer.x - groupSelector.x;\n groupSelector.deltaY = pointer.y - groupSelector.y;\n\n this.renderTop();\n } else if (!this._currentTransform) {\n const { target } = this.findTarget(e);\n this._setCursorFromEvent(e, target);\n this._fireOverOutEvents(e, target);\n } else {\n this._transformObject(e);\n }\n this.textEditingManager.onMouseMove(e);\n this._handleEvent(e, 'move');\n }\n\n /**\n * Manage the mouseout, mouseover events for the fabric object on the canvas\n * @param {Fabric.Object} target the target where the target from the mousemove event\n * @param {Event} e Event object fired on mousemove\n * @private\n */\n _fireOverOutEvents(e: TPointerEvent, target?: FabricObject) {\n const { _hoveredTarget, _hoveredTargets } = this,\n { subTargets } = this.findTarget(e),\n length = Math.max(_hoveredTargets.length, subTargets.length);\n\n this.fireSyntheticInOutEvents('mouse', {\n e,\n target,\n oldTarget: _hoveredTarget,\n fireCanvas: true,\n });\n for (let i = 0; i < length; i++) {\n if (\n subTargets[i] === target ||\n (_hoveredTargets[i] && _hoveredTargets[i] === _hoveredTarget)\n ) {\n continue;\n }\n this.fireSyntheticInOutEvents('mouse', {\n e,\n target: subTargets[i],\n oldTarget: _hoveredTargets[i],\n });\n }\n this._hoveredTarget = target;\n this._hoveredTargets = subTargets;\n }\n\n /**\n * Manage the dragEnter, dragLeave events for the fabric objects on the canvas\n * @param {Fabric.Object} target the target where the target from the onDrag event\n * @param {Object} data Event object fired on dragover\n * @private\n */\n _fireEnterLeaveEvents(\n e: TPointerEvent,\n target: FabricObject | undefined,\n data: DragEventData,\n ) {\n const draggedoverTarget = this._draggedoverTarget,\n _hoveredTargets = this._hoveredTargets,\n { subTargets } = this.findTarget(e),\n length = Math.max(_hoveredTargets.length, subTargets.length);\n\n this.fireSyntheticInOutEvents('drag', {\n ...data,\n target,\n oldTarget: draggedoverTarget,\n fireCanvas: true,\n });\n for (let i = 0; i < length; i++) {\n this.fireSyntheticInOutEvents('drag', {\n ...data,\n target: subTargets[i],\n oldTarget: _hoveredTargets[i],\n });\n }\n this._draggedoverTarget = target;\n }\n\n /**\n * Manage the synthetic in/out events for the fabric objects on the canvas\n * @param {Fabric.Object} target the target where the target from the supported events\n * @param {Object} data Event object fired\n * @param {Object} config configuration for the function to work\n * @param {String} config.targetName property on the canvas where the old target is stored\n * @param {String} [config.canvasEvtOut] name of the event to fire at canvas level for out\n * @param {String} config.evtOut name of the event to fire for out\n * @param {String} [config.canvasEvtIn] name of the event to fire at canvas level for in\n * @param {String} config.evtIn name of the event to fire for in\n * @private\n */\n fireSyntheticInOutEvents(\n type: T,\n {\n target,\n oldTarget,\n fireCanvas,\n e,\n ...data\n }: TSyntheticEventContext[T] & {\n target?: FabricObject;\n oldTarget?: FabricObject;\n fireCanvas?: boolean;\n },\n ) {\n const { targetIn, targetOut, canvasIn, canvasOut } =\n syntheticEventConfig[type];\n const targetChanged = oldTarget !== target;\n\n if (oldTarget && targetChanged) {\n const outOpt: CanvasEvents[typeof canvasOut] = {\n ...data,\n e,\n target: oldTarget,\n nextTarget: target,\n ...getEventPoints(this, e),\n };\n fireCanvas && this.fire(canvasOut, outOpt);\n oldTarget.fire(targetOut, outOpt);\n }\n if (target && targetChanged) {\n const inOpt: CanvasEvents[typeof canvasIn] = {\n ...data,\n e,\n target,\n previousTarget: oldTarget,\n ...getEventPoints(this, e),\n };\n fireCanvas && this.fire(canvasIn, inOpt);\n target.fire(targetIn, inOpt);\n }\n }\n\n /**\n * @private\n * @param {Event} e Event fired on mousemove\n */\n _transformObject(e: TPointerEvent) {\n const scenePoint = this.getScenePoint(e),\n transform = this._currentTransform!,\n target = transform.target,\n // transform pointer to target's containing coordinate plane\n // both pointer and object should agree on every point\n localPointer = target.group\n ? sendPointToPlane(\n scenePoint,\n undefined,\n target.group.calcTransformMatrix(),\n )\n : scenePoint;\n transform.shiftKey = e.shiftKey;\n transform.altKey = !!this.centeredKey && e[this.centeredKey];\n\n this._performTransformAction(e, transform, localPointer);\n transform.actionPerformed && this.requestRenderAll();\n }\n\n /**\n * @private\n */\n _performTransformAction(\n e: TPointerEvent,\n transform: Transform,\n pointer: Point,\n ) {\n const { action, actionHandler, target } = transform;\n\n const actionPerformed =\n !!actionHandler && actionHandler(e, transform, pointer.x, pointer.y);\n actionPerformed && target.setCoords();\n\n // this object could be created from the function in the control handlers\n if (action === 'drag' && actionPerformed) {\n transform.target.isMoving = true;\n this.setCursor(transform.target.moveCursor || this.moveCursor);\n }\n transform.actionPerformed = transform.actionPerformed || actionPerformed;\n }\n\n /**\n * Sets the cursor depending on where the canvas is being hovered.\n * Note: very buggy in Opera\n * @param {Event} e Event object\n * @param {Object} target Object that the mouse is hovering, if so.\n */\n _setCursorFromEvent(e: TPointerEvent, target?: FabricObject) {\n if (!target) {\n this.setCursor(this.defaultCursor);\n return;\n }\n let hoverCursor = target.hoverCursor || this.hoverCursor;\n const activeSelection = isActiveSelection(this._activeObject)\n ? this._activeObject\n : null,\n // only show proper corner when group selection is not active\n corner =\n (!activeSelection || target.group !== activeSelection) &&\n // here we call findTargetCorner always with undefined for the touch parameter.\n // we assume that if you are using a cursor you do not need to interact with\n // the bigger touch area.\n target.findControl(this.getViewportPoint(e));\n\n if (!corner) {\n if ((target as Group).subTargetCheck) {\n // hoverCursor should come from top-most subTarget,\n // so we walk the array backwards\n const { subTargets } = this.findTarget(e);\n subTargets\n .concat()\n .reverse()\n .forEach((_target) => {\n hoverCursor = _target.hoverCursor || hoverCursor;\n });\n }\n this.setCursor(hoverCursor);\n } else {\n const { control, coord } = corner;\n this.setCursor(control.cursorStyleHandler(e, control, target, coord));\n }\n }\n\n /**\n * ## Handles multiple selection\n * - toggles `target` selection (selects/deselects `target` if it isn't/is selected respectively)\n * - sets the active object in case it is not set or in case there is a single active object left under active selection.\n * ---\n * - If the active object is the active selection we add/remove `target` from it\n * - If not, add the active object and `target` to the active selection and make it the active object.\n * @TODO rewrite this after find target is refactored\n * @private\n * @param {TPointerEvent} e Event object\n * @param {FabricObject} target target of event to select/deselect\n * @returns true if grouping occurred\n */\n protected handleMultiSelection(e: TPointerEvent, target?: FabricObject) {\n const activeObject = this._activeObject;\n const isAS = isActiveSelection(activeObject);\n if (\n // check if an active object exists on canvas and if the user is pressing the `selectionKey` while canvas supports multi selection.\n !!activeObject &&\n this._isSelectionKeyPressed(e) &&\n this.selection &&\n // on top of that the user also has to hit a target that is selectable.\n !!target &&\n target.selectable &&\n // group target and active object only if they are different objects\n // else we try to find a subtarget of `ActiveSelection`\n (activeObject !== target || isAS) &&\n // make sure `activeObject` and `target` aren't ancestors of each other in case `activeObject` is not `ActiveSelection`\n // if it is then we want to remove `target` from it\n (isAS ||\n (!target.isDescendantOf(activeObject) &&\n !activeObject.isDescendantOf(target))) &&\n // target accepts selection\n !target.onSelect({ e }) &&\n // make sure we are not on top of a control\n !activeObject.getActiveControl()\n ) {\n if (isAS) {\n const prevActiveObjects = activeObject.getObjects();\n let subTargets: FabricObject[] = [];\n // const { subTargets: testSubTargets } = this.findTarget(e);\n if (target === activeObject) {\n const pointer = this.getScenePoint(e);\n let targetInfo = this.searchPossibleTargets(\n prevActiveObjects,\n pointer,\n );\n // console.log(testSubTargets.includes(targetInfo.target));\n if (targetInfo.target) {\n target = targetInfo.target;\n subTargets = targetInfo.subTargets;\n } else {\n targetInfo = this.searchPossibleTargets(this._objects, pointer);\n target = targetInfo.target;\n subTargets = targetInfo.subTargets;\n }\n // if nothing is found bail out\n if (!target || !target.selectable) {\n return false;\n }\n }\n if (target.group === activeObject) {\n // `target` is part of active selection => remove it\n activeObject.remove(target);\n this._hoveredTarget = target;\n this._hoveredTargets = subTargets;\n // if after removing an object we are left with one only...\n if (activeObject.size() === 1) {\n // activate last remaining object\n // deselecting the active selection will remove the remaining object from it\n this._setActiveObject(activeObject.item(0), e);\n }\n } else {\n // `target` isn't part of active selection => add it\n activeObject.multiSelectAdd(target);\n this._hoveredTarget = activeObject;\n this._hoveredTargets = subTargets;\n }\n this._fireSelectionEvents(prevActiveObjects, e);\n } else {\n (activeObject as IText).isEditing &&\n (activeObject as IText).exitEditing();\n // add the active object and the target to the active selection and set it as the active object\n const klass =\n classRegistry.getClass('ActiveSelection');\n const newActiveSelection = new klass([], {\n /**\n * it is crucial to pass the canvas ref before calling {@link ActiveSelection#multiSelectAdd}\n * since it uses {@link FabricObject#isInFrontOf} which relies on the canvas ref\n */\n canvas: this,\n });\n newActiveSelection.multiSelectAdd(activeObject, target);\n this._hoveredTarget = newActiveSelection;\n // ISSUE 4115: should we consider subTargets here?\n // this._hoveredTargets = [];\n // this._hoveredTargets = this.targets.concat();\n this._setActiveObject(newActiveSelection, e);\n this._fireSelectionEvents([activeObject], e);\n }\n return true;\n }\n return false;\n }\n\n /**\n * ## Handles selection\n * - selects objects that are contained in (and possibly intersecting) the selection bounding box\n * - sets the active object\n * ---\n * runs on mouse up after a mouse move\n */\n protected handleSelection(e: TPointerEvent) {\n if (!this.selection || !this._groupSelector) {\n return false;\n }\n const { x, y, deltaX, deltaY } = this._groupSelector,\n point1 = new Point(x, y),\n point2 = point1.add(new Point(deltaX, deltaY)),\n tl = point1.min(point2),\n br = point1.max(point2),\n size = br.subtract(tl);\n\n const collectedObjects = this.collectObjects(\n {\n left: tl.x,\n top: tl.y,\n width: size.x,\n height: size.y,\n },\n { includeIntersecting: !this.selectionFullyContained },\n ) as FabricObject[];\n\n const objects =\n // though this method runs only after mouse move the pointer could do a mouse up on the same position as mouse down\n // should it be handled as is?\n point1.eq(point2)\n ? collectedObjects[0]\n ? [collectedObjects[0]]\n : []\n : collectedObjects.length > 1\n ? collectedObjects\n .filter((object) => !object.onSelect({ e }))\n .reverse()\n : // `setActiveObject` will call `onSelect(collectedObjects[0])` in this case\n collectedObjects;\n\n // set active object\n if (objects.length === 1) {\n // set as active object\n this.setActiveObject(objects[0], e);\n } else if (objects.length > 1) {\n // add to active selection and make it the active object\n const klass =\n classRegistry.getClass('ActiveSelection');\n this.setActiveObject(new klass(objects, { canvas: this }), e);\n }\n\n // cleanup\n this._groupSelector = null;\n return true;\n }\n\n /**\n * @override clear {@link textEditingManager}\n */\n clear() {\n this.textEditingManager.clear();\n super.clear();\n }\n\n /**\n * @override clear {@link textEditingManager}\n */\n destroy() {\n this.removeListeners();\n this.textEditingManager.dispose();\n super.destroy();\n }\n}\n","export const linearDefaultCoords = {\n x1: 0,\n y1: 0,\n x2: 0,\n y2: 0,\n};\n\nexport const radialDefaultCoords = {\n ...linearDefaultCoords,\n r1: 0,\n r2: 0,\n};\n","/**\n *\n * @param value value to check if NaN\n * @param [valueIfNaN]\n * @returns `fallback` is `value is NaN\n */\nexport const ifNaN = (value: number, valueIfNaN?: number) => {\n return isNaN(value) && typeof valueIfNaN === 'number' ? valueIfNaN : value;\n};\n","import { ifNaN } from '../util/internals/ifNaN';\nimport { capValue } from '../util/misc/capValue';\n\nconst RE_PERCENT = /^(\\d+\\.\\d+)%|(\\d+)%$/;\n\nexport function isPercent(value: string | null) {\n return value && RE_PERCENT.test(value);\n}\n\n/**\n *\n * @param value\n * @param valueIfNaN\n * @returns ∈ [0, 1]\n */\nexport function parsePercent(\n value: string | number | null | undefined,\n valueIfNaN?: number,\n) {\n const parsed =\n typeof value === 'number'\n ? value\n : typeof value === 'string'\n ? parseFloat(value) / (isPercent(value) ? 100 : 1)\n : NaN;\n return capValue(0, ifNaN(parsed, valueIfNaN), 1);\n}\n","import { Color } from '../../color/Color';\nimport { parsePercent } from '../../parser/percent';\nimport { ifNaN } from '../../util/internals/ifNaN';\nimport type { ColorStop } from '../typedefs';\n\nconst RE_KEY_VALUE_PAIRS = /\\s*;\\s*/;\nconst RE_KEY_VALUE = /\\s*:\\s*/;\n\nfunction parseColorStop(el: SVGStopElement, opacityMultiplier: number) {\n let colorValue, opacityValue;\n const style = el.getAttribute('style');\n if (style) {\n const keyValuePairs = style.split(RE_KEY_VALUE_PAIRS);\n\n if (keyValuePairs[keyValuePairs.length - 1] === '') {\n keyValuePairs.pop();\n }\n\n for (let i = keyValuePairs.length; i--; ) {\n const [key, value] = keyValuePairs[i]\n .split(RE_KEY_VALUE)\n .map((s) => s.trim());\n if (key === 'stop-color') {\n colorValue = value;\n } else if (key === 'stop-opacity') {\n opacityValue = value;\n }\n }\n }\n\n colorValue = colorValue || el.getAttribute('stop-color') || 'rgb(0,0,0)';\n opacityValue = ifNaN(\n parseFloat(opacityValue || el.getAttribute('stop-opacity') || ''),\n 1,\n );\n\n const color = new Color(colorValue);\n\n color.setAlpha(color.getAlpha() * opacityValue * opacityMultiplier);\n\n return {\n offset: parsePercent(el.getAttribute('offset'), 0),\n color: color.toRgba(),\n };\n}\n\nexport function parseColorStops(\n el: SVGGradientElement,\n opacityAttr: string | null,\n) {\n const colorStops: ColorStop[] = [],\n colorStopEls = el.getElementsByTagName('stop'),\n multiplier = parsePercent(opacityAttr, 1);\n for (let i = colorStopEls.length; i--; ) {\n colorStops.push(parseColorStop(colorStopEls[i], multiplier));\n }\n return colorStops;\n}\n","import type { GradientType, GradientUnits } from '../typedefs';\n\nexport function parseType(el: SVGGradientElement): GradientType {\n return el.nodeName === 'linearGradient' || el.nodeName === 'LINEARGRADIENT'\n ? 'linear'\n : 'radial';\n}\n\nexport function parseGradientUnits(el: SVGGradientElement): GradientUnits {\n return el.getAttribute('gradientUnits') === 'userSpaceOnUse'\n ? 'pixels'\n : 'percentage';\n}\n","import { isPercent } from '../../parser/percent';\nimport type { TSize } from '../../typedefs';\nimport type { GradientCoords, GradientType, GradientUnits } from '../typedefs';\nimport { parseGradientUnits, parseType } from './misc';\n\nfunction convertPercentUnitsToValues<\n T extends GradientType,\n K extends keyof GradientCoords,\n>(\n valuesToConvert: Record,\n { width, height, gradientUnits }: TSize & { gradientUnits: GradientUnits },\n) {\n let finalValue;\n return (Object.keys(valuesToConvert) as K[]).reduce(\n (acc, prop) => {\n const propValue = valuesToConvert[prop];\n if (propValue === 'Infinity') {\n finalValue = 1;\n } else if (propValue === '-Infinity') {\n finalValue = 0;\n } else {\n finalValue =\n typeof propValue === 'string' ? parseFloat(propValue) : propValue;\n if (typeof propValue === 'string' && isPercent(propValue)) {\n finalValue *= 0.01;\n if (gradientUnits === 'pixels') {\n // then we need to fix those percentages here in svg parsing\n if (prop === 'x1' || prop === 'x2' || prop === 'r2') {\n finalValue *= width;\n }\n if (prop === 'y1' || prop === 'y2') {\n finalValue *= height;\n }\n }\n }\n }\n acc[prop] = finalValue;\n return acc;\n },\n {} as Record,\n );\n}\n\nfunction getValue(el: SVGGradientElement, key: string) {\n return el.getAttribute(key);\n}\n\nexport function parseLinearCoords(el: SVGGradientElement) {\n return {\n x1: getValue(el, 'x1') || 0,\n y1: getValue(el, 'y1') || 0,\n x2: getValue(el, 'x2') || '100%',\n y2: getValue(el, 'y2') || 0,\n };\n}\n\nexport function parseRadialCoords(el: SVGGradientElement) {\n return {\n x1: getValue(el, 'fx') || getValue(el, 'cx') || '50%',\n y1: getValue(el, 'fy') || getValue(el, 'cy') || '50%',\n r1: 0,\n x2: getValue(el, 'cx') || '50%',\n y2: getValue(el, 'cy') || '50%',\n r2: getValue(el, 'r') || '50%',\n };\n}\n\nexport function parseCoords(el: SVGGradientElement, size: TSize) {\n return convertPercentUnitsToValues(\n parseType(el) === 'linear' ? parseLinearCoords(el) : parseRadialCoords(el),\n {\n ...size,\n gradientUnits: parseGradientUnits(el),\n },\n );\n}\n","import { iMatrix } from '../constants';\nimport { parseTransformAttribute } from '../parser/parseTransformAttribute';\nimport type { FabricObject } from '../shapes/Object/FabricObject';\nimport type { TMat2D } from '../typedefs';\nimport { uid } from '../util/internals/uid';\nimport { pick } from '../util/misc/pick';\nimport { matrixToSVG } from '../util/misc/svgExport';\nimport { linearDefaultCoords, radialDefaultCoords } from './constants';\nimport { parseColorStops } from './parser/parseColorStops';\nimport { parseCoords } from './parser/parseCoords';\nimport { parseType, parseGradientUnits } from './parser/misc';\nimport type {\n ColorStop,\n GradientCoords,\n GradientOptions,\n GradientType,\n GradientUnits,\n SVGOptions,\n SerializedGradientProps,\n} from './typedefs';\nimport { classRegistry } from '../ClassRegistry';\nimport { isPath } from '../util/typeAssertions';\n\n/**\n * Gradient class\n * @class Gradient\n * @see {@link http://fabric5.fabricjs.com/fabric-intro-part-2#gradients}\n */\nexport class Gradient<\n S,\n T extends GradientType = S extends GradientType ? S : 'linear',\n> {\n /**\n * Horizontal offset for aligning gradients coming from SVG when outside pathgroups\n * @type Number\n * @default 0\n */\n declare offsetX: number;\n\n /**\n * Vertical offset for aligning gradients coming from SVG when outside pathgroups\n * @type Number\n * @default 0\n */\n declare offsetY: number;\n\n /**\n * A transform matrix to apply to the gradient before painting.\n * Imported from svg gradients, is not applied with the current transform in the center.\n * Before this transform is applied, the origin point is at the top left corner of the object\n * plus the addition of offsetY and offsetX.\n * @type Number[]\n * @default null\n */\n declare gradientTransform?: TMat2D;\n\n /**\n * coordinates units for coords.\n * If `pixels`, the number of coords are in the same unit of width / height.\n * If set as `percentage` the coords are still a number, but 1 means 100% of width\n * for the X and 100% of the height for the y. It can be bigger than 1 and negative.\n * allowed values pixels or percentage.\n * @type GradientUnits\n * @default 'pixels'\n */\n declare gradientUnits: GradientUnits;\n\n /**\n * Gradient type linear or radial\n * @type GradientType\n * @default 'linear'\n */\n declare type: T;\n\n /**\n * Defines how the gradient is located in space and spread\n * @type GradientCoords\n */\n declare coords: GradientCoords;\n\n /**\n * Defines how many colors a gradient has and how they are located on the axis\n * defined by coords\n * @type GradientCoords\n */\n declare colorStops: ColorStop[];\n\n /**\n * If true, this object will not be exported during the serialization of a canvas\n * @type boolean\n */\n declare excludeFromExport?: boolean;\n\n /**\n * ID used for SVG export functionalities\n * @type number | string\n */\n declare readonly id: string | number;\n\n static type = 'Gradient';\n\n constructor(options: GradientOptions) {\n const {\n type = 'linear' as T,\n gradientUnits = 'pixels',\n coords = {},\n colorStops = [],\n offsetX = 0,\n offsetY = 0,\n gradientTransform,\n id,\n } = options || {};\n Object.assign(this, {\n type,\n gradientUnits,\n coords: {\n ...(type === 'radial' ? radialDefaultCoords : linearDefaultCoords),\n ...coords,\n },\n colorStops,\n offsetX,\n offsetY,\n gradientTransform,\n id: id ? `${id}_${uid()}` : uid(),\n });\n }\n\n /**\n * Adds another colorStop\n * @param {Record} colorStop Object with offset and color\n * @return {Gradient} thisArg\n */\n addColorStop(colorStops: Record) {\n for (const position in colorStops) {\n this.colorStops.push({\n offset: parseFloat(position),\n color: colorStops[position],\n });\n }\n return this;\n }\n\n /**\n * Returns object representation of a gradient\n * @param {string[]} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {object}\n */\n toObject(\n propertiesToInclude?: (keyof this | string)[],\n ): SerializedGradientProps {\n return {\n ...pick(this, propertiesToInclude as (keyof this)[]),\n type: this.type,\n coords: { ...this.coords },\n colorStops: this.colorStops.map((colorStop) => ({ ...colorStop })),\n offsetX: this.offsetX,\n offsetY: this.offsetY,\n gradientUnits: this.gradientUnits,\n gradientTransform: this.gradientTransform\n ? [...this.gradientTransform]\n : undefined,\n };\n }\n\n /* _TO_SVG_START_ */\n /**\n * Returns SVG representation of an gradient\n * @param {FabricObject} object Object to create a gradient for\n * @return {String} SVG representation of an gradient (linear/radial)\n */\n toSVG(\n object: FabricObject,\n {\n additionalTransform: preTransform,\n }: { additionalTransform?: string } = {},\n ) {\n const markup = [],\n transform = (\n this.gradientTransform\n ? this.gradientTransform.concat()\n : iMatrix.concat()\n ) as TMat2D,\n gradientUnits =\n this.gradientUnits === 'pixels'\n ? 'userSpaceOnUse'\n : 'objectBoundingBox';\n // colorStops must be sorted ascending, and guarded against deep mutations\n const colorStops = this.colorStops\n .map((colorStop) => ({ ...colorStop }))\n .sort((a, b) => {\n return a.offset - b.offset;\n });\n\n let offsetX = -this.offsetX,\n offsetY = -this.offsetY;\n if (gradientUnits === 'objectBoundingBox') {\n offsetX /= object.width;\n offsetY /= object.height;\n } else {\n offsetX += object.width / 2;\n offsetY += object.height / 2;\n }\n // todo what about polygon/polyline?\n if (isPath(object) && this.gradientUnits !== 'percentage') {\n offsetX -= object.pathOffset.x;\n offsetY -= object.pathOffset.y;\n }\n transform[4] -= offsetX;\n transform[5] -= offsetY;\n\n const commonAttributes = [\n `id=\"SVGID_${this.id}\"`,\n `gradientUnits=\"${gradientUnits}\"`,\n `gradientTransform=\"${\n preTransform ? preTransform + ' ' : ''\n }${matrixToSVG(transform)}\"`,\n '',\n ].join(' ');\n\n if (this.type === 'linear') {\n const { x1, y1, x2, y2 } = this.coords;\n markup.push(\n '\\n',\n );\n } else if (this.type === 'radial') {\n const { x1, y1, x2, y2, r1, r2 } = this\n .coords as GradientCoords<'radial'>;\n const needsSwap = r1 > r2;\n // svg radial gradient has just 1 radius. the biggest.\n markup.push(\n '\\n',\n );\n if (needsSwap) {\n // svg goes from internal to external radius. if radius are inverted, swap color stops.\n colorStops.reverse(); // mutates array\n colorStops.forEach((colorStop) => {\n colorStop.offset = 1 - colorStop.offset;\n });\n }\n const minRadius = Math.min(r1, r2);\n if (minRadius > 0) {\n // i have to shift all colorStops and add new one in 0.\n const maxRadius = Math.max(r1, r2),\n percentageShift = minRadius / maxRadius;\n colorStops.forEach((colorStop) => {\n colorStop.offset += percentageShift * (1 - colorStop.offset);\n });\n }\n }\n\n colorStops.forEach(({ color, offset }) => {\n markup.push(\n `\\n`,\n );\n });\n\n markup.push(\n this.type === 'linear' ? '' : '',\n '\\n',\n );\n\n return markup.join('');\n }\n /* _TO_SVG_END_ */\n\n /**\n * Returns an instance of CanvasGradient\n * @param {CanvasRenderingContext2D} ctx Context to render on\n * @return {CanvasGradient}\n */\n toLive(ctx: CanvasRenderingContext2D): CanvasGradient {\n const { x1, y1, x2, y2, r1, r2 } = this.coords as GradientCoords<'radial'>;\n const gradient =\n this.type === 'linear'\n ? ctx.createLinearGradient(x1, y1, x2, y2)\n : ctx.createRadialGradient(x1, y1, r1, x2, y2, r2);\n\n this.colorStops.forEach(({ color, offset }) => {\n gradient.addColorStop(offset, color);\n });\n\n return gradient;\n }\n\n static async fromObject(\n options: GradientOptions<'linear'>,\n ): Promise>;\n static async fromObject(\n options: GradientOptions<'radial'>,\n ): Promise>;\n static async fromObject(\n options: GradientOptions<'linear'> | GradientOptions<'radial'>,\n ) {\n const { colorStops, gradientTransform } = options;\n return new this({\n ...options,\n colorStops: colorStops\n ? colorStops.map((colorStop) => ({ ...colorStop }))\n : undefined,\n gradientTransform: gradientTransform ? [...gradientTransform] : undefined,\n });\n }\n\n /* _FROM_SVG_START_ */\n /**\n * Returns {@link Gradient} instance from an SVG element\n * @param {SVGGradientElement} el SVG gradient element\n * @param {FabricObject} instance\n * @param {String} opacity A fill-opacity or stroke-opacity attribute to multiply to each stop's opacity.\n * @param {SVGOptions} svgOptions an object containing the size of the SVG in order to parse correctly gradients\n * that uses gradientUnits as 'userSpaceOnUse' and percentages.\n * @return {Gradient} Gradient instance\n * @see http://www.w3.org/TR/SVG/pservers.html#LinearGradientElement\n * @see http://www.w3.org/TR/SVG/pservers.html#RadialGradientElement\n *\n * @example\n *\n * \n * \n * \n * \n *\n * OR\n *\n * \n * \n * \n * \n *\n * OR\n *\n * \n * \n * \n * \n * \n *\n * OR\n *\n * \n * \n * \n * \n * \n *\n */\n static fromElement(\n el: SVGGradientElement,\n instance: FabricObject,\n svgOptions: SVGOptions,\n ): Gradient {\n const gradientUnits = parseGradientUnits(el);\n const center = instance._findCenterFromElement();\n return new this({\n id: el.getAttribute('id') || undefined,\n type: parseType(el),\n coords: parseCoords(el, {\n width: svgOptions.viewBoxWidth || svgOptions.width,\n height: svgOptions.viewBoxHeight || svgOptions.height,\n }),\n colorStops: parseColorStops(el, svgOptions.opacity),\n gradientUnits,\n gradientTransform: parseTransformAttribute(\n el.getAttribute('gradientTransform') || '',\n ),\n ...(gradientUnits === 'pixels'\n ? {\n offsetX: instance.width / 2 - center.x,\n offsetY: instance.height / 2 - center.y,\n }\n : {\n offsetX: 0,\n offsetY: 0,\n }),\n });\n }\n /* _FROM_SVG_END_ */\n}\n\nclassRegistry.setClass(Gradient, 'gradient');\nclassRegistry.setClass(Gradient, 'linear');\nclassRegistry.setClass(Gradient, 'radial');\n","import { config } from '../config';\nimport type { Abortable, TCrossOrigin, TMat2D, TSize } from '../typedefs';\nimport { ifNaN } from '../util/internals/ifNaN';\nimport { uid } from '../util/internals/uid';\nimport { loadImage } from '../util/misc/objectEnlive';\nimport { pick } from '../util/misc/pick';\nimport { toFixed } from '../util/misc/toFixed';\nimport { classRegistry } from '../ClassRegistry';\nimport type {\n PatternRepeat,\n PatternOptions,\n SerializedPatternOptions,\n} from './types';\nimport { log } from '../util/internals/console';\n\n/**\n * @see {@link http://fabric5.fabricjs.com/patterns demo}\n * @see {@link http://fabric5.fabricjs.com/dynamic-patterns demo}\n */\nexport class Pattern {\n static type = 'Pattern';\n\n /**\n * Legacy identifier of the class. Prefer using this.constructor.type 'Pattern'\n * or utils like isPattern, or instance of to indentify a pattern in your code.\n * Will be removed in future versiones\n * @TODO add sustainable warning message\n * @type string\n * @deprecated\n */\n get type() {\n return 'pattern';\n }\n\n set type(value) {\n log('warn', 'Setting type has no effect', value);\n }\n\n /**\n * @type PatternRepeat\n * @defaults\n */\n repeat: PatternRepeat = 'repeat';\n\n /**\n * Pattern horizontal offset from object's left/top corner\n * @type Number\n */\n offsetX = 0;\n\n /**\n * Pattern vertical offset from object's left/top corner\n * @type Number\n */\n offsetY = 0;\n\n /**\n * @type TCrossOrigin\n */\n crossOrigin: TCrossOrigin = '';\n\n /**\n * transform matrix to change the pattern, imported from svgs.\n * @todo verify if using the identity matrix as default makes the rest of the code more easy\n * @type Array\n */\n declare patternTransform?: TMat2D;\n\n /**\n * The actual pixel source of the pattern\n */\n declare source: CanvasImageSource;\n\n /**\n * If true, this object will not be exported during the serialization of a canvas\n * @type boolean\n */\n declare excludeFromExport?: boolean;\n\n /**\n * ID used for SVG export functionalities\n * @type number\n */\n declare readonly id: number;\n\n /**\n * Constructor\n * @param {Object} [options] Options object\n * @param {option.source} [source] the pattern source, eventually empty or a drawable\n */\n constructor(options: PatternOptions) {\n this.id = uid();\n Object.assign(this, options);\n }\n\n /**\n * @returns true if {@link source} is an element\n */\n isImageSource(): this is { source: HTMLImageElement } {\n return (\n !!this.source && typeof (this.source as HTMLImageElement).src === 'string'\n );\n }\n\n /**\n * @returns true if {@link source} is a element\n */\n isCanvasSource(): this is { source: HTMLCanvasElement } {\n return !!this.source && !!(this.source as HTMLCanvasElement).toDataURL;\n }\n\n sourceToString(): string {\n return this.isImageSource()\n ? this.source.src\n : this.isCanvasSource()\n ? this.source.toDataURL()\n : '';\n }\n\n /**\n * Returns an instance of CanvasPattern\n * @param {CanvasRenderingContext2D} ctx Context to create pattern\n * @return {CanvasPattern}\n */\n toLive(ctx: CanvasRenderingContext2D): CanvasPattern | null {\n if (\n // if the image failed to load, return, and allow rest to continue loading\n !this.source ||\n // if an image\n (this.isImageSource() &&\n (!this.source.complete ||\n this.source.naturalWidth === 0 ||\n this.source.naturalHeight === 0))\n ) {\n return null;\n }\n\n return ctx.createPattern(this.source, this.repeat)!;\n }\n\n /**\n * Returns object representation of a pattern\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {object} Object representation of a pattern instance\n */\n toObject(propertiesToInclude: string[] = []): Record {\n const { repeat, crossOrigin } = this;\n return {\n ...pick(this, propertiesToInclude as (keyof this)[]),\n type: 'pattern',\n source: this.sourceToString(),\n repeat,\n crossOrigin,\n offsetX: toFixed(this.offsetX, config.NUM_FRACTION_DIGITS),\n offsetY: toFixed(this.offsetY, config.NUM_FRACTION_DIGITS),\n patternTransform: this.patternTransform\n ? [...this.patternTransform]\n : null,\n };\n }\n\n /* _TO_SVG_START_ */\n /**\n * Returns SVG representation of a pattern\n */\n toSVG({ width, height }: TSize): string {\n const { source: patternSource, repeat, id } = this,\n patternOffsetX = ifNaN(this.offsetX / width, 0),\n patternOffsetY = ifNaN(this.offsetY / height, 0),\n patternWidth =\n repeat === 'repeat-y' || repeat === 'no-repeat'\n ? 1 + Math.abs(patternOffsetX || 0)\n : ifNaN((patternSource as HTMLImageElement).width / width, 0),\n patternHeight =\n repeat === 'repeat-x' || repeat === 'no-repeat'\n ? 1 + Math.abs(patternOffsetY || 0)\n : ifNaN((patternSource as HTMLImageElement).height / height, 0);\n\n return [\n ``,\n ``,\n ``,\n '',\n ].join('\\n');\n }\n /* _TO_SVG_END_ */\n\n static async fromObject(\n {\n type,\n source,\n patternTransform,\n ...otherOptions\n }: SerializedPatternOptions,\n options?: Abortable,\n ): Promise {\n const img = await loadImage(source, {\n ...options,\n crossOrigin: otherOptions.crossOrigin,\n });\n return new this({\n ...otherOptions,\n patternTransform:\n patternTransform && (patternTransform.slice(0) as TMat2D),\n source: img,\n });\n }\n}\n\nclassRegistry.setClass(Pattern);\n// kept for compatibility reason\nclassRegistry.setClass(Pattern, 'pattern');\n","import { Color } from '../color/Color';\nimport type { Point } from '../Point';\nimport type { Shadow } from '../Shadow';\nimport type { Canvas } from '../canvas/Canvas';\nimport type { TBrushEventData } from './typedefs';\n\n/**\n * @see {@link http://fabric5.fabricjs.com/freedrawing|Freedrawing demo}\n */\nexport abstract class BaseBrush {\n /**\n * Color of a brush\n * @type String\n */\n color = 'rgb(0, 0, 0)';\n\n /**\n * Width of a brush, has to be a Number, no string literals\n * @type Number\n */\n width = 1;\n\n /**\n * Shadow object representing shadow of this shape.\n * Backwards incompatibility note: This property replaces \"shadowColor\" (String), \"shadowOffsetX\" (Number),\n * \"shadowOffsetY\" (Number) and \"shadowBlur\" (Number) since v1.2.12\n * @type Shadow\n */\n shadow: Shadow | null = null;\n\n /**\n * Line endings style of a brush (one of \"butt\", \"round\", \"square\")\n * @type String\n */\n strokeLineCap: CanvasLineCap = 'round';\n\n /**\n * Corner style of a brush (one of \"bevel\", \"round\", \"miter\")\n * @type String\n */\n strokeLineJoin: CanvasLineJoin = 'round';\n\n /**\n * Maximum miter length (used for strokeLineJoin = \"miter\") of a brush's\n * @type Number\n */\n strokeMiterLimit = 10;\n\n /**\n * Stroke Dash Array.\n * @type Array\n */\n strokeDashArray: number[] | null = null;\n\n /**\n * When `true`, the free drawing is limited to the whiteboard size. Default to false.\n * @type Boolean\n * @default false\n */\n\n limitedToCanvasSize = false;\n\n /**\n * @todo add type\n */\n declare canvas: Canvas;\n\n constructor(canvas: Canvas) {\n this.canvas = canvas;\n }\n\n abstract _render(): void;\n abstract onMouseDown(pointer: Point, ev: TBrushEventData): void;\n abstract onMouseMove(pointer: Point, ev: TBrushEventData): void;\n /**\n * @returns true if brush should continue blocking interaction\n */\n abstract onMouseUp(ev: TBrushEventData): boolean | void;\n\n /**\n * Sets brush styles\n * @private\n * @param {CanvasRenderingContext2D} ctx\n */\n _setBrushStyles(ctx: CanvasRenderingContext2D) {\n ctx.strokeStyle = this.color;\n ctx.lineWidth = this.width;\n ctx.lineCap = this.strokeLineCap;\n ctx.miterLimit = this.strokeMiterLimit;\n ctx.lineJoin = this.strokeLineJoin;\n ctx.setLineDash(this.strokeDashArray || []);\n }\n\n /**\n * Sets the transformation on given context\n * @param {CanvasRenderingContext2D} ctx context to render on\n * @private\n */\n protected _saveAndTransform(ctx: CanvasRenderingContext2D) {\n const v = this.canvas.viewportTransform;\n ctx.save();\n ctx.transform(v[0], v[1], v[2], v[3], v[4], v[5]);\n }\n\n protected needsFullRender() {\n const color = new Color(this.color);\n return color.getAlpha() < 1 || !!this.shadow;\n }\n\n /**\n * Sets brush shadow styles\n * @private\n */\n protected _setShadow() {\n if (!this.shadow || !this.canvas) {\n return;\n }\n\n const canvas = this.canvas,\n shadow = this.shadow,\n ctx = canvas.contextTop,\n zoom = canvas.getZoom() * canvas.getRetinaScaling();\n\n ctx.shadowColor = shadow.color;\n ctx.shadowBlur = shadow.blur * zoom;\n ctx.shadowOffsetX = shadow.offsetX * zoom;\n ctx.shadowOffsetY = shadow.offsetY * zoom;\n }\n\n /**\n * Removes brush shadow styles\n * @private\n */\n protected _resetShadow() {\n const ctx = this.canvas.contextTop;\n\n ctx.shadowColor = '';\n ctx.shadowBlur = ctx.shadowOffsetX = ctx.shadowOffsetY = 0;\n }\n\n /**\n * Check is pointer is outside canvas boundaries\n * @param {Object} pointer\n * @private\n */\n protected _isOutSideCanvas(pointer: Point) {\n return (\n pointer.x < 0 ||\n pointer.x > this.canvas.getWidth() ||\n pointer.y < 0 ||\n pointer.y > this.canvas.getHeight()\n );\n }\n}\n","import { config } from '../config';\nimport { SHARED_ATTRIBUTES } from '../parser/attributes';\nimport { parseAttributes } from '../parser/parseAttributes';\nimport type { XY } from '../Point';\nimport { Point } from '../Point';\nimport { makeBoundingBoxFromPoints } from '../util/misc/boundingBoxFromPoints';\nimport { toFixed } from '../util/misc/toFixed';\nimport {\n getBoundsOfCurve,\n joinPath,\n makePathSimpler,\n parsePath,\n} from '../util/path';\nimport { classRegistry } from '../ClassRegistry';\nimport { FabricObject, cacheProperties } from './Object/FabricObject';\nimport type {\n TComplexPathData,\n TPathSegmentInfo,\n TSimplePathData,\n} from '../util/path/typedefs';\nimport type { FabricObjectProps, SerializedObjectProps } from './Object/types';\nimport type { ObjectEvents } from '../EventTypeDefs';\nimport type {\n TBBox,\n TClassProperties,\n TSVGReviver,\n TOptions,\n} from '../typedefs';\nimport { CENTER, LEFT, TOP } from '../constants';\nimport type { CSSRules } from '../parser/typedefs';\n\ninterface UniquePathProps {\n sourcePath?: string;\n path?: TSimplePathData;\n}\n\nexport interface SerializedPathProps\n extends SerializedObjectProps,\n UniquePathProps {}\n\nexport interface PathProps extends FabricObjectProps, UniquePathProps {}\n\nexport interface IPathBBox extends TBBox {\n left: number;\n top: number;\n pathOffset: Point;\n}\n\nexport class Path<\n Props extends TOptions = Partial,\n SProps extends SerializedPathProps = SerializedPathProps,\n EventSpec extends ObjectEvents = ObjectEvents,\n> extends FabricObject {\n /**\n * Array of path points\n * @type Array\n */\n declare path: TSimplePathData;\n\n declare pathOffset: Point;\n\n declare sourcePath?: string;\n\n declare segmentsInfo?: TPathSegmentInfo[];\n\n static type = 'Path';\n\n static cacheProperties = [...cacheProperties, 'path', 'fillRule'];\n\n /**\n * Constructor\n * @param {TComplexPathData} path Path data (sequence of coordinates and corresponding \"command\" tokens)\n * @param {Partial} [options] Options object\n * @return {Path} thisArg\n */\n constructor(\n path: TComplexPathData | string,\n // todo: evaluate this spread here\n { path: _, left, top, ...options }: Partial = {},\n ) {\n super();\n Object.assign(this, Path.ownDefaults);\n this.setOptions(options);\n this._setPath(path || [], true);\n typeof left === 'number' && this.set(LEFT, left);\n typeof top === 'number' && this.set(TOP, top);\n }\n\n /**\n * @private\n * @param {TComplexPathData | string} path Path data (sequence of coordinates and corresponding \"command\" tokens)\n * @param {boolean} [adjustPosition] pass true to reposition the object according to the bounding box\n * @returns {Point} top left position of the bounding box, useful for complementary positioning\n */\n _setPath(path: TComplexPathData | string, adjustPosition?: boolean) {\n this.path = makePathSimpler(Array.isArray(path) ? path : parsePath(path));\n this.setBoundingBox(adjustPosition);\n }\n\n /**\n * This function is an helper for svg import. it returns the center of the object in the svg\n * untransformed coordinates, by look at the polyline/polygon points.\n * @private\n * @return {Point} center point from element coordinates\n */\n _findCenterFromElement(): Point {\n const bbox = this._calcBoundsFromPath();\n return new Point(bbox.left + bbox.width / 2, bbox.top + bbox.height / 2);\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx context to render path on\n */\n _renderPathCommands(ctx: CanvasRenderingContext2D) {\n const l = -this.pathOffset.x,\n t = -this.pathOffset.y;\n\n ctx.beginPath();\n\n for (const command of this.path) {\n switch (\n command[0] // first letter\n ) {\n case 'L': // lineto, absolute\n ctx.lineTo(command[1] + l, command[2] + t);\n break;\n\n case 'M': // moveTo, absolute\n ctx.moveTo(command[1] + l, command[2] + t);\n break;\n\n case 'C': // bezierCurveTo, absolute\n ctx.bezierCurveTo(\n command[1] + l,\n command[2] + t,\n command[3] + l,\n command[4] + t,\n command[5] + l,\n command[6] + t,\n );\n break;\n\n case 'Q': // quadraticCurveTo, absolute\n ctx.quadraticCurveTo(\n command[1] + l,\n command[2] + t,\n command[3] + l,\n command[4] + t,\n );\n break;\n\n case 'Z':\n ctx.closePath();\n break;\n }\n }\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx context to render path on\n */\n _render(ctx: CanvasRenderingContext2D) {\n this._renderPathCommands(ctx);\n this._renderPaintInOrder(ctx);\n }\n\n /**\n * Returns string representation of an instance\n * @return {string} string representation of an instance\n */\n toString() {\n return `#`;\n }\n\n /**\n * Returns object representation of an instance\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} object representation of an instance\n */\n toObject<\n T extends Omit, keyof SProps>,\n K extends keyof T = never,\n >(propertiesToInclude: K[] = []): Pick & SProps {\n return {\n ...super.toObject(propertiesToInclude),\n path: this.path.map((pathCmd) => pathCmd.slice()),\n };\n }\n\n /**\n * Returns dataless object representation of an instance\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} object representation of an instance\n */\n toDatalessObject<\n T extends Omit, keyof SProps>,\n K extends keyof T = never,\n >(propertiesToInclude: K[] = []): Pick & SProps {\n const o = this.toObject(propertiesToInclude);\n if (this.sourcePath) {\n delete o.path;\n o.sourcePath = this.sourcePath;\n }\n return o;\n }\n\n /**\n * Returns svg representation of an instance\n * @return {Array} an array of strings with the specific svg representation\n * of the instance\n */\n _toSVG() {\n const path = joinPath(this.path, config.NUM_FRACTION_DIGITS);\n return [\n '\\n`,\n ];\n }\n\n /**\n * @private\n * @return the path command's translate transform attribute\n */\n _getOffsetTransform() {\n const digits = config.NUM_FRACTION_DIGITS;\n return ` translate(${toFixed(-this.pathOffset.x, digits)}, ${toFixed(\n -this.pathOffset.y,\n digits,\n )})`;\n }\n\n /**\n * Returns svg clipPath representation of an instance\n * @param {Function} [reviver] Method for further parsing of svg representation.\n * @return {string} svg representation of an instance\n */\n toClipPathSVG(reviver?: TSVGReviver): string {\n const additionalTransform = this._getOffsetTransform();\n return (\n '\\t' +\n this._createBaseClipPathSVGMarkup(this._toSVG(), {\n reviver,\n additionalTransform: additionalTransform,\n })\n );\n }\n\n /**\n * Returns svg representation of an instance\n * @param {Function} [reviver] Method for further parsing of svg representation.\n * @return {string} svg representation of an instance\n */\n toSVG(reviver?: TSVGReviver): string {\n const additionalTransform = this._getOffsetTransform();\n return this._createBaseSVGMarkup(this._toSVG(), {\n reviver,\n additionalTransform: additionalTransform,\n });\n }\n\n /**\n * Returns number representation of an instance complexity\n * @return {number} complexity of this instance\n */\n complexity() {\n return this.path.length;\n }\n\n setDimensions() {\n this.setBoundingBox();\n }\n\n setBoundingBox(adjustPosition?: boolean) {\n const { width, height, pathOffset } = this._calcDimensions();\n this.set({ width, height, pathOffset });\n // using pathOffset because it match the use case.\n // if pathOffset change here we need to use left + width/2 , top + height/2\n adjustPosition && this.setPositionByOrigin(pathOffset, CENTER, CENTER);\n }\n\n _calcBoundsFromPath(): TBBox {\n const bounds: XY[] = [];\n let subpathStartX = 0,\n subpathStartY = 0,\n x = 0, // current x\n y = 0; // current y\n\n for (const command of this.path) {\n // current instruction\n switch (\n command[0] // first letter\n ) {\n case 'L': // lineto, absolute\n x = command[1];\n y = command[2];\n bounds.push({ x: subpathStartX, y: subpathStartY }, { x, y });\n break;\n\n case 'M': // moveTo, absolute\n x = command[1];\n y = command[2];\n subpathStartX = x;\n subpathStartY = y;\n break;\n\n case 'C': // bezierCurveTo, absolute\n bounds.push(\n ...getBoundsOfCurve(\n x,\n y,\n command[1],\n command[2],\n command[3],\n command[4],\n command[5],\n command[6],\n ),\n );\n x = command[5];\n y = command[6];\n break;\n\n case 'Q': // quadraticCurveTo, absolute\n bounds.push(\n ...getBoundsOfCurve(\n x,\n y,\n command[1],\n command[2],\n command[1],\n command[2],\n command[3],\n command[4],\n ),\n );\n x = command[3];\n y = command[4];\n break;\n\n case 'Z':\n x = subpathStartX;\n y = subpathStartY;\n break;\n }\n }\n return makeBoundingBoxFromPoints(bounds);\n }\n\n /**\n * @private\n */\n _calcDimensions(): IPathBBox {\n const bbox = this._calcBoundsFromPath();\n\n return {\n ...bbox,\n pathOffset: new Point(\n bbox.left + bbox.width / 2,\n bbox.top + bbox.height / 2,\n ),\n };\n }\n\n /**\n * List of attribute names to account for when parsing SVG element (used by `Path.fromElement`)\n * @see http://www.w3.org/TR/SVG/paths.html#PathElement\n */\n static ATTRIBUTE_NAMES = [...SHARED_ATTRIBUTES, 'd'];\n\n /**\n * Creates an instance of Path from an object\n * @param {Object} object\n * @returns {Promise}\n */\n static fromObject>(object: T) {\n return this._fromObject(object, {\n extraParam: 'path',\n });\n }\n\n /**\n * Creates an instance of Path from an SVG element\n * @param {HTMLElement} element to parse\n * @param {Partial} [options] Options object\n */\n static async fromElement(\n element: HTMLElement | SVGElement,\n options?: Partial,\n cssRules?: CSSRules,\n ) {\n const { d, ...parsedAttributes } = parseAttributes(\n element,\n this.ATTRIBUTE_NAMES,\n cssRules,\n );\n return new this(d, {\n ...parsedAttributes,\n ...options,\n // we pass undefined to instruct the constructor to position the object using the bbox\n left: undefined,\n top: undefined,\n });\n }\n}\n\nclassRegistry.setClass(Path);\nclassRegistry.setSVGClass(Path);\n\n/* _FROM_SVG_START_ */\n","import type { ModifierKey, TEvent } from '../EventTypeDefs';\nimport type { Point } from '../Point';\nimport { Shadow } from '../Shadow';\nimport { Path } from '../shapes/Path';\nimport { getSmoothPathFromPoints, joinPath } from '../util/path';\nimport type { Canvas } from '../canvas/Canvas';\nimport { BaseBrush } from './BaseBrush';\nimport type { TSimplePathData } from '../util/path/typedefs';\n\n/**\n * @private\n * @param {TSimplePathData} pathData SVG path commands\n * @returns {boolean}\n */\nfunction isEmptySVGPath(pathData: TSimplePathData): boolean {\n return joinPath(pathData) === 'M 0 0 Q 0 0 0 0 L 0 0';\n}\n\nexport class PencilBrush extends BaseBrush {\n /**\n * Discard points that are less than `decimate` pixel distant from each other\n * @type Number\n * @default 0.4\n */\n decimate = 0.4;\n\n /**\n * Draws a straight line between last recorded point to current pointer\n * Used for `shift` functionality\n *\n * @type boolean\n * @default false\n */\n drawStraightLine = false;\n\n /**\n * The event modifier key that makes the brush draw a straight line.\n * If `null` or 'none' or any other string that is not a modifier key the feature is disabled.\n * @type {ModifierKey | undefined | null}\n */\n straightLineKey: ModifierKey | undefined | null = 'shiftKey';\n\n declare protected _points: Point[];\n declare protected _hasStraightLine: boolean;\n declare protected oldEnd?: Point;\n\n constructor(canvas: Canvas) {\n super(canvas);\n this._points = [];\n this._hasStraightLine = false;\n }\n\n needsFullRender() {\n return super.needsFullRender() || this._hasStraightLine;\n }\n\n static drawSegment(ctx: CanvasRenderingContext2D, p1: Point, p2: Point) {\n const midPoint = p1.midPointFrom(p2);\n ctx.quadraticCurveTo(p1.x, p1.y, midPoint.x, midPoint.y);\n return midPoint;\n }\n\n /**\n * Invoked on mouse down\n * @param {Point} pointer\n */\n onMouseDown(pointer: Point, { e }: TEvent) {\n if (!this.canvas._isMainEvent(e)) {\n return;\n }\n this.drawStraightLine = !!this.straightLineKey && e[this.straightLineKey];\n this._prepareForDrawing(pointer);\n // capture coordinates immediately\n // this allows to draw dots (when movement never occurs)\n this._addPoint(pointer);\n this._render();\n }\n\n /**\n * Invoked on mouse move\n * @param {Point} pointer\n */\n onMouseMove(pointer: Point, { e }: TEvent) {\n if (!this.canvas._isMainEvent(e)) {\n return;\n }\n this.drawStraightLine = !!this.straightLineKey && e[this.straightLineKey];\n if (this.limitedToCanvasSize === true && this._isOutSideCanvas(pointer)) {\n return;\n }\n if (this._addPoint(pointer) && this._points.length > 1) {\n if (this.needsFullRender()) {\n // redraw curve\n // clear top canvas\n this.canvas.clearContext(this.canvas.contextTop);\n this._render();\n } else {\n const points = this._points,\n length = points.length,\n ctx = this.canvas.contextTop;\n // draw the curve update\n this._saveAndTransform(ctx);\n if (this.oldEnd) {\n ctx.beginPath();\n ctx.moveTo(this.oldEnd.x, this.oldEnd.y);\n }\n this.oldEnd = PencilBrush.drawSegment(\n ctx,\n points[length - 2],\n points[length - 1],\n );\n ctx.stroke();\n ctx.restore();\n }\n }\n }\n\n /**\n * Invoked on mouse up\n */\n onMouseUp({ e }: TEvent) {\n if (!this.canvas._isMainEvent(e)) {\n return true;\n }\n this.drawStraightLine = false;\n this.oldEnd = undefined;\n this._finalizeAndAddPath();\n\n return false;\n }\n\n /**\n * @private\n * @param {Point} pointer Actual mouse position related to the canvas.\n */\n _prepareForDrawing(pointer: Point) {\n this._reset();\n this._addPoint(pointer);\n this.canvas.contextTop.moveTo(pointer.x, pointer.y);\n }\n\n /**\n * @private\n * @param {Point} point Point to be added to points array\n */\n _addPoint(point: Point) {\n if (\n this._points.length > 1 &&\n point.eq(this._points[this._points.length - 1])\n ) {\n return false;\n }\n if (this.drawStraightLine && this._points.length > 1) {\n this._hasStraightLine = true;\n this._points.pop();\n }\n this._points.push(point);\n return true;\n }\n\n /**\n * Clear points array and set contextTop canvas style.\n * @private\n */\n _reset() {\n this._points = [];\n this._setBrushStyles(this.canvas.contextTop);\n this._setShadow();\n this._hasStraightLine = false;\n }\n\n /**\n * Draw a smooth path on the topCanvas using quadraticCurveTo\n * @private\n * @param {CanvasRenderingContext2D} [ctx]\n */\n _render(ctx: CanvasRenderingContext2D = this.canvas.contextTop) {\n let p1 = this._points[0],\n p2 = this._points[1];\n this._saveAndTransform(ctx);\n ctx.beginPath();\n //if we only have 2 points in the path and they are the same\n //it means that the user only clicked the canvas without moving the mouse\n //then we should be drawing a dot. A path isn't drawn between two identical dots\n //that's why we set them apart a bit\n if (this._points.length === 2 && p1.x === p2.x && p1.y === p2.y) {\n const width = this.width / 1000;\n p1.x -= width;\n p2.x += width;\n }\n ctx.moveTo(p1.x, p1.y);\n\n for (let i = 1; i < this._points.length; i++) {\n // we pick the point between pi + 1 & pi + 2 as the\n // end point and p1 as our control point.\n PencilBrush.drawSegment(ctx, p1, p2);\n p1 = this._points[i];\n p2 = this._points[i + 1];\n }\n // Draw last line as a straight line while\n // we wait for the next point to be able to calculate\n // the bezier control point\n ctx.lineTo(p1.x, p1.y);\n ctx.stroke();\n ctx.restore();\n }\n\n /**\n * Converts points to SVG path\n * @param {Point[]} points Array of points\n * @return {TSimplePathData} SVG path commands\n */\n convertPointsToSVGPath(points: Point[]): TSimplePathData {\n const correction = this.width / 1000;\n return getSmoothPathFromPoints(points, correction);\n }\n\n /**\n * Creates a Path object to add on canvas\n * @param {TSimplePathData} pathData Path data\n * @return {Path} Path to add on canvas\n */\n createPath(pathData: TSimplePathData): Path {\n const path = new Path(pathData, {\n fill: null,\n stroke: this.color,\n strokeWidth: this.width,\n strokeLineCap: this.strokeLineCap,\n strokeMiterLimit: this.strokeMiterLimit,\n strokeLineJoin: this.strokeLineJoin,\n strokeDashArray: this.strokeDashArray,\n });\n if (this.shadow) {\n this.shadow.affectStroke = true;\n path.shadow = new Shadow(this.shadow);\n }\n\n return path;\n }\n\n /**\n * Decimate points array with the decimate value\n */\n decimatePoints(points: Point[], distance: number) {\n if (points.length <= 2) {\n return points;\n }\n let lastPoint = points[0],\n cDistance;\n const zoom = this.canvas.getZoom(),\n adjustedDistance = Math.pow(distance / zoom, 2),\n l = points.length - 1,\n newPoints = [lastPoint];\n // TODO investigate why this is not i < l\n for (let i = 1; i < l - 1; i++) {\n cDistance =\n Math.pow(lastPoint.x - points[i].x, 2) +\n Math.pow(lastPoint.y - points[i].y, 2);\n if (cDistance >= adjustedDistance) {\n lastPoint = points[i];\n newPoints.push(lastPoint);\n }\n }\n // Add the last point from the original line to the end of the array.\n // This ensures decimate doesn't delete the last point on the line, and ensures the line is > 1 point.\n newPoints.push(points[l]);\n return newPoints;\n }\n\n /**\n * On mouseup after drawing the path on contextTop canvas\n * we use the points captured to create an new Path object\n * and add it to the canvas.\n */\n _finalizeAndAddPath() {\n const ctx = this.canvas.contextTop;\n ctx.closePath();\n if (this.decimate) {\n this._points = this.decimatePoints(this._points, this.decimate);\n }\n const pathData = this.convertPointsToSVGPath(this._points);\n if (isEmptySVGPath(pathData)) {\n // do not create 0 width/height paths, as they are\n // rendered inconsistently across browsers\n // Firefox 4, for example, renders a dot,\n // whereas Chrome 10 renders nothing\n this.canvas.requestRenderAll();\n return;\n }\n\n const path = this.createPath(pathData);\n this.canvas.clearContext(this.canvas.contextTop);\n this.canvas.fire('before:path:created', { path: path });\n this.canvas.add(path);\n this.canvas.requestRenderAll();\n path.setCoords();\n this._resetShadow();\n\n // fire event 'path' created\n this.canvas.fire('path:created', { path: path });\n }\n}\n","import type { ObjectEvents } from '../EventTypeDefs';\nimport { SHARED_ATTRIBUTES } from '../parser/attributes';\nimport { parseAttributes } from '../parser/parseAttributes';\nimport { cos } from '../util/misc/cos';\nimport { degreesToRadians } from '../util/misc/radiansDegreesConversion';\nimport { sin } from '../util/misc/sin';\nimport { classRegistry } from '../ClassRegistry';\nimport { FabricObject, cacheProperties } from './Object/FabricObject';\nimport type { Abortable, TClassProperties, TOptions } from '../typedefs';\nimport type { FabricObjectProps, SerializedObjectProps } from './Object/types';\nimport type { CSSRules } from '../parser/typedefs';\nimport { SCALE_X, SCALE_Y } from '../constants';\n\ninterface UniqueCircleProps {\n /**\n * Radius of this circle\n * @type Number\n * @default 0\n */\n radius: number;\n\n /**\n * Angle for the start of the circle, in degrees.\n * @type TDegree 0 - 359\n * @default 0\n */\n startAngle: number;\n\n /**\n * Angle for the end of the circle, in degrees\n * @type TDegree 1 - 360\n * @default 360\n */\n endAngle: number;\n\n /**\n * Orientation for the direction of the circle.\n * Setting to true will switch the arc of the circle to traverse from startAngle to endAngle in a counter-clockwise direction.\n * Note: this will only change how the circle is drawn, and does not affect rotational transformation.\n * @default false\n */\n counterClockwise: boolean;\n}\n\nexport interface SerializedCircleProps\n extends SerializedObjectProps,\n UniqueCircleProps {}\n\nexport interface CircleProps extends FabricObjectProps, UniqueCircleProps {}\n\nconst CIRCLE_PROPS = [\n 'radius',\n 'startAngle',\n 'endAngle',\n 'counterClockwise',\n] as const;\n\nexport const circleDefaultValues: Partial> = {\n radius: 0,\n startAngle: 0,\n endAngle: 360,\n counterClockwise: false,\n};\n\nexport class Circle<\n Props extends TOptions = Partial,\n SProps extends SerializedCircleProps = SerializedCircleProps,\n EventSpec extends ObjectEvents = ObjectEvents,\n >\n extends FabricObject\n implements UniqueCircleProps\n{\n declare radius: number;\n declare startAngle: number;\n declare endAngle: number;\n declare counterClockwise: boolean;\n\n static type = 'Circle';\n\n static cacheProperties = [...cacheProperties, ...CIRCLE_PROPS];\n\n static ownDefaults = circleDefaultValues;\n\n static getDefaults(): Record {\n return {\n ...super.getDefaults(),\n ...Circle.ownDefaults,\n };\n }\n\n /**\n * Constructor\n * @param {Object} [options] Options object\n */\n constructor(options?: Props) {\n super();\n Object.assign(this, Circle.ownDefaults);\n this.setOptions(options);\n }\n\n /**\n * @private\n * @param {String} key\n * @param {*} value\n */\n _set(key: string, value: any) {\n super._set(key, value);\n\n if (key === 'radius') {\n this.setRadius(value);\n }\n\n return this;\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx context to render on\n */\n _render(ctx: CanvasRenderingContext2D) {\n ctx.beginPath();\n ctx.arc(\n 0,\n 0,\n this.radius,\n degreesToRadians(this.startAngle),\n degreesToRadians(this.endAngle),\n this.counterClockwise,\n );\n this._renderPaintInOrder(ctx);\n }\n\n /**\n * Returns horizontal radius of an object (according to how an object is scaled)\n * @return {Number}\n */\n getRadiusX(): number {\n return this.get('radius') * this.get(SCALE_X);\n }\n\n /**\n * Returns vertical radius of an object (according to how an object is scaled)\n * @return {Number}\n */\n getRadiusY(): number {\n return this.get('radius') * this.get(SCALE_Y);\n }\n\n /**\n * Sets radius of an object (and updates width accordingly)\n */\n setRadius(value: number) {\n this.radius = value;\n this.set({ width: value * 2, height: value * 2 });\n }\n\n /**\n * Returns object representation of an instance\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} object representation of an instance\n */\n toObject<\n T extends Omit, keyof SProps>,\n K extends keyof T = never,\n >(propertiesToInclude: K[] = []): Pick & SProps {\n return super.toObject([...CIRCLE_PROPS, ...propertiesToInclude]);\n }\n\n /* _TO_SVG_START_ */\n\n /**\n * Returns svg representation of an instance\n * @return {Array} an array of strings with the specific svg representation\n * of the instance\n */\n _toSVG(): string[] {\n const angle = (this.endAngle - this.startAngle) % 360;\n\n if (angle === 0) {\n return [\n '\\n',\n ];\n } else {\n const { radius } = this;\n const start = degreesToRadians(this.startAngle),\n end = degreesToRadians(this.endAngle),\n startX = cos(start) * radius,\n startY = sin(start) * radius,\n endX = cos(end) * radius,\n endY = sin(end) * radius,\n largeFlag = angle > 180 ? 1 : 0,\n sweepFlag = this.counterClockwise ? 0 : 1;\n return [\n `\\n',\n ];\n }\n }\n /* _TO_SVG_END_ */\n\n /* _FROM_SVG_START_ */\n /**\n * List of attribute names to account for when parsing SVG element (used by {@link Circle.fromElement})\n * @see: http://www.w3.org/TR/SVG/shapes.html#CircleElement\n */\n static ATTRIBUTE_NAMES = ['cx', 'cy', 'r', ...SHARED_ATTRIBUTES];\n\n /**\n * Returns {@link Circle} instance from an SVG element\n * @param {HTMLElement} element Element to parse\n * @param {Object} [options] Partial Circle object to default missing properties on the element.\n * @throws {Error} If value of `r` attribute is missing or invalid\n */\n static async fromElement(\n element: HTMLElement,\n options: Abortable,\n cssRules?: CSSRules,\n ): Promise {\n const {\n left = 0,\n top = 0,\n radius = 0,\n ...otherParsedAttributes\n } = parseAttributes(\n element,\n this.ATTRIBUTE_NAMES,\n cssRules,\n ) as Partial;\n\n // this probably requires to be fixed for default origins not being top/left.\n\n return new this({\n ...otherParsedAttributes,\n radius,\n left: left - radius,\n top: top - radius,\n });\n }\n\n /* _FROM_SVG_END_ */\n\n /**\n * @todo how do we declare this??\n */\n static fromObject>(object: T) {\n return super._fromObject(object);\n }\n}\n\nclassRegistry.setClass(Circle);\nclassRegistry.setSVGClass(Circle);\n","import { Color } from '../color/Color';\nimport type { Point } from '../Point';\nimport { Shadow } from '../Shadow';\nimport { Circle } from '../shapes/Circle';\nimport { Group } from '../shapes/Group';\nimport { getRandomInt } from '../util/internals/getRandomInt';\nimport type { Canvas } from '../canvas/Canvas';\nimport { BaseBrush } from './BaseBrush';\nimport type { CircleBrushPoint } from './typedefs';\nimport { CENTER } from '../constants';\n\nexport class CircleBrush extends BaseBrush {\n /**\n * Width of a brush\n * @type Number\n */\n width = 10;\n\n declare points: CircleBrushPoint[];\n\n constructor(canvas: Canvas) {\n super(canvas);\n this.points = [];\n }\n\n /**\n * Invoked inside on mouse down and mouse move\n * @param {Point} pointer\n */\n drawDot(pointer: Point) {\n const point = this.addPoint(pointer),\n ctx = this.canvas.contextTop;\n this._saveAndTransform(ctx);\n this.dot(ctx, point);\n ctx.restore();\n }\n\n dot(ctx: CanvasRenderingContext2D, point: CircleBrushPoint) {\n ctx.fillStyle = point.fill;\n ctx.beginPath();\n ctx.arc(point.x, point.y, point.radius, 0, Math.PI * 2, false);\n ctx.closePath();\n ctx.fill();\n }\n\n /**\n * Invoked on mouse down\n */\n onMouseDown(pointer: Point) {\n this.points = [];\n this.canvas.clearContext(this.canvas.contextTop);\n this._setShadow();\n this.drawDot(pointer);\n }\n\n /**\n * Render the full state of the brush\n * @private\n */\n _render() {\n const ctx = this.canvas.contextTop,\n points = this.points;\n this._saveAndTransform(ctx);\n for (let i = 0; i < points.length; i++) {\n this.dot(ctx, points[i]);\n }\n ctx.restore();\n }\n\n /**\n * Invoked on mouse move\n * @param {Point} pointer\n */\n onMouseMove(pointer: Point) {\n if (this.limitedToCanvasSize === true && this._isOutSideCanvas(pointer)) {\n return;\n }\n if (this.needsFullRender()) {\n this.canvas.clearContext(this.canvas.contextTop);\n this.addPoint(pointer);\n this._render();\n } else {\n this.drawDot(pointer);\n }\n }\n\n /**\n * Invoked on mouse up\n */\n onMouseUp() {\n const originalRenderOnAddRemove = this.canvas.renderOnAddRemove;\n this.canvas.renderOnAddRemove = false;\n\n const circles: Circle[] = [];\n\n for (let i = 0; i < this.points.length; i++) {\n const point = this.points[i],\n circle = new Circle({\n radius: point.radius,\n left: point.x,\n top: point.y,\n originX: CENTER,\n originY: CENTER,\n fill: point.fill,\n });\n\n this.shadow && (circle.shadow = new Shadow(this.shadow));\n\n circles.push(circle);\n }\n const group = new Group(circles, { canvas: this.canvas });\n\n this.canvas.fire('before:path:created', { path: group });\n this.canvas.add(group);\n this.canvas.fire('path:created', { path: group });\n\n this.canvas.clearContext(this.canvas.contextTop);\n this._resetShadow();\n this.canvas.renderOnAddRemove = originalRenderOnAddRemove;\n this.canvas.requestRenderAll();\n }\n\n /**\n * @param {Object} pointer\n * @return {Point} Just added pointer point\n */\n addPoint({ x, y }: Point) {\n const pointerPoint: CircleBrushPoint = {\n x,\n y,\n radius: getRandomInt(Math.max(0, this.width - 20), this.width + 20) / 2,\n fill: new Color(this.color).setAlpha(getRandomInt(0, 100) / 100).toRgba(),\n };\n\n this.points.push(pointerPoint);\n\n return pointerPoint;\n }\n}\n","import type { Point } from '../Point';\nimport { Group } from '../shapes/Group';\nimport { Shadow } from '../Shadow';\nimport { Rect } from '../shapes/Rect';\nimport { getRandomInt } from '../util/internals/getRandomInt';\nimport type { Canvas } from '../canvas/Canvas';\nimport { BaseBrush } from './BaseBrush';\nimport type { SprayBrushPoint } from './typedefs';\nimport { CENTER } from '../constants';\n\n/**\n *\n * @param rects\n * @returns\n */\nfunction getUniqueRects(rects: Rect[]) {\n const uniqueRects: Record = {};\n const uniqueRectsArray: Rect[] = [];\n\n for (let i = 0, key: string; i < rects.length; i++) {\n key = `${rects[i].left}${rects[i].top}`;\n if (!uniqueRects[key]) {\n uniqueRects[key] = true;\n uniqueRectsArray.push(rects[i]);\n }\n }\n\n return uniqueRectsArray;\n}\n\nexport class SprayBrush extends BaseBrush {\n /**\n * Width of a spray\n * @type Number\n */\n width = 10;\n\n /**\n * Density of a spray (number of dots per chunk)\n * @type Number\n */\n density = 20;\n\n /**\n * Width of spray dots\n * @type Number\n */\n dotWidth = 1;\n\n /**\n * Width variance of spray dots\n * @type Number\n */\n dotWidthVariance = 1;\n\n /**\n * Whether opacity of a dot should be random\n * @type Boolean\n */\n randomOpacity = false;\n\n /**\n * Whether overlapping dots (rectangles) should be removed (for performance reasons)\n * @type Boolean\n */\n optimizeOverlapping = true;\n\n declare private sprayChunks: SprayBrushPoint[][];\n\n declare private sprayChunk: SprayBrushPoint[];\n\n /**\n * Constructor\n * @param {Canvas} canvas\n * @return {SprayBrush} Instance of a spray brush\n */\n constructor(canvas: Canvas) {\n super(canvas);\n this.sprayChunks = [];\n this.sprayChunk = [];\n }\n\n /**\n * Invoked on mouse down\n * @param {Point} pointer\n */\n onMouseDown(pointer: Point) {\n this.sprayChunks = [];\n this.canvas.clearContext(this.canvas.contextTop);\n this._setShadow();\n\n this.addSprayChunk(pointer);\n this.renderChunck(this.sprayChunk);\n }\n\n /**\n * Invoked on mouse move\n * @param {Point} pointer\n */\n onMouseMove(pointer: Point) {\n if (this.limitedToCanvasSize === true && this._isOutSideCanvas(pointer)) {\n return;\n }\n this.addSprayChunk(pointer);\n this.renderChunck(this.sprayChunk);\n }\n\n /**\n * Invoked on mouse up\n */\n onMouseUp() {\n const originalRenderOnAddRemove = this.canvas.renderOnAddRemove;\n this.canvas.renderOnAddRemove = false;\n\n const rects: Rect[] = [];\n\n for (let i = 0; i < this.sprayChunks.length; i++) {\n const sprayChunk = this.sprayChunks[i];\n for (let j = 0; j < sprayChunk.length; j++) {\n const chunck = sprayChunk[j];\n const rect = new Rect({\n width: chunck.width,\n height: chunck.width,\n left: chunck.x + 1,\n top: chunck.y + 1,\n originX: CENTER,\n originY: CENTER,\n fill: this.color,\n });\n rects.push(rect);\n }\n }\n\n const group = new Group(\n this.optimizeOverlapping ? getUniqueRects(rects) : rects,\n {\n objectCaching: true,\n subTargetCheck: false,\n interactive: false,\n },\n );\n this.shadow && group.set('shadow', new Shadow(this.shadow));\n this.canvas.fire('before:path:created', { path: group });\n this.canvas.add(group);\n this.canvas.fire('path:created', { path: group });\n\n this.canvas.clearContext(this.canvas.contextTop);\n this._resetShadow();\n this.canvas.renderOnAddRemove = originalRenderOnAddRemove;\n this.canvas.requestRenderAll();\n }\n\n renderChunck(sprayChunck: SprayBrushPoint[]) {\n const ctx = this.canvas.contextTop;\n ctx.fillStyle = this.color;\n\n this._saveAndTransform(ctx);\n\n for (let i = 0; i < sprayChunck.length; i++) {\n const point = sprayChunck[i];\n ctx.globalAlpha = point.opacity;\n ctx.fillRect(point.x, point.y, point.width, point.width);\n }\n\n ctx.restore();\n }\n\n /**\n * Render all spray chunks\n */\n _render() {\n const ctx = this.canvas.contextTop;\n ctx.fillStyle = this.color;\n\n this._saveAndTransform(ctx);\n\n for (let i = 0; i < this.sprayChunks.length; i++) {\n this.renderChunck(this.sprayChunks[i]);\n }\n ctx.restore();\n }\n\n /**\n * @param {Point} pointer\n */\n addSprayChunk(pointer: Point) {\n this.sprayChunk = [];\n const radius = this.width / 2;\n\n for (let i = 0; i < this.density; i++) {\n this.sprayChunk.push({\n x: getRandomInt(pointer.x - radius, pointer.x + radius),\n y: getRandomInt(pointer.y - radius, pointer.y + radius),\n width: this.dotWidthVariance\n ? getRandomInt(\n // bottom clamp width to 1\n Math.max(1, this.dotWidth - this.dotWidthVariance),\n this.dotWidth + this.dotWidthVariance,\n )\n : this.dotWidth,\n opacity: this.randomOpacity ? getRandomInt(0, 100) / 100 : 1,\n });\n }\n\n this.sprayChunks.push(this.sprayChunk);\n }\n}\n","import { Pattern } from '../Pattern';\nimport { createCanvasElement } from '../util/misc/dom';\nimport type { Canvas } from '../canvas/Canvas';\nimport { PencilBrush } from './PencilBrush';\nimport type { TSimplePathData } from '../util/path/typedefs';\n\nexport class PatternBrush extends PencilBrush {\n declare source?: CanvasImageSource;\n\n constructor(canvas: Canvas) {\n super(canvas);\n }\n\n getPatternSrc() {\n const dotWidth = 20,\n dotDistance = 5,\n patternCanvas = createCanvasElement(),\n patternCtx = patternCanvas.getContext('2d');\n\n patternCanvas.width = patternCanvas.height = dotWidth + dotDistance;\n if (patternCtx) {\n patternCtx.fillStyle = this.color;\n patternCtx.beginPath();\n patternCtx.arc(\n dotWidth / 2,\n dotWidth / 2,\n dotWidth / 2,\n 0,\n Math.PI * 2,\n false,\n );\n patternCtx.closePath();\n patternCtx.fill();\n }\n return patternCanvas;\n }\n\n /**\n * Creates \"pattern\" instance property\n * @param {CanvasRenderingContext2D} ctx\n */\n getPattern(ctx: CanvasRenderingContext2D) {\n return ctx.createPattern(this.source || this.getPatternSrc(), 'repeat');\n }\n\n /**\n * Sets brush styles\n * @param {CanvasRenderingContext2D} ctx\n */\n _setBrushStyles(ctx: CanvasRenderingContext2D) {\n super._setBrushStyles(ctx);\n const pattern = this.getPattern(ctx);\n pattern && (ctx.strokeStyle = pattern);\n }\n\n /**\n * Creates path\n */\n createPath(pathData: TSimplePathData) {\n const path = super.createPath(pathData),\n topLeft = path._getLeftTopCoords().scalarAdd(path.strokeWidth / 2);\n\n path.stroke = new Pattern({\n source: this.source || this.getPatternSrc(),\n offsetX: -topLeft.x,\n offsetY: -topLeft.y,\n });\n return path;\n }\n}\n","import { SHARED_ATTRIBUTES } from '../parser/attributes';\nimport { parseAttributes } from '../parser/parseAttributes';\nimport type { Abortable, TClassProperties, TOptions } from '../typedefs';\nimport { classRegistry } from '../ClassRegistry';\nimport { FabricObject, cacheProperties } from './Object/FabricObject';\nimport { Point } from '../Point';\nimport { isFiller } from '../util/typeAssertions';\nimport type { FabricObjectProps, SerializedObjectProps } from './Object/types';\nimport type { ObjectEvents } from '../EventTypeDefs';\nimport { makeBoundingBoxFromPoints } from '../util';\nimport { CENTER, LEFT, TOP } from '../constants';\nimport type { CSSRules } from '../parser/typedefs';\n\n// @TODO this code is terrible and Line should be a special case of polyline.\n\nconst coordProps = ['x1', 'x2', 'y1', 'y2'] as const;\n\ninterface UniqueLineProps {\n x1: number;\n x2: number;\n y1: number;\n y2: number;\n}\n\nexport interface SerializedLineProps\n extends SerializedObjectProps,\n UniqueLineProps {}\n\n/**\n * A Class to draw a line\n * A bunch of methods will be added to Polyline to handle the line case\n * The line class is very strange to work with, is all special, it hardly aligns\n * to what a developer want everytime there is an angle\n * @deprecated\n */\nexport class Line<\n Props extends TOptions = Partial,\n SProps extends SerializedLineProps = SerializedLineProps,\n EventSpec extends ObjectEvents = ObjectEvents,\n >\n extends FabricObject\n implements UniqueLineProps\n{\n /**\n * x value or first line edge\n * @type number\n */\n declare x1: number;\n\n /**\n * y value or first line edge\n * @type number\n */\n declare y1: number;\n\n /**\n * x value or second line edge\n * @type number\n */\n declare x2: number;\n\n /**\n * y value or second line edge\n * @type number\n */\n declare y2: number;\n\n static type = 'Line';\n\n static cacheProperties = [...cacheProperties, ...coordProps];\n /**\n * Constructor\n * @param {Array} [points] Array of points\n * @param {Object} [options] Options object\n * @return {Line} thisArg\n */\n constructor([x1, y1, x2, y2] = [0, 0, 0, 0], options: Partial = {}) {\n super();\n Object.assign(this, Line.ownDefaults);\n this.setOptions(options);\n this.x1 = x1;\n this.x2 = x2;\n this.y1 = y1;\n this.y2 = y2;\n this._setWidthHeight();\n const { left, top } = options;\n typeof left === 'number' && this.set(LEFT, left);\n typeof top === 'number' && this.set(TOP, top);\n }\n\n /**\n * @private\n * @param {Object} [options] Options\n */\n _setWidthHeight() {\n const { x1, y1, x2, y2 } = this;\n this.width = Math.abs(x2 - x1);\n this.height = Math.abs(y2 - y1);\n const { left, top, width, height } = makeBoundingBoxFromPoints([\n { x: x1, y: y1 },\n { x: x2, y: y2 },\n ]);\n const position = new Point(left + width / 2, top + height / 2);\n this.setPositionByOrigin(position, CENTER, CENTER);\n }\n\n /**\n * @private\n * @param {String} key\n * @param {*} value\n */\n _set(key: string, value: any) {\n super._set(key, value);\n if (coordProps.includes(key as keyof UniqueLineProps)) {\n // this doesn't make sense very much, since setting x1 when top or left\n // are already set, is just going to show a strange result since the\n // line will move way more than the developer expect.\n // in fabric5 it worked only when the line didn't have extra transformations,\n // in fabric6 too. With extra transform they behave bad in different ways.\n // This needs probably a good rework or a tutorial if you have to create a dynamic line\n this._setWidthHeight();\n }\n return this;\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _render(ctx: CanvasRenderingContext2D) {\n ctx.beginPath();\n\n const p = this.calcLinePoints();\n ctx.moveTo(p.x1, p.y1);\n ctx.lineTo(p.x2, p.y2);\n\n ctx.lineWidth = this.strokeWidth;\n\n // TODO: test this\n // make sure setting \"fill\" changes color of a line\n // (by copying fillStyle to strokeStyle, since line is stroked, not filled)\n const origStrokeStyle = ctx.strokeStyle;\n if (isFiller(this.stroke)) {\n ctx.strokeStyle = this.stroke.toLive(ctx)!;\n } else {\n ctx.strokeStyle = this.stroke ?? ctx.fillStyle;\n }\n this.stroke && this._renderStroke(ctx);\n ctx.strokeStyle = origStrokeStyle;\n }\n\n /**\n * This function is an helper for svg import. it returns the center of the object in the svg\n * untransformed coordinates\n * @private\n * @return {Point} center point from element coordinates\n */\n _findCenterFromElement(): Point {\n return new Point((this.x1 + this.x2) / 2, (this.y1 + this.y2) / 2);\n }\n\n /**\n * Returns object representation of an instance\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} object representation of an instance\n */\n toObject<\n T extends Omit, keyof SProps>,\n K extends keyof T = never,\n >(propertiesToInclude: K[] = []): Pick & SProps {\n return {\n ...super.toObject(propertiesToInclude),\n ...this.calcLinePoints(),\n };\n }\n\n /*\n * Calculate object dimensions from its properties\n * @private\n */\n _getNonTransformedDimensions(): Point {\n const dim = super._getNonTransformedDimensions();\n if (this.strokeLineCap === 'butt') {\n if (this.width === 0) {\n dim.y -= this.strokeWidth;\n }\n if (this.height === 0) {\n dim.x -= this.strokeWidth;\n }\n }\n return dim;\n }\n\n /**\n * Recalculates line points given width and height\n * Those points are simply placed around the center,\n * This is not useful outside internal render functions and svg output\n * Is not meant to be for the developer.\n * @private\n */\n calcLinePoints(): UniqueLineProps {\n const { x1: _x1, x2: _x2, y1: _y1, y2: _y2, width, height } = this;\n const xMult = _x1 <= _x2 ? -1 : 1,\n yMult = _y1 <= _y2 ? -1 : 1,\n x1 = (xMult * width) / 2,\n y1 = (yMult * height) / 2,\n x2 = (xMult * -width) / 2,\n y2 = (yMult * -height) / 2;\n\n return {\n x1,\n x2,\n y1,\n y2,\n };\n }\n\n /* _FROM_SVG_START_ */\n\n /**\n * Returns svg representation of an instance\n * @return {Array} an array of strings with the specific svg representation\n * of the instance\n */\n _toSVG() {\n const { x1, x2, y1, y2 } = this.calcLinePoints();\n return [\n '\\n`,\n ];\n }\n\n /**\n * List of attribute names to account for when parsing SVG element (used by {@link Line.fromElement})\n * @see http://www.w3.org/TR/SVG/shapes.html#LineElement\n */\n static ATTRIBUTE_NAMES = SHARED_ATTRIBUTES.concat(coordProps);\n\n /**\n * Returns Line instance from an SVG element\n * @param {HTMLElement} element Element to parse\n * @param {Object} [options] Options object\n * @param {Function} [callback] callback function invoked after parsing\n */\n static async fromElement(\n element: HTMLElement,\n options?: Abortable,\n cssRules?: CSSRules,\n ) {\n const {\n x1 = 0,\n y1 = 0,\n x2 = 0,\n y2 = 0,\n ...parsedAttributes\n } = parseAttributes(element, this.ATTRIBUTE_NAMES, cssRules);\n return new this([x1, y1, x2, y2], parsedAttributes);\n }\n\n /* _FROM_SVG_END_ */\n\n /**\n * Returns Line instance from an object representation\n * @param {Object} object Object to create an instance from\n * @returns {Promise}\n */\n static fromObject>({\n x1,\n y1,\n x2,\n y2,\n ...object\n }: T) {\n return this._fromObject(\n {\n ...object,\n points: [x1, y1, x2, y2],\n },\n {\n extraParam: 'points',\n },\n );\n }\n}\n\nclassRegistry.setClass(Line);\nclassRegistry.setSVGClass(Line);\n","import { classRegistry } from '../ClassRegistry';\nimport { FabricObject } from './Object/FabricObject';\nimport type { FabricObjectProps, SerializedObjectProps } from './Object/types';\nimport type { TClassProperties, TOptions } from '../typedefs';\nimport type { ObjectEvents } from '../EventTypeDefs';\n\nexport const triangleDefaultValues: Partial> = {\n width: 100,\n height: 100,\n};\n\nexport class Triangle<\n Props extends TOptions = Partial,\n SProps extends SerializedObjectProps = SerializedObjectProps,\n EventSpec extends ObjectEvents = ObjectEvents,\n >\n extends FabricObject\n implements FabricObjectProps\n{\n static type = 'Triangle';\n\n static ownDefaults = triangleDefaultValues;\n\n static getDefaults(): Record {\n return { ...super.getDefaults(), ...Triangle.ownDefaults };\n }\n\n /**\n * Constructor\n * @param {Object} [options] Options object\n */\n constructor(options?: Props) {\n super();\n Object.assign(this, Triangle.ownDefaults);\n this.setOptions(options);\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _render(ctx: CanvasRenderingContext2D) {\n const widthBy2 = this.width / 2,\n heightBy2 = this.height / 2;\n\n ctx.beginPath();\n ctx.moveTo(-widthBy2, heightBy2);\n ctx.lineTo(0, -heightBy2);\n ctx.lineTo(widthBy2, heightBy2);\n ctx.closePath();\n\n this._renderPaintInOrder(ctx);\n }\n\n /**\n * Returns svg representation of an instance\n * @return {Array} an array of strings with the specific svg representation\n * of the instance\n */\n _toSVG() {\n const widthBy2 = this.width / 2,\n heightBy2 = this.height / 2,\n points = `${-widthBy2} ${heightBy2},0 ${-heightBy2},${widthBy2} ${heightBy2}`;\n return [''];\n }\n}\n\nclassRegistry.setClass(Triangle);\nclassRegistry.setSVGClass(Triangle);\n","import { SCALE_X, SCALE_Y, twoMathPi } from '../constants';\nimport { SHARED_ATTRIBUTES } from '../parser/attributes';\nimport { parseAttributes } from '../parser/parseAttributes';\nimport type { Abortable, TClassProperties, TOptions } from '../typedefs';\nimport { classRegistry } from '../ClassRegistry';\nimport { FabricObject, cacheProperties } from './Object/FabricObject';\nimport type { FabricObjectProps, SerializedObjectProps } from './Object/types';\nimport type { ObjectEvents } from '../EventTypeDefs';\nimport type { CSSRules } from '../parser/typedefs';\n\nexport const ellipseDefaultValues: Partial> = {\n rx: 0,\n ry: 0,\n};\n\ninterface UniqueEllipseProps {\n rx: number;\n ry: number;\n}\n\nexport interface SerializedEllipseProps\n extends SerializedObjectProps,\n UniqueEllipseProps {}\n\nexport interface EllipseProps extends FabricObjectProps, UniqueEllipseProps {}\n\nconst ELLIPSE_PROPS = ['rx', 'ry'] as const;\n\nexport class Ellipse<\n Props extends TOptions = Partial,\n SProps extends SerializedEllipseProps = SerializedEllipseProps,\n EventSpec extends ObjectEvents = ObjectEvents,\n >\n extends FabricObject\n implements EllipseProps\n{\n /**\n * Horizontal radius\n * @type Number\n */\n declare rx: number;\n\n /**\n * Vertical radius\n * @type Number\n */\n declare ry: number;\n\n static type = 'Ellipse';\n\n static cacheProperties = [...cacheProperties, ...ELLIPSE_PROPS];\n\n static ownDefaults = ellipseDefaultValues;\n\n static getDefaults(): Record {\n return {\n ...super.getDefaults(),\n ...Ellipse.ownDefaults,\n };\n }\n\n /**\n * Constructor\n * @param {Object} [options] Options object\n */\n constructor(options?: Props) {\n super();\n Object.assign(this, Ellipse.ownDefaults);\n this.setOptions(options);\n }\n\n /**\n * @private\n * @param {String} key\n * @param {*} value\n * @return {Ellipse} thisArg\n */\n _set(key: string, value: any) {\n super._set(key, value);\n switch (key) {\n case 'rx':\n this.rx = value;\n this.set('width', value * 2);\n break;\n\n case 'ry':\n this.ry = value;\n this.set('height', value * 2);\n break;\n }\n return this;\n }\n\n /**\n * Returns horizontal radius of an object (according to how an object is scaled)\n * @return {Number}\n */\n getRx() {\n return this.get('rx') * this.get(SCALE_X);\n }\n\n /**\n * Returns Vertical radius of an object (according to how an object is scaled)\n * @return {Number}\n */\n getRy() {\n return this.get('ry') * this.get(SCALE_Y);\n }\n\n /**\n * Returns object representation of an instance\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} object representation of an instance\n */\n toObject<\n T extends Omit, keyof SProps>,\n K extends keyof T = never,\n >(propertiesToInclude: K[] = []): Pick & SProps {\n return super.toObject([...ELLIPSE_PROPS, ...propertiesToInclude]);\n }\n\n /**\n * Returns svg representation of an instance\n * @return {Array} an array of strings with the specific svg representation\n * of the instance\n */\n _toSVG(): string[] {\n return [\n '\\n`,\n ];\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx context to render on\n */\n _render(ctx: CanvasRenderingContext2D) {\n ctx.beginPath();\n ctx.save();\n ctx.transform(1, 0, 0, this.ry / this.rx, 0, 0);\n ctx.arc(0, 0, this.rx, 0, twoMathPi, false);\n ctx.restore();\n this._renderPaintInOrder(ctx);\n }\n\n /* _FROM_SVG_START_ */\n\n /**\n * List of attribute names to account for when parsing SVG element (used by {@link Ellipse.fromElement})\n * @see http://www.w3.org/TR/SVG/shapes.html#EllipseElement\n */\n static ATTRIBUTE_NAMES = [...SHARED_ATTRIBUTES, 'cx', 'cy', 'rx', 'ry'];\n\n /**\n * Returns {@link Ellipse} instance from an SVG element\n * @param {HTMLElement} element Element to parse\n * @return {Ellipse}\n */\n static async fromElement(\n element: HTMLElement,\n options?: Abortable,\n cssRules?: CSSRules,\n ) {\n const parsedAttributes = parseAttributes(\n element,\n this.ATTRIBUTE_NAMES,\n cssRules,\n );\n\n parsedAttributes.left = (parsedAttributes.left || 0) - parsedAttributes.rx;\n parsedAttributes.top = (parsedAttributes.top || 0) - parsedAttributes.ry;\n return new this(parsedAttributes);\n }\n\n /* _FROM_SVG_END_ */\n}\n\nclassRegistry.setClass(Ellipse);\nclassRegistry.setSVGClass(Ellipse);\n","import { config } from '../config';\nimport { SHARED_ATTRIBUTES } from '../parser/attributes';\nimport { parseAttributes } from '../parser/parseAttributes';\nimport { parsePointsAttribute } from '../parser/parsePointsAttribute';\nimport type { XY } from '../Point';\nimport { Point } from '../Point';\nimport type { Abortable, TClassProperties, TOptions } from '../typedefs';\nimport { classRegistry } from '../ClassRegistry';\nimport { makeBoundingBoxFromPoints } from '../util/misc/boundingBoxFromPoints';\nimport { calcDimensionsMatrix, transformPoint } from '../util/misc/matrix';\nimport { projectStrokeOnPoints } from '../util/misc/projectStroke';\nimport type { TProjectStrokeOnPointsOptions } from '../util/misc/projectStroke/types';\nimport { degreesToRadians } from '../util/misc/radiansDegreesConversion';\nimport { toFixed } from '../util/misc/toFixed';\nimport { FabricObject, cacheProperties } from './Object/FabricObject';\nimport type { FabricObjectProps, SerializedObjectProps } from './Object/types';\nimport type { ObjectEvents } from '../EventTypeDefs';\nimport {\n CENTER,\n LEFT,\n SCALE_X,\n SCALE_Y,\n SKEW_X,\n SKEW_Y,\n TOP,\n} from '../constants';\nimport type { CSSRules } from '../parser/typedefs';\n\nexport const polylineDefaultValues: Partial> = {\n /**\n * @deprecated transient option soon to be removed in favor of a different design\n */\n exactBoundingBox: false,\n};\n\nexport interface SerializedPolylineProps extends SerializedObjectProps {\n points: XY[];\n}\n\nexport class Polyline<\n Props extends TOptions = Partial,\n SProps extends SerializedPolylineProps = SerializedPolylineProps,\n EventSpec extends ObjectEvents = ObjectEvents,\n> extends FabricObject {\n /**\n * Points array\n * @type Array\n */\n declare points: XY[];\n\n /**\n * WARNING: Feature in progress\n * Calculate the exact bounding box taking in account strokeWidth on acute angles\n * this will be turned to true by default on fabric 6.0\n * maybe will be left in as an optimization since calculations may be slow\n * @deprecated transient option soon to be removed in favor of a different design\n * @type Boolean\n * @default false\n */\n declare exactBoundingBox: boolean;\n\n declare private initialized: true | undefined;\n\n static ownDefaults = polylineDefaultValues;\n\n static type = 'Polyline';\n\n static getDefaults(): Record {\n return {\n ...super.getDefaults(),\n ...Polyline.ownDefaults,\n };\n }\n\n /**\n * A list of properties that if changed trigger a recalculation of dimensions\n * @todo check if you really need to recalculate for all cases\n */\n static layoutProperties: (keyof Polyline)[] = [\n SKEW_X,\n SKEW_Y,\n 'strokeLineCap',\n 'strokeLineJoin',\n 'strokeMiterLimit',\n 'strokeWidth',\n 'strokeUniform',\n 'points',\n ];\n\n declare pathOffset: Point;\n\n declare strokeOffset: Point;\n\n static cacheProperties = [...cacheProperties, 'points'];\n\n strokeDiff: Point;\n\n /**\n * Constructor\n * @param {Array} points Array of points (where each point is an object with x and y)\n * @param {Object} [options] Options object\n * @return {Polyline} thisArg\n * @example\n * var poly = new Polyline([\n * { x: 10, y: 10 },\n * { x: 50, y: 30 },\n * { x: 40, y: 70 },\n * { x: 60, y: 50 },\n * { x: 100, y: 150 },\n * { x: 40, y: 100 }\n * ], {\n * stroke: 'red',\n * left: 100,\n * top: 100\n * });\n */\n constructor(points: XY[] = [], options: Props = {} as Props) {\n super();\n Object.assign(this, Polyline.ownDefaults);\n this.setOptions(options);\n this.points = points;\n const { left, top } = options;\n this.initialized = true;\n this.setBoundingBox(true);\n typeof left === 'number' && this.set(LEFT, left);\n typeof top === 'number' && this.set(TOP, top);\n }\n\n protected isOpen() {\n return true;\n }\n\n private _projectStrokeOnPoints(options: TProjectStrokeOnPointsOptions) {\n return projectStrokeOnPoints(this.points, options, this.isOpen());\n }\n\n /**\n * Calculate the polygon bounding box\n * @private\n */\n _calcDimensions(options?: Partial) {\n options = {\n scaleX: this.scaleX,\n scaleY: this.scaleY,\n skewX: this.skewX,\n skewY: this.skewY,\n strokeLineCap: this.strokeLineCap,\n strokeLineJoin: this.strokeLineJoin,\n strokeMiterLimit: this.strokeMiterLimit,\n strokeUniform: this.strokeUniform,\n strokeWidth: this.strokeWidth,\n ...(options || {}),\n };\n const points = this.exactBoundingBox\n ? this._projectStrokeOnPoints(\n options as TProjectStrokeOnPointsOptions,\n ).map((projection) => projection.projectedPoint)\n : this.points;\n if (points.length === 0) {\n return {\n left: 0,\n top: 0,\n width: 0,\n height: 0,\n pathOffset: new Point(),\n strokeOffset: new Point(),\n strokeDiff: new Point(),\n };\n }\n const bbox = makeBoundingBoxFromPoints(points),\n // Remove scale effect, since it's applied after\n matrix = calcDimensionsMatrix({ ...options, scaleX: 1, scaleY: 1 }),\n bboxNoStroke = makeBoundingBoxFromPoints(\n this.points.map((p) => transformPoint(p, matrix, true)),\n ),\n scale = new Point(this.scaleX, this.scaleY);\n let offsetX = bbox.left + bbox.width / 2,\n offsetY = bbox.top + bbox.height / 2;\n if (this.exactBoundingBox) {\n offsetX = offsetX - offsetY * Math.tan(degreesToRadians(this.skewX));\n // Order of those assignments is important.\n // offsetY relies on offsetX being already changed by the line above\n offsetY = offsetY - offsetX * Math.tan(degreesToRadians(this.skewY));\n }\n\n return {\n ...bbox,\n pathOffset: new Point(offsetX, offsetY),\n strokeOffset: new Point(bboxNoStroke.left, bboxNoStroke.top)\n .subtract(new Point(bbox.left, bbox.top))\n .multiply(scale),\n strokeDiff: new Point(bbox.width, bbox.height)\n .subtract(new Point(bboxNoStroke.width, bboxNoStroke.height))\n .multiply(scale),\n };\n }\n\n /**\n * This function is an helper for svg import. it returns the center of the object in the svg\n * untransformed coordinates, by look at the polyline/polygon points.\n * @private\n * @return {Point} center point from element coordinates\n */\n _findCenterFromElement(): Point {\n const bbox = makeBoundingBoxFromPoints(this.points);\n return new Point(bbox.left + bbox.width / 2, bbox.top + bbox.height / 2);\n }\n\n setDimensions() {\n this.setBoundingBox();\n }\n\n setBoundingBox(adjustPosition?: boolean) {\n const { left, top, width, height, pathOffset, strokeOffset, strokeDiff } =\n this._calcDimensions();\n this.set({ width, height, pathOffset, strokeOffset, strokeDiff });\n adjustPosition &&\n this.setPositionByOrigin(\n new Point(left + width / 2, top + height / 2),\n CENTER,\n CENTER,\n );\n }\n\n /**\n * @deprecated intermidiate method to be removed, do not use\n */\n protected isStrokeAccountedForInDimensions() {\n return this.exactBoundingBox;\n }\n\n /**\n * @override stroke is taken in account in size\n */\n _getNonTransformedDimensions() {\n return this.exactBoundingBox\n ? // TODO: fix this\n new Point(this.width, this.height)\n : super._getNonTransformedDimensions();\n }\n\n /**\n * @override stroke and skewing are taken into account when projecting stroke on points,\n * therefore we don't want the default calculation to account for skewing as well.\n * Though it is possible to pass `width` and `height` in `options`, doing so is very strange, use with discretion.\n *\n * @private\n */\n _getTransformedDimensions(options: any = {}) {\n if (this.exactBoundingBox) {\n let size: Point;\n /* When `strokeUniform = true`, any changes to the properties require recalculating the `width` and `height` because\n the stroke projections are affected.\n When `strokeUniform = false`, we don't need to recalculate for scale transformations, as the effect of scale on\n projections follows a linear function (e.g. scaleX of 2 just multiply width by 2)*/\n if (\n Object.keys(options).some(\n (key) =>\n this.strokeUniform ||\n (this.constructor as typeof Polyline).layoutProperties.includes(\n key as keyof TProjectStrokeOnPointsOptions,\n ),\n )\n ) {\n const { width, height } = this._calcDimensions(options);\n size = new Point(options.width ?? width, options.height ?? height);\n } else {\n size = new Point(\n options.width ?? this.width,\n options.height ?? this.height,\n );\n }\n return size.multiply(\n new Point(options.scaleX || this.scaleX, options.scaleY || this.scaleY),\n );\n } else {\n return super._getTransformedDimensions(options);\n }\n }\n\n /**\n * Recalculates dimensions when changing skew and scale\n * @private\n */\n _set(key: string, value: any) {\n const changed = this.initialized && this[key as keyof this] !== value;\n const output = super._set(key, value);\n if (\n this.exactBoundingBox &&\n changed &&\n (((key === SCALE_X || key === SCALE_Y) &&\n this.strokeUniform &&\n (this.constructor as typeof Polyline).layoutProperties.includes(\n 'strokeUniform',\n )) ||\n (this.constructor as typeof Polyline).layoutProperties.includes(\n key as keyof Polyline,\n ))\n ) {\n this.setDimensions();\n }\n return output;\n }\n\n /**\n * Returns object representation of an instance\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} Object representation of an instance\n */\n toObject<\n T extends Omit, keyof SProps>,\n K extends keyof T = never,\n >(propertiesToInclude: K[] = []): Pick & SProps {\n return {\n ...super.toObject(propertiesToInclude),\n points: this.points.map(({ x, y }) => ({ x, y })),\n };\n }\n\n /**\n * Returns svg representation of an instance\n * @return {Array} an array of strings with the specific svg representation\n * of the instance\n */\n _toSVG() {\n const points = [],\n diffX = this.pathOffset.x,\n diffY = this.pathOffset.y,\n NUM_FRACTION_DIGITS = config.NUM_FRACTION_DIGITS;\n\n for (let i = 0, len = this.points.length; i < len; i++) {\n points.push(\n toFixed(this.points[i].x - diffX, NUM_FRACTION_DIGITS),\n ',',\n toFixed(this.points[i].y - diffY, NUM_FRACTION_DIGITS),\n ' ',\n );\n }\n return [\n `<${\n (this.constructor as typeof Polyline).type.toLowerCase() as\n | 'polyline'\n | 'polygon'\n } `,\n 'COMMON_PARTS',\n `points=\"${points.join('')}\" />\\n`,\n ];\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _render(ctx: CanvasRenderingContext2D) {\n const len = this.points.length,\n x = this.pathOffset.x,\n y = this.pathOffset.y;\n\n if (!len || isNaN(this.points[len - 1].y)) {\n // do not draw if no points or odd points\n // NaN comes from parseFloat of a empty string in parser\n return;\n }\n ctx.beginPath();\n ctx.moveTo(this.points[0].x - x, this.points[0].y - y);\n for (let i = 0; i < len; i++) {\n const point = this.points[i];\n ctx.lineTo(point.x - x, point.y - y);\n }\n !this.isOpen() && ctx.closePath();\n this._renderPaintInOrder(ctx);\n }\n\n /**\n * Returns complexity of an instance\n * @return {Number} complexity of this instance\n */\n complexity(): number {\n return this.points.length;\n }\n\n /* _FROM_SVG_START_ */\n\n /**\n * List of attribute names to account for when parsing SVG element (used by {@link Polyline.fromElement})\n * @see: http://www.w3.org/TR/SVG/shapes.html#PolylineElement\n */\n static ATTRIBUTE_NAMES = [...SHARED_ATTRIBUTES];\n\n /**\n * Returns Polyline instance from an SVG element\n * @param {HTMLElement} element Element to parser\n * @param {Object} [options] Options object\n */\n static async fromElement(\n element: HTMLElement | SVGElement,\n options?: Abortable,\n cssRules?: CSSRules,\n ) {\n const points = parsePointsAttribute(element.getAttribute('points')),\n // we omit left and top to instruct the constructor to position the object using the bbox\n\n { left, top, ...parsedAttributes } = parseAttributes(\n element,\n this.ATTRIBUTE_NAMES,\n cssRules,\n );\n return new this(points, {\n ...parsedAttributes,\n ...options,\n });\n }\n\n /* _FROM_SVG_END_ */\n\n /**\n * Returns Polyline instance from an object representation\n * @param {Object} object Object to create an instance from\n * @returns {Promise}\n */\n static fromObject>(object: T) {\n return this._fromObject(object, {\n extraParam: 'points',\n });\n }\n}\n\nclassRegistry.setClass(Polyline);\nclassRegistry.setSVGClass(Polyline);\n","import type { XY } from '../Point';\n\n/**\n * Parses \"points\" attribute, returning an array of values\n * @param {String} points points attribute string\n * @return {Array} array of points\n */\nexport function parsePointsAttribute(points: string | null): XY[] {\n // points attribute is required and must not be empty\n if (!points) {\n return [];\n }\n\n // replace commas with whitespace and remove bookending whitespace\n const pointsSplit: string[] = points.replace(/,/g, ' ').trim().split(/\\s+/);\n\n const parsedPoints = [];\n\n for (let i = 0; i < pointsSplit.length; i += 2) {\n parsedPoints.push({\n x: parseFloat(pointsSplit[i]),\n y: parseFloat(pointsSplit[i + 1]),\n });\n }\n\n // odd number of points is an error\n // if (parsedPoints.length % 2 !== 0) {\n // return null;\n // }\n return parsedPoints;\n}\n","import { classRegistry } from '../ClassRegistry';\nimport { Polyline, polylineDefaultValues } from './Polyline';\n\nexport class Polygon extends Polyline {\n static ownDefaults = polylineDefaultValues;\n\n static type = 'Polygon';\n\n protected isOpen() {\n return false;\n }\n}\n\nclassRegistry.setClass(Polygon);\nclassRegistry.setSVGClass(Polygon);\n","import type { ObjectEvents } from '../../EventTypeDefs';\nimport type { FabricObjectProps, SerializedObjectProps } from '../Object/types';\nimport type { TOptions } from '../../typedefs';\nimport { FabricObject } from '../Object/FabricObject';\nimport { styleProperties } from './constants';\nimport type { StylePropertiesType } from './constants';\nimport type { FabricText } from './Text';\nimport { pick } from '../../util';\nimport { pickBy } from '../../util/misc/pick';\n\nexport type CompleteTextStyleDeclaration = Pick<\n FabricText,\n StylePropertiesType\n>;\n\nexport type TextStyleDeclaration = Partial;\n\nexport type TextStyle = {\n [line: number | string]: { [char: number | string]: TextStyleDeclaration };\n};\n\nexport abstract class StyledText<\n Props extends TOptions = Partial,\n SProps extends SerializedObjectProps = SerializedObjectProps,\n EventSpec extends ObjectEvents = ObjectEvents,\n> extends FabricObject {\n declare abstract styles: TextStyle;\n declare protected abstract _textLines: string[][];\n declare protected _forceClearCache: boolean;\n static _styleProperties: Readonly = styleProperties;\n abstract get2DCursorLocation(\n selectionStart: number,\n skipWrapping?: boolean,\n ): { charIndex: number; lineIndex: number };\n\n /**\n * Returns true if object has no styling or no styling in a line\n * @param {Number} lineIndex , lineIndex is on wrapped lines.\n * @return {Boolean}\n */\n isEmptyStyles(lineIndex?: number): boolean {\n if (!this.styles) {\n return true;\n }\n if (typeof lineIndex !== 'undefined' && !this.styles[lineIndex]) {\n return true;\n }\n const obj =\n typeof lineIndex === 'undefined'\n ? this.styles\n : { line: this.styles[lineIndex] };\n for (const p1 in obj) {\n for (const p2 in obj[p1]) {\n // eslint-disable-next-line no-unused-vars\n for (const p3 in obj[p1][p2]) {\n return false;\n }\n }\n }\n return true;\n }\n\n /**\n * Returns true if object has a style property or has it ina specified line\n * This function is used to detect if a text will use a particular property or not.\n * @param {String} property to check for\n * @param {Number} lineIndex to check the style on\n * @return {Boolean}\n */\n styleHas(property: keyof TextStyleDeclaration, lineIndex?: number): boolean {\n if (!this.styles) {\n return false;\n }\n if (typeof lineIndex !== 'undefined' && !this.styles[lineIndex]) {\n return false;\n }\n const obj =\n typeof lineIndex === 'undefined'\n ? this.styles\n : { 0: this.styles[lineIndex] };\n // eslint-disable-next-line\n for (const p1 in obj) {\n // eslint-disable-next-line\n for (const p2 in obj[p1]) {\n if (typeof obj[p1][p2][property] !== 'undefined') {\n return true;\n }\n }\n }\n return false;\n }\n\n /**\n * Check if characters in a text have a value for a property\n * whose value matches the textbox's value for that property. If so,\n * the character-level property is deleted. If the character\n * has no other properties, then it is also deleted. Finally,\n * if the line containing that character has no other characters\n * then it also is deleted.\n */\n cleanStyle(property: keyof TextStyleDeclaration) {\n if (!this.styles) {\n return false;\n }\n const obj = this.styles;\n let stylesCount = 0,\n letterCount,\n stylePropertyValue,\n allStyleObjectPropertiesMatch = true,\n graphemeCount = 0;\n for (const p1 in obj) {\n letterCount = 0;\n for (const p2 in obj[p1]) {\n const styleObject = obj[p1][p2] || {},\n stylePropertyHasBeenSet = styleObject[property] !== undefined;\n\n stylesCount++;\n\n if (stylePropertyHasBeenSet) {\n if (!stylePropertyValue) {\n stylePropertyValue = styleObject[property];\n } else if (styleObject[property] !== stylePropertyValue) {\n allStyleObjectPropertiesMatch = false;\n }\n\n if (styleObject[property] === this[property as keyof this]) {\n delete styleObject[property];\n }\n } else {\n allStyleObjectPropertiesMatch = false;\n }\n\n if (Object.keys(styleObject).length !== 0) {\n letterCount++;\n } else {\n delete obj[p1][p2];\n }\n }\n\n if (letterCount === 0) {\n delete obj[p1];\n }\n }\n // if every grapheme has the same style set then\n // delete those styles and set it on the parent\n for (let i = 0; i < this._textLines.length; i++) {\n graphemeCount += this._textLines[i].length;\n }\n if (allStyleObjectPropertiesMatch && stylesCount === graphemeCount) {\n this[property as keyof this] = stylePropertyValue as any;\n this.removeStyle(property);\n }\n }\n\n /**\n * Remove a style property or properties from all individual character styles\n * in a text object. Deletes the character style object if it contains no other style\n * props. Deletes a line style object if it contains no other character styles.\n *\n * @param {String} props The property to remove from character styles.\n */\n removeStyle(property: keyof TextStyleDeclaration) {\n if (!this.styles) {\n return;\n }\n const obj = this.styles;\n let line, lineNum, charNum;\n for (lineNum in obj) {\n line = obj[lineNum];\n for (charNum in line) {\n delete line[charNum][property];\n if (Object.keys(line[charNum]).length === 0) {\n delete line[charNum];\n }\n }\n if (Object.keys(line).length === 0) {\n delete obj[lineNum];\n }\n }\n }\n\n private _extendStyles(index: number, style: TextStyleDeclaration): void {\n const { lineIndex, charIndex } = this.get2DCursorLocation(index);\n\n if (!this._getLineStyle(lineIndex)) {\n this._setLineStyle(lineIndex);\n }\n\n const newStyle = pickBy(\n {\n // first create a new object that is a merge of existing and new\n ...this._getStyleDeclaration(lineIndex, charIndex),\n ...style,\n // use the predicate to discard undefined values\n },\n (value) => value !== undefined,\n );\n\n // finally assign to the old position the new style\n this._setStyleDeclaration(lineIndex, charIndex, newStyle);\n }\n\n /**\n * Gets style of a current selection/cursor (at the start position)\n * @param {Number} startIndex Start index to get styles at\n * @param {Number} endIndex End index to get styles at, if not specified startIndex + 1\n * @param {Boolean} [complete] get full style or not\n * @return {Array} styles an array with one, zero or more Style objects\n */\n getSelectionStyles(\n startIndex: number,\n endIndex?: number,\n complete?: boolean,\n ): TextStyleDeclaration[] {\n const styles: TextStyleDeclaration[] = [];\n for (let i = startIndex; i < (endIndex || startIndex); i++) {\n styles.push(this.getStyleAtPosition(i, complete));\n }\n return styles;\n }\n\n /**\n * Gets style of a current selection/cursor position\n * @param {Number} position to get styles at\n * @param {Boolean} [complete] full style if true\n * @return {Object} style Style object at a specified index\n * @private\n */\n getStyleAtPosition(position: number, complete?: boolean) {\n const { lineIndex, charIndex } = this.get2DCursorLocation(position);\n return complete\n ? this.getCompleteStyleDeclaration(lineIndex, charIndex)\n : this._getStyleDeclaration(lineIndex, charIndex);\n }\n\n /**\n * Sets style of a current selection, if no selection exist, do not set anything.\n * @param {Object} styles Styles object\n * @param {Number} startIndex Start index to get styles at\n * @param {Number} [endIndex] End index to get styles at, if not specified startIndex + 1\n */\n setSelectionStyles(styles: object, startIndex: number, endIndex?: number) {\n for (let i = startIndex; i < (endIndex || startIndex); i++) {\n this._extendStyles(i, styles);\n }\n /* not included in _extendStyles to avoid clearing cache more than once */\n this._forceClearCache = true;\n }\n\n /**\n * Get a reference, not a clone, to the style object for a given character,\n * if no style is set for a line or char, return a new empty object.\n * This is tricky and confusing because when you get an empty object you can't\n * determine if it is a reference or a new one.\n * @TODO this should always return a reference or always a clone or undefined when necessary.\n * @protected\n * @param {Number} lineIndex\n * @param {Number} charIndex\n * @return {TextStyleDeclaration} a style object reference to the existing one or a new empty object when undefined\n */\n _getStyleDeclaration(\n lineIndex: number,\n charIndex: number,\n ): TextStyleDeclaration {\n const lineStyle = this.styles && this.styles[lineIndex];\n return lineStyle ? (lineStyle[charIndex] ?? {}) : {};\n }\n\n /**\n * return a new object that contains all the style property for a character\n * the object returned is newly created\n * @param {Number} lineIndex of the line where the character is\n * @param {Number} charIndex position of the character on the line\n * @return {Object} style object\n */\n getCompleteStyleDeclaration(\n lineIndex: number,\n charIndex: number,\n ): CompleteTextStyleDeclaration {\n return {\n ...pick(\n this,\n (this.constructor as typeof StyledText)\n ._styleProperties as (keyof this)[],\n ),\n ...this._getStyleDeclaration(lineIndex, charIndex),\n } as CompleteTextStyleDeclaration;\n }\n\n /**\n * @param {Number} lineIndex\n * @param {Number} charIndex\n * @param {Object} style\n * @private\n */\n protected _setStyleDeclaration(\n lineIndex: number,\n charIndex: number,\n style: object,\n ) {\n this.styles[lineIndex][charIndex] = style;\n }\n\n /**\n *\n * @param {Number} lineIndex\n * @param {Number} charIndex\n * @private\n */\n protected _deleteStyleDeclaration(lineIndex: number, charIndex: number) {\n delete this.styles[lineIndex][charIndex];\n }\n\n /**\n * @param {Number} lineIndex\n * @return {Boolean} if the line exists or not\n * @private\n */\n protected _getLineStyle(lineIndex: number): boolean {\n return !!this.styles[lineIndex];\n }\n\n /**\n * Set the line style to an empty object so that is initialized\n * @param {Number} lineIndex\n * @private\n */\n protected _setLineStyle(lineIndex: number) {\n this.styles[lineIndex] = {};\n }\n\n protected _deleteLineStyle(lineIndex: number) {\n delete this.styles[lineIndex];\n }\n}\n","import { config } from '../../config';\nimport type { TSVGReviver } from '../../typedefs';\nimport { escapeXml } from '../../util/lang_string';\nimport { colorPropToSVG, createSVGRect } from '../../util/misc/svgParsing';\nimport { hasStyleChanged } from '../../util/misc/textStyles';\nimport { toFixed } from '../../util/misc/toFixed';\nimport { FabricObjectSVGExportMixin } from '../Object/FabricObjectSVGExportMixin';\nimport { type TextStyleDeclaration } from './StyledText';\nimport { JUSTIFY } from '../Text/constants';\nimport type { FabricText, GraphemeBBox } from './Text';\nimport { STROKE, FILL } from '../../constants';\nimport { createRotateMatrix } from '../../util/misc/matrix';\nimport { radiansToDegrees } from '../../util/misc/radiansDegreesConversion';\nimport { Point } from '../../Point';\nimport { matrixToSVG } from '../../util/misc/svgExport';\n\nconst multipleSpacesRegex = / +/g;\nconst dblQuoteRegex = /\"/g;\n\nfunction createSVGInlineRect(\n color: string,\n left: number,\n top: number,\n width: number,\n height: number,\n) {\n return `\\t\\t${createSVGRect(color, { left, top, width, height })}\\n`;\n}\n\nexport class TextSVGExportMixin extends FabricObjectSVGExportMixin {\n _toSVG(this: TextSVGExportMixin & FabricText): string[] {\n const offsets = this._getSVGLeftTopOffsets(),\n textAndBg = this._getSVGTextAndBg(offsets.textTop, offsets.textLeft);\n return this._wrapSVGTextAndBg(textAndBg);\n }\n\n toSVG(this: TextSVGExportMixin & FabricText, reviver?: TSVGReviver): string {\n const textSvg = this._createBaseSVGMarkup(this._toSVG(), {\n reviver,\n noStyle: true,\n withShadow: true,\n }),\n path = this.path;\n if (path) {\n return (\n textSvg +\n path._createBaseSVGMarkup(path._toSVG(), {\n reviver,\n withShadow: true,\n additionalTransform: matrixToSVG(this.calcOwnMatrix()),\n })\n );\n }\n return textSvg;\n }\n\n private _getSVGLeftTopOffsets(this: TextSVGExportMixin & FabricText) {\n return {\n textLeft: -this.width / 2,\n textTop: -this.height / 2,\n lineTop: this.getHeightOfLine(0),\n };\n }\n\n private _wrapSVGTextAndBg(\n this: TextSVGExportMixin & FabricText,\n {\n textBgRects,\n textSpans,\n }: {\n textSpans: string[];\n textBgRects: string[];\n },\n ) {\n const noShadow = true,\n textDecoration = this.getSvgTextDecoration(this);\n return [\n textBgRects.join(''),\n '\\t\\t',\n textSpans.join(''),\n '\\n',\n ];\n }\n\n /**\n * @private\n * @param {Number} textTopOffset Text top offset\n * @param {Number} textLeftOffset Text left offset\n * @return {Object}\n */\n private _getSVGTextAndBg(\n this: TextSVGExportMixin & FabricText,\n textTopOffset: number,\n textLeftOffset: number,\n ) {\n const textSpans: string[] = [],\n textBgRects: string[] = [];\n let height = textTopOffset,\n lineOffset;\n\n // bounding-box background\n this.backgroundColor &&\n textBgRects.push(\n ...createSVGInlineRect(\n this.backgroundColor,\n -this.width / 2,\n -this.height / 2,\n this.width,\n this.height,\n ),\n );\n\n // text and text-background\n for (let i = 0, len = this._textLines.length; i < len; i++) {\n lineOffset = this._getLineLeftOffset(i);\n if (this.direction === 'rtl') {\n lineOffset += this.width;\n }\n if (this.textBackgroundColor || this.styleHas('textBackgroundColor', i)) {\n this._setSVGTextLineBg(\n textBgRects,\n i,\n textLeftOffset + lineOffset,\n height,\n );\n }\n this._setSVGTextLineText(\n textSpans,\n i,\n textLeftOffset + lineOffset,\n height,\n );\n height += this.getHeightOfLine(i);\n }\n\n return {\n textSpans,\n textBgRects,\n };\n }\n\n private _createTextCharSpan(\n this: TextSVGExportMixin & FabricText,\n char: string,\n styleDecl: TextStyleDeclaration,\n left: number,\n top: number,\n charBox: GraphemeBBox,\n ) {\n const numFractionDigit = config.NUM_FRACTION_DIGITS;\n const styleProps = this.getSvgSpanStyles(\n styleDecl,\n char !== char.trim() || !!char.match(multipleSpacesRegex),\n ),\n fillStyles = styleProps ? `style=\"${styleProps}\"` : '',\n dy = styleDecl.deltaY,\n dySpan = dy ? ` dy=\"${toFixed(dy, numFractionDigit)}\" ` : '',\n { angle, renderLeft, renderTop, width } = charBox;\n let angleAttr = '';\n if (renderLeft !== undefined) {\n const wBy2 = width / 2;\n angle &&\n (angleAttr = ` rotate=\"${toFixed(radiansToDegrees(angle), numFractionDigit)}\"`);\n const m = createRotateMatrix({ angle: radiansToDegrees(angle!) });\n m[4] = renderLeft!;\n m[5] = renderTop!;\n const renderPoint = new Point(-wBy2, 0).transform(m);\n left = renderPoint.x;\n top = renderPoint.y;\n }\n\n return `${escapeXml(char)}`;\n }\n\n private _setSVGTextLineText(\n this: TextSVGExportMixin & FabricText,\n textSpans: string[],\n lineIndex: number,\n textLeftOffset: number,\n textTopOffset: number,\n ) {\n const lineHeight = this.getHeightOfLine(lineIndex),\n isJustify = this.textAlign.includes(JUSTIFY),\n line = this._textLines[lineIndex];\n let actualStyle,\n nextStyle,\n charsToRender = '',\n charBox,\n style,\n boxWidth = 0,\n timeToRender;\n\n textTopOffset +=\n (lineHeight * (1 - this._fontSizeFraction)) / this.lineHeight;\n for (let i = 0, len = line.length - 1; i <= len; i++) {\n timeToRender = i === len || this.charSpacing || this.path;\n charsToRender += line[i];\n charBox = this.__charBounds[lineIndex][i];\n if (boxWidth === 0) {\n textLeftOffset += charBox.kernedWidth - charBox.width;\n boxWidth += charBox.width;\n } else {\n boxWidth += charBox.kernedWidth;\n }\n if (isJustify && !timeToRender) {\n if (this._reSpaceAndTab.test(line[i])) {\n timeToRender = true;\n }\n }\n if (!timeToRender) {\n // if we have charSpacing or a path, we render char by char\n actualStyle =\n actualStyle || this.getCompleteStyleDeclaration(lineIndex, i);\n nextStyle = this.getCompleteStyleDeclaration(lineIndex, i + 1);\n timeToRender = hasStyleChanged(actualStyle, nextStyle, true);\n }\n if (timeToRender) {\n style = this._getStyleDeclaration(lineIndex, i);\n textSpans.push(\n this._createTextCharSpan(\n charsToRender,\n style,\n textLeftOffset,\n textTopOffset,\n charBox,\n ),\n );\n charsToRender = '';\n actualStyle = nextStyle;\n if (this.direction === 'rtl') {\n textLeftOffset -= boxWidth;\n } else {\n textLeftOffset += boxWidth;\n }\n boxWidth = 0;\n }\n }\n }\n\n private _setSVGTextLineBg(\n this: TextSVGExportMixin & FabricText,\n textBgRects: (string | number)[],\n i: number,\n leftOffset: number,\n textTopOffset: number,\n ) {\n const line = this._textLines[i],\n heightOfLine = this.getHeightOfLine(i) / this.lineHeight;\n let boxWidth = 0,\n boxStart = 0,\n currentColor,\n lastColor = this.getValueOfPropertyAt(i, 0, 'textBackgroundColor');\n for (let j = 0; j < line.length; j++) {\n const { left, width, kernedWidth } = this.__charBounds[i][j];\n currentColor = this.getValueOfPropertyAt(i, j, 'textBackgroundColor');\n if (currentColor !== lastColor) {\n lastColor &&\n textBgRects.push(\n ...createSVGInlineRect(\n lastColor,\n leftOffset + boxStart,\n textTopOffset,\n boxWidth,\n heightOfLine,\n ),\n );\n boxStart = left;\n boxWidth = width;\n lastColor = currentColor;\n } else {\n boxWidth += kernedWidth;\n }\n }\n currentColor &&\n textBgRects.push(\n ...createSVGInlineRect(\n lastColor,\n leftOffset + boxStart,\n textTopOffset,\n boxWidth,\n heightOfLine,\n ),\n );\n }\n\n /**\n * Returns styles-string for svg-export\n * @param {Boolean} skipShadow a boolean to skip shadow filter output\n * @return {String}\n */\n getSvgStyles(this: TextSVGExportMixin & FabricText, skipShadow?: boolean) {\n return `${super.getSvgStyles(skipShadow)} text-decoration-thickness: ${toFixed((this.textDecorationThickness * this.getObjectScaling().y) / 10, config.NUM_FRACTION_DIGITS)}%; white-space: pre;`;\n }\n\n /**\n * Returns styles-string for svg-export\n * @param {Object} style the object from which to retrieve style properties\n * @param {Boolean} useWhiteSpace a boolean to include an additional attribute in the style.\n * @return {String}\n */\n getSvgSpanStyles(\n this: TextSVGExportMixin & FabricText,\n style: TextStyleDeclaration,\n useWhiteSpace?: boolean,\n ) {\n const {\n fontFamily,\n strokeWidth,\n stroke,\n fill,\n fontSize,\n fontStyle,\n fontWeight,\n deltaY,\n textDecorationThickness,\n linethrough,\n overline,\n underline,\n } = style;\n\n const textDecoration = this.getSvgTextDecoration({\n underline: underline ?? this.underline,\n overline: overline ?? this.overline,\n linethrough: linethrough ?? this.linethrough,\n });\n const thickness = textDecorationThickness || this.textDecorationThickness;\n return [\n stroke ? colorPropToSVG(STROKE, stroke) : '',\n strokeWidth ? `stroke-width: ${strokeWidth}; ` : '',\n fontFamily\n ? `font-family: ${\n !fontFamily.includes(\"'\") && !fontFamily.includes('\"')\n ? `'${fontFamily}'`\n : fontFamily\n }; `\n : '',\n fontSize ? `font-size: ${fontSize}px; ` : '',\n fontStyle ? `font-style: ${fontStyle}; ` : '',\n fontWeight ? `font-weight: ${fontWeight}; ` : '',\n textDecoration\n ? `text-decoration: ${textDecoration}; text-decoration-thickness: ${toFixed((thickness * this.getObjectScaling().y) / 10, config.NUM_FRACTION_DIGITS)}%; `\n : '',\n fill ? colorPropToSVG(FILL, fill) : '',\n deltaY ? `baseline-shift: ${-deltaY}; ` : '',\n useWhiteSpace ? 'white-space: pre; ' : '',\n ].join('');\n }\n\n /**\n * Returns text-decoration property for svg-export\n * @param {Object} style the object from which to retrieve style properties\n * @return {String}\n */\n getSvgTextDecoration(\n this: TextSVGExportMixin & FabricText,\n style: TextStyleDeclaration,\n ) {\n return (['overline', 'underline', 'line-through'] as const)\n .filter(\n (decoration) =>\n style[\n decoration.replace('-', '') as\n | 'overline'\n | 'underline'\n | 'linethrough'\n ],\n )\n .join(' ');\n }\n}\n","import { cache } from '../../cache';\nimport { DEFAULT_SVG_FONT_SIZE, FILL, STROKE } from '../../constants';\nimport type { ObjectEvents } from '../../EventTypeDefs';\nimport type {\n CompleteTextStyleDeclaration,\n TextStyle,\n TextStyleDeclaration,\n} from './StyledText';\nimport { StyledText } from './StyledText';\nimport { SHARED_ATTRIBUTES } from '../../parser/attributes';\nimport { parseAttributes } from '../../parser/parseAttributes';\nimport type {\n Abortable,\n TCacheCanvasDimensions,\n TClassProperties,\n TFiller,\n TOptions,\n} from '../../typedefs';\nimport { classRegistry } from '../../ClassRegistry';\nimport { graphemeSplit } from '../../util/lang_string';\nimport { createCanvasElementFor } from '../../util/misc/dom';\nimport type { TextStyleArray } from '../../util/misc/textStyles';\nimport {\n hasStyleChanged,\n stylesFromArray,\n stylesToArray,\n} from '../../util/misc/textStyles';\nimport { getPathSegmentsInfo, getPointOnPath } from '../../util/path';\nimport { cacheProperties } from '../Object/FabricObject';\nimport type { Path } from '../Path';\nimport { TextSVGExportMixin } from './TextSVGExportMixin';\nimport { applyMixins } from '../../util/applyMixins';\nimport type { FabricObjectProps, SerializedObjectProps } from '../Object/types';\nimport type { StylePropertiesType } from './constants';\nimport {\n additionalProps,\n textDefaultValues,\n textLayoutProperties,\n JUSTIFY,\n JUSTIFY_CENTER,\n JUSTIFY_LEFT,\n JUSTIFY_RIGHT,\n TEXT_DECORATION_THICKNESS,\n} from './constants';\nimport { CENTER, LEFT, RIGHT, TOP, BOTTOM } from '../../constants';\nimport { isFiller } from '../../util/typeAssertions';\nimport type { Gradient } from '../../gradient/Gradient';\nimport type { Pattern } from '../../Pattern';\nimport type { CSSRules } from '../../parser/typedefs';\n\nlet measuringContext: CanvasRenderingContext2D | null;\n\n/**\n * Return a context for measurement of text string.\n * if created it gets stored for reuse\n */\nfunction getMeasuringContext() {\n if (!measuringContext) {\n const canvas = createCanvasElementFor({\n width: 0,\n height: 0,\n });\n measuringContext = canvas.getContext('2d');\n }\n return measuringContext;\n}\n\nexport type TPathSide = 'left' | 'right';\n\nexport type TPathAlign = 'baseline' | 'center' | 'ascender' | 'descender';\n\nexport type TextLinesInfo = {\n lines: string[];\n graphemeLines: string[][];\n graphemeText: string[];\n _unwrappedLines: string[][];\n};\n\n/**\n * Measure and return the info of a single grapheme.\n * needs the the info of previous graphemes already filled\n * Override to customize measuring\n */\nexport type GraphemeBBox = {\n width: number;\n height: number;\n kernedWidth: number;\n left: number;\n deltaY: number;\n renderLeft?: number;\n renderTop?: number;\n angle?: number;\n};\n\n// @TODO this is not complete\ninterface UniqueTextProps {\n charSpacing: number;\n lineHeight: number;\n fontSize: number;\n fontWeight: string | number;\n fontFamily: string;\n fontStyle: string;\n pathSide: TPathSide;\n pathAlign: TPathAlign;\n underline: boolean;\n overline: boolean;\n linethrough: boolean;\n textAlign: string;\n direction: CanvasDirection;\n path?: Path;\n textDecorationThickness: number;\n}\n\nexport interface SerializedTextProps\n extends SerializedObjectProps,\n UniqueTextProps {\n styles: TextStyleArray | TextStyle;\n}\n\nexport interface TextProps extends FabricObjectProps, UniqueTextProps {\n styles: TextStyle;\n}\n\n/**\n * Text class\n * @see {@link http://fabric5.fabricjs.com/fabric-intro-part-2#text}\n */\nexport class FabricText<\n Props extends TOptions = Partial,\n SProps extends SerializedTextProps = SerializedTextProps,\n EventSpec extends ObjectEvents = ObjectEvents,\n >\n extends StyledText\n implements UniqueTextProps\n{\n /**\n * Properties that requires a text layout recalculation when changed\n * @type string[]\n * @protected\n */\n static textLayoutProperties: string[] = textLayoutProperties;\n\n /**\n * @private\n */\n declare _reNewline: RegExp;\n\n /**\n * Use this regular expression to filter for whitespaces that is not a new line.\n * Mostly used when text is 'justify' aligned.\n * @private\n */\n declare _reSpacesAndTabs: RegExp;\n\n /**\n * Use this regular expression to filter for whitespace that is not a new line.\n * Mostly used when text is 'justify' aligned.\n * @private\n */\n declare _reSpaceAndTab: RegExp;\n\n /**\n * Use this regular expression to filter consecutive groups of non spaces.\n * Mostly used when text is 'justify' aligned.\n * @private\n */\n declare _reWords: RegExp;\n\n declare text: string;\n\n /**\n * Font size (in pixels)\n * @type Number\n */\n declare fontSize: number;\n\n /**\n * Font weight (e.g. bold, normal, 400, 600, 800)\n * @type {(Number|String)}\n */\n declare fontWeight: string | number;\n\n /**\n * Font family\n * @type String\n */\n declare fontFamily: string;\n\n /**\n * Text decoration underline.\n * @type Boolean\n */\n declare underline: boolean;\n\n /**\n * Text decoration overline.\n * @type Boolean\n */\n declare overline: boolean;\n\n /**\n * Text decoration linethrough.\n * @type Boolean\n */\n declare linethrough: boolean;\n\n /**\n * Text alignment. Possible values: \"left\", \"center\", \"right\", \"justify\",\n * \"justify-left\", \"justify-center\" or \"justify-right\".\n * @type String\n */\n declare textAlign: string;\n\n /**\n * Font style . Possible values: \"\", \"normal\", \"italic\" or \"oblique\".\n * @type String\n */\n declare fontStyle: string;\n\n /**\n * Line height\n * @type Number\n */\n declare lineHeight: number;\n\n /**\n * Superscript schema object (minimum overlap)\n */\n declare superscript: {\n /**\n * fontSize factor\n * @default 0.6\n */\n size: number;\n /**\n * baseline-shift factor (upwards)\n * @default -0.35\n */\n baseline: number;\n };\n\n /**\n * Subscript schema object (minimum overlap)\n */\n declare subscript: {\n /**\n * fontSize factor\n * @default 0.6\n */\n size: number;\n /**\n * baseline-shift factor (downwards)\n * @default 0.11\n */\n baseline: number;\n };\n\n /**\n * Background color of text lines\n * @type String\n */\n declare textBackgroundColor: string;\n\n declare styles: TextStyle;\n\n /**\n * Path that the text should follow.\n * since 4.6.0 the path will be drawn automatically.\n * if you want to make the path visible, give it a stroke and strokeWidth or fill value\n * if you want it to be hidden, assign visible = false to the path.\n * This feature is in BETA, and SVG import/export is not yet supported.\n * @type Path\n * @example\n * const textPath = new Text('Text on a path', {\n * top: 150,\n * left: 150,\n * textAlign: 'center',\n * charSpacing: -50,\n * path: new Path('M 0 0 C 50 -100 150 -100 200 0', {\n * strokeWidth: 1,\n * visible: false\n * }),\n * pathSide: 'left',\n * pathStartOffset: 0\n * });\n */\n declare path?: Path;\n\n /**\n * The text decoration tickness for underline, overline and strikethrough\n * The tickness is expressed in thousandths of fontSize ( em ).\n * The original value was 1/15 that translates to 66.6667 thousandths.\n * The choice of unit of measure is to align with charSpacing.\n * You can slim the tickness without issues, while large underline or overline may end up\n * outside the bounding box of the text. In order to fix that a bigger refactor of the code\n * is needed and is out of scope for now. If you need such large overline on the first line\n * of text or large underline on the last line of text, consider disabling caching as a\n * workaround\n * @default 66.667\n */\n declare textDecorationThickness: number;\n\n /**\n * Offset amount for text path starting position\n * Only used when text has a path\n */\n declare pathStartOffset: number;\n\n /**\n * Which side of the path the text should be drawn on.\n * Only used when text has a path\n * @type {TPathSide} 'left|right'\n */\n declare pathSide: TPathSide;\n\n /**\n * How text is aligned to the path. This property determines\n * the perpendicular position of each character relative to the path.\n * (one of \"baseline\", \"center\", \"ascender\", \"descender\")\n * This feature is in BETA, and its behavior may change\n * @type TPathAlign\n */\n declare pathAlign: TPathAlign;\n\n /**\n * @private\n */\n declare _fontSizeFraction: number;\n\n /**\n * @private\n */\n declare offsets: { underline: number; linethrough: number; overline: number };\n\n /**\n * Text Line proportion to font Size (in pixels)\n * @type Number\n */\n declare _fontSizeMult: number;\n\n /**\n * additional space between characters\n * expressed in thousands of em unit\n * @type Number\n */\n declare charSpacing: number;\n\n /**\n * Baseline shift, styles only, keep at 0 for the main text object\n * @type {Number}\n */\n declare deltaY: number;\n\n /**\n * WARNING: EXPERIMENTAL. NOT SUPPORTED YET\n * determine the direction of the text.\n * This has to be set manually together with textAlign and originX for proper\n * experience.\n * some interesting link for the future\n * https://www.w3.org/International/questions/qa-bidi-unicode-controls\n * @since 4.5.0\n * @type {CanvasDirection} 'ltr|rtl'\n */\n declare direction: CanvasDirection;\n\n /**\n * contains characters bounding boxes\n * This variable is considered to be protected.\n * But for how mixins are implemented right now, we can't leave it private\n * @protected\n */\n __charBounds: GraphemeBBox[][] = [];\n\n /**\n * use this size when measuring text. To avoid IE11 rounding errors\n * @type {Number}\n * @readonly\n * @private\n */\n declare CACHE_FONT_SIZE: number;\n\n /**\n * contains the min text width to avoid getting 0\n * @type {Number}\n */\n declare MIN_TEXT_WIDTH: number;\n\n /**\n * contains the the text of the object, divided in lines as they are displayed\n * on screen. Wrapping will divide the text independently of line breaks\n * @type {string[]}\n */\n declare textLines: string[];\n\n /**\n * same as textlines, but each line is an array of graphemes as split by splitByGrapheme\n * @type {string[]}\n */\n declare _textLines: string[][];\n\n declare _unwrappedTextLines: string[][];\n declare _text: string[];\n declare cursorWidth: number;\n declare __lineHeights: number[];\n declare __lineWidths: number[];\n declare initialized?: true;\n\n static cacheProperties = [...cacheProperties, ...additionalProps];\n\n static ownDefaults = textDefaultValues;\n\n static type = 'Text';\n\n static getDefaults(): Record {\n return { ...super.getDefaults(), ...FabricText.ownDefaults };\n }\n\n constructor(text: string, options?: Props) {\n super();\n Object.assign(this, FabricText.ownDefaults);\n this.setOptions(options);\n if (!this.styles) {\n this.styles = {};\n }\n this.text = text;\n this.initialized = true;\n if (this.path) {\n this.setPathInfo();\n }\n this.initDimensions();\n this.setCoords();\n }\n\n /**\n * If text has a path, it will add the extra information needed\n * for path and text calculations\n */\n setPathInfo() {\n const path = this.path;\n if (path) {\n path.segmentsInfo = getPathSegmentsInfo(path.path);\n }\n }\n\n /**\n * @private\n * Divides text into lines of text and lines of graphemes.\n */\n _splitText(): TextLinesInfo {\n const newLines = this._splitTextIntoLines(this.text);\n this.textLines = newLines.lines;\n this._textLines = newLines.graphemeLines;\n this._unwrappedTextLines = newLines._unwrappedLines;\n this._text = newLines.graphemeText;\n return newLines;\n }\n\n /**\n * Initialize or update text dimensions.\n * Updates this.width and this.height with the proper values.\n * Does not return dimensions.\n */\n initDimensions() {\n this._splitText();\n this._clearCache();\n this.dirty = true;\n if (this.path) {\n this.width = this.path.width;\n this.height = this.path.height;\n } else {\n this.width =\n this.calcTextWidth() || this.cursorWidth || this.MIN_TEXT_WIDTH;\n this.height = this.calcTextHeight();\n }\n if (this.textAlign.includes(JUSTIFY)) {\n // once text is measured we need to make space fatter to make justified text.\n this.enlargeSpaces();\n }\n }\n\n /**\n * Enlarge space boxes and shift the others\n */\n enlargeSpaces() {\n let diffSpace,\n currentLineWidth,\n numberOfSpaces,\n accumulatedSpace,\n line,\n charBound,\n spaces;\n for (let i = 0, len = this._textLines.length; i < len; i++) {\n if (\n this.textAlign !== JUSTIFY &&\n (i === len - 1 || this.isEndOfWrapping(i))\n ) {\n continue;\n }\n accumulatedSpace = 0;\n line = this._textLines[i];\n currentLineWidth = this.getLineWidth(i);\n if (\n currentLineWidth < this.width &&\n (spaces = this.textLines[i].match(this._reSpacesAndTabs))\n ) {\n numberOfSpaces = spaces.length;\n diffSpace = (this.width - currentLineWidth) / numberOfSpaces;\n for (let j = 0; j <= line.length; j++) {\n charBound = this.__charBounds[i][j];\n if (this._reSpaceAndTab.test(line[j])) {\n charBound.width += diffSpace;\n charBound.kernedWidth += diffSpace;\n charBound.left += accumulatedSpace;\n accumulatedSpace += diffSpace;\n } else {\n charBound.left += accumulatedSpace;\n }\n }\n }\n }\n }\n\n /**\n * Detect if the text line is ended with an hard break\n * text and itext do not have wrapping, return false\n * @return {Boolean}\n */\n isEndOfWrapping(lineIndex: number): boolean {\n return lineIndex === this._textLines.length - 1;\n }\n\n /**\n * Detect if a line has a linebreak and so we need to account for it when moving\n * and counting style.\n * It return always 1 for text and Itext. Textbox has its own implementation\n * @return Number\n */\n missingNewlineOffset(lineIndex: number, skipWrapping?: boolean): 0 | 1;\n missingNewlineOffset(_lineIndex: number): 1 {\n return 1;\n }\n\n /**\n * Returns 2d representation (lineIndex and charIndex) of cursor\n * @param {Number} selectionStart\n * @param {Boolean} [skipWrapping] consider the location for unwrapped lines. useful to manage styles.\n */\n get2DCursorLocation(selectionStart: number, skipWrapping?: boolean) {\n const lines = skipWrapping ? this._unwrappedTextLines : this._textLines;\n let i: number;\n for (i = 0; i < lines.length; i++) {\n if (selectionStart <= lines[i].length) {\n return {\n lineIndex: i,\n charIndex: selectionStart,\n };\n }\n selectionStart -=\n lines[i].length + this.missingNewlineOffset(i, skipWrapping);\n }\n return {\n lineIndex: i - 1,\n charIndex:\n lines[i - 1].length < selectionStart\n ? lines[i - 1].length\n : selectionStart,\n };\n }\n\n /**\n * Returns string representation of an instance\n * @return {String} String representation of text object\n */\n toString(): string {\n return `#`;\n }\n\n /**\n * Return the dimension and the zoom level needed to create a cache canvas\n * big enough to host the object to be cached.\n * @private\n * @param {Object} dim.x width of object to be cached\n * @param {Object} dim.y height of object to be cached\n * @return {Object}.width width of canvas\n * @return {Object}.height height of canvas\n * @return {Object}.zoomX zoomX zoom value to unscale the canvas before drawing cache\n * @return {Object}.zoomY zoomY zoom value to unscale the canvas before drawing cache\n */\n _getCacheCanvasDimensions(): TCacheCanvasDimensions {\n const dims = super._getCacheCanvasDimensions();\n const fontSize = this.fontSize;\n dims.width += fontSize * dims.zoomX;\n dims.height += fontSize * dims.zoomY;\n return dims;\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _render(ctx: CanvasRenderingContext2D) {\n const path = this.path;\n path && !path.isNotVisible() && path._render(ctx);\n this._setTextStyles(ctx);\n this._renderTextLinesBackground(ctx);\n this._renderTextDecoration(ctx, 'underline');\n this._renderText(ctx);\n this._renderTextDecoration(ctx, 'overline');\n this._renderTextDecoration(ctx, 'linethrough');\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _renderText(ctx: CanvasRenderingContext2D) {\n if (this.paintFirst === STROKE) {\n this._renderTextStroke(ctx);\n this._renderTextFill(ctx);\n } else {\n this._renderTextFill(ctx);\n this._renderTextStroke(ctx);\n }\n }\n\n /**\n * Set the font parameter of the context with the object properties or with charStyle\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n * @param {Object} [charStyle] object with font style properties\n * @param {String} [charStyle.fontFamily] Font Family\n * @param {Number} [charStyle.fontSize] Font size in pixels. ( without px suffix )\n * @param {String} [charStyle.fontWeight] Font weight\n * @param {String} [charStyle.fontStyle] Font style (italic|normal)\n */\n _setTextStyles(\n ctx: CanvasRenderingContext2D,\n charStyle?: any,\n forMeasuring?: boolean,\n ) {\n ctx.textBaseline = 'alphabetic';\n if (this.path) {\n switch (this.pathAlign) {\n case CENTER:\n ctx.textBaseline = 'middle';\n break;\n case 'ascender':\n ctx.textBaseline = TOP;\n break;\n case 'descender':\n ctx.textBaseline = BOTTOM;\n break;\n }\n }\n ctx.font = this._getFontDeclaration(charStyle, forMeasuring);\n }\n\n /**\n * calculate and return the text Width measuring each line.\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n * @return {Number} Maximum width of Text object\n */\n calcTextWidth(): number {\n let maxWidth = this.getLineWidth(0);\n\n for (let i = 1, len = this._textLines.length; i < len; i++) {\n const currentLineWidth = this.getLineWidth(i);\n if (currentLineWidth > maxWidth) {\n maxWidth = currentLineWidth;\n }\n }\n return maxWidth;\n }\n\n /**\n * @private\n * @param {String} method Method name (\"fillText\" or \"strokeText\")\n * @param {CanvasRenderingContext2D} ctx Context to render on\n * @param {String} line Text to render\n * @param {Number} left Left position of text\n * @param {Number} top Top position of text\n * @param {Number} lineIndex Index of a line in a text\n */\n _renderTextLine(\n method: 'fillText' | 'strokeText',\n ctx: CanvasRenderingContext2D,\n line: string[],\n left: number,\n top: number,\n lineIndex: number,\n ) {\n this._renderChars(method, ctx, line, left, top, lineIndex);\n }\n\n /**\n * Renders the text background for lines, taking care of style\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _renderTextLinesBackground(ctx: CanvasRenderingContext2D) {\n if (!this.textBackgroundColor && !this.styleHas('textBackgroundColor')) {\n return;\n }\n const originalFill = ctx.fillStyle,\n leftOffset = this._getLeftOffset();\n let lineTopOffset = this._getTopOffset();\n\n for (let i = 0, len = this._textLines.length; i < len; i++) {\n const heightOfLine = this.getHeightOfLine(i);\n if (\n !this.textBackgroundColor &&\n !this.styleHas('textBackgroundColor', i)\n ) {\n lineTopOffset += heightOfLine;\n continue;\n }\n const jlen = this._textLines[i].length;\n const lineLeftOffset = this._getLineLeftOffset(i);\n let boxWidth = 0;\n let boxStart = 0;\n let drawStart;\n let currentColor;\n let lastColor = this.getValueOfPropertyAt(i, 0, 'textBackgroundColor');\n for (let j = 0; j < jlen; j++) {\n // at this point charbox are either standard or full with pathInfo if there is a path.\n const charBox = this.__charBounds[i][j] as Required;\n currentColor = this.getValueOfPropertyAt(i, j, 'textBackgroundColor');\n if (this.path) {\n ctx.save();\n ctx.translate(charBox.renderLeft, charBox.renderTop);\n ctx.rotate(charBox.angle);\n ctx.fillStyle = currentColor;\n currentColor &&\n ctx.fillRect(\n -charBox.width / 2,\n (-heightOfLine / this.lineHeight) * (1 - this._fontSizeFraction),\n charBox.width,\n heightOfLine / this.lineHeight,\n );\n ctx.restore();\n } else if (currentColor !== lastColor) {\n drawStart = leftOffset + lineLeftOffset + boxStart;\n if (this.direction === 'rtl') {\n drawStart = this.width - drawStart - boxWidth;\n }\n ctx.fillStyle = lastColor;\n lastColor &&\n ctx.fillRect(\n drawStart,\n lineTopOffset,\n boxWidth,\n heightOfLine / this.lineHeight,\n );\n boxStart = charBox.left;\n boxWidth = charBox.width;\n lastColor = currentColor;\n } else {\n boxWidth += charBox.kernedWidth;\n }\n }\n if (currentColor && !this.path) {\n drawStart = leftOffset + lineLeftOffset + boxStart;\n if (this.direction === 'rtl') {\n drawStart = this.width - drawStart - boxWidth;\n }\n ctx.fillStyle = currentColor;\n ctx.fillRect(\n drawStart,\n lineTopOffset,\n boxWidth,\n heightOfLine / this.lineHeight,\n );\n }\n lineTopOffset += heightOfLine;\n }\n ctx.fillStyle = originalFill;\n // if there is text background color no\n // other shadows should be casted\n this._removeShadow(ctx);\n }\n\n /**\n * measure and return the width of a single character.\n * possibly overridden to accommodate different measure logic or\n * to hook some external lib for character measurement\n * @private\n * @param {String} _char, char to be measured\n * @param {Object} charStyle style of char to be measured\n * @param {String} [previousChar] previous char\n * @param {Object} [prevCharStyle] style of previous char\n */\n _measureChar(\n _char: string,\n charStyle: CompleteTextStyleDeclaration,\n previousChar: string | undefined,\n prevCharStyle: CompleteTextStyleDeclaration | Record,\n ) {\n const fontCache = cache.getFontCache(charStyle),\n fontDeclaration = this._getFontDeclaration(charStyle),\n couple = previousChar + _char,\n stylesAreEqual =\n previousChar &&\n fontDeclaration === this._getFontDeclaration(prevCharStyle),\n fontMultiplier = charStyle.fontSize / this.CACHE_FONT_SIZE;\n let width: number | undefined,\n coupleWidth: number | undefined,\n previousWidth: number | undefined,\n kernedWidth: number | undefined;\n\n if (previousChar && fontCache[previousChar] !== undefined) {\n previousWidth = fontCache[previousChar];\n }\n if (fontCache[_char] !== undefined) {\n kernedWidth = width = fontCache[_char];\n }\n if (stylesAreEqual && fontCache[couple] !== undefined) {\n coupleWidth = fontCache[couple];\n kernedWidth = coupleWidth - previousWidth!;\n }\n if (\n width === undefined ||\n previousWidth === undefined ||\n coupleWidth === undefined\n ) {\n const ctx = getMeasuringContext()!;\n // send a TRUE to specify measuring font size CACHE_FONT_SIZE\n this._setTextStyles(ctx, charStyle, true);\n if (width === undefined) {\n kernedWidth = width = ctx.measureText(_char).width;\n fontCache[_char] = width;\n }\n if (previousWidth === undefined && stylesAreEqual && previousChar) {\n previousWidth = ctx.measureText(previousChar).width;\n fontCache[previousChar] = previousWidth;\n }\n if (stylesAreEqual && coupleWidth === undefined) {\n // we can measure the kerning couple and subtract the width of the previous character\n coupleWidth = ctx.measureText(couple).width;\n fontCache[couple] = coupleWidth;\n // safe to use the non-null since if undefined we defined it before.\n kernedWidth = coupleWidth - previousWidth!;\n }\n }\n return {\n width: width * fontMultiplier,\n kernedWidth: kernedWidth! * fontMultiplier,\n };\n }\n\n /**\n * Computes height of character at given position\n * @param {Number} line the line index number\n * @param {Number} _char the character index number\n * @return {Number} fontSize of the character\n */\n getHeightOfChar(line: number, _char: number): number {\n return this.getValueOfPropertyAt(line, _char, 'fontSize');\n }\n\n /**\n * measure a text line measuring all characters.\n * @param {Number} lineIndex line number\n */\n measureLine(lineIndex: number) {\n const lineInfo = this._measureLine(lineIndex);\n if (this.charSpacing !== 0) {\n lineInfo.width -= this._getWidthOfCharSpacing();\n }\n if (lineInfo.width < 0) {\n lineInfo.width = 0;\n }\n return lineInfo;\n }\n\n /**\n * measure every grapheme of a line, populating __charBounds\n * @param {Number} lineIndex\n * @return {Object} object.width total width of characters\n * @return {Object} object.numOfSpaces length of chars that match this._reSpacesAndTabs\n */\n _measureLine(lineIndex: number) {\n let width = 0,\n prevGrapheme: string | undefined,\n graphemeInfo: GraphemeBBox | undefined;\n\n const reverse = this.pathSide === RIGHT,\n path = this.path,\n line = this._textLines[lineIndex],\n llength = line.length,\n lineBounds = new Array(llength);\n\n this.__charBounds[lineIndex] = lineBounds;\n for (let i = 0; i < llength; i++) {\n const grapheme = line[i];\n graphemeInfo = this._getGraphemeBox(grapheme, lineIndex, i, prevGrapheme);\n lineBounds[i] = graphemeInfo;\n width += graphemeInfo.kernedWidth;\n prevGrapheme = grapheme;\n }\n // this latest bound box represent the last character of the line\n // to simplify cursor handling in interactive mode.\n lineBounds[llength] = {\n left: graphemeInfo ? graphemeInfo.left + graphemeInfo.width : 0,\n width: 0,\n kernedWidth: 0,\n height: this.fontSize,\n deltaY: 0,\n } as GraphemeBBox;\n if (path && path.segmentsInfo) {\n let positionInPath = 0;\n const totalPathLength =\n path.segmentsInfo[path.segmentsInfo.length - 1].length;\n switch (this.textAlign) {\n case LEFT:\n positionInPath = reverse ? totalPathLength - width : 0;\n break;\n case CENTER:\n positionInPath = (totalPathLength - width) / 2;\n break;\n case RIGHT:\n positionInPath = reverse ? 0 : totalPathLength - width;\n break;\n //todo - add support for justify\n }\n positionInPath += this.pathStartOffset * (reverse ? -1 : 1);\n for (\n let i = reverse ? llength - 1 : 0;\n reverse ? i >= 0 : i < llength;\n reverse ? i-- : i++\n ) {\n graphemeInfo = lineBounds[i];\n if (positionInPath > totalPathLength) {\n positionInPath %= totalPathLength;\n } else if (positionInPath < 0) {\n positionInPath += totalPathLength;\n }\n // it would probably much faster to send all the grapheme position for a line\n // and calculate path position/angle at once.\n this._setGraphemeOnPath(positionInPath, graphemeInfo);\n positionInPath += graphemeInfo.kernedWidth;\n }\n }\n return { width: width, numOfSpaces: 0 };\n }\n\n /**\n * Calculate the angle and the left,top position of the char that follow a path.\n * It appends it to graphemeInfo to be reused later at rendering\n * @private\n * @param {Number} positionInPath to be measured\n * @param {GraphemeBBox} graphemeInfo current grapheme box information\n * @param {Object} startingPoint position of the point\n */\n _setGraphemeOnPath(positionInPath: number, graphemeInfo: GraphemeBBox) {\n const centerPosition = positionInPath + graphemeInfo.kernedWidth / 2,\n path = this.path!;\n\n // we are at currentPositionOnPath. we want to know what point on the path is.\n const info = getPointOnPath(path.path, centerPosition, path.segmentsInfo)!;\n graphemeInfo.renderLeft = info.x - path.pathOffset.x;\n graphemeInfo.renderTop = info.y - path.pathOffset.y;\n graphemeInfo.angle = info.angle + (this.pathSide === RIGHT ? Math.PI : 0);\n }\n\n /**\n *\n * @param {String} grapheme to be measured\n * @param {Number} lineIndex index of the line where the char is\n * @param {Number} charIndex position in the line\n * @param {String} [prevGrapheme] character preceding the one to be measured\n * @returns {GraphemeBBox} grapheme bbox\n */\n _getGraphemeBox(\n grapheme: string,\n lineIndex: number,\n charIndex: number,\n prevGrapheme?: string,\n skipLeft?: boolean,\n ): GraphemeBBox {\n const style = this.getCompleteStyleDeclaration(lineIndex, charIndex),\n prevStyle = prevGrapheme\n ? this.getCompleteStyleDeclaration(lineIndex, charIndex - 1)\n : {},\n info = this._measureChar(grapheme, style, prevGrapheme, prevStyle);\n let kernedWidth = info.kernedWidth,\n width = info.width,\n charSpacing;\n\n if (this.charSpacing !== 0) {\n charSpacing = this._getWidthOfCharSpacing();\n width += charSpacing;\n kernedWidth += charSpacing;\n }\n\n const box: GraphemeBBox = {\n width,\n left: 0,\n height: style.fontSize,\n kernedWidth,\n deltaY: style.deltaY,\n };\n if (charIndex > 0 && !skipLeft) {\n const previousBox = this.__charBounds[lineIndex][charIndex - 1];\n box.left =\n previousBox.left + previousBox.width + info.kernedWidth - info.width;\n }\n return box;\n }\n\n /**\n * Calculate height of line at 'lineIndex'\n * @param {Number} lineIndex index of line to calculate\n * @return {Number}\n */\n getHeightOfLine(lineIndex: number): number {\n if (this.__lineHeights[lineIndex]) {\n return this.__lineHeights[lineIndex];\n }\n\n // char 0 is measured before the line cycle because it needs to char\n // emptylines\n let maxHeight = this.getHeightOfChar(lineIndex, 0);\n for (let i = 1, len = this._textLines[lineIndex].length; i < len; i++) {\n maxHeight = Math.max(this.getHeightOfChar(lineIndex, i), maxHeight);\n }\n\n return (this.__lineHeights[lineIndex] =\n maxHeight * this.lineHeight * this._fontSizeMult);\n }\n\n /**\n * Calculate text box height\n */\n calcTextHeight() {\n let lineHeight,\n height = 0;\n for (let i = 0, len = this._textLines.length; i < len; i++) {\n lineHeight = this.getHeightOfLine(i);\n height += i === len - 1 ? lineHeight / this.lineHeight : lineHeight;\n }\n return height;\n }\n\n /**\n * @private\n * @return {Number} Left offset\n */\n _getLeftOffset(): number {\n return this.direction === 'ltr' ? -this.width / 2 : this.width / 2;\n }\n\n /**\n * @private\n * @return {Number} Top offset\n */\n _getTopOffset(): number {\n return -this.height / 2;\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n * @param {String} method Method name (\"fillText\" or \"strokeText\")\n */\n _renderTextCommon(\n ctx: CanvasRenderingContext2D,\n method: 'fillText' | 'strokeText',\n ) {\n ctx.save();\n let lineHeights = 0;\n const left = this._getLeftOffset(),\n top = this._getTopOffset();\n for (let i = 0, len = this._textLines.length; i < len; i++) {\n const heightOfLine = this.getHeightOfLine(i),\n maxHeight = heightOfLine / this.lineHeight,\n leftOffset = this._getLineLeftOffset(i);\n this._renderTextLine(\n method,\n ctx,\n this._textLines[i],\n left + leftOffset,\n top + lineHeights + maxHeight,\n i,\n );\n lineHeights += heightOfLine;\n }\n ctx.restore();\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _renderTextFill(ctx: CanvasRenderingContext2D) {\n if (!this.fill && !this.styleHas(FILL)) {\n return;\n }\n\n this._renderTextCommon(ctx, 'fillText');\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _renderTextStroke(ctx: CanvasRenderingContext2D) {\n if ((!this.stroke || this.strokeWidth === 0) && this.isEmptyStyles()) {\n return;\n }\n\n if (this.shadow && !this.shadow.affectStroke) {\n this._removeShadow(ctx);\n }\n\n ctx.save();\n this._setLineDash(ctx, this.strokeDashArray);\n ctx.beginPath();\n this._renderTextCommon(ctx, 'strokeText');\n ctx.closePath();\n ctx.restore();\n }\n\n /**\n * @private\n * @param {String} method fillText or strokeText.\n * @param {CanvasRenderingContext2D} ctx Context to render on\n * @param {Array} line Content of the line, splitted in an array by grapheme\n * @param {Number} left\n * @param {Number} top\n * @param {Number} lineIndex\n */\n _renderChars(\n method: 'fillText' | 'strokeText',\n ctx: CanvasRenderingContext2D,\n line: Array,\n left: number,\n top: number,\n lineIndex: number,\n ) {\n const lineHeight = this.getHeightOfLine(lineIndex),\n isJustify = this.textAlign.includes(JUSTIFY),\n path = this.path,\n shortCut =\n !isJustify &&\n this.charSpacing === 0 &&\n this.isEmptyStyles(lineIndex) &&\n !path,\n isLtr = this.direction === 'ltr',\n sign = this.direction === 'ltr' ? 1 : -1,\n // this was changed in the PR #7674\n // currentDirection = ctx.canvas.getAttribute('dir');\n currentDirection = ctx.direction;\n\n let actualStyle,\n nextStyle,\n charsToRender = '',\n charBox,\n boxWidth = 0,\n timeToRender,\n drawingLeft;\n\n ctx.save();\n if (currentDirection !== this.direction) {\n ctx.canvas.setAttribute('dir', isLtr ? 'ltr' : 'rtl');\n ctx.direction = isLtr ? 'ltr' : 'rtl';\n ctx.textAlign = isLtr ? LEFT : RIGHT;\n }\n top -= (lineHeight * this._fontSizeFraction) / this.lineHeight;\n if (shortCut) {\n // render all the line in one pass without checking\n // drawingLeft = isLtr ? left : left - this.getLineWidth(lineIndex);\n this._renderChar(method, ctx, lineIndex, 0, line.join(''), left, top);\n ctx.restore();\n return;\n }\n for (let i = 0, len = line.length - 1; i <= len; i++) {\n timeToRender = i === len || this.charSpacing || path;\n charsToRender += line[i];\n charBox = this.__charBounds[lineIndex][i] as Required;\n if (boxWidth === 0) {\n left += sign * (charBox.kernedWidth - charBox.width);\n boxWidth += charBox.width;\n } else {\n boxWidth += charBox.kernedWidth;\n }\n if (isJustify && !timeToRender) {\n if (this._reSpaceAndTab.test(line[i])) {\n timeToRender = true;\n }\n }\n if (!timeToRender) {\n // if we have charSpacing, we render char by char\n actualStyle =\n actualStyle || this.getCompleteStyleDeclaration(lineIndex, i);\n nextStyle = this.getCompleteStyleDeclaration(lineIndex, i + 1);\n timeToRender = hasStyleChanged(actualStyle, nextStyle, false);\n }\n if (timeToRender) {\n if (path) {\n ctx.save();\n ctx.translate(charBox.renderLeft, charBox.renderTop);\n ctx.rotate(charBox.angle);\n this._renderChar(\n method,\n ctx,\n lineIndex,\n i,\n charsToRender,\n -boxWidth / 2,\n 0,\n );\n ctx.restore();\n } else {\n drawingLeft = left;\n this._renderChar(\n method,\n ctx,\n lineIndex,\n i,\n charsToRender,\n drawingLeft,\n top,\n );\n }\n charsToRender = '';\n actualStyle = nextStyle;\n left += sign * boxWidth;\n boxWidth = 0;\n }\n }\n ctx.restore();\n }\n\n /**\n * This function try to patch the missing gradientTransform on canvas gradients.\n * transforming a context to transform the gradient, is going to transform the stroke too.\n * we want to transform the gradient but not the stroke operation, so we create\n * a transformed gradient on a pattern and then we use the pattern instead of the gradient.\n * this method has drawbacks: is slow, is in low resolution, needs a patch for when the size\n * is limited.\n * @private\n * @param {TFiller} filler a fabric gradient instance\n * @return {CanvasPattern} a pattern to use as fill/stroke style\n */\n _applyPatternGradientTransformText(filler: TFiller) {\n // TODO: verify compatibility with strokeUniform\n const width = this.width + this.strokeWidth,\n height = this.height + this.strokeWidth,\n pCanvas = createCanvasElementFor({\n width,\n height,\n }),\n pCtx = pCanvas.getContext('2d')!;\n pCanvas.width = width;\n pCanvas.height = height;\n pCtx.beginPath();\n pCtx.moveTo(0, 0);\n pCtx.lineTo(width, 0);\n pCtx.lineTo(width, height);\n pCtx.lineTo(0, height);\n pCtx.closePath();\n pCtx.translate(width / 2, height / 2);\n pCtx.fillStyle = filler.toLive(pCtx)!;\n this._applyPatternGradientTransform(pCtx, filler);\n pCtx.fill();\n return pCtx.createPattern(pCanvas, 'no-repeat')!;\n }\n\n handleFiller(\n ctx: CanvasRenderingContext2D,\n property: `${T}Style`,\n filler: TFiller | string,\n ): { offsetX: number; offsetY: number } {\n let offsetX: number, offsetY: number;\n if (isFiller(filler)) {\n if (\n (filler as Gradient<'linear'>).gradientUnits === 'percentage' ||\n (filler as Gradient<'linear'>).gradientTransform ||\n (filler as Pattern).patternTransform\n ) {\n // need to transform gradient in a pattern.\n // this is a slow process. If you are hitting this codepath, and the object\n // is not using caching, you should consider switching it on.\n // we need a canvas as big as the current object caching canvas.\n offsetX = -this.width / 2;\n offsetY = -this.height / 2;\n ctx.translate(offsetX, offsetY);\n ctx[property] = this._applyPatternGradientTransformText(filler);\n return { offsetX, offsetY };\n } else {\n // is a simple gradient or pattern\n ctx[property] = filler.toLive(ctx)!;\n return this._applyPatternGradientTransform(ctx, filler);\n }\n } else {\n // is a color\n ctx[property] = filler;\n }\n return { offsetX: 0, offsetY: 0 };\n }\n\n /**\n * This function prepare the canvas for a stroke style, and stroke and strokeWidth\n * need to be sent in as defined\n * @param {CanvasRenderingContext2D} ctx\n * @param {CompleteTextStyleDeclaration} style with stroke and strokeWidth defined\n * @returns\n */\n _setStrokeStyles(\n ctx: CanvasRenderingContext2D,\n {\n stroke,\n strokeWidth,\n }: Pick,\n ) {\n ctx.lineWidth = strokeWidth;\n ctx.lineCap = this.strokeLineCap;\n ctx.lineDashOffset = this.strokeDashOffset;\n ctx.lineJoin = this.strokeLineJoin;\n ctx.miterLimit = this.strokeMiterLimit;\n return this.handleFiller(ctx, 'strokeStyle', stroke!);\n }\n\n /**\n * This function prepare the canvas for a ill style, and fill\n * need to be sent in as defined\n * @param {CanvasRenderingContext2D} ctx\n * @param {CompleteTextStyleDeclaration} style with ill defined\n * @returns\n */\n _setFillStyles(ctx: CanvasRenderingContext2D, { fill }: Pick) {\n return this.handleFiller(ctx, 'fillStyle', fill!);\n }\n\n /**\n * @private\n * @param {String} method\n * @param {CanvasRenderingContext2D} ctx Context to render on\n * @param {Number} lineIndex\n * @param {Number} charIndex\n * @param {String} _char\n * @param {Number} left Left coordinate\n * @param {Number} top Top coordinate\n * @param {Number} lineHeight Height of the line\n */\n _renderChar(\n method: 'fillText' | 'strokeText',\n ctx: CanvasRenderingContext2D,\n lineIndex: number,\n charIndex: number,\n _char: string,\n left: number,\n top: number,\n ) {\n const decl = this._getStyleDeclaration(lineIndex, charIndex),\n fullDecl = this.getCompleteStyleDeclaration(lineIndex, charIndex),\n shouldFill = method === 'fillText' && fullDecl.fill,\n shouldStroke =\n method === 'strokeText' && fullDecl.stroke && fullDecl.strokeWidth;\n\n if (!shouldStroke && !shouldFill) {\n return;\n }\n ctx.save();\n\n ctx.font = this._getFontDeclaration(fullDecl);\n\n if (decl.textBackgroundColor) {\n this._removeShadow(ctx);\n }\n if (decl.deltaY) {\n top += decl.deltaY;\n }\n\n if (shouldFill) {\n const fillOffsets = this._setFillStyles(ctx, fullDecl);\n ctx.fillText(\n _char,\n left - fillOffsets.offsetX,\n top - fillOffsets.offsetY,\n );\n }\n\n if (shouldStroke) {\n const strokeOffsets = this._setStrokeStyles(ctx, fullDecl);\n ctx.strokeText(\n _char,\n left - strokeOffsets.offsetX,\n top - strokeOffsets.offsetY,\n );\n }\n\n ctx.restore();\n }\n\n /**\n * Turns the character into a 'superior figure' (i.e. 'superscript')\n * @param {Number} start selection start\n * @param {Number} end selection end\n */\n setSuperscript(start: number, end: number) {\n this._setScript(start, end, this.superscript);\n }\n\n /**\n * Turns the character into an 'inferior figure' (i.e. 'subscript')\n * @param {Number} start selection start\n * @param {Number} end selection end\n */\n setSubscript(start: number, end: number) {\n this._setScript(start, end, this.subscript);\n }\n\n /**\n * Applies 'schema' at given position\n * @private\n * @param {Number} start selection start\n * @param {Number} end selection end\n * @param {Number} schema\n */\n protected _setScript(\n start: number,\n end: number,\n schema: {\n size: number;\n baseline: number;\n },\n ) {\n const loc = this.get2DCursorLocation(start, true),\n fontSize = this.getValueOfPropertyAt(\n loc.lineIndex,\n loc.charIndex,\n 'fontSize',\n ),\n dy = this.getValueOfPropertyAt(loc.lineIndex, loc.charIndex, 'deltaY'),\n style = {\n fontSize: fontSize * schema.size,\n deltaY: dy + fontSize * schema.baseline,\n };\n this.setSelectionStyles(style, start, end);\n }\n\n /**\n * @private\n * @param {Number} lineIndex index text line\n * @return {Number} Line left offset\n */\n _getLineLeftOffset(lineIndex: number): number {\n const lineWidth = this.getLineWidth(lineIndex),\n lineDiff = this.width - lineWidth,\n textAlign = this.textAlign,\n direction = this.direction,\n isEndOfWrapping = this.isEndOfWrapping(lineIndex);\n let leftOffset = 0;\n if (\n textAlign === JUSTIFY ||\n (textAlign === JUSTIFY_CENTER && !isEndOfWrapping) ||\n (textAlign === JUSTIFY_RIGHT && !isEndOfWrapping) ||\n (textAlign === JUSTIFY_LEFT && !isEndOfWrapping)\n ) {\n return 0;\n }\n if (textAlign === CENTER) {\n leftOffset = lineDiff / 2;\n }\n if (textAlign === RIGHT) {\n leftOffset = lineDiff;\n }\n if (textAlign === JUSTIFY_CENTER) {\n leftOffset = lineDiff / 2;\n }\n if (textAlign === JUSTIFY_RIGHT) {\n leftOffset = lineDiff;\n }\n if (direction === 'rtl') {\n if (\n textAlign === RIGHT ||\n textAlign === JUSTIFY ||\n textAlign === JUSTIFY_RIGHT\n ) {\n leftOffset = 0;\n } else if (textAlign === LEFT || textAlign === JUSTIFY_LEFT) {\n leftOffset = -lineDiff;\n } else if (textAlign === CENTER || textAlign === JUSTIFY_CENTER) {\n leftOffset = -lineDiff / 2;\n }\n }\n return leftOffset;\n }\n\n /**\n * @private\n */\n _clearCache() {\n this._forceClearCache = false;\n this.__lineWidths = [];\n this.__lineHeights = [];\n this.__charBounds = [];\n }\n\n /**\n * Measure a single line given its index. Used to calculate the initial\n * text bounding box. The values are calculated and stored in __lineWidths cache.\n * @private\n * @param {Number} lineIndex line number\n * @return {Number} Line width\n */\n getLineWidth(lineIndex: number): number {\n if (this.__lineWidths[lineIndex] !== undefined) {\n return this.__lineWidths[lineIndex];\n }\n\n const { width } = this.measureLine(lineIndex);\n this.__lineWidths[lineIndex] = width;\n return width;\n }\n\n _getWidthOfCharSpacing() {\n if (this.charSpacing !== 0) {\n return (this.fontSize * this.charSpacing) / 1000;\n }\n return 0;\n }\n\n /**\n * Retrieves the value of property at given character position\n * @param {Number} lineIndex the line number\n * @param {Number} charIndex the character number\n * @param {String} property the property name\n * @returns the value of 'property'\n */\n getValueOfPropertyAt(\n lineIndex: number,\n charIndex: number,\n property: T,\n ): this[T] {\n const charStyle = this._getStyleDeclaration(lineIndex, charIndex);\n return (charStyle[property] ?? this[property]) as this[T];\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _renderTextDecoration(\n ctx: CanvasRenderingContext2D,\n type: 'underline' | 'linethrough' | 'overline',\n ) {\n if (!this[type] && !this.styleHas(type)) {\n return;\n }\n let topOffset = this._getTopOffset();\n const leftOffset = this._getLeftOffset(),\n path = this.path,\n charSpacing = this._getWidthOfCharSpacing(),\n offsetAligner =\n type === 'linethrough' ? 0.5 : type === 'overline' ? 1 : 0,\n offsetY = this.offsets[type];\n for (let i = 0, len = this._textLines.length; i < len; i++) {\n const heightOfLine = this.getHeightOfLine(i);\n if (!this[type] && !this.styleHas(type, i)) {\n topOffset += heightOfLine;\n continue;\n }\n const line = this._textLines[i];\n const maxHeight = heightOfLine / this.lineHeight;\n const lineLeftOffset = this._getLineLeftOffset(i);\n let boxStart = 0;\n let boxWidth = 0;\n let lastDecoration = this.getValueOfPropertyAt(i, 0, type);\n let lastFill = this.getValueOfPropertyAt(i, 0, FILL);\n let lastTickness = this.getValueOfPropertyAt(\n i,\n 0,\n TEXT_DECORATION_THICKNESS,\n );\n let currentDecoration = lastDecoration;\n let currentFill = lastFill;\n let currentTickness = lastTickness;\n const top = topOffset + maxHeight * (1 - this._fontSizeFraction);\n let size = this.getHeightOfChar(i, 0);\n let dy = this.getValueOfPropertyAt(i, 0, 'deltaY');\n for (let j = 0, jlen = line.length; j < jlen; j++) {\n const charBox = this.__charBounds[i][j] as Required;\n currentDecoration = this.getValueOfPropertyAt(i, j, type);\n currentFill = this.getValueOfPropertyAt(i, j, FILL);\n currentTickness = this.getValueOfPropertyAt(\n i,\n j,\n TEXT_DECORATION_THICKNESS,\n );\n const currentSize = this.getHeightOfChar(i, j);\n const currentDy = this.getValueOfPropertyAt(i, j, 'deltaY');\n if (path && currentDecoration && currentFill) {\n const finalTickness = (this.fontSize * currentTickness) / 1000;\n ctx.save();\n // bug? verify lastFill is a valid fill here.\n ctx.fillStyle = lastFill as string;\n ctx.translate(charBox.renderLeft, charBox.renderTop);\n ctx.rotate(charBox.angle);\n ctx.fillRect(\n -charBox.kernedWidth / 2,\n offsetY * currentSize + currentDy - offsetAligner * finalTickness,\n charBox.kernedWidth,\n finalTickness,\n );\n ctx.restore();\n } else if (\n (currentDecoration !== lastDecoration ||\n currentFill !== lastFill ||\n currentSize !== size ||\n currentTickness !== lastTickness ||\n currentDy !== dy) &&\n boxWidth > 0\n ) {\n const finalTickness = (this.fontSize * lastTickness) / 1000;\n let drawStart = leftOffset + lineLeftOffset + boxStart;\n if (this.direction === 'rtl') {\n drawStart = this.width - drawStart - boxWidth;\n }\n if (lastDecoration && lastFill && lastTickness) {\n // bug? verify lastFill is a valid fill here.\n ctx.fillStyle = lastFill as string;\n ctx.fillRect(\n drawStart,\n top + offsetY * size + dy - offsetAligner * finalTickness,\n boxWidth,\n finalTickness,\n );\n }\n boxStart = charBox.left;\n boxWidth = charBox.width;\n lastDecoration = currentDecoration;\n lastTickness = currentTickness;\n lastFill = currentFill;\n size = currentSize;\n dy = currentDy;\n } else {\n boxWidth += charBox.kernedWidth;\n }\n }\n let drawStart = leftOffset + lineLeftOffset + boxStart;\n if (this.direction === 'rtl') {\n drawStart = this.width - drawStart - boxWidth;\n }\n ctx.fillStyle = currentFill as string;\n const finalTickness = (this.fontSize * currentTickness) / 1000;\n currentDecoration &&\n currentFill &&\n currentTickness &&\n ctx.fillRect(\n drawStart,\n top + offsetY * size + dy - offsetAligner * finalTickness,\n boxWidth - charSpacing,\n finalTickness,\n );\n topOffset += heightOfLine;\n }\n // if there is text background color no\n // other shadows should be casted\n this._removeShadow(ctx);\n }\n\n /**\n * return font declaration string for canvas context\n * @param {Object} [styleObject] object\n * @returns {String} font declaration formatted for canvas context.\n */\n _getFontDeclaration(\n {\n fontFamily = this.fontFamily,\n fontStyle = this.fontStyle,\n fontWeight = this.fontWeight,\n fontSize = this.fontSize,\n }: Partial<\n Pick<\n TextStyleDeclaration,\n 'fontFamily' | 'fontStyle' | 'fontWeight' | 'fontSize'\n >\n > = {},\n forMeasuring?: boolean,\n ): string {\n const parsedFontFamily =\n fontFamily.includes(\"'\") ||\n fontFamily.includes('\"') ||\n fontFamily.includes(',') ||\n FabricText.genericFonts.includes(fontFamily.toLowerCase())\n ? fontFamily\n : `\"${fontFamily}\"`;\n return [\n fontStyle,\n fontWeight,\n `${forMeasuring ? this.CACHE_FONT_SIZE : fontSize}px`,\n parsedFontFamily,\n ].join(' ');\n }\n\n /**\n * Renders text instance on a specified context\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n render(ctx: CanvasRenderingContext2D) {\n if (!this.visible) {\n return;\n }\n if (\n this.canvas &&\n this.canvas.skipOffscreen &&\n !this.group &&\n !this.isOnScreen()\n ) {\n return;\n }\n if (this._forceClearCache) {\n this.initDimensions();\n }\n super.render(ctx);\n }\n\n /**\n * Override this method to customize grapheme splitting\n * @todo the util `graphemeSplit` needs to be injectable in some way.\n * is more comfortable to inject the correct util rather than having to override text\n * in the middle of the prototype chain\n * @param {string} value\n * @returns {string[]} array of graphemes\n */\n graphemeSplit(value: string): string[] {\n return graphemeSplit(value);\n }\n\n /**\n * Returns the text as an array of lines.\n * @param {String} text text to split\n * @returns Lines in the text\n */\n _splitTextIntoLines(text: string): TextLinesInfo {\n const lines = text.split(this._reNewline),\n newLines = new Array(lines.length),\n newLine = ['\\n'];\n let newText: string[] = [];\n for (let i = 0; i < lines.length; i++) {\n newLines[i] = this.graphemeSplit(lines[i]);\n newText = newText.concat(newLines[i], newLine);\n }\n newText.pop();\n return {\n _unwrappedLines: newLines,\n lines: lines,\n graphemeText: newText,\n graphemeLines: newLines,\n };\n }\n\n /**\n * Returns object representation of an instance\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} Object representation of an instance\n */\n toObject<\n T extends Omit, keyof SProps>,\n K extends keyof T = never,\n >(propertiesToInclude: K[] = []): Pick & SProps {\n return {\n ...super.toObject([...additionalProps, ...propertiesToInclude] as K[]),\n styles: stylesToArray(this.styles, this.text),\n ...(this.path ? { path: this.path.toObject() } : {}),\n };\n }\n\n set(key: string | any, value?: any) {\n const { textLayoutProperties } = this.constructor as typeof FabricText;\n super.set(key, value);\n let needsDims = false;\n let isAddingPath = false;\n if (typeof key === 'object') {\n for (const _key in key) {\n if (_key === 'path') {\n this.setPathInfo();\n }\n needsDims = needsDims || textLayoutProperties.includes(_key);\n isAddingPath = isAddingPath || _key === 'path';\n }\n } else {\n needsDims = textLayoutProperties.includes(key);\n isAddingPath = key === 'path';\n }\n if (isAddingPath) {\n this.setPathInfo();\n }\n if (needsDims && this.initialized) {\n this.initDimensions();\n this.setCoords();\n }\n return this;\n }\n\n /**\n * Returns complexity of an instance\n * @return {Number} complexity\n */\n complexity(): number {\n return 1;\n }\n\n /**\n * List of generic font families\n * @see https://developer.mozilla.org/en-US/docs/Web/CSS/font-family#generic-name\n */\n static genericFonts = [\n 'serif',\n 'sans-serif',\n 'monospace',\n 'cursive',\n 'fantasy',\n 'system-ui',\n 'ui-serif',\n 'ui-sans-serif',\n 'ui-monospace',\n 'ui-rounded',\n 'math',\n 'emoji',\n 'fangsong',\n ];\n\n /* _FROM_SVG_START_ */\n\n /**\n * List of attribute names to account for when parsing SVG element (used by {@link FabricText.fromElement})\n * @see: http://www.w3.org/TR/SVG/text.html#TextElement\n */\n static ATTRIBUTE_NAMES = SHARED_ATTRIBUTES.concat(\n 'x',\n 'y',\n 'dx',\n 'dy',\n 'font-family',\n 'font-style',\n 'font-weight',\n 'font-size',\n 'letter-spacing',\n 'text-decoration',\n 'text-anchor',\n );\n\n /**\n * Returns FabricText instance from an SVG element (not yet implemented)\n * @param {HTMLElement} element Element to parse\n * @param {Object} [options] Options object\n */\n static async fromElement(\n element: HTMLElement | SVGElement,\n options?: Abortable,\n cssRules?: CSSRules,\n ) {\n const parsedAttributes = parseAttributes(\n element,\n FabricText.ATTRIBUTE_NAMES,\n cssRules,\n );\n\n const {\n textAnchor = LEFT as typeof LEFT | typeof CENTER | typeof RIGHT,\n textDecoration = '',\n dx = 0,\n dy = 0,\n top = 0,\n left = 0,\n fontSize = DEFAULT_SVG_FONT_SIZE,\n strokeWidth = 1,\n ...restOfOptions\n } = { ...options, ...parsedAttributes };\n\n const textContent = (element.textContent || '')\n .replace(/^\\s+|\\s+$|\\n+/g, '')\n .replace(/\\s+/g, ' ');\n\n // this code here is probably the usual issue for SVG center find\n // this can later looked at again and probably removed.\n\n const text = new this(textContent, {\n left: left + dx,\n top: top + dy,\n underline: textDecoration.includes('underline'),\n overline: textDecoration.includes('overline'),\n linethrough: textDecoration.includes('line-through'),\n // we initialize this as 0\n strokeWidth: 0,\n fontSize,\n ...restOfOptions,\n }),\n textHeightScaleFactor = text.getScaledHeight() / text.height,\n lineHeightDiff =\n (text.height + text.strokeWidth) * text.lineHeight - text.height,\n scaledDiff = lineHeightDiff * textHeightScaleFactor,\n textHeight = text.getScaledHeight() + scaledDiff;\n\n let offX = 0;\n /*\n Adjust positioning:\n x/y attributes in SVG correspond to the bottom-left corner of text bounding box\n fabric output by default at top, left.\n */\n if (textAnchor === CENTER) {\n offX = text.getScaledWidth() / 2;\n }\n if (textAnchor === RIGHT) {\n offX = text.getScaledWidth();\n }\n text.set({\n left: text.left - offX,\n top:\n text.top -\n (textHeight - text.fontSize * (0.07 + text._fontSizeFraction)) /\n text.lineHeight,\n strokeWidth,\n });\n return text;\n }\n\n /* _FROM_SVG_END_ */\n\n /**\n * Returns FabricText instance from an object representation\n * @param {Object} object plain js Object to create an instance from\n * @returns {Promise}\n */\n static fromObject<\n T extends TOptions,\n S extends FabricText,\n >(object: T) {\n return this._fromObject(\n {\n ...object,\n styles: stylesFromArray(object.styles || {}, object.text),\n },\n {\n extraParam: 'text',\n },\n );\n }\n}\n\napplyMixins(FabricText, [TextSVGExportMixin]);\nclassRegistry.setClass(FabricText);\nclassRegistry.setSVGClass(FabricText);\n","import type {\n DragEventData,\n DropEventData,\n TPointerEvent,\n} from '../../EventTypeDefs';\nimport { Point } from '../../Point';\nimport type { IText } from './IText';\nimport { setStyle } from '../../util/internals/dom_style';\nimport { cloneStyles } from '../../util/internals/cloneStyles';\nimport type { TextStyleDeclaration } from '../Text/StyledText';\nimport { getDocumentFromElement } from '../../util/dom_misc';\nimport { CHANGED, NONE } from '../../constants';\n\n/**\n * #### Dragging IText/Textbox Lifecycle\n * - {@link start} is called from `mousedown` {@link IText#_mouseDownHandler} and determines if dragging should start by testing {@link isPointerOverSelection}\n * - if true `mousedown` {@link IText#_mouseDownHandler} is blocked to keep selection\n * - if the pointer moves, canvas fires numerous mousemove {@link Canvas#_onMouseMove} that we make sure **aren't** prevented ({@link IText#shouldStartDragging}) in order for the window to start a drag session\n * - once/if the session starts canvas calls {@link onDragStart} on the active object to determine if dragging should occur\n * - canvas fires relevant drag events that are handled by the handlers defined in this scope\n * - {@link end} is called from `mouseup` {@link IText#mouseUpHandler}, blocking IText default click behavior\n * - in case the drag session didn't occur, {@link end} handles a click, since logic to do so was blocked during `mousedown`\n */\nexport class DraggableTextDelegate {\n readonly target: IText;\n private __mouseDownInPlace = false;\n private __dragStartFired = false;\n private __isDraggingOver = false;\n private __dragStartSelection?: {\n selectionStart: number;\n selectionEnd: number;\n };\n private __dragImageDisposer?: VoidFunction;\n private _dispose?: () => void;\n\n constructor(target: IText) {\n this.target = target;\n const disposers = [\n this.target.on('dragenter', this.dragEnterHandler.bind(this)),\n this.target.on('dragover', this.dragOverHandler.bind(this)),\n this.target.on('dragleave', this.dragLeaveHandler.bind(this)),\n this.target.on('dragend', this.dragEndHandler.bind(this)),\n this.target.on('drop', this.dropHandler.bind(this)),\n ];\n this._dispose = () => {\n disposers.forEach((d) => d());\n this._dispose = undefined;\n };\n }\n\n isPointerOverSelection(e: TPointerEvent) {\n const target = this.target;\n const newSelection = target.getSelectionStartFromPointer(e);\n return (\n target.isEditing &&\n newSelection >= target.selectionStart &&\n newSelection <= target.selectionEnd &&\n target.selectionStart < target.selectionEnd\n );\n }\n\n /**\n * @public override this method to disable dragging and default to mousedown logic\n */\n start(e: TPointerEvent) {\n return (this.__mouseDownInPlace = this.isPointerOverSelection(e));\n }\n\n /**\n * @public override this method to disable dragging without discarding selection\n */\n isActive() {\n return this.__mouseDownInPlace;\n }\n\n /**\n * Ends interaction and sets cursor in case of a click\n * @returns true if was active\n */\n end(e: TPointerEvent) {\n const active = this.isActive();\n if (active && !this.__dragStartFired) {\n // mousedown has been blocked since `active` is true => cursor has not been set.\n // `__dragStartFired` is false => dragging didn't occur, pointer didn't move and is over selection.\n // meaning this is actually a click, `active` is a false positive.\n this.target.setCursorByClick(e);\n this.target.initDelayedCursor(true);\n }\n this.__mouseDownInPlace = false;\n this.__dragStartFired = false;\n this.__isDraggingOver = false;\n return active;\n }\n\n getDragStartSelection() {\n return this.__dragStartSelection;\n }\n\n /**\n * Override to customize the drag image\n * https://developer.mozilla.org/en-US/docs/Web/API/DataTransfer/setDragImage\n */\n setDragImage(\n e: DragEvent,\n {\n selectionStart,\n selectionEnd,\n }: {\n selectionStart: number;\n selectionEnd: number;\n },\n ) {\n const target = this.target;\n const canvas = target.canvas!;\n const flipFactor = new Point(target.flipX ? -1 : 1, target.flipY ? -1 : 1);\n const boundaries = target._getCursorBoundaries(selectionStart);\n const selectionPosition = new Point(\n boundaries.left + boundaries.leftOffset,\n boundaries.top + boundaries.topOffset,\n ).multiply(flipFactor);\n const pos = selectionPosition.transform(target.calcTransformMatrix());\n const pointer = canvas.getScenePoint(e);\n const diff = pointer.subtract(pos);\n const retinaScaling = target.getCanvasRetinaScaling();\n const bbox = target.getBoundingRect();\n const correction = pos.subtract(new Point(bbox.left, bbox.top));\n const vpt = canvas.viewportTransform;\n const offset = correction.add(diff).transform(vpt, true);\n // prepare instance for drag image snapshot by making all non selected text invisible\n const bgc = target.backgroundColor;\n const styles = cloneStyles(target.styles);\n target.backgroundColor = '';\n const styleOverride = {\n stroke: 'transparent',\n fill: 'transparent',\n textBackgroundColor: 'transparent',\n };\n target.setSelectionStyles(styleOverride, 0, selectionStart);\n target.setSelectionStyles(styleOverride, selectionEnd, target.text.length);\n target.dirty = true;\n const dragImage = target.toCanvasElement({\n enableRetinaScaling: canvas.enableRetinaScaling,\n viewportTransform: true,\n });\n // restore values\n target.backgroundColor = bgc;\n target.styles = styles;\n target.dirty = true;\n // position drag image offscreen\n setStyle(dragImage, {\n position: 'fixed',\n left: `${-dragImage.width}px`,\n border: NONE,\n width: `${dragImage.width / retinaScaling}px`,\n height: `${dragImage.height / retinaScaling}px`,\n });\n this.__dragImageDisposer && this.__dragImageDisposer();\n this.__dragImageDisposer = () => {\n dragImage.remove();\n };\n getDocumentFromElement(\n (e.target || this.target.hiddenTextarea)! as HTMLElement,\n ).body.appendChild(dragImage);\n e.dataTransfer?.setDragImage(dragImage, offset.x, offset.y);\n }\n\n /**\n * @returns {boolean} determines whether {@link target} should/shouldn't become a drag source\n */\n onDragStart(e: DragEvent): boolean {\n this.__dragStartFired = true;\n const target = this.target;\n const active = this.isActive();\n if (active && e.dataTransfer) {\n const selection = (this.__dragStartSelection = {\n selectionStart: target.selectionStart,\n selectionEnd: target.selectionEnd,\n });\n const value = target._text\n .slice(selection.selectionStart, selection.selectionEnd)\n .join('');\n const data = { text: target.text, value, ...selection };\n e.dataTransfer.setData('text/plain', value);\n e.dataTransfer.setData(\n 'application/fabric',\n JSON.stringify({\n value: value,\n styles: target.getSelectionStyles(\n selection.selectionStart,\n selection.selectionEnd,\n true,\n ),\n }),\n );\n e.dataTransfer.effectAllowed = 'copyMove';\n this.setDragImage(e, data);\n }\n target.abortCursorAnimation();\n return active;\n }\n\n /**\n * use {@link targetCanDrop} to respect overriding\n * @returns {boolean} determines whether {@link target} should/shouldn't become a drop target\n */\n canDrop(e: DragEvent): boolean {\n if (\n this.target.editable &&\n !this.target.getActiveControl() &&\n !e.defaultPrevented\n ) {\n if (this.isActive() && this.__dragStartSelection) {\n // drag source trying to drop over itself\n // allow dropping only outside of drag start selection\n const index = this.target.getSelectionStartFromPointer(e);\n const dragStartSelection = this.__dragStartSelection;\n return (\n index < dragStartSelection.selectionStart ||\n index > dragStartSelection.selectionEnd\n );\n }\n return true;\n }\n return false;\n }\n\n /**\n * in order to respect overriding {@link IText#canDrop} we call that instead of calling {@link canDrop} directly\n */\n protected targetCanDrop(e: DragEvent) {\n return this.target.canDrop(e);\n }\n\n dragEnterHandler({ e }: DragEventData) {\n const canDrop = this.targetCanDrop(e);\n if (!this.__isDraggingOver && canDrop) {\n this.__isDraggingOver = true;\n }\n }\n\n dragOverHandler(ev: DragEventData) {\n const { e } = ev;\n const canDrop = this.targetCanDrop(e);\n if (!this.__isDraggingOver && canDrop) {\n this.__isDraggingOver = true;\n } else if (this.__isDraggingOver && !canDrop) {\n // drop state has changed\n this.__isDraggingOver = false;\n }\n if (this.__isDraggingOver) {\n // can be dropped, inform browser\n e.preventDefault();\n // inform event subscribers\n ev.canDrop = true;\n ev.dropTarget = this.target;\n }\n }\n\n dragLeaveHandler() {\n if (this.__isDraggingOver || this.isActive()) {\n this.__isDraggingOver = false;\n }\n }\n\n /**\n * Override the `text/plain | application/fabric` types of {@link DragEvent#dataTransfer}\n * in order to change the drop value or to customize styling respectively, by listening to the `drop:before` event\n * https://developer.mozilla.org/en-US/docs/Web/API/HTML_Drag_and_Drop_API/Drag_operations#performing_a_drop\n */\n dropHandler(ev: DropEventData) {\n const { e } = ev;\n const didDrop = e.defaultPrevented;\n this.__isDraggingOver = false;\n // inform browser that the drop has been accepted\n e.preventDefault();\n let insert = e.dataTransfer?.getData('text/plain');\n if (insert && !didDrop) {\n const target = this.target;\n const canvas = target.canvas!;\n let insertAt = target.getSelectionStartFromPointer(e);\n const { styles } = (\n e.dataTransfer!.types.includes('application/fabric')\n ? JSON.parse(e.dataTransfer!.getData('application/fabric'))\n : {}\n ) as { styles: TextStyleDeclaration[] };\n const trailing = insert[Math.max(0, insert.length - 1)];\n const selectionStartOffset = 0;\n // drag and drop in same instance\n if (this.__dragStartSelection) {\n const selectionStart = this.__dragStartSelection.selectionStart;\n const selectionEnd = this.__dragStartSelection.selectionEnd;\n if (insertAt > selectionStart && insertAt <= selectionEnd) {\n insertAt = selectionStart;\n } else if (insertAt > selectionEnd) {\n insertAt -= selectionEnd - selectionStart;\n }\n target.removeChars(selectionStart, selectionEnd);\n // prevent `dragend` from handling event\n delete this.__dragStartSelection;\n }\n // remove redundant line break\n if (\n target._reNewline.test(trailing) &&\n (target._reNewline.test(target._text[insertAt]) ||\n insertAt === target._text.length)\n ) {\n insert = insert.trimEnd();\n }\n // inform subscribers\n ev.didDrop = true;\n ev.dropTarget = target;\n // finalize\n target.insertChars(insert, styles, insertAt);\n // can this part be moved in an outside event? andrea to check.\n canvas.setActiveObject(target);\n target.enterEditing(e);\n target.selectionStart = Math.min(\n insertAt + selectionStartOffset,\n target._text.length,\n );\n target.selectionEnd = Math.min(\n target.selectionStart + insert.length,\n target._text.length,\n );\n target.hiddenTextarea!.value = target.text;\n target._updateTextarea();\n target.hiddenTextarea!.focus();\n target.fire(CHANGED, {\n index: insertAt + selectionStartOffset,\n action: 'drop',\n });\n canvas.fire('text:changed', { target });\n canvas.contextTopDirty = true;\n canvas.requestRenderAll();\n }\n }\n\n /**\n * fired only on the drag source after drop (if occurred)\n * handle changes to the drag source in case of a drop on another object or a cancellation\n * https://developer.mozilla.org/en-US/docs/Web/API/HTML_Drag_and_Drop_API/Drag_operations#finishing_a_drag\n */\n dragEndHandler({ e }: DragEventData) {\n if (this.isActive() && this.__dragStartFired) {\n // once the drop event finishes we check if we need to change the drag source\n // if the drag source received the drop we bail out since the drop handler has already handled logic\n if (this.__dragStartSelection) {\n const target = this.target;\n const canvas = this.target.canvas!;\n const { selectionStart, selectionEnd } = this.__dragStartSelection;\n const dropEffect = e.dataTransfer?.dropEffect || NONE;\n if (dropEffect === NONE) {\n // pointer is back over selection\n target.selectionStart = selectionStart;\n target.selectionEnd = selectionEnd;\n target._updateTextarea();\n target.hiddenTextarea!.focus();\n } else {\n target.clearContextTop();\n if (dropEffect === 'move') {\n target.removeChars(selectionStart, selectionEnd);\n target.selectionStart = target.selectionEnd = selectionStart;\n target.hiddenTextarea &&\n (target.hiddenTextarea.value = target.text);\n target._updateTextarea();\n target.fire(CHANGED, {\n index: selectionStart,\n action: 'dragend',\n });\n canvas.fire('text:changed', { target });\n canvas.requestRenderAll();\n }\n target.exitEditing();\n }\n }\n }\n\n this.__dragImageDisposer && this.__dragImageDisposer();\n delete this.__dragImageDisposer;\n delete this.__dragStartSelection;\n this.__isDraggingOver = false;\n }\n\n dispose() {\n this._dispose && this._dispose();\n }\n}\n","import type { ObjectEvents, TPointerEvent } from '../../EventTypeDefs';\nimport { Point } from '../../Point';\nimport type { FabricObject } from '../Object/FabricObject';\nimport { FabricText } from '../Text/Text';\nimport { animate } from '../../util/animation/animate';\nimport type { TOnAnimationChangeCallback } from '../../util/animation/types';\nimport type { ValueAnimation } from '../../util/animation/ValueAnimation';\nimport type { TextStyleDeclaration } from '../Text/StyledText';\nimport type { SerializedTextProps, TextProps } from '../Text/Text';\nimport type { TOptions } from '../../typedefs';\nimport { getDocumentFromElement } from '../../util/dom_misc';\nimport { LEFT, MODIFIED, RIGHT, reNewline } from '../../constants';\nimport type { IText } from './IText';\n\n/**\n * extend this regex to support non english languages\n *\n * - ` ` Matches a SPACE character (char code 32).\n * - `\\n` Matches a LINE FEED character (char code 10).\n * - `\\.` Matches a \".\" character (char code 46).\n * - `,` Matches a \",\" character (char code 44).\n * - `;` Matches a \";\" character (char code 59).\n * - `!` Matches a \"!\" character (char code 33).\n * - `\\?` Matches a \"?\" character (char code 63).\n * - `\\-` Matches a \"-\" character (char code 45).\n */\n// eslint-disable-next-line no-useless-escape\nconst reNonWord = /[ \\n\\.,;!\\?\\-]/;\n\nexport type ITextEvents = ObjectEvents & {\n 'selection:changed': never;\n changed: never | { index: number; action: string };\n 'editing:entered': never | { e: TPointerEvent };\n 'editing:exited': never;\n};\n\nexport abstract class ITextBehavior<\n Props extends TOptions = Partial,\n SProps extends SerializedTextProps = SerializedTextProps,\n EventSpec extends ITextEvents = ITextEvents,\n> extends FabricText {\n declare abstract isEditing: boolean;\n declare abstract cursorDelay: number;\n declare abstract selectionStart: number;\n declare abstract selectionEnd: number;\n declare abstract cursorDuration: number;\n declare abstract editable: boolean;\n declare abstract editingBorderColor: string;\n\n declare abstract compositionStart: number;\n declare abstract compositionEnd: number;\n\n declare abstract hiddenTextarea: HTMLTextAreaElement | null;\n\n /**\n * Helps determining when the text is in composition, so that the cursor\n * rendering is altered.\n */\n declare protected inCompositionMode: boolean;\n\n declare protected _reSpace: RegExp;\n declare private _currentTickState?: ValueAnimation;\n declare private _currentTickCompleteState?: ValueAnimation;\n protected _currentCursorOpacity = 1;\n declare private _textBeforeEdit: string;\n declare protected __selectionStartOnMouseDown: number;\n\n /**\n * Keeps track if the IText object was selected before the actual click.\n * This because we want to delay enter editing by a click.\n */\n declare protected selected: boolean;\n declare protected cursorOffsetCache: { left?: number; top?: number };\n declare protected _savedProps?: {\n hasControls: boolean;\n borderColor: string;\n lockMovementX: boolean;\n lockMovementY: boolean;\n selectable: boolean;\n hoverCursor: CSSStyleDeclaration['cursor'] | null;\n defaultCursor?: CSSStyleDeclaration['cursor'];\n moveCursor?: CSSStyleDeclaration['cursor'];\n };\n declare protected _selectionDirection: 'left' | 'right' | null;\n\n abstract initHiddenTextarea(): void;\n abstract _fireSelectionChanged(): void;\n abstract renderCursorOrSelection(): void;\n abstract getSelectionStartFromPointer(e: TPointerEvent): number;\n abstract _getCursorBoundaries(\n index: number,\n skipCaching?: boolean,\n ): {\n left: number;\n top: number;\n leftOffset: number;\n topOffset: number;\n };\n\n /**\n * Initializes all the interactive behavior of IText\n */\n initBehavior() {\n this._tick = this._tick.bind(this);\n this._onTickComplete = this._onTickComplete.bind(this);\n this.updateSelectionOnMouseMove =\n this.updateSelectionOnMouseMove.bind(this);\n }\n\n onDeselect(options?: { e?: TPointerEvent; object?: FabricObject }) {\n this.isEditing && this.exitEditing();\n this.selected = false;\n return super.onDeselect(options);\n }\n\n /**\n * @private\n */\n _animateCursor({\n toValue,\n duration,\n delay,\n onComplete,\n }: {\n toValue: number;\n duration: number;\n delay?: number;\n onComplete?: TOnAnimationChangeCallback;\n }) {\n return animate({\n startValue: this._currentCursorOpacity,\n endValue: toValue,\n duration,\n delay,\n onComplete,\n abort: () =>\n !this.canvas ||\n // we do not want to animate a selection, only cursor\n this.selectionStart !== this.selectionEnd,\n onChange: (value) => {\n this._currentCursorOpacity = value;\n this.renderCursorOrSelection();\n },\n });\n }\n\n /**\n * changes the cursor from visible to invisible\n */\n private _tick(delay?: number) {\n this._currentTickState = this._animateCursor({\n toValue: 0,\n duration: this.cursorDuration / 2,\n delay: Math.max(delay || 0, 100),\n onComplete: this._onTickComplete,\n });\n }\n\n /**\n * Changes the cursor from invisible to visible\n */\n private _onTickComplete() {\n this._currentTickCompleteState?.abort();\n this._currentTickCompleteState = this._animateCursor({\n toValue: 1,\n duration: this.cursorDuration,\n onComplete: this._tick,\n });\n }\n\n /**\n * Initializes delayed cursor\n */\n initDelayedCursor(restart?: boolean) {\n this.abortCursorAnimation();\n this._tick(restart ? 0 : this.cursorDelay);\n }\n\n /**\n * Aborts cursor animation, clears all timeouts and clear textarea context if necessary\n */\n abortCursorAnimation() {\n let shouldClear = false;\n [this._currentTickState, this._currentTickCompleteState].forEach(\n (cursorAnimation) => {\n if (cursorAnimation && !cursorAnimation.isDone()) {\n shouldClear = true;\n cursorAnimation.abort();\n }\n },\n );\n\n this._currentCursorOpacity = 1;\n\n // make sure we clear context even if instance is not editing\n if (shouldClear) {\n this.clearContextTop();\n }\n }\n\n /**\n * Restart tue cursor animation if either is in complete state ( between animations )\n * or if it never started before\n */\n restartCursorIfNeeded() {\n if (\n [this._currentTickState, this._currentTickCompleteState].some(\n (cursorAnimation) => !cursorAnimation || cursorAnimation.isDone(),\n )\n ) {\n this.initDelayedCursor();\n }\n }\n\n /**\n * Selects entire text\n */\n selectAll() {\n this.selectionStart = 0;\n this.selectionEnd = this._text.length;\n this._fireSelectionChanged();\n this._updateTextarea();\n return this;\n }\n\n /**\n * Selects entire text and updates the visual state\n */\n cmdAll() {\n this.selectAll();\n this.renderCursorOrSelection();\n }\n\n /**\n * Returns selected text\n * @return {String}\n */\n getSelectedText(): string {\n return this._text.slice(this.selectionStart, this.selectionEnd).join('');\n }\n\n /**\n * Find new selection index representing start of current word according to current selection index\n * @param {Number} startFrom Current selection index\n * @return {Number} New selection index\n */\n findWordBoundaryLeft(startFrom: number): number {\n let offset = 0,\n index = startFrom - 1;\n\n // remove space before cursor first\n if (this._reSpace.test(this._text[index])) {\n while (this._reSpace.test(this._text[index])) {\n offset++;\n index--;\n }\n }\n while (/\\S/.test(this._text[index]) && index > -1) {\n offset++;\n index--;\n }\n\n return startFrom - offset;\n }\n\n /**\n * Find new selection index representing end of current word according to current selection index\n * @param {Number} startFrom Current selection index\n * @return {Number} New selection index\n */\n findWordBoundaryRight(startFrom: number): number {\n let offset = 0,\n index = startFrom;\n\n // remove space after cursor first\n if (this._reSpace.test(this._text[index])) {\n while (this._reSpace.test(this._text[index])) {\n offset++;\n index++;\n }\n }\n while (/\\S/.test(this._text[index]) && index < this._text.length) {\n offset++;\n index++;\n }\n\n return startFrom + offset;\n }\n\n /**\n * Find new selection index representing start of current line according to current selection index\n * @param {Number} startFrom Current selection index\n * @return {Number} New selection index\n */\n findLineBoundaryLeft(startFrom: number): number {\n let offset = 0,\n index = startFrom - 1;\n\n while (!/\\n/.test(this._text[index]) && index > -1) {\n offset++;\n index--;\n }\n\n return startFrom - offset;\n }\n\n /**\n * Find new selection index representing end of current line according to current selection index\n * @param {Number} startFrom Current selection index\n * @return {Number} New selection index\n */\n findLineBoundaryRight(startFrom: number): number {\n let offset = 0,\n index = startFrom;\n\n while (!/\\n/.test(this._text[index]) && index < this._text.length) {\n offset++;\n index++;\n }\n\n return startFrom + offset;\n }\n\n /**\n * Finds index corresponding to beginning or end of a word\n * @param {Number} selectionStart Index of a character\n * @param {Number} direction 1 or -1\n * @return {Number} Index of the beginning or end of a word\n */\n searchWordBoundary(selectionStart: number, direction: 1 | -1): number {\n const text = this._text;\n // if we land on a space we move the cursor backwards\n // if we are searching boundary end we move the cursor backwards ONLY if we don't land on a line break\n let index =\n selectionStart > 0 &&\n this._reSpace.test(text[selectionStart]) &&\n (direction === -1 || !reNewline.test(text[selectionStart - 1]))\n ? selectionStart - 1\n : selectionStart,\n _char = text[index];\n while (index > 0 && index < text.length && !reNonWord.test(_char)) {\n index += direction;\n _char = text[index];\n }\n if (direction === -1 && reNonWord.test(_char)) {\n index++;\n }\n return index;\n }\n\n /**\n * Selects the word that contains the char at index selectionStart\n * @param {Number} selectionStart Index of a character\n */\n selectWord(selectionStart?: number) {\n selectionStart = selectionStart ?? this.selectionStart;\n // search backwards\n const newSelectionStart = this.searchWordBoundary(selectionStart, -1),\n // search forward\n newSelectionEnd = Math.max(\n newSelectionStart,\n this.searchWordBoundary(selectionStart, 1),\n );\n\n this.selectionStart = newSelectionStart;\n this.selectionEnd = newSelectionEnd;\n this._fireSelectionChanged();\n this._updateTextarea();\n // remove next major, for now it renders twice :(\n this.renderCursorOrSelection();\n }\n\n /**\n * Selects the line that contains selectionStart\n * @param {Number} selectionStart Index of a character\n */\n selectLine(selectionStart?: number) {\n selectionStart = selectionStart ?? this.selectionStart;\n const newSelectionStart = this.findLineBoundaryLeft(selectionStart),\n newSelectionEnd = this.findLineBoundaryRight(selectionStart);\n\n this.selectionStart = newSelectionStart;\n this.selectionEnd = newSelectionEnd;\n this._fireSelectionChanged();\n this._updateTextarea();\n }\n\n /**\n * Enters editing state\n */\n enterEditing(e?: TPointerEvent) {\n if (this.isEditing || !this.editable) {\n return;\n }\n this.enterEditingImpl();\n this.fire('editing:entered', e ? { e } : undefined);\n this._fireSelectionChanged();\n if (this.canvas) {\n this.canvas.fire('text:editing:entered', {\n target: this as unknown as IText,\n e,\n });\n this.canvas.requestRenderAll();\n }\n }\n\n /**\n * runs the actual logic that enter from editing state, see {@link enterEditing}\n */\n enterEditingImpl() {\n if (this.canvas) {\n this.canvas.calcOffset();\n this.canvas.textEditingManager.exitTextEditing();\n }\n\n this.isEditing = true;\n\n this.initHiddenTextarea();\n this.hiddenTextarea!.focus();\n this.hiddenTextarea!.value = this.text;\n this._updateTextarea();\n this._saveEditingProps();\n this._setEditingProps();\n this._textBeforeEdit = this.text;\n\n this._tick();\n }\n\n /**\n * called by {@link Canvas#textEditingManager}\n */\n updateSelectionOnMouseMove(e: TPointerEvent) {\n if (this.getActiveControl()) {\n return;\n }\n\n const el = this.hiddenTextarea!;\n // regain focus\n getDocumentFromElement(el).activeElement !== el && el.focus();\n\n const newSelectionStart = this.getSelectionStartFromPointer(e),\n currentStart = this.selectionStart,\n currentEnd = this.selectionEnd;\n if (\n (newSelectionStart !== this.__selectionStartOnMouseDown ||\n currentStart === currentEnd) &&\n (currentStart === newSelectionStart || currentEnd === newSelectionStart)\n ) {\n return;\n }\n if (newSelectionStart > this.__selectionStartOnMouseDown) {\n this.selectionStart = this.__selectionStartOnMouseDown;\n this.selectionEnd = newSelectionStart;\n } else {\n this.selectionStart = newSelectionStart;\n this.selectionEnd = this.__selectionStartOnMouseDown;\n }\n if (\n this.selectionStart !== currentStart ||\n this.selectionEnd !== currentEnd\n ) {\n this._fireSelectionChanged();\n this._updateTextarea();\n this.renderCursorOrSelection();\n }\n }\n\n /**\n * @private\n */\n _setEditingProps() {\n this.hoverCursor = 'text';\n\n if (this.canvas) {\n this.canvas.defaultCursor = this.canvas.moveCursor = 'text';\n }\n\n this.borderColor = this.editingBorderColor;\n this.hasControls = this.selectable = false;\n this.lockMovementX = this.lockMovementY = true;\n }\n\n /**\n * convert from textarea to grapheme indexes\n */\n fromStringToGraphemeSelection(start: number, end: number, text: string) {\n const smallerTextStart = text.slice(0, start),\n graphemeStart = this.graphemeSplit(smallerTextStart).length;\n if (start === end) {\n return { selectionStart: graphemeStart, selectionEnd: graphemeStart };\n }\n const smallerTextEnd = text.slice(start, end),\n graphemeEnd = this.graphemeSplit(smallerTextEnd).length;\n return {\n selectionStart: graphemeStart,\n selectionEnd: graphemeStart + graphemeEnd,\n };\n }\n\n /**\n * convert from fabric to textarea values\n */\n fromGraphemeToStringSelection(\n start: number,\n end: number,\n graphemes: string[],\n ) {\n const smallerTextStart = graphemes.slice(0, start),\n graphemeStart = smallerTextStart.join('').length;\n if (start === end) {\n return { selectionStart: graphemeStart, selectionEnd: graphemeStart };\n }\n const smallerTextEnd = graphemes.slice(start, end),\n graphemeEnd = smallerTextEnd.join('').length;\n return {\n selectionStart: graphemeStart,\n selectionEnd: graphemeStart + graphemeEnd,\n };\n }\n\n /**\n * @private\n */\n _updateTextarea() {\n this.cursorOffsetCache = {};\n if (!this.hiddenTextarea) {\n return;\n }\n if (!this.inCompositionMode) {\n const newSelection = this.fromGraphemeToStringSelection(\n this.selectionStart,\n this.selectionEnd,\n this._text,\n );\n this.hiddenTextarea.selectionStart = newSelection.selectionStart;\n this.hiddenTextarea.selectionEnd = newSelection.selectionEnd;\n }\n this.updateTextareaPosition();\n }\n\n /**\n * @private\n */\n updateFromTextArea() {\n if (!this.hiddenTextarea) {\n return;\n }\n this.cursorOffsetCache = {};\n const textarea = this.hiddenTextarea;\n this.text = textarea.value;\n this.set('dirty', true);\n this.initDimensions();\n this.setCoords();\n const newSelection = this.fromStringToGraphemeSelection(\n textarea.selectionStart,\n textarea.selectionEnd,\n textarea.value,\n );\n this.selectionEnd = this.selectionStart = newSelection.selectionEnd;\n if (!this.inCompositionMode) {\n this.selectionStart = newSelection.selectionStart;\n }\n this.updateTextareaPosition();\n }\n\n /**\n * @private\n */\n updateTextareaPosition() {\n if (this.selectionStart === this.selectionEnd) {\n const style = this._calcTextareaPosition();\n this.hiddenTextarea!.style.left = style.left;\n this.hiddenTextarea!.style.top = style.top;\n }\n }\n\n /**\n * @private\n * @return {Object} style contains style for hiddenTextarea\n */\n _calcTextareaPosition() {\n if (!this.canvas) {\n return { left: '1px', top: '1px' };\n }\n const desiredPosition = this.inCompositionMode\n ? this.compositionStart\n : this.selectionStart,\n boundaries = this._getCursorBoundaries(desiredPosition),\n cursorLocation = this.get2DCursorLocation(desiredPosition),\n lineIndex = cursorLocation.lineIndex,\n charIndex = cursorLocation.charIndex,\n charHeight =\n this.getValueOfPropertyAt(lineIndex, charIndex, 'fontSize') *\n this.lineHeight,\n leftOffset = boundaries.leftOffset,\n retinaScaling = this.getCanvasRetinaScaling(),\n upperCanvas = this.canvas.upperCanvasEl,\n upperCanvasWidth = upperCanvas.width / retinaScaling,\n upperCanvasHeight = upperCanvas.height / retinaScaling,\n maxWidth = upperCanvasWidth - charHeight,\n maxHeight = upperCanvasHeight - charHeight;\n\n const p = new Point(\n boundaries.left + leftOffset,\n boundaries.top + boundaries.topOffset + charHeight,\n )\n .transform(this.calcTransformMatrix())\n .transform(this.canvas.viewportTransform)\n .multiply(\n new Point(\n upperCanvas.clientWidth / upperCanvasWidth,\n upperCanvas.clientHeight / upperCanvasHeight,\n ),\n );\n\n if (p.x < 0) {\n p.x = 0;\n }\n if (p.x > maxWidth) {\n p.x = maxWidth;\n }\n if (p.y < 0) {\n p.y = 0;\n }\n if (p.y > maxHeight) {\n p.y = maxHeight;\n }\n\n // add canvas offset on document\n p.x += this.canvas._offset.left;\n p.y += this.canvas._offset.top;\n\n return {\n left: `${p.x}px`,\n top: `${p.y}px`,\n fontSize: `${charHeight}px`,\n charHeight: charHeight,\n };\n }\n\n /**\n * @private\n */\n _saveEditingProps() {\n this._savedProps = {\n hasControls: this.hasControls,\n borderColor: this.borderColor,\n lockMovementX: this.lockMovementX,\n lockMovementY: this.lockMovementY,\n hoverCursor: this.hoverCursor,\n selectable: this.selectable,\n defaultCursor: this.canvas && this.canvas.defaultCursor,\n moveCursor: this.canvas && this.canvas.moveCursor,\n };\n }\n\n /**\n * @private\n */\n _restoreEditingProps() {\n if (!this._savedProps) {\n return;\n }\n\n this.hoverCursor = this._savedProps.hoverCursor;\n this.hasControls = this._savedProps.hasControls;\n this.borderColor = this._savedProps.borderColor;\n this.selectable = this._savedProps.selectable;\n this.lockMovementX = this._savedProps.lockMovementX;\n this.lockMovementY = this._savedProps.lockMovementY;\n\n if (this.canvas) {\n this.canvas.defaultCursor =\n this._savedProps.defaultCursor || this.canvas.defaultCursor;\n this.canvas.moveCursor =\n this._savedProps.moveCursor || this.canvas.moveCursor;\n }\n\n delete this._savedProps;\n }\n\n /**\n * runs the actual logic that exits from editing state, see {@link exitEditing}\n * But it does not fire events\n */\n exitEditingImpl() {\n const hiddenTextarea = this.hiddenTextarea;\n this.selected = false;\n this.isEditing = false;\n\n if (hiddenTextarea) {\n hiddenTextarea.blur && hiddenTextarea.blur();\n hiddenTextarea.parentNode &&\n hiddenTextarea.parentNode.removeChild(hiddenTextarea);\n }\n this.hiddenTextarea = null;\n this.abortCursorAnimation();\n this.selectionStart !== this.selectionEnd && this.clearContextTop();\n this.selectionEnd = this.selectionStart;\n this._restoreEditingProps();\n if (this._forceClearCache) {\n this.initDimensions();\n this.setCoords();\n }\n }\n\n /**\n * Exits from editing state and fires relevant events\n */\n exitEditing() {\n const isTextChanged = this._textBeforeEdit !== this.text;\n this.exitEditingImpl();\n\n this.fire('editing:exited');\n isTextChanged && this.fire(MODIFIED);\n if (this.canvas) {\n this.canvas.fire('text:editing:exited', {\n target: this as unknown as IText,\n });\n // todo: evaluate add an action to this event\n isTextChanged && this.canvas.fire('object:modified', { target: this });\n }\n return this;\n }\n\n /**\n * @private\n */\n _removeExtraneousStyles() {\n for (const prop in this.styles) {\n if (!this._textLines[prop as unknown as number]) {\n delete this.styles[prop];\n }\n }\n }\n\n /**\n * remove and reflow a style block from start to end.\n * @param {Number} start linear start position for removal (included in removal)\n * @param {Number} end linear end position for removal ( excluded from removal )\n */\n removeStyleFromTo(start: number, end: number) {\n const { lineIndex: lineStart, charIndex: charStart } =\n this.get2DCursorLocation(start, true),\n { lineIndex: lineEnd, charIndex: charEnd } = this.get2DCursorLocation(\n end,\n true,\n );\n if (lineStart !== lineEnd) {\n // step1 remove the trailing of lineStart\n if (this.styles[lineStart]) {\n for (\n let i = charStart;\n i < this._unwrappedTextLines[lineStart].length;\n i++\n ) {\n delete this.styles[lineStart][i];\n }\n }\n // step2 move the trailing of lineEnd to lineStart if needed\n if (this.styles[lineEnd]) {\n for (\n let i = charEnd;\n i < this._unwrappedTextLines[lineEnd].length;\n i++\n ) {\n const styleObj = this.styles[lineEnd][i];\n if (styleObj) {\n this.styles[lineStart] || (this.styles[lineStart] = {});\n this.styles[lineStart][charStart + i - charEnd] = styleObj;\n }\n }\n }\n // step3 detects lines will be completely removed.\n for (let i = lineStart + 1; i <= lineEnd; i++) {\n delete this.styles[i];\n }\n // step4 shift remaining lines.\n this.shiftLineStyles(lineEnd, lineStart - lineEnd);\n } else {\n // remove and shift left on the same line\n if (this.styles[lineStart]) {\n const styleObj = this.styles[lineStart];\n const diff = charEnd - charStart;\n for (let i = charStart; i < charEnd; i++) {\n delete styleObj[i];\n }\n for (const char in this.styles[lineStart]) {\n const numericChar = parseInt(char, 10);\n if (numericChar >= charEnd) {\n styleObj[numericChar - diff] = styleObj[char];\n delete styleObj[char];\n }\n }\n }\n }\n }\n\n /**\n * Shifts line styles up or down\n * @param {Number} lineIndex Index of a line\n * @param {Number} offset Can any number?\n */\n shiftLineStyles(lineIndex: number, offset: number) {\n const clonedStyles = Object.assign({}, this.styles);\n for (const line in this.styles) {\n const numericLine = parseInt(line, 10);\n if (numericLine > lineIndex) {\n this.styles[numericLine + offset] = clonedStyles[numericLine];\n if (!clonedStyles[numericLine - offset]) {\n delete this.styles[numericLine];\n }\n }\n }\n }\n\n /**\n * Handle insertion of more consecutive style lines for when one or more\n * newlines gets added to the text. Since current style needs to be shifted\n * first we shift the current style of the number lines needed, then we add\n * new lines from the last to the first.\n * @param {Number} lineIndex Index of a line\n * @param {Number} charIndex Index of a char\n * @param {Number} qty number of lines to add\n * @param {Array} copiedStyle Array of objects styles\n */\n insertNewlineStyleObject(\n lineIndex: number,\n charIndex: number,\n qty: number,\n copiedStyle?: { [index: number]: TextStyleDeclaration },\n ) {\n const newLineStyles: { [index: number]: TextStyleDeclaration } = {};\n const originalLineLength = this._unwrappedTextLines[lineIndex].length;\n const isEndOfLine = originalLineLength === charIndex;\n\n let someStyleIsCarryingOver = false;\n qty || (qty = 1);\n this.shiftLineStyles(lineIndex, qty);\n const currentCharStyle = this.styles[lineIndex]\n ? this.styles[lineIndex][charIndex === 0 ? charIndex : charIndex - 1]\n : undefined;\n\n // we clone styles of all chars\n // after cursor onto the current line\n for (const index in this.styles[lineIndex]) {\n const numIndex = parseInt(index, 10);\n if (numIndex >= charIndex) {\n someStyleIsCarryingOver = true;\n newLineStyles[numIndex - charIndex] = this.styles[lineIndex][index];\n // remove lines from the previous line since they're on a new line now\n if (!(isEndOfLine && charIndex === 0)) {\n delete this.styles[lineIndex][index];\n }\n }\n }\n let styleCarriedOver = false;\n if (someStyleIsCarryingOver && !isEndOfLine) {\n // if is end of line, the extra style we copied\n // is probably not something we want\n this.styles[lineIndex + qty] = newLineStyles;\n styleCarriedOver = true;\n }\n if (styleCarriedOver || originalLineLength > charIndex) {\n // skip the last line of since we already prepared it.\n // or contains text without style that we don't want to style\n // just because it changed lines\n qty--;\n }\n // for the all the lines or all the other lines\n // we clone current char style onto the next (otherwise empty) line\n while (qty > 0) {\n if (copiedStyle && copiedStyle[qty - 1]) {\n this.styles[lineIndex + qty] = {\n 0: { ...copiedStyle[qty - 1] },\n };\n } else if (currentCharStyle) {\n this.styles[lineIndex + qty] = {\n 0: { ...currentCharStyle },\n };\n } else {\n delete this.styles[lineIndex + qty];\n }\n qty--;\n }\n this._forceClearCache = true;\n }\n\n /**\n * Inserts style object for a given line/char index\n * @param {Number} lineIndex Index of a line\n * @param {Number} charIndex Index of a char\n * @param {Number} quantity number Style object to insert, if given\n * @param {Array} copiedStyle array of style objects\n */\n insertCharStyleObject(\n lineIndex: number,\n charIndex: number,\n quantity: number,\n copiedStyle?: TextStyleDeclaration[],\n ) {\n if (!this.styles) {\n this.styles = {};\n }\n const currentLineStyles = this.styles[lineIndex],\n currentLineStylesCloned = currentLineStyles\n ? { ...currentLineStyles }\n : {};\n\n quantity || (quantity = 1);\n // shift all char styles by quantity forward\n // 0,1,2,3 -> (charIndex=2) -> 0,1,3,4 -> (insert 2) -> 0,1,2,3,4\n for (const index in currentLineStylesCloned) {\n const numericIndex = parseInt(index, 10);\n if (numericIndex >= charIndex) {\n currentLineStyles[numericIndex + quantity] =\n currentLineStylesCloned[numericIndex];\n // only delete the style if there was nothing moved there\n if (!currentLineStylesCloned[numericIndex - quantity]) {\n delete currentLineStyles[numericIndex];\n }\n }\n }\n this._forceClearCache = true;\n if (copiedStyle) {\n while (quantity--) {\n if (!Object.keys(copiedStyle[quantity]).length) {\n continue;\n }\n if (!this.styles[lineIndex]) {\n this.styles[lineIndex] = {};\n }\n this.styles[lineIndex][charIndex + quantity] = {\n ...copiedStyle[quantity],\n };\n }\n return;\n }\n if (!currentLineStyles) {\n return;\n }\n const newStyle = currentLineStyles[charIndex ? charIndex - 1 : 1];\n while (newStyle && quantity--) {\n this.styles[lineIndex][charIndex + quantity] = { ...newStyle };\n }\n }\n\n /**\n * Inserts style object(s)\n * @param {Array} insertedText Characters at the location where style is inserted\n * @param {Number} start cursor index for inserting style\n * @param {Array} [copiedStyle] array of style objects to insert.\n */\n insertNewStyleBlock(\n insertedText: string[],\n start: number,\n copiedStyle?: TextStyleDeclaration[],\n ) {\n const cursorLoc = this.get2DCursorLocation(start, true),\n addedLines = [0];\n let linesLength = 0;\n // get an array of how many char per lines are being added.\n for (let i = 0; i < insertedText.length; i++) {\n if (insertedText[i] === '\\n') {\n linesLength++;\n addedLines[linesLength] = 0;\n } else {\n addedLines[linesLength]++;\n }\n }\n // for the first line copy the style from the current char position.\n if (addedLines[0] > 0) {\n this.insertCharStyleObject(\n cursorLoc.lineIndex,\n cursorLoc.charIndex,\n addedLines[0],\n copiedStyle,\n );\n copiedStyle = copiedStyle && copiedStyle.slice(addedLines[0] + 1);\n }\n linesLength &&\n this.insertNewlineStyleObject(\n cursorLoc.lineIndex,\n cursorLoc.charIndex + addedLines[0],\n linesLength,\n );\n let i;\n for (i = 1; i < linesLength; i++) {\n if (addedLines[i] > 0) {\n this.insertCharStyleObject(\n cursorLoc.lineIndex + i,\n 0,\n addedLines[i],\n copiedStyle,\n );\n } else if (copiedStyle) {\n // this test is required in order to close #6841\n // when a pasted buffer begins with a newline then\n // this.styles[cursorLoc.lineIndex + i] and copiedStyle[0]\n // may be undefined for some reason\n if (this.styles[cursorLoc.lineIndex + i] && copiedStyle[0]) {\n this.styles[cursorLoc.lineIndex + i][0] = copiedStyle[0];\n }\n }\n copiedStyle = copiedStyle && copiedStyle.slice(addedLines[i] + 1);\n }\n if (addedLines[i] > 0) {\n this.insertCharStyleObject(\n cursorLoc.lineIndex + i,\n 0,\n addedLines[i],\n copiedStyle,\n );\n }\n }\n\n /**\n * Removes characters from start/end\n * start/end ar per grapheme position in _text array.\n *\n * @param {Number} start\n * @param {Number} end default to start + 1\n */\n removeChars(start: number, end: number = start + 1) {\n this.removeStyleFromTo(start, end);\n this._text.splice(start, end - start);\n this.text = this._text.join('');\n this.set('dirty', true);\n this.initDimensions();\n this.setCoords();\n this._removeExtraneousStyles();\n }\n\n /**\n * insert characters at start position, before start position.\n * start equal 1 it means the text get inserted between actual grapheme 0 and 1\n * if style array is provided, it must be as the same length of text in graphemes\n * if end is provided and is bigger than start, old text is replaced.\n * start/end ar per grapheme position in _text array.\n *\n * @param {String} text text to insert\n * @param {Array} style array of style objects\n * @param {Number} start\n * @param {Number} end default to start + 1\n */\n insertChars(\n text: string,\n style: TextStyleDeclaration[] | undefined,\n start: number,\n end: number = start,\n ) {\n if (end > start) {\n this.removeStyleFromTo(start, end);\n }\n const graphemes = this.graphemeSplit(text);\n this.insertNewStyleBlock(graphemes, start, style);\n this._text = [\n ...this._text.slice(0, start),\n ...graphemes,\n ...this._text.slice(end),\n ];\n this.text = this._text.join('');\n this.set('dirty', true);\n this.initDimensions();\n this.setCoords();\n this._removeExtraneousStyles();\n }\n\n /**\n * Set the selectionStart and selectionEnd according to the new position of cursor\n * mimic the key - mouse navigation when shift is pressed.\n */\n setSelectionStartEndWithShift(\n start: number,\n end: number,\n newSelection: number,\n ) {\n if (newSelection <= start) {\n if (end === start) {\n this._selectionDirection = LEFT;\n } else if (this._selectionDirection === RIGHT) {\n this._selectionDirection = LEFT;\n this.selectionEnd = start;\n }\n this.selectionStart = newSelection;\n } else if (newSelection > start && newSelection < end) {\n if (this._selectionDirection === RIGHT) {\n this.selectionEnd = newSelection;\n } else {\n this.selectionStart = newSelection;\n }\n } else {\n // newSelection is > selection start and end\n if (end === start) {\n this._selectionDirection = RIGHT;\n } else if (this._selectionDirection === LEFT) {\n this._selectionDirection = RIGHT;\n this.selectionStart = end;\n }\n this.selectionEnd = newSelection;\n }\n }\n}\n","import { config } from '../../config';\nimport { getFabricDocument, getEnv } from '../../env';\nimport { capValue } from '../../util/misc/capValue';\nimport type { ITextEvents } from './ITextBehavior';\nimport { ITextBehavior } from './ITextBehavior';\nimport type { TKeyMapIText } from './constants';\nimport type { TOptions } from '../../typedefs';\nimport type { TextProps, SerializedTextProps } from '../Text/Text';\nimport { getDocumentFromElement } from '../../util/dom_misc';\nimport { CHANGED, LEFT, RIGHT } from '../../constants';\nimport type { IText } from './IText';\nimport type { TextStyleDeclaration } from '../Text/StyledText';\n\nexport abstract class ITextKeyBehavior<\n Props extends TOptions = Partial,\n SProps extends SerializedTextProps = SerializedTextProps,\n EventSpec extends ITextEvents = ITextEvents,\n> extends ITextBehavior {\n /**\n * For functionalities on keyDown\n * Map a special key to a function of the instance/prototype\n * If you need different behavior for ESC or TAB or arrows, you have to change\n * this map setting the name of a function that you build on the IText or\n * your prototype.\n * the map change will affect all Instances unless you need for only some text Instances\n * in that case you have to clone this object and assign your Instance.\n * this.keysMap = Object.assign({}, this.keysMap);\n * The function must be in IText.prototype.myFunction And will receive event as args[0]\n */\n declare keysMap: TKeyMapIText;\n\n declare keysMapRtl: TKeyMapIText;\n\n /**\n * For functionalities on keyUp + ctrl || cmd\n */\n declare ctrlKeysMapUp: TKeyMapIText;\n\n /**\n * For functionalities on keyDown + ctrl || cmd\n */\n declare ctrlKeysMapDown: TKeyMapIText;\n\n declare hiddenTextarea: HTMLTextAreaElement | null;\n\n /**\n * DOM container to append the hiddenTextarea.\n * An alternative to attaching to the document.body.\n * Useful to reduce laggish redraw of the full document.body tree and\n * also with modals event capturing that won't let the textarea take focus.\n * @type HTMLElement\n */\n declare hiddenTextareaContainer?: HTMLElement | null;\n\n declare private _clickHandlerInitialized: boolean;\n declare private _copyDone: boolean;\n declare private fromPaste: boolean;\n\n /**\n * Initializes hidden textarea (needed to bring up keyboard in iOS)\n */\n initHiddenTextarea() {\n const doc =\n (this.canvas && getDocumentFromElement(this.canvas.getElement())) ||\n getFabricDocument();\n const textarea = doc.createElement('textarea');\n Object.entries({\n autocapitalize: 'off',\n autocorrect: 'off',\n autocomplete: 'off',\n spellcheck: 'false',\n 'data-fabric': 'textarea',\n wrap: 'off',\n name: 'fabricTextarea',\n }).map(([attribute, value]) => textarea.setAttribute(attribute, value));\n const { top, left, fontSize } = this._calcTextareaPosition();\n // line-height: 1px; was removed from the style to fix this:\n // https://bugs.chromium.org/p/chromium/issues/detail?id=870966\n textarea.style.cssText = `position: absolute; top: ${top}; left: ${left}; z-index: -999; opacity: 0; width: 1px; height: 1px; font-size: 1px; padding-top: ${fontSize};`;\n\n (this.hiddenTextareaContainer || doc.body).appendChild(textarea);\n\n Object.entries({\n blur: 'blur',\n keydown: 'onKeyDown',\n keyup: 'onKeyUp',\n input: 'onInput',\n copy: 'copy',\n cut: 'copy',\n paste: 'paste',\n compositionstart: 'onCompositionStart',\n compositionupdate: 'onCompositionUpdate',\n compositionend: 'onCompositionEnd',\n } as Record).map(([eventName, handler]) =>\n textarea.addEventListener(\n eventName,\n (this[handler] as EventListener).bind(this),\n ),\n );\n this.hiddenTextarea = textarea;\n }\n\n /**\n * Override this method to customize cursor behavior on textbox blur\n */\n blur() {\n this.abortCursorAnimation();\n }\n\n /**\n * Handles keydown event\n * only used for arrows and combination of modifier keys.\n * @param {KeyboardEvent} e Event object\n */\n onKeyDown(e: KeyboardEvent) {\n if (!this.isEditing) {\n return;\n }\n const keyMap = this.direction === 'rtl' ? this.keysMapRtl : this.keysMap;\n if (e.keyCode in keyMap) {\n (this[keyMap[e.keyCode] as keyof this] as (arg: KeyboardEvent) => void)(\n e,\n );\n } else if (e.keyCode in this.ctrlKeysMapDown && (e.ctrlKey || e.metaKey)) {\n (\n this[this.ctrlKeysMapDown[e.keyCode] as keyof this] as (\n arg: KeyboardEvent,\n ) => void\n )(e);\n } else {\n return;\n }\n e.stopImmediatePropagation();\n e.preventDefault();\n if (e.keyCode >= 33 && e.keyCode <= 40) {\n // if i press an arrow key just update selection\n this.inCompositionMode = false;\n this.clearContextTop();\n this.renderCursorOrSelection();\n } else {\n this.canvas && this.canvas.requestRenderAll();\n }\n }\n\n /**\n * Handles keyup event\n * We handle KeyUp because ie11 and edge have difficulties copy/pasting\n * if a copy/cut event fired, keyup is dismissed\n * @param {KeyboardEvent} e Event object\n */\n onKeyUp(e: KeyboardEvent) {\n if (!this.isEditing || this._copyDone || this.inCompositionMode) {\n this._copyDone = false;\n return;\n }\n if (e.keyCode in this.ctrlKeysMapUp && (e.ctrlKey || e.metaKey)) {\n (\n this[this.ctrlKeysMapUp[e.keyCode] as keyof this] as (\n arg: KeyboardEvent,\n ) => void\n )(e);\n } else {\n return;\n }\n e.stopImmediatePropagation();\n e.preventDefault();\n this.canvas && this.canvas.requestRenderAll();\n }\n\n /**\n * Handles onInput event\n * @param {Event} e Event object\n */\n onInput(this: this & { hiddenTextarea: HTMLTextAreaElement }, e: Event) {\n const fromPaste = this.fromPaste;\n const { value, selectionStart, selectionEnd } = this.hiddenTextarea;\n this.fromPaste = false;\n e && e.stopPropagation();\n if (!this.isEditing) {\n return;\n }\n const updateAndFire = () => {\n this.updateFromTextArea();\n this.fire(CHANGED);\n if (this.canvas) {\n this.canvas.fire('text:changed', { target: this as unknown as IText });\n this.canvas.requestRenderAll();\n }\n };\n if (this.hiddenTextarea.value === '') {\n this.styles = {};\n updateAndFire();\n return;\n }\n // decisions about style changes.\n const nextText = this._splitTextIntoLines(value).graphemeText,\n charCount = this._text.length,\n nextCharCount = nextText.length,\n _selectionStart = this.selectionStart,\n _selectionEnd = this.selectionEnd,\n selection = _selectionStart !== _selectionEnd;\n let copiedStyle: TextStyleDeclaration[] | undefined,\n removedText,\n charDiff = nextCharCount - charCount,\n removeFrom,\n removeTo;\n\n const textareaSelection = this.fromStringToGraphemeSelection(\n selectionStart,\n selectionEnd,\n value,\n );\n const backDelete = _selectionStart > textareaSelection.selectionStart;\n\n if (selection) {\n removedText = this._text.slice(_selectionStart, _selectionEnd);\n charDiff += _selectionEnd - _selectionStart;\n } else if (nextCharCount < charCount) {\n if (backDelete) {\n removedText = this._text.slice(_selectionEnd + charDiff, _selectionEnd);\n } else {\n removedText = this._text.slice(\n _selectionStart,\n _selectionStart - charDiff,\n );\n }\n }\n const insertedText = nextText.slice(\n textareaSelection.selectionEnd - charDiff,\n textareaSelection.selectionEnd,\n );\n if (removedText && removedText.length) {\n if (insertedText.length) {\n // let's copy some style before deleting.\n // we want to copy the style before the cursor OR the style at the cursor if selection\n // is bigger than 0.\n copiedStyle = this.getSelectionStyles(\n _selectionStart,\n _selectionStart + 1,\n false,\n );\n // now duplicate the style one for each inserted text.\n copiedStyle = insertedText.map(\n () =>\n // this return an array of references, but that is fine since we are\n // copying the style later.\n copiedStyle![0],\n );\n }\n if (selection) {\n removeFrom = _selectionStart;\n removeTo = _selectionEnd;\n } else if (backDelete) {\n // detect differences between forwardDelete and backDelete\n removeFrom = _selectionEnd - removedText.length;\n removeTo = _selectionEnd;\n } else {\n removeFrom = _selectionEnd;\n removeTo = _selectionEnd + removedText.length;\n }\n this.removeStyleFromTo(removeFrom, removeTo);\n }\n if (insertedText.length) {\n const { copyPasteData } = getEnv();\n if (\n fromPaste &&\n insertedText.join('') === copyPasteData.copiedText &&\n !config.disableStyleCopyPaste\n ) {\n copiedStyle = copyPasteData.copiedTextStyle;\n }\n this.insertNewStyleBlock(insertedText, _selectionStart, copiedStyle);\n }\n updateAndFire();\n }\n\n /**\n * Composition start\n */\n onCompositionStart() {\n this.inCompositionMode = true;\n }\n\n /**\n * Composition end\n */\n onCompositionEnd() {\n this.inCompositionMode = false;\n }\n\n onCompositionUpdate({ target }: CompositionEvent) {\n const { selectionStart, selectionEnd } = target as HTMLTextAreaElement;\n this.compositionStart = selectionStart;\n this.compositionEnd = selectionEnd;\n this.updateTextareaPosition();\n }\n\n /**\n * Copies selected text\n */\n copy() {\n if (this.selectionStart === this.selectionEnd) {\n //do not cut-copy if no selection\n return;\n }\n const { copyPasteData } = getEnv();\n copyPasteData.copiedText = this.getSelectedText();\n if (!config.disableStyleCopyPaste) {\n copyPasteData.copiedTextStyle = this.getSelectionStyles(\n this.selectionStart,\n this.selectionEnd,\n true,\n );\n } else {\n copyPasteData.copiedTextStyle = undefined;\n }\n this._copyDone = true;\n }\n\n /**\n * Pastes text\n */\n paste() {\n this.fromPaste = true;\n }\n\n /**\n * Finds the width in pixels before the cursor on the same line\n * @private\n * @param {Number} lineIndex\n * @param {Number} charIndex\n * @return {Number} widthBeforeCursor width before cursor\n */\n _getWidthBeforeCursor(lineIndex: number, charIndex: number): number {\n let widthBeforeCursor = this._getLineLeftOffset(lineIndex),\n bound;\n\n if (charIndex > 0) {\n bound = this.__charBounds[lineIndex][charIndex - 1];\n widthBeforeCursor += bound.left + bound.width;\n }\n return widthBeforeCursor;\n }\n\n /**\n * Gets start offset of a selection\n * @param {KeyboardEvent} e Event object\n * @param {Boolean} isRight\n * @return {Number}\n */\n getDownCursorOffset(e: KeyboardEvent, isRight: boolean): number {\n const selectionProp = this._getSelectionForOffset(e, isRight),\n cursorLocation = this.get2DCursorLocation(selectionProp),\n lineIndex = cursorLocation.lineIndex;\n // if on last line, down cursor goes to end of line\n if (\n lineIndex === this._textLines.length - 1 ||\n e.metaKey ||\n e.keyCode === 34\n ) {\n // move to the end of a text\n return this._text.length - selectionProp;\n }\n const charIndex = cursorLocation.charIndex,\n widthBeforeCursor = this._getWidthBeforeCursor(lineIndex, charIndex),\n indexOnOtherLine = this._getIndexOnLine(lineIndex + 1, widthBeforeCursor),\n textAfterCursor = this._textLines[lineIndex].slice(charIndex);\n return (\n textAfterCursor.length +\n indexOnOtherLine +\n 1 +\n this.missingNewlineOffset(lineIndex)\n );\n }\n\n /**\n * private\n * Helps finding if the offset should be counted from Start or End\n * @param {KeyboardEvent} e Event object\n * @param {Boolean} isRight\n * @return {Number}\n */\n _getSelectionForOffset(e: KeyboardEvent, isRight: boolean): number {\n if (e.shiftKey && this.selectionStart !== this.selectionEnd && isRight) {\n return this.selectionEnd;\n } else {\n return this.selectionStart;\n }\n }\n\n /**\n * @param {KeyboardEvent} e Event object\n * @param {Boolean} isRight\n * @return {Number}\n */\n getUpCursorOffset(e: KeyboardEvent, isRight: boolean): number {\n const selectionProp = this._getSelectionForOffset(e, isRight),\n cursorLocation = this.get2DCursorLocation(selectionProp),\n lineIndex = cursorLocation.lineIndex;\n if (lineIndex === 0 || e.metaKey || e.keyCode === 33) {\n // if on first line, up cursor goes to start of line\n return -selectionProp;\n }\n const charIndex = cursorLocation.charIndex,\n widthBeforeCursor = this._getWidthBeforeCursor(lineIndex, charIndex),\n indexOnOtherLine = this._getIndexOnLine(lineIndex - 1, widthBeforeCursor),\n textBeforeCursor = this._textLines[lineIndex].slice(0, charIndex),\n missingNewlineOffset = this.missingNewlineOffset(lineIndex - 1);\n // return a negative offset\n return (\n -this._textLines[lineIndex - 1].length +\n indexOnOtherLine -\n textBeforeCursor.length +\n (1 - missingNewlineOffset)\n );\n }\n\n /**\n * for a given width it founds the matching character.\n * @private\n */\n _getIndexOnLine(lineIndex: number, width: number) {\n const line = this._textLines[lineIndex],\n lineLeftOffset = this._getLineLeftOffset(lineIndex);\n let widthOfCharsOnLine = lineLeftOffset,\n indexOnLine = 0,\n charWidth,\n foundMatch;\n\n for (let j = 0, jlen = line.length; j < jlen; j++) {\n charWidth = this.__charBounds[lineIndex][j].width;\n widthOfCharsOnLine += charWidth;\n if (widthOfCharsOnLine > width) {\n foundMatch = true;\n const leftEdge = widthOfCharsOnLine - charWidth,\n rightEdge = widthOfCharsOnLine,\n offsetFromLeftEdge = Math.abs(leftEdge - width),\n offsetFromRightEdge = Math.abs(rightEdge - width);\n\n indexOnLine = offsetFromRightEdge < offsetFromLeftEdge ? j : j - 1;\n break;\n }\n }\n\n // reached end\n if (!foundMatch) {\n indexOnLine = line.length - 1;\n }\n\n return indexOnLine;\n }\n\n /**\n * Moves cursor down\n * @param {KeyboardEvent} e Event object\n */\n moveCursorDown(e: KeyboardEvent) {\n if (\n this.selectionStart >= this._text.length &&\n this.selectionEnd >= this._text.length\n ) {\n return;\n }\n this._moveCursorUpOrDown('Down', e);\n }\n\n /**\n * Moves cursor up\n * @param {KeyboardEvent} e Event object\n */\n moveCursorUp(e: KeyboardEvent) {\n if (this.selectionStart === 0 && this.selectionEnd === 0) {\n return;\n }\n this._moveCursorUpOrDown('Up', e);\n }\n\n /**\n * Moves cursor up or down, fires the events\n * @param {String} direction 'Up' or 'Down'\n * @param {KeyboardEvent} e Event object\n */\n _moveCursorUpOrDown(direction: 'Up' | 'Down', e: KeyboardEvent) {\n const offset = this[`get${direction}CursorOffset`](\n e,\n this._selectionDirection === RIGHT,\n );\n if (e.shiftKey) {\n this.moveCursorWithShift(offset);\n } else {\n this.moveCursorWithoutShift(offset);\n }\n if (offset !== 0) {\n const max = this.text.length;\n this.selectionStart = capValue(0, this.selectionStart, max);\n this.selectionEnd = capValue(0, this.selectionEnd, max);\n // TODO fix: abort and init should be an alternative depending\n // on selectionStart/End being equal or different\n this.abortCursorAnimation();\n this.initDelayedCursor();\n this._fireSelectionChanged();\n this._updateTextarea();\n }\n }\n\n /**\n * Moves cursor with shift\n * @param {Number} offset\n */\n moveCursorWithShift(offset: number) {\n const newSelection =\n this._selectionDirection === LEFT\n ? this.selectionStart + offset\n : this.selectionEnd + offset;\n this.setSelectionStartEndWithShift(\n this.selectionStart,\n this.selectionEnd,\n newSelection,\n );\n return offset !== 0;\n }\n\n /**\n * Moves cursor up without shift\n * @param {Number} offset\n */\n moveCursorWithoutShift(offset: number) {\n if (offset < 0) {\n this.selectionStart += offset;\n this.selectionEnd = this.selectionStart;\n } else {\n this.selectionEnd += offset;\n this.selectionStart = this.selectionEnd;\n }\n return offset !== 0;\n }\n\n /**\n * Moves cursor left\n * @param {KeyboardEvent} e Event object\n */\n moveCursorLeft(e: KeyboardEvent) {\n if (this.selectionStart === 0 && this.selectionEnd === 0) {\n return;\n }\n this._moveCursorLeftOrRight('Left', e);\n }\n\n /**\n * @private\n * @return {Boolean} true if a change happened\n *\n * @todo refactor not to use method name composition\n */\n _move(\n e: KeyboardEvent,\n prop: 'selectionStart' | 'selectionEnd',\n direction: 'Left' | 'Right',\n ): boolean {\n let newValue: number | undefined;\n if (e.altKey) {\n newValue = this[`findWordBoundary${direction}`](this[prop]);\n } else if (e.metaKey || e.keyCode === 35 || e.keyCode === 36) {\n newValue = this[`findLineBoundary${direction}`](this[prop]);\n } else {\n this[prop] += direction === 'Left' ? -1 : 1;\n return true;\n }\n if (typeof newValue !== 'undefined' && this[prop] !== newValue) {\n this[prop] = newValue;\n return true;\n }\n return false;\n }\n\n /**\n * @private\n */\n _moveLeft(e: KeyboardEvent, prop: 'selectionStart' | 'selectionEnd') {\n return this._move(e, prop, 'Left');\n }\n\n /**\n * @private\n */\n _moveRight(e: KeyboardEvent, prop: 'selectionStart' | 'selectionEnd') {\n return this._move(e, prop, 'Right');\n }\n\n /**\n * Moves cursor left without keeping selection\n * @param {KeyboardEvent} e\n */\n moveCursorLeftWithoutShift(e: KeyboardEvent) {\n let change = true;\n this._selectionDirection = LEFT;\n\n // only move cursor when there is no selection,\n // otherwise we discard it, and leave cursor on same place\n if (\n this.selectionEnd === this.selectionStart &&\n this.selectionStart !== 0\n ) {\n change = this._moveLeft(e, 'selectionStart');\n }\n this.selectionEnd = this.selectionStart;\n return change;\n }\n\n /**\n * Moves cursor left while keeping selection\n * @param {KeyboardEvent} e\n */\n moveCursorLeftWithShift(e: KeyboardEvent) {\n if (\n this._selectionDirection === RIGHT &&\n this.selectionStart !== this.selectionEnd\n ) {\n return this._moveLeft(e, 'selectionEnd');\n } else if (this.selectionStart !== 0) {\n this._selectionDirection = LEFT;\n return this._moveLeft(e, 'selectionStart');\n }\n }\n\n /**\n * Moves cursor right\n * @param {KeyboardEvent} e Event object\n */\n moveCursorRight(e: KeyboardEvent) {\n if (\n this.selectionStart >= this._text.length &&\n this.selectionEnd >= this._text.length\n ) {\n return;\n }\n this._moveCursorLeftOrRight('Right', e);\n }\n\n /**\n * Moves cursor right or Left, fires event\n * @param {String} direction 'Left', 'Right'\n * @param {KeyboardEvent} e Event object\n */\n _moveCursorLeftOrRight(direction: 'Left' | 'Right', e: KeyboardEvent) {\n const actionName = `moveCursor${direction}${\n e.shiftKey ? 'WithShift' : 'WithoutShift'\n }` as const;\n this._currentCursorOpacity = 1;\n if (this[actionName](e)) {\n // TODO fix: abort and init should be an alternative depending\n // on selectionStart/End being equal or different\n this.abortCursorAnimation();\n this.initDelayedCursor();\n this._fireSelectionChanged();\n this._updateTextarea();\n }\n }\n\n /**\n * Moves cursor right while keeping selection\n * @param {KeyboardEvent} e\n */\n moveCursorRightWithShift(e: KeyboardEvent) {\n if (\n this._selectionDirection === LEFT &&\n this.selectionStart !== this.selectionEnd\n ) {\n return this._moveRight(e, 'selectionStart');\n } else if (this.selectionEnd !== this._text.length) {\n this._selectionDirection = RIGHT;\n return this._moveRight(e, 'selectionEnd');\n }\n }\n\n /**\n * Moves cursor right without keeping selection\n * @param {KeyboardEvent} e Event object\n */\n moveCursorRightWithoutShift(e: KeyboardEvent) {\n let changed = true;\n this._selectionDirection = RIGHT;\n\n if (this.selectionStart === this.selectionEnd) {\n changed = this._moveRight(e, 'selectionStart');\n this.selectionEnd = this.selectionStart;\n } else {\n this.selectionStart = this.selectionEnd;\n }\n return changed;\n }\n}\n","import type {\n ObjectPointerEvents,\n TPointerEvent,\n TPointerEventInfo,\n} from '../../EventTypeDefs';\nimport { Point } from '../../Point';\nimport { invertTransform } from '../../util/misc/matrix';\nimport { DraggableTextDelegate } from './DraggableTextDelegate';\nimport type { ITextEvents } from './ITextBehavior';\nimport { ITextKeyBehavior } from './ITextKeyBehavior';\nimport type { TOptions } from '../../typedefs';\nimport type { TextProps, SerializedTextProps } from '../Text/Text';\nimport type { IText } from './IText';\n/**\n * `LEFT_CLICK === 0`\n */\nconst notALeftClick = (e: Event) => !!(e as MouseEvent).button;\n\nexport abstract class ITextClickBehavior<\n Props extends TOptions = Partial,\n SProps extends SerializedTextProps = SerializedTextProps,\n EventSpec extends ITextEvents = ITextEvents,\n> extends ITextKeyBehavior {\n protected draggableTextDelegate: DraggableTextDelegate;\n\n initBehavior() {\n // Initializes event handlers related to cursor or selection\n this.on('mousedown', this._mouseDownHandler);\n this.on('mouseup', this.mouseUpHandler);\n this.on('mousedblclick', this.doubleClickHandler);\n this.on('mousetripleclick', this.tripleClickHandler);\n\n this.draggableTextDelegate = new DraggableTextDelegate(\n this as unknown as IText,\n );\n\n super.initBehavior();\n }\n\n /**\n * If this method returns true a mouse move operation over a text selection\n * will not prevent the native mouse event allowing the browser to start a drag operation.\n * shouldStartDragging can be read 'do not prevent default for mouse move event'\n * To prevent drag and drop between objects both shouldStartDragging and onDragStart should return false\n * @returns\n */\n shouldStartDragging() {\n return this.draggableTextDelegate.isActive();\n }\n\n /**\n * @public override this method to control whether instance should/shouldn't become a drag source,\n * @see also {@link DraggableTextDelegate#isActive}\n * To prevent drag and drop between objects both shouldStartDragging and onDragStart should return false\n * @returns {boolean} should handle event\n */\n onDragStart(e: DragEvent) {\n return this.draggableTextDelegate.onDragStart(e);\n }\n\n /**\n * @public override this method to control whether instance should/shouldn't become a drop target\n */\n canDrop(e: DragEvent) {\n return this.draggableTextDelegate.canDrop(e);\n }\n\n /**\n * Default handler for double click, select a word\n */\n doubleClickHandler(options: TPointerEventInfo) {\n if (!this.isEditing) {\n return;\n }\n this.selectWord(this.getSelectionStartFromPointer(options.e));\n this.renderCursorOrSelection();\n }\n\n /**\n * Default handler for triple click, select a line\n */\n tripleClickHandler(options: TPointerEventInfo) {\n if (!this.isEditing) {\n return;\n }\n this.selectLine(this.getSelectionStartFromPointer(options.e));\n this.renderCursorOrSelection();\n }\n\n /**\n * Default event handler for the basic functionalities needed on _mouseDown\n * can be overridden to do something different.\n * Scope of this implementation is: find the click position, set selectionStart\n * find selectionEnd, initialize the drawing of either cursor or selection area\n * initializing a mousedDown on a text area will cancel fabricjs knowledge of\n * current compositionMode. It will be set to false.\n */\n _mouseDownHandler({ e, alreadySelected }: ObjectPointerEvents['mousedown']) {\n if (\n !this.canvas ||\n !this.editable ||\n notALeftClick(e) ||\n this.getActiveControl()\n ) {\n return;\n }\n\n if (this.draggableTextDelegate.start(e)) {\n return;\n }\n\n this.canvas.textEditingManager.register(this);\n\n if (alreadySelected) {\n this.inCompositionMode = false;\n this.setCursorByClick(e);\n }\n\n if (this.isEditing) {\n this.__selectionStartOnMouseDown = this.selectionStart;\n if (this.selectionStart === this.selectionEnd) {\n this.abortCursorAnimation();\n }\n this.renderCursorOrSelection();\n }\n this.selected ||= alreadySelected || this.isEditing;\n }\n\n /**\n * standard handler for mouse up, overridable\n * @private\n */\n mouseUpHandler({ e, transform }: ObjectPointerEvents['mouseup']) {\n const didDrag = this.draggableTextDelegate.end(e);\n\n if (this.canvas) {\n this.canvas.textEditingManager.unregister(this);\n\n const activeObject = this.canvas._activeObject;\n if (activeObject && activeObject !== this) {\n // avoid running this logic when there is an active object\n // this because is possible with shift click and fast clicks,\n // to rapidly deselect and reselect this object and trigger an enterEdit\n return;\n }\n }\n\n if (\n !this.editable ||\n (this.group && !this.group.interactive) ||\n (transform && transform.actionPerformed) ||\n notALeftClick(e) ||\n didDrag\n ) {\n return;\n }\n\n if (this.selected && !this.getActiveControl()) {\n this.enterEditing(e);\n if (this.selectionStart === this.selectionEnd) {\n this.initDelayedCursor(true);\n } else {\n this.renderCursorOrSelection();\n }\n }\n }\n\n /**\n * Changes cursor location in a text depending on passed pointer (x/y) object\n * @param {TPointerEvent} e Event object\n */\n setCursorByClick(e: TPointerEvent) {\n const newSelection = this.getSelectionStartFromPointer(e),\n start = this.selectionStart,\n end = this.selectionEnd;\n if (e.shiftKey) {\n this.setSelectionStartEndWithShift(start, end, newSelection);\n } else {\n this.selectionStart = newSelection;\n this.selectionEnd = newSelection;\n }\n if (this.isEditing) {\n this._fireSelectionChanged();\n this._updateTextarea();\n }\n }\n\n /**\n * Returns index of a character corresponding to where an object was clicked\n * @param {TPointerEvent} e Event object\n * @return {Number} Index of a character\n */\n getSelectionStartFromPointer(e: TPointerEvent): number {\n const mouseOffset = this.canvas!.getScenePoint(e)\n .transform(invertTransform(this.calcTransformMatrix()))\n .add(new Point(-this._getLeftOffset(), -this._getTopOffset()));\n let height = 0,\n charIndex = 0,\n lineIndex = 0;\n\n for (let i = 0; i < this._textLines.length; i++) {\n if (height <= mouseOffset.y) {\n height += this.getHeightOfLine(i);\n lineIndex = i;\n if (i > 0) {\n charIndex +=\n this._textLines[i - 1].length + this.missingNewlineOffset(i - 1);\n }\n } else {\n break;\n }\n }\n const lineLeftOffset = Math.abs(this._getLineLeftOffset(lineIndex));\n let width = lineLeftOffset;\n const charLength = this._textLines[lineIndex].length;\n const chars = this.__charBounds[lineIndex];\n for (let j = 0; j < charLength; j++) {\n // i removed something about flipX here, check.\n const charWidth = chars[j].kernedWidth;\n const widthAfter = width + charWidth;\n if (mouseOffset.x <= widthAfter) {\n // if the pointer is closer to the end of the char we increment charIndex\n // in order to position the cursor after the char\n if (\n Math.abs(mouseOffset.x - widthAfter) <=\n Math.abs(mouseOffset.x - width)\n ) {\n charIndex++;\n }\n break;\n }\n width = widthAfter;\n charIndex++;\n }\n\n return Math.min(\n // if object is horizontally flipped, mirror cursor location from the end\n this.flipX ? charLength - charIndex : charIndex,\n this._text.length,\n );\n }\n}\n","export type TKeyMapIText = Record<\n KeyboardEvent['keyCode'],\n CursorHandlingMethods\n>;\n\nexport type CursorHandlingMethods =\n | 'moveCursorUp'\n | 'moveCursorDown'\n | 'moveCursorLeft'\n | 'moveCursorRight'\n | 'exitEditing'\n | 'copy'\n | 'cut'\n | 'cmdAll';\n\nconst MOVE_CURSOR_UP: CursorHandlingMethods = 'moveCursorUp';\nconst MOVE_CURSOR_DOWN: CursorHandlingMethods = 'moveCursorDown';\nconst MOVE_CURSOR_LEFT: CursorHandlingMethods = 'moveCursorLeft';\nconst MOVE_CURSOR_RIGHT: CursorHandlingMethods = 'moveCursorRight';\nconst EXIT_EDITING: CursorHandlingMethods = 'exitEditing';\n\n// @TODO look into import { Key } from 'ts-key-enum';\n// and transition from keyCode to Key\n// also reduce string duplication\nexport const keysMap: TKeyMapIText = {\n 9: EXIT_EDITING,\n 27: EXIT_EDITING,\n 33: MOVE_CURSOR_UP,\n 34: MOVE_CURSOR_DOWN,\n 35: MOVE_CURSOR_RIGHT,\n 36: MOVE_CURSOR_LEFT,\n 37: MOVE_CURSOR_LEFT,\n 38: MOVE_CURSOR_UP,\n 39: MOVE_CURSOR_RIGHT,\n 40: MOVE_CURSOR_DOWN,\n};\n\nexport const keysMapRtl: TKeyMapIText = {\n 9: EXIT_EDITING,\n 27: EXIT_EDITING,\n 33: MOVE_CURSOR_UP,\n 34: MOVE_CURSOR_DOWN,\n 35: MOVE_CURSOR_LEFT,\n 36: MOVE_CURSOR_RIGHT,\n 37: MOVE_CURSOR_RIGHT,\n 38: MOVE_CURSOR_UP,\n 39: MOVE_CURSOR_LEFT,\n 40: MOVE_CURSOR_DOWN,\n};\n\n/**\n * For functionalities on keyUp + ctrl || cmd\n */\nexport const ctrlKeysMapUp: TKeyMapIText = {\n 67: 'copy',\n // there was a reason this wasn't deleted. for now leave it here\n 88: 'cut',\n};\n\n/**\n * For functionalities on keyDown + ctrl || cmd\n */\nexport const ctrlKeysMapDown: TKeyMapIText = {\n 65: 'cmdAll',\n};\n","import type { StaticCanvas } from '../../canvas/StaticCanvas';\n\n/**\n * Set the transform of the passed context to the same of a specific Canvas or StaticCanvas.\n * setTransform is used since this utility will RESET the ctx transform to the basic value\n * of retina scaling and viewport transform\n * It is not meant to be added to other transforms, it is used internally to preapre canvases to draw\n * @param ctx\n * @param canvas\n */\nexport const applyCanvasTransform = (\n ctx: CanvasRenderingContext2D,\n canvas: StaticCanvas,\n) => {\n const scale = canvas.getRetinaScaling();\n ctx.setTransform(scale, 0, 0, scale, 0, 0);\n const v = canvas.viewportTransform;\n ctx.transform(v[0], v[1], v[2], v[3], v[4], v[5]);\n};\n","import { Canvas } from '../../canvas/Canvas';\nimport type { ITextEvents } from './ITextBehavior';\nimport { ITextClickBehavior } from './ITextClickBehavior';\nimport {\n ctrlKeysMapDown,\n ctrlKeysMapUp,\n keysMap,\n keysMapRtl,\n} from './constants';\nimport type { TClassProperties, TFiller, TOptions } from '../../typedefs';\nimport { classRegistry } from '../../ClassRegistry';\nimport type { SerializedTextProps, TextProps } from '../Text/Text';\nimport {\n JUSTIFY,\n JUSTIFY_CENTER,\n JUSTIFY_LEFT,\n JUSTIFY_RIGHT,\n} from '../Text/constants';\nimport { CENTER, FILL, LEFT, RIGHT } from '../../constants';\nimport type { ObjectToCanvasElementOptions } from '../Object/Object';\nimport type { FabricObject } from '../Object/FabricObject';\nimport { createCanvasElementFor } from '../../util/misc/dom';\nimport { applyCanvasTransform } from '../../util/internals/applyCanvasTransform';\n\nexport type CursorBoundaries = {\n left: number;\n top: number;\n leftOffset: number;\n topOffset: number;\n};\n\nexport type CursorRenderingData = {\n color: string;\n opacity: number;\n left: number;\n top: number;\n width: number;\n height: number;\n};\n\n// Declare IText protected properties to workaround TS\nconst protectedDefaultValues = {\n _selectionDirection: null,\n _reSpace: /\\s|\\r?\\n/,\n inCompositionMode: false,\n};\n\nexport const iTextDefaultValues: Partial> = {\n selectionStart: 0,\n selectionEnd: 0,\n selectionColor: 'rgba(17,119,255,0.3)',\n isEditing: false,\n editable: true,\n editingBorderColor: 'rgba(102,153,255,0.25)',\n cursorWidth: 2,\n cursorColor: '',\n cursorDelay: 1000,\n cursorDuration: 600,\n caching: true,\n hiddenTextareaContainer: null,\n keysMap,\n keysMapRtl,\n ctrlKeysMapDown,\n ctrlKeysMapUp,\n ...protectedDefaultValues,\n};\n\n// @TODO this is not complete\ninterface UniqueITextProps {\n selectionStart: number;\n selectionEnd: number;\n}\n\nexport interface SerializedITextProps\n extends SerializedTextProps,\n UniqueITextProps {}\n\nexport interface ITextProps extends TextProps, UniqueITextProps {}\n\n/**\n * @fires changed\n * @fires selection:changed\n * @fires editing:entered\n * @fires editing:exited\n * @fires dragstart\n * @fires drag drag event firing on the drag source\n * @fires dragend\n * @fires copy\n * @fires cut\n * @fires paste\n *\n * #### Supported key combinations\n * ```\n * Move cursor: left, right, up, down\n * Select character: shift + left, shift + right\n * Select text vertically: shift + up, shift + down\n * Move cursor by word: alt + left, alt + right\n * Select words: shift + alt + left, shift + alt + right\n * Move cursor to line start/end: cmd + left, cmd + right or home, end\n * Select till start/end of line: cmd + shift + left, cmd + shift + right or shift + home, shift + end\n * Jump to start/end of text: cmd + up, cmd + down\n * Select till start/end of text: cmd + shift + up, cmd + shift + down or shift + pgUp, shift + pgDown\n * Delete character: backspace\n * Delete word: alt + backspace\n * Delete line: cmd + backspace\n * Forward delete: delete\n * Copy text: ctrl/cmd + c\n * Paste text: ctrl/cmd + v\n * Cut text: ctrl/cmd + x\n * Select entire text: ctrl/cmd + a\n * Quit editing tab or esc\n * ```\n *\n * #### Supported mouse/touch combination\n * ```\n * Position cursor: click/touch\n * Create selection: click/touch & drag\n * Create selection: click & shift + click\n * Select word: double click\n * Select line: triple click\n * ```\n */\nexport class IText<\n Props extends TOptions = Partial,\n SProps extends SerializedITextProps = SerializedITextProps,\n EventSpec extends ITextEvents = ITextEvents,\n >\n extends ITextClickBehavior\n implements UniqueITextProps\n{\n /**\n * Index where text selection starts (or where cursor is when there is no selection)\n * @type Number\n */\n declare selectionStart: number;\n\n /**\n * Index where text selection ends\n * @type Number\n */\n declare selectionEnd: number;\n\n declare compositionStart: number;\n\n declare compositionEnd: number;\n\n /**\n * Color of text selection\n * @type String\n */\n declare selectionColor: string;\n\n /**\n * Indicates whether text is in editing mode\n * @type Boolean\n */\n declare isEditing: boolean;\n\n /**\n * Indicates whether a text can be edited\n * @type Boolean\n */\n declare editable: boolean;\n\n /**\n * Border color of text object while it's in editing mode\n * @type String\n */\n declare editingBorderColor: string;\n\n /**\n * Width of cursor (in px)\n * @type Number\n */\n declare cursorWidth: number;\n\n /**\n * Color of text cursor color in editing mode.\n * if not set (default) will take color from the text.\n * if set to a color value that fabric can understand, it will\n * be used instead of the color of the text at the current position.\n * @type String\n */\n declare cursorColor: string;\n\n /**\n * Delay between cursor blink (in ms)\n * @type Number\n */\n declare cursorDelay: number;\n\n /**\n * Duration of cursor fade in (in ms)\n * @type Number\n */\n declare cursorDuration: number;\n\n declare compositionColor: string;\n\n /**\n * Indicates whether internal text char widths can be cached\n * @type Boolean\n */\n declare caching: boolean;\n\n static ownDefaults = iTextDefaultValues;\n\n static getDefaults(): Record {\n return { ...super.getDefaults(), ...IText.ownDefaults };\n }\n\n static type = 'IText';\n\n get type() {\n const type = super.type;\n // backward compatibility\n return type === 'itext' ? 'i-text' : type;\n }\n\n /**\n * Constructor\n * @param {String} text Text string\n * @param {Object} [options] Options object\n */\n constructor(text: string, options?: Props) {\n super(text, { ...IText.ownDefaults, ...options } as Props);\n this.initBehavior();\n }\n\n /**\n * While editing handle differently\n * @private\n * @param {string} key\n * @param {*} value\n */\n _set(key: string, value: any) {\n if (this.isEditing && this._savedProps && key in this._savedProps) {\n // @ts-expect-error irritating TS\n this._savedProps[key] = value;\n return this;\n }\n if (key === 'canvas') {\n this.canvas instanceof Canvas &&\n this.canvas.textEditingManager.remove(this);\n value instanceof Canvas && value.textEditingManager.add(this);\n }\n return super._set(key, value);\n }\n\n /**\n * Sets selection start (left boundary of a selection)\n * @param {Number} index Index to set selection start to\n */\n setSelectionStart(index: number) {\n index = Math.max(index, 0);\n this._updateAndFire('selectionStart', index);\n }\n\n /**\n * Sets selection end (right boundary of a selection)\n * @param {Number} index Index to set selection end to\n */\n setSelectionEnd(index: number) {\n index = Math.min(index, this.text.length);\n this._updateAndFire('selectionEnd', index);\n }\n\n /**\n * @private\n * @param {String} property 'selectionStart' or 'selectionEnd'\n * @param {Number} index new position of property\n */\n protected _updateAndFire(\n property: 'selectionStart' | 'selectionEnd',\n index: number,\n ) {\n if (this[property] !== index) {\n this._fireSelectionChanged();\n this[property] = index;\n }\n this._updateTextarea();\n }\n\n /**\n * Fires the even of selection changed\n * @private\n */\n _fireSelectionChanged() {\n this.fire('selection:changed');\n this.canvas && this.canvas.fire('text:selection:changed', { target: this });\n }\n\n /**\n * Initialize text dimensions. Render all text on given context\n * or on a offscreen canvas to get the text width with measureText.\n * Updates this.width and this.height with the proper values.\n * Does not return dimensions.\n * @private\n */\n initDimensions() {\n this.isEditing && this.initDelayedCursor();\n super.initDimensions();\n }\n\n /**\n * Gets style of a current selection/cursor (at the start position)\n * if startIndex or endIndex are not provided, selectionStart or selectionEnd will be used.\n * @param {Number} startIndex Start index to get styles at\n * @param {Number} endIndex End index to get styles at, if not specified selectionEnd or startIndex + 1\n * @param {Boolean} [complete] get full style or not\n * @return {Array} styles an array with one, zero or more Style objects\n */\n getSelectionStyles(\n startIndex: number = this.selectionStart || 0,\n endIndex: number = this.selectionEnd,\n complete?: boolean,\n ) {\n return super.getSelectionStyles(startIndex, endIndex, complete);\n }\n\n /**\n * Sets style of a current selection, if no selection exist, do not set anything.\n * @param {Object} [styles] Styles object\n * @param {Number} [startIndex] Start index to get styles at\n * @param {Number} [endIndex] End index to get styles at, if not specified selectionEnd or startIndex + 1\n */\n setSelectionStyles(\n styles: object,\n startIndex: number = this.selectionStart || 0,\n endIndex: number = this.selectionEnd,\n ) {\n return super.setSelectionStyles(styles, startIndex, endIndex);\n }\n\n /**\n * Returns 2d representation (lineIndex and charIndex) of cursor (or selection start)\n * @param {Number} [selectionStart] Optional index. When not given, current selectionStart is used.\n * @param {Boolean} [skipWrapping] consider the location for unwrapped lines. useful to manage styles.\n */\n get2DCursorLocation(\n selectionStart = this.selectionStart,\n skipWrapping?: boolean,\n ) {\n return super.get2DCursorLocation(selectionStart, skipWrapping);\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n render(ctx: CanvasRenderingContext2D) {\n super.render(ctx);\n // clear the cursorOffsetCache, so we ensure to calculate once per renderCursor\n // the correct position but not at every cursor animation.\n this.cursorOffsetCache = {};\n this.renderCursorOrSelection();\n }\n\n /**\n * @override block cursor/selection logic while rendering the exported canvas\n * @todo this workaround should be replaced with a more robust solution\n */\n toCanvasElement(options?: ObjectToCanvasElementOptions): HTMLCanvasElement {\n const isEditing = this.isEditing;\n this.isEditing = false;\n const canvas = super.toCanvasElement(options);\n this.isEditing = isEditing;\n return canvas;\n }\n\n /**\n * Renders cursor or selection (depending on what exists)\n * it does on the contextTop. If contextTop is not available, do nothing.\n */\n renderCursorOrSelection() {\n if (!this.isEditing || !this.canvas) {\n return;\n }\n const ctx = this.clearContextTop(true);\n if (!ctx) {\n return;\n }\n const boundaries = this._getCursorBoundaries();\n\n const ancestors = this.findAncestorsWithClipPath();\n const hasAncestorsWithClipping = ancestors.length > 0;\n let drawingCtx: CanvasRenderingContext2D = ctx;\n let drawingCanvas: HTMLCanvasElement | undefined = undefined;\n if (hasAncestorsWithClipping) {\n // we have some clipPath, we need to draw the selection on an intermediate layer.\n drawingCanvas = createCanvasElementFor(ctx.canvas);\n drawingCtx = drawingCanvas.getContext('2d')!;\n applyCanvasTransform(drawingCtx, this.canvas);\n const m = this.calcTransformMatrix();\n drawingCtx.transform(m[0], m[1], m[2], m[3], m[4], m[5]);\n }\n\n if (this.selectionStart === this.selectionEnd && !this.inCompositionMode) {\n this.renderCursor(drawingCtx, boundaries);\n } else {\n this.renderSelection(drawingCtx, boundaries);\n }\n\n if (hasAncestorsWithClipping) {\n // we need a neutral context.\n // this won't work for nested clippaths in which a clippath\n // has its own clippath\n for (const ancestor of ancestors) {\n const clipPath = ancestor.clipPath!;\n const clippingCanvas = createCanvasElementFor(ctx.canvas);\n const clippingCtx = clippingCanvas.getContext('2d')!;\n applyCanvasTransform(clippingCtx, this.canvas);\n // position the ctx in the center of the outer ancestor\n if (!clipPath.absolutePositioned) {\n const m = ancestor.calcTransformMatrix();\n clippingCtx.transform(m[0], m[1], m[2], m[3], m[4], m[5]);\n }\n clipPath.transform(clippingCtx);\n // we assign an empty drawing context, we don't plan to have this working for nested clippaths for now\n clipPath.drawObject(clippingCtx, true, {});\n this.drawClipPathOnCache(drawingCtx, clipPath, clippingCanvas);\n }\n }\n\n if (hasAncestorsWithClipping) {\n ctx.setTransform(1, 0, 0, 1, 0, 0);\n ctx.drawImage(drawingCanvas!, 0, 0);\n }\n\n this.canvas.contextTopDirty = true;\n ctx.restore();\n }\n\n /**\n * Finds and returns an array of clip paths that are applied to the parent\n * group(s) of the current FabricObject instance. The object's hierarchy is\n * traversed upwards (from the current object towards the root of the canvas),\n * checking each parent object for the presence of a `clipPath` that is not\n * absolutely positioned.\n */\n findAncestorsWithClipPath(): FabricObject[] {\n const clipPathAncestors: FabricObject[] = [];\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n let obj: FabricObject | undefined = this;\n while (obj) {\n if (obj.clipPath) {\n clipPathAncestors.push(obj);\n }\n obj = obj.parent;\n }\n\n return clipPathAncestors;\n }\n\n /**\n * Returns cursor boundaries (left, top, leftOffset, topOffset)\n * left/top are left/top of entire text box\n * leftOffset/topOffset are offset from that left/top point of a text box\n * @private\n * @param {number} [index] index from start\n * @param {boolean} [skipCaching]\n */\n _getCursorBoundaries(\n index: number = this.selectionStart,\n skipCaching?: boolean,\n ): CursorBoundaries {\n const left = this._getLeftOffset(),\n top = this._getTopOffset(),\n offsets = this._getCursorBoundariesOffsets(index, skipCaching);\n return {\n left: left,\n top: top,\n leftOffset: offsets.left,\n topOffset: offsets.top,\n };\n }\n\n /**\n * Caches and returns cursor left/top offset relative to instance's center point\n * @private\n * @param {number} index index from start\n * @param {boolean} [skipCaching]\n */\n _getCursorBoundariesOffsets(\n index: number,\n skipCaching?: boolean,\n ): { left: number; top: number } {\n if (skipCaching) {\n return this.__getCursorBoundariesOffsets(index);\n }\n if (this.cursorOffsetCache && 'top' in this.cursorOffsetCache) {\n return this.cursorOffsetCache as { left: number; top: number };\n }\n return (this.cursorOffsetCache = this.__getCursorBoundariesOffsets(index));\n }\n\n /**\n * Calculates cursor left/top offset relative to instance's center point\n * @private\n * @param {number} index index from start\n */\n __getCursorBoundariesOffsets(index: number) {\n let topOffset = 0,\n leftOffset = 0;\n const { charIndex, lineIndex } = this.get2DCursorLocation(index);\n\n for (let i = 0; i < lineIndex; i++) {\n topOffset += this.getHeightOfLine(i);\n }\n const lineLeftOffset = this._getLineLeftOffset(lineIndex);\n const bound = this.__charBounds[lineIndex][charIndex];\n bound && (leftOffset = bound.left);\n if (\n this.charSpacing !== 0 &&\n charIndex === this._textLines[lineIndex].length\n ) {\n leftOffset -= this._getWidthOfCharSpacing();\n }\n const boundaries = {\n top: topOffset,\n left: lineLeftOffset + (leftOffset > 0 ? leftOffset : 0),\n };\n if (this.direction === 'rtl') {\n if (\n this.textAlign === RIGHT ||\n this.textAlign === JUSTIFY ||\n this.textAlign === JUSTIFY_RIGHT\n ) {\n boundaries.left *= -1;\n } else if (this.textAlign === LEFT || this.textAlign === JUSTIFY_LEFT) {\n boundaries.left = lineLeftOffset - (leftOffset > 0 ? leftOffset : 0);\n } else if (\n this.textAlign === CENTER ||\n this.textAlign === JUSTIFY_CENTER\n ) {\n boundaries.left = lineLeftOffset - (leftOffset > 0 ? leftOffset : 0);\n }\n }\n return boundaries;\n }\n\n /**\n * Renders cursor on context Top, outside the animation cycle, on request\n * Used for the drag/drop effect.\n * If contextTop is not available, do nothing.\n */\n renderCursorAt(selectionStart: number) {\n this._renderCursor(\n this.canvas!.contextTop,\n this._getCursorBoundaries(selectionStart, true),\n selectionStart,\n );\n }\n\n /**\n * Renders cursor\n * @param {Object} boundaries\n * @param {CanvasRenderingContext2D} ctx transformed context to draw on\n */\n renderCursor(ctx: CanvasRenderingContext2D, boundaries: CursorBoundaries) {\n this._renderCursor(ctx, boundaries, this.selectionStart);\n }\n\n /**\n * Return the data needed to render the cursor for given selection start\n * The left,top are relative to the object, while width and height are prescaled\n * to look think with canvas zoom and object scaling,\n * so they depend on canvas and object scaling\n */\n getCursorRenderingData(\n selectionStart: number = this.selectionStart,\n boundaries: CursorBoundaries = this._getCursorBoundaries(selectionStart),\n ): CursorRenderingData {\n const cursorLocation = this.get2DCursorLocation(selectionStart),\n lineIndex = cursorLocation.lineIndex,\n charIndex =\n cursorLocation.charIndex > 0 ? cursorLocation.charIndex - 1 : 0,\n charHeight = this.getValueOfPropertyAt(lineIndex, charIndex, 'fontSize'),\n multiplier = this.getObjectScaling().x * this.canvas!.getZoom(),\n cursorWidth = this.cursorWidth / multiplier,\n dy = this.getValueOfPropertyAt(lineIndex, charIndex, 'deltaY'),\n topOffset =\n boundaries.topOffset +\n ((1 - this._fontSizeFraction) * this.getHeightOfLine(lineIndex)) /\n this.lineHeight -\n charHeight * (1 - this._fontSizeFraction);\n\n return {\n color:\n this.cursorColor ||\n (this.getValueOfPropertyAt(lineIndex, charIndex, 'fill') as string),\n opacity: this._currentCursorOpacity,\n left: boundaries.left + boundaries.leftOffset - cursorWidth / 2,\n top: topOffset + boundaries.top + dy,\n width: cursorWidth,\n height: charHeight,\n };\n }\n\n /**\n * Render the cursor at the given selectionStart.\n * @param {CanvasRenderingContext2D} ctx transformed context to draw on\n */\n _renderCursor(\n ctx: CanvasRenderingContext2D,\n boundaries: CursorBoundaries,\n selectionStart: number,\n ) {\n const { color, opacity, left, top, width, height } =\n this.getCursorRenderingData(selectionStart, boundaries);\n ctx.fillStyle = color;\n ctx.globalAlpha = opacity;\n ctx.fillRect(left, top, width, height);\n }\n\n /**\n * Renders text selection\n * @param {Object} boundaries Object with left/top/leftOffset/topOffset\n * @param {CanvasRenderingContext2D} ctx transformed context to draw on\n */\n renderSelection(ctx: CanvasRenderingContext2D, boundaries: CursorBoundaries) {\n const selection = {\n selectionStart: this.inCompositionMode\n ? this.hiddenTextarea!.selectionStart\n : this.selectionStart,\n selectionEnd: this.inCompositionMode\n ? this.hiddenTextarea!.selectionEnd\n : this.selectionEnd,\n };\n this._renderSelection(ctx, selection, boundaries);\n }\n\n /**\n * Renders drag start text selection\n */\n renderDragSourceEffect() {\n const dragStartSelection =\n this.draggableTextDelegate.getDragStartSelection()!;\n this._renderSelection(\n this.canvas!.contextTop,\n dragStartSelection,\n this._getCursorBoundaries(dragStartSelection.selectionStart, true),\n );\n }\n\n renderDropTargetEffect(e: DragEvent) {\n const dragSelection = this.getSelectionStartFromPointer(e);\n this.renderCursorAt(dragSelection);\n }\n\n /**\n * Renders text selection\n * @private\n * @param {{ selectionStart: number, selectionEnd: number }} selection\n * @param {Object} boundaries Object with left/top/leftOffset/topOffset\n * @param {CanvasRenderingContext2D} ctx transformed context to draw on\n */\n _renderSelection(\n ctx: CanvasRenderingContext2D,\n selection: { selectionStart: number; selectionEnd: number },\n boundaries: CursorBoundaries,\n ) {\n const selectionStart = selection.selectionStart,\n selectionEnd = selection.selectionEnd,\n isJustify = this.textAlign.includes(JUSTIFY),\n start = this.get2DCursorLocation(selectionStart),\n end = this.get2DCursorLocation(selectionEnd),\n startLine = start.lineIndex,\n endLine = end.lineIndex,\n startChar = start.charIndex < 0 ? 0 : start.charIndex,\n endChar = end.charIndex < 0 ? 0 : end.charIndex;\n\n for (let i = startLine; i <= endLine; i++) {\n const lineOffset = this._getLineLeftOffset(i) || 0;\n let lineHeight = this.getHeightOfLine(i),\n realLineHeight = 0,\n boxStart = 0,\n boxEnd = 0;\n\n if (i === startLine) {\n boxStart = this.__charBounds[startLine][startChar].left;\n }\n if (i >= startLine && i < endLine) {\n boxEnd =\n isJustify && !this.isEndOfWrapping(i)\n ? this.width\n : this.getLineWidth(i) || 5; // WTF is this 5?\n } else if (i === endLine) {\n if (endChar === 0) {\n boxEnd = this.__charBounds[endLine][endChar].left;\n } else {\n const charSpacing = this._getWidthOfCharSpacing();\n boxEnd =\n this.__charBounds[endLine][endChar - 1].left +\n this.__charBounds[endLine][endChar - 1].width -\n charSpacing;\n }\n }\n realLineHeight = lineHeight;\n if (this.lineHeight < 1 || (i === endLine && this.lineHeight > 1)) {\n lineHeight /= this.lineHeight;\n }\n let drawStart = boundaries.left + lineOffset + boxStart,\n drawHeight = lineHeight,\n extraTop = 0;\n const drawWidth = boxEnd - boxStart;\n if (this.inCompositionMode) {\n ctx.fillStyle = this.compositionColor || 'black';\n drawHeight = 1;\n extraTop = lineHeight;\n } else {\n ctx.fillStyle = this.selectionColor;\n }\n if (this.direction === 'rtl') {\n if (\n this.textAlign === RIGHT ||\n this.textAlign === JUSTIFY ||\n this.textAlign === JUSTIFY_RIGHT\n ) {\n drawStart = this.width - drawStart - drawWidth;\n } else if (this.textAlign === LEFT || this.textAlign === JUSTIFY_LEFT) {\n drawStart = boundaries.left + lineOffset - boxEnd;\n } else if (\n this.textAlign === CENTER ||\n this.textAlign === JUSTIFY_CENTER\n ) {\n drawStart = boundaries.left + lineOffset - boxEnd;\n }\n }\n ctx.fillRect(\n drawStart,\n boundaries.top + boundaries.topOffset + extraTop,\n drawWidth,\n drawHeight,\n );\n boundaries.topOffset += realLineHeight;\n }\n }\n\n /**\n * High level function to know the height of the cursor.\n * the currentChar is the one that precedes the cursor\n * Returns fontSize of char at the current cursor\n * Unused from the library, is for the end user\n * @return {Number} Character font size\n */\n getCurrentCharFontSize(): number {\n const cp = this._getCurrentCharIndex();\n return this.getValueOfPropertyAt(cp.l, cp.c, 'fontSize');\n }\n\n /**\n * High level function to know the color of the cursor.\n * the currentChar is the one that precedes the cursor\n * Returns color (fill) of char at the current cursor\n * if the text object has a pattern or gradient for filler, it will return that.\n * Unused by the library, is for the end user\n * @return {String | TFiller} Character color (fill)\n */\n getCurrentCharColor(): string | TFiller | null {\n const cp = this._getCurrentCharIndex();\n return this.getValueOfPropertyAt(cp.l, cp.c, FILL);\n }\n\n /**\n * Returns the cursor position for the getCurrent.. functions\n * @private\n */\n _getCurrentCharIndex() {\n const cursorPosition = this.get2DCursorLocation(this.selectionStart, true),\n charIndex =\n cursorPosition.charIndex > 0 ? cursorPosition.charIndex - 1 : 0;\n return { l: cursorPosition.lineIndex, c: charIndex };\n }\n\n dispose() {\n this.exitEditingImpl();\n this.draggableTextDelegate.dispose();\n super.dispose();\n }\n}\n\nclassRegistry.setClass(IText);\n// legacy\nclassRegistry.setClass(IText, 'i-text');\n","import type { TClassProperties, TOptions } from '../typedefs';\nimport { IText } from './IText/IText';\nimport { classRegistry } from '../ClassRegistry';\nimport { createTextboxDefaultControls } from '../controls/commonControls';\nimport { JUSTIFY } from './Text/constants';\nimport type { TextStyleDeclaration } from './Text/StyledText';\nimport type { SerializedITextProps, ITextProps } from './IText/IText';\nimport type { ITextEvents } from './IText/ITextBehavior';\nimport type { TextLinesInfo } from './Text/Text';\nimport type { Control } from '../controls/Control';\n\n// @TODO: Many things here are configuration related and shouldn't be on the class nor prototype\n// regexes, list of properties that are not suppose to change by instances, magic consts.\n// this will be a separated effort\nexport const textboxDefaultValues: Partial> = {\n minWidth: 20,\n dynamicMinWidth: 2,\n lockScalingFlip: true,\n noScaleCache: false,\n _wordJoiners: /[ \\t\\r]/,\n splitByGrapheme: false,\n};\n\nexport type GraphemeData = {\n wordsData: {\n word: string[];\n width: number;\n }[][];\n largestWordWidth: number;\n};\n\nexport type StyleMap = Record;\n\n// @TODO this is not complete\ninterface UniqueTextboxProps {\n minWidth: number;\n splitByGrapheme: boolean;\n dynamicMinWidth: number;\n _wordJoiners: RegExp;\n}\n\nexport interface SerializedTextboxProps\n extends SerializedITextProps,\n Pick {}\n\nexport interface TextboxProps extends ITextProps, UniqueTextboxProps {}\n\n/**\n * Textbox class, based on IText, allows the user to resize the text rectangle\n * and wraps lines automatically. Textboxes have their Y scaling locked, the\n * user can only change width. Height is adjusted automatically based on the\n * wrapping of lines.\n */\nexport class Textbox<\n Props extends TOptions = Partial,\n SProps extends SerializedTextboxProps = SerializedTextboxProps,\n EventSpec extends ITextEvents = ITextEvents,\n >\n extends IText\n implements UniqueTextboxProps\n{\n /**\n * Minimum width of textbox, in pixels.\n * @type Number\n */\n declare minWidth: number;\n\n /**\n * Minimum calculated width of a textbox, in pixels.\n * fixed to 2 so that an empty textbox cannot go to 0\n * and is still selectable without text.\n * @type Number\n */\n declare dynamicMinWidth: number;\n\n /**\n * Use this boolean property in order to split strings that have no white space concept.\n * this is a cheap way to help with chinese/japanese\n * @type Boolean\n * @since 2.6.0\n */\n declare splitByGrapheme: boolean;\n\n declare _wordJoiners: RegExp;\n\n declare _styleMap: StyleMap;\n\n declare isWrapping: boolean;\n\n static type = 'Textbox';\n\n static textLayoutProperties = [...IText.textLayoutProperties, 'width'];\n\n static ownDefaults = textboxDefaultValues;\n\n static getDefaults(): Record {\n return {\n ...super.getDefaults(),\n ...Textbox.ownDefaults,\n };\n }\n\n /**\n * Constructor\n * @param {String} text Text string\n * @param {Object} [options] Options object\n */\n constructor(text: string, options?: Props) {\n super(text, { ...Textbox.ownDefaults, ...options } as Props);\n }\n\n /**\n * Creates the default control object.\n * If you prefer to have on instance of controls shared among all objects\n * make this function return an empty object and add controls to the ownDefaults object\n */\n static createControls(): { controls: Record } {\n return { controls: createTextboxDefaultControls() };\n }\n\n /**\n * Unlike superclass's version of this function, Textbox does not update\n * its width.\n * @private\n * @override\n */\n initDimensions() {\n if (!this.initialized) {\n return;\n }\n this.isEditing && this.initDelayedCursor();\n this._clearCache();\n // clear dynamicMinWidth as it will be different after we re-wrap line\n this.dynamicMinWidth = 0;\n // wrap lines\n this._styleMap = this._generateStyleMap(this._splitText());\n // if after wrapping, the width is smaller than dynamicMinWidth, change the width and re-wrap\n if (this.dynamicMinWidth > this.width) {\n this._set('width', this.dynamicMinWidth);\n }\n if (this.textAlign.includes(JUSTIFY)) {\n // once text is measured we need to make space fatter to make justified text.\n this.enlargeSpaces();\n }\n // clear cache and re-calculate height\n this.height = this.calcTextHeight();\n }\n\n /**\n * Generate an object that translates the style object so that it is\n * broken up by visual lines (new lines and automatic wrapping).\n * The original text styles object is broken up by actual lines (new lines only),\n * which is only sufficient for Text / IText\n * @private\n */\n _generateStyleMap(textInfo: TextLinesInfo): StyleMap {\n let realLineCount = 0,\n realLineCharCount = 0,\n charCount = 0;\n const map: StyleMap = {};\n\n for (let i = 0; i < textInfo.graphemeLines.length; i++) {\n if (textInfo.graphemeText[charCount] === '\\n' && i > 0) {\n realLineCharCount = 0;\n charCount++;\n realLineCount++;\n } else if (\n !this.splitByGrapheme &&\n this._reSpaceAndTab.test(textInfo.graphemeText[charCount]) &&\n i > 0\n ) {\n // this case deals with space's that are removed from end of lines when wrapping\n realLineCharCount++;\n charCount++;\n }\n\n map[i] = { line: realLineCount, offset: realLineCharCount };\n\n charCount += textInfo.graphemeLines[i].length;\n realLineCharCount += textInfo.graphemeLines[i].length;\n }\n\n return map;\n }\n\n /**\n * Returns true if object has a style property or has it on a specified line\n * @param {Number} lineIndex\n * @return {Boolean}\n */\n styleHas(property: keyof TextStyleDeclaration, lineIndex: number): boolean {\n if (this._styleMap && !this.isWrapping) {\n const map = this._styleMap[lineIndex];\n if (map) {\n lineIndex = map.line;\n }\n }\n return super.styleHas(property, lineIndex);\n }\n\n /**\n * Returns true if object has no styling or no styling in a line\n * @param {Number} lineIndex , lineIndex is on wrapped lines.\n * @return {Boolean}\n */\n isEmptyStyles(lineIndex: number): boolean {\n if (!this.styles) {\n return true;\n }\n let offset = 0,\n nextLineIndex = lineIndex + 1,\n nextOffset: number,\n shouldLimit = false;\n const map = this._styleMap[lineIndex],\n mapNextLine = this._styleMap[lineIndex + 1];\n if (map) {\n lineIndex = map.line;\n offset = map.offset;\n }\n if (mapNextLine) {\n nextLineIndex = mapNextLine.line;\n shouldLimit = nextLineIndex === lineIndex;\n nextOffset = mapNextLine.offset;\n }\n const obj =\n typeof lineIndex === 'undefined'\n ? this.styles\n : { line: this.styles[lineIndex] };\n for (const p1 in obj) {\n for (const p2 in obj[p1]) {\n const p2Number = parseInt(p2, 10);\n if (p2Number >= offset && (!shouldLimit || p2Number < nextOffset!)) {\n for (const p3 in obj[p1][p2]) {\n return false;\n }\n }\n }\n }\n return true;\n }\n\n /**\n * @protected\n * @param {Number} lineIndex\n * @param {Number} charIndex\n * @return {TextStyleDeclaration} a style object reference to the existing one or a new empty object when undefined\n */\n _getStyleDeclaration(\n lineIndex: number,\n charIndex: number,\n ): TextStyleDeclaration {\n if (this._styleMap && !this.isWrapping) {\n const map = this._styleMap[lineIndex];\n if (!map) {\n return {};\n }\n lineIndex = map.line;\n charIndex = map.offset + charIndex;\n }\n return super._getStyleDeclaration(lineIndex, charIndex);\n }\n\n /**\n * @param {Number} lineIndex\n * @param {Number} charIndex\n * @param {Object} style\n * @private\n */\n protected _setStyleDeclaration(\n lineIndex: number,\n charIndex: number,\n style: object,\n ) {\n const map = this._styleMap[lineIndex];\n super._setStyleDeclaration(map.line, map.offset + charIndex, style);\n }\n\n /**\n * @param {Number} lineIndex\n * @param {Number} charIndex\n * @private\n */\n protected _deleteStyleDeclaration(lineIndex: number, charIndex: number) {\n const map = this._styleMap[lineIndex];\n super._deleteStyleDeclaration(map.line, map.offset + charIndex);\n }\n\n /**\n * probably broken need a fix\n * Returns the real style line that correspond to the wrapped lineIndex line\n * Used just to verify if the line does exist or not.\n * @param {Number} lineIndex\n * @returns {Boolean} if the line exists or not\n * @private\n */\n protected _getLineStyle(lineIndex: number): boolean {\n const map = this._styleMap[lineIndex];\n return !!this.styles[map.line];\n }\n\n /**\n * Set the line style to an empty object so that is initialized\n * @param {Number} lineIndex\n * @param {Object} style\n * @private\n */\n protected _setLineStyle(lineIndex: number) {\n const map = this._styleMap[lineIndex];\n super._setLineStyle(map.line);\n }\n\n /**\n * Wraps text using the 'width' property of Textbox. First this function\n * splits text on newlines, so we preserve newlines entered by the user.\n * Then it wraps each line using the width of the Textbox by calling\n * _wrapLine().\n * @param {Array} lines The string array of text that is split into lines\n * @param {Number} desiredWidth width you want to wrap to\n * @returns {Array} Array of lines\n */\n _wrapText(lines: string[], desiredWidth: number): string[][] {\n this.isWrapping = true;\n // extract all thewords and the widths to optimally wrap lines.\n const data = this.getGraphemeDataForRender(lines);\n const wrapped: string[][] = [];\n for (let i = 0; i < data.wordsData.length; i++) {\n wrapped.push(...this._wrapLine(i, desiredWidth, data));\n }\n this.isWrapping = false;\n return wrapped;\n }\n\n /**\n * For each line of text terminated by an hard line stop,\n * measure each word width and extract the largest word from all.\n * The returned words here are the one that at the end will be rendered.\n * @param {string[]} lines the lines we need to measure\n *\n */\n getGraphemeDataForRender(lines: string[]): GraphemeData {\n const splitByGrapheme = this.splitByGrapheme,\n infix = splitByGrapheme ? '' : ' ';\n\n let largestWordWidth = 0;\n\n const data = lines.map((line, lineIndex) => {\n let offset = 0;\n const wordsOrGraphemes = splitByGrapheme\n ? this.graphemeSplit(line)\n : this.wordSplit(line);\n\n if (wordsOrGraphemes.length === 0) {\n return [{ word: [], width: 0 }];\n }\n\n return wordsOrGraphemes.map((word: string) => {\n // if using splitByGrapheme words are already in graphemes.\n const graphemeArray = splitByGrapheme\n ? [word]\n : this.graphemeSplit(word);\n const width = this._measureWord(graphemeArray, lineIndex, offset);\n largestWordWidth = Math.max(width, largestWordWidth);\n offset += graphemeArray.length + infix.length;\n return { word: graphemeArray, width };\n });\n });\n\n return {\n wordsData: data,\n largestWordWidth,\n };\n }\n\n /**\n * Helper function to measure a string of text, given its lineIndex and charIndex offset\n * It gets called when charBounds are not available yet.\n * Override if necessary\n * Use with {@link Textbox#wordSplit}\n *\n * @param {CanvasRenderingContext2D} ctx\n * @param {String} text\n * @param {number} lineIndex\n * @param {number} charOffset\n * @returns {number}\n */\n _measureWord(word: string[], lineIndex: number, charOffset = 0): number {\n let width = 0,\n prevGrapheme;\n const skipLeft = true;\n for (let i = 0, len = word.length; i < len; i++) {\n const box = this._getGraphemeBox(\n word[i],\n lineIndex,\n i + charOffset,\n prevGrapheme,\n skipLeft,\n );\n width += box.kernedWidth;\n prevGrapheme = word[i];\n }\n return width;\n }\n\n /**\n * Override this method to customize word splitting\n * Use with {@link Textbox#_measureWord}\n * @param {string} value\n * @returns {string[]} array of words\n */\n wordSplit(value: string): string[] {\n return value.split(this._wordJoiners);\n }\n\n /**\n * Wraps a line of text using the width of the Textbox as desiredWidth\n * and leveraging the known width o words from GraphemeData\n * @private\n * @param {Number} lineIndex\n * @param {Number} desiredWidth width you want to wrap the line to\n * @param {GraphemeData} graphemeData an object containing all the lines' words width.\n * @param {Number} reservedSpace space to remove from wrapping for custom functionalities\n * @returns {Array} Array of line(s) into which the given text is wrapped\n * to.\n */\n _wrapLine(\n lineIndex: number,\n desiredWidth: number,\n { largestWordWidth, wordsData }: GraphemeData,\n reservedSpace = 0,\n ): string[][] {\n const additionalSpace = this._getWidthOfCharSpacing(),\n splitByGrapheme = this.splitByGrapheme,\n graphemeLines = [],\n infix = splitByGrapheme ? '' : ' ';\n\n let lineWidth = 0,\n line: string[] = [],\n // spaces in different languages?\n offset = 0,\n infixWidth = 0,\n lineJustStarted = true;\n\n desiredWidth -= reservedSpace;\n\n const maxWidth = Math.max(\n desiredWidth,\n largestWordWidth,\n this.dynamicMinWidth,\n );\n // layout words\n const data = wordsData[lineIndex];\n offset = 0;\n let i;\n for (i = 0; i < data.length; i++) {\n const { word, width: wordWidth } = data[i];\n offset += word.length;\n\n lineWidth += infixWidth + wordWidth - additionalSpace;\n if (lineWidth > maxWidth && !lineJustStarted) {\n graphemeLines.push(line);\n line = [];\n lineWidth = wordWidth;\n lineJustStarted = true;\n } else {\n lineWidth += additionalSpace;\n }\n\n if (!lineJustStarted && !splitByGrapheme) {\n line.push(infix);\n }\n line = line.concat(word);\n\n infixWidth = splitByGrapheme\n ? 0\n : this._measureWord([infix], lineIndex, offset);\n offset++;\n lineJustStarted = false;\n }\n\n i && graphemeLines.push(line);\n\n // TODO: this code is probably not necessary anymore.\n // it can be moved out of this function since largestWordWidth is now\n // known in advance\n if (largestWordWidth + reservedSpace > this.dynamicMinWidth) {\n this.dynamicMinWidth = largestWordWidth - additionalSpace + reservedSpace;\n }\n return graphemeLines;\n }\n\n /**\n * Detect if the text line is ended with an hard break\n * text and itext do not have wrapping, return false\n * @param {Number} lineIndex text to split\n * @return {Boolean}\n */\n isEndOfWrapping(lineIndex: number): boolean {\n if (!this._styleMap[lineIndex + 1]) {\n // is last line, return true;\n return true;\n }\n if (this._styleMap[lineIndex + 1].line !== this._styleMap[lineIndex].line) {\n // this is last line before a line break, return true;\n return true;\n }\n return false;\n }\n\n /**\n * Detect if a line has a linebreak and so we need to account for it when moving\n * and counting style.\n * This is important only for splitByGrapheme at the end of wrapping.\n * If we are not wrapping the offset is always 1\n * @return Number\n */\n missingNewlineOffset(lineIndex: number, skipWrapping?: boolean): 0 | 1 {\n if (this.splitByGrapheme && !skipWrapping) {\n return this.isEndOfWrapping(lineIndex) ? 1 : 0;\n }\n return 1;\n }\n\n /**\n * Gets lines of text to render in the Textbox. This function calculates\n * text wrapping on the fly every time it is called.\n * @param {String} text text to split\n * @returns {Array} Array of lines in the Textbox.\n * @override\n */\n _splitTextIntoLines(text: string) {\n const newText = super._splitTextIntoLines(text),\n graphemeLines = this._wrapText(newText.lines, this.width),\n lines = new Array(graphemeLines.length);\n for (let i = 0; i < graphemeLines.length; i++) {\n lines[i] = graphemeLines[i].join('');\n }\n newText.lines = lines;\n newText.graphemeLines = graphemeLines;\n return newText;\n }\n\n getMinWidth() {\n return Math.max(this.minWidth, this.dynamicMinWidth);\n }\n\n _removeExtraneousStyles() {\n const linesToKeep = new Map();\n for (const prop in this._styleMap) {\n const propNumber = parseInt(prop, 10);\n if (this._textLines[propNumber]) {\n const lineIndex = this._styleMap[prop].line;\n linesToKeep.set(`${lineIndex}`, true);\n }\n }\n for (const prop in this.styles) {\n if (!linesToKeep.has(prop)) {\n delete this.styles[prop];\n }\n }\n }\n\n /**\n * Returns object representation of an instance\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} object representation of an instance\n */\n toObject<\n T extends Omit, keyof SProps>,\n K extends keyof T = never,\n >(propertiesToInclude: K[] = []): Pick & SProps {\n return super.toObject([\n 'minWidth',\n 'splitByGrapheme',\n ...propertiesToInclude,\n ] as K[]);\n }\n}\n\nclassRegistry.setClass(Textbox);\n","import { Point } from '../../Point';\nimport type { FabricObject } from '../../shapes/Object/FabricObject';\nimport { makeBoundingBoxFromPoints } from '../../util/misc/boundingBoxFromPoints';\nimport { sendPointToPlane } from '../../util/misc/planeChange';\nimport type { LayoutStrategyResult, StrictLayoutContext } from '../types';\nimport { LayoutStrategy } from './LayoutStrategy';\nimport { getObjectBounds } from './utils';\nimport { classRegistry } from '../../ClassRegistry';\n\n/**\n * Layout will adjust the bounding box to match the clip path bounding box.\n */\nexport class ClipPathLayout extends LayoutStrategy {\n static readonly type = 'clip-path';\n\n shouldPerformLayout(context: StrictLayoutContext): boolean {\n return !!context.target.clipPath && super.shouldPerformLayout(context);\n }\n\n shouldLayoutClipPath() {\n return false;\n }\n\n calcLayoutResult(\n context: StrictLayoutContext,\n objects: FabricObject[],\n ): LayoutStrategyResult | undefined {\n const { target } = context;\n const { clipPath, group } = target;\n if (!clipPath || !this.shouldPerformLayout(context)) {\n return;\n }\n // TODO: remove stroke calculation from this case\n const { width, height } = makeBoundingBoxFromPoints(\n getObjectBounds(target, clipPath as FabricObject),\n );\n const size = new Point(width, height);\n if (clipPath.absolutePositioned) {\n // we want the center point to exist in group's containing plane\n const clipPathCenter = sendPointToPlane(\n clipPath.getRelativeCenterPoint(),\n undefined,\n group ? group.calcTransformMatrix() : undefined,\n );\n return {\n center: clipPathCenter,\n size,\n };\n } else {\n // we want the center point to exist in group's containing plane, so we send it upwards\n const clipPathCenter = clipPath\n .getRelativeCenterPoint()\n .transform(target.calcOwnMatrix(), true);\n if (this.shouldPerformLayout(context)) {\n // the clip path is positioned relative to the group's center which is affected by the bbox\n // so we first calculate the bbox\n const { center = new Point(), correction = new Point() } =\n this.calcBoundingBox(objects, context) || {};\n return {\n center: center.add(clipPathCenter),\n correction: correction.subtract(clipPathCenter),\n size,\n };\n } else {\n return {\n center: target.getRelativeCenterPoint().add(clipPathCenter),\n size,\n };\n }\n }\n }\n}\n\nclassRegistry.setClass(ClipPathLayout);\n","import { Point } from '../../Point';\nimport type {\n InitializationLayoutContext,\n LayoutStrategyResult,\n StrictLayoutContext,\n} from '../types';\nimport { LayoutStrategy } from './LayoutStrategy';\nimport { classRegistry } from '../../ClassRegistry';\n\n/**\n * Layout will keep target's initial size.\n */\nexport class FixedLayout extends LayoutStrategy {\n static readonly type = 'fixed';\n\n /**\n * @override respect target's initial size\n */\n getInitialSize(\n { target }: StrictLayoutContext & InitializationLayoutContext,\n { size }: Pick,\n ): Point {\n return new Point(target.width || size.x, target.height || size.y);\n }\n}\n\nclassRegistry.setClass(FixedLayout);\n","import { LayoutManager } from './LayoutManager';\nimport type { RegistrationContext, StrictLayoutContext } from './types';\nimport type { Group } from '../shapes/Group';\n\n/**\n * Today the LayoutManager class also takes care of subscribing event handlers\n * to update the group layout when the group is interactive and a transform is applied\n * to a child object.\n * The ActiveSelection is never interactive, but it could contain objects from\n * groups that are.\n * The standard LayoutManager would subscribe the children of the activeSelection to\n * perform layout changes to the active selection itself, what we need instead is that\n * the transformation applied to the active selection will trigger changes to the\n * original group of the children ( the one referenced under the parent property )\n * This subclass of the LayoutManager has a single duty to fill the gap of this difference.`\n */\nexport class ActiveSelectionLayoutManager extends LayoutManager {\n subscribeTargets(\n context: RegistrationContext & Partial,\n ): void {\n const activeSelection = context.target;\n const parents = context.targets.reduce((parents, target) => {\n target.parent && parents.add(target.parent);\n return parents;\n }, new Set());\n parents.forEach((parent) => {\n parent.layoutManager.subscribeTargets({\n target: parent,\n targets: [activeSelection],\n });\n });\n }\n\n /**\n * unsubscribe from parent only if all its children were deselected\n */\n unsubscribeTargets(\n context: RegistrationContext & Partial,\n ): void {\n const activeSelection = context.target;\n const selectedObjects = activeSelection.getObjects();\n const parents = context.targets.reduce((parents, target) => {\n target.parent && parents.add(target.parent);\n return parents;\n }, new Set());\n parents.forEach((parent) => {\n !selectedObjects.some((object) => object.parent === parent) &&\n parent.layoutManager.unsubscribeTargets({\n target: parent,\n targets: [activeSelection],\n });\n });\n }\n}\n","import type { ControlRenderingStyleOverride } from '../controls/controlRendering';\nimport { classRegistry } from '../ClassRegistry';\nimport type { GroupProps } from './Group';\nimport { Group } from './Group';\nimport type { FabricObject } from './Object/FabricObject';\nimport {\n LAYOUT_TYPE_ADDED,\n LAYOUT_TYPE_REMOVED,\n} from '../LayoutManager/constants';\nimport type { TClassProperties } from '../typedefs';\nimport { log } from '../util/internals/console';\nimport { ActiveSelectionLayoutManager } from '../LayoutManager/ActiveSelectionLayoutManager';\n\nexport type MultiSelectionStacking = 'canvas-stacking' | 'selection-order';\n\nexport interface ActiveSelectionOptions extends GroupProps {\n multiSelectionStacking: MultiSelectionStacking;\n}\n\nconst activeSelectionDefaultValues: Partial> =\n {\n multiSelectionStacking: 'canvas-stacking',\n };\n\n/**\n * Used by Canvas to manage selection.\n *\n * @example\n * class MyActiveSelection extends ActiveSelection {\n * ...\n * }\n *\n * // override the default `ActiveSelection` class\n * classRegistry.setClass(MyActiveSelection)\n */\nexport class ActiveSelection extends Group {\n static type = 'ActiveSelection';\n\n static ownDefaults: Record = activeSelectionDefaultValues;\n\n static getDefaults(): Record {\n return { ...super.getDefaults(), ...ActiveSelection.ownDefaults };\n }\n\n /**\n * The ActiveSelection needs to use the ActiveSelectionLayoutManager\n * or selections on interactive groups may be broken\n */\n declare layoutManager: ActiveSelectionLayoutManager;\n\n /**\n * controls how selected objects are added during a multiselection event\n * - `canvas-stacking` adds the selected object to the active selection while respecting canvas object stacking order\n * - `selection-order` adds the selected object to the top of the stack,\n * meaning that the stack is ordered by the order in which objects were selected\n * @default `canvas-stacking`\n */\n declare multiSelectionStacking: MultiSelectionStacking;\n\n constructor(\n objects: FabricObject[] = [],\n options: Partial = {},\n ) {\n super();\n Object.assign(this, ActiveSelection.ownDefaults);\n this.setOptions(options);\n const { left, top, layoutManager } = options;\n this.groupInit(objects, {\n left,\n top,\n layoutManager: layoutManager ?? new ActiveSelectionLayoutManager(),\n });\n }\n\n /**\n * @private\n */\n _shouldSetNestedCoords() {\n return true;\n }\n\n /**\n * @private\n * @override we don't want the selection monitor to be active\n */\n __objectSelectionMonitor() {\n // noop\n }\n\n /**\n * Adds objects with respect to {@link multiSelectionStacking}\n * @param targets object to add to selection\n */\n multiSelectAdd(...targets: FabricObject[]) {\n if (this.multiSelectionStacking === 'selection-order') {\n this.add(...targets);\n } else {\n // respect object stacking as it is on canvas\n // perf enhancement for large ActiveSelection: consider a binary search of `isInFrontOf`\n targets.forEach((target) => {\n const index = this._objects.findIndex((obj) => obj.isInFrontOf(target));\n const insertAt =\n index === -1\n ? // `target` is in front of all other objects\n this.size()\n : index;\n this.insertAt(insertAt, target);\n });\n }\n }\n\n /**\n * @override block ancestors/descendants of selected objects from being selected to prevent a circular object tree\n */\n canEnterGroup(object: FabricObject) {\n if (\n this.getObjects().some(\n (o) => o.isDescendantOf(object) || object.isDescendantOf(o),\n )\n ) {\n // prevent circular object tree\n log(\n 'error',\n 'ActiveSelection: circular object trees are not supported, this call has no effect',\n );\n return false;\n }\n\n return super.canEnterGroup(object);\n }\n\n /**\n * Change an object so that it can be part of an active selection.\n * this method is called by multiselectAdd from canvas code.\n * @private\n * @param {FabricObject} object\n * @param {boolean} [removeParentTransform] true if object is in canvas coordinate plane\n */\n enterGroup(object: FabricObject, removeParentTransform?: boolean) {\n // This condition check that the object has currently a group, and the group\n // is also its parent, meaning that is not in an active selection, but is\n // in a normal group.\n if (object.parent && object.parent === object.group) {\n // Disconnect the object from the group functionalities, but keep the ref parent intact\n // for later re-enter\n object.parent._exitGroup(object);\n // in this case the object is probably inside an active selection.\n } else if (object.group && object.parent !== object.group) {\n // in this case group.remove will also clear the old parent reference.\n object.group.remove(object);\n }\n // enter the active selection from a render perspective\n // the object will be in the objects array of both the ActiveSelection and the Group\n // but referenced in the group's _activeObjects so that it won't be rendered twice.\n this._enterGroup(object, removeParentTransform);\n }\n\n /**\n * we want objects to retain their canvas ref when exiting instance\n * @private\n * @param {FabricObject} object\n * @param {boolean} [removeParentTransform] true if object should exit group without applying group's transform to it\n */\n exitGroup(object: FabricObject, removeParentTransform?: boolean) {\n this._exitGroup(object, removeParentTransform);\n // return to parent\n object.parent && object.parent._enterGroup(object, true);\n }\n\n /**\n * @private\n * @param {'added'|'removed'} type\n * @param {FabricObject[]} targets\n */\n _onAfterObjectsChange(type: 'added' | 'removed', targets: FabricObject[]) {\n super._onAfterObjectsChange(type, targets);\n const groups = new Set();\n targets.forEach((object) => {\n const { parent } = object;\n parent && groups.add(parent);\n });\n if (type === LAYOUT_TYPE_REMOVED) {\n // invalidate groups' layout and mark as dirty\n groups.forEach((group) => {\n group._onAfterObjectsChange(LAYOUT_TYPE_ADDED, targets);\n });\n } else {\n // mark groups as dirty\n groups.forEach((group) => {\n group._set('dirty', true);\n });\n }\n }\n\n /**\n * @override remove all objects\n */\n onDeselect() {\n this.removeAll();\n return false;\n }\n\n /**\n * Returns string representation of a group\n * @return {String}\n */\n toString() {\n return `#`;\n }\n\n /**\n * Decide if the object should cache or not. The Active selection never caches\n * @return {Boolean}\n */\n shouldCache() {\n return false;\n }\n\n /**\n * Check if this group or its parent group are caching, recursively up\n * @return {Boolean}\n */\n isOnACache() {\n return false;\n }\n\n /**\n * Renders controls and borders for the object\n * @param {CanvasRenderingContext2D} ctx Context to render on\n * @param {Object} [styleOverride] properties to override the object style\n * @param {Object} [childrenOverride] properties to override the children overrides\n */\n _renderControls(\n ctx: CanvasRenderingContext2D,\n styleOverride?: ControlRenderingStyleOverride,\n childrenOverride?: ControlRenderingStyleOverride,\n ) {\n ctx.save();\n ctx.globalAlpha = this.isMoving ? this.borderOpacityWhenMoving : 1;\n const options = {\n hasControls: false,\n ...childrenOverride,\n forActiveSelection: true,\n };\n for (let i = 0; i < this._objects.length; i++) {\n this._objects[i]._renderControls(ctx, options);\n }\n super._renderControls(ctx, styleOverride);\n ctx.restore();\n }\n}\n\nclassRegistry.setClass(ActiveSelection);\nclassRegistry.setClass(ActiveSelection, 'activeSelection');\n","/**\n * Canvas 2D filter backend.\n */\nimport type { BaseFilter } from './BaseFilter';\nimport type { T2DPipelineState, TPipelineResources } from './typedefs';\n\nexport class Canvas2dFilterBackend {\n /**\n * Experimental. This object is a sort of repository of help layers used to avoid\n * of recreating them during frequent filtering. If you are previewing a filter with\n * a slider you probably do not want to create help layers every filter step.\n * in this object there will be appended some canvases, created once, resized sometimes\n * cleared never. Clearing is left to the developer.\n **/\n resources: TPipelineResources = {};\n\n /**\n * Apply a set of filters against a source image and draw the filtered output\n * to the provided destination canvas.\n *\n * @param {EnhancedFilter} filters The filter to apply.\n * @param {HTMLImageElement|HTMLCanvasElement} sourceElement The source to be filtered.\n * @param {Number} sourceWidth The width of the source input.\n * @param {Number} sourceHeight The height of the source input.\n * @param {HTMLCanvasElement} targetCanvas The destination for filtered output to be drawn.\n */\n applyFilters(\n filters: BaseFilter>[],\n sourceElement: CanvasImageSource,\n sourceWidth: number,\n sourceHeight: number,\n targetCanvas: HTMLCanvasElement,\n ): T2DPipelineState | void {\n const ctx = targetCanvas.getContext('2d', {\n willReadFrequently: true,\n desynchronized: true,\n });\n if (!ctx) {\n return;\n }\n ctx.drawImage(sourceElement, 0, 0, sourceWidth, sourceHeight);\n const imageData = ctx.getImageData(0, 0, sourceWidth, sourceHeight);\n const originalImageData = ctx.getImageData(0, 0, sourceWidth, sourceHeight);\n const pipelineState: T2DPipelineState = {\n sourceWidth,\n sourceHeight,\n imageData,\n originalEl: sourceElement,\n originalImageData,\n canvasEl: targetCanvas,\n ctx,\n filterBackend: this,\n };\n filters.forEach((filter) => {\n filter.applyTo(pipelineState);\n });\n const { imageData: imageDataPostFilter } = pipelineState;\n if (\n imageDataPostFilter.width !== sourceWidth ||\n imageDataPostFilter.height !== sourceHeight\n ) {\n targetCanvas.width = imageDataPostFilter.width;\n targetCanvas.height = imageDataPostFilter.height;\n }\n ctx.putImageData(imageDataPostFilter, 0, 0);\n return pipelineState;\n }\n}\n","import { config } from '../config';\nimport { createCanvasElementFor } from '../util/misc/dom';\nimport type {\n TWebGLPipelineState,\n TProgramCache,\n TTextureCache,\n TPipelineResources,\n} from './typedefs';\nimport type { BaseFilter } from './BaseFilter';\n\nexport class WebGLFilterBackend {\n declare tileSize: number;\n\n /**\n * Define ...\n **/\n aPosition: Float32Array = new Float32Array([0, 0, 0, 1, 1, 0, 1, 1]);\n\n /**\n * If GLPut data is the fastest operation, or if forced, this buffer will be used\n * to transfer the data back in the 2d logic\n **/\n declare imageBuffer?: ArrayBuffer;\n\n declare canvas: HTMLCanvasElement;\n\n /**\n * The Webgl context that will execute the operations for filtering\n **/\n declare gl: WebGLRenderingContext;\n\n /**\n * Keyed map for shader cache\n **/\n declare programCache: TProgramCache;\n\n /**\n * Keyed map for texture cache\n **/\n declare textureCache: TTextureCache;\n\n /**\n * Contains GPU info for debug\n **/\n declare gpuInfo: any;\n\n /**\n * Experimental. This object is a sort of repository of help layers used to avoid\n * of recreating them during frequent filtering. If you are previewing a filter with\n * a slider you probably do not want to create help layers every filter step.\n * in this object there will be appended some canvases, created once, resized sometimes\n * cleared never. Clearing is left to the developer.\n **/\n resources: TPipelineResources = {};\n\n constructor({ tileSize = config.textureSize } = {}) {\n this.tileSize = tileSize;\n this.setupGLContext(tileSize, tileSize);\n this.captureGPUInfo();\n }\n\n /**\n * Setup a WebGL context suitable for filtering, and bind any needed event handlers.\n */\n setupGLContext(width: number, height: number): void {\n this.dispose();\n this.createWebGLCanvas(width, height);\n }\n\n /**\n * Create a canvas element and associated WebGL context and attaches them as\n * class properties to the GLFilterBackend class.\n */\n createWebGLCanvas(width: number, height: number): void {\n const canvas = createCanvasElementFor({ width, height });\n const glOptions = {\n alpha: true,\n premultipliedAlpha: false,\n depth: false,\n stencil: false,\n antialias: false,\n },\n gl = canvas.getContext('webgl', glOptions) as WebGLRenderingContext;\n\n if (!gl) {\n return;\n }\n gl.clearColor(0, 0, 0, 0);\n // this canvas can fire webglcontextlost and webglcontextrestored\n this.canvas = canvas;\n this.gl = gl;\n }\n\n /**\n * Attempts to apply the requested filters to the source provided, drawing the filtered output\n * to the provided target canvas.\n *\n * @param {Array} filters The filters to apply.\n * @param {TexImageSource} source The source to be filtered.\n * @param {Number} width The width of the source input.\n * @param {Number} height The height of the source input.\n * @param {HTMLCanvasElement} targetCanvas The destination for filtered output to be drawn.\n * @param {String|undefined} cacheKey A key used to cache resources related to the source. If\n * omitted, caching will be skipped.\n */\n applyFilters(\n filters: BaseFilter>[],\n source: TexImageSource,\n width: number,\n height: number,\n targetCanvas: HTMLCanvasElement,\n cacheKey?: string,\n ): TWebGLPipelineState | undefined {\n const gl = this.gl;\n const ctx = targetCanvas.getContext('2d');\n if (!gl || !ctx) {\n return;\n }\n let cachedTexture;\n if (cacheKey) {\n cachedTexture = this.getCachedTexture(cacheKey, source);\n }\n const pipelineState: TWebGLPipelineState = {\n originalWidth:\n (source as HTMLImageElement).width ||\n (source as HTMLImageElement).naturalWidth ||\n 0,\n originalHeight:\n (source as HTMLImageElement).height ||\n (source as HTMLImageElement).naturalHeight ||\n 0,\n sourceWidth: width,\n sourceHeight: height,\n destinationWidth: width,\n destinationHeight: height,\n context: gl,\n sourceTexture: this.createTexture(\n gl,\n width,\n height,\n !cachedTexture ? source : undefined,\n ),\n targetTexture: this.createTexture(gl, width, height),\n originalTexture:\n cachedTexture ||\n this.createTexture(\n gl,\n width,\n height,\n !cachedTexture ? source : undefined,\n ),\n passes: filters.length,\n webgl: true,\n aPosition: this.aPosition,\n programCache: this.programCache,\n pass: 0,\n filterBackend: this,\n targetCanvas: targetCanvas,\n };\n const tempFbo = gl.createFramebuffer();\n gl.bindFramebuffer(gl.FRAMEBUFFER, tempFbo);\n filters.forEach((filter: any) => {\n filter && filter.applyTo(pipelineState);\n });\n resizeCanvasIfNeeded(pipelineState);\n this.copyGLTo2D(gl, pipelineState);\n gl.bindTexture(gl.TEXTURE_2D, null);\n gl.deleteTexture(pipelineState.sourceTexture);\n gl.deleteTexture(pipelineState.targetTexture);\n gl.deleteFramebuffer(tempFbo);\n ctx.setTransform(1, 0, 0, 1, 0, 0);\n return pipelineState;\n }\n\n /**\n * Detach event listeners, remove references, and clean up caches.\n */\n dispose() {\n if (this.canvas) {\n // we are disposing, we don't care about the fact\n // that the canvas shouldn't be null.\n // @ts-expect-error disposing\n this.canvas = null;\n // @ts-expect-error disposing\n this.gl = null;\n }\n this.clearWebGLCaches();\n }\n\n /**\n * Wipe out WebGL-related caches.\n */\n clearWebGLCaches() {\n this.programCache = {};\n this.textureCache = {};\n }\n\n /**\n * Create a WebGL texture object.\n *\n * Accepts specific dimensions to initialize the texture to or a source image.\n *\n * @param {WebGLRenderingContext} gl The GL context to use for creating the texture.\n * @param {number} width The width to initialize the texture at.\n * @param {number} height The height to initialize the texture.\n * @param {TexImageSource} textureImageSource A source for the texture data.\n * @param {number} filter gl.NEAREST default or gl.LINEAR filters for the texture.\n * This filter is very useful for LUTs filters. If you need interpolation use gl.LINEAR\n * @returns {WebGLTexture}\n */\n createTexture(\n gl: WebGLRenderingContext,\n width: number,\n height: number,\n textureImageSource?: TexImageSource,\n filter?:\n | WebGLRenderingContextBase['NEAREST']\n | WebGLRenderingContextBase['LINEAR'],\n ): WebGLTexture {\n const {\n NEAREST,\n TEXTURE_2D,\n RGBA,\n UNSIGNED_BYTE,\n CLAMP_TO_EDGE,\n TEXTURE_MAG_FILTER,\n TEXTURE_MIN_FILTER,\n TEXTURE_WRAP_S,\n TEXTURE_WRAP_T,\n } = gl;\n const texture = gl.createTexture();\n gl.bindTexture(TEXTURE_2D, texture);\n gl.texParameteri(TEXTURE_2D, TEXTURE_MAG_FILTER, filter || NEAREST);\n gl.texParameteri(TEXTURE_2D, TEXTURE_MIN_FILTER, filter || NEAREST);\n gl.texParameteri(TEXTURE_2D, TEXTURE_WRAP_S, CLAMP_TO_EDGE);\n gl.texParameteri(TEXTURE_2D, TEXTURE_WRAP_T, CLAMP_TO_EDGE);\n if (textureImageSource) {\n gl.texImage2D(\n TEXTURE_2D,\n 0,\n RGBA,\n RGBA,\n UNSIGNED_BYTE,\n textureImageSource,\n );\n } else {\n gl.texImage2D(\n TEXTURE_2D,\n 0,\n RGBA,\n width,\n height,\n 0,\n RGBA,\n UNSIGNED_BYTE,\n null,\n );\n }\n // disabled because website and issues with different typescript version\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion\n return texture!;\n }\n\n /**\n * Can be optionally used to get a texture from the cache array\n *\n * If an existing texture is not found, a new texture is created and cached.\n *\n * @param {String} uniqueId A cache key to use to find an existing texture.\n * @param {HTMLImageElement|HTMLCanvasElement} textureImageSource A source to use to create the\n * texture cache entry if one does not already exist.\n */\n getCachedTexture(\n uniqueId: string,\n textureImageSource: TexImageSource,\n filter?:\n | WebGLRenderingContextBase['NEAREST']\n | WebGLRenderingContextBase['LINEAR'],\n ): WebGLTexture | null {\n const { textureCache } = this;\n if (textureCache[uniqueId]) {\n return textureCache[uniqueId];\n } else {\n const texture = this.createTexture(\n this.gl,\n (textureImageSource as HTMLImageElement).width,\n (textureImageSource as HTMLImageElement).height,\n textureImageSource,\n filter,\n );\n if (texture) {\n textureCache[uniqueId] = texture;\n }\n return texture;\n }\n }\n\n /**\n * Clear out cached resources related to a source image that has been\n * filtered previously.\n *\n * @param {String} cacheKey The cache key provided when the source image was filtered.\n */\n evictCachesForKey(cacheKey: string) {\n if (this.textureCache[cacheKey]) {\n this.gl.deleteTexture(this.textureCache[cacheKey]);\n delete this.textureCache[cacheKey];\n }\n }\n\n /**\n * Copy an input WebGL canvas on to an output 2D canvas.\n *\n * The WebGL canvas is assumed to be upside down, with the top-left pixel of the\n * desired output image appearing in the bottom-left corner of the WebGL canvas.\n *\n * @param {WebGLRenderingContext} sourceContext The WebGL context to copy from.\n * @param {Object} pipelineState The 2D target canvas to copy on to.\n */\n copyGLTo2D(gl: WebGLRenderingContext, pipelineState: TWebGLPipelineState) {\n const glCanvas = gl.canvas,\n targetCanvas = pipelineState.targetCanvas,\n ctx = targetCanvas.getContext('2d');\n if (!ctx) {\n return;\n }\n ctx.translate(0, targetCanvas.height); // move it down again\n ctx.scale(1, -1); // vertical flip\n // where is my image on the big glcanvas?\n const sourceY = glCanvas.height - targetCanvas.height;\n ctx.drawImage(\n glCanvas,\n 0,\n sourceY,\n targetCanvas.width,\n targetCanvas.height,\n 0,\n 0,\n targetCanvas.width,\n targetCanvas.height,\n );\n }\n\n /**\n * Copy an input WebGL canvas on to an output 2D canvas using 2d canvas' putImageData\n * API. Measurably faster than using ctx.drawImage in Firefox (version 54 on OSX Sierra).\n *\n * @param {WebGLRenderingContext} sourceContext The WebGL context to copy from.\n * @param {HTMLCanvasElement} targetCanvas The 2D target canvas to copy on to.\n * @param {Object} pipelineState The 2D target canvas to copy on to.\n */\n copyGLTo2DPutImageData(\n this: Required,\n gl: WebGLRenderingContext,\n pipelineState: TWebGLPipelineState,\n ) {\n const targetCanvas = pipelineState.targetCanvas,\n ctx = targetCanvas.getContext('2d'),\n dWidth = pipelineState.destinationWidth,\n dHeight = pipelineState.destinationHeight,\n numBytes = dWidth * dHeight * 4;\n if (!ctx) {\n return;\n }\n const u8 = new Uint8Array(this.imageBuffer, 0, numBytes);\n const u8Clamped = new Uint8ClampedArray(this.imageBuffer, 0, numBytes);\n\n gl.readPixels(0, 0, dWidth, dHeight, gl.RGBA, gl.UNSIGNED_BYTE, u8);\n const imgData = new ImageData(u8Clamped, dWidth, dHeight);\n ctx.putImageData(imgData, 0, 0);\n }\n\n /**\n * Attempt to extract GPU information strings from a WebGL context.\n *\n * Useful information when debugging or blacklisting specific GPUs.\n *\n * @returns {Object} A GPU info object with renderer and vendor strings.\n */\n captureGPUInfo() {\n if (this.gpuInfo) {\n return this.gpuInfo;\n }\n const gl = this.gl,\n gpuInfo = { renderer: '', vendor: '' };\n if (!gl) {\n return gpuInfo;\n }\n const ext = gl.getExtension('WEBGL_debug_renderer_info');\n if (ext) {\n const renderer = gl.getParameter(ext.UNMASKED_RENDERER_WEBGL);\n const vendor = gl.getParameter(ext.UNMASKED_VENDOR_WEBGL);\n if (renderer) {\n gpuInfo.renderer = renderer.toLowerCase();\n }\n if (vendor) {\n gpuInfo.vendor = vendor.toLowerCase();\n }\n }\n this.gpuInfo = gpuInfo;\n return gpuInfo;\n }\n}\n\nfunction resizeCanvasIfNeeded(pipelineState: TWebGLPipelineState): void {\n const targetCanvas = pipelineState.targetCanvas,\n width = targetCanvas.width,\n height = targetCanvas.height,\n dWidth = pipelineState.destinationWidth,\n dHeight = pipelineState.destinationHeight;\n\n if (width !== dWidth || height !== dHeight) {\n targetCanvas.width = dWidth;\n targetCanvas.height = dHeight;\n }\n}\n","import { config } from '../config';\nimport { getEnv } from '../env';\nimport { createCanvasElement } from '../util/misc/dom';\nimport { Canvas2dFilterBackend } from './Canvas2dFilterBackend';\nimport { WebGLFilterBackend } from './WebGLFilterBackend';\n\nexport type FilterBackend = WebGLFilterBackend | Canvas2dFilterBackend;\n\nlet filterBackend: FilterBackend;\n\n/**\n * Verifies if it is possible to initialize webgl or fallback on a canvas2d filtering backend\n */\nexport function initFilterBackend(): FilterBackend {\n const { WebGLProbe } = getEnv();\n WebGLProbe.queryWebGL(createCanvasElement());\n if (config.enableGLFiltering && WebGLProbe.isSupported(config.textureSize)) {\n return new WebGLFilterBackend({ tileSize: config.textureSize });\n } else {\n return new Canvas2dFilterBackend();\n }\n}\n\n/**\n * Get the current fabricJS filter backend or initialize one if not available yet\n * @param [strict] pass `true` to create the backend if it wasn't created yet (default behavior),\n * pass `false` to get the backend ref without mutating it\n */\nexport function getFilterBackend(strict = true): FilterBackend {\n if (!filterBackend && strict) {\n filterBackend = initFilterBackend();\n }\n return filterBackend;\n}\n\nexport function setFilterBackend(backend: FilterBackend) {\n filterBackend = backend;\n}\n","import { getFabricDocument, getEnv } from '../env';\nimport type { BaseFilter } from '../filters/BaseFilter';\nimport { getFilterBackend } from '../filters/FilterBackend';\nimport { SHARED_ATTRIBUTES } from '../parser/attributes';\nimport { parseAttributes } from '../parser/parseAttributes';\nimport type {\n TClassProperties,\n TCrossOrigin,\n TSize,\n Abortable,\n TOptions,\n} from '../typedefs';\nimport { uid } from '../util/internals/uid';\nimport { createCanvasElementFor } from '../util/misc/dom';\nimport { findScaleToCover, findScaleToFit } from '../util/misc/findScaleTo';\nimport type { LoadImageOptions } from '../util/misc/objectEnlive';\nimport {\n enlivenObjectEnlivables,\n enlivenObjects,\n loadImage,\n} from '../util/misc/objectEnlive';\nimport { parsePreserveAspectRatioAttribute } from '../util/misc/svgParsing';\nimport { classRegistry } from '../ClassRegistry';\nimport { FabricObject, cacheProperties } from './Object/FabricObject';\nimport type { FabricObjectProps, SerializedObjectProps } from './Object/types';\nimport type { ObjectEvents } from '../EventTypeDefs';\nimport { WebGLFilterBackend } from '../filters/WebGLFilterBackend';\nimport { FILL, NONE } from '../constants';\nimport { getDocumentFromElement } from '../util/dom_misc';\nimport type { CSSRules } from '../parser/typedefs';\nimport type { Resize, ResizeSerializedProps } from '../filters/Resize';\nimport type { TCachedFabricObject } from './Object/Object';\nimport { log } from '../util/internals/console';\n\n// @todo Would be nice to have filtering code not imported directly.\n\nexport type ImageSource =\n | HTMLImageElement\n | HTMLVideoElement\n | HTMLCanvasElement;\n\ninterface UniqueImageProps {\n srcFromAttribute: boolean;\n minimumScaleTrigger: number;\n cropX: number;\n cropY: number;\n imageSmoothing: boolean;\n filters: BaseFilter>[];\n resizeFilter?: Resize;\n}\n\nexport const imageDefaultValues: Partial> = {\n strokeWidth: 0,\n srcFromAttribute: false,\n minimumScaleTrigger: 0.5,\n cropX: 0,\n cropY: 0,\n imageSmoothing: true,\n};\n\nexport interface SerializedImageProps extends SerializedObjectProps {\n src: string;\n crossOrigin: TCrossOrigin;\n filters: any[];\n resizeFilter?: ResizeSerializedProps;\n cropX: number;\n cropY: number;\n}\n\nexport interface ImageProps extends FabricObjectProps, UniqueImageProps {}\n\nconst IMAGE_PROPS = ['cropX', 'cropY'] as const;\n\n/**\n * @see {@link http://fabric5.fabricjs.com/fabric-intro-part-1#images}\n */\nexport class FabricImage<\n Props extends TOptions = Partial,\n SProps extends SerializedImageProps = SerializedImageProps,\n EventSpec extends ObjectEvents = ObjectEvents,\n >\n extends FabricObject\n implements ImageProps\n{\n /**\n * When calling {@link FabricImage.getSrc}, return value from element src with `element.getAttribute('src')`.\n * This allows for relative urls as image src.\n * @since 2.7.0\n * @type Boolean\n * @default false\n */\n declare srcFromAttribute: boolean;\n\n /**\n * private\n * contains last value of scaleX to detect\n * if the Image got resized after the last Render\n * @type Number\n */\n protected _lastScaleX = 1;\n\n /**\n * private\n * contains last value of scaleY to detect\n * if the Image got resized after the last Render\n * @type Number\n */\n protected _lastScaleY = 1;\n\n /**\n * private\n * contains last value of scaling applied by the apply filter chain\n * @type Number\n */\n protected _filterScalingX = 1;\n\n /**\n * private\n * contains last value of scaling applied by the apply filter chain\n * @type Number\n */\n protected _filterScalingY = 1;\n\n /**\n * minimum scale factor under which any resizeFilter is triggered to resize the image\n * 0 will disable the automatic resize. 1 will trigger automatically always.\n * number bigger than 1 are not implemented yet.\n * @type Number\n */\n declare minimumScaleTrigger: number;\n\n /**\n * key used to retrieve the texture representing this image\n * @since 2.0.0\n * @type String\n */\n declare cacheKey: string;\n\n /**\n * Image crop in pixels from original image size.\n * @since 2.0.0\n * @type Number\n */\n declare cropX: number;\n\n /**\n * Image crop in pixels from original image size.\n * @since 2.0.0\n * @type Number\n */\n declare cropY: number;\n\n /**\n * Indicates whether this canvas will use image smoothing when painting this image.\n * Also influence if the cacheCanvas for this image uses imageSmoothing\n * @since 4.0.0-beta.11\n * @type Boolean\n */\n declare imageSmoothing: boolean;\n\n declare preserveAspectRatio: string;\n\n declare protected src: string;\n\n declare filters: BaseFilter>[];\n declare resizeFilter: Resize;\n\n declare _element: ImageSource;\n declare _filteredEl?: HTMLCanvasElement;\n declare _originalElement: ImageSource;\n\n static type = 'Image';\n\n static cacheProperties = [...cacheProperties, ...IMAGE_PROPS];\n\n static ownDefaults = imageDefaultValues;\n\n static getDefaults(): Record {\n return {\n ...super.getDefaults(),\n ...FabricImage.ownDefaults,\n };\n }\n /**\n * Constructor\n * Image can be initialized with any canvas drawable or a string.\n * The string should be a url and will be loaded as an image.\n * Canvas and Image element work out of the box, while videos require extra code to work.\n * Please check video element events for seeking.\n * @param {ImageSource | string} element Image element\n * @param {Object} [options] Options object\n */\n constructor(elementId: string, options?: Props);\n constructor(element: ImageSource, options?: Props);\n constructor(arg0: ImageSource | string, options?: Props) {\n super();\n this.filters = [];\n Object.assign(this, FabricImage.ownDefaults);\n this.setOptions(options);\n this.cacheKey = `texture${uid()}`;\n this.setElement(\n typeof arg0 === 'string'\n ? ((\n (this.canvas && getDocumentFromElement(this.canvas.getElement())) ||\n getFabricDocument()\n ).getElementById(arg0) as ImageSource)\n : arg0,\n options,\n );\n }\n\n /**\n * Returns image element which this instance if based on\n */\n getElement() {\n return this._element;\n }\n\n /**\n * Sets image element for this instance to a specified one.\n * If filters defined they are applied to new image.\n * You might need to call `canvas.renderAll` and `object.setCoords` after replacing, to render new image and update controls area.\n * @param {HTMLImageElement} element\n * @param {Partial} [size] Options object\n */\n setElement(element: ImageSource, size: Partial = {}) {\n this.removeTexture(this.cacheKey);\n this.removeTexture(`${this.cacheKey}_filtered`);\n this._element = element;\n this._originalElement = element;\n this._setWidthHeight(size);\n if (this.filters.length !== 0) {\n this.applyFilters();\n }\n // resizeFilters work on the already filtered copy.\n // we need to apply resizeFilters AFTER normal filters.\n // applyResizeFilters is run more often than normal filters\n // and is triggered by user interactions rather than dev code\n if (this.resizeFilter) {\n this.applyResizeFilters();\n }\n }\n\n /**\n * Delete a single texture if in webgl mode\n */\n removeTexture(key: string) {\n const backend = getFilterBackend(false);\n if (backend instanceof WebGLFilterBackend) {\n backend.evictCachesForKey(key);\n }\n }\n\n /**\n * Delete textures, reference to elements and eventually JSDOM cleanup\n */\n dispose() {\n super.dispose();\n this.removeTexture(this.cacheKey);\n this.removeTexture(`${this.cacheKey}_filtered`);\n this._cacheContext = null;\n (\n ['_originalElement', '_element', '_filteredEl', '_cacheCanvas'] as const\n ).forEach((elementKey) => {\n const el = this[elementKey];\n el && getEnv().dispose(el);\n // @ts-expect-error disposing\n this[elementKey] = undefined;\n });\n }\n\n /**\n * Get the crossOrigin value (of the corresponding image element)\n */\n getCrossOrigin(): string | null {\n return (\n this._originalElement &&\n ((this._originalElement as any).crossOrigin || null)\n );\n }\n\n /**\n * Returns original size of an image\n */\n getOriginalSize() {\n const element = this.getElement() as any;\n if (!element) {\n return {\n width: 0,\n height: 0,\n };\n }\n return {\n width: element.naturalWidth || element.width,\n height: element.naturalHeight || element.height,\n };\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _stroke(ctx: CanvasRenderingContext2D) {\n if (!this.stroke || this.strokeWidth === 0) {\n return;\n }\n const w = this.width / 2,\n h = this.height / 2;\n ctx.beginPath();\n ctx.moveTo(-w, -h);\n ctx.lineTo(w, -h);\n ctx.lineTo(w, h);\n ctx.lineTo(-w, h);\n ctx.lineTo(-w, -h);\n ctx.closePath();\n }\n\n /**\n * Returns object representation of an instance\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} Object representation of an instance\n */\n toObject<\n T extends Omit, keyof SProps>,\n K extends keyof T = never,\n >(propertiesToInclude: K[] = []): Pick & SProps {\n const filters: Record[] = [];\n this.filters.forEach((filterObj) => {\n filterObj && filters.push(filterObj.toObject());\n });\n return {\n ...super.toObject([...IMAGE_PROPS, ...propertiesToInclude]),\n src: this.getSrc(),\n crossOrigin: this.getCrossOrigin(),\n filters,\n ...(this.resizeFilter\n ? { resizeFilter: this.resizeFilter.toObject() }\n : {}),\n };\n }\n\n /**\n * Returns true if an image has crop applied, inspecting values of cropX,cropY,width,height.\n * @return {Boolean}\n */\n hasCrop() {\n return (\n !!this.cropX ||\n !!this.cropY ||\n this.width < this._element.width ||\n this.height < this._element.height\n );\n }\n\n /**\n * Returns svg representation of an instance\n * @return {string[]} an array of strings with the specific svg representation\n * of the instance\n */\n _toSVG() {\n const imageMarkup: string[] = [],\n element = this._element,\n x = -this.width / 2,\n y = -this.height / 2;\n let svgString: string[] = [],\n strokeSvg: string[] = [],\n clipPath = '',\n imageRendering = '';\n if (!element) {\n return [];\n }\n if (this.hasCrop()) {\n const clipPathId = uid();\n svgString.push(\n '\\n',\n '\\t\\n',\n '\\n',\n );\n clipPath = ' clip-path=\"url(#imageCrop_' + clipPathId + ')\" ';\n }\n if (!this.imageSmoothing) {\n imageRendering = ' image-rendering=\"optimizeSpeed\"';\n }\n imageMarkup.push(\n '\\t element with actual transformation, then offsetting object to the top/left\n // so that object's center aligns with container's left/top\n }\" width=\"${\n element.width || (element as HTMLImageElement).naturalWidth\n }\" height=\"${\n element.height || (element as HTMLImageElement).naturalHeight\n }\"${imageRendering}${clipPath}>\\n`,\n );\n\n if (this.stroke || this.strokeDashArray) {\n const origFill = this.fill;\n this.fill = null;\n strokeSvg = [\n `\\t\\n`,\n ];\n this.fill = origFill;\n }\n if (this.paintFirst !== FILL) {\n svgString = svgString.concat(strokeSvg, imageMarkup);\n } else {\n svgString = svgString.concat(imageMarkup, strokeSvg);\n }\n return svgString;\n }\n\n /**\n * Returns source of an image\n * @param {Boolean} filtered indicates if the src is needed for svg\n * @return {String} Source of an image\n */\n getSrc(filtered?: boolean): string {\n const element = filtered ? this._element : this._originalElement;\n if (element) {\n if ((element as HTMLCanvasElement).toDataURL) {\n return (element as HTMLCanvasElement).toDataURL();\n }\n\n if (this.srcFromAttribute) {\n return element.getAttribute('src') || '';\n } else {\n return (element as HTMLImageElement).src;\n }\n } else {\n return this.src || '';\n }\n }\n\n /**\n * Alias for getSrc\n * @param filtered\n * @deprecated\n */\n getSvgSrc(filtered?: boolean) {\n return this.getSrc(filtered);\n }\n\n /**\n * Loads and sets source of an image\\\n * **IMPORTANT**: It is recommended to abort loading tasks before calling this method to prevent race conditions and unnecessary networking\n * @param {String} src Source string (URL)\n * @param {LoadImageOptions} [options] Options object\n */\n setSrc(src: string, { crossOrigin, signal }: LoadImageOptions = {}) {\n return loadImage(src, { crossOrigin, signal }).then((img) => {\n typeof crossOrigin !== 'undefined' && this.set({ crossOrigin });\n this.setElement(img);\n });\n }\n\n /**\n * Returns string representation of an instance\n * @return {String} String representation of an instance\n */\n toString() {\n return `#`;\n }\n\n applyResizeFilters() {\n const filter = this.resizeFilter,\n minimumScale = this.minimumScaleTrigger,\n objectScale = this.getTotalObjectScaling(),\n scaleX = objectScale.x,\n scaleY = objectScale.y,\n elementToFilter = this._filteredEl || this._originalElement;\n if (this.group) {\n this.set('dirty', true);\n }\n if (!filter || (scaleX > minimumScale && scaleY > minimumScale)) {\n this._element = elementToFilter;\n this._filterScalingX = 1;\n this._filterScalingY = 1;\n this._lastScaleX = scaleX;\n this._lastScaleY = scaleY;\n return;\n }\n const canvasEl = createCanvasElementFor(elementToFilter),\n { width, height } = elementToFilter;\n this._element = canvasEl;\n this._lastScaleX = filter.scaleX = scaleX;\n this._lastScaleY = filter.scaleY = scaleY;\n getFilterBackend().applyFilters(\n [filter],\n elementToFilter,\n width,\n height,\n this._element,\n );\n this._filterScalingX = canvasEl.width / this._originalElement.width;\n this._filterScalingY = canvasEl.height / this._originalElement.height;\n }\n\n /**\n * Applies filters assigned to this image (from \"filters\" array) or from filter param\n * @param {Array} filters to be applied\n * @param {Boolean} forResizing specify if the filter operation is a resize operation\n */\n applyFilters(\n filters: BaseFilter>[] = this.filters || [],\n ) {\n filters = filters.filter((filter) => filter && !filter.isNeutralState());\n this.set('dirty', true);\n\n // needs to clear out or WEBGL will not resize correctly\n this.removeTexture(`${this.cacheKey}_filtered`);\n\n if (filters.length === 0) {\n this._element = this._originalElement;\n // this is unsafe and needs to be rethinkend\n this._filteredEl = undefined;\n this._filterScalingX = 1;\n this._filterScalingY = 1;\n return;\n }\n\n const imgElement = this._originalElement,\n sourceWidth =\n (imgElement as HTMLImageElement).naturalWidth || imgElement.width,\n sourceHeight =\n (imgElement as HTMLImageElement).naturalHeight || imgElement.height;\n\n if (this._element === this._originalElement) {\n // if the _element a reference to _originalElement\n // we need to create a new element to host the filtered pixels\n const canvasEl = createCanvasElementFor({\n width: sourceWidth,\n height: sourceHeight,\n });\n this._element = canvasEl;\n this._filteredEl = canvasEl;\n } else if (this._filteredEl) {\n // if the _element is it own element,\n // and we also have a _filteredEl, then we clean up _filteredEl\n // and we assign it to _element.\n // in this way we invalidate the eventual old resize filtered element\n this._element = this._filteredEl;\n this._filteredEl\n .getContext('2d')!\n .clearRect(0, 0, sourceWidth, sourceHeight);\n // we also need to resize again at next renderAll, so remove saved _lastScaleX/Y\n this._lastScaleX = 1;\n this._lastScaleY = 1;\n }\n getFilterBackend().applyFilters(\n filters,\n this._originalElement,\n sourceWidth,\n sourceHeight,\n this._element as HTMLCanvasElement,\n this.cacheKey,\n );\n if (\n this._originalElement.width !== this._element.width ||\n this._originalElement.height !== this._element.height\n ) {\n this._filterScalingX = this._element.width / this._originalElement.width;\n this._filterScalingY =\n this._element.height / this._originalElement.height;\n }\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _render(ctx: CanvasRenderingContext2D) {\n ctx.imageSmoothingEnabled = this.imageSmoothing;\n if (this.isMoving !== true && this.resizeFilter && this._needsResize()) {\n this.applyResizeFilters();\n }\n this._stroke(ctx);\n this._renderPaintInOrder(ctx);\n }\n\n /**\n * Paint the cached copy of the object on the target context.\n * it will set the imageSmoothing for the draw operation\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n drawCacheOnCanvas(\n this: TCachedFabricObject,\n ctx: CanvasRenderingContext2D,\n ) {\n ctx.imageSmoothingEnabled = this.imageSmoothing;\n super.drawCacheOnCanvas(ctx);\n }\n\n /**\n * Decide if the FabricImage should cache or not. Create its own cache level\n * needsItsOwnCache should be used when the object drawing method requires\n * a cache step.\n * Generally you do not cache objects in groups because the group outside is cached.\n * This is the special Image version where we would like to avoid caching where possible.\n * Essentially images do not benefit from caching. They may require caching, and in that\n * case we do it. Also caching an image usually ends in a loss of details.\n * A full performance audit should be done.\n * @return {Boolean}\n */\n shouldCache() {\n return this.needsItsOwnCache();\n }\n\n _renderFill(ctx: CanvasRenderingContext2D) {\n const elementToDraw = this._element;\n if (!elementToDraw) {\n return;\n }\n const scaleX = this._filterScalingX,\n scaleY = this._filterScalingY,\n w = this.width,\n h = this.height,\n // crop values cannot be lesser than 0.\n cropX = Math.max(this.cropX, 0),\n cropY = Math.max(this.cropY, 0),\n elWidth =\n (elementToDraw as HTMLImageElement).naturalWidth || elementToDraw.width,\n elHeight =\n (elementToDraw as HTMLImageElement).naturalHeight ||\n elementToDraw.height,\n sX = cropX * scaleX,\n sY = cropY * scaleY,\n // the width height cannot exceed element width/height, starting from the crop offset.\n sW = Math.min(w * scaleX, elWidth - sX),\n sH = Math.min(h * scaleY, elHeight - sY),\n x = -w / 2,\n y = -h / 2,\n maxDestW = Math.min(w, elWidth / scaleX - cropX),\n maxDestH = Math.min(h, elHeight / scaleY - cropY);\n\n elementToDraw &&\n ctx.drawImage(elementToDraw, sX, sY, sW, sH, x, y, maxDestW, maxDestH);\n }\n\n /**\n * needed to check if image needs resize\n * @private\n */\n _needsResize() {\n const scale = this.getTotalObjectScaling();\n return scale.x !== this._lastScaleX || scale.y !== this._lastScaleY;\n }\n\n /**\n * @private\n * @deprecated unused\n */\n _resetWidthHeight() {\n this.set(this.getOriginalSize());\n }\n\n /**\n * @private\n * Set the width and the height of the image object, using the element or the\n * options.\n */\n _setWidthHeight({ width, height }: Partial = {}) {\n const size = this.getOriginalSize();\n this.width = width || size.width;\n this.height = height || size.height;\n }\n\n /**\n * Calculate offset for center and scale factor for the image in order to respect\n * the preserveAspectRatio attribute\n * @private\n */\n parsePreserveAspectRatioAttribute() {\n const pAR = parsePreserveAspectRatioAttribute(\n this.preserveAspectRatio || '',\n ),\n pWidth = this.width,\n pHeight = this.height,\n parsedAttributes = { width: pWidth, height: pHeight };\n let rWidth = this._element.width,\n rHeight = this._element.height,\n scaleX = 1,\n scaleY = 1,\n offsetLeft = 0,\n offsetTop = 0,\n cropX = 0,\n cropY = 0,\n offset;\n\n if (pAR && (pAR.alignX !== NONE || pAR.alignY !== NONE)) {\n if (pAR.meetOrSlice === 'meet') {\n scaleX = scaleY = findScaleToFit(this._element, parsedAttributes);\n offset = (pWidth - rWidth * scaleX) / 2;\n if (pAR.alignX === 'Min') {\n offsetLeft = -offset;\n }\n if (pAR.alignX === 'Max') {\n offsetLeft = offset;\n }\n offset = (pHeight - rHeight * scaleY) / 2;\n if (pAR.alignY === 'Min') {\n offsetTop = -offset;\n }\n if (pAR.alignY === 'Max') {\n offsetTop = offset;\n }\n }\n if (pAR.meetOrSlice === 'slice') {\n scaleX = scaleY = findScaleToCover(this._element, parsedAttributes);\n offset = rWidth - pWidth / scaleX;\n if (pAR.alignX === 'Mid') {\n cropX = offset / 2;\n }\n if (pAR.alignX === 'Max') {\n cropX = offset;\n }\n offset = rHeight - pHeight / scaleY;\n if (pAR.alignY === 'Mid') {\n cropY = offset / 2;\n }\n if (pAR.alignY === 'Max') {\n cropY = offset;\n }\n rWidth = pWidth / scaleX;\n rHeight = pHeight / scaleY;\n }\n } else {\n scaleX = pWidth / rWidth;\n scaleY = pHeight / rHeight;\n }\n return {\n width: rWidth,\n height: rHeight,\n scaleX,\n scaleY,\n offsetLeft,\n offsetTop,\n cropX,\n cropY,\n };\n }\n\n /**\n * List of attribute names to account for when parsing SVG element (used by {@link FabricImage.fromElement})\n * @see {@link http://www.w3.org/TR/SVG/struct.html#ImageElement}\n */\n static ATTRIBUTE_NAMES = [\n ...SHARED_ATTRIBUTES,\n 'x',\n 'y',\n 'width',\n 'height',\n 'preserveAspectRatio',\n 'xlink:href',\n 'href',\n 'crossOrigin',\n 'image-rendering',\n ];\n\n /**\n * Creates an instance of FabricImage from its object representation\n * @param {Object} object Object to create an instance from\n * @param {object} [options] Options object\n * @param {AbortSignal} [options.signal] handle aborting, see https://developer.mozilla.org/en-US/docs/Web/API/AbortController/signal\n * @returns {Promise}\n */\n static fromObject>(\n { filters: f, resizeFilter: rf, src, crossOrigin, type, ...object }: T,\n options?: Abortable,\n ) {\n return Promise.all([\n loadImage(src!, { ...options, crossOrigin }),\n f && enlivenObjects>(f, options),\n // redundant - handled by enlivenObjectEnlivables, but nicely explicit\n rf ? enlivenObjects([rf], options) : [],\n enlivenObjectEnlivables(object, options),\n ]).then(([el, filters = [], [resizeFilter], hydratedProps = {}]) => {\n return new this(el, {\n ...object,\n // TODO: passing src creates a difference between image creation and restoring from JSON\n src,\n filters,\n resizeFilter,\n ...hydratedProps,\n });\n });\n }\n\n /**\n * Creates an instance of Image from an URL string\n * @param {String} url URL to create an image from\n * @param {LoadImageOptions} [options] Options object\n * @returns {Promise}\n */\n static fromURL>(\n url: string,\n { crossOrigin = null, signal }: LoadImageOptions = {},\n imageOptions?: T,\n ): Promise {\n return loadImage(url, { crossOrigin, signal }).then(\n (img) => new this(img, imageOptions),\n );\n }\n\n /**\n * Returns {@link FabricImage} instance from an SVG element\n * @param {HTMLElement} element Element to parse\n * @param {Object} [options] Options object\n * @param {AbortSignal} [options.signal] handle aborting, see https://developer.mozilla.org/en-US/docs/Web/API/AbortController/signal\n * @param {Function} callback Callback to execute when Image object is created\n */\n static async fromElement(\n element: HTMLElement,\n options: Abortable = {},\n cssRules?: CSSRules,\n ) {\n const parsedAttributes = parseAttributes(\n element,\n this.ATTRIBUTE_NAMES,\n cssRules,\n );\n return this.fromURL(\n parsedAttributes['xlink:href'] || parsedAttributes['href'],\n options,\n parsedAttributes,\n ).catch((err) => {\n log('log', 'Unable to parse Image', err);\n return null;\n });\n }\n}\n\nclassRegistry.setClass(FabricImage);\nclassRegistry.setSVGClass(FabricImage);\n","import { svgNS } from './constants';\nimport {\n parsePreserveAspectRatioAttribute,\n parseUnit,\n} from '../util/misc/svgParsing';\nimport { svgViewBoxElementsRegEx, reViewBoxAttrValue } from './constants';\nimport { NONE } from '../constants';\n\nexport type ParsedViewboxTransform = Partial<{\n width: number;\n height: number;\n minX: number;\n minY: number;\n viewBoxWidth: number;\n viewBoxHeight: number;\n}>;\n\n/**\n * Add a element that envelop all child elements and makes the viewbox transformMatrix descend on all elements\n */\nexport function applyViewboxTransform(\n element: Element,\n): ParsedViewboxTransform {\n if (!svgViewBoxElementsRegEx.test(element.nodeName)) {\n return {};\n }\n const viewBoxAttr: string | null = element.getAttribute('viewBox');\n let scaleX = 1;\n let scaleY = 1;\n let minX = 0;\n let minY = 0;\n let matrix;\n let el;\n const widthAttr = element.getAttribute('width');\n const heightAttr = element.getAttribute('height');\n const x = element.getAttribute('x') || 0;\n const y = element.getAttribute('y') || 0;\n const goodViewbox = viewBoxAttr && reViewBoxAttrValue.test(viewBoxAttr);\n const missingViewBox = !goodViewbox;\n const missingDimAttr =\n !widthAttr || !heightAttr || widthAttr === '100%' || heightAttr === '100%';\n\n let translateMatrix = '';\n let widthDiff = 0;\n let heightDiff = 0;\n\n if (missingViewBox) {\n if (\n (x || y) &&\n element.parentNode &&\n element.parentNode.nodeName !== '#document'\n ) {\n translateMatrix =\n ' translate(' + parseUnit(x || '0') + ' ' + parseUnit(y || '0') + ') ';\n matrix = (element.getAttribute('transform') || '') + translateMatrix;\n element.setAttribute('transform', matrix);\n element.removeAttribute('x');\n element.removeAttribute('y');\n }\n }\n\n if (missingViewBox && missingDimAttr) {\n return {\n width: 0,\n height: 0,\n };\n }\n\n const parsedDim: ParsedViewboxTransform = {\n width: 0,\n height: 0,\n };\n\n if (missingViewBox) {\n parsedDim.width = parseUnit(widthAttr!);\n parsedDim.height = parseUnit(heightAttr!);\n // set a transform for elements that have x y and are inner(only) SVGs\n return parsedDim;\n }\n\n const pasedViewBox = viewBoxAttr.match(reViewBoxAttrValue)!;\n minX = -parseFloat(pasedViewBox[1]);\n minY = -parseFloat(pasedViewBox[2]);\n const viewBoxWidth = parseFloat(pasedViewBox[3]);\n const viewBoxHeight = parseFloat(pasedViewBox[4]);\n parsedDim.minX = minX;\n parsedDim.minY = minY;\n parsedDim.viewBoxWidth = viewBoxWidth;\n parsedDim.viewBoxHeight = viewBoxHeight;\n if (!missingDimAttr) {\n parsedDim.width = parseUnit(widthAttr);\n parsedDim.height = parseUnit(heightAttr);\n scaleX = parsedDim.width / viewBoxWidth;\n scaleY = parsedDim.height / viewBoxHeight;\n } else {\n parsedDim.width = viewBoxWidth;\n parsedDim.height = viewBoxHeight;\n }\n\n // default is to preserve aspect ratio\n const preserveAspectRatio = parsePreserveAspectRatioAttribute(\n element.getAttribute('preserveAspectRatio') || '',\n );\n if (preserveAspectRatio.alignX !== NONE) {\n //translate all container for the effect of Mid, Min, Max\n if (preserveAspectRatio.meetOrSlice === 'meet') {\n scaleY = scaleX = scaleX > scaleY ? scaleY : scaleX;\n // calculate additional translation to move the viewbox\n }\n if (preserveAspectRatio.meetOrSlice === 'slice') {\n scaleY = scaleX = scaleX > scaleY ? scaleX : scaleY;\n // calculate additional translation to move the viewbox\n }\n widthDiff = parsedDim.width - viewBoxWidth * scaleX;\n heightDiff = parsedDim.height - viewBoxHeight * scaleX;\n if (preserveAspectRatio.alignX === 'Mid') {\n widthDiff /= 2;\n }\n if (preserveAspectRatio.alignY === 'Mid') {\n heightDiff /= 2;\n }\n if (preserveAspectRatio.alignX === 'Min') {\n widthDiff = 0;\n }\n if (preserveAspectRatio.alignY === 'Min') {\n heightDiff = 0;\n }\n }\n\n if (\n scaleX === 1 &&\n scaleY === 1 &&\n minX === 0 &&\n minY === 0 &&\n x === 0 &&\n y === 0\n ) {\n return parsedDim;\n }\n if ((x || y) && element.parentNode!.nodeName !== '#document') {\n translateMatrix =\n ' translate(' + parseUnit(x || '0') + ' ' + parseUnit(y || '0') + ') ';\n }\n\n matrix =\n translateMatrix +\n ' matrix(' +\n scaleX +\n ' 0' +\n ' 0 ' +\n scaleY +\n ' ' +\n (minX * scaleX + widthDiff) +\n ' ' +\n (minY * scaleY + heightDiff) +\n ') ';\n // seems unused.\n // parsedDim.viewboxTransform = parseTransformAttribute(matrix);\n if (element.nodeName === 'svg') {\n el = element.ownerDocument.createElementNS(svgNS, 'g');\n // element.firstChild != null\n while (element.firstChild) {\n el.appendChild(element.firstChild);\n }\n element.appendChild(el);\n } else {\n el = element;\n el.removeAttribute('x');\n el.removeAttribute('y');\n matrix = el.getAttribute('transform') + matrix;\n }\n el.setAttribute('transform', matrix);\n return parsedDim;\n}\n","export const getTagName = (node: Element) => node.tagName.replace('svg:', '');\n","import { svgInvalidAncestors } from './constants';\nimport { getSvgRegex } from './getSvgRegex';\nimport { getTagName } from './getTagName';\n\nconst svgInvalidAncestorsRegEx = getSvgRegex(svgInvalidAncestors);\n\nexport function hasInvalidAncestor(element: Element) {\n let _element: Element | null = element;\n while (_element && (_element = _element.parentElement)) {\n if (\n _element &&\n _element.nodeName &&\n svgInvalidAncestorsRegEx.test(getTagName(_element)) &&\n !_element.getAttribute('instantiated_by_use')\n ) {\n return true;\n }\n }\n return false;\n}\n","export function getMultipleNodes(\n doc: Document,\n nodeNames: string[],\n): Element[] {\n let nodeName,\n nodeArray: Element[] = [],\n nodeList,\n i,\n len;\n for (i = 0, len = nodeNames.length; i < len; i++) {\n nodeName = nodeNames[i];\n nodeList = doc.getElementsByTagNameNS(\n 'http://www.w3.org/2000/svg',\n nodeName,\n );\n nodeArray = nodeArray.concat(Array.from(nodeList));\n }\n return nodeArray;\n}\n","const gradientsAttrs = [\n 'gradientTransform',\n 'x1',\n 'x2',\n 'y1',\n 'y2',\n 'gradientUnits',\n 'cx',\n 'cy',\n 'r',\n 'fx',\n 'fy',\n];\nconst xlinkAttr = 'xlink:href';\n\nexport function recursivelyParseGradientsXlink(\n doc: Document,\n gradient: Element,\n) {\n const xLink = gradient.getAttribute(xlinkAttr)?.slice(1) || '',\n referencedGradient = doc.getElementById(xLink);\n if (referencedGradient && referencedGradient.getAttribute(xlinkAttr)) {\n recursivelyParseGradientsXlink(doc, referencedGradient as Element);\n }\n if (referencedGradient) {\n gradientsAttrs.forEach((attr) => {\n const value = referencedGradient.getAttribute(attr);\n if (!gradient.hasAttribute(attr) && value) {\n gradient.setAttribute(attr, value);\n }\n });\n if (!gradient.children.length) {\n const referenceClone = referencedGradient.cloneNode(true);\n while (referenceClone.firstChild) {\n gradient.appendChild(referenceClone.firstChild);\n }\n }\n }\n gradient.removeAttribute(xlinkAttr);\n}\n","import { getMultipleNodes } from './getMultipleNodes';\nimport { recursivelyParseGradientsXlink } from './recursivelyParseGradientsXlink';\n\nconst tagArray = [\n 'linearGradient',\n 'radialGradient',\n 'svg:linearGradient',\n 'svg:radialGradient',\n];\n\n/**\n * Parses an SVG document, returning all of the gradient declarations found in it\n * @param {SVGDocument} doc SVG document to parse\n * @return {Object} Gradient definitions; key corresponds to element id, value -- to gradient definition element\n */\nexport function getGradientDefs(\n doc: Document,\n): Record {\n const elList = getMultipleNodes(doc, tagArray);\n const gradientDefs: Record = {};\n let j = elList.length;\n while (j--) {\n const el = elList[j];\n if (el.getAttribute('xlink:href')) {\n recursivelyParseGradientsXlink(doc, el);\n }\n const id = el.getAttribute('id');\n if (id) {\n gradientDefs[id] = el as SVGGradientElement;\n }\n }\n return gradientDefs;\n}\n","import { Gradient } from '../gradient/Gradient';\nimport { Group } from '../shapes/Group';\nimport { FabricImage } from '../shapes/Image';\nimport { classRegistry } from '../ClassRegistry';\nimport {\n invertTransform,\n multiplyTransformMatrices,\n qrDecompose,\n} from '../util/misc/matrix';\nimport { removeTransformMatrixForSvgParsing } from '../util/transform_matrix_removal';\nimport type { FabricObject } from '../shapes/Object/FabricObject';\nimport { Point } from '../Point';\nimport { CENTER, FILL, STROKE } from '../constants';\nimport { getGradientDefs } from './getGradientDefs';\nimport { getCSSRules } from './getCSSRules';\nimport type { LoadImageOptions } from '../util';\nimport type { CSSRules, TSvgReviverCallback } from './typedefs';\nimport type { ParsedViewboxTransform } from './applyViewboxTransform';\nimport type { SVGOptions } from '../gradient';\nimport { getTagName } from './getTagName';\nimport { parseTransformAttribute } from './parseTransformAttribute';\n\nconst findTag = (el: Element) =>\n classRegistry.getSVGClass(getTagName(el).toLowerCase());\n\ntype StorageType = {\n fill: SVGGradientElement;\n stroke: SVGGradientElement;\n clipPath: Element[];\n};\n\ntype NotParsedFabricObject = FabricObject & {\n fill: string;\n stroke: string;\n clipPath?: string;\n clipRule?: CanvasFillRule;\n};\n\nexport class ElementsParser {\n declare elements: Element[];\n declare options: LoadImageOptions & ParsedViewboxTransform;\n declare reviver?: TSvgReviverCallback;\n declare regexUrl: RegExp;\n declare doc: Document;\n declare clipPaths: Record;\n declare gradientDefs: Record;\n declare cssRules: CSSRules;\n\n constructor(\n elements: Element[],\n options: LoadImageOptions & ParsedViewboxTransform,\n reviver: TSvgReviverCallback | undefined,\n doc: Document,\n clipPaths: Record,\n ) {\n this.elements = elements;\n this.options = options;\n this.reviver = reviver;\n this.regexUrl = /^url\\(['\"]?#([^'\"]+)['\"]?\\)/g;\n this.doc = doc;\n this.clipPaths = clipPaths;\n this.gradientDefs = getGradientDefs(doc);\n this.cssRules = getCSSRules(doc);\n }\n\n parse(): Promise> {\n return Promise.all(\n this.elements.map((element) => this.createObject(element)),\n );\n }\n\n async createObject(el: Element): Promise {\n const klass = findTag(el);\n if (klass) {\n const obj: NotParsedFabricObject = await klass.fromElement(\n el,\n this.options,\n this.cssRules,\n );\n this.resolveGradient(obj, el, FILL);\n this.resolveGradient(obj, el, STROKE);\n if (obj instanceof FabricImage && obj._originalElement) {\n removeTransformMatrixForSvgParsing(\n obj,\n obj.parsePreserveAspectRatioAttribute(),\n );\n } else {\n removeTransformMatrixForSvgParsing(obj);\n }\n await this.resolveClipPath(obj, el);\n this.reviver && this.reviver(el, obj);\n return obj;\n }\n return null;\n }\n\n extractPropertyDefinition(\n obj: NotParsedFabricObject,\n property: 'fill' | 'stroke' | 'clipPath',\n storage: Record,\n ): StorageType[typeof property] | undefined {\n const value = obj[property]!,\n regex = this.regexUrl;\n if (!regex.test(value)) {\n return undefined;\n }\n // verify: can we remove the 'g' flag? and remove lastIndex changes?\n regex.lastIndex = 0;\n // we passed the regex test, so we know is not null;\n const id = regex.exec(value)![1];\n regex.lastIndex = 0;\n // @todo fix this\n return storage[id];\n }\n\n resolveGradient(\n obj: NotParsedFabricObject,\n el: Element,\n property: 'fill' | 'stroke',\n ) {\n const gradientDef = this.extractPropertyDefinition(\n obj,\n property,\n this.gradientDefs,\n ) as SVGGradientElement;\n if (gradientDef) {\n const opacityAttr = el.getAttribute(property + '-opacity');\n const gradient = Gradient.fromElement(gradientDef, obj, {\n ...this.options,\n opacity: opacityAttr,\n } as SVGOptions);\n obj.set(property, gradient);\n }\n }\n\n // TODO: resolveClipPath could be run once per clippath with minor work per object.\n // is a refactor that i m not sure is worth on this code\n async resolveClipPath(\n obj: NotParsedFabricObject,\n usingElement: Element,\n exactOwner?: Element,\n ) {\n const clipPathElements = this.extractPropertyDefinition(\n obj,\n 'clipPath',\n this.clipPaths,\n ) as Element[];\n if (clipPathElements) {\n const objTransformInv = invertTransform(obj.calcTransformMatrix());\n const clipPathTag = clipPathElements[0].parentElement!;\n let clipPathOwner = usingElement;\n while (\n !exactOwner &&\n clipPathOwner.parentElement &&\n clipPathOwner.getAttribute('clip-path') !== obj.clipPath\n ) {\n clipPathOwner = clipPathOwner.parentElement;\n }\n // move the clipPath tag as sibling to the real element that is using it\n clipPathOwner.parentElement!.appendChild(clipPathTag);\n\n // this multiplication order could be opposite.\n // but i don't have an svg to test it\n // at the first SVG that has a transform on both places and is misplaced\n // try to invert this multiplication order\n const finalTransform = parseTransformAttribute(\n `${clipPathOwner.getAttribute('transform') || ''} ${\n clipPathTag.getAttribute('originalTransform') || ''\n }`,\n );\n\n clipPathTag.setAttribute(\n 'transform',\n `matrix(${finalTransform.join(',')})`,\n );\n\n const container = await Promise.all(\n clipPathElements.map((clipPathElement) => {\n return findTag(clipPathElement)\n .fromElement(clipPathElement, this.options, this.cssRules)\n .then((enlivedClippath: NotParsedFabricObject) => {\n removeTransformMatrixForSvgParsing(enlivedClippath);\n enlivedClippath.fillRule = enlivedClippath.clipRule!;\n delete enlivedClippath.clipRule;\n return enlivedClippath;\n });\n }),\n );\n const clipPath =\n container.length === 1 ? container[0] : new Group(container);\n const gTransform = multiplyTransformMatrices(\n objTransformInv,\n clipPath.calcTransformMatrix(),\n );\n if (clipPath.clipPath) {\n await this.resolveClipPath(\n clipPath,\n clipPathOwner,\n // this is tricky.\n // it tries to differentiate from when clipPaths are inherited by outside groups\n // or when are really clipPaths referencing other clipPaths\n clipPathTag.getAttribute('clip-path') ? clipPathOwner : undefined,\n );\n }\n const { scaleX, scaleY, angle, skewX, translateX, translateY } =\n qrDecompose(gTransform);\n clipPath.set({\n flipX: false,\n flipY: false,\n });\n clipPath.set({\n scaleX,\n scaleY,\n angle,\n skewX,\n skewY: 0,\n });\n clipPath.setPositionByOrigin(\n new Point(translateX, translateY),\n CENTER,\n CENTER,\n );\n obj.clipPath = clipPath;\n } else {\n // if clip-path does not resolve to any element, delete the property.\n delete obj.clipPath;\n return;\n }\n }\n}\n","import type { CSSRules } from './typedefs';\n\n/**\n * Returns CSS rules for a given SVG document\n * @param {HTMLElement} doc SVG document to parse\n * @return {Object} CSS rules of this document\n */\nexport function getCSSRules(doc: Document) {\n const styles = doc.getElementsByTagName('style');\n const allRules: CSSRules = {};\n\n // very crude parsing of style contents\n for (let i = 0; i < styles.length; i++) {\n const styleContents = (styles[i].textContent || '').replace(\n // remove comments\n /\\/\\*[\\s\\S]*?\\*\\//g,\n '',\n );\n\n if (styleContents.trim() === '') {\n continue;\n }\n // recovers all the rule in this form `body { style code... }`\n // rules = styleContents.match(/[^{]*\\{[\\s\\S]*?\\}/g);\n styleContents\n .split('}')\n // remove empty rules and remove everything if we didn't split in at least 2 pieces\n .filter((rule, index, array) => array.length > 1 && rule.trim())\n // at this point we have hopefully an array of rules `body { style code... `\n .forEach((rule) => {\n // if there is more than one opening bracket and the rule starts with '@', it is likely\n // a nested at-rule like @media, @supports, @scope, etc. Ignore these as the code below\n // can not handle it.\n if (\n (rule.match(/{/g) || []).length > 1 &&\n rule.trim().startsWith('@')\n ) {\n return;\n }\n\n const match = rule.split('{'),\n ruleObj: Record = {},\n declaration = match[1].trim(),\n propertyValuePairs = declaration.split(';').filter(function (pair) {\n return pair.trim();\n });\n\n for (let j = 0; j < propertyValuePairs.length; j++) {\n const pair = propertyValuePairs[j].split(':'),\n property = pair[0].trim(),\n value = pair[1].trim();\n ruleObj[property] = value;\n }\n rule = match[0].trim();\n rule.split(',').forEach((_rule) => {\n _rule = _rule.replace(/^svg/i, '').trim();\n if (_rule === '') {\n return;\n }\n allRules[_rule] = {\n ...(allRules[_rule] || {}),\n ...ruleObj,\n };\n });\n });\n }\n return allRules;\n}\n","import { applyViewboxTransform } from './applyViewboxTransform';\nimport { svgValidTagNamesRegEx } from './constants';\nimport { hasInvalidAncestor } from './hasInvalidAncestor';\nimport { parseUseDirectives } from './parseUseDirectives';\nimport type { SVGParsingOutput, TSvgReviverCallback } from './typedefs';\nimport type { LoadImageOptions } from '../util/misc/objectEnlive';\nimport { ElementsParser } from './elements_parser';\nimport { log, SignalAbortedError } from '../util/internals/console';\nimport { getTagName } from './getTagName';\n\nconst isValidSvgTag = (el: Element) =>\n svgValidTagNamesRegEx.test(getTagName(el));\n\nexport const createEmptyResponse = (): SVGParsingOutput => ({\n objects: [],\n elements: [],\n options: {},\n allElements: [],\n});\n\n/**\n * Parses an SVG document, converts it to an array of corresponding fabric.* instances and passes them to a callback\n * @param {HTMLElement} doc SVG document to parse\n * @param {TSvgParsedCallback} callback Invoked when the parsing is done, with null if parsing wasn't possible with the list of svg nodes.\n * @param {TSvgReviverCallback} [reviver] Extra callback for further parsing of SVG elements, called after each fabric object has been created.\n * Takes as input the original svg element and the generated `FabricObject` as arguments. Used to inspect extra properties not parsed by fabric,\n * or extra custom manipulation\n * @param {Object} [options] Object containing options for parsing\n * @param {String} [options.crossOrigin] crossOrigin setting to use for external resources\n * @param {AbortSignal} [options.signal] handle aborting, see https://developer.mozilla.org/en-US/docs/Web/API/AbortController/signal\n * @return {SVGParsingOutput}\n * {@link SVGParsingOutput} also receives `allElements` array as the last argument. This is the full list of svg nodes available in the document.\n * You may want to use it if you are trying to regroup the objects as they were originally grouped in the SVG. ( This was the reason why it was added )\n */\nexport async function parseSVGDocument(\n doc: Document,\n reviver?: TSvgReviverCallback,\n { crossOrigin, signal }: LoadImageOptions = {},\n): Promise {\n if (signal && signal.aborted) {\n log('log', new SignalAbortedError('parseSVGDocument'));\n // this is an unhappy path, we dont care about speed\n return createEmptyResponse();\n }\n const documentElement = doc.documentElement;\n parseUseDirectives(doc);\n\n const descendants = Array.from(documentElement.getElementsByTagName('*')),\n options = {\n ...applyViewboxTransform(documentElement),\n crossOrigin,\n signal,\n };\n const elements = descendants.filter((el) => {\n applyViewboxTransform(el);\n return isValidSvgTag(el) && !hasInvalidAncestor(el); // http://www.w3.org/TR/SVG/struct.html#DefsElement\n });\n if (!elements || (elements && !elements.length)) {\n return {\n ...createEmptyResponse(),\n options,\n allElements: descendants,\n };\n }\n const localClipPaths: Record = {};\n descendants\n .filter((el) => getTagName(el) === 'clipPath')\n .forEach((el) => {\n el.setAttribute('originalTransform', el.getAttribute('transform') || '');\n const id = el.getAttribute('id')!;\n localClipPaths[id] = Array.from(el.getElementsByTagName('*')).filter(\n (el) => isValidSvgTag(el),\n );\n });\n\n // Precedence of rules: style > class > attribute\n const elementParser = new ElementsParser(\n elements,\n options,\n reviver,\n doc,\n localClipPaths,\n );\n\n const instances = await elementParser.parse();\n\n return {\n objects: instances,\n elements,\n options,\n allElements: descendants,\n };\n}\n","import { svgNS } from './constants';\nimport { getMultipleNodes } from './getMultipleNodes';\nimport { applyViewboxTransform } from './applyViewboxTransform';\nimport { parseStyleString } from './parseStyleString';\n\nexport function parseUseDirectives(doc: Document) {\n const nodelist = getMultipleNodes(doc, ['use', 'svg:use']);\n const skipAttributes = ['x', 'y', 'xlink:href', 'href', 'transform'];\n\n for (const useElement of nodelist) {\n const useAttributes: NamedNodeMap = useElement.attributes;\n\n const useAttrMap: Record = {};\n for (const attr of useAttributes) {\n attr.value && (useAttrMap[attr.name] = attr.value);\n }\n\n const xlink = (useAttrMap['xlink:href'] || useAttrMap.href || '').slice(1);\n\n if (xlink === '') {\n return;\n }\n const referencedElement = doc.getElementById(xlink);\n if (referencedElement === null) {\n // if we can't find the target of the xlink, consider this use tag bad, similar to no xlink\n return;\n }\n let clonedOriginal = referencedElement.cloneNode(true) as Element;\n\n const originalAttributes: NamedNodeMap = clonedOriginal.attributes;\n\n const originalAttrMap: Record = {};\n for (const attr of originalAttributes) {\n attr.value && (originalAttrMap[attr.name] = attr.value);\n }\n\n // Transform attribute needs to be merged in a particular way\n const { x = 0, y = 0, transform = '' } = useAttrMap;\n const currentTrans = `${transform} ${\n originalAttrMap.transform || ''\n } translate(${x}, ${y})`;\n\n applyViewboxTransform(clonedOriginal);\n\n if (/^svg$/i.test(clonedOriginal.nodeName)) {\n // if is an SVG, create a group and apply all the attributes on top of it\n const el3 = clonedOriginal.ownerDocument.createElementNS(svgNS, 'g');\n Object.entries(originalAttrMap).forEach(([name, value]) =>\n el3.setAttributeNS(svgNS, name, value),\n );\n el3.append(...clonedOriginal.childNodes);\n clonedOriginal = el3;\n }\n\n for (const attr of useAttributes) {\n if (!attr) {\n continue;\n }\n const { name, value } = attr;\n if (skipAttributes.includes(name)) {\n continue;\n }\n\n if (name === 'style') {\n // when use has a style, merge the two styles, with the ref being priority (not use)\n // priority is by feature. an attribute for fill on the original element\n // will overwrite the fill in style or attribute for tha use\n const styleRecord: Record = {};\n parseStyleString(value, styleRecord);\n // cleanup styleRecord from attributes of original\n Object.entries(originalAttrMap).forEach(([name, value]) => {\n styleRecord[name] = value;\n });\n // now we can put in the style of the original that will overwrite the original attributes\n parseStyleString(originalAttrMap.style || '', styleRecord);\n const mergedStyles = Object.entries(styleRecord)\n .map((entry) => entry.join(':'))\n .join(';');\n clonedOriginal.setAttribute(name, mergedStyles);\n } else {\n // set the attribute from use element only if the original does not have it already\n !originalAttrMap[name] && clonedOriginal.setAttribute(name, value);\n }\n }\n\n clonedOriginal.setAttribute('transform', currentTrans);\n clonedOriginal.setAttribute('instantiated_by_use', '1');\n clonedOriginal.removeAttribute('id');\n useElement.parentNode!.replaceChild(clonedOriginal, useElement);\n }\n}\n","import { getFabricWindow } from '../env';\nimport type { LoadImageOptions } from '../util/misc/objectEnlive';\nimport { parseSVGDocument } from './parseSVGDocument';\nimport type { SVGParsingOutput, TSvgReviverCallback } from './typedefs';\n\n/**\n * Takes string corresponding to an SVG document, and parses it into a set of fabric objects\n * @param {String} string representing the svg\n * @param {TSvgParsedCallback} callback Invoked when the parsing is done, with null if parsing wasn't possible with the list of svg nodes.\n * {@link TSvgParsedCallback} also receives `allElements` array as the last argument. This is the full list of svg nodes available in the document.\n * You may want to use it if you are trying to regroup the objects as they were originally grouped in the SVG. ( This was the reason why it was added )\n * @param {TSvgReviverCallback} [reviver] Extra callback for further parsing of SVG elements, called after each fabric object has been created.\n * Takes as input the original svg element and the generated `FabricObject` as arguments. Used to inspect extra properties not parsed by fabric,\n * or extra custom manipulation\n * @param {Object} [options] Object containing options for parsing\n * @param {String} [options.crossOrigin] crossOrigin setting to use for external resources\n * @param {AbortSignal} [options.signal] handle aborting, see https://developer.mozilla.org/en-US/docs/Web/API/AbortController/signal\n */\nexport function loadSVGFromString(\n string: string,\n reviver?: TSvgReviverCallback,\n options?: LoadImageOptions,\n): Promise {\n const parser = new (getFabricWindow().DOMParser)(),\n // should we use `image/svg+xml` here?\n doc = parser.parseFromString(string.trim(), 'text/xml');\n return parseSVGDocument(doc, reviver, options);\n}\n","import { createEmptyResponse } from './parseSVGDocument';\nimport { loadSVGFromString } from './loadSVGFromString';\nimport type { SVGParsingOutput, TSvgReviverCallback } from './typedefs';\nimport type { LoadImageOptions } from '../util/misc/objectEnlive';\nimport { FabricError } from '../util/internals/console';\n\n/**\n * Takes url corresponding to an SVG document, and parses it into a set of fabric objects.\n * Note that SVG is fetched via fetch API, so it needs to conform to SOP (Same Origin Policy)\n * @param {string} url where the SVG is\n * @param {TSvgParsedCallback} callback Invoked when the parsing is done, with null if parsing wasn't possible with the list of svg nodes.\n * {@link TSvgParsedCallback} also receives `allElements` array as the last argument. This is the full list of svg nodes available in the document.\n * You may want to use it if you are trying to regroup the objects as they were originally grouped in the SVG. ( This was the reason why it was added )\n * @param {TSvgReviverCallback} [reviver] Extra callback for further parsing of SVG elements, called after each fabric object has been created.\n * Takes as input the original svg element and the generated `FabricObject` as arguments. Used to inspect extra properties not parsed by fabric,\n * or extra custom manipulation\n * @param {Object} [options] Object containing options for parsing\n * @param {String} [options.crossOrigin] crossOrigin setting to use for external resources\n * @param {AbortSignal} [options.signal] handle aborting, see https://developer.mozilla.org/en-US/docs/Web/API/AbortController/signal\n */\nexport function loadSVGFromURL(\n url: string,\n reviver?: TSvgReviverCallback,\n options: LoadImageOptions = {},\n): Promise {\n return fetch(url.replace(/^\\n\\s*/, '').trim(), {\n signal: options.signal,\n })\n .then((response) => {\n if (!response.ok) {\n throw new FabricError(`HTTP error! status: ${response.status}`);\n }\n return response.text();\n })\n .then((svgText) => {\n return loadSVGFromString(svgText, reviver, options);\n })\n .catch(() => {\n // this is an unhappy path, we dont care about speed\n return createEmptyResponse();\n });\n}\n","import { Point } from '../Point';\nimport { Control } from './Control';\nimport type { TMat2D } from '../typedefs';\nimport type { Polyline } from '../shapes/Polyline';\nimport { multiplyTransformMatrices } from '../util/misc/matrix';\nimport type {\n TModificationEvents,\n TPointerEvent,\n Transform,\n TransformActionHandler,\n} from '../EventTypeDefs';\nimport { wrapWithFireEvent } from './wrapWithFireEvent';\nimport { sendPointToPlane } from '../util/misc/planeChange';\nimport { MODIFY_POLY } from '../constants';\n\nconst ACTION_NAME: TModificationEvents = MODIFY_POLY;\n\ntype TTransformAnchor = Transform & { pointIndex: number };\n\n/**\n * This function locates the controls.\n * It'll be used both for drawing and for interaction.\n */\nexport const createPolyPositionHandler = (pointIndex: number) => {\n return function (dim: Point, finalMatrix: TMat2D, polyObject: Polyline) {\n const { points, pathOffset } = polyObject;\n return new Point(points[pointIndex])\n .subtract(pathOffset)\n .transform(\n multiplyTransformMatrices(\n polyObject.getViewportTransform(),\n polyObject.calcTransformMatrix(),\n ),\n );\n };\n};\n\n/**\n * This function defines what the control does.\n * It'll be called on every mouse move after a control has been clicked and is being dragged.\n * The function receives as argument the mouse event, the current transform object\n * and the current position in canvas coordinate `transform.target` is a reference to the\n * current object being transformed.\n */\nexport const polyActionHandler = (\n eventData: TPointerEvent,\n transform: TTransformAnchor,\n x: number,\n y: number,\n) => {\n const { target, pointIndex } = transform;\n const poly = target as Polyline;\n const mouseLocalPosition = sendPointToPlane(\n new Point(x, y),\n undefined,\n poly.calcOwnMatrix(),\n );\n\n poly.points[pointIndex] = mouseLocalPosition.add(poly.pathOffset);\n poly.setDimensions();\n poly.set('dirty', true);\n return true;\n};\n\n/**\n * Keep the polygon in the same position when we change its `width`/`height`/`top`/`left`.\n */\nexport const factoryPolyActionHandler = (\n pointIndex: number,\n fn: TransformActionHandler,\n) => {\n return function (\n eventData: TPointerEvent,\n transform: Transform,\n x: number,\n y: number,\n ) {\n const poly = transform.target as Polyline,\n anchorPoint = new Point(\n poly.points[(pointIndex > 0 ? pointIndex : poly.points.length) - 1],\n ),\n anchorPointInParentPlane = anchorPoint\n .subtract(poly.pathOffset)\n .transform(poly.calcOwnMatrix()),\n actionPerformed = fn(eventData, { ...transform, pointIndex }, x, y);\n\n const newAnchorPointInParentPlane = anchorPoint\n .subtract(poly.pathOffset)\n .transform(poly.calcOwnMatrix());\n\n const diff = newAnchorPointInParentPlane.subtract(anchorPointInParentPlane);\n poly.left -= diff.x;\n poly.top -= diff.y;\n\n return actionPerformed;\n };\n};\n\nexport const createPolyActionHandler = (pointIndex: number) =>\n wrapWithFireEvent(\n ACTION_NAME,\n factoryPolyActionHandler(pointIndex, polyActionHandler),\n );\n\nexport function createPolyControls(\n poly: Polyline,\n options?: Partial,\n): Record;\nexport function createPolyControls(\n numOfControls: number,\n options?: Partial,\n): Record;\nexport function createPolyControls(\n arg0: number | Polyline,\n options: Partial = {},\n) {\n const controls = {} as Record;\n for (\n let idx = 0;\n idx < (typeof arg0 === 'number' ? arg0 : arg0.points.length);\n idx++\n ) {\n controls[`p${idx}`] = new Control({\n actionName: ACTION_NAME,\n positionHandler: createPolyPositionHandler(idx),\n actionHandler: createPolyActionHandler(idx),\n ...options,\n });\n }\n return controls;\n}\n","import { Point } from '../Point';\nimport { Control } from './Control';\nimport type { TMat2D } from '../typedefs';\nimport type { Path } from '../shapes/Path';\nimport { multiplyTransformMatrices } from '../util/misc/matrix';\nimport type {\n TModificationEvents,\n TPointerEvent,\n Transform,\n} from '../EventTypeDefs';\nimport { sendPointToPlane } from '../util/misc/planeChange';\nimport type { TSimpleParseCommandType } from '../util/path/typedefs';\nimport type { ControlRenderingStyleOverride } from './controlRendering';\nimport { fireEvent } from './fireEvent';\nimport { commonEventInfo } from './util';\n\nconst ACTION_NAME: TModificationEvents = 'modifyPath' as const;\n\ntype TTransformAnchor = Transform;\n\nexport type PathPointControlStyle = {\n controlFill?: string;\n controlStroke?: string;\n connectionDashArray?: number[];\n};\n\nconst calcPathPointPosition = (\n pathObject: Path,\n commandIndex: number,\n pointIndex: number,\n) => {\n const { path, pathOffset } = pathObject;\n const command = path[commandIndex];\n return new Point(\n (command[pointIndex] as number) - pathOffset.x,\n (command[pointIndex + 1] as number) - pathOffset.y,\n ).transform(\n multiplyTransformMatrices(\n pathObject.getViewportTransform(),\n pathObject.calcTransformMatrix(),\n ),\n );\n};\n\nconst movePathPoint = (\n pathObject: Path,\n x: number,\n y: number,\n commandIndex: number,\n pointIndex: number,\n) => {\n const { path, pathOffset } = pathObject;\n\n const anchorCommand =\n path[(commandIndex > 0 ? commandIndex : path.length) - 1];\n const anchorPoint = new Point(\n anchorCommand[pointIndex] as number,\n anchorCommand[pointIndex + 1] as number,\n );\n\n const anchorPointInParentPlane = anchorPoint\n .subtract(pathOffset)\n .transform(pathObject.calcOwnMatrix());\n\n const mouseLocalPosition = sendPointToPlane(\n new Point(x, y),\n undefined,\n pathObject.calcOwnMatrix(),\n );\n\n path[commandIndex][pointIndex] = mouseLocalPosition.x + pathOffset.x;\n path[commandIndex][pointIndex + 1] = mouseLocalPosition.y + pathOffset.y;\n pathObject.setDimensions();\n\n const newAnchorPointInParentPlane = anchorPoint\n .subtract(pathObject.pathOffset)\n .transform(pathObject.calcOwnMatrix());\n\n const diff = newAnchorPointInParentPlane.subtract(anchorPointInParentPlane);\n pathObject.left -= diff.x;\n pathObject.top -= diff.y;\n pathObject.set('dirty', true);\n return true;\n};\n\n/**\n * This function locates the controls.\n * It'll be used both for drawing and for interaction.\n */\nfunction pathPositionHandler(\n this: PathPointControl,\n dim: Point,\n finalMatrix: TMat2D,\n pathObject: Path,\n) {\n const { commandIndex, pointIndex } = this;\n return calcPathPointPosition(pathObject, commandIndex, pointIndex);\n}\n\n/**\n * This function defines what the control does.\n * It'll be called on every mouse move after a control has been clicked and is being dragged.\n * The function receives as argument the mouse event, the current transform object\n * and the current position in canvas coordinate `transform.target` is a reference to the\n * current object being transformed.\n */\nfunction pathActionHandler(\n this: PathPointControl,\n eventData: TPointerEvent,\n transform: TTransformAnchor,\n x: number,\n y: number,\n) {\n const { target } = transform;\n const { commandIndex, pointIndex } = this;\n const actionPerformed = movePathPoint(\n target as Path,\n x,\n y,\n commandIndex,\n pointIndex,\n );\n if (actionPerformed) {\n fireEvent(this.actionName as TModificationEvents, {\n ...commonEventInfo(eventData, transform, x, y),\n commandIndex,\n pointIndex,\n });\n }\n return actionPerformed;\n}\n\nconst indexFromPrevCommand = (previousCommandType: TSimpleParseCommandType) =>\n previousCommandType === 'C' ? 5 : previousCommandType === 'Q' ? 3 : 1;\n\nclass PathPointControl extends Control {\n declare commandIndex: number;\n declare pointIndex: number;\n declare controlFill: string;\n declare controlStroke: string;\n constructor(options?: Partial) {\n super(options);\n }\n\n render(\n ctx: CanvasRenderingContext2D,\n left: number,\n top: number,\n styleOverride: ControlRenderingStyleOverride | undefined,\n fabricObject: Path,\n ) {\n const overrides: ControlRenderingStyleOverride = {\n ...styleOverride,\n cornerColor: this.controlFill,\n cornerStrokeColor: this.controlStroke,\n transparentCorners: !this.controlFill,\n };\n super.render(ctx, left, top, overrides, fabricObject);\n }\n}\n\nclass PathControlPointControl extends PathPointControl {\n declare connectionDashArray?: number[];\n declare connectToCommandIndex: number;\n declare connectToPointIndex: number;\n constructor(options?: Partial) {\n super(options);\n }\n\n render(\n this: PathControlPointControl,\n ctx: CanvasRenderingContext2D,\n left: number,\n top: number,\n styleOverride: ControlRenderingStyleOverride | undefined,\n fabricObject: Path,\n ) {\n const { path } = fabricObject;\n const {\n commandIndex,\n pointIndex,\n connectToCommandIndex,\n connectToPointIndex,\n } = this;\n ctx.save();\n ctx.strokeStyle = this.controlStroke;\n if (this.connectionDashArray) {\n ctx.setLineDash(this.connectionDashArray);\n }\n const [commandType] = path[commandIndex];\n const point = calcPathPointPosition(\n fabricObject,\n connectToCommandIndex,\n connectToPointIndex,\n );\n\n if (commandType === 'Q') {\n // one control point connects to 2 points\n const point2 = calcPathPointPosition(\n fabricObject,\n commandIndex,\n pointIndex + 2,\n );\n ctx.moveTo(point2.x, point2.y);\n ctx.lineTo(left, top);\n } else {\n ctx.moveTo(left, top);\n }\n ctx.lineTo(point.x, point.y);\n ctx.stroke();\n ctx.restore();\n\n super.render(ctx, left, top, styleOverride, fabricObject);\n }\n}\n\nconst createControl = (\n commandIndexPos: number,\n pointIndexPos: number,\n isControlPoint: boolean,\n options: Partial & {\n controlPointStyle?: PathPointControlStyle;\n pointStyle?: PathPointControlStyle;\n },\n connectToCommandIndex?: number,\n connectToPointIndex?: number,\n) =>\n new (isControlPoint ? PathControlPointControl : PathPointControl)({\n commandIndex: commandIndexPos,\n pointIndex: pointIndexPos,\n actionName: ACTION_NAME,\n positionHandler: pathPositionHandler,\n actionHandler: pathActionHandler,\n connectToCommandIndex,\n connectToPointIndex,\n ...options,\n ...(isControlPoint ? options.controlPointStyle : options.pointStyle),\n } as Partial);\n\nexport function createPathControls(\n path: Path,\n options: Partial & {\n controlPointStyle?: PathPointControlStyle;\n pointStyle?: PathPointControlStyle;\n } = {},\n): Record {\n const controls = {} as Record;\n let previousCommandType: TSimpleParseCommandType = 'M';\n path.path.forEach((command, commandIndex) => {\n const commandType = command[0];\n\n if (commandType !== 'Z') {\n controls[`c_${commandIndex}_${commandType}`] = createControl(\n commandIndex,\n command.length - 2,\n false,\n options,\n );\n }\n switch (commandType) {\n case 'C':\n controls[`c_${commandIndex}_C_CP_1`] = createControl(\n commandIndex,\n 1,\n true,\n options,\n commandIndex - 1,\n indexFromPrevCommand(previousCommandType),\n );\n controls[`c_${commandIndex}_C_CP_2`] = createControl(\n commandIndex,\n 3,\n true,\n options,\n commandIndex,\n 5,\n );\n break;\n case 'Q':\n controls[`c_${commandIndex}_Q_CP_1`] = createControl(\n commandIndex,\n 1,\n true,\n options,\n commandIndex,\n 3,\n );\n break;\n }\n previousCommandType = commandType;\n });\n return controls;\n}\n","import { getFabricWindow } from '../env';\nimport { createCanvasElement, createCanvasElementFor } from '../util/misc/dom';\nimport { WebGLFilterBackend } from './WebGLFilterBackend';\nimport type { TWebGLPipelineState, T2DPipelineState } from './typedefs';\n\nexport const isWebGLPipelineState = (\n options: TWebGLPipelineState | T2DPipelineState,\n): options is TWebGLPipelineState => {\n return (options as TWebGLPipelineState).webgl !== undefined;\n};\n\n/**\n * Pick a method to copy data from GL context to 2d canvas. In some browsers using\n * drawImage should be faster, but is also bugged for a small combination of old hardware\n * and drivers.\n * putImageData is faster than drawImage for that specific operation.\n */\nexport const isPutImageFaster = (width: number, height: number): boolean => {\n const targetCanvas = createCanvasElementFor({ width, height });\n const sourceCanvas = createCanvasElement();\n const gl = sourceCanvas.getContext('webgl')!;\n // eslint-disable-next-line no-undef\n const imageBuffer = new ArrayBuffer(width * height * 4);\n\n const testContext = {\n imageBuffer: imageBuffer,\n } as unknown as Required;\n const testPipelineState = {\n destinationWidth: width,\n destinationHeight: height,\n targetCanvas: targetCanvas,\n } as unknown as TWebGLPipelineState;\n let startTime;\n\n startTime = getFabricWindow().performance.now();\n WebGLFilterBackend.prototype.copyGLTo2D.call(\n testContext,\n gl,\n testPipelineState,\n );\n const drawImageTime = getFabricWindow().performance.now() - startTime;\n\n startTime = getFabricWindow().performance.now();\n WebGLFilterBackend.prototype.copyGLTo2DPutImageData.call(\n testContext,\n gl,\n testPipelineState,\n );\n const putImageDataTime = getFabricWindow().performance.now() - startTime;\n\n return drawImageTime > putImageDataTime;\n};\n","export const highPsourceCode = `precision highp float`;\n\nexport const identityFragmentShader = `\n ${highPsourceCode};\n varying vec2 vTexCoord;\n uniform sampler2D uTexture;\n void main() {\n gl_FragColor = texture2D(uTexture, vTexCoord);\n }`;\n\nexport const vertexSource = `\n attribute vec2 aPosition;\n varying vec2 vTexCoord;\n void main() {\n vTexCoord = aPosition;\n gl_Position = vec4(aPosition * 2.0 - 1.0, 0.0, 1.0);\n }`;\n","import { getEnv } from '../env';\nimport type {\n T2DPipelineState,\n TWebGLAttributeLocationMap,\n TWebGLPipelineState,\n TWebGLProgramCacheItem,\n TWebGLUniformLocationMap,\n} from './typedefs';\nimport { isWebGLPipelineState } from './utils';\nimport {\n highPsourceCode,\n identityFragmentShader,\n vertexSource,\n} from './shaders/baseFilter';\nimport type { Abortable } from '../typedefs';\nimport { FabricError } from '../util/internals/console';\nimport { createCanvasElementFor } from '../util/misc/dom';\n\nconst regex = new RegExp(highPsourceCode, 'g');\n\nexport class BaseFilter<\n Name extends string,\n OwnProps extends Record = object,\n SerializedProps extends Record = OwnProps,\n> {\n /**\n * Filter type\n */\n get type(): Name {\n return (this.constructor as typeof BaseFilter).type as Name;\n }\n\n /**\n * The class type. Used to identify which class this is.\n * This is used for serialization purposes and internally it can be used\n * to identify classes. As a developer you could use `instance of Class`\n * but to avoid importing all the code and blocking tree shaking we try\n * to avoid doing that.\n */\n static type = 'BaseFilter';\n\n /**\n * Contains the uniform locations for the fragment shader.\n * uStepW and uStepH are handled by the BaseFilter, each filter class\n * needs to specify all the one that are needed\n */\n static uniformLocations: string[] = [];\n\n declare static defaults: Record;\n\n /**\n * Constructor\n * @param {Object} [options] Options object\n */\n constructor({\n type,\n ...options\n }: { type?: never } & Partial & Record = {}) {\n Object.assign(\n this,\n (this.constructor as typeof BaseFilter).defaults,\n options,\n );\n }\n\n protected getFragmentSource(): string {\n return identityFragmentShader;\n }\n\n getVertexSource(): string {\n return vertexSource;\n }\n\n /**\n * Compile this filter's shader program.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context to use for shader compilation.\n * @param {String} fragmentSource fragmentShader source for compilation\n * @param {String} vertexSource vertexShader source for compilation\n */\n createProgram(\n gl: WebGLRenderingContext,\n fragmentSource: string = this.getFragmentSource(),\n vertexSource: string = this.getVertexSource(),\n ) {\n const {\n WebGLProbe: { GLPrecision = 'highp' },\n } = getEnv();\n if (GLPrecision !== 'highp') {\n fragmentSource = fragmentSource.replace(\n regex,\n highPsourceCode.replace('highp', GLPrecision),\n );\n }\n const vertexShader = gl.createShader(gl.VERTEX_SHADER);\n const fragmentShader = gl.createShader(gl.FRAGMENT_SHADER);\n const program = gl.createProgram();\n\n if (!vertexShader || !fragmentShader || !program) {\n throw new FabricError(\n 'Vertex, fragment shader or program creation error',\n );\n }\n gl.shaderSource(vertexShader, vertexSource);\n gl.compileShader(vertexShader);\n if (!gl.getShaderParameter(vertexShader, gl.COMPILE_STATUS)) {\n throw new FabricError(\n `Vertex shader compile error for ${this.type}: ${gl.getShaderInfoLog(\n vertexShader,\n )}`,\n );\n }\n\n gl.shaderSource(fragmentShader, fragmentSource);\n gl.compileShader(fragmentShader);\n if (!gl.getShaderParameter(fragmentShader, gl.COMPILE_STATUS)) {\n throw new FabricError(\n `Fragment shader compile error for ${this.type}: ${gl.getShaderInfoLog(\n fragmentShader,\n )}`,\n );\n }\n\n gl.attachShader(program, vertexShader);\n gl.attachShader(program, fragmentShader);\n gl.linkProgram(program);\n if (!gl.getProgramParameter(program, gl.LINK_STATUS)) {\n throw new FabricError(\n `Shader link error for \"${this.type}\" ${gl.getProgramInfoLog(program)}`,\n );\n }\n\n const uniformLocations = this.getUniformLocations(gl, program) || {};\n uniformLocations.uStepW = gl.getUniformLocation(program, 'uStepW');\n uniformLocations.uStepH = gl.getUniformLocation(program, 'uStepH');\n\n return {\n program,\n attributeLocations: this.getAttributeLocations(gl, program),\n uniformLocations,\n };\n }\n\n /**\n * Return a map of attribute names to WebGLAttributeLocation objects.\n *\n * @param {WebGLRenderingContext} gl The canvas context used to compile the shader program.\n * @param {WebGLShaderProgram} program The shader program from which to take attribute locations.\n * @returns {Object} A map of attribute names to attribute locations.\n */\n getAttributeLocations(\n gl: WebGLRenderingContext,\n program: WebGLProgram,\n ): TWebGLAttributeLocationMap {\n return {\n aPosition: gl.getAttribLocation(program, 'aPosition'),\n };\n }\n\n /**\n * Return a map of uniform names to WebGLUniformLocation objects.\n *\n * @param {WebGLRenderingContext} gl The canvas context used to compile the shader program.\n * @param {WebGLShaderProgram} program The shader program from which to take uniform locations.\n * @returns {Object} A map of uniform names to uniform locations.\n */\n getUniformLocations(\n gl: WebGLRenderingContext,\n program: WebGLProgram,\n ): TWebGLUniformLocationMap {\n const locations = (this.constructor as unknown as typeof BaseFilter)\n .uniformLocations;\n\n const uniformLocations: Record = {};\n for (let i = 0; i < locations.length; i++) {\n uniformLocations[locations[i]] = gl.getUniformLocation(\n program,\n locations[i],\n );\n }\n return uniformLocations;\n }\n\n /**\n * Send attribute data from this filter to its shader program on the GPU.\n *\n * @param {WebGLRenderingContext} gl The canvas context used to compile the shader program.\n * @param {Object} attributeLocations A map of shader attribute names to their locations.\n */\n sendAttributeData(\n gl: WebGLRenderingContext,\n attributeLocations: Record,\n aPositionData: Float32Array,\n ) {\n const attributeLocation = attributeLocations.aPosition;\n const buffer = gl.createBuffer();\n gl.bindBuffer(gl.ARRAY_BUFFER, buffer);\n gl.enableVertexAttribArray(attributeLocation);\n gl.vertexAttribPointer(attributeLocation, 2, gl.FLOAT, false, 0, 0);\n gl.bufferData(gl.ARRAY_BUFFER, aPositionData, gl.STATIC_DRAW);\n }\n\n _setupFrameBuffer(options: TWebGLPipelineState) {\n const gl = options.context;\n if (options.passes > 1) {\n const width = options.destinationWidth;\n const height = options.destinationHeight;\n if (options.sourceWidth !== width || options.sourceHeight !== height) {\n gl.deleteTexture(options.targetTexture);\n options.targetTexture = options.filterBackend.createTexture(\n gl,\n width,\n height,\n );\n }\n gl.framebufferTexture2D(\n gl.FRAMEBUFFER,\n gl.COLOR_ATTACHMENT0,\n gl.TEXTURE_2D,\n options.targetTexture,\n 0,\n );\n } else {\n // draw last filter on canvas and not to framebuffer.\n gl.bindFramebuffer(gl.FRAMEBUFFER, null);\n gl.finish();\n }\n }\n\n _swapTextures(options: TWebGLPipelineState) {\n options.passes--;\n options.pass++;\n const temp = options.targetTexture;\n options.targetTexture = options.sourceTexture;\n options.sourceTexture = temp;\n }\n\n /**\n * Generic isNeutral implementation for one parameter based filters.\n * Used only in image applyFilters to discard filters that will not have an effect\n * on the image\n * Other filters may need their own version ( ColorMatrix, HueRotation, gamma, ComposedFilter )\n * @param {Object} options\n **/\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n isNeutralState(options?: any): boolean {\n return false;\n }\n\n /**\n * Apply this filter to the input image data provided.\n *\n * Determines whether to use WebGL or Canvas2D based on the options.webgl flag.\n *\n * @param {Object} options\n * @param {Number} options.passes The number of filters remaining to be executed\n * @param {Boolean} options.webgl Whether to use webgl to render the filter.\n * @param {WebGLTexture} options.sourceTexture The texture setup as the source to be filtered.\n * @param {WebGLTexture} options.targetTexture The texture where filtered output should be drawn.\n * @param {WebGLRenderingContext} options.context The GL context used for rendering.\n * @param {Object} options.programCache A map of compiled shader programs, keyed by filter type.\n */\n applyTo(options: TWebGLPipelineState | T2DPipelineState) {\n if (isWebGLPipelineState(options)) {\n this._setupFrameBuffer(options);\n this.applyToWebGL(options);\n this._swapTextures(options);\n } else {\n this.applyTo2d(options);\n }\n }\n\n applyTo2d(_options: T2DPipelineState): void {\n // override by subclass\n }\n\n /**\n * Returns a string that represent the current selected shader code for the filter.\n * Used to force recompilation when parameters change or to retrieve the shader from cache\n * @type string\n **/\n getCacheKey(): string {\n return this.type;\n }\n\n /**\n * Retrieves the cached shader.\n * @param {Object} options\n * @param {WebGLRenderingContext} options.context The GL context used for rendering.\n * @param {Object} options.programCache A map of compiled shader programs, keyed by filter type.\n * @return {WebGLProgram} the compiled program shader\n */\n retrieveShader(options: TWebGLPipelineState): TWebGLProgramCacheItem {\n const key = this.getCacheKey();\n if (!options.programCache[key]) {\n options.programCache[key] = this.createProgram(options.context);\n }\n return options.programCache[key];\n }\n\n /**\n * Apply this filter using webgl.\n *\n * @param {Object} options\n * @param {Number} options.passes The number of filters remaining to be executed\n * @param {Boolean} options.webgl Whether to use webgl to render the filter.\n * @param {WebGLTexture} options.originalTexture The texture of the original input image.\n * @param {WebGLTexture} options.sourceTexture The texture setup as the source to be filtered.\n * @param {WebGLTexture} options.targetTexture The texture where filtered output should be drawn.\n * @param {WebGLRenderingContext} options.context The GL context used for rendering.\n * @param {Object} options.programCache A map of compiled shader programs, keyed by filter type.\n */\n applyToWebGL(options: TWebGLPipelineState) {\n const gl = options.context;\n const shader = this.retrieveShader(options);\n if (options.pass === 0 && options.originalTexture) {\n gl.bindTexture(gl.TEXTURE_2D, options.originalTexture);\n } else {\n gl.bindTexture(gl.TEXTURE_2D, options.sourceTexture);\n }\n gl.useProgram(shader.program);\n this.sendAttributeData(gl, shader.attributeLocations, options.aPosition);\n\n gl.uniform1f(shader.uniformLocations.uStepW, 1 / options.sourceWidth);\n gl.uniform1f(shader.uniformLocations.uStepH, 1 / options.sourceHeight);\n\n this.sendUniformData(gl, shader.uniformLocations);\n gl.viewport(0, 0, options.destinationWidth, options.destinationHeight);\n gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4);\n }\n\n bindAdditionalTexture(\n gl: WebGLRenderingContext,\n texture: WebGLTexture,\n textureUnit: number,\n ) {\n gl.activeTexture(textureUnit);\n gl.bindTexture(gl.TEXTURE_2D, texture);\n // reset active texture to 0 as usual\n gl.activeTexture(gl.TEXTURE0);\n }\n\n unbindAdditionalTexture(gl: WebGLRenderingContext, textureUnit: number) {\n gl.activeTexture(textureUnit);\n gl.bindTexture(gl.TEXTURE_2D, null);\n gl.activeTexture(gl.TEXTURE0);\n }\n\n /**\n * Send uniform data from this filter to its shader program on the GPU.\n *\n * Intended to be overridden by subclasses.\n *\n * @param {WebGLRenderingContext} _gl The canvas context used to compile the shader program.\n * @param {Object} _uniformLocations A map of shader uniform names to their locations.\n */\n sendUniformData(\n _gl: WebGLRenderingContext,\n _uniformLocations: TWebGLUniformLocationMap,\n ): void {\n // override by subclass\n }\n\n /**\n * If needed by a 2d filter, this functions can create an helper canvas to be used\n * remember that options.targetCanvas is available for use till end of chain.\n */\n createHelpLayer(options: T2DPipelineState) {\n if (!options.helpLayer) {\n const { sourceWidth, sourceHeight } = options;\n const helpLayer = createCanvasElementFor({\n width: sourceWidth,\n height: sourceHeight,\n });\n options.helpLayer = helpLayer;\n }\n }\n\n /**\n * Returns object representation of an instance\n * It will automatically export the default values of a filter,\n * stored in the static defaults property.\n * @return {Object} Object representation of an instance\n */\n toObject(): { type: Name } & SerializedProps {\n const defaultKeys = Object.keys(\n (this.constructor as typeof BaseFilter).defaults || {},\n ) as (keyof SerializedProps)[];\n\n return {\n type: this.type,\n ...defaultKeys.reduce((acc, key) => {\n acc[key] = this[\n key as keyof this\n ] as unknown as (typeof acc)[typeof key];\n return acc;\n }, {} as SerializedProps),\n };\n }\n\n /**\n * Returns a JSON representation of an instance\n * @return {Object} JSON\n */\n toJSON() {\n // delegate, not alias\n return this.toObject();\n }\n\n static async fromObject(\n { type, ...filterOptions }: Record,\n _options?: Abortable,\n ): Promise> {\n return new this(filterOptions);\n }\n}\n","export const blendColorFragmentSource = {\n multiply: 'gl_FragColor.rgb *= uColor.rgb;\\n',\n screen:\n 'gl_FragColor.rgb = 1.0 - (1.0 - gl_FragColor.rgb) * (1.0 - uColor.rgb);\\n',\n add: 'gl_FragColor.rgb += uColor.rgb;\\n',\n difference: 'gl_FragColor.rgb = abs(gl_FragColor.rgb - uColor.rgb);\\n',\n subtract: 'gl_FragColor.rgb -= uColor.rgb;\\n',\n lighten: 'gl_FragColor.rgb = max(gl_FragColor.rgb, uColor.rgb);\\n',\n darken: 'gl_FragColor.rgb = min(gl_FragColor.rgb, uColor.rgb);\\n',\n exclusion:\n 'gl_FragColor.rgb += uColor.rgb - 2.0 * (uColor.rgb * gl_FragColor.rgb);\\n',\n overlay: `\n if (uColor.r < 0.5) {\n gl_FragColor.r *= 2.0 * uColor.r;\n } else {\n gl_FragColor.r = 1.0 - 2.0 * (1.0 - gl_FragColor.r) * (1.0 - uColor.r);\n }\n if (uColor.g < 0.5) {\n gl_FragColor.g *= 2.0 * uColor.g;\n } else {\n gl_FragColor.g = 1.0 - 2.0 * (1.0 - gl_FragColor.g) * (1.0 - uColor.g);\n }\n if (uColor.b < 0.5) {\n gl_FragColor.b *= 2.0 * uColor.b;\n } else {\n gl_FragColor.b = 1.0 - 2.0 * (1.0 - gl_FragColor.b) * (1.0 - uColor.b);\n }\n `,\n tint: `\n gl_FragColor.rgb *= (1.0 - uColor.a);\n gl_FragColor.rgb += uColor.rgb;\n `,\n} as const;\n","import { Color } from '../color/Color';\nimport { BaseFilter } from './BaseFilter';\nimport type { T2DPipelineState, TWebGLUniformLocationMap } from './typedefs';\nimport { classRegistry } from '../ClassRegistry';\nimport { blendColorFragmentSource } from './shaders/blendColor';\n\nexport type TBlendMode =\n | 'multiply'\n | 'add'\n | 'difference'\n | 'screen'\n | 'subtract'\n | 'darken'\n | 'lighten'\n | 'overlay'\n | 'exclusion'\n | 'tint';\n\ntype BlendColorOwnProps = {\n color: string;\n mode: TBlendMode;\n alpha: number;\n};\n\nexport const blendColorDefaultValues: BlendColorOwnProps = {\n color: '#F95C63',\n mode: 'multiply',\n alpha: 1,\n};\n\n/**\n * Color Blend filter class\n * @example\n * const filter = new BlendColor({\n * color: '#000',\n * mode: 'multiply'\n * });\n *\n * const filter = new BlendImage({\n * image: fabricImageObject,\n * mode: 'multiply'\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n * canvas.renderAll();\n */\nexport class BlendColor extends BaseFilter<'BlendColor', BlendColorOwnProps> {\n /**\n * Color to make the blend operation with. default to a reddish color since black or white\n * gives always strong result.\n * @type String\n **/\n declare color: BlendColorOwnProps['color'];\n\n /**\n * Blend mode for the filter: one of multiply, add, difference, screen, subtract,\n * darken, lighten, overlay, exclusion, tint.\n * @type String\n **/\n declare mode: BlendColorOwnProps['mode'];\n /**\n * alpha value. represent the strength of the blend color operation.\n * @type Number\n **/\n declare alpha: BlendColorOwnProps['alpha'];\n\n static defaults = blendColorDefaultValues;\n\n static type = 'BlendColor';\n\n static uniformLocations = ['uColor'];\n\n getCacheKey() {\n return `${this.type}_${this.mode}`;\n }\n\n protected getFragmentSource(): string {\n return `\n precision highp float;\n uniform sampler2D uTexture;\n uniform vec4 uColor;\n varying vec2 vTexCoord;\n void main() {\n vec4 color = texture2D(uTexture, vTexCoord);\n gl_FragColor = color;\n if (color.a > 0.0) {\n ${blendColorFragmentSource[this.mode]}\n }\n }\n `;\n }\n\n /**\n * Apply the Blend operation to a Uint8ClampedArray representing the pixels of an image.\n *\n * @param {Object} options\n * @param {ImageData} options.imageData The Uint8ClampedArray to be filtered.\n */\n applyTo2d({ imageData: { data } }: T2DPipelineState) {\n const source = new Color(this.color).getSource();\n const alpha = this.alpha;\n const tr = source[0] * alpha;\n const tg = source[1] * alpha;\n const tb = source[2] * alpha;\n const alpha1 = 1 - alpha;\n\n for (let i = 0; i < data.length; i += 4) {\n const r = data[i];\n const g = data[i + 1];\n const b = data[i + 2];\n let oR, oG, oB;\n switch (this.mode) {\n case 'multiply':\n oR = (r * tr) / 255;\n oG = (g * tg) / 255;\n oB = (b * tb) / 255;\n break;\n case 'screen':\n oR = 255 - ((255 - r) * (255 - tr)) / 255;\n oG = 255 - ((255 - g) * (255 - tg)) / 255;\n oB = 255 - ((255 - b) * (255 - tb)) / 255;\n break;\n case 'add':\n oR = r + tr;\n oG = g + tg;\n oB = b + tb;\n break;\n case 'difference':\n oR = Math.abs(r - tr);\n oG = Math.abs(g - tg);\n oB = Math.abs(b - tb);\n break;\n case 'subtract':\n oR = r - tr;\n oG = g - tg;\n oB = b - tb;\n break;\n case 'darken':\n oR = Math.min(r, tr);\n oG = Math.min(g, tg);\n oB = Math.min(b, tb);\n break;\n case 'lighten':\n oR = Math.max(r, tr);\n oG = Math.max(g, tg);\n oB = Math.max(b, tb);\n break;\n case 'overlay':\n oR =\n tr < 128\n ? (2 * r * tr) / 255\n : 255 - (2 * (255 - r) * (255 - tr)) / 255;\n oG =\n tg < 128\n ? (2 * g * tg) / 255\n : 255 - (2 * (255 - g) * (255 - tg)) / 255;\n oB =\n tb < 128\n ? (2 * b * tb) / 255\n : 255 - (2 * (255 - b) * (255 - tb)) / 255;\n break;\n case 'exclusion':\n oR = tr + r - (2 * tr * r) / 255;\n oG = tg + g - (2 * tg * g) / 255;\n oB = tb + b - (2 * tb * b) / 255;\n break;\n case 'tint':\n oR = tr + r * alpha1;\n oG = tg + g * alpha1;\n oB = tb + b * alpha1;\n }\n data[i] = oR;\n data[i + 1] = oG;\n data[i + 2] = oB;\n }\n }\n\n /**\n * Send data from this filter to its shader program's uniforms.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n */\n sendUniformData(\n gl: WebGLRenderingContext,\n uniformLocations: TWebGLUniformLocationMap,\n ) {\n const source = new Color(this.color).getSource();\n source[0] = (this.alpha * source[0]) / 255;\n source[1] = (this.alpha * source[1]) / 255;\n source[2] = (this.alpha * source[2]) / 255;\n source[3] = this.alpha;\n gl.uniform4fv(uniformLocations.uColor, source);\n }\n}\n\nclassRegistry.setClass(BlendColor);\n","import type { TBlendImageMode } from '../BlendImage';\n\nexport const fragmentSource: Record = {\n multiply: `\n precision highp float;\n uniform sampler2D uTexture;\n uniform sampler2D uImage;\n uniform vec4 uColor;\n varying vec2 vTexCoord;\n varying vec2 vTexCoord2;\n void main() {\n vec4 color = texture2D(uTexture, vTexCoord);\n vec4 color2 = texture2D(uImage, vTexCoord2);\n color.rgba *= color2.rgba;\n gl_FragColor = color;\n }\n `,\n mask: `\n precision highp float;\n uniform sampler2D uTexture;\n uniform sampler2D uImage;\n uniform vec4 uColor;\n varying vec2 vTexCoord;\n varying vec2 vTexCoord2;\n void main() {\n vec4 color = texture2D(uTexture, vTexCoord);\n vec4 color2 = texture2D(uImage, vTexCoord2);\n color.a = color2.a;\n gl_FragColor = color;\n }\n `,\n} as const;\n\nexport const vertexSource = `\n attribute vec2 aPosition;\n varying vec2 vTexCoord;\n varying vec2 vTexCoord2;\n uniform mat3 uTransformMatrix;\n void main() {\n vTexCoord = aPosition;\n vTexCoord2 = (uTransformMatrix * vec3(aPosition, 1.0)).xy;\n gl_Position = vec4(aPosition * 2.0 - 1.0, 0.0, 1.0);\n }\n ` as const;\n","import { FabricImage } from '../shapes/Image';\nimport { createCanvasElement } from '../util/misc/dom';\nimport { BaseFilter } from './BaseFilter';\nimport type {\n T2DPipelineState,\n TWebGLPipelineState,\n TWebGLUniformLocationMap,\n} from './typedefs';\nimport type { WebGLFilterBackend } from './WebGLFilterBackend';\nimport { classRegistry } from '../ClassRegistry';\nimport { fragmentSource, vertexSource } from './shaders/blendImage';\n\nexport type TBlendImageMode = 'multiply' | 'mask';\n\ntype BlendImageOwnProps = {\n mode: TBlendImageMode;\n alpha: number;\n};\n\nexport const blendImageDefaultValues: BlendImageOwnProps = {\n mode: 'multiply',\n alpha: 1,\n};\n\n/**\n * Image Blend filter class\n * @example\n * const filter = new filters.BlendColor({\n * color: '#000',\n * mode: 'multiply'\n * });\n *\n * const filter = new BlendImage({\n * image: fabricImageObject,\n * mode: 'multiply'\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n * canvas.renderAll();\n */\nexport class BlendImage extends BaseFilter<'BlendImage', BlendImageOwnProps> {\n /**\n * Image to make the blend operation with.\n **/\n declare image: FabricImage;\n\n /**\n * Blend mode for the filter: either 'multiply' or 'mask'. 'multiply' will\n * multiply the values of each channel (R, G, B, and A) of the filter image by\n * their corresponding values in the base image. 'mask' will only look at the\n * alpha channel of the filter image, and apply those values to the base\n * image's alpha channel.\n * @type String\n **/\n declare mode: BlendImageOwnProps['mode'];\n\n /**\n * alpha value. represent the strength of the blend image operation.\n * not implemented.\n **/\n declare alpha: BlendImageOwnProps['alpha'];\n\n static type = 'BlendImage';\n\n static defaults = blendImageDefaultValues;\n\n static uniformLocations = ['uTransformMatrix', 'uImage'];\n\n getCacheKey() {\n return `${this.type}_${this.mode}`;\n }\n\n getFragmentSource(): string {\n return fragmentSource[this.mode];\n }\n\n getVertexSource(): string {\n return vertexSource;\n }\n\n applyToWebGL(options: TWebGLPipelineState) {\n const gl = options.context,\n texture = this.createTexture(options.filterBackend, this.image);\n this.bindAdditionalTexture(gl, texture!, gl.TEXTURE1);\n super.applyToWebGL(options);\n this.unbindAdditionalTexture(gl, gl.TEXTURE1);\n }\n\n createTexture(backend: WebGLFilterBackend, image: FabricImage) {\n return backend.getCachedTexture(image.cacheKey, image.getElement());\n }\n\n /**\n * Calculate a transformMatrix to adapt the image to blend over\n * @param {Object} options\n * @param {WebGLRenderingContext} options.context The GL context used for rendering.\n * @param {Object} options.programCache A map of compiled shader programs, keyed by filter type.\n */\n calculateMatrix() {\n const image = this.image,\n { width, height } = image.getElement();\n return [\n 1 / image.scaleX,\n 0,\n 0,\n 0,\n 1 / image.scaleY,\n 0,\n -image.left / width,\n -image.top / height,\n 1,\n ];\n }\n\n /**\n * Apply the Blend operation to a Uint8ClampedArray representing the pixels of an image.\n *\n * @param {Object} options\n * @param {ImageData} options.imageData The Uint8ClampedArray to be filtered.\n */\n applyTo2d({\n imageData: { data, width, height },\n filterBackend: { resources },\n }: T2DPipelineState) {\n const image = this.image;\n if (!resources.blendImage) {\n resources.blendImage = createCanvasElement();\n }\n const canvas1 = resources.blendImage;\n const context = canvas1.getContext('2d')!;\n if (canvas1.width !== width || canvas1.height !== height) {\n canvas1.width = width;\n canvas1.height = height;\n } else {\n context.clearRect(0, 0, width, height);\n }\n context.setTransform(\n image.scaleX,\n 0,\n 0,\n image.scaleY,\n image.left,\n image.top,\n );\n context.drawImage(image.getElement(), 0, 0, width, height);\n const blendData = context.getImageData(0, 0, width, height).data;\n for (let i = 0; i < data.length; i += 4) {\n const r = data[i];\n const g = data[i + 1];\n const b = data[i + 2];\n const a = data[i + 3];\n\n const tr = blendData[i];\n const tg = blendData[i + 1];\n const tb = blendData[i + 2];\n const ta = blendData[i + 3];\n\n switch (this.mode) {\n case 'multiply':\n data[i] = (r * tr) / 255;\n data[i + 1] = (g * tg) / 255;\n data[i + 2] = (b * tb) / 255;\n data[i + 3] = (a * ta) / 255;\n break;\n case 'mask':\n data[i + 3] = ta;\n break;\n }\n }\n }\n\n /**\n * Send data from this filter to its shader program's uniforms.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n */\n sendUniformData(\n gl: WebGLRenderingContext,\n uniformLocations: TWebGLUniformLocationMap,\n ) {\n const matrix = this.calculateMatrix();\n gl.uniform1i(uniformLocations.uImage, 1); // texture unit 1.\n gl.uniformMatrix3fv(uniformLocations.uTransformMatrix, false, matrix);\n }\n\n /**\n * Returns object representation of an instance\n * TODO: Handle the possibility of missing image better.\n * As of now a BlendImage filter without image can't be used with fromObject\n * @return {Object} Object representation of an instance\n */\n toObject(): {\n type: 'BlendImage';\n image: ReturnType;\n } & BlendImageOwnProps {\n return {\n ...super.toObject(),\n image: this.image && this.image.toObject(),\n };\n }\n\n /**\n * Create filter instance from an object representation\n * @param {object} object Object to create an instance from\n * @param {object} [options]\n * @param {AbortSignal} [options.signal] handle aborting image loading, see https://developer.mozilla.org/en-US/docs/Web/API/AbortController/signal\n * @returns {Promise}\n */\n static async fromObject(\n { type, image, ...filterOptions }: Record,\n options: { signal: AbortSignal },\n ): Promise> {\n return FabricImage.fromObject(image, options).then(\n (enlivedImage) => new this({ ...filterOptions, image: enlivedImage }),\n );\n }\n}\n\nclassRegistry.setClass(BlendImage);\n","import { BaseFilter } from './BaseFilter';\nimport type {\n TWebGLPipelineState,\n T2DPipelineState,\n TWebGLUniformLocationMap,\n} from './typedefs';\nimport { isWebGLPipelineState } from './utils';\nimport { classRegistry } from '../ClassRegistry';\nimport { fragmentSource } from './shaders/blur';\n\ntype BlurOwnProps = {\n blur: number;\n};\n\nexport const blurDefaultValues: BlurOwnProps = {\n blur: 0,\n};\n\n/**\n * Blur filter class\n * @example\n * const filter = new Blur({\n * blur: 0.5\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n * canvas.renderAll();\n */\nexport class Blur extends BaseFilter<'Blur', BlurOwnProps> {\n /**\n * blur value, in percentage of image dimensions.\n * specific to keep the image blur constant at different resolutions\n * range between 0 and 1.\n * @type Number\n */\n declare blur: BlurOwnProps['blur'];\n\n declare horizontal: boolean;\n declare aspectRatio: number;\n\n static type = 'Blur';\n\n static defaults = blurDefaultValues;\n\n static uniformLocations = ['uDelta'];\n\n getFragmentSource(): string {\n return fragmentSource;\n }\n\n applyTo(options: TWebGLPipelineState | T2DPipelineState) {\n if (isWebGLPipelineState(options)) {\n // this aspectRatio is used to give the same blur to vertical and horizontal\n this.aspectRatio = options.sourceWidth / options.sourceHeight;\n options.passes++;\n this._setupFrameBuffer(options);\n this.horizontal = true;\n this.applyToWebGL(options);\n this._swapTextures(options);\n this._setupFrameBuffer(options);\n this.horizontal = false;\n this.applyToWebGL(options);\n this._swapTextures(options);\n } else {\n this.applyTo2d(options);\n }\n }\n\n applyTo2d({ imageData: { data, width, height } }: T2DPipelineState) {\n // this code mimic the shader for output consistency\n // it samples 31 pixels across the image over a distance that depends from the blur value.\n this.aspectRatio = width / height;\n this.horizontal = true;\n let blurValue = this.getBlurValue() * width;\n const imageData = new Uint8ClampedArray(data);\n const samples = 15;\n const bytesInRow = 4 * width;\n for (let i = 0; i < data.length; i += 4) {\n let r = 0.0,\n g = 0.0,\n b = 0.0,\n a = 0.0,\n totalA = 0;\n const minIRow = i - (i % bytesInRow);\n const maxIRow = minIRow + bytesInRow;\n // for now let's keep noise out of the way\n // let pixelOffset = 0;\n // const offset = Math.random() * 3;\n // if (offset > 2) {\n // pixelOffset = 4;\n // } else if (offset < 1) {\n // pixelOffset = -4;\n // }\n for (let j = -samples + 1; j < samples; j++) {\n const percent = j / samples;\n const distance = Math.floor(blurValue * percent) * 4;\n const weight = 1 - Math.abs(percent);\n let sampledPixel = i + distance; // + pixelOffset;\n // try to implement edge mirroring\n if (sampledPixel < minIRow) {\n sampledPixel = minIRow;\n } else if (sampledPixel > maxIRow) {\n sampledPixel = maxIRow;\n }\n const localAlpha = data[sampledPixel + 3] * weight;\n r += data[sampledPixel] * localAlpha;\n g += data[sampledPixel + 1] * localAlpha;\n b += data[sampledPixel + 2] * localAlpha;\n a += localAlpha;\n totalA += weight;\n }\n imageData[i] = r / a;\n imageData[i + 1] = g / a;\n imageData[i + 2] = b / a;\n imageData[i + 3] = a / totalA;\n }\n this.horizontal = false;\n blurValue = this.getBlurValue() * height;\n for (let i = 0; i < imageData.length; i += 4) {\n let r = 0.0,\n g = 0.0,\n b = 0.0,\n a = 0.0,\n totalA = 0;\n const minIRow = i % bytesInRow;\n const maxIRow = imageData.length - bytesInRow + minIRow;\n // for now let's keep noise out of the way\n // let pixelOffset = 0;\n // const offset = Math.random() * 3;\n // if (offset > 2) {\n // pixelOffset = bytesInRow;\n // } else if (offset < 1) {\n // pixelOffset = -bytesInRow;\n // }\n for (let j = -samples + 1; j < samples; j++) {\n const percent = j / samples;\n const distance = Math.floor(blurValue * percent) * bytesInRow;\n const weight = 1 - Math.abs(percent);\n let sampledPixel = i + distance; // + pixelOffset;\n // try to implement edge mirroring\n if (sampledPixel < minIRow) {\n sampledPixel = minIRow;\n } else if (sampledPixel > maxIRow) {\n sampledPixel = maxIRow;\n }\n const localAlpha = imageData[sampledPixel + 3] * weight;\n r += imageData[sampledPixel] * localAlpha;\n g += imageData[sampledPixel + 1] * localAlpha;\n b += imageData[sampledPixel + 2] * localAlpha;\n a += localAlpha;\n totalA += weight;\n }\n data[i] = r / a;\n data[i + 1] = g / a;\n data[i + 2] = b / a;\n data[i + 3] = a / totalA;\n }\n }\n\n /**\n * Send data from this filter to its shader program's uniforms.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n */\n sendUniformData(\n gl: WebGLRenderingContext,\n uniformLocations: TWebGLUniformLocationMap,\n ) {\n const delta = this.chooseRightDelta();\n gl.uniform2fv(uniformLocations.uDelta, delta);\n }\n\n isNeutralState() {\n return this.blur === 0;\n }\n\n getBlurValue(): number {\n let blurScale = 1;\n const { horizontal, aspectRatio } = this;\n if (horizontal) {\n if (aspectRatio > 1) {\n // image is wide, i want to shrink radius horizontal\n blurScale = 1 / aspectRatio;\n }\n } else {\n if (aspectRatio < 1) {\n // image is tall, i want to shrink radius vertical\n blurScale = aspectRatio;\n }\n }\n return blurScale * this.blur * 0.12;\n }\n\n /**\n * choose right value of image percentage to blur with\n * @returns {Array} a numeric array with delta values\n */\n chooseRightDelta() {\n const blur = this.getBlurValue();\n return this.horizontal ? [blur, 0] : [0, blur];\n }\n}\n\nclassRegistry.setClass(Blur);\n","export const fragmentSource = `\n precision highp float;\n uniform sampler2D uTexture;\n uniform vec2 uDelta;\n varying vec2 vTexCoord;\n const float nSamples = 15.0;\n vec3 v3offset = vec3(12.9898, 78.233, 151.7182);\n float random(vec3 scale) {\n /* use the fragment position for a different seed per-pixel */\n return fract(sin(dot(gl_FragCoord.xyz, scale)) * 43758.5453);\n }\n void main() {\n vec4 color = vec4(0.0);\n float totalC = 0.0;\n float totalA = 0.0;\n float offset = random(v3offset);\n for (float t = -nSamples; t <= nSamples; t++) {\n float percent = (t + offset - 0.5) / nSamples;\n vec4 sample = texture2D(uTexture, vTexCoord + uDelta * percent);\n float weight = 1.0 - abs(percent);\n float alpha = weight * sample.a;\n color.rgb += sample.rgb * alpha;\n color.a += alpha;\n totalA += weight;\n totalC += alpha;\n }\n gl_FragColor.rgb = color.rgb / totalC;\n gl_FragColor.a = color.a / totalA;\n }\n ` as const;\n","import { BaseFilter } from './BaseFilter';\nimport type { T2DPipelineState, TWebGLUniformLocationMap } from './typedefs';\nimport { classRegistry } from '../ClassRegistry';\nimport { fragmentSource } from './shaders/brightness';\n\ntype BrightnessOwnProps = {\n brightness: number;\n};\n\nexport const brightnessDefaultValues: BrightnessOwnProps = {\n brightness: 0,\n};\n\n/**\n * Brightness filter class\n * @example\n * const filter = new Brightness({\n * brightness: 0.05\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n */\nexport class Brightness extends BaseFilter<'Brightness', BrightnessOwnProps> {\n /**\n * Brightness value, from -1 to 1.\n * translated to -255 to 255 for 2d\n * 0.0039215686 is the part of 1 that get translated to 1 in 2d\n * @param {Number} brightness\n */\n declare brightness: BrightnessOwnProps['brightness'];\n\n static type = 'Brightness';\n\n static defaults = brightnessDefaultValues;\n\n static uniformLocations = ['uBrightness'];\n\n getFragmentSource() {\n return fragmentSource;\n }\n\n /**\n * Apply the Brightness operation to a Uint8ClampedArray representing the pixels of an image.\n *\n * @param {Object} options\n * @param {ImageData} options.imageData The Uint8ClampedArray to be filtered.\n */\n applyTo2d({ imageData: { data } }: T2DPipelineState) {\n const brightness = Math.round(this.brightness * 255);\n for (let i = 0; i < data.length; i += 4) {\n data[i] += brightness;\n data[i + 1] += brightness;\n data[i + 2] += brightness;\n }\n }\n\n isNeutralState() {\n return this.brightness === 0;\n }\n\n /**\n * Send data from this filter to its shader program's uniforms.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n */\n sendUniformData(\n gl: WebGLRenderingContext,\n uniformLocations: TWebGLUniformLocationMap,\n ) {\n gl.uniform1f(uniformLocations.uBrightness, this.brightness);\n }\n}\n\nclassRegistry.setClass(Brightness);\n","export const fragmentSource = `\n precision highp float;\n uniform sampler2D uTexture;\n uniform float uBrightness;\n varying vec2 vTexCoord;\n void main() {\n vec4 color = texture2D(uTexture, vTexCoord);\n color.rgb += uBrightness;\n gl_FragColor = color;\n }\n`;\n","export const fragmentSource = `\n precision highp float;\n uniform sampler2D uTexture;\n varying vec2 vTexCoord;\n uniform mat4 uColorMatrix;\n uniform vec4 uConstants;\n void main() {\n vec4 color = texture2D(uTexture, vTexCoord);\n color *= uColorMatrix;\n color += uConstants;\n gl_FragColor = color;\n }`;\n","import { BaseFilter } from './BaseFilter';\nimport type {\n T2DPipelineState,\n TMatColorMatrix,\n TWebGLUniformLocationMap,\n} from './typedefs';\nimport { classRegistry } from '../ClassRegistry';\nimport { fragmentSource } from './shaders/colorMatrix';\n\nexport type ColorMatrixOwnProps = {\n matrix: TMatColorMatrix;\n colorsOnly: boolean;\n};\n\nexport const colorMatrixDefaultValues: ColorMatrixOwnProps = {\n matrix: [1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0],\n colorsOnly: true,\n};\n\n/**\n * Color Matrix filter class\n * @see {@link http://fabric5.fabricjs.com/image-filters|ImageFilters demo}\n * @see {@link http://phoboslab.org/log/2013/11/fast-image-filters-with-webgl demo}\n * @example Kodachrome filter\n * const filter = new ColorMatrix({\n * matrix: [\n 1.1285582396593525, -0.3967382283601348, -0.03992559172921793, 0, 63.72958762196502,\n -0.16404339962244616, 1.0835251566291304, -0.05498805115633132, 0, 24.732407896706203,\n -0.16786010706155763, -0.5603416277695248, 1.6014850761964943, 0, 35.62982807460946,\n 0, 0, 0, 1, 0\n ]\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n */\nexport class ColorMatrix<\n Name extends string = 'ColorMatrix',\n OwnProps extends object = ColorMatrixOwnProps,\n SerializedProps extends object = ColorMatrixOwnProps,\n> extends BaseFilter {\n /**\n * Colormatrix for pixels.\n * array of 20 floats. Numbers in positions 4, 9, 14, 19 loose meaning\n * outside the -1, 1 range.\n * 0.0039215686 is the part of 1 that get translated to 1 in 2d\n * @param {Array} matrix array of 20 numbers.\n */\n declare matrix: ColorMatrixOwnProps['matrix'];\n\n /**\n * Lock the colormatrix on the color part, skipping alpha, mainly for non webgl scenario\n * to save some calculation\n * @type Boolean\n * @default true\n */\n declare colorsOnly: ColorMatrixOwnProps['colorsOnly'];\n\n static type = 'ColorMatrix';\n\n static defaults = colorMatrixDefaultValues;\n\n static uniformLocations = ['uColorMatrix', 'uConstants'];\n\n getFragmentSource(): string {\n return fragmentSource;\n }\n\n /**\n * Apply the ColorMatrix operation to a Uint8Array representing the pixels of an image.\n *\n * @param {Object} options\n * @param {ImageData} options.imageData The Uint8Array to be filtered.\n */\n applyTo2d(options: T2DPipelineState) {\n const imageData = options.imageData,\n data = imageData.data,\n m = this.matrix,\n colorsOnly = this.colorsOnly;\n\n for (let i = 0; i < data.length; i += 4) {\n const r = data[i];\n const g = data[i + 1];\n const b = data[i + 2];\n\n data[i] = r * m[0] + g * m[1] + b * m[2] + m[4] * 255;\n data[i + 1] = r * m[5] + g * m[6] + b * m[7] + m[9] * 255;\n data[i + 2] = r * m[10] + g * m[11] + b * m[12] + m[14] * 255;\n if (!colorsOnly) {\n const a = data[i + 3];\n data[i] += a * m[3];\n data[i + 1] += a * m[8];\n data[i + 2] += a * m[13];\n data[i + 3] =\n r * m[15] + g * m[16] + b * m[17] + a * m[18] + m[19] * 255;\n }\n }\n }\n\n /**\n * Send data from this filter to its shader program's uniforms.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n */\n sendUniformData(\n gl: WebGLRenderingContext,\n uniformLocations: TWebGLUniformLocationMap,\n ) {\n const m = this.matrix,\n matrix = [\n m[0],\n m[1],\n m[2],\n m[3],\n m[5],\n m[6],\n m[7],\n m[8],\n m[10],\n m[11],\n m[12],\n m[13],\n m[15],\n m[16],\n m[17],\n m[18],\n ],\n constants = [m[4], m[9], m[14], m[19]];\n gl.uniformMatrix4fv(uniformLocations.uColorMatrix, false, matrix);\n gl.uniform4fv(uniformLocations.uConstants, constants);\n }\n\n toObject(): { type: Name } & SerializedProps {\n return {\n ...super.toObject(),\n matrix: [...this.matrix] as TMatColorMatrix,\n };\n }\n}\n\nclassRegistry.setClass(ColorMatrix);\n","import { ColorMatrix } from './ColorMatrix';\nimport { classRegistry } from '../ClassRegistry';\nimport type { TMatColorMatrix } from './typedefs';\n\ntype FixedFiltersOwnProps = {\n colorsOnly: boolean;\n};\n\nexport function createColorMatrixFilter(key: string, matrix: TMatColorMatrix) {\n const newClass = class extends ColorMatrix<\n typeof key,\n FixedFiltersOwnProps,\n FixedFiltersOwnProps\n > {\n static type = key;\n\n static defaults = {\n colorsOnly: false,\n matrix,\n };\n\n toObject(): { type: string } & FixedFiltersOwnProps {\n return { type: this.type, colorsOnly: this.colorsOnly };\n }\n };\n classRegistry.setClass(newClass, key);\n return newClass as typeof ColorMatrix;\n}\n\nexport const Brownie = createColorMatrixFilter(\n 'Brownie',\n [\n 0.5997, 0.34553, -0.27082, 0, 0.186, -0.0377, 0.86095, 0.15059, 0, -0.1449,\n 0.24113, -0.07441, 0.44972, 0, -0.02965, 0, 0, 0, 1, 0,\n ],\n);\n\nexport const Vintage = createColorMatrixFilter(\n 'Vintage',\n [\n 0.62793, 0.32021, -0.03965, 0, 0.03784, 0.02578, 0.64411, 0.03259, 0,\n 0.02926, 0.0466, -0.08512, 0.52416, 0, 0.02023, 0, 0, 0, 1, 0,\n ],\n);\n\nexport const Kodachrome = createColorMatrixFilter(\n 'Kodachrome',\n [\n 1.12855, -0.39673, -0.03992, 0, 0.24991, -0.16404, 1.08352, -0.05498, 0,\n 0.09698, -0.16786, -0.56034, 1.60148, 0, 0.13972, 0, 0, 0, 1, 0,\n ],\n);\n\nexport const Technicolor = createColorMatrixFilter(\n 'Technicolor',\n [\n 1.91252, -0.85453, -0.09155, 0, 0.04624, -0.30878, 1.76589, -0.10601, 0,\n -0.27589, -0.2311, -0.75018, 1.84759, 0, 0.12137, 0, 0, 0, 1, 0,\n ],\n);\n\nexport const Polaroid = createColorMatrixFilter(\n 'Polaroid',\n [\n 1.438, -0.062, -0.062, 0, 0, -0.122, 1.378, -0.122, 0, 0, -0.016, -0.016,\n 1.483, 0, 0, 0, 0, 0, 1, 0,\n ],\n);\n\nexport const Sepia = createColorMatrixFilter(\n 'Sepia',\n [\n 0.393, 0.769, 0.189, 0, 0, 0.349, 0.686, 0.168, 0, 0, 0.272, 0.534, 0.131,\n 0, 0, 0, 0, 0, 1, 0,\n ],\n);\n\nexport const BlackWhite = createColorMatrixFilter(\n 'BlackWhite',\n [\n 1.5, 1.5, 1.5, 0, -1, 1.5, 1.5, 1.5, 0, -1, 1.5, 1.5, 1.5, 0, -1, 0, 0, 0,\n 1, 0,\n ],\n);\n","import { BaseFilter } from './BaseFilter';\nimport type { T2DPipelineState, TWebGLPipelineState } from './typedefs';\nimport { isWebGLPipelineState } from './utils';\nimport { classRegistry } from '../ClassRegistry';\n\ntype ComposedOwnProps = {\n subFilters: BaseFilter[];\n};\n\ntype ComposedSerializedProps = {\n subFilters: Record[];\n};\n\n/**\n * A container class that knows how to apply a sequence of filters to an input image.\n */\nexport class Composed extends BaseFilter<\n 'Composed',\n ComposedOwnProps,\n ComposedSerializedProps\n> {\n /**\n * A non sparse array of filters to apply\n */\n declare subFilters: ComposedOwnProps['subFilters'];\n\n static type = 'Composed';\n\n constructor(\n options: { subFilters?: BaseFilter[] } & Record = {},\n ) {\n super(options);\n this.subFilters = options.subFilters || [];\n }\n\n /**\n * Apply this container's filters to the input image provided.\n *\n * @param {Object} options\n * @param {Number} options.passes The number of filters remaining to be applied.\n */\n applyTo(options: TWebGLPipelineState | T2DPipelineState) {\n if (isWebGLPipelineState(options)) {\n options.passes += this.subFilters.length - 1;\n }\n this.subFilters.forEach((filter) => {\n filter.applyTo(options);\n });\n }\n\n /**\n * Serialize this filter into JSON.\n * @returns {Object} A JSON representation of this filter.\n */\n toObject() {\n return {\n type: this.type,\n subFilters: this.subFilters.map((filter) => filter.toObject()),\n };\n }\n\n isNeutralState() {\n return !this.subFilters.some((filter) => !filter.isNeutralState());\n }\n\n /**\n * Deserialize a JSON definition of a ComposedFilter into a concrete instance.\n * @param {oject} object Object to create an instance from\n * @param {object} [options]\n * @param {AbortSignal} [options.signal] handle aborting `BlendImage` filter loading, see https://developer.mozilla.org/en-US/docs/Web/API/AbortController/signal\n * @returns {Promise}\n */\n static fromObject(\n object: Record,\n options?: { signal: AbortSignal },\n ): Promise {\n return Promise.all(\n ((object.subFilters || []) as BaseFilter[]).map((filter) =>\n classRegistry\n .getClass(filter.type)\n .fromObject(filter, options),\n ),\n ).then((enlivedFilters) => new this({ subFilters: enlivedFilters }));\n }\n}\n\nclassRegistry.setClass(Composed);\n","import { BaseFilter } from './BaseFilter';\nimport type { T2DPipelineState, TWebGLUniformLocationMap } from './typedefs';\nimport { classRegistry } from '../ClassRegistry';\nimport { fragmentSource } from './shaders/constrast';\n\ntype ContrastOwnProps = {\n contrast: number;\n};\n\nexport const contrastDefaultValues: ContrastOwnProps = {\n contrast: 0,\n};\n\n/**\n * Contrast filter class\n * @example\n * const filter = new Contrast({\n * contrast: 0.25\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n */\nexport class Contrast extends BaseFilter<'Contrast', ContrastOwnProps> {\n /**\n * contrast value, range from -1 to 1.\n * @param {Number} contrast\n * @default 0\n */\n declare contrast: ContrastOwnProps['contrast'];\n\n static type = 'Contrast';\n\n static defaults = contrastDefaultValues;\n\n static uniformLocations = ['uContrast'];\n\n getFragmentSource() {\n return fragmentSource;\n }\n\n isNeutralState() {\n return this.contrast === 0;\n }\n\n /**\n * Apply the Contrast operation to a Uint8Array representing the pixels of an image.\n *\n * @param {Object} options\n * @param {ImageData} options.imageData The Uint8Array to be filtered.\n */\n applyTo2d({ imageData: { data } }: T2DPipelineState) {\n const contrast = Math.floor(this.contrast * 255),\n contrastF = (259 * (contrast + 255)) / (255 * (259 - contrast));\n\n for (let i = 0; i < data.length; i += 4) {\n data[i] = contrastF * (data[i] - 128) + 128;\n data[i + 1] = contrastF * (data[i + 1] - 128) + 128;\n data[i + 2] = contrastF * (data[i + 2] - 128) + 128;\n }\n }\n\n /**\n * Send data from this filter to its shader program's uniforms.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n */\n sendUniformData(\n gl: WebGLRenderingContext,\n uniformLocations: TWebGLUniformLocationMap,\n ) {\n gl.uniform1f(uniformLocations.uContrast, this.contrast);\n }\n}\n\nclassRegistry.setClass(Contrast);\n","export const fragmentSource = `\n precision highp float;\n uniform sampler2D uTexture;\n uniform float uContrast;\n varying vec2 vTexCoord;\n void main() {\n vec4 color = texture2D(uTexture, vTexCoord);\n float contrastF = 1.015 * (uContrast + 1.0) / (1.0 * (1.015 - uContrast));\n color.rgb = contrastF * (color.rgb - 0.5) + 0.5;\n gl_FragColor = color;\n }`;\n","export const fragmentSource = {\n Convolute_3_1: `\n precision highp float;\n uniform sampler2D uTexture;\n uniform float uMatrix[9];\n uniform float uStepW;\n uniform float uStepH;\n varying vec2 vTexCoord;\n void main() {\n vec4 color = vec4(0, 0, 0, 0);\n for (float h = 0.0; h < 3.0; h+=1.0) {\n for (float w = 0.0; w < 3.0; w+=1.0) {\n vec2 matrixPos = vec2(uStepW * (w - 1), uStepH * (h - 1));\n color += texture2D(uTexture, vTexCoord + matrixPos) * uMatrix[int(h * 3.0 + w)];\n }\n }\n gl_FragColor = color;\n }\n `,\n Convolute_3_0: `\n precision highp float;\n uniform sampler2D uTexture;\n uniform float uMatrix[9];\n uniform float uStepW;\n uniform float uStepH;\n varying vec2 vTexCoord;\n void main() {\n vec4 color = vec4(0, 0, 0, 1);\n for (float h = 0.0; h < 3.0; h+=1.0) {\n for (float w = 0.0; w < 3.0; w+=1.0) {\n vec2 matrixPos = vec2(uStepW * (w - 1.0), uStepH * (h - 1.0));\n color.rgb += texture2D(uTexture, vTexCoord + matrixPos).rgb * uMatrix[int(h * 3.0 + w)];\n }\n }\n float alpha = texture2D(uTexture, vTexCoord).a;\n gl_FragColor = color;\n gl_FragColor.a = alpha;\n }\n `,\n Convolute_5_1: `\n precision highp float;\n uniform sampler2D uTexture;\n uniform float uMatrix[25];\n uniform float uStepW;\n uniform float uStepH;\n varying vec2 vTexCoord;\n void main() {\n vec4 color = vec4(0, 0, 0, 0);\n for (float h = 0.0; h < 5.0; h+=1.0) {\n for (float w = 0.0; w < 5.0; w+=1.0) {\n vec2 matrixPos = vec2(uStepW * (w - 2.0), uStepH * (h - 2.0));\n color += texture2D(uTexture, vTexCoord + matrixPos) * uMatrix[int(h * 5.0 + w)];\n }\n }\n gl_FragColor = color;\n }\n `,\n Convolute_5_0: `\n precision highp float;\n uniform sampler2D uTexture;\n uniform float uMatrix[25];\n uniform float uStepW;\n uniform float uStepH;\n varying vec2 vTexCoord;\n void main() {\n vec4 color = vec4(0, 0, 0, 1);\n for (float h = 0.0; h < 5.0; h+=1.0) {\n for (float w = 0.0; w < 5.0; w+=1.0) {\n vec2 matrixPos = vec2(uStepW * (w - 2.0), uStepH * (h - 2.0));\n color.rgb += texture2D(uTexture, vTexCoord + matrixPos).rgb * uMatrix[int(h * 5.0 + w)];\n }\n }\n float alpha = texture2D(uTexture, vTexCoord).a;\n gl_FragColor = color;\n gl_FragColor.a = alpha;\n }\n `,\n Convolute_7_1: `\n precision highp float;\n uniform sampler2D uTexture;\n uniform float uMatrix[49];\n uniform float uStepW;\n uniform float uStepH;\n varying vec2 vTexCoord;\n void main() {\n vec4 color = vec4(0, 0, 0, 0);\n for (float h = 0.0; h < 7.0; h+=1.0) {\n for (float w = 0.0; w < 7.0; w+=1.0) {\n vec2 matrixPos = vec2(uStepW * (w - 3.0), uStepH * (h - 3.0));\n color += texture2D(uTexture, vTexCoord + matrixPos) * uMatrix[int(h * 7.0 + w)];\n }\n }\n gl_FragColor = color;\n }\n `,\n Convolute_7_0: `\n precision highp float;\n uniform sampler2D uTexture;\n uniform float uMatrix[49];\n uniform float uStepW;\n uniform float uStepH;\n varying vec2 vTexCoord;\n void main() {\n vec4 color = vec4(0, 0, 0, 1);\n for (float h = 0.0; h < 7.0; h+=1.0) {\n for (float w = 0.0; w < 7.0; w+=1.0) {\n vec2 matrixPos = vec2(uStepW * (w - 3.0), uStepH * (h - 3.0));\n color.rgb += texture2D(uTexture, vTexCoord + matrixPos).rgb * uMatrix[int(h * 7.0 + w)];\n }\n }\n float alpha = texture2D(uTexture, vTexCoord).a;\n gl_FragColor = color;\n gl_FragColor.a = alpha;\n }\n `,\n Convolute_9_1: `\n precision highp float;\n uniform sampler2D uTexture;\n uniform float uMatrix[81];\n uniform float uStepW;\n uniform float uStepH;\n varying vec2 vTexCoord;\n void main() {\n vec4 color = vec4(0, 0, 0, 0);\n for (float h = 0.0; h < 9.0; h+=1.0) {\n for (float w = 0.0; w < 9.0; w+=1.0) {\n vec2 matrixPos = vec2(uStepW * (w - 4.0), uStepH * (h - 4.0));\n color += texture2D(uTexture, vTexCoord + matrixPos) * uMatrix[int(h * 9.0 + w)];\n }\n }\n gl_FragColor = color;\n }\n `,\n Convolute_9_0: `\n precision highp float;\n uniform sampler2D uTexture;\n uniform float uMatrix[81];\n uniform float uStepW;\n uniform float uStepH;\n varying vec2 vTexCoord;\n void main() {\n vec4 color = vec4(0, 0, 0, 1);\n for (float h = 0.0; h < 9.0; h+=1.0) {\n for (float w = 0.0; w < 9.0; w+=1.0) {\n vec2 matrixPos = vec2(uStepW * (w - 4.0), uStepH * (h - 4.0));\n color.rgb += texture2D(uTexture, vTexCoord + matrixPos).rgb * uMatrix[int(h * 9.0 + w)];\n }\n }\n float alpha = texture2D(uTexture, vTexCoord).a;\n gl_FragColor = color;\n gl_FragColor.a = alpha;\n }\n `,\n};\n","import { BaseFilter } from './BaseFilter';\nimport type { T2DPipelineState, TWebGLUniformLocationMap } from './typedefs';\nimport { classRegistry } from '../ClassRegistry';\nimport { fragmentSource } from './shaders/convolute';\n\nexport type ConvoluteOwnProps = {\n opaque: boolean;\n matrix: number[];\n};\n\nexport const convoluteDefaultValues: ConvoluteOwnProps = {\n opaque: false,\n matrix: [0, 0, 0, 0, 1, 0, 0, 0, 0],\n};\n\n/**\n * Adapted from html5rocks article\n * @example Sharpen filter\n * const filter = new Convolute({\n * matrix: [ 0, -1, 0,\n * -1, 5, -1,\n * 0, -1, 0 ]\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n * canvas.renderAll();\n * @example Blur filter\n * const filter = new Convolute({\n * matrix: [ 1/9, 1/9, 1/9,\n * 1/9, 1/9, 1/9,\n * 1/9, 1/9, 1/9 ]\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n * canvas.renderAll();\n * @example Emboss filter\n * const filter = new Convolute({\n * matrix: [ 1, 1, 1,\n * 1, 0.7, -1,\n * -1, -1, -1 ]\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n * canvas.renderAll();\n * @example Emboss filter with opaqueness\n * const filter = new Convolute({\n * opaque: true,\n * matrix: [ 1, 1, 1,\n * 1, 0.7, -1,\n * -1, -1, -1 ]\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n * canvas.renderAll();\n */\nexport class Convolute extends BaseFilter<'Convolute', ConvoluteOwnProps> {\n /*\n * Opaque value (true/false)\n */\n declare opaque: ConvoluteOwnProps['opaque'];\n\n /*\n * matrix for the filter, max 9x9\n */\n declare matrix: ConvoluteOwnProps['matrix'];\n\n static type = 'Convolute';\n\n static defaults = convoluteDefaultValues;\n\n static uniformLocations = ['uMatrix', 'uOpaque', 'uHalfSize', 'uSize'];\n\n getCacheKey() {\n return `${this.type}_${Math.sqrt(this.matrix.length)}_${\n this.opaque ? 1 : 0\n }` as keyof typeof fragmentSource;\n }\n\n getFragmentSource() {\n return fragmentSource[this.getCacheKey()];\n }\n\n /**\n * Apply the Brightness operation to a Uint8ClampedArray representing the pixels of an image.\n *\n * @param {Object} options\n * @param {ImageData} options.imageData The Uint8ClampedArray to be filtered.\n */\n applyTo2d(options: T2DPipelineState) {\n const imageData = options.imageData,\n data = imageData.data,\n weights = this.matrix,\n side = Math.round(Math.sqrt(weights.length)),\n halfSide = Math.floor(side / 2),\n sw = imageData.width,\n sh = imageData.height,\n output = options.ctx.createImageData(sw, sh),\n dst = output.data,\n // go through the destination image pixels\n alphaFac = this.opaque ? 1 : 0;\n let r, g, b, a, dstOff, scx, scy, srcOff, wt, x, y, cx, cy;\n\n for (y = 0; y < sh; y++) {\n for (x = 0; x < sw; x++) {\n dstOff = (y * sw + x) * 4;\n // calculate the weighed sum of the source image pixels that\n // fall under the convolution matrix\n r = 0;\n g = 0;\n b = 0;\n a = 0;\n\n for (cy = 0; cy < side; cy++) {\n for (cx = 0; cx < side; cx++) {\n scy = y + cy - halfSide;\n scx = x + cx - halfSide;\n\n // eslint-disable-next-line max-depth\n if (scy < 0 || scy >= sh || scx < 0 || scx >= sw) {\n continue;\n }\n\n srcOff = (scy * sw + scx) * 4;\n wt = weights[cy * side + cx];\n\n r += data[srcOff] * wt;\n g += data[srcOff + 1] * wt;\n b += data[srcOff + 2] * wt;\n // eslint-disable-next-line max-depth\n if (!alphaFac) {\n a += data[srcOff + 3] * wt;\n }\n }\n }\n dst[dstOff] = r;\n dst[dstOff + 1] = g;\n dst[dstOff + 2] = b;\n if (!alphaFac) {\n dst[dstOff + 3] = a;\n } else {\n dst[dstOff + 3] = data[dstOff + 3];\n }\n }\n }\n options.imageData = output;\n }\n\n /**\n * Send data from this filter to its shader program's uniforms.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n */\n sendUniformData(\n gl: WebGLRenderingContext,\n uniformLocations: TWebGLUniformLocationMap,\n ) {\n gl.uniform1fv(uniformLocations.uMatrix, this.matrix);\n }\n\n /**\n * Returns object representation of an instance\n * @return {Object} Object representation of an instance\n */\n toObject() {\n return {\n ...super.toObject(),\n opaque: this.opaque,\n matrix: [...this.matrix],\n };\n }\n}\n\nclassRegistry.setClass(Convolute);\n","export const fragmentSource = `\n precision highp float;\n uniform sampler2D uTexture;\n uniform vec3 uGamma;\n varying vec2 vTexCoord;\n void main() {\n vec4 color = texture2D(uTexture, vTexCoord);\n vec3 correction = (1.0 / uGamma);\n color.r = pow(color.r, correction.r);\n color.g = pow(color.g, correction.g);\n color.b = pow(color.b, correction.b);\n gl_FragColor = color;\n gl_FragColor.rgb *= color.a;\n }\n`;\n","import { BaseFilter } from './BaseFilter';\nimport { classRegistry } from '../ClassRegistry';\nimport { fragmentSource } from './shaders/gamma';\nimport type { T2DPipelineState, TWebGLUniformLocationMap } from './typedefs';\n\nconst GAMMA = 'Gamma' as const;\n\nexport type GammaInput = [number, number, number];\n\nexport type GammaOwnProps = {\n gamma: GammaInput;\n};\n\nexport const gammaDefaultValues: GammaOwnProps = {\n gamma: [1, 1, 1],\n};\n\n/**\n * Gamma filter class\n * @example\n * const filter = new Gamma({\n * gamma: [1, 0.5, 2.1]\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n */\nexport class Gamma extends BaseFilter {\n /**\n * Gamma array value, from 0.01 to 2.2.\n * @param {Array} gamma\n */\n declare gamma: GammaOwnProps['gamma'];\n declare rgbValues?: {\n r: Uint8Array;\n g: Uint8Array;\n b: Uint8Array;\n };\n\n static type = GAMMA;\n\n static defaults = gammaDefaultValues;\n\n static uniformLocations = ['uGamma'];\n\n getFragmentSource() {\n return fragmentSource;\n }\n\n constructor(options: { gamma?: GammaInput } = {}) {\n super(options);\n this.gamma =\n options.gamma ||\n ((\n this.constructor as typeof Gamma\n ).defaults.gamma.concat() as GammaInput);\n }\n\n /**\n * Apply the Gamma operation to a Uint8Array representing the pixels of an image.\n *\n * @param {Object} options\n * @param {ImageData} options.imageData The Uint8Array to be filtered.\n */\n applyTo2d({ imageData: { data } }: T2DPipelineState) {\n const gamma = this.gamma,\n rInv = 1 / gamma[0],\n gInv = 1 / gamma[1],\n bInv = 1 / gamma[2];\n\n if (!this.rgbValues) {\n this.rgbValues = {\n r: new Uint8Array(256),\n g: new Uint8Array(256),\n b: new Uint8Array(256),\n };\n }\n\n // This is an optimization - pre-compute a look-up table for each color channel\n // instead of performing these pow calls for each pixel in the image.\n const rgb = this.rgbValues;\n for (let i = 0; i < 256; i++) {\n rgb.r[i] = Math.pow(i / 255, rInv) * 255;\n rgb.g[i] = Math.pow(i / 255, gInv) * 255;\n rgb.b[i] = Math.pow(i / 255, bInv) * 255;\n }\n for (let i = 0; i < data.length; i += 4) {\n data[i] = rgb.r[data[i]];\n data[i + 1] = rgb.g[data[i + 1]];\n data[i + 2] = rgb.b[data[i + 2]];\n }\n }\n\n /**\n * Send data from this filter to its shader program's uniforms.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n */\n sendUniformData(\n gl: WebGLRenderingContext,\n uniformLocations: TWebGLUniformLocationMap,\n ) {\n gl.uniform3fv(uniformLocations.uGamma, this.gamma);\n }\n\n isNeutralState() {\n const { gamma } = this;\n return gamma[0] === 1 && gamma[1] === 1 && gamma[2] === 1;\n }\n\n toObject(): { type: typeof GAMMA; gamma: GammaInput } {\n return {\n type: GAMMA,\n gamma: this.gamma.concat() as GammaInput,\n };\n }\n}\n\nclassRegistry.setClass(Gamma);\n","import type { TGrayscaleMode } from '../Grayscale';\n\nexport const fragmentSource: Record = {\n average: `\n precision highp float;\n uniform sampler2D uTexture;\n varying vec2 vTexCoord;\n void main() {\n vec4 color = texture2D(uTexture, vTexCoord);\n float average = (color.r + color.b + color.g) / 3.0;\n gl_FragColor = vec4(average, average, average, color.a);\n }\n `,\n lightness: `\n precision highp float;\n uniform sampler2D uTexture;\n uniform int uMode;\n varying vec2 vTexCoord;\n void main() {\n vec4 col = texture2D(uTexture, vTexCoord);\n float average = (max(max(col.r, col.g),col.b) + min(min(col.r, col.g),col.b)) / 2.0;\n gl_FragColor = vec4(average, average, average, col.a);\n }\n `,\n luminosity: `\n precision highp float;\n uniform sampler2D uTexture;\n uniform int uMode;\n varying vec2 vTexCoord;\n void main() {\n vec4 col = texture2D(uTexture, vTexCoord);\n float average = 0.21 * col.r + 0.72 * col.g + 0.07 * col.b;\n gl_FragColor = vec4(average, average, average, col.a);\n }\n `,\n};\n","import { BaseFilter } from './BaseFilter';\nimport type { T2DPipelineState, TWebGLUniformLocationMap } from './typedefs';\nimport { classRegistry } from '../ClassRegistry';\nimport { fragmentSource } from './shaders/grayscale';\n\nexport type TGrayscaleMode = 'average' | 'lightness' | 'luminosity';\n\ntype GrayscaleOwnProps = {\n mode: TGrayscaleMode;\n};\n\nexport const grayscaleDefaultValues: GrayscaleOwnProps = {\n mode: 'average',\n};\n\n/**\n * Grayscale image filter class\n * @example\n * const filter = new Grayscale();\n * object.filters.push(filter);\n * object.applyFilters();\n */\nexport class Grayscale extends BaseFilter<'Grayscale', GrayscaleOwnProps> {\n declare mode: TGrayscaleMode;\n\n static type = 'Grayscale';\n\n static defaults = grayscaleDefaultValues;\n\n static uniformLocations = ['uMode'];\n\n /**\n * Apply the Grayscale operation to a Uint8Array representing the pixels of an image.\n *\n * @param {Object} options\n * @param {ImageData} options.imageData The Uint8Array to be filtered.\n */\n applyTo2d({ imageData: { data } }: T2DPipelineState) {\n for (let i = 0, value: number; i < data.length; i += 4) {\n const r = data[i];\n const g = data[i + 1];\n const b = data[i + 2];\n switch (this.mode) {\n case 'average':\n value = (r + g + b) / 3;\n break;\n case 'lightness':\n value = (Math.min(r, g, b) + Math.max(r, g, b)) / 2;\n break;\n case 'luminosity':\n value = 0.21 * r + 0.72 * g + 0.07 * b;\n break;\n }\n\n data[i + 2] = data[i + 1] = data[i] = value;\n }\n }\n\n getCacheKey() {\n return `${this.type}_${this.mode}`;\n }\n\n getFragmentSource() {\n return fragmentSource[this.mode];\n }\n\n /**\n * Send data from this filter to its shader program's uniforms.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n */\n sendUniformData(\n gl: WebGLRenderingContext,\n uniformLocations: TWebGLUniformLocationMap,\n ) {\n const mode = 1;\n gl.uniform1i(uniformLocations.uMode, mode);\n }\n\n /**\n * Grayscale filter isNeutralState implementation\n * The filter is never neutral\n * on the image\n **/\n isNeutralState() {\n return false;\n }\n}\n\nclassRegistry.setClass(Grayscale);\n","import { cos } from '../util/misc/cos';\nimport { sin } from '../util/misc/sin';\nimport {\n ColorMatrix,\n type ColorMatrixOwnProps,\n colorMatrixDefaultValues,\n} from './ColorMatrix';\nimport type { TWebGLPipelineState, T2DPipelineState } from './typedefs';\nimport { classRegistry } from '../ClassRegistry';\n\nexport type HueRotationOwnProps = ColorMatrixOwnProps & {\n rotation: number;\n};\n\nexport type HueRotationSerializedProps = {\n rotation: number;\n};\n\nexport const hueRotationDefaultValues: HueRotationOwnProps = {\n ...colorMatrixDefaultValues,\n rotation: 0,\n};\n\n/**\n * HueRotation filter class\n * @example\n * const filter = new HueRotation({\n * rotation: -0.5\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n */\nexport class HueRotation extends ColorMatrix<\n 'HueRotation',\n HueRotationOwnProps,\n HueRotationSerializedProps\n> {\n /**\n * HueRotation value, from -1 to 1.\n */\n declare rotation: HueRotationOwnProps['rotation'];\n\n static type = 'HueRotation';\n\n static defaults = hueRotationDefaultValues;\n\n calculateMatrix() {\n const rad = this.rotation * Math.PI,\n cosine = cos(rad),\n sine = sin(rad),\n aThird = 1 / 3,\n aThirdSqtSin = Math.sqrt(aThird) * sine,\n OneMinusCos = 1 - cosine;\n this.matrix = [\n cosine + OneMinusCos / 3,\n aThird * OneMinusCos - aThirdSqtSin,\n aThird * OneMinusCos + aThirdSqtSin,\n 0,\n 0,\n aThird * OneMinusCos + aThirdSqtSin,\n cosine + aThird * OneMinusCos,\n aThird * OneMinusCos - aThirdSqtSin,\n 0,\n 0,\n aThird * OneMinusCos - aThirdSqtSin,\n aThird * OneMinusCos + aThirdSqtSin,\n cosine + aThird * OneMinusCos,\n 0,\n 0,\n 0,\n 0,\n 0,\n 1,\n 0,\n ];\n }\n\n isNeutralState() {\n return this.rotation === 0;\n }\n\n applyTo(options: TWebGLPipelineState | T2DPipelineState) {\n this.calculateMatrix();\n super.applyTo(options);\n }\n\n toObject() {\n return {\n type: this.type,\n rotation: this.rotation,\n };\n }\n}\n\nclassRegistry.setClass(HueRotation);\n","import { BaseFilter } from './BaseFilter';\nimport type { T2DPipelineState, TWebGLUniformLocationMap } from './typedefs';\nimport { classRegistry } from '../ClassRegistry';\nimport { fragmentSource } from './shaders/invert';\n\nexport type InvertOwnProps = {\n alpha: boolean;\n invert: boolean;\n};\n\nexport const invertDefaultValues: InvertOwnProps = {\n alpha: false,\n invert: true,\n};\n\n/**\n * @example\n * const filter = new Invert();\n * object.filters.push(filter);\n * object.applyFilters(canvas.renderAll.bind(canvas));\n */\nexport class Invert extends BaseFilter<'Invert', InvertOwnProps> {\n /**\n * Invert also alpha.\n * @param {Boolean} alpha\n **/\n declare alpha: InvertOwnProps['alpha'];\n\n /**\n * Filter invert. if false, does nothing\n * @param {Boolean} invert\n */\n declare invert: InvertOwnProps['invert'];\n\n static type = 'Invert';\n\n static defaults = invertDefaultValues;\n\n static uniformLocations = ['uInvert', 'uAlpha'];\n\n /**\n * Apply the Invert operation to a Uint8Array representing the pixels of an image.\n *\n * @param {Object} options\n * @param {ImageData} options.imageData The Uint8Array to be filtered.\n */\n applyTo2d({ imageData: { data } }: T2DPipelineState) {\n for (let i = 0; i < data.length; i += 4) {\n data[i] = 255 - data[i];\n data[i + 1] = 255 - data[i + 1];\n data[i + 2] = 255 - data[i + 2];\n\n if (this.alpha) {\n data[i + 3] = 255 - data[i + 3];\n }\n }\n }\n\n protected getFragmentSource(): string {\n return fragmentSource;\n }\n\n /**\n * Invert filter isNeutralState implementation\n * Used only in image applyFilters to discard filters that will not have an effect\n * on the image\n * @param {Object} options\n **/\n isNeutralState() {\n return !this.invert;\n }\n\n /**\n * Send data from this filter to its shader program's uniforms.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n */\n sendUniformData(\n gl: WebGLRenderingContext,\n uniformLocations: TWebGLUniformLocationMap,\n ) {\n gl.uniform1i(uniformLocations.uInvert, Number(this.invert));\n gl.uniform1i(uniformLocations.uAlpha, Number(this.alpha));\n }\n}\n\nclassRegistry.setClass(Invert);\n","export const fragmentSource = `\n precision highp float;\n uniform sampler2D uTexture;\n uniform int uInvert;\n uniform int uAlpha;\n varying vec2 vTexCoord;\n void main() {\n vec4 color = texture2D(uTexture, vTexCoord);\n if (uInvert == 1) {\n if (uAlpha == 1) {\n gl_FragColor = vec4(1.0 - color.r,1.0 -color.g,1.0 -color.b,1.0 -color.a);\n } else {\n gl_FragColor = vec4(1.0 - color.r,1.0 -color.g,1.0 -color.b,color.a);\n }\n } else {\n gl_FragColor = color;\n }\n }\n`;\n","import { BaseFilter } from './BaseFilter';\nimport type { T2DPipelineState, TWebGLUniformLocationMap } from './typedefs';\nimport { classRegistry } from '../ClassRegistry';\nimport { fragmentSource } from './shaders/noise';\n\nexport type NoiseOwnProps = {\n noise: number;\n};\n\nexport const noiseDefaultValues: NoiseOwnProps = {\n noise: 0,\n};\n\n/**\n * Noise filter class\n * @example\n * const filter = new Noise({\n * noise: 700\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n * canvas.renderAll();\n */\nexport class Noise extends BaseFilter<'Noise', NoiseOwnProps> {\n /**\n * Noise value, from\n * @param {Number} noise\n */\n declare noise: NoiseOwnProps['noise'];\n\n static type = 'Noise';\n\n static defaults = noiseDefaultValues;\n\n static uniformLocations = ['uNoise', 'uSeed'];\n\n getFragmentSource() {\n return fragmentSource;\n }\n\n /**\n * Apply the Brightness operation to a Uint8ClampedArray representing the pixels of an image.\n *\n * @param {Object} options\n * @param {ImageData} options.imageData The Uint8ClampedArray to be filtered.\n */\n applyTo2d({ imageData: { data } }: T2DPipelineState) {\n const noise = this.noise;\n for (let i = 0; i < data.length; i += 4) {\n const rand = (0.5 - Math.random()) * noise;\n data[i] += rand;\n data[i + 1] += rand;\n data[i + 2] += rand;\n }\n }\n\n /**\n * Send data from this filter to its shader program's uniforms.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n */\n sendUniformData(\n gl: WebGLRenderingContext,\n uniformLocations: TWebGLUniformLocationMap,\n ) {\n gl.uniform1f(uniformLocations.uNoise, this.noise / 255);\n gl.uniform1f(uniformLocations.uSeed, Math.random());\n }\n\n isNeutralState() {\n return this.noise === 0;\n }\n}\n\nclassRegistry.setClass(Noise);\n","export const fragmentSource = `\n precision highp float;\n uniform sampler2D uTexture;\n uniform float uStepH;\n uniform float uNoise;\n uniform float uSeed;\n varying vec2 vTexCoord;\n float rand(vec2 co, float seed, float vScale) {\n return fract(sin(dot(co.xy * vScale ,vec2(12.9898 , 78.233))) * 43758.5453 * (seed + 0.01) / 2.0);\n }\n void main() {\n vec4 color = texture2D(uTexture, vTexCoord);\n color.rgb += (0.5 - rand(vTexCoord, uSeed, 0.1 / uStepH)) * uNoise;\n gl_FragColor = color;\n }\n`;\n","import { BaseFilter } from './BaseFilter';\nimport type { T2DPipelineState, TWebGLUniformLocationMap } from './typedefs';\nimport { classRegistry } from '../ClassRegistry';\nimport { fragmentSource } from './shaders/pixelate';\n\nexport type PixelateOwnProps = {\n blocksize: number;\n};\n\nexport const pixelateDefaultValues: PixelateOwnProps = {\n blocksize: 4,\n};\n\n/**\n * Pixelate filter class\n * @example\n * const filter = new Pixelate({\n * blocksize: 8\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n */\nexport class Pixelate extends BaseFilter<'Pixelate', PixelateOwnProps> {\n declare blocksize: PixelateOwnProps['blocksize'];\n\n static type = 'Pixelate';\n\n static defaults = pixelateDefaultValues;\n\n static uniformLocations = ['uBlocksize'];\n\n /**\n * Apply the Pixelate operation to a Uint8ClampedArray representing the pixels of an image.\n *\n * @param {Object} options\n * @param {ImageData} options.imageData The Uint8ClampedArray to be filtered.\n */\n applyTo2d({ imageData: { data, width, height } }: T2DPipelineState) {\n for (let i = 0; i < height; i += this.blocksize) {\n for (let j = 0; j < width; j += this.blocksize) {\n const index = i * 4 * width + j * 4;\n const r = data[index];\n const g = data[index + 1];\n const b = data[index + 2];\n const a = data[index + 3];\n\n for (let _i = i; _i < Math.min(i + this.blocksize, height); _i++) {\n for (let _j = j; _j < Math.min(j + this.blocksize, width); _j++) {\n const index = _i * 4 * width + _j * 4;\n data[index] = r;\n data[index + 1] = g;\n data[index + 2] = b;\n data[index + 3] = a;\n }\n }\n }\n }\n }\n\n /**\n * Indicate when the filter is not gonna apply changes to the image\n **/\n isNeutralState() {\n return this.blocksize === 1;\n }\n\n protected getFragmentSource(): string {\n return fragmentSource;\n }\n\n /**\n * Send data from this filter to its shader program's uniforms.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n */\n sendUniformData(\n gl: WebGLRenderingContext,\n uniformLocations: TWebGLUniformLocationMap,\n ) {\n gl.uniform1f(uniformLocations.uBlocksize, this.blocksize);\n }\n}\n\nclassRegistry.setClass(Pixelate);\n","export const fragmentSource = `\n precision highp float;\n uniform sampler2D uTexture;\n uniform float uBlocksize;\n uniform float uStepW;\n uniform float uStepH;\n varying vec2 vTexCoord;\n void main() {\n float blockW = uBlocksize * uStepW;\n float blockH = uBlocksize * uStepH;\n int posX = int(vTexCoord.x / blockW);\n int posY = int(vTexCoord.y / blockH);\n float fposX = float(posX);\n float fposY = float(posY);\n vec2 squareCoords = vec2(fposX * blockW, fposY * blockH);\n vec4 color = texture2D(uTexture, squareCoords);\n gl_FragColor = color;\n }\n`;\n","import { classRegistry } from '../ClassRegistry';\nimport { Color } from '../color/Color';\nimport { BaseFilter } from './BaseFilter';\nimport { fragmentShader } from './shaders/removeColor';\nimport type { T2DPipelineState, TWebGLUniformLocationMap } from './typedefs';\n\nexport type RemoveColorOwnProps = {\n color: string;\n distance: number;\n useAlpha: boolean;\n};\n\nexport const removeColorDefaultValues: RemoveColorOwnProps = {\n color: '#FFFFFF',\n distance: 0.02,\n useAlpha: false,\n};\n\n/**\n * Remove white filter class\n * @example\n * const filter = new RemoveColor({\n * threshold: 0.2,\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n * canvas.renderAll();\n */\nexport class RemoveColor extends BaseFilter<\n 'RemoveColor',\n RemoveColorOwnProps\n> {\n /**\n * Color to remove, in any format understood by {@link Color}.\n */\n declare color: RemoveColorOwnProps['color'];\n\n /**\n * distance to actual color, as value up or down from each r,g,b\n * between 0 and 1\n **/\n declare distance: RemoveColorOwnProps['distance'];\n\n /**\n * For color to remove inside distance, use alpha channel for a smoother deletion\n * NOT IMPLEMENTED YET\n **/\n declare useAlpha: RemoveColorOwnProps['useAlpha'];\n\n static type = 'RemoveColor';\n\n static defaults = removeColorDefaultValues;\n\n static uniformLocations = ['uLow', 'uHigh'];\n\n getFragmentSource() {\n return fragmentShader;\n }\n\n /**\n * Applies filter to canvas element\n * @param {Object} canvasEl Canvas element to apply filter to\n */\n applyTo2d({ imageData: { data } }: T2DPipelineState) {\n const distance = this.distance * 255,\n source = new Color(this.color).getSource(),\n lowC = [source[0] - distance, source[1] - distance, source[2] - distance],\n highC = [\n source[0] + distance,\n source[1] + distance,\n source[2] + distance,\n ];\n\n for (let i = 0; i < data.length; i += 4) {\n const r = data[i];\n const g = data[i + 1];\n const b = data[i + 2];\n\n if (\n r > lowC[0] &&\n g > lowC[1] &&\n b > lowC[2] &&\n r < highC[0] &&\n g < highC[1] &&\n b < highC[2]\n ) {\n data[i + 3] = 0;\n }\n }\n }\n\n /**\n * Send data from this filter to its shader program's uniforms.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n */\n sendUniformData(\n gl: WebGLRenderingContext,\n uniformLocations: TWebGLUniformLocationMap,\n ) {\n const source = new Color(this.color).getSource(),\n distance = this.distance,\n lowC = [\n 0 + source[0] / 255 - distance,\n 0 + source[1] / 255 - distance,\n 0 + source[2] / 255 - distance,\n 1,\n ],\n highC = [\n source[0] / 255 + distance,\n source[1] / 255 + distance,\n source[2] / 255 + distance,\n 1,\n ];\n gl.uniform4fv(uniformLocations.uLow, lowC);\n gl.uniform4fv(uniformLocations.uHigh, highC);\n }\n}\n\nclassRegistry.setClass(RemoveColor);\n","export const fragmentShader = `\nprecision highp float;\nuniform sampler2D uTexture;\nuniform vec4 uLow;\nuniform vec4 uHigh;\nvarying vec2 vTexCoord;\nvoid main() {\n gl_FragColor = texture2D(uTexture, vTexCoord);\n if(all(greaterThan(gl_FragColor.rgb,uLow.rgb)) && all(greaterThan(uHigh.rgb,gl_FragColor.rgb))) {\n gl_FragColor.a = 0.0;\n }\n}\n`;\n","import { BaseFilter } from './BaseFilter';\nimport type {\n T2DPipelineState,\n TWebGLPipelineState,\n TWebGLUniformLocationMap,\n} from './typedefs';\nimport { isWebGLPipelineState } from './utils';\nimport { classRegistry } from '../ClassRegistry';\nimport { createCanvasElement } from '../util/misc/dom';\nimport type { XY } from '../Point';\n\nexport type TResizeType = 'bilinear' | 'hermite' | 'sliceHack' | 'lanczos';\n\nexport type ResizeOwnProps = {\n resizeType: TResizeType;\n scaleX: number;\n scaleY: number;\n lanczosLobes: number;\n};\n\nexport type ResizeSerializedProps = ResizeOwnProps;\n\nexport const resizeDefaultValues: ResizeOwnProps = {\n resizeType: 'hermite',\n scaleX: 1,\n scaleY: 1,\n lanczosLobes: 3,\n};\n\ntype ResizeDuring2DResize = Resize & {\n rcpScaleX: number;\n rcpScaleY: number;\n};\n\ntype ResizeDuringWEBGLResize = Resize & {\n rcpScaleX: number;\n rcpScaleY: number;\n horizontal: boolean;\n width: number;\n height: number;\n taps: number[];\n tempScale: number;\n dH: number;\n dW: number;\n};\n\n/**\n * Resize image filter class\n * @example\n * const filter = new Resize();\n * object.filters.push(filter);\n * object.applyFilters(canvas.renderAll.bind(canvas));\n */\nexport class Resize extends BaseFilter<'Resize', ResizeOwnProps> {\n /**\n * Resize type\n * for webgl resizeType is just lanczos, for canvas2d can be:\n * bilinear, hermite, sliceHack, lanczos.\n */\n declare resizeType: ResizeOwnProps['resizeType'];\n\n /**\n * Scale factor for resizing, x axis\n * @param {Number} scaleX\n */\n declare scaleX: ResizeOwnProps['scaleX'];\n\n /**\n * Scale factor for resizing, y axis\n * @param {Number} scaleY\n */\n declare scaleY: ResizeOwnProps['scaleY'];\n\n /**\n * LanczosLobes parameter for lanczos filter, valid for resizeType lanczos\n * @param {Number} lanczosLobes\n */\n declare lanczosLobes: ResizeOwnProps['lanczosLobes'];\n\n static type = 'Resize';\n\n static defaults = resizeDefaultValues;\n\n static uniformLocations = ['uDelta', 'uTaps'];\n\n /**\n * Send data from this filter to its shader program's uniforms.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n */\n sendUniformData(\n this: ResizeDuringWEBGLResize,\n gl: WebGLRenderingContext,\n uniformLocations: TWebGLUniformLocationMap,\n ) {\n gl.uniform2fv(\n uniformLocations.uDelta,\n this.horizontal ? [1 / this.width, 0] : [0, 1 / this.height],\n );\n gl.uniform1fv(uniformLocations.uTaps, this.taps);\n }\n\n getFilterWindow(this: ResizeDuringWEBGLResize) {\n const scale = this.tempScale;\n return Math.ceil(this.lanczosLobes / scale);\n }\n\n getCacheKey(this: ResizeDuringWEBGLResize): string {\n const filterWindow = this.getFilterWindow();\n return `${this.type}_${filterWindow}`;\n }\n\n getFragmentSource(this: ResizeDuringWEBGLResize): string {\n const filterWindow = this.getFilterWindow();\n return this.generateShader(filterWindow);\n }\n\n getTaps(this: ResizeDuringWEBGLResize) {\n const lobeFunction = this.lanczosCreate(this.lanczosLobes),\n scale = this.tempScale,\n filterWindow = this.getFilterWindow(),\n taps = new Array(filterWindow);\n for (let i = 1; i <= filterWindow; i++) {\n taps[i - 1] = lobeFunction(i * scale);\n }\n return taps;\n }\n\n /**\n * Generate vertex and shader sources from the necessary steps numbers\n * @param {Number} filterWindow\n */\n generateShader(filterWindow: number) {\n const offsets = new Array(filterWindow);\n for (let i = 1; i <= filterWindow; i++) {\n offsets[i - 1] = `${i}.0 * uDelta`;\n }\n return `\n precision highp float;\n uniform sampler2D uTexture;\n uniform vec2 uDelta;\n varying vec2 vTexCoord;\n uniform float uTaps[${filterWindow}];\n void main() {\n vec4 color = texture2D(uTexture, vTexCoord);\n float sum = 1.0;\n ${offsets\n .map(\n (offset, i) => `\n color += texture2D(uTexture, vTexCoord + ${offset}) * uTaps[${i}] + texture2D(uTexture, vTexCoord - ${offset}) * uTaps[${i}];\n sum += 2.0 * uTaps[${i}];\n `,\n )\n .join('\\n')}\n gl_FragColor = color / sum;\n }\n `;\n }\n\n applyToForWebgl(this: ResizeDuringWEBGLResize, options: TWebGLPipelineState) {\n options.passes++;\n this.width = options.sourceWidth;\n this.horizontal = true;\n this.dW = Math.round(this.width * this.scaleX);\n this.dH = options.sourceHeight;\n this.tempScale = this.dW / this.width;\n this.taps = this.getTaps();\n options.destinationWidth = this.dW;\n super.applyTo(options);\n options.sourceWidth = options.destinationWidth;\n\n this.height = options.sourceHeight;\n this.horizontal = false;\n this.dH = Math.round(this.height * this.scaleY);\n this.tempScale = this.dH / this.height;\n this.taps = this.getTaps();\n options.destinationHeight = this.dH;\n super.applyTo(options);\n options.sourceHeight = options.destinationHeight;\n }\n\n /**\n * Apply the resize filter to the image\n * Determines whether to use WebGL or Canvas2D based on the options.webgl flag.\n *\n * @param {Object} options\n * @param {Number} options.passes The number of filters remaining to be executed\n * @param {Boolean} options.webgl Whether to use webgl to render the filter.\n * @param {WebGLTexture} options.sourceTexture The texture setup as the source to be filtered.\n * @param {WebGLTexture} options.targetTexture The texture where filtered output should be drawn.\n * @param {WebGLRenderingContext} options.context The GL context used for rendering.\n * @param {Object} options.programCache A map of compiled shader programs, keyed by filter type.\n */\n applyTo(options: TWebGLPipelineState | T2DPipelineState) {\n if (isWebGLPipelineState(options)) {\n (this as unknown as ResizeDuringWEBGLResize).applyToForWebgl(options);\n } else {\n (this as unknown as ResizeDuring2DResize).applyTo2d(options);\n }\n }\n\n isNeutralState() {\n return this.scaleX === 1 && this.scaleY === 1;\n }\n\n lanczosCreate(lobes: number) {\n return (x: number) => {\n if (x >= lobes || x <= -lobes) {\n return 0.0;\n }\n if (x < 1.1920929e-7 && x > -1.1920929e-7) {\n return 1.0;\n }\n x *= Math.PI;\n const xx = x / lobes;\n return ((Math.sin(x) / x) * Math.sin(xx)) / xx;\n };\n }\n\n applyTo2d(this: ResizeDuring2DResize, options: T2DPipelineState) {\n const imageData = options.imageData,\n scaleX = this.scaleX,\n scaleY = this.scaleY;\n\n this.rcpScaleX = 1 / scaleX;\n this.rcpScaleY = 1 / scaleY;\n\n const oW = imageData.width;\n const oH = imageData.height;\n const dW = Math.round(oW * scaleX);\n const dH = Math.round(oH * scaleY);\n let newData: ImageData;\n\n if (this.resizeType === 'sliceHack') {\n newData = this.sliceByTwo(options, oW, oH, dW, dH);\n } else if (this.resizeType === 'hermite') {\n newData = this.hermiteFastResize(options, oW, oH, dW, dH);\n } else if (this.resizeType === 'bilinear') {\n newData = this.bilinearFiltering(options, oW, oH, dW, dH);\n } else if (this.resizeType === 'lanczos') {\n newData = this.lanczosResize(options, oW, oH, dW, dH);\n } else {\n // this should never trigger, is here just for safety net.\n newData = new ImageData(dW, dH);\n }\n options.imageData = newData;\n }\n\n /**\n * Filter sliceByTwo\n * @param {Object} canvasEl Canvas element to apply filter to\n * @param {Number} oW Original Width\n * @param {Number} oH Original Height\n * @param {Number} dW Destination Width\n * @param {Number} dH Destination Height\n * @returns {ImageData}\n */\n sliceByTwo(\n options: T2DPipelineState,\n oW: number,\n oH: number,\n dW: number,\n dH: number,\n ) {\n const imageData = options.imageData;\n const mult = 0.5;\n let doneW = false;\n let doneH = false;\n let stepW = oW * mult;\n let stepH = oH * mult;\n const resources = options.filterBackend.resources;\n let sX = 0;\n let sY = 0;\n const dX = oW;\n let dY = 0;\n if (!resources.sliceByTwo) {\n resources.sliceByTwo = createCanvasElement();\n }\n const tmpCanvas = resources.sliceByTwo;\n if (tmpCanvas.width < oW * 1.5 || tmpCanvas.height < oH) {\n tmpCanvas.width = oW * 1.5;\n tmpCanvas.height = oH;\n }\n const ctx = tmpCanvas.getContext('2d')!;\n ctx.clearRect(0, 0, oW * 1.5, oH);\n ctx.putImageData(imageData, 0, 0);\n\n dW = Math.floor(dW);\n dH = Math.floor(dH);\n\n while (!doneW || !doneH) {\n oW = stepW;\n oH = stepH;\n if (dW < Math.floor(stepW * mult)) {\n stepW = Math.floor(stepW * mult);\n } else {\n stepW = dW;\n doneW = true;\n }\n if (dH < Math.floor(stepH * mult)) {\n stepH = Math.floor(stepH * mult);\n } else {\n stepH = dH;\n doneH = true;\n }\n ctx.drawImage(tmpCanvas, sX, sY, oW, oH, dX, dY, stepW, stepH);\n sX = dX;\n sY = dY;\n dY += stepH;\n }\n return ctx.getImageData(sX, sY, dW, dH);\n }\n\n /**\n * Filter lanczosResize\n * @param {Object} canvasEl Canvas element to apply filter to\n * @param {Number} oW Original Width\n * @param {Number} oH Original Height\n * @param {Number} dW Destination Width\n * @param {Number} dH Destination Height\n * @returns {ImageData}\n */\n lanczosResize(\n this: ResizeDuring2DResize,\n options: T2DPipelineState,\n oW: number,\n oH: number,\n dW: number,\n dH: number,\n ): ImageData {\n function process(u: number): ImageData {\n let v, i, weight, idx, a, red, green, blue, alpha, fX, fY;\n center.x = (u + 0.5) * ratioX;\n icenter.x = Math.floor(center.x);\n for (v = 0; v < dH; v++) {\n center.y = (v + 0.5) * ratioY;\n icenter.y = Math.floor(center.y);\n a = 0;\n red = 0;\n green = 0;\n blue = 0;\n alpha = 0;\n for (i = icenter.x - range2X; i <= icenter.x + range2X; i++) {\n if (i < 0 || i >= oW) {\n continue;\n }\n fX = Math.floor(1000 * Math.abs(i - center.x));\n if (!cacheLanc[fX]) {\n cacheLanc[fX] = {};\n }\n for (let j = icenter.y - range2Y; j <= icenter.y + range2Y; j++) {\n if (j < 0 || j >= oH) {\n continue;\n }\n fY = Math.floor(1000 * Math.abs(j - center.y));\n if (!cacheLanc[fX][fY]) {\n cacheLanc[fX][fY] = lanczos(\n Math.sqrt(\n Math.pow(fX * rcpRatioX, 2) + Math.pow(fY * rcpRatioY, 2),\n ) / 1000,\n );\n }\n weight = cacheLanc[fX][fY];\n if (weight > 0) {\n idx = (j * oW + i) * 4;\n a += weight;\n red += weight * srcData[idx];\n green += weight * srcData[idx + 1];\n blue += weight * srcData[idx + 2];\n alpha += weight * srcData[idx + 3];\n }\n }\n }\n idx = (v * dW + u) * 4;\n destData[idx] = red / a;\n destData[idx + 1] = green / a;\n destData[idx + 2] = blue / a;\n destData[idx + 3] = alpha / a;\n }\n\n if (++u < dW) {\n return process(u);\n } else {\n return destImg;\n }\n }\n\n const srcData = options.imageData.data,\n destImg = options.ctx.createImageData(dW, dH),\n destData = destImg.data,\n lanczos = this.lanczosCreate(this.lanczosLobes),\n ratioX = this.rcpScaleX,\n ratioY = this.rcpScaleY,\n rcpRatioX = 2 / this.rcpScaleX,\n rcpRatioY = 2 / this.rcpScaleY,\n range2X = Math.ceil((ratioX * this.lanczosLobes) / 2),\n range2Y = Math.ceil((ratioY * this.lanczosLobes) / 2),\n cacheLanc: Record> = {},\n center: XY = { x: 0, y: 0 },\n icenter: XY = { x: 0, y: 0 };\n\n return process(0);\n }\n\n /**\n * bilinearFiltering\n * @param {Object} canvasEl Canvas element to apply filter to\n * @param {Number} oW Original Width\n * @param {Number} oH Original Height\n * @param {Number} dW Destination Width\n * @param {Number} dH Destination Height\n * @returns {ImageData}\n */\n bilinearFiltering(\n this: ResizeDuring2DResize,\n options: T2DPipelineState,\n oW: number,\n oH: number,\n dW: number,\n dH: number,\n ) {\n let a;\n let b;\n let c;\n let d;\n let x;\n let y;\n let i;\n let j;\n let xDiff;\n let yDiff;\n let chnl;\n let color;\n let offset = 0;\n let origPix;\n const ratioX = this.rcpScaleX;\n const ratioY = this.rcpScaleY;\n const w4 = 4 * (oW - 1);\n const img = options.imageData;\n const pixels = img.data;\n const destImage = options.ctx.createImageData(dW, dH);\n const destPixels = destImage.data;\n for (i = 0; i < dH; i++) {\n for (j = 0; j < dW; j++) {\n x = Math.floor(ratioX * j);\n y = Math.floor(ratioY * i);\n xDiff = ratioX * j - x;\n yDiff = ratioY * i - y;\n origPix = 4 * (y * oW + x);\n\n for (chnl = 0; chnl < 4; chnl++) {\n a = pixels[origPix + chnl];\n b = pixels[origPix + 4 + chnl];\n c = pixels[origPix + w4 + chnl];\n d = pixels[origPix + w4 + 4 + chnl];\n color =\n a * (1 - xDiff) * (1 - yDiff) +\n b * xDiff * (1 - yDiff) +\n c * yDiff * (1 - xDiff) +\n d * xDiff * yDiff;\n destPixels[offset++] = color;\n }\n }\n }\n return destImage;\n }\n\n /**\n * hermiteFastResize\n * @param {Object} canvasEl Canvas element to apply filter to\n * @param {Number} oW Original Width\n * @param {Number} oH Original Height\n * @param {Number} dW Destination Width\n * @param {Number} dH Destination Height\n * @returns {ImageData}\n */\n hermiteFastResize(\n this: ResizeDuring2DResize,\n options: T2DPipelineState,\n oW: number,\n oH: number,\n dW: number,\n dH: number,\n ) {\n const ratioW = this.rcpScaleX,\n ratioH = this.rcpScaleY,\n ratioWHalf = Math.ceil(ratioW / 2),\n ratioHHalf = Math.ceil(ratioH / 2),\n img = options.imageData,\n data = img.data,\n img2 = options.ctx.createImageData(dW, dH),\n data2 = img2.data;\n for (let j = 0; j < dH; j++) {\n for (let i = 0; i < dW; i++) {\n const x2 = (i + j * dW) * 4;\n let weight = 0;\n let weights = 0;\n let weightsAlpha = 0;\n let gxR = 0;\n let gxG = 0;\n let gxB = 0;\n let gxA = 0;\n const centerY = (j + 0.5) * ratioH;\n for (let yy = Math.floor(j * ratioH); yy < (j + 1) * ratioH; yy++) {\n const dy = Math.abs(centerY - (yy + 0.5)) / ratioHHalf,\n centerX = (i + 0.5) * ratioW,\n w0 = dy * dy;\n for (let xx = Math.floor(i * ratioW); xx < (i + 1) * ratioW; xx++) {\n let dx = Math.abs(centerX - (xx + 0.5)) / ratioWHalf;\n const w = Math.sqrt(w0 + dx * dx);\n /* eslint-disable max-depth */\n if (w > 1 && w < -1) {\n continue;\n }\n //hermite filter\n weight = 2 * w * w * w - 3 * w * w + 1;\n if (weight > 0) {\n dx = 4 * (xx + yy * oW);\n //alpha\n gxA += weight * data[dx + 3];\n weightsAlpha += weight;\n //colors\n if (data[dx + 3] < 255) {\n weight = (weight * data[dx + 3]) / 250;\n }\n gxR += weight * data[dx];\n gxG += weight * data[dx + 1];\n gxB += weight * data[dx + 2];\n weights += weight;\n }\n /* eslint-enable max-depth */\n }\n }\n data2[x2] = gxR / weights;\n data2[x2 + 1] = gxG / weights;\n data2[x2 + 2] = gxB / weights;\n data2[x2 + 3] = gxA / weightsAlpha;\n }\n }\n return img2;\n }\n}\n\nclassRegistry.setClass(Resize);\n","import { BaseFilter } from './BaseFilter';\nimport type { T2DPipelineState, TWebGLUniformLocationMap } from './typedefs';\nimport { classRegistry } from '../ClassRegistry';\nimport { fragmentSource } from './shaders/saturation';\n\nexport type SaturationOwnProps = {\n saturation: number;\n};\n\nexport const saturationDefaultValues: SaturationOwnProps = {\n saturation: 0,\n};\n\n/**\n * Saturate filter class\n * @example\n * const filter = new Saturation({\n * saturation: 1\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n */\nexport class Saturation extends BaseFilter<'Saturation', SaturationOwnProps> {\n /**\n * Saturation value, from -1 to 1.\n * Increases/decreases the color saturation.\n * A value of 0 has no effect.\n *\n * @param {Number} saturation\n */\n declare saturation: SaturationOwnProps['saturation'];\n\n static type = 'Saturation';\n\n static defaults = saturationDefaultValues;\n\n static uniformLocations = ['uSaturation'];\n\n getFragmentSource() {\n return fragmentSource;\n }\n\n /**\n * Apply the Saturation operation to a Uint8ClampedArray representing the pixels of an image.\n *\n * @param {Object} options\n * @param {ImageData} options.imageData The Uint8ClampedArray to be filtered.\n */\n applyTo2d({ imageData: { data } }: T2DPipelineState) {\n const adjust = -this.saturation;\n for (let i = 0; i < data.length; i += 4) {\n const r = data[i];\n const g = data[i + 1];\n const b = data[i + 2];\n const max = Math.max(r, g, b);\n data[i] += max !== r ? (max - r) * adjust : 0;\n data[i + 1] += max !== g ? (max - g) * adjust : 0;\n data[i + 2] += max !== b ? (max - b) * adjust : 0;\n }\n }\n\n /**\n * Send data from this filter to its shader program's uniforms.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n */\n sendUniformData(\n gl: WebGLRenderingContext,\n uniformLocations: TWebGLUniformLocationMap,\n ) {\n gl.uniform1f(uniformLocations.uSaturation, -this.saturation);\n }\n\n isNeutralState() {\n return this.saturation === 0;\n }\n}\n\nclassRegistry.setClass(Saturation);\n","export const fragmentSource = `\n precision highp float;\n uniform sampler2D uTexture;\n uniform float uSaturation;\n varying vec2 vTexCoord;\n void main() {\n vec4 color = texture2D(uTexture, vTexCoord);\n float rgMax = max(color.r, color.g);\n float rgbMax = max(rgMax, color.b);\n color.r += rgbMax != color.r ? (rgbMax - color.r) * uSaturation : 0.00;\n color.g += rgbMax != color.g ? (rgbMax - color.g) * uSaturation : 0.00;\n color.b += rgbMax != color.b ? (rgbMax - color.b) * uSaturation : 0.00;\n gl_FragColor = color;\n }\n`;\n","import { BaseFilter } from './BaseFilter';\nimport type { T2DPipelineState, TWebGLUniformLocationMap } from './typedefs';\nimport { classRegistry } from '../ClassRegistry';\nimport { fragmentSource } from './shaders/vibrance';\n\nexport type VibranceOwnProps = {\n vibrance: number;\n};\n\nexport const vibranceDefaultValues: VibranceOwnProps = {\n vibrance: 0,\n};\n\n/**\n * Vibrance filter class\n * @example\n * const filter = new Vibrance({\n * vibrance: 1\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n */\nexport class Vibrance extends BaseFilter<'Vibrance', VibranceOwnProps> {\n /**\n * Vibrance value, from -1 to 1.\n * Increases/decreases the saturation of more muted colors with less effect on saturated colors.\n * A value of 0 has no effect.\n *\n * @param {Number} vibrance\n */\n declare vibrance: VibranceOwnProps['vibrance'];\n\n static type = 'Vibrance';\n\n static defaults = vibranceDefaultValues;\n\n static uniformLocations = ['uVibrance'];\n\n getFragmentSource() {\n return fragmentSource;\n }\n\n /**\n * Apply the Vibrance operation to a Uint8ClampedArray representing the pixels of an image.\n *\n * @param {Object} options\n * @param {ImageData} options.imageData The Uint8ClampedArray to be filtered.\n */\n applyTo2d({ imageData: { data } }: T2DPipelineState) {\n const adjust = -this.vibrance;\n for (let i = 0; i < data.length; i += 4) {\n const r = data[i];\n const g = data[i + 1];\n const b = data[i + 2];\n const max = Math.max(r, g, b);\n const avg = (r + g + b) / 3;\n const amt = ((Math.abs(max - avg) * 2) / 255) * adjust;\n data[i] += max !== r ? (max - r) * amt : 0;\n data[i + 1] += max !== g ? (max - g) * amt : 0;\n data[i + 2] += max !== b ? (max - b) * amt : 0;\n }\n }\n\n /**\n * Send data from this filter to its shader program's uniforms.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {TWebGLUniformLocationMap} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n */\n sendUniformData(\n gl: WebGLRenderingContext,\n uniformLocations: TWebGLUniformLocationMap,\n ) {\n gl.uniform1f(uniformLocations.uVibrance, -this.vibrance);\n }\n\n isNeutralState() {\n return this.vibrance === 0;\n }\n}\n\nclassRegistry.setClass(Vibrance);\n","export const fragmentSource = `\n precision highp float;\n uniform sampler2D uTexture;\n uniform float uVibrance;\n varying vec2 vTexCoord;\n void main() {\n vec4 color = texture2D(uTexture, vTexCoord);\n float max = max(color.r, max(color.g, color.b));\n float avg = (color.r + color.g + color.b) / 3.0;\n float amt = (abs(max - avg) * 2.0) * uVibrance;\n color.r += max != color.r ? (max - color.r) * amt : 0.00;\n color.g += max != color.g ? (max - color.g) * amt : 0.00;\n color.b += max != color.b ? (max - color.b) * amt : 0.00;\n gl_FragColor = color;\n }\n`;\n"],"names":["BaseConfiguration","constructor","_defineProperty","this","window","devicePixelRatio","config","super","configure","arguments","length","undefined","Object","assign","addFonts","paths","fontPaths","removeFonts","forEach","fontFamily","clearFonts","restoreDefaults","keys","defaults","reduce","acc","key","log","severity","_len","optionalParams","Array","_key","console","FabricError","Error","message","options","SignalAbortedError","context","GLProbe","WebGLProbe","testPrecision","gl","precision","fragmentSource","fragmentShader","createShader","FRAGMENT_SHADER","shaderSource","compileShader","getShaderParameter","COMPILE_STATUS","queryWebGL","canvas","getContext","maxTextureSize","getParameter","MAX_TEXTURE_SIZE","GLPrecision","find","getExtension","loseContext","isSupported","textureSize","copyPasteData","env","setEnv","value","getEnv","document","isTouchSupported","navigator","maxTouchPoints","dispose","getFabricDocument","getFabricWindow","getDevicePixelRatio","_config$devicePixelRa","Math","max","cache","getFontCache","_ref","fontStyle","fontWeight","toLowerCase","charWidthsCache","fontCache","cacheKey","clearFontCache","limitDimsByArea","ar","perfLimitSizeTotal","roughWidth","sqrt","floor","VERSION","noop","halfPI","PI","quarterPI","twoMathPi","PiBy180","iMatrix","freeze","DEFAULT_SVG_FONT_SIZE","kRect","CENTER","LEFT","TOP","BOTTOM","RIGHT","NONE","reNewline","MOVING","SCALING","ROTATING","ROTATE","SKEWING","RESIZING","MODIFY_POLY","MODIFY_PATH","CHANGED","SCALE","SCALE_X","SCALE_Y","SKEW_X","SKEW_Y","FILL","STROKE","MODIFIED","JSON","SVG","classRegistry","Map","has","classType","getClass","get","setClass","classConstructor","set","type","getSVGClass","SVGTagName","setSVGClass","runningAnimations","remove","index","indexOf","splice","cancelAll","animations","animation","abort","cancelByCanvas","filter","_animation$target","target","cancelByTarget","Observable","on","arg0","handler","__eventListeners","entries","eventName","off","push","once","disposers","_ref2","d","disposer","args","call","_removeEventListener","eventListener","_ref3","fire","_this$__eventListener","listenersForEvent","concat","i","removeFromArray","array","idx","cos","angle","abs","sin","angleSlice","sign","Point","y","x","add","that","addEquals","scalarAdd","scalar","scalarAddEquals","subtract","subtractEquals","scalarSubtract","scalarSubtractEquals","multiply","scalarMultiply","scalarMultiplyEquals","divide","scalarDivide","scalarDivideEquals","eq","lt","lte","gt","gte","lerp","t","min","distanceFrom","dx","dy","midPointFrom","toString","setXY","setX","setY","setFromPoint","swap","clone","rotate","radians","origin","ZERO","sinus","cosinus","p","transform","ignoreOffset","isCollection","fabricObject","isArray","_objects","createCollectionMixin","Base","Collection","_onObjectAdded","object","_onObjectRemoved","_onStackOrderChanged","objects","size","insertAt","_len2","_key2","removed","_len3","_key3","forEachObject","callback","getObjects","_len4","types","_key4","o","isType","item","isEmpty","contains","deep","includes","some","obj","complexity","memo","current","sendObjectToBack","unshift","bringObjectToFront","sendObjectBackwards","intersecting","newIdx","findNewLowerIndex","bringObjectForward","findNewUpperIndex","moveObjectTo","isOverlapping","collectObjects","left","top","width","height","includeIntersecting","tl","br","selectable","visible","intersectsWithRect","isContainedWithinRect","containsPoint","CommonMethods","_setOptions","prop","_setObject","_set","toggle","property","requestAnimFrame","requestAnimationFrame","cancelAnimFrame","handle","cancelAnimationFrame","id","uid","createCanvasElement","element","createElement","createImage","createCanvasElementFor","newCanvas","toDataURL","canvasEl","format","quality","toBlob","Promise","resolve","_","degreesToRadians","degrees","radiansToDegrees","isIdentityMatrix","mat","every","transformPoint","invertTransform","a","r","multiplyTransformMatrices","b","is2x2","multiplyTransformMatrixArray","matrices","reduceRight","product","curr","calcPlaneRotation","atan2","qrDecompose","denom","pow","scaleX","scaleY","skewX","skewY","translateX","translateY","createTranslateMatrix","createRotateMatrix","angleRadiant","cosValue","sinValue","createScaleMatrix","angleToSkew","tan","createSkewXMatrix","skewValue","createSkewYMatrix","calcDimensionsMatrix","flipX","flipY","matrix","composeMatrix","scaleMatrix","loadImage","url","signal","crossOrigin","reject","aborted","img","err","src","addEventListener","done","onload","onerror","removeEventListener","enlivenObjects","reviver","instances","all","map","fromObject","then","fabricInstance","catch","error","instance","finally","enlivenObjectEnlivables","serializedObject","promises","values","enlived","pick","source","pickBy","predicate","toFixed","number","fractionDigits","parseFloat","Number","matrixToSVG","NUM_FRACTION_DIGITS","join","isFiller","filler","toLive","isSerializableFiller","toObject","isPattern","offsetX","isActiveSelection","getScrollLeftTop","doc","getDocumentFromElement","elementLoop","docElement","documentElement","body","scrollLeft","scrollTop","parentNode","host","nodeType","style","position","el","ownerDocument","getWindowFromElement","_el$ownerDocument","defaultView","setCanvasDimensions","ctx","retinaScaling","setAttribute","scale","setCSSDimensions","makeElementUnselectable","onselectstart","userSelect","StaticCanvasDOMManager","createLowerCanvas","lower","getElementById","hasAttribute","_originalCanvasStyle","cssText","classList","cleanupDOM","removeAttribute","setDimensions","calcOffset","_getWindowFromElement","offset","elemStyle","getComputedStyle","parseInt","borderLeftWidth","borderTopWidth","paddingLeft","paddingTop","box","docElem","getBoundingClientRect","scrollLeftTop","clientLeft","clientTop","getElementOffset","staticCanvasDefaults","backgroundVpt","backgroundColor","overlayVpt","overlayColor","includeDefaultValues","svgViewportTransformation","renderOnAddRemove","skipOffscreen","enableRetinaScaling","imageSmoothingEnabled","controlsAboveOverlay","allowTouchScrolling","viewportTransform","StaticCanvas","lowerCanvasEl","_this$elements$lower","elements","contextContainer","_this$elements$lower2","getDefaults","ownDefaults","initElements","_setDimensionsImpl","skipControlsDrawing","calcViewportBoundaries","requestRenderAll","setCoords","getRetinaScaling","_offset","getWidth","getHeight","dimensions","cssOnly","backstoreOnly","hasLostContext","getZoom","setViewportTransform","vpt","zoomToPoint","point","before","newPoint","after","setZoom","absolutePan","relativePan","getElement","clearContext","clearRect","clear","backgroundImage","overlayImage","renderAll","cancelRequestedRender","destroyed","renderCanvas","renderAndReset","nextRenderHandle","disposed","iVpt","vptCoords","tr","bl","drawControls","_ctx","v","path","clipPath","patternQuality","_renderBackground","save","_renderObjects","restore","shouldCache","_transformDone","renderCache","forClipping","drawClipPathOnCanvas","_renderOverlay","__cleanupTask","globalCompositeOperation","zoomX","zoomY","drawImage","_cacheCanvas","cacheTranslationX","cacheTranslationY","len","render","_renderBackgroundOrOverlay","fill","needsVpt","isAFiller","beginPath","moveTo","lineTo","closePath","fillStyle","offsetY","m","gradientTransform","patternTransform","getCenterPoint","centerObjectH","_centerObject","centerObjectV","centerObject","viewportCenterObject","getVpCenter","viewportCenterObjectH","viewportCenterObjectV","center","toDatalessJSON","propertiesToInclude","toDatalessObject","_toObjectMethod","toJSON","methodName","clipPathData","excludeFromExport","_toObject","version","__serializeBgOverlay","originalValue","data","bgImage","bgColor","background","overlay","toSVG","markup","_setSVGPreamble","_setSVGHeader","clipPathId","_setSVGBgOverlayColor","_setSVGBgOverlayImage","_setSVGObjects","suppressPreamble","encoding","optViewBox","viewBox","createSVGFontFacesMarkup","createSVGRefElementsMarkup","createSVGClipPathMarkup","toClipPathSVG","shouldTransform","additionalTransform","fontList","_renderText","styles","styleRow","fontListMarkup","_setSVGObject","bgOrOverlay","repeat","finalWidth","finalHeight","loadFromJSON","json","serialized","parse","enlivedMap","properties","cloneWithoutData","multiplier","finalMultiplier","toCanvasElement","scaledWidth","scaledHeight","zoom","originalWidth","originalHeight","originalSkipControlsDrawing","newZoom","vp","newVp","originalRetina","objectsToRender","task","destroy","kill","touchEvents","getPointer","event","scroll","_evt","touchProp","changedTouches","getTouchInfo","clientX","clientY","isTouchEvent","pointerType","stopEvent","e","preventDefault","stopPropagation","makeBoundingBoxFromPoints","points","addTransformToObject","applyTransformToObject","calcOwnMatrix","otherOptions","setPositionByOrigin","resetObjectTransform","saveObjectTransform","sizeAfterTransform","dimX","dimY","bbox","calcPlaneChangeMatrix","from","sendPointToPlane","to","sendVectorToPlane","sendObjectToPlane","fireEvent","_target$canvas","originOffset","bottom","right","resolveOrigin","originValue","unitVectorX","zero","rotateVector","vector","createVector","magnitude","calcAngleBetweenVectors","crossProduct","dotProduct","calcVectorRotation","getUnitVector","getOrthonormalVector","counterClockwise","isBetweenVectors","AxB","AxT","BxT","NOT_ALLOWED_CURSOR","isTransformCentered","originX","originY","invertOrigin","isLocked","lockingKey","commonEventInfo","eventData","pointer","findCornerQuadrant","control","coord","round","getLocalPoint","corner","controls","padding","localPoint","getRelativeCenterPoint","translateToGivenOrigin","normalizePoint","dragHandler","newLeft","newTop","moveX","moveY","ColorNameMap","aliceblue","antiquewhite","aqua","aquamarine","azure","beige","bisque","black","blanchedalmond","blue","blueviolet","brown","burlywood","cadetblue","chartreuse","chocolate","coral","cornflowerblue","cornsilk","crimson","cyan","darkblue","darkcyan","darkgoldenrod","darkgray","darkgrey","darkgreen","darkkhaki","darkmagenta","darkolivegreen","darkorange","darkorchid","darkred","darksalmon","darkseagreen","darkslateblue","darkslategray","darkslategrey","darkturquoise","darkviolet","deeppink","deepskyblue","dimgray","dimgrey","dodgerblue","firebrick","floralwhite","forestgreen","fuchsia","gainsboro","ghostwhite","gold","goldenrod","gray","grey","green","greenyellow","honeydew","hotpink","indianred","indigo","ivory","khaki","lavender","lavenderblush","lawngreen","lemonchiffon","lightblue","lightcoral","lightcyan","lightgoldenrodyellow","lightgray","lightgrey","lightgreen","lightpink","lightsalmon","lightseagreen","lightskyblue","lightslategray","lightslategrey","lightsteelblue","lightyellow","lime","limegreen","linen","magenta","maroon","mediumaquamarine","mediumblue","mediumorchid","mediumpurple","mediumseagreen","mediumslateblue","mediumspringgreen","mediumturquoise","mediumvioletred","midnightblue","mintcream","mistyrose","moccasin","navajowhite","navy","oldlace","olive","olivedrab","orange","orangered","orchid","palegoldenrod","palegreen","paleturquoise","palevioletred","papayawhip","peachpuff","peru","pink","plum","powderblue","purple","rebeccapurple","red","rosybrown","royalblue","saddlebrown","salmon","sandybrown","seagreen","seashell","sienna","silver","skyblue","slateblue","slategray","slategrey","snow","springgreen","steelblue","teal","thistle","tomato","turquoise","violet","wheat","white","whitesmoke","yellow","yellowgreen","hue2rgb","q","rgb2Hsl","g","maxValue","minValue","h","s","l","fromAlphaToFloat","endsWith","hexify","toUpperCase","padStart","greyAverage","avg","Color","color","setSource","_source","_tryParsingColor","sourceFromHex","sourceFromRgb","sourceFromHsl","isUnrecognised","getSource","toRgb","toRgba","toHsl","toHsla","toHex","toHexa","slice","getAlpha","setAlpha","alpha","toGrayscale","toBlackWhite","threshold","average","bOrW","overlayWith","otherColor","otherSource","R","G","B","fromRgb","fromRgba","match","parsedValue","fromHsl","fromHsla","parseAngletoDegrees","fromHex","expandedValue","split","hex","hexCouple","lowercase","numeric","parseUnit","fontSize","unit","exec","dpi","DPI","parsePreserveAspectRatioAttribute","attribute","firstPart","secondPart","trim","alignX","alignY","align","meetOrSlice","colorPropToSVG","colorValue","opacityValue","inlineStyle","opacity","FabricObjectSVGExportMixin","getSvgStyles","skipShadow","fillRule","strokeWidth","strokeDashArray","strokeDashOffset","strokeLineCap","strokeLineJoin","strokeMiterLimit","visibility","getSvgFilter","stroke","shadow","getSvgCommons","getSvgTransform","full","calcTransformMatrix","_toSVG","_reviver","_createBaseSVGMarkup","_createBaseClipPathSVGMarkup","objectMarkup","commonPieces","noStyle","withShadow","styleInfo","shadowInfo","vectorEffect","strokeUniform","absoluteClipPath","absolutePositioned","clipPathMarkup","addPaintOrder","paintFirst","getSvgRegex","arr","RegExp","TEXT_DECORATION_THICKNESS","fontProperties","textDecorationProperties","textLayoutProperties","additionalProps","styleProperties","textDefaultValues","_reNewline","_reSpacesAndTabs","_reSpaceAndTab","_reWords","underline","overline","linethrough","textAlign","lineHeight","textBackgroundColor","pathStartOffset","pathSide","pathAlign","charSpacing","deltaY","direction","CACHE_FONT_SIZE","MIN_TEXT_WIDTH","superscript","baseline","subscript","_fontSizeFraction","offsets","_fontSizeMult","JUSTIFY","JUSTIFY_LEFT","JUSTIFY_RIGHT","JUSTIFY_CENTER","reNum","String","raw","viewportSeparator","svgNS","reFontDeclaration","attributesMap","cx","cy","display","fSize","cPath","svgValidTagNamesRegEx","svgViewBoxElementsRegEx","svgValidParentsRegEx","reViewBoxAttrValue","shadowOffsetRegex","reOffsetsAndBlur","Shadow","parseShadow","shadowStr","blur","replace","fBoxX","fBoxY","affectStroke","nonScaling","capValue","stateProperties","cacheProperties","fabricObjectDefaultValues","minScaleLimit","objectCaching","inverted","centeredRotation","centeredScaling","dirty","normalize","c","asin","elastic","defaultEasing","easeOutBounce","easeInBounce","easeInCirc","easeInCubic","easeInElastic","normA","normS","normP","easeInExpo","easeInOutBounce","easeInOutCirc","easeInOutCubic","easeInOutElastic","normC","easeInOutExpo","easeInOutQuad","easeInOutQuart","easeInOutQuint","easeInOutSine","easeInQuad","easeInQuart","easeInQuint","easeInSine","easeOutCirc","easeOutCubic","easeOutElastic","easeOutExpo","easeOutQuad","easeOutQuart","easeOutQuint","easeOutSine","defaultAbort","AnimationBase","startValue","byValue","duration","delay","easing","onStart","onChange","onComplete","tick","bind","_onStart","_onChange","_onComplete","_abort","endValue","calculate","state","_state","isDone","start","firstTick","timestamp","startTime","Date","register","setTimeout","durationMs","boundDurationMs","durationProgress","valueProgress","unregister","ValueAnimation","timeElapsed","ArrayAnimation","defaultColorEasing","wrapColorCallback","rgba","ColorAnimation","startColor","endColor","animate","isArrayAnimation","animateColor","Intersection","status","append","isPointContained","T","A","infinite","AB","isPointInPolygon","other","hits","inter","intersectSegmentSegment","intersectLineLine","a1","a2","b1","b2","aInfinite","bInfinite","a2xa1x","a2ya1y","b2xb1x","b2yb1y","a1xb1x","a1yb1y","uaT","ubT","uB","ua","ub","segmentsCoincide","intersectSegmentLine","s1","s2","l1","l2","intersectLinePolygon","result","intersectSegmentPolygon","intersectPolygonPolygon","points1","points2","coincidences","intersectPolygonRectangle","r1","r2","topRight","bottomLeft","ObjectGeometry","getX","getXY","getY","getRelativeX","setRelativeX","getRelativeY","setRelativeY","relativePosition","getRelativeXY","group","setRelativeXY","isStrokeAccountedForInDimensions","getCoords","aCoords","calcACoords","coords","intersectsWithObject","intersection","isContainedWithinObject","getBoundingRect","isOnScreen","isPartiallyOnScreen","getScaledWidth","_getTransformedDimensions","getScaledHeight","scaleToWidth","boundingRectFactor","scaleToHeight","getCanvasRetinaScaling","_this$canvas","getTotalAngle","getViewportTransform","_this$canvas2","rotateMatrix","tMatrix","finalMatrix","dim","w","transformMatrixKey","skipGroup","prefix","matrixCache","ownMatrixCache","_getNonTransformedDimensions","_calculateCurrentDimensions","dimOptions","preScalingStrokeValue","postScalingStrokeValue","finalDimensions","fromOriginX","fromOriginY","toOriginX","toOriginY","translateToCenterPoint","translateToOriginPoint","relCenter","getPointByOrigin","pos","_getLeftTopCoords","FabricObject","name","setOptions","_createCacheCanvas","_cacheContext","_updateCacheCanvas","_limitCacheSize","dims","maxCacheSideLimit","minCacheSideLimit","limX","limY","capped","_getCacheCanvasDimensions","objectScale","getTotalObjectScaling","neededX","neededY","ceil","dimensionsChanged","zoomChanged","setTransform","drawingWidth","drawingHeight","translate","needFullTransform","contextTop","getObjectScaling","retina","getObjectOpacity","_constrainScale","isChanged","parent","isNotVisible","_setupCompositeOperation","drawSelectionBackground","_setOpacity","_setShadow","drawCacheOnCanvas","_removeCacheCanvas","drawObject","isCacheDirty","parentClipPaths","hasStroke","hasFill","needsItsOwnCache","ownCaching","isOnACache","willDrawShadow","drawClipPathOnCache","canvasWithClipPath","originalFill","originalStroke","_setClippingProperties","_render","_drawClipPath","createClipPathLayer","prevClipPath","skipCanvas","fillRect","_removeShadow","globalAlpha","_setStrokeStyles","decl","lineWidth","lineCap","lineDashOffset","lineJoin","miterLimit","gradientUnits","_applyPatternForTransformedGradient","strokeStyle","_applyPatternGradientTransform","_setFillStyles","_setLineDash","dashArray","setLineDash","sx","sy","multX","multY","scaling","shadowColor","shadowBlur","browserShadowBlurConstant","shadowOffsetX","shadowOffsetY","_renderPaintInOrder","_renderStroke","_renderFill","_pCtx$createPattern","pCanvas","pCtx","createPattern","_findCenterFromElement","objectForm","cloneAsImage","origParams","originalGroup","originalShadow","canvasProvider","withoutTransform","withoutShadow","boundingRect","shadowOffset","originalCanvas","setOnGroup","animatable","_animate","propIsColor","colorProperties","animationOptions","isDescendantOf","getAncestors","ancestors","findCommonAncestors","fork","otherFork","common","otherAncestors","ancestor","j","hasCommonAncestors","commonAncestors","isInFrontOf","ancestorData","firstCommonAncestor","headOfFork","pop","headOfOtherFork","thisIndex","otherIndex","propertiesToSerialize","customProperties","toFixedBound","val","_removeDefaultValues","baseValues","getPrototypeOf","baseValue","_fromObject","serializedObjectOptions","extraParam","enlivedObjectOptions","wrapWithFireEvent","actionHandler","extraEventInfo","actionPerformed","wrapWithFixedAnchor","centerPoint","constraint","changeWidth","changeObjectWidth","strokePadding","oldWidth","newWidth","renderCircleControl","styleOverride","xSize","sizeX","cornerSize","ySize","sizeY","transparentCorners","cornerStrokeColor","myLeft","myTop","cornerColor","arc","renderSquareControl","xSizeBy2","ySizeBy2","strokeRect","Control","shouldActivate","controlKey","_fabricObject$canvas","getActiveObject","isControlVisible","getActionHandler","getMouseDownHandler","mouseDownHandler","getMouseUpHandler","mouseUpHandler","cursorStyleHandler","cursorStyle","getActionName","actionName","getVisibility","_fabricObject$_contro","_fabricObject$_contro2","_controlsVisibility","setVisibility","positionHandler","currentControl","calcCornerCoords","objectCornerSize","centerX","centerY","isTouch","touchSizeX","touchSizeY","cornerStyle","rotationStyleHandler","lockRotation","rotationWithSnapping","rotateObjectWithSnapping","ex","ey","theta","pivotPoint","lastAngle","curAngle","snapAngle","snapThreshold","rightAngleLocked","leftAngleLocked","hasRotated","scaleIsProportional","uniformIsToggled","uniScaleKey","uniformScaling","scalingIsForbidden","by","scaleProportionally","lockX","lockY","scaleMap","scaleCursorStyleHandler","n","scaleObject","signX","signY","gestureScale","distance","original","oldScaleX","oldScaleY","scalingEqually","scaleObjectFromCorner","scalingX","scaleObjectX","scalingY","scaleObjectY","AXIS_KEYS","counterAxis","skew","lockSkewing","flip","skewMap","skewCursorStyleHandler","skewHandler","axis","originKey","lockSkewingKey","skewKey","flipKey","counterOriginKey","counterFlipKey","counterOriginFactor","skewingSide","finalHandler","skewingBefore","skewingStart","shearingStart","shearing","skewing","atan","changed","dimBefore","dimAfter","compensationFactor","skewObject","skewHandlerX","skewHandlerY","isAltAction","altActionKey","scaleOrSkewActionName","isAlternative","scaleSkewCursorStyleHandler","scalingXOrSkewingY","scalingYOrSkewingX","createObjectDefaultControls","ml","mr","mb","mt","mtr","withConnection","createResizeControls","createTextboxDefaultControls","InteractiveFabricObject","createControls","targetCanvas","noScaleCache","_currentTransform","action","startsWith","getActiveControl","__corner","oCoords","findControl","forTouch","hasControls","cornerEntries","touchCorner","calcOCoords","rMatrix","positionMatrix","startMatrix","transformOptions","forEachControl","_calcCornerCoords","touchCornerSize","fn","selectionBackgroundColor","_activeObject","wh","strokeBorders","_drawBorders","borderColor","borderDashArray","drawControlsConnectingLines","_renderControls","hasBorders","styleOptions","shouldDrawBorders","shouldDrawControls","borderScaleFactor","isMoving","borderOpacityWhenMoving","drawBorders","forActiveSelection","shouldStroke","cornerDashArray","setControlVisible","setControlsVisibility","clearContextTop","restoreManually","onDeselect","_options","onSelect","shouldStartDragging","_e","onDragStart","canDrop","renderDragSourceEffect","renderDropTargetEffect","applyMixins","derivedCtor","constructors","baseCtor","getOwnPropertyNames","prototype","defineProperty","getOwnPropertyDescriptor","create","lockMovementX","lockMovementY","lockScalingX","lockScalingY","lockSkewingX","lockSkewingY","lockScalingFlip","evented","perPixelTargetFind","activeOn","hoverCursor","moveCursor","isTransparent","tolerance","getImageData","StrokeProjectionsBase","strokeProjectionMagnitude","strokeUniformScalar","createSideVector","projectOrthogonally","applySkew","calcOrthogonalProjection","isSkewed","scaleUnitVector","unitVector","zeroVector","StrokeLineJoinProjections","getOrthogonalRotationFactor","vector1","vector2","C","AC","bisector","orthogonalProjection","correctSide","projectBevel","projections","projectMiter","hypotUnitScalar","miterVector","projectRoundNoSkew","startCircle","endCircle","projectRoundWithSkew","circleRadius","newY","furthestY","newX","furthestX","projectRound","isStraightLine","newOrigin","proj0","proj1","comparisonVector","isProj0Start","projectPoints","project","originPoint","projectedPoint","StrokeLineCapProjections","projectButt","projection","projectSquare","strokePointingOut","projectedA","projectStrokeOnPoints","openPath","reduced","findIndexRight","cloneStyles","newObj","keyInner","escapeXml","string","segmenter","graphemeSplit","textstring","Intl","Segmenter","granularity","segments","segment","graphemeSplitImpl","graphemes","chr","getWholeChar","str","code","charCodeAt","isNaN","charAt","next","prev","firstLetterOnly","hasStyleChanged","prevStyle","thisStyle","forTextSpans","textDecorationThickness","stylesToArray","text","textLines","stylesArray","charIndex","chars","end","stylesFromArray","stylesObject","styleIndex","SHARED_ATTRIBUTES","selectorMatches","selector","nodeName","classNames","getAttribute","azAz","matcher","splitClassNames","elementMatchesRule","selectors","parentMatching","firstMatching","parentElement","doesSomeParentMatch","getGlobalStylesForElement","cssRules","rule","normalizeAttr","attr","_attributesMap","regex","transforms","transformList","reTransformList","reTransform","reTransformAll","parseTransformAttribute","attributeValue","cleanupSvgAttribute","test","matchAll","transformMatch","matchedParams","operation","rawArgs","arg1","arg2","arg3","arg4","arg5","arg","normalizeValue","parentAttributes","parsed","ouputValue","transformMatrix","fillIndex","strokeIndex","parseStyleString","oStyle","chunk","parseStyleAttribute","parseStyleObject","colorAttributesMap","parseAttributes","attributes","parentFontSize","ownAttributes","normalizedStyle","normalizedAttr","normalizedValue","font","parseFontDeclaration","mergedAttrs","colorAttr","setStrokeFillOpacity","RECT_PROPS","Rect","_initRxRy","rx","ry","isRounded","bezierCurveTo","fromElement","restOfparsedAttributes","ATTRIBUTE_NAMES","Boolean","LAYOUT_TYPE_INITIALIZATION","LAYOUT_TYPE_ADDED","LAYOUT_TYPE_REMOVED","LAYOUT_TYPE_IMPERATIVE","getObjectBounds","destinationGroup","currentGroup","objectCenter","accountForStroke","strokeUniformVector","scalingStrokeWidth","sizeVector","LayoutStrategy","calcLayoutResult","shouldPerformLayout","calcBoundingBox","prevStrategy","strategy","shouldLayoutClipPath","getInitialSize","overrides","bboxSize","bboxCenter","actualSize","relativeCorrection","FitContentLayout","LAYOUT_MANAGER","LayoutManager","_subscriptions","performLayout","strictContext","bubbles","_prevLayoutStrategy","onBeforeLayout","layoutResult","getLayoutResult","commitLayout","onAfterLayout","attachHandlers","trigger","subscribe","unsubscribe","_context","delete","unsubscribeTargets","targets","subscribeTargets","tricklingContext","layoutManager","prevCenter","nextCenter","correction","_context$x","_context$y","layoutObjects","layoutObject","bubblingContext","NoopLayoutManager","Group","groupInit","_options$layoutManage","__objectSelectionTracker","__objectSelectionMonitor","__objectSelectionDisposer","enterGroup","canEnterGroup","_filterObjectsBeforeEnteringGroup","allowedObjects","_onAfterObjectsChange","removeParentTransform","exitGroup","_shouldSetNestedCoords","subTargetCheck","removeAll","_activeObjects","selected","activeObjects","_watchObject","watch","_enterGroup","activeObject","_exitGroup","ownCache","preserveObjectStacking","triggerLayout","__serializeObjects","method","_includeDefaultValues","originalDefaults","_createSVGBgRect","fillStroke","commons","svgString","bg","abortable","hydratedOptions","layoutClass","strategyClass","interactive","findScaleToFit","destination","findScaleToCover","commaWsp","reArcCommandPoints","repeatedCommands","M","segmentToBezier","theta1","theta2","cosTh","sinTh","cx1","cy1","mT","fromX","fromY","costh1","sinth1","costh2","sinth2","toX","toY","calcVectorAngle","ux","uy","vx","vy","ta","tb","getBoundsOfCurve","begx","begy","cp1x","cp1y","cp2x","cp2y","endx","endy","argsString","cachesBoundsOfCurve","boundsOfCurveCache","tvalues","bounds","b2ac","sqrtb2ac","t1","t2","jlen","iterator","getPointOnCubicBezierIterator","fromArcToBeziers","fx","fy","rot","large","sweep","tx","ty","segsNorm","arcToSegments","rotateX","root","sinTheta","px","py","rx2","ry2","py2","px2","pl","_rx","_ry","mTheta","dtheta","mDelta","th3","makePathSimpler","x1","y1","destinationPath","previous","controlX","controlY","parsedCommand","converted","calcLineLength","x2","y2","pct","c1","c2","CB2","c3","CB3","c4","CB4","QB1","QB2","QB3","getTangentCubicIterator","p1x","p1y","p2x","p2y","p3x","p3y","p4x","p4y","qb1","qb2","qb3","tangentX","tangentY","getPointOnQuadraticBezierIterator","getTangentQuadraticIterator","invT","pathIterator","tempP","tmpLen","perc","findPercentageForDistance","segInfo","nextLen","nextStep","lastPerc","angleFinder","getPathSegmentsInfo","tempInfo","totalLength","info","basicInfo","command","destX","destY","getPointOnPath","infos","segPercent","rePathCmdAll","regExpArcCommandPoints","reMyNum","commandLengths","parsePath","pathString","_pathString$match","chain","matchStr","commandLetter","commandLength","paramArr","lastIndex","out","newCommand","transformedCommand","getSmoothPathFromPoints","p1","p2","multSignX","multSignY","manyPoints","midPoint","joinPath","pathData","getRandomInt","random","removeTransformMatrixForSvgParsing","preserveAspectRatioOptions","_assignTransformMatrixProps","cropX","cropY","offsetLeft","offsetTop","_newCanvas$getContext","getRegularPolygonPath","numVertexes","radius","interiorAngle","rotationAdjustment","rad","commonAttributes","groupSVGElements","mergeClipPaths","_b$group","removeTransformFromObject","finalTransform","transformPath","pathOffset","pathSegment","newSegment","setStyle","elementStyle","setProperty","CanvasDOMManager","containerClass","upperCanvasEl","createUpperCanvas","upper","applyCanvasStyle","container","createContainerElement","replaceChild","className","removeChild","SelectableCanvas","_this$elements$upper","_this$elements$upper2","wrapperEl","_objectsToRender","deselected","_discardActiveObject","_hoveredTarget","_hoveredTargets","_chooseObjectsToRender","contextTopDirty","_groupSelector","isDrawingMode","renderTopLayer","_isCurrentlyDrawing","freeDrawingBrush","selection","_drawSelection","renderTop","setTargetFindTolerance","targetFindTolerance","pixelFindCanvasEl","pixelFindContext","isTargetTransparent","selectionBgc","enhancedTolerance","_isSelectionKeyPressed","sKey","selectionKey","_shouldClearSelection","getActiveObjects","_shouldCenterTransform","modifierKeyPressed","centerTransform","_getOriginFromCorner","controlName","_setupCurrentTransform","alreadySelected","_control$getActionHan","getScenePoint","getActionFromCorner","altKey","centeredKey","lastX","lastY","shiftKey","setCursor","cursor","deltaX","extent","strokeOffset","selectionLineWidth","minX","minY","maxX","maxY","selectionColor","selectionBorderColor","selectionDashArray","dblClickLock","dblClickIsolateObject","isolatedObject","searchPossibleTargets","discardActiveObject","setSearchTargets","_searchTargets","getSearchTargets","findTarget","_targetInfo","skipTargetFind","subTargets","currentSubTargets","aObjects","targetInfo","currentContainer","currentTarget","fullTargetInfo","activeObjectTargetInfo","getViewportPoint","altSelectionKey","_pointIsInObjectSelectionArea","viewportZoom","angleRadians","cosP","sinP","cosPSinP","cosPMinusSinP","_checkTarget","isEditing","viewportPoint","_searchPossibleTargets","subTarget","_viewportPoint","_getPointerImpl","_scenePoint","fromViewport","boundsWidth","boundsHeight","cssScale","_resetTransformEventData","_setBrushStyles","willReadFrequently","getTopContext","getSelectionContext","getSelectionElement","active","_fireSelectionEvents","oldObjects","somethingChanged","invalidate","added","setActiveObject","currentActives","_setActiveObject","prevActiveObject","endCurrentTransform","discarded","_finalizeCurrentTransform","_scaling","originalProperties","_realizeGroupTransformOnObject","originalValues","selectionFullyContained","defaultCursor","freeDrawingCursor","notAllowedCursor","stopContextMenu","fireRightClick","fireMiddleClick","enablePointerEvents","TextEditingManager","cb","hiddenTextarea","focus","__disposer","exitTextEditing","exitEditing","onMouseMove","_this$target","updateSelectionOnMouseMove","addEventOptions","passive","getEventPoints","scenePoint","addListener","removeListener","syntheticEventConfig","mouse","in","targetIn","targetOut","canvasIn","canvasOut","drag","Canvas","eventHandler","addOrRemove","_getEventPrefix","functor","_eventjsFunctor","canvasElement","eventTypePrefix","_onResize","_onMouseDown","_onMouseMove","_onMouseOut","_onMouseEnter","_onMouseWheel","_onContextMenu","_onClick","_onDragStart","_onDragEnd","_onDragOver","_onDragEnter","_onDragLeave","_onDrop","_onTouchStart","removeListeners","_onMouseUp","_onTouchEnd","clearTimeout","_willAddMouseDown","_cacheTransformEventData","_handleEvent","shared","nestedTarget","_isClick","_dragSource","_onDragProgress","_renderDragEffects","dropTarget","_dropTarget","didDrop","dataTransfer","dropEffect","dragSource","_draggedoverTarget","eventType","_fireEnterLeaveEvents","_basicEventHandler","clicks","detail","_onDblClick","__onMouseDown","__onMouseUp","getPointerId","evt","identifier","pointerId","_isMainEvent","isPrimary","touches","mainTouchId","shouldPreventScrolling","currentActiveObject","__onMouseMove","_shouldRender","_this$_activeObject","isClick","button","_onMouseUpInDrawingMode","shouldRender","targetWasActive","handleSelection","found","originalControl","originalMouseUpHandler","_setCursorFromEvent","extraData","_onMouseDownInDrawingMode","onMouseDown","_onMouseMoveInDrawingMode","onMouseUp","grouped","handleMultiSelection","groupSelector","_transformObject","_fireOverOutEvents","textEditingManager","fireSyntheticInOutEvents","oldTarget","fireCanvas","draggedoverTarget","targetChanged","outOpt","nextTarget","inOpt","previousTarget","localPointer","_performTransformAction","activeSelection","reverse","_target","isAS","prevActiveObjects","multiSelectAdd","newActiveSelection","point1","point2","collectedObjects","klass","linearDefaultCoords","radialDefaultCoords","ifNaN","valueIfNaN","RE_PERCENT","isPercent","parsePercent","NaN","RE_KEY_VALUE_PAIRS","RE_KEY_VALUE","parseColorStop","opacityMultiplier","keyValuePairs","parseColorStops","opacityAttr","colorStops","colorStopEls","getElementsByTagName","parseType","parseGradientUnits","getValue","parseCoords","valuesToConvert","finalValue","propValue","convertPercentUnitsToValues","parseLinearCoords","parseRadialCoords","Gradient","addColorStop","colorStop","preTransform","sort","_renderPathCommands","needsSwap","minRadius","percentageShift","gradient","createLinearGradient","createRadialGradient","svgOptions","viewBoxWidth","viewBoxHeight","Pattern","isImageSource","isCanvasSource","sourceToString","complete","naturalWidth","naturalHeight","patternSource","patternOffsetX","patternOffsetY","BaseBrush","_saveAndTransform","needsFullRender","_resetShadow","_isOutSideCanvas","Path","_setPath","adjustPosition","setBoundingBox","_calcBoundsFromPath","quadraticCurveTo","pathCmd","sourcePath","_getOffsetTransform","digits","_calcDimensions","subpathStartX","subpathStartY","parsedAttributes","PencilBrush","_points","_hasStraightLine","drawSegment","drawStraightLine","straightLineKey","_prepareForDrawing","_addPoint","limitedToCanvasSize","oldEnd","_finalizeAndAddPath","_reset","convertPointsToSVGPath","createPath","decimatePoints","cDistance","lastPoint","adjustedDistance","newPoints","decimate","isEmptySVGPath","CIRCLE_PROPS","Circle","setRadius","startAngle","endAngle","getRadiusX","getRadiusY","startX","startY","endX","endY","otherParsedAttributes","CircleBrush","drawDot","addPoint","dot","originalRenderOnAddRemove","circles","circle","pointerPoint","SprayBrush","sprayChunks","sprayChunk","addSprayChunk","renderChunck","rects","chunck","rect","optimizeOverlapping","uniqueRects","uniqueRectsArray","getUniqueRects","sprayChunck","density","dotWidthVariance","dotWidth","randomOpacity","PatternBrush","getPatternSrc","patternCanvas","patternCtx","getPattern","pattern","topLeft","coordProps","Line","_setWidthHeight","calcLinePoints","origStrokeStyle","_this$stroke","_x1","_x2","_y1","_y2","xMult","yMult","Triangle","widthBy2","heightBy2","ELLIPSE_PROPS","Ellipse","getRx","getRy","polylineDefaultValues","exactBoundingBox","Polyline","initialized","isOpen","_projectStrokeOnPoints","strokeDiff","bboxNoStroke","layoutProperties","_options$width","_options$height","_options$width2","_options$height2","output","diffX","diffY","pointsSplit","parsedPoints","parsePointsAttribute","Polygon","StyledText","isEmptyStyles","lineIndex","line","p3","styleHas","cleanStyle","letterCount","stylePropertyValue","stylesCount","allStyleObjectPropertiesMatch","graphemeCount","styleObject","_textLines","removeStyle","lineNum","charNum","_extendStyles","get2DCursorLocation","_getLineStyle","_setLineStyle","newStyle","_getStyleDeclaration","_setStyleDeclaration","getSelectionStyles","startIndex","endIndex","getStyleAtPosition","getCompleteStyleDeclaration","setSelectionStyles","_forceClearCache","_lineStyle$charIndex","lineStyle","_styleProperties","_deleteStyleDeclaration","_deleteLineStyle","multipleSpacesRegex","dblQuoteRegex","createSVGInlineRect","svgColor","createSVGRect","measuringContext","FabricText","setPathInfo","initDimensions","segmentsInfo","_splitText","newLines","_splitTextIntoLines","lines","graphemeLines","_unwrappedTextLines","_unwrappedLines","_text","graphemeText","_clearCache","calcTextWidth","cursorWidth","calcTextHeight","enlargeSpaces","diffSpace","currentLineWidth","numberOfSpaces","accumulatedSpace","charBound","spaces","isEndOfWrapping","getLineWidth","__charBounds","kernedWidth","missingNewlineOffset","_lineIndex","selectionStart","skipWrapping","_setTextStyles","_renderTextLinesBackground","_renderTextDecoration","_renderTextStroke","_renderTextFill","charStyle","forMeasuring","textBaseline","_getFontDeclaration","maxWidth","_renderTextLine","_renderChars","leftOffset","_getLeftOffset","lineTopOffset","_getTopOffset","heightOfLine","getHeightOfLine","lineLeftOffset","_getLineLeftOffset","drawStart","currentColor","boxWidth","boxStart","lastColor","getValueOfPropertyAt","charBox","renderLeft","_measureChar","_char","previousChar","prevCharStyle","fontDeclaration","couple","stylesAreEqual","fontMultiplier","coupleWidth","previousWidth","getMeasuringContext","measureText","getHeightOfChar","measureLine","lineInfo","_measureLine","_getWidthOfCharSpacing","prevGrapheme","graphemeInfo","llength","lineBounds","grapheme","_getGraphemeBox","positionInPath","totalPathLength","_setGraphemeOnPath","numOfSpaces","centerPosition","skipLeft","previousBox","__lineHeights","maxHeight","_renderTextCommon","lineHeights","isJustify","shortCut","isLtr","currentDirection","actualStyle","nextStyle","timeToRender","drawingLeft","charsToRender","_renderChar","_applyPatternGradientTransformText","handleFiller","fullDecl","shouldFill","fillOffsets","fillText","strokeOffsets","strokeText","setSuperscript","_setScript","setSubscript","schema","loc","lineDiff","__lineWidths","_charStyle$property","topOffset","offsetAligner","lastDecoration","lastFill","lastTickness","currentDecoration","currentFill","currentTickness","currentSize","currentDy","finalTickness","parsedFontFamily","genericFonts","newLine","newText","needsDims","isAddingPath","textAnchor","textDecoration","restOfOptions","textContent","textHeightScaleFactor","scaledDiff","textHeight","offX","_getSVGLeftTopOffsets","textAndBg","_getSVGTextAndBg","textTop","textLeft","_wrapSVGTextAndBg","textSvg","lineTop","textBgRects","textSpans","getSvgTextDecoration","textTopOffset","textLeftOffset","lineOffset","_setSVGTextLineBg","_setSVGTextLineText","_createTextCharSpan","char","styleDecl","numFractionDigit","styleProps","getSvgSpanStyles","fillStyles","dySpan","angleAttr","wBy2","renderPoint","useWhiteSpace","thickness","decoration","DraggableTextDelegate","dragEnterHandler","dragOverHandler","dragLeaveHandler","dragEndHandler","dropHandler","_dispose","isPointerOverSelection","newSelection","getSelectionStartFromPointer","selectionEnd","__mouseDownInPlace","isActive","__dragStartFired","setCursorByClick","initDelayedCursor","__isDraggingOver","getDragStartSelection","__dragStartSelection","setDragImage","_e$dataTransfer","flipFactor","boundaries","_getCursorBoundaries","diff","bgc","dragImage","border","__dragImageDisposer","appendChild","setData","stringify","effectAllowed","abortCursorAnimation","editable","defaultPrevented","dragStartSelection","targetCanDrop","ev","_e$dataTransfer2","insert","getData","trailing","selectionStartOffset","removeChars","trimEnd","insertChars","enterEditing","_updateTextarea","_e$dataTransfer3","reNonWord","ITextBehavior","initBehavior","_tick","_onTickComplete","_animateCursor","toValue","_currentCursorOpacity","renderCursorOrSelection","_currentTickState","cursorDuration","_this$_currentTickCom","_currentTickCompleteState","restart","cursorDelay","shouldClear","cursorAnimation","restartCursorIfNeeded","selectAll","_fireSelectionChanged","cmdAll","getSelectedText","findWordBoundaryLeft","startFrom","_reSpace","findWordBoundaryRight","findLineBoundaryLeft","findLineBoundaryRight","searchWordBoundary","selectWord","newSelectionStart","newSelectionEnd","selectLine","enterEditingImpl","initHiddenTextarea","_saveEditingProps","_setEditingProps","_textBeforeEdit","activeElement","currentStart","currentEnd","__selectionStartOnMouseDown","editingBorderColor","fromStringToGraphemeSelection","smallerTextStart","graphemeStart","smallerTextEnd","fromGraphemeToStringSelection","cursorOffsetCache","inCompositionMode","updateTextareaPosition","updateFromTextArea","textarea","_calcTextareaPosition","desiredPosition","compositionStart","cursorLocation","charHeight","upperCanvas","upperCanvasWidth","upperCanvasHeight","clientWidth","clientHeight","_savedProps","_restoreEditingProps","exitEditingImpl","isTextChanged","_removeExtraneousStyles","removeStyleFromTo","lineStart","charStart","lineEnd","charEnd","styleObj","shiftLineStyles","numericChar","clonedStyles","numericLine","insertNewlineStyleObject","qty","copiedStyle","newLineStyles","originalLineLength","isEndOfLine","someStyleIsCarryingOver","currentCharStyle","numIndex","styleCarriedOver","insertCharStyleObject","quantity","currentLineStyles","currentLineStylesCloned","numericIndex","insertNewStyleBlock","insertedText","cursorLoc","addedLines","linesLength","setSelectionStartEndWithShift","_selectionDirection","ITextKeyBehavior","autocapitalize","autocorrect","autocomplete","spellcheck","wrap","hiddenTextareaContainer","keydown","keyup","input","copy","cut","paste","compositionstart","compositionupdate","compositionend","onKeyDown","keyMap","keysMapRtl","keysMap","keyCode","ctrlKeysMapDown","ctrlKey","metaKey","stopImmediatePropagation","onKeyUp","_copyDone","ctrlKeysMapUp","onInput","fromPaste","updateAndFire","nextText","charCount","nextCharCount","_selectionStart","_selectionEnd","removedText","removeFrom","removeTo","charDiff","textareaSelection","backDelete","copiedText","disableStyleCopyPaste","copiedTextStyle","onCompositionStart","onCompositionEnd","onCompositionUpdate","compositionEnd","_getWidthBeforeCursor","bound","widthBeforeCursor","getDownCursorOffset","isRight","selectionProp","_getSelectionForOffset","indexOnOtherLine","_getIndexOnLine","getUpCursorOffset","textBeforeCursor","charWidth","foundMatch","widthOfCharsOnLine","indexOnLine","leftEdge","rightEdge","offsetFromLeftEdge","moveCursorDown","_moveCursorUpOrDown","moveCursorUp","moveCursorWithShift","moveCursorWithoutShift","moveCursorLeft","_moveCursorLeftOrRight","_move","newValue","_moveLeft","_moveRight","moveCursorLeftWithoutShift","change","moveCursorLeftWithShift","moveCursorRight","moveCursorRightWithShift","moveCursorRightWithoutShift","notALeftClick","ITextClickBehavior","_mouseDownHandler","doubleClickHandler","tripleClickHandler","draggableTextDelegate","didDrag","mouseOffset","charLength","widthAfter","MOVE_CURSOR_UP","MOVE_CURSOR_DOWN","MOVE_CURSOR_LEFT","MOVE_CURSOR_RIGHT","EXIT_EDITING","applyCanvasTransform","iTextDefaultValues","cursorColor","caching","IText","setSelectionStart","_updateAndFire","setSelectionEnd","findAncestorsWithClipPath","hasAncestorsWithClipping","drawingCanvas","drawingCtx","renderSelection","renderCursor","clippingCanvas","clippingCtx","clipPathAncestors","skipCaching","_getCursorBoundariesOffsets","__getCursorBoundariesOffsets","renderCursorAt","_renderCursor","getCursorRenderingData","_renderSelection","dragSelection","startLine","endLine","startChar","endChar","realLineHeight","boxEnd","drawHeight","extraTop","drawWidth","compositionColor","getCurrentCharFontSize","cp","_getCurrentCharIndex","getCurrentCharColor","cursorPosition","Textbox","dynamicMinWidth","_styleMap","_generateStyleMap","textInfo","realLineCount","realLineCharCount","splitByGrapheme","isWrapping","nextOffset","nextLineIndex","shouldLimit","mapNextLine","p2Number","_wrapText","desiredWidth","getGraphemeDataForRender","wrapped","wordsData","_wrapLine","infix","largestWordWidth","wordsOrGraphemes","wordSplit","word","graphemeArray","_measureWord","charOffset","_wordJoiners","reservedSpace","additionalSpace","infixWidth","lineJustStarted","wordWidth","getMinWidth","minWidth","linesToKeep","propNumber","ClipPathLayout","clipPathCenter","FixedLayout","ActiveSelectionLayoutManager","parents","Set","selectedObjects","ActiveSelection","multiSelectionStacking","findIndex","groups","childrenOverride","Canvas2dFilterBackend","applyFilters","filters","sourceElement","sourceWidth","sourceHeight","desynchronized","pipelineState","imageData","originalEl","originalImageData","filterBackend","applyTo","imageDataPostFilter","putImageData","WebGLFilterBackend","tileSize","Float32Array","setupGLContext","captureGPUInfo","createWebGLCanvas","premultipliedAlpha","depth","stencil","antialias","clearColor","cachedTexture","getCachedTexture","destinationWidth","destinationHeight","sourceTexture","createTexture","targetTexture","originalTexture","passes","webgl","aPosition","programCache","pass","tempFbo","createFramebuffer","bindFramebuffer","FRAMEBUFFER","dWidth","dHeight","resizeCanvasIfNeeded","copyGLTo2D","bindTexture","TEXTURE_2D","deleteTexture","deleteFramebuffer","clearWebGLCaches","textureCache","textureImageSource","NEAREST","RGBA","UNSIGNED_BYTE","CLAMP_TO_EDGE","TEXTURE_MAG_FILTER","TEXTURE_MIN_FILTER","TEXTURE_WRAP_S","TEXTURE_WRAP_T","texture","texParameteri","texImage2D","uniqueId","evictCachesForKey","glCanvas","sourceY","copyGLTo2DPutImageData","numBytes","u8","Uint8Array","imageBuffer","u8Clamped","Uint8ClampedArray","readPixels","imgData","ImageData","gpuInfo","renderer","vendor","ext","UNMASKED_RENDERER_WEBGL","UNMASKED_VENDOR_WEBGL","initFilterBackend","enableGLFiltering","getFilterBackend","setFilterBackend","backend","IMAGE_PROPS","FabricImage","setElement","_element","removeTexture","_originalElement","resizeFilter","applyResizeFilters","elementKey","getCrossOrigin","getOriginalSize","_stroke","filterObj","getSrc","hasCrop","imageMarkup","strokeSvg","imageRendering","imageSmoothing","getSvgSrc","origFill","filtered","srcFromAttribute","setSrc","minimumScale","minimumScaleTrigger","elementToFilter","_filteredEl","_filterScalingX","_filterScalingY","_lastScaleX","_lastScaleY","isNeutralState","imgElement","_needsResize","elementToDraw","elWidth","elHeight","sX","sY","sW","sH","maxDestW","maxDestH","_resetWidthHeight","pAR","preserveAspectRatio","pWidth","pHeight","rWidth","rHeight","f","rf","hydratedProps","fromURL","imageOptions","applyViewboxTransform","viewBoxAttr","widthAttr","heightAttr","missingViewBox","missingDimAttr","translateMatrix","widthDiff","heightDiff","parsedDim","pasedViewBox","createElementNS","firstChild","getTagName","node","tagName","svgInvalidAncestorsRegEx","getMultipleNodes","nodeNames","nodeList","nodeArray","getElementsByTagNameNS","gradientsAttrs","xlinkAttr","recursivelyParseGradientsXlink","_gradient$getAttribut","xLink","referencedGradient","children","referenceClone","cloneNode","tagArray","findTag","ElementsParser","clipPaths","regexUrl","gradientDefs","elList","getGradientDefs","allRules","styleContents","ruleObj","propertyValuePairs","pair","_rule","getCSSRules","createObject","resolveGradient","resolveClipPath","extractPropertyDefinition","storage","gradientDef","usingElement","exactOwner","clipPathElements","objTransformInv","clipPathTag","clipPathOwner","clipPathElement","enlivedClippath","clipRule","gTransform","isValidSvgTag","async","parseSVGDocument","createEmptyResponse","allElements","nodelist","skipAttributes","useElement","useAttributes","useAttrMap","xlink","href","referencedElement","clonedOriginal","originalAttributes","originalAttrMap","currentTrans","el3","setAttributeNS","childNodes","styleRecord","mergedStyles","entry","parseUseDirectives","descendants","hasInvalidAncestor","localClipPaths","elementParser","loadSVGFromString","parseFromString","loadSVGFromURL","fetch","response","ok","svgText","ACTION_NAME","createPolyPositionHandler","pointIndex","polyObject","polyActionHandler","poly","mouseLocalPosition","factoryPolyActionHandler","anchorPoint","anchorPointInParentPlane","createPolyActionHandler","calcPathPointPosition","pathObject","commandIndex","pathPositionHandler","pathActionHandler","movePathPoint","anchorCommand","PathPointControl","controlFill","controlStroke","PathControlPointControl","connectToCommandIndex","connectToPointIndex","connectionDashArray","commandType","createControl","commandIndexPos","pointIndexPos","isControlPoint","controlPointStyle","pointStyle","previousCommandType","indexFromPrevCommand","isWebGLPipelineState","isPutImageFaster","testContext","ArrayBuffer","testPipelineState","performance","now","drawImageTime","highPsourceCode","identityFragmentShader","BaseFilter","getFragmentSource","getVertexSource","createProgram","vertexSource","vertexShader","VERTEX_SHADER","program","getShaderInfoLog","attachShader","linkProgram","getProgramParameter","LINK_STATUS","getProgramInfoLog","uniformLocations","getUniformLocations","uStepW","getUniformLocation","uStepH","attributeLocations","getAttributeLocations","getAttribLocation","locations","sendAttributeData","aPositionData","attributeLocation","buffer","createBuffer","bindBuffer","ARRAY_BUFFER","enableVertexAttribArray","vertexAttribPointer","FLOAT","bufferData","STATIC_DRAW","_setupFrameBuffer","framebufferTexture2D","COLOR_ATTACHMENT0","finish","_swapTextures","temp","applyToWebGL","applyTo2d","getCacheKey","retrieveShader","shader","useProgram","uniform1f","sendUniformData","viewport","drawArrays","TRIANGLE_STRIP","bindAdditionalTexture","textureUnit","activeTexture","TEXTURE0","unbindAdditionalTexture","_gl","_uniformLocations","createHelpLayer","helpLayer","defaultKeys","filterOptions","blendColorFragmentSource","screen","difference","lighten","darken","exclusion","tint","BlendColor","mode","tg","alpha1","oR","oG","oB","uniform4fv","uColor","mask","BlendImage","image","TEXTURE1","calculateMatrix","resources","blendImage","canvas1","blendData","uniform1i","uImage","uniformMatrix3fv","uTransformMatrix","enlivedImage","Blur","aspectRatio","horizontal","blurValue","getBlurValue","samples","bytesInRow","totalA","minIRow","maxIRow","percent","weight","sampledPixel","localAlpha","delta","chooseRightDelta","uniform2fv","uDelta","blurScale","Brightness","brightness","uBrightness","colorMatrixDefaultValues","colorsOnly","ColorMatrix","constants","uniformMatrix4fv","uColorMatrix","uConstants","createColorMatrixFilter","_Class","newClass","Brownie","Vintage","Kodachrome","Technicolor","Polaroid","Sepia","BlackWhite","Composed","subFilters","enlivedFilters","Contrast","contrast","contrastF","uContrast","Convolute_3_1","Convolute_3_0","Convolute_5_1","Convolute_5_0","Convolute_7_1","Convolute_7_0","Convolute_9_1","Convolute_9_0","Convolute","opaque","weights","side","halfSide","sw","sh","createImageData","dst","alphaFac","dstOff","scx","scy","srcOff","wt","uniform1fv","uMatrix","GAMMA","Gamma","gamma","rInv","gInv","bInv","rgbValues","rgb","uniform3fv","uGamma","lightness","luminosity","Grayscale","uMode","hueRotationDefaultValues","rotation","HueRotation","cosine","sine","aThird","aThirdSqtSin","OneMinusCos","Invert","invert","uInvert","uAlpha","Noise","noise","rand","uNoise","uSeed","Pixelate","blocksize","_i","_j","uBlocksize","RemoveColor","lowC","highC","uLow","uHigh","useAlpha","Resize","uTaps","taps","getFilterWindow","tempScale","lanczosLobes","filterWindow","generateShader","getTaps","lobeFunction","lanczosCreate","applyToForWebgl","dW","dH","lobes","xx","rcpScaleX","rcpScaleY","oW","oH","newData","resizeType","sliceByTwo","hermiteFastResize","bilinearFiltering","lanczosResize","mult","doneW","doneH","stepW","stepH","dX","dY","tmpCanvas","srcData","destImg","destData","lanczos","ratioX","ratioY","rcpRatioX","rcpRatioY","range2X","range2Y","cacheLanc","icenter","process","u","fX","fY","xDiff","yDiff","chnl","origPix","w4","pixels","destImage","destPixels","ratioW","ratioH","ratioWHalf","ratioHHalf","img2","data2","weightsAlpha","gxR","gxG","gxB","gxA","yy","w0","Saturation","adjust","saturation","uSaturation","Vibrance","vibrance","amt","uVibrance"],"mappings":"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"} \ No newline at end of file diff --git a/dist/index.mjs b/dist/index.mjs index 141287601e8..2c3a9a741b3 100644 --- a/dist/index.mjs +++ b/dist/index.mjs @@ -497,8 +497,8 @@ class AnimationRegistry extends Array { const runningAnimations = new AnimationRegistry(); /** - * @tutorial {@link http://fabricjs.com/fabric-intro-part-2#events} - * @see {@link http://fabricjs.com/events|Events demo} + * @see {@link http://fabric5.fabricjs.com/fabric-intro-part-2#events} + * @see {@link http://fabric5.fabricjs.com/events|Events demo} */ class Observable { constructor() { @@ -741,7 +741,6 @@ class Point { * Adds another point to this one * @param {XY} that * @return {Point} thisArg - * @chainable * @deprecated */ addEquals(that) { @@ -763,7 +762,6 @@ class Point { * Adds value to this point * @param {Number} scalar * @return {Point} thisArg - * @chainable * @deprecated */ scalarAddEquals(scalar) { @@ -785,7 +783,6 @@ class Point { * Subtracts another point from this point * @param {XY} that * @return {Point} thisArg - * @chainable * @deprecated */ subtractEquals(that) { @@ -807,7 +804,6 @@ class Point { * Subtracts value from this point * @param {Number} scalar * @return {Point} thisArg - * @chainable * @deprecated */ scalarSubtractEquals(scalar) { @@ -838,7 +834,6 @@ class Point { * Multiplies this point by a value * @param {Number} scalar * @return {Point} thisArg - * @chainable * @deprecated */ scalarMultiplyEquals(scalar) { @@ -869,7 +864,6 @@ class Point { * Divides this point by a value * @param {Number} scalar * @return {Point} thisArg - * @chainable * @deprecated */ scalarDivideEquals(scalar) { @@ -985,7 +979,6 @@ class Point { * Sets x/y of this point * @param {Number} x * @param {Number} y - * @chainable */ setXY(x, y) { this.x = x; @@ -996,7 +989,6 @@ class Point { /** * Sets x of this point * @param {Number} x - * @chainable */ setX(x) { this.x = x; @@ -1006,7 +998,6 @@ class Point { /** * Sets y of this point * @param {Number} y - * @chainable */ setY(y) { this.y = y; @@ -1016,7 +1007,6 @@ class Point { /** * Sets x/y of this point from another point * @param {XY} that - * @chainable */ setFromPoint(that) { this.x = that.x; @@ -1588,7 +1578,7 @@ const invertTransform = t => { const multiplyTransformMatrices = (a, b, is2x2) => [a[0] * b[0] + a[2] * b[1], a[1] * b[0] + a[3] * b[1], a[0] * b[2] + a[2] * b[3], a[1] * b[2] + a[3] * b[3], is2x2 ? 0 : a[0] * b[4] + a[2] * b[5] + a[4], is2x2 ? 0 : a[1] * b[4] + a[3] * b[5] + a[5]]; /** - * Multiplies {@link matrices} such that a matrix defines the plane for the rest of the matrices **after** it + * Multiplies the matrices array such that a matrix defines the plane for the rest of the matrices **after** it * * `multiplyTransformMatrixArray([A, B, C, D])` is equivalent to `A(B(C(D)))` * @@ -1632,7 +1622,7 @@ const qrDecompose = a => { * [ 0 1 y ] * [ 0 0 1 ] * - * See @link https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/transform#translate for more details + * See {@link https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/transform#translate} for more details * * @param {number} x translation on X axis * @param {number} [y] translation on Y axis @@ -1678,7 +1668,7 @@ function createRotateMatrix() { * [0 y 0] * [0 0 1] * - * @link https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/transform#scale + * {@link https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/transform#scale} * * @param {number} x scale on X axis * @param {number} [y] scale on Y axis @@ -1698,7 +1688,7 @@ const angleToSkew = angle => Math.tan(degreesToRadians(angle)); * [0 1 0] * [0 0 1] * - * @link https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/transform#skewx + * {@link https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/transform#skewx} * * @param {TDegree} skewValue translation on X axis * @returns {TMat2D} matrix @@ -1713,7 +1703,7 @@ const createSkewXMatrix = skewValue => [1, 0, angleToSkew(skewValue), 1, 0, 0]; * [y 1 0] * [0 0 1] * - * @link https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/transform#skewy + * {@link https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/transform#skewy} * * @param {TDegree} skewValue translation on Y axis * @returns {TMat2D} matrix @@ -2202,7 +2192,7 @@ const staticCanvasDefaults = { /** * Static canvas class - * @see {@link http://fabricjs.com/static_canvas|StaticCanvas demo} + * @see {@link http://fabric5.fabricjs.com/static_canvas|StaticCanvas demo} * @fires before:render * @fires after:render * @fires canvas:cleared @@ -2828,7 +2818,7 @@ class StaticCanvas extends createCollectionMixin(CommonMethods) { * Having a toJSON method means you can do JSON.stringify(myCanvas) * JSON does not support additional properties because toJSON has its own signature * @return {Object} JSON compatible object - * @tutorial {@link http://fabricjs.com/fabric-intro-part-3#serialization} + * @see {@link http://fabric5.fabricjs.com/fabric-intro-part-3#serialization} * @see {@link http://jsfiddle.net/fabricjs/pec86/|jsFiddle demo} * @example JSON representation of canvas * const json = canvas.toJSON(); @@ -2917,7 +2907,6 @@ class StaticCanvas extends createCollectionMixin(CommonMethods) { /** * Returns SVG representation of canvas - * @function * @param {Object} [options] Options object for SVG output * @param {Boolean} [options.suppressPreamble=false] If true xml tag is not included * @param {Object} [options.viewBox] SVG viewbox object @@ -2930,7 +2919,7 @@ class StaticCanvas extends createCollectionMixin(CommonMethods) { * @param {String} [options.height] desired height of svg with or without units * @param {Function} [reviver] Method for further parsing of svg elements, called after each fabric object converted into svg representation. * @return {String} SVG string - * @tutorial {@link http://fabricjs.com/fabric-intro-part-3#serialization} + * @see {@link http://fabric5.fabricjs.com/fabric-intro-part-3#serialization} * @see {@link http://jsfiddle.net/fabricjs/jQ3ZZ/|jsFiddle demo} * @example Normal SVG output * var svg = canvas.toSVG(); @@ -3148,7 +3137,7 @@ class StaticCanvas extends createCollectionMixin(CommonMethods) { * @param {Object} [options] options * @param {AbortSignal} [options.signal] see https://developer.mozilla.org/en-US/docs/Web/API/AbortController/signal * @return {Promise} instance - * @tutorial {@link http://fabricjs.com/fabric-intro-part-3#deserialization} + * @see {@link http://fabric5.fabricjs.com/fabric-intro-part-3#deserialization} * @see {@link http://jsfiddle.net/fabricjs/fmgXt/|jsFiddle demo} * @example loadFromJSON * canvas.loadFromJSON(json).then((canvas) => canvas.requestRenderAll()); @@ -3171,9 +3160,11 @@ class StaticCanvas extends createCollectionMixin(CommonMethods) { } // parse json if it wasn't already - const serialized = typeof json === 'string' ? JSON.parse(json) : json; const { objects = [], + ...serialized + } = typeof json === 'string' ? JSON.parse(json) : json; + const { backgroundImage, background, overlayImage, @@ -4230,7 +4221,7 @@ const greyAverage = _ref => { /** * @class Color common color operations - * @tutorial {@link http://fabricjs.com/fabric-intro-part-2/#colors colors} + * @see {@link http://fabric5.fabricjs.com/fabric-intro-part-2#colors colors} */ class Color { /** @@ -4405,7 +4396,6 @@ class Color { /** * Returns new color object, when given a color in RGBA format - * @function * @param {String} color * @return {Color} */ @@ -4440,7 +4430,6 @@ class Color { /** * Returns new color object, when given a color in HSLA format - * @function * @param {String} color * @return {Color} */ @@ -4955,7 +4944,7 @@ const shadowDefaultValues = { }; class Shadow { /** - * @see {@link http://fabricjs.com/shadows|Shadow demo} + * @see {@link http://fabric5.fabricjs.com/shadows|Shadow demo} * @param {Object|String} [options] Options object with any of color, blur, offsetX, offsetY properties or string (e.g. "rgba(0,0,0,0.2) 2px 2px 10px") */ @@ -5764,7 +5753,6 @@ class Intersection { * Appends points of intersection * @param {...Point[]} points * @return {Intersection} thisArg - * @chainable */ append() { for (var _len = arguments.length, points = new Array(_len), _key = 0; _key < _len; _key++) { @@ -5812,7 +5800,7 @@ class Intersection { } /** - * Use the ray casting algorithm to determine if {@link point} is in the polygon defined by {@link points} + * Use the ray casting algorithm to determine if point is in the polygon defined by points * @see https://en.wikipedia.org/wiki/Point_in_polygon * @param point * @param points polygon points @@ -6024,35 +6012,35 @@ class ObjectGeometry extends CommonMethods { */ /** - * @returns {number} x position according to object's {@link originX} property in canvas coordinate plane + * @returns {number} x position according to object's originX property in canvas coordinate plane */ getX() { return this.getXY().x; } /** - * @param {number} value x position according to object's {@link originX} property in canvas coordinate plane + * @param {number} value x position according to object's originX property in canvas coordinate plane */ setX(value) { this.setXY(this.getXY().setX(value)); } /** - * @returns {number} y position according to object's {@link originY} property in canvas coordinate plane + * @returns {number} y position according to object's originY property in canvas coordinate plane */ getY() { return this.getXY().y; } /** - * @param {number} value y position according to object's {@link originY} property in canvas coordinate plane + * @param {number} value y position according to object's originY property in canvas coordinate plane */ setY(value) { this.setXY(this.getXY().setY(value)); } /** - * @returns {number} x position according to object's {@link originX} property in parent's coordinate plane\ + * @returns {number} x position according to object's originX property in parent's coordinate plane\ * if parent is canvas then this property is identical to {@link getX} */ getRelativeX() { @@ -6060,7 +6048,7 @@ class ObjectGeometry extends CommonMethods { } /** - * @param {number} value x position according to object's {@link originX} property in parent's coordinate plane\ + * @param {number} value x position according to object's originX property in parent's coordinate plane\ * if parent is canvas then this method is identical to {@link setX} */ setRelativeX(value) { @@ -6068,7 +6056,7 @@ class ObjectGeometry extends CommonMethods { } /** - * @returns {number} y position according to object's {@link originY} property in parent's coordinate plane\ + * @returns {number} y position according to object's originY property in parent's coordinate plane\ * if parent is canvas then this property is identical to {@link getY} */ getRelativeY() { @@ -6076,7 +6064,7 @@ class ObjectGeometry extends CommonMethods { } /** - * @param {number} value y position according to object's {@link originY} property in parent's coordinate plane\ + * @param {number} value y position according to object's originY property in parent's coordinate plane\ * if parent is canvas then this property is identical to {@link setY} */ setRelativeY(value) { @@ -6084,7 +6072,7 @@ class ObjectGeometry extends CommonMethods { } /** - * @returns {Point} x position according to object's {@link originX} {@link originY} properties in canvas coordinate plane + * @returns {Point} x position according to object's originX originY properties in canvas coordinate plane */ getXY() { const relativePosition = this.getRelativeXY(); @@ -6093,7 +6081,7 @@ class ObjectGeometry extends CommonMethods { /** * Set an object position to a particular point, the point is intended in absolute ( canvas ) coordinate. - * You can specify {@link originX} and {@link originY} values, + * You can specify originX and originY values, * that otherwise are the object's current values. * @example Set object's bottom left corner to point (5,5) on canvas * object.setXY(new Point(5, 5), 'left', 'bottom'). @@ -6109,7 +6097,7 @@ class ObjectGeometry extends CommonMethods { } /** - * @returns {Point} x,y position according to object's {@link originX} {@link originY} properties in parent's coordinate plane + * @returns {Point} x,y position according to object's originX originY properties in parent's coordinate plane */ getRelativeXY() { return new Point(this.left, this.top); @@ -6117,7 +6105,7 @@ class ObjectGeometry extends CommonMethods { /** * As {@link setXY}, but in current parent's coordinate plane (the current group if any or the canvas) - * @param {Point} point position according to object's {@link originX} {@link originY} properties in parent's coordinate plane + * @param {Point} point position according to object's originX originY properties in parent's coordinate plane * @param {TOriginX} [originX] Horizontal origin: 'left', 'center' or 'right' * @param {TOriginY} [originY] Vertical origin: 'top', 'center' or 'bottom' */ @@ -6153,7 +6141,7 @@ class ObjectGeometry extends CommonMethods { } /** - * Checks if object intersects with the scene rect formed by {@link tl} and {@link br} + * Checks if object intersects with the scene rect formed by tl and br */ intersectsWithRect(tl, br) { const intersection = Intersection.intersectPolygonRectangle(this.getCoords(), tl, br); @@ -6181,7 +6169,7 @@ class ObjectGeometry extends CommonMethods { } /** - * Checks if object is fully contained within the scene rect formed by {@link tl} and {@link br} + * Checks if object is fully contained within the scene rect formed by tl and br */ isContainedWithinRect(tl, br) { const { @@ -6374,7 +6362,7 @@ class ObjectGeometry extends CommonMethods { /** * Sets corner and controls position coordinates based on current angle, width and height, left and top. * aCoords are used to quickly find an object on the canvas. - * See {@link https://github.com/fabricjs/fabric.js/wiki/When-to-call-setCoords} and {@link http://fabricjs.com/fabric-gotchas} + * See {@link https://github.com/fabricjs/fabric.js/wiki/When-to-call-setCoords} and {@link http://fabric5.fabricjs.com/fabric-gotchas} */ setCoords() { this.aCoords = this.calcACoords(); @@ -6643,7 +6631,7 @@ class ObjectGeometry extends CommonMethods { /** * Root object class from which all 2d shape classes inherit from - * @tutorial {@link http://fabricjs.com/fabric-intro-part-1#objects} + * @see {@link http://fabric5.fabricjs.com/fabric-intro-part-1#objects} * * @fires added * @fires removed @@ -7755,7 +7743,7 @@ let FabricObject$1 = class FabricObject extends ObjectGeometry { * Animates object's properties * @param {Record} animatable map of keys and end values * @param {Partial>} options - * @tutorial {@link http://fabricjs.com/fabric-intro-part-2#animation} + * @see {@link http://fabric5.fabricjs.com/fabric-intro-part-2#animation} * @return {Record>} map of animation contexts * * As object — multiple properties @@ -9319,7 +9307,7 @@ class InteractiveFabricObject extends FabricObject$1 { /** * @override set controls' coordinates as well - * See {@link https://github.com/fabricjs/fabric.js/wiki/When-to-call-setCoords} and {@link http://fabricjs.com/fabric-gotchas} + * See {@link https://github.com/fabricjs/fabric.js/wiki/When-to-call-setCoords} and {@link https://fabric5.fabricjs.com/fabric-gotchas} * @return {void} */ setCoords() { @@ -10500,8 +10488,6 @@ const reTransformAll = new RegExp(transform, 'g'); /** * Parses "transform" attribute, returning an array of values - * @static - * @function * @param {String} attributeValue String containing attribute value * @return {TTransformMatrix} Array of 6 elements representing transformation matrix */ @@ -10617,8 +10603,6 @@ function normalizeValue(attr, value, parentAttributes, fontSize) { /** * Parses a short font declaration, building adding its properties to a style object - * @static - * @function * @param {String} value font declaration * @param {Object} oStyle definition */ @@ -10683,7 +10667,6 @@ function parseStyleString(style, oStyle) { /** * Parses "style" attribute, retuning an object with values - * @static * @param {SVGElement} element Element to parse * @return {Object} Objects with values parsed from style attribute of an element */ @@ -11914,7 +11897,6 @@ classRegistry.setClass(Group); /** * TODO experiment with different layout manager and svg results ( fixed fit content ) * Groups SVG elements (usually those retrieved from SVG document) - * @static * @param {FabricObject[]} elements FabricObject(s) parsed from svg, to group * @return {FabricObject | Group} */ @@ -13143,9 +13125,9 @@ const canvasDefaults = { perPixelTargetFind: false, targetFindTolerance: 0, skipTargetFind: false, - stopContextMenu: false, - fireRightClick: false, - fireMiddleClick: false, + stopContextMenu: true, + fireRightClick: true, + fireMiddleClick: true, enablePointerEvents: false, containerClass: 'canvas-container', preserveObjectStacking: true @@ -13155,7 +13137,7 @@ const canvasDefaults = { * Canvas class * @class Canvas * @extends StaticCanvas - * @tutorial {@link http://fabricjs.com/fabric-intro-part-1#canvas} + * @see {@link http://fabric5.fabricjs.com/fabric-intro-part-1#canvas} * * @fires object:modified at the end of a transform * @fires object:rotating while an object is being rotated from the control @@ -13256,27 +13238,32 @@ class SelectableCanvas extends StaticCanvas { * When true, mouse events on canvas (mousedown/mousemove/mouseup) result in free drawing. * After mousedown, mousemove creates a shape, * and then mouseup finalizes it and adds an instance of `fabric.Path` onto canvas. - * @tutorial {@link http://fabricjs.com/fabric-intro-part-4#free_drawing} + * @see {@link http://fabric5.fabricjs.com/fabric-intro-part-4#free_drawing} * @type Boolean */ - // event config /** - * Keep track of the hovered target - * @type FabricObject | null - * @private + * 启用双击锁定组对象,锁定后只能选择对象的子节点,无论group中interative和subTargetCheck是否启用 + * @type Boolean + * @default */ /** - * hold the list of nested targets hovered - * @type FabricObject[] - * @private + * 双击锁定的节点, 目前只支持组节点 + * @type Group | null + * @default */ - _defineProperty(this, "_hoveredTargets", []); + _defineProperty(this, "isolatedObject", void 0); + /** + * 指定的搜索对象 + * @type Boolean + * @default null + */ + _defineProperty(this, "_searchTargets", void 0); /** - * hold the list of objects to render + * hold the list of nested targets hovered in the previous events * @type FabricObject[] * @private */ - _defineProperty(this, "_objectsToRender", void 0); + _defineProperty(this, "_hoveredTargets", []); /** * hold a reference to a data structure that contains information * on the current on going transform @@ -13665,9 +13652,57 @@ class SelectableCanvas extends StaticCanvas { } /** - * This function is in charge of deciding which is the object that is the current target of an interaction event. - * For interaction event we mean a pointer related action on the canvas. - * Which is the + * 双击选择 + * @param e + * @returns + */ + dblClickLock(e) { + if (this.dblClickIsolateObject) { + const pointer = this.getScenePoint(e); + const objects = this.isolatedObject ? this.isolatedObject.getObjects() : this.getObjects(); + const obj = this.searchPossibleTargets(objects, pointer); + if (obj.target) { + if (obj.target instanceof Group) { + // 组才修改锁定 + this.isolatedObject = obj.target; + this.discardActiveObject(); + // 新创建的组对象,子节点coords初始化,否则无法选中 + obj.target._objects.forEach(o => { + o.setCoords(); + }); + } else { + // 非组对象不处理锁定,返回false继续对象自己的双击事件 + return false; + } + } else { + // 取消锁定 + this.isolatedObject = null; + this.discardActiveObject(); + } + return true; + } + return false; + } + + /** + * 设置搜索对象 + * 如当编辑path时,设置点为可搜索对象 + * @param objects + */ + setSearchTargets(objects) { + this._searchTargets = objects; + } + + /** + * 返回搜索对象 + * @returns + */ + getSearchTargets() { + return this._searchTargets || (this.isolatedObject ? this.isolatedObject._objects : this._objects); + } + + /** + * Method that determines what object we are clicking on * 11/09/2018 TODO: would be cool if findTarget could discern between being a full target * or the outside part of the corner. * @param {Event} e mouse event @@ -13688,7 +13723,7 @@ class SelectableCanvas extends StaticCanvas { const pointer = this.getScenePoint(e), activeObject = this._activeObject, aObjects = this.getActiveObjects(), - targetInfo = this.searchPossibleTargets(this._objects, pointer); + targetInfo = this.searchPossibleTargets(this.getSearchTargets(), pointer); const { subTargets: currentSubTargets, container: currentContainer, @@ -13824,7 +13859,8 @@ class SelectableCanvas extends StaticCanvas { while (i--) { const target = objects[i]; if (this._checkTarget(target, pointer)) { - if (isCollection(target) && target.subTargetCheck) { + // 没有开启双击锁定节点才搜索子节点 + if (!this.dblClickIsolateObject && isCollection(target) && target.subTargetCheck) { const { target: subTarget } = this._searchPossibleTargets(target._objects, pointer, subTargets); @@ -14486,7 +14522,9 @@ class Canvas extends SelectableCanvas { functor(canvasElement, `${eventTypePrefix}move`, this._onMouseMove, addEventOptions); functor(canvasElement, `${eventTypePrefix}out`, this._onMouseOut); functor(canvasElement, `${eventTypePrefix}enter`, this._onMouseEnter); - functor(canvasElement, 'wheel', this._onMouseWheel); + functor(canvasElement, 'wheel', this._onMouseWheel, { + passive: false + }); functor(canvasElement, 'contextmenu', this._onContextMenu); functor(canvasElement, 'click', this._onClick); // decide if to remove in fabric 7.0 @@ -14853,11 +14891,26 @@ class Canvas extends SelectableCanvas { const clicks = e.detail; if (clicks > 3 || clicks < 2) return; this._cacheTransformEventData(e); - clicks == 2 && e.type === 'dblclick' && this._handleEvent(e, 'dblclick'); + clicks == 2 && e.type === 'dblclick' && this._onDblClick(e); clicks == 3 && this._handleEvent(e, 'tripleclick'); this._resetTransformEventData(); } + /** + * 双击选择锁定组的子节点 + * @param e + */ + _onDblClick(e) { + if (this.dblClickLock(e)) { + // 锁定后立即选中点击子对象 + this._resetTransformEventData(); + this.__onMouseDown(e); + this.__onMouseUp(e); + return; + } + this._handleEvent(e, 'dblclick'); + } + /** * Return a the id of an event. * returns either the pointerId or the identifier or 0 for the mouse event @@ -15259,6 +15312,23 @@ class Canvas extends SelectableCanvas { shouldRender = true; } else if (this._shouldClearSelection(e, target)) { this.discardActiveObject(e); + + // 锁定对象时且没有指定选中时,如果点击组外空白或对象,取消锁定 + if (this.isolatedObject && !this._searchTargets) { + this.setSearchTargets([this.isolatedObject]); + const { + target + } = this.findTarget(e); + // 没有选中任何对象,或者选中的是锁定对象以外的对象 + if (target !== this.isolatedObject) { + this.isolatedObject = null; + } + this.setSearchTargets(null); + // 在此执行__onMouseDown选中其他对象 + this._resetTransformEventData(); + this.__onMouseDown(e); + return; + } } // we start a group selector rectangle if // selection is enabled @@ -15373,8 +15443,10 @@ class Canvas extends SelectableCanvas { * @private */ _fireOverOutEvents(e, target) { - const _hoveredTarget = this._hoveredTarget, - _hoveredTargets = this._hoveredTargets, + const { + _hoveredTarget, + _hoveredTargets + } = this, { subTargets } = this.findTarget(e), @@ -15386,6 +15458,9 @@ class Canvas extends SelectableCanvas { fireCanvas: true }); for (let i = 0; i < length; i++) { + if (subTargets[i] === target || _hoveredTargets[i] && _hoveredTargets[i] === _hoveredTarget) { + continue; + } this.fireSyntheticInOutEvents('mouse', { e, target: subTargets[i], @@ -15869,7 +15944,7 @@ function parseCoords(el, size) { /** * Gradient class * @class Gradient - * @tutorial {@link http://fabricjs.com/fabric-intro-part-2#gradients} + * @see {@link http://fabric5.fabricjs.com/fabric-intro-part-2#gradients} */ class Gradient { constructor(options) { @@ -16180,8 +16255,8 @@ classRegistry.setClass(Gradient, 'linear'); classRegistry.setClass(Gradient, 'radial'); /** - * @see {@link http://fabricjs.com/patterns demo} - * @see {@link http://fabricjs.com/dynamic-patterns demo} + * @see {@link http://fabric5.fabricjs.com/patterns demo} + * @see {@link http://fabric5.fabricjs.com/dynamic-patterns demo} */ class Pattern { /** @@ -16351,7 +16426,7 @@ classRegistry.setClass(Pattern); classRegistry.setClass(Pattern, 'pattern'); /** - * @see {@link http://fabricjs.com/freedrawing|Freedrawing demo} + * @see {@link http://fabric5.fabricjs.com/freedrawing|Freedrawing demo} */ class BaseBrush { /** @@ -17693,7 +17768,6 @@ class Line extends FabricObject { /** * Returns object representation of an instance - * @method toObject * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output * @return {Object} object representation of an instance */ @@ -18020,7 +18094,6 @@ classRegistry.setSVGClass(Ellipse); /** * Parses "points" attribute, returning an array of values - * @static * @param {String} points points attribute string * @return {Array} array of points */ @@ -18930,7 +19003,7 @@ function getMeasuringContext() { /** * Text class - * @tutorial {@link http://fabricjs.com/fabric-intro-part-2#text} + * @see {@link http://fabric5.fabricjs.com/fabric-intro-part-2#text} */ class FabricText extends StyledText { static getDefaults() { @@ -21499,7 +21572,8 @@ class ITextKeyBehavior extends ITextBehavior { autocomplete: 'off', spellcheck: 'false', 'data-fabric': 'textarea', - wrap: 'off' + wrap: 'off', + name: 'fabricTextarea' }).map(_ref => { let [attribute, value] = _ref; return textarea.setAttribute(attribute, value); @@ -23413,7 +23487,6 @@ class Textbox extends IText { /** * Returns object representation of an instance - * @method toObject * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output * @return {Object} object representation of an instance */ @@ -24029,6 +24102,8 @@ class WebGLFilterBackend { } else { gl.texImage2D(TEXTURE_2D, 0, RGBA, width, height, 0, RGBA, UNSIGNED_BYTE, null); } + // disabled because website and issues with different typescript version + // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion return texture; } @@ -24210,7 +24285,7 @@ const imageDefaultValues = { const IMAGE_PROPS = ['cropX', 'cropY']; /** - * @tutorial {@link http://fabricjs.com/fabric-intro-part-1#images} + * @see {@link http://fabric5.fabricjs.com/fabric-intro-part-1#images} */ class FabricImage extends FabricObject { static getDefaults() { @@ -24539,7 +24614,6 @@ class FabricImage extends FabricObject { /** * Applies filters assigned to this image (from "filters" array) or from filter param - * @method applyFilters * @param {Array} filters to be applied * @param {Boolean} forResizing specify if the filter operation is a resize operation */ @@ -25310,8 +25384,6 @@ const createEmptyResponse = () => ({ /** * Parses an SVG document, converts it to an array of corresponding fabric.* instances and passes them to a callback - * @static - * @function * @param {HTMLElement} doc SVG document to parse * @param {TSvgParsedCallback} callback Invoked when the parsing is done, with null if parsing wasn't possible with the list of svg nodes. * @param {TSvgReviverCallback} [reviver] Extra callback for further parsing of SVG elements, called after each fabric object has been created. @@ -26769,8 +26841,8 @@ const colorMatrixDefaultValues = { /** * Color Matrix filter class - * @see {@link http://fabricjs.com/image-filters|ImageFilters demo} - * @see {@Link http://phoboslab.org/log/2013/11/fast-image-filters-with-webgl demo} + * @see {@link http://fabric5.fabricjs.com/image-filters|ImageFilters demo} + * @see {@link http://phoboslab.org/log/2013/11/fast-image-filters-with-webgl demo} * @example Kodachrome filter * const filter = new ColorMatrix({ * matrix: [ diff --git a/dist/index.mjs.map b/dist/index.mjs.map index eadf7e6de67..10f842a03c0 100644 --- a/dist/index.mjs.map +++ b/dist/index.mjs.map @@ -1 +1 @@ -{"version":3,"file":"index.mjs","sources":["../src/config.ts","../src/util/internals/console.ts","../src/filters/GLProbes/GLProbe.ts","../src/filters/GLProbes/WebGLProbe.ts","../src/env/browser.ts","../src/env/index.ts","../src/cache.ts","../src/constants.ts","../src/ClassRegistry.ts","../src/util/animation/AnimationRegistry.ts","../src/Observable.ts","../src/util/internals/removeFromArray.ts","../src/util/misc/cos.ts","../src/util/misc/sin.ts","../src/Point.ts","../src/Collection.ts","../src/CommonMethods.ts","../src/util/animation/AnimationFrameProvider.ts","../src/util/internals/uid.ts","../src/util/misc/dom.ts","../src/util/misc/radiansDegreesConversion.ts","../src/util/misc/matrix.ts","../src/util/misc/objectEnlive.ts","../src/util/misc/pick.ts","../src/util/misc/toFixed.ts","../src/util/misc/svgExport.ts","../src/util/typeAssertions.ts","../src/util/dom_misc.ts","../src/canvas/DOMManagers/util.ts","../src/canvas/DOMManagers/StaticCanvasDOMManager.ts","../src/canvas/StaticCanvasOptions.ts","../src/canvas/StaticCanvas.ts","../src/util/dom_event.ts","../src/util/misc/boundingBoxFromPoints.ts","../src/util/misc/objectTransforms.ts","../src/util/misc/planeChange.ts","../src/controls/fireEvent.ts","../src/util/misc/resolveOrigin.ts","../src/util/misc/vectors.ts","../src/controls/util.ts","../src/controls/drag.ts","../src/color/color_map.ts","../src/color/constants.ts","../src/color/util.ts","../src/color/Color.ts","../src/util/misc/svgParsing.ts","../src/shapes/Object/FabricObjectSVGExportMixin.ts","../src/parser/getSvgRegex.ts","../src/shapes/Text/constants.ts","../src/parser/constants.ts","../src/Shadow.ts","../src/util/misc/capValue.ts","../src/shapes/Object/defaultValues.ts","../src/util/animation/easing.ts","../src/util/animation/AnimationBase.ts","../src/util/animation/ValueAnimation.ts","../src/util/animation/ArrayAnimation.ts","../src/util/animation/ColorAnimation.ts","../src/util/animation/animate.ts","../src/Intersection.ts","../src/shapes/Object/ObjectGeometry.ts","../src/shapes/Object/Object.ts","../src/controls/wrapWithFireEvent.ts","../src/controls/wrapWithFixedAnchor.ts","../src/controls/changeWidth.ts","../src/controls/controlRendering.ts","../src/controls/Control.ts","../src/controls/rotate.ts","../src/controls/scale.ts","../src/controls/skew.ts","../src/controls/scaleSkew.ts","../src/controls/commonControls.ts","../src/shapes/Object/InteractiveObject.ts","../src/util/applyMixins.ts","../src/shapes/Object/FabricObject.ts","../src/util/misc/isTransparent.ts","../src/util/internals/findRight.ts","../src/util/misc/projectStroke/StrokeProjectionsBase.ts","../src/util/misc/projectStroke/StrokeLineJoinProjections.ts","../src/util/misc/projectStroke/StrokeLineCapProjections.ts","../src/util/misc/projectStroke/index.ts","../src/util/internals/cloneStyles.ts","../src/util/lang_string.ts","../src/util/misc/textStyles.ts","../src/parser/attributes.ts","../src/parser/selectorMatches.ts","../src/parser/doesSomeParentMatch.ts","../src/parser/elementMatchesRule.ts","../src/parser/getGlobalStylesForElement.ts","../src/parser/normalizeAttr.ts","../src/util/internals/cleanupSvgAttribute.ts","../src/parser/parseTransformAttribute.ts","../src/parser/normalizeValue.ts","../src/parser/parseFontDeclaration.ts","../src/parser/parseStyleObject.ts","../src/parser/parseStyleString.ts","../src/parser/parseStyleAttribute.ts","../src/parser/setStrokeFillOpacity.ts","../src/parser/parseAttributes.ts","../src/shapes/Rect.ts","../src/LayoutManager/constants.ts","../src/LayoutManager/LayoutStrategies/utils.ts","../src/LayoutManager/LayoutStrategies/LayoutStrategy.ts","../src/LayoutManager/LayoutStrategies/FitContentLayout.ts","../src/LayoutManager/LayoutManager.ts","../src/shapes/Group.ts","../src/util/misc/groupSVGElements.ts","../src/util/misc/findScaleTo.ts","../src/util/path/regex.ts","../src/util/path/index.ts","../src/util/misc/mergeClipPaths.ts","../src/util/internals/getRandomInt.ts","../src/util/transform_matrix_removal.ts","../src/util/internals/dom_style.ts","../src/canvas/DOMManagers/CanvasDOMManager.ts","../src/canvas/CanvasOptions.ts","../src/canvas/SelectableCanvas.ts","../src/canvas/TextEditingManager.ts","../src/canvas/Canvas.ts","../src/gradient/constants.ts","../src/util/internals/ifNaN.ts","../src/parser/percent.ts","../src/gradient/parser/parseColorStops.ts","../src/gradient/parser/misc.ts","../src/gradient/parser/parseCoords.ts","../src/gradient/Gradient.ts","../src/Pattern/Pattern.ts","../src/brushes/BaseBrush.ts","../src/shapes/Path.ts","../src/brushes/PencilBrush.ts","../src/shapes/Circle.ts","../src/brushes/CircleBrush.ts","../src/brushes/SprayBrush.ts","../src/brushes/PatternBrush.ts","../src/shapes/Line.ts","../src/shapes/Triangle.ts","../src/shapes/Ellipse.ts","../src/parser/parsePointsAttribute.ts","../src/shapes/Polyline.ts","../src/shapes/Polygon.ts","../src/shapes/Text/StyledText.ts","../src/shapes/Text/TextSVGExportMixin.ts","../src/shapes/Text/Text.ts","../src/shapes/IText/DraggableTextDelegate.ts","../src/shapes/IText/ITextBehavior.ts","../src/shapes/IText/ITextKeyBehavior.ts","../src/shapes/IText/ITextClickBehavior.ts","../src/shapes/IText/constants.ts","../src/util/internals/applyCanvasTransform.ts","../src/shapes/IText/IText.ts","../src/shapes/Textbox.ts","../src/LayoutManager/LayoutStrategies/ClipPathLayout.ts","../src/LayoutManager/LayoutStrategies/FixedLayout.ts","../src/LayoutManager/ActiveSelectionLayoutManager.ts","../src/shapes/ActiveSelection.ts","../src/filters/Canvas2dFilterBackend.ts","../src/filters/WebGLFilterBackend.ts","../src/filters/FilterBackend.ts","../src/shapes/Image.ts","../src/parser/applyViewboxTransform.ts","../src/parser/getTagName.ts","../src/parser/hasInvalidAncestor.ts","../src/parser/getMultipleNodes.ts","../src/parser/parseUseDirectives.ts","../src/parser/recursivelyParseGradientsXlink.ts","../src/parser/getGradientDefs.ts","../src/parser/getCSSRules.ts","../src/parser/elements_parser.ts","../src/parser/parseSVGDocument.ts","../src/parser/loadSVGFromString.ts","../src/parser/loadSVGFromURL.ts","../src/controls/polyControl.ts","../src/controls/pathControl.ts","../src/filters/utils.ts","../src/filters/shaders/baseFilter.ts","../src/filters/BaseFilter.ts","../src/filters/shaders/blendColor.ts","../src/filters/BlendColor.ts","../src/filters/shaders/blendImage.ts","../src/filters/BlendImage.ts","../src/filters/shaders/blur.ts","../src/filters/Blur.ts","../src/filters/shaders/brightness.ts","../src/filters/Brightness.ts","../src/filters/shaders/colorMatrix.ts","../src/filters/ColorMatrix.ts","../src/filters/ColorMatrixFilters.ts","../src/filters/Composed.ts","../src/filters/shaders/constrast.ts","../src/filters/Contrast.ts","../src/filters/shaders/convolute.ts","../src/filters/Convolute.ts","../src/filters/shaders/gamma.ts","../src/filters/Gamma.ts","../src/filters/shaders/grayscale.ts","../src/filters/Grayscale.ts","../src/filters/HueRotation.ts","../src/filters/shaders/invert.ts","../src/filters/Invert.ts","../src/filters/shaders/noise.ts","../src/filters/Noise.ts","../src/filters/shaders/pixelate.ts","../src/filters/Pixelate.ts","../src/filters/shaders/removeColor.ts","../src/filters/RemoveColor.ts","../src/filters/Resize.ts","../src/filters/shaders/saturation.ts","../src/filters/Saturation.ts","../src/filters/shaders/vibrance.ts","../src/filters/Vibrance.ts"],"sourcesContent":["export type TConfiguration = Partial;\n\nclass BaseConfiguration {\n /**\n * Browser-specific constant to adjust CanvasRenderingContext2D.shadowBlur value,\n * which is unitless and not rendered equally across browsers.\n *\n * Values that work quite well (as of October 2017) are:\n * - Chrome: 1.5\n * - Edge: 1.75\n * - Firefox: 0.9\n * - Safari: 0.95\n *\n * @since 2.0.0\n * @type Number\n * @default 1\n */\n browserShadowBlurConstant = 1;\n\n /**\n * Pixel per Inch as a default value set to 96. Can be changed for more realistic conversion.\n */\n DPI = 96;\n\n /**\n * Device Pixel Ratio\n * @see https://developer.apple.com/library/safari/documentation/AudioVideo/Conceptual/HTML-canvas-guide/SettingUptheCanvas/SettingUptheCanvas.html\n */\n devicePixelRatio =\n typeof window !== 'undefined' ? window.devicePixelRatio : 1; // eslint-disable-line no-restricted-globals\n\n /**\n * Pixel limit for cache canvases. 1Mpx , 4Mpx should be fine.\n * @since 1.7.14\n * @type Number\n */\n perfLimitSizeTotal = 2097152;\n\n /**\n * Pixel limit for cache canvases width or height. IE fixes the maximum at 5000\n * @since 1.7.14\n * @type Number\n */\n maxCacheSideLimit = 4096;\n\n /**\n * Lowest pixel limit for cache canvases, set at 256PX\n * @since 1.7.14\n * @type Number\n */\n minCacheSideLimit = 256;\n\n /**\n * When 'true', style information is not retained when copy/pasting text, making\n * pasted text use destination style.\n * Defaults to 'false'.\n * @type Boolean\n * @deprecated\n */\n disableStyleCopyPaste = false;\n\n /**\n * Enable webgl for filtering picture is available\n * A filtering backend will be initialized, this will both take memory and\n * time since a default 2048x2048 canvas will be created for the gl context\n * @since 2.0.0\n * @type Boolean\n */\n enableGLFiltering = true;\n\n /**\n * if webgl is enabled and available, textureSize will determine the size\n * of the canvas backend\n *\n * In order to support old hardware set to `2048` to avoid OOM\n *\n * @since 2.0.0\n * @type Number\n */\n textureSize = 4096;\n\n /**\n * Skip performance testing of setupGLContext and force the use of putImageData that seems to be the one that works best on\n * Chrome + old hardware. if your users are experiencing empty images after filtering you may try to force this to true\n * this has to be set before instantiating the filtering backend ( before filtering the first image )\n * @type Boolean\n * @default false\n */\n forceGLPutImageData = false;\n\n /**\n * If disabled boundsOfCurveCache is not used. For apps that make heavy usage of pencil drawing probably disabling it is better\n * With the standard behaviour of fabric to translate all curves in absolute commands and by not subtracting the starting point from\n * the curve is very hard to hit any cache.\n * Enable only if you know why it could be useful.\n * Candidate for removal/simplification\n * @default false\n */\n cachesBoundsOfCurve = false;\n\n /**\n * Map of font files\n * Map of font files\n */\n fontPaths: Record = {};\n\n /**\n * Defines the number of fraction digits to use when serializing object values.\n * Used in exporting methods (`toObject`, `toJSON`, `toSVG`)\n * You can use it to increase/decrease precision of such values like left, top, scaleX, scaleY, etc.\n */\n NUM_FRACTION_DIGITS = 4;\n}\n\nexport class Configuration extends BaseConfiguration {\n constructor(config?: TConfiguration) {\n super();\n this.configure(config);\n }\n\n configure(config: TConfiguration = {}) {\n Object.assign(this, config);\n }\n\n /**\n * Map of font files\n */\n addFonts(\n paths: Record = {},\n ) {\n this.fontPaths = {\n ...this.fontPaths,\n ...paths,\n };\n }\n\n removeFonts(fontFamilys: string[] = []) {\n fontFamilys.forEach((fontFamily) => {\n delete this.fontPaths[fontFamily];\n });\n }\n\n clearFonts() {\n this.fontPaths = {};\n }\n\n restoreDefaults(keys?: (keyof T)[]) {\n const defaults = new BaseConfiguration() as T;\n const config =\n keys?.reduce((acc, key) => {\n acc[key] = defaults[key];\n return acc;\n }, {} as T) || defaults;\n this.configure(config);\n }\n}\n\nexport const config = new Configuration();\n","export const log = (\n severity: 'log' | 'warn' | 'error',\n ...optionalParams: any[]\n) =>\n // eslint-disable-next-line no-restricted-syntax\n console[severity]('fabric', ...optionalParams);\n\nexport class FabricError extends Error {\n constructor(message?: string, options?: ErrorOptions) {\n super(`fabric: ${message}`, options);\n }\n}\n\nexport class SignalAbortedError extends FabricError {\n constructor(context: string) {\n super(`${context} 'options.signal' is in 'aborted' state`);\n }\n}\n","export type GLPrecision = 'lowp' | 'mediump' | 'highp';\n\nexport abstract class GLProbe {\n declare GLPrecision: GLPrecision | undefined;\n abstract queryWebGL(canvas: HTMLCanvasElement): void;\n abstract isSupported(textureSize: number): boolean;\n}\n","import { log } from '../../util/internals/console';\nimport { GLProbe } from './GLProbe';\nimport type { GLPrecision } from './GLProbe';\n\n/**\n * Lazy initialize WebGL constants\n */\nexport class WebGLProbe extends GLProbe {\n declare maxTextureSize?: number;\n\n /**\n * Tests if webgl supports certain precision\n * @param {WebGL} Canvas WebGL context to test on\n * @param {GLPrecision} Precision to test can be any of following\n * @returns {Boolean} Whether the user's browser WebGL supports given precision.\n */\n private testPrecision(\n gl: WebGLRenderingContext,\n precision: GLPrecision,\n ): boolean {\n const fragmentSource = `precision ${precision} float;\\nvoid main(){}`;\n const fragmentShader = gl.createShader(gl.FRAGMENT_SHADER);\n if (!fragmentShader) {\n return false;\n }\n gl.shaderSource(fragmentShader, fragmentSource);\n gl.compileShader(fragmentShader);\n return !!gl.getShaderParameter(fragmentShader, gl.COMPILE_STATUS);\n }\n\n /**\n * query browser for WebGL\n */\n queryWebGL(canvas: HTMLCanvasElement) {\n const gl = canvas.getContext('webgl');\n if (gl) {\n this.maxTextureSize = gl.getParameter(gl.MAX_TEXTURE_SIZE);\n this.GLPrecision = (['highp', 'mediump', 'lowp'] as const).find(\n (precision) => this.testPrecision(gl, precision),\n );\n gl.getExtension('WEBGL_lose_context')!.loseContext();\n log('log', `WebGL: max texture size ${this.maxTextureSize}`);\n }\n }\n\n isSupported(textureSize: number) {\n return !!this.maxTextureSize && this.maxTextureSize >= textureSize;\n }\n}\n","/* eslint-disable no-restricted-globals */\nimport { WebGLProbe } from '../filters/GLProbes/WebGLProbe';\nimport type { TCopyPasteData, TFabricEnv } from './types';\n\nconst copyPasteData: TCopyPasteData = {};\n\nexport const getEnv = (): TFabricEnv => {\n return {\n document,\n window,\n isTouchSupported:\n 'ontouchstart' in window ||\n 'ontouchstart' in document ||\n (window && window.navigator && window.navigator.maxTouchPoints > 0),\n WebGLProbe: new WebGLProbe(),\n dispose() {\n // noop\n },\n copyPasteData,\n };\n};\n","/**\n * This file is consumed by fabric.\n * The `./node` and `./browser` files define the env variable that is used by this module.\n * The `./browser` module is defined to be the default env and doesn't set the env at all.\n * This is done in order to support isomorphic usage for browser and node applications\n * since window and document aren't defined at time of import in SSR, we can't set env so we avoid it by deferring to the default env.\n */\n\nimport { config } from '../config';\nimport { getEnv as getBrowserEnv } from './browser';\nimport type { TFabricEnv } from './types';\nimport type { DOMWindow } from 'jsdom';\n\nlet env: TFabricEnv;\n\n/**\n * Sets the environment variables used by fabric.\\\n * This is exposed for special cases, such as configuring a test environment, and should be used with care.\n *\n * **CAUTION**: Must be called before using the package.\n *\n * @example\n * Passing `window` and `document` objects to fabric (in case they are mocked or something)\n * import { getEnv, setEnv } from 'fabric';\n * // we want fabric to use the `window` and `document` objects exposed by the environment we are running in.\n * setEnv({ ...getEnv(), window, document });\n * // done with setup, using fabric is now safe\n */\nexport const setEnv = (value: TFabricEnv) => {\n env = value;\n};\n\n/**\n * In order to support SSR we **MUST** access the browser env only after the window has loaded\n */\nexport const getEnv = () => env || (env = getBrowserEnv());\n\nexport const getFabricDocument = (): Document => getEnv().document;\n\nexport const getFabricWindow = (): (Window & typeof globalThis) | DOMWindow =>\n getEnv().window;\n\n/**\n * @returns the config value if defined, fallbacks to the environment value\n */\nexport const getDevicePixelRatio = () =>\n Math.max(config.devicePixelRatio ?? getFabricWindow().devicePixelRatio, 1);\n","import { config } from './config';\nimport type { TRectBounds } from './typedefs';\n\nexport class Cache {\n /**\n * Cache of widths of chars in text rendering.\n */\n charWidthsCache: Record<\n /** fontFamily */ string,\n Record<\n /** fontStyleCacheKey */ string,\n Record\n >\n > = {};\n\n /**\n * @return {Object} reference to cache\n */\n getFontCache({\n fontFamily,\n fontStyle,\n fontWeight,\n }: {\n fontFamily: string;\n fontStyle: string;\n fontWeight: string | number;\n }) {\n fontFamily = fontFamily.toLowerCase();\n if (!this.charWidthsCache[fontFamily]) {\n this.charWidthsCache[fontFamily] = {};\n }\n const fontCache = this.charWidthsCache[fontFamily];\n const cacheKey = `${fontStyle.toLowerCase()}_${(\n fontWeight + ''\n ).toLowerCase()}`;\n if (!fontCache[cacheKey]) {\n fontCache[cacheKey] = {};\n }\n return fontCache[cacheKey];\n }\n\n /**\n * Clear char widths cache for the given font family or all the cache if no\n * fontFamily is specified.\n * Use it if you know you are loading fonts in a lazy way and you are not waiting\n * for custom fonts to load properly when adding text objects to the canvas.\n * If a text object is added when its own font is not loaded yet, you will get wrong\n * measurement and so wrong bounding boxes.\n * After the font cache is cleared, either change the textObject text content or call\n * initDimensions() to trigger a recalculation\n * @param {String} [fontFamily] font family to clear\n */\n clearFontCache(fontFamily?: string) {\n fontFamily = (fontFamily || '').toLowerCase();\n if (!fontFamily) {\n this.charWidthsCache = {};\n } else if (this.charWidthsCache[fontFamily]) {\n delete this.charWidthsCache[fontFamily];\n }\n }\n\n /**\n * Given current aspect ratio, determines the max width and height that can\n * respect the total allowed area for the cache.\n * @param {number} ar aspect ratio\n * @return {number[]} Limited dimensions X and Y\n */\n limitDimsByArea(ar: number) {\n const { perfLimitSizeTotal } = config;\n const roughWidth = Math.sqrt(perfLimitSizeTotal * ar);\n // we are not returning a point on purpose, to avoid circular dependencies\n // this is an internal utility\n return [\n Math.floor(roughWidth),\n Math.floor(perfLimitSizeTotal / roughWidth),\n ];\n }\n\n /**\n * This object keeps the results of the boundsOfCurve calculation mapped by the joined arguments necessary to calculate it.\n * It does speed up calculation, if you parse and add always the same paths, but in case of heavy usage of freedrawing\n * you do not get any speed benefit and you get a big object in memory.\n * The object was a private variable before, while now is appended to the lib so that you have access to it and you\n * can eventually clear it.\n * It was an internal variable, is accessible since version 2.3.4\n */\n boundsOfCurveCache: Record = {};\n}\n\nexport const cache = new Cache();\n","import type { TMat2D } from './typedefs';\n// use this syntax so babel plugin see this import here\nimport { version } from '../package.json';\n\nexport const VERSION = version;\n// eslint-disable-next-line @typescript-eslint/no-empty-function\nexport function noop() {}\n\nexport const halfPI = Math.PI / 2;\nexport const quarterPI = Math.PI / 4;\nexport const twoMathPi = Math.PI * 2;\nexport const PiBy180 = Math.PI / 180;\n\nexport const iMatrix = Object.freeze([1, 0, 0, 1, 0, 0]) as TMat2D;\nexport const DEFAULT_SVG_FONT_SIZE = 16;\nexport const ALIASING_LIMIT = 2;\n\n/* \"magic number\" for bezier approximations of arcs (http://itc.ktu.lt/itc354/Riskus354.pdf) */\nexport const kRect = 1 - 0.5522847498;\n\nexport const CENTER = 'center';\nexport const LEFT = 'left';\nexport const TOP = 'top';\nexport const BOTTOM = 'bottom';\nexport const RIGHT = 'right';\nexport const NONE = 'none';\n\nexport const reNewline = /\\r?\\n/;\n\nexport const MOVING = 'moving';\nexport const SCALING = 'scaling';\nexport const ROTATING = 'rotating';\nexport const ROTATE = 'rotate';\nexport const SKEWING = 'skewing';\nexport const RESIZING = 'resizing';\nexport const MODIFY_POLY = 'modifyPoly';\nexport const MODIFY_PATH = 'modifyPath';\nexport const CHANGED = 'changed';\nexport const SCALE = 'scale';\nexport const SCALE_X = 'scaleX';\nexport const SCALE_Y = 'scaleY';\nexport const SKEW_X = 'skewX';\nexport const SKEW_Y = 'skewY';\nexport const FILL = 'fill';\nexport const STROKE = 'stroke';\nexport const MODIFIED = 'modified';\n","import { FabricError } from './util/internals/console';\n\n/*\n * This Map connects the objects type value with their\n * class implementation. It used from any object to understand which are\n * the classes to enlive when requesting a object.type = 'path' for example.\n * Objects uses it for clipPath, Canvas uses it for everything.\n * This is necessary for generic code to run and enlive instances from serialized representation.\n * You can customize which classes get enlived from SVG parsing using this classRegistry.\n * The Registry start empty and gets filled in depending which files you import.\n * If you want to be able to parse arbitrary SVGs or JSON representation of canvases, coming from\n * different sources you will need to import all fabric because you may need all classes.\n */\n\nexport const JSON = 'json';\nexport const SVG = 'svg';\n\nexport class ClassRegistry {\n declare [JSON]: Map;\n declare [SVG]: Map;\n\n constructor() {\n this[JSON] = new Map();\n this[SVG] = new Map();\n }\n\n has(classType: string): boolean {\n return this[JSON].has(classType);\n }\n\n getClass(classType: string): T {\n const constructor = this[JSON].get(classType);\n if (!constructor) {\n throw new FabricError(`No class registered for ${classType}`);\n }\n return constructor;\n }\n\n setClass(classConstructor: any, classType?: string) {\n if (classType) {\n this[JSON].set(classType, classConstructor);\n } else {\n this[JSON].set(classConstructor.type, classConstructor);\n // legacy\n // @TODO: needs to be removed in fabric 7 or 8\n this[JSON].set(classConstructor.type.toLowerCase(), classConstructor);\n }\n }\n\n getSVGClass(SVGTagName: string): any {\n return this[SVG].get(SVGTagName);\n }\n\n setSVGClass(classConstructor: any, SVGTagName?: string) {\n this[SVG].set(\n SVGTagName ?? classConstructor.type.toLowerCase(),\n classConstructor,\n );\n }\n}\n\nexport const classRegistry = new ClassRegistry();\n","import type { StaticCanvas } from '../../canvas/StaticCanvas';\nimport type { FabricObject } from '../../shapes/Object/FabricObject';\nimport type { AnimationBase } from './AnimationBase';\n\n/**\n * Array holding all running animations\n */\nclass AnimationRegistry extends Array {\n /**\n * Remove a single animation using an animation context\n * @param {AnimationBase} context\n */\n remove(context: AnimationBase) {\n const index = this.indexOf(context);\n index > -1 && this.splice(index, 1);\n }\n\n /**\n * Cancel all running animations on the next frame\n */\n cancelAll() {\n const animations = this.splice(0);\n animations.forEach((animation) => animation.abort());\n return animations;\n }\n\n /**\n * Cancel all running animations attached to a canvas on the next frame\n * @param {StaticCanvas} canvas\n */\n cancelByCanvas(canvas: StaticCanvas) {\n if (!canvas) {\n return [];\n }\n const animations = this.filter(\n (animation) =>\n animation.target === canvas ||\n (typeof animation.target === 'object' &&\n (animation.target as FabricObject)?.canvas === canvas),\n );\n animations.forEach((animation) => animation.abort());\n return animations;\n }\n\n /**\n * Cancel all running animations for target on the next frame\n * @param target\n */\n cancelByTarget(target: AnimationBase['target']) {\n if (!target) {\n return [];\n }\n const animations = this.filter((animation) => animation.target === target);\n animations.forEach((animation) => animation.abort());\n return animations;\n }\n}\n\nexport const runningAnimations = new AnimationRegistry();\n","export type TEventCallback = (options: T) => any;\n\ntype EventRegistryObject = {\n [K in keyof E]?: TEventCallback;\n};\n\n/**\n * @tutorial {@link http://fabricjs.com/fabric-intro-part-2#events}\n * @see {@link http://fabricjs.com/events|Events demo}\n */\nexport class Observable {\n private __eventListeners: Record =\n {} as Record;\n\n /**\n * Observes specified event\n * @alias on\n * @param {string} eventName Event name (eg. 'after:render')\n * @param {EventRegistryObject} handlers key/value pairs (eg. {'after:render': handler, 'selection:cleared': handler})\n * @param {Function} handler Function that receives a notification when an event of the specified type occurs\n * @return {Function} disposer\n */\n on(\n eventName: K,\n handler: TEventCallback,\n ): VoidFunction;\n on(handlers: EventRegistryObject): VoidFunction;\n on(\n arg0: K | EventRegistryObject,\n handler?: TEventCallback,\n ): VoidFunction {\n if (!this.__eventListeners) {\n this.__eventListeners = {} as Record;\n }\n if (typeof arg0 === 'object') {\n // one object with key/value pairs was passed\n Object.entries(arg0).forEach(([eventName, handler]) => {\n this.on(eventName as K, handler as TEventCallback);\n });\n return () => this.off(arg0);\n } else if (handler) {\n const eventName = arg0;\n if (!this.__eventListeners[eventName]) {\n this.__eventListeners[eventName] = [];\n }\n this.__eventListeners[eventName].push(handler);\n return () => this.off(eventName, handler);\n } else {\n // noop\n return () => false;\n }\n }\n\n /**\n * Observes specified event **once**\n * @alias once\n * @param {string} eventName Event name (eg. 'after:render')\n * @param {EventRegistryObject} handlers key/value pairs (eg. {'after:render': handler, 'selection:cleared': handler})\n * @param {Function} handler Function that receives a notification when an event of the specified type occurs\n * @return {Function} disposer\n */\n once(\n eventName: K,\n handler: TEventCallback,\n ): VoidFunction;\n once(handlers: EventRegistryObject): VoidFunction;\n once(\n arg0: K | EventRegistryObject,\n handler?: TEventCallback,\n ): VoidFunction {\n if (typeof arg0 === 'object') {\n // one object with key/value pairs was passed\n const disposers: VoidFunction[] = [];\n Object.entries(arg0).forEach(([eventName, handler]) => {\n disposers.push(this.once(eventName as K, handler as TEventCallback));\n });\n return () => disposers.forEach((d) => d());\n } else if (handler) {\n const disposer = this.on(\n arg0,\n function onceHandler(this: Observable, ...args) {\n handler.call(this, ...args);\n disposer();\n },\n );\n return disposer;\n } else {\n // noop\n return () => false;\n }\n }\n\n /**\n * @private\n * @param {string} eventName\n * @param {Function} [handler]\n */\n private _removeEventListener(\n eventName: K,\n handler?: TEventCallback,\n ) {\n if (!this.__eventListeners[eventName]) {\n return;\n }\n\n if (handler) {\n const eventListener = this.__eventListeners[eventName];\n const index = eventListener.indexOf(handler);\n index > -1 && eventListener.splice(index, 1);\n } else {\n this.__eventListeners[eventName] = [];\n }\n }\n\n /**\n * Unsubscribe all event listeners for eventname.\n * Do not use this pattern. You could kill internal fabricJS events.\n * We know we should have protected events for internal flows, but we don't have yet\n * @deprecated\n * @param {string} eventName event name (eg. 'after:render')\n */\n off(eventName: K): void;\n /**\n * unsubscribe an event listener\n * @param {string} eventName event name (eg. 'after:render')\n * @param {TEventCallback} handler event listener to unsubscribe\n */\n off(eventName: K, handler: TEventCallback): void;\n /**\n * unsubscribe event listeners\n * @param handlers handlers key/value pairs (eg. {'after:render': handler, 'selection:cleared': handler})\n */\n off(handlers: EventRegistryObject): void;\n /**\n * unsubscribe all event listeners\n */\n off(): void;\n off(\n arg0?: K | EventRegistryObject,\n handler?: TEventCallback,\n ) {\n if (!this.__eventListeners) {\n return;\n }\n\n // remove all key/value pairs (event name -> event handler)\n if (typeof arg0 === 'undefined') {\n for (const eventName in this.__eventListeners) {\n this._removeEventListener(eventName);\n }\n }\n // one object with key/value pairs was passed\n else if (typeof arg0 === 'object') {\n Object.entries(arg0).forEach(([eventName, handler]) => {\n this._removeEventListener(eventName as K, handler as TEventCallback);\n });\n } else {\n this._removeEventListener(arg0, handler);\n }\n }\n\n /**\n * Fires event with an optional options object\n * @param {String} eventName Event name to fire\n * @param {Object} [options] Options object\n */\n fire(eventName: K, options?: EventSpec[K]) {\n if (!this.__eventListeners) {\n return;\n }\n\n const listenersForEvent = this.__eventListeners[eventName]?.concat();\n if (listenersForEvent) {\n for (let i = 0; i < listenersForEvent.length; i++) {\n listenersForEvent[i].call(this, options || {});\n }\n }\n }\n}\n","/**\n * Removes value from an array.\n * Presence of value (and its position in an array) is determined via `Array.prototype.indexOf`\n * @param {Array} array\n * @param {*} value\n * @return {Array} original array\n */\nexport const removeFromArray = (array: T[], value: T): T[] => {\n const idx = array.indexOf(value);\n if (idx !== -1) {\n array.splice(idx, 1);\n }\n return array;\n};\n","import type { TRadian } from '../../typedefs';\nimport { halfPI } from '../../constants';\n\n/**\n * Calculate the cos of an angle, avoiding returning floats for known results\n * This function is here just to avoid getting 0.999999999999999 when dealing\n * with numbers that are really 1 or 0.\n * @param {TRadian} angle the angle\n * @return {Number} the cosin value for angle.\n */\nexport const cos = (angle: TRadian): number => {\n if (angle === 0) {\n return 1;\n }\n const angleSlice = Math.abs(angle) / halfPI;\n switch (angleSlice) {\n case 1:\n case 3:\n return 0;\n case 2:\n return -1;\n }\n return Math.cos(angle);\n};\n","import type { TRadian } from '../../typedefs';\nimport { halfPI } from '../../constants';\n\n/**\n * Calculate the cos of an angle, avoiding returning floats for known results\n * This function is here just to avoid getting 0.999999999999999 when dealing\n * with numbers that are really 1 or 0.\n * @param {TRadian} angle the angle\n * @return {Number} the sin value for angle.\n */\nexport const sin = (angle: TRadian): number => {\n if (angle === 0) {\n return 0;\n }\n const angleSlice = angle / halfPI;\n const value = Math.sign(angle);\n switch (angleSlice) {\n case 1:\n return value;\n case 2:\n return 0;\n case 3:\n return -value;\n }\n return Math.sin(angle);\n};\n","import type { TMat2D, TRadian } from './typedefs';\nimport { cos } from './util/misc/cos';\nimport { sin } from './util/misc/sin';\n\nexport interface XY {\n x: number;\n y: number;\n}\n\n/**\n * Adaptation of work of Kevin Lindsey(kevin@kevlindev.com)\n */\nexport class Point implements XY {\n declare x: number;\n\n declare y: number;\n\n constructor();\n constructor(x: number, y: number);\n constructor(point?: XY);\n constructor(arg0: number | XY = 0, y = 0) {\n if (typeof arg0 === 'object') {\n this.x = arg0.x;\n this.y = arg0.y;\n } else {\n this.x = arg0;\n this.y = y;\n }\n }\n\n /**\n * Adds another point to this one and returns a new one with the sum\n * @param {XY} that\n * @return {Point} new Point instance with added values\n */\n add(that: XY): Point {\n return new Point(this.x + that.x, this.y + that.y);\n }\n\n /**\n * Adds another point to this one\n * @param {XY} that\n * @return {Point} thisArg\n * @chainable\n * @deprecated\n */\n addEquals(that: XY): Point {\n this.x += that.x;\n this.y += that.y;\n return this;\n }\n\n /**\n * Adds value to this point and returns a new one\n * @param {Number} scalar\n * @return {Point} new Point with added value\n */\n scalarAdd(scalar: number): Point {\n return new Point(this.x + scalar, this.y + scalar);\n }\n\n /**\n * Adds value to this point\n * @param {Number} scalar\n * @return {Point} thisArg\n * @chainable\n * @deprecated\n */\n scalarAddEquals(scalar: number): Point {\n this.x += scalar;\n this.y += scalar;\n return this;\n }\n\n /**\n * Subtracts another point from this point and returns a new one\n * @param {XY} that\n * @return {Point} new Point object with subtracted values\n */\n subtract(that: XY): Point {\n return new Point(this.x - that.x, this.y - that.y);\n }\n\n /**\n * Subtracts another point from this point\n * @param {XY} that\n * @return {Point} thisArg\n * @chainable\n * @deprecated\n */\n subtractEquals(that: XY): Point {\n this.x -= that.x;\n this.y -= that.y;\n return this;\n }\n\n /**\n * Subtracts value from this point and returns a new one\n * @param {Number} scalar\n * @return {Point}\n */\n scalarSubtract(scalar: number): Point {\n return new Point(this.x - scalar, this.y - scalar);\n }\n\n /**\n * Subtracts value from this point\n * @param {Number} scalar\n * @return {Point} thisArg\n * @chainable\n * @deprecated\n */\n scalarSubtractEquals(scalar: number): Point {\n this.x -= scalar;\n this.y -= scalar;\n return this;\n }\n\n /**\n * Multiplies this point by another value and returns a new one\n * @param {XY} that\n * @return {Point}\n */\n multiply(that: XY): Point {\n return new Point(this.x * that.x, this.y * that.y);\n }\n\n /**\n * Multiplies this point by a value and returns a new one\n * @param {Number} scalar\n * @return {Point}\n */\n scalarMultiply(scalar: number): Point {\n return new Point(this.x * scalar, this.y * scalar);\n }\n\n /**\n * Multiplies this point by a value\n * @param {Number} scalar\n * @return {Point} thisArg\n * @chainable\n * @deprecated\n */\n scalarMultiplyEquals(scalar: number): Point {\n this.x *= scalar;\n this.y *= scalar;\n return this;\n }\n\n /**\n * Divides this point by another and returns a new one\n * @param {XY} that\n * @return {Point}\n */\n divide(that: XY): Point {\n return new Point(this.x / that.x, this.y / that.y);\n }\n\n /**\n * Divides this point by a value and returns a new one\n * @param {Number} scalar\n * @return {Point}\n */\n scalarDivide(scalar: number): Point {\n return new Point(this.x / scalar, this.y / scalar);\n }\n\n /**\n * Divides this point by a value\n * @param {Number} scalar\n * @return {Point} thisArg\n * @chainable\n * @deprecated\n */\n scalarDivideEquals(scalar: number): Point {\n this.x /= scalar;\n this.y /= scalar;\n return this;\n }\n\n /**\n * Returns true if this point is equal to another one\n * @param {XY} that\n * @return {Boolean}\n */\n eq(that: XY): boolean {\n return this.x === that.x && this.y === that.y;\n }\n\n /**\n * Returns true if this point is less than another one\n * @param {XY} that\n * @return {Boolean}\n */\n lt(that: XY): boolean {\n return this.x < that.x && this.y < that.y;\n }\n\n /**\n * Returns true if this point is less than or equal to another one\n * @param {XY} that\n * @return {Boolean}\n */\n lte(that: XY): boolean {\n return this.x <= that.x && this.y <= that.y;\n }\n\n /**\n\n * Returns true if this point is greater another one\n * @param {XY} that\n * @return {Boolean}\n */\n gt(that: XY): boolean {\n return this.x > that.x && this.y > that.y;\n }\n\n /**\n * Returns true if this point is greater than or equal to another one\n * @param {XY} that\n * @return {Boolean}\n */\n gte(that: XY): boolean {\n return this.x >= that.x && this.y >= that.y;\n }\n\n /**\n * Returns new point which is the result of linear interpolation with this one and another one\n * @param {XY} that\n * @param {Number} t , position of interpolation, between 0 and 1 default 0.5\n * @return {Point}\n */\n lerp(that: XY, t = 0.5): Point {\n t = Math.max(Math.min(1, t), 0);\n return new Point(\n this.x + (that.x - this.x) * t,\n this.y + (that.y - this.y) * t,\n );\n }\n\n /**\n * Returns distance from this point and another one\n * @param {XY} that\n * @return {Number}\n */\n distanceFrom(that: XY): number {\n const dx = this.x - that.x,\n dy = this.y - that.y;\n return Math.sqrt(dx * dx + dy * dy);\n }\n\n /**\n * Returns the point between this point and another one\n * @param {XY} that\n * @return {Point}\n */\n midPointFrom(that: XY): Point {\n return this.lerp(that);\n }\n\n /**\n * Returns a new point which is the min of this and another one\n * @param {XY} that\n * @return {Point}\n */\n min(that: XY): Point {\n return new Point(Math.min(this.x, that.x), Math.min(this.y, that.y));\n }\n\n /**\n * Returns a new point which is the max of this and another one\n * @param {XY} that\n * @return {Point}\n */\n max(that: XY): Point {\n return new Point(Math.max(this.x, that.x), Math.max(this.y, that.y));\n }\n\n /**\n * Returns string representation of this point\n * @return {String}\n */\n toString(): string {\n return `${this.x},${this.y}`;\n }\n\n /**\n * Sets x/y of this point\n * @param {Number} x\n * @param {Number} y\n * @chainable\n */\n setXY(x: number, y: number) {\n this.x = x;\n this.y = y;\n return this;\n }\n\n /**\n * Sets x of this point\n * @param {Number} x\n * @chainable\n */\n setX(x: number) {\n this.x = x;\n return this;\n }\n\n /**\n * Sets y of this point\n * @param {Number} y\n * @chainable\n */\n setY(y: number) {\n this.y = y;\n return this;\n }\n\n /**\n * Sets x/y of this point from another point\n * @param {XY} that\n * @chainable\n */\n setFromPoint(that: XY) {\n this.x = that.x;\n this.y = that.y;\n return this;\n }\n\n /**\n * Swaps x/y of this point and another point\n * @param {XY} that\n */\n swap(that: XY) {\n const x = this.x,\n y = this.y;\n this.x = that.x;\n this.y = that.y;\n that.x = x;\n that.y = y;\n }\n\n /**\n * return a cloned instance of the point\n * @return {Point}\n */\n clone(): Point {\n return new Point(this.x, this.y);\n }\n\n /**\n * Rotates `point` around `origin` with `radians`\n * @param {XY} origin The origin of the rotation\n * @param {TRadian} radians The radians of the angle for the rotation\n * @return {Point} The new rotated point\n */\n rotate(radians: TRadian, origin: XY = ZERO): Point {\n // TODO benchmark and verify the add and subtract how much cost\n // and then in case early return if no origin is passed\n const sinus = sin(radians),\n cosinus = cos(radians);\n const p = this.subtract(origin);\n const rotated = new Point(\n p.x * cosinus - p.y * sinus,\n p.x * sinus + p.y * cosinus,\n );\n return rotated.add(origin);\n }\n\n /**\n * Apply transform t to point p\n * @param {TMat2D} t The transform\n * @param {Boolean} [ignoreOffset] Indicates that the offset should not be applied\n * @return {Point} The transformed point\n */\n transform(t: TMat2D, ignoreOffset = false): Point {\n return new Point(\n t[0] * this.x + t[2] * this.y + (ignoreOffset ? 0 : t[4]),\n t[1] * this.x + t[3] * this.y + (ignoreOffset ? 0 : t[5]),\n );\n }\n}\n\nexport const ZERO = new Point(0, 0);\n","import type { Constructor, TBBox } from './typedefs';\nimport { removeFromArray } from './util/internals/removeFromArray';\nimport { Point } from './Point';\nimport type { ActiveSelection } from './shapes/ActiveSelection';\nimport type { Group } from './shapes/Group';\nimport type { InteractiveFabricObject } from './shapes/Object/InteractiveObject';\nimport type { FabricObject } from './shapes/Object/FabricObject';\n\nexport const isCollection = (\n fabricObject?: FabricObject,\n): fabricObject is Group | ActiveSelection => {\n return !!fabricObject && Array.isArray((fabricObject as Group)._objects);\n};\n\nexport function createCollectionMixin(Base: TBase) {\n class Collection extends Base {\n /**\n * @type {FabricObject[]}\n * @TODO needs to end up in the constructor too\n */\n _objects: FabricObject[] = [];\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n _onObjectAdded(object: FabricObject) {\n // subclasses should override this method\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n _onObjectRemoved(object: FabricObject) {\n // subclasses should override this method\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n _onStackOrderChanged(object: FabricObject) {\n // subclasses should override this method\n }\n\n /**\n * Adds objects to collection\n * Objects should be instances of (or inherit from) FabricObject\n * @param {...FabricObject[]} objects to add\n * @returns {number} new array length\n */\n add(...objects: FabricObject[]): number {\n const size = this._objects.push(...objects);\n objects.forEach((object) => this._onObjectAdded(object));\n return size;\n }\n\n /**\n * Inserts an object into collection at specified index\n * @param {number} index Index to insert object at\n * @param {...FabricObject[]} objects Object(s) to insert\n * @returns {number} new array length\n */\n insertAt(index: number, ...objects: FabricObject[]) {\n this._objects.splice(index, 0, ...objects);\n objects.forEach((object) => this._onObjectAdded(object));\n return this._objects.length;\n }\n\n /**\n * Removes objects from a collection, then renders canvas (if `renderOnAddRemove` is not `false`)\n * @private\n * @param {...FabricObject[]} objects objects to remove\n * @returns {FabricObject[]} removed objects\n */\n remove(...objects: FabricObject[]) {\n const array = this._objects,\n removed: FabricObject[] = [];\n objects.forEach((object) => {\n const index = array.indexOf(object);\n // only call onObjectRemoved if an object was actually removed\n if (index !== -1) {\n array.splice(index, 1);\n removed.push(object);\n this._onObjectRemoved(object);\n }\n });\n return removed;\n }\n\n /**\n * Executes given function for each object in this group\n * A simple shortcut for getObjects().forEach, before es6 was more complicated,\n * now is just a shortcut.\n * @param {Function} callback\n * Callback invoked with current object as first argument,\n * index - as second and an array of all objects - as third.\n */\n forEachObject(\n callback: (\n object: FabricObject,\n index: number,\n array: FabricObject[],\n ) => any,\n ) {\n this.getObjects().forEach((object, index, objects) =>\n callback(object, index, objects),\n );\n }\n\n /**\n * Returns an array of children objects of this instance\n * @param {...String} [types] When specified, only objects of these types are returned\n * @return {Array}\n */\n getObjects(...types: string[]) {\n if (types.length === 0) {\n return [...this._objects];\n }\n return this._objects.filter((o) => o.isType(...types));\n }\n\n /**\n * Returns object at specified index\n * @param {Number} index\n * @return {Object} object at index\n */\n item(index: number) {\n return this._objects[index];\n }\n\n /**\n * Returns true if collection contains no objects\n * @return {Boolean} true if collection is empty\n */\n isEmpty() {\n return this._objects.length === 0;\n }\n\n /**\n * Returns a size of a collection (i.e: length of an array containing its objects)\n * @return {Number} Collection size\n */\n size() {\n return this._objects.length;\n }\n\n /**\n * Returns true if collection contains an object.\\\n * **Prefer using {@link FabricObject#isDescendantOf} for performance reasons**\n * instead of `a.contains(b)` use `b.isDescendantOf(a)`\n * @param {Object} object Object to check against\n * @param {Boolean} [deep=false] `true` to check all descendants, `false` to check only `_objects`\n * @return {Boolean} `true` if collection contains an object\n */\n contains(object: FabricObject, deep?: boolean): boolean {\n if (this._objects.includes(object)) {\n return true;\n } else if (deep) {\n return this._objects.some(\n (obj) =>\n obj instanceof Collection &&\n (obj as unknown as Collection).contains(object, true),\n );\n }\n return false;\n }\n\n /**\n * Returns number representation of a collection complexity\n * @return {Number} complexity\n */\n complexity() {\n return this._objects.reduce((memo, current) => {\n memo += current.complexity ? current.complexity() : 0;\n return memo;\n }, 0);\n }\n\n /**\n * Moves an object or the objects of a multiple selection\n * to the bottom of the stack of drawn objects\n * @param {fabric.Object} object Object to send to back\n * @returns {boolean} true if change occurred\n */\n sendObjectToBack(object: FabricObject) {\n if (!object || object === this._objects[0]) {\n return false;\n }\n removeFromArray(this._objects, object);\n this._objects.unshift(object);\n this._onStackOrderChanged(object);\n return true;\n }\n\n /**\n * Moves an object or the objects of a multiple selection\n * to the top of the stack of drawn objects\n * @param {fabric.Object} object Object to send\n * @returns {boolean} true if change occurred\n */\n bringObjectToFront(object: FabricObject) {\n if (!object || object === this._objects[this._objects.length - 1]) {\n return false;\n }\n removeFromArray(this._objects, object);\n this._objects.push(object);\n this._onStackOrderChanged(object);\n return true;\n }\n\n /**\n * Moves an object or a selection down in stack of drawn objects\n * An optional parameter, `intersecting` allows to move the object in behind\n * the first intersecting object. Where intersection is calculated with\n * bounding box. If no intersection is found, there will not be change in the\n * stack.\n * @param {fabric.Object} object Object to send\n * @param {boolean} [intersecting] If `true`, send object behind next lower intersecting object\n * @returns {boolean} true if change occurred\n */\n sendObjectBackwards(object: FabricObject, intersecting?: boolean) {\n if (!object) {\n return false;\n }\n const idx = this._objects.indexOf(object);\n if (idx !== 0) {\n // if object is not on the bottom of stack\n const newIdx = this.findNewLowerIndex(object, idx, intersecting);\n removeFromArray(this._objects, object);\n this._objects.splice(newIdx, 0, object);\n this._onStackOrderChanged(object);\n return true;\n }\n return false;\n }\n\n /**\n * Moves an object or a selection up in stack of drawn objects\n * An optional parameter, intersecting allows to move the object in front\n * of the first intersecting object. Where intersection is calculated with\n * bounding box. If no intersection is found, there will not be change in the\n * stack.\n * @param {fabric.Object} object Object to send\n * @param {boolean} [intersecting] If `true`, send object in front of next upper intersecting object\n * @returns {boolean} true if change occurred\n */\n bringObjectForward(object: FabricObject, intersecting?: boolean) {\n if (!object) {\n return false;\n }\n const idx = this._objects.indexOf(object);\n if (idx !== this._objects.length - 1) {\n // if object is not on top of stack (last item in an array)\n const newIdx = this.findNewUpperIndex(object, idx, intersecting);\n removeFromArray(this._objects, object);\n this._objects.splice(newIdx, 0, object);\n this._onStackOrderChanged(object);\n return true;\n }\n return false;\n }\n\n /**\n * Moves an object to specified level in stack of drawn objects\n * @param {fabric.Object} object Object to send\n * @param {number} index Position to move to\n * @returns {boolean} true if change occurred\n */\n moveObjectTo(object: FabricObject, index: number) {\n if (object === this._objects[index]) {\n return false;\n }\n removeFromArray(this._objects, object);\n this._objects.splice(index, 0, object);\n this._onStackOrderChanged(object);\n return true;\n }\n\n findNewLowerIndex(\n object: FabricObject,\n idx: number,\n intersecting?: boolean,\n ) {\n let newIdx;\n\n if (intersecting) {\n newIdx = idx;\n // traverse down the stack looking for the nearest intersecting object\n for (let i = idx - 1; i >= 0; --i) {\n if (object.isOverlapping(this._objects[i])) {\n newIdx = i;\n break;\n }\n }\n } else {\n newIdx = idx - 1;\n }\n\n return newIdx;\n }\n\n findNewUpperIndex(\n object: FabricObject,\n idx: number,\n intersecting?: boolean,\n ) {\n let newIdx;\n\n if (intersecting) {\n newIdx = idx;\n // traverse up the stack looking for the nearest intersecting object\n for (let i = idx + 1; i < this._objects.length; ++i) {\n if (object.isOverlapping(this._objects[i])) {\n newIdx = i;\n break;\n }\n }\n } else {\n newIdx = idx + 1;\n }\n\n return newIdx;\n }\n\n /**\n * Given a bounding box, return all the objects of the collection that are contained in the bounding box.\n * If `includeIntersecting` is true, return also the objects that intersect the bounding box as well.\n * This is meant to work with selection. Is not a generic method.\n * @param {TBBox} bbox a bounding box in scene coordinates\n * @param {{ includeIntersecting?: boolean }} options an object with includeIntersecting\n * @returns array of objects contained in the bounding box, ordered from top to bottom stacking wise\n */\n collectObjects(\n { left, top, width, height }: TBBox,\n { includeIntersecting = true }: { includeIntersecting?: boolean } = {},\n ) {\n const objects: InteractiveFabricObject[] = [],\n tl = new Point(left, top),\n br = tl.add(new Point(width, height));\n\n // we iterate reverse order to collect top first in case of click.\n for (let i = this._objects.length - 1; i >= 0; i--) {\n const object = this._objects[i] as unknown as InteractiveFabricObject;\n if (\n object.selectable &&\n object.visible &&\n ((includeIntersecting && object.intersectsWithRect(tl, br)) ||\n object.isContainedWithinRect(tl, br) ||\n (includeIntersecting && object.containsPoint(tl)) ||\n (includeIntersecting && object.containsPoint(br)))\n ) {\n objects.push(object);\n }\n }\n\n return objects;\n }\n }\n\n // https://github.com/microsoft/TypeScript/issues/32080\n return Collection;\n}\n","import { Observable } from './Observable';\n\nexport class CommonMethods extends Observable {\n /**\n * Sets object's properties from options, for initialization only\n * @protected\n * @param {Object} [options] Options object\n */\n protected _setOptions(options: any = {}) {\n for (const prop in options) {\n this.set(prop, options[prop]);\n }\n }\n\n /**\n * @private\n */\n _setObject(obj: Record) {\n for (const prop in obj) {\n this._set(prop, obj[prop]);\n }\n }\n\n /**\n * Sets property to a given value. When changing position/dimension -related properties (left, top, scale, angle, etc.) `set` does not update position of object's borders/controls. If you need to update those, call `setCoords()`.\n * @param {String|Object} key Property name or object (if object, iterate over the object properties)\n * @param {Object|Function} value Property value (if function, the value is passed into it and its return value is used as a new one)\n */\n set(key: string | Record, value?: any) {\n if (typeof key === 'object') {\n this._setObject(key);\n } else {\n this._set(key, value);\n }\n return this;\n }\n\n _set(key: string, value: any) {\n this[key as keyof this] = value;\n }\n\n /**\n * Toggles specified property from `true` to `false` or from `false` to `true`\n * @param {String} property Property to toggle\n */\n toggle(property: string) {\n const value = this.get(property);\n if (typeof value === 'boolean') {\n this.set(property, !value);\n }\n return this;\n }\n\n /**\n * Basic getter\n * @param {String} property Property name\n * @return {*} value of a property\n */\n get(property: string): any {\n return this[property as keyof this];\n }\n}\n","import { getFabricWindow } from '../../env';\n\nexport function requestAnimFrame(callback: FrameRequestCallback): number {\n return getFabricWindow().requestAnimationFrame(callback);\n}\n\nexport function cancelAnimFrame(handle: number): void {\n return getFabricWindow().cancelAnimationFrame(handle);\n}\n","let id = 0;\n\nexport const uid = () => id++;\n","import { getFabricDocument } from '../../env';\nimport type { ImageFormat, TSize } from '../../typedefs';\nimport { FabricError } from '../internals/console';\n/**\n * Creates canvas element\n * @return {CanvasElement} initialized canvas element\n */\nexport const createCanvasElement = (): HTMLCanvasElement => {\n const element = getFabricDocument().createElement('canvas');\n if (!element || typeof element.getContext === 'undefined') {\n throw new FabricError('Failed to create `canvas` element');\n }\n return element;\n};\n\n/**\n * Creates image element (works on client and node)\n * @return {HTMLImageElement} HTML image element\n */\nexport const createImage = (): HTMLImageElement =>\n getFabricDocument().createElement('img');\n\n/**\n * Creates a canvas element that is a copy of another and is also painted\n * @param {CanvasElement} canvas to copy size and content of\n * @return {CanvasElement} initialized canvas element\n */\nexport const copyCanvasElement = (\n canvas: HTMLCanvasElement,\n): HTMLCanvasElement => {\n const newCanvas = createCanvasElementFor(canvas);\n newCanvas.getContext('2d')?.drawImage(canvas, 0, 0);\n return newCanvas;\n};\n\n/**\n * Creates a canvas element as big as another\n * @param {CanvasElement} canvas to copy size and content of\n * @return {CanvasElement} initialized canvas element\n */\nexport const createCanvasElementFor = (\n canvas: HTMLCanvasElement | ImageData | HTMLImageElement | TSize,\n): HTMLCanvasElement => {\n const newCanvas = createCanvasElement();\n newCanvas.width = canvas.width;\n newCanvas.height = canvas.height;\n return newCanvas;\n};\n\n/**\n * since 2.6.0 moved from canvas instance to utility.\n * possibly useless\n * @param {CanvasElement} canvasEl to copy size and content of\n * @param {String} format 'jpeg' or 'png', in some browsers 'webp' is ok too\n * @param {number} quality <= 1 and > 0\n * @return {String} data url\n */\nexport const toDataURL = (\n canvasEl: HTMLCanvasElement,\n format: ImageFormat,\n quality: number,\n) => canvasEl.toDataURL(`image/${format}`, quality);\n\nexport const isHTMLCanvas = (\n canvas?: HTMLCanvasElement | string,\n): canvas is HTMLCanvasElement => {\n return !!canvas && (canvas as HTMLCanvasElement).getContext !== undefined;\n};\n\nexport const toBlob = (\n canvasEl: HTMLCanvasElement,\n format?: ImageFormat,\n quality?: number,\n): Promise =>\n new Promise((resolve, _) => {\n canvasEl.toBlob(resolve, `image/${format}`, quality);\n });\n","import type { TRadian, TDegree } from '../../typedefs';\nimport { PiBy180 } from '../../constants';\n\n/**\n * Transforms degrees to radians.\n * @param {TDegree} degrees value in degrees\n * @return {TRadian} value in radians\n */\nexport const degreesToRadians = (degrees: TDegree): TRadian =>\n (degrees * PiBy180) as TRadian;\n\n/**\n * Transforms radians to degrees.\n * @param {TRadian} radians value in radians\n * @return {TDegree} value in degrees\n */\nexport const radiansToDegrees = (radians: TRadian): TDegree =>\n (radians / PiBy180) as TDegree;\n","import { iMatrix } from '../../constants';\nimport type { XY } from '../../Point';\nimport { Point } from '../../Point';\nimport type { TDegree, TRadian, TMat2D } from '../../typedefs';\nimport { cos } from './cos';\nimport { degreesToRadians, radiansToDegrees } from './radiansDegreesConversion';\nimport { sin } from './sin';\n\nexport type TRotateMatrixArgs = {\n angle?: TDegree;\n};\n\nexport type TTranslateMatrixArgs = {\n translateX?: number;\n translateY?: number;\n};\n\nexport type TScaleMatrixArgs = {\n scaleX?: number;\n scaleY?: number;\n flipX?: boolean;\n flipY?: boolean;\n skewX?: TDegree;\n skewY?: TDegree;\n};\n\nexport type TComposeMatrixArgs = TTranslateMatrixArgs &\n TRotateMatrixArgs &\n TScaleMatrixArgs;\n\nexport type TQrDecomposeOut = Required<\n Omit\n>;\n\nexport const isIdentityMatrix = (mat: TMat2D) =>\n mat.every((value, index) => value === iMatrix[index]);\n\n/**\n * Apply transform t to point p\n * @deprecated use {@link Point#transform}\n * @param {Point | XY} p The point to transform\n * @param {Array} t The transform\n * @param {Boolean} [ignoreOffset] Indicates that the offset should not be applied\n * @return {Point} The transformed point\n */\nexport const transformPoint = (\n p: XY,\n t: TMat2D,\n ignoreOffset?: boolean,\n): Point => new Point(p).transform(t, ignoreOffset);\n\n/**\n * Invert transformation t\n * @param {Array} t The transform\n * @return {Array} The inverted transform\n */\nexport const invertTransform = (t: TMat2D): TMat2D => {\n const a = 1 / (t[0] * t[3] - t[1] * t[2]),\n r = [a * t[3], -a * t[1], -a * t[2], a * t[0], 0, 0] as TMat2D,\n { x, y } = new Point(t[4], t[5]).transform(r, true);\n r[4] = -x;\n r[5] = -y;\n return r;\n};\n\n/**\n * Multiply matrix A by matrix B to nest transformations\n * @param {TMat2D} a First transformMatrix\n * @param {TMat2D} b Second transformMatrix\n * @param {Boolean} is2x2 flag to multiply matrices as 2x2 matrices\n * @return {TMat2D} The product of the two transform matrices\n */\nexport const multiplyTransformMatrices = (\n a: TMat2D,\n b: TMat2D,\n is2x2?: boolean,\n): TMat2D =>\n [\n a[0] * b[0] + a[2] * b[1],\n a[1] * b[0] + a[3] * b[1],\n a[0] * b[2] + a[2] * b[3],\n a[1] * b[2] + a[3] * b[3],\n is2x2 ? 0 : a[0] * b[4] + a[2] * b[5] + a[4],\n is2x2 ? 0 : a[1] * b[4] + a[3] * b[5] + a[5],\n ] as TMat2D;\n\n/**\n * Multiplies {@link matrices} such that a matrix defines the plane for the rest of the matrices **after** it\n *\n * `multiplyTransformMatrixArray([A, B, C, D])` is equivalent to `A(B(C(D)))`\n *\n * @param matrices an array of matrices\n * @param [is2x2] flag to multiply matrices as 2x2 matrices\n * @returns the multiplication product\n */\nexport const multiplyTransformMatrixArray = (\n matrices: (TMat2D | undefined | null | false)[],\n is2x2?: boolean,\n) =>\n matrices.reduceRight(\n (product: TMat2D, curr) =>\n curr && product\n ? multiplyTransformMatrices(curr, product, is2x2)\n : curr || product,\n undefined as unknown as TMat2D,\n ) || iMatrix.concat();\n\nexport const calcPlaneRotation = ([a, b]: TMat2D) =>\n Math.atan2(b, a) as TRadian;\n\n/**\n * Decomposes standard 2x3 matrix into transform components\n * @param {TMat2D} a transformMatrix\n * @return {Object} Components of transform\n */\nexport const qrDecompose = (a: TMat2D): TQrDecomposeOut => {\n const angle = calcPlaneRotation(a),\n denom = Math.pow(a[0], 2) + Math.pow(a[1], 2),\n scaleX = Math.sqrt(denom),\n scaleY = (a[0] * a[3] - a[2] * a[1]) / scaleX,\n skewX = Math.atan2(a[0] * a[2] + a[1] * a[3], denom);\n return {\n angle: radiansToDegrees(angle),\n scaleX,\n scaleY,\n skewX: radiansToDegrees(skewX),\n skewY: 0 as TDegree,\n translateX: a[4] || 0,\n translateY: a[5] || 0,\n };\n};\n\n/**\n * Generate a translation matrix\n *\n * A translation matrix in the form of\n * [ 1 0 x ]\n * [ 0 1 y ]\n * [ 0 0 1 ]\n *\n * See @link https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/transform#translate for more details\n *\n * @param {number} x translation on X axis\n * @param {number} [y] translation on Y axis\n * @returns {TMat2D} matrix\n */\nexport const createTranslateMatrix = (x: number, y = 0): TMat2D => [\n 1,\n 0,\n 0,\n 1,\n x,\n y,\n];\n\n/**\n * Generate a rotation matrix around around a point (x,y), defaulting to (0,0)\n *\n * A matrix in the form of\n * [cos(a) -sin(a) -x*cos(a)+y*sin(a)+x]\n * [sin(a) cos(a) -x*sin(a)-y*cos(a)+y]\n * [0 0 1 ]\n *\n *\n * @param {TDegree} angle rotation in degrees\n * @param {XY} [pivotPoint] pivot point to rotate around\n * @returns {TMat2D} matrix\n */\nexport function createRotateMatrix(\n { angle = 0 }: TRotateMatrixArgs = {},\n { x = 0, y = 0 }: Partial = {},\n): TMat2D {\n const angleRadiant = degreesToRadians(angle),\n cosValue = cos(angleRadiant),\n sinValue = sin(angleRadiant);\n return [\n cosValue,\n sinValue,\n -sinValue,\n cosValue,\n x ? x - (cosValue * x - sinValue * y) : 0,\n y ? y - (sinValue * x + cosValue * y) : 0,\n ];\n}\n\n/**\n * Generate a scale matrix around the point (0,0)\n *\n * A matrix in the form of\n * [x 0 0]\n * [0 y 0]\n * [0 0 1]\n *\n * @link https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/transform#scale\n *\n * @param {number} x scale on X axis\n * @param {number} [y] scale on Y axis\n * @returns {TMat2D} matrix\n */\nexport const createScaleMatrix = (x: number, y: number = x): TMat2D => [\n x,\n 0,\n 0,\n y,\n 0,\n 0,\n];\n\nexport const angleToSkew = (angle: TDegree) =>\n Math.tan(degreesToRadians(angle));\n\nexport const skewToAngle = (value: TRadian) =>\n radiansToDegrees(Math.atan(value));\n\n/**\n * Generate a skew matrix for the X axis\n *\n * A matrix in the form of\n * [1 x 0]\n * [0 1 0]\n * [0 0 1]\n *\n * @link https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/transform#skewx\n *\n * @param {TDegree} skewValue translation on X axis\n * @returns {TMat2D} matrix\n */\nexport const createSkewXMatrix = (skewValue: TDegree): TMat2D => [\n 1,\n 0,\n angleToSkew(skewValue),\n 1,\n 0,\n 0,\n];\n\n/**\n * Generate a skew matrix for the Y axis\n *\n * A matrix in the form of\n * [1 0 0]\n * [y 1 0]\n * [0 0 1]\n *\n * @link https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/transform#skewy\n *\n * @param {TDegree} skewValue translation on Y axis\n * @returns {TMat2D} matrix\n */\nexport const createSkewYMatrix = (skewValue: TDegree): TMat2D => [\n 1,\n angleToSkew(skewValue),\n 0,\n 1,\n 0,\n 0,\n];\n\n/**\n * Returns a transform matrix starting from an object of the same kind of\n * the one returned from qrDecompose, useful also if you want to calculate some\n * transformations from an object that is not enlived yet.\n * is called DimensionsTransformMatrix because those properties are the one that influence\n * the size of the resulting box of the object.\n * @param {Object} options\n * @param {Number} [options.scaleX]\n * @param {Number} [options.scaleY]\n * @param {Boolean} [options.flipX]\n * @param {Boolean} [options.flipY]\n * @param {Number} [options.skewX]\n * @param {Number} [options.skewY]\n * @return {Number[]} transform matrix\n */\nexport const calcDimensionsMatrix = ({\n scaleX = 1,\n scaleY = 1,\n flipX = false,\n flipY = false,\n skewX = 0 as TDegree,\n skewY = 0 as TDegree,\n}: TScaleMatrixArgs) => {\n let matrix = createScaleMatrix(\n flipX ? -scaleX : scaleX,\n flipY ? -scaleY : scaleY,\n );\n if (skewX) {\n matrix = multiplyTransformMatrices(matrix, createSkewXMatrix(skewX), true);\n }\n if (skewY) {\n matrix = multiplyTransformMatrices(matrix, createSkewYMatrix(skewY), true);\n }\n return matrix;\n};\n\n/**\n * Returns a transform matrix starting from an object of the same kind of\n * the one returned from qrDecompose, useful also if you want to calculate some\n * transformations from an object that is not enlived yet\n * Before changing this function look at: src/benchmarks/calcTransformMatrix.mjs\n * @param {Object} options\n * @param {Number} [options.angle]\n * @param {Number} [options.scaleX]\n * @param {Number} [options.scaleY]\n * @param {Boolean} [options.flipX]\n * @param {Boolean} [options.flipY]\n * @param {Number} [options.skewX]\n * @param {Number} [options.skewY]\n * @param {Number} [options.translateX]\n * @param {Number} [options.translateY]\n * @return {Number[]} transform matrix\n */\nexport const composeMatrix = (options: TComposeMatrixArgs): TMat2D => {\n const { translateX = 0, translateY = 0, angle = 0 as TDegree } = options;\n let matrix = createTranslateMatrix(translateX, translateY);\n if (angle) {\n matrix = multiplyTransformMatrices(matrix, createRotateMatrix({ angle }));\n }\n const scaleMatrix = calcDimensionsMatrix(options);\n if (!isIdentityMatrix(scaleMatrix)) {\n matrix = multiplyTransformMatrices(matrix, scaleMatrix);\n }\n return matrix;\n};\n","import { noop } from '../../constants';\nimport type { FabricObject } from '../../shapes/Object/FabricObject';\nimport type {\n Abortable,\n Constructor,\n TCrossOrigin,\n TFiller,\n} from '../../typedefs';\nimport { createImage } from './dom';\nimport { classRegistry } from '../../ClassRegistry';\nimport type { BaseFilter } from '../../filters/BaseFilter';\nimport type { FabricObject as BaseFabricObject } from '../../shapes/Object/Object';\nimport { FabricError, SignalAbortedError } from '../internals/console';\nimport type { Shadow } from '../../Shadow';\n\nexport type LoadImageOptions = Abortable & {\n /**\n * cors value for the image loading, default to anonymous\n */\n crossOrigin?: TCrossOrigin;\n};\n\n/**\n * Loads image element from given url and resolve it, or catch.\n * @param {String} url URL representing an image\n * @param {LoadImageOptions} [options] image loading options\n * @returns {Promise} the loaded image.\n */\nexport const loadImage = (\n url: string,\n { signal, crossOrigin = null }: LoadImageOptions = {},\n) =>\n new Promise(function (resolve, reject) {\n if (signal && signal.aborted) {\n return reject(new SignalAbortedError('loadImage'));\n }\n const img = createImage();\n let abort: EventListenerOrEventListenerObject;\n if (signal) {\n abort = function (err: Event) {\n img.src = '';\n reject(err);\n };\n signal.addEventListener('abort', abort, { once: true });\n }\n const done = function () {\n img.onload = img.onerror = null;\n abort && signal?.removeEventListener('abort', abort);\n resolve(img);\n };\n if (!url) {\n done();\n return;\n }\n img.onload = done;\n img.onerror = function () {\n abort && signal?.removeEventListener('abort', abort);\n reject(new FabricError(`Error loading ${img.src}`));\n };\n crossOrigin && (img.crossOrigin = crossOrigin);\n img.src = url;\n });\n\nexport type EnlivenObjectOptions = Abortable & {\n /**\n * Method for further parsing of object elements,\n * called after each fabric object created.\n */\n reviver?: <\n T extends\n | BaseFabricObject\n | FabricObject\n | BaseFilter\n | Shadow\n | TFiller,\n >(\n serializedObj: Record,\n instance: T,\n ) => void;\n};\n\n/**\n * @TODO type this correctly.\n * Creates corresponding fabric instances from their object representations\n * @param {Object[]} objects Objects to enliven\n * @param {EnlivenObjectOptions} [options]\n * @param {(serializedObj: object, instance: FabricObject) => any} [options.reviver] Method for further parsing of object elements,\n * called after each fabric object created.\n * @param {AbortSignal} [options.signal] handle aborting, see https://developer.mozilla.org/en-US/docs/Web/API/AbortController/signal\n * @returns {Promise}\n */\nexport const enlivenObjects = <\n T extends\n | BaseFabricObject\n | FabricObject\n | BaseFilter\n | Shadow\n | TFiller,\n>(\n objects: any[],\n { signal, reviver = noop }: EnlivenObjectOptions = {},\n) =>\n new Promise((resolve, reject) => {\n const instances: T[] = [];\n signal && signal.addEventListener('abort', reject, { once: true });\n Promise.all(\n objects.map((obj) =>\n classRegistry\n .getClass<\n Constructor & {\n fromObject(options: any, context: Abortable): Promise;\n }\n >(obj.type)\n .fromObject(obj, { signal })\n .then((fabricInstance) => {\n reviver(obj, fabricInstance);\n instances.push(fabricInstance);\n return fabricInstance;\n }),\n ),\n )\n .then(resolve)\n .catch((error) => {\n // cleanup\n instances.forEach((instance) => {\n (instance as FabricObject).dispose &&\n (instance as FabricObject).dispose();\n });\n reject(error);\n })\n .finally(() => {\n signal && signal.removeEventListener('abort', reject);\n });\n });\n\n/**\n * Creates corresponding fabric instances residing in an object, e.g. `clipPath`\n * @param {Object} object with properties to enlive ( fill, stroke, clipPath, path )\n * @param {object} [options]\n * @param {AbortSignal} [options.signal] handle aborting, see https://developer.mozilla.org/en-US/docs/Web/API/AbortController/signal\n * @returns {Promise>} the input object with enlived values\n */\nexport const enlivenObjectEnlivables = <\n R = Record,\n>(\n serializedObject: any,\n { signal }: Abortable = {},\n) =>\n new Promise((resolve, reject) => {\n const instances: (FabricObject | TFiller | Shadow)[] = [];\n signal && signal.addEventListener('abort', reject, { once: true });\n // enlive every possible property\n const promises = Object.values(serializedObject).map((value: any) => {\n if (!value) {\n return value;\n }\n /**\n * clipPath or shadow or gradient or text on a path or a pattern,\n * or the backgroundImage or overlayImage of canvas\n * If we have a type and there is a classe registered for it, we enlive it.\n * If there is no class registered for it we return the value as is\n * */\n if (value.type && classRegistry.has(value.type)) {\n return enlivenObjects([value], {\n signal,\n }).then(([enlived]) => {\n instances.push(enlived);\n return enlived;\n });\n }\n return value;\n });\n const keys = Object.keys(serializedObject);\n Promise.all(promises)\n .then((enlived) => {\n return enlived.reduce((acc, instance, index) => {\n acc[keys[index]] = instance;\n return acc;\n }, {});\n })\n .then(resolve)\n .catch((error) => {\n // cleanup\n instances.forEach((instance: any) => {\n instance.dispose && instance.dispose();\n });\n reject(error);\n })\n .finally(() => {\n signal && signal.removeEventListener('abort', reject);\n });\n });\n","/**\n * Populates an object with properties of another object\n * @param {Object} source Source object\n * @param {string[]} properties Properties names to include\n * @returns object populated with the picked keys\n */\nexport const pick = >(\n source: T,\n keys: (keyof T)[] = [],\n) => {\n return keys.reduce((o, key) => {\n if (key in source) {\n o[key] = source[key];\n }\n return o;\n }, {} as Partial);\n};\n\nexport const pickBy = >(\n source: T,\n predicate: (value: T[K], key: K, collection: T) => boolean,\n) => {\n return (Object.keys(source) as (keyof T)[]).reduce((o, key) => {\n if (predicate(source[key], key, source)) {\n o[key] = source[key];\n }\n return o;\n }, {} as Partial);\n};\n","/**\n * A wrapper around Number#toFixed, which contrary to native method returns number, not string.\n * @param {number|string} number number to operate on\n * @param {number} fractionDigits number of fraction digits to \"leave\"\n * @return {number}\n */\nexport const toFixed = (number: number | string, fractionDigits: number) =>\n parseFloat(Number(number).toFixed(fractionDigits));\n","import type { TMat2D } from '../../typedefs';\nimport { toFixed } from './toFixed';\nimport { config } from '../../config';\n\n/**\n * given an array of 6 number returns something like `\"matrix(...numbers)\"`\n * @param {TMat2D} transform an array with 6 numbers\n * @return {String} transform matrix for svg\n */\nexport const matrixToSVG = (transform: TMat2D) =>\n 'matrix(' +\n transform\n .map((value) => toFixed(value, config.NUM_FRACTION_DIGITS))\n .join(' ') +\n ')';\n","import type { FabricObject } from '../shapes/Object/Object';\nimport type { TFiller } from '../typedefs';\nimport type { FabricText } from '../shapes/Text/Text';\nimport type { Pattern } from '../Pattern';\nimport type { Path } from '../shapes/Path';\nimport type { ActiveSelection } from '../shapes/ActiveSelection';\n\nexport const isFiller = (\n filler: TFiller | string | null,\n): filler is TFiller => {\n return !!filler && (filler as TFiller).toLive !== undefined;\n};\n\nexport const isSerializableFiller = (\n filler: TFiller | string | null,\n): filler is TFiller => {\n return !!filler && typeof (filler as TFiller).toObject === 'function';\n};\n\nexport const isPattern = (filler: TFiller): filler is Pattern => {\n return (\n !!filler && (filler as Pattern).offsetX !== undefined && 'source' in filler\n );\n};\n\nexport const isTextObject = (\n fabricObject?: FabricObject,\n): fabricObject is FabricText => {\n return (\n !!fabricObject &&\n typeof (fabricObject as FabricText)._renderText === 'function'\n );\n};\n\nexport const isPath = (fabricObject?: FabricObject): fabricObject is Path => {\n // we could use instanceof but that would mean pulling in Text code for a simple check\n // @todo discuss what to do and how to do\n return (\n !!fabricObject &&\n typeof (fabricObject as Path)._renderPathCommands === 'function'\n );\n};\n\nexport const isActiveSelection = (\n fabricObject?: FabricObject,\n): fabricObject is ActiveSelection =>\n !!fabricObject && 'multiSelectionStacking' in fabricObject;\n","/**\n * Returns element scroll offsets\n * @param {HTMLElement} element Element to operate on\n * @return {Object} Object with left/top values\n */\nexport function getScrollLeftTop(element: HTMLElement | null) {\n const doc = element && getDocumentFromElement(element);\n let left = 0,\n top = 0;\n if (!element || !doc) {\n return { left, top };\n }\n let elementLoop: HTMLElement | Document | ShadowRoot = element;\n const docElement = doc.documentElement,\n body = doc.body || {\n scrollLeft: 0,\n scrollTop: 0,\n };\n // While loop checks (and then sets element to) .parentNode OR .host\n // to account for ShadowDOM. We still want to traverse up out of ShadowDOM,\n // but the .parentNode of a root ShadowDOM node will always be null, instead\n // it should be accessed through .host. See http://stackoverflow.com/a/24765528/4383938\n while (\n elementLoop &&\n (elementLoop.parentNode || (elementLoop as unknown as ShadowRoot).host)\n ) {\n elementLoop = (elementLoop.parentNode ||\n (elementLoop as unknown as ShadowRoot).host) as\n | HTMLElement\n | Document\n | ShadowRoot;\n if (elementLoop === doc) {\n left = body.scrollLeft || docElement.scrollLeft || 0;\n top = body.scrollTop || docElement.scrollTop || 0;\n } else {\n left += (elementLoop as HTMLElement).scrollLeft || 0;\n top += (elementLoop as HTMLElement).scrollTop || 0;\n }\n\n if (\n elementLoop.nodeType === 1 &&\n (elementLoop as HTMLElement).style.position === 'fixed'\n ) {\n break;\n }\n }\n\n return { left, top };\n}\n\nexport const getDocumentFromElement = (el: HTMLElement) =>\n el.ownerDocument || null;\n\nexport const getWindowFromElement = (el: HTMLElement) =>\n el.ownerDocument?.defaultView || null;\n","import { NONE } from '../../constants';\nimport type { TSize } from '../../typedefs';\nimport {\n getDocumentFromElement,\n getWindowFromElement,\n getScrollLeftTop,\n} from '../../util/dom_misc';\n\nexport const setCanvasDimensions = (\n el: HTMLCanvasElement,\n ctx: CanvasRenderingContext2D,\n { width, height }: TSize,\n retinaScaling = 1,\n) => {\n el.width = width;\n el.height = height;\n if (retinaScaling > 1) {\n el.setAttribute('width', (width * retinaScaling).toString());\n el.setAttribute('height', (height * retinaScaling).toString());\n ctx.scale(retinaScaling, retinaScaling);\n }\n};\n\nexport type CSSDimensions = {\n width: number | string;\n height: number | string;\n};\n\nexport const setCSSDimensions = (\n el: HTMLElement,\n { width, height }: Partial,\n) => {\n width && (el.style.width = typeof width === 'number' ? `${width}px` : width);\n height &&\n (el.style.height = typeof height === 'number' ? `${height}px` : height);\n};\n\n/**\n * Returns offset for a given element\n * @param {HTMLElement} element Element to get offset for\n * @return {Object} Object with \"left\" and \"top\" properties\n */\nexport function getElementOffset(element: HTMLElement) {\n const doc = element && getDocumentFromElement(element),\n offset = { left: 0, top: 0 };\n\n if (!doc) {\n return offset;\n }\n const elemStyle: CSSStyleDeclaration =\n getWindowFromElement(element)?.getComputedStyle(element, null) ||\n ({} as CSSStyleDeclaration);\n offset.left += parseInt(elemStyle.borderLeftWidth, 10) || 0;\n offset.top += parseInt(elemStyle.borderTopWidth, 10) || 0;\n offset.left += parseInt(elemStyle.paddingLeft, 10) || 0;\n offset.top += parseInt(elemStyle.paddingTop, 10) || 0;\n\n let box = { left: 0, top: 0 };\n\n const docElem = doc.documentElement;\n if (typeof element.getBoundingClientRect !== 'undefined') {\n box = element.getBoundingClientRect();\n }\n\n const scrollLeftTop = getScrollLeftTop(element);\n\n return {\n left:\n box.left + scrollLeftTop.left - (docElem.clientLeft || 0) + offset.left,\n top: box.top + scrollLeftTop.top - (docElem.clientTop || 0) + offset.top,\n };\n}\n\n/**\n * Makes element unselectable\n * @param {HTMLElement} element Element to make unselectable\n * @return {HTMLElement} Element that was passed in\n */\nexport function makeElementUnselectable(element: HTMLElement) {\n if (typeof element.onselectstart !== 'undefined') {\n element.onselectstart = () => false;\n }\n element.style.userSelect = NONE;\n return element;\n}\n","import { getEnv, getFabricDocument } from '../../env';\nimport type { TSize } from '../../typedefs';\nimport type { CSSDimensions } from './util';\nimport { setCSSDimensions, getElementOffset } from './util';\nimport { createCanvasElement, isHTMLCanvas } from '../../util/misc/dom';\nimport { setCanvasDimensions } from './util';\nimport { FabricError } from '../../util/internals/console';\n\nexport type CanvasItem = {\n el: HTMLCanvasElement;\n ctx: CanvasRenderingContext2D;\n};\n\nexport class StaticCanvasDOMManager {\n /**\n * Keeps a copy of the canvas style before setting retina scaling and other potions\n * in order to return it to original state on dispose\n * @type string\n */\n private _originalCanvasStyle?: string;\n\n lower: CanvasItem;\n\n constructor(arg0?: string | HTMLCanvasElement) {\n const el = this.createLowerCanvas(arg0);\n this.lower = { el, ctx: el.getContext('2d')! };\n }\n\n protected createLowerCanvas(arg0?: HTMLCanvasElement | string) {\n // canvasEl === 'HTMLCanvasElement' does not work on jsdom/node\n const el = isHTMLCanvas(arg0)\n ? arg0\n : (arg0 &&\n (getFabricDocument().getElementById(arg0) as HTMLCanvasElement)) ||\n createCanvasElement();\n if (el.hasAttribute('data-fabric')) {\n throw new FabricError(\n 'Trying to initialize a canvas that has already been initialized. Did you forget to dispose the canvas?',\n );\n }\n this._originalCanvasStyle = el.style.cssText;\n el.setAttribute('data-fabric', 'main');\n el.classList.add('lower-canvas');\n return el;\n }\n\n cleanupDOM({ width, height }: TSize) {\n const { el } = this.lower;\n // restore canvas style and attributes\n el.classList.remove('lower-canvas');\n el.removeAttribute('data-fabric');\n // restore canvas size to original size in case retina scaling was applied\n el.setAttribute('width', `${width}`);\n el.setAttribute('height', `${height}`);\n el.style.cssText = this._originalCanvasStyle || '';\n this._originalCanvasStyle = undefined;\n }\n\n setDimensions(size: TSize, retinaScaling: number) {\n const { el, ctx } = this.lower;\n setCanvasDimensions(el, ctx, size, retinaScaling);\n }\n\n setCSSDimensions(size: Partial) {\n setCSSDimensions(this.lower.el, size);\n }\n\n /**\n * Calculates canvas element offset relative to the document\n */\n calcOffset() {\n return getElementOffset(this.lower.el);\n }\n\n dispose() {\n getEnv().dispose(this.lower.el);\n // @ts-expect-error disposing\n delete this.lower;\n }\n}\n","import { iMatrix } from '../constants';\nimport type { FabricObject } from '../shapes/Object/FabricObject';\nimport type { TFiller, TMat2D, TOptions } from '../typedefs';\n\ninterface CanvasDrawableOptions {\n /**\n * if set to false background image is not affected by viewport transform\n * @since 1.6.3\n * @type Boolean\n * @todo we should really find a different way to do this\n */\n backgroundVpt: boolean;\n\n /**\n * Background color of canvas instance.\n * @type {(String|TFiller)}\n */\n backgroundColor: TFiller | string;\n\n /**\n * Background image of canvas instance.\n * since 2.4.0 image caching is active, please when putting an image as background, add to the\n * canvas property a reference to the canvas it is on. Otherwise the image cannot detect the zoom\n * vale. As an alternative you can disable image objectCaching\n * @type FabricObject\n */\n backgroundImage?: FabricObject;\n\n /**\n * if set to false overlay image is not affected by viewport transform\n * @since 1.6.3\n * @type Boolean\n * @todo we should really find a different way to do this\n */\n overlayVpt: boolean;\n\n /**\n * Overlay color of canvas instance.\n * @since 1.3.9\n * @type {(String|TFiller)}\n */\n overlayColor: TFiller | string;\n\n /**\n * Overlay image of canvas instance.\n * since 2.4.0 image caching is active, please when putting an image as overlay, add to the\n * canvas property a reference to the canvas it is on. Otherwise the image cannot detect the zoom\n * vale. As an alternative you can disable image objectCaching\n * @type FabricObject\n */\n overlayImage?: FabricObject;\n}\n\ninterface CanvasRenderingOptions {\n /**\n * Indicates whether {@link StaticCanvas#add}, {@link StaticCanvas#insertAt} and {@link StaticCanvas#remove},\n * {@link StaticCanvas#moveTo}, {@link StaticCanvas#clear} and many more, should also re-render canvas.\n * Disabling this option will not give a performance boost when adding/removing a lot of objects to/from canvas at once\n * since the renders are queued and executed one per frame.\n * Disabling is suggested anyway and managing the renders of the app manually is not a big effort ( canvas.requestRenderAll() )\n * Left default to true to do not break documentation and old app, fiddles.\n * @type Boolean\n */\n renderOnAddRemove: boolean;\n\n /**\n * Based on vptCoords and object.aCoords, skip rendering of objects that\n * are not included in current viewport.\n * May greatly help in applications with crowded canvas and use of zoom/pan\n * If One of the corner of the bounding box of the object is on the canvas\n * the objects get rendered.\n * @type Boolean\n * @default true\n */\n skipOffscreen: boolean;\n\n /**\n * When true, canvas is scaled by devicePixelRatio for better rendering on retina screens\n * @type Boolean\n */\n enableRetinaScaling: boolean;\n\n /**\n * Indicates whether this canvas will use image smoothing, this is on by default in browsers\n * @type Boolean\n */\n imageSmoothingEnabled: boolean;\n\n /**\n * a fabricObject that, without stroke define a clipping area with their shape. filled in black\n * the clipPath object gets used when the canvas has rendered, and the context is placed in the\n * top left corner of the canvas.\n * clipPath will clip away controls, if you do not want this to happen use controlsAboveOverlay = true\n * @type FabricObject\n */\n clipPath?: FabricObject;\n}\n\nexport interface CanvasExportOptions {\n /**\n * Indicates whether toObject/toDatalessObject should include default values\n * if set to false, takes precedence over the object value.\n * @type Boolean\n */\n includeDefaultValues: boolean;\n\n /**\n * When true, getSvgTransform() will apply the StaticCanvas.viewportTransform to the SVG transformation. When true,\n * a zoomed canvas will then produce zoomed SVG output.\n * @type Boolean\n */\n svgViewportTransformation: boolean;\n}\n\nexport interface StaticCanvasOptions\n extends CanvasDrawableOptions,\n CanvasRenderingOptions,\n CanvasExportOptions {\n /**\n * Width in virtual/logical pixels of the canvas.\n * The canvas can be larger than width if retina scaling is active\n * @type number\n */\n width: number;\n\n /**\n * Height in virtual/logical pixels of the canvas.\n * The canvas can be taller than width if retina scaling is active\n * @type height\n */\n height: number;\n\n /**\n * Indicates whether object controls (borders/controls) are rendered above overlay image\n * @type Boolean\n *\n * @todo move to Canvas\n */\n controlsAboveOverlay: boolean;\n\n /**\n * Indicates whether the browser can be scrolled when using a touchscreen and dragging on the canvas\n * It gives PRIORITY to DOM scrolling, it doesn't make it always possible.\n * If is true, when using a touch event on the canvas, the canvas will scroll if scroll is possible.\n * If we are in drawing mode or if we are selecting an object the canvas preventDefault and so it won't scroll\n * @type Boolean\n *\n * @todo move to Canvas\n */\n allowTouchScrolling: boolean;\n\n /**\n * The transformation (a Canvas 2D API transform matrix) which focuses the viewport\n * @type Array\n * @example Default transform\n * canvas.viewportTransform = [1, 0, 0, 1, 0, 0];\n * @example Scale by 70% and translate toward bottom-right by 50, without skewing\n * canvas.viewportTransform = [0.7, 0, 0, 0.7, 50, 50];\n */\n viewportTransform: TMat2D;\n}\n\nexport const staticCanvasDefaults: TOptions = {\n backgroundVpt: true,\n backgroundColor: '',\n overlayVpt: true,\n overlayColor: '',\n\n includeDefaultValues: true,\n svgViewportTransformation: true,\n\n renderOnAddRemove: true,\n skipOffscreen: true,\n enableRetinaScaling: true,\n imageSmoothingEnabled: true,\n\n /**\n * @todo move to Canvas\n */\n controlsAboveOverlay: false,\n /**\n * @todo move to Canvas\n */\n allowTouchScrolling: false,\n\n viewportTransform: [...iMatrix],\n};\n","import { config } from '../config';\nimport { CENTER, VERSION } from '../constants';\nimport type { CanvasEvents, StaticCanvasEvents } from '../EventTypeDefs';\nimport type { Gradient } from '../gradient/Gradient';\nimport { createCollectionMixin, isCollection } from '../Collection';\nimport { CommonMethods } from '../CommonMethods';\nimport type { Pattern } from '../Pattern';\nimport { Point } from '../Point';\nimport type { TCachedFabricObject } from '../shapes/Object/Object';\nimport type {\n Abortable,\n Constructor,\n TCornerPoint,\n TDataUrlOptions,\n TFiller,\n TMat2D,\n TSize,\n TSVGReviver,\n TToCanvasElementOptions,\n TValidToObjectMethod,\n TOptions,\n} from '../typedefs';\nimport {\n cancelAnimFrame,\n requestAnimFrame,\n} from '../util/animation/AnimationFrameProvider';\nimport { runningAnimations } from '../util/animation/AnimationRegistry';\nimport { uid } from '../util/internals/uid';\nimport { createCanvasElementFor, toBlob, toDataURL } from '../util/misc/dom';\nimport { invertTransform, transformPoint } from '../util/misc/matrix';\nimport type { EnlivenObjectOptions } from '../util/misc/objectEnlive';\nimport {\n enlivenObjectEnlivables,\n enlivenObjects,\n} from '../util/misc/objectEnlive';\nimport { pick } from '../util/misc/pick';\nimport { matrixToSVG } from '../util/misc/svgExport';\nimport { toFixed } from '../util/misc/toFixed';\nimport { isFiller, isPattern, isTextObject } from '../util/typeAssertions';\nimport { StaticCanvasDOMManager } from './DOMManagers/StaticCanvasDOMManager';\nimport type { CSSDimensions } from './DOMManagers/util';\nimport type { FabricObject } from '../shapes/Object/FabricObject';\nimport type { StaticCanvasOptions } from './StaticCanvasOptions';\nimport { staticCanvasDefaults } from './StaticCanvasOptions';\nimport { log, FabricError } from '../util/internals/console';\nimport { getDevicePixelRatio } from '../env';\n\n/**\n * Having both options in TCanvasSizeOptions set to true transform the call in a calcOffset\n * Better try to restrict with types to avoid confusion.\n */\nexport type TCanvasSizeOptions =\n | {\n backstoreOnly?: true;\n cssOnly?: false;\n }\n | {\n backstoreOnly?: false;\n cssOnly?: true;\n };\n\nexport type TSVGExportOptions = {\n suppressPreamble?: boolean;\n viewBox?: {\n x: number;\n y: number;\n width: number;\n height: number;\n };\n encoding?: 'UTF-8'; // test Encoding type and see what happens\n width?: string;\n height?: string;\n reviver?: TSVGReviver;\n};\n\n/**\n * Static canvas class\n * @see {@link http://fabricjs.com/static_canvas|StaticCanvas demo}\n * @fires before:render\n * @fires after:render\n * @fires canvas:cleared\n * @fires object:added\n * @fires object:removed\n */\n// TODO: fix `EventSpec` inheritance https://github.com/microsoft/TypeScript/issues/26154#issuecomment-1366616260\nexport class StaticCanvas<\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n EventSpec extends StaticCanvasEvents = StaticCanvasEvents,\n >\n extends createCollectionMixin(CommonMethods)\n implements StaticCanvasOptions\n{\n declare width: number;\n declare height: number;\n\n // background\n declare backgroundVpt: boolean;\n declare backgroundColor: TFiller | string;\n declare backgroundImage?: FabricObject;\n // overlay\n declare overlayVpt: boolean;\n declare overlayColor: TFiller | string;\n declare overlayImage?: FabricObject;\n\n declare clipPath?: FabricObject;\n\n declare includeDefaultValues: boolean;\n\n // rendering config\n declare renderOnAddRemove: boolean;\n declare skipOffscreen: boolean;\n declare enableRetinaScaling: boolean;\n declare imageSmoothingEnabled: boolean;\n\n /**\n * @todo move to Canvas\n */\n declare controlsAboveOverlay: boolean;\n\n /**\n * @todo move to Canvas\n */\n declare allowTouchScrolling: boolean;\n\n declare viewportTransform: TMat2D;\n\n /**\n * The viewport bounding box in scene plane coordinates, see {@link calcViewportBoundaries}\n */\n declare vptCoords: TCornerPoint;\n\n /**\n * A reference to the canvas actual HTMLCanvasElement.\n * Can be use to read the raw pixels, but never write or manipulate\n * @type HTMLCanvasElement\n */\n get lowerCanvasEl() {\n return this.elements.lower?.el;\n }\n\n get contextContainer() {\n return this.elements.lower?.ctx;\n }\n\n /**\n * If true the Canvas is in the process or has been disposed/destroyed.\n * No more rendering operation will be executed on this canvas.\n * @type boolean\n */\n declare destroyed?: boolean;\n\n /**\n * Started the process of disposing but not done yet.\n * WIll likely complete the render cycle already scheduled but stopping adding more.\n * @type boolean\n */\n declare disposed?: boolean;\n\n declare _offset: { left: number; top: number };\n declare protected hasLostContext: boolean;\n declare protected nextRenderHandle: number;\n\n declare elements: StaticCanvasDOMManager;\n\n /**\n * When true control drawing is skipped.\n * This boolean is used to avoid toDataURL to export controls.\n * Usage of this boolean to build up other flows and features is not supported\n * @type Boolean\n * @default false\n */\n declare protected skipControlsDrawing: boolean;\n\n static ownDefaults = staticCanvasDefaults;\n\n // reference to\n declare protected __cleanupTask?: {\n (): void;\n kill: (reason?: any) => void;\n };\n\n static getDefaults(): Record {\n return StaticCanvas.ownDefaults;\n }\n\n constructor(\n el?: string | HTMLCanvasElement,\n options: TOptions = {},\n ) {\n super();\n Object.assign(\n this,\n (this.constructor as typeof StaticCanvas).getDefaults(),\n );\n this.set(options);\n this.initElements(el);\n this._setDimensionsImpl({\n width: this.width || this.elements.lower.el.width || 0,\n height: this.height || this.elements.lower.el.height || 0,\n });\n this.skipControlsDrawing = false;\n this.viewportTransform = [...this.viewportTransform];\n this.calcViewportBoundaries();\n }\n\n protected initElements(el?: string | HTMLCanvasElement) {\n this.elements = new StaticCanvasDOMManager(el);\n }\n\n add(...objects: FabricObject[]) {\n const size = super.add(...objects);\n objects.length > 0 && this.renderOnAddRemove && this.requestRenderAll();\n return size;\n }\n\n insertAt(index: number, ...objects: FabricObject[]) {\n const size = super.insertAt(index, ...objects);\n objects.length > 0 && this.renderOnAddRemove && this.requestRenderAll();\n return size;\n }\n\n remove(...objects: FabricObject[]) {\n const removed = super.remove(...objects);\n removed.length > 0 && this.renderOnAddRemove && this.requestRenderAll();\n return removed;\n }\n\n _onObjectAdded(obj: FabricObject) {\n if (obj.canvas && (obj.canvas as StaticCanvas) !== this) {\n log(\n 'warn',\n 'Canvas is trying to add an object that belongs to a different canvas.\\n' +\n 'Resulting to default behavior: removing object from previous canvas and adding to new canvas',\n );\n obj.canvas.remove(obj);\n }\n obj._set('canvas', this);\n obj.setCoords();\n this.fire('object:added', { target: obj });\n obj.fire('added', { target: this });\n }\n\n _onObjectRemoved(obj: FabricObject) {\n obj._set('canvas', undefined);\n this.fire('object:removed', { target: obj });\n obj.fire('removed', { target: this });\n }\n\n _onStackOrderChanged() {\n this.renderOnAddRemove && this.requestRenderAll();\n }\n\n /**\n * @private\n * @see https://developer.apple.com/library/safari/documentation/AudioVideo/Conceptual/HTML-canvas-guide/SettingUptheCanvas/SettingUptheCanvas.html\n * @return {Number} retinaScaling if applied, otherwise 1;\n */\n getRetinaScaling() {\n return this.enableRetinaScaling ? getDevicePixelRatio() : 1;\n }\n\n /**\n * Calculates canvas element offset relative to the document\n * This method is also attached as \"resize\" event handler of window\n */\n calcOffset() {\n return (this._offset = this.elements.calcOffset());\n }\n\n /**\n * Returns canvas width (in px)\n * @return {Number}\n */\n getWidth(): number {\n return this.width;\n }\n\n /**\n * Returns canvas height (in px)\n * @return {Number}\n */\n getHeight(): number {\n return this.height;\n }\n\n /**\n * Internal use only\n * @protected\n */\n protected _setDimensionsImpl(\n dimensions: Partial,\n { cssOnly = false, backstoreOnly = false }: TCanvasSizeOptions = {},\n ) {\n if (!cssOnly) {\n const size = {\n width: this.width,\n height: this.height,\n ...(dimensions as Partial),\n };\n this.elements.setDimensions(size, this.getRetinaScaling());\n this.hasLostContext = true;\n this.width = size.width;\n this.height = size.height;\n }\n if (!backstoreOnly) {\n this.elements.setCSSDimensions(dimensions);\n }\n\n this.calcOffset();\n }\n\n /**\n * Sets dimensions (width, height) of this canvas instance. when options.cssOnly flag active you should also supply the unit of measure (px/%/em)\n * @param {Object} dimensions Object with width/height properties\n * @param {Number|String} [dimensions.width] Width of canvas element\n * @param {Number|String} [dimensions.height] Height of canvas element\n * @param {Object} [options] Options object\n * @param {Boolean} [options.backstoreOnly=false] Set the given dimensions only as canvas backstore dimensions\n * @param {Boolean} [options.cssOnly=false] Set the given dimensions only as css dimensions\n */\n setDimensions(\n dimensions: Partial,\n options?: { cssOnly?: true; backstoreOnly?: false },\n ): void;\n setDimensions(\n dimensions: Partial,\n options?: { backstoreOnly?: true; cssOnly?: false },\n ): void;\n setDimensions(dimensions: Partial, options?: never): void;\n setDimensions(\n dimensions: Partial,\n options?: TCanvasSizeOptions,\n ) {\n this._setDimensionsImpl(dimensions, options);\n if (!options || !options.cssOnly) {\n this.requestRenderAll();\n }\n }\n\n /**\n * Returns canvas zoom level\n * @return {Number}\n */\n getZoom() {\n return this.viewportTransform[0];\n }\n\n /**\n * Sets viewport transformation of this canvas instance\n * @param {Array} vpt a Canvas 2D API transform matrix\n */\n setViewportTransform(vpt: TMat2D) {\n this.viewportTransform = vpt;\n this.calcViewportBoundaries();\n this.renderOnAddRemove && this.requestRenderAll();\n }\n\n /**\n * Sets zoom level of this canvas instance, the zoom centered around point\n * meaning that following zoom to point with the same point will have the visual\n * effect of the zoom originating from that point. The point won't move.\n * It has nothing to do with canvas center or visual center of the viewport.\n * @param {Point} point to zoom with respect to\n * @param {Number} value to set zoom to, less than 1 zooms out\n */\n zoomToPoint(point: Point, value: number) {\n // TODO: just change the scale, preserve other transformations\n const before = point,\n vpt: TMat2D = [...this.viewportTransform];\n const newPoint = transformPoint(point, invertTransform(vpt));\n vpt[0] = value;\n vpt[3] = value;\n const after = transformPoint(newPoint, vpt);\n vpt[4] += before.x - after.x;\n vpt[5] += before.y - after.y;\n this.setViewportTransform(vpt);\n }\n\n /**\n * Sets zoom level of this canvas instance\n * @param {Number} value to set zoom to, less than 1 zooms out\n */\n setZoom(value: number) {\n this.zoomToPoint(new Point(0, 0), value);\n }\n\n /**\n * Pan viewport so as to place point at top left corner of canvas\n * @param {Point} point to move to\n */\n absolutePan(point: Point) {\n const vpt: TMat2D = [...this.viewportTransform];\n vpt[4] = -point.x;\n vpt[5] = -point.y;\n return this.setViewportTransform(vpt);\n }\n\n /**\n * Pans viewpoint relatively\n * @param {Point} point (position vector) to move by\n */\n relativePan(point: Point) {\n return this.absolutePan(\n new Point(\n -point.x - this.viewportTransform[4],\n -point.y - this.viewportTransform[5],\n ),\n );\n }\n\n /**\n * Returns <canvas> element corresponding to this instance\n * @return {HTMLCanvasElement}\n */\n getElement(): HTMLCanvasElement {\n return this.elements.lower.el;\n }\n\n /**\n * Clears specified context of canvas element\n * @param {CanvasRenderingContext2D} ctx Context to clear\n */\n clearContext(ctx: CanvasRenderingContext2D) {\n ctx.clearRect(0, 0, this.width, this.height);\n }\n\n /**\n * Returns context of canvas where objects are drawn\n * @return {CanvasRenderingContext2D}\n */\n getContext(): CanvasRenderingContext2D {\n return this.elements.lower.ctx;\n }\n\n /**\n * Clears all contexts (background, main, top) of an instance\n */\n clear() {\n this.remove(...this.getObjects());\n this.backgroundImage = undefined;\n this.overlayImage = undefined;\n this.backgroundColor = '';\n this.overlayColor = '';\n this.clearContext(this.getContext());\n this.fire('canvas:cleared');\n this.renderOnAddRemove && this.requestRenderAll();\n }\n\n /**\n * Renders the canvas\n */\n renderAll() {\n this.cancelRequestedRender();\n if (this.destroyed) {\n return;\n }\n this.renderCanvas(this.getContext(), this._objects);\n }\n\n /**\n * Function created to be instance bound at initialization\n * used in requestAnimationFrame rendering\n * Let the fabricJS call it. If you call it manually you could have more\n * animationFrame stacking on to of each other\n * for an imperative rendering, use canvas.renderAll\n * @private\n */\n renderAndReset() {\n this.nextRenderHandle = 0;\n this.renderAll();\n }\n\n /**\n * Append a renderAll request to next animation frame.\n * unless one is already in progress, in that case nothing is done\n * a boolean flag will avoid appending more.\n */\n requestRenderAll() {\n if (!this.nextRenderHandle && !this.disposed && !this.destroyed) {\n this.nextRenderHandle = requestAnimFrame(() => this.renderAndReset());\n }\n }\n\n /**\n * Calculate the position of the 4 corner of canvas with current viewportTransform.\n * helps to determinate when an object is in the current rendering viewport\n */\n calcViewportBoundaries(): TCornerPoint {\n const width = this.width,\n height = this.height,\n iVpt = invertTransform(this.viewportTransform),\n a = transformPoint({ x: 0, y: 0 }, iVpt),\n b = transformPoint({ x: width, y: height }, iVpt),\n // we don't support vpt flipping\n // but the code is robust enough to mostly work with flipping\n min = a.min(b),\n max = a.max(b);\n return (this.vptCoords = {\n tl: min,\n tr: new Point(max.x, min.y),\n bl: new Point(min.x, max.y),\n br: max,\n });\n }\n\n cancelRequestedRender() {\n if (this.nextRenderHandle) {\n cancelAnimFrame(this.nextRenderHandle);\n this.nextRenderHandle = 0;\n }\n }\n\n drawControls(_ctx: CanvasRenderingContext2D) {\n // Static canvas has no controls\n }\n\n /**\n * Renders background, objects, overlay and controls.\n * @param {CanvasRenderingContext2D} ctx\n * @param {Array} objects to render\n */\n renderCanvas(ctx: CanvasRenderingContext2D, objects: FabricObject[]) {\n if (this.destroyed) {\n return;\n }\n\n const v = this.viewportTransform,\n path = this.clipPath;\n this.calcViewportBoundaries();\n this.clearContext(ctx);\n ctx.imageSmoothingEnabled = this.imageSmoothingEnabled;\n // @ts-expect-error node-canvas stuff\n ctx.patternQuality = 'best';\n this.fire('before:render', { ctx });\n this._renderBackground(ctx);\n\n ctx.save();\n //apply viewport transform once for all rendering process\n ctx.transform(v[0], v[1], v[2], v[3], v[4], v[5]);\n this._renderObjects(ctx, objects);\n ctx.restore();\n if (!this.controlsAboveOverlay && !this.skipControlsDrawing) {\n this.drawControls(ctx);\n }\n if (path) {\n path._set('canvas', this);\n // needed to setup a couple of variables\n // todo migrate to the newer one\n path.shouldCache();\n path._transformDone = true;\n (path as TCachedFabricObject).renderCache({ forClipping: true });\n this.drawClipPathOnCanvas(ctx, path as TCachedFabricObject);\n }\n this._renderOverlay(ctx);\n if (this.controlsAboveOverlay && !this.skipControlsDrawing) {\n this.drawControls(ctx);\n }\n this.fire('after:render', { ctx });\n\n if (this.__cleanupTask) {\n this.__cleanupTask();\n this.__cleanupTask = undefined;\n }\n }\n\n /**\n * Paint the cached clipPath on the lowerCanvasEl\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n drawClipPathOnCanvas(\n ctx: CanvasRenderingContext2D,\n clipPath: TCachedFabricObject,\n ) {\n const v = this.viewportTransform;\n ctx.save();\n ctx.transform(...v);\n // DEBUG: uncomment this line, comment the following\n // ctx.globalAlpha = 0.4;\n ctx.globalCompositeOperation = 'destination-in';\n clipPath.transform(ctx);\n ctx.scale(1 / clipPath.zoomX, 1 / clipPath.zoomY);\n ctx.drawImage(\n clipPath._cacheCanvas,\n -clipPath.cacheTranslationX,\n -clipPath.cacheTranslationY,\n );\n ctx.restore();\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n * @param {Array} objects to render\n */\n _renderObjects(ctx: CanvasRenderingContext2D, objects: FabricObject[]) {\n for (let i = 0, len = objects.length; i < len; ++i) {\n objects[i] && objects[i].render(ctx);\n }\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n * @param {string} property 'background' or 'overlay'\n */\n _renderBackgroundOrOverlay(\n ctx: CanvasRenderingContext2D,\n property: 'background' | 'overlay',\n ) {\n const fill = this[`${property}Color`],\n object = this[`${property}Image`],\n v = this.viewportTransform,\n needsVpt = this[`${property}Vpt`];\n if (!fill && !object) {\n return;\n }\n const isAFiller = isFiller(fill);\n if (fill) {\n ctx.save();\n ctx.beginPath();\n ctx.moveTo(0, 0);\n ctx.lineTo(this.width, 0);\n ctx.lineTo(this.width, this.height);\n ctx.lineTo(0, this.height);\n ctx.closePath();\n ctx.fillStyle = isAFiller ? fill.toLive(ctx /* this */)! : fill;\n if (needsVpt) {\n ctx.transform(...v);\n }\n if (isAFiller) {\n ctx.transform(1, 0, 0, 1, fill.offsetX || 0, fill.offsetY || 0);\n const m = ((fill as Gradient<'linear'>).gradientTransform ||\n (fill as Pattern).patternTransform) as TMat2D;\n m && ctx.transform(...m);\n }\n ctx.fill();\n ctx.restore();\n }\n if (object) {\n ctx.save();\n const { skipOffscreen } = this;\n // if the object doesn't move with the viewport,\n // the offscreen concept does not apply;\n this.skipOffscreen = needsVpt;\n if (needsVpt) {\n ctx.transform(...v);\n }\n object.render(ctx);\n this.skipOffscreen = skipOffscreen;\n ctx.restore();\n }\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _renderBackground(ctx: CanvasRenderingContext2D) {\n this._renderBackgroundOrOverlay(ctx, 'background');\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _renderOverlay(ctx: CanvasRenderingContext2D) {\n this._renderBackgroundOrOverlay(ctx, 'overlay');\n }\n\n /**\n * Returns coordinates of a center of canvas.\n * @return {Point}\n */\n getCenterPoint() {\n return new Point(this.width / 2, this.height / 2);\n }\n\n /**\n * Centers object horizontally in the canvas\n */\n centerObjectH(object: FabricObject) {\n return this._centerObject(\n object,\n new Point(this.getCenterPoint().x, object.getCenterPoint().y),\n );\n }\n\n /**\n * Centers object vertically in the canvas\n * @param {FabricObject} object Object to center vertically\n */\n centerObjectV(object: FabricObject) {\n return this._centerObject(\n object,\n new Point(object.getCenterPoint().x, this.getCenterPoint().y),\n );\n }\n\n /**\n * Centers object vertically and horizontally in the canvas\n * @param {FabricObject} object Object to center vertically and horizontally\n */\n centerObject(object: FabricObject) {\n return this._centerObject(object, this.getCenterPoint());\n }\n\n /**\n * Centers object vertically and horizontally in the viewport\n * @param {FabricObject} object Object to center vertically and horizontally\n */\n viewportCenterObject(object: FabricObject) {\n return this._centerObject(object, this.getVpCenter());\n }\n\n /**\n * Centers object horizontally in the viewport, object.top is unchanged\n * @param {FabricObject} object Object to center vertically and horizontally\n */\n viewportCenterObjectH(object: FabricObject) {\n return this._centerObject(\n object,\n new Point(this.getVpCenter().x, object.getCenterPoint().y),\n );\n }\n\n /**\n * Centers object Vertically in the viewport, object.top is unchanged\n * @param {FabricObject} object Object to center vertically and horizontally\n */\n viewportCenterObjectV(object: FabricObject) {\n return this._centerObject(\n object,\n new Point(object.getCenterPoint().x, this.getVpCenter().y),\n );\n }\n\n /**\n * Calculate the point in canvas that correspond to the center of actual viewport.\n * @return {Point} vpCenter, viewport center\n */\n getVpCenter(): Point {\n return transformPoint(\n this.getCenterPoint(),\n invertTransform(this.viewportTransform),\n );\n }\n\n /**\n * @private\n * @param {FabricObject} object Object to center\n * @param {Point} center Center point\n */\n _centerObject(object: FabricObject, center: Point) {\n object.setXY(center, CENTER, CENTER);\n object.setCoords();\n this.renderOnAddRemove && this.requestRenderAll();\n }\n\n /**\n * Returns dataless JSON representation of canvas\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {String} json string\n */\n toDatalessJSON(propertiesToInclude?: string[]) {\n return this.toDatalessObject(propertiesToInclude);\n }\n\n /**\n * Returns object representation of canvas\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} object representation of an instance\n */\n toObject(propertiesToInclude?: string[]) {\n return this._toObjectMethod('toObject', propertiesToInclude);\n }\n\n /**\n * Returns Object representation of canvas\n * this alias is provided because if you call JSON.stringify on an instance,\n * the toJSON object will be invoked if it exists.\n * Having a toJSON method means you can do JSON.stringify(myCanvas)\n * JSON does not support additional properties because toJSON has its own signature\n * @return {Object} JSON compatible object\n * @tutorial {@link http://fabricjs.com/fabric-intro-part-3#serialization}\n * @see {@link http://jsfiddle.net/fabricjs/pec86/|jsFiddle demo}\n * @example JSON representation of canvas \n * const json = canvas.toJSON();\n * @example JSON representation of canvas \n * const json = JSON.stringify(canvas);\n */\n toJSON() {\n return this.toObject();\n }\n\n /**\n * Returns dataless object representation of canvas\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} object representation of an instance\n */\n toDatalessObject(propertiesToInclude?: string[]) {\n return this._toObjectMethod('toDatalessObject', propertiesToInclude);\n }\n\n /**\n * @private\n */\n _toObjectMethod(\n methodName: TValidToObjectMethod,\n propertiesToInclude?: string[],\n ) {\n const clipPath = this.clipPath;\n const clipPathData =\n clipPath && !clipPath.excludeFromExport\n ? this._toObject(clipPath, methodName, propertiesToInclude)\n : null;\n return {\n version: VERSION,\n ...pick(this, propertiesToInclude as (keyof this)[]),\n objects: this._objects\n .filter((object) => !object.excludeFromExport)\n .map((instance) =>\n this._toObject(instance, methodName, propertiesToInclude),\n ),\n ...this.__serializeBgOverlay(methodName, propertiesToInclude),\n ...(clipPathData ? { clipPath: clipPathData } : null),\n };\n }\n\n /**\n * @private\n */\n protected _toObject(\n instance: FabricObject,\n methodName: TValidToObjectMethod,\n propertiesToInclude?: string[],\n ) {\n let originalValue;\n\n if (!this.includeDefaultValues) {\n originalValue = instance.includeDefaultValues;\n instance.includeDefaultValues = false;\n }\n\n const object = instance[methodName](propertiesToInclude);\n if (!this.includeDefaultValues) {\n instance.includeDefaultValues = !!originalValue;\n }\n return object;\n }\n\n /**\n * @private\n */\n __serializeBgOverlay(\n methodName: TValidToObjectMethod,\n propertiesToInclude?: string[],\n ) {\n const data: any = {},\n bgImage = this.backgroundImage,\n overlayImage = this.overlayImage,\n bgColor = this.backgroundColor,\n overlayColor = this.overlayColor;\n\n if (isFiller(bgColor)) {\n if (!bgColor.excludeFromExport) {\n data.background = bgColor.toObject(propertiesToInclude);\n }\n } else if (bgColor) {\n data.background = bgColor;\n }\n\n if (isFiller(overlayColor)) {\n if (!overlayColor.excludeFromExport) {\n data.overlay = overlayColor.toObject(propertiesToInclude);\n }\n } else if (overlayColor) {\n data.overlay = overlayColor;\n }\n\n if (bgImage && !bgImage.excludeFromExport) {\n data.backgroundImage = this._toObject(\n bgImage,\n methodName,\n propertiesToInclude,\n );\n }\n if (overlayImage && !overlayImage.excludeFromExport) {\n data.overlayImage = this._toObject(\n overlayImage,\n methodName,\n propertiesToInclude,\n );\n }\n\n return data;\n }\n\n /* _TO_SVG_START_ */\n\n declare svgViewportTransformation: boolean;\n\n /**\n * Returns SVG representation of canvas\n * @function\n * @param {Object} [options] Options object for SVG output\n * @param {Boolean} [options.suppressPreamble=false] If true xml tag is not included\n * @param {Object} [options.viewBox] SVG viewbox object\n * @param {Number} [options.viewBox.x] x-coordinate of viewbox\n * @param {Number} [options.viewBox.y] y-coordinate of viewbox\n * @param {Number} [options.viewBox.width] Width of viewbox\n * @param {Number} [options.viewBox.height] Height of viewbox\n * @param {String} [options.encoding=UTF-8] Encoding of SVG output\n * @param {String} [options.width] desired width of svg with or without units\n * @param {String} [options.height] desired height of svg with or without units\n * @param {Function} [reviver] Method for further parsing of svg elements, called after each fabric object converted into svg representation.\n * @return {String} SVG string\n * @tutorial {@link http://fabricjs.com/fabric-intro-part-3#serialization}\n * @see {@link http://jsfiddle.net/fabricjs/jQ3ZZ/|jsFiddle demo}\n * @example Normal SVG output\n * var svg = canvas.toSVG();\n * @example SVG output without preamble (without <?xml ../>)\n * var svg = canvas.toSVG({suppressPreamble: true});\n * @example SVG output with viewBox attribute\n * var svg = canvas.toSVG({\n * viewBox: {\n * x: 100,\n * y: 100,\n * width: 200,\n * height: 300\n * }\n * });\n * @example SVG output with different encoding (default: UTF-8)\n * var svg = canvas.toSVG({encoding: 'ISO-8859-1'});\n * @example Modify SVG output with reviver function\n * var svg = canvas.toSVG(null, function(svg) {\n * return svg.replace('stroke-dasharray: ; stroke-linecap: butt; stroke-linejoin: miter; stroke-miterlimit: 10; ', '');\n * });\n */\n toSVG(options: TSVGExportOptions = {}, reviver?: TSVGReviver) {\n options.reviver = reviver;\n const markup: string[] = [];\n\n this._setSVGPreamble(markup, options);\n this._setSVGHeader(markup, options);\n if (this.clipPath) {\n markup.push(`\\n`);\n }\n this._setSVGBgOverlayColor(markup, 'background');\n this._setSVGBgOverlayImage(markup, 'backgroundImage', reviver);\n this._setSVGObjects(markup, reviver);\n if (this.clipPath) {\n markup.push('\\n');\n }\n this._setSVGBgOverlayColor(markup, 'overlay');\n this._setSVGBgOverlayImage(markup, 'overlayImage', reviver);\n\n markup.push('');\n\n return markup.join('');\n }\n\n /**\n * @private\n */\n _setSVGPreamble(markup: string[], options: TSVGExportOptions): void {\n if (options.suppressPreamble) {\n return;\n }\n markup.push(\n '\\n',\n '\\n',\n );\n }\n\n /**\n * @private\n */\n _setSVGHeader(markup: string[], options: TSVGExportOptions): void {\n const width = options.width || `${this.width}`,\n height = options.height || `${this.height}`,\n NUM_FRACTION_DIGITS = config.NUM_FRACTION_DIGITS,\n optViewBox = options.viewBox;\n let viewBox: string;\n if (optViewBox) {\n viewBox = `viewBox=\"${optViewBox.x} ${optViewBox.y} ${optViewBox.width} ${optViewBox.height}\" `;\n } else if (this.svgViewportTransformation) {\n const vpt = this.viewportTransform;\n viewBox = `viewBox=\"${toFixed(\n -vpt[4] / vpt[0],\n NUM_FRACTION_DIGITS,\n )} ${toFixed(-vpt[5] / vpt[3], NUM_FRACTION_DIGITS)} ${toFixed(\n this.width / vpt[0],\n NUM_FRACTION_DIGITS,\n )} ${toFixed(this.height / vpt[3], NUM_FRACTION_DIGITS)}\" `;\n } else {\n viewBox = `viewBox=\"0 0 ${this.width} ${this.height}\" `;\n }\n\n markup.push(\n '\\n',\n 'Created with Fabric.js ',\n VERSION,\n '\\n',\n '\\n',\n this.createSVGFontFacesMarkup(),\n this.createSVGRefElementsMarkup(),\n this.createSVGClipPathMarkup(options),\n '\\n',\n );\n }\n\n createSVGClipPathMarkup(options: TSVGExportOptions): string {\n const clipPath = this.clipPath;\n if (clipPath) {\n clipPath.clipPathId = `CLIPPATH_${uid()}`;\n return `\\n${clipPath.toClipPathSVG(\n options.reviver,\n )}\\n`;\n }\n return '';\n }\n\n /**\n * Creates markup containing SVG referenced elements like patterns, gradients etc.\n * @return {String}\n */\n createSVGRefElementsMarkup(): string {\n return (['background', 'overlay'] as const)\n .map((prop) => {\n const fill = this[`${prop}Color`];\n if (isFiller(fill)) {\n const shouldTransform = this[`${prop}Vpt`],\n vpt = this.viewportTransform,\n object = {\n // otherwise circular dependency\n isType: () => false,\n width: this.width / (shouldTransform ? vpt[0] : 1),\n height: this.height / (shouldTransform ? vpt[3] : 1),\n };\n return fill.toSVG(object as FabricObject, {\n additionalTransform: shouldTransform ? matrixToSVG(vpt) : '',\n });\n }\n })\n .join('');\n }\n\n /**\n * Creates markup containing SVG font faces,\n * font URLs for font faces must be collected by developers\n * and are not extracted from the DOM by fabricjs\n * @param {Array} objects Array of fabric objects\n * @return {String}\n */\n createSVGFontFacesMarkup(): string {\n const objects: FabricObject[] = [],\n fontList: Record = {},\n fontPaths = config.fontPaths;\n\n this._objects.forEach(function add(object) {\n objects.push(object);\n if (isCollection(object)) {\n object._objects.forEach(add);\n }\n });\n\n objects.forEach((obj) => {\n if (!isTextObject(obj)) {\n return;\n }\n const { styles, fontFamily } = obj;\n if (fontList[fontFamily] || !fontPaths[fontFamily]) {\n return;\n }\n fontList[fontFamily] = true;\n if (!styles) {\n return;\n }\n Object.values(styles).forEach((styleRow) => {\n Object.values(styleRow).forEach(({ fontFamily = '' }) => {\n if (!fontList[fontFamily] && fontPaths[fontFamily]) {\n fontList[fontFamily] = true;\n }\n });\n });\n });\n\n const fontListMarkup = Object.keys(fontList)\n .map(\n (fontFamily) =>\n `\\t\\t@font-face {\\n\\t\\t\\tfont-family: '${fontFamily}';\\n\\t\\t\\tsrc: url('${fontPaths[fontFamily]}');\\n\\t\\t}\\n`,\n )\n .join('');\n\n if (fontListMarkup) {\n return `\\t\\n`;\n }\n return '';\n }\n\n /**\n * @private\n */\n _setSVGObjects(markup: string[], reviver?: TSVGReviver) {\n this.forEachObject((fabricObject) => {\n if (fabricObject.excludeFromExport) {\n return;\n }\n this._setSVGObject(markup, fabricObject, reviver);\n });\n }\n\n /**\n * This is its own function because the Canvas ( non static ) requires extra code here\n * @private\n */\n _setSVGObject(\n markup: string[],\n instance: FabricObject,\n reviver?: TSVGReviver,\n ) {\n markup.push(instance.toSVG(reviver));\n }\n\n /**\n * @private\n */\n _setSVGBgOverlayImage(\n markup: string[],\n property: 'overlayImage' | 'backgroundImage',\n reviver?: TSVGReviver,\n ) {\n const bgOrOverlay = this[property];\n if (bgOrOverlay && !bgOrOverlay.excludeFromExport && bgOrOverlay.toSVG) {\n markup.push(bgOrOverlay.toSVG(reviver));\n }\n }\n\n /**\n * @TODO this seems to handle patterns but fail at gradients.\n * @private\n */\n _setSVGBgOverlayColor(markup: string[], property: 'background' | 'overlay') {\n const filler = this[`${property}Color`];\n if (!filler) {\n return;\n }\n if (isFiller(filler)) {\n const repeat = (filler as Pattern).repeat || '',\n finalWidth = this.width,\n finalHeight = this.height,\n shouldInvert = this[`${property}Vpt`],\n additionalTransform = shouldInvert\n ? matrixToSVG(invertTransform(this.viewportTransform))\n : '';\n markup.push(\n `\\n`,\n );\n } else {\n markup.push(\n '\\n',\n );\n }\n }\n /* _TO_SVG_END_ */\n\n /**\n * Populates canvas with data from the specified JSON.\n * JSON format must conform to the one of {@link fabric.Canvas#toJSON}\n *\n * **IMPORTANT**: It is recommended to abort loading tasks before calling this method to prevent race conditions and unnecessary networking\n *\n * @param {String|Object} json JSON string or object\n * @param {Function} [reviver] Method for further parsing of JSON elements, called after each fabric object created.\n * @param {Object} [options] options\n * @param {AbortSignal} [options.signal] see https://developer.mozilla.org/en-US/docs/Web/API/AbortController/signal\n * @return {Promise} instance\n * @tutorial {@link http://fabricjs.com/fabric-intro-part-3#deserialization}\n * @see {@link http://jsfiddle.net/fabricjs/fmgXt/|jsFiddle demo}\n * @example loadFromJSON\n * canvas.loadFromJSON(json).then((canvas) => canvas.requestRenderAll());\n * @example loadFromJSON with reviver\n * canvas.loadFromJSON(json, function(o, object) {\n * // `o` = json object\n * // `object` = fabric.Object instance\n * // ... do some stuff ...\n * }).then((canvas) => {\n * ... canvas is restored, add your code.\n * });\n *\n */\n loadFromJSON(\n json: string | Record,\n reviver?: EnlivenObjectOptions['reviver'],\n { signal }: Abortable = {},\n ): Promise {\n if (!json) {\n return Promise.reject(new FabricError('`json` is undefined'));\n }\n\n // parse json if it wasn't already\n const serialized = typeof json === 'string' ? JSON.parse(json) : json;\n const {\n objects = [],\n backgroundImage,\n background,\n overlayImage,\n overlay,\n clipPath,\n } = serialized;\n const renderOnAddRemove = this.renderOnAddRemove;\n this.renderOnAddRemove = false;\n\n return Promise.all([\n enlivenObjects(objects, {\n reviver,\n signal,\n }),\n enlivenObjectEnlivables(\n {\n backgroundImage,\n backgroundColor: background,\n overlayImage,\n overlayColor: overlay,\n clipPath,\n },\n { signal },\n ),\n ]).then(([enlived, enlivedMap]) => {\n this.clear();\n this.add(...enlived);\n this.set(serialized);\n this.set(enlivedMap);\n this.renderOnAddRemove = renderOnAddRemove;\n return this;\n });\n }\n\n /**\n * Clones canvas instance\n * @param {string[]} [properties] Array of properties to include in the cloned canvas and children\n */\n clone(properties: string[]) {\n const data = this.toObject(properties);\n const canvas = this.cloneWithoutData();\n return canvas.loadFromJSON(data);\n }\n\n /**\n * Clones canvas instance without cloning existing data.\n * This essentially copies canvas dimensions since loadFromJSON does not affect canvas size.\n */\n cloneWithoutData() {\n const el = createCanvasElementFor(this);\n return new (this.constructor as Constructor)(el);\n }\n\n /**\n * Exports canvas element to a dataurl image. Note that when multiplier is used, cropping is scaled appropriately\n * @param {Object} [options] Options object\n * @param {String} [options.format=png] The format of the output image. Either \"jpeg\" or \"png\"\n * @param {Number} [options.quality=1] Quality level (0..1). Only used for jpeg.\n * @param {Number} [options.multiplier=1] Multiplier to scale by, to have consistent\n * @param {Number} [options.left] Cropping left offset. Introduced in v1.2.14\n * @param {Number} [options.top] Cropping top offset. Introduced in v1.2.14\n * @param {Number} [options.width] Cropping width. Introduced in v1.2.14\n * @param {Number} [options.height] Cropping height. Introduced in v1.2.14\n * @param {Boolean} [options.enableRetinaScaling] Enable retina scaling for clone image. Introduce in 2.0.0\n * @param {(object: fabric.Object) => boolean} [options.filter] Function to filter objects.\n * @return {String} Returns a data: URL containing a representation of the object in the format specified by options.format\n * @see {@link https://jsfiddle.net/xsjua1rd/ demo}\n * @example Generate jpeg dataURL with lower quality\n * var dataURL = canvas.toDataURL({\n * format: 'jpeg',\n * quality: 0.8\n * });\n * @example Generate cropped png dataURL (clipping of canvas)\n * var dataURL = canvas.toDataURL({\n * format: 'png',\n * left: 100,\n * top: 100,\n * width: 200,\n * height: 200\n * });\n * @example Generate double scaled png dataURL\n * var dataURL = canvas.toDataURL({\n * format: 'png',\n * multiplier: 2\n * });\n * @example Generate dataURL with objects that overlap a specified object\n * var myObject;\n * var dataURL = canvas.toDataURL({\n * filter: (object) => object.isContainedWithinObject(myObject) || object.intersectsWithObject(myObject)\n * });\n */\n toDataURL(options = {} as TDataUrlOptions): string {\n const {\n format = 'png',\n quality = 1,\n multiplier = 1,\n enableRetinaScaling = false,\n } = options;\n const finalMultiplier =\n multiplier * (enableRetinaScaling ? this.getRetinaScaling() : 1);\n\n return toDataURL(\n this.toCanvasElement(finalMultiplier, options),\n format,\n quality,\n );\n }\n toBlob(options = {} as TDataUrlOptions): Promise {\n const {\n format = 'png',\n quality = 1,\n multiplier = 1,\n enableRetinaScaling = false,\n } = options;\n const finalMultiplier =\n multiplier * (enableRetinaScaling ? this.getRetinaScaling() : 1);\n\n return toBlob(\n this.toCanvasElement(finalMultiplier, options),\n format,\n quality,\n );\n }\n\n /**\n * Create a new HTMLCanvas element painted with the current canvas content.\n * No need to resize the actual one or repaint it.\n * Will transfer object ownership to a new canvas, paint it, and set everything back.\n * This is an intermediary step used to get to a dataUrl but also it is useful to\n * create quick image copies of a canvas without passing for the dataUrl string\n * @param {Number} [multiplier] a zoom factor.\n * @param {Object} [options] Cropping informations\n * @param {Number} [options.left] Cropping left offset.\n * @param {Number} [options.top] Cropping top offset.\n * @param {Number} [options.width] Cropping width.\n * @param {Number} [options.height] Cropping height.\n * @param {(object: fabric.Object) => boolean} [options.filter] Function to filter objects.\n */\n toCanvasElement(\n multiplier = 1,\n { width, height, left, top, filter } = {} as TToCanvasElementOptions,\n ): HTMLCanvasElement {\n const scaledWidth = (width || this.width) * multiplier,\n scaledHeight = (height || this.height) * multiplier,\n zoom = this.getZoom(),\n originalWidth = this.width,\n originalHeight = this.height,\n originalSkipControlsDrawing = this.skipControlsDrawing,\n newZoom = zoom * multiplier,\n vp = this.viewportTransform,\n translateX = (vp[4] - (left || 0)) * multiplier,\n translateY = (vp[5] - (top || 0)) * multiplier,\n newVp = [newZoom, 0, 0, newZoom, translateX, translateY] as TMat2D,\n originalRetina = this.enableRetinaScaling,\n canvasEl = createCanvasElementFor({\n width: scaledWidth,\n height: scaledHeight,\n }),\n objectsToRender = filter\n ? this._objects.filter((obj) => filter(obj))\n : this._objects;\n this.enableRetinaScaling = false;\n this.viewportTransform = newVp;\n this.width = scaledWidth;\n this.height = scaledHeight;\n this.skipControlsDrawing = true;\n this.calcViewportBoundaries();\n this.renderCanvas(canvasEl.getContext('2d')!, objectsToRender);\n this.viewportTransform = vp;\n this.width = originalWidth;\n this.height = originalHeight;\n this.calcViewportBoundaries();\n this.enableRetinaScaling = originalRetina;\n this.skipControlsDrawing = originalSkipControlsDrawing;\n return canvasEl;\n }\n\n /**\n * Waits until rendering has settled to destroy the canvas\n * @returns {Promise} a promise resolving to `true` once the canvas has been destroyed or to `false` if the canvas has was already destroyed\n * @throws if aborted by a consequent call\n */\n dispose() {\n !this.disposed &&\n this.elements.cleanupDOM({ width: this.width, height: this.height });\n runningAnimations.cancelByCanvas(this);\n this.disposed = true;\n return new Promise((resolve, reject) => {\n const task = () => {\n this.destroy();\n resolve(true);\n };\n task.kill = reject;\n if (this.__cleanupTask) {\n this.__cleanupTask.kill('aborted');\n }\n\n if (this.destroyed) {\n resolve(false);\n } else if (this.nextRenderHandle) {\n this.__cleanupTask = task;\n } else {\n task();\n }\n });\n }\n\n /**\n * Clears the canvas element, disposes objects and frees resources.\n *\n * Invoked as part of the **async** operation of {@link dispose}.\n *\n * **CAUTION**:\n *\n * This method is **UNSAFE**.\n * You may encounter a race condition using it if there's a requested render.\n * Call this method only if you are sure rendering has settled.\n * Consider using {@link dispose} as it is **SAFE**\n *\n * @private\n */\n destroy() {\n this.destroyed = true;\n this.cancelRequestedRender();\n this.forEachObject((object) => object.dispose());\n this._objects = [];\n if (this.backgroundImage) {\n this.backgroundImage.dispose();\n }\n this.backgroundImage = undefined;\n if (this.overlayImage) {\n this.overlayImage.dispose();\n }\n this.overlayImage = undefined;\n this.elements.dispose();\n }\n\n /**\n * Returns a string representation of an instance\n * @return {String} string representation of an instance\n */\n toString() {\n return `#`;\n }\n}\n","import type { TPointerEvent } from '../EventTypeDefs';\nimport { Point } from '../Point';\nimport { getScrollLeftTop } from './dom_misc';\n\nconst touchEvents = ['touchstart', 'touchmove', 'touchend'];\n\nfunction getTouchInfo(event: TouchEvent | MouseEvent): MouseEvent | Touch {\n const touchProp = (event as TouchEvent).changedTouches;\n if (touchProp && touchProp[0]) {\n return touchProp[0];\n }\n return event as MouseEvent;\n}\n\nexport const getPointer = (event: TPointerEvent): Point => {\n const element = event.target as HTMLElement,\n scroll = getScrollLeftTop(element),\n _evt = getTouchInfo(event);\n return new Point(_evt.clientX + scroll.left, _evt.clientY + scroll.top);\n};\n\nexport const isTouchEvent = (event: TPointerEvent) =>\n touchEvents.includes(event.type) ||\n (event as PointerEvent).pointerType === 'touch';\n\nexport const stopEvent = (e: Event) => {\n e.preventDefault();\n e.stopPropagation();\n};\n","import type { XY } from '../../Point';\nimport type { TBBox } from '../../typedefs';\n\n/**\n * Calculates bounding box (left, top, width, height) from given `points`\n * @param {XY[]} points\n * @return {Object} Object with left, top, width, height properties\n */\nexport const makeBoundingBoxFromPoints = (points: XY[]): TBBox => {\n let left = 0,\n top = 0,\n width = 0,\n height = 0;\n\n for (let i = 0, len = points.length; i < len; i++) {\n const { x, y } = points[i];\n if (x > width || !i) width = x;\n if (x < left || !i) left = x;\n if (y > height || !i) height = y;\n if (y < top || !i) top = y;\n }\n\n return {\n left,\n top,\n width: width - left,\n height: height - top,\n };\n};\n","import { Point } from '../../Point';\nimport { CENTER } from '../../constants';\nimport type { FabricObject } from '../../shapes/Object/Object';\nimport type { TMat2D } from '../../typedefs';\nimport { makeBoundingBoxFromPoints } from './boundingBoxFromPoints';\nimport {\n invertTransform,\n multiplyTransformMatrices,\n qrDecompose,\n} from './matrix';\n\n/**\n * given an object and a transform, apply the inverse transform to the object,\n * this is equivalent to remove from that object that transformation, so that\n * added in a space with the removed transform, the object will be the same as before.\n * Removing from an object a transform that scale by 2 is like scaling it by 1/2.\n * Removing from an object a transform that rotate by 30deg is like rotating by 30deg\n * in the opposite direction.\n * This util is used to add objects inside transformed groups or nested groups.\n * @param {FabricObject} object the object you want to transform\n * @param {TMat2D} transform the destination transform\n */\nexport const removeTransformFromObject = (\n object: FabricObject,\n transform: TMat2D,\n) => {\n const inverted = invertTransform(transform),\n finalTransform = multiplyTransformMatrices(\n inverted,\n object.calcOwnMatrix(),\n );\n applyTransformToObject(object, finalTransform);\n};\n\n/**\n * given an object and a transform, apply the transform to the object.\n * this is equivalent to change the space where the object is drawn.\n * Adding to an object a transform that scale by 2 is like scaling it by 2.\n * This is used when removing an object from an active selection for example.\n * @param {FabricObject} object the object you want to transform\n * @param {Array} transform the destination transform\n */\nexport const addTransformToObject = (object: FabricObject, transform: TMat2D) =>\n applyTransformToObject(\n object,\n multiplyTransformMatrices(transform, object.calcOwnMatrix()),\n );\n\n/**\n * discard an object transform state and apply the one from the matrix.\n * @param {FabricObject} object the object you want to transform\n * @param {Array} transform the destination transform\n */\nexport const applyTransformToObject = (\n object: FabricObject,\n transform: TMat2D,\n) => {\n const { translateX, translateY, scaleX, scaleY, ...otherOptions } =\n qrDecompose(transform),\n center = new Point(translateX, translateY);\n object.flipX = false;\n object.flipY = false;\n Object.assign(object, otherOptions);\n object.set({ scaleX, scaleY });\n object.setPositionByOrigin(center, CENTER, CENTER);\n};\n/**\n * reset an object transform state to neutral. Top and left are not accounted for\n * @param {FabricObject} target object to transform\n */\nexport const resetObjectTransform = (target: FabricObject) => {\n target.scaleX = 1;\n target.scaleY = 1;\n target.skewX = 0;\n target.skewY = 0;\n target.flipX = false;\n target.flipY = false;\n target.rotate(0);\n};\n\n/**\n * Extract Object transform values\n * @param {FabricObject} target object to read from\n * @return {Object} Components of transform\n */\nexport const saveObjectTransform = (target: FabricObject) => ({\n scaleX: target.scaleX,\n scaleY: target.scaleY,\n skewX: target.skewX,\n skewY: target.skewY,\n angle: target.angle,\n left: target.left,\n flipX: target.flipX,\n flipY: target.flipY,\n top: target.top,\n});\n\n/**\n * given a width and height, return the size of the bounding box\n * that can contains the box with width/height with applied transform.\n * Use to calculate the boxes around objects for controls.\n * @param {Number} width\n * @param {Number} height\n * @param {TMat2D} t\n * @returns {Point} size\n */\nexport const sizeAfterTransform = (\n width: number,\n height: number,\n t: TMat2D,\n) => {\n const dimX = width / 2,\n dimY = height / 2,\n points = [\n new Point(-dimX, -dimY),\n new Point(dimX, -dimY),\n new Point(-dimX, dimY),\n new Point(dimX, dimY),\n ].map((p) => p.transform(t)),\n bbox = makeBoundingBoxFromPoints(points);\n return new Point(bbox.width, bbox.height);\n};\n","import { iMatrix } from '../../constants';\nimport type { Point } from '../../Point';\nimport type { FabricObject } from '../../shapes/Object/Object';\nimport type { TMat2D } from '../../typedefs';\nimport { invertTransform, multiplyTransformMatrices } from './matrix';\nimport { applyTransformToObject } from './objectTransforms';\n\n/**\n * We are actually looking for the transformation from the destination plane to the source plane (change of basis matrix)\\\n * The object will exist on the destination plane and we want it to seem unchanged by it so we invert the destination matrix (`to`) and then apply the source matrix (`from`)\n * @param [from]\n * @param [to]\n * @returns\n */\nexport const calcPlaneChangeMatrix = (\n from: TMat2D = iMatrix,\n to: TMat2D = iMatrix,\n) => multiplyTransformMatrices(invertTransform(to), from);\n\n/**\n * Sends a point from the source coordinate plane to the destination coordinate plane.\\\n * From the canvas/viewer's perspective the point remains unchanged.\n *\n * @example Send point from canvas plane to group plane\n * var obj = new Rect({ left: 20, top: 20, width: 60, height: 60, strokeWidth: 0 });\n * var group = new Group([obj], { strokeWidth: 0 });\n * var sentPoint1 = sendPointToPlane(new Point(50, 50), undefined, group.calcTransformMatrix());\n * var sentPoint2 = sendPointToPlane(new Point(50, 50), iMatrix, group.calcTransformMatrix());\n * console.log(sentPoint1, sentPoint2) // both points print (0,0) which is the center of group\n *\n * @param {Point} point\n * @param {TMat2D} [from] plane matrix containing object. Passing `undefined` is equivalent to passing the identity matrix, which means `point` exists in the canvas coordinate plane.\n * @param {TMat2D} [to] destination plane matrix to contain object. Passing `undefined` means `point` should be sent to the canvas coordinate plane.\n * @returns {Point} transformed point\n */\nexport const sendPointToPlane = (\n point: Point,\n from: TMat2D = iMatrix,\n to: TMat2D = iMatrix,\n): Point => point.transform(calcPlaneChangeMatrix(from, to));\n\n/**\n * See {@link sendPointToPlane}\n */\nexport const sendVectorToPlane = (\n point: Point,\n from: TMat2D = iMatrix,\n to: TMat2D = iMatrix,\n): Point => point.transform(calcPlaneChangeMatrix(from, to), true);\n\n/**\n *\n * A util that abstracts applying transform to objects.\\\n * Sends `object` to the destination coordinate plane by applying the relevant transformations.\\\n * Changes the space/plane where `object` is drawn.\\\n * From the canvas/viewer's perspective `object` remains unchanged.\n *\n * @example Move clip path from one object to another while preserving it's appearance as viewed by canvas/viewer\n * let obj, obj2;\n * let clipPath = new Circle({ radius: 50 });\n * obj.clipPath = clipPath;\n * // render\n * sendObjectToPlane(clipPath, obj.calcTransformMatrix(), obj2.calcTransformMatrix());\n * obj.clipPath = undefined;\n * obj2.clipPath = clipPath;\n * // render, clipPath now clips obj2 but seems unchanged from the eyes of the viewer\n *\n * @example Clip an object's clip path with an existing object\n * let obj, existingObj;\n * let clipPath = new Circle({ radius: 50 });\n * obj.clipPath = clipPath;\n * let transformTo = multiplyTransformMatrices(obj.calcTransformMatrix(), clipPath.calcTransformMatrix());\n * sendObjectToPlane(existingObj, existingObj.group?.calcTransformMatrix(), transformTo);\n * clipPath.clipPath = existingObj;\n *\n * @param {FabricObject} object\n * @param {Matrix} [from] plane matrix containing object. Passing `undefined` is equivalent to passing the identity matrix, which means `object` is a direct child of canvas.\n * @param {Matrix} [to] destination plane matrix to contain object. Passing `undefined` means `object` should be sent to the canvas coordinate plane.\n * @returns {Matrix} the transform matrix that was applied to `object`\n */\nexport const sendObjectToPlane = (\n object: FabricObject,\n from?: TMat2D,\n to?: TMat2D,\n): TMat2D => {\n const t = calcPlaneChangeMatrix(from, to);\n applyTransformToObject(\n object,\n multiplyTransformMatrices(t, object.calcOwnMatrix()),\n );\n return t;\n};\n","import type {\n ObjectModificationEvents,\n TModificationEvents,\n} from '../EventTypeDefs';\n\nexport const fireEvent = (\n eventName: TModificationEvents,\n options: ObjectModificationEvents[typeof eventName],\n) => {\n const {\n transform: { target },\n } = options;\n target.canvas?.fire(`object:${eventName}`, {\n ...options,\n target,\n });\n target.fire(eventName, options);\n};\n","import type { TOriginX, TOriginY } from '../../typedefs';\n\nconst originOffset = {\n left: -0.5,\n top: -0.5,\n center: 0,\n bottom: 0.5,\n right: 0.5,\n};\n/**\n * Resolves origin value relative to center\n * @private\n * @param {TOriginX | TOriginY} originValue originX / originY\n * @returns number\n */\n\nexport const resolveOrigin = (\n originValue: TOriginX | TOriginY | number,\n): number =>\n typeof originValue === 'string'\n ? originOffset[originValue]\n : originValue - 0.5;\n","import type { XY } from '../../Point';\nimport { Point } from '../../Point';\nimport type { TRadian } from '../../typedefs';\n\nconst unitVectorX = new Point(1, 0);\nconst zero = new Point();\n\n/**\n * Rotates `vector` with `radians`\n * @param {Point} vector The vector to rotate (x and y)\n * @param {Number} radians The radians of the angle for the rotation\n * @return {Point} The new rotated point\n */\nexport const rotateVector = (vector: Point, radians: TRadian) =>\n vector.rotate(radians);\n\n/**\n * Creates a vector from points represented as a point\n *\n * @param {Point} from\n * @param {Point} to\n * @returns {Point} vector\n */\nexport const createVector = (from: XY, to: XY): Point =>\n new Point(to).subtract(from);\n\n/**\n * return the magnitude of a vector\n * @return {number}\n */\nexport const magnitude = (point: Point) => point.distanceFrom(zero);\n\n/**\n * Calculates the angle between 2 vectors\n * @param {Point} a\n * @param {Point} b\n * @returns the angle in radians from `a` to `b`\n */\nexport const calcAngleBetweenVectors = (a: Point, b: Point): TRadian =>\n Math.atan2(crossProduct(a, b), dotProduct(a, b)) as TRadian;\n\n/**\n * Calculates the angle between the x axis and the vector\n * @param {Point} v\n * @returns the angle in radians of `v`\n */\nexport const calcVectorRotation = (v: Point) =>\n calcAngleBetweenVectors(unitVectorX, v);\n\n/**\n * @param {Point} v\n * @returns {Point} vector representing the unit vector pointing to the direction of `v`\n */\nexport const getUnitVector = (v: Point): Point =>\n v.eq(zero) ? v : v.scalarDivide(magnitude(v));\n\n/**\n * @param {Point} v\n * @param {Boolean} [counterClockwise] the direction of the orthogonal vector, defaults to `true`\n * @returns {Point} the unit orthogonal vector\n */\nexport const getOrthonormalVector = (\n v: Point,\n counterClockwise = true,\n): Point =>\n getUnitVector(new Point(-v.y, v.x).scalarMultiply(counterClockwise ? 1 : -1));\n\n/**\n * Cross product of two vectors in 2D\n * @param {Point} a\n * @param {Point} b\n * @returns {number} the magnitude of Z vector\n */\nexport const crossProduct = (a: Point, b: Point): number =>\n a.x * b.y - a.y * b.x;\n\n/**\n * Dot product of two vectors in 2D\n * @param {Point} a\n * @param {Point} b\n * @returns {number}\n */\nexport const dotProduct = (a: Point, b: Point): number => a.x * b.x + a.y * b.y;\n\n/**\n * Checks if the vector is between two others. It is considered\n * to be inside when the vector to be tested is between the\n * initial vector and the final vector (included) in a counterclockwise direction.\n * @param {Point} t vector to be tested\n * @param {Point} a initial vector\n * @param {Point} b final vector\n * @returns {boolean} true if the vector is among the others\n */\nexport const isBetweenVectors = (t: Point, a: Point, b: Point): boolean => {\n if (t.eq(a) || t.eq(b)) return true;\n const AxB = crossProduct(a, b),\n AxT = crossProduct(a, t),\n BxT = crossProduct(b, t);\n return AxB >= 0 ? AxT >= 0 && BxT <= 0 : !(AxT <= 0 && BxT >= 0);\n};\n","import type {\n TPointerEvent,\n Transform,\n TransformAction,\n BasicTransformEvent,\n} from '../EventTypeDefs';\nimport { resolveOrigin } from '../util/misc/resolveOrigin';\nimport { Point } from '../Point';\nimport type { FabricObject } from '../shapes/Object/FabricObject';\nimport type { TOriginX, TOriginY } from '../typedefs';\nimport { degreesToRadians } from '../util/misc/radiansDegreesConversion';\nimport type { Control } from './Control';\nimport { CENTER, quarterPI, twoMathPi } from '../constants';\nimport { calcVectorRotation, createVector } from '../util/misc/vectors';\nimport type { TOCoord } from '../shapes/Object/InteractiveObject';\nimport { sendPointToPlane } from '../util/misc/planeChange';\n\nexport const NOT_ALLOWED_CURSOR = 'not-allowed';\n\n/**\n * @param {Boolean} alreadySelected true if target is already selected\n * @param {String} corner a string representing the corner ml, mr, tl ...\n * @param {Event} e Event object\n * @param {FabricObject} [target] inserted back to help overriding. Unused\n */\nexport const getActionFromCorner = (\n alreadySelected: boolean,\n corner: string | undefined,\n e: TPointerEvent,\n target: FabricObject,\n) => {\n if (!corner || !alreadySelected) {\n return 'drag';\n }\n const control = target.controls[corner];\n return control.getActionName(e, control, target);\n};\n\n/**\n * Checks if transform is centered\n * @param {Object} transform transform data\n * @return {Boolean} true if transform is centered\n */\nexport function isTransformCentered(transform: Transform) {\n return (\n resolveOrigin(transform.originX) === resolveOrigin(CENTER) &&\n resolveOrigin(transform.originY) === resolveOrigin(CENTER)\n );\n}\n\nexport function invertOrigin(origin: TOriginX | TOriginY) {\n return -resolveOrigin(origin) + 0.5;\n}\n\nexport const isLocked = (\n target: FabricObject,\n lockingKey:\n | 'lockMovementX'\n | 'lockMovementY'\n | 'lockRotation'\n | 'lockScalingX'\n | 'lockScalingY'\n | 'lockSkewingX'\n | 'lockSkewingY'\n | 'lockScalingFlip',\n) => target[lockingKey];\n\nexport const commonEventInfo: TransformAction<\n Transform,\n BasicTransformEvent\n> = (eventData, transform, x, y) => {\n return {\n e: eventData,\n transform,\n pointer: new Point(x, y),\n };\n};\n\n/**\n * Combine control position and object angle to find the control direction compared\n * to the object center.\n * @param {FabricObject} fabricObject the fabric object for which we are rendering controls\n * @param {Control} control the control class\n * @return {Number} 0 - 7 a quadrant number\n */\nexport function findCornerQuadrant(\n fabricObject: FabricObject,\n control: Control,\n coord: TOCoord,\n): number {\n const target = coord;\n const center = sendPointToPlane(\n fabricObject.getCenterPoint(),\n fabricObject.canvas!.viewportTransform,\n undefined,\n );\n const angle = calcVectorRotation(createVector(center, target)) + twoMathPi;\n return Math.round((angle % twoMathPi) / quarterPI);\n}\n\n/**\n * @returns the normalized point (rotated relative to center) in local coordinates\n */\nfunction normalizePoint(\n target: FabricObject,\n point: Point,\n originX: TOriginX,\n originY: TOriginY,\n): Point {\n const center = target.getRelativeCenterPoint(),\n p =\n typeof originX !== 'undefined' && typeof originY !== 'undefined'\n ? target.translateToGivenOrigin(\n center,\n CENTER,\n CENTER,\n originX,\n originY,\n )\n : new Point(target.left, target.top),\n p2 = target.angle\n ? point.rotate(-degreesToRadians(target.angle), center)\n : point;\n return p2.subtract(p);\n}\n\n/**\n * Transforms a point to the offset from the given origin\n * @param {Object} transform\n * @param {String} originX\n * @param {String} originY\n * @param {number} x\n * @param {number} y\n * @return {Fabric.Point} the normalized point\n */\nexport function getLocalPoint(\n { target, corner }: Transform,\n originX: TOriginX,\n originY: TOriginY,\n x: number,\n y: number,\n) {\n const control = target.controls[corner],\n zoom = target.canvas?.getZoom() || 1,\n padding = target.padding / zoom,\n localPoint = normalizePoint(target, new Point(x, y), originX, originY);\n if (localPoint.x >= padding) {\n localPoint.x -= padding;\n }\n if (localPoint.x <= -padding) {\n localPoint.x += padding;\n }\n if (localPoint.y >= padding) {\n localPoint.y -= padding;\n }\n if (localPoint.y <= padding) {\n localPoint.y += padding;\n }\n localPoint.x -= control.offsetX;\n localPoint.y -= control.offsetY;\n return localPoint;\n}\n","import type { TransformActionHandler } from '../EventTypeDefs';\nimport { LEFT, TOP, MOVING } from '../constants';\nimport { fireEvent } from './fireEvent';\nimport { commonEventInfo, isLocked } from './util';\n\n/**\n * Action handler\n * @private\n * @param {Event} eventData javascript event that is doing the transform\n * @param {Object} transform javascript object containing a series of information around the current transform\n * @param {number} x current mouse x position, canvas normalized\n * @param {number} y current mouse y position, canvas normalized\n * @return {Boolean} true if the translation occurred\n */\nexport const dragHandler: TransformActionHandler = (\n eventData,\n transform,\n x,\n y,\n) => {\n const { target, offsetX, offsetY } = transform,\n newLeft = x - offsetX,\n newTop = y - offsetY,\n moveX = !isLocked(target, 'lockMovementX') && target.left !== newLeft,\n moveY = !isLocked(target, 'lockMovementY') && target.top !== newTop;\n moveX && target.set(LEFT, newLeft);\n moveY && target.set(TOP, newTop);\n if (moveX || moveY) {\n fireEvent(MOVING, commonEventInfo(eventData, transform, x, y));\n }\n return moveX || moveY;\n};\n","/**\n * Map of the 148 color names with HEX code\n * @see: https://www.w3.org/TR/css3-color/#svg-color\n */\nexport const ColorNameMap = {\n aliceblue: '#F0F8FF',\n antiquewhite: '#FAEBD7',\n aqua: '#0FF',\n aquamarine: '#7FFFD4',\n azure: '#F0FFFF',\n beige: '#F5F5DC',\n bisque: '#FFE4C4',\n black: '#000',\n blanchedalmond: '#FFEBCD',\n blue: '#00F',\n blueviolet: '#8A2BE2',\n brown: '#A52A2A',\n burlywood: '#DEB887',\n cadetblue: '#5F9EA0',\n chartreuse: '#7FFF00',\n chocolate: '#D2691E',\n coral: '#FF7F50',\n cornflowerblue: '#6495ED',\n cornsilk: '#FFF8DC',\n crimson: '#DC143C',\n cyan: '#0FF',\n darkblue: '#00008B',\n darkcyan: '#008B8B',\n darkgoldenrod: '#B8860B',\n darkgray: '#A9A9A9',\n darkgrey: '#A9A9A9',\n darkgreen: '#006400',\n darkkhaki: '#BDB76B',\n darkmagenta: '#8B008B',\n darkolivegreen: '#556B2F',\n darkorange: '#FF8C00',\n darkorchid: '#9932CC',\n darkred: '#8B0000',\n darksalmon: '#E9967A',\n darkseagreen: '#8FBC8F',\n darkslateblue: '#483D8B',\n darkslategray: '#2F4F4F',\n darkslategrey: '#2F4F4F',\n darkturquoise: '#00CED1',\n darkviolet: '#9400D3',\n deeppink: '#FF1493',\n deepskyblue: '#00BFFF',\n dimgray: '#696969',\n dimgrey: '#696969',\n dodgerblue: '#1E90FF',\n firebrick: '#B22222',\n floralwhite: '#FFFAF0',\n forestgreen: '#228B22',\n fuchsia: '#F0F',\n gainsboro: '#DCDCDC',\n ghostwhite: '#F8F8FF',\n gold: '#FFD700',\n goldenrod: '#DAA520',\n gray: '#808080',\n grey: '#808080',\n green: '#008000',\n greenyellow: '#ADFF2F',\n honeydew: '#F0FFF0',\n hotpink: '#FF69B4',\n indianred: '#CD5C5C',\n indigo: '#4B0082',\n ivory: '#FFFFF0',\n khaki: '#F0E68C',\n lavender: '#E6E6FA',\n lavenderblush: '#FFF0F5',\n lawngreen: '#7CFC00',\n lemonchiffon: '#FFFACD',\n lightblue: '#ADD8E6',\n lightcoral: '#F08080',\n lightcyan: '#E0FFFF',\n lightgoldenrodyellow: '#FAFAD2',\n lightgray: '#D3D3D3',\n lightgrey: '#D3D3D3',\n lightgreen: '#90EE90',\n lightpink: '#FFB6C1',\n lightsalmon: '#FFA07A',\n lightseagreen: '#20B2AA',\n lightskyblue: '#87CEFA',\n lightslategray: '#789',\n lightslategrey: '#789',\n lightsteelblue: '#B0C4DE',\n lightyellow: '#FFFFE0',\n lime: '#0F0',\n limegreen: '#32CD32',\n linen: '#FAF0E6',\n magenta: '#F0F',\n maroon: '#800000',\n mediumaquamarine: '#66CDAA',\n mediumblue: '#0000CD',\n mediumorchid: '#BA55D3',\n mediumpurple: '#9370DB',\n mediumseagreen: '#3CB371',\n mediumslateblue: '#7B68EE',\n mediumspringgreen: '#00FA9A',\n mediumturquoise: '#48D1CC',\n mediumvioletred: '#C71585',\n midnightblue: '#191970',\n mintcream: '#F5FFFA',\n mistyrose: '#FFE4E1',\n moccasin: '#FFE4B5',\n navajowhite: '#FFDEAD',\n navy: '#000080',\n oldlace: '#FDF5E6',\n olive: '#808000',\n olivedrab: '#6B8E23',\n orange: '#FFA500',\n orangered: '#FF4500',\n orchid: '#DA70D6',\n palegoldenrod: '#EEE8AA',\n palegreen: '#98FB98',\n paleturquoise: '#AFEEEE',\n palevioletred: '#DB7093',\n papayawhip: '#FFEFD5',\n peachpuff: '#FFDAB9',\n peru: '#CD853F',\n pink: '#FFC0CB',\n plum: '#DDA0DD',\n powderblue: '#B0E0E6',\n purple: '#800080',\n rebeccapurple: '#639',\n red: '#F00',\n rosybrown: '#BC8F8F',\n royalblue: '#4169E1',\n saddlebrown: '#8B4513',\n salmon: '#FA8072',\n sandybrown: '#F4A460',\n seagreen: '#2E8B57',\n seashell: '#FFF5EE',\n sienna: '#A0522D',\n silver: '#C0C0C0',\n skyblue: '#87CEEB',\n slateblue: '#6A5ACD',\n slategray: '#708090',\n slategrey: '#708090',\n snow: '#FFFAFA',\n springgreen: '#00FF7F',\n steelblue: '#4682B4',\n tan: '#D2B48C',\n teal: '#008080',\n thistle: '#D8BFD8',\n tomato: '#FF6347',\n turquoise: '#40E0D0',\n violet: '#EE82EE',\n wheat: '#F5DEB3',\n white: '#FFF',\n whitesmoke: '#F5F5F5',\n yellow: '#FF0',\n yellowgreen: '#9ACD32',\n};\n","/**\n * Regex matching color in RGB or RGBA formats (ex: `rgb(0, 0, 0)`, `rgba(255, 100, 10, 0.5)`, `rgba( 255 , 100 , 10 , 0.5 )`, `rgb(1,1,1)`, `rgba(100%, 60%, 10%, 0.5)`)\n * Also matching rgba(r g b / a) as per new specs\n * https://developer.mozilla.org/en-US/docs/Web/CSS/color_value/rgb\n * Formal syntax at the time of writing:\n * =\n * rgb( [ | none ]{3} [ / [ | none ] ]? ) |\n * rgb( [ | none ]{3} [ / [ | none ] ]? )\n * = | \n *\n * For learners this is how you can read this regex\n * Regular expression for matching an rgba or rgb CSS color value\n *\n * /^ # Beginning of the string\n * rgba? # \"rgb\" or \"rgba\"\n * \\(\\s* # Opening parenthesis and optional whitespace\n * (\\d{0,3} # 0 to three digits R channel\n * (?:\\.\\d+)? # Optional decimal with one or more digits\n * ) # End of capturing group for the first color component\n * %? # Optional percent sign after the first color component\n * \\s* # Optional whitespace\n * [\\s|,] # Separator between color components can be a space or comma\n * \\s* # Optional whitespace\n * (\\d{0,3} # 0 to three digits G channel\n * (?:\\.\\d+)? # Optional decimal with one or more digits\n * ) # End of capturing group for the second color component\n * %? # Optional percent sign after the second color component\n * \\s* # Optional whitespace\n * [\\s|,] # Separator between color components can be a space or comma\n * \\s* # Optional whitespace\n * (\\d{0,3} # 0 to three digits B channel\n * (?:\\.\\d+)? # Optional decimal with one or more digits\n * ) # End of capturing group for the third color component\n * %? # Optional percent sign after the third color component\n * \\s* # Optional whitespace\n * (?: # Beginning of non-capturing group for alpha value\n * \\s* # Optional whitespace\n * [,/] # Comma or slash separator for alpha value\n * \\s* # Optional whitespace\n * (\\d{0,3} # Zero to three digits\n * (?:\\.\\d+)? # Optional decimal with one or more digits\n * ) # End of capturing group for alpha value\n * %? # Optional percent sign after alpha value\n * \\s* # Optional whitespace\n * )? # End of non-capturing group for alpha value (optional)\n * \\) # Closing parenthesis\n * $ # End of the string\n *\n * The alpha channel can be in the format 0.4 .7 or 1 or 73%\n *\n * WARNING this regex doesn't fail on off spec colors. it matches everything that could be a color.\n * So the spec does not allow for `rgba(30 , 45% 35, 49%)` but this will work anyways for us\n */\nexport const reRGBa = () =>\n /^rgba?\\(\\s*(\\d{0,3}(?:\\.\\d+)?%?)\\s*[\\s|,]\\s*(\\d{0,3}(?:\\.\\d+)?%?)\\s*[\\s|,]\\s*(\\d{0,3}(?:\\.\\d+)?%?)\\s*(?:\\s*[,/]\\s*(\\d{0,3}(?:\\.\\d+)?%?)\\s*)?\\)$/i;\n\n/**\n * Regex matching color in HSL or HSLA formats (ex: hsl(0, 0, 0), rgba(255, 100, 10, 0.5), rgba( 255 , 100 , 10 , 0.5 ), rgb(1,1,1), rgba(100%, 60%, 10%, 0.5))\n * Also matching rgba(r g b / a) as per new specs\n * https://developer.mozilla.org/en-US/docs/Web/CSS/color_value/hsl\n * Formal syntax at the time of writing:\n * =\n * hsl( [ | none ] [ | none ] [ | none ] [ / [ | none ] ]? )\n *\n * =\n * |\n * \n *\n * =\n * |\n * \n *\n * For learners this is how you can read this regex\n * Regular expression for matching an hsla or hsl CSS color value\n *\n * /^hsla?\\( // Matches the beginning of the string and the opening parenthesis of \"hsl\" or \"hsla\"\n * \\s* // Matches any whitespace characters (space, tab, etc.) zero or more times\n * (\\d{0,3} // Hue: 0 to three digits - start capture in a group\n * (?:\\.\\d+)? // Hue: Optional (non capture group) decimal with one or more digits.\n * (?:deg|turn|rad)? // Hue: Optionally include suffix deg or turn or rad\n * ) // Hue: End capture group\n * \\s* // Matches any whitespace characters zero or more times\n * [\\s|,] // Matches a space, tab or comma\n * \\s* // Matches any whitespace characters zero or more times\n * (\\d{0,3} // Saturation: 0 to three digits - start capture in a group\n * (?:\\.\\d+)? // Saturation: Optional decimal with one or more digits in a non-capturing group\n * %?) // Saturation: match optional % character and end capture group\n * \\s* // Matches any whitespace characters zero or more times\n * [\\s|,] // Matches a space, tab or comma\n * \\s* // Matches any whitespace characters zero or more times\n * (\\d{0,3} // Lightness: 0 to three digits - start capture in a group\n * (?:\\.\\d+)? // Lightness: Optional decimal with one or more digits in a non-capturing group\n * %?) // Lightness: match % character and end capture group\n * \\s* // Matches any whitespace characters zero or more times\n * (?: // Alpha: Begins a non-capturing group for the alpha value\n * \\s* // Matches any whitespace characters zero or more times\n * [,/] // Matches a comma or forward slash\n * \\s* // Matches any whitespace characters zero or more times\n * (\\d*(?:\\.\\d+)?%?) // Matches zero or more digits, optionally followed by a decimal point and one or more digits, followed by an optional percentage sign and captures it in a group\n * \\s* // Matches any whitespace characters zero or more times\n * )? // Makes the alpha value group optional\n * \\) // Matches the closing parenthesis\n * $/i // Matches the end of the string and sets the regular expression to case-insensitive mode\n *\n * WARNING this regex doesn't fail on off spec colors. It matches everything that could be a color.\n * So the spec does not allow `hsl(30 , 45% 35, 49%)` but this will work anyways for us.\n */\nexport const reHSLa = () =>\n /^hsla?\\(\\s*([+-]?\\d{0,3}(?:\\.\\d+)?(?:deg|turn|rad)?)\\s*[\\s|,]\\s*(\\d{0,3}(?:\\.\\d+)?%?)\\s*[\\s|,]\\s*(\\d{0,3}(?:\\.\\d+)?%?)\\s*(?:\\s*[,/]\\s*(\\d*(?:\\.\\d+)?%?)\\s*)?\\)$/i;\n\n/**\n * Regex matching color in HEX format (ex: #FF5544CC, #FF5555, 010155, aff)\n */\nexport const reHex = () => /^#?(([0-9a-f]){3,4}|([0-9a-f]{2}){3,4})$/i;\n","import type { TRGBAColorSource } from './typedefs';\n\n/**\n * @param {Number} p\n * @param {Number} q\n * @param {Number} t\n * @return {Number}\n */\nexport const hue2rgb = (p: number, q: number, t: number): number => {\n if (t < 0) {\n t += 1;\n }\n if (t > 1) {\n t -= 1;\n }\n if (t < 1 / 6) {\n return p + (q - p) * 6 * t;\n }\n if (t < 1 / 2) {\n return q;\n }\n if (t < 2 / 3) {\n return p + (q - p) * (2 / 3 - t) * 6;\n }\n return p;\n};\n\n/**\n * Adapted from {@link https://gist.github.com/mjackson/5311256 https://gist.github.com/mjackson}\n * @param {Number} r Red color value\n * @param {Number} g Green color value\n * @param {Number} b Blue color value\n * @param {Number} a Alpha color value pass through\n * @return {TRGBColorSource} Hsl color\n */\nexport const rgb2Hsl = (\n r: number,\n g: number,\n b: number,\n a: number,\n): TRGBAColorSource => {\n r /= 255;\n g /= 255;\n b /= 255;\n const maxValue = Math.max(r, g, b),\n minValue = Math.min(r, g, b);\n\n let h!: number, s: number;\n const l = (maxValue + minValue) / 2;\n\n if (maxValue === minValue) {\n h = s = 0; // achromatic\n } else {\n const d = maxValue - minValue;\n s = l > 0.5 ? d / (2 - maxValue - minValue) : d / (maxValue + minValue);\n switch (maxValue) {\n case r:\n h = (g - b) / d + (g < b ? 6 : 0);\n break;\n case g:\n h = (b - r) / d + 2;\n break;\n case b:\n h = (r - g) / d + 4;\n break;\n }\n h /= 6;\n }\n\n return [Math.round(h * 360), Math.round(s * 100), Math.round(l * 100), a];\n};\n\nexport const fromAlphaToFloat = (value = '1') =>\n parseFloat(value) / (value.endsWith('%') ? 100 : 1);\n\n/**\n * Convert a value in the inclusive range [0, 255] to hex\n */\nexport const hexify = (value: number) =>\n Math.min(Math.round(value), 255).toString(16).toUpperCase().padStart(2, '0');\n\n/**\n * Calculate the grey average value for rgb and pass through alpha\n */\nexport const greyAverage = ([\n r,\n g,\n b,\n a = 1,\n]: TRGBAColorSource): TRGBAColorSource => {\n const avg = Math.round(r * 0.3 + g * 0.59 + b * 0.11);\n return [avg, avg, avg, a];\n};\n","import { radiansToDegrees } from '../util/misc/radiansDegreesConversion';\nimport { ColorNameMap } from './color_map';\nimport { reHSLa, reHex, reRGBa } from './constants';\nimport type { TRGBAColorSource, TColorArg } from './typedefs';\nimport {\n hue2rgb,\n hexify,\n rgb2Hsl,\n fromAlphaToFloat,\n greyAverage,\n} from './util';\n\n/**\n * @class Color common color operations\n * @tutorial {@link http://fabricjs.com/fabric-intro-part-2/#colors colors}\n */\nexport class Color {\n declare private _source: TRGBAColorSource;\n isUnrecognised = false;\n\n /**\n *\n * @param {string} [color] optional in hex or rgb(a) or hsl format or from known color list\n */\n constructor(color?: TColorArg) {\n if (!color) {\n // we default to black as canvas does\n this.setSource([0, 0, 0, 1]);\n } else if (color instanceof Color) {\n this.setSource([...color._source]);\n } else if (Array.isArray(color)) {\n const [r, g, b, a = 1] = color;\n this.setSource([r, g, b, a]);\n } else {\n this.setSource(this._tryParsingColor(color));\n }\n }\n\n /**\n * @private\n * @param {string} [color] Color value to parse\n * @returns {TRGBAColorSource}\n */\n protected _tryParsingColor(color: string) {\n color = color.toLowerCase();\n if (color in ColorNameMap) {\n color = ColorNameMap[color as keyof typeof ColorNameMap];\n }\n return color === 'transparent'\n ? ([255, 255, 255, 0] as TRGBAColorSource)\n : Color.sourceFromHex(color) ||\n Color.sourceFromRgb(color) ||\n Color.sourceFromHsl(color) ||\n // color is not recognized\n // we default to black as canvas does\n // eslint-disable-next-line no-constant-binary-expression\n ((this.isUnrecognised = true) && ([0, 0, 0, 1] as TRGBAColorSource));\n }\n\n /**\n * Returns source of this color (where source is an array representation; ex: [200, 200, 100, 1])\n * @return {TRGBAColorSource}\n */\n getSource() {\n return this._source;\n }\n\n /**\n * Sets source of this color (where source is an array representation; ex: [200, 200, 100, 1])\n * @param {TRGBAColorSource} source\n */\n setSource(source: TRGBAColorSource) {\n this._source = source;\n }\n\n /**\n * Returns color representation in RGB format\n * @return {String} ex: rgb(0-255,0-255,0-255)\n */\n toRgb() {\n const [r, g, b] = this.getSource();\n return `rgb(${r},${g},${b})`;\n }\n\n /**\n * Returns color representation in RGBA format\n * @return {String} ex: rgba(0-255,0-255,0-255,0-1)\n */\n toRgba() {\n return `rgba(${this.getSource().join(',')})`;\n }\n\n /**\n * Returns color representation in HSL format\n * @return {String} ex: hsl(0-360,0%-100%,0%-100%)\n */\n toHsl() {\n const [h, s, l] = rgb2Hsl(...this.getSource());\n return `hsl(${h},${s}%,${l}%)`;\n }\n\n /**\n * Returns color representation in HSLA format\n * @return {String} ex: hsla(0-360,0%-100%,0%-100%,0-1)\n */\n toHsla() {\n const [h, s, l, a] = rgb2Hsl(...this.getSource());\n return `hsla(${h},${s}%,${l}%,${a})`;\n }\n\n /**\n * Returns color representation in HEX format\n * @return {String} ex: FF5555\n */\n toHex() {\n const fullHex = this.toHexa();\n return fullHex.slice(0, 6);\n }\n\n /**\n * Returns color representation in HEXA format\n * @return {String} ex: FF5555CC\n */\n toHexa() {\n const [r, g, b, a] = this.getSource();\n return `${hexify(r)}${hexify(g)}${hexify(b)}${hexify(Math.round(a * 255))}`;\n }\n\n /**\n * Gets value of alpha channel for this color\n * @return {Number} 0-1\n */\n getAlpha() {\n return this.getSource()[3];\n }\n\n /**\n * Sets value of alpha channel for this color\n * @param {Number} alpha Alpha value 0-1\n * @return {Color} thisArg\n */\n setAlpha(alpha: number) {\n this._source[3] = alpha;\n return this;\n }\n\n /**\n * Transforms color to its grayscale representation\n * @return {Color} thisArg\n */\n toGrayscale() {\n this.setSource(greyAverage(this.getSource()));\n return this;\n }\n\n /**\n * Transforms color to its black and white representation\n * @param {Number} threshold\n * @return {Color} thisArg\n */\n toBlackWhite(threshold: number) {\n const [average, , , a] = greyAverage(this.getSource()),\n bOrW = average < (threshold || 127) ? 0 : 255;\n this.setSource([bOrW, bOrW, bOrW, a]);\n return this;\n }\n\n /**\n * Overlays color with another color\n * @param {String|Color} otherColor\n * @return {Color} thisArg\n */\n overlayWith(otherColor: string | Color) {\n if (!(otherColor instanceof Color)) {\n otherColor = new Color(otherColor);\n }\n\n const source = this.getSource(),\n otherAlpha = 0.5,\n otherSource = otherColor.getSource(),\n [R, G, B] = source.map((value, index) =>\n Math.round(value * (1 - otherAlpha) + otherSource[index] * otherAlpha),\n );\n\n this.setSource([R, G, B, source[3]]);\n return this;\n }\n\n /**\n * Returns new color object, when given a color in RGB format\n * @param {String} color Color value ex: rgb(0-255,0-255,0-255)\n * @return {Color}\n */\n static fromRgb(color: string): Color {\n return Color.fromRgba(color);\n }\n\n /**\n * Returns new color object, when given a color in RGBA format\n * @function\n * @param {String} color\n * @return {Color}\n */\n static fromRgba(color: string): Color {\n return new Color(Color.sourceFromRgb(color));\n }\n\n /**\n * Returns array representation (ex: [100, 100, 200, 1]) of a color that's in RGB or RGBA format\n * @param {String} color Color value ex: rgb(0-255,0-255,0-255), rgb(0%-100%,0%-100%,0%-100%)\n * @return {TRGBAColorSource | undefined} source\n */\n static sourceFromRgb(color: string): TRGBAColorSource | undefined {\n const match = color.match(reRGBa());\n if (match) {\n const [r, g, b] = match.slice(1, 4).map((value) => {\n const parsedValue = parseFloat(value);\n return value.endsWith('%')\n ? Math.round(parsedValue * 2.55)\n : parsedValue;\n });\n return [r, g, b, fromAlphaToFloat(match[4])];\n }\n }\n\n /**\n * Returns new color object, when given a color in HSL format\n * @param {String} color Color value ex: hsl(0-260,0%-100%,0%-100%)\n * @return {Color}\n */\n static fromHsl(color: string): Color {\n return Color.fromHsla(color);\n }\n\n /**\n * Returns new color object, when given a color in HSLA format\n * @function\n * @param {String} color\n * @return {Color}\n */\n static fromHsla(color: string): Color {\n return new Color(Color.sourceFromHsl(color));\n }\n\n /**\n * Returns array representation (ex: [100, 100, 200, 1]) of a color that's in HSL or HSLA format.\n * Adapted from https://github.com/mjijackson\n * @param {String} color Color value ex: hsl(0-360,0%-100%,0%-100%) or hsla(0-360,0%-100%,0%-100%, 0-1)\n * @return {TRGBAColorSource | undefined} source\n * @see http://http://www.w3.org/TR/css3-color/#hsl-color\n */\n static sourceFromHsl(color: string): TRGBAColorSource | undefined {\n const match = color.match(reHSLa());\n if (!match) {\n return;\n }\n const match1degrees = Color.parseAngletoDegrees(match[1]);\n\n const h = (((match1degrees % 360) + 360) % 360) / 360,\n s = parseFloat(match[2]) / 100,\n l = parseFloat(match[3]) / 100;\n let r: number, g: number, b: number;\n\n if (s === 0) {\n r = g = b = l;\n } else {\n const q = l <= 0.5 ? l * (s + 1) : l + s - l * s,\n p = l * 2 - q;\n\n r = hue2rgb(p, q, h + 1 / 3);\n g = hue2rgb(p, q, h);\n b = hue2rgb(p, q, h - 1 / 3);\n }\n\n return [\n Math.round(r * 255),\n Math.round(g * 255),\n Math.round(b * 255),\n fromAlphaToFloat(match[4]),\n ];\n }\n\n /**\n * Returns new color object, when given a color in HEX format\n * @param {String} color Color value ex: FF5555\n * @return {Color}\n */\n static fromHex(color: string): Color {\n return new Color(Color.sourceFromHex(color));\n }\n\n /**\n * Returns array representation (ex: [100, 100, 200, 1]) of a color that's in HEX format\n * @param {String} color ex: FF5555 or FF5544CC (RGBa)\n * @return {TRGBAColorSource | undefined} source\n */\n static sourceFromHex(color: string): TRGBAColorSource | undefined {\n if (color.match(reHex())) {\n const value = color.slice(color.indexOf('#') + 1),\n isShortNotation = value.length <= 4;\n let expandedValue: string[];\n if (isShortNotation) {\n expandedValue = value.split('').map((hex) => hex + hex);\n } else {\n expandedValue = value.match(/.{2}/g)!;\n }\n const [r, g, b, a = 255] = expandedValue.map((hexCouple) =>\n parseInt(hexCouple, 16),\n );\n return [r, g, b, a / 255];\n }\n }\n\n /**\n * Converts a string that could be any angle notation (50deg, 0.5turn, 2rad)\n * into degrees without the 'deg' suffix\n * @param {String} value ex: 0deg, 0.5turn, 2rad\n * @return {Number} number in degrees or NaN if inputs are invalid\n */\n static parseAngletoDegrees(value: string): number {\n const lowercase = value.toLowerCase();\n const numeric = parseFloat(lowercase);\n\n if (lowercase.includes('rad')) {\n return radiansToDegrees(numeric);\n }\n\n if (lowercase.includes('turn')) {\n return numeric * 360;\n }\n\n // Value is probably just a number already in degrees eg '50'\n return numeric;\n }\n}\n","import { Color } from '../../color/Color';\nimport { config } from '../../config';\nimport { DEFAULT_SVG_FONT_SIZE, FILL, NONE } from '../../constants';\nimport type { TBBox, SVGElementName, SupportedSVGUnit } from '../../typedefs';\nimport { toFixed } from './toFixed';\n\n/**\n * Returns array of attributes for given svg that fabric parses\n * @param {SVGElementName} type Type of svg element (eg. 'circle')\n * @return {Array} string names of supported attributes\n */\nexport const getSvgAttributes = (type: SVGElementName) => {\n const commonAttributes = ['instantiated_by_use', 'style', 'id', 'class'];\n switch (type) {\n case 'linearGradient':\n return commonAttributes.concat([\n 'x1',\n 'y1',\n 'x2',\n 'y2',\n 'gradientUnits',\n 'gradientTransform',\n ]);\n case 'radialGradient':\n return commonAttributes.concat([\n 'gradientUnits',\n 'gradientTransform',\n 'cx',\n 'cy',\n 'r',\n 'fx',\n 'fy',\n 'fr',\n ]);\n case 'stop':\n return commonAttributes.concat(['offset', 'stop-color', 'stop-opacity']);\n }\n return commonAttributes;\n};\n\n/**\n * Converts from attribute value to pixel value if applicable.\n * Returns converted pixels or original value not converted.\n * @param {string} value number to operate on\n * @param {number} fontSize\n * @return {number}\n */\nexport const parseUnit = (value: string, fontSize = DEFAULT_SVG_FONT_SIZE) => {\n const unit = /\\D{0,2}$/.exec(value),\n number = parseFloat(value);\n const dpi = config.DPI;\n switch (unit?.[0] as SupportedSVGUnit) {\n case 'mm':\n return (number * dpi) / 25.4;\n\n case 'cm':\n return (number * dpi) / 2.54;\n\n case 'in':\n return number * dpi;\n\n case 'pt':\n return (number * dpi) / 72; // or * 4 / 3\n\n case 'pc':\n return ((number * dpi) / 72) * 12; // or * 16\n\n case 'em':\n return number * fontSize;\n\n default:\n return number;\n }\n};\n\nexport type MeetOrSlice = 'meet' | 'slice';\n\nexport type MinMidMax = 'Min' | 'Mid' | 'Max' | 'none';\n\nexport type TPreserveArParsed = {\n meetOrSlice: MeetOrSlice;\n alignX: MinMidMax;\n alignY: MinMidMax;\n};\n\n// align can be either none or undefined or a combination of mid/max\nconst parseAlign = (align: string): MinMidMax[] => {\n //divide align in alignX and alignY\n if (align && align !== NONE) {\n return [align.slice(1, 4) as MinMidMax, align.slice(5, 8) as MinMidMax];\n } else if (align === NONE) {\n return [align, align];\n }\n return ['Mid', 'Mid'];\n};\n\n/**\n * Parse preserveAspectRatio attribute from element\n * https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/preserveAspectRatio\n * @param {string} attribute to be parsed\n * @return {Object} an object containing align and meetOrSlice attribute\n */\nexport const parsePreserveAspectRatioAttribute = (\n attribute: string,\n): TPreserveArParsed => {\n const [firstPart, secondPart] = attribute.trim().split(' ') as [\n MinMidMax,\n MeetOrSlice | undefined,\n ];\n const [alignX, alignY] = parseAlign(firstPart);\n return {\n meetOrSlice: secondPart || 'meet',\n alignX,\n alignY,\n };\n};\n\n/**\n * Adobe Illustrator (at least CS5) is unable to render rgba()-based fill values\n * we work around it by \"moving\" alpha channel into opacity attribute and setting fill's alpha to 1\n * @param prop\n * @param value\n * @param {boolean} inlineStyle The default is inline style, the separator used is \":\", The other is \"=\"\n * @returns\n */\nexport const colorPropToSVG = (\n prop: string,\n value?: any,\n inlineStyle = true,\n) => {\n let colorValue;\n let opacityValue;\n if (!value) {\n colorValue = 'none';\n } else if (value.toLive) {\n colorValue = `url(#SVGID_${value.id})`;\n } else {\n const color = new Color(value),\n opacity = color.getAlpha();\n\n colorValue = color.toRgb();\n if (opacity !== 1) {\n opacityValue = opacity.toString();\n }\n }\n if (inlineStyle) {\n return `${prop}: ${colorValue}; ${\n opacityValue ? `${prop}-opacity: ${opacityValue}; ` : ''\n }`;\n } else {\n return `${prop}=\"${colorValue}\" ${\n opacityValue ? `${prop}-opacity=\"${opacityValue}\" ` : ''\n }`;\n }\n};\n\nexport const createSVGRect = (\n color: string,\n { left, top, width, height }: TBBox,\n precision = config.NUM_FRACTION_DIGITS,\n) => {\n const svgColor = colorPropToSVG(FILL, color, false);\n const [x, y, w, h] = [left, top, width, height].map((value) =>\n toFixed(value, precision),\n );\n return ``;\n};\n","import type { TSVGReviver } from '../../typedefs';\nimport { uid } from '../../util/internals/uid';\nimport { colorPropToSVG } from '../../util/misc/svgParsing';\nimport { FILL, NONE, STROKE } from '../../constants';\nimport type { FabricObject } from './FabricObject';\nimport { isFiller } from '../../util/typeAssertions';\nimport { matrixToSVG } from '../../util/misc/svgExport';\n\nexport class FabricObjectSVGExportMixin {\n /**\n * When an object is being exported as SVG as a clippath, a reference inside the SVG is needed.\n * This reference is a UID in the fabric namespace and is temporary stored here.\n * @type {String}\n */\n declare clipPathId?: string;\n\n /**\n * Returns styles-string for svg-export\n * @param {Boolean} skipShadow a boolean to skip shadow filter output\n * @return {String}\n */\n getSvgStyles(\n this: FabricObjectSVGExportMixin & FabricObject,\n skipShadow?: boolean,\n ) {\n const fillRule = this.fillRule ? this.fillRule : 'nonzero',\n strokeWidth = this.strokeWidth ? this.strokeWidth : '0',\n strokeDashArray = this.strokeDashArray\n ? this.strokeDashArray.join(' ')\n : NONE,\n strokeDashOffset = this.strokeDashOffset ? this.strokeDashOffset : '0',\n strokeLineCap = this.strokeLineCap ? this.strokeLineCap : 'butt',\n strokeLineJoin = this.strokeLineJoin ? this.strokeLineJoin : 'miter',\n strokeMiterLimit = this.strokeMiterLimit ? this.strokeMiterLimit : '4',\n opacity = typeof this.opacity !== 'undefined' ? this.opacity : '1',\n visibility = this.visible ? '' : ' visibility: hidden;',\n filter = skipShadow ? '' : this.getSvgFilter(),\n fill = colorPropToSVG(FILL, this.fill),\n stroke = colorPropToSVG(STROKE, this.stroke);\n\n return [\n stroke,\n 'stroke-width: ',\n strokeWidth,\n '; ',\n 'stroke-dasharray: ',\n strokeDashArray,\n '; ',\n 'stroke-linecap: ',\n strokeLineCap,\n '; ',\n 'stroke-dashoffset: ',\n strokeDashOffset,\n '; ',\n 'stroke-linejoin: ',\n strokeLineJoin,\n '; ',\n 'stroke-miterlimit: ',\n strokeMiterLimit,\n '; ',\n fill,\n 'fill-rule: ',\n fillRule,\n '; ',\n 'opacity: ',\n opacity,\n ';',\n filter,\n visibility,\n ].join('');\n }\n\n /**\n * Returns filter for svg shadow\n * @return {String}\n */\n getSvgFilter(this: FabricObjectSVGExportMixin & FabricObject) {\n return this.shadow ? `filter: url(#SVGID_${this.shadow.id});` : '';\n }\n\n /**\n * Returns id attribute for svg output\n * @return {String}\n */\n getSvgCommons(\n this: FabricObjectSVGExportMixin & FabricObject & { id?: string },\n ) {\n return [\n this.id ? `id=\"${this.id}\" ` : '',\n this.clipPath\n ? `clip-path=\"url(#${\n (this.clipPath as FabricObjectSVGExportMixin & FabricObject)\n .clipPathId\n })\" `\n : '',\n ].join('');\n }\n\n /**\n * Returns transform-string for svg-export\n * @param {Boolean} use the full transform or the single object one.\n * @return {String}\n */\n getSvgTransform(\n this: FabricObjectSVGExportMixin & FabricObject,\n full?: boolean,\n additionalTransform = '',\n ) {\n const transform = full ? this.calcTransformMatrix() : this.calcOwnMatrix(),\n svgTransform = `transform=\"${matrixToSVG(transform)}`;\n return `${svgTransform}${additionalTransform}\" `;\n }\n\n /**\n * Returns svg representation of an instance\n * This function is implemented in each subclass\n * This is just because typescript otherwise cryies all the time\n * @return {Array} an array of strings with the specific svg representation\n * of the instance\n */\n _toSVG(_reviver?: TSVGReviver): string[] {\n return [''];\n }\n\n /**\n * Returns svg representation of an instance\n * @param {TSVGReviver} [reviver] Method for further parsing of svg representation.\n * @return {String} svg representation of an instance\n */\n toSVG(\n this: FabricObjectSVGExportMixin & FabricObject,\n reviver?: TSVGReviver,\n ) {\n return this._createBaseSVGMarkup(this._toSVG(reviver), {\n reviver,\n });\n }\n\n /**\n * Returns svg clipPath representation of an instance\n * @param {TSVGReviver} [reviver] Method for further parsing of svg representation.\n * @return {String} svg representation of an instance\n */\n toClipPathSVG(\n this: FabricObjectSVGExportMixin & FabricObject,\n reviver?: TSVGReviver,\n ) {\n return (\n '\\t' +\n this._createBaseClipPathSVGMarkup(this._toSVG(reviver), {\n reviver,\n })\n );\n }\n\n /**\n * @private\n */\n _createBaseClipPathSVGMarkup(\n this: FabricObjectSVGExportMixin & FabricObject,\n objectMarkup: string[],\n {\n reviver,\n additionalTransform = '',\n }: { reviver?: TSVGReviver; additionalTransform?: string } = {},\n ) {\n const commonPieces = [\n this.getSvgTransform(true, additionalTransform),\n this.getSvgCommons(),\n ].join(''),\n // insert commons in the markup, style and svgCommons\n index = objectMarkup.indexOf('COMMON_PARTS');\n objectMarkup[index] = commonPieces;\n return reviver ? reviver(objectMarkup.join('')) : objectMarkup.join('');\n }\n\n /**\n * @private\n */\n _createBaseSVGMarkup(\n this: FabricObjectSVGExportMixin & FabricObject,\n objectMarkup: string[],\n {\n noStyle,\n reviver,\n withShadow,\n additionalTransform,\n }: {\n noStyle?: boolean;\n reviver?: TSVGReviver;\n withShadow?: boolean;\n additionalTransform?: string;\n } = {},\n ): string {\n const styleInfo = noStyle ? '' : `style=\"${this.getSvgStyles()}\" `,\n shadowInfo = withShadow ? `style=\"${this.getSvgFilter()}\" ` : '',\n clipPath = this.clipPath as FabricObjectSVGExportMixin & FabricObject,\n vectorEffect = this.strokeUniform\n ? 'vector-effect=\"non-scaling-stroke\" '\n : '',\n absoluteClipPath = clipPath && clipPath.absolutePositioned,\n stroke = this.stroke,\n fill = this.fill,\n shadow = this.shadow,\n markup = [],\n // insert commons in the markup, style and svgCommons\n index = objectMarkup.indexOf('COMMON_PARTS');\n let clipPathMarkup;\n if (clipPath) {\n clipPath.clipPathId = `CLIPPATH_${uid()}`;\n clipPathMarkup = `\\n${clipPath.toClipPathSVG(reviver)}\\n`;\n }\n if (absoluteClipPath) {\n markup.push('\\n');\n }\n markup.push(\n '\\n',\n );\n const commonPieces = [\n styleInfo,\n vectorEffect,\n noStyle ? '' : this.addPaintOrder(),\n ' ',\n additionalTransform ? `transform=\"${additionalTransform}\" ` : '',\n ].join('');\n objectMarkup[index] = commonPieces;\n if (isFiller(fill)) {\n markup.push(fill.toSVG(this));\n }\n if (isFiller(stroke)) {\n markup.push(stroke.toSVG(this));\n }\n if (shadow) {\n markup.push(shadow.toSVG(this));\n }\n if (clipPath) {\n markup.push(clipPathMarkup);\n }\n markup.push(objectMarkup.join(''));\n markup.push('\\n');\n absoluteClipPath && markup.push('\\n');\n return reviver ? reviver(markup.join('')) : markup.join('');\n }\n\n addPaintOrder(this: FabricObjectSVGExportMixin & FabricObject) {\n return this.paintFirst !== FILL ? ` paint-order=\"${this.paintFirst}\" ` : '';\n }\n}\n","export function getSvgRegex(arr: string[]) {\n return new RegExp('^(' + arr.join('|') + ')\\\\b', 'i');\n}\n","import { FILL, LEFT, STROKE, reNewline } from '../../constants';\nimport type { TClassProperties } from '../../typedefs';\nimport type { FabricText } from './Text';\n\nexport const TEXT_DECORATION_THICKNESS = 'textDecorationThickness';\n\nconst fontProperties = [\n 'fontSize',\n 'fontWeight',\n 'fontFamily',\n 'fontStyle',\n] as const;\n\nexport const textDecorationProperties = [\n 'underline',\n 'overline',\n 'linethrough',\n] as const;\n\nexport const textLayoutProperties: string[] = [\n ...fontProperties,\n 'lineHeight',\n 'text',\n 'charSpacing',\n 'textAlign',\n 'styles',\n 'path',\n 'pathStartOffset',\n 'pathSide',\n 'pathAlign',\n];\n\nexport const additionalProps = [\n ...textLayoutProperties,\n ...textDecorationProperties,\n 'textBackgroundColor',\n 'direction',\n TEXT_DECORATION_THICKNESS,\n] as const;\n\nexport type StylePropertiesType =\n | 'fill'\n | 'stroke'\n | 'strokeWidth'\n | 'fontSize'\n | 'fontFamily'\n | 'fontWeight'\n | 'fontStyle'\n | 'textBackgroundColor'\n | 'deltaY'\n | 'overline'\n | 'underline'\n | 'linethrough'\n | typeof TEXT_DECORATION_THICKNESS;\n\nexport const styleProperties: Readonly = [\n ...fontProperties,\n ...textDecorationProperties,\n STROKE,\n 'strokeWidth',\n FILL,\n 'deltaY',\n 'textBackgroundColor',\n TEXT_DECORATION_THICKNESS,\n] as const;\n\n// @TODO: Many things here are configuration related and shouldn't be on the class nor prototype\n// regexes, list of properties that are not suppose to change by instances, magic consts.\n// this will be a separated effort\nexport const textDefaultValues: Partial> = {\n _reNewline: reNewline,\n _reSpacesAndTabs: /[ \\t\\r]/g,\n _reSpaceAndTab: /[ \\t\\r]/,\n _reWords: /\\S+/g,\n fontSize: 40,\n fontWeight: 'normal',\n fontFamily: 'Times New Roman',\n underline: false,\n overline: false,\n linethrough: false,\n textAlign: LEFT,\n fontStyle: 'normal',\n lineHeight: 1.16,\n textBackgroundColor: '',\n stroke: null,\n shadow: null,\n path: undefined,\n pathStartOffset: 0,\n pathSide: LEFT,\n pathAlign: 'baseline',\n charSpacing: 0,\n deltaY: 0,\n direction: 'ltr',\n CACHE_FONT_SIZE: 400,\n MIN_TEXT_WIDTH: 2,\n // Text magic numbers\n superscript: {\n size: 0.6, // fontSize factor\n baseline: -0.35, // baseline-shift factor (upwards)\n },\n subscript: {\n size: 0.6, // fontSize factor\n baseline: 0.11, // baseline-shift factor (downwards)\n },\n _fontSizeFraction: 0.222,\n offsets: {\n underline: 0.1,\n linethrough: -0.28167, // added 1/30 to original number\n overline: -0.81333, // added 1/15 to original number\n },\n _fontSizeMult: 1.13,\n [TEXT_DECORATION_THICKNESS]: 66.667, // before implementation was 1/15\n};\n\nexport const JUSTIFY = 'justify';\nexport const JUSTIFY_LEFT = 'justify-left';\nexport const JUSTIFY_RIGHT = 'justify-right';\nexport const JUSTIFY_CENTER = 'justify-center';\n","import { getSvgRegex } from './getSvgRegex';\nimport { LEFT, TOP } from '../constants';\nimport { TEXT_DECORATION_THICKNESS } from '../shapes/Text/constants';\n\n// matches, e.g.: +14.56e-12, etc.\nexport const reNum = String.raw`[-+]?(?:\\d*\\.\\d+|\\d+\\.?)(?:[eE][-+]?\\d+)?`;\nexport const viewportSeparator = String.raw`(?:\\s*,?\\s+|\\s*,\\s*)`;\n\nexport const svgNS = 'http://www.w3.org/2000/svg';\n\nexport const reFontDeclaration = new RegExp(\n '(normal|italic)?\\\\s*(normal|small-caps)?\\\\s*' +\n '(normal|bold|bolder|lighter|100|200|300|400|500|600|700|800|900)?\\\\s*(' +\n reNum +\n '(?:px|cm|mm|em|pt|pc|in)*)(?:\\\\/(normal|' +\n reNum +\n '))?\\\\s+(.*)',\n);\n\nexport const svgValidTagNames = [\n 'path',\n 'circle',\n 'polygon',\n 'polyline',\n 'ellipse',\n 'rect',\n 'line',\n 'image',\n 'text',\n ],\n svgViewBoxElements = ['symbol', 'image', 'marker', 'pattern', 'view', 'svg'],\n svgInvalidAncestors = [\n 'pattern',\n 'defs',\n 'symbol',\n 'metadata',\n 'clipPath',\n 'mask',\n 'desc',\n ],\n svgValidParents = ['symbol', 'g', 'a', 'svg', 'clipPath', 'defs'],\n attributesMap = {\n cx: LEFT,\n x: LEFT,\n r: 'radius',\n cy: TOP,\n y: TOP,\n display: 'visible',\n visibility: 'visible',\n transform: 'transformMatrix',\n 'fill-opacity': 'fillOpacity',\n 'fill-rule': 'fillRule',\n 'font-family': 'fontFamily',\n 'font-size': 'fontSize',\n 'font-style': 'fontStyle',\n 'font-weight': 'fontWeight',\n 'letter-spacing': 'charSpacing',\n 'paint-order': 'paintFirst',\n 'stroke-dasharray': 'strokeDashArray',\n 'stroke-dashoffset': 'strokeDashOffset',\n 'stroke-linecap': 'strokeLineCap',\n 'stroke-linejoin': 'strokeLineJoin',\n 'stroke-miterlimit': 'strokeMiterLimit',\n 'stroke-opacity': 'strokeOpacity',\n 'stroke-width': 'strokeWidth',\n 'text-decoration': 'textDecoration',\n 'text-anchor': 'textAnchor',\n opacity: 'opacity',\n 'clip-path': 'clipPath',\n 'clip-rule': 'clipRule',\n 'vector-effect': 'strokeUniform',\n 'image-rendering': 'imageSmoothing',\n 'text-decoration-thickness': TEXT_DECORATION_THICKNESS,\n },\n fSize = 'font-size',\n cPath = 'clip-path';\n\nexport const svgValidTagNamesRegEx = getSvgRegex(svgValidTagNames);\n\nexport const svgViewBoxElementsRegEx = getSvgRegex(svgViewBoxElements);\n\nexport const svgValidParentsRegEx = getSvgRegex(svgValidParents);\n\n// http://www.w3.org/TR/SVG/coords.html#ViewBoxAttribute\n\nexport const reViewBoxAttrValue = new RegExp(\n String.raw`^\\s*(${reNum})${viewportSeparator}(${reNum})${viewportSeparator}(${reNum})${viewportSeparator}(${reNum})\\s*$`,\n);\n","import { classRegistry } from './ClassRegistry';\nimport { Color } from './color/Color';\nimport { config } from './config';\nimport { reNum } from './parser/constants';\nimport { Point } from './Point';\nimport type { FabricObject } from './shapes/Object/FabricObject';\nimport type { TClassProperties } from './typedefs';\nimport { uid } from './util/internals/uid';\nimport { pickBy } from './util/misc/pick';\nimport { degreesToRadians } from './util/misc/radiansDegreesConversion';\nimport { toFixed } from './util/misc/toFixed';\nimport { rotateVector } from './util/misc/vectors';\n\n/**\n * Regex matching shadow offsetX, offsetY and blur (ex: \"2px 2px 10px rgba(0,0,0,0.2)\", \"rgb(0,255,0) 2px 2px\")\n * - (?:\\s|^): This part captures either a whitespace character (\\s) or the beginning of a line (^). It's non-capturing (due to (?:...)), meaning it doesn't create a capturing group.\n * - (-?\\d+(?:\\.\\d*)?(?:px)?(?:\\s?|$))?: This captures the first component of the shadow, which is the horizontal offset. Breaking it down:\n * - (-?\\d+): Captures an optional minus sign followed by one or more digits (integer part of the number).\n * - (?:\\.\\d*)?: Optionally captures a decimal point followed by zero or more digits (decimal part of the number).\n * - (?:px)?: Optionally captures the \"px\" unit.\n * - (?:\\s?|$): Captures either an optional whitespace or the end of the line. This whole part is wrapped in a non-capturing group and marked as optional with ?.\n * - (-?\\d+(?:\\.\\d*)?(?:px)?(?:\\s?|$))?: Similar to the previous step, this captures the vertical offset.\n\n(\\d+(?:\\.\\d*)?(?:px)?)?: This captures the blur radius. It's similar to the horizontal offset but without the optional minus sign.\n\n(?:\\s+(-?\\d+(?:\\.\\d*)?(?:px)?(?:\\s?|$))?){0,1}: This captures an optional part for the color. It allows for whitespace followed by a component with an optional minus sign, digits, decimal point, and \"px\" unit.\n\n(?:$|\\s): This captures either the end of the line or a whitespace character. It ensures that the match ends either at the end of the string or with a whitespace character.\n */\n// eslint-disable-next-line max-len\n\nconst shadowOffsetRegex = '(-?\\\\d+(?:\\\\.\\\\d*)?(?:px)?(?:\\\\s?|$))?';\n\nconst reOffsetsAndBlur = new RegExp(\n '(?:\\\\s|^)' +\n shadowOffsetRegex +\n shadowOffsetRegex +\n '(' +\n reNum +\n '?(?:px)?)?(?:\\\\s?|$)(?:$|\\\\s)',\n);\n\nexport const shadowDefaultValues: Partial> = {\n color: 'rgb(0,0,0)',\n blur: 0,\n offsetX: 0,\n offsetY: 0,\n affectStroke: false,\n includeDefaultValues: true,\n nonScaling: false,\n};\n\nexport type SerializedShadowOptions = {\n color: string;\n blur: number;\n offsetX: number;\n offsetY: number;\n affectStroke: boolean;\n nonScaling: boolean;\n type: string;\n};\n\nexport class Shadow {\n /**\n * Shadow color\n * @type String\n */\n declare color: string;\n\n /**\n * Shadow blur\n * @type Number\n */\n declare blur: number;\n\n /**\n * Shadow horizontal offset\n * @type Number\n */\n declare offsetX: number;\n\n /**\n * Shadow vertical offset\n * @type Number\n */\n declare offsetY: number;\n\n /**\n * Whether the shadow should affect stroke operations\n * @type Boolean\n */\n declare affectStroke: boolean;\n\n /**\n * Indicates whether toObject should include default values\n * @type Boolean\n */\n declare includeDefaultValues: boolean;\n\n /**\n * When `false`, the shadow will scale with the object.\n * When `true`, the shadow's offsetX, offsetY, and blur will not be affected by the object's scale.\n * default to false\n * @type Boolean\n */\n declare nonScaling: boolean;\n\n declare id: number;\n\n static ownDefaults = shadowDefaultValues;\n\n static type = 'shadow';\n\n /**\n * @see {@link http://fabricjs.com/shadows|Shadow demo}\n * @param {Object|String} [options] Options object with any of color, blur, offsetX, offsetY properties or string (e.g. \"rgba(0,0,0,0.2) 2px 2px 10px\")\n */\n constructor(options?: Partial>);\n constructor(svgAttribute: string);\n constructor(arg0: string | Partial> = {}) {\n const options: Partial> =\n typeof arg0 === 'string' ? Shadow.parseShadow(arg0) : arg0;\n Object.assign(this, Shadow.ownDefaults, options);\n this.id = uid();\n }\n\n /**\n * @param {String} value Shadow value to parse\n * @return {Object} Shadow object with color, offsetX, offsetY and blur\n */\n static parseShadow(value: string) {\n const shadowStr = value.trim(),\n [, offsetX = 0, offsetY = 0, blur = 0] = (\n reOffsetsAndBlur.exec(shadowStr) || []\n ).map((value) => parseFloat(value) || 0),\n color = (shadowStr.replace(reOffsetsAndBlur, '') || 'rgb(0,0,0)').trim();\n\n return {\n color,\n offsetX,\n offsetY,\n blur,\n };\n }\n\n /**\n * Returns a string representation of an instance\n * @see http://www.w3.org/TR/css-text-decor-3/#text-shadow\n * @return {String} Returns CSS3 text-shadow declaration\n */\n toString() {\n return [this.offsetX, this.offsetY, this.blur, this.color].join('px ');\n }\n\n /**\n * Returns SVG representation of a shadow\n * @param {FabricObject} object\n * @return {String} SVG representation of a shadow\n */\n toSVG(object: FabricObject) {\n const offset = rotateVector(\n new Point(this.offsetX, this.offsetY),\n degreesToRadians(-object.angle),\n ),\n BLUR_BOX = 20,\n color = new Color(this.color);\n let fBoxX = 40,\n fBoxY = 40;\n\n if (object.width && object.height) {\n //http://www.w3.org/TR/SVG/filters.html#FilterEffectsRegion\n // we add some extra space to filter box to contain the blur ( 20 )\n fBoxX =\n toFixed(\n (Math.abs(offset.x) + this.blur) / object.width,\n config.NUM_FRACTION_DIGITS,\n ) *\n 100 +\n BLUR_BOX;\n fBoxY =\n toFixed(\n (Math.abs(offset.y) + this.blur) / object.height,\n config.NUM_FRACTION_DIGITS,\n ) *\n 100 +\n BLUR_BOX;\n }\n if (object.flipX) {\n offset.x *= -1;\n }\n if (object.flipY) {\n offset.y *= -1;\n }\n\n return `\\n\\t\\n\\t\\n\\t\\n\\t\\n\\t\\n\\t\\t\\n\\t\\t\\n\\t\\n\\n`;\n }\n\n /**\n * Returns object representation of a shadow\n * @return {Object} Object representation of a shadow instance\n */\n toObject() {\n const data: SerializedShadowOptions = {\n color: this.color,\n blur: this.blur,\n offsetX: this.offsetX,\n offsetY: this.offsetY,\n affectStroke: this.affectStroke,\n nonScaling: this.nonScaling,\n type: (this.constructor as typeof Shadow).type,\n };\n const defaults = Shadow.ownDefaults as SerializedShadowOptions;\n return !this.includeDefaultValues\n ? pickBy(data, (value, key) => value !== defaults[key])\n : data;\n }\n\n static async fromObject(options: Partial>) {\n return new this(options);\n }\n}\n\nclassRegistry.setClass(Shadow, 'shadow');\n","export const capValue = (min: number, value: number, max: number) =>\n Math.max(min, Math.min(value, max));\n","import {\n TOP,\n LEFT,\n SCALE_Y,\n SCALE_X,\n SKEW_X,\n SKEW_Y,\n FILL,\n STROKE,\n} from '../../constants';\nimport type { TClassProperties } from '../../typedefs';\nimport type { InteractiveFabricObject } from './InteractiveObject';\nimport type { FabricObject } from './Object';\n\nexport const stateProperties = [\n TOP,\n LEFT,\n SCALE_X,\n SCALE_Y,\n 'flipX',\n 'flipY',\n 'originX',\n 'originY',\n 'angle',\n 'opacity',\n 'globalCompositeOperation',\n 'shadow',\n 'visible',\n SKEW_X,\n SKEW_Y,\n];\n\nexport const cacheProperties = [\n FILL,\n STROKE,\n 'strokeWidth',\n 'strokeDashArray',\n 'width',\n 'height',\n 'paintFirst',\n 'strokeUniform',\n 'strokeLineCap',\n 'strokeDashOffset',\n 'strokeLineJoin',\n 'strokeMiterLimit',\n 'backgroundColor',\n 'clipPath',\n];\n\nexport const fabricObjectDefaultValues: Partial<\n TClassProperties\n> = {\n // see composeMatrix() to see order of transforms. First defaults listed based on this\n top: 0,\n left: 0,\n width: 0,\n height: 0,\n angle: 0,\n flipX: false,\n flipY: false,\n scaleX: 1,\n scaleY: 1,\n minScaleLimit: 0,\n skewX: 0,\n skewY: 0,\n originX: LEFT,\n originY: TOP,\n strokeWidth: 1,\n strokeUniform: false,\n padding: 0,\n opacity: 1,\n paintFirst: FILL,\n fill: 'rgb(0,0,0)',\n fillRule: 'nonzero',\n stroke: null,\n strokeDashArray: null,\n strokeDashOffset: 0,\n strokeLineCap: 'butt',\n strokeLineJoin: 'miter',\n strokeMiterLimit: 4,\n globalCompositeOperation: 'source-over',\n backgroundColor: '',\n shadow: null,\n visible: true,\n includeDefaultValues: true,\n excludeFromExport: false,\n objectCaching: true,\n clipPath: undefined,\n inverted: false,\n absolutePositioned: false,\n centeredRotation: true,\n centeredScaling: false,\n dirty: true,\n} as const;\n\nexport const interactiveObjectDefaultValues: Partial<\n TClassProperties\n> = {\n noScaleCache: true,\n lockMovementX: false,\n lockMovementY: false,\n lockRotation: false,\n lockScalingX: false,\n lockScalingY: false,\n lockSkewingX: false,\n lockSkewingY: false,\n lockScalingFlip: false,\n cornerSize: 13,\n touchCornerSize: 24,\n transparentCorners: true,\n cornerColor: 'rgb(178,204,255)',\n cornerStrokeColor: '',\n cornerStyle: 'rect',\n cornerDashArray: null,\n hasControls: true,\n borderColor: 'rgb(178,204,255)',\n borderDashArray: null,\n borderOpacityWhenMoving: 0.4,\n borderScaleFactor: 1,\n hasBorders: true,\n selectionBackgroundColor: '',\n selectable: true,\n evented: true,\n perPixelTargetFind: false,\n activeOn: 'down',\n hoverCursor: null,\n moveCursor: null,\n};\n","/**\n * Easing functions\n * @see {@link http://gizma.com/easing/ Easing Equations by Robert Penner}\n */\n\nimport { twoMathPi, halfPI } from '../../constants';\nimport type { TEasingFunction } from './types';\n\nconst normalize = (a: number, c: number, p: number, s: number) => {\n if (a < Math.abs(c)) {\n a = c;\n s = p / 4;\n } else {\n //handle the 0/0 case:\n if (c === 0 && a === 0) {\n s = (p / twoMathPi) * Math.asin(1);\n } else {\n s = (p / twoMathPi) * Math.asin(c / a);\n }\n }\n return { a, c, p, s };\n};\n\nconst elastic = (\n a: number,\n s: number,\n p: number,\n t: number,\n d: number,\n): number =>\n a * Math.pow(2, 10 * (t -= 1)) * Math.sin(((t * d - s) * twoMathPi) / p);\n\n/**\n * Default sinusoidal easing\n */\nexport const defaultEasing: TEasingFunction = (t, b, c, d) =>\n -c * Math.cos((t / d) * halfPI) + c + b;\n\n/**\n * Cubic easing in\n */\nexport const easeInCubic: TEasingFunction = (t, b, c, d) =>\n c * (t / d) ** 3 + b;\n\n/**\n * Cubic easing out\n */\nexport const easeOutCubic: TEasingFunction = (t, b, c, d) =>\n c * ((t / d - 1) ** 3 + 1) + b;\n\n/**\n * Cubic easing in and out\n */\nexport const easeInOutCubic: TEasingFunction = (t, b, c, d) => {\n t /= d / 2;\n if (t < 1) {\n return (c / 2) * t ** 3 + b;\n }\n return (c / 2) * ((t - 2) ** 3 + 2) + b;\n};\n\n/**\n * Quartic easing in\n */\nexport const easeInQuart: TEasingFunction = (t, b, c, d) =>\n c * (t /= d) * t ** 3 + b;\n\n/**\n * Quartic easing out\n */\nexport const easeOutQuart: TEasingFunction = (t, b, c, d) =>\n -c * ((t = t / d - 1) * t ** 3 - 1) + b;\n\n/**\n * Quartic easing in and out\n */\nexport const easeInOutQuart: TEasingFunction = (t, b, c, d) => {\n t /= d / 2;\n if (t < 1) {\n return (c / 2) * t ** 4 + b;\n }\n return (-c / 2) * ((t -= 2) * t ** 3 - 2) + b;\n};\n\n/**\n * Quintic easing in\n */\nexport const easeInQuint: TEasingFunction = (t, b, c, d) =>\n c * (t / d) ** 5 + b;\n\n/**\n * Quintic easing out\n */\nexport const easeOutQuint: TEasingFunction = (t, b, c, d) =>\n c * ((t / d - 1) ** 5 + 1) + b;\n\n/**\n * Quintic easing in and out\n */\nexport const easeInOutQuint: TEasingFunction = (t, b, c, d) => {\n t /= d / 2;\n if (t < 1) {\n return (c / 2) * t ** 5 + b;\n }\n return (c / 2) * ((t - 2) ** 5 + 2) + b;\n};\n\n/**\n * Sinusoidal easing in\n */\nexport const easeInSine: TEasingFunction = (t, b, c, d) =>\n -c * Math.cos((t / d) * halfPI) + c + b;\n\n/**\n * Sinusoidal easing out\n */\nexport const easeOutSine: TEasingFunction = (t, b, c, d) =>\n c * Math.sin((t / d) * halfPI) + b;\n\n/**\n * Sinusoidal easing in and out\n */\nexport const easeInOutSine: TEasingFunction = (t, b, c, d) =>\n (-c / 2) * (Math.cos((Math.PI * t) / d) - 1) + b;\n\n/**\n * Exponential easing in\n */\nexport const easeInExpo: TEasingFunction = (t, b, c, d) =>\n t === 0 ? b : c * 2 ** (10 * (t / d - 1)) + b;\n\n/**\n * Exponential easing out\n */\nexport const easeOutExpo: TEasingFunction = (t, b, c, d) =>\n t === d ? b + c : c * -(2 ** ((-10 * t) / d) + 1) + b;\n\n/**\n * Exponential easing in and out\n */\nexport const easeInOutExpo: TEasingFunction = (t, b, c, d) => {\n if (t === 0) {\n return b;\n }\n if (t === d) {\n return b + c;\n }\n t /= d / 2;\n if (t < 1) {\n return (c / 2) * 2 ** (10 * (t - 1)) + b;\n }\n return (c / 2) * -(2 ** (-10 * --t) + 2) + b;\n};\n\n/**\n * Circular easing in\n */\nexport const easeInCirc: TEasingFunction = (t, b, c, d) =>\n -c * (Math.sqrt(1 - (t /= d) * t) - 1) + b;\n\n/**\n * Circular easing out\n */\nexport const easeOutCirc: TEasingFunction = (t, b, c, d) =>\n c * Math.sqrt(1 - (t = t / d - 1) * t) + b;\n\n/**\n * Circular easing in and out\n */\nexport const easeInOutCirc: TEasingFunction = (t, b, c, d) => {\n t /= d / 2;\n if (t < 1) {\n return (-c / 2) * (Math.sqrt(1 - t ** 2) - 1) + b;\n }\n return (c / 2) * (Math.sqrt(1 - (t -= 2) * t) + 1) + b;\n};\n\n/**\n * Elastic easing in\n */\nexport const easeInElastic: TEasingFunction = (t, b, c, d) => {\n const s = 1.70158,\n a = c;\n let p = 0;\n if (t === 0) {\n return b;\n }\n t /= d;\n if (t === 1) {\n return b + c;\n }\n if (!p) {\n p = d * 0.3;\n }\n const { a: normA, s: normS, p: normP } = normalize(a, c, p, s);\n return -elastic(normA, normS, normP, t, d) + b;\n};\n\n/**\n * Elastic easing out\n */\nexport const easeOutElastic: TEasingFunction = (t, b, c, d) => {\n const s = 1.70158,\n a = c;\n let p = 0;\n if (t === 0) {\n return b;\n }\n t /= d;\n if (t === 1) {\n return b + c;\n }\n if (!p) {\n p = d * 0.3;\n }\n const { a: normA, s: normS, p: normP, c: normC } = normalize(a, c, p, s);\n return (\n normA * 2 ** (-10 * t) * Math.sin(((t * d - normS) * twoMathPi) / normP) +\n normC +\n b\n );\n};\n\n/**\n * Elastic easing in and out\n */\nexport const easeInOutElastic: TEasingFunction = (t, b, c, d) => {\n const s = 1.70158,\n a = c;\n let p = 0;\n if (t === 0) {\n return b;\n }\n t /= d / 2;\n if (t === 2) {\n return b + c;\n }\n if (!p) {\n p = d * (0.3 * 1.5);\n }\n const { a: normA, s: normS, p: normP, c: normC } = normalize(a, c, p, s);\n if (t < 1) {\n return -0.5 * elastic(normA, normS, normP, t, d) + b;\n }\n return (\n normA *\n Math.pow(2, -10 * (t -= 1)) *\n Math.sin(((t * d - normS) * twoMathPi) / normP) *\n 0.5 +\n normC +\n b\n );\n};\n\n/**\n * Backwards easing in\n */\nexport const easeInBack: TEasingFunction = (t, b, c, d, s = 1.70158) =>\n c * (t /= d) * t * ((s + 1) * t - s) + b;\n\n/**\n * Backwards easing out\n */\nexport const easeOutBack: TEasingFunction = (t, b, c, d, s = 1.70158) =>\n c * ((t = t / d - 1) * t * ((s + 1) * t + s) + 1) + b;\n\n/**\n * Backwards easing in and out\n */\nexport const easeInOutBack: TEasingFunction = (t, b, c, d, s = 1.70158) => {\n t /= d / 2;\n if (t < 1) {\n return (c / 2) * (t * t * (((s *= 1.525) + 1) * t - s)) + b;\n }\n return (c / 2) * ((t -= 2) * t * (((s *= 1.525) + 1) * t + s) + 2) + b;\n};\n\n/**\n * Bouncing easing out\n */\nexport const easeOutBounce: TEasingFunction = (t, b, c, d) => {\n if ((t /= d) < 1 / 2.75) {\n return c * (7.5625 * t * t) + b;\n } else if (t < 2 / 2.75) {\n return c * (7.5625 * (t -= 1.5 / 2.75) * t + 0.75) + b;\n } else if (t < 2.5 / 2.75) {\n return c * (7.5625 * (t -= 2.25 / 2.75) * t + 0.9375) + b;\n } else {\n return c * (7.5625 * (t -= 2.625 / 2.75) * t + 0.984375) + b;\n }\n};\n\n/**\n * Bouncing easing in\n */\nexport const easeInBounce: TEasingFunction = (t, b, c, d) =>\n c - easeOutBounce(d - t, 0, c, d) + b;\n\n/**\n * Bouncing easing in and out\n */\nexport const easeInOutBounce: TEasingFunction = (t, b, c, d) =>\n t < d / 2\n ? easeInBounce(t * 2, 0, c, d) * 0.5 + b\n : easeOutBounce(t * 2 - d, 0, c, d) * 0.5 + c * 0.5 + b;\n\n/**\n * Quadratic easing in\n */\nexport const easeInQuad: TEasingFunction = (t, b, c, d) => c * (t /= d) * t + b;\n\n/**\n * Quadratic easing out\n */\nexport const easeOutQuad: TEasingFunction = (t, b, c, d) =>\n -c * (t /= d) * (t - 2) + b;\n\n/**\n * Quadratic easing in and out\n */\nexport const easeInOutQuad: TEasingFunction = (t, b, c, d) => {\n t /= d / 2;\n if (t < 1) {\n return (c / 2) * t ** 2 + b;\n }\n return (-c / 2) * (--t * (t - 2) - 1) + b;\n};\n","import { noop } from '../../constants';\nimport { requestAnimFrame } from './AnimationFrameProvider';\nimport { runningAnimations } from './AnimationRegistry';\nimport { defaultEasing } from './easing';\nimport type {\n AnimationState,\n TAbortCallback,\n TBaseAnimationOptions,\n TEasingFunction,\n TOnAnimationChangeCallback,\n} from './types';\n\nconst defaultAbort = () => false;\n\nexport abstract class AnimationBase<\n T extends number | number[] = number | number[],\n> {\n declare readonly startValue: T;\n declare readonly endValue: T;\n declare readonly duration: number;\n declare readonly delay: number;\n\n declare protected readonly byValue: T;\n declare protected readonly easing: TEasingFunction;\n\n declare private readonly _onStart: VoidFunction;\n declare private readonly _onChange: TOnAnimationChangeCallback;\n declare private readonly _onComplete: TOnAnimationChangeCallback;\n declare private readonly _abort: TAbortCallback;\n\n /**\n * Used to register the animation to a target object\n * so that it can be cancelled within the object context\n */\n declare readonly target?: unknown;\n\n private _state: AnimationState = 'pending';\n /**\n * Time %, or the ratio of `timeElapsed / duration`\n * @see tick\n */\n durationProgress = 0;\n /**\n * Value %, or the ratio of `(currentValue - startValue) / (endValue - startValue)`\n */\n valueProgress = 0;\n /**\n * Current value\n */\n declare value: T;\n /**\n * Animation start time ms\n */\n declare private startTime: number;\n\n constructor({\n startValue,\n byValue,\n duration = 500,\n delay = 0,\n easing = defaultEasing,\n onStart = noop,\n onChange = noop,\n onComplete = noop,\n abort = defaultAbort,\n target,\n }: TBaseAnimationOptions) {\n this.tick = this.tick.bind(this);\n\n this.duration = duration;\n this.delay = delay;\n this.easing = easing;\n this._onStart = onStart;\n this._onChange = onChange;\n this._onComplete = onComplete;\n this._abort = abort;\n this.target = target;\n\n this.startValue = startValue;\n this.byValue = byValue;\n this.value = this.startValue;\n this.endValue = Object.freeze(this.calculate(this.duration).value);\n }\n\n get state() {\n return this._state;\n }\n\n isDone() {\n return this._state === 'aborted' || this._state === 'completed';\n }\n\n /**\n * Calculate the current value based on the easing parameters\n * @param timeElapsed in ms\n * @protected\n */\n protected abstract calculate(timeElapsed: number): {\n value: T;\n valueProgress: number;\n };\n\n start() {\n const firstTick: FrameRequestCallback = (timestamp) => {\n if (this._state !== 'pending') return;\n this.startTime = timestamp || +new Date();\n this._state = 'running';\n this._onStart();\n this.tick(this.startTime);\n };\n\n this.register();\n\n // setTimeout(cb, 0) will run cb on the next frame, causing a delay\n // we don't want that\n if (this.delay > 0) {\n setTimeout(() => requestAnimFrame(firstTick), this.delay);\n } else {\n requestAnimFrame(firstTick);\n }\n }\n\n private tick(t: number) {\n const durationMs = (t || +new Date()) - this.startTime;\n const boundDurationMs = Math.min(durationMs, this.duration);\n this.durationProgress = boundDurationMs / this.duration;\n const { value, valueProgress } = this.calculate(boundDurationMs);\n this.value = Object.freeze(value);\n this.valueProgress = valueProgress;\n\n if (this._state === 'aborted') {\n return;\n } else if (\n this._abort(this.value, this.valueProgress, this.durationProgress)\n ) {\n this._state = 'aborted';\n this.unregister();\n } else if (durationMs >= this.duration) {\n this.durationProgress = this.valueProgress = 1;\n this._onChange(this.endValue, this.valueProgress, this.durationProgress);\n this._state = 'completed';\n this._onComplete(\n this.endValue,\n this.valueProgress,\n this.durationProgress,\n );\n this.unregister();\n } else {\n this._onChange(this.value, this.valueProgress, this.durationProgress);\n requestAnimFrame(this.tick);\n }\n }\n\n private register() {\n runningAnimations.push(this as unknown as AnimationBase);\n }\n\n private unregister() {\n runningAnimations.remove(this as unknown as AnimationBase);\n }\n\n abort() {\n this._state = 'aborted';\n this.unregister();\n }\n}\n","import { AnimationBase } from './AnimationBase';\nimport type { ValueAnimationOptions } from './types';\n\nexport class ValueAnimation extends AnimationBase {\n constructor({\n startValue = 0,\n endValue = 100,\n ...otherOptions\n }: ValueAnimationOptions) {\n super({\n ...otherOptions,\n startValue,\n byValue: endValue - startValue,\n });\n }\n\n protected calculate(timeElapsed: number) {\n const value = this.easing(\n timeElapsed,\n this.startValue,\n this.byValue,\n this.duration,\n );\n return {\n value,\n valueProgress: Math.abs((value - this.startValue) / this.byValue),\n };\n }\n}\n","import { AnimationBase } from './AnimationBase';\nimport type { ArrayAnimationOptions } from './types';\n\nexport class ArrayAnimation extends AnimationBase {\n constructor({\n startValue = [0],\n endValue = [100],\n ...options\n }: ArrayAnimationOptions) {\n super({\n ...options,\n startValue,\n byValue: endValue.map((value, i) => value - startValue[i]),\n });\n }\n protected calculate(timeElapsed: number) {\n const values = this.startValue.map((value, i) =>\n this.easing(timeElapsed, value, this.byValue[i], this.duration, i),\n );\n return {\n value: values,\n valueProgress: Math.abs(\n (values[0] - this.startValue[0]) / this.byValue[0],\n ),\n };\n }\n}\n","import { Color } from '../../color/Color';\nimport type { TRGBAColorSource } from '../../color/typedefs';\nimport { halfPI } from '../../constants';\nimport { capValue } from '../misc/capValue';\nimport { AnimationBase } from './AnimationBase';\nimport type {\n ColorAnimationOptions,\n TEasingFunction,\n TOnAnimationChangeCallback,\n} from './types';\n\nconst defaultColorEasing: TEasingFunction = (\n timeElapsed,\n startValue,\n byValue,\n duration,\n) => {\n const durationProgress = 1 - Math.cos((timeElapsed / duration) * halfPI);\n return startValue + byValue * durationProgress;\n};\n\nconst wrapColorCallback = (\n callback?: TOnAnimationChangeCallback,\n) =>\n callback &&\n ((rgba: TRGBAColorSource, valueProgress: number, durationProgress: number) =>\n callback(new Color(rgba).toRgba(), valueProgress, durationProgress));\n\nexport class ColorAnimation extends AnimationBase {\n constructor({\n startValue,\n endValue,\n easing = defaultColorEasing,\n onChange,\n onComplete,\n abort,\n ...options\n }: ColorAnimationOptions) {\n const startColor = new Color(startValue).getSource();\n const endColor = new Color(endValue).getSource();\n super({\n ...options,\n startValue: startColor,\n byValue: endColor.map(\n (value, i) => value - startColor[i],\n ) as TRGBAColorSource,\n easing,\n onChange: wrapColorCallback(onChange),\n onComplete: wrapColorCallback(onComplete),\n abort: wrapColorCallback(abort),\n });\n }\n protected calculate(timeElapsed: number) {\n const [r, g, b, a] = this.startValue.map((value, i) =>\n this.easing(timeElapsed, value, this.byValue[i], this.duration, i),\n ) as TRGBAColorSource;\n const value = [\n ...[r, g, b].map(Math.round),\n capValue(0, a, 1),\n ] as TRGBAColorSource;\n return {\n value,\n valueProgress:\n // to correctly calculate the change ratio we must find a changed value\n value\n .map((p, i) =>\n this.byValue[i] !== 0\n ? Math.abs((p - this.startValue[i]) / this.byValue[i])\n : 0,\n )\n .find((p) => p !== 0) || 0,\n };\n }\n}\n","import { ValueAnimation } from './ValueAnimation';\nimport { ArrayAnimation } from './ArrayAnimation';\nimport { ColorAnimation } from './ColorAnimation';\nimport type {\n ValueAnimationOptions,\n ArrayAnimationOptions,\n ColorAnimationOptions,\n} from './types';\nimport type { TColorArg } from '../../color/typedefs';\n\nexport type TAnimation =\n T extends TColorArg\n ? ColorAnimation\n : T extends number[]\n ? ArrayAnimation\n : ValueAnimation;\n\nconst isArrayAnimation = (\n options: ArrayAnimationOptions | ValueAnimationOptions,\n): options is ArrayAnimationOptions => {\n return Array.isArray(options.startValue) || Array.isArray(options.endValue);\n};\n\n/**\n * Changes value(s) from startValue to endValue within a certain period of time,\n * invoking callbacks as the value(s) change.\n *\n * @example\n * animate({\n * startValue: 1,\n * endValue: 0,\n * onChange: (v) => {\n * obj.set('opacity', v);\n * // since we are running in a requested frame we should call `renderAll` and not `requestRenderAll`\n * canvas.renderAll();\n * }\n * });\n *\n * @example Using lists:\n * animate({\n * startValue: [1, 2, 3],\n * endValue: [2, 4, 6],\n * onChange: ([x, y, zoom]) => {\n * canvas.zoomToPoint(new Point(x, y), zoom);\n * canvas.renderAll();\n * }\n * });\n *\n */\nexport function animate(options: ArrayAnimationOptions): ArrayAnimation;\nexport function animate(options: ValueAnimationOptions): ValueAnimation;\nexport function animate<\n T extends ValueAnimationOptions | ArrayAnimationOptions,\n>(\n options: T,\n): T extends ArrayAnimationOptions ? ArrayAnimation : ValueAnimation;\nexport function animate<\n T extends ValueAnimationOptions | ArrayAnimationOptions,\n R extends T extends ArrayAnimationOptions ? ArrayAnimation : ValueAnimation,\n>(options: T): R {\n const animation = (\n isArrayAnimation(options)\n ? new ArrayAnimation(options)\n : new ValueAnimation(options)\n ) as R;\n animation.start();\n return animation;\n}\n\nexport function animateColor(options: ColorAnimationOptions) {\n const animation = new ColorAnimation(options);\n animation.start();\n return animation;\n}\n","import { Point } from './Point';\nimport { createVector } from './util/misc/vectors';\n\n/* Adaptation of work of Kevin Lindsey (kevin@kevlindev.com) */\n\nexport type IntersectionType = 'Intersection' | 'Coincident' | 'Parallel';\n\nexport class Intersection {\n declare points: Point[];\n\n declare status?: IntersectionType;\n\n constructor(status?: IntersectionType) {\n this.status = status;\n this.points = [];\n }\n\n /**\n * Used to verify if a point is alredy in the collection\n * @param {Point} point\n * @returns {boolean}\n */\n private includes(point: Point): boolean {\n return this.points.some((p) => p.eq(point));\n }\n\n /**\n * Appends points of intersection\n * @param {...Point[]} points\n * @return {Intersection} thisArg\n * @chainable\n */\n private append(...points: Point[]): Intersection {\n this.points = this.points.concat(\n points.filter((point) => {\n return !this.includes(point);\n }),\n );\n return this;\n }\n\n /**\n * check if point T is on the segment or line defined between A and B\n *\n * @param {Point} T the point we are checking for\n * @param {Point} A one extremity of the segment\n * @param {Point} B the other extremity of the segment\n * @param [infinite] if true checks if `T` is on the line defined by `A` and `B`\n * @returns true if `T` is contained\n */\n static isPointContained(T: Point, A: Point, B: Point, infinite = false) {\n if (A.eq(B)) {\n // Edge case: the segment is a point, we check for coincidence,\n // infinite param has no meaning because there are infinite lines to consider\n return T.eq(A);\n } else if (A.x === B.x) {\n // Edge case: horizontal line.\n // we first check if T.x has the same value, and then if T.y is contained between A.y and B.y\n return (\n T.x === A.x &&\n (infinite || (T.y >= Math.min(A.y, B.y) && T.y <= Math.max(A.y, B.y)))\n );\n } else if (A.y === B.y) {\n // Edge case: vertical line.\n // we first check if T.y has the same value, and then if T.x is contained between A.x and B.x\n return (\n T.y === A.y &&\n (infinite || (T.x >= Math.min(A.x, B.x) && T.x <= Math.max(A.x, B.x)))\n );\n } else {\n // Generic case: sloped line.\n // we check that AT has the same slope as AB\n // for the segment case we need both the vectors to have the same direction and for AT to be lte AB in size\n // for the infinite case we check the absolute value of the slope, since direction is meaningless\n const AB = createVector(A, B);\n const AT = createVector(A, T);\n const s = AT.divide(AB);\n return infinite\n ? Math.abs(s.x) === Math.abs(s.y)\n : s.x === s.y && s.x >= 0 && s.x <= 1;\n }\n }\n\n /**\n * Use the ray casting algorithm to determine if {@link point} is in the polygon defined by {@link points}\n * @see https://en.wikipedia.org/wiki/Point_in_polygon\n * @param point\n * @param points polygon points\n * @returns\n */\n static isPointInPolygon(point: Point, points: Point[]) {\n const other = new Point(point).setX(\n Math.min(point.x - 1, ...points.map((p) => p.x)),\n );\n let hits = 0;\n for (let index = 0; index < points.length; index++) {\n const inter = this.intersectSegmentSegment(\n // polygon side\n points[index],\n points[(index + 1) % points.length],\n // ray\n point,\n other,\n );\n if (inter.includes(point)) {\n // point is on the polygon side\n return true;\n }\n hits += Number(inter.status === 'Intersection');\n }\n return hits % 2 === 1;\n }\n\n /**\n * Checks if a line intersects another\n * @see {@link https://en.wikipedia.org/wiki/Line%E2%80%93line_intersection line intersection}\n * @see {@link https://en.wikipedia.org/wiki/Cramer%27s_rule Cramer's rule}\n * @param {Point} a1\n * @param {Point} a2\n * @param {Point} b1\n * @param {Point} b2\n * @param {boolean} [aInfinite=true] check segment intersection by passing `false`\n * @param {boolean} [bInfinite=true] check segment intersection by passing `false`\n * @return {Intersection}\n */\n static intersectLineLine(\n a1: Point,\n a2: Point,\n b1: Point,\n b2: Point,\n aInfinite = true,\n bInfinite = true,\n ): Intersection {\n const a2xa1x = a2.x - a1.x,\n a2ya1y = a2.y - a1.y,\n b2xb1x = b2.x - b1.x,\n b2yb1y = b2.y - b1.y,\n a1xb1x = a1.x - b1.x,\n a1yb1y = a1.y - b1.y,\n uaT = b2xb1x * a1yb1y - b2yb1y * a1xb1x,\n ubT = a2xa1x * a1yb1y - a2ya1y * a1xb1x,\n uB = b2yb1y * a2xa1x - b2xb1x * a2ya1y;\n if (uB !== 0) {\n const ua = uaT / uB,\n ub = ubT / uB;\n if (\n (aInfinite || (0 <= ua && ua <= 1)) &&\n (bInfinite || (0 <= ub && ub <= 1))\n ) {\n return new Intersection('Intersection').append(\n new Point(a1.x + ua * a2xa1x, a1.y + ua * a2ya1y),\n );\n } else {\n return new Intersection();\n }\n } else {\n if (uaT === 0 || ubT === 0) {\n const segmentsCoincide =\n aInfinite ||\n bInfinite ||\n Intersection.isPointContained(a1, b1, b2) ||\n Intersection.isPointContained(a2, b1, b2) ||\n Intersection.isPointContained(b1, a1, a2) ||\n Intersection.isPointContained(b2, a1, a2);\n return new Intersection(segmentsCoincide ? 'Coincident' : undefined);\n } else {\n return new Intersection('Parallel');\n }\n }\n }\n\n /**\n * Checks if a segment intersects a line\n * @see {@link intersectLineLine} for line intersection\n * @param {Point} s1 boundary point of segment\n * @param {Point} s2 other boundary point of segment\n * @param {Point} l1 point on line\n * @param {Point} l2 other point on line\n * @return {Intersection}\n */\n static intersectSegmentLine(\n s1: Point,\n s2: Point,\n l1: Point,\n l2: Point,\n ): Intersection {\n return Intersection.intersectLineLine(s1, s2, l1, l2, false, true);\n }\n\n /**\n * Checks if a segment intersects another\n * @see {@link intersectLineLine} for line intersection\n * @param {Point} a1 boundary point of segment\n * @param {Point} a2 other boundary point of segment\n * @param {Point} b1 boundary point of segment\n * @param {Point} b2 other boundary point of segment\n * @return {Intersection}\n */\n static intersectSegmentSegment(\n a1: Point,\n a2: Point,\n b1: Point,\n b2: Point,\n ): Intersection {\n return Intersection.intersectLineLine(a1, a2, b1, b2, false, false);\n }\n\n /**\n * Checks if line intersects polygon\n *\n * @todo account for stroke\n *\n * @see {@link intersectSegmentPolygon} for segment intersection\n * @param {Point} a1 point on line\n * @param {Point} a2 other point on line\n * @param {Point[]} points polygon points\n * @param {boolean} [infinite=true] check segment intersection by passing `false`\n * @return {Intersection}\n */\n static intersectLinePolygon(\n a1: Point,\n a2: Point,\n points: Point[],\n infinite = true,\n ): Intersection {\n const result = new Intersection();\n const length = points.length;\n\n for (let i = 0, b1, b2, inter; i < length; i++) {\n b1 = points[i];\n b2 = points[(i + 1) % length];\n inter = Intersection.intersectLineLine(a1, a2, b1, b2, infinite, false);\n if (inter.status === 'Coincident') {\n return inter;\n }\n result.append(...inter.points);\n }\n\n if (result.points.length > 0) {\n result.status = 'Intersection';\n }\n\n return result;\n }\n\n /**\n * Checks if segment intersects polygon\n * @see {@link intersectLinePolygon} for line intersection\n * @param {Point} a1 boundary point of segment\n * @param {Point} a2 other boundary point of segment\n * @param {Point[]} points polygon points\n * @return {Intersection}\n */\n static intersectSegmentPolygon(\n a1: Point,\n a2: Point,\n points: Point[],\n ): Intersection {\n return Intersection.intersectLinePolygon(a1, a2, points, false);\n }\n\n /**\n * Checks if polygon intersects another polygon\n *\n * @todo account for stroke\n *\n * @param {Point[]} points1\n * @param {Point[]} points2\n * @return {Intersection}\n */\n static intersectPolygonPolygon(\n points1: Point[],\n points2: Point[],\n ): Intersection {\n const result = new Intersection(),\n length = points1.length;\n const coincidences: Intersection[] = [];\n\n for (let i = 0; i < length; i++) {\n const a1 = points1[i],\n a2 = points1[(i + 1) % length],\n inter = Intersection.intersectSegmentPolygon(a1, a2, points2);\n if (inter.status === 'Coincident') {\n coincidences.push(inter);\n result.append(a1, a2);\n } else {\n result.append(...inter.points);\n }\n }\n\n if (coincidences.length > 0 && coincidences.length === points1.length) {\n return new Intersection('Coincident');\n } else if (result.points.length > 0) {\n result.status = 'Intersection';\n }\n\n return result;\n }\n\n /**\n * Checks if polygon intersects rectangle\n * @see {@link intersectPolygonPolygon} for polygon intersection\n * @param {Point[]} points polygon points\n * @param {Point} r1 top left point of rect\n * @param {Point} r2 bottom right point of rect\n * @return {Intersection}\n */\n static intersectPolygonRectangle(\n points: Point[],\n r1: Point,\n r2: Point,\n ): Intersection {\n const min = r1.min(r2),\n max = r1.max(r2),\n topRight = new Point(max.x, min.y),\n bottomLeft = new Point(min.x, max.y);\n\n return Intersection.intersectPolygonPolygon(points, [\n min,\n topRight,\n max,\n bottomLeft,\n ]);\n }\n}\n","import type {\n TBBox,\n TCornerPoint,\n TDegree,\n TMat2D,\n TOriginX,\n TOriginY,\n} from '../../typedefs';\nimport { SCALE_X, SCALE_Y, iMatrix } from '../../constants';\nimport { Intersection } from '../../Intersection';\nimport { Point } from '../../Point';\nimport { makeBoundingBoxFromPoints } from '../../util/misc/boundingBoxFromPoints';\nimport {\n createRotateMatrix,\n createTranslateMatrix,\n composeMatrix,\n invertTransform,\n multiplyTransformMatrices,\n transformPoint,\n calcPlaneRotation,\n} from '../../util/misc/matrix';\nimport { radiansToDegrees } from '../../util/misc/radiansDegreesConversion';\nimport type { Canvas } from '../../canvas/Canvas';\nimport type { StaticCanvas } from '../../canvas/StaticCanvas';\nimport type { ObjectEvents } from '../../EventTypeDefs';\nimport type { ControlProps } from './types/ControlProps';\nimport { resolveOrigin } from '../../util/misc/resolveOrigin';\nimport type { Group } from '../Group';\nimport { calcDimensionsMatrix } from '../../util/misc/matrix';\nimport { sizeAfterTransform } from '../../util/misc/objectTransforms';\nimport { degreesToRadians } from '../../util/misc/radiansDegreesConversion';\nimport { CommonMethods } from '../../CommonMethods';\nimport type { BaseProps } from './types/BaseProps';\nimport type { FillStrokeProps } from './types/FillStrokeProps';\nimport { CENTER, LEFT, TOP } from '../../constants';\n\ntype TMatrixCache = {\n key: number[];\n value: TMat2D;\n};\n\ntype TACoords = TCornerPoint;\n\nexport class ObjectGeometry\n extends CommonMethods\n implements\n Pick,\n BaseProps,\n Pick\n{\n // #region Geometry\n\n declare padding: number;\n\n /**\n * Describe object's corner position in scene coordinates.\n * The coordinates are derived from the following:\n * left, top, width, height, scaleX, scaleY, skewX, skewY, angle, strokeWidth.\n * The coordinates do not depend on viewport changes.\n * The coordinates get updated with {@link setCoords}.\n * You can calculate them without updating with {@link calcACoords()}\n */\n declare aCoords: TACoords;\n\n /**\n * storage cache for object transform matrix\n */\n declare ownMatrixCache?: TMatrixCache;\n\n /**\n * storage cache for object full transform matrix\n */\n declare matrixCache?: TMatrixCache;\n\n /**\n * A Reference of the Canvas where the object is actually added\n * @type StaticCanvas | Canvas;\n * @default undefined\n * @private\n */\n declare canvas?: StaticCanvas | Canvas;\n\n /**\n * @returns {number} x position according to object's {@link originX} property in canvas coordinate plane\n */\n getX(): number {\n return this.getXY().x;\n }\n\n /**\n * @param {number} value x position according to object's {@link originX} property in canvas coordinate plane\n */\n setX(value: number) {\n this.setXY(this.getXY().setX(value));\n }\n\n /**\n * @returns {number} y position according to object's {@link originY} property in canvas coordinate plane\n */\n getY(): number {\n return this.getXY().y;\n }\n\n /**\n * @param {number} value y position according to object's {@link originY} property in canvas coordinate plane\n */\n setY(value: number) {\n this.setXY(this.getXY().setY(value));\n }\n\n /**\n * @returns {number} x position according to object's {@link originX} property in parent's coordinate plane\\\n * if parent is canvas then this property is identical to {@link getX}\n */\n getRelativeX(): number {\n return this.left;\n }\n\n /**\n * @param {number} value x position according to object's {@link originX} property in parent's coordinate plane\\\n * if parent is canvas then this method is identical to {@link setX}\n */\n setRelativeX(value: number) {\n this.left = value;\n }\n\n /**\n * @returns {number} y position according to object's {@link originY} property in parent's coordinate plane\\\n * if parent is canvas then this property is identical to {@link getY}\n */\n getRelativeY(): number {\n return this.top;\n }\n\n /**\n * @param {number} value y position according to object's {@link originY} property in parent's coordinate plane\\\n * if parent is canvas then this property is identical to {@link setY}\n */\n setRelativeY(value: number) {\n this.top = value;\n }\n\n /**\n * @returns {Point} x position according to object's {@link originX} {@link originY} properties in canvas coordinate plane\n */\n getXY(): Point {\n const relativePosition = this.getRelativeXY();\n return this.group\n ? transformPoint(relativePosition, this.group.calcTransformMatrix())\n : relativePosition;\n }\n\n /**\n * Set an object position to a particular point, the point is intended in absolute ( canvas ) coordinate.\n * You can specify {@link originX} and {@link originY} values,\n * that otherwise are the object's current values.\n * @example Set object's bottom left corner to point (5,5) on canvas\n * object.setXY(new Point(5, 5), 'left', 'bottom').\n * @param {Point} point position in scene coordinate plane\n * @param {TOriginX} [originX] Horizontal origin: 'left', 'center' or 'right'\n * @param {TOriginY} [originY] Vertical origin: 'top', 'center' or 'bottom'\n */\n setXY(point: Point, originX?: TOriginX, originY?: TOriginY) {\n if (this.group) {\n point = transformPoint(\n point,\n invertTransform(this.group.calcTransformMatrix()),\n );\n }\n this.setRelativeXY(point, originX, originY);\n }\n\n /**\n * @returns {Point} x,y position according to object's {@link originX} {@link originY} properties in parent's coordinate plane\n */\n getRelativeXY(): Point {\n return new Point(this.left, this.top);\n }\n\n /**\n * As {@link setXY}, but in current parent's coordinate plane (the current group if any or the canvas)\n * @param {Point} point position according to object's {@link originX} {@link originY} properties in parent's coordinate plane\n * @param {TOriginX} [originX] Horizontal origin: 'left', 'center' or 'right'\n * @param {TOriginY} [originY] Vertical origin: 'top', 'center' or 'bottom'\n */\n setRelativeXY(\n point: Point,\n originX: TOriginX = this.originX,\n originY: TOriginY = this.originY,\n ) {\n this.setPositionByOrigin(point, originX, originY);\n }\n\n /**\n * @deprecated intermidiate method to be removed, do not use\n */\n protected isStrokeAccountedForInDimensions() {\n return false;\n }\n\n /**\n * @return {Point[]} [tl, tr, br, bl] in the scene plane\n */\n getCoords(): Point[] {\n const { tl, tr, br, bl } =\n this.aCoords || (this.aCoords = this.calcACoords());\n const coords = [tl, tr, br, bl];\n if (this.group) {\n const t = this.group.calcTransformMatrix();\n return coords.map((p) => transformPoint(p, t));\n }\n return coords;\n }\n\n /**\n * Checks if object intersects with the scene rect formed by {@link tl} and {@link br}\n */\n intersectsWithRect(tl: Point, br: Point): boolean {\n const intersection = Intersection.intersectPolygonRectangle(\n this.getCoords(),\n tl,\n br,\n );\n return intersection.status === 'Intersection';\n }\n\n /**\n * Checks if object intersects with another object\n * @param {Object} other Object to test\n * @return {Boolean} true if object intersects with another object\n */\n intersectsWithObject(other: ObjectGeometry): boolean {\n const intersection = Intersection.intersectPolygonPolygon(\n this.getCoords(),\n other.getCoords(),\n );\n\n return (\n intersection.status === 'Intersection' ||\n intersection.status === 'Coincident' ||\n other.isContainedWithinObject(this) ||\n this.isContainedWithinObject(other)\n );\n }\n\n /**\n * Checks if object is fully contained within area of another object\n * @param {Object} other Object to test\n * @return {Boolean} true if object is fully contained within area of another object\n */\n isContainedWithinObject(other: ObjectGeometry): boolean {\n const points = this.getCoords();\n return points.every((point) => other.containsPoint(point));\n }\n\n /**\n * Checks if object is fully contained within the scene rect formed by {@link tl} and {@link br}\n */\n isContainedWithinRect(tl: Point, br: Point): boolean {\n const { left, top, width, height } = this.getBoundingRect();\n return (\n left >= tl.x &&\n left + width <= br.x &&\n top >= tl.y &&\n top + height <= br.y\n );\n }\n\n isOverlapping(other: T): boolean {\n return (\n this.intersectsWithObject(other) ||\n this.isContainedWithinObject(other) ||\n other.isContainedWithinObject(this)\n );\n }\n\n /**\n * Checks if point is inside the object\n * @param {Point} point Point to check against\n * @return {Boolean} true if point is inside the object\n */\n containsPoint(point: Point): boolean {\n return Intersection.isPointInPolygon(point, this.getCoords());\n }\n\n /**\n * Checks if object is contained within the canvas with current viewportTransform\n * the check is done stopping at first point that appears on screen\n * @return {Boolean} true if object is fully or partially contained within canvas\n */\n isOnScreen(): boolean {\n if (!this.canvas) {\n return false;\n }\n const { tl, br } = this.canvas.vptCoords;\n const points = this.getCoords();\n // if some point is on screen, the object is on screen.\n if (\n points.some(\n (point) =>\n point.x <= br.x &&\n point.x >= tl.x &&\n point.y <= br.y &&\n point.y >= tl.y,\n )\n ) {\n return true;\n }\n // no points on screen, check intersection with absolute coordinates\n if (this.intersectsWithRect(tl, br)) {\n return true;\n }\n // check if the object is so big that it contains the entire viewport\n return this.containsPoint(tl.midPointFrom(br));\n }\n\n /**\n * Checks if object is partially contained within the canvas with current viewportTransform\n * @return {Boolean} true if object is partially contained within canvas\n */\n isPartiallyOnScreen(): boolean {\n if (!this.canvas) {\n return false;\n }\n const { tl, br } = this.canvas.vptCoords;\n if (this.intersectsWithRect(tl, br)) {\n return true;\n }\n const allPointsAreOutside = this.getCoords().every(\n (point) =>\n (point.x >= br.x || point.x <= tl.x) &&\n (point.y >= br.y || point.y <= tl.y),\n );\n // check if the object is so big that it contains the entire viewport\n return allPointsAreOutside && this.containsPoint(tl.midPointFrom(br));\n }\n\n /**\n * Returns coordinates of object's bounding rectangle (left, top, width, height)\n * the box is intended as aligned to axis of canvas.\n * @return {Object} Object with left, top, width, height properties\n */\n getBoundingRect(): TBBox {\n return makeBoundingBoxFromPoints(this.getCoords());\n }\n\n /**\n * Returns width of an object's bounding box counting transformations\n * @todo shouldn't this account for group transform and return the actual size in canvas coordinate plane?\n * @return {Number} width value\n */\n getScaledWidth(): number {\n return this._getTransformedDimensions().x;\n }\n\n /**\n * Returns height of an object bounding box counting transformations\n * @todo shouldn't this account for group transform and return the actual size in canvas coordinate plane?\n * @return {Number} height value\n */\n getScaledHeight(): number {\n return this._getTransformedDimensions().y;\n }\n\n /**\n * Scales an object (equally by x and y)\n * @param {Number} value Scale factor\n * @return {void}\n */\n scale(value: number): void {\n this._set(SCALE_X, value);\n this._set(SCALE_Y, value);\n this.setCoords();\n }\n\n /**\n * Scales an object to a given width, with respect to bounding box (scaling by x/y equally)\n * @param {Number} value New width value\n * @return {void}\n */\n scaleToWidth(value: number) {\n // adjust to bounding rect factor so that rotated shapes would fit as well\n const boundingRectFactor =\n this.getBoundingRect().width / this.getScaledWidth();\n return this.scale(value / this.width / boundingRectFactor);\n }\n\n /**\n * Scales an object to a given height, with respect to bounding box (scaling by x/y equally)\n * @param {Number} value New height value\n * @return {void}\n */\n scaleToHeight(value: number) {\n // adjust to bounding rect factor so that rotated shapes would fit as well\n const boundingRectFactor =\n this.getBoundingRect().height / this.getScaledHeight();\n return this.scale(value / this.height / boundingRectFactor);\n }\n\n getCanvasRetinaScaling() {\n return this.canvas?.getRetinaScaling() || 1;\n }\n\n /**\n * Returns the object angle relative to canvas counting also the group property\n * @returns {TDegree}\n */\n getTotalAngle(): TDegree {\n return this.group\n ? radiansToDegrees(calcPlaneRotation(this.calcTransformMatrix()))\n : this.angle;\n }\n\n /**\n * Retrieves viewportTransform from Object's canvas if available\n * @return {TMat2D}\n */\n getViewportTransform(): TMat2D {\n return this.canvas?.viewportTransform || (iMatrix.concat() as TMat2D);\n }\n\n /**\n * Calculates the coordinates of the 4 corner of the bbox, in absolute coordinates.\n * those never change with zoom or viewport changes.\n * @return {TCornerPoint}\n */\n calcACoords(): TCornerPoint {\n const rotateMatrix = createRotateMatrix({ angle: this.angle }),\n { x, y } = this.getRelativeCenterPoint(),\n tMatrix = createTranslateMatrix(x, y),\n finalMatrix = multiplyTransformMatrices(tMatrix, rotateMatrix),\n dim = this._getTransformedDimensions(),\n w = dim.x / 2,\n h = dim.y / 2;\n return {\n // corners\n tl: transformPoint({ x: -w, y: -h }, finalMatrix),\n tr: transformPoint({ x: w, y: -h }, finalMatrix),\n bl: transformPoint({ x: -w, y: h }, finalMatrix),\n br: transformPoint({ x: w, y: h }, finalMatrix),\n };\n }\n\n /**\n * Sets corner and controls position coordinates based on current angle, width and height, left and top.\n * aCoords are used to quickly find an object on the canvas.\n * See {@link https://github.com/fabricjs/fabric.js/wiki/When-to-call-setCoords} and {@link http://fabricjs.com/fabric-gotchas}\n */\n setCoords(): void {\n this.aCoords = this.calcACoords();\n }\n\n transformMatrixKey(skipGroup = false): number[] {\n let prefix: number[] = [];\n if (!skipGroup && this.group) {\n prefix = this.group.transformMatrixKey(skipGroup);\n }\n prefix.push(\n this.top,\n this.left,\n this.width,\n this.height,\n this.scaleX,\n this.scaleY,\n this.angle,\n this.strokeWidth,\n this.skewX,\n this.skewY,\n +this.flipX,\n +this.flipY,\n resolveOrigin(this.originX),\n resolveOrigin(this.originY),\n );\n\n return prefix;\n }\n\n /**\n * calculate transform matrix that represents the current transformations from the\n * object's properties.\n * @param {Boolean} [skipGroup] return transform matrix for object not counting parent transformations\n * There are some situation in which this is useful to avoid the fake rotation.\n * @return {TMat2D} transform matrix for the object\n */\n calcTransformMatrix(skipGroup = false): TMat2D {\n let matrix = this.calcOwnMatrix();\n if (skipGroup || !this.group) {\n return matrix;\n }\n const key = this.transformMatrixKey(skipGroup),\n cache = this.matrixCache;\n if (cache && cache.key.every((x, i) => x === key[i])) {\n return cache.value;\n }\n if (this.group) {\n matrix = multiplyTransformMatrices(\n this.group.calcTransformMatrix(false),\n matrix,\n );\n }\n this.matrixCache = {\n key,\n value: matrix,\n };\n return matrix;\n }\n\n /**\n * calculate transform matrix that represents the current transformations from the\n * object's properties, this matrix does not include the group transformation\n * @return {TMat2D} transform matrix for the object\n */\n calcOwnMatrix(): TMat2D {\n const key = this.transformMatrixKey(true),\n cache = this.ownMatrixCache;\n if (cache && cache.key === key) {\n return cache.value;\n }\n const center = this.getRelativeCenterPoint(),\n options = {\n angle: this.angle,\n translateX: center.x,\n translateY: center.y,\n scaleX: this.scaleX,\n scaleY: this.scaleY,\n skewX: this.skewX,\n skewY: this.skewY,\n flipX: this.flipX,\n flipY: this.flipY,\n },\n value = composeMatrix(options);\n this.ownMatrixCache = {\n key,\n value,\n };\n return value;\n }\n\n /**\n * Calculate object dimensions from its properties\n * @private\n * @returns {Point} dimensions\n */\n _getNonTransformedDimensions(): Point {\n return new Point(this.width, this.height).scalarAdd(this.strokeWidth);\n }\n\n /**\n * Calculate object dimensions for controls box, including padding and canvas zoom.\n * and active selection\n * @private\n * @param {object} [options] transform options\n * @returns {Point} dimensions\n */\n _calculateCurrentDimensions(options?: any): Point {\n return this._getTransformedDimensions(options)\n .transform(this.getViewportTransform(), true)\n .scalarAdd(2 * this.padding);\n }\n\n // #region Origin\n\n declare top: number;\n declare left: number;\n declare width: number;\n declare height: number;\n declare flipX: boolean;\n declare flipY: boolean;\n declare scaleX: number;\n declare scaleY: number;\n declare skewX: number;\n declare skewY: number;\n /**\n * @deprecated please use 'center' as value in new projects\n * */\n declare originX: TOriginX;\n /**\n * @deprecated please use 'center' as value in new projects\n * */\n declare originY: TOriginY;\n declare angle: TDegree;\n declare strokeWidth: number;\n declare strokeUniform: boolean;\n\n /**\n * Object containing this object.\n * can influence its size and position\n */\n declare group?: Group;\n\n /**\n * Calculate object bounding box dimensions from its properties scale, skew.\n * This bounding box is aligned with object angle and not with canvas axis or screen.\n * @param {Object} [options]\n * @param {Number} [options.scaleX]\n * @param {Number} [options.scaleY]\n * @param {Number} [options.skewX]\n * @param {Number} [options.skewY]\n * @private\n * @returns {Point} dimensions\n */\n _getTransformedDimensions(options: any = {}): Point {\n const dimOptions = {\n // if scaleX or scaleY are negative numbers,\n // this will return dimensions that are negative.\n // and this will break assumptions around the codebase\n scaleX: this.scaleX,\n scaleY: this.scaleY,\n skewX: this.skewX,\n skewY: this.skewY,\n width: this.width,\n height: this.height,\n strokeWidth: this.strokeWidth,\n // TODO remove this spread. is visible in the performance inspection\n ...options,\n };\n // stroke is applied before/after transformations are applied according to `strokeUniform`\n const strokeWidth = dimOptions.strokeWidth;\n let preScalingStrokeValue = strokeWidth,\n postScalingStrokeValue = 0;\n\n if (this.strokeUniform) {\n preScalingStrokeValue = 0;\n postScalingStrokeValue = strokeWidth;\n }\n const dimX = dimOptions.width + preScalingStrokeValue,\n dimY = dimOptions.height + preScalingStrokeValue,\n noSkew = dimOptions.skewX === 0 && dimOptions.skewY === 0;\n let finalDimensions;\n if (noSkew) {\n finalDimensions = new Point(\n dimX * dimOptions.scaleX,\n dimY * dimOptions.scaleY,\n );\n } else {\n finalDimensions = sizeAfterTransform(\n dimX,\n dimY,\n calcDimensionsMatrix(dimOptions),\n );\n }\n\n return finalDimensions.scalarAdd(postScalingStrokeValue);\n }\n\n /**\n * Translates the coordinates from a set of origin to another (based on the object's dimensions)\n * @param {Point} point The point which corresponds to the originX and originY params\n * @param {TOriginX} fromOriginX Horizontal origin: 'left', 'center' or 'right'\n * @param {TOriginY} fromOriginY Vertical origin: 'top', 'center' or 'bottom'\n * @param {TOriginX} toOriginX Horizontal origin: 'left', 'center' or 'right'\n * @param {TOriginY} toOriginY Vertical origin: 'top', 'center' or 'bottom'\n * @return {Point}\n */\n translateToGivenOrigin(\n point: Point,\n fromOriginX: TOriginX,\n fromOriginY: TOriginY,\n toOriginX: TOriginX,\n toOriginY: TOriginY,\n ): Point {\n let x = point.x,\n y = point.y;\n const offsetX = resolveOrigin(toOriginX) - resolveOrigin(fromOriginX),\n offsetY = resolveOrigin(toOriginY) - resolveOrigin(fromOriginY);\n\n if (offsetX || offsetY) {\n const dim = this._getTransformedDimensions();\n x += offsetX * dim.x;\n y += offsetY * dim.y;\n }\n\n return new Point(x, y);\n }\n\n /**\n * Translates the coordinates from origin to center coordinates (based on the object's dimensions)\n * @param {Point} point The point which corresponds to the originX and originY params\n * @param {TOriginX} originX Horizontal origin: 'left', 'center' or 'right'\n * @param {TOriginY} originY Vertical origin: 'top', 'center' or 'bottom'\n * @return {Point}\n */\n translateToCenterPoint(\n point: Point,\n originX: TOriginX,\n originY: TOriginY,\n ): Point {\n if (originX === CENTER && originY === CENTER) {\n return point;\n }\n const p = this.translateToGivenOrigin(\n point,\n originX,\n originY,\n CENTER,\n CENTER,\n );\n if (this.angle) {\n return p.rotate(degreesToRadians(this.angle), point);\n }\n return p;\n }\n\n /**\n * Translates the coordinates from center to origin coordinates (based on the object's dimensions)\n * @param {Point} center The point which corresponds to center of the object\n * @param {OriginX} originX Horizontal origin: 'left', 'center' or 'right'\n * @param {OriginY} originY Vertical origin: 'top', 'center' or 'bottom'\n * @return {Point}\n */\n translateToOriginPoint(\n center: Point,\n originX: TOriginX,\n originY: TOriginY,\n ): Point {\n const p = this.translateToGivenOrigin(\n center,\n CENTER,\n CENTER,\n originX,\n originY,\n );\n if (this.angle) {\n return p.rotate(degreesToRadians(this.angle), center);\n }\n return p;\n }\n\n /**\n * Returns the center coordinates of the object relative to canvas\n * @return {Point}\n */\n getCenterPoint(): Point {\n const relCenter = this.getRelativeCenterPoint();\n return this.group\n ? transformPoint(relCenter, this.group.calcTransformMatrix())\n : relCenter;\n }\n\n /**\n * Returns the center coordinates of the object relative to it's parent\n * @return {Point}\n */\n getRelativeCenterPoint(): Point {\n return this.translateToCenterPoint(\n new Point(this.left, this.top),\n this.originX,\n this.originY,\n );\n }\n\n /**\n * Returns the position of the object as if it has a different origin.\n * Take an object that has left, top set to 100, 100 with origin 'left', 'top'.\n * Return the values of left top ( wrapped in a point ) that you would need to keep\n * the same position if origin where different.\n * Alternatively you can use this to also find which point in the parent plane is a specific origin\n * ( where is the bottom right corner of my object? )\n * @param {TOriginX} originX Horizontal origin: 'left', 'center' or 'right'\n * @param {TOriginY} originY Vertical origin: 'top', 'center' or 'bottom'\n * @return {Point}\n */\n getPointByOrigin(originX: TOriginX, originY: TOriginY): Point {\n return this.translateToOriginPoint(\n this.getRelativeCenterPoint(),\n originX,\n originY,\n );\n }\n\n /**\n * Sets the position of the object taking into consideration the object's origin\n * @param {Point} pos The new position of the object\n * @param {TOriginX} originX Horizontal origin: 'left', 'center' or 'right'\n * @param {TOriginY} originY Vertical origin: 'top', 'center' or 'bottom'\n * @return {void}\n */\n setPositionByOrigin(pos: Point, originX: TOriginX, originY: TOriginY) {\n const center = this.translateToCenterPoint(pos, originX, originY),\n position = this.translateToOriginPoint(\n center,\n this.originX,\n this.originY,\n );\n this.set({ left: position.x, top: position.y });\n }\n\n /**\n * @private\n */\n _getLeftTopCoords() {\n return this.translateToOriginPoint(\n this.getRelativeCenterPoint(),\n LEFT,\n TOP,\n );\n }\n}\n","import { cache } from '../../cache';\nimport { config } from '../../config';\nimport {\n ALIASING_LIMIT,\n CENTER,\n iMatrix,\n LEFT,\n SCALE_X,\n SCALE_Y,\n STROKE,\n FILL,\n TOP,\n VERSION,\n} from '../../constants';\nimport type { ObjectEvents } from '../../EventTypeDefs';\nimport { Point } from '../../Point';\nimport { Shadow } from '../../Shadow';\nimport type {\n TDegree,\n TFiller,\n TSize,\n TCacheCanvasDimensions,\n Abortable,\n TOptions,\n ImageFormat,\n} from '../../typedefs';\nimport { classRegistry } from '../../ClassRegistry';\nimport { runningAnimations } from '../../util/animation/AnimationRegistry';\nimport { capValue } from '../../util/misc/capValue';\nimport {\n createCanvasElement,\n createCanvasElementFor,\n toDataURL,\n toBlob,\n} from '../../util/misc/dom';\nimport { invertTransform, qrDecompose } from '../../util/misc/matrix';\nimport { enlivenObjectEnlivables } from '../../util/misc/objectEnlive';\nimport {\n resetObjectTransform,\n saveObjectTransform,\n} from '../../util/misc/objectTransforms';\nimport { sendObjectToPlane } from '../../util/misc/planeChange';\nimport { pick, pickBy } from '../../util/misc/pick';\nimport { toFixed } from '../../util/misc/toFixed';\nimport type { Group } from '../Group';\nimport { StaticCanvas } from '../../canvas/StaticCanvas';\nimport { isFiller, isSerializableFiller } from '../../util/typeAssertions';\nimport type { FabricImage } from '../Image';\nimport {\n cacheProperties,\n fabricObjectDefaultValues,\n stateProperties,\n} from './defaultValues';\nimport type { Gradient } from '../../gradient/Gradient';\nimport type { Pattern } from '../../Pattern';\nimport type { Canvas } from '../../canvas/Canvas';\nimport type { SerializedObjectProps } from './types/SerializedObjectProps';\nimport type { ObjectProps } from './types/ObjectProps';\nimport { getDevicePixelRatio, getEnv } from '../../env';\nimport { log } from '../../util/internals/console';\nimport type { TColorArg } from '../../color/typedefs';\nimport type { TAnimation } from '../../util/animation/animate';\nimport { animate, animateColor } from '../../util/animation/animate';\nimport type {\n AnimationOptions,\n ArrayAnimationOptions,\n ColorAnimationOptions,\n ValueAnimationOptions,\n} from '../../util/animation/types';\nimport { ObjectGeometry } from './ObjectGeometry';\n\ntype TAncestor = FabricObject;\ntype TCollection = Group;\n\nexport type Ancestors =\n | [FabricObject | Group]\n | [FabricObject | Group, ...Group[]]\n | Group[];\n\nexport type AncestryComparison = {\n /**\n * common ancestors of `this` and`other`(may include`this` | `other`)\n */\n common: Ancestors;\n /**\n * ancestors that are of `this` only\n */\n fork: Ancestors;\n /**\n * ancestors that are of `other` only\n */\n otherFork: Ancestors;\n};\n\nexport type TCachedFabricObject = T &\n Required<\n Pick<\n T,\n | 'zoomX'\n | 'zoomY'\n | '_cacheCanvas'\n | '_cacheContext'\n | 'cacheTranslationX'\n | 'cacheTranslationY'\n >\n > & {\n _cacheContext: CanvasRenderingContext2D;\n };\n\nexport type ObjectToCanvasElementOptions = {\n format?: ImageFormat;\n /** Multiplier to scale by */\n multiplier?: number;\n /** Cropping left offset. Introduced in v1.2.14 */\n left?: number;\n /** Cropping top offset. Introduced in v1.2.14 */\n top?: number;\n /** Cropping width. Introduced in v1.2.14 */\n width?: number;\n /** Cropping height. Introduced in v1.2.14 */\n height?: number;\n /** Enable retina scaling for clone image. Introduce in 1.6.4 */\n enableRetinaScaling?: boolean;\n /** Remove current object transform ( no scale , no angle, no flip, no skew ). Introduced in 2.3.4 */\n withoutTransform?: boolean;\n /** Remove current object shadow. Introduced in 2.4.2 */\n withoutShadow?: boolean;\n /** Account for canvas viewport transform */\n viewportTransform?: boolean;\n /** Function to create the output canvas to export onto */\n canvasProvider?: (el?: HTMLCanvasElement) => T;\n};\n\ntype toDataURLOptions = ObjectToCanvasElementOptions & {\n quality?: number;\n};\n\nexport type DrawContext =\n | {\n parentClipPaths: FabricObject[];\n width: number;\n height: number;\n cacheTranslationX: number;\n cacheTranslationY: number;\n zoomX: number;\n zoomY: number;\n }\n | Record;\n\n/**\n * Root object class from which all 2d shape classes inherit from\n * @tutorial {@link http://fabricjs.com/fabric-intro-part-1#objects}\n *\n * @fires added\n * @fires removed\n *\n * @fires selected\n * @fires deselected\n *\n * @fires rotating\n * @fires scaling\n * @fires moving\n * @fires skewing\n * @fires modified\n *\n * @fires mousedown\n * @fires mouseup\n * @fires mouseover\n * @fires mouseout\n * @fires mousewheel\n * @fires mousedblclick\n *\n * @fires dragover\n * @fires dragenter\n * @fires dragleave\n * @fires drop\n */\nexport class FabricObject<\n Props extends TOptions = Partial,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n SProps extends SerializedObjectProps = SerializedObjectProps,\n EventSpec extends ObjectEvents = ObjectEvents,\n >\n extends ObjectGeometry\n implements ObjectProps\n{\n declare minScaleLimit: number;\n\n declare opacity: number;\n\n declare paintFirst: 'fill' | 'stroke';\n declare fill: string | TFiller | null;\n declare fillRule: CanvasFillRule;\n declare stroke: string | TFiller | null;\n declare strokeDashArray: number[] | null;\n declare strokeDashOffset: number;\n declare strokeLineCap: CanvasLineCap;\n declare strokeLineJoin: CanvasLineJoin;\n declare strokeMiterLimit: number;\n\n declare globalCompositeOperation: GlobalCompositeOperation;\n declare backgroundColor: string;\n\n declare shadow: Shadow | null;\n\n declare visible: boolean;\n\n declare includeDefaultValues: boolean;\n declare excludeFromExport: boolean;\n\n declare objectCaching: boolean;\n\n declare clipPath?: FabricObject;\n declare inverted: boolean;\n declare absolutePositioned: boolean;\n declare centeredRotation: boolean;\n declare centeredScaling: boolean;\n\n /**\n * This list of properties is used to check if the state of an object is changed.\n * This state change now is only used for children of groups to understand if a group\n * needs its cache regenerated during a .set call\n * @type Array\n */\n static stateProperties: string[] = stateProperties;\n\n /**\n * List of properties to consider when checking if cache needs refresh\n * Those properties are checked by\n * calls to Object.set(key, value). If the key is in this list, the object is marked as dirty\n * and refreshed at the next render\n * @type Array\n */\n static cacheProperties: string[] = cacheProperties;\n\n /**\n * When set to `true`, object's cache will be rerendered next render call.\n * since 1.7.0\n * @type Boolean\n * @default true\n */\n declare dirty: boolean;\n\n /**\n * Quick access for the _cacheCanvas rendering context\n * This is part of the objectCaching feature\n * since 1.7.0\n * @type boolean\n * @default undefined\n * @private\n */\n _cacheContext: CanvasRenderingContext2D | null = null;\n\n /**\n * A reference to the HTMLCanvasElement that is used to contain the cache of the object\n * this canvas element is resized and cleared as needed\n * Is marked private, you can read it, don't use it since it is handled by fabric\n * since 1.7.0\n * @type HTMLCanvasElement\n * @default undefined\n * @private\n */\n declare _cacheCanvas?: HTMLCanvasElement;\n\n /**\n * zoom level used on the cacheCanvas to draw the cache, X axe\n * since 1.7.0\n * @type number\n * @default undefined\n * @private\n */\n declare zoomX?: number;\n\n /**\n * zoom level used on the cacheCanvas to draw the cache, Y axe\n * since 1.7.0\n * @type number\n * @default undefined\n * @private\n */\n declare zoomY?: number;\n\n /**\n * zoom level used on the cacheCanvas to draw the cache, Y axe\n * since 1.7.0\n * @type number\n * @default undefined\n * @private\n */\n declare cacheTranslationX?: number;\n\n /**\n * translation of the cacheCanvas away from the center, for subpixel accuracy and crispness\n * since 1.7.0\n * @type number\n * @default undefined\n * @private\n */\n declare cacheTranslationY?: number;\n\n /**\n * A reference to the parent of the object, usually a Group\n * @type number\n * @default undefined\n * @private\n */\n declare group?: Group;\n\n /**\n * Indicate if the object is sitting on a cache dedicated to it\n * or is part of a larger cache for many object ( a group for example)\n * @type number\n * @default undefined\n * @private\n */\n declare ownCaching?: boolean;\n\n /**\n * Private. indicates if the object inside a group is on a transformed context or not\n * or is part of a larger cache for many object ( a group for example)\n * @type boolean\n * @default undefined\n * @private\n */\n declare _transformDone?: boolean;\n\n static ownDefaults = fabricObjectDefaultValues;\n\n static getDefaults(): Record {\n return FabricObject.ownDefaults;\n }\n\n /**\n * The class type.\n * This is used for serialization and deserialization purposes and internally it can be used\n * to identify classes.\n * When we transform a class in a plain JS object we need a way to recognize which class it was,\n * and the type is the way we do that. It has no other purposes and you should not give one.\n * Hard to reach on instances and please do not use to drive instance's logic (this.constructor.type).\n * To idenfity a class use instanceof class ( instanceof Rect ).\n * We do not do that in fabricJS code because we want to try to have code splitting possible.\n */\n static type = 'FabricObject';\n\n /**\n * Legacy identifier of the class. Prefer using utils like isType or instanceOf\n * Will be removed in fabric 7 or 8.\n * The setter exists to avoid type errors in old code and possibly current deserialization code.\n * DO NOT build new code around this type value\n * @TODO add sustainable warning message\n * @type string\n * @deprecated\n */\n get type() {\n const name = (this.constructor as typeof FabricObject).type;\n if (name === 'FabricObject') {\n return 'object';\n }\n return name.toLowerCase();\n }\n\n set type(value) {\n log('warn', 'Setting type has no effect', value);\n }\n\n /**\n * Constructor\n * @param {Object} [options] Options object\n */\n constructor(options?: Props) {\n super();\n Object.assign(this, FabricObject.ownDefaults);\n this.setOptions(options);\n }\n\n /**\n * Create a the canvas used to keep the cached copy of the object\n * @private\n */\n _createCacheCanvas() {\n this._cacheCanvas = createCanvasElement();\n this._cacheContext = this._cacheCanvas.getContext('2d');\n this._updateCacheCanvas();\n // if canvas gets created, is empty, so dirty.\n this.dirty = true;\n }\n\n /**\n * Limit the cache dimensions so that X * Y do not cross config.perfLimitSizeTotal\n * and each side do not cross fabric.cacheSideLimit\n * those numbers are configurable so that you can get as much detail as you want\n * making bargain with performances.\n * It mutates the input object dims.\n * @param {TCacheCanvasDimensions} dims\n * @return {TCacheCanvasDimensions} dims\n */\n _limitCacheSize(\n dims: TCacheCanvasDimensions & { capped?: boolean },\n ): TCacheCanvasDimensions & { capped?: boolean } {\n const width = dims.width,\n height = dims.height,\n max = config.maxCacheSideLimit,\n min = config.minCacheSideLimit;\n if (\n width <= max &&\n height <= max &&\n width * height <= config.perfLimitSizeTotal\n ) {\n if (width < min) {\n dims.width = min;\n }\n if (height < min) {\n dims.height = min;\n }\n return dims;\n }\n const ar = width / height,\n [limX, limY] = cache.limitDimsByArea(ar),\n x = capValue(min, limX, max),\n y = capValue(min, limY, max);\n if (width > x) {\n dims.zoomX /= width / x;\n dims.width = x;\n dims.capped = true;\n }\n if (height > y) {\n dims.zoomY /= height / y;\n dims.height = y;\n dims.capped = true;\n }\n return dims;\n }\n\n /**\n * Return the dimension and the zoom level needed to create a cache canvas\n * big enough to host the object to be cached.\n * @private\n * @return {TCacheCanvasDimensions} Informations about the object to be cached\n */\n _getCacheCanvasDimensions(): TCacheCanvasDimensions {\n const objectScale = this.getTotalObjectScaling(),\n // calculate dimensions without skewing\n dim = this._getTransformedDimensions({ skewX: 0, skewY: 0 }),\n neededX = (dim.x * objectScale.x) / this.scaleX,\n neededY = (dim.y * objectScale.y) / this.scaleY;\n return {\n // for sure this ALIASING_LIMIT is slightly creating problem\n // in situation in which the cache canvas gets an upper limit\n // also objectScale contains already scaleX and scaleY\n width: Math.ceil(neededX + ALIASING_LIMIT),\n height: Math.ceil(neededY + ALIASING_LIMIT),\n zoomX: objectScale.x,\n zoomY: objectScale.y,\n x: neededX,\n y: neededY,\n };\n }\n\n /**\n * Update width and height of the canvas for cache\n * returns true or false if canvas needed resize.\n * @private\n * @return {Boolean} true if the canvas has been resized\n */\n _updateCacheCanvas() {\n const canvas = this._cacheCanvas!,\n context = this._cacheContext,\n { width, height, zoomX, zoomY, x, y } = this._limitCacheSize(\n this._getCacheCanvasDimensions(),\n ),\n dimensionsChanged = width !== canvas.width || height !== canvas.height,\n zoomChanged = this.zoomX !== zoomX || this.zoomY !== zoomY;\n\n if (!canvas || !context) {\n return false;\n }\n\n const shouldRedraw = dimensionsChanged || zoomChanged;\n\n if (shouldRedraw) {\n if (width !== canvas.width || height !== canvas.height) {\n canvas.width = width;\n canvas.height = height;\n } else {\n context.setTransform(1, 0, 0, 1, 0, 0);\n context.clearRect(0, 0, canvas.width, canvas.height);\n }\n const drawingWidth = x / 2;\n const drawingHeight = y / 2;\n this.cacheTranslationX =\n Math.round(canvas.width / 2 - drawingWidth) + drawingWidth;\n this.cacheTranslationY =\n Math.round(canvas.height / 2 - drawingHeight) + drawingHeight;\n context.translate(this.cacheTranslationX, this.cacheTranslationY);\n context.scale(zoomX, zoomY);\n this.zoomX = zoomX;\n this.zoomY = zoomY;\n return true;\n }\n return false;\n }\n\n /**\n * Sets object's properties from options, for class constructor only.\n * Needs to be overridden for different defaults.\n * @protected\n * @param {Object} [options] Options object\n */\n protected setOptions(options: Record = {}) {\n this._setOptions(options);\n }\n\n /**\n * Transforms context when rendering an object\n * @param {CanvasRenderingContext2D} ctx Context\n */\n transform(ctx: CanvasRenderingContext2D) {\n const needFullTransform =\n (this.group && !this.group._transformDone) ||\n (this.group && this.canvas && ctx === (this.canvas as Canvas).contextTop);\n const m = this.calcTransformMatrix(!needFullTransform);\n ctx.transform(m[0], m[1], m[2], m[3], m[4], m[5]);\n }\n\n /**\n * Return the object scale factor counting also the group scaling\n * @return {Point}\n */\n getObjectScaling() {\n // if the object is a top level one, on the canvas, we go for simple aritmetic\n // otherwise the complex method with angles will return approximations and decimals\n // and will likely kill the cache when not needed\n // https://github.com/fabricjs/fabric.js/issues/7157\n if (!this.group) {\n return new Point(Math.abs(this.scaleX), Math.abs(this.scaleY));\n }\n // if we are inside a group total zoom calculation is complex, we defer to generic matrices\n const options = qrDecompose(this.calcTransformMatrix());\n return new Point(Math.abs(options.scaleX), Math.abs(options.scaleY));\n }\n\n /**\n * Return the object scale factor counting also the group scaling, zoom and retina\n * @return {Object} object with scaleX and scaleY properties\n */\n getTotalObjectScaling() {\n const scale = this.getObjectScaling();\n if (this.canvas) {\n const zoom = this.canvas.getZoom();\n const retina = this.getCanvasRetinaScaling();\n return scale.scalarMultiply(zoom * retina);\n }\n return scale;\n }\n\n /**\n * Return the object opacity counting also the group property\n * @return {Number}\n */\n getObjectOpacity() {\n let opacity = this.opacity;\n if (this.group) {\n opacity *= this.group.getObjectOpacity();\n }\n return opacity;\n }\n\n /**\n * Makes sure the scale is valid and modifies it if necessary\n * @todo: this is a control action issue, not a geometry one\n * @private\n * @param {Number} value, unconstrained\n * @return {Number} constrained value;\n */\n _constrainScale(value: number): number {\n if (Math.abs(value) < this.minScaleLimit) {\n if (value < 0) {\n return -this.minScaleLimit;\n } else {\n return this.minScaleLimit;\n }\n } else if (value === 0) {\n return 0.0001;\n }\n return value;\n }\n\n /**\n * Handles setting values on the instance and handling internal side effects\n * @protected\n * @param {String} key\n * @param {*} value\n */\n _set(key: string, value: any) {\n if (key === SCALE_X || key === SCALE_Y) {\n value = this._constrainScale(value);\n }\n if (key === SCALE_X && value < 0) {\n this.flipX = !this.flipX;\n value *= -1;\n } else if (key === 'scaleY' && value < 0) {\n this.flipY = !this.flipY;\n value *= -1;\n // i don't like this automatic initialization here\n } else if (key === 'shadow' && value && !(value instanceof Shadow)) {\n value = new Shadow(value);\n }\n\n const isChanged = this[key as keyof this] !== value;\n this[key as keyof this] = value;\n\n // invalidate caches\n if (\n isChanged &&\n (this.constructor as typeof FabricObject).cacheProperties.includes(key)\n ) {\n this.dirty = true;\n }\n // a dirty child makes the parent dirty.\n // but a non dirty child does not make the parent not dirty.\n // the parent could be dirty for some other reason.\n this.parent &&\n (this.dirty ||\n (isChanged &&\n (this.constructor as typeof FabricObject).stateProperties.includes(\n key,\n ))) &&\n this.parent._set('dirty', true);\n\n return this;\n }\n\n /**\n * return if the object would be visible in rendering\n * @return {Boolean}\n */\n isNotVisible() {\n return (\n this.opacity === 0 ||\n (!this.width && !this.height && this.strokeWidth === 0) ||\n !this.visible\n );\n }\n\n /**\n * Renders an object on a specified context\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n render(ctx: CanvasRenderingContext2D) {\n // do not render if width/height are zeros or object is not visible\n if (this.isNotVisible()) {\n return;\n }\n if (\n this.canvas &&\n this.canvas.skipOffscreen &&\n !this.group &&\n !this.isOnScreen()\n ) {\n return;\n }\n ctx.save();\n this._setupCompositeOperation(ctx);\n this.drawSelectionBackground(ctx);\n this.transform(ctx);\n this._setOpacity(ctx);\n this._setShadow(ctx);\n if (this.shouldCache()) {\n (this as TCachedFabricObject).renderCache();\n (this as TCachedFabricObject).drawCacheOnCanvas(ctx);\n } else {\n this._removeCacheCanvas();\n this.drawObject(ctx, false, {});\n this.dirty = false;\n }\n ctx.restore();\n }\n\n drawSelectionBackground(_ctx: CanvasRenderingContext2D) {\n /* no op */\n }\n\n renderCache(this: TCachedFabricObject, options?: any) {\n options = options || {};\n if (!this._cacheCanvas || !this._cacheContext) {\n this._createCacheCanvas();\n }\n if (this.isCacheDirty() && this._cacheContext) {\n const { zoomX, zoomY, cacheTranslationX, cacheTranslationY } = this;\n const { width, height } = this._cacheCanvas;\n this.drawObject(this._cacheContext, options.forClipping, {\n zoomX,\n zoomY,\n cacheTranslationX,\n cacheTranslationY,\n width,\n height,\n parentClipPaths: [],\n });\n this.dirty = false;\n }\n }\n\n /**\n * Remove cacheCanvas and its dimensions from the objects\n */\n _removeCacheCanvas() {\n this._cacheCanvas = undefined;\n this._cacheContext = null;\n }\n\n /**\n * return true if the object will draw a stroke\n * Does not consider text styles. This is just a shortcut used at rendering time\n * We want it to be an approximation and be fast.\n * wrote to avoid extra caching, it has to return true when stroke happens,\n * can guess when it will not happen at 100% chance, does not matter if it misses\n * some use case where the stroke is invisible.\n * @since 3.0.0\n * @returns Boolean\n */\n hasStroke(): boolean {\n return (\n !!this.stroke && this.stroke !== 'transparent' && this.strokeWidth !== 0\n );\n }\n\n /**\n * return true if the object will draw a fill\n * Does not consider text styles. This is just a shortcut used at rendering time\n * We want it to be an approximation and be fast.\n * wrote to avoid extra caching, it has to return true when fill happens,\n * can guess when it will not happen at 100% chance, does not matter if it misses\n * some use case where the fill is invisible.\n * @since 3.0.0\n * @returns Boolean\n */\n hasFill(): boolean {\n return !!this.fill && this.fill !== 'transparent';\n }\n\n /**\n * When returns `true`, force the object to have its own cache, even if it is inside a group\n * it may be needed when your object behave in a particular way on the cache and always needs\n * its own isolated canvas to render correctly.\n * Created to be overridden\n * since 1.7.12\n * @returns Boolean\n */\n needsItsOwnCache() {\n // TODO re-evaluate this shadow condition\n if (\n this.paintFirst === STROKE &&\n this.hasFill() &&\n this.hasStroke() &&\n !!this.shadow\n ) {\n return true;\n }\n if (this.clipPath) {\n return true;\n }\n return false;\n }\n\n /**\n * Decide if the object should cache or not. Create its own cache level\n * objectCaching is a global flag, wins over everything\n * needsItsOwnCache should be used when the object drawing method requires\n * a cache step.\n * Generally you do not cache objects in groups because the group outside is cached.\n * Read as: cache if is needed, or if the feature is enabled but we are not already caching.\n * @return {Boolean}\n */\n shouldCache() {\n this.ownCaching =\n (this.objectCaching && (!this.parent || !this.parent.isOnACache())) ||\n this.needsItsOwnCache();\n return this.ownCaching;\n }\n\n /**\n * Check if this object will cast a shadow with an offset.\n * used by Group.shouldCache to know if child has a shadow recursively\n * @return {Boolean}\n * @deprecated\n */\n willDrawShadow() {\n return (\n !!this.shadow && (this.shadow.offsetX !== 0 || this.shadow.offsetY !== 0)\n );\n }\n\n /**\n * Execute the drawing operation for an object clipPath\n * @param {CanvasRenderingContext2D} ctx Context to render on\n * @param {FabricObject} clipPath\n */\n drawClipPathOnCache(\n ctx: CanvasRenderingContext2D,\n clipPath: FabricObject,\n canvasWithClipPath: HTMLCanvasElement,\n ) {\n ctx.save();\n // DEBUG: uncomment this line, comment the following\n // ctx.globalAlpha = 0.4\n if (clipPath.inverted) {\n ctx.globalCompositeOperation = 'destination-out';\n } else {\n ctx.globalCompositeOperation = 'destination-in';\n }\n ctx.setTransform(1, 0, 0, 1, 0, 0);\n ctx.drawImage(canvasWithClipPath, 0, 0);\n ctx.restore();\n }\n\n /**\n * Execute the drawing operation for an object on a specified context\n * @param {CanvasRenderingContext2D} ctx Context to render on\n * @param {boolean} forClipping apply clipping styles\n * @param {DrawContext} context additional context for rendering\n */\n drawObject(\n ctx: CanvasRenderingContext2D,\n forClipping: boolean | undefined,\n context: DrawContext,\n ) {\n const originalFill = this.fill,\n originalStroke = this.stroke;\n if (forClipping) {\n this.fill = 'black';\n this.stroke = '';\n this._setClippingProperties(ctx);\n } else {\n this._renderBackground(ctx);\n }\n this._render(ctx);\n this._drawClipPath(ctx, this.clipPath, context);\n this.fill = originalFill;\n this.stroke = originalStroke;\n }\n\n private createClipPathLayer(\n this: TCachedFabricObject,\n clipPath: FabricObject,\n context: DrawContext,\n ) {\n const canvas = createCanvasElementFor(context as TSize);\n const ctx = canvas.getContext('2d')!;\n ctx.translate(context.cacheTranslationX, context.cacheTranslationY);\n ctx.scale(context.zoomX, context.zoomY);\n clipPath._cacheCanvas = canvas;\n context.parentClipPaths.forEach((prevClipPath) => {\n prevClipPath.transform(ctx);\n });\n context.parentClipPaths.push(clipPath);\n if (clipPath.absolutePositioned) {\n const m = invertTransform(this.calcTransformMatrix());\n ctx.transform(m[0], m[1], m[2], m[3], m[4], m[5]);\n }\n clipPath.transform(ctx);\n clipPath.drawObject(ctx, true, context);\n return canvas;\n }\n\n /**\n * Prepare clipPath state and cache and draw it on instance's cache\n * @param {CanvasRenderingContext2D} ctx\n * @param {FabricObject} clipPath\n */\n _drawClipPath(\n ctx: CanvasRenderingContext2D,\n clipPath: FabricObject | undefined,\n context: DrawContext,\n ) {\n if (!clipPath) {\n return;\n }\n // needed to setup _transformDone\n // TODO find a better solution?\n clipPath._transformDone = true;\n const canvas = (this as TCachedFabricObject).createClipPathLayer(\n clipPath,\n context,\n );\n this.drawClipPathOnCache(ctx, clipPath, canvas);\n }\n\n /**\n * Paint the cached copy of the object on the target context.\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n drawCacheOnCanvas(this: TCachedFabricObject, ctx: CanvasRenderingContext2D) {\n ctx.scale(1 / this.zoomX, 1 / this.zoomY);\n ctx.drawImage(\n this._cacheCanvas,\n -this.cacheTranslationX,\n -this.cacheTranslationY,\n );\n }\n\n /**\n * Check if cache is dirty and if is dirty clear the context.\n * This check has a big side effect, it changes the underlying cache canvas if necessary.\n * Do not call this method on your own to check if the cache is dirty, because if it is,\n * it is also going to wipe the cache. This is badly designed and needs to be fixed.\n * @param {Boolean} skipCanvas skip canvas checks because this object is painted\n * on parent canvas.\n */\n isCacheDirty(skipCanvas = false) {\n if (this.isNotVisible()) {\n return false;\n }\n const canvas = this._cacheCanvas;\n const ctx = this._cacheContext;\n if (canvas && ctx && !skipCanvas && this._updateCacheCanvas()) {\n // in this case the context is already cleared.\n return true;\n } else {\n if (this.dirty || (this.clipPath && this.clipPath.absolutePositioned)) {\n if (canvas && ctx && !skipCanvas) {\n ctx.save();\n ctx.setTransform(1, 0, 0, 1, 0, 0);\n ctx.clearRect(0, 0, canvas.width, canvas.height);\n ctx.restore();\n }\n return true;\n }\n }\n return false;\n }\n\n /**\n * Draws a background for the object big as its untransformed dimensions\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _renderBackground(ctx: CanvasRenderingContext2D) {\n if (!this.backgroundColor) {\n return;\n }\n const dim = this._getNonTransformedDimensions();\n ctx.fillStyle = this.backgroundColor;\n\n ctx.fillRect(-dim.x / 2, -dim.y / 2, dim.x, dim.y);\n // if there is background color no other shadows\n // should be casted\n this._removeShadow(ctx);\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _setOpacity(ctx: CanvasRenderingContext2D) {\n if (this.group && !this.group._transformDone) {\n ctx.globalAlpha = this.getObjectOpacity();\n } else {\n ctx.globalAlpha *= this.opacity;\n }\n }\n\n _setStrokeStyles(\n ctx: CanvasRenderingContext2D,\n decl: Pick<\n this,\n | 'stroke'\n | 'strokeWidth'\n | 'strokeLineCap'\n | 'strokeDashOffset'\n | 'strokeLineJoin'\n | 'strokeMiterLimit'\n >,\n ) {\n const stroke = decl.stroke;\n if (stroke) {\n ctx.lineWidth = decl.strokeWidth;\n ctx.lineCap = decl.strokeLineCap;\n ctx.lineDashOffset = decl.strokeDashOffset;\n ctx.lineJoin = decl.strokeLineJoin;\n ctx.miterLimit = decl.strokeMiterLimit;\n if (isFiller(stroke)) {\n if (\n (stroke as Gradient<'linear'>).gradientUnits === 'percentage' ||\n (stroke as Gradient<'linear'>).gradientTransform ||\n (stroke as Pattern).patternTransform\n ) {\n // need to transform gradient in a pattern.\n // this is a slow process. If you are hitting this codepath, and the object\n // is not using caching, you should consider switching it on.\n // we need a canvas as big as the current object caching canvas.\n this._applyPatternForTransformedGradient(ctx, stroke);\n } else {\n // is a simple gradient or pattern\n ctx.strokeStyle = stroke.toLive(ctx)!;\n this._applyPatternGradientTransform(ctx, stroke);\n }\n } else {\n // is a color\n ctx.strokeStyle = decl.stroke as string;\n }\n }\n }\n\n _setFillStyles(ctx: CanvasRenderingContext2D, { fill }: Pick) {\n if (fill) {\n if (isFiller(fill)) {\n ctx.fillStyle = fill.toLive(ctx)!;\n this._applyPatternGradientTransform(ctx, fill);\n } else {\n ctx.fillStyle = fill;\n }\n }\n }\n\n _setClippingProperties(ctx: CanvasRenderingContext2D) {\n ctx.globalAlpha = 1;\n ctx.strokeStyle = 'transparent';\n ctx.fillStyle = '#000000';\n }\n\n /**\n * @private\n * Sets line dash\n * @param {CanvasRenderingContext2D} ctx Context to set the dash line on\n * @param {Array} dashArray array representing dashes\n */\n _setLineDash(ctx: CanvasRenderingContext2D, dashArray?: number[] | null) {\n if (!dashArray || dashArray.length === 0) {\n return;\n }\n ctx.setLineDash(dashArray);\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _setShadow(ctx: CanvasRenderingContext2D) {\n if (!this.shadow) {\n return;\n }\n\n const shadow = this.shadow,\n canvas = this.canvas,\n retinaScaling = this.getCanvasRetinaScaling(),\n [sx, , , sy] = canvas?.viewportTransform || iMatrix,\n multX = sx * retinaScaling,\n multY = sy * retinaScaling,\n scaling = shadow.nonScaling ? new Point(1, 1) : this.getObjectScaling();\n ctx.shadowColor = shadow.color;\n ctx.shadowBlur =\n (shadow.blur *\n config.browserShadowBlurConstant *\n (multX + multY) *\n (scaling.x + scaling.y)) /\n 4;\n ctx.shadowOffsetX = shadow.offsetX * multX * scaling.x;\n ctx.shadowOffsetY = shadow.offsetY * multY * scaling.y;\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _removeShadow(ctx: CanvasRenderingContext2D) {\n if (!this.shadow) {\n return;\n }\n\n ctx.shadowColor = '';\n ctx.shadowBlur = ctx.shadowOffsetX = ctx.shadowOffsetY = 0;\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n * @param {TFiller} filler {@link Pattern} or {@link Gradient}\n */\n _applyPatternGradientTransform(\n ctx: CanvasRenderingContext2D,\n filler: TFiller,\n ) {\n if (!isFiller(filler)) {\n return { offsetX: 0, offsetY: 0 };\n }\n const t =\n (filler as Gradient<'linear'>).gradientTransform ||\n (filler as Pattern).patternTransform;\n const offsetX = -this.width / 2 + filler.offsetX || 0,\n offsetY = -this.height / 2 + filler.offsetY || 0;\n\n if ((filler as Gradient<'linear'>).gradientUnits === 'percentage') {\n ctx.transform(this.width, 0, 0, this.height, offsetX, offsetY);\n } else {\n ctx.transform(1, 0, 0, 1, offsetX, offsetY);\n }\n if (t) {\n ctx.transform(t[0], t[1], t[2], t[3], t[4], t[5]);\n }\n return { offsetX: offsetX, offsetY: offsetY };\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _renderPaintInOrder(ctx: CanvasRenderingContext2D) {\n if (this.paintFirst === STROKE) {\n this._renderStroke(ctx);\n this._renderFill(ctx);\n } else {\n this._renderFill(ctx);\n this._renderStroke(ctx);\n }\n }\n\n /**\n * @private\n * function that actually render something on the context.\n * empty here to allow Obects to work on tests to benchmark fabric functionalites\n * not related to rendering\n * @param {CanvasRenderingContext2D} _ctx Context to render on\n */\n _render(_ctx: CanvasRenderingContext2D) {\n // placeholder to be overridden\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _renderFill(ctx: CanvasRenderingContext2D) {\n if (!this.fill) {\n return;\n }\n\n ctx.save();\n this._setFillStyles(ctx, this);\n if (this.fillRule === 'evenodd') {\n ctx.fill('evenodd');\n } else {\n ctx.fill();\n }\n ctx.restore();\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _renderStroke(ctx: CanvasRenderingContext2D) {\n if (!this.stroke || this.strokeWidth === 0) {\n return;\n }\n\n if (this.shadow && !this.shadow.affectStroke) {\n this._removeShadow(ctx);\n }\n\n ctx.save();\n if (this.strokeUniform) {\n const scaling = this.getObjectScaling();\n ctx.scale(1 / scaling.x, 1 / scaling.y);\n }\n this._setLineDash(ctx, this.strokeDashArray);\n this._setStrokeStyles(ctx, this);\n ctx.stroke();\n ctx.restore();\n }\n\n /**\n * This function try to patch the missing gradientTransform on canvas gradients.\n * transforming a context to transform the gradient, is going to transform the stroke too.\n * we want to transform the gradient but not the stroke operation, so we create\n * a transformed gradient on a pattern and then we use the pattern instead of the gradient.\n * this method has drawbacks: is slow, is in low resolution, needs a patch for when the size\n * is limited.\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n * @param {Gradient} filler\n */\n _applyPatternForTransformedGradient(\n ctx: CanvasRenderingContext2D,\n filler: TFiller,\n ) {\n const dims = this._limitCacheSize(this._getCacheCanvasDimensions()),\n retinaScaling = this.getCanvasRetinaScaling(),\n width = dims.x / this.scaleX / retinaScaling,\n height = dims.y / this.scaleY / retinaScaling,\n pCanvas = createCanvasElementFor({\n // in case width and height are less than 1px, we have to round up.\n // since the pattern is no-repeat, this is fine\n width: Math.ceil(width),\n height: Math.ceil(height),\n });\n\n const pCtx = pCanvas.getContext('2d');\n if (!pCtx) {\n return;\n }\n pCtx.beginPath();\n pCtx.moveTo(0, 0);\n pCtx.lineTo(width, 0);\n pCtx.lineTo(width, height);\n pCtx.lineTo(0, height);\n pCtx.closePath();\n pCtx.translate(width / 2, height / 2);\n pCtx.scale(\n dims.zoomX / this.scaleX / retinaScaling,\n dims.zoomY / this.scaleY / retinaScaling,\n );\n this._applyPatternGradientTransform(pCtx, filler);\n pCtx.fillStyle = filler.toLive(ctx)!;\n pCtx.fill();\n ctx.translate(\n -this.width / 2 - this.strokeWidth / 2,\n -this.height / 2 - this.strokeWidth / 2,\n );\n ctx.scale(\n (retinaScaling * this.scaleX) / dims.zoomX,\n (retinaScaling * this.scaleY) / dims.zoomY,\n );\n ctx.strokeStyle = pCtx.createPattern(pCanvas, 'no-repeat') ?? '';\n }\n\n /**\n * This function is an helper for svg import. it returns the center of the object in the svg\n * untransformed coordinates\n * @private\n * @return {Point} center point from element coordinates\n */\n _findCenterFromElement() {\n return new Point(this.left + this.width / 2, this.top + this.height / 2);\n }\n\n /**\n * Clones an instance.\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @returns {Promise}\n */\n clone(propertiesToInclude?: string[]): Promise {\n const objectForm = this.toObject(propertiesToInclude);\n return (this.constructor as typeof FabricObject).fromObject(\n objectForm,\n ) as unknown as Promise;\n }\n\n /**\n * Creates an instance of Image out of an object\n * makes use of toCanvasElement.\n * Once this method was based on toDataUrl and loadImage, so it also had a quality\n * and format option. toCanvasElement is faster and produce no loss of quality.\n * If you need to get a real Jpeg or Png from an object, using toDataURL is the right way to do it.\n * toCanvasElement and then toBlob from the obtained canvas is also a good option.\n * @todo fix the export type, it could not be Image but the type that getClass return for 'image'.\n * @param {ObjectToCanvasElementOptions} [options] for clone as image, passed to toDataURL\n * @param {Number} [options.multiplier=1] Multiplier to scale by\n * @param {Number} [options.left] Cropping left offset. Introduced in v1.2.14\n * @param {Number} [options.top] Cropping top offset. Introduced in v1.2.14\n * @param {Number} [options.width] Cropping width. Introduced in v1.2.14\n * @param {Number} [options.height] Cropping height. Introduced in v1.2.14\n * @param {Boolean} [options.enableRetinaScaling] Enable retina scaling for clone image. Introduce in 1.6.4\n * @param {Boolean} [options.withoutTransform] Remove current object transform ( no scale , no angle, no flip, no skew ). Introduced in 2.3.4\n * @param {Boolean} [options.withoutShadow] Remove current object shadow. Introduced in 2.4.2\n * @return {FabricImage} Object cloned as image.\n */\n cloneAsImage(options: ObjectToCanvasElementOptions): FabricImage {\n const canvasEl = this.toCanvasElement(options);\n // TODO: how to import Image w/o an import cycle?\n const ImageClass = classRegistry.getClass('image');\n return new ImageClass(canvasEl);\n }\n\n /**\n * Converts an object into a HTMLCanvas element\n * @param {ObjectToCanvasElementOptions} options Options object\n * @param {Number} [options.multiplier=1] Multiplier to scale by\n * @param {Number} [options.left] Cropping left offset. Introduced in v1.2.14\n * @param {Number} [options.top] Cropping top offset. Introduced in v1.2.14\n * @param {Number} [options.width] Cropping width. Introduced in v1.2.14\n * @param {Number} [options.height] Cropping height. Introduced in v1.2.14\n * @param {Boolean} [options.enableRetinaScaling] Enable retina scaling for clone image. Introduce in 1.6.4\n * @param {Boolean} [options.withoutTransform] Remove current object transform ( no scale , no angle, no flip, no skew ). Introduced in 2.3.4\n * @param {Boolean} [options.withoutShadow] Remove current object shadow. Introduced in 2.4.2\n * @param {Boolean} [options.viewportTransform] Account for canvas viewport transform\n * @param {(el?: HTMLCanvasElement) => StaticCanvas} [options.canvasProvider] Create the output canvas\n * @return {HTMLCanvasElement} Returns DOM element with the FabricObject\n */\n toCanvasElement(options: ObjectToCanvasElementOptions = {}) {\n const origParams = saveObjectTransform(this),\n originalGroup = this.group,\n originalShadow = this.shadow,\n abs = Math.abs,\n retinaScaling = options.enableRetinaScaling ? getDevicePixelRatio() : 1,\n multiplier = (options.multiplier || 1) * retinaScaling,\n canvasProvider: (el: HTMLCanvasElement) => StaticCanvas =\n options.canvasProvider ||\n ((el: HTMLCanvasElement) =>\n new StaticCanvas(el, {\n enableRetinaScaling: false,\n renderOnAddRemove: false,\n skipOffscreen: false,\n }));\n delete this.group;\n if (options.withoutTransform) {\n resetObjectTransform(this);\n }\n if (options.withoutShadow) {\n this.shadow = null;\n }\n if (options.viewportTransform) {\n sendObjectToPlane(this, this.getViewportTransform());\n }\n\n this.setCoords();\n const el = createCanvasElement(),\n boundingRect = this.getBoundingRect(),\n shadow = this.shadow,\n shadowOffset = new Point();\n\n if (shadow) {\n const shadowBlur = shadow.blur;\n const scaling = shadow.nonScaling\n ? new Point(1, 1)\n : this.getObjectScaling();\n // consider non scaling shadow.\n shadowOffset.x =\n 2 * Math.round(abs(shadow.offsetX) + shadowBlur) * abs(scaling.x);\n shadowOffset.y =\n 2 * Math.round(abs(shadow.offsetY) + shadowBlur) * abs(scaling.y);\n }\n const width = boundingRect.width + shadowOffset.x,\n height = boundingRect.height + shadowOffset.y;\n // if the current width/height is not an integer\n // we need to make it so.\n el.width = Math.ceil(width);\n el.height = Math.ceil(height);\n const canvas = canvasProvider(el);\n if (options.format === 'jpeg') {\n canvas.backgroundColor = '#fff';\n }\n this.setPositionByOrigin(\n new Point(canvas.width / 2, canvas.height / 2),\n CENTER,\n CENTER,\n );\n const originalCanvas = this.canvas;\n // static canvas and canvas have both an array of InteractiveObjects\n // @ts-expect-error this needs to be fixed somehow, or ignored globally\n canvas._objects = [this];\n this.set('canvas', canvas);\n this.setCoords();\n const canvasEl = canvas.toCanvasElement(multiplier || 1, options);\n this.set('canvas', originalCanvas);\n this.shadow = originalShadow;\n if (originalGroup) {\n this.group = originalGroup;\n }\n this.set(origParams);\n this.setCoords();\n // canvas.dispose will call image.dispose that will nullify the elements\n // since this canvas is a simple element for the process, we remove references\n // to objects in this way in order to avoid object trashing.\n canvas._objects = [];\n // since render has settled it is safe to destroy canvas\n canvas.destroy();\n return canvasEl;\n }\n\n /**\n * Converts an object into a data-url-like string\n * @param {Object} options Options object\n * @param {String} [options.format=png] The format of the output image. Either \"jpeg\" or \"png\"\n * @param {Number} [options.quality=1] Quality level (0..1). Only used for jpeg.\n * @param {Number} [options.multiplier=1] Multiplier to scale by\n * @param {Number} [options.left] Cropping left offset. Introduced in v1.2.14\n * @param {Number} [options.top] Cropping top offset. Introduced in v1.2.14\n * @param {Number} [options.width] Cropping width. Introduced in v1.2.14\n * @param {Number} [options.height] Cropping height. Introduced in v1.2.14\n * @param {Boolean} [options.enableRetinaScaling] Enable retina scaling for clone image. Introduce in 1.6.4\n * @param {Boolean} [options.withoutTransform] Remove current object transform ( no scale , no angle, no flip, no skew ). Introduced in 2.3.4\n * @param {Boolean} [options.withoutShadow] Remove current object shadow. Introduced in 2.4.2\n * @return {String} Returns a data: URL containing a representation of the object in the format specified by options.format\n */\n toDataURL(options: toDataURLOptions = {}) {\n return toDataURL(\n this.toCanvasElement(options),\n options.format || 'png',\n options.quality || 1,\n );\n }\n toBlob(options: toDataURLOptions = {}) {\n return toBlob(\n this.toCanvasElement(options),\n options.format || 'png',\n options.quality || 1,\n );\n }\n\n /**\n * Checks if the instance is of any of the specified types.\n * We use this to filter a list of objects for the `getObjects` function.\n *\n * For detecting an instance type `instanceOf` is a better check,\n * but to avoid to make specific classes a dependency of generic code\n * internally we use this.\n *\n * This compares both the static class `type` and the instance's own `type` property\n * against the provided list of types.\n *\n * @param types - A list of type strings to check against.\n * @returns `true` if the object's type or class type matches any in the list, otherwise `false`.\n */\n isType(...types: string[]) {\n return (\n types.includes((this.constructor as typeof FabricObject).type) ||\n types.includes(this.type)\n );\n }\n\n /**\n * Returns complexity of an instance\n * @return {Number} complexity of this instance (is 1 unless subclassed)\n */\n complexity() {\n return 1;\n }\n\n /**\n * Returns a JSON representation of an instance\n * @return {Object} JSON\n */\n toJSON() {\n // delegate, not alias\n return this.toObject();\n }\n\n /**\n * Sets \"angle\" of an instance with centered rotation\n * @param {TDegree} angle Angle value (in degrees)\n */\n rotate(angle: TDegree) {\n const { centeredRotation, originX, originY } = this;\n\n if (centeredRotation) {\n const { x, y } = this.getRelativeCenterPoint();\n this.originX = CENTER;\n this.originY = CENTER;\n this.left = x;\n this.top = y;\n }\n\n this.set('angle', angle);\n\n if (centeredRotation) {\n const { x, y } = this.translateToOriginPoint(\n this.getRelativeCenterPoint(),\n originX,\n originY,\n );\n this.left = x;\n this.top = y;\n this.originX = originX;\n this.originY = originY;\n }\n }\n\n /**\n * This callback function is called by the parent group of an object every\n * time a non-delegated property changes on the group. It is passed the key\n * and value as parameters. Not adding in this function's signature to avoid\n * Travis build error about unused variables.\n */\n setOnGroup() {\n // implemented by sub-classes, as needed.\n }\n\n /**\n * Sets canvas globalCompositeOperation for specific object\n * custom composition operation for the particular object can be specified using globalCompositeOperation property\n * @param {CanvasRenderingContext2D} ctx Rendering canvas context\n */\n _setupCompositeOperation(ctx: CanvasRenderingContext2D) {\n if (this.globalCompositeOperation) {\n ctx.globalCompositeOperation = this.globalCompositeOperation;\n }\n }\n\n /**\n * cancel instance's running animations\n * override if necessary to dispose artifacts such as `clipPath`\n */\n dispose() {\n runningAnimations.cancelByTarget(this);\n this.off();\n this._set('canvas', undefined);\n // clear caches\n this._cacheCanvas && getEnv().dispose(this._cacheCanvas);\n this._cacheCanvas = undefined;\n this._cacheContext = null;\n }\n\n // #region Animation methods\n /**\n * List of properties to consider for animating colors.\n * @type String[]\n */\n static colorProperties: string[] = [FILL, STROKE, 'backgroundColor'];\n\n /**\n * Animates object's properties\n * @param {Record} animatable map of keys and end values\n * @param {Partial>} options\n * @tutorial {@link http://fabricjs.com/fabric-intro-part-2#animation}\n * @return {Record>} map of animation contexts\n *\n * As object — multiple properties\n *\n * object.animate({ left: ..., top: ... });\n * object.animate({ left: ..., top: ... }, { duration: ... });\n */\n animate(\n animatable: Record,\n options?: Partial>,\n ): Record> {\n return Object.entries(animatable).reduce(\n (acc, [key, endValue]) => {\n acc[key] = this._animate(key, endValue, options);\n return acc;\n },\n {} as Record>,\n );\n }\n\n /**\n * @private\n * @param {String} key Property to animate\n * @param {String} to Value to animate to\n * @param {Object} [options] Options object\n */\n _animate(\n key: string,\n endValue: T,\n options: Partial> = {},\n ): TAnimation {\n const path = key.split('.');\n const propIsColor = (\n this.constructor as typeof FabricObject\n ).colorProperties.includes(path[path.length - 1]);\n const { abort, startValue, onChange, onComplete } = options;\n const animationOptions = {\n ...options,\n target: this,\n // path.reduce... is the current value in case start value isn't provided\n startValue:\n startValue ?? path.reduce((deep: any, key) => deep[key], this),\n endValue,\n abort: abort?.bind(this),\n onChange: (\n value: number | number[] | string,\n valueProgress: number,\n durationProgress: number,\n ) => {\n path.reduce((deep: Record, key, index) => {\n if (index === path.length - 1) {\n deep[key] = value;\n }\n return deep[key];\n }, this);\n onChange &&\n // @ts-expect-error generic callback arg0 is wrong\n onChange(value, valueProgress, durationProgress);\n },\n onComplete: (\n value: number | number[] | string,\n valueProgress: number,\n durationProgress: number,\n ) => {\n this.setCoords();\n onComplete &&\n // @ts-expect-error generic callback arg0 is wrong\n onComplete(value, valueProgress, durationProgress);\n },\n } as AnimationOptions;\n\n return (\n propIsColor\n ? animateColor(animationOptions as ColorAnimationOptions)\n : animate(\n animationOptions as ValueAnimationOptions | ArrayAnimationOptions,\n )\n ) as TAnimation;\n }\n\n // #region Object stacking methods\n\n /**\n * A reference to the parent of the object\n * Used to keep the original parent ref when the object has been added to an ActiveSelection, hence loosing the `group` ref\n */\n declare parent?: Group;\n\n /**\n * Checks if object is descendant of target\n * Should be used instead of {@link Group.contains} or {@link StaticCanvas.contains} for performance reasons\n * @param {TAncestor} target\n * @returns {boolean}\n */\n isDescendantOf(target: TAncestor): boolean {\n const { parent, group } = this;\n return (\n parent === target ||\n group === target ||\n // walk up\n (!!parent && parent.isDescendantOf(target)) ||\n (!!group && group !== parent && group.isDescendantOf(target))\n );\n }\n\n /**\n * @returns {Ancestors} ancestors (excluding `ActiveSelection`) from bottom to top\n */\n getAncestors(): Ancestors {\n const ancestors: TAncestor[] = [];\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n let parent: TAncestor | undefined = this;\n do {\n parent = parent.parent;\n parent && ancestors.push(parent);\n } while (parent);\n return ancestors as Ancestors;\n }\n\n /**\n * Compare ancestors\n *\n * @param {StackedObject} other\n * @returns {AncestryComparison} an object that represent the ancestry situation.\n */\n findCommonAncestors(other: T): AncestryComparison {\n if (this === other) {\n return {\n fork: [],\n otherFork: [],\n common: [this, ...this.getAncestors()],\n } as AncestryComparison;\n }\n const ancestors = this.getAncestors();\n const otherAncestors = other.getAncestors();\n // if `this` has no ancestors and `this` is top ancestor of `other` we must handle the following case\n if (\n ancestors.length === 0 &&\n otherAncestors.length > 0 &&\n this === otherAncestors[otherAncestors.length - 1]\n ) {\n return {\n fork: [],\n otherFork: [\n other,\n ...otherAncestors.slice(0, otherAncestors.length - 1),\n ],\n common: [this],\n } as AncestryComparison;\n }\n // compare ancestors\n for (let i = 0, ancestor; i < ancestors.length; i++) {\n ancestor = ancestors[i];\n if (ancestor === other) {\n return {\n fork: [this, ...ancestors.slice(0, i)],\n otherFork: [],\n common: ancestors.slice(i),\n } as AncestryComparison;\n }\n for (let j = 0; j < otherAncestors.length; j++) {\n if (this === otherAncestors[j]) {\n return {\n fork: [],\n otherFork: [other, ...otherAncestors.slice(0, j)],\n common: [this, ...ancestors],\n } as AncestryComparison;\n }\n if (ancestor === otherAncestors[j]) {\n return {\n fork: [this, ...ancestors.slice(0, i)],\n otherFork: [other, ...otherAncestors.slice(0, j)],\n common: ancestors.slice(i),\n } as AncestryComparison;\n }\n }\n }\n // nothing shared\n return {\n fork: [this, ...ancestors],\n otherFork: [other, ...otherAncestors],\n common: [],\n } as AncestryComparison;\n }\n\n /**\n *\n * @param {StackedObject} other\n * @returns {boolean}\n */\n hasCommonAncestors(other: T): boolean {\n const commonAncestors = this.findCommonAncestors(other);\n return commonAncestors && !!commonAncestors.common.length;\n }\n\n /**\n *\n * @param {FabricObject} other object to compare against\n * @returns {boolean | undefined} if objects do not share a common ancestor or they are strictly equal it is impossible to determine which is in front of the other; in such cases the function returns `undefined`\n */\n isInFrontOf(other: T): boolean | undefined {\n if (this === other) {\n return undefined;\n }\n const ancestorData = this.findCommonAncestors(other);\n\n if (ancestorData.fork.includes(other as any)) {\n return true;\n }\n if (ancestorData.otherFork.includes(this as any)) {\n return false;\n }\n // if there isn't a common ancestor, we take the canvas.\n // if there is no canvas, there is nothing to compare\n const firstCommonAncestor = ancestorData.common[0] || this.canvas;\n if (!firstCommonAncestor) {\n return undefined;\n }\n const headOfFork = ancestorData.fork.pop(),\n headOfOtherFork = ancestorData.otherFork.pop(),\n thisIndex = (firstCommonAncestor as TCollection)._objects.indexOf(\n headOfFork as any,\n ),\n otherIndex = (firstCommonAncestor as TCollection)._objects.indexOf(\n headOfOtherFork as any,\n );\n return thisIndex > -1 && thisIndex > otherIndex;\n }\n\n // #region Serialization\n /**\n * Define a list of custom properties that will be serialized when\n * instance.toObject() gets called\n */\n static customProperties: string[] = [];\n\n /**\n * Returns an object representation of an instance\n * @param {string[]} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} Object representation of an instance\n */\n toObject(propertiesToInclude: any[] = []): any {\n const propertiesToSerialize = propertiesToInclude.concat(\n FabricObject.customProperties,\n (this.constructor as typeof FabricObject).customProperties || [],\n );\n let clipPathData: Partial | undefined;\n const NUM_FRACTION_DIGITS = config.NUM_FRACTION_DIGITS;\n const {\n clipPath,\n fill,\n stroke,\n shadow,\n strokeDashArray,\n left,\n top,\n originX,\n originY,\n width,\n height,\n strokeWidth,\n strokeLineCap,\n strokeDashOffset,\n strokeLineJoin,\n strokeUniform,\n strokeMiterLimit,\n scaleX,\n scaleY,\n angle,\n flipX,\n flipY,\n opacity,\n visible,\n backgroundColor,\n fillRule,\n paintFirst,\n globalCompositeOperation,\n skewX,\n skewY,\n } = this;\n if (clipPath && !clipPath.excludeFromExport) {\n clipPathData = clipPath.toObject(\n propertiesToSerialize.concat('inverted', 'absolutePositioned'),\n );\n }\n const toFixedBound = (val: number) => toFixed(val, NUM_FRACTION_DIGITS);\n const object = {\n ...pick(this, propertiesToSerialize as (keyof this)[]),\n type: (this.constructor as typeof FabricObject).type,\n version: VERSION,\n originX,\n originY,\n left: toFixedBound(left),\n top: toFixedBound(top),\n width: toFixedBound(width),\n height: toFixedBound(height),\n fill: isSerializableFiller(fill) ? fill.toObject() : fill,\n stroke: isSerializableFiller(stroke) ? stroke.toObject() : stroke,\n strokeWidth: toFixedBound(strokeWidth),\n strokeDashArray: strokeDashArray\n ? strokeDashArray.concat()\n : strokeDashArray,\n strokeLineCap,\n strokeDashOffset,\n strokeLineJoin,\n strokeUniform,\n strokeMiterLimit: toFixedBound(strokeMiterLimit),\n scaleX: toFixedBound(scaleX),\n scaleY: toFixedBound(scaleY),\n angle: toFixedBound(angle),\n flipX,\n flipY,\n opacity: toFixedBound(opacity),\n shadow: shadow ? shadow.toObject() : shadow,\n visible,\n backgroundColor,\n fillRule,\n paintFirst,\n globalCompositeOperation,\n skewX: toFixedBound(skewX),\n skewY: toFixedBound(skewY),\n ...(clipPathData ? { clipPath: clipPathData } : null),\n };\n\n return !this.includeDefaultValues\n ? this._removeDefaultValues(object)\n : object;\n }\n\n /**\n * Returns (dataless) object representation of an instance\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} Object representation of an instance\n */\n toDatalessObject(propertiesToInclude?: any[]): any {\n // will be overwritten by subclasses\n return this.toObject(propertiesToInclude);\n }\n\n /**\n * @private\n * @param {Object} object\n */\n _removeDefaultValues(object: T): Partial {\n // getDefaults() ( get from static ownDefaults ) should win over prototype since anyway they get assigned to instance\n // ownDefault vs prototype is swappable only if you change all the fabric objects consistently.\n const defaults = (this.constructor as typeof FabricObject).getDefaults();\n const hasStaticDefaultValues = Object.keys(defaults).length > 0;\n const baseValues = hasStaticDefaultValues\n ? defaults\n : Object.getPrototypeOf(this);\n\n return pickBy(object, (value, key) => {\n if (key === LEFT || key === TOP || key === 'type') {\n return true;\n }\n const baseValue = baseValues[key];\n return (\n value !== baseValue &&\n // basically a check for [] === []\n !(\n Array.isArray(value) &&\n Array.isArray(baseValue) &&\n value.length === 0 &&\n baseValue.length === 0\n )\n );\n });\n }\n\n /**\n * Returns a string representation of an instance\n * @return {String}\n */\n toString() {\n return `#<${(this.constructor as typeof FabricObject).type}>`;\n }\n\n /**\n *\n * @param {Function} klass\n * @param {object} object\n * @param {object} [options]\n * @param {string} [options.extraParam] property to pass as first argument to the constructor\n * @param {AbortSignal} [options.signal] handle aborting, see https://developer.mozilla.org/en-US/docs/Web/API/AbortController/signal\n * @returns {Promise}\n */\n static _fromObject(\n { type, ...serializedObjectOptions }: Record,\n { extraParam, ...options }: Abortable & { extraParam?: string } = {},\n ): Promise {\n return enlivenObjectEnlivables(serializedObjectOptions, options).then(\n (enlivedObjectOptions) => {\n // from the resulting enlived options, extract options.extraParam to arg0\n // to avoid accidental overrides later\n if (extraParam) {\n delete enlivedObjectOptions[extraParam];\n return new this(\n serializedObjectOptions[extraParam],\n // @ts-expect-error different signature\n enlivedObjectOptions,\n );\n } else {\n return new this(enlivedObjectOptions);\n }\n },\n ) as Promise;\n }\n\n /**\n *\n * @param {object} object\n * @param {object} [options]\n * @param {AbortSignal} [options.signal] handle aborting, see https://developer.mozilla.org/en-US/docs/Web/API/AbortController/signal\n * @returns {Promise}\n */\n static fromObject>(\n object: T,\n options?: Abortable,\n ) {\n return this._fromObject(object, options);\n }\n}\n\nclassRegistry.setClass(FabricObject);\nclassRegistry.setClass(FabricObject, 'object');\n","import type {\n TModificationEvents,\n Transform,\n TransformActionHandler,\n} from '../EventTypeDefs';\nimport { fireEvent } from './fireEvent';\nimport { commonEventInfo } from './util';\n\n/**\n * Wrap an action handler with firing an event if the action is performed\n * @param {TModificationEvents} eventName the event we want to fire\n * @param {TransformActionHandler} actionHandler the function to wrap\n * @param {object} extraEventInfo extra information to pas to the event handler\n * @return {TransformActionHandler} a function with an action handler signature\n */\nexport const wrapWithFireEvent = <\n T extends Transform,\n P extends object = Record,\n>(\n eventName: TModificationEvents,\n actionHandler: TransformActionHandler,\n extraEventInfo?: P,\n) => {\n return ((eventData, transform, x, y) => {\n const actionPerformed = actionHandler(eventData, transform, x, y);\n if (actionPerformed) {\n fireEvent(eventName, {\n ...commonEventInfo(eventData, transform, x, y),\n ...extraEventInfo,\n });\n }\n return actionPerformed;\n }) as TransformActionHandler;\n};\n","import type { Transform, TransformActionHandler } from '../EventTypeDefs';\n\n/**\n * Wrap an action handler with saving/restoring object position on the transform.\n * this is the code that permits to objects to keep their position while transforming.\n * @param {Function} actionHandler the function to wrap\n * @return {Function} a function with an action handler signature\n */\nexport function wrapWithFixedAnchor(\n actionHandler: TransformActionHandler,\n) {\n return ((eventData, transform, x, y) => {\n const { target, originX, originY } = transform,\n centerPoint = target.getRelativeCenterPoint(),\n constraint = target.translateToOriginPoint(centerPoint, originX, originY),\n actionPerformed = actionHandler(eventData, transform, x, y);\n // flipping requires to change the transform origin, so we read from the mutated transform\n // instead of leveraging the one destructured before\n target.setPositionByOrigin(\n constraint,\n transform.originX,\n transform.originY,\n );\n return actionPerformed;\n }) as TransformActionHandler;\n}\n","import type { TransformActionHandler } from '../EventTypeDefs';\nimport { CENTER, LEFT, RESIZING, RIGHT } from '../constants';\nimport { resolveOrigin } from '../util/misc/resolveOrigin';\nimport { getLocalPoint, isTransformCentered } from './util';\nimport { wrapWithFireEvent } from './wrapWithFireEvent';\nimport { wrapWithFixedAnchor } from './wrapWithFixedAnchor';\n\n/**\n * Action handler to change object's width\n * Needs to be wrapped with `wrapWithFixedAnchor` to be effective\n * @param {Event} eventData javascript event that is doing the transform\n * @param {Object} transform javascript object containing a series of information around the current transform\n * @param {number} x current mouse x position, canvas normalized\n * @param {number} y current mouse y position, canvas normalized\n * @return {Boolean} true if some change happened\n */\nexport const changeObjectWidth: TransformActionHandler = (\n eventData,\n transform,\n x,\n y,\n) => {\n const localPoint = getLocalPoint(\n transform,\n transform.originX,\n transform.originY,\n x,\n y,\n );\n // make sure the control changes width ONLY from it's side of target\n if (\n resolveOrigin(transform.originX) === resolveOrigin(CENTER) ||\n (resolveOrigin(transform.originX) === resolveOrigin(RIGHT) &&\n localPoint.x < 0) ||\n (resolveOrigin(transform.originX) === resolveOrigin(LEFT) &&\n localPoint.x > 0)\n ) {\n const { target } = transform,\n strokePadding =\n target.strokeWidth / (target.strokeUniform ? target.scaleX : 1),\n multiplier = isTransformCentered(transform) ? 2 : 1,\n oldWidth = target.width,\n newWidth =\n Math.abs((localPoint.x * multiplier) / target.scaleX) - strokePadding;\n target.set('width', Math.max(newWidth, 1));\n // check against actual target width in case `newWidth` was rejected\n return oldWidth !== target.width;\n }\n return false;\n};\n\nexport const changeWidth = wrapWithFireEvent(\n RESIZING,\n wrapWithFixedAnchor(changeObjectWidth),\n);\n","import { FILL, STROKE, twoMathPi } from '../constants';\nimport type { InteractiveFabricObject } from '../shapes/Object/InteractiveObject';\nimport { degreesToRadians } from '../util/misc/radiansDegreesConversion';\nimport type { Control } from './Control';\n\nexport type ControlRenderingStyleOverride = Partial<\n Pick<\n InteractiveFabricObject,\n | 'cornerStyle'\n | 'cornerSize'\n | 'cornerColor'\n | 'cornerStrokeColor'\n | 'cornerDashArray'\n | 'transparentCorners'\n >\n>;\n\nexport type ControlRenderer<\n O extends InteractiveFabricObject = InteractiveFabricObject,\n> = (\n ctx: CanvasRenderingContext2D,\n left: number,\n top: number,\n styleOverride: ControlRenderingStyleOverride,\n fabricObject: O,\n) => void;\n\n/**\n * Render a round control, as per fabric features.\n * This function is written to respect object properties like transparentCorners, cornerSize\n * cornerColor, cornerStrokeColor\n * plus the addition of offsetY and offsetX.\n * @param {CanvasRenderingContext2D} ctx context to render on\n * @param {Number} left x coordinate where the control center should be\n * @param {Number} top y coordinate where the control center should be\n * @param {Object} styleOverride override for FabricObject controls style\n * @param {FabricObject} fabricObject the fabric object for which we are rendering controls\n */\nexport function renderCircleControl(\n this: Control,\n ctx: CanvasRenderingContext2D,\n left: number,\n top: number,\n styleOverride: ControlRenderingStyleOverride,\n fabricObject: InteractiveFabricObject,\n) {\n styleOverride = styleOverride || {};\n const xSize =\n this.sizeX || styleOverride.cornerSize || fabricObject.cornerSize,\n ySize = this.sizeY || styleOverride.cornerSize || fabricObject.cornerSize,\n transparentCorners =\n typeof styleOverride.transparentCorners !== 'undefined'\n ? styleOverride.transparentCorners\n : fabricObject.transparentCorners,\n methodName = transparentCorners ? STROKE : FILL,\n stroke =\n !transparentCorners &&\n (styleOverride.cornerStrokeColor || fabricObject.cornerStrokeColor);\n let myLeft = left,\n myTop = top,\n size;\n ctx.save();\n ctx.fillStyle = styleOverride.cornerColor || fabricObject.cornerColor || '';\n ctx.strokeStyle =\n styleOverride.cornerStrokeColor || fabricObject.cornerStrokeColor || '';\n // TODO: use proper ellipse code.\n if (xSize > ySize) {\n size = xSize;\n ctx.scale(1.0, ySize / xSize);\n myTop = (top * xSize) / ySize;\n } else if (ySize > xSize) {\n size = ySize;\n ctx.scale(xSize / ySize, 1.0);\n myLeft = (left * ySize) / xSize;\n } else {\n size = xSize;\n }\n ctx.beginPath();\n ctx.arc(myLeft, myTop, size / 2, 0, twoMathPi, false);\n ctx[methodName]();\n if (stroke) {\n ctx.stroke();\n }\n ctx.restore();\n}\n\n/**\n * Render a square control, as per fabric features.\n * This function is written to respect object properties like transparentCorners, cornerSize\n * cornerColor, cornerStrokeColor\n * plus the addition of offsetY and offsetX.\n * @param {CanvasRenderingContext2D} ctx context to render on\n * @param {Number} left x coordinate where the control center should be\n * @param {Number} top y coordinate where the control center should be\n * @param {Object} styleOverride override for FabricObject controls style\n * @param {FabricObject} fabricObject the fabric object for which we are rendering controls\n */\nexport function renderSquareControl(\n this: Control,\n ctx: CanvasRenderingContext2D,\n left: number,\n top: number,\n styleOverride: ControlRenderingStyleOverride,\n fabricObject: InteractiveFabricObject,\n) {\n styleOverride = styleOverride || {};\n const xSize =\n this.sizeX || styleOverride.cornerSize || fabricObject.cornerSize,\n ySize = this.sizeY || styleOverride.cornerSize || fabricObject.cornerSize,\n transparentCorners =\n typeof styleOverride.transparentCorners !== 'undefined'\n ? styleOverride.transparentCorners\n : fabricObject.transparentCorners,\n methodName = transparentCorners ? STROKE : FILL,\n stroke =\n !transparentCorners &&\n (styleOverride.cornerStrokeColor || fabricObject.cornerStrokeColor),\n xSizeBy2 = xSize / 2,\n ySizeBy2 = ySize / 2;\n ctx.save();\n ctx.fillStyle = styleOverride.cornerColor || fabricObject.cornerColor || '';\n ctx.strokeStyle =\n styleOverride.cornerStrokeColor || fabricObject.cornerStrokeColor || '';\n ctx.translate(left, top);\n // angle is relative to canvas plane\n const angle = fabricObject.getTotalAngle();\n ctx.rotate(degreesToRadians(angle));\n // this does not work, and fixed with ( && ) does not make sense.\n // to have real transparent corners we need the controls on upperCanvas\n // transparentCorners || ctx.clearRect(-xSizeBy2, -ySizeBy2, xSize, ySize);\n ctx[`${methodName}Rect`](-xSizeBy2, -ySizeBy2, xSize, ySize);\n if (stroke) {\n ctx.strokeRect(-xSizeBy2, -ySizeBy2, xSize, ySize);\n }\n ctx.restore();\n}\n","/* eslint-disable @typescript-eslint/no-unused-vars */\nimport type {\n ControlActionHandler,\n TPointerEvent,\n TransformActionHandler,\n} from '../EventTypeDefs';\nimport { Intersection } from '../Intersection';\nimport { Point } from '../Point';\nimport { SCALE } from '../constants';\nimport type {\n InteractiveFabricObject,\n TOCoord,\n} from '../shapes/Object/InteractiveObject';\nimport type { TCornerPoint, TDegree, TMat2D } from '../typedefs';\nimport {\n createRotateMatrix,\n createScaleMatrix,\n createTranslateMatrix,\n multiplyTransformMatrixArray,\n} from '../util/misc/matrix';\nimport type { ControlRenderingStyleOverride } from './controlRendering';\nimport { renderCircleControl, renderSquareControl } from './controlRendering';\n\nexport class Control {\n /**\n * keep track of control visibility.\n * mainly for backward compatibility.\n * if you do not want to see a control, you can remove it\n * from the control set.\n * @type {Boolean}\n * @default true\n */\n visible = true;\n\n /**\n * Name of the action that the control will likely execute.\n * This is optional. FabricJS uses to identify what the user is doing for some\n * extra optimizations. If you are writing a custom control and you want to know\n * somewhere else in the code what is going on, you can use this string here.\n * you can also provide a custom getActionName if your control run multiple actions\n * depending on some external state.\n * default to scale since is the most common, used on 4 corners by default\n * @type {String}\n * @default 'scale'\n */\n actionName = SCALE;\n\n /**\n * Drawing angle of the control.\n * NOT used for now, but name marked as needed for internal logic\n * example: to reuse the same drawing function for different rotated controls\n * @type {Number}\n * @default 0\n */\n angle = 0;\n\n /**\n * Relative position of the control. X\n * 0,0 is the center of the Object, while -0.5 (left) or 0.5 (right) are the extremities\n * of the bounding box.\n * @type {Number}\n * @default 0\n */\n x = 0;\n\n /**\n * Relative position of the control. Y\n * 0,0 is the center of the Object, while -0.5 (top) or 0.5 (bottom) are the extremities\n * of the bounding box.\n * @type {Number}\n * @default 0\n */\n y = 0;\n\n /**\n * Horizontal offset of the control from the defined position. In pixels\n * Positive offset moves the control to the right, negative to the left.\n * It used when you want to have position of control that does not scale with\n * the bounding box. Example: rotation control is placed at x:0, y: 0.5 on\n * the boundind box, with an offset of 30 pixels vertically. Those 30 pixels will\n * stay 30 pixels no matter how the object is big. Another example is having 2\n * controls in the corner, that stay in the same position when the object scale.\n * of the bounding box.\n * @type {Number}\n * @default 0\n */\n offsetX = 0;\n\n /**\n * Vertical offset of the control from the defined position. In pixels\n * Positive offset moves the control to the bottom, negative to the top.\n * @type {Number}\n * @default 0\n */\n offsetY = 0;\n\n /**\n * Sets the length of the control. If null, defaults to object's cornerSize.\n * Expects both sizeX and sizeY to be set when set.\n * @type {?Number}\n * @default null\n */\n sizeX = 0;\n\n /**\n * Sets the height of the control. If null, defaults to object's cornerSize.\n * Expects both sizeX and sizeY to be set when set.\n * @type {?Number}\n * @default null\n */\n sizeY = 0;\n\n /**\n * Sets the length of the touch area of the control. If null, defaults to object's touchCornerSize.\n * Expects both touchSizeX and touchSizeY to be set when set.\n * @type {?Number}\n * @default null\n */\n touchSizeX = 0;\n\n /**\n * Sets the height of the touch area of the control. If null, defaults to object's touchCornerSize.\n * Expects both touchSizeX and touchSizeY to be set when set.\n * @type {?Number}\n * @default null\n */\n touchSizeY = 0;\n\n /**\n * Css cursor style to display when the control is hovered.\n * if the method `cursorStyleHandler` is provided, this property is ignored.\n * @type {String}\n * @default 'crosshair'\n */\n cursorStyle = 'crosshair';\n\n /**\n * If controls has an offsetY or offsetX, draw a line that connects\n * the control to the bounding box\n * @type {Boolean}\n * @default false\n */\n withConnection = false;\n\n constructor(options?: Partial) {\n Object.assign(this, options);\n }\n\n /**\n * The control actionHandler, provide one to handle action ( control being moved )\n * @param {Event} eventData the native mouse event\n * @param {Transform} transformData properties of the current transform\n * @param {Number} x x position of the cursor\n * @param {Number} y y position of the cursor\n * @return {Boolean} true if the action/event modified the object\n */\n declare actionHandler: TransformActionHandler;\n\n /**\n * The control handler for mouse down, provide one to handle mouse down on control\n * @param {Event} eventData the native mouse event\n * @param {Transform} transformData properties of the current transform\n * @param {Number} x x position of the cursor\n * @param {Number} y y position of the cursor\n * @return {Boolean} true if the action/event modified the object\n */\n declare mouseDownHandler?: ControlActionHandler;\n\n /**\n * The control mouseUpHandler, provide one to handle an effect on mouse up.\n * @param {Event} eventData the native mouse event\n * @param {Transform} transformData properties of the current transform\n * @param {Number} x x position of the cursor\n * @param {Number} y y position of the cursor\n * @return {Boolean} true if the action/event modified the object\n */\n declare mouseUpHandler?: ControlActionHandler;\n\n shouldActivate(\n controlKey: string,\n fabricObject: InteractiveFabricObject,\n pointer: Point,\n { tl, tr, br, bl }: TCornerPoint,\n ) {\n // TODO: locking logic can be handled here instead of in the control handler logic\n return (\n fabricObject.canvas?.getActiveObject() === fabricObject &&\n fabricObject.isControlVisible(controlKey) &&\n Intersection.isPointInPolygon(pointer, [tl, tr, br, bl])\n );\n }\n\n /**\n * Returns control actionHandler\n * @param {Event} eventData the native mouse event\n * @param {FabricObject} fabricObject on which the control is displayed\n * @param {Control} control control for which the action handler is being asked\n * @return {Function} the action handler\n */\n getActionHandler(\n eventData: TPointerEvent,\n fabricObject: InteractiveFabricObject,\n control: Control,\n ): TransformActionHandler | undefined {\n return this.actionHandler;\n }\n\n /**\n * Returns control mouseDown handler\n * @param {Event} eventData the native mouse event\n * @param {FabricObject} fabricObject on which the control is displayed\n * @param {Control} control control for which the action handler is being asked\n * @return {Function} the action handler\n */\n getMouseDownHandler(\n eventData: TPointerEvent,\n fabricObject: InteractiveFabricObject,\n control: Control,\n ): ControlActionHandler | undefined {\n return this.mouseDownHandler;\n }\n\n /**\n * Returns control mouseUp handler.\n * During actions the fabricObject or the control can be of different obj\n * @param {Event} eventData the native mouse event\n * @param {FabricObject} fabricObject on which the control is displayed\n * @param {Control} control control for which the action handler is being asked\n * @return {Function} the action handler\n */\n getMouseUpHandler(\n eventData: TPointerEvent,\n fabricObject: InteractiveFabricObject,\n control: Control,\n ): ControlActionHandler | undefined {\n return this.mouseUpHandler;\n }\n\n /**\n * Returns control cursorStyle for css using cursorStyle. If you need a more elaborate\n * function you can pass one in the constructor\n * the cursorStyle property\n * @param {Event} eventData the native mouse event\n * @param {Control} control the current control ( likely this)\n * @param {FabricObject} object on which the control is displayed\n * @return {String}\n */\n cursorStyleHandler(\n eventData: TPointerEvent,\n control: Control,\n fabricObject: InteractiveFabricObject,\n coord: TOCoord,\n ) {\n return control.cursorStyle;\n }\n\n /**\n * Returns the action name. The basic implementation just return the actionName property.\n * @param {Event} eventData the native mouse event\n * @param {Control} control the current control ( likely this)\n * @param {FabricObject} object on which the control is displayed\n * @return {String}\n */\n getActionName(\n eventData: TPointerEvent,\n control: Control,\n fabricObject: InteractiveFabricObject,\n ) {\n return control.actionName;\n }\n\n /**\n * Returns controls visibility\n * @param {FabricObject} object on which the control is displayed\n * @param {String} controlKey key where the control is memorized on the\n * @return {Boolean}\n */\n getVisibility(fabricObject: InteractiveFabricObject, controlKey: string) {\n return fabricObject._controlsVisibility?.[controlKey] ?? this.visible;\n }\n\n /**\n * Sets controls visibility\n * @param {Boolean} visibility for the object\n * @return {Void}\n */\n setVisibility(\n visibility: boolean,\n name?: string,\n fabricObject?: InteractiveFabricObject,\n ) {\n this.visible = visibility;\n }\n\n positionHandler(\n dim: Point,\n finalMatrix: TMat2D,\n fabricObject: InteractiveFabricObject,\n currentControl: Control,\n ) {\n return new Point(\n this.x * dim.x + this.offsetX,\n this.y * dim.y + this.offsetY,\n ).transform(finalMatrix);\n }\n\n /**\n * Returns the coords for this control based on object values.\n * @param {Number} objectAngle angle from the fabric object holding the control\n * @param {Number} objectCornerSize cornerSize from the fabric object holding the control (or touchCornerSize if\n * isTouch is true)\n * @param {Number} centerX x coordinate where the control center should be\n * @param {Number} centerY y coordinate where the control center should be\n * @param {boolean} isTouch true if touch corner, false if normal corner\n */\n calcCornerCoords(\n angle: TDegree,\n objectCornerSize: number,\n centerX: number,\n centerY: number,\n isTouch: boolean,\n fabricObject: InteractiveFabricObject,\n ) {\n const t = multiplyTransformMatrixArray([\n createTranslateMatrix(centerX, centerY),\n createRotateMatrix({ angle }),\n createScaleMatrix(\n (isTouch ? this.touchSizeX : this.sizeX) || objectCornerSize,\n (isTouch ? this.touchSizeY : this.sizeY) || objectCornerSize,\n ),\n ]);\n return {\n tl: new Point(-0.5, -0.5).transform(t),\n tr: new Point(0.5, -0.5).transform(t),\n br: new Point(0.5, 0.5).transform(t),\n bl: new Point(-0.5, 0.5).transform(t),\n };\n }\n\n /**\n * Render function for the control.\n * When this function runs the context is unscaled. unrotate. Just retina scaled.\n * all the functions will have to translate to the point left,top before starting Drawing\n * if they want to draw a control where the position is detected.\n * left and top are the result of the positionHandler function\n * @param {RenderingContext2D} ctx the context where the control will be drawn\n * @param {Number} left position of the canvas where we are about to render the control.\n * @param {Number} top position of the canvas where we are about to render the control.\n * @param {Object} styleOverride\n * @param {FabricObject} fabricObject the object where the control is about to be rendered\n */\n render(\n ctx: CanvasRenderingContext2D,\n left: number,\n top: number,\n styleOverride: ControlRenderingStyleOverride | undefined,\n fabricObject: InteractiveFabricObject,\n ) {\n styleOverride = styleOverride || {};\n switch (styleOverride.cornerStyle || fabricObject.cornerStyle) {\n case 'circle':\n renderCircleControl.call(\n this,\n ctx,\n left,\n top,\n styleOverride,\n fabricObject,\n );\n break;\n default:\n renderSquareControl.call(\n this,\n ctx,\n left,\n top,\n styleOverride,\n fabricObject,\n );\n }\n }\n}\n","import type {\n ControlCursorCallback,\n TransformActionHandler,\n} from '../EventTypeDefs';\nimport { ROTATING } from '../constants';\nimport { radiansToDegrees } from '../util/misc/radiansDegreesConversion';\nimport { isLocked, NOT_ALLOWED_CURSOR } from './util';\nimport { wrapWithFireEvent } from './wrapWithFireEvent';\nimport { wrapWithFixedAnchor } from './wrapWithFixedAnchor';\n\n/**\n * Find the correct style for the control that is used for rotation.\n * this function is very simple and it just take care of not-allowed or standard cursor\n * @param {Event} eventData the javascript event that is causing the scale\n * @param {Control} control the control that is interested in the action\n * @param {FabricObject} fabricObject the fabric object that is interested in the action\n * @return {String} a valid css string for the cursor\n */\nexport const rotationStyleHandler: ControlCursorCallback = (\n eventData,\n control,\n fabricObject,\n) => {\n if (fabricObject.lockRotation) {\n return NOT_ALLOWED_CURSOR;\n }\n return control.cursorStyle;\n};\n\n/**\n * Action handler for rotation and snapping, without anchor point.\n * Needs to be wrapped with `wrapWithFixedAnchor` to be effective\n * @param {Event} eventData javascript event that is doing the transform\n * @param {Object} transform javascript object containing a series of information around the current transform\n * @param {number} x current mouse x position, canvas normalized\n * @param {number} y current mouse y position, canvas normalized\n * @return {Boolean} true if some change happened\n * @private\n */\nconst rotateObjectWithSnapping: TransformActionHandler = (\n eventData,\n { target, ex, ey, theta, originX, originY },\n x,\n y,\n) => {\n const pivotPoint = target.translateToOriginPoint(\n target.getRelativeCenterPoint(),\n originX,\n originY,\n );\n\n if (isLocked(target, 'lockRotation')) {\n return false;\n }\n\n const lastAngle = Math.atan2(ey - pivotPoint.y, ex - pivotPoint.x),\n curAngle = Math.atan2(y - pivotPoint.y, x - pivotPoint.x);\n let angle = radiansToDegrees(curAngle - lastAngle + theta);\n\n if (target.snapAngle && target.snapAngle > 0) {\n const snapAngle = target.snapAngle,\n snapThreshold = target.snapThreshold || snapAngle,\n rightAngleLocked = Math.ceil(angle / snapAngle) * snapAngle,\n leftAngleLocked = Math.floor(angle / snapAngle) * snapAngle;\n\n if (Math.abs(angle - leftAngleLocked) < snapThreshold) {\n angle = leftAngleLocked;\n } else if (Math.abs(angle - rightAngleLocked) < snapThreshold) {\n angle = rightAngleLocked;\n }\n }\n\n // normalize angle to positive value\n if (angle < 0) {\n angle = 360 + angle;\n }\n angle %= 360;\n\n const hasRotated = target.angle !== angle;\n // TODO: why aren't we using set?\n target.angle = angle;\n return hasRotated;\n};\n\nexport const rotationWithSnapping = wrapWithFireEvent(\n ROTATING,\n wrapWithFixedAnchor(rotateObjectWithSnapping),\n);\n","import type {\n ControlCursorCallback,\n TPointerEvent,\n Transform,\n TransformActionHandler,\n} from '../EventTypeDefs';\nimport type { FabricObject } from '../shapes/Object/FabricObject';\nimport type { TAxis } from '../typedefs';\nimport type { Canvas } from '../canvas/Canvas';\nimport {\n findCornerQuadrant,\n getLocalPoint,\n invertOrigin,\n isLocked,\n isTransformCentered,\n NOT_ALLOWED_CURSOR,\n} from './util';\nimport { wrapWithFireEvent } from './wrapWithFireEvent';\nimport { wrapWithFixedAnchor } from './wrapWithFixedAnchor';\nimport { SCALE_X, SCALE_Y, SCALING } from '../constants';\n\ntype ScaleTransform = Transform & {\n gestureScale?: number;\n signX?: number;\n signY?: number;\n};\n\ntype ScaleBy = TAxis | 'equally' | '' | undefined;\n\n/**\n * Inspect event and fabricObject properties to understand if the scaling action\n * @param {Event} eventData from the user action\n * @param {FabricObject} fabricObject the fabric object about to scale\n * @return {Boolean} true if scale is proportional\n */\nexport function scaleIsProportional(\n eventData: TPointerEvent,\n fabricObject: FabricObject,\n): boolean {\n const canvas = fabricObject.canvas as Canvas,\n uniformIsToggled = eventData[canvas.uniScaleKey!];\n return (\n (canvas.uniformScaling && !uniformIsToggled) ||\n (!canvas.uniformScaling && uniformIsToggled)\n );\n}\n\n/**\n * Inspect fabricObject to understand if the current scaling action is allowed\n * @param {FabricObject} fabricObject the fabric object about to scale\n * @param {String} by 'x' or 'y' or ''\n * @param {Boolean} scaleProportionally true if we are trying to scale proportionally\n * @return {Boolean} true if scaling is not allowed at current conditions\n */\nexport function scalingIsForbidden(\n fabricObject: FabricObject,\n by: ScaleBy,\n scaleProportionally: boolean,\n) {\n const lockX = isLocked(fabricObject, 'lockScalingX'),\n lockY = isLocked(fabricObject, 'lockScalingY');\n if (lockX && lockY) {\n return true;\n }\n if (!by && (lockX || lockY) && scaleProportionally) {\n return true;\n }\n if (lockX && by === 'x') {\n return true;\n }\n if (lockY && by === 'y') {\n return true;\n }\n // code crashes because of a division by 0 if a 0 sized object is scaled\n // forbid to prevent scaling to happen. ISSUE-9475\n const { width, height, strokeWidth } = fabricObject;\n if (width === 0 && strokeWidth === 0 && by !== 'y') {\n return true;\n }\n if (height === 0 && strokeWidth === 0 && by !== 'x') {\n return true;\n }\n return false;\n}\n\nconst scaleMap = ['e', 'se', 's', 'sw', 'w', 'nw', 'n', 'ne', 'e'];\n\n/**\n * return the correct cursor style for the scale action\n * @param {Event} eventData the javascript event that is causing the scale\n * @param {Control} control the control that is interested in the action\n * @param {FabricObject} fabricObject the fabric object that is interested in the action\n * @return {String} a valid css string for the cursor\n */\nexport const scaleCursorStyleHandler: ControlCursorCallback = (\n eventData,\n control,\n fabricObject,\n coord,\n) => {\n const scaleProportionally = scaleIsProportional(eventData, fabricObject),\n by =\n control.x !== 0 && control.y === 0\n ? 'x'\n : control.x === 0 && control.y !== 0\n ? 'y'\n : '';\n if (scalingIsForbidden(fabricObject, by, scaleProportionally)) {\n return NOT_ALLOWED_CURSOR;\n }\n const n = findCornerQuadrant(fabricObject, control, coord);\n return `${scaleMap[n]}-resize`;\n};\n\n/**\n * Basic scaling logic, reused with different constrain for scaling X,Y, freely or equally.\n * Needs to be wrapped with `wrapWithFixedAnchor` to be effective\n * @param {Event} eventData javascript event that is doing the transform\n * @param {Object} transform javascript object containing a series of information around the current transform\n * @param {number} x current mouse x position, canvas normalized\n * @param {number} y current mouse y position, canvas normalized\n * @param {Object} options additional information for scaling\n * @param {String} options.by 'x', 'y', 'equally' or '' to indicate type of scaling\n * @return {Boolean} true if some change happened\n * @private\n */\nfunction scaleObject(\n eventData: TPointerEvent,\n transform: ScaleTransform,\n x: number,\n y: number,\n options: { by?: ScaleBy } = {},\n) {\n const target = transform.target,\n by = options.by,\n scaleProportionally = scaleIsProportional(eventData, target),\n forbidScaling = scalingIsForbidden(target, by, scaleProportionally);\n let newPoint, scaleX, scaleY, dim, signX, signY;\n\n if (forbidScaling) {\n return false;\n }\n if (transform.gestureScale) {\n scaleX = transform.scaleX * transform.gestureScale;\n scaleY = transform.scaleY * transform.gestureScale;\n } else {\n newPoint = getLocalPoint(\n transform,\n transform.originX,\n transform.originY,\n x,\n y,\n );\n // use of sign: We use sign to detect change of direction of an action. sign usually change when\n // we cross the origin point with the mouse. So a scale flip for example. There is an issue when scaling\n // by center and scaling using one middle control ( default: mr, mt, ml, mb), the mouse movement can easily\n // cross many time the origin point and flip the object. so we need a way to filter out the noise.\n // This ternary here should be ok to filter out X scaling when we want Y only and vice versa.\n signX = by !== 'y' ? Math.sign(newPoint.x || transform.signX || 1) : 1;\n signY = by !== 'x' ? Math.sign(newPoint.y || transform.signY || 1) : 1;\n if (!transform.signX) {\n transform.signX = signX;\n }\n if (!transform.signY) {\n transform.signY = signY;\n }\n\n if (\n isLocked(target, 'lockScalingFlip') &&\n (transform.signX !== signX || transform.signY !== signY)\n ) {\n return false;\n }\n\n dim = target._getTransformedDimensions();\n // missing detection of flip and logic to switch the origin\n if (scaleProportionally && !by) {\n // uniform scaling\n const distance = Math.abs(newPoint.x) + Math.abs(newPoint.y),\n { original } = transform,\n originalDistance =\n Math.abs((dim.x * original.scaleX) / target.scaleX) +\n Math.abs((dim.y * original.scaleY) / target.scaleY),\n scale = distance / originalDistance;\n scaleX = original.scaleX * scale;\n scaleY = original.scaleY * scale;\n } else {\n scaleX = Math.abs((newPoint.x * target.scaleX) / dim.x);\n scaleY = Math.abs((newPoint.y * target.scaleY) / dim.y);\n }\n // if we are scaling by center, we need to double the scale\n if (isTransformCentered(transform)) {\n scaleX *= 2;\n scaleY *= 2;\n }\n if (transform.signX !== signX && by !== 'y') {\n transform.originX = invertOrigin(transform.originX);\n scaleX *= -1;\n transform.signX = signX;\n }\n if (transform.signY !== signY && by !== 'x') {\n transform.originY = invertOrigin(transform.originY);\n scaleY *= -1;\n transform.signY = signY;\n }\n }\n // minScale is taken care of in the setter.\n const oldScaleX = target.scaleX,\n oldScaleY = target.scaleY;\n if (!by) {\n !isLocked(target, 'lockScalingX') && target.set(SCALE_X, scaleX);\n !isLocked(target, 'lockScalingY') && target.set(SCALE_Y, scaleY);\n } else {\n // forbidden cases already handled on top here.\n by === 'x' && target.set(SCALE_X, scaleX);\n by === 'y' && target.set(SCALE_Y, scaleY);\n }\n return oldScaleX !== target.scaleX || oldScaleY !== target.scaleY;\n}\n\n/**\n * Generic scaling logic, to scale from corners either equally or freely.\n * Needs to be wrapped with `wrapWithFixedAnchor` to be effective\n * @param {Event} eventData javascript event that is doing the transform\n * @param {Object} transform javascript object containing a series of information around the current transform\n * @param {number} x current mouse x position, canvas normalized\n * @param {number} y current mouse y position, canvas normalized\n * @return {Boolean} true if some change happened\n */\nexport const scaleObjectFromCorner: TransformActionHandler = (\n eventData,\n transform,\n x,\n y,\n) => {\n return scaleObject(eventData, transform, x, y);\n};\n\n/**\n * Scaling logic for the X axis.\n * Needs to be wrapped with `wrapWithFixedAnchor` to be effective\n * @param {Event} eventData javascript event that is doing the transform\n * @param {Object} transform javascript object containing a series of information around the current transform\n * @param {number} x current mouse x position, canvas normalized\n * @param {number} y current mouse y position, canvas normalized\n * @return {Boolean} true if some change happened\n */\nconst scaleObjectX: TransformActionHandler = (\n eventData,\n transform,\n x,\n y,\n) => {\n return scaleObject(eventData, transform, x, y, { by: 'x' });\n};\n\n/**\n * Scaling logic for the Y axis.\n * Needs to be wrapped with `wrapWithFixedAnchor` to be effective\n * @param {Event} eventData javascript event that is doing the transform\n * @param {Object} transform javascript object containing a series of information around the current transform\n * @param {number} x current mouse x position, canvas normalized\n * @param {number} y current mouse y position, canvas normalized\n * @return {Boolean} true if some change happened\n */\nconst scaleObjectY: TransformActionHandler = (\n eventData,\n transform,\n x,\n y,\n) => {\n return scaleObject(eventData, transform, x, y, { by: 'y' });\n};\n\nexport const scalingEqually = wrapWithFireEvent(\n SCALING,\n wrapWithFixedAnchor(scaleObjectFromCorner),\n);\n\nexport const scalingX = wrapWithFireEvent(\n SCALING,\n wrapWithFixedAnchor(scaleObjectX),\n);\n\nexport const scalingY = wrapWithFireEvent(\n SCALING,\n wrapWithFixedAnchor(scaleObjectY),\n);\n","import type {\n ControlCursorCallback,\n TPointerEvent,\n Transform,\n TransformActionHandler,\n} from '../EventTypeDefs';\nimport { resolveOrigin } from '../util/misc/resolveOrigin';\nimport { Point } from '../Point';\nimport type { TAxis, TAxisKey } from '../typedefs';\nimport {\n degreesToRadians,\n radiansToDegrees,\n} from '../util/misc/radiansDegreesConversion';\nimport {\n findCornerQuadrant,\n getLocalPoint,\n isLocked,\n NOT_ALLOWED_CURSOR,\n} from './util';\nimport { wrapWithFireEvent } from './wrapWithFireEvent';\nimport { wrapWithFixedAnchor } from './wrapWithFixedAnchor';\nimport {\n CENTER,\n SCALE_X,\n SCALE_Y,\n SKEWING,\n SKEW_X,\n SKEW_Y,\n} from '../constants';\n\nexport type SkewTransform = Transform & { skewingSide: -1 | 1 };\n\nconst AXIS_KEYS: Record<\n TAxis,\n {\n counterAxis: TAxis;\n scale: TAxisKey<'scale'>;\n skew: TAxisKey<'skew'>;\n lockSkewing: TAxisKey<'lockSkewing'>;\n origin: TAxisKey<'origin'>;\n flip: TAxisKey<'flip'>;\n }\n> = {\n x: {\n counterAxis: 'y',\n scale: SCALE_X,\n skew: SKEW_X,\n lockSkewing: 'lockSkewingX',\n origin: 'originX',\n flip: 'flipX',\n },\n y: {\n counterAxis: 'x',\n scale: SCALE_Y,\n skew: SKEW_Y,\n lockSkewing: 'lockSkewingY',\n origin: 'originY',\n flip: 'flipY',\n },\n};\n\nconst skewMap = ['ns', 'nesw', 'ew', 'nwse'];\n\n/**\n * return the correct cursor style for the skew action\n * @param {Event} eventData the javascript event that is causing the scale\n * @param {Control} control the control that is interested in the action\n * @param {FabricObject} fabricObject the fabric object that is interested in the action\n * @return {String} a valid css string for the cursor\n */\nexport const skewCursorStyleHandler: ControlCursorCallback = (\n eventData,\n control,\n fabricObject,\n coord,\n) => {\n if (control.x !== 0 && isLocked(fabricObject, 'lockSkewingY')) {\n return NOT_ALLOWED_CURSOR;\n }\n if (control.y !== 0 && isLocked(fabricObject, 'lockSkewingX')) {\n return NOT_ALLOWED_CURSOR;\n }\n const n = findCornerQuadrant(fabricObject, control, coord) % 4;\n return `${skewMap[n]}-resize`;\n};\n\n/**\n * Since skewing is applied before scaling, calculations are done in a scaleless plane\n * @see https://github.com/fabricjs/fabric.js/pull/8380\n */\nfunction skewObject(\n axis: TAxis,\n { target, ex, ey, skewingSide, ...transform }: SkewTransform,\n pointer: Point,\n) {\n const { skew: skewKey } = AXIS_KEYS[axis],\n offset = pointer\n .subtract(new Point(ex, ey))\n .divide(new Point(target.scaleX, target.scaleY))[axis],\n skewingBefore = target[skewKey],\n skewingStart = transform[skewKey],\n shearingStart = Math.tan(degreesToRadians(skewingStart)),\n // let a, b be the size of target\n // let a' be the value of a after applying skewing\n // then:\n // a' = a + b * skewA => skewA = (a' - a) / b\n // the value b is tricky since skewY is applied before skewX\n b =\n axis === 'y'\n ? target._getTransformedDimensions({\n scaleX: 1,\n scaleY: 1,\n // since skewY is applied before skewX, b (=width) is not affected by skewX\n skewX: 0,\n }).x\n : target._getTransformedDimensions({\n scaleX: 1,\n scaleY: 1,\n }).y;\n\n const shearing =\n (2 * offset * skewingSide) /\n // we max out fractions to safeguard from asymptotic behavior\n Math.max(b, 1) +\n // add starting state\n shearingStart;\n\n const skewing = radiansToDegrees(Math.atan(shearing));\n\n target.set(skewKey, skewing);\n const changed = skewingBefore !== target[skewKey];\n\n if (changed && axis === 'y') {\n // we don't want skewing to affect scaleX\n // so we factor it by the inverse skewing diff to make it seem unchanged to the viewer\n const { skewX, scaleX } = target,\n dimBefore = target._getTransformedDimensions({ skewY: skewingBefore }),\n dimAfter = target._getTransformedDimensions(),\n compensationFactor = skewX !== 0 ? dimBefore.x / dimAfter.x : 1;\n compensationFactor !== 1 &&\n target.set(SCALE_X, compensationFactor * scaleX);\n }\n\n return changed;\n}\n\n/**\n * Wrapped Action handler for skewing on a given axis, takes care of the\n * skew direction and determines the correct transform origin for the anchor point\n * @param {Event} eventData javascript event that is doing the transform\n * @param {Object} transform javascript object containing a series of information around the current transform\n * @param {number} x current mouse x position, canvas normalized\n * @param {number} y current mouse y position, canvas normalized\n * @return {Boolean} true if some change happened\n */\nfunction skewHandler(\n axis: TAxis,\n eventData: TPointerEvent,\n transform: Transform,\n x: number,\n y: number,\n) {\n const { target } = transform,\n {\n counterAxis,\n origin: originKey,\n lockSkewing: lockSkewingKey,\n skew: skewKey,\n flip: flipKey,\n } = AXIS_KEYS[axis];\n if (isLocked(target, lockSkewingKey)) {\n return false;\n }\n\n const { origin: counterOriginKey, flip: counterFlipKey } =\n AXIS_KEYS[counterAxis],\n counterOriginFactor =\n resolveOrigin(transform[counterOriginKey]) *\n (target[counterFlipKey] ? -1 : 1),\n // if the counter origin is top/left (= -0.5) then we are skewing x/y values on the bottom/right side of target respectively.\n // if the counter origin is bottom/right (= 0.5) then we are skewing x/y values on the top/left side of target respectively.\n // skewing direction on the top/left side of target is OPPOSITE to the direction of the movement of the pointer,\n // so we factor skewing direction by this value.\n skewingSide = (-Math.sign(counterOriginFactor) *\n (target[flipKey] ? -1 : 1)) as 1 | -1,\n skewingDirection =\n ((target[skewKey] === 0 &&\n // in case skewing equals 0 we use the pointer offset from target center to determine the direction of skewing\n getLocalPoint(transform, CENTER, CENTER, x, y)[axis] > 0) ||\n // in case target has skewing we use that as the direction\n target[skewKey] > 0\n ? 1\n : -1) * skewingSide,\n // anchor to the opposite side of the skewing direction\n // normalize value from [-1, 1] to origin value [0, 1]\n origin = -skewingDirection * 0.5 + 0.5;\n\n const finalHandler = wrapWithFireEvent(\n SKEWING,\n wrapWithFixedAnchor((eventData, transform, x, y) =>\n skewObject(axis, transform, new Point(x, y)),\n ),\n );\n\n return finalHandler(\n eventData,\n {\n ...transform,\n [originKey]: origin,\n skewingSide,\n },\n x,\n y,\n );\n}\n\n/**\n * Wrapped Action handler for skewing on the X axis, takes care of the\n * skew direction and determines the correct transform origin for the anchor point\n * @param {Event} eventData javascript event that is doing the transform\n * @param {Object} transform javascript object containing a series of information around the current transform\n * @param {number} x current mouse x position, canvas normalized\n * @param {number} y current mouse y position, canvas normalized\n * @return {Boolean} true if some change happened\n */\nexport const skewHandlerX: TransformActionHandler = (\n eventData,\n transform,\n x,\n y,\n) => {\n return skewHandler('x', eventData, transform, x, y);\n};\n\n/**\n * Wrapped Action handler for skewing on the Y axis, takes care of the\n * skew direction and determines the correct transform origin for the anchor point\n * @param {Event} eventData javascript event that is doing the transform\n * @param {Object} transform javascript object containing a series of information around the current transform\n * @param {number} x current mouse x position, canvas normalized\n * @param {number} y current mouse y position, canvas normalized\n * @return {Boolean} true if some change happened\n */\nexport const skewHandlerY: TransformActionHandler = (\n eventData,\n transform,\n x,\n y,\n) => {\n return skewHandler('y', eventData, transform, x, y);\n};\n","import type {\n ControlCallback,\n ControlCursorCallback,\n TPointerEvent,\n TransformActionHandler,\n} from '../EventTypeDefs';\nimport { SCALE_X, SCALE_Y, SKEW_X, SKEW_Y } from '../constants';\nimport type { FabricObject } from '../shapes/Object/FabricObject';\nimport type { TAxisKey } from '../typedefs';\nimport { scaleCursorStyleHandler, scalingX, scalingY } from './scale';\nimport { skewCursorStyleHandler, skewHandlerX, skewHandlerY } from './skew';\n\nfunction isAltAction(eventData: TPointerEvent, target: FabricObject) {\n return eventData[target.canvas!.altActionKey!];\n}\n\n/**\n * Inspect event, control and fabricObject to return the correct action name\n * @param {Event} eventData the javascript event that is causing the scale\n * @param {Control} control the control that is interested in the action\n * @param {FabricObject} fabricObject the fabric object that is interested in the action\n * @return {String} an action name\n */\nexport const scaleOrSkewActionName: ControlCallback<\n TAxisKey<'skew' | 'scale'> | ''\n> = (eventData, control, fabricObject) => {\n const isAlternative = isAltAction(eventData, fabricObject);\n if (control.x === 0) {\n // then is scaleY or skewX\n return isAlternative ? SKEW_X : SCALE_Y;\n }\n if (control.y === 0) {\n // then is scaleY or skewX\n return isAlternative ? SKEW_Y : SCALE_X;\n }\n return '';\n};\n\n/**\n * Combine skew and scale style handlers to cover fabric standard use case\n * @param {Event} eventData the javascript event that is causing the scale\n * @param {Control} control the control that is interested in the action\n * @param {FabricObject} fabricObject the fabric object that is interested in the action\n * @return {String} a valid css string for the cursor\n */\nexport const scaleSkewCursorStyleHandler: ControlCursorCallback = (\n eventData,\n control,\n fabricObject,\n coord,\n) => {\n return isAltAction(eventData, fabricObject)\n ? skewCursorStyleHandler(eventData, control, fabricObject, coord)\n : scaleCursorStyleHandler(eventData, control, fabricObject, coord);\n};\n/**\n * Composed action handler to either scale X or skew Y\n * Needs to be wrapped with `wrapWithFixedAnchor` to be effective\n * @param {Event} eventData javascript event that is doing the transform\n * @param {Object} transform javascript object containing a series of information around the current transform\n * @param {number} x current mouse x position, canvas normalized\n * @param {number} y current mouse y position, canvas normalized\n * @return {Boolean} true if some change happened\n */\nexport const scalingXOrSkewingY: TransformActionHandler = (\n eventData,\n transform,\n x,\n y,\n) => {\n return isAltAction(eventData, transform.target)\n ? skewHandlerY(eventData, transform, x, y)\n : scalingX(eventData, transform, x, y);\n};\n\n/**\n * Composed action handler to either scale Y or skew X\n * Needs to be wrapped with `wrapWithFixedAnchor` to be effective\n * @param {Event} eventData javascript event that is doing the transform\n * @param {Object} transform javascript object containing a series of information around the current transform\n * @param {number} x current mouse x position, canvas normalized\n * @param {number} y current mouse y position, canvas normalized\n * @return {Boolean} true if some change happened\n */\nexport const scalingYOrSkewingX: TransformActionHandler = (\n eventData,\n transform,\n x,\n y,\n) => {\n return isAltAction(eventData, transform.target)\n ? skewHandlerX(eventData, transform, x, y)\n : scalingY(eventData, transform, x, y);\n};\n","import { RESIZING, ROTATE } from '../constants';\nimport { changeWidth } from './changeWidth';\nimport { Control } from './Control';\nimport { rotationStyleHandler, rotationWithSnapping } from './rotate';\nimport { scaleCursorStyleHandler, scalingEqually } from './scale';\nimport {\n scaleOrSkewActionName,\n scaleSkewCursorStyleHandler,\n scalingXOrSkewingY,\n scalingYOrSkewingX,\n} from './scaleSkew';\n\n// use this function if you want to generate new controls for every instance\nexport const createObjectDefaultControls = () => ({\n ml: new Control({\n x: -0.5,\n y: 0,\n cursorStyleHandler: scaleSkewCursorStyleHandler,\n actionHandler: scalingXOrSkewingY,\n getActionName: scaleOrSkewActionName,\n }),\n\n mr: new Control({\n x: 0.5,\n y: 0,\n cursorStyleHandler: scaleSkewCursorStyleHandler,\n actionHandler: scalingXOrSkewingY,\n getActionName: scaleOrSkewActionName,\n }),\n\n mb: new Control({\n x: 0,\n y: 0.5,\n cursorStyleHandler: scaleSkewCursorStyleHandler,\n actionHandler: scalingYOrSkewingX,\n getActionName: scaleOrSkewActionName,\n }),\n\n mt: new Control({\n x: 0,\n y: -0.5,\n cursorStyleHandler: scaleSkewCursorStyleHandler,\n actionHandler: scalingYOrSkewingX,\n getActionName: scaleOrSkewActionName,\n }),\n\n tl: new Control({\n x: -0.5,\n y: -0.5,\n cursorStyleHandler: scaleCursorStyleHandler,\n actionHandler: scalingEqually,\n }),\n\n tr: new Control({\n x: 0.5,\n y: -0.5,\n cursorStyleHandler: scaleCursorStyleHandler,\n actionHandler: scalingEqually,\n }),\n\n bl: new Control({\n x: -0.5,\n y: 0.5,\n cursorStyleHandler: scaleCursorStyleHandler,\n actionHandler: scalingEqually,\n }),\n\n br: new Control({\n x: 0.5,\n y: 0.5,\n cursorStyleHandler: scaleCursorStyleHandler,\n actionHandler: scalingEqually,\n }),\n\n mtr: new Control({\n x: 0,\n y: -0.5,\n actionHandler: rotationWithSnapping,\n cursorStyleHandler: rotationStyleHandler,\n offsetY: -40,\n withConnection: true,\n actionName: ROTATE,\n }),\n});\n\nexport const createResizeControls = () => ({\n mr: new Control({\n x: 0.5,\n y: 0,\n actionHandler: changeWidth,\n cursorStyleHandler: scaleSkewCursorStyleHandler,\n actionName: RESIZING,\n }),\n ml: new Control({\n x: -0.5,\n y: 0,\n actionHandler: changeWidth,\n cursorStyleHandler: scaleSkewCursorStyleHandler,\n actionName: RESIZING,\n }),\n});\n\nexport const createTextboxDefaultControls = () => ({\n ...createObjectDefaultControls(),\n ...createResizeControls(),\n});\n","import { Point, ZERO } from '../../Point';\nimport type { TCornerPoint, TDegree } from '../../typedefs';\nimport { FabricObject } from './Object';\nimport { degreesToRadians } from '../../util/misc/radiansDegreesConversion';\nimport type { TQrDecomposeOut } from '../../util/misc/matrix';\nimport {\n calcDimensionsMatrix,\n createRotateMatrix,\n createTranslateMatrix,\n multiplyTransformMatrices,\n qrDecompose,\n} from '../../util/misc/matrix';\nimport type { Control } from '../../controls/Control';\nimport { sizeAfterTransform } from '../../util/misc/objectTransforms';\nimport type { ObjectEvents, TPointerEvent } from '../../EventTypeDefs';\nimport type { Canvas } from '../../canvas/Canvas';\nimport type { ControlRenderingStyleOverride } from '../../controls/controlRendering';\nimport type { FabricObjectProps } from './types/FabricObjectProps';\nimport type { TFabricObjectProps, SerializedObjectProps } from './types';\nimport { createObjectDefaultControls } from '../../controls/commonControls';\nimport { interactiveObjectDefaultValues } from './defaultValues';\nimport { SCALE } from '../../constants';\n\nexport type TOCoord = Point & {\n corner: TCornerPoint;\n touchCorner: TCornerPoint;\n};\n\nexport type TControlSet = Record;\n\nexport type TBorderRenderingStyleOverride = Partial<\n Pick\n>;\n\nexport type TStyleOverride = ControlRenderingStyleOverride &\n TBorderRenderingStyleOverride &\n Partial<\n Pick & {\n forActiveSelection: boolean;\n }\n >;\n\nexport class InteractiveFabricObject<\n Props extends TFabricObjectProps = Partial,\n SProps extends SerializedObjectProps = SerializedObjectProps,\n EventSpec extends ObjectEvents = ObjectEvents,\n >\n extends FabricObject\n implements FabricObjectProps\n{\n declare noScaleCache: boolean;\n\n declare snapAngle?: TDegree;\n declare snapThreshold?: TDegree;\n\n declare lockMovementX: boolean;\n declare lockMovementY: boolean;\n declare lockRotation: boolean;\n declare lockScalingX: boolean;\n declare lockScalingY: boolean;\n declare lockSkewingX: boolean;\n declare lockSkewingY: boolean;\n declare lockScalingFlip: boolean;\n\n declare cornerSize: number;\n declare touchCornerSize: number;\n declare transparentCorners: boolean;\n declare cornerColor: string;\n declare cornerStrokeColor: string;\n declare cornerStyle: 'rect' | 'circle';\n declare cornerDashArray: number[] | null;\n declare hasControls: boolean;\n\n declare borderColor: string;\n declare borderDashArray: number[] | null;\n declare borderOpacityWhenMoving: number;\n declare borderScaleFactor: number;\n declare hasBorders: boolean;\n declare selectionBackgroundColor: string;\n\n declare selectable: boolean;\n declare evented: boolean;\n declare perPixelTargetFind: boolean;\n declare activeOn: 'down' | 'up';\n\n declare hoverCursor: CSSStyleDeclaration['cursor'] | null;\n declare moveCursor: CSSStyleDeclaration['cursor'] | null;\n\n /**\n * The object's controls' position in viewport coordinates\n * Calculated by {@link Control#positionHandler} and {@link Control#calcCornerCoords}, depending on {@link padding}.\n * `corner/touchCorner` describe the 4 points forming the interactive area of the corner.\n * Used to draw and locate controls.\n */\n declare oCoords: Record;\n\n /**\n * keeps the value of the last hovered corner during mouse move.\n * 0 is no corner, or 'mt', 'ml', 'mtr' etc..\n * It should be private, but there is no harm in using it as\n * a read-only property.\n * this isn't cleaned automatically. Non selected objects may have wrong values\n * @type [string]\n */\n declare __corner?: string;\n\n /**\n * a map of control visibility for this object.\n * this was left when controls were introduced to not break the api too much\n * this takes priority over the generic control visibility\n */\n declare _controlsVisibility: Record;\n\n /**\n * holds the controls for the object.\n * controls are added by default_controls.js\n */\n declare controls: TControlSet;\n\n /**\n * internal boolean to signal the code that the object is\n * part of the move action.\n */\n declare isMoving?: boolean;\n\n /**\n * A boolean used from the gesture module to keep tracking of a scaling\n * action when there is no scaling transform in place.\n * This is an edge case and is used twice in all codebase.\n * Probably added to keep track of some performance issues\n * @TODO use git blame to investigate why it was added\n * DON'T USE IT. WE WILL TRY TO REMOVE IT\n */\n declare _scaling?: boolean;\n\n declare canvas?: Canvas;\n\n static ownDefaults = interactiveObjectDefaultValues;\n\n static getDefaults(): Record {\n return {\n ...super.getDefaults(),\n ...InteractiveFabricObject.ownDefaults,\n };\n }\n\n /**\n * Constructor\n * @param {Object} [options] Options object\n */\n constructor(options?: Props) {\n super();\n Object.assign(\n this,\n (this.constructor as typeof InteractiveFabricObject).createControls(),\n InteractiveFabricObject.ownDefaults,\n );\n this.setOptions(options);\n }\n\n /**\n * Creates the default control object.\n * If you prefer to have on instance of controls shared among all objects\n * make this function return an empty object and add controls to the ownDefaults\n * @param {Object} [options] Options object\n */\n static createControls(): { controls: Record } {\n return { controls: createObjectDefaultControls() };\n }\n\n /**\n * Update width and height of the canvas for cache\n * returns true or false if canvas needed resize.\n * @private\n * @return {Boolean} true if the canvas has been resized\n */\n _updateCacheCanvas() {\n const targetCanvas = this.canvas;\n if (this.noScaleCache && targetCanvas && targetCanvas._currentTransform) {\n const transform = targetCanvas._currentTransform,\n target = transform.target,\n action = transform.action;\n if (\n this === (target as unknown as this) &&\n action &&\n action.startsWith(SCALE)\n ) {\n return false;\n }\n }\n return super._updateCacheCanvas();\n }\n\n getActiveControl() {\n const key = this.__corner;\n return key\n ? {\n key,\n control: this.controls[key],\n coord: this.oCoords[key],\n }\n : undefined;\n }\n\n /**\n * Determines which corner is under the mouse cursor, represented by `pointer`.\n * This function returns a corner only if the object is the active one.\n * This is done to avoid selecting corner of non active object and activating transformations\n * rather than drag action. The default behavior of fabricJS is that if you want to transform\n * an object, first you select it to show the control set\n * @private\n * @param {Object} pointer The pointer indicating the mouse position\n * @param {boolean} forTouch indicates if we are looking for interaction area with a touch action\n * @return {String|Boolean} corner code (tl, tr, bl, br, etc.), or 0 if nothing is found.\n */\n findControl(\n pointer: Point,\n forTouch = false,\n ): { key: string; control: Control; coord: TOCoord } | undefined {\n if (!this.hasControls || !this.canvas) {\n return undefined;\n }\n\n this.__corner = undefined;\n const cornerEntries = Object.entries(this.oCoords);\n for (let i = cornerEntries.length - 1; i >= 0; i--) {\n const [key, corner] = cornerEntries[i];\n const control = this.controls[key];\n\n if (\n control.shouldActivate(\n key,\n this,\n pointer,\n forTouch ? corner.touchCorner : corner.corner,\n )\n ) {\n // this.canvas.contextTop.fillRect(pointer.x - 1, pointer.y - 1, 2, 2);\n this.__corner = key;\n\n return { key, control, coord: this.oCoords[key] };\n }\n }\n\n return undefined;\n }\n\n /**\n * Calculates the coordinates of the center of each control plus the corners of the control itself\n * This basically just delegates to each control positionHandler\n * WARNING: changing what is passed to positionHandler is a breaking change, since position handler\n * is a public api and should be done just if extremely necessary\n * @return {Record}\n */\n calcOCoords(): Record {\n const vpt = this.getViewportTransform(),\n center = this.getCenterPoint(),\n tMatrix = createTranslateMatrix(center.x, center.y),\n rMatrix = createRotateMatrix({\n angle: this.getTotalAngle() - (!!this.group && this.flipX ? 180 : 0),\n }),\n positionMatrix = multiplyTransformMatrices(tMatrix, rMatrix),\n startMatrix = multiplyTransformMatrices(vpt, positionMatrix),\n finalMatrix = multiplyTransformMatrices(startMatrix, [\n 1 / vpt[0],\n 0,\n 0,\n 1 / vpt[3],\n 0,\n 0,\n ]),\n transformOptions = this.group\n ? qrDecompose(this.calcTransformMatrix())\n : undefined;\n // decomposing could bring negative scaling and `_calculateCurrentDimensions` can't take it\n if (transformOptions) {\n transformOptions.scaleX = Math.abs(transformOptions.scaleX);\n transformOptions.scaleY = Math.abs(transformOptions.scaleY);\n }\n const dim = this._calculateCurrentDimensions(transformOptions),\n coords: Record = {};\n\n this.forEachControl((control, key) => {\n const position = control.positionHandler(dim, finalMatrix, this, control);\n // coords[key] are sometimes used as points. Those are points to which we add\n // the property corner and touchCorner from `_calcCornerCoords`.\n // don't remove this assign for an object spread.\n coords[key] = Object.assign(\n position,\n this._calcCornerCoords(control, position),\n );\n });\n\n // debug code\n /*\n const canvas = this.canvas;\n setTimeout(function () {\n if (!canvas) return;\n canvas.contextTop.clearRect(0, 0, 700, 700);\n canvas.contextTop.fillStyle = 'green';\n Object.keys(coords).forEach(function(key) {\n const control = coords[key];\n canvas.contextTop.fillRect(control.x, control.y, 3, 3);\n });\n } 50);\n */\n return coords;\n }\n\n /**\n * Sets the coordinates that determine the interaction area of each control\n * note: if we would switch to ROUND corner area, all of this would disappear.\n * everything would resolve to a single point and a pythagorean theorem for the distance\n * @todo evaluate simplification of code switching to circle interaction area at runtime\n * @private\n */\n private _calcCornerCoords(control: Control, position: Point) {\n const angle = this.getTotalAngle();\n const corner = control.calcCornerCoords(\n angle,\n this.cornerSize,\n position.x,\n position.y,\n false,\n this,\n );\n const touchCorner = control.calcCornerCoords(\n angle,\n this.touchCornerSize,\n position.x,\n position.y,\n true,\n this,\n );\n return { corner, touchCorner };\n }\n\n /**\n * @override set controls' coordinates as well\n * See {@link https://github.com/fabricjs/fabric.js/wiki/When-to-call-setCoords} and {@link http://fabricjs.com/fabric-gotchas}\n * @return {void}\n */\n setCoords(): void {\n super.setCoords();\n this.canvas && (this.oCoords = this.calcOCoords());\n }\n\n /**\n * Calls a function for each control. The function gets called,\n * with the control, the control's key and the object that is calling the iterator\n * @param {Function} fn function to iterate over the controls over\n */\n forEachControl(\n fn: (\n control: Control,\n key: string,\n fabricObject: InteractiveFabricObject,\n ) => any,\n ) {\n for (const i in this.controls) {\n fn(this.controls[i], i, this);\n }\n }\n\n /**\n * Draws a colored layer behind the object, inside its selection borders.\n * Requires public options: padding, selectionBackgroundColor\n * this function is called when the context is transformed\n * has checks to be skipped when the object is on a staticCanvas\n * @todo evaluate if make this disappear in favor of a pre-render hook for objects\n * this was added by Andrea Bogazzi to make possible some feature for work reasons\n * it seemed a good option, now is an edge case\n * @param {CanvasRenderingContext2D} ctx Context to draw on\n */\n drawSelectionBackground(ctx: CanvasRenderingContext2D): void {\n if (\n !this.selectionBackgroundColor ||\n (this.canvas && (this.canvas._activeObject as unknown as this) !== this)\n ) {\n return;\n }\n ctx.save();\n const center = this.getRelativeCenterPoint(),\n wh = this._calculateCurrentDimensions(),\n vpt = this.getViewportTransform();\n ctx.translate(center.x, center.y);\n ctx.scale(1 / vpt[0], 1 / vpt[3]);\n ctx.rotate(degreesToRadians(this.angle));\n ctx.fillStyle = this.selectionBackgroundColor;\n ctx.fillRect(-wh.x / 2, -wh.y / 2, wh.x, wh.y);\n ctx.restore();\n }\n\n /**\n * @public override this function in order to customize the drawing of the control box, e.g. rounded corners, different border style.\n * @param {CanvasRenderingContext2D} ctx ctx is rotated and translated so that (0,0) is at object's center\n * @param {Point} size the control box size used\n */\n strokeBorders(ctx: CanvasRenderingContext2D, size: Point): void {\n ctx.strokeRect(-size.x / 2, -size.y / 2, size.x, size.y);\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to draw on\n * @param {Point} size\n * @param {TStyleOverride} styleOverride object to override the object style\n */\n _drawBorders(\n ctx: CanvasRenderingContext2D,\n size: Point,\n styleOverride: TStyleOverride = {},\n ): void {\n const options = {\n hasControls: this.hasControls,\n borderColor: this.borderColor,\n borderDashArray: this.borderDashArray,\n ...styleOverride,\n };\n ctx.save();\n ctx.strokeStyle = options.borderColor;\n this._setLineDash(ctx, options.borderDashArray);\n this.strokeBorders(ctx, size);\n options.hasControls && this.drawControlsConnectingLines(ctx, size);\n ctx.restore();\n }\n\n /**\n * Renders controls and borders for the object\n * the context here is not transformed\n * @todo move to interactivity\n * @param {CanvasRenderingContext2D} ctx Context to render on\n * @param {TStyleOverride} [styleOverride] properties to override the object style\n */\n _renderControls(\n ctx: CanvasRenderingContext2D,\n styleOverride: TStyleOverride = {},\n ) {\n const { hasBorders, hasControls } = this;\n const styleOptions = {\n hasBorders,\n hasControls,\n ...styleOverride,\n };\n const vpt = this.getViewportTransform(),\n shouldDrawBorders = styleOptions.hasBorders,\n shouldDrawControls = styleOptions.hasControls;\n const matrix = multiplyTransformMatrices(vpt, this.calcTransformMatrix());\n const options = qrDecompose(matrix);\n ctx.save();\n ctx.translate(options.translateX, options.translateY);\n ctx.lineWidth = this.borderScaleFactor; // 1 * this.borderScaleFactor;\n // since interactive groups have been introduced, an object could be inside a group and needing controls\n // the following equality check `this.group === this.parent` covers:\n // object without a group ( undefined === undefined )\n // object inside a group\n // excludes object inside a group but multi selected since group and parent will differ in value\n if (this.group === this.parent) {\n ctx.globalAlpha = this.isMoving ? this.borderOpacityWhenMoving : 1;\n }\n if (this.flipX) {\n options.angle -= 180;\n }\n ctx.rotate(degreesToRadians(this.group ? options.angle : this.angle));\n shouldDrawBorders && this.drawBorders(ctx, options, styleOverride);\n shouldDrawControls && this.drawControls(ctx, styleOverride);\n ctx.restore();\n }\n\n /**\n * Draws borders of an object's bounding box.\n * Requires public properties: width, height\n * Requires public options: padding, borderColor\n * @param {CanvasRenderingContext2D} ctx Context to draw on\n * @param {object} options object representing current object parameters\n * @param {TStyleOverride} [styleOverride] object to override the object style\n */\n drawBorders(\n ctx: CanvasRenderingContext2D,\n options: TQrDecomposeOut,\n styleOverride: TStyleOverride,\n ): void {\n let size;\n if ((styleOverride && styleOverride.forActiveSelection) || this.group) {\n const bbox = sizeAfterTransform(\n this.width,\n this.height,\n calcDimensionsMatrix(options),\n ),\n stroke = !this.isStrokeAccountedForInDimensions()\n ? (this.strokeUniform\n ? new Point().scalarAdd(this.canvas ? this.canvas.getZoom() : 1)\n : // this is extremely confusing. options comes from the upper function\n // and is the qrDecompose of a matrix that takes in account zoom too\n new Point(options.scaleX, options.scaleY)\n ).scalarMultiply(this.strokeWidth)\n : ZERO;\n size = bbox\n .add(stroke)\n .scalarAdd(this.borderScaleFactor)\n .scalarAdd(this.padding * 2);\n } else {\n size = this._calculateCurrentDimensions().scalarAdd(\n this.borderScaleFactor,\n );\n }\n this._drawBorders(ctx, size, styleOverride);\n }\n\n /**\n * Draws lines from a borders of an object's bounding box to controls that have `withConnection` property set.\n * Requires public properties: width, height\n * Requires public options: padding, borderColor\n * @param {CanvasRenderingContext2D} ctx Context to draw on\n * @param {Point} size object size x = width, y = height\n */\n drawControlsConnectingLines(\n ctx: CanvasRenderingContext2D,\n size: Point,\n ): void {\n let shouldStroke = false;\n\n ctx.beginPath();\n this.forEachControl((control, key) => {\n // in this moment, the ctx is centered on the object.\n // width and height of the above function are the size of the bbox.\n if (control.withConnection && control.getVisibility(this, key)) {\n // reset movement for each control\n shouldStroke = true;\n ctx.moveTo(control.x * size.x, control.y * size.y);\n ctx.lineTo(\n control.x * size.x + control.offsetX,\n control.y * size.y + control.offsetY,\n );\n }\n });\n shouldStroke && ctx.stroke();\n }\n\n /**\n * Draws corners of an object's bounding box.\n * Requires public properties: width, height\n * Requires public options: cornerSize, padding\n * Be aware that since fabric 6.0 this function does not call setCoords anymore.\n * setCoords needs to be called manually if the object of which we are rendering controls\n * is outside the standard selection and transform process.\n * @param {CanvasRenderingContext2D} ctx Context to draw on\n * @param {ControlRenderingStyleOverride} styleOverride object to override the object style\n */\n drawControls(\n ctx: CanvasRenderingContext2D,\n styleOverride: ControlRenderingStyleOverride = {},\n ) {\n ctx.save();\n const retinaScaling = this.getCanvasRetinaScaling();\n const { cornerStrokeColor, cornerDashArray, cornerColor } = this;\n const options = {\n cornerStrokeColor,\n cornerDashArray,\n cornerColor,\n ...styleOverride,\n };\n ctx.setTransform(retinaScaling, 0, 0, retinaScaling, 0, 0);\n ctx.strokeStyle = ctx.fillStyle = options.cornerColor;\n if (!this.transparentCorners) {\n ctx.strokeStyle = options.cornerStrokeColor;\n }\n this._setLineDash(ctx, options.cornerDashArray);\n this.forEachControl((control, key) => {\n if (control.getVisibility(this, key)) {\n const p = this.oCoords[key];\n control.render(ctx, p.x, p.y, options, this);\n }\n });\n ctx.restore();\n }\n\n /**\n * Returns true if the specified control is visible, false otherwise.\n * @param {string} controlKey The key of the control. Possible values are usually 'tl', 'tr', 'br', 'bl', 'ml', 'mt', 'mr', 'mb', 'mtr',\n * but since the control api allow for any control name, can be any string.\n * @returns {boolean} true if the specified control is visible, false otherwise\n */\n isControlVisible(controlKey: string): boolean {\n return (\n this.controls[controlKey] &&\n this.controls[controlKey].getVisibility(this, controlKey)\n );\n }\n\n /**\n * Sets the visibility of the specified control.\n * please do not use.\n * @param {String} controlKey The key of the control. Possible values are 'tl', 'tr', 'br', 'bl', 'ml', 'mt', 'mr', 'mb', 'mtr'.\n * but since the control api allow for any control name, can be any string.\n * @param {Boolean} visible true to set the specified control visible, false otherwise\n * @todo discuss this overlap of priority here with the team. Andrea Bogazzi for details\n */\n setControlVisible(controlKey: string, visible: boolean) {\n if (!this._controlsVisibility) {\n this._controlsVisibility = {};\n }\n this._controlsVisibility[controlKey] = visible;\n }\n\n /**\n * Sets the visibility state of object controls, this is just a bulk option for setControlVisible;\n * @param {Record} [options] with an optional key per control\n * example: {Boolean} [options.bl] true to enable the bottom-left control, false to disable it\n */\n setControlsVisibility(options: Record = {}) {\n Object.entries(options).forEach(([controlKey, visibility]) =>\n this.setControlVisible(controlKey, visibility),\n );\n }\n\n /**\n * Clears the canvas.contextTop in a specific area that corresponds to the object's bounding box\n * that is in the canvas.contextContainer.\n * This function is used to clear pieces of contextTop where we render ephemeral effects on top of the object.\n * Example: blinking cursor text selection, drag effects.\n * @todo discuss swapping restoreManually with a renderCallback, but think of async issues\n * @param {Boolean} [restoreManually] When true won't restore the context after clear, in order to draw something else.\n * @return {CanvasRenderingContext2D|undefined} canvas.contextTop that is either still transformed\n * with the object transformMatrix, or restored to neutral transform\n */\n clearContextTop(\n restoreManually?: boolean,\n ): CanvasRenderingContext2D | undefined {\n if (!this.canvas) {\n return;\n }\n const ctx = this.canvas.contextTop;\n if (!ctx) {\n return;\n }\n const v = this.canvas.viewportTransform;\n ctx.save();\n ctx.transform(v[0], v[1], v[2], v[3], v[4], v[5]);\n this.transform(ctx);\n // we add 4 pixel, to be sure to do not leave any pixel out\n const width = this.width + 4,\n height = this.height + 4;\n ctx.clearRect(-width / 2, -height / 2, width, height);\n\n restoreManually || ctx.restore();\n return ctx;\n }\n\n /**\n * This callback function is called every time _discardActiveObject or _setActiveObject\n * try to to deselect this object. If the function returns true, the process is cancelled\n * @param {Object} [_options] options sent from the upper functions\n * @param {TPointerEvent} [options.e] event if the process is generated by an event\n * @param {FabricObject} [options.object] next object we are setting as active, and reason why\n * this is being deselected\n */\n onDeselect(_options?: {\n e?: TPointerEvent;\n object?: InteractiveFabricObject;\n }): boolean {\n // implemented by sub-classes, as needed.\n return false;\n }\n\n /**\n * This callback function is called every time _discardActiveObject or _setActiveObject\n * try to to select this object. If the function returns true, the process is cancelled\n * @param {Object} [_options] options sent from the upper functions\n * @param {Event} [_options.e] event if the process is generated by an event\n */\n onSelect(_options?: { e?: TPointerEvent }): boolean {\n // implemented by sub-classes, as needed.\n return false;\n }\n\n /**\n * Override to customize Drag behavior\n * Fired from {@link Canvas#_onMouseMove}\n * @returns true in order for the window to start a drag session\n */\n shouldStartDragging(_e: TPointerEvent) {\n return false;\n }\n\n /**\n * Override to customize Drag behavior\\\n * Fired once a drag session has started\n * @returns true to handle the drag event\n */\n onDragStart(_e: DragEvent) {\n return false;\n }\n\n /**\n * Override to customize drag and drop behavior\n * @public\n * @param {DragEvent} _e\n * @returns {boolean} true if the object currently dragged can be dropped on the target\n */\n canDrop(_e: DragEvent): boolean {\n return false;\n }\n\n /**\n * Override to customize drag and drop behavior\n * render a specific effect when an object is the source of a drag event\n * example: render the selection status for the part of text that is being dragged from a text object\n * @public\n * @param {DragEvent} _e\n */\n renderDragSourceEffect(_e: DragEvent) {\n // for subclasses\n }\n\n /**\n * Override to customize drag and drop behavior\n * render a specific effect when an object is the target of a drag event\n * used to show that the underly object can receive a drop, or to show how the\n * object will change when dropping. example: show the cursor where the text is about to be dropped\n * @public\n * @param {DragEvent} _e\n */\n renderDropTargetEffect(_e: DragEvent) {\n // for subclasses\n }\n}\n","import type { Constructor } from '../typedefs';\n\n/***\n * https://www.typescriptlang.org/docs/handbook/mixins.html#alternative-pattern\n */\nexport function applyMixins(\n derivedCtor: T,\n constructors: S[],\n) {\n constructors.forEach((baseCtor) => {\n Object.getOwnPropertyNames(baseCtor.prototype).forEach((name) => {\n name !== 'constructor' &&\n Object.defineProperty(\n derivedCtor.prototype,\n name,\n Object.getOwnPropertyDescriptor(baseCtor.prototype, name) ||\n Object.create(null),\n );\n });\n });\n return derivedCtor as T & { prototype: InstanceType };\n}\n","import type { ObjectEvents } from '../../EventTypeDefs';\nimport { FabricObjectSVGExportMixin } from './FabricObjectSVGExportMixin';\nimport { InteractiveFabricObject } from './InteractiveObject';\nimport { applyMixins } from '../../util/applyMixins';\nimport type { FabricObjectProps } from './types/FabricObjectProps';\nimport type { TFabricObjectProps, SerializedObjectProps } from './types';\nimport { classRegistry } from '../../ClassRegistry';\n\n// TODO somehow we have to make a tree-shakeable import\n\n// eslint-disable-next-line @typescript-eslint/no-empty-object-type\nexport interface FabricObject<\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n Props extends TFabricObjectProps = Partial,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n SProps extends SerializedObjectProps = SerializedObjectProps,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n EventSpec extends ObjectEvents = ObjectEvents,\n> extends FabricObjectSVGExportMixin {}\n\n// eslint-disable-next-line @typescript-eslint/no-unsafe-declaration-merging\nexport class FabricObject<\n Props extends TFabricObjectProps = Partial,\n SProps extends SerializedObjectProps = SerializedObjectProps,\n EventSpec extends ObjectEvents = ObjectEvents,\n> extends InteractiveFabricObject {}\n\napplyMixins(FabricObject, [FabricObjectSVGExportMixin]);\n\nclassRegistry.setClass(FabricObject);\nclassRegistry.setClass(FabricObject, 'object');\n\nexport { cacheProperties } from './defaultValues';\n","/**\n * Returns true if context has transparent pixel\n * at specified location (taking tolerance into account)\n * @param {CanvasRenderingContext2D} ctx context\n * @param {Number} x x coordinate in canvasElementCoordinate, not fabric space. integer\n * @param {Number} y y coordinate in canvasElementCoordinate, not fabric space. integer\n * @param {Number} tolerance Tolerance pixels around the point, not alpha tolerance, integer\n * @return {boolean} true if transparent\n */\nexport const isTransparent = (\n ctx: CanvasRenderingContext2D,\n x: number,\n y: number,\n tolerance: number,\n): boolean => {\n tolerance = Math.round(tolerance);\n const size = tolerance * 2 + 1;\n const { data } = ctx.getImageData(x - tolerance, y - tolerance, size, size);\n\n // Split image data - for tolerance > 1, pixelDataSize = 4;\n for (let i = 3; i < data.length; i += 4) {\n const alphaChannel = data[i];\n if (alphaChannel > 0) {\n return false;\n }\n }\n return true;\n};\n","export const findIndexRight = (\n array: T[],\n predicate: (value: T, index: number, array: T[]) => boolean,\n) => {\n for (let index = array.length - 1; index >= 0; index--) {\n if (predicate(array[index], index, array)) {\n return index;\n }\n }\n return -1;\n};\n","import type { XY } from '../../../Point';\nimport { Point } from '../../../Point';\nimport { degreesToRadians } from '../radiansDegreesConversion';\nimport { createVector } from '../vectors';\nimport type { TProjectStrokeOnPointsOptions, TProjection } from './types';\n\n/**\n * @see https://github.com/fabricjs/fabric.js/pull/8344\n * @todo consider removing skewing from points before calculating stroke projection,\n * see https://github.com/fabricjs/fabric.js/commit/494a10ee2f8c2278ae9a55b20bf50cf6ee25b064#commitcomment-94751537\n */\nexport abstract class StrokeProjectionsBase {\n declare options: TProjectStrokeOnPointsOptions;\n declare scale: Point;\n declare strokeUniformScalar: Point;\n declare strokeProjectionMagnitude: number;\n\n constructor(options: TProjectStrokeOnPointsOptions) {\n this.options = options;\n this.strokeProjectionMagnitude = this.options.strokeWidth / 2;\n this.scale = new Point(this.options.scaleX, this.options.scaleY);\n this.strokeUniformScalar = this.options.strokeUniform\n ? new Point(1 / this.options.scaleX, 1 / this.options.scaleY)\n : new Point(1, 1);\n }\n\n /**\n * When the stroke is uniform, scaling affects the arrangement of points. So we must take it into account.\n */\n protected createSideVector(from: XY, to: XY) {\n const v = createVector(from, to);\n return this.options.strokeUniform ? v.multiply(this.scale) : v;\n }\n\n protected abstract calcOrthogonalProjection(\n from: Point,\n to: Point,\n magnitude?: number,\n ): Point;\n\n protected projectOrthogonally(from: Point, to: Point, magnitude?: number) {\n return this.applySkew(\n from.add(this.calcOrthogonalProjection(from, to, magnitude)),\n );\n }\n\n protected isSkewed() {\n return this.options.skewX !== 0 || this.options.skewY !== 0;\n }\n\n protected applySkew(point: Point) {\n const p = new Point(point);\n // skewY must be applied before skewX as this distortion affects skewX calculation\n p.y += p.x * Math.tan(degreesToRadians(this.options.skewY));\n p.x += p.y * Math.tan(degreesToRadians(this.options.skewX));\n return p;\n }\n\n protected scaleUnitVector(unitVector: Point, scalar: number) {\n return unitVector.multiply(this.strokeUniformScalar).scalarMultiply(scalar);\n }\n\n protected abstract projectPoints(): Point[];\n\n public abstract project(): TProjection[];\n}\n","import type { XY } from '../../../Point';\nimport { Point } from '../../../Point';\nimport { halfPI, twoMathPi } from '../../../constants';\nimport type { TRadian } from '../../../typedefs';\nimport { degreesToRadians } from '../radiansDegreesConversion';\nimport {\n calcAngleBetweenVectors,\n calcVectorRotation,\n crossProduct,\n getOrthonormalVector,\n getUnitVector,\n isBetweenVectors,\n magnitude,\n rotateVector,\n} from '../vectors';\nimport { StrokeProjectionsBase } from './StrokeProjectionsBase';\nimport type { TProjection, TProjectStrokeOnPointsOptions } from './types';\n\nconst zeroVector = new Point();\n\n/**\n * class in charge of finding projections for each type of line join\n * @see {@link [Closed path projections at #8344](https://github.com/fabricjs/fabric.js/pull/8344#2-closed-path)}\n *\n * - MDN:\n * - https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/lineJoin\n * - https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/stroke-linejoin\n * - Spec: https://svgwg.org/svg2-draft/painting.html#StrokeLinejoinProperty\n * - Playground to understand how the line joins works: https://hypertolosana.github.io/efficient-webgl-stroking/index.html\n * - View the calculated projections for each of the control points: https://codesandbox.io/s/project-stroke-points-with-context-to-trace-b8jc4j?file=/src/index.js\n *\n */\nexport class StrokeLineJoinProjections extends StrokeProjectionsBase {\n /**\n * The point being projected (the angle ∠BAC)\n */\n declare A: Point;\n /**\n * The point before A\n */\n declare B: Point;\n /**\n * The point after A\n */\n declare C: Point;\n /**\n * The AB vector\n */\n AB: Point;\n /**\n * The AC vector\n */\n AC: Point;\n /**\n * The angle of A (∠BAC)\n */\n alpha: TRadian;\n /**\n * The bisector of A (∠BAC)\n */\n bisector: Point;\n\n static getOrthogonalRotationFactor(vector1: Point, vector2?: Point) {\n const angle = vector2\n ? calcAngleBetweenVectors(vector1, vector2)\n : calcVectorRotation(vector1);\n return Math.abs(angle) < halfPI ? -1 : 1;\n }\n\n constructor(A: XY, B: XY, C: XY, options: TProjectStrokeOnPointsOptions) {\n super(options);\n this.A = new Point(A);\n this.B = new Point(B);\n this.C = new Point(C);\n this.AB = this.createSideVector(this.A, this.B);\n this.AC = this.createSideVector(this.A, this.C);\n this.alpha = calcAngleBetweenVectors(this.AB, this.AC);\n this.bisector = getUnitVector(\n // if AC is also the zero vector nothing will be projected\n // in that case the next point will handle the projection\n rotateVector(this.AB.eq(zeroVector) ? this.AC : this.AB, this.alpha / 2),\n );\n }\n\n calcOrthogonalProjection(\n from: Point,\n to: Point,\n magnitude: number = this.strokeProjectionMagnitude,\n ) {\n const vector = this.createSideVector(from, to);\n const orthogonalProjection = getOrthonormalVector(vector);\n const correctSide = StrokeLineJoinProjections.getOrthogonalRotationFactor(\n orthogonalProjection,\n this.bisector,\n );\n return this.scaleUnitVector(orthogonalProjection, magnitude * correctSide);\n }\n\n /**\n * BEVEL\n * Calculation: the projection points are formed by the vector orthogonal to the vertex.\n *\n * @see https://github.com/fabricjs/fabric.js/pull/8344#2-2-bevel\n */\n projectBevel() {\n const projections: Point[] = [];\n // if `alpha` equals 0 or 2*PI, the projections are the same for `B` and `C`\n (this.alpha % twoMathPi === 0 ? [this.B] : [this.B, this.C]).forEach(\n (to) => {\n projections.push(this.projectOrthogonally(this.A, to));\n projections.push(\n this.projectOrthogonally(this.A, to, -this.strokeProjectionMagnitude),\n );\n },\n );\n return projections;\n }\n\n /**\n * MITER\n * Calculation: the corner is formed by extending the outer edges of the stroke\n * at the tangents of the path segments until they intersect.\n *\n * @see https://github.com/fabricjs/fabric.js/pull/8344#2-1-miter\n */\n projectMiter() {\n const projections: Point[] = [],\n alpha = Math.abs(this.alpha),\n hypotUnitScalar = 1 / Math.sin(alpha / 2),\n miterVector = this.scaleUnitVector(\n this.bisector,\n -this.strokeProjectionMagnitude * hypotUnitScalar,\n );\n\n // When two line segments meet at a sharp angle, it is possible for the join to extend,\n // far beyond the thickness of the line stroking the path. The stroke-miterlimit imposes\n // a limit on the extent of the line join.\n // MDN: https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/stroke-miterlimit\n // When the stroke is uniform, scaling changes the arrangement of points, this changes the miter-limit\n const strokeMiterLimit = this.options.strokeUniform\n ? magnitude(\n this.scaleUnitVector(this.bisector, this.options.strokeMiterLimit),\n )\n : this.options.strokeMiterLimit;\n\n if (\n magnitude(miterVector) / this.strokeProjectionMagnitude <=\n strokeMiterLimit\n ) {\n projections.push(this.applySkew(this.A.add(miterVector)));\n }\n /* when the miter-limit is reached, the stroke line join becomes of type bevel.\n We always need two orthogonal projections which are basically bevel-type projections,\n so regardless of whether the miter-limit was reached or not, we include these projections.\n */\n projections.push(...this.projectBevel());\n\n return projections;\n }\n\n /**\n * ROUND (without skew)\n * Calculation: the projections are the two vectors parallel to X and Y axes\n *\n * @see https://github.com/fabricjs/fabric.js/pull/8344#2-3-1-round-without-skew\n */\n private projectRoundNoSkew(startCircle: Point, endCircle: Point) {\n const projections: Point[] = [],\n // correctSide is used to only consider projecting for the outer side\n correctSide = new Point(\n StrokeLineJoinProjections.getOrthogonalRotationFactor(this.bisector),\n StrokeLineJoinProjections.getOrthogonalRotationFactor(\n new Point(this.bisector.y, this.bisector.x),\n ),\n ),\n radiusOnAxisX = new Point(1, 0)\n .scalarMultiply(this.strokeProjectionMagnitude)\n .multiply(this.strokeUniformScalar)\n .multiply(correctSide),\n radiusOnAxisY = new Point(0, 1)\n .scalarMultiply(this.strokeProjectionMagnitude)\n .multiply(this.strokeUniformScalar)\n .multiply(correctSide);\n\n [radiusOnAxisX, radiusOnAxisY].forEach((vector) => {\n if (isBetweenVectors(vector, startCircle, endCircle)) {\n projections.push(this.A.add(vector));\n }\n });\n return projections;\n }\n\n /**\n * ROUND (with skew)\n * Calculation: the projections are the points furthest from the vertex in\n * the direction of the X and Y axes after distortion.\n *\n * @see https://github.com/fabricjs/fabric.js/pull/8344#2-3-2-round-skew\n */\n private projectRoundWithSkew(startCircle: Point, endCircle: Point) {\n const projections: Point[] = [];\n\n const { skewX, skewY, scaleX, scaleY, strokeUniform } = this.options,\n shearing = new Point(\n Math.tan(degreesToRadians(skewX)),\n Math.tan(degreesToRadians(skewY)),\n );\n // The points furthest from the vertex in the direction of the X and Y axes after distortion\n const circleRadius = this.strokeProjectionMagnitude,\n newY = strokeUniform\n ? circleRadius /\n scaleY /\n Math.sqrt(1 / scaleY ** 2 + (1 / scaleX ** 2) * shearing.y ** 2)\n : circleRadius / Math.sqrt(1 + shearing.y ** 2),\n furthestY = new Point(\n // Safe guard due to floating point precision. In some situations the square root\n // was returning NaN because of a negative number close to zero.\n Math.sqrt(Math.max(circleRadius ** 2 - newY ** 2, 0)),\n newY,\n ),\n newX = strokeUniform\n ? circleRadius /\n Math.sqrt(\n 1 +\n (shearing.x ** 2 * (1 / scaleY) ** 2) /\n (1 / scaleX + (1 / scaleX) * shearing.x * shearing.y) ** 2,\n )\n : circleRadius /\n Math.sqrt(1 + shearing.x ** 2 / (1 + shearing.x * shearing.y) ** 2),\n furthestX = new Point(\n newX,\n Math.sqrt(Math.max(circleRadius ** 2 - newX ** 2, 0)),\n );\n\n [\n furthestX,\n furthestX.scalarMultiply(-1),\n furthestY,\n furthestY.scalarMultiply(-1),\n ]\n // We need to skew the vector here as this information is used to check if\n // it is between the start and end of the circle segment\n .map((vector) =>\n this.applySkew(\n strokeUniform ? vector.multiply(this.strokeUniformScalar) : vector,\n ),\n )\n .forEach((vector) => {\n if (isBetweenVectors(vector, startCircle, endCircle)) {\n projections.push(this.applySkew(this.A).add(vector));\n }\n });\n\n return projections;\n }\n\n projectRound() {\n const projections: Point[] = [];\n /* Include the start and end points of the circle segment, so that only\n the projections contained within it are included */\n // add the orthogonal projections (start and end points of circle segment)\n projections.push(...this.projectBevel());\n // let's determines which one of the orthogonal projection is the beginning and end of the circle segment.\n // when `alpha` equals 0 or 2*PI, we have a straight line, so the way to find the start/end is different.\n const isStraightLine = this.alpha % twoMathPi === 0,\n // change the origin of the projections to point A\n // so that the cross product calculation is correct\n newOrigin = this.applySkew(this.A),\n proj0 = projections[isStraightLine ? 0 : 2].subtract(newOrigin),\n proj1 = projections[isStraightLine ? 1 : 0].subtract(newOrigin),\n // when `isStraightLine` === true, we compare with the vector opposite AB, otherwise we compare with the bisector.\n comparisonVector = isStraightLine\n ? this.applySkew(this.AB.scalarMultiply(-1))\n : this.applySkew(\n this.bisector.multiply(this.strokeUniformScalar).scalarMultiply(-1),\n ),\n // the beginning of the circle segment is always to the right of the comparison vector (cross product > 0)\n isProj0Start = crossProduct(proj0, comparisonVector) > 0,\n startCircle = isProj0Start ? proj0 : proj1,\n endCircle = isProj0Start ? proj1 : proj0;\n if (!this.isSkewed()) {\n projections.push(...this.projectRoundNoSkew(startCircle, endCircle));\n } else {\n projections.push(...this.projectRoundWithSkew(startCircle, endCircle));\n }\n return projections;\n }\n\n /**\n * Project stroke width on points returning projections for each point as follows:\n * - `miter`: 1 point corresponding to the outer boundary. If the miter limit is exceeded, it will be 2 points (becomes bevel)\n * - `bevel`: 2 points corresponding to the bevel possible boundaries, orthogonal to the stroke.\n * - `round`: same as `bevel` when it has no skew, with skew are 4 points.\n */\n protected projectPoints() {\n switch (this.options.strokeLineJoin) {\n case 'miter':\n return this.projectMiter();\n case 'round':\n return this.projectRound();\n default:\n return this.projectBevel();\n }\n }\n\n public project(): TProjection[] {\n return this.projectPoints().map((point) => ({\n originPoint: this.A,\n projectedPoint: point,\n angle: this.alpha,\n bisector: this.bisector,\n }));\n }\n}\n","import type { XY } from '../../../Point';\nimport { Point } from '../../../Point';\nimport { getOrthonormalVector, getUnitVector } from '../vectors';\nimport { StrokeLineJoinProjections } from './StrokeLineJoinProjections';\nimport { StrokeProjectionsBase } from './StrokeProjectionsBase';\nimport type { TProjection, TProjectStrokeOnPointsOptions } from './types';\n\n/**\n * class in charge of finding projections for each type of line cap for start/end of an open path\n * @see {@link [Open path projections at #8344](https://github.com/fabricjs/fabric.js/pull/8344#1-open-path)}\n *\n * Reference:\n * - MDN:\n * - https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/lineCap\n * - https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/stroke-linecap\n * - Spec: https://html.spec.whatwg.org/multipage/canvas.html#dom-context-2d-linecap-dev\n * - Playground to understand how the line joins works: https://hypertolosana.github.io/efficient-webgl-stroking/index.html\n * - View the calculated projections for each of the control points: https://codesandbox.io/s/project-stroke-points-with-context-to-trace-b8jc4j?file=/src/index.js\n */\nexport class StrokeLineCapProjections extends StrokeProjectionsBase {\n /**\n * edge point\n */\n declare A: Point;\n /**\n * point next to edge point\n */\n declare T: Point;\n\n constructor(A: XY, T: XY, options: TProjectStrokeOnPointsOptions) {\n super(options);\n this.A = new Point(A);\n this.T = new Point(T);\n }\n\n calcOrthogonalProjection(\n from: Point,\n to: Point,\n magnitude: number = this.strokeProjectionMagnitude,\n ) {\n const vector = this.createSideVector(from, to);\n return this.scaleUnitVector(getOrthonormalVector(vector), magnitude);\n }\n\n /**\n * OPEN PATH START/END - Line cap: Butt\n * Calculation: to find the projections, just find the points orthogonal to the stroke\n *\n * @see https://github.com/fabricjs/fabric.js/pull/8344#1-1-butt\n */\n projectButt() {\n return [\n this.projectOrthogonally(this.A, this.T, this.strokeProjectionMagnitude),\n this.projectOrthogonally(this.A, this.T, -this.strokeProjectionMagnitude),\n ];\n }\n\n /**\n * OPEN PATH START/END - Line cap: Round\n * Calculation: same as stroke line join `round`\n *\n * @see https://github.com/fabricjs/fabric.js/pull/8344#1-2-round\n */\n projectRound() {\n const projections: Point[] = [];\n\n if (!this.isSkewed() && this.A.eq(this.T)) {\n /* 1 point case without `skew`\n When `strokeUniform` is true, scaling has no effect.\n So we divide by scale, to remove its effect.\n */\n const projection = new Point(1, 1)\n .scalarMultiply(this.strokeProjectionMagnitude)\n .multiply(this.strokeUniformScalar);\n projections.push(\n this.applySkew(this.A.add(projection)),\n this.applySkew(this.A.subtract(projection)),\n );\n } else {\n projections.push(\n ...new StrokeLineJoinProjections(\n this.A,\n this.T,\n this.T,\n this.options,\n ).projectRound(),\n );\n }\n\n return projections;\n }\n\n /**\n * OPEN PATH START/END - Line cap: Square\n * Calculation: project a rectangle of points on the stroke in the opposite direction of the vector `AT`\n *\n * @see https://github.com/fabricjs/fabric.js/pull/8344#1-3-square\n */\n projectSquare() {\n const projections: Point[] = [];\n\n if (this.A.eq(this.T)) {\n /* 1 point case without `skew`\n When `strokeUniform` is true, scaling has no effect.\n So we divide by scale, to remove its effect.\n */\n const projection = new Point(1, 1)\n .scalarMultiply(this.strokeProjectionMagnitude)\n .multiply(this.strokeUniformScalar);\n projections.push(this.A.add(projection), this.A.subtract(projection));\n } else {\n const orthogonalProjection = this.calcOrthogonalProjection(\n this.A,\n this.T,\n this.strokeProjectionMagnitude,\n );\n const strokePointingOut = this.scaleUnitVector(\n getUnitVector(this.createSideVector(this.A, this.T)),\n -this.strokeProjectionMagnitude,\n );\n const projectedA = this.A.add(strokePointingOut);\n projections.push(\n projectedA.add(orthogonalProjection),\n projectedA.subtract(orthogonalProjection),\n );\n }\n\n return projections.map((p) => this.applySkew(p));\n }\n\n protected projectPoints() {\n switch (this.options.strokeLineCap) {\n case 'round':\n return this.projectRound();\n case 'square':\n return this.projectSquare();\n default:\n return this.projectButt();\n }\n }\n\n public project(): TProjection[] {\n return this.projectPoints().map((point) => ({\n originPoint: this.A,\n projectedPoint: point,\n }));\n }\n}\n","import { Point, type XY } from '../../../Point';\nimport { findIndexRight } from '../../internals/findRight';\nimport { StrokeLineCapProjections } from './StrokeLineCapProjections';\nimport { StrokeLineJoinProjections } from './StrokeLineJoinProjections';\nimport type { TProjection, TProjectStrokeOnPointsOptions } from './types';\n\nexport type * from './types';\n\n/**\n *\n * Used to calculate object's bounding box\n *\n * @see https://github.com/fabricjs/fabric.js/pull/8344\n *\n */\nexport const projectStrokeOnPoints = (\n points: XY[],\n options: TProjectStrokeOnPointsOptions,\n openPath = false,\n): TProjection[] => {\n const projections: TProjection[] = [];\n\n if (points.length === 0) {\n return projections;\n }\n\n // first we remove duplicate neighboring points\n const reduced = points.reduce(\n (reduced, point) => {\n if (!reduced[reduced.length - 1].eq(point)) {\n reduced.push(new Point(point));\n }\n return reduced;\n },\n [new Point(points[0])],\n );\n\n if (reduced.length === 1) {\n openPath = true;\n } else if (!openPath) {\n // remove points from end in case they equal the first point\n // in order to correctly project the first point\n const start = reduced[0];\n const index = findIndexRight(reduced, (point) => !point.eq(start));\n reduced.splice(index + 1);\n }\n\n reduced.forEach((A, index, points) => {\n let B: XY, C: XY;\n if (index === 0) {\n C = points[1];\n B = openPath ? A : points[points.length - 1];\n } else if (index === points.length - 1) {\n B = points[index - 1];\n C = openPath ? A : points[0];\n } else {\n B = points[index - 1];\n C = points[index + 1];\n }\n\n if (openPath && points.length === 1) {\n projections.push(\n ...new StrokeLineCapProjections(A, A, options).project(),\n );\n } else if (openPath && (index === 0 || index === points.length - 1)) {\n projections.push(\n ...new StrokeLineCapProjections(\n A,\n index === 0 ? C : B,\n options,\n ).project(),\n );\n } else {\n projections.push(\n ...new StrokeLineJoinProjections(A, B, C, options).project(),\n );\n }\n });\n\n return projections;\n};\n","import type { TextStyle } from '../../shapes/Text/StyledText';\n\nexport const cloneStyles = (style: TextStyle): TextStyle => {\n const newObj: TextStyle = {};\n Object.keys(style).forEach((key) => {\n newObj[key] = {};\n Object.keys(style[key]).forEach((keyInner) => {\n newObj[key][keyInner] = { ...style[key][keyInner] };\n });\n });\n return newObj;\n};\n","import { getFabricWindow } from '../env';\n\n/**\n * Capitalizes a string\n * @param {String} string String to capitalize\n * @param {Boolean} [firstLetterOnly] If true only first letter is capitalized\n * and other letters stay untouched, if false first letter is capitalized\n * and other letters are converted to lowercase.\n * @return {String} Capitalized version of a string\n */\nexport const capitalize = (string: string, firstLetterOnly = false): string =>\n `${string.charAt(0).toUpperCase()}${\n firstLetterOnly ? string.slice(1) : string.slice(1).toLowerCase()\n }`;\n\n/**\n * Escapes XML in a string\n * @param {String} string String to escape\n * @return {String} Escaped version of a string\n */\nexport const escapeXml = (string: string): string =>\n string\n .replace(/&/g, '&')\n .replace(/\"/g, '"')\n .replace(/'/g, ''')\n .replace(//g, '>');\n\nlet segmenter: Intl.Segmenter | false;\n\nconst getSegmenter = () => {\n if (!segmenter) {\n segmenter =\n 'Intl' in getFabricWindow() &&\n 'Segmenter' in Intl &&\n new Intl.Segmenter(undefined, {\n granularity: 'grapheme',\n });\n }\n return segmenter;\n};\n\n/**\n * Divide a string in the user perceived single units\n * @param {String} textstring String to escape\n * @return {Array} array containing the graphemes\n */\nexport const graphemeSplit = (textstring: string): string[] => {\n segmenter || getSegmenter();\n if (segmenter) {\n const segments = segmenter.segment(textstring);\n return Array.from(segments).map(({ segment }) => segment);\n }\n\n //Fallback\n return graphemeSplitImpl(textstring);\n};\n\nconst graphemeSplitImpl = (textstring: string): string[] => {\n const graphemes: string[] = [];\n for (let i = 0, chr; i < textstring.length; i++) {\n if ((chr = getWholeChar(textstring, i)) === false) {\n continue;\n }\n graphemes.push(chr);\n }\n return graphemes;\n};\n\n// taken from mdn in the charAt doc page.\nconst getWholeChar = (str: string, i: number): string | false => {\n const code = str.charCodeAt(i);\n if (isNaN(code)) {\n return ''; // Position not found\n }\n if (code < 0xd800 || code > 0xdfff) {\n return str.charAt(i);\n }\n\n // High surrogate (could change last hex to 0xDB7F to treat high private\n // surrogates as single characters)\n if (0xd800 <= code && code <= 0xdbff) {\n if (str.length <= i + 1) {\n throw 'High surrogate without following low surrogate';\n }\n const next = str.charCodeAt(i + 1);\n if (0xdc00 > next || next > 0xdfff) {\n throw 'High surrogate without following low surrogate';\n }\n return str.charAt(i) + str.charAt(i + 1);\n }\n // Low surrogate (0xDC00 <= code && code <= 0xDFFF)\n if (i === 0) {\n throw 'Low surrogate without preceding high surrogate';\n }\n const prev = str.charCodeAt(i - 1);\n\n // (could change last hex to 0xDB7F to treat high private\n // surrogates as single characters)\n if (0xd800 > prev || prev > 0xdbff) {\n throw 'Low surrogate without preceding high surrogate';\n }\n // We can pass over low surrogates now as the second component\n // in a pair which we have already processed\n return false;\n};\n","import { reNewline } from '../../constants';\nimport type {\n TextStyle,\n TextStyleDeclaration,\n} from '../../shapes/Text/StyledText';\nimport { cloneStyles } from '../internals/cloneStyles';\nimport { graphemeSplit } from '../lang_string';\n\nexport type TextStyleArray = {\n start: number;\n end: number;\n style: TextStyleDeclaration;\n}[];\n\n/**\n * @param {Object} prevStyle first style to compare\n * @param {Object} thisStyle second style to compare\n * @param {boolean} forTextSpans whether to check overline, underline, and line-through properties\n * @return {boolean} true if the style changed\n */\nexport const hasStyleChanged = (\n prevStyle: TextStyleDeclaration,\n thisStyle: TextStyleDeclaration,\n forTextSpans = false,\n) =>\n prevStyle.fill !== thisStyle.fill ||\n prevStyle.stroke !== thisStyle.stroke ||\n prevStyle.strokeWidth !== thisStyle.strokeWidth ||\n prevStyle.fontSize !== thisStyle.fontSize ||\n prevStyle.fontFamily !== thisStyle.fontFamily ||\n prevStyle.fontWeight !== thisStyle.fontWeight ||\n prevStyle.fontStyle !== thisStyle.fontStyle ||\n prevStyle.textDecorationThickness !== thisStyle.textDecorationThickness ||\n prevStyle.textBackgroundColor !== thisStyle.textBackgroundColor ||\n prevStyle.deltaY !== thisStyle.deltaY ||\n (forTextSpans &&\n (prevStyle.overline !== thisStyle.overline ||\n prevStyle.underline !== thisStyle.underline ||\n prevStyle.linethrough !== thisStyle.linethrough));\n\n/**\n * Returns the array form of a text object's inline styles property with styles grouped in ranges\n * rather than per character. This format is less verbose, and is better suited for storage\n * so it is used in serialization (not during runtime).\n * @param {object} styles per character styles for a text object\n * @param {String} text the text string that the styles are applied to\n * @return {{start: number, end: number, style: object}[]}\n */\nexport const stylesToArray = (\n styles: TextStyle,\n text: string,\n): TextStyleArray => {\n const textLines = text.split('\\n'),\n stylesArray = [];\n let charIndex = -1,\n prevStyle = {};\n // clone style structure to prevent mutation\n styles = cloneStyles(styles);\n\n //loop through each textLine\n for (let i = 0; i < textLines.length; i++) {\n const chars = graphemeSplit(textLines[i]);\n if (!styles[i]) {\n //no styles exist for this line, so add the line's length to the charIndex total and reset prevStyle\n charIndex += chars.length;\n prevStyle = {};\n continue;\n }\n //loop through each character of the current line\n for (let c = 0; c < chars.length; c++) {\n charIndex++;\n const thisStyle = styles[i][c];\n //check if style exists for this character\n if (thisStyle && Object.keys(thisStyle).length > 0) {\n if (hasStyleChanged(prevStyle, thisStyle, true)) {\n stylesArray.push({\n start: charIndex,\n end: charIndex + 1,\n style: thisStyle,\n });\n } else {\n //if style is the same as previous character, increase end index\n stylesArray[stylesArray.length - 1].end++;\n }\n }\n prevStyle = thisStyle || {};\n }\n }\n return stylesArray;\n};\n\n/**\n * Returns the object form of the styles property with styles that are assigned per\n * character rather than grouped by range. This format is more verbose, and is\n * only used during runtime (not for serialization/storage)\n * @param {Array} styles the serialized form of a text object's styles\n * @param {String} text the text string that the styles are applied to\n * @return {Object}\n */\nexport const stylesFromArray = (\n styles: TextStyleArray | TextStyle,\n text: string,\n): TextStyle => {\n if (!Array.isArray(styles)) {\n // clone to prevent mutation\n return cloneStyles(styles);\n }\n const textLines = text.split(reNewline),\n stylesObject: TextStyle = {};\n let charIndex = -1,\n styleIndex = 0;\n //loop through each textLine\n for (let i = 0; i < textLines.length; i++) {\n const chars = graphemeSplit(textLines[i]);\n\n //loop through each character of the current line\n for (let c = 0; c < chars.length; c++) {\n charIndex++;\n //check if there's a style collection that includes the current character\n if (\n styles[styleIndex] &&\n styles[styleIndex].start <= charIndex &&\n charIndex < styles[styleIndex].end\n ) {\n //create object for line index if it doesn't exist\n stylesObject[i] = stylesObject[i] || {};\n //assign a style at this character's index\n stylesObject[i][c] = { ...styles[styleIndex].style };\n //if character is at the end of the current style collection, move to the next\n if (charIndex === styles[styleIndex].end - 1) {\n styleIndex++;\n }\n }\n }\n }\n return stylesObject;\n};\n","import { FILL, STROKE } from '../constants';\n\n/**\n * Attributes parsed from all SVG elements\n * @type array\n */\nexport const SHARED_ATTRIBUTES = [\n 'display',\n 'transform',\n FILL,\n 'fill-opacity',\n 'fill-rule',\n 'opacity',\n STROKE,\n 'stroke-dasharray',\n 'stroke-linecap',\n 'stroke-dashoffset',\n 'stroke-linejoin',\n 'stroke-miterlimit',\n 'stroke-opacity',\n 'stroke-width',\n 'id',\n 'paint-order',\n 'vector-effect',\n 'instantiated_by_use',\n 'clip-path',\n];\n","export function selectorMatches(\n element: HTMLElement | SVGElement,\n selector: string,\n) {\n const nodeName = element.nodeName;\n const classNames = element.getAttribute('class');\n const id = element.getAttribute('id');\n const azAz = '(?![a-zA-Z\\\\-]+)';\n let matcher;\n // i check if a selector matches slicing away part from it.\n // if i get empty string i should match\n matcher = new RegExp('^' + nodeName, 'i');\n selector = selector.replace(matcher, '');\n if (id && selector.length) {\n matcher = new RegExp('#' + id + azAz, 'i');\n selector = selector.replace(matcher, '');\n }\n if (classNames && selector.length) {\n const splitClassNames = classNames.split(' ');\n for (let i = splitClassNames.length; i--; ) {\n matcher = new RegExp('\\\\.' + splitClassNames[i] + azAz, 'i');\n selector = selector.replace(matcher, '');\n }\n }\n return selector.length === 0;\n}\n","import { selectorMatches } from './selectorMatches';\n\nexport function doesSomeParentMatch(\n element: HTMLElement | SVGElement,\n selectors: string[],\n) {\n let selector: string,\n parentMatching = true;\n while (\n element.parentElement &&\n element.parentElement.nodeType === 1 &&\n selectors.length\n ) {\n if (parentMatching) {\n selector = selectors.pop()!;\n }\n element = element.parentElement;\n parentMatching = selectorMatches(element, selector!);\n }\n return selectors.length === 0;\n}\n","import { selectorMatches } from './selectorMatches';\nimport { doesSomeParentMatch } from './doesSomeParentMatch';\n\n/**\n * @private\n */\n\nexport function elementMatchesRule(\n element: HTMLElement | SVGElement,\n selectors: string[],\n) {\n let parentMatching = true;\n // start from rightmost selector.\n const firstMatching = selectorMatches(element, selectors.pop()!);\n if (firstMatching && selectors.length) {\n parentMatching = doesSomeParentMatch(element, selectors);\n }\n return firstMatching && parentMatching && selectors.length === 0;\n}\n","import { elementMatchesRule } from './elementMatchesRule';\nimport type { CSSRules } from './typedefs';\n\n/**\n * @private\n */\n\nexport function getGlobalStylesForElement(\n element: HTMLElement | SVGElement,\n cssRules: CSSRules = {},\n) {\n let styles: Record = {};\n for (const rule in cssRules) {\n if (elementMatchesRule(element, rule.split(' '))) {\n styles = {\n ...styles,\n ...cssRules[rule],\n };\n }\n }\n return styles;\n}\n","import { attributesMap } from './constants';\n\nexport const normalizeAttr = (\n attr: keyof typeof attributesMap | string,\n): string => attributesMap[attr as keyof typeof attributesMap] ?? attr;\n","import { reNum } from '../../parser/constants';\n\nconst regex = new RegExp(`(${reNum})`, 'gi');\n\nexport const cleanupSvgAttribute = (attributeValue: string) =>\n attributeValue\n .replace(regex, ' $1 ')\n // replace annoying commas and arbitrary whitespace with single spaces\n .replace(/,/gi, ' ')\n .replace(/\\s+/gi, ' ');\n","import { ROTATE, SCALE, SKEW_X, SKEW_Y, iMatrix } from '../constants';\nimport { reNum } from './constants';\nimport type { TMat2D } from '../typedefs';\nimport { cleanupSvgAttribute } from '../util/internals/cleanupSvgAttribute';\nimport {\n createRotateMatrix,\n createScaleMatrix,\n createSkewXMatrix,\n createSkewYMatrix,\n createTranslateMatrix,\n multiplyTransformMatrixArray,\n} from '../util/misc/matrix';\n\n// == begin transform regexp\nconst p = `(${reNum})`;\nconst skewX = String.raw`(skewX)\\(${p}\\)`;\nconst skewY = String.raw`(skewY)\\(${p}\\)`;\nconst rotate = String.raw`(rotate)\\(${p}(?: ${p} ${p})?\\)`;\nconst scale = String.raw`(scale)\\(${p}(?: ${p})?\\)`;\nconst translate = String.raw`(translate)\\(${p}(?: ${p})?\\)`;\nconst matrix = String.raw`(matrix)\\(${p} ${p} ${p} ${p} ${p} ${p}\\)`;\nconst transform = `(?:${matrix}|${translate}|${rotate}|${scale}|${skewX}|${skewY})`;\nconst transforms = `(?:${transform}*)`;\nconst transformList = String.raw`^\\s*(?:${transforms}?)\\s*$`;\n// http://www.w3.org/TR/SVG/coords.html#TransformAttribute\nconst reTransformList = new RegExp(transformList);\nconst reTransform = new RegExp(transform);\nconst reTransformAll = new RegExp(transform, 'g');\n// == end transform regexp\n\n/**\n * Parses \"transform\" attribute, returning an array of values\n * @static\n * @function\n * @param {String} attributeValue String containing attribute value\n * @return {TTransformMatrix} Array of 6 elements representing transformation matrix\n */\nexport function parseTransformAttribute(attributeValue: string): TMat2D {\n // first we clean the string\n attributeValue = cleanupSvgAttribute(attributeValue)\n // remove spaces around front parentheses\n .replace(/\\s*([()])\\s*/gi, '$1');\n\n // start with identity matrix\n const matrices: TMat2D[] = [];\n\n // return if no argument was given or\n // an argument does not match transform attribute regexp\n if (\n !attributeValue ||\n (attributeValue && !reTransformList.test(attributeValue))\n ) {\n return [...iMatrix];\n }\n\n for (const match of attributeValue.matchAll(reTransformAll)) {\n const transformMatch = reTransform.exec(match[0]);\n if (!transformMatch) {\n continue;\n }\n let matrix: TMat2D = iMatrix;\n const matchedParams = transformMatch.filter((m) => !!m);\n const [, operation, ...rawArgs] = matchedParams;\n const [arg0, arg1, arg2, arg3, arg4, arg5] = rawArgs.map((arg) =>\n parseFloat(arg),\n );\n\n switch (operation) {\n case 'translate':\n matrix = createTranslateMatrix(arg0, arg1);\n break;\n case ROTATE:\n matrix = createRotateMatrix({ angle: arg0 }, { x: arg1, y: arg2 });\n break;\n case SCALE:\n matrix = createScaleMatrix(arg0, arg1);\n break;\n case SKEW_X:\n matrix = createSkewXMatrix(arg0);\n break;\n case SKEW_Y:\n matrix = createSkewYMatrix(arg0);\n break;\n case 'matrix':\n matrix = [arg0, arg1, arg2, arg3, arg4, arg5];\n break;\n }\n\n // snapshot current matrix into matrices array\n matrices.push(matrix);\n }\n\n return multiplyTransformMatrixArray(matrices);\n}\n","import { multiplyTransformMatrices } from '../util/misc/matrix';\nimport { parseUnit } from '../util/misc/svgParsing';\nimport { parseTransformAttribute } from './parseTransformAttribute';\nimport { CENTER, LEFT, RIGHT, NONE, FILL, STROKE } from '../constants';\nimport { TEXT_DECORATION_THICKNESS } from '../shapes/Text/constants';\n\nexport function normalizeValue(\n attr: string,\n value: any,\n parentAttributes: Record,\n fontSize: number,\n): string | null | boolean | number[] | number {\n const isArray = Array.isArray(value);\n let parsed: number | number[];\n let ouputValue: string | null | boolean | number[] | number = value;\n if ((attr === FILL || attr === STROKE) && value === NONE) {\n ouputValue = '';\n } else if (attr === 'strokeUniform') {\n return value === 'non-scaling-stroke';\n } else if (attr === 'strokeDashArray') {\n if (value === NONE) {\n ouputValue = null;\n } else {\n ouputValue = value.replace(/,/g, ' ').split(/\\s+/).map(parseFloat);\n }\n } else if (attr === 'transformMatrix') {\n if (parentAttributes && parentAttributes.transformMatrix) {\n ouputValue = multiplyTransformMatrices(\n parentAttributes.transformMatrix,\n parseTransformAttribute(value),\n );\n } else {\n ouputValue = parseTransformAttribute(value);\n }\n } else if (attr === 'visible') {\n ouputValue = value !== NONE && value !== 'hidden';\n // display=none on parent element always takes precedence over child element\n if (parentAttributes && parentAttributes.visible === false) {\n ouputValue = false;\n }\n } else if (attr === 'opacity') {\n ouputValue = parseFloat(value);\n if (parentAttributes && typeof parentAttributes.opacity !== 'undefined') {\n ouputValue *= parentAttributes.opacity as number;\n }\n } else if (attr === 'textAnchor' /* text-anchor */) {\n ouputValue = value === 'start' ? LEFT : value === 'end' ? RIGHT : CENTER;\n } else if (attr === 'charSpacing' || attr === TEXT_DECORATION_THICKNESS) {\n // parseUnit returns px and we convert it to em\n parsed = (parseUnit(value, fontSize) / fontSize) * 1000;\n } else if (attr === 'paintFirst') {\n const fillIndex = value.indexOf(FILL);\n const strokeIndex = value.indexOf(STROKE);\n ouputValue = FILL;\n if (fillIndex > -1 && strokeIndex > -1 && strokeIndex < fillIndex) {\n ouputValue = STROKE;\n } else if (fillIndex === -1 && strokeIndex > -1) {\n ouputValue = STROKE;\n }\n } else if (\n attr === 'href' ||\n attr === 'xlink:href' ||\n attr === 'font' ||\n attr === 'id'\n ) {\n return value;\n } else if (attr === 'imageSmoothing') {\n return value === 'optimizeQuality';\n } else {\n parsed = isArray\n ? (value as string[]).map(parseUnit)\n : parseUnit(value, fontSize);\n }\n\n return !isArray && isNaN(parsed! as number) ? ouputValue : parsed!;\n}\n","import { parseUnit } from '../util/misc/svgParsing';\nimport { reFontDeclaration } from './constants';\n\n/**\n * Parses a short font declaration, building adding its properties to a style object\n * @static\n * @function\n * @param {String} value font declaration\n * @param {Object} oStyle definition\n */\nexport function parseFontDeclaration(\n value: string,\n oStyle: Record,\n): void {\n const match = value.match(reFontDeclaration);\n\n if (!match) {\n return;\n }\n const fontStyle = match[1],\n // font variant is not used\n // fontVariant = match[2],\n fontWeight = match[3],\n fontSize = match[4],\n lineHeight = match[5],\n fontFamily = match[6];\n\n if (fontStyle) {\n oStyle.fontStyle = fontStyle;\n }\n if (fontWeight) {\n oStyle.fontWeight = isNaN(parseFloat(fontWeight))\n ? fontWeight\n : parseFloat(fontWeight);\n }\n if (fontSize) {\n oStyle.fontSize = parseUnit(fontSize);\n }\n if (fontFamily) {\n oStyle.fontFamily = fontFamily;\n }\n if (lineHeight) {\n oStyle.lineHeight = lineHeight === 'normal' ? 1 : lineHeight;\n }\n}\n","/**\n * Takes a style object and parses it in one that has only defined values\n * and lowercases properties\n * @param style\n * @param oStyle\n */\nexport function parseStyleObject(\n style: Record,\n oStyle: Record,\n): void {\n Object.entries(style).forEach(([prop, value]) => {\n if (value === undefined) {\n return;\n }\n oStyle[prop.toLowerCase()] = value;\n });\n}\n","/**\n * Takes a style string and parses it in one that has only defined values\n * and lowercases properties\n * @param style\n * @param oStyle\n */\nexport function parseStyleString(\n style: string,\n oStyle: Record,\n): void {\n style\n .replace(/;\\s*$/, '')\n .split(';')\n .forEach((chunk) => {\n if (!chunk) return;\n const [attr, value] = chunk.split(':');\n oStyle[attr.trim().toLowerCase()] = value.trim();\n });\n}\n","import { parseStyleObject } from './parseStyleObject';\nimport { parseStyleString } from './parseStyleString';\n\n/**\n * Parses \"style\" attribute, retuning an object with values\n * @static\n * @param {SVGElement} element Element to parse\n * @return {Object} Objects with values parsed from style attribute of an element\n */\nexport function parseStyleAttribute(\n element: HTMLElement | SVGElement,\n): Record {\n const oStyle: Record = {},\n style = element.getAttribute('style');\n\n if (!style) {\n return oStyle;\n }\n\n if (typeof style === 'string') {\n parseStyleString(style, oStyle);\n } else {\n parseStyleObject(style, oStyle);\n }\n\n return oStyle;\n}\n","import { Color } from '../color/Color';\nimport { toFixed } from '../util/misc/toFixed';\nimport { FabricObject } from '../shapes/Object/FabricObject';\n\nconst colorAttributesMap = {\n stroke: 'strokeOpacity',\n fill: 'fillOpacity',\n};\n\n/**\n * @private\n * @param {Object} attributes Array of attributes to parse\n */\n\nexport function setStrokeFillOpacity(\n attributes: Record,\n): Record {\n const defaults = FabricObject.getDefaults();\n Object.entries(colorAttributesMap).forEach(([attr, colorAttr]) => {\n if (\n typeof attributes[colorAttr] === 'undefined' ||\n attributes[attr] === ''\n ) {\n return;\n }\n if (typeof attributes[attr] === 'undefined') {\n if (!defaults[attr]) {\n return;\n }\n attributes[attr] = defaults[attr];\n }\n if (attributes[attr].indexOf('url(') === 0) {\n return;\n }\n const color = new Color(attributes[attr]);\n attributes[attr] = color\n .setAlpha(toFixed(color.getAlpha() * attributes[colorAttr], 2))\n .toRgba();\n });\n return attributes;\n}\n","import { DEFAULT_SVG_FONT_SIZE } from '../constants';\nimport { parseUnit } from '../util/misc/svgParsing';\nimport { cPath, fSize, svgValidParentsRegEx } from './constants';\nimport { getGlobalStylesForElement } from './getGlobalStylesForElement';\nimport { normalizeAttr } from './normalizeAttr';\nimport { normalizeValue } from './normalizeValue';\nimport { parseFontDeclaration } from './parseFontDeclaration';\nimport { parseStyleAttribute } from './parseStyleAttribute';\nimport { setStrokeFillOpacity } from './setStrokeFillOpacity';\nimport type { CSSRules } from './typedefs';\n\n/**\n * Returns an object of attributes' name/value, given element and an array of attribute names;\n * Parses parent \"g\" nodes recursively upwards.\n * @param {SVGElement | HTMLElement} element Element to parse\n * @param {Array} attributes Array of attributes to parse\n * @return {Object} object containing parsed attributes' names/values\n */\nexport function parseAttributes(\n element: HTMLElement | SVGElement | null,\n attributes: string[],\n cssRules?: CSSRules,\n): Record {\n if (!element) {\n return {};\n }\n\n let parentAttributes: Record = {},\n fontSize: number,\n parentFontSize = DEFAULT_SVG_FONT_SIZE;\n\n // if there's a parent container (`g` or `a` or `symbol` node), parse its attributes recursively upwards\n if (\n element.parentNode &&\n svgValidParentsRegEx.test(element.parentNode.nodeName)\n ) {\n parentAttributes = parseAttributes(\n element.parentElement,\n attributes,\n cssRules,\n );\n if (parentAttributes.fontSize) {\n fontSize = parentFontSize = parseUnit(parentAttributes.fontSize);\n }\n }\n\n const ownAttributes: Record = {\n ...attributes.reduce>((memo, attr) => {\n const value = element.getAttribute(attr);\n if (value) {\n memo[attr] = value;\n }\n return memo;\n }, {}),\n // add values parsed from style, which take precedence over attributes\n // (see: http://www.w3.org/TR/SVG/styling.html#UsingPresentationAttributes)\n ...getGlobalStylesForElement(element, cssRules),\n ...parseStyleAttribute(element),\n };\n\n if (ownAttributes[cPath]) {\n element.setAttribute(cPath, ownAttributes[cPath]);\n }\n if (ownAttributes[fSize]) {\n // looks like the minimum should be 9px when dealing with ems. this is what looks like in browsers.\n fontSize = parseUnit(ownAttributes[fSize], parentFontSize);\n ownAttributes[fSize] = `${fontSize}`;\n }\n\n // this should have its own complex type\n const normalizedStyle: Record<\n string,\n string | boolean | number | number[] | null\n > = {};\n for (const attr in ownAttributes) {\n const normalizedAttr = normalizeAttr(attr);\n const normalizedValue = normalizeValue(\n normalizedAttr,\n ownAttributes[attr],\n parentAttributes,\n fontSize!,\n );\n normalizedStyle[normalizedAttr] = normalizedValue;\n }\n if (normalizedStyle && normalizedStyle.font) {\n parseFontDeclaration(normalizedStyle.font as string, normalizedStyle);\n }\n const mergedAttrs = { ...parentAttributes, ...normalizedStyle };\n return svgValidParentsRegEx.test(element.nodeName)\n ? mergedAttrs\n : setStrokeFillOpacity(mergedAttrs);\n}\n","import { kRect } from '../constants';\nimport { SHARED_ATTRIBUTES } from '../parser/attributes';\nimport { parseAttributes } from '../parser/parseAttributes';\nimport type { Abortable, TClassProperties, TOptions } from '../typedefs';\nimport { classRegistry } from '../ClassRegistry';\nimport { FabricObject, cacheProperties } from './Object/FabricObject';\nimport type { FabricObjectProps, SerializedObjectProps } from './Object/types';\nimport type { ObjectEvents } from '../EventTypeDefs';\nimport type { CSSRules } from '../parser/typedefs';\n\nexport const rectDefaultValues: Partial> = {\n rx: 0,\n ry: 0,\n};\n\ninterface UniqueRectProps {\n rx: number;\n ry: number;\n}\n\nexport interface SerializedRectProps\n extends SerializedObjectProps,\n UniqueRectProps {}\n\nexport interface RectProps extends FabricObjectProps, UniqueRectProps {}\n\nconst RECT_PROPS = ['rx', 'ry'] as const;\n\nexport class Rect<\n Props extends TOptions = Partial,\n SProps extends SerializedRectProps = SerializedRectProps,\n EventSpec extends ObjectEvents = ObjectEvents,\n >\n extends FabricObject\n implements RectProps\n{\n /**\n * Horizontal border radius\n * @type Number\n */\n declare rx: number;\n\n /**\n * Vertical border radius\n * @type Number\n */\n declare ry: number;\n\n static type = 'Rect';\n\n static cacheProperties = [...cacheProperties, ...RECT_PROPS];\n\n static ownDefaults = rectDefaultValues;\n\n static getDefaults(): Record {\n return {\n ...super.getDefaults(),\n ...Rect.ownDefaults,\n };\n }\n\n /**\n * Constructor\n * @param {Object} [options] Options object\n */\n constructor(options?: Props) {\n super();\n Object.assign(this, Rect.ownDefaults);\n this.setOptions(options);\n this._initRxRy();\n }\n /**\n * Initializes rx/ry attributes\n * @private\n */\n _initRxRy() {\n const { rx, ry } = this;\n if (rx && !ry) {\n this.ry = rx;\n } else if (ry && !rx) {\n this.rx = ry;\n }\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _render(ctx: CanvasRenderingContext2D) {\n const { width: w, height: h } = this;\n const x = -w / 2;\n const y = -h / 2;\n const rx = this.rx ? Math.min(this.rx, w / 2) : 0;\n const ry = this.ry ? Math.min(this.ry, h / 2) : 0;\n const isRounded = rx !== 0 || ry !== 0;\n\n ctx.beginPath();\n\n ctx.moveTo(x + rx, y);\n\n ctx.lineTo(x + w - rx, y);\n isRounded &&\n ctx.bezierCurveTo(\n x + w - kRect * rx,\n y,\n x + w,\n y + kRect * ry,\n x + w,\n y + ry,\n );\n\n ctx.lineTo(x + w, y + h - ry);\n isRounded &&\n ctx.bezierCurveTo(\n x + w,\n y + h - kRect * ry,\n x + w - kRect * rx,\n y + h,\n x + w - rx,\n y + h,\n );\n\n ctx.lineTo(x + rx, y + h);\n isRounded &&\n ctx.bezierCurveTo(\n x + kRect * rx,\n y + h,\n x,\n y + h - kRect * ry,\n x,\n y + h - ry,\n );\n\n ctx.lineTo(x, y + ry);\n isRounded &&\n ctx.bezierCurveTo(x, y + kRect * ry, x + kRect * rx, y, x + rx, y);\n\n ctx.closePath();\n\n this._renderPaintInOrder(ctx);\n }\n\n /**\n * Returns object representation of an instance\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} object representation of an instance\n */\n toObject<\n T extends Omit, keyof SProps>,\n K extends keyof T = never,\n >(propertiesToInclude: K[] = []): Pick & SProps {\n return super.toObject([...RECT_PROPS, ...propertiesToInclude]);\n }\n\n /**\n * Returns svg representation of an instance\n * @return {Array} an array of strings with the specific svg representation\n * of the instance\n */\n _toSVG() {\n const { width, height, rx, ry } = this;\n return [\n '\\n`,\n ];\n }\n\n /**\n * List of attribute names to account for when parsing SVG element (used by `Rect.fromElement`)\n * @see: http://www.w3.org/TR/SVG/shapes.html#RectElement\n */\n static ATTRIBUTE_NAMES = [\n ...SHARED_ATTRIBUTES,\n 'x',\n 'y',\n 'rx',\n 'ry',\n 'width',\n 'height',\n ];\n\n /* _FROM_SVG_START_ */\n\n /**\n * Returns {@link Rect} instance from an SVG element\n * @param {HTMLElement} element Element to parse\n * @param {Object} [options] Options object\n */\n static async fromElement(\n element: HTMLElement | SVGElement,\n options?: Abortable,\n cssRules?: CSSRules,\n ) {\n const {\n left = 0,\n top = 0,\n width = 0,\n height = 0,\n visible = true,\n ...restOfparsedAttributes\n } = parseAttributes(element, this.ATTRIBUTE_NAMES, cssRules);\n\n return new this({\n ...options,\n ...restOfparsedAttributes,\n left,\n top,\n width,\n height,\n visible: Boolean(visible && width && height),\n });\n }\n\n /* _FROM_SVG_END_ */\n}\n\nclassRegistry.setClass(Rect);\nclassRegistry.setSVGClass(Rect);\n","export const LAYOUT_TYPE_INITIALIZATION = 'initialization';\nexport const LAYOUT_TYPE_ADDED = 'added';\nexport const LAYOUT_TYPE_REMOVED = 'removed';\nexport const LAYOUT_TYPE_IMPERATIVE = 'imperative';\nexport const LAYOUT_TYPE_OBJECT_MODIFIED = 'object_modified';\nexport const LAYOUT_TYPE_OBJECT_MODIFYING = 'object_modifying';\n","import { Point, ZERO } from '../../Point';\nimport type { Group } from '../../shapes/Group';\nimport type { FabricObject } from '../../shapes/Object/FabricObject';\nimport { multiplyTransformMatrixArray } from '../../util/misc/matrix';\nimport { sizeAfterTransform } from '../../util/misc/objectTransforms';\nimport {\n calcPlaneChangeMatrix,\n sendVectorToPlane,\n} from '../../util/misc/planeChange';\n\n/**\n * @returns 2 points, the tl and br corners of the non rotated bounding box of an object\n * in the {@link group} plane, taking into account objects that {@link group} is their parent\n * but also belong to the active selection.\n */\nexport const getObjectBounds = (\n destinationGroup: Group,\n object: FabricObject,\n): Point[] => {\n const {\n strokeUniform,\n strokeWidth,\n width,\n height,\n group: currentGroup,\n } = object;\n const t =\n currentGroup && currentGroup !== destinationGroup\n ? calcPlaneChangeMatrix(\n currentGroup.calcTransformMatrix(),\n destinationGroup.calcTransformMatrix(),\n )\n : null;\n const objectCenter = t\n ? object.getRelativeCenterPoint().transform(t)\n : object.getRelativeCenterPoint();\n const accountForStroke = !object['isStrokeAccountedForInDimensions']();\n const strokeUniformVector =\n strokeUniform && accountForStroke\n ? sendVectorToPlane(\n new Point(strokeWidth, strokeWidth),\n undefined,\n destinationGroup.calcTransformMatrix(),\n )\n : ZERO;\n const scalingStrokeWidth =\n !strokeUniform && accountForStroke ? strokeWidth : 0;\n const sizeVector = sizeAfterTransform(\n width + scalingStrokeWidth,\n height + scalingStrokeWidth,\n multiplyTransformMatrixArray([t, object.calcOwnMatrix()], true),\n )\n .add(strokeUniformVector)\n .scalarDivide(2);\n return [objectCenter.subtract(sizeVector), objectCenter.add(sizeVector)];\n};\n","import { Point } from '../../Point';\nimport type { FabricObject } from '../../shapes/Object/FabricObject';\nimport { makeBoundingBoxFromPoints } from '../../util/misc/boundingBoxFromPoints';\nimport {\n LAYOUT_TYPE_INITIALIZATION,\n LAYOUT_TYPE_IMPERATIVE,\n} from '../constants';\nimport type {\n InitializationLayoutContext,\n LayoutStrategyResult,\n StrictLayoutContext,\n} from '../types';\nimport { getObjectBounds } from './utils';\n\n/**\n * Exposes a main public method {@link calcLayoutResult} that is used by the `LayoutManager` to perform layout.\n * Returning `undefined` signals the `LayoutManager` to skip the layout.\n *\n * In charge of calculating the bounding box of the passed objects.\n */\nexport abstract class LayoutStrategy {\n /**\n * override by subclass for persistence (TS does not support `static abstract`)\n */\n static type = 'strategy';\n\n /**\n * Used by the `LayoutManager` to perform layout\n * @TODO/fix: if this method is calcResult, should calc unconditionally.\n * the condition to not calc should be evaluated by the layoutManager.\n * @returns layout result **OR** `undefined` to skip layout\n */\n public calcLayoutResult(\n context: StrictLayoutContext,\n objects: FabricObject[],\n ): LayoutStrategyResult | undefined {\n if (this.shouldPerformLayout(context)) {\n return this.calcBoundingBox(objects, context);\n }\n }\n\n shouldPerformLayout({ type, prevStrategy, strategy }: StrictLayoutContext) {\n return (\n type === LAYOUT_TYPE_INITIALIZATION ||\n type === LAYOUT_TYPE_IMPERATIVE ||\n (!!prevStrategy && strategy !== prevStrategy)\n );\n }\n\n shouldLayoutClipPath({ type, target: { clipPath } }: StrictLayoutContext) {\n return (\n type !== LAYOUT_TYPE_INITIALIZATION &&\n clipPath &&\n !clipPath.absolutePositioned\n );\n }\n\n getInitialSize(\n context: StrictLayoutContext & InitializationLayoutContext,\n result: Pick,\n ) {\n return result.size;\n }\n\n /**\n * Override this method to customize layout.\n */\n calcBoundingBox(\n objects: FabricObject[],\n context: StrictLayoutContext,\n ): LayoutStrategyResult | undefined {\n const { type, target } = context;\n if (type === LAYOUT_TYPE_IMPERATIVE && context.overrides) {\n return context.overrides;\n }\n if (objects.length === 0) {\n return;\n }\n const { left, top, width, height } = makeBoundingBoxFromPoints(\n objects\n .map((object) => getObjectBounds(target, object))\n .reduce((coords, curr) => coords.concat(curr), []),\n );\n const bboxSize = new Point(width, height);\n const bboxLeftTop = new Point(left, top);\n const bboxCenter = bboxLeftTop.add(bboxSize.scalarDivide(2));\n\n if (type === LAYOUT_TYPE_INITIALIZATION) {\n const actualSize = this.getInitialSize(context, {\n size: bboxSize,\n center: bboxCenter,\n });\n return {\n // in `initialization` we do not account for target's transformation matrix\n center: bboxCenter,\n // TODO: investigate if this is still necessary\n relativeCorrection: new Point(0, 0),\n size: actualSize,\n };\n } else {\n // we send `relativeCenter` up to group's containing plane\n const center = bboxCenter.transform(target.calcOwnMatrix());\n return {\n center,\n size: bboxSize,\n };\n }\n }\n}\n","import type { StrictLayoutContext } from '../types';\nimport { LayoutStrategy } from './LayoutStrategy';\nimport { classRegistry } from '../../ClassRegistry';\n\n/**\n * Layout will adjust the bounding box to fit target's objects.\n */\nexport class FitContentLayout extends LayoutStrategy {\n static readonly type = 'fit-content';\n\n /**\n * @override layout on all triggers\n * Override at will\n */\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n shouldPerformLayout(context: StrictLayoutContext) {\n return true;\n }\n}\n\nclassRegistry.setClass(FitContentLayout);\n","import { Point } from '../Point';\nimport {\n CENTER,\n CHANGED,\n MODIFIED,\n MODIFY_PATH,\n MODIFY_POLY,\n MOVING,\n RESIZING,\n ROTATING,\n SCALING,\n SKEWING,\n iMatrix,\n} from '../constants';\nimport type { Group } from '../shapes/Group';\nimport type { FabricObject } from '../shapes/Object/FabricObject';\nimport { invertTransform } from '../util/misc/matrix';\nimport { resolveOrigin } from '../util/misc/resolveOrigin';\nimport { FitContentLayout } from './LayoutStrategies/FitContentLayout';\nimport type { LayoutStrategy } from './LayoutStrategies/LayoutStrategy';\nimport {\n LAYOUT_TYPE_INITIALIZATION,\n LAYOUT_TYPE_ADDED,\n LAYOUT_TYPE_REMOVED,\n LAYOUT_TYPE_IMPERATIVE,\n LAYOUT_TYPE_OBJECT_MODIFIED,\n LAYOUT_TYPE_OBJECT_MODIFYING,\n} from './constants';\nimport type {\n LayoutContext,\n LayoutResult,\n RegistrationContext,\n StrictLayoutContext,\n} from './types';\nimport { classRegistry } from '../ClassRegistry';\nimport type { TModificationEvents } from '../EventTypeDefs';\n\nconst LAYOUT_MANAGER = 'layoutManager';\n\nexport type SerializedLayoutManager = {\n type: string;\n strategy: string;\n};\n\nexport class LayoutManager {\n declare private _prevLayoutStrategy?: LayoutStrategy;\n declare protected _subscriptions: Map;\n\n strategy: LayoutStrategy;\n\n constructor(strategy: LayoutStrategy = new FitContentLayout()) {\n this.strategy = strategy;\n this._subscriptions = new Map();\n }\n\n public performLayout(context: LayoutContext) {\n const strictContext: StrictLayoutContext = {\n bubbles: true,\n strategy: this.strategy,\n ...context,\n prevStrategy: this._prevLayoutStrategy,\n stopPropagation() {\n this.bubbles = false;\n },\n };\n\n this.onBeforeLayout(strictContext);\n\n const layoutResult = this.getLayoutResult(strictContext);\n if (layoutResult) {\n this.commitLayout(strictContext, layoutResult);\n }\n\n this.onAfterLayout(strictContext, layoutResult);\n this._prevLayoutStrategy = strictContext.strategy;\n }\n\n /**\n * Attach handlers for events that we know will invalidate the layout when\n * performed on child objects ( general transforms ).\n * Returns the disposers for later unsubscribing and cleanup\n * @param {FabricObject} object\n * @param {RegistrationContext & Partial} context\n * @returns {VoidFunction[]} disposers remove the handlers\n */\n protected attachHandlers(\n object: FabricObject,\n context: RegistrationContext & Partial,\n ): VoidFunction[] {\n const { target } = context;\n return (\n [\n MODIFIED,\n MOVING,\n RESIZING,\n ROTATING,\n SCALING,\n SKEWING,\n CHANGED,\n MODIFY_POLY,\n MODIFY_PATH,\n ] as (TModificationEvents & 'modified')[]\n ).map((key) =>\n object.on(key, (e) =>\n this.performLayout(\n key === MODIFIED\n ? {\n type: LAYOUT_TYPE_OBJECT_MODIFIED,\n trigger: key,\n e,\n target,\n }\n : {\n type: LAYOUT_TYPE_OBJECT_MODIFYING,\n trigger: key,\n e,\n target,\n },\n ),\n ),\n );\n }\n\n /**\n * Subscribe an object to transform events that will trigger a layout change on the parent\n * This is important only for interactive groups.\n * @param object\n * @param context\n */\n protected subscribe(\n object: FabricObject,\n context: RegistrationContext & Partial,\n ) {\n this.unsubscribe(object, context);\n const disposers = this.attachHandlers(object, context);\n this._subscriptions.set(object, disposers);\n }\n\n /**\n * unsubscribe object layout triggers\n */\n protected unsubscribe(\n object: FabricObject,\n _context?: RegistrationContext & Partial,\n ) {\n (this._subscriptions.get(object) || []).forEach((d) => d());\n this._subscriptions.delete(object);\n }\n\n unsubscribeTargets(\n context: RegistrationContext & Partial,\n ) {\n context.targets.forEach((object) => this.unsubscribe(object, context));\n }\n\n subscribeTargets(\n context: RegistrationContext & Partial,\n ) {\n context.targets.forEach((object) => this.subscribe(object, context));\n }\n\n protected onBeforeLayout(context: StrictLayoutContext) {\n const { target, type } = context;\n const { canvas } = target;\n // handle layout triggers subscription\n // @TODO: gate the registration when the group is interactive\n if (type === LAYOUT_TYPE_INITIALIZATION || type === LAYOUT_TYPE_ADDED) {\n this.subscribeTargets(context);\n } else if (type === LAYOUT_TYPE_REMOVED) {\n this.unsubscribeTargets(context);\n }\n // fire layout event (event will fire only for layouts after initialization layout)\n target.fire('layout:before', {\n context,\n });\n canvas &&\n canvas.fire('object:layout:before', {\n target,\n context,\n });\n\n if (type === LAYOUT_TYPE_IMPERATIVE && context.deep) {\n const { strategy: _, ...tricklingContext } = context;\n // traverse the tree\n target.forEachObject(\n (object) =>\n (object as Group).layoutManager &&\n (object as Group).layoutManager.performLayout({\n ...tricklingContext,\n bubbles: false,\n target: object as Group,\n }),\n );\n }\n }\n\n protected getLayoutResult(\n context: StrictLayoutContext,\n ): Required | undefined {\n const { target, strategy, type } = context;\n\n const result = strategy.calcLayoutResult(context, target.getObjects());\n\n if (!result) {\n return;\n }\n\n const prevCenter =\n type === LAYOUT_TYPE_INITIALIZATION\n ? new Point()\n : target.getRelativeCenterPoint();\n\n const {\n center: nextCenter,\n correction = new Point(),\n relativeCorrection = new Point(),\n } = result;\n const offset = prevCenter\n .subtract(nextCenter)\n .add(correction)\n .transform(\n // in `initialization` we do not account for target's transformation matrix\n type === LAYOUT_TYPE_INITIALIZATION\n ? iMatrix\n : invertTransform(target.calcOwnMatrix()),\n true,\n )\n .add(relativeCorrection);\n\n return {\n result,\n prevCenter,\n nextCenter,\n offset,\n };\n }\n\n protected commitLayout(\n context: StrictLayoutContext,\n layoutResult: Required,\n ) {\n const { target } = context;\n const {\n result: { size },\n nextCenter,\n } = layoutResult;\n // set dimensions\n target.set({ width: size.x, height: size.y });\n // layout descendants\n this.layoutObjects(context, layoutResult);\n // set position\n // in `initialization` we do not account for target's transformation matrix\n if (context.type === LAYOUT_TYPE_INITIALIZATION) {\n // TODO: what about strokeWidth?\n target.set({\n left:\n context.x ?? nextCenter.x + size.x * resolveOrigin(target.originX),\n top: context.y ?? nextCenter.y + size.y * resolveOrigin(target.originY),\n });\n } else {\n target.setPositionByOrigin(nextCenter, CENTER, CENTER);\n // invalidate\n target.setCoords();\n target.set('dirty', true);\n }\n }\n\n protected layoutObjects(\n context: StrictLayoutContext,\n layoutResult: Required,\n ) {\n const { target } = context;\n // adjust objects to account for new center\n target.forEachObject((object) => {\n object.group === target &&\n this.layoutObject(context, layoutResult, object);\n });\n // adjust clip path to account for new center\n context.strategy.shouldLayoutClipPath(context) &&\n this.layoutObject(context, layoutResult, target.clipPath as FabricObject);\n }\n\n /**\n * @param {FabricObject} object\n * @param {Point} offset\n */\n protected layoutObject(\n context: StrictLayoutContext,\n { offset }: Required,\n object: FabricObject,\n ) {\n // TODO: this is here for cache invalidation.\n // verify if this is necessary since we have explicit\n // cache invalidation at the end of commitLayout\n object.set({\n left: object.left + offset.x,\n top: object.top + offset.y,\n });\n }\n\n protected onAfterLayout(\n context: StrictLayoutContext,\n layoutResult?: LayoutResult,\n ) {\n const {\n target,\n strategy,\n bubbles,\n prevStrategy: _,\n ...bubblingContext\n } = context;\n const { canvas } = target;\n\n // fire layout event (event will fire only for layouts after initialization layout)\n target.fire('layout:after', {\n context,\n result: layoutResult,\n });\n canvas &&\n canvas.fire('object:layout:after', {\n context,\n result: layoutResult,\n target,\n });\n\n // bubble\n const parent = target.parent;\n if (bubbles && parent?.layoutManager) {\n // add target to context#path\n (bubblingContext.path || (bubblingContext.path = [])).push(target);\n // all parents should invalidate their layout\n parent.layoutManager.performLayout({\n ...bubblingContext,\n target: parent,\n });\n }\n target.set('dirty', true);\n }\n\n dispose() {\n const { _subscriptions } = this;\n _subscriptions.forEach((disposers) => disposers.forEach((d) => d()));\n _subscriptions.clear();\n }\n\n toObject() {\n return {\n type: LAYOUT_MANAGER,\n strategy: (this.strategy.constructor as typeof LayoutStrategy).type,\n };\n }\n\n toJSON() {\n return this.toObject();\n }\n}\n\nclassRegistry.setClass(LayoutManager, LAYOUT_MANAGER);\n","import type { CollectionEvents, ObjectEvents } from '../EventTypeDefs';\nimport { createCollectionMixin } from '../Collection';\nimport type {\n TClassProperties,\n TSVGReviver,\n TOptions,\n Abortable,\n} from '../typedefs';\nimport {\n invertTransform,\n multiplyTransformMatrices,\n} from '../util/misc/matrix';\nimport {\n enlivenObjectEnlivables,\n enlivenObjects,\n} from '../util/misc/objectEnlive';\nimport { applyTransformToObject } from '../util/misc/objectTransforms';\nimport { FabricObject } from './Object/FabricObject';\nimport { Rect } from './Rect';\nimport { classRegistry } from '../ClassRegistry';\nimport type { FabricObjectProps, SerializedObjectProps } from './Object/types';\nimport { log } from '../util/internals/console';\nimport type {\n ImperativeLayoutOptions,\n LayoutBeforeEvent,\n LayoutAfterEvent,\n} from '../LayoutManager/types';\nimport { LayoutManager } from '../LayoutManager/LayoutManager';\nimport {\n LAYOUT_TYPE_ADDED,\n LAYOUT_TYPE_IMPERATIVE,\n LAYOUT_TYPE_INITIALIZATION,\n LAYOUT_TYPE_REMOVED,\n} from '../LayoutManager/constants';\nimport type { SerializedLayoutManager } from '../LayoutManager/LayoutManager';\nimport type { FitContentLayout } from '../LayoutManager';\nimport type { DrawContext } from './Object/Object';\n\n/**\n * This class handles the specific case of creating a group using {@link Group#fromObject} and is not meant to be used in any other case.\n * We could have used a boolean in the constructor, as we did previously, but we think the boolean\n * would stay in the group's constructor interface and create confusion, therefore it was removed.\n * This layout manager doesn't do anything and therefore keeps the exact layout the group had when {@link Group#toObject} was called.\n */\nclass NoopLayoutManager extends LayoutManager {\n performLayout() {}\n}\n\nexport interface GroupEvents extends ObjectEvents, CollectionEvents {\n 'layout:before': LayoutBeforeEvent;\n 'layout:after': LayoutAfterEvent;\n}\n\nexport interface GroupOwnProps {\n subTargetCheck: boolean;\n interactive: boolean;\n}\n\nexport interface SerializedGroupProps\n extends SerializedObjectProps,\n GroupOwnProps {\n objects: SerializedObjectProps[];\n layoutManager: SerializedLayoutManager;\n}\n\nexport interface GroupProps extends FabricObjectProps, GroupOwnProps {\n layoutManager: LayoutManager;\n}\n\nexport const groupDefaultValues: Partial> = {\n strokeWidth: 0,\n subTargetCheck: false,\n interactive: false,\n};\n\n/**\n * @fires object:added\n * @fires object:removed\n * @fires layout:before\n * @fires layout:after\n */\nexport class Group\n extends createCollectionMixin(\n FabricObject,\n )\n implements GroupProps\n{\n /**\n * Used to optimize performance\n * set to `false` if you don't need contained objects to be targets of events\n * @type boolean\n */\n declare subTargetCheck: boolean;\n\n /**\n * Used to allow targeting of object inside groups.\n * set to true if you want to select an object inside a group.\\\n * **REQUIRES** `subTargetCheck` set to true\n * This will be not removed but slowly replaced with a method setInteractive\n * that will take care of enabling subTargetCheck and necessary object events.\n * There is too much attached to group interactivity to just be evaluated by a\n * boolean in the code\n * @deprecated\n * @type boolean\n */\n declare interactive: boolean;\n\n declare layoutManager: LayoutManager;\n\n /**\n * Used internally to optimize performance\n * Once an object is selected, instance is rendered without the selected object.\n * This way instance is cached only once for the entire interaction with the selected object.\n * @private\n */\n protected _activeObjects: FabricObject[] = [];\n\n static type = 'Group';\n\n static ownDefaults: Record = groupDefaultValues;\n private __objectSelectionTracker: (ev: ObjectEvents['selected']) => void;\n private __objectSelectionDisposer: (ev: ObjectEvents['deselected']) => void;\n\n static getDefaults(): Record {\n return {\n ...super.getDefaults(),\n ...Group.ownDefaults,\n };\n }\n\n /**\n * Constructor\n *\n * @param {FabricObject[]} [objects] instance objects\n * @param {Object} [options] Options object\n */\n constructor(objects: FabricObject[] = [], options: Partial = {}) {\n super();\n Object.assign(this, Group.ownDefaults);\n this.setOptions(options);\n this.groupInit(objects, options);\n }\n\n /**\n * Shared code between group and active selection\n * Meant to be used by the constructor.\n */\n protected groupInit(\n objects: FabricObject[],\n options: {\n layoutManager?: LayoutManager;\n top?: number;\n left?: number;\n },\n ) {\n this._objects = [...objects]; // Avoid unwanted mutations of Collection to affect the caller\n\n this.__objectSelectionTracker = this.__objectSelectionMonitor.bind(\n this,\n true,\n );\n this.__objectSelectionDisposer = this.__objectSelectionMonitor.bind(\n this,\n false,\n );\n\n this.forEachObject((object) => {\n this.enterGroup(object, false);\n });\n\n // perform initial layout\n this.layoutManager = options.layoutManager ?? new LayoutManager();\n this.layoutManager.performLayout({\n type: LAYOUT_TYPE_INITIALIZATION,\n target: this,\n targets: [...objects],\n // @TODO remove this concept from the layout manager.\n // Layout manager will calculate the correct position,\n // group options can override it later.\n x: options.left,\n y: options.top,\n });\n }\n\n /**\n * Checks if object can enter group and logs relevant warnings\n * @private\n * @param {FabricObject} object\n * @returns\n */\n canEnterGroup(object: FabricObject) {\n if (object === this || this.isDescendantOf(object)) {\n // prevent circular object tree\n log(\n 'error',\n 'Group: circular object trees are not supported, this call has no effect',\n );\n return false;\n } else if (this._objects.indexOf(object) !== -1) {\n // is already in the objects array\n log(\n 'error',\n 'Group: duplicate objects are not supported inside group, this call has no effect',\n );\n return false;\n }\n return true;\n }\n\n /**\n * Override this method to enhance performance (for groups with a lot of objects).\n * If Overriding, be sure not pass illegal objects to group - it will break your app.\n * @private\n */\n protected _filterObjectsBeforeEnteringGroup(objects: FabricObject[]) {\n return objects.filter((object, index, array) => {\n // can enter AND is the first occurrence of the object in the passed args (to prevent adding duplicates)\n return this.canEnterGroup(object) && array.indexOf(object) === index;\n });\n }\n\n /**\n * Add objects\n * @param {...FabricObject[]} objects\n */\n add(...objects: FabricObject[]) {\n const allowedObjects = this._filterObjectsBeforeEnteringGroup(objects);\n const size = super.add(...allowedObjects);\n this._onAfterObjectsChange(LAYOUT_TYPE_ADDED, allowedObjects);\n return size;\n }\n\n /**\n * Inserts an object into collection at specified index\n * @param {FabricObject[]} objects Object to insert\n * @param {Number} index Index to insert object at\n */\n insertAt(index: number, ...objects: FabricObject[]) {\n const allowedObjects = this._filterObjectsBeforeEnteringGroup(objects);\n const size = super.insertAt(index, ...allowedObjects);\n this._onAfterObjectsChange(LAYOUT_TYPE_ADDED, allowedObjects);\n return size;\n }\n\n /**\n * Remove objects\n * @param {...FabricObject[]} objects\n * @returns {FabricObject[]} removed objects\n */\n remove(...objects: FabricObject[]) {\n const removed = super.remove(...objects);\n this._onAfterObjectsChange(LAYOUT_TYPE_REMOVED, removed);\n return removed;\n }\n\n _onObjectAdded(object: FabricObject) {\n this.enterGroup(object, true);\n this.fire('object:added', { target: object });\n object.fire('added', { target: this });\n }\n\n /**\n * @private\n * @param {FabricObject} object\n * @param {boolean} [removeParentTransform] true if object should exit group without applying group's transform to it\n */\n _onObjectRemoved(object: FabricObject, removeParentTransform?: boolean) {\n this.exitGroup(object, removeParentTransform);\n this.fire('object:removed', { target: object });\n object.fire('removed', { target: this });\n }\n\n /**\n * @private\n * @param {'added'|'removed'} type\n * @param {FabricObject[]} targets\n */\n _onAfterObjectsChange(type: 'added' | 'removed', targets: FabricObject[]) {\n this.layoutManager.performLayout({\n type,\n targets,\n target: this,\n });\n }\n\n _onStackOrderChanged() {\n this._set('dirty', true);\n }\n\n /**\n * @private\n * @param {string} key\n * @param {*} value\n */\n _set(key: string, value: any) {\n const prev = this[key as keyof this];\n super._set(key, value);\n if (key === 'canvas' && prev !== value) {\n (this._objects || []).forEach((object) => {\n object._set(key, value);\n });\n }\n return this;\n }\n\n /**\n * @private\n */\n _shouldSetNestedCoords() {\n return this.subTargetCheck;\n }\n\n /**\n * Remove all objects\n * @returns {FabricObject[]} removed objects\n */\n removeAll() {\n this._activeObjects = [];\n return this.remove(...this._objects);\n }\n\n /**\n * keeps track of the selected objects\n * @private\n */\n __objectSelectionMonitor(\n selected: T,\n {\n target: object,\n }: ObjectEvents[T extends true ? 'selected' : 'deselected'],\n ) {\n const activeObjects = this._activeObjects;\n if (selected) {\n activeObjects.push(object);\n this._set('dirty', true);\n } else if (activeObjects.length > 0) {\n const index = activeObjects.indexOf(object);\n if (index > -1) {\n activeObjects.splice(index, 1);\n this._set('dirty', true);\n }\n }\n }\n\n /**\n * @private\n * @param {boolean} watch\n * @param {FabricObject} object\n */\n _watchObject(watch: boolean, object: FabricObject) {\n // make sure we listen only once\n watch && this._watchObject(false, object);\n if (watch) {\n object.on('selected', this.__objectSelectionTracker);\n object.on('deselected', this.__objectSelectionDisposer);\n } else {\n object.off('selected', this.__objectSelectionTracker);\n object.off('deselected', this.__objectSelectionDisposer);\n }\n }\n\n /**\n * @private\n * @param {FabricObject} object\n * @param {boolean} [removeParentTransform] true if object is in canvas coordinate plane\n */\n enterGroup(object: FabricObject, removeParentTransform?: boolean) {\n object.group && object.group.remove(object);\n object._set('parent', this);\n this._enterGroup(object, removeParentTransform);\n }\n\n /**\n * @private\n * @param {FabricObject} object\n * @param {boolean} [removeParentTransform] true if object is in canvas coordinate plane\n */\n _enterGroup(object: FabricObject, removeParentTransform?: boolean) {\n if (removeParentTransform) {\n // can this be converted to utils (sendObjectToPlane)?\n applyTransformToObject(\n object,\n multiplyTransformMatrices(\n invertTransform(this.calcTransformMatrix()),\n object.calcTransformMatrix(),\n ),\n );\n }\n this._shouldSetNestedCoords() && object.setCoords();\n object._set('group', this);\n object._set('canvas', this.canvas);\n this._watchObject(true, object);\n const activeObject =\n this.canvas &&\n this.canvas.getActiveObject &&\n this.canvas.getActiveObject();\n // if we are adding the activeObject in a group\n if (\n activeObject &&\n (activeObject === object || object.isDescendantOf(activeObject))\n ) {\n this._activeObjects.push(object);\n }\n }\n\n /**\n * @private\n * @param {FabricObject} object\n * @param {boolean} [removeParentTransform] true if object should exit group without applying group's transform to it\n */\n exitGroup(object: FabricObject, removeParentTransform?: boolean) {\n this._exitGroup(object, removeParentTransform);\n object._set('parent', undefined);\n object._set('canvas', undefined);\n }\n\n /**\n * Executes the inner fabric logic of exiting a group.\n * - Stop watching the object\n * - Remove the object from the optimization map this._activeObjects\n * - unset the group property of the object\n * @protected\n * @param {FabricObject} object\n * @param {boolean} [removeParentTransform] true if object should exit group without applying group's transform to it\n */\n _exitGroup(object: FabricObject, removeParentTransform?: boolean) {\n object._set('group', undefined);\n if (!removeParentTransform) {\n applyTransformToObject(\n object,\n multiplyTransformMatrices(\n this.calcTransformMatrix(),\n object.calcTransformMatrix(),\n ),\n );\n object.setCoords();\n }\n this._watchObject(false, object);\n const index =\n this._activeObjects.length > 0 ? this._activeObjects.indexOf(object) : -1;\n if (index > -1) {\n this._activeObjects.splice(index, 1);\n }\n }\n\n /**\n * Decide if the group should cache or not. Create its own cache level\n * needsItsOwnCache should be used when the object drawing method requires\n * a cache step.\n * Generally you do not cache objects in groups because the group is already cached.\n * @return {Boolean}\n */\n shouldCache() {\n const ownCache = FabricObject.prototype.shouldCache.call(this);\n if (ownCache) {\n for (let i = 0; i < this._objects.length; i++) {\n if (this._objects[i].willDrawShadow()) {\n this.ownCaching = false;\n return false;\n }\n }\n }\n return ownCache;\n }\n\n /**\n * Check if this object or a child object will cast a shadow\n * @return {Boolean}\n */\n willDrawShadow() {\n if (super.willDrawShadow()) {\n return true;\n }\n for (let i = 0; i < this._objects.length; i++) {\n if (this._objects[i].willDrawShadow()) {\n return true;\n }\n }\n return false;\n }\n\n /**\n * Check if instance or its group are caching, recursively up\n * @return {Boolean}\n */\n isOnACache(): boolean {\n return this.ownCaching || (!!this.parent && this.parent.isOnACache());\n }\n\n /**\n * Execute the drawing operation for an object on a specified context\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n drawObject(\n ctx: CanvasRenderingContext2D,\n forClipping: boolean | undefined,\n context: DrawContext,\n ) {\n this._renderBackground(ctx);\n for (let i = 0; i < this._objects.length; i++) {\n const obj = this._objects[i];\n // TODO: handle rendering edge case somehow\n if (this.canvas?.preserveObjectStacking && obj.group !== this) {\n ctx.save();\n ctx.transform(...invertTransform(this.calcTransformMatrix()));\n obj.render(ctx);\n ctx.restore();\n } else if (obj.group === this) {\n obj.render(ctx);\n }\n }\n this._drawClipPath(ctx, this.clipPath, context);\n }\n\n /**\n * @override\n * @return {Boolean}\n */\n setCoords() {\n super.setCoords();\n this._shouldSetNestedCoords() &&\n this.forEachObject((object) => object.setCoords());\n }\n\n triggerLayout(options: ImperativeLayoutOptions = {}) {\n this.layoutManager.performLayout({\n target: this,\n type: LAYOUT_TYPE_IMPERATIVE,\n ...options,\n });\n }\n\n /**\n * Renders instance on a given context\n * @param {CanvasRenderingContext2D} ctx context to render instance on\n */\n render(ctx: CanvasRenderingContext2D) {\n this._transformDone = true;\n super.render(ctx);\n this._transformDone = false;\n }\n\n /**\n *\n * @private\n * @param {'toObject'|'toDatalessObject'} [method]\n * @param {string[]} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @returns {FabricObject[]} serialized objects\n */\n __serializeObjects(\n method: 'toObject' | 'toDatalessObject',\n propertiesToInclude?: string[],\n ) {\n const _includeDefaultValues = this.includeDefaultValues;\n return this._objects\n .filter(function (obj) {\n return !obj.excludeFromExport;\n })\n .map(function (obj) {\n const originalDefaults = obj.includeDefaultValues;\n obj.includeDefaultValues = _includeDefaultValues;\n const data = obj[method || 'toObject'](propertiesToInclude);\n obj.includeDefaultValues = originalDefaults;\n // delete data.version;\n return data;\n });\n }\n\n /**\n * Returns object representation of an instance\n * @param {string[]} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} object representation of an instance\n */\n toObject<\n T extends Omit<\n GroupProps & TClassProperties,\n keyof SerializedGroupProps\n >,\n K extends keyof T = never,\n >(propertiesToInclude: K[] = []): Pick & SerializedGroupProps {\n const layoutManager = this.layoutManager.toObject();\n\n return {\n ...super.toObject([\n 'subTargetCheck',\n 'interactive',\n ...propertiesToInclude,\n ]),\n ...(layoutManager.strategy !== 'fit-content' || this.includeDefaultValues\n ? { layoutManager }\n : {}),\n objects: this.__serializeObjects(\n 'toObject',\n propertiesToInclude as string[],\n ),\n };\n }\n\n toString() {\n return `#`;\n }\n\n dispose() {\n this.layoutManager.unsubscribeTargets({\n targets: this.getObjects(),\n target: this,\n });\n this._activeObjects = [];\n this.forEachObject((object) => {\n this._watchObject(false, object);\n object.dispose();\n });\n super.dispose();\n }\n\n /**\n * @private\n */\n _createSVGBgRect(reviver?: TSVGReviver) {\n if (!this.backgroundColor) {\n return '';\n }\n const fillStroke = Rect.prototype._toSVG.call(this);\n const commons = fillStroke.indexOf('COMMON_PARTS');\n fillStroke[commons] = 'for=\"group\" ';\n const markup = fillStroke.join('');\n return reviver ? reviver(markup) : markup;\n }\n\n /**\n * Returns svg representation of an instance\n * @param {TSVGReviver} [reviver] Method for further parsing of svg representation.\n * @return {String} svg representation of an instance\n */\n _toSVG(reviver?: TSVGReviver) {\n const svgString = ['\\n'];\n const bg = this._createSVGBgRect(reviver);\n bg && svgString.push('\\t\\t', bg);\n for (let i = 0; i < this._objects.length; i++) {\n svgString.push('\\t\\t', this._objects[i].toSVG(reviver));\n }\n svgString.push('\\n');\n return svgString;\n }\n\n /**\n * Returns styles-string for svg-export, specific version for group\n * @return {String}\n */\n getSvgStyles(): string {\n const opacity =\n typeof this.opacity !== 'undefined' && this.opacity !== 1\n ? `opacity: ${this.opacity};`\n : '',\n visibility = this.visible ? '' : ' visibility: hidden;';\n return [opacity, this.getSvgFilter(), visibility].join('');\n }\n\n /**\n * Returns svg clipPath representation of an instance\n * @param {Function} [reviver] Method for further parsing of svg representation.\n * @return {String} svg representation of an instance\n */\n toClipPathSVG(reviver?: TSVGReviver): string {\n const svgString = [];\n const bg = this._createSVGBgRect(reviver);\n bg && svgString.push('\\t', bg);\n for (let i = 0; i < this._objects.length; i++) {\n svgString.push('\\t', this._objects[i].toClipPathSVG(reviver));\n }\n return this._createBaseClipPathSVGMarkup(svgString, {\n reviver,\n });\n }\n\n /**\n * @todo support loading from svg\n * @private\n * @param {Object} object Object to create a group from\n * @returns {Promise}\n */\n static fromObject>(\n { type, objects = [], layoutManager, ...options }: T,\n abortable?: Abortable,\n ) {\n return Promise.all([\n enlivenObjects(objects, abortable),\n enlivenObjectEnlivables(options, abortable),\n ]).then(([objects, hydratedOptions]) => {\n const group = new this(objects, {\n ...options,\n ...hydratedOptions,\n layoutManager: new NoopLayoutManager(),\n });\n if (layoutManager) {\n const layoutClass = classRegistry.getClass(\n layoutManager.type,\n );\n const strategyClass = classRegistry.getClass(\n layoutManager.strategy,\n );\n group.layoutManager = new layoutClass(new strategyClass());\n } else {\n group.layoutManager = new LayoutManager();\n }\n group.layoutManager.subscribeTargets({\n type: LAYOUT_TYPE_INITIALIZATION,\n target: group,\n targets: group.getObjects(),\n });\n group.setCoords();\n return group;\n });\n }\n}\n\nclassRegistry.setClass(Group);\n","import type { GroupProps } from '../../shapes/Group';\nimport { Group } from '../../shapes/Group';\nimport type { FabricObject } from '../../shapes/Object/FabricObject';\n\n/**\n * TODO experiment with different layout manager and svg results ( fixed fit content )\n * Groups SVG elements (usually those retrieved from SVG document)\n * @static\n * @param {FabricObject[]} elements FabricObject(s) parsed from svg, to group\n * @return {FabricObject | Group}\n */\nexport const groupSVGElements = (\n elements: FabricObject[],\n options?: Partial,\n) => {\n if (elements && elements.length === 1) {\n return elements[0];\n }\n return new Group(elements, options);\n};\n","import type { TSize } from '../../typedefs';\n\n/**\n * Finds the scale for the object source to fit inside the object destination,\n * keeping aspect ratio intact.\n * respect the total allowed area for the cache.\n * @param {TSize} source natural unscaled size of the object\n * @param {TSize} destination natural unscaled size of the object\n * @return {Number} scale factor to apply to source to fit into destination\n */\nexport const findScaleToFit = (source: TSize, destination: TSize) =>\n Math.min(\n destination.width / source.width,\n destination.height / source.height,\n );\n\n/**\n * Finds the scale for the object source to cover entirely the object destination,\n * keeping aspect ratio intact.\n * respect the total allowed area for the cache.\n * @param {TSize} source natural unscaled size of the object\n * @param {TSize} destination natural unscaled size of the object\n * @return {Number} scale factor to apply to source to cover destination\n */\nexport const findScaleToCover = (source: TSize, destination: TSize) =>\n Math.max(\n destination.width / source.width,\n destination.height / source.height,\n );\n","import { reNum } from '../../parser/constants';\n\nconst commaWsp = `\\\\s*,?\\\\s*`;\n\n/**\n * p for param\n * using \"bad naming\" here because it makes the regex much easier to read\n * p is a number that is preceded by an arbitary number of spaces, maybe 0,\n * a comma or not, and then possibly more spaces or not.\n */\nconst p = `${commaWsp}(${reNum})`;\n\n// const reMoveToCommand = `(M) ?(?:${p}${p} ?)+`;\n\n// const reLineCommand = `(L) ?(?:${p}${p} ?)+`;\n\n// const reHorizontalLineCommand = `(H) ?(?:${p} ?)+`;\n\n// const reVerticalLineCommand = `(V) ?(?:${p} ?)+`;\n\n// const reClosePathCommand = String.raw`(Z)\\s*`;\n\n// const reCubicCurveCommand = `(C) ?(?:${p}${p}${p}${p}${p}${p} ?)+`;\n\n// const reCubicCurveShortcutCommand = `(S) ?(?:${p}${p}${p}${p} ?)+`;\n\n// const reQuadraticCurveCommand = `(Q) ?(?:${p}${p}${p}${p} ?)+`;\n\n// const reQuadraticCurveShortcutCommand = `(T) ?(?:${p}${p} ?)+`;\n\nexport const reArcCommandPoints = `${p}${p}${p}${commaWsp}([01])${commaWsp}([01])${p}${p}`;\n// const reArcCommand = `(A) ?(?:${reArcCommandPoints} ?)+`;\n\n// export const rePathCommandGroups =\n// `(?:(?:${reMoveToCommand})` +\n// `|(?:${reLineCommand})` +\n// `|(?:${reHorizontalLineCommand})` +\n// `|(?:${reVerticalLineCommand})` +\n// `|(?:${reClosePathCommand})` +\n// `|(?:${reCubicCurveCommand})` +\n// `|(?:${reCubicCurveShortcutCommand})` +\n// `|(?:${reQuadraticCurveCommand})` +\n// `|(?:${reQuadraticCurveShortcutCommand})` +\n// `|(?:${reArcCommand}))`;\n\nexport const rePathCommand = '[mzlhvcsqta][^mzlhvcsqta]*';\n","import { cache } from '../../cache';\nimport { config } from '../../config';\nimport { halfPI, PiBy180 } from '../../constants';\nimport type { TMat2D, TRadian, TRectBounds } from '../../typedefs';\nimport { cos } from '../misc/cos';\nimport { multiplyTransformMatrices, transformPoint } from '../misc/matrix';\nimport { sin } from '../misc/sin';\nimport { toFixed } from '../misc/toFixed';\nimport type {\n TCurveInfo,\n TComplexPathData,\n TParsedAbsoluteCubicCurveCommand,\n TPathSegmentInfo,\n TPointAngle,\n TSimpleParsedCommand,\n TSimplePathData,\n TPathSegmentCommandInfo,\n TComplexParsedCommand,\n TPathSegmentInfoCommon,\n TEndPathInfo,\n TParsedArcCommand,\n TComplexParsedCommandType,\n} from './typedefs';\nimport type { XY } from '../../Point';\nimport { Point } from '../../Point';\nimport { reArcCommandPoints, rePathCommand } from './regex';\nimport { reNum } from '../../parser/constants';\n\n/**\n * Commands that may be repeated\n */\nconst repeatedCommands: Record = {\n m: 'l',\n M: 'L',\n};\n\n/**\n * Convert an arc of a rotated ellipse to a Bezier Curve\n * @param {TRadian} theta1 start of the arc\n * @param {TRadian} theta2 end of the arc\n * @param cosTh cosine of the angle of rotation\n * @param sinTh sine of the angle of rotation\n * @param rx x-axis radius (before rotation)\n * @param ry y-axis radius (before rotation)\n * @param cx1 center x of the ellipse\n * @param cy1 center y of the ellipse\n * @param mT\n * @param fromX starting point of arc x\n * @param fromY starting point of arc y\n */\nconst segmentToBezier = (\n theta1: TRadian,\n theta2: TRadian,\n cosTh: number,\n sinTh: number,\n rx: number,\n ry: number,\n cx1: number,\n cy1: number,\n mT: number,\n fromX: number,\n fromY: number,\n): TParsedAbsoluteCubicCurveCommand => {\n const costh1 = cos(theta1),\n sinth1 = sin(theta1),\n costh2 = cos(theta2),\n sinth2 = sin(theta2),\n toX = cosTh * rx * costh2 - sinTh * ry * sinth2 + cx1,\n toY = sinTh * rx * costh2 + cosTh * ry * sinth2 + cy1,\n cp1X = fromX + mT * (-cosTh * rx * sinth1 - sinTh * ry * costh1),\n cp1Y = fromY + mT * (-sinTh * rx * sinth1 + cosTh * ry * costh1),\n cp2X = toX + mT * (cosTh * rx * sinth2 + sinTh * ry * costh2),\n cp2Y = toY + mT * (sinTh * rx * sinth2 - cosTh * ry * costh2);\n\n return ['C', cp1X, cp1Y, cp2X, cp2Y, toX, toY];\n};\n\n/**\n * Adapted from {@link http://dxr.mozilla.org/mozilla-central/source/dom/svg/SVGPathDataParser.cpp}\n * by Andrea Bogazzi code is under MPL. if you don't have a copy of the license you can take it here\n * http://mozilla.org/MPL/2.0/\n * @param toX\n * @param toY\n * @param rx\n * @param ry\n * @param {number} large 0 or 1 flag\n * @param {number} sweep 0 or 1 flag\n * @param rotateX\n */\nconst arcToSegments = (\n toX: number,\n toY: number,\n rx: number,\n ry: number,\n large: number,\n sweep: number,\n rotateX: TRadian,\n): TParsedAbsoluteCubicCurveCommand[] => {\n if (rx === 0 || ry === 0) {\n return [];\n }\n let fromX = 0,\n fromY = 0,\n root = 0;\n const PI = Math.PI,\n theta = rotateX * PiBy180,\n sinTheta = sin(theta),\n cosTh = cos(theta),\n px = 0.5 * (-cosTh * toX - sinTheta * toY),\n py = 0.5 * (-cosTh * toY + sinTheta * toX),\n rx2 = rx ** 2,\n ry2 = ry ** 2,\n py2 = py ** 2,\n px2 = px ** 2,\n pl = rx2 * ry2 - rx2 * py2 - ry2 * px2;\n let _rx = Math.abs(rx);\n let _ry = Math.abs(ry);\n\n if (pl < 0) {\n const s = Math.sqrt(1 - pl / (rx2 * ry2));\n _rx *= s;\n _ry *= s;\n } else {\n root =\n (large === sweep ? -1.0 : 1.0) * Math.sqrt(pl / (rx2 * py2 + ry2 * px2));\n }\n\n const cx = (root * _rx * py) / _ry,\n cy = (-root * _ry * px) / _rx,\n cx1 = cosTh * cx - sinTheta * cy + toX * 0.5,\n cy1 = sinTheta * cx + cosTh * cy + toY * 0.5;\n let mTheta = calcVectorAngle(1, 0, (px - cx) / _rx, (py - cy) / _ry);\n let dtheta = calcVectorAngle(\n (px - cx) / _rx,\n (py - cy) / _ry,\n (-px - cx) / _rx,\n (-py - cy) / _ry,\n );\n\n if (sweep === 0 && dtheta > 0) {\n dtheta -= 2 * PI;\n } else if (sweep === 1 && dtheta < 0) {\n dtheta += 2 * PI;\n }\n\n // Convert into cubic bezier segments <= 90deg\n const segments = Math.ceil(Math.abs((dtheta / PI) * 2)),\n result = [],\n mDelta = dtheta / segments,\n mT =\n ((8 / 3) * Math.sin(mDelta / 4) * Math.sin(mDelta / 4)) /\n Math.sin(mDelta / 2);\n let th3 = mTheta + mDelta;\n\n for (let i = 0; i < segments; i++) {\n result[i] = segmentToBezier(\n mTheta,\n th3,\n cosTh,\n sinTheta,\n _rx,\n _ry,\n cx1,\n cy1,\n mT,\n fromX,\n fromY,\n );\n fromX = result[i][5];\n fromY = result[i][6];\n mTheta = th3;\n th3 += mDelta;\n }\n return result;\n};\n\n/**\n * @private\n * Calculate the angle between two vectors\n * @param ux u endpoint x\n * @param uy u endpoint y\n * @param vx v endpoint x\n * @param vy v endpoint y\n */\nconst calcVectorAngle = (\n ux: number,\n uy: number,\n vx: number,\n vy: number,\n): TRadian => {\n const ta = Math.atan2(uy, ux),\n tb = Math.atan2(vy, vx);\n if (tb >= ta) {\n return tb - ta;\n } else {\n return 2 * Math.PI - (ta - tb);\n }\n};\n\n// functions for the Cubic beizer\n// taken from: https://github.com/konvajs/konva/blob/7.0.5/src/shapes/Path.ts#L350\nconst CB1 = (t: number) => t ** 3;\nconst CB2 = (t: number) => 3 * t ** 2 * (1 - t);\nconst CB3 = (t: number) => 3 * t * (1 - t) ** 2;\nconst CB4 = (t: number) => (1 - t) ** 3;\n\n/**\n * Calculate bounding box of a cubic Bezier curve\n * Taken from http://jsbin.com/ivomiq/56/edit (no credits available)\n * TODO: can we normalize this with the starting points set at 0 and then translated the bbox?\n * @param {number} begx starting point\n * @param {number} begy\n * @param {number} cp1x first control point\n * @param {number} cp1y\n * @param {number} cp2x second control point\n * @param {number} cp2y\n * @param {number} endx end of bezier\n * @param {number} endy\n * @return {TRectBounds} the rectangular bounds\n */\nexport function getBoundsOfCurve(\n begx: number,\n begy: number,\n cp1x: number,\n cp1y: number,\n cp2x: number,\n cp2y: number,\n endx: number,\n endy: number,\n): TRectBounds {\n let argsString: string;\n if (config.cachesBoundsOfCurve) {\n // eslint-disable-next-line\n argsString = [...arguments].join();\n if (cache.boundsOfCurveCache[argsString]) {\n return cache.boundsOfCurveCache[argsString];\n }\n }\n\n const sqrt = Math.sqrt,\n abs = Math.abs,\n tvalues = [],\n bounds: [[x: number, y: number], [x: number, y: number]] = [\n [0, 0],\n [0, 0],\n ];\n\n let b = 6 * begx - 12 * cp1x + 6 * cp2x;\n let a = -3 * begx + 9 * cp1x - 9 * cp2x + 3 * endx;\n let c = 3 * cp1x - 3 * begx;\n\n for (let i = 0; i < 2; ++i) {\n if (i > 0) {\n b = 6 * begy - 12 * cp1y + 6 * cp2y;\n a = -3 * begy + 9 * cp1y - 9 * cp2y + 3 * endy;\n c = 3 * cp1y - 3 * begy;\n }\n\n if (abs(a) < 1e-12) {\n if (abs(b) < 1e-12) {\n continue;\n }\n const t = -c / b;\n if (0 < t && t < 1) {\n tvalues.push(t);\n }\n continue;\n }\n const b2ac = b * b - 4 * c * a;\n if (b2ac < 0) {\n continue;\n }\n const sqrtb2ac = sqrt(b2ac);\n const t1 = (-b + sqrtb2ac) / (2 * a);\n if (0 < t1 && t1 < 1) {\n tvalues.push(t1);\n }\n const t2 = (-b - sqrtb2ac) / (2 * a);\n if (0 < t2 && t2 < 1) {\n tvalues.push(t2);\n }\n }\n\n let j = tvalues.length;\n const jlen = j;\n const iterator = getPointOnCubicBezierIterator(\n begx,\n begy,\n cp1x,\n cp1y,\n cp2x,\n cp2y,\n endx,\n endy,\n );\n while (j--) {\n const { x, y } = iterator(tvalues[j]);\n bounds[0][j] = x;\n bounds[1][j] = y;\n }\n\n bounds[0][jlen] = begx;\n bounds[1][jlen] = begy;\n bounds[0][jlen + 1] = endx;\n bounds[1][jlen + 1] = endy;\n const result: TRectBounds = [\n new Point(Math.min(...bounds[0]), Math.min(...bounds[1])),\n new Point(Math.max(...bounds[0]), Math.max(...bounds[1])),\n ];\n if (config.cachesBoundsOfCurve) {\n cache.boundsOfCurveCache[argsString!] = result;\n }\n return result;\n}\n\n/**\n * Converts arc to a bunch of cubic Bezier curves\n * @param {number} fx starting point x\n * @param {number} fy starting point y\n * @param {TParsedArcCommand} coords Arc command\n */\nexport const fromArcToBeziers = (\n fx: number,\n fy: number,\n [_, rx, ry, rot, large, sweep, tx, ty]: TParsedArcCommand,\n): TParsedAbsoluteCubicCurveCommand[] => {\n const segsNorm = arcToSegments(tx - fx, ty - fy, rx, ry, large, sweep, rot);\n\n for (let i = 0, len = segsNorm.length; i < len; i++) {\n segsNorm[i][1] += fx;\n segsNorm[i][2] += fy;\n segsNorm[i][3] += fx;\n segsNorm[i][4] += fy;\n segsNorm[i][5] += fx;\n segsNorm[i][6] += fy;\n }\n return segsNorm;\n};\n\n/**\n * This function takes a parsed SVG path and makes it simpler for fabricJS logic.\n * Simplification consist of:\n * - All commands converted to absolute (lowercase to uppercase)\n * - S converted to C\n * - T converted to Q\n * - A converted to C\n * @param {TComplexPathData} path the array of commands of a parsed SVG path for `Path`\n * @return {TSimplePathData} the simplified array of commands of a parsed SVG path for `Path`\n * TODO: figure out how to remove the type assertions in a nice way\n */\nexport const makePathSimpler = (path: TComplexPathData): TSimplePathData => {\n // x and y represent the last point of the path, AKA the previous command point.\n // we add them to each relative command to make it an absolute comment.\n // we also swap the v V h H with L, because are easier to transform.\n let x = 0,\n y = 0;\n // x1 and y1 represent the last point of the subpath. the subpath is started with\n // m or M command. When a z or Z command is drawn, x and y need to be resetted to\n // the last x1 and y1.\n let x1 = 0,\n y1 = 0;\n // previous will host the letter of the previous command, to handle S and T.\n // controlX and controlY will host the previous reflected control point\n const destinationPath: TSimplePathData = [];\n let previous,\n // placeholders\n controlX = 0,\n controlY = 0;\n for (const parsedCommand of path) {\n const current: TComplexParsedCommand = [...parsedCommand];\n let converted: TSimpleParsedCommand | undefined;\n switch (\n current[0] // first letter\n ) {\n case 'l': // lineto, relative\n current[1] += x;\n current[2] += y;\n // falls through\n case 'L':\n x = current[1];\n y = current[2];\n converted = ['L', x, y];\n break;\n case 'h': // horizontal lineto, relative\n current[1] += x;\n // falls through\n case 'H':\n x = current[1];\n converted = ['L', x, y];\n break;\n case 'v': // vertical lineto, relative\n current[1] += y;\n // falls through\n case 'V':\n y = current[1];\n converted = ['L', x, y];\n break;\n case 'm': // moveTo, relative\n current[1] += x;\n current[2] += y;\n // falls through\n case 'M':\n x = current[1];\n y = current[2];\n x1 = current[1];\n y1 = current[2];\n converted = ['M', x, y];\n break;\n case 'c': // bezierCurveTo, relative\n current[1] += x;\n current[2] += y;\n current[3] += x;\n current[4] += y;\n current[5] += x;\n current[6] += y;\n // falls through\n case 'C':\n controlX = current[3];\n controlY = current[4];\n x = current[5];\n y = current[6];\n converted = ['C', current[1], current[2], controlX, controlY, x, y];\n break;\n case 's': // shorthand cubic bezierCurveTo, relative\n current[1] += x;\n current[2] += y;\n current[3] += x;\n current[4] += y;\n // falls through\n case 'S':\n // would be sScC but since we are swapping sSc for C, we check just that.\n if (previous === 'C') {\n // calculate reflection of previous control points\n controlX = 2 * x - controlX;\n controlY = 2 * y - controlY;\n } else {\n // If there is no previous command or if the previous command was not a C, c, S, or s,\n // the control point is coincident with the current point\n controlX = x;\n controlY = y;\n }\n x = current[3];\n y = current[4];\n converted = ['C', controlX, controlY, current[1], current[2], x, y];\n // converted[3] and converted[4] are NOW the second control point.\n // we keep it for the next reflection.\n controlX = converted[3];\n controlY = converted[4];\n break;\n case 'q': // quadraticCurveTo, relative\n current[1] += x;\n current[2] += y;\n current[3] += x;\n current[4] += y;\n // falls through\n case 'Q':\n controlX = current[1];\n controlY = current[2];\n x = current[3];\n y = current[4];\n converted = ['Q', controlX, controlY, x, y];\n break;\n case 't': // shorthand quadraticCurveTo, relative\n current[1] += x;\n current[2] += y;\n // falls through\n case 'T':\n if (previous === 'Q') {\n // calculate reflection of previous control point\n controlX = 2 * x - controlX;\n controlY = 2 * y - controlY;\n } else {\n // If there is no previous command or if the previous command was not a Q, q, T or t,\n // assume the control point is coincident with the current point\n controlX = x;\n controlY = y;\n }\n x = current[1];\n y = current[2];\n converted = ['Q', controlX, controlY, x, y];\n break;\n case 'a':\n current[6] += x;\n current[7] += y;\n // falls through\n case 'A':\n fromArcToBeziers(x, y, current).forEach((b) => destinationPath.push(b));\n x = current[6];\n y = current[7];\n break;\n case 'z':\n case 'Z':\n x = x1;\n y = y1;\n converted = ['Z'];\n break;\n default:\n }\n if (converted) {\n destinationPath.push(converted);\n previous = converted[0];\n } else {\n previous = '';\n }\n }\n return destinationPath;\n};\n\n// todo verify if we can just use the point class here\n/**\n * Calc length from point x1,y1 to x2,y2\n * @param {number} x1 starting point x\n * @param {number} y1 starting point y\n * @param {number} x2 starting point x\n * @param {number} y2 starting point y\n * @return {number} length of segment\n */\nconst calcLineLength = (\n x1: number,\n y1: number,\n x2: number,\n y2: number,\n): number => Math.sqrt((x2 - x1) ** 2 + (y2 - y1) ** 2);\n\n/**\n * Get an iterator that takes a percentage and returns a point\n * @param {number} begx\n * @param {number} begy\n * @param {number} cp1x\n * @param {number} cp1y\n * @param {number} cp2x\n * @param {number} cp2y\n * @param {number} endx\n * @param {number} endy\n */\nconst getPointOnCubicBezierIterator =\n (\n begx: number,\n begy: number,\n cp1x: number,\n cp1y: number,\n cp2x: number,\n cp2y: number,\n endx: number,\n endy: number,\n ) =>\n (pct: number) => {\n const c1 = CB1(pct),\n c2 = CB2(pct),\n c3 = CB3(pct),\n c4 = CB4(pct);\n return new Point(\n endx * c1 + cp2x * c2 + cp1x * c3 + begx * c4,\n endy * c1 + cp2y * c2 + cp1y * c3 + begy * c4,\n );\n };\n\nconst QB1 = (t: number) => t ** 2;\nconst QB2 = (t: number) => 2 * t * (1 - t);\nconst QB3 = (t: number) => (1 - t) ** 2;\n\nconst getTangentCubicIterator =\n (\n p1x: number,\n p1y: number,\n p2x: number,\n p2y: number,\n p3x: number,\n p3y: number,\n p4x: number,\n p4y: number,\n ) =>\n (pct: number) => {\n const qb1 = QB1(pct),\n qb2 = QB2(pct),\n qb3 = QB3(pct),\n tangentX =\n 3 * (qb3 * (p2x - p1x) + qb2 * (p3x - p2x) + qb1 * (p4x - p3x)),\n tangentY =\n 3 * (qb3 * (p2y - p1y) + qb2 * (p3y - p2y) + qb1 * (p4y - p3y));\n return Math.atan2(tangentY, tangentX);\n };\n\nconst getPointOnQuadraticBezierIterator =\n (\n p1x: number,\n p1y: number,\n p2x: number,\n p2y: number,\n p3x: number,\n p3y: number,\n ) =>\n (pct: number) => {\n const c1 = QB1(pct),\n c2 = QB2(pct),\n c3 = QB3(pct);\n return new Point(\n p3x * c1 + p2x * c2 + p1x * c3,\n p3y * c1 + p2y * c2 + p1y * c3,\n );\n };\n\nconst getTangentQuadraticIterator =\n (\n p1x: number,\n p1y: number,\n p2x: number,\n p2y: number,\n p3x: number,\n p3y: number,\n ) =>\n (pct: number) => {\n const invT = 1 - pct,\n tangentX = 2 * (invT * (p2x - p1x) + pct * (p3x - p2x)),\n tangentY = 2 * (invT * (p2y - p1y) + pct * (p3y - p2y));\n return Math.atan2(tangentY, tangentX);\n };\n\n// this will run over a path segment (a cubic or quadratic segment) and approximate it\n// with 100 segments. This will good enough to calculate the length of the curve\nconst pathIterator = (\n iterator: (pct: number) => Point,\n x1: number,\n y1: number,\n) => {\n let tempP = new Point(x1, y1),\n tmpLen = 0;\n for (let perc = 1; perc <= 100; perc += 1) {\n const p = iterator(perc / 100);\n tmpLen += calcLineLength(tempP.x, tempP.y, p.x, p.y);\n tempP = p;\n }\n return tmpLen;\n};\n\n/**\n * Given a pathInfo, and a distance in pixels, find the percentage from 0 to 1\n * that correspond to that pixels run over the path.\n * The percentage will be then used to find the correct point on the canvas for the path.\n * @param {Array} segInfo fabricJS collection of information on a parsed path\n * @param {number} distance from starting point, in pixels.\n * @return {TPointAngle} info object with x and y ( the point on canvas ) and angle, the tangent on that point;\n */\nconst findPercentageForDistance = (\n segInfo: TCurveInfo<'Q' | 'C'>,\n distance: number,\n): TPointAngle => {\n let perc = 0,\n tmpLen = 0,\n tempP: XY = { x: segInfo.x, y: segInfo.y },\n p: XY = { ...tempP },\n nextLen: number,\n nextStep = 0.01,\n lastPerc = 0;\n // nextStep > 0.0001 covers 0.00015625 that 1/64th of 1/100\n // the path\n const iterator = segInfo.iterator,\n angleFinder = segInfo.angleFinder;\n while (tmpLen < distance && nextStep > 0.0001) {\n p = iterator(perc);\n lastPerc = perc;\n nextLen = calcLineLength(tempP.x, tempP.y, p.x, p.y);\n // compare tmpLen each cycle with distance, decide next perc to test.\n if (nextLen + tmpLen > distance) {\n // we discard this step and we make smaller steps.\n perc -= nextStep;\n nextStep /= 2;\n } else {\n tempP = p;\n perc += nextStep;\n tmpLen += nextLen;\n }\n }\n return { ...p, angle: angleFinder(lastPerc) };\n};\n\n/**\n * Run over a parsed and simplified path and extract some information (length of each command and starting point)\n * @param {TSimplePathData} path parsed path commands\n * @return {TPathSegmentInfo[]} path commands information\n */\nexport const getPathSegmentsInfo = (\n path: TSimplePathData,\n): TPathSegmentInfo[] => {\n let totalLength = 0,\n //x2 and y2 are the coords of segment start\n //x1 and y1 are the coords of the current point\n x1 = 0,\n y1 = 0,\n x2 = 0,\n y2 = 0,\n iterator,\n tempInfo: TPathSegmentInfo;\n const info: TPathSegmentInfo[] = [];\n for (const current of path) {\n const basicInfo: TPathSegmentInfoCommon = {\n x: x1,\n y: y1,\n command: current[0],\n length: 0,\n };\n switch (\n current[0] //first letter\n ) {\n case 'M':\n tempInfo = >basicInfo;\n tempInfo.x = x2 = x1 = current[1];\n tempInfo.y = y2 = y1 = current[2];\n break;\n case 'L':\n tempInfo = >basicInfo;\n tempInfo.length = calcLineLength(x1, y1, current[1], current[2]);\n x1 = current[1];\n y1 = current[2];\n break;\n case 'C':\n iterator = getPointOnCubicBezierIterator(\n x1,\n y1,\n current[1],\n current[2],\n current[3],\n current[4],\n current[5],\n current[6],\n );\n tempInfo = >basicInfo;\n tempInfo.iterator = iterator;\n tempInfo.angleFinder = getTangentCubicIterator(\n x1,\n y1,\n current[1],\n current[2],\n current[3],\n current[4],\n current[5],\n current[6],\n );\n tempInfo.length = pathIterator(iterator, x1, y1);\n\n x1 = current[5];\n y1 = current[6];\n break;\n case 'Q':\n iterator = getPointOnQuadraticBezierIterator(\n x1,\n y1,\n current[1],\n current[2],\n current[3],\n current[4],\n );\n tempInfo = >basicInfo;\n tempInfo.iterator = iterator;\n tempInfo.angleFinder = getTangentQuadraticIterator(\n x1,\n y1,\n current[1],\n current[2],\n current[3],\n current[4],\n );\n tempInfo.length = pathIterator(iterator, x1, y1);\n x1 = current[3];\n y1 = current[4];\n break;\n case 'Z':\n // we add those in order to ease calculations later\n tempInfo = basicInfo;\n tempInfo.destX = x2;\n tempInfo.destY = y2;\n tempInfo.length = calcLineLength(x1, y1, x2, y2);\n x1 = x2;\n y1 = y2;\n break;\n }\n totalLength += tempInfo.length;\n info.push(tempInfo);\n }\n info.push({ length: totalLength, x: x1, y: y1 });\n return info;\n};\n\n/**\n * Get the point on the path that is distance along the path\n * @param path\n * @param distance\n * @param infos\n */\nexport const getPointOnPath = (\n path: TSimplePathData,\n distance: number,\n infos: TPathSegmentInfo[] = getPathSegmentsInfo(path),\n): TPointAngle | undefined => {\n let i = 0;\n while (distance - infos[i].length > 0 && i < infos.length - 2) {\n distance -= infos[i].length;\n i++;\n }\n const segInfo = infos[i],\n segPercent = distance / segInfo.length,\n segment = path[i];\n\n switch (segInfo.command) {\n case 'M':\n return { x: segInfo.x, y: segInfo.y, angle: 0 };\n case 'Z':\n return {\n ...new Point(segInfo.x, segInfo.y).lerp(\n new Point(segInfo.destX, segInfo.destY),\n segPercent,\n ),\n angle: Math.atan2(segInfo.destY - segInfo.y, segInfo.destX - segInfo.x),\n };\n case 'L':\n return {\n ...new Point(segInfo.x, segInfo.y).lerp(\n new Point(segment[1]!, segment[2]!),\n segPercent,\n ),\n angle: Math.atan2(segment[2]! - segInfo.y, segment[1]! - segInfo.x),\n };\n case 'C':\n return findPercentageForDistance(segInfo, distance);\n case 'Q':\n return findPercentageForDistance(segInfo, distance);\n default:\n // throw Error('Invalid command');\n }\n};\n\nconst rePathCmdAll = new RegExp(rePathCommand, 'gi');\nconst regExpArcCommandPoints = new RegExp(reArcCommandPoints, 'g');\nconst reMyNum = new RegExp(reNum, 'gi');\nconst commandLengths = {\n m: 2,\n l: 2,\n h: 1,\n v: 1,\n c: 6,\n s: 4,\n q: 4,\n t: 2,\n a: 7,\n} as const;\n/**\n *\n * @param {string} pathString\n * @return {TComplexPathData} An array of SVG path commands\n * @example Usage\n * parsePath('M 3 4 Q 3 5 2 1 4 0 Q 9 12 2 1 4 0') === [\n * ['M', 3, 4],\n * ['Q', 3, 5, 2, 1, 4, 0],\n * ['Q', 9, 12, 2, 1, 4, 0],\n * ];\n */\nexport const parsePath = (pathString: string): TComplexPathData => {\n const chain: TComplexPathData = [];\n const all = pathString.match(rePathCmdAll) ?? [];\n for (const matchStr of all) {\n // take match string and save the first letter as the command\n const commandLetter = matchStr[0] as TComplexParsedCommandType;\n // in case of Z we have very little to do\n if (commandLetter === 'z' || commandLetter === 'Z') {\n chain.push([commandLetter]);\n continue;\n }\n const commandLength =\n commandLengths[\n commandLetter.toLowerCase() as keyof typeof commandLengths\n ];\n\n let paramArr = [];\n if (commandLetter === 'a' || commandLetter === 'A') {\n // the arc command ha some peculariaties that requires a special regex other than numbers\n // it is possible to avoid using a space between the sweep and large arc flags, making them either\n // 00, 01, 10 or 11, making them identical to a plain number for the regex reMyNum\n // reset the regexp\n regExpArcCommandPoints.lastIndex = 0;\n for (let out = null; (out = regExpArcCommandPoints.exec(matchStr)); ) {\n paramArr.push(...out.slice(1));\n }\n } else {\n paramArr = matchStr.match(reMyNum) || [];\n }\n\n // inspect the length of paramArr, if is longer than commandLength\n // we are dealing with repeated commands\n for (let i = 0; i < paramArr.length; i += commandLength) {\n const newCommand = new Array(commandLength) as TComplexParsedCommand;\n const transformedCommand = repeatedCommands[commandLetter];\n newCommand[0] =\n i > 0 && transformedCommand ? transformedCommand : commandLetter;\n for (let j = 0; j < commandLength; j++) {\n newCommand[j + 1] = parseFloat(paramArr[i + j]);\n }\n chain.push(newCommand);\n }\n }\n return chain;\n};\n\n/**\n *\n * Converts points to a smooth SVG path\n * @param {XY[]} points Array of points\n * @param {number} [correction] Apply a correction to the path (usually we use `width / 1000`). If value is undefined 0 is used as the correction value.\n * @return {(string|number)[][]} An array of SVG path commands\n */\nexport const getSmoothPathFromPoints = (\n points: Point[],\n correction = 0,\n): TSimplePathData => {\n let p1 = new Point(points[0]),\n p2 = new Point(points[1]),\n multSignX = 1,\n multSignY = 0;\n const path: TSimplePathData = [],\n len = points.length,\n manyPoints = len > 2;\n\n if (manyPoints) {\n multSignX = points[2].x < p2.x ? -1 : points[2].x === p2.x ? 0 : 1;\n multSignY = points[2].y < p2.y ? -1 : points[2].y === p2.y ? 0 : 1;\n }\n path.push([\n 'M',\n p1.x - multSignX * correction,\n p1.y - multSignY * correction,\n ]);\n let i;\n for (i = 1; i < len; i++) {\n if (!p1.eq(p2)) {\n const midPoint = p1.midPointFrom(p2);\n // p1 is our bezier control point\n // midpoint is our endpoint\n // start point is p(i-1) value.\n path.push(['Q', p1.x, p1.y, midPoint.x, midPoint.y]);\n }\n p1 = points[i];\n if (i + 1 < points.length) {\n p2 = points[i + 1];\n }\n }\n if (manyPoints) {\n multSignX = p1.x > points[i - 2].x ? 1 : p1.x === points[i - 2].x ? 0 : -1;\n multSignY = p1.y > points[i - 2].y ? 1 : p1.y === points[i - 2].y ? 0 : -1;\n }\n path.push([\n 'L',\n p1.x + multSignX * correction,\n p1.y + multSignY * correction,\n ]);\n return path;\n};\n\n/**\n * Transform a path by transforming each segment.\n * it has to be a simplified path or it won't work.\n * WARNING: this depends from pathOffset for correct operation\n * @param {TSimplePathData} path fabricJS parsed and simplified path commands\n * @param {TMat2D} transform matrix that represent the transformation\n * @param {Point} [pathOffset] `Path.pathOffset`\n * @returns {TSimplePathData} the transformed path\n */\nexport const transformPath = (\n path: TSimplePathData,\n transform: TMat2D,\n pathOffset: Point,\n): TSimplePathData => {\n if (pathOffset) {\n transform = multiplyTransformMatrices(transform, [\n 1,\n 0,\n 0,\n 1,\n -pathOffset.x,\n -pathOffset.y,\n ]);\n }\n return path.map((pathSegment) => {\n const newSegment: TSimpleParsedCommand = [...pathSegment];\n for (let i = 1; i < pathSegment.length - 1; i += 2) {\n // TODO: is there a way to get around casting to any?\n const { x, y } = transformPoint(\n {\n x: pathSegment[i] as number,\n y: pathSegment[i + 1] as number,\n },\n transform,\n );\n newSegment[i] = x;\n newSegment[i + 1] = y;\n }\n return newSegment;\n });\n};\n\n/**\n * Returns an array of path commands to create a regular polygon\n * @param {number} numVertexes\n * @param {number} radius\n * @returns {TSimplePathData} An array of SVG path commands\n */\nexport const getRegularPolygonPath = (\n numVertexes: number,\n radius: number,\n): TSimplePathData => {\n const interiorAngle = (Math.PI * 2) / numVertexes;\n // rotationAdjustment rotates the path by 1/2 the interior angle so that the polygon always has a flat side on the bottom\n // This isn't strictly necessary, but it's how we tend to think of and expect polygons to be drawn\n let rotationAdjustment = -halfPI;\n if (numVertexes % 2 === 0) {\n rotationAdjustment += interiorAngle / 2;\n }\n const d = new Array(numVertexes + 1);\n for (let i = 0; i < numVertexes; i++) {\n const rad = i * interiorAngle + rotationAdjustment;\n const { x, y } = new Point(cos(rad), sin(rad)).scalarMultiply(radius);\n d[i] = [i === 0 ? 'M' : 'L', x, y];\n }\n d[numVertexes] = ['Z'];\n return d;\n};\n\n/**\n * Join path commands to go back to svg format\n * @param {TSimplePathData} pathData fabricJS parsed path commands\n * @param {number} fractionDigits number of fraction digits to \"leave\"\n * @return {String} joined path 'M 0 0 L 20 30'\n */\nexport const joinPath = (pathData: TSimplePathData, fractionDigits?: number) =>\n pathData\n .map((segment) => {\n return segment\n .map((arg, i) => {\n if (i === 0) return arg;\n return fractionDigits === undefined\n ? arg\n : toFixed(arg, fractionDigits);\n })\n .join(' ');\n })\n .join(' ');\n","import type { FabricObject } from '../../shapes/Object/FabricObject';\nimport { sendObjectToPlane } from './planeChange';\nimport { Group } from '../../shapes/Group';\n/**\n * Merges 2 clip paths into one visually equal clip path\n *\n * **IMPORTANT**:\\\n * Does **NOT** clone the arguments, clone them proir if necessary.\n *\n * Creates a wrapper (group) that contains one clip path and is clipped by the other so content is kept where both overlap.\n * Use this method if both the clip paths may have nested clip paths of their own, so assigning one to the other's clip path property is not possible.\n *\n * In order to handle the `inverted` property we follow logic described in the following cases:\\\n * **(1)** both clip paths are inverted - the clip paths pass the inverted prop to the wrapper and loose it themselves.\\\n * **(2)** one is inverted and the other isn't - the wrapper shouldn't become inverted and the inverted clip path must clip the non inverted one to produce an identical visual effect.\\\n * **(3)** both clip paths are not inverted - wrapper and clip paths remain unchanged.\n *\n * @param {fabric.Object} c1\n * @param {fabric.Object} c2\n * @returns {fabric.Object} merged clip path\n */\nexport const mergeClipPaths = (c1: FabricObject, c2: FabricObject) => {\n let a = c1,\n b = c2;\n if (a.inverted && !b.inverted) {\n // case (2)\n a = c2;\n b = c1;\n }\n // `b` becomes `a`'s clip path so we transform `b` to `a` coordinate plane\n sendObjectToPlane(b, b.group?.calcTransformMatrix(), a.calcTransformMatrix());\n // assign the `inverted` prop to the wrapping group\n const inverted = a.inverted && b.inverted;\n if (inverted) {\n // case (1)\n a.inverted = b.inverted = false;\n }\n return new Group([a], { clipPath: b, inverted });\n};\n","/**\n * Returns random number between 2 specified ones.\n * @param {Number} min lower limit\n * @param {Number} max upper limit\n * @return {Number} random value (between min and max)\n */\nexport const getRandomInt = (min: number, max: number): number =>\n Math.floor(Math.random() * (max - min + 1)) + min;\n","import { CENTER, SCALE_X, SCALE_Y } from '../constants';\nimport type { FabricImage } from '../shapes/Image';\nimport type { FabricObject } from '../shapes/Object/FabricObject';\nimport type { TMat2D } from '../typedefs';\nimport { qrDecompose } from './misc/matrix';\n\ntype FabricObjectWithTransformMatrix = FabricObject & {\n transformMatrix?: TMat2D;\n};\n\n/**\n * This function is an helper for svg import. it decompose the transformMatrix\n * and assign properties to object.\n * untransformed coordinates\n * @private\n */\nconst _assignTransformMatrixProps = (\n object: FabricObjectWithTransformMatrix,\n) => {\n if (object.transformMatrix) {\n const { scaleX, scaleY, angle, skewX } = qrDecompose(\n object.transformMatrix,\n );\n object.flipX = false;\n object.flipY = false;\n object.set(SCALE_X, scaleX);\n object.set(SCALE_Y, scaleY);\n object.angle = angle;\n object.skewX = skewX;\n object.skewY = 0;\n }\n};\n\n/**\n * This function is an helper for svg import. it removes the transform matrix\n * and set to object properties that fabricjs can handle\n * @private\n * @param {Object} preserveAspectRatioOptions\n */\nexport const removeTransformMatrixForSvgParsing = (\n object: FabricObjectWithTransformMatrix,\n preserveAspectRatioOptions?: any,\n) => {\n let center = object._findCenterFromElement();\n if (object.transformMatrix) {\n _assignTransformMatrixProps(object);\n center = center.transform(object.transformMatrix);\n }\n delete object.transformMatrix;\n if (preserveAspectRatioOptions) {\n object.scaleX *= preserveAspectRatioOptions.scaleX;\n object.scaleY *= preserveAspectRatioOptions.scaleY;\n (object as FabricImage).cropX = preserveAspectRatioOptions.cropX;\n (object as FabricImage).cropY = preserveAspectRatioOptions.cropY;\n center.x += preserveAspectRatioOptions.offsetLeft;\n center.y += preserveAspectRatioOptions.offsetTop;\n object.width = preserveAspectRatioOptions.width;\n object.height = preserveAspectRatioOptions.height;\n }\n object.setPositionByOrigin(center, CENTER, CENTER);\n};\n","// TODO this file needs to go away, cross browser style support is not fabricjs domain.\n\n/**\n * wrapper for setting element's style\n * @param {HTMLElement} element an HTMLElement\n * @param {Object} styles to apply to element\n */\nexport function setStyle(element: HTMLElement, styles: Record) {\n const elementStyle = element.style;\n if (!elementStyle) {\n return;\n }\n Object.entries(styles).forEach(([property, value]) =>\n elementStyle.setProperty(property, value),\n );\n}\n","import { getEnv, getFabricDocument } from '../../env';\nimport type { TSize } from '../../typedefs';\nimport { createCanvasElement } from '../../util/misc/dom';\nimport { setStyle } from '../../util/internals/dom_style';\nimport type { CSSDimensions } from './util';\nimport { makeElementUnselectable, setCSSDimensions } from './util';\nimport type { CanvasItem } from './StaticCanvasDOMManager';\nimport { StaticCanvasDOMManager } from './StaticCanvasDOMManager';\nimport { setCanvasDimensions } from './util';\nimport { NONE } from '../../constants';\n\nexport class CanvasDOMManager extends StaticCanvasDOMManager {\n upper: CanvasItem;\n container: HTMLDivElement;\n\n constructor(\n arg0?: string | HTMLCanvasElement,\n {\n allowTouchScrolling = false,\n containerClass = '',\n }: {\n allowTouchScrolling?: boolean;\n /**\n * @deprecated here only for backward compatibility\n */\n containerClass?: string;\n } = {},\n ) {\n super(arg0);\n const { el: lowerCanvasEl } = this.lower;\n const upperCanvasEl = this.createUpperCanvas();\n this.upper = { el: upperCanvasEl, ctx: upperCanvasEl.getContext('2d')! };\n this.applyCanvasStyle(lowerCanvasEl, {\n allowTouchScrolling,\n });\n this.applyCanvasStyle(upperCanvasEl, {\n allowTouchScrolling,\n styles: {\n position: 'absolute',\n left: '0',\n top: '0',\n },\n });\n const container = this.createContainerElement();\n container.classList.add(containerClass);\n if (lowerCanvasEl.parentNode) {\n lowerCanvasEl.parentNode.replaceChild(container, lowerCanvasEl);\n }\n container.append(lowerCanvasEl, upperCanvasEl);\n this.container = container;\n }\n\n protected createUpperCanvas() {\n const { el: lowerCanvasEl } = this.lower;\n const el = createCanvasElement();\n // we assign the same classname of the lowerCanvas\n el.className = lowerCanvasEl.className;\n // but then we remove the lower-canvas specific className\n el.classList.remove('lower-canvas');\n // we add the specific upper-canvas class\n el.classList.add('upper-canvas');\n el.setAttribute('data-fabric', 'top');\n el.style.cssText = lowerCanvasEl.style.cssText;\n el.setAttribute('draggable', 'true');\n return el;\n }\n\n protected createContainerElement() {\n const container = getFabricDocument().createElement('div');\n container.setAttribute('data-fabric', 'wrapper');\n setStyle(container, {\n position: 'relative',\n });\n makeElementUnselectable(container);\n return container;\n }\n\n /**\n * @private\n * @param {HTMLCanvasElement} element canvas element to apply styles on\n */\n protected applyCanvasStyle(\n element: HTMLCanvasElement,\n options: {\n allowTouchScrolling?: boolean;\n styles?: Record;\n },\n ) {\n const { styles, allowTouchScrolling } = options;\n setStyle(element, {\n ...styles,\n 'touch-action': allowTouchScrolling ? 'manipulation' : NONE,\n });\n makeElementUnselectable(element);\n }\n\n setDimensions(size: TSize, retinaScaling: number) {\n super.setDimensions(size, retinaScaling);\n const { el, ctx } = this.upper;\n setCanvasDimensions(el, ctx, size, retinaScaling);\n }\n\n setCSSDimensions(size: Partial): void {\n super.setCSSDimensions(size);\n setCSSDimensions(this.upper.el, size);\n setCSSDimensions(this.container, size);\n }\n\n cleanupDOM(size: TSize) {\n const container = this.container,\n { el: lowerCanvasEl } = this.lower,\n { el: upperCanvasEl } = this.upper;\n super.cleanupDOM(size);\n container.removeChild(upperCanvasEl);\n container.removeChild(lowerCanvasEl);\n if (container.parentNode) {\n container.parentNode.replaceChild(lowerCanvasEl, container);\n }\n }\n\n dispose() {\n super.dispose();\n getEnv().dispose(this.upper.el);\n // @ts-expect-error disposing\n delete this.upper;\n // @ts-expect-error disposing\n delete this.container;\n }\n}\n","import type { ModifierKey, TOptionalModifierKey } from '../EventTypeDefs';\nimport type { TOptions } from '../typedefs';\nimport type { StaticCanvasOptions } from './StaticCanvasOptions';\n\nexport interface CanvasTransformOptions {\n /**\n * When true, objects can be transformed by one side (unproportionately)\n * when dragged on the corners that normally would not do that.\n * @type Boolean\n * @since fabric 4.0 // changed name and default value\n */\n uniformScaling: boolean;\n\n /**\n * Indicates which key switches uniform scaling.\n * values: 'altKey', 'shiftKey', 'ctrlKey'.\n * If `null` or 'none' or any other string that is not a modifier key\n * feature is disabled.\n * totally wrong named. this sounds like `uniform scaling`\n * if Canvas.uniformScaling is true, pressing this will set it to false\n * and viceversa.\n * @since 1.6.2\n * @type ModifierKey\n */\n uniScaleKey: TOptionalModifierKey;\n\n /**\n * When true, objects use center point as the origin of scale transformation.\n * Backwards incompatibility note: This property replaces \"centerTransform\" (Boolean).\n * @since 1.3.4\n * @type Boolean\n */\n centeredScaling: boolean;\n\n /**\n * When true, objects use center point as the origin of rotate transformation.\n * Backwards incompatibility note: This property replaces \"centerTransform\" (Boolean).\n * @since 1.3.4\n * @type Boolean\n */\n centeredRotation: boolean;\n\n /**\n * Indicates which key enable centered Transform\n * values: 'altKey', 'shiftKey', 'ctrlKey'.\n * If `null` or 'none' or any other string that is not a modifier key\n * feature is disabled feature disabled.\n * @since 1.6.2\n * @type ModifierKey\n */\n centeredKey: TOptionalModifierKey;\n\n /**\n * Indicates which key enable alternate action on corner\n * values: 'altKey', 'shiftKey', 'ctrlKey'.\n * If `null` or 'none' or any other string that is not a modifier key\n * feature is disabled feature disabled.\n * @since 1.6.2\n * @type ModifierKey\n */\n altActionKey: TOptionalModifierKey;\n}\n\nexport interface CanvasSelectionOptions {\n /**\n * Indicates whether group selection should be enabled\n * @type Boolean\n */\n selection: boolean;\n\n /**\n * Indicates which key or keys enable multiple click selection\n * Pass value as a string or array of strings\n * values: 'altKey', 'shiftKey', 'ctrlKey'.\n * If `null` or empty or containing any other string that is not a modifier key\n * feature is disabled.\n * @since 1.6.2\n * @type ModifierKey|ModifierKey[]\n */\n selectionKey: TOptionalModifierKey | ModifierKey[];\n\n /**\n * Indicates which key enable alternative selection\n * in case of a target overlapping with active object and we don't want to loose the\n * active selection, we can press this modifier key and continue selecting the current\n * selected object also when is covered by another or many valid targets for selection.\n * values: 'altKey', 'shiftKey', 'ctrlKey'.\n * For a series of reason that come from the general expectations on how\n * things should work, this feature works only for preserveObjectStacking true.\n * If `null` or 'none' or any other string that is not a modifier key\n * feature is disabled.\n * @since 1.6.5\n * @type null|ModifierKey\n */\n altSelectionKey: TOptionalModifierKey;\n\n /**\n * Color of selection\n * @type String\n */\n selectionColor: string;\n\n /**\n * Default dash array pattern\n * If not empty the selection border is dashed\n * @type Array\n */\n selectionDashArray: number[];\n\n /**\n * Color of the border of selection (usually slightly darker than color of selection itself)\n * @type String\n */\n selectionBorderColor: string;\n\n /**\n * Width of a line used in object/group selection\n * @type Number\n */\n selectionLineWidth: number;\n\n /**\n * Select only shapes that are fully contained in the dragged selection rectangle.\n * @type Boolean\n */\n selectionFullyContained: boolean;\n}\n\nexport interface CanvasCursorOptions {\n /**\n * Default cursor value used when hovering over an object on canvas\n * @type CSSStyleDeclaration['cursor']\n * @default move\n */\n hoverCursor: CSSStyleDeclaration['cursor'];\n\n /**\n * Default cursor value used when moving an object on canvas\n * @type CSSStyleDeclaration['cursor']\n * @default move\n */\n moveCursor: CSSStyleDeclaration['cursor'];\n\n /**\n * Default cursor value used for the entire canvas\n * @type String\n * @default default\n */\n defaultCursor: CSSStyleDeclaration['cursor'];\n\n /**\n * Cursor value used during free drawing\n * @type String\n * @default crosshair\n */\n freeDrawingCursor: CSSStyleDeclaration['cursor'];\n\n /**\n * Cursor value used for disabled elements ( corners with disabled action )\n * @type String\n * @since 2.0.0\n * @default not-allowed\n */\n notAllowedCursor: CSSStyleDeclaration['cursor'];\n}\n\nexport interface TargetFindOptions {\n /**\n * When true, object detection happens on per-pixel basis rather than on per-bounding-box\n * @type Boolean\n */\n perPixelTargetFind: boolean;\n\n /**\n * Number of pixels around target pixel to tolerate (consider active) during object detection\n * @type Number\n */\n targetFindTolerance: number;\n\n /**\n * When true, target detection is skipped. Target detection will return always undefined.\n * click selection won't work anymore, events will fire with no targets.\n * if something is selected before setting it to true, it will be deselected at the first click.\n * area selection will still work. check the `selection` property too.\n * if you deactivate both, you should look into staticCanvas.\n * @type Boolean\n */\n skipTargetFind: boolean;\n}\n\nexport interface CanvasEventsOptions {\n /**\n * Indicates if the right click on canvas can output the context menu or not\n * @type Boolean\n * @since 1.6.5\n */\n stopContextMenu: boolean;\n\n /**\n * Indicates if the canvas can fire right click events\n * @type Boolean\n * @since 1.6.5\n */\n fireRightClick: boolean;\n\n /**\n * Indicates if the canvas can fire middle click events\n * @type Boolean\n * @since 1.7.8\n */\n fireMiddleClick: boolean;\n\n /**\n * When the option is enabled, PointerEvent is used instead of TPointerEvent.\n * @type Boolean\n */\n enablePointerEvents: boolean;\n}\n\nexport interface CanvasOptions\n extends StaticCanvasOptions,\n CanvasTransformOptions,\n CanvasSelectionOptions,\n CanvasCursorOptions,\n TargetFindOptions,\n CanvasEventsOptions {\n /**\n * Default element class that's given to wrapper (div) element of canvas\n * @type String\n * @deprecated customize {@link CanvasDOMManager} instead or access {@link elements} directly\n */\n containerClass: string;\n\n /**\n * Indicates whether objects should remain in current stack position when selected.\n * When false objects are brought to top and rendered as part of the selection group\n * @type Boolean\n * @default true\n */\n preserveObjectStacking: boolean;\n}\n\nexport type TCanvasOptions = TOptions;\n\nexport const canvasDefaults: TOptions = {\n uniformScaling: true,\n uniScaleKey: 'shiftKey',\n centeredScaling: false,\n centeredRotation: false,\n centeredKey: 'altKey',\n altActionKey: 'shiftKey',\n\n selection: true,\n selectionKey: 'shiftKey',\n selectionColor: 'rgba(100, 100, 255, 0.3)',\n selectionDashArray: [],\n selectionBorderColor: 'rgba(255, 255, 255, 0.3)',\n selectionLineWidth: 1,\n selectionFullyContained: false,\n\n hoverCursor: 'move',\n moveCursor: 'move',\n defaultCursor: 'default',\n freeDrawingCursor: 'crosshair',\n notAllowedCursor: 'not-allowed',\n\n perPixelTargetFind: false,\n targetFindTolerance: 0,\n skipTargetFind: false,\n\n stopContextMenu: false,\n fireRightClick: false,\n fireMiddleClick: false,\n enablePointerEvents: false,\n\n containerClass: 'canvas-container',\n preserveObjectStacking: true,\n};\n","import { dragHandler } from '../controls/drag';\nimport { getActionFromCorner } from '../controls/util';\nimport { Point } from '../Point';\nimport { FabricObject } from '../shapes/Object/FabricObject';\nimport type {\n CanvasEvents,\n ModifierKey,\n TOptionalModifierKey,\n TPointerEvent,\n Transform,\n} from '../EventTypeDefs';\nimport {\n addTransformToObject,\n saveObjectTransform,\n} from '../util/misc/objectTransforms';\nimport type { TCanvasSizeOptions } from './StaticCanvas';\nimport { StaticCanvas } from './StaticCanvas';\nimport { isCollection } from '../Collection';\nimport { isTransparent } from '../util/misc/isTransparent';\nimport type {\n TMat2D,\n TOriginX,\n TOriginY,\n TSize,\n TSVGReviver,\n} from '../typedefs';\nimport { degreesToRadians } from '../util/misc/radiansDegreesConversion';\nimport { getPointer, isTouchEvent } from '../util/dom_event';\nimport type { IText } from '../shapes/IText/IText';\nimport type { BaseBrush } from '../brushes/BaseBrush';\nimport { pick } from '../util/misc/pick';\nimport { sendPointToPlane } from '../util/misc/planeChange';\nimport { cos, createCanvasElement, sin } from '../util';\nimport { CanvasDOMManager } from './DOMManagers/CanvasDOMManager';\nimport {\n BOTTOM,\n CENTER,\n LEFT,\n MODIFIED,\n RESIZING,\n RIGHT,\n ROTATE,\n SCALE,\n SCALE_X,\n SCALE_Y,\n SKEW_X,\n SKEW_Y,\n TOP,\n} from '../constants';\nimport type { CanvasOptions } from './CanvasOptions';\nimport { canvasDefaults } from './CanvasOptions';\nimport { Intersection } from '../Intersection';\nimport { isActiveSelection } from '../util/typeAssertions';\n\nexport type TargetsInfo = {\n target?: FabricObject;\n subTargets: FabricObject[];\n};\n\nexport type TargetsInfoWithContainer = {\n // the target we think is the most continuing the selection action.\n // could be hoveredTarget or the currently selected object\n target?: FabricObject;\n // the nested targets under the pointer for container\n subTargets: FabricObject[];\n // the container for target, or target itself if there are no selectable nested targets\n container?: FabricObject;\n};\n\nexport type FullTargetsInfoWithContainer = TargetsInfoWithContainer & {\n // hoveredTarget\n currentTarget?: FabricObject;\n // the container for hoveredTarget, or container itself\n currentContainer?: FabricObject;\n // nested targets of current container\n currentSubTargets: FabricObject[];\n};\n\n/**\n * Canvas class\n * @class Canvas\n * @extends StaticCanvas\n * @tutorial {@link http://fabricjs.com/fabric-intro-part-1#canvas}\n *\n * @fires object:modified at the end of a transform\n * @fires object:rotating while an object is being rotated from the control\n * @fires object:scaling while an object is being scaled by controls\n * @fires object:moving while an object is being dragged\n * @fires object:skewing while an object is being skewed from the controls\n *\n * @fires before:transform before a transform is is started\n * @fires before:selection:cleared\n * @fires selection:cleared\n * @fires selection:updated\n * @fires selection:created\n *\n * @fires path:created after a drawing operation ends and the path is added\n * @fires mouse:down\n * @fires mouse:move\n * @fires mouse:up\n * @fires mouse:down:before on mouse down, before the inner fabric logic runs\n * @fires mouse:move:before on mouse move, before the inner fabric logic runs\n * @fires mouse:up:before on mouse up, before the inner fabric logic runs\n * @fires mouse:over\n * @fires mouse:out\n * @fires mouse:dblclick whenever a native dbl click event fires on the canvas.\n *\n * @fires dragover\n * @fires dragenter\n * @fires dragleave\n * @fires drag:enter object drag enter\n * @fires drag:leave object drag leave\n * @fires drop:before before drop event. Prepare for the drop event (same native event).\n * @fires drop\n * @fires drop:after after drop event. Run logic on canvas after event has been accepted/declined (same native event).\n * @example\n * let a: fabric.Object, b: fabric.Object;\n * let flag = false;\n * canvas.add(a, b);\n * a.on('drop:before', opt => {\n * // we want a to accept the drop even though it's below b in the stack\n * flag = this.canDrop(opt.e);\n * });\n * b.canDrop = function(e) {\n * !flag && this.draggableTextDelegate.canDrop(e);\n * }\n * b.on('dragover', opt => b.set('fill', opt.dropTarget === b ? 'pink' : 'black'));\n * a.on('drop', opt => {\n * opt.e.defaultPrevented // drop occurred\n * opt.didDrop // drop occurred on canvas\n * opt.target // drop target\n * opt.target !== a && a.set('text', 'I lost');\n * });\n * canvas.on('drop:after', opt => {\n * // inform user who won\n * if(!opt.e.defaultPrevented) {\n * // no winners\n * }\n * else if(!opt.didDrop) {\n * // my objects didn't win, some other lucky object\n * }\n * else {\n * // we have a winner it's opt.target!!\n * }\n * })\n *\n * @fires after:render at the end of the render process, receives the context in the callback\n * @fires before:render at start the render process, receives the context in the callback\n *\n * @fires contextmenu:before\n * @fires contextmenu\n * @example\n * let handler;\n * targets.forEach(target => {\n * target.on('contextmenu:before', opt => {\n * // decide which target should handle the event before canvas hijacks it\n * if (someCaseHappens && opt.targets.includes(target)) {\n * handler = target;\n * }\n * });\n * target.on('contextmenu', opt => {\n * // do something fantastic\n * });\n * });\n * canvas.on('contextmenu', opt => {\n * if (!handler) {\n * // no one takes responsibility, it's always left to me\n * // let's show them how it's done!\n * }\n * });\n *\n */\nexport class SelectableCanvas\n extends StaticCanvas\n implements Omit\n{\n declare _objects: FabricObject[];\n\n // transform config\n declare uniformScaling: boolean;\n declare uniScaleKey: TOptionalModifierKey;\n declare centeredScaling: boolean;\n declare centeredRotation: boolean;\n declare centeredKey: TOptionalModifierKey;\n declare altActionKey: TOptionalModifierKey;\n\n // selection config\n declare selection: boolean;\n declare selectionKey: TOptionalModifierKey | ModifierKey[];\n declare altSelectionKey: TOptionalModifierKey;\n declare selectionColor: string;\n declare selectionDashArray: number[];\n declare selectionBorderColor: string;\n declare selectionLineWidth: number;\n declare selectionFullyContained: boolean;\n\n // cursors\n declare hoverCursor: CSSStyleDeclaration['cursor'];\n declare moveCursor: CSSStyleDeclaration['cursor'];\n declare defaultCursor: CSSStyleDeclaration['cursor'];\n declare freeDrawingCursor: CSSStyleDeclaration['cursor'];\n declare notAllowedCursor: CSSStyleDeclaration['cursor'];\n\n declare containerClass: string;\n\n // target find config\n declare perPixelTargetFind: boolean;\n declare targetFindTolerance: number;\n declare skipTargetFind: boolean;\n\n /**\n * When true, mouse events on canvas (mousedown/mousemove/mouseup) result in free drawing.\n * After mousedown, mousemove creates a shape,\n * and then mouseup finalizes it and adds an instance of `fabric.Path` onto canvas.\n * @tutorial {@link http://fabricjs.com/fabric-intro-part-4#free_drawing}\n * @type Boolean\n */\n declare isDrawingMode: boolean;\n\n declare preserveObjectStacking: boolean;\n\n // event config\n declare stopContextMenu: boolean;\n declare fireRightClick: boolean;\n declare fireMiddleClick: boolean;\n\n /**\n * Keep track of the hovered target\n * @type FabricObject | null\n * @private\n */\n declare _hoveredTarget?: FabricObject;\n\n /**\n * hold the list of nested targets hovered\n * @type FabricObject[]\n * @private\n */\n _hoveredTargets: FabricObject[] = [];\n\n /**\n * hold the list of objects to render\n * @type FabricObject[]\n * @private\n */\n _objectsToRender?: FabricObject[];\n\n /**\n * hold a reference to a data structure that contains information\n * on the current on going transform\n * @type\n * @private\n */\n _currentTransform: Transform | null = null;\n\n /**\n * hold a reference to a data structure used to track the selection\n * box on canvas drag\n * on the current on going transform\n * x, y, deltaX and deltaY are in scene plane\n * @type\n * @private\n */\n protected _groupSelector: {\n x: number;\n y: number;\n deltaX: number;\n deltaY: number;\n } | null = null;\n\n /**\n * internal flag used to understand if the context top requires a cleanup\n * in case this is true, the contextTop will be cleared at the next render\n * @type boolean\n * @private\n */\n contextTopDirty = false;\n\n /**\n * During a mouse event we may need the pointer multiple times in multiple functions.\n * _scenePoint holds a reference to the pointer in fabricCanvas/design coordinates that is valid for the event\n * lifespan. Every fabricJS mouse event create and delete the cache every time\n * We do this because there are some HTML DOM inspection functions to get the actual pointer coordinates\n * @type {Point}\n */\n declare protected _scenePoint?: Point;\n\n /**\n * During a mouse event we may need the pointer multiple times in multiple functions.\n * _viewportPoint holds a reference to the pointer in html coordinates that is valid for the event\n * lifespan. Every fabricJS mouse event create and delete the cache every time\n * We do this because there are some HTML DOM inspection functions to get the actual pointer coordinates\n * @type {Point}\n */\n declare protected _viewportPoint?: Point;\n\n /**\n * Holds the informations we cache during an event lifespan\n * This data is needed many times during an event and we want to avoid to recalculate it\n * multuple times.\n */\n declare protected _targetInfo: FullTargetsInfoWithContainer | undefined;\n\n static ownDefaults = canvasDefaults;\n\n static getDefaults(): Record {\n return { ...super.getDefaults(), ...SelectableCanvas.ownDefaults };\n }\n\n declare elements: CanvasDOMManager;\n get upperCanvasEl() {\n return this.elements.upper?.el;\n }\n get contextTop() {\n return this.elements.upper?.ctx;\n }\n get wrapperEl() {\n return this.elements.container;\n }\n declare private pixelFindCanvasEl: HTMLCanvasElement;\n declare private pixelFindContext: CanvasRenderingContext2D;\n\n declare protected _isCurrentlyDrawing: boolean;\n declare freeDrawingBrush?: BaseBrush;\n declare _activeObject?: FabricObject;\n\n protected initElements(el?: string | HTMLCanvasElement) {\n this.elements = new CanvasDOMManager(el, {\n allowTouchScrolling: this.allowTouchScrolling,\n containerClass: this.containerClass,\n });\n this._createCacheCanvas();\n }\n\n /**\n * @private\n * @param {FabricObject} obj Object that was added\n */\n _onObjectAdded(obj: FabricObject) {\n this._objectsToRender = undefined;\n super._onObjectAdded(obj);\n }\n\n /**\n * @private\n * @param {FabricObject} obj Object that was removed\n */\n _onObjectRemoved(obj: FabricObject) {\n this._objectsToRender = undefined;\n // removing active object should fire \"selection:cleared\" events\n if (obj === this._activeObject) {\n this.fire('before:selection:cleared', { deselected: [obj] });\n this._discardActiveObject();\n this.fire('selection:cleared', { deselected: [obj] });\n obj.fire('deselected', {\n target: obj,\n });\n }\n if (obj === this._hoveredTarget) {\n this._hoveredTarget = undefined;\n this._hoveredTargets = [];\n }\n super._onObjectRemoved(obj);\n }\n\n _onStackOrderChanged() {\n this._objectsToRender = undefined;\n super._onStackOrderChanged();\n }\n\n /**\n * Divides objects in two groups, one to render immediately\n * and one to render as activeGroup.\n * @return {Array} objects to render immediately and pushes the other in the activeGroup.\n */\n _chooseObjectsToRender(): FabricObject[] {\n const activeObject = this._activeObject;\n return !this.preserveObjectStacking && activeObject\n ? this._objects\n .filter((object) => !object.group && object !== activeObject)\n .concat(activeObject)\n : this._objects;\n }\n\n /**\n * Renders both the top canvas and the secondary container canvas.\n */\n renderAll() {\n this.cancelRequestedRender();\n if (this.destroyed) {\n return;\n }\n if (this.contextTopDirty && !this._groupSelector && !this.isDrawingMode) {\n this.clearContext(this.contextTop);\n this.contextTopDirty = false;\n }\n if (this.hasLostContext) {\n this.renderTopLayer(this.contextTop);\n this.hasLostContext = false;\n }\n !this._objectsToRender &&\n (this._objectsToRender = this._chooseObjectsToRender());\n this.renderCanvas(this.getContext(), this._objectsToRender);\n }\n\n /**\n * text selection is rendered by the active text instance during the rendering cycle\n */\n renderTopLayer(ctx: CanvasRenderingContext2D): void {\n ctx.save();\n if (this.isDrawingMode && this._isCurrentlyDrawing) {\n this.freeDrawingBrush && this.freeDrawingBrush._render();\n this.contextTopDirty = true;\n }\n // we render the top context - last object\n if (this.selection && this._groupSelector) {\n this._drawSelection(ctx);\n this.contextTopDirty = true;\n }\n ctx.restore();\n }\n\n /**\n * Method to render only the top canvas.\n * Also used to render the group selection box.\n * Does not render text selection.\n */\n renderTop() {\n const ctx = this.contextTop;\n this.clearContext(ctx);\n this.renderTopLayer(ctx);\n // todo: how do i know if the after:render is for the top or normal contex?\n this.fire('after:render', { ctx });\n }\n\n /**\n * Set the canvas tolerance value for pixel taret find.\n * Use only integer numbers.\n * @private\n */\n setTargetFindTolerance(value: number) {\n value = Math.round(value);\n this.targetFindTolerance = value;\n const retina = this.getRetinaScaling();\n const size = Math.ceil((value * 2 + 1) * retina);\n this.pixelFindCanvasEl.width = this.pixelFindCanvasEl.height = size;\n this.pixelFindContext.scale(retina, retina);\n }\n\n /**\n * Returns true if object is transparent at a certain location\n * Clarification: this is `is target transparent at location X or are controls there`\n * @TODO this seems dumb that we treat controls with transparency. we can find controls\n * programmatically without painting them, the cache canvas optimization is always valid\n * @param {FabricObject} target Object to check\n * @param {Number} x Left coordinate in viewport space\n * @param {Number} y Top coordinate in viewport space\n * @return {Boolean}\n */\n isTargetTransparent(target: FabricObject, x: number, y: number): boolean {\n const tolerance = this.targetFindTolerance;\n const ctx = this.pixelFindContext;\n this.clearContext(ctx);\n ctx.save();\n ctx.translate(-x + tolerance, -y + tolerance);\n ctx.transform(...this.viewportTransform);\n const selectionBgc = target.selectionBackgroundColor;\n target.selectionBackgroundColor = '';\n target.render(ctx);\n target.selectionBackgroundColor = selectionBgc;\n ctx.restore();\n // our canvas is square, and made around tolerance.\n // so tolerance in this case also represent the center of the canvas.\n const enhancedTolerance = Math.round(tolerance * this.getRetinaScaling());\n return isTransparent(\n ctx,\n enhancedTolerance,\n enhancedTolerance,\n enhancedTolerance,\n );\n }\n\n /**\n * takes an event and determines if selection key has been pressed\n * @private\n * @param {TPointerEvent} e Event object\n */\n _isSelectionKeyPressed(e: TPointerEvent): boolean {\n const sKey = this.selectionKey;\n if (!sKey) {\n return false;\n }\n if (Array.isArray(sKey)) {\n return !!sKey.find((key) => !!key && e[key] === true);\n } else {\n return e[sKey];\n }\n }\n\n /**\n * @private\n * @param {TPointerEvent} e Event object\n * @param {FabricObject} target\n */\n _shouldClearSelection(\n e: TPointerEvent,\n target?: FabricObject,\n ): target is undefined {\n const activeObjects = this.getActiveObjects(),\n activeObject = this._activeObject;\n\n return !!(\n !target ||\n (target &&\n activeObject &&\n activeObjects.length > 1 &&\n activeObjects.indexOf(target) === -1 &&\n activeObject !== target &&\n !this._isSelectionKeyPressed(e)) ||\n (target && !target.evented) ||\n (target && !target.selectable && activeObject && activeObject !== target)\n );\n }\n\n /**\n * This method will take in consideration a modifier key pressed and the control we are\n * about to drag, and try to guess the anchor point ( origin ) of the transormation.\n * This should be really in the realm of controls, and we should remove specific code for legacy\n * embedded actions.\n * @TODO this probably deserve discussion/rediscovery and change/refactor\n * @private\n * @deprecated\n * @param {FabricObject} target\n * @param {string} action\n * @param {boolean} altKey\n * @returns {boolean} true if the transformation should be centered\n */\n private _shouldCenterTransform(\n target: FabricObject,\n action: string,\n modifierKeyPressed: boolean,\n ) {\n if (!target) {\n return;\n }\n\n let centerTransform;\n\n if (\n action === SCALE ||\n action === SCALE_X ||\n action === SCALE_Y ||\n action === RESIZING\n ) {\n centerTransform = this.centeredScaling || target.centeredScaling;\n } else if (action === ROTATE) {\n centerTransform = this.centeredRotation || target.centeredRotation;\n }\n\n return centerTransform ? !modifierKeyPressed : modifierKeyPressed;\n }\n\n /**\n * Given the control clicked, determine the origin of the transform.\n * This is bad because controls can totally have custom names\n * should disappear before release 4.0\n * @private\n * @deprecated\n */\n _getOriginFromCorner(\n target: FabricObject,\n controlName: string,\n ): { x: TOriginX; y: TOriginY } {\n const origin = {\n x: target.originX,\n y: target.originY,\n };\n\n if (!controlName) {\n return origin;\n }\n\n // is a left control ?\n if (['ml', 'tl', 'bl'].includes(controlName)) {\n origin.x = RIGHT;\n // is a right control ?\n } else if (['mr', 'tr', 'br'].includes(controlName)) {\n origin.x = LEFT;\n }\n // is a top control ?\n if (['tl', 'mt', 'tr'].includes(controlName)) {\n origin.y = BOTTOM;\n // is a bottom control ?\n } else if (['bl', 'mb', 'br'].includes(controlName)) {\n origin.y = TOP;\n }\n return origin;\n }\n\n /**\n * @private\n * @param {Event} e Event object\n * @param {FabricObject} target\n * @param {boolean} [alreadySelected] pass true to setup the active control\n */\n _setupCurrentTransform(\n e: TPointerEvent,\n target: FabricObject,\n alreadySelected: boolean,\n ): void {\n const pointer = target.group\n ? // transform pointer to target's containing coordinate plane\n sendPointToPlane(\n this.getScenePoint(e),\n undefined,\n target.group.calcTransformMatrix(),\n )\n : this.getScenePoint(e);\n const { key: corner = '', control } = target.getActiveControl() || {},\n actionHandler =\n alreadySelected && control\n ? control.getActionHandler(e, target, control)?.bind(control)\n : dragHandler,\n action = getActionFromCorner(alreadySelected, corner, e, target),\n altKey = e[this.centeredKey as ModifierKey],\n origin = this._shouldCenterTransform(target, action, altKey)\n ? ({ x: CENTER, y: CENTER } as const)\n : this._getOriginFromCorner(target, corner),\n /**\n * relative to target's containing coordinate plane\n * both agree on every point\n **/\n transform: Transform = {\n target: target,\n action,\n actionHandler,\n actionPerformed: false,\n corner,\n scaleX: target.scaleX,\n scaleY: target.scaleY,\n skewX: target.skewX,\n skewY: target.skewY,\n offsetX: pointer.x - target.left,\n offsetY: pointer.y - target.top,\n originX: origin.x,\n originY: origin.y,\n ex: pointer.x,\n ey: pointer.y,\n lastX: pointer.x,\n lastY: pointer.y,\n theta: degreesToRadians(target.angle),\n width: target.width,\n height: target.height,\n shiftKey: e.shiftKey,\n altKey,\n original: {\n ...saveObjectTransform(target),\n originX: origin.x,\n originY: origin.y,\n },\n };\n\n this._currentTransform = transform;\n\n this.fire('before:transform', {\n e,\n transform,\n });\n }\n\n /**\n * Set the cursor type of the canvas element\n * @param {String} value Cursor type of the canvas element.\n * @see http://www.w3.org/TR/css3-ui/#cursor\n */\n setCursor(value: CSSStyleDeclaration['cursor']): void {\n this.upperCanvasEl.style.cursor = value;\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx to draw the selection on\n */\n _drawSelection(ctx: CanvasRenderingContext2D): void {\n const { x, y, deltaX, deltaY } = this._groupSelector!,\n start = new Point(x, y).transform(this.viewportTransform),\n extent = new Point(x + deltaX, y + deltaY).transform(\n this.viewportTransform,\n ),\n strokeOffset = this.selectionLineWidth / 2;\n let minX = Math.min(start.x, extent.x),\n minY = Math.min(start.y, extent.y),\n maxX = Math.max(start.x, extent.x),\n maxY = Math.max(start.y, extent.y);\n\n if (this.selectionColor) {\n ctx.fillStyle = this.selectionColor;\n ctx.fillRect(minX, minY, maxX - minX, maxY - minY);\n }\n\n if (!this.selectionLineWidth || !this.selectionBorderColor) {\n return;\n }\n ctx.lineWidth = this.selectionLineWidth;\n ctx.strokeStyle = this.selectionBorderColor;\n\n minX += strokeOffset;\n minY += strokeOffset;\n maxX -= strokeOffset;\n maxY -= strokeOffset;\n // selection border\n // @TODO: is _setLineDash still necessary on modern canvas?\n FabricObject.prototype._setLineDash.call(\n this,\n ctx,\n this.selectionDashArray,\n );\n ctx.strokeRect(minX, minY, maxX - minX, maxY - minY);\n }\n\n /**\n * This function is in charge of deciding which is the object that is the current target of an interaction event.\n * For interaction event we mean a pointer related action on the canvas.\n * Which is the\n * 11/09/2018 TODO: would be cool if findTarget could discern between being a full target\n * or the outside part of the corner.\n * @param {Event} e mouse event\n * @return {TargetsInfoWithContainer} the target found\n */\n findTarget(e: TPointerEvent): FullTargetsInfoWithContainer {\n // this._targetInfo is cached by _cacheTransformEventData\n // and destroyed by _resetTransformEventData\n if (this._targetInfo) {\n return this._targetInfo;\n }\n\n if (this.skipTargetFind) {\n return {\n subTargets: [],\n currentSubTargets: [],\n };\n }\n\n const pointer = this.getScenePoint(e),\n activeObject = this._activeObject,\n aObjects = this.getActiveObjects(),\n targetInfo = this.searchPossibleTargets(this._objects, pointer);\n\n const {\n subTargets: currentSubTargets,\n container: currentContainer,\n target: currentTarget,\n } = targetInfo;\n\n const fullTargetInfo: FullTargetsInfoWithContainer = {\n ...targetInfo,\n currentSubTargets,\n currentContainer,\n currentTarget,\n };\n\n // simplest case no active object, return a new target\n if (!activeObject) {\n return fullTargetInfo;\n }\n\n // check pointer is over active selection and possibly perform `subTargetCheck`\n const activeObjectTargetInfo: FullTargetsInfoWithContainer = {\n ...this.searchPossibleTargets([activeObject], pointer),\n currentSubTargets,\n currentContainer,\n currentTarget,\n };\n\n const activeObjectControl = activeObject.findControl(\n this.getViewportPoint(e),\n isTouchEvent(e),\n );\n\n // we are clicking exactly the control of an active object, shortcut to that object.\n if (activeObjectControl) {\n return {\n ...activeObjectTargetInfo,\n target: activeObject, // we override target in case we are in the outside part of the corner.\n };\n }\n\n // in case we are over the active object\n if (activeObjectTargetInfo.target) {\n if (aObjects.length > 1) {\n // in case of active selection and target hit over the activeSelection, just exit\n // TODO Verify if we need to override target with container\n return activeObjectTargetInfo;\n }\n // from here onward not an active selection, just an activeOject that maybe is a group\n\n // preserveObjectStacking is false, so activeObject is drawn on top, just return activeObject\n if (!this.preserveObjectStacking) {\n // TODO Verify if we need to override target with container\n return activeObjectTargetInfo;\n }\n\n // In case we are in preserveObjectStacking ( selection in stack )\n // there is the possibility to force with `altSelectionKey` to return the activeObject\n // from any point in the stack, even if we have another object completely on top of it.\n if (\n this.preserveObjectStacking &&\n e[this.altSelectionKey as ModifierKey]\n ) {\n // TODO Verify if we need to override target with container\n return activeObjectTargetInfo;\n }\n }\n\n // we have an active object, but we ruled out it being our target in any way.\n return fullTargetInfo;\n }\n\n /**\n * Checks if the point is inside the object selection area including padding\n * @param {FabricObject} obj Object to test against\n * @param {Object} [pointer] point in scene coordinates\n * @return {Boolean} true if point is contained within an area of given object\n * @private\n */\n private _pointIsInObjectSelectionArea(obj: FabricObject, point: Point) {\n // getCoords will already take care of group de-nesting\n let coords = obj.getCoords();\n const viewportZoom = this.getZoom();\n const padding = obj.padding / viewportZoom;\n if (padding) {\n const [tl, tr, br, bl] = coords;\n // what is the angle of the object?\n // we could use getTotalAngle, but is way easier to look at it\n // from how coords are oriented, since if something went wrong\n // at least we are consistent.\n const angleRadians = Math.atan2(tr.y - tl.y, tr.x - tl.x),\n cosP = cos(angleRadians) * padding,\n sinP = sin(angleRadians) * padding,\n cosPSinP = cosP + sinP,\n cosPMinusSinP = cosP - sinP;\n\n coords = [\n new Point(tl.x - cosPMinusSinP, tl.y - cosPSinP),\n new Point(tr.x + cosPSinP, tr.y - cosPMinusSinP),\n new Point(br.x + cosPMinusSinP, br.y + cosPSinP),\n new Point(bl.x - cosPSinP, bl.y + cosPMinusSinP),\n ];\n // in case of padding we calculate the new coords on the fly.\n // otherwise we have to maintain 2 sets of coordinates for everything.\n // we can reiterate on storing them.\n // if this is slow, for now the semplification is large and doesn't impact\n // rendering.\n // the idea behind this is that outside target check we don't need ot know\n // where those coords are\n }\n return Intersection.isPointInPolygon(point, coords);\n }\n\n /**\n * Checks point is inside the object selection condition. Either area with padding\n * or over pixels if perPixelTargetFind is enabled\n * @param {FabricObject} obj Object to test against\n * @param {Point} pointer point from scene.\n * @return {Boolean} true if point is contained within an area of given object\n * @private\n */\n _checkTarget(obj: FabricObject, pointer: Point): boolean {\n if (\n obj &&\n obj.visible &&\n obj.evented &&\n this._pointIsInObjectSelectionArea(obj, pointer)\n ) {\n if (\n (this.perPixelTargetFind || obj.perPixelTargetFind) &&\n !(obj as unknown as IText).isEditing\n ) {\n const viewportPoint = pointer.transform(this.viewportTransform);\n if (!this.isTargetTransparent(obj, viewportPoint.x, viewportPoint.y)) {\n return true;\n }\n } else {\n return true;\n }\n }\n return false;\n }\n\n /**\n * Given an array of objects search possible targets under the pointer position\n * Returns an\n * @param {Array} objects objects array to look into\n * @param {Object} pointer x,y object of point of scene coordinates we want to check.\n * @param {Object} subTargets If passed, subtargets will be collected inside the array\n * @return {TargetsInfo} **top most object from given `objects`** that contains pointer\n * @private\n */\n _searchPossibleTargets(\n objects: FabricObject[],\n pointer: Point,\n subTargets: FabricObject[],\n ): TargetsInfo {\n let i = objects.length;\n // Do not check for currently grouped objects, since we check the parent group itself.\n // until we call this function specifically to search inside the activeGroup\n while (i--) {\n const target = objects[i];\n if (this._checkTarget(target, pointer)) {\n if (isCollection(target) && target.subTargetCheck) {\n const { target: subTarget } = this._searchPossibleTargets(\n target._objects,\n pointer,\n subTargets,\n );\n subTarget && subTargets.push(subTarget);\n }\n return {\n target,\n subTargets,\n };\n }\n }\n return {\n subTargets: [],\n };\n }\n\n /**\n * Search inside an objects array the fiurst object that contains pointer\n * Collect subTargets of that object inside the subTargets array passed as parameter\n * @param {FabricObject[]} objects objects array to look into\n * @param {Point} pointer coordinates from viewport to check.\n * @return {FabricObject} **top most object on screen** that contains pointer\n */\n searchPossibleTargets(\n objects: FabricObject[],\n pointer: Point,\n ): TargetsInfoWithContainer {\n const targetInfo: TargetsInfoWithContainer = this._searchPossibleTargets(\n objects,\n pointer,\n [],\n );\n\n // outermost target is the container.\n targetInfo.container = targetInfo.target;\n const { container, subTargets } = targetInfo;\n\n if (\n container &&\n isCollection(container) &&\n container.interactive &&\n subTargets[0]\n ) {\n /** subTargets[0] is the innermost nested target, but it could be inside non interactive groups\n * and so not a possible selection target.\n * We loop the array from the end that is outermost innertarget.\n */\n for (let i = subTargets.length - 1; i > 0; i--) {\n const t = subTargets[i];\n if (!(isCollection(t) && t.interactive)) {\n // one of the subtargets was not interactive. that is the last subtarget we can return.\n // we can't dig more deep;\n targetInfo.target = t;\n return targetInfo;\n }\n }\n targetInfo.target = subTargets[0];\n return targetInfo;\n }\n\n return targetInfo;\n }\n\n /**\n * @returns point existing in the same plane as the {@link HTMLCanvasElement},\n * `(0, 0)` being the top left corner of the {@link HTMLCanvasElement}.\n * This means that changes to the {@link viewportTransform} do not change the values of the point\n * and it remains unchanged from the viewer's perspective.\n *\n * @example\n * const scenePoint = sendPointToPlane(\n * this.getViewportPoint(e),\n * undefined,\n * canvas.viewportTransform\n * );\n *\n */\n getViewportPoint(e: TPointerEvent) {\n if (this._viewportPoint) {\n return this._viewportPoint;\n }\n return this._getPointerImpl(e, true);\n }\n\n /**\n * @returns point existing in the scene (the same plane as the plane {@link FabricObject#getCenterPoint} exists in).\n * This means that changes to the {@link viewportTransform} do not change the values of the point,\n * however, from the viewer's perspective, the point is changed.\n *\n * @example\n * const viewportPoint = sendPointToPlane(\n * this.getScenePoint(e),\n * canvas.viewportTransform\n * );\n *\n */\n getScenePoint(e: TPointerEvent) {\n if (this._scenePoint) {\n return this._scenePoint;\n }\n return this._getPointerImpl(e);\n }\n\n /**\n * Returns pointer relative to canvas.\n *\n * Use {@link getViewportPoint} or {@link getScenePoint} instead.\n *\n * @param {Event} e\n * @param {Boolean} [fromViewport] whether to return the point from the viewport or in the scene\n * @return {Point}\n */\n protected _getPointerImpl(e: TPointerEvent, fromViewport = false): Point {\n const upperCanvasEl = this.upperCanvasEl,\n bounds = upperCanvasEl.getBoundingClientRect();\n let pointer = getPointer(e),\n boundsWidth = bounds.width || 0,\n boundsHeight = bounds.height || 0;\n\n if (!boundsWidth || !boundsHeight) {\n if (TOP in bounds && BOTTOM in bounds) {\n boundsHeight = Math.abs(bounds.top - bounds.bottom);\n }\n if (RIGHT in bounds && LEFT in bounds) {\n boundsWidth = Math.abs(bounds.right - bounds.left);\n }\n }\n\n this.calcOffset();\n pointer.x = pointer.x - this._offset.left;\n pointer.y = pointer.y - this._offset.top;\n if (!fromViewport) {\n pointer = sendPointToPlane(pointer, undefined, this.viewportTransform);\n }\n\n const retinaScaling = this.getRetinaScaling();\n if (retinaScaling !== 1) {\n pointer.x /= retinaScaling;\n pointer.y /= retinaScaling;\n }\n\n // If bounds are not available (i.e. not visible), do not apply scale.\n const cssScale =\n boundsWidth === 0 || boundsHeight === 0\n ? new Point(1, 1)\n : new Point(\n upperCanvasEl.width / boundsWidth,\n upperCanvasEl.height / boundsHeight,\n );\n\n return pointer.multiply(cssScale);\n }\n\n /**\n * Internal use only\n * @protected\n */\n protected _setDimensionsImpl(\n dimensions: TSize,\n options?: TCanvasSizeOptions,\n ) {\n // @ts-expect-error this method exists in the subclass - should be moved or declared as abstract\n this._resetTransformEventData();\n super._setDimensionsImpl(dimensions, options);\n if (this._isCurrentlyDrawing) {\n this.freeDrawingBrush &&\n this.freeDrawingBrush._setBrushStyles(this.contextTop);\n }\n }\n\n protected _createCacheCanvas() {\n this.pixelFindCanvasEl = createCanvasElement();\n this.pixelFindContext = this.pixelFindCanvasEl.getContext('2d', {\n willReadFrequently: true,\n })!;\n this.setTargetFindTolerance(this.targetFindTolerance);\n }\n\n /**\n * Returns context of top canvas where interactions are drawn\n * @returns {CanvasRenderingContext2D}\n */\n getTopContext(): CanvasRenderingContext2D {\n return this.elements.upper.ctx;\n }\n\n /**\n * Returns context of canvas where object selection is drawn\n * @alias\n * @return {CanvasRenderingContext2D}\n */\n getSelectionContext(): CanvasRenderingContext2D {\n return this.elements.upper.ctx;\n }\n\n /**\n * Returns <canvas> element on which object selection is drawn\n * @return {HTMLCanvasElement}\n */\n getSelectionElement(): HTMLCanvasElement {\n return this.elements.upper.el;\n }\n\n /**\n * Returns currently active object\n * @return {FabricObject | null} active object\n */\n getActiveObject(): FabricObject | undefined {\n return this._activeObject;\n }\n\n /**\n * Returns an array with the current selected objects\n * @return {FabricObject[]} active objects array\n */\n getActiveObjects(): FabricObject[] {\n const active = this._activeObject;\n return isActiveSelection(active)\n ? active.getObjects()\n : active\n ? [active]\n : [];\n }\n\n /**\n * @private\n * Compares the old activeObject with the current one and fires correct events\n * @param {FabricObject[]} oldObjects old activeObject\n * @param {TPointerEvent} e mouse event triggering the selection events\n */\n _fireSelectionEvents(oldObjects: FabricObject[], e?: TPointerEvent) {\n let somethingChanged = false,\n invalidate = false;\n const objects = this.getActiveObjects(),\n added: FabricObject[] = [],\n removed: FabricObject[] = [];\n\n oldObjects.forEach((target) => {\n if (!objects.includes(target)) {\n somethingChanged = true;\n target.fire('deselected', {\n e,\n target,\n });\n removed.push(target);\n }\n });\n\n objects.forEach((target) => {\n if (!oldObjects.includes(target)) {\n somethingChanged = true;\n target.fire('selected', {\n e,\n target,\n });\n added.push(target);\n }\n });\n\n if (oldObjects.length > 0 && objects.length > 0) {\n invalidate = true;\n somethingChanged &&\n this.fire('selection:updated', {\n e,\n selected: added,\n deselected: removed,\n });\n } else if (objects.length > 0) {\n invalidate = true;\n this.fire('selection:created', {\n e,\n selected: added,\n });\n } else if (oldObjects.length > 0) {\n invalidate = true;\n this.fire('selection:cleared', {\n e,\n deselected: removed,\n });\n }\n invalidate && (this._objectsToRender = undefined);\n }\n\n /**\n * Sets given object as the only active object on canvas\n * @param {FabricObject} object Object to set as an active one\n * @param {TPointerEvent} [e] Event (passed along when firing \"object:selected\")\n * @return {Boolean} true if the object has been selected\n */\n setActiveObject(object: FabricObject, e?: TPointerEvent) {\n // we can't inline this, since _setActiveObject will change what getActiveObjects returns\n const currentActives = this.getActiveObjects();\n const selected = this._setActiveObject(object, e);\n this._fireSelectionEvents(currentActives, e);\n return selected;\n }\n\n /**\n * This is supposed to be equivalent to setActiveObject but without firing\n * any event. There is commitment to have this stay this way.\n * This is the functional part of setActiveObject.\n * @param {Object} object to set as active\n * @param {Event} [e] Event (passed along when firing \"object:selected\")\n * @return {Boolean} true if the object has been selected\n */\n _setActiveObject(object: FabricObject, e?: TPointerEvent) {\n const prevActiveObject = this._activeObject;\n if (prevActiveObject === object) {\n return false;\n }\n // after calling this._discardActiveObject, this,_activeObject could be undefined\n if (!this._discardActiveObject(e, object) && this._activeObject) {\n // refused to deselect\n return false;\n }\n if (object.onSelect({ e })) {\n return false;\n }\n\n this._activeObject = object;\n\n if (isActiveSelection(object) && prevActiveObject !== object) {\n object.set('canvas', this);\n }\n object.setCoords();\n\n return true;\n }\n\n /**\n * This is supposed to be equivalent to discardActiveObject but without firing\n * any selection events ( can still fire object transformation events ). There is commitment to have this stay this way.\n * This is the functional part of discardActiveObject.\n * @param {Event} [e] Event (passed along when firing \"object:deselected\")\n * @param {Object} object the next object to set as active, reason why we are discarding this\n * @return {Boolean} true if the active object has been discarded\n */\n _discardActiveObject(\n e?: TPointerEvent,\n object?: FabricObject,\n ): this is { _activeObject: undefined } {\n const obj = this._activeObject;\n if (obj) {\n // onDeselect return TRUE to cancel selection;\n if (obj.onDeselect({ e, object })) {\n return false;\n }\n if (this._currentTransform && this._currentTransform.target === obj) {\n this.endCurrentTransform(e);\n }\n if (isActiveSelection(obj) && obj === this._hoveredTarget) {\n this._hoveredTarget = undefined;\n }\n this._activeObject = undefined;\n return true;\n }\n return false;\n }\n\n /**\n * Discards currently active object and fire events. If the function is called by fabric\n * as a consequence of a mouse event, the event is passed as a parameter and\n * sent to the fire function for the custom events. When used as a method the\n * e param does not have any application.\n * @param {event} e\n * @return {Boolean} true if the active object has been discarded\n */\n discardActiveObject(e?: TPointerEvent): this is { _activeObject: undefined } {\n const currentActives = this.getActiveObjects(),\n activeObject = this.getActiveObject();\n if (currentActives.length) {\n this.fire('before:selection:cleared', {\n e,\n deselected: [activeObject!],\n });\n }\n const discarded = this._discardActiveObject(e);\n this._fireSelectionEvents(currentActives, e);\n return discarded;\n }\n\n /**\n * End the current transform.\n * You don't usually need to call this method unless you are interrupting a user initiated transform\n * because of some other event ( a press of key combination, or something that block the user UX )\n * @param {Event} [e] send the mouse event that generate the finalize down, so it can be used in the event\n */\n endCurrentTransform(e?: TPointerEvent) {\n const transform = this._currentTransform;\n this._finalizeCurrentTransform(e);\n if (transform && transform.target) {\n // this could probably go inside _finalizeCurrentTransform\n transform.target.isMoving = false;\n }\n this._currentTransform = null;\n }\n\n /**\n * @private\n * @param {Event} e send the mouse event that generate the finalize down, so it can be used in the event\n */\n _finalizeCurrentTransform(e?: TPointerEvent) {\n const transform = this._currentTransform!,\n target = transform.target,\n options = {\n e,\n target,\n transform,\n action: transform.action,\n };\n\n if (target._scaling) {\n target._scaling = false;\n }\n\n target.setCoords();\n\n if (transform.actionPerformed) {\n this.fire('object:modified', options);\n target.fire(MODIFIED, options);\n }\n }\n\n /**\n * Sets viewport transformation of this canvas instance\n * @param {Array} vpt a Canvas 2D API transform matrix\n */\n setViewportTransform(vpt: TMat2D) {\n super.setViewportTransform(vpt);\n const activeObject = this._activeObject;\n if (activeObject) {\n activeObject.setCoords();\n }\n }\n\n /**\n * @override clears active selection ref and interactive canvas elements and contexts\n */\n destroy() {\n // dispose of active selection\n const activeObject = this._activeObject;\n if (isActiveSelection(activeObject)) {\n activeObject.removeAll();\n activeObject.dispose();\n }\n\n delete this._activeObject;\n\n super.destroy();\n\n // free resources\n\n // pixel find canvas\n // @ts-expect-error disposing\n this.pixelFindContext = null;\n // @ts-expect-error disposing\n this.pixelFindCanvasEl = undefined;\n }\n\n /**\n * Clears all contexts (background, main, top) of an instance\n */\n clear() {\n // discard active object and fire events\n this.discardActiveObject();\n // make sure we clear the active object in case it refused to be discarded\n this._activeObject = undefined;\n this.clearContext(this.contextTop);\n super.clear();\n }\n\n /**\n * Draws objects' controls (borders/controls)\n * @param {CanvasRenderingContext2D} ctx Context to render controls on\n */\n drawControls(ctx: CanvasRenderingContext2D) {\n const activeObject = this._activeObject;\n\n if (activeObject) {\n activeObject._renderControls(ctx);\n }\n }\n\n /**\n * @private\n */\n protected _toObject(\n instance: FabricObject,\n methodName: 'toObject' | 'toDatalessObject',\n propertiesToInclude: string[],\n ): Record {\n // If the object is part of the current selection group, it should\n // be transformed appropriately\n // i.e. it should be serialised as it would appear if the selection group\n // were to be destroyed.\n const originalProperties = this._realizeGroupTransformOnObject(instance),\n object = super._toObject(instance, methodName, propertiesToInclude);\n //Undo the damage we did by changing all of its properties\n instance.set(originalProperties);\n return object;\n }\n\n /**\n * Realizes an object's group transformation on it\n * @private\n * @param {FabricObject} [instance] the object to transform (gets mutated)\n * @returns the original values of instance which were changed\n */\n private _realizeGroupTransformOnObject(\n instance: FabricObject,\n ): Partial {\n const { group } = instance;\n if (group && isActiveSelection(group) && this._activeObject === group) {\n const layoutProps = [\n 'angle',\n 'flipX',\n 'flipY',\n LEFT,\n SCALE_X,\n SCALE_Y,\n SKEW_X,\n SKEW_Y,\n TOP,\n ] as (keyof typeof instance)[];\n const originalValues = pick(instance, layoutProps);\n addTransformToObject(instance, group.calcOwnMatrix());\n return originalValues;\n } else {\n return {};\n }\n }\n\n /**\n * @private\n */\n _setSVGObject(\n markup: string[],\n instance: FabricObject,\n reviver?: TSVGReviver,\n ) {\n // If the object is in a selection group, simulate what would happen to that\n // object when the group is deselected\n const originalProperties = this._realizeGroupTransformOnObject(instance);\n super._setSVGObject(markup, instance, reviver);\n instance.set(originalProperties);\n }\n}\n","import type { TPointerEvent } from '../EventTypeDefs';\nimport type { ITextBehavior } from '../shapes/IText/ITextBehavior';\nimport { removeFromArray } from '../util/internals/removeFromArray';\nimport type { Canvas } from './Canvas';\n\n/**\n * In charge of synchronizing all interactive text instances of a canvas\n */\nexport class TextEditingManager {\n private targets: ITextBehavior[] = [];\n declare private target?: ITextBehavior;\n private __disposer: VoidFunction;\n\n constructor(canvas: Canvas) {\n const cb = () => {\n const { hiddenTextarea } =\n (canvas.getActiveObject() as ITextBehavior) || {};\n hiddenTextarea && hiddenTextarea.focus();\n };\n const el = canvas.upperCanvasEl;\n el.addEventListener('click', cb);\n this.__disposer = () => el.removeEventListener('click', cb);\n }\n\n exitTextEditing() {\n this.target = undefined;\n this.targets.forEach((target) => {\n if (target.isEditing) {\n target.exitEditing();\n }\n });\n }\n\n add(target: ITextBehavior) {\n this.targets.push(target);\n }\n\n remove(target: ITextBehavior) {\n this.unregister(target);\n removeFromArray(this.targets, target);\n }\n\n register(target: ITextBehavior) {\n this.target = target;\n }\n\n unregister(target: ITextBehavior) {\n if (target === this.target) {\n this.target = undefined;\n }\n }\n\n onMouseMove(e: TPointerEvent) {\n this.target?.isEditing && this.target.updateSelectionOnMouseMove(e);\n }\n\n clear() {\n this.targets = [];\n this.target = undefined;\n }\n\n dispose() {\n this.clear();\n this.__disposer();\n // @ts-expect-error disposing\n delete this.__disposer;\n }\n}\n","import { classRegistry } from '../ClassRegistry';\nimport { NONE } from '../constants';\nimport type {\n CanvasEvents,\n DragEventData,\n ObjectEvents,\n TEventsExtraData,\n TPointerEvent,\n TPointerEventNames,\n Transform,\n} from '../EventTypeDefs';\nimport { Point } from '../Point';\nimport type { ActiveSelection } from '../shapes/ActiveSelection';\nimport type { Group } from '../shapes/Group';\nimport type { IText } from '../shapes/IText/IText';\nimport type { FabricObject } from '../shapes/Object/FabricObject';\nimport { isTouchEvent, stopEvent } from '../util/dom_event';\nimport { getDocumentFromElement, getWindowFromElement } from '../util/dom_misc';\nimport { sendPointToPlane } from '../util/misc/planeChange';\nimport { isActiveSelection } from '../util/typeAssertions';\nimport type { CanvasOptions, TCanvasOptions } from './CanvasOptions';\nimport { SelectableCanvas } from './SelectableCanvas';\nimport { TextEditingManager } from './TextEditingManager';\n\nconst addEventOptions = { passive: false } as EventListenerOptions;\n\nconst getEventPoints = (canvas: Canvas, e: TPointerEvent) => {\n const viewportPoint = canvas.getViewportPoint(e);\n const scenePoint = canvas.getScenePoint(e);\n return {\n viewportPoint,\n scenePoint,\n };\n};\n\n// just to be clear, the utils are now deprecated and those are here exactly as minifier helpers\n// because el.addEventListener can't me be minified while a const yes and we use it 47 times in this file.\n// few bytes but why give it away.\nconst addListener = (\n el: HTMLElement | Document,\n ...args: Parameters\n) => el.addEventListener(...args);\nconst removeListener = (\n el: HTMLElement | Document,\n ...args: Parameters\n) => el.removeEventListener(...args);\n\nconst syntheticEventConfig = {\n mouse: {\n in: 'over',\n out: 'out',\n targetIn: 'mouseover',\n targetOut: 'mouseout',\n canvasIn: 'mouse:over',\n canvasOut: 'mouse:out',\n },\n drag: {\n in: 'enter',\n out: 'leave',\n targetIn: 'dragenter',\n targetOut: 'dragleave',\n canvasIn: 'drag:enter',\n canvasOut: 'drag:leave',\n },\n} as const;\n\ntype TSyntheticEventContext = {\n mouse: { e: TPointerEvent };\n drag: DragEventData;\n};\n\nexport class Canvas extends SelectableCanvas implements CanvasOptions {\n /**\n * Contains the id of the touch event that owns the fabric transform\n * @type Number\n * @private\n */\n declare mainTouchId?: number;\n\n declare enablePointerEvents: boolean;\n\n /**\n * Holds a reference to a setTimeout timer for event synchronization\n * @type number\n * @private\n */\n declare private _willAddMouseDown: number;\n\n /**\n * Holds a reference to an object on the canvas that is receiving the drag over event.\n * @type FabricObject\n * @private\n */\n declare private _draggedoverTarget?: FabricObject;\n\n /**\n * Holds a reference to an object on the canvas from where the drag operation started\n * @type FabricObject\n * @private\n */\n declare private _dragSource?: FabricObject;\n\n /**\n * Holds a reference to an object on the canvas that is the current drop target\n * May differ from {@link _draggedoverTarget}\n * @todo inspect whether {@link _draggedoverTarget} and {@link _dropTarget} should be merged somehow\n * @type FabricObject\n * @private\n */\n declare private _dropTarget: FabricObject | undefined;\n\n /**\n * a boolean that keeps track of the click state during a cycle of mouse down/up.\n * If a mouse move occurs it becomes false.\n * Is true by default, turns false on mouse move.\n * Used to determine if a mouseUp is a click\n */\n private _isClick: boolean;\n\n textEditingManager = new TextEditingManager(this);\n\n constructor(el?: string | HTMLCanvasElement, options: TCanvasOptions = {}) {\n super(el, options);\n // bind event handlers\n (\n [\n '_onMouseDown',\n '_onTouchStart',\n '_onMouseMove',\n '_onMouseUp',\n '_onTouchEnd',\n '_onResize',\n // '_onGesture',\n // '_onDrag',\n // '_onShake',\n // '_onLongPress',\n // '_onOrientationChange',\n '_onMouseWheel',\n '_onMouseOut',\n '_onMouseEnter',\n '_onContextMenu',\n '_onClick',\n '_onDragStart',\n '_onDragEnd',\n '_onDragProgress',\n '_onDragOver',\n '_onDragEnter',\n '_onDragLeave',\n '_onDrop',\n ] as (keyof this)[]\n ).forEach((eventHandler) => {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-function-type\n this[eventHandler] = (this[eventHandler] as Function).bind(this);\n });\n // register event handlers\n this.addOrRemove(addListener, 'add');\n }\n\n /**\n * return an event prefix pointer or mouse.\n * @private\n */\n private _getEventPrefix() {\n return this.enablePointerEvents ? 'pointer' : 'mouse';\n }\n\n addOrRemove(functor: any, _eventjsFunctor: 'add' | 'remove') {\n const canvasElement = this.upperCanvasEl,\n eventTypePrefix = this._getEventPrefix();\n functor(getWindowFromElement(canvasElement), 'resize', this._onResize);\n functor(canvasElement, eventTypePrefix + 'down', this._onMouseDown);\n functor(\n canvasElement,\n `${eventTypePrefix}move`,\n this._onMouseMove,\n addEventOptions,\n );\n functor(canvasElement, `${eventTypePrefix}out`, this._onMouseOut);\n functor(canvasElement, `${eventTypePrefix}enter`, this._onMouseEnter);\n functor(canvasElement, 'wheel', this._onMouseWheel);\n functor(canvasElement, 'contextmenu', this._onContextMenu);\n functor(canvasElement, 'click', this._onClick);\n // decide if to remove in fabric 7.0\n functor(canvasElement, 'dblclick', this._onClick);\n functor(canvasElement, 'dragstart', this._onDragStart);\n functor(canvasElement, 'dragend', this._onDragEnd);\n functor(canvasElement, 'dragover', this._onDragOver);\n functor(canvasElement, 'dragenter', this._onDragEnter);\n functor(canvasElement, 'dragleave', this._onDragLeave);\n functor(canvasElement, 'drop', this._onDrop);\n if (!this.enablePointerEvents) {\n functor(canvasElement, 'touchstart', this._onTouchStart, addEventOptions);\n }\n // if (typeof eventjs !== 'undefined' && eventjsFunctor in eventjs) {\n // eventjs[eventjsFunctor](canvasElement, 'gesture', this._onGesture);\n // eventjs[eventjsFunctor](canvasElement, 'drag', this._onDrag);\n // eventjs[eventjsFunctor](\n // canvasElement,\n // 'orientation',\n // this._onOrientationChange\n // );\n // eventjs[eventjsFunctor](canvasElement, 'shake', this._onShake);\n // eventjs[eventjsFunctor](canvasElement, 'longpress', this._onLongPress);\n // }\n }\n\n /**\n * Removes all event listeners, used when disposing the instance\n */\n removeListeners() {\n this.addOrRemove(removeListener, 'remove');\n // if you dispose on a mouseDown, before mouse up, you need to clean document to...\n const eventTypePrefix = this._getEventPrefix();\n const doc = getDocumentFromElement(this.upperCanvasEl);\n removeListener(\n doc,\n `${eventTypePrefix}up`,\n this._onMouseUp as EventListener,\n );\n removeListener(\n doc,\n 'touchend',\n this._onTouchEnd as EventListener,\n addEventOptions,\n );\n removeListener(\n doc,\n `${eventTypePrefix}move`,\n this._onMouseMove as EventListener,\n addEventOptions,\n );\n removeListener(\n doc,\n 'touchmove',\n this._onMouseMove as EventListener,\n addEventOptions,\n );\n clearTimeout(this._willAddMouseDown);\n }\n\n /**\n * @private\n * @param {Event} [e] Event object fired on wheel event\n */\n private _onMouseWheel(e: MouseEvent) {\n this._cacheTransformEventData(e);\n this._handleEvent(e, 'wheel');\n this._resetTransformEventData();\n }\n\n /**\n * @private\n * @param {Event} e Event object fired on mousedown\n */\n private _onMouseOut(e: TPointerEvent) {\n const target = this._hoveredTarget;\n const shared = {\n e,\n ...getEventPoints(this, e),\n };\n this.fire('mouse:out', { ...shared, target });\n this._hoveredTarget = undefined;\n target && target.fire('mouseout', { ...shared });\n this._hoveredTargets.forEach((nestedTarget) => {\n this.fire('mouse:out', { ...shared, target: nestedTarget });\n nestedTarget && nestedTarget.fire('mouseout', { ...shared });\n });\n this._hoveredTargets = [];\n }\n\n /**\n * @private\n * Used when the mouse cursor enter the canvas from outside\n * @param {Event} e Event object fired on mouseenter\n */\n private _onMouseEnter(e: TPointerEvent) {\n // This find target and consequent 'mouse:over' is used to\n // clear old instances on hovered target.\n // calling findTarget has the side effect of killing target.__corner.\n // as a short term fix we are not firing this if we are currently transforming.\n // as a long term fix we need to separate the action of finding a target with the\n // side effects we added to it.\n const { target } = this.findTarget(e);\n // we fire the event only when there is no target, if there is a target, the specific\n // target event will fire.\n if (!this._currentTransform && !target) {\n this.fire('mouse:over', {\n e,\n ...getEventPoints(this, e),\n });\n this._hoveredTarget = undefined;\n this._hoveredTargets = [];\n }\n }\n\n /**\n * supports native like text dragging\n * @private\n * @param {DragEvent} e\n */\n private _onDragStart(e: DragEvent) {\n this._isClick = false;\n const activeObject = this.getActiveObject();\n if (activeObject && activeObject.onDragStart(e)) {\n this._dragSource = activeObject;\n const options = { e, target: activeObject };\n this.fire('dragstart', options);\n activeObject.fire('dragstart', options);\n addListener(\n this.upperCanvasEl,\n 'drag',\n this._onDragProgress as EventListener,\n );\n return;\n }\n stopEvent(e);\n }\n\n /**\n * First we clear top context where the effects are being rendered.\n * Then we render the effects.\n * Doing so will render the correct effect for all cases including an overlap between `source` and `target`.\n * @private\n */\n private _renderDragEffects(\n e: DragEvent,\n source?: FabricObject,\n target?: FabricObject,\n ) {\n let dirty = false;\n // clear top context\n const dropTarget = this._dropTarget;\n if (dropTarget && dropTarget !== source && dropTarget !== target) {\n dropTarget.clearContextTop();\n dirty = true;\n }\n source?.clearContextTop();\n target !== source && target?.clearContextTop();\n // render effects\n const ctx = this.contextTop;\n ctx.save();\n ctx.transform(...this.viewportTransform);\n if (source) {\n ctx.save();\n source.transform(ctx);\n source.renderDragSourceEffect(e);\n ctx.restore();\n dirty = true;\n }\n if (target) {\n ctx.save();\n target.transform(ctx);\n target.renderDropTargetEffect(e);\n ctx.restore();\n dirty = true;\n }\n ctx.restore();\n dirty && (this.contextTopDirty = true);\n }\n\n /**\n * supports native like text dragging\n * https://developer.mozilla.org/en-US/docs/Web/API/HTML_Drag_and_Drop_API/Drag_operations#finishing_a_drag\n * @private\n * @param {DragEvent} e\n */\n private _onDragEnd(e: DragEvent) {\n const { currentSubTargets } = this.findTarget(e);\n const didDrop = !!e.dataTransfer && e.dataTransfer.dropEffect !== NONE,\n dropTarget = didDrop ? this._activeObject : undefined,\n options = {\n e,\n target: this._dragSource as FabricObject,\n subTargets: currentSubTargets,\n dragSource: this._dragSource as FabricObject,\n didDrop,\n dropTarget: dropTarget as FabricObject,\n };\n removeListener(\n this.upperCanvasEl,\n 'drag',\n this._onDragProgress as EventListener,\n );\n this.fire('dragend', options);\n this._dragSource && this._dragSource.fire('dragend', options);\n delete this._dragSource;\n // we need to call mouse up synthetically because the browser won't\n this._onMouseUp(e);\n }\n\n /**\n * fire `drag` event on canvas and drag source\n * @private\n * @param {DragEvent} e\n */\n private _onDragProgress(e: DragEvent) {\n const options = {\n e,\n target: this._dragSource,\n dragSource: this._dragSource,\n dropTarget: this._draggedoverTarget as FabricObject,\n };\n this.fire('drag', options);\n this._dragSource && this._dragSource.fire('drag', options);\n }\n\n /**\n * prevent default to allow drop event to be fired\n * https://developer.mozilla.org/en-US/docs/Web/API/HTML_Drag_and_Drop_API/Drag_operations#specifying_drop_targets\n * @private\n * @param {DragEvent} [e] Event object fired on Event.js shake\n */\n private _onDragOver(e: DragEvent) {\n const eventType = 'dragover';\n const { currentContainer: target, currentSubTargets } = this.findTarget(e);\n const dragSource = this._dragSource as FabricObject;\n const options = {\n e,\n target,\n subTargets: currentSubTargets,\n dragSource,\n canDrop: false,\n dropTarget: undefined,\n };\n let dropTarget;\n // fire on canvas\n this.fire(eventType, options);\n // make sure we fire dragenter events before dragover\n // if dragleave is needed, object will not fire dragover so we don't need to trouble ourselves with it\n this._fireEnterLeaveEvents(e, target, options);\n if (target) {\n if (target.canDrop(e)) {\n dropTarget = target;\n }\n target.fire(eventType, options);\n }\n // propagate the event to subtargets\n for (let i = 0; i < currentSubTargets.length; i++) {\n const subTarget = currentSubTargets[i];\n // accept event only if previous targets didn't (the accepting target calls `preventDefault` to inform that the event is taken)\n // TODO: verify if those should loop in inverse order then?\n // what is the order of subtargets?\n if (subTarget.canDrop(e)) {\n dropTarget = subTarget;\n }\n subTarget.fire(eventType, options);\n }\n // render drag effects now that relations between source and target is clear\n this._renderDragEffects(e, dragSource, dropTarget);\n this._dropTarget = dropTarget;\n }\n\n /**\n * fire `dragleave` on `dragover` targets\n * @private\n * @param {Event} [e] Event object fired on Event.js shake\n */\n private _onDragEnter(e: DragEvent) {\n const { currentContainer, currentSubTargets } = this.findTarget(e);\n const options = {\n e,\n target: currentContainer,\n subTargets: currentSubTargets,\n dragSource: this._dragSource,\n };\n this.fire('dragenter', options);\n // fire dragenter on targets\n this._fireEnterLeaveEvents(e, currentContainer, options);\n }\n\n /**\n * fire `dragleave` on `dragover` targets\n * @private\n * @param {Event} [e] Event object fired on Event.js shake\n */\n private _onDragLeave(e: DragEvent) {\n const { currentSubTargets } = this.findTarget(e);\n const options = {\n e,\n target: this._draggedoverTarget,\n subTargets: currentSubTargets,\n dragSource: this._dragSource,\n };\n this.fire('dragleave', options);\n\n // fire dragleave on targets\n this._fireEnterLeaveEvents(e, undefined, options);\n this._renderDragEffects(e, this._dragSource);\n this._dropTarget = undefined;\n this._hoveredTargets = [];\n }\n\n /**\n * `drop:before` is a an event that allows you to schedule logic\n * before the `drop` event. Prefer `drop` event always, but if you need\n * to run some drop-disabling logic on an event, since there is no way\n * to handle event handlers ordering, use `drop:before`\n * @private\n * @param {Event} e\n */\n private _onDrop(e: DragEvent) {\n const { currentContainer, currentSubTargets } = this.findTarget(e);\n const options = this._basicEventHandler('drop:before', {\n e,\n target: currentContainer,\n subTargets: currentSubTargets,\n dragSource: this._dragSource,\n ...getEventPoints(this, e),\n });\n // will be set by the drop target\n options.didDrop = false;\n // will be set by the drop target, used in case options.target refuses the drop\n options.dropTarget = undefined;\n // fire `drop`\n this._basicEventHandler('drop', options);\n // inform canvas of the drop\n // we do this because canvas was unaware of what happened at the time the `drop` event was fired on it\n // use for side effects\n this.fire('drop:after', options);\n }\n\n /**\n * @private\n * @param {Event} e Event object fired on mousedown\n */\n private _onContextMenu(e: TPointerEvent): false {\n const { target, subTargets } = this.findTarget(e);\n const options = this._basicEventHandler('contextmenu:before', {\n e,\n target,\n subTargets,\n });\n // TODO: this line is silly because the dev can subscribe to the event and prevent it themselves\n this.stopContextMenu && stopEvent(e);\n this._basicEventHandler('contextmenu', options);\n return false;\n }\n\n /**\n * @private\n * @param {Event} e Event object fired on mousedown\n */\n private _onClick(e: TPointerEvent) {\n const clicks = e.detail;\n if (clicks > 3 || clicks < 2) return;\n this._cacheTransformEventData(e);\n clicks == 2 && e.type === 'dblclick' && this._handleEvent(e, 'dblclick');\n clicks == 3 && this._handleEvent(e, 'tripleclick');\n this._resetTransformEventData();\n }\n\n /**\n * Return a the id of an event.\n * returns either the pointerId or the identifier or 0 for the mouse event\n * @private\n * @param {Event} evt Event object\n */\n getPointerId(evt: TouchEvent | PointerEvent): number {\n const changedTouches = (evt as TouchEvent).changedTouches;\n\n if (changedTouches) {\n return changedTouches[0] && changedTouches[0].identifier;\n }\n\n if (this.enablePointerEvents) {\n return (evt as PointerEvent).pointerId;\n }\n\n return -1;\n }\n\n /**\n * Determines if an event has the id of the event that is considered main\n * @private\n * @param {evt} event Event object\n */\n _isMainEvent(evt: TPointerEvent): boolean {\n if ((evt as PointerEvent).isPrimary === true) {\n return true;\n }\n if ((evt as PointerEvent).isPrimary === false) {\n return false;\n }\n if (evt.type === 'touchend' && (evt as TouchEvent).touches.length === 0) {\n return true;\n }\n if ((evt as TouchEvent).changedTouches) {\n return (\n (evt as TouchEvent).changedTouches[0].identifier === this.mainTouchId\n );\n }\n return true;\n }\n\n /**\n * @private\n * @param {Event} e Event object fired on mousedown\n */\n _onTouchStart(e: TouchEvent) {\n this._cacheTransformEventData(e);\n // we will prevent scrolling if allowTouchScrolling is not enabled and\n let shouldPreventScrolling = !this.allowTouchScrolling;\n const currentActiveObject = this._activeObject;\n if (this.mainTouchId === undefined) {\n this.mainTouchId = this.getPointerId(e);\n }\n this.__onMouseDown(e);\n const { target } = this.findTarget(e);\n // after executing fabric logic for mouse down let's see\n // if we didn't change target or if we are drawing\n // we want to prevent scrolling anyway\n if (\n this.isDrawingMode ||\n (currentActiveObject && target === currentActiveObject)\n ) {\n shouldPreventScrolling = true;\n }\n // prevent default, will block scrolling from start\n shouldPreventScrolling && e.preventDefault();\n const canvasElement = this.upperCanvasEl,\n eventTypePrefix = this._getEventPrefix();\n const doc = getDocumentFromElement(canvasElement);\n addListener(\n doc,\n 'touchend',\n this._onTouchEnd as EventListener,\n addEventOptions,\n );\n // if we scroll don't register the touch move event\n shouldPreventScrolling &&\n addListener(\n doc,\n 'touchmove',\n this._onMouseMove as EventListener,\n addEventOptions,\n );\n // Unbind mousedown to prevent double triggers from touch devices\n removeListener(\n canvasElement,\n `${eventTypePrefix}down`,\n this._onMouseDown as EventListener,\n );\n this._resetTransformEventData();\n }\n\n /**\n * @private\n * @param {Event} e Event object fired on mousedown\n */\n _onMouseDown(e: TPointerEvent) {\n this._cacheTransformEventData(e);\n this.__onMouseDown(e);\n const canvasElement = this.upperCanvasEl,\n eventTypePrefix = this._getEventPrefix();\n // switch from moving on the canvas element to moving on the document\n removeListener(\n canvasElement,\n `${eventTypePrefix}move`,\n this._onMouseMove as EventListener,\n addEventOptions,\n );\n const doc = getDocumentFromElement(canvasElement);\n addListener(doc, `${eventTypePrefix}up`, this._onMouseUp as EventListener);\n addListener(\n doc,\n `${eventTypePrefix}move`,\n this._onMouseMove as EventListener,\n addEventOptions,\n );\n this._resetTransformEventData();\n }\n\n /**\n * @private\n * @param {Event} e Event object fired on mousedown\n */\n _onTouchEnd(e: TouchEvent) {\n if (e.touches.length > 0) {\n // if there are still touches stop here\n return;\n }\n this._cacheTransformEventData(e);\n this.__onMouseUp(e);\n this._resetTransformEventData();\n delete this.mainTouchId;\n const eventTypePrefix = this._getEventPrefix();\n const doc = getDocumentFromElement(this.upperCanvasEl);\n removeListener(\n doc,\n 'touchend',\n this._onTouchEnd as EventListener,\n addEventOptions,\n );\n removeListener(\n doc,\n 'touchmove',\n this._onMouseMove as EventListener,\n addEventOptions,\n );\n if (this._willAddMouseDown) {\n clearTimeout(this._willAddMouseDown);\n }\n this._willAddMouseDown = setTimeout(() => {\n // Wait 400ms before rebinding mousedown to prevent double triggers\n // from touch devices\n addListener(\n this.upperCanvasEl,\n `${eventTypePrefix}down`,\n this._onMouseDown as EventListener,\n );\n this._willAddMouseDown = 0;\n }, 400) as unknown as number;\n }\n\n /**\n * @private\n * @param {Event} e Event object fired on mouseup\n */\n _onMouseUp(e: TPointerEvent) {\n this._cacheTransformEventData(e);\n this.__onMouseUp(e);\n const canvasElement = this.upperCanvasEl,\n eventTypePrefix = this._getEventPrefix();\n if (this._isMainEvent(e)) {\n const doc = getDocumentFromElement(this.upperCanvasEl);\n removeListener(\n doc,\n `${eventTypePrefix}up`,\n this._onMouseUp as EventListener,\n );\n removeListener(\n doc,\n `${eventTypePrefix}move`,\n this._onMouseMove as EventListener,\n addEventOptions,\n );\n addListener(\n canvasElement,\n `${eventTypePrefix}move`,\n this._onMouseMove as EventListener,\n addEventOptions,\n );\n }\n this._resetTransformEventData();\n }\n\n /**\n * @private\n * @param {Event} e Event object fired on mousemove\n */\n _onMouseMove(e: TPointerEvent) {\n this._cacheTransformEventData(e);\n\n const activeObject = this.getActiveObject();\n !this.allowTouchScrolling &&\n (!activeObject ||\n // a drag event sequence is started by the active object flagging itself on mousedown / mousedown:before\n // we must not prevent the event's default behavior in order for the window to start dragging\n !activeObject.shouldStartDragging(e)) &&\n e.preventDefault &&\n e.preventDefault();\n this.__onMouseMove(e);\n this._resetTransformEventData();\n }\n\n /**\n * @private\n */\n _onResize() {\n this.calcOffset();\n this._resetTransformEventData();\n }\n\n /**\n * Decides whether the canvas should be redrawn in mouseup and mousedown events.\n * @private\n * @param {Object} target\n */\n _shouldRender(target: FabricObject | undefined) {\n const activeObject = this.getActiveObject();\n // if just one of them is available or if they are both but are different objects\n // this covers: switch of target, from target to no target, selection of target\n // multiSelection with key and mouse\n return (\n !!activeObject !== !!target ||\n (activeObject && target && activeObject !== target)\n );\n }\n\n /**\n * Method that defines the actions when mouse is released on canvas.\n * The method resets the currentTransform parameters, store the image corner\n * position in the image object and render the canvas on top.\n * @private\n * @param {Event} e Event object fired on mouseup\n */\n __onMouseUp(e: TPointerEvent) {\n this._handleEvent(e, 'up:before');\n\n const transform = this._currentTransform;\n const isClick = this._isClick;\n const { target } = this.findTarget(e);\n\n // if right/middle click just fire events and return\n // target undefined will make the _handleEvent search the target\n const { button } = e as MouseEvent;\n if (button) {\n ((this.fireMiddleClick && button === 1) ||\n (this.fireRightClick && button === 2)) &&\n this._handleEvent(e, 'up');\n return;\n }\n\n if (this.isDrawingMode && this._isCurrentlyDrawing) {\n this._onMouseUpInDrawingMode(e);\n return;\n }\n\n if (!this._isMainEvent(e)) {\n return;\n }\n let shouldRender = false;\n if (transform) {\n this._finalizeCurrentTransform(e);\n shouldRender = transform.actionPerformed;\n }\n if (!isClick) {\n const targetWasActive = target === this._activeObject;\n this.handleSelection(e);\n if (!shouldRender) {\n shouldRender =\n this._shouldRender(target) ||\n (!targetWasActive && target === this._activeObject);\n }\n }\n let pointer, corner;\n if (target) {\n const found = target.findControl(\n this.getViewportPoint(e),\n isTouchEvent(e),\n );\n const { key, control } = found || {};\n corner = key;\n if (\n target.selectable &&\n target !== this._activeObject &&\n target.activeOn === 'up'\n ) {\n this.setActiveObject(target, e);\n shouldRender = true;\n } else if (control) {\n const mouseUpHandler = control.getMouseUpHandler(e, target, control);\n if (mouseUpHandler) {\n pointer = this.getScenePoint(e);\n mouseUpHandler.call(control, e, transform!, pointer.x, pointer.y);\n }\n }\n target.isMoving = false;\n }\n // if we are ending up a transform on a different control or a new object\n // fire the original mouse up from the corner that started the transform\n if (\n transform &&\n (transform.target !== target || transform.corner !== corner)\n ) {\n const originalControl =\n transform.target && transform.target.controls[transform.corner],\n originalMouseUpHandler =\n originalControl &&\n originalControl.getMouseUpHandler(\n e,\n transform.target,\n originalControl,\n );\n pointer = pointer || this.getScenePoint(e);\n originalMouseUpHandler &&\n originalMouseUpHandler.call(\n originalControl,\n e,\n transform,\n pointer.x,\n pointer.y,\n );\n }\n this._setCursorFromEvent(e, target);\n this._handleEvent(e, 'up');\n this._groupSelector = null;\n this._currentTransform = null;\n // reset the target information about which corner is selected\n target && (target.__corner = undefined);\n if (shouldRender) {\n this.requestRenderAll();\n } else if (!isClick && !(this._activeObject as IText)?.isEditing) {\n this.renderTop();\n }\n }\n\n _basicEventHandler(\n eventType: T,\n options: (CanvasEvents & ObjectEvents)[T],\n ) {\n const { target, subTargets = [] } = options as {\n target?: FabricObject;\n subTargets: FabricObject[];\n };\n this.fire(eventType, options);\n target && target.fire(eventType, options);\n for (let i = 0; i < subTargets.length; i++) {\n subTargets[i] !== target && subTargets[i].fire(eventType, options);\n }\n return options;\n }\n\n /**\n * @private\n * Handle event firing for target and subtargets\n * @param {TPointerEvent} e event from mouse\n * @param {TPointerEventNames} eventType\n */\n _handleEvent(\n e: TPointerEvent,\n eventType: T,\n extraData?: TEventsExtraData[T],\n ) {\n const { target, subTargets } = this.findTarget(e),\n options: CanvasEvents[`mouse:${T}`] = {\n e,\n target,\n subTargets,\n ...getEventPoints(this, e),\n transform: this._currentTransform,\n ...(eventType === 'down:before' || eventType === 'down'\n ? extraData\n : {}),\n } as CanvasEvents[`mouse:${T}`];\n if (eventType === 'up:before' || eventType === 'up') {\n (options as CanvasEvents[`mouse:up`]).isClick = this._isClick;\n }\n this.fire(`mouse:${eventType}`, options);\n // this may be a little be more complicated of what we want to handle\n target && target.fire(`mouse${eventType}`, options);\n for (let i = 0; i < subTargets.length; i++) {\n subTargets[i] !== target &&\n subTargets[i].fire(`mouse${eventType}`, options);\n }\n }\n\n /**\n * @private\n * @param {Event} e Event object fired on mousedown\n */\n _onMouseDownInDrawingMode(e: TPointerEvent) {\n this._isCurrentlyDrawing = true;\n if (this.getActiveObject()) {\n this.discardActiveObject(e);\n this.requestRenderAll();\n }\n // TODO: this is a scene point so it should be renamed\n const pointer = this.getScenePoint(e);\n this.freeDrawingBrush &&\n this.freeDrawingBrush.onMouseDown(pointer, { e, pointer });\n this._handleEvent(e, 'down', { alreadySelected: false });\n }\n\n /**\n * @private\n * @param {Event} e Event object fired on mousemove\n */\n _onMouseMoveInDrawingMode(e: TPointerEvent) {\n if (this._isCurrentlyDrawing) {\n const pointer = this.getScenePoint(e);\n this.freeDrawingBrush &&\n this.freeDrawingBrush.onMouseMove(pointer, {\n e,\n // this is an absolute pointer, the naming is wrong\n pointer,\n });\n }\n this.setCursor(this.freeDrawingCursor);\n this._handleEvent(e, 'move');\n }\n\n /**\n * @private\n * @param {Event} e Event object fired on mouseup\n */\n _onMouseUpInDrawingMode(e: TPointerEvent) {\n const pointer = this.getScenePoint(e);\n if (this.freeDrawingBrush) {\n this._isCurrentlyDrawing = !!this.freeDrawingBrush.onMouseUp({\n e: e,\n // this is an absolute pointer, the naming is wrong\n pointer,\n });\n } else {\n this._isCurrentlyDrawing = false;\n }\n this._handleEvent(e, 'up');\n }\n\n /**\n * Method that defines the actions when mouse is clicked on canvas.\n * The method inits the currentTransform parameters and renders all the\n * canvas so the current image can be placed on the top canvas and the rest\n * in on the container one.\n * @private\n * @param {Event} e Event object fired on mousedown\n */\n __onMouseDown(e: TPointerEvent) {\n this._isClick = true;\n this._handleEvent(e, 'down:before');\n\n let { target } = this.findTarget(e);\n let alreadySelected = !!target && target === this._activeObject;\n // if right/middle click just fire events\n const { button } = e as MouseEvent;\n if (button) {\n ((this.fireMiddleClick && button === 1) ||\n (this.fireRightClick && button === 2)) &&\n this._handleEvent(e, 'down', {\n alreadySelected,\n });\n return;\n }\n\n if (this.isDrawingMode) {\n this._onMouseDownInDrawingMode(e);\n return;\n }\n\n if (!this._isMainEvent(e)) {\n return;\n }\n\n // ignore if some object is being transformed at this moment\n if (this._currentTransform) {\n return;\n }\n\n let shouldRender = this._shouldRender(target);\n let grouped = false;\n if (this.handleMultiSelection(e, target)) {\n // active object might have changed while grouping\n target = this._activeObject;\n grouped = true;\n shouldRender = true;\n } else if (this._shouldClearSelection(e, target)) {\n this.discardActiveObject(e);\n }\n // we start a group selector rectangle if\n // selection is enabled\n // and there is no target, or the following 3 conditions are satisfied:\n // target is not selectable ( otherwise we selected it )\n // target is not editing\n // target is not already selected ( otherwise we drag )\n if (\n this.selection &&\n (!target ||\n (!target.selectable &&\n !(target as IText).isEditing &&\n target !== this._activeObject))\n ) {\n const p = this.getScenePoint(e);\n this._groupSelector = {\n x: p.x,\n y: p.y,\n deltaY: 0,\n deltaX: 0,\n };\n }\n\n // check again because things could have changed\n alreadySelected = !!target && target === this._activeObject;\n if (target) {\n if (target.selectable && target.activeOn === 'down') {\n this.setActiveObject(target, e);\n }\n const handle = target.findControl(\n this.getViewportPoint(e),\n isTouchEvent(e),\n );\n if (target === this._activeObject && (handle || !grouped)) {\n this._setupCurrentTransform(e, target, alreadySelected);\n const control = handle ? handle.control : undefined,\n pointer = this.getScenePoint(e),\n mouseDownHandler =\n control && control.getMouseDownHandler(e, target, control);\n mouseDownHandler &&\n mouseDownHandler.call(\n control,\n e,\n this._currentTransform!,\n pointer.x,\n pointer.y,\n );\n }\n }\n // we clear `_objectsToRender` in case of a change in order to repopulate it at rendering\n // run before firing the `down` event to give the dev a chance to populate it themselves\n shouldRender && (this._objectsToRender = undefined);\n this._handleEvent(e, 'down', { alreadySelected: alreadySelected });\n // we must renderAll so that we update the visuals\n shouldRender && this.requestRenderAll();\n }\n\n /**\n * reset cache form common information needed during event processing\n * @private\n */\n _resetTransformEventData() {\n this._targetInfo = this._viewportPoint = this._scenePoint = undefined;\n }\n\n /**\n * Cache common information needed during event processing\n * @private\n * @param {Event} e Event object fired on event\n */\n _cacheTransformEventData(e: TPointerEvent) {\n // reset in order to avoid stale caching\n this._resetTransformEventData();\n this._viewportPoint = this.getViewportPoint(e);\n this._scenePoint = sendPointToPlane(\n this._viewportPoint,\n undefined,\n this.viewportTransform,\n );\n this._targetInfo = this.findTarget(e);\n // TODO: investigate better if this can be made less implicit in the code\n if (this._currentTransform) {\n this._targetInfo.target = this._currentTransform.target;\n }\n }\n\n /**\n * Method that defines the actions when mouse is hovering the canvas.\n * The currentTransform parameter will define whether the user is rotating/scaling/translating\n * an image or neither of them (only hovering). A group selection is also possible and would cancel\n * all any other type of action.\n * In case of an image transformation only the top canvas will be rendered.\n * @private\n * @param {Event} e Event object fired on mousemove\n */\n __onMouseMove(e: TPointerEvent) {\n this._isClick = false;\n this._handleEvent(e, 'move:before');\n\n if (this.isDrawingMode) {\n this._onMouseMoveInDrawingMode(e);\n return;\n }\n\n if (!this._isMainEvent(e)) {\n return;\n }\n\n const groupSelector = this._groupSelector;\n\n // We initially clicked in an empty area, so we draw a box for multiple selection\n if (groupSelector) {\n const pointer = this.getScenePoint(e);\n\n groupSelector.deltaX = pointer.x - groupSelector.x;\n groupSelector.deltaY = pointer.y - groupSelector.y;\n\n this.renderTop();\n } else if (!this._currentTransform) {\n const { target } = this.findTarget(e);\n this._setCursorFromEvent(e, target);\n this._fireOverOutEvents(e, target);\n } else {\n this._transformObject(e);\n }\n this.textEditingManager.onMouseMove(e);\n this._handleEvent(e, 'move');\n }\n\n /**\n * Manage the mouseout, mouseover events for the fabric object on the canvas\n * @param {Fabric.Object} target the target where the target from the mousemove event\n * @param {Event} e Event object fired on mousemove\n * @private\n */\n _fireOverOutEvents(e: TPointerEvent, target?: FabricObject) {\n const _hoveredTarget = this._hoveredTarget,\n _hoveredTargets = this._hoveredTargets,\n { subTargets } = this.findTarget(e),\n length = Math.max(_hoveredTargets.length, subTargets.length);\n\n this.fireSyntheticInOutEvents('mouse', {\n e,\n target,\n oldTarget: _hoveredTarget,\n fireCanvas: true,\n });\n for (let i = 0; i < length; i++) {\n this.fireSyntheticInOutEvents('mouse', {\n e,\n target: subTargets[i],\n oldTarget: _hoveredTargets[i],\n });\n }\n this._hoveredTarget = target;\n this._hoveredTargets = subTargets;\n }\n\n /**\n * Manage the dragEnter, dragLeave events for the fabric objects on the canvas\n * @param {Fabric.Object} target the target where the target from the onDrag event\n * @param {Object} data Event object fired on dragover\n * @private\n */\n _fireEnterLeaveEvents(\n e: TPointerEvent,\n target: FabricObject | undefined,\n data: DragEventData,\n ) {\n const draggedoverTarget = this._draggedoverTarget,\n _hoveredTargets = this._hoveredTargets,\n { subTargets } = this.findTarget(e),\n length = Math.max(_hoveredTargets.length, subTargets.length);\n\n this.fireSyntheticInOutEvents('drag', {\n ...data,\n target,\n oldTarget: draggedoverTarget,\n fireCanvas: true,\n });\n for (let i = 0; i < length; i++) {\n this.fireSyntheticInOutEvents('drag', {\n ...data,\n target: subTargets[i],\n oldTarget: _hoveredTargets[i],\n });\n }\n this._draggedoverTarget = target;\n }\n\n /**\n * Manage the synthetic in/out events for the fabric objects on the canvas\n * @param {Fabric.Object} target the target where the target from the supported events\n * @param {Object} data Event object fired\n * @param {Object} config configuration for the function to work\n * @param {String} config.targetName property on the canvas where the old target is stored\n * @param {String} [config.canvasEvtOut] name of the event to fire at canvas level for out\n * @param {String} config.evtOut name of the event to fire for out\n * @param {String} [config.canvasEvtIn] name of the event to fire at canvas level for in\n * @param {String} config.evtIn name of the event to fire for in\n * @private\n */\n fireSyntheticInOutEvents(\n type: T,\n {\n target,\n oldTarget,\n fireCanvas,\n e,\n ...data\n }: TSyntheticEventContext[T] & {\n target?: FabricObject;\n oldTarget?: FabricObject;\n fireCanvas?: boolean;\n },\n ) {\n const { targetIn, targetOut, canvasIn, canvasOut } =\n syntheticEventConfig[type];\n const targetChanged = oldTarget !== target;\n\n if (oldTarget && targetChanged) {\n const outOpt: CanvasEvents[typeof canvasOut] = {\n ...data,\n e,\n target: oldTarget,\n nextTarget: target,\n ...getEventPoints(this, e),\n };\n fireCanvas && this.fire(canvasOut, outOpt);\n oldTarget.fire(targetOut, outOpt);\n }\n if (target && targetChanged) {\n const inOpt: CanvasEvents[typeof canvasIn] = {\n ...data,\n e,\n target,\n previousTarget: oldTarget,\n ...getEventPoints(this, e),\n };\n fireCanvas && this.fire(canvasIn, inOpt);\n target.fire(targetIn, inOpt);\n }\n }\n\n /**\n * @private\n * @param {Event} e Event fired on mousemove\n */\n _transformObject(e: TPointerEvent) {\n const scenePoint = this.getScenePoint(e),\n transform = this._currentTransform!,\n target = transform.target,\n // transform pointer to target's containing coordinate plane\n // both pointer and object should agree on every point\n localPointer = target.group\n ? sendPointToPlane(\n scenePoint,\n undefined,\n target.group.calcTransformMatrix(),\n )\n : scenePoint;\n transform.shiftKey = e.shiftKey;\n transform.altKey = !!this.centeredKey && e[this.centeredKey];\n\n this._performTransformAction(e, transform, localPointer);\n transform.actionPerformed && this.requestRenderAll();\n }\n\n /**\n * @private\n */\n _performTransformAction(\n e: TPointerEvent,\n transform: Transform,\n pointer: Point,\n ) {\n const { action, actionHandler, target } = transform;\n\n const actionPerformed =\n !!actionHandler && actionHandler(e, transform, pointer.x, pointer.y);\n actionPerformed && target.setCoords();\n\n // this object could be created from the function in the control handlers\n if (action === 'drag' && actionPerformed) {\n transform.target.isMoving = true;\n this.setCursor(transform.target.moveCursor || this.moveCursor);\n }\n transform.actionPerformed = transform.actionPerformed || actionPerformed;\n }\n\n /**\n * Sets the cursor depending on where the canvas is being hovered.\n * Note: very buggy in Opera\n * @param {Event} e Event object\n * @param {Object} target Object that the mouse is hovering, if so.\n */\n _setCursorFromEvent(e: TPointerEvent, target?: FabricObject) {\n if (!target) {\n this.setCursor(this.defaultCursor);\n return;\n }\n let hoverCursor = target.hoverCursor || this.hoverCursor;\n const activeSelection = isActiveSelection(this._activeObject)\n ? this._activeObject\n : null,\n // only show proper corner when group selection is not active\n corner =\n (!activeSelection || target.group !== activeSelection) &&\n // here we call findTargetCorner always with undefined for the touch parameter.\n // we assume that if you are using a cursor you do not need to interact with\n // the bigger touch area.\n target.findControl(this.getViewportPoint(e));\n\n if (!corner) {\n if ((target as Group).subTargetCheck) {\n // hoverCursor should come from top-most subTarget,\n // so we walk the array backwards\n const { subTargets } = this.findTarget(e);\n subTargets\n .concat()\n .reverse()\n .forEach((_target) => {\n hoverCursor = _target.hoverCursor || hoverCursor;\n });\n }\n this.setCursor(hoverCursor);\n } else {\n const { control, coord } = corner;\n this.setCursor(control.cursorStyleHandler(e, control, target, coord));\n }\n }\n\n /**\n * ## Handles multiple selection\n * - toggles `target` selection (selects/deselects `target` if it isn't/is selected respectively)\n * - sets the active object in case it is not set or in case there is a single active object left under active selection.\n * ---\n * - If the active object is the active selection we add/remove `target` from it\n * - If not, add the active object and `target` to the active selection and make it the active object.\n * @TODO rewrite this after find target is refactored\n * @private\n * @param {TPointerEvent} e Event object\n * @param {FabricObject} target target of event to select/deselect\n * @returns true if grouping occurred\n */\n protected handleMultiSelection(e: TPointerEvent, target?: FabricObject) {\n const activeObject = this._activeObject;\n const isAS = isActiveSelection(activeObject);\n if (\n // check if an active object exists on canvas and if the user is pressing the `selectionKey` while canvas supports multi selection.\n !!activeObject &&\n this._isSelectionKeyPressed(e) &&\n this.selection &&\n // on top of that the user also has to hit a target that is selectable.\n !!target &&\n target.selectable &&\n // group target and active object only if they are different objects\n // else we try to find a subtarget of `ActiveSelection`\n (activeObject !== target || isAS) &&\n // make sure `activeObject` and `target` aren't ancestors of each other in case `activeObject` is not `ActiveSelection`\n // if it is then we want to remove `target` from it\n (isAS ||\n (!target.isDescendantOf(activeObject) &&\n !activeObject.isDescendantOf(target))) &&\n // target accepts selection\n !target.onSelect({ e }) &&\n // make sure we are not on top of a control\n !activeObject.getActiveControl()\n ) {\n if (isAS) {\n const prevActiveObjects = activeObject.getObjects();\n let subTargets: FabricObject[] = [];\n // const { subTargets: testSubTargets } = this.findTarget(e);\n if (target === activeObject) {\n const pointer = this.getScenePoint(e);\n let targetInfo = this.searchPossibleTargets(\n prevActiveObjects,\n pointer,\n );\n // console.log(testSubTargets.includes(targetInfo.target));\n if (targetInfo.target) {\n target = targetInfo.target;\n subTargets = targetInfo.subTargets;\n } else {\n targetInfo = this.searchPossibleTargets(this._objects, pointer);\n target = targetInfo.target;\n subTargets = targetInfo.subTargets;\n }\n // if nothing is found bail out\n if (!target || !target.selectable) {\n return false;\n }\n }\n if (target.group === activeObject) {\n // `target` is part of active selection => remove it\n activeObject.remove(target);\n this._hoveredTarget = target;\n this._hoveredTargets = subTargets;\n // if after removing an object we are left with one only...\n if (activeObject.size() === 1) {\n // activate last remaining object\n // deselecting the active selection will remove the remaining object from it\n this._setActiveObject(activeObject.item(0), e);\n }\n } else {\n // `target` isn't part of active selection => add it\n activeObject.multiSelectAdd(target);\n this._hoveredTarget = activeObject;\n this._hoveredTargets = subTargets;\n }\n this._fireSelectionEvents(prevActiveObjects, e);\n } else {\n (activeObject as IText).isEditing &&\n (activeObject as IText).exitEditing();\n // add the active object and the target to the active selection and set it as the active object\n const klass =\n classRegistry.getClass('ActiveSelection');\n const newActiveSelection = new klass([], {\n /**\n * it is crucial to pass the canvas ref before calling {@link ActiveSelection#multiSelectAdd}\n * since it uses {@link FabricObject#isInFrontOf} which relies on the canvas ref\n */\n canvas: this,\n });\n newActiveSelection.multiSelectAdd(activeObject, target);\n this._hoveredTarget = newActiveSelection;\n // ISSUE 4115: should we consider subTargets here?\n // this._hoveredTargets = [];\n // this._hoveredTargets = this.targets.concat();\n this._setActiveObject(newActiveSelection, e);\n this._fireSelectionEvents([activeObject], e);\n }\n return true;\n }\n return false;\n }\n\n /**\n * ## Handles selection\n * - selects objects that are contained in (and possibly intersecting) the selection bounding box\n * - sets the active object\n * ---\n * runs on mouse up after a mouse move\n */\n protected handleSelection(e: TPointerEvent) {\n if (!this.selection || !this._groupSelector) {\n return false;\n }\n const { x, y, deltaX, deltaY } = this._groupSelector,\n point1 = new Point(x, y),\n point2 = point1.add(new Point(deltaX, deltaY)),\n tl = point1.min(point2),\n br = point1.max(point2),\n size = br.subtract(tl);\n\n const collectedObjects = this.collectObjects(\n {\n left: tl.x,\n top: tl.y,\n width: size.x,\n height: size.y,\n },\n { includeIntersecting: !this.selectionFullyContained },\n ) as FabricObject[];\n\n const objects =\n // though this method runs only after mouse move the pointer could do a mouse up on the same position as mouse down\n // should it be handled as is?\n point1.eq(point2)\n ? collectedObjects[0]\n ? [collectedObjects[0]]\n : []\n : collectedObjects.length > 1\n ? collectedObjects\n .filter((object) => !object.onSelect({ e }))\n .reverse()\n : // `setActiveObject` will call `onSelect(collectedObjects[0])` in this case\n collectedObjects;\n\n // set active object\n if (objects.length === 1) {\n // set as active object\n this.setActiveObject(objects[0], e);\n } else if (objects.length > 1) {\n // add to active selection and make it the active object\n const klass =\n classRegistry.getClass('ActiveSelection');\n this.setActiveObject(new klass(objects, { canvas: this }), e);\n }\n\n // cleanup\n this._groupSelector = null;\n return true;\n }\n\n /**\n * @override clear {@link textEditingManager}\n */\n clear() {\n this.textEditingManager.clear();\n super.clear();\n }\n\n /**\n * @override clear {@link textEditingManager}\n */\n destroy() {\n this.removeListeners();\n this.textEditingManager.dispose();\n super.destroy();\n }\n}\n","export const linearDefaultCoords = {\n x1: 0,\n y1: 0,\n x2: 0,\n y2: 0,\n};\n\nexport const radialDefaultCoords = {\n ...linearDefaultCoords,\n r1: 0,\n r2: 0,\n};\n","/**\n *\n * @param value value to check if NaN\n * @param [valueIfNaN]\n * @returns `fallback` is `value is NaN\n */\nexport const ifNaN = (value: number, valueIfNaN?: number) => {\n return isNaN(value) && typeof valueIfNaN === 'number' ? valueIfNaN : value;\n};\n","import { ifNaN } from '../util/internals/ifNaN';\nimport { capValue } from '../util/misc/capValue';\n\nconst RE_PERCENT = /^(\\d+\\.\\d+)%|(\\d+)%$/;\n\nexport function isPercent(value: string | null) {\n return value && RE_PERCENT.test(value);\n}\n\n/**\n *\n * @param value\n * @param valueIfNaN\n * @returns ∈ [0, 1]\n */\nexport function parsePercent(\n value: string | number | null | undefined,\n valueIfNaN?: number,\n) {\n const parsed =\n typeof value === 'number'\n ? value\n : typeof value === 'string'\n ? parseFloat(value) / (isPercent(value) ? 100 : 1)\n : NaN;\n return capValue(0, ifNaN(parsed, valueIfNaN), 1);\n}\n","import { Color } from '../../color/Color';\nimport { parsePercent } from '../../parser/percent';\nimport { ifNaN } from '../../util/internals/ifNaN';\nimport type { ColorStop } from '../typedefs';\n\nconst RE_KEY_VALUE_PAIRS = /\\s*;\\s*/;\nconst RE_KEY_VALUE = /\\s*:\\s*/;\n\nfunction parseColorStop(el: SVGStopElement, opacityMultiplier: number) {\n let colorValue, opacityValue;\n const style = el.getAttribute('style');\n if (style) {\n const keyValuePairs = style.split(RE_KEY_VALUE_PAIRS);\n\n if (keyValuePairs[keyValuePairs.length - 1] === '') {\n keyValuePairs.pop();\n }\n\n for (let i = keyValuePairs.length; i--; ) {\n const [key, value] = keyValuePairs[i]\n .split(RE_KEY_VALUE)\n .map((s) => s.trim());\n if (key === 'stop-color') {\n colorValue = value;\n } else if (key === 'stop-opacity') {\n opacityValue = value;\n }\n }\n }\n\n colorValue = colorValue || el.getAttribute('stop-color') || 'rgb(0,0,0)';\n opacityValue = ifNaN(\n parseFloat(opacityValue || el.getAttribute('stop-opacity') || ''),\n 1,\n );\n\n const color = new Color(colorValue);\n\n color.setAlpha(color.getAlpha() * opacityValue * opacityMultiplier);\n\n return {\n offset: parsePercent(el.getAttribute('offset'), 0),\n color: color.toRgba(),\n };\n}\n\nexport function parseColorStops(\n el: SVGGradientElement,\n opacityAttr: string | null,\n) {\n const colorStops: ColorStop[] = [],\n colorStopEls = el.getElementsByTagName('stop'),\n multiplier = parsePercent(opacityAttr, 1);\n for (let i = colorStopEls.length; i--; ) {\n colorStops.push(parseColorStop(colorStopEls[i], multiplier));\n }\n return colorStops;\n}\n","import type { GradientType, GradientUnits } from '../typedefs';\n\nexport function parseType(el: SVGGradientElement): GradientType {\n return el.nodeName === 'linearGradient' || el.nodeName === 'LINEARGRADIENT'\n ? 'linear'\n : 'radial';\n}\n\nexport function parseGradientUnits(el: SVGGradientElement): GradientUnits {\n return el.getAttribute('gradientUnits') === 'userSpaceOnUse'\n ? 'pixels'\n : 'percentage';\n}\n","import { isPercent } from '../../parser/percent';\nimport type { TSize } from '../../typedefs';\nimport type { GradientCoords, GradientType, GradientUnits } from '../typedefs';\nimport { parseGradientUnits, parseType } from './misc';\n\nfunction convertPercentUnitsToValues<\n T extends GradientType,\n K extends keyof GradientCoords,\n>(\n valuesToConvert: Record,\n { width, height, gradientUnits }: TSize & { gradientUnits: GradientUnits },\n) {\n let finalValue;\n return (Object.keys(valuesToConvert) as K[]).reduce(\n (acc, prop) => {\n const propValue = valuesToConvert[prop];\n if (propValue === 'Infinity') {\n finalValue = 1;\n } else if (propValue === '-Infinity') {\n finalValue = 0;\n } else {\n finalValue =\n typeof propValue === 'string' ? parseFloat(propValue) : propValue;\n if (typeof propValue === 'string' && isPercent(propValue)) {\n finalValue *= 0.01;\n if (gradientUnits === 'pixels') {\n // then we need to fix those percentages here in svg parsing\n if (prop === 'x1' || prop === 'x2' || prop === 'r2') {\n finalValue *= width;\n }\n if (prop === 'y1' || prop === 'y2') {\n finalValue *= height;\n }\n }\n }\n }\n acc[prop] = finalValue;\n return acc;\n },\n {} as Record,\n );\n}\n\nfunction getValue(el: SVGGradientElement, key: string) {\n return el.getAttribute(key);\n}\n\nexport function parseLinearCoords(el: SVGGradientElement) {\n return {\n x1: getValue(el, 'x1') || 0,\n y1: getValue(el, 'y1') || 0,\n x2: getValue(el, 'x2') || '100%',\n y2: getValue(el, 'y2') || 0,\n };\n}\n\nexport function parseRadialCoords(el: SVGGradientElement) {\n return {\n x1: getValue(el, 'fx') || getValue(el, 'cx') || '50%',\n y1: getValue(el, 'fy') || getValue(el, 'cy') || '50%',\n r1: 0,\n x2: getValue(el, 'cx') || '50%',\n y2: getValue(el, 'cy') || '50%',\n r2: getValue(el, 'r') || '50%',\n };\n}\n\nexport function parseCoords(el: SVGGradientElement, size: TSize) {\n return convertPercentUnitsToValues(\n parseType(el) === 'linear' ? parseLinearCoords(el) : parseRadialCoords(el),\n {\n ...size,\n gradientUnits: parseGradientUnits(el),\n },\n );\n}\n","import { iMatrix } from '../constants';\nimport { parseTransformAttribute } from '../parser/parseTransformAttribute';\nimport type { FabricObject } from '../shapes/Object/FabricObject';\nimport type { TMat2D } from '../typedefs';\nimport { uid } from '../util/internals/uid';\nimport { pick } from '../util/misc/pick';\nimport { matrixToSVG } from '../util/misc/svgExport';\nimport { linearDefaultCoords, radialDefaultCoords } from './constants';\nimport { parseColorStops } from './parser/parseColorStops';\nimport { parseCoords } from './parser/parseCoords';\nimport { parseType, parseGradientUnits } from './parser/misc';\nimport type {\n ColorStop,\n GradientCoords,\n GradientOptions,\n GradientType,\n GradientUnits,\n SVGOptions,\n SerializedGradientProps,\n} from './typedefs';\nimport { classRegistry } from '../ClassRegistry';\nimport { isPath } from '../util/typeAssertions';\n\n/**\n * Gradient class\n * @class Gradient\n * @tutorial {@link http://fabricjs.com/fabric-intro-part-2#gradients}\n */\nexport class Gradient<\n S,\n T extends GradientType = S extends GradientType ? S : 'linear',\n> {\n /**\n * Horizontal offset for aligning gradients coming from SVG when outside pathgroups\n * @type Number\n * @default 0\n */\n declare offsetX: number;\n\n /**\n * Vertical offset for aligning gradients coming from SVG when outside pathgroups\n * @type Number\n * @default 0\n */\n declare offsetY: number;\n\n /**\n * A transform matrix to apply to the gradient before painting.\n * Imported from svg gradients, is not applied with the current transform in the center.\n * Before this transform is applied, the origin point is at the top left corner of the object\n * plus the addition of offsetY and offsetX.\n * @type Number[]\n * @default null\n */\n declare gradientTransform?: TMat2D;\n\n /**\n * coordinates units for coords.\n * If `pixels`, the number of coords are in the same unit of width / height.\n * If set as `percentage` the coords are still a number, but 1 means 100% of width\n * for the X and 100% of the height for the y. It can be bigger than 1 and negative.\n * allowed values pixels or percentage.\n * @type GradientUnits\n * @default 'pixels'\n */\n declare gradientUnits: GradientUnits;\n\n /**\n * Gradient type linear or radial\n * @type GradientType\n * @default 'linear'\n */\n declare type: T;\n\n /**\n * Defines how the gradient is located in space and spread\n * @type GradientCoords\n */\n declare coords: GradientCoords;\n\n /**\n * Defines how many colors a gradient has and how they are located on the axis\n * defined by coords\n * @type GradientCoords\n */\n declare colorStops: ColorStop[];\n\n /**\n * If true, this object will not be exported during the serialization of a canvas\n * @type boolean\n */\n declare excludeFromExport?: boolean;\n\n /**\n * ID used for SVG export functionalities\n * @type number | string\n */\n declare readonly id: string | number;\n\n static type = 'Gradient';\n\n constructor(options: GradientOptions) {\n const {\n type = 'linear' as T,\n gradientUnits = 'pixels',\n coords = {},\n colorStops = [],\n offsetX = 0,\n offsetY = 0,\n gradientTransform,\n id,\n } = options || {};\n Object.assign(this, {\n type,\n gradientUnits,\n coords: {\n ...(type === 'radial' ? radialDefaultCoords : linearDefaultCoords),\n ...coords,\n },\n colorStops,\n offsetX,\n offsetY,\n gradientTransform,\n id: id ? `${id}_${uid()}` : uid(),\n });\n }\n\n /**\n * Adds another colorStop\n * @param {Record} colorStop Object with offset and color\n * @return {Gradient} thisArg\n */\n addColorStop(colorStops: Record) {\n for (const position in colorStops) {\n this.colorStops.push({\n offset: parseFloat(position),\n color: colorStops[position],\n });\n }\n return this;\n }\n\n /**\n * Returns object representation of a gradient\n * @param {string[]} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {object}\n */\n toObject(\n propertiesToInclude?: (keyof this | string)[],\n ): SerializedGradientProps {\n return {\n ...pick(this, propertiesToInclude as (keyof this)[]),\n type: this.type,\n coords: { ...this.coords },\n colorStops: this.colorStops.map((colorStop) => ({ ...colorStop })),\n offsetX: this.offsetX,\n offsetY: this.offsetY,\n gradientUnits: this.gradientUnits,\n gradientTransform: this.gradientTransform\n ? [...this.gradientTransform]\n : undefined,\n };\n }\n\n /* _TO_SVG_START_ */\n /**\n * Returns SVG representation of an gradient\n * @param {FabricObject} object Object to create a gradient for\n * @return {String} SVG representation of an gradient (linear/radial)\n */\n toSVG(\n object: FabricObject,\n {\n additionalTransform: preTransform,\n }: { additionalTransform?: string } = {},\n ) {\n const markup = [],\n transform = (\n this.gradientTransform\n ? this.gradientTransform.concat()\n : iMatrix.concat()\n ) as TMat2D,\n gradientUnits =\n this.gradientUnits === 'pixels'\n ? 'userSpaceOnUse'\n : 'objectBoundingBox';\n // colorStops must be sorted ascending, and guarded against deep mutations\n const colorStops = this.colorStops\n .map((colorStop) => ({ ...colorStop }))\n .sort((a, b) => {\n return a.offset - b.offset;\n });\n\n let offsetX = -this.offsetX,\n offsetY = -this.offsetY;\n if (gradientUnits === 'objectBoundingBox') {\n offsetX /= object.width;\n offsetY /= object.height;\n } else {\n offsetX += object.width / 2;\n offsetY += object.height / 2;\n }\n // todo what about polygon/polyline?\n if (isPath(object) && this.gradientUnits !== 'percentage') {\n offsetX -= object.pathOffset.x;\n offsetY -= object.pathOffset.y;\n }\n transform[4] -= offsetX;\n transform[5] -= offsetY;\n\n const commonAttributes = [\n `id=\"SVGID_${this.id}\"`,\n `gradientUnits=\"${gradientUnits}\"`,\n `gradientTransform=\"${\n preTransform ? preTransform + ' ' : ''\n }${matrixToSVG(transform)}\"`,\n '',\n ].join(' ');\n\n if (this.type === 'linear') {\n const { x1, y1, x2, y2 } = this.coords;\n markup.push(\n '\\n',\n );\n } else if (this.type === 'radial') {\n const { x1, y1, x2, y2, r1, r2 } = this\n .coords as GradientCoords<'radial'>;\n const needsSwap = r1 > r2;\n // svg radial gradient has just 1 radius. the biggest.\n markup.push(\n '\\n',\n );\n if (needsSwap) {\n // svg goes from internal to external radius. if radius are inverted, swap color stops.\n colorStops.reverse(); // mutates array\n colorStops.forEach((colorStop) => {\n colorStop.offset = 1 - colorStop.offset;\n });\n }\n const minRadius = Math.min(r1, r2);\n if (minRadius > 0) {\n // i have to shift all colorStops and add new one in 0.\n const maxRadius = Math.max(r1, r2),\n percentageShift = minRadius / maxRadius;\n colorStops.forEach((colorStop) => {\n colorStop.offset += percentageShift * (1 - colorStop.offset);\n });\n }\n }\n\n colorStops.forEach(({ color, offset }) => {\n markup.push(\n `\\n`,\n );\n });\n\n markup.push(\n this.type === 'linear' ? '' : '',\n '\\n',\n );\n\n return markup.join('');\n }\n /* _TO_SVG_END_ */\n\n /**\n * Returns an instance of CanvasGradient\n * @param {CanvasRenderingContext2D} ctx Context to render on\n * @return {CanvasGradient}\n */\n toLive(ctx: CanvasRenderingContext2D): CanvasGradient {\n const { x1, y1, x2, y2, r1, r2 } = this.coords as GradientCoords<'radial'>;\n const gradient =\n this.type === 'linear'\n ? ctx.createLinearGradient(x1, y1, x2, y2)\n : ctx.createRadialGradient(x1, y1, r1, x2, y2, r2);\n\n this.colorStops.forEach(({ color, offset }) => {\n gradient.addColorStop(offset, color);\n });\n\n return gradient;\n }\n\n static async fromObject(\n options: GradientOptions<'linear'>,\n ): Promise>;\n static async fromObject(\n options: GradientOptions<'radial'>,\n ): Promise>;\n static async fromObject(\n options: GradientOptions<'linear'> | GradientOptions<'radial'>,\n ) {\n const { colorStops, gradientTransform } = options;\n return new this({\n ...options,\n colorStops: colorStops\n ? colorStops.map((colorStop) => ({ ...colorStop }))\n : undefined,\n gradientTransform: gradientTransform ? [...gradientTransform] : undefined,\n });\n }\n\n /* _FROM_SVG_START_ */\n /**\n * Returns {@link Gradient} instance from an SVG element\n * @param {SVGGradientElement} el SVG gradient element\n * @param {FabricObject} instance\n * @param {String} opacity A fill-opacity or stroke-opacity attribute to multiply to each stop's opacity.\n * @param {SVGOptions} svgOptions an object containing the size of the SVG in order to parse correctly gradients\n * that uses gradientUnits as 'userSpaceOnUse' and percentages.\n * @return {Gradient} Gradient instance\n * @see http://www.w3.org/TR/SVG/pservers.html#LinearGradientElement\n * @see http://www.w3.org/TR/SVG/pservers.html#RadialGradientElement\n *\n * @example\n *\n * \n * \n * \n * \n *\n * OR\n *\n * \n * \n * \n * \n *\n * OR\n *\n * \n * \n * \n * \n * \n *\n * OR\n *\n * \n * \n * \n * \n * \n *\n */\n static fromElement(\n el: SVGGradientElement,\n instance: FabricObject,\n svgOptions: SVGOptions,\n ): Gradient {\n const gradientUnits = parseGradientUnits(el);\n const center = instance._findCenterFromElement();\n return new this({\n id: el.getAttribute('id') || undefined,\n type: parseType(el),\n coords: parseCoords(el, {\n width: svgOptions.viewBoxWidth || svgOptions.width,\n height: svgOptions.viewBoxHeight || svgOptions.height,\n }),\n colorStops: parseColorStops(el, svgOptions.opacity),\n gradientUnits,\n gradientTransform: parseTransformAttribute(\n el.getAttribute('gradientTransform') || '',\n ),\n ...(gradientUnits === 'pixels'\n ? {\n offsetX: instance.width / 2 - center.x,\n offsetY: instance.height / 2 - center.y,\n }\n : {\n offsetX: 0,\n offsetY: 0,\n }),\n });\n }\n /* _FROM_SVG_END_ */\n}\n\nclassRegistry.setClass(Gradient, 'gradient');\nclassRegistry.setClass(Gradient, 'linear');\nclassRegistry.setClass(Gradient, 'radial');\n","import { config } from '../config';\nimport type { Abortable, TCrossOrigin, TMat2D, TSize } from '../typedefs';\nimport { ifNaN } from '../util/internals/ifNaN';\nimport { uid } from '../util/internals/uid';\nimport { loadImage } from '../util/misc/objectEnlive';\nimport { pick } from '../util/misc/pick';\nimport { toFixed } from '../util/misc/toFixed';\nimport { classRegistry } from '../ClassRegistry';\nimport type {\n PatternRepeat,\n PatternOptions,\n SerializedPatternOptions,\n} from './types';\nimport { log } from '../util/internals/console';\n\n/**\n * @see {@link http://fabricjs.com/patterns demo}\n * @see {@link http://fabricjs.com/dynamic-patterns demo}\n */\nexport class Pattern {\n static type = 'Pattern';\n\n /**\n * Legacy identifier of the class. Prefer using this.constructor.type 'Pattern'\n * or utils like isPattern, or instance of to indentify a pattern in your code.\n * Will be removed in future versiones\n * @TODO add sustainable warning message\n * @type string\n * @deprecated\n */\n get type() {\n return 'pattern';\n }\n\n set type(value) {\n log('warn', 'Setting type has no effect', value);\n }\n\n /**\n * @type PatternRepeat\n * @defaults\n */\n repeat: PatternRepeat = 'repeat';\n\n /**\n * Pattern horizontal offset from object's left/top corner\n * @type Number\n */\n offsetX = 0;\n\n /**\n * Pattern vertical offset from object's left/top corner\n * @type Number\n */\n offsetY = 0;\n\n /**\n * @type TCrossOrigin\n */\n crossOrigin: TCrossOrigin = '';\n\n /**\n * transform matrix to change the pattern, imported from svgs.\n * @todo verify if using the identity matrix as default makes the rest of the code more easy\n * @type Array\n */\n declare patternTransform?: TMat2D;\n\n /**\n * The actual pixel source of the pattern\n */\n declare source: CanvasImageSource;\n\n /**\n * If true, this object will not be exported during the serialization of a canvas\n * @type boolean\n */\n declare excludeFromExport?: boolean;\n\n /**\n * ID used for SVG export functionalities\n * @type number\n */\n declare readonly id: number;\n\n /**\n * Constructor\n * @param {Object} [options] Options object\n * @param {option.source} [source] the pattern source, eventually empty or a drawable\n */\n constructor(options: PatternOptions) {\n this.id = uid();\n Object.assign(this, options);\n }\n\n /**\n * @returns true if {@link source} is an element\n */\n isImageSource(): this is { source: HTMLImageElement } {\n return (\n !!this.source && typeof (this.source as HTMLImageElement).src === 'string'\n );\n }\n\n /**\n * @returns true if {@link source} is a element\n */\n isCanvasSource(): this is { source: HTMLCanvasElement } {\n return !!this.source && !!(this.source as HTMLCanvasElement).toDataURL;\n }\n\n sourceToString(): string {\n return this.isImageSource()\n ? this.source.src\n : this.isCanvasSource()\n ? this.source.toDataURL()\n : '';\n }\n\n /**\n * Returns an instance of CanvasPattern\n * @param {CanvasRenderingContext2D} ctx Context to create pattern\n * @return {CanvasPattern}\n */\n toLive(ctx: CanvasRenderingContext2D): CanvasPattern | null {\n if (\n // if the image failed to load, return, and allow rest to continue loading\n !this.source ||\n // if an image\n (this.isImageSource() &&\n (!this.source.complete ||\n this.source.naturalWidth === 0 ||\n this.source.naturalHeight === 0))\n ) {\n return null;\n }\n\n return ctx.createPattern(this.source, this.repeat)!;\n }\n\n /**\n * Returns object representation of a pattern\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {object} Object representation of a pattern instance\n */\n toObject(propertiesToInclude: string[] = []): Record {\n const { repeat, crossOrigin } = this;\n return {\n ...pick(this, propertiesToInclude as (keyof this)[]),\n type: 'pattern',\n source: this.sourceToString(),\n repeat,\n crossOrigin,\n offsetX: toFixed(this.offsetX, config.NUM_FRACTION_DIGITS),\n offsetY: toFixed(this.offsetY, config.NUM_FRACTION_DIGITS),\n patternTransform: this.patternTransform\n ? [...this.patternTransform]\n : null,\n };\n }\n\n /* _TO_SVG_START_ */\n /**\n * Returns SVG representation of a pattern\n */\n toSVG({ width, height }: TSize): string {\n const { source: patternSource, repeat, id } = this,\n patternOffsetX = ifNaN(this.offsetX / width, 0),\n patternOffsetY = ifNaN(this.offsetY / height, 0),\n patternWidth =\n repeat === 'repeat-y' || repeat === 'no-repeat'\n ? 1 + Math.abs(patternOffsetX || 0)\n : ifNaN((patternSource as HTMLImageElement).width / width, 0),\n patternHeight =\n repeat === 'repeat-x' || repeat === 'no-repeat'\n ? 1 + Math.abs(patternOffsetY || 0)\n : ifNaN((patternSource as HTMLImageElement).height / height, 0);\n\n return [\n ``,\n ``,\n ``,\n '',\n ].join('\\n');\n }\n /* _TO_SVG_END_ */\n\n static async fromObject(\n {\n type,\n source,\n patternTransform,\n ...otherOptions\n }: SerializedPatternOptions,\n options?: Abortable,\n ): Promise {\n const img = await loadImage(source, {\n ...options,\n crossOrigin: otherOptions.crossOrigin,\n });\n return new this({\n ...otherOptions,\n patternTransform:\n patternTransform && (patternTransform.slice(0) as TMat2D),\n source: img,\n });\n }\n}\n\nclassRegistry.setClass(Pattern);\n// kept for compatibility reason\nclassRegistry.setClass(Pattern, 'pattern');\n","import { Color } from '../color/Color';\nimport type { Point } from '../Point';\nimport type { Shadow } from '../Shadow';\nimport type { Canvas } from '../canvas/Canvas';\nimport type { TBrushEventData } from './typedefs';\n\n/**\n * @see {@link http://fabricjs.com/freedrawing|Freedrawing demo}\n */\nexport abstract class BaseBrush {\n /**\n * Color of a brush\n * @type String\n */\n color = 'rgb(0, 0, 0)';\n\n /**\n * Width of a brush, has to be a Number, no string literals\n * @type Number\n */\n width = 1;\n\n /**\n * Shadow object representing shadow of this shape.\n * Backwards incompatibility note: This property replaces \"shadowColor\" (String), \"shadowOffsetX\" (Number),\n * \"shadowOffsetY\" (Number) and \"shadowBlur\" (Number) since v1.2.12\n * @type Shadow\n */\n shadow: Shadow | null = null;\n\n /**\n * Line endings style of a brush (one of \"butt\", \"round\", \"square\")\n * @type String\n */\n strokeLineCap: CanvasLineCap = 'round';\n\n /**\n * Corner style of a brush (one of \"bevel\", \"round\", \"miter\")\n * @type String\n */\n strokeLineJoin: CanvasLineJoin = 'round';\n\n /**\n * Maximum miter length (used for strokeLineJoin = \"miter\") of a brush's\n * @type Number\n */\n strokeMiterLimit = 10;\n\n /**\n * Stroke Dash Array.\n * @type Array\n */\n strokeDashArray: number[] | null = null;\n\n /**\n * When `true`, the free drawing is limited to the whiteboard size. Default to false.\n * @type Boolean\n * @default false\n */\n\n limitedToCanvasSize = false;\n\n /**\n * @todo add type\n */\n declare canvas: Canvas;\n\n constructor(canvas: Canvas) {\n this.canvas = canvas;\n }\n\n abstract _render(): void;\n abstract onMouseDown(pointer: Point, ev: TBrushEventData): void;\n abstract onMouseMove(pointer: Point, ev: TBrushEventData): void;\n /**\n * @returns true if brush should continue blocking interaction\n */\n abstract onMouseUp(ev: TBrushEventData): boolean | void;\n\n /**\n * Sets brush styles\n * @private\n * @param {CanvasRenderingContext2D} ctx\n */\n _setBrushStyles(ctx: CanvasRenderingContext2D) {\n ctx.strokeStyle = this.color;\n ctx.lineWidth = this.width;\n ctx.lineCap = this.strokeLineCap;\n ctx.miterLimit = this.strokeMiterLimit;\n ctx.lineJoin = this.strokeLineJoin;\n ctx.setLineDash(this.strokeDashArray || []);\n }\n\n /**\n * Sets the transformation on given context\n * @param {CanvasRenderingContext2D} ctx context to render on\n * @private\n */\n protected _saveAndTransform(ctx: CanvasRenderingContext2D) {\n const v = this.canvas.viewportTransform;\n ctx.save();\n ctx.transform(v[0], v[1], v[2], v[3], v[4], v[5]);\n }\n\n protected needsFullRender() {\n const color = new Color(this.color);\n return color.getAlpha() < 1 || !!this.shadow;\n }\n\n /**\n * Sets brush shadow styles\n * @private\n */\n protected _setShadow() {\n if (!this.shadow || !this.canvas) {\n return;\n }\n\n const canvas = this.canvas,\n shadow = this.shadow,\n ctx = canvas.contextTop,\n zoom = canvas.getZoom() * canvas.getRetinaScaling();\n\n ctx.shadowColor = shadow.color;\n ctx.shadowBlur = shadow.blur * zoom;\n ctx.shadowOffsetX = shadow.offsetX * zoom;\n ctx.shadowOffsetY = shadow.offsetY * zoom;\n }\n\n /**\n * Removes brush shadow styles\n * @private\n */\n protected _resetShadow() {\n const ctx = this.canvas.contextTop;\n\n ctx.shadowColor = '';\n ctx.shadowBlur = ctx.shadowOffsetX = ctx.shadowOffsetY = 0;\n }\n\n /**\n * Check is pointer is outside canvas boundaries\n * @param {Object} pointer\n * @private\n */\n protected _isOutSideCanvas(pointer: Point) {\n return (\n pointer.x < 0 ||\n pointer.x > this.canvas.getWidth() ||\n pointer.y < 0 ||\n pointer.y > this.canvas.getHeight()\n );\n }\n}\n","import { config } from '../config';\nimport { SHARED_ATTRIBUTES } from '../parser/attributes';\nimport { parseAttributes } from '../parser/parseAttributes';\nimport type { XY } from '../Point';\nimport { Point } from '../Point';\nimport { makeBoundingBoxFromPoints } from '../util/misc/boundingBoxFromPoints';\nimport { toFixed } from '../util/misc/toFixed';\nimport {\n getBoundsOfCurve,\n joinPath,\n makePathSimpler,\n parsePath,\n} from '../util/path';\nimport { classRegistry } from '../ClassRegistry';\nimport { FabricObject, cacheProperties } from './Object/FabricObject';\nimport type {\n TComplexPathData,\n TPathSegmentInfo,\n TSimplePathData,\n} from '../util/path/typedefs';\nimport type { FabricObjectProps, SerializedObjectProps } from './Object/types';\nimport type { ObjectEvents } from '../EventTypeDefs';\nimport type {\n TBBox,\n TClassProperties,\n TSVGReviver,\n TOptions,\n} from '../typedefs';\nimport { CENTER, LEFT, TOP } from '../constants';\nimport type { CSSRules } from '../parser/typedefs';\n\ninterface UniquePathProps {\n sourcePath?: string;\n path?: TSimplePathData;\n}\n\nexport interface SerializedPathProps\n extends SerializedObjectProps,\n UniquePathProps {}\n\nexport interface PathProps extends FabricObjectProps, UniquePathProps {}\n\nexport interface IPathBBox extends TBBox {\n left: number;\n top: number;\n pathOffset: Point;\n}\n\nexport class Path<\n Props extends TOptions = Partial,\n SProps extends SerializedPathProps = SerializedPathProps,\n EventSpec extends ObjectEvents = ObjectEvents,\n> extends FabricObject {\n /**\n * Array of path points\n * @type Array\n */\n declare path: TSimplePathData;\n\n declare pathOffset: Point;\n\n declare sourcePath?: string;\n\n declare segmentsInfo?: TPathSegmentInfo[];\n\n static type = 'Path';\n\n static cacheProperties = [...cacheProperties, 'path', 'fillRule'];\n\n /**\n * Constructor\n * @param {TComplexPathData} path Path data (sequence of coordinates and corresponding \"command\" tokens)\n * @param {Partial} [options] Options object\n * @return {Path} thisArg\n */\n constructor(\n path: TComplexPathData | string,\n // todo: evaluate this spread here\n { path: _, left, top, ...options }: Partial = {},\n ) {\n super();\n Object.assign(this, Path.ownDefaults);\n this.setOptions(options);\n this._setPath(path || [], true);\n typeof left === 'number' && this.set(LEFT, left);\n typeof top === 'number' && this.set(TOP, top);\n }\n\n /**\n * @private\n * @param {TComplexPathData | string} path Path data (sequence of coordinates and corresponding \"command\" tokens)\n * @param {boolean} [adjustPosition] pass true to reposition the object according to the bounding box\n * @returns {Point} top left position of the bounding box, useful for complementary positioning\n */\n _setPath(path: TComplexPathData | string, adjustPosition?: boolean) {\n this.path = makePathSimpler(Array.isArray(path) ? path : parsePath(path));\n this.setBoundingBox(adjustPosition);\n }\n\n /**\n * This function is an helper for svg import. it returns the center of the object in the svg\n * untransformed coordinates, by look at the polyline/polygon points.\n * @private\n * @return {Point} center point from element coordinates\n */\n _findCenterFromElement(): Point {\n const bbox = this._calcBoundsFromPath();\n return new Point(bbox.left + bbox.width / 2, bbox.top + bbox.height / 2);\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx context to render path on\n */\n _renderPathCommands(ctx: CanvasRenderingContext2D) {\n const l = -this.pathOffset.x,\n t = -this.pathOffset.y;\n\n ctx.beginPath();\n\n for (const command of this.path) {\n switch (\n command[0] // first letter\n ) {\n case 'L': // lineto, absolute\n ctx.lineTo(command[1] + l, command[2] + t);\n break;\n\n case 'M': // moveTo, absolute\n ctx.moveTo(command[1] + l, command[2] + t);\n break;\n\n case 'C': // bezierCurveTo, absolute\n ctx.bezierCurveTo(\n command[1] + l,\n command[2] + t,\n command[3] + l,\n command[4] + t,\n command[5] + l,\n command[6] + t,\n );\n break;\n\n case 'Q': // quadraticCurveTo, absolute\n ctx.quadraticCurveTo(\n command[1] + l,\n command[2] + t,\n command[3] + l,\n command[4] + t,\n );\n break;\n\n case 'Z':\n ctx.closePath();\n break;\n }\n }\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx context to render path on\n */\n _render(ctx: CanvasRenderingContext2D) {\n this._renderPathCommands(ctx);\n this._renderPaintInOrder(ctx);\n }\n\n /**\n * Returns string representation of an instance\n * @return {string} string representation of an instance\n */\n toString() {\n return `#`;\n }\n\n /**\n * Returns object representation of an instance\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} object representation of an instance\n */\n toObject<\n T extends Omit, keyof SProps>,\n K extends keyof T = never,\n >(propertiesToInclude: K[] = []): Pick & SProps {\n return {\n ...super.toObject(propertiesToInclude),\n path: this.path.map((pathCmd) => pathCmd.slice()),\n };\n }\n\n /**\n * Returns dataless object representation of an instance\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} object representation of an instance\n */\n toDatalessObject<\n T extends Omit, keyof SProps>,\n K extends keyof T = never,\n >(propertiesToInclude: K[] = []): Pick & SProps {\n const o = this.toObject(propertiesToInclude);\n if (this.sourcePath) {\n delete o.path;\n o.sourcePath = this.sourcePath;\n }\n return o;\n }\n\n /**\n * Returns svg representation of an instance\n * @return {Array} an array of strings with the specific svg representation\n * of the instance\n */\n _toSVG() {\n const path = joinPath(this.path, config.NUM_FRACTION_DIGITS);\n return [\n '\\n`,\n ];\n }\n\n /**\n * @private\n * @return the path command's translate transform attribute\n */\n _getOffsetTransform() {\n const digits = config.NUM_FRACTION_DIGITS;\n return ` translate(${toFixed(-this.pathOffset.x, digits)}, ${toFixed(\n -this.pathOffset.y,\n digits,\n )})`;\n }\n\n /**\n * Returns svg clipPath representation of an instance\n * @param {Function} [reviver] Method for further parsing of svg representation.\n * @return {string} svg representation of an instance\n */\n toClipPathSVG(reviver?: TSVGReviver): string {\n const additionalTransform = this._getOffsetTransform();\n return (\n '\\t' +\n this._createBaseClipPathSVGMarkup(this._toSVG(), {\n reviver,\n additionalTransform: additionalTransform,\n })\n );\n }\n\n /**\n * Returns svg representation of an instance\n * @param {Function} [reviver] Method for further parsing of svg representation.\n * @return {string} svg representation of an instance\n */\n toSVG(reviver?: TSVGReviver): string {\n const additionalTransform = this._getOffsetTransform();\n return this._createBaseSVGMarkup(this._toSVG(), {\n reviver,\n additionalTransform: additionalTransform,\n });\n }\n\n /**\n * Returns number representation of an instance complexity\n * @return {number} complexity of this instance\n */\n complexity() {\n return this.path.length;\n }\n\n setDimensions() {\n this.setBoundingBox();\n }\n\n setBoundingBox(adjustPosition?: boolean) {\n const { width, height, pathOffset } = this._calcDimensions();\n this.set({ width, height, pathOffset });\n // using pathOffset because it match the use case.\n // if pathOffset change here we need to use left + width/2 , top + height/2\n adjustPosition && this.setPositionByOrigin(pathOffset, CENTER, CENTER);\n }\n\n _calcBoundsFromPath(): TBBox {\n const bounds: XY[] = [];\n let subpathStartX = 0,\n subpathStartY = 0,\n x = 0, // current x\n y = 0; // current y\n\n for (const command of this.path) {\n // current instruction\n switch (\n command[0] // first letter\n ) {\n case 'L': // lineto, absolute\n x = command[1];\n y = command[2];\n bounds.push({ x: subpathStartX, y: subpathStartY }, { x, y });\n break;\n\n case 'M': // moveTo, absolute\n x = command[1];\n y = command[2];\n subpathStartX = x;\n subpathStartY = y;\n break;\n\n case 'C': // bezierCurveTo, absolute\n bounds.push(\n ...getBoundsOfCurve(\n x,\n y,\n command[1],\n command[2],\n command[3],\n command[4],\n command[5],\n command[6],\n ),\n );\n x = command[5];\n y = command[6];\n break;\n\n case 'Q': // quadraticCurveTo, absolute\n bounds.push(\n ...getBoundsOfCurve(\n x,\n y,\n command[1],\n command[2],\n command[1],\n command[2],\n command[3],\n command[4],\n ),\n );\n x = command[3];\n y = command[4];\n break;\n\n case 'Z':\n x = subpathStartX;\n y = subpathStartY;\n break;\n }\n }\n return makeBoundingBoxFromPoints(bounds);\n }\n\n /**\n * @private\n */\n _calcDimensions(): IPathBBox {\n const bbox = this._calcBoundsFromPath();\n\n return {\n ...bbox,\n pathOffset: new Point(\n bbox.left + bbox.width / 2,\n bbox.top + bbox.height / 2,\n ),\n };\n }\n\n /**\n * List of attribute names to account for when parsing SVG element (used by `Path.fromElement`)\n * @see http://www.w3.org/TR/SVG/paths.html#PathElement\n */\n static ATTRIBUTE_NAMES = [...SHARED_ATTRIBUTES, 'd'];\n\n /**\n * Creates an instance of Path from an object\n * @param {Object} object\n * @returns {Promise}\n */\n static fromObject>(object: T) {\n return this._fromObject(object, {\n extraParam: 'path',\n });\n }\n\n /**\n * Creates an instance of Path from an SVG element\n * @param {HTMLElement} element to parse\n * @param {Partial} [options] Options object\n */\n static async fromElement(\n element: HTMLElement | SVGElement,\n options?: Partial,\n cssRules?: CSSRules,\n ) {\n const { d, ...parsedAttributes } = parseAttributes(\n element,\n this.ATTRIBUTE_NAMES,\n cssRules,\n );\n return new this(d, {\n ...parsedAttributes,\n ...options,\n // we pass undefined to instruct the constructor to position the object using the bbox\n left: undefined,\n top: undefined,\n });\n }\n}\n\nclassRegistry.setClass(Path);\nclassRegistry.setSVGClass(Path);\n\n/* _FROM_SVG_START_ */\n","import type { ModifierKey, TEvent } from '../EventTypeDefs';\nimport type { Point } from '../Point';\nimport { Shadow } from '../Shadow';\nimport { Path } from '../shapes/Path';\nimport { getSmoothPathFromPoints, joinPath } from '../util/path';\nimport type { Canvas } from '../canvas/Canvas';\nimport { BaseBrush } from './BaseBrush';\nimport type { TSimplePathData } from '../util/path/typedefs';\n\n/**\n * @private\n * @param {TSimplePathData} pathData SVG path commands\n * @returns {boolean}\n */\nfunction isEmptySVGPath(pathData: TSimplePathData): boolean {\n return joinPath(pathData) === 'M 0 0 Q 0 0 0 0 L 0 0';\n}\n\nexport class PencilBrush extends BaseBrush {\n /**\n * Discard points that are less than `decimate` pixel distant from each other\n * @type Number\n * @default 0.4\n */\n decimate = 0.4;\n\n /**\n * Draws a straight line between last recorded point to current pointer\n * Used for `shift` functionality\n *\n * @type boolean\n * @default false\n */\n drawStraightLine = false;\n\n /**\n * The event modifier key that makes the brush draw a straight line.\n * If `null` or 'none' or any other string that is not a modifier key the feature is disabled.\n * @type {ModifierKey | undefined | null}\n */\n straightLineKey: ModifierKey | undefined | null = 'shiftKey';\n\n declare protected _points: Point[];\n declare protected _hasStraightLine: boolean;\n declare protected oldEnd?: Point;\n\n constructor(canvas: Canvas) {\n super(canvas);\n this._points = [];\n this._hasStraightLine = false;\n }\n\n needsFullRender() {\n return super.needsFullRender() || this._hasStraightLine;\n }\n\n static drawSegment(ctx: CanvasRenderingContext2D, p1: Point, p2: Point) {\n const midPoint = p1.midPointFrom(p2);\n ctx.quadraticCurveTo(p1.x, p1.y, midPoint.x, midPoint.y);\n return midPoint;\n }\n\n /**\n * Invoked on mouse down\n * @param {Point} pointer\n */\n onMouseDown(pointer: Point, { e }: TEvent) {\n if (!this.canvas._isMainEvent(e)) {\n return;\n }\n this.drawStraightLine = !!this.straightLineKey && e[this.straightLineKey];\n this._prepareForDrawing(pointer);\n // capture coordinates immediately\n // this allows to draw dots (when movement never occurs)\n this._addPoint(pointer);\n this._render();\n }\n\n /**\n * Invoked on mouse move\n * @param {Point} pointer\n */\n onMouseMove(pointer: Point, { e }: TEvent) {\n if (!this.canvas._isMainEvent(e)) {\n return;\n }\n this.drawStraightLine = !!this.straightLineKey && e[this.straightLineKey];\n if (this.limitedToCanvasSize === true && this._isOutSideCanvas(pointer)) {\n return;\n }\n if (this._addPoint(pointer) && this._points.length > 1) {\n if (this.needsFullRender()) {\n // redraw curve\n // clear top canvas\n this.canvas.clearContext(this.canvas.contextTop);\n this._render();\n } else {\n const points = this._points,\n length = points.length,\n ctx = this.canvas.contextTop;\n // draw the curve update\n this._saveAndTransform(ctx);\n if (this.oldEnd) {\n ctx.beginPath();\n ctx.moveTo(this.oldEnd.x, this.oldEnd.y);\n }\n this.oldEnd = PencilBrush.drawSegment(\n ctx,\n points[length - 2],\n points[length - 1],\n );\n ctx.stroke();\n ctx.restore();\n }\n }\n }\n\n /**\n * Invoked on mouse up\n */\n onMouseUp({ e }: TEvent) {\n if (!this.canvas._isMainEvent(e)) {\n return true;\n }\n this.drawStraightLine = false;\n this.oldEnd = undefined;\n this._finalizeAndAddPath();\n\n return false;\n }\n\n /**\n * @private\n * @param {Point} pointer Actual mouse position related to the canvas.\n */\n _prepareForDrawing(pointer: Point) {\n this._reset();\n this._addPoint(pointer);\n this.canvas.contextTop.moveTo(pointer.x, pointer.y);\n }\n\n /**\n * @private\n * @param {Point} point Point to be added to points array\n */\n _addPoint(point: Point) {\n if (\n this._points.length > 1 &&\n point.eq(this._points[this._points.length - 1])\n ) {\n return false;\n }\n if (this.drawStraightLine && this._points.length > 1) {\n this._hasStraightLine = true;\n this._points.pop();\n }\n this._points.push(point);\n return true;\n }\n\n /**\n * Clear points array and set contextTop canvas style.\n * @private\n */\n _reset() {\n this._points = [];\n this._setBrushStyles(this.canvas.contextTop);\n this._setShadow();\n this._hasStraightLine = false;\n }\n\n /**\n * Draw a smooth path on the topCanvas using quadraticCurveTo\n * @private\n * @param {CanvasRenderingContext2D} [ctx]\n */\n _render(ctx: CanvasRenderingContext2D = this.canvas.contextTop) {\n let p1 = this._points[0],\n p2 = this._points[1];\n this._saveAndTransform(ctx);\n ctx.beginPath();\n //if we only have 2 points in the path and they are the same\n //it means that the user only clicked the canvas without moving the mouse\n //then we should be drawing a dot. A path isn't drawn between two identical dots\n //that's why we set them apart a bit\n if (this._points.length === 2 && p1.x === p2.x && p1.y === p2.y) {\n const width = this.width / 1000;\n p1.x -= width;\n p2.x += width;\n }\n ctx.moveTo(p1.x, p1.y);\n\n for (let i = 1; i < this._points.length; i++) {\n // we pick the point between pi + 1 & pi + 2 as the\n // end point and p1 as our control point.\n PencilBrush.drawSegment(ctx, p1, p2);\n p1 = this._points[i];\n p2 = this._points[i + 1];\n }\n // Draw last line as a straight line while\n // we wait for the next point to be able to calculate\n // the bezier control point\n ctx.lineTo(p1.x, p1.y);\n ctx.stroke();\n ctx.restore();\n }\n\n /**\n * Converts points to SVG path\n * @param {Point[]} points Array of points\n * @return {TSimplePathData} SVG path commands\n */\n convertPointsToSVGPath(points: Point[]): TSimplePathData {\n const correction = this.width / 1000;\n return getSmoothPathFromPoints(points, correction);\n }\n\n /**\n * Creates a Path object to add on canvas\n * @param {TSimplePathData} pathData Path data\n * @return {Path} Path to add on canvas\n */\n createPath(pathData: TSimplePathData): Path {\n const path = new Path(pathData, {\n fill: null,\n stroke: this.color,\n strokeWidth: this.width,\n strokeLineCap: this.strokeLineCap,\n strokeMiterLimit: this.strokeMiterLimit,\n strokeLineJoin: this.strokeLineJoin,\n strokeDashArray: this.strokeDashArray,\n });\n if (this.shadow) {\n this.shadow.affectStroke = true;\n path.shadow = new Shadow(this.shadow);\n }\n\n return path;\n }\n\n /**\n * Decimate points array with the decimate value\n */\n decimatePoints(points: Point[], distance: number) {\n if (points.length <= 2) {\n return points;\n }\n let lastPoint = points[0],\n cDistance;\n const zoom = this.canvas.getZoom(),\n adjustedDistance = Math.pow(distance / zoom, 2),\n l = points.length - 1,\n newPoints = [lastPoint];\n // TODO investigate why this is not i < l\n for (let i = 1; i < l - 1; i++) {\n cDistance =\n Math.pow(lastPoint.x - points[i].x, 2) +\n Math.pow(lastPoint.y - points[i].y, 2);\n if (cDistance >= adjustedDistance) {\n lastPoint = points[i];\n newPoints.push(lastPoint);\n }\n }\n // Add the last point from the original line to the end of the array.\n // This ensures decimate doesn't delete the last point on the line, and ensures the line is > 1 point.\n newPoints.push(points[l]);\n return newPoints;\n }\n\n /**\n * On mouseup after drawing the path on contextTop canvas\n * we use the points captured to create an new Path object\n * and add it to the canvas.\n */\n _finalizeAndAddPath() {\n const ctx = this.canvas.contextTop;\n ctx.closePath();\n if (this.decimate) {\n this._points = this.decimatePoints(this._points, this.decimate);\n }\n const pathData = this.convertPointsToSVGPath(this._points);\n if (isEmptySVGPath(pathData)) {\n // do not create 0 width/height paths, as they are\n // rendered inconsistently across browsers\n // Firefox 4, for example, renders a dot,\n // whereas Chrome 10 renders nothing\n this.canvas.requestRenderAll();\n return;\n }\n\n const path = this.createPath(pathData);\n this.canvas.clearContext(this.canvas.contextTop);\n this.canvas.fire('before:path:created', { path: path });\n this.canvas.add(path);\n this.canvas.requestRenderAll();\n path.setCoords();\n this._resetShadow();\n\n // fire event 'path' created\n this.canvas.fire('path:created', { path: path });\n }\n}\n","import type { ObjectEvents } from '../EventTypeDefs';\nimport { SHARED_ATTRIBUTES } from '../parser/attributes';\nimport { parseAttributes } from '../parser/parseAttributes';\nimport { cos } from '../util/misc/cos';\nimport { degreesToRadians } from '../util/misc/radiansDegreesConversion';\nimport { sin } from '../util/misc/sin';\nimport { classRegistry } from '../ClassRegistry';\nimport { FabricObject, cacheProperties } from './Object/FabricObject';\nimport type { Abortable, TClassProperties, TOptions } from '../typedefs';\nimport type { FabricObjectProps, SerializedObjectProps } from './Object/types';\nimport type { CSSRules } from '../parser/typedefs';\nimport { SCALE_X, SCALE_Y } from '../constants';\n\ninterface UniqueCircleProps {\n /**\n * Radius of this circle\n * @type Number\n * @default 0\n */\n radius: number;\n\n /**\n * Angle for the start of the circle, in degrees.\n * @type TDegree 0 - 359\n * @default 0\n */\n startAngle: number;\n\n /**\n * Angle for the end of the circle, in degrees\n * @type TDegree 1 - 360\n * @default 360\n */\n endAngle: number;\n\n /**\n * Orientation for the direction of the circle.\n * Setting to true will switch the arc of the circle to traverse from startAngle to endAngle in a counter-clockwise direction.\n * Note: this will only change how the circle is drawn, and does not affect rotational transformation.\n * @default false\n */\n counterClockwise: boolean;\n}\n\nexport interface SerializedCircleProps\n extends SerializedObjectProps,\n UniqueCircleProps {}\n\nexport interface CircleProps extends FabricObjectProps, UniqueCircleProps {}\n\nconst CIRCLE_PROPS = [\n 'radius',\n 'startAngle',\n 'endAngle',\n 'counterClockwise',\n] as const;\n\nexport const circleDefaultValues: Partial> = {\n radius: 0,\n startAngle: 0,\n endAngle: 360,\n counterClockwise: false,\n};\n\nexport class Circle<\n Props extends TOptions = Partial,\n SProps extends SerializedCircleProps = SerializedCircleProps,\n EventSpec extends ObjectEvents = ObjectEvents,\n >\n extends FabricObject\n implements UniqueCircleProps\n{\n declare radius: number;\n declare startAngle: number;\n declare endAngle: number;\n declare counterClockwise: boolean;\n\n static type = 'Circle';\n\n static cacheProperties = [...cacheProperties, ...CIRCLE_PROPS];\n\n static ownDefaults = circleDefaultValues;\n\n static getDefaults(): Record {\n return {\n ...super.getDefaults(),\n ...Circle.ownDefaults,\n };\n }\n\n /**\n * Constructor\n * @param {Object} [options] Options object\n */\n constructor(options?: Props) {\n super();\n Object.assign(this, Circle.ownDefaults);\n this.setOptions(options);\n }\n\n /**\n * @private\n * @param {String} key\n * @param {*} value\n */\n _set(key: string, value: any) {\n super._set(key, value);\n\n if (key === 'radius') {\n this.setRadius(value);\n }\n\n return this;\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx context to render on\n */\n _render(ctx: CanvasRenderingContext2D) {\n ctx.beginPath();\n ctx.arc(\n 0,\n 0,\n this.radius,\n degreesToRadians(this.startAngle),\n degreesToRadians(this.endAngle),\n this.counterClockwise,\n );\n this._renderPaintInOrder(ctx);\n }\n\n /**\n * Returns horizontal radius of an object (according to how an object is scaled)\n * @return {Number}\n */\n getRadiusX(): number {\n return this.get('radius') * this.get(SCALE_X);\n }\n\n /**\n * Returns vertical radius of an object (according to how an object is scaled)\n * @return {Number}\n */\n getRadiusY(): number {\n return this.get('radius') * this.get(SCALE_Y);\n }\n\n /**\n * Sets radius of an object (and updates width accordingly)\n */\n setRadius(value: number) {\n this.radius = value;\n this.set({ width: value * 2, height: value * 2 });\n }\n\n /**\n * Returns object representation of an instance\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} object representation of an instance\n */\n toObject<\n T extends Omit, keyof SProps>,\n K extends keyof T = never,\n >(propertiesToInclude: K[] = []): Pick & SProps {\n return super.toObject([...CIRCLE_PROPS, ...propertiesToInclude]);\n }\n\n /* _TO_SVG_START_ */\n\n /**\n * Returns svg representation of an instance\n * @return {Array} an array of strings with the specific svg representation\n * of the instance\n */\n _toSVG(): string[] {\n const angle = (this.endAngle - this.startAngle) % 360;\n\n if (angle === 0) {\n return [\n '\\n',\n ];\n } else {\n const { radius } = this;\n const start = degreesToRadians(this.startAngle),\n end = degreesToRadians(this.endAngle),\n startX = cos(start) * radius,\n startY = sin(start) * radius,\n endX = cos(end) * radius,\n endY = sin(end) * radius,\n largeFlag = angle > 180 ? 1 : 0,\n sweepFlag = this.counterClockwise ? 0 : 1;\n return [\n `\\n',\n ];\n }\n }\n /* _TO_SVG_END_ */\n\n /* _FROM_SVG_START_ */\n /**\n * List of attribute names to account for when parsing SVG element (used by {@link Circle.fromElement})\n * @see: http://www.w3.org/TR/SVG/shapes.html#CircleElement\n */\n static ATTRIBUTE_NAMES = ['cx', 'cy', 'r', ...SHARED_ATTRIBUTES];\n\n /**\n * Returns {@link Circle} instance from an SVG element\n * @param {HTMLElement} element Element to parse\n * @param {Object} [options] Partial Circle object to default missing properties on the element.\n * @throws {Error} If value of `r` attribute is missing or invalid\n */\n static async fromElement(\n element: HTMLElement,\n options: Abortable,\n cssRules?: CSSRules,\n ): Promise {\n const {\n left = 0,\n top = 0,\n radius = 0,\n ...otherParsedAttributes\n } = parseAttributes(\n element,\n this.ATTRIBUTE_NAMES,\n cssRules,\n ) as Partial;\n\n // this probably requires to be fixed for default origins not being top/left.\n\n return new this({\n ...otherParsedAttributes,\n radius,\n left: left - radius,\n top: top - radius,\n });\n }\n\n /* _FROM_SVG_END_ */\n\n /**\n * @todo how do we declare this??\n */\n static fromObject>(object: T) {\n return super._fromObject(object);\n }\n}\n\nclassRegistry.setClass(Circle);\nclassRegistry.setSVGClass(Circle);\n","import { Color } from '../color/Color';\nimport type { Point } from '../Point';\nimport { Shadow } from '../Shadow';\nimport { Circle } from '../shapes/Circle';\nimport { Group } from '../shapes/Group';\nimport { getRandomInt } from '../util/internals/getRandomInt';\nimport type { Canvas } from '../canvas/Canvas';\nimport { BaseBrush } from './BaseBrush';\nimport type { CircleBrushPoint } from './typedefs';\nimport { CENTER } from '../constants';\n\nexport class CircleBrush extends BaseBrush {\n /**\n * Width of a brush\n * @type Number\n */\n width = 10;\n\n declare points: CircleBrushPoint[];\n\n constructor(canvas: Canvas) {\n super(canvas);\n this.points = [];\n }\n\n /**\n * Invoked inside on mouse down and mouse move\n * @param {Point} pointer\n */\n drawDot(pointer: Point) {\n const point = this.addPoint(pointer),\n ctx = this.canvas.contextTop;\n this._saveAndTransform(ctx);\n this.dot(ctx, point);\n ctx.restore();\n }\n\n dot(ctx: CanvasRenderingContext2D, point: CircleBrushPoint) {\n ctx.fillStyle = point.fill;\n ctx.beginPath();\n ctx.arc(point.x, point.y, point.radius, 0, Math.PI * 2, false);\n ctx.closePath();\n ctx.fill();\n }\n\n /**\n * Invoked on mouse down\n */\n onMouseDown(pointer: Point) {\n this.points = [];\n this.canvas.clearContext(this.canvas.contextTop);\n this._setShadow();\n this.drawDot(pointer);\n }\n\n /**\n * Render the full state of the brush\n * @private\n */\n _render() {\n const ctx = this.canvas.contextTop,\n points = this.points;\n this._saveAndTransform(ctx);\n for (let i = 0; i < points.length; i++) {\n this.dot(ctx, points[i]);\n }\n ctx.restore();\n }\n\n /**\n * Invoked on mouse move\n * @param {Point} pointer\n */\n onMouseMove(pointer: Point) {\n if (this.limitedToCanvasSize === true && this._isOutSideCanvas(pointer)) {\n return;\n }\n if (this.needsFullRender()) {\n this.canvas.clearContext(this.canvas.contextTop);\n this.addPoint(pointer);\n this._render();\n } else {\n this.drawDot(pointer);\n }\n }\n\n /**\n * Invoked on mouse up\n */\n onMouseUp() {\n const originalRenderOnAddRemove = this.canvas.renderOnAddRemove;\n this.canvas.renderOnAddRemove = false;\n\n const circles: Circle[] = [];\n\n for (let i = 0; i < this.points.length; i++) {\n const point = this.points[i],\n circle = new Circle({\n radius: point.radius,\n left: point.x,\n top: point.y,\n originX: CENTER,\n originY: CENTER,\n fill: point.fill,\n });\n\n this.shadow && (circle.shadow = new Shadow(this.shadow));\n\n circles.push(circle);\n }\n const group = new Group(circles, { canvas: this.canvas });\n\n this.canvas.fire('before:path:created', { path: group });\n this.canvas.add(group);\n this.canvas.fire('path:created', { path: group });\n\n this.canvas.clearContext(this.canvas.contextTop);\n this._resetShadow();\n this.canvas.renderOnAddRemove = originalRenderOnAddRemove;\n this.canvas.requestRenderAll();\n }\n\n /**\n * @param {Object} pointer\n * @return {Point} Just added pointer point\n */\n addPoint({ x, y }: Point) {\n const pointerPoint: CircleBrushPoint = {\n x,\n y,\n radius: getRandomInt(Math.max(0, this.width - 20), this.width + 20) / 2,\n fill: new Color(this.color).setAlpha(getRandomInt(0, 100) / 100).toRgba(),\n };\n\n this.points.push(pointerPoint);\n\n return pointerPoint;\n }\n}\n","import type { Point } from '../Point';\nimport { Group } from '../shapes/Group';\nimport { Shadow } from '../Shadow';\nimport { Rect } from '../shapes/Rect';\nimport { getRandomInt } from '../util/internals/getRandomInt';\nimport type { Canvas } from '../canvas/Canvas';\nimport { BaseBrush } from './BaseBrush';\nimport type { SprayBrushPoint } from './typedefs';\nimport { CENTER } from '../constants';\n\n/**\n *\n * @param rects\n * @returns\n */\nfunction getUniqueRects(rects: Rect[]) {\n const uniqueRects: Record = {};\n const uniqueRectsArray: Rect[] = [];\n\n for (let i = 0, key: string; i < rects.length; i++) {\n key = `${rects[i].left}${rects[i].top}`;\n if (!uniqueRects[key]) {\n uniqueRects[key] = true;\n uniqueRectsArray.push(rects[i]);\n }\n }\n\n return uniqueRectsArray;\n}\n\nexport class SprayBrush extends BaseBrush {\n /**\n * Width of a spray\n * @type Number\n */\n width = 10;\n\n /**\n * Density of a spray (number of dots per chunk)\n * @type Number\n */\n density = 20;\n\n /**\n * Width of spray dots\n * @type Number\n */\n dotWidth = 1;\n\n /**\n * Width variance of spray dots\n * @type Number\n */\n dotWidthVariance = 1;\n\n /**\n * Whether opacity of a dot should be random\n * @type Boolean\n */\n randomOpacity = false;\n\n /**\n * Whether overlapping dots (rectangles) should be removed (for performance reasons)\n * @type Boolean\n */\n optimizeOverlapping = true;\n\n declare private sprayChunks: SprayBrushPoint[][];\n\n declare private sprayChunk: SprayBrushPoint[];\n\n /**\n * Constructor\n * @param {Canvas} canvas\n * @return {SprayBrush} Instance of a spray brush\n */\n constructor(canvas: Canvas) {\n super(canvas);\n this.sprayChunks = [];\n this.sprayChunk = [];\n }\n\n /**\n * Invoked on mouse down\n * @param {Point} pointer\n */\n onMouseDown(pointer: Point) {\n this.sprayChunks = [];\n this.canvas.clearContext(this.canvas.contextTop);\n this._setShadow();\n\n this.addSprayChunk(pointer);\n this.renderChunck(this.sprayChunk);\n }\n\n /**\n * Invoked on mouse move\n * @param {Point} pointer\n */\n onMouseMove(pointer: Point) {\n if (this.limitedToCanvasSize === true && this._isOutSideCanvas(pointer)) {\n return;\n }\n this.addSprayChunk(pointer);\n this.renderChunck(this.sprayChunk);\n }\n\n /**\n * Invoked on mouse up\n */\n onMouseUp() {\n const originalRenderOnAddRemove = this.canvas.renderOnAddRemove;\n this.canvas.renderOnAddRemove = false;\n\n const rects: Rect[] = [];\n\n for (let i = 0; i < this.sprayChunks.length; i++) {\n const sprayChunk = this.sprayChunks[i];\n for (let j = 0; j < sprayChunk.length; j++) {\n const chunck = sprayChunk[j];\n const rect = new Rect({\n width: chunck.width,\n height: chunck.width,\n left: chunck.x + 1,\n top: chunck.y + 1,\n originX: CENTER,\n originY: CENTER,\n fill: this.color,\n });\n rects.push(rect);\n }\n }\n\n const group = new Group(\n this.optimizeOverlapping ? getUniqueRects(rects) : rects,\n {\n objectCaching: true,\n subTargetCheck: false,\n interactive: false,\n },\n );\n this.shadow && group.set('shadow', new Shadow(this.shadow));\n this.canvas.fire('before:path:created', { path: group });\n this.canvas.add(group);\n this.canvas.fire('path:created', { path: group });\n\n this.canvas.clearContext(this.canvas.contextTop);\n this._resetShadow();\n this.canvas.renderOnAddRemove = originalRenderOnAddRemove;\n this.canvas.requestRenderAll();\n }\n\n renderChunck(sprayChunck: SprayBrushPoint[]) {\n const ctx = this.canvas.contextTop;\n ctx.fillStyle = this.color;\n\n this._saveAndTransform(ctx);\n\n for (let i = 0; i < sprayChunck.length; i++) {\n const point = sprayChunck[i];\n ctx.globalAlpha = point.opacity;\n ctx.fillRect(point.x, point.y, point.width, point.width);\n }\n\n ctx.restore();\n }\n\n /**\n * Render all spray chunks\n */\n _render() {\n const ctx = this.canvas.contextTop;\n ctx.fillStyle = this.color;\n\n this._saveAndTransform(ctx);\n\n for (let i = 0; i < this.sprayChunks.length; i++) {\n this.renderChunck(this.sprayChunks[i]);\n }\n ctx.restore();\n }\n\n /**\n * @param {Point} pointer\n */\n addSprayChunk(pointer: Point) {\n this.sprayChunk = [];\n const radius = this.width / 2;\n\n for (let i = 0; i < this.density; i++) {\n this.sprayChunk.push({\n x: getRandomInt(pointer.x - radius, pointer.x + radius),\n y: getRandomInt(pointer.y - radius, pointer.y + radius),\n width: this.dotWidthVariance\n ? getRandomInt(\n // bottom clamp width to 1\n Math.max(1, this.dotWidth - this.dotWidthVariance),\n this.dotWidth + this.dotWidthVariance,\n )\n : this.dotWidth,\n opacity: this.randomOpacity ? getRandomInt(0, 100) / 100 : 1,\n });\n }\n\n this.sprayChunks.push(this.sprayChunk);\n }\n}\n","import { Pattern } from '../Pattern';\nimport { createCanvasElement } from '../util/misc/dom';\nimport type { Canvas } from '../canvas/Canvas';\nimport { PencilBrush } from './PencilBrush';\nimport type { TSimplePathData } from '../util/path/typedefs';\n\nexport class PatternBrush extends PencilBrush {\n declare source?: CanvasImageSource;\n\n constructor(canvas: Canvas) {\n super(canvas);\n }\n\n getPatternSrc() {\n const dotWidth = 20,\n dotDistance = 5,\n patternCanvas = createCanvasElement(),\n patternCtx = patternCanvas.getContext('2d');\n\n patternCanvas.width = patternCanvas.height = dotWidth + dotDistance;\n if (patternCtx) {\n patternCtx.fillStyle = this.color;\n patternCtx.beginPath();\n patternCtx.arc(\n dotWidth / 2,\n dotWidth / 2,\n dotWidth / 2,\n 0,\n Math.PI * 2,\n false,\n );\n patternCtx.closePath();\n patternCtx.fill();\n }\n return patternCanvas;\n }\n\n /**\n * Creates \"pattern\" instance property\n * @param {CanvasRenderingContext2D} ctx\n */\n getPattern(ctx: CanvasRenderingContext2D) {\n return ctx.createPattern(this.source || this.getPatternSrc(), 'repeat');\n }\n\n /**\n * Sets brush styles\n * @param {CanvasRenderingContext2D} ctx\n */\n _setBrushStyles(ctx: CanvasRenderingContext2D) {\n super._setBrushStyles(ctx);\n const pattern = this.getPattern(ctx);\n pattern && (ctx.strokeStyle = pattern);\n }\n\n /**\n * Creates path\n */\n createPath(pathData: TSimplePathData) {\n const path = super.createPath(pathData),\n topLeft = path._getLeftTopCoords().scalarAdd(path.strokeWidth / 2);\n\n path.stroke = new Pattern({\n source: this.source || this.getPatternSrc(),\n offsetX: -topLeft.x,\n offsetY: -topLeft.y,\n });\n return path;\n }\n}\n","import { SHARED_ATTRIBUTES } from '../parser/attributes';\nimport { parseAttributes } from '../parser/parseAttributes';\nimport type { Abortable, TClassProperties, TOptions } from '../typedefs';\nimport { classRegistry } from '../ClassRegistry';\nimport { FabricObject, cacheProperties } from './Object/FabricObject';\nimport { Point } from '../Point';\nimport { isFiller } from '../util/typeAssertions';\nimport type { FabricObjectProps, SerializedObjectProps } from './Object/types';\nimport type { ObjectEvents } from '../EventTypeDefs';\nimport { makeBoundingBoxFromPoints } from '../util';\nimport { CENTER, LEFT, TOP } from '../constants';\nimport type { CSSRules } from '../parser/typedefs';\n\n// @TODO this code is terrible and Line should be a special case of polyline.\n\nconst coordProps = ['x1', 'x2', 'y1', 'y2'] as const;\n\ninterface UniqueLineProps {\n x1: number;\n x2: number;\n y1: number;\n y2: number;\n}\n\nexport interface SerializedLineProps\n extends SerializedObjectProps,\n UniqueLineProps {}\n\n/**\n * A Class to draw a line\n * A bunch of methods will be added to Polyline to handle the line case\n * The line class is very strange to work with, is all special, it hardly aligns\n * to what a developer want everytime there is an angle\n * @deprecated\n */\nexport class Line<\n Props extends TOptions = Partial,\n SProps extends SerializedLineProps = SerializedLineProps,\n EventSpec extends ObjectEvents = ObjectEvents,\n >\n extends FabricObject\n implements UniqueLineProps\n{\n /**\n * x value or first line edge\n * @type number\n */\n declare x1: number;\n\n /**\n * y value or first line edge\n * @type number\n */\n declare y1: number;\n\n /**\n * x value or second line edge\n * @type number\n */\n declare x2: number;\n\n /**\n * y value or second line edge\n * @type number\n */\n declare y2: number;\n\n static type = 'Line';\n\n static cacheProperties = [...cacheProperties, ...coordProps];\n /**\n * Constructor\n * @param {Array} [points] Array of points\n * @param {Object} [options] Options object\n * @return {Line} thisArg\n */\n constructor([x1, y1, x2, y2] = [0, 0, 0, 0], options: Partial = {}) {\n super();\n Object.assign(this, Line.ownDefaults);\n this.setOptions(options);\n this.x1 = x1;\n this.x2 = x2;\n this.y1 = y1;\n this.y2 = y2;\n this._setWidthHeight();\n const { left, top } = options;\n typeof left === 'number' && this.set(LEFT, left);\n typeof top === 'number' && this.set(TOP, top);\n }\n\n /**\n * @private\n * @param {Object} [options] Options\n */\n _setWidthHeight() {\n const { x1, y1, x2, y2 } = this;\n this.width = Math.abs(x2 - x1);\n this.height = Math.abs(y2 - y1);\n const { left, top, width, height } = makeBoundingBoxFromPoints([\n { x: x1, y: y1 },\n { x: x2, y: y2 },\n ]);\n const position = new Point(left + width / 2, top + height / 2);\n this.setPositionByOrigin(position, CENTER, CENTER);\n }\n\n /**\n * @private\n * @param {String} key\n * @param {*} value\n */\n _set(key: string, value: any) {\n super._set(key, value);\n if (coordProps.includes(key as keyof UniqueLineProps)) {\n // this doesn't make sense very much, since setting x1 when top or left\n // are already set, is just going to show a strange result since the\n // line will move way more than the developer expect.\n // in fabric5 it worked only when the line didn't have extra transformations,\n // in fabric6 too. With extra transform they behave bad in different ways.\n // This needs probably a good rework or a tutorial if you have to create a dynamic line\n this._setWidthHeight();\n }\n return this;\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _render(ctx: CanvasRenderingContext2D) {\n ctx.beginPath();\n\n const p = this.calcLinePoints();\n ctx.moveTo(p.x1, p.y1);\n ctx.lineTo(p.x2, p.y2);\n\n ctx.lineWidth = this.strokeWidth;\n\n // TODO: test this\n // make sure setting \"fill\" changes color of a line\n // (by copying fillStyle to strokeStyle, since line is stroked, not filled)\n const origStrokeStyle = ctx.strokeStyle;\n if (isFiller(this.stroke)) {\n ctx.strokeStyle = this.stroke.toLive(ctx)!;\n } else {\n ctx.strokeStyle = this.stroke ?? ctx.fillStyle;\n }\n this.stroke && this._renderStroke(ctx);\n ctx.strokeStyle = origStrokeStyle;\n }\n\n /**\n * This function is an helper for svg import. it returns the center of the object in the svg\n * untransformed coordinates\n * @private\n * @return {Point} center point from element coordinates\n */\n _findCenterFromElement(): Point {\n return new Point((this.x1 + this.x2) / 2, (this.y1 + this.y2) / 2);\n }\n\n /**\n * Returns object representation of an instance\n * @method toObject\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} object representation of an instance\n */\n toObject<\n T extends Omit, keyof SProps>,\n K extends keyof T = never,\n >(propertiesToInclude: K[] = []): Pick & SProps {\n return {\n ...super.toObject(propertiesToInclude),\n ...this.calcLinePoints(),\n };\n }\n\n /*\n * Calculate object dimensions from its properties\n * @private\n */\n _getNonTransformedDimensions(): Point {\n const dim = super._getNonTransformedDimensions();\n if (this.strokeLineCap === 'butt') {\n if (this.width === 0) {\n dim.y -= this.strokeWidth;\n }\n if (this.height === 0) {\n dim.x -= this.strokeWidth;\n }\n }\n return dim;\n }\n\n /**\n * Recalculates line points given width and height\n * Those points are simply placed around the center,\n * This is not useful outside internal render functions and svg output\n * Is not meant to be for the developer.\n * @private\n */\n calcLinePoints(): UniqueLineProps {\n const { x1: _x1, x2: _x2, y1: _y1, y2: _y2, width, height } = this;\n const xMult = _x1 <= _x2 ? -1 : 1,\n yMult = _y1 <= _y2 ? -1 : 1,\n x1 = (xMult * width) / 2,\n y1 = (yMult * height) / 2,\n x2 = (xMult * -width) / 2,\n y2 = (yMult * -height) / 2;\n\n return {\n x1,\n x2,\n y1,\n y2,\n };\n }\n\n /* _FROM_SVG_START_ */\n\n /**\n * Returns svg representation of an instance\n * @return {Array} an array of strings with the specific svg representation\n * of the instance\n */\n _toSVG() {\n const { x1, x2, y1, y2 } = this.calcLinePoints();\n return [\n '\\n`,\n ];\n }\n\n /**\n * List of attribute names to account for when parsing SVG element (used by {@link Line.fromElement})\n * @see http://www.w3.org/TR/SVG/shapes.html#LineElement\n */\n static ATTRIBUTE_NAMES = SHARED_ATTRIBUTES.concat(coordProps);\n\n /**\n * Returns Line instance from an SVG element\n * @param {HTMLElement} element Element to parse\n * @param {Object} [options] Options object\n * @param {Function} [callback] callback function invoked after parsing\n */\n static async fromElement(\n element: HTMLElement,\n options?: Abortable,\n cssRules?: CSSRules,\n ) {\n const {\n x1 = 0,\n y1 = 0,\n x2 = 0,\n y2 = 0,\n ...parsedAttributes\n } = parseAttributes(element, this.ATTRIBUTE_NAMES, cssRules);\n return new this([x1, y1, x2, y2], parsedAttributes);\n }\n\n /* _FROM_SVG_END_ */\n\n /**\n * Returns Line instance from an object representation\n * @param {Object} object Object to create an instance from\n * @returns {Promise}\n */\n static fromObject>({\n x1,\n y1,\n x2,\n y2,\n ...object\n }: T) {\n return this._fromObject(\n {\n ...object,\n points: [x1, y1, x2, y2],\n },\n {\n extraParam: 'points',\n },\n );\n }\n}\n\nclassRegistry.setClass(Line);\nclassRegistry.setSVGClass(Line);\n","import { classRegistry } from '../ClassRegistry';\nimport { FabricObject } from './Object/FabricObject';\nimport type { FabricObjectProps, SerializedObjectProps } from './Object/types';\nimport type { TClassProperties, TOptions } from '../typedefs';\nimport type { ObjectEvents } from '../EventTypeDefs';\n\nexport const triangleDefaultValues: Partial> = {\n width: 100,\n height: 100,\n};\n\nexport class Triangle<\n Props extends TOptions = Partial,\n SProps extends SerializedObjectProps = SerializedObjectProps,\n EventSpec extends ObjectEvents = ObjectEvents,\n >\n extends FabricObject\n implements FabricObjectProps\n{\n static type = 'Triangle';\n\n static ownDefaults = triangleDefaultValues;\n\n static getDefaults(): Record {\n return { ...super.getDefaults(), ...Triangle.ownDefaults };\n }\n\n /**\n * Constructor\n * @param {Object} [options] Options object\n */\n constructor(options?: Props) {\n super();\n Object.assign(this, Triangle.ownDefaults);\n this.setOptions(options);\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _render(ctx: CanvasRenderingContext2D) {\n const widthBy2 = this.width / 2,\n heightBy2 = this.height / 2;\n\n ctx.beginPath();\n ctx.moveTo(-widthBy2, heightBy2);\n ctx.lineTo(0, -heightBy2);\n ctx.lineTo(widthBy2, heightBy2);\n ctx.closePath();\n\n this._renderPaintInOrder(ctx);\n }\n\n /**\n * Returns svg representation of an instance\n * @return {Array} an array of strings with the specific svg representation\n * of the instance\n */\n _toSVG() {\n const widthBy2 = this.width / 2,\n heightBy2 = this.height / 2,\n points = `${-widthBy2} ${heightBy2},0 ${-heightBy2},${widthBy2} ${heightBy2}`;\n return [''];\n }\n}\n\nclassRegistry.setClass(Triangle);\nclassRegistry.setSVGClass(Triangle);\n","import { SCALE_X, SCALE_Y, twoMathPi } from '../constants';\nimport { SHARED_ATTRIBUTES } from '../parser/attributes';\nimport { parseAttributes } from '../parser/parseAttributes';\nimport type { Abortable, TClassProperties, TOptions } from '../typedefs';\nimport { classRegistry } from '../ClassRegistry';\nimport { FabricObject, cacheProperties } from './Object/FabricObject';\nimport type { FabricObjectProps, SerializedObjectProps } from './Object/types';\nimport type { ObjectEvents } from '../EventTypeDefs';\nimport type { CSSRules } from '../parser/typedefs';\n\nexport const ellipseDefaultValues: Partial> = {\n rx: 0,\n ry: 0,\n};\n\ninterface UniqueEllipseProps {\n rx: number;\n ry: number;\n}\n\nexport interface SerializedEllipseProps\n extends SerializedObjectProps,\n UniqueEllipseProps {}\n\nexport interface EllipseProps extends FabricObjectProps, UniqueEllipseProps {}\n\nconst ELLIPSE_PROPS = ['rx', 'ry'] as const;\n\nexport class Ellipse<\n Props extends TOptions = Partial,\n SProps extends SerializedEllipseProps = SerializedEllipseProps,\n EventSpec extends ObjectEvents = ObjectEvents,\n >\n extends FabricObject\n implements EllipseProps\n{\n /**\n * Horizontal radius\n * @type Number\n */\n declare rx: number;\n\n /**\n * Vertical radius\n * @type Number\n */\n declare ry: number;\n\n static type = 'Ellipse';\n\n static cacheProperties = [...cacheProperties, ...ELLIPSE_PROPS];\n\n static ownDefaults = ellipseDefaultValues;\n\n static getDefaults(): Record {\n return {\n ...super.getDefaults(),\n ...Ellipse.ownDefaults,\n };\n }\n\n /**\n * Constructor\n * @param {Object} [options] Options object\n */\n constructor(options?: Props) {\n super();\n Object.assign(this, Ellipse.ownDefaults);\n this.setOptions(options);\n }\n\n /**\n * @private\n * @param {String} key\n * @param {*} value\n * @return {Ellipse} thisArg\n */\n _set(key: string, value: any) {\n super._set(key, value);\n switch (key) {\n case 'rx':\n this.rx = value;\n this.set('width', value * 2);\n break;\n\n case 'ry':\n this.ry = value;\n this.set('height', value * 2);\n break;\n }\n return this;\n }\n\n /**\n * Returns horizontal radius of an object (according to how an object is scaled)\n * @return {Number}\n */\n getRx() {\n return this.get('rx') * this.get(SCALE_X);\n }\n\n /**\n * Returns Vertical radius of an object (according to how an object is scaled)\n * @return {Number}\n */\n getRy() {\n return this.get('ry') * this.get(SCALE_Y);\n }\n\n /**\n * Returns object representation of an instance\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} object representation of an instance\n */\n toObject<\n T extends Omit, keyof SProps>,\n K extends keyof T = never,\n >(propertiesToInclude: K[] = []): Pick & SProps {\n return super.toObject([...ELLIPSE_PROPS, ...propertiesToInclude]);\n }\n\n /**\n * Returns svg representation of an instance\n * @return {Array} an array of strings with the specific svg representation\n * of the instance\n */\n _toSVG(): string[] {\n return [\n '\\n`,\n ];\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx context to render on\n */\n _render(ctx: CanvasRenderingContext2D) {\n ctx.beginPath();\n ctx.save();\n ctx.transform(1, 0, 0, this.ry / this.rx, 0, 0);\n ctx.arc(0, 0, this.rx, 0, twoMathPi, false);\n ctx.restore();\n this._renderPaintInOrder(ctx);\n }\n\n /* _FROM_SVG_START_ */\n\n /**\n * List of attribute names to account for when parsing SVG element (used by {@link Ellipse.fromElement})\n * @see http://www.w3.org/TR/SVG/shapes.html#EllipseElement\n */\n static ATTRIBUTE_NAMES = [...SHARED_ATTRIBUTES, 'cx', 'cy', 'rx', 'ry'];\n\n /**\n * Returns {@link Ellipse} instance from an SVG element\n * @param {HTMLElement} element Element to parse\n * @return {Ellipse}\n */\n static async fromElement(\n element: HTMLElement,\n options?: Abortable,\n cssRules?: CSSRules,\n ) {\n const parsedAttributes = parseAttributes(\n element,\n this.ATTRIBUTE_NAMES,\n cssRules,\n );\n\n parsedAttributes.left = (parsedAttributes.left || 0) - parsedAttributes.rx;\n parsedAttributes.top = (parsedAttributes.top || 0) - parsedAttributes.ry;\n return new this(parsedAttributes);\n }\n\n /* _FROM_SVG_END_ */\n}\n\nclassRegistry.setClass(Ellipse);\nclassRegistry.setSVGClass(Ellipse);\n","import type { XY } from '../Point';\n\n/**\n * Parses \"points\" attribute, returning an array of values\n * @static\n * @param {String} points points attribute string\n * @return {Array} array of points\n */\nexport function parsePointsAttribute(points: string | null): XY[] {\n // points attribute is required and must not be empty\n if (!points) {\n return [];\n }\n\n // replace commas with whitespace and remove bookending whitespace\n const pointsSplit: string[] = points.replace(/,/g, ' ').trim().split(/\\s+/);\n\n const parsedPoints = [];\n\n for (let i = 0; i < pointsSplit.length; i += 2) {\n parsedPoints.push({\n x: parseFloat(pointsSplit[i]),\n y: parseFloat(pointsSplit[i + 1]),\n });\n }\n\n // odd number of points is an error\n // if (parsedPoints.length % 2 !== 0) {\n // return null;\n // }\n return parsedPoints;\n}\n","import { config } from '../config';\nimport { SHARED_ATTRIBUTES } from '../parser/attributes';\nimport { parseAttributes } from '../parser/parseAttributes';\nimport { parsePointsAttribute } from '../parser/parsePointsAttribute';\nimport type { XY } from '../Point';\nimport { Point } from '../Point';\nimport type { Abortable, TClassProperties, TOptions } from '../typedefs';\nimport { classRegistry } from '../ClassRegistry';\nimport { makeBoundingBoxFromPoints } from '../util/misc/boundingBoxFromPoints';\nimport { calcDimensionsMatrix, transformPoint } from '../util/misc/matrix';\nimport { projectStrokeOnPoints } from '../util/misc/projectStroke';\nimport type { TProjectStrokeOnPointsOptions } from '../util/misc/projectStroke/types';\nimport { degreesToRadians } from '../util/misc/radiansDegreesConversion';\nimport { toFixed } from '../util/misc/toFixed';\nimport { FabricObject, cacheProperties } from './Object/FabricObject';\nimport type { FabricObjectProps, SerializedObjectProps } from './Object/types';\nimport type { ObjectEvents } from '../EventTypeDefs';\nimport {\n CENTER,\n LEFT,\n SCALE_X,\n SCALE_Y,\n SKEW_X,\n SKEW_Y,\n TOP,\n} from '../constants';\nimport type { CSSRules } from '../parser/typedefs';\n\nexport const polylineDefaultValues: Partial> = {\n /**\n * @deprecated transient option soon to be removed in favor of a different design\n */\n exactBoundingBox: false,\n};\n\nexport interface SerializedPolylineProps extends SerializedObjectProps {\n points: XY[];\n}\n\nexport class Polyline<\n Props extends TOptions = Partial,\n SProps extends SerializedPolylineProps = SerializedPolylineProps,\n EventSpec extends ObjectEvents = ObjectEvents,\n> extends FabricObject {\n /**\n * Points array\n * @type Array\n */\n declare points: XY[];\n\n /**\n * WARNING: Feature in progress\n * Calculate the exact bounding box taking in account strokeWidth on acute angles\n * this will be turned to true by default on fabric 6.0\n * maybe will be left in as an optimization since calculations may be slow\n * @deprecated transient option soon to be removed in favor of a different design\n * @type Boolean\n * @default false\n */\n declare exactBoundingBox: boolean;\n\n declare private initialized: true | undefined;\n\n static ownDefaults = polylineDefaultValues;\n\n static type = 'Polyline';\n\n static getDefaults(): Record {\n return {\n ...super.getDefaults(),\n ...Polyline.ownDefaults,\n };\n }\n\n /**\n * A list of properties that if changed trigger a recalculation of dimensions\n * @todo check if you really need to recalculate for all cases\n */\n static layoutProperties: (keyof Polyline)[] = [\n SKEW_X,\n SKEW_Y,\n 'strokeLineCap',\n 'strokeLineJoin',\n 'strokeMiterLimit',\n 'strokeWidth',\n 'strokeUniform',\n 'points',\n ];\n\n declare pathOffset: Point;\n\n declare strokeOffset: Point;\n\n static cacheProperties = [...cacheProperties, 'points'];\n\n strokeDiff: Point;\n\n /**\n * Constructor\n * @param {Array} points Array of points (where each point is an object with x and y)\n * @param {Object} [options] Options object\n * @return {Polyline} thisArg\n * @example\n * var poly = new Polyline([\n * { x: 10, y: 10 },\n * { x: 50, y: 30 },\n * { x: 40, y: 70 },\n * { x: 60, y: 50 },\n * { x: 100, y: 150 },\n * { x: 40, y: 100 }\n * ], {\n * stroke: 'red',\n * left: 100,\n * top: 100\n * });\n */\n constructor(points: XY[] = [], options: Props = {} as Props) {\n super();\n Object.assign(this, Polyline.ownDefaults);\n this.setOptions(options);\n this.points = points;\n const { left, top } = options;\n this.initialized = true;\n this.setBoundingBox(true);\n typeof left === 'number' && this.set(LEFT, left);\n typeof top === 'number' && this.set(TOP, top);\n }\n\n protected isOpen() {\n return true;\n }\n\n private _projectStrokeOnPoints(options: TProjectStrokeOnPointsOptions) {\n return projectStrokeOnPoints(this.points, options, this.isOpen());\n }\n\n /**\n * Calculate the polygon bounding box\n * @private\n */\n _calcDimensions(options?: Partial) {\n options = {\n scaleX: this.scaleX,\n scaleY: this.scaleY,\n skewX: this.skewX,\n skewY: this.skewY,\n strokeLineCap: this.strokeLineCap,\n strokeLineJoin: this.strokeLineJoin,\n strokeMiterLimit: this.strokeMiterLimit,\n strokeUniform: this.strokeUniform,\n strokeWidth: this.strokeWidth,\n ...(options || {}),\n };\n const points = this.exactBoundingBox\n ? this._projectStrokeOnPoints(\n options as TProjectStrokeOnPointsOptions,\n ).map((projection) => projection.projectedPoint)\n : this.points;\n if (points.length === 0) {\n return {\n left: 0,\n top: 0,\n width: 0,\n height: 0,\n pathOffset: new Point(),\n strokeOffset: new Point(),\n strokeDiff: new Point(),\n };\n }\n const bbox = makeBoundingBoxFromPoints(points),\n // Remove scale effect, since it's applied after\n matrix = calcDimensionsMatrix({ ...options, scaleX: 1, scaleY: 1 }),\n bboxNoStroke = makeBoundingBoxFromPoints(\n this.points.map((p) => transformPoint(p, matrix, true)),\n ),\n scale = new Point(this.scaleX, this.scaleY);\n let offsetX = bbox.left + bbox.width / 2,\n offsetY = bbox.top + bbox.height / 2;\n if (this.exactBoundingBox) {\n offsetX = offsetX - offsetY * Math.tan(degreesToRadians(this.skewX));\n // Order of those assignments is important.\n // offsetY relies on offsetX being already changed by the line above\n offsetY = offsetY - offsetX * Math.tan(degreesToRadians(this.skewY));\n }\n\n return {\n ...bbox,\n pathOffset: new Point(offsetX, offsetY),\n strokeOffset: new Point(bboxNoStroke.left, bboxNoStroke.top)\n .subtract(new Point(bbox.left, bbox.top))\n .multiply(scale),\n strokeDiff: new Point(bbox.width, bbox.height)\n .subtract(new Point(bboxNoStroke.width, bboxNoStroke.height))\n .multiply(scale),\n };\n }\n\n /**\n * This function is an helper for svg import. it returns the center of the object in the svg\n * untransformed coordinates, by look at the polyline/polygon points.\n * @private\n * @return {Point} center point from element coordinates\n */\n _findCenterFromElement(): Point {\n const bbox = makeBoundingBoxFromPoints(this.points);\n return new Point(bbox.left + bbox.width / 2, bbox.top + bbox.height / 2);\n }\n\n setDimensions() {\n this.setBoundingBox();\n }\n\n setBoundingBox(adjustPosition?: boolean) {\n const { left, top, width, height, pathOffset, strokeOffset, strokeDiff } =\n this._calcDimensions();\n this.set({ width, height, pathOffset, strokeOffset, strokeDiff });\n adjustPosition &&\n this.setPositionByOrigin(\n new Point(left + width / 2, top + height / 2),\n CENTER,\n CENTER,\n );\n }\n\n /**\n * @deprecated intermidiate method to be removed, do not use\n */\n protected isStrokeAccountedForInDimensions() {\n return this.exactBoundingBox;\n }\n\n /**\n * @override stroke is taken in account in size\n */\n _getNonTransformedDimensions() {\n return this.exactBoundingBox\n ? // TODO: fix this\n new Point(this.width, this.height)\n : super._getNonTransformedDimensions();\n }\n\n /**\n * @override stroke and skewing are taken into account when projecting stroke on points,\n * therefore we don't want the default calculation to account for skewing as well.\n * Though it is possible to pass `width` and `height` in `options`, doing so is very strange, use with discretion.\n *\n * @private\n */\n _getTransformedDimensions(options: any = {}) {\n if (this.exactBoundingBox) {\n let size: Point;\n /* When `strokeUniform = true`, any changes to the properties require recalculating the `width` and `height` because\n the stroke projections are affected.\n When `strokeUniform = false`, we don't need to recalculate for scale transformations, as the effect of scale on\n projections follows a linear function (e.g. scaleX of 2 just multiply width by 2)*/\n if (\n Object.keys(options).some(\n (key) =>\n this.strokeUniform ||\n (this.constructor as typeof Polyline).layoutProperties.includes(\n key as keyof TProjectStrokeOnPointsOptions,\n ),\n )\n ) {\n const { width, height } = this._calcDimensions(options);\n size = new Point(options.width ?? width, options.height ?? height);\n } else {\n size = new Point(\n options.width ?? this.width,\n options.height ?? this.height,\n );\n }\n return size.multiply(\n new Point(options.scaleX || this.scaleX, options.scaleY || this.scaleY),\n );\n } else {\n return super._getTransformedDimensions(options);\n }\n }\n\n /**\n * Recalculates dimensions when changing skew and scale\n * @private\n */\n _set(key: string, value: any) {\n const changed = this.initialized && this[key as keyof this] !== value;\n const output = super._set(key, value);\n if (\n this.exactBoundingBox &&\n changed &&\n (((key === SCALE_X || key === SCALE_Y) &&\n this.strokeUniform &&\n (this.constructor as typeof Polyline).layoutProperties.includes(\n 'strokeUniform',\n )) ||\n (this.constructor as typeof Polyline).layoutProperties.includes(\n key as keyof Polyline,\n ))\n ) {\n this.setDimensions();\n }\n return output;\n }\n\n /**\n * Returns object representation of an instance\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} Object representation of an instance\n */\n toObject<\n T extends Omit, keyof SProps>,\n K extends keyof T = never,\n >(propertiesToInclude: K[] = []): Pick & SProps {\n return {\n ...super.toObject(propertiesToInclude),\n points: this.points.map(({ x, y }) => ({ x, y })),\n };\n }\n\n /**\n * Returns svg representation of an instance\n * @return {Array} an array of strings with the specific svg representation\n * of the instance\n */\n _toSVG() {\n const points = [],\n diffX = this.pathOffset.x,\n diffY = this.pathOffset.y,\n NUM_FRACTION_DIGITS = config.NUM_FRACTION_DIGITS;\n\n for (let i = 0, len = this.points.length; i < len; i++) {\n points.push(\n toFixed(this.points[i].x - diffX, NUM_FRACTION_DIGITS),\n ',',\n toFixed(this.points[i].y - diffY, NUM_FRACTION_DIGITS),\n ' ',\n );\n }\n return [\n `<${\n (this.constructor as typeof Polyline).type.toLowerCase() as\n | 'polyline'\n | 'polygon'\n } `,\n 'COMMON_PARTS',\n `points=\"${points.join('')}\" />\\n`,\n ];\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _render(ctx: CanvasRenderingContext2D) {\n const len = this.points.length,\n x = this.pathOffset.x,\n y = this.pathOffset.y;\n\n if (!len || isNaN(this.points[len - 1].y)) {\n // do not draw if no points or odd points\n // NaN comes from parseFloat of a empty string in parser\n return;\n }\n ctx.beginPath();\n ctx.moveTo(this.points[0].x - x, this.points[0].y - y);\n for (let i = 0; i < len; i++) {\n const point = this.points[i];\n ctx.lineTo(point.x - x, point.y - y);\n }\n !this.isOpen() && ctx.closePath();\n this._renderPaintInOrder(ctx);\n }\n\n /**\n * Returns complexity of an instance\n * @return {Number} complexity of this instance\n */\n complexity(): number {\n return this.points.length;\n }\n\n /* _FROM_SVG_START_ */\n\n /**\n * List of attribute names to account for when parsing SVG element (used by {@link Polyline.fromElement})\n * @see: http://www.w3.org/TR/SVG/shapes.html#PolylineElement\n */\n static ATTRIBUTE_NAMES = [...SHARED_ATTRIBUTES];\n\n /**\n * Returns Polyline instance from an SVG element\n * @param {HTMLElement} element Element to parser\n * @param {Object} [options] Options object\n */\n static async fromElement(\n element: HTMLElement | SVGElement,\n options?: Abortable,\n cssRules?: CSSRules,\n ) {\n const points = parsePointsAttribute(element.getAttribute('points')),\n // we omit left and top to instruct the constructor to position the object using the bbox\n\n { left, top, ...parsedAttributes } = parseAttributes(\n element,\n this.ATTRIBUTE_NAMES,\n cssRules,\n );\n return new this(points, {\n ...parsedAttributes,\n ...options,\n });\n }\n\n /* _FROM_SVG_END_ */\n\n /**\n * Returns Polyline instance from an object representation\n * @param {Object} object Object to create an instance from\n * @returns {Promise}\n */\n static fromObject>(object: T) {\n return this._fromObject(object, {\n extraParam: 'points',\n });\n }\n}\n\nclassRegistry.setClass(Polyline);\nclassRegistry.setSVGClass(Polyline);\n","import { classRegistry } from '../ClassRegistry';\nimport { Polyline, polylineDefaultValues } from './Polyline';\n\nexport class Polygon extends Polyline {\n static ownDefaults = polylineDefaultValues;\n\n static type = 'Polygon';\n\n protected isOpen() {\n return false;\n }\n}\n\nclassRegistry.setClass(Polygon);\nclassRegistry.setSVGClass(Polygon);\n","import type { ObjectEvents } from '../../EventTypeDefs';\nimport type { FabricObjectProps, SerializedObjectProps } from '../Object/types';\nimport type { TOptions } from '../../typedefs';\nimport { FabricObject } from '../Object/FabricObject';\nimport { styleProperties } from './constants';\nimport type { StylePropertiesType } from './constants';\nimport type { FabricText } from './Text';\nimport { pick } from '../../util';\nimport { pickBy } from '../../util/misc/pick';\n\nexport type CompleteTextStyleDeclaration = Pick<\n FabricText,\n StylePropertiesType\n>;\n\nexport type TextStyleDeclaration = Partial;\n\nexport type TextStyle = {\n [line: number | string]: { [char: number | string]: TextStyleDeclaration };\n};\n\nexport abstract class StyledText<\n Props extends TOptions = Partial,\n SProps extends SerializedObjectProps = SerializedObjectProps,\n EventSpec extends ObjectEvents = ObjectEvents,\n> extends FabricObject {\n declare abstract styles: TextStyle;\n declare protected abstract _textLines: string[][];\n declare protected _forceClearCache: boolean;\n static _styleProperties: Readonly = styleProperties;\n abstract get2DCursorLocation(\n selectionStart: number,\n skipWrapping?: boolean,\n ): { charIndex: number; lineIndex: number };\n\n /**\n * Returns true if object has no styling or no styling in a line\n * @param {Number} lineIndex , lineIndex is on wrapped lines.\n * @return {Boolean}\n */\n isEmptyStyles(lineIndex?: number): boolean {\n if (!this.styles) {\n return true;\n }\n if (typeof lineIndex !== 'undefined' && !this.styles[lineIndex]) {\n return true;\n }\n const obj =\n typeof lineIndex === 'undefined'\n ? this.styles\n : { line: this.styles[lineIndex] };\n for (const p1 in obj) {\n for (const p2 in obj[p1]) {\n // eslint-disable-next-line no-unused-vars\n for (const p3 in obj[p1][p2]) {\n return false;\n }\n }\n }\n return true;\n }\n\n /**\n * Returns true if object has a style property or has it ina specified line\n * This function is used to detect if a text will use a particular property or not.\n * @param {String} property to check for\n * @param {Number} lineIndex to check the style on\n * @return {Boolean}\n */\n styleHas(property: keyof TextStyleDeclaration, lineIndex?: number): boolean {\n if (!this.styles) {\n return false;\n }\n if (typeof lineIndex !== 'undefined' && !this.styles[lineIndex]) {\n return false;\n }\n const obj =\n typeof lineIndex === 'undefined'\n ? this.styles\n : { 0: this.styles[lineIndex] };\n // eslint-disable-next-line\n for (const p1 in obj) {\n // eslint-disable-next-line\n for (const p2 in obj[p1]) {\n if (typeof obj[p1][p2][property] !== 'undefined') {\n return true;\n }\n }\n }\n return false;\n }\n\n /**\n * Check if characters in a text have a value for a property\n * whose value matches the textbox's value for that property. If so,\n * the character-level property is deleted. If the character\n * has no other properties, then it is also deleted. Finally,\n * if the line containing that character has no other characters\n * then it also is deleted.\n */\n cleanStyle(property: keyof TextStyleDeclaration) {\n if (!this.styles) {\n return false;\n }\n const obj = this.styles;\n let stylesCount = 0,\n letterCount,\n stylePropertyValue,\n allStyleObjectPropertiesMatch = true,\n graphemeCount = 0;\n for (const p1 in obj) {\n letterCount = 0;\n for (const p2 in obj[p1]) {\n const styleObject = obj[p1][p2] || {},\n stylePropertyHasBeenSet = styleObject[property] !== undefined;\n\n stylesCount++;\n\n if (stylePropertyHasBeenSet) {\n if (!stylePropertyValue) {\n stylePropertyValue = styleObject[property];\n } else if (styleObject[property] !== stylePropertyValue) {\n allStyleObjectPropertiesMatch = false;\n }\n\n if (styleObject[property] === this[property as keyof this]) {\n delete styleObject[property];\n }\n } else {\n allStyleObjectPropertiesMatch = false;\n }\n\n if (Object.keys(styleObject).length !== 0) {\n letterCount++;\n } else {\n delete obj[p1][p2];\n }\n }\n\n if (letterCount === 0) {\n delete obj[p1];\n }\n }\n // if every grapheme has the same style set then\n // delete those styles and set it on the parent\n for (let i = 0; i < this._textLines.length; i++) {\n graphemeCount += this._textLines[i].length;\n }\n if (allStyleObjectPropertiesMatch && stylesCount === graphemeCount) {\n this[property as keyof this] = stylePropertyValue as any;\n this.removeStyle(property);\n }\n }\n\n /**\n * Remove a style property or properties from all individual character styles\n * in a text object. Deletes the character style object if it contains no other style\n * props. Deletes a line style object if it contains no other character styles.\n *\n * @param {String} props The property to remove from character styles.\n */\n removeStyle(property: keyof TextStyleDeclaration) {\n if (!this.styles) {\n return;\n }\n const obj = this.styles;\n let line, lineNum, charNum;\n for (lineNum in obj) {\n line = obj[lineNum];\n for (charNum in line) {\n delete line[charNum][property];\n if (Object.keys(line[charNum]).length === 0) {\n delete line[charNum];\n }\n }\n if (Object.keys(line).length === 0) {\n delete obj[lineNum];\n }\n }\n }\n\n private _extendStyles(index: number, style: TextStyleDeclaration): void {\n const { lineIndex, charIndex } = this.get2DCursorLocation(index);\n\n if (!this._getLineStyle(lineIndex)) {\n this._setLineStyle(lineIndex);\n }\n\n const newStyle = pickBy(\n {\n // first create a new object that is a merge of existing and new\n ...this._getStyleDeclaration(lineIndex, charIndex),\n ...style,\n // use the predicate to discard undefined values\n },\n (value) => value !== undefined,\n );\n\n // finally assign to the old position the new style\n this._setStyleDeclaration(lineIndex, charIndex, newStyle);\n }\n\n /**\n * Gets style of a current selection/cursor (at the start position)\n * @param {Number} startIndex Start index to get styles at\n * @param {Number} endIndex End index to get styles at, if not specified startIndex + 1\n * @param {Boolean} [complete] get full style or not\n * @return {Array} styles an array with one, zero or more Style objects\n */\n getSelectionStyles(\n startIndex: number,\n endIndex?: number,\n complete?: boolean,\n ): TextStyleDeclaration[] {\n const styles: TextStyleDeclaration[] = [];\n for (let i = startIndex; i < (endIndex || startIndex); i++) {\n styles.push(this.getStyleAtPosition(i, complete));\n }\n return styles;\n }\n\n /**\n * Gets style of a current selection/cursor position\n * @param {Number} position to get styles at\n * @param {Boolean} [complete] full style if true\n * @return {Object} style Style object at a specified index\n * @private\n */\n getStyleAtPosition(position: number, complete?: boolean) {\n const { lineIndex, charIndex } = this.get2DCursorLocation(position);\n return complete\n ? this.getCompleteStyleDeclaration(lineIndex, charIndex)\n : this._getStyleDeclaration(lineIndex, charIndex);\n }\n\n /**\n * Sets style of a current selection, if no selection exist, do not set anything.\n * @param {Object} styles Styles object\n * @param {Number} startIndex Start index to get styles at\n * @param {Number} [endIndex] End index to get styles at, if not specified startIndex + 1\n */\n setSelectionStyles(styles: object, startIndex: number, endIndex?: number) {\n for (let i = startIndex; i < (endIndex || startIndex); i++) {\n this._extendStyles(i, styles);\n }\n /* not included in _extendStyles to avoid clearing cache more than once */\n this._forceClearCache = true;\n }\n\n /**\n * Get a reference, not a clone, to the style object for a given character,\n * if no style is set for a line or char, return a new empty object.\n * This is tricky and confusing because when you get an empty object you can't\n * determine if it is a reference or a new one.\n * @TODO this should always return a reference or always a clone or undefined when necessary.\n * @protected\n * @param {Number} lineIndex\n * @param {Number} charIndex\n * @return {TextStyleDeclaration} a style object reference to the existing one or a new empty object when undefined\n */\n _getStyleDeclaration(\n lineIndex: number,\n charIndex: number,\n ): TextStyleDeclaration {\n const lineStyle = this.styles && this.styles[lineIndex];\n return lineStyle ? (lineStyle[charIndex] ?? {}) : {};\n }\n\n /**\n * return a new object that contains all the style property for a character\n * the object returned is newly created\n * @param {Number} lineIndex of the line where the character is\n * @param {Number} charIndex position of the character on the line\n * @return {Object} style object\n */\n getCompleteStyleDeclaration(\n lineIndex: number,\n charIndex: number,\n ): CompleteTextStyleDeclaration {\n return {\n ...pick(\n this,\n (this.constructor as typeof StyledText)\n ._styleProperties as (keyof this)[],\n ),\n ...this._getStyleDeclaration(lineIndex, charIndex),\n } as CompleteTextStyleDeclaration;\n }\n\n /**\n * @param {Number} lineIndex\n * @param {Number} charIndex\n * @param {Object} style\n * @private\n */\n protected _setStyleDeclaration(\n lineIndex: number,\n charIndex: number,\n style: object,\n ) {\n this.styles[lineIndex][charIndex] = style;\n }\n\n /**\n *\n * @param {Number} lineIndex\n * @param {Number} charIndex\n * @private\n */\n protected _deleteStyleDeclaration(lineIndex: number, charIndex: number) {\n delete this.styles[lineIndex][charIndex];\n }\n\n /**\n * @param {Number} lineIndex\n * @return {Boolean} if the line exists or not\n * @private\n */\n protected _getLineStyle(lineIndex: number): boolean {\n return !!this.styles[lineIndex];\n }\n\n /**\n * Set the line style to an empty object so that is initialized\n * @param {Number} lineIndex\n * @private\n */\n protected _setLineStyle(lineIndex: number) {\n this.styles[lineIndex] = {};\n }\n\n protected _deleteLineStyle(lineIndex: number) {\n delete this.styles[lineIndex];\n }\n}\n","import { config } from '../../config';\nimport type { TSVGReviver } from '../../typedefs';\nimport { escapeXml } from '../../util/lang_string';\nimport { colorPropToSVG, createSVGRect } from '../../util/misc/svgParsing';\nimport { hasStyleChanged } from '../../util/misc/textStyles';\nimport { toFixed } from '../../util/misc/toFixed';\nimport { FabricObjectSVGExportMixin } from '../Object/FabricObjectSVGExportMixin';\nimport { type TextStyleDeclaration } from './StyledText';\nimport { JUSTIFY } from '../Text/constants';\nimport type { FabricText, GraphemeBBox } from './Text';\nimport { STROKE, FILL } from '../../constants';\nimport { createRotateMatrix } from '../../util/misc/matrix';\nimport { radiansToDegrees } from '../../util/misc/radiansDegreesConversion';\nimport { Point } from '../../Point';\nimport { matrixToSVG } from '../../util/misc/svgExport';\n\nconst multipleSpacesRegex = / +/g;\nconst dblQuoteRegex = /\"/g;\n\nfunction createSVGInlineRect(\n color: string,\n left: number,\n top: number,\n width: number,\n height: number,\n) {\n return `\\t\\t${createSVGRect(color, { left, top, width, height })}\\n`;\n}\n\nexport class TextSVGExportMixin extends FabricObjectSVGExportMixin {\n _toSVG(this: TextSVGExportMixin & FabricText): string[] {\n const offsets = this._getSVGLeftTopOffsets(),\n textAndBg = this._getSVGTextAndBg(offsets.textTop, offsets.textLeft);\n return this._wrapSVGTextAndBg(textAndBg);\n }\n\n toSVG(this: TextSVGExportMixin & FabricText, reviver?: TSVGReviver): string {\n const textSvg = this._createBaseSVGMarkup(this._toSVG(), {\n reviver,\n noStyle: true,\n withShadow: true,\n }),\n path = this.path;\n if (path) {\n return (\n textSvg +\n path._createBaseSVGMarkup(path._toSVG(), {\n reviver,\n withShadow: true,\n additionalTransform: matrixToSVG(this.calcOwnMatrix()),\n })\n );\n }\n return textSvg;\n }\n\n private _getSVGLeftTopOffsets(this: TextSVGExportMixin & FabricText) {\n return {\n textLeft: -this.width / 2,\n textTop: -this.height / 2,\n lineTop: this.getHeightOfLine(0),\n };\n }\n\n private _wrapSVGTextAndBg(\n this: TextSVGExportMixin & FabricText,\n {\n textBgRects,\n textSpans,\n }: {\n textSpans: string[];\n textBgRects: string[];\n },\n ) {\n const noShadow = true,\n textDecoration = this.getSvgTextDecoration(this);\n return [\n textBgRects.join(''),\n '\\t\\t',\n textSpans.join(''),\n '\\n',\n ];\n }\n\n /**\n * @private\n * @param {Number} textTopOffset Text top offset\n * @param {Number} textLeftOffset Text left offset\n * @return {Object}\n */\n private _getSVGTextAndBg(\n this: TextSVGExportMixin & FabricText,\n textTopOffset: number,\n textLeftOffset: number,\n ) {\n const textSpans: string[] = [],\n textBgRects: string[] = [];\n let height = textTopOffset,\n lineOffset;\n\n // bounding-box background\n this.backgroundColor &&\n textBgRects.push(\n ...createSVGInlineRect(\n this.backgroundColor,\n -this.width / 2,\n -this.height / 2,\n this.width,\n this.height,\n ),\n );\n\n // text and text-background\n for (let i = 0, len = this._textLines.length; i < len; i++) {\n lineOffset = this._getLineLeftOffset(i);\n if (this.direction === 'rtl') {\n lineOffset += this.width;\n }\n if (this.textBackgroundColor || this.styleHas('textBackgroundColor', i)) {\n this._setSVGTextLineBg(\n textBgRects,\n i,\n textLeftOffset + lineOffset,\n height,\n );\n }\n this._setSVGTextLineText(\n textSpans,\n i,\n textLeftOffset + lineOffset,\n height,\n );\n height += this.getHeightOfLine(i);\n }\n\n return {\n textSpans,\n textBgRects,\n };\n }\n\n private _createTextCharSpan(\n this: TextSVGExportMixin & FabricText,\n char: string,\n styleDecl: TextStyleDeclaration,\n left: number,\n top: number,\n charBox: GraphemeBBox,\n ) {\n const numFractionDigit = config.NUM_FRACTION_DIGITS;\n const styleProps = this.getSvgSpanStyles(\n styleDecl,\n char !== char.trim() || !!char.match(multipleSpacesRegex),\n ),\n fillStyles = styleProps ? `style=\"${styleProps}\"` : '',\n dy = styleDecl.deltaY,\n dySpan = dy ? ` dy=\"${toFixed(dy, numFractionDigit)}\" ` : '',\n { angle, renderLeft, renderTop, width } = charBox;\n let angleAttr = '';\n if (renderLeft !== undefined) {\n const wBy2 = width / 2;\n angle &&\n (angleAttr = ` rotate=\"${toFixed(radiansToDegrees(angle), numFractionDigit)}\"`);\n const m = createRotateMatrix({ angle: radiansToDegrees(angle!) });\n m[4] = renderLeft!;\n m[5] = renderTop!;\n const renderPoint = new Point(-wBy2, 0).transform(m);\n left = renderPoint.x;\n top = renderPoint.y;\n }\n\n return `${escapeXml(char)}`;\n }\n\n private _setSVGTextLineText(\n this: TextSVGExportMixin & FabricText,\n textSpans: string[],\n lineIndex: number,\n textLeftOffset: number,\n textTopOffset: number,\n ) {\n const lineHeight = this.getHeightOfLine(lineIndex),\n isJustify = this.textAlign.includes(JUSTIFY),\n line = this._textLines[lineIndex];\n let actualStyle,\n nextStyle,\n charsToRender = '',\n charBox,\n style,\n boxWidth = 0,\n timeToRender;\n\n textTopOffset +=\n (lineHeight * (1 - this._fontSizeFraction)) / this.lineHeight;\n for (let i = 0, len = line.length - 1; i <= len; i++) {\n timeToRender = i === len || this.charSpacing || this.path;\n charsToRender += line[i];\n charBox = this.__charBounds[lineIndex][i];\n if (boxWidth === 0) {\n textLeftOffset += charBox.kernedWidth - charBox.width;\n boxWidth += charBox.width;\n } else {\n boxWidth += charBox.kernedWidth;\n }\n if (isJustify && !timeToRender) {\n if (this._reSpaceAndTab.test(line[i])) {\n timeToRender = true;\n }\n }\n if (!timeToRender) {\n // if we have charSpacing or a path, we render char by char\n actualStyle =\n actualStyle || this.getCompleteStyleDeclaration(lineIndex, i);\n nextStyle = this.getCompleteStyleDeclaration(lineIndex, i + 1);\n timeToRender = hasStyleChanged(actualStyle, nextStyle, true);\n }\n if (timeToRender) {\n style = this._getStyleDeclaration(lineIndex, i);\n textSpans.push(\n this._createTextCharSpan(\n charsToRender,\n style,\n textLeftOffset,\n textTopOffset,\n charBox,\n ),\n );\n charsToRender = '';\n actualStyle = nextStyle;\n if (this.direction === 'rtl') {\n textLeftOffset -= boxWidth;\n } else {\n textLeftOffset += boxWidth;\n }\n boxWidth = 0;\n }\n }\n }\n\n private _setSVGTextLineBg(\n this: TextSVGExportMixin & FabricText,\n textBgRects: (string | number)[],\n i: number,\n leftOffset: number,\n textTopOffset: number,\n ) {\n const line = this._textLines[i],\n heightOfLine = this.getHeightOfLine(i) / this.lineHeight;\n let boxWidth = 0,\n boxStart = 0,\n currentColor,\n lastColor = this.getValueOfPropertyAt(i, 0, 'textBackgroundColor');\n for (let j = 0; j < line.length; j++) {\n const { left, width, kernedWidth } = this.__charBounds[i][j];\n currentColor = this.getValueOfPropertyAt(i, j, 'textBackgroundColor');\n if (currentColor !== lastColor) {\n lastColor &&\n textBgRects.push(\n ...createSVGInlineRect(\n lastColor,\n leftOffset + boxStart,\n textTopOffset,\n boxWidth,\n heightOfLine,\n ),\n );\n boxStart = left;\n boxWidth = width;\n lastColor = currentColor;\n } else {\n boxWidth += kernedWidth;\n }\n }\n currentColor &&\n textBgRects.push(\n ...createSVGInlineRect(\n lastColor,\n leftOffset + boxStart,\n textTopOffset,\n boxWidth,\n heightOfLine,\n ),\n );\n }\n\n /**\n * Returns styles-string for svg-export\n * @param {Boolean} skipShadow a boolean to skip shadow filter output\n * @return {String}\n */\n getSvgStyles(this: TextSVGExportMixin & FabricText, skipShadow?: boolean) {\n return `${super.getSvgStyles(skipShadow)} text-decoration-thickness: ${toFixed((this.textDecorationThickness * this.getObjectScaling().y) / 10, config.NUM_FRACTION_DIGITS)}%; white-space: pre;`;\n }\n\n /**\n * Returns styles-string for svg-export\n * @param {Object} style the object from which to retrieve style properties\n * @param {Boolean} useWhiteSpace a boolean to include an additional attribute in the style.\n * @return {String}\n */\n getSvgSpanStyles(\n this: TextSVGExportMixin & FabricText,\n style: TextStyleDeclaration,\n useWhiteSpace?: boolean,\n ) {\n const {\n fontFamily,\n strokeWidth,\n stroke,\n fill,\n fontSize,\n fontStyle,\n fontWeight,\n deltaY,\n textDecorationThickness,\n linethrough,\n overline,\n underline,\n } = style;\n\n const textDecoration = this.getSvgTextDecoration({\n underline: underline ?? this.underline,\n overline: overline ?? this.overline,\n linethrough: linethrough ?? this.linethrough,\n });\n const thickness = textDecorationThickness || this.textDecorationThickness;\n return [\n stroke ? colorPropToSVG(STROKE, stroke) : '',\n strokeWidth ? `stroke-width: ${strokeWidth}; ` : '',\n fontFamily\n ? `font-family: ${\n !fontFamily.includes(\"'\") && !fontFamily.includes('\"')\n ? `'${fontFamily}'`\n : fontFamily\n }; `\n : '',\n fontSize ? `font-size: ${fontSize}px; ` : '',\n fontStyle ? `font-style: ${fontStyle}; ` : '',\n fontWeight ? `font-weight: ${fontWeight}; ` : '',\n textDecoration\n ? `text-decoration: ${textDecoration}; text-decoration-thickness: ${toFixed((thickness * this.getObjectScaling().y) / 10, config.NUM_FRACTION_DIGITS)}%; `\n : '',\n fill ? colorPropToSVG(FILL, fill) : '',\n deltaY ? `baseline-shift: ${-deltaY}; ` : '',\n useWhiteSpace ? 'white-space: pre; ' : '',\n ].join('');\n }\n\n /**\n * Returns text-decoration property for svg-export\n * @param {Object} style the object from which to retrieve style properties\n * @return {String}\n */\n getSvgTextDecoration(\n this: TextSVGExportMixin & FabricText,\n style: TextStyleDeclaration,\n ) {\n return (['overline', 'underline', 'line-through'] as const)\n .filter(\n (decoration) =>\n style[\n decoration.replace('-', '') as\n | 'overline'\n | 'underline'\n | 'linethrough'\n ],\n )\n .join(' ');\n }\n}\n","import { cache } from '../../cache';\nimport { DEFAULT_SVG_FONT_SIZE, FILL, STROKE } from '../../constants';\nimport type { ObjectEvents } from '../../EventTypeDefs';\nimport type {\n CompleteTextStyleDeclaration,\n TextStyle,\n TextStyleDeclaration,\n} from './StyledText';\nimport { StyledText } from './StyledText';\nimport { SHARED_ATTRIBUTES } from '../../parser/attributes';\nimport { parseAttributes } from '../../parser/parseAttributes';\nimport type {\n Abortable,\n TCacheCanvasDimensions,\n TClassProperties,\n TFiller,\n TOptions,\n} from '../../typedefs';\nimport { classRegistry } from '../../ClassRegistry';\nimport { graphemeSplit } from '../../util/lang_string';\nimport { createCanvasElementFor } from '../../util/misc/dom';\nimport type { TextStyleArray } from '../../util/misc/textStyles';\nimport {\n hasStyleChanged,\n stylesFromArray,\n stylesToArray,\n} from '../../util/misc/textStyles';\nimport { getPathSegmentsInfo, getPointOnPath } from '../../util/path';\nimport { cacheProperties } from '../Object/FabricObject';\nimport type { Path } from '../Path';\nimport { TextSVGExportMixin } from './TextSVGExportMixin';\nimport { applyMixins } from '../../util/applyMixins';\nimport type { FabricObjectProps, SerializedObjectProps } from '../Object/types';\nimport type { StylePropertiesType } from './constants';\nimport {\n additionalProps,\n textDefaultValues,\n textLayoutProperties,\n JUSTIFY,\n JUSTIFY_CENTER,\n JUSTIFY_LEFT,\n JUSTIFY_RIGHT,\n TEXT_DECORATION_THICKNESS,\n} from './constants';\nimport { CENTER, LEFT, RIGHT, TOP, BOTTOM } from '../../constants';\nimport { isFiller } from '../../util/typeAssertions';\nimport type { Gradient } from '../../gradient/Gradient';\nimport type { Pattern } from '../../Pattern';\nimport type { CSSRules } from '../../parser/typedefs';\n\nlet measuringContext: CanvasRenderingContext2D | null;\n\n/**\n * Return a context for measurement of text string.\n * if created it gets stored for reuse\n */\nfunction getMeasuringContext() {\n if (!measuringContext) {\n const canvas = createCanvasElementFor({\n width: 0,\n height: 0,\n });\n measuringContext = canvas.getContext('2d');\n }\n return measuringContext;\n}\n\nexport type TPathSide = 'left' | 'right';\n\nexport type TPathAlign = 'baseline' | 'center' | 'ascender' | 'descender';\n\nexport type TextLinesInfo = {\n lines: string[];\n graphemeLines: string[][];\n graphemeText: string[];\n _unwrappedLines: string[][];\n};\n\n/**\n * Measure and return the info of a single grapheme.\n * needs the the info of previous graphemes already filled\n * Override to customize measuring\n */\nexport type GraphemeBBox = {\n width: number;\n height: number;\n kernedWidth: number;\n left: number;\n deltaY: number;\n renderLeft?: number;\n renderTop?: number;\n angle?: number;\n};\n\n// @TODO this is not complete\ninterface UniqueTextProps {\n charSpacing: number;\n lineHeight: number;\n fontSize: number;\n fontWeight: string | number;\n fontFamily: string;\n fontStyle: string;\n pathSide: TPathSide;\n pathAlign: TPathAlign;\n underline: boolean;\n overline: boolean;\n linethrough: boolean;\n textAlign: string;\n direction: CanvasDirection;\n path?: Path;\n textDecorationThickness: number;\n}\n\nexport interface SerializedTextProps\n extends SerializedObjectProps,\n UniqueTextProps {\n styles: TextStyleArray | TextStyle;\n}\n\nexport interface TextProps extends FabricObjectProps, UniqueTextProps {\n styles: TextStyle;\n}\n\n/**\n * Text class\n * @tutorial {@link http://fabricjs.com/fabric-intro-part-2#text}\n */\nexport class FabricText<\n Props extends TOptions = Partial,\n SProps extends SerializedTextProps = SerializedTextProps,\n EventSpec extends ObjectEvents = ObjectEvents,\n >\n extends StyledText\n implements UniqueTextProps\n{\n /**\n * Properties that requires a text layout recalculation when changed\n * @type string[]\n * @protected\n */\n static textLayoutProperties: string[] = textLayoutProperties;\n\n /**\n * @private\n */\n declare _reNewline: RegExp;\n\n /**\n * Use this regular expression to filter for whitespaces that is not a new line.\n * Mostly used when text is 'justify' aligned.\n * @private\n */\n declare _reSpacesAndTabs: RegExp;\n\n /**\n * Use this regular expression to filter for whitespace that is not a new line.\n * Mostly used when text is 'justify' aligned.\n * @private\n */\n declare _reSpaceAndTab: RegExp;\n\n /**\n * Use this regular expression to filter consecutive groups of non spaces.\n * Mostly used when text is 'justify' aligned.\n * @private\n */\n declare _reWords: RegExp;\n\n declare text: string;\n\n /**\n * Font size (in pixels)\n * @type Number\n */\n declare fontSize: number;\n\n /**\n * Font weight (e.g. bold, normal, 400, 600, 800)\n * @type {(Number|String)}\n */\n declare fontWeight: string | number;\n\n /**\n * Font family\n * @type String\n */\n declare fontFamily: string;\n\n /**\n * Text decoration underline.\n * @type Boolean\n */\n declare underline: boolean;\n\n /**\n * Text decoration overline.\n * @type Boolean\n */\n declare overline: boolean;\n\n /**\n * Text decoration linethrough.\n * @type Boolean\n */\n declare linethrough: boolean;\n\n /**\n * Text alignment. Possible values: \"left\", \"center\", \"right\", \"justify\",\n * \"justify-left\", \"justify-center\" or \"justify-right\".\n * @type String\n */\n declare textAlign: string;\n\n /**\n * Font style . Possible values: \"\", \"normal\", \"italic\" or \"oblique\".\n * @type String\n */\n declare fontStyle: string;\n\n /**\n * Line height\n * @type Number\n */\n declare lineHeight: number;\n\n /**\n * Superscript schema object (minimum overlap)\n */\n declare superscript: {\n /**\n * fontSize factor\n * @default 0.6\n */\n size: number;\n /**\n * baseline-shift factor (upwards)\n * @default -0.35\n */\n baseline: number;\n };\n\n /**\n * Subscript schema object (minimum overlap)\n */\n declare subscript: {\n /**\n * fontSize factor\n * @default 0.6\n */\n size: number;\n /**\n * baseline-shift factor (downwards)\n * @default 0.11\n */\n baseline: number;\n };\n\n /**\n * Background color of text lines\n * @type String\n */\n declare textBackgroundColor: string;\n\n declare styles: TextStyle;\n\n /**\n * Path that the text should follow.\n * since 4.6.0 the path will be drawn automatically.\n * if you want to make the path visible, give it a stroke and strokeWidth or fill value\n * if you want it to be hidden, assign visible = false to the path.\n * This feature is in BETA, and SVG import/export is not yet supported.\n * @type Path\n * @example\n * const textPath = new Text('Text on a path', {\n * top: 150,\n * left: 150,\n * textAlign: 'center',\n * charSpacing: -50,\n * path: new Path('M 0 0 C 50 -100 150 -100 200 0', {\n * strokeWidth: 1,\n * visible: false\n * }),\n * pathSide: 'left',\n * pathStartOffset: 0\n * });\n */\n declare path?: Path;\n\n /**\n * The text decoration tickness for underline, overline and strikethrough\n * The tickness is expressed in thousandths of fontSize ( em ).\n * The original value was 1/15 that translates to 66.6667 thousandths.\n * The choice of unit of measure is to align with charSpacing.\n * You can slim the tickness without issues, while large underline or overline may end up\n * outside the bounding box of the text. In order to fix that a bigger refactor of the code\n * is needed and is out of scope for now. If you need such large overline on the first line\n * of text or large underline on the last line of text, consider disabling caching as a\n * workaround\n * @default 66.667\n */\n declare textDecorationThickness: number;\n\n /**\n * Offset amount for text path starting position\n * Only used when text has a path\n */\n declare pathStartOffset: number;\n\n /**\n * Which side of the path the text should be drawn on.\n * Only used when text has a path\n * @type {TPathSide} 'left|right'\n */\n declare pathSide: TPathSide;\n\n /**\n * How text is aligned to the path. This property determines\n * the perpendicular position of each character relative to the path.\n * (one of \"baseline\", \"center\", \"ascender\", \"descender\")\n * This feature is in BETA, and its behavior may change\n * @type TPathAlign\n */\n declare pathAlign: TPathAlign;\n\n /**\n * @private\n */\n declare _fontSizeFraction: number;\n\n /**\n * @private\n */\n declare offsets: { underline: number; linethrough: number; overline: number };\n\n /**\n * Text Line proportion to font Size (in pixels)\n * @type Number\n */\n declare _fontSizeMult: number;\n\n /**\n * additional space between characters\n * expressed in thousands of em unit\n * @type Number\n */\n declare charSpacing: number;\n\n /**\n * Baseline shift, styles only, keep at 0 for the main text object\n * @type {Number}\n */\n declare deltaY: number;\n\n /**\n * WARNING: EXPERIMENTAL. NOT SUPPORTED YET\n * determine the direction of the text.\n * This has to be set manually together with textAlign and originX for proper\n * experience.\n * some interesting link for the future\n * https://www.w3.org/International/questions/qa-bidi-unicode-controls\n * @since 4.5.0\n * @type {CanvasDirection} 'ltr|rtl'\n */\n declare direction: CanvasDirection;\n\n /**\n * contains characters bounding boxes\n * This variable is considered to be protected.\n * But for how mixins are implemented right now, we can't leave it private\n * @protected\n */\n __charBounds: GraphemeBBox[][] = [];\n\n /**\n * use this size when measuring text. To avoid IE11 rounding errors\n * @type {Number}\n * @readonly\n * @private\n */\n declare CACHE_FONT_SIZE: number;\n\n /**\n * contains the min text width to avoid getting 0\n * @type {Number}\n */\n declare MIN_TEXT_WIDTH: number;\n\n /**\n * contains the the text of the object, divided in lines as they are displayed\n * on screen. Wrapping will divide the text independently of line breaks\n * @type {string[]}\n */\n declare textLines: string[];\n\n /**\n * same as textlines, but each line is an array of graphemes as split by splitByGrapheme\n * @type {string[]}\n */\n declare _textLines: string[][];\n\n declare _unwrappedTextLines: string[][];\n declare _text: string[];\n declare cursorWidth: number;\n declare __lineHeights: number[];\n declare __lineWidths: number[];\n declare initialized?: true;\n\n static cacheProperties = [...cacheProperties, ...additionalProps];\n\n static ownDefaults = textDefaultValues;\n\n static type = 'Text';\n\n static getDefaults(): Record {\n return { ...super.getDefaults(), ...FabricText.ownDefaults };\n }\n\n constructor(text: string, options?: Props) {\n super();\n Object.assign(this, FabricText.ownDefaults);\n this.setOptions(options);\n if (!this.styles) {\n this.styles = {};\n }\n this.text = text;\n this.initialized = true;\n if (this.path) {\n this.setPathInfo();\n }\n this.initDimensions();\n this.setCoords();\n }\n\n /**\n * If text has a path, it will add the extra information needed\n * for path and text calculations\n */\n setPathInfo() {\n const path = this.path;\n if (path) {\n path.segmentsInfo = getPathSegmentsInfo(path.path);\n }\n }\n\n /**\n * @private\n * Divides text into lines of text and lines of graphemes.\n */\n _splitText(): TextLinesInfo {\n const newLines = this._splitTextIntoLines(this.text);\n this.textLines = newLines.lines;\n this._textLines = newLines.graphemeLines;\n this._unwrappedTextLines = newLines._unwrappedLines;\n this._text = newLines.graphemeText;\n return newLines;\n }\n\n /**\n * Initialize or update text dimensions.\n * Updates this.width and this.height with the proper values.\n * Does not return dimensions.\n */\n initDimensions() {\n this._splitText();\n this._clearCache();\n this.dirty = true;\n if (this.path) {\n this.width = this.path.width;\n this.height = this.path.height;\n } else {\n this.width =\n this.calcTextWidth() || this.cursorWidth || this.MIN_TEXT_WIDTH;\n this.height = this.calcTextHeight();\n }\n if (this.textAlign.includes(JUSTIFY)) {\n // once text is measured we need to make space fatter to make justified text.\n this.enlargeSpaces();\n }\n }\n\n /**\n * Enlarge space boxes and shift the others\n */\n enlargeSpaces() {\n let diffSpace,\n currentLineWidth,\n numberOfSpaces,\n accumulatedSpace,\n line,\n charBound,\n spaces;\n for (let i = 0, len = this._textLines.length; i < len; i++) {\n if (\n this.textAlign !== JUSTIFY &&\n (i === len - 1 || this.isEndOfWrapping(i))\n ) {\n continue;\n }\n accumulatedSpace = 0;\n line = this._textLines[i];\n currentLineWidth = this.getLineWidth(i);\n if (\n currentLineWidth < this.width &&\n (spaces = this.textLines[i].match(this._reSpacesAndTabs))\n ) {\n numberOfSpaces = spaces.length;\n diffSpace = (this.width - currentLineWidth) / numberOfSpaces;\n for (let j = 0; j <= line.length; j++) {\n charBound = this.__charBounds[i][j];\n if (this._reSpaceAndTab.test(line[j])) {\n charBound.width += diffSpace;\n charBound.kernedWidth += diffSpace;\n charBound.left += accumulatedSpace;\n accumulatedSpace += diffSpace;\n } else {\n charBound.left += accumulatedSpace;\n }\n }\n }\n }\n }\n\n /**\n * Detect if the text line is ended with an hard break\n * text and itext do not have wrapping, return false\n * @return {Boolean}\n */\n isEndOfWrapping(lineIndex: number): boolean {\n return lineIndex === this._textLines.length - 1;\n }\n\n /**\n * Detect if a line has a linebreak and so we need to account for it when moving\n * and counting style.\n * It return always 1 for text and Itext. Textbox has its own implementation\n * @return Number\n */\n missingNewlineOffset(lineIndex: number, skipWrapping?: boolean): 0 | 1;\n missingNewlineOffset(_lineIndex: number): 1 {\n return 1;\n }\n\n /**\n * Returns 2d representation (lineIndex and charIndex) of cursor\n * @param {Number} selectionStart\n * @param {Boolean} [skipWrapping] consider the location for unwrapped lines. useful to manage styles.\n */\n get2DCursorLocation(selectionStart: number, skipWrapping?: boolean) {\n const lines = skipWrapping ? this._unwrappedTextLines : this._textLines;\n let i: number;\n for (i = 0; i < lines.length; i++) {\n if (selectionStart <= lines[i].length) {\n return {\n lineIndex: i,\n charIndex: selectionStart,\n };\n }\n selectionStart -=\n lines[i].length + this.missingNewlineOffset(i, skipWrapping);\n }\n return {\n lineIndex: i - 1,\n charIndex:\n lines[i - 1].length < selectionStart\n ? lines[i - 1].length\n : selectionStart,\n };\n }\n\n /**\n * Returns string representation of an instance\n * @return {String} String representation of text object\n */\n toString(): string {\n return `#`;\n }\n\n /**\n * Return the dimension and the zoom level needed to create a cache canvas\n * big enough to host the object to be cached.\n * @private\n * @param {Object} dim.x width of object to be cached\n * @param {Object} dim.y height of object to be cached\n * @return {Object}.width width of canvas\n * @return {Object}.height height of canvas\n * @return {Object}.zoomX zoomX zoom value to unscale the canvas before drawing cache\n * @return {Object}.zoomY zoomY zoom value to unscale the canvas before drawing cache\n */\n _getCacheCanvasDimensions(): TCacheCanvasDimensions {\n const dims = super._getCacheCanvasDimensions();\n const fontSize = this.fontSize;\n dims.width += fontSize * dims.zoomX;\n dims.height += fontSize * dims.zoomY;\n return dims;\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _render(ctx: CanvasRenderingContext2D) {\n const path = this.path;\n path && !path.isNotVisible() && path._render(ctx);\n this._setTextStyles(ctx);\n this._renderTextLinesBackground(ctx);\n this._renderTextDecoration(ctx, 'underline');\n this._renderText(ctx);\n this._renderTextDecoration(ctx, 'overline');\n this._renderTextDecoration(ctx, 'linethrough');\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _renderText(ctx: CanvasRenderingContext2D) {\n if (this.paintFirst === STROKE) {\n this._renderTextStroke(ctx);\n this._renderTextFill(ctx);\n } else {\n this._renderTextFill(ctx);\n this._renderTextStroke(ctx);\n }\n }\n\n /**\n * Set the font parameter of the context with the object properties or with charStyle\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n * @param {Object} [charStyle] object with font style properties\n * @param {String} [charStyle.fontFamily] Font Family\n * @param {Number} [charStyle.fontSize] Font size in pixels. ( without px suffix )\n * @param {String} [charStyle.fontWeight] Font weight\n * @param {String} [charStyle.fontStyle] Font style (italic|normal)\n */\n _setTextStyles(\n ctx: CanvasRenderingContext2D,\n charStyle?: any,\n forMeasuring?: boolean,\n ) {\n ctx.textBaseline = 'alphabetic';\n if (this.path) {\n switch (this.pathAlign) {\n case CENTER:\n ctx.textBaseline = 'middle';\n break;\n case 'ascender':\n ctx.textBaseline = TOP;\n break;\n case 'descender':\n ctx.textBaseline = BOTTOM;\n break;\n }\n }\n ctx.font = this._getFontDeclaration(charStyle, forMeasuring);\n }\n\n /**\n * calculate and return the text Width measuring each line.\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n * @return {Number} Maximum width of Text object\n */\n calcTextWidth(): number {\n let maxWidth = this.getLineWidth(0);\n\n for (let i = 1, len = this._textLines.length; i < len; i++) {\n const currentLineWidth = this.getLineWidth(i);\n if (currentLineWidth > maxWidth) {\n maxWidth = currentLineWidth;\n }\n }\n return maxWidth;\n }\n\n /**\n * @private\n * @param {String} method Method name (\"fillText\" or \"strokeText\")\n * @param {CanvasRenderingContext2D} ctx Context to render on\n * @param {String} line Text to render\n * @param {Number} left Left position of text\n * @param {Number} top Top position of text\n * @param {Number} lineIndex Index of a line in a text\n */\n _renderTextLine(\n method: 'fillText' | 'strokeText',\n ctx: CanvasRenderingContext2D,\n line: string[],\n left: number,\n top: number,\n lineIndex: number,\n ) {\n this._renderChars(method, ctx, line, left, top, lineIndex);\n }\n\n /**\n * Renders the text background for lines, taking care of style\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _renderTextLinesBackground(ctx: CanvasRenderingContext2D) {\n if (!this.textBackgroundColor && !this.styleHas('textBackgroundColor')) {\n return;\n }\n const originalFill = ctx.fillStyle,\n leftOffset = this._getLeftOffset();\n let lineTopOffset = this._getTopOffset();\n\n for (let i = 0, len = this._textLines.length; i < len; i++) {\n const heightOfLine = this.getHeightOfLine(i);\n if (\n !this.textBackgroundColor &&\n !this.styleHas('textBackgroundColor', i)\n ) {\n lineTopOffset += heightOfLine;\n continue;\n }\n const jlen = this._textLines[i].length;\n const lineLeftOffset = this._getLineLeftOffset(i);\n let boxWidth = 0;\n let boxStart = 0;\n let drawStart;\n let currentColor;\n let lastColor = this.getValueOfPropertyAt(i, 0, 'textBackgroundColor');\n for (let j = 0; j < jlen; j++) {\n // at this point charbox are either standard or full with pathInfo if there is a path.\n const charBox = this.__charBounds[i][j] as Required;\n currentColor = this.getValueOfPropertyAt(i, j, 'textBackgroundColor');\n if (this.path) {\n ctx.save();\n ctx.translate(charBox.renderLeft, charBox.renderTop);\n ctx.rotate(charBox.angle);\n ctx.fillStyle = currentColor;\n currentColor &&\n ctx.fillRect(\n -charBox.width / 2,\n (-heightOfLine / this.lineHeight) * (1 - this._fontSizeFraction),\n charBox.width,\n heightOfLine / this.lineHeight,\n );\n ctx.restore();\n } else if (currentColor !== lastColor) {\n drawStart = leftOffset + lineLeftOffset + boxStart;\n if (this.direction === 'rtl') {\n drawStart = this.width - drawStart - boxWidth;\n }\n ctx.fillStyle = lastColor;\n lastColor &&\n ctx.fillRect(\n drawStart,\n lineTopOffset,\n boxWidth,\n heightOfLine / this.lineHeight,\n );\n boxStart = charBox.left;\n boxWidth = charBox.width;\n lastColor = currentColor;\n } else {\n boxWidth += charBox.kernedWidth;\n }\n }\n if (currentColor && !this.path) {\n drawStart = leftOffset + lineLeftOffset + boxStart;\n if (this.direction === 'rtl') {\n drawStart = this.width - drawStart - boxWidth;\n }\n ctx.fillStyle = currentColor;\n ctx.fillRect(\n drawStart,\n lineTopOffset,\n boxWidth,\n heightOfLine / this.lineHeight,\n );\n }\n lineTopOffset += heightOfLine;\n }\n ctx.fillStyle = originalFill;\n // if there is text background color no\n // other shadows should be casted\n this._removeShadow(ctx);\n }\n\n /**\n * measure and return the width of a single character.\n * possibly overridden to accommodate different measure logic or\n * to hook some external lib for character measurement\n * @private\n * @param {String} _char, char to be measured\n * @param {Object} charStyle style of char to be measured\n * @param {String} [previousChar] previous char\n * @param {Object} [prevCharStyle] style of previous char\n */\n _measureChar(\n _char: string,\n charStyle: CompleteTextStyleDeclaration,\n previousChar: string | undefined,\n prevCharStyle: CompleteTextStyleDeclaration | Record,\n ) {\n const fontCache = cache.getFontCache(charStyle),\n fontDeclaration = this._getFontDeclaration(charStyle),\n couple = previousChar + _char,\n stylesAreEqual =\n previousChar &&\n fontDeclaration === this._getFontDeclaration(prevCharStyle),\n fontMultiplier = charStyle.fontSize / this.CACHE_FONT_SIZE;\n let width: number | undefined,\n coupleWidth: number | undefined,\n previousWidth: number | undefined,\n kernedWidth: number | undefined;\n\n if (previousChar && fontCache[previousChar] !== undefined) {\n previousWidth = fontCache[previousChar];\n }\n if (fontCache[_char] !== undefined) {\n kernedWidth = width = fontCache[_char];\n }\n if (stylesAreEqual && fontCache[couple] !== undefined) {\n coupleWidth = fontCache[couple];\n kernedWidth = coupleWidth - previousWidth!;\n }\n if (\n width === undefined ||\n previousWidth === undefined ||\n coupleWidth === undefined\n ) {\n const ctx = getMeasuringContext()!;\n // send a TRUE to specify measuring font size CACHE_FONT_SIZE\n this._setTextStyles(ctx, charStyle, true);\n if (width === undefined) {\n kernedWidth = width = ctx.measureText(_char).width;\n fontCache[_char] = width;\n }\n if (previousWidth === undefined && stylesAreEqual && previousChar) {\n previousWidth = ctx.measureText(previousChar).width;\n fontCache[previousChar] = previousWidth;\n }\n if (stylesAreEqual && coupleWidth === undefined) {\n // we can measure the kerning couple and subtract the width of the previous character\n coupleWidth = ctx.measureText(couple).width;\n fontCache[couple] = coupleWidth;\n // safe to use the non-null since if undefined we defined it before.\n kernedWidth = coupleWidth - previousWidth!;\n }\n }\n return {\n width: width * fontMultiplier,\n kernedWidth: kernedWidth! * fontMultiplier,\n };\n }\n\n /**\n * Computes height of character at given position\n * @param {Number} line the line index number\n * @param {Number} _char the character index number\n * @return {Number} fontSize of the character\n */\n getHeightOfChar(line: number, _char: number): number {\n return this.getValueOfPropertyAt(line, _char, 'fontSize');\n }\n\n /**\n * measure a text line measuring all characters.\n * @param {Number} lineIndex line number\n */\n measureLine(lineIndex: number) {\n const lineInfo = this._measureLine(lineIndex);\n if (this.charSpacing !== 0) {\n lineInfo.width -= this._getWidthOfCharSpacing();\n }\n if (lineInfo.width < 0) {\n lineInfo.width = 0;\n }\n return lineInfo;\n }\n\n /**\n * measure every grapheme of a line, populating __charBounds\n * @param {Number} lineIndex\n * @return {Object} object.width total width of characters\n * @return {Object} object.numOfSpaces length of chars that match this._reSpacesAndTabs\n */\n _measureLine(lineIndex: number) {\n let width = 0,\n prevGrapheme: string | undefined,\n graphemeInfo: GraphemeBBox | undefined;\n\n const reverse = this.pathSide === RIGHT,\n path = this.path,\n line = this._textLines[lineIndex],\n llength = line.length,\n lineBounds = new Array(llength);\n\n this.__charBounds[lineIndex] = lineBounds;\n for (let i = 0; i < llength; i++) {\n const grapheme = line[i];\n graphemeInfo = this._getGraphemeBox(grapheme, lineIndex, i, prevGrapheme);\n lineBounds[i] = graphemeInfo;\n width += graphemeInfo.kernedWidth;\n prevGrapheme = grapheme;\n }\n // this latest bound box represent the last character of the line\n // to simplify cursor handling in interactive mode.\n lineBounds[llength] = {\n left: graphemeInfo ? graphemeInfo.left + graphemeInfo.width : 0,\n width: 0,\n kernedWidth: 0,\n height: this.fontSize,\n deltaY: 0,\n } as GraphemeBBox;\n if (path && path.segmentsInfo) {\n let positionInPath = 0;\n const totalPathLength =\n path.segmentsInfo[path.segmentsInfo.length - 1].length;\n switch (this.textAlign) {\n case LEFT:\n positionInPath = reverse ? totalPathLength - width : 0;\n break;\n case CENTER:\n positionInPath = (totalPathLength - width) / 2;\n break;\n case RIGHT:\n positionInPath = reverse ? 0 : totalPathLength - width;\n break;\n //todo - add support for justify\n }\n positionInPath += this.pathStartOffset * (reverse ? -1 : 1);\n for (\n let i = reverse ? llength - 1 : 0;\n reverse ? i >= 0 : i < llength;\n reverse ? i-- : i++\n ) {\n graphemeInfo = lineBounds[i];\n if (positionInPath > totalPathLength) {\n positionInPath %= totalPathLength;\n } else if (positionInPath < 0) {\n positionInPath += totalPathLength;\n }\n // it would probably much faster to send all the grapheme position for a line\n // and calculate path position/angle at once.\n this._setGraphemeOnPath(positionInPath, graphemeInfo);\n positionInPath += graphemeInfo.kernedWidth;\n }\n }\n return { width: width, numOfSpaces: 0 };\n }\n\n /**\n * Calculate the angle and the left,top position of the char that follow a path.\n * It appends it to graphemeInfo to be reused later at rendering\n * @private\n * @param {Number} positionInPath to be measured\n * @param {GraphemeBBox} graphemeInfo current grapheme box information\n * @param {Object} startingPoint position of the point\n */\n _setGraphemeOnPath(positionInPath: number, graphemeInfo: GraphemeBBox) {\n const centerPosition = positionInPath + graphemeInfo.kernedWidth / 2,\n path = this.path!;\n\n // we are at currentPositionOnPath. we want to know what point on the path is.\n const info = getPointOnPath(path.path, centerPosition, path.segmentsInfo)!;\n graphemeInfo.renderLeft = info.x - path.pathOffset.x;\n graphemeInfo.renderTop = info.y - path.pathOffset.y;\n graphemeInfo.angle = info.angle + (this.pathSide === RIGHT ? Math.PI : 0);\n }\n\n /**\n *\n * @param {String} grapheme to be measured\n * @param {Number} lineIndex index of the line where the char is\n * @param {Number} charIndex position in the line\n * @param {String} [prevGrapheme] character preceding the one to be measured\n * @returns {GraphemeBBox} grapheme bbox\n */\n _getGraphemeBox(\n grapheme: string,\n lineIndex: number,\n charIndex: number,\n prevGrapheme?: string,\n skipLeft?: boolean,\n ): GraphemeBBox {\n const style = this.getCompleteStyleDeclaration(lineIndex, charIndex),\n prevStyle = prevGrapheme\n ? this.getCompleteStyleDeclaration(lineIndex, charIndex - 1)\n : {},\n info = this._measureChar(grapheme, style, prevGrapheme, prevStyle);\n let kernedWidth = info.kernedWidth,\n width = info.width,\n charSpacing;\n\n if (this.charSpacing !== 0) {\n charSpacing = this._getWidthOfCharSpacing();\n width += charSpacing;\n kernedWidth += charSpacing;\n }\n\n const box: GraphemeBBox = {\n width,\n left: 0,\n height: style.fontSize,\n kernedWidth,\n deltaY: style.deltaY,\n };\n if (charIndex > 0 && !skipLeft) {\n const previousBox = this.__charBounds[lineIndex][charIndex - 1];\n box.left =\n previousBox.left + previousBox.width + info.kernedWidth - info.width;\n }\n return box;\n }\n\n /**\n * Calculate height of line at 'lineIndex'\n * @param {Number} lineIndex index of line to calculate\n * @return {Number}\n */\n getHeightOfLine(lineIndex: number): number {\n if (this.__lineHeights[lineIndex]) {\n return this.__lineHeights[lineIndex];\n }\n\n // char 0 is measured before the line cycle because it needs to char\n // emptylines\n let maxHeight = this.getHeightOfChar(lineIndex, 0);\n for (let i = 1, len = this._textLines[lineIndex].length; i < len; i++) {\n maxHeight = Math.max(this.getHeightOfChar(lineIndex, i), maxHeight);\n }\n\n return (this.__lineHeights[lineIndex] =\n maxHeight * this.lineHeight * this._fontSizeMult);\n }\n\n /**\n * Calculate text box height\n */\n calcTextHeight() {\n let lineHeight,\n height = 0;\n for (let i = 0, len = this._textLines.length; i < len; i++) {\n lineHeight = this.getHeightOfLine(i);\n height += i === len - 1 ? lineHeight / this.lineHeight : lineHeight;\n }\n return height;\n }\n\n /**\n * @private\n * @return {Number} Left offset\n */\n _getLeftOffset(): number {\n return this.direction === 'ltr' ? -this.width / 2 : this.width / 2;\n }\n\n /**\n * @private\n * @return {Number} Top offset\n */\n _getTopOffset(): number {\n return -this.height / 2;\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n * @param {String} method Method name (\"fillText\" or \"strokeText\")\n */\n _renderTextCommon(\n ctx: CanvasRenderingContext2D,\n method: 'fillText' | 'strokeText',\n ) {\n ctx.save();\n let lineHeights = 0;\n const left = this._getLeftOffset(),\n top = this._getTopOffset();\n for (let i = 0, len = this._textLines.length; i < len; i++) {\n const heightOfLine = this.getHeightOfLine(i),\n maxHeight = heightOfLine / this.lineHeight,\n leftOffset = this._getLineLeftOffset(i);\n this._renderTextLine(\n method,\n ctx,\n this._textLines[i],\n left + leftOffset,\n top + lineHeights + maxHeight,\n i,\n );\n lineHeights += heightOfLine;\n }\n ctx.restore();\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _renderTextFill(ctx: CanvasRenderingContext2D) {\n if (!this.fill && !this.styleHas(FILL)) {\n return;\n }\n\n this._renderTextCommon(ctx, 'fillText');\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _renderTextStroke(ctx: CanvasRenderingContext2D) {\n if ((!this.stroke || this.strokeWidth === 0) && this.isEmptyStyles()) {\n return;\n }\n\n if (this.shadow && !this.shadow.affectStroke) {\n this._removeShadow(ctx);\n }\n\n ctx.save();\n this._setLineDash(ctx, this.strokeDashArray);\n ctx.beginPath();\n this._renderTextCommon(ctx, 'strokeText');\n ctx.closePath();\n ctx.restore();\n }\n\n /**\n * @private\n * @param {String} method fillText or strokeText.\n * @param {CanvasRenderingContext2D} ctx Context to render on\n * @param {Array} line Content of the line, splitted in an array by grapheme\n * @param {Number} left\n * @param {Number} top\n * @param {Number} lineIndex\n */\n _renderChars(\n method: 'fillText' | 'strokeText',\n ctx: CanvasRenderingContext2D,\n line: Array,\n left: number,\n top: number,\n lineIndex: number,\n ) {\n const lineHeight = this.getHeightOfLine(lineIndex),\n isJustify = this.textAlign.includes(JUSTIFY),\n path = this.path,\n shortCut =\n !isJustify &&\n this.charSpacing === 0 &&\n this.isEmptyStyles(lineIndex) &&\n !path,\n isLtr = this.direction === 'ltr',\n sign = this.direction === 'ltr' ? 1 : -1,\n // this was changed in the PR #7674\n // currentDirection = ctx.canvas.getAttribute('dir');\n currentDirection = ctx.direction;\n\n let actualStyle,\n nextStyle,\n charsToRender = '',\n charBox,\n boxWidth = 0,\n timeToRender,\n drawingLeft;\n\n ctx.save();\n if (currentDirection !== this.direction) {\n ctx.canvas.setAttribute('dir', isLtr ? 'ltr' : 'rtl');\n ctx.direction = isLtr ? 'ltr' : 'rtl';\n ctx.textAlign = isLtr ? LEFT : RIGHT;\n }\n top -= (lineHeight * this._fontSizeFraction) / this.lineHeight;\n if (shortCut) {\n // render all the line in one pass without checking\n // drawingLeft = isLtr ? left : left - this.getLineWidth(lineIndex);\n this._renderChar(method, ctx, lineIndex, 0, line.join(''), left, top);\n ctx.restore();\n return;\n }\n for (let i = 0, len = line.length - 1; i <= len; i++) {\n timeToRender = i === len || this.charSpacing || path;\n charsToRender += line[i];\n charBox = this.__charBounds[lineIndex][i] as Required;\n if (boxWidth === 0) {\n left += sign * (charBox.kernedWidth - charBox.width);\n boxWidth += charBox.width;\n } else {\n boxWidth += charBox.kernedWidth;\n }\n if (isJustify && !timeToRender) {\n if (this._reSpaceAndTab.test(line[i])) {\n timeToRender = true;\n }\n }\n if (!timeToRender) {\n // if we have charSpacing, we render char by char\n actualStyle =\n actualStyle || this.getCompleteStyleDeclaration(lineIndex, i);\n nextStyle = this.getCompleteStyleDeclaration(lineIndex, i + 1);\n timeToRender = hasStyleChanged(actualStyle, nextStyle, false);\n }\n if (timeToRender) {\n if (path) {\n ctx.save();\n ctx.translate(charBox.renderLeft, charBox.renderTop);\n ctx.rotate(charBox.angle);\n this._renderChar(\n method,\n ctx,\n lineIndex,\n i,\n charsToRender,\n -boxWidth / 2,\n 0,\n );\n ctx.restore();\n } else {\n drawingLeft = left;\n this._renderChar(\n method,\n ctx,\n lineIndex,\n i,\n charsToRender,\n drawingLeft,\n top,\n );\n }\n charsToRender = '';\n actualStyle = nextStyle;\n left += sign * boxWidth;\n boxWidth = 0;\n }\n }\n ctx.restore();\n }\n\n /**\n * This function try to patch the missing gradientTransform on canvas gradients.\n * transforming a context to transform the gradient, is going to transform the stroke too.\n * we want to transform the gradient but not the stroke operation, so we create\n * a transformed gradient on a pattern and then we use the pattern instead of the gradient.\n * this method has drawbacks: is slow, is in low resolution, needs a patch for when the size\n * is limited.\n * @private\n * @param {TFiller} filler a fabric gradient instance\n * @return {CanvasPattern} a pattern to use as fill/stroke style\n */\n _applyPatternGradientTransformText(filler: TFiller) {\n // TODO: verify compatibility with strokeUniform\n const width = this.width + this.strokeWidth,\n height = this.height + this.strokeWidth,\n pCanvas = createCanvasElementFor({\n width,\n height,\n }),\n pCtx = pCanvas.getContext('2d')!;\n pCanvas.width = width;\n pCanvas.height = height;\n pCtx.beginPath();\n pCtx.moveTo(0, 0);\n pCtx.lineTo(width, 0);\n pCtx.lineTo(width, height);\n pCtx.lineTo(0, height);\n pCtx.closePath();\n pCtx.translate(width / 2, height / 2);\n pCtx.fillStyle = filler.toLive(pCtx)!;\n this._applyPatternGradientTransform(pCtx, filler);\n pCtx.fill();\n return pCtx.createPattern(pCanvas, 'no-repeat')!;\n }\n\n handleFiller(\n ctx: CanvasRenderingContext2D,\n property: `${T}Style`,\n filler: TFiller | string,\n ): { offsetX: number; offsetY: number } {\n let offsetX: number, offsetY: number;\n if (isFiller(filler)) {\n if (\n (filler as Gradient<'linear'>).gradientUnits === 'percentage' ||\n (filler as Gradient<'linear'>).gradientTransform ||\n (filler as Pattern).patternTransform\n ) {\n // need to transform gradient in a pattern.\n // this is a slow process. If you are hitting this codepath, and the object\n // is not using caching, you should consider switching it on.\n // we need a canvas as big as the current object caching canvas.\n offsetX = -this.width / 2;\n offsetY = -this.height / 2;\n ctx.translate(offsetX, offsetY);\n ctx[property] = this._applyPatternGradientTransformText(filler);\n return { offsetX, offsetY };\n } else {\n // is a simple gradient or pattern\n ctx[property] = filler.toLive(ctx)!;\n return this._applyPatternGradientTransform(ctx, filler);\n }\n } else {\n // is a color\n ctx[property] = filler;\n }\n return { offsetX: 0, offsetY: 0 };\n }\n\n /**\n * This function prepare the canvas for a stroke style, and stroke and strokeWidth\n * need to be sent in as defined\n * @param {CanvasRenderingContext2D} ctx\n * @param {CompleteTextStyleDeclaration} style with stroke and strokeWidth defined\n * @returns\n */\n _setStrokeStyles(\n ctx: CanvasRenderingContext2D,\n {\n stroke,\n strokeWidth,\n }: Pick,\n ) {\n ctx.lineWidth = strokeWidth;\n ctx.lineCap = this.strokeLineCap;\n ctx.lineDashOffset = this.strokeDashOffset;\n ctx.lineJoin = this.strokeLineJoin;\n ctx.miterLimit = this.strokeMiterLimit;\n return this.handleFiller(ctx, 'strokeStyle', stroke!);\n }\n\n /**\n * This function prepare the canvas for a ill style, and fill\n * need to be sent in as defined\n * @param {CanvasRenderingContext2D} ctx\n * @param {CompleteTextStyleDeclaration} style with ill defined\n * @returns\n */\n _setFillStyles(ctx: CanvasRenderingContext2D, { fill }: Pick) {\n return this.handleFiller(ctx, 'fillStyle', fill!);\n }\n\n /**\n * @private\n * @param {String} method\n * @param {CanvasRenderingContext2D} ctx Context to render on\n * @param {Number} lineIndex\n * @param {Number} charIndex\n * @param {String} _char\n * @param {Number} left Left coordinate\n * @param {Number} top Top coordinate\n * @param {Number} lineHeight Height of the line\n */\n _renderChar(\n method: 'fillText' | 'strokeText',\n ctx: CanvasRenderingContext2D,\n lineIndex: number,\n charIndex: number,\n _char: string,\n left: number,\n top: number,\n ) {\n const decl = this._getStyleDeclaration(lineIndex, charIndex),\n fullDecl = this.getCompleteStyleDeclaration(lineIndex, charIndex),\n shouldFill = method === 'fillText' && fullDecl.fill,\n shouldStroke =\n method === 'strokeText' && fullDecl.stroke && fullDecl.strokeWidth;\n\n if (!shouldStroke && !shouldFill) {\n return;\n }\n ctx.save();\n\n ctx.font = this._getFontDeclaration(fullDecl);\n\n if (decl.textBackgroundColor) {\n this._removeShadow(ctx);\n }\n if (decl.deltaY) {\n top += decl.deltaY;\n }\n\n if (shouldFill) {\n const fillOffsets = this._setFillStyles(ctx, fullDecl);\n ctx.fillText(\n _char,\n left - fillOffsets.offsetX,\n top - fillOffsets.offsetY,\n );\n }\n\n if (shouldStroke) {\n const strokeOffsets = this._setStrokeStyles(ctx, fullDecl);\n ctx.strokeText(\n _char,\n left - strokeOffsets.offsetX,\n top - strokeOffsets.offsetY,\n );\n }\n\n ctx.restore();\n }\n\n /**\n * Turns the character into a 'superior figure' (i.e. 'superscript')\n * @param {Number} start selection start\n * @param {Number} end selection end\n */\n setSuperscript(start: number, end: number) {\n this._setScript(start, end, this.superscript);\n }\n\n /**\n * Turns the character into an 'inferior figure' (i.e. 'subscript')\n * @param {Number} start selection start\n * @param {Number} end selection end\n */\n setSubscript(start: number, end: number) {\n this._setScript(start, end, this.subscript);\n }\n\n /**\n * Applies 'schema' at given position\n * @private\n * @param {Number} start selection start\n * @param {Number} end selection end\n * @param {Number} schema\n */\n protected _setScript(\n start: number,\n end: number,\n schema: {\n size: number;\n baseline: number;\n },\n ) {\n const loc = this.get2DCursorLocation(start, true),\n fontSize = this.getValueOfPropertyAt(\n loc.lineIndex,\n loc.charIndex,\n 'fontSize',\n ),\n dy = this.getValueOfPropertyAt(loc.lineIndex, loc.charIndex, 'deltaY'),\n style = {\n fontSize: fontSize * schema.size,\n deltaY: dy + fontSize * schema.baseline,\n };\n this.setSelectionStyles(style, start, end);\n }\n\n /**\n * @private\n * @param {Number} lineIndex index text line\n * @return {Number} Line left offset\n */\n _getLineLeftOffset(lineIndex: number): number {\n const lineWidth = this.getLineWidth(lineIndex),\n lineDiff = this.width - lineWidth,\n textAlign = this.textAlign,\n direction = this.direction,\n isEndOfWrapping = this.isEndOfWrapping(lineIndex);\n let leftOffset = 0;\n if (\n textAlign === JUSTIFY ||\n (textAlign === JUSTIFY_CENTER && !isEndOfWrapping) ||\n (textAlign === JUSTIFY_RIGHT && !isEndOfWrapping) ||\n (textAlign === JUSTIFY_LEFT && !isEndOfWrapping)\n ) {\n return 0;\n }\n if (textAlign === CENTER) {\n leftOffset = lineDiff / 2;\n }\n if (textAlign === RIGHT) {\n leftOffset = lineDiff;\n }\n if (textAlign === JUSTIFY_CENTER) {\n leftOffset = lineDiff / 2;\n }\n if (textAlign === JUSTIFY_RIGHT) {\n leftOffset = lineDiff;\n }\n if (direction === 'rtl') {\n if (\n textAlign === RIGHT ||\n textAlign === JUSTIFY ||\n textAlign === JUSTIFY_RIGHT\n ) {\n leftOffset = 0;\n } else if (textAlign === LEFT || textAlign === JUSTIFY_LEFT) {\n leftOffset = -lineDiff;\n } else if (textAlign === CENTER || textAlign === JUSTIFY_CENTER) {\n leftOffset = -lineDiff / 2;\n }\n }\n return leftOffset;\n }\n\n /**\n * @private\n */\n _clearCache() {\n this._forceClearCache = false;\n this.__lineWidths = [];\n this.__lineHeights = [];\n this.__charBounds = [];\n }\n\n /**\n * Measure a single line given its index. Used to calculate the initial\n * text bounding box. The values are calculated and stored in __lineWidths cache.\n * @private\n * @param {Number} lineIndex line number\n * @return {Number} Line width\n */\n getLineWidth(lineIndex: number): number {\n if (this.__lineWidths[lineIndex] !== undefined) {\n return this.__lineWidths[lineIndex];\n }\n\n const { width } = this.measureLine(lineIndex);\n this.__lineWidths[lineIndex] = width;\n return width;\n }\n\n _getWidthOfCharSpacing() {\n if (this.charSpacing !== 0) {\n return (this.fontSize * this.charSpacing) / 1000;\n }\n return 0;\n }\n\n /**\n * Retrieves the value of property at given character position\n * @param {Number} lineIndex the line number\n * @param {Number} charIndex the character number\n * @param {String} property the property name\n * @returns the value of 'property'\n */\n getValueOfPropertyAt(\n lineIndex: number,\n charIndex: number,\n property: T,\n ): this[T] {\n const charStyle = this._getStyleDeclaration(lineIndex, charIndex);\n return (charStyle[property] ?? this[property]) as this[T];\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _renderTextDecoration(\n ctx: CanvasRenderingContext2D,\n type: 'underline' | 'linethrough' | 'overline',\n ) {\n if (!this[type] && !this.styleHas(type)) {\n return;\n }\n let topOffset = this._getTopOffset();\n const leftOffset = this._getLeftOffset(),\n path = this.path,\n charSpacing = this._getWidthOfCharSpacing(),\n offsetAligner =\n type === 'linethrough' ? 0.5 : type === 'overline' ? 1 : 0,\n offsetY = this.offsets[type];\n for (let i = 0, len = this._textLines.length; i < len; i++) {\n const heightOfLine = this.getHeightOfLine(i);\n if (!this[type] && !this.styleHas(type, i)) {\n topOffset += heightOfLine;\n continue;\n }\n const line = this._textLines[i];\n const maxHeight = heightOfLine / this.lineHeight;\n const lineLeftOffset = this._getLineLeftOffset(i);\n let boxStart = 0;\n let boxWidth = 0;\n let lastDecoration = this.getValueOfPropertyAt(i, 0, type);\n let lastFill = this.getValueOfPropertyAt(i, 0, FILL);\n let lastTickness = this.getValueOfPropertyAt(\n i,\n 0,\n TEXT_DECORATION_THICKNESS,\n );\n let currentDecoration = lastDecoration;\n let currentFill = lastFill;\n let currentTickness = lastTickness;\n const top = topOffset + maxHeight * (1 - this._fontSizeFraction);\n let size = this.getHeightOfChar(i, 0);\n let dy = this.getValueOfPropertyAt(i, 0, 'deltaY');\n for (let j = 0, jlen = line.length; j < jlen; j++) {\n const charBox = this.__charBounds[i][j] as Required;\n currentDecoration = this.getValueOfPropertyAt(i, j, type);\n currentFill = this.getValueOfPropertyAt(i, j, FILL);\n currentTickness = this.getValueOfPropertyAt(\n i,\n j,\n TEXT_DECORATION_THICKNESS,\n );\n const currentSize = this.getHeightOfChar(i, j);\n const currentDy = this.getValueOfPropertyAt(i, j, 'deltaY');\n if (path && currentDecoration && currentFill) {\n const finalTickness = (this.fontSize * currentTickness) / 1000;\n ctx.save();\n // bug? verify lastFill is a valid fill here.\n ctx.fillStyle = lastFill as string;\n ctx.translate(charBox.renderLeft, charBox.renderTop);\n ctx.rotate(charBox.angle);\n ctx.fillRect(\n -charBox.kernedWidth / 2,\n offsetY * currentSize + currentDy - offsetAligner * finalTickness,\n charBox.kernedWidth,\n finalTickness,\n );\n ctx.restore();\n } else if (\n (currentDecoration !== lastDecoration ||\n currentFill !== lastFill ||\n currentSize !== size ||\n currentTickness !== lastTickness ||\n currentDy !== dy) &&\n boxWidth > 0\n ) {\n const finalTickness = (this.fontSize * lastTickness) / 1000;\n let drawStart = leftOffset + lineLeftOffset + boxStart;\n if (this.direction === 'rtl') {\n drawStart = this.width - drawStart - boxWidth;\n }\n if (lastDecoration && lastFill && lastTickness) {\n // bug? verify lastFill is a valid fill here.\n ctx.fillStyle = lastFill as string;\n ctx.fillRect(\n drawStart,\n top + offsetY * size + dy - offsetAligner * finalTickness,\n boxWidth,\n finalTickness,\n );\n }\n boxStart = charBox.left;\n boxWidth = charBox.width;\n lastDecoration = currentDecoration;\n lastTickness = currentTickness;\n lastFill = currentFill;\n size = currentSize;\n dy = currentDy;\n } else {\n boxWidth += charBox.kernedWidth;\n }\n }\n let drawStart = leftOffset + lineLeftOffset + boxStart;\n if (this.direction === 'rtl') {\n drawStart = this.width - drawStart - boxWidth;\n }\n ctx.fillStyle = currentFill as string;\n const finalTickness = (this.fontSize * currentTickness) / 1000;\n currentDecoration &&\n currentFill &&\n currentTickness &&\n ctx.fillRect(\n drawStart,\n top + offsetY * size + dy - offsetAligner * finalTickness,\n boxWidth - charSpacing,\n finalTickness,\n );\n topOffset += heightOfLine;\n }\n // if there is text background color no\n // other shadows should be casted\n this._removeShadow(ctx);\n }\n\n /**\n * return font declaration string for canvas context\n * @param {Object} [styleObject] object\n * @returns {String} font declaration formatted for canvas context.\n */\n _getFontDeclaration(\n {\n fontFamily = this.fontFamily,\n fontStyle = this.fontStyle,\n fontWeight = this.fontWeight,\n fontSize = this.fontSize,\n }: Partial<\n Pick<\n TextStyleDeclaration,\n 'fontFamily' | 'fontStyle' | 'fontWeight' | 'fontSize'\n >\n > = {},\n forMeasuring?: boolean,\n ): string {\n const parsedFontFamily =\n fontFamily.includes(\"'\") ||\n fontFamily.includes('\"') ||\n fontFamily.includes(',') ||\n FabricText.genericFonts.includes(fontFamily.toLowerCase())\n ? fontFamily\n : `\"${fontFamily}\"`;\n return [\n fontStyle,\n fontWeight,\n `${forMeasuring ? this.CACHE_FONT_SIZE : fontSize}px`,\n parsedFontFamily,\n ].join(' ');\n }\n\n /**\n * Renders text instance on a specified context\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n render(ctx: CanvasRenderingContext2D) {\n if (!this.visible) {\n return;\n }\n if (\n this.canvas &&\n this.canvas.skipOffscreen &&\n !this.group &&\n !this.isOnScreen()\n ) {\n return;\n }\n if (this._forceClearCache) {\n this.initDimensions();\n }\n super.render(ctx);\n }\n\n /**\n * Override this method to customize grapheme splitting\n * @todo the util `graphemeSplit` needs to be injectable in some way.\n * is more comfortable to inject the correct util rather than having to override text\n * in the middle of the prototype chain\n * @param {string} value\n * @returns {string[]} array of graphemes\n */\n graphemeSplit(value: string): string[] {\n return graphemeSplit(value);\n }\n\n /**\n * Returns the text as an array of lines.\n * @param {String} text text to split\n * @returns Lines in the text\n */\n _splitTextIntoLines(text: string): TextLinesInfo {\n const lines = text.split(this._reNewline),\n newLines = new Array(lines.length),\n newLine = ['\\n'];\n let newText: string[] = [];\n for (let i = 0; i < lines.length; i++) {\n newLines[i] = this.graphemeSplit(lines[i]);\n newText = newText.concat(newLines[i], newLine);\n }\n newText.pop();\n return {\n _unwrappedLines: newLines,\n lines: lines,\n graphemeText: newText,\n graphemeLines: newLines,\n };\n }\n\n /**\n * Returns object representation of an instance\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} Object representation of an instance\n */\n toObject<\n T extends Omit, keyof SProps>,\n K extends keyof T = never,\n >(propertiesToInclude: K[] = []): Pick & SProps {\n return {\n ...super.toObject([...additionalProps, ...propertiesToInclude] as K[]),\n styles: stylesToArray(this.styles, this.text),\n ...(this.path ? { path: this.path.toObject() } : {}),\n };\n }\n\n set(key: string | any, value?: any) {\n const { textLayoutProperties } = this.constructor as typeof FabricText;\n super.set(key, value);\n let needsDims = false;\n let isAddingPath = false;\n if (typeof key === 'object') {\n for (const _key in key) {\n if (_key === 'path') {\n this.setPathInfo();\n }\n needsDims = needsDims || textLayoutProperties.includes(_key);\n isAddingPath = isAddingPath || _key === 'path';\n }\n } else {\n needsDims = textLayoutProperties.includes(key);\n isAddingPath = key === 'path';\n }\n if (isAddingPath) {\n this.setPathInfo();\n }\n if (needsDims && this.initialized) {\n this.initDimensions();\n this.setCoords();\n }\n return this;\n }\n\n /**\n * Returns complexity of an instance\n * @return {Number} complexity\n */\n complexity(): number {\n return 1;\n }\n\n /**\n * List of generic font families\n * @see https://developer.mozilla.org/en-US/docs/Web/CSS/font-family#generic-name\n */\n static genericFonts = [\n 'serif',\n 'sans-serif',\n 'monospace',\n 'cursive',\n 'fantasy',\n 'system-ui',\n 'ui-serif',\n 'ui-sans-serif',\n 'ui-monospace',\n 'ui-rounded',\n 'math',\n 'emoji',\n 'fangsong',\n ];\n\n /* _FROM_SVG_START_ */\n\n /**\n * List of attribute names to account for when parsing SVG element (used by {@link FabricText.fromElement})\n * @see: http://www.w3.org/TR/SVG/text.html#TextElement\n */\n static ATTRIBUTE_NAMES = SHARED_ATTRIBUTES.concat(\n 'x',\n 'y',\n 'dx',\n 'dy',\n 'font-family',\n 'font-style',\n 'font-weight',\n 'font-size',\n 'letter-spacing',\n 'text-decoration',\n 'text-anchor',\n );\n\n /**\n * Returns FabricText instance from an SVG element (not yet implemented)\n * @param {HTMLElement} element Element to parse\n * @param {Object} [options] Options object\n */\n static async fromElement(\n element: HTMLElement | SVGElement,\n options?: Abortable,\n cssRules?: CSSRules,\n ) {\n const parsedAttributes = parseAttributes(\n element,\n FabricText.ATTRIBUTE_NAMES,\n cssRules,\n );\n\n const {\n textAnchor = LEFT as typeof LEFT | typeof CENTER | typeof RIGHT,\n textDecoration = '',\n dx = 0,\n dy = 0,\n top = 0,\n left = 0,\n fontSize = DEFAULT_SVG_FONT_SIZE,\n strokeWidth = 1,\n ...restOfOptions\n } = { ...options, ...parsedAttributes };\n\n const textContent = (element.textContent || '')\n .replace(/^\\s+|\\s+$|\\n+/g, '')\n .replace(/\\s+/g, ' ');\n\n // this code here is probably the usual issue for SVG center find\n // this can later looked at again and probably removed.\n\n const text = new this(textContent, {\n left: left + dx,\n top: top + dy,\n underline: textDecoration.includes('underline'),\n overline: textDecoration.includes('overline'),\n linethrough: textDecoration.includes('line-through'),\n // we initialize this as 0\n strokeWidth: 0,\n fontSize,\n ...restOfOptions,\n }),\n textHeightScaleFactor = text.getScaledHeight() / text.height,\n lineHeightDiff =\n (text.height + text.strokeWidth) * text.lineHeight - text.height,\n scaledDiff = lineHeightDiff * textHeightScaleFactor,\n textHeight = text.getScaledHeight() + scaledDiff;\n\n let offX = 0;\n /*\n Adjust positioning:\n x/y attributes in SVG correspond to the bottom-left corner of text bounding box\n fabric output by default at top, left.\n */\n if (textAnchor === CENTER) {\n offX = text.getScaledWidth() / 2;\n }\n if (textAnchor === RIGHT) {\n offX = text.getScaledWidth();\n }\n text.set({\n left: text.left - offX,\n top:\n text.top -\n (textHeight - text.fontSize * (0.07 + text._fontSizeFraction)) /\n text.lineHeight,\n strokeWidth,\n });\n return text;\n }\n\n /* _FROM_SVG_END_ */\n\n /**\n * Returns FabricText instance from an object representation\n * @param {Object} object plain js Object to create an instance from\n * @returns {Promise}\n */\n static fromObject<\n T extends TOptions,\n S extends FabricText,\n >(object: T) {\n return this._fromObject(\n {\n ...object,\n styles: stylesFromArray(object.styles || {}, object.text),\n },\n {\n extraParam: 'text',\n },\n );\n }\n}\n\napplyMixins(FabricText, [TextSVGExportMixin]);\nclassRegistry.setClass(FabricText);\nclassRegistry.setSVGClass(FabricText);\n","import type {\n DragEventData,\n DropEventData,\n TPointerEvent,\n} from '../../EventTypeDefs';\nimport { Point } from '../../Point';\nimport type { IText } from './IText';\nimport { setStyle } from '../../util/internals/dom_style';\nimport { cloneStyles } from '../../util/internals/cloneStyles';\nimport type { TextStyleDeclaration } from '../Text/StyledText';\nimport { getDocumentFromElement } from '../../util/dom_misc';\nimport { CHANGED, NONE } from '../../constants';\n\n/**\n * #### Dragging IText/Textbox Lifecycle\n * - {@link start} is called from `mousedown` {@link IText#_mouseDownHandler} and determines if dragging should start by testing {@link isPointerOverSelection}\n * - if true `mousedown` {@link IText#_mouseDownHandler} is blocked to keep selection\n * - if the pointer moves, canvas fires numerous mousemove {@link Canvas#_onMouseMove} that we make sure **aren't** prevented ({@link IText#shouldStartDragging}) in order for the window to start a drag session\n * - once/if the session starts canvas calls {@link onDragStart} on the active object to determine if dragging should occur\n * - canvas fires relevant drag events that are handled by the handlers defined in this scope\n * - {@link end} is called from `mouseup` {@link IText#mouseUpHandler}, blocking IText default click behavior\n * - in case the drag session didn't occur, {@link end} handles a click, since logic to do so was blocked during `mousedown`\n */\nexport class DraggableTextDelegate {\n readonly target: IText;\n private __mouseDownInPlace = false;\n private __dragStartFired = false;\n private __isDraggingOver = false;\n private __dragStartSelection?: {\n selectionStart: number;\n selectionEnd: number;\n };\n private __dragImageDisposer?: VoidFunction;\n private _dispose?: () => void;\n\n constructor(target: IText) {\n this.target = target;\n const disposers = [\n this.target.on('dragenter', this.dragEnterHandler.bind(this)),\n this.target.on('dragover', this.dragOverHandler.bind(this)),\n this.target.on('dragleave', this.dragLeaveHandler.bind(this)),\n this.target.on('dragend', this.dragEndHandler.bind(this)),\n this.target.on('drop', this.dropHandler.bind(this)),\n ];\n this._dispose = () => {\n disposers.forEach((d) => d());\n this._dispose = undefined;\n };\n }\n\n isPointerOverSelection(e: TPointerEvent) {\n const target = this.target;\n const newSelection = target.getSelectionStartFromPointer(e);\n return (\n target.isEditing &&\n newSelection >= target.selectionStart &&\n newSelection <= target.selectionEnd &&\n target.selectionStart < target.selectionEnd\n );\n }\n\n /**\n * @public override this method to disable dragging and default to mousedown logic\n */\n start(e: TPointerEvent) {\n return (this.__mouseDownInPlace = this.isPointerOverSelection(e));\n }\n\n /**\n * @public override this method to disable dragging without discarding selection\n */\n isActive() {\n return this.__mouseDownInPlace;\n }\n\n /**\n * Ends interaction and sets cursor in case of a click\n * @returns true if was active\n */\n end(e: TPointerEvent) {\n const active = this.isActive();\n if (active && !this.__dragStartFired) {\n // mousedown has been blocked since `active` is true => cursor has not been set.\n // `__dragStartFired` is false => dragging didn't occur, pointer didn't move and is over selection.\n // meaning this is actually a click, `active` is a false positive.\n this.target.setCursorByClick(e);\n this.target.initDelayedCursor(true);\n }\n this.__mouseDownInPlace = false;\n this.__dragStartFired = false;\n this.__isDraggingOver = false;\n return active;\n }\n\n getDragStartSelection() {\n return this.__dragStartSelection;\n }\n\n /**\n * Override to customize the drag image\n * https://developer.mozilla.org/en-US/docs/Web/API/DataTransfer/setDragImage\n */\n setDragImage(\n e: DragEvent,\n {\n selectionStart,\n selectionEnd,\n }: {\n selectionStart: number;\n selectionEnd: number;\n },\n ) {\n const target = this.target;\n const canvas = target.canvas!;\n const flipFactor = new Point(target.flipX ? -1 : 1, target.flipY ? -1 : 1);\n const boundaries = target._getCursorBoundaries(selectionStart);\n const selectionPosition = new Point(\n boundaries.left + boundaries.leftOffset,\n boundaries.top + boundaries.topOffset,\n ).multiply(flipFactor);\n const pos = selectionPosition.transform(target.calcTransformMatrix());\n const pointer = canvas.getScenePoint(e);\n const diff = pointer.subtract(pos);\n const retinaScaling = target.getCanvasRetinaScaling();\n const bbox = target.getBoundingRect();\n const correction = pos.subtract(new Point(bbox.left, bbox.top));\n const vpt = canvas.viewportTransform;\n const offset = correction.add(diff).transform(vpt, true);\n // prepare instance for drag image snapshot by making all non selected text invisible\n const bgc = target.backgroundColor;\n const styles = cloneStyles(target.styles);\n target.backgroundColor = '';\n const styleOverride = {\n stroke: 'transparent',\n fill: 'transparent',\n textBackgroundColor: 'transparent',\n };\n target.setSelectionStyles(styleOverride, 0, selectionStart);\n target.setSelectionStyles(styleOverride, selectionEnd, target.text.length);\n target.dirty = true;\n const dragImage = target.toCanvasElement({\n enableRetinaScaling: canvas.enableRetinaScaling,\n viewportTransform: true,\n });\n // restore values\n target.backgroundColor = bgc;\n target.styles = styles;\n target.dirty = true;\n // position drag image offscreen\n setStyle(dragImage, {\n position: 'fixed',\n left: `${-dragImage.width}px`,\n border: NONE,\n width: `${dragImage.width / retinaScaling}px`,\n height: `${dragImage.height / retinaScaling}px`,\n });\n this.__dragImageDisposer && this.__dragImageDisposer();\n this.__dragImageDisposer = () => {\n dragImage.remove();\n };\n getDocumentFromElement(\n (e.target || this.target.hiddenTextarea)! as HTMLElement,\n ).body.appendChild(dragImage);\n e.dataTransfer?.setDragImage(dragImage, offset.x, offset.y);\n }\n\n /**\n * @returns {boolean} determines whether {@link target} should/shouldn't become a drag source\n */\n onDragStart(e: DragEvent): boolean {\n this.__dragStartFired = true;\n const target = this.target;\n const active = this.isActive();\n if (active && e.dataTransfer) {\n const selection = (this.__dragStartSelection = {\n selectionStart: target.selectionStart,\n selectionEnd: target.selectionEnd,\n });\n const value = target._text\n .slice(selection.selectionStart, selection.selectionEnd)\n .join('');\n const data = { text: target.text, value, ...selection };\n e.dataTransfer.setData('text/plain', value);\n e.dataTransfer.setData(\n 'application/fabric',\n JSON.stringify({\n value: value,\n styles: target.getSelectionStyles(\n selection.selectionStart,\n selection.selectionEnd,\n true,\n ),\n }),\n );\n e.dataTransfer.effectAllowed = 'copyMove';\n this.setDragImage(e, data);\n }\n target.abortCursorAnimation();\n return active;\n }\n\n /**\n * use {@link targetCanDrop} to respect overriding\n * @returns {boolean} determines whether {@link target} should/shouldn't become a drop target\n */\n canDrop(e: DragEvent): boolean {\n if (\n this.target.editable &&\n !this.target.getActiveControl() &&\n !e.defaultPrevented\n ) {\n if (this.isActive() && this.__dragStartSelection) {\n // drag source trying to drop over itself\n // allow dropping only outside of drag start selection\n const index = this.target.getSelectionStartFromPointer(e);\n const dragStartSelection = this.__dragStartSelection;\n return (\n index < dragStartSelection.selectionStart ||\n index > dragStartSelection.selectionEnd\n );\n }\n return true;\n }\n return false;\n }\n\n /**\n * in order to respect overriding {@link IText#canDrop} we call that instead of calling {@link canDrop} directly\n */\n protected targetCanDrop(e: DragEvent) {\n return this.target.canDrop(e);\n }\n\n dragEnterHandler({ e }: DragEventData) {\n const canDrop = this.targetCanDrop(e);\n if (!this.__isDraggingOver && canDrop) {\n this.__isDraggingOver = true;\n }\n }\n\n dragOverHandler(ev: DragEventData) {\n const { e } = ev;\n const canDrop = this.targetCanDrop(e);\n if (!this.__isDraggingOver && canDrop) {\n this.__isDraggingOver = true;\n } else if (this.__isDraggingOver && !canDrop) {\n // drop state has changed\n this.__isDraggingOver = false;\n }\n if (this.__isDraggingOver) {\n // can be dropped, inform browser\n e.preventDefault();\n // inform event subscribers\n ev.canDrop = true;\n ev.dropTarget = this.target;\n }\n }\n\n dragLeaveHandler() {\n if (this.__isDraggingOver || this.isActive()) {\n this.__isDraggingOver = false;\n }\n }\n\n /**\n * Override the `text/plain | application/fabric` types of {@link DragEvent#dataTransfer}\n * in order to change the drop value or to customize styling respectively, by listening to the `drop:before` event\n * https://developer.mozilla.org/en-US/docs/Web/API/HTML_Drag_and_Drop_API/Drag_operations#performing_a_drop\n */\n dropHandler(ev: DropEventData) {\n const { e } = ev;\n const didDrop = e.defaultPrevented;\n this.__isDraggingOver = false;\n // inform browser that the drop has been accepted\n e.preventDefault();\n let insert = e.dataTransfer?.getData('text/plain');\n if (insert && !didDrop) {\n const target = this.target;\n const canvas = target.canvas!;\n let insertAt = target.getSelectionStartFromPointer(e);\n const { styles } = (\n e.dataTransfer!.types.includes('application/fabric')\n ? JSON.parse(e.dataTransfer!.getData('application/fabric'))\n : {}\n ) as { styles: TextStyleDeclaration[] };\n const trailing = insert[Math.max(0, insert.length - 1)];\n const selectionStartOffset = 0;\n // drag and drop in same instance\n if (this.__dragStartSelection) {\n const selectionStart = this.__dragStartSelection.selectionStart;\n const selectionEnd = this.__dragStartSelection.selectionEnd;\n if (insertAt > selectionStart && insertAt <= selectionEnd) {\n insertAt = selectionStart;\n } else if (insertAt > selectionEnd) {\n insertAt -= selectionEnd - selectionStart;\n }\n target.removeChars(selectionStart, selectionEnd);\n // prevent `dragend` from handling event\n delete this.__dragStartSelection;\n }\n // remove redundant line break\n if (\n target._reNewline.test(trailing) &&\n (target._reNewline.test(target._text[insertAt]) ||\n insertAt === target._text.length)\n ) {\n insert = insert.trimEnd();\n }\n // inform subscribers\n ev.didDrop = true;\n ev.dropTarget = target;\n // finalize\n target.insertChars(insert, styles, insertAt);\n // can this part be moved in an outside event? andrea to check.\n canvas.setActiveObject(target);\n target.enterEditing(e);\n target.selectionStart = Math.min(\n insertAt + selectionStartOffset,\n target._text.length,\n );\n target.selectionEnd = Math.min(\n target.selectionStart + insert.length,\n target._text.length,\n );\n target.hiddenTextarea!.value = target.text;\n target._updateTextarea();\n target.hiddenTextarea!.focus();\n target.fire(CHANGED, {\n index: insertAt + selectionStartOffset,\n action: 'drop',\n });\n canvas.fire('text:changed', { target });\n canvas.contextTopDirty = true;\n canvas.requestRenderAll();\n }\n }\n\n /**\n * fired only on the drag source after drop (if occurred)\n * handle changes to the drag source in case of a drop on another object or a cancellation\n * https://developer.mozilla.org/en-US/docs/Web/API/HTML_Drag_and_Drop_API/Drag_operations#finishing_a_drag\n */\n dragEndHandler({ e }: DragEventData) {\n if (this.isActive() && this.__dragStartFired) {\n // once the drop event finishes we check if we need to change the drag source\n // if the drag source received the drop we bail out since the drop handler has already handled logic\n if (this.__dragStartSelection) {\n const target = this.target;\n const canvas = this.target.canvas!;\n const { selectionStart, selectionEnd } = this.__dragStartSelection;\n const dropEffect = e.dataTransfer?.dropEffect || NONE;\n if (dropEffect === NONE) {\n // pointer is back over selection\n target.selectionStart = selectionStart;\n target.selectionEnd = selectionEnd;\n target._updateTextarea();\n target.hiddenTextarea!.focus();\n } else {\n target.clearContextTop();\n if (dropEffect === 'move') {\n target.removeChars(selectionStart, selectionEnd);\n target.selectionStart = target.selectionEnd = selectionStart;\n target.hiddenTextarea &&\n (target.hiddenTextarea.value = target.text);\n target._updateTextarea();\n target.fire(CHANGED, {\n index: selectionStart,\n action: 'dragend',\n });\n canvas.fire('text:changed', { target });\n canvas.requestRenderAll();\n }\n target.exitEditing();\n }\n }\n }\n\n this.__dragImageDisposer && this.__dragImageDisposer();\n delete this.__dragImageDisposer;\n delete this.__dragStartSelection;\n this.__isDraggingOver = false;\n }\n\n dispose() {\n this._dispose && this._dispose();\n }\n}\n","import type { ObjectEvents, TPointerEvent } from '../../EventTypeDefs';\nimport { Point } from '../../Point';\nimport type { FabricObject } from '../Object/FabricObject';\nimport { FabricText } from '../Text/Text';\nimport { animate } from '../../util/animation/animate';\nimport type { TOnAnimationChangeCallback } from '../../util/animation/types';\nimport type { ValueAnimation } from '../../util/animation/ValueAnimation';\nimport type { TextStyleDeclaration } from '../Text/StyledText';\nimport type { SerializedTextProps, TextProps } from '../Text/Text';\nimport type { TOptions } from '../../typedefs';\nimport { getDocumentFromElement } from '../../util/dom_misc';\nimport { LEFT, MODIFIED, RIGHT, reNewline } from '../../constants';\nimport type { IText } from './IText';\n\n/**\n * extend this regex to support non english languages\n *\n * - ` ` Matches a SPACE character (char code 32).\n * - `\\n` Matches a LINE FEED character (char code 10).\n * - `\\.` Matches a \".\" character (char code 46).\n * - `,` Matches a \",\" character (char code 44).\n * - `;` Matches a \";\" character (char code 59).\n * - `!` Matches a \"!\" character (char code 33).\n * - `\\?` Matches a \"?\" character (char code 63).\n * - `\\-` Matches a \"-\" character (char code 45).\n */\n// eslint-disable-next-line no-useless-escape\nconst reNonWord = /[ \\n\\.,;!\\?\\-]/;\n\nexport type ITextEvents = ObjectEvents & {\n 'selection:changed': never;\n changed: never | { index: number; action: string };\n 'editing:entered': never | { e: TPointerEvent };\n 'editing:exited': never;\n};\n\nexport abstract class ITextBehavior<\n Props extends TOptions = Partial,\n SProps extends SerializedTextProps = SerializedTextProps,\n EventSpec extends ITextEvents = ITextEvents,\n> extends FabricText {\n declare abstract isEditing: boolean;\n declare abstract cursorDelay: number;\n declare abstract selectionStart: number;\n declare abstract selectionEnd: number;\n declare abstract cursorDuration: number;\n declare abstract editable: boolean;\n declare abstract editingBorderColor: string;\n\n declare abstract compositionStart: number;\n declare abstract compositionEnd: number;\n\n declare abstract hiddenTextarea: HTMLTextAreaElement | null;\n\n /**\n * Helps determining when the text is in composition, so that the cursor\n * rendering is altered.\n */\n declare protected inCompositionMode: boolean;\n\n declare protected _reSpace: RegExp;\n declare private _currentTickState?: ValueAnimation;\n declare private _currentTickCompleteState?: ValueAnimation;\n protected _currentCursorOpacity = 1;\n declare private _textBeforeEdit: string;\n declare protected __selectionStartOnMouseDown: number;\n\n /**\n * Keeps track if the IText object was selected before the actual click.\n * This because we want to delay enter editing by a click.\n */\n declare protected selected: boolean;\n declare protected cursorOffsetCache: { left?: number; top?: number };\n declare protected _savedProps?: {\n hasControls: boolean;\n borderColor: string;\n lockMovementX: boolean;\n lockMovementY: boolean;\n selectable: boolean;\n hoverCursor: CSSStyleDeclaration['cursor'] | null;\n defaultCursor?: CSSStyleDeclaration['cursor'];\n moveCursor?: CSSStyleDeclaration['cursor'];\n };\n declare protected _selectionDirection: 'left' | 'right' | null;\n\n abstract initHiddenTextarea(): void;\n abstract _fireSelectionChanged(): void;\n abstract renderCursorOrSelection(): void;\n abstract getSelectionStartFromPointer(e: TPointerEvent): number;\n abstract _getCursorBoundaries(\n index: number,\n skipCaching?: boolean,\n ): {\n left: number;\n top: number;\n leftOffset: number;\n topOffset: number;\n };\n\n /**\n * Initializes all the interactive behavior of IText\n */\n initBehavior() {\n this._tick = this._tick.bind(this);\n this._onTickComplete = this._onTickComplete.bind(this);\n this.updateSelectionOnMouseMove =\n this.updateSelectionOnMouseMove.bind(this);\n }\n\n onDeselect(options?: { e?: TPointerEvent; object?: FabricObject }) {\n this.isEditing && this.exitEditing();\n this.selected = false;\n return super.onDeselect(options);\n }\n\n /**\n * @private\n */\n _animateCursor({\n toValue,\n duration,\n delay,\n onComplete,\n }: {\n toValue: number;\n duration: number;\n delay?: number;\n onComplete?: TOnAnimationChangeCallback;\n }) {\n return animate({\n startValue: this._currentCursorOpacity,\n endValue: toValue,\n duration,\n delay,\n onComplete,\n abort: () =>\n !this.canvas ||\n // we do not want to animate a selection, only cursor\n this.selectionStart !== this.selectionEnd,\n onChange: (value) => {\n this._currentCursorOpacity = value;\n this.renderCursorOrSelection();\n },\n });\n }\n\n /**\n * changes the cursor from visible to invisible\n */\n private _tick(delay?: number) {\n this._currentTickState = this._animateCursor({\n toValue: 0,\n duration: this.cursorDuration / 2,\n delay: Math.max(delay || 0, 100),\n onComplete: this._onTickComplete,\n });\n }\n\n /**\n * Changes the cursor from invisible to visible\n */\n private _onTickComplete() {\n this._currentTickCompleteState?.abort();\n this._currentTickCompleteState = this._animateCursor({\n toValue: 1,\n duration: this.cursorDuration,\n onComplete: this._tick,\n });\n }\n\n /**\n * Initializes delayed cursor\n */\n initDelayedCursor(restart?: boolean) {\n this.abortCursorAnimation();\n this._tick(restart ? 0 : this.cursorDelay);\n }\n\n /**\n * Aborts cursor animation, clears all timeouts and clear textarea context if necessary\n */\n abortCursorAnimation() {\n let shouldClear = false;\n [this._currentTickState, this._currentTickCompleteState].forEach(\n (cursorAnimation) => {\n if (cursorAnimation && !cursorAnimation.isDone()) {\n shouldClear = true;\n cursorAnimation.abort();\n }\n },\n );\n\n this._currentCursorOpacity = 1;\n\n // make sure we clear context even if instance is not editing\n if (shouldClear) {\n this.clearContextTop();\n }\n }\n\n /**\n * Restart tue cursor animation if either is in complete state ( between animations )\n * or if it never started before\n */\n restartCursorIfNeeded() {\n if (\n [this._currentTickState, this._currentTickCompleteState].some(\n (cursorAnimation) => !cursorAnimation || cursorAnimation.isDone(),\n )\n ) {\n this.initDelayedCursor();\n }\n }\n\n /**\n * Selects entire text\n */\n selectAll() {\n this.selectionStart = 0;\n this.selectionEnd = this._text.length;\n this._fireSelectionChanged();\n this._updateTextarea();\n return this;\n }\n\n /**\n * Selects entire text and updates the visual state\n */\n cmdAll() {\n this.selectAll();\n this.renderCursorOrSelection();\n }\n\n /**\n * Returns selected text\n * @return {String}\n */\n getSelectedText(): string {\n return this._text.slice(this.selectionStart, this.selectionEnd).join('');\n }\n\n /**\n * Find new selection index representing start of current word according to current selection index\n * @param {Number} startFrom Current selection index\n * @return {Number} New selection index\n */\n findWordBoundaryLeft(startFrom: number): number {\n let offset = 0,\n index = startFrom - 1;\n\n // remove space before cursor first\n if (this._reSpace.test(this._text[index])) {\n while (this._reSpace.test(this._text[index])) {\n offset++;\n index--;\n }\n }\n while (/\\S/.test(this._text[index]) && index > -1) {\n offset++;\n index--;\n }\n\n return startFrom - offset;\n }\n\n /**\n * Find new selection index representing end of current word according to current selection index\n * @param {Number} startFrom Current selection index\n * @return {Number} New selection index\n */\n findWordBoundaryRight(startFrom: number): number {\n let offset = 0,\n index = startFrom;\n\n // remove space after cursor first\n if (this._reSpace.test(this._text[index])) {\n while (this._reSpace.test(this._text[index])) {\n offset++;\n index++;\n }\n }\n while (/\\S/.test(this._text[index]) && index < this._text.length) {\n offset++;\n index++;\n }\n\n return startFrom + offset;\n }\n\n /**\n * Find new selection index representing start of current line according to current selection index\n * @param {Number} startFrom Current selection index\n * @return {Number} New selection index\n */\n findLineBoundaryLeft(startFrom: number): number {\n let offset = 0,\n index = startFrom - 1;\n\n while (!/\\n/.test(this._text[index]) && index > -1) {\n offset++;\n index--;\n }\n\n return startFrom - offset;\n }\n\n /**\n * Find new selection index representing end of current line according to current selection index\n * @param {Number} startFrom Current selection index\n * @return {Number} New selection index\n */\n findLineBoundaryRight(startFrom: number): number {\n let offset = 0,\n index = startFrom;\n\n while (!/\\n/.test(this._text[index]) && index < this._text.length) {\n offset++;\n index++;\n }\n\n return startFrom + offset;\n }\n\n /**\n * Finds index corresponding to beginning or end of a word\n * @param {Number} selectionStart Index of a character\n * @param {Number} direction 1 or -1\n * @return {Number} Index of the beginning or end of a word\n */\n searchWordBoundary(selectionStart: number, direction: 1 | -1): number {\n const text = this._text;\n // if we land on a space we move the cursor backwards\n // if we are searching boundary end we move the cursor backwards ONLY if we don't land on a line break\n let index =\n selectionStart > 0 &&\n this._reSpace.test(text[selectionStart]) &&\n (direction === -1 || !reNewline.test(text[selectionStart - 1]))\n ? selectionStart - 1\n : selectionStart,\n _char = text[index];\n while (index > 0 && index < text.length && !reNonWord.test(_char)) {\n index += direction;\n _char = text[index];\n }\n if (direction === -1 && reNonWord.test(_char)) {\n index++;\n }\n return index;\n }\n\n /**\n * Selects the word that contains the char at index selectionStart\n * @param {Number} selectionStart Index of a character\n */\n selectWord(selectionStart?: number) {\n selectionStart = selectionStart ?? this.selectionStart;\n // search backwards\n const newSelectionStart = this.searchWordBoundary(selectionStart, -1),\n // search forward\n newSelectionEnd = Math.max(\n newSelectionStart,\n this.searchWordBoundary(selectionStart, 1),\n );\n\n this.selectionStart = newSelectionStart;\n this.selectionEnd = newSelectionEnd;\n this._fireSelectionChanged();\n this._updateTextarea();\n // remove next major, for now it renders twice :(\n this.renderCursorOrSelection();\n }\n\n /**\n * Selects the line that contains selectionStart\n * @param {Number} selectionStart Index of a character\n */\n selectLine(selectionStart?: number) {\n selectionStart = selectionStart ?? this.selectionStart;\n const newSelectionStart = this.findLineBoundaryLeft(selectionStart),\n newSelectionEnd = this.findLineBoundaryRight(selectionStart);\n\n this.selectionStart = newSelectionStart;\n this.selectionEnd = newSelectionEnd;\n this._fireSelectionChanged();\n this._updateTextarea();\n }\n\n /**\n * Enters editing state\n */\n enterEditing(e?: TPointerEvent) {\n if (this.isEditing || !this.editable) {\n return;\n }\n this.enterEditingImpl();\n this.fire('editing:entered', e ? { e } : undefined);\n this._fireSelectionChanged();\n if (this.canvas) {\n this.canvas.fire('text:editing:entered', {\n target: this as unknown as IText,\n e,\n });\n this.canvas.requestRenderAll();\n }\n }\n\n /**\n * runs the actual logic that enter from editing state, see {@link enterEditing}\n */\n enterEditingImpl() {\n if (this.canvas) {\n this.canvas.calcOffset();\n this.canvas.textEditingManager.exitTextEditing();\n }\n\n this.isEditing = true;\n\n this.initHiddenTextarea();\n this.hiddenTextarea!.focus();\n this.hiddenTextarea!.value = this.text;\n this._updateTextarea();\n this._saveEditingProps();\n this._setEditingProps();\n this._textBeforeEdit = this.text;\n\n this._tick();\n }\n\n /**\n * called by {@link Canvas#textEditingManager}\n */\n updateSelectionOnMouseMove(e: TPointerEvent) {\n if (this.getActiveControl()) {\n return;\n }\n\n const el = this.hiddenTextarea!;\n // regain focus\n getDocumentFromElement(el).activeElement !== el && el.focus();\n\n const newSelectionStart = this.getSelectionStartFromPointer(e),\n currentStart = this.selectionStart,\n currentEnd = this.selectionEnd;\n if (\n (newSelectionStart !== this.__selectionStartOnMouseDown ||\n currentStart === currentEnd) &&\n (currentStart === newSelectionStart || currentEnd === newSelectionStart)\n ) {\n return;\n }\n if (newSelectionStart > this.__selectionStartOnMouseDown) {\n this.selectionStart = this.__selectionStartOnMouseDown;\n this.selectionEnd = newSelectionStart;\n } else {\n this.selectionStart = newSelectionStart;\n this.selectionEnd = this.__selectionStartOnMouseDown;\n }\n if (\n this.selectionStart !== currentStart ||\n this.selectionEnd !== currentEnd\n ) {\n this._fireSelectionChanged();\n this._updateTextarea();\n this.renderCursorOrSelection();\n }\n }\n\n /**\n * @private\n */\n _setEditingProps() {\n this.hoverCursor = 'text';\n\n if (this.canvas) {\n this.canvas.defaultCursor = this.canvas.moveCursor = 'text';\n }\n\n this.borderColor = this.editingBorderColor;\n this.hasControls = this.selectable = false;\n this.lockMovementX = this.lockMovementY = true;\n }\n\n /**\n * convert from textarea to grapheme indexes\n */\n fromStringToGraphemeSelection(start: number, end: number, text: string) {\n const smallerTextStart = text.slice(0, start),\n graphemeStart = this.graphemeSplit(smallerTextStart).length;\n if (start === end) {\n return { selectionStart: graphemeStart, selectionEnd: graphemeStart };\n }\n const smallerTextEnd = text.slice(start, end),\n graphemeEnd = this.graphemeSplit(smallerTextEnd).length;\n return {\n selectionStart: graphemeStart,\n selectionEnd: graphemeStart + graphemeEnd,\n };\n }\n\n /**\n * convert from fabric to textarea values\n */\n fromGraphemeToStringSelection(\n start: number,\n end: number,\n graphemes: string[],\n ) {\n const smallerTextStart = graphemes.slice(0, start),\n graphemeStart = smallerTextStart.join('').length;\n if (start === end) {\n return { selectionStart: graphemeStart, selectionEnd: graphemeStart };\n }\n const smallerTextEnd = graphemes.slice(start, end),\n graphemeEnd = smallerTextEnd.join('').length;\n return {\n selectionStart: graphemeStart,\n selectionEnd: graphemeStart + graphemeEnd,\n };\n }\n\n /**\n * @private\n */\n _updateTextarea() {\n this.cursorOffsetCache = {};\n if (!this.hiddenTextarea) {\n return;\n }\n if (!this.inCompositionMode) {\n const newSelection = this.fromGraphemeToStringSelection(\n this.selectionStart,\n this.selectionEnd,\n this._text,\n );\n this.hiddenTextarea.selectionStart = newSelection.selectionStart;\n this.hiddenTextarea.selectionEnd = newSelection.selectionEnd;\n }\n this.updateTextareaPosition();\n }\n\n /**\n * @private\n */\n updateFromTextArea() {\n if (!this.hiddenTextarea) {\n return;\n }\n this.cursorOffsetCache = {};\n const textarea = this.hiddenTextarea;\n this.text = textarea.value;\n this.set('dirty', true);\n this.initDimensions();\n this.setCoords();\n const newSelection = this.fromStringToGraphemeSelection(\n textarea.selectionStart,\n textarea.selectionEnd,\n textarea.value,\n );\n this.selectionEnd = this.selectionStart = newSelection.selectionEnd;\n if (!this.inCompositionMode) {\n this.selectionStart = newSelection.selectionStart;\n }\n this.updateTextareaPosition();\n }\n\n /**\n * @private\n */\n updateTextareaPosition() {\n if (this.selectionStart === this.selectionEnd) {\n const style = this._calcTextareaPosition();\n this.hiddenTextarea!.style.left = style.left;\n this.hiddenTextarea!.style.top = style.top;\n }\n }\n\n /**\n * @private\n * @return {Object} style contains style for hiddenTextarea\n */\n _calcTextareaPosition() {\n if (!this.canvas) {\n return { left: '1px', top: '1px' };\n }\n const desiredPosition = this.inCompositionMode\n ? this.compositionStart\n : this.selectionStart,\n boundaries = this._getCursorBoundaries(desiredPosition),\n cursorLocation = this.get2DCursorLocation(desiredPosition),\n lineIndex = cursorLocation.lineIndex,\n charIndex = cursorLocation.charIndex,\n charHeight =\n this.getValueOfPropertyAt(lineIndex, charIndex, 'fontSize') *\n this.lineHeight,\n leftOffset = boundaries.leftOffset,\n retinaScaling = this.getCanvasRetinaScaling(),\n upperCanvas = this.canvas.upperCanvasEl,\n upperCanvasWidth = upperCanvas.width / retinaScaling,\n upperCanvasHeight = upperCanvas.height / retinaScaling,\n maxWidth = upperCanvasWidth - charHeight,\n maxHeight = upperCanvasHeight - charHeight;\n\n const p = new Point(\n boundaries.left + leftOffset,\n boundaries.top + boundaries.topOffset + charHeight,\n )\n .transform(this.calcTransformMatrix())\n .transform(this.canvas.viewportTransform)\n .multiply(\n new Point(\n upperCanvas.clientWidth / upperCanvasWidth,\n upperCanvas.clientHeight / upperCanvasHeight,\n ),\n );\n\n if (p.x < 0) {\n p.x = 0;\n }\n if (p.x > maxWidth) {\n p.x = maxWidth;\n }\n if (p.y < 0) {\n p.y = 0;\n }\n if (p.y > maxHeight) {\n p.y = maxHeight;\n }\n\n // add canvas offset on document\n p.x += this.canvas._offset.left;\n p.y += this.canvas._offset.top;\n\n return {\n left: `${p.x}px`,\n top: `${p.y}px`,\n fontSize: `${charHeight}px`,\n charHeight: charHeight,\n };\n }\n\n /**\n * @private\n */\n _saveEditingProps() {\n this._savedProps = {\n hasControls: this.hasControls,\n borderColor: this.borderColor,\n lockMovementX: this.lockMovementX,\n lockMovementY: this.lockMovementY,\n hoverCursor: this.hoverCursor,\n selectable: this.selectable,\n defaultCursor: this.canvas && this.canvas.defaultCursor,\n moveCursor: this.canvas && this.canvas.moveCursor,\n };\n }\n\n /**\n * @private\n */\n _restoreEditingProps() {\n if (!this._savedProps) {\n return;\n }\n\n this.hoverCursor = this._savedProps.hoverCursor;\n this.hasControls = this._savedProps.hasControls;\n this.borderColor = this._savedProps.borderColor;\n this.selectable = this._savedProps.selectable;\n this.lockMovementX = this._savedProps.lockMovementX;\n this.lockMovementY = this._savedProps.lockMovementY;\n\n if (this.canvas) {\n this.canvas.defaultCursor =\n this._savedProps.defaultCursor || this.canvas.defaultCursor;\n this.canvas.moveCursor =\n this._savedProps.moveCursor || this.canvas.moveCursor;\n }\n\n delete this._savedProps;\n }\n\n /**\n * runs the actual logic that exits from editing state, see {@link exitEditing}\n * But it does not fire events\n */\n exitEditingImpl() {\n const hiddenTextarea = this.hiddenTextarea;\n this.selected = false;\n this.isEditing = false;\n\n if (hiddenTextarea) {\n hiddenTextarea.blur && hiddenTextarea.blur();\n hiddenTextarea.parentNode &&\n hiddenTextarea.parentNode.removeChild(hiddenTextarea);\n }\n this.hiddenTextarea = null;\n this.abortCursorAnimation();\n this.selectionStart !== this.selectionEnd && this.clearContextTop();\n this.selectionEnd = this.selectionStart;\n this._restoreEditingProps();\n if (this._forceClearCache) {\n this.initDimensions();\n this.setCoords();\n }\n }\n\n /**\n * Exits from editing state and fires relevant events\n */\n exitEditing() {\n const isTextChanged = this._textBeforeEdit !== this.text;\n this.exitEditingImpl();\n\n this.fire('editing:exited');\n isTextChanged && this.fire(MODIFIED);\n if (this.canvas) {\n this.canvas.fire('text:editing:exited', {\n target: this as unknown as IText,\n });\n // todo: evaluate add an action to this event\n isTextChanged && this.canvas.fire('object:modified', { target: this });\n }\n return this;\n }\n\n /**\n * @private\n */\n _removeExtraneousStyles() {\n for (const prop in this.styles) {\n if (!this._textLines[prop as unknown as number]) {\n delete this.styles[prop];\n }\n }\n }\n\n /**\n * remove and reflow a style block from start to end.\n * @param {Number} start linear start position for removal (included in removal)\n * @param {Number} end linear end position for removal ( excluded from removal )\n */\n removeStyleFromTo(start: number, end: number) {\n const { lineIndex: lineStart, charIndex: charStart } =\n this.get2DCursorLocation(start, true),\n { lineIndex: lineEnd, charIndex: charEnd } = this.get2DCursorLocation(\n end,\n true,\n );\n if (lineStart !== lineEnd) {\n // step1 remove the trailing of lineStart\n if (this.styles[lineStart]) {\n for (\n let i = charStart;\n i < this._unwrappedTextLines[lineStart].length;\n i++\n ) {\n delete this.styles[lineStart][i];\n }\n }\n // step2 move the trailing of lineEnd to lineStart if needed\n if (this.styles[lineEnd]) {\n for (\n let i = charEnd;\n i < this._unwrappedTextLines[lineEnd].length;\n i++\n ) {\n const styleObj = this.styles[lineEnd][i];\n if (styleObj) {\n this.styles[lineStart] || (this.styles[lineStart] = {});\n this.styles[lineStart][charStart + i - charEnd] = styleObj;\n }\n }\n }\n // step3 detects lines will be completely removed.\n for (let i = lineStart + 1; i <= lineEnd; i++) {\n delete this.styles[i];\n }\n // step4 shift remaining lines.\n this.shiftLineStyles(lineEnd, lineStart - lineEnd);\n } else {\n // remove and shift left on the same line\n if (this.styles[lineStart]) {\n const styleObj = this.styles[lineStart];\n const diff = charEnd - charStart;\n for (let i = charStart; i < charEnd; i++) {\n delete styleObj[i];\n }\n for (const char in this.styles[lineStart]) {\n const numericChar = parseInt(char, 10);\n if (numericChar >= charEnd) {\n styleObj[numericChar - diff] = styleObj[char];\n delete styleObj[char];\n }\n }\n }\n }\n }\n\n /**\n * Shifts line styles up or down\n * @param {Number} lineIndex Index of a line\n * @param {Number} offset Can any number?\n */\n shiftLineStyles(lineIndex: number, offset: number) {\n const clonedStyles = Object.assign({}, this.styles);\n for (const line in this.styles) {\n const numericLine = parseInt(line, 10);\n if (numericLine > lineIndex) {\n this.styles[numericLine + offset] = clonedStyles[numericLine];\n if (!clonedStyles[numericLine - offset]) {\n delete this.styles[numericLine];\n }\n }\n }\n }\n\n /**\n * Handle insertion of more consecutive style lines for when one or more\n * newlines gets added to the text. Since current style needs to be shifted\n * first we shift the current style of the number lines needed, then we add\n * new lines from the last to the first.\n * @param {Number} lineIndex Index of a line\n * @param {Number} charIndex Index of a char\n * @param {Number} qty number of lines to add\n * @param {Array} copiedStyle Array of objects styles\n */\n insertNewlineStyleObject(\n lineIndex: number,\n charIndex: number,\n qty: number,\n copiedStyle?: { [index: number]: TextStyleDeclaration },\n ) {\n const newLineStyles: { [index: number]: TextStyleDeclaration } = {};\n const originalLineLength = this._unwrappedTextLines[lineIndex].length;\n const isEndOfLine = originalLineLength === charIndex;\n\n let someStyleIsCarryingOver = false;\n qty || (qty = 1);\n this.shiftLineStyles(lineIndex, qty);\n const currentCharStyle = this.styles[lineIndex]\n ? this.styles[lineIndex][charIndex === 0 ? charIndex : charIndex - 1]\n : undefined;\n\n // we clone styles of all chars\n // after cursor onto the current line\n for (const index in this.styles[lineIndex]) {\n const numIndex = parseInt(index, 10);\n if (numIndex >= charIndex) {\n someStyleIsCarryingOver = true;\n newLineStyles[numIndex - charIndex] = this.styles[lineIndex][index];\n // remove lines from the previous line since they're on a new line now\n if (!(isEndOfLine && charIndex === 0)) {\n delete this.styles[lineIndex][index];\n }\n }\n }\n let styleCarriedOver = false;\n if (someStyleIsCarryingOver && !isEndOfLine) {\n // if is end of line, the extra style we copied\n // is probably not something we want\n this.styles[lineIndex + qty] = newLineStyles;\n styleCarriedOver = true;\n }\n if (styleCarriedOver || originalLineLength > charIndex) {\n // skip the last line of since we already prepared it.\n // or contains text without style that we don't want to style\n // just because it changed lines\n qty--;\n }\n // for the all the lines or all the other lines\n // we clone current char style onto the next (otherwise empty) line\n while (qty > 0) {\n if (copiedStyle && copiedStyle[qty - 1]) {\n this.styles[lineIndex + qty] = {\n 0: { ...copiedStyle[qty - 1] },\n };\n } else if (currentCharStyle) {\n this.styles[lineIndex + qty] = {\n 0: { ...currentCharStyle },\n };\n } else {\n delete this.styles[lineIndex + qty];\n }\n qty--;\n }\n this._forceClearCache = true;\n }\n\n /**\n * Inserts style object for a given line/char index\n * @param {Number} lineIndex Index of a line\n * @param {Number} charIndex Index of a char\n * @param {Number} quantity number Style object to insert, if given\n * @param {Array} copiedStyle array of style objects\n */\n insertCharStyleObject(\n lineIndex: number,\n charIndex: number,\n quantity: number,\n copiedStyle?: TextStyleDeclaration[],\n ) {\n if (!this.styles) {\n this.styles = {};\n }\n const currentLineStyles = this.styles[lineIndex],\n currentLineStylesCloned = currentLineStyles\n ? { ...currentLineStyles }\n : {};\n\n quantity || (quantity = 1);\n // shift all char styles by quantity forward\n // 0,1,2,3 -> (charIndex=2) -> 0,1,3,4 -> (insert 2) -> 0,1,2,3,4\n for (const index in currentLineStylesCloned) {\n const numericIndex = parseInt(index, 10);\n if (numericIndex >= charIndex) {\n currentLineStyles[numericIndex + quantity] =\n currentLineStylesCloned[numericIndex];\n // only delete the style if there was nothing moved there\n if (!currentLineStylesCloned[numericIndex - quantity]) {\n delete currentLineStyles[numericIndex];\n }\n }\n }\n this._forceClearCache = true;\n if (copiedStyle) {\n while (quantity--) {\n if (!Object.keys(copiedStyle[quantity]).length) {\n continue;\n }\n if (!this.styles[lineIndex]) {\n this.styles[lineIndex] = {};\n }\n this.styles[lineIndex][charIndex + quantity] = {\n ...copiedStyle[quantity],\n };\n }\n return;\n }\n if (!currentLineStyles) {\n return;\n }\n const newStyle = currentLineStyles[charIndex ? charIndex - 1 : 1];\n while (newStyle && quantity--) {\n this.styles[lineIndex][charIndex + quantity] = { ...newStyle };\n }\n }\n\n /**\n * Inserts style object(s)\n * @param {Array} insertedText Characters at the location where style is inserted\n * @param {Number} start cursor index for inserting style\n * @param {Array} [copiedStyle] array of style objects to insert.\n */\n insertNewStyleBlock(\n insertedText: string[],\n start: number,\n copiedStyle?: TextStyleDeclaration[],\n ) {\n const cursorLoc = this.get2DCursorLocation(start, true),\n addedLines = [0];\n let linesLength = 0;\n // get an array of how many char per lines are being added.\n for (let i = 0; i < insertedText.length; i++) {\n if (insertedText[i] === '\\n') {\n linesLength++;\n addedLines[linesLength] = 0;\n } else {\n addedLines[linesLength]++;\n }\n }\n // for the first line copy the style from the current char position.\n if (addedLines[0] > 0) {\n this.insertCharStyleObject(\n cursorLoc.lineIndex,\n cursorLoc.charIndex,\n addedLines[0],\n copiedStyle,\n );\n copiedStyle = copiedStyle && copiedStyle.slice(addedLines[0] + 1);\n }\n linesLength &&\n this.insertNewlineStyleObject(\n cursorLoc.lineIndex,\n cursorLoc.charIndex + addedLines[0],\n linesLength,\n );\n let i;\n for (i = 1; i < linesLength; i++) {\n if (addedLines[i] > 0) {\n this.insertCharStyleObject(\n cursorLoc.lineIndex + i,\n 0,\n addedLines[i],\n copiedStyle,\n );\n } else if (copiedStyle) {\n // this test is required in order to close #6841\n // when a pasted buffer begins with a newline then\n // this.styles[cursorLoc.lineIndex + i] and copiedStyle[0]\n // may be undefined for some reason\n if (this.styles[cursorLoc.lineIndex + i] && copiedStyle[0]) {\n this.styles[cursorLoc.lineIndex + i][0] = copiedStyle[0];\n }\n }\n copiedStyle = copiedStyle && copiedStyle.slice(addedLines[i] + 1);\n }\n if (addedLines[i] > 0) {\n this.insertCharStyleObject(\n cursorLoc.lineIndex + i,\n 0,\n addedLines[i],\n copiedStyle,\n );\n }\n }\n\n /**\n * Removes characters from start/end\n * start/end ar per grapheme position in _text array.\n *\n * @param {Number} start\n * @param {Number} end default to start + 1\n */\n removeChars(start: number, end: number = start + 1) {\n this.removeStyleFromTo(start, end);\n this._text.splice(start, end - start);\n this.text = this._text.join('');\n this.set('dirty', true);\n this.initDimensions();\n this.setCoords();\n this._removeExtraneousStyles();\n }\n\n /**\n * insert characters at start position, before start position.\n * start equal 1 it means the text get inserted between actual grapheme 0 and 1\n * if style array is provided, it must be as the same length of text in graphemes\n * if end is provided and is bigger than start, old text is replaced.\n * start/end ar per grapheme position in _text array.\n *\n * @param {String} text text to insert\n * @param {Array} style array of style objects\n * @param {Number} start\n * @param {Number} end default to start + 1\n */\n insertChars(\n text: string,\n style: TextStyleDeclaration[] | undefined,\n start: number,\n end: number = start,\n ) {\n if (end > start) {\n this.removeStyleFromTo(start, end);\n }\n const graphemes = this.graphemeSplit(text);\n this.insertNewStyleBlock(graphemes, start, style);\n this._text = [\n ...this._text.slice(0, start),\n ...graphemes,\n ...this._text.slice(end),\n ];\n this.text = this._text.join('');\n this.set('dirty', true);\n this.initDimensions();\n this.setCoords();\n this._removeExtraneousStyles();\n }\n\n /**\n * Set the selectionStart and selectionEnd according to the new position of cursor\n * mimic the key - mouse navigation when shift is pressed.\n */\n setSelectionStartEndWithShift(\n start: number,\n end: number,\n newSelection: number,\n ) {\n if (newSelection <= start) {\n if (end === start) {\n this._selectionDirection = LEFT;\n } else if (this._selectionDirection === RIGHT) {\n this._selectionDirection = LEFT;\n this.selectionEnd = start;\n }\n this.selectionStart = newSelection;\n } else if (newSelection > start && newSelection < end) {\n if (this._selectionDirection === RIGHT) {\n this.selectionEnd = newSelection;\n } else {\n this.selectionStart = newSelection;\n }\n } else {\n // newSelection is > selection start and end\n if (end === start) {\n this._selectionDirection = RIGHT;\n } else if (this._selectionDirection === LEFT) {\n this._selectionDirection = RIGHT;\n this.selectionStart = end;\n }\n this.selectionEnd = newSelection;\n }\n }\n}\n","import { config } from '../../config';\nimport { getFabricDocument, getEnv } from '../../env';\nimport { capValue } from '../../util/misc/capValue';\nimport type { ITextEvents } from './ITextBehavior';\nimport { ITextBehavior } from './ITextBehavior';\nimport type { TKeyMapIText } from './constants';\nimport type { TOptions } from '../../typedefs';\nimport type { TextProps, SerializedTextProps } from '../Text/Text';\nimport { getDocumentFromElement } from '../../util/dom_misc';\nimport { CHANGED, LEFT, RIGHT } from '../../constants';\nimport type { IText } from './IText';\nimport type { TextStyleDeclaration } from '../Text/StyledText';\n\nexport abstract class ITextKeyBehavior<\n Props extends TOptions = Partial,\n SProps extends SerializedTextProps = SerializedTextProps,\n EventSpec extends ITextEvents = ITextEvents,\n> extends ITextBehavior {\n /**\n * For functionalities on keyDown\n * Map a special key to a function of the instance/prototype\n * If you need different behavior for ESC or TAB or arrows, you have to change\n * this map setting the name of a function that you build on the IText or\n * your prototype.\n * the map change will affect all Instances unless you need for only some text Instances\n * in that case you have to clone this object and assign your Instance.\n * this.keysMap = Object.assign({}, this.keysMap);\n * The function must be in IText.prototype.myFunction And will receive event as args[0]\n */\n declare keysMap: TKeyMapIText;\n\n declare keysMapRtl: TKeyMapIText;\n\n /**\n * For functionalities on keyUp + ctrl || cmd\n */\n declare ctrlKeysMapUp: TKeyMapIText;\n\n /**\n * For functionalities on keyDown + ctrl || cmd\n */\n declare ctrlKeysMapDown: TKeyMapIText;\n\n declare hiddenTextarea: HTMLTextAreaElement | null;\n\n /**\n * DOM container to append the hiddenTextarea.\n * An alternative to attaching to the document.body.\n * Useful to reduce laggish redraw of the full document.body tree and\n * also with modals event capturing that won't let the textarea take focus.\n * @type HTMLElement\n */\n declare hiddenTextareaContainer?: HTMLElement | null;\n\n declare private _clickHandlerInitialized: boolean;\n declare private _copyDone: boolean;\n declare private fromPaste: boolean;\n\n /**\n * Initializes hidden textarea (needed to bring up keyboard in iOS)\n */\n initHiddenTextarea() {\n const doc =\n (this.canvas && getDocumentFromElement(this.canvas.getElement())) ||\n getFabricDocument();\n const textarea = doc.createElement('textarea');\n Object.entries({\n autocapitalize: 'off',\n autocorrect: 'off',\n autocomplete: 'off',\n spellcheck: 'false',\n 'data-fabric': 'textarea',\n wrap: 'off',\n }).map(([attribute, value]) => textarea.setAttribute(attribute, value));\n const { top, left, fontSize } = this._calcTextareaPosition();\n // line-height: 1px; was removed from the style to fix this:\n // https://bugs.chromium.org/p/chromium/issues/detail?id=870966\n textarea.style.cssText = `position: absolute; top: ${top}; left: ${left}; z-index: -999; opacity: 0; width: 1px; height: 1px; font-size: 1px; padding-top: ${fontSize};`;\n\n (this.hiddenTextareaContainer || doc.body).appendChild(textarea);\n\n Object.entries({\n blur: 'blur',\n keydown: 'onKeyDown',\n keyup: 'onKeyUp',\n input: 'onInput',\n copy: 'copy',\n cut: 'copy',\n paste: 'paste',\n compositionstart: 'onCompositionStart',\n compositionupdate: 'onCompositionUpdate',\n compositionend: 'onCompositionEnd',\n } as Record).map(([eventName, handler]) =>\n textarea.addEventListener(\n eventName,\n (this[handler] as EventListener).bind(this),\n ),\n );\n this.hiddenTextarea = textarea;\n }\n\n /**\n * Override this method to customize cursor behavior on textbox blur\n */\n blur() {\n this.abortCursorAnimation();\n }\n\n /**\n * Handles keydown event\n * only used for arrows and combination of modifier keys.\n * @param {KeyboardEvent} e Event object\n */\n onKeyDown(e: KeyboardEvent) {\n if (!this.isEditing) {\n return;\n }\n const keyMap = this.direction === 'rtl' ? this.keysMapRtl : this.keysMap;\n if (e.keyCode in keyMap) {\n (this[keyMap[e.keyCode] as keyof this] as (arg: KeyboardEvent) => void)(\n e,\n );\n } else if (e.keyCode in this.ctrlKeysMapDown && (e.ctrlKey || e.metaKey)) {\n (\n this[this.ctrlKeysMapDown[e.keyCode] as keyof this] as (\n arg: KeyboardEvent,\n ) => void\n )(e);\n } else {\n return;\n }\n e.stopImmediatePropagation();\n e.preventDefault();\n if (e.keyCode >= 33 && e.keyCode <= 40) {\n // if i press an arrow key just update selection\n this.inCompositionMode = false;\n this.clearContextTop();\n this.renderCursorOrSelection();\n } else {\n this.canvas && this.canvas.requestRenderAll();\n }\n }\n\n /**\n * Handles keyup event\n * We handle KeyUp because ie11 and edge have difficulties copy/pasting\n * if a copy/cut event fired, keyup is dismissed\n * @param {KeyboardEvent} e Event object\n */\n onKeyUp(e: KeyboardEvent) {\n if (!this.isEditing || this._copyDone || this.inCompositionMode) {\n this._copyDone = false;\n return;\n }\n if (e.keyCode in this.ctrlKeysMapUp && (e.ctrlKey || e.metaKey)) {\n (\n this[this.ctrlKeysMapUp[e.keyCode] as keyof this] as (\n arg: KeyboardEvent,\n ) => void\n )(e);\n } else {\n return;\n }\n e.stopImmediatePropagation();\n e.preventDefault();\n this.canvas && this.canvas.requestRenderAll();\n }\n\n /**\n * Handles onInput event\n * @param {Event} e Event object\n */\n onInput(this: this & { hiddenTextarea: HTMLTextAreaElement }, e: Event) {\n const fromPaste = this.fromPaste;\n const { value, selectionStart, selectionEnd } = this.hiddenTextarea;\n this.fromPaste = false;\n e && e.stopPropagation();\n if (!this.isEditing) {\n return;\n }\n const updateAndFire = () => {\n this.updateFromTextArea();\n this.fire(CHANGED);\n if (this.canvas) {\n this.canvas.fire('text:changed', { target: this as unknown as IText });\n this.canvas.requestRenderAll();\n }\n };\n if (this.hiddenTextarea.value === '') {\n this.styles = {};\n updateAndFire();\n return;\n }\n // decisions about style changes.\n const nextText = this._splitTextIntoLines(value).graphemeText,\n charCount = this._text.length,\n nextCharCount = nextText.length,\n _selectionStart = this.selectionStart,\n _selectionEnd = this.selectionEnd,\n selection = _selectionStart !== _selectionEnd;\n let copiedStyle: TextStyleDeclaration[] | undefined,\n removedText,\n charDiff = nextCharCount - charCount,\n removeFrom,\n removeTo;\n\n const textareaSelection = this.fromStringToGraphemeSelection(\n selectionStart,\n selectionEnd,\n value,\n );\n const backDelete = _selectionStart > textareaSelection.selectionStart;\n\n if (selection) {\n removedText = this._text.slice(_selectionStart, _selectionEnd);\n charDiff += _selectionEnd - _selectionStart;\n } else if (nextCharCount < charCount) {\n if (backDelete) {\n removedText = this._text.slice(_selectionEnd + charDiff, _selectionEnd);\n } else {\n removedText = this._text.slice(\n _selectionStart,\n _selectionStart - charDiff,\n );\n }\n }\n const insertedText = nextText.slice(\n textareaSelection.selectionEnd - charDiff,\n textareaSelection.selectionEnd,\n );\n if (removedText && removedText.length) {\n if (insertedText.length) {\n // let's copy some style before deleting.\n // we want to copy the style before the cursor OR the style at the cursor if selection\n // is bigger than 0.\n copiedStyle = this.getSelectionStyles(\n _selectionStart,\n _selectionStart + 1,\n false,\n );\n // now duplicate the style one for each inserted text.\n copiedStyle = insertedText.map(\n () =>\n // this return an array of references, but that is fine since we are\n // copying the style later.\n copiedStyle![0],\n );\n }\n if (selection) {\n removeFrom = _selectionStart;\n removeTo = _selectionEnd;\n } else if (backDelete) {\n // detect differences between forwardDelete and backDelete\n removeFrom = _selectionEnd - removedText.length;\n removeTo = _selectionEnd;\n } else {\n removeFrom = _selectionEnd;\n removeTo = _selectionEnd + removedText.length;\n }\n this.removeStyleFromTo(removeFrom, removeTo);\n }\n if (insertedText.length) {\n const { copyPasteData } = getEnv();\n if (\n fromPaste &&\n insertedText.join('') === copyPasteData.copiedText &&\n !config.disableStyleCopyPaste\n ) {\n copiedStyle = copyPasteData.copiedTextStyle;\n }\n this.insertNewStyleBlock(insertedText, _selectionStart, copiedStyle);\n }\n updateAndFire();\n }\n\n /**\n * Composition start\n */\n onCompositionStart() {\n this.inCompositionMode = true;\n }\n\n /**\n * Composition end\n */\n onCompositionEnd() {\n this.inCompositionMode = false;\n }\n\n onCompositionUpdate({ target }: CompositionEvent) {\n const { selectionStart, selectionEnd } = target as HTMLTextAreaElement;\n this.compositionStart = selectionStart;\n this.compositionEnd = selectionEnd;\n this.updateTextareaPosition();\n }\n\n /**\n * Copies selected text\n */\n copy() {\n if (this.selectionStart === this.selectionEnd) {\n //do not cut-copy if no selection\n return;\n }\n const { copyPasteData } = getEnv();\n copyPasteData.copiedText = this.getSelectedText();\n if (!config.disableStyleCopyPaste) {\n copyPasteData.copiedTextStyle = this.getSelectionStyles(\n this.selectionStart,\n this.selectionEnd,\n true,\n );\n } else {\n copyPasteData.copiedTextStyle = undefined;\n }\n this._copyDone = true;\n }\n\n /**\n * Pastes text\n */\n paste() {\n this.fromPaste = true;\n }\n\n /**\n * Finds the width in pixels before the cursor on the same line\n * @private\n * @param {Number} lineIndex\n * @param {Number} charIndex\n * @return {Number} widthBeforeCursor width before cursor\n */\n _getWidthBeforeCursor(lineIndex: number, charIndex: number): number {\n let widthBeforeCursor = this._getLineLeftOffset(lineIndex),\n bound;\n\n if (charIndex > 0) {\n bound = this.__charBounds[lineIndex][charIndex - 1];\n widthBeforeCursor += bound.left + bound.width;\n }\n return widthBeforeCursor;\n }\n\n /**\n * Gets start offset of a selection\n * @param {KeyboardEvent} e Event object\n * @param {Boolean} isRight\n * @return {Number}\n */\n getDownCursorOffset(e: KeyboardEvent, isRight: boolean): number {\n const selectionProp = this._getSelectionForOffset(e, isRight),\n cursorLocation = this.get2DCursorLocation(selectionProp),\n lineIndex = cursorLocation.lineIndex;\n // if on last line, down cursor goes to end of line\n if (\n lineIndex === this._textLines.length - 1 ||\n e.metaKey ||\n e.keyCode === 34\n ) {\n // move to the end of a text\n return this._text.length - selectionProp;\n }\n const charIndex = cursorLocation.charIndex,\n widthBeforeCursor = this._getWidthBeforeCursor(lineIndex, charIndex),\n indexOnOtherLine = this._getIndexOnLine(lineIndex + 1, widthBeforeCursor),\n textAfterCursor = this._textLines[lineIndex].slice(charIndex);\n return (\n textAfterCursor.length +\n indexOnOtherLine +\n 1 +\n this.missingNewlineOffset(lineIndex)\n );\n }\n\n /**\n * private\n * Helps finding if the offset should be counted from Start or End\n * @param {KeyboardEvent} e Event object\n * @param {Boolean} isRight\n * @return {Number}\n */\n _getSelectionForOffset(e: KeyboardEvent, isRight: boolean): number {\n if (e.shiftKey && this.selectionStart !== this.selectionEnd && isRight) {\n return this.selectionEnd;\n } else {\n return this.selectionStart;\n }\n }\n\n /**\n * @param {KeyboardEvent} e Event object\n * @param {Boolean} isRight\n * @return {Number}\n */\n getUpCursorOffset(e: KeyboardEvent, isRight: boolean): number {\n const selectionProp = this._getSelectionForOffset(e, isRight),\n cursorLocation = this.get2DCursorLocation(selectionProp),\n lineIndex = cursorLocation.lineIndex;\n if (lineIndex === 0 || e.metaKey || e.keyCode === 33) {\n // if on first line, up cursor goes to start of line\n return -selectionProp;\n }\n const charIndex = cursorLocation.charIndex,\n widthBeforeCursor = this._getWidthBeforeCursor(lineIndex, charIndex),\n indexOnOtherLine = this._getIndexOnLine(lineIndex - 1, widthBeforeCursor),\n textBeforeCursor = this._textLines[lineIndex].slice(0, charIndex),\n missingNewlineOffset = this.missingNewlineOffset(lineIndex - 1);\n // return a negative offset\n return (\n -this._textLines[lineIndex - 1].length +\n indexOnOtherLine -\n textBeforeCursor.length +\n (1 - missingNewlineOffset)\n );\n }\n\n /**\n * for a given width it founds the matching character.\n * @private\n */\n _getIndexOnLine(lineIndex: number, width: number) {\n const line = this._textLines[lineIndex],\n lineLeftOffset = this._getLineLeftOffset(lineIndex);\n let widthOfCharsOnLine = lineLeftOffset,\n indexOnLine = 0,\n charWidth,\n foundMatch;\n\n for (let j = 0, jlen = line.length; j < jlen; j++) {\n charWidth = this.__charBounds[lineIndex][j].width;\n widthOfCharsOnLine += charWidth;\n if (widthOfCharsOnLine > width) {\n foundMatch = true;\n const leftEdge = widthOfCharsOnLine - charWidth,\n rightEdge = widthOfCharsOnLine,\n offsetFromLeftEdge = Math.abs(leftEdge - width),\n offsetFromRightEdge = Math.abs(rightEdge - width);\n\n indexOnLine = offsetFromRightEdge < offsetFromLeftEdge ? j : j - 1;\n break;\n }\n }\n\n // reached end\n if (!foundMatch) {\n indexOnLine = line.length - 1;\n }\n\n return indexOnLine;\n }\n\n /**\n * Moves cursor down\n * @param {KeyboardEvent} e Event object\n */\n moveCursorDown(e: KeyboardEvent) {\n if (\n this.selectionStart >= this._text.length &&\n this.selectionEnd >= this._text.length\n ) {\n return;\n }\n this._moveCursorUpOrDown('Down', e);\n }\n\n /**\n * Moves cursor up\n * @param {KeyboardEvent} e Event object\n */\n moveCursorUp(e: KeyboardEvent) {\n if (this.selectionStart === 0 && this.selectionEnd === 0) {\n return;\n }\n this._moveCursorUpOrDown('Up', e);\n }\n\n /**\n * Moves cursor up or down, fires the events\n * @param {String} direction 'Up' or 'Down'\n * @param {KeyboardEvent} e Event object\n */\n _moveCursorUpOrDown(direction: 'Up' | 'Down', e: KeyboardEvent) {\n const offset = this[`get${direction}CursorOffset`](\n e,\n this._selectionDirection === RIGHT,\n );\n if (e.shiftKey) {\n this.moveCursorWithShift(offset);\n } else {\n this.moveCursorWithoutShift(offset);\n }\n if (offset !== 0) {\n const max = this.text.length;\n this.selectionStart = capValue(0, this.selectionStart, max);\n this.selectionEnd = capValue(0, this.selectionEnd, max);\n // TODO fix: abort and init should be an alternative depending\n // on selectionStart/End being equal or different\n this.abortCursorAnimation();\n this.initDelayedCursor();\n this._fireSelectionChanged();\n this._updateTextarea();\n }\n }\n\n /**\n * Moves cursor with shift\n * @param {Number} offset\n */\n moveCursorWithShift(offset: number) {\n const newSelection =\n this._selectionDirection === LEFT\n ? this.selectionStart + offset\n : this.selectionEnd + offset;\n this.setSelectionStartEndWithShift(\n this.selectionStart,\n this.selectionEnd,\n newSelection,\n );\n return offset !== 0;\n }\n\n /**\n * Moves cursor up without shift\n * @param {Number} offset\n */\n moveCursorWithoutShift(offset: number) {\n if (offset < 0) {\n this.selectionStart += offset;\n this.selectionEnd = this.selectionStart;\n } else {\n this.selectionEnd += offset;\n this.selectionStart = this.selectionEnd;\n }\n return offset !== 0;\n }\n\n /**\n * Moves cursor left\n * @param {KeyboardEvent} e Event object\n */\n moveCursorLeft(e: KeyboardEvent) {\n if (this.selectionStart === 0 && this.selectionEnd === 0) {\n return;\n }\n this._moveCursorLeftOrRight('Left', e);\n }\n\n /**\n * @private\n * @return {Boolean} true if a change happened\n *\n * @todo refactor not to use method name composition\n */\n _move(\n e: KeyboardEvent,\n prop: 'selectionStart' | 'selectionEnd',\n direction: 'Left' | 'Right',\n ): boolean {\n let newValue: number | undefined;\n if (e.altKey) {\n newValue = this[`findWordBoundary${direction}`](this[prop]);\n } else if (e.metaKey || e.keyCode === 35 || e.keyCode === 36) {\n newValue = this[`findLineBoundary${direction}`](this[prop]);\n } else {\n this[prop] += direction === 'Left' ? -1 : 1;\n return true;\n }\n if (typeof newValue !== 'undefined' && this[prop] !== newValue) {\n this[prop] = newValue;\n return true;\n }\n return false;\n }\n\n /**\n * @private\n */\n _moveLeft(e: KeyboardEvent, prop: 'selectionStart' | 'selectionEnd') {\n return this._move(e, prop, 'Left');\n }\n\n /**\n * @private\n */\n _moveRight(e: KeyboardEvent, prop: 'selectionStart' | 'selectionEnd') {\n return this._move(e, prop, 'Right');\n }\n\n /**\n * Moves cursor left without keeping selection\n * @param {KeyboardEvent} e\n */\n moveCursorLeftWithoutShift(e: KeyboardEvent) {\n let change = true;\n this._selectionDirection = LEFT;\n\n // only move cursor when there is no selection,\n // otherwise we discard it, and leave cursor on same place\n if (\n this.selectionEnd === this.selectionStart &&\n this.selectionStart !== 0\n ) {\n change = this._moveLeft(e, 'selectionStart');\n }\n this.selectionEnd = this.selectionStart;\n return change;\n }\n\n /**\n * Moves cursor left while keeping selection\n * @param {KeyboardEvent} e\n */\n moveCursorLeftWithShift(e: KeyboardEvent) {\n if (\n this._selectionDirection === RIGHT &&\n this.selectionStart !== this.selectionEnd\n ) {\n return this._moveLeft(e, 'selectionEnd');\n } else if (this.selectionStart !== 0) {\n this._selectionDirection = LEFT;\n return this._moveLeft(e, 'selectionStart');\n }\n }\n\n /**\n * Moves cursor right\n * @param {KeyboardEvent} e Event object\n */\n moveCursorRight(e: KeyboardEvent) {\n if (\n this.selectionStart >= this._text.length &&\n this.selectionEnd >= this._text.length\n ) {\n return;\n }\n this._moveCursorLeftOrRight('Right', e);\n }\n\n /**\n * Moves cursor right or Left, fires event\n * @param {String} direction 'Left', 'Right'\n * @param {KeyboardEvent} e Event object\n */\n _moveCursorLeftOrRight(direction: 'Left' | 'Right', e: KeyboardEvent) {\n const actionName = `moveCursor${direction}${\n e.shiftKey ? 'WithShift' : 'WithoutShift'\n }` as const;\n this._currentCursorOpacity = 1;\n if (this[actionName](e)) {\n // TODO fix: abort and init should be an alternative depending\n // on selectionStart/End being equal or different\n this.abortCursorAnimation();\n this.initDelayedCursor();\n this._fireSelectionChanged();\n this._updateTextarea();\n }\n }\n\n /**\n * Moves cursor right while keeping selection\n * @param {KeyboardEvent} e\n */\n moveCursorRightWithShift(e: KeyboardEvent) {\n if (\n this._selectionDirection === LEFT &&\n this.selectionStart !== this.selectionEnd\n ) {\n return this._moveRight(e, 'selectionStart');\n } else if (this.selectionEnd !== this._text.length) {\n this._selectionDirection = RIGHT;\n return this._moveRight(e, 'selectionEnd');\n }\n }\n\n /**\n * Moves cursor right without keeping selection\n * @param {KeyboardEvent} e Event object\n */\n moveCursorRightWithoutShift(e: KeyboardEvent) {\n let changed = true;\n this._selectionDirection = RIGHT;\n\n if (this.selectionStart === this.selectionEnd) {\n changed = this._moveRight(e, 'selectionStart');\n this.selectionEnd = this.selectionStart;\n } else {\n this.selectionStart = this.selectionEnd;\n }\n return changed;\n }\n}\n","import type {\n ObjectPointerEvents,\n TPointerEvent,\n TPointerEventInfo,\n} from '../../EventTypeDefs';\nimport { Point } from '../../Point';\nimport { invertTransform } from '../../util/misc/matrix';\nimport { DraggableTextDelegate } from './DraggableTextDelegate';\nimport type { ITextEvents } from './ITextBehavior';\nimport { ITextKeyBehavior } from './ITextKeyBehavior';\nimport type { TOptions } from '../../typedefs';\nimport type { TextProps, SerializedTextProps } from '../Text/Text';\nimport type { IText } from './IText';\n/**\n * `LEFT_CLICK === 0`\n */\nconst notALeftClick = (e: Event) => !!(e as MouseEvent).button;\n\nexport abstract class ITextClickBehavior<\n Props extends TOptions = Partial,\n SProps extends SerializedTextProps = SerializedTextProps,\n EventSpec extends ITextEvents = ITextEvents,\n> extends ITextKeyBehavior {\n protected draggableTextDelegate: DraggableTextDelegate;\n\n initBehavior() {\n // Initializes event handlers related to cursor or selection\n this.on('mousedown', this._mouseDownHandler);\n this.on('mouseup', this.mouseUpHandler);\n this.on('mousedblclick', this.doubleClickHandler);\n this.on('mousetripleclick', this.tripleClickHandler);\n\n this.draggableTextDelegate = new DraggableTextDelegate(\n this as unknown as IText,\n );\n\n super.initBehavior();\n }\n\n /**\n * If this method returns true a mouse move operation over a text selection\n * will not prevent the native mouse event allowing the browser to start a drag operation.\n * shouldStartDragging can be read 'do not prevent default for mouse move event'\n * To prevent drag and drop between objects both shouldStartDragging and onDragStart should return false\n * @returns\n */\n shouldStartDragging() {\n return this.draggableTextDelegate.isActive();\n }\n\n /**\n * @public override this method to control whether instance should/shouldn't become a drag source,\n * @see also {@link DraggableTextDelegate#isActive}\n * To prevent drag and drop between objects both shouldStartDragging and onDragStart should return false\n * @returns {boolean} should handle event\n */\n onDragStart(e: DragEvent) {\n return this.draggableTextDelegate.onDragStart(e);\n }\n\n /**\n * @public override this method to control whether instance should/shouldn't become a drop target\n */\n canDrop(e: DragEvent) {\n return this.draggableTextDelegate.canDrop(e);\n }\n\n /**\n * Default handler for double click, select a word\n */\n doubleClickHandler(options: TPointerEventInfo) {\n if (!this.isEditing) {\n return;\n }\n this.selectWord(this.getSelectionStartFromPointer(options.e));\n this.renderCursorOrSelection();\n }\n\n /**\n * Default handler for triple click, select a line\n */\n tripleClickHandler(options: TPointerEventInfo) {\n if (!this.isEditing) {\n return;\n }\n this.selectLine(this.getSelectionStartFromPointer(options.e));\n this.renderCursorOrSelection();\n }\n\n /**\n * Default event handler for the basic functionalities needed on _mouseDown\n * can be overridden to do something different.\n * Scope of this implementation is: find the click position, set selectionStart\n * find selectionEnd, initialize the drawing of either cursor or selection area\n * initializing a mousedDown on a text area will cancel fabricjs knowledge of\n * current compositionMode. It will be set to false.\n */\n _mouseDownHandler({ e, alreadySelected }: ObjectPointerEvents['mousedown']) {\n if (\n !this.canvas ||\n !this.editable ||\n notALeftClick(e) ||\n this.getActiveControl()\n ) {\n return;\n }\n\n if (this.draggableTextDelegate.start(e)) {\n return;\n }\n\n this.canvas.textEditingManager.register(this);\n\n if (alreadySelected) {\n this.inCompositionMode = false;\n this.setCursorByClick(e);\n }\n\n if (this.isEditing) {\n this.__selectionStartOnMouseDown = this.selectionStart;\n if (this.selectionStart === this.selectionEnd) {\n this.abortCursorAnimation();\n }\n this.renderCursorOrSelection();\n }\n this.selected ||= alreadySelected || this.isEditing;\n }\n\n /**\n * standard handler for mouse up, overridable\n * @private\n */\n mouseUpHandler({ e, transform }: ObjectPointerEvents['mouseup']) {\n const didDrag = this.draggableTextDelegate.end(e);\n\n if (this.canvas) {\n this.canvas.textEditingManager.unregister(this);\n\n const activeObject = this.canvas._activeObject;\n if (activeObject && activeObject !== this) {\n // avoid running this logic when there is an active object\n // this because is possible with shift click and fast clicks,\n // to rapidly deselect and reselect this object and trigger an enterEdit\n return;\n }\n }\n\n if (\n !this.editable ||\n (this.group && !this.group.interactive) ||\n (transform && transform.actionPerformed) ||\n notALeftClick(e) ||\n didDrag\n ) {\n return;\n }\n\n if (this.selected && !this.getActiveControl()) {\n this.enterEditing(e);\n if (this.selectionStart === this.selectionEnd) {\n this.initDelayedCursor(true);\n } else {\n this.renderCursorOrSelection();\n }\n }\n }\n\n /**\n * Changes cursor location in a text depending on passed pointer (x/y) object\n * @param {TPointerEvent} e Event object\n */\n setCursorByClick(e: TPointerEvent) {\n const newSelection = this.getSelectionStartFromPointer(e),\n start = this.selectionStart,\n end = this.selectionEnd;\n if (e.shiftKey) {\n this.setSelectionStartEndWithShift(start, end, newSelection);\n } else {\n this.selectionStart = newSelection;\n this.selectionEnd = newSelection;\n }\n if (this.isEditing) {\n this._fireSelectionChanged();\n this._updateTextarea();\n }\n }\n\n /**\n * Returns index of a character corresponding to where an object was clicked\n * @param {TPointerEvent} e Event object\n * @return {Number} Index of a character\n */\n getSelectionStartFromPointer(e: TPointerEvent): number {\n const mouseOffset = this.canvas!.getScenePoint(e)\n .transform(invertTransform(this.calcTransformMatrix()))\n .add(new Point(-this._getLeftOffset(), -this._getTopOffset()));\n let height = 0,\n charIndex = 0,\n lineIndex = 0;\n\n for (let i = 0; i < this._textLines.length; i++) {\n if (height <= mouseOffset.y) {\n height += this.getHeightOfLine(i);\n lineIndex = i;\n if (i > 0) {\n charIndex +=\n this._textLines[i - 1].length + this.missingNewlineOffset(i - 1);\n }\n } else {\n break;\n }\n }\n const lineLeftOffset = Math.abs(this._getLineLeftOffset(lineIndex));\n let width = lineLeftOffset;\n const charLength = this._textLines[lineIndex].length;\n const chars = this.__charBounds[lineIndex];\n for (let j = 0; j < charLength; j++) {\n // i removed something about flipX here, check.\n const charWidth = chars[j].kernedWidth;\n const widthAfter = width + charWidth;\n if (mouseOffset.x <= widthAfter) {\n // if the pointer is closer to the end of the char we increment charIndex\n // in order to position the cursor after the char\n if (\n Math.abs(mouseOffset.x - widthAfter) <=\n Math.abs(mouseOffset.x - width)\n ) {\n charIndex++;\n }\n break;\n }\n width = widthAfter;\n charIndex++;\n }\n\n return Math.min(\n // if object is horizontally flipped, mirror cursor location from the end\n this.flipX ? charLength - charIndex : charIndex,\n this._text.length,\n );\n }\n}\n","export type TKeyMapIText = Record<\n KeyboardEvent['keyCode'],\n CursorHandlingMethods\n>;\n\nexport type CursorHandlingMethods =\n | 'moveCursorUp'\n | 'moveCursorDown'\n | 'moveCursorLeft'\n | 'moveCursorRight'\n | 'exitEditing'\n | 'copy'\n | 'cut'\n | 'cmdAll';\n\nconst MOVE_CURSOR_UP: CursorHandlingMethods = 'moveCursorUp';\nconst MOVE_CURSOR_DOWN: CursorHandlingMethods = 'moveCursorDown';\nconst MOVE_CURSOR_LEFT: CursorHandlingMethods = 'moveCursorLeft';\nconst MOVE_CURSOR_RIGHT: CursorHandlingMethods = 'moveCursorRight';\nconst EXIT_EDITING: CursorHandlingMethods = 'exitEditing';\n\n// @TODO look into import { Key } from 'ts-key-enum';\n// and transition from keyCode to Key\n// also reduce string duplication\nexport const keysMap: TKeyMapIText = {\n 9: EXIT_EDITING,\n 27: EXIT_EDITING,\n 33: MOVE_CURSOR_UP,\n 34: MOVE_CURSOR_DOWN,\n 35: MOVE_CURSOR_RIGHT,\n 36: MOVE_CURSOR_LEFT,\n 37: MOVE_CURSOR_LEFT,\n 38: MOVE_CURSOR_UP,\n 39: MOVE_CURSOR_RIGHT,\n 40: MOVE_CURSOR_DOWN,\n};\n\nexport const keysMapRtl: TKeyMapIText = {\n 9: EXIT_EDITING,\n 27: EXIT_EDITING,\n 33: MOVE_CURSOR_UP,\n 34: MOVE_CURSOR_DOWN,\n 35: MOVE_CURSOR_LEFT,\n 36: MOVE_CURSOR_RIGHT,\n 37: MOVE_CURSOR_RIGHT,\n 38: MOVE_CURSOR_UP,\n 39: MOVE_CURSOR_LEFT,\n 40: MOVE_CURSOR_DOWN,\n};\n\n/**\n * For functionalities on keyUp + ctrl || cmd\n */\nexport const ctrlKeysMapUp: TKeyMapIText = {\n 67: 'copy',\n // there was a reason this wasn't deleted. for now leave it here\n 88: 'cut',\n};\n\n/**\n * For functionalities on keyDown + ctrl || cmd\n */\nexport const ctrlKeysMapDown: TKeyMapIText = {\n 65: 'cmdAll',\n};\n","import type { StaticCanvas } from '../../canvas/StaticCanvas';\n\n/**\n * Set the transform of the passed context to the same of a specific Canvas or StaticCanvas.\n * setTransform is used since this utility will RESET the ctx transform to the basic value\n * of retina scaling and viewport transform\n * It is not meant to be added to other transforms, it is used internally to preapre canvases to draw\n * @param ctx\n * @param canvas\n */\nexport const applyCanvasTransform = (\n ctx: CanvasRenderingContext2D,\n canvas: StaticCanvas,\n) => {\n const scale = canvas.getRetinaScaling();\n ctx.setTransform(scale, 0, 0, scale, 0, 0);\n const v = canvas.viewportTransform;\n ctx.transform(v[0], v[1], v[2], v[3], v[4], v[5]);\n};\n","import { Canvas } from '../../canvas/Canvas';\nimport type { ITextEvents } from './ITextBehavior';\nimport { ITextClickBehavior } from './ITextClickBehavior';\nimport {\n ctrlKeysMapDown,\n ctrlKeysMapUp,\n keysMap,\n keysMapRtl,\n} from './constants';\nimport type { TClassProperties, TFiller, TOptions } from '../../typedefs';\nimport { classRegistry } from '../../ClassRegistry';\nimport type { SerializedTextProps, TextProps } from '../Text/Text';\nimport {\n JUSTIFY,\n JUSTIFY_CENTER,\n JUSTIFY_LEFT,\n JUSTIFY_RIGHT,\n} from '../Text/constants';\nimport { CENTER, FILL, LEFT, RIGHT } from '../../constants';\nimport type { ObjectToCanvasElementOptions } from '../Object/Object';\nimport type { FabricObject } from '../Object/FabricObject';\nimport { createCanvasElementFor } from '../../util/misc/dom';\nimport { applyCanvasTransform } from '../../util/internals/applyCanvasTransform';\n\nexport type CursorBoundaries = {\n left: number;\n top: number;\n leftOffset: number;\n topOffset: number;\n};\n\nexport type CursorRenderingData = {\n color: string;\n opacity: number;\n left: number;\n top: number;\n width: number;\n height: number;\n};\n\n// Declare IText protected properties to workaround TS\nconst protectedDefaultValues = {\n _selectionDirection: null,\n _reSpace: /\\s|\\r?\\n/,\n inCompositionMode: false,\n};\n\nexport const iTextDefaultValues: Partial> = {\n selectionStart: 0,\n selectionEnd: 0,\n selectionColor: 'rgba(17,119,255,0.3)',\n isEditing: false,\n editable: true,\n editingBorderColor: 'rgba(102,153,255,0.25)',\n cursorWidth: 2,\n cursorColor: '',\n cursorDelay: 1000,\n cursorDuration: 600,\n caching: true,\n hiddenTextareaContainer: null,\n keysMap,\n keysMapRtl,\n ctrlKeysMapDown,\n ctrlKeysMapUp,\n ...protectedDefaultValues,\n};\n\n// @TODO this is not complete\ninterface UniqueITextProps {\n selectionStart: number;\n selectionEnd: number;\n}\n\nexport interface SerializedITextProps\n extends SerializedTextProps,\n UniqueITextProps {}\n\nexport interface ITextProps extends TextProps, UniqueITextProps {}\n\n/**\n * @fires changed\n * @fires selection:changed\n * @fires editing:entered\n * @fires editing:exited\n * @fires dragstart\n * @fires drag drag event firing on the drag source\n * @fires dragend\n * @fires copy\n * @fires cut\n * @fires paste\n *\n * #### Supported key combinations\n * ```\n * Move cursor: left, right, up, down\n * Select character: shift + left, shift + right\n * Select text vertically: shift + up, shift + down\n * Move cursor by word: alt + left, alt + right\n * Select words: shift + alt + left, shift + alt + right\n * Move cursor to line start/end: cmd + left, cmd + right or home, end\n * Select till start/end of line: cmd + shift + left, cmd + shift + right or shift + home, shift + end\n * Jump to start/end of text: cmd + up, cmd + down\n * Select till start/end of text: cmd + shift + up, cmd + shift + down or shift + pgUp, shift + pgDown\n * Delete character: backspace\n * Delete word: alt + backspace\n * Delete line: cmd + backspace\n * Forward delete: delete\n * Copy text: ctrl/cmd + c\n * Paste text: ctrl/cmd + v\n * Cut text: ctrl/cmd + x\n * Select entire text: ctrl/cmd + a\n * Quit editing tab or esc\n * ```\n *\n * #### Supported mouse/touch combination\n * ```\n * Position cursor: click/touch\n * Create selection: click/touch & drag\n * Create selection: click & shift + click\n * Select word: double click\n * Select line: triple click\n * ```\n */\nexport class IText<\n Props extends TOptions = Partial,\n SProps extends SerializedITextProps = SerializedITextProps,\n EventSpec extends ITextEvents = ITextEvents,\n >\n extends ITextClickBehavior\n implements UniqueITextProps\n{\n /**\n * Index where text selection starts (or where cursor is when there is no selection)\n * @type Number\n */\n declare selectionStart: number;\n\n /**\n * Index where text selection ends\n * @type Number\n */\n declare selectionEnd: number;\n\n declare compositionStart: number;\n\n declare compositionEnd: number;\n\n /**\n * Color of text selection\n * @type String\n */\n declare selectionColor: string;\n\n /**\n * Indicates whether text is in editing mode\n * @type Boolean\n */\n declare isEditing: boolean;\n\n /**\n * Indicates whether a text can be edited\n * @type Boolean\n */\n declare editable: boolean;\n\n /**\n * Border color of text object while it's in editing mode\n * @type String\n */\n declare editingBorderColor: string;\n\n /**\n * Width of cursor (in px)\n * @type Number\n */\n declare cursorWidth: number;\n\n /**\n * Color of text cursor color in editing mode.\n * if not set (default) will take color from the text.\n * if set to a color value that fabric can understand, it will\n * be used instead of the color of the text at the current position.\n * @type String\n */\n declare cursorColor: string;\n\n /**\n * Delay between cursor blink (in ms)\n * @type Number\n */\n declare cursorDelay: number;\n\n /**\n * Duration of cursor fade in (in ms)\n * @type Number\n */\n declare cursorDuration: number;\n\n declare compositionColor: string;\n\n /**\n * Indicates whether internal text char widths can be cached\n * @type Boolean\n */\n declare caching: boolean;\n\n static ownDefaults = iTextDefaultValues;\n\n static getDefaults(): Record {\n return { ...super.getDefaults(), ...IText.ownDefaults };\n }\n\n static type = 'IText';\n\n get type() {\n const type = super.type;\n // backward compatibility\n return type === 'itext' ? 'i-text' : type;\n }\n\n /**\n * Constructor\n * @param {String} text Text string\n * @param {Object} [options] Options object\n */\n constructor(text: string, options?: Props) {\n super(text, { ...IText.ownDefaults, ...options } as Props);\n this.initBehavior();\n }\n\n /**\n * While editing handle differently\n * @private\n * @param {string} key\n * @param {*} value\n */\n _set(key: string, value: any) {\n if (this.isEditing && this._savedProps && key in this._savedProps) {\n // @ts-expect-error irritating TS\n this._savedProps[key] = value;\n return this;\n }\n if (key === 'canvas') {\n this.canvas instanceof Canvas &&\n this.canvas.textEditingManager.remove(this);\n value instanceof Canvas && value.textEditingManager.add(this);\n }\n return super._set(key, value);\n }\n\n /**\n * Sets selection start (left boundary of a selection)\n * @param {Number} index Index to set selection start to\n */\n setSelectionStart(index: number) {\n index = Math.max(index, 0);\n this._updateAndFire('selectionStart', index);\n }\n\n /**\n * Sets selection end (right boundary of a selection)\n * @param {Number} index Index to set selection end to\n */\n setSelectionEnd(index: number) {\n index = Math.min(index, this.text.length);\n this._updateAndFire('selectionEnd', index);\n }\n\n /**\n * @private\n * @param {String} property 'selectionStart' or 'selectionEnd'\n * @param {Number} index new position of property\n */\n protected _updateAndFire(\n property: 'selectionStart' | 'selectionEnd',\n index: number,\n ) {\n if (this[property] !== index) {\n this._fireSelectionChanged();\n this[property] = index;\n }\n this._updateTextarea();\n }\n\n /**\n * Fires the even of selection changed\n * @private\n */\n _fireSelectionChanged() {\n this.fire('selection:changed');\n this.canvas && this.canvas.fire('text:selection:changed', { target: this });\n }\n\n /**\n * Initialize text dimensions. Render all text on given context\n * or on a offscreen canvas to get the text width with measureText.\n * Updates this.width and this.height with the proper values.\n * Does not return dimensions.\n * @private\n */\n initDimensions() {\n this.isEditing && this.initDelayedCursor();\n super.initDimensions();\n }\n\n /**\n * Gets style of a current selection/cursor (at the start position)\n * if startIndex or endIndex are not provided, selectionStart or selectionEnd will be used.\n * @param {Number} startIndex Start index to get styles at\n * @param {Number} endIndex End index to get styles at, if not specified selectionEnd or startIndex + 1\n * @param {Boolean} [complete] get full style or not\n * @return {Array} styles an array with one, zero or more Style objects\n */\n getSelectionStyles(\n startIndex: number = this.selectionStart || 0,\n endIndex: number = this.selectionEnd,\n complete?: boolean,\n ) {\n return super.getSelectionStyles(startIndex, endIndex, complete);\n }\n\n /**\n * Sets style of a current selection, if no selection exist, do not set anything.\n * @param {Object} [styles] Styles object\n * @param {Number} [startIndex] Start index to get styles at\n * @param {Number} [endIndex] End index to get styles at, if not specified selectionEnd or startIndex + 1\n */\n setSelectionStyles(\n styles: object,\n startIndex: number = this.selectionStart || 0,\n endIndex: number = this.selectionEnd,\n ) {\n return super.setSelectionStyles(styles, startIndex, endIndex);\n }\n\n /**\n * Returns 2d representation (lineIndex and charIndex) of cursor (or selection start)\n * @param {Number} [selectionStart] Optional index. When not given, current selectionStart is used.\n * @param {Boolean} [skipWrapping] consider the location for unwrapped lines. useful to manage styles.\n */\n get2DCursorLocation(\n selectionStart = this.selectionStart,\n skipWrapping?: boolean,\n ) {\n return super.get2DCursorLocation(selectionStart, skipWrapping);\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n render(ctx: CanvasRenderingContext2D) {\n super.render(ctx);\n // clear the cursorOffsetCache, so we ensure to calculate once per renderCursor\n // the correct position but not at every cursor animation.\n this.cursorOffsetCache = {};\n this.renderCursorOrSelection();\n }\n\n /**\n * @override block cursor/selection logic while rendering the exported canvas\n * @todo this workaround should be replaced with a more robust solution\n */\n toCanvasElement(options?: ObjectToCanvasElementOptions): HTMLCanvasElement {\n const isEditing = this.isEditing;\n this.isEditing = false;\n const canvas = super.toCanvasElement(options);\n this.isEditing = isEditing;\n return canvas;\n }\n\n /**\n * Renders cursor or selection (depending on what exists)\n * it does on the contextTop. If contextTop is not available, do nothing.\n */\n renderCursorOrSelection() {\n if (!this.isEditing || !this.canvas) {\n return;\n }\n const ctx = this.clearContextTop(true);\n if (!ctx) {\n return;\n }\n const boundaries = this._getCursorBoundaries();\n\n const ancestors = this.findAncestorsWithClipPath();\n const hasAncestorsWithClipping = ancestors.length > 0;\n let drawingCtx: CanvasRenderingContext2D = ctx;\n let drawingCanvas: HTMLCanvasElement | undefined = undefined;\n if (hasAncestorsWithClipping) {\n // we have some clipPath, we need to draw the selection on an intermediate layer.\n drawingCanvas = createCanvasElementFor(ctx.canvas);\n drawingCtx = drawingCanvas.getContext('2d')!;\n applyCanvasTransform(drawingCtx, this.canvas);\n const m = this.calcTransformMatrix();\n drawingCtx.transform(m[0], m[1], m[2], m[3], m[4], m[5]);\n }\n\n if (this.selectionStart === this.selectionEnd && !this.inCompositionMode) {\n this.renderCursor(drawingCtx, boundaries);\n } else {\n this.renderSelection(drawingCtx, boundaries);\n }\n\n if (hasAncestorsWithClipping) {\n // we need a neutral context.\n // this won't work for nested clippaths in which a clippath\n // has its own clippath\n for (const ancestor of ancestors) {\n const clipPath = ancestor.clipPath!;\n const clippingCanvas = createCanvasElementFor(ctx.canvas);\n const clippingCtx = clippingCanvas.getContext('2d')!;\n applyCanvasTransform(clippingCtx, this.canvas);\n // position the ctx in the center of the outer ancestor\n if (!clipPath.absolutePositioned) {\n const m = ancestor.calcTransformMatrix();\n clippingCtx.transform(m[0], m[1], m[2], m[3], m[4], m[5]);\n }\n clipPath.transform(clippingCtx);\n // we assign an empty drawing context, we don't plan to have this working for nested clippaths for now\n clipPath.drawObject(clippingCtx, true, {});\n this.drawClipPathOnCache(drawingCtx, clipPath, clippingCanvas);\n }\n }\n\n if (hasAncestorsWithClipping) {\n ctx.setTransform(1, 0, 0, 1, 0, 0);\n ctx.drawImage(drawingCanvas!, 0, 0);\n }\n\n this.canvas.contextTopDirty = true;\n ctx.restore();\n }\n\n /**\n * Finds and returns an array of clip paths that are applied to the parent\n * group(s) of the current FabricObject instance. The object's hierarchy is\n * traversed upwards (from the current object towards the root of the canvas),\n * checking each parent object for the presence of a `clipPath` that is not\n * absolutely positioned.\n */\n findAncestorsWithClipPath(): FabricObject[] {\n const clipPathAncestors: FabricObject[] = [];\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n let obj: FabricObject | undefined = this;\n while (obj) {\n if (obj.clipPath) {\n clipPathAncestors.push(obj);\n }\n obj = obj.parent;\n }\n\n return clipPathAncestors;\n }\n\n /**\n * Returns cursor boundaries (left, top, leftOffset, topOffset)\n * left/top are left/top of entire text box\n * leftOffset/topOffset are offset from that left/top point of a text box\n * @private\n * @param {number} [index] index from start\n * @param {boolean} [skipCaching]\n */\n _getCursorBoundaries(\n index: number = this.selectionStart,\n skipCaching?: boolean,\n ): CursorBoundaries {\n const left = this._getLeftOffset(),\n top = this._getTopOffset(),\n offsets = this._getCursorBoundariesOffsets(index, skipCaching);\n return {\n left: left,\n top: top,\n leftOffset: offsets.left,\n topOffset: offsets.top,\n };\n }\n\n /**\n * Caches and returns cursor left/top offset relative to instance's center point\n * @private\n * @param {number} index index from start\n * @param {boolean} [skipCaching]\n */\n _getCursorBoundariesOffsets(\n index: number,\n skipCaching?: boolean,\n ): { left: number; top: number } {\n if (skipCaching) {\n return this.__getCursorBoundariesOffsets(index);\n }\n if (this.cursorOffsetCache && 'top' in this.cursorOffsetCache) {\n return this.cursorOffsetCache as { left: number; top: number };\n }\n return (this.cursorOffsetCache = this.__getCursorBoundariesOffsets(index));\n }\n\n /**\n * Calculates cursor left/top offset relative to instance's center point\n * @private\n * @param {number} index index from start\n */\n __getCursorBoundariesOffsets(index: number) {\n let topOffset = 0,\n leftOffset = 0;\n const { charIndex, lineIndex } = this.get2DCursorLocation(index);\n\n for (let i = 0; i < lineIndex; i++) {\n topOffset += this.getHeightOfLine(i);\n }\n const lineLeftOffset = this._getLineLeftOffset(lineIndex);\n const bound = this.__charBounds[lineIndex][charIndex];\n bound && (leftOffset = bound.left);\n if (\n this.charSpacing !== 0 &&\n charIndex === this._textLines[lineIndex].length\n ) {\n leftOffset -= this._getWidthOfCharSpacing();\n }\n const boundaries = {\n top: topOffset,\n left: lineLeftOffset + (leftOffset > 0 ? leftOffset : 0),\n };\n if (this.direction === 'rtl') {\n if (\n this.textAlign === RIGHT ||\n this.textAlign === JUSTIFY ||\n this.textAlign === JUSTIFY_RIGHT\n ) {\n boundaries.left *= -1;\n } else if (this.textAlign === LEFT || this.textAlign === JUSTIFY_LEFT) {\n boundaries.left = lineLeftOffset - (leftOffset > 0 ? leftOffset : 0);\n } else if (\n this.textAlign === CENTER ||\n this.textAlign === JUSTIFY_CENTER\n ) {\n boundaries.left = lineLeftOffset - (leftOffset > 0 ? leftOffset : 0);\n }\n }\n return boundaries;\n }\n\n /**\n * Renders cursor on context Top, outside the animation cycle, on request\n * Used for the drag/drop effect.\n * If contextTop is not available, do nothing.\n */\n renderCursorAt(selectionStart: number) {\n this._renderCursor(\n this.canvas!.contextTop,\n this._getCursorBoundaries(selectionStart, true),\n selectionStart,\n );\n }\n\n /**\n * Renders cursor\n * @param {Object} boundaries\n * @param {CanvasRenderingContext2D} ctx transformed context to draw on\n */\n renderCursor(ctx: CanvasRenderingContext2D, boundaries: CursorBoundaries) {\n this._renderCursor(ctx, boundaries, this.selectionStart);\n }\n\n /**\n * Return the data needed to render the cursor for given selection start\n * The left,top are relative to the object, while width and height are prescaled\n * to look think with canvas zoom and object scaling,\n * so they depend on canvas and object scaling\n */\n getCursorRenderingData(\n selectionStart: number = this.selectionStart,\n boundaries: CursorBoundaries = this._getCursorBoundaries(selectionStart),\n ): CursorRenderingData {\n const cursorLocation = this.get2DCursorLocation(selectionStart),\n lineIndex = cursorLocation.lineIndex,\n charIndex =\n cursorLocation.charIndex > 0 ? cursorLocation.charIndex - 1 : 0,\n charHeight = this.getValueOfPropertyAt(lineIndex, charIndex, 'fontSize'),\n multiplier = this.getObjectScaling().x * this.canvas!.getZoom(),\n cursorWidth = this.cursorWidth / multiplier,\n dy = this.getValueOfPropertyAt(lineIndex, charIndex, 'deltaY'),\n topOffset =\n boundaries.topOffset +\n ((1 - this._fontSizeFraction) * this.getHeightOfLine(lineIndex)) /\n this.lineHeight -\n charHeight * (1 - this._fontSizeFraction);\n\n return {\n color:\n this.cursorColor ||\n (this.getValueOfPropertyAt(lineIndex, charIndex, 'fill') as string),\n opacity: this._currentCursorOpacity,\n left: boundaries.left + boundaries.leftOffset - cursorWidth / 2,\n top: topOffset + boundaries.top + dy,\n width: cursorWidth,\n height: charHeight,\n };\n }\n\n /**\n * Render the cursor at the given selectionStart.\n * @param {CanvasRenderingContext2D} ctx transformed context to draw on\n */\n _renderCursor(\n ctx: CanvasRenderingContext2D,\n boundaries: CursorBoundaries,\n selectionStart: number,\n ) {\n const { color, opacity, left, top, width, height } =\n this.getCursorRenderingData(selectionStart, boundaries);\n ctx.fillStyle = color;\n ctx.globalAlpha = opacity;\n ctx.fillRect(left, top, width, height);\n }\n\n /**\n * Renders text selection\n * @param {Object} boundaries Object with left/top/leftOffset/topOffset\n * @param {CanvasRenderingContext2D} ctx transformed context to draw on\n */\n renderSelection(ctx: CanvasRenderingContext2D, boundaries: CursorBoundaries) {\n const selection = {\n selectionStart: this.inCompositionMode\n ? this.hiddenTextarea!.selectionStart\n : this.selectionStart,\n selectionEnd: this.inCompositionMode\n ? this.hiddenTextarea!.selectionEnd\n : this.selectionEnd,\n };\n this._renderSelection(ctx, selection, boundaries);\n }\n\n /**\n * Renders drag start text selection\n */\n renderDragSourceEffect() {\n const dragStartSelection =\n this.draggableTextDelegate.getDragStartSelection()!;\n this._renderSelection(\n this.canvas!.contextTop,\n dragStartSelection,\n this._getCursorBoundaries(dragStartSelection.selectionStart, true),\n );\n }\n\n renderDropTargetEffect(e: DragEvent) {\n const dragSelection = this.getSelectionStartFromPointer(e);\n this.renderCursorAt(dragSelection);\n }\n\n /**\n * Renders text selection\n * @private\n * @param {{ selectionStart: number, selectionEnd: number }} selection\n * @param {Object} boundaries Object with left/top/leftOffset/topOffset\n * @param {CanvasRenderingContext2D} ctx transformed context to draw on\n */\n _renderSelection(\n ctx: CanvasRenderingContext2D,\n selection: { selectionStart: number; selectionEnd: number },\n boundaries: CursorBoundaries,\n ) {\n const selectionStart = selection.selectionStart,\n selectionEnd = selection.selectionEnd,\n isJustify = this.textAlign.includes(JUSTIFY),\n start = this.get2DCursorLocation(selectionStart),\n end = this.get2DCursorLocation(selectionEnd),\n startLine = start.lineIndex,\n endLine = end.lineIndex,\n startChar = start.charIndex < 0 ? 0 : start.charIndex,\n endChar = end.charIndex < 0 ? 0 : end.charIndex;\n\n for (let i = startLine; i <= endLine; i++) {\n const lineOffset = this._getLineLeftOffset(i) || 0;\n let lineHeight = this.getHeightOfLine(i),\n realLineHeight = 0,\n boxStart = 0,\n boxEnd = 0;\n\n if (i === startLine) {\n boxStart = this.__charBounds[startLine][startChar].left;\n }\n if (i >= startLine && i < endLine) {\n boxEnd =\n isJustify && !this.isEndOfWrapping(i)\n ? this.width\n : this.getLineWidth(i) || 5; // WTF is this 5?\n } else if (i === endLine) {\n if (endChar === 0) {\n boxEnd = this.__charBounds[endLine][endChar].left;\n } else {\n const charSpacing = this._getWidthOfCharSpacing();\n boxEnd =\n this.__charBounds[endLine][endChar - 1].left +\n this.__charBounds[endLine][endChar - 1].width -\n charSpacing;\n }\n }\n realLineHeight = lineHeight;\n if (this.lineHeight < 1 || (i === endLine && this.lineHeight > 1)) {\n lineHeight /= this.lineHeight;\n }\n let drawStart = boundaries.left + lineOffset + boxStart,\n drawHeight = lineHeight,\n extraTop = 0;\n const drawWidth = boxEnd - boxStart;\n if (this.inCompositionMode) {\n ctx.fillStyle = this.compositionColor || 'black';\n drawHeight = 1;\n extraTop = lineHeight;\n } else {\n ctx.fillStyle = this.selectionColor;\n }\n if (this.direction === 'rtl') {\n if (\n this.textAlign === RIGHT ||\n this.textAlign === JUSTIFY ||\n this.textAlign === JUSTIFY_RIGHT\n ) {\n drawStart = this.width - drawStart - drawWidth;\n } else if (this.textAlign === LEFT || this.textAlign === JUSTIFY_LEFT) {\n drawStart = boundaries.left + lineOffset - boxEnd;\n } else if (\n this.textAlign === CENTER ||\n this.textAlign === JUSTIFY_CENTER\n ) {\n drawStart = boundaries.left + lineOffset - boxEnd;\n }\n }\n ctx.fillRect(\n drawStart,\n boundaries.top + boundaries.topOffset + extraTop,\n drawWidth,\n drawHeight,\n );\n boundaries.topOffset += realLineHeight;\n }\n }\n\n /**\n * High level function to know the height of the cursor.\n * the currentChar is the one that precedes the cursor\n * Returns fontSize of char at the current cursor\n * Unused from the library, is for the end user\n * @return {Number} Character font size\n */\n getCurrentCharFontSize(): number {\n const cp = this._getCurrentCharIndex();\n return this.getValueOfPropertyAt(cp.l, cp.c, 'fontSize');\n }\n\n /**\n * High level function to know the color of the cursor.\n * the currentChar is the one that precedes the cursor\n * Returns color (fill) of char at the current cursor\n * if the text object has a pattern or gradient for filler, it will return that.\n * Unused by the library, is for the end user\n * @return {String | TFiller} Character color (fill)\n */\n getCurrentCharColor(): string | TFiller | null {\n const cp = this._getCurrentCharIndex();\n return this.getValueOfPropertyAt(cp.l, cp.c, FILL);\n }\n\n /**\n * Returns the cursor position for the getCurrent.. functions\n * @private\n */\n _getCurrentCharIndex() {\n const cursorPosition = this.get2DCursorLocation(this.selectionStart, true),\n charIndex =\n cursorPosition.charIndex > 0 ? cursorPosition.charIndex - 1 : 0;\n return { l: cursorPosition.lineIndex, c: charIndex };\n }\n\n dispose() {\n this.exitEditingImpl();\n this.draggableTextDelegate.dispose();\n super.dispose();\n }\n}\n\nclassRegistry.setClass(IText);\n// legacy\nclassRegistry.setClass(IText, 'i-text');\n","import type { TClassProperties, TOptions } from '../typedefs';\nimport { IText } from './IText/IText';\nimport { classRegistry } from '../ClassRegistry';\nimport { createTextboxDefaultControls } from '../controls/commonControls';\nimport { JUSTIFY } from './Text/constants';\nimport type { TextStyleDeclaration } from './Text/StyledText';\nimport type { SerializedITextProps, ITextProps } from './IText/IText';\nimport type { ITextEvents } from './IText/ITextBehavior';\nimport type { TextLinesInfo } from './Text/Text';\nimport type { Control } from '../controls/Control';\n\n// @TODO: Many things here are configuration related and shouldn't be on the class nor prototype\n// regexes, list of properties that are not suppose to change by instances, magic consts.\n// this will be a separated effort\nexport const textboxDefaultValues: Partial> = {\n minWidth: 20,\n dynamicMinWidth: 2,\n lockScalingFlip: true,\n noScaleCache: false,\n _wordJoiners: /[ \\t\\r]/,\n splitByGrapheme: false,\n};\n\nexport type GraphemeData = {\n wordsData: {\n word: string[];\n width: number;\n }[][];\n largestWordWidth: number;\n};\n\nexport type StyleMap = Record;\n\n// @TODO this is not complete\ninterface UniqueTextboxProps {\n minWidth: number;\n splitByGrapheme: boolean;\n dynamicMinWidth: number;\n _wordJoiners: RegExp;\n}\n\nexport interface SerializedTextboxProps\n extends SerializedITextProps,\n Pick {}\n\nexport interface TextboxProps extends ITextProps, UniqueTextboxProps {}\n\n/**\n * Textbox class, based on IText, allows the user to resize the text rectangle\n * and wraps lines automatically. Textboxes have their Y scaling locked, the\n * user can only change width. Height is adjusted automatically based on the\n * wrapping of lines.\n */\nexport class Textbox<\n Props extends TOptions = Partial,\n SProps extends SerializedTextboxProps = SerializedTextboxProps,\n EventSpec extends ITextEvents = ITextEvents,\n >\n extends IText\n implements UniqueTextboxProps\n{\n /**\n * Minimum width of textbox, in pixels.\n * @type Number\n */\n declare minWidth: number;\n\n /**\n * Minimum calculated width of a textbox, in pixels.\n * fixed to 2 so that an empty textbox cannot go to 0\n * and is still selectable without text.\n * @type Number\n */\n declare dynamicMinWidth: number;\n\n /**\n * Use this boolean property in order to split strings that have no white space concept.\n * this is a cheap way to help with chinese/japanese\n * @type Boolean\n * @since 2.6.0\n */\n declare splitByGrapheme: boolean;\n\n declare _wordJoiners: RegExp;\n\n declare _styleMap: StyleMap;\n\n declare isWrapping: boolean;\n\n static type = 'Textbox';\n\n static textLayoutProperties = [...IText.textLayoutProperties, 'width'];\n\n static ownDefaults = textboxDefaultValues;\n\n static getDefaults(): Record {\n return {\n ...super.getDefaults(),\n ...Textbox.ownDefaults,\n };\n }\n\n /**\n * Constructor\n * @param {String} text Text string\n * @param {Object} [options] Options object\n */\n constructor(text: string, options?: Props) {\n super(text, { ...Textbox.ownDefaults, ...options } as Props);\n }\n\n /**\n * Creates the default control object.\n * If you prefer to have on instance of controls shared among all objects\n * make this function return an empty object and add controls to the ownDefaults object\n */\n static createControls(): { controls: Record } {\n return { controls: createTextboxDefaultControls() };\n }\n\n /**\n * Unlike superclass's version of this function, Textbox does not update\n * its width.\n * @private\n * @override\n */\n initDimensions() {\n if (!this.initialized) {\n return;\n }\n this.isEditing && this.initDelayedCursor();\n this._clearCache();\n // clear dynamicMinWidth as it will be different after we re-wrap line\n this.dynamicMinWidth = 0;\n // wrap lines\n this._styleMap = this._generateStyleMap(this._splitText());\n // if after wrapping, the width is smaller than dynamicMinWidth, change the width and re-wrap\n if (this.dynamicMinWidth > this.width) {\n this._set('width', this.dynamicMinWidth);\n }\n if (this.textAlign.includes(JUSTIFY)) {\n // once text is measured we need to make space fatter to make justified text.\n this.enlargeSpaces();\n }\n // clear cache and re-calculate height\n this.height = this.calcTextHeight();\n }\n\n /**\n * Generate an object that translates the style object so that it is\n * broken up by visual lines (new lines and automatic wrapping).\n * The original text styles object is broken up by actual lines (new lines only),\n * which is only sufficient for Text / IText\n * @private\n */\n _generateStyleMap(textInfo: TextLinesInfo): StyleMap {\n let realLineCount = 0,\n realLineCharCount = 0,\n charCount = 0;\n const map: StyleMap = {};\n\n for (let i = 0; i < textInfo.graphemeLines.length; i++) {\n if (textInfo.graphemeText[charCount] === '\\n' && i > 0) {\n realLineCharCount = 0;\n charCount++;\n realLineCount++;\n } else if (\n !this.splitByGrapheme &&\n this._reSpaceAndTab.test(textInfo.graphemeText[charCount]) &&\n i > 0\n ) {\n // this case deals with space's that are removed from end of lines when wrapping\n realLineCharCount++;\n charCount++;\n }\n\n map[i] = { line: realLineCount, offset: realLineCharCount };\n\n charCount += textInfo.graphemeLines[i].length;\n realLineCharCount += textInfo.graphemeLines[i].length;\n }\n\n return map;\n }\n\n /**\n * Returns true if object has a style property or has it on a specified line\n * @param {Number} lineIndex\n * @return {Boolean}\n */\n styleHas(property: keyof TextStyleDeclaration, lineIndex: number): boolean {\n if (this._styleMap && !this.isWrapping) {\n const map = this._styleMap[lineIndex];\n if (map) {\n lineIndex = map.line;\n }\n }\n return super.styleHas(property, lineIndex);\n }\n\n /**\n * Returns true if object has no styling or no styling in a line\n * @param {Number} lineIndex , lineIndex is on wrapped lines.\n * @return {Boolean}\n */\n isEmptyStyles(lineIndex: number): boolean {\n if (!this.styles) {\n return true;\n }\n let offset = 0,\n nextLineIndex = lineIndex + 1,\n nextOffset: number,\n shouldLimit = false;\n const map = this._styleMap[lineIndex],\n mapNextLine = this._styleMap[lineIndex + 1];\n if (map) {\n lineIndex = map.line;\n offset = map.offset;\n }\n if (mapNextLine) {\n nextLineIndex = mapNextLine.line;\n shouldLimit = nextLineIndex === lineIndex;\n nextOffset = mapNextLine.offset;\n }\n const obj =\n typeof lineIndex === 'undefined'\n ? this.styles\n : { line: this.styles[lineIndex] };\n for (const p1 in obj) {\n for (const p2 in obj[p1]) {\n const p2Number = parseInt(p2, 10);\n if (p2Number >= offset && (!shouldLimit || p2Number < nextOffset!)) {\n for (const p3 in obj[p1][p2]) {\n return false;\n }\n }\n }\n }\n return true;\n }\n\n /**\n * @protected\n * @param {Number} lineIndex\n * @param {Number} charIndex\n * @return {TextStyleDeclaration} a style object reference to the existing one or a new empty object when undefined\n */\n _getStyleDeclaration(\n lineIndex: number,\n charIndex: number,\n ): TextStyleDeclaration {\n if (this._styleMap && !this.isWrapping) {\n const map = this._styleMap[lineIndex];\n if (!map) {\n return {};\n }\n lineIndex = map.line;\n charIndex = map.offset + charIndex;\n }\n return super._getStyleDeclaration(lineIndex, charIndex);\n }\n\n /**\n * @param {Number} lineIndex\n * @param {Number} charIndex\n * @param {Object} style\n * @private\n */\n protected _setStyleDeclaration(\n lineIndex: number,\n charIndex: number,\n style: object,\n ) {\n const map = this._styleMap[lineIndex];\n super._setStyleDeclaration(map.line, map.offset + charIndex, style);\n }\n\n /**\n * @param {Number} lineIndex\n * @param {Number} charIndex\n * @private\n */\n protected _deleteStyleDeclaration(lineIndex: number, charIndex: number) {\n const map = this._styleMap[lineIndex];\n super._deleteStyleDeclaration(map.line, map.offset + charIndex);\n }\n\n /**\n * probably broken need a fix\n * Returns the real style line that correspond to the wrapped lineIndex line\n * Used just to verify if the line does exist or not.\n * @param {Number} lineIndex\n * @returns {Boolean} if the line exists or not\n * @private\n */\n protected _getLineStyle(lineIndex: number): boolean {\n const map = this._styleMap[lineIndex];\n return !!this.styles[map.line];\n }\n\n /**\n * Set the line style to an empty object so that is initialized\n * @param {Number} lineIndex\n * @param {Object} style\n * @private\n */\n protected _setLineStyle(lineIndex: number) {\n const map = this._styleMap[lineIndex];\n super._setLineStyle(map.line);\n }\n\n /**\n * Wraps text using the 'width' property of Textbox. First this function\n * splits text on newlines, so we preserve newlines entered by the user.\n * Then it wraps each line using the width of the Textbox by calling\n * _wrapLine().\n * @param {Array} lines The string array of text that is split into lines\n * @param {Number} desiredWidth width you want to wrap to\n * @returns {Array} Array of lines\n */\n _wrapText(lines: string[], desiredWidth: number): string[][] {\n this.isWrapping = true;\n // extract all thewords and the widths to optimally wrap lines.\n const data = this.getGraphemeDataForRender(lines);\n const wrapped: string[][] = [];\n for (let i = 0; i < data.wordsData.length; i++) {\n wrapped.push(...this._wrapLine(i, desiredWidth, data));\n }\n this.isWrapping = false;\n return wrapped;\n }\n\n /**\n * For each line of text terminated by an hard line stop,\n * measure each word width and extract the largest word from all.\n * The returned words here are the one that at the end will be rendered.\n * @param {string[]} lines the lines we need to measure\n *\n */\n getGraphemeDataForRender(lines: string[]): GraphemeData {\n const splitByGrapheme = this.splitByGrapheme,\n infix = splitByGrapheme ? '' : ' ';\n\n let largestWordWidth = 0;\n\n const data = lines.map((line, lineIndex) => {\n let offset = 0;\n const wordsOrGraphemes = splitByGrapheme\n ? this.graphemeSplit(line)\n : this.wordSplit(line);\n\n if (wordsOrGraphemes.length === 0) {\n return [{ word: [], width: 0 }];\n }\n\n return wordsOrGraphemes.map((word: string) => {\n // if using splitByGrapheme words are already in graphemes.\n const graphemeArray = splitByGrapheme\n ? [word]\n : this.graphemeSplit(word);\n const width = this._measureWord(graphemeArray, lineIndex, offset);\n largestWordWidth = Math.max(width, largestWordWidth);\n offset += graphemeArray.length + infix.length;\n return { word: graphemeArray, width };\n });\n });\n\n return {\n wordsData: data,\n largestWordWidth,\n };\n }\n\n /**\n * Helper function to measure a string of text, given its lineIndex and charIndex offset\n * It gets called when charBounds are not available yet.\n * Override if necessary\n * Use with {@link Textbox#wordSplit}\n *\n * @param {CanvasRenderingContext2D} ctx\n * @param {String} text\n * @param {number} lineIndex\n * @param {number} charOffset\n * @returns {number}\n */\n _measureWord(word: string[], lineIndex: number, charOffset = 0): number {\n let width = 0,\n prevGrapheme;\n const skipLeft = true;\n for (let i = 0, len = word.length; i < len; i++) {\n const box = this._getGraphemeBox(\n word[i],\n lineIndex,\n i + charOffset,\n prevGrapheme,\n skipLeft,\n );\n width += box.kernedWidth;\n prevGrapheme = word[i];\n }\n return width;\n }\n\n /**\n * Override this method to customize word splitting\n * Use with {@link Textbox#_measureWord}\n * @param {string} value\n * @returns {string[]} array of words\n */\n wordSplit(value: string): string[] {\n return value.split(this._wordJoiners);\n }\n\n /**\n * Wraps a line of text using the width of the Textbox as desiredWidth\n * and leveraging the known width o words from GraphemeData\n * @private\n * @param {Number} lineIndex\n * @param {Number} desiredWidth width you want to wrap the line to\n * @param {GraphemeData} graphemeData an object containing all the lines' words width.\n * @param {Number} reservedSpace space to remove from wrapping for custom functionalities\n * @returns {Array} Array of line(s) into which the given text is wrapped\n * to.\n */\n _wrapLine(\n lineIndex: number,\n desiredWidth: number,\n { largestWordWidth, wordsData }: GraphemeData,\n reservedSpace = 0,\n ): string[][] {\n const additionalSpace = this._getWidthOfCharSpacing(),\n splitByGrapheme = this.splitByGrapheme,\n graphemeLines = [],\n infix = splitByGrapheme ? '' : ' ';\n\n let lineWidth = 0,\n line: string[] = [],\n // spaces in different languages?\n offset = 0,\n infixWidth = 0,\n lineJustStarted = true;\n\n desiredWidth -= reservedSpace;\n\n const maxWidth = Math.max(\n desiredWidth,\n largestWordWidth,\n this.dynamicMinWidth,\n );\n // layout words\n const data = wordsData[lineIndex];\n offset = 0;\n let i;\n for (i = 0; i < data.length; i++) {\n const { word, width: wordWidth } = data[i];\n offset += word.length;\n\n lineWidth += infixWidth + wordWidth - additionalSpace;\n if (lineWidth > maxWidth && !lineJustStarted) {\n graphemeLines.push(line);\n line = [];\n lineWidth = wordWidth;\n lineJustStarted = true;\n } else {\n lineWidth += additionalSpace;\n }\n\n if (!lineJustStarted && !splitByGrapheme) {\n line.push(infix);\n }\n line = line.concat(word);\n\n infixWidth = splitByGrapheme\n ? 0\n : this._measureWord([infix], lineIndex, offset);\n offset++;\n lineJustStarted = false;\n }\n\n i && graphemeLines.push(line);\n\n // TODO: this code is probably not necessary anymore.\n // it can be moved out of this function since largestWordWidth is now\n // known in advance\n if (largestWordWidth + reservedSpace > this.dynamicMinWidth) {\n this.dynamicMinWidth = largestWordWidth - additionalSpace + reservedSpace;\n }\n return graphemeLines;\n }\n\n /**\n * Detect if the text line is ended with an hard break\n * text and itext do not have wrapping, return false\n * @param {Number} lineIndex text to split\n * @return {Boolean}\n */\n isEndOfWrapping(lineIndex: number): boolean {\n if (!this._styleMap[lineIndex + 1]) {\n // is last line, return true;\n return true;\n }\n if (this._styleMap[lineIndex + 1].line !== this._styleMap[lineIndex].line) {\n // this is last line before a line break, return true;\n return true;\n }\n return false;\n }\n\n /**\n * Detect if a line has a linebreak and so we need to account for it when moving\n * and counting style.\n * This is important only for splitByGrapheme at the end of wrapping.\n * If we are not wrapping the offset is always 1\n * @return Number\n */\n missingNewlineOffset(lineIndex: number, skipWrapping?: boolean): 0 | 1 {\n if (this.splitByGrapheme && !skipWrapping) {\n return this.isEndOfWrapping(lineIndex) ? 1 : 0;\n }\n return 1;\n }\n\n /**\n * Gets lines of text to render in the Textbox. This function calculates\n * text wrapping on the fly every time it is called.\n * @param {String} text text to split\n * @returns {Array} Array of lines in the Textbox.\n * @override\n */\n _splitTextIntoLines(text: string) {\n const newText = super._splitTextIntoLines(text),\n graphemeLines = this._wrapText(newText.lines, this.width),\n lines = new Array(graphemeLines.length);\n for (let i = 0; i < graphemeLines.length; i++) {\n lines[i] = graphemeLines[i].join('');\n }\n newText.lines = lines;\n newText.graphemeLines = graphemeLines;\n return newText;\n }\n\n getMinWidth() {\n return Math.max(this.minWidth, this.dynamicMinWidth);\n }\n\n _removeExtraneousStyles() {\n const linesToKeep = new Map();\n for (const prop in this._styleMap) {\n const propNumber = parseInt(prop, 10);\n if (this._textLines[propNumber]) {\n const lineIndex = this._styleMap[prop].line;\n linesToKeep.set(`${lineIndex}`, true);\n }\n }\n for (const prop in this.styles) {\n if (!linesToKeep.has(prop)) {\n delete this.styles[prop];\n }\n }\n }\n\n /**\n * Returns object representation of an instance\n * @method toObject\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} object representation of an instance\n */\n toObject<\n T extends Omit, keyof SProps>,\n K extends keyof T = never,\n >(propertiesToInclude: K[] = []): Pick & SProps {\n return super.toObject([\n 'minWidth',\n 'splitByGrapheme',\n ...propertiesToInclude,\n ] as K[]);\n }\n}\n\nclassRegistry.setClass(Textbox);\n","import { Point } from '../../Point';\nimport type { FabricObject } from '../../shapes/Object/FabricObject';\nimport { makeBoundingBoxFromPoints } from '../../util/misc/boundingBoxFromPoints';\nimport { sendPointToPlane } from '../../util/misc/planeChange';\nimport type { LayoutStrategyResult, StrictLayoutContext } from '../types';\nimport { LayoutStrategy } from './LayoutStrategy';\nimport { getObjectBounds } from './utils';\nimport { classRegistry } from '../../ClassRegistry';\n\n/**\n * Layout will adjust the bounding box to match the clip path bounding box.\n */\nexport class ClipPathLayout extends LayoutStrategy {\n static readonly type = 'clip-path';\n\n shouldPerformLayout(context: StrictLayoutContext): boolean {\n return !!context.target.clipPath && super.shouldPerformLayout(context);\n }\n\n shouldLayoutClipPath() {\n return false;\n }\n\n calcLayoutResult(\n context: StrictLayoutContext,\n objects: FabricObject[],\n ): LayoutStrategyResult | undefined {\n const { target } = context;\n const { clipPath, group } = target;\n if (!clipPath || !this.shouldPerformLayout(context)) {\n return;\n }\n // TODO: remove stroke calculation from this case\n const { width, height } = makeBoundingBoxFromPoints(\n getObjectBounds(target, clipPath as FabricObject),\n );\n const size = new Point(width, height);\n if (clipPath.absolutePositioned) {\n // we want the center point to exist in group's containing plane\n const clipPathCenter = sendPointToPlane(\n clipPath.getRelativeCenterPoint(),\n undefined,\n group ? group.calcTransformMatrix() : undefined,\n );\n return {\n center: clipPathCenter,\n size,\n };\n } else {\n // we want the center point to exist in group's containing plane, so we send it upwards\n const clipPathCenter = clipPath\n .getRelativeCenterPoint()\n .transform(target.calcOwnMatrix(), true);\n if (this.shouldPerformLayout(context)) {\n // the clip path is positioned relative to the group's center which is affected by the bbox\n // so we first calculate the bbox\n const { center = new Point(), correction = new Point() } =\n this.calcBoundingBox(objects, context) || {};\n return {\n center: center.add(clipPathCenter),\n correction: correction.subtract(clipPathCenter),\n size,\n };\n } else {\n return {\n center: target.getRelativeCenterPoint().add(clipPathCenter),\n size,\n };\n }\n }\n }\n}\n\nclassRegistry.setClass(ClipPathLayout);\n","import { Point } from '../../Point';\nimport type {\n InitializationLayoutContext,\n LayoutStrategyResult,\n StrictLayoutContext,\n} from '../types';\nimport { LayoutStrategy } from './LayoutStrategy';\nimport { classRegistry } from '../../ClassRegistry';\n\n/**\n * Layout will keep target's initial size.\n */\nexport class FixedLayout extends LayoutStrategy {\n static readonly type = 'fixed';\n\n /**\n * @override respect target's initial size\n */\n getInitialSize(\n { target }: StrictLayoutContext & InitializationLayoutContext,\n { size }: Pick,\n ): Point {\n return new Point(target.width || size.x, target.height || size.y);\n }\n}\n\nclassRegistry.setClass(FixedLayout);\n","import { LayoutManager } from './LayoutManager';\nimport type { RegistrationContext, StrictLayoutContext } from './types';\nimport type { Group } from '../shapes/Group';\n\n/**\n * Today the LayoutManager class also takes care of subscribing event handlers\n * to update the group layout when the group is interactive and a transform is applied\n * to a child object.\n * The ActiveSelection is never interactive, but it could contain objects from\n * groups that are.\n * The standard LayoutManager would subscribe the children of the activeSelection to\n * perform layout changes to the active selection itself, what we need instead is that\n * the transformation applied to the active selection will trigger changes to the\n * original group of the children ( the one referenced under the parent property )\n * This subclass of the LayoutManager has a single duty to fill the gap of this difference.`\n */\nexport class ActiveSelectionLayoutManager extends LayoutManager {\n subscribeTargets(\n context: RegistrationContext & Partial,\n ): void {\n const activeSelection = context.target;\n const parents = context.targets.reduce((parents, target) => {\n target.parent && parents.add(target.parent);\n return parents;\n }, new Set());\n parents.forEach((parent) => {\n parent.layoutManager.subscribeTargets({\n target: parent,\n targets: [activeSelection],\n });\n });\n }\n\n /**\n * unsubscribe from parent only if all its children were deselected\n */\n unsubscribeTargets(\n context: RegistrationContext & Partial,\n ): void {\n const activeSelection = context.target;\n const selectedObjects = activeSelection.getObjects();\n const parents = context.targets.reduce((parents, target) => {\n target.parent && parents.add(target.parent);\n return parents;\n }, new Set());\n parents.forEach((parent) => {\n !selectedObjects.some((object) => object.parent === parent) &&\n parent.layoutManager.unsubscribeTargets({\n target: parent,\n targets: [activeSelection],\n });\n });\n }\n}\n","import type { ControlRenderingStyleOverride } from '../controls/controlRendering';\nimport { classRegistry } from '../ClassRegistry';\nimport type { GroupProps } from './Group';\nimport { Group } from './Group';\nimport type { FabricObject } from './Object/FabricObject';\nimport {\n LAYOUT_TYPE_ADDED,\n LAYOUT_TYPE_REMOVED,\n} from '../LayoutManager/constants';\nimport type { TClassProperties } from '../typedefs';\nimport { log } from '../util/internals/console';\nimport { ActiveSelectionLayoutManager } from '../LayoutManager/ActiveSelectionLayoutManager';\n\nexport type MultiSelectionStacking = 'canvas-stacking' | 'selection-order';\n\nexport interface ActiveSelectionOptions extends GroupProps {\n multiSelectionStacking: MultiSelectionStacking;\n}\n\nconst activeSelectionDefaultValues: Partial> =\n {\n multiSelectionStacking: 'canvas-stacking',\n };\n\n/**\n * Used by Canvas to manage selection.\n *\n * @example\n * class MyActiveSelection extends ActiveSelection {\n * ...\n * }\n *\n * // override the default `ActiveSelection` class\n * classRegistry.setClass(MyActiveSelection)\n */\nexport class ActiveSelection extends Group {\n static type = 'ActiveSelection';\n\n static ownDefaults: Record = activeSelectionDefaultValues;\n\n static getDefaults(): Record {\n return { ...super.getDefaults(), ...ActiveSelection.ownDefaults };\n }\n\n /**\n * The ActiveSelection needs to use the ActiveSelectionLayoutManager\n * or selections on interactive groups may be broken\n */\n declare layoutManager: ActiveSelectionLayoutManager;\n\n /**\n * controls how selected objects are added during a multiselection event\n * - `canvas-stacking` adds the selected object to the active selection while respecting canvas object stacking order\n * - `selection-order` adds the selected object to the top of the stack,\n * meaning that the stack is ordered by the order in which objects were selected\n * @default `canvas-stacking`\n */\n declare multiSelectionStacking: MultiSelectionStacking;\n\n constructor(\n objects: FabricObject[] = [],\n options: Partial = {},\n ) {\n super();\n Object.assign(this, ActiveSelection.ownDefaults);\n this.setOptions(options);\n const { left, top, layoutManager } = options;\n this.groupInit(objects, {\n left,\n top,\n layoutManager: layoutManager ?? new ActiveSelectionLayoutManager(),\n });\n }\n\n /**\n * @private\n */\n _shouldSetNestedCoords() {\n return true;\n }\n\n /**\n * @private\n * @override we don't want the selection monitor to be active\n */\n __objectSelectionMonitor() {\n // noop\n }\n\n /**\n * Adds objects with respect to {@link multiSelectionStacking}\n * @param targets object to add to selection\n */\n multiSelectAdd(...targets: FabricObject[]) {\n if (this.multiSelectionStacking === 'selection-order') {\n this.add(...targets);\n } else {\n // respect object stacking as it is on canvas\n // perf enhancement for large ActiveSelection: consider a binary search of `isInFrontOf`\n targets.forEach((target) => {\n const index = this._objects.findIndex((obj) => obj.isInFrontOf(target));\n const insertAt =\n index === -1\n ? // `target` is in front of all other objects\n this.size()\n : index;\n this.insertAt(insertAt, target);\n });\n }\n }\n\n /**\n * @override block ancestors/descendants of selected objects from being selected to prevent a circular object tree\n */\n canEnterGroup(object: FabricObject) {\n if (\n this.getObjects().some(\n (o) => o.isDescendantOf(object) || object.isDescendantOf(o),\n )\n ) {\n // prevent circular object tree\n log(\n 'error',\n 'ActiveSelection: circular object trees are not supported, this call has no effect',\n );\n return false;\n }\n\n return super.canEnterGroup(object);\n }\n\n /**\n * Change an object so that it can be part of an active selection.\n * this method is called by multiselectAdd from canvas code.\n * @private\n * @param {FabricObject} object\n * @param {boolean} [removeParentTransform] true if object is in canvas coordinate plane\n */\n enterGroup(object: FabricObject, removeParentTransform?: boolean) {\n // This condition check that the object has currently a group, and the group\n // is also its parent, meaning that is not in an active selection, but is\n // in a normal group.\n if (object.parent && object.parent === object.group) {\n // Disconnect the object from the group functionalities, but keep the ref parent intact\n // for later re-enter\n object.parent._exitGroup(object);\n // in this case the object is probably inside an active selection.\n } else if (object.group && object.parent !== object.group) {\n // in this case group.remove will also clear the old parent reference.\n object.group.remove(object);\n }\n // enter the active selection from a render perspective\n // the object will be in the objects array of both the ActiveSelection and the Group\n // but referenced in the group's _activeObjects so that it won't be rendered twice.\n this._enterGroup(object, removeParentTransform);\n }\n\n /**\n * we want objects to retain their canvas ref when exiting instance\n * @private\n * @param {FabricObject} object\n * @param {boolean} [removeParentTransform] true if object should exit group without applying group's transform to it\n */\n exitGroup(object: FabricObject, removeParentTransform?: boolean) {\n this._exitGroup(object, removeParentTransform);\n // return to parent\n object.parent && object.parent._enterGroup(object, true);\n }\n\n /**\n * @private\n * @param {'added'|'removed'} type\n * @param {FabricObject[]} targets\n */\n _onAfterObjectsChange(type: 'added' | 'removed', targets: FabricObject[]) {\n super._onAfterObjectsChange(type, targets);\n const groups = new Set();\n targets.forEach((object) => {\n const { parent } = object;\n parent && groups.add(parent);\n });\n if (type === LAYOUT_TYPE_REMOVED) {\n // invalidate groups' layout and mark as dirty\n groups.forEach((group) => {\n group._onAfterObjectsChange(LAYOUT_TYPE_ADDED, targets);\n });\n } else {\n // mark groups as dirty\n groups.forEach((group) => {\n group._set('dirty', true);\n });\n }\n }\n\n /**\n * @override remove all objects\n */\n onDeselect() {\n this.removeAll();\n return false;\n }\n\n /**\n * Returns string representation of a group\n * @return {String}\n */\n toString() {\n return `#`;\n }\n\n /**\n * Decide if the object should cache or not. The Active selection never caches\n * @return {Boolean}\n */\n shouldCache() {\n return false;\n }\n\n /**\n * Check if this group or its parent group are caching, recursively up\n * @return {Boolean}\n */\n isOnACache() {\n return false;\n }\n\n /**\n * Renders controls and borders for the object\n * @param {CanvasRenderingContext2D} ctx Context to render on\n * @param {Object} [styleOverride] properties to override the object style\n * @param {Object} [childrenOverride] properties to override the children overrides\n */\n _renderControls(\n ctx: CanvasRenderingContext2D,\n styleOverride?: ControlRenderingStyleOverride,\n childrenOverride?: ControlRenderingStyleOverride,\n ) {\n ctx.save();\n ctx.globalAlpha = this.isMoving ? this.borderOpacityWhenMoving : 1;\n const options = {\n hasControls: false,\n ...childrenOverride,\n forActiveSelection: true,\n };\n for (let i = 0; i < this._objects.length; i++) {\n this._objects[i]._renderControls(ctx, options);\n }\n super._renderControls(ctx, styleOverride);\n ctx.restore();\n }\n}\n\nclassRegistry.setClass(ActiveSelection);\nclassRegistry.setClass(ActiveSelection, 'activeSelection');\n","/**\n * Canvas 2D filter backend.\n */\nimport type { BaseFilter } from './BaseFilter';\nimport type { T2DPipelineState, TPipelineResources } from './typedefs';\n\nexport class Canvas2dFilterBackend {\n /**\n * Experimental. This object is a sort of repository of help layers used to avoid\n * of recreating them during frequent filtering. If you are previewing a filter with\n * a slider you probably do not want to create help layers every filter step.\n * in this object there will be appended some canvases, created once, resized sometimes\n * cleared never. Clearing is left to the developer.\n **/\n resources: TPipelineResources = {};\n\n /**\n * Apply a set of filters against a source image and draw the filtered output\n * to the provided destination canvas.\n *\n * @param {EnhancedFilter} filters The filter to apply.\n * @param {HTMLImageElement|HTMLCanvasElement} sourceElement The source to be filtered.\n * @param {Number} sourceWidth The width of the source input.\n * @param {Number} sourceHeight The height of the source input.\n * @param {HTMLCanvasElement} targetCanvas The destination for filtered output to be drawn.\n */\n applyFilters(\n filters: BaseFilter>[],\n sourceElement: CanvasImageSource,\n sourceWidth: number,\n sourceHeight: number,\n targetCanvas: HTMLCanvasElement,\n ): T2DPipelineState | void {\n const ctx = targetCanvas.getContext('2d', {\n willReadFrequently: true,\n desynchronized: true,\n });\n if (!ctx) {\n return;\n }\n ctx.drawImage(sourceElement, 0, 0, sourceWidth, sourceHeight);\n const imageData = ctx.getImageData(0, 0, sourceWidth, sourceHeight);\n const originalImageData = ctx.getImageData(0, 0, sourceWidth, sourceHeight);\n const pipelineState: T2DPipelineState = {\n sourceWidth,\n sourceHeight,\n imageData,\n originalEl: sourceElement,\n originalImageData,\n canvasEl: targetCanvas,\n ctx,\n filterBackend: this,\n };\n filters.forEach((filter) => {\n filter.applyTo(pipelineState);\n });\n const { imageData: imageDataPostFilter } = pipelineState;\n if (\n imageDataPostFilter.width !== sourceWidth ||\n imageDataPostFilter.height !== sourceHeight\n ) {\n targetCanvas.width = imageDataPostFilter.width;\n targetCanvas.height = imageDataPostFilter.height;\n }\n ctx.putImageData(imageDataPostFilter, 0, 0);\n return pipelineState;\n }\n}\n","import { config } from '../config';\nimport { createCanvasElementFor } from '../util/misc/dom';\nimport type {\n TWebGLPipelineState,\n TProgramCache,\n TTextureCache,\n TPipelineResources,\n} from './typedefs';\nimport type { BaseFilter } from './BaseFilter';\n\nexport class WebGLFilterBackend {\n declare tileSize: number;\n\n /**\n * Define ...\n **/\n aPosition: Float32Array = new Float32Array([0, 0, 0, 1, 1, 0, 1, 1]);\n\n /**\n * If GLPut data is the fastest operation, or if forced, this buffer will be used\n * to transfer the data back in the 2d logic\n **/\n declare imageBuffer?: ArrayBuffer;\n\n declare canvas: HTMLCanvasElement;\n\n /**\n * The Webgl context that will execute the operations for filtering\n **/\n declare gl: WebGLRenderingContext;\n\n /**\n * Keyed map for shader cache\n **/\n declare programCache: TProgramCache;\n\n /**\n * Keyed map for texture cache\n **/\n declare textureCache: TTextureCache;\n\n /**\n * Contains GPU info for debug\n **/\n declare gpuInfo: any;\n\n /**\n * Experimental. This object is a sort of repository of help layers used to avoid\n * of recreating them during frequent filtering. If you are previewing a filter with\n * a slider you probably do not want to create help layers every filter step.\n * in this object there will be appended some canvases, created once, resized sometimes\n * cleared never. Clearing is left to the developer.\n **/\n resources: TPipelineResources = {};\n\n constructor({ tileSize = config.textureSize } = {}) {\n this.tileSize = tileSize;\n this.setupGLContext(tileSize, tileSize);\n this.captureGPUInfo();\n }\n\n /**\n * Setup a WebGL context suitable for filtering, and bind any needed event handlers.\n */\n setupGLContext(width: number, height: number): void {\n this.dispose();\n this.createWebGLCanvas(width, height);\n }\n\n /**\n * Create a canvas element and associated WebGL context and attaches them as\n * class properties to the GLFilterBackend class.\n */\n createWebGLCanvas(width: number, height: number): void {\n const canvas = createCanvasElementFor({ width, height });\n const glOptions = {\n alpha: true,\n premultipliedAlpha: false,\n depth: false,\n stencil: false,\n antialias: false,\n },\n gl = canvas.getContext('webgl', glOptions) as WebGLRenderingContext;\n\n if (!gl) {\n return;\n }\n gl.clearColor(0, 0, 0, 0);\n // this canvas can fire webglcontextlost and webglcontextrestored\n this.canvas = canvas;\n this.gl = gl;\n }\n\n /**\n * Attempts to apply the requested filters to the source provided, drawing the filtered output\n * to the provided target canvas.\n *\n * @param {Array} filters The filters to apply.\n * @param {TexImageSource} source The source to be filtered.\n * @param {Number} width The width of the source input.\n * @param {Number} height The height of the source input.\n * @param {HTMLCanvasElement} targetCanvas The destination for filtered output to be drawn.\n * @param {String|undefined} cacheKey A key used to cache resources related to the source. If\n * omitted, caching will be skipped.\n */\n applyFilters(\n filters: BaseFilter>[],\n source: TexImageSource,\n width: number,\n height: number,\n targetCanvas: HTMLCanvasElement,\n cacheKey?: string,\n ): TWebGLPipelineState | undefined {\n const gl = this.gl;\n const ctx = targetCanvas.getContext('2d');\n if (!gl || !ctx) {\n return;\n }\n let cachedTexture;\n if (cacheKey) {\n cachedTexture = this.getCachedTexture(cacheKey, source);\n }\n const pipelineState: TWebGLPipelineState = {\n originalWidth:\n (source as HTMLImageElement).width ||\n (source as HTMLImageElement).naturalWidth ||\n 0,\n originalHeight:\n (source as HTMLImageElement).height ||\n (source as HTMLImageElement).naturalHeight ||\n 0,\n sourceWidth: width,\n sourceHeight: height,\n destinationWidth: width,\n destinationHeight: height,\n context: gl,\n sourceTexture: this.createTexture(\n gl,\n width,\n height,\n !cachedTexture ? source : undefined,\n ),\n targetTexture: this.createTexture(gl, width, height),\n originalTexture:\n cachedTexture ||\n this.createTexture(\n gl,\n width,\n height,\n !cachedTexture ? source : undefined,\n ),\n passes: filters.length,\n webgl: true,\n aPosition: this.aPosition,\n programCache: this.programCache,\n pass: 0,\n filterBackend: this,\n targetCanvas: targetCanvas,\n };\n const tempFbo = gl.createFramebuffer();\n gl.bindFramebuffer(gl.FRAMEBUFFER, tempFbo);\n filters.forEach((filter: any) => {\n filter && filter.applyTo(pipelineState);\n });\n resizeCanvasIfNeeded(pipelineState);\n this.copyGLTo2D(gl, pipelineState);\n gl.bindTexture(gl.TEXTURE_2D, null);\n gl.deleteTexture(pipelineState.sourceTexture);\n gl.deleteTexture(pipelineState.targetTexture);\n gl.deleteFramebuffer(tempFbo);\n ctx.setTransform(1, 0, 0, 1, 0, 0);\n return pipelineState;\n }\n\n /**\n * Detach event listeners, remove references, and clean up caches.\n */\n dispose() {\n if (this.canvas) {\n // we are disposing, we don't care about the fact\n // that the canvas shouldn't be null.\n // @ts-expect-error disposing\n this.canvas = null;\n // @ts-expect-error disposing\n this.gl = null;\n }\n this.clearWebGLCaches();\n }\n\n /**\n * Wipe out WebGL-related caches.\n */\n clearWebGLCaches() {\n this.programCache = {};\n this.textureCache = {};\n }\n\n /**\n * Create a WebGL texture object.\n *\n * Accepts specific dimensions to initialize the texture to or a source image.\n *\n * @param {WebGLRenderingContext} gl The GL context to use for creating the texture.\n * @param {number} width The width to initialize the texture at.\n * @param {number} height The height to initialize the texture.\n * @param {TexImageSource} textureImageSource A source for the texture data.\n * @param {number} filter gl.NEAREST default or gl.LINEAR filters for the texture.\n * This filter is very useful for LUTs filters. If you need interpolation use gl.LINEAR\n * @returns {WebGLTexture}\n */\n createTexture(\n gl: WebGLRenderingContext,\n width: number,\n height: number,\n textureImageSource?: TexImageSource,\n filter?:\n | WebGLRenderingContextBase['NEAREST']\n | WebGLRenderingContextBase['LINEAR'],\n ) {\n const {\n NEAREST,\n TEXTURE_2D,\n RGBA,\n UNSIGNED_BYTE,\n CLAMP_TO_EDGE,\n TEXTURE_MAG_FILTER,\n TEXTURE_MIN_FILTER,\n TEXTURE_WRAP_S,\n TEXTURE_WRAP_T,\n } = gl;\n const texture = gl.createTexture();\n gl.bindTexture(TEXTURE_2D, texture);\n gl.texParameteri(TEXTURE_2D, TEXTURE_MAG_FILTER, filter || NEAREST);\n gl.texParameteri(TEXTURE_2D, TEXTURE_MIN_FILTER, filter || NEAREST);\n gl.texParameteri(TEXTURE_2D, TEXTURE_WRAP_S, CLAMP_TO_EDGE);\n gl.texParameteri(TEXTURE_2D, TEXTURE_WRAP_T, CLAMP_TO_EDGE);\n if (textureImageSource) {\n gl.texImage2D(\n TEXTURE_2D,\n 0,\n RGBA,\n RGBA,\n UNSIGNED_BYTE,\n textureImageSource,\n );\n } else {\n gl.texImage2D(\n TEXTURE_2D,\n 0,\n RGBA,\n width,\n height,\n 0,\n RGBA,\n UNSIGNED_BYTE,\n null,\n );\n }\n return texture;\n }\n\n /**\n * Can be optionally used to get a texture from the cache array\n *\n * If an existing texture is not found, a new texture is created and cached.\n *\n * @param {String} uniqueId A cache key to use to find an existing texture.\n * @param {HTMLImageElement|HTMLCanvasElement} textureImageSource A source to use to create the\n * texture cache entry if one does not already exist.\n */\n getCachedTexture(\n uniqueId: string,\n textureImageSource: TexImageSource,\n filter?:\n | WebGLRenderingContextBase['NEAREST']\n | WebGLRenderingContextBase['LINEAR'],\n ): WebGLTexture | null {\n const { textureCache } = this;\n if (textureCache[uniqueId]) {\n return textureCache[uniqueId];\n } else {\n const texture = this.createTexture(\n this.gl,\n (textureImageSource as HTMLImageElement).width,\n (textureImageSource as HTMLImageElement).height,\n textureImageSource,\n filter,\n );\n if (texture) {\n textureCache[uniqueId] = texture;\n }\n return texture;\n }\n }\n\n /**\n * Clear out cached resources related to a source image that has been\n * filtered previously.\n *\n * @param {String} cacheKey The cache key provided when the source image was filtered.\n */\n evictCachesForKey(cacheKey: string) {\n if (this.textureCache[cacheKey]) {\n this.gl.deleteTexture(this.textureCache[cacheKey]);\n delete this.textureCache[cacheKey];\n }\n }\n\n /**\n * Copy an input WebGL canvas on to an output 2D canvas.\n *\n * The WebGL canvas is assumed to be upside down, with the top-left pixel of the\n * desired output image appearing in the bottom-left corner of the WebGL canvas.\n *\n * @param {WebGLRenderingContext} sourceContext The WebGL context to copy from.\n * @param {Object} pipelineState The 2D target canvas to copy on to.\n */\n copyGLTo2D(gl: WebGLRenderingContext, pipelineState: TWebGLPipelineState) {\n const glCanvas = gl.canvas,\n targetCanvas = pipelineState.targetCanvas,\n ctx = targetCanvas.getContext('2d');\n if (!ctx) {\n return;\n }\n ctx.translate(0, targetCanvas.height); // move it down again\n ctx.scale(1, -1); // vertical flip\n // where is my image on the big glcanvas?\n const sourceY = glCanvas.height - targetCanvas.height;\n ctx.drawImage(\n glCanvas,\n 0,\n sourceY,\n targetCanvas.width,\n targetCanvas.height,\n 0,\n 0,\n targetCanvas.width,\n targetCanvas.height,\n );\n }\n\n /**\n * Copy an input WebGL canvas on to an output 2D canvas using 2d canvas' putImageData\n * API. Measurably faster than using ctx.drawImage in Firefox (version 54 on OSX Sierra).\n *\n * @param {WebGLRenderingContext} sourceContext The WebGL context to copy from.\n * @param {HTMLCanvasElement} targetCanvas The 2D target canvas to copy on to.\n * @param {Object} pipelineState The 2D target canvas to copy on to.\n */\n copyGLTo2DPutImageData(\n this: Required,\n gl: WebGLRenderingContext,\n pipelineState: TWebGLPipelineState,\n ) {\n const targetCanvas = pipelineState.targetCanvas,\n ctx = targetCanvas.getContext('2d'),\n dWidth = pipelineState.destinationWidth,\n dHeight = pipelineState.destinationHeight,\n numBytes = dWidth * dHeight * 4;\n if (!ctx) {\n return;\n }\n const u8 = new Uint8Array(this.imageBuffer, 0, numBytes);\n const u8Clamped = new Uint8ClampedArray(this.imageBuffer, 0, numBytes);\n\n gl.readPixels(0, 0, dWidth, dHeight, gl.RGBA, gl.UNSIGNED_BYTE, u8);\n const imgData = new ImageData(u8Clamped, dWidth, dHeight);\n ctx.putImageData(imgData, 0, 0);\n }\n\n /**\n * Attempt to extract GPU information strings from a WebGL context.\n *\n * Useful information when debugging or blacklisting specific GPUs.\n *\n * @returns {Object} A GPU info object with renderer and vendor strings.\n */\n captureGPUInfo() {\n if (this.gpuInfo) {\n return this.gpuInfo;\n }\n const gl = this.gl,\n gpuInfo = { renderer: '', vendor: '' };\n if (!gl) {\n return gpuInfo;\n }\n const ext = gl.getExtension('WEBGL_debug_renderer_info');\n if (ext) {\n const renderer = gl.getParameter(ext.UNMASKED_RENDERER_WEBGL);\n const vendor = gl.getParameter(ext.UNMASKED_VENDOR_WEBGL);\n if (renderer) {\n gpuInfo.renderer = renderer.toLowerCase();\n }\n if (vendor) {\n gpuInfo.vendor = vendor.toLowerCase();\n }\n }\n this.gpuInfo = gpuInfo;\n return gpuInfo;\n }\n}\n\nfunction resizeCanvasIfNeeded(pipelineState: TWebGLPipelineState): void {\n const targetCanvas = pipelineState.targetCanvas,\n width = targetCanvas.width,\n height = targetCanvas.height,\n dWidth = pipelineState.destinationWidth,\n dHeight = pipelineState.destinationHeight;\n\n if (width !== dWidth || height !== dHeight) {\n targetCanvas.width = dWidth;\n targetCanvas.height = dHeight;\n }\n}\n","import { config } from '../config';\nimport { getEnv } from '../env';\nimport { createCanvasElement } from '../util/misc/dom';\nimport { Canvas2dFilterBackend } from './Canvas2dFilterBackend';\nimport { WebGLFilterBackend } from './WebGLFilterBackend';\n\nexport type FilterBackend = WebGLFilterBackend | Canvas2dFilterBackend;\n\nlet filterBackend: FilterBackend;\n\n/**\n * Verifies if it is possible to initialize webgl or fallback on a canvas2d filtering backend\n */\nexport function initFilterBackend(): FilterBackend {\n const { WebGLProbe } = getEnv();\n WebGLProbe.queryWebGL(createCanvasElement());\n if (config.enableGLFiltering && WebGLProbe.isSupported(config.textureSize)) {\n return new WebGLFilterBackend({ tileSize: config.textureSize });\n } else {\n return new Canvas2dFilterBackend();\n }\n}\n\n/**\n * Get the current fabricJS filter backend or initialize one if not available yet\n * @param [strict] pass `true` to create the backend if it wasn't created yet (default behavior),\n * pass `false` to get the backend ref without mutating it\n */\nexport function getFilterBackend(strict = true): FilterBackend {\n if (!filterBackend && strict) {\n filterBackend = initFilterBackend();\n }\n return filterBackend;\n}\n\nexport function setFilterBackend(backend: FilterBackend) {\n filterBackend = backend;\n}\n","import { getFabricDocument, getEnv } from '../env';\nimport type { BaseFilter } from '../filters/BaseFilter';\nimport { getFilterBackend } from '../filters/FilterBackend';\nimport { SHARED_ATTRIBUTES } from '../parser/attributes';\nimport { parseAttributes } from '../parser/parseAttributes';\nimport type {\n TClassProperties,\n TCrossOrigin,\n TSize,\n Abortable,\n TOptions,\n} from '../typedefs';\nimport { uid } from '../util/internals/uid';\nimport { createCanvasElementFor } from '../util/misc/dom';\nimport { findScaleToCover, findScaleToFit } from '../util/misc/findScaleTo';\nimport type { LoadImageOptions } from '../util/misc/objectEnlive';\nimport {\n enlivenObjectEnlivables,\n enlivenObjects,\n loadImage,\n} from '../util/misc/objectEnlive';\nimport { parsePreserveAspectRatioAttribute } from '../util/misc/svgParsing';\nimport { classRegistry } from '../ClassRegistry';\nimport { FabricObject, cacheProperties } from './Object/FabricObject';\nimport type { FabricObjectProps, SerializedObjectProps } from './Object/types';\nimport type { ObjectEvents } from '../EventTypeDefs';\nimport { WebGLFilterBackend } from '../filters/WebGLFilterBackend';\nimport { FILL, NONE } from '../constants';\nimport { getDocumentFromElement } from '../util/dom_misc';\nimport type { CSSRules } from '../parser/typedefs';\nimport type { Resize, ResizeSerializedProps } from '../filters/Resize';\nimport type { TCachedFabricObject } from './Object/Object';\nimport { log } from '../util/internals/console';\n\n// @todo Would be nice to have filtering code not imported directly.\n\nexport type ImageSource =\n | HTMLImageElement\n | HTMLVideoElement\n | HTMLCanvasElement;\n\ninterface UniqueImageProps {\n srcFromAttribute: boolean;\n minimumScaleTrigger: number;\n cropX: number;\n cropY: number;\n imageSmoothing: boolean;\n filters: BaseFilter>[];\n resizeFilter?: Resize;\n}\n\nexport const imageDefaultValues: Partial> = {\n strokeWidth: 0,\n srcFromAttribute: false,\n minimumScaleTrigger: 0.5,\n cropX: 0,\n cropY: 0,\n imageSmoothing: true,\n};\n\nexport interface SerializedImageProps extends SerializedObjectProps {\n src: string;\n crossOrigin: TCrossOrigin;\n filters: any[];\n resizeFilter?: ResizeSerializedProps;\n cropX: number;\n cropY: number;\n}\n\nexport interface ImageProps extends FabricObjectProps, UniqueImageProps {}\n\nconst IMAGE_PROPS = ['cropX', 'cropY'] as const;\n\n/**\n * @tutorial {@link http://fabricjs.com/fabric-intro-part-1#images}\n */\nexport class FabricImage<\n Props extends TOptions = Partial,\n SProps extends SerializedImageProps = SerializedImageProps,\n EventSpec extends ObjectEvents = ObjectEvents,\n >\n extends FabricObject\n implements ImageProps\n{\n /**\n * When calling {@link FabricImage.getSrc}, return value from element src with `element.getAttribute('src')`.\n * This allows for relative urls as image src.\n * @since 2.7.0\n * @type Boolean\n * @default false\n */\n declare srcFromAttribute: boolean;\n\n /**\n * private\n * contains last value of scaleX to detect\n * if the Image got resized after the last Render\n * @type Number\n */\n protected _lastScaleX = 1;\n\n /**\n * private\n * contains last value of scaleY to detect\n * if the Image got resized after the last Render\n * @type Number\n */\n protected _lastScaleY = 1;\n\n /**\n * private\n * contains last value of scaling applied by the apply filter chain\n * @type Number\n */\n protected _filterScalingX = 1;\n\n /**\n * private\n * contains last value of scaling applied by the apply filter chain\n * @type Number\n */\n protected _filterScalingY = 1;\n\n /**\n * minimum scale factor under which any resizeFilter is triggered to resize the image\n * 0 will disable the automatic resize. 1 will trigger automatically always.\n * number bigger than 1 are not implemented yet.\n * @type Number\n */\n declare minimumScaleTrigger: number;\n\n /**\n * key used to retrieve the texture representing this image\n * @since 2.0.0\n * @type String\n */\n declare cacheKey: string;\n\n /**\n * Image crop in pixels from original image size.\n * @since 2.0.0\n * @type Number\n */\n declare cropX: number;\n\n /**\n * Image crop in pixels from original image size.\n * @since 2.0.0\n * @type Number\n */\n declare cropY: number;\n\n /**\n * Indicates whether this canvas will use image smoothing when painting this image.\n * Also influence if the cacheCanvas for this image uses imageSmoothing\n * @since 4.0.0-beta.11\n * @type Boolean\n */\n declare imageSmoothing: boolean;\n\n declare preserveAspectRatio: string;\n\n declare protected src: string;\n\n declare filters: BaseFilter>[];\n declare resizeFilter: Resize;\n\n declare _element: ImageSource;\n declare _filteredEl?: HTMLCanvasElement;\n declare _originalElement: ImageSource;\n\n static type = 'Image';\n\n static cacheProperties = [...cacheProperties, ...IMAGE_PROPS];\n\n static ownDefaults = imageDefaultValues;\n\n static getDefaults(): Record {\n return {\n ...super.getDefaults(),\n ...FabricImage.ownDefaults,\n };\n }\n /**\n * Constructor\n * Image can be initialized with any canvas drawable or a string.\n * The string should be a url and will be loaded as an image.\n * Canvas and Image element work out of the box, while videos require extra code to work.\n * Please check video element events for seeking.\n * @param {ImageSource | string} element Image element\n * @param {Object} [options] Options object\n */\n constructor(elementId: string, options?: Props);\n constructor(element: ImageSource, options?: Props);\n constructor(arg0: ImageSource | string, options?: Props) {\n super();\n this.filters = [];\n Object.assign(this, FabricImage.ownDefaults);\n this.setOptions(options);\n this.cacheKey = `texture${uid()}`;\n this.setElement(\n typeof arg0 === 'string'\n ? ((\n (this.canvas && getDocumentFromElement(this.canvas.getElement())) ||\n getFabricDocument()\n ).getElementById(arg0) as ImageSource)\n : arg0,\n options,\n );\n }\n\n /**\n * Returns image element which this instance if based on\n */\n getElement() {\n return this._element;\n }\n\n /**\n * Sets image element for this instance to a specified one.\n * If filters defined they are applied to new image.\n * You might need to call `canvas.renderAll` and `object.setCoords` after replacing, to render new image and update controls area.\n * @param {HTMLImageElement} element\n * @param {Partial} [size] Options object\n */\n setElement(element: ImageSource, size: Partial = {}) {\n this.removeTexture(this.cacheKey);\n this.removeTexture(`${this.cacheKey}_filtered`);\n this._element = element;\n this._originalElement = element;\n this._setWidthHeight(size);\n if (this.filters.length !== 0) {\n this.applyFilters();\n }\n // resizeFilters work on the already filtered copy.\n // we need to apply resizeFilters AFTER normal filters.\n // applyResizeFilters is run more often than normal filters\n // and is triggered by user interactions rather than dev code\n if (this.resizeFilter) {\n this.applyResizeFilters();\n }\n }\n\n /**\n * Delete a single texture if in webgl mode\n */\n removeTexture(key: string) {\n const backend = getFilterBackend(false);\n if (backend instanceof WebGLFilterBackend) {\n backend.evictCachesForKey(key);\n }\n }\n\n /**\n * Delete textures, reference to elements and eventually JSDOM cleanup\n */\n dispose() {\n super.dispose();\n this.removeTexture(this.cacheKey);\n this.removeTexture(`${this.cacheKey}_filtered`);\n this._cacheContext = null;\n (\n ['_originalElement', '_element', '_filteredEl', '_cacheCanvas'] as const\n ).forEach((elementKey) => {\n const el = this[elementKey];\n el && getEnv().dispose(el);\n // @ts-expect-error disposing\n this[elementKey] = undefined;\n });\n }\n\n /**\n * Get the crossOrigin value (of the corresponding image element)\n */\n getCrossOrigin(): string | null {\n return (\n this._originalElement &&\n ((this._originalElement as any).crossOrigin || null)\n );\n }\n\n /**\n * Returns original size of an image\n */\n getOriginalSize() {\n const element = this.getElement() as any;\n if (!element) {\n return {\n width: 0,\n height: 0,\n };\n }\n return {\n width: element.naturalWidth || element.width,\n height: element.naturalHeight || element.height,\n };\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _stroke(ctx: CanvasRenderingContext2D) {\n if (!this.stroke || this.strokeWidth === 0) {\n return;\n }\n const w = this.width / 2,\n h = this.height / 2;\n ctx.beginPath();\n ctx.moveTo(-w, -h);\n ctx.lineTo(w, -h);\n ctx.lineTo(w, h);\n ctx.lineTo(-w, h);\n ctx.lineTo(-w, -h);\n ctx.closePath();\n }\n\n /**\n * Returns object representation of an instance\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} Object representation of an instance\n */\n toObject<\n T extends Omit, keyof SProps>,\n K extends keyof T = never,\n >(propertiesToInclude: K[] = []): Pick & SProps {\n const filters: Record[] = [];\n this.filters.forEach((filterObj) => {\n filterObj && filters.push(filterObj.toObject());\n });\n return {\n ...super.toObject([...IMAGE_PROPS, ...propertiesToInclude]),\n src: this.getSrc(),\n crossOrigin: this.getCrossOrigin(),\n filters,\n ...(this.resizeFilter\n ? { resizeFilter: this.resizeFilter.toObject() }\n : {}),\n };\n }\n\n /**\n * Returns true if an image has crop applied, inspecting values of cropX,cropY,width,height.\n * @return {Boolean}\n */\n hasCrop() {\n return (\n !!this.cropX ||\n !!this.cropY ||\n this.width < this._element.width ||\n this.height < this._element.height\n );\n }\n\n /**\n * Returns svg representation of an instance\n * @return {string[]} an array of strings with the specific svg representation\n * of the instance\n */\n _toSVG() {\n const imageMarkup: string[] = [],\n element = this._element,\n x = -this.width / 2,\n y = -this.height / 2;\n let svgString: string[] = [],\n strokeSvg: string[] = [],\n clipPath = '',\n imageRendering = '';\n if (!element) {\n return [];\n }\n if (this.hasCrop()) {\n const clipPathId = uid();\n svgString.push(\n '\\n',\n '\\t\\n',\n '\\n',\n );\n clipPath = ' clip-path=\"url(#imageCrop_' + clipPathId + ')\" ';\n }\n if (!this.imageSmoothing) {\n imageRendering = ' image-rendering=\"optimizeSpeed\"';\n }\n imageMarkup.push(\n '\\t element with actual transformation, then offsetting object to the top/left\n // so that object's center aligns with container's left/top\n }\" width=\"${\n element.width || (element as HTMLImageElement).naturalWidth\n }\" height=\"${\n element.height || (element as HTMLImageElement).naturalHeight\n }\"${imageRendering}${clipPath}>\\n`,\n );\n\n if (this.stroke || this.strokeDashArray) {\n const origFill = this.fill;\n this.fill = null;\n strokeSvg = [\n `\\t\\n`,\n ];\n this.fill = origFill;\n }\n if (this.paintFirst !== FILL) {\n svgString = svgString.concat(strokeSvg, imageMarkup);\n } else {\n svgString = svgString.concat(imageMarkup, strokeSvg);\n }\n return svgString;\n }\n\n /**\n * Returns source of an image\n * @param {Boolean} filtered indicates if the src is needed for svg\n * @return {String} Source of an image\n */\n getSrc(filtered?: boolean): string {\n const element = filtered ? this._element : this._originalElement;\n if (element) {\n if ((element as HTMLCanvasElement).toDataURL) {\n return (element as HTMLCanvasElement).toDataURL();\n }\n\n if (this.srcFromAttribute) {\n return element.getAttribute('src') || '';\n } else {\n return (element as HTMLImageElement).src;\n }\n } else {\n return this.src || '';\n }\n }\n\n /**\n * Alias for getSrc\n * @param filtered\n * @deprecated\n */\n getSvgSrc(filtered?: boolean) {\n return this.getSrc(filtered);\n }\n\n /**\n * Loads and sets source of an image\\\n * **IMPORTANT**: It is recommended to abort loading tasks before calling this method to prevent race conditions and unnecessary networking\n * @param {String} src Source string (URL)\n * @param {LoadImageOptions} [options] Options object\n */\n setSrc(src: string, { crossOrigin, signal }: LoadImageOptions = {}) {\n return loadImage(src, { crossOrigin, signal }).then((img) => {\n typeof crossOrigin !== 'undefined' && this.set({ crossOrigin });\n this.setElement(img);\n });\n }\n\n /**\n * Returns string representation of an instance\n * @return {String} String representation of an instance\n */\n toString() {\n return `#`;\n }\n\n applyResizeFilters() {\n const filter = this.resizeFilter,\n minimumScale = this.minimumScaleTrigger,\n objectScale = this.getTotalObjectScaling(),\n scaleX = objectScale.x,\n scaleY = objectScale.y,\n elementToFilter = this._filteredEl || this._originalElement;\n if (this.group) {\n this.set('dirty', true);\n }\n if (!filter || (scaleX > minimumScale && scaleY > minimumScale)) {\n this._element = elementToFilter;\n this._filterScalingX = 1;\n this._filterScalingY = 1;\n this._lastScaleX = scaleX;\n this._lastScaleY = scaleY;\n return;\n }\n const canvasEl = createCanvasElementFor(elementToFilter),\n { width, height } = elementToFilter;\n this._element = canvasEl;\n this._lastScaleX = filter.scaleX = scaleX;\n this._lastScaleY = filter.scaleY = scaleY;\n getFilterBackend().applyFilters(\n [filter],\n elementToFilter,\n width,\n height,\n this._element,\n );\n this._filterScalingX = canvasEl.width / this._originalElement.width;\n this._filterScalingY = canvasEl.height / this._originalElement.height;\n }\n\n /**\n * Applies filters assigned to this image (from \"filters\" array) or from filter param\n * @method applyFilters\n * @param {Array} filters to be applied\n * @param {Boolean} forResizing specify if the filter operation is a resize operation\n */\n applyFilters(\n filters: BaseFilter>[] = this.filters || [],\n ) {\n filters = filters.filter((filter) => filter && !filter.isNeutralState());\n this.set('dirty', true);\n\n // needs to clear out or WEBGL will not resize correctly\n this.removeTexture(`${this.cacheKey}_filtered`);\n\n if (filters.length === 0) {\n this._element = this._originalElement;\n // this is unsafe and needs to be rethinkend\n this._filteredEl = undefined;\n this._filterScalingX = 1;\n this._filterScalingY = 1;\n return;\n }\n\n const imgElement = this._originalElement,\n sourceWidth =\n (imgElement as HTMLImageElement).naturalWidth || imgElement.width,\n sourceHeight =\n (imgElement as HTMLImageElement).naturalHeight || imgElement.height;\n\n if (this._element === this._originalElement) {\n // if the _element a reference to _originalElement\n // we need to create a new element to host the filtered pixels\n const canvasEl = createCanvasElementFor({\n width: sourceWidth,\n height: sourceHeight,\n });\n this._element = canvasEl;\n this._filteredEl = canvasEl;\n } else if (this._filteredEl) {\n // if the _element is it own element,\n // and we also have a _filteredEl, then we clean up _filteredEl\n // and we assign it to _element.\n // in this way we invalidate the eventual old resize filtered element\n this._element = this._filteredEl;\n this._filteredEl\n .getContext('2d')!\n .clearRect(0, 0, sourceWidth, sourceHeight);\n // we also need to resize again at next renderAll, so remove saved _lastScaleX/Y\n this._lastScaleX = 1;\n this._lastScaleY = 1;\n }\n getFilterBackend().applyFilters(\n filters,\n this._originalElement,\n sourceWidth,\n sourceHeight,\n this._element as HTMLCanvasElement,\n this.cacheKey,\n );\n if (\n this._originalElement.width !== this._element.width ||\n this._originalElement.height !== this._element.height\n ) {\n this._filterScalingX = this._element.width / this._originalElement.width;\n this._filterScalingY =\n this._element.height / this._originalElement.height;\n }\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _render(ctx: CanvasRenderingContext2D) {\n ctx.imageSmoothingEnabled = this.imageSmoothing;\n if (this.isMoving !== true && this.resizeFilter && this._needsResize()) {\n this.applyResizeFilters();\n }\n this._stroke(ctx);\n this._renderPaintInOrder(ctx);\n }\n\n /**\n * Paint the cached copy of the object on the target context.\n * it will set the imageSmoothing for the draw operation\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n drawCacheOnCanvas(\n this: TCachedFabricObject,\n ctx: CanvasRenderingContext2D,\n ) {\n ctx.imageSmoothingEnabled = this.imageSmoothing;\n super.drawCacheOnCanvas(ctx);\n }\n\n /**\n * Decide if the FabricImage should cache or not. Create its own cache level\n * needsItsOwnCache should be used when the object drawing method requires\n * a cache step.\n * Generally you do not cache objects in groups because the group outside is cached.\n * This is the special Image version where we would like to avoid caching where possible.\n * Essentially images do not benefit from caching. They may require caching, and in that\n * case we do it. Also caching an image usually ends in a loss of details.\n * A full performance audit should be done.\n * @return {Boolean}\n */\n shouldCache() {\n return this.needsItsOwnCache();\n }\n\n _renderFill(ctx: CanvasRenderingContext2D) {\n const elementToDraw = this._element;\n if (!elementToDraw) {\n return;\n }\n const scaleX = this._filterScalingX,\n scaleY = this._filterScalingY,\n w = this.width,\n h = this.height,\n // crop values cannot be lesser than 0.\n cropX = Math.max(this.cropX, 0),\n cropY = Math.max(this.cropY, 0),\n elWidth =\n (elementToDraw as HTMLImageElement).naturalWidth || elementToDraw.width,\n elHeight =\n (elementToDraw as HTMLImageElement).naturalHeight ||\n elementToDraw.height,\n sX = cropX * scaleX,\n sY = cropY * scaleY,\n // the width height cannot exceed element width/height, starting from the crop offset.\n sW = Math.min(w * scaleX, elWidth - sX),\n sH = Math.min(h * scaleY, elHeight - sY),\n x = -w / 2,\n y = -h / 2,\n maxDestW = Math.min(w, elWidth / scaleX - cropX),\n maxDestH = Math.min(h, elHeight / scaleY - cropY);\n\n elementToDraw &&\n ctx.drawImage(elementToDraw, sX, sY, sW, sH, x, y, maxDestW, maxDestH);\n }\n\n /**\n * needed to check if image needs resize\n * @private\n */\n _needsResize() {\n const scale = this.getTotalObjectScaling();\n return scale.x !== this._lastScaleX || scale.y !== this._lastScaleY;\n }\n\n /**\n * @private\n * @deprecated unused\n */\n _resetWidthHeight() {\n this.set(this.getOriginalSize());\n }\n\n /**\n * @private\n * Set the width and the height of the image object, using the element or the\n * options.\n */\n _setWidthHeight({ width, height }: Partial = {}) {\n const size = this.getOriginalSize();\n this.width = width || size.width;\n this.height = height || size.height;\n }\n\n /**\n * Calculate offset for center and scale factor for the image in order to respect\n * the preserveAspectRatio attribute\n * @private\n */\n parsePreserveAspectRatioAttribute() {\n const pAR = parsePreserveAspectRatioAttribute(\n this.preserveAspectRatio || '',\n ),\n pWidth = this.width,\n pHeight = this.height,\n parsedAttributes = { width: pWidth, height: pHeight };\n let rWidth = this._element.width,\n rHeight = this._element.height,\n scaleX = 1,\n scaleY = 1,\n offsetLeft = 0,\n offsetTop = 0,\n cropX = 0,\n cropY = 0,\n offset;\n\n if (pAR && (pAR.alignX !== NONE || pAR.alignY !== NONE)) {\n if (pAR.meetOrSlice === 'meet') {\n scaleX = scaleY = findScaleToFit(this._element, parsedAttributes);\n offset = (pWidth - rWidth * scaleX) / 2;\n if (pAR.alignX === 'Min') {\n offsetLeft = -offset;\n }\n if (pAR.alignX === 'Max') {\n offsetLeft = offset;\n }\n offset = (pHeight - rHeight * scaleY) / 2;\n if (pAR.alignY === 'Min') {\n offsetTop = -offset;\n }\n if (pAR.alignY === 'Max') {\n offsetTop = offset;\n }\n }\n if (pAR.meetOrSlice === 'slice') {\n scaleX = scaleY = findScaleToCover(this._element, parsedAttributes);\n offset = rWidth - pWidth / scaleX;\n if (pAR.alignX === 'Mid') {\n cropX = offset / 2;\n }\n if (pAR.alignX === 'Max') {\n cropX = offset;\n }\n offset = rHeight - pHeight / scaleY;\n if (pAR.alignY === 'Mid') {\n cropY = offset / 2;\n }\n if (pAR.alignY === 'Max') {\n cropY = offset;\n }\n rWidth = pWidth / scaleX;\n rHeight = pHeight / scaleY;\n }\n } else {\n scaleX = pWidth / rWidth;\n scaleY = pHeight / rHeight;\n }\n return {\n width: rWidth,\n height: rHeight,\n scaleX,\n scaleY,\n offsetLeft,\n offsetTop,\n cropX,\n cropY,\n };\n }\n\n /**\n * List of attribute names to account for when parsing SVG element (used by {@link FabricImage.fromElement})\n * @see {@link http://www.w3.org/TR/SVG/struct.html#ImageElement}\n */\n static ATTRIBUTE_NAMES = [\n ...SHARED_ATTRIBUTES,\n 'x',\n 'y',\n 'width',\n 'height',\n 'preserveAspectRatio',\n 'xlink:href',\n 'href',\n 'crossOrigin',\n 'image-rendering',\n ];\n\n /**\n * Creates an instance of FabricImage from its object representation\n * @param {Object} object Object to create an instance from\n * @param {object} [options] Options object\n * @param {AbortSignal} [options.signal] handle aborting, see https://developer.mozilla.org/en-US/docs/Web/API/AbortController/signal\n * @returns {Promise}\n */\n static fromObject>(\n { filters: f, resizeFilter: rf, src, crossOrigin, type, ...object }: T,\n options?: Abortable,\n ) {\n return Promise.all([\n loadImage(src!, { ...options, crossOrigin }),\n f && enlivenObjects>(f, options),\n // redundant - handled by enlivenObjectEnlivables, but nicely explicit\n rf ? enlivenObjects([rf], options) : [],\n enlivenObjectEnlivables(object, options),\n ]).then(([el, filters = [], [resizeFilter], hydratedProps = {}]) => {\n return new this(el, {\n ...object,\n // TODO: passing src creates a difference between image creation and restoring from JSON\n src,\n filters,\n resizeFilter,\n ...hydratedProps,\n });\n });\n }\n\n /**\n * Creates an instance of Image from an URL string\n * @param {String} url URL to create an image from\n * @param {LoadImageOptions} [options] Options object\n * @returns {Promise}\n */\n static fromURL>(\n url: string,\n { crossOrigin = null, signal }: LoadImageOptions = {},\n imageOptions?: T,\n ): Promise {\n return loadImage(url, { crossOrigin, signal }).then(\n (img) => new this(img, imageOptions),\n );\n }\n\n /**\n * Returns {@link FabricImage} instance from an SVG element\n * @param {HTMLElement} element Element to parse\n * @param {Object} [options] Options object\n * @param {AbortSignal} [options.signal] handle aborting, see https://developer.mozilla.org/en-US/docs/Web/API/AbortController/signal\n * @param {Function} callback Callback to execute when Image object is created\n */\n static async fromElement(\n element: HTMLElement,\n options: Abortable = {},\n cssRules?: CSSRules,\n ) {\n const parsedAttributes = parseAttributes(\n element,\n this.ATTRIBUTE_NAMES,\n cssRules,\n );\n return this.fromURL(\n parsedAttributes['xlink:href'] || parsedAttributes['href'],\n options,\n parsedAttributes,\n ).catch((err) => {\n log('log', 'Unable to parse Image', err);\n return null;\n });\n }\n}\n\nclassRegistry.setClass(FabricImage);\nclassRegistry.setSVGClass(FabricImage);\n","import { svgNS } from './constants';\nimport {\n parsePreserveAspectRatioAttribute,\n parseUnit,\n} from '../util/misc/svgParsing';\nimport { svgViewBoxElementsRegEx, reViewBoxAttrValue } from './constants';\nimport { NONE } from '../constants';\n\nexport type ParsedViewboxTransform = Partial<{\n width: number;\n height: number;\n minX: number;\n minY: number;\n viewBoxWidth: number;\n viewBoxHeight: number;\n}>;\n\n/**\n * Add a element that envelop all child elements and makes the viewbox transformMatrix descend on all elements\n */\nexport function applyViewboxTransform(\n element: Element,\n): ParsedViewboxTransform {\n if (!svgViewBoxElementsRegEx.test(element.nodeName)) {\n return {};\n }\n const viewBoxAttr: string | null = element.getAttribute('viewBox');\n let scaleX = 1;\n let scaleY = 1;\n let minX = 0;\n let minY = 0;\n let matrix;\n let el;\n const widthAttr = element.getAttribute('width');\n const heightAttr = element.getAttribute('height');\n const x = element.getAttribute('x') || 0;\n const y = element.getAttribute('y') || 0;\n const goodViewbox = viewBoxAttr && reViewBoxAttrValue.test(viewBoxAttr);\n const missingViewBox = !goodViewbox;\n const missingDimAttr =\n !widthAttr || !heightAttr || widthAttr === '100%' || heightAttr === '100%';\n\n let translateMatrix = '';\n let widthDiff = 0;\n let heightDiff = 0;\n\n if (missingViewBox) {\n if (\n (x || y) &&\n element.parentNode &&\n element.parentNode.nodeName !== '#document'\n ) {\n translateMatrix =\n ' translate(' + parseUnit(x || '0') + ' ' + parseUnit(y || '0') + ') ';\n matrix = (element.getAttribute('transform') || '') + translateMatrix;\n element.setAttribute('transform', matrix);\n element.removeAttribute('x');\n element.removeAttribute('y');\n }\n }\n\n if (missingViewBox && missingDimAttr) {\n return {\n width: 0,\n height: 0,\n };\n }\n\n const parsedDim: ParsedViewboxTransform = {\n width: 0,\n height: 0,\n };\n\n if (missingViewBox) {\n parsedDim.width = parseUnit(widthAttr!);\n parsedDim.height = parseUnit(heightAttr!);\n // set a transform for elements that have x y and are inner(only) SVGs\n return parsedDim;\n }\n\n const pasedViewBox = viewBoxAttr.match(reViewBoxAttrValue)!;\n minX = -parseFloat(pasedViewBox[1]);\n minY = -parseFloat(pasedViewBox[2]);\n const viewBoxWidth = parseFloat(pasedViewBox[3]);\n const viewBoxHeight = parseFloat(pasedViewBox[4]);\n parsedDim.minX = minX;\n parsedDim.minY = minY;\n parsedDim.viewBoxWidth = viewBoxWidth;\n parsedDim.viewBoxHeight = viewBoxHeight;\n if (!missingDimAttr) {\n parsedDim.width = parseUnit(widthAttr);\n parsedDim.height = parseUnit(heightAttr);\n scaleX = parsedDim.width / viewBoxWidth;\n scaleY = parsedDim.height / viewBoxHeight;\n } else {\n parsedDim.width = viewBoxWidth;\n parsedDim.height = viewBoxHeight;\n }\n\n // default is to preserve aspect ratio\n const preserveAspectRatio = parsePreserveAspectRatioAttribute(\n element.getAttribute('preserveAspectRatio') || '',\n );\n if (preserveAspectRatio.alignX !== NONE) {\n //translate all container for the effect of Mid, Min, Max\n if (preserveAspectRatio.meetOrSlice === 'meet') {\n scaleY = scaleX = scaleX > scaleY ? scaleY : scaleX;\n // calculate additional translation to move the viewbox\n }\n if (preserveAspectRatio.meetOrSlice === 'slice') {\n scaleY = scaleX = scaleX > scaleY ? scaleX : scaleY;\n // calculate additional translation to move the viewbox\n }\n widthDiff = parsedDim.width - viewBoxWidth * scaleX;\n heightDiff = parsedDim.height - viewBoxHeight * scaleX;\n if (preserveAspectRatio.alignX === 'Mid') {\n widthDiff /= 2;\n }\n if (preserveAspectRatio.alignY === 'Mid') {\n heightDiff /= 2;\n }\n if (preserveAspectRatio.alignX === 'Min') {\n widthDiff = 0;\n }\n if (preserveAspectRatio.alignY === 'Min') {\n heightDiff = 0;\n }\n }\n\n if (\n scaleX === 1 &&\n scaleY === 1 &&\n minX === 0 &&\n minY === 0 &&\n x === 0 &&\n y === 0\n ) {\n return parsedDim;\n }\n if ((x || y) && element.parentNode!.nodeName !== '#document') {\n translateMatrix =\n ' translate(' + parseUnit(x || '0') + ' ' + parseUnit(y || '0') + ') ';\n }\n\n matrix =\n translateMatrix +\n ' matrix(' +\n scaleX +\n ' 0' +\n ' 0 ' +\n scaleY +\n ' ' +\n (minX * scaleX + widthDiff) +\n ' ' +\n (minY * scaleY + heightDiff) +\n ') ';\n // seems unused.\n // parsedDim.viewboxTransform = parseTransformAttribute(matrix);\n if (element.nodeName === 'svg') {\n el = element.ownerDocument.createElementNS(svgNS, 'g');\n // element.firstChild != null\n while (element.firstChild) {\n el.appendChild(element.firstChild);\n }\n element.appendChild(el);\n } else {\n el = element;\n el.removeAttribute('x');\n el.removeAttribute('y');\n matrix = el.getAttribute('transform') + matrix;\n }\n el.setAttribute('transform', matrix);\n return parsedDim;\n}\n","export const getTagName = (node: Element) => node.tagName.replace('svg:', '');\n","import { svgInvalidAncestors } from './constants';\nimport { getSvgRegex } from './getSvgRegex';\nimport { getTagName } from './getTagName';\n\nconst svgInvalidAncestorsRegEx = getSvgRegex(svgInvalidAncestors);\n\nexport function hasInvalidAncestor(element: Element) {\n let _element: Element | null = element;\n while (_element && (_element = _element.parentElement)) {\n if (\n _element &&\n _element.nodeName &&\n svgInvalidAncestorsRegEx.test(getTagName(_element)) &&\n !_element.getAttribute('instantiated_by_use')\n ) {\n return true;\n }\n }\n return false;\n}\n","export function getMultipleNodes(\n doc: Document,\n nodeNames: string[],\n): Element[] {\n let nodeName,\n nodeArray: Element[] = [],\n nodeList,\n i,\n len;\n for (i = 0, len = nodeNames.length; i < len; i++) {\n nodeName = nodeNames[i];\n nodeList = doc.getElementsByTagNameNS(\n 'http://www.w3.org/2000/svg',\n nodeName,\n );\n nodeArray = nodeArray.concat(Array.from(nodeList));\n }\n return nodeArray;\n}\n","import { svgNS } from './constants';\nimport { getMultipleNodes } from './getMultipleNodes';\nimport { applyViewboxTransform } from './applyViewboxTransform';\nimport { parseStyleString } from './parseStyleString';\n\nexport function parseUseDirectives(doc: Document) {\n const nodelist = getMultipleNodes(doc, ['use', 'svg:use']);\n const skipAttributes = ['x', 'y', 'xlink:href', 'href', 'transform'];\n\n for (const useElement of nodelist) {\n const useAttributes: NamedNodeMap = useElement.attributes;\n\n const useAttrMap: Record = {};\n for (const attr of useAttributes) {\n attr.value && (useAttrMap[attr.name] = attr.value);\n }\n\n const xlink = (useAttrMap['xlink:href'] || useAttrMap.href || '').slice(1);\n\n if (xlink === '') {\n return;\n }\n const referencedElement = doc.getElementById(xlink);\n if (referencedElement === null) {\n // if we can't find the target of the xlink, consider this use tag bad, similar to no xlink\n return;\n }\n let clonedOriginal = referencedElement.cloneNode(true) as Element;\n\n const originalAttributes: NamedNodeMap = clonedOriginal.attributes;\n\n const originalAttrMap: Record = {};\n for (const attr of originalAttributes) {\n attr.value && (originalAttrMap[attr.name] = attr.value);\n }\n\n // Transform attribute needs to be merged in a particular way\n const { x = 0, y = 0, transform = '' } = useAttrMap;\n const currentTrans = `${transform} ${\n originalAttrMap.transform || ''\n } translate(${x}, ${y})`;\n\n applyViewboxTransform(clonedOriginal);\n\n if (/^svg$/i.test(clonedOriginal.nodeName)) {\n // if is an SVG, create a group and apply all the attributes on top of it\n const el3 = clonedOriginal.ownerDocument.createElementNS(svgNS, 'g');\n Object.entries(originalAttrMap).forEach(([name, value]) =>\n el3.setAttributeNS(svgNS, name, value),\n );\n el3.append(...clonedOriginal.childNodes);\n clonedOriginal = el3;\n }\n\n for (const attr of useAttributes) {\n if (!attr) {\n continue;\n }\n const { name, value } = attr;\n if (skipAttributes.includes(name)) {\n continue;\n }\n\n if (name === 'style') {\n // when use has a style, merge the two styles, with the ref being priority (not use)\n // priority is by feature. an attribute for fill on the original element\n // will overwrite the fill in style or attribute for tha use\n const styleRecord: Record = {};\n parseStyleString(value, styleRecord);\n // cleanup styleRecord from attributes of original\n Object.entries(originalAttrMap).forEach(([name, value]) => {\n styleRecord[name] = value;\n });\n // now we can put in the style of the original that will overwrite the original attributes\n parseStyleString(originalAttrMap.style || '', styleRecord);\n const mergedStyles = Object.entries(styleRecord)\n .map((entry) => entry.join(':'))\n .join(';');\n clonedOriginal.setAttribute(name, mergedStyles);\n } else {\n // set the attribute from use element only if the original does not have it already\n !originalAttrMap[name] && clonedOriginal.setAttribute(name, value);\n }\n }\n\n clonedOriginal.setAttribute('transform', currentTrans);\n clonedOriginal.setAttribute('instantiated_by_use', '1');\n clonedOriginal.removeAttribute('id');\n useElement.parentNode!.replaceChild(clonedOriginal, useElement);\n }\n}\n","const gradientsAttrs = [\n 'gradientTransform',\n 'x1',\n 'x2',\n 'y1',\n 'y2',\n 'gradientUnits',\n 'cx',\n 'cy',\n 'r',\n 'fx',\n 'fy',\n];\nconst xlinkAttr = 'xlink:href';\n\nexport function recursivelyParseGradientsXlink(\n doc: Document,\n gradient: Element,\n) {\n const xLink = gradient.getAttribute(xlinkAttr)?.slice(1) || '',\n referencedGradient = doc.getElementById(xLink);\n if (referencedGradient && referencedGradient.getAttribute(xlinkAttr)) {\n recursivelyParseGradientsXlink(doc, referencedGradient as Element);\n }\n if (referencedGradient) {\n gradientsAttrs.forEach((attr) => {\n const value = referencedGradient.getAttribute(attr);\n if (!gradient.hasAttribute(attr) && value) {\n gradient.setAttribute(attr, value);\n }\n });\n if (!gradient.children.length) {\n const referenceClone = referencedGradient.cloneNode(true);\n while (referenceClone.firstChild) {\n gradient.appendChild(referenceClone.firstChild);\n }\n }\n }\n gradient.removeAttribute(xlinkAttr);\n}\n","import { getMultipleNodes } from './getMultipleNodes';\nimport { recursivelyParseGradientsXlink } from './recursivelyParseGradientsXlink';\n\nconst tagArray = [\n 'linearGradient',\n 'radialGradient',\n 'svg:linearGradient',\n 'svg:radialGradient',\n];\n\n/**\n * Parses an SVG document, returning all of the gradient declarations found in it\n * @param {SVGDocument} doc SVG document to parse\n * @return {Object} Gradient definitions; key corresponds to element id, value -- to gradient definition element\n */\nexport function getGradientDefs(\n doc: Document,\n): Record {\n const elList = getMultipleNodes(doc, tagArray);\n const gradientDefs: Record = {};\n let j = elList.length;\n while (j--) {\n const el = elList[j];\n if (el.getAttribute('xlink:href')) {\n recursivelyParseGradientsXlink(doc, el);\n }\n const id = el.getAttribute('id');\n if (id) {\n gradientDefs[id] = el as SVGGradientElement;\n }\n }\n return gradientDefs;\n}\n","import type { CSSRules } from './typedefs';\n\n/**\n * Returns CSS rules for a given SVG document\n * @param {HTMLElement} doc SVG document to parse\n * @return {Object} CSS rules of this document\n */\nexport function getCSSRules(doc: Document) {\n const styles = doc.getElementsByTagName('style');\n const allRules: CSSRules = {};\n\n // very crude parsing of style contents\n for (let i = 0; i < styles.length; i++) {\n const styleContents = (styles[i].textContent || '').replace(\n // remove comments\n /\\/\\*[\\s\\S]*?\\*\\//g,\n '',\n );\n\n if (styleContents.trim() === '') {\n continue;\n }\n // recovers all the rule in this form `body { style code... }`\n // rules = styleContents.match(/[^{]*\\{[\\s\\S]*?\\}/g);\n styleContents\n .split('}')\n // remove empty rules and remove everything if we didn't split in at least 2 pieces\n .filter((rule, index, array) => array.length > 1 && rule.trim())\n // at this point we have hopefully an array of rules `body { style code... `\n .forEach((rule) => {\n // if there is more than one opening bracket and the rule starts with '@', it is likely\n // a nested at-rule like @media, @supports, @scope, etc. Ignore these as the code below\n // can not handle it.\n if (\n (rule.match(/{/g) || []).length > 1 &&\n rule.trim().startsWith('@')\n ) {\n return;\n }\n\n const match = rule.split('{'),\n ruleObj: Record = {},\n declaration = match[1].trim(),\n propertyValuePairs = declaration.split(';').filter(function (pair) {\n return pair.trim();\n });\n\n for (let j = 0; j < propertyValuePairs.length; j++) {\n const pair = propertyValuePairs[j].split(':'),\n property = pair[0].trim(),\n value = pair[1].trim();\n ruleObj[property] = value;\n }\n rule = match[0].trim();\n rule.split(',').forEach((_rule) => {\n _rule = _rule.replace(/^svg/i, '').trim();\n if (_rule === '') {\n return;\n }\n allRules[_rule] = {\n ...(allRules[_rule] || {}),\n ...ruleObj,\n };\n });\n });\n }\n return allRules;\n}\n","import { Gradient } from '../gradient/Gradient';\nimport { Group } from '../shapes/Group';\nimport { FabricImage } from '../shapes/Image';\nimport { classRegistry } from '../ClassRegistry';\nimport {\n invertTransform,\n multiplyTransformMatrices,\n qrDecompose,\n} from '../util/misc/matrix';\nimport { removeTransformMatrixForSvgParsing } from '../util/transform_matrix_removal';\nimport type { FabricObject } from '../shapes/Object/FabricObject';\nimport { Point } from '../Point';\nimport { CENTER, FILL, STROKE } from '../constants';\nimport { getGradientDefs } from './getGradientDefs';\nimport { getCSSRules } from './getCSSRules';\nimport type { LoadImageOptions } from '../util';\nimport type { CSSRules, TSvgReviverCallback } from './typedefs';\nimport type { ParsedViewboxTransform } from './applyViewboxTransform';\nimport type { SVGOptions } from '../gradient';\nimport { getTagName } from './getTagName';\nimport { parseTransformAttribute } from './parseTransformAttribute';\n\nconst findTag = (el: Element) =>\n classRegistry.getSVGClass(getTagName(el).toLowerCase());\n\ntype StorageType = {\n fill: SVGGradientElement;\n stroke: SVGGradientElement;\n clipPath: Element[];\n};\n\ntype NotParsedFabricObject = FabricObject & {\n fill: string;\n stroke: string;\n clipPath?: string;\n clipRule?: CanvasFillRule;\n};\n\nexport class ElementsParser {\n declare elements: Element[];\n declare options: LoadImageOptions & ParsedViewboxTransform;\n declare reviver?: TSvgReviverCallback;\n declare regexUrl: RegExp;\n declare doc: Document;\n declare clipPaths: Record;\n declare gradientDefs: Record;\n declare cssRules: CSSRules;\n\n constructor(\n elements: Element[],\n options: LoadImageOptions & ParsedViewboxTransform,\n reviver: TSvgReviverCallback | undefined,\n doc: Document,\n clipPaths: Record,\n ) {\n this.elements = elements;\n this.options = options;\n this.reviver = reviver;\n this.regexUrl = /^url\\(['\"]?#([^'\"]+)['\"]?\\)/g;\n this.doc = doc;\n this.clipPaths = clipPaths;\n this.gradientDefs = getGradientDefs(doc);\n this.cssRules = getCSSRules(doc);\n }\n\n parse(): Promise> {\n return Promise.all(\n this.elements.map((element) => this.createObject(element)),\n );\n }\n\n async createObject(el: Element): Promise {\n const klass = findTag(el);\n if (klass) {\n const obj: NotParsedFabricObject = await klass.fromElement(\n el,\n this.options,\n this.cssRules,\n );\n this.resolveGradient(obj, el, FILL);\n this.resolveGradient(obj, el, STROKE);\n if (obj instanceof FabricImage && obj._originalElement) {\n removeTransformMatrixForSvgParsing(\n obj,\n obj.parsePreserveAspectRatioAttribute(),\n );\n } else {\n removeTransformMatrixForSvgParsing(obj);\n }\n await this.resolveClipPath(obj, el);\n this.reviver && this.reviver(el, obj);\n return obj;\n }\n return null;\n }\n\n extractPropertyDefinition(\n obj: NotParsedFabricObject,\n property: 'fill' | 'stroke' | 'clipPath',\n storage: Record,\n ): StorageType[typeof property] | undefined {\n const value = obj[property]!,\n regex = this.regexUrl;\n if (!regex.test(value)) {\n return undefined;\n }\n // verify: can we remove the 'g' flag? and remove lastIndex changes?\n regex.lastIndex = 0;\n // we passed the regex test, so we know is not null;\n const id = regex.exec(value)![1];\n regex.lastIndex = 0;\n // @todo fix this\n return storage[id];\n }\n\n resolveGradient(\n obj: NotParsedFabricObject,\n el: Element,\n property: 'fill' | 'stroke',\n ) {\n const gradientDef = this.extractPropertyDefinition(\n obj,\n property,\n this.gradientDefs,\n ) as SVGGradientElement;\n if (gradientDef) {\n const opacityAttr = el.getAttribute(property + '-opacity');\n const gradient = Gradient.fromElement(gradientDef, obj, {\n ...this.options,\n opacity: opacityAttr,\n } as SVGOptions);\n obj.set(property, gradient);\n }\n }\n\n // TODO: resolveClipPath could be run once per clippath with minor work per object.\n // is a refactor that i m not sure is worth on this code\n async resolveClipPath(\n obj: NotParsedFabricObject,\n usingElement: Element,\n exactOwner?: Element,\n ) {\n const clipPathElements = this.extractPropertyDefinition(\n obj,\n 'clipPath',\n this.clipPaths,\n ) as Element[];\n if (clipPathElements) {\n const objTransformInv = invertTransform(obj.calcTransformMatrix());\n const clipPathTag = clipPathElements[0].parentElement!;\n let clipPathOwner = usingElement;\n while (\n !exactOwner &&\n clipPathOwner.parentElement &&\n clipPathOwner.getAttribute('clip-path') !== obj.clipPath\n ) {\n clipPathOwner = clipPathOwner.parentElement;\n }\n // move the clipPath tag as sibling to the real element that is using it\n clipPathOwner.parentElement!.appendChild(clipPathTag);\n\n // this multiplication order could be opposite.\n // but i don't have an svg to test it\n // at the first SVG that has a transform on both places and is misplaced\n // try to invert this multiplication order\n const finalTransform = parseTransformAttribute(\n `${clipPathOwner.getAttribute('transform') || ''} ${\n clipPathTag.getAttribute('originalTransform') || ''\n }`,\n );\n\n clipPathTag.setAttribute(\n 'transform',\n `matrix(${finalTransform.join(',')})`,\n );\n\n const container = await Promise.all(\n clipPathElements.map((clipPathElement) => {\n return findTag(clipPathElement)\n .fromElement(clipPathElement, this.options, this.cssRules)\n .then((enlivedClippath: NotParsedFabricObject) => {\n removeTransformMatrixForSvgParsing(enlivedClippath);\n enlivedClippath.fillRule = enlivedClippath.clipRule!;\n delete enlivedClippath.clipRule;\n return enlivedClippath;\n });\n }),\n );\n const clipPath =\n container.length === 1 ? container[0] : new Group(container);\n const gTransform = multiplyTransformMatrices(\n objTransformInv,\n clipPath.calcTransformMatrix(),\n );\n if (clipPath.clipPath) {\n await this.resolveClipPath(\n clipPath,\n clipPathOwner,\n // this is tricky.\n // it tries to differentiate from when clipPaths are inherited by outside groups\n // or when are really clipPaths referencing other clipPaths\n clipPathTag.getAttribute('clip-path') ? clipPathOwner : undefined,\n );\n }\n const { scaleX, scaleY, angle, skewX, translateX, translateY } =\n qrDecompose(gTransform);\n clipPath.set({\n flipX: false,\n flipY: false,\n });\n clipPath.set({\n scaleX,\n scaleY,\n angle,\n skewX,\n skewY: 0,\n });\n clipPath.setPositionByOrigin(\n new Point(translateX, translateY),\n CENTER,\n CENTER,\n );\n obj.clipPath = clipPath;\n } else {\n // if clip-path does not resolve to any element, delete the property.\n delete obj.clipPath;\n return;\n }\n }\n}\n","import { applyViewboxTransform } from './applyViewboxTransform';\nimport { svgValidTagNamesRegEx } from './constants';\nimport { hasInvalidAncestor } from './hasInvalidAncestor';\nimport { parseUseDirectives } from './parseUseDirectives';\nimport type { SVGParsingOutput, TSvgReviverCallback } from './typedefs';\nimport type { LoadImageOptions } from '../util/misc/objectEnlive';\nimport { ElementsParser } from './elements_parser';\nimport { log, SignalAbortedError } from '../util/internals/console';\nimport { getTagName } from './getTagName';\n\nconst isValidSvgTag = (el: Element) =>\n svgValidTagNamesRegEx.test(getTagName(el));\n\nexport const createEmptyResponse = (): SVGParsingOutput => ({\n objects: [],\n elements: [],\n options: {},\n allElements: [],\n});\n\n/**\n * Parses an SVG document, converts it to an array of corresponding fabric.* instances and passes them to a callback\n * @static\n * @function\n * @param {HTMLElement} doc SVG document to parse\n * @param {TSvgParsedCallback} callback Invoked when the parsing is done, with null if parsing wasn't possible with the list of svg nodes.\n * @param {TSvgReviverCallback} [reviver] Extra callback for further parsing of SVG elements, called after each fabric object has been created.\n * Takes as input the original svg element and the generated `FabricObject` as arguments. Used to inspect extra properties not parsed by fabric,\n * or extra custom manipulation\n * @param {Object} [options] Object containing options for parsing\n * @param {String} [options.crossOrigin] crossOrigin setting to use for external resources\n * @param {AbortSignal} [options.signal] handle aborting, see https://developer.mozilla.org/en-US/docs/Web/API/AbortController/signal\n * @return {SVGParsingOutput}\n * {@link SVGParsingOutput} also receives `allElements` array as the last argument. This is the full list of svg nodes available in the document.\n * You may want to use it if you are trying to regroup the objects as they were originally grouped in the SVG. ( This was the reason why it was added )\n */\nexport async function parseSVGDocument(\n doc: Document,\n reviver?: TSvgReviverCallback,\n { crossOrigin, signal }: LoadImageOptions = {},\n): Promise {\n if (signal && signal.aborted) {\n log('log', new SignalAbortedError('parseSVGDocument'));\n // this is an unhappy path, we dont care about speed\n return createEmptyResponse();\n }\n const documentElement = doc.documentElement;\n parseUseDirectives(doc);\n\n const descendants = Array.from(documentElement.getElementsByTagName('*')),\n options = {\n ...applyViewboxTransform(documentElement),\n crossOrigin,\n signal,\n };\n const elements = descendants.filter((el) => {\n applyViewboxTransform(el);\n return isValidSvgTag(el) && !hasInvalidAncestor(el); // http://www.w3.org/TR/SVG/struct.html#DefsElement\n });\n if (!elements || (elements && !elements.length)) {\n return {\n ...createEmptyResponse(),\n options,\n allElements: descendants,\n };\n }\n const localClipPaths: Record = {};\n descendants\n .filter((el) => getTagName(el) === 'clipPath')\n .forEach((el) => {\n el.setAttribute('originalTransform', el.getAttribute('transform') || '');\n const id = el.getAttribute('id')!;\n localClipPaths[id] = Array.from(el.getElementsByTagName('*')).filter(\n (el) => isValidSvgTag(el),\n );\n });\n\n // Precedence of rules: style > class > attribute\n const elementParser = new ElementsParser(\n elements,\n options,\n reviver,\n doc,\n localClipPaths,\n );\n\n const instances = await elementParser.parse();\n\n return {\n objects: instances,\n elements,\n options,\n allElements: descendants,\n };\n}\n","import { getFabricWindow } from '../env';\nimport type { LoadImageOptions } from '../util/misc/objectEnlive';\nimport { parseSVGDocument } from './parseSVGDocument';\nimport type { SVGParsingOutput, TSvgReviverCallback } from './typedefs';\n\n/**\n * Takes string corresponding to an SVG document, and parses it into a set of fabric objects\n * @param {String} string representing the svg\n * @param {TSvgParsedCallback} callback Invoked when the parsing is done, with null if parsing wasn't possible with the list of svg nodes.\n * {@link TSvgParsedCallback} also receives `allElements` array as the last argument. This is the full list of svg nodes available in the document.\n * You may want to use it if you are trying to regroup the objects as they were originally grouped in the SVG. ( This was the reason why it was added )\n * @param {TSvgReviverCallback} [reviver] Extra callback for further parsing of SVG elements, called after each fabric object has been created.\n * Takes as input the original svg element and the generated `FabricObject` as arguments. Used to inspect extra properties not parsed by fabric,\n * or extra custom manipulation\n * @param {Object} [options] Object containing options for parsing\n * @param {String} [options.crossOrigin] crossOrigin setting to use for external resources\n * @param {AbortSignal} [options.signal] handle aborting, see https://developer.mozilla.org/en-US/docs/Web/API/AbortController/signal\n */\nexport function loadSVGFromString(\n string: string,\n reviver?: TSvgReviverCallback,\n options?: LoadImageOptions,\n): Promise {\n const parser = new (getFabricWindow().DOMParser)(),\n // should we use `image/svg+xml` here?\n doc = parser.parseFromString(string.trim(), 'text/xml');\n return parseSVGDocument(doc, reviver, options);\n}\n","import { createEmptyResponse } from './parseSVGDocument';\nimport { loadSVGFromString } from './loadSVGFromString';\nimport type { SVGParsingOutput, TSvgReviverCallback } from './typedefs';\nimport type { LoadImageOptions } from '../util/misc/objectEnlive';\nimport { FabricError } from '../util/internals/console';\n\n/**\n * Takes url corresponding to an SVG document, and parses it into a set of fabric objects.\n * Note that SVG is fetched via fetch API, so it needs to conform to SOP (Same Origin Policy)\n * @param {string} url where the SVG is\n * @param {TSvgParsedCallback} callback Invoked when the parsing is done, with null if parsing wasn't possible with the list of svg nodes.\n * {@link TSvgParsedCallback} also receives `allElements` array as the last argument. This is the full list of svg nodes available in the document.\n * You may want to use it if you are trying to regroup the objects as they were originally grouped in the SVG. ( This was the reason why it was added )\n * @param {TSvgReviverCallback} [reviver] Extra callback for further parsing of SVG elements, called after each fabric object has been created.\n * Takes as input the original svg element and the generated `FabricObject` as arguments. Used to inspect extra properties not parsed by fabric,\n * or extra custom manipulation\n * @param {Object} [options] Object containing options for parsing\n * @param {String} [options.crossOrigin] crossOrigin setting to use for external resources\n * @param {AbortSignal} [options.signal] handle aborting, see https://developer.mozilla.org/en-US/docs/Web/API/AbortController/signal\n */\nexport function loadSVGFromURL(\n url: string,\n reviver?: TSvgReviverCallback,\n options: LoadImageOptions = {},\n): Promise {\n return fetch(url.replace(/^\\n\\s*/, '').trim(), {\n signal: options.signal,\n })\n .then((response) => {\n if (!response.ok) {\n throw new FabricError(`HTTP error! status: ${response.status}`);\n }\n return response.text();\n })\n .then((svgText) => {\n return loadSVGFromString(svgText, reviver, options);\n })\n .catch(() => {\n // this is an unhappy path, we dont care about speed\n return createEmptyResponse();\n });\n}\n","import { Point } from '../Point';\nimport { Control } from './Control';\nimport type { TMat2D } from '../typedefs';\nimport type { Polyline } from '../shapes/Polyline';\nimport { multiplyTransformMatrices } from '../util/misc/matrix';\nimport type {\n TModificationEvents,\n TPointerEvent,\n Transform,\n TransformActionHandler,\n} from '../EventTypeDefs';\nimport { wrapWithFireEvent } from './wrapWithFireEvent';\nimport { sendPointToPlane } from '../util/misc/planeChange';\nimport { MODIFY_POLY } from '../constants';\n\nconst ACTION_NAME: TModificationEvents = MODIFY_POLY;\n\ntype TTransformAnchor = Transform & { pointIndex: number };\n\n/**\n * This function locates the controls.\n * It'll be used both for drawing and for interaction.\n */\nexport const createPolyPositionHandler = (pointIndex: number) => {\n return function (dim: Point, finalMatrix: TMat2D, polyObject: Polyline) {\n const { points, pathOffset } = polyObject;\n return new Point(points[pointIndex])\n .subtract(pathOffset)\n .transform(\n multiplyTransformMatrices(\n polyObject.getViewportTransform(),\n polyObject.calcTransformMatrix(),\n ),\n );\n };\n};\n\n/**\n * This function defines what the control does.\n * It'll be called on every mouse move after a control has been clicked and is being dragged.\n * The function receives as argument the mouse event, the current transform object\n * and the current position in canvas coordinate `transform.target` is a reference to the\n * current object being transformed.\n */\nexport const polyActionHandler = (\n eventData: TPointerEvent,\n transform: TTransformAnchor,\n x: number,\n y: number,\n) => {\n const { target, pointIndex } = transform;\n const poly = target as Polyline;\n const mouseLocalPosition = sendPointToPlane(\n new Point(x, y),\n undefined,\n poly.calcOwnMatrix(),\n );\n\n poly.points[pointIndex] = mouseLocalPosition.add(poly.pathOffset);\n poly.setDimensions();\n poly.set('dirty', true);\n return true;\n};\n\n/**\n * Keep the polygon in the same position when we change its `width`/`height`/`top`/`left`.\n */\nexport const factoryPolyActionHandler = (\n pointIndex: number,\n fn: TransformActionHandler,\n) => {\n return function (\n eventData: TPointerEvent,\n transform: Transform,\n x: number,\n y: number,\n ) {\n const poly = transform.target as Polyline,\n anchorPoint = new Point(\n poly.points[(pointIndex > 0 ? pointIndex : poly.points.length) - 1],\n ),\n anchorPointInParentPlane = anchorPoint\n .subtract(poly.pathOffset)\n .transform(poly.calcOwnMatrix()),\n actionPerformed = fn(eventData, { ...transform, pointIndex }, x, y);\n\n const newAnchorPointInParentPlane = anchorPoint\n .subtract(poly.pathOffset)\n .transform(poly.calcOwnMatrix());\n\n const diff = newAnchorPointInParentPlane.subtract(anchorPointInParentPlane);\n poly.left -= diff.x;\n poly.top -= diff.y;\n\n return actionPerformed;\n };\n};\n\nexport const createPolyActionHandler = (pointIndex: number) =>\n wrapWithFireEvent(\n ACTION_NAME,\n factoryPolyActionHandler(pointIndex, polyActionHandler),\n );\n\nexport function createPolyControls(\n poly: Polyline,\n options?: Partial,\n): Record;\nexport function createPolyControls(\n numOfControls: number,\n options?: Partial,\n): Record;\nexport function createPolyControls(\n arg0: number | Polyline,\n options: Partial = {},\n) {\n const controls = {} as Record;\n for (\n let idx = 0;\n idx < (typeof arg0 === 'number' ? arg0 : arg0.points.length);\n idx++\n ) {\n controls[`p${idx}`] = new Control({\n actionName: ACTION_NAME,\n positionHandler: createPolyPositionHandler(idx),\n actionHandler: createPolyActionHandler(idx),\n ...options,\n });\n }\n return controls;\n}\n","import { Point } from '../Point';\nimport { Control } from './Control';\nimport type { TMat2D } from '../typedefs';\nimport type { Path } from '../shapes/Path';\nimport { multiplyTransformMatrices } from '../util/misc/matrix';\nimport type {\n TModificationEvents,\n TPointerEvent,\n Transform,\n} from '../EventTypeDefs';\nimport { sendPointToPlane } from '../util/misc/planeChange';\nimport type { TSimpleParseCommandType } from '../util/path/typedefs';\nimport type { ControlRenderingStyleOverride } from './controlRendering';\nimport { fireEvent } from './fireEvent';\nimport { commonEventInfo } from './util';\n\nconst ACTION_NAME: TModificationEvents = 'modifyPath' as const;\n\ntype TTransformAnchor = Transform;\n\nexport type PathPointControlStyle = {\n controlFill?: string;\n controlStroke?: string;\n connectionDashArray?: number[];\n};\n\nconst calcPathPointPosition = (\n pathObject: Path,\n commandIndex: number,\n pointIndex: number,\n) => {\n const { path, pathOffset } = pathObject;\n const command = path[commandIndex];\n return new Point(\n (command[pointIndex] as number) - pathOffset.x,\n (command[pointIndex + 1] as number) - pathOffset.y,\n ).transform(\n multiplyTransformMatrices(\n pathObject.getViewportTransform(),\n pathObject.calcTransformMatrix(),\n ),\n );\n};\n\nconst movePathPoint = (\n pathObject: Path,\n x: number,\n y: number,\n commandIndex: number,\n pointIndex: number,\n) => {\n const { path, pathOffset } = pathObject;\n\n const anchorCommand =\n path[(commandIndex > 0 ? commandIndex : path.length) - 1];\n const anchorPoint = new Point(\n anchorCommand[pointIndex] as number,\n anchorCommand[pointIndex + 1] as number,\n );\n\n const anchorPointInParentPlane = anchorPoint\n .subtract(pathOffset)\n .transform(pathObject.calcOwnMatrix());\n\n const mouseLocalPosition = sendPointToPlane(\n new Point(x, y),\n undefined,\n pathObject.calcOwnMatrix(),\n );\n\n path[commandIndex][pointIndex] = mouseLocalPosition.x + pathOffset.x;\n path[commandIndex][pointIndex + 1] = mouseLocalPosition.y + pathOffset.y;\n pathObject.setDimensions();\n\n const newAnchorPointInParentPlane = anchorPoint\n .subtract(pathObject.pathOffset)\n .transform(pathObject.calcOwnMatrix());\n\n const diff = newAnchorPointInParentPlane.subtract(anchorPointInParentPlane);\n pathObject.left -= diff.x;\n pathObject.top -= diff.y;\n pathObject.set('dirty', true);\n return true;\n};\n\n/**\n * This function locates the controls.\n * It'll be used both for drawing and for interaction.\n */\nfunction pathPositionHandler(\n this: PathPointControl,\n dim: Point,\n finalMatrix: TMat2D,\n pathObject: Path,\n) {\n const { commandIndex, pointIndex } = this;\n return calcPathPointPosition(pathObject, commandIndex, pointIndex);\n}\n\n/**\n * This function defines what the control does.\n * It'll be called on every mouse move after a control has been clicked and is being dragged.\n * The function receives as argument the mouse event, the current transform object\n * and the current position in canvas coordinate `transform.target` is a reference to the\n * current object being transformed.\n */\nfunction pathActionHandler(\n this: PathPointControl,\n eventData: TPointerEvent,\n transform: TTransformAnchor,\n x: number,\n y: number,\n) {\n const { target } = transform;\n const { commandIndex, pointIndex } = this;\n const actionPerformed = movePathPoint(\n target as Path,\n x,\n y,\n commandIndex,\n pointIndex,\n );\n if (actionPerformed) {\n fireEvent(this.actionName as TModificationEvents, {\n ...commonEventInfo(eventData, transform, x, y),\n commandIndex,\n pointIndex,\n });\n }\n return actionPerformed;\n}\n\nconst indexFromPrevCommand = (previousCommandType: TSimpleParseCommandType) =>\n previousCommandType === 'C' ? 5 : previousCommandType === 'Q' ? 3 : 1;\n\nclass PathPointControl extends Control {\n declare commandIndex: number;\n declare pointIndex: number;\n declare controlFill: string;\n declare controlStroke: string;\n constructor(options?: Partial) {\n super(options);\n }\n\n render(\n ctx: CanvasRenderingContext2D,\n left: number,\n top: number,\n styleOverride: ControlRenderingStyleOverride | undefined,\n fabricObject: Path,\n ) {\n const overrides: ControlRenderingStyleOverride = {\n ...styleOverride,\n cornerColor: this.controlFill,\n cornerStrokeColor: this.controlStroke,\n transparentCorners: !this.controlFill,\n };\n super.render(ctx, left, top, overrides, fabricObject);\n }\n}\n\nclass PathControlPointControl extends PathPointControl {\n declare connectionDashArray?: number[];\n declare connectToCommandIndex: number;\n declare connectToPointIndex: number;\n constructor(options?: Partial) {\n super(options);\n }\n\n render(\n this: PathControlPointControl,\n ctx: CanvasRenderingContext2D,\n left: number,\n top: number,\n styleOverride: ControlRenderingStyleOverride | undefined,\n fabricObject: Path,\n ) {\n const { path } = fabricObject;\n const {\n commandIndex,\n pointIndex,\n connectToCommandIndex,\n connectToPointIndex,\n } = this;\n ctx.save();\n ctx.strokeStyle = this.controlStroke;\n if (this.connectionDashArray) {\n ctx.setLineDash(this.connectionDashArray);\n }\n const [commandType] = path[commandIndex];\n const point = calcPathPointPosition(\n fabricObject,\n connectToCommandIndex,\n connectToPointIndex,\n );\n\n if (commandType === 'Q') {\n // one control point connects to 2 points\n const point2 = calcPathPointPosition(\n fabricObject,\n commandIndex,\n pointIndex + 2,\n );\n ctx.moveTo(point2.x, point2.y);\n ctx.lineTo(left, top);\n } else {\n ctx.moveTo(left, top);\n }\n ctx.lineTo(point.x, point.y);\n ctx.stroke();\n ctx.restore();\n\n super.render(ctx, left, top, styleOverride, fabricObject);\n }\n}\n\nconst createControl = (\n commandIndexPos: number,\n pointIndexPos: number,\n isControlPoint: boolean,\n options: Partial & {\n controlPointStyle?: PathPointControlStyle;\n pointStyle?: PathPointControlStyle;\n },\n connectToCommandIndex?: number,\n connectToPointIndex?: number,\n) =>\n new (isControlPoint ? PathControlPointControl : PathPointControl)({\n commandIndex: commandIndexPos,\n pointIndex: pointIndexPos,\n actionName: ACTION_NAME,\n positionHandler: pathPositionHandler,\n actionHandler: pathActionHandler,\n connectToCommandIndex,\n connectToPointIndex,\n ...options,\n ...(isControlPoint ? options.controlPointStyle : options.pointStyle),\n } as Partial);\n\nexport function createPathControls(\n path: Path,\n options: Partial & {\n controlPointStyle?: PathPointControlStyle;\n pointStyle?: PathPointControlStyle;\n } = {},\n): Record {\n const controls = {} as Record;\n let previousCommandType: TSimpleParseCommandType = 'M';\n path.path.forEach((command, commandIndex) => {\n const commandType = command[0];\n\n if (commandType !== 'Z') {\n controls[`c_${commandIndex}_${commandType}`] = createControl(\n commandIndex,\n command.length - 2,\n false,\n options,\n );\n }\n switch (commandType) {\n case 'C':\n controls[`c_${commandIndex}_C_CP_1`] = createControl(\n commandIndex,\n 1,\n true,\n options,\n commandIndex - 1,\n indexFromPrevCommand(previousCommandType),\n );\n controls[`c_${commandIndex}_C_CP_2`] = createControl(\n commandIndex,\n 3,\n true,\n options,\n commandIndex,\n 5,\n );\n break;\n case 'Q':\n controls[`c_${commandIndex}_Q_CP_1`] = createControl(\n commandIndex,\n 1,\n true,\n options,\n commandIndex,\n 3,\n );\n break;\n }\n previousCommandType = commandType;\n });\n return controls;\n}\n","import { getFabricWindow } from '../env';\nimport { createCanvasElement, createCanvasElementFor } from '../util/misc/dom';\nimport { WebGLFilterBackend } from './WebGLFilterBackend';\nimport type { TWebGLPipelineState, T2DPipelineState } from './typedefs';\n\nexport const isWebGLPipelineState = (\n options: TWebGLPipelineState | T2DPipelineState,\n): options is TWebGLPipelineState => {\n return (options as TWebGLPipelineState).webgl !== undefined;\n};\n\n/**\n * Pick a method to copy data from GL context to 2d canvas. In some browsers using\n * drawImage should be faster, but is also bugged for a small combination of old hardware\n * and drivers.\n * putImageData is faster than drawImage for that specific operation.\n */\nexport const isPutImageFaster = (width: number, height: number): boolean => {\n const targetCanvas = createCanvasElementFor({ width, height });\n const sourceCanvas = createCanvasElement();\n const gl = sourceCanvas.getContext('webgl')!;\n // eslint-disable-next-line no-undef\n const imageBuffer = new ArrayBuffer(width * height * 4);\n\n const testContext = {\n imageBuffer: imageBuffer,\n } as unknown as Required;\n const testPipelineState = {\n destinationWidth: width,\n destinationHeight: height,\n targetCanvas: targetCanvas,\n } as unknown as TWebGLPipelineState;\n let startTime;\n\n startTime = getFabricWindow().performance.now();\n WebGLFilterBackend.prototype.copyGLTo2D.call(\n testContext,\n gl,\n testPipelineState,\n );\n const drawImageTime = getFabricWindow().performance.now() - startTime;\n\n startTime = getFabricWindow().performance.now();\n WebGLFilterBackend.prototype.copyGLTo2DPutImageData.call(\n testContext,\n gl,\n testPipelineState,\n );\n const putImageDataTime = getFabricWindow().performance.now() - startTime;\n\n return drawImageTime > putImageDataTime;\n};\n","export const highPsourceCode = `precision highp float`;\n\nexport const identityFragmentShader = `\n ${highPsourceCode};\n varying vec2 vTexCoord;\n uniform sampler2D uTexture;\n void main() {\n gl_FragColor = texture2D(uTexture, vTexCoord);\n }`;\n\nexport const vertexSource = `\n attribute vec2 aPosition;\n varying vec2 vTexCoord;\n void main() {\n vTexCoord = aPosition;\n gl_Position = vec4(aPosition * 2.0 - 1.0, 0.0, 1.0);\n }`;\n","import { getEnv } from '../env';\nimport type {\n T2DPipelineState,\n TWebGLAttributeLocationMap,\n TWebGLPipelineState,\n TWebGLProgramCacheItem,\n TWebGLUniformLocationMap,\n} from './typedefs';\nimport { isWebGLPipelineState } from './utils';\nimport {\n highPsourceCode,\n identityFragmentShader,\n vertexSource,\n} from './shaders/baseFilter';\nimport type { Abortable } from '../typedefs';\nimport { FabricError } from '../util/internals/console';\nimport { createCanvasElementFor } from '../util/misc/dom';\n\nconst regex = new RegExp(highPsourceCode, 'g');\n\nexport class BaseFilter<\n Name extends string,\n OwnProps extends Record = object,\n SerializedProps extends Record = OwnProps,\n> {\n /**\n * Filter type\n */\n get type(): Name {\n return (this.constructor as typeof BaseFilter).type as Name;\n }\n\n /**\n * The class type. Used to identify which class this is.\n * This is used for serialization purposes and internally it can be used\n * to identify classes. As a developer you could use `instance of Class`\n * but to avoid importing all the code and blocking tree shaking we try\n * to avoid doing that.\n */\n static type = 'BaseFilter';\n\n /**\n * Contains the uniform locations for the fragment shader.\n * uStepW and uStepH are handled by the BaseFilter, each filter class\n * needs to specify all the one that are needed\n */\n static uniformLocations: string[] = [];\n\n declare static defaults: Record;\n\n /**\n * Constructor\n * @param {Object} [options] Options object\n */\n constructor({\n type,\n ...options\n }: { type?: never } & Partial & Record = {}) {\n Object.assign(\n this,\n (this.constructor as typeof BaseFilter).defaults,\n options,\n );\n }\n\n protected getFragmentSource(): string {\n return identityFragmentShader;\n }\n\n getVertexSource(): string {\n return vertexSource;\n }\n\n /**\n * Compile this filter's shader program.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context to use for shader compilation.\n * @param {String} fragmentSource fragmentShader source for compilation\n * @param {String} vertexSource vertexShader source for compilation\n */\n createProgram(\n gl: WebGLRenderingContext,\n fragmentSource: string = this.getFragmentSource(),\n vertexSource: string = this.getVertexSource(),\n ) {\n const {\n WebGLProbe: { GLPrecision = 'highp' },\n } = getEnv();\n if (GLPrecision !== 'highp') {\n fragmentSource = fragmentSource.replace(\n regex,\n highPsourceCode.replace('highp', GLPrecision),\n );\n }\n const vertexShader = gl.createShader(gl.VERTEX_SHADER);\n const fragmentShader = gl.createShader(gl.FRAGMENT_SHADER);\n const program = gl.createProgram();\n\n if (!vertexShader || !fragmentShader || !program) {\n throw new FabricError(\n 'Vertex, fragment shader or program creation error',\n );\n }\n gl.shaderSource(vertexShader, vertexSource);\n gl.compileShader(vertexShader);\n if (!gl.getShaderParameter(vertexShader, gl.COMPILE_STATUS)) {\n throw new FabricError(\n `Vertex shader compile error for ${this.type}: ${gl.getShaderInfoLog(\n vertexShader,\n )}`,\n );\n }\n\n gl.shaderSource(fragmentShader, fragmentSource);\n gl.compileShader(fragmentShader);\n if (!gl.getShaderParameter(fragmentShader, gl.COMPILE_STATUS)) {\n throw new FabricError(\n `Fragment shader compile error for ${this.type}: ${gl.getShaderInfoLog(\n fragmentShader,\n )}`,\n );\n }\n\n gl.attachShader(program, vertexShader);\n gl.attachShader(program, fragmentShader);\n gl.linkProgram(program);\n if (!gl.getProgramParameter(program, gl.LINK_STATUS)) {\n throw new FabricError(\n `Shader link error for \"${this.type}\" ${gl.getProgramInfoLog(program)}`,\n );\n }\n\n const uniformLocations = this.getUniformLocations(gl, program) || {};\n uniformLocations.uStepW = gl.getUniformLocation(program, 'uStepW');\n uniformLocations.uStepH = gl.getUniformLocation(program, 'uStepH');\n\n return {\n program,\n attributeLocations: this.getAttributeLocations(gl, program),\n uniformLocations,\n };\n }\n\n /**\n * Return a map of attribute names to WebGLAttributeLocation objects.\n *\n * @param {WebGLRenderingContext} gl The canvas context used to compile the shader program.\n * @param {WebGLShaderProgram} program The shader program from which to take attribute locations.\n * @returns {Object} A map of attribute names to attribute locations.\n */\n getAttributeLocations(\n gl: WebGLRenderingContext,\n program: WebGLProgram,\n ): TWebGLAttributeLocationMap {\n return {\n aPosition: gl.getAttribLocation(program, 'aPosition'),\n };\n }\n\n /**\n * Return a map of uniform names to WebGLUniformLocation objects.\n *\n * @param {WebGLRenderingContext} gl The canvas context used to compile the shader program.\n * @param {WebGLShaderProgram} program The shader program from which to take uniform locations.\n * @returns {Object} A map of uniform names to uniform locations.\n */\n getUniformLocations(\n gl: WebGLRenderingContext,\n program: WebGLProgram,\n ): TWebGLUniformLocationMap {\n const locations = (this.constructor as unknown as typeof BaseFilter)\n .uniformLocations;\n\n const uniformLocations: Record = {};\n for (let i = 0; i < locations.length; i++) {\n uniformLocations[locations[i]] = gl.getUniformLocation(\n program,\n locations[i],\n );\n }\n return uniformLocations;\n }\n\n /**\n * Send attribute data from this filter to its shader program on the GPU.\n *\n * @param {WebGLRenderingContext} gl The canvas context used to compile the shader program.\n * @param {Object} attributeLocations A map of shader attribute names to their locations.\n */\n sendAttributeData(\n gl: WebGLRenderingContext,\n attributeLocations: Record,\n aPositionData: Float32Array,\n ) {\n const attributeLocation = attributeLocations.aPosition;\n const buffer = gl.createBuffer();\n gl.bindBuffer(gl.ARRAY_BUFFER, buffer);\n gl.enableVertexAttribArray(attributeLocation);\n gl.vertexAttribPointer(attributeLocation, 2, gl.FLOAT, false, 0, 0);\n gl.bufferData(gl.ARRAY_BUFFER, aPositionData, gl.STATIC_DRAW);\n }\n\n _setupFrameBuffer(options: TWebGLPipelineState) {\n const gl = options.context;\n if (options.passes > 1) {\n const width = options.destinationWidth;\n const height = options.destinationHeight;\n if (options.sourceWidth !== width || options.sourceHeight !== height) {\n gl.deleteTexture(options.targetTexture);\n options.targetTexture = options.filterBackend.createTexture(\n gl,\n width,\n height,\n );\n }\n gl.framebufferTexture2D(\n gl.FRAMEBUFFER,\n gl.COLOR_ATTACHMENT0,\n gl.TEXTURE_2D,\n options.targetTexture,\n 0,\n );\n } else {\n // draw last filter on canvas and not to framebuffer.\n gl.bindFramebuffer(gl.FRAMEBUFFER, null);\n gl.finish();\n }\n }\n\n _swapTextures(options: TWebGLPipelineState) {\n options.passes--;\n options.pass++;\n const temp = options.targetTexture;\n options.targetTexture = options.sourceTexture;\n options.sourceTexture = temp;\n }\n\n /**\n * Generic isNeutral implementation for one parameter based filters.\n * Used only in image applyFilters to discard filters that will not have an effect\n * on the image\n * Other filters may need their own version ( ColorMatrix, HueRotation, gamma, ComposedFilter )\n * @param {Object} options\n **/\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n isNeutralState(options?: any): boolean {\n return false;\n }\n\n /**\n * Apply this filter to the input image data provided.\n *\n * Determines whether to use WebGL or Canvas2D based on the options.webgl flag.\n *\n * @param {Object} options\n * @param {Number} options.passes The number of filters remaining to be executed\n * @param {Boolean} options.webgl Whether to use webgl to render the filter.\n * @param {WebGLTexture} options.sourceTexture The texture setup as the source to be filtered.\n * @param {WebGLTexture} options.targetTexture The texture where filtered output should be drawn.\n * @param {WebGLRenderingContext} options.context The GL context used for rendering.\n * @param {Object} options.programCache A map of compiled shader programs, keyed by filter type.\n */\n applyTo(options: TWebGLPipelineState | T2DPipelineState) {\n if (isWebGLPipelineState(options)) {\n this._setupFrameBuffer(options);\n this.applyToWebGL(options);\n this._swapTextures(options);\n } else {\n this.applyTo2d(options);\n }\n }\n\n applyTo2d(_options: T2DPipelineState): void {\n // override by subclass\n }\n\n /**\n * Returns a string that represent the current selected shader code for the filter.\n * Used to force recompilation when parameters change or to retrieve the shader from cache\n * @type string\n **/\n getCacheKey(): string {\n return this.type;\n }\n\n /**\n * Retrieves the cached shader.\n * @param {Object} options\n * @param {WebGLRenderingContext} options.context The GL context used for rendering.\n * @param {Object} options.programCache A map of compiled shader programs, keyed by filter type.\n * @return {WebGLProgram} the compiled program shader\n */\n retrieveShader(options: TWebGLPipelineState): TWebGLProgramCacheItem {\n const key = this.getCacheKey();\n if (!options.programCache[key]) {\n options.programCache[key] = this.createProgram(options.context);\n }\n return options.programCache[key];\n }\n\n /**\n * Apply this filter using webgl.\n *\n * @param {Object} options\n * @param {Number} options.passes The number of filters remaining to be executed\n * @param {Boolean} options.webgl Whether to use webgl to render the filter.\n * @param {WebGLTexture} options.originalTexture The texture of the original input image.\n * @param {WebGLTexture} options.sourceTexture The texture setup as the source to be filtered.\n * @param {WebGLTexture} options.targetTexture The texture where filtered output should be drawn.\n * @param {WebGLRenderingContext} options.context The GL context used for rendering.\n * @param {Object} options.programCache A map of compiled shader programs, keyed by filter type.\n */\n applyToWebGL(options: TWebGLPipelineState) {\n const gl = options.context;\n const shader = this.retrieveShader(options);\n if (options.pass === 0 && options.originalTexture) {\n gl.bindTexture(gl.TEXTURE_2D, options.originalTexture);\n } else {\n gl.bindTexture(gl.TEXTURE_2D, options.sourceTexture);\n }\n gl.useProgram(shader.program);\n this.sendAttributeData(gl, shader.attributeLocations, options.aPosition);\n\n gl.uniform1f(shader.uniformLocations.uStepW, 1 / options.sourceWidth);\n gl.uniform1f(shader.uniformLocations.uStepH, 1 / options.sourceHeight);\n\n this.sendUniformData(gl, shader.uniformLocations);\n gl.viewport(0, 0, options.destinationWidth, options.destinationHeight);\n gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4);\n }\n\n bindAdditionalTexture(\n gl: WebGLRenderingContext,\n texture: WebGLTexture,\n textureUnit: number,\n ) {\n gl.activeTexture(textureUnit);\n gl.bindTexture(gl.TEXTURE_2D, texture);\n // reset active texture to 0 as usual\n gl.activeTexture(gl.TEXTURE0);\n }\n\n unbindAdditionalTexture(gl: WebGLRenderingContext, textureUnit: number) {\n gl.activeTexture(textureUnit);\n gl.bindTexture(gl.TEXTURE_2D, null);\n gl.activeTexture(gl.TEXTURE0);\n }\n\n /**\n * Send uniform data from this filter to its shader program on the GPU.\n *\n * Intended to be overridden by subclasses.\n *\n * @param {WebGLRenderingContext} _gl The canvas context used to compile the shader program.\n * @param {Object} _uniformLocations A map of shader uniform names to their locations.\n */\n sendUniformData(\n _gl: WebGLRenderingContext,\n _uniformLocations: TWebGLUniformLocationMap,\n ): void {\n // override by subclass\n }\n\n /**\n * If needed by a 2d filter, this functions can create an helper canvas to be used\n * remember that options.targetCanvas is available for use till end of chain.\n */\n createHelpLayer(options: T2DPipelineState) {\n if (!options.helpLayer) {\n const { sourceWidth, sourceHeight } = options;\n const helpLayer = createCanvasElementFor({\n width: sourceWidth,\n height: sourceHeight,\n });\n options.helpLayer = helpLayer;\n }\n }\n\n /**\n * Returns object representation of an instance\n * It will automatically export the default values of a filter,\n * stored in the static defaults property.\n * @return {Object} Object representation of an instance\n */\n toObject(): { type: Name } & SerializedProps {\n const defaultKeys = Object.keys(\n (this.constructor as typeof BaseFilter).defaults || {},\n ) as (keyof SerializedProps)[];\n\n return {\n type: this.type,\n ...defaultKeys.reduce((acc, key) => {\n acc[key] = this[\n key as keyof this\n ] as unknown as (typeof acc)[typeof key];\n return acc;\n }, {} as SerializedProps),\n };\n }\n\n /**\n * Returns a JSON representation of an instance\n * @return {Object} JSON\n */\n toJSON() {\n // delegate, not alias\n return this.toObject();\n }\n\n static async fromObject(\n { type, ...filterOptions }: Record,\n _options?: Abortable,\n ): Promise> {\n return new this(filterOptions);\n }\n}\n","export const blendColorFragmentSource = {\n multiply: 'gl_FragColor.rgb *= uColor.rgb;\\n',\n screen:\n 'gl_FragColor.rgb = 1.0 - (1.0 - gl_FragColor.rgb) * (1.0 - uColor.rgb);\\n',\n add: 'gl_FragColor.rgb += uColor.rgb;\\n',\n difference: 'gl_FragColor.rgb = abs(gl_FragColor.rgb - uColor.rgb);\\n',\n subtract: 'gl_FragColor.rgb -= uColor.rgb;\\n',\n lighten: 'gl_FragColor.rgb = max(gl_FragColor.rgb, uColor.rgb);\\n',\n darken: 'gl_FragColor.rgb = min(gl_FragColor.rgb, uColor.rgb);\\n',\n exclusion:\n 'gl_FragColor.rgb += uColor.rgb - 2.0 * (uColor.rgb * gl_FragColor.rgb);\\n',\n overlay: `\n if (uColor.r < 0.5) {\n gl_FragColor.r *= 2.0 * uColor.r;\n } else {\n gl_FragColor.r = 1.0 - 2.0 * (1.0 - gl_FragColor.r) * (1.0 - uColor.r);\n }\n if (uColor.g < 0.5) {\n gl_FragColor.g *= 2.0 * uColor.g;\n } else {\n gl_FragColor.g = 1.0 - 2.0 * (1.0 - gl_FragColor.g) * (1.0 - uColor.g);\n }\n if (uColor.b < 0.5) {\n gl_FragColor.b *= 2.0 * uColor.b;\n } else {\n gl_FragColor.b = 1.0 - 2.0 * (1.0 - gl_FragColor.b) * (1.0 - uColor.b);\n }\n `,\n tint: `\n gl_FragColor.rgb *= (1.0 - uColor.a);\n gl_FragColor.rgb += uColor.rgb;\n `,\n} as const;\n","import { Color } from '../color/Color';\nimport { BaseFilter } from './BaseFilter';\nimport type { T2DPipelineState, TWebGLUniformLocationMap } from './typedefs';\nimport { classRegistry } from '../ClassRegistry';\nimport { blendColorFragmentSource } from './shaders/blendColor';\n\nexport type TBlendMode =\n | 'multiply'\n | 'add'\n | 'difference'\n | 'screen'\n | 'subtract'\n | 'darken'\n | 'lighten'\n | 'overlay'\n | 'exclusion'\n | 'tint';\n\ntype BlendColorOwnProps = {\n color: string;\n mode: TBlendMode;\n alpha: number;\n};\n\nexport const blendColorDefaultValues: BlendColorOwnProps = {\n color: '#F95C63',\n mode: 'multiply',\n alpha: 1,\n};\n\n/**\n * Color Blend filter class\n * @example\n * const filter = new BlendColor({\n * color: '#000',\n * mode: 'multiply'\n * });\n *\n * const filter = new BlendImage({\n * image: fabricImageObject,\n * mode: 'multiply'\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n * canvas.renderAll();\n */\nexport class BlendColor extends BaseFilter<'BlendColor', BlendColorOwnProps> {\n /**\n * Color to make the blend operation with. default to a reddish color since black or white\n * gives always strong result.\n * @type String\n **/\n declare color: BlendColorOwnProps['color'];\n\n /**\n * Blend mode for the filter: one of multiply, add, difference, screen, subtract,\n * darken, lighten, overlay, exclusion, tint.\n * @type String\n **/\n declare mode: BlendColorOwnProps['mode'];\n /**\n * alpha value. represent the strength of the blend color operation.\n * @type Number\n **/\n declare alpha: BlendColorOwnProps['alpha'];\n\n static defaults = blendColorDefaultValues;\n\n static type = 'BlendColor';\n\n static uniformLocations = ['uColor'];\n\n getCacheKey() {\n return `${this.type}_${this.mode}`;\n }\n\n protected getFragmentSource(): string {\n return `\n precision highp float;\n uniform sampler2D uTexture;\n uniform vec4 uColor;\n varying vec2 vTexCoord;\n void main() {\n vec4 color = texture2D(uTexture, vTexCoord);\n gl_FragColor = color;\n if (color.a > 0.0) {\n ${blendColorFragmentSource[this.mode]}\n }\n }\n `;\n }\n\n /**\n * Apply the Blend operation to a Uint8ClampedArray representing the pixels of an image.\n *\n * @param {Object} options\n * @param {ImageData} options.imageData The Uint8ClampedArray to be filtered.\n */\n applyTo2d({ imageData: { data } }: T2DPipelineState) {\n const source = new Color(this.color).getSource();\n const alpha = this.alpha;\n const tr = source[0] * alpha;\n const tg = source[1] * alpha;\n const tb = source[2] * alpha;\n const alpha1 = 1 - alpha;\n\n for (let i = 0; i < data.length; i += 4) {\n const r = data[i];\n const g = data[i + 1];\n const b = data[i + 2];\n let oR, oG, oB;\n switch (this.mode) {\n case 'multiply':\n oR = (r * tr) / 255;\n oG = (g * tg) / 255;\n oB = (b * tb) / 255;\n break;\n case 'screen':\n oR = 255 - ((255 - r) * (255 - tr)) / 255;\n oG = 255 - ((255 - g) * (255 - tg)) / 255;\n oB = 255 - ((255 - b) * (255 - tb)) / 255;\n break;\n case 'add':\n oR = r + tr;\n oG = g + tg;\n oB = b + tb;\n break;\n case 'difference':\n oR = Math.abs(r - tr);\n oG = Math.abs(g - tg);\n oB = Math.abs(b - tb);\n break;\n case 'subtract':\n oR = r - tr;\n oG = g - tg;\n oB = b - tb;\n break;\n case 'darken':\n oR = Math.min(r, tr);\n oG = Math.min(g, tg);\n oB = Math.min(b, tb);\n break;\n case 'lighten':\n oR = Math.max(r, tr);\n oG = Math.max(g, tg);\n oB = Math.max(b, tb);\n break;\n case 'overlay':\n oR =\n tr < 128\n ? (2 * r * tr) / 255\n : 255 - (2 * (255 - r) * (255 - tr)) / 255;\n oG =\n tg < 128\n ? (2 * g * tg) / 255\n : 255 - (2 * (255 - g) * (255 - tg)) / 255;\n oB =\n tb < 128\n ? (2 * b * tb) / 255\n : 255 - (2 * (255 - b) * (255 - tb)) / 255;\n break;\n case 'exclusion':\n oR = tr + r - (2 * tr * r) / 255;\n oG = tg + g - (2 * tg * g) / 255;\n oB = tb + b - (2 * tb * b) / 255;\n break;\n case 'tint':\n oR = tr + r * alpha1;\n oG = tg + g * alpha1;\n oB = tb + b * alpha1;\n }\n data[i] = oR;\n data[i + 1] = oG;\n data[i + 2] = oB;\n }\n }\n\n /**\n * Send data from this filter to its shader program's uniforms.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n */\n sendUniformData(\n gl: WebGLRenderingContext,\n uniformLocations: TWebGLUniformLocationMap,\n ) {\n const source = new Color(this.color).getSource();\n source[0] = (this.alpha * source[0]) / 255;\n source[1] = (this.alpha * source[1]) / 255;\n source[2] = (this.alpha * source[2]) / 255;\n source[3] = this.alpha;\n gl.uniform4fv(uniformLocations.uColor, source);\n }\n}\n\nclassRegistry.setClass(BlendColor);\n","import type { TBlendImageMode } from '../BlendImage';\n\nexport const fragmentSource: Record = {\n multiply: `\n precision highp float;\n uniform sampler2D uTexture;\n uniform sampler2D uImage;\n uniform vec4 uColor;\n varying vec2 vTexCoord;\n varying vec2 vTexCoord2;\n void main() {\n vec4 color = texture2D(uTexture, vTexCoord);\n vec4 color2 = texture2D(uImage, vTexCoord2);\n color.rgba *= color2.rgba;\n gl_FragColor = color;\n }\n `,\n mask: `\n precision highp float;\n uniform sampler2D uTexture;\n uniform sampler2D uImage;\n uniform vec4 uColor;\n varying vec2 vTexCoord;\n varying vec2 vTexCoord2;\n void main() {\n vec4 color = texture2D(uTexture, vTexCoord);\n vec4 color2 = texture2D(uImage, vTexCoord2);\n color.a = color2.a;\n gl_FragColor = color;\n }\n `,\n} as const;\n\nexport const vertexSource = `\n attribute vec2 aPosition;\n varying vec2 vTexCoord;\n varying vec2 vTexCoord2;\n uniform mat3 uTransformMatrix;\n void main() {\n vTexCoord = aPosition;\n vTexCoord2 = (uTransformMatrix * vec3(aPosition, 1.0)).xy;\n gl_Position = vec4(aPosition * 2.0 - 1.0, 0.0, 1.0);\n }\n ` as const;\n","import { FabricImage } from '../shapes/Image';\nimport { createCanvasElement } from '../util/misc/dom';\nimport { BaseFilter } from './BaseFilter';\nimport type {\n T2DPipelineState,\n TWebGLPipelineState,\n TWebGLUniformLocationMap,\n} from './typedefs';\nimport type { WebGLFilterBackend } from './WebGLFilterBackend';\nimport { classRegistry } from '../ClassRegistry';\nimport { fragmentSource, vertexSource } from './shaders/blendImage';\n\nexport type TBlendImageMode = 'multiply' | 'mask';\n\ntype BlendImageOwnProps = {\n mode: TBlendImageMode;\n alpha: number;\n};\n\nexport const blendImageDefaultValues: BlendImageOwnProps = {\n mode: 'multiply',\n alpha: 1,\n};\n\n/**\n * Image Blend filter class\n * @example\n * const filter = new filters.BlendColor({\n * color: '#000',\n * mode: 'multiply'\n * });\n *\n * const filter = new BlendImage({\n * image: fabricImageObject,\n * mode: 'multiply'\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n * canvas.renderAll();\n */\nexport class BlendImage extends BaseFilter<'BlendImage', BlendImageOwnProps> {\n /**\n * Image to make the blend operation with.\n **/\n declare image: FabricImage;\n\n /**\n * Blend mode for the filter: either 'multiply' or 'mask'. 'multiply' will\n * multiply the values of each channel (R, G, B, and A) of the filter image by\n * their corresponding values in the base image. 'mask' will only look at the\n * alpha channel of the filter image, and apply those values to the base\n * image's alpha channel.\n * @type String\n **/\n declare mode: BlendImageOwnProps['mode'];\n\n /**\n * alpha value. represent the strength of the blend image operation.\n * not implemented.\n **/\n declare alpha: BlendImageOwnProps['alpha'];\n\n static type = 'BlendImage';\n\n static defaults = blendImageDefaultValues;\n\n static uniformLocations = ['uTransformMatrix', 'uImage'];\n\n getCacheKey() {\n return `${this.type}_${this.mode}`;\n }\n\n getFragmentSource(): string {\n return fragmentSource[this.mode];\n }\n\n getVertexSource(): string {\n return vertexSource;\n }\n\n applyToWebGL(options: TWebGLPipelineState) {\n const gl = options.context,\n texture = this.createTexture(options.filterBackend, this.image);\n this.bindAdditionalTexture(gl, texture!, gl.TEXTURE1);\n super.applyToWebGL(options);\n this.unbindAdditionalTexture(gl, gl.TEXTURE1);\n }\n\n createTexture(backend: WebGLFilterBackend, image: FabricImage) {\n return backend.getCachedTexture(image.cacheKey, image.getElement());\n }\n\n /**\n * Calculate a transformMatrix to adapt the image to blend over\n * @param {Object} options\n * @param {WebGLRenderingContext} options.context The GL context used for rendering.\n * @param {Object} options.programCache A map of compiled shader programs, keyed by filter type.\n */\n calculateMatrix() {\n const image = this.image,\n { width, height } = image.getElement();\n return [\n 1 / image.scaleX,\n 0,\n 0,\n 0,\n 1 / image.scaleY,\n 0,\n -image.left / width,\n -image.top / height,\n 1,\n ];\n }\n\n /**\n * Apply the Blend operation to a Uint8ClampedArray representing the pixels of an image.\n *\n * @param {Object} options\n * @param {ImageData} options.imageData The Uint8ClampedArray to be filtered.\n */\n applyTo2d({\n imageData: { data, width, height },\n filterBackend: { resources },\n }: T2DPipelineState) {\n const image = this.image;\n if (!resources.blendImage) {\n resources.blendImage = createCanvasElement();\n }\n const canvas1 = resources.blendImage;\n const context = canvas1.getContext('2d')!;\n if (canvas1.width !== width || canvas1.height !== height) {\n canvas1.width = width;\n canvas1.height = height;\n } else {\n context.clearRect(0, 0, width, height);\n }\n context.setTransform(\n image.scaleX,\n 0,\n 0,\n image.scaleY,\n image.left,\n image.top,\n );\n context.drawImage(image.getElement(), 0, 0, width, height);\n const blendData = context.getImageData(0, 0, width, height).data;\n for (let i = 0; i < data.length; i += 4) {\n const r = data[i];\n const g = data[i + 1];\n const b = data[i + 2];\n const a = data[i + 3];\n\n const tr = blendData[i];\n const tg = blendData[i + 1];\n const tb = blendData[i + 2];\n const ta = blendData[i + 3];\n\n switch (this.mode) {\n case 'multiply':\n data[i] = (r * tr) / 255;\n data[i + 1] = (g * tg) / 255;\n data[i + 2] = (b * tb) / 255;\n data[i + 3] = (a * ta) / 255;\n break;\n case 'mask':\n data[i + 3] = ta;\n break;\n }\n }\n }\n\n /**\n * Send data from this filter to its shader program's uniforms.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n */\n sendUniformData(\n gl: WebGLRenderingContext,\n uniformLocations: TWebGLUniformLocationMap,\n ) {\n const matrix = this.calculateMatrix();\n gl.uniform1i(uniformLocations.uImage, 1); // texture unit 1.\n gl.uniformMatrix3fv(uniformLocations.uTransformMatrix, false, matrix);\n }\n\n /**\n * Returns object representation of an instance\n * TODO: Handle the possibility of missing image better.\n * As of now a BlendImage filter without image can't be used with fromObject\n * @return {Object} Object representation of an instance\n */\n toObject(): {\n type: 'BlendImage';\n image: ReturnType;\n } & BlendImageOwnProps {\n return {\n ...super.toObject(),\n image: this.image && this.image.toObject(),\n };\n }\n\n /**\n * Create filter instance from an object representation\n * @param {object} object Object to create an instance from\n * @param {object} [options]\n * @param {AbortSignal} [options.signal] handle aborting image loading, see https://developer.mozilla.org/en-US/docs/Web/API/AbortController/signal\n * @returns {Promise}\n */\n static async fromObject(\n { type, image, ...filterOptions }: Record,\n options: { signal: AbortSignal },\n ): Promise> {\n return FabricImage.fromObject(image, options).then(\n (enlivedImage) => new this({ ...filterOptions, image: enlivedImage }),\n );\n }\n}\n\nclassRegistry.setClass(BlendImage);\n","export const fragmentSource = `\n precision highp float;\n uniform sampler2D uTexture;\n uniform vec2 uDelta;\n varying vec2 vTexCoord;\n const float nSamples = 15.0;\n vec3 v3offset = vec3(12.9898, 78.233, 151.7182);\n float random(vec3 scale) {\n /* use the fragment position for a different seed per-pixel */\n return fract(sin(dot(gl_FragCoord.xyz, scale)) * 43758.5453);\n }\n void main() {\n vec4 color = vec4(0.0);\n float totalC = 0.0;\n float totalA = 0.0;\n float offset = random(v3offset);\n for (float t = -nSamples; t <= nSamples; t++) {\n float percent = (t + offset - 0.5) / nSamples;\n vec4 sample = texture2D(uTexture, vTexCoord + uDelta * percent);\n float weight = 1.0 - abs(percent);\n float alpha = weight * sample.a;\n color.rgb += sample.rgb * alpha;\n color.a += alpha;\n totalA += weight;\n totalC += alpha;\n }\n gl_FragColor.rgb = color.rgb / totalC;\n gl_FragColor.a = color.a / totalA;\n }\n ` as const;\n","import { BaseFilter } from './BaseFilter';\nimport type {\n TWebGLPipelineState,\n T2DPipelineState,\n TWebGLUniformLocationMap,\n} from './typedefs';\nimport { isWebGLPipelineState } from './utils';\nimport { classRegistry } from '../ClassRegistry';\nimport { fragmentSource } from './shaders/blur';\n\ntype BlurOwnProps = {\n blur: number;\n};\n\nexport const blurDefaultValues: BlurOwnProps = {\n blur: 0,\n};\n\n/**\n * Blur filter class\n * @example\n * const filter = new Blur({\n * blur: 0.5\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n * canvas.renderAll();\n */\nexport class Blur extends BaseFilter<'Blur', BlurOwnProps> {\n /**\n * blur value, in percentage of image dimensions.\n * specific to keep the image blur constant at different resolutions\n * range between 0 and 1.\n * @type Number\n */\n declare blur: BlurOwnProps['blur'];\n\n declare horizontal: boolean;\n declare aspectRatio: number;\n\n static type = 'Blur';\n\n static defaults = blurDefaultValues;\n\n static uniformLocations = ['uDelta'];\n\n getFragmentSource(): string {\n return fragmentSource;\n }\n\n applyTo(options: TWebGLPipelineState | T2DPipelineState) {\n if (isWebGLPipelineState(options)) {\n // this aspectRatio is used to give the same blur to vertical and horizontal\n this.aspectRatio = options.sourceWidth / options.sourceHeight;\n options.passes++;\n this._setupFrameBuffer(options);\n this.horizontal = true;\n this.applyToWebGL(options);\n this._swapTextures(options);\n this._setupFrameBuffer(options);\n this.horizontal = false;\n this.applyToWebGL(options);\n this._swapTextures(options);\n } else {\n this.applyTo2d(options);\n }\n }\n\n applyTo2d({ imageData: { data, width, height } }: T2DPipelineState) {\n // this code mimic the shader for output consistency\n // it samples 31 pixels across the image over a distance that depends from the blur value.\n this.aspectRatio = width / height;\n this.horizontal = true;\n let blurValue = this.getBlurValue() * width;\n const imageData = new Uint8ClampedArray(data);\n const samples = 15;\n const bytesInRow = 4 * width;\n for (let i = 0; i < data.length; i += 4) {\n let r = 0.0,\n g = 0.0,\n b = 0.0,\n a = 0.0,\n totalA = 0;\n const minIRow = i - (i % bytesInRow);\n const maxIRow = minIRow + bytesInRow;\n // for now let's keep noise out of the way\n // let pixelOffset = 0;\n // const offset = Math.random() * 3;\n // if (offset > 2) {\n // pixelOffset = 4;\n // } else if (offset < 1) {\n // pixelOffset = -4;\n // }\n for (let j = -samples + 1; j < samples; j++) {\n const percent = j / samples;\n const distance = Math.floor(blurValue * percent) * 4;\n const weight = 1 - Math.abs(percent);\n let sampledPixel = i + distance; // + pixelOffset;\n // try to implement edge mirroring\n if (sampledPixel < minIRow) {\n sampledPixel = minIRow;\n } else if (sampledPixel > maxIRow) {\n sampledPixel = maxIRow;\n }\n const localAlpha = data[sampledPixel + 3] * weight;\n r += data[sampledPixel] * localAlpha;\n g += data[sampledPixel + 1] * localAlpha;\n b += data[sampledPixel + 2] * localAlpha;\n a += localAlpha;\n totalA += weight;\n }\n imageData[i] = r / a;\n imageData[i + 1] = g / a;\n imageData[i + 2] = b / a;\n imageData[i + 3] = a / totalA;\n }\n this.horizontal = false;\n blurValue = this.getBlurValue() * height;\n for (let i = 0; i < imageData.length; i += 4) {\n let r = 0.0,\n g = 0.0,\n b = 0.0,\n a = 0.0,\n totalA = 0;\n const minIRow = i % bytesInRow;\n const maxIRow = imageData.length - bytesInRow + minIRow;\n // for now let's keep noise out of the way\n // let pixelOffset = 0;\n // const offset = Math.random() * 3;\n // if (offset > 2) {\n // pixelOffset = bytesInRow;\n // } else if (offset < 1) {\n // pixelOffset = -bytesInRow;\n // }\n for (let j = -samples + 1; j < samples; j++) {\n const percent = j / samples;\n const distance = Math.floor(blurValue * percent) * bytesInRow;\n const weight = 1 - Math.abs(percent);\n let sampledPixel = i + distance; // + pixelOffset;\n // try to implement edge mirroring\n if (sampledPixel < minIRow) {\n sampledPixel = minIRow;\n } else if (sampledPixel > maxIRow) {\n sampledPixel = maxIRow;\n }\n const localAlpha = imageData[sampledPixel + 3] * weight;\n r += imageData[sampledPixel] * localAlpha;\n g += imageData[sampledPixel + 1] * localAlpha;\n b += imageData[sampledPixel + 2] * localAlpha;\n a += localAlpha;\n totalA += weight;\n }\n data[i] = r / a;\n data[i + 1] = g / a;\n data[i + 2] = b / a;\n data[i + 3] = a / totalA;\n }\n }\n\n /**\n * Send data from this filter to its shader program's uniforms.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n */\n sendUniformData(\n gl: WebGLRenderingContext,\n uniformLocations: TWebGLUniformLocationMap,\n ) {\n const delta = this.chooseRightDelta();\n gl.uniform2fv(uniformLocations.uDelta, delta);\n }\n\n isNeutralState() {\n return this.blur === 0;\n }\n\n getBlurValue(): number {\n let blurScale = 1;\n const { horizontal, aspectRatio } = this;\n if (horizontal) {\n if (aspectRatio > 1) {\n // image is wide, i want to shrink radius horizontal\n blurScale = 1 / aspectRatio;\n }\n } else {\n if (aspectRatio < 1) {\n // image is tall, i want to shrink radius vertical\n blurScale = aspectRatio;\n }\n }\n return blurScale * this.blur * 0.12;\n }\n\n /**\n * choose right value of image percentage to blur with\n * @returns {Array} a numeric array with delta values\n */\n chooseRightDelta() {\n const blur = this.getBlurValue();\n return this.horizontal ? [blur, 0] : [0, blur];\n }\n}\n\nclassRegistry.setClass(Blur);\n","export const fragmentSource = `\n precision highp float;\n uniform sampler2D uTexture;\n uniform float uBrightness;\n varying vec2 vTexCoord;\n void main() {\n vec4 color = texture2D(uTexture, vTexCoord);\n color.rgb += uBrightness;\n gl_FragColor = color;\n }\n`;\n","import { BaseFilter } from './BaseFilter';\nimport type { T2DPipelineState, TWebGLUniformLocationMap } from './typedefs';\nimport { classRegistry } from '../ClassRegistry';\nimport { fragmentSource } from './shaders/brightness';\n\ntype BrightnessOwnProps = {\n brightness: number;\n};\n\nexport const brightnessDefaultValues: BrightnessOwnProps = {\n brightness: 0,\n};\n\n/**\n * Brightness filter class\n * @example\n * const filter = new Brightness({\n * brightness: 0.05\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n */\nexport class Brightness extends BaseFilter<'Brightness', BrightnessOwnProps> {\n /**\n * Brightness value, from -1 to 1.\n * translated to -255 to 255 for 2d\n * 0.0039215686 is the part of 1 that get translated to 1 in 2d\n * @param {Number} brightness\n */\n declare brightness: BrightnessOwnProps['brightness'];\n\n static type = 'Brightness';\n\n static defaults = brightnessDefaultValues;\n\n static uniformLocations = ['uBrightness'];\n\n getFragmentSource() {\n return fragmentSource;\n }\n\n /**\n * Apply the Brightness operation to a Uint8ClampedArray representing the pixels of an image.\n *\n * @param {Object} options\n * @param {ImageData} options.imageData The Uint8ClampedArray to be filtered.\n */\n applyTo2d({ imageData: { data } }: T2DPipelineState) {\n const brightness = Math.round(this.brightness * 255);\n for (let i = 0; i < data.length; i += 4) {\n data[i] += brightness;\n data[i + 1] += brightness;\n data[i + 2] += brightness;\n }\n }\n\n isNeutralState() {\n return this.brightness === 0;\n }\n\n /**\n * Send data from this filter to its shader program's uniforms.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n */\n sendUniformData(\n gl: WebGLRenderingContext,\n uniformLocations: TWebGLUniformLocationMap,\n ) {\n gl.uniform1f(uniformLocations.uBrightness, this.brightness);\n }\n}\n\nclassRegistry.setClass(Brightness);\n","export const fragmentSource = `\n precision highp float;\n uniform sampler2D uTexture;\n varying vec2 vTexCoord;\n uniform mat4 uColorMatrix;\n uniform vec4 uConstants;\n void main() {\n vec4 color = texture2D(uTexture, vTexCoord);\n color *= uColorMatrix;\n color += uConstants;\n gl_FragColor = color;\n }`;\n","import { BaseFilter } from './BaseFilter';\nimport type {\n T2DPipelineState,\n TMatColorMatrix,\n TWebGLUniformLocationMap,\n} from './typedefs';\nimport { classRegistry } from '../ClassRegistry';\nimport { fragmentSource } from './shaders/colorMatrix';\n\nexport type ColorMatrixOwnProps = {\n matrix: TMatColorMatrix;\n colorsOnly: boolean;\n};\n\nexport const colorMatrixDefaultValues: ColorMatrixOwnProps = {\n matrix: [1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0],\n colorsOnly: true,\n};\n\n/**\n * Color Matrix filter class\n * @see {@link http://fabricjs.com/image-filters|ImageFilters demo}\n * @see {@Link http://phoboslab.org/log/2013/11/fast-image-filters-with-webgl demo}\n * @example Kodachrome filter\n * const filter = new ColorMatrix({\n * matrix: [\n 1.1285582396593525, -0.3967382283601348, -0.03992559172921793, 0, 63.72958762196502,\n -0.16404339962244616, 1.0835251566291304, -0.05498805115633132, 0, 24.732407896706203,\n -0.16786010706155763, -0.5603416277695248, 1.6014850761964943, 0, 35.62982807460946,\n 0, 0, 0, 1, 0\n ]\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n */\nexport class ColorMatrix<\n Name extends string = 'ColorMatrix',\n OwnProps extends object = ColorMatrixOwnProps,\n SerializedProps extends object = ColorMatrixOwnProps,\n> extends BaseFilter {\n /**\n * Colormatrix for pixels.\n * array of 20 floats. Numbers in positions 4, 9, 14, 19 loose meaning\n * outside the -1, 1 range.\n * 0.0039215686 is the part of 1 that get translated to 1 in 2d\n * @param {Array} matrix array of 20 numbers.\n */\n declare matrix: ColorMatrixOwnProps['matrix'];\n\n /**\n * Lock the colormatrix on the color part, skipping alpha, mainly for non webgl scenario\n * to save some calculation\n * @type Boolean\n * @default true\n */\n declare colorsOnly: ColorMatrixOwnProps['colorsOnly'];\n\n static type = 'ColorMatrix';\n\n static defaults = colorMatrixDefaultValues;\n\n static uniformLocations = ['uColorMatrix', 'uConstants'];\n\n getFragmentSource(): string {\n return fragmentSource;\n }\n\n /**\n * Apply the ColorMatrix operation to a Uint8Array representing the pixels of an image.\n *\n * @param {Object} options\n * @param {ImageData} options.imageData The Uint8Array to be filtered.\n */\n applyTo2d(options: T2DPipelineState) {\n const imageData = options.imageData,\n data = imageData.data,\n m = this.matrix,\n colorsOnly = this.colorsOnly;\n\n for (let i = 0; i < data.length; i += 4) {\n const r = data[i];\n const g = data[i + 1];\n const b = data[i + 2];\n\n data[i] = r * m[0] + g * m[1] + b * m[2] + m[4] * 255;\n data[i + 1] = r * m[5] + g * m[6] + b * m[7] + m[9] * 255;\n data[i + 2] = r * m[10] + g * m[11] + b * m[12] + m[14] * 255;\n if (!colorsOnly) {\n const a = data[i + 3];\n data[i] += a * m[3];\n data[i + 1] += a * m[8];\n data[i + 2] += a * m[13];\n data[i + 3] =\n r * m[15] + g * m[16] + b * m[17] + a * m[18] + m[19] * 255;\n }\n }\n }\n\n /**\n * Send data from this filter to its shader program's uniforms.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n */\n sendUniformData(\n gl: WebGLRenderingContext,\n uniformLocations: TWebGLUniformLocationMap,\n ) {\n const m = this.matrix,\n matrix = [\n m[0],\n m[1],\n m[2],\n m[3],\n m[5],\n m[6],\n m[7],\n m[8],\n m[10],\n m[11],\n m[12],\n m[13],\n m[15],\n m[16],\n m[17],\n m[18],\n ],\n constants = [m[4], m[9], m[14], m[19]];\n gl.uniformMatrix4fv(uniformLocations.uColorMatrix, false, matrix);\n gl.uniform4fv(uniformLocations.uConstants, constants);\n }\n\n toObject(): { type: Name } & SerializedProps {\n return {\n ...super.toObject(),\n matrix: [...this.matrix] as TMatColorMatrix,\n };\n }\n}\n\nclassRegistry.setClass(ColorMatrix);\n","import { ColorMatrix } from './ColorMatrix';\nimport { classRegistry } from '../ClassRegistry';\nimport type { TMatColorMatrix } from './typedefs';\n\ntype FixedFiltersOwnProps = {\n colorsOnly: boolean;\n};\n\nexport function createColorMatrixFilter(key: string, matrix: TMatColorMatrix) {\n const newClass = class extends ColorMatrix<\n typeof key,\n FixedFiltersOwnProps,\n FixedFiltersOwnProps\n > {\n static type = key;\n\n static defaults = {\n colorsOnly: false,\n matrix,\n };\n\n toObject(): { type: string } & FixedFiltersOwnProps {\n return { type: this.type, colorsOnly: this.colorsOnly };\n }\n };\n classRegistry.setClass(newClass, key);\n return newClass as typeof ColorMatrix;\n}\n\nexport const Brownie = createColorMatrixFilter(\n 'Brownie',\n [\n 0.5997, 0.34553, -0.27082, 0, 0.186, -0.0377, 0.86095, 0.15059, 0, -0.1449,\n 0.24113, -0.07441, 0.44972, 0, -0.02965, 0, 0, 0, 1, 0,\n ],\n);\n\nexport const Vintage = createColorMatrixFilter(\n 'Vintage',\n [\n 0.62793, 0.32021, -0.03965, 0, 0.03784, 0.02578, 0.64411, 0.03259, 0,\n 0.02926, 0.0466, -0.08512, 0.52416, 0, 0.02023, 0, 0, 0, 1, 0,\n ],\n);\n\nexport const Kodachrome = createColorMatrixFilter(\n 'Kodachrome',\n [\n 1.12855, -0.39673, -0.03992, 0, 0.24991, -0.16404, 1.08352, -0.05498, 0,\n 0.09698, -0.16786, -0.56034, 1.60148, 0, 0.13972, 0, 0, 0, 1, 0,\n ],\n);\n\nexport const Technicolor = createColorMatrixFilter(\n 'Technicolor',\n [\n 1.91252, -0.85453, -0.09155, 0, 0.04624, -0.30878, 1.76589, -0.10601, 0,\n -0.27589, -0.2311, -0.75018, 1.84759, 0, 0.12137, 0, 0, 0, 1, 0,\n ],\n);\n\nexport const Polaroid = createColorMatrixFilter(\n 'Polaroid',\n [\n 1.438, -0.062, -0.062, 0, 0, -0.122, 1.378, -0.122, 0, 0, -0.016, -0.016,\n 1.483, 0, 0, 0, 0, 0, 1, 0,\n ],\n);\n\nexport const Sepia = createColorMatrixFilter(\n 'Sepia',\n [\n 0.393, 0.769, 0.189, 0, 0, 0.349, 0.686, 0.168, 0, 0, 0.272, 0.534, 0.131,\n 0, 0, 0, 0, 0, 1, 0,\n ],\n);\n\nexport const BlackWhite = createColorMatrixFilter(\n 'BlackWhite',\n [\n 1.5, 1.5, 1.5, 0, -1, 1.5, 1.5, 1.5, 0, -1, 1.5, 1.5, 1.5, 0, -1, 0, 0, 0,\n 1, 0,\n ],\n);\n","import { BaseFilter } from './BaseFilter';\nimport type { T2DPipelineState, TWebGLPipelineState } from './typedefs';\nimport { isWebGLPipelineState } from './utils';\nimport { classRegistry } from '../ClassRegistry';\n\ntype ComposedOwnProps = {\n subFilters: BaseFilter[];\n};\n\ntype ComposedSerializedProps = {\n subFilters: Record[];\n};\n\n/**\n * A container class that knows how to apply a sequence of filters to an input image.\n */\nexport class Composed extends BaseFilter<\n 'Composed',\n ComposedOwnProps,\n ComposedSerializedProps\n> {\n /**\n * A non sparse array of filters to apply\n */\n declare subFilters: ComposedOwnProps['subFilters'];\n\n static type = 'Composed';\n\n constructor(\n options: { subFilters?: BaseFilter[] } & Record = {},\n ) {\n super(options);\n this.subFilters = options.subFilters || [];\n }\n\n /**\n * Apply this container's filters to the input image provided.\n *\n * @param {Object} options\n * @param {Number} options.passes The number of filters remaining to be applied.\n */\n applyTo(options: TWebGLPipelineState | T2DPipelineState) {\n if (isWebGLPipelineState(options)) {\n options.passes += this.subFilters.length - 1;\n }\n this.subFilters.forEach((filter) => {\n filter.applyTo(options);\n });\n }\n\n /**\n * Serialize this filter into JSON.\n * @returns {Object} A JSON representation of this filter.\n */\n toObject() {\n return {\n type: this.type,\n subFilters: this.subFilters.map((filter) => filter.toObject()),\n };\n }\n\n isNeutralState() {\n return !this.subFilters.some((filter) => !filter.isNeutralState());\n }\n\n /**\n * Deserialize a JSON definition of a ComposedFilter into a concrete instance.\n * @param {oject} object Object to create an instance from\n * @param {object} [options]\n * @param {AbortSignal} [options.signal] handle aborting `BlendImage` filter loading, see https://developer.mozilla.org/en-US/docs/Web/API/AbortController/signal\n * @returns {Promise}\n */\n static fromObject(\n object: Record,\n options?: { signal: AbortSignal },\n ): Promise {\n return Promise.all(\n ((object.subFilters || []) as BaseFilter[]).map((filter) =>\n classRegistry\n .getClass(filter.type)\n .fromObject(filter, options),\n ),\n ).then((enlivedFilters) => new this({ subFilters: enlivedFilters }));\n }\n}\n\nclassRegistry.setClass(Composed);\n","export const fragmentSource = `\n precision highp float;\n uniform sampler2D uTexture;\n uniform float uContrast;\n varying vec2 vTexCoord;\n void main() {\n vec4 color = texture2D(uTexture, vTexCoord);\n float contrastF = 1.015 * (uContrast + 1.0) / (1.0 * (1.015 - uContrast));\n color.rgb = contrastF * (color.rgb - 0.5) + 0.5;\n gl_FragColor = color;\n }`;\n","import { BaseFilter } from './BaseFilter';\nimport type { T2DPipelineState, TWebGLUniformLocationMap } from './typedefs';\nimport { classRegistry } from '../ClassRegistry';\nimport { fragmentSource } from './shaders/constrast';\n\ntype ContrastOwnProps = {\n contrast: number;\n};\n\nexport const contrastDefaultValues: ContrastOwnProps = {\n contrast: 0,\n};\n\n/**\n * Contrast filter class\n * @example\n * const filter = new Contrast({\n * contrast: 0.25\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n */\nexport class Contrast extends BaseFilter<'Contrast', ContrastOwnProps> {\n /**\n * contrast value, range from -1 to 1.\n * @param {Number} contrast\n * @default 0\n */\n declare contrast: ContrastOwnProps['contrast'];\n\n static type = 'Contrast';\n\n static defaults = contrastDefaultValues;\n\n static uniformLocations = ['uContrast'];\n\n getFragmentSource() {\n return fragmentSource;\n }\n\n isNeutralState() {\n return this.contrast === 0;\n }\n\n /**\n * Apply the Contrast operation to a Uint8Array representing the pixels of an image.\n *\n * @param {Object} options\n * @param {ImageData} options.imageData The Uint8Array to be filtered.\n */\n applyTo2d({ imageData: { data } }: T2DPipelineState) {\n const contrast = Math.floor(this.contrast * 255),\n contrastF = (259 * (contrast + 255)) / (255 * (259 - contrast));\n\n for (let i = 0; i < data.length; i += 4) {\n data[i] = contrastF * (data[i] - 128) + 128;\n data[i + 1] = contrastF * (data[i + 1] - 128) + 128;\n data[i + 2] = contrastF * (data[i + 2] - 128) + 128;\n }\n }\n\n /**\n * Send data from this filter to its shader program's uniforms.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n */\n sendUniformData(\n gl: WebGLRenderingContext,\n uniformLocations: TWebGLUniformLocationMap,\n ) {\n gl.uniform1f(uniformLocations.uContrast, this.contrast);\n }\n}\n\nclassRegistry.setClass(Contrast);\n","export const fragmentSource = {\n Convolute_3_1: `\n precision highp float;\n uniform sampler2D uTexture;\n uniform float uMatrix[9];\n uniform float uStepW;\n uniform float uStepH;\n varying vec2 vTexCoord;\n void main() {\n vec4 color = vec4(0, 0, 0, 0);\n for (float h = 0.0; h < 3.0; h+=1.0) {\n for (float w = 0.0; w < 3.0; w+=1.0) {\n vec2 matrixPos = vec2(uStepW * (w - 1), uStepH * (h - 1));\n color += texture2D(uTexture, vTexCoord + matrixPos) * uMatrix[int(h * 3.0 + w)];\n }\n }\n gl_FragColor = color;\n }\n `,\n Convolute_3_0: `\n precision highp float;\n uniform sampler2D uTexture;\n uniform float uMatrix[9];\n uniform float uStepW;\n uniform float uStepH;\n varying vec2 vTexCoord;\n void main() {\n vec4 color = vec4(0, 0, 0, 1);\n for (float h = 0.0; h < 3.0; h+=1.0) {\n for (float w = 0.0; w < 3.0; w+=1.0) {\n vec2 matrixPos = vec2(uStepW * (w - 1.0), uStepH * (h - 1.0));\n color.rgb += texture2D(uTexture, vTexCoord + matrixPos).rgb * uMatrix[int(h * 3.0 + w)];\n }\n }\n float alpha = texture2D(uTexture, vTexCoord).a;\n gl_FragColor = color;\n gl_FragColor.a = alpha;\n }\n `,\n Convolute_5_1: `\n precision highp float;\n uniform sampler2D uTexture;\n uniform float uMatrix[25];\n uniform float uStepW;\n uniform float uStepH;\n varying vec2 vTexCoord;\n void main() {\n vec4 color = vec4(0, 0, 0, 0);\n for (float h = 0.0; h < 5.0; h+=1.0) {\n for (float w = 0.0; w < 5.0; w+=1.0) {\n vec2 matrixPos = vec2(uStepW * (w - 2.0), uStepH * (h - 2.0));\n color += texture2D(uTexture, vTexCoord + matrixPos) * uMatrix[int(h * 5.0 + w)];\n }\n }\n gl_FragColor = color;\n }\n `,\n Convolute_5_0: `\n precision highp float;\n uniform sampler2D uTexture;\n uniform float uMatrix[25];\n uniform float uStepW;\n uniform float uStepH;\n varying vec2 vTexCoord;\n void main() {\n vec4 color = vec4(0, 0, 0, 1);\n for (float h = 0.0; h < 5.0; h+=1.0) {\n for (float w = 0.0; w < 5.0; w+=1.0) {\n vec2 matrixPos = vec2(uStepW * (w - 2.0), uStepH * (h - 2.0));\n color.rgb += texture2D(uTexture, vTexCoord + matrixPos).rgb * uMatrix[int(h * 5.0 + w)];\n }\n }\n float alpha = texture2D(uTexture, vTexCoord).a;\n gl_FragColor = color;\n gl_FragColor.a = alpha;\n }\n `,\n Convolute_7_1: `\n precision highp float;\n uniform sampler2D uTexture;\n uniform float uMatrix[49];\n uniform float uStepW;\n uniform float uStepH;\n varying vec2 vTexCoord;\n void main() {\n vec4 color = vec4(0, 0, 0, 0);\n for (float h = 0.0; h < 7.0; h+=1.0) {\n for (float w = 0.0; w < 7.0; w+=1.0) {\n vec2 matrixPos = vec2(uStepW * (w - 3.0), uStepH * (h - 3.0));\n color += texture2D(uTexture, vTexCoord + matrixPos) * uMatrix[int(h * 7.0 + w)];\n }\n }\n gl_FragColor = color;\n }\n `,\n Convolute_7_0: `\n precision highp float;\n uniform sampler2D uTexture;\n uniform float uMatrix[49];\n uniform float uStepW;\n uniform float uStepH;\n varying vec2 vTexCoord;\n void main() {\n vec4 color = vec4(0, 0, 0, 1);\n for (float h = 0.0; h < 7.0; h+=1.0) {\n for (float w = 0.0; w < 7.0; w+=1.0) {\n vec2 matrixPos = vec2(uStepW * (w - 3.0), uStepH * (h - 3.0));\n color.rgb += texture2D(uTexture, vTexCoord + matrixPos).rgb * uMatrix[int(h * 7.0 + w)];\n }\n }\n float alpha = texture2D(uTexture, vTexCoord).a;\n gl_FragColor = color;\n gl_FragColor.a = alpha;\n }\n `,\n Convolute_9_1: `\n precision highp float;\n uniform sampler2D uTexture;\n uniform float uMatrix[81];\n uniform float uStepW;\n uniform float uStepH;\n varying vec2 vTexCoord;\n void main() {\n vec4 color = vec4(0, 0, 0, 0);\n for (float h = 0.0; h < 9.0; h+=1.0) {\n for (float w = 0.0; w < 9.0; w+=1.0) {\n vec2 matrixPos = vec2(uStepW * (w - 4.0), uStepH * (h - 4.0));\n color += texture2D(uTexture, vTexCoord + matrixPos) * uMatrix[int(h * 9.0 + w)];\n }\n }\n gl_FragColor = color;\n }\n `,\n Convolute_9_0: `\n precision highp float;\n uniform sampler2D uTexture;\n uniform float uMatrix[81];\n uniform float uStepW;\n uniform float uStepH;\n varying vec2 vTexCoord;\n void main() {\n vec4 color = vec4(0, 0, 0, 1);\n for (float h = 0.0; h < 9.0; h+=1.0) {\n for (float w = 0.0; w < 9.0; w+=1.0) {\n vec2 matrixPos = vec2(uStepW * (w - 4.0), uStepH * (h - 4.0));\n color.rgb += texture2D(uTexture, vTexCoord + matrixPos).rgb * uMatrix[int(h * 9.0 + w)];\n }\n }\n float alpha = texture2D(uTexture, vTexCoord).a;\n gl_FragColor = color;\n gl_FragColor.a = alpha;\n }\n `,\n};\n","import { BaseFilter } from './BaseFilter';\nimport type { T2DPipelineState, TWebGLUniformLocationMap } from './typedefs';\nimport { classRegistry } from '../ClassRegistry';\nimport { fragmentSource } from './shaders/convolute';\n\nexport type ConvoluteOwnProps = {\n opaque: boolean;\n matrix: number[];\n};\n\nexport const convoluteDefaultValues: ConvoluteOwnProps = {\n opaque: false,\n matrix: [0, 0, 0, 0, 1, 0, 0, 0, 0],\n};\n\n/**\n * Adapted from html5rocks article\n * @example Sharpen filter\n * const filter = new Convolute({\n * matrix: [ 0, -1, 0,\n * -1, 5, -1,\n * 0, -1, 0 ]\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n * canvas.renderAll();\n * @example Blur filter\n * const filter = new Convolute({\n * matrix: [ 1/9, 1/9, 1/9,\n * 1/9, 1/9, 1/9,\n * 1/9, 1/9, 1/9 ]\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n * canvas.renderAll();\n * @example Emboss filter\n * const filter = new Convolute({\n * matrix: [ 1, 1, 1,\n * 1, 0.7, -1,\n * -1, -1, -1 ]\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n * canvas.renderAll();\n * @example Emboss filter with opaqueness\n * const filter = new Convolute({\n * opaque: true,\n * matrix: [ 1, 1, 1,\n * 1, 0.7, -1,\n * -1, -1, -1 ]\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n * canvas.renderAll();\n */\nexport class Convolute extends BaseFilter<'Convolute', ConvoluteOwnProps> {\n /*\n * Opaque value (true/false)\n */\n declare opaque: ConvoluteOwnProps['opaque'];\n\n /*\n * matrix for the filter, max 9x9\n */\n declare matrix: ConvoluteOwnProps['matrix'];\n\n static type = 'Convolute';\n\n static defaults = convoluteDefaultValues;\n\n static uniformLocations = ['uMatrix', 'uOpaque', 'uHalfSize', 'uSize'];\n\n getCacheKey() {\n return `${this.type}_${Math.sqrt(this.matrix.length)}_${\n this.opaque ? 1 : 0\n }` as keyof typeof fragmentSource;\n }\n\n getFragmentSource() {\n return fragmentSource[this.getCacheKey()];\n }\n\n /**\n * Apply the Brightness operation to a Uint8ClampedArray representing the pixels of an image.\n *\n * @param {Object} options\n * @param {ImageData} options.imageData The Uint8ClampedArray to be filtered.\n */\n applyTo2d(options: T2DPipelineState) {\n const imageData = options.imageData,\n data = imageData.data,\n weights = this.matrix,\n side = Math.round(Math.sqrt(weights.length)),\n halfSide = Math.floor(side / 2),\n sw = imageData.width,\n sh = imageData.height,\n output = options.ctx.createImageData(sw, sh),\n dst = output.data,\n // go through the destination image pixels\n alphaFac = this.opaque ? 1 : 0;\n let r, g, b, a, dstOff, scx, scy, srcOff, wt, x, y, cx, cy;\n\n for (y = 0; y < sh; y++) {\n for (x = 0; x < sw; x++) {\n dstOff = (y * sw + x) * 4;\n // calculate the weighed sum of the source image pixels that\n // fall under the convolution matrix\n r = 0;\n g = 0;\n b = 0;\n a = 0;\n\n for (cy = 0; cy < side; cy++) {\n for (cx = 0; cx < side; cx++) {\n scy = y + cy - halfSide;\n scx = x + cx - halfSide;\n\n // eslint-disable-next-line max-depth\n if (scy < 0 || scy >= sh || scx < 0 || scx >= sw) {\n continue;\n }\n\n srcOff = (scy * sw + scx) * 4;\n wt = weights[cy * side + cx];\n\n r += data[srcOff] * wt;\n g += data[srcOff + 1] * wt;\n b += data[srcOff + 2] * wt;\n // eslint-disable-next-line max-depth\n if (!alphaFac) {\n a += data[srcOff + 3] * wt;\n }\n }\n }\n dst[dstOff] = r;\n dst[dstOff + 1] = g;\n dst[dstOff + 2] = b;\n if (!alphaFac) {\n dst[dstOff + 3] = a;\n } else {\n dst[dstOff + 3] = data[dstOff + 3];\n }\n }\n }\n options.imageData = output;\n }\n\n /**\n * Send data from this filter to its shader program's uniforms.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n */\n sendUniformData(\n gl: WebGLRenderingContext,\n uniformLocations: TWebGLUniformLocationMap,\n ) {\n gl.uniform1fv(uniformLocations.uMatrix, this.matrix);\n }\n\n /**\n * Returns object representation of an instance\n * @return {Object} Object representation of an instance\n */\n toObject() {\n return {\n ...super.toObject(),\n opaque: this.opaque,\n matrix: [...this.matrix],\n };\n }\n}\n\nclassRegistry.setClass(Convolute);\n","export const fragmentSource = `\n precision highp float;\n uniform sampler2D uTexture;\n uniform vec3 uGamma;\n varying vec2 vTexCoord;\n void main() {\n vec4 color = texture2D(uTexture, vTexCoord);\n vec3 correction = (1.0 / uGamma);\n color.r = pow(color.r, correction.r);\n color.g = pow(color.g, correction.g);\n color.b = pow(color.b, correction.b);\n gl_FragColor = color;\n gl_FragColor.rgb *= color.a;\n }\n`;\n","import { BaseFilter } from './BaseFilter';\nimport { classRegistry } from '../ClassRegistry';\nimport { fragmentSource } from './shaders/gamma';\nimport type { T2DPipelineState, TWebGLUniformLocationMap } from './typedefs';\n\nconst GAMMA = 'Gamma' as const;\n\nexport type GammaInput = [number, number, number];\n\nexport type GammaOwnProps = {\n gamma: GammaInput;\n};\n\nexport const gammaDefaultValues: GammaOwnProps = {\n gamma: [1, 1, 1],\n};\n\n/**\n * Gamma filter class\n * @example\n * const filter = new Gamma({\n * gamma: [1, 0.5, 2.1]\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n */\nexport class Gamma extends BaseFilter {\n /**\n * Gamma array value, from 0.01 to 2.2.\n * @param {Array} gamma\n */\n declare gamma: GammaOwnProps['gamma'];\n declare rgbValues?: {\n r: Uint8Array;\n g: Uint8Array;\n b: Uint8Array;\n };\n\n static type = GAMMA;\n\n static defaults = gammaDefaultValues;\n\n static uniformLocations = ['uGamma'];\n\n getFragmentSource() {\n return fragmentSource;\n }\n\n constructor(options: { gamma?: GammaInput } = {}) {\n super(options);\n this.gamma =\n options.gamma ||\n ((\n this.constructor as typeof Gamma\n ).defaults.gamma.concat() as GammaInput);\n }\n\n /**\n * Apply the Gamma operation to a Uint8Array representing the pixels of an image.\n *\n * @param {Object} options\n * @param {ImageData} options.imageData The Uint8Array to be filtered.\n */\n applyTo2d({ imageData: { data } }: T2DPipelineState) {\n const gamma = this.gamma,\n rInv = 1 / gamma[0],\n gInv = 1 / gamma[1],\n bInv = 1 / gamma[2];\n\n if (!this.rgbValues) {\n this.rgbValues = {\n r: new Uint8Array(256),\n g: new Uint8Array(256),\n b: new Uint8Array(256),\n };\n }\n\n // This is an optimization - pre-compute a look-up table for each color channel\n // instead of performing these pow calls for each pixel in the image.\n const rgb = this.rgbValues;\n for (let i = 0; i < 256; i++) {\n rgb.r[i] = Math.pow(i / 255, rInv) * 255;\n rgb.g[i] = Math.pow(i / 255, gInv) * 255;\n rgb.b[i] = Math.pow(i / 255, bInv) * 255;\n }\n for (let i = 0; i < data.length; i += 4) {\n data[i] = rgb.r[data[i]];\n data[i + 1] = rgb.g[data[i + 1]];\n data[i + 2] = rgb.b[data[i + 2]];\n }\n }\n\n /**\n * Send data from this filter to its shader program's uniforms.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n */\n sendUniformData(\n gl: WebGLRenderingContext,\n uniformLocations: TWebGLUniformLocationMap,\n ) {\n gl.uniform3fv(uniformLocations.uGamma, this.gamma);\n }\n\n isNeutralState() {\n const { gamma } = this;\n return gamma[0] === 1 && gamma[1] === 1 && gamma[2] === 1;\n }\n\n toObject(): { type: typeof GAMMA; gamma: GammaInput } {\n return {\n type: GAMMA,\n gamma: this.gamma.concat() as GammaInput,\n };\n }\n}\n\nclassRegistry.setClass(Gamma);\n","import type { TGrayscaleMode } from '../Grayscale';\n\nexport const fragmentSource: Record = {\n average: `\n precision highp float;\n uniform sampler2D uTexture;\n varying vec2 vTexCoord;\n void main() {\n vec4 color = texture2D(uTexture, vTexCoord);\n float average = (color.r + color.b + color.g) / 3.0;\n gl_FragColor = vec4(average, average, average, color.a);\n }\n `,\n lightness: `\n precision highp float;\n uniform sampler2D uTexture;\n uniform int uMode;\n varying vec2 vTexCoord;\n void main() {\n vec4 col = texture2D(uTexture, vTexCoord);\n float average = (max(max(col.r, col.g),col.b) + min(min(col.r, col.g),col.b)) / 2.0;\n gl_FragColor = vec4(average, average, average, col.a);\n }\n `,\n luminosity: `\n precision highp float;\n uniform sampler2D uTexture;\n uniform int uMode;\n varying vec2 vTexCoord;\n void main() {\n vec4 col = texture2D(uTexture, vTexCoord);\n float average = 0.21 * col.r + 0.72 * col.g + 0.07 * col.b;\n gl_FragColor = vec4(average, average, average, col.a);\n }\n `,\n};\n","import { BaseFilter } from './BaseFilter';\nimport type { T2DPipelineState, TWebGLUniformLocationMap } from './typedefs';\nimport { classRegistry } from '../ClassRegistry';\nimport { fragmentSource } from './shaders/grayscale';\n\nexport type TGrayscaleMode = 'average' | 'lightness' | 'luminosity';\n\ntype GrayscaleOwnProps = {\n mode: TGrayscaleMode;\n};\n\nexport const grayscaleDefaultValues: GrayscaleOwnProps = {\n mode: 'average',\n};\n\n/**\n * Grayscale image filter class\n * @example\n * const filter = new Grayscale();\n * object.filters.push(filter);\n * object.applyFilters();\n */\nexport class Grayscale extends BaseFilter<'Grayscale', GrayscaleOwnProps> {\n declare mode: TGrayscaleMode;\n\n static type = 'Grayscale';\n\n static defaults = grayscaleDefaultValues;\n\n static uniformLocations = ['uMode'];\n\n /**\n * Apply the Grayscale operation to a Uint8Array representing the pixels of an image.\n *\n * @param {Object} options\n * @param {ImageData} options.imageData The Uint8Array to be filtered.\n */\n applyTo2d({ imageData: { data } }: T2DPipelineState) {\n for (let i = 0, value: number; i < data.length; i += 4) {\n const r = data[i];\n const g = data[i + 1];\n const b = data[i + 2];\n switch (this.mode) {\n case 'average':\n value = (r + g + b) / 3;\n break;\n case 'lightness':\n value = (Math.min(r, g, b) + Math.max(r, g, b)) / 2;\n break;\n case 'luminosity':\n value = 0.21 * r + 0.72 * g + 0.07 * b;\n break;\n }\n\n data[i + 2] = data[i + 1] = data[i] = value;\n }\n }\n\n getCacheKey() {\n return `${this.type}_${this.mode}`;\n }\n\n getFragmentSource() {\n return fragmentSource[this.mode];\n }\n\n /**\n * Send data from this filter to its shader program's uniforms.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n */\n sendUniformData(\n gl: WebGLRenderingContext,\n uniformLocations: TWebGLUniformLocationMap,\n ) {\n const mode = 1;\n gl.uniform1i(uniformLocations.uMode, mode);\n }\n\n /**\n * Grayscale filter isNeutralState implementation\n * The filter is never neutral\n * on the image\n **/\n isNeutralState() {\n return false;\n }\n}\n\nclassRegistry.setClass(Grayscale);\n","import { cos } from '../util/misc/cos';\nimport { sin } from '../util/misc/sin';\nimport {\n ColorMatrix,\n type ColorMatrixOwnProps,\n colorMatrixDefaultValues,\n} from './ColorMatrix';\nimport type { TWebGLPipelineState, T2DPipelineState } from './typedefs';\nimport { classRegistry } from '../ClassRegistry';\n\nexport type HueRotationOwnProps = ColorMatrixOwnProps & {\n rotation: number;\n};\n\nexport type HueRotationSerializedProps = {\n rotation: number;\n};\n\nexport const hueRotationDefaultValues: HueRotationOwnProps = {\n ...colorMatrixDefaultValues,\n rotation: 0,\n};\n\n/**\n * HueRotation filter class\n * @example\n * const filter = new HueRotation({\n * rotation: -0.5\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n */\nexport class HueRotation extends ColorMatrix<\n 'HueRotation',\n HueRotationOwnProps,\n HueRotationSerializedProps\n> {\n /**\n * HueRotation value, from -1 to 1.\n */\n declare rotation: HueRotationOwnProps['rotation'];\n\n static type = 'HueRotation';\n\n static defaults = hueRotationDefaultValues;\n\n calculateMatrix() {\n const rad = this.rotation * Math.PI,\n cosine = cos(rad),\n sine = sin(rad),\n aThird = 1 / 3,\n aThirdSqtSin = Math.sqrt(aThird) * sine,\n OneMinusCos = 1 - cosine;\n this.matrix = [\n cosine + OneMinusCos / 3,\n aThird * OneMinusCos - aThirdSqtSin,\n aThird * OneMinusCos + aThirdSqtSin,\n 0,\n 0,\n aThird * OneMinusCos + aThirdSqtSin,\n cosine + aThird * OneMinusCos,\n aThird * OneMinusCos - aThirdSqtSin,\n 0,\n 0,\n aThird * OneMinusCos - aThirdSqtSin,\n aThird * OneMinusCos + aThirdSqtSin,\n cosine + aThird * OneMinusCos,\n 0,\n 0,\n 0,\n 0,\n 0,\n 1,\n 0,\n ];\n }\n\n isNeutralState() {\n return this.rotation === 0;\n }\n\n applyTo(options: TWebGLPipelineState | T2DPipelineState) {\n this.calculateMatrix();\n super.applyTo(options);\n }\n\n toObject() {\n return {\n type: this.type,\n rotation: this.rotation,\n };\n }\n}\n\nclassRegistry.setClass(HueRotation);\n","export const fragmentSource = `\n precision highp float;\n uniform sampler2D uTexture;\n uniform int uInvert;\n uniform int uAlpha;\n varying vec2 vTexCoord;\n void main() {\n vec4 color = texture2D(uTexture, vTexCoord);\n if (uInvert == 1) {\n if (uAlpha == 1) {\n gl_FragColor = vec4(1.0 - color.r,1.0 -color.g,1.0 -color.b,1.0 -color.a);\n } else {\n gl_FragColor = vec4(1.0 - color.r,1.0 -color.g,1.0 -color.b,color.a);\n }\n } else {\n gl_FragColor = color;\n }\n }\n`;\n","import { BaseFilter } from './BaseFilter';\nimport type { T2DPipelineState, TWebGLUniformLocationMap } from './typedefs';\nimport { classRegistry } from '../ClassRegistry';\nimport { fragmentSource } from './shaders/invert';\n\nexport type InvertOwnProps = {\n alpha: boolean;\n invert: boolean;\n};\n\nexport const invertDefaultValues: InvertOwnProps = {\n alpha: false,\n invert: true,\n};\n\n/**\n * @example\n * const filter = new Invert();\n * object.filters.push(filter);\n * object.applyFilters(canvas.renderAll.bind(canvas));\n */\nexport class Invert extends BaseFilter<'Invert', InvertOwnProps> {\n /**\n * Invert also alpha.\n * @param {Boolean} alpha\n **/\n declare alpha: InvertOwnProps['alpha'];\n\n /**\n * Filter invert. if false, does nothing\n * @param {Boolean} invert\n */\n declare invert: InvertOwnProps['invert'];\n\n static type = 'Invert';\n\n static defaults = invertDefaultValues;\n\n static uniformLocations = ['uInvert', 'uAlpha'];\n\n /**\n * Apply the Invert operation to a Uint8Array representing the pixels of an image.\n *\n * @param {Object} options\n * @param {ImageData} options.imageData The Uint8Array to be filtered.\n */\n applyTo2d({ imageData: { data } }: T2DPipelineState) {\n for (let i = 0; i < data.length; i += 4) {\n data[i] = 255 - data[i];\n data[i + 1] = 255 - data[i + 1];\n data[i + 2] = 255 - data[i + 2];\n\n if (this.alpha) {\n data[i + 3] = 255 - data[i + 3];\n }\n }\n }\n\n protected getFragmentSource(): string {\n return fragmentSource;\n }\n\n /**\n * Invert filter isNeutralState implementation\n * Used only in image applyFilters to discard filters that will not have an effect\n * on the image\n * @param {Object} options\n **/\n isNeutralState() {\n return !this.invert;\n }\n\n /**\n * Send data from this filter to its shader program's uniforms.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n */\n sendUniformData(\n gl: WebGLRenderingContext,\n uniformLocations: TWebGLUniformLocationMap,\n ) {\n gl.uniform1i(uniformLocations.uInvert, Number(this.invert));\n gl.uniform1i(uniformLocations.uAlpha, Number(this.alpha));\n }\n}\n\nclassRegistry.setClass(Invert);\n","export const fragmentSource = `\n precision highp float;\n uniform sampler2D uTexture;\n uniform float uStepH;\n uniform float uNoise;\n uniform float uSeed;\n varying vec2 vTexCoord;\n float rand(vec2 co, float seed, float vScale) {\n return fract(sin(dot(co.xy * vScale ,vec2(12.9898 , 78.233))) * 43758.5453 * (seed + 0.01) / 2.0);\n }\n void main() {\n vec4 color = texture2D(uTexture, vTexCoord);\n color.rgb += (0.5 - rand(vTexCoord, uSeed, 0.1 / uStepH)) * uNoise;\n gl_FragColor = color;\n }\n`;\n","import { BaseFilter } from './BaseFilter';\nimport type { T2DPipelineState, TWebGLUniformLocationMap } from './typedefs';\nimport { classRegistry } from '../ClassRegistry';\nimport { fragmentSource } from './shaders/noise';\n\nexport type NoiseOwnProps = {\n noise: number;\n};\n\nexport const noiseDefaultValues: NoiseOwnProps = {\n noise: 0,\n};\n\n/**\n * Noise filter class\n * @example\n * const filter = new Noise({\n * noise: 700\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n * canvas.renderAll();\n */\nexport class Noise extends BaseFilter<'Noise', NoiseOwnProps> {\n /**\n * Noise value, from\n * @param {Number} noise\n */\n declare noise: NoiseOwnProps['noise'];\n\n static type = 'Noise';\n\n static defaults = noiseDefaultValues;\n\n static uniformLocations = ['uNoise', 'uSeed'];\n\n getFragmentSource() {\n return fragmentSource;\n }\n\n /**\n * Apply the Brightness operation to a Uint8ClampedArray representing the pixels of an image.\n *\n * @param {Object} options\n * @param {ImageData} options.imageData The Uint8ClampedArray to be filtered.\n */\n applyTo2d({ imageData: { data } }: T2DPipelineState) {\n const noise = this.noise;\n for (let i = 0; i < data.length; i += 4) {\n const rand = (0.5 - Math.random()) * noise;\n data[i] += rand;\n data[i + 1] += rand;\n data[i + 2] += rand;\n }\n }\n\n /**\n * Send data from this filter to its shader program's uniforms.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n */\n sendUniformData(\n gl: WebGLRenderingContext,\n uniformLocations: TWebGLUniformLocationMap,\n ) {\n gl.uniform1f(uniformLocations.uNoise, this.noise / 255);\n gl.uniform1f(uniformLocations.uSeed, Math.random());\n }\n\n isNeutralState() {\n return this.noise === 0;\n }\n}\n\nclassRegistry.setClass(Noise);\n","export const fragmentSource = `\n precision highp float;\n uniform sampler2D uTexture;\n uniform float uBlocksize;\n uniform float uStepW;\n uniform float uStepH;\n varying vec2 vTexCoord;\n void main() {\n float blockW = uBlocksize * uStepW;\n float blockH = uBlocksize * uStepH;\n int posX = int(vTexCoord.x / blockW);\n int posY = int(vTexCoord.y / blockH);\n float fposX = float(posX);\n float fposY = float(posY);\n vec2 squareCoords = vec2(fposX * blockW, fposY * blockH);\n vec4 color = texture2D(uTexture, squareCoords);\n gl_FragColor = color;\n }\n`;\n","import { BaseFilter } from './BaseFilter';\nimport type { T2DPipelineState, TWebGLUniformLocationMap } from './typedefs';\nimport { classRegistry } from '../ClassRegistry';\nimport { fragmentSource } from './shaders/pixelate';\n\nexport type PixelateOwnProps = {\n blocksize: number;\n};\n\nexport const pixelateDefaultValues: PixelateOwnProps = {\n blocksize: 4,\n};\n\n/**\n * Pixelate filter class\n * @example\n * const filter = new Pixelate({\n * blocksize: 8\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n */\nexport class Pixelate extends BaseFilter<'Pixelate', PixelateOwnProps> {\n declare blocksize: PixelateOwnProps['blocksize'];\n\n static type = 'Pixelate';\n\n static defaults = pixelateDefaultValues;\n\n static uniformLocations = ['uBlocksize'];\n\n /**\n * Apply the Pixelate operation to a Uint8ClampedArray representing the pixels of an image.\n *\n * @param {Object} options\n * @param {ImageData} options.imageData The Uint8ClampedArray to be filtered.\n */\n applyTo2d({ imageData: { data, width, height } }: T2DPipelineState) {\n for (let i = 0; i < height; i += this.blocksize) {\n for (let j = 0; j < width; j += this.blocksize) {\n const index = i * 4 * width + j * 4;\n const r = data[index];\n const g = data[index + 1];\n const b = data[index + 2];\n const a = data[index + 3];\n\n for (let _i = i; _i < Math.min(i + this.blocksize, height); _i++) {\n for (let _j = j; _j < Math.min(j + this.blocksize, width); _j++) {\n const index = _i * 4 * width + _j * 4;\n data[index] = r;\n data[index + 1] = g;\n data[index + 2] = b;\n data[index + 3] = a;\n }\n }\n }\n }\n }\n\n /**\n * Indicate when the filter is not gonna apply changes to the image\n **/\n isNeutralState() {\n return this.blocksize === 1;\n }\n\n protected getFragmentSource(): string {\n return fragmentSource;\n }\n\n /**\n * Send data from this filter to its shader program's uniforms.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n */\n sendUniformData(\n gl: WebGLRenderingContext,\n uniformLocations: TWebGLUniformLocationMap,\n ) {\n gl.uniform1f(uniformLocations.uBlocksize, this.blocksize);\n }\n}\n\nclassRegistry.setClass(Pixelate);\n","export const fragmentShader = `\nprecision highp float;\nuniform sampler2D uTexture;\nuniform vec4 uLow;\nuniform vec4 uHigh;\nvarying vec2 vTexCoord;\nvoid main() {\n gl_FragColor = texture2D(uTexture, vTexCoord);\n if(all(greaterThan(gl_FragColor.rgb,uLow.rgb)) && all(greaterThan(uHigh.rgb,gl_FragColor.rgb))) {\n gl_FragColor.a = 0.0;\n }\n}\n`;\n","import { classRegistry } from '../ClassRegistry';\nimport { Color } from '../color/Color';\nimport { BaseFilter } from './BaseFilter';\nimport { fragmentShader } from './shaders/removeColor';\nimport type { T2DPipelineState, TWebGLUniformLocationMap } from './typedefs';\n\nexport type RemoveColorOwnProps = {\n color: string;\n distance: number;\n useAlpha: boolean;\n};\n\nexport const removeColorDefaultValues: RemoveColorOwnProps = {\n color: '#FFFFFF',\n distance: 0.02,\n useAlpha: false,\n};\n\n/**\n * Remove white filter class\n * @example\n * const filter = new RemoveColor({\n * threshold: 0.2,\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n * canvas.renderAll();\n */\nexport class RemoveColor extends BaseFilter<\n 'RemoveColor',\n RemoveColorOwnProps\n> {\n /**\n * Color to remove, in any format understood by {@link Color}.\n */\n declare color: RemoveColorOwnProps['color'];\n\n /**\n * distance to actual color, as value up or down from each r,g,b\n * between 0 and 1\n **/\n declare distance: RemoveColorOwnProps['distance'];\n\n /**\n * For color to remove inside distance, use alpha channel for a smoother deletion\n * NOT IMPLEMENTED YET\n **/\n declare useAlpha: RemoveColorOwnProps['useAlpha'];\n\n static type = 'RemoveColor';\n\n static defaults = removeColorDefaultValues;\n\n static uniformLocations = ['uLow', 'uHigh'];\n\n getFragmentSource() {\n return fragmentShader;\n }\n\n /**\n * Applies filter to canvas element\n * @param {Object} canvasEl Canvas element to apply filter to\n */\n applyTo2d({ imageData: { data } }: T2DPipelineState) {\n const distance = this.distance * 255,\n source = new Color(this.color).getSource(),\n lowC = [source[0] - distance, source[1] - distance, source[2] - distance],\n highC = [\n source[0] + distance,\n source[1] + distance,\n source[2] + distance,\n ];\n\n for (let i = 0; i < data.length; i += 4) {\n const r = data[i];\n const g = data[i + 1];\n const b = data[i + 2];\n\n if (\n r > lowC[0] &&\n g > lowC[1] &&\n b > lowC[2] &&\n r < highC[0] &&\n g < highC[1] &&\n b < highC[2]\n ) {\n data[i + 3] = 0;\n }\n }\n }\n\n /**\n * Send data from this filter to its shader program's uniforms.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n */\n sendUniformData(\n gl: WebGLRenderingContext,\n uniformLocations: TWebGLUniformLocationMap,\n ) {\n const source = new Color(this.color).getSource(),\n distance = this.distance,\n lowC = [\n 0 + source[0] / 255 - distance,\n 0 + source[1] / 255 - distance,\n 0 + source[2] / 255 - distance,\n 1,\n ],\n highC = [\n source[0] / 255 + distance,\n source[1] / 255 + distance,\n source[2] / 255 + distance,\n 1,\n ];\n gl.uniform4fv(uniformLocations.uLow, lowC);\n gl.uniform4fv(uniformLocations.uHigh, highC);\n }\n}\n\nclassRegistry.setClass(RemoveColor);\n","import { BaseFilter } from './BaseFilter';\nimport type {\n T2DPipelineState,\n TWebGLPipelineState,\n TWebGLUniformLocationMap,\n} from './typedefs';\nimport { isWebGLPipelineState } from './utils';\nimport { classRegistry } from '../ClassRegistry';\nimport { createCanvasElement } from '../util/misc/dom';\nimport type { XY } from '../Point';\n\nexport type TResizeType = 'bilinear' | 'hermite' | 'sliceHack' | 'lanczos';\n\nexport type ResizeOwnProps = {\n resizeType: TResizeType;\n scaleX: number;\n scaleY: number;\n lanczosLobes: number;\n};\n\nexport type ResizeSerializedProps = ResizeOwnProps;\n\nexport const resizeDefaultValues: ResizeOwnProps = {\n resizeType: 'hermite',\n scaleX: 1,\n scaleY: 1,\n lanczosLobes: 3,\n};\n\ntype ResizeDuring2DResize = Resize & {\n rcpScaleX: number;\n rcpScaleY: number;\n};\n\ntype ResizeDuringWEBGLResize = Resize & {\n rcpScaleX: number;\n rcpScaleY: number;\n horizontal: boolean;\n width: number;\n height: number;\n taps: number[];\n tempScale: number;\n dH: number;\n dW: number;\n};\n\n/**\n * Resize image filter class\n * @example\n * const filter = new Resize();\n * object.filters.push(filter);\n * object.applyFilters(canvas.renderAll.bind(canvas));\n */\nexport class Resize extends BaseFilter<'Resize', ResizeOwnProps> {\n /**\n * Resize type\n * for webgl resizeType is just lanczos, for canvas2d can be:\n * bilinear, hermite, sliceHack, lanczos.\n */\n declare resizeType: ResizeOwnProps['resizeType'];\n\n /**\n * Scale factor for resizing, x axis\n * @param {Number} scaleX\n */\n declare scaleX: ResizeOwnProps['scaleX'];\n\n /**\n * Scale factor for resizing, y axis\n * @param {Number} scaleY\n */\n declare scaleY: ResizeOwnProps['scaleY'];\n\n /**\n * LanczosLobes parameter for lanczos filter, valid for resizeType lanczos\n * @param {Number} lanczosLobes\n */\n declare lanczosLobes: ResizeOwnProps['lanczosLobes'];\n\n static type = 'Resize';\n\n static defaults = resizeDefaultValues;\n\n static uniformLocations = ['uDelta', 'uTaps'];\n\n /**\n * Send data from this filter to its shader program's uniforms.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n */\n sendUniformData(\n this: ResizeDuringWEBGLResize,\n gl: WebGLRenderingContext,\n uniformLocations: TWebGLUniformLocationMap,\n ) {\n gl.uniform2fv(\n uniformLocations.uDelta,\n this.horizontal ? [1 / this.width, 0] : [0, 1 / this.height],\n );\n gl.uniform1fv(uniformLocations.uTaps, this.taps);\n }\n\n getFilterWindow(this: ResizeDuringWEBGLResize) {\n const scale = this.tempScale;\n return Math.ceil(this.lanczosLobes / scale);\n }\n\n getCacheKey(this: ResizeDuringWEBGLResize): string {\n const filterWindow = this.getFilterWindow();\n return `${this.type}_${filterWindow}`;\n }\n\n getFragmentSource(this: ResizeDuringWEBGLResize): string {\n const filterWindow = this.getFilterWindow();\n return this.generateShader(filterWindow);\n }\n\n getTaps(this: ResizeDuringWEBGLResize) {\n const lobeFunction = this.lanczosCreate(this.lanczosLobes),\n scale = this.tempScale,\n filterWindow = this.getFilterWindow(),\n taps = new Array(filterWindow);\n for (let i = 1; i <= filterWindow; i++) {\n taps[i - 1] = lobeFunction(i * scale);\n }\n return taps;\n }\n\n /**\n * Generate vertex and shader sources from the necessary steps numbers\n * @param {Number} filterWindow\n */\n generateShader(filterWindow: number) {\n const offsets = new Array(filterWindow);\n for (let i = 1; i <= filterWindow; i++) {\n offsets[i - 1] = `${i}.0 * uDelta`;\n }\n return `\n precision highp float;\n uniform sampler2D uTexture;\n uniform vec2 uDelta;\n varying vec2 vTexCoord;\n uniform float uTaps[${filterWindow}];\n void main() {\n vec4 color = texture2D(uTexture, vTexCoord);\n float sum = 1.0;\n ${offsets\n .map(\n (offset, i) => `\n color += texture2D(uTexture, vTexCoord + ${offset}) * uTaps[${i}] + texture2D(uTexture, vTexCoord - ${offset}) * uTaps[${i}];\n sum += 2.0 * uTaps[${i}];\n `,\n )\n .join('\\n')}\n gl_FragColor = color / sum;\n }\n `;\n }\n\n applyToForWebgl(this: ResizeDuringWEBGLResize, options: TWebGLPipelineState) {\n options.passes++;\n this.width = options.sourceWidth;\n this.horizontal = true;\n this.dW = Math.round(this.width * this.scaleX);\n this.dH = options.sourceHeight;\n this.tempScale = this.dW / this.width;\n this.taps = this.getTaps();\n options.destinationWidth = this.dW;\n super.applyTo(options);\n options.sourceWidth = options.destinationWidth;\n\n this.height = options.sourceHeight;\n this.horizontal = false;\n this.dH = Math.round(this.height * this.scaleY);\n this.tempScale = this.dH / this.height;\n this.taps = this.getTaps();\n options.destinationHeight = this.dH;\n super.applyTo(options);\n options.sourceHeight = options.destinationHeight;\n }\n\n /**\n * Apply the resize filter to the image\n * Determines whether to use WebGL or Canvas2D based on the options.webgl flag.\n *\n * @param {Object} options\n * @param {Number} options.passes The number of filters remaining to be executed\n * @param {Boolean} options.webgl Whether to use webgl to render the filter.\n * @param {WebGLTexture} options.sourceTexture The texture setup as the source to be filtered.\n * @param {WebGLTexture} options.targetTexture The texture where filtered output should be drawn.\n * @param {WebGLRenderingContext} options.context The GL context used for rendering.\n * @param {Object} options.programCache A map of compiled shader programs, keyed by filter type.\n */\n applyTo(options: TWebGLPipelineState | T2DPipelineState) {\n if (isWebGLPipelineState(options)) {\n (this as unknown as ResizeDuringWEBGLResize).applyToForWebgl(options);\n } else {\n (this as unknown as ResizeDuring2DResize).applyTo2d(options);\n }\n }\n\n isNeutralState() {\n return this.scaleX === 1 && this.scaleY === 1;\n }\n\n lanczosCreate(lobes: number) {\n return (x: number) => {\n if (x >= lobes || x <= -lobes) {\n return 0.0;\n }\n if (x < 1.1920929e-7 && x > -1.1920929e-7) {\n return 1.0;\n }\n x *= Math.PI;\n const xx = x / lobes;\n return ((Math.sin(x) / x) * Math.sin(xx)) / xx;\n };\n }\n\n applyTo2d(this: ResizeDuring2DResize, options: T2DPipelineState) {\n const imageData = options.imageData,\n scaleX = this.scaleX,\n scaleY = this.scaleY;\n\n this.rcpScaleX = 1 / scaleX;\n this.rcpScaleY = 1 / scaleY;\n\n const oW = imageData.width;\n const oH = imageData.height;\n const dW = Math.round(oW * scaleX);\n const dH = Math.round(oH * scaleY);\n let newData: ImageData;\n\n if (this.resizeType === 'sliceHack') {\n newData = this.sliceByTwo(options, oW, oH, dW, dH);\n } else if (this.resizeType === 'hermite') {\n newData = this.hermiteFastResize(options, oW, oH, dW, dH);\n } else if (this.resizeType === 'bilinear') {\n newData = this.bilinearFiltering(options, oW, oH, dW, dH);\n } else if (this.resizeType === 'lanczos') {\n newData = this.lanczosResize(options, oW, oH, dW, dH);\n } else {\n // this should never trigger, is here just for safety net.\n newData = new ImageData(dW, dH);\n }\n options.imageData = newData;\n }\n\n /**\n * Filter sliceByTwo\n * @param {Object} canvasEl Canvas element to apply filter to\n * @param {Number} oW Original Width\n * @param {Number} oH Original Height\n * @param {Number} dW Destination Width\n * @param {Number} dH Destination Height\n * @returns {ImageData}\n */\n sliceByTwo(\n options: T2DPipelineState,\n oW: number,\n oH: number,\n dW: number,\n dH: number,\n ) {\n const imageData = options.imageData;\n const mult = 0.5;\n let doneW = false;\n let doneH = false;\n let stepW = oW * mult;\n let stepH = oH * mult;\n const resources = options.filterBackend.resources;\n let sX = 0;\n let sY = 0;\n const dX = oW;\n let dY = 0;\n if (!resources.sliceByTwo) {\n resources.sliceByTwo = createCanvasElement();\n }\n const tmpCanvas = resources.sliceByTwo;\n if (tmpCanvas.width < oW * 1.5 || tmpCanvas.height < oH) {\n tmpCanvas.width = oW * 1.5;\n tmpCanvas.height = oH;\n }\n const ctx = tmpCanvas.getContext('2d')!;\n ctx.clearRect(0, 0, oW * 1.5, oH);\n ctx.putImageData(imageData, 0, 0);\n\n dW = Math.floor(dW);\n dH = Math.floor(dH);\n\n while (!doneW || !doneH) {\n oW = stepW;\n oH = stepH;\n if (dW < Math.floor(stepW * mult)) {\n stepW = Math.floor(stepW * mult);\n } else {\n stepW = dW;\n doneW = true;\n }\n if (dH < Math.floor(stepH * mult)) {\n stepH = Math.floor(stepH * mult);\n } else {\n stepH = dH;\n doneH = true;\n }\n ctx.drawImage(tmpCanvas, sX, sY, oW, oH, dX, dY, stepW, stepH);\n sX = dX;\n sY = dY;\n dY += stepH;\n }\n return ctx.getImageData(sX, sY, dW, dH);\n }\n\n /**\n * Filter lanczosResize\n * @param {Object} canvasEl Canvas element to apply filter to\n * @param {Number} oW Original Width\n * @param {Number} oH Original Height\n * @param {Number} dW Destination Width\n * @param {Number} dH Destination Height\n * @returns {ImageData}\n */\n lanczosResize(\n this: ResizeDuring2DResize,\n options: T2DPipelineState,\n oW: number,\n oH: number,\n dW: number,\n dH: number,\n ): ImageData {\n function process(u: number): ImageData {\n let v, i, weight, idx, a, red, green, blue, alpha, fX, fY;\n center.x = (u + 0.5) * ratioX;\n icenter.x = Math.floor(center.x);\n for (v = 0; v < dH; v++) {\n center.y = (v + 0.5) * ratioY;\n icenter.y = Math.floor(center.y);\n a = 0;\n red = 0;\n green = 0;\n blue = 0;\n alpha = 0;\n for (i = icenter.x - range2X; i <= icenter.x + range2X; i++) {\n if (i < 0 || i >= oW) {\n continue;\n }\n fX = Math.floor(1000 * Math.abs(i - center.x));\n if (!cacheLanc[fX]) {\n cacheLanc[fX] = {};\n }\n for (let j = icenter.y - range2Y; j <= icenter.y + range2Y; j++) {\n if (j < 0 || j >= oH) {\n continue;\n }\n fY = Math.floor(1000 * Math.abs(j - center.y));\n if (!cacheLanc[fX][fY]) {\n cacheLanc[fX][fY] = lanczos(\n Math.sqrt(\n Math.pow(fX * rcpRatioX, 2) + Math.pow(fY * rcpRatioY, 2),\n ) / 1000,\n );\n }\n weight = cacheLanc[fX][fY];\n if (weight > 0) {\n idx = (j * oW + i) * 4;\n a += weight;\n red += weight * srcData[idx];\n green += weight * srcData[idx + 1];\n blue += weight * srcData[idx + 2];\n alpha += weight * srcData[idx + 3];\n }\n }\n }\n idx = (v * dW + u) * 4;\n destData[idx] = red / a;\n destData[idx + 1] = green / a;\n destData[idx + 2] = blue / a;\n destData[idx + 3] = alpha / a;\n }\n\n if (++u < dW) {\n return process(u);\n } else {\n return destImg;\n }\n }\n\n const srcData = options.imageData.data,\n destImg = options.ctx.createImageData(dW, dH),\n destData = destImg.data,\n lanczos = this.lanczosCreate(this.lanczosLobes),\n ratioX = this.rcpScaleX,\n ratioY = this.rcpScaleY,\n rcpRatioX = 2 / this.rcpScaleX,\n rcpRatioY = 2 / this.rcpScaleY,\n range2X = Math.ceil((ratioX * this.lanczosLobes) / 2),\n range2Y = Math.ceil((ratioY * this.lanczosLobes) / 2),\n cacheLanc: Record> = {},\n center: XY = { x: 0, y: 0 },\n icenter: XY = { x: 0, y: 0 };\n\n return process(0);\n }\n\n /**\n * bilinearFiltering\n * @param {Object} canvasEl Canvas element to apply filter to\n * @param {Number} oW Original Width\n * @param {Number} oH Original Height\n * @param {Number} dW Destination Width\n * @param {Number} dH Destination Height\n * @returns {ImageData}\n */\n bilinearFiltering(\n this: ResizeDuring2DResize,\n options: T2DPipelineState,\n oW: number,\n oH: number,\n dW: number,\n dH: number,\n ) {\n let a;\n let b;\n let c;\n let d;\n let x;\n let y;\n let i;\n let j;\n let xDiff;\n let yDiff;\n let chnl;\n let color;\n let offset = 0;\n let origPix;\n const ratioX = this.rcpScaleX;\n const ratioY = this.rcpScaleY;\n const w4 = 4 * (oW - 1);\n const img = options.imageData;\n const pixels = img.data;\n const destImage = options.ctx.createImageData(dW, dH);\n const destPixels = destImage.data;\n for (i = 0; i < dH; i++) {\n for (j = 0; j < dW; j++) {\n x = Math.floor(ratioX * j);\n y = Math.floor(ratioY * i);\n xDiff = ratioX * j - x;\n yDiff = ratioY * i - y;\n origPix = 4 * (y * oW + x);\n\n for (chnl = 0; chnl < 4; chnl++) {\n a = pixels[origPix + chnl];\n b = pixels[origPix + 4 + chnl];\n c = pixels[origPix + w4 + chnl];\n d = pixels[origPix + w4 + 4 + chnl];\n color =\n a * (1 - xDiff) * (1 - yDiff) +\n b * xDiff * (1 - yDiff) +\n c * yDiff * (1 - xDiff) +\n d * xDiff * yDiff;\n destPixels[offset++] = color;\n }\n }\n }\n return destImage;\n }\n\n /**\n * hermiteFastResize\n * @param {Object} canvasEl Canvas element to apply filter to\n * @param {Number} oW Original Width\n * @param {Number} oH Original Height\n * @param {Number} dW Destination Width\n * @param {Number} dH Destination Height\n * @returns {ImageData}\n */\n hermiteFastResize(\n this: ResizeDuring2DResize,\n options: T2DPipelineState,\n oW: number,\n oH: number,\n dW: number,\n dH: number,\n ) {\n const ratioW = this.rcpScaleX,\n ratioH = this.rcpScaleY,\n ratioWHalf = Math.ceil(ratioW / 2),\n ratioHHalf = Math.ceil(ratioH / 2),\n img = options.imageData,\n data = img.data,\n img2 = options.ctx.createImageData(dW, dH),\n data2 = img2.data;\n for (let j = 0; j < dH; j++) {\n for (let i = 0; i < dW; i++) {\n const x2 = (i + j * dW) * 4;\n let weight = 0;\n let weights = 0;\n let weightsAlpha = 0;\n let gxR = 0;\n let gxG = 0;\n let gxB = 0;\n let gxA = 0;\n const centerY = (j + 0.5) * ratioH;\n for (let yy = Math.floor(j * ratioH); yy < (j + 1) * ratioH; yy++) {\n const dy = Math.abs(centerY - (yy + 0.5)) / ratioHHalf,\n centerX = (i + 0.5) * ratioW,\n w0 = dy * dy;\n for (let xx = Math.floor(i * ratioW); xx < (i + 1) * ratioW; xx++) {\n let dx = Math.abs(centerX - (xx + 0.5)) / ratioWHalf;\n const w = Math.sqrt(w0 + dx * dx);\n /* eslint-disable max-depth */\n if (w > 1 && w < -1) {\n continue;\n }\n //hermite filter\n weight = 2 * w * w * w - 3 * w * w + 1;\n if (weight > 0) {\n dx = 4 * (xx + yy * oW);\n //alpha\n gxA += weight * data[dx + 3];\n weightsAlpha += weight;\n //colors\n if (data[dx + 3] < 255) {\n weight = (weight * data[dx + 3]) / 250;\n }\n gxR += weight * data[dx];\n gxG += weight * data[dx + 1];\n gxB += weight * data[dx + 2];\n weights += weight;\n }\n /* eslint-enable max-depth */\n }\n }\n data2[x2] = gxR / weights;\n data2[x2 + 1] = gxG / weights;\n data2[x2 + 2] = gxB / weights;\n data2[x2 + 3] = gxA / weightsAlpha;\n }\n }\n return img2;\n }\n}\n\nclassRegistry.setClass(Resize);\n","export const fragmentSource = `\n precision highp float;\n uniform sampler2D uTexture;\n uniform float uSaturation;\n varying vec2 vTexCoord;\n void main() {\n vec4 color = texture2D(uTexture, vTexCoord);\n float rgMax = max(color.r, color.g);\n float rgbMax = max(rgMax, color.b);\n color.r += rgbMax != color.r ? (rgbMax - color.r) * uSaturation : 0.00;\n color.g += rgbMax != color.g ? (rgbMax - color.g) * uSaturation : 0.00;\n color.b += rgbMax != color.b ? (rgbMax - color.b) * uSaturation : 0.00;\n gl_FragColor = color;\n }\n`;\n","import { BaseFilter } from './BaseFilter';\nimport type { T2DPipelineState, TWebGLUniformLocationMap } from './typedefs';\nimport { classRegistry } from '../ClassRegistry';\nimport { fragmentSource } from './shaders/saturation';\n\nexport type SaturationOwnProps = {\n saturation: number;\n};\n\nexport const saturationDefaultValues: SaturationOwnProps = {\n saturation: 0,\n};\n\n/**\n * Saturate filter class\n * @example\n * const filter = new Saturation({\n * saturation: 1\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n */\nexport class Saturation extends BaseFilter<'Saturation', SaturationOwnProps> {\n /**\n * Saturation value, from -1 to 1.\n * Increases/decreases the color saturation.\n * A value of 0 has no effect.\n *\n * @param {Number} saturation\n */\n declare saturation: SaturationOwnProps['saturation'];\n\n static type = 'Saturation';\n\n static defaults = saturationDefaultValues;\n\n static uniformLocations = ['uSaturation'];\n\n getFragmentSource() {\n return fragmentSource;\n }\n\n /**\n * Apply the Saturation operation to a Uint8ClampedArray representing the pixels of an image.\n *\n * @param {Object} options\n * @param {ImageData} options.imageData The Uint8ClampedArray to be filtered.\n */\n applyTo2d({ imageData: { data } }: T2DPipelineState) {\n const adjust = -this.saturation;\n for (let i = 0; i < data.length; i += 4) {\n const r = data[i];\n const g = data[i + 1];\n const b = data[i + 2];\n const max = Math.max(r, g, b);\n data[i] += max !== r ? (max - r) * adjust : 0;\n data[i + 1] += max !== g ? (max - g) * adjust : 0;\n data[i + 2] += max !== b ? (max - b) * adjust : 0;\n }\n }\n\n /**\n * Send data from this filter to its shader program's uniforms.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n */\n sendUniformData(\n gl: WebGLRenderingContext,\n uniformLocations: TWebGLUniformLocationMap,\n ) {\n gl.uniform1f(uniformLocations.uSaturation, -this.saturation);\n }\n\n isNeutralState() {\n return this.saturation === 0;\n }\n}\n\nclassRegistry.setClass(Saturation);\n","export const fragmentSource = `\n precision highp float;\n uniform sampler2D uTexture;\n uniform float uVibrance;\n varying vec2 vTexCoord;\n void main() {\n vec4 color = texture2D(uTexture, vTexCoord);\n float max = max(color.r, max(color.g, color.b));\n float avg = (color.r + color.g + color.b) / 3.0;\n float amt = (abs(max - avg) * 2.0) * uVibrance;\n color.r += max != color.r ? (max - color.r) * amt : 0.00;\n color.g += max != color.g ? (max - color.g) * amt : 0.00;\n color.b += max != color.b ? (max - color.b) * amt : 0.00;\n gl_FragColor = color;\n }\n`;\n","import { BaseFilter } from './BaseFilter';\nimport type { T2DPipelineState, TWebGLUniformLocationMap } from './typedefs';\nimport { classRegistry } from '../ClassRegistry';\nimport { fragmentSource } from './shaders/vibrance';\n\nexport type VibranceOwnProps = {\n vibrance: number;\n};\n\nexport const vibranceDefaultValues: VibranceOwnProps = {\n vibrance: 0,\n};\n\n/**\n * Vibrance filter class\n * @example\n * const filter = new Vibrance({\n * vibrance: 1\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n */\nexport class Vibrance extends BaseFilter<'Vibrance', VibranceOwnProps> {\n /**\n * Vibrance value, from -1 to 1.\n * Increases/decreases the saturation of more muted colors with less effect on saturated colors.\n * A value of 0 has no effect.\n *\n * @param {Number} vibrance\n */\n declare vibrance: VibranceOwnProps['vibrance'];\n\n static type = 'Vibrance';\n\n static defaults = vibranceDefaultValues;\n\n static uniformLocations = ['uVibrance'];\n\n getFragmentSource() {\n return fragmentSource;\n }\n\n /**\n * Apply the Vibrance operation to a Uint8ClampedArray representing the pixels of an image.\n *\n * @param {Object} options\n * @param {ImageData} options.imageData The Uint8ClampedArray to be filtered.\n */\n applyTo2d({ imageData: { data } }: T2DPipelineState) {\n const adjust = -this.vibrance;\n for (let i = 0; i < data.length; i += 4) {\n const r = data[i];\n const g = data[i + 1];\n const b = data[i + 2];\n const max = Math.max(r, g, b);\n const avg = (r + g + b) / 3;\n const amt = ((Math.abs(max - avg) * 2) / 255) * adjust;\n data[i] += max !== r ? (max - r) * amt : 0;\n data[i + 1] += max !== g ? (max - g) * amt : 0;\n data[i + 2] += max !== b ? (max - b) * amt : 0;\n }\n }\n\n /**\n * Send data from this filter to its shader program's uniforms.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {TWebGLUniformLocationMap} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n */\n sendUniformData(\n gl: WebGLRenderingContext,\n uniformLocations: TWebGLUniformLocationMap,\n ) {\n gl.uniform1f(uniformLocations.uVibrance, -this.vibrance);\n }\n\n isNeutralState() {\n return this.vibrance === 0;\n }\n}\n\nclassRegistry.setClass(Vibrance);\n"],"names":["BaseConfiguration","constructor","_defineProperty","window","devicePixelRatio","Configuration","config","configure","arguments","length","undefined","Object","assign","addFonts","paths","fontPaths","removeFonts","fontFamilys","forEach","fontFamily","clearFonts","restoreDefaults","keys","defaults","reduce","acc","key","log","severity","_len","optionalParams","Array","_key","console","FabricError","Error","message","options","SignalAbortedError","context","GLProbe","WebGLProbe","testPrecision","gl","precision","fragmentSource","fragmentShader","createShader","FRAGMENT_SHADER","shaderSource","compileShader","getShaderParameter","COMPILE_STATUS","queryWebGL","canvas","getContext","maxTextureSize","getParameter","MAX_TEXTURE_SIZE","GLPrecision","find","getExtension","loseContext","isSupported","textureSize","copyPasteData","getEnv","document","isTouchSupported","navigator","maxTouchPoints","dispose","env","setEnv","value","getBrowserEnv","getFabricDocument","getFabricWindow","getDevicePixelRatio","_config$devicePixelRa","Math","max","Cache","getFontCache","_ref","fontStyle","fontWeight","toLowerCase","charWidthsCache","fontCache","cacheKey","clearFontCache","limitDimsByArea","ar","perfLimitSizeTotal","roughWidth","sqrt","floor","cache","VERSION","version","noop","halfPI","PI","quarterPI","twoMathPi","PiBy180","iMatrix","freeze","DEFAULT_SVG_FONT_SIZE","ALIASING_LIMIT","kRect","CENTER","LEFT","TOP","BOTTOM","RIGHT","NONE","reNewline","MOVING","SCALING","ROTATING","ROTATE","SKEWING","RESIZING","MODIFY_POLY","MODIFY_PATH","CHANGED","SCALE","SCALE_X","SCALE_Y","SKEW_X","SKEW_Y","FILL","STROKE","MODIFIED","JSON","SVG","ClassRegistry","Map","has","classType","getClass","get","setClass","classConstructor","set","type","getSVGClass","SVGTagName","setSVGClass","classRegistry","AnimationRegistry","remove","index","indexOf","splice","cancelAll","animations","animation","abort","cancelByCanvas","filter","_animation$target","target","cancelByTarget","runningAnimations","Observable","on","arg0","handler","__eventListeners","entries","eventName","off","push","once","disposers","_ref2","d","disposer","onceHandler","args","call","_removeEventListener","eventListener","_ref3","fire","_this$__eventListener","listenersForEvent","concat","i","removeFromArray","array","idx","cos","angle","angleSlice","abs","sin","sign","Point","y","x","add","that","addEquals","scalarAdd","scalar","scalarAddEquals","subtract","subtractEquals","scalarSubtract","scalarSubtractEquals","multiply","scalarMultiply","scalarMultiplyEquals","divide","scalarDivide","scalarDivideEquals","eq","lt","lte","gt","gte","lerp","t","min","distanceFrom","dx","dy","midPointFrom","toString","setXY","setX","setY","setFromPoint","swap","clone","rotate","radians","origin","ZERO","sinus","cosinus","p","rotated","transform","ignoreOffset","isCollection","fabricObject","isArray","_objects","createCollectionMixin","Base","Collection","_onObjectAdded","object","_onObjectRemoved","_onStackOrderChanged","objects","size","insertAt","_len2","_key2","removed","_len3","_key3","forEachObject","callback","getObjects","_len4","types","_key4","o","isType","item","isEmpty","contains","deep","includes","some","obj","complexity","memo","current","sendObjectToBack","unshift","bringObjectToFront","sendObjectBackwards","intersecting","newIdx","findNewLowerIndex","bringObjectForward","findNewUpperIndex","moveObjectTo","isOverlapping","collectObjects","left","top","width","height","includeIntersecting","tl","br","selectable","visible","intersectsWithRect","isContainedWithinRect","containsPoint","CommonMethods","_setOptions","prop","_setObject","_set","toggle","property","requestAnimFrame","requestAnimationFrame","cancelAnimFrame","handle","cancelAnimationFrame","id","uid","createCanvasElement","element","createElement","createImage","copyCanvasElement","_newCanvas$getContext","newCanvas","createCanvasElementFor","drawImage","toDataURL","canvasEl","format","quality","isHTMLCanvas","toBlob","Promise","resolve","_","degreesToRadians","degrees","radiansToDegrees","isIdentityMatrix","mat","every","transformPoint","invertTransform","a","r","multiplyTransformMatrices","b","is2x2","multiplyTransformMatrixArray","matrices","reduceRight","product","curr","calcPlaneRotation","atan2","qrDecompose","denom","pow","scaleX","scaleY","skewX","skewY","translateX","translateY","createTranslateMatrix","createRotateMatrix","angleRadiant","cosValue","sinValue","createScaleMatrix","angleToSkew","tan","createSkewXMatrix","skewValue","createSkewYMatrix","calcDimensionsMatrix","flipX","flipY","matrix","composeMatrix","scaleMatrix","loadImage","url","signal","crossOrigin","reject","aborted","img","err","src","addEventListener","done","onload","onerror","removeEventListener","enlivenObjects","reviver","instances","all","map","fromObject","then","fabricInstance","catch","error","instance","finally","enlivenObjectEnlivables","serializedObject","promises","values","enlived","pick","source","pickBy","predicate","toFixed","number","fractionDigits","parseFloat","Number","matrixToSVG","NUM_FRACTION_DIGITS","join","isFiller","filler","toLive","isSerializableFiller","toObject","isPattern","offsetX","isTextObject","_renderText","isPath","_renderPathCommands","isActiveSelection","getScrollLeftTop","doc","getDocumentFromElement","elementLoop","docElement","documentElement","body","scrollLeft","scrollTop","parentNode","host","nodeType","style","position","el","ownerDocument","getWindowFromElement","_el$ownerDocument","defaultView","setCanvasDimensions","ctx","retinaScaling","setAttribute","scale","setCSSDimensions","getElementOffset","_getWindowFromElement","offset","elemStyle","getComputedStyle","parseInt","borderLeftWidth","borderTopWidth","paddingLeft","paddingTop","box","docElem","getBoundingClientRect","scrollLeftTop","clientLeft","clientTop","makeElementUnselectable","onselectstart","userSelect","StaticCanvasDOMManager","createLowerCanvas","lower","getElementById","hasAttribute","_originalCanvasStyle","cssText","classList","cleanupDOM","removeAttribute","setDimensions","calcOffset","staticCanvasDefaults","backgroundVpt","backgroundColor","overlayVpt","overlayColor","includeDefaultValues","svgViewportTransformation","renderOnAddRemove","skipOffscreen","enableRetinaScaling","imageSmoothingEnabled","controlsAboveOverlay","allowTouchScrolling","viewportTransform","StaticCanvas","lowerCanvasEl","_this$elements$lower","elements","contextContainer","_this$elements$lower2","getDefaults","ownDefaults","initElements","_setDimensionsImpl","skipControlsDrawing","calcViewportBoundaries","requestRenderAll","setCoords","getRetinaScaling","_offset","getWidth","getHeight","dimensions","cssOnly","backstoreOnly","hasLostContext","getZoom","setViewportTransform","vpt","zoomToPoint","point","before","newPoint","after","setZoom","absolutePan","relativePan","getElement","clearContext","clearRect","clear","backgroundImage","overlayImage","renderAll","cancelRequestedRender","destroyed","renderCanvas","renderAndReset","nextRenderHandle","disposed","iVpt","vptCoords","tr","bl","drawControls","_ctx","v","path","clipPath","patternQuality","_renderBackground","save","_renderObjects","restore","shouldCache","_transformDone","renderCache","forClipping","drawClipPathOnCanvas","_renderOverlay","__cleanupTask","globalCompositeOperation","zoomX","zoomY","_cacheCanvas","cacheTranslationX","cacheTranslationY","len","render","_renderBackgroundOrOverlay","fill","needsVpt","isAFiller","beginPath","moveTo","lineTo","closePath","fillStyle","offsetY","m","gradientTransform","patternTransform","getCenterPoint","centerObjectH","_centerObject","centerObjectV","centerObject","viewportCenterObject","getVpCenter","viewportCenterObjectH","viewportCenterObjectV","center","toDatalessJSON","propertiesToInclude","toDatalessObject","_toObjectMethod","toJSON","methodName","clipPathData","excludeFromExport","_toObject","__serializeBgOverlay","originalValue","data","bgImage","bgColor","background","overlay","toSVG","markup","_setSVGPreamble","_setSVGHeader","clipPathId","_setSVGBgOverlayColor","_setSVGBgOverlayImage","_setSVGObjects","suppressPreamble","encoding","optViewBox","viewBox","createSVGFontFacesMarkup","createSVGRefElementsMarkup","createSVGClipPathMarkup","toClipPathSVG","shouldTransform","additionalTransform","fontList","styles","styleRow","fontListMarkup","_setSVGObject","bgOrOverlay","repeat","finalWidth","finalHeight","shouldInvert","loadFromJSON","json","serialized","parse","enlivedMap","properties","cloneWithoutData","multiplier","finalMultiplier","toCanvasElement","scaledWidth","scaledHeight","zoom","originalWidth","originalHeight","originalSkipControlsDrawing","newZoom","vp","newVp","originalRetina","objectsToRender","task","destroy","kill","touchEvents","getTouchInfo","event","touchProp","changedTouches","getPointer","scroll","_evt","clientX","clientY","isTouchEvent","pointerType","stopEvent","e","preventDefault","stopPropagation","makeBoundingBoxFromPoints","points","removeTransformFromObject","inverted","finalTransform","calcOwnMatrix","applyTransformToObject","addTransformToObject","otherOptions","setPositionByOrigin","resetObjectTransform","saveObjectTransform","sizeAfterTransform","dimX","dimY","bbox","calcPlaneChangeMatrix","from","to","sendPointToPlane","sendVectorToPlane","sendObjectToPlane","fireEvent","_target$canvas","originOffset","bottom","right","resolveOrigin","originValue","unitVectorX","zero","rotateVector","vector","createVector","magnitude","calcAngleBetweenVectors","crossProduct","dotProduct","calcVectorRotation","getUnitVector","getOrthonormalVector","counterClockwise","isBetweenVectors","AxB","AxT","BxT","NOT_ALLOWED_CURSOR","getActionFromCorner","alreadySelected","corner","control","controls","getActionName","isTransformCentered","originX","originY","invertOrigin","isLocked","lockingKey","commonEventInfo","eventData","pointer","findCornerQuadrant","coord","round","normalizePoint","getRelativeCenterPoint","translateToGivenOrigin","p2","getLocalPoint","padding","localPoint","dragHandler","newLeft","newTop","moveX","moveY","ColorNameMap","aliceblue","antiquewhite","aqua","aquamarine","azure","beige","bisque","black","blanchedalmond","blue","blueviolet","brown","burlywood","cadetblue","chartreuse","chocolate","coral","cornflowerblue","cornsilk","crimson","cyan","darkblue","darkcyan","darkgoldenrod","darkgray","darkgrey","darkgreen","darkkhaki","darkmagenta","darkolivegreen","darkorange","darkorchid","darkred","darksalmon","darkseagreen","darkslateblue","darkslategray","darkslategrey","darkturquoise","darkviolet","deeppink","deepskyblue","dimgray","dimgrey","dodgerblue","firebrick","floralwhite","forestgreen","fuchsia","gainsboro","ghostwhite","gold","goldenrod","gray","grey","green","greenyellow","honeydew","hotpink","indianred","indigo","ivory","khaki","lavender","lavenderblush","lawngreen","lemonchiffon","lightblue","lightcoral","lightcyan","lightgoldenrodyellow","lightgray","lightgrey","lightgreen","lightpink","lightsalmon","lightseagreen","lightskyblue","lightslategray","lightslategrey","lightsteelblue","lightyellow","lime","limegreen","linen","magenta","maroon","mediumaquamarine","mediumblue","mediumorchid","mediumpurple","mediumseagreen","mediumslateblue","mediumspringgreen","mediumturquoise","mediumvioletred","midnightblue","mintcream","mistyrose","moccasin","navajowhite","navy","oldlace","olive","olivedrab","orange","orangered","orchid","palegoldenrod","palegreen","paleturquoise","palevioletred","papayawhip","peachpuff","peru","pink","plum","powderblue","purple","rebeccapurple","red","rosybrown","royalblue","saddlebrown","salmon","sandybrown","seagreen","seashell","sienna","silver","skyblue","slateblue","slategray","slategrey","snow","springgreen","steelblue","teal","thistle","tomato","turquoise","violet","wheat","white","whitesmoke","yellow","yellowgreen","reRGBa","reHSLa","reHex","hue2rgb","q","rgb2Hsl","g","maxValue","minValue","h","s","l","fromAlphaToFloat","endsWith","hexify","toUpperCase","padStart","greyAverage","avg","Color","color","setSource","_source","_tryParsingColor","sourceFromHex","sourceFromRgb","sourceFromHsl","isUnrecognised","getSource","toRgb","toRgba","toHsl","toHsla","toHex","fullHex","toHexa","slice","getAlpha","setAlpha","alpha","toGrayscale","toBlackWhite","threshold","average","bOrW","overlayWith","otherColor","otherAlpha","otherSource","R","G","B","fromRgb","fromRgba","match","parsedValue","fromHsl","fromHsla","match1degrees","parseAngletoDegrees","fromHex","isShortNotation","expandedValue","split","hex","hexCouple","lowercase","numeric","getSvgAttributes","commonAttributes","parseUnit","fontSize","unit","exec","dpi","DPI","parseAlign","align","parsePreserveAspectRatioAttribute","attribute","firstPart","secondPart","trim","alignX","alignY","meetOrSlice","colorPropToSVG","inlineStyle","colorValue","opacityValue","opacity","createSVGRect","svgColor","w","FabricObjectSVGExportMixin","getSvgStyles","skipShadow","fillRule","strokeWidth","strokeDashArray","strokeDashOffset","strokeLineCap","strokeLineJoin","strokeMiterLimit","visibility","getSvgFilter","stroke","shadow","getSvgCommons","getSvgTransform","full","calcTransformMatrix","svgTransform","_toSVG","_reviver","_createBaseSVGMarkup","_createBaseClipPathSVGMarkup","objectMarkup","commonPieces","noStyle","withShadow","styleInfo","shadowInfo","vectorEffect","strokeUniform","absoluteClipPath","absolutePositioned","clipPathMarkup","addPaintOrder","paintFirst","getSvgRegex","arr","RegExp","TEXT_DECORATION_THICKNESS","fontProperties","textDecorationProperties","textLayoutProperties","additionalProps","styleProperties","textDefaultValues","_reNewline","_reSpacesAndTabs","_reSpaceAndTab","_reWords","underline","overline","linethrough","textAlign","lineHeight","textBackgroundColor","pathStartOffset","pathSide","pathAlign","charSpacing","deltaY","direction","CACHE_FONT_SIZE","MIN_TEXT_WIDTH","superscript","baseline","subscript","_fontSizeFraction","offsets","_fontSizeMult","JUSTIFY","JUSTIFY_LEFT","JUSTIFY_RIGHT","JUSTIFY_CENTER","reNum","String","raw","viewportSeparator","svgNS","reFontDeclaration","svgValidTagNames","svgViewBoxElements","svgInvalidAncestors","svgValidParents","attributesMap","cx","cy","display","fSize","cPath","svgValidTagNamesRegEx","svgViewBoxElementsRegEx","svgValidParentsRegEx","reViewBoxAttrValue","shadowOffsetRegex","reOffsetsAndBlur","shadowDefaultValues","blur","affectStroke","nonScaling","Shadow","parseShadow","shadowStr","replace","BLUR_BOX","fBoxX","fBoxY","capValue","stateProperties","cacheProperties","fabricObjectDefaultValues","minScaleLimit","objectCaching","centeredRotation","centeredScaling","dirty","interactiveObjectDefaultValues","noScaleCache","lockMovementX","lockMovementY","lockRotation","lockScalingX","lockScalingY","lockSkewingX","lockSkewingY","lockScalingFlip","cornerSize","touchCornerSize","transparentCorners","cornerColor","cornerStrokeColor","cornerStyle","cornerDashArray","hasControls","borderColor","borderDashArray","borderOpacityWhenMoving","borderScaleFactor","hasBorders","selectionBackgroundColor","evented","perPixelTargetFind","activeOn","hoverCursor","moveCursor","normalize","c","asin","elastic","defaultEasing","easeInCubic","easeOutCubic","easeInOutCubic","easeInQuart","easeOutQuart","easeInOutQuart","easeInQuint","easeOutQuint","easeInOutQuint","easeInSine","easeOutSine","easeInOutSine","easeInExpo","easeOutExpo","easeInOutExpo","easeInCirc","easeOutCirc","easeInOutCirc","easeInElastic","normA","normS","normP","easeOutElastic","normC","easeInOutElastic","easeInBack","easeOutBack","easeInOutBack","easeOutBounce","easeInBounce","easeInOutBounce","easeInQuad","easeOutQuad","easeInOutQuad","defaultAbort","AnimationBase","startValue","byValue","duration","delay","easing","onStart","onChange","onComplete","tick","bind","_onStart","_onChange","_onComplete","_abort","endValue","calculate","state","_state","isDone","start","firstTick","timestamp","startTime","Date","register","setTimeout","durationMs","boundDurationMs","durationProgress","valueProgress","unregister","ValueAnimation","timeElapsed","ArrayAnimation","defaultColorEasing","wrapColorCallback","rgba","ColorAnimation","startColor","endColor","isArrayAnimation","animate","animateColor","Intersection","status","append","isPointContained","T","A","infinite","AB","AT","isPointInPolygon","other","hits","inter","intersectSegmentSegment","intersectLineLine","a1","a2","b1","b2","aInfinite","bInfinite","a2xa1x","a2ya1y","b2xb1x","b2yb1y","a1xb1x","a1yb1y","uaT","ubT","uB","ua","ub","segmentsCoincide","intersectSegmentLine","s1","s2","l1","l2","intersectLinePolygon","result","intersectSegmentPolygon","intersectPolygonPolygon","points1","points2","coincidences","intersectPolygonRectangle","r1","r2","topRight","bottomLeft","ObjectGeometry","getX","getXY","getY","getRelativeX","setRelativeX","getRelativeY","setRelativeY","relativePosition","getRelativeXY","group","setRelativeXY","isStrokeAccountedForInDimensions","getCoords","aCoords","calcACoords","coords","intersection","intersectsWithObject","isContainedWithinObject","getBoundingRect","isOnScreen","isPartiallyOnScreen","allPointsAreOutside","getScaledWidth","_getTransformedDimensions","getScaledHeight","scaleToWidth","boundingRectFactor","scaleToHeight","getCanvasRetinaScaling","_this$canvas","getTotalAngle","getViewportTransform","_this$canvas2","rotateMatrix","tMatrix","finalMatrix","dim","transformMatrixKey","skipGroup","prefix","matrixCache","ownMatrixCache","_getNonTransformedDimensions","_calculateCurrentDimensions","dimOptions","preScalingStrokeValue","postScalingStrokeValue","noSkew","finalDimensions","fromOriginX","fromOriginY","toOriginX","toOriginY","translateToCenterPoint","translateToOriginPoint","relCenter","getPointByOrigin","pos","_getLeftTopCoords","FabricObject","name","setOptions","_createCacheCanvas","_cacheContext","_updateCacheCanvas","_limitCacheSize","dims","maxCacheSideLimit","minCacheSideLimit","limX","limY","capped","_getCacheCanvasDimensions","objectScale","getTotalObjectScaling","neededX","neededY","ceil","dimensionsChanged","zoomChanged","shouldRedraw","setTransform","drawingWidth","drawingHeight","translate","needFullTransform","contextTop","getObjectScaling","retina","getObjectOpacity","_constrainScale","isChanged","parent","isNotVisible","_setupCompositeOperation","drawSelectionBackground","_setOpacity","_setShadow","drawCacheOnCanvas","_removeCacheCanvas","drawObject","isCacheDirty","parentClipPaths","hasStroke","hasFill","needsItsOwnCache","ownCaching","isOnACache","willDrawShadow","drawClipPathOnCache","canvasWithClipPath","originalFill","originalStroke","_setClippingProperties","_render","_drawClipPath","createClipPathLayer","prevClipPath","skipCanvas","fillRect","_removeShadow","globalAlpha","_setStrokeStyles","decl","lineWidth","lineCap","lineDashOffset","lineJoin","miterLimit","gradientUnits","_applyPatternForTransformedGradient","strokeStyle","_applyPatternGradientTransform","_setFillStyles","_setLineDash","dashArray","setLineDash","sx","sy","multX","multY","scaling","shadowColor","shadowBlur","browserShadowBlurConstant","shadowOffsetX","shadowOffsetY","_renderPaintInOrder","_renderStroke","_renderFill","_pCtx$createPattern","pCanvas","pCtx","createPattern","_findCenterFromElement","objectForm","cloneAsImage","ImageClass","origParams","originalGroup","originalShadow","canvasProvider","withoutTransform","withoutShadow","boundingRect","shadowOffset","originalCanvas","setOnGroup","animatable","_animate","propIsColor","colorProperties","animationOptions","isDescendantOf","getAncestors","ancestors","findCommonAncestors","fork","otherFork","common","otherAncestors","ancestor","j","hasCommonAncestors","commonAncestors","isInFrontOf","ancestorData","firstCommonAncestor","headOfFork","pop","headOfOtherFork","thisIndex","otherIndex","propertiesToSerialize","customProperties","toFixedBound","val","_removeDefaultValues","hasStaticDefaultValues","baseValues","getPrototypeOf","baseValue","_fromObject","serializedObjectOptions","extraParam","enlivedObjectOptions","wrapWithFireEvent","actionHandler","extraEventInfo","actionPerformed","wrapWithFixedAnchor","centerPoint","constraint","changeObjectWidth","strokePadding","oldWidth","newWidth","changeWidth","renderCircleControl","styleOverride","xSize","sizeX","ySize","sizeY","myLeft","myTop","arc","renderSquareControl","xSizeBy2","ySizeBy2","strokeRect","Control","shouldActivate","controlKey","_fabricObject$canvas","getActiveObject","isControlVisible","getActionHandler","getMouseDownHandler","mouseDownHandler","getMouseUpHandler","mouseUpHandler","cursorStyleHandler","cursorStyle","actionName","getVisibility","_fabricObject$_contro","_fabricObject$_contro2","_controlsVisibility","setVisibility","positionHandler","currentControl","calcCornerCoords","objectCornerSize","centerX","centerY","isTouch","touchSizeX","touchSizeY","rotationStyleHandler","rotateObjectWithSnapping","ex","ey","theta","pivotPoint","lastAngle","curAngle","snapAngle","snapThreshold","rightAngleLocked","leftAngleLocked","hasRotated","rotationWithSnapping","scaleIsProportional","uniformIsToggled","uniScaleKey","uniformScaling","scalingIsForbidden","by","scaleProportionally","lockX","lockY","scaleMap","scaleCursorStyleHandler","n","scaleObject","forbidScaling","signX","signY","gestureScale","distance","original","originalDistance","oldScaleX","oldScaleY","scaleObjectFromCorner","scaleObjectX","scaleObjectY","scalingEqually","scalingX","scalingY","AXIS_KEYS","counterAxis","skew","lockSkewing","flip","skewMap","skewCursorStyleHandler","skewObject","axis","skewingSide","skewKey","skewingBefore","skewingStart","shearingStart","shearing","skewing","atan","changed","dimBefore","dimAfter","compensationFactor","skewHandler","originKey","lockSkewingKey","flipKey","counterOriginKey","counterFlipKey","counterOriginFactor","skewingDirection","finalHandler","skewHandlerX","skewHandlerY","isAltAction","altActionKey","scaleOrSkewActionName","isAlternative","scaleSkewCursorStyleHandler","scalingXOrSkewingY","scalingYOrSkewingX","createObjectDefaultControls","ml","mr","mb","mt","mtr","withConnection","createResizeControls","createTextboxDefaultControls","InteractiveFabricObject","createControls","targetCanvas","_currentTransform","action","startsWith","getActiveControl","__corner","oCoords","findControl","forTouch","cornerEntries","touchCorner","calcOCoords","rMatrix","positionMatrix","startMatrix","transformOptions","forEachControl","_calcCornerCoords","fn","_activeObject","wh","strokeBorders","_drawBorders","drawControlsConnectingLines","_renderControls","styleOptions","shouldDrawBorders","shouldDrawControls","isMoving","drawBorders","forActiveSelection","shouldStroke","setControlVisible","setControlsVisibility","clearContextTop","restoreManually","onDeselect","_options","onSelect","shouldStartDragging","_e","onDragStart","canDrop","renderDragSourceEffect","renderDropTargetEffect","applyMixins","derivedCtor","constructors","baseCtor","getOwnPropertyNames","prototype","defineProperty","getOwnPropertyDescriptor","create","isTransparent","tolerance","getImageData","alphaChannel","findIndexRight","StrokeProjectionsBase","strokeProjectionMagnitude","strokeUniformScalar","createSideVector","projectOrthogonally","applySkew","calcOrthogonalProjection","isSkewed","scaleUnitVector","unitVector","zeroVector","StrokeLineJoinProjections","getOrthogonalRotationFactor","vector1","vector2","C","AC","bisector","orthogonalProjection","correctSide","projectBevel","projections","projectMiter","hypotUnitScalar","miterVector","projectRoundNoSkew","startCircle","endCircle","radiusOnAxisX","radiusOnAxisY","projectRoundWithSkew","circleRadius","newY","furthestY","newX","furthestX","projectRound","isStraightLine","newOrigin","proj0","proj1","comparisonVector","isProj0Start","projectPoints","project","originPoint","projectedPoint","StrokeLineCapProjections","projectButt","projection","projectSquare","strokePointingOut","projectedA","projectStrokeOnPoints","openPath","reduced","cloneStyles","newObj","keyInner","capitalize","string","firstLetterOnly","charAt","escapeXml","segmenter","getSegmenter","Intl","Segmenter","granularity","graphemeSplit","textstring","segments","segment","graphemeSplitImpl","graphemes","chr","getWholeChar","str","code","charCodeAt","isNaN","next","prev","hasStyleChanged","prevStyle","thisStyle","forTextSpans","textDecorationThickness","stylesToArray","text","textLines","stylesArray","charIndex","chars","end","stylesFromArray","stylesObject","styleIndex","SHARED_ATTRIBUTES","selectorMatches","selector","nodeName","classNames","getAttribute","azAz","matcher","splitClassNames","doesSomeParentMatch","selectors","parentMatching","parentElement","elementMatchesRule","firstMatching","getGlobalStylesForElement","cssRules","rule","normalizeAttr","attr","_attributesMap","regex","cleanupSvgAttribute","attributeValue","transforms","transformList","reTransformList","reTransform","reTransformAll","parseTransformAttribute","test","matchAll","transformMatch","matchedParams","operation","rawArgs","arg1","arg2","arg3","arg4","arg5","arg","normalizeValue","parentAttributes","parsed","ouputValue","transformMatrix","fillIndex","strokeIndex","parseFontDeclaration","oStyle","parseStyleObject","parseStyleString","chunk","parseStyleAttribute","colorAttributesMap","setStrokeFillOpacity","attributes","colorAttr","parseAttributes","parentFontSize","ownAttributes","normalizedStyle","normalizedAttr","normalizedValue","font","mergedAttrs","rectDefaultValues","rx","ry","RECT_PROPS","Rect","_initRxRy","isRounded","bezierCurveTo","fromElement","restOfparsedAttributes","ATTRIBUTE_NAMES","Boolean","LAYOUT_TYPE_INITIALIZATION","LAYOUT_TYPE_ADDED","LAYOUT_TYPE_REMOVED","LAYOUT_TYPE_IMPERATIVE","LAYOUT_TYPE_OBJECT_MODIFIED","LAYOUT_TYPE_OBJECT_MODIFYING","getObjectBounds","destinationGroup","currentGroup","objectCenter","accountForStroke","strokeUniformVector","scalingStrokeWidth","sizeVector","LayoutStrategy","calcLayoutResult","shouldPerformLayout","calcBoundingBox","prevStrategy","strategy","shouldLayoutClipPath","getInitialSize","overrides","bboxSize","bboxLeftTop","bboxCenter","actualSize","relativeCorrection","FitContentLayout","LAYOUT_MANAGER","LayoutManager","_subscriptions","performLayout","strictContext","bubbles","_prevLayoutStrategy","onBeforeLayout","layoutResult","getLayoutResult","commitLayout","onAfterLayout","attachHandlers","trigger","subscribe","unsubscribe","_context","delete","unsubscribeTargets","targets","subscribeTargets","tricklingContext","layoutManager","prevCenter","nextCenter","correction","layoutObjects","_context$x","_context$y","layoutObject","bubblingContext","NoopLayoutManager","groupDefaultValues","subTargetCheck","interactive","Group","groupInit","_options$layoutManage","__objectSelectionTracker","__objectSelectionMonitor","__objectSelectionDisposer","enterGroup","canEnterGroup","_filterObjectsBeforeEnteringGroup","allowedObjects","_onAfterObjectsChange","removeParentTransform","exitGroup","_shouldSetNestedCoords","removeAll","_activeObjects","selected","activeObjects","_watchObject","watch","_enterGroup","activeObject","_exitGroup","ownCache","preserveObjectStacking","triggerLayout","__serializeObjects","method","_includeDefaultValues","originalDefaults","_createSVGBgRect","fillStroke","commons","svgString","bg","abortable","hydratedOptions","layoutClass","strategyClass","groupSVGElements","findScaleToFit","destination","findScaleToCover","commaWsp","reArcCommandPoints","rePathCommand","repeatedCommands","M","segmentToBezier","theta1","theta2","cosTh","sinTh","cx1","cy1","mT","fromX","fromY","costh1","sinth1","costh2","sinth2","toX","toY","cp1X","cp1Y","cp2X","cp2Y","arcToSegments","large","sweep","rotateX","root","sinTheta","px","py","rx2","ry2","py2","px2","pl","_rx","_ry","mTheta","calcVectorAngle","dtheta","mDelta","th3","ux","uy","vx","vy","ta","tb","CB1","CB2","CB3","CB4","getBoundsOfCurve","begx","begy","cp1x","cp1y","cp2x","cp2y","endx","endy","argsString","cachesBoundsOfCurve","boundsOfCurveCache","tvalues","bounds","b2ac","sqrtb2ac","t1","t2","jlen","iterator","getPointOnCubicBezierIterator","fromArcToBeziers","fx","fy","rot","tx","ty","segsNorm","makePathSimpler","x1","y1","destinationPath","previous","controlX","controlY","parsedCommand","converted","calcLineLength","x2","y2","pct","c1","c2","c3","c4","QB1","QB2","QB3","getTangentCubicIterator","p1x","p1y","p2x","p2y","p3x","p3y","p4x","p4y","qb1","qb2","qb3","tangentX","tangentY","getPointOnQuadraticBezierIterator","getTangentQuadraticIterator","invT","pathIterator","tempP","tmpLen","perc","findPercentageForDistance","segInfo","nextLen","nextStep","lastPerc","angleFinder","getPathSegmentsInfo","totalLength","tempInfo","info","basicInfo","command","destX","destY","getPointOnPath","infos","segPercent","rePathCmdAll","regExpArcCommandPoints","reMyNum","commandLengths","parsePath","pathString","_pathString$match","chain","matchStr","commandLetter","commandLength","paramArr","lastIndex","out","newCommand","transformedCommand","getSmoothPathFromPoints","p1","multSignX","multSignY","manyPoints","midPoint","transformPath","pathOffset","pathSegment","newSegment","getRegularPolygonPath","numVertexes","radius","interiorAngle","rotationAdjustment","rad","joinPath","pathData","mergeClipPaths","_b$group","getRandomInt","random","_assignTransformMatrixProps","removeTransformMatrixForSvgParsing","preserveAspectRatioOptions","cropX","cropY","offsetLeft","offsetTop","setStyle","elementStyle","setProperty","CanvasDOMManager","containerClass","upperCanvasEl","createUpperCanvas","upper","applyCanvasStyle","container","createContainerElement","replaceChild","className","removeChild","canvasDefaults","centeredKey","selection","selectionKey","selectionColor","selectionDashArray","selectionBorderColor","selectionLineWidth","selectionFullyContained","defaultCursor","freeDrawingCursor","notAllowedCursor","targetFindTolerance","skipTargetFind","stopContextMenu","fireRightClick","fireMiddleClick","enablePointerEvents","SelectableCanvas","_this$elements$upper","_this$elements$upper2","wrapperEl","_objectsToRender","deselected","_discardActiveObject","_hoveredTarget","_hoveredTargets","_chooseObjectsToRender","contextTopDirty","_groupSelector","isDrawingMode","renderTopLayer","_isCurrentlyDrawing","freeDrawingBrush","_drawSelection","renderTop","setTargetFindTolerance","pixelFindCanvasEl","pixelFindContext","isTargetTransparent","selectionBgc","enhancedTolerance","_isSelectionKeyPressed","sKey","_shouldClearSelection","getActiveObjects","_shouldCenterTransform","modifierKeyPressed","centerTransform","_getOriginFromCorner","controlName","_setupCurrentTransform","_control$getActionHan","getScenePoint","altKey","lastX","lastY","shiftKey","setCursor","cursor","deltaX","extent","strokeOffset","minX","minY","maxX","maxY","findTarget","_targetInfo","subTargets","currentSubTargets","aObjects","targetInfo","searchPossibleTargets","currentContainer","currentTarget","fullTargetInfo","activeObjectTargetInfo","activeObjectControl","getViewportPoint","altSelectionKey","_pointIsInObjectSelectionArea","viewportZoom","angleRadians","cosP","sinP","cosPSinP","cosPMinusSinP","_checkTarget","isEditing","viewportPoint","_searchPossibleTargets","subTarget","_viewportPoint","_getPointerImpl","_scenePoint","fromViewport","boundsWidth","boundsHeight","cssScale","_resetTransformEventData","_setBrushStyles","willReadFrequently","getTopContext","getSelectionContext","getSelectionElement","active","_fireSelectionEvents","oldObjects","somethingChanged","invalidate","added","setActiveObject","currentActives","_setActiveObject","prevActiveObject","endCurrentTransform","discardActiveObject","discarded","_finalizeCurrentTransform","_scaling","originalProperties","_realizeGroupTransformOnObject","layoutProps","originalValues","TextEditingManager","cb","hiddenTextarea","focus","__disposer","exitTextEditing","exitEditing","onMouseMove","_this$target","updateSelectionOnMouseMove","addEventOptions","passive","getEventPoints","scenePoint","addListener","removeListener","syntheticEventConfig","mouse","in","targetIn","targetOut","canvasIn","canvasOut","drag","Canvas","eventHandler","addOrRemove","_getEventPrefix","functor","_eventjsFunctor","canvasElement","eventTypePrefix","_onResize","_onMouseDown","_onMouseMove","_onMouseOut","_onMouseEnter","_onMouseWheel","_onContextMenu","_onClick","_onDragStart","_onDragEnd","_onDragOver","_onDragEnter","_onDragLeave","_onDrop","_onTouchStart","removeListeners","_onMouseUp","_onTouchEnd","clearTimeout","_willAddMouseDown","_cacheTransformEventData","_handleEvent","shared","nestedTarget","_isClick","_dragSource","_onDragProgress","_renderDragEffects","dropTarget","_dropTarget","didDrop","dataTransfer","dropEffect","dragSource","_draggedoverTarget","eventType","_fireEnterLeaveEvents","_basicEventHandler","clicks","detail","getPointerId","evt","identifier","pointerId","_isMainEvent","isPrimary","touches","mainTouchId","shouldPreventScrolling","currentActiveObject","__onMouseDown","__onMouseUp","__onMouseMove","_shouldRender","_this$_activeObject","isClick","button","_onMouseUpInDrawingMode","shouldRender","targetWasActive","handleSelection","found","originalControl","originalMouseUpHandler","_setCursorFromEvent","extraData","_onMouseDownInDrawingMode","onMouseDown","_onMouseMoveInDrawingMode","onMouseUp","grouped","handleMultiSelection","groupSelector","_fireOverOutEvents","_transformObject","textEditingManager","fireSyntheticInOutEvents","oldTarget","fireCanvas","draggedoverTarget","targetChanged","outOpt","nextTarget","inOpt","previousTarget","localPointer","_performTransformAction","activeSelection","reverse","_target","isAS","prevActiveObjects","multiSelectAdd","klass","newActiveSelection","point1","point2","collectedObjects","linearDefaultCoords","radialDefaultCoords","ifNaN","valueIfNaN","RE_PERCENT","isPercent","parsePercent","NaN","RE_KEY_VALUE_PAIRS","RE_KEY_VALUE","parseColorStop","opacityMultiplier","keyValuePairs","parseColorStops","opacityAttr","colorStops","colorStopEls","getElementsByTagName","parseType","parseGradientUnits","convertPercentUnitsToValues","valuesToConvert","finalValue","propValue","getValue","parseLinearCoords","parseRadialCoords","parseCoords","Gradient","addColorStop","colorStop","preTransform","sort","needsSwap","minRadius","maxRadius","percentageShift","gradient","createLinearGradient","createRadialGradient","svgOptions","viewBoxWidth","viewBoxHeight","Pattern","isImageSource","isCanvasSource","sourceToString","complete","naturalWidth","naturalHeight","patternSource","patternOffsetX","patternOffsetY","patternWidth","patternHeight","BaseBrush","_saveAndTransform","needsFullRender","_resetShadow","_isOutSideCanvas","Path","_setPath","adjustPosition","setBoundingBox","_calcBoundsFromPath","quadraticCurveTo","pathCmd","sourcePath","_getOffsetTransform","digits","_calcDimensions","subpathStartX","subpathStartY","parsedAttributes","isEmptySVGPath","PencilBrush","_points","_hasStraightLine","drawSegment","drawStraightLine","straightLineKey","_prepareForDrawing","_addPoint","limitedToCanvasSize","oldEnd","_finalizeAndAddPath","_reset","convertPointsToSVGPath","createPath","decimatePoints","lastPoint","cDistance","adjustedDistance","newPoints","decimate","CIRCLE_PROPS","circleDefaultValues","startAngle","endAngle","Circle","setRadius","getRadiusX","getRadiusY","startX","startY","endX","endY","largeFlag","sweepFlag","otherParsedAttributes","CircleBrush","drawDot","addPoint","dot","originalRenderOnAddRemove","circles","circle","pointerPoint","getUniqueRects","rects","uniqueRects","uniqueRectsArray","SprayBrush","sprayChunks","sprayChunk","addSprayChunk","renderChunck","chunck","rect","optimizeOverlapping","sprayChunck","density","dotWidthVariance","dotWidth","randomOpacity","PatternBrush","getPatternSrc","dotDistance","patternCanvas","patternCtx","getPattern","pattern","topLeft","coordProps","Line","_setWidthHeight","calcLinePoints","origStrokeStyle","_this$stroke","_x1","_x2","_y1","_y2","xMult","yMult","triangleDefaultValues","Triangle","widthBy2","heightBy2","ellipseDefaultValues","ELLIPSE_PROPS","Ellipse","getRx","getRy","parsePointsAttribute","pointsSplit","parsedPoints","polylineDefaultValues","exactBoundingBox","Polyline","initialized","isOpen","_projectStrokeOnPoints","strokeDiff","bboxNoStroke","layoutProperties","_options$width","_options$height","_options$width2","_options$height2","output","diffX","diffY","Polygon","StyledText","isEmptyStyles","lineIndex","line","p3","styleHas","cleanStyle","stylesCount","letterCount","stylePropertyValue","allStyleObjectPropertiesMatch","graphemeCount","styleObject","stylePropertyHasBeenSet","_textLines","removeStyle","lineNum","charNum","_extendStyles","get2DCursorLocation","_getLineStyle","_setLineStyle","newStyle","_getStyleDeclaration","_setStyleDeclaration","getSelectionStyles","startIndex","endIndex","getStyleAtPosition","getCompleteStyleDeclaration","setSelectionStyles","_forceClearCache","_lineStyle$charIndex","lineStyle","_styleProperties","_deleteStyleDeclaration","_deleteLineStyle","multipleSpacesRegex","dblQuoteRegex","createSVGInlineRect","TextSVGExportMixin","_getSVGLeftTopOffsets","textAndBg","_getSVGTextAndBg","textTop","textLeft","_wrapSVGTextAndBg","textSvg","lineTop","getHeightOfLine","textBgRects","textSpans","noShadow","textDecoration","getSvgTextDecoration","textTopOffset","textLeftOffset","lineOffset","_getLineLeftOffset","_setSVGTextLineBg","_setSVGTextLineText","_createTextCharSpan","char","styleDecl","charBox","numFractionDigit","styleProps","getSvgSpanStyles","fillStyles","dySpan","renderLeft","angleAttr","wBy2","renderPoint","isJustify","actualStyle","nextStyle","charsToRender","boxWidth","timeToRender","__charBounds","kernedWidth","leftOffset","heightOfLine","boxStart","currentColor","lastColor","getValueOfPropertyAt","useWhiteSpace","thickness","decoration","measuringContext","getMeasuringContext","FabricText","setPathInfo","initDimensions","segmentsInfo","_splitText","newLines","_splitTextIntoLines","lines","graphemeLines","_unwrappedTextLines","_unwrappedLines","_text","graphemeText","_clearCache","calcTextWidth","cursorWidth","calcTextHeight","enlargeSpaces","diffSpace","currentLineWidth","numberOfSpaces","accumulatedSpace","charBound","spaces","isEndOfWrapping","getLineWidth","missingNewlineOffset","_lineIndex","selectionStart","skipWrapping","_setTextStyles","_renderTextLinesBackground","_renderTextDecoration","_renderTextStroke","_renderTextFill","charStyle","forMeasuring","textBaseline","_getFontDeclaration","maxWidth","_renderTextLine","_renderChars","_getLeftOffset","lineTopOffset","_getTopOffset","lineLeftOffset","drawStart","_measureChar","_char","previousChar","prevCharStyle","fontDeclaration","couple","stylesAreEqual","fontMultiplier","coupleWidth","previousWidth","measureText","getHeightOfChar","measureLine","lineInfo","_measureLine","_getWidthOfCharSpacing","prevGrapheme","graphemeInfo","llength","lineBounds","grapheme","_getGraphemeBox","positionInPath","totalPathLength","_setGraphemeOnPath","numOfSpaces","centerPosition","skipLeft","previousBox","__lineHeights","maxHeight","_renderTextCommon","lineHeights","shortCut","isLtr","currentDirection","drawingLeft","_renderChar","_applyPatternGradientTransformText","handleFiller","fullDecl","shouldFill","fillOffsets","fillText","strokeOffsets","strokeText","setSuperscript","_setScript","setSubscript","schema","loc","lineDiff","__lineWidths","_charStyle$property","topOffset","offsetAligner","lastDecoration","lastFill","lastTickness","currentDecoration","currentFill","currentTickness","currentSize","currentDy","finalTickness","parsedFontFamily","genericFonts","newLine","newText","needsDims","isAddingPath","textAnchor","restOfOptions","textContent","textHeightScaleFactor","lineHeightDiff","scaledDiff","textHeight","offX","DraggableTextDelegate","dragEnterHandler","dragOverHandler","dragLeaveHandler","dragEndHandler","dropHandler","_dispose","isPointerOverSelection","newSelection","getSelectionStartFromPointer","selectionEnd","__mouseDownInPlace","isActive","__dragStartFired","setCursorByClick","initDelayedCursor","__isDraggingOver","getDragStartSelection","__dragStartSelection","setDragImage","_e$dataTransfer","flipFactor","boundaries","_getCursorBoundaries","selectionPosition","diff","bgc","dragImage","border","__dragImageDisposer","appendChild","setData","stringify","effectAllowed","abortCursorAnimation","editable","defaultPrevented","dragStartSelection","targetCanDrop","ev","_e$dataTransfer2","insert","getData","trailing","selectionStartOffset","removeChars","trimEnd","insertChars","enterEditing","_updateTextarea","_e$dataTransfer3","reNonWord","ITextBehavior","initBehavior","_tick","_onTickComplete","_animateCursor","toValue","_currentCursorOpacity","renderCursorOrSelection","_currentTickState","cursorDuration","_this$_currentTickCom","_currentTickCompleteState","restart","cursorDelay","shouldClear","cursorAnimation","restartCursorIfNeeded","selectAll","_fireSelectionChanged","cmdAll","getSelectedText","findWordBoundaryLeft","startFrom","_reSpace","findWordBoundaryRight","findLineBoundaryLeft","findLineBoundaryRight","searchWordBoundary","selectWord","newSelectionStart","newSelectionEnd","selectLine","enterEditingImpl","initHiddenTextarea","_saveEditingProps","_setEditingProps","_textBeforeEdit","activeElement","currentStart","currentEnd","__selectionStartOnMouseDown","editingBorderColor","fromStringToGraphemeSelection","smallerTextStart","graphemeStart","smallerTextEnd","graphemeEnd","fromGraphemeToStringSelection","cursorOffsetCache","inCompositionMode","updateTextareaPosition","updateFromTextArea","textarea","_calcTextareaPosition","desiredPosition","compositionStart","cursorLocation","charHeight","upperCanvas","upperCanvasWidth","upperCanvasHeight","clientWidth","clientHeight","_savedProps","_restoreEditingProps","exitEditingImpl","isTextChanged","_removeExtraneousStyles","removeStyleFromTo","lineStart","charStart","lineEnd","charEnd","styleObj","shiftLineStyles","numericChar","clonedStyles","numericLine","insertNewlineStyleObject","qty","copiedStyle","newLineStyles","originalLineLength","isEndOfLine","someStyleIsCarryingOver","currentCharStyle","numIndex","styleCarriedOver","insertCharStyleObject","quantity","currentLineStyles","currentLineStylesCloned","numericIndex","insertNewStyleBlock","insertedText","cursorLoc","addedLines","linesLength","setSelectionStartEndWithShift","_selectionDirection","ITextKeyBehavior","autocapitalize","autocorrect","autocomplete","spellcheck","wrap","hiddenTextareaContainer","keydown","keyup","input","copy","cut","paste","compositionstart","compositionupdate","compositionend","onKeyDown","keyMap","keysMapRtl","keysMap","keyCode","ctrlKeysMapDown","ctrlKey","metaKey","stopImmediatePropagation","onKeyUp","_copyDone","ctrlKeysMapUp","onInput","fromPaste","updateAndFire","nextText","charCount","nextCharCount","_selectionStart","_selectionEnd","removedText","charDiff","removeFrom","removeTo","textareaSelection","backDelete","copiedText","disableStyleCopyPaste","copiedTextStyle","onCompositionStart","onCompositionEnd","onCompositionUpdate","compositionEnd","_getWidthBeforeCursor","widthBeforeCursor","bound","getDownCursorOffset","isRight","selectionProp","_getSelectionForOffset","indexOnOtherLine","_getIndexOnLine","textAfterCursor","getUpCursorOffset","textBeforeCursor","widthOfCharsOnLine","indexOnLine","charWidth","foundMatch","leftEdge","rightEdge","offsetFromLeftEdge","offsetFromRightEdge","moveCursorDown","_moveCursorUpOrDown","moveCursorUp","moveCursorWithShift","moveCursorWithoutShift","moveCursorLeft","_moveCursorLeftOrRight","_move","newValue","_moveLeft","_moveRight","moveCursorLeftWithoutShift","change","moveCursorLeftWithShift","moveCursorRight","moveCursorRightWithShift","moveCursorRightWithoutShift","notALeftClick","ITextClickBehavior","_mouseDownHandler","doubleClickHandler","tripleClickHandler","draggableTextDelegate","didDrag","mouseOffset","charLength","widthAfter","MOVE_CURSOR_UP","MOVE_CURSOR_DOWN","MOVE_CURSOR_LEFT","MOVE_CURSOR_RIGHT","EXIT_EDITING","applyCanvasTransform","protectedDefaultValues","iTextDefaultValues","cursorColor","caching","IText","setSelectionStart","_updateAndFire","setSelectionEnd","findAncestorsWithClipPath","hasAncestorsWithClipping","drawingCtx","drawingCanvas","renderCursor","renderSelection","clippingCanvas","clippingCtx","clipPathAncestors","skipCaching","_getCursorBoundariesOffsets","__getCursorBoundariesOffsets","renderCursorAt","_renderCursor","getCursorRenderingData","_renderSelection","dragSelection","startLine","endLine","startChar","endChar","realLineHeight","boxEnd","drawHeight","extraTop","drawWidth","compositionColor","getCurrentCharFontSize","cp","_getCurrentCharIndex","getCurrentCharColor","cursorPosition","textboxDefaultValues","minWidth","dynamicMinWidth","_wordJoiners","splitByGrapheme","Textbox","_styleMap","_generateStyleMap","textInfo","realLineCount","realLineCharCount","isWrapping","nextLineIndex","nextOffset","shouldLimit","mapNextLine","p2Number","_wrapText","desiredWidth","getGraphemeDataForRender","wrapped","wordsData","_wrapLine","infix","largestWordWidth","wordsOrGraphemes","wordSplit","word","graphemeArray","_measureWord","charOffset","reservedSpace","additionalSpace","infixWidth","lineJustStarted","wordWidth","getMinWidth","linesToKeep","propNumber","ClipPathLayout","clipPathCenter","FixedLayout","ActiveSelectionLayoutManager","parents","Set","selectedObjects","activeSelectionDefaultValues","multiSelectionStacking","ActiveSelection","findIndex","groups","childrenOverride","Canvas2dFilterBackend","applyFilters","filters","sourceElement","sourceWidth","sourceHeight","desynchronized","imageData","originalImageData","pipelineState","originalEl","filterBackend","applyTo","imageDataPostFilter","putImageData","WebGLFilterBackend","tileSize","Float32Array","setupGLContext","captureGPUInfo","createWebGLCanvas","glOptions","premultipliedAlpha","depth","stencil","antialias","clearColor","cachedTexture","getCachedTexture","destinationWidth","destinationHeight","sourceTexture","createTexture","targetTexture","originalTexture","passes","webgl","aPosition","programCache","pass","tempFbo","createFramebuffer","bindFramebuffer","FRAMEBUFFER","resizeCanvasIfNeeded","copyGLTo2D","bindTexture","TEXTURE_2D","deleteTexture","deleteFramebuffer","clearWebGLCaches","textureCache","textureImageSource","NEAREST","RGBA","UNSIGNED_BYTE","CLAMP_TO_EDGE","TEXTURE_MAG_FILTER","TEXTURE_MIN_FILTER","TEXTURE_WRAP_S","TEXTURE_WRAP_T","texture","texParameteri","texImage2D","uniqueId","evictCachesForKey","glCanvas","sourceY","copyGLTo2DPutImageData","dWidth","dHeight","numBytes","u8","Uint8Array","imageBuffer","u8Clamped","Uint8ClampedArray","readPixels","imgData","ImageData","gpuInfo","renderer","vendor","ext","UNMASKED_RENDERER_WEBGL","UNMASKED_VENDOR_WEBGL","initFilterBackend","enableGLFiltering","getFilterBackend","strict","setFilterBackend","backend","imageDefaultValues","srcFromAttribute","minimumScaleTrigger","imageSmoothing","IMAGE_PROPS","FabricImage","setElement","_element","removeTexture","_originalElement","resizeFilter","applyResizeFilters","elementKey","getCrossOrigin","getOriginalSize","_stroke","filterObj","getSrc","hasCrop","imageMarkup","strokeSvg","imageRendering","getSvgSrc","origFill","filtered","setSrc","minimumScale","elementToFilter","_filteredEl","_filterScalingX","_filterScalingY","_lastScaleX","_lastScaleY","isNeutralState","imgElement","_needsResize","elementToDraw","elWidth","elHeight","sX","sY","sW","sH","maxDestW","maxDestH","_resetWidthHeight","pAR","preserveAspectRatio","pWidth","pHeight","rWidth","rHeight","f","rf","hydratedProps","fromURL","imageOptions","applyViewboxTransform","viewBoxAttr","widthAttr","heightAttr","goodViewbox","missingViewBox","missingDimAttr","translateMatrix","widthDiff","heightDiff","parsedDim","pasedViewBox","createElementNS","firstChild","getTagName","node","tagName","svgInvalidAncestorsRegEx","hasInvalidAncestor","getMultipleNodes","nodeNames","nodeArray","nodeList","getElementsByTagNameNS","parseUseDirectives","nodelist","skipAttributes","useElement","useAttributes","useAttrMap","xlink","href","referencedElement","clonedOriginal","cloneNode","originalAttributes","originalAttrMap","currentTrans","el3","setAttributeNS","childNodes","styleRecord","mergedStyles","entry","gradientsAttrs","xlinkAttr","recursivelyParseGradientsXlink","_gradient$getAttribut","xLink","referencedGradient","children","referenceClone","tagArray","getGradientDefs","elList","gradientDefs","getCSSRules","allRules","styleContents","ruleObj","declaration","propertyValuePairs","pair","_rule","findTag","ElementsParser","clipPaths","regexUrl","createObject","resolveGradient","resolveClipPath","extractPropertyDefinition","storage","gradientDef","usingElement","exactOwner","clipPathElements","objTransformInv","clipPathTag","clipPathOwner","clipPathElement","enlivedClippath","clipRule","gTransform","isValidSvgTag","createEmptyResponse","allElements","parseSVGDocument","descendants","localClipPaths","elementParser","loadSVGFromString","parser","DOMParser","parseFromString","loadSVGFromURL","fetch","response","ok","svgText","ACTION_NAME","createPolyPositionHandler","pointIndex","polyObject","polyActionHandler","poly","mouseLocalPosition","factoryPolyActionHandler","anchorPoint","anchorPointInParentPlane","newAnchorPointInParentPlane","createPolyActionHandler","createPolyControls","calcPathPointPosition","pathObject","commandIndex","movePathPoint","anchorCommand","pathPositionHandler","pathActionHandler","indexFromPrevCommand","previousCommandType","PathPointControl","controlFill","controlStroke","PathControlPointControl","connectToCommandIndex","connectToPointIndex","connectionDashArray","commandType","createControl","commandIndexPos","pointIndexPos","isControlPoint","controlPointStyle","pointStyle","createPathControls","isWebGLPipelineState","isPutImageFaster","sourceCanvas","ArrayBuffer","testContext","testPipelineState","performance","now","drawImageTime","putImageDataTime","highPsourceCode","identityFragmentShader","vertexSource","BaseFilter","getFragmentSource","getVertexSource","createProgram","vertexShader","VERTEX_SHADER","program","getShaderInfoLog","attachShader","linkProgram","getProgramParameter","LINK_STATUS","getProgramInfoLog","uniformLocations","getUniformLocations","uStepW","getUniformLocation","uStepH","attributeLocations","getAttributeLocations","getAttribLocation","locations","sendAttributeData","aPositionData","attributeLocation","buffer","createBuffer","bindBuffer","ARRAY_BUFFER","enableVertexAttribArray","vertexAttribPointer","FLOAT","bufferData","STATIC_DRAW","_setupFrameBuffer","framebufferTexture2D","COLOR_ATTACHMENT0","finish","_swapTextures","temp","applyToWebGL","applyTo2d","getCacheKey","retrieveShader","shader","useProgram","uniform1f","sendUniformData","viewport","drawArrays","TRIANGLE_STRIP","bindAdditionalTexture","textureUnit","activeTexture","TEXTURE0","unbindAdditionalTexture","_gl","_uniformLocations","createHelpLayer","helpLayer","defaultKeys","filterOptions","blendColorFragmentSource","screen","difference","lighten","darken","exclusion","tint","blendColorDefaultValues","mode","BlendColor","tg","alpha1","oR","oG","oB","uniform4fv","uColor","mask","blendImageDefaultValues","BlendImage","image","TEXTURE1","calculateMatrix","resources","blendImage","canvas1","blendData","uniform1i","uImage","uniformMatrix3fv","uTransformMatrix","enlivedImage","blurDefaultValues","Blur","aspectRatio","horizontal","blurValue","getBlurValue","samples","bytesInRow","totalA","minIRow","maxIRow","percent","weight","sampledPixel","localAlpha","delta","chooseRightDelta","uniform2fv","uDelta","blurScale","brightnessDefaultValues","brightness","Brightness","uBrightness","colorMatrixDefaultValues","colorsOnly","ColorMatrix","constants","uniformMatrix4fv","uColorMatrix","uConstants","createColorMatrixFilter","_Class","newClass","Brownie","Vintage","Kodachrome","Technicolor","Polaroid","Sepia","BlackWhite","Composed","subFilters","enlivedFilters","contrastDefaultValues","contrast","Contrast","contrastF","uContrast","Convolute_3_1","Convolute_3_0","Convolute_5_1","Convolute_5_0","Convolute_7_1","Convolute_7_0","Convolute_9_1","Convolute_9_0","convoluteDefaultValues","opaque","Convolute","weights","side","halfSide","sw","sh","createImageData","dst","alphaFac","dstOff","scx","scy","srcOff","wt","uniform1fv","uMatrix","GAMMA","gammaDefaultValues","gamma","Gamma","rInv","gInv","bInv","rgbValues","rgb","uniform3fv","uGamma","lightness","luminosity","grayscaleDefaultValues","Grayscale","uMode","hueRotationDefaultValues","rotation","HueRotation","cosine","sine","aThird","aThirdSqtSin","OneMinusCos","invertDefaultValues","invert","Invert","uInvert","uAlpha","noiseDefaultValues","noise","Noise","rand","uNoise","uSeed","pixelateDefaultValues","blocksize","Pixelate","_i","_j","uBlocksize","removeColorDefaultValues","useAlpha","RemoveColor","lowC","highC","uLow","uHigh","resizeDefaultValues","resizeType","lanczosLobes","Resize","uTaps","taps","getFilterWindow","tempScale","filterWindow","generateShader","getTaps","lobeFunction","lanczosCreate","applyToForWebgl","dW","dH","lobes","xx","rcpScaleX","rcpScaleY","oW","oH","newData","sliceByTwo","hermiteFastResize","bilinearFiltering","lanczosResize","mult","doneW","doneH","stepW","stepH","dX","dY","tmpCanvas","process","u","fX","fY","ratioX","icenter","ratioY","range2X","cacheLanc","range2Y","lanczos","rcpRatioX","rcpRatioY","srcData","destData","destImg","xDiff","yDiff","chnl","origPix","w4","pixels","destImage","destPixels","ratioW","ratioH","ratioWHalf","ratioHHalf","img2","data2","weightsAlpha","gxR","gxG","gxB","gxA","yy","w0","saturationDefaultValues","saturation","Saturation","adjust","uSaturation","vibranceDefaultValues","vibrance","Vibrance","amt","uVibrance"],"mappings":"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AAE,0BAA0B;AAChDC,EAAAA,kBAAkB,EAAE,CAAC;AACrBC,EAAAA,uBAAuB,EAAE,KAAK;AAE9BhhC,EAAAA,WAAW,EAAE,MAAM;AACnBC,EAAAA,UAAU,EAAE,MAAM;AAClBghC,EAAAA,aAAa,EAAE,SAAS;AACxBC,EAAAA,iBAAiB,EAAE,WAAW;AAC9BC,EAAAA,gBAAgB,EAAE,aAAa;AAE/BrhC,EAAAA,kBAAkB,EAAE,KAAK;AACzBshC,EAAAA,mBAAmB,EAAE,CAAC;AACtBC,EAAAA,cAAc,EAAE,KAAK;AAErBC,EAAAA,eAAe,EAAE,KAAK;AACtBC,EAAAA,cAAc,EAAE,KAAK;AACrBC,EAAAA,eAAe,EAAE,KAAK;AACtBC,EAAAA,mBAAmB,EAAE,KAAK;AAE1B3B,EAAAA,cAAc,EAAE,kBAAkB;AAClCjN,EAAAA,sBAAsB,EAAE;AAC1B,CAAC;;ACvMD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,MAAM6O,gBAAgB,SACnB9pD,YAAY,CAEtB;EAAAhgB,WAAAA,GAAA;AAAA,IAAA,KAAA,CAAA,GAAAO,SAAA,CAAA;AAGE;AAQA;AAUA;AASA;AAKA;AACF;AACA;AACA;AACA;AACA;AACA;AAKE;AAKA;AACF;AACA;AACA;AACA;AAGE;AACF;AACA;AACA;AACA;AAJEN,IAAAA,eAAA,0BAKkC,EAAE,CA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AQ,CAAC;;AC3EzB,MAAMngH,gBAAc,GAAG;AAC5BsgH,EAAAA,aAAa,EAAE;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAA,CAAK;AACHC,EAAAA,aAAa,EAAE;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAA,CAAK;AACHC,EAAAA,aAAa,EAAE;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAA,CAAK;AACHC,EAAAA,aAAa,EAAE;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAA,CAAK;AACHC,EAAAA,aAAa,EAAE;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAA,CAAK;AACHC,EAAAA,aAAa,EAAE;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAA,CAAK;AACHC,EAAAA,aAAa,EAAE;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAA,CAAK;AACHC,EAAAA,aAAa,EAAE;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAA;AACA,CAAC;;AC/IM,MAAMC,sBAAyC,GAAG;AACvDC,EAAAA,MAAM,EAAE,KAAK;AACb3rG,EAAAA,MAAM,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;AACpC,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"} \ No newline at end of file +{"version":3,"file":"index.mjs","sources":["../src/config.ts","../src/util/internals/console.ts","../src/filters/GLProbes/GLProbe.ts","../src/filters/GLProbes/WebGLProbe.ts","../src/env/browser.ts","../src/env/index.ts","../src/cache.ts","../src/constants.ts","../src/ClassRegistry.ts","../src/util/animation/AnimationRegistry.ts","../src/Observable.ts","../src/util/internals/removeFromArray.ts","../src/util/misc/cos.ts","../src/util/misc/sin.ts","../src/Point.ts","../src/Collection.ts","../src/CommonMethods.ts","../src/util/animation/AnimationFrameProvider.ts","../src/util/internals/uid.ts","../src/util/misc/dom.ts","../src/util/misc/radiansDegreesConversion.ts","../src/util/misc/matrix.ts","../src/util/misc/objectEnlive.ts","../src/util/misc/pick.ts","../src/util/misc/toFixed.ts","../src/util/misc/svgExport.ts","../src/util/typeAssertions.ts","../src/util/dom_misc.ts","../src/canvas/DOMManagers/util.ts","../src/canvas/DOMManagers/StaticCanvasDOMManager.ts","../src/canvas/StaticCanvasOptions.ts","../src/canvas/StaticCanvas.ts","../src/util/dom_event.ts","../src/util/misc/boundingBoxFromPoints.ts","../src/util/misc/objectTransforms.ts","../src/util/misc/planeChange.ts","../src/controls/fireEvent.ts","../src/util/misc/resolveOrigin.ts","../src/util/misc/vectors.ts","../src/controls/util.ts","../src/controls/drag.ts","../src/color/color_map.ts","../src/color/constants.ts","../src/color/util.ts","../src/color/Color.ts","../src/util/misc/svgParsing.ts","../src/shapes/Object/FabricObjectSVGExportMixin.ts","../src/parser/getSvgRegex.ts","../src/shapes/Text/constants.ts","../src/parser/constants.ts","../src/Shadow.ts","../src/util/misc/capValue.ts","../src/shapes/Object/defaultValues.ts","../src/util/animation/easing.ts","../src/util/animation/AnimationBase.ts","../src/util/animation/ValueAnimation.ts","../src/util/animation/ArrayAnimation.ts","../src/util/animation/ColorAnimation.ts","../src/util/animation/animate.ts","../src/Intersection.ts","../src/shapes/Object/ObjectGeometry.ts","../src/shapes/Object/Object.ts","../src/controls/wrapWithFireEvent.ts","../src/controls/wrapWithFixedAnchor.ts","../src/controls/changeWidth.ts","../src/controls/controlRendering.ts","../src/controls/Control.ts","../src/controls/rotate.ts","../src/controls/scale.ts","../src/controls/skew.ts","../src/controls/scaleSkew.ts","../src/controls/commonControls.ts","../src/shapes/Object/InteractiveObject.ts","../src/util/applyMixins.ts","../src/shapes/Object/FabricObject.ts","../src/util/misc/isTransparent.ts","../src/util/internals/findRight.ts","../src/util/misc/projectStroke/StrokeProjectionsBase.ts","../src/util/misc/projectStroke/StrokeLineJoinProjections.ts","../src/util/misc/projectStroke/StrokeLineCapProjections.ts","../src/util/misc/projectStroke/index.ts","../src/util/internals/cloneStyles.ts","../src/util/lang_string.ts","../src/util/misc/textStyles.ts","../src/parser/attributes.ts","../src/parser/selectorMatches.ts","../src/parser/doesSomeParentMatch.ts","../src/parser/elementMatchesRule.ts","../src/parser/getGlobalStylesForElement.ts","../src/parser/normalizeAttr.ts","../src/util/internals/cleanupSvgAttribute.ts","../src/parser/parseTransformAttribute.ts","../src/parser/normalizeValue.ts","../src/parser/parseFontDeclaration.ts","../src/parser/parseStyleObject.ts","../src/parser/parseStyleString.ts","../src/parser/parseStyleAttribute.ts","../src/parser/setStrokeFillOpacity.ts","../src/parser/parseAttributes.ts","../src/shapes/Rect.ts","../src/LayoutManager/constants.ts","../src/LayoutManager/LayoutStrategies/utils.ts","../src/LayoutManager/LayoutStrategies/LayoutStrategy.ts","../src/LayoutManager/LayoutStrategies/FitContentLayout.ts","../src/LayoutManager/LayoutManager.ts","../src/shapes/Group.ts","../src/util/misc/groupSVGElements.ts","../src/util/misc/findScaleTo.ts","../src/util/path/regex.ts","../src/util/path/index.ts","../src/util/misc/mergeClipPaths.ts","../src/util/internals/getRandomInt.ts","../src/util/transform_matrix_removal.ts","../src/util/internals/dom_style.ts","../src/canvas/DOMManagers/CanvasDOMManager.ts","../src/canvas/CanvasOptions.ts","../src/canvas/SelectableCanvas.ts","../src/canvas/TextEditingManager.ts","../src/canvas/Canvas.ts","../src/gradient/constants.ts","../src/util/internals/ifNaN.ts","../src/parser/percent.ts","../src/gradient/parser/parseColorStops.ts","../src/gradient/parser/misc.ts","../src/gradient/parser/parseCoords.ts","../src/gradient/Gradient.ts","../src/Pattern/Pattern.ts","../src/brushes/BaseBrush.ts","../src/shapes/Path.ts","../src/brushes/PencilBrush.ts","../src/shapes/Circle.ts","../src/brushes/CircleBrush.ts","../src/brushes/SprayBrush.ts","../src/brushes/PatternBrush.ts","../src/shapes/Line.ts","../src/shapes/Triangle.ts","../src/shapes/Ellipse.ts","../src/parser/parsePointsAttribute.ts","../src/shapes/Polyline.ts","../src/shapes/Polygon.ts","../src/shapes/Text/StyledText.ts","../src/shapes/Text/TextSVGExportMixin.ts","../src/shapes/Text/Text.ts","../src/shapes/IText/DraggableTextDelegate.ts","../src/shapes/IText/ITextBehavior.ts","../src/shapes/IText/ITextKeyBehavior.ts","../src/shapes/IText/ITextClickBehavior.ts","../src/shapes/IText/constants.ts","../src/util/internals/applyCanvasTransform.ts","../src/shapes/IText/IText.ts","../src/shapes/Textbox.ts","../src/LayoutManager/LayoutStrategies/ClipPathLayout.ts","../src/LayoutManager/LayoutStrategies/FixedLayout.ts","../src/LayoutManager/ActiveSelectionLayoutManager.ts","../src/shapes/ActiveSelection.ts","../src/filters/Canvas2dFilterBackend.ts","../src/filters/WebGLFilterBackend.ts","../src/filters/FilterBackend.ts","../src/shapes/Image.ts","../src/parser/applyViewboxTransform.ts","../src/parser/getTagName.ts","../src/parser/hasInvalidAncestor.ts","../src/parser/getMultipleNodes.ts","../src/parser/parseUseDirectives.ts","../src/parser/recursivelyParseGradientsXlink.ts","../src/parser/getGradientDefs.ts","../src/parser/getCSSRules.ts","../src/parser/elements_parser.ts","../src/parser/parseSVGDocument.ts","../src/parser/loadSVGFromString.ts","../src/parser/loadSVGFromURL.ts","../src/controls/polyControl.ts","../src/controls/pathControl.ts","../src/filters/utils.ts","../src/filters/shaders/baseFilter.ts","../src/filters/BaseFilter.ts","../src/filters/shaders/blendColor.ts","../src/filters/BlendColor.ts","../src/filters/shaders/blendImage.ts","../src/filters/BlendImage.ts","../src/filters/shaders/blur.ts","../src/filters/Blur.ts","../src/filters/shaders/brightness.ts","../src/filters/Brightness.ts","../src/filters/shaders/colorMatrix.ts","../src/filters/ColorMatrix.ts","../src/filters/ColorMatrixFilters.ts","../src/filters/Composed.ts","../src/filters/shaders/constrast.ts","../src/filters/Contrast.ts","../src/filters/shaders/convolute.ts","../src/filters/Convolute.ts","../src/filters/shaders/gamma.ts","../src/filters/Gamma.ts","../src/filters/shaders/grayscale.ts","../src/filters/Grayscale.ts","../src/filters/HueRotation.ts","../src/filters/shaders/invert.ts","../src/filters/Invert.ts","../src/filters/shaders/noise.ts","../src/filters/Noise.ts","../src/filters/shaders/pixelate.ts","../src/filters/Pixelate.ts","../src/filters/shaders/removeColor.ts","../src/filters/RemoveColor.ts","../src/filters/Resize.ts","../src/filters/shaders/saturation.ts","../src/filters/Saturation.ts","../src/filters/shaders/vibrance.ts","../src/filters/Vibrance.ts"],"sourcesContent":["export type TConfiguration = Partial;\n\nclass BaseConfiguration {\n /**\n * Browser-specific constant to adjust CanvasRenderingContext2D.shadowBlur value,\n * which is unitless and not rendered equally across browsers.\n *\n * Values that work quite well (as of October 2017) are:\n * - Chrome: 1.5\n * - Edge: 1.75\n * - Firefox: 0.9\n * - Safari: 0.95\n *\n * @since 2.0.0\n * @type Number\n * @default 1\n */\n browserShadowBlurConstant = 1;\n\n /**\n * Pixel per Inch as a default value set to 96. Can be changed for more realistic conversion.\n */\n DPI = 96;\n\n /**\n * Device Pixel Ratio\n * @see https://developer.apple.com/library/safari/documentation/AudioVideo/Conceptual/HTML-canvas-guide/SettingUptheCanvas/SettingUptheCanvas.html\n */\n devicePixelRatio =\n typeof window !== 'undefined' ? window.devicePixelRatio : 1; // eslint-disable-line no-restricted-globals\n\n /**\n * Pixel limit for cache canvases. 1Mpx , 4Mpx should be fine.\n * @since 1.7.14\n * @type Number\n */\n perfLimitSizeTotal = 2097152;\n\n /**\n * Pixel limit for cache canvases width or height. IE fixes the maximum at 5000\n * @since 1.7.14\n * @type Number\n */\n maxCacheSideLimit = 4096;\n\n /**\n * Lowest pixel limit for cache canvases, set at 256PX\n * @since 1.7.14\n * @type Number\n */\n minCacheSideLimit = 256;\n\n /**\n * When 'true', style information is not retained when copy/pasting text, making\n * pasted text use destination style.\n * Defaults to 'false'.\n * @type Boolean\n * @deprecated\n */\n disableStyleCopyPaste = false;\n\n /**\n * Enable webgl for filtering picture is available\n * A filtering backend will be initialized, this will both take memory and\n * time since a default 2048x2048 canvas will be created for the gl context\n * @since 2.0.0\n * @type Boolean\n */\n enableGLFiltering = true;\n\n /**\n * if webgl is enabled and available, textureSize will determine the size\n * of the canvas backend\n *\n * In order to support old hardware set to `2048` to avoid OOM\n *\n * @since 2.0.0\n * @type Number\n */\n textureSize = 4096;\n\n /**\n * Skip performance testing of setupGLContext and force the use of putImageData that seems to be the one that works best on\n * Chrome + old hardware. if your users are experiencing empty images after filtering you may try to force this to true\n * this has to be set before instantiating the filtering backend ( before filtering the first image )\n * @type Boolean\n * @default false\n */\n forceGLPutImageData = false;\n\n /**\n * If disabled boundsOfCurveCache is not used. For apps that make heavy usage of pencil drawing probably disabling it is better\n * With the standard behaviour of fabric to translate all curves in absolute commands and by not subtracting the starting point from\n * the curve is very hard to hit any cache.\n * Enable only if you know why it could be useful.\n * Candidate for removal/simplification\n * @default false\n */\n cachesBoundsOfCurve = false;\n\n /**\n * Map of font files\n * Map of font files\n */\n fontPaths: Record = {};\n\n /**\n * Defines the number of fraction digits to use when serializing object values.\n * Used in exporting methods (`toObject`, `toJSON`, `toSVG`)\n * You can use it to increase/decrease precision of such values like left, top, scaleX, scaleY, etc.\n */\n NUM_FRACTION_DIGITS = 4;\n}\n\nexport class Configuration extends BaseConfiguration {\n constructor(config?: TConfiguration) {\n super();\n this.configure(config);\n }\n\n configure(config: TConfiguration = {}) {\n Object.assign(this, config);\n }\n\n /**\n * Map of font files\n */\n addFonts(\n paths: Record = {},\n ) {\n this.fontPaths = {\n ...this.fontPaths,\n ...paths,\n };\n }\n\n removeFonts(fontFamilys: string[] = []) {\n fontFamilys.forEach((fontFamily) => {\n delete this.fontPaths[fontFamily];\n });\n }\n\n clearFonts() {\n this.fontPaths = {};\n }\n\n restoreDefaults(keys?: (keyof T)[]) {\n const defaults = new BaseConfiguration() as T;\n const config =\n keys?.reduce((acc, key) => {\n acc[key] = defaults[key];\n return acc;\n }, {} as T) || defaults;\n this.configure(config);\n }\n}\n\nexport const config = new Configuration();\n","export const log = (\n severity: 'log' | 'warn' | 'error',\n ...optionalParams: any[]\n) =>\n // eslint-disable-next-line no-restricted-syntax\n console[severity]('fabric', ...optionalParams);\n\nexport class FabricError extends Error {\n constructor(message?: string, options?: ErrorOptions) {\n super(`fabric: ${message}`, options);\n }\n}\n\nexport class SignalAbortedError extends FabricError {\n constructor(context: string) {\n super(`${context} 'options.signal' is in 'aborted' state`);\n }\n}\n","export type GLPrecision = 'lowp' | 'mediump' | 'highp';\n\nexport abstract class GLProbe {\n declare GLPrecision: GLPrecision | undefined;\n abstract queryWebGL(canvas: HTMLCanvasElement): void;\n abstract isSupported(textureSize: number): boolean;\n}\n","import { log } from '../../util/internals/console';\nimport { GLProbe } from './GLProbe';\nimport type { GLPrecision } from './GLProbe';\n\n/**\n * Lazy initialize WebGL constants\n */\nexport class WebGLProbe extends GLProbe {\n declare maxTextureSize?: number;\n\n /**\n * Tests if webgl supports certain precision\n * @param {WebGL} Canvas WebGL context to test on\n * @param {GLPrecision} Precision to test can be any of following\n * @returns {Boolean} Whether the user's browser WebGL supports given precision.\n */\n private testPrecision(\n gl: WebGLRenderingContext,\n precision: GLPrecision,\n ): boolean {\n const fragmentSource = `precision ${precision} float;\\nvoid main(){}`;\n const fragmentShader = gl.createShader(gl.FRAGMENT_SHADER);\n if (!fragmentShader) {\n return false;\n }\n gl.shaderSource(fragmentShader, fragmentSource);\n gl.compileShader(fragmentShader);\n return !!gl.getShaderParameter(fragmentShader, gl.COMPILE_STATUS);\n }\n\n /**\n * query browser for WebGL\n */\n queryWebGL(canvas: HTMLCanvasElement) {\n const gl = canvas.getContext('webgl');\n if (gl) {\n this.maxTextureSize = gl.getParameter(gl.MAX_TEXTURE_SIZE);\n this.GLPrecision = (['highp', 'mediump', 'lowp'] as const).find(\n (precision) => this.testPrecision(gl, precision),\n );\n gl.getExtension('WEBGL_lose_context')!.loseContext();\n log('log', `WebGL: max texture size ${this.maxTextureSize}`);\n }\n }\n\n isSupported(textureSize: number) {\n return !!this.maxTextureSize && this.maxTextureSize >= textureSize;\n }\n}\n","/* eslint-disable no-restricted-globals */\nimport { WebGLProbe } from '../filters/GLProbes/WebGLProbe';\nimport type { TCopyPasteData, TFabricEnv } from './types';\n\nconst copyPasteData: TCopyPasteData = {};\n\nexport const getEnv = (): TFabricEnv => {\n return {\n document,\n window,\n isTouchSupported:\n 'ontouchstart' in window ||\n 'ontouchstart' in document ||\n (window && window.navigator && window.navigator.maxTouchPoints > 0),\n WebGLProbe: new WebGLProbe(),\n dispose() {\n // noop\n },\n copyPasteData,\n };\n};\n","/**\n * This file is consumed by fabric.\n * The `./node` and `./browser` files define the env variable that is used by this module.\n * The `./browser` module is defined to be the default env and doesn't set the env at all.\n * This is done in order to support isomorphic usage for browser and node applications\n * since window and document aren't defined at time of import in SSR, we can't set env so we avoid it by deferring to the default env.\n */\n\nimport { config } from '../config';\nimport { getEnv as getBrowserEnv } from './browser';\nimport type { TFabricEnv } from './types';\nimport type { DOMWindow } from 'jsdom';\n\nlet env: TFabricEnv;\n\n/**\n * Sets the environment variables used by fabric.\\\n * This is exposed for special cases, such as configuring a test environment, and should be used with care.\n *\n * **CAUTION**: Must be called before using the package.\n *\n * @example\n * Passing `window` and `document` objects to fabric (in case they are mocked or something)\n * import { getEnv, setEnv } from 'fabric';\n * // we want fabric to use the `window` and `document` objects exposed by the environment we are running in.\n * setEnv({ ...getEnv(), window, document });\n * // done with setup, using fabric is now safe\n */\nexport const setEnv = (value: TFabricEnv) => {\n env = value;\n};\n\n/**\n * In order to support SSR we **MUST** access the browser env only after the window has loaded\n */\nexport const getEnv = () => env || (env = getBrowserEnv());\n\nexport const getFabricDocument = (): Document => getEnv().document;\n\nexport const getFabricWindow = (): (Window & typeof globalThis) | DOMWindow =>\n getEnv().window;\n\n/**\n * @returns the config value if defined, fallbacks to the environment value\n */\nexport const getDevicePixelRatio = () =>\n Math.max(config.devicePixelRatio ?? getFabricWindow().devicePixelRatio, 1);\n","import { config } from './config';\nimport type { TRectBounds } from './typedefs';\n\nexport class Cache {\n /**\n * Cache of widths of chars in text rendering.\n */\n charWidthsCache: Record<\n /** fontFamily */ string,\n Record<\n /** fontStyleCacheKey */ string,\n Record\n >\n > = {};\n\n /**\n * @return {Object} reference to cache\n */\n getFontCache({\n fontFamily,\n fontStyle,\n fontWeight,\n }: {\n fontFamily: string;\n fontStyle: string;\n fontWeight: string | number;\n }) {\n fontFamily = fontFamily.toLowerCase();\n if (!this.charWidthsCache[fontFamily]) {\n this.charWidthsCache[fontFamily] = {};\n }\n const fontCache = this.charWidthsCache[fontFamily];\n const cacheKey = `${fontStyle.toLowerCase()}_${(\n fontWeight + ''\n ).toLowerCase()}`;\n if (!fontCache[cacheKey]) {\n fontCache[cacheKey] = {};\n }\n return fontCache[cacheKey];\n }\n\n /**\n * Clear char widths cache for the given font family or all the cache if no\n * fontFamily is specified.\n * Use it if you know you are loading fonts in a lazy way and you are not waiting\n * for custom fonts to load properly when adding text objects to the canvas.\n * If a text object is added when its own font is not loaded yet, you will get wrong\n * measurement and so wrong bounding boxes.\n * After the font cache is cleared, either change the textObject text content or call\n * initDimensions() to trigger a recalculation\n * @param {String} [fontFamily] font family to clear\n */\n clearFontCache(fontFamily?: string) {\n fontFamily = (fontFamily || '').toLowerCase();\n if (!fontFamily) {\n this.charWidthsCache = {};\n } else if (this.charWidthsCache[fontFamily]) {\n delete this.charWidthsCache[fontFamily];\n }\n }\n\n /**\n * Given current aspect ratio, determines the max width and height that can\n * respect the total allowed area for the cache.\n * @param {number} ar aspect ratio\n * @return {number[]} Limited dimensions X and Y\n */\n limitDimsByArea(ar: number) {\n const { perfLimitSizeTotal } = config;\n const roughWidth = Math.sqrt(perfLimitSizeTotal * ar);\n // we are not returning a point on purpose, to avoid circular dependencies\n // this is an internal utility\n return [\n Math.floor(roughWidth),\n Math.floor(perfLimitSizeTotal / roughWidth),\n ];\n }\n\n /**\n * This object keeps the results of the boundsOfCurve calculation mapped by the joined arguments necessary to calculate it.\n * It does speed up calculation, if you parse and add always the same paths, but in case of heavy usage of freedrawing\n * you do not get any speed benefit and you get a big object in memory.\n * The object was a private variable before, while now is appended to the lib so that you have access to it and you\n * can eventually clear it.\n * It was an internal variable, is accessible since version 2.3.4\n */\n boundsOfCurveCache: Record = {};\n}\n\nexport const cache = new Cache();\n","import type { TMat2D } from './typedefs';\n// use this syntax so babel plugin see this import here\nimport { version } from '../package.json';\n\nexport const VERSION = version;\n// eslint-disable-next-line @typescript-eslint/no-empty-function\nexport function noop() {}\n\nexport const halfPI = Math.PI / 2;\nexport const quarterPI = Math.PI / 4;\nexport const twoMathPi = Math.PI * 2;\nexport const PiBy180 = Math.PI / 180;\n\nexport const iMatrix = Object.freeze([1, 0, 0, 1, 0, 0]) as TMat2D;\nexport const DEFAULT_SVG_FONT_SIZE = 16;\nexport const ALIASING_LIMIT = 2;\n\n/* \"magic number\" for bezier approximations of arcs (http://itc.ktu.lt/itc354/Riskus354.pdf) */\nexport const kRect = 1 - 0.5522847498;\n\nexport const CENTER = 'center';\nexport const LEFT = 'left';\nexport const TOP = 'top';\nexport const BOTTOM = 'bottom';\nexport const RIGHT = 'right';\nexport const NONE = 'none';\n\nexport const reNewline = /\\r?\\n/;\n\nexport const MOVING = 'moving';\nexport const SCALING = 'scaling';\nexport const ROTATING = 'rotating';\nexport const ROTATE = 'rotate';\nexport const SKEWING = 'skewing';\nexport const RESIZING = 'resizing';\nexport const MODIFY_POLY = 'modifyPoly';\nexport const MODIFY_PATH = 'modifyPath';\nexport const CHANGED = 'changed';\nexport const SCALE = 'scale';\nexport const SCALE_X = 'scaleX';\nexport const SCALE_Y = 'scaleY';\nexport const SKEW_X = 'skewX';\nexport const SKEW_Y = 'skewY';\nexport const FILL = 'fill';\nexport const STROKE = 'stroke';\nexport const MODIFIED = 'modified';\n","import { FabricError } from './util/internals/console';\n\n/*\n * This Map connects the objects type value with their\n * class implementation. It used from any object to understand which are\n * the classes to enlive when requesting a object.type = 'path' for example.\n * Objects uses it for clipPath, Canvas uses it for everything.\n * This is necessary for generic code to run and enlive instances from serialized representation.\n * You can customize which classes get enlived from SVG parsing using this classRegistry.\n * The Registry start empty and gets filled in depending which files you import.\n * If you want to be able to parse arbitrary SVGs or JSON representation of canvases, coming from\n * different sources you will need to import all fabric because you may need all classes.\n */\n\nexport const JSON = 'json';\nexport const SVG = 'svg';\n\nexport class ClassRegistry {\n declare [JSON]: Map;\n declare [SVG]: Map;\n\n constructor() {\n this[JSON] = new Map();\n this[SVG] = new Map();\n }\n\n has(classType: string): boolean {\n return this[JSON].has(classType);\n }\n\n getClass(classType: string): T {\n const constructor = this[JSON].get(classType);\n if (!constructor) {\n throw new FabricError(`No class registered for ${classType}`);\n }\n return constructor;\n }\n\n setClass(classConstructor: any, classType?: string) {\n if (classType) {\n this[JSON].set(classType, classConstructor);\n } else {\n this[JSON].set(classConstructor.type, classConstructor);\n // legacy\n // @TODO: needs to be removed in fabric 7 or 8\n this[JSON].set(classConstructor.type.toLowerCase(), classConstructor);\n }\n }\n\n getSVGClass(SVGTagName: string): any {\n return this[SVG].get(SVGTagName);\n }\n\n setSVGClass(classConstructor: any, SVGTagName?: string) {\n this[SVG].set(\n SVGTagName ?? classConstructor.type.toLowerCase(),\n classConstructor,\n );\n }\n}\n\nexport const classRegistry = new ClassRegistry();\n","import type { StaticCanvas } from '../../canvas/StaticCanvas';\nimport type { FabricObject } from '../../shapes/Object/FabricObject';\nimport type { AnimationBase } from './AnimationBase';\n\n/**\n * Array holding all running animations\n */\nclass AnimationRegistry extends Array {\n /**\n * Remove a single animation using an animation context\n * @param {AnimationBase} context\n */\n remove(context: AnimationBase) {\n const index = this.indexOf(context);\n index > -1 && this.splice(index, 1);\n }\n\n /**\n * Cancel all running animations on the next frame\n */\n cancelAll() {\n const animations = this.splice(0);\n animations.forEach((animation) => animation.abort());\n return animations;\n }\n\n /**\n * Cancel all running animations attached to a canvas on the next frame\n * @param {StaticCanvas} canvas\n */\n cancelByCanvas(canvas: StaticCanvas) {\n if (!canvas) {\n return [];\n }\n const animations = this.filter(\n (animation) =>\n animation.target === canvas ||\n (typeof animation.target === 'object' &&\n (animation.target as FabricObject)?.canvas === canvas),\n );\n animations.forEach((animation) => animation.abort());\n return animations;\n }\n\n /**\n * Cancel all running animations for target on the next frame\n * @param target\n */\n cancelByTarget(target: AnimationBase['target']) {\n if (!target) {\n return [];\n }\n const animations = this.filter((animation) => animation.target === target);\n animations.forEach((animation) => animation.abort());\n return animations;\n }\n}\n\nexport const runningAnimations = new AnimationRegistry();\n","export type TEventCallback = (options: T) => any;\n\ntype EventRegistryObject = {\n [K in keyof E]?: TEventCallback;\n};\n\n/**\n * @see {@link http://fabric5.fabricjs.com/fabric-intro-part-2#events}\n * @see {@link http://fabric5.fabricjs.com/events|Events demo}\n */\nexport class Observable {\n private __eventListeners: Record =\n {} as Record;\n\n /**\n * Observes specified event\n * @alias on\n * @param {string} eventName Event name (eg. 'after:render')\n * @param {EventRegistryObject} handlers key/value pairs (eg. {'after:render': handler, 'selection:cleared': handler})\n * @param {Function} handler Function that receives a notification when an event of the specified type occurs\n * @return {Function} disposer\n */\n on(\n eventName: K,\n handler: TEventCallback,\n ): VoidFunction;\n on(handlers: EventRegistryObject): VoidFunction;\n on(\n arg0: K | EventRegistryObject,\n handler?: TEventCallback,\n ): VoidFunction {\n if (!this.__eventListeners) {\n this.__eventListeners = {} as Record;\n }\n if (typeof arg0 === 'object') {\n // one object with key/value pairs was passed\n Object.entries(arg0).forEach(([eventName, handler]) => {\n this.on(eventName as K, handler as TEventCallback);\n });\n return () => this.off(arg0);\n } else if (handler) {\n const eventName = arg0;\n if (!this.__eventListeners[eventName]) {\n this.__eventListeners[eventName] = [];\n }\n this.__eventListeners[eventName].push(handler);\n return () => this.off(eventName, handler);\n } else {\n // noop\n return () => false;\n }\n }\n\n /**\n * Observes specified event **once**\n * @alias once\n * @param {string} eventName Event name (eg. 'after:render')\n * @param {EventRegistryObject} handlers key/value pairs (eg. {'after:render': handler, 'selection:cleared': handler})\n * @param {Function} handler Function that receives a notification when an event of the specified type occurs\n * @return {Function} disposer\n */\n once(\n eventName: K,\n handler: TEventCallback,\n ): VoidFunction;\n once(handlers: EventRegistryObject): VoidFunction;\n once(\n arg0: K | EventRegistryObject,\n handler?: TEventCallback,\n ): VoidFunction {\n if (typeof arg0 === 'object') {\n // one object with key/value pairs was passed\n const disposers: VoidFunction[] = [];\n Object.entries(arg0).forEach(([eventName, handler]) => {\n disposers.push(this.once(eventName as K, handler as TEventCallback));\n });\n return () => disposers.forEach((d) => d());\n } else if (handler) {\n const disposer = this.on(\n arg0,\n function onceHandler(this: Observable, ...args) {\n handler.call(this, ...args);\n disposer();\n },\n );\n return disposer;\n } else {\n // noop\n return () => false;\n }\n }\n\n /**\n * @private\n * @param {string} eventName\n * @param {Function} [handler]\n */\n private _removeEventListener(\n eventName: K,\n handler?: TEventCallback,\n ) {\n if (!this.__eventListeners[eventName]) {\n return;\n }\n\n if (handler) {\n const eventListener = this.__eventListeners[eventName];\n const index = eventListener.indexOf(handler);\n index > -1 && eventListener.splice(index, 1);\n } else {\n this.__eventListeners[eventName] = [];\n }\n }\n\n /**\n * Unsubscribe all event listeners for eventname.\n * Do not use this pattern. You could kill internal fabricJS events.\n * We know we should have protected events for internal flows, but we don't have yet\n * @deprecated\n * @param {string} eventName event name (eg. 'after:render')\n */\n off(eventName: K): void;\n /**\n * unsubscribe an event listener\n * @param {string} eventName event name (eg. 'after:render')\n * @param {TEventCallback} handler event listener to unsubscribe\n */\n off(eventName: K, handler: TEventCallback): void;\n /**\n * unsubscribe event listeners\n * @param handlers handlers key/value pairs (eg. {'after:render': handler, 'selection:cleared': handler})\n */\n off(handlers: EventRegistryObject): void;\n /**\n * unsubscribe all event listeners\n */\n off(): void;\n off(\n arg0?: K | EventRegistryObject,\n handler?: TEventCallback,\n ) {\n if (!this.__eventListeners) {\n return;\n }\n\n // remove all key/value pairs (event name -> event handler)\n if (typeof arg0 === 'undefined') {\n for (const eventName in this.__eventListeners) {\n this._removeEventListener(eventName);\n }\n }\n // one object with key/value pairs was passed\n else if (typeof arg0 === 'object') {\n Object.entries(arg0).forEach(([eventName, handler]) => {\n this._removeEventListener(eventName as K, handler as TEventCallback);\n });\n } else {\n this._removeEventListener(arg0, handler);\n }\n }\n\n /**\n * Fires event with an optional options object\n * @param {String} eventName Event name to fire\n * @param {Object} [options] Options object\n */\n fire(eventName: K, options?: EventSpec[K]) {\n if (!this.__eventListeners) {\n return;\n }\n\n const listenersForEvent = this.__eventListeners[eventName]?.concat();\n if (listenersForEvent) {\n for (let i = 0; i < listenersForEvent.length; i++) {\n listenersForEvent[i].call(this, options || {});\n }\n }\n }\n}\n","/**\n * Removes value from an array.\n * Presence of value (and its position in an array) is determined via `Array.prototype.indexOf`\n * @param {Array} array\n * @param {*} value\n * @return {Array} original array\n */\nexport const removeFromArray = (array: T[], value: T): T[] => {\n const idx = array.indexOf(value);\n if (idx !== -1) {\n array.splice(idx, 1);\n }\n return array;\n};\n","import type { TRadian } from '../../typedefs';\nimport { halfPI } from '../../constants';\n\n/**\n * Calculate the cos of an angle, avoiding returning floats for known results\n * This function is here just to avoid getting 0.999999999999999 when dealing\n * with numbers that are really 1 or 0.\n * @param {TRadian} angle the angle\n * @return {Number} the cosin value for angle.\n */\nexport const cos = (angle: TRadian): number => {\n if (angle === 0) {\n return 1;\n }\n const angleSlice = Math.abs(angle) / halfPI;\n switch (angleSlice) {\n case 1:\n case 3:\n return 0;\n case 2:\n return -1;\n }\n return Math.cos(angle);\n};\n","import type { TRadian } from '../../typedefs';\nimport { halfPI } from '../../constants';\n\n/**\n * Calculate the cos of an angle, avoiding returning floats for known results\n * This function is here just to avoid getting 0.999999999999999 when dealing\n * with numbers that are really 1 or 0.\n * @param {TRadian} angle the angle\n * @return {Number} the sin value for angle.\n */\nexport const sin = (angle: TRadian): number => {\n if (angle === 0) {\n return 0;\n }\n const angleSlice = angle / halfPI;\n const value = Math.sign(angle);\n switch (angleSlice) {\n case 1:\n return value;\n case 2:\n return 0;\n case 3:\n return -value;\n }\n return Math.sin(angle);\n};\n","import type { TMat2D, TRadian } from './typedefs';\nimport { cos } from './util/misc/cos';\nimport { sin } from './util/misc/sin';\n\nexport interface XY {\n x: number;\n y: number;\n}\n\n/**\n * Adaptation of work of Kevin Lindsey(kevin@kevlindev.com)\n */\nexport class Point implements XY {\n declare x: number;\n\n declare y: number;\n\n constructor();\n constructor(x: number, y: number);\n constructor(point?: XY);\n constructor(arg0: number | XY = 0, y = 0) {\n if (typeof arg0 === 'object') {\n this.x = arg0.x;\n this.y = arg0.y;\n } else {\n this.x = arg0;\n this.y = y;\n }\n }\n\n /**\n * Adds another point to this one and returns a new one with the sum\n * @param {XY} that\n * @return {Point} new Point instance with added values\n */\n add(that: XY): Point {\n return new Point(this.x + that.x, this.y + that.y);\n }\n\n /**\n * Adds another point to this one\n * @param {XY} that\n * @return {Point} thisArg\n * @deprecated\n */\n addEquals(that: XY): Point {\n this.x += that.x;\n this.y += that.y;\n return this;\n }\n\n /**\n * Adds value to this point and returns a new one\n * @param {Number} scalar\n * @return {Point} new Point with added value\n */\n scalarAdd(scalar: number): Point {\n return new Point(this.x + scalar, this.y + scalar);\n }\n\n /**\n * Adds value to this point\n * @param {Number} scalar\n * @return {Point} thisArg\n * @deprecated\n */\n scalarAddEquals(scalar: number): Point {\n this.x += scalar;\n this.y += scalar;\n return this;\n }\n\n /**\n * Subtracts another point from this point and returns a new one\n * @param {XY} that\n * @return {Point} new Point object with subtracted values\n */\n subtract(that: XY): Point {\n return new Point(this.x - that.x, this.y - that.y);\n }\n\n /**\n * Subtracts another point from this point\n * @param {XY} that\n * @return {Point} thisArg\n * @deprecated\n */\n subtractEquals(that: XY): Point {\n this.x -= that.x;\n this.y -= that.y;\n return this;\n }\n\n /**\n * Subtracts value from this point and returns a new one\n * @param {Number} scalar\n * @return {Point}\n */\n scalarSubtract(scalar: number): Point {\n return new Point(this.x - scalar, this.y - scalar);\n }\n\n /**\n * Subtracts value from this point\n * @param {Number} scalar\n * @return {Point} thisArg\n * @deprecated\n */\n scalarSubtractEquals(scalar: number): Point {\n this.x -= scalar;\n this.y -= scalar;\n return this;\n }\n\n /**\n * Multiplies this point by another value and returns a new one\n * @param {XY} that\n * @return {Point}\n */\n multiply(that: XY): Point {\n return new Point(this.x * that.x, this.y * that.y);\n }\n\n /**\n * Multiplies this point by a value and returns a new one\n * @param {Number} scalar\n * @return {Point}\n */\n scalarMultiply(scalar: number): Point {\n return new Point(this.x * scalar, this.y * scalar);\n }\n\n /**\n * Multiplies this point by a value\n * @param {Number} scalar\n * @return {Point} thisArg\n * @deprecated\n */\n scalarMultiplyEquals(scalar: number): Point {\n this.x *= scalar;\n this.y *= scalar;\n return this;\n }\n\n /**\n * Divides this point by another and returns a new one\n * @param {XY} that\n * @return {Point}\n */\n divide(that: XY): Point {\n return new Point(this.x / that.x, this.y / that.y);\n }\n\n /**\n * Divides this point by a value and returns a new one\n * @param {Number} scalar\n * @return {Point}\n */\n scalarDivide(scalar: number): Point {\n return new Point(this.x / scalar, this.y / scalar);\n }\n\n /**\n * Divides this point by a value\n * @param {Number} scalar\n * @return {Point} thisArg\n * @deprecated\n */\n scalarDivideEquals(scalar: number): Point {\n this.x /= scalar;\n this.y /= scalar;\n return this;\n }\n\n /**\n * Returns true if this point is equal to another one\n * @param {XY} that\n * @return {Boolean}\n */\n eq(that: XY): boolean {\n return this.x === that.x && this.y === that.y;\n }\n\n /**\n * Returns true if this point is less than another one\n * @param {XY} that\n * @return {Boolean}\n */\n lt(that: XY): boolean {\n return this.x < that.x && this.y < that.y;\n }\n\n /**\n * Returns true if this point is less than or equal to another one\n * @param {XY} that\n * @return {Boolean}\n */\n lte(that: XY): boolean {\n return this.x <= that.x && this.y <= that.y;\n }\n\n /**\n\n * Returns true if this point is greater another one\n * @param {XY} that\n * @return {Boolean}\n */\n gt(that: XY): boolean {\n return this.x > that.x && this.y > that.y;\n }\n\n /**\n * Returns true if this point is greater than or equal to another one\n * @param {XY} that\n * @return {Boolean}\n */\n gte(that: XY): boolean {\n return this.x >= that.x && this.y >= that.y;\n }\n\n /**\n * Returns new point which is the result of linear interpolation with this one and another one\n * @param {XY} that\n * @param {Number} t , position of interpolation, between 0 and 1 default 0.5\n * @return {Point}\n */\n lerp(that: XY, t = 0.5): Point {\n t = Math.max(Math.min(1, t), 0);\n return new Point(\n this.x + (that.x - this.x) * t,\n this.y + (that.y - this.y) * t,\n );\n }\n\n /**\n * Returns distance from this point and another one\n * @param {XY} that\n * @return {Number}\n */\n distanceFrom(that: XY): number {\n const dx = this.x - that.x,\n dy = this.y - that.y;\n return Math.sqrt(dx * dx + dy * dy);\n }\n\n /**\n * Returns the point between this point and another one\n * @param {XY} that\n * @return {Point}\n */\n midPointFrom(that: XY): Point {\n return this.lerp(that);\n }\n\n /**\n * Returns a new point which is the min of this and another one\n * @param {XY} that\n * @return {Point}\n */\n min(that: XY): Point {\n return new Point(Math.min(this.x, that.x), Math.min(this.y, that.y));\n }\n\n /**\n * Returns a new point which is the max of this and another one\n * @param {XY} that\n * @return {Point}\n */\n max(that: XY): Point {\n return new Point(Math.max(this.x, that.x), Math.max(this.y, that.y));\n }\n\n /**\n * Returns string representation of this point\n * @return {String}\n */\n toString(): string {\n return `${this.x},${this.y}`;\n }\n\n /**\n * Sets x/y of this point\n * @param {Number} x\n * @param {Number} y\n */\n setXY(x: number, y: number) {\n this.x = x;\n this.y = y;\n return this;\n }\n\n /**\n * Sets x of this point\n * @param {Number} x\n */\n setX(x: number) {\n this.x = x;\n return this;\n }\n\n /**\n * Sets y of this point\n * @param {Number} y\n */\n setY(y: number) {\n this.y = y;\n return this;\n }\n\n /**\n * Sets x/y of this point from another point\n * @param {XY} that\n */\n setFromPoint(that: XY) {\n this.x = that.x;\n this.y = that.y;\n return this;\n }\n\n /**\n * Swaps x/y of this point and another point\n * @param {XY} that\n */\n swap(that: XY) {\n const x = this.x,\n y = this.y;\n this.x = that.x;\n this.y = that.y;\n that.x = x;\n that.y = y;\n }\n\n /**\n * return a cloned instance of the point\n * @return {Point}\n */\n clone(): Point {\n return new Point(this.x, this.y);\n }\n\n /**\n * Rotates `point` around `origin` with `radians`\n * @param {XY} origin The origin of the rotation\n * @param {TRadian} radians The radians of the angle for the rotation\n * @return {Point} The new rotated point\n */\n rotate(radians: TRadian, origin: XY = ZERO): Point {\n // TODO benchmark and verify the add and subtract how much cost\n // and then in case early return if no origin is passed\n const sinus = sin(radians),\n cosinus = cos(radians);\n const p = this.subtract(origin);\n const rotated = new Point(\n p.x * cosinus - p.y * sinus,\n p.x * sinus + p.y * cosinus,\n );\n return rotated.add(origin);\n }\n\n /**\n * Apply transform t to point p\n * @param {TMat2D} t The transform\n * @param {Boolean} [ignoreOffset] Indicates that the offset should not be applied\n * @return {Point} The transformed point\n */\n transform(t: TMat2D, ignoreOffset = false): Point {\n return new Point(\n t[0] * this.x + t[2] * this.y + (ignoreOffset ? 0 : t[4]),\n t[1] * this.x + t[3] * this.y + (ignoreOffset ? 0 : t[5]),\n );\n }\n}\n\nexport const ZERO = new Point(0, 0);\n","import type { Constructor, TBBox } from './typedefs';\nimport { removeFromArray } from './util/internals/removeFromArray';\nimport { Point } from './Point';\nimport type { ActiveSelection } from './shapes/ActiveSelection';\nimport type { Group } from './shapes/Group';\nimport type { InteractiveFabricObject } from './shapes/Object/InteractiveObject';\nimport type { FabricObject } from './shapes/Object/FabricObject';\n\nexport const isCollection = (\n fabricObject?: FabricObject,\n): fabricObject is Group | ActiveSelection => {\n return !!fabricObject && Array.isArray((fabricObject as Group)._objects);\n};\n\nexport function createCollectionMixin(Base: TBase) {\n class Collection extends Base {\n /**\n * @type {FabricObject[]}\n * @TODO needs to end up in the constructor too\n */\n _objects: FabricObject[] = [];\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n _onObjectAdded(object: FabricObject) {\n // subclasses should override this method\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n _onObjectRemoved(object: FabricObject) {\n // subclasses should override this method\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n _onStackOrderChanged(object: FabricObject) {\n // subclasses should override this method\n }\n\n /**\n * Adds objects to collection\n * Objects should be instances of (or inherit from) FabricObject\n * @param {...FabricObject[]} objects to add\n * @returns {number} new array length\n */\n add(...objects: FabricObject[]): number {\n const size = this._objects.push(...objects);\n objects.forEach((object) => this._onObjectAdded(object));\n return size;\n }\n\n /**\n * Inserts an object into collection at specified index\n * @param {number} index Index to insert object at\n * @param {...FabricObject[]} objects Object(s) to insert\n * @returns {number} new array length\n */\n insertAt(index: number, ...objects: FabricObject[]) {\n this._objects.splice(index, 0, ...objects);\n objects.forEach((object) => this._onObjectAdded(object));\n return this._objects.length;\n }\n\n /**\n * Removes objects from a collection, then renders canvas (if `renderOnAddRemove` is not `false`)\n * @private\n * @param {...FabricObject[]} objects objects to remove\n * @returns {FabricObject[]} removed objects\n */\n remove(...objects: FabricObject[]) {\n const array = this._objects,\n removed: FabricObject[] = [];\n objects.forEach((object) => {\n const index = array.indexOf(object);\n // only call onObjectRemoved if an object was actually removed\n if (index !== -1) {\n array.splice(index, 1);\n removed.push(object);\n this._onObjectRemoved(object);\n }\n });\n return removed;\n }\n\n /**\n * Executes given function for each object in this group\n * A simple shortcut for getObjects().forEach, before es6 was more complicated,\n * now is just a shortcut.\n * @param {Function} callback\n * Callback invoked with current object as first argument,\n * index - as second and an array of all objects - as third.\n */\n forEachObject(\n callback: (\n object: FabricObject,\n index: number,\n array: FabricObject[],\n ) => any,\n ) {\n this.getObjects().forEach((object, index, objects) =>\n callback(object, index, objects),\n );\n }\n\n /**\n * Returns an array of children objects of this instance\n * @param {...String} [types] When specified, only objects of these types are returned\n * @return {Array}\n */\n getObjects(...types: string[]) {\n if (types.length === 0) {\n return [...this._objects];\n }\n return this._objects.filter((o) => o.isType(...types));\n }\n\n /**\n * Returns object at specified index\n * @param {Number} index\n * @return {Object} object at index\n */\n item(index: number) {\n return this._objects[index];\n }\n\n /**\n * Returns true if collection contains no objects\n * @return {Boolean} true if collection is empty\n */\n isEmpty() {\n return this._objects.length === 0;\n }\n\n /**\n * Returns a size of a collection (i.e: length of an array containing its objects)\n * @return {Number} Collection size\n */\n size() {\n return this._objects.length;\n }\n\n /**\n * Returns true if collection contains an object.\\\n * **Prefer using {@link FabricObject#isDescendantOf} for performance reasons**\n * instead of `a.contains(b)` use `b.isDescendantOf(a)`\n * @param {Object} object Object to check against\n * @param {Boolean} [deep=false] `true` to check all descendants, `false` to check only `_objects`\n * @return {Boolean} `true` if collection contains an object\n */\n contains(object: FabricObject, deep?: boolean): boolean {\n if (this._objects.includes(object)) {\n return true;\n } else if (deep) {\n return this._objects.some(\n (obj) =>\n obj instanceof Collection &&\n (obj as unknown as Collection).contains(object, true),\n );\n }\n return false;\n }\n\n /**\n * Returns number representation of a collection complexity\n * @return {Number} complexity\n */\n complexity() {\n return this._objects.reduce((memo, current) => {\n memo += current.complexity ? current.complexity() : 0;\n return memo;\n }, 0);\n }\n\n /**\n * Moves an object or the objects of a multiple selection\n * to the bottom of the stack of drawn objects\n * @param {fabric.Object} object Object to send to back\n * @returns {boolean} true if change occurred\n */\n sendObjectToBack(object: FabricObject) {\n if (!object || object === this._objects[0]) {\n return false;\n }\n removeFromArray(this._objects, object);\n this._objects.unshift(object);\n this._onStackOrderChanged(object);\n return true;\n }\n\n /**\n * Moves an object or the objects of a multiple selection\n * to the top of the stack of drawn objects\n * @param {fabric.Object} object Object to send\n * @returns {boolean} true if change occurred\n */\n bringObjectToFront(object: FabricObject) {\n if (!object || object === this._objects[this._objects.length - 1]) {\n return false;\n }\n removeFromArray(this._objects, object);\n this._objects.push(object);\n this._onStackOrderChanged(object);\n return true;\n }\n\n /**\n * Moves an object or a selection down in stack of drawn objects\n * An optional parameter, `intersecting` allows to move the object in behind\n * the first intersecting object. Where intersection is calculated with\n * bounding box. If no intersection is found, there will not be change in the\n * stack.\n * @param {fabric.Object} object Object to send\n * @param {boolean} [intersecting] If `true`, send object behind next lower intersecting object\n * @returns {boolean} true if change occurred\n */\n sendObjectBackwards(object: FabricObject, intersecting?: boolean) {\n if (!object) {\n return false;\n }\n const idx = this._objects.indexOf(object);\n if (idx !== 0) {\n // if object is not on the bottom of stack\n const newIdx = this.findNewLowerIndex(object, idx, intersecting);\n removeFromArray(this._objects, object);\n this._objects.splice(newIdx, 0, object);\n this._onStackOrderChanged(object);\n return true;\n }\n return false;\n }\n\n /**\n * Moves an object or a selection up in stack of drawn objects\n * An optional parameter, intersecting allows to move the object in front\n * of the first intersecting object. Where intersection is calculated with\n * bounding box. If no intersection is found, there will not be change in the\n * stack.\n * @param {fabric.Object} object Object to send\n * @param {boolean} [intersecting] If `true`, send object in front of next upper intersecting object\n * @returns {boolean} true if change occurred\n */\n bringObjectForward(object: FabricObject, intersecting?: boolean) {\n if (!object) {\n return false;\n }\n const idx = this._objects.indexOf(object);\n if (idx !== this._objects.length - 1) {\n // if object is not on top of stack (last item in an array)\n const newIdx = this.findNewUpperIndex(object, idx, intersecting);\n removeFromArray(this._objects, object);\n this._objects.splice(newIdx, 0, object);\n this._onStackOrderChanged(object);\n return true;\n }\n return false;\n }\n\n /**\n * Moves an object to specified level in stack of drawn objects\n * @param {fabric.Object} object Object to send\n * @param {number} index Position to move to\n * @returns {boolean} true if change occurred\n */\n moveObjectTo(object: FabricObject, index: number) {\n if (object === this._objects[index]) {\n return false;\n }\n removeFromArray(this._objects, object);\n this._objects.splice(index, 0, object);\n this._onStackOrderChanged(object);\n return true;\n }\n\n findNewLowerIndex(\n object: FabricObject,\n idx: number,\n intersecting?: boolean,\n ) {\n let newIdx;\n\n if (intersecting) {\n newIdx = idx;\n // traverse down the stack looking for the nearest intersecting object\n for (let i = idx - 1; i >= 0; --i) {\n if (object.isOverlapping(this._objects[i])) {\n newIdx = i;\n break;\n }\n }\n } else {\n newIdx = idx - 1;\n }\n\n return newIdx;\n }\n\n findNewUpperIndex(\n object: FabricObject,\n idx: number,\n intersecting?: boolean,\n ) {\n let newIdx;\n\n if (intersecting) {\n newIdx = idx;\n // traverse up the stack looking for the nearest intersecting object\n for (let i = idx + 1; i < this._objects.length; ++i) {\n if (object.isOverlapping(this._objects[i])) {\n newIdx = i;\n break;\n }\n }\n } else {\n newIdx = idx + 1;\n }\n\n return newIdx;\n }\n\n /**\n * Given a bounding box, return all the objects of the collection that are contained in the bounding box.\n * If `includeIntersecting` is true, return also the objects that intersect the bounding box as well.\n * This is meant to work with selection. Is not a generic method.\n * @param {TBBox} bbox a bounding box in scene coordinates\n * @param {{ includeIntersecting?: boolean }} options an object with includeIntersecting\n * @returns array of objects contained in the bounding box, ordered from top to bottom stacking wise\n */\n collectObjects(\n { left, top, width, height }: TBBox,\n { includeIntersecting = true }: { includeIntersecting?: boolean } = {},\n ) {\n const objects: InteractiveFabricObject[] = [],\n tl = new Point(left, top),\n br = tl.add(new Point(width, height));\n\n // we iterate reverse order to collect top first in case of click.\n for (let i = this._objects.length - 1; i >= 0; i--) {\n const object = this._objects[i] as unknown as InteractiveFabricObject;\n if (\n object.selectable &&\n object.visible &&\n ((includeIntersecting && object.intersectsWithRect(tl, br)) ||\n object.isContainedWithinRect(tl, br) ||\n (includeIntersecting && object.containsPoint(tl)) ||\n (includeIntersecting && object.containsPoint(br)))\n ) {\n objects.push(object);\n }\n }\n\n return objects;\n }\n }\n\n // https://github.com/microsoft/TypeScript/issues/32080\n return Collection;\n}\n","import { Observable } from './Observable';\n\nexport class CommonMethods extends Observable {\n /**\n * Sets object's properties from options, for initialization only\n * @protected\n * @param {Object} [options] Options object\n */\n protected _setOptions(options: any = {}) {\n for (const prop in options) {\n this.set(prop, options[prop]);\n }\n }\n\n /**\n * @private\n */\n _setObject(obj: Record) {\n for (const prop in obj) {\n this._set(prop, obj[prop]);\n }\n }\n\n /**\n * Sets property to a given value. When changing position/dimension -related properties (left, top, scale, angle, etc.) `set` does not update position of object's borders/controls. If you need to update those, call `setCoords()`.\n * @param {String|Object} key Property name or object (if object, iterate over the object properties)\n * @param {Object|Function} value Property value (if function, the value is passed into it and its return value is used as a new one)\n */\n set(key: string | Record, value?: any) {\n if (typeof key === 'object') {\n this._setObject(key);\n } else {\n this._set(key, value);\n }\n return this;\n }\n\n _set(key: string, value: any) {\n this[key as keyof this] = value;\n }\n\n /**\n * Toggles specified property from `true` to `false` or from `false` to `true`\n * @param {String} property Property to toggle\n */\n toggle(property: string) {\n const value = this.get(property);\n if (typeof value === 'boolean') {\n this.set(property, !value);\n }\n return this;\n }\n\n /**\n * Basic getter\n * @param {String} property Property name\n * @return {*} value of a property\n */\n get(property: string): any {\n return this[property as keyof this];\n }\n}\n","import { getFabricWindow } from '../../env';\n\nexport function requestAnimFrame(callback: FrameRequestCallback): number {\n return getFabricWindow().requestAnimationFrame(callback);\n}\n\nexport function cancelAnimFrame(handle: number): void {\n return getFabricWindow().cancelAnimationFrame(handle);\n}\n","let id = 0;\n\nexport const uid = () => id++;\n","import { getFabricDocument } from '../../env';\nimport type { ImageFormat, TSize } from '../../typedefs';\nimport { FabricError } from '../internals/console';\n/**\n * Creates canvas element\n * @return {CanvasElement} initialized canvas element\n */\nexport const createCanvasElement = (): HTMLCanvasElement => {\n const element = getFabricDocument().createElement('canvas');\n if (!element || typeof element.getContext === 'undefined') {\n throw new FabricError('Failed to create `canvas` element');\n }\n return element;\n};\n\n/**\n * Creates image element (works on client and node)\n * @return {HTMLImageElement} HTML image element\n */\nexport const createImage = (): HTMLImageElement =>\n getFabricDocument().createElement('img');\n\n/**\n * Creates a canvas element that is a copy of another and is also painted\n * @param {CanvasElement} canvas to copy size and content of\n * @return {CanvasElement} initialized canvas element\n */\nexport const copyCanvasElement = (\n canvas: HTMLCanvasElement,\n): HTMLCanvasElement => {\n const newCanvas = createCanvasElementFor(canvas);\n newCanvas.getContext('2d')?.drawImage(canvas, 0, 0);\n return newCanvas;\n};\n\n/**\n * Creates a canvas element as big as another\n * @param {CanvasElement} canvas to copy size and content of\n * @return {CanvasElement} initialized canvas element\n */\nexport const createCanvasElementFor = (\n canvas: HTMLCanvasElement | ImageData | HTMLImageElement | TSize,\n): HTMLCanvasElement => {\n const newCanvas = createCanvasElement();\n newCanvas.width = canvas.width;\n newCanvas.height = canvas.height;\n return newCanvas;\n};\n\n/**\n * since 2.6.0 moved from canvas instance to utility.\n * possibly useless\n * @param {CanvasElement} canvasEl to copy size and content of\n * @param {String} format 'jpeg' or 'png', in some browsers 'webp' is ok too\n * @param {number} quality <= 1 and > 0\n * @return {String} data url\n */\nexport const toDataURL = (\n canvasEl: HTMLCanvasElement,\n format: ImageFormat,\n quality: number,\n) => canvasEl.toDataURL(`image/${format}`, quality);\n\nexport const isHTMLCanvas = (\n canvas?: HTMLCanvasElement | string,\n): canvas is HTMLCanvasElement => {\n return !!canvas && (canvas as HTMLCanvasElement).getContext !== undefined;\n};\n\nexport const toBlob = (\n canvasEl: HTMLCanvasElement,\n format?: ImageFormat,\n quality?: number,\n): Promise =>\n new Promise((resolve, _) => {\n canvasEl.toBlob(resolve, `image/${format}`, quality);\n });\n","import type { TRadian, TDegree } from '../../typedefs';\nimport { PiBy180 } from '../../constants';\n\n/**\n * Transforms degrees to radians.\n * @param {TDegree} degrees value in degrees\n * @return {TRadian} value in radians\n */\nexport const degreesToRadians = (degrees: TDegree): TRadian =>\n (degrees * PiBy180) as TRadian;\n\n/**\n * Transforms radians to degrees.\n * @param {TRadian} radians value in radians\n * @return {TDegree} value in degrees\n */\nexport const radiansToDegrees = (radians: TRadian): TDegree =>\n (radians / PiBy180) as TDegree;\n","import { iMatrix } from '../../constants';\nimport type { XY } from '../../Point';\nimport { Point } from '../../Point';\nimport type { TDegree, TRadian, TMat2D } from '../../typedefs';\nimport { cos } from './cos';\nimport { degreesToRadians, radiansToDegrees } from './radiansDegreesConversion';\nimport { sin } from './sin';\n\nexport type TRotateMatrixArgs = {\n angle?: TDegree;\n};\n\nexport type TTranslateMatrixArgs = {\n translateX?: number;\n translateY?: number;\n};\n\nexport type TScaleMatrixArgs = {\n scaleX?: number;\n scaleY?: number;\n flipX?: boolean;\n flipY?: boolean;\n skewX?: TDegree;\n skewY?: TDegree;\n};\n\nexport type TComposeMatrixArgs = TTranslateMatrixArgs &\n TRotateMatrixArgs &\n TScaleMatrixArgs;\n\nexport type TQrDecomposeOut = Required<\n Omit\n>;\n\nexport const isIdentityMatrix = (mat: TMat2D) =>\n mat.every((value, index) => value === iMatrix[index]);\n\n/**\n * Apply transform t to point p\n * @deprecated use {@link Point#transform}\n * @param {Point | XY} p The point to transform\n * @param {Array} t The transform\n * @param {Boolean} [ignoreOffset] Indicates that the offset should not be applied\n * @return {Point} The transformed point\n */\nexport const transformPoint = (\n p: XY,\n t: TMat2D,\n ignoreOffset?: boolean,\n): Point => new Point(p).transform(t, ignoreOffset);\n\n/**\n * Invert transformation t\n * @param {Array} t The transform\n * @return {Array} The inverted transform\n */\nexport const invertTransform = (t: TMat2D): TMat2D => {\n const a = 1 / (t[0] * t[3] - t[1] * t[2]),\n r = [a * t[3], -a * t[1], -a * t[2], a * t[0], 0, 0] as TMat2D,\n { x, y } = new Point(t[4], t[5]).transform(r, true);\n r[4] = -x;\n r[5] = -y;\n return r;\n};\n\n/**\n * Multiply matrix A by matrix B to nest transformations\n * @param {TMat2D} a First transformMatrix\n * @param {TMat2D} b Second transformMatrix\n * @param {Boolean} is2x2 flag to multiply matrices as 2x2 matrices\n * @return {TMat2D} The product of the two transform matrices\n */\nexport const multiplyTransformMatrices = (\n a: TMat2D,\n b: TMat2D,\n is2x2?: boolean,\n): TMat2D =>\n [\n a[0] * b[0] + a[2] * b[1],\n a[1] * b[0] + a[3] * b[1],\n a[0] * b[2] + a[2] * b[3],\n a[1] * b[2] + a[3] * b[3],\n is2x2 ? 0 : a[0] * b[4] + a[2] * b[5] + a[4],\n is2x2 ? 0 : a[1] * b[4] + a[3] * b[5] + a[5],\n ] as TMat2D;\n\n/**\n * Multiplies the matrices array such that a matrix defines the plane for the rest of the matrices **after** it\n *\n * `multiplyTransformMatrixArray([A, B, C, D])` is equivalent to `A(B(C(D)))`\n *\n * @param matrices an array of matrices\n * @param [is2x2] flag to multiply matrices as 2x2 matrices\n * @returns the multiplication product\n */\nexport const multiplyTransformMatrixArray = (\n matrices: (TMat2D | undefined | null | false)[],\n is2x2?: boolean,\n) =>\n matrices.reduceRight(\n (product: TMat2D, curr) =>\n curr && product\n ? multiplyTransformMatrices(curr, product, is2x2)\n : curr || product,\n undefined as unknown as TMat2D,\n ) || iMatrix.concat();\n\nexport const calcPlaneRotation = ([a, b]: TMat2D) =>\n Math.atan2(b, a) as TRadian;\n\n/**\n * Decomposes standard 2x3 matrix into transform components\n * @param {TMat2D} a transformMatrix\n * @return {Object} Components of transform\n */\nexport const qrDecompose = (a: TMat2D): TQrDecomposeOut => {\n const angle = calcPlaneRotation(a),\n denom = Math.pow(a[0], 2) + Math.pow(a[1], 2),\n scaleX = Math.sqrt(denom),\n scaleY = (a[0] * a[3] - a[2] * a[1]) / scaleX,\n skewX = Math.atan2(a[0] * a[2] + a[1] * a[3], denom);\n return {\n angle: radiansToDegrees(angle),\n scaleX,\n scaleY,\n skewX: radiansToDegrees(skewX),\n skewY: 0 as TDegree,\n translateX: a[4] || 0,\n translateY: a[5] || 0,\n };\n};\n\n/**\n * Generate a translation matrix\n *\n * A translation matrix in the form of\n * [ 1 0 x ]\n * [ 0 1 y ]\n * [ 0 0 1 ]\n *\n * See {@link https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/transform#translate} for more details\n *\n * @param {number} x translation on X axis\n * @param {number} [y] translation on Y axis\n * @returns {TMat2D} matrix\n */\nexport const createTranslateMatrix = (x: number, y = 0): TMat2D => [\n 1,\n 0,\n 0,\n 1,\n x,\n y,\n];\n\n/**\n * Generate a rotation matrix around around a point (x,y), defaulting to (0,0)\n *\n * A matrix in the form of\n * [cos(a) -sin(a) -x*cos(a)+y*sin(a)+x]\n * [sin(a) cos(a) -x*sin(a)-y*cos(a)+y]\n * [0 0 1 ]\n *\n *\n * @param {TDegree} angle rotation in degrees\n * @param {XY} [pivotPoint] pivot point to rotate around\n * @returns {TMat2D} matrix\n */\nexport function createRotateMatrix(\n { angle = 0 }: TRotateMatrixArgs = {},\n { x = 0, y = 0 }: Partial = {},\n): TMat2D {\n const angleRadiant = degreesToRadians(angle),\n cosValue = cos(angleRadiant),\n sinValue = sin(angleRadiant);\n return [\n cosValue,\n sinValue,\n -sinValue,\n cosValue,\n x ? x - (cosValue * x - sinValue * y) : 0,\n y ? y - (sinValue * x + cosValue * y) : 0,\n ];\n}\n\n/**\n * Generate a scale matrix around the point (0,0)\n *\n * A matrix in the form of\n * [x 0 0]\n * [0 y 0]\n * [0 0 1]\n *\n * {@link https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/transform#scale}\n *\n * @param {number} x scale on X axis\n * @param {number} [y] scale on Y axis\n * @returns {TMat2D} matrix\n */\nexport const createScaleMatrix = (x: number, y: number = x): TMat2D => [\n x,\n 0,\n 0,\n y,\n 0,\n 0,\n];\n\nexport const angleToSkew = (angle: TDegree) =>\n Math.tan(degreesToRadians(angle));\n\nexport const skewToAngle = (value: TRadian) =>\n radiansToDegrees(Math.atan(value));\n\n/**\n * Generate a skew matrix for the X axis\n *\n * A matrix in the form of\n * [1 x 0]\n * [0 1 0]\n * [0 0 1]\n *\n * {@link https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/transform#skewx}\n *\n * @param {TDegree} skewValue translation on X axis\n * @returns {TMat2D} matrix\n */\nexport const createSkewXMatrix = (skewValue: TDegree): TMat2D => [\n 1,\n 0,\n angleToSkew(skewValue),\n 1,\n 0,\n 0,\n];\n\n/**\n * Generate a skew matrix for the Y axis\n *\n * A matrix in the form of\n * [1 0 0]\n * [y 1 0]\n * [0 0 1]\n *\n * {@link https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/transform#skewy}\n *\n * @param {TDegree} skewValue translation on Y axis\n * @returns {TMat2D} matrix\n */\nexport const createSkewYMatrix = (skewValue: TDegree): TMat2D => [\n 1,\n angleToSkew(skewValue),\n 0,\n 1,\n 0,\n 0,\n];\n\n/**\n * Returns a transform matrix starting from an object of the same kind of\n * the one returned from qrDecompose, useful also if you want to calculate some\n * transformations from an object that is not enlived yet.\n * is called DimensionsTransformMatrix because those properties are the one that influence\n * the size of the resulting box of the object.\n * @param {Object} options\n * @param {Number} [options.scaleX]\n * @param {Number} [options.scaleY]\n * @param {Boolean} [options.flipX]\n * @param {Boolean} [options.flipY]\n * @param {Number} [options.skewX]\n * @param {Number} [options.skewY]\n * @return {Number[]} transform matrix\n */\nexport const calcDimensionsMatrix = ({\n scaleX = 1,\n scaleY = 1,\n flipX = false,\n flipY = false,\n skewX = 0 as TDegree,\n skewY = 0 as TDegree,\n}: TScaleMatrixArgs) => {\n let matrix = createScaleMatrix(\n flipX ? -scaleX : scaleX,\n flipY ? -scaleY : scaleY,\n );\n if (skewX) {\n matrix = multiplyTransformMatrices(matrix, createSkewXMatrix(skewX), true);\n }\n if (skewY) {\n matrix = multiplyTransformMatrices(matrix, createSkewYMatrix(skewY), true);\n }\n return matrix;\n};\n\n/**\n * Returns a transform matrix starting from an object of the same kind of\n * the one returned from qrDecompose, useful also if you want to calculate some\n * transformations from an object that is not enlived yet\n * Before changing this function look at: src/benchmarks/calcTransformMatrix.mjs\n * @param {Object} options\n * @param {Number} [options.angle]\n * @param {Number} [options.scaleX]\n * @param {Number} [options.scaleY]\n * @param {Boolean} [options.flipX]\n * @param {Boolean} [options.flipY]\n * @param {Number} [options.skewX]\n * @param {Number} [options.skewY]\n * @param {Number} [options.translateX]\n * @param {Number} [options.translateY]\n * @return {Number[]} transform matrix\n */\nexport const composeMatrix = (options: TComposeMatrixArgs): TMat2D => {\n const { translateX = 0, translateY = 0, angle = 0 as TDegree } = options;\n let matrix = createTranslateMatrix(translateX, translateY);\n if (angle) {\n matrix = multiplyTransformMatrices(matrix, createRotateMatrix({ angle }));\n }\n const scaleMatrix = calcDimensionsMatrix(options);\n if (!isIdentityMatrix(scaleMatrix)) {\n matrix = multiplyTransformMatrices(matrix, scaleMatrix);\n }\n return matrix;\n};\n","import { noop } from '../../constants';\nimport type { FabricObject } from '../../shapes/Object/FabricObject';\nimport type {\n Abortable,\n Constructor,\n TCrossOrigin,\n TFiller,\n} from '../../typedefs';\nimport { createImage } from './dom';\nimport { classRegistry } from '../../ClassRegistry';\nimport type { BaseFilter } from '../../filters/BaseFilter';\nimport type { FabricObject as BaseFabricObject } from '../../shapes/Object/Object';\nimport { FabricError, SignalAbortedError } from '../internals/console';\nimport type { Shadow } from '../../Shadow';\n\nexport type LoadImageOptions = Abortable & {\n /**\n * cors value for the image loading, default to anonymous\n */\n crossOrigin?: TCrossOrigin;\n};\n\n/**\n * Loads image element from given url and resolve it, or catch.\n * @param {String} url URL representing an image\n * @param {LoadImageOptions} [options] image loading options\n * @returns {Promise} the loaded image.\n */\nexport const loadImage = (\n url: string,\n { signal, crossOrigin = null }: LoadImageOptions = {},\n) =>\n new Promise(function (resolve, reject) {\n if (signal && signal.aborted) {\n return reject(new SignalAbortedError('loadImage'));\n }\n const img = createImage();\n let abort: EventListenerOrEventListenerObject;\n if (signal) {\n abort = function (err: Event) {\n img.src = '';\n reject(err);\n };\n signal.addEventListener('abort', abort, { once: true });\n }\n const done = function () {\n img.onload = img.onerror = null;\n abort && signal?.removeEventListener('abort', abort);\n resolve(img);\n };\n if (!url) {\n done();\n return;\n }\n img.onload = done;\n img.onerror = function () {\n abort && signal?.removeEventListener('abort', abort);\n reject(new FabricError(`Error loading ${img.src}`));\n };\n crossOrigin && (img.crossOrigin = crossOrigin);\n img.src = url;\n });\n\nexport type EnlivenObjectOptions = Abortable & {\n /**\n * Method for further parsing of object elements,\n * called after each fabric object created.\n */\n reviver?: <\n T extends\n | BaseFabricObject\n | FabricObject\n | BaseFilter\n | Shadow\n | TFiller,\n >(\n serializedObj: Record,\n instance: T,\n ) => void;\n};\n\n/**\n * @TODO type this correctly.\n * Creates corresponding fabric instances from their object representations\n * @param {Object[]} objects Objects to enliven\n * @param {EnlivenObjectOptions} [options]\n * @param {(serializedObj: object, instance: FabricObject) => any} [options.reviver] Method for further parsing of object elements,\n * called after each fabric object created.\n * @param {AbortSignal} [options.signal] handle aborting, see https://developer.mozilla.org/en-US/docs/Web/API/AbortController/signal\n * @returns {Promise}\n */\nexport const enlivenObjects = <\n T extends\n | BaseFabricObject\n | FabricObject\n | BaseFilter\n | Shadow\n | TFiller,\n>(\n objects: any[],\n { signal, reviver = noop }: EnlivenObjectOptions = {},\n) =>\n new Promise((resolve, reject) => {\n const instances: T[] = [];\n signal && signal.addEventListener('abort', reject, { once: true });\n Promise.all(\n objects.map((obj) =>\n classRegistry\n .getClass<\n Constructor & {\n fromObject(options: any, context: Abortable): Promise;\n }\n >(obj.type)\n .fromObject(obj, { signal })\n .then((fabricInstance) => {\n reviver(obj, fabricInstance);\n instances.push(fabricInstance);\n return fabricInstance;\n }),\n ),\n )\n .then(resolve)\n .catch((error) => {\n // cleanup\n instances.forEach((instance) => {\n (instance as FabricObject).dispose &&\n (instance as FabricObject).dispose();\n });\n reject(error);\n })\n .finally(() => {\n signal && signal.removeEventListener('abort', reject);\n });\n });\n\n/**\n * Creates corresponding fabric instances residing in an object, e.g. `clipPath`\n * @param {Object} object with properties to enlive ( fill, stroke, clipPath, path )\n * @param {object} [options]\n * @param {AbortSignal} [options.signal] handle aborting, see https://developer.mozilla.org/en-US/docs/Web/API/AbortController/signal\n * @returns {Promise>} the input object with enlived values\n */\nexport const enlivenObjectEnlivables = <\n R = Record,\n>(\n serializedObject: any,\n { signal }: Abortable = {},\n) =>\n new Promise((resolve, reject) => {\n const instances: (FabricObject | TFiller | Shadow)[] = [];\n signal && signal.addEventListener('abort', reject, { once: true });\n // enlive every possible property\n const promises = Object.values(serializedObject).map((value: any) => {\n if (!value) {\n return value;\n }\n /**\n * clipPath or shadow or gradient or text on a path or a pattern,\n * or the backgroundImage or overlayImage of canvas\n * If we have a type and there is a classe registered for it, we enlive it.\n * If there is no class registered for it we return the value as is\n * */\n if (value.type && classRegistry.has(value.type)) {\n return enlivenObjects([value], {\n signal,\n }).then(([enlived]) => {\n instances.push(enlived);\n return enlived;\n });\n }\n return value;\n });\n const keys = Object.keys(serializedObject);\n Promise.all(promises)\n .then((enlived) => {\n return enlived.reduce((acc, instance, index) => {\n acc[keys[index]] = instance;\n return acc;\n }, {});\n })\n .then(resolve)\n .catch((error) => {\n // cleanup\n instances.forEach((instance: any) => {\n instance.dispose && instance.dispose();\n });\n reject(error);\n })\n .finally(() => {\n signal && signal.removeEventListener('abort', reject);\n });\n });\n","/**\n * Populates an object with properties of another object\n * @param {Object} source Source object\n * @param {string[]} properties Properties names to include\n * @returns object populated with the picked keys\n */\nexport const pick = >(\n source: T,\n keys: (keyof T)[] = [],\n) => {\n return keys.reduce((o, key) => {\n if (key in source) {\n o[key] = source[key];\n }\n return o;\n }, {} as Partial);\n};\n\nexport const pickBy = >(\n source: T,\n predicate: (value: T[K], key: K, collection: T) => boolean,\n) => {\n return (Object.keys(source) as (keyof T)[]).reduce((o, key) => {\n if (predicate(source[key], key, source)) {\n o[key] = source[key];\n }\n return o;\n }, {} as Partial);\n};\n","/**\n * A wrapper around Number#toFixed, which contrary to native method returns number, not string.\n * @param {number|string} number number to operate on\n * @param {number} fractionDigits number of fraction digits to \"leave\"\n * @return {number}\n */\nexport const toFixed = (number: number | string, fractionDigits: number) =>\n parseFloat(Number(number).toFixed(fractionDigits));\n","import type { TMat2D } from '../../typedefs';\nimport { toFixed } from './toFixed';\nimport { config } from '../../config';\n\n/**\n * given an array of 6 number returns something like `\"matrix(...numbers)\"`\n * @param {TMat2D} transform an array with 6 numbers\n * @return {String} transform matrix for svg\n */\nexport const matrixToSVG = (transform: TMat2D) =>\n 'matrix(' +\n transform\n .map((value) => toFixed(value, config.NUM_FRACTION_DIGITS))\n .join(' ') +\n ')';\n","import type { FabricObject } from '../shapes/Object/Object';\nimport type { TFiller } from '../typedefs';\nimport type { FabricText } from '../shapes/Text/Text';\nimport type { Pattern } from '../Pattern';\nimport type { Path } from '../shapes/Path';\nimport type { ActiveSelection } from '../shapes/ActiveSelection';\n\nexport const isFiller = (\n filler: TFiller | string | null,\n): filler is TFiller => {\n return !!filler && (filler as TFiller).toLive !== undefined;\n};\n\nexport const isSerializableFiller = (\n filler: TFiller | string | null,\n): filler is TFiller => {\n return !!filler && typeof (filler as TFiller).toObject === 'function';\n};\n\nexport const isPattern = (filler: TFiller): filler is Pattern => {\n return (\n !!filler && (filler as Pattern).offsetX !== undefined && 'source' in filler\n );\n};\n\nexport const isTextObject = (\n fabricObject?: FabricObject,\n): fabricObject is FabricText => {\n return (\n !!fabricObject &&\n typeof (fabricObject as FabricText)._renderText === 'function'\n );\n};\n\nexport const isPath = (fabricObject?: FabricObject): fabricObject is Path => {\n // we could use instanceof but that would mean pulling in Text code for a simple check\n // @todo discuss what to do and how to do\n return (\n !!fabricObject &&\n typeof (fabricObject as Path)._renderPathCommands === 'function'\n );\n};\n\nexport const isActiveSelection = (\n fabricObject?: FabricObject,\n): fabricObject is ActiveSelection =>\n !!fabricObject && 'multiSelectionStacking' in fabricObject;\n","/**\n * Returns element scroll offsets\n * @param {HTMLElement} element Element to operate on\n * @return {Object} Object with left/top values\n */\nexport function getScrollLeftTop(element: HTMLElement | null) {\n const doc = element && getDocumentFromElement(element);\n let left = 0,\n top = 0;\n if (!element || !doc) {\n return { left, top };\n }\n let elementLoop: HTMLElement | Document | ShadowRoot = element;\n const docElement = doc.documentElement,\n body = doc.body || {\n scrollLeft: 0,\n scrollTop: 0,\n };\n // While loop checks (and then sets element to) .parentNode OR .host\n // to account for ShadowDOM. We still want to traverse up out of ShadowDOM,\n // but the .parentNode of a root ShadowDOM node will always be null, instead\n // it should be accessed through .host. See http://stackoverflow.com/a/24765528/4383938\n while (\n elementLoop &&\n (elementLoop.parentNode || (elementLoop as unknown as ShadowRoot).host)\n ) {\n elementLoop = (elementLoop.parentNode ||\n (elementLoop as unknown as ShadowRoot).host) as\n | HTMLElement\n | Document\n | ShadowRoot;\n if (elementLoop === doc) {\n left = body.scrollLeft || docElement.scrollLeft || 0;\n top = body.scrollTop || docElement.scrollTop || 0;\n } else {\n left += (elementLoop as HTMLElement).scrollLeft || 0;\n top += (elementLoop as HTMLElement).scrollTop || 0;\n }\n\n if (\n elementLoop.nodeType === 1 &&\n (elementLoop as HTMLElement).style.position === 'fixed'\n ) {\n break;\n }\n }\n\n return { left, top };\n}\n\nexport const getDocumentFromElement = (el: HTMLElement) =>\n el.ownerDocument || null;\n\nexport const getWindowFromElement = (el: HTMLElement) =>\n el.ownerDocument?.defaultView || null;\n","import { NONE } from '../../constants';\nimport type { TSize } from '../../typedefs';\nimport {\n getDocumentFromElement,\n getWindowFromElement,\n getScrollLeftTop,\n} from '../../util/dom_misc';\n\nexport const setCanvasDimensions = (\n el: HTMLCanvasElement,\n ctx: CanvasRenderingContext2D,\n { width, height }: TSize,\n retinaScaling = 1,\n) => {\n el.width = width;\n el.height = height;\n if (retinaScaling > 1) {\n el.setAttribute('width', (width * retinaScaling).toString());\n el.setAttribute('height', (height * retinaScaling).toString());\n ctx.scale(retinaScaling, retinaScaling);\n }\n};\n\nexport type CSSDimensions = {\n width: number | string;\n height: number | string;\n};\n\nexport const setCSSDimensions = (\n el: HTMLElement,\n { width, height }: Partial,\n) => {\n width && (el.style.width = typeof width === 'number' ? `${width}px` : width);\n height &&\n (el.style.height = typeof height === 'number' ? `${height}px` : height);\n};\n\n/**\n * Returns offset for a given element\n * @param {HTMLElement} element Element to get offset for\n * @return {Object} Object with \"left\" and \"top\" properties\n */\nexport function getElementOffset(element: HTMLElement) {\n const doc = element && getDocumentFromElement(element),\n offset = { left: 0, top: 0 };\n\n if (!doc) {\n return offset;\n }\n const elemStyle: CSSStyleDeclaration =\n getWindowFromElement(element)?.getComputedStyle(element, null) ||\n ({} as CSSStyleDeclaration);\n offset.left += parseInt(elemStyle.borderLeftWidth, 10) || 0;\n offset.top += parseInt(elemStyle.borderTopWidth, 10) || 0;\n offset.left += parseInt(elemStyle.paddingLeft, 10) || 0;\n offset.top += parseInt(elemStyle.paddingTop, 10) || 0;\n\n let box = { left: 0, top: 0 };\n\n const docElem = doc.documentElement;\n if (typeof element.getBoundingClientRect !== 'undefined') {\n box = element.getBoundingClientRect();\n }\n\n const scrollLeftTop = getScrollLeftTop(element);\n\n return {\n left:\n box.left + scrollLeftTop.left - (docElem.clientLeft || 0) + offset.left,\n top: box.top + scrollLeftTop.top - (docElem.clientTop || 0) + offset.top,\n };\n}\n\n/**\n * Makes element unselectable\n * @param {HTMLElement} element Element to make unselectable\n * @return {HTMLElement} Element that was passed in\n */\nexport function makeElementUnselectable(element: HTMLElement) {\n if (typeof element.onselectstart !== 'undefined') {\n element.onselectstart = () => false;\n }\n element.style.userSelect = NONE;\n return element;\n}\n","import { getEnv, getFabricDocument } from '../../env';\nimport type { TSize } from '../../typedefs';\nimport type { CSSDimensions } from './util';\nimport { setCSSDimensions, getElementOffset } from './util';\nimport { createCanvasElement, isHTMLCanvas } from '../../util/misc/dom';\nimport { setCanvasDimensions } from './util';\nimport { FabricError } from '../../util/internals/console';\n\nexport type CanvasItem = {\n el: HTMLCanvasElement;\n ctx: CanvasRenderingContext2D;\n};\n\nexport class StaticCanvasDOMManager {\n /**\n * Keeps a copy of the canvas style before setting retina scaling and other potions\n * in order to return it to original state on dispose\n * @type string\n */\n private _originalCanvasStyle?: string;\n\n lower: CanvasItem;\n\n constructor(arg0?: string | HTMLCanvasElement) {\n const el = this.createLowerCanvas(arg0);\n this.lower = { el, ctx: el.getContext('2d')! };\n }\n\n protected createLowerCanvas(arg0?: HTMLCanvasElement | string) {\n // canvasEl === 'HTMLCanvasElement' does not work on jsdom/node\n const el = isHTMLCanvas(arg0)\n ? arg0\n : (arg0 &&\n (getFabricDocument().getElementById(arg0) as HTMLCanvasElement)) ||\n createCanvasElement();\n if (el.hasAttribute('data-fabric')) {\n throw new FabricError(\n 'Trying to initialize a canvas that has already been initialized. Did you forget to dispose the canvas?',\n );\n }\n this._originalCanvasStyle = el.style.cssText;\n el.setAttribute('data-fabric', 'main');\n el.classList.add('lower-canvas');\n return el;\n }\n\n cleanupDOM({ width, height }: TSize) {\n const { el } = this.lower;\n // restore canvas style and attributes\n el.classList.remove('lower-canvas');\n el.removeAttribute('data-fabric');\n // restore canvas size to original size in case retina scaling was applied\n el.setAttribute('width', `${width}`);\n el.setAttribute('height', `${height}`);\n el.style.cssText = this._originalCanvasStyle || '';\n this._originalCanvasStyle = undefined;\n }\n\n setDimensions(size: TSize, retinaScaling: number) {\n const { el, ctx } = this.lower;\n setCanvasDimensions(el, ctx, size, retinaScaling);\n }\n\n setCSSDimensions(size: Partial) {\n setCSSDimensions(this.lower.el, size);\n }\n\n /**\n * Calculates canvas element offset relative to the document\n */\n calcOffset() {\n return getElementOffset(this.lower.el);\n }\n\n dispose() {\n getEnv().dispose(this.lower.el);\n // @ts-expect-error disposing\n delete this.lower;\n }\n}\n","import { iMatrix } from '../constants';\nimport type { FabricObject } from '../shapes/Object/FabricObject';\nimport type { TFiller, TMat2D, TOptions } from '../typedefs';\n\ninterface CanvasDrawableOptions {\n /**\n * if set to false background image is not affected by viewport transform\n * @since 1.6.3\n * @type Boolean\n * @todo we should really find a different way to do this\n */\n backgroundVpt: boolean;\n\n /**\n * Background color of canvas instance.\n * @type {(String|TFiller)}\n */\n backgroundColor: TFiller | string;\n\n /**\n * Background image of canvas instance.\n * since 2.4.0 image caching is active, please when putting an image as background, add to the\n * canvas property a reference to the canvas it is on. Otherwise the image cannot detect the zoom\n * vale. As an alternative you can disable image objectCaching\n * @type FabricObject\n */\n backgroundImage?: FabricObject;\n\n /**\n * if set to false overlay image is not affected by viewport transform\n * @since 1.6.3\n * @type Boolean\n * @todo we should really find a different way to do this\n */\n overlayVpt: boolean;\n\n /**\n * Overlay color of canvas instance.\n * @since 1.3.9\n * @type {(String|TFiller)}\n */\n overlayColor: TFiller | string;\n\n /**\n * Overlay image of canvas instance.\n * since 2.4.0 image caching is active, please when putting an image as overlay, add to the\n * canvas property a reference to the canvas it is on. Otherwise the image cannot detect the zoom\n * vale. As an alternative you can disable image objectCaching\n * @type FabricObject\n */\n overlayImage?: FabricObject;\n}\n\ninterface CanvasRenderingOptions {\n /**\n * Indicates whether {@link StaticCanvas#add}, {@link StaticCanvas#insertAt} and {@link StaticCanvas#remove},\n * {@link StaticCanvas#moveTo}, {@link StaticCanvas#clear} and many more, should also re-render canvas.\n * Disabling this option will not give a performance boost when adding/removing a lot of objects to/from canvas at once\n * since the renders are queued and executed one per frame.\n * Disabling is suggested anyway and managing the renders of the app manually is not a big effort ( canvas.requestRenderAll() )\n * Left default to true to do not break documentation and old app, fiddles.\n * @type Boolean\n */\n renderOnAddRemove: boolean;\n\n /**\n * Based on vptCoords and object.aCoords, skip rendering of objects that\n * are not included in current viewport.\n * May greatly help in applications with crowded canvas and use of zoom/pan\n * If One of the corner of the bounding box of the object is on the canvas\n * the objects get rendered.\n * @type Boolean\n * @default true\n */\n skipOffscreen: boolean;\n\n /**\n * When true, canvas is scaled by devicePixelRatio for better rendering on retina screens\n * @type Boolean\n */\n enableRetinaScaling: boolean;\n\n /**\n * Indicates whether this canvas will use image smoothing, this is on by default in browsers\n * @type Boolean\n */\n imageSmoothingEnabled: boolean;\n\n /**\n * a fabricObject that, without stroke define a clipping area with their shape. filled in black\n * the clipPath object gets used when the canvas has rendered, and the context is placed in the\n * top left corner of the canvas.\n * clipPath will clip away controls, if you do not want this to happen use controlsAboveOverlay = true\n * @type FabricObject\n */\n clipPath?: FabricObject;\n}\n\nexport interface CanvasExportOptions {\n /**\n * Indicates whether toObject/toDatalessObject should include default values\n * if set to false, takes precedence over the object value.\n * @type Boolean\n */\n includeDefaultValues: boolean;\n\n /**\n * When true, getSvgTransform() will apply the StaticCanvas.viewportTransform to the SVG transformation. When true,\n * a zoomed canvas will then produce zoomed SVG output.\n * @type Boolean\n */\n svgViewportTransformation: boolean;\n}\n\nexport interface StaticCanvasOptions\n extends CanvasDrawableOptions,\n CanvasRenderingOptions,\n CanvasExportOptions {\n /**\n * Width in virtual/logical pixels of the canvas.\n * The canvas can be larger than width if retina scaling is active\n * @type number\n */\n width: number;\n\n /**\n * Height in virtual/logical pixels of the canvas.\n * The canvas can be taller than width if retina scaling is active\n * @type height\n */\n height: number;\n\n /**\n * Indicates whether object controls (borders/controls) are rendered above overlay image\n * @type Boolean\n *\n * @todo move to Canvas\n */\n controlsAboveOverlay: boolean;\n\n /**\n * Indicates whether the browser can be scrolled when using a touchscreen and dragging on the canvas\n * It gives PRIORITY to DOM scrolling, it doesn't make it always possible.\n * If is true, when using a touch event on the canvas, the canvas will scroll if scroll is possible.\n * If we are in drawing mode or if we are selecting an object the canvas preventDefault and so it won't scroll\n * @type Boolean\n *\n * @todo move to Canvas\n */\n allowTouchScrolling: boolean;\n\n /**\n * The transformation (a Canvas 2D API transform matrix) which focuses the viewport\n * @type Array\n * @example Default transform\n * canvas.viewportTransform = [1, 0, 0, 1, 0, 0];\n * @example Scale by 70% and translate toward bottom-right by 50, without skewing\n * canvas.viewportTransform = [0.7, 0, 0, 0.7, 50, 50];\n */\n viewportTransform: TMat2D;\n}\n\nexport const staticCanvasDefaults: TOptions = {\n backgroundVpt: true,\n backgroundColor: '',\n overlayVpt: true,\n overlayColor: '',\n\n includeDefaultValues: true,\n svgViewportTransformation: true,\n\n renderOnAddRemove: true,\n skipOffscreen: true,\n enableRetinaScaling: true,\n imageSmoothingEnabled: true,\n\n /**\n * @todo move to Canvas\n */\n controlsAboveOverlay: false,\n /**\n * @todo move to Canvas\n */\n allowTouchScrolling: false,\n\n viewportTransform: [...iMatrix],\n};\n","import { config } from '../config';\nimport { CENTER, VERSION } from '../constants';\nimport type { CanvasEvents, StaticCanvasEvents } from '../EventTypeDefs';\nimport type { Gradient } from '../gradient/Gradient';\nimport { createCollectionMixin, isCollection } from '../Collection';\nimport { CommonMethods } from '../CommonMethods';\nimport type { Pattern } from '../Pattern';\nimport { Point } from '../Point';\nimport type { TCachedFabricObject } from '../shapes/Object/Object';\nimport type {\n Abortable,\n Constructor,\n TCornerPoint,\n TDataUrlOptions,\n TFiller,\n TMat2D,\n TSize,\n TSVGReviver,\n TToCanvasElementOptions,\n TValidToObjectMethod,\n TOptions,\n} from '../typedefs';\nimport {\n cancelAnimFrame,\n requestAnimFrame,\n} from '../util/animation/AnimationFrameProvider';\nimport { runningAnimations } from '../util/animation/AnimationRegistry';\nimport { uid } from '../util/internals/uid';\nimport { createCanvasElementFor, toBlob, toDataURL } from '../util/misc/dom';\nimport { invertTransform, transformPoint } from '../util/misc/matrix';\nimport type { EnlivenObjectOptions } from '../util/misc/objectEnlive';\nimport {\n enlivenObjectEnlivables,\n enlivenObjects,\n} from '../util/misc/objectEnlive';\nimport { pick } from '../util/misc/pick';\nimport { matrixToSVG } from '../util/misc/svgExport';\nimport { toFixed } from '../util/misc/toFixed';\nimport { isFiller, isPattern, isTextObject } from '../util/typeAssertions';\nimport { StaticCanvasDOMManager } from './DOMManagers/StaticCanvasDOMManager';\nimport type { CSSDimensions } from './DOMManagers/util';\nimport type { FabricObject } from '../shapes/Object/FabricObject';\nimport type { StaticCanvasOptions } from './StaticCanvasOptions';\nimport { staticCanvasDefaults } from './StaticCanvasOptions';\nimport { log, FabricError } from '../util/internals/console';\nimport { getDevicePixelRatio } from '../env';\n\n/**\n * Having both options in TCanvasSizeOptions set to true transform the call in a calcOffset\n * Better try to restrict with types to avoid confusion.\n */\nexport type TCanvasSizeOptions =\n | {\n backstoreOnly?: true;\n cssOnly?: false;\n }\n | {\n backstoreOnly?: false;\n cssOnly?: true;\n };\n\nexport type TSVGExportOptions = {\n suppressPreamble?: boolean;\n viewBox?: {\n x: number;\n y: number;\n width: number;\n height: number;\n };\n encoding?: 'UTF-8'; // test Encoding type and see what happens\n width?: string;\n height?: string;\n reviver?: TSVGReviver;\n};\n\n/**\n * Static canvas class\n * @see {@link http://fabric5.fabricjs.com/static_canvas|StaticCanvas demo}\n * @fires before:render\n * @fires after:render\n * @fires canvas:cleared\n * @fires object:added\n * @fires object:removed\n */\n// TODO: fix `EventSpec` inheritance https://github.com/microsoft/TypeScript/issues/26154#issuecomment-1366616260\nexport class StaticCanvas<\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n EventSpec extends StaticCanvasEvents = StaticCanvasEvents,\n >\n extends createCollectionMixin(CommonMethods)\n implements StaticCanvasOptions\n{\n declare width: number;\n declare height: number;\n\n // background\n declare backgroundVpt: boolean;\n declare backgroundColor: TFiller | string;\n declare backgroundImage?: FabricObject;\n // overlay\n declare overlayVpt: boolean;\n declare overlayColor: TFiller | string;\n declare overlayImage?: FabricObject;\n\n declare clipPath?: FabricObject;\n\n declare includeDefaultValues: boolean;\n\n // rendering config\n declare renderOnAddRemove: boolean;\n declare skipOffscreen: boolean;\n declare enableRetinaScaling: boolean;\n declare imageSmoothingEnabled: boolean;\n\n /**\n * @todo move to Canvas\n */\n declare controlsAboveOverlay: boolean;\n\n /**\n * @todo move to Canvas\n */\n declare allowTouchScrolling: boolean;\n\n declare viewportTransform: TMat2D;\n\n /**\n * The viewport bounding box in scene plane coordinates, see {@link calcViewportBoundaries}\n */\n declare vptCoords: TCornerPoint;\n\n /**\n * A reference to the canvas actual HTMLCanvasElement.\n * Can be use to read the raw pixels, but never write or manipulate\n * @type HTMLCanvasElement\n */\n get lowerCanvasEl() {\n return this.elements.lower?.el;\n }\n\n get contextContainer() {\n return this.elements.lower?.ctx;\n }\n\n /**\n * If true the Canvas is in the process or has been disposed/destroyed.\n * No more rendering operation will be executed on this canvas.\n * @type boolean\n */\n declare destroyed?: boolean;\n\n /**\n * Started the process of disposing but not done yet.\n * WIll likely complete the render cycle already scheduled but stopping adding more.\n * @type boolean\n */\n declare disposed?: boolean;\n\n declare _offset: { left: number; top: number };\n declare protected hasLostContext: boolean;\n declare protected nextRenderHandle: number;\n\n declare elements: StaticCanvasDOMManager;\n\n /**\n * When true control drawing is skipped.\n * This boolean is used to avoid toDataURL to export controls.\n * Usage of this boolean to build up other flows and features is not supported\n * @type Boolean\n * @default false\n */\n declare protected skipControlsDrawing: boolean;\n\n static ownDefaults = staticCanvasDefaults;\n\n // reference to\n declare protected __cleanupTask?: {\n (): void;\n kill: (reason?: any) => void;\n };\n\n static getDefaults(): Record {\n return StaticCanvas.ownDefaults;\n }\n\n constructor(\n el?: string | HTMLCanvasElement,\n options: TOptions = {},\n ) {\n super();\n Object.assign(\n this,\n (this.constructor as typeof StaticCanvas).getDefaults(),\n );\n this.set(options);\n this.initElements(el);\n this._setDimensionsImpl({\n width: this.width || this.elements.lower.el.width || 0,\n height: this.height || this.elements.lower.el.height || 0,\n });\n this.skipControlsDrawing = false;\n this.viewportTransform = [...this.viewportTransform];\n this.calcViewportBoundaries();\n }\n\n protected initElements(el?: string | HTMLCanvasElement) {\n this.elements = new StaticCanvasDOMManager(el);\n }\n\n add(...objects: FabricObject[]) {\n const size = super.add(...objects);\n objects.length > 0 && this.renderOnAddRemove && this.requestRenderAll();\n return size;\n }\n\n insertAt(index: number, ...objects: FabricObject[]) {\n const size = super.insertAt(index, ...objects);\n objects.length > 0 && this.renderOnAddRemove && this.requestRenderAll();\n return size;\n }\n\n remove(...objects: FabricObject[]) {\n const removed = super.remove(...objects);\n removed.length > 0 && this.renderOnAddRemove && this.requestRenderAll();\n return removed;\n }\n\n _onObjectAdded(obj: FabricObject) {\n if (obj.canvas && (obj.canvas as StaticCanvas) !== this) {\n log(\n 'warn',\n 'Canvas is trying to add an object that belongs to a different canvas.\\n' +\n 'Resulting to default behavior: removing object from previous canvas and adding to new canvas',\n );\n obj.canvas.remove(obj);\n }\n obj._set('canvas', this);\n obj.setCoords();\n this.fire('object:added', { target: obj });\n obj.fire('added', { target: this });\n }\n\n _onObjectRemoved(obj: FabricObject) {\n obj._set('canvas', undefined);\n this.fire('object:removed', { target: obj });\n obj.fire('removed', { target: this });\n }\n\n _onStackOrderChanged() {\n this.renderOnAddRemove && this.requestRenderAll();\n }\n\n /**\n * @private\n * @see https://developer.apple.com/library/safari/documentation/AudioVideo/Conceptual/HTML-canvas-guide/SettingUptheCanvas/SettingUptheCanvas.html\n * @return {Number} retinaScaling if applied, otherwise 1;\n */\n getRetinaScaling() {\n return this.enableRetinaScaling ? getDevicePixelRatio() : 1;\n }\n\n /**\n * Calculates canvas element offset relative to the document\n * This method is also attached as \"resize\" event handler of window\n */\n calcOffset() {\n return (this._offset = this.elements.calcOffset());\n }\n\n /**\n * Returns canvas width (in px)\n * @return {Number}\n */\n getWidth(): number {\n return this.width;\n }\n\n /**\n * Returns canvas height (in px)\n * @return {Number}\n */\n getHeight(): number {\n return this.height;\n }\n\n /**\n * Internal use only\n * @protected\n */\n protected _setDimensionsImpl(\n dimensions: Partial,\n { cssOnly = false, backstoreOnly = false }: TCanvasSizeOptions = {},\n ) {\n if (!cssOnly) {\n const size = {\n width: this.width,\n height: this.height,\n ...(dimensions as Partial),\n };\n this.elements.setDimensions(size, this.getRetinaScaling());\n this.hasLostContext = true;\n this.width = size.width;\n this.height = size.height;\n }\n if (!backstoreOnly) {\n this.elements.setCSSDimensions(dimensions);\n }\n\n this.calcOffset();\n }\n\n /**\n * Sets dimensions (width, height) of this canvas instance. when options.cssOnly flag active you should also supply the unit of measure (px/%/em)\n * @param {Object} dimensions Object with width/height properties\n * @param {Number|String} [dimensions.width] Width of canvas element\n * @param {Number|String} [dimensions.height] Height of canvas element\n * @param {Object} [options] Options object\n * @param {Boolean} [options.backstoreOnly=false] Set the given dimensions only as canvas backstore dimensions\n * @param {Boolean} [options.cssOnly=false] Set the given dimensions only as css dimensions\n */\n setDimensions(\n dimensions: Partial,\n options?: { cssOnly?: true; backstoreOnly?: false },\n ): void;\n setDimensions(\n dimensions: Partial,\n options?: { backstoreOnly?: true; cssOnly?: false },\n ): void;\n setDimensions(dimensions: Partial, options?: never): void;\n setDimensions(\n dimensions: Partial,\n options?: TCanvasSizeOptions,\n ) {\n this._setDimensionsImpl(dimensions, options);\n if (!options || !options.cssOnly) {\n this.requestRenderAll();\n }\n }\n\n /**\n * Returns canvas zoom level\n * @return {Number}\n */\n getZoom() {\n return this.viewportTransform[0];\n }\n\n /**\n * Sets viewport transformation of this canvas instance\n * @param {Array} vpt a Canvas 2D API transform matrix\n */\n setViewportTransform(vpt: TMat2D) {\n this.viewportTransform = vpt;\n this.calcViewportBoundaries();\n this.renderOnAddRemove && this.requestRenderAll();\n }\n\n /**\n * Sets zoom level of this canvas instance, the zoom centered around point\n * meaning that following zoom to point with the same point will have the visual\n * effect of the zoom originating from that point. The point won't move.\n * It has nothing to do with canvas center or visual center of the viewport.\n * @param {Point} point to zoom with respect to\n * @param {Number} value to set zoom to, less than 1 zooms out\n */\n zoomToPoint(point: Point, value: number) {\n // TODO: just change the scale, preserve other transformations\n const before = point,\n vpt: TMat2D = [...this.viewportTransform];\n const newPoint = transformPoint(point, invertTransform(vpt));\n vpt[0] = value;\n vpt[3] = value;\n const after = transformPoint(newPoint, vpt);\n vpt[4] += before.x - after.x;\n vpt[5] += before.y - after.y;\n this.setViewportTransform(vpt);\n }\n\n /**\n * Sets zoom level of this canvas instance\n * @param {Number} value to set zoom to, less than 1 zooms out\n */\n setZoom(value: number) {\n this.zoomToPoint(new Point(0, 0), value);\n }\n\n /**\n * Pan viewport so as to place point at top left corner of canvas\n * @param {Point} point to move to\n */\n absolutePan(point: Point) {\n const vpt: TMat2D = [...this.viewportTransform];\n vpt[4] = -point.x;\n vpt[5] = -point.y;\n return this.setViewportTransform(vpt);\n }\n\n /**\n * Pans viewpoint relatively\n * @param {Point} point (position vector) to move by\n */\n relativePan(point: Point) {\n return this.absolutePan(\n new Point(\n -point.x - this.viewportTransform[4],\n -point.y - this.viewportTransform[5],\n ),\n );\n }\n\n /**\n * Returns <canvas> element corresponding to this instance\n * @return {HTMLCanvasElement}\n */\n getElement(): HTMLCanvasElement {\n return this.elements.lower.el;\n }\n\n /**\n * Clears specified context of canvas element\n * @param {CanvasRenderingContext2D} ctx Context to clear\n */\n clearContext(ctx: CanvasRenderingContext2D) {\n ctx.clearRect(0, 0, this.width, this.height);\n }\n\n /**\n * Returns context of canvas where objects are drawn\n * @return {CanvasRenderingContext2D}\n */\n getContext(): CanvasRenderingContext2D {\n return this.elements.lower.ctx;\n }\n\n /**\n * Clears all contexts (background, main, top) of an instance\n */\n clear() {\n this.remove(...this.getObjects());\n this.backgroundImage = undefined;\n this.overlayImage = undefined;\n this.backgroundColor = '';\n this.overlayColor = '';\n this.clearContext(this.getContext());\n this.fire('canvas:cleared');\n this.renderOnAddRemove && this.requestRenderAll();\n }\n\n /**\n * Renders the canvas\n */\n renderAll() {\n this.cancelRequestedRender();\n if (this.destroyed) {\n return;\n }\n this.renderCanvas(this.getContext(), this._objects);\n }\n\n /**\n * Function created to be instance bound at initialization\n * used in requestAnimationFrame rendering\n * Let the fabricJS call it. If you call it manually you could have more\n * animationFrame stacking on to of each other\n * for an imperative rendering, use canvas.renderAll\n * @private\n */\n renderAndReset() {\n this.nextRenderHandle = 0;\n this.renderAll();\n }\n\n /**\n * Append a renderAll request to next animation frame.\n * unless one is already in progress, in that case nothing is done\n * a boolean flag will avoid appending more.\n */\n requestRenderAll() {\n if (!this.nextRenderHandle && !this.disposed && !this.destroyed) {\n this.nextRenderHandle = requestAnimFrame(() => this.renderAndReset());\n }\n }\n\n /**\n * Calculate the position of the 4 corner of canvas with current viewportTransform.\n * helps to determinate when an object is in the current rendering viewport\n */\n calcViewportBoundaries(): TCornerPoint {\n const width = this.width,\n height = this.height,\n iVpt = invertTransform(this.viewportTransform),\n a = transformPoint({ x: 0, y: 0 }, iVpt),\n b = transformPoint({ x: width, y: height }, iVpt),\n // we don't support vpt flipping\n // but the code is robust enough to mostly work with flipping\n min = a.min(b),\n max = a.max(b);\n return (this.vptCoords = {\n tl: min,\n tr: new Point(max.x, min.y),\n bl: new Point(min.x, max.y),\n br: max,\n });\n }\n\n cancelRequestedRender() {\n if (this.nextRenderHandle) {\n cancelAnimFrame(this.nextRenderHandle);\n this.nextRenderHandle = 0;\n }\n }\n\n drawControls(_ctx: CanvasRenderingContext2D) {\n // Static canvas has no controls\n }\n\n /**\n * Renders background, objects, overlay and controls.\n * @param {CanvasRenderingContext2D} ctx\n * @param {Array} objects to render\n */\n renderCanvas(ctx: CanvasRenderingContext2D, objects: FabricObject[]) {\n if (this.destroyed) {\n return;\n }\n\n const v = this.viewportTransform,\n path = this.clipPath;\n this.calcViewportBoundaries();\n this.clearContext(ctx);\n ctx.imageSmoothingEnabled = this.imageSmoothingEnabled;\n // @ts-expect-error node-canvas stuff\n ctx.patternQuality = 'best';\n this.fire('before:render', { ctx });\n this._renderBackground(ctx);\n\n ctx.save();\n //apply viewport transform once for all rendering process\n ctx.transform(v[0], v[1], v[2], v[3], v[4], v[5]);\n this._renderObjects(ctx, objects);\n ctx.restore();\n if (!this.controlsAboveOverlay && !this.skipControlsDrawing) {\n this.drawControls(ctx);\n }\n if (path) {\n path._set('canvas', this);\n // needed to setup a couple of variables\n // todo migrate to the newer one\n path.shouldCache();\n path._transformDone = true;\n (path as TCachedFabricObject).renderCache({ forClipping: true });\n this.drawClipPathOnCanvas(ctx, path as TCachedFabricObject);\n }\n this._renderOverlay(ctx);\n if (this.controlsAboveOverlay && !this.skipControlsDrawing) {\n this.drawControls(ctx);\n }\n this.fire('after:render', { ctx });\n\n if (this.__cleanupTask) {\n this.__cleanupTask();\n this.__cleanupTask = undefined;\n }\n }\n\n /**\n * Paint the cached clipPath on the lowerCanvasEl\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n drawClipPathOnCanvas(\n ctx: CanvasRenderingContext2D,\n clipPath: TCachedFabricObject,\n ) {\n const v = this.viewportTransform;\n ctx.save();\n ctx.transform(...v);\n // DEBUG: uncomment this line, comment the following\n // ctx.globalAlpha = 0.4;\n ctx.globalCompositeOperation = 'destination-in';\n clipPath.transform(ctx);\n ctx.scale(1 / clipPath.zoomX, 1 / clipPath.zoomY);\n ctx.drawImage(\n clipPath._cacheCanvas,\n -clipPath.cacheTranslationX,\n -clipPath.cacheTranslationY,\n );\n ctx.restore();\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n * @param {Array} objects to render\n */\n _renderObjects(ctx: CanvasRenderingContext2D, objects: FabricObject[]) {\n for (let i = 0, len = objects.length; i < len; ++i) {\n objects[i] && objects[i].render(ctx);\n }\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n * @param {string} property 'background' or 'overlay'\n */\n _renderBackgroundOrOverlay(\n ctx: CanvasRenderingContext2D,\n property: 'background' | 'overlay',\n ) {\n const fill = this[`${property}Color`],\n object = this[`${property}Image`],\n v = this.viewportTransform,\n needsVpt = this[`${property}Vpt`];\n if (!fill && !object) {\n return;\n }\n const isAFiller = isFiller(fill);\n if (fill) {\n ctx.save();\n ctx.beginPath();\n ctx.moveTo(0, 0);\n ctx.lineTo(this.width, 0);\n ctx.lineTo(this.width, this.height);\n ctx.lineTo(0, this.height);\n ctx.closePath();\n ctx.fillStyle = isAFiller ? fill.toLive(ctx /* this */)! : fill;\n if (needsVpt) {\n ctx.transform(...v);\n }\n if (isAFiller) {\n ctx.transform(1, 0, 0, 1, fill.offsetX || 0, fill.offsetY || 0);\n const m = ((fill as Gradient<'linear'>).gradientTransform ||\n (fill as Pattern).patternTransform) as TMat2D;\n m && ctx.transform(...m);\n }\n ctx.fill();\n ctx.restore();\n }\n if (object) {\n ctx.save();\n const { skipOffscreen } = this;\n // if the object doesn't move with the viewport,\n // the offscreen concept does not apply;\n this.skipOffscreen = needsVpt;\n if (needsVpt) {\n ctx.transform(...v);\n }\n object.render(ctx);\n this.skipOffscreen = skipOffscreen;\n ctx.restore();\n }\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _renderBackground(ctx: CanvasRenderingContext2D) {\n this._renderBackgroundOrOverlay(ctx, 'background');\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _renderOverlay(ctx: CanvasRenderingContext2D) {\n this._renderBackgroundOrOverlay(ctx, 'overlay');\n }\n\n /**\n * Returns coordinates of a center of canvas.\n * @return {Point}\n */\n getCenterPoint() {\n return new Point(this.width / 2, this.height / 2);\n }\n\n /**\n * Centers object horizontally in the canvas\n */\n centerObjectH(object: FabricObject) {\n return this._centerObject(\n object,\n new Point(this.getCenterPoint().x, object.getCenterPoint().y),\n );\n }\n\n /**\n * Centers object vertically in the canvas\n * @param {FabricObject} object Object to center vertically\n */\n centerObjectV(object: FabricObject) {\n return this._centerObject(\n object,\n new Point(object.getCenterPoint().x, this.getCenterPoint().y),\n );\n }\n\n /**\n * Centers object vertically and horizontally in the canvas\n * @param {FabricObject} object Object to center vertically and horizontally\n */\n centerObject(object: FabricObject) {\n return this._centerObject(object, this.getCenterPoint());\n }\n\n /**\n * Centers object vertically and horizontally in the viewport\n * @param {FabricObject} object Object to center vertically and horizontally\n */\n viewportCenterObject(object: FabricObject) {\n return this._centerObject(object, this.getVpCenter());\n }\n\n /**\n * Centers object horizontally in the viewport, object.top is unchanged\n * @param {FabricObject} object Object to center vertically and horizontally\n */\n viewportCenterObjectH(object: FabricObject) {\n return this._centerObject(\n object,\n new Point(this.getVpCenter().x, object.getCenterPoint().y),\n );\n }\n\n /**\n * Centers object Vertically in the viewport, object.top is unchanged\n * @param {FabricObject} object Object to center vertically and horizontally\n */\n viewportCenterObjectV(object: FabricObject) {\n return this._centerObject(\n object,\n new Point(object.getCenterPoint().x, this.getVpCenter().y),\n );\n }\n\n /**\n * Calculate the point in canvas that correspond to the center of actual viewport.\n * @return {Point} vpCenter, viewport center\n */\n getVpCenter(): Point {\n return transformPoint(\n this.getCenterPoint(),\n invertTransform(this.viewportTransform),\n );\n }\n\n /**\n * @private\n * @param {FabricObject} object Object to center\n * @param {Point} center Center point\n */\n _centerObject(object: FabricObject, center: Point) {\n object.setXY(center, CENTER, CENTER);\n object.setCoords();\n this.renderOnAddRemove && this.requestRenderAll();\n }\n\n /**\n * Returns dataless JSON representation of canvas\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {String} json string\n */\n toDatalessJSON(propertiesToInclude?: string[]) {\n return this.toDatalessObject(propertiesToInclude);\n }\n\n /**\n * Returns object representation of canvas\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} object representation of an instance\n */\n toObject(propertiesToInclude?: string[]) {\n return this._toObjectMethod('toObject', propertiesToInclude);\n }\n\n /**\n * Returns Object representation of canvas\n * this alias is provided because if you call JSON.stringify on an instance,\n * the toJSON object will be invoked if it exists.\n * Having a toJSON method means you can do JSON.stringify(myCanvas)\n * JSON does not support additional properties because toJSON has its own signature\n * @return {Object} JSON compatible object\n * @see {@link http://fabric5.fabricjs.com/fabric-intro-part-3#serialization}\n * @see {@link http://jsfiddle.net/fabricjs/pec86/|jsFiddle demo}\n * @example JSON representation of canvas \n * const json = canvas.toJSON();\n * @example JSON representation of canvas \n * const json = JSON.stringify(canvas);\n */\n toJSON() {\n return this.toObject();\n }\n\n /**\n * Returns dataless object representation of canvas\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} object representation of an instance\n */\n toDatalessObject(propertiesToInclude?: string[]) {\n return this._toObjectMethod('toDatalessObject', propertiesToInclude);\n }\n\n /**\n * @private\n */\n _toObjectMethod(\n methodName: TValidToObjectMethod,\n propertiesToInclude?: string[],\n ) {\n const clipPath = this.clipPath;\n const clipPathData =\n clipPath && !clipPath.excludeFromExport\n ? this._toObject(clipPath, methodName, propertiesToInclude)\n : null;\n return {\n version: VERSION,\n ...pick(this, propertiesToInclude as (keyof this)[]),\n objects: this._objects\n .filter((object) => !object.excludeFromExport)\n .map((instance) =>\n this._toObject(instance, methodName, propertiesToInclude),\n ),\n ...this.__serializeBgOverlay(methodName, propertiesToInclude),\n ...(clipPathData ? { clipPath: clipPathData } : null),\n };\n }\n\n /**\n * @private\n */\n protected _toObject(\n instance: FabricObject,\n methodName: TValidToObjectMethod,\n propertiesToInclude?: string[],\n ) {\n let originalValue;\n\n if (!this.includeDefaultValues) {\n originalValue = instance.includeDefaultValues;\n instance.includeDefaultValues = false;\n }\n\n const object = instance[methodName](propertiesToInclude);\n if (!this.includeDefaultValues) {\n instance.includeDefaultValues = !!originalValue;\n }\n return object;\n }\n\n /**\n * @private\n */\n __serializeBgOverlay(\n methodName: TValidToObjectMethod,\n propertiesToInclude?: string[],\n ) {\n const data: any = {},\n bgImage = this.backgroundImage,\n overlayImage = this.overlayImage,\n bgColor = this.backgroundColor,\n overlayColor = this.overlayColor;\n\n if (isFiller(bgColor)) {\n if (!bgColor.excludeFromExport) {\n data.background = bgColor.toObject(propertiesToInclude);\n }\n } else if (bgColor) {\n data.background = bgColor;\n }\n\n if (isFiller(overlayColor)) {\n if (!overlayColor.excludeFromExport) {\n data.overlay = overlayColor.toObject(propertiesToInclude);\n }\n } else if (overlayColor) {\n data.overlay = overlayColor;\n }\n\n if (bgImage && !bgImage.excludeFromExport) {\n data.backgroundImage = this._toObject(\n bgImage,\n methodName,\n propertiesToInclude,\n );\n }\n if (overlayImage && !overlayImage.excludeFromExport) {\n data.overlayImage = this._toObject(\n overlayImage,\n methodName,\n propertiesToInclude,\n );\n }\n\n return data;\n }\n\n /* _TO_SVG_START_ */\n\n declare svgViewportTransformation: boolean;\n\n /**\n * Returns SVG representation of canvas\n * @param {Object} [options] Options object for SVG output\n * @param {Boolean} [options.suppressPreamble=false] If true xml tag is not included\n * @param {Object} [options.viewBox] SVG viewbox object\n * @param {Number} [options.viewBox.x] x-coordinate of viewbox\n * @param {Number} [options.viewBox.y] y-coordinate of viewbox\n * @param {Number} [options.viewBox.width] Width of viewbox\n * @param {Number} [options.viewBox.height] Height of viewbox\n * @param {String} [options.encoding=UTF-8] Encoding of SVG output\n * @param {String} [options.width] desired width of svg with or without units\n * @param {String} [options.height] desired height of svg with or without units\n * @param {Function} [reviver] Method for further parsing of svg elements, called after each fabric object converted into svg representation.\n * @return {String} SVG string\n * @see {@link http://fabric5.fabricjs.com/fabric-intro-part-3#serialization}\n * @see {@link http://jsfiddle.net/fabricjs/jQ3ZZ/|jsFiddle demo}\n * @example Normal SVG output\n * var svg = canvas.toSVG();\n * @example SVG output without preamble (without <?xml ../>)\n * var svg = canvas.toSVG({suppressPreamble: true});\n * @example SVG output with viewBox attribute\n * var svg = canvas.toSVG({\n * viewBox: {\n * x: 100,\n * y: 100,\n * width: 200,\n * height: 300\n * }\n * });\n * @example SVG output with different encoding (default: UTF-8)\n * var svg = canvas.toSVG({encoding: 'ISO-8859-1'});\n * @example Modify SVG output with reviver function\n * var svg = canvas.toSVG(null, function(svg) {\n * return svg.replace('stroke-dasharray: ; stroke-linecap: butt; stroke-linejoin: miter; stroke-miterlimit: 10; ', '');\n * });\n */\n toSVG(options: TSVGExportOptions = {}, reviver?: TSVGReviver) {\n options.reviver = reviver;\n const markup: string[] = [];\n\n this._setSVGPreamble(markup, options);\n this._setSVGHeader(markup, options);\n if (this.clipPath) {\n markup.push(`\\n`);\n }\n this._setSVGBgOverlayColor(markup, 'background');\n this._setSVGBgOverlayImage(markup, 'backgroundImage', reviver);\n this._setSVGObjects(markup, reviver);\n if (this.clipPath) {\n markup.push('\\n');\n }\n this._setSVGBgOverlayColor(markup, 'overlay');\n this._setSVGBgOverlayImage(markup, 'overlayImage', reviver);\n\n markup.push('');\n\n return markup.join('');\n }\n\n /**\n * @private\n */\n _setSVGPreamble(markup: string[], options: TSVGExportOptions): void {\n if (options.suppressPreamble) {\n return;\n }\n markup.push(\n '\\n',\n '\\n',\n );\n }\n\n /**\n * @private\n */\n _setSVGHeader(markup: string[], options: TSVGExportOptions): void {\n const width = options.width || `${this.width}`,\n height = options.height || `${this.height}`,\n NUM_FRACTION_DIGITS = config.NUM_FRACTION_DIGITS,\n optViewBox = options.viewBox;\n let viewBox: string;\n if (optViewBox) {\n viewBox = `viewBox=\"${optViewBox.x} ${optViewBox.y} ${optViewBox.width} ${optViewBox.height}\" `;\n } else if (this.svgViewportTransformation) {\n const vpt = this.viewportTransform;\n viewBox = `viewBox=\"${toFixed(\n -vpt[4] / vpt[0],\n NUM_FRACTION_DIGITS,\n )} ${toFixed(-vpt[5] / vpt[3], NUM_FRACTION_DIGITS)} ${toFixed(\n this.width / vpt[0],\n NUM_FRACTION_DIGITS,\n )} ${toFixed(this.height / vpt[3], NUM_FRACTION_DIGITS)}\" `;\n } else {\n viewBox = `viewBox=\"0 0 ${this.width} ${this.height}\" `;\n }\n\n markup.push(\n '\\n',\n 'Created with Fabric.js ',\n VERSION,\n '\\n',\n '\\n',\n this.createSVGFontFacesMarkup(),\n this.createSVGRefElementsMarkup(),\n this.createSVGClipPathMarkup(options),\n '\\n',\n );\n }\n\n createSVGClipPathMarkup(options: TSVGExportOptions): string {\n const clipPath = this.clipPath;\n if (clipPath) {\n clipPath.clipPathId = `CLIPPATH_${uid()}`;\n return `\\n${clipPath.toClipPathSVG(\n options.reviver,\n )}\\n`;\n }\n return '';\n }\n\n /**\n * Creates markup containing SVG referenced elements like patterns, gradients etc.\n * @return {String}\n */\n createSVGRefElementsMarkup(): string {\n return (['background', 'overlay'] as const)\n .map((prop) => {\n const fill = this[`${prop}Color`];\n if (isFiller(fill)) {\n const shouldTransform = this[`${prop}Vpt`],\n vpt = this.viewportTransform,\n object = {\n // otherwise circular dependency\n isType: () => false,\n width: this.width / (shouldTransform ? vpt[0] : 1),\n height: this.height / (shouldTransform ? vpt[3] : 1),\n };\n return fill.toSVG(object as FabricObject, {\n additionalTransform: shouldTransform ? matrixToSVG(vpt) : '',\n });\n }\n })\n .join('');\n }\n\n /**\n * Creates markup containing SVG font faces,\n * font URLs for font faces must be collected by developers\n * and are not extracted from the DOM by fabricjs\n * @param {Array} objects Array of fabric objects\n * @return {String}\n */\n createSVGFontFacesMarkup(): string {\n const objects: FabricObject[] = [],\n fontList: Record = {},\n fontPaths = config.fontPaths;\n\n this._objects.forEach(function add(object) {\n objects.push(object);\n if (isCollection(object)) {\n object._objects.forEach(add);\n }\n });\n\n objects.forEach((obj) => {\n if (!isTextObject(obj)) {\n return;\n }\n const { styles, fontFamily } = obj;\n if (fontList[fontFamily] || !fontPaths[fontFamily]) {\n return;\n }\n fontList[fontFamily] = true;\n if (!styles) {\n return;\n }\n Object.values(styles).forEach((styleRow) => {\n Object.values(styleRow).forEach(({ fontFamily = '' }) => {\n if (!fontList[fontFamily] && fontPaths[fontFamily]) {\n fontList[fontFamily] = true;\n }\n });\n });\n });\n\n const fontListMarkup = Object.keys(fontList)\n .map(\n (fontFamily) =>\n `\\t\\t@font-face {\\n\\t\\t\\tfont-family: '${fontFamily}';\\n\\t\\t\\tsrc: url('${fontPaths[fontFamily]}');\\n\\t\\t}\\n`,\n )\n .join('');\n\n if (fontListMarkup) {\n return `\\t\\n`;\n }\n return '';\n }\n\n /**\n * @private\n */\n _setSVGObjects(markup: string[], reviver?: TSVGReviver) {\n this.forEachObject((fabricObject) => {\n if (fabricObject.excludeFromExport) {\n return;\n }\n this._setSVGObject(markup, fabricObject, reviver);\n });\n }\n\n /**\n * This is its own function because the Canvas ( non static ) requires extra code here\n * @private\n */\n _setSVGObject(\n markup: string[],\n instance: FabricObject,\n reviver?: TSVGReviver,\n ) {\n markup.push(instance.toSVG(reviver));\n }\n\n /**\n * @private\n */\n _setSVGBgOverlayImage(\n markup: string[],\n property: 'overlayImage' | 'backgroundImage',\n reviver?: TSVGReviver,\n ) {\n const bgOrOverlay = this[property];\n if (bgOrOverlay && !bgOrOverlay.excludeFromExport && bgOrOverlay.toSVG) {\n markup.push(bgOrOverlay.toSVG(reviver));\n }\n }\n\n /**\n * @TODO this seems to handle patterns but fail at gradients.\n * @private\n */\n _setSVGBgOverlayColor(markup: string[], property: 'background' | 'overlay') {\n const filler = this[`${property}Color`];\n if (!filler) {\n return;\n }\n if (isFiller(filler)) {\n const repeat = (filler as Pattern).repeat || '',\n finalWidth = this.width,\n finalHeight = this.height,\n shouldInvert = this[`${property}Vpt`],\n additionalTransform = shouldInvert\n ? matrixToSVG(invertTransform(this.viewportTransform))\n : '';\n markup.push(\n `\\n`,\n );\n } else {\n markup.push(\n '\\n',\n );\n }\n }\n /* _TO_SVG_END_ */\n\n /**\n * Populates canvas with data from the specified JSON.\n * JSON format must conform to the one of {@link fabric.Canvas#toJSON}\n *\n * **IMPORTANT**: It is recommended to abort loading tasks before calling this method to prevent race conditions and unnecessary networking\n *\n * @param {String|Object} json JSON string or object\n * @param {Function} [reviver] Method for further parsing of JSON elements, called after each fabric object created.\n * @param {Object} [options] options\n * @param {AbortSignal} [options.signal] see https://developer.mozilla.org/en-US/docs/Web/API/AbortController/signal\n * @return {Promise} instance\n * @see {@link http://fabric5.fabricjs.com/fabric-intro-part-3#deserialization}\n * @see {@link http://jsfiddle.net/fabricjs/fmgXt/|jsFiddle demo}\n * @example loadFromJSON\n * canvas.loadFromJSON(json).then((canvas) => canvas.requestRenderAll());\n * @example loadFromJSON with reviver\n * canvas.loadFromJSON(json, function(o, object) {\n * // `o` = json object\n * // `object` = fabric.Object instance\n * // ... do some stuff ...\n * }).then((canvas) => {\n * ... canvas is restored, add your code.\n * });\n *\n */\n loadFromJSON(\n json: string | Record,\n reviver?: EnlivenObjectOptions['reviver'],\n { signal }: Abortable = {},\n ): Promise {\n if (!json) {\n return Promise.reject(new FabricError('`json` is undefined'));\n }\n\n // parse json if it wasn't already\n const { objects = [], ...serialized } =\n typeof json === 'string' ? JSON.parse(json) : json;\n const { backgroundImage, background, overlayImage, overlay, clipPath } =\n serialized;\n const renderOnAddRemove = this.renderOnAddRemove;\n this.renderOnAddRemove = false;\n\n return Promise.all([\n enlivenObjects(objects, {\n reviver,\n signal,\n }),\n enlivenObjectEnlivables(\n {\n backgroundImage,\n backgroundColor: background,\n overlayImage,\n overlayColor: overlay,\n clipPath,\n },\n { signal },\n ),\n ]).then(([enlived, enlivedMap]) => {\n this.clear();\n this.add(...enlived);\n this.set(serialized);\n this.set(enlivedMap);\n this.renderOnAddRemove = renderOnAddRemove;\n return this;\n });\n }\n\n /**\n * Clones canvas instance\n * @param {string[]} [properties] Array of properties to include in the cloned canvas and children\n */\n clone(properties: string[]) {\n const data = this.toObject(properties);\n const canvas = this.cloneWithoutData();\n return canvas.loadFromJSON(data);\n }\n\n /**\n * Clones canvas instance without cloning existing data.\n * This essentially copies canvas dimensions since loadFromJSON does not affect canvas size.\n */\n cloneWithoutData() {\n const el = createCanvasElementFor(this);\n return new (this.constructor as Constructor)(el);\n }\n\n /**\n * Exports canvas element to a dataurl image. Note that when multiplier is used, cropping is scaled appropriately\n * @param {Object} [options] Options object\n * @param {String} [options.format=png] The format of the output image. Either \"jpeg\" or \"png\"\n * @param {Number} [options.quality=1] Quality level (0..1). Only used for jpeg.\n * @param {Number} [options.multiplier=1] Multiplier to scale by, to have consistent\n * @param {Number} [options.left] Cropping left offset. Introduced in v1.2.14\n * @param {Number} [options.top] Cropping top offset. Introduced in v1.2.14\n * @param {Number} [options.width] Cropping width. Introduced in v1.2.14\n * @param {Number} [options.height] Cropping height. Introduced in v1.2.14\n * @param {Boolean} [options.enableRetinaScaling] Enable retina scaling for clone image. Introduce in 2.0.0\n * @param {(object: fabric.Object) => boolean} [options.filter] Function to filter objects.\n * @return {String} Returns a data: URL containing a representation of the object in the format specified by options.format\n * @see {@link https://jsfiddle.net/xsjua1rd/ demo}\n * @example Generate jpeg dataURL with lower quality\n * var dataURL = canvas.toDataURL({\n * format: 'jpeg',\n * quality: 0.8\n * });\n * @example Generate cropped png dataURL (clipping of canvas)\n * var dataURL = canvas.toDataURL({\n * format: 'png',\n * left: 100,\n * top: 100,\n * width: 200,\n * height: 200\n * });\n * @example Generate double scaled png dataURL\n * var dataURL = canvas.toDataURL({\n * format: 'png',\n * multiplier: 2\n * });\n * @example Generate dataURL with objects that overlap a specified object\n * var myObject;\n * var dataURL = canvas.toDataURL({\n * filter: (object) => object.isContainedWithinObject(myObject) || object.intersectsWithObject(myObject)\n * });\n */\n toDataURL(options = {} as TDataUrlOptions): string {\n const {\n format = 'png',\n quality = 1,\n multiplier = 1,\n enableRetinaScaling = false,\n } = options;\n const finalMultiplier =\n multiplier * (enableRetinaScaling ? this.getRetinaScaling() : 1);\n\n return toDataURL(\n this.toCanvasElement(finalMultiplier, options),\n format,\n quality,\n );\n }\n toBlob(options = {} as TDataUrlOptions): Promise {\n const {\n format = 'png',\n quality = 1,\n multiplier = 1,\n enableRetinaScaling = false,\n } = options;\n const finalMultiplier =\n multiplier * (enableRetinaScaling ? this.getRetinaScaling() : 1);\n\n return toBlob(\n this.toCanvasElement(finalMultiplier, options),\n format,\n quality,\n );\n }\n\n /**\n * Create a new HTMLCanvas element painted with the current canvas content.\n * No need to resize the actual one or repaint it.\n * Will transfer object ownership to a new canvas, paint it, and set everything back.\n * This is an intermediary step used to get to a dataUrl but also it is useful to\n * create quick image copies of a canvas without passing for the dataUrl string\n * @param {Number} [multiplier] a zoom factor.\n * @param {Object} [options] Cropping informations\n * @param {Number} [options.left] Cropping left offset.\n * @param {Number} [options.top] Cropping top offset.\n * @param {Number} [options.width] Cropping width.\n * @param {Number} [options.height] Cropping height.\n * @param {(object: fabric.Object) => boolean} [options.filter] Function to filter objects.\n */\n toCanvasElement(\n multiplier = 1,\n { width, height, left, top, filter } = {} as TToCanvasElementOptions,\n ): HTMLCanvasElement {\n const scaledWidth = (width || this.width) * multiplier,\n scaledHeight = (height || this.height) * multiplier,\n zoom = this.getZoom(),\n originalWidth = this.width,\n originalHeight = this.height,\n originalSkipControlsDrawing = this.skipControlsDrawing,\n newZoom = zoom * multiplier,\n vp = this.viewportTransform,\n translateX = (vp[4] - (left || 0)) * multiplier,\n translateY = (vp[5] - (top || 0)) * multiplier,\n newVp = [newZoom, 0, 0, newZoom, translateX, translateY] as TMat2D,\n originalRetina = this.enableRetinaScaling,\n canvasEl = createCanvasElementFor({\n width: scaledWidth,\n height: scaledHeight,\n }),\n objectsToRender = filter\n ? this._objects.filter((obj) => filter(obj))\n : this._objects;\n this.enableRetinaScaling = false;\n this.viewportTransform = newVp;\n this.width = scaledWidth;\n this.height = scaledHeight;\n this.skipControlsDrawing = true;\n this.calcViewportBoundaries();\n this.renderCanvas(canvasEl.getContext('2d')!, objectsToRender);\n this.viewportTransform = vp;\n this.width = originalWidth;\n this.height = originalHeight;\n this.calcViewportBoundaries();\n this.enableRetinaScaling = originalRetina;\n this.skipControlsDrawing = originalSkipControlsDrawing;\n return canvasEl;\n }\n\n /**\n * Waits until rendering has settled to destroy the canvas\n * @returns {Promise} a promise resolving to `true` once the canvas has been destroyed or to `false` if the canvas has was already destroyed\n * @throws if aborted by a consequent call\n */\n dispose() {\n !this.disposed &&\n this.elements.cleanupDOM({ width: this.width, height: this.height });\n runningAnimations.cancelByCanvas(this);\n this.disposed = true;\n return new Promise((resolve, reject) => {\n const task = () => {\n this.destroy();\n resolve(true);\n };\n task.kill = reject;\n if (this.__cleanupTask) {\n this.__cleanupTask.kill('aborted');\n }\n\n if (this.destroyed) {\n resolve(false);\n } else if (this.nextRenderHandle) {\n this.__cleanupTask = task;\n } else {\n task();\n }\n });\n }\n\n /**\n * Clears the canvas element, disposes objects and frees resources.\n *\n * Invoked as part of the **async** operation of {@link dispose}.\n *\n * **CAUTION**:\n *\n * This method is **UNSAFE**.\n * You may encounter a race condition using it if there's a requested render.\n * Call this method only if you are sure rendering has settled.\n * Consider using {@link dispose} as it is **SAFE**\n *\n * @private\n */\n destroy() {\n this.destroyed = true;\n this.cancelRequestedRender();\n this.forEachObject((object) => object.dispose());\n this._objects = [];\n if (this.backgroundImage) {\n this.backgroundImage.dispose();\n }\n this.backgroundImage = undefined;\n if (this.overlayImage) {\n this.overlayImage.dispose();\n }\n this.overlayImage = undefined;\n this.elements.dispose();\n }\n\n /**\n * Returns a string representation of an instance\n * @return {String} string representation of an instance\n */\n toString() {\n return `#`;\n }\n}\n","import type { TPointerEvent } from '../EventTypeDefs';\nimport { Point } from '../Point';\nimport { getScrollLeftTop } from './dom_misc';\n\nconst touchEvents = ['touchstart', 'touchmove', 'touchend'];\n\nfunction getTouchInfo(event: TouchEvent | MouseEvent): MouseEvent | Touch {\n const touchProp = (event as TouchEvent).changedTouches;\n if (touchProp && touchProp[0]) {\n return touchProp[0];\n }\n return event as MouseEvent;\n}\n\nexport const getPointer = (event: TPointerEvent): Point => {\n const element = event.target as HTMLElement,\n scroll = getScrollLeftTop(element),\n _evt = getTouchInfo(event);\n return new Point(_evt.clientX + scroll.left, _evt.clientY + scroll.top);\n};\n\nexport const isTouchEvent = (event: TPointerEvent) =>\n touchEvents.includes(event.type) ||\n (event as PointerEvent).pointerType === 'touch';\n\nexport const stopEvent = (e: Event) => {\n e.preventDefault();\n e.stopPropagation();\n};\n","import type { XY } from '../../Point';\nimport type { TBBox } from '../../typedefs';\n\n/**\n * Calculates bounding box (left, top, width, height) from given `points`\n * @param {XY[]} points\n * @return {Object} Object with left, top, width, height properties\n */\nexport const makeBoundingBoxFromPoints = (points: XY[]): TBBox => {\n let left = 0,\n top = 0,\n width = 0,\n height = 0;\n\n for (let i = 0, len = points.length; i < len; i++) {\n const { x, y } = points[i];\n if (x > width || !i) width = x;\n if (x < left || !i) left = x;\n if (y > height || !i) height = y;\n if (y < top || !i) top = y;\n }\n\n return {\n left,\n top,\n width: width - left,\n height: height - top,\n };\n};\n","import { Point } from '../../Point';\nimport { CENTER } from '../../constants';\nimport type { FabricObject } from '../../shapes/Object/Object';\nimport type { TMat2D } from '../../typedefs';\nimport { makeBoundingBoxFromPoints } from './boundingBoxFromPoints';\nimport {\n invertTransform,\n multiplyTransformMatrices,\n qrDecompose,\n} from './matrix';\n\n/**\n * given an object and a transform, apply the inverse transform to the object,\n * this is equivalent to remove from that object that transformation, so that\n * added in a space with the removed transform, the object will be the same as before.\n * Removing from an object a transform that scale by 2 is like scaling it by 1/2.\n * Removing from an object a transform that rotate by 30deg is like rotating by 30deg\n * in the opposite direction.\n * This util is used to add objects inside transformed groups or nested groups.\n * @param {FabricObject} object the object you want to transform\n * @param {TMat2D} transform the destination transform\n */\nexport const removeTransformFromObject = (\n object: FabricObject,\n transform: TMat2D,\n) => {\n const inverted = invertTransform(transform),\n finalTransform = multiplyTransformMatrices(\n inverted,\n object.calcOwnMatrix(),\n );\n applyTransformToObject(object, finalTransform);\n};\n\n/**\n * given an object and a transform, apply the transform to the object.\n * this is equivalent to change the space where the object is drawn.\n * Adding to an object a transform that scale by 2 is like scaling it by 2.\n * This is used when removing an object from an active selection for example.\n * @param {FabricObject} object the object you want to transform\n * @param {Array} transform the destination transform\n */\nexport const addTransformToObject = (object: FabricObject, transform: TMat2D) =>\n applyTransformToObject(\n object,\n multiplyTransformMatrices(transform, object.calcOwnMatrix()),\n );\n\n/**\n * discard an object transform state and apply the one from the matrix.\n * @param {FabricObject} object the object you want to transform\n * @param {Array} transform the destination transform\n */\nexport const applyTransformToObject = (\n object: FabricObject,\n transform: TMat2D,\n) => {\n const { translateX, translateY, scaleX, scaleY, ...otherOptions } =\n qrDecompose(transform),\n center = new Point(translateX, translateY);\n object.flipX = false;\n object.flipY = false;\n Object.assign(object, otherOptions);\n object.set({ scaleX, scaleY });\n object.setPositionByOrigin(center, CENTER, CENTER);\n};\n/**\n * reset an object transform state to neutral. Top and left are not accounted for\n * @param {FabricObject} target object to transform\n */\nexport const resetObjectTransform = (target: FabricObject) => {\n target.scaleX = 1;\n target.scaleY = 1;\n target.skewX = 0;\n target.skewY = 0;\n target.flipX = false;\n target.flipY = false;\n target.rotate(0);\n};\n\n/**\n * Extract Object transform values\n * @param {FabricObject} target object to read from\n * @return {Object} Components of transform\n */\nexport const saveObjectTransform = (target: FabricObject) => ({\n scaleX: target.scaleX,\n scaleY: target.scaleY,\n skewX: target.skewX,\n skewY: target.skewY,\n angle: target.angle,\n left: target.left,\n flipX: target.flipX,\n flipY: target.flipY,\n top: target.top,\n});\n\n/**\n * given a width and height, return the size of the bounding box\n * that can contains the box with width/height with applied transform.\n * Use to calculate the boxes around objects for controls.\n * @param {Number} width\n * @param {Number} height\n * @param {TMat2D} t\n * @returns {Point} size\n */\nexport const sizeAfterTransform = (\n width: number,\n height: number,\n t: TMat2D,\n) => {\n const dimX = width / 2,\n dimY = height / 2,\n points = [\n new Point(-dimX, -dimY),\n new Point(dimX, -dimY),\n new Point(-dimX, dimY),\n new Point(dimX, dimY),\n ].map((p) => p.transform(t)),\n bbox = makeBoundingBoxFromPoints(points);\n return new Point(bbox.width, bbox.height);\n};\n","import { iMatrix } from '../../constants';\nimport type { Point } from '../../Point';\nimport type { FabricObject } from '../../shapes/Object/Object';\nimport type { TMat2D } from '../../typedefs';\nimport { invertTransform, multiplyTransformMatrices } from './matrix';\nimport { applyTransformToObject } from './objectTransforms';\n\n/**\n * We are actually looking for the transformation from the destination plane to the source plane (change of basis matrix)\\\n * The object will exist on the destination plane and we want it to seem unchanged by it so we invert the destination matrix (`to`) and then apply the source matrix (`from`)\n * @param [from]\n * @param [to]\n * @returns\n */\nexport const calcPlaneChangeMatrix = (\n from: TMat2D = iMatrix,\n to: TMat2D = iMatrix,\n) => multiplyTransformMatrices(invertTransform(to), from);\n\n/**\n * Sends a point from the source coordinate plane to the destination coordinate plane.\\\n * From the canvas/viewer's perspective the point remains unchanged.\n *\n * @example Send point from canvas plane to group plane\n * var obj = new Rect({ left: 20, top: 20, width: 60, height: 60, strokeWidth: 0 });\n * var group = new Group([obj], { strokeWidth: 0 });\n * var sentPoint1 = sendPointToPlane(new Point(50, 50), undefined, group.calcTransformMatrix());\n * var sentPoint2 = sendPointToPlane(new Point(50, 50), iMatrix, group.calcTransformMatrix());\n * console.log(sentPoint1, sentPoint2) // both points print (0,0) which is the center of group\n *\n * @param {Point} point\n * @param {TMat2D} [from] plane matrix containing object. Passing `undefined` is equivalent to passing the identity matrix, which means `point` exists in the canvas coordinate plane.\n * @param {TMat2D} [to] destination plane matrix to contain object. Passing `undefined` means `point` should be sent to the canvas coordinate plane.\n * @returns {Point} transformed point\n */\nexport const sendPointToPlane = (\n point: Point,\n from: TMat2D = iMatrix,\n to: TMat2D = iMatrix,\n): Point => point.transform(calcPlaneChangeMatrix(from, to));\n\n/**\n * See {@link sendPointToPlane}\n */\nexport const sendVectorToPlane = (\n point: Point,\n from: TMat2D = iMatrix,\n to: TMat2D = iMatrix,\n): Point => point.transform(calcPlaneChangeMatrix(from, to), true);\n\n/**\n *\n * A util that abstracts applying transform to objects.\\\n * Sends `object` to the destination coordinate plane by applying the relevant transformations.\\\n * Changes the space/plane where `object` is drawn.\\\n * From the canvas/viewer's perspective `object` remains unchanged.\n *\n * @example Move clip path from one object to another while preserving it's appearance as viewed by canvas/viewer\n * let obj, obj2;\n * let clipPath = new Circle({ radius: 50 });\n * obj.clipPath = clipPath;\n * // render\n * sendObjectToPlane(clipPath, obj.calcTransformMatrix(), obj2.calcTransformMatrix());\n * obj.clipPath = undefined;\n * obj2.clipPath = clipPath;\n * // render, clipPath now clips obj2 but seems unchanged from the eyes of the viewer\n *\n * @example Clip an object's clip path with an existing object\n * let obj, existingObj;\n * let clipPath = new Circle({ radius: 50 });\n * obj.clipPath = clipPath;\n * let transformTo = multiplyTransformMatrices(obj.calcTransformMatrix(), clipPath.calcTransformMatrix());\n * sendObjectToPlane(existingObj, existingObj.group?.calcTransformMatrix(), transformTo);\n * clipPath.clipPath = existingObj;\n *\n * @param {FabricObject} object\n * @param {Matrix} [from] plane matrix containing object. Passing `undefined` is equivalent to passing the identity matrix, which means `object` is a direct child of canvas.\n * @param {Matrix} [to] destination plane matrix to contain object. Passing `undefined` means `object` should be sent to the canvas coordinate plane.\n * @returns {Matrix} the transform matrix that was applied to `object`\n */\nexport const sendObjectToPlane = (\n object: FabricObject,\n from?: TMat2D,\n to?: TMat2D,\n): TMat2D => {\n const t = calcPlaneChangeMatrix(from, to);\n applyTransformToObject(\n object,\n multiplyTransformMatrices(t, object.calcOwnMatrix()),\n );\n return t;\n};\n","import type {\n ObjectModificationEvents,\n TModificationEvents,\n} from '../EventTypeDefs';\n\nexport const fireEvent = (\n eventName: TModificationEvents,\n options: ObjectModificationEvents[typeof eventName],\n) => {\n const {\n transform: { target },\n } = options;\n target.canvas?.fire(`object:${eventName}`, {\n ...options,\n target,\n });\n target.fire(eventName, options);\n};\n","import type { TOriginX, TOriginY } from '../../typedefs';\n\nconst originOffset = {\n left: -0.5,\n top: -0.5,\n center: 0,\n bottom: 0.5,\n right: 0.5,\n};\n/**\n * Resolves origin value relative to center\n * @private\n * @param {TOriginX | TOriginY} originValue originX / originY\n * @returns number\n */\n\nexport const resolveOrigin = (\n originValue: TOriginX | TOriginY | number,\n): number =>\n typeof originValue === 'string'\n ? originOffset[originValue]\n : originValue - 0.5;\n","import type { XY } from '../../Point';\nimport { Point } from '../../Point';\nimport type { TRadian } from '../../typedefs';\n\nconst unitVectorX = new Point(1, 0);\nconst zero = new Point();\n\n/**\n * Rotates `vector` with `radians`\n * @param {Point} vector The vector to rotate (x and y)\n * @param {Number} radians The radians of the angle for the rotation\n * @return {Point} The new rotated point\n */\nexport const rotateVector = (vector: Point, radians: TRadian) =>\n vector.rotate(radians);\n\n/**\n * Creates a vector from points represented as a point\n *\n * @param {Point} from\n * @param {Point} to\n * @returns {Point} vector\n */\nexport const createVector = (from: XY, to: XY): Point =>\n new Point(to).subtract(from);\n\n/**\n * return the magnitude of a vector\n * @return {number}\n */\nexport const magnitude = (point: Point) => point.distanceFrom(zero);\n\n/**\n * Calculates the angle between 2 vectors\n * @param {Point} a\n * @param {Point} b\n * @returns the angle in radians from `a` to `b`\n */\nexport const calcAngleBetweenVectors = (a: Point, b: Point): TRadian =>\n Math.atan2(crossProduct(a, b), dotProduct(a, b)) as TRadian;\n\n/**\n * Calculates the angle between the x axis and the vector\n * @param {Point} v\n * @returns the angle in radians of `v`\n */\nexport const calcVectorRotation = (v: Point) =>\n calcAngleBetweenVectors(unitVectorX, v);\n\n/**\n * @param {Point} v\n * @returns {Point} vector representing the unit vector pointing to the direction of `v`\n */\nexport const getUnitVector = (v: Point): Point =>\n v.eq(zero) ? v : v.scalarDivide(magnitude(v));\n\n/**\n * @param {Point} v\n * @param {Boolean} [counterClockwise] the direction of the orthogonal vector, defaults to `true`\n * @returns {Point} the unit orthogonal vector\n */\nexport const getOrthonormalVector = (\n v: Point,\n counterClockwise = true,\n): Point =>\n getUnitVector(new Point(-v.y, v.x).scalarMultiply(counterClockwise ? 1 : -1));\n\n/**\n * Cross product of two vectors in 2D\n * @param {Point} a\n * @param {Point} b\n * @returns {number} the magnitude of Z vector\n */\nexport const crossProduct = (a: Point, b: Point): number =>\n a.x * b.y - a.y * b.x;\n\n/**\n * Dot product of two vectors in 2D\n * @param {Point} a\n * @param {Point} b\n * @returns {number}\n */\nexport const dotProduct = (a: Point, b: Point): number => a.x * b.x + a.y * b.y;\n\n/**\n * Checks if the vector is between two others. It is considered\n * to be inside when the vector to be tested is between the\n * initial vector and the final vector (included) in a counterclockwise direction.\n * @param {Point} t vector to be tested\n * @param {Point} a initial vector\n * @param {Point} b final vector\n * @returns {boolean} true if the vector is among the others\n */\nexport const isBetweenVectors = (t: Point, a: Point, b: Point): boolean => {\n if (t.eq(a) || t.eq(b)) return true;\n const AxB = crossProduct(a, b),\n AxT = crossProduct(a, t),\n BxT = crossProduct(b, t);\n return AxB >= 0 ? AxT >= 0 && BxT <= 0 : !(AxT <= 0 && BxT >= 0);\n};\n","import type {\n TPointerEvent,\n Transform,\n TransformAction,\n BasicTransformEvent,\n} from '../EventTypeDefs';\nimport { resolveOrigin } from '../util/misc/resolveOrigin';\nimport { Point } from '../Point';\nimport type { FabricObject } from '../shapes/Object/FabricObject';\nimport type { TOriginX, TOriginY } from '../typedefs';\nimport { degreesToRadians } from '../util/misc/radiansDegreesConversion';\nimport type { Control } from './Control';\nimport { CENTER, quarterPI, twoMathPi } from '../constants';\nimport { calcVectorRotation, createVector } from '../util/misc/vectors';\nimport type { TOCoord } from '../shapes/Object/InteractiveObject';\nimport { sendPointToPlane } from '../util/misc/planeChange';\n\nexport const NOT_ALLOWED_CURSOR = 'not-allowed';\n\n/**\n * @param {Boolean} alreadySelected true if target is already selected\n * @param {String} corner a string representing the corner ml, mr, tl ...\n * @param {Event} e Event object\n * @param {FabricObject} [target] inserted back to help overriding. Unused\n */\nexport const getActionFromCorner = (\n alreadySelected: boolean,\n corner: string | undefined,\n e: TPointerEvent,\n target: FabricObject,\n) => {\n if (!corner || !alreadySelected) {\n return 'drag';\n }\n const control = target.controls[corner];\n return control.getActionName(e, control, target);\n};\n\n/**\n * Checks if transform is centered\n * @param {Object} transform transform data\n * @return {Boolean} true if transform is centered\n */\nexport function isTransformCentered(transform: Transform) {\n return (\n resolveOrigin(transform.originX) === resolveOrigin(CENTER) &&\n resolveOrigin(transform.originY) === resolveOrigin(CENTER)\n );\n}\n\nexport function invertOrigin(origin: TOriginX | TOriginY) {\n return -resolveOrigin(origin) + 0.5;\n}\n\nexport const isLocked = (\n target: FabricObject,\n lockingKey:\n | 'lockMovementX'\n | 'lockMovementY'\n | 'lockRotation'\n | 'lockScalingX'\n | 'lockScalingY'\n | 'lockSkewingX'\n | 'lockSkewingY'\n | 'lockScalingFlip',\n) => target[lockingKey];\n\nexport const commonEventInfo: TransformAction<\n Transform,\n BasicTransformEvent\n> = (eventData, transform, x, y) => {\n return {\n e: eventData,\n transform,\n pointer: new Point(x, y),\n };\n};\n\n/**\n * Combine control position and object angle to find the control direction compared\n * to the object center.\n * @param {FabricObject} fabricObject the fabric object for which we are rendering controls\n * @param {Control} control the control class\n * @return {Number} 0 - 7 a quadrant number\n */\nexport function findCornerQuadrant(\n fabricObject: FabricObject,\n control: Control,\n coord: TOCoord,\n): number {\n const target = coord;\n const center = sendPointToPlane(\n fabricObject.getCenterPoint(),\n fabricObject.canvas!.viewportTransform,\n undefined,\n );\n const angle = calcVectorRotation(createVector(center, target)) + twoMathPi;\n return Math.round((angle % twoMathPi) / quarterPI);\n}\n\n/**\n * @returns the normalized point (rotated relative to center) in local coordinates\n */\nfunction normalizePoint(\n target: FabricObject,\n point: Point,\n originX: TOriginX,\n originY: TOriginY,\n): Point {\n const center = target.getRelativeCenterPoint(),\n p =\n typeof originX !== 'undefined' && typeof originY !== 'undefined'\n ? target.translateToGivenOrigin(\n center,\n CENTER,\n CENTER,\n originX,\n originY,\n )\n : new Point(target.left, target.top),\n p2 = target.angle\n ? point.rotate(-degreesToRadians(target.angle), center)\n : point;\n return p2.subtract(p);\n}\n\n/**\n * Transforms a point to the offset from the given origin\n * @param {Object} transform\n * @param {String} originX\n * @param {String} originY\n * @param {number} x\n * @param {number} y\n * @return {Fabric.Point} the normalized point\n */\nexport function getLocalPoint(\n { target, corner }: Transform,\n originX: TOriginX,\n originY: TOriginY,\n x: number,\n y: number,\n) {\n const control = target.controls[corner],\n zoom = target.canvas?.getZoom() || 1,\n padding = target.padding / zoom,\n localPoint = normalizePoint(target, new Point(x, y), originX, originY);\n if (localPoint.x >= padding) {\n localPoint.x -= padding;\n }\n if (localPoint.x <= -padding) {\n localPoint.x += padding;\n }\n if (localPoint.y >= padding) {\n localPoint.y -= padding;\n }\n if (localPoint.y <= padding) {\n localPoint.y += padding;\n }\n localPoint.x -= control.offsetX;\n localPoint.y -= control.offsetY;\n return localPoint;\n}\n","import type { TransformActionHandler } from '../EventTypeDefs';\nimport { LEFT, TOP, MOVING } from '../constants';\nimport { fireEvent } from './fireEvent';\nimport { commonEventInfo, isLocked } from './util';\n\n/**\n * Action handler\n * @private\n * @param {Event} eventData javascript event that is doing the transform\n * @param {Object} transform javascript object containing a series of information around the current transform\n * @param {number} x current mouse x position, canvas normalized\n * @param {number} y current mouse y position, canvas normalized\n * @return {Boolean} true if the translation occurred\n */\nexport const dragHandler: TransformActionHandler = (\n eventData,\n transform,\n x,\n y,\n) => {\n const { target, offsetX, offsetY } = transform,\n newLeft = x - offsetX,\n newTop = y - offsetY,\n moveX = !isLocked(target, 'lockMovementX') && target.left !== newLeft,\n moveY = !isLocked(target, 'lockMovementY') && target.top !== newTop;\n moveX && target.set(LEFT, newLeft);\n moveY && target.set(TOP, newTop);\n if (moveX || moveY) {\n fireEvent(MOVING, commonEventInfo(eventData, transform, x, y));\n }\n return moveX || moveY;\n};\n","/**\n * Map of the 148 color names with HEX code\n * @see: https://www.w3.org/TR/css3-color/#svg-color\n */\nexport const ColorNameMap = {\n aliceblue: '#F0F8FF',\n antiquewhite: '#FAEBD7',\n aqua: '#0FF',\n aquamarine: '#7FFFD4',\n azure: '#F0FFFF',\n beige: '#F5F5DC',\n bisque: '#FFE4C4',\n black: '#000',\n blanchedalmond: '#FFEBCD',\n blue: '#00F',\n blueviolet: '#8A2BE2',\n brown: '#A52A2A',\n burlywood: '#DEB887',\n cadetblue: '#5F9EA0',\n chartreuse: '#7FFF00',\n chocolate: '#D2691E',\n coral: '#FF7F50',\n cornflowerblue: '#6495ED',\n cornsilk: '#FFF8DC',\n crimson: '#DC143C',\n cyan: '#0FF',\n darkblue: '#00008B',\n darkcyan: '#008B8B',\n darkgoldenrod: '#B8860B',\n darkgray: '#A9A9A9',\n darkgrey: '#A9A9A9',\n darkgreen: '#006400',\n darkkhaki: '#BDB76B',\n darkmagenta: '#8B008B',\n darkolivegreen: '#556B2F',\n darkorange: '#FF8C00',\n darkorchid: '#9932CC',\n darkred: '#8B0000',\n darksalmon: '#E9967A',\n darkseagreen: '#8FBC8F',\n darkslateblue: '#483D8B',\n darkslategray: '#2F4F4F',\n darkslategrey: '#2F4F4F',\n darkturquoise: '#00CED1',\n darkviolet: '#9400D3',\n deeppink: '#FF1493',\n deepskyblue: '#00BFFF',\n dimgray: '#696969',\n dimgrey: '#696969',\n dodgerblue: '#1E90FF',\n firebrick: '#B22222',\n floralwhite: '#FFFAF0',\n forestgreen: '#228B22',\n fuchsia: '#F0F',\n gainsboro: '#DCDCDC',\n ghostwhite: '#F8F8FF',\n gold: '#FFD700',\n goldenrod: '#DAA520',\n gray: '#808080',\n grey: '#808080',\n green: '#008000',\n greenyellow: '#ADFF2F',\n honeydew: '#F0FFF0',\n hotpink: '#FF69B4',\n indianred: '#CD5C5C',\n indigo: '#4B0082',\n ivory: '#FFFFF0',\n khaki: '#F0E68C',\n lavender: '#E6E6FA',\n lavenderblush: '#FFF0F5',\n lawngreen: '#7CFC00',\n lemonchiffon: '#FFFACD',\n lightblue: '#ADD8E6',\n lightcoral: '#F08080',\n lightcyan: '#E0FFFF',\n lightgoldenrodyellow: '#FAFAD2',\n lightgray: '#D3D3D3',\n lightgrey: '#D3D3D3',\n lightgreen: '#90EE90',\n lightpink: '#FFB6C1',\n lightsalmon: '#FFA07A',\n lightseagreen: '#20B2AA',\n lightskyblue: '#87CEFA',\n lightslategray: '#789',\n lightslategrey: '#789',\n lightsteelblue: '#B0C4DE',\n lightyellow: '#FFFFE0',\n lime: '#0F0',\n limegreen: '#32CD32',\n linen: '#FAF0E6',\n magenta: '#F0F',\n maroon: '#800000',\n mediumaquamarine: '#66CDAA',\n mediumblue: '#0000CD',\n mediumorchid: '#BA55D3',\n mediumpurple: '#9370DB',\n mediumseagreen: '#3CB371',\n mediumslateblue: '#7B68EE',\n mediumspringgreen: '#00FA9A',\n mediumturquoise: '#48D1CC',\n mediumvioletred: '#C71585',\n midnightblue: '#191970',\n mintcream: '#F5FFFA',\n mistyrose: '#FFE4E1',\n moccasin: '#FFE4B5',\n navajowhite: '#FFDEAD',\n navy: '#000080',\n oldlace: '#FDF5E6',\n olive: '#808000',\n olivedrab: '#6B8E23',\n orange: '#FFA500',\n orangered: '#FF4500',\n orchid: '#DA70D6',\n palegoldenrod: '#EEE8AA',\n palegreen: '#98FB98',\n paleturquoise: '#AFEEEE',\n palevioletred: '#DB7093',\n papayawhip: '#FFEFD5',\n peachpuff: '#FFDAB9',\n peru: '#CD853F',\n pink: '#FFC0CB',\n plum: '#DDA0DD',\n powderblue: '#B0E0E6',\n purple: '#800080',\n rebeccapurple: '#639',\n red: '#F00',\n rosybrown: '#BC8F8F',\n royalblue: '#4169E1',\n saddlebrown: '#8B4513',\n salmon: '#FA8072',\n sandybrown: '#F4A460',\n seagreen: '#2E8B57',\n seashell: '#FFF5EE',\n sienna: '#A0522D',\n silver: '#C0C0C0',\n skyblue: '#87CEEB',\n slateblue: '#6A5ACD',\n slategray: '#708090',\n slategrey: '#708090',\n snow: '#FFFAFA',\n springgreen: '#00FF7F',\n steelblue: '#4682B4',\n tan: '#D2B48C',\n teal: '#008080',\n thistle: '#D8BFD8',\n tomato: '#FF6347',\n turquoise: '#40E0D0',\n violet: '#EE82EE',\n wheat: '#F5DEB3',\n white: '#FFF',\n whitesmoke: '#F5F5F5',\n yellow: '#FF0',\n yellowgreen: '#9ACD32',\n};\n","/**\n * Regex matching color in RGB or RGBA formats (ex: `rgb(0, 0, 0)`, `rgba(255, 100, 10, 0.5)`, `rgba( 255 , 100 , 10 , 0.5 )`, `rgb(1,1,1)`, `rgba(100%, 60%, 10%, 0.5)`)\n * Also matching rgba(r g b / a) as per new specs\n * https://developer.mozilla.org/en-US/docs/Web/CSS/color_value/rgb\n * Formal syntax at the time of writing:\n * =\n * rgb( [ | none ]{3} [ / [ | none ] ]? ) |\n * rgb( [ | none ]{3} [ / [ | none ] ]? )\n * = | \n *\n * For learners this is how you can read this regex\n * Regular expression for matching an rgba or rgb CSS color value\n *\n * /^ # Beginning of the string\n * rgba? # \"rgb\" or \"rgba\"\n * \\(\\s* # Opening parenthesis and optional whitespace\n * (\\d{0,3} # 0 to three digits R channel\n * (?:\\.\\d+)? # Optional decimal with one or more digits\n * ) # End of capturing group for the first color component\n * %? # Optional percent sign after the first color component\n * \\s* # Optional whitespace\n * [\\s|,] # Separator between color components can be a space or comma\n * \\s* # Optional whitespace\n * (\\d{0,3} # 0 to three digits G channel\n * (?:\\.\\d+)? # Optional decimal with one or more digits\n * ) # End of capturing group for the second color component\n * %? # Optional percent sign after the second color component\n * \\s* # Optional whitespace\n * [\\s|,] # Separator between color components can be a space or comma\n * \\s* # Optional whitespace\n * (\\d{0,3} # 0 to three digits B channel\n * (?:\\.\\d+)? # Optional decimal with one or more digits\n * ) # End of capturing group for the third color component\n * %? # Optional percent sign after the third color component\n * \\s* # Optional whitespace\n * (?: # Beginning of non-capturing group for alpha value\n * \\s* # Optional whitespace\n * [,/] # Comma or slash separator for alpha value\n * \\s* # Optional whitespace\n * (\\d{0,3} # Zero to three digits\n * (?:\\.\\d+)? # Optional decimal with one or more digits\n * ) # End of capturing group for alpha value\n * %? # Optional percent sign after alpha value\n * \\s* # Optional whitespace\n * )? # End of non-capturing group for alpha value (optional)\n * \\) # Closing parenthesis\n * $ # End of the string\n *\n * The alpha channel can be in the format 0.4 .7 or 1 or 73%\n *\n * WARNING this regex doesn't fail on off spec colors. it matches everything that could be a color.\n * So the spec does not allow for `rgba(30 , 45% 35, 49%)` but this will work anyways for us\n */\nexport const reRGBa = () =>\n /^rgba?\\(\\s*(\\d{0,3}(?:\\.\\d+)?%?)\\s*[\\s|,]\\s*(\\d{0,3}(?:\\.\\d+)?%?)\\s*[\\s|,]\\s*(\\d{0,3}(?:\\.\\d+)?%?)\\s*(?:\\s*[,/]\\s*(\\d{0,3}(?:\\.\\d+)?%?)\\s*)?\\)$/i;\n\n/**\n * Regex matching color in HSL or HSLA formats (ex: hsl(0, 0, 0), rgba(255, 100, 10, 0.5), rgba( 255 , 100 , 10 , 0.5 ), rgb(1,1,1), rgba(100%, 60%, 10%, 0.5))\n * Also matching rgba(r g b / a) as per new specs\n * https://developer.mozilla.org/en-US/docs/Web/CSS/color_value/hsl\n * Formal syntax at the time of writing:\n * =\n * hsl( [ | none ] [ | none ] [ | none ] [ / [ | none ] ]? )\n *\n * =\n * |\n * \n *\n * =\n * |\n * \n *\n * For learners this is how you can read this regex\n * Regular expression for matching an hsla or hsl CSS color value\n *\n * /^hsla?\\( // Matches the beginning of the string and the opening parenthesis of \"hsl\" or \"hsla\"\n * \\s* // Matches any whitespace characters (space, tab, etc.) zero or more times\n * (\\d{0,3} // Hue: 0 to three digits - start capture in a group\n * (?:\\.\\d+)? // Hue: Optional (non capture group) decimal with one or more digits.\n * (?:deg|turn|rad)? // Hue: Optionally include suffix deg or turn or rad\n * ) // Hue: End capture group\n * \\s* // Matches any whitespace characters zero or more times\n * [\\s|,] // Matches a space, tab or comma\n * \\s* // Matches any whitespace characters zero or more times\n * (\\d{0,3} // Saturation: 0 to three digits - start capture in a group\n * (?:\\.\\d+)? // Saturation: Optional decimal with one or more digits in a non-capturing group\n * %?) // Saturation: match optional % character and end capture group\n * \\s* // Matches any whitespace characters zero or more times\n * [\\s|,] // Matches a space, tab or comma\n * \\s* // Matches any whitespace characters zero or more times\n * (\\d{0,3} // Lightness: 0 to three digits - start capture in a group\n * (?:\\.\\d+)? // Lightness: Optional decimal with one or more digits in a non-capturing group\n * %?) // Lightness: match % character and end capture group\n * \\s* // Matches any whitespace characters zero or more times\n * (?: // Alpha: Begins a non-capturing group for the alpha value\n * \\s* // Matches any whitespace characters zero or more times\n * [,/] // Matches a comma or forward slash\n * \\s* // Matches any whitespace characters zero or more times\n * (\\d*(?:\\.\\d+)?%?) // Matches zero or more digits, optionally followed by a decimal point and one or more digits, followed by an optional percentage sign and captures it in a group\n * \\s* // Matches any whitespace characters zero or more times\n * )? // Makes the alpha value group optional\n * \\) // Matches the closing parenthesis\n * $/i // Matches the end of the string and sets the regular expression to case-insensitive mode\n *\n * WARNING this regex doesn't fail on off spec colors. It matches everything that could be a color.\n * So the spec does not allow `hsl(30 , 45% 35, 49%)` but this will work anyways for us.\n */\nexport const reHSLa = () =>\n /^hsla?\\(\\s*([+-]?\\d{0,3}(?:\\.\\d+)?(?:deg|turn|rad)?)\\s*[\\s|,]\\s*(\\d{0,3}(?:\\.\\d+)?%?)\\s*[\\s|,]\\s*(\\d{0,3}(?:\\.\\d+)?%?)\\s*(?:\\s*[,/]\\s*(\\d*(?:\\.\\d+)?%?)\\s*)?\\)$/i;\n\n/**\n * Regex matching color in HEX format (ex: #FF5544CC, #FF5555, 010155, aff)\n */\nexport const reHex = () => /^#?(([0-9a-f]){3,4}|([0-9a-f]{2}){3,4})$/i;\n","import type { TRGBAColorSource } from './typedefs';\n\n/**\n * @param {Number} p\n * @param {Number} q\n * @param {Number} t\n * @return {Number}\n */\nexport const hue2rgb = (p: number, q: number, t: number): number => {\n if (t < 0) {\n t += 1;\n }\n if (t > 1) {\n t -= 1;\n }\n if (t < 1 / 6) {\n return p + (q - p) * 6 * t;\n }\n if (t < 1 / 2) {\n return q;\n }\n if (t < 2 / 3) {\n return p + (q - p) * (2 / 3 - t) * 6;\n }\n return p;\n};\n\n/**\n * Adapted from {@link https://gist.github.com/mjackson/5311256 https://gist.github.com/mjackson}\n * @param {Number} r Red color value\n * @param {Number} g Green color value\n * @param {Number} b Blue color value\n * @param {Number} a Alpha color value pass through\n * @return {TRGBColorSource} Hsl color\n */\nexport const rgb2Hsl = (\n r: number,\n g: number,\n b: number,\n a: number,\n): TRGBAColorSource => {\n r /= 255;\n g /= 255;\n b /= 255;\n const maxValue = Math.max(r, g, b),\n minValue = Math.min(r, g, b);\n\n let h!: number, s: number;\n const l = (maxValue + minValue) / 2;\n\n if (maxValue === minValue) {\n h = s = 0; // achromatic\n } else {\n const d = maxValue - minValue;\n s = l > 0.5 ? d / (2 - maxValue - minValue) : d / (maxValue + minValue);\n switch (maxValue) {\n case r:\n h = (g - b) / d + (g < b ? 6 : 0);\n break;\n case g:\n h = (b - r) / d + 2;\n break;\n case b:\n h = (r - g) / d + 4;\n break;\n }\n h /= 6;\n }\n\n return [Math.round(h * 360), Math.round(s * 100), Math.round(l * 100), a];\n};\n\nexport const fromAlphaToFloat = (value = '1') =>\n parseFloat(value) / (value.endsWith('%') ? 100 : 1);\n\n/**\n * Convert a value in the inclusive range [0, 255] to hex\n */\nexport const hexify = (value: number) =>\n Math.min(Math.round(value), 255).toString(16).toUpperCase().padStart(2, '0');\n\n/**\n * Calculate the grey average value for rgb and pass through alpha\n */\nexport const greyAverage = ([\n r,\n g,\n b,\n a = 1,\n]: TRGBAColorSource): TRGBAColorSource => {\n const avg = Math.round(r * 0.3 + g * 0.59 + b * 0.11);\n return [avg, avg, avg, a];\n};\n","import { radiansToDegrees } from '../util/misc/radiansDegreesConversion';\nimport { ColorNameMap } from './color_map';\nimport { reHSLa, reHex, reRGBa } from './constants';\nimport type { TRGBAColorSource, TColorArg } from './typedefs';\nimport {\n hue2rgb,\n hexify,\n rgb2Hsl,\n fromAlphaToFloat,\n greyAverage,\n} from './util';\n\n/**\n * @class Color common color operations\n * @see {@link http://fabric5.fabricjs.com/fabric-intro-part-2#colors colors}\n */\nexport class Color {\n declare private _source: TRGBAColorSource;\n isUnrecognised = false;\n\n /**\n *\n * @param {string} [color] optional in hex or rgb(a) or hsl format or from known color list\n */\n constructor(color?: TColorArg) {\n if (!color) {\n // we default to black as canvas does\n this.setSource([0, 0, 0, 1]);\n } else if (color instanceof Color) {\n this.setSource([...color._source]);\n } else if (Array.isArray(color)) {\n const [r, g, b, a = 1] = color;\n this.setSource([r, g, b, a]);\n } else {\n this.setSource(this._tryParsingColor(color));\n }\n }\n\n /**\n * @private\n * @param {string} [color] Color value to parse\n * @returns {TRGBAColorSource}\n */\n protected _tryParsingColor(color: string) {\n color = color.toLowerCase();\n if (color in ColorNameMap) {\n color = ColorNameMap[color as keyof typeof ColorNameMap];\n }\n return color === 'transparent'\n ? ([255, 255, 255, 0] as TRGBAColorSource)\n : Color.sourceFromHex(color) ||\n Color.sourceFromRgb(color) ||\n Color.sourceFromHsl(color) ||\n // color is not recognized\n // we default to black as canvas does\n // eslint-disable-next-line no-constant-binary-expression\n ((this.isUnrecognised = true) && ([0, 0, 0, 1] as TRGBAColorSource));\n }\n\n /**\n * Returns source of this color (where source is an array representation; ex: [200, 200, 100, 1])\n * @return {TRGBAColorSource}\n */\n getSource() {\n return this._source;\n }\n\n /**\n * Sets source of this color (where source is an array representation; ex: [200, 200, 100, 1])\n * @param {TRGBAColorSource} source\n */\n setSource(source: TRGBAColorSource) {\n this._source = source;\n }\n\n /**\n * Returns color representation in RGB format\n * @return {String} ex: rgb(0-255,0-255,0-255)\n */\n toRgb() {\n const [r, g, b] = this.getSource();\n return `rgb(${r},${g},${b})`;\n }\n\n /**\n * Returns color representation in RGBA format\n * @return {String} ex: rgba(0-255,0-255,0-255,0-1)\n */\n toRgba() {\n return `rgba(${this.getSource().join(',')})`;\n }\n\n /**\n * Returns color representation in HSL format\n * @return {String} ex: hsl(0-360,0%-100%,0%-100%)\n */\n toHsl() {\n const [h, s, l] = rgb2Hsl(...this.getSource());\n return `hsl(${h},${s}%,${l}%)`;\n }\n\n /**\n * Returns color representation in HSLA format\n * @return {String} ex: hsla(0-360,0%-100%,0%-100%,0-1)\n */\n toHsla() {\n const [h, s, l, a] = rgb2Hsl(...this.getSource());\n return `hsla(${h},${s}%,${l}%,${a})`;\n }\n\n /**\n * Returns color representation in HEX format\n * @return {String} ex: FF5555\n */\n toHex() {\n const fullHex = this.toHexa();\n return fullHex.slice(0, 6);\n }\n\n /**\n * Returns color representation in HEXA format\n * @return {String} ex: FF5555CC\n */\n toHexa() {\n const [r, g, b, a] = this.getSource();\n return `${hexify(r)}${hexify(g)}${hexify(b)}${hexify(Math.round(a * 255))}`;\n }\n\n /**\n * Gets value of alpha channel for this color\n * @return {Number} 0-1\n */\n getAlpha() {\n return this.getSource()[3];\n }\n\n /**\n * Sets value of alpha channel for this color\n * @param {Number} alpha Alpha value 0-1\n * @return {Color} thisArg\n */\n setAlpha(alpha: number) {\n this._source[3] = alpha;\n return this;\n }\n\n /**\n * Transforms color to its grayscale representation\n * @return {Color} thisArg\n */\n toGrayscale() {\n this.setSource(greyAverage(this.getSource()));\n return this;\n }\n\n /**\n * Transforms color to its black and white representation\n * @param {Number} threshold\n * @return {Color} thisArg\n */\n toBlackWhite(threshold: number) {\n const [average, , , a] = greyAverage(this.getSource()),\n bOrW = average < (threshold || 127) ? 0 : 255;\n this.setSource([bOrW, bOrW, bOrW, a]);\n return this;\n }\n\n /**\n * Overlays color with another color\n * @param {String|Color} otherColor\n * @return {Color} thisArg\n */\n overlayWith(otherColor: string | Color) {\n if (!(otherColor instanceof Color)) {\n otherColor = new Color(otherColor);\n }\n\n const source = this.getSource(),\n otherAlpha = 0.5,\n otherSource = otherColor.getSource(),\n [R, G, B] = source.map((value, index) =>\n Math.round(value * (1 - otherAlpha) + otherSource[index] * otherAlpha),\n );\n\n this.setSource([R, G, B, source[3]]);\n return this;\n }\n\n /**\n * Returns new color object, when given a color in RGB format\n * @param {String} color Color value ex: rgb(0-255,0-255,0-255)\n * @return {Color}\n */\n static fromRgb(color: string): Color {\n return Color.fromRgba(color);\n }\n\n /**\n * Returns new color object, when given a color in RGBA format\n * @param {String} color\n * @return {Color}\n */\n static fromRgba(color: string): Color {\n return new Color(Color.sourceFromRgb(color));\n }\n\n /**\n * Returns array representation (ex: [100, 100, 200, 1]) of a color that's in RGB or RGBA format\n * @param {String} color Color value ex: rgb(0-255,0-255,0-255), rgb(0%-100%,0%-100%,0%-100%)\n * @return {TRGBAColorSource | undefined} source\n */\n static sourceFromRgb(color: string): TRGBAColorSource | undefined {\n const match = color.match(reRGBa());\n if (match) {\n const [r, g, b] = match.slice(1, 4).map((value) => {\n const parsedValue = parseFloat(value);\n return value.endsWith('%')\n ? Math.round(parsedValue * 2.55)\n : parsedValue;\n });\n return [r, g, b, fromAlphaToFloat(match[4])];\n }\n }\n\n /**\n * Returns new color object, when given a color in HSL format\n * @param {String} color Color value ex: hsl(0-260,0%-100%,0%-100%)\n * @return {Color}\n */\n static fromHsl(color: string): Color {\n return Color.fromHsla(color);\n }\n\n /**\n * Returns new color object, when given a color in HSLA format\n * @param {String} color\n * @return {Color}\n */\n static fromHsla(color: string): Color {\n return new Color(Color.sourceFromHsl(color));\n }\n\n /**\n * Returns array representation (ex: [100, 100, 200, 1]) of a color that's in HSL or HSLA format.\n * Adapted from https://github.com/mjijackson\n * @param {String} color Color value ex: hsl(0-360,0%-100%,0%-100%) or hsla(0-360,0%-100%,0%-100%, 0-1)\n * @return {TRGBAColorSource | undefined} source\n * @see http://http://www.w3.org/TR/css3-color/#hsl-color\n */\n static sourceFromHsl(color: string): TRGBAColorSource | undefined {\n const match = color.match(reHSLa());\n if (!match) {\n return;\n }\n const match1degrees = Color.parseAngletoDegrees(match[1]);\n\n const h = (((match1degrees % 360) + 360) % 360) / 360,\n s = parseFloat(match[2]) / 100,\n l = parseFloat(match[3]) / 100;\n let r: number, g: number, b: number;\n\n if (s === 0) {\n r = g = b = l;\n } else {\n const q = l <= 0.5 ? l * (s + 1) : l + s - l * s,\n p = l * 2 - q;\n\n r = hue2rgb(p, q, h + 1 / 3);\n g = hue2rgb(p, q, h);\n b = hue2rgb(p, q, h - 1 / 3);\n }\n\n return [\n Math.round(r * 255),\n Math.round(g * 255),\n Math.round(b * 255),\n fromAlphaToFloat(match[4]),\n ];\n }\n\n /**\n * Returns new color object, when given a color in HEX format\n * @param {String} color Color value ex: FF5555\n * @return {Color}\n */\n static fromHex(color: string): Color {\n return new Color(Color.sourceFromHex(color));\n }\n\n /**\n * Returns array representation (ex: [100, 100, 200, 1]) of a color that's in HEX format\n * @param {String} color ex: FF5555 or FF5544CC (RGBa)\n * @return {TRGBAColorSource | undefined} source\n */\n static sourceFromHex(color: string): TRGBAColorSource | undefined {\n if (color.match(reHex())) {\n const value = color.slice(color.indexOf('#') + 1),\n isShortNotation = value.length <= 4;\n let expandedValue: string[];\n if (isShortNotation) {\n expandedValue = value.split('').map((hex) => hex + hex);\n } else {\n expandedValue = value.match(/.{2}/g)!;\n }\n const [r, g, b, a = 255] = expandedValue.map((hexCouple) =>\n parseInt(hexCouple, 16),\n );\n return [r, g, b, a / 255];\n }\n }\n\n /**\n * Converts a string that could be any angle notation (50deg, 0.5turn, 2rad)\n * into degrees without the 'deg' suffix\n * @param {String} value ex: 0deg, 0.5turn, 2rad\n * @return {Number} number in degrees or NaN if inputs are invalid\n */\n static parseAngletoDegrees(value: string): number {\n const lowercase = value.toLowerCase();\n const numeric = parseFloat(lowercase);\n\n if (lowercase.includes('rad')) {\n return radiansToDegrees(numeric);\n }\n\n if (lowercase.includes('turn')) {\n return numeric * 360;\n }\n\n // Value is probably just a number already in degrees eg '50'\n return numeric;\n }\n}\n","import { Color } from '../../color/Color';\nimport { config } from '../../config';\nimport { DEFAULT_SVG_FONT_SIZE, FILL, NONE } from '../../constants';\nimport type { TBBox, SVGElementName, SupportedSVGUnit } from '../../typedefs';\nimport { toFixed } from './toFixed';\n\n/**\n * Returns array of attributes for given svg that fabric parses\n * @param {SVGElementName} type Type of svg element (eg. 'circle')\n * @return {Array} string names of supported attributes\n */\nexport const getSvgAttributes = (type: SVGElementName) => {\n const commonAttributes = ['instantiated_by_use', 'style', 'id', 'class'];\n switch (type) {\n case 'linearGradient':\n return commonAttributes.concat([\n 'x1',\n 'y1',\n 'x2',\n 'y2',\n 'gradientUnits',\n 'gradientTransform',\n ]);\n case 'radialGradient':\n return commonAttributes.concat([\n 'gradientUnits',\n 'gradientTransform',\n 'cx',\n 'cy',\n 'r',\n 'fx',\n 'fy',\n 'fr',\n ]);\n case 'stop':\n return commonAttributes.concat(['offset', 'stop-color', 'stop-opacity']);\n }\n return commonAttributes;\n};\n\n/**\n * Converts from attribute value to pixel value if applicable.\n * Returns converted pixels or original value not converted.\n * @param {string} value number to operate on\n * @param {number} fontSize\n * @return {number}\n */\nexport const parseUnit = (value: string, fontSize = DEFAULT_SVG_FONT_SIZE) => {\n const unit = /\\D{0,2}$/.exec(value),\n number = parseFloat(value);\n const dpi = config.DPI;\n switch (unit?.[0] as SupportedSVGUnit) {\n case 'mm':\n return (number * dpi) / 25.4;\n\n case 'cm':\n return (number * dpi) / 2.54;\n\n case 'in':\n return number * dpi;\n\n case 'pt':\n return (number * dpi) / 72; // or * 4 / 3\n\n case 'pc':\n return ((number * dpi) / 72) * 12; // or * 16\n\n case 'em':\n return number * fontSize;\n\n default:\n return number;\n }\n};\n\nexport type MeetOrSlice = 'meet' | 'slice';\n\nexport type MinMidMax = 'Min' | 'Mid' | 'Max' | 'none';\n\nexport type TPreserveArParsed = {\n meetOrSlice: MeetOrSlice;\n alignX: MinMidMax;\n alignY: MinMidMax;\n};\n\n// align can be either none or undefined or a combination of mid/max\nconst parseAlign = (align: string): MinMidMax[] => {\n //divide align in alignX and alignY\n if (align && align !== NONE) {\n return [align.slice(1, 4) as MinMidMax, align.slice(5, 8) as MinMidMax];\n } else if (align === NONE) {\n return [align, align];\n }\n return ['Mid', 'Mid'];\n};\n\n/**\n * Parse preserveAspectRatio attribute from element\n * https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/preserveAspectRatio\n * @param {string} attribute to be parsed\n * @return {Object} an object containing align and meetOrSlice attribute\n */\nexport const parsePreserveAspectRatioAttribute = (\n attribute: string,\n): TPreserveArParsed => {\n const [firstPart, secondPart] = attribute.trim().split(' ') as [\n MinMidMax,\n MeetOrSlice | undefined,\n ];\n const [alignX, alignY] = parseAlign(firstPart);\n return {\n meetOrSlice: secondPart || 'meet',\n alignX,\n alignY,\n };\n};\n\n/**\n * Adobe Illustrator (at least CS5) is unable to render rgba()-based fill values\n * we work around it by \"moving\" alpha channel into opacity attribute and setting fill's alpha to 1\n * @param prop\n * @param value\n * @param {boolean} inlineStyle The default is inline style, the separator used is \":\", The other is \"=\"\n * @returns\n */\nexport const colorPropToSVG = (\n prop: string,\n value?: any,\n inlineStyle = true,\n) => {\n let colorValue;\n let opacityValue;\n if (!value) {\n colorValue = 'none';\n } else if (value.toLive) {\n colorValue = `url(#SVGID_${value.id})`;\n } else {\n const color = new Color(value),\n opacity = color.getAlpha();\n\n colorValue = color.toRgb();\n if (opacity !== 1) {\n opacityValue = opacity.toString();\n }\n }\n if (inlineStyle) {\n return `${prop}: ${colorValue}; ${\n opacityValue ? `${prop}-opacity: ${opacityValue}; ` : ''\n }`;\n } else {\n return `${prop}=\"${colorValue}\" ${\n opacityValue ? `${prop}-opacity=\"${opacityValue}\" ` : ''\n }`;\n }\n};\n\nexport const createSVGRect = (\n color: string,\n { left, top, width, height }: TBBox,\n precision = config.NUM_FRACTION_DIGITS,\n) => {\n const svgColor = colorPropToSVG(FILL, color, false);\n const [x, y, w, h] = [left, top, width, height].map((value) =>\n toFixed(value, precision),\n );\n return ``;\n};\n","import type { TSVGReviver } from '../../typedefs';\nimport { uid } from '../../util/internals/uid';\nimport { colorPropToSVG } from '../../util/misc/svgParsing';\nimport { FILL, NONE, STROKE } from '../../constants';\nimport type { FabricObject } from './FabricObject';\nimport { isFiller } from '../../util/typeAssertions';\nimport { matrixToSVG } from '../../util/misc/svgExport';\n\nexport class FabricObjectSVGExportMixin {\n /**\n * When an object is being exported as SVG as a clippath, a reference inside the SVG is needed.\n * This reference is a UID in the fabric namespace and is temporary stored here.\n * @type {String}\n */\n declare clipPathId?: string;\n\n /**\n * Returns styles-string for svg-export\n * @param {Boolean} skipShadow a boolean to skip shadow filter output\n * @return {String}\n */\n getSvgStyles(\n this: FabricObjectSVGExportMixin & FabricObject,\n skipShadow?: boolean,\n ) {\n const fillRule = this.fillRule ? this.fillRule : 'nonzero',\n strokeWidth = this.strokeWidth ? this.strokeWidth : '0',\n strokeDashArray = this.strokeDashArray\n ? this.strokeDashArray.join(' ')\n : NONE,\n strokeDashOffset = this.strokeDashOffset ? this.strokeDashOffset : '0',\n strokeLineCap = this.strokeLineCap ? this.strokeLineCap : 'butt',\n strokeLineJoin = this.strokeLineJoin ? this.strokeLineJoin : 'miter',\n strokeMiterLimit = this.strokeMiterLimit ? this.strokeMiterLimit : '4',\n opacity = typeof this.opacity !== 'undefined' ? this.opacity : '1',\n visibility = this.visible ? '' : ' visibility: hidden;',\n filter = skipShadow ? '' : this.getSvgFilter(),\n fill = colorPropToSVG(FILL, this.fill),\n stroke = colorPropToSVG(STROKE, this.stroke);\n\n return [\n stroke,\n 'stroke-width: ',\n strokeWidth,\n '; ',\n 'stroke-dasharray: ',\n strokeDashArray,\n '; ',\n 'stroke-linecap: ',\n strokeLineCap,\n '; ',\n 'stroke-dashoffset: ',\n strokeDashOffset,\n '; ',\n 'stroke-linejoin: ',\n strokeLineJoin,\n '; ',\n 'stroke-miterlimit: ',\n strokeMiterLimit,\n '; ',\n fill,\n 'fill-rule: ',\n fillRule,\n '; ',\n 'opacity: ',\n opacity,\n ';',\n filter,\n visibility,\n ].join('');\n }\n\n /**\n * Returns filter for svg shadow\n * @return {String}\n */\n getSvgFilter(this: FabricObjectSVGExportMixin & FabricObject) {\n return this.shadow ? `filter: url(#SVGID_${this.shadow.id});` : '';\n }\n\n /**\n * Returns id attribute for svg output\n * @return {String}\n */\n getSvgCommons(\n this: FabricObjectSVGExportMixin & FabricObject & { id?: string },\n ) {\n return [\n this.id ? `id=\"${this.id}\" ` : '',\n this.clipPath\n ? `clip-path=\"url(#${\n (this.clipPath as FabricObjectSVGExportMixin & FabricObject)\n .clipPathId\n })\" `\n : '',\n ].join('');\n }\n\n /**\n * Returns transform-string for svg-export\n * @param {Boolean} use the full transform or the single object one.\n * @return {String}\n */\n getSvgTransform(\n this: FabricObjectSVGExportMixin & FabricObject,\n full?: boolean,\n additionalTransform = '',\n ) {\n const transform = full ? this.calcTransformMatrix() : this.calcOwnMatrix(),\n svgTransform = `transform=\"${matrixToSVG(transform)}`;\n return `${svgTransform}${additionalTransform}\" `;\n }\n\n /**\n * Returns svg representation of an instance\n * This function is implemented in each subclass\n * This is just because typescript otherwise cryies all the time\n * @return {Array} an array of strings with the specific svg representation\n * of the instance\n */\n _toSVG(_reviver?: TSVGReviver): string[] {\n return [''];\n }\n\n /**\n * Returns svg representation of an instance\n * @param {TSVGReviver} [reviver] Method for further parsing of svg representation.\n * @return {String} svg representation of an instance\n */\n toSVG(\n this: FabricObjectSVGExportMixin & FabricObject,\n reviver?: TSVGReviver,\n ) {\n return this._createBaseSVGMarkup(this._toSVG(reviver), {\n reviver,\n });\n }\n\n /**\n * Returns svg clipPath representation of an instance\n * @param {TSVGReviver} [reviver] Method for further parsing of svg representation.\n * @return {String} svg representation of an instance\n */\n toClipPathSVG(\n this: FabricObjectSVGExportMixin & FabricObject,\n reviver?: TSVGReviver,\n ) {\n return (\n '\\t' +\n this._createBaseClipPathSVGMarkup(this._toSVG(reviver), {\n reviver,\n })\n );\n }\n\n /**\n * @private\n */\n _createBaseClipPathSVGMarkup(\n this: FabricObjectSVGExportMixin & FabricObject,\n objectMarkup: string[],\n {\n reviver,\n additionalTransform = '',\n }: { reviver?: TSVGReviver; additionalTransform?: string } = {},\n ) {\n const commonPieces = [\n this.getSvgTransform(true, additionalTransform),\n this.getSvgCommons(),\n ].join(''),\n // insert commons in the markup, style and svgCommons\n index = objectMarkup.indexOf('COMMON_PARTS');\n objectMarkup[index] = commonPieces;\n return reviver ? reviver(objectMarkup.join('')) : objectMarkup.join('');\n }\n\n /**\n * @private\n */\n _createBaseSVGMarkup(\n this: FabricObjectSVGExportMixin & FabricObject,\n objectMarkup: string[],\n {\n noStyle,\n reviver,\n withShadow,\n additionalTransform,\n }: {\n noStyle?: boolean;\n reviver?: TSVGReviver;\n withShadow?: boolean;\n additionalTransform?: string;\n } = {},\n ): string {\n const styleInfo = noStyle ? '' : `style=\"${this.getSvgStyles()}\" `,\n shadowInfo = withShadow ? `style=\"${this.getSvgFilter()}\" ` : '',\n clipPath = this.clipPath as FabricObjectSVGExportMixin & FabricObject,\n vectorEffect = this.strokeUniform\n ? 'vector-effect=\"non-scaling-stroke\" '\n : '',\n absoluteClipPath = clipPath && clipPath.absolutePositioned,\n stroke = this.stroke,\n fill = this.fill,\n shadow = this.shadow,\n markup = [],\n // insert commons in the markup, style and svgCommons\n index = objectMarkup.indexOf('COMMON_PARTS');\n let clipPathMarkup;\n if (clipPath) {\n clipPath.clipPathId = `CLIPPATH_${uid()}`;\n clipPathMarkup = `\\n${clipPath.toClipPathSVG(reviver)}\\n`;\n }\n if (absoluteClipPath) {\n markup.push('\\n');\n }\n markup.push(\n '\\n',\n );\n const commonPieces = [\n styleInfo,\n vectorEffect,\n noStyle ? '' : this.addPaintOrder(),\n ' ',\n additionalTransform ? `transform=\"${additionalTransform}\" ` : '',\n ].join('');\n objectMarkup[index] = commonPieces;\n if (isFiller(fill)) {\n markup.push(fill.toSVG(this));\n }\n if (isFiller(stroke)) {\n markup.push(stroke.toSVG(this));\n }\n if (shadow) {\n markup.push(shadow.toSVG(this));\n }\n if (clipPath) {\n markup.push(clipPathMarkup);\n }\n markup.push(objectMarkup.join(''));\n markup.push('\\n');\n absoluteClipPath && markup.push('\\n');\n return reviver ? reviver(markup.join('')) : markup.join('');\n }\n\n addPaintOrder(this: FabricObjectSVGExportMixin & FabricObject) {\n return this.paintFirst !== FILL ? ` paint-order=\"${this.paintFirst}\" ` : '';\n }\n}\n","export function getSvgRegex(arr: string[]) {\n return new RegExp('^(' + arr.join('|') + ')\\\\b', 'i');\n}\n","import { FILL, LEFT, STROKE, reNewline } from '../../constants';\nimport type { TClassProperties } from '../../typedefs';\nimport type { FabricText } from './Text';\n\nexport const TEXT_DECORATION_THICKNESS = 'textDecorationThickness';\n\nconst fontProperties = [\n 'fontSize',\n 'fontWeight',\n 'fontFamily',\n 'fontStyle',\n] as const;\n\nexport const textDecorationProperties = [\n 'underline',\n 'overline',\n 'linethrough',\n] as const;\n\nexport const textLayoutProperties: string[] = [\n ...fontProperties,\n 'lineHeight',\n 'text',\n 'charSpacing',\n 'textAlign',\n 'styles',\n 'path',\n 'pathStartOffset',\n 'pathSide',\n 'pathAlign',\n];\n\nexport const additionalProps = [\n ...textLayoutProperties,\n ...textDecorationProperties,\n 'textBackgroundColor',\n 'direction',\n TEXT_DECORATION_THICKNESS,\n] as const;\n\nexport type StylePropertiesType =\n | 'fill'\n | 'stroke'\n | 'strokeWidth'\n | 'fontSize'\n | 'fontFamily'\n | 'fontWeight'\n | 'fontStyle'\n | 'textBackgroundColor'\n | 'deltaY'\n | 'overline'\n | 'underline'\n | 'linethrough'\n | typeof TEXT_DECORATION_THICKNESS;\n\nexport const styleProperties: Readonly = [\n ...fontProperties,\n ...textDecorationProperties,\n STROKE,\n 'strokeWidth',\n FILL,\n 'deltaY',\n 'textBackgroundColor',\n TEXT_DECORATION_THICKNESS,\n] as const;\n\n// @TODO: Many things here are configuration related and shouldn't be on the class nor prototype\n// regexes, list of properties that are not suppose to change by instances, magic consts.\n// this will be a separated effort\nexport const textDefaultValues: Partial> = {\n _reNewline: reNewline,\n _reSpacesAndTabs: /[ \\t\\r]/g,\n _reSpaceAndTab: /[ \\t\\r]/,\n _reWords: /\\S+/g,\n fontSize: 40,\n fontWeight: 'normal',\n fontFamily: 'Times New Roman',\n underline: false,\n overline: false,\n linethrough: false,\n textAlign: LEFT,\n fontStyle: 'normal',\n lineHeight: 1.16,\n textBackgroundColor: '',\n stroke: null,\n shadow: null,\n path: undefined,\n pathStartOffset: 0,\n pathSide: LEFT,\n pathAlign: 'baseline',\n charSpacing: 0,\n deltaY: 0,\n direction: 'ltr',\n CACHE_FONT_SIZE: 400,\n MIN_TEXT_WIDTH: 2,\n // Text magic numbers\n superscript: {\n size: 0.6, // fontSize factor\n baseline: -0.35, // baseline-shift factor (upwards)\n },\n subscript: {\n size: 0.6, // fontSize factor\n baseline: 0.11, // baseline-shift factor (downwards)\n },\n _fontSizeFraction: 0.222,\n offsets: {\n underline: 0.1,\n linethrough: -0.28167, // added 1/30 to original number\n overline: -0.81333, // added 1/15 to original number\n },\n _fontSizeMult: 1.13,\n [TEXT_DECORATION_THICKNESS]: 66.667, // before implementation was 1/15\n};\n\nexport const JUSTIFY = 'justify';\nexport const JUSTIFY_LEFT = 'justify-left';\nexport const JUSTIFY_RIGHT = 'justify-right';\nexport const JUSTIFY_CENTER = 'justify-center';\n","import { getSvgRegex } from './getSvgRegex';\nimport { LEFT, TOP } from '../constants';\nimport { TEXT_DECORATION_THICKNESS } from '../shapes/Text/constants';\n\n// matches, e.g.: +14.56e-12, etc.\nexport const reNum = String.raw`[-+]?(?:\\d*\\.\\d+|\\d+\\.?)(?:[eE][-+]?\\d+)?`;\nexport const viewportSeparator = String.raw`(?:\\s*,?\\s+|\\s*,\\s*)`;\n\nexport const svgNS = 'http://www.w3.org/2000/svg';\n\nexport const reFontDeclaration = new RegExp(\n '(normal|italic)?\\\\s*(normal|small-caps)?\\\\s*' +\n '(normal|bold|bolder|lighter|100|200|300|400|500|600|700|800|900)?\\\\s*(' +\n reNum +\n '(?:px|cm|mm|em|pt|pc|in)*)(?:\\\\/(normal|' +\n reNum +\n '))?\\\\s+(.*)',\n);\n\nexport const svgValidTagNames = [\n 'path',\n 'circle',\n 'polygon',\n 'polyline',\n 'ellipse',\n 'rect',\n 'line',\n 'image',\n 'text',\n ],\n svgViewBoxElements = ['symbol', 'image', 'marker', 'pattern', 'view', 'svg'],\n svgInvalidAncestors = [\n 'pattern',\n 'defs',\n 'symbol',\n 'metadata',\n 'clipPath',\n 'mask',\n 'desc',\n ],\n svgValidParents = ['symbol', 'g', 'a', 'svg', 'clipPath', 'defs'],\n attributesMap = {\n cx: LEFT,\n x: LEFT,\n r: 'radius',\n cy: TOP,\n y: TOP,\n display: 'visible',\n visibility: 'visible',\n transform: 'transformMatrix',\n 'fill-opacity': 'fillOpacity',\n 'fill-rule': 'fillRule',\n 'font-family': 'fontFamily',\n 'font-size': 'fontSize',\n 'font-style': 'fontStyle',\n 'font-weight': 'fontWeight',\n 'letter-spacing': 'charSpacing',\n 'paint-order': 'paintFirst',\n 'stroke-dasharray': 'strokeDashArray',\n 'stroke-dashoffset': 'strokeDashOffset',\n 'stroke-linecap': 'strokeLineCap',\n 'stroke-linejoin': 'strokeLineJoin',\n 'stroke-miterlimit': 'strokeMiterLimit',\n 'stroke-opacity': 'strokeOpacity',\n 'stroke-width': 'strokeWidth',\n 'text-decoration': 'textDecoration',\n 'text-anchor': 'textAnchor',\n opacity: 'opacity',\n 'clip-path': 'clipPath',\n 'clip-rule': 'clipRule',\n 'vector-effect': 'strokeUniform',\n 'image-rendering': 'imageSmoothing',\n 'text-decoration-thickness': TEXT_DECORATION_THICKNESS,\n },\n fSize = 'font-size',\n cPath = 'clip-path';\n\nexport const svgValidTagNamesRegEx = getSvgRegex(svgValidTagNames);\n\nexport const svgViewBoxElementsRegEx = getSvgRegex(svgViewBoxElements);\n\nexport const svgValidParentsRegEx = getSvgRegex(svgValidParents);\n\n// http://www.w3.org/TR/SVG/coords.html#ViewBoxAttribute\n\nexport const reViewBoxAttrValue = new RegExp(\n String.raw`^\\s*(${reNum})${viewportSeparator}(${reNum})${viewportSeparator}(${reNum})${viewportSeparator}(${reNum})\\s*$`,\n);\n","import { classRegistry } from './ClassRegistry';\nimport { Color } from './color/Color';\nimport { config } from './config';\nimport { reNum } from './parser/constants';\nimport { Point } from './Point';\nimport type { FabricObject } from './shapes/Object/FabricObject';\nimport type { TClassProperties } from './typedefs';\nimport { uid } from './util/internals/uid';\nimport { pickBy } from './util/misc/pick';\nimport { degreesToRadians } from './util/misc/radiansDegreesConversion';\nimport { toFixed } from './util/misc/toFixed';\nimport { rotateVector } from './util/misc/vectors';\n\n/**\n * Regex matching shadow offsetX, offsetY and blur (ex: \"2px 2px 10px rgba(0,0,0,0.2)\", \"rgb(0,255,0) 2px 2px\")\n * - (?:\\s|^): This part captures either a whitespace character (\\s) or the beginning of a line (^). It's non-capturing (due to (?:...)), meaning it doesn't create a capturing group.\n * - (-?\\d+(?:\\.\\d*)?(?:px)?(?:\\s?|$))?: This captures the first component of the shadow, which is the horizontal offset. Breaking it down:\n * - (-?\\d+): Captures an optional minus sign followed by one or more digits (integer part of the number).\n * - (?:\\.\\d*)?: Optionally captures a decimal point followed by zero or more digits (decimal part of the number).\n * - (?:px)?: Optionally captures the \"px\" unit.\n * - (?:\\s?|$): Captures either an optional whitespace or the end of the line. This whole part is wrapped in a non-capturing group and marked as optional with ?.\n * - (-?\\d+(?:\\.\\d*)?(?:px)?(?:\\s?|$))?: Similar to the previous step, this captures the vertical offset.\n\n(\\d+(?:\\.\\d*)?(?:px)?)?: This captures the blur radius. It's similar to the horizontal offset but without the optional minus sign.\n\n(?:\\s+(-?\\d+(?:\\.\\d*)?(?:px)?(?:\\s?|$))?){0,1}: This captures an optional part for the color. It allows for whitespace followed by a component with an optional minus sign, digits, decimal point, and \"px\" unit.\n\n(?:$|\\s): This captures either the end of the line or a whitespace character. It ensures that the match ends either at the end of the string or with a whitespace character.\n */\n// eslint-disable-next-line max-len\n\nconst shadowOffsetRegex = '(-?\\\\d+(?:\\\\.\\\\d*)?(?:px)?(?:\\\\s?|$))?';\n\nconst reOffsetsAndBlur = new RegExp(\n '(?:\\\\s|^)' +\n shadowOffsetRegex +\n shadowOffsetRegex +\n '(' +\n reNum +\n '?(?:px)?)?(?:\\\\s?|$)(?:$|\\\\s)',\n);\n\nexport const shadowDefaultValues: Partial> = {\n color: 'rgb(0,0,0)',\n blur: 0,\n offsetX: 0,\n offsetY: 0,\n affectStroke: false,\n includeDefaultValues: true,\n nonScaling: false,\n};\n\nexport type SerializedShadowOptions = {\n color: string;\n blur: number;\n offsetX: number;\n offsetY: number;\n affectStroke: boolean;\n nonScaling: boolean;\n type: string;\n};\n\nexport class Shadow {\n /**\n * Shadow color\n * @type String\n */\n declare color: string;\n\n /**\n * Shadow blur\n * @type Number\n */\n declare blur: number;\n\n /**\n * Shadow horizontal offset\n * @type Number\n */\n declare offsetX: number;\n\n /**\n * Shadow vertical offset\n * @type Number\n */\n declare offsetY: number;\n\n /**\n * Whether the shadow should affect stroke operations\n * @type Boolean\n */\n declare affectStroke: boolean;\n\n /**\n * Indicates whether toObject should include default values\n * @type Boolean\n */\n declare includeDefaultValues: boolean;\n\n /**\n * When `false`, the shadow will scale with the object.\n * When `true`, the shadow's offsetX, offsetY, and blur will not be affected by the object's scale.\n * default to false\n * @type Boolean\n */\n declare nonScaling: boolean;\n\n declare id: number;\n\n static ownDefaults = shadowDefaultValues;\n\n static type = 'shadow';\n\n /**\n * @see {@link http://fabric5.fabricjs.com/shadows|Shadow demo}\n * @param {Object|String} [options] Options object with any of color, blur, offsetX, offsetY properties or string (e.g. \"rgba(0,0,0,0.2) 2px 2px 10px\")\n */\n constructor(options?: Partial>);\n constructor(svgAttribute: string);\n constructor(arg0: string | Partial> = {}) {\n const options: Partial> =\n typeof arg0 === 'string' ? Shadow.parseShadow(arg0) : arg0;\n Object.assign(this, Shadow.ownDefaults, options);\n this.id = uid();\n }\n\n /**\n * @param {String} value Shadow value to parse\n * @return {Object} Shadow object with color, offsetX, offsetY and blur\n */\n static parseShadow(value: string) {\n const shadowStr = value.trim(),\n [, offsetX = 0, offsetY = 0, blur = 0] = (\n reOffsetsAndBlur.exec(shadowStr) || []\n ).map((value) => parseFloat(value) || 0),\n color = (shadowStr.replace(reOffsetsAndBlur, '') || 'rgb(0,0,0)').trim();\n\n return {\n color,\n offsetX,\n offsetY,\n blur,\n };\n }\n\n /**\n * Returns a string representation of an instance\n * @see http://www.w3.org/TR/css-text-decor-3/#text-shadow\n * @return {String} Returns CSS3 text-shadow declaration\n */\n toString() {\n return [this.offsetX, this.offsetY, this.blur, this.color].join('px ');\n }\n\n /**\n * Returns SVG representation of a shadow\n * @param {FabricObject} object\n * @return {String} SVG representation of a shadow\n */\n toSVG(object: FabricObject) {\n const offset = rotateVector(\n new Point(this.offsetX, this.offsetY),\n degreesToRadians(-object.angle),\n ),\n BLUR_BOX = 20,\n color = new Color(this.color);\n let fBoxX = 40,\n fBoxY = 40;\n\n if (object.width && object.height) {\n //http://www.w3.org/TR/SVG/filters.html#FilterEffectsRegion\n // we add some extra space to filter box to contain the blur ( 20 )\n fBoxX =\n toFixed(\n (Math.abs(offset.x) + this.blur) / object.width,\n config.NUM_FRACTION_DIGITS,\n ) *\n 100 +\n BLUR_BOX;\n fBoxY =\n toFixed(\n (Math.abs(offset.y) + this.blur) / object.height,\n config.NUM_FRACTION_DIGITS,\n ) *\n 100 +\n BLUR_BOX;\n }\n if (object.flipX) {\n offset.x *= -1;\n }\n if (object.flipY) {\n offset.y *= -1;\n }\n\n return `\\n\\t\\n\\t\\n\\t\\n\\t\\n\\t\\n\\t\\t\\n\\t\\t\\n\\t\\n\\n`;\n }\n\n /**\n * Returns object representation of a shadow\n * @return {Object} Object representation of a shadow instance\n */\n toObject() {\n const data: SerializedShadowOptions = {\n color: this.color,\n blur: this.blur,\n offsetX: this.offsetX,\n offsetY: this.offsetY,\n affectStroke: this.affectStroke,\n nonScaling: this.nonScaling,\n type: (this.constructor as typeof Shadow).type,\n };\n const defaults = Shadow.ownDefaults as SerializedShadowOptions;\n return !this.includeDefaultValues\n ? pickBy(data, (value, key) => value !== defaults[key])\n : data;\n }\n\n static async fromObject(options: Partial>) {\n return new this(options);\n }\n}\n\nclassRegistry.setClass(Shadow, 'shadow');\n","export const capValue = (min: number, value: number, max: number) =>\n Math.max(min, Math.min(value, max));\n","import {\n TOP,\n LEFT,\n SCALE_Y,\n SCALE_X,\n SKEW_X,\n SKEW_Y,\n FILL,\n STROKE,\n} from '../../constants';\nimport type { TClassProperties } from '../../typedefs';\nimport type { InteractiveFabricObject } from './InteractiveObject';\nimport type { FabricObject } from './Object';\n\nexport const stateProperties = [\n TOP,\n LEFT,\n SCALE_X,\n SCALE_Y,\n 'flipX',\n 'flipY',\n 'originX',\n 'originY',\n 'angle',\n 'opacity',\n 'globalCompositeOperation',\n 'shadow',\n 'visible',\n SKEW_X,\n SKEW_Y,\n];\n\nexport const cacheProperties = [\n FILL,\n STROKE,\n 'strokeWidth',\n 'strokeDashArray',\n 'width',\n 'height',\n 'paintFirst',\n 'strokeUniform',\n 'strokeLineCap',\n 'strokeDashOffset',\n 'strokeLineJoin',\n 'strokeMiterLimit',\n 'backgroundColor',\n 'clipPath',\n];\n\nexport const fabricObjectDefaultValues: Partial<\n TClassProperties\n> = {\n // see composeMatrix() to see order of transforms. First defaults listed based on this\n top: 0,\n left: 0,\n width: 0,\n height: 0,\n angle: 0,\n flipX: false,\n flipY: false,\n scaleX: 1,\n scaleY: 1,\n minScaleLimit: 0,\n skewX: 0,\n skewY: 0,\n originX: LEFT,\n originY: TOP,\n strokeWidth: 1,\n strokeUniform: false,\n padding: 0,\n opacity: 1,\n paintFirst: FILL,\n fill: 'rgb(0,0,0)',\n fillRule: 'nonzero',\n stroke: null,\n strokeDashArray: null,\n strokeDashOffset: 0,\n strokeLineCap: 'butt',\n strokeLineJoin: 'miter',\n strokeMiterLimit: 4,\n globalCompositeOperation: 'source-over',\n backgroundColor: '',\n shadow: null,\n visible: true,\n includeDefaultValues: true,\n excludeFromExport: false,\n objectCaching: true,\n clipPath: undefined,\n inverted: false,\n absolutePositioned: false,\n centeredRotation: true,\n centeredScaling: false,\n dirty: true,\n} as const;\n\nexport const interactiveObjectDefaultValues: Partial<\n TClassProperties\n> = {\n noScaleCache: true,\n lockMovementX: false,\n lockMovementY: false,\n lockRotation: false,\n lockScalingX: false,\n lockScalingY: false,\n lockSkewingX: false,\n lockSkewingY: false,\n lockScalingFlip: false,\n cornerSize: 13,\n touchCornerSize: 24,\n transparentCorners: true,\n cornerColor: 'rgb(178,204,255)',\n cornerStrokeColor: '',\n cornerStyle: 'rect',\n cornerDashArray: null,\n hasControls: true,\n borderColor: 'rgb(178,204,255)',\n borderDashArray: null,\n borderOpacityWhenMoving: 0.4,\n borderScaleFactor: 1,\n hasBorders: true,\n selectionBackgroundColor: '',\n selectable: true,\n evented: true,\n perPixelTargetFind: false,\n activeOn: 'down',\n hoverCursor: null,\n moveCursor: null,\n};\n","/**\n * Easing functions\n * @see {@link http://gizma.com/easing/ Easing Equations by Robert Penner}\n */\n\nimport { twoMathPi, halfPI } from '../../constants';\nimport type { TEasingFunction } from './types';\n\nconst normalize = (a: number, c: number, p: number, s: number) => {\n if (a < Math.abs(c)) {\n a = c;\n s = p / 4;\n } else {\n //handle the 0/0 case:\n if (c === 0 && a === 0) {\n s = (p / twoMathPi) * Math.asin(1);\n } else {\n s = (p / twoMathPi) * Math.asin(c / a);\n }\n }\n return { a, c, p, s };\n};\n\nconst elastic = (\n a: number,\n s: number,\n p: number,\n t: number,\n d: number,\n): number =>\n a * Math.pow(2, 10 * (t -= 1)) * Math.sin(((t * d - s) * twoMathPi) / p);\n\n/**\n * Default sinusoidal easing\n */\nexport const defaultEasing: TEasingFunction = (t, b, c, d) =>\n -c * Math.cos((t / d) * halfPI) + c + b;\n\n/**\n * Cubic easing in\n */\nexport const easeInCubic: TEasingFunction = (t, b, c, d) =>\n c * (t / d) ** 3 + b;\n\n/**\n * Cubic easing out\n */\nexport const easeOutCubic: TEasingFunction = (t, b, c, d) =>\n c * ((t / d - 1) ** 3 + 1) + b;\n\n/**\n * Cubic easing in and out\n */\nexport const easeInOutCubic: TEasingFunction = (t, b, c, d) => {\n t /= d / 2;\n if (t < 1) {\n return (c / 2) * t ** 3 + b;\n }\n return (c / 2) * ((t - 2) ** 3 + 2) + b;\n};\n\n/**\n * Quartic easing in\n */\nexport const easeInQuart: TEasingFunction = (t, b, c, d) =>\n c * (t /= d) * t ** 3 + b;\n\n/**\n * Quartic easing out\n */\nexport const easeOutQuart: TEasingFunction = (t, b, c, d) =>\n -c * ((t = t / d - 1) * t ** 3 - 1) + b;\n\n/**\n * Quartic easing in and out\n */\nexport const easeInOutQuart: TEasingFunction = (t, b, c, d) => {\n t /= d / 2;\n if (t < 1) {\n return (c / 2) * t ** 4 + b;\n }\n return (-c / 2) * ((t -= 2) * t ** 3 - 2) + b;\n};\n\n/**\n * Quintic easing in\n */\nexport const easeInQuint: TEasingFunction = (t, b, c, d) =>\n c * (t / d) ** 5 + b;\n\n/**\n * Quintic easing out\n */\nexport const easeOutQuint: TEasingFunction = (t, b, c, d) =>\n c * ((t / d - 1) ** 5 + 1) + b;\n\n/**\n * Quintic easing in and out\n */\nexport const easeInOutQuint: TEasingFunction = (t, b, c, d) => {\n t /= d / 2;\n if (t < 1) {\n return (c / 2) * t ** 5 + b;\n }\n return (c / 2) * ((t - 2) ** 5 + 2) + b;\n};\n\n/**\n * Sinusoidal easing in\n */\nexport const easeInSine: TEasingFunction = (t, b, c, d) =>\n -c * Math.cos((t / d) * halfPI) + c + b;\n\n/**\n * Sinusoidal easing out\n */\nexport const easeOutSine: TEasingFunction = (t, b, c, d) =>\n c * Math.sin((t / d) * halfPI) + b;\n\n/**\n * Sinusoidal easing in and out\n */\nexport const easeInOutSine: TEasingFunction = (t, b, c, d) =>\n (-c / 2) * (Math.cos((Math.PI * t) / d) - 1) + b;\n\n/**\n * Exponential easing in\n */\nexport const easeInExpo: TEasingFunction = (t, b, c, d) =>\n t === 0 ? b : c * 2 ** (10 * (t / d - 1)) + b;\n\n/**\n * Exponential easing out\n */\nexport const easeOutExpo: TEasingFunction = (t, b, c, d) =>\n t === d ? b + c : c * -(2 ** ((-10 * t) / d) + 1) + b;\n\n/**\n * Exponential easing in and out\n */\nexport const easeInOutExpo: TEasingFunction = (t, b, c, d) => {\n if (t === 0) {\n return b;\n }\n if (t === d) {\n return b + c;\n }\n t /= d / 2;\n if (t < 1) {\n return (c / 2) * 2 ** (10 * (t - 1)) + b;\n }\n return (c / 2) * -(2 ** (-10 * --t) + 2) + b;\n};\n\n/**\n * Circular easing in\n */\nexport const easeInCirc: TEasingFunction = (t, b, c, d) =>\n -c * (Math.sqrt(1 - (t /= d) * t) - 1) + b;\n\n/**\n * Circular easing out\n */\nexport const easeOutCirc: TEasingFunction = (t, b, c, d) =>\n c * Math.sqrt(1 - (t = t / d - 1) * t) + b;\n\n/**\n * Circular easing in and out\n */\nexport const easeInOutCirc: TEasingFunction = (t, b, c, d) => {\n t /= d / 2;\n if (t < 1) {\n return (-c / 2) * (Math.sqrt(1 - t ** 2) - 1) + b;\n }\n return (c / 2) * (Math.sqrt(1 - (t -= 2) * t) + 1) + b;\n};\n\n/**\n * Elastic easing in\n */\nexport const easeInElastic: TEasingFunction = (t, b, c, d) => {\n const s = 1.70158,\n a = c;\n let p = 0;\n if (t === 0) {\n return b;\n }\n t /= d;\n if (t === 1) {\n return b + c;\n }\n if (!p) {\n p = d * 0.3;\n }\n const { a: normA, s: normS, p: normP } = normalize(a, c, p, s);\n return -elastic(normA, normS, normP, t, d) + b;\n};\n\n/**\n * Elastic easing out\n */\nexport const easeOutElastic: TEasingFunction = (t, b, c, d) => {\n const s = 1.70158,\n a = c;\n let p = 0;\n if (t === 0) {\n return b;\n }\n t /= d;\n if (t === 1) {\n return b + c;\n }\n if (!p) {\n p = d * 0.3;\n }\n const { a: normA, s: normS, p: normP, c: normC } = normalize(a, c, p, s);\n return (\n normA * 2 ** (-10 * t) * Math.sin(((t * d - normS) * twoMathPi) / normP) +\n normC +\n b\n );\n};\n\n/**\n * Elastic easing in and out\n */\nexport const easeInOutElastic: TEasingFunction = (t, b, c, d) => {\n const s = 1.70158,\n a = c;\n let p = 0;\n if (t === 0) {\n return b;\n }\n t /= d / 2;\n if (t === 2) {\n return b + c;\n }\n if (!p) {\n p = d * (0.3 * 1.5);\n }\n const { a: normA, s: normS, p: normP, c: normC } = normalize(a, c, p, s);\n if (t < 1) {\n return -0.5 * elastic(normA, normS, normP, t, d) + b;\n }\n return (\n normA *\n Math.pow(2, -10 * (t -= 1)) *\n Math.sin(((t * d - normS) * twoMathPi) / normP) *\n 0.5 +\n normC +\n b\n );\n};\n\n/**\n * Backwards easing in\n */\nexport const easeInBack: TEasingFunction = (t, b, c, d, s = 1.70158) =>\n c * (t /= d) * t * ((s + 1) * t - s) + b;\n\n/**\n * Backwards easing out\n */\nexport const easeOutBack: TEasingFunction = (t, b, c, d, s = 1.70158) =>\n c * ((t = t / d - 1) * t * ((s + 1) * t + s) + 1) + b;\n\n/**\n * Backwards easing in and out\n */\nexport const easeInOutBack: TEasingFunction = (t, b, c, d, s = 1.70158) => {\n t /= d / 2;\n if (t < 1) {\n return (c / 2) * (t * t * (((s *= 1.525) + 1) * t - s)) + b;\n }\n return (c / 2) * ((t -= 2) * t * (((s *= 1.525) + 1) * t + s) + 2) + b;\n};\n\n/**\n * Bouncing easing out\n */\nexport const easeOutBounce: TEasingFunction = (t, b, c, d) => {\n if ((t /= d) < 1 / 2.75) {\n return c * (7.5625 * t * t) + b;\n } else if (t < 2 / 2.75) {\n return c * (7.5625 * (t -= 1.5 / 2.75) * t + 0.75) + b;\n } else if (t < 2.5 / 2.75) {\n return c * (7.5625 * (t -= 2.25 / 2.75) * t + 0.9375) + b;\n } else {\n return c * (7.5625 * (t -= 2.625 / 2.75) * t + 0.984375) + b;\n }\n};\n\n/**\n * Bouncing easing in\n */\nexport const easeInBounce: TEasingFunction = (t, b, c, d) =>\n c - easeOutBounce(d - t, 0, c, d) + b;\n\n/**\n * Bouncing easing in and out\n */\nexport const easeInOutBounce: TEasingFunction = (t, b, c, d) =>\n t < d / 2\n ? easeInBounce(t * 2, 0, c, d) * 0.5 + b\n : easeOutBounce(t * 2 - d, 0, c, d) * 0.5 + c * 0.5 + b;\n\n/**\n * Quadratic easing in\n */\nexport const easeInQuad: TEasingFunction = (t, b, c, d) => c * (t /= d) * t + b;\n\n/**\n * Quadratic easing out\n */\nexport const easeOutQuad: TEasingFunction = (t, b, c, d) =>\n -c * (t /= d) * (t - 2) + b;\n\n/**\n * Quadratic easing in and out\n */\nexport const easeInOutQuad: TEasingFunction = (t, b, c, d) => {\n t /= d / 2;\n if (t < 1) {\n return (c / 2) * t ** 2 + b;\n }\n return (-c / 2) * (--t * (t - 2) - 1) + b;\n};\n","import { noop } from '../../constants';\nimport { requestAnimFrame } from './AnimationFrameProvider';\nimport { runningAnimations } from './AnimationRegistry';\nimport { defaultEasing } from './easing';\nimport type {\n AnimationState,\n TAbortCallback,\n TBaseAnimationOptions,\n TEasingFunction,\n TOnAnimationChangeCallback,\n} from './types';\n\nconst defaultAbort = () => false;\n\nexport abstract class AnimationBase<\n T extends number | number[] = number | number[],\n> {\n declare readonly startValue: T;\n declare readonly endValue: T;\n declare readonly duration: number;\n declare readonly delay: number;\n\n declare protected readonly byValue: T;\n declare protected readonly easing: TEasingFunction;\n\n declare private readonly _onStart: VoidFunction;\n declare private readonly _onChange: TOnAnimationChangeCallback;\n declare private readonly _onComplete: TOnAnimationChangeCallback;\n declare private readonly _abort: TAbortCallback;\n\n /**\n * Used to register the animation to a target object\n * so that it can be cancelled within the object context\n */\n declare readonly target?: unknown;\n\n private _state: AnimationState = 'pending';\n /**\n * Time %, or the ratio of `timeElapsed / duration`\n * @see tick\n */\n durationProgress = 0;\n /**\n * Value %, or the ratio of `(currentValue - startValue) / (endValue - startValue)`\n */\n valueProgress = 0;\n /**\n * Current value\n */\n declare value: T;\n /**\n * Animation start time ms\n */\n declare private startTime: number;\n\n constructor({\n startValue,\n byValue,\n duration = 500,\n delay = 0,\n easing = defaultEasing,\n onStart = noop,\n onChange = noop,\n onComplete = noop,\n abort = defaultAbort,\n target,\n }: TBaseAnimationOptions) {\n this.tick = this.tick.bind(this);\n\n this.duration = duration;\n this.delay = delay;\n this.easing = easing;\n this._onStart = onStart;\n this._onChange = onChange;\n this._onComplete = onComplete;\n this._abort = abort;\n this.target = target;\n\n this.startValue = startValue;\n this.byValue = byValue;\n this.value = this.startValue;\n this.endValue = Object.freeze(this.calculate(this.duration).value);\n }\n\n get state() {\n return this._state;\n }\n\n isDone() {\n return this._state === 'aborted' || this._state === 'completed';\n }\n\n /**\n * Calculate the current value based on the easing parameters\n * @param timeElapsed in ms\n * @protected\n */\n protected abstract calculate(timeElapsed: number): {\n value: T;\n valueProgress: number;\n };\n\n start() {\n const firstTick: FrameRequestCallback = (timestamp) => {\n if (this._state !== 'pending') return;\n this.startTime = timestamp || +new Date();\n this._state = 'running';\n this._onStart();\n this.tick(this.startTime);\n };\n\n this.register();\n\n // setTimeout(cb, 0) will run cb on the next frame, causing a delay\n // we don't want that\n if (this.delay > 0) {\n setTimeout(() => requestAnimFrame(firstTick), this.delay);\n } else {\n requestAnimFrame(firstTick);\n }\n }\n\n private tick(t: number) {\n const durationMs = (t || +new Date()) - this.startTime;\n const boundDurationMs = Math.min(durationMs, this.duration);\n this.durationProgress = boundDurationMs / this.duration;\n const { value, valueProgress } = this.calculate(boundDurationMs);\n this.value = Object.freeze(value);\n this.valueProgress = valueProgress;\n\n if (this._state === 'aborted') {\n return;\n } else if (\n this._abort(this.value, this.valueProgress, this.durationProgress)\n ) {\n this._state = 'aborted';\n this.unregister();\n } else if (durationMs >= this.duration) {\n this.durationProgress = this.valueProgress = 1;\n this._onChange(this.endValue, this.valueProgress, this.durationProgress);\n this._state = 'completed';\n this._onComplete(\n this.endValue,\n this.valueProgress,\n this.durationProgress,\n );\n this.unregister();\n } else {\n this._onChange(this.value, this.valueProgress, this.durationProgress);\n requestAnimFrame(this.tick);\n }\n }\n\n private register() {\n runningAnimations.push(this as unknown as AnimationBase);\n }\n\n private unregister() {\n runningAnimations.remove(this as unknown as AnimationBase);\n }\n\n abort() {\n this._state = 'aborted';\n this.unregister();\n }\n}\n","import { AnimationBase } from './AnimationBase';\nimport type { ValueAnimationOptions } from './types';\n\nexport class ValueAnimation extends AnimationBase {\n constructor({\n startValue = 0,\n endValue = 100,\n ...otherOptions\n }: ValueAnimationOptions) {\n super({\n ...otherOptions,\n startValue,\n byValue: endValue - startValue,\n });\n }\n\n protected calculate(timeElapsed: number) {\n const value = this.easing(\n timeElapsed,\n this.startValue,\n this.byValue,\n this.duration,\n );\n return {\n value,\n valueProgress: Math.abs((value - this.startValue) / this.byValue),\n };\n }\n}\n","import { AnimationBase } from './AnimationBase';\nimport type { ArrayAnimationOptions } from './types';\n\nexport class ArrayAnimation extends AnimationBase {\n constructor({\n startValue = [0],\n endValue = [100],\n ...options\n }: ArrayAnimationOptions) {\n super({\n ...options,\n startValue,\n byValue: endValue.map((value, i) => value - startValue[i]),\n });\n }\n protected calculate(timeElapsed: number) {\n const values = this.startValue.map((value, i) =>\n this.easing(timeElapsed, value, this.byValue[i], this.duration, i),\n );\n return {\n value: values,\n valueProgress: Math.abs(\n (values[0] - this.startValue[0]) / this.byValue[0],\n ),\n };\n }\n}\n","import { Color } from '../../color/Color';\nimport type { TRGBAColorSource } from '../../color/typedefs';\nimport { halfPI } from '../../constants';\nimport { capValue } from '../misc/capValue';\nimport { AnimationBase } from './AnimationBase';\nimport type {\n ColorAnimationOptions,\n TEasingFunction,\n TOnAnimationChangeCallback,\n} from './types';\n\nconst defaultColorEasing: TEasingFunction = (\n timeElapsed,\n startValue,\n byValue,\n duration,\n) => {\n const durationProgress = 1 - Math.cos((timeElapsed / duration) * halfPI);\n return startValue + byValue * durationProgress;\n};\n\nconst wrapColorCallback = (\n callback?: TOnAnimationChangeCallback,\n) =>\n callback &&\n ((rgba: TRGBAColorSource, valueProgress: number, durationProgress: number) =>\n callback(new Color(rgba).toRgba(), valueProgress, durationProgress));\n\nexport class ColorAnimation extends AnimationBase {\n constructor({\n startValue,\n endValue,\n easing = defaultColorEasing,\n onChange,\n onComplete,\n abort,\n ...options\n }: ColorAnimationOptions) {\n const startColor = new Color(startValue).getSource();\n const endColor = new Color(endValue).getSource();\n super({\n ...options,\n startValue: startColor,\n byValue: endColor.map(\n (value, i) => value - startColor[i],\n ) as TRGBAColorSource,\n easing,\n onChange: wrapColorCallback(onChange),\n onComplete: wrapColorCallback(onComplete),\n abort: wrapColorCallback(abort),\n });\n }\n protected calculate(timeElapsed: number) {\n const [r, g, b, a] = this.startValue.map((value, i) =>\n this.easing(timeElapsed, value, this.byValue[i], this.duration, i),\n ) as TRGBAColorSource;\n const value = [\n ...[r, g, b].map(Math.round),\n capValue(0, a, 1),\n ] as TRGBAColorSource;\n return {\n value,\n valueProgress:\n // to correctly calculate the change ratio we must find a changed value\n value\n .map((p, i) =>\n this.byValue[i] !== 0\n ? Math.abs((p - this.startValue[i]) / this.byValue[i])\n : 0,\n )\n .find((p) => p !== 0) || 0,\n };\n }\n}\n","import { ValueAnimation } from './ValueAnimation';\nimport { ArrayAnimation } from './ArrayAnimation';\nimport { ColorAnimation } from './ColorAnimation';\nimport type {\n ValueAnimationOptions,\n ArrayAnimationOptions,\n ColorAnimationOptions,\n} from './types';\nimport type { TColorArg } from '../../color/typedefs';\n\nexport type TAnimation =\n T extends TColorArg\n ? ColorAnimation\n : T extends number[]\n ? ArrayAnimation\n : ValueAnimation;\n\nconst isArrayAnimation = (\n options: ArrayAnimationOptions | ValueAnimationOptions,\n): options is ArrayAnimationOptions => {\n return Array.isArray(options.startValue) || Array.isArray(options.endValue);\n};\n\n/**\n * Changes value(s) from startValue to endValue within a certain period of time,\n * invoking callbacks as the value(s) change.\n *\n * @example\n * animate({\n * startValue: 1,\n * endValue: 0,\n * onChange: (v) => {\n * obj.set('opacity', v);\n * // since we are running in a requested frame we should call `renderAll` and not `requestRenderAll`\n * canvas.renderAll();\n * }\n * });\n *\n * @example Using lists:\n * animate({\n * startValue: [1, 2, 3],\n * endValue: [2, 4, 6],\n * onChange: ([x, y, zoom]) => {\n * canvas.zoomToPoint(new Point(x, y), zoom);\n * canvas.renderAll();\n * }\n * });\n *\n */\nexport function animate(options: ArrayAnimationOptions): ArrayAnimation;\nexport function animate(options: ValueAnimationOptions): ValueAnimation;\nexport function animate<\n T extends ValueAnimationOptions | ArrayAnimationOptions,\n>(\n options: T,\n): T extends ArrayAnimationOptions ? ArrayAnimation : ValueAnimation;\nexport function animate<\n T extends ValueAnimationOptions | ArrayAnimationOptions,\n R extends T extends ArrayAnimationOptions ? ArrayAnimation : ValueAnimation,\n>(options: T): R {\n const animation = (\n isArrayAnimation(options)\n ? new ArrayAnimation(options)\n : new ValueAnimation(options)\n ) as R;\n animation.start();\n return animation;\n}\n\nexport function animateColor(options: ColorAnimationOptions) {\n const animation = new ColorAnimation(options);\n animation.start();\n return animation;\n}\n","import { Point } from './Point';\nimport { createVector } from './util/misc/vectors';\n\n/* Adaptation of work of Kevin Lindsey (kevin@kevlindev.com) */\n\nexport type IntersectionType = 'Intersection' | 'Coincident' | 'Parallel';\n\nexport class Intersection {\n declare points: Point[];\n\n declare status?: IntersectionType;\n\n constructor(status?: IntersectionType) {\n this.status = status;\n this.points = [];\n }\n\n /**\n * Used to verify if a point is alredy in the collection\n * @param {Point} point\n * @returns {boolean}\n */\n private includes(point: Point): boolean {\n return this.points.some((p) => p.eq(point));\n }\n\n /**\n * Appends points of intersection\n * @param {...Point[]} points\n * @return {Intersection} thisArg\n */\n private append(...points: Point[]): Intersection {\n this.points = this.points.concat(\n points.filter((point) => {\n return !this.includes(point);\n }),\n );\n return this;\n }\n\n /**\n * check if point T is on the segment or line defined between A and B\n *\n * @param {Point} T the point we are checking for\n * @param {Point} A one extremity of the segment\n * @param {Point} B the other extremity of the segment\n * @param [infinite] if true checks if `T` is on the line defined by `A` and `B`\n * @returns true if `T` is contained\n */\n static isPointContained(T: Point, A: Point, B: Point, infinite = false) {\n if (A.eq(B)) {\n // Edge case: the segment is a point, we check for coincidence,\n // infinite param has no meaning because there are infinite lines to consider\n return T.eq(A);\n } else if (A.x === B.x) {\n // Edge case: horizontal line.\n // we first check if T.x has the same value, and then if T.y is contained between A.y and B.y\n return (\n T.x === A.x &&\n (infinite || (T.y >= Math.min(A.y, B.y) && T.y <= Math.max(A.y, B.y)))\n );\n } else if (A.y === B.y) {\n // Edge case: vertical line.\n // we first check if T.y has the same value, and then if T.x is contained between A.x and B.x\n return (\n T.y === A.y &&\n (infinite || (T.x >= Math.min(A.x, B.x) && T.x <= Math.max(A.x, B.x)))\n );\n } else {\n // Generic case: sloped line.\n // we check that AT has the same slope as AB\n // for the segment case we need both the vectors to have the same direction and for AT to be lte AB in size\n // for the infinite case we check the absolute value of the slope, since direction is meaningless\n const AB = createVector(A, B);\n const AT = createVector(A, T);\n const s = AT.divide(AB);\n return infinite\n ? Math.abs(s.x) === Math.abs(s.y)\n : s.x === s.y && s.x >= 0 && s.x <= 1;\n }\n }\n\n /**\n * Use the ray casting algorithm to determine if point is in the polygon defined by points\n * @see https://en.wikipedia.org/wiki/Point_in_polygon\n * @param point\n * @param points polygon points\n * @returns\n */\n static isPointInPolygon(point: Point, points: Point[]) {\n const other = new Point(point).setX(\n Math.min(point.x - 1, ...points.map((p) => p.x)),\n );\n let hits = 0;\n for (let index = 0; index < points.length; index++) {\n const inter = this.intersectSegmentSegment(\n // polygon side\n points[index],\n points[(index + 1) % points.length],\n // ray\n point,\n other,\n );\n if (inter.includes(point)) {\n // point is on the polygon side\n return true;\n }\n hits += Number(inter.status === 'Intersection');\n }\n return hits % 2 === 1;\n }\n\n /**\n * Checks if a line intersects another\n * @see {@link https://en.wikipedia.org/wiki/Line%E2%80%93line_intersection line intersection}\n * @see {@link https://en.wikipedia.org/wiki/Cramer%27s_rule Cramer's rule}\n * @param {Point} a1\n * @param {Point} a2\n * @param {Point} b1\n * @param {Point} b2\n * @param {boolean} [aInfinite=true] check segment intersection by passing `false`\n * @param {boolean} [bInfinite=true] check segment intersection by passing `false`\n * @return {Intersection}\n */\n static intersectLineLine(\n a1: Point,\n a2: Point,\n b1: Point,\n b2: Point,\n aInfinite = true,\n bInfinite = true,\n ): Intersection {\n const a2xa1x = a2.x - a1.x,\n a2ya1y = a2.y - a1.y,\n b2xb1x = b2.x - b1.x,\n b2yb1y = b2.y - b1.y,\n a1xb1x = a1.x - b1.x,\n a1yb1y = a1.y - b1.y,\n uaT = b2xb1x * a1yb1y - b2yb1y * a1xb1x,\n ubT = a2xa1x * a1yb1y - a2ya1y * a1xb1x,\n uB = b2yb1y * a2xa1x - b2xb1x * a2ya1y;\n if (uB !== 0) {\n const ua = uaT / uB,\n ub = ubT / uB;\n if (\n (aInfinite || (0 <= ua && ua <= 1)) &&\n (bInfinite || (0 <= ub && ub <= 1))\n ) {\n return new Intersection('Intersection').append(\n new Point(a1.x + ua * a2xa1x, a1.y + ua * a2ya1y),\n );\n } else {\n return new Intersection();\n }\n } else {\n if (uaT === 0 || ubT === 0) {\n const segmentsCoincide =\n aInfinite ||\n bInfinite ||\n Intersection.isPointContained(a1, b1, b2) ||\n Intersection.isPointContained(a2, b1, b2) ||\n Intersection.isPointContained(b1, a1, a2) ||\n Intersection.isPointContained(b2, a1, a2);\n return new Intersection(segmentsCoincide ? 'Coincident' : undefined);\n } else {\n return new Intersection('Parallel');\n }\n }\n }\n\n /**\n * Checks if a segment intersects a line\n * @see {@link intersectLineLine} for line intersection\n * @param {Point} s1 boundary point of segment\n * @param {Point} s2 other boundary point of segment\n * @param {Point} l1 point on line\n * @param {Point} l2 other point on line\n * @return {Intersection}\n */\n static intersectSegmentLine(\n s1: Point,\n s2: Point,\n l1: Point,\n l2: Point,\n ): Intersection {\n return Intersection.intersectLineLine(s1, s2, l1, l2, false, true);\n }\n\n /**\n * Checks if a segment intersects another\n * @see {@link intersectLineLine} for line intersection\n * @param {Point} a1 boundary point of segment\n * @param {Point} a2 other boundary point of segment\n * @param {Point} b1 boundary point of segment\n * @param {Point} b2 other boundary point of segment\n * @return {Intersection}\n */\n static intersectSegmentSegment(\n a1: Point,\n a2: Point,\n b1: Point,\n b2: Point,\n ): Intersection {\n return Intersection.intersectLineLine(a1, a2, b1, b2, false, false);\n }\n\n /**\n * Checks if line intersects polygon\n *\n * @todo account for stroke\n *\n * @see {@link intersectSegmentPolygon} for segment intersection\n * @param {Point} a1 point on line\n * @param {Point} a2 other point on line\n * @param {Point[]} points polygon points\n * @param {boolean} [infinite=true] check segment intersection by passing `false`\n * @return {Intersection}\n */\n static intersectLinePolygon(\n a1: Point,\n a2: Point,\n points: Point[],\n infinite = true,\n ): Intersection {\n const result = new Intersection();\n const length = points.length;\n\n for (let i = 0, b1, b2, inter; i < length; i++) {\n b1 = points[i];\n b2 = points[(i + 1) % length];\n inter = Intersection.intersectLineLine(a1, a2, b1, b2, infinite, false);\n if (inter.status === 'Coincident') {\n return inter;\n }\n result.append(...inter.points);\n }\n\n if (result.points.length > 0) {\n result.status = 'Intersection';\n }\n\n return result;\n }\n\n /**\n * Checks if segment intersects polygon\n * @see {@link intersectLinePolygon} for line intersection\n * @param {Point} a1 boundary point of segment\n * @param {Point} a2 other boundary point of segment\n * @param {Point[]} points polygon points\n * @return {Intersection}\n */\n static intersectSegmentPolygon(\n a1: Point,\n a2: Point,\n points: Point[],\n ): Intersection {\n return Intersection.intersectLinePolygon(a1, a2, points, false);\n }\n\n /**\n * Checks if polygon intersects another polygon\n *\n * @todo account for stroke\n *\n * @param {Point[]} points1\n * @param {Point[]} points2\n * @return {Intersection}\n */\n static intersectPolygonPolygon(\n points1: Point[],\n points2: Point[],\n ): Intersection {\n const result = new Intersection(),\n length = points1.length;\n const coincidences: Intersection[] = [];\n\n for (let i = 0; i < length; i++) {\n const a1 = points1[i],\n a2 = points1[(i + 1) % length],\n inter = Intersection.intersectSegmentPolygon(a1, a2, points2);\n if (inter.status === 'Coincident') {\n coincidences.push(inter);\n result.append(a1, a2);\n } else {\n result.append(...inter.points);\n }\n }\n\n if (coincidences.length > 0 && coincidences.length === points1.length) {\n return new Intersection('Coincident');\n } else if (result.points.length > 0) {\n result.status = 'Intersection';\n }\n\n return result;\n }\n\n /**\n * Checks if polygon intersects rectangle\n * @see {@link intersectPolygonPolygon} for polygon intersection\n * @param {Point[]} points polygon points\n * @param {Point} r1 top left point of rect\n * @param {Point} r2 bottom right point of rect\n * @return {Intersection}\n */\n static intersectPolygonRectangle(\n points: Point[],\n r1: Point,\n r2: Point,\n ): Intersection {\n const min = r1.min(r2),\n max = r1.max(r2),\n topRight = new Point(max.x, min.y),\n bottomLeft = new Point(min.x, max.y);\n\n return Intersection.intersectPolygonPolygon(points, [\n min,\n topRight,\n max,\n bottomLeft,\n ]);\n }\n}\n","import type {\n TBBox,\n TCornerPoint,\n TDegree,\n TMat2D,\n TOriginX,\n TOriginY,\n} from '../../typedefs';\nimport { SCALE_X, SCALE_Y, iMatrix } from '../../constants';\nimport { Intersection } from '../../Intersection';\nimport { Point } from '../../Point';\nimport { makeBoundingBoxFromPoints } from '../../util/misc/boundingBoxFromPoints';\nimport {\n createRotateMatrix,\n createTranslateMatrix,\n composeMatrix,\n invertTransform,\n multiplyTransformMatrices,\n transformPoint,\n calcPlaneRotation,\n} from '../../util/misc/matrix';\nimport { radiansToDegrees } from '../../util/misc/radiansDegreesConversion';\nimport type { Canvas } from '../../canvas/Canvas';\nimport type { StaticCanvas } from '../../canvas/StaticCanvas';\nimport type { ObjectEvents } from '../../EventTypeDefs';\nimport type { ControlProps } from './types/ControlProps';\nimport { resolveOrigin } from '../../util/misc/resolveOrigin';\nimport type { Group } from '../Group';\nimport { calcDimensionsMatrix } from '../../util/misc/matrix';\nimport { sizeAfterTransform } from '../../util/misc/objectTransforms';\nimport { degreesToRadians } from '../../util/misc/radiansDegreesConversion';\nimport { CommonMethods } from '../../CommonMethods';\nimport type { BaseProps } from './types/BaseProps';\nimport type { FillStrokeProps } from './types/FillStrokeProps';\nimport { CENTER, LEFT, TOP } from '../../constants';\n\ntype TMatrixCache = {\n key: number[];\n value: TMat2D;\n};\n\ntype TACoords = TCornerPoint;\n\nexport class ObjectGeometry\n extends CommonMethods\n implements\n Pick,\n BaseProps,\n Pick\n{\n // #region Geometry\n\n declare padding: number;\n\n /**\n * Describe object's corner position in scene coordinates.\n * The coordinates are derived from the following:\n * left, top, width, height, scaleX, scaleY, skewX, skewY, angle, strokeWidth.\n * The coordinates do not depend on viewport changes.\n * The coordinates get updated with {@link setCoords}.\n * You can calculate them without updating with {@link calcACoords()}\n */\n declare aCoords: TACoords;\n\n /**\n * storage cache for object transform matrix\n */\n declare ownMatrixCache?: TMatrixCache;\n\n /**\n * storage cache for object full transform matrix\n */\n declare matrixCache?: TMatrixCache;\n\n /**\n * A Reference of the Canvas where the object is actually added\n * @type StaticCanvas | Canvas;\n * @default undefined\n * @private\n */\n declare canvas?: StaticCanvas | Canvas;\n\n /**\n * @returns {number} x position according to object's originX property in canvas coordinate plane\n */\n getX(): number {\n return this.getXY().x;\n }\n\n /**\n * @param {number} value x position according to object's originX property in canvas coordinate plane\n */\n setX(value: number) {\n this.setXY(this.getXY().setX(value));\n }\n\n /**\n * @returns {number} y position according to object's originY property in canvas coordinate plane\n */\n getY(): number {\n return this.getXY().y;\n }\n\n /**\n * @param {number} value y position according to object's originY property in canvas coordinate plane\n */\n setY(value: number) {\n this.setXY(this.getXY().setY(value));\n }\n\n /**\n * @returns {number} x position according to object's originX property in parent's coordinate plane\\\n * if parent is canvas then this property is identical to {@link getX}\n */\n getRelativeX(): number {\n return this.left;\n }\n\n /**\n * @param {number} value x position according to object's originX property in parent's coordinate plane\\\n * if parent is canvas then this method is identical to {@link setX}\n */\n setRelativeX(value: number) {\n this.left = value;\n }\n\n /**\n * @returns {number} y position according to object's originY property in parent's coordinate plane\\\n * if parent is canvas then this property is identical to {@link getY}\n */\n getRelativeY(): number {\n return this.top;\n }\n\n /**\n * @param {number} value y position according to object's originY property in parent's coordinate plane\\\n * if parent is canvas then this property is identical to {@link setY}\n */\n setRelativeY(value: number) {\n this.top = value;\n }\n\n /**\n * @returns {Point} x position according to object's originX originY properties in canvas coordinate plane\n */\n getXY(): Point {\n const relativePosition = this.getRelativeXY();\n return this.group\n ? transformPoint(relativePosition, this.group.calcTransformMatrix())\n : relativePosition;\n }\n\n /**\n * Set an object position to a particular point, the point is intended in absolute ( canvas ) coordinate.\n * You can specify originX and originY values,\n * that otherwise are the object's current values.\n * @example Set object's bottom left corner to point (5,5) on canvas\n * object.setXY(new Point(5, 5), 'left', 'bottom').\n * @param {Point} point position in scene coordinate plane\n * @param {TOriginX} [originX] Horizontal origin: 'left', 'center' or 'right'\n * @param {TOriginY} [originY] Vertical origin: 'top', 'center' or 'bottom'\n */\n setXY(point: Point, originX?: TOriginX, originY?: TOriginY) {\n if (this.group) {\n point = transformPoint(\n point,\n invertTransform(this.group.calcTransformMatrix()),\n );\n }\n this.setRelativeXY(point, originX, originY);\n }\n\n /**\n * @returns {Point} x,y position according to object's originX originY properties in parent's coordinate plane\n */\n getRelativeXY(): Point {\n return new Point(this.left, this.top);\n }\n\n /**\n * As {@link setXY}, but in current parent's coordinate plane (the current group if any or the canvas)\n * @param {Point} point position according to object's originX originY properties in parent's coordinate plane\n * @param {TOriginX} [originX] Horizontal origin: 'left', 'center' or 'right'\n * @param {TOriginY} [originY] Vertical origin: 'top', 'center' or 'bottom'\n */\n setRelativeXY(\n point: Point,\n originX: TOriginX = this.originX,\n originY: TOriginY = this.originY,\n ) {\n this.setPositionByOrigin(point, originX, originY);\n }\n\n /**\n * @deprecated intermidiate method to be removed, do not use\n */\n protected isStrokeAccountedForInDimensions() {\n return false;\n }\n\n /**\n * @return {Point[]} [tl, tr, br, bl] in the scene plane\n */\n getCoords(): Point[] {\n const { tl, tr, br, bl } =\n this.aCoords || (this.aCoords = this.calcACoords());\n const coords = [tl, tr, br, bl];\n if (this.group) {\n const t = this.group.calcTransformMatrix();\n return coords.map((p) => transformPoint(p, t));\n }\n return coords;\n }\n\n /**\n * Checks if object intersects with the scene rect formed by tl and br\n */\n intersectsWithRect(tl: Point, br: Point): boolean {\n const intersection = Intersection.intersectPolygonRectangle(\n this.getCoords(),\n tl,\n br,\n );\n return intersection.status === 'Intersection';\n }\n\n /**\n * Checks if object intersects with another object\n * @param {Object} other Object to test\n * @return {Boolean} true if object intersects with another object\n */\n intersectsWithObject(other: ObjectGeometry): boolean {\n const intersection = Intersection.intersectPolygonPolygon(\n this.getCoords(),\n other.getCoords(),\n );\n\n return (\n intersection.status === 'Intersection' ||\n intersection.status === 'Coincident' ||\n other.isContainedWithinObject(this) ||\n this.isContainedWithinObject(other)\n );\n }\n\n /**\n * Checks if object is fully contained within area of another object\n * @param {Object} other Object to test\n * @return {Boolean} true if object is fully contained within area of another object\n */\n isContainedWithinObject(other: ObjectGeometry): boolean {\n const points = this.getCoords();\n return points.every((point) => other.containsPoint(point));\n }\n\n /**\n * Checks if object is fully contained within the scene rect formed by tl and br\n */\n isContainedWithinRect(tl: Point, br: Point): boolean {\n const { left, top, width, height } = this.getBoundingRect();\n return (\n left >= tl.x &&\n left + width <= br.x &&\n top >= tl.y &&\n top + height <= br.y\n );\n }\n\n isOverlapping(other: T): boolean {\n return (\n this.intersectsWithObject(other) ||\n this.isContainedWithinObject(other) ||\n other.isContainedWithinObject(this)\n );\n }\n\n /**\n * Checks if point is inside the object\n * @param {Point} point Point to check against\n * @return {Boolean} true if point is inside the object\n */\n containsPoint(point: Point): boolean {\n return Intersection.isPointInPolygon(point, this.getCoords());\n }\n\n /**\n * Checks if object is contained within the canvas with current viewportTransform\n * the check is done stopping at first point that appears on screen\n * @return {Boolean} true if object is fully or partially contained within canvas\n */\n isOnScreen(): boolean {\n if (!this.canvas) {\n return false;\n }\n const { tl, br } = this.canvas.vptCoords;\n const points = this.getCoords();\n // if some point is on screen, the object is on screen.\n if (\n points.some(\n (point) =>\n point.x <= br.x &&\n point.x >= tl.x &&\n point.y <= br.y &&\n point.y >= tl.y,\n )\n ) {\n return true;\n }\n // no points on screen, check intersection with absolute coordinates\n if (this.intersectsWithRect(tl, br)) {\n return true;\n }\n // check if the object is so big that it contains the entire viewport\n return this.containsPoint(tl.midPointFrom(br));\n }\n\n /**\n * Checks if object is partially contained within the canvas with current viewportTransform\n * @return {Boolean} true if object is partially contained within canvas\n */\n isPartiallyOnScreen(): boolean {\n if (!this.canvas) {\n return false;\n }\n const { tl, br } = this.canvas.vptCoords;\n if (this.intersectsWithRect(tl, br)) {\n return true;\n }\n const allPointsAreOutside = this.getCoords().every(\n (point) =>\n (point.x >= br.x || point.x <= tl.x) &&\n (point.y >= br.y || point.y <= tl.y),\n );\n // check if the object is so big that it contains the entire viewport\n return allPointsAreOutside && this.containsPoint(tl.midPointFrom(br));\n }\n\n /**\n * Returns coordinates of object's bounding rectangle (left, top, width, height)\n * the box is intended as aligned to axis of canvas.\n * @return {Object} Object with left, top, width, height properties\n */\n getBoundingRect(): TBBox {\n return makeBoundingBoxFromPoints(this.getCoords());\n }\n\n /**\n * Returns width of an object's bounding box counting transformations\n * @todo shouldn't this account for group transform and return the actual size in canvas coordinate plane?\n * @return {Number} width value\n */\n getScaledWidth(): number {\n return this._getTransformedDimensions().x;\n }\n\n /**\n * Returns height of an object bounding box counting transformations\n * @todo shouldn't this account for group transform and return the actual size in canvas coordinate plane?\n * @return {Number} height value\n */\n getScaledHeight(): number {\n return this._getTransformedDimensions().y;\n }\n\n /**\n * Scales an object (equally by x and y)\n * @param {Number} value Scale factor\n * @return {void}\n */\n scale(value: number): void {\n this._set(SCALE_X, value);\n this._set(SCALE_Y, value);\n this.setCoords();\n }\n\n /**\n * Scales an object to a given width, with respect to bounding box (scaling by x/y equally)\n * @param {Number} value New width value\n * @return {void}\n */\n scaleToWidth(value: number) {\n // adjust to bounding rect factor so that rotated shapes would fit as well\n const boundingRectFactor =\n this.getBoundingRect().width / this.getScaledWidth();\n return this.scale(value / this.width / boundingRectFactor);\n }\n\n /**\n * Scales an object to a given height, with respect to bounding box (scaling by x/y equally)\n * @param {Number} value New height value\n * @return {void}\n */\n scaleToHeight(value: number) {\n // adjust to bounding rect factor so that rotated shapes would fit as well\n const boundingRectFactor =\n this.getBoundingRect().height / this.getScaledHeight();\n return this.scale(value / this.height / boundingRectFactor);\n }\n\n getCanvasRetinaScaling() {\n return this.canvas?.getRetinaScaling() || 1;\n }\n\n /**\n * Returns the object angle relative to canvas counting also the group property\n * @returns {TDegree}\n */\n getTotalAngle(): TDegree {\n return this.group\n ? radiansToDegrees(calcPlaneRotation(this.calcTransformMatrix()))\n : this.angle;\n }\n\n /**\n * Retrieves viewportTransform from Object's canvas if available\n * @return {TMat2D}\n */\n getViewportTransform(): TMat2D {\n return this.canvas?.viewportTransform || (iMatrix.concat() as TMat2D);\n }\n\n /**\n * Calculates the coordinates of the 4 corner of the bbox, in absolute coordinates.\n * those never change with zoom or viewport changes.\n * @return {TCornerPoint}\n */\n calcACoords(): TCornerPoint {\n const rotateMatrix = createRotateMatrix({ angle: this.angle }),\n { x, y } = this.getRelativeCenterPoint(),\n tMatrix = createTranslateMatrix(x, y),\n finalMatrix = multiplyTransformMatrices(tMatrix, rotateMatrix),\n dim = this._getTransformedDimensions(),\n w = dim.x / 2,\n h = dim.y / 2;\n return {\n // corners\n tl: transformPoint({ x: -w, y: -h }, finalMatrix),\n tr: transformPoint({ x: w, y: -h }, finalMatrix),\n bl: transformPoint({ x: -w, y: h }, finalMatrix),\n br: transformPoint({ x: w, y: h }, finalMatrix),\n };\n }\n\n /**\n * Sets corner and controls position coordinates based on current angle, width and height, left and top.\n * aCoords are used to quickly find an object on the canvas.\n * See {@link https://github.com/fabricjs/fabric.js/wiki/When-to-call-setCoords} and {@link http://fabric5.fabricjs.com/fabric-gotchas}\n */\n setCoords(): void {\n this.aCoords = this.calcACoords();\n }\n\n transformMatrixKey(skipGroup = false): number[] {\n let prefix: number[] = [];\n if (!skipGroup && this.group) {\n prefix = this.group.transformMatrixKey(skipGroup);\n }\n prefix.push(\n this.top,\n this.left,\n this.width,\n this.height,\n this.scaleX,\n this.scaleY,\n this.angle,\n this.strokeWidth,\n this.skewX,\n this.skewY,\n +this.flipX,\n +this.flipY,\n resolveOrigin(this.originX),\n resolveOrigin(this.originY),\n );\n\n return prefix;\n }\n\n /**\n * calculate transform matrix that represents the current transformations from the\n * object's properties.\n * @param {Boolean} [skipGroup] return transform matrix for object not counting parent transformations\n * There are some situation in which this is useful to avoid the fake rotation.\n * @return {TMat2D} transform matrix for the object\n */\n calcTransformMatrix(skipGroup = false): TMat2D {\n let matrix = this.calcOwnMatrix();\n if (skipGroup || !this.group) {\n return matrix;\n }\n const key = this.transformMatrixKey(skipGroup),\n cache = this.matrixCache;\n if (cache && cache.key.every((x, i) => x === key[i])) {\n return cache.value;\n }\n if (this.group) {\n matrix = multiplyTransformMatrices(\n this.group.calcTransformMatrix(false),\n matrix,\n );\n }\n this.matrixCache = {\n key,\n value: matrix,\n };\n return matrix;\n }\n\n /**\n * calculate transform matrix that represents the current transformations from the\n * object's properties, this matrix does not include the group transformation\n * @return {TMat2D} transform matrix for the object\n */\n calcOwnMatrix(): TMat2D {\n const key = this.transformMatrixKey(true),\n cache = this.ownMatrixCache;\n if (cache && cache.key === key) {\n return cache.value;\n }\n const center = this.getRelativeCenterPoint(),\n options = {\n angle: this.angle,\n translateX: center.x,\n translateY: center.y,\n scaleX: this.scaleX,\n scaleY: this.scaleY,\n skewX: this.skewX,\n skewY: this.skewY,\n flipX: this.flipX,\n flipY: this.flipY,\n },\n value = composeMatrix(options);\n this.ownMatrixCache = {\n key,\n value,\n };\n return value;\n }\n\n /**\n * Calculate object dimensions from its properties\n * @private\n * @returns {Point} dimensions\n */\n _getNonTransformedDimensions(): Point {\n return new Point(this.width, this.height).scalarAdd(this.strokeWidth);\n }\n\n /**\n * Calculate object dimensions for controls box, including padding and canvas zoom.\n * and active selection\n * @private\n * @param {object} [options] transform options\n * @returns {Point} dimensions\n */\n _calculateCurrentDimensions(options?: any): Point {\n return this._getTransformedDimensions(options)\n .transform(this.getViewportTransform(), true)\n .scalarAdd(2 * this.padding);\n }\n\n // #region Origin\n\n declare top: number;\n declare left: number;\n declare width: number;\n declare height: number;\n declare flipX: boolean;\n declare flipY: boolean;\n declare scaleX: number;\n declare scaleY: number;\n declare skewX: number;\n declare skewY: number;\n /**\n * @deprecated please use 'center' as value in new projects\n * */\n declare originX: TOriginX;\n /**\n * @deprecated please use 'center' as value in new projects\n * */\n declare originY: TOriginY;\n declare angle: TDegree;\n declare strokeWidth: number;\n declare strokeUniform: boolean;\n\n /**\n * Object containing this object.\n * can influence its size and position\n */\n declare group?: Group;\n\n /**\n * Calculate object bounding box dimensions from its properties scale, skew.\n * This bounding box is aligned with object angle and not with canvas axis or screen.\n * @param {Object} [options]\n * @param {Number} [options.scaleX]\n * @param {Number} [options.scaleY]\n * @param {Number} [options.skewX]\n * @param {Number} [options.skewY]\n * @private\n * @returns {Point} dimensions\n */\n _getTransformedDimensions(options: any = {}): Point {\n const dimOptions = {\n // if scaleX or scaleY are negative numbers,\n // this will return dimensions that are negative.\n // and this will break assumptions around the codebase\n scaleX: this.scaleX,\n scaleY: this.scaleY,\n skewX: this.skewX,\n skewY: this.skewY,\n width: this.width,\n height: this.height,\n strokeWidth: this.strokeWidth,\n // TODO remove this spread. is visible in the performance inspection\n ...options,\n };\n // stroke is applied before/after transformations are applied according to `strokeUniform`\n const strokeWidth = dimOptions.strokeWidth;\n let preScalingStrokeValue = strokeWidth,\n postScalingStrokeValue = 0;\n\n if (this.strokeUniform) {\n preScalingStrokeValue = 0;\n postScalingStrokeValue = strokeWidth;\n }\n const dimX = dimOptions.width + preScalingStrokeValue,\n dimY = dimOptions.height + preScalingStrokeValue,\n noSkew = dimOptions.skewX === 0 && dimOptions.skewY === 0;\n let finalDimensions;\n if (noSkew) {\n finalDimensions = new Point(\n dimX * dimOptions.scaleX,\n dimY * dimOptions.scaleY,\n );\n } else {\n finalDimensions = sizeAfterTransform(\n dimX,\n dimY,\n calcDimensionsMatrix(dimOptions),\n );\n }\n\n return finalDimensions.scalarAdd(postScalingStrokeValue);\n }\n\n /**\n * Translates the coordinates from a set of origin to another (based on the object's dimensions)\n * @param {Point} point The point which corresponds to the originX and originY params\n * @param {TOriginX} fromOriginX Horizontal origin: 'left', 'center' or 'right'\n * @param {TOriginY} fromOriginY Vertical origin: 'top', 'center' or 'bottom'\n * @param {TOriginX} toOriginX Horizontal origin: 'left', 'center' or 'right'\n * @param {TOriginY} toOriginY Vertical origin: 'top', 'center' or 'bottom'\n * @return {Point}\n */\n translateToGivenOrigin(\n point: Point,\n fromOriginX: TOriginX,\n fromOriginY: TOriginY,\n toOriginX: TOriginX,\n toOriginY: TOriginY,\n ): Point {\n let x = point.x,\n y = point.y;\n const offsetX = resolveOrigin(toOriginX) - resolveOrigin(fromOriginX),\n offsetY = resolveOrigin(toOriginY) - resolveOrigin(fromOriginY);\n\n if (offsetX || offsetY) {\n const dim = this._getTransformedDimensions();\n x += offsetX * dim.x;\n y += offsetY * dim.y;\n }\n\n return new Point(x, y);\n }\n\n /**\n * Translates the coordinates from origin to center coordinates (based on the object's dimensions)\n * @param {Point} point The point which corresponds to the originX and originY params\n * @param {TOriginX} originX Horizontal origin: 'left', 'center' or 'right'\n * @param {TOriginY} originY Vertical origin: 'top', 'center' or 'bottom'\n * @return {Point}\n */\n translateToCenterPoint(\n point: Point,\n originX: TOriginX,\n originY: TOriginY,\n ): Point {\n if (originX === CENTER && originY === CENTER) {\n return point;\n }\n const p = this.translateToGivenOrigin(\n point,\n originX,\n originY,\n CENTER,\n CENTER,\n );\n if (this.angle) {\n return p.rotate(degreesToRadians(this.angle), point);\n }\n return p;\n }\n\n /**\n * Translates the coordinates from center to origin coordinates (based on the object's dimensions)\n * @param {Point} center The point which corresponds to center of the object\n * @param {OriginX} originX Horizontal origin: 'left', 'center' or 'right'\n * @param {OriginY} originY Vertical origin: 'top', 'center' or 'bottom'\n * @return {Point}\n */\n translateToOriginPoint(\n center: Point,\n originX: TOriginX,\n originY: TOriginY,\n ): Point {\n const p = this.translateToGivenOrigin(\n center,\n CENTER,\n CENTER,\n originX,\n originY,\n );\n if (this.angle) {\n return p.rotate(degreesToRadians(this.angle), center);\n }\n return p;\n }\n\n /**\n * Returns the center coordinates of the object relative to canvas\n * @return {Point}\n */\n getCenterPoint(): Point {\n const relCenter = this.getRelativeCenterPoint();\n return this.group\n ? transformPoint(relCenter, this.group.calcTransformMatrix())\n : relCenter;\n }\n\n /**\n * Returns the center coordinates of the object relative to it's parent\n * @return {Point}\n */\n getRelativeCenterPoint(): Point {\n return this.translateToCenterPoint(\n new Point(this.left, this.top),\n this.originX,\n this.originY,\n );\n }\n\n /**\n * Returns the position of the object as if it has a different origin.\n * Take an object that has left, top set to 100, 100 with origin 'left', 'top'.\n * Return the values of left top ( wrapped in a point ) that you would need to keep\n * the same position if origin where different.\n * Alternatively you can use this to also find which point in the parent plane is a specific origin\n * ( where is the bottom right corner of my object? )\n * @param {TOriginX} originX Horizontal origin: 'left', 'center' or 'right'\n * @param {TOriginY} originY Vertical origin: 'top', 'center' or 'bottom'\n * @return {Point}\n */\n getPointByOrigin(originX: TOriginX, originY: TOriginY): Point {\n return this.translateToOriginPoint(\n this.getRelativeCenterPoint(),\n originX,\n originY,\n );\n }\n\n /**\n * Sets the position of the object taking into consideration the object's origin\n * @param {Point} pos The new position of the object\n * @param {TOriginX} originX Horizontal origin: 'left', 'center' or 'right'\n * @param {TOriginY} originY Vertical origin: 'top', 'center' or 'bottom'\n * @return {void}\n */\n setPositionByOrigin(pos: Point, originX: TOriginX, originY: TOriginY) {\n const center = this.translateToCenterPoint(pos, originX, originY),\n position = this.translateToOriginPoint(\n center,\n this.originX,\n this.originY,\n );\n this.set({ left: position.x, top: position.y });\n }\n\n /**\n * @private\n */\n _getLeftTopCoords() {\n return this.translateToOriginPoint(\n this.getRelativeCenterPoint(),\n LEFT,\n TOP,\n );\n }\n}\n","import { cache } from '../../cache';\nimport { config } from '../../config';\nimport {\n ALIASING_LIMIT,\n CENTER,\n iMatrix,\n LEFT,\n SCALE_X,\n SCALE_Y,\n STROKE,\n FILL,\n TOP,\n VERSION,\n} from '../../constants';\nimport type { ObjectEvents } from '../../EventTypeDefs';\nimport { Point } from '../../Point';\nimport { Shadow } from '../../Shadow';\nimport type {\n TDegree,\n TFiller,\n TSize,\n TCacheCanvasDimensions,\n Abortable,\n TOptions,\n ImageFormat,\n} from '../../typedefs';\nimport { classRegistry } from '../../ClassRegistry';\nimport { runningAnimations } from '../../util/animation/AnimationRegistry';\nimport { capValue } from '../../util/misc/capValue';\nimport {\n createCanvasElement,\n createCanvasElementFor,\n toDataURL,\n toBlob,\n} from '../../util/misc/dom';\nimport { invertTransform, qrDecompose } from '../../util/misc/matrix';\nimport { enlivenObjectEnlivables } from '../../util/misc/objectEnlive';\nimport {\n resetObjectTransform,\n saveObjectTransform,\n} from '../../util/misc/objectTransforms';\nimport { sendObjectToPlane } from '../../util/misc/planeChange';\nimport { pick, pickBy } from '../../util/misc/pick';\nimport { toFixed } from '../../util/misc/toFixed';\nimport type { Group } from '../Group';\nimport { StaticCanvas } from '../../canvas/StaticCanvas';\nimport { isFiller, isSerializableFiller } from '../../util/typeAssertions';\nimport type { FabricImage } from '../Image';\nimport {\n cacheProperties,\n fabricObjectDefaultValues,\n stateProperties,\n} from './defaultValues';\nimport type { Gradient } from '../../gradient/Gradient';\nimport type { Pattern } from '../../Pattern';\nimport type { Canvas } from '../../canvas/Canvas';\nimport type { SerializedObjectProps } from './types/SerializedObjectProps';\nimport type { ObjectProps } from './types/ObjectProps';\nimport { getDevicePixelRatio, getEnv } from '../../env';\nimport { log } from '../../util/internals/console';\nimport type { TColorArg } from '../../color/typedefs';\nimport type { TAnimation } from '../../util/animation/animate';\nimport { animate, animateColor } from '../../util/animation/animate';\nimport type {\n AnimationOptions,\n ArrayAnimationOptions,\n ColorAnimationOptions,\n ValueAnimationOptions,\n} from '../../util/animation/types';\nimport { ObjectGeometry } from './ObjectGeometry';\n\ntype TAncestor = FabricObject;\ntype TCollection = Group;\n\nexport type Ancestors =\n | [FabricObject | Group]\n | [FabricObject | Group, ...Group[]]\n | Group[];\n\nexport type AncestryComparison = {\n /**\n * common ancestors of `this` and`other`(may include`this` | `other`)\n */\n common: Ancestors;\n /**\n * ancestors that are of `this` only\n */\n fork: Ancestors;\n /**\n * ancestors that are of `other` only\n */\n otherFork: Ancestors;\n};\n\nexport type TCachedFabricObject = T &\n Required<\n Pick<\n T,\n | 'zoomX'\n | 'zoomY'\n | '_cacheCanvas'\n | '_cacheContext'\n | 'cacheTranslationX'\n | 'cacheTranslationY'\n >\n > & {\n _cacheContext: CanvasRenderingContext2D;\n };\n\nexport type ObjectToCanvasElementOptions = {\n format?: ImageFormat;\n /** Multiplier to scale by */\n multiplier?: number;\n /** Cropping left offset. Introduced in v1.2.14 */\n left?: number;\n /** Cropping top offset. Introduced in v1.2.14 */\n top?: number;\n /** Cropping width. Introduced in v1.2.14 */\n width?: number;\n /** Cropping height. Introduced in v1.2.14 */\n height?: number;\n /** Enable retina scaling for clone image. Introduce in 1.6.4 */\n enableRetinaScaling?: boolean;\n /** Remove current object transform ( no scale , no angle, no flip, no skew ). Introduced in 2.3.4 */\n withoutTransform?: boolean;\n /** Remove current object shadow. Introduced in 2.4.2 */\n withoutShadow?: boolean;\n /** Account for canvas viewport transform */\n viewportTransform?: boolean;\n /** Function to create the output canvas to export onto */\n canvasProvider?: (el?: HTMLCanvasElement) => T;\n};\n\ntype toDataURLOptions = ObjectToCanvasElementOptions & {\n quality?: number;\n};\n\nexport type DrawContext =\n | {\n parentClipPaths: FabricObject[];\n width: number;\n height: number;\n cacheTranslationX: number;\n cacheTranslationY: number;\n zoomX: number;\n zoomY: number;\n }\n | Record;\n\n/**\n * Root object class from which all 2d shape classes inherit from\n * @see {@link http://fabric5.fabricjs.com/fabric-intro-part-1#objects}\n *\n * @fires added\n * @fires removed\n *\n * @fires selected\n * @fires deselected\n *\n * @fires rotating\n * @fires scaling\n * @fires moving\n * @fires skewing\n * @fires modified\n *\n * @fires mousedown\n * @fires mouseup\n * @fires mouseover\n * @fires mouseout\n * @fires mousewheel\n * @fires mousedblclick\n *\n * @fires dragover\n * @fires dragenter\n * @fires dragleave\n * @fires drop\n */\nexport class FabricObject<\n Props extends TOptions = Partial,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n SProps extends SerializedObjectProps = SerializedObjectProps,\n EventSpec extends ObjectEvents = ObjectEvents,\n >\n extends ObjectGeometry\n implements ObjectProps\n{\n declare minScaleLimit: number;\n\n declare opacity: number;\n\n declare paintFirst: 'fill' | 'stroke';\n declare fill: string | TFiller | null;\n declare fillRule: CanvasFillRule;\n declare stroke: string | TFiller | null;\n declare strokeDashArray: number[] | null;\n declare strokeDashOffset: number;\n declare strokeLineCap: CanvasLineCap;\n declare strokeLineJoin: CanvasLineJoin;\n declare strokeMiterLimit: number;\n\n declare globalCompositeOperation: GlobalCompositeOperation;\n declare backgroundColor: string;\n\n declare shadow: Shadow | null;\n\n declare visible: boolean;\n\n declare includeDefaultValues: boolean;\n declare excludeFromExport: boolean;\n\n declare objectCaching: boolean;\n\n declare clipPath?: FabricObject;\n declare inverted: boolean;\n declare absolutePositioned: boolean;\n declare centeredRotation: boolean;\n declare centeredScaling: boolean;\n\n /**\n * This list of properties is used to check if the state of an object is changed.\n * This state change now is only used for children of groups to understand if a group\n * needs its cache regenerated during a .set call\n * @type Array\n */\n static stateProperties: string[] = stateProperties;\n\n /**\n * List of properties to consider when checking if cache needs refresh\n * Those properties are checked by\n * calls to Object.set(key, value). If the key is in this list, the object is marked as dirty\n * and refreshed at the next render\n * @type Array\n */\n static cacheProperties: string[] = cacheProperties;\n\n /**\n * When set to `true`, object's cache will be rerendered next render call.\n * since 1.7.0\n * @type Boolean\n * @default true\n */\n declare dirty: boolean;\n\n /**\n * Quick access for the _cacheCanvas rendering context\n * This is part of the objectCaching feature\n * since 1.7.0\n * @type boolean\n * @default undefined\n * @private\n */\n _cacheContext: CanvasRenderingContext2D | null = null;\n\n /**\n * A reference to the HTMLCanvasElement that is used to contain the cache of the object\n * this canvas element is resized and cleared as needed\n * Is marked private, you can read it, don't use it since it is handled by fabric\n * since 1.7.0\n * @type HTMLCanvasElement\n * @default undefined\n * @private\n */\n declare _cacheCanvas?: HTMLCanvasElement;\n\n /**\n * zoom level used on the cacheCanvas to draw the cache, X axe\n * since 1.7.0\n * @type number\n * @default undefined\n * @private\n */\n declare zoomX?: number;\n\n /**\n * zoom level used on the cacheCanvas to draw the cache, Y axe\n * since 1.7.0\n * @type number\n * @default undefined\n * @private\n */\n declare zoomY?: number;\n\n /**\n * zoom level used on the cacheCanvas to draw the cache, Y axe\n * since 1.7.0\n * @type number\n * @default undefined\n * @private\n */\n declare cacheTranslationX?: number;\n\n /**\n * translation of the cacheCanvas away from the center, for subpixel accuracy and crispness\n * since 1.7.0\n * @type number\n * @default undefined\n * @private\n */\n declare cacheTranslationY?: number;\n\n /**\n * A reference to the parent of the object, usually a Group\n * @type number\n * @default undefined\n * @private\n */\n declare group?: Group;\n\n /**\n * Indicate if the object is sitting on a cache dedicated to it\n * or is part of a larger cache for many object ( a group for example)\n * @type number\n * @default undefined\n * @private\n */\n declare ownCaching?: boolean;\n\n /**\n * Private. indicates if the object inside a group is on a transformed context or not\n * or is part of a larger cache for many object ( a group for example)\n * @type boolean\n * @default undefined\n * @private\n */\n declare _transformDone?: boolean;\n\n static ownDefaults = fabricObjectDefaultValues;\n\n static getDefaults(): Record {\n return FabricObject.ownDefaults;\n }\n\n /**\n * The class type.\n * This is used for serialization and deserialization purposes and internally it can be used\n * to identify classes.\n * When we transform a class in a plain JS object we need a way to recognize which class it was,\n * and the type is the way we do that. It has no other purposes and you should not give one.\n * Hard to reach on instances and please do not use to drive instance's logic (this.constructor.type).\n * To idenfity a class use instanceof class ( instanceof Rect ).\n * We do not do that in fabricJS code because we want to try to have code splitting possible.\n */\n static type = 'FabricObject';\n\n /**\n * Legacy identifier of the class. Prefer using utils like isType or instanceOf\n * Will be removed in fabric 7 or 8.\n * The setter exists to avoid type errors in old code and possibly current deserialization code.\n * DO NOT build new code around this type value\n * @TODO add sustainable warning message\n * @type string\n * @deprecated\n */\n get type() {\n const name = (this.constructor as typeof FabricObject).type;\n if (name === 'FabricObject') {\n return 'object';\n }\n return name.toLowerCase();\n }\n\n set type(value) {\n log('warn', 'Setting type has no effect', value);\n }\n\n /**\n * Constructor\n * @param {Object} [options] Options object\n */\n constructor(options?: Props) {\n super();\n Object.assign(this, FabricObject.ownDefaults);\n this.setOptions(options);\n }\n\n /**\n * Create a the canvas used to keep the cached copy of the object\n * @private\n */\n _createCacheCanvas() {\n this._cacheCanvas = createCanvasElement();\n this._cacheContext = this._cacheCanvas.getContext('2d');\n this._updateCacheCanvas();\n // if canvas gets created, is empty, so dirty.\n this.dirty = true;\n }\n\n /**\n * Limit the cache dimensions so that X * Y do not cross config.perfLimitSizeTotal\n * and each side do not cross fabric.cacheSideLimit\n * those numbers are configurable so that you can get as much detail as you want\n * making bargain with performances.\n * It mutates the input object dims.\n * @param {TCacheCanvasDimensions} dims\n * @return {TCacheCanvasDimensions} dims\n */\n _limitCacheSize(\n dims: TCacheCanvasDimensions & { capped?: boolean },\n ): TCacheCanvasDimensions & { capped?: boolean } {\n const width = dims.width,\n height = dims.height,\n max = config.maxCacheSideLimit,\n min = config.minCacheSideLimit;\n if (\n width <= max &&\n height <= max &&\n width * height <= config.perfLimitSizeTotal\n ) {\n if (width < min) {\n dims.width = min;\n }\n if (height < min) {\n dims.height = min;\n }\n return dims;\n }\n const ar = width / height,\n [limX, limY] = cache.limitDimsByArea(ar),\n x = capValue(min, limX, max),\n y = capValue(min, limY, max);\n if (width > x) {\n dims.zoomX /= width / x;\n dims.width = x;\n dims.capped = true;\n }\n if (height > y) {\n dims.zoomY /= height / y;\n dims.height = y;\n dims.capped = true;\n }\n return dims;\n }\n\n /**\n * Return the dimension and the zoom level needed to create a cache canvas\n * big enough to host the object to be cached.\n * @private\n * @return {TCacheCanvasDimensions} Informations about the object to be cached\n */\n _getCacheCanvasDimensions(): TCacheCanvasDimensions {\n const objectScale = this.getTotalObjectScaling(),\n // calculate dimensions without skewing\n dim = this._getTransformedDimensions({ skewX: 0, skewY: 0 }),\n neededX = (dim.x * objectScale.x) / this.scaleX,\n neededY = (dim.y * objectScale.y) / this.scaleY;\n return {\n // for sure this ALIASING_LIMIT is slightly creating problem\n // in situation in which the cache canvas gets an upper limit\n // also objectScale contains already scaleX and scaleY\n width: Math.ceil(neededX + ALIASING_LIMIT),\n height: Math.ceil(neededY + ALIASING_LIMIT),\n zoomX: objectScale.x,\n zoomY: objectScale.y,\n x: neededX,\n y: neededY,\n };\n }\n\n /**\n * Update width and height of the canvas for cache\n * returns true or false if canvas needed resize.\n * @private\n * @return {Boolean} true if the canvas has been resized\n */\n _updateCacheCanvas() {\n const canvas = this._cacheCanvas!,\n context = this._cacheContext,\n { width, height, zoomX, zoomY, x, y } = this._limitCacheSize(\n this._getCacheCanvasDimensions(),\n ),\n dimensionsChanged = width !== canvas.width || height !== canvas.height,\n zoomChanged = this.zoomX !== zoomX || this.zoomY !== zoomY;\n\n if (!canvas || !context) {\n return false;\n }\n\n const shouldRedraw = dimensionsChanged || zoomChanged;\n\n if (shouldRedraw) {\n if (width !== canvas.width || height !== canvas.height) {\n canvas.width = width;\n canvas.height = height;\n } else {\n context.setTransform(1, 0, 0, 1, 0, 0);\n context.clearRect(0, 0, canvas.width, canvas.height);\n }\n const drawingWidth = x / 2;\n const drawingHeight = y / 2;\n this.cacheTranslationX =\n Math.round(canvas.width / 2 - drawingWidth) + drawingWidth;\n this.cacheTranslationY =\n Math.round(canvas.height / 2 - drawingHeight) + drawingHeight;\n context.translate(this.cacheTranslationX, this.cacheTranslationY);\n context.scale(zoomX, zoomY);\n this.zoomX = zoomX;\n this.zoomY = zoomY;\n return true;\n }\n return false;\n }\n\n /**\n * Sets object's properties from options, for class constructor only.\n * Needs to be overridden for different defaults.\n * @protected\n * @param {Object} [options] Options object\n */\n protected setOptions(options: Record = {}) {\n this._setOptions(options);\n }\n\n /**\n * Transforms context when rendering an object\n * @param {CanvasRenderingContext2D} ctx Context\n */\n transform(ctx: CanvasRenderingContext2D) {\n const needFullTransform =\n (this.group && !this.group._transformDone) ||\n (this.group && this.canvas && ctx === (this.canvas as Canvas).contextTop);\n const m = this.calcTransformMatrix(!needFullTransform);\n ctx.transform(m[0], m[1], m[2], m[3], m[4], m[5]);\n }\n\n /**\n * Return the object scale factor counting also the group scaling\n * @return {Point}\n */\n getObjectScaling() {\n // if the object is a top level one, on the canvas, we go for simple aritmetic\n // otherwise the complex method with angles will return approximations and decimals\n // and will likely kill the cache when not needed\n // https://github.com/fabricjs/fabric.js/issues/7157\n if (!this.group) {\n return new Point(Math.abs(this.scaleX), Math.abs(this.scaleY));\n }\n // if we are inside a group total zoom calculation is complex, we defer to generic matrices\n const options = qrDecompose(this.calcTransformMatrix());\n return new Point(Math.abs(options.scaleX), Math.abs(options.scaleY));\n }\n\n /**\n * Return the object scale factor counting also the group scaling, zoom and retina\n * @return {Object} object with scaleX and scaleY properties\n */\n getTotalObjectScaling() {\n const scale = this.getObjectScaling();\n if (this.canvas) {\n const zoom = this.canvas.getZoom();\n const retina = this.getCanvasRetinaScaling();\n return scale.scalarMultiply(zoom * retina);\n }\n return scale;\n }\n\n /**\n * Return the object opacity counting also the group property\n * @return {Number}\n */\n getObjectOpacity() {\n let opacity = this.opacity;\n if (this.group) {\n opacity *= this.group.getObjectOpacity();\n }\n return opacity;\n }\n\n /**\n * Makes sure the scale is valid and modifies it if necessary\n * @todo: this is a control action issue, not a geometry one\n * @private\n * @param {Number} value, unconstrained\n * @return {Number} constrained value;\n */\n _constrainScale(value: number): number {\n if (Math.abs(value) < this.minScaleLimit) {\n if (value < 0) {\n return -this.minScaleLimit;\n } else {\n return this.minScaleLimit;\n }\n } else if (value === 0) {\n return 0.0001;\n }\n return value;\n }\n\n /**\n * Handles setting values on the instance and handling internal side effects\n * @protected\n * @param {String} key\n * @param {*} value\n */\n _set(key: string, value: any) {\n if (key === SCALE_X || key === SCALE_Y) {\n value = this._constrainScale(value);\n }\n if (key === SCALE_X && value < 0) {\n this.flipX = !this.flipX;\n value *= -1;\n } else if (key === 'scaleY' && value < 0) {\n this.flipY = !this.flipY;\n value *= -1;\n // i don't like this automatic initialization here\n } else if (key === 'shadow' && value && !(value instanceof Shadow)) {\n value = new Shadow(value);\n }\n\n const isChanged = this[key as keyof this] !== value;\n this[key as keyof this] = value;\n\n // invalidate caches\n if (\n isChanged &&\n (this.constructor as typeof FabricObject).cacheProperties.includes(key)\n ) {\n this.dirty = true;\n }\n // a dirty child makes the parent dirty.\n // but a non dirty child does not make the parent not dirty.\n // the parent could be dirty for some other reason.\n this.parent &&\n (this.dirty ||\n (isChanged &&\n (this.constructor as typeof FabricObject).stateProperties.includes(\n key,\n ))) &&\n this.parent._set('dirty', true);\n\n return this;\n }\n\n /**\n * return if the object would be visible in rendering\n * @return {Boolean}\n */\n isNotVisible() {\n return (\n this.opacity === 0 ||\n (!this.width && !this.height && this.strokeWidth === 0) ||\n !this.visible\n );\n }\n\n /**\n * Renders an object on a specified context\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n render(ctx: CanvasRenderingContext2D) {\n // do not render if width/height are zeros or object is not visible\n if (this.isNotVisible()) {\n return;\n }\n if (\n this.canvas &&\n this.canvas.skipOffscreen &&\n !this.group &&\n !this.isOnScreen()\n ) {\n return;\n }\n ctx.save();\n this._setupCompositeOperation(ctx);\n this.drawSelectionBackground(ctx);\n this.transform(ctx);\n this._setOpacity(ctx);\n this._setShadow(ctx);\n if (this.shouldCache()) {\n (this as TCachedFabricObject).renderCache();\n (this as TCachedFabricObject).drawCacheOnCanvas(ctx);\n } else {\n this._removeCacheCanvas();\n this.drawObject(ctx, false, {});\n this.dirty = false;\n }\n ctx.restore();\n }\n\n drawSelectionBackground(_ctx: CanvasRenderingContext2D) {\n /* no op */\n }\n\n renderCache(this: TCachedFabricObject, options?: any) {\n options = options || {};\n if (!this._cacheCanvas || !this._cacheContext) {\n this._createCacheCanvas();\n }\n if (this.isCacheDirty() && this._cacheContext) {\n const { zoomX, zoomY, cacheTranslationX, cacheTranslationY } = this;\n const { width, height } = this._cacheCanvas;\n this.drawObject(this._cacheContext, options.forClipping, {\n zoomX,\n zoomY,\n cacheTranslationX,\n cacheTranslationY,\n width,\n height,\n parentClipPaths: [],\n });\n this.dirty = false;\n }\n }\n\n /**\n * Remove cacheCanvas and its dimensions from the objects\n */\n _removeCacheCanvas() {\n this._cacheCanvas = undefined;\n this._cacheContext = null;\n }\n\n /**\n * return true if the object will draw a stroke\n * Does not consider text styles. This is just a shortcut used at rendering time\n * We want it to be an approximation and be fast.\n * wrote to avoid extra caching, it has to return true when stroke happens,\n * can guess when it will not happen at 100% chance, does not matter if it misses\n * some use case where the stroke is invisible.\n * @since 3.0.0\n * @returns Boolean\n */\n hasStroke(): boolean {\n return (\n !!this.stroke && this.stroke !== 'transparent' && this.strokeWidth !== 0\n );\n }\n\n /**\n * return true if the object will draw a fill\n * Does not consider text styles. This is just a shortcut used at rendering time\n * We want it to be an approximation and be fast.\n * wrote to avoid extra caching, it has to return true when fill happens,\n * can guess when it will not happen at 100% chance, does not matter if it misses\n * some use case where the fill is invisible.\n * @since 3.0.0\n * @returns Boolean\n */\n hasFill(): boolean {\n return !!this.fill && this.fill !== 'transparent';\n }\n\n /**\n * When returns `true`, force the object to have its own cache, even if it is inside a group\n * it may be needed when your object behave in a particular way on the cache and always needs\n * its own isolated canvas to render correctly.\n * Created to be overridden\n * since 1.7.12\n * @returns Boolean\n */\n needsItsOwnCache() {\n // TODO re-evaluate this shadow condition\n if (\n this.paintFirst === STROKE &&\n this.hasFill() &&\n this.hasStroke() &&\n !!this.shadow\n ) {\n return true;\n }\n if (this.clipPath) {\n return true;\n }\n return false;\n }\n\n /**\n * Decide if the object should cache or not. Create its own cache level\n * objectCaching is a global flag, wins over everything\n * needsItsOwnCache should be used when the object drawing method requires\n * a cache step.\n * Generally you do not cache objects in groups because the group outside is cached.\n * Read as: cache if is needed, or if the feature is enabled but we are not already caching.\n * @return {Boolean}\n */\n shouldCache() {\n this.ownCaching =\n (this.objectCaching && (!this.parent || !this.parent.isOnACache())) ||\n this.needsItsOwnCache();\n return this.ownCaching;\n }\n\n /**\n * Check if this object will cast a shadow with an offset.\n * used by Group.shouldCache to know if child has a shadow recursively\n * @return {Boolean}\n * @deprecated\n */\n willDrawShadow() {\n return (\n !!this.shadow && (this.shadow.offsetX !== 0 || this.shadow.offsetY !== 0)\n );\n }\n\n /**\n * Execute the drawing operation for an object clipPath\n * @param {CanvasRenderingContext2D} ctx Context to render on\n * @param {FabricObject} clipPath\n */\n drawClipPathOnCache(\n ctx: CanvasRenderingContext2D,\n clipPath: FabricObject,\n canvasWithClipPath: HTMLCanvasElement,\n ) {\n ctx.save();\n // DEBUG: uncomment this line, comment the following\n // ctx.globalAlpha = 0.4\n if (clipPath.inverted) {\n ctx.globalCompositeOperation = 'destination-out';\n } else {\n ctx.globalCompositeOperation = 'destination-in';\n }\n ctx.setTransform(1, 0, 0, 1, 0, 0);\n ctx.drawImage(canvasWithClipPath, 0, 0);\n ctx.restore();\n }\n\n /**\n * Execute the drawing operation for an object on a specified context\n * @param {CanvasRenderingContext2D} ctx Context to render on\n * @param {boolean} forClipping apply clipping styles\n * @param {DrawContext} context additional context for rendering\n */\n drawObject(\n ctx: CanvasRenderingContext2D,\n forClipping: boolean | undefined,\n context: DrawContext,\n ) {\n const originalFill = this.fill,\n originalStroke = this.stroke;\n if (forClipping) {\n this.fill = 'black';\n this.stroke = '';\n this._setClippingProperties(ctx);\n } else {\n this._renderBackground(ctx);\n }\n this._render(ctx);\n this._drawClipPath(ctx, this.clipPath, context);\n this.fill = originalFill;\n this.stroke = originalStroke;\n }\n\n private createClipPathLayer(\n this: TCachedFabricObject,\n clipPath: FabricObject,\n context: DrawContext,\n ) {\n const canvas = createCanvasElementFor(context as TSize);\n const ctx = canvas.getContext('2d')!;\n ctx.translate(context.cacheTranslationX, context.cacheTranslationY);\n ctx.scale(context.zoomX, context.zoomY);\n clipPath._cacheCanvas = canvas;\n context.parentClipPaths.forEach((prevClipPath) => {\n prevClipPath.transform(ctx);\n });\n context.parentClipPaths.push(clipPath);\n if (clipPath.absolutePositioned) {\n const m = invertTransform(this.calcTransformMatrix());\n ctx.transform(m[0], m[1], m[2], m[3], m[4], m[5]);\n }\n clipPath.transform(ctx);\n clipPath.drawObject(ctx, true, context);\n return canvas;\n }\n\n /**\n * Prepare clipPath state and cache and draw it on instance's cache\n * @param {CanvasRenderingContext2D} ctx\n * @param {FabricObject} clipPath\n */\n _drawClipPath(\n ctx: CanvasRenderingContext2D,\n clipPath: FabricObject | undefined,\n context: DrawContext,\n ) {\n if (!clipPath) {\n return;\n }\n // needed to setup _transformDone\n // TODO find a better solution?\n clipPath._transformDone = true;\n const canvas = (this as TCachedFabricObject).createClipPathLayer(\n clipPath,\n context,\n );\n this.drawClipPathOnCache(ctx, clipPath, canvas);\n }\n\n /**\n * Paint the cached copy of the object on the target context.\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n drawCacheOnCanvas(this: TCachedFabricObject, ctx: CanvasRenderingContext2D) {\n ctx.scale(1 / this.zoomX, 1 / this.zoomY);\n ctx.drawImage(\n this._cacheCanvas,\n -this.cacheTranslationX,\n -this.cacheTranslationY,\n );\n }\n\n /**\n * Check if cache is dirty and if is dirty clear the context.\n * This check has a big side effect, it changes the underlying cache canvas if necessary.\n * Do not call this method on your own to check if the cache is dirty, because if it is,\n * it is also going to wipe the cache. This is badly designed and needs to be fixed.\n * @param {Boolean} skipCanvas skip canvas checks because this object is painted\n * on parent canvas.\n */\n isCacheDirty(skipCanvas = false) {\n if (this.isNotVisible()) {\n return false;\n }\n const canvas = this._cacheCanvas;\n const ctx = this._cacheContext;\n if (canvas && ctx && !skipCanvas && this._updateCacheCanvas()) {\n // in this case the context is already cleared.\n return true;\n } else {\n if (this.dirty || (this.clipPath && this.clipPath.absolutePositioned)) {\n if (canvas && ctx && !skipCanvas) {\n ctx.save();\n ctx.setTransform(1, 0, 0, 1, 0, 0);\n ctx.clearRect(0, 0, canvas.width, canvas.height);\n ctx.restore();\n }\n return true;\n }\n }\n return false;\n }\n\n /**\n * Draws a background for the object big as its untransformed dimensions\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _renderBackground(ctx: CanvasRenderingContext2D) {\n if (!this.backgroundColor) {\n return;\n }\n const dim = this._getNonTransformedDimensions();\n ctx.fillStyle = this.backgroundColor;\n\n ctx.fillRect(-dim.x / 2, -dim.y / 2, dim.x, dim.y);\n // if there is background color no other shadows\n // should be casted\n this._removeShadow(ctx);\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _setOpacity(ctx: CanvasRenderingContext2D) {\n if (this.group && !this.group._transformDone) {\n ctx.globalAlpha = this.getObjectOpacity();\n } else {\n ctx.globalAlpha *= this.opacity;\n }\n }\n\n _setStrokeStyles(\n ctx: CanvasRenderingContext2D,\n decl: Pick<\n this,\n | 'stroke'\n | 'strokeWidth'\n | 'strokeLineCap'\n | 'strokeDashOffset'\n | 'strokeLineJoin'\n | 'strokeMiterLimit'\n >,\n ) {\n const stroke = decl.stroke;\n if (stroke) {\n ctx.lineWidth = decl.strokeWidth;\n ctx.lineCap = decl.strokeLineCap;\n ctx.lineDashOffset = decl.strokeDashOffset;\n ctx.lineJoin = decl.strokeLineJoin;\n ctx.miterLimit = decl.strokeMiterLimit;\n if (isFiller(stroke)) {\n if (\n (stroke as Gradient<'linear'>).gradientUnits === 'percentage' ||\n (stroke as Gradient<'linear'>).gradientTransform ||\n (stroke as Pattern).patternTransform\n ) {\n // need to transform gradient in a pattern.\n // this is a slow process. If you are hitting this codepath, and the object\n // is not using caching, you should consider switching it on.\n // we need a canvas as big as the current object caching canvas.\n this._applyPatternForTransformedGradient(ctx, stroke);\n } else {\n // is a simple gradient or pattern\n ctx.strokeStyle = stroke.toLive(ctx)!;\n this._applyPatternGradientTransform(ctx, stroke);\n }\n } else {\n // is a color\n ctx.strokeStyle = decl.stroke as string;\n }\n }\n }\n\n _setFillStyles(ctx: CanvasRenderingContext2D, { fill }: Pick) {\n if (fill) {\n if (isFiller(fill)) {\n ctx.fillStyle = fill.toLive(ctx)!;\n this._applyPatternGradientTransform(ctx, fill);\n } else {\n ctx.fillStyle = fill;\n }\n }\n }\n\n _setClippingProperties(ctx: CanvasRenderingContext2D) {\n ctx.globalAlpha = 1;\n ctx.strokeStyle = 'transparent';\n ctx.fillStyle = '#000000';\n }\n\n /**\n * @private\n * Sets line dash\n * @param {CanvasRenderingContext2D} ctx Context to set the dash line on\n * @param {Array} dashArray array representing dashes\n */\n _setLineDash(ctx: CanvasRenderingContext2D, dashArray?: number[] | null) {\n if (!dashArray || dashArray.length === 0) {\n return;\n }\n ctx.setLineDash(dashArray);\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _setShadow(ctx: CanvasRenderingContext2D) {\n if (!this.shadow) {\n return;\n }\n\n const shadow = this.shadow,\n canvas = this.canvas,\n retinaScaling = this.getCanvasRetinaScaling(),\n [sx, , , sy] = canvas?.viewportTransform || iMatrix,\n multX = sx * retinaScaling,\n multY = sy * retinaScaling,\n scaling = shadow.nonScaling ? new Point(1, 1) : this.getObjectScaling();\n ctx.shadowColor = shadow.color;\n ctx.shadowBlur =\n (shadow.blur *\n config.browserShadowBlurConstant *\n (multX + multY) *\n (scaling.x + scaling.y)) /\n 4;\n ctx.shadowOffsetX = shadow.offsetX * multX * scaling.x;\n ctx.shadowOffsetY = shadow.offsetY * multY * scaling.y;\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _removeShadow(ctx: CanvasRenderingContext2D) {\n if (!this.shadow) {\n return;\n }\n\n ctx.shadowColor = '';\n ctx.shadowBlur = ctx.shadowOffsetX = ctx.shadowOffsetY = 0;\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n * @param {TFiller} filler {@link Pattern} or {@link Gradient}\n */\n _applyPatternGradientTransform(\n ctx: CanvasRenderingContext2D,\n filler: TFiller,\n ) {\n if (!isFiller(filler)) {\n return { offsetX: 0, offsetY: 0 };\n }\n const t =\n (filler as Gradient<'linear'>).gradientTransform ||\n (filler as Pattern).patternTransform;\n const offsetX = -this.width / 2 + filler.offsetX || 0,\n offsetY = -this.height / 2 + filler.offsetY || 0;\n\n if ((filler as Gradient<'linear'>).gradientUnits === 'percentage') {\n ctx.transform(this.width, 0, 0, this.height, offsetX, offsetY);\n } else {\n ctx.transform(1, 0, 0, 1, offsetX, offsetY);\n }\n if (t) {\n ctx.transform(t[0], t[1], t[2], t[3], t[4], t[5]);\n }\n return { offsetX: offsetX, offsetY: offsetY };\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _renderPaintInOrder(ctx: CanvasRenderingContext2D) {\n if (this.paintFirst === STROKE) {\n this._renderStroke(ctx);\n this._renderFill(ctx);\n } else {\n this._renderFill(ctx);\n this._renderStroke(ctx);\n }\n }\n\n /**\n * @private\n * function that actually render something on the context.\n * empty here to allow Obects to work on tests to benchmark fabric functionalites\n * not related to rendering\n * @param {CanvasRenderingContext2D} _ctx Context to render on\n */\n _render(_ctx: CanvasRenderingContext2D) {\n // placeholder to be overridden\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _renderFill(ctx: CanvasRenderingContext2D) {\n if (!this.fill) {\n return;\n }\n\n ctx.save();\n this._setFillStyles(ctx, this);\n if (this.fillRule === 'evenodd') {\n ctx.fill('evenodd');\n } else {\n ctx.fill();\n }\n ctx.restore();\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _renderStroke(ctx: CanvasRenderingContext2D) {\n if (!this.stroke || this.strokeWidth === 0) {\n return;\n }\n\n if (this.shadow && !this.shadow.affectStroke) {\n this._removeShadow(ctx);\n }\n\n ctx.save();\n if (this.strokeUniform) {\n const scaling = this.getObjectScaling();\n ctx.scale(1 / scaling.x, 1 / scaling.y);\n }\n this._setLineDash(ctx, this.strokeDashArray);\n this._setStrokeStyles(ctx, this);\n ctx.stroke();\n ctx.restore();\n }\n\n /**\n * This function try to patch the missing gradientTransform on canvas gradients.\n * transforming a context to transform the gradient, is going to transform the stroke too.\n * we want to transform the gradient but not the stroke operation, so we create\n * a transformed gradient on a pattern and then we use the pattern instead of the gradient.\n * this method has drawbacks: is slow, is in low resolution, needs a patch for when the size\n * is limited.\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n * @param {Gradient} filler\n */\n _applyPatternForTransformedGradient(\n ctx: CanvasRenderingContext2D,\n filler: TFiller,\n ) {\n const dims = this._limitCacheSize(this._getCacheCanvasDimensions()),\n retinaScaling = this.getCanvasRetinaScaling(),\n width = dims.x / this.scaleX / retinaScaling,\n height = dims.y / this.scaleY / retinaScaling,\n pCanvas = createCanvasElementFor({\n // in case width and height are less than 1px, we have to round up.\n // since the pattern is no-repeat, this is fine\n width: Math.ceil(width),\n height: Math.ceil(height),\n });\n\n const pCtx = pCanvas.getContext('2d');\n if (!pCtx) {\n return;\n }\n pCtx.beginPath();\n pCtx.moveTo(0, 0);\n pCtx.lineTo(width, 0);\n pCtx.lineTo(width, height);\n pCtx.lineTo(0, height);\n pCtx.closePath();\n pCtx.translate(width / 2, height / 2);\n pCtx.scale(\n dims.zoomX / this.scaleX / retinaScaling,\n dims.zoomY / this.scaleY / retinaScaling,\n );\n this._applyPatternGradientTransform(pCtx, filler);\n pCtx.fillStyle = filler.toLive(ctx)!;\n pCtx.fill();\n ctx.translate(\n -this.width / 2 - this.strokeWidth / 2,\n -this.height / 2 - this.strokeWidth / 2,\n );\n ctx.scale(\n (retinaScaling * this.scaleX) / dims.zoomX,\n (retinaScaling * this.scaleY) / dims.zoomY,\n );\n ctx.strokeStyle = pCtx.createPattern(pCanvas, 'no-repeat') ?? '';\n }\n\n /**\n * This function is an helper for svg import. it returns the center of the object in the svg\n * untransformed coordinates\n * @private\n * @return {Point} center point from element coordinates\n */\n _findCenterFromElement() {\n return new Point(this.left + this.width / 2, this.top + this.height / 2);\n }\n\n /**\n * Clones an instance.\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @returns {Promise}\n */\n clone(propertiesToInclude?: string[]): Promise {\n const objectForm = this.toObject(propertiesToInclude);\n return (this.constructor as typeof FabricObject).fromObject(\n objectForm,\n ) as unknown as Promise;\n }\n\n /**\n * Creates an instance of Image out of an object\n * makes use of toCanvasElement.\n * Once this method was based on toDataUrl and loadImage, so it also had a quality\n * and format option. toCanvasElement is faster and produce no loss of quality.\n * If you need to get a real Jpeg or Png from an object, using toDataURL is the right way to do it.\n * toCanvasElement and then toBlob from the obtained canvas is also a good option.\n * @todo fix the export type, it could not be Image but the type that getClass return for 'image'.\n * @param {ObjectToCanvasElementOptions} [options] for clone as image, passed to toDataURL\n * @param {Number} [options.multiplier=1] Multiplier to scale by\n * @param {Number} [options.left] Cropping left offset. Introduced in v1.2.14\n * @param {Number} [options.top] Cropping top offset. Introduced in v1.2.14\n * @param {Number} [options.width] Cropping width. Introduced in v1.2.14\n * @param {Number} [options.height] Cropping height. Introduced in v1.2.14\n * @param {Boolean} [options.enableRetinaScaling] Enable retina scaling for clone image. Introduce in 1.6.4\n * @param {Boolean} [options.withoutTransform] Remove current object transform ( no scale , no angle, no flip, no skew ). Introduced in 2.3.4\n * @param {Boolean} [options.withoutShadow] Remove current object shadow. Introduced in 2.4.2\n * @return {FabricImage} Object cloned as image.\n */\n cloneAsImage(options: ObjectToCanvasElementOptions): FabricImage {\n const canvasEl = this.toCanvasElement(options);\n // TODO: how to import Image w/o an import cycle?\n const ImageClass = classRegistry.getClass('image');\n return new ImageClass(canvasEl);\n }\n\n /**\n * Converts an object into a HTMLCanvas element\n * @param {ObjectToCanvasElementOptions} options Options object\n * @param {Number} [options.multiplier=1] Multiplier to scale by\n * @param {Number} [options.left] Cropping left offset. Introduced in v1.2.14\n * @param {Number} [options.top] Cropping top offset. Introduced in v1.2.14\n * @param {Number} [options.width] Cropping width. Introduced in v1.2.14\n * @param {Number} [options.height] Cropping height. Introduced in v1.2.14\n * @param {Boolean} [options.enableRetinaScaling] Enable retina scaling for clone image. Introduce in 1.6.4\n * @param {Boolean} [options.withoutTransform] Remove current object transform ( no scale , no angle, no flip, no skew ). Introduced in 2.3.4\n * @param {Boolean} [options.withoutShadow] Remove current object shadow. Introduced in 2.4.2\n * @param {Boolean} [options.viewportTransform] Account for canvas viewport transform\n * @param {(el?: HTMLCanvasElement) => StaticCanvas} [options.canvasProvider] Create the output canvas\n * @return {HTMLCanvasElement} Returns DOM element with the FabricObject\n */\n toCanvasElement(options: ObjectToCanvasElementOptions = {}) {\n const origParams = saveObjectTransform(this),\n originalGroup = this.group,\n originalShadow = this.shadow,\n abs = Math.abs,\n retinaScaling = options.enableRetinaScaling ? getDevicePixelRatio() : 1,\n multiplier = (options.multiplier || 1) * retinaScaling,\n canvasProvider: (el: HTMLCanvasElement) => StaticCanvas =\n options.canvasProvider ||\n ((el: HTMLCanvasElement) =>\n new StaticCanvas(el, {\n enableRetinaScaling: false,\n renderOnAddRemove: false,\n skipOffscreen: false,\n }));\n delete this.group;\n if (options.withoutTransform) {\n resetObjectTransform(this);\n }\n if (options.withoutShadow) {\n this.shadow = null;\n }\n if (options.viewportTransform) {\n sendObjectToPlane(this, this.getViewportTransform());\n }\n\n this.setCoords();\n const el = createCanvasElement(),\n boundingRect = this.getBoundingRect(),\n shadow = this.shadow,\n shadowOffset = new Point();\n\n if (shadow) {\n const shadowBlur = shadow.blur;\n const scaling = shadow.nonScaling\n ? new Point(1, 1)\n : this.getObjectScaling();\n // consider non scaling shadow.\n shadowOffset.x =\n 2 * Math.round(abs(shadow.offsetX) + shadowBlur) * abs(scaling.x);\n shadowOffset.y =\n 2 * Math.round(abs(shadow.offsetY) + shadowBlur) * abs(scaling.y);\n }\n const width = boundingRect.width + shadowOffset.x,\n height = boundingRect.height + shadowOffset.y;\n // if the current width/height is not an integer\n // we need to make it so.\n el.width = Math.ceil(width);\n el.height = Math.ceil(height);\n const canvas = canvasProvider(el);\n if (options.format === 'jpeg') {\n canvas.backgroundColor = '#fff';\n }\n this.setPositionByOrigin(\n new Point(canvas.width / 2, canvas.height / 2),\n CENTER,\n CENTER,\n );\n const originalCanvas = this.canvas;\n // static canvas and canvas have both an array of InteractiveObjects\n // @ts-expect-error this needs to be fixed somehow, or ignored globally\n canvas._objects = [this];\n this.set('canvas', canvas);\n this.setCoords();\n const canvasEl = canvas.toCanvasElement(multiplier || 1, options);\n this.set('canvas', originalCanvas);\n this.shadow = originalShadow;\n if (originalGroup) {\n this.group = originalGroup;\n }\n this.set(origParams);\n this.setCoords();\n // canvas.dispose will call image.dispose that will nullify the elements\n // since this canvas is a simple element for the process, we remove references\n // to objects in this way in order to avoid object trashing.\n canvas._objects = [];\n // since render has settled it is safe to destroy canvas\n canvas.destroy();\n return canvasEl;\n }\n\n /**\n * Converts an object into a data-url-like string\n * @param {Object} options Options object\n * @param {String} [options.format=png] The format of the output image. Either \"jpeg\" or \"png\"\n * @param {Number} [options.quality=1] Quality level (0..1). Only used for jpeg.\n * @param {Number} [options.multiplier=1] Multiplier to scale by\n * @param {Number} [options.left] Cropping left offset. Introduced in v1.2.14\n * @param {Number} [options.top] Cropping top offset. Introduced in v1.2.14\n * @param {Number} [options.width] Cropping width. Introduced in v1.2.14\n * @param {Number} [options.height] Cropping height. Introduced in v1.2.14\n * @param {Boolean} [options.enableRetinaScaling] Enable retina scaling for clone image. Introduce in 1.6.4\n * @param {Boolean} [options.withoutTransform] Remove current object transform ( no scale , no angle, no flip, no skew ). Introduced in 2.3.4\n * @param {Boolean} [options.withoutShadow] Remove current object shadow. Introduced in 2.4.2\n * @return {String} Returns a data: URL containing a representation of the object in the format specified by options.format\n */\n toDataURL(options: toDataURLOptions = {}) {\n return toDataURL(\n this.toCanvasElement(options),\n options.format || 'png',\n options.quality || 1,\n );\n }\n toBlob(options: toDataURLOptions = {}) {\n return toBlob(\n this.toCanvasElement(options),\n options.format || 'png',\n options.quality || 1,\n );\n }\n\n /**\n * Checks if the instance is of any of the specified types.\n * We use this to filter a list of objects for the `getObjects` function.\n *\n * For detecting an instance type `instanceOf` is a better check,\n * but to avoid to make specific classes a dependency of generic code\n * internally we use this.\n *\n * This compares both the static class `type` and the instance's own `type` property\n * against the provided list of types.\n *\n * @param types - A list of type strings to check against.\n * @returns `true` if the object's type or class type matches any in the list, otherwise `false`.\n */\n isType(...types: string[]) {\n return (\n types.includes((this.constructor as typeof FabricObject).type) ||\n types.includes(this.type)\n );\n }\n\n /**\n * Returns complexity of an instance\n * @return {Number} complexity of this instance (is 1 unless subclassed)\n */\n complexity() {\n return 1;\n }\n\n /**\n * Returns a JSON representation of an instance\n * @return {Object} JSON\n */\n toJSON() {\n // delegate, not alias\n return this.toObject();\n }\n\n /**\n * Sets \"angle\" of an instance with centered rotation\n * @param {TDegree} angle Angle value (in degrees)\n */\n rotate(angle: TDegree) {\n const { centeredRotation, originX, originY } = this;\n\n if (centeredRotation) {\n const { x, y } = this.getRelativeCenterPoint();\n this.originX = CENTER;\n this.originY = CENTER;\n this.left = x;\n this.top = y;\n }\n\n this.set('angle', angle);\n\n if (centeredRotation) {\n const { x, y } = this.translateToOriginPoint(\n this.getRelativeCenterPoint(),\n originX,\n originY,\n );\n this.left = x;\n this.top = y;\n this.originX = originX;\n this.originY = originY;\n }\n }\n\n /**\n * This callback function is called by the parent group of an object every\n * time a non-delegated property changes on the group. It is passed the key\n * and value as parameters. Not adding in this function's signature to avoid\n * Travis build error about unused variables.\n */\n setOnGroup() {\n // implemented by sub-classes, as needed.\n }\n\n /**\n * Sets canvas globalCompositeOperation for specific object\n * custom composition operation for the particular object can be specified using globalCompositeOperation property\n * @param {CanvasRenderingContext2D} ctx Rendering canvas context\n */\n _setupCompositeOperation(ctx: CanvasRenderingContext2D) {\n if (this.globalCompositeOperation) {\n ctx.globalCompositeOperation = this.globalCompositeOperation;\n }\n }\n\n /**\n * cancel instance's running animations\n * override if necessary to dispose artifacts such as `clipPath`\n */\n dispose() {\n runningAnimations.cancelByTarget(this);\n this.off();\n this._set('canvas', undefined);\n // clear caches\n this._cacheCanvas && getEnv().dispose(this._cacheCanvas);\n this._cacheCanvas = undefined;\n this._cacheContext = null;\n }\n\n // #region Animation methods\n /**\n * List of properties to consider for animating colors.\n * @type String[]\n */\n static colorProperties: string[] = [FILL, STROKE, 'backgroundColor'];\n\n /**\n * Animates object's properties\n * @param {Record} animatable map of keys and end values\n * @param {Partial>} options\n * @see {@link http://fabric5.fabricjs.com/fabric-intro-part-2#animation}\n * @return {Record>} map of animation contexts\n *\n * As object — multiple properties\n *\n * object.animate({ left: ..., top: ... });\n * object.animate({ left: ..., top: ... }, { duration: ... });\n */\n animate(\n animatable: Record,\n options?: Partial>,\n ): Record> {\n return Object.entries(animatable).reduce(\n (acc, [key, endValue]) => {\n acc[key] = this._animate(key, endValue, options);\n return acc;\n },\n {} as Record>,\n );\n }\n\n /**\n * @private\n * @param {String} key Property to animate\n * @param {String} to Value to animate to\n * @param {Object} [options] Options object\n */\n _animate(\n key: string,\n endValue: T,\n options: Partial> = {},\n ): TAnimation {\n const path = key.split('.');\n const propIsColor = (\n this.constructor as typeof FabricObject\n ).colorProperties.includes(path[path.length - 1]);\n const { abort, startValue, onChange, onComplete } = options;\n const animationOptions = {\n ...options,\n target: this,\n // path.reduce... is the current value in case start value isn't provided\n startValue:\n startValue ?? path.reduce((deep: any, key) => deep[key], this),\n endValue,\n abort: abort?.bind(this),\n onChange: (\n value: number | number[] | string,\n valueProgress: number,\n durationProgress: number,\n ) => {\n path.reduce((deep: Record, key, index) => {\n if (index === path.length - 1) {\n deep[key] = value;\n }\n return deep[key];\n }, this);\n onChange &&\n // @ts-expect-error generic callback arg0 is wrong\n onChange(value, valueProgress, durationProgress);\n },\n onComplete: (\n value: number | number[] | string,\n valueProgress: number,\n durationProgress: number,\n ) => {\n this.setCoords();\n onComplete &&\n // @ts-expect-error generic callback arg0 is wrong\n onComplete(value, valueProgress, durationProgress);\n },\n } as AnimationOptions;\n\n return (\n propIsColor\n ? animateColor(animationOptions as ColorAnimationOptions)\n : animate(\n animationOptions as ValueAnimationOptions | ArrayAnimationOptions,\n )\n ) as TAnimation;\n }\n\n // #region Object stacking methods\n\n /**\n * A reference to the parent of the object\n * Used to keep the original parent ref when the object has been added to an ActiveSelection, hence loosing the `group` ref\n */\n declare parent?: Group;\n\n /**\n * Checks if object is descendant of target\n * Should be used instead of {@link Group.contains} or {@link StaticCanvas.contains} for performance reasons\n * @param {TAncestor} target\n * @returns {boolean}\n */\n isDescendantOf(target: TAncestor): boolean {\n const { parent, group } = this;\n return (\n parent === target ||\n group === target ||\n // walk up\n (!!parent && parent.isDescendantOf(target)) ||\n (!!group && group !== parent && group.isDescendantOf(target))\n );\n }\n\n /**\n * @returns {Ancestors} ancestors (excluding `ActiveSelection`) from bottom to top\n */\n getAncestors(): Ancestors {\n const ancestors: TAncestor[] = [];\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n let parent: TAncestor | undefined = this;\n do {\n parent = parent.parent;\n parent && ancestors.push(parent);\n } while (parent);\n return ancestors as Ancestors;\n }\n\n /**\n * Compare ancestors\n *\n * @param {StackedObject} other\n * @returns {AncestryComparison} an object that represent the ancestry situation.\n */\n findCommonAncestors(other: T): AncestryComparison {\n if (this === other) {\n return {\n fork: [],\n otherFork: [],\n common: [this, ...this.getAncestors()],\n } as AncestryComparison;\n }\n const ancestors = this.getAncestors();\n const otherAncestors = other.getAncestors();\n // if `this` has no ancestors and `this` is top ancestor of `other` we must handle the following case\n if (\n ancestors.length === 0 &&\n otherAncestors.length > 0 &&\n this === otherAncestors[otherAncestors.length - 1]\n ) {\n return {\n fork: [],\n otherFork: [\n other,\n ...otherAncestors.slice(0, otherAncestors.length - 1),\n ],\n common: [this],\n } as AncestryComparison;\n }\n // compare ancestors\n for (let i = 0, ancestor; i < ancestors.length; i++) {\n ancestor = ancestors[i];\n if (ancestor === other) {\n return {\n fork: [this, ...ancestors.slice(0, i)],\n otherFork: [],\n common: ancestors.slice(i),\n } as AncestryComparison;\n }\n for (let j = 0; j < otherAncestors.length; j++) {\n if (this === otherAncestors[j]) {\n return {\n fork: [],\n otherFork: [other, ...otherAncestors.slice(0, j)],\n common: [this, ...ancestors],\n } as AncestryComparison;\n }\n if (ancestor === otherAncestors[j]) {\n return {\n fork: [this, ...ancestors.slice(0, i)],\n otherFork: [other, ...otherAncestors.slice(0, j)],\n common: ancestors.slice(i),\n } as AncestryComparison;\n }\n }\n }\n // nothing shared\n return {\n fork: [this, ...ancestors],\n otherFork: [other, ...otherAncestors],\n common: [],\n } as AncestryComparison;\n }\n\n /**\n *\n * @param {StackedObject} other\n * @returns {boolean}\n */\n hasCommonAncestors(other: T): boolean {\n const commonAncestors = this.findCommonAncestors(other);\n return commonAncestors && !!commonAncestors.common.length;\n }\n\n /**\n *\n * @param {FabricObject} other object to compare against\n * @returns {boolean | undefined} if objects do not share a common ancestor or they are strictly equal it is impossible to determine which is in front of the other; in such cases the function returns `undefined`\n */\n isInFrontOf(other: T): boolean | undefined {\n if (this === other) {\n return undefined;\n }\n const ancestorData = this.findCommonAncestors(other);\n\n if (ancestorData.fork.includes(other as any)) {\n return true;\n }\n if (ancestorData.otherFork.includes(this as any)) {\n return false;\n }\n // if there isn't a common ancestor, we take the canvas.\n // if there is no canvas, there is nothing to compare\n const firstCommonAncestor = ancestorData.common[0] || this.canvas;\n if (!firstCommonAncestor) {\n return undefined;\n }\n const headOfFork = ancestorData.fork.pop(),\n headOfOtherFork = ancestorData.otherFork.pop(),\n thisIndex = (firstCommonAncestor as TCollection)._objects.indexOf(\n headOfFork as any,\n ),\n otherIndex = (firstCommonAncestor as TCollection)._objects.indexOf(\n headOfOtherFork as any,\n );\n return thisIndex > -1 && thisIndex > otherIndex;\n }\n\n // #region Serialization\n /**\n * Define a list of custom properties that will be serialized when\n * instance.toObject() gets called\n */\n static customProperties: string[] = [];\n\n /**\n * Returns an object representation of an instance\n * @param {string[]} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} Object representation of an instance\n */\n toObject(propertiesToInclude: any[] = []): any {\n const propertiesToSerialize = propertiesToInclude.concat(\n FabricObject.customProperties,\n (this.constructor as typeof FabricObject).customProperties || [],\n );\n let clipPathData: Partial | undefined;\n const NUM_FRACTION_DIGITS = config.NUM_FRACTION_DIGITS;\n const {\n clipPath,\n fill,\n stroke,\n shadow,\n strokeDashArray,\n left,\n top,\n originX,\n originY,\n width,\n height,\n strokeWidth,\n strokeLineCap,\n strokeDashOffset,\n strokeLineJoin,\n strokeUniform,\n strokeMiterLimit,\n scaleX,\n scaleY,\n angle,\n flipX,\n flipY,\n opacity,\n visible,\n backgroundColor,\n fillRule,\n paintFirst,\n globalCompositeOperation,\n skewX,\n skewY,\n } = this;\n if (clipPath && !clipPath.excludeFromExport) {\n clipPathData = clipPath.toObject(\n propertiesToSerialize.concat('inverted', 'absolutePositioned'),\n );\n }\n const toFixedBound = (val: number) => toFixed(val, NUM_FRACTION_DIGITS);\n const object = {\n ...pick(this, propertiesToSerialize as (keyof this)[]),\n type: (this.constructor as typeof FabricObject).type,\n version: VERSION,\n originX,\n originY,\n left: toFixedBound(left),\n top: toFixedBound(top),\n width: toFixedBound(width),\n height: toFixedBound(height),\n fill: isSerializableFiller(fill) ? fill.toObject() : fill,\n stroke: isSerializableFiller(stroke) ? stroke.toObject() : stroke,\n strokeWidth: toFixedBound(strokeWidth),\n strokeDashArray: strokeDashArray\n ? strokeDashArray.concat()\n : strokeDashArray,\n strokeLineCap,\n strokeDashOffset,\n strokeLineJoin,\n strokeUniform,\n strokeMiterLimit: toFixedBound(strokeMiterLimit),\n scaleX: toFixedBound(scaleX),\n scaleY: toFixedBound(scaleY),\n angle: toFixedBound(angle),\n flipX,\n flipY,\n opacity: toFixedBound(opacity),\n shadow: shadow ? shadow.toObject() : shadow,\n visible,\n backgroundColor,\n fillRule,\n paintFirst,\n globalCompositeOperation,\n skewX: toFixedBound(skewX),\n skewY: toFixedBound(skewY),\n ...(clipPathData ? { clipPath: clipPathData } : null),\n };\n\n return !this.includeDefaultValues\n ? this._removeDefaultValues(object)\n : object;\n }\n\n /**\n * Returns (dataless) object representation of an instance\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} Object representation of an instance\n */\n toDatalessObject(propertiesToInclude?: any[]): any {\n // will be overwritten by subclasses\n return this.toObject(propertiesToInclude);\n }\n\n /**\n * @private\n * @param {Object} object\n */\n _removeDefaultValues(object: T): Partial {\n // getDefaults() ( get from static ownDefaults ) should win over prototype since anyway they get assigned to instance\n // ownDefault vs prototype is swappable only if you change all the fabric objects consistently.\n const defaults = (this.constructor as typeof FabricObject).getDefaults();\n const hasStaticDefaultValues = Object.keys(defaults).length > 0;\n const baseValues = hasStaticDefaultValues\n ? defaults\n : Object.getPrototypeOf(this);\n\n return pickBy(object, (value, key) => {\n if (key === LEFT || key === TOP || key === 'type') {\n return true;\n }\n const baseValue = baseValues[key];\n return (\n value !== baseValue &&\n // basically a check for [] === []\n !(\n Array.isArray(value) &&\n Array.isArray(baseValue) &&\n value.length === 0 &&\n baseValue.length === 0\n )\n );\n });\n }\n\n /**\n * Returns a string representation of an instance\n * @return {String}\n */\n toString() {\n return `#<${(this.constructor as typeof FabricObject).type}>`;\n }\n\n /**\n *\n * @param {Function} klass\n * @param {object} object\n * @param {object} [options]\n * @param {string} [options.extraParam] property to pass as first argument to the constructor\n * @param {AbortSignal} [options.signal] handle aborting, see https://developer.mozilla.org/en-US/docs/Web/API/AbortController/signal\n * @returns {Promise}\n */\n static _fromObject(\n { type, ...serializedObjectOptions }: Record,\n { extraParam, ...options }: Abortable & { extraParam?: string } = {},\n ): Promise {\n return enlivenObjectEnlivables(serializedObjectOptions, options).then(\n (enlivedObjectOptions) => {\n // from the resulting enlived options, extract options.extraParam to arg0\n // to avoid accidental overrides later\n if (extraParam) {\n delete enlivedObjectOptions[extraParam];\n return new this(\n serializedObjectOptions[extraParam],\n // @ts-expect-error different signature\n enlivedObjectOptions,\n );\n } else {\n return new this(enlivedObjectOptions);\n }\n },\n ) as Promise;\n }\n\n /**\n *\n * @param {object} object\n * @param {object} [options]\n * @param {AbortSignal} [options.signal] handle aborting, see https://developer.mozilla.org/en-US/docs/Web/API/AbortController/signal\n * @returns {Promise}\n */\n static fromObject>(\n object: T,\n options?: Abortable,\n ) {\n return this._fromObject(object, options);\n }\n}\n\nclassRegistry.setClass(FabricObject);\nclassRegistry.setClass(FabricObject, 'object');\n","import type {\n TModificationEvents,\n Transform,\n TransformActionHandler,\n} from '../EventTypeDefs';\nimport { fireEvent } from './fireEvent';\nimport { commonEventInfo } from './util';\n\n/**\n * Wrap an action handler with firing an event if the action is performed\n * @param {TModificationEvents} eventName the event we want to fire\n * @param {TransformActionHandler} actionHandler the function to wrap\n * @param {object} extraEventInfo extra information to pas to the event handler\n * @return {TransformActionHandler} a function with an action handler signature\n */\nexport const wrapWithFireEvent = <\n T extends Transform,\n P extends object = Record,\n>(\n eventName: TModificationEvents,\n actionHandler: TransformActionHandler,\n extraEventInfo?: P,\n) => {\n return ((eventData, transform, x, y) => {\n const actionPerformed = actionHandler(eventData, transform, x, y);\n if (actionPerformed) {\n fireEvent(eventName, {\n ...commonEventInfo(eventData, transform, x, y),\n ...extraEventInfo,\n });\n }\n return actionPerformed;\n }) as TransformActionHandler;\n};\n","import type { Transform, TransformActionHandler } from '../EventTypeDefs';\n\n/**\n * Wrap an action handler with saving/restoring object position on the transform.\n * this is the code that permits to objects to keep their position while transforming.\n * @param {Function} actionHandler the function to wrap\n * @return {Function} a function with an action handler signature\n */\nexport function wrapWithFixedAnchor(\n actionHandler: TransformActionHandler,\n) {\n return ((eventData, transform, x, y) => {\n const { target, originX, originY } = transform,\n centerPoint = target.getRelativeCenterPoint(),\n constraint = target.translateToOriginPoint(centerPoint, originX, originY),\n actionPerformed = actionHandler(eventData, transform, x, y);\n // flipping requires to change the transform origin, so we read from the mutated transform\n // instead of leveraging the one destructured before\n target.setPositionByOrigin(\n constraint,\n transform.originX,\n transform.originY,\n );\n return actionPerformed;\n }) as TransformActionHandler;\n}\n","import type { TransformActionHandler } from '../EventTypeDefs';\nimport { CENTER, LEFT, RESIZING, RIGHT } from '../constants';\nimport { resolveOrigin } from '../util/misc/resolveOrigin';\nimport { getLocalPoint, isTransformCentered } from './util';\nimport { wrapWithFireEvent } from './wrapWithFireEvent';\nimport { wrapWithFixedAnchor } from './wrapWithFixedAnchor';\n\n/**\n * Action handler to change object's width\n * Needs to be wrapped with `wrapWithFixedAnchor` to be effective\n * @param {Event} eventData javascript event that is doing the transform\n * @param {Object} transform javascript object containing a series of information around the current transform\n * @param {number} x current mouse x position, canvas normalized\n * @param {number} y current mouse y position, canvas normalized\n * @return {Boolean} true if some change happened\n */\nexport const changeObjectWidth: TransformActionHandler = (\n eventData,\n transform,\n x,\n y,\n) => {\n const localPoint = getLocalPoint(\n transform,\n transform.originX,\n transform.originY,\n x,\n y,\n );\n // make sure the control changes width ONLY from it's side of target\n if (\n resolveOrigin(transform.originX) === resolveOrigin(CENTER) ||\n (resolveOrigin(transform.originX) === resolveOrigin(RIGHT) &&\n localPoint.x < 0) ||\n (resolveOrigin(transform.originX) === resolveOrigin(LEFT) &&\n localPoint.x > 0)\n ) {\n const { target } = transform,\n strokePadding =\n target.strokeWidth / (target.strokeUniform ? target.scaleX : 1),\n multiplier = isTransformCentered(transform) ? 2 : 1,\n oldWidth = target.width,\n newWidth =\n Math.abs((localPoint.x * multiplier) / target.scaleX) - strokePadding;\n target.set('width', Math.max(newWidth, 1));\n // check against actual target width in case `newWidth` was rejected\n return oldWidth !== target.width;\n }\n return false;\n};\n\nexport const changeWidth = wrapWithFireEvent(\n RESIZING,\n wrapWithFixedAnchor(changeObjectWidth),\n);\n","import { FILL, STROKE, twoMathPi } from '../constants';\nimport type { InteractiveFabricObject } from '../shapes/Object/InteractiveObject';\nimport { degreesToRadians } from '../util/misc/radiansDegreesConversion';\nimport type { Control } from './Control';\n\nexport type ControlRenderingStyleOverride = Partial<\n Pick<\n InteractiveFabricObject,\n | 'cornerStyle'\n | 'cornerSize'\n | 'cornerColor'\n | 'cornerStrokeColor'\n | 'cornerDashArray'\n | 'transparentCorners'\n >\n>;\n\nexport type ControlRenderer<\n O extends InteractiveFabricObject = InteractiveFabricObject,\n> = (\n ctx: CanvasRenderingContext2D,\n left: number,\n top: number,\n styleOverride: ControlRenderingStyleOverride,\n fabricObject: O,\n) => void;\n\n/**\n * Render a round control, as per fabric features.\n * This function is written to respect object properties like transparentCorners, cornerSize\n * cornerColor, cornerStrokeColor\n * plus the addition of offsetY and offsetX.\n * @param {CanvasRenderingContext2D} ctx context to render on\n * @param {Number} left x coordinate where the control center should be\n * @param {Number} top y coordinate where the control center should be\n * @param {Object} styleOverride override for FabricObject controls style\n * @param {FabricObject} fabricObject the fabric object for which we are rendering controls\n */\nexport function renderCircleControl(\n this: Control,\n ctx: CanvasRenderingContext2D,\n left: number,\n top: number,\n styleOverride: ControlRenderingStyleOverride,\n fabricObject: InteractiveFabricObject,\n) {\n styleOverride = styleOverride || {};\n const xSize =\n this.sizeX || styleOverride.cornerSize || fabricObject.cornerSize,\n ySize = this.sizeY || styleOverride.cornerSize || fabricObject.cornerSize,\n transparentCorners =\n typeof styleOverride.transparentCorners !== 'undefined'\n ? styleOverride.transparentCorners\n : fabricObject.transparentCorners,\n methodName = transparentCorners ? STROKE : FILL,\n stroke =\n !transparentCorners &&\n (styleOverride.cornerStrokeColor || fabricObject.cornerStrokeColor);\n let myLeft = left,\n myTop = top,\n size;\n ctx.save();\n ctx.fillStyle = styleOverride.cornerColor || fabricObject.cornerColor || '';\n ctx.strokeStyle =\n styleOverride.cornerStrokeColor || fabricObject.cornerStrokeColor || '';\n // TODO: use proper ellipse code.\n if (xSize > ySize) {\n size = xSize;\n ctx.scale(1.0, ySize / xSize);\n myTop = (top * xSize) / ySize;\n } else if (ySize > xSize) {\n size = ySize;\n ctx.scale(xSize / ySize, 1.0);\n myLeft = (left * ySize) / xSize;\n } else {\n size = xSize;\n }\n ctx.beginPath();\n ctx.arc(myLeft, myTop, size / 2, 0, twoMathPi, false);\n ctx[methodName]();\n if (stroke) {\n ctx.stroke();\n }\n ctx.restore();\n}\n\n/**\n * Render a square control, as per fabric features.\n * This function is written to respect object properties like transparentCorners, cornerSize\n * cornerColor, cornerStrokeColor\n * plus the addition of offsetY and offsetX.\n * @param {CanvasRenderingContext2D} ctx context to render on\n * @param {Number} left x coordinate where the control center should be\n * @param {Number} top y coordinate where the control center should be\n * @param {Object} styleOverride override for FabricObject controls style\n * @param {FabricObject} fabricObject the fabric object for which we are rendering controls\n */\nexport function renderSquareControl(\n this: Control,\n ctx: CanvasRenderingContext2D,\n left: number,\n top: number,\n styleOverride: ControlRenderingStyleOverride,\n fabricObject: InteractiveFabricObject,\n) {\n styleOverride = styleOverride || {};\n const xSize =\n this.sizeX || styleOverride.cornerSize || fabricObject.cornerSize,\n ySize = this.sizeY || styleOverride.cornerSize || fabricObject.cornerSize,\n transparentCorners =\n typeof styleOverride.transparentCorners !== 'undefined'\n ? styleOverride.transparentCorners\n : fabricObject.transparentCorners,\n methodName = transparentCorners ? STROKE : FILL,\n stroke =\n !transparentCorners &&\n (styleOverride.cornerStrokeColor || fabricObject.cornerStrokeColor),\n xSizeBy2 = xSize / 2,\n ySizeBy2 = ySize / 2;\n ctx.save();\n ctx.fillStyle = styleOverride.cornerColor || fabricObject.cornerColor || '';\n ctx.strokeStyle =\n styleOverride.cornerStrokeColor || fabricObject.cornerStrokeColor || '';\n ctx.translate(left, top);\n // angle is relative to canvas plane\n const angle = fabricObject.getTotalAngle();\n ctx.rotate(degreesToRadians(angle));\n // this does not work, and fixed with ( && ) does not make sense.\n // to have real transparent corners we need the controls on upperCanvas\n // transparentCorners || ctx.clearRect(-xSizeBy2, -ySizeBy2, xSize, ySize);\n ctx[`${methodName}Rect`](-xSizeBy2, -ySizeBy2, xSize, ySize);\n if (stroke) {\n ctx.strokeRect(-xSizeBy2, -ySizeBy2, xSize, ySize);\n }\n ctx.restore();\n}\n","/* eslint-disable @typescript-eslint/no-unused-vars */\nimport type {\n ControlActionHandler,\n TPointerEvent,\n TransformActionHandler,\n} from '../EventTypeDefs';\nimport { Intersection } from '../Intersection';\nimport { Point } from '../Point';\nimport { SCALE } from '../constants';\nimport type {\n InteractiveFabricObject,\n TOCoord,\n} from '../shapes/Object/InteractiveObject';\nimport type { TCornerPoint, TDegree, TMat2D } from '../typedefs';\nimport {\n createRotateMatrix,\n createScaleMatrix,\n createTranslateMatrix,\n multiplyTransformMatrixArray,\n} from '../util/misc/matrix';\nimport type { ControlRenderingStyleOverride } from './controlRendering';\nimport { renderCircleControl, renderSquareControl } from './controlRendering';\n\nexport class Control {\n /**\n * keep track of control visibility.\n * mainly for backward compatibility.\n * if you do not want to see a control, you can remove it\n * from the control set.\n * @type {Boolean}\n * @default true\n */\n visible = true;\n\n /**\n * Name of the action that the control will likely execute.\n * This is optional. FabricJS uses to identify what the user is doing for some\n * extra optimizations. If you are writing a custom control and you want to know\n * somewhere else in the code what is going on, you can use this string here.\n * you can also provide a custom getActionName if your control run multiple actions\n * depending on some external state.\n * default to scale since is the most common, used on 4 corners by default\n * @type {String}\n * @default 'scale'\n */\n actionName = SCALE;\n\n /**\n * Drawing angle of the control.\n * NOT used for now, but name marked as needed for internal logic\n * example: to reuse the same drawing function for different rotated controls\n * @type {Number}\n * @default 0\n */\n angle = 0;\n\n /**\n * Relative position of the control. X\n * 0,0 is the center of the Object, while -0.5 (left) or 0.5 (right) are the extremities\n * of the bounding box.\n * @type {Number}\n * @default 0\n */\n x = 0;\n\n /**\n * Relative position of the control. Y\n * 0,0 is the center of the Object, while -0.5 (top) or 0.5 (bottom) are the extremities\n * of the bounding box.\n * @type {Number}\n * @default 0\n */\n y = 0;\n\n /**\n * Horizontal offset of the control from the defined position. In pixels\n * Positive offset moves the control to the right, negative to the left.\n * It used when you want to have position of control that does not scale with\n * the bounding box. Example: rotation control is placed at x:0, y: 0.5 on\n * the boundind box, with an offset of 30 pixels vertically. Those 30 pixels will\n * stay 30 pixels no matter how the object is big. Another example is having 2\n * controls in the corner, that stay in the same position when the object scale.\n * of the bounding box.\n * @type {Number}\n * @default 0\n */\n offsetX = 0;\n\n /**\n * Vertical offset of the control from the defined position. In pixels\n * Positive offset moves the control to the bottom, negative to the top.\n * @type {Number}\n * @default 0\n */\n offsetY = 0;\n\n /**\n * Sets the length of the control. If null, defaults to object's cornerSize.\n * Expects both sizeX and sizeY to be set when set.\n * @type {?Number}\n * @default null\n */\n sizeX = 0;\n\n /**\n * Sets the height of the control. If null, defaults to object's cornerSize.\n * Expects both sizeX and sizeY to be set when set.\n * @type {?Number}\n * @default null\n */\n sizeY = 0;\n\n /**\n * Sets the length of the touch area of the control. If null, defaults to object's touchCornerSize.\n * Expects both touchSizeX and touchSizeY to be set when set.\n * @type {?Number}\n * @default null\n */\n touchSizeX = 0;\n\n /**\n * Sets the height of the touch area of the control. If null, defaults to object's touchCornerSize.\n * Expects both touchSizeX and touchSizeY to be set when set.\n * @type {?Number}\n * @default null\n */\n touchSizeY = 0;\n\n /**\n * Css cursor style to display when the control is hovered.\n * if the method `cursorStyleHandler` is provided, this property is ignored.\n * @type {String}\n * @default 'crosshair'\n */\n cursorStyle = 'crosshair';\n\n /**\n * If controls has an offsetY or offsetX, draw a line that connects\n * the control to the bounding box\n * @type {Boolean}\n * @default false\n */\n withConnection = false;\n\n constructor(options?: Partial) {\n Object.assign(this, options);\n }\n\n /**\n * The control actionHandler, provide one to handle action ( control being moved )\n * @param {Event} eventData the native mouse event\n * @param {Transform} transformData properties of the current transform\n * @param {Number} x x position of the cursor\n * @param {Number} y y position of the cursor\n * @return {Boolean} true if the action/event modified the object\n */\n declare actionHandler: TransformActionHandler;\n\n /**\n * The control handler for mouse down, provide one to handle mouse down on control\n * @param {Event} eventData the native mouse event\n * @param {Transform} transformData properties of the current transform\n * @param {Number} x x position of the cursor\n * @param {Number} y y position of the cursor\n * @return {Boolean} true if the action/event modified the object\n */\n declare mouseDownHandler?: ControlActionHandler;\n\n /**\n * The control mouseUpHandler, provide one to handle an effect on mouse up.\n * @param {Event} eventData the native mouse event\n * @param {Transform} transformData properties of the current transform\n * @param {Number} x x position of the cursor\n * @param {Number} y y position of the cursor\n * @return {Boolean} true if the action/event modified the object\n */\n declare mouseUpHandler?: ControlActionHandler;\n\n shouldActivate(\n controlKey: string,\n fabricObject: InteractiveFabricObject,\n pointer: Point,\n { tl, tr, br, bl }: TCornerPoint,\n ) {\n // TODO: locking logic can be handled here instead of in the control handler logic\n return (\n fabricObject.canvas?.getActiveObject() === fabricObject &&\n fabricObject.isControlVisible(controlKey) &&\n Intersection.isPointInPolygon(pointer, [tl, tr, br, bl])\n );\n }\n\n /**\n * Returns control actionHandler\n * @param {Event} eventData the native mouse event\n * @param {FabricObject} fabricObject on which the control is displayed\n * @param {Control} control control for which the action handler is being asked\n * @return {Function} the action handler\n */\n getActionHandler(\n eventData: TPointerEvent,\n fabricObject: InteractiveFabricObject,\n control: Control,\n ): TransformActionHandler | undefined {\n return this.actionHandler;\n }\n\n /**\n * Returns control mouseDown handler\n * @param {Event} eventData the native mouse event\n * @param {FabricObject} fabricObject on which the control is displayed\n * @param {Control} control control for which the action handler is being asked\n * @return {Function} the action handler\n */\n getMouseDownHandler(\n eventData: TPointerEvent,\n fabricObject: InteractiveFabricObject,\n control: Control,\n ): ControlActionHandler | undefined {\n return this.mouseDownHandler;\n }\n\n /**\n * Returns control mouseUp handler.\n * During actions the fabricObject or the control can be of different obj\n * @param {Event} eventData the native mouse event\n * @param {FabricObject} fabricObject on which the control is displayed\n * @param {Control} control control for which the action handler is being asked\n * @return {Function} the action handler\n */\n getMouseUpHandler(\n eventData: TPointerEvent,\n fabricObject: InteractiveFabricObject,\n control: Control,\n ): ControlActionHandler | undefined {\n return this.mouseUpHandler;\n }\n\n /**\n * Returns control cursorStyle for css using cursorStyle. If you need a more elaborate\n * function you can pass one in the constructor\n * the cursorStyle property\n * @param {Event} eventData the native mouse event\n * @param {Control} control the current control ( likely this)\n * @param {FabricObject} object on which the control is displayed\n * @return {String}\n */\n cursorStyleHandler(\n eventData: TPointerEvent,\n control: Control,\n fabricObject: InteractiveFabricObject,\n coord: TOCoord,\n ) {\n return control.cursorStyle;\n }\n\n /**\n * Returns the action name. The basic implementation just return the actionName property.\n * @param {Event} eventData the native mouse event\n * @param {Control} control the current control ( likely this)\n * @param {FabricObject} object on which the control is displayed\n * @return {String}\n */\n getActionName(\n eventData: TPointerEvent,\n control: Control,\n fabricObject: InteractiveFabricObject,\n ) {\n return control.actionName;\n }\n\n /**\n * Returns controls visibility\n * @param {FabricObject} object on which the control is displayed\n * @param {String} controlKey key where the control is memorized on the\n * @return {Boolean}\n */\n getVisibility(fabricObject: InteractiveFabricObject, controlKey: string) {\n return fabricObject._controlsVisibility?.[controlKey] ?? this.visible;\n }\n\n /**\n * Sets controls visibility\n * @param {Boolean} visibility for the object\n * @return {Void}\n */\n setVisibility(\n visibility: boolean,\n name?: string,\n fabricObject?: InteractiveFabricObject,\n ) {\n this.visible = visibility;\n }\n\n positionHandler(\n dim: Point,\n finalMatrix: TMat2D,\n fabricObject: InteractiveFabricObject,\n currentControl: Control,\n ) {\n return new Point(\n this.x * dim.x + this.offsetX,\n this.y * dim.y + this.offsetY,\n ).transform(finalMatrix);\n }\n\n /**\n * Returns the coords for this control based on object values.\n * @param {Number} objectAngle angle from the fabric object holding the control\n * @param {Number} objectCornerSize cornerSize from the fabric object holding the control (or touchCornerSize if\n * isTouch is true)\n * @param {Number} centerX x coordinate where the control center should be\n * @param {Number} centerY y coordinate where the control center should be\n * @param {boolean} isTouch true if touch corner, false if normal corner\n */\n calcCornerCoords(\n angle: TDegree,\n objectCornerSize: number,\n centerX: number,\n centerY: number,\n isTouch: boolean,\n fabricObject: InteractiveFabricObject,\n ) {\n const t = multiplyTransformMatrixArray([\n createTranslateMatrix(centerX, centerY),\n createRotateMatrix({ angle }),\n createScaleMatrix(\n (isTouch ? this.touchSizeX : this.sizeX) || objectCornerSize,\n (isTouch ? this.touchSizeY : this.sizeY) || objectCornerSize,\n ),\n ]);\n return {\n tl: new Point(-0.5, -0.5).transform(t),\n tr: new Point(0.5, -0.5).transform(t),\n br: new Point(0.5, 0.5).transform(t),\n bl: new Point(-0.5, 0.5).transform(t),\n };\n }\n\n /**\n * Render function for the control.\n * When this function runs the context is unscaled. unrotate. Just retina scaled.\n * all the functions will have to translate to the point left,top before starting Drawing\n * if they want to draw a control where the position is detected.\n * left and top are the result of the positionHandler function\n * @param {RenderingContext2D} ctx the context where the control will be drawn\n * @param {Number} left position of the canvas where we are about to render the control.\n * @param {Number} top position of the canvas where we are about to render the control.\n * @param {Object} styleOverride\n * @param {FabricObject} fabricObject the object where the control is about to be rendered\n */\n render(\n ctx: CanvasRenderingContext2D,\n left: number,\n top: number,\n styleOverride: ControlRenderingStyleOverride | undefined,\n fabricObject: InteractiveFabricObject,\n ) {\n styleOverride = styleOverride || {};\n switch (styleOverride.cornerStyle || fabricObject.cornerStyle) {\n case 'circle':\n renderCircleControl.call(\n this,\n ctx,\n left,\n top,\n styleOverride,\n fabricObject,\n );\n break;\n default:\n renderSquareControl.call(\n this,\n ctx,\n left,\n top,\n styleOverride,\n fabricObject,\n );\n }\n }\n}\n","import type {\n ControlCursorCallback,\n TransformActionHandler,\n} from '../EventTypeDefs';\nimport { ROTATING } from '../constants';\nimport { radiansToDegrees } from '../util/misc/radiansDegreesConversion';\nimport { isLocked, NOT_ALLOWED_CURSOR } from './util';\nimport { wrapWithFireEvent } from './wrapWithFireEvent';\nimport { wrapWithFixedAnchor } from './wrapWithFixedAnchor';\n\n/**\n * Find the correct style for the control that is used for rotation.\n * this function is very simple and it just take care of not-allowed or standard cursor\n * @param {Event} eventData the javascript event that is causing the scale\n * @param {Control} control the control that is interested in the action\n * @param {FabricObject} fabricObject the fabric object that is interested in the action\n * @return {String} a valid css string for the cursor\n */\nexport const rotationStyleHandler: ControlCursorCallback = (\n eventData,\n control,\n fabricObject,\n) => {\n if (fabricObject.lockRotation) {\n return NOT_ALLOWED_CURSOR;\n }\n return control.cursorStyle;\n};\n\n/**\n * Action handler for rotation and snapping, without anchor point.\n * Needs to be wrapped with `wrapWithFixedAnchor` to be effective\n * @param {Event} eventData javascript event that is doing the transform\n * @param {Object} transform javascript object containing a series of information around the current transform\n * @param {number} x current mouse x position, canvas normalized\n * @param {number} y current mouse y position, canvas normalized\n * @return {Boolean} true if some change happened\n * @private\n */\nconst rotateObjectWithSnapping: TransformActionHandler = (\n eventData,\n { target, ex, ey, theta, originX, originY },\n x,\n y,\n) => {\n const pivotPoint = target.translateToOriginPoint(\n target.getRelativeCenterPoint(),\n originX,\n originY,\n );\n\n if (isLocked(target, 'lockRotation')) {\n return false;\n }\n\n const lastAngle = Math.atan2(ey - pivotPoint.y, ex - pivotPoint.x),\n curAngle = Math.atan2(y - pivotPoint.y, x - pivotPoint.x);\n let angle = radiansToDegrees(curAngle - lastAngle + theta);\n\n if (target.snapAngle && target.snapAngle > 0) {\n const snapAngle = target.snapAngle,\n snapThreshold = target.snapThreshold || snapAngle,\n rightAngleLocked = Math.ceil(angle / snapAngle) * snapAngle,\n leftAngleLocked = Math.floor(angle / snapAngle) * snapAngle;\n\n if (Math.abs(angle - leftAngleLocked) < snapThreshold) {\n angle = leftAngleLocked;\n } else if (Math.abs(angle - rightAngleLocked) < snapThreshold) {\n angle = rightAngleLocked;\n }\n }\n\n // normalize angle to positive value\n if (angle < 0) {\n angle = 360 + angle;\n }\n angle %= 360;\n\n const hasRotated = target.angle !== angle;\n // TODO: why aren't we using set?\n target.angle = angle;\n return hasRotated;\n};\n\nexport const rotationWithSnapping = wrapWithFireEvent(\n ROTATING,\n wrapWithFixedAnchor(rotateObjectWithSnapping),\n);\n","import type {\n ControlCursorCallback,\n TPointerEvent,\n Transform,\n TransformActionHandler,\n} from '../EventTypeDefs';\nimport type { FabricObject } from '../shapes/Object/FabricObject';\nimport type { TAxis } from '../typedefs';\nimport type { Canvas } from '../canvas/Canvas';\nimport {\n findCornerQuadrant,\n getLocalPoint,\n invertOrigin,\n isLocked,\n isTransformCentered,\n NOT_ALLOWED_CURSOR,\n} from './util';\nimport { wrapWithFireEvent } from './wrapWithFireEvent';\nimport { wrapWithFixedAnchor } from './wrapWithFixedAnchor';\nimport { SCALE_X, SCALE_Y, SCALING } from '../constants';\n\ntype ScaleTransform = Transform & {\n gestureScale?: number;\n signX?: number;\n signY?: number;\n};\n\ntype ScaleBy = TAxis | 'equally' | '' | undefined;\n\n/**\n * Inspect event and fabricObject properties to understand if the scaling action\n * @param {Event} eventData from the user action\n * @param {FabricObject} fabricObject the fabric object about to scale\n * @return {Boolean} true if scale is proportional\n */\nexport function scaleIsProportional(\n eventData: TPointerEvent,\n fabricObject: FabricObject,\n): boolean {\n const canvas = fabricObject.canvas as Canvas,\n uniformIsToggled = eventData[canvas.uniScaleKey!];\n return (\n (canvas.uniformScaling && !uniformIsToggled) ||\n (!canvas.uniformScaling && uniformIsToggled)\n );\n}\n\n/**\n * Inspect fabricObject to understand if the current scaling action is allowed\n * @param {FabricObject} fabricObject the fabric object about to scale\n * @param {String} by 'x' or 'y' or ''\n * @param {Boolean} scaleProportionally true if we are trying to scale proportionally\n * @return {Boolean} true if scaling is not allowed at current conditions\n */\nexport function scalingIsForbidden(\n fabricObject: FabricObject,\n by: ScaleBy,\n scaleProportionally: boolean,\n) {\n const lockX = isLocked(fabricObject, 'lockScalingX'),\n lockY = isLocked(fabricObject, 'lockScalingY');\n if (lockX && lockY) {\n return true;\n }\n if (!by && (lockX || lockY) && scaleProportionally) {\n return true;\n }\n if (lockX && by === 'x') {\n return true;\n }\n if (lockY && by === 'y') {\n return true;\n }\n // code crashes because of a division by 0 if a 0 sized object is scaled\n // forbid to prevent scaling to happen. ISSUE-9475\n const { width, height, strokeWidth } = fabricObject;\n if (width === 0 && strokeWidth === 0 && by !== 'y') {\n return true;\n }\n if (height === 0 && strokeWidth === 0 && by !== 'x') {\n return true;\n }\n return false;\n}\n\nconst scaleMap = ['e', 'se', 's', 'sw', 'w', 'nw', 'n', 'ne', 'e'];\n\n/**\n * return the correct cursor style for the scale action\n * @param {Event} eventData the javascript event that is causing the scale\n * @param {Control} control the control that is interested in the action\n * @param {FabricObject} fabricObject the fabric object that is interested in the action\n * @return {String} a valid css string for the cursor\n */\nexport const scaleCursorStyleHandler: ControlCursorCallback = (\n eventData,\n control,\n fabricObject,\n coord,\n) => {\n const scaleProportionally = scaleIsProportional(eventData, fabricObject),\n by =\n control.x !== 0 && control.y === 0\n ? 'x'\n : control.x === 0 && control.y !== 0\n ? 'y'\n : '';\n if (scalingIsForbidden(fabricObject, by, scaleProportionally)) {\n return NOT_ALLOWED_CURSOR;\n }\n const n = findCornerQuadrant(fabricObject, control, coord);\n return `${scaleMap[n]}-resize`;\n};\n\n/**\n * Basic scaling logic, reused with different constrain for scaling X,Y, freely or equally.\n * Needs to be wrapped with `wrapWithFixedAnchor` to be effective\n * @param {Event} eventData javascript event that is doing the transform\n * @param {Object} transform javascript object containing a series of information around the current transform\n * @param {number} x current mouse x position, canvas normalized\n * @param {number} y current mouse y position, canvas normalized\n * @param {Object} options additional information for scaling\n * @param {String} options.by 'x', 'y', 'equally' or '' to indicate type of scaling\n * @return {Boolean} true if some change happened\n * @private\n */\nfunction scaleObject(\n eventData: TPointerEvent,\n transform: ScaleTransform,\n x: number,\n y: number,\n options: { by?: ScaleBy } = {},\n) {\n const target = transform.target,\n by = options.by,\n scaleProportionally = scaleIsProportional(eventData, target),\n forbidScaling = scalingIsForbidden(target, by, scaleProportionally);\n let newPoint, scaleX, scaleY, dim, signX, signY;\n\n if (forbidScaling) {\n return false;\n }\n if (transform.gestureScale) {\n scaleX = transform.scaleX * transform.gestureScale;\n scaleY = transform.scaleY * transform.gestureScale;\n } else {\n newPoint = getLocalPoint(\n transform,\n transform.originX,\n transform.originY,\n x,\n y,\n );\n // use of sign: We use sign to detect change of direction of an action. sign usually change when\n // we cross the origin point with the mouse. So a scale flip for example. There is an issue when scaling\n // by center and scaling using one middle control ( default: mr, mt, ml, mb), the mouse movement can easily\n // cross many time the origin point and flip the object. so we need a way to filter out the noise.\n // This ternary here should be ok to filter out X scaling when we want Y only and vice versa.\n signX = by !== 'y' ? Math.sign(newPoint.x || transform.signX || 1) : 1;\n signY = by !== 'x' ? Math.sign(newPoint.y || transform.signY || 1) : 1;\n if (!transform.signX) {\n transform.signX = signX;\n }\n if (!transform.signY) {\n transform.signY = signY;\n }\n\n if (\n isLocked(target, 'lockScalingFlip') &&\n (transform.signX !== signX || transform.signY !== signY)\n ) {\n return false;\n }\n\n dim = target._getTransformedDimensions();\n // missing detection of flip and logic to switch the origin\n if (scaleProportionally && !by) {\n // uniform scaling\n const distance = Math.abs(newPoint.x) + Math.abs(newPoint.y),\n { original } = transform,\n originalDistance =\n Math.abs((dim.x * original.scaleX) / target.scaleX) +\n Math.abs((dim.y * original.scaleY) / target.scaleY),\n scale = distance / originalDistance;\n scaleX = original.scaleX * scale;\n scaleY = original.scaleY * scale;\n } else {\n scaleX = Math.abs((newPoint.x * target.scaleX) / dim.x);\n scaleY = Math.abs((newPoint.y * target.scaleY) / dim.y);\n }\n // if we are scaling by center, we need to double the scale\n if (isTransformCentered(transform)) {\n scaleX *= 2;\n scaleY *= 2;\n }\n if (transform.signX !== signX && by !== 'y') {\n transform.originX = invertOrigin(transform.originX);\n scaleX *= -1;\n transform.signX = signX;\n }\n if (transform.signY !== signY && by !== 'x') {\n transform.originY = invertOrigin(transform.originY);\n scaleY *= -1;\n transform.signY = signY;\n }\n }\n // minScale is taken care of in the setter.\n const oldScaleX = target.scaleX,\n oldScaleY = target.scaleY;\n if (!by) {\n !isLocked(target, 'lockScalingX') && target.set(SCALE_X, scaleX);\n !isLocked(target, 'lockScalingY') && target.set(SCALE_Y, scaleY);\n } else {\n // forbidden cases already handled on top here.\n by === 'x' && target.set(SCALE_X, scaleX);\n by === 'y' && target.set(SCALE_Y, scaleY);\n }\n return oldScaleX !== target.scaleX || oldScaleY !== target.scaleY;\n}\n\n/**\n * Generic scaling logic, to scale from corners either equally or freely.\n * Needs to be wrapped with `wrapWithFixedAnchor` to be effective\n * @param {Event} eventData javascript event that is doing the transform\n * @param {Object} transform javascript object containing a series of information around the current transform\n * @param {number} x current mouse x position, canvas normalized\n * @param {number} y current mouse y position, canvas normalized\n * @return {Boolean} true if some change happened\n */\nexport const scaleObjectFromCorner: TransformActionHandler = (\n eventData,\n transform,\n x,\n y,\n) => {\n return scaleObject(eventData, transform, x, y);\n};\n\n/**\n * Scaling logic for the X axis.\n * Needs to be wrapped with `wrapWithFixedAnchor` to be effective\n * @param {Event} eventData javascript event that is doing the transform\n * @param {Object} transform javascript object containing a series of information around the current transform\n * @param {number} x current mouse x position, canvas normalized\n * @param {number} y current mouse y position, canvas normalized\n * @return {Boolean} true if some change happened\n */\nconst scaleObjectX: TransformActionHandler = (\n eventData,\n transform,\n x,\n y,\n) => {\n return scaleObject(eventData, transform, x, y, { by: 'x' });\n};\n\n/**\n * Scaling logic for the Y axis.\n * Needs to be wrapped with `wrapWithFixedAnchor` to be effective\n * @param {Event} eventData javascript event that is doing the transform\n * @param {Object} transform javascript object containing a series of information around the current transform\n * @param {number} x current mouse x position, canvas normalized\n * @param {number} y current mouse y position, canvas normalized\n * @return {Boolean} true if some change happened\n */\nconst scaleObjectY: TransformActionHandler = (\n eventData,\n transform,\n x,\n y,\n) => {\n return scaleObject(eventData, transform, x, y, { by: 'y' });\n};\n\nexport const scalingEqually = wrapWithFireEvent(\n SCALING,\n wrapWithFixedAnchor(scaleObjectFromCorner),\n);\n\nexport const scalingX = wrapWithFireEvent(\n SCALING,\n wrapWithFixedAnchor(scaleObjectX),\n);\n\nexport const scalingY = wrapWithFireEvent(\n SCALING,\n wrapWithFixedAnchor(scaleObjectY),\n);\n","import type {\n ControlCursorCallback,\n TPointerEvent,\n Transform,\n TransformActionHandler,\n} from '../EventTypeDefs';\nimport { resolveOrigin } from '../util/misc/resolveOrigin';\nimport { Point } from '../Point';\nimport type { TAxis, TAxisKey } from '../typedefs';\nimport {\n degreesToRadians,\n radiansToDegrees,\n} from '../util/misc/radiansDegreesConversion';\nimport {\n findCornerQuadrant,\n getLocalPoint,\n isLocked,\n NOT_ALLOWED_CURSOR,\n} from './util';\nimport { wrapWithFireEvent } from './wrapWithFireEvent';\nimport { wrapWithFixedAnchor } from './wrapWithFixedAnchor';\nimport {\n CENTER,\n SCALE_X,\n SCALE_Y,\n SKEWING,\n SKEW_X,\n SKEW_Y,\n} from '../constants';\n\nexport type SkewTransform = Transform & { skewingSide: -1 | 1 };\n\nconst AXIS_KEYS: Record<\n TAxis,\n {\n counterAxis: TAxis;\n scale: TAxisKey<'scale'>;\n skew: TAxisKey<'skew'>;\n lockSkewing: TAxisKey<'lockSkewing'>;\n origin: TAxisKey<'origin'>;\n flip: TAxisKey<'flip'>;\n }\n> = {\n x: {\n counterAxis: 'y',\n scale: SCALE_X,\n skew: SKEW_X,\n lockSkewing: 'lockSkewingX',\n origin: 'originX',\n flip: 'flipX',\n },\n y: {\n counterAxis: 'x',\n scale: SCALE_Y,\n skew: SKEW_Y,\n lockSkewing: 'lockSkewingY',\n origin: 'originY',\n flip: 'flipY',\n },\n};\n\nconst skewMap = ['ns', 'nesw', 'ew', 'nwse'];\n\n/**\n * return the correct cursor style for the skew action\n * @param {Event} eventData the javascript event that is causing the scale\n * @param {Control} control the control that is interested in the action\n * @param {FabricObject} fabricObject the fabric object that is interested in the action\n * @return {String} a valid css string for the cursor\n */\nexport const skewCursorStyleHandler: ControlCursorCallback = (\n eventData,\n control,\n fabricObject,\n coord,\n) => {\n if (control.x !== 0 && isLocked(fabricObject, 'lockSkewingY')) {\n return NOT_ALLOWED_CURSOR;\n }\n if (control.y !== 0 && isLocked(fabricObject, 'lockSkewingX')) {\n return NOT_ALLOWED_CURSOR;\n }\n const n = findCornerQuadrant(fabricObject, control, coord) % 4;\n return `${skewMap[n]}-resize`;\n};\n\n/**\n * Since skewing is applied before scaling, calculations are done in a scaleless plane\n * @see https://github.com/fabricjs/fabric.js/pull/8380\n */\nfunction skewObject(\n axis: TAxis,\n { target, ex, ey, skewingSide, ...transform }: SkewTransform,\n pointer: Point,\n) {\n const { skew: skewKey } = AXIS_KEYS[axis],\n offset = pointer\n .subtract(new Point(ex, ey))\n .divide(new Point(target.scaleX, target.scaleY))[axis],\n skewingBefore = target[skewKey],\n skewingStart = transform[skewKey],\n shearingStart = Math.tan(degreesToRadians(skewingStart)),\n // let a, b be the size of target\n // let a' be the value of a after applying skewing\n // then:\n // a' = a + b * skewA => skewA = (a' - a) / b\n // the value b is tricky since skewY is applied before skewX\n b =\n axis === 'y'\n ? target._getTransformedDimensions({\n scaleX: 1,\n scaleY: 1,\n // since skewY is applied before skewX, b (=width) is not affected by skewX\n skewX: 0,\n }).x\n : target._getTransformedDimensions({\n scaleX: 1,\n scaleY: 1,\n }).y;\n\n const shearing =\n (2 * offset * skewingSide) /\n // we max out fractions to safeguard from asymptotic behavior\n Math.max(b, 1) +\n // add starting state\n shearingStart;\n\n const skewing = radiansToDegrees(Math.atan(shearing));\n\n target.set(skewKey, skewing);\n const changed = skewingBefore !== target[skewKey];\n\n if (changed && axis === 'y') {\n // we don't want skewing to affect scaleX\n // so we factor it by the inverse skewing diff to make it seem unchanged to the viewer\n const { skewX, scaleX } = target,\n dimBefore = target._getTransformedDimensions({ skewY: skewingBefore }),\n dimAfter = target._getTransformedDimensions(),\n compensationFactor = skewX !== 0 ? dimBefore.x / dimAfter.x : 1;\n compensationFactor !== 1 &&\n target.set(SCALE_X, compensationFactor * scaleX);\n }\n\n return changed;\n}\n\n/**\n * Wrapped Action handler for skewing on a given axis, takes care of the\n * skew direction and determines the correct transform origin for the anchor point\n * @param {Event} eventData javascript event that is doing the transform\n * @param {Object} transform javascript object containing a series of information around the current transform\n * @param {number} x current mouse x position, canvas normalized\n * @param {number} y current mouse y position, canvas normalized\n * @return {Boolean} true if some change happened\n */\nfunction skewHandler(\n axis: TAxis,\n eventData: TPointerEvent,\n transform: Transform,\n x: number,\n y: number,\n) {\n const { target } = transform,\n {\n counterAxis,\n origin: originKey,\n lockSkewing: lockSkewingKey,\n skew: skewKey,\n flip: flipKey,\n } = AXIS_KEYS[axis];\n if (isLocked(target, lockSkewingKey)) {\n return false;\n }\n\n const { origin: counterOriginKey, flip: counterFlipKey } =\n AXIS_KEYS[counterAxis],\n counterOriginFactor =\n resolveOrigin(transform[counterOriginKey]) *\n (target[counterFlipKey] ? -1 : 1),\n // if the counter origin is top/left (= -0.5) then we are skewing x/y values on the bottom/right side of target respectively.\n // if the counter origin is bottom/right (= 0.5) then we are skewing x/y values on the top/left side of target respectively.\n // skewing direction on the top/left side of target is OPPOSITE to the direction of the movement of the pointer,\n // so we factor skewing direction by this value.\n skewingSide = (-Math.sign(counterOriginFactor) *\n (target[flipKey] ? -1 : 1)) as 1 | -1,\n skewingDirection =\n ((target[skewKey] === 0 &&\n // in case skewing equals 0 we use the pointer offset from target center to determine the direction of skewing\n getLocalPoint(transform, CENTER, CENTER, x, y)[axis] > 0) ||\n // in case target has skewing we use that as the direction\n target[skewKey] > 0\n ? 1\n : -1) * skewingSide,\n // anchor to the opposite side of the skewing direction\n // normalize value from [-1, 1] to origin value [0, 1]\n origin = -skewingDirection * 0.5 + 0.5;\n\n const finalHandler = wrapWithFireEvent(\n SKEWING,\n wrapWithFixedAnchor((eventData, transform, x, y) =>\n skewObject(axis, transform, new Point(x, y)),\n ),\n );\n\n return finalHandler(\n eventData,\n {\n ...transform,\n [originKey]: origin,\n skewingSide,\n },\n x,\n y,\n );\n}\n\n/**\n * Wrapped Action handler for skewing on the X axis, takes care of the\n * skew direction and determines the correct transform origin for the anchor point\n * @param {Event} eventData javascript event that is doing the transform\n * @param {Object} transform javascript object containing a series of information around the current transform\n * @param {number} x current mouse x position, canvas normalized\n * @param {number} y current mouse y position, canvas normalized\n * @return {Boolean} true if some change happened\n */\nexport const skewHandlerX: TransformActionHandler = (\n eventData,\n transform,\n x,\n y,\n) => {\n return skewHandler('x', eventData, transform, x, y);\n};\n\n/**\n * Wrapped Action handler for skewing on the Y axis, takes care of the\n * skew direction and determines the correct transform origin for the anchor point\n * @param {Event} eventData javascript event that is doing the transform\n * @param {Object} transform javascript object containing a series of information around the current transform\n * @param {number} x current mouse x position, canvas normalized\n * @param {number} y current mouse y position, canvas normalized\n * @return {Boolean} true if some change happened\n */\nexport const skewHandlerY: TransformActionHandler = (\n eventData,\n transform,\n x,\n y,\n) => {\n return skewHandler('y', eventData, transform, x, y);\n};\n","import type {\n ControlCallback,\n ControlCursorCallback,\n TPointerEvent,\n TransformActionHandler,\n} from '../EventTypeDefs';\nimport { SCALE_X, SCALE_Y, SKEW_X, SKEW_Y } from '../constants';\nimport type { FabricObject } from '../shapes/Object/FabricObject';\nimport type { TAxisKey } from '../typedefs';\nimport { scaleCursorStyleHandler, scalingX, scalingY } from './scale';\nimport { skewCursorStyleHandler, skewHandlerX, skewHandlerY } from './skew';\n\nfunction isAltAction(eventData: TPointerEvent, target: FabricObject) {\n return eventData[target.canvas!.altActionKey!];\n}\n\n/**\n * Inspect event, control and fabricObject to return the correct action name\n * @param {Event} eventData the javascript event that is causing the scale\n * @param {Control} control the control that is interested in the action\n * @param {FabricObject} fabricObject the fabric object that is interested in the action\n * @return {String} an action name\n */\nexport const scaleOrSkewActionName: ControlCallback<\n TAxisKey<'skew' | 'scale'> | ''\n> = (eventData, control, fabricObject) => {\n const isAlternative = isAltAction(eventData, fabricObject);\n if (control.x === 0) {\n // then is scaleY or skewX\n return isAlternative ? SKEW_X : SCALE_Y;\n }\n if (control.y === 0) {\n // then is scaleY or skewX\n return isAlternative ? SKEW_Y : SCALE_X;\n }\n return '';\n};\n\n/**\n * Combine skew and scale style handlers to cover fabric standard use case\n * @param {Event} eventData the javascript event that is causing the scale\n * @param {Control} control the control that is interested in the action\n * @param {FabricObject} fabricObject the fabric object that is interested in the action\n * @return {String} a valid css string for the cursor\n */\nexport const scaleSkewCursorStyleHandler: ControlCursorCallback = (\n eventData,\n control,\n fabricObject,\n coord,\n) => {\n return isAltAction(eventData, fabricObject)\n ? skewCursorStyleHandler(eventData, control, fabricObject, coord)\n : scaleCursorStyleHandler(eventData, control, fabricObject, coord);\n};\n/**\n * Composed action handler to either scale X or skew Y\n * Needs to be wrapped with `wrapWithFixedAnchor` to be effective\n * @param {Event} eventData javascript event that is doing the transform\n * @param {Object} transform javascript object containing a series of information around the current transform\n * @param {number} x current mouse x position, canvas normalized\n * @param {number} y current mouse y position, canvas normalized\n * @return {Boolean} true if some change happened\n */\nexport const scalingXOrSkewingY: TransformActionHandler = (\n eventData,\n transform,\n x,\n y,\n) => {\n return isAltAction(eventData, transform.target)\n ? skewHandlerY(eventData, transform, x, y)\n : scalingX(eventData, transform, x, y);\n};\n\n/**\n * Composed action handler to either scale Y or skew X\n * Needs to be wrapped with `wrapWithFixedAnchor` to be effective\n * @param {Event} eventData javascript event that is doing the transform\n * @param {Object} transform javascript object containing a series of information around the current transform\n * @param {number} x current mouse x position, canvas normalized\n * @param {number} y current mouse y position, canvas normalized\n * @return {Boolean} true if some change happened\n */\nexport const scalingYOrSkewingX: TransformActionHandler = (\n eventData,\n transform,\n x,\n y,\n) => {\n return isAltAction(eventData, transform.target)\n ? skewHandlerX(eventData, transform, x, y)\n : scalingY(eventData, transform, x, y);\n};\n","import { RESIZING, ROTATE } from '../constants';\nimport { changeWidth } from './changeWidth';\nimport { Control } from './Control';\nimport { rotationStyleHandler, rotationWithSnapping } from './rotate';\nimport { scaleCursorStyleHandler, scalingEqually } from './scale';\nimport {\n scaleOrSkewActionName,\n scaleSkewCursorStyleHandler,\n scalingXOrSkewingY,\n scalingYOrSkewingX,\n} from './scaleSkew';\n\n// use this function if you want to generate new controls for every instance\nexport const createObjectDefaultControls = () => ({\n ml: new Control({\n x: -0.5,\n y: 0,\n cursorStyleHandler: scaleSkewCursorStyleHandler,\n actionHandler: scalingXOrSkewingY,\n getActionName: scaleOrSkewActionName,\n }),\n\n mr: new Control({\n x: 0.5,\n y: 0,\n cursorStyleHandler: scaleSkewCursorStyleHandler,\n actionHandler: scalingXOrSkewingY,\n getActionName: scaleOrSkewActionName,\n }),\n\n mb: new Control({\n x: 0,\n y: 0.5,\n cursorStyleHandler: scaleSkewCursorStyleHandler,\n actionHandler: scalingYOrSkewingX,\n getActionName: scaleOrSkewActionName,\n }),\n\n mt: new Control({\n x: 0,\n y: -0.5,\n cursorStyleHandler: scaleSkewCursorStyleHandler,\n actionHandler: scalingYOrSkewingX,\n getActionName: scaleOrSkewActionName,\n }),\n\n tl: new Control({\n x: -0.5,\n y: -0.5,\n cursorStyleHandler: scaleCursorStyleHandler,\n actionHandler: scalingEqually,\n }),\n\n tr: new Control({\n x: 0.5,\n y: -0.5,\n cursorStyleHandler: scaleCursorStyleHandler,\n actionHandler: scalingEqually,\n }),\n\n bl: new Control({\n x: -0.5,\n y: 0.5,\n cursorStyleHandler: scaleCursorStyleHandler,\n actionHandler: scalingEqually,\n }),\n\n br: new Control({\n x: 0.5,\n y: 0.5,\n cursorStyleHandler: scaleCursorStyleHandler,\n actionHandler: scalingEqually,\n }),\n\n mtr: new Control({\n x: 0,\n y: -0.5,\n actionHandler: rotationWithSnapping,\n cursorStyleHandler: rotationStyleHandler,\n offsetY: -40,\n withConnection: true,\n actionName: ROTATE,\n }),\n});\n\nexport const createResizeControls = () => ({\n mr: new Control({\n x: 0.5,\n y: 0,\n actionHandler: changeWidth,\n cursorStyleHandler: scaleSkewCursorStyleHandler,\n actionName: RESIZING,\n }),\n ml: new Control({\n x: -0.5,\n y: 0,\n actionHandler: changeWidth,\n cursorStyleHandler: scaleSkewCursorStyleHandler,\n actionName: RESIZING,\n }),\n});\n\nexport const createTextboxDefaultControls = () => ({\n ...createObjectDefaultControls(),\n ...createResizeControls(),\n});\n","import { Point, ZERO } from '../../Point';\nimport type { TCornerPoint, TDegree } from '../../typedefs';\nimport { FabricObject } from './Object';\nimport { degreesToRadians } from '../../util/misc/radiansDegreesConversion';\nimport type { TQrDecomposeOut } from '../../util/misc/matrix';\nimport {\n calcDimensionsMatrix,\n createRotateMatrix,\n createTranslateMatrix,\n multiplyTransformMatrices,\n qrDecompose,\n} from '../../util/misc/matrix';\nimport type { Control } from '../../controls/Control';\nimport { sizeAfterTransform } from '../../util/misc/objectTransforms';\nimport type { ObjectEvents, TPointerEvent } from '../../EventTypeDefs';\nimport type { Canvas } from '../../canvas/Canvas';\nimport type { ControlRenderingStyleOverride } from '../../controls/controlRendering';\nimport type { FabricObjectProps } from './types/FabricObjectProps';\nimport type { TFabricObjectProps, SerializedObjectProps } from './types';\nimport { createObjectDefaultControls } from '../../controls/commonControls';\nimport { interactiveObjectDefaultValues } from './defaultValues';\nimport { SCALE } from '../../constants';\n\nexport type TOCoord = Point & {\n corner: TCornerPoint;\n touchCorner: TCornerPoint;\n};\n\nexport type TControlSet = Record;\n\nexport type TBorderRenderingStyleOverride = Partial<\n Pick\n>;\n\nexport type TStyleOverride = ControlRenderingStyleOverride &\n TBorderRenderingStyleOverride &\n Partial<\n Pick & {\n forActiveSelection: boolean;\n }\n >;\n\nexport class InteractiveFabricObject<\n Props extends TFabricObjectProps = Partial,\n SProps extends SerializedObjectProps = SerializedObjectProps,\n EventSpec extends ObjectEvents = ObjectEvents,\n >\n extends FabricObject\n implements FabricObjectProps\n{\n declare noScaleCache: boolean;\n\n declare snapAngle?: TDegree;\n declare snapThreshold?: TDegree;\n\n declare lockMovementX: boolean;\n declare lockMovementY: boolean;\n declare lockRotation: boolean;\n declare lockScalingX: boolean;\n declare lockScalingY: boolean;\n declare lockSkewingX: boolean;\n declare lockSkewingY: boolean;\n declare lockScalingFlip: boolean;\n\n declare cornerSize: number;\n declare touchCornerSize: number;\n declare transparentCorners: boolean;\n declare cornerColor: string;\n declare cornerStrokeColor: string;\n declare cornerStyle: 'rect' | 'circle';\n declare cornerDashArray: number[] | null;\n declare hasControls: boolean;\n\n declare borderColor: string;\n declare borderDashArray: number[] | null;\n declare borderOpacityWhenMoving: number;\n declare borderScaleFactor: number;\n declare hasBorders: boolean;\n declare selectionBackgroundColor: string;\n\n declare selectable: boolean;\n declare evented: boolean;\n declare perPixelTargetFind: boolean;\n declare activeOn: 'down' | 'up';\n\n declare hoverCursor: CSSStyleDeclaration['cursor'] | null;\n declare moveCursor: CSSStyleDeclaration['cursor'] | null;\n\n /**\n * The object's controls' position in viewport coordinates\n * Calculated by {@link Control#positionHandler} and {@link Control#calcCornerCoords}, depending on {@link padding}.\n * `corner/touchCorner` describe the 4 points forming the interactive area of the corner.\n * Used to draw and locate controls.\n */\n declare oCoords: Record;\n\n /**\n * keeps the value of the last hovered corner during mouse move.\n * 0 is no corner, or 'mt', 'ml', 'mtr' etc..\n * It should be private, but there is no harm in using it as\n * a read-only property.\n * this isn't cleaned automatically. Non selected objects may have wrong values\n * @type [string]\n */\n declare __corner?: string;\n\n /**\n * a map of control visibility for this object.\n * this was left when controls were introduced to not break the api too much\n * this takes priority over the generic control visibility\n */\n declare _controlsVisibility: Record;\n\n /**\n * holds the controls for the object.\n * controls are added by default_controls.js\n */\n declare controls: TControlSet;\n\n /**\n * internal boolean to signal the code that the object is\n * part of the move action.\n */\n declare isMoving?: boolean;\n\n /**\n * A boolean used from the gesture module to keep tracking of a scaling\n * action when there is no scaling transform in place.\n * This is an edge case and is used twice in all codebase.\n * Probably added to keep track of some performance issues\n * @TODO use git blame to investigate why it was added\n * DON'T USE IT. WE WILL TRY TO REMOVE IT\n */\n declare _scaling?: boolean;\n\n declare canvas?: Canvas;\n\n static ownDefaults = interactiveObjectDefaultValues;\n\n static getDefaults(): Record {\n return {\n ...super.getDefaults(),\n ...InteractiveFabricObject.ownDefaults,\n };\n }\n\n /**\n * Constructor\n * @param {Object} [options] Options object\n */\n constructor(options?: Props) {\n super();\n Object.assign(\n this,\n (this.constructor as typeof InteractiveFabricObject).createControls(),\n InteractiveFabricObject.ownDefaults,\n );\n this.setOptions(options);\n }\n\n /**\n * Creates the default control object.\n * If you prefer to have on instance of controls shared among all objects\n * make this function return an empty object and add controls to the ownDefaults\n * @param {Object} [options] Options object\n */\n static createControls(): { controls: Record } {\n return { controls: createObjectDefaultControls() };\n }\n\n /**\n * Update width and height of the canvas for cache\n * returns true or false if canvas needed resize.\n * @private\n * @return {Boolean} true if the canvas has been resized\n */\n _updateCacheCanvas() {\n const targetCanvas = this.canvas;\n if (this.noScaleCache && targetCanvas && targetCanvas._currentTransform) {\n const transform = targetCanvas._currentTransform,\n target = transform.target,\n action = transform.action;\n if (\n this === (target as unknown as this) &&\n action &&\n action.startsWith(SCALE)\n ) {\n return false;\n }\n }\n return super._updateCacheCanvas();\n }\n\n getActiveControl() {\n const key = this.__corner;\n return key\n ? {\n key,\n control: this.controls[key],\n coord: this.oCoords[key],\n }\n : undefined;\n }\n\n /**\n * Determines which corner is under the mouse cursor, represented by `pointer`.\n * This function returns a corner only if the object is the active one.\n * This is done to avoid selecting corner of non active object and activating transformations\n * rather than drag action. The default behavior of fabricJS is that if you want to transform\n * an object, first you select it to show the control set\n * @private\n * @param {Object} pointer The pointer indicating the mouse position\n * @param {boolean} forTouch indicates if we are looking for interaction area with a touch action\n * @return {String|Boolean} corner code (tl, tr, bl, br, etc.), or 0 if nothing is found.\n */\n findControl(\n pointer: Point,\n forTouch = false,\n ): { key: string; control: Control; coord: TOCoord } | undefined {\n if (!this.hasControls || !this.canvas) {\n return undefined;\n }\n\n this.__corner = undefined;\n const cornerEntries = Object.entries(this.oCoords);\n for (let i = cornerEntries.length - 1; i >= 0; i--) {\n const [key, corner] = cornerEntries[i];\n const control = this.controls[key];\n\n if (\n control.shouldActivate(\n key,\n this,\n pointer,\n forTouch ? corner.touchCorner : corner.corner,\n )\n ) {\n // this.canvas.contextTop.fillRect(pointer.x - 1, pointer.y - 1, 2, 2);\n this.__corner = key;\n\n return { key, control, coord: this.oCoords[key] };\n }\n }\n\n return undefined;\n }\n\n /**\n * Calculates the coordinates of the center of each control plus the corners of the control itself\n * This basically just delegates to each control positionHandler\n * WARNING: changing what is passed to positionHandler is a breaking change, since position handler\n * is a public api and should be done just if extremely necessary\n * @return {Record}\n */\n calcOCoords(): Record {\n const vpt = this.getViewportTransform(),\n center = this.getCenterPoint(),\n tMatrix = createTranslateMatrix(center.x, center.y),\n rMatrix = createRotateMatrix({\n angle: this.getTotalAngle() - (!!this.group && this.flipX ? 180 : 0),\n }),\n positionMatrix = multiplyTransformMatrices(tMatrix, rMatrix),\n startMatrix = multiplyTransformMatrices(vpt, positionMatrix),\n finalMatrix = multiplyTransformMatrices(startMatrix, [\n 1 / vpt[0],\n 0,\n 0,\n 1 / vpt[3],\n 0,\n 0,\n ]),\n transformOptions = this.group\n ? qrDecompose(this.calcTransformMatrix())\n : undefined;\n // decomposing could bring negative scaling and `_calculateCurrentDimensions` can't take it\n if (transformOptions) {\n transformOptions.scaleX = Math.abs(transformOptions.scaleX);\n transformOptions.scaleY = Math.abs(transformOptions.scaleY);\n }\n const dim = this._calculateCurrentDimensions(transformOptions),\n coords: Record = {};\n\n this.forEachControl((control, key) => {\n const position = control.positionHandler(dim, finalMatrix, this, control);\n // coords[key] are sometimes used as points. Those are points to which we add\n // the property corner and touchCorner from `_calcCornerCoords`.\n // don't remove this assign for an object spread.\n coords[key] = Object.assign(\n position,\n this._calcCornerCoords(control, position),\n );\n });\n\n // debug code\n /*\n const canvas = this.canvas;\n setTimeout(function () {\n if (!canvas) return;\n canvas.contextTop.clearRect(0, 0, 700, 700);\n canvas.contextTop.fillStyle = 'green';\n Object.keys(coords).forEach(function(key) {\n const control = coords[key];\n canvas.contextTop.fillRect(control.x, control.y, 3, 3);\n });\n } 50);\n */\n return coords;\n }\n\n /**\n * Sets the coordinates that determine the interaction area of each control\n * note: if we would switch to ROUND corner area, all of this would disappear.\n * everything would resolve to a single point and a pythagorean theorem for the distance\n * @todo evaluate simplification of code switching to circle interaction area at runtime\n * @private\n */\n private _calcCornerCoords(control: Control, position: Point) {\n const angle = this.getTotalAngle();\n const corner = control.calcCornerCoords(\n angle,\n this.cornerSize,\n position.x,\n position.y,\n false,\n this,\n );\n const touchCorner = control.calcCornerCoords(\n angle,\n this.touchCornerSize,\n position.x,\n position.y,\n true,\n this,\n );\n return { corner, touchCorner };\n }\n\n /**\n * @override set controls' coordinates as well\n * See {@link https://github.com/fabricjs/fabric.js/wiki/When-to-call-setCoords} and {@link https://fabric5.fabricjs.com/fabric-gotchas}\n * @return {void}\n */\n setCoords(): void {\n super.setCoords();\n this.canvas && (this.oCoords = this.calcOCoords());\n }\n\n /**\n * Calls a function for each control. The function gets called,\n * with the control, the control's key and the object that is calling the iterator\n * @param {Function} fn function to iterate over the controls over\n */\n forEachControl(\n fn: (\n control: Control,\n key: string,\n fabricObject: InteractiveFabricObject,\n ) => any,\n ) {\n for (const i in this.controls) {\n fn(this.controls[i], i, this);\n }\n }\n\n /**\n * Draws a colored layer behind the object, inside its selection borders.\n * Requires public options: padding, selectionBackgroundColor\n * this function is called when the context is transformed\n * has checks to be skipped when the object is on a staticCanvas\n * @todo evaluate if make this disappear in favor of a pre-render hook for objects\n * this was added by Andrea Bogazzi to make possible some feature for work reasons\n * it seemed a good option, now is an edge case\n * @param {CanvasRenderingContext2D} ctx Context to draw on\n */\n drawSelectionBackground(ctx: CanvasRenderingContext2D): void {\n if (\n !this.selectionBackgroundColor ||\n (this.canvas && (this.canvas._activeObject as unknown as this) !== this)\n ) {\n return;\n }\n ctx.save();\n const center = this.getRelativeCenterPoint(),\n wh = this._calculateCurrentDimensions(),\n vpt = this.getViewportTransform();\n ctx.translate(center.x, center.y);\n ctx.scale(1 / vpt[0], 1 / vpt[3]);\n ctx.rotate(degreesToRadians(this.angle));\n ctx.fillStyle = this.selectionBackgroundColor;\n ctx.fillRect(-wh.x / 2, -wh.y / 2, wh.x, wh.y);\n ctx.restore();\n }\n\n /**\n * @public override this function in order to customize the drawing of the control box, e.g. rounded corners, different border style.\n * @param {CanvasRenderingContext2D} ctx ctx is rotated and translated so that (0,0) is at object's center\n * @param {Point} size the control box size used\n */\n strokeBorders(ctx: CanvasRenderingContext2D, size: Point): void {\n ctx.strokeRect(-size.x / 2, -size.y / 2, size.x, size.y);\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to draw on\n * @param {Point} size\n * @param {TStyleOverride} styleOverride object to override the object style\n */\n _drawBorders(\n ctx: CanvasRenderingContext2D,\n size: Point,\n styleOverride: TStyleOverride = {},\n ): void {\n const options = {\n hasControls: this.hasControls,\n borderColor: this.borderColor,\n borderDashArray: this.borderDashArray,\n ...styleOverride,\n };\n ctx.save();\n ctx.strokeStyle = options.borderColor;\n this._setLineDash(ctx, options.borderDashArray);\n this.strokeBorders(ctx, size);\n options.hasControls && this.drawControlsConnectingLines(ctx, size);\n ctx.restore();\n }\n\n /**\n * Renders controls and borders for the object\n * the context here is not transformed\n * @todo move to interactivity\n * @param {CanvasRenderingContext2D} ctx Context to render on\n * @param {TStyleOverride} [styleOverride] properties to override the object style\n */\n _renderControls(\n ctx: CanvasRenderingContext2D,\n styleOverride: TStyleOverride = {},\n ) {\n const { hasBorders, hasControls } = this;\n const styleOptions = {\n hasBorders,\n hasControls,\n ...styleOverride,\n };\n const vpt = this.getViewportTransform(),\n shouldDrawBorders = styleOptions.hasBorders,\n shouldDrawControls = styleOptions.hasControls;\n const matrix = multiplyTransformMatrices(vpt, this.calcTransformMatrix());\n const options = qrDecompose(matrix);\n ctx.save();\n ctx.translate(options.translateX, options.translateY);\n ctx.lineWidth = this.borderScaleFactor; // 1 * this.borderScaleFactor;\n // since interactive groups have been introduced, an object could be inside a group and needing controls\n // the following equality check `this.group === this.parent` covers:\n // object without a group ( undefined === undefined )\n // object inside a group\n // excludes object inside a group but multi selected since group and parent will differ in value\n if (this.group === this.parent) {\n ctx.globalAlpha = this.isMoving ? this.borderOpacityWhenMoving : 1;\n }\n if (this.flipX) {\n options.angle -= 180;\n }\n ctx.rotate(degreesToRadians(this.group ? options.angle : this.angle));\n shouldDrawBorders && this.drawBorders(ctx, options, styleOverride);\n shouldDrawControls && this.drawControls(ctx, styleOverride);\n ctx.restore();\n }\n\n /**\n * Draws borders of an object's bounding box.\n * Requires public properties: width, height\n * Requires public options: padding, borderColor\n * @param {CanvasRenderingContext2D} ctx Context to draw on\n * @param {object} options object representing current object parameters\n * @param {TStyleOverride} [styleOverride] object to override the object style\n */\n drawBorders(\n ctx: CanvasRenderingContext2D,\n options: TQrDecomposeOut,\n styleOverride: TStyleOverride,\n ): void {\n let size;\n if ((styleOverride && styleOverride.forActiveSelection) || this.group) {\n const bbox = sizeAfterTransform(\n this.width,\n this.height,\n calcDimensionsMatrix(options),\n ),\n stroke = !this.isStrokeAccountedForInDimensions()\n ? (this.strokeUniform\n ? new Point().scalarAdd(this.canvas ? this.canvas.getZoom() : 1)\n : // this is extremely confusing. options comes from the upper function\n // and is the qrDecompose of a matrix that takes in account zoom too\n new Point(options.scaleX, options.scaleY)\n ).scalarMultiply(this.strokeWidth)\n : ZERO;\n size = bbox\n .add(stroke)\n .scalarAdd(this.borderScaleFactor)\n .scalarAdd(this.padding * 2);\n } else {\n size = this._calculateCurrentDimensions().scalarAdd(\n this.borderScaleFactor,\n );\n }\n this._drawBorders(ctx, size, styleOverride);\n }\n\n /**\n * Draws lines from a borders of an object's bounding box to controls that have `withConnection` property set.\n * Requires public properties: width, height\n * Requires public options: padding, borderColor\n * @param {CanvasRenderingContext2D} ctx Context to draw on\n * @param {Point} size object size x = width, y = height\n */\n drawControlsConnectingLines(\n ctx: CanvasRenderingContext2D,\n size: Point,\n ): void {\n let shouldStroke = false;\n\n ctx.beginPath();\n this.forEachControl((control, key) => {\n // in this moment, the ctx is centered on the object.\n // width and height of the above function are the size of the bbox.\n if (control.withConnection && control.getVisibility(this, key)) {\n // reset movement for each control\n shouldStroke = true;\n ctx.moveTo(control.x * size.x, control.y * size.y);\n ctx.lineTo(\n control.x * size.x + control.offsetX,\n control.y * size.y + control.offsetY,\n );\n }\n });\n shouldStroke && ctx.stroke();\n }\n\n /**\n * Draws corners of an object's bounding box.\n * Requires public properties: width, height\n * Requires public options: cornerSize, padding\n * Be aware that since fabric 6.0 this function does not call setCoords anymore.\n * setCoords needs to be called manually if the object of which we are rendering controls\n * is outside the standard selection and transform process.\n * @param {CanvasRenderingContext2D} ctx Context to draw on\n * @param {ControlRenderingStyleOverride} styleOverride object to override the object style\n */\n drawControls(\n ctx: CanvasRenderingContext2D,\n styleOverride: ControlRenderingStyleOverride = {},\n ) {\n ctx.save();\n const retinaScaling = this.getCanvasRetinaScaling();\n const { cornerStrokeColor, cornerDashArray, cornerColor } = this;\n const options = {\n cornerStrokeColor,\n cornerDashArray,\n cornerColor,\n ...styleOverride,\n };\n ctx.setTransform(retinaScaling, 0, 0, retinaScaling, 0, 0);\n ctx.strokeStyle = ctx.fillStyle = options.cornerColor;\n if (!this.transparentCorners) {\n ctx.strokeStyle = options.cornerStrokeColor;\n }\n this._setLineDash(ctx, options.cornerDashArray);\n this.forEachControl((control, key) => {\n if (control.getVisibility(this, key)) {\n const p = this.oCoords[key];\n control.render(ctx, p.x, p.y, options, this);\n }\n });\n ctx.restore();\n }\n\n /**\n * Returns true if the specified control is visible, false otherwise.\n * @param {string} controlKey The key of the control. Possible values are usually 'tl', 'tr', 'br', 'bl', 'ml', 'mt', 'mr', 'mb', 'mtr',\n * but since the control api allow for any control name, can be any string.\n * @returns {boolean} true if the specified control is visible, false otherwise\n */\n isControlVisible(controlKey: string): boolean {\n return (\n this.controls[controlKey] &&\n this.controls[controlKey].getVisibility(this, controlKey)\n );\n }\n\n /**\n * Sets the visibility of the specified control.\n * please do not use.\n * @param {String} controlKey The key of the control. Possible values are 'tl', 'tr', 'br', 'bl', 'ml', 'mt', 'mr', 'mb', 'mtr'.\n * but since the control api allow for any control name, can be any string.\n * @param {Boolean} visible true to set the specified control visible, false otherwise\n * @todo discuss this overlap of priority here with the team. Andrea Bogazzi for details\n */\n setControlVisible(controlKey: string, visible: boolean) {\n if (!this._controlsVisibility) {\n this._controlsVisibility = {};\n }\n this._controlsVisibility[controlKey] = visible;\n }\n\n /**\n * Sets the visibility state of object controls, this is just a bulk option for setControlVisible;\n * @param {Record} [options] with an optional key per control\n * example: {Boolean} [options.bl] true to enable the bottom-left control, false to disable it\n */\n setControlsVisibility(options: Record = {}) {\n Object.entries(options).forEach(([controlKey, visibility]) =>\n this.setControlVisible(controlKey, visibility),\n );\n }\n\n /**\n * Clears the canvas.contextTop in a specific area that corresponds to the object's bounding box\n * that is in the canvas.contextContainer.\n * This function is used to clear pieces of contextTop where we render ephemeral effects on top of the object.\n * Example: blinking cursor text selection, drag effects.\n * @todo discuss swapping restoreManually with a renderCallback, but think of async issues\n * @param {Boolean} [restoreManually] When true won't restore the context after clear, in order to draw something else.\n * @return {CanvasRenderingContext2D|undefined} canvas.contextTop that is either still transformed\n * with the object transformMatrix, or restored to neutral transform\n */\n clearContextTop(\n restoreManually?: boolean,\n ): CanvasRenderingContext2D | undefined {\n if (!this.canvas) {\n return;\n }\n const ctx = this.canvas.contextTop;\n if (!ctx) {\n return;\n }\n const v = this.canvas.viewportTransform;\n ctx.save();\n ctx.transform(v[0], v[1], v[2], v[3], v[4], v[5]);\n this.transform(ctx);\n // we add 4 pixel, to be sure to do not leave any pixel out\n const width = this.width + 4,\n height = this.height + 4;\n ctx.clearRect(-width / 2, -height / 2, width, height);\n\n restoreManually || ctx.restore();\n return ctx;\n }\n\n /**\n * This callback function is called every time _discardActiveObject or _setActiveObject\n * try to to deselect this object. If the function returns true, the process is cancelled\n * @param {Object} [_options] options sent from the upper functions\n * @param {TPointerEvent} [options.e] event if the process is generated by an event\n * @param {FabricObject} [options.object] next object we are setting as active, and reason why\n * this is being deselected\n */\n onDeselect(_options?: {\n e?: TPointerEvent;\n object?: InteractiveFabricObject;\n }): boolean {\n // implemented by sub-classes, as needed.\n return false;\n }\n\n /**\n * This callback function is called every time _discardActiveObject or _setActiveObject\n * try to to select this object. If the function returns true, the process is cancelled\n * @param {Object} [_options] options sent from the upper functions\n * @param {Event} [_options.e] event if the process is generated by an event\n */\n onSelect(_options?: { e?: TPointerEvent }): boolean {\n // implemented by sub-classes, as needed.\n return false;\n }\n\n /**\n * Override to customize Drag behavior\n * Fired from {@link Canvas#_onMouseMove}\n * @returns true in order for the window to start a drag session\n */\n shouldStartDragging(_e: TPointerEvent) {\n return false;\n }\n\n /**\n * Override to customize Drag behavior\\\n * Fired once a drag session has started\n * @returns true to handle the drag event\n */\n onDragStart(_e: DragEvent) {\n return false;\n }\n\n /**\n * Override to customize drag and drop behavior\n * @public\n * @param {DragEvent} _e\n * @returns {boolean} true if the object currently dragged can be dropped on the target\n */\n canDrop(_e: DragEvent): boolean {\n return false;\n }\n\n /**\n * Override to customize drag and drop behavior\n * render a specific effect when an object is the source of a drag event\n * example: render the selection status for the part of text that is being dragged from a text object\n * @public\n * @param {DragEvent} _e\n */\n renderDragSourceEffect(_e: DragEvent) {\n // for subclasses\n }\n\n /**\n * Override to customize drag and drop behavior\n * render a specific effect when an object is the target of a drag event\n * used to show that the underly object can receive a drop, or to show how the\n * object will change when dropping. example: show the cursor where the text is about to be dropped\n * @public\n * @param {DragEvent} _e\n */\n renderDropTargetEffect(_e: DragEvent) {\n // for subclasses\n }\n}\n","import type { Constructor } from '../typedefs';\n\n/***\n * https://www.typescriptlang.org/docs/handbook/mixins.html#alternative-pattern\n */\nexport function applyMixins(\n derivedCtor: T,\n constructors: S[],\n) {\n constructors.forEach((baseCtor) => {\n Object.getOwnPropertyNames(baseCtor.prototype).forEach((name) => {\n name !== 'constructor' &&\n Object.defineProperty(\n derivedCtor.prototype,\n name,\n Object.getOwnPropertyDescriptor(baseCtor.prototype, name) ||\n Object.create(null),\n );\n });\n });\n return derivedCtor as T & { prototype: InstanceType };\n}\n","import type { ObjectEvents } from '../../EventTypeDefs';\nimport { FabricObjectSVGExportMixin } from './FabricObjectSVGExportMixin';\nimport { InteractiveFabricObject } from './InteractiveObject';\nimport { applyMixins } from '../../util/applyMixins';\nimport type { FabricObjectProps } from './types/FabricObjectProps';\nimport type { TFabricObjectProps, SerializedObjectProps } from './types';\nimport { classRegistry } from '../../ClassRegistry';\n\n// TODO somehow we have to make a tree-shakeable import\n\n// eslint-disable-next-line @typescript-eslint/no-empty-object-type\nexport interface FabricObject<\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n Props extends TFabricObjectProps = Partial,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n SProps extends SerializedObjectProps = SerializedObjectProps,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n EventSpec extends ObjectEvents = ObjectEvents,\n> extends FabricObjectSVGExportMixin {}\n\n// eslint-disable-next-line @typescript-eslint/no-unsafe-declaration-merging\nexport class FabricObject<\n Props extends TFabricObjectProps = Partial,\n SProps extends SerializedObjectProps = SerializedObjectProps,\n EventSpec extends ObjectEvents = ObjectEvents,\n> extends InteractiveFabricObject {}\n\napplyMixins(FabricObject, [FabricObjectSVGExportMixin]);\n\nclassRegistry.setClass(FabricObject);\nclassRegistry.setClass(FabricObject, 'object');\n\nexport { cacheProperties } from './defaultValues';\n","/**\n * Returns true if context has transparent pixel\n * at specified location (taking tolerance into account)\n * @param {CanvasRenderingContext2D} ctx context\n * @param {Number} x x coordinate in canvasElementCoordinate, not fabric space. integer\n * @param {Number} y y coordinate in canvasElementCoordinate, not fabric space. integer\n * @param {Number} tolerance Tolerance pixels around the point, not alpha tolerance, integer\n * @return {boolean} true if transparent\n */\nexport const isTransparent = (\n ctx: CanvasRenderingContext2D,\n x: number,\n y: number,\n tolerance: number,\n): boolean => {\n tolerance = Math.round(tolerance);\n const size = tolerance * 2 + 1;\n const { data } = ctx.getImageData(x - tolerance, y - tolerance, size, size);\n\n // Split image data - for tolerance > 1, pixelDataSize = 4;\n for (let i = 3; i < data.length; i += 4) {\n const alphaChannel = data[i];\n if (alphaChannel > 0) {\n return false;\n }\n }\n return true;\n};\n","export const findIndexRight = (\n array: T[],\n predicate: (value: T, index: number, array: T[]) => boolean,\n) => {\n for (let index = array.length - 1; index >= 0; index--) {\n if (predicate(array[index], index, array)) {\n return index;\n }\n }\n return -1;\n};\n","import type { XY } from '../../../Point';\nimport { Point } from '../../../Point';\nimport { degreesToRadians } from '../radiansDegreesConversion';\nimport { createVector } from '../vectors';\nimport type { TProjectStrokeOnPointsOptions, TProjection } from './types';\n\n/**\n * @see https://github.com/fabricjs/fabric.js/pull/8344\n * @todo consider removing skewing from points before calculating stroke projection,\n * see https://github.com/fabricjs/fabric.js/commit/494a10ee2f8c2278ae9a55b20bf50cf6ee25b064#commitcomment-94751537\n */\nexport abstract class StrokeProjectionsBase {\n declare options: TProjectStrokeOnPointsOptions;\n declare scale: Point;\n declare strokeUniformScalar: Point;\n declare strokeProjectionMagnitude: number;\n\n constructor(options: TProjectStrokeOnPointsOptions) {\n this.options = options;\n this.strokeProjectionMagnitude = this.options.strokeWidth / 2;\n this.scale = new Point(this.options.scaleX, this.options.scaleY);\n this.strokeUniformScalar = this.options.strokeUniform\n ? new Point(1 / this.options.scaleX, 1 / this.options.scaleY)\n : new Point(1, 1);\n }\n\n /**\n * When the stroke is uniform, scaling affects the arrangement of points. So we must take it into account.\n */\n protected createSideVector(from: XY, to: XY) {\n const v = createVector(from, to);\n return this.options.strokeUniform ? v.multiply(this.scale) : v;\n }\n\n protected abstract calcOrthogonalProjection(\n from: Point,\n to: Point,\n magnitude?: number,\n ): Point;\n\n protected projectOrthogonally(from: Point, to: Point, magnitude?: number) {\n return this.applySkew(\n from.add(this.calcOrthogonalProjection(from, to, magnitude)),\n );\n }\n\n protected isSkewed() {\n return this.options.skewX !== 0 || this.options.skewY !== 0;\n }\n\n protected applySkew(point: Point) {\n const p = new Point(point);\n // skewY must be applied before skewX as this distortion affects skewX calculation\n p.y += p.x * Math.tan(degreesToRadians(this.options.skewY));\n p.x += p.y * Math.tan(degreesToRadians(this.options.skewX));\n return p;\n }\n\n protected scaleUnitVector(unitVector: Point, scalar: number) {\n return unitVector.multiply(this.strokeUniformScalar).scalarMultiply(scalar);\n }\n\n protected abstract projectPoints(): Point[];\n\n public abstract project(): TProjection[];\n}\n","import type { XY } from '../../../Point';\nimport { Point } from '../../../Point';\nimport { halfPI, twoMathPi } from '../../../constants';\nimport type { TRadian } from '../../../typedefs';\nimport { degreesToRadians } from '../radiansDegreesConversion';\nimport {\n calcAngleBetweenVectors,\n calcVectorRotation,\n crossProduct,\n getOrthonormalVector,\n getUnitVector,\n isBetweenVectors,\n magnitude,\n rotateVector,\n} from '../vectors';\nimport { StrokeProjectionsBase } from './StrokeProjectionsBase';\nimport type { TProjection, TProjectStrokeOnPointsOptions } from './types';\n\nconst zeroVector = new Point();\n\n/**\n * class in charge of finding projections for each type of line join\n * @see {@link [Closed path projections at #8344](https://github.com/fabricjs/fabric.js/pull/8344#2-closed-path)}\n *\n * - MDN:\n * - https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/lineJoin\n * - https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/stroke-linejoin\n * - Spec: https://svgwg.org/svg2-draft/painting.html#StrokeLinejoinProperty\n * - Playground to understand how the line joins works: https://hypertolosana.github.io/efficient-webgl-stroking/index.html\n * - View the calculated projections for each of the control points: https://codesandbox.io/s/project-stroke-points-with-context-to-trace-b8jc4j?file=/src/index.js\n *\n */\nexport class StrokeLineJoinProjections extends StrokeProjectionsBase {\n /**\n * The point being projected (the angle ∠BAC)\n */\n declare A: Point;\n /**\n * The point before A\n */\n declare B: Point;\n /**\n * The point after A\n */\n declare C: Point;\n /**\n * The AB vector\n */\n AB: Point;\n /**\n * The AC vector\n */\n AC: Point;\n /**\n * The angle of A (∠BAC)\n */\n alpha: TRadian;\n /**\n * The bisector of A (∠BAC)\n */\n bisector: Point;\n\n static getOrthogonalRotationFactor(vector1: Point, vector2?: Point) {\n const angle = vector2\n ? calcAngleBetweenVectors(vector1, vector2)\n : calcVectorRotation(vector1);\n return Math.abs(angle) < halfPI ? -1 : 1;\n }\n\n constructor(A: XY, B: XY, C: XY, options: TProjectStrokeOnPointsOptions) {\n super(options);\n this.A = new Point(A);\n this.B = new Point(B);\n this.C = new Point(C);\n this.AB = this.createSideVector(this.A, this.B);\n this.AC = this.createSideVector(this.A, this.C);\n this.alpha = calcAngleBetweenVectors(this.AB, this.AC);\n this.bisector = getUnitVector(\n // if AC is also the zero vector nothing will be projected\n // in that case the next point will handle the projection\n rotateVector(this.AB.eq(zeroVector) ? this.AC : this.AB, this.alpha / 2),\n );\n }\n\n calcOrthogonalProjection(\n from: Point,\n to: Point,\n magnitude: number = this.strokeProjectionMagnitude,\n ) {\n const vector = this.createSideVector(from, to);\n const orthogonalProjection = getOrthonormalVector(vector);\n const correctSide = StrokeLineJoinProjections.getOrthogonalRotationFactor(\n orthogonalProjection,\n this.bisector,\n );\n return this.scaleUnitVector(orthogonalProjection, magnitude * correctSide);\n }\n\n /**\n * BEVEL\n * Calculation: the projection points are formed by the vector orthogonal to the vertex.\n *\n * @see https://github.com/fabricjs/fabric.js/pull/8344#2-2-bevel\n */\n projectBevel() {\n const projections: Point[] = [];\n // if `alpha` equals 0 or 2*PI, the projections are the same for `B` and `C`\n (this.alpha % twoMathPi === 0 ? [this.B] : [this.B, this.C]).forEach(\n (to) => {\n projections.push(this.projectOrthogonally(this.A, to));\n projections.push(\n this.projectOrthogonally(this.A, to, -this.strokeProjectionMagnitude),\n );\n },\n );\n return projections;\n }\n\n /**\n * MITER\n * Calculation: the corner is formed by extending the outer edges of the stroke\n * at the tangents of the path segments until they intersect.\n *\n * @see https://github.com/fabricjs/fabric.js/pull/8344#2-1-miter\n */\n projectMiter() {\n const projections: Point[] = [],\n alpha = Math.abs(this.alpha),\n hypotUnitScalar = 1 / Math.sin(alpha / 2),\n miterVector = this.scaleUnitVector(\n this.bisector,\n -this.strokeProjectionMagnitude * hypotUnitScalar,\n );\n\n // When two line segments meet at a sharp angle, it is possible for the join to extend,\n // far beyond the thickness of the line stroking the path. The stroke-miterlimit imposes\n // a limit on the extent of the line join.\n // MDN: https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/stroke-miterlimit\n // When the stroke is uniform, scaling changes the arrangement of points, this changes the miter-limit\n const strokeMiterLimit = this.options.strokeUniform\n ? magnitude(\n this.scaleUnitVector(this.bisector, this.options.strokeMiterLimit),\n )\n : this.options.strokeMiterLimit;\n\n if (\n magnitude(miterVector) / this.strokeProjectionMagnitude <=\n strokeMiterLimit\n ) {\n projections.push(this.applySkew(this.A.add(miterVector)));\n }\n /* when the miter-limit is reached, the stroke line join becomes of type bevel.\n We always need two orthogonal projections which are basically bevel-type projections,\n so regardless of whether the miter-limit was reached or not, we include these projections.\n */\n projections.push(...this.projectBevel());\n\n return projections;\n }\n\n /**\n * ROUND (without skew)\n * Calculation: the projections are the two vectors parallel to X and Y axes\n *\n * @see https://github.com/fabricjs/fabric.js/pull/8344#2-3-1-round-without-skew\n */\n private projectRoundNoSkew(startCircle: Point, endCircle: Point) {\n const projections: Point[] = [],\n // correctSide is used to only consider projecting for the outer side\n correctSide = new Point(\n StrokeLineJoinProjections.getOrthogonalRotationFactor(this.bisector),\n StrokeLineJoinProjections.getOrthogonalRotationFactor(\n new Point(this.bisector.y, this.bisector.x),\n ),\n ),\n radiusOnAxisX = new Point(1, 0)\n .scalarMultiply(this.strokeProjectionMagnitude)\n .multiply(this.strokeUniformScalar)\n .multiply(correctSide),\n radiusOnAxisY = new Point(0, 1)\n .scalarMultiply(this.strokeProjectionMagnitude)\n .multiply(this.strokeUniformScalar)\n .multiply(correctSide);\n\n [radiusOnAxisX, radiusOnAxisY].forEach((vector) => {\n if (isBetweenVectors(vector, startCircle, endCircle)) {\n projections.push(this.A.add(vector));\n }\n });\n return projections;\n }\n\n /**\n * ROUND (with skew)\n * Calculation: the projections are the points furthest from the vertex in\n * the direction of the X and Y axes after distortion.\n *\n * @see https://github.com/fabricjs/fabric.js/pull/8344#2-3-2-round-skew\n */\n private projectRoundWithSkew(startCircle: Point, endCircle: Point) {\n const projections: Point[] = [];\n\n const { skewX, skewY, scaleX, scaleY, strokeUniform } = this.options,\n shearing = new Point(\n Math.tan(degreesToRadians(skewX)),\n Math.tan(degreesToRadians(skewY)),\n );\n // The points furthest from the vertex in the direction of the X and Y axes after distortion\n const circleRadius = this.strokeProjectionMagnitude,\n newY = strokeUniform\n ? circleRadius /\n scaleY /\n Math.sqrt(1 / scaleY ** 2 + (1 / scaleX ** 2) * shearing.y ** 2)\n : circleRadius / Math.sqrt(1 + shearing.y ** 2),\n furthestY = new Point(\n // Safe guard due to floating point precision. In some situations the square root\n // was returning NaN because of a negative number close to zero.\n Math.sqrt(Math.max(circleRadius ** 2 - newY ** 2, 0)),\n newY,\n ),\n newX = strokeUniform\n ? circleRadius /\n Math.sqrt(\n 1 +\n (shearing.x ** 2 * (1 / scaleY) ** 2) /\n (1 / scaleX + (1 / scaleX) * shearing.x * shearing.y) ** 2,\n )\n : circleRadius /\n Math.sqrt(1 + shearing.x ** 2 / (1 + shearing.x * shearing.y) ** 2),\n furthestX = new Point(\n newX,\n Math.sqrt(Math.max(circleRadius ** 2 - newX ** 2, 0)),\n );\n\n [\n furthestX,\n furthestX.scalarMultiply(-1),\n furthestY,\n furthestY.scalarMultiply(-1),\n ]\n // We need to skew the vector here as this information is used to check if\n // it is between the start and end of the circle segment\n .map((vector) =>\n this.applySkew(\n strokeUniform ? vector.multiply(this.strokeUniformScalar) : vector,\n ),\n )\n .forEach((vector) => {\n if (isBetweenVectors(vector, startCircle, endCircle)) {\n projections.push(this.applySkew(this.A).add(vector));\n }\n });\n\n return projections;\n }\n\n projectRound() {\n const projections: Point[] = [];\n /* Include the start and end points of the circle segment, so that only\n the projections contained within it are included */\n // add the orthogonal projections (start and end points of circle segment)\n projections.push(...this.projectBevel());\n // let's determines which one of the orthogonal projection is the beginning and end of the circle segment.\n // when `alpha` equals 0 or 2*PI, we have a straight line, so the way to find the start/end is different.\n const isStraightLine = this.alpha % twoMathPi === 0,\n // change the origin of the projections to point A\n // so that the cross product calculation is correct\n newOrigin = this.applySkew(this.A),\n proj0 = projections[isStraightLine ? 0 : 2].subtract(newOrigin),\n proj1 = projections[isStraightLine ? 1 : 0].subtract(newOrigin),\n // when `isStraightLine` === true, we compare with the vector opposite AB, otherwise we compare with the bisector.\n comparisonVector = isStraightLine\n ? this.applySkew(this.AB.scalarMultiply(-1))\n : this.applySkew(\n this.bisector.multiply(this.strokeUniformScalar).scalarMultiply(-1),\n ),\n // the beginning of the circle segment is always to the right of the comparison vector (cross product > 0)\n isProj0Start = crossProduct(proj0, comparisonVector) > 0,\n startCircle = isProj0Start ? proj0 : proj1,\n endCircle = isProj0Start ? proj1 : proj0;\n if (!this.isSkewed()) {\n projections.push(...this.projectRoundNoSkew(startCircle, endCircle));\n } else {\n projections.push(...this.projectRoundWithSkew(startCircle, endCircle));\n }\n return projections;\n }\n\n /**\n * Project stroke width on points returning projections for each point as follows:\n * - `miter`: 1 point corresponding to the outer boundary. If the miter limit is exceeded, it will be 2 points (becomes bevel)\n * - `bevel`: 2 points corresponding to the bevel possible boundaries, orthogonal to the stroke.\n * - `round`: same as `bevel` when it has no skew, with skew are 4 points.\n */\n protected projectPoints() {\n switch (this.options.strokeLineJoin) {\n case 'miter':\n return this.projectMiter();\n case 'round':\n return this.projectRound();\n default:\n return this.projectBevel();\n }\n }\n\n public project(): TProjection[] {\n return this.projectPoints().map((point) => ({\n originPoint: this.A,\n projectedPoint: point,\n angle: this.alpha,\n bisector: this.bisector,\n }));\n }\n}\n","import type { XY } from '../../../Point';\nimport { Point } from '../../../Point';\nimport { getOrthonormalVector, getUnitVector } from '../vectors';\nimport { StrokeLineJoinProjections } from './StrokeLineJoinProjections';\nimport { StrokeProjectionsBase } from './StrokeProjectionsBase';\nimport type { TProjection, TProjectStrokeOnPointsOptions } from './types';\n\n/**\n * class in charge of finding projections for each type of line cap for start/end of an open path\n * @see {@link [Open path projections at #8344](https://github.com/fabricjs/fabric.js/pull/8344#1-open-path)}\n *\n * Reference:\n * - MDN:\n * - https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/lineCap\n * - https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/stroke-linecap\n * - Spec: https://html.spec.whatwg.org/multipage/canvas.html#dom-context-2d-linecap-dev\n * - Playground to understand how the line joins works: https://hypertolosana.github.io/efficient-webgl-stroking/index.html\n * - View the calculated projections for each of the control points: https://codesandbox.io/s/project-stroke-points-with-context-to-trace-b8jc4j?file=/src/index.js\n */\nexport class StrokeLineCapProjections extends StrokeProjectionsBase {\n /**\n * edge point\n */\n declare A: Point;\n /**\n * point next to edge point\n */\n declare T: Point;\n\n constructor(A: XY, T: XY, options: TProjectStrokeOnPointsOptions) {\n super(options);\n this.A = new Point(A);\n this.T = new Point(T);\n }\n\n calcOrthogonalProjection(\n from: Point,\n to: Point,\n magnitude: number = this.strokeProjectionMagnitude,\n ) {\n const vector = this.createSideVector(from, to);\n return this.scaleUnitVector(getOrthonormalVector(vector), magnitude);\n }\n\n /**\n * OPEN PATH START/END - Line cap: Butt\n * Calculation: to find the projections, just find the points orthogonal to the stroke\n *\n * @see https://github.com/fabricjs/fabric.js/pull/8344#1-1-butt\n */\n projectButt() {\n return [\n this.projectOrthogonally(this.A, this.T, this.strokeProjectionMagnitude),\n this.projectOrthogonally(this.A, this.T, -this.strokeProjectionMagnitude),\n ];\n }\n\n /**\n * OPEN PATH START/END - Line cap: Round\n * Calculation: same as stroke line join `round`\n *\n * @see https://github.com/fabricjs/fabric.js/pull/8344#1-2-round\n */\n projectRound() {\n const projections: Point[] = [];\n\n if (!this.isSkewed() && this.A.eq(this.T)) {\n /* 1 point case without `skew`\n When `strokeUniform` is true, scaling has no effect.\n So we divide by scale, to remove its effect.\n */\n const projection = new Point(1, 1)\n .scalarMultiply(this.strokeProjectionMagnitude)\n .multiply(this.strokeUniformScalar);\n projections.push(\n this.applySkew(this.A.add(projection)),\n this.applySkew(this.A.subtract(projection)),\n );\n } else {\n projections.push(\n ...new StrokeLineJoinProjections(\n this.A,\n this.T,\n this.T,\n this.options,\n ).projectRound(),\n );\n }\n\n return projections;\n }\n\n /**\n * OPEN PATH START/END - Line cap: Square\n * Calculation: project a rectangle of points on the stroke in the opposite direction of the vector `AT`\n *\n * @see https://github.com/fabricjs/fabric.js/pull/8344#1-3-square\n */\n projectSquare() {\n const projections: Point[] = [];\n\n if (this.A.eq(this.T)) {\n /* 1 point case without `skew`\n When `strokeUniform` is true, scaling has no effect.\n So we divide by scale, to remove its effect.\n */\n const projection = new Point(1, 1)\n .scalarMultiply(this.strokeProjectionMagnitude)\n .multiply(this.strokeUniformScalar);\n projections.push(this.A.add(projection), this.A.subtract(projection));\n } else {\n const orthogonalProjection = this.calcOrthogonalProjection(\n this.A,\n this.T,\n this.strokeProjectionMagnitude,\n );\n const strokePointingOut = this.scaleUnitVector(\n getUnitVector(this.createSideVector(this.A, this.T)),\n -this.strokeProjectionMagnitude,\n );\n const projectedA = this.A.add(strokePointingOut);\n projections.push(\n projectedA.add(orthogonalProjection),\n projectedA.subtract(orthogonalProjection),\n );\n }\n\n return projections.map((p) => this.applySkew(p));\n }\n\n protected projectPoints() {\n switch (this.options.strokeLineCap) {\n case 'round':\n return this.projectRound();\n case 'square':\n return this.projectSquare();\n default:\n return this.projectButt();\n }\n }\n\n public project(): TProjection[] {\n return this.projectPoints().map((point) => ({\n originPoint: this.A,\n projectedPoint: point,\n }));\n }\n}\n","import { Point, type XY } from '../../../Point';\nimport { findIndexRight } from '../../internals/findRight';\nimport { StrokeLineCapProjections } from './StrokeLineCapProjections';\nimport { StrokeLineJoinProjections } from './StrokeLineJoinProjections';\nimport type { TProjection, TProjectStrokeOnPointsOptions } from './types';\n\nexport type * from './types';\n\n/**\n *\n * Used to calculate object's bounding box\n *\n * @see https://github.com/fabricjs/fabric.js/pull/8344\n *\n */\nexport const projectStrokeOnPoints = (\n points: XY[],\n options: TProjectStrokeOnPointsOptions,\n openPath = false,\n): TProjection[] => {\n const projections: TProjection[] = [];\n\n if (points.length === 0) {\n return projections;\n }\n\n // first we remove duplicate neighboring points\n const reduced = points.reduce(\n (reduced, point) => {\n if (!reduced[reduced.length - 1].eq(point)) {\n reduced.push(new Point(point));\n }\n return reduced;\n },\n [new Point(points[0])],\n );\n\n if (reduced.length === 1) {\n openPath = true;\n } else if (!openPath) {\n // remove points from end in case they equal the first point\n // in order to correctly project the first point\n const start = reduced[0];\n const index = findIndexRight(reduced, (point) => !point.eq(start));\n reduced.splice(index + 1);\n }\n\n reduced.forEach((A, index, points) => {\n let B: XY, C: XY;\n if (index === 0) {\n C = points[1];\n B = openPath ? A : points[points.length - 1];\n } else if (index === points.length - 1) {\n B = points[index - 1];\n C = openPath ? A : points[0];\n } else {\n B = points[index - 1];\n C = points[index + 1];\n }\n\n if (openPath && points.length === 1) {\n projections.push(\n ...new StrokeLineCapProjections(A, A, options).project(),\n );\n } else if (openPath && (index === 0 || index === points.length - 1)) {\n projections.push(\n ...new StrokeLineCapProjections(\n A,\n index === 0 ? C : B,\n options,\n ).project(),\n );\n } else {\n projections.push(\n ...new StrokeLineJoinProjections(A, B, C, options).project(),\n );\n }\n });\n\n return projections;\n};\n","import type { TextStyle } from '../../shapes/Text/StyledText';\n\nexport const cloneStyles = (style: TextStyle): TextStyle => {\n const newObj: TextStyle = {};\n Object.keys(style).forEach((key) => {\n newObj[key] = {};\n Object.keys(style[key]).forEach((keyInner) => {\n newObj[key][keyInner] = { ...style[key][keyInner] };\n });\n });\n return newObj;\n};\n","import { getFabricWindow } from '../env';\n\n/**\n * Capitalizes a string\n * @param {String} string String to capitalize\n * @param {Boolean} [firstLetterOnly] If true only first letter is capitalized\n * and other letters stay untouched, if false first letter is capitalized\n * and other letters are converted to lowercase.\n * @return {String} Capitalized version of a string\n */\nexport const capitalize = (string: string, firstLetterOnly = false): string =>\n `${string.charAt(0).toUpperCase()}${\n firstLetterOnly ? string.slice(1) : string.slice(1).toLowerCase()\n }`;\n\n/**\n * Escapes XML in a string\n * @param {String} string String to escape\n * @return {String} Escaped version of a string\n */\nexport const escapeXml = (string: string): string =>\n string\n .replace(/&/g, '&')\n .replace(/\"/g, '"')\n .replace(/'/g, ''')\n .replace(//g, '>');\n\nlet segmenter: Intl.Segmenter | false;\n\nconst getSegmenter = () => {\n if (!segmenter) {\n segmenter =\n 'Intl' in getFabricWindow() &&\n 'Segmenter' in Intl &&\n new Intl.Segmenter(undefined, {\n granularity: 'grapheme',\n });\n }\n return segmenter;\n};\n\n/**\n * Divide a string in the user perceived single units\n * @param {String} textstring String to escape\n * @return {Array} array containing the graphemes\n */\nexport const graphemeSplit = (textstring: string): string[] => {\n segmenter || getSegmenter();\n if (segmenter) {\n const segments = segmenter.segment(textstring);\n return Array.from(segments).map(({ segment }) => segment);\n }\n\n //Fallback\n return graphemeSplitImpl(textstring);\n};\n\nconst graphemeSplitImpl = (textstring: string): string[] => {\n const graphemes: string[] = [];\n for (let i = 0, chr; i < textstring.length; i++) {\n if ((chr = getWholeChar(textstring, i)) === false) {\n continue;\n }\n graphemes.push(chr);\n }\n return graphemes;\n};\n\n// taken from mdn in the charAt doc page.\nconst getWholeChar = (str: string, i: number): string | false => {\n const code = str.charCodeAt(i);\n if (isNaN(code)) {\n return ''; // Position not found\n }\n if (code < 0xd800 || code > 0xdfff) {\n return str.charAt(i);\n }\n\n // High surrogate (could change last hex to 0xDB7F to treat high private\n // surrogates as single characters)\n if (0xd800 <= code && code <= 0xdbff) {\n if (str.length <= i + 1) {\n throw 'High surrogate without following low surrogate';\n }\n const next = str.charCodeAt(i + 1);\n if (0xdc00 > next || next > 0xdfff) {\n throw 'High surrogate without following low surrogate';\n }\n return str.charAt(i) + str.charAt(i + 1);\n }\n // Low surrogate (0xDC00 <= code && code <= 0xDFFF)\n if (i === 0) {\n throw 'Low surrogate without preceding high surrogate';\n }\n const prev = str.charCodeAt(i - 1);\n\n // (could change last hex to 0xDB7F to treat high private\n // surrogates as single characters)\n if (0xd800 > prev || prev > 0xdbff) {\n throw 'Low surrogate without preceding high surrogate';\n }\n // We can pass over low surrogates now as the second component\n // in a pair which we have already processed\n return false;\n};\n","import { reNewline } from '../../constants';\nimport type {\n TextStyle,\n TextStyleDeclaration,\n} from '../../shapes/Text/StyledText';\nimport { cloneStyles } from '../internals/cloneStyles';\nimport { graphemeSplit } from '../lang_string';\n\nexport type TextStyleArray = {\n start: number;\n end: number;\n style: TextStyleDeclaration;\n}[];\n\n/**\n * @param {Object} prevStyle first style to compare\n * @param {Object} thisStyle second style to compare\n * @param {boolean} forTextSpans whether to check overline, underline, and line-through properties\n * @return {boolean} true if the style changed\n */\nexport const hasStyleChanged = (\n prevStyle: TextStyleDeclaration,\n thisStyle: TextStyleDeclaration,\n forTextSpans = false,\n) =>\n prevStyle.fill !== thisStyle.fill ||\n prevStyle.stroke !== thisStyle.stroke ||\n prevStyle.strokeWidth !== thisStyle.strokeWidth ||\n prevStyle.fontSize !== thisStyle.fontSize ||\n prevStyle.fontFamily !== thisStyle.fontFamily ||\n prevStyle.fontWeight !== thisStyle.fontWeight ||\n prevStyle.fontStyle !== thisStyle.fontStyle ||\n prevStyle.textDecorationThickness !== thisStyle.textDecorationThickness ||\n prevStyle.textBackgroundColor !== thisStyle.textBackgroundColor ||\n prevStyle.deltaY !== thisStyle.deltaY ||\n (forTextSpans &&\n (prevStyle.overline !== thisStyle.overline ||\n prevStyle.underline !== thisStyle.underline ||\n prevStyle.linethrough !== thisStyle.linethrough));\n\n/**\n * Returns the array form of a text object's inline styles property with styles grouped in ranges\n * rather than per character. This format is less verbose, and is better suited for storage\n * so it is used in serialization (not during runtime).\n * @param {object} styles per character styles for a text object\n * @param {String} text the text string that the styles are applied to\n * @return {{start: number, end: number, style: object}[]}\n */\nexport const stylesToArray = (\n styles: TextStyle,\n text: string,\n): TextStyleArray => {\n const textLines = text.split('\\n'),\n stylesArray = [];\n let charIndex = -1,\n prevStyle = {};\n // clone style structure to prevent mutation\n styles = cloneStyles(styles);\n\n //loop through each textLine\n for (let i = 0; i < textLines.length; i++) {\n const chars = graphemeSplit(textLines[i]);\n if (!styles[i]) {\n //no styles exist for this line, so add the line's length to the charIndex total and reset prevStyle\n charIndex += chars.length;\n prevStyle = {};\n continue;\n }\n //loop through each character of the current line\n for (let c = 0; c < chars.length; c++) {\n charIndex++;\n const thisStyle = styles[i][c];\n //check if style exists for this character\n if (thisStyle && Object.keys(thisStyle).length > 0) {\n if (hasStyleChanged(prevStyle, thisStyle, true)) {\n stylesArray.push({\n start: charIndex,\n end: charIndex + 1,\n style: thisStyle,\n });\n } else {\n //if style is the same as previous character, increase end index\n stylesArray[stylesArray.length - 1].end++;\n }\n }\n prevStyle = thisStyle || {};\n }\n }\n return stylesArray;\n};\n\n/**\n * Returns the object form of the styles property with styles that are assigned per\n * character rather than grouped by range. This format is more verbose, and is\n * only used during runtime (not for serialization/storage)\n * @param {Array} styles the serialized form of a text object's styles\n * @param {String} text the text string that the styles are applied to\n * @return {Object}\n */\nexport const stylesFromArray = (\n styles: TextStyleArray | TextStyle,\n text: string,\n): TextStyle => {\n if (!Array.isArray(styles)) {\n // clone to prevent mutation\n return cloneStyles(styles);\n }\n const textLines = text.split(reNewline),\n stylesObject: TextStyle = {};\n let charIndex = -1,\n styleIndex = 0;\n //loop through each textLine\n for (let i = 0; i < textLines.length; i++) {\n const chars = graphemeSplit(textLines[i]);\n\n //loop through each character of the current line\n for (let c = 0; c < chars.length; c++) {\n charIndex++;\n //check if there's a style collection that includes the current character\n if (\n styles[styleIndex] &&\n styles[styleIndex].start <= charIndex &&\n charIndex < styles[styleIndex].end\n ) {\n //create object for line index if it doesn't exist\n stylesObject[i] = stylesObject[i] || {};\n //assign a style at this character's index\n stylesObject[i][c] = { ...styles[styleIndex].style };\n //if character is at the end of the current style collection, move to the next\n if (charIndex === styles[styleIndex].end - 1) {\n styleIndex++;\n }\n }\n }\n }\n return stylesObject;\n};\n","import { FILL, STROKE } from '../constants';\n\n/**\n * Attributes parsed from all SVG elements\n * @type array\n */\nexport const SHARED_ATTRIBUTES = [\n 'display',\n 'transform',\n FILL,\n 'fill-opacity',\n 'fill-rule',\n 'opacity',\n STROKE,\n 'stroke-dasharray',\n 'stroke-linecap',\n 'stroke-dashoffset',\n 'stroke-linejoin',\n 'stroke-miterlimit',\n 'stroke-opacity',\n 'stroke-width',\n 'id',\n 'paint-order',\n 'vector-effect',\n 'instantiated_by_use',\n 'clip-path',\n];\n","export function selectorMatches(\n element: HTMLElement | SVGElement,\n selector: string,\n) {\n const nodeName = element.nodeName;\n const classNames = element.getAttribute('class');\n const id = element.getAttribute('id');\n const azAz = '(?![a-zA-Z\\\\-]+)';\n let matcher;\n // i check if a selector matches slicing away part from it.\n // if i get empty string i should match\n matcher = new RegExp('^' + nodeName, 'i');\n selector = selector.replace(matcher, '');\n if (id && selector.length) {\n matcher = new RegExp('#' + id + azAz, 'i');\n selector = selector.replace(matcher, '');\n }\n if (classNames && selector.length) {\n const splitClassNames = classNames.split(' ');\n for (let i = splitClassNames.length; i--; ) {\n matcher = new RegExp('\\\\.' + splitClassNames[i] + azAz, 'i');\n selector = selector.replace(matcher, '');\n }\n }\n return selector.length === 0;\n}\n","import { selectorMatches } from './selectorMatches';\n\nexport function doesSomeParentMatch(\n element: HTMLElement | SVGElement,\n selectors: string[],\n) {\n let selector: string,\n parentMatching = true;\n while (\n element.parentElement &&\n element.parentElement.nodeType === 1 &&\n selectors.length\n ) {\n if (parentMatching) {\n selector = selectors.pop()!;\n }\n element = element.parentElement;\n parentMatching = selectorMatches(element, selector!);\n }\n return selectors.length === 0;\n}\n","import { selectorMatches } from './selectorMatches';\nimport { doesSomeParentMatch } from './doesSomeParentMatch';\n\n/**\n * @private\n */\n\nexport function elementMatchesRule(\n element: HTMLElement | SVGElement,\n selectors: string[],\n) {\n let parentMatching = true;\n // start from rightmost selector.\n const firstMatching = selectorMatches(element, selectors.pop()!);\n if (firstMatching && selectors.length) {\n parentMatching = doesSomeParentMatch(element, selectors);\n }\n return firstMatching && parentMatching && selectors.length === 0;\n}\n","import { elementMatchesRule } from './elementMatchesRule';\nimport type { CSSRules } from './typedefs';\n\n/**\n * @private\n */\n\nexport function getGlobalStylesForElement(\n element: HTMLElement | SVGElement,\n cssRules: CSSRules = {},\n) {\n let styles: Record = {};\n for (const rule in cssRules) {\n if (elementMatchesRule(element, rule.split(' '))) {\n styles = {\n ...styles,\n ...cssRules[rule],\n };\n }\n }\n return styles;\n}\n","import { attributesMap } from './constants';\n\nexport const normalizeAttr = (\n attr: keyof typeof attributesMap | string,\n): string => attributesMap[attr as keyof typeof attributesMap] ?? attr;\n","import { reNum } from '../../parser/constants';\n\nconst regex = new RegExp(`(${reNum})`, 'gi');\n\nexport const cleanupSvgAttribute = (attributeValue: string) =>\n attributeValue\n .replace(regex, ' $1 ')\n // replace annoying commas and arbitrary whitespace with single spaces\n .replace(/,/gi, ' ')\n .replace(/\\s+/gi, ' ');\n","import { ROTATE, SCALE, SKEW_X, SKEW_Y, iMatrix } from '../constants';\nimport { reNum } from './constants';\nimport type { TMat2D } from '../typedefs';\nimport { cleanupSvgAttribute } from '../util/internals/cleanupSvgAttribute';\nimport {\n createRotateMatrix,\n createScaleMatrix,\n createSkewXMatrix,\n createSkewYMatrix,\n createTranslateMatrix,\n multiplyTransformMatrixArray,\n} from '../util/misc/matrix';\n\n// == begin transform regexp\nconst p = `(${reNum})`;\nconst skewX = String.raw`(skewX)\\(${p}\\)`;\nconst skewY = String.raw`(skewY)\\(${p}\\)`;\nconst rotate = String.raw`(rotate)\\(${p}(?: ${p} ${p})?\\)`;\nconst scale = String.raw`(scale)\\(${p}(?: ${p})?\\)`;\nconst translate = String.raw`(translate)\\(${p}(?: ${p})?\\)`;\nconst matrix = String.raw`(matrix)\\(${p} ${p} ${p} ${p} ${p} ${p}\\)`;\nconst transform = `(?:${matrix}|${translate}|${rotate}|${scale}|${skewX}|${skewY})`;\nconst transforms = `(?:${transform}*)`;\nconst transformList = String.raw`^\\s*(?:${transforms}?)\\s*$`;\n// http://www.w3.org/TR/SVG/coords.html#TransformAttribute\nconst reTransformList = new RegExp(transformList);\nconst reTransform = new RegExp(transform);\nconst reTransformAll = new RegExp(transform, 'g');\n// == end transform regexp\n\n/**\n * Parses \"transform\" attribute, returning an array of values\n * @param {String} attributeValue String containing attribute value\n * @return {TTransformMatrix} Array of 6 elements representing transformation matrix\n */\nexport function parseTransformAttribute(attributeValue: string): TMat2D {\n // first we clean the string\n attributeValue = cleanupSvgAttribute(attributeValue)\n // remove spaces around front parentheses\n .replace(/\\s*([()])\\s*/gi, '$1');\n\n // start with identity matrix\n const matrices: TMat2D[] = [];\n\n // return if no argument was given or\n // an argument does not match transform attribute regexp\n if (\n !attributeValue ||\n (attributeValue && !reTransformList.test(attributeValue))\n ) {\n return [...iMatrix];\n }\n\n for (const match of attributeValue.matchAll(reTransformAll)) {\n const transformMatch = reTransform.exec(match[0]);\n if (!transformMatch) {\n continue;\n }\n let matrix: TMat2D = iMatrix;\n const matchedParams = transformMatch.filter((m) => !!m);\n const [, operation, ...rawArgs] = matchedParams;\n const [arg0, arg1, arg2, arg3, arg4, arg5] = rawArgs.map((arg) =>\n parseFloat(arg),\n );\n\n switch (operation) {\n case 'translate':\n matrix = createTranslateMatrix(arg0, arg1);\n break;\n case ROTATE:\n matrix = createRotateMatrix({ angle: arg0 }, { x: arg1, y: arg2 });\n break;\n case SCALE:\n matrix = createScaleMatrix(arg0, arg1);\n break;\n case SKEW_X:\n matrix = createSkewXMatrix(arg0);\n break;\n case SKEW_Y:\n matrix = createSkewYMatrix(arg0);\n break;\n case 'matrix':\n matrix = [arg0, arg1, arg2, arg3, arg4, arg5];\n break;\n }\n\n // snapshot current matrix into matrices array\n matrices.push(matrix);\n }\n\n return multiplyTransformMatrixArray(matrices);\n}\n","import { multiplyTransformMatrices } from '../util/misc/matrix';\nimport { parseUnit } from '../util/misc/svgParsing';\nimport { parseTransformAttribute } from './parseTransformAttribute';\nimport { CENTER, LEFT, RIGHT, NONE, FILL, STROKE } from '../constants';\nimport { TEXT_DECORATION_THICKNESS } from '../shapes/Text/constants';\n\nexport function normalizeValue(\n attr: string,\n value: any,\n parentAttributes: Record,\n fontSize: number,\n): string | null | boolean | number[] | number {\n const isArray = Array.isArray(value);\n let parsed: number | number[];\n let ouputValue: string | null | boolean | number[] | number = value;\n if ((attr === FILL || attr === STROKE) && value === NONE) {\n ouputValue = '';\n } else if (attr === 'strokeUniform') {\n return value === 'non-scaling-stroke';\n } else if (attr === 'strokeDashArray') {\n if (value === NONE) {\n ouputValue = null;\n } else {\n ouputValue = value.replace(/,/g, ' ').split(/\\s+/).map(parseFloat);\n }\n } else if (attr === 'transformMatrix') {\n if (parentAttributes && parentAttributes.transformMatrix) {\n ouputValue = multiplyTransformMatrices(\n parentAttributes.transformMatrix,\n parseTransformAttribute(value),\n );\n } else {\n ouputValue = parseTransformAttribute(value);\n }\n } else if (attr === 'visible') {\n ouputValue = value !== NONE && value !== 'hidden';\n // display=none on parent element always takes precedence over child element\n if (parentAttributes && parentAttributes.visible === false) {\n ouputValue = false;\n }\n } else if (attr === 'opacity') {\n ouputValue = parseFloat(value);\n if (parentAttributes && typeof parentAttributes.opacity !== 'undefined') {\n ouputValue *= parentAttributes.opacity as number;\n }\n } else if (attr === 'textAnchor' /* text-anchor */) {\n ouputValue = value === 'start' ? LEFT : value === 'end' ? RIGHT : CENTER;\n } else if (attr === 'charSpacing' || attr === TEXT_DECORATION_THICKNESS) {\n // parseUnit returns px and we convert it to em\n parsed = (parseUnit(value, fontSize) / fontSize) * 1000;\n } else if (attr === 'paintFirst') {\n const fillIndex = value.indexOf(FILL);\n const strokeIndex = value.indexOf(STROKE);\n ouputValue = FILL;\n if (fillIndex > -1 && strokeIndex > -1 && strokeIndex < fillIndex) {\n ouputValue = STROKE;\n } else if (fillIndex === -1 && strokeIndex > -1) {\n ouputValue = STROKE;\n }\n } else if (\n attr === 'href' ||\n attr === 'xlink:href' ||\n attr === 'font' ||\n attr === 'id'\n ) {\n return value;\n } else if (attr === 'imageSmoothing') {\n return value === 'optimizeQuality';\n } else {\n parsed = isArray\n ? (value as string[]).map(parseUnit)\n : parseUnit(value, fontSize);\n }\n\n return !isArray && isNaN(parsed! as number) ? ouputValue : parsed!;\n}\n","import { parseUnit } from '../util/misc/svgParsing';\nimport { reFontDeclaration } from './constants';\n\n/**\n * Parses a short font declaration, building adding its properties to a style object\n * @param {String} value font declaration\n * @param {Object} oStyle definition\n */\nexport function parseFontDeclaration(\n value: string,\n oStyle: Record,\n): void {\n const match = value.match(reFontDeclaration);\n\n if (!match) {\n return;\n }\n const fontStyle = match[1],\n // font variant is not used\n // fontVariant = match[2],\n fontWeight = match[3],\n fontSize = match[4],\n lineHeight = match[5],\n fontFamily = match[6];\n\n if (fontStyle) {\n oStyle.fontStyle = fontStyle;\n }\n if (fontWeight) {\n oStyle.fontWeight = isNaN(parseFloat(fontWeight))\n ? fontWeight\n : parseFloat(fontWeight);\n }\n if (fontSize) {\n oStyle.fontSize = parseUnit(fontSize);\n }\n if (fontFamily) {\n oStyle.fontFamily = fontFamily;\n }\n if (lineHeight) {\n oStyle.lineHeight = lineHeight === 'normal' ? 1 : lineHeight;\n }\n}\n","/**\n * Takes a style object and parses it in one that has only defined values\n * and lowercases properties\n * @param style\n * @param oStyle\n */\nexport function parseStyleObject(\n style: Record,\n oStyle: Record,\n): void {\n Object.entries(style).forEach(([prop, value]) => {\n if (value === undefined) {\n return;\n }\n oStyle[prop.toLowerCase()] = value;\n });\n}\n","/**\n * Takes a style string and parses it in one that has only defined values\n * and lowercases properties\n * @param style\n * @param oStyle\n */\nexport function parseStyleString(\n style: string,\n oStyle: Record,\n): void {\n style\n .replace(/;\\s*$/, '')\n .split(';')\n .forEach((chunk) => {\n if (!chunk) return;\n const [attr, value] = chunk.split(':');\n oStyle[attr.trim().toLowerCase()] = value.trim();\n });\n}\n","import { parseStyleObject } from './parseStyleObject';\nimport { parseStyleString } from './parseStyleString';\n\n/**\n * Parses \"style\" attribute, retuning an object with values\n * @param {SVGElement} element Element to parse\n * @return {Object} Objects with values parsed from style attribute of an element\n */\nexport function parseStyleAttribute(\n element: HTMLElement | SVGElement,\n): Record {\n const oStyle: Record = {},\n style = element.getAttribute('style');\n\n if (!style) {\n return oStyle;\n }\n\n if (typeof style === 'string') {\n parseStyleString(style, oStyle);\n } else {\n parseStyleObject(style, oStyle);\n }\n\n return oStyle;\n}\n","import { Color } from '../color/Color';\nimport { toFixed } from '../util/misc/toFixed';\nimport { FabricObject } from '../shapes/Object/FabricObject';\n\nconst colorAttributesMap = {\n stroke: 'strokeOpacity',\n fill: 'fillOpacity',\n};\n\n/**\n * @private\n * @param {Object} attributes Array of attributes to parse\n */\n\nexport function setStrokeFillOpacity(\n attributes: Record,\n): Record {\n const defaults = FabricObject.getDefaults();\n Object.entries(colorAttributesMap).forEach(([attr, colorAttr]) => {\n if (\n typeof attributes[colorAttr] === 'undefined' ||\n attributes[attr] === ''\n ) {\n return;\n }\n if (typeof attributes[attr] === 'undefined') {\n if (!defaults[attr]) {\n return;\n }\n attributes[attr] = defaults[attr];\n }\n if (attributes[attr].indexOf('url(') === 0) {\n return;\n }\n const color = new Color(attributes[attr]);\n attributes[attr] = color\n .setAlpha(toFixed(color.getAlpha() * attributes[colorAttr], 2))\n .toRgba();\n });\n return attributes;\n}\n","import { DEFAULT_SVG_FONT_SIZE } from '../constants';\nimport { parseUnit } from '../util/misc/svgParsing';\nimport { cPath, fSize, svgValidParentsRegEx } from './constants';\nimport { getGlobalStylesForElement } from './getGlobalStylesForElement';\nimport { normalizeAttr } from './normalizeAttr';\nimport { normalizeValue } from './normalizeValue';\nimport { parseFontDeclaration } from './parseFontDeclaration';\nimport { parseStyleAttribute } from './parseStyleAttribute';\nimport { setStrokeFillOpacity } from './setStrokeFillOpacity';\nimport type { CSSRules } from './typedefs';\n\n/**\n * Returns an object of attributes' name/value, given element and an array of attribute names;\n * Parses parent \"g\" nodes recursively upwards.\n * @param {SVGElement | HTMLElement} element Element to parse\n * @param {Array} attributes Array of attributes to parse\n * @return {Object} object containing parsed attributes' names/values\n */\nexport function parseAttributes(\n element: HTMLElement | SVGElement | null,\n attributes: string[],\n cssRules?: CSSRules,\n): Record {\n if (!element) {\n return {};\n }\n\n let parentAttributes: Record = {},\n fontSize: number,\n parentFontSize = DEFAULT_SVG_FONT_SIZE;\n\n // if there's a parent container (`g` or `a` or `symbol` node), parse its attributes recursively upwards\n if (\n element.parentNode &&\n svgValidParentsRegEx.test(element.parentNode.nodeName)\n ) {\n parentAttributes = parseAttributes(\n element.parentElement,\n attributes,\n cssRules,\n );\n if (parentAttributes.fontSize) {\n fontSize = parentFontSize = parseUnit(parentAttributes.fontSize);\n }\n }\n\n const ownAttributes: Record = {\n ...attributes.reduce>((memo, attr) => {\n const value = element.getAttribute(attr);\n if (value) {\n memo[attr] = value;\n }\n return memo;\n }, {}),\n // add values parsed from style, which take precedence over attributes\n // (see: http://www.w3.org/TR/SVG/styling.html#UsingPresentationAttributes)\n ...getGlobalStylesForElement(element, cssRules),\n ...parseStyleAttribute(element),\n };\n\n if (ownAttributes[cPath]) {\n element.setAttribute(cPath, ownAttributes[cPath]);\n }\n if (ownAttributes[fSize]) {\n // looks like the minimum should be 9px when dealing with ems. this is what looks like in browsers.\n fontSize = parseUnit(ownAttributes[fSize], parentFontSize);\n ownAttributes[fSize] = `${fontSize}`;\n }\n\n // this should have its own complex type\n const normalizedStyle: Record<\n string,\n string | boolean | number | number[] | null\n > = {};\n for (const attr in ownAttributes) {\n const normalizedAttr = normalizeAttr(attr);\n const normalizedValue = normalizeValue(\n normalizedAttr,\n ownAttributes[attr],\n parentAttributes,\n fontSize!,\n );\n normalizedStyle[normalizedAttr] = normalizedValue;\n }\n if (normalizedStyle && normalizedStyle.font) {\n parseFontDeclaration(normalizedStyle.font as string, normalizedStyle);\n }\n const mergedAttrs = { ...parentAttributes, ...normalizedStyle };\n return svgValidParentsRegEx.test(element.nodeName)\n ? mergedAttrs\n : setStrokeFillOpacity(mergedAttrs);\n}\n","import { kRect } from '../constants';\nimport { SHARED_ATTRIBUTES } from '../parser/attributes';\nimport { parseAttributes } from '../parser/parseAttributes';\nimport type { Abortable, TClassProperties, TOptions } from '../typedefs';\nimport { classRegistry } from '../ClassRegistry';\nimport { FabricObject, cacheProperties } from './Object/FabricObject';\nimport type { FabricObjectProps, SerializedObjectProps } from './Object/types';\nimport type { ObjectEvents } from '../EventTypeDefs';\nimport type { CSSRules } from '../parser/typedefs';\n\nexport const rectDefaultValues: Partial> = {\n rx: 0,\n ry: 0,\n};\n\ninterface UniqueRectProps {\n rx: number;\n ry: number;\n}\n\nexport interface SerializedRectProps\n extends SerializedObjectProps,\n UniqueRectProps {}\n\nexport interface RectProps extends FabricObjectProps, UniqueRectProps {}\n\nconst RECT_PROPS = ['rx', 'ry'] as const;\n\nexport class Rect<\n Props extends TOptions = Partial,\n SProps extends SerializedRectProps = SerializedRectProps,\n EventSpec extends ObjectEvents = ObjectEvents,\n >\n extends FabricObject\n implements RectProps\n{\n /**\n * Horizontal border radius\n * @type Number\n */\n declare rx: number;\n\n /**\n * Vertical border radius\n * @type Number\n */\n declare ry: number;\n\n static type = 'Rect';\n\n static cacheProperties = [...cacheProperties, ...RECT_PROPS];\n\n static ownDefaults = rectDefaultValues;\n\n static getDefaults(): Record {\n return {\n ...super.getDefaults(),\n ...Rect.ownDefaults,\n };\n }\n\n /**\n * Constructor\n * @param {Object} [options] Options object\n */\n constructor(options?: Props) {\n super();\n Object.assign(this, Rect.ownDefaults);\n this.setOptions(options);\n this._initRxRy();\n }\n /**\n * Initializes rx/ry attributes\n * @private\n */\n _initRxRy() {\n const { rx, ry } = this;\n if (rx && !ry) {\n this.ry = rx;\n } else if (ry && !rx) {\n this.rx = ry;\n }\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _render(ctx: CanvasRenderingContext2D) {\n const { width: w, height: h } = this;\n const x = -w / 2;\n const y = -h / 2;\n const rx = this.rx ? Math.min(this.rx, w / 2) : 0;\n const ry = this.ry ? Math.min(this.ry, h / 2) : 0;\n const isRounded = rx !== 0 || ry !== 0;\n\n ctx.beginPath();\n\n ctx.moveTo(x + rx, y);\n\n ctx.lineTo(x + w - rx, y);\n isRounded &&\n ctx.bezierCurveTo(\n x + w - kRect * rx,\n y,\n x + w,\n y + kRect * ry,\n x + w,\n y + ry,\n );\n\n ctx.lineTo(x + w, y + h - ry);\n isRounded &&\n ctx.bezierCurveTo(\n x + w,\n y + h - kRect * ry,\n x + w - kRect * rx,\n y + h,\n x + w - rx,\n y + h,\n );\n\n ctx.lineTo(x + rx, y + h);\n isRounded &&\n ctx.bezierCurveTo(\n x + kRect * rx,\n y + h,\n x,\n y + h - kRect * ry,\n x,\n y + h - ry,\n );\n\n ctx.lineTo(x, y + ry);\n isRounded &&\n ctx.bezierCurveTo(x, y + kRect * ry, x + kRect * rx, y, x + rx, y);\n\n ctx.closePath();\n\n this._renderPaintInOrder(ctx);\n }\n\n /**\n * Returns object representation of an instance\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} object representation of an instance\n */\n toObject<\n T extends Omit, keyof SProps>,\n K extends keyof T = never,\n >(propertiesToInclude: K[] = []): Pick & SProps {\n return super.toObject([...RECT_PROPS, ...propertiesToInclude]);\n }\n\n /**\n * Returns svg representation of an instance\n * @return {Array} an array of strings with the specific svg representation\n * of the instance\n */\n _toSVG() {\n const { width, height, rx, ry } = this;\n return [\n '\\n`,\n ];\n }\n\n /**\n * List of attribute names to account for when parsing SVG element (used by `Rect.fromElement`)\n * @see: http://www.w3.org/TR/SVG/shapes.html#RectElement\n */\n static ATTRIBUTE_NAMES = [\n ...SHARED_ATTRIBUTES,\n 'x',\n 'y',\n 'rx',\n 'ry',\n 'width',\n 'height',\n ];\n\n /* _FROM_SVG_START_ */\n\n /**\n * Returns {@link Rect} instance from an SVG element\n * @param {HTMLElement} element Element to parse\n * @param {Object} [options] Options object\n */\n static async fromElement(\n element: HTMLElement | SVGElement,\n options?: Abortable,\n cssRules?: CSSRules,\n ) {\n const {\n left = 0,\n top = 0,\n width = 0,\n height = 0,\n visible = true,\n ...restOfparsedAttributes\n } = parseAttributes(element, this.ATTRIBUTE_NAMES, cssRules);\n\n return new this({\n ...options,\n ...restOfparsedAttributes,\n left,\n top,\n width,\n height,\n visible: Boolean(visible && width && height),\n });\n }\n\n /* _FROM_SVG_END_ */\n}\n\nclassRegistry.setClass(Rect);\nclassRegistry.setSVGClass(Rect);\n","export const LAYOUT_TYPE_INITIALIZATION = 'initialization';\nexport const LAYOUT_TYPE_ADDED = 'added';\nexport const LAYOUT_TYPE_REMOVED = 'removed';\nexport const LAYOUT_TYPE_IMPERATIVE = 'imperative';\nexport const LAYOUT_TYPE_OBJECT_MODIFIED = 'object_modified';\nexport const LAYOUT_TYPE_OBJECT_MODIFYING = 'object_modifying';\n","import { Point, ZERO } from '../../Point';\nimport type { Group } from '../../shapes/Group';\nimport type { FabricObject } from '../../shapes/Object/FabricObject';\nimport { multiplyTransformMatrixArray } from '../../util/misc/matrix';\nimport { sizeAfterTransform } from '../../util/misc/objectTransforms';\nimport {\n calcPlaneChangeMatrix,\n sendVectorToPlane,\n} from '../../util/misc/planeChange';\n\n/**\n * @returns 2 points, the tl and br corners of the non rotated bounding box of an object\n * in the {@link group} plane, taking into account objects that {@link group} is their parent\n * but also belong to the active selection.\n */\nexport const getObjectBounds = (\n destinationGroup: Group,\n object: FabricObject,\n): Point[] => {\n const {\n strokeUniform,\n strokeWidth,\n width,\n height,\n group: currentGroup,\n } = object;\n const t =\n currentGroup && currentGroup !== destinationGroup\n ? calcPlaneChangeMatrix(\n currentGroup.calcTransformMatrix(),\n destinationGroup.calcTransformMatrix(),\n )\n : null;\n const objectCenter = t\n ? object.getRelativeCenterPoint().transform(t)\n : object.getRelativeCenterPoint();\n const accountForStroke = !object['isStrokeAccountedForInDimensions']();\n const strokeUniformVector =\n strokeUniform && accountForStroke\n ? sendVectorToPlane(\n new Point(strokeWidth, strokeWidth),\n undefined,\n destinationGroup.calcTransformMatrix(),\n )\n : ZERO;\n const scalingStrokeWidth =\n !strokeUniform && accountForStroke ? strokeWidth : 0;\n const sizeVector = sizeAfterTransform(\n width + scalingStrokeWidth,\n height + scalingStrokeWidth,\n multiplyTransformMatrixArray([t, object.calcOwnMatrix()], true),\n )\n .add(strokeUniformVector)\n .scalarDivide(2);\n return [objectCenter.subtract(sizeVector), objectCenter.add(sizeVector)];\n};\n","import { Point } from '../../Point';\nimport type { FabricObject } from '../../shapes/Object/FabricObject';\nimport { makeBoundingBoxFromPoints } from '../../util/misc/boundingBoxFromPoints';\nimport {\n LAYOUT_TYPE_INITIALIZATION,\n LAYOUT_TYPE_IMPERATIVE,\n} from '../constants';\nimport type {\n InitializationLayoutContext,\n LayoutStrategyResult,\n StrictLayoutContext,\n} from '../types';\nimport { getObjectBounds } from './utils';\n\n/**\n * Exposes a main public method {@link calcLayoutResult} that is used by the `LayoutManager` to perform layout.\n * Returning `undefined` signals the `LayoutManager` to skip the layout.\n *\n * In charge of calculating the bounding box of the passed objects.\n */\nexport abstract class LayoutStrategy {\n /**\n * override by subclass for persistence (TS does not support `static abstract`)\n */\n static type = 'strategy';\n\n /**\n * Used by the `LayoutManager` to perform layout\n * @TODO/fix: if this method is calcResult, should calc unconditionally.\n * the condition to not calc should be evaluated by the layoutManager.\n * @returns layout result **OR** `undefined` to skip layout\n */\n public calcLayoutResult(\n context: StrictLayoutContext,\n objects: FabricObject[],\n ): LayoutStrategyResult | undefined {\n if (this.shouldPerformLayout(context)) {\n return this.calcBoundingBox(objects, context);\n }\n }\n\n shouldPerformLayout({ type, prevStrategy, strategy }: StrictLayoutContext) {\n return (\n type === LAYOUT_TYPE_INITIALIZATION ||\n type === LAYOUT_TYPE_IMPERATIVE ||\n (!!prevStrategy && strategy !== prevStrategy)\n );\n }\n\n shouldLayoutClipPath({ type, target: { clipPath } }: StrictLayoutContext) {\n return (\n type !== LAYOUT_TYPE_INITIALIZATION &&\n clipPath &&\n !clipPath.absolutePositioned\n );\n }\n\n getInitialSize(\n context: StrictLayoutContext & InitializationLayoutContext,\n result: Pick,\n ) {\n return result.size;\n }\n\n /**\n * Override this method to customize layout.\n */\n calcBoundingBox(\n objects: FabricObject[],\n context: StrictLayoutContext,\n ): LayoutStrategyResult | undefined {\n const { type, target } = context;\n if (type === LAYOUT_TYPE_IMPERATIVE && context.overrides) {\n return context.overrides;\n }\n if (objects.length === 0) {\n return;\n }\n const { left, top, width, height } = makeBoundingBoxFromPoints(\n objects\n .map((object) => getObjectBounds(target, object))\n .reduce((coords, curr) => coords.concat(curr), []),\n );\n const bboxSize = new Point(width, height);\n const bboxLeftTop = new Point(left, top);\n const bboxCenter = bboxLeftTop.add(bboxSize.scalarDivide(2));\n\n if (type === LAYOUT_TYPE_INITIALIZATION) {\n const actualSize = this.getInitialSize(context, {\n size: bboxSize,\n center: bboxCenter,\n });\n return {\n // in `initialization` we do not account for target's transformation matrix\n center: bboxCenter,\n // TODO: investigate if this is still necessary\n relativeCorrection: new Point(0, 0),\n size: actualSize,\n };\n } else {\n // we send `relativeCenter` up to group's containing plane\n const center = bboxCenter.transform(target.calcOwnMatrix());\n return {\n center,\n size: bboxSize,\n };\n }\n }\n}\n","import type { StrictLayoutContext } from '../types';\nimport { LayoutStrategy } from './LayoutStrategy';\nimport { classRegistry } from '../../ClassRegistry';\n\n/**\n * Layout will adjust the bounding box to fit target's objects.\n */\nexport class FitContentLayout extends LayoutStrategy {\n static readonly type = 'fit-content';\n\n /**\n * @override layout on all triggers\n * Override at will\n */\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n shouldPerformLayout(context: StrictLayoutContext) {\n return true;\n }\n}\n\nclassRegistry.setClass(FitContentLayout);\n","import { Point } from '../Point';\nimport {\n CENTER,\n CHANGED,\n MODIFIED,\n MODIFY_PATH,\n MODIFY_POLY,\n MOVING,\n RESIZING,\n ROTATING,\n SCALING,\n SKEWING,\n iMatrix,\n} from '../constants';\nimport type { Group } from '../shapes/Group';\nimport type { FabricObject } from '../shapes/Object/FabricObject';\nimport { invertTransform } from '../util/misc/matrix';\nimport { resolveOrigin } from '../util/misc/resolveOrigin';\nimport { FitContentLayout } from './LayoutStrategies/FitContentLayout';\nimport type { LayoutStrategy } from './LayoutStrategies/LayoutStrategy';\nimport {\n LAYOUT_TYPE_INITIALIZATION,\n LAYOUT_TYPE_ADDED,\n LAYOUT_TYPE_REMOVED,\n LAYOUT_TYPE_IMPERATIVE,\n LAYOUT_TYPE_OBJECT_MODIFIED,\n LAYOUT_TYPE_OBJECT_MODIFYING,\n} from './constants';\nimport type {\n LayoutContext,\n LayoutResult,\n RegistrationContext,\n StrictLayoutContext,\n} from './types';\nimport { classRegistry } from '../ClassRegistry';\nimport type { TModificationEvents } from '../EventTypeDefs';\n\nconst LAYOUT_MANAGER = 'layoutManager';\n\nexport type SerializedLayoutManager = {\n type: string;\n strategy: string;\n};\n\nexport class LayoutManager {\n declare private _prevLayoutStrategy?: LayoutStrategy;\n declare protected _subscriptions: Map;\n\n strategy: LayoutStrategy;\n\n constructor(strategy: LayoutStrategy = new FitContentLayout()) {\n this.strategy = strategy;\n this._subscriptions = new Map();\n }\n\n public performLayout(context: LayoutContext) {\n const strictContext: StrictLayoutContext = {\n bubbles: true,\n strategy: this.strategy,\n ...context,\n prevStrategy: this._prevLayoutStrategy,\n stopPropagation() {\n this.bubbles = false;\n },\n };\n\n this.onBeforeLayout(strictContext);\n\n const layoutResult = this.getLayoutResult(strictContext);\n if (layoutResult) {\n this.commitLayout(strictContext, layoutResult);\n }\n\n this.onAfterLayout(strictContext, layoutResult);\n this._prevLayoutStrategy = strictContext.strategy;\n }\n\n /**\n * Attach handlers for events that we know will invalidate the layout when\n * performed on child objects ( general transforms ).\n * Returns the disposers for later unsubscribing and cleanup\n * @param {FabricObject} object\n * @param {RegistrationContext & Partial} context\n * @returns {VoidFunction[]} disposers remove the handlers\n */\n protected attachHandlers(\n object: FabricObject,\n context: RegistrationContext & Partial,\n ): VoidFunction[] {\n const { target } = context;\n return (\n [\n MODIFIED,\n MOVING,\n RESIZING,\n ROTATING,\n SCALING,\n SKEWING,\n CHANGED,\n MODIFY_POLY,\n MODIFY_PATH,\n ] as (TModificationEvents & 'modified')[]\n ).map((key) =>\n object.on(key, (e) =>\n this.performLayout(\n key === MODIFIED\n ? {\n type: LAYOUT_TYPE_OBJECT_MODIFIED,\n trigger: key,\n e,\n target,\n }\n : {\n type: LAYOUT_TYPE_OBJECT_MODIFYING,\n trigger: key,\n e,\n target,\n },\n ),\n ),\n );\n }\n\n /**\n * Subscribe an object to transform events that will trigger a layout change on the parent\n * This is important only for interactive groups.\n * @param object\n * @param context\n */\n protected subscribe(\n object: FabricObject,\n context: RegistrationContext & Partial,\n ) {\n this.unsubscribe(object, context);\n const disposers = this.attachHandlers(object, context);\n this._subscriptions.set(object, disposers);\n }\n\n /**\n * unsubscribe object layout triggers\n */\n protected unsubscribe(\n object: FabricObject,\n _context?: RegistrationContext & Partial,\n ) {\n (this._subscriptions.get(object) || []).forEach((d) => d());\n this._subscriptions.delete(object);\n }\n\n unsubscribeTargets(\n context: RegistrationContext & Partial,\n ) {\n context.targets.forEach((object) => this.unsubscribe(object, context));\n }\n\n subscribeTargets(\n context: RegistrationContext & Partial,\n ) {\n context.targets.forEach((object) => this.subscribe(object, context));\n }\n\n protected onBeforeLayout(context: StrictLayoutContext) {\n const { target, type } = context;\n const { canvas } = target;\n // handle layout triggers subscription\n // @TODO: gate the registration when the group is interactive\n if (type === LAYOUT_TYPE_INITIALIZATION || type === LAYOUT_TYPE_ADDED) {\n this.subscribeTargets(context);\n } else if (type === LAYOUT_TYPE_REMOVED) {\n this.unsubscribeTargets(context);\n }\n // fire layout event (event will fire only for layouts after initialization layout)\n target.fire('layout:before', {\n context,\n });\n canvas &&\n canvas.fire('object:layout:before', {\n target,\n context,\n });\n\n if (type === LAYOUT_TYPE_IMPERATIVE && context.deep) {\n const { strategy: _, ...tricklingContext } = context;\n // traverse the tree\n target.forEachObject(\n (object) =>\n (object as Group).layoutManager &&\n (object as Group).layoutManager.performLayout({\n ...tricklingContext,\n bubbles: false,\n target: object as Group,\n }),\n );\n }\n }\n\n protected getLayoutResult(\n context: StrictLayoutContext,\n ): Required | undefined {\n const { target, strategy, type } = context;\n\n const result = strategy.calcLayoutResult(context, target.getObjects());\n\n if (!result) {\n return;\n }\n\n const prevCenter =\n type === LAYOUT_TYPE_INITIALIZATION\n ? new Point()\n : target.getRelativeCenterPoint();\n\n const {\n center: nextCenter,\n correction = new Point(),\n relativeCorrection = new Point(),\n } = result;\n const offset = prevCenter\n .subtract(nextCenter)\n .add(correction)\n .transform(\n // in `initialization` we do not account for target's transformation matrix\n type === LAYOUT_TYPE_INITIALIZATION\n ? iMatrix\n : invertTransform(target.calcOwnMatrix()),\n true,\n )\n .add(relativeCorrection);\n\n return {\n result,\n prevCenter,\n nextCenter,\n offset,\n };\n }\n\n protected commitLayout(\n context: StrictLayoutContext,\n layoutResult: Required,\n ) {\n const { target } = context;\n const {\n result: { size },\n nextCenter,\n } = layoutResult;\n // set dimensions\n target.set({ width: size.x, height: size.y });\n // layout descendants\n this.layoutObjects(context, layoutResult);\n // set position\n // in `initialization` we do not account for target's transformation matrix\n if (context.type === LAYOUT_TYPE_INITIALIZATION) {\n // TODO: what about strokeWidth?\n target.set({\n left:\n context.x ?? nextCenter.x + size.x * resolveOrigin(target.originX),\n top: context.y ?? nextCenter.y + size.y * resolveOrigin(target.originY),\n });\n } else {\n target.setPositionByOrigin(nextCenter, CENTER, CENTER);\n // invalidate\n target.setCoords();\n target.set('dirty', true);\n }\n }\n\n protected layoutObjects(\n context: StrictLayoutContext,\n layoutResult: Required,\n ) {\n const { target } = context;\n // adjust objects to account for new center\n target.forEachObject((object) => {\n object.group === target &&\n this.layoutObject(context, layoutResult, object);\n });\n // adjust clip path to account for new center\n context.strategy.shouldLayoutClipPath(context) &&\n this.layoutObject(context, layoutResult, target.clipPath as FabricObject);\n }\n\n /**\n * @param {FabricObject} object\n * @param {Point} offset\n */\n protected layoutObject(\n context: StrictLayoutContext,\n { offset }: Required,\n object: FabricObject,\n ) {\n // TODO: this is here for cache invalidation.\n // verify if this is necessary since we have explicit\n // cache invalidation at the end of commitLayout\n object.set({\n left: object.left + offset.x,\n top: object.top + offset.y,\n });\n }\n\n protected onAfterLayout(\n context: StrictLayoutContext,\n layoutResult?: LayoutResult,\n ) {\n const {\n target,\n strategy,\n bubbles,\n prevStrategy: _,\n ...bubblingContext\n } = context;\n const { canvas } = target;\n\n // fire layout event (event will fire only for layouts after initialization layout)\n target.fire('layout:after', {\n context,\n result: layoutResult,\n });\n canvas &&\n canvas.fire('object:layout:after', {\n context,\n result: layoutResult,\n target,\n });\n\n // bubble\n const parent = target.parent;\n if (bubbles && parent?.layoutManager) {\n // add target to context#path\n (bubblingContext.path || (bubblingContext.path = [])).push(target);\n // all parents should invalidate their layout\n parent.layoutManager.performLayout({\n ...bubblingContext,\n target: parent,\n });\n }\n target.set('dirty', true);\n }\n\n dispose() {\n const { _subscriptions } = this;\n _subscriptions.forEach((disposers) => disposers.forEach((d) => d()));\n _subscriptions.clear();\n }\n\n toObject() {\n return {\n type: LAYOUT_MANAGER,\n strategy: (this.strategy.constructor as typeof LayoutStrategy).type,\n };\n }\n\n toJSON() {\n return this.toObject();\n }\n}\n\nclassRegistry.setClass(LayoutManager, LAYOUT_MANAGER);\n","import type { CollectionEvents, ObjectEvents } from '../EventTypeDefs';\nimport { createCollectionMixin } from '../Collection';\nimport type {\n TClassProperties,\n TSVGReviver,\n TOptions,\n Abortable,\n} from '../typedefs';\nimport {\n invertTransform,\n multiplyTransformMatrices,\n} from '../util/misc/matrix';\nimport {\n enlivenObjectEnlivables,\n enlivenObjects,\n} from '../util/misc/objectEnlive';\nimport { applyTransformToObject } from '../util/misc/objectTransforms';\nimport { FabricObject } from './Object/FabricObject';\nimport { Rect } from './Rect';\nimport { classRegistry } from '../ClassRegistry';\nimport type { FabricObjectProps, SerializedObjectProps } from './Object/types';\nimport { log } from '../util/internals/console';\nimport type {\n ImperativeLayoutOptions,\n LayoutBeforeEvent,\n LayoutAfterEvent,\n} from '../LayoutManager/types';\nimport { LayoutManager } from '../LayoutManager/LayoutManager';\nimport {\n LAYOUT_TYPE_ADDED,\n LAYOUT_TYPE_IMPERATIVE,\n LAYOUT_TYPE_INITIALIZATION,\n LAYOUT_TYPE_REMOVED,\n} from '../LayoutManager/constants';\nimport type { SerializedLayoutManager } from '../LayoutManager/LayoutManager';\nimport type { FitContentLayout } from '../LayoutManager';\nimport type { DrawContext } from './Object/Object';\n\n/**\n * This class handles the specific case of creating a group using {@link Group#fromObject} and is not meant to be used in any other case.\n * We could have used a boolean in the constructor, as we did previously, but we think the boolean\n * would stay in the group's constructor interface and create confusion, therefore it was removed.\n * This layout manager doesn't do anything and therefore keeps the exact layout the group had when {@link Group#toObject} was called.\n */\nclass NoopLayoutManager extends LayoutManager {\n performLayout() {}\n}\n\nexport interface GroupEvents extends ObjectEvents, CollectionEvents {\n 'layout:before': LayoutBeforeEvent;\n 'layout:after': LayoutAfterEvent;\n}\n\nexport interface GroupOwnProps {\n subTargetCheck: boolean;\n interactive: boolean;\n}\n\nexport interface SerializedGroupProps\n extends SerializedObjectProps,\n GroupOwnProps {\n objects: SerializedObjectProps[];\n layoutManager: SerializedLayoutManager;\n}\n\nexport interface GroupProps extends FabricObjectProps, GroupOwnProps {\n layoutManager: LayoutManager;\n}\n\nexport const groupDefaultValues: Partial> = {\n strokeWidth: 0,\n subTargetCheck: false,\n interactive: false,\n};\n\n/**\n * @fires object:added\n * @fires object:removed\n * @fires layout:before\n * @fires layout:after\n */\nexport class Group\n extends createCollectionMixin(\n FabricObject,\n )\n implements GroupProps\n{\n /**\n * Used to optimize performance\n * set to `false` if you don't need contained objects to be targets of events\n * @type boolean\n */\n declare subTargetCheck: boolean;\n\n /**\n * Used to allow targeting of object inside groups.\n * set to true if you want to select an object inside a group.\\\n * **REQUIRES** `subTargetCheck` set to true\n * This will be not removed but slowly replaced with a method setInteractive\n * that will take care of enabling subTargetCheck and necessary object events.\n * There is too much attached to group interactivity to just be evaluated by a\n * boolean in the code\n * @deprecated\n * @type boolean\n */\n declare interactive: boolean;\n\n declare layoutManager: LayoutManager;\n\n /**\n * Used internally to optimize performance\n * Once an object is selected, instance is rendered without the selected object.\n * This way instance is cached only once for the entire interaction with the selected object.\n * @private\n */\n protected _activeObjects: FabricObject[] = [];\n\n static type = 'Group';\n\n static ownDefaults: Record = groupDefaultValues;\n private __objectSelectionTracker: (ev: ObjectEvents['selected']) => void;\n private __objectSelectionDisposer: (ev: ObjectEvents['deselected']) => void;\n\n static getDefaults(): Record {\n return {\n ...super.getDefaults(),\n ...Group.ownDefaults,\n };\n }\n\n /**\n * Constructor\n *\n * @param {FabricObject[]} [objects] instance objects\n * @param {Object} [options] Options object\n */\n constructor(objects: FabricObject[] = [], options: Partial = {}) {\n super();\n Object.assign(this, Group.ownDefaults);\n this.setOptions(options);\n this.groupInit(objects, options);\n }\n\n /**\n * Shared code between group and active selection\n * Meant to be used by the constructor.\n */\n protected groupInit(\n objects: FabricObject[],\n options: {\n layoutManager?: LayoutManager;\n top?: number;\n left?: number;\n },\n ) {\n this._objects = [...objects]; // Avoid unwanted mutations of Collection to affect the caller\n\n this.__objectSelectionTracker = this.__objectSelectionMonitor.bind(\n this,\n true,\n );\n this.__objectSelectionDisposer = this.__objectSelectionMonitor.bind(\n this,\n false,\n );\n\n this.forEachObject((object) => {\n this.enterGroup(object, false);\n });\n\n // perform initial layout\n this.layoutManager = options.layoutManager ?? new LayoutManager();\n this.layoutManager.performLayout({\n type: LAYOUT_TYPE_INITIALIZATION,\n target: this,\n targets: [...objects],\n // @TODO remove this concept from the layout manager.\n // Layout manager will calculate the correct position,\n // group options can override it later.\n x: options.left,\n y: options.top,\n });\n }\n\n /**\n * Checks if object can enter group and logs relevant warnings\n * @private\n * @param {FabricObject} object\n * @returns\n */\n canEnterGroup(object: FabricObject) {\n if (object === this || this.isDescendantOf(object)) {\n // prevent circular object tree\n log(\n 'error',\n 'Group: circular object trees are not supported, this call has no effect',\n );\n return false;\n } else if (this._objects.indexOf(object) !== -1) {\n // is already in the objects array\n log(\n 'error',\n 'Group: duplicate objects are not supported inside group, this call has no effect',\n );\n return false;\n }\n return true;\n }\n\n /**\n * Override this method to enhance performance (for groups with a lot of objects).\n * If Overriding, be sure not pass illegal objects to group - it will break your app.\n * @private\n */\n protected _filterObjectsBeforeEnteringGroup(objects: FabricObject[]) {\n return objects.filter((object, index, array) => {\n // can enter AND is the first occurrence of the object in the passed args (to prevent adding duplicates)\n return this.canEnterGroup(object) && array.indexOf(object) === index;\n });\n }\n\n /**\n * Add objects\n * @param {...FabricObject[]} objects\n */\n add(...objects: FabricObject[]) {\n const allowedObjects = this._filterObjectsBeforeEnteringGroup(objects);\n const size = super.add(...allowedObjects);\n this._onAfterObjectsChange(LAYOUT_TYPE_ADDED, allowedObjects);\n return size;\n }\n\n /**\n * Inserts an object into collection at specified index\n * @param {FabricObject[]} objects Object to insert\n * @param {Number} index Index to insert object at\n */\n insertAt(index: number, ...objects: FabricObject[]) {\n const allowedObjects = this._filterObjectsBeforeEnteringGroup(objects);\n const size = super.insertAt(index, ...allowedObjects);\n this._onAfterObjectsChange(LAYOUT_TYPE_ADDED, allowedObjects);\n return size;\n }\n\n /**\n * Remove objects\n * @param {...FabricObject[]} objects\n * @returns {FabricObject[]} removed objects\n */\n remove(...objects: FabricObject[]) {\n const removed = super.remove(...objects);\n this._onAfterObjectsChange(LAYOUT_TYPE_REMOVED, removed);\n return removed;\n }\n\n _onObjectAdded(object: FabricObject) {\n this.enterGroup(object, true);\n this.fire('object:added', { target: object });\n object.fire('added', { target: this });\n }\n\n /**\n * @private\n * @param {FabricObject} object\n * @param {boolean} [removeParentTransform] true if object should exit group without applying group's transform to it\n */\n _onObjectRemoved(object: FabricObject, removeParentTransform?: boolean) {\n this.exitGroup(object, removeParentTransform);\n this.fire('object:removed', { target: object });\n object.fire('removed', { target: this });\n }\n\n /**\n * @private\n * @param {'added'|'removed'} type\n * @param {FabricObject[]} targets\n */\n _onAfterObjectsChange(type: 'added' | 'removed', targets: FabricObject[]) {\n this.layoutManager.performLayout({\n type,\n targets,\n target: this,\n });\n }\n\n _onStackOrderChanged() {\n this._set('dirty', true);\n }\n\n /**\n * @private\n * @param {string} key\n * @param {*} value\n */\n _set(key: string, value: any) {\n const prev = this[key as keyof this];\n super._set(key, value);\n if (key === 'canvas' && prev !== value) {\n (this._objects || []).forEach((object) => {\n object._set(key, value);\n });\n }\n return this;\n }\n\n /**\n * @private\n */\n _shouldSetNestedCoords() {\n return this.subTargetCheck;\n }\n\n /**\n * Remove all objects\n * @returns {FabricObject[]} removed objects\n */\n removeAll() {\n this._activeObjects = [];\n return this.remove(...this._objects);\n }\n\n /**\n * keeps track of the selected objects\n * @private\n */\n __objectSelectionMonitor(\n selected: T,\n {\n target: object,\n }: ObjectEvents[T extends true ? 'selected' : 'deselected'],\n ) {\n const activeObjects = this._activeObjects;\n if (selected) {\n activeObjects.push(object);\n this._set('dirty', true);\n } else if (activeObjects.length > 0) {\n const index = activeObjects.indexOf(object);\n if (index > -1) {\n activeObjects.splice(index, 1);\n this._set('dirty', true);\n }\n }\n }\n\n /**\n * @private\n * @param {boolean} watch\n * @param {FabricObject} object\n */\n _watchObject(watch: boolean, object: FabricObject) {\n // make sure we listen only once\n watch && this._watchObject(false, object);\n if (watch) {\n object.on('selected', this.__objectSelectionTracker);\n object.on('deselected', this.__objectSelectionDisposer);\n } else {\n object.off('selected', this.__objectSelectionTracker);\n object.off('deselected', this.__objectSelectionDisposer);\n }\n }\n\n /**\n * @private\n * @param {FabricObject} object\n * @param {boolean} [removeParentTransform] true if object is in canvas coordinate plane\n */\n enterGroup(object: FabricObject, removeParentTransform?: boolean) {\n object.group && object.group.remove(object);\n object._set('parent', this);\n this._enterGroup(object, removeParentTransform);\n }\n\n /**\n * @private\n * @param {FabricObject} object\n * @param {boolean} [removeParentTransform] true if object is in canvas coordinate plane\n */\n _enterGroup(object: FabricObject, removeParentTransform?: boolean) {\n if (removeParentTransform) {\n // can this be converted to utils (sendObjectToPlane)?\n applyTransformToObject(\n object,\n multiplyTransformMatrices(\n invertTransform(this.calcTransformMatrix()),\n object.calcTransformMatrix(),\n ),\n );\n }\n this._shouldSetNestedCoords() && object.setCoords();\n object._set('group', this);\n object._set('canvas', this.canvas);\n this._watchObject(true, object);\n const activeObject =\n this.canvas &&\n this.canvas.getActiveObject &&\n this.canvas.getActiveObject();\n // if we are adding the activeObject in a group\n if (\n activeObject &&\n (activeObject === object || object.isDescendantOf(activeObject))\n ) {\n this._activeObjects.push(object);\n }\n }\n\n /**\n * @private\n * @param {FabricObject} object\n * @param {boolean} [removeParentTransform] true if object should exit group without applying group's transform to it\n */\n exitGroup(object: FabricObject, removeParentTransform?: boolean) {\n this._exitGroup(object, removeParentTransform);\n object._set('parent', undefined);\n object._set('canvas', undefined);\n }\n\n /**\n * Executes the inner fabric logic of exiting a group.\n * - Stop watching the object\n * - Remove the object from the optimization map this._activeObjects\n * - unset the group property of the object\n * @protected\n * @param {FabricObject} object\n * @param {boolean} [removeParentTransform] true if object should exit group without applying group's transform to it\n */\n _exitGroup(object: FabricObject, removeParentTransform?: boolean) {\n object._set('group', undefined);\n if (!removeParentTransform) {\n applyTransformToObject(\n object,\n multiplyTransformMatrices(\n this.calcTransformMatrix(),\n object.calcTransformMatrix(),\n ),\n );\n object.setCoords();\n }\n this._watchObject(false, object);\n const index =\n this._activeObjects.length > 0 ? this._activeObjects.indexOf(object) : -1;\n if (index > -1) {\n this._activeObjects.splice(index, 1);\n }\n }\n\n /**\n * Decide if the group should cache or not. Create its own cache level\n * needsItsOwnCache should be used when the object drawing method requires\n * a cache step.\n * Generally you do not cache objects in groups because the group is already cached.\n * @return {Boolean}\n */\n shouldCache() {\n const ownCache = FabricObject.prototype.shouldCache.call(this);\n if (ownCache) {\n for (let i = 0; i < this._objects.length; i++) {\n if (this._objects[i].willDrawShadow()) {\n this.ownCaching = false;\n return false;\n }\n }\n }\n return ownCache;\n }\n\n /**\n * Check if this object or a child object will cast a shadow\n * @return {Boolean}\n */\n willDrawShadow() {\n if (super.willDrawShadow()) {\n return true;\n }\n for (let i = 0; i < this._objects.length; i++) {\n if (this._objects[i].willDrawShadow()) {\n return true;\n }\n }\n return false;\n }\n\n /**\n * Check if instance or its group are caching, recursively up\n * @return {Boolean}\n */\n isOnACache(): boolean {\n return this.ownCaching || (!!this.parent && this.parent.isOnACache());\n }\n\n /**\n * Execute the drawing operation for an object on a specified context\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n drawObject(\n ctx: CanvasRenderingContext2D,\n forClipping: boolean | undefined,\n context: DrawContext,\n ) {\n this._renderBackground(ctx);\n for (let i = 0; i < this._objects.length; i++) {\n const obj = this._objects[i];\n // TODO: handle rendering edge case somehow\n if (this.canvas?.preserveObjectStacking && obj.group !== this) {\n ctx.save();\n ctx.transform(...invertTransform(this.calcTransformMatrix()));\n obj.render(ctx);\n ctx.restore();\n } else if (obj.group === this) {\n obj.render(ctx);\n }\n }\n this._drawClipPath(ctx, this.clipPath, context);\n }\n\n /**\n * @override\n * @return {Boolean}\n */\n setCoords() {\n super.setCoords();\n this._shouldSetNestedCoords() &&\n this.forEachObject((object) => object.setCoords());\n }\n\n triggerLayout(options: ImperativeLayoutOptions = {}) {\n this.layoutManager.performLayout({\n target: this,\n type: LAYOUT_TYPE_IMPERATIVE,\n ...options,\n });\n }\n\n /**\n * Renders instance on a given context\n * @param {CanvasRenderingContext2D} ctx context to render instance on\n */\n render(ctx: CanvasRenderingContext2D) {\n this._transformDone = true;\n super.render(ctx);\n this._transformDone = false;\n }\n\n /**\n *\n * @private\n * @param {'toObject'|'toDatalessObject'} [method]\n * @param {string[]} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @returns {FabricObject[]} serialized objects\n */\n __serializeObjects(\n method: 'toObject' | 'toDatalessObject',\n propertiesToInclude?: string[],\n ) {\n const _includeDefaultValues = this.includeDefaultValues;\n return this._objects\n .filter(function (obj) {\n return !obj.excludeFromExport;\n })\n .map(function (obj) {\n const originalDefaults = obj.includeDefaultValues;\n obj.includeDefaultValues = _includeDefaultValues;\n const data = obj[method || 'toObject'](propertiesToInclude);\n obj.includeDefaultValues = originalDefaults;\n // delete data.version;\n return data;\n });\n }\n\n /**\n * Returns object representation of an instance\n * @param {string[]} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} object representation of an instance\n */\n toObject<\n T extends Omit<\n GroupProps & TClassProperties,\n keyof SerializedGroupProps\n >,\n K extends keyof T = never,\n >(propertiesToInclude: K[] = []): Pick & SerializedGroupProps {\n const layoutManager = this.layoutManager.toObject();\n\n return {\n ...super.toObject([\n 'subTargetCheck',\n 'interactive',\n ...propertiesToInclude,\n ]),\n ...(layoutManager.strategy !== 'fit-content' || this.includeDefaultValues\n ? { layoutManager }\n : {}),\n objects: this.__serializeObjects(\n 'toObject',\n propertiesToInclude as string[],\n ),\n };\n }\n\n toString() {\n return `#`;\n }\n\n dispose() {\n this.layoutManager.unsubscribeTargets({\n targets: this.getObjects(),\n target: this,\n });\n this._activeObjects = [];\n this.forEachObject((object) => {\n this._watchObject(false, object);\n object.dispose();\n });\n super.dispose();\n }\n\n /**\n * @private\n */\n _createSVGBgRect(reviver?: TSVGReviver) {\n if (!this.backgroundColor) {\n return '';\n }\n const fillStroke = Rect.prototype._toSVG.call(this);\n const commons = fillStroke.indexOf('COMMON_PARTS');\n fillStroke[commons] = 'for=\"group\" ';\n const markup = fillStroke.join('');\n return reviver ? reviver(markup) : markup;\n }\n\n /**\n * Returns svg representation of an instance\n * @param {TSVGReviver} [reviver] Method for further parsing of svg representation.\n * @return {String} svg representation of an instance\n */\n _toSVG(reviver?: TSVGReviver) {\n const svgString = ['\\n'];\n const bg = this._createSVGBgRect(reviver);\n bg && svgString.push('\\t\\t', bg);\n for (let i = 0; i < this._objects.length; i++) {\n svgString.push('\\t\\t', this._objects[i].toSVG(reviver));\n }\n svgString.push('\\n');\n return svgString;\n }\n\n /**\n * Returns styles-string for svg-export, specific version for group\n * @return {String}\n */\n getSvgStyles(): string {\n const opacity =\n typeof this.opacity !== 'undefined' && this.opacity !== 1\n ? `opacity: ${this.opacity};`\n : '',\n visibility = this.visible ? '' : ' visibility: hidden;';\n return [opacity, this.getSvgFilter(), visibility].join('');\n }\n\n /**\n * Returns svg clipPath representation of an instance\n * @param {Function} [reviver] Method for further parsing of svg representation.\n * @return {String} svg representation of an instance\n */\n toClipPathSVG(reviver?: TSVGReviver): string {\n const svgString = [];\n const bg = this._createSVGBgRect(reviver);\n bg && svgString.push('\\t', bg);\n for (let i = 0; i < this._objects.length; i++) {\n svgString.push('\\t', this._objects[i].toClipPathSVG(reviver));\n }\n return this._createBaseClipPathSVGMarkup(svgString, {\n reviver,\n });\n }\n\n /**\n * @todo support loading from svg\n * @private\n * @param {Object} object Object to create a group from\n * @returns {Promise}\n */\n static fromObject>(\n { type, objects = [], layoutManager, ...options }: T,\n abortable?: Abortable,\n ) {\n return Promise.all([\n enlivenObjects(objects, abortable),\n enlivenObjectEnlivables(options, abortable),\n ]).then(([objects, hydratedOptions]) => {\n const group = new this(objects, {\n ...options,\n ...hydratedOptions,\n layoutManager: new NoopLayoutManager(),\n });\n if (layoutManager) {\n const layoutClass = classRegistry.getClass(\n layoutManager.type,\n );\n const strategyClass = classRegistry.getClass(\n layoutManager.strategy,\n );\n group.layoutManager = new layoutClass(new strategyClass());\n } else {\n group.layoutManager = new LayoutManager();\n }\n group.layoutManager.subscribeTargets({\n type: LAYOUT_TYPE_INITIALIZATION,\n target: group,\n targets: group.getObjects(),\n });\n group.setCoords();\n return group;\n });\n }\n}\n\nclassRegistry.setClass(Group);\n","import type { GroupProps } from '../../shapes/Group';\nimport { Group } from '../../shapes/Group';\nimport type { FabricObject } from '../../shapes/Object/FabricObject';\n\n/**\n * TODO experiment with different layout manager and svg results ( fixed fit content )\n * Groups SVG elements (usually those retrieved from SVG document)\n * @param {FabricObject[]} elements FabricObject(s) parsed from svg, to group\n * @return {FabricObject | Group}\n */\nexport const groupSVGElements = (\n elements: FabricObject[],\n options?: Partial,\n) => {\n if (elements && elements.length === 1) {\n return elements[0];\n }\n return new Group(elements, options);\n};\n","import type { TSize } from '../../typedefs';\n\n/**\n * Finds the scale for the object source to fit inside the object destination,\n * keeping aspect ratio intact.\n * respect the total allowed area for the cache.\n * @param {TSize} source natural unscaled size of the object\n * @param {TSize} destination natural unscaled size of the object\n * @return {Number} scale factor to apply to source to fit into destination\n */\nexport const findScaleToFit = (source: TSize, destination: TSize) =>\n Math.min(\n destination.width / source.width,\n destination.height / source.height,\n );\n\n/**\n * Finds the scale for the object source to cover entirely the object destination,\n * keeping aspect ratio intact.\n * respect the total allowed area for the cache.\n * @param {TSize} source natural unscaled size of the object\n * @param {TSize} destination natural unscaled size of the object\n * @return {Number} scale factor to apply to source to cover destination\n */\nexport const findScaleToCover = (source: TSize, destination: TSize) =>\n Math.max(\n destination.width / source.width,\n destination.height / source.height,\n );\n","import { reNum } from '../../parser/constants';\n\nconst commaWsp = `\\\\s*,?\\\\s*`;\n\n/**\n * p for param\n * using \"bad naming\" here because it makes the regex much easier to read\n * p is a number that is preceded by an arbitary number of spaces, maybe 0,\n * a comma or not, and then possibly more spaces or not.\n */\nconst p = `${commaWsp}(${reNum})`;\n\n// const reMoveToCommand = `(M) ?(?:${p}${p} ?)+`;\n\n// const reLineCommand = `(L) ?(?:${p}${p} ?)+`;\n\n// const reHorizontalLineCommand = `(H) ?(?:${p} ?)+`;\n\n// const reVerticalLineCommand = `(V) ?(?:${p} ?)+`;\n\n// const reClosePathCommand = String.raw`(Z)\\s*`;\n\n// const reCubicCurveCommand = `(C) ?(?:${p}${p}${p}${p}${p}${p} ?)+`;\n\n// const reCubicCurveShortcutCommand = `(S) ?(?:${p}${p}${p}${p} ?)+`;\n\n// const reQuadraticCurveCommand = `(Q) ?(?:${p}${p}${p}${p} ?)+`;\n\n// const reQuadraticCurveShortcutCommand = `(T) ?(?:${p}${p} ?)+`;\n\nexport const reArcCommandPoints = `${p}${p}${p}${commaWsp}([01])${commaWsp}([01])${p}${p}`;\n// const reArcCommand = `(A) ?(?:${reArcCommandPoints} ?)+`;\n\n// export const rePathCommandGroups =\n// `(?:(?:${reMoveToCommand})` +\n// `|(?:${reLineCommand})` +\n// `|(?:${reHorizontalLineCommand})` +\n// `|(?:${reVerticalLineCommand})` +\n// `|(?:${reClosePathCommand})` +\n// `|(?:${reCubicCurveCommand})` +\n// `|(?:${reCubicCurveShortcutCommand})` +\n// `|(?:${reQuadraticCurveCommand})` +\n// `|(?:${reQuadraticCurveShortcutCommand})` +\n// `|(?:${reArcCommand}))`;\n\nexport const rePathCommand = '[mzlhvcsqta][^mzlhvcsqta]*';\n","import { cache } from '../../cache';\nimport { config } from '../../config';\nimport { halfPI, PiBy180 } from '../../constants';\nimport type { TMat2D, TRadian, TRectBounds } from '../../typedefs';\nimport { cos } from '../misc/cos';\nimport { multiplyTransformMatrices, transformPoint } from '../misc/matrix';\nimport { sin } from '../misc/sin';\nimport { toFixed } from '../misc/toFixed';\nimport type {\n TCurveInfo,\n TComplexPathData,\n TParsedAbsoluteCubicCurveCommand,\n TPathSegmentInfo,\n TPointAngle,\n TSimpleParsedCommand,\n TSimplePathData,\n TPathSegmentCommandInfo,\n TComplexParsedCommand,\n TPathSegmentInfoCommon,\n TEndPathInfo,\n TParsedArcCommand,\n TComplexParsedCommandType,\n} from './typedefs';\nimport type { XY } from '../../Point';\nimport { Point } from '../../Point';\nimport { reArcCommandPoints, rePathCommand } from './regex';\nimport { reNum } from '../../parser/constants';\n\n/**\n * Commands that may be repeated\n */\nconst repeatedCommands: Record = {\n m: 'l',\n M: 'L',\n};\n\n/**\n * Convert an arc of a rotated ellipse to a Bezier Curve\n * @param {TRadian} theta1 start of the arc\n * @param {TRadian} theta2 end of the arc\n * @param cosTh cosine of the angle of rotation\n * @param sinTh sine of the angle of rotation\n * @param rx x-axis radius (before rotation)\n * @param ry y-axis radius (before rotation)\n * @param cx1 center x of the ellipse\n * @param cy1 center y of the ellipse\n * @param mT\n * @param fromX starting point of arc x\n * @param fromY starting point of arc y\n */\nconst segmentToBezier = (\n theta1: TRadian,\n theta2: TRadian,\n cosTh: number,\n sinTh: number,\n rx: number,\n ry: number,\n cx1: number,\n cy1: number,\n mT: number,\n fromX: number,\n fromY: number,\n): TParsedAbsoluteCubicCurveCommand => {\n const costh1 = cos(theta1),\n sinth1 = sin(theta1),\n costh2 = cos(theta2),\n sinth2 = sin(theta2),\n toX = cosTh * rx * costh2 - sinTh * ry * sinth2 + cx1,\n toY = sinTh * rx * costh2 + cosTh * ry * sinth2 + cy1,\n cp1X = fromX + mT * (-cosTh * rx * sinth1 - sinTh * ry * costh1),\n cp1Y = fromY + mT * (-sinTh * rx * sinth1 + cosTh * ry * costh1),\n cp2X = toX + mT * (cosTh * rx * sinth2 + sinTh * ry * costh2),\n cp2Y = toY + mT * (sinTh * rx * sinth2 - cosTh * ry * costh2);\n\n return ['C', cp1X, cp1Y, cp2X, cp2Y, toX, toY];\n};\n\n/**\n * Adapted from {@link http://dxr.mozilla.org/mozilla-central/source/dom/svg/SVGPathDataParser.cpp}\n * by Andrea Bogazzi code is under MPL. if you don't have a copy of the license you can take it here\n * http://mozilla.org/MPL/2.0/\n * @param toX\n * @param toY\n * @param rx\n * @param ry\n * @param {number} large 0 or 1 flag\n * @param {number} sweep 0 or 1 flag\n * @param rotateX\n */\nconst arcToSegments = (\n toX: number,\n toY: number,\n rx: number,\n ry: number,\n large: number,\n sweep: number,\n rotateX: TRadian,\n): TParsedAbsoluteCubicCurveCommand[] => {\n if (rx === 0 || ry === 0) {\n return [];\n }\n let fromX = 0,\n fromY = 0,\n root = 0;\n const PI = Math.PI,\n theta = rotateX * PiBy180,\n sinTheta = sin(theta),\n cosTh = cos(theta),\n px = 0.5 * (-cosTh * toX - sinTheta * toY),\n py = 0.5 * (-cosTh * toY + sinTheta * toX),\n rx2 = rx ** 2,\n ry2 = ry ** 2,\n py2 = py ** 2,\n px2 = px ** 2,\n pl = rx2 * ry2 - rx2 * py2 - ry2 * px2;\n let _rx = Math.abs(rx);\n let _ry = Math.abs(ry);\n\n if (pl < 0) {\n const s = Math.sqrt(1 - pl / (rx2 * ry2));\n _rx *= s;\n _ry *= s;\n } else {\n root =\n (large === sweep ? -1.0 : 1.0) * Math.sqrt(pl / (rx2 * py2 + ry2 * px2));\n }\n\n const cx = (root * _rx * py) / _ry,\n cy = (-root * _ry * px) / _rx,\n cx1 = cosTh * cx - sinTheta * cy + toX * 0.5,\n cy1 = sinTheta * cx + cosTh * cy + toY * 0.5;\n let mTheta = calcVectorAngle(1, 0, (px - cx) / _rx, (py - cy) / _ry);\n let dtheta = calcVectorAngle(\n (px - cx) / _rx,\n (py - cy) / _ry,\n (-px - cx) / _rx,\n (-py - cy) / _ry,\n );\n\n if (sweep === 0 && dtheta > 0) {\n dtheta -= 2 * PI;\n } else if (sweep === 1 && dtheta < 0) {\n dtheta += 2 * PI;\n }\n\n // Convert into cubic bezier segments <= 90deg\n const segments = Math.ceil(Math.abs((dtheta / PI) * 2)),\n result = [],\n mDelta = dtheta / segments,\n mT =\n ((8 / 3) * Math.sin(mDelta / 4) * Math.sin(mDelta / 4)) /\n Math.sin(mDelta / 2);\n let th3 = mTheta + mDelta;\n\n for (let i = 0; i < segments; i++) {\n result[i] = segmentToBezier(\n mTheta,\n th3,\n cosTh,\n sinTheta,\n _rx,\n _ry,\n cx1,\n cy1,\n mT,\n fromX,\n fromY,\n );\n fromX = result[i][5];\n fromY = result[i][6];\n mTheta = th3;\n th3 += mDelta;\n }\n return result;\n};\n\n/**\n * @private\n * Calculate the angle between two vectors\n * @param ux u endpoint x\n * @param uy u endpoint y\n * @param vx v endpoint x\n * @param vy v endpoint y\n */\nconst calcVectorAngle = (\n ux: number,\n uy: number,\n vx: number,\n vy: number,\n): TRadian => {\n const ta = Math.atan2(uy, ux),\n tb = Math.atan2(vy, vx);\n if (tb >= ta) {\n return tb - ta;\n } else {\n return 2 * Math.PI - (ta - tb);\n }\n};\n\n// functions for the Cubic beizer\n// taken from: https://github.com/konvajs/konva/blob/7.0.5/src/shapes/Path.ts#L350\nconst CB1 = (t: number) => t ** 3;\nconst CB2 = (t: number) => 3 * t ** 2 * (1 - t);\nconst CB3 = (t: number) => 3 * t * (1 - t) ** 2;\nconst CB4 = (t: number) => (1 - t) ** 3;\n\n/**\n * Calculate bounding box of a cubic Bezier curve\n * Taken from http://jsbin.com/ivomiq/56/edit (no credits available)\n * TODO: can we normalize this with the starting points set at 0 and then translated the bbox?\n * @param {number} begx starting point\n * @param {number} begy\n * @param {number} cp1x first control point\n * @param {number} cp1y\n * @param {number} cp2x second control point\n * @param {number} cp2y\n * @param {number} endx end of bezier\n * @param {number} endy\n * @return {TRectBounds} the rectangular bounds\n */\nexport function getBoundsOfCurve(\n begx: number,\n begy: number,\n cp1x: number,\n cp1y: number,\n cp2x: number,\n cp2y: number,\n endx: number,\n endy: number,\n): TRectBounds {\n let argsString: string;\n if (config.cachesBoundsOfCurve) {\n // eslint-disable-next-line\n argsString = [...arguments].join();\n if (cache.boundsOfCurveCache[argsString]) {\n return cache.boundsOfCurveCache[argsString];\n }\n }\n\n const sqrt = Math.sqrt,\n abs = Math.abs,\n tvalues = [],\n bounds: [[x: number, y: number], [x: number, y: number]] = [\n [0, 0],\n [0, 0],\n ];\n\n let b = 6 * begx - 12 * cp1x + 6 * cp2x;\n let a = -3 * begx + 9 * cp1x - 9 * cp2x + 3 * endx;\n let c = 3 * cp1x - 3 * begx;\n\n for (let i = 0; i < 2; ++i) {\n if (i > 0) {\n b = 6 * begy - 12 * cp1y + 6 * cp2y;\n a = -3 * begy + 9 * cp1y - 9 * cp2y + 3 * endy;\n c = 3 * cp1y - 3 * begy;\n }\n\n if (abs(a) < 1e-12) {\n if (abs(b) < 1e-12) {\n continue;\n }\n const t = -c / b;\n if (0 < t && t < 1) {\n tvalues.push(t);\n }\n continue;\n }\n const b2ac = b * b - 4 * c * a;\n if (b2ac < 0) {\n continue;\n }\n const sqrtb2ac = sqrt(b2ac);\n const t1 = (-b + sqrtb2ac) / (2 * a);\n if (0 < t1 && t1 < 1) {\n tvalues.push(t1);\n }\n const t2 = (-b - sqrtb2ac) / (2 * a);\n if (0 < t2 && t2 < 1) {\n tvalues.push(t2);\n }\n }\n\n let j = tvalues.length;\n const jlen = j;\n const iterator = getPointOnCubicBezierIterator(\n begx,\n begy,\n cp1x,\n cp1y,\n cp2x,\n cp2y,\n endx,\n endy,\n );\n while (j--) {\n const { x, y } = iterator(tvalues[j]);\n bounds[0][j] = x;\n bounds[1][j] = y;\n }\n\n bounds[0][jlen] = begx;\n bounds[1][jlen] = begy;\n bounds[0][jlen + 1] = endx;\n bounds[1][jlen + 1] = endy;\n const result: TRectBounds = [\n new Point(Math.min(...bounds[0]), Math.min(...bounds[1])),\n new Point(Math.max(...bounds[0]), Math.max(...bounds[1])),\n ];\n if (config.cachesBoundsOfCurve) {\n cache.boundsOfCurveCache[argsString!] = result;\n }\n return result;\n}\n\n/**\n * Converts arc to a bunch of cubic Bezier curves\n * @param {number} fx starting point x\n * @param {number} fy starting point y\n * @param {TParsedArcCommand} coords Arc command\n */\nexport const fromArcToBeziers = (\n fx: number,\n fy: number,\n [_, rx, ry, rot, large, sweep, tx, ty]: TParsedArcCommand,\n): TParsedAbsoluteCubicCurveCommand[] => {\n const segsNorm = arcToSegments(tx - fx, ty - fy, rx, ry, large, sweep, rot);\n\n for (let i = 0, len = segsNorm.length; i < len; i++) {\n segsNorm[i][1] += fx;\n segsNorm[i][2] += fy;\n segsNorm[i][3] += fx;\n segsNorm[i][4] += fy;\n segsNorm[i][5] += fx;\n segsNorm[i][6] += fy;\n }\n return segsNorm;\n};\n\n/**\n * This function takes a parsed SVG path and makes it simpler for fabricJS logic.\n * Simplification consist of:\n * - All commands converted to absolute (lowercase to uppercase)\n * - S converted to C\n * - T converted to Q\n * - A converted to C\n * @param {TComplexPathData} path the array of commands of a parsed SVG path for `Path`\n * @return {TSimplePathData} the simplified array of commands of a parsed SVG path for `Path`\n * TODO: figure out how to remove the type assertions in a nice way\n */\nexport const makePathSimpler = (path: TComplexPathData): TSimplePathData => {\n // x and y represent the last point of the path, AKA the previous command point.\n // we add them to each relative command to make it an absolute comment.\n // we also swap the v V h H with L, because are easier to transform.\n let x = 0,\n y = 0;\n // x1 and y1 represent the last point of the subpath. the subpath is started with\n // m or M command. When a z or Z command is drawn, x and y need to be resetted to\n // the last x1 and y1.\n let x1 = 0,\n y1 = 0;\n // previous will host the letter of the previous command, to handle S and T.\n // controlX and controlY will host the previous reflected control point\n const destinationPath: TSimplePathData = [];\n let previous,\n // placeholders\n controlX = 0,\n controlY = 0;\n for (const parsedCommand of path) {\n const current: TComplexParsedCommand = [...parsedCommand];\n let converted: TSimpleParsedCommand | undefined;\n switch (\n current[0] // first letter\n ) {\n case 'l': // lineto, relative\n current[1] += x;\n current[2] += y;\n // falls through\n case 'L':\n x = current[1];\n y = current[2];\n converted = ['L', x, y];\n break;\n case 'h': // horizontal lineto, relative\n current[1] += x;\n // falls through\n case 'H':\n x = current[1];\n converted = ['L', x, y];\n break;\n case 'v': // vertical lineto, relative\n current[1] += y;\n // falls through\n case 'V':\n y = current[1];\n converted = ['L', x, y];\n break;\n case 'm': // moveTo, relative\n current[1] += x;\n current[2] += y;\n // falls through\n case 'M':\n x = current[1];\n y = current[2];\n x1 = current[1];\n y1 = current[2];\n converted = ['M', x, y];\n break;\n case 'c': // bezierCurveTo, relative\n current[1] += x;\n current[2] += y;\n current[3] += x;\n current[4] += y;\n current[5] += x;\n current[6] += y;\n // falls through\n case 'C':\n controlX = current[3];\n controlY = current[4];\n x = current[5];\n y = current[6];\n converted = ['C', current[1], current[2], controlX, controlY, x, y];\n break;\n case 's': // shorthand cubic bezierCurveTo, relative\n current[1] += x;\n current[2] += y;\n current[3] += x;\n current[4] += y;\n // falls through\n case 'S':\n // would be sScC but since we are swapping sSc for C, we check just that.\n if (previous === 'C') {\n // calculate reflection of previous control points\n controlX = 2 * x - controlX;\n controlY = 2 * y - controlY;\n } else {\n // If there is no previous command or if the previous command was not a C, c, S, or s,\n // the control point is coincident with the current point\n controlX = x;\n controlY = y;\n }\n x = current[3];\n y = current[4];\n converted = ['C', controlX, controlY, current[1], current[2], x, y];\n // converted[3] and converted[4] are NOW the second control point.\n // we keep it for the next reflection.\n controlX = converted[3];\n controlY = converted[4];\n break;\n case 'q': // quadraticCurveTo, relative\n current[1] += x;\n current[2] += y;\n current[3] += x;\n current[4] += y;\n // falls through\n case 'Q':\n controlX = current[1];\n controlY = current[2];\n x = current[3];\n y = current[4];\n converted = ['Q', controlX, controlY, x, y];\n break;\n case 't': // shorthand quadraticCurveTo, relative\n current[1] += x;\n current[2] += y;\n // falls through\n case 'T':\n if (previous === 'Q') {\n // calculate reflection of previous control point\n controlX = 2 * x - controlX;\n controlY = 2 * y - controlY;\n } else {\n // If there is no previous command or if the previous command was not a Q, q, T or t,\n // assume the control point is coincident with the current point\n controlX = x;\n controlY = y;\n }\n x = current[1];\n y = current[2];\n converted = ['Q', controlX, controlY, x, y];\n break;\n case 'a':\n current[6] += x;\n current[7] += y;\n // falls through\n case 'A':\n fromArcToBeziers(x, y, current).forEach((b) => destinationPath.push(b));\n x = current[6];\n y = current[7];\n break;\n case 'z':\n case 'Z':\n x = x1;\n y = y1;\n converted = ['Z'];\n break;\n default:\n }\n if (converted) {\n destinationPath.push(converted);\n previous = converted[0];\n } else {\n previous = '';\n }\n }\n return destinationPath;\n};\n\n// todo verify if we can just use the point class here\n/**\n * Calc length from point x1,y1 to x2,y2\n * @param {number} x1 starting point x\n * @param {number} y1 starting point y\n * @param {number} x2 starting point x\n * @param {number} y2 starting point y\n * @return {number} length of segment\n */\nconst calcLineLength = (\n x1: number,\n y1: number,\n x2: number,\n y2: number,\n): number => Math.sqrt((x2 - x1) ** 2 + (y2 - y1) ** 2);\n\n/**\n * Get an iterator that takes a percentage and returns a point\n * @param {number} begx\n * @param {number} begy\n * @param {number} cp1x\n * @param {number} cp1y\n * @param {number} cp2x\n * @param {number} cp2y\n * @param {number} endx\n * @param {number} endy\n */\nconst getPointOnCubicBezierIterator =\n (\n begx: number,\n begy: number,\n cp1x: number,\n cp1y: number,\n cp2x: number,\n cp2y: number,\n endx: number,\n endy: number,\n ) =>\n (pct: number) => {\n const c1 = CB1(pct),\n c2 = CB2(pct),\n c3 = CB3(pct),\n c4 = CB4(pct);\n return new Point(\n endx * c1 + cp2x * c2 + cp1x * c3 + begx * c4,\n endy * c1 + cp2y * c2 + cp1y * c3 + begy * c4,\n );\n };\n\nconst QB1 = (t: number) => t ** 2;\nconst QB2 = (t: number) => 2 * t * (1 - t);\nconst QB3 = (t: number) => (1 - t) ** 2;\n\nconst getTangentCubicIterator =\n (\n p1x: number,\n p1y: number,\n p2x: number,\n p2y: number,\n p3x: number,\n p3y: number,\n p4x: number,\n p4y: number,\n ) =>\n (pct: number) => {\n const qb1 = QB1(pct),\n qb2 = QB2(pct),\n qb3 = QB3(pct),\n tangentX =\n 3 * (qb3 * (p2x - p1x) + qb2 * (p3x - p2x) + qb1 * (p4x - p3x)),\n tangentY =\n 3 * (qb3 * (p2y - p1y) + qb2 * (p3y - p2y) + qb1 * (p4y - p3y));\n return Math.atan2(tangentY, tangentX);\n };\n\nconst getPointOnQuadraticBezierIterator =\n (\n p1x: number,\n p1y: number,\n p2x: number,\n p2y: number,\n p3x: number,\n p3y: number,\n ) =>\n (pct: number) => {\n const c1 = QB1(pct),\n c2 = QB2(pct),\n c3 = QB3(pct);\n return new Point(\n p3x * c1 + p2x * c2 + p1x * c3,\n p3y * c1 + p2y * c2 + p1y * c3,\n );\n };\n\nconst getTangentQuadraticIterator =\n (\n p1x: number,\n p1y: number,\n p2x: number,\n p2y: number,\n p3x: number,\n p3y: number,\n ) =>\n (pct: number) => {\n const invT = 1 - pct,\n tangentX = 2 * (invT * (p2x - p1x) + pct * (p3x - p2x)),\n tangentY = 2 * (invT * (p2y - p1y) + pct * (p3y - p2y));\n return Math.atan2(tangentY, tangentX);\n };\n\n// this will run over a path segment (a cubic or quadratic segment) and approximate it\n// with 100 segments. This will good enough to calculate the length of the curve\nconst pathIterator = (\n iterator: (pct: number) => Point,\n x1: number,\n y1: number,\n) => {\n let tempP = new Point(x1, y1),\n tmpLen = 0;\n for (let perc = 1; perc <= 100; perc += 1) {\n const p = iterator(perc / 100);\n tmpLen += calcLineLength(tempP.x, tempP.y, p.x, p.y);\n tempP = p;\n }\n return tmpLen;\n};\n\n/**\n * Given a pathInfo, and a distance in pixels, find the percentage from 0 to 1\n * that correspond to that pixels run over the path.\n * The percentage will be then used to find the correct point on the canvas for the path.\n * @param {Array} segInfo fabricJS collection of information on a parsed path\n * @param {number} distance from starting point, in pixels.\n * @return {TPointAngle} info object with x and y ( the point on canvas ) and angle, the tangent on that point;\n */\nconst findPercentageForDistance = (\n segInfo: TCurveInfo<'Q' | 'C'>,\n distance: number,\n): TPointAngle => {\n let perc = 0,\n tmpLen = 0,\n tempP: XY = { x: segInfo.x, y: segInfo.y },\n p: XY = { ...tempP },\n nextLen: number,\n nextStep = 0.01,\n lastPerc = 0;\n // nextStep > 0.0001 covers 0.00015625 that 1/64th of 1/100\n // the path\n const iterator = segInfo.iterator,\n angleFinder = segInfo.angleFinder;\n while (tmpLen < distance && nextStep > 0.0001) {\n p = iterator(perc);\n lastPerc = perc;\n nextLen = calcLineLength(tempP.x, tempP.y, p.x, p.y);\n // compare tmpLen each cycle with distance, decide next perc to test.\n if (nextLen + tmpLen > distance) {\n // we discard this step and we make smaller steps.\n perc -= nextStep;\n nextStep /= 2;\n } else {\n tempP = p;\n perc += nextStep;\n tmpLen += nextLen;\n }\n }\n return { ...p, angle: angleFinder(lastPerc) };\n};\n\n/**\n * Run over a parsed and simplified path and extract some information (length of each command and starting point)\n * @param {TSimplePathData} path parsed path commands\n * @return {TPathSegmentInfo[]} path commands information\n */\nexport const getPathSegmentsInfo = (\n path: TSimplePathData,\n): TPathSegmentInfo[] => {\n let totalLength = 0,\n //x2 and y2 are the coords of segment start\n //x1 and y1 are the coords of the current point\n x1 = 0,\n y1 = 0,\n x2 = 0,\n y2 = 0,\n iterator,\n tempInfo: TPathSegmentInfo;\n const info: TPathSegmentInfo[] = [];\n for (const current of path) {\n const basicInfo: TPathSegmentInfoCommon = {\n x: x1,\n y: y1,\n command: current[0],\n length: 0,\n };\n switch (\n current[0] //first letter\n ) {\n case 'M':\n tempInfo = >basicInfo;\n tempInfo.x = x2 = x1 = current[1];\n tempInfo.y = y2 = y1 = current[2];\n break;\n case 'L':\n tempInfo = >basicInfo;\n tempInfo.length = calcLineLength(x1, y1, current[1], current[2]);\n x1 = current[1];\n y1 = current[2];\n break;\n case 'C':\n iterator = getPointOnCubicBezierIterator(\n x1,\n y1,\n current[1],\n current[2],\n current[3],\n current[4],\n current[5],\n current[6],\n );\n tempInfo = >basicInfo;\n tempInfo.iterator = iterator;\n tempInfo.angleFinder = getTangentCubicIterator(\n x1,\n y1,\n current[1],\n current[2],\n current[3],\n current[4],\n current[5],\n current[6],\n );\n tempInfo.length = pathIterator(iterator, x1, y1);\n\n x1 = current[5];\n y1 = current[6];\n break;\n case 'Q':\n iterator = getPointOnQuadraticBezierIterator(\n x1,\n y1,\n current[1],\n current[2],\n current[3],\n current[4],\n );\n tempInfo = >basicInfo;\n tempInfo.iterator = iterator;\n tempInfo.angleFinder = getTangentQuadraticIterator(\n x1,\n y1,\n current[1],\n current[2],\n current[3],\n current[4],\n );\n tempInfo.length = pathIterator(iterator, x1, y1);\n x1 = current[3];\n y1 = current[4];\n break;\n case 'Z':\n // we add those in order to ease calculations later\n tempInfo = basicInfo;\n tempInfo.destX = x2;\n tempInfo.destY = y2;\n tempInfo.length = calcLineLength(x1, y1, x2, y2);\n x1 = x2;\n y1 = y2;\n break;\n }\n totalLength += tempInfo.length;\n info.push(tempInfo);\n }\n info.push({ length: totalLength, x: x1, y: y1 });\n return info;\n};\n\n/**\n * Get the point on the path that is distance along the path\n * @param path\n * @param distance\n * @param infos\n */\nexport const getPointOnPath = (\n path: TSimplePathData,\n distance: number,\n infos: TPathSegmentInfo[] = getPathSegmentsInfo(path),\n): TPointAngle | undefined => {\n let i = 0;\n while (distance - infos[i].length > 0 && i < infos.length - 2) {\n distance -= infos[i].length;\n i++;\n }\n const segInfo = infos[i],\n segPercent = distance / segInfo.length,\n segment = path[i];\n\n switch (segInfo.command) {\n case 'M':\n return { x: segInfo.x, y: segInfo.y, angle: 0 };\n case 'Z':\n return {\n ...new Point(segInfo.x, segInfo.y).lerp(\n new Point(segInfo.destX, segInfo.destY),\n segPercent,\n ),\n angle: Math.atan2(segInfo.destY - segInfo.y, segInfo.destX - segInfo.x),\n };\n case 'L':\n return {\n ...new Point(segInfo.x, segInfo.y).lerp(\n new Point(segment[1]!, segment[2]!),\n segPercent,\n ),\n angle: Math.atan2(segment[2]! - segInfo.y, segment[1]! - segInfo.x),\n };\n case 'C':\n return findPercentageForDistance(segInfo, distance);\n case 'Q':\n return findPercentageForDistance(segInfo, distance);\n default:\n // throw Error('Invalid command');\n }\n};\n\nconst rePathCmdAll = new RegExp(rePathCommand, 'gi');\nconst regExpArcCommandPoints = new RegExp(reArcCommandPoints, 'g');\nconst reMyNum = new RegExp(reNum, 'gi');\nconst commandLengths = {\n m: 2,\n l: 2,\n h: 1,\n v: 1,\n c: 6,\n s: 4,\n q: 4,\n t: 2,\n a: 7,\n} as const;\n/**\n *\n * @param {string} pathString\n * @return {TComplexPathData} An array of SVG path commands\n * @example Usage\n * parsePath('M 3 4 Q 3 5 2 1 4 0 Q 9 12 2 1 4 0') === [\n * ['M', 3, 4],\n * ['Q', 3, 5, 2, 1, 4, 0],\n * ['Q', 9, 12, 2, 1, 4, 0],\n * ];\n */\nexport const parsePath = (pathString: string): TComplexPathData => {\n const chain: TComplexPathData = [];\n const all = pathString.match(rePathCmdAll) ?? [];\n for (const matchStr of all) {\n // take match string and save the first letter as the command\n const commandLetter = matchStr[0] as TComplexParsedCommandType;\n // in case of Z we have very little to do\n if (commandLetter === 'z' || commandLetter === 'Z') {\n chain.push([commandLetter]);\n continue;\n }\n const commandLength =\n commandLengths[\n commandLetter.toLowerCase() as keyof typeof commandLengths\n ];\n\n let paramArr = [];\n if (commandLetter === 'a' || commandLetter === 'A') {\n // the arc command ha some peculariaties that requires a special regex other than numbers\n // it is possible to avoid using a space between the sweep and large arc flags, making them either\n // 00, 01, 10 or 11, making them identical to a plain number for the regex reMyNum\n // reset the regexp\n regExpArcCommandPoints.lastIndex = 0;\n for (let out = null; (out = regExpArcCommandPoints.exec(matchStr)); ) {\n paramArr.push(...out.slice(1));\n }\n } else {\n paramArr = matchStr.match(reMyNum) || [];\n }\n\n // inspect the length of paramArr, if is longer than commandLength\n // we are dealing with repeated commands\n for (let i = 0; i < paramArr.length; i += commandLength) {\n const newCommand = new Array(commandLength) as TComplexParsedCommand;\n const transformedCommand = repeatedCommands[commandLetter];\n newCommand[0] =\n i > 0 && transformedCommand ? transformedCommand : commandLetter;\n for (let j = 0; j < commandLength; j++) {\n newCommand[j + 1] = parseFloat(paramArr[i + j]);\n }\n chain.push(newCommand);\n }\n }\n return chain;\n};\n\n/**\n *\n * Converts points to a smooth SVG path\n * @param {XY[]} points Array of points\n * @param {number} [correction] Apply a correction to the path (usually we use `width / 1000`). If value is undefined 0 is used as the correction value.\n * @return {(string|number)[][]} An array of SVG path commands\n */\nexport const getSmoothPathFromPoints = (\n points: Point[],\n correction = 0,\n): TSimplePathData => {\n let p1 = new Point(points[0]),\n p2 = new Point(points[1]),\n multSignX = 1,\n multSignY = 0;\n const path: TSimplePathData = [],\n len = points.length,\n manyPoints = len > 2;\n\n if (manyPoints) {\n multSignX = points[2].x < p2.x ? -1 : points[2].x === p2.x ? 0 : 1;\n multSignY = points[2].y < p2.y ? -1 : points[2].y === p2.y ? 0 : 1;\n }\n path.push([\n 'M',\n p1.x - multSignX * correction,\n p1.y - multSignY * correction,\n ]);\n let i;\n for (i = 1; i < len; i++) {\n if (!p1.eq(p2)) {\n const midPoint = p1.midPointFrom(p2);\n // p1 is our bezier control point\n // midpoint is our endpoint\n // start point is p(i-1) value.\n path.push(['Q', p1.x, p1.y, midPoint.x, midPoint.y]);\n }\n p1 = points[i];\n if (i + 1 < points.length) {\n p2 = points[i + 1];\n }\n }\n if (manyPoints) {\n multSignX = p1.x > points[i - 2].x ? 1 : p1.x === points[i - 2].x ? 0 : -1;\n multSignY = p1.y > points[i - 2].y ? 1 : p1.y === points[i - 2].y ? 0 : -1;\n }\n path.push([\n 'L',\n p1.x + multSignX * correction,\n p1.y + multSignY * correction,\n ]);\n return path;\n};\n\n/**\n * Transform a path by transforming each segment.\n * it has to be a simplified path or it won't work.\n * WARNING: this depends from pathOffset for correct operation\n * @param {TSimplePathData} path fabricJS parsed and simplified path commands\n * @param {TMat2D} transform matrix that represent the transformation\n * @param {Point} [pathOffset] `Path.pathOffset`\n * @returns {TSimplePathData} the transformed path\n */\nexport const transformPath = (\n path: TSimplePathData,\n transform: TMat2D,\n pathOffset: Point,\n): TSimplePathData => {\n if (pathOffset) {\n transform = multiplyTransformMatrices(transform, [\n 1,\n 0,\n 0,\n 1,\n -pathOffset.x,\n -pathOffset.y,\n ]);\n }\n return path.map((pathSegment) => {\n const newSegment: TSimpleParsedCommand = [...pathSegment];\n for (let i = 1; i < pathSegment.length - 1; i += 2) {\n // TODO: is there a way to get around casting to any?\n const { x, y } = transformPoint(\n {\n x: pathSegment[i] as number,\n y: pathSegment[i + 1] as number,\n },\n transform,\n );\n newSegment[i] = x;\n newSegment[i + 1] = y;\n }\n return newSegment;\n });\n};\n\n/**\n * Returns an array of path commands to create a regular polygon\n * @param {number} numVertexes\n * @param {number} radius\n * @returns {TSimplePathData} An array of SVG path commands\n */\nexport const getRegularPolygonPath = (\n numVertexes: number,\n radius: number,\n): TSimplePathData => {\n const interiorAngle = (Math.PI * 2) / numVertexes;\n // rotationAdjustment rotates the path by 1/2 the interior angle so that the polygon always has a flat side on the bottom\n // This isn't strictly necessary, but it's how we tend to think of and expect polygons to be drawn\n let rotationAdjustment = -halfPI;\n if (numVertexes % 2 === 0) {\n rotationAdjustment += interiorAngle / 2;\n }\n const d = new Array(numVertexes + 1);\n for (let i = 0; i < numVertexes; i++) {\n const rad = i * interiorAngle + rotationAdjustment;\n const { x, y } = new Point(cos(rad), sin(rad)).scalarMultiply(radius);\n d[i] = [i === 0 ? 'M' : 'L', x, y];\n }\n d[numVertexes] = ['Z'];\n return d;\n};\n\n/**\n * Join path commands to go back to svg format\n * @param {TSimplePathData} pathData fabricJS parsed path commands\n * @param {number} fractionDigits number of fraction digits to \"leave\"\n * @return {String} joined path 'M 0 0 L 20 30'\n */\nexport const joinPath = (pathData: TSimplePathData, fractionDigits?: number) =>\n pathData\n .map((segment) => {\n return segment\n .map((arg, i) => {\n if (i === 0) return arg;\n return fractionDigits === undefined\n ? arg\n : toFixed(arg, fractionDigits);\n })\n .join(' ');\n })\n .join(' ');\n","import type { FabricObject } from '../../shapes/Object/FabricObject';\nimport { sendObjectToPlane } from './planeChange';\nimport { Group } from '../../shapes/Group';\n/**\n * Merges 2 clip paths into one visually equal clip path\n *\n * **IMPORTANT**:\\\n * Does **NOT** clone the arguments, clone them proir if necessary.\n *\n * Creates a wrapper (group) that contains one clip path and is clipped by the other so content is kept where both overlap.\n * Use this method if both the clip paths may have nested clip paths of their own, so assigning one to the other's clip path property is not possible.\n *\n * In order to handle the `inverted` property we follow logic described in the following cases:\\\n * **(1)** both clip paths are inverted - the clip paths pass the inverted prop to the wrapper and loose it themselves.\\\n * **(2)** one is inverted and the other isn't - the wrapper shouldn't become inverted and the inverted clip path must clip the non inverted one to produce an identical visual effect.\\\n * **(3)** both clip paths are not inverted - wrapper and clip paths remain unchanged.\n *\n * @param {fabric.Object} c1\n * @param {fabric.Object} c2\n * @returns {fabric.Object} merged clip path\n */\nexport const mergeClipPaths = (c1: FabricObject, c2: FabricObject) => {\n let a = c1,\n b = c2;\n if (a.inverted && !b.inverted) {\n // case (2)\n a = c2;\n b = c1;\n }\n // `b` becomes `a`'s clip path so we transform `b` to `a` coordinate plane\n sendObjectToPlane(b, b.group?.calcTransformMatrix(), a.calcTransformMatrix());\n // assign the `inverted` prop to the wrapping group\n const inverted = a.inverted && b.inverted;\n if (inverted) {\n // case (1)\n a.inverted = b.inverted = false;\n }\n return new Group([a], { clipPath: b, inverted });\n};\n","/**\n * Returns random number between 2 specified ones.\n * @param {Number} min lower limit\n * @param {Number} max upper limit\n * @return {Number} random value (between min and max)\n */\nexport const getRandomInt = (min: number, max: number): number =>\n Math.floor(Math.random() * (max - min + 1)) + min;\n","import { CENTER, SCALE_X, SCALE_Y } from '../constants';\nimport type { FabricImage } from '../shapes/Image';\nimport type { FabricObject } from '../shapes/Object/FabricObject';\nimport type { TMat2D } from '../typedefs';\nimport { qrDecompose } from './misc/matrix';\n\ntype FabricObjectWithTransformMatrix = FabricObject & {\n transformMatrix?: TMat2D;\n};\n\n/**\n * This function is an helper for svg import. it decompose the transformMatrix\n * and assign properties to object.\n * untransformed coordinates\n * @private\n */\nconst _assignTransformMatrixProps = (\n object: FabricObjectWithTransformMatrix,\n) => {\n if (object.transformMatrix) {\n const { scaleX, scaleY, angle, skewX } = qrDecompose(\n object.transformMatrix,\n );\n object.flipX = false;\n object.flipY = false;\n object.set(SCALE_X, scaleX);\n object.set(SCALE_Y, scaleY);\n object.angle = angle;\n object.skewX = skewX;\n object.skewY = 0;\n }\n};\n\n/**\n * This function is an helper for svg import. it removes the transform matrix\n * and set to object properties that fabricjs can handle\n * @private\n * @param {Object} preserveAspectRatioOptions\n */\nexport const removeTransformMatrixForSvgParsing = (\n object: FabricObjectWithTransformMatrix,\n preserveAspectRatioOptions?: any,\n) => {\n let center = object._findCenterFromElement();\n if (object.transformMatrix) {\n _assignTransformMatrixProps(object);\n center = center.transform(object.transformMatrix);\n }\n delete object.transformMatrix;\n if (preserveAspectRatioOptions) {\n object.scaleX *= preserveAspectRatioOptions.scaleX;\n object.scaleY *= preserveAspectRatioOptions.scaleY;\n (object as FabricImage).cropX = preserveAspectRatioOptions.cropX;\n (object as FabricImage).cropY = preserveAspectRatioOptions.cropY;\n center.x += preserveAspectRatioOptions.offsetLeft;\n center.y += preserveAspectRatioOptions.offsetTop;\n object.width = preserveAspectRatioOptions.width;\n object.height = preserveAspectRatioOptions.height;\n }\n object.setPositionByOrigin(center, CENTER, CENTER);\n};\n","// TODO this file needs to go away, cross browser style support is not fabricjs domain.\n\n/**\n * wrapper for setting element's style\n * @param {HTMLElement} element an HTMLElement\n * @param {Object} styles to apply to element\n */\nexport function setStyle(element: HTMLElement, styles: Record) {\n const elementStyle = element.style;\n if (!elementStyle) {\n return;\n }\n Object.entries(styles).forEach(([property, value]) =>\n elementStyle.setProperty(property, value),\n );\n}\n","import { getEnv, getFabricDocument } from '../../env';\nimport type { TSize } from '../../typedefs';\nimport { createCanvasElement } from '../../util/misc/dom';\nimport { setStyle } from '../../util/internals/dom_style';\nimport type { CSSDimensions } from './util';\nimport { makeElementUnselectable, setCSSDimensions } from './util';\nimport type { CanvasItem } from './StaticCanvasDOMManager';\nimport { StaticCanvasDOMManager } from './StaticCanvasDOMManager';\nimport { setCanvasDimensions } from './util';\nimport { NONE } from '../../constants';\n\nexport class CanvasDOMManager extends StaticCanvasDOMManager {\n upper: CanvasItem;\n container: HTMLDivElement;\n\n constructor(\n arg0?: string | HTMLCanvasElement,\n {\n allowTouchScrolling = false,\n containerClass = '',\n }: {\n allowTouchScrolling?: boolean;\n /**\n * @deprecated here only for backward compatibility\n */\n containerClass?: string;\n } = {},\n ) {\n super(arg0);\n const { el: lowerCanvasEl } = this.lower;\n const upperCanvasEl = this.createUpperCanvas();\n this.upper = { el: upperCanvasEl, ctx: upperCanvasEl.getContext('2d')! };\n this.applyCanvasStyle(lowerCanvasEl, {\n allowTouchScrolling,\n });\n this.applyCanvasStyle(upperCanvasEl, {\n allowTouchScrolling,\n styles: {\n position: 'absolute',\n left: '0',\n top: '0',\n },\n });\n const container = this.createContainerElement();\n container.classList.add(containerClass);\n if (lowerCanvasEl.parentNode) {\n lowerCanvasEl.parentNode.replaceChild(container, lowerCanvasEl);\n }\n container.append(lowerCanvasEl, upperCanvasEl);\n this.container = container;\n }\n\n protected createUpperCanvas() {\n const { el: lowerCanvasEl } = this.lower;\n const el = createCanvasElement();\n // we assign the same classname of the lowerCanvas\n el.className = lowerCanvasEl.className;\n // but then we remove the lower-canvas specific className\n el.classList.remove('lower-canvas');\n // we add the specific upper-canvas class\n el.classList.add('upper-canvas');\n el.setAttribute('data-fabric', 'top');\n el.style.cssText = lowerCanvasEl.style.cssText;\n el.setAttribute('draggable', 'true');\n return el;\n }\n\n protected createContainerElement() {\n const container = getFabricDocument().createElement('div');\n container.setAttribute('data-fabric', 'wrapper');\n setStyle(container, {\n position: 'relative',\n });\n makeElementUnselectable(container);\n return container;\n }\n\n /**\n * @private\n * @param {HTMLCanvasElement} element canvas element to apply styles on\n */\n protected applyCanvasStyle(\n element: HTMLCanvasElement,\n options: {\n allowTouchScrolling?: boolean;\n styles?: Record;\n },\n ) {\n const { styles, allowTouchScrolling } = options;\n setStyle(element, {\n ...styles,\n 'touch-action': allowTouchScrolling ? 'manipulation' : NONE,\n });\n makeElementUnselectable(element);\n }\n\n setDimensions(size: TSize, retinaScaling: number) {\n super.setDimensions(size, retinaScaling);\n const { el, ctx } = this.upper;\n setCanvasDimensions(el, ctx, size, retinaScaling);\n }\n\n setCSSDimensions(size: Partial): void {\n super.setCSSDimensions(size);\n setCSSDimensions(this.upper.el, size);\n setCSSDimensions(this.container, size);\n }\n\n cleanupDOM(size: TSize) {\n const container = this.container,\n { el: lowerCanvasEl } = this.lower,\n { el: upperCanvasEl } = this.upper;\n super.cleanupDOM(size);\n container.removeChild(upperCanvasEl);\n container.removeChild(lowerCanvasEl);\n if (container.parentNode) {\n container.parentNode.replaceChild(lowerCanvasEl, container);\n }\n }\n\n dispose() {\n super.dispose();\n getEnv().dispose(this.upper.el);\n // @ts-expect-error disposing\n delete this.upper;\n // @ts-expect-error disposing\n delete this.container;\n }\n}\n","import type { ModifierKey, TOptionalModifierKey } from '../EventTypeDefs';\nimport type { TOptions } from '../typedefs';\nimport type { StaticCanvasOptions } from './StaticCanvasOptions';\n\nexport interface CanvasTransformOptions {\n /**\n * When true, objects can be transformed by one side (unproportionately)\n * when dragged on the corners that normally would not do that.\n * @type Boolean\n * @since fabric 4.0 // changed name and default value\n */\n uniformScaling: boolean;\n\n /**\n * Indicates which key switches uniform scaling.\n * values: 'altKey', 'shiftKey', 'ctrlKey'.\n * If `null` or 'none' or any other string that is not a modifier key\n * feature is disabled.\n * totally wrong named. this sounds like `uniform scaling`\n * if Canvas.uniformScaling is true, pressing this will set it to false\n * and viceversa.\n * @since 1.6.2\n * @type ModifierKey\n */\n uniScaleKey: TOptionalModifierKey;\n\n /**\n * When true, objects use center point as the origin of scale transformation.\n * Backwards incompatibility note: This property replaces \"centerTransform\" (Boolean).\n * @since 1.3.4\n * @type Boolean\n */\n centeredScaling: boolean;\n\n /**\n * When true, objects use center point as the origin of rotate transformation.\n * Backwards incompatibility note: This property replaces \"centerTransform\" (Boolean).\n * @since 1.3.4\n * @type Boolean\n */\n centeredRotation: boolean;\n\n /**\n * Indicates which key enable centered Transform\n * values: 'altKey', 'shiftKey', 'ctrlKey'.\n * If `null` or 'none' or any other string that is not a modifier key\n * feature is disabled feature disabled.\n * @since 1.6.2\n * @type ModifierKey\n */\n centeredKey: TOptionalModifierKey;\n\n /**\n * Indicates which key enable alternate action on corner\n * values: 'altKey', 'shiftKey', 'ctrlKey'.\n * If `null` or 'none' or any other string that is not a modifier key\n * feature is disabled feature disabled.\n * @since 1.6.2\n * @type ModifierKey\n */\n altActionKey: TOptionalModifierKey;\n}\n\nexport interface CanvasSelectionOptions {\n /**\n * Indicates whether group selection should be enabled\n * @type Boolean\n */\n selection: boolean;\n\n /**\n * Indicates which key or keys enable multiple click selection\n * Pass value as a string or array of strings\n * values: 'altKey', 'shiftKey', 'ctrlKey'.\n * If `null` or empty or containing any other string that is not a modifier key\n * feature is disabled.\n * @since 1.6.2\n * @type ModifierKey|ModifierKey[]\n */\n selectionKey: TOptionalModifierKey | ModifierKey[];\n\n /**\n * Indicates which key enable alternative selection\n * in case of a target overlapping with active object and we don't want to loose the\n * active selection, we can press this modifier key and continue selecting the current\n * selected object also when is covered by another or many valid targets for selection.\n * values: 'altKey', 'shiftKey', 'ctrlKey'.\n * For a series of reason that come from the general expectations on how\n * things should work, this feature works only for preserveObjectStacking true.\n * If `null` or 'none' or any other string that is not a modifier key\n * feature is disabled.\n * @since 1.6.5\n * @type null|ModifierKey\n */\n altSelectionKey: TOptionalModifierKey;\n\n /**\n * Color of selection\n * @type String\n */\n selectionColor: string;\n\n /**\n * Default dash array pattern\n * If not empty the selection border is dashed\n * @type Array\n */\n selectionDashArray: number[];\n\n /**\n * Color of the border of selection (usually slightly darker than color of selection itself)\n * @type String\n */\n selectionBorderColor: string;\n\n /**\n * Width of a line used in object/group selection\n * @type Number\n */\n selectionLineWidth: number;\n\n /**\n * Select only shapes that are fully contained in the dragged selection rectangle.\n * @type Boolean\n */\n selectionFullyContained: boolean;\n}\n\nexport interface CanvasCursorOptions {\n /**\n * Default cursor value used when hovering over an object on canvas\n * @type CSSStyleDeclaration['cursor']\n * @default move\n */\n hoverCursor: CSSStyleDeclaration['cursor'];\n\n /**\n * Default cursor value used when moving an object on canvas\n * @type CSSStyleDeclaration['cursor']\n * @default move\n */\n moveCursor: CSSStyleDeclaration['cursor'];\n\n /**\n * Default cursor value used for the entire canvas\n * @type String\n * @default default\n */\n defaultCursor: CSSStyleDeclaration['cursor'];\n\n /**\n * Cursor value used during free drawing\n * @type String\n * @default crosshair\n */\n freeDrawingCursor: CSSStyleDeclaration['cursor'];\n\n /**\n * Cursor value used for disabled elements ( corners with disabled action )\n * @type String\n * @since 2.0.0\n * @default not-allowed\n */\n notAllowedCursor: CSSStyleDeclaration['cursor'];\n}\n\nexport interface TargetFindOptions {\n /**\n * When true, object detection happens on per-pixel basis rather than on per-bounding-box\n * @type Boolean\n */\n perPixelTargetFind: boolean;\n\n /**\n * Number of pixels around target pixel to tolerate (consider active) during object detection\n * @type Number\n */\n targetFindTolerance: number;\n\n /**\n * When true, target detection is skipped. Target detection will return always undefined.\n * click selection won't work anymore, events will fire with no targets.\n * if something is selected before setting it to true, it will be deselected at the first click.\n * area selection will still work. check the `selection` property too.\n * if you deactivate both, you should look into staticCanvas.\n * @type Boolean\n */\n skipTargetFind: boolean;\n}\n\nexport interface CanvasEventsOptions {\n /**\n * Indicates if the right click on canvas can output the context menu or not\n * The default value changed from false to true in Fabric 7.0\n * @see https://fabricjs.com/docs/upgrading/upgrading-to-fabric-70/\n * @deprecated since 7.0, Will be removed in Fabric 8.0\n * @type Boolean\n * @since 1.6.5\n */\n stopContextMenu: boolean;\n\n /**\n * Indicates if the canvas can fire right click events\n * The default value changed from false to true in Fabric 7.0\n * @see https://fabricjs.com/docs/upgrading/upgrading-to-fabric-70/\n * @deprecated since 7.0, Will be removed in Fabric 8.0\n * @type Boolean\n * @since 1.6.5\n */\n fireRightClick: boolean;\n\n /**\n * Indicates if the canvas can fire middle click events\n * The default value changed from false to true in Fabric 7.0\n * @see https://fabricjs.com/docs/upgrading/upgrading-to-fabric-70/\n * @deprecated since 7.0, Will be removed in Fabric 8.0\n * @type Boolean\n * @since 1.7.8\n */\n fireMiddleClick: boolean;\n\n /**\n * When the option is enabled, PointerEvent is used instead of TPointerEvent.\n * @type Boolean\n */\n enablePointerEvents: boolean;\n}\n\nexport interface CanvasOptions\n extends StaticCanvasOptions,\n CanvasTransformOptions,\n CanvasSelectionOptions,\n CanvasCursorOptions,\n TargetFindOptions,\n CanvasEventsOptions {\n /**\n * Default element class that's given to wrapper (div) element of canvas\n * @type String\n * @deprecated customize {@link CanvasDOMManager} instead or access {@link elements} directly\n */\n containerClass: string;\n\n /**\n * Indicates whether objects should remain in current stack position when selected.\n * When false objects are brought to top and rendered as part of the selection group\n * @type Boolean\n * @default true\n */\n preserveObjectStacking: boolean;\n\n /**\n * 启用双击锁定组节点,锁定后可选择组节点中的子节点,无论group中interative和subTargetCheck是否启用\n * @type Boolean\n * @default\n */\n dblClickIsolateObject: boolean;\n}\n\nexport type TCanvasOptions = TOptions;\n\nexport const canvasDefaults: TOptions = {\n uniformScaling: true,\n uniScaleKey: 'shiftKey',\n centeredScaling: false,\n centeredRotation: false,\n centeredKey: 'altKey',\n altActionKey: 'shiftKey',\n\n selection: true,\n selectionKey: 'shiftKey',\n selectionColor: 'rgba(100, 100, 255, 0.3)',\n selectionDashArray: [],\n selectionBorderColor: 'rgba(255, 255, 255, 0.3)',\n selectionLineWidth: 1,\n selectionFullyContained: false,\n\n hoverCursor: 'move',\n moveCursor: 'move',\n defaultCursor: 'default',\n freeDrawingCursor: 'crosshair',\n notAllowedCursor: 'not-allowed',\n\n perPixelTargetFind: false,\n targetFindTolerance: 0,\n skipTargetFind: false,\n\n stopContextMenu: true,\n fireRightClick: true,\n fireMiddleClick: true,\n enablePointerEvents: false,\n\n containerClass: 'canvas-container',\n preserveObjectStacking: true,\n};\n","import { dragHandler } from '../controls/drag';\nimport { getActionFromCorner } from '../controls/util';\nimport { Point } from '../Point';\nimport { FabricObject } from '../shapes/Object/FabricObject';\nimport type {\n CanvasEvents,\n ModifierKey,\n TOptionalModifierKey,\n TPointerEvent,\n Transform,\n} from '../EventTypeDefs';\nimport {\n addTransformToObject,\n saveObjectTransform,\n} from '../util/misc/objectTransforms';\nimport type { TCanvasSizeOptions } from './StaticCanvas';\nimport { StaticCanvas } from './StaticCanvas';\nimport { isCollection } from '../Collection';\nimport { isTransparent } from '../util/misc/isTransparent';\nimport type {\n TMat2D,\n TOriginX,\n TOriginY,\n TSize,\n TSVGReviver,\n} from '../typedefs';\nimport { degreesToRadians } from '../util/misc/radiansDegreesConversion';\nimport { getPointer, isTouchEvent } from '../util/dom_event';\nimport type { IText } from '../shapes/IText/IText';\nimport type { BaseBrush } from '../brushes/BaseBrush';\nimport { pick } from '../util/misc/pick';\nimport { sendPointToPlane } from '../util/misc/planeChange';\nimport { cos, createCanvasElement, sin } from '../util';\nimport { CanvasDOMManager } from './DOMManagers/CanvasDOMManager';\nimport {\n BOTTOM,\n CENTER,\n LEFT,\n MODIFIED,\n RESIZING,\n RIGHT,\n ROTATE,\n SCALE,\n SCALE_X,\n SCALE_Y,\n SKEW_X,\n SKEW_Y,\n TOP,\n} from '../constants';\nimport type { CanvasOptions } from './CanvasOptions';\nimport { canvasDefaults } from './CanvasOptions';\nimport { Intersection } from '../Intersection';\nimport { isActiveSelection } from '../util/typeAssertions';\nimport { Group } from '../shapes/Group';\n\nexport type TargetsInfo = {\n target?: FabricObject;\n subTargets: FabricObject[];\n};\n\nexport type TargetsInfoWithContainer = {\n // the target we think is the most continuing the selection action.\n // could be hoveredTarget or the currently selected object\n target?: FabricObject;\n // the nested targets under the pointer for container\n subTargets: FabricObject[];\n // the container for target, or target itself if there are no selectable nested targets\n container?: FabricObject;\n};\n\nexport type FullTargetsInfoWithContainer = TargetsInfoWithContainer & {\n // hoveredTarget\n currentTarget?: FabricObject;\n // the container for hoveredTarget, or container itself\n currentContainer?: FabricObject;\n // nested targets of current container\n currentSubTargets: FabricObject[];\n};\n\n/**\n * Canvas class\n * @class Canvas\n * @extends StaticCanvas\n * @see {@link http://fabric5.fabricjs.com/fabric-intro-part-1#canvas}\n *\n * @fires object:modified at the end of a transform\n * @fires object:rotating while an object is being rotated from the control\n * @fires object:scaling while an object is being scaled by controls\n * @fires object:moving while an object is being dragged\n * @fires object:skewing while an object is being skewed from the controls\n *\n * @fires before:transform before a transform is is started\n * @fires before:selection:cleared\n * @fires selection:cleared\n * @fires selection:updated\n * @fires selection:created\n *\n * @fires path:created after a drawing operation ends and the path is added\n * @fires mouse:down\n * @fires mouse:move\n * @fires mouse:up\n * @fires mouse:down:before on mouse down, before the inner fabric logic runs\n * @fires mouse:move:before on mouse move, before the inner fabric logic runs\n * @fires mouse:up:before on mouse up, before the inner fabric logic runs\n * @fires mouse:over\n * @fires mouse:out\n * @fires mouse:dblclick whenever a native dbl click event fires on the canvas.\n *\n * @fires dragover\n * @fires dragenter\n * @fires dragleave\n * @fires drag:enter object drag enter\n * @fires drag:leave object drag leave\n * @fires drop:before before drop event. Prepare for the drop event (same native event).\n * @fires drop\n * @fires drop:after after drop event. Run logic on canvas after event has been accepted/declined (same native event).\n * @example\n * let a: fabric.Object, b: fabric.Object;\n * let flag = false;\n * canvas.add(a, b);\n * a.on('drop:before', opt => {\n * // we want a to accept the drop even though it's below b in the stack\n * flag = this.canDrop(opt.e);\n * });\n * b.canDrop = function(e) {\n * !flag && this.draggableTextDelegate.canDrop(e);\n * }\n * b.on('dragover', opt => b.set('fill', opt.dropTarget === b ? 'pink' : 'black'));\n * a.on('drop', opt => {\n * opt.e.defaultPrevented // drop occurred\n * opt.didDrop // drop occurred on canvas\n * opt.target // drop target\n * opt.target !== a && a.set('text', 'I lost');\n * });\n * canvas.on('drop:after', opt => {\n * // inform user who won\n * if(!opt.e.defaultPrevented) {\n * // no winners\n * }\n * else if(!opt.didDrop) {\n * // my objects didn't win, some other lucky object\n * }\n * else {\n * // we have a winner it's opt.target!!\n * }\n * })\n *\n * @fires after:render at the end of the render process, receives the context in the callback\n * @fires before:render at start the render process, receives the context in the callback\n *\n * @fires contextmenu:before\n * @fires contextmenu\n * @example\n * let handler;\n * targets.forEach(target => {\n * target.on('contextmenu:before', opt => {\n * // decide which target should handle the event before canvas hijacks it\n * if (someCaseHappens && opt.targets.includes(target)) {\n * handler = target;\n * }\n * });\n * target.on('contextmenu', opt => {\n * // do something fantastic\n * });\n * });\n * canvas.on('contextmenu', opt => {\n * if (!handler) {\n * // no one takes responsibility, it's always left to me\n * // let's show them how it's done!\n * }\n * });\n *\n */\nexport class SelectableCanvas\n extends StaticCanvas\n implements Omit\n{\n declare _objects: FabricObject[];\n\n // transform config\n declare uniformScaling: boolean;\n declare uniScaleKey: TOptionalModifierKey;\n declare centeredScaling: boolean;\n declare centeredRotation: boolean;\n declare centeredKey: TOptionalModifierKey;\n declare altActionKey: TOptionalModifierKey;\n\n // selection config\n declare selection: boolean;\n declare selectionKey: TOptionalModifierKey | ModifierKey[];\n declare altSelectionKey: TOptionalModifierKey;\n declare selectionColor: string;\n declare selectionDashArray: number[];\n declare selectionBorderColor: string;\n declare selectionLineWidth: number;\n declare selectionFullyContained: boolean;\n\n // cursors\n declare hoverCursor: CSSStyleDeclaration['cursor'];\n declare moveCursor: CSSStyleDeclaration['cursor'];\n declare defaultCursor: CSSStyleDeclaration['cursor'];\n declare freeDrawingCursor: CSSStyleDeclaration['cursor'];\n declare notAllowedCursor: CSSStyleDeclaration['cursor'];\n\n declare containerClass: string;\n\n // target find config\n declare perPixelTargetFind: boolean;\n declare targetFindTolerance: number;\n declare skipTargetFind: boolean;\n\n /**\n * When true, mouse events on canvas (mousedown/mousemove/mouseup) result in free drawing.\n * After mousedown, mousemove creates a shape,\n * and then mouseup finalizes it and adds an instance of `fabric.Path` onto canvas.\n * @see {@link http://fabric5.fabricjs.com/fabric-intro-part-4#free_drawing}\n * @type Boolean\n */\n declare isDrawingMode: boolean;\n\n declare preserveObjectStacking: boolean;\n\n /**\n * 启用双击锁定组对象,锁定后只能选择对象的子节点,无论group中interative和subTargetCheck是否启用\n * @type Boolean\n * @default\n */\n declare dblClickIsolateObject: boolean;\n\n /**\n * 双击锁定的节点, 目前只支持组节点\n * @type Group | null\n * @default\n */\n isolatedObject: Group | null;\n\n /**\n * 指定的搜索对象\n * @type Boolean\n * @default null\n */\n _searchTargets: FabricObject[] | null;\n\n // event config\n declare stopContextMenu: boolean;\n declare fireRightClick: boolean;\n declare fireMiddleClick: boolean;\n\n /**\n * Keep track of the hovered target in the previous event\n * @type FabricObject | null\n * @private\n */\n declare _hoveredTarget?: FabricObject;\n\n /**\n * hold the list of nested targets hovered in the previous events\n * @type FabricObject[]\n * @private\n */\n _hoveredTargets: FabricObject[] = [];\n\n /**\n * hold the list of objects to render\n * @type FabricObject[]\n * @private\n */\n declare _objectsToRender?: FabricObject[];\n\n /**\n * hold a reference to a data structure that contains information\n * on the current on going transform\n * @type\n * @private\n */\n _currentTransform: Transform | null = null;\n\n /**\n * hold a reference to a data structure used to track the selection\n * box on canvas drag\n * on the current on going transform\n * x, y, deltaX and deltaY are in scene plane\n * @type\n * @private\n */\n protected _groupSelector: {\n x: number;\n y: number;\n deltaX: number;\n deltaY: number;\n } | null = null;\n\n /**\n * internal flag used to understand if the context top requires a cleanup\n * in case this is true, the contextTop will be cleared at the next render\n * @type boolean\n * @private\n */\n contextTopDirty = false;\n\n /**\n * During a mouse event we may need the pointer multiple times in multiple functions.\n * _scenePoint holds a reference to the pointer in fabricCanvas/design coordinates that is valid for the event\n * lifespan. Every fabricJS mouse event create and delete the cache every time\n * We do this because there are some HTML DOM inspection functions to get the actual pointer coordinates\n * @type {Point}\n */\n protected declare _scenePoint?: Point;\n\n /**\n * During a mouse event we may need the pointer multiple times in multiple functions.\n * _viewportPoint holds a reference to the pointer in html coordinates that is valid for the event\n * lifespan. Every fabricJS mouse event create and delete the cache every time\n * We do this because there are some HTML DOM inspection functions to get the actual pointer coordinates\n * @type {Point}\n */\n protected declare _viewportPoint?: Point;\n\n /**\n * Holds the informations we cache during an event lifespan\n * This data is needed many times during an event and we want to avoid to recalculate it\n * multuple times.\n */\n protected declare _targetInfo: FullTargetsInfoWithContainer | undefined;\n\n static ownDefaults = canvasDefaults;\n\n static getDefaults(): Record {\n return { ...super.getDefaults(), ...SelectableCanvas.ownDefaults };\n }\n\n declare elements: CanvasDOMManager;\n get upperCanvasEl() {\n return this.elements.upper?.el;\n }\n get contextTop() {\n return this.elements.upper?.ctx;\n }\n get wrapperEl() {\n return this.elements.container;\n }\n private declare pixelFindCanvasEl: HTMLCanvasElement;\n private declare pixelFindContext: CanvasRenderingContext2D;\n\n protected declare _isCurrentlyDrawing: boolean;\n declare freeDrawingBrush?: BaseBrush;\n declare _activeObject?: FabricObject;\n\n protected initElements(el?: string | HTMLCanvasElement) {\n this.elements = new CanvasDOMManager(el, {\n allowTouchScrolling: this.allowTouchScrolling,\n containerClass: this.containerClass,\n });\n this._createCacheCanvas();\n }\n\n /**\n * @private\n * @param {FabricObject} obj Object that was added\n */\n _onObjectAdded(obj: FabricObject) {\n this._objectsToRender = undefined;\n super._onObjectAdded(obj);\n }\n\n /**\n * @private\n * @param {FabricObject} obj Object that was removed\n */\n _onObjectRemoved(obj: FabricObject) {\n this._objectsToRender = undefined;\n // removing active object should fire \"selection:cleared\" events\n if (obj === this._activeObject) {\n this.fire('before:selection:cleared', { deselected: [obj] });\n this._discardActiveObject();\n this.fire('selection:cleared', { deselected: [obj] });\n obj.fire('deselected', {\n target: obj,\n });\n }\n if (obj === this._hoveredTarget) {\n this._hoveredTarget = undefined;\n this._hoveredTargets = [];\n }\n super._onObjectRemoved(obj);\n }\n\n _onStackOrderChanged() {\n this._objectsToRender = undefined;\n super._onStackOrderChanged();\n }\n\n /**\n * Divides objects in two groups, one to render immediately\n * and one to render as activeGroup.\n * @return {Array} objects to render immediately and pushes the other in the activeGroup.\n */\n _chooseObjectsToRender(): FabricObject[] {\n const activeObject = this._activeObject;\n return !this.preserveObjectStacking && activeObject\n ? this._objects\n .filter((object) => !object.group && object !== activeObject)\n .concat(activeObject)\n : this._objects;\n }\n\n /**\n * Renders both the top canvas and the secondary container canvas.\n */\n renderAll() {\n this.cancelRequestedRender();\n if (this.destroyed) {\n return;\n }\n if (this.contextTopDirty && !this._groupSelector && !this.isDrawingMode) {\n this.clearContext(this.contextTop);\n this.contextTopDirty = false;\n }\n if (this.hasLostContext) {\n this.renderTopLayer(this.contextTop);\n this.hasLostContext = false;\n }\n !this._objectsToRender &&\n (this._objectsToRender = this._chooseObjectsToRender());\n this.renderCanvas(this.getContext(), this._objectsToRender);\n }\n\n /**\n * text selection is rendered by the active text instance during the rendering cycle\n */\n renderTopLayer(ctx: CanvasRenderingContext2D): void {\n ctx.save();\n if (this.isDrawingMode && this._isCurrentlyDrawing) {\n this.freeDrawingBrush && this.freeDrawingBrush._render();\n this.contextTopDirty = true;\n }\n // we render the top context - last object\n if (this.selection && this._groupSelector) {\n this._drawSelection(ctx);\n this.contextTopDirty = true;\n }\n ctx.restore();\n }\n\n /**\n * Method to render only the top canvas.\n * Also used to render the group selection box.\n * Does not render text selection.\n */\n renderTop() {\n const ctx = this.contextTop;\n this.clearContext(ctx);\n this.renderTopLayer(ctx);\n // todo: how do i know if the after:render is for the top or normal contex?\n this.fire('after:render', { ctx });\n }\n\n /**\n * Set the canvas tolerance value for pixel taret find.\n * Use only integer numbers.\n * @private\n */\n setTargetFindTolerance(value: number) {\n value = Math.round(value);\n this.targetFindTolerance = value;\n const retina = this.getRetinaScaling();\n const size = Math.ceil((value * 2 + 1) * retina);\n this.pixelFindCanvasEl.width = this.pixelFindCanvasEl.height = size;\n this.pixelFindContext.scale(retina, retina);\n }\n\n /**\n * Returns true if object is transparent at a certain location\n * Clarification: this is `is target transparent at location X or are controls there`\n * @TODO this seems dumb that we treat controls with transparency. we can find controls\n * programmatically without painting them, the cache canvas optimization is always valid\n * @param {FabricObject} target Object to check\n * @param {Number} x Left coordinate in viewport space\n * @param {Number} y Top coordinate in viewport space\n * @return {Boolean}\n */\n isTargetTransparent(target: FabricObject, x: number, y: number): boolean {\n const tolerance = this.targetFindTolerance;\n const ctx = this.pixelFindContext;\n this.clearContext(ctx);\n ctx.save();\n ctx.translate(-x + tolerance, -y + tolerance);\n ctx.transform(...this.viewportTransform);\n const selectionBgc = target.selectionBackgroundColor;\n target.selectionBackgroundColor = '';\n target.render(ctx);\n target.selectionBackgroundColor = selectionBgc;\n ctx.restore();\n // our canvas is square, and made around tolerance.\n // so tolerance in this case also represent the center of the canvas.\n const enhancedTolerance = Math.round(tolerance * this.getRetinaScaling());\n return isTransparent(\n ctx,\n enhancedTolerance,\n enhancedTolerance,\n enhancedTolerance,\n );\n }\n\n /**\n * takes an event and determines if selection key has been pressed\n * @private\n * @param {TPointerEvent} e Event object\n */\n _isSelectionKeyPressed(e: TPointerEvent): boolean {\n const sKey = this.selectionKey;\n if (!sKey) {\n return false;\n }\n if (Array.isArray(sKey)) {\n return !!sKey.find((key) => !!key && e[key] === true);\n } else {\n return e[sKey];\n }\n }\n\n /**\n * @private\n * @param {TPointerEvent} e Event object\n * @param {FabricObject} target\n */\n _shouldClearSelection(\n e: TPointerEvent,\n target?: FabricObject,\n ): target is undefined {\n const activeObjects = this.getActiveObjects(),\n activeObject = this._activeObject;\n\n return !!(\n !target ||\n (target &&\n activeObject &&\n activeObjects.length > 1 &&\n activeObjects.indexOf(target) === -1 &&\n activeObject !== target &&\n !this._isSelectionKeyPressed(e)) ||\n (target && !target.evented) ||\n (target && !target.selectable && activeObject && activeObject !== target)\n );\n }\n\n /**\n * This method will take in consideration a modifier key pressed and the control we are\n * about to drag, and try to guess the anchor point ( origin ) of the transormation.\n * This should be really in the realm of controls, and we should remove specific code for legacy\n * embedded actions.\n * @TODO this probably deserve discussion/rediscovery and change/refactor\n * @private\n * @deprecated\n * @param {FabricObject} target\n * @param {string} action\n * @param {boolean} altKey\n * @returns {boolean} true if the transformation should be centered\n */\n private _shouldCenterTransform(\n target: FabricObject,\n action: string,\n modifierKeyPressed: boolean,\n ) {\n if (!target) {\n return;\n }\n\n let centerTransform;\n\n if (\n action === SCALE ||\n action === SCALE_X ||\n action === SCALE_Y ||\n action === RESIZING\n ) {\n centerTransform = this.centeredScaling || target.centeredScaling;\n } else if (action === ROTATE) {\n centerTransform = this.centeredRotation || target.centeredRotation;\n }\n\n return centerTransform ? !modifierKeyPressed : modifierKeyPressed;\n }\n\n /**\n * Given the control clicked, determine the origin of the transform.\n * This is bad because controls can totally have custom names\n * should disappear before release 4.0\n * @private\n * @deprecated\n */\n _getOriginFromCorner(\n target: FabricObject,\n controlName: string,\n ): { x: TOriginX; y: TOriginY } {\n const origin = {\n x: target.originX,\n y: target.originY,\n };\n\n if (!controlName) {\n return origin;\n }\n\n // is a left control ?\n if (['ml', 'tl', 'bl'].includes(controlName)) {\n origin.x = RIGHT;\n // is a right control ?\n } else if (['mr', 'tr', 'br'].includes(controlName)) {\n origin.x = LEFT;\n }\n // is a top control ?\n if (['tl', 'mt', 'tr'].includes(controlName)) {\n origin.y = BOTTOM;\n // is a bottom control ?\n } else if (['bl', 'mb', 'br'].includes(controlName)) {\n origin.y = TOP;\n }\n return origin;\n }\n\n /**\n * @private\n * @param {Event} e Event object\n * @param {FabricObject} target\n * @param {boolean} [alreadySelected] pass true to setup the active control\n */\n _setupCurrentTransform(\n e: TPointerEvent,\n target: FabricObject,\n alreadySelected: boolean,\n ): void {\n const pointer = target.group\n ? // transform pointer to target's containing coordinate plane\n sendPointToPlane(\n this.getScenePoint(e),\n undefined,\n target.group.calcTransformMatrix(),\n )\n : this.getScenePoint(e);\n const { key: corner = '', control } = target.getActiveControl() || {},\n actionHandler =\n alreadySelected && control\n ? control.getActionHandler(e, target, control)?.bind(control)\n : dragHandler,\n action = getActionFromCorner(alreadySelected, corner, e, target),\n altKey = e[this.centeredKey as ModifierKey],\n origin = this._shouldCenterTransform(target, action, altKey)\n ? ({ x: CENTER, y: CENTER } as const)\n : this._getOriginFromCorner(target, corner),\n /**\n * relative to target's containing coordinate plane\n * both agree on every point\n **/\n transform: Transform = {\n target: target,\n action,\n actionHandler,\n actionPerformed: false,\n corner,\n scaleX: target.scaleX,\n scaleY: target.scaleY,\n skewX: target.skewX,\n skewY: target.skewY,\n offsetX: pointer.x - target.left,\n offsetY: pointer.y - target.top,\n originX: origin.x,\n originY: origin.y,\n ex: pointer.x,\n ey: pointer.y,\n lastX: pointer.x,\n lastY: pointer.y,\n theta: degreesToRadians(target.angle),\n width: target.width,\n height: target.height,\n shiftKey: e.shiftKey,\n altKey,\n original: {\n ...saveObjectTransform(target),\n originX: origin.x,\n originY: origin.y,\n },\n };\n\n this._currentTransform = transform;\n\n this.fire('before:transform', {\n e,\n transform,\n });\n }\n\n /**\n * Set the cursor type of the canvas element\n * @param {String} value Cursor type of the canvas element.\n * @see http://www.w3.org/TR/css3-ui/#cursor\n */\n setCursor(value: CSSStyleDeclaration['cursor']): void {\n this.upperCanvasEl.style.cursor = value;\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx to draw the selection on\n */\n _drawSelection(ctx: CanvasRenderingContext2D): void {\n const { x, y, deltaX, deltaY } = this._groupSelector!,\n start = new Point(x, y).transform(this.viewportTransform),\n extent = new Point(x + deltaX, y + deltaY).transform(\n this.viewportTransform,\n ),\n strokeOffset = this.selectionLineWidth / 2;\n let minX = Math.min(start.x, extent.x),\n minY = Math.min(start.y, extent.y),\n maxX = Math.max(start.x, extent.x),\n maxY = Math.max(start.y, extent.y);\n\n if (this.selectionColor) {\n ctx.fillStyle = this.selectionColor;\n ctx.fillRect(minX, minY, maxX - minX, maxY - minY);\n }\n\n if (!this.selectionLineWidth || !this.selectionBorderColor) {\n return;\n }\n ctx.lineWidth = this.selectionLineWidth;\n ctx.strokeStyle = this.selectionBorderColor;\n\n minX += strokeOffset;\n minY += strokeOffset;\n maxX -= strokeOffset;\n maxY -= strokeOffset;\n // selection border\n // @TODO: is _setLineDash still necessary on modern canvas?\n FabricObject.prototype._setLineDash.call(\n this,\n ctx,\n this.selectionDashArray,\n );\n ctx.strokeRect(minX, minY, maxX - minX, maxY - minY);\n }\n\n /**\n * 双击选择\n * @param e\n * @returns\n */\n dblClickLock(e: TPointerEvent): boolean {\n if (this.dblClickIsolateObject) {\n const pointer = this.getScenePoint(e);\n const objects = this.isolatedObject\n ? this.isolatedObject.getObjects()\n : this.getObjects();\n const obj = this.searchPossibleTargets(objects, pointer);\n if (obj.target) {\n if (obj.target instanceof Group) {\n // 组才修改锁定\n this.isolatedObject = obj.target;\n this.discardActiveObject();\n // 新创建的组对象,子节点coords初始化,否则无法选中\n obj.target._objects.forEach((o) => {\n o.setCoords();\n });\n } else {\n // 非组对象不处理锁定,返回false继续对象自己的双击事件\n return false;\n }\n } else {\n // 取消锁定\n this.isolatedObject = null;\n this.discardActiveObject();\n }\n return true;\n }\n return false;\n }\n\n /**\n * 设置搜索对象\n * 如当编辑path时,设置点为可搜索对象\n * @param objects\n */\n setSearchTargets(objects: FabricObject[] | null) {\n this._searchTargets = objects;\n }\n\n /**\n * 返回搜索对象\n * @returns\n */\n getSearchTargets() {\n return (\n this._searchTargets ||\n (this.isolatedObject ? this.isolatedObject._objects : this._objects)\n );\n }\n\n /**\n * Method that determines what object we are clicking on\n * 11/09/2018 TODO: would be cool if findTarget could discern between being a full target\n * or the outside part of the corner.\n * @param {Event} e mouse event\n * @return {TargetsInfoWithContainer} the target found\n */\n findTarget(e: TPointerEvent): FullTargetsInfoWithContainer {\n // this._targetInfo is cached by _cacheTransformEventData\n // and destroyed by _resetTransformEventData\n if (this._targetInfo) {\n return this._targetInfo;\n }\n\n if (this.skipTargetFind) {\n return {\n subTargets: [],\n currentSubTargets: [],\n };\n }\n\n const pointer = this.getScenePoint(e),\n activeObject = this._activeObject,\n aObjects = this.getActiveObjects(),\n targetInfo = this.searchPossibleTargets(this.getSearchTargets(), pointer);\n\n const {\n subTargets: currentSubTargets,\n container: currentContainer,\n target: currentTarget,\n } = targetInfo;\n\n const fullTargetInfo: FullTargetsInfoWithContainer = {\n ...targetInfo,\n currentSubTargets,\n currentContainer,\n currentTarget,\n };\n\n // simplest case no active object, return a new target\n if (!activeObject) {\n return fullTargetInfo;\n }\n\n // check pointer is over active selection and possibly perform `subTargetCheck`\n const activeObjectTargetInfo: FullTargetsInfoWithContainer = {\n ...this.searchPossibleTargets([activeObject], pointer),\n currentSubTargets,\n currentContainer,\n currentTarget,\n };\n\n const activeObjectControl = activeObject.findControl(\n this.getViewportPoint(e),\n isTouchEvent(e),\n );\n\n // we are clicking exactly the control of an active object, shortcut to that object.\n if (activeObjectControl) {\n return {\n ...activeObjectTargetInfo,\n target: activeObject, // we override target in case we are in the outside part of the corner.\n };\n }\n\n // in case we are over the active object\n if (activeObjectTargetInfo.target) {\n if (aObjects.length > 1) {\n // in case of active selection and target hit over the activeSelection, just exit\n // TODO Verify if we need to override target with container\n return activeObjectTargetInfo;\n }\n // from here onward not an active selection, just an activeOject that maybe is a group\n\n // preserveObjectStacking is false, so activeObject is drawn on top, just return activeObject\n if (!this.preserveObjectStacking) {\n // TODO Verify if we need to override target with container\n return activeObjectTargetInfo;\n }\n\n // In case we are in preserveObjectStacking ( selection in stack )\n // there is the possibility to force with `altSelectionKey` to return the activeObject\n // from any point in the stack, even if we have another object completely on top of it.\n if (\n this.preserveObjectStacking &&\n e[this.altSelectionKey as ModifierKey]\n ) {\n // TODO Verify if we need to override target with container\n return activeObjectTargetInfo;\n }\n }\n\n // we have an active object, but we ruled out it being our target in any way.\n return fullTargetInfo;\n }\n\n /**\n * Checks if the point is inside the object selection area including padding\n * @param {FabricObject} obj Object to test against\n * @param {Object} [pointer] point in scene coordinates\n * @return {Boolean} true if point is contained within an area of given object\n * @private\n */\n private _pointIsInObjectSelectionArea(obj: FabricObject, point: Point) {\n // getCoords will already take care of group de-nesting\n let coords = obj.getCoords();\n const viewportZoom = this.getZoom();\n const padding = obj.padding / viewportZoom;\n if (padding) {\n const [tl, tr, br, bl] = coords;\n // what is the angle of the object?\n // we could use getTotalAngle, but is way easier to look at it\n // from how coords are oriented, since if something went wrong\n // at least we are consistent.\n const angleRadians = Math.atan2(tr.y - tl.y, tr.x - tl.x),\n cosP = cos(angleRadians) * padding,\n sinP = sin(angleRadians) * padding,\n cosPSinP = cosP + sinP,\n cosPMinusSinP = cosP - sinP;\n\n coords = [\n new Point(tl.x - cosPMinusSinP, tl.y - cosPSinP),\n new Point(tr.x + cosPSinP, tr.y - cosPMinusSinP),\n new Point(br.x + cosPMinusSinP, br.y + cosPSinP),\n new Point(bl.x - cosPSinP, bl.y + cosPMinusSinP),\n ];\n // in case of padding we calculate the new coords on the fly.\n // otherwise we have to maintain 2 sets of coordinates for everything.\n // we can reiterate on storing them.\n // if this is slow, for now the semplification is large and doesn't impact\n // rendering.\n // the idea behind this is that outside target check we don't need ot know\n // where those coords are\n }\n return Intersection.isPointInPolygon(point, coords);\n }\n\n /**\n * Checks point is inside the object selection condition. Either area with padding\n * or over pixels if perPixelTargetFind is enabled\n * @param {FabricObject} obj Object to test against\n * @param {Point} pointer point from scene.\n * @return {Boolean} true if point is contained within an area of given object\n * @private\n */\n _checkTarget(obj: FabricObject, pointer: Point): boolean {\n if (\n obj &&\n obj.visible &&\n obj.evented &&\n this._pointIsInObjectSelectionArea(obj, pointer)\n ) {\n if (\n (this.perPixelTargetFind || obj.perPixelTargetFind) &&\n !(obj as unknown as IText).isEditing\n ) {\n const viewportPoint = pointer.transform(this.viewportTransform);\n if (!this.isTargetTransparent(obj, viewportPoint.x, viewportPoint.y)) {\n return true;\n }\n } else {\n return true;\n }\n }\n return false;\n }\n\n /**\n * Given an array of objects search possible targets under the pointer position\n * Returns an\n * @param {Array} objects objects array to look into\n * @param {Object} pointer x,y object of point of scene coordinates we want to check.\n * @param {Object} subTargets If passed, subtargets will be collected inside the array\n * @return {TargetsInfo} **top most object from given `objects`** that contains pointer\n * @private\n */\n _searchPossibleTargets(\n objects: FabricObject[],\n pointer: Point,\n subTargets: FabricObject[],\n ): TargetsInfo {\n let i = objects.length;\n // Do not check for currently grouped objects, since we check the parent group itself.\n // until we call this function specifically to search inside the activeGroup\n while (i--) {\n const target = objects[i];\n if (this._checkTarget(target, pointer)) {\n // 没有开启双击锁定节点才搜索子节点\n if (\n !this.dblClickIsolateObject &&\n isCollection(target) &&\n target.subTargetCheck\n ) {\n const { target: subTarget } = this._searchPossibleTargets(\n target._objects,\n pointer,\n subTargets,\n );\n subTarget && subTargets.push(subTarget);\n }\n return {\n target,\n subTargets,\n };\n }\n }\n return {\n subTargets: [],\n };\n }\n\n /**\n * Search inside an objects array the fiurst object that contains pointer\n * Collect subTargets of that object inside the subTargets array passed as parameter\n * @param {FabricObject[]} objects objects array to look into\n * @param {Point} pointer coordinates from viewport to check.\n * @return {FabricObject} **top most object on screen** that contains pointer\n */\n searchPossibleTargets(\n objects: FabricObject[],\n pointer: Point,\n ): TargetsInfoWithContainer {\n const targetInfo: TargetsInfoWithContainer = this._searchPossibleTargets(\n objects,\n pointer,\n [],\n );\n\n // outermost target is the container.\n targetInfo.container = targetInfo.target;\n const { container, subTargets } = targetInfo;\n\n if (\n container &&\n isCollection(container) &&\n container.interactive &&\n subTargets[0]\n ) {\n /** subTargets[0] is the innermost nested target, but it could be inside non interactive groups\n * and so not a possible selection target.\n * We loop the array from the end that is outermost innertarget.\n */\n for (let i = subTargets.length - 1; i > 0; i--) {\n const t = subTargets[i];\n if (!(isCollection(t) && t.interactive)) {\n // one of the subtargets was not interactive. that is the last subtarget we can return.\n // we can't dig more deep;\n targetInfo.target = t;\n return targetInfo;\n }\n }\n targetInfo.target = subTargets[0];\n return targetInfo;\n }\n\n return targetInfo;\n }\n\n /**\n * @returns point existing in the same plane as the {@link HTMLCanvasElement},\n * `(0, 0)` being the top left corner of the {@link HTMLCanvasElement}.\n * This means that changes to the {@link viewportTransform} do not change the values of the point\n * and it remains unchanged from the viewer's perspective.\n *\n * @example\n * const scenePoint = sendPointToPlane(\n * this.getViewportPoint(e),\n * undefined,\n * canvas.viewportTransform\n * );\n *\n */\n getViewportPoint(e: TPointerEvent) {\n if (this._viewportPoint) {\n return this._viewportPoint;\n }\n return this._getPointerImpl(e, true);\n }\n\n /**\n * @returns point existing in the scene (the same plane as the plane {@link FabricObject#getCenterPoint} exists in).\n * This means that changes to the {@link viewportTransform} do not change the values of the point,\n * however, from the viewer's perspective, the point is changed.\n *\n * @example\n * const viewportPoint = sendPointToPlane(\n * this.getScenePoint(e),\n * canvas.viewportTransform\n * );\n *\n */\n getScenePoint(e: TPointerEvent) {\n if (this._scenePoint) {\n return this._scenePoint;\n }\n return this._getPointerImpl(e);\n }\n\n /**\n * Returns pointer relative to canvas.\n *\n * Use {@link getViewportPoint} or {@link getScenePoint} instead.\n *\n * @param {Event} e\n * @param {Boolean} [fromViewport] whether to return the point from the viewport or in the scene\n * @return {Point}\n */\n protected _getPointerImpl(e: TPointerEvent, fromViewport = false): Point {\n const upperCanvasEl = this.upperCanvasEl,\n bounds = upperCanvasEl.getBoundingClientRect();\n let pointer = getPointer(e),\n boundsWidth = bounds.width || 0,\n boundsHeight = bounds.height || 0;\n\n if (!boundsWidth || !boundsHeight) {\n if (TOP in bounds && BOTTOM in bounds) {\n boundsHeight = Math.abs(bounds.top - bounds.bottom);\n }\n if (RIGHT in bounds && LEFT in bounds) {\n boundsWidth = Math.abs(bounds.right - bounds.left);\n }\n }\n\n this.calcOffset();\n pointer.x = pointer.x - this._offset.left;\n pointer.y = pointer.y - this._offset.top;\n if (!fromViewport) {\n pointer = sendPointToPlane(pointer, undefined, this.viewportTransform);\n }\n\n const retinaScaling = this.getRetinaScaling();\n if (retinaScaling !== 1) {\n pointer.x /= retinaScaling;\n pointer.y /= retinaScaling;\n }\n\n // If bounds are not available (i.e. not visible), do not apply scale.\n const cssScale =\n boundsWidth === 0 || boundsHeight === 0\n ? new Point(1, 1)\n : new Point(\n upperCanvasEl.width / boundsWidth,\n upperCanvasEl.height / boundsHeight,\n );\n\n return pointer.multiply(cssScale);\n }\n\n /**\n * Internal use only\n * @protected\n */\n protected _setDimensionsImpl(\n dimensions: TSize,\n options?: TCanvasSizeOptions,\n ) {\n // @ts-expect-error this method exists in the subclass - should be moved or declared as abstract\n this._resetTransformEventData();\n super._setDimensionsImpl(dimensions, options);\n if (this._isCurrentlyDrawing) {\n this.freeDrawingBrush &&\n this.freeDrawingBrush._setBrushStyles(this.contextTop);\n }\n }\n\n protected _createCacheCanvas() {\n this.pixelFindCanvasEl = createCanvasElement();\n this.pixelFindContext = this.pixelFindCanvasEl.getContext('2d', {\n willReadFrequently: true,\n })!;\n this.setTargetFindTolerance(this.targetFindTolerance);\n }\n\n /**\n * Returns context of top canvas where interactions are drawn\n * @returns {CanvasRenderingContext2D}\n */\n getTopContext(): CanvasRenderingContext2D {\n return this.elements.upper.ctx;\n }\n\n /**\n * Returns context of canvas where object selection is drawn\n * @alias\n * @return {CanvasRenderingContext2D}\n */\n getSelectionContext(): CanvasRenderingContext2D {\n return this.elements.upper.ctx;\n }\n\n /**\n * Returns <canvas> element on which object selection is drawn\n * @return {HTMLCanvasElement}\n */\n getSelectionElement(): HTMLCanvasElement {\n return this.elements.upper.el;\n }\n\n /**\n * Returns currently active object\n * @return {FabricObject | null} active object\n */\n getActiveObject(): FabricObject | undefined {\n return this._activeObject;\n }\n\n /**\n * Returns an array with the current selected objects\n * @return {FabricObject[]} active objects array\n */\n getActiveObjects(): FabricObject[] {\n const active = this._activeObject;\n return isActiveSelection(active)\n ? active.getObjects()\n : active\n ? [active]\n : [];\n }\n\n /**\n * @private\n * Compares the old activeObject with the current one and fires correct events\n * @param {FabricObject[]} oldObjects old activeObject\n * @param {TPointerEvent} e mouse event triggering the selection events\n */\n _fireSelectionEvents(oldObjects: FabricObject[], e?: TPointerEvent) {\n let somethingChanged = false,\n invalidate = false;\n const objects = this.getActiveObjects(),\n added: FabricObject[] = [],\n removed: FabricObject[] = [];\n\n oldObjects.forEach((target) => {\n if (!objects.includes(target)) {\n somethingChanged = true;\n target.fire('deselected', {\n e,\n target,\n });\n removed.push(target);\n }\n });\n\n objects.forEach((target) => {\n if (!oldObjects.includes(target)) {\n somethingChanged = true;\n target.fire('selected', {\n e,\n target,\n });\n added.push(target);\n }\n });\n\n if (oldObjects.length > 0 && objects.length > 0) {\n invalidate = true;\n somethingChanged &&\n this.fire('selection:updated', {\n e,\n selected: added,\n deselected: removed,\n });\n } else if (objects.length > 0) {\n invalidate = true;\n this.fire('selection:created', {\n e,\n selected: added,\n });\n } else if (oldObjects.length > 0) {\n invalidate = true;\n this.fire('selection:cleared', {\n e,\n deselected: removed,\n });\n }\n invalidate && (this._objectsToRender = undefined);\n }\n\n /**\n * Sets given object as the only active object on canvas\n * @param {FabricObject} object Object to set as an active one\n * @param {TPointerEvent} [e] Event (passed along when firing \"object:selected\")\n * @return {Boolean} true if the object has been selected\n */\n setActiveObject(object: FabricObject, e?: TPointerEvent) {\n // we can't inline this, since _setActiveObject will change what getActiveObjects returns\n const currentActives = this.getActiveObjects();\n const selected = this._setActiveObject(object, e);\n this._fireSelectionEvents(currentActives, e);\n return selected;\n }\n\n /**\n * This is supposed to be equivalent to setActiveObject but without firing\n * any event. There is commitment to have this stay this way.\n * This is the functional part of setActiveObject.\n * @param {Object} object to set as active\n * @param {Event} [e] Event (passed along when firing \"object:selected\")\n * @return {Boolean} true if the object has been selected\n */\n _setActiveObject(object: FabricObject, e?: TPointerEvent) {\n const prevActiveObject = this._activeObject;\n if (prevActiveObject === object) {\n return false;\n }\n // after calling this._discardActiveObject, this,_activeObject could be undefined\n if (!this._discardActiveObject(e, object) && this._activeObject) {\n // refused to deselect\n return false;\n }\n if (object.onSelect({ e })) {\n return false;\n }\n\n this._activeObject = object;\n\n if (isActiveSelection(object) && prevActiveObject !== object) {\n object.set('canvas', this);\n }\n object.setCoords();\n\n return true;\n }\n\n /**\n * This is supposed to be equivalent to discardActiveObject but without firing\n * any selection events ( can still fire object transformation events ). There is commitment to have this stay this way.\n * This is the functional part of discardActiveObject.\n * @param {Event} [e] Event (passed along when firing \"object:deselected\")\n * @param {Object} object the next object to set as active, reason why we are discarding this\n * @return {Boolean} true if the active object has been discarded\n */\n _discardActiveObject(\n e?: TPointerEvent,\n object?: FabricObject,\n ): this is { _activeObject: undefined } {\n const obj = this._activeObject;\n if (obj) {\n // onDeselect return TRUE to cancel selection;\n if (obj.onDeselect({ e, object })) {\n return false;\n }\n if (this._currentTransform && this._currentTransform.target === obj) {\n this.endCurrentTransform(e);\n }\n if (isActiveSelection(obj) && obj === this._hoveredTarget) {\n this._hoveredTarget = undefined;\n }\n this._activeObject = undefined;\n return true;\n }\n return false;\n }\n\n /**\n * Discards currently active object and fire events. If the function is called by fabric\n * as a consequence of a mouse event, the event is passed as a parameter and\n * sent to the fire function for the custom events. When used as a method the\n * e param does not have any application.\n * @param {event} e\n * @return {Boolean} true if the active object has been discarded\n */\n discardActiveObject(e?: TPointerEvent): this is { _activeObject: undefined } {\n const currentActives = this.getActiveObjects(),\n activeObject = this.getActiveObject();\n if (currentActives.length) {\n this.fire('before:selection:cleared', {\n e,\n deselected: [activeObject!],\n });\n }\n const discarded = this._discardActiveObject(e);\n this._fireSelectionEvents(currentActives, e);\n return discarded;\n }\n\n /**\n * End the current transform.\n * You don't usually need to call this method unless you are interrupting a user initiated transform\n * because of some other event ( a press of key combination, or something that block the user UX )\n * @param {Event} [e] send the mouse event that generate the finalize down, so it can be used in the event\n */\n endCurrentTransform(e?: TPointerEvent) {\n const transform = this._currentTransform;\n this._finalizeCurrentTransform(e);\n if (transform && transform.target) {\n // this could probably go inside _finalizeCurrentTransform\n transform.target.isMoving = false;\n }\n this._currentTransform = null;\n }\n\n /**\n * @private\n * @param {Event} e send the mouse event that generate the finalize down, so it can be used in the event\n */\n _finalizeCurrentTransform(e?: TPointerEvent) {\n const transform = this._currentTransform!,\n target = transform.target,\n options = {\n e,\n target,\n transform,\n action: transform.action,\n };\n\n if (target._scaling) {\n target._scaling = false;\n }\n\n target.setCoords();\n\n if (transform.actionPerformed) {\n this.fire('object:modified', options);\n target.fire(MODIFIED, options);\n }\n }\n\n /**\n * Sets viewport transformation of this canvas instance\n * @param {Array} vpt a Canvas 2D API transform matrix\n */\n setViewportTransform(vpt: TMat2D) {\n super.setViewportTransform(vpt);\n const activeObject = this._activeObject;\n if (activeObject) {\n activeObject.setCoords();\n }\n }\n\n /**\n * @override clears active selection ref and interactive canvas elements and contexts\n */\n destroy() {\n // dispose of active selection\n const activeObject = this._activeObject;\n if (isActiveSelection(activeObject)) {\n activeObject.removeAll();\n activeObject.dispose();\n }\n\n delete this._activeObject;\n\n super.destroy();\n\n // free resources\n\n // pixel find canvas\n // @ts-expect-error disposing\n this.pixelFindContext = null;\n // @ts-expect-error disposing\n this.pixelFindCanvasEl = undefined;\n }\n\n /**\n * Clears all contexts (background, main, top) of an instance\n */\n clear() {\n // discard active object and fire events\n this.discardActiveObject();\n // make sure we clear the active object in case it refused to be discarded\n this._activeObject = undefined;\n this.clearContext(this.contextTop);\n super.clear();\n }\n\n /**\n * Draws objects' controls (borders/controls)\n * @param {CanvasRenderingContext2D} ctx Context to render controls on\n */\n drawControls(ctx: CanvasRenderingContext2D) {\n const activeObject = this._activeObject;\n\n if (activeObject) {\n activeObject._renderControls(ctx);\n }\n }\n\n /**\n * @private\n */\n protected _toObject(\n instance: FabricObject,\n methodName: 'toObject' | 'toDatalessObject',\n propertiesToInclude: string[],\n ): Record {\n // If the object is part of the current selection group, it should\n // be transformed appropriately\n // i.e. it should be serialised as it would appear if the selection group\n // were to be destroyed.\n const originalProperties = this._realizeGroupTransformOnObject(instance),\n object = super._toObject(instance, methodName, propertiesToInclude);\n //Undo the damage we did by changing all of its properties\n instance.set(originalProperties);\n return object;\n }\n\n /**\n * Realizes an object's group transformation on it\n * @private\n * @param {FabricObject} [instance] the object to transform (gets mutated)\n * @returns the original values of instance which were changed\n */\n private _realizeGroupTransformOnObject(\n instance: FabricObject,\n ): Partial {\n const { group } = instance;\n if (group && isActiveSelection(group) && this._activeObject === group) {\n const layoutProps = [\n 'angle',\n 'flipX',\n 'flipY',\n LEFT,\n SCALE_X,\n SCALE_Y,\n SKEW_X,\n SKEW_Y,\n TOP,\n ] as (keyof typeof instance)[];\n const originalValues = pick(instance, layoutProps);\n addTransformToObject(instance, group.calcOwnMatrix());\n return originalValues;\n } else {\n return {};\n }\n }\n\n /**\n * @private\n */\n _setSVGObject(\n markup: string[],\n instance: FabricObject,\n reviver?: TSVGReviver,\n ) {\n // If the object is in a selection group, simulate what would happen to that\n // object when the group is deselected\n const originalProperties = this._realizeGroupTransformOnObject(instance);\n super._setSVGObject(markup, instance, reviver);\n instance.set(originalProperties);\n }\n}\n","import type { TPointerEvent } from '../EventTypeDefs';\nimport type { ITextBehavior } from '../shapes/IText/ITextBehavior';\nimport { removeFromArray } from '../util/internals/removeFromArray';\nimport type { Canvas } from './Canvas';\n\n/**\n * In charge of synchronizing all interactive text instances of a canvas\n */\nexport class TextEditingManager {\n private targets: ITextBehavior[] = [];\n declare private target?: ITextBehavior;\n private __disposer: VoidFunction;\n\n constructor(canvas: Canvas) {\n const cb = () => {\n const { hiddenTextarea } =\n (canvas.getActiveObject() as ITextBehavior) || {};\n hiddenTextarea && hiddenTextarea.focus();\n };\n const el = canvas.upperCanvasEl;\n el.addEventListener('click', cb);\n this.__disposer = () => el.removeEventListener('click', cb);\n }\n\n exitTextEditing() {\n this.target = undefined;\n this.targets.forEach((target) => {\n if (target.isEditing) {\n target.exitEditing();\n }\n });\n }\n\n add(target: ITextBehavior) {\n this.targets.push(target);\n }\n\n remove(target: ITextBehavior) {\n this.unregister(target);\n removeFromArray(this.targets, target);\n }\n\n register(target: ITextBehavior) {\n this.target = target;\n }\n\n unregister(target: ITextBehavior) {\n if (target === this.target) {\n this.target = undefined;\n }\n }\n\n onMouseMove(e: TPointerEvent) {\n this.target?.isEditing && this.target.updateSelectionOnMouseMove(e);\n }\n\n clear() {\n this.targets = [];\n this.target = undefined;\n }\n\n dispose() {\n this.clear();\n this.__disposer();\n // @ts-expect-error disposing\n delete this.__disposer;\n }\n}\n","import { classRegistry } from '../ClassRegistry';\nimport { NONE } from '../constants';\nimport type {\n CanvasEvents,\n DragEventData,\n ObjectEvents,\n TEventsExtraData,\n TPointerEvent,\n TPointerEventNames,\n Transform,\n} from '../EventTypeDefs';\nimport { Point } from '../Point';\nimport type { ActiveSelection } from '../shapes/ActiveSelection';\nimport type { Group } from '../shapes/Group';\nimport type { IText } from '../shapes/IText/IText';\nimport type { FabricObject } from '../shapes/Object/FabricObject';\nimport { isTouchEvent, stopEvent } from '../util/dom_event';\nimport { getDocumentFromElement, getWindowFromElement } from '../util/dom_misc';\nimport { sendPointToPlane } from '../util/misc/planeChange';\nimport { isActiveSelection } from '../util/typeAssertions';\nimport type { CanvasOptions, TCanvasOptions } from './CanvasOptions';\nimport { SelectableCanvas } from './SelectableCanvas';\nimport { TextEditingManager } from './TextEditingManager';\n\nconst addEventOptions = { passive: false } as EventListenerOptions;\n\nconst getEventPoints = (canvas: Canvas, e: TPointerEvent) => {\n const viewportPoint = canvas.getViewportPoint(e);\n const scenePoint = canvas.getScenePoint(e);\n return {\n viewportPoint,\n scenePoint,\n };\n};\n\n// just to be clear, the utils are now deprecated and those are here exactly as minifier helpers\n// because el.addEventListener can't me be minified while a const yes and we use it 47 times in this file.\n// few bytes but why give it away.\nconst addListener = (\n el: HTMLElement | Document,\n ...args: Parameters\n) => el.addEventListener(...args);\nconst removeListener = (\n el: HTMLElement | Document,\n ...args: Parameters\n) => el.removeEventListener(...args);\n\nconst syntheticEventConfig = {\n mouse: {\n in: 'over',\n out: 'out',\n targetIn: 'mouseover',\n targetOut: 'mouseout',\n canvasIn: 'mouse:over',\n canvasOut: 'mouse:out',\n },\n drag: {\n in: 'enter',\n out: 'leave',\n targetIn: 'dragenter',\n targetOut: 'dragleave',\n canvasIn: 'drag:enter',\n canvasOut: 'drag:leave',\n },\n} as const;\n\ntype TSyntheticEventContext = {\n mouse: { e: TPointerEvent };\n drag: DragEventData;\n};\n\nexport class Canvas extends SelectableCanvas implements CanvasOptions {\n /**\n * Contains the id of the touch event that owns the fabric transform\n * @type Number\n * @private\n */\n declare mainTouchId?: number;\n\n declare enablePointerEvents: boolean;\n\n /**\n * Holds a reference to a setTimeout timer for event synchronization\n * @type number\n * @private\n */\n private declare _willAddMouseDown: number;\n\n /**\n * Holds a reference to an object on the canvas that is receiving the drag over event.\n * @type FabricObject\n * @private\n */\n private declare _draggedoverTarget?: FabricObject;\n\n /**\n * Holds a reference to an object on the canvas from where the drag operation started\n * @type FabricObject\n * @private\n */\n private declare _dragSource?: FabricObject;\n\n /**\n * Holds a reference to an object on the canvas that is the current drop target\n * May differ from {@link _draggedoverTarget}\n * @todo inspect whether {@link _draggedoverTarget} and {@link _dropTarget} should be merged somehow\n * @type FabricObject\n * @private\n */\n private declare _dropTarget: FabricObject | undefined;\n\n /**\n * a boolean that keeps track of the click state during a cycle of mouse down/up.\n * If a mouse move occurs it becomes false.\n * Is true by default, turns false on mouse move.\n * Used to determine if a mouseUp is a click\n */\n private _isClick: boolean;\n\n textEditingManager = new TextEditingManager(this);\n\n constructor(el?: string | HTMLCanvasElement, options: TCanvasOptions = {}) {\n super(el, options);\n // bind event handlers\n (\n [\n '_onMouseDown',\n '_onTouchStart',\n '_onMouseMove',\n '_onMouseUp',\n '_onTouchEnd',\n '_onResize',\n // '_onGesture',\n // '_onDrag',\n // '_onShake',\n // '_onLongPress',\n // '_onOrientationChange',\n '_onMouseWheel',\n '_onMouseOut',\n '_onMouseEnter',\n '_onContextMenu',\n '_onClick',\n '_onDragStart',\n '_onDragEnd',\n '_onDragProgress',\n '_onDragOver',\n '_onDragEnter',\n '_onDragLeave',\n '_onDrop',\n ] as (keyof this)[]\n ).forEach((eventHandler) => {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-function-type\n this[eventHandler] = (this[eventHandler] as Function).bind(this);\n });\n // register event handlers\n this.addOrRemove(addListener, 'add');\n }\n\n /**\n * return an event prefix pointer or mouse.\n * @private\n */\n private _getEventPrefix() {\n return this.enablePointerEvents ? 'pointer' : 'mouse';\n }\n\n addOrRemove(functor: any, _eventjsFunctor: 'add' | 'remove') {\n const canvasElement = this.upperCanvasEl,\n eventTypePrefix = this._getEventPrefix();\n functor(getWindowFromElement(canvasElement), 'resize', this._onResize);\n functor(canvasElement, eventTypePrefix + 'down', this._onMouseDown);\n functor(\n canvasElement,\n `${eventTypePrefix}move`,\n this._onMouseMove,\n addEventOptions,\n );\n functor(canvasElement, `${eventTypePrefix}out`, this._onMouseOut);\n functor(canvasElement, `${eventTypePrefix}enter`, this._onMouseEnter);\n functor(canvasElement, 'wheel', this._onMouseWheel, { passive: false });\n functor(canvasElement, 'contextmenu', this._onContextMenu);\n functor(canvasElement, 'click', this._onClick);\n // decide if to remove in fabric 7.0\n functor(canvasElement, 'dblclick', this._onClick);\n functor(canvasElement, 'dragstart', this._onDragStart);\n functor(canvasElement, 'dragend', this._onDragEnd);\n functor(canvasElement, 'dragover', this._onDragOver);\n functor(canvasElement, 'dragenter', this._onDragEnter);\n functor(canvasElement, 'dragleave', this._onDragLeave);\n functor(canvasElement, 'drop', this._onDrop);\n if (!this.enablePointerEvents) {\n functor(canvasElement, 'touchstart', this._onTouchStart, addEventOptions);\n }\n // if (typeof eventjs !== 'undefined' && eventjsFunctor in eventjs) {\n // eventjs[eventjsFunctor](canvasElement, 'gesture', this._onGesture);\n // eventjs[eventjsFunctor](canvasElement, 'drag', this._onDrag);\n // eventjs[eventjsFunctor](\n // canvasElement,\n // 'orientation',\n // this._onOrientationChange\n // );\n // eventjs[eventjsFunctor](canvasElement, 'shake', this._onShake);\n // eventjs[eventjsFunctor](canvasElement, 'longpress', this._onLongPress);\n // }\n }\n\n /**\n * Removes all event listeners, used when disposing the instance\n */\n removeListeners() {\n this.addOrRemove(removeListener, 'remove');\n // if you dispose on a mouseDown, before mouse up, you need to clean document to...\n const eventTypePrefix = this._getEventPrefix();\n const doc = getDocumentFromElement(this.upperCanvasEl);\n removeListener(\n doc,\n `${eventTypePrefix}up`,\n this._onMouseUp as EventListener,\n );\n removeListener(\n doc,\n 'touchend',\n this._onTouchEnd as EventListener,\n addEventOptions,\n );\n removeListener(\n doc,\n `${eventTypePrefix}move`,\n this._onMouseMove as EventListener,\n addEventOptions,\n );\n removeListener(\n doc,\n 'touchmove',\n this._onMouseMove as EventListener,\n addEventOptions,\n );\n clearTimeout(this._willAddMouseDown);\n }\n\n /**\n * @private\n * @param {Event} [e] Event object fired on wheel event\n */\n private _onMouseWheel(e: MouseEvent) {\n this._cacheTransformEventData(e);\n this._handleEvent(e, 'wheel');\n this._resetTransformEventData();\n }\n\n /**\n * @private\n * @param {Event} e Event object fired on mousedown\n */\n private _onMouseOut(e: TPointerEvent) {\n const target = this._hoveredTarget;\n const shared = {\n e,\n ...getEventPoints(this, e),\n };\n this.fire('mouse:out', { ...shared, target });\n this._hoveredTarget = undefined;\n target && target.fire('mouseout', { ...shared });\n this._hoveredTargets.forEach((nestedTarget) => {\n this.fire('mouse:out', { ...shared, target: nestedTarget });\n nestedTarget && nestedTarget.fire('mouseout', { ...shared });\n });\n this._hoveredTargets = [];\n }\n\n /**\n * @private\n * Used when the mouse cursor enter the canvas from outside\n * @param {Event} e Event object fired on mouseenter\n */\n private _onMouseEnter(e: TPointerEvent) {\n // This find target and consequent 'mouse:over' is used to\n // clear old instances on hovered target.\n // calling findTarget has the side effect of killing target.__corner.\n // as a short term fix we are not firing this if we are currently transforming.\n // as a long term fix we need to separate the action of finding a target with the\n // side effects we added to it.\n const { target } = this.findTarget(e);\n // we fire the event only when there is no target, if there is a target, the specific\n // target event will fire.\n if (!this._currentTransform && !target) {\n this.fire('mouse:over', {\n e,\n ...getEventPoints(this, e),\n });\n this._hoveredTarget = undefined;\n this._hoveredTargets = [];\n }\n }\n\n /**\n * supports native like text dragging\n * @private\n * @param {DragEvent} e\n */\n private _onDragStart(e: DragEvent) {\n this._isClick = false;\n const activeObject = this.getActiveObject();\n if (activeObject && activeObject.onDragStart(e)) {\n this._dragSource = activeObject;\n const options = { e, target: activeObject };\n this.fire('dragstart', options);\n activeObject.fire('dragstart', options);\n addListener(\n this.upperCanvasEl,\n 'drag',\n this._onDragProgress as EventListener,\n );\n return;\n }\n stopEvent(e);\n }\n\n /**\n * First we clear top context where the effects are being rendered.\n * Then we render the effects.\n * Doing so will render the correct effect for all cases including an overlap between `source` and `target`.\n * @private\n */\n private _renderDragEffects(\n e: DragEvent,\n source?: FabricObject,\n target?: FabricObject,\n ) {\n let dirty = false;\n // clear top context\n const dropTarget = this._dropTarget;\n if (dropTarget && dropTarget !== source && dropTarget !== target) {\n dropTarget.clearContextTop();\n dirty = true;\n }\n source?.clearContextTop();\n target !== source && target?.clearContextTop();\n // render effects\n const ctx = this.contextTop;\n ctx.save();\n ctx.transform(...this.viewportTransform);\n if (source) {\n ctx.save();\n source.transform(ctx);\n source.renderDragSourceEffect(e);\n ctx.restore();\n dirty = true;\n }\n if (target) {\n ctx.save();\n target.transform(ctx);\n target.renderDropTargetEffect(e);\n ctx.restore();\n dirty = true;\n }\n ctx.restore();\n dirty && (this.contextTopDirty = true);\n }\n\n /**\n * supports native like text dragging\n * https://developer.mozilla.org/en-US/docs/Web/API/HTML_Drag_and_Drop_API/Drag_operations#finishing_a_drag\n * @private\n * @param {DragEvent} e\n */\n private _onDragEnd(e: DragEvent) {\n const { currentSubTargets } = this.findTarget(e);\n const didDrop = !!e.dataTransfer && e.dataTransfer.dropEffect !== NONE,\n dropTarget = didDrop ? this._activeObject : undefined,\n options = {\n e,\n target: this._dragSource as FabricObject,\n subTargets: currentSubTargets,\n dragSource: this._dragSource as FabricObject,\n didDrop,\n dropTarget: dropTarget as FabricObject,\n };\n removeListener(\n this.upperCanvasEl,\n 'drag',\n this._onDragProgress as EventListener,\n );\n this.fire('dragend', options);\n this._dragSource && this._dragSource.fire('dragend', options);\n delete this._dragSource;\n // we need to call mouse up synthetically because the browser won't\n this._onMouseUp(e);\n }\n\n /**\n * fire `drag` event on canvas and drag source\n * @private\n * @param {DragEvent} e\n */\n private _onDragProgress(e: DragEvent) {\n const options = {\n e,\n target: this._dragSource,\n dragSource: this._dragSource,\n dropTarget: this._draggedoverTarget as FabricObject,\n };\n this.fire('drag', options);\n this._dragSource && this._dragSource.fire('drag', options);\n }\n\n /**\n * prevent default to allow drop event to be fired\n * https://developer.mozilla.org/en-US/docs/Web/API/HTML_Drag_and_Drop_API/Drag_operations#specifying_drop_targets\n * @private\n * @param {DragEvent} [e] Event object fired on Event.js shake\n */\n private _onDragOver(e: DragEvent) {\n const eventType = 'dragover';\n const { currentContainer: target, currentSubTargets } = this.findTarget(e);\n const dragSource = this._dragSource as FabricObject;\n const options = {\n e,\n target,\n subTargets: currentSubTargets,\n dragSource,\n canDrop: false,\n dropTarget: undefined,\n };\n let dropTarget;\n // fire on canvas\n this.fire(eventType, options);\n // make sure we fire dragenter events before dragover\n // if dragleave is needed, object will not fire dragover so we don't need to trouble ourselves with it\n this._fireEnterLeaveEvents(e, target, options);\n if (target) {\n if (target.canDrop(e)) {\n dropTarget = target;\n }\n target.fire(eventType, options);\n }\n // propagate the event to subtargets\n for (let i = 0; i < currentSubTargets.length; i++) {\n const subTarget = currentSubTargets[i];\n // accept event only if previous targets didn't (the accepting target calls `preventDefault` to inform that the event is taken)\n // TODO: verify if those should loop in inverse order then?\n // what is the order of subtargets?\n if (subTarget.canDrop(e)) {\n dropTarget = subTarget;\n }\n subTarget.fire(eventType, options);\n }\n // render drag effects now that relations between source and target is clear\n this._renderDragEffects(e, dragSource, dropTarget);\n this._dropTarget = dropTarget;\n }\n\n /**\n * fire `dragleave` on `dragover` targets\n * @private\n * @param {Event} [e] Event object fired on Event.js shake\n */\n private _onDragEnter(e: DragEvent) {\n const { currentContainer, currentSubTargets } = this.findTarget(e);\n const options = {\n e,\n target: currentContainer,\n subTargets: currentSubTargets,\n dragSource: this._dragSource,\n };\n this.fire('dragenter', options);\n // fire dragenter on targets\n this._fireEnterLeaveEvents(e, currentContainer, options);\n }\n\n /**\n * fire `dragleave` on `dragover` targets\n * @private\n * @param {Event} [e] Event object fired on Event.js shake\n */\n private _onDragLeave(e: DragEvent) {\n const { currentSubTargets } = this.findTarget(e);\n const options = {\n e,\n target: this._draggedoverTarget,\n subTargets: currentSubTargets,\n dragSource: this._dragSource,\n };\n this.fire('dragleave', options);\n\n // fire dragleave on targets\n this._fireEnterLeaveEvents(e, undefined, options);\n this._renderDragEffects(e, this._dragSource);\n this._dropTarget = undefined;\n this._hoveredTargets = [];\n }\n\n /**\n * `drop:before` is a an event that allows you to schedule logic\n * before the `drop` event. Prefer `drop` event always, but if you need\n * to run some drop-disabling logic on an event, since there is no way\n * to handle event handlers ordering, use `drop:before`\n * @private\n * @param {Event} e\n */\n private _onDrop(e: DragEvent) {\n const { currentContainer, currentSubTargets } = this.findTarget(e);\n const options = this._basicEventHandler('drop:before', {\n e,\n target: currentContainer,\n subTargets: currentSubTargets,\n dragSource: this._dragSource,\n ...getEventPoints(this, e),\n });\n // will be set by the drop target\n options.didDrop = false;\n // will be set by the drop target, used in case options.target refuses the drop\n options.dropTarget = undefined;\n // fire `drop`\n this._basicEventHandler('drop', options);\n // inform canvas of the drop\n // we do this because canvas was unaware of what happened at the time the `drop` event was fired on it\n // use for side effects\n this.fire('drop:after', options);\n }\n\n /**\n * @private\n * @param {Event} e Event object fired on mousedown\n */\n private _onContextMenu(e: TPointerEvent): false {\n const { target, subTargets } = this.findTarget(e);\n const options = this._basicEventHandler('contextmenu:before', {\n e,\n target,\n subTargets,\n });\n // TODO: this line is silly because the dev can subscribe to the event and prevent it themselves\n this.stopContextMenu && stopEvent(e);\n this._basicEventHandler('contextmenu', options);\n return false;\n }\n\n /**\n * @private\n * @param {Event} e Event object fired on mousedown\n */\n private _onClick(e: TPointerEvent) {\n const clicks = e.detail;\n if (clicks > 3 || clicks < 2) return;\n this._cacheTransformEventData(e);\n clicks == 2 && e.type === 'dblclick' && this._onDblClick(e);\n clicks == 3 && this._handleEvent(e, 'tripleclick');\n this._resetTransformEventData();\n }\n\n /**\n * 双击选择锁定组的子节点\n * @param e\n */\n private _onDblClick(e: TPointerEvent) {\n if (this.dblClickLock(e)) {\n // 锁定后立即选中点击子对象\n this._resetTransformEventData();\n this.__onMouseDown(e);\n this.__onMouseUp(e);\n return;\n }\n this._handleEvent(e, 'dblclick');\n }\n\n /**\n * Return a the id of an event.\n * returns either the pointerId or the identifier or 0 for the mouse event\n * @private\n * @param {Event} evt Event object\n */\n getPointerId(evt: TouchEvent | PointerEvent): number {\n const changedTouches = (evt as TouchEvent).changedTouches;\n\n if (changedTouches) {\n return changedTouches[0] && changedTouches[0].identifier;\n }\n\n if (this.enablePointerEvents) {\n return (evt as PointerEvent).pointerId;\n }\n\n return -1;\n }\n\n /**\n * Determines if an event has the id of the event that is considered main\n * @private\n * @param {evt} event Event object\n */\n _isMainEvent(evt: TPointerEvent): boolean {\n if ((evt as PointerEvent).isPrimary === true) {\n return true;\n }\n if ((evt as PointerEvent).isPrimary === false) {\n return false;\n }\n if (evt.type === 'touchend' && (evt as TouchEvent).touches.length === 0) {\n return true;\n }\n if ((evt as TouchEvent).changedTouches) {\n return (\n (evt as TouchEvent).changedTouches[0].identifier === this.mainTouchId\n );\n }\n return true;\n }\n\n /**\n * @private\n * @param {Event} e Event object fired on mousedown\n */\n _onTouchStart(e: TouchEvent) {\n this._cacheTransformEventData(e);\n // we will prevent scrolling if allowTouchScrolling is not enabled and\n let shouldPreventScrolling = !this.allowTouchScrolling;\n const currentActiveObject = this._activeObject;\n if (this.mainTouchId === undefined) {\n this.mainTouchId = this.getPointerId(e);\n }\n this.__onMouseDown(e);\n const { target } = this.findTarget(e);\n // after executing fabric logic for mouse down let's see\n // if we didn't change target or if we are drawing\n // we want to prevent scrolling anyway\n if (\n this.isDrawingMode ||\n (currentActiveObject && target === currentActiveObject)\n ) {\n shouldPreventScrolling = true;\n }\n // prevent default, will block scrolling from start\n shouldPreventScrolling && e.preventDefault();\n const canvasElement = this.upperCanvasEl,\n eventTypePrefix = this._getEventPrefix();\n const doc = getDocumentFromElement(canvasElement);\n addListener(\n doc,\n 'touchend',\n this._onTouchEnd as EventListener,\n addEventOptions,\n );\n // if we scroll don't register the touch move event\n shouldPreventScrolling &&\n addListener(\n doc,\n 'touchmove',\n this._onMouseMove as EventListener,\n addEventOptions,\n );\n // Unbind mousedown to prevent double triggers from touch devices\n removeListener(\n canvasElement,\n `${eventTypePrefix}down`,\n this._onMouseDown as EventListener,\n );\n this._resetTransformEventData();\n }\n\n /**\n * @private\n * @param {Event} e Event object fired on mousedown\n */\n _onMouseDown(e: TPointerEvent) {\n this._cacheTransformEventData(e);\n this.__onMouseDown(e);\n const canvasElement = this.upperCanvasEl,\n eventTypePrefix = this._getEventPrefix();\n // switch from moving on the canvas element to moving on the document\n removeListener(\n canvasElement,\n `${eventTypePrefix}move`,\n this._onMouseMove as EventListener,\n addEventOptions,\n );\n const doc = getDocumentFromElement(canvasElement);\n addListener(doc, `${eventTypePrefix}up`, this._onMouseUp as EventListener);\n addListener(\n doc,\n `${eventTypePrefix}move`,\n this._onMouseMove as EventListener,\n addEventOptions,\n );\n this._resetTransformEventData();\n }\n\n /**\n * @private\n * @param {Event} e Event object fired on mousedown\n */\n _onTouchEnd(e: TouchEvent) {\n if (e.touches.length > 0) {\n // if there are still touches stop here\n return;\n }\n this._cacheTransformEventData(e);\n this.__onMouseUp(e);\n this._resetTransformEventData();\n delete this.mainTouchId;\n const eventTypePrefix = this._getEventPrefix();\n const doc = getDocumentFromElement(this.upperCanvasEl);\n removeListener(\n doc,\n 'touchend',\n this._onTouchEnd as EventListener,\n addEventOptions,\n );\n removeListener(\n doc,\n 'touchmove',\n this._onMouseMove as EventListener,\n addEventOptions,\n );\n if (this._willAddMouseDown) {\n clearTimeout(this._willAddMouseDown);\n }\n this._willAddMouseDown = setTimeout(() => {\n // Wait 400ms before rebinding mousedown to prevent double triggers\n // from touch devices\n addListener(\n this.upperCanvasEl,\n `${eventTypePrefix}down`,\n this._onMouseDown as EventListener,\n );\n this._willAddMouseDown = 0;\n }, 400) as unknown as number;\n }\n\n /**\n * @private\n * @param {Event} e Event object fired on mouseup\n */\n _onMouseUp(e: TPointerEvent) {\n this._cacheTransformEventData(e);\n this.__onMouseUp(e);\n const canvasElement = this.upperCanvasEl,\n eventTypePrefix = this._getEventPrefix();\n if (this._isMainEvent(e)) {\n const doc = getDocumentFromElement(this.upperCanvasEl);\n removeListener(\n doc,\n `${eventTypePrefix}up`,\n this._onMouseUp as EventListener,\n );\n removeListener(\n doc,\n `${eventTypePrefix}move`,\n this._onMouseMove as EventListener,\n addEventOptions,\n );\n addListener(\n canvasElement,\n `${eventTypePrefix}move`,\n this._onMouseMove as EventListener,\n addEventOptions,\n );\n }\n this._resetTransformEventData();\n }\n\n /**\n * @private\n * @param {Event} e Event object fired on mousemove\n */\n _onMouseMove(e: TPointerEvent) {\n this._cacheTransformEventData(e);\n\n const activeObject = this.getActiveObject();\n !this.allowTouchScrolling &&\n (!activeObject ||\n // a drag event sequence is started by the active object flagging itself on mousedown / mousedown:before\n // we must not prevent the event's default behavior in order for the window to start dragging\n !activeObject.shouldStartDragging(e)) &&\n e.preventDefault &&\n e.preventDefault();\n this.__onMouseMove(e);\n this._resetTransformEventData();\n }\n\n /**\n * @private\n */\n _onResize() {\n this.calcOffset();\n this._resetTransformEventData();\n }\n\n /**\n * Decides whether the canvas should be redrawn in mouseup and mousedown events.\n * @private\n * @param {Object} target\n */\n _shouldRender(target: FabricObject | undefined) {\n const activeObject = this.getActiveObject();\n // if just one of them is available or if they are both but are different objects\n // this covers: switch of target, from target to no target, selection of target\n // multiSelection with key and mouse\n return (\n !!activeObject !== !!target ||\n (activeObject && target && activeObject !== target)\n );\n }\n\n /**\n * Method that defines the actions when mouse is released on canvas.\n * The method resets the currentTransform parameters, store the image corner\n * position in the image object and render the canvas on top.\n * @private\n * @param {Event} e Event object fired on mouseup\n */\n __onMouseUp(e: TPointerEvent) {\n this._handleEvent(e, 'up:before');\n\n const transform = this._currentTransform;\n const isClick = this._isClick;\n const { target } = this.findTarget(e);\n\n // if right/middle click just fire events and return\n // target undefined will make the _handleEvent search the target\n const { button } = e as MouseEvent;\n if (button) {\n ((this.fireMiddleClick && button === 1) ||\n (this.fireRightClick && button === 2)) &&\n this._handleEvent(e, 'up');\n return;\n }\n\n if (this.isDrawingMode && this._isCurrentlyDrawing) {\n this._onMouseUpInDrawingMode(e);\n return;\n }\n\n if (!this._isMainEvent(e)) {\n return;\n }\n let shouldRender = false;\n if (transform) {\n this._finalizeCurrentTransform(e);\n shouldRender = transform.actionPerformed;\n }\n if (!isClick) {\n const targetWasActive = target === this._activeObject;\n this.handleSelection(e);\n if (!shouldRender) {\n shouldRender =\n this._shouldRender(target) ||\n (!targetWasActive && target === this._activeObject);\n }\n }\n let pointer, corner;\n if (target) {\n const found = target.findControl(\n this.getViewportPoint(e),\n isTouchEvent(e),\n );\n const { key, control } = found || {};\n corner = key;\n if (\n target.selectable &&\n target !== this._activeObject &&\n target.activeOn === 'up'\n ) {\n this.setActiveObject(target, e);\n shouldRender = true;\n } else if (control) {\n const mouseUpHandler = control.getMouseUpHandler(e, target, control);\n if (mouseUpHandler) {\n pointer = this.getScenePoint(e);\n mouseUpHandler.call(control, e, transform!, pointer.x, pointer.y);\n }\n }\n target.isMoving = false;\n }\n // if we are ending up a transform on a different control or a new object\n // fire the original mouse up from the corner that started the transform\n if (\n transform &&\n (transform.target !== target || transform.corner !== corner)\n ) {\n const originalControl =\n transform.target && transform.target.controls[transform.corner],\n originalMouseUpHandler =\n originalControl &&\n originalControl.getMouseUpHandler(\n e,\n transform.target,\n originalControl,\n );\n pointer = pointer || this.getScenePoint(e);\n originalMouseUpHandler &&\n originalMouseUpHandler.call(\n originalControl,\n e,\n transform,\n pointer.x,\n pointer.y,\n );\n }\n this._setCursorFromEvent(e, target);\n this._handleEvent(e, 'up');\n this._groupSelector = null;\n this._currentTransform = null;\n // reset the target information about which corner is selected\n target && (target.__corner = undefined);\n if (shouldRender) {\n this.requestRenderAll();\n } else if (!isClick && !(this._activeObject as IText)?.isEditing) {\n this.renderTop();\n }\n }\n\n _basicEventHandler(\n eventType: T,\n options: (CanvasEvents & ObjectEvents)[T],\n ) {\n const { target, subTargets = [] } = options as {\n target?: FabricObject;\n subTargets: FabricObject[];\n };\n this.fire(eventType, options);\n target && target.fire(eventType, options);\n for (let i = 0; i < subTargets.length; i++) {\n subTargets[i] !== target && subTargets[i].fire(eventType, options);\n }\n return options;\n }\n\n /**\n * @private\n * Handle event firing for target and subtargets\n * @param {TPointerEvent} e event from mouse\n * @param {TPointerEventNames} eventType\n */\n _handleEvent(\n e: TPointerEvent,\n eventType: T,\n extraData?: TEventsExtraData[T],\n ) {\n const { target, subTargets } = this.findTarget(e),\n options: CanvasEvents[`mouse:${T}`] = {\n e,\n target,\n subTargets,\n ...getEventPoints(this, e),\n transform: this._currentTransform,\n ...(eventType === 'down:before' || eventType === 'down'\n ? extraData\n : {}),\n } as CanvasEvents[`mouse:${T}`];\n if (eventType === 'up:before' || eventType === 'up') {\n (options as CanvasEvents[`mouse:up`]).isClick = this._isClick;\n }\n this.fire(`mouse:${eventType}`, options);\n // this may be a little be more complicated of what we want to handle\n target && target.fire(`mouse${eventType}`, options);\n for (let i = 0; i < subTargets.length; i++) {\n subTargets[i] !== target &&\n subTargets[i].fire(`mouse${eventType}`, options);\n }\n }\n\n /**\n * @private\n * @param {Event} e Event object fired on mousedown\n */\n _onMouseDownInDrawingMode(e: TPointerEvent) {\n this._isCurrentlyDrawing = true;\n if (this.getActiveObject()) {\n this.discardActiveObject(e);\n this.requestRenderAll();\n }\n // TODO: this is a scene point so it should be renamed\n const pointer = this.getScenePoint(e);\n this.freeDrawingBrush &&\n this.freeDrawingBrush.onMouseDown(pointer, { e, pointer });\n this._handleEvent(e, 'down', { alreadySelected: false });\n }\n\n /**\n * @private\n * @param {Event} e Event object fired on mousemove\n */\n _onMouseMoveInDrawingMode(e: TPointerEvent) {\n if (this._isCurrentlyDrawing) {\n const pointer = this.getScenePoint(e);\n this.freeDrawingBrush &&\n this.freeDrawingBrush.onMouseMove(pointer, {\n e,\n // this is an absolute pointer, the naming is wrong\n pointer,\n });\n }\n this.setCursor(this.freeDrawingCursor);\n this._handleEvent(e, 'move');\n }\n\n /**\n * @private\n * @param {Event} e Event object fired on mouseup\n */\n _onMouseUpInDrawingMode(e: TPointerEvent) {\n const pointer = this.getScenePoint(e);\n if (this.freeDrawingBrush) {\n this._isCurrentlyDrawing = !!this.freeDrawingBrush.onMouseUp({\n e: e,\n // this is an absolute pointer, the naming is wrong\n pointer,\n });\n } else {\n this._isCurrentlyDrawing = false;\n }\n this._handleEvent(e, 'up');\n }\n\n /**\n * Method that defines the actions when mouse is clicked on canvas.\n * The method inits the currentTransform parameters and renders all the\n * canvas so the current image can be placed on the top canvas and the rest\n * in on the container one.\n * @private\n * @param {Event} e Event object fired on mousedown\n */\n __onMouseDown(e: TPointerEvent) {\n this._isClick = true;\n this._handleEvent(e, 'down:before');\n\n let { target } = this.findTarget(e);\n let alreadySelected = !!target && target === this._activeObject;\n // if right/middle click just fire events\n const { button } = e as MouseEvent;\n if (button) {\n ((this.fireMiddleClick && button === 1) ||\n (this.fireRightClick && button === 2)) &&\n this._handleEvent(e, 'down', {\n alreadySelected,\n });\n return;\n }\n\n if (this.isDrawingMode) {\n this._onMouseDownInDrawingMode(e);\n return;\n }\n\n if (!this._isMainEvent(e)) {\n return;\n }\n\n // ignore if some object is being transformed at this moment\n if (this._currentTransform) {\n return;\n }\n\n let shouldRender = this._shouldRender(target);\n let grouped = false;\n if (this.handleMultiSelection(e, target)) {\n // active object might have changed while grouping\n target = this._activeObject;\n grouped = true;\n shouldRender = true;\n } else if (this._shouldClearSelection(e, target)) {\n this.discardActiveObject(e);\n\n // 锁定对象时且没有指定选中时,如果点击组外空白或对象,取消锁定\n if (this.isolatedObject && !this._searchTargets) {\n this.setSearchTargets([this.isolatedObject]);\n const { target } = this.findTarget(e);\n // 没有选中任何对象,或者选中的是锁定对象以外的对象\n if (target !== this.isolatedObject) {\n this.isolatedObject = null;\n }\n this.setSearchTargets(null);\n // 在此执行__onMouseDown选中其他对象\n this._resetTransformEventData();\n this.__onMouseDown(e);\n return;\n }\n }\n // we start a group selector rectangle if\n // selection is enabled\n // and there is no target, or the following 3 conditions are satisfied:\n // target is not selectable ( otherwise we selected it )\n // target is not editing\n // target is not already selected ( otherwise we drag )\n if (\n this.selection &&\n (!target ||\n (!target.selectable &&\n !(target as IText).isEditing &&\n target !== this._activeObject))\n ) {\n const p = this.getScenePoint(e);\n this._groupSelector = {\n x: p.x,\n y: p.y,\n deltaY: 0,\n deltaX: 0,\n };\n }\n\n // check again because things could have changed\n alreadySelected = !!target && target === this._activeObject;\n if (target) {\n if (target.selectable && target.activeOn === 'down') {\n this.setActiveObject(target, e);\n }\n const handle = target.findControl(\n this.getViewportPoint(e),\n isTouchEvent(e),\n );\n if (target === this._activeObject && (handle || !grouped)) {\n this._setupCurrentTransform(e, target, alreadySelected);\n const control = handle ? handle.control : undefined,\n pointer = this.getScenePoint(e),\n mouseDownHandler =\n control && control.getMouseDownHandler(e, target, control);\n mouseDownHandler &&\n mouseDownHandler.call(\n control,\n e,\n this._currentTransform!,\n pointer.x,\n pointer.y,\n );\n }\n }\n // we clear `_objectsToRender` in case of a change in order to repopulate it at rendering\n // run before firing the `down` event to give the dev a chance to populate it themselves\n shouldRender && (this._objectsToRender = undefined);\n this._handleEvent(e, 'down', { alreadySelected: alreadySelected });\n // we must renderAll so that we update the visuals\n shouldRender && this.requestRenderAll();\n }\n\n /**\n * reset cache form common information needed during event processing\n * @private\n */\n _resetTransformEventData() {\n this._targetInfo = this._viewportPoint = this._scenePoint = undefined;\n }\n\n /**\n * Cache common information needed during event processing\n * @private\n * @param {Event} e Event object fired on event\n */\n _cacheTransformEventData(e: TPointerEvent) {\n // reset in order to avoid stale caching\n this._resetTransformEventData();\n this._viewportPoint = this.getViewportPoint(e);\n this._scenePoint = sendPointToPlane(\n this._viewportPoint,\n undefined,\n this.viewportTransform,\n );\n this._targetInfo = this.findTarget(e);\n // TODO: investigate better if this can be made less implicit in the code\n if (this._currentTransform) {\n this._targetInfo.target = this._currentTransform.target;\n }\n }\n\n /**\n * Method that defines the actions when mouse is hovering the canvas.\n * The currentTransform parameter will define whether the user is rotating/scaling/translating\n * an image or neither of them (only hovering). A group selection is also possible and would cancel\n * all any other type of action.\n * In case of an image transformation only the top canvas will be rendered.\n * @private\n * @param {Event} e Event object fired on mousemove\n */\n __onMouseMove(e: TPointerEvent) {\n this._isClick = false;\n this._handleEvent(e, 'move:before');\n\n if (this.isDrawingMode) {\n this._onMouseMoveInDrawingMode(e);\n return;\n }\n\n if (!this._isMainEvent(e)) {\n return;\n }\n\n const groupSelector = this._groupSelector;\n\n // We initially clicked in an empty area, so we draw a box for multiple selection\n if (groupSelector) {\n const pointer = this.getScenePoint(e);\n\n groupSelector.deltaX = pointer.x - groupSelector.x;\n groupSelector.deltaY = pointer.y - groupSelector.y;\n\n this.renderTop();\n } else if (!this._currentTransform) {\n const { target } = this.findTarget(e);\n this._setCursorFromEvent(e, target);\n this._fireOverOutEvents(e, target);\n } else {\n this._transformObject(e);\n }\n this.textEditingManager.onMouseMove(e);\n this._handleEvent(e, 'move');\n }\n\n /**\n * Manage the mouseout, mouseover events for the fabric object on the canvas\n * @param {Fabric.Object} target the target where the target from the mousemove event\n * @param {Event} e Event object fired on mousemove\n * @private\n */\n _fireOverOutEvents(e: TPointerEvent, target?: FabricObject) {\n const { _hoveredTarget, _hoveredTargets } = this,\n { subTargets } = this.findTarget(e),\n length = Math.max(_hoveredTargets.length, subTargets.length);\n\n this.fireSyntheticInOutEvents('mouse', {\n e,\n target,\n oldTarget: _hoveredTarget,\n fireCanvas: true,\n });\n for (let i = 0; i < length; i++) {\n if (\n subTargets[i] === target ||\n (_hoveredTargets[i] && _hoveredTargets[i] === _hoveredTarget)\n ) {\n continue;\n }\n this.fireSyntheticInOutEvents('mouse', {\n e,\n target: subTargets[i],\n oldTarget: _hoveredTargets[i],\n });\n }\n this._hoveredTarget = target;\n this._hoveredTargets = subTargets;\n }\n\n /**\n * Manage the dragEnter, dragLeave events for the fabric objects on the canvas\n * @param {Fabric.Object} target the target where the target from the onDrag event\n * @param {Object} data Event object fired on dragover\n * @private\n */\n _fireEnterLeaveEvents(\n e: TPointerEvent,\n target: FabricObject | undefined,\n data: DragEventData,\n ) {\n const draggedoverTarget = this._draggedoverTarget,\n _hoveredTargets = this._hoveredTargets,\n { subTargets } = this.findTarget(e),\n length = Math.max(_hoveredTargets.length, subTargets.length);\n\n this.fireSyntheticInOutEvents('drag', {\n ...data,\n target,\n oldTarget: draggedoverTarget,\n fireCanvas: true,\n });\n for (let i = 0; i < length; i++) {\n this.fireSyntheticInOutEvents('drag', {\n ...data,\n target: subTargets[i],\n oldTarget: _hoveredTargets[i],\n });\n }\n this._draggedoverTarget = target;\n }\n\n /**\n * Manage the synthetic in/out events for the fabric objects on the canvas\n * @param {Fabric.Object} target the target where the target from the supported events\n * @param {Object} data Event object fired\n * @param {Object} config configuration for the function to work\n * @param {String} config.targetName property on the canvas where the old target is stored\n * @param {String} [config.canvasEvtOut] name of the event to fire at canvas level for out\n * @param {String} config.evtOut name of the event to fire for out\n * @param {String} [config.canvasEvtIn] name of the event to fire at canvas level for in\n * @param {String} config.evtIn name of the event to fire for in\n * @private\n */\n fireSyntheticInOutEvents(\n type: T,\n {\n target,\n oldTarget,\n fireCanvas,\n e,\n ...data\n }: TSyntheticEventContext[T] & {\n target?: FabricObject;\n oldTarget?: FabricObject;\n fireCanvas?: boolean;\n },\n ) {\n const { targetIn, targetOut, canvasIn, canvasOut } =\n syntheticEventConfig[type];\n const targetChanged = oldTarget !== target;\n\n if (oldTarget && targetChanged) {\n const outOpt: CanvasEvents[typeof canvasOut] = {\n ...data,\n e,\n target: oldTarget,\n nextTarget: target,\n ...getEventPoints(this, e),\n };\n fireCanvas && this.fire(canvasOut, outOpt);\n oldTarget.fire(targetOut, outOpt);\n }\n if (target && targetChanged) {\n const inOpt: CanvasEvents[typeof canvasIn] = {\n ...data,\n e,\n target,\n previousTarget: oldTarget,\n ...getEventPoints(this, e),\n };\n fireCanvas && this.fire(canvasIn, inOpt);\n target.fire(targetIn, inOpt);\n }\n }\n\n /**\n * @private\n * @param {Event} e Event fired on mousemove\n */\n _transformObject(e: TPointerEvent) {\n const scenePoint = this.getScenePoint(e),\n transform = this._currentTransform!,\n target = transform.target,\n // transform pointer to target's containing coordinate plane\n // both pointer and object should agree on every point\n localPointer = target.group\n ? sendPointToPlane(\n scenePoint,\n undefined,\n target.group.calcTransformMatrix(),\n )\n : scenePoint;\n transform.shiftKey = e.shiftKey;\n transform.altKey = !!this.centeredKey && e[this.centeredKey];\n\n this._performTransformAction(e, transform, localPointer);\n transform.actionPerformed && this.requestRenderAll();\n }\n\n /**\n * @private\n */\n _performTransformAction(\n e: TPointerEvent,\n transform: Transform,\n pointer: Point,\n ) {\n const { action, actionHandler, target } = transform;\n\n const actionPerformed =\n !!actionHandler && actionHandler(e, transform, pointer.x, pointer.y);\n actionPerformed && target.setCoords();\n\n // this object could be created from the function in the control handlers\n if (action === 'drag' && actionPerformed) {\n transform.target.isMoving = true;\n this.setCursor(transform.target.moveCursor || this.moveCursor);\n }\n transform.actionPerformed = transform.actionPerformed || actionPerformed;\n }\n\n /**\n * Sets the cursor depending on where the canvas is being hovered.\n * Note: very buggy in Opera\n * @param {Event} e Event object\n * @param {Object} target Object that the mouse is hovering, if so.\n */\n _setCursorFromEvent(e: TPointerEvent, target?: FabricObject) {\n if (!target) {\n this.setCursor(this.defaultCursor);\n return;\n }\n let hoverCursor = target.hoverCursor || this.hoverCursor;\n const activeSelection = isActiveSelection(this._activeObject)\n ? this._activeObject\n : null,\n // only show proper corner when group selection is not active\n corner =\n (!activeSelection || target.group !== activeSelection) &&\n // here we call findTargetCorner always with undefined for the touch parameter.\n // we assume that if you are using a cursor you do not need to interact with\n // the bigger touch area.\n target.findControl(this.getViewportPoint(e));\n\n if (!corner) {\n if ((target as Group).subTargetCheck) {\n // hoverCursor should come from top-most subTarget,\n // so we walk the array backwards\n const { subTargets } = this.findTarget(e);\n subTargets\n .concat()\n .reverse()\n .forEach((_target) => {\n hoverCursor = _target.hoverCursor || hoverCursor;\n });\n }\n this.setCursor(hoverCursor);\n } else {\n const { control, coord } = corner;\n this.setCursor(control.cursorStyleHandler(e, control, target, coord));\n }\n }\n\n /**\n * ## Handles multiple selection\n * - toggles `target` selection (selects/deselects `target` if it isn't/is selected respectively)\n * - sets the active object in case it is not set or in case there is a single active object left under active selection.\n * ---\n * - If the active object is the active selection we add/remove `target` from it\n * - If not, add the active object and `target` to the active selection and make it the active object.\n * @TODO rewrite this after find target is refactored\n * @private\n * @param {TPointerEvent} e Event object\n * @param {FabricObject} target target of event to select/deselect\n * @returns true if grouping occurred\n */\n protected handleMultiSelection(e: TPointerEvent, target?: FabricObject) {\n const activeObject = this._activeObject;\n const isAS = isActiveSelection(activeObject);\n if (\n // check if an active object exists on canvas and if the user is pressing the `selectionKey` while canvas supports multi selection.\n !!activeObject &&\n this._isSelectionKeyPressed(e) &&\n this.selection &&\n // on top of that the user also has to hit a target that is selectable.\n !!target &&\n target.selectable &&\n // group target and active object only if they are different objects\n // else we try to find a subtarget of `ActiveSelection`\n (activeObject !== target || isAS) &&\n // make sure `activeObject` and `target` aren't ancestors of each other in case `activeObject` is not `ActiveSelection`\n // if it is then we want to remove `target` from it\n (isAS ||\n (!target.isDescendantOf(activeObject) &&\n !activeObject.isDescendantOf(target))) &&\n // target accepts selection\n !target.onSelect({ e }) &&\n // make sure we are not on top of a control\n !activeObject.getActiveControl()\n ) {\n if (isAS) {\n const prevActiveObjects = activeObject.getObjects();\n let subTargets: FabricObject[] = [];\n // const { subTargets: testSubTargets } = this.findTarget(e);\n if (target === activeObject) {\n const pointer = this.getScenePoint(e);\n let targetInfo = this.searchPossibleTargets(\n prevActiveObjects,\n pointer,\n );\n // console.log(testSubTargets.includes(targetInfo.target));\n if (targetInfo.target) {\n target = targetInfo.target;\n subTargets = targetInfo.subTargets;\n } else {\n targetInfo = this.searchPossibleTargets(this._objects, pointer);\n target = targetInfo.target;\n subTargets = targetInfo.subTargets;\n }\n // if nothing is found bail out\n if (!target || !target.selectable) {\n return false;\n }\n }\n if (target.group === activeObject) {\n // `target` is part of active selection => remove it\n activeObject.remove(target);\n this._hoveredTarget = target;\n this._hoveredTargets = subTargets;\n // if after removing an object we are left with one only...\n if (activeObject.size() === 1) {\n // activate last remaining object\n // deselecting the active selection will remove the remaining object from it\n this._setActiveObject(activeObject.item(0), e);\n }\n } else {\n // `target` isn't part of active selection => add it\n activeObject.multiSelectAdd(target);\n this._hoveredTarget = activeObject;\n this._hoveredTargets = subTargets;\n }\n this._fireSelectionEvents(prevActiveObjects, e);\n } else {\n (activeObject as IText).isEditing &&\n (activeObject as IText).exitEditing();\n // add the active object and the target to the active selection and set it as the active object\n const klass =\n classRegistry.getClass('ActiveSelection');\n const newActiveSelection = new klass([], {\n /**\n * it is crucial to pass the canvas ref before calling {@link ActiveSelection#multiSelectAdd}\n * since it uses {@link FabricObject#isInFrontOf} which relies on the canvas ref\n */\n canvas: this,\n });\n newActiveSelection.multiSelectAdd(activeObject, target);\n this._hoveredTarget = newActiveSelection;\n // ISSUE 4115: should we consider subTargets here?\n // this._hoveredTargets = [];\n // this._hoveredTargets = this.targets.concat();\n this._setActiveObject(newActiveSelection, e);\n this._fireSelectionEvents([activeObject], e);\n }\n return true;\n }\n return false;\n }\n\n /**\n * ## Handles selection\n * - selects objects that are contained in (and possibly intersecting) the selection bounding box\n * - sets the active object\n * ---\n * runs on mouse up after a mouse move\n */\n protected handleSelection(e: TPointerEvent) {\n if (!this.selection || !this._groupSelector) {\n return false;\n }\n const { x, y, deltaX, deltaY } = this._groupSelector,\n point1 = new Point(x, y),\n point2 = point1.add(new Point(deltaX, deltaY)),\n tl = point1.min(point2),\n br = point1.max(point2),\n size = br.subtract(tl);\n\n const collectedObjects = this.collectObjects(\n {\n left: tl.x,\n top: tl.y,\n width: size.x,\n height: size.y,\n },\n { includeIntersecting: !this.selectionFullyContained },\n ) as FabricObject[];\n\n const objects =\n // though this method runs only after mouse move the pointer could do a mouse up on the same position as mouse down\n // should it be handled as is?\n point1.eq(point2)\n ? collectedObjects[0]\n ? [collectedObjects[0]]\n : []\n : collectedObjects.length > 1\n ? collectedObjects\n .filter((object) => !object.onSelect({ e }))\n .reverse()\n : // `setActiveObject` will call `onSelect(collectedObjects[0])` in this case\n collectedObjects;\n\n // set active object\n if (objects.length === 1) {\n // set as active object\n this.setActiveObject(objects[0], e);\n } else if (objects.length > 1) {\n // add to active selection and make it the active object\n const klass =\n classRegistry.getClass('ActiveSelection');\n this.setActiveObject(new klass(objects, { canvas: this }), e);\n }\n\n // cleanup\n this._groupSelector = null;\n return true;\n }\n\n /**\n * @override clear {@link textEditingManager}\n */\n clear() {\n this.textEditingManager.clear();\n super.clear();\n }\n\n /**\n * @override clear {@link textEditingManager}\n */\n destroy() {\n this.removeListeners();\n this.textEditingManager.dispose();\n super.destroy();\n }\n}\n","export const linearDefaultCoords = {\n x1: 0,\n y1: 0,\n x2: 0,\n y2: 0,\n};\n\nexport const radialDefaultCoords = {\n ...linearDefaultCoords,\n r1: 0,\n r2: 0,\n};\n","/**\n *\n * @param value value to check if NaN\n * @param [valueIfNaN]\n * @returns `fallback` is `value is NaN\n */\nexport const ifNaN = (value: number, valueIfNaN?: number) => {\n return isNaN(value) && typeof valueIfNaN === 'number' ? valueIfNaN : value;\n};\n","import { ifNaN } from '../util/internals/ifNaN';\nimport { capValue } from '../util/misc/capValue';\n\nconst RE_PERCENT = /^(\\d+\\.\\d+)%|(\\d+)%$/;\n\nexport function isPercent(value: string | null) {\n return value && RE_PERCENT.test(value);\n}\n\n/**\n *\n * @param value\n * @param valueIfNaN\n * @returns ∈ [0, 1]\n */\nexport function parsePercent(\n value: string | number | null | undefined,\n valueIfNaN?: number,\n) {\n const parsed =\n typeof value === 'number'\n ? value\n : typeof value === 'string'\n ? parseFloat(value) / (isPercent(value) ? 100 : 1)\n : NaN;\n return capValue(0, ifNaN(parsed, valueIfNaN), 1);\n}\n","import { Color } from '../../color/Color';\nimport { parsePercent } from '../../parser/percent';\nimport { ifNaN } from '../../util/internals/ifNaN';\nimport type { ColorStop } from '../typedefs';\n\nconst RE_KEY_VALUE_PAIRS = /\\s*;\\s*/;\nconst RE_KEY_VALUE = /\\s*:\\s*/;\n\nfunction parseColorStop(el: SVGStopElement, opacityMultiplier: number) {\n let colorValue, opacityValue;\n const style = el.getAttribute('style');\n if (style) {\n const keyValuePairs = style.split(RE_KEY_VALUE_PAIRS);\n\n if (keyValuePairs[keyValuePairs.length - 1] === '') {\n keyValuePairs.pop();\n }\n\n for (let i = keyValuePairs.length; i--; ) {\n const [key, value] = keyValuePairs[i]\n .split(RE_KEY_VALUE)\n .map((s) => s.trim());\n if (key === 'stop-color') {\n colorValue = value;\n } else if (key === 'stop-opacity') {\n opacityValue = value;\n }\n }\n }\n\n colorValue = colorValue || el.getAttribute('stop-color') || 'rgb(0,0,0)';\n opacityValue = ifNaN(\n parseFloat(opacityValue || el.getAttribute('stop-opacity') || ''),\n 1,\n );\n\n const color = new Color(colorValue);\n\n color.setAlpha(color.getAlpha() * opacityValue * opacityMultiplier);\n\n return {\n offset: parsePercent(el.getAttribute('offset'), 0),\n color: color.toRgba(),\n };\n}\n\nexport function parseColorStops(\n el: SVGGradientElement,\n opacityAttr: string | null,\n) {\n const colorStops: ColorStop[] = [],\n colorStopEls = el.getElementsByTagName('stop'),\n multiplier = parsePercent(opacityAttr, 1);\n for (let i = colorStopEls.length; i--; ) {\n colorStops.push(parseColorStop(colorStopEls[i], multiplier));\n }\n return colorStops;\n}\n","import type { GradientType, GradientUnits } from '../typedefs';\n\nexport function parseType(el: SVGGradientElement): GradientType {\n return el.nodeName === 'linearGradient' || el.nodeName === 'LINEARGRADIENT'\n ? 'linear'\n : 'radial';\n}\n\nexport function parseGradientUnits(el: SVGGradientElement): GradientUnits {\n return el.getAttribute('gradientUnits') === 'userSpaceOnUse'\n ? 'pixels'\n : 'percentage';\n}\n","import { isPercent } from '../../parser/percent';\nimport type { TSize } from '../../typedefs';\nimport type { GradientCoords, GradientType, GradientUnits } from '../typedefs';\nimport { parseGradientUnits, parseType } from './misc';\n\nfunction convertPercentUnitsToValues<\n T extends GradientType,\n K extends keyof GradientCoords,\n>(\n valuesToConvert: Record,\n { width, height, gradientUnits }: TSize & { gradientUnits: GradientUnits },\n) {\n let finalValue;\n return (Object.keys(valuesToConvert) as K[]).reduce(\n (acc, prop) => {\n const propValue = valuesToConvert[prop];\n if (propValue === 'Infinity') {\n finalValue = 1;\n } else if (propValue === '-Infinity') {\n finalValue = 0;\n } else {\n finalValue =\n typeof propValue === 'string' ? parseFloat(propValue) : propValue;\n if (typeof propValue === 'string' && isPercent(propValue)) {\n finalValue *= 0.01;\n if (gradientUnits === 'pixels') {\n // then we need to fix those percentages here in svg parsing\n if (prop === 'x1' || prop === 'x2' || prop === 'r2') {\n finalValue *= width;\n }\n if (prop === 'y1' || prop === 'y2') {\n finalValue *= height;\n }\n }\n }\n }\n acc[prop] = finalValue;\n return acc;\n },\n {} as Record,\n );\n}\n\nfunction getValue(el: SVGGradientElement, key: string) {\n return el.getAttribute(key);\n}\n\nexport function parseLinearCoords(el: SVGGradientElement) {\n return {\n x1: getValue(el, 'x1') || 0,\n y1: getValue(el, 'y1') || 0,\n x2: getValue(el, 'x2') || '100%',\n y2: getValue(el, 'y2') || 0,\n };\n}\n\nexport function parseRadialCoords(el: SVGGradientElement) {\n return {\n x1: getValue(el, 'fx') || getValue(el, 'cx') || '50%',\n y1: getValue(el, 'fy') || getValue(el, 'cy') || '50%',\n r1: 0,\n x2: getValue(el, 'cx') || '50%',\n y2: getValue(el, 'cy') || '50%',\n r2: getValue(el, 'r') || '50%',\n };\n}\n\nexport function parseCoords(el: SVGGradientElement, size: TSize) {\n return convertPercentUnitsToValues(\n parseType(el) === 'linear' ? parseLinearCoords(el) : parseRadialCoords(el),\n {\n ...size,\n gradientUnits: parseGradientUnits(el),\n },\n );\n}\n","import { iMatrix } from '../constants';\nimport { parseTransformAttribute } from '../parser/parseTransformAttribute';\nimport type { FabricObject } from '../shapes/Object/FabricObject';\nimport type { TMat2D } from '../typedefs';\nimport { uid } from '../util/internals/uid';\nimport { pick } from '../util/misc/pick';\nimport { matrixToSVG } from '../util/misc/svgExport';\nimport { linearDefaultCoords, radialDefaultCoords } from './constants';\nimport { parseColorStops } from './parser/parseColorStops';\nimport { parseCoords } from './parser/parseCoords';\nimport { parseType, parseGradientUnits } from './parser/misc';\nimport type {\n ColorStop,\n GradientCoords,\n GradientOptions,\n GradientType,\n GradientUnits,\n SVGOptions,\n SerializedGradientProps,\n} from './typedefs';\nimport { classRegistry } from '../ClassRegistry';\nimport { isPath } from '../util/typeAssertions';\n\n/**\n * Gradient class\n * @class Gradient\n * @see {@link http://fabric5.fabricjs.com/fabric-intro-part-2#gradients}\n */\nexport class Gradient<\n S,\n T extends GradientType = S extends GradientType ? S : 'linear',\n> {\n /**\n * Horizontal offset for aligning gradients coming from SVG when outside pathgroups\n * @type Number\n * @default 0\n */\n declare offsetX: number;\n\n /**\n * Vertical offset for aligning gradients coming from SVG when outside pathgroups\n * @type Number\n * @default 0\n */\n declare offsetY: number;\n\n /**\n * A transform matrix to apply to the gradient before painting.\n * Imported from svg gradients, is not applied with the current transform in the center.\n * Before this transform is applied, the origin point is at the top left corner of the object\n * plus the addition of offsetY and offsetX.\n * @type Number[]\n * @default null\n */\n declare gradientTransform?: TMat2D;\n\n /**\n * coordinates units for coords.\n * If `pixels`, the number of coords are in the same unit of width / height.\n * If set as `percentage` the coords are still a number, but 1 means 100% of width\n * for the X and 100% of the height for the y. It can be bigger than 1 and negative.\n * allowed values pixels or percentage.\n * @type GradientUnits\n * @default 'pixels'\n */\n declare gradientUnits: GradientUnits;\n\n /**\n * Gradient type linear or radial\n * @type GradientType\n * @default 'linear'\n */\n declare type: T;\n\n /**\n * Defines how the gradient is located in space and spread\n * @type GradientCoords\n */\n declare coords: GradientCoords;\n\n /**\n * Defines how many colors a gradient has and how they are located on the axis\n * defined by coords\n * @type GradientCoords\n */\n declare colorStops: ColorStop[];\n\n /**\n * If true, this object will not be exported during the serialization of a canvas\n * @type boolean\n */\n declare excludeFromExport?: boolean;\n\n /**\n * ID used for SVG export functionalities\n * @type number | string\n */\n declare readonly id: string | number;\n\n static type = 'Gradient';\n\n constructor(options: GradientOptions) {\n const {\n type = 'linear' as T,\n gradientUnits = 'pixels',\n coords = {},\n colorStops = [],\n offsetX = 0,\n offsetY = 0,\n gradientTransform,\n id,\n } = options || {};\n Object.assign(this, {\n type,\n gradientUnits,\n coords: {\n ...(type === 'radial' ? radialDefaultCoords : linearDefaultCoords),\n ...coords,\n },\n colorStops,\n offsetX,\n offsetY,\n gradientTransform,\n id: id ? `${id}_${uid()}` : uid(),\n });\n }\n\n /**\n * Adds another colorStop\n * @param {Record} colorStop Object with offset and color\n * @return {Gradient} thisArg\n */\n addColorStop(colorStops: Record) {\n for (const position in colorStops) {\n this.colorStops.push({\n offset: parseFloat(position),\n color: colorStops[position],\n });\n }\n return this;\n }\n\n /**\n * Returns object representation of a gradient\n * @param {string[]} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {object}\n */\n toObject(\n propertiesToInclude?: (keyof this | string)[],\n ): SerializedGradientProps {\n return {\n ...pick(this, propertiesToInclude as (keyof this)[]),\n type: this.type,\n coords: { ...this.coords },\n colorStops: this.colorStops.map((colorStop) => ({ ...colorStop })),\n offsetX: this.offsetX,\n offsetY: this.offsetY,\n gradientUnits: this.gradientUnits,\n gradientTransform: this.gradientTransform\n ? [...this.gradientTransform]\n : undefined,\n };\n }\n\n /* _TO_SVG_START_ */\n /**\n * Returns SVG representation of an gradient\n * @param {FabricObject} object Object to create a gradient for\n * @return {String} SVG representation of an gradient (linear/radial)\n */\n toSVG(\n object: FabricObject,\n {\n additionalTransform: preTransform,\n }: { additionalTransform?: string } = {},\n ) {\n const markup = [],\n transform = (\n this.gradientTransform\n ? this.gradientTransform.concat()\n : iMatrix.concat()\n ) as TMat2D,\n gradientUnits =\n this.gradientUnits === 'pixels'\n ? 'userSpaceOnUse'\n : 'objectBoundingBox';\n // colorStops must be sorted ascending, and guarded against deep mutations\n const colorStops = this.colorStops\n .map((colorStop) => ({ ...colorStop }))\n .sort((a, b) => {\n return a.offset - b.offset;\n });\n\n let offsetX = -this.offsetX,\n offsetY = -this.offsetY;\n if (gradientUnits === 'objectBoundingBox') {\n offsetX /= object.width;\n offsetY /= object.height;\n } else {\n offsetX += object.width / 2;\n offsetY += object.height / 2;\n }\n // todo what about polygon/polyline?\n if (isPath(object) && this.gradientUnits !== 'percentage') {\n offsetX -= object.pathOffset.x;\n offsetY -= object.pathOffset.y;\n }\n transform[4] -= offsetX;\n transform[5] -= offsetY;\n\n const commonAttributes = [\n `id=\"SVGID_${this.id}\"`,\n `gradientUnits=\"${gradientUnits}\"`,\n `gradientTransform=\"${\n preTransform ? preTransform + ' ' : ''\n }${matrixToSVG(transform)}\"`,\n '',\n ].join(' ');\n\n if (this.type === 'linear') {\n const { x1, y1, x2, y2 } = this.coords;\n markup.push(\n '\\n',\n );\n } else if (this.type === 'radial') {\n const { x1, y1, x2, y2, r1, r2 } = this\n .coords as GradientCoords<'radial'>;\n const needsSwap = r1 > r2;\n // svg radial gradient has just 1 radius. the biggest.\n markup.push(\n '\\n',\n );\n if (needsSwap) {\n // svg goes from internal to external radius. if radius are inverted, swap color stops.\n colorStops.reverse(); // mutates array\n colorStops.forEach((colorStop) => {\n colorStop.offset = 1 - colorStop.offset;\n });\n }\n const minRadius = Math.min(r1, r2);\n if (minRadius > 0) {\n // i have to shift all colorStops and add new one in 0.\n const maxRadius = Math.max(r1, r2),\n percentageShift = minRadius / maxRadius;\n colorStops.forEach((colorStop) => {\n colorStop.offset += percentageShift * (1 - colorStop.offset);\n });\n }\n }\n\n colorStops.forEach(({ color, offset }) => {\n markup.push(\n `\\n`,\n );\n });\n\n markup.push(\n this.type === 'linear' ? '' : '',\n '\\n',\n );\n\n return markup.join('');\n }\n /* _TO_SVG_END_ */\n\n /**\n * Returns an instance of CanvasGradient\n * @param {CanvasRenderingContext2D} ctx Context to render on\n * @return {CanvasGradient}\n */\n toLive(ctx: CanvasRenderingContext2D): CanvasGradient {\n const { x1, y1, x2, y2, r1, r2 } = this.coords as GradientCoords<'radial'>;\n const gradient =\n this.type === 'linear'\n ? ctx.createLinearGradient(x1, y1, x2, y2)\n : ctx.createRadialGradient(x1, y1, r1, x2, y2, r2);\n\n this.colorStops.forEach(({ color, offset }) => {\n gradient.addColorStop(offset, color);\n });\n\n return gradient;\n }\n\n static async fromObject(\n options: GradientOptions<'linear'>,\n ): Promise>;\n static async fromObject(\n options: GradientOptions<'radial'>,\n ): Promise>;\n static async fromObject(\n options: GradientOptions<'linear'> | GradientOptions<'radial'>,\n ) {\n const { colorStops, gradientTransform } = options;\n return new this({\n ...options,\n colorStops: colorStops\n ? colorStops.map((colorStop) => ({ ...colorStop }))\n : undefined,\n gradientTransform: gradientTransform ? [...gradientTransform] : undefined,\n });\n }\n\n /* _FROM_SVG_START_ */\n /**\n * Returns {@link Gradient} instance from an SVG element\n * @param {SVGGradientElement} el SVG gradient element\n * @param {FabricObject} instance\n * @param {String} opacity A fill-opacity or stroke-opacity attribute to multiply to each stop's opacity.\n * @param {SVGOptions} svgOptions an object containing the size of the SVG in order to parse correctly gradients\n * that uses gradientUnits as 'userSpaceOnUse' and percentages.\n * @return {Gradient} Gradient instance\n * @see http://www.w3.org/TR/SVG/pservers.html#LinearGradientElement\n * @see http://www.w3.org/TR/SVG/pservers.html#RadialGradientElement\n *\n * @example\n *\n * \n * \n * \n * \n *\n * OR\n *\n * \n * \n * \n * \n *\n * OR\n *\n * \n * \n * \n * \n * \n *\n * OR\n *\n * \n * \n * \n * \n * \n *\n */\n static fromElement(\n el: SVGGradientElement,\n instance: FabricObject,\n svgOptions: SVGOptions,\n ): Gradient {\n const gradientUnits = parseGradientUnits(el);\n const center = instance._findCenterFromElement();\n return new this({\n id: el.getAttribute('id') || undefined,\n type: parseType(el),\n coords: parseCoords(el, {\n width: svgOptions.viewBoxWidth || svgOptions.width,\n height: svgOptions.viewBoxHeight || svgOptions.height,\n }),\n colorStops: parseColorStops(el, svgOptions.opacity),\n gradientUnits,\n gradientTransform: parseTransformAttribute(\n el.getAttribute('gradientTransform') || '',\n ),\n ...(gradientUnits === 'pixels'\n ? {\n offsetX: instance.width / 2 - center.x,\n offsetY: instance.height / 2 - center.y,\n }\n : {\n offsetX: 0,\n offsetY: 0,\n }),\n });\n }\n /* _FROM_SVG_END_ */\n}\n\nclassRegistry.setClass(Gradient, 'gradient');\nclassRegistry.setClass(Gradient, 'linear');\nclassRegistry.setClass(Gradient, 'radial');\n","import { config } from '../config';\nimport type { Abortable, TCrossOrigin, TMat2D, TSize } from '../typedefs';\nimport { ifNaN } from '../util/internals/ifNaN';\nimport { uid } from '../util/internals/uid';\nimport { loadImage } from '../util/misc/objectEnlive';\nimport { pick } from '../util/misc/pick';\nimport { toFixed } from '../util/misc/toFixed';\nimport { classRegistry } from '../ClassRegistry';\nimport type {\n PatternRepeat,\n PatternOptions,\n SerializedPatternOptions,\n} from './types';\nimport { log } from '../util/internals/console';\n\n/**\n * @see {@link http://fabric5.fabricjs.com/patterns demo}\n * @see {@link http://fabric5.fabricjs.com/dynamic-patterns demo}\n */\nexport class Pattern {\n static type = 'Pattern';\n\n /**\n * Legacy identifier of the class. Prefer using this.constructor.type 'Pattern'\n * or utils like isPattern, or instance of to indentify a pattern in your code.\n * Will be removed in future versiones\n * @TODO add sustainable warning message\n * @type string\n * @deprecated\n */\n get type() {\n return 'pattern';\n }\n\n set type(value) {\n log('warn', 'Setting type has no effect', value);\n }\n\n /**\n * @type PatternRepeat\n * @defaults\n */\n repeat: PatternRepeat = 'repeat';\n\n /**\n * Pattern horizontal offset from object's left/top corner\n * @type Number\n */\n offsetX = 0;\n\n /**\n * Pattern vertical offset from object's left/top corner\n * @type Number\n */\n offsetY = 0;\n\n /**\n * @type TCrossOrigin\n */\n crossOrigin: TCrossOrigin = '';\n\n /**\n * transform matrix to change the pattern, imported from svgs.\n * @todo verify if using the identity matrix as default makes the rest of the code more easy\n * @type Array\n */\n declare patternTransform?: TMat2D;\n\n /**\n * The actual pixel source of the pattern\n */\n declare source: CanvasImageSource;\n\n /**\n * If true, this object will not be exported during the serialization of a canvas\n * @type boolean\n */\n declare excludeFromExport?: boolean;\n\n /**\n * ID used for SVG export functionalities\n * @type number\n */\n declare readonly id: number;\n\n /**\n * Constructor\n * @param {Object} [options] Options object\n * @param {option.source} [source] the pattern source, eventually empty or a drawable\n */\n constructor(options: PatternOptions) {\n this.id = uid();\n Object.assign(this, options);\n }\n\n /**\n * @returns true if {@link source} is an element\n */\n isImageSource(): this is { source: HTMLImageElement } {\n return (\n !!this.source && typeof (this.source as HTMLImageElement).src === 'string'\n );\n }\n\n /**\n * @returns true if {@link source} is a element\n */\n isCanvasSource(): this is { source: HTMLCanvasElement } {\n return !!this.source && !!(this.source as HTMLCanvasElement).toDataURL;\n }\n\n sourceToString(): string {\n return this.isImageSource()\n ? this.source.src\n : this.isCanvasSource()\n ? this.source.toDataURL()\n : '';\n }\n\n /**\n * Returns an instance of CanvasPattern\n * @param {CanvasRenderingContext2D} ctx Context to create pattern\n * @return {CanvasPattern}\n */\n toLive(ctx: CanvasRenderingContext2D): CanvasPattern | null {\n if (\n // if the image failed to load, return, and allow rest to continue loading\n !this.source ||\n // if an image\n (this.isImageSource() &&\n (!this.source.complete ||\n this.source.naturalWidth === 0 ||\n this.source.naturalHeight === 0))\n ) {\n return null;\n }\n\n return ctx.createPattern(this.source, this.repeat)!;\n }\n\n /**\n * Returns object representation of a pattern\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {object} Object representation of a pattern instance\n */\n toObject(propertiesToInclude: string[] = []): Record {\n const { repeat, crossOrigin } = this;\n return {\n ...pick(this, propertiesToInclude as (keyof this)[]),\n type: 'pattern',\n source: this.sourceToString(),\n repeat,\n crossOrigin,\n offsetX: toFixed(this.offsetX, config.NUM_FRACTION_DIGITS),\n offsetY: toFixed(this.offsetY, config.NUM_FRACTION_DIGITS),\n patternTransform: this.patternTransform\n ? [...this.patternTransform]\n : null,\n };\n }\n\n /* _TO_SVG_START_ */\n /**\n * Returns SVG representation of a pattern\n */\n toSVG({ width, height }: TSize): string {\n const { source: patternSource, repeat, id } = this,\n patternOffsetX = ifNaN(this.offsetX / width, 0),\n patternOffsetY = ifNaN(this.offsetY / height, 0),\n patternWidth =\n repeat === 'repeat-y' || repeat === 'no-repeat'\n ? 1 + Math.abs(patternOffsetX || 0)\n : ifNaN((patternSource as HTMLImageElement).width / width, 0),\n patternHeight =\n repeat === 'repeat-x' || repeat === 'no-repeat'\n ? 1 + Math.abs(patternOffsetY || 0)\n : ifNaN((patternSource as HTMLImageElement).height / height, 0);\n\n return [\n ``,\n ``,\n ``,\n '',\n ].join('\\n');\n }\n /* _TO_SVG_END_ */\n\n static async fromObject(\n {\n type,\n source,\n patternTransform,\n ...otherOptions\n }: SerializedPatternOptions,\n options?: Abortable,\n ): Promise {\n const img = await loadImage(source, {\n ...options,\n crossOrigin: otherOptions.crossOrigin,\n });\n return new this({\n ...otherOptions,\n patternTransform:\n patternTransform && (patternTransform.slice(0) as TMat2D),\n source: img,\n });\n }\n}\n\nclassRegistry.setClass(Pattern);\n// kept for compatibility reason\nclassRegistry.setClass(Pattern, 'pattern');\n","import { Color } from '../color/Color';\nimport type { Point } from '../Point';\nimport type { Shadow } from '../Shadow';\nimport type { Canvas } from '../canvas/Canvas';\nimport type { TBrushEventData } from './typedefs';\n\n/**\n * @see {@link http://fabric5.fabricjs.com/freedrawing|Freedrawing demo}\n */\nexport abstract class BaseBrush {\n /**\n * Color of a brush\n * @type String\n */\n color = 'rgb(0, 0, 0)';\n\n /**\n * Width of a brush, has to be a Number, no string literals\n * @type Number\n */\n width = 1;\n\n /**\n * Shadow object representing shadow of this shape.\n * Backwards incompatibility note: This property replaces \"shadowColor\" (String), \"shadowOffsetX\" (Number),\n * \"shadowOffsetY\" (Number) and \"shadowBlur\" (Number) since v1.2.12\n * @type Shadow\n */\n shadow: Shadow | null = null;\n\n /**\n * Line endings style of a brush (one of \"butt\", \"round\", \"square\")\n * @type String\n */\n strokeLineCap: CanvasLineCap = 'round';\n\n /**\n * Corner style of a brush (one of \"bevel\", \"round\", \"miter\")\n * @type String\n */\n strokeLineJoin: CanvasLineJoin = 'round';\n\n /**\n * Maximum miter length (used for strokeLineJoin = \"miter\") of a brush's\n * @type Number\n */\n strokeMiterLimit = 10;\n\n /**\n * Stroke Dash Array.\n * @type Array\n */\n strokeDashArray: number[] | null = null;\n\n /**\n * When `true`, the free drawing is limited to the whiteboard size. Default to false.\n * @type Boolean\n * @default false\n */\n\n limitedToCanvasSize = false;\n\n /**\n * @todo add type\n */\n declare canvas: Canvas;\n\n constructor(canvas: Canvas) {\n this.canvas = canvas;\n }\n\n abstract _render(): void;\n abstract onMouseDown(pointer: Point, ev: TBrushEventData): void;\n abstract onMouseMove(pointer: Point, ev: TBrushEventData): void;\n /**\n * @returns true if brush should continue blocking interaction\n */\n abstract onMouseUp(ev: TBrushEventData): boolean | void;\n\n /**\n * Sets brush styles\n * @private\n * @param {CanvasRenderingContext2D} ctx\n */\n _setBrushStyles(ctx: CanvasRenderingContext2D) {\n ctx.strokeStyle = this.color;\n ctx.lineWidth = this.width;\n ctx.lineCap = this.strokeLineCap;\n ctx.miterLimit = this.strokeMiterLimit;\n ctx.lineJoin = this.strokeLineJoin;\n ctx.setLineDash(this.strokeDashArray || []);\n }\n\n /**\n * Sets the transformation on given context\n * @param {CanvasRenderingContext2D} ctx context to render on\n * @private\n */\n protected _saveAndTransform(ctx: CanvasRenderingContext2D) {\n const v = this.canvas.viewportTransform;\n ctx.save();\n ctx.transform(v[0], v[1], v[2], v[3], v[4], v[5]);\n }\n\n protected needsFullRender() {\n const color = new Color(this.color);\n return color.getAlpha() < 1 || !!this.shadow;\n }\n\n /**\n * Sets brush shadow styles\n * @private\n */\n protected _setShadow() {\n if (!this.shadow || !this.canvas) {\n return;\n }\n\n const canvas = this.canvas,\n shadow = this.shadow,\n ctx = canvas.contextTop,\n zoom = canvas.getZoom() * canvas.getRetinaScaling();\n\n ctx.shadowColor = shadow.color;\n ctx.shadowBlur = shadow.blur * zoom;\n ctx.shadowOffsetX = shadow.offsetX * zoom;\n ctx.shadowOffsetY = shadow.offsetY * zoom;\n }\n\n /**\n * Removes brush shadow styles\n * @private\n */\n protected _resetShadow() {\n const ctx = this.canvas.contextTop;\n\n ctx.shadowColor = '';\n ctx.shadowBlur = ctx.shadowOffsetX = ctx.shadowOffsetY = 0;\n }\n\n /**\n * Check is pointer is outside canvas boundaries\n * @param {Object} pointer\n * @private\n */\n protected _isOutSideCanvas(pointer: Point) {\n return (\n pointer.x < 0 ||\n pointer.x > this.canvas.getWidth() ||\n pointer.y < 0 ||\n pointer.y > this.canvas.getHeight()\n );\n }\n}\n","import { config } from '../config';\nimport { SHARED_ATTRIBUTES } from '../parser/attributes';\nimport { parseAttributes } from '../parser/parseAttributes';\nimport type { XY } from '../Point';\nimport { Point } from '../Point';\nimport { makeBoundingBoxFromPoints } from '../util/misc/boundingBoxFromPoints';\nimport { toFixed } from '../util/misc/toFixed';\nimport {\n getBoundsOfCurve,\n joinPath,\n makePathSimpler,\n parsePath,\n} from '../util/path';\nimport { classRegistry } from '../ClassRegistry';\nimport { FabricObject, cacheProperties } from './Object/FabricObject';\nimport type {\n TComplexPathData,\n TPathSegmentInfo,\n TSimplePathData,\n} from '../util/path/typedefs';\nimport type { FabricObjectProps, SerializedObjectProps } from './Object/types';\nimport type { ObjectEvents } from '../EventTypeDefs';\nimport type {\n TBBox,\n TClassProperties,\n TSVGReviver,\n TOptions,\n} from '../typedefs';\nimport { CENTER, LEFT, TOP } from '../constants';\nimport type { CSSRules } from '../parser/typedefs';\n\ninterface UniquePathProps {\n sourcePath?: string;\n path?: TSimplePathData;\n}\n\nexport interface SerializedPathProps\n extends SerializedObjectProps,\n UniquePathProps {}\n\nexport interface PathProps extends FabricObjectProps, UniquePathProps {}\n\nexport interface IPathBBox extends TBBox {\n left: number;\n top: number;\n pathOffset: Point;\n}\n\nexport class Path<\n Props extends TOptions = Partial,\n SProps extends SerializedPathProps = SerializedPathProps,\n EventSpec extends ObjectEvents = ObjectEvents,\n> extends FabricObject {\n /**\n * Array of path points\n * @type Array\n */\n declare path: TSimplePathData;\n\n declare pathOffset: Point;\n\n declare sourcePath?: string;\n\n declare segmentsInfo?: TPathSegmentInfo[];\n\n static type = 'Path';\n\n static cacheProperties = [...cacheProperties, 'path', 'fillRule'];\n\n /**\n * Constructor\n * @param {TComplexPathData} path Path data (sequence of coordinates and corresponding \"command\" tokens)\n * @param {Partial} [options] Options object\n * @return {Path} thisArg\n */\n constructor(\n path: TComplexPathData | string,\n // todo: evaluate this spread here\n { path: _, left, top, ...options }: Partial = {},\n ) {\n super();\n Object.assign(this, Path.ownDefaults);\n this.setOptions(options);\n this._setPath(path || [], true);\n typeof left === 'number' && this.set(LEFT, left);\n typeof top === 'number' && this.set(TOP, top);\n }\n\n /**\n * @private\n * @param {TComplexPathData | string} path Path data (sequence of coordinates and corresponding \"command\" tokens)\n * @param {boolean} [adjustPosition] pass true to reposition the object according to the bounding box\n * @returns {Point} top left position of the bounding box, useful for complementary positioning\n */\n _setPath(path: TComplexPathData | string, adjustPosition?: boolean) {\n this.path = makePathSimpler(Array.isArray(path) ? path : parsePath(path));\n this.setBoundingBox(adjustPosition);\n }\n\n /**\n * This function is an helper for svg import. it returns the center of the object in the svg\n * untransformed coordinates, by look at the polyline/polygon points.\n * @private\n * @return {Point} center point from element coordinates\n */\n _findCenterFromElement(): Point {\n const bbox = this._calcBoundsFromPath();\n return new Point(bbox.left + bbox.width / 2, bbox.top + bbox.height / 2);\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx context to render path on\n */\n _renderPathCommands(ctx: CanvasRenderingContext2D) {\n const l = -this.pathOffset.x,\n t = -this.pathOffset.y;\n\n ctx.beginPath();\n\n for (const command of this.path) {\n switch (\n command[0] // first letter\n ) {\n case 'L': // lineto, absolute\n ctx.lineTo(command[1] + l, command[2] + t);\n break;\n\n case 'M': // moveTo, absolute\n ctx.moveTo(command[1] + l, command[2] + t);\n break;\n\n case 'C': // bezierCurveTo, absolute\n ctx.bezierCurveTo(\n command[1] + l,\n command[2] + t,\n command[3] + l,\n command[4] + t,\n command[5] + l,\n command[6] + t,\n );\n break;\n\n case 'Q': // quadraticCurveTo, absolute\n ctx.quadraticCurveTo(\n command[1] + l,\n command[2] + t,\n command[3] + l,\n command[4] + t,\n );\n break;\n\n case 'Z':\n ctx.closePath();\n break;\n }\n }\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx context to render path on\n */\n _render(ctx: CanvasRenderingContext2D) {\n this._renderPathCommands(ctx);\n this._renderPaintInOrder(ctx);\n }\n\n /**\n * Returns string representation of an instance\n * @return {string} string representation of an instance\n */\n toString() {\n return `#`;\n }\n\n /**\n * Returns object representation of an instance\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} object representation of an instance\n */\n toObject<\n T extends Omit, keyof SProps>,\n K extends keyof T = never,\n >(propertiesToInclude: K[] = []): Pick & SProps {\n return {\n ...super.toObject(propertiesToInclude),\n path: this.path.map((pathCmd) => pathCmd.slice()),\n };\n }\n\n /**\n * Returns dataless object representation of an instance\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} object representation of an instance\n */\n toDatalessObject<\n T extends Omit, keyof SProps>,\n K extends keyof T = never,\n >(propertiesToInclude: K[] = []): Pick & SProps {\n const o = this.toObject(propertiesToInclude);\n if (this.sourcePath) {\n delete o.path;\n o.sourcePath = this.sourcePath;\n }\n return o;\n }\n\n /**\n * Returns svg representation of an instance\n * @return {Array} an array of strings with the specific svg representation\n * of the instance\n */\n _toSVG() {\n const path = joinPath(this.path, config.NUM_FRACTION_DIGITS);\n return [\n '\\n`,\n ];\n }\n\n /**\n * @private\n * @return the path command's translate transform attribute\n */\n _getOffsetTransform() {\n const digits = config.NUM_FRACTION_DIGITS;\n return ` translate(${toFixed(-this.pathOffset.x, digits)}, ${toFixed(\n -this.pathOffset.y,\n digits,\n )})`;\n }\n\n /**\n * Returns svg clipPath representation of an instance\n * @param {Function} [reviver] Method for further parsing of svg representation.\n * @return {string} svg representation of an instance\n */\n toClipPathSVG(reviver?: TSVGReviver): string {\n const additionalTransform = this._getOffsetTransform();\n return (\n '\\t' +\n this._createBaseClipPathSVGMarkup(this._toSVG(), {\n reviver,\n additionalTransform: additionalTransform,\n })\n );\n }\n\n /**\n * Returns svg representation of an instance\n * @param {Function} [reviver] Method for further parsing of svg representation.\n * @return {string} svg representation of an instance\n */\n toSVG(reviver?: TSVGReviver): string {\n const additionalTransform = this._getOffsetTransform();\n return this._createBaseSVGMarkup(this._toSVG(), {\n reviver,\n additionalTransform: additionalTransform,\n });\n }\n\n /**\n * Returns number representation of an instance complexity\n * @return {number} complexity of this instance\n */\n complexity() {\n return this.path.length;\n }\n\n setDimensions() {\n this.setBoundingBox();\n }\n\n setBoundingBox(adjustPosition?: boolean) {\n const { width, height, pathOffset } = this._calcDimensions();\n this.set({ width, height, pathOffset });\n // using pathOffset because it match the use case.\n // if pathOffset change here we need to use left + width/2 , top + height/2\n adjustPosition && this.setPositionByOrigin(pathOffset, CENTER, CENTER);\n }\n\n _calcBoundsFromPath(): TBBox {\n const bounds: XY[] = [];\n let subpathStartX = 0,\n subpathStartY = 0,\n x = 0, // current x\n y = 0; // current y\n\n for (const command of this.path) {\n // current instruction\n switch (\n command[0] // first letter\n ) {\n case 'L': // lineto, absolute\n x = command[1];\n y = command[2];\n bounds.push({ x: subpathStartX, y: subpathStartY }, { x, y });\n break;\n\n case 'M': // moveTo, absolute\n x = command[1];\n y = command[2];\n subpathStartX = x;\n subpathStartY = y;\n break;\n\n case 'C': // bezierCurveTo, absolute\n bounds.push(\n ...getBoundsOfCurve(\n x,\n y,\n command[1],\n command[2],\n command[3],\n command[4],\n command[5],\n command[6],\n ),\n );\n x = command[5];\n y = command[6];\n break;\n\n case 'Q': // quadraticCurveTo, absolute\n bounds.push(\n ...getBoundsOfCurve(\n x,\n y,\n command[1],\n command[2],\n command[1],\n command[2],\n command[3],\n command[4],\n ),\n );\n x = command[3];\n y = command[4];\n break;\n\n case 'Z':\n x = subpathStartX;\n y = subpathStartY;\n break;\n }\n }\n return makeBoundingBoxFromPoints(bounds);\n }\n\n /**\n * @private\n */\n _calcDimensions(): IPathBBox {\n const bbox = this._calcBoundsFromPath();\n\n return {\n ...bbox,\n pathOffset: new Point(\n bbox.left + bbox.width / 2,\n bbox.top + bbox.height / 2,\n ),\n };\n }\n\n /**\n * List of attribute names to account for when parsing SVG element (used by `Path.fromElement`)\n * @see http://www.w3.org/TR/SVG/paths.html#PathElement\n */\n static ATTRIBUTE_NAMES = [...SHARED_ATTRIBUTES, 'd'];\n\n /**\n * Creates an instance of Path from an object\n * @param {Object} object\n * @returns {Promise}\n */\n static fromObject>(object: T) {\n return this._fromObject(object, {\n extraParam: 'path',\n });\n }\n\n /**\n * Creates an instance of Path from an SVG element\n * @param {HTMLElement} element to parse\n * @param {Partial} [options] Options object\n */\n static async fromElement(\n element: HTMLElement | SVGElement,\n options?: Partial,\n cssRules?: CSSRules,\n ) {\n const { d, ...parsedAttributes } = parseAttributes(\n element,\n this.ATTRIBUTE_NAMES,\n cssRules,\n );\n return new this(d, {\n ...parsedAttributes,\n ...options,\n // we pass undefined to instruct the constructor to position the object using the bbox\n left: undefined,\n top: undefined,\n });\n }\n}\n\nclassRegistry.setClass(Path);\nclassRegistry.setSVGClass(Path);\n\n/* _FROM_SVG_START_ */\n","import type { ModifierKey, TEvent } from '../EventTypeDefs';\nimport type { Point } from '../Point';\nimport { Shadow } from '../Shadow';\nimport { Path } from '../shapes/Path';\nimport { getSmoothPathFromPoints, joinPath } from '../util/path';\nimport type { Canvas } from '../canvas/Canvas';\nimport { BaseBrush } from './BaseBrush';\nimport type { TSimplePathData } from '../util/path/typedefs';\n\n/**\n * @private\n * @param {TSimplePathData} pathData SVG path commands\n * @returns {boolean}\n */\nfunction isEmptySVGPath(pathData: TSimplePathData): boolean {\n return joinPath(pathData) === 'M 0 0 Q 0 0 0 0 L 0 0';\n}\n\nexport class PencilBrush extends BaseBrush {\n /**\n * Discard points that are less than `decimate` pixel distant from each other\n * @type Number\n * @default 0.4\n */\n decimate = 0.4;\n\n /**\n * Draws a straight line between last recorded point to current pointer\n * Used for `shift` functionality\n *\n * @type boolean\n * @default false\n */\n drawStraightLine = false;\n\n /**\n * The event modifier key that makes the brush draw a straight line.\n * If `null` or 'none' or any other string that is not a modifier key the feature is disabled.\n * @type {ModifierKey | undefined | null}\n */\n straightLineKey: ModifierKey | undefined | null = 'shiftKey';\n\n declare protected _points: Point[];\n declare protected _hasStraightLine: boolean;\n declare protected oldEnd?: Point;\n\n constructor(canvas: Canvas) {\n super(canvas);\n this._points = [];\n this._hasStraightLine = false;\n }\n\n needsFullRender() {\n return super.needsFullRender() || this._hasStraightLine;\n }\n\n static drawSegment(ctx: CanvasRenderingContext2D, p1: Point, p2: Point) {\n const midPoint = p1.midPointFrom(p2);\n ctx.quadraticCurveTo(p1.x, p1.y, midPoint.x, midPoint.y);\n return midPoint;\n }\n\n /**\n * Invoked on mouse down\n * @param {Point} pointer\n */\n onMouseDown(pointer: Point, { e }: TEvent) {\n if (!this.canvas._isMainEvent(e)) {\n return;\n }\n this.drawStraightLine = !!this.straightLineKey && e[this.straightLineKey];\n this._prepareForDrawing(pointer);\n // capture coordinates immediately\n // this allows to draw dots (when movement never occurs)\n this._addPoint(pointer);\n this._render();\n }\n\n /**\n * Invoked on mouse move\n * @param {Point} pointer\n */\n onMouseMove(pointer: Point, { e }: TEvent) {\n if (!this.canvas._isMainEvent(e)) {\n return;\n }\n this.drawStraightLine = !!this.straightLineKey && e[this.straightLineKey];\n if (this.limitedToCanvasSize === true && this._isOutSideCanvas(pointer)) {\n return;\n }\n if (this._addPoint(pointer) && this._points.length > 1) {\n if (this.needsFullRender()) {\n // redraw curve\n // clear top canvas\n this.canvas.clearContext(this.canvas.contextTop);\n this._render();\n } else {\n const points = this._points,\n length = points.length,\n ctx = this.canvas.contextTop;\n // draw the curve update\n this._saveAndTransform(ctx);\n if (this.oldEnd) {\n ctx.beginPath();\n ctx.moveTo(this.oldEnd.x, this.oldEnd.y);\n }\n this.oldEnd = PencilBrush.drawSegment(\n ctx,\n points[length - 2],\n points[length - 1],\n );\n ctx.stroke();\n ctx.restore();\n }\n }\n }\n\n /**\n * Invoked on mouse up\n */\n onMouseUp({ e }: TEvent) {\n if (!this.canvas._isMainEvent(e)) {\n return true;\n }\n this.drawStraightLine = false;\n this.oldEnd = undefined;\n this._finalizeAndAddPath();\n\n return false;\n }\n\n /**\n * @private\n * @param {Point} pointer Actual mouse position related to the canvas.\n */\n _prepareForDrawing(pointer: Point) {\n this._reset();\n this._addPoint(pointer);\n this.canvas.contextTop.moveTo(pointer.x, pointer.y);\n }\n\n /**\n * @private\n * @param {Point} point Point to be added to points array\n */\n _addPoint(point: Point) {\n if (\n this._points.length > 1 &&\n point.eq(this._points[this._points.length - 1])\n ) {\n return false;\n }\n if (this.drawStraightLine && this._points.length > 1) {\n this._hasStraightLine = true;\n this._points.pop();\n }\n this._points.push(point);\n return true;\n }\n\n /**\n * Clear points array and set contextTop canvas style.\n * @private\n */\n _reset() {\n this._points = [];\n this._setBrushStyles(this.canvas.contextTop);\n this._setShadow();\n this._hasStraightLine = false;\n }\n\n /**\n * Draw a smooth path on the topCanvas using quadraticCurveTo\n * @private\n * @param {CanvasRenderingContext2D} [ctx]\n */\n _render(ctx: CanvasRenderingContext2D = this.canvas.contextTop) {\n let p1 = this._points[0],\n p2 = this._points[1];\n this._saveAndTransform(ctx);\n ctx.beginPath();\n //if we only have 2 points in the path and they are the same\n //it means that the user only clicked the canvas without moving the mouse\n //then we should be drawing a dot. A path isn't drawn between two identical dots\n //that's why we set them apart a bit\n if (this._points.length === 2 && p1.x === p2.x && p1.y === p2.y) {\n const width = this.width / 1000;\n p1.x -= width;\n p2.x += width;\n }\n ctx.moveTo(p1.x, p1.y);\n\n for (let i = 1; i < this._points.length; i++) {\n // we pick the point between pi + 1 & pi + 2 as the\n // end point and p1 as our control point.\n PencilBrush.drawSegment(ctx, p1, p2);\n p1 = this._points[i];\n p2 = this._points[i + 1];\n }\n // Draw last line as a straight line while\n // we wait for the next point to be able to calculate\n // the bezier control point\n ctx.lineTo(p1.x, p1.y);\n ctx.stroke();\n ctx.restore();\n }\n\n /**\n * Converts points to SVG path\n * @param {Point[]} points Array of points\n * @return {TSimplePathData} SVG path commands\n */\n convertPointsToSVGPath(points: Point[]): TSimplePathData {\n const correction = this.width / 1000;\n return getSmoothPathFromPoints(points, correction);\n }\n\n /**\n * Creates a Path object to add on canvas\n * @param {TSimplePathData} pathData Path data\n * @return {Path} Path to add on canvas\n */\n createPath(pathData: TSimplePathData): Path {\n const path = new Path(pathData, {\n fill: null,\n stroke: this.color,\n strokeWidth: this.width,\n strokeLineCap: this.strokeLineCap,\n strokeMiterLimit: this.strokeMiterLimit,\n strokeLineJoin: this.strokeLineJoin,\n strokeDashArray: this.strokeDashArray,\n });\n if (this.shadow) {\n this.shadow.affectStroke = true;\n path.shadow = new Shadow(this.shadow);\n }\n\n return path;\n }\n\n /**\n * Decimate points array with the decimate value\n */\n decimatePoints(points: Point[], distance: number) {\n if (points.length <= 2) {\n return points;\n }\n let lastPoint = points[0],\n cDistance;\n const zoom = this.canvas.getZoom(),\n adjustedDistance = Math.pow(distance / zoom, 2),\n l = points.length - 1,\n newPoints = [lastPoint];\n // TODO investigate why this is not i < l\n for (let i = 1; i < l - 1; i++) {\n cDistance =\n Math.pow(lastPoint.x - points[i].x, 2) +\n Math.pow(lastPoint.y - points[i].y, 2);\n if (cDistance >= adjustedDistance) {\n lastPoint = points[i];\n newPoints.push(lastPoint);\n }\n }\n // Add the last point from the original line to the end of the array.\n // This ensures decimate doesn't delete the last point on the line, and ensures the line is > 1 point.\n newPoints.push(points[l]);\n return newPoints;\n }\n\n /**\n * On mouseup after drawing the path on contextTop canvas\n * we use the points captured to create an new Path object\n * and add it to the canvas.\n */\n _finalizeAndAddPath() {\n const ctx = this.canvas.contextTop;\n ctx.closePath();\n if (this.decimate) {\n this._points = this.decimatePoints(this._points, this.decimate);\n }\n const pathData = this.convertPointsToSVGPath(this._points);\n if (isEmptySVGPath(pathData)) {\n // do not create 0 width/height paths, as they are\n // rendered inconsistently across browsers\n // Firefox 4, for example, renders a dot,\n // whereas Chrome 10 renders nothing\n this.canvas.requestRenderAll();\n return;\n }\n\n const path = this.createPath(pathData);\n this.canvas.clearContext(this.canvas.contextTop);\n this.canvas.fire('before:path:created', { path: path });\n this.canvas.add(path);\n this.canvas.requestRenderAll();\n path.setCoords();\n this._resetShadow();\n\n // fire event 'path' created\n this.canvas.fire('path:created', { path: path });\n }\n}\n","import type { ObjectEvents } from '../EventTypeDefs';\nimport { SHARED_ATTRIBUTES } from '../parser/attributes';\nimport { parseAttributes } from '../parser/parseAttributes';\nimport { cos } from '../util/misc/cos';\nimport { degreesToRadians } from '../util/misc/radiansDegreesConversion';\nimport { sin } from '../util/misc/sin';\nimport { classRegistry } from '../ClassRegistry';\nimport { FabricObject, cacheProperties } from './Object/FabricObject';\nimport type { Abortable, TClassProperties, TOptions } from '../typedefs';\nimport type { FabricObjectProps, SerializedObjectProps } from './Object/types';\nimport type { CSSRules } from '../parser/typedefs';\nimport { SCALE_X, SCALE_Y } from '../constants';\n\ninterface UniqueCircleProps {\n /**\n * Radius of this circle\n * @type Number\n * @default 0\n */\n radius: number;\n\n /**\n * Angle for the start of the circle, in degrees.\n * @type TDegree 0 - 359\n * @default 0\n */\n startAngle: number;\n\n /**\n * Angle for the end of the circle, in degrees\n * @type TDegree 1 - 360\n * @default 360\n */\n endAngle: number;\n\n /**\n * Orientation for the direction of the circle.\n * Setting to true will switch the arc of the circle to traverse from startAngle to endAngle in a counter-clockwise direction.\n * Note: this will only change how the circle is drawn, and does not affect rotational transformation.\n * @default false\n */\n counterClockwise: boolean;\n}\n\nexport interface SerializedCircleProps\n extends SerializedObjectProps,\n UniqueCircleProps {}\n\nexport interface CircleProps extends FabricObjectProps, UniqueCircleProps {}\n\nconst CIRCLE_PROPS = [\n 'radius',\n 'startAngle',\n 'endAngle',\n 'counterClockwise',\n] as const;\n\nexport const circleDefaultValues: Partial> = {\n radius: 0,\n startAngle: 0,\n endAngle: 360,\n counterClockwise: false,\n};\n\nexport class Circle<\n Props extends TOptions = Partial,\n SProps extends SerializedCircleProps = SerializedCircleProps,\n EventSpec extends ObjectEvents = ObjectEvents,\n >\n extends FabricObject\n implements UniqueCircleProps\n{\n declare radius: number;\n declare startAngle: number;\n declare endAngle: number;\n declare counterClockwise: boolean;\n\n static type = 'Circle';\n\n static cacheProperties = [...cacheProperties, ...CIRCLE_PROPS];\n\n static ownDefaults = circleDefaultValues;\n\n static getDefaults(): Record {\n return {\n ...super.getDefaults(),\n ...Circle.ownDefaults,\n };\n }\n\n /**\n * Constructor\n * @param {Object} [options] Options object\n */\n constructor(options?: Props) {\n super();\n Object.assign(this, Circle.ownDefaults);\n this.setOptions(options);\n }\n\n /**\n * @private\n * @param {String} key\n * @param {*} value\n */\n _set(key: string, value: any) {\n super._set(key, value);\n\n if (key === 'radius') {\n this.setRadius(value);\n }\n\n return this;\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx context to render on\n */\n _render(ctx: CanvasRenderingContext2D) {\n ctx.beginPath();\n ctx.arc(\n 0,\n 0,\n this.radius,\n degreesToRadians(this.startAngle),\n degreesToRadians(this.endAngle),\n this.counterClockwise,\n );\n this._renderPaintInOrder(ctx);\n }\n\n /**\n * Returns horizontal radius of an object (according to how an object is scaled)\n * @return {Number}\n */\n getRadiusX(): number {\n return this.get('radius') * this.get(SCALE_X);\n }\n\n /**\n * Returns vertical radius of an object (according to how an object is scaled)\n * @return {Number}\n */\n getRadiusY(): number {\n return this.get('radius') * this.get(SCALE_Y);\n }\n\n /**\n * Sets radius of an object (and updates width accordingly)\n */\n setRadius(value: number) {\n this.radius = value;\n this.set({ width: value * 2, height: value * 2 });\n }\n\n /**\n * Returns object representation of an instance\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} object representation of an instance\n */\n toObject<\n T extends Omit, keyof SProps>,\n K extends keyof T = never,\n >(propertiesToInclude: K[] = []): Pick & SProps {\n return super.toObject([...CIRCLE_PROPS, ...propertiesToInclude]);\n }\n\n /* _TO_SVG_START_ */\n\n /**\n * Returns svg representation of an instance\n * @return {Array} an array of strings with the specific svg representation\n * of the instance\n */\n _toSVG(): string[] {\n const angle = (this.endAngle - this.startAngle) % 360;\n\n if (angle === 0) {\n return [\n '\\n',\n ];\n } else {\n const { radius } = this;\n const start = degreesToRadians(this.startAngle),\n end = degreesToRadians(this.endAngle),\n startX = cos(start) * radius,\n startY = sin(start) * radius,\n endX = cos(end) * radius,\n endY = sin(end) * radius,\n largeFlag = angle > 180 ? 1 : 0,\n sweepFlag = this.counterClockwise ? 0 : 1;\n return [\n `\\n',\n ];\n }\n }\n /* _TO_SVG_END_ */\n\n /* _FROM_SVG_START_ */\n /**\n * List of attribute names to account for when parsing SVG element (used by {@link Circle.fromElement})\n * @see: http://www.w3.org/TR/SVG/shapes.html#CircleElement\n */\n static ATTRIBUTE_NAMES = ['cx', 'cy', 'r', ...SHARED_ATTRIBUTES];\n\n /**\n * Returns {@link Circle} instance from an SVG element\n * @param {HTMLElement} element Element to parse\n * @param {Object} [options] Partial Circle object to default missing properties on the element.\n * @throws {Error} If value of `r` attribute is missing or invalid\n */\n static async fromElement(\n element: HTMLElement,\n options: Abortable,\n cssRules?: CSSRules,\n ): Promise {\n const {\n left = 0,\n top = 0,\n radius = 0,\n ...otherParsedAttributes\n } = parseAttributes(\n element,\n this.ATTRIBUTE_NAMES,\n cssRules,\n ) as Partial;\n\n // this probably requires to be fixed for default origins not being top/left.\n\n return new this({\n ...otherParsedAttributes,\n radius,\n left: left - radius,\n top: top - radius,\n });\n }\n\n /* _FROM_SVG_END_ */\n\n /**\n * @todo how do we declare this??\n */\n static fromObject>(object: T) {\n return super._fromObject(object);\n }\n}\n\nclassRegistry.setClass(Circle);\nclassRegistry.setSVGClass(Circle);\n","import { Color } from '../color/Color';\nimport type { Point } from '../Point';\nimport { Shadow } from '../Shadow';\nimport { Circle } from '../shapes/Circle';\nimport { Group } from '../shapes/Group';\nimport { getRandomInt } from '../util/internals/getRandomInt';\nimport type { Canvas } from '../canvas/Canvas';\nimport { BaseBrush } from './BaseBrush';\nimport type { CircleBrushPoint } from './typedefs';\nimport { CENTER } from '../constants';\n\nexport class CircleBrush extends BaseBrush {\n /**\n * Width of a brush\n * @type Number\n */\n width = 10;\n\n declare points: CircleBrushPoint[];\n\n constructor(canvas: Canvas) {\n super(canvas);\n this.points = [];\n }\n\n /**\n * Invoked inside on mouse down and mouse move\n * @param {Point} pointer\n */\n drawDot(pointer: Point) {\n const point = this.addPoint(pointer),\n ctx = this.canvas.contextTop;\n this._saveAndTransform(ctx);\n this.dot(ctx, point);\n ctx.restore();\n }\n\n dot(ctx: CanvasRenderingContext2D, point: CircleBrushPoint) {\n ctx.fillStyle = point.fill;\n ctx.beginPath();\n ctx.arc(point.x, point.y, point.radius, 0, Math.PI * 2, false);\n ctx.closePath();\n ctx.fill();\n }\n\n /**\n * Invoked on mouse down\n */\n onMouseDown(pointer: Point) {\n this.points = [];\n this.canvas.clearContext(this.canvas.contextTop);\n this._setShadow();\n this.drawDot(pointer);\n }\n\n /**\n * Render the full state of the brush\n * @private\n */\n _render() {\n const ctx = this.canvas.contextTop,\n points = this.points;\n this._saveAndTransform(ctx);\n for (let i = 0; i < points.length; i++) {\n this.dot(ctx, points[i]);\n }\n ctx.restore();\n }\n\n /**\n * Invoked on mouse move\n * @param {Point} pointer\n */\n onMouseMove(pointer: Point) {\n if (this.limitedToCanvasSize === true && this._isOutSideCanvas(pointer)) {\n return;\n }\n if (this.needsFullRender()) {\n this.canvas.clearContext(this.canvas.contextTop);\n this.addPoint(pointer);\n this._render();\n } else {\n this.drawDot(pointer);\n }\n }\n\n /**\n * Invoked on mouse up\n */\n onMouseUp() {\n const originalRenderOnAddRemove = this.canvas.renderOnAddRemove;\n this.canvas.renderOnAddRemove = false;\n\n const circles: Circle[] = [];\n\n for (let i = 0; i < this.points.length; i++) {\n const point = this.points[i],\n circle = new Circle({\n radius: point.radius,\n left: point.x,\n top: point.y,\n originX: CENTER,\n originY: CENTER,\n fill: point.fill,\n });\n\n this.shadow && (circle.shadow = new Shadow(this.shadow));\n\n circles.push(circle);\n }\n const group = new Group(circles, { canvas: this.canvas });\n\n this.canvas.fire('before:path:created', { path: group });\n this.canvas.add(group);\n this.canvas.fire('path:created', { path: group });\n\n this.canvas.clearContext(this.canvas.contextTop);\n this._resetShadow();\n this.canvas.renderOnAddRemove = originalRenderOnAddRemove;\n this.canvas.requestRenderAll();\n }\n\n /**\n * @param {Object} pointer\n * @return {Point} Just added pointer point\n */\n addPoint({ x, y }: Point) {\n const pointerPoint: CircleBrushPoint = {\n x,\n y,\n radius: getRandomInt(Math.max(0, this.width - 20), this.width + 20) / 2,\n fill: new Color(this.color).setAlpha(getRandomInt(0, 100) / 100).toRgba(),\n };\n\n this.points.push(pointerPoint);\n\n return pointerPoint;\n }\n}\n","import type { Point } from '../Point';\nimport { Group } from '../shapes/Group';\nimport { Shadow } from '../Shadow';\nimport { Rect } from '../shapes/Rect';\nimport { getRandomInt } from '../util/internals/getRandomInt';\nimport type { Canvas } from '../canvas/Canvas';\nimport { BaseBrush } from './BaseBrush';\nimport type { SprayBrushPoint } from './typedefs';\nimport { CENTER } from '../constants';\n\n/**\n *\n * @param rects\n * @returns\n */\nfunction getUniqueRects(rects: Rect[]) {\n const uniqueRects: Record = {};\n const uniqueRectsArray: Rect[] = [];\n\n for (let i = 0, key: string; i < rects.length; i++) {\n key = `${rects[i].left}${rects[i].top}`;\n if (!uniqueRects[key]) {\n uniqueRects[key] = true;\n uniqueRectsArray.push(rects[i]);\n }\n }\n\n return uniqueRectsArray;\n}\n\nexport class SprayBrush extends BaseBrush {\n /**\n * Width of a spray\n * @type Number\n */\n width = 10;\n\n /**\n * Density of a spray (number of dots per chunk)\n * @type Number\n */\n density = 20;\n\n /**\n * Width of spray dots\n * @type Number\n */\n dotWidth = 1;\n\n /**\n * Width variance of spray dots\n * @type Number\n */\n dotWidthVariance = 1;\n\n /**\n * Whether opacity of a dot should be random\n * @type Boolean\n */\n randomOpacity = false;\n\n /**\n * Whether overlapping dots (rectangles) should be removed (for performance reasons)\n * @type Boolean\n */\n optimizeOverlapping = true;\n\n declare private sprayChunks: SprayBrushPoint[][];\n\n declare private sprayChunk: SprayBrushPoint[];\n\n /**\n * Constructor\n * @param {Canvas} canvas\n * @return {SprayBrush} Instance of a spray brush\n */\n constructor(canvas: Canvas) {\n super(canvas);\n this.sprayChunks = [];\n this.sprayChunk = [];\n }\n\n /**\n * Invoked on mouse down\n * @param {Point} pointer\n */\n onMouseDown(pointer: Point) {\n this.sprayChunks = [];\n this.canvas.clearContext(this.canvas.contextTop);\n this._setShadow();\n\n this.addSprayChunk(pointer);\n this.renderChunck(this.sprayChunk);\n }\n\n /**\n * Invoked on mouse move\n * @param {Point} pointer\n */\n onMouseMove(pointer: Point) {\n if (this.limitedToCanvasSize === true && this._isOutSideCanvas(pointer)) {\n return;\n }\n this.addSprayChunk(pointer);\n this.renderChunck(this.sprayChunk);\n }\n\n /**\n * Invoked on mouse up\n */\n onMouseUp() {\n const originalRenderOnAddRemove = this.canvas.renderOnAddRemove;\n this.canvas.renderOnAddRemove = false;\n\n const rects: Rect[] = [];\n\n for (let i = 0; i < this.sprayChunks.length; i++) {\n const sprayChunk = this.sprayChunks[i];\n for (let j = 0; j < sprayChunk.length; j++) {\n const chunck = sprayChunk[j];\n const rect = new Rect({\n width: chunck.width,\n height: chunck.width,\n left: chunck.x + 1,\n top: chunck.y + 1,\n originX: CENTER,\n originY: CENTER,\n fill: this.color,\n });\n rects.push(rect);\n }\n }\n\n const group = new Group(\n this.optimizeOverlapping ? getUniqueRects(rects) : rects,\n {\n objectCaching: true,\n subTargetCheck: false,\n interactive: false,\n },\n );\n this.shadow && group.set('shadow', new Shadow(this.shadow));\n this.canvas.fire('before:path:created', { path: group });\n this.canvas.add(group);\n this.canvas.fire('path:created', { path: group });\n\n this.canvas.clearContext(this.canvas.contextTop);\n this._resetShadow();\n this.canvas.renderOnAddRemove = originalRenderOnAddRemove;\n this.canvas.requestRenderAll();\n }\n\n renderChunck(sprayChunck: SprayBrushPoint[]) {\n const ctx = this.canvas.contextTop;\n ctx.fillStyle = this.color;\n\n this._saveAndTransform(ctx);\n\n for (let i = 0; i < sprayChunck.length; i++) {\n const point = sprayChunck[i];\n ctx.globalAlpha = point.opacity;\n ctx.fillRect(point.x, point.y, point.width, point.width);\n }\n\n ctx.restore();\n }\n\n /**\n * Render all spray chunks\n */\n _render() {\n const ctx = this.canvas.contextTop;\n ctx.fillStyle = this.color;\n\n this._saveAndTransform(ctx);\n\n for (let i = 0; i < this.sprayChunks.length; i++) {\n this.renderChunck(this.sprayChunks[i]);\n }\n ctx.restore();\n }\n\n /**\n * @param {Point} pointer\n */\n addSprayChunk(pointer: Point) {\n this.sprayChunk = [];\n const radius = this.width / 2;\n\n for (let i = 0; i < this.density; i++) {\n this.sprayChunk.push({\n x: getRandomInt(pointer.x - radius, pointer.x + radius),\n y: getRandomInt(pointer.y - radius, pointer.y + radius),\n width: this.dotWidthVariance\n ? getRandomInt(\n // bottom clamp width to 1\n Math.max(1, this.dotWidth - this.dotWidthVariance),\n this.dotWidth + this.dotWidthVariance,\n )\n : this.dotWidth,\n opacity: this.randomOpacity ? getRandomInt(0, 100) / 100 : 1,\n });\n }\n\n this.sprayChunks.push(this.sprayChunk);\n }\n}\n","import { Pattern } from '../Pattern';\nimport { createCanvasElement } from '../util/misc/dom';\nimport type { Canvas } from '../canvas/Canvas';\nimport { PencilBrush } from './PencilBrush';\nimport type { TSimplePathData } from '../util/path/typedefs';\n\nexport class PatternBrush extends PencilBrush {\n declare source?: CanvasImageSource;\n\n constructor(canvas: Canvas) {\n super(canvas);\n }\n\n getPatternSrc() {\n const dotWidth = 20,\n dotDistance = 5,\n patternCanvas = createCanvasElement(),\n patternCtx = patternCanvas.getContext('2d');\n\n patternCanvas.width = patternCanvas.height = dotWidth + dotDistance;\n if (patternCtx) {\n patternCtx.fillStyle = this.color;\n patternCtx.beginPath();\n patternCtx.arc(\n dotWidth / 2,\n dotWidth / 2,\n dotWidth / 2,\n 0,\n Math.PI * 2,\n false,\n );\n patternCtx.closePath();\n patternCtx.fill();\n }\n return patternCanvas;\n }\n\n /**\n * Creates \"pattern\" instance property\n * @param {CanvasRenderingContext2D} ctx\n */\n getPattern(ctx: CanvasRenderingContext2D) {\n return ctx.createPattern(this.source || this.getPatternSrc(), 'repeat');\n }\n\n /**\n * Sets brush styles\n * @param {CanvasRenderingContext2D} ctx\n */\n _setBrushStyles(ctx: CanvasRenderingContext2D) {\n super._setBrushStyles(ctx);\n const pattern = this.getPattern(ctx);\n pattern && (ctx.strokeStyle = pattern);\n }\n\n /**\n * Creates path\n */\n createPath(pathData: TSimplePathData) {\n const path = super.createPath(pathData),\n topLeft = path._getLeftTopCoords().scalarAdd(path.strokeWidth / 2);\n\n path.stroke = new Pattern({\n source: this.source || this.getPatternSrc(),\n offsetX: -topLeft.x,\n offsetY: -topLeft.y,\n });\n return path;\n }\n}\n","import { SHARED_ATTRIBUTES } from '../parser/attributes';\nimport { parseAttributes } from '../parser/parseAttributes';\nimport type { Abortable, TClassProperties, TOptions } from '../typedefs';\nimport { classRegistry } from '../ClassRegistry';\nimport { FabricObject, cacheProperties } from './Object/FabricObject';\nimport { Point } from '../Point';\nimport { isFiller } from '../util/typeAssertions';\nimport type { FabricObjectProps, SerializedObjectProps } from './Object/types';\nimport type { ObjectEvents } from '../EventTypeDefs';\nimport { makeBoundingBoxFromPoints } from '../util';\nimport { CENTER, LEFT, TOP } from '../constants';\nimport type { CSSRules } from '../parser/typedefs';\n\n// @TODO this code is terrible and Line should be a special case of polyline.\n\nconst coordProps = ['x1', 'x2', 'y1', 'y2'] as const;\n\ninterface UniqueLineProps {\n x1: number;\n x2: number;\n y1: number;\n y2: number;\n}\n\nexport interface SerializedLineProps\n extends SerializedObjectProps,\n UniqueLineProps {}\n\n/**\n * A Class to draw a line\n * A bunch of methods will be added to Polyline to handle the line case\n * The line class is very strange to work with, is all special, it hardly aligns\n * to what a developer want everytime there is an angle\n * @deprecated\n */\nexport class Line<\n Props extends TOptions = Partial,\n SProps extends SerializedLineProps = SerializedLineProps,\n EventSpec extends ObjectEvents = ObjectEvents,\n >\n extends FabricObject\n implements UniqueLineProps\n{\n /**\n * x value or first line edge\n * @type number\n */\n declare x1: number;\n\n /**\n * y value or first line edge\n * @type number\n */\n declare y1: number;\n\n /**\n * x value or second line edge\n * @type number\n */\n declare x2: number;\n\n /**\n * y value or second line edge\n * @type number\n */\n declare y2: number;\n\n static type = 'Line';\n\n static cacheProperties = [...cacheProperties, ...coordProps];\n /**\n * Constructor\n * @param {Array} [points] Array of points\n * @param {Object} [options] Options object\n * @return {Line} thisArg\n */\n constructor([x1, y1, x2, y2] = [0, 0, 0, 0], options: Partial = {}) {\n super();\n Object.assign(this, Line.ownDefaults);\n this.setOptions(options);\n this.x1 = x1;\n this.x2 = x2;\n this.y1 = y1;\n this.y2 = y2;\n this._setWidthHeight();\n const { left, top } = options;\n typeof left === 'number' && this.set(LEFT, left);\n typeof top === 'number' && this.set(TOP, top);\n }\n\n /**\n * @private\n * @param {Object} [options] Options\n */\n _setWidthHeight() {\n const { x1, y1, x2, y2 } = this;\n this.width = Math.abs(x2 - x1);\n this.height = Math.abs(y2 - y1);\n const { left, top, width, height } = makeBoundingBoxFromPoints([\n { x: x1, y: y1 },\n { x: x2, y: y2 },\n ]);\n const position = new Point(left + width / 2, top + height / 2);\n this.setPositionByOrigin(position, CENTER, CENTER);\n }\n\n /**\n * @private\n * @param {String} key\n * @param {*} value\n */\n _set(key: string, value: any) {\n super._set(key, value);\n if (coordProps.includes(key as keyof UniqueLineProps)) {\n // this doesn't make sense very much, since setting x1 when top or left\n // are already set, is just going to show a strange result since the\n // line will move way more than the developer expect.\n // in fabric5 it worked only when the line didn't have extra transformations,\n // in fabric6 too. With extra transform they behave bad in different ways.\n // This needs probably a good rework or a tutorial if you have to create a dynamic line\n this._setWidthHeight();\n }\n return this;\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _render(ctx: CanvasRenderingContext2D) {\n ctx.beginPath();\n\n const p = this.calcLinePoints();\n ctx.moveTo(p.x1, p.y1);\n ctx.lineTo(p.x2, p.y2);\n\n ctx.lineWidth = this.strokeWidth;\n\n // TODO: test this\n // make sure setting \"fill\" changes color of a line\n // (by copying fillStyle to strokeStyle, since line is stroked, not filled)\n const origStrokeStyle = ctx.strokeStyle;\n if (isFiller(this.stroke)) {\n ctx.strokeStyle = this.stroke.toLive(ctx)!;\n } else {\n ctx.strokeStyle = this.stroke ?? ctx.fillStyle;\n }\n this.stroke && this._renderStroke(ctx);\n ctx.strokeStyle = origStrokeStyle;\n }\n\n /**\n * This function is an helper for svg import. it returns the center of the object in the svg\n * untransformed coordinates\n * @private\n * @return {Point} center point from element coordinates\n */\n _findCenterFromElement(): Point {\n return new Point((this.x1 + this.x2) / 2, (this.y1 + this.y2) / 2);\n }\n\n /**\n * Returns object representation of an instance\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} object representation of an instance\n */\n toObject<\n T extends Omit, keyof SProps>,\n K extends keyof T = never,\n >(propertiesToInclude: K[] = []): Pick & SProps {\n return {\n ...super.toObject(propertiesToInclude),\n ...this.calcLinePoints(),\n };\n }\n\n /*\n * Calculate object dimensions from its properties\n * @private\n */\n _getNonTransformedDimensions(): Point {\n const dim = super._getNonTransformedDimensions();\n if (this.strokeLineCap === 'butt') {\n if (this.width === 0) {\n dim.y -= this.strokeWidth;\n }\n if (this.height === 0) {\n dim.x -= this.strokeWidth;\n }\n }\n return dim;\n }\n\n /**\n * Recalculates line points given width and height\n * Those points are simply placed around the center,\n * This is not useful outside internal render functions and svg output\n * Is not meant to be for the developer.\n * @private\n */\n calcLinePoints(): UniqueLineProps {\n const { x1: _x1, x2: _x2, y1: _y1, y2: _y2, width, height } = this;\n const xMult = _x1 <= _x2 ? -1 : 1,\n yMult = _y1 <= _y2 ? -1 : 1,\n x1 = (xMult * width) / 2,\n y1 = (yMult * height) / 2,\n x2 = (xMult * -width) / 2,\n y2 = (yMult * -height) / 2;\n\n return {\n x1,\n x2,\n y1,\n y2,\n };\n }\n\n /* _FROM_SVG_START_ */\n\n /**\n * Returns svg representation of an instance\n * @return {Array} an array of strings with the specific svg representation\n * of the instance\n */\n _toSVG() {\n const { x1, x2, y1, y2 } = this.calcLinePoints();\n return [\n '\\n`,\n ];\n }\n\n /**\n * List of attribute names to account for when parsing SVG element (used by {@link Line.fromElement})\n * @see http://www.w3.org/TR/SVG/shapes.html#LineElement\n */\n static ATTRIBUTE_NAMES = SHARED_ATTRIBUTES.concat(coordProps);\n\n /**\n * Returns Line instance from an SVG element\n * @param {HTMLElement} element Element to parse\n * @param {Object} [options] Options object\n * @param {Function} [callback] callback function invoked after parsing\n */\n static async fromElement(\n element: HTMLElement,\n options?: Abortable,\n cssRules?: CSSRules,\n ) {\n const {\n x1 = 0,\n y1 = 0,\n x2 = 0,\n y2 = 0,\n ...parsedAttributes\n } = parseAttributes(element, this.ATTRIBUTE_NAMES, cssRules);\n return new this([x1, y1, x2, y2], parsedAttributes);\n }\n\n /* _FROM_SVG_END_ */\n\n /**\n * Returns Line instance from an object representation\n * @param {Object} object Object to create an instance from\n * @returns {Promise}\n */\n static fromObject>({\n x1,\n y1,\n x2,\n y2,\n ...object\n }: T) {\n return this._fromObject(\n {\n ...object,\n points: [x1, y1, x2, y2],\n },\n {\n extraParam: 'points',\n },\n );\n }\n}\n\nclassRegistry.setClass(Line);\nclassRegistry.setSVGClass(Line);\n","import { classRegistry } from '../ClassRegistry';\nimport { FabricObject } from './Object/FabricObject';\nimport type { FabricObjectProps, SerializedObjectProps } from './Object/types';\nimport type { TClassProperties, TOptions } from '../typedefs';\nimport type { ObjectEvents } from '../EventTypeDefs';\n\nexport const triangleDefaultValues: Partial> = {\n width: 100,\n height: 100,\n};\n\nexport class Triangle<\n Props extends TOptions = Partial,\n SProps extends SerializedObjectProps = SerializedObjectProps,\n EventSpec extends ObjectEvents = ObjectEvents,\n >\n extends FabricObject\n implements FabricObjectProps\n{\n static type = 'Triangle';\n\n static ownDefaults = triangleDefaultValues;\n\n static getDefaults(): Record {\n return { ...super.getDefaults(), ...Triangle.ownDefaults };\n }\n\n /**\n * Constructor\n * @param {Object} [options] Options object\n */\n constructor(options?: Props) {\n super();\n Object.assign(this, Triangle.ownDefaults);\n this.setOptions(options);\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _render(ctx: CanvasRenderingContext2D) {\n const widthBy2 = this.width / 2,\n heightBy2 = this.height / 2;\n\n ctx.beginPath();\n ctx.moveTo(-widthBy2, heightBy2);\n ctx.lineTo(0, -heightBy2);\n ctx.lineTo(widthBy2, heightBy2);\n ctx.closePath();\n\n this._renderPaintInOrder(ctx);\n }\n\n /**\n * Returns svg representation of an instance\n * @return {Array} an array of strings with the specific svg representation\n * of the instance\n */\n _toSVG() {\n const widthBy2 = this.width / 2,\n heightBy2 = this.height / 2,\n points = `${-widthBy2} ${heightBy2},0 ${-heightBy2},${widthBy2} ${heightBy2}`;\n return [''];\n }\n}\n\nclassRegistry.setClass(Triangle);\nclassRegistry.setSVGClass(Triangle);\n","import { SCALE_X, SCALE_Y, twoMathPi } from '../constants';\nimport { SHARED_ATTRIBUTES } from '../parser/attributes';\nimport { parseAttributes } from '../parser/parseAttributes';\nimport type { Abortable, TClassProperties, TOptions } from '../typedefs';\nimport { classRegistry } from '../ClassRegistry';\nimport { FabricObject, cacheProperties } from './Object/FabricObject';\nimport type { FabricObjectProps, SerializedObjectProps } from './Object/types';\nimport type { ObjectEvents } from '../EventTypeDefs';\nimport type { CSSRules } from '../parser/typedefs';\n\nexport const ellipseDefaultValues: Partial> = {\n rx: 0,\n ry: 0,\n};\n\ninterface UniqueEllipseProps {\n rx: number;\n ry: number;\n}\n\nexport interface SerializedEllipseProps\n extends SerializedObjectProps,\n UniqueEllipseProps {}\n\nexport interface EllipseProps extends FabricObjectProps, UniqueEllipseProps {}\n\nconst ELLIPSE_PROPS = ['rx', 'ry'] as const;\n\nexport class Ellipse<\n Props extends TOptions = Partial,\n SProps extends SerializedEllipseProps = SerializedEllipseProps,\n EventSpec extends ObjectEvents = ObjectEvents,\n >\n extends FabricObject\n implements EllipseProps\n{\n /**\n * Horizontal radius\n * @type Number\n */\n declare rx: number;\n\n /**\n * Vertical radius\n * @type Number\n */\n declare ry: number;\n\n static type = 'Ellipse';\n\n static cacheProperties = [...cacheProperties, ...ELLIPSE_PROPS];\n\n static ownDefaults = ellipseDefaultValues;\n\n static getDefaults(): Record {\n return {\n ...super.getDefaults(),\n ...Ellipse.ownDefaults,\n };\n }\n\n /**\n * Constructor\n * @param {Object} [options] Options object\n */\n constructor(options?: Props) {\n super();\n Object.assign(this, Ellipse.ownDefaults);\n this.setOptions(options);\n }\n\n /**\n * @private\n * @param {String} key\n * @param {*} value\n * @return {Ellipse} thisArg\n */\n _set(key: string, value: any) {\n super._set(key, value);\n switch (key) {\n case 'rx':\n this.rx = value;\n this.set('width', value * 2);\n break;\n\n case 'ry':\n this.ry = value;\n this.set('height', value * 2);\n break;\n }\n return this;\n }\n\n /**\n * Returns horizontal radius of an object (according to how an object is scaled)\n * @return {Number}\n */\n getRx() {\n return this.get('rx') * this.get(SCALE_X);\n }\n\n /**\n * Returns Vertical radius of an object (according to how an object is scaled)\n * @return {Number}\n */\n getRy() {\n return this.get('ry') * this.get(SCALE_Y);\n }\n\n /**\n * Returns object representation of an instance\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} object representation of an instance\n */\n toObject<\n T extends Omit, keyof SProps>,\n K extends keyof T = never,\n >(propertiesToInclude: K[] = []): Pick & SProps {\n return super.toObject([...ELLIPSE_PROPS, ...propertiesToInclude]);\n }\n\n /**\n * Returns svg representation of an instance\n * @return {Array} an array of strings with the specific svg representation\n * of the instance\n */\n _toSVG(): string[] {\n return [\n '\\n`,\n ];\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx context to render on\n */\n _render(ctx: CanvasRenderingContext2D) {\n ctx.beginPath();\n ctx.save();\n ctx.transform(1, 0, 0, this.ry / this.rx, 0, 0);\n ctx.arc(0, 0, this.rx, 0, twoMathPi, false);\n ctx.restore();\n this._renderPaintInOrder(ctx);\n }\n\n /* _FROM_SVG_START_ */\n\n /**\n * List of attribute names to account for when parsing SVG element (used by {@link Ellipse.fromElement})\n * @see http://www.w3.org/TR/SVG/shapes.html#EllipseElement\n */\n static ATTRIBUTE_NAMES = [...SHARED_ATTRIBUTES, 'cx', 'cy', 'rx', 'ry'];\n\n /**\n * Returns {@link Ellipse} instance from an SVG element\n * @param {HTMLElement} element Element to parse\n * @return {Ellipse}\n */\n static async fromElement(\n element: HTMLElement,\n options?: Abortable,\n cssRules?: CSSRules,\n ) {\n const parsedAttributes = parseAttributes(\n element,\n this.ATTRIBUTE_NAMES,\n cssRules,\n );\n\n parsedAttributes.left = (parsedAttributes.left || 0) - parsedAttributes.rx;\n parsedAttributes.top = (parsedAttributes.top || 0) - parsedAttributes.ry;\n return new this(parsedAttributes);\n }\n\n /* _FROM_SVG_END_ */\n}\n\nclassRegistry.setClass(Ellipse);\nclassRegistry.setSVGClass(Ellipse);\n","import type { XY } from '../Point';\n\n/**\n * Parses \"points\" attribute, returning an array of values\n * @param {String} points points attribute string\n * @return {Array} array of points\n */\nexport function parsePointsAttribute(points: string | null): XY[] {\n // points attribute is required and must not be empty\n if (!points) {\n return [];\n }\n\n // replace commas with whitespace and remove bookending whitespace\n const pointsSplit: string[] = points.replace(/,/g, ' ').trim().split(/\\s+/);\n\n const parsedPoints = [];\n\n for (let i = 0; i < pointsSplit.length; i += 2) {\n parsedPoints.push({\n x: parseFloat(pointsSplit[i]),\n y: parseFloat(pointsSplit[i + 1]),\n });\n }\n\n // odd number of points is an error\n // if (parsedPoints.length % 2 !== 0) {\n // return null;\n // }\n return parsedPoints;\n}\n","import { config } from '../config';\nimport { SHARED_ATTRIBUTES } from '../parser/attributes';\nimport { parseAttributes } from '../parser/parseAttributes';\nimport { parsePointsAttribute } from '../parser/parsePointsAttribute';\nimport type { XY } from '../Point';\nimport { Point } from '../Point';\nimport type { Abortable, TClassProperties, TOptions } from '../typedefs';\nimport { classRegistry } from '../ClassRegistry';\nimport { makeBoundingBoxFromPoints } from '../util/misc/boundingBoxFromPoints';\nimport { calcDimensionsMatrix, transformPoint } from '../util/misc/matrix';\nimport { projectStrokeOnPoints } from '../util/misc/projectStroke';\nimport type { TProjectStrokeOnPointsOptions } from '../util/misc/projectStroke/types';\nimport { degreesToRadians } from '../util/misc/radiansDegreesConversion';\nimport { toFixed } from '../util/misc/toFixed';\nimport { FabricObject, cacheProperties } from './Object/FabricObject';\nimport type { FabricObjectProps, SerializedObjectProps } from './Object/types';\nimport type { ObjectEvents } from '../EventTypeDefs';\nimport {\n CENTER,\n LEFT,\n SCALE_X,\n SCALE_Y,\n SKEW_X,\n SKEW_Y,\n TOP,\n} from '../constants';\nimport type { CSSRules } from '../parser/typedefs';\n\nexport const polylineDefaultValues: Partial> = {\n /**\n * @deprecated transient option soon to be removed in favor of a different design\n */\n exactBoundingBox: false,\n};\n\nexport interface SerializedPolylineProps extends SerializedObjectProps {\n points: XY[];\n}\n\nexport class Polyline<\n Props extends TOptions = Partial,\n SProps extends SerializedPolylineProps = SerializedPolylineProps,\n EventSpec extends ObjectEvents = ObjectEvents,\n> extends FabricObject {\n /**\n * Points array\n * @type Array\n */\n declare points: XY[];\n\n /**\n * WARNING: Feature in progress\n * Calculate the exact bounding box taking in account strokeWidth on acute angles\n * this will be turned to true by default on fabric 6.0\n * maybe will be left in as an optimization since calculations may be slow\n * @deprecated transient option soon to be removed in favor of a different design\n * @type Boolean\n * @default false\n */\n declare exactBoundingBox: boolean;\n\n declare private initialized: true | undefined;\n\n static ownDefaults = polylineDefaultValues;\n\n static type = 'Polyline';\n\n static getDefaults(): Record {\n return {\n ...super.getDefaults(),\n ...Polyline.ownDefaults,\n };\n }\n\n /**\n * A list of properties that if changed trigger a recalculation of dimensions\n * @todo check if you really need to recalculate for all cases\n */\n static layoutProperties: (keyof Polyline)[] = [\n SKEW_X,\n SKEW_Y,\n 'strokeLineCap',\n 'strokeLineJoin',\n 'strokeMiterLimit',\n 'strokeWidth',\n 'strokeUniform',\n 'points',\n ];\n\n declare pathOffset: Point;\n\n declare strokeOffset: Point;\n\n static cacheProperties = [...cacheProperties, 'points'];\n\n strokeDiff: Point;\n\n /**\n * Constructor\n * @param {Array} points Array of points (where each point is an object with x and y)\n * @param {Object} [options] Options object\n * @return {Polyline} thisArg\n * @example\n * var poly = new Polyline([\n * { x: 10, y: 10 },\n * { x: 50, y: 30 },\n * { x: 40, y: 70 },\n * { x: 60, y: 50 },\n * { x: 100, y: 150 },\n * { x: 40, y: 100 }\n * ], {\n * stroke: 'red',\n * left: 100,\n * top: 100\n * });\n */\n constructor(points: XY[] = [], options: Props = {} as Props) {\n super();\n Object.assign(this, Polyline.ownDefaults);\n this.setOptions(options);\n this.points = points;\n const { left, top } = options;\n this.initialized = true;\n this.setBoundingBox(true);\n typeof left === 'number' && this.set(LEFT, left);\n typeof top === 'number' && this.set(TOP, top);\n }\n\n protected isOpen() {\n return true;\n }\n\n private _projectStrokeOnPoints(options: TProjectStrokeOnPointsOptions) {\n return projectStrokeOnPoints(this.points, options, this.isOpen());\n }\n\n /**\n * Calculate the polygon bounding box\n * @private\n */\n _calcDimensions(options?: Partial) {\n options = {\n scaleX: this.scaleX,\n scaleY: this.scaleY,\n skewX: this.skewX,\n skewY: this.skewY,\n strokeLineCap: this.strokeLineCap,\n strokeLineJoin: this.strokeLineJoin,\n strokeMiterLimit: this.strokeMiterLimit,\n strokeUniform: this.strokeUniform,\n strokeWidth: this.strokeWidth,\n ...(options || {}),\n };\n const points = this.exactBoundingBox\n ? this._projectStrokeOnPoints(\n options as TProjectStrokeOnPointsOptions,\n ).map((projection) => projection.projectedPoint)\n : this.points;\n if (points.length === 0) {\n return {\n left: 0,\n top: 0,\n width: 0,\n height: 0,\n pathOffset: new Point(),\n strokeOffset: new Point(),\n strokeDiff: new Point(),\n };\n }\n const bbox = makeBoundingBoxFromPoints(points),\n // Remove scale effect, since it's applied after\n matrix = calcDimensionsMatrix({ ...options, scaleX: 1, scaleY: 1 }),\n bboxNoStroke = makeBoundingBoxFromPoints(\n this.points.map((p) => transformPoint(p, matrix, true)),\n ),\n scale = new Point(this.scaleX, this.scaleY);\n let offsetX = bbox.left + bbox.width / 2,\n offsetY = bbox.top + bbox.height / 2;\n if (this.exactBoundingBox) {\n offsetX = offsetX - offsetY * Math.tan(degreesToRadians(this.skewX));\n // Order of those assignments is important.\n // offsetY relies on offsetX being already changed by the line above\n offsetY = offsetY - offsetX * Math.tan(degreesToRadians(this.skewY));\n }\n\n return {\n ...bbox,\n pathOffset: new Point(offsetX, offsetY),\n strokeOffset: new Point(bboxNoStroke.left, bboxNoStroke.top)\n .subtract(new Point(bbox.left, bbox.top))\n .multiply(scale),\n strokeDiff: new Point(bbox.width, bbox.height)\n .subtract(new Point(bboxNoStroke.width, bboxNoStroke.height))\n .multiply(scale),\n };\n }\n\n /**\n * This function is an helper for svg import. it returns the center of the object in the svg\n * untransformed coordinates, by look at the polyline/polygon points.\n * @private\n * @return {Point} center point from element coordinates\n */\n _findCenterFromElement(): Point {\n const bbox = makeBoundingBoxFromPoints(this.points);\n return new Point(bbox.left + bbox.width / 2, bbox.top + bbox.height / 2);\n }\n\n setDimensions() {\n this.setBoundingBox();\n }\n\n setBoundingBox(adjustPosition?: boolean) {\n const { left, top, width, height, pathOffset, strokeOffset, strokeDiff } =\n this._calcDimensions();\n this.set({ width, height, pathOffset, strokeOffset, strokeDiff });\n adjustPosition &&\n this.setPositionByOrigin(\n new Point(left + width / 2, top + height / 2),\n CENTER,\n CENTER,\n );\n }\n\n /**\n * @deprecated intermidiate method to be removed, do not use\n */\n protected isStrokeAccountedForInDimensions() {\n return this.exactBoundingBox;\n }\n\n /**\n * @override stroke is taken in account in size\n */\n _getNonTransformedDimensions() {\n return this.exactBoundingBox\n ? // TODO: fix this\n new Point(this.width, this.height)\n : super._getNonTransformedDimensions();\n }\n\n /**\n * @override stroke and skewing are taken into account when projecting stroke on points,\n * therefore we don't want the default calculation to account for skewing as well.\n * Though it is possible to pass `width` and `height` in `options`, doing so is very strange, use with discretion.\n *\n * @private\n */\n _getTransformedDimensions(options: any = {}) {\n if (this.exactBoundingBox) {\n let size: Point;\n /* When `strokeUniform = true`, any changes to the properties require recalculating the `width` and `height` because\n the stroke projections are affected.\n When `strokeUniform = false`, we don't need to recalculate for scale transformations, as the effect of scale on\n projections follows a linear function (e.g. scaleX of 2 just multiply width by 2)*/\n if (\n Object.keys(options).some(\n (key) =>\n this.strokeUniform ||\n (this.constructor as typeof Polyline).layoutProperties.includes(\n key as keyof TProjectStrokeOnPointsOptions,\n ),\n )\n ) {\n const { width, height } = this._calcDimensions(options);\n size = new Point(options.width ?? width, options.height ?? height);\n } else {\n size = new Point(\n options.width ?? this.width,\n options.height ?? this.height,\n );\n }\n return size.multiply(\n new Point(options.scaleX || this.scaleX, options.scaleY || this.scaleY),\n );\n } else {\n return super._getTransformedDimensions(options);\n }\n }\n\n /**\n * Recalculates dimensions when changing skew and scale\n * @private\n */\n _set(key: string, value: any) {\n const changed = this.initialized && this[key as keyof this] !== value;\n const output = super._set(key, value);\n if (\n this.exactBoundingBox &&\n changed &&\n (((key === SCALE_X || key === SCALE_Y) &&\n this.strokeUniform &&\n (this.constructor as typeof Polyline).layoutProperties.includes(\n 'strokeUniform',\n )) ||\n (this.constructor as typeof Polyline).layoutProperties.includes(\n key as keyof Polyline,\n ))\n ) {\n this.setDimensions();\n }\n return output;\n }\n\n /**\n * Returns object representation of an instance\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} Object representation of an instance\n */\n toObject<\n T extends Omit, keyof SProps>,\n K extends keyof T = never,\n >(propertiesToInclude: K[] = []): Pick & SProps {\n return {\n ...super.toObject(propertiesToInclude),\n points: this.points.map(({ x, y }) => ({ x, y })),\n };\n }\n\n /**\n * Returns svg representation of an instance\n * @return {Array} an array of strings with the specific svg representation\n * of the instance\n */\n _toSVG() {\n const points = [],\n diffX = this.pathOffset.x,\n diffY = this.pathOffset.y,\n NUM_FRACTION_DIGITS = config.NUM_FRACTION_DIGITS;\n\n for (let i = 0, len = this.points.length; i < len; i++) {\n points.push(\n toFixed(this.points[i].x - diffX, NUM_FRACTION_DIGITS),\n ',',\n toFixed(this.points[i].y - diffY, NUM_FRACTION_DIGITS),\n ' ',\n );\n }\n return [\n `<${\n (this.constructor as typeof Polyline).type.toLowerCase() as\n | 'polyline'\n | 'polygon'\n } `,\n 'COMMON_PARTS',\n `points=\"${points.join('')}\" />\\n`,\n ];\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _render(ctx: CanvasRenderingContext2D) {\n const len = this.points.length,\n x = this.pathOffset.x,\n y = this.pathOffset.y;\n\n if (!len || isNaN(this.points[len - 1].y)) {\n // do not draw if no points or odd points\n // NaN comes from parseFloat of a empty string in parser\n return;\n }\n ctx.beginPath();\n ctx.moveTo(this.points[0].x - x, this.points[0].y - y);\n for (let i = 0; i < len; i++) {\n const point = this.points[i];\n ctx.lineTo(point.x - x, point.y - y);\n }\n !this.isOpen() && ctx.closePath();\n this._renderPaintInOrder(ctx);\n }\n\n /**\n * Returns complexity of an instance\n * @return {Number} complexity of this instance\n */\n complexity(): number {\n return this.points.length;\n }\n\n /* _FROM_SVG_START_ */\n\n /**\n * List of attribute names to account for when parsing SVG element (used by {@link Polyline.fromElement})\n * @see: http://www.w3.org/TR/SVG/shapes.html#PolylineElement\n */\n static ATTRIBUTE_NAMES = [...SHARED_ATTRIBUTES];\n\n /**\n * Returns Polyline instance from an SVG element\n * @param {HTMLElement} element Element to parser\n * @param {Object} [options] Options object\n */\n static async fromElement(\n element: HTMLElement | SVGElement,\n options?: Abortable,\n cssRules?: CSSRules,\n ) {\n const points = parsePointsAttribute(element.getAttribute('points')),\n // we omit left and top to instruct the constructor to position the object using the bbox\n\n { left, top, ...parsedAttributes } = parseAttributes(\n element,\n this.ATTRIBUTE_NAMES,\n cssRules,\n );\n return new this(points, {\n ...parsedAttributes,\n ...options,\n });\n }\n\n /* _FROM_SVG_END_ */\n\n /**\n * Returns Polyline instance from an object representation\n * @param {Object} object Object to create an instance from\n * @returns {Promise}\n */\n static fromObject>(object: T) {\n return this._fromObject(object, {\n extraParam: 'points',\n });\n }\n}\n\nclassRegistry.setClass(Polyline);\nclassRegistry.setSVGClass(Polyline);\n","import { classRegistry } from '../ClassRegistry';\nimport { Polyline, polylineDefaultValues } from './Polyline';\n\nexport class Polygon extends Polyline {\n static ownDefaults = polylineDefaultValues;\n\n static type = 'Polygon';\n\n protected isOpen() {\n return false;\n }\n}\n\nclassRegistry.setClass(Polygon);\nclassRegistry.setSVGClass(Polygon);\n","import type { ObjectEvents } from '../../EventTypeDefs';\nimport type { FabricObjectProps, SerializedObjectProps } from '../Object/types';\nimport type { TOptions } from '../../typedefs';\nimport { FabricObject } from '../Object/FabricObject';\nimport { styleProperties } from './constants';\nimport type { StylePropertiesType } from './constants';\nimport type { FabricText } from './Text';\nimport { pick } from '../../util';\nimport { pickBy } from '../../util/misc/pick';\n\nexport type CompleteTextStyleDeclaration = Pick<\n FabricText,\n StylePropertiesType\n>;\n\nexport type TextStyleDeclaration = Partial;\n\nexport type TextStyle = {\n [line: number | string]: { [char: number | string]: TextStyleDeclaration };\n};\n\nexport abstract class StyledText<\n Props extends TOptions = Partial,\n SProps extends SerializedObjectProps = SerializedObjectProps,\n EventSpec extends ObjectEvents = ObjectEvents,\n> extends FabricObject {\n declare abstract styles: TextStyle;\n declare protected abstract _textLines: string[][];\n declare protected _forceClearCache: boolean;\n static _styleProperties: Readonly = styleProperties;\n abstract get2DCursorLocation(\n selectionStart: number,\n skipWrapping?: boolean,\n ): { charIndex: number; lineIndex: number };\n\n /**\n * Returns true if object has no styling or no styling in a line\n * @param {Number} lineIndex , lineIndex is on wrapped lines.\n * @return {Boolean}\n */\n isEmptyStyles(lineIndex?: number): boolean {\n if (!this.styles) {\n return true;\n }\n if (typeof lineIndex !== 'undefined' && !this.styles[lineIndex]) {\n return true;\n }\n const obj =\n typeof lineIndex === 'undefined'\n ? this.styles\n : { line: this.styles[lineIndex] };\n for (const p1 in obj) {\n for (const p2 in obj[p1]) {\n // eslint-disable-next-line no-unused-vars\n for (const p3 in obj[p1][p2]) {\n return false;\n }\n }\n }\n return true;\n }\n\n /**\n * Returns true if object has a style property or has it ina specified line\n * This function is used to detect if a text will use a particular property or not.\n * @param {String} property to check for\n * @param {Number} lineIndex to check the style on\n * @return {Boolean}\n */\n styleHas(property: keyof TextStyleDeclaration, lineIndex?: number): boolean {\n if (!this.styles) {\n return false;\n }\n if (typeof lineIndex !== 'undefined' && !this.styles[lineIndex]) {\n return false;\n }\n const obj =\n typeof lineIndex === 'undefined'\n ? this.styles\n : { 0: this.styles[lineIndex] };\n // eslint-disable-next-line\n for (const p1 in obj) {\n // eslint-disable-next-line\n for (const p2 in obj[p1]) {\n if (typeof obj[p1][p2][property] !== 'undefined') {\n return true;\n }\n }\n }\n return false;\n }\n\n /**\n * Check if characters in a text have a value for a property\n * whose value matches the textbox's value for that property. If so,\n * the character-level property is deleted. If the character\n * has no other properties, then it is also deleted. Finally,\n * if the line containing that character has no other characters\n * then it also is deleted.\n */\n cleanStyle(property: keyof TextStyleDeclaration) {\n if (!this.styles) {\n return false;\n }\n const obj = this.styles;\n let stylesCount = 0,\n letterCount,\n stylePropertyValue,\n allStyleObjectPropertiesMatch = true,\n graphemeCount = 0;\n for (const p1 in obj) {\n letterCount = 0;\n for (const p2 in obj[p1]) {\n const styleObject = obj[p1][p2] || {},\n stylePropertyHasBeenSet = styleObject[property] !== undefined;\n\n stylesCount++;\n\n if (stylePropertyHasBeenSet) {\n if (!stylePropertyValue) {\n stylePropertyValue = styleObject[property];\n } else if (styleObject[property] !== stylePropertyValue) {\n allStyleObjectPropertiesMatch = false;\n }\n\n if (styleObject[property] === this[property as keyof this]) {\n delete styleObject[property];\n }\n } else {\n allStyleObjectPropertiesMatch = false;\n }\n\n if (Object.keys(styleObject).length !== 0) {\n letterCount++;\n } else {\n delete obj[p1][p2];\n }\n }\n\n if (letterCount === 0) {\n delete obj[p1];\n }\n }\n // if every grapheme has the same style set then\n // delete those styles and set it on the parent\n for (let i = 0; i < this._textLines.length; i++) {\n graphemeCount += this._textLines[i].length;\n }\n if (allStyleObjectPropertiesMatch && stylesCount === graphemeCount) {\n this[property as keyof this] = stylePropertyValue as any;\n this.removeStyle(property);\n }\n }\n\n /**\n * Remove a style property or properties from all individual character styles\n * in a text object. Deletes the character style object if it contains no other style\n * props. Deletes a line style object if it contains no other character styles.\n *\n * @param {String} props The property to remove from character styles.\n */\n removeStyle(property: keyof TextStyleDeclaration) {\n if (!this.styles) {\n return;\n }\n const obj = this.styles;\n let line, lineNum, charNum;\n for (lineNum in obj) {\n line = obj[lineNum];\n for (charNum in line) {\n delete line[charNum][property];\n if (Object.keys(line[charNum]).length === 0) {\n delete line[charNum];\n }\n }\n if (Object.keys(line).length === 0) {\n delete obj[lineNum];\n }\n }\n }\n\n private _extendStyles(index: number, style: TextStyleDeclaration): void {\n const { lineIndex, charIndex } = this.get2DCursorLocation(index);\n\n if (!this._getLineStyle(lineIndex)) {\n this._setLineStyle(lineIndex);\n }\n\n const newStyle = pickBy(\n {\n // first create a new object that is a merge of existing and new\n ...this._getStyleDeclaration(lineIndex, charIndex),\n ...style,\n // use the predicate to discard undefined values\n },\n (value) => value !== undefined,\n );\n\n // finally assign to the old position the new style\n this._setStyleDeclaration(lineIndex, charIndex, newStyle);\n }\n\n /**\n * Gets style of a current selection/cursor (at the start position)\n * @param {Number} startIndex Start index to get styles at\n * @param {Number} endIndex End index to get styles at, if not specified startIndex + 1\n * @param {Boolean} [complete] get full style or not\n * @return {Array} styles an array with one, zero or more Style objects\n */\n getSelectionStyles(\n startIndex: number,\n endIndex?: number,\n complete?: boolean,\n ): TextStyleDeclaration[] {\n const styles: TextStyleDeclaration[] = [];\n for (let i = startIndex; i < (endIndex || startIndex); i++) {\n styles.push(this.getStyleAtPosition(i, complete));\n }\n return styles;\n }\n\n /**\n * Gets style of a current selection/cursor position\n * @param {Number} position to get styles at\n * @param {Boolean} [complete] full style if true\n * @return {Object} style Style object at a specified index\n * @private\n */\n getStyleAtPosition(position: number, complete?: boolean) {\n const { lineIndex, charIndex } = this.get2DCursorLocation(position);\n return complete\n ? this.getCompleteStyleDeclaration(lineIndex, charIndex)\n : this._getStyleDeclaration(lineIndex, charIndex);\n }\n\n /**\n * Sets style of a current selection, if no selection exist, do not set anything.\n * @param {Object} styles Styles object\n * @param {Number} startIndex Start index to get styles at\n * @param {Number} [endIndex] End index to get styles at, if not specified startIndex + 1\n */\n setSelectionStyles(styles: object, startIndex: number, endIndex?: number) {\n for (let i = startIndex; i < (endIndex || startIndex); i++) {\n this._extendStyles(i, styles);\n }\n /* not included in _extendStyles to avoid clearing cache more than once */\n this._forceClearCache = true;\n }\n\n /**\n * Get a reference, not a clone, to the style object for a given character,\n * if no style is set for a line or char, return a new empty object.\n * This is tricky and confusing because when you get an empty object you can't\n * determine if it is a reference or a new one.\n * @TODO this should always return a reference or always a clone or undefined when necessary.\n * @protected\n * @param {Number} lineIndex\n * @param {Number} charIndex\n * @return {TextStyleDeclaration} a style object reference to the existing one or a new empty object when undefined\n */\n _getStyleDeclaration(\n lineIndex: number,\n charIndex: number,\n ): TextStyleDeclaration {\n const lineStyle = this.styles && this.styles[lineIndex];\n return lineStyle ? (lineStyle[charIndex] ?? {}) : {};\n }\n\n /**\n * return a new object that contains all the style property for a character\n * the object returned is newly created\n * @param {Number} lineIndex of the line where the character is\n * @param {Number} charIndex position of the character on the line\n * @return {Object} style object\n */\n getCompleteStyleDeclaration(\n lineIndex: number,\n charIndex: number,\n ): CompleteTextStyleDeclaration {\n return {\n ...pick(\n this,\n (this.constructor as typeof StyledText)\n ._styleProperties as (keyof this)[],\n ),\n ...this._getStyleDeclaration(lineIndex, charIndex),\n } as CompleteTextStyleDeclaration;\n }\n\n /**\n * @param {Number} lineIndex\n * @param {Number} charIndex\n * @param {Object} style\n * @private\n */\n protected _setStyleDeclaration(\n lineIndex: number,\n charIndex: number,\n style: object,\n ) {\n this.styles[lineIndex][charIndex] = style;\n }\n\n /**\n *\n * @param {Number} lineIndex\n * @param {Number} charIndex\n * @private\n */\n protected _deleteStyleDeclaration(lineIndex: number, charIndex: number) {\n delete this.styles[lineIndex][charIndex];\n }\n\n /**\n * @param {Number} lineIndex\n * @return {Boolean} if the line exists or not\n * @private\n */\n protected _getLineStyle(lineIndex: number): boolean {\n return !!this.styles[lineIndex];\n }\n\n /**\n * Set the line style to an empty object so that is initialized\n * @param {Number} lineIndex\n * @private\n */\n protected _setLineStyle(lineIndex: number) {\n this.styles[lineIndex] = {};\n }\n\n protected _deleteLineStyle(lineIndex: number) {\n delete this.styles[lineIndex];\n }\n}\n","import { config } from '../../config';\nimport type { TSVGReviver } from '../../typedefs';\nimport { escapeXml } from '../../util/lang_string';\nimport { colorPropToSVG, createSVGRect } from '../../util/misc/svgParsing';\nimport { hasStyleChanged } from '../../util/misc/textStyles';\nimport { toFixed } from '../../util/misc/toFixed';\nimport { FabricObjectSVGExportMixin } from '../Object/FabricObjectSVGExportMixin';\nimport { type TextStyleDeclaration } from './StyledText';\nimport { JUSTIFY } from '../Text/constants';\nimport type { FabricText, GraphemeBBox } from './Text';\nimport { STROKE, FILL } from '../../constants';\nimport { createRotateMatrix } from '../../util/misc/matrix';\nimport { radiansToDegrees } from '../../util/misc/radiansDegreesConversion';\nimport { Point } from '../../Point';\nimport { matrixToSVG } from '../../util/misc/svgExport';\n\nconst multipleSpacesRegex = / +/g;\nconst dblQuoteRegex = /\"/g;\n\nfunction createSVGInlineRect(\n color: string,\n left: number,\n top: number,\n width: number,\n height: number,\n) {\n return `\\t\\t${createSVGRect(color, { left, top, width, height })}\\n`;\n}\n\nexport class TextSVGExportMixin extends FabricObjectSVGExportMixin {\n _toSVG(this: TextSVGExportMixin & FabricText): string[] {\n const offsets = this._getSVGLeftTopOffsets(),\n textAndBg = this._getSVGTextAndBg(offsets.textTop, offsets.textLeft);\n return this._wrapSVGTextAndBg(textAndBg);\n }\n\n toSVG(this: TextSVGExportMixin & FabricText, reviver?: TSVGReviver): string {\n const textSvg = this._createBaseSVGMarkup(this._toSVG(), {\n reviver,\n noStyle: true,\n withShadow: true,\n }),\n path = this.path;\n if (path) {\n return (\n textSvg +\n path._createBaseSVGMarkup(path._toSVG(), {\n reviver,\n withShadow: true,\n additionalTransform: matrixToSVG(this.calcOwnMatrix()),\n })\n );\n }\n return textSvg;\n }\n\n private _getSVGLeftTopOffsets(this: TextSVGExportMixin & FabricText) {\n return {\n textLeft: -this.width / 2,\n textTop: -this.height / 2,\n lineTop: this.getHeightOfLine(0),\n };\n }\n\n private _wrapSVGTextAndBg(\n this: TextSVGExportMixin & FabricText,\n {\n textBgRects,\n textSpans,\n }: {\n textSpans: string[];\n textBgRects: string[];\n },\n ) {\n const noShadow = true,\n textDecoration = this.getSvgTextDecoration(this);\n return [\n textBgRects.join(''),\n '\\t\\t',\n textSpans.join(''),\n '\\n',\n ];\n }\n\n /**\n * @private\n * @param {Number} textTopOffset Text top offset\n * @param {Number} textLeftOffset Text left offset\n * @return {Object}\n */\n private _getSVGTextAndBg(\n this: TextSVGExportMixin & FabricText,\n textTopOffset: number,\n textLeftOffset: number,\n ) {\n const textSpans: string[] = [],\n textBgRects: string[] = [];\n let height = textTopOffset,\n lineOffset;\n\n // bounding-box background\n this.backgroundColor &&\n textBgRects.push(\n ...createSVGInlineRect(\n this.backgroundColor,\n -this.width / 2,\n -this.height / 2,\n this.width,\n this.height,\n ),\n );\n\n // text and text-background\n for (let i = 0, len = this._textLines.length; i < len; i++) {\n lineOffset = this._getLineLeftOffset(i);\n if (this.direction === 'rtl') {\n lineOffset += this.width;\n }\n if (this.textBackgroundColor || this.styleHas('textBackgroundColor', i)) {\n this._setSVGTextLineBg(\n textBgRects,\n i,\n textLeftOffset + lineOffset,\n height,\n );\n }\n this._setSVGTextLineText(\n textSpans,\n i,\n textLeftOffset + lineOffset,\n height,\n );\n height += this.getHeightOfLine(i);\n }\n\n return {\n textSpans,\n textBgRects,\n };\n }\n\n private _createTextCharSpan(\n this: TextSVGExportMixin & FabricText,\n char: string,\n styleDecl: TextStyleDeclaration,\n left: number,\n top: number,\n charBox: GraphemeBBox,\n ) {\n const numFractionDigit = config.NUM_FRACTION_DIGITS;\n const styleProps = this.getSvgSpanStyles(\n styleDecl,\n char !== char.trim() || !!char.match(multipleSpacesRegex),\n ),\n fillStyles = styleProps ? `style=\"${styleProps}\"` : '',\n dy = styleDecl.deltaY,\n dySpan = dy ? ` dy=\"${toFixed(dy, numFractionDigit)}\" ` : '',\n { angle, renderLeft, renderTop, width } = charBox;\n let angleAttr = '';\n if (renderLeft !== undefined) {\n const wBy2 = width / 2;\n angle &&\n (angleAttr = ` rotate=\"${toFixed(radiansToDegrees(angle), numFractionDigit)}\"`);\n const m = createRotateMatrix({ angle: radiansToDegrees(angle!) });\n m[4] = renderLeft!;\n m[5] = renderTop!;\n const renderPoint = new Point(-wBy2, 0).transform(m);\n left = renderPoint.x;\n top = renderPoint.y;\n }\n\n return `${escapeXml(char)}`;\n }\n\n private _setSVGTextLineText(\n this: TextSVGExportMixin & FabricText,\n textSpans: string[],\n lineIndex: number,\n textLeftOffset: number,\n textTopOffset: number,\n ) {\n const lineHeight = this.getHeightOfLine(lineIndex),\n isJustify = this.textAlign.includes(JUSTIFY),\n line = this._textLines[lineIndex];\n let actualStyle,\n nextStyle,\n charsToRender = '',\n charBox,\n style,\n boxWidth = 0,\n timeToRender;\n\n textTopOffset +=\n (lineHeight * (1 - this._fontSizeFraction)) / this.lineHeight;\n for (let i = 0, len = line.length - 1; i <= len; i++) {\n timeToRender = i === len || this.charSpacing || this.path;\n charsToRender += line[i];\n charBox = this.__charBounds[lineIndex][i];\n if (boxWidth === 0) {\n textLeftOffset += charBox.kernedWidth - charBox.width;\n boxWidth += charBox.width;\n } else {\n boxWidth += charBox.kernedWidth;\n }\n if (isJustify && !timeToRender) {\n if (this._reSpaceAndTab.test(line[i])) {\n timeToRender = true;\n }\n }\n if (!timeToRender) {\n // if we have charSpacing or a path, we render char by char\n actualStyle =\n actualStyle || this.getCompleteStyleDeclaration(lineIndex, i);\n nextStyle = this.getCompleteStyleDeclaration(lineIndex, i + 1);\n timeToRender = hasStyleChanged(actualStyle, nextStyle, true);\n }\n if (timeToRender) {\n style = this._getStyleDeclaration(lineIndex, i);\n textSpans.push(\n this._createTextCharSpan(\n charsToRender,\n style,\n textLeftOffset,\n textTopOffset,\n charBox,\n ),\n );\n charsToRender = '';\n actualStyle = nextStyle;\n if (this.direction === 'rtl') {\n textLeftOffset -= boxWidth;\n } else {\n textLeftOffset += boxWidth;\n }\n boxWidth = 0;\n }\n }\n }\n\n private _setSVGTextLineBg(\n this: TextSVGExportMixin & FabricText,\n textBgRects: (string | number)[],\n i: number,\n leftOffset: number,\n textTopOffset: number,\n ) {\n const line = this._textLines[i],\n heightOfLine = this.getHeightOfLine(i) / this.lineHeight;\n let boxWidth = 0,\n boxStart = 0,\n currentColor,\n lastColor = this.getValueOfPropertyAt(i, 0, 'textBackgroundColor');\n for (let j = 0; j < line.length; j++) {\n const { left, width, kernedWidth } = this.__charBounds[i][j];\n currentColor = this.getValueOfPropertyAt(i, j, 'textBackgroundColor');\n if (currentColor !== lastColor) {\n lastColor &&\n textBgRects.push(\n ...createSVGInlineRect(\n lastColor,\n leftOffset + boxStart,\n textTopOffset,\n boxWidth,\n heightOfLine,\n ),\n );\n boxStart = left;\n boxWidth = width;\n lastColor = currentColor;\n } else {\n boxWidth += kernedWidth;\n }\n }\n currentColor &&\n textBgRects.push(\n ...createSVGInlineRect(\n lastColor,\n leftOffset + boxStart,\n textTopOffset,\n boxWidth,\n heightOfLine,\n ),\n );\n }\n\n /**\n * Returns styles-string for svg-export\n * @param {Boolean} skipShadow a boolean to skip shadow filter output\n * @return {String}\n */\n getSvgStyles(this: TextSVGExportMixin & FabricText, skipShadow?: boolean) {\n return `${super.getSvgStyles(skipShadow)} text-decoration-thickness: ${toFixed((this.textDecorationThickness * this.getObjectScaling().y) / 10, config.NUM_FRACTION_DIGITS)}%; white-space: pre;`;\n }\n\n /**\n * Returns styles-string for svg-export\n * @param {Object} style the object from which to retrieve style properties\n * @param {Boolean} useWhiteSpace a boolean to include an additional attribute in the style.\n * @return {String}\n */\n getSvgSpanStyles(\n this: TextSVGExportMixin & FabricText,\n style: TextStyleDeclaration,\n useWhiteSpace?: boolean,\n ) {\n const {\n fontFamily,\n strokeWidth,\n stroke,\n fill,\n fontSize,\n fontStyle,\n fontWeight,\n deltaY,\n textDecorationThickness,\n linethrough,\n overline,\n underline,\n } = style;\n\n const textDecoration = this.getSvgTextDecoration({\n underline: underline ?? this.underline,\n overline: overline ?? this.overline,\n linethrough: linethrough ?? this.linethrough,\n });\n const thickness = textDecorationThickness || this.textDecorationThickness;\n return [\n stroke ? colorPropToSVG(STROKE, stroke) : '',\n strokeWidth ? `stroke-width: ${strokeWidth}; ` : '',\n fontFamily\n ? `font-family: ${\n !fontFamily.includes(\"'\") && !fontFamily.includes('\"')\n ? `'${fontFamily}'`\n : fontFamily\n }; `\n : '',\n fontSize ? `font-size: ${fontSize}px; ` : '',\n fontStyle ? `font-style: ${fontStyle}; ` : '',\n fontWeight ? `font-weight: ${fontWeight}; ` : '',\n textDecoration\n ? `text-decoration: ${textDecoration}; text-decoration-thickness: ${toFixed((thickness * this.getObjectScaling().y) / 10, config.NUM_FRACTION_DIGITS)}%; `\n : '',\n fill ? colorPropToSVG(FILL, fill) : '',\n deltaY ? `baseline-shift: ${-deltaY}; ` : '',\n useWhiteSpace ? 'white-space: pre; ' : '',\n ].join('');\n }\n\n /**\n * Returns text-decoration property for svg-export\n * @param {Object} style the object from which to retrieve style properties\n * @return {String}\n */\n getSvgTextDecoration(\n this: TextSVGExportMixin & FabricText,\n style: TextStyleDeclaration,\n ) {\n return (['overline', 'underline', 'line-through'] as const)\n .filter(\n (decoration) =>\n style[\n decoration.replace('-', '') as\n | 'overline'\n | 'underline'\n | 'linethrough'\n ],\n )\n .join(' ');\n }\n}\n","import { cache } from '../../cache';\nimport { DEFAULT_SVG_FONT_SIZE, FILL, STROKE } from '../../constants';\nimport type { ObjectEvents } from '../../EventTypeDefs';\nimport type {\n CompleteTextStyleDeclaration,\n TextStyle,\n TextStyleDeclaration,\n} from './StyledText';\nimport { StyledText } from './StyledText';\nimport { SHARED_ATTRIBUTES } from '../../parser/attributes';\nimport { parseAttributes } from '../../parser/parseAttributes';\nimport type {\n Abortable,\n TCacheCanvasDimensions,\n TClassProperties,\n TFiller,\n TOptions,\n} from '../../typedefs';\nimport { classRegistry } from '../../ClassRegistry';\nimport { graphemeSplit } from '../../util/lang_string';\nimport { createCanvasElementFor } from '../../util/misc/dom';\nimport type { TextStyleArray } from '../../util/misc/textStyles';\nimport {\n hasStyleChanged,\n stylesFromArray,\n stylesToArray,\n} from '../../util/misc/textStyles';\nimport { getPathSegmentsInfo, getPointOnPath } from '../../util/path';\nimport { cacheProperties } from '../Object/FabricObject';\nimport type { Path } from '../Path';\nimport { TextSVGExportMixin } from './TextSVGExportMixin';\nimport { applyMixins } from '../../util/applyMixins';\nimport type { FabricObjectProps, SerializedObjectProps } from '../Object/types';\nimport type { StylePropertiesType } from './constants';\nimport {\n additionalProps,\n textDefaultValues,\n textLayoutProperties,\n JUSTIFY,\n JUSTIFY_CENTER,\n JUSTIFY_LEFT,\n JUSTIFY_RIGHT,\n TEXT_DECORATION_THICKNESS,\n} from './constants';\nimport { CENTER, LEFT, RIGHT, TOP, BOTTOM } from '../../constants';\nimport { isFiller } from '../../util/typeAssertions';\nimport type { Gradient } from '../../gradient/Gradient';\nimport type { Pattern } from '../../Pattern';\nimport type { CSSRules } from '../../parser/typedefs';\n\nlet measuringContext: CanvasRenderingContext2D | null;\n\n/**\n * Return a context for measurement of text string.\n * if created it gets stored for reuse\n */\nfunction getMeasuringContext() {\n if (!measuringContext) {\n const canvas = createCanvasElementFor({\n width: 0,\n height: 0,\n });\n measuringContext = canvas.getContext('2d');\n }\n return measuringContext;\n}\n\nexport type TPathSide = 'left' | 'right';\n\nexport type TPathAlign = 'baseline' | 'center' | 'ascender' | 'descender';\n\nexport type TextLinesInfo = {\n lines: string[];\n graphemeLines: string[][];\n graphemeText: string[];\n _unwrappedLines: string[][];\n};\n\n/**\n * Measure and return the info of a single grapheme.\n * needs the the info of previous graphemes already filled\n * Override to customize measuring\n */\nexport type GraphemeBBox = {\n width: number;\n height: number;\n kernedWidth: number;\n left: number;\n deltaY: number;\n renderLeft?: number;\n renderTop?: number;\n angle?: number;\n};\n\n// @TODO this is not complete\ninterface UniqueTextProps {\n charSpacing: number;\n lineHeight: number;\n fontSize: number;\n fontWeight: string | number;\n fontFamily: string;\n fontStyle: string;\n pathSide: TPathSide;\n pathAlign: TPathAlign;\n underline: boolean;\n overline: boolean;\n linethrough: boolean;\n textAlign: string;\n direction: CanvasDirection;\n path?: Path;\n textDecorationThickness: number;\n}\n\nexport interface SerializedTextProps\n extends SerializedObjectProps,\n UniqueTextProps {\n styles: TextStyleArray | TextStyle;\n}\n\nexport interface TextProps extends FabricObjectProps, UniqueTextProps {\n styles: TextStyle;\n}\n\n/**\n * Text class\n * @see {@link http://fabric5.fabricjs.com/fabric-intro-part-2#text}\n */\nexport class FabricText<\n Props extends TOptions = Partial,\n SProps extends SerializedTextProps = SerializedTextProps,\n EventSpec extends ObjectEvents = ObjectEvents,\n >\n extends StyledText\n implements UniqueTextProps\n{\n /**\n * Properties that requires a text layout recalculation when changed\n * @type string[]\n * @protected\n */\n static textLayoutProperties: string[] = textLayoutProperties;\n\n /**\n * @private\n */\n declare _reNewline: RegExp;\n\n /**\n * Use this regular expression to filter for whitespaces that is not a new line.\n * Mostly used when text is 'justify' aligned.\n * @private\n */\n declare _reSpacesAndTabs: RegExp;\n\n /**\n * Use this regular expression to filter for whitespace that is not a new line.\n * Mostly used when text is 'justify' aligned.\n * @private\n */\n declare _reSpaceAndTab: RegExp;\n\n /**\n * Use this regular expression to filter consecutive groups of non spaces.\n * Mostly used when text is 'justify' aligned.\n * @private\n */\n declare _reWords: RegExp;\n\n declare text: string;\n\n /**\n * Font size (in pixels)\n * @type Number\n */\n declare fontSize: number;\n\n /**\n * Font weight (e.g. bold, normal, 400, 600, 800)\n * @type {(Number|String)}\n */\n declare fontWeight: string | number;\n\n /**\n * Font family\n * @type String\n */\n declare fontFamily: string;\n\n /**\n * Text decoration underline.\n * @type Boolean\n */\n declare underline: boolean;\n\n /**\n * Text decoration overline.\n * @type Boolean\n */\n declare overline: boolean;\n\n /**\n * Text decoration linethrough.\n * @type Boolean\n */\n declare linethrough: boolean;\n\n /**\n * Text alignment. Possible values: \"left\", \"center\", \"right\", \"justify\",\n * \"justify-left\", \"justify-center\" or \"justify-right\".\n * @type String\n */\n declare textAlign: string;\n\n /**\n * Font style . Possible values: \"\", \"normal\", \"italic\" or \"oblique\".\n * @type String\n */\n declare fontStyle: string;\n\n /**\n * Line height\n * @type Number\n */\n declare lineHeight: number;\n\n /**\n * Superscript schema object (minimum overlap)\n */\n declare superscript: {\n /**\n * fontSize factor\n * @default 0.6\n */\n size: number;\n /**\n * baseline-shift factor (upwards)\n * @default -0.35\n */\n baseline: number;\n };\n\n /**\n * Subscript schema object (minimum overlap)\n */\n declare subscript: {\n /**\n * fontSize factor\n * @default 0.6\n */\n size: number;\n /**\n * baseline-shift factor (downwards)\n * @default 0.11\n */\n baseline: number;\n };\n\n /**\n * Background color of text lines\n * @type String\n */\n declare textBackgroundColor: string;\n\n declare styles: TextStyle;\n\n /**\n * Path that the text should follow.\n * since 4.6.0 the path will be drawn automatically.\n * if you want to make the path visible, give it a stroke and strokeWidth or fill value\n * if you want it to be hidden, assign visible = false to the path.\n * This feature is in BETA, and SVG import/export is not yet supported.\n * @type Path\n * @example\n * const textPath = new Text('Text on a path', {\n * top: 150,\n * left: 150,\n * textAlign: 'center',\n * charSpacing: -50,\n * path: new Path('M 0 0 C 50 -100 150 -100 200 0', {\n * strokeWidth: 1,\n * visible: false\n * }),\n * pathSide: 'left',\n * pathStartOffset: 0\n * });\n */\n declare path?: Path;\n\n /**\n * The text decoration tickness for underline, overline and strikethrough\n * The tickness is expressed in thousandths of fontSize ( em ).\n * The original value was 1/15 that translates to 66.6667 thousandths.\n * The choice of unit of measure is to align with charSpacing.\n * You can slim the tickness without issues, while large underline or overline may end up\n * outside the bounding box of the text. In order to fix that a bigger refactor of the code\n * is needed and is out of scope for now. If you need such large overline on the first line\n * of text or large underline on the last line of text, consider disabling caching as a\n * workaround\n * @default 66.667\n */\n declare textDecorationThickness: number;\n\n /**\n * Offset amount for text path starting position\n * Only used when text has a path\n */\n declare pathStartOffset: number;\n\n /**\n * Which side of the path the text should be drawn on.\n * Only used when text has a path\n * @type {TPathSide} 'left|right'\n */\n declare pathSide: TPathSide;\n\n /**\n * How text is aligned to the path. This property determines\n * the perpendicular position of each character relative to the path.\n * (one of \"baseline\", \"center\", \"ascender\", \"descender\")\n * This feature is in BETA, and its behavior may change\n * @type TPathAlign\n */\n declare pathAlign: TPathAlign;\n\n /**\n * @private\n */\n declare _fontSizeFraction: number;\n\n /**\n * @private\n */\n declare offsets: { underline: number; linethrough: number; overline: number };\n\n /**\n * Text Line proportion to font Size (in pixels)\n * @type Number\n */\n declare _fontSizeMult: number;\n\n /**\n * additional space between characters\n * expressed in thousands of em unit\n * @type Number\n */\n declare charSpacing: number;\n\n /**\n * Baseline shift, styles only, keep at 0 for the main text object\n * @type {Number}\n */\n declare deltaY: number;\n\n /**\n * WARNING: EXPERIMENTAL. NOT SUPPORTED YET\n * determine the direction of the text.\n * This has to be set manually together with textAlign and originX for proper\n * experience.\n * some interesting link for the future\n * https://www.w3.org/International/questions/qa-bidi-unicode-controls\n * @since 4.5.0\n * @type {CanvasDirection} 'ltr|rtl'\n */\n declare direction: CanvasDirection;\n\n /**\n * contains characters bounding boxes\n * This variable is considered to be protected.\n * But for how mixins are implemented right now, we can't leave it private\n * @protected\n */\n __charBounds: GraphemeBBox[][] = [];\n\n /**\n * use this size when measuring text. To avoid IE11 rounding errors\n * @type {Number}\n * @readonly\n * @private\n */\n declare CACHE_FONT_SIZE: number;\n\n /**\n * contains the min text width to avoid getting 0\n * @type {Number}\n */\n declare MIN_TEXT_WIDTH: number;\n\n /**\n * contains the the text of the object, divided in lines as they are displayed\n * on screen. Wrapping will divide the text independently of line breaks\n * @type {string[]}\n */\n declare textLines: string[];\n\n /**\n * same as textlines, but each line is an array of graphemes as split by splitByGrapheme\n * @type {string[]}\n */\n declare _textLines: string[][];\n\n declare _unwrappedTextLines: string[][];\n declare _text: string[];\n declare cursorWidth: number;\n declare __lineHeights: number[];\n declare __lineWidths: number[];\n declare initialized?: true;\n\n static cacheProperties = [...cacheProperties, ...additionalProps];\n\n static ownDefaults = textDefaultValues;\n\n static type = 'Text';\n\n static getDefaults(): Record {\n return { ...super.getDefaults(), ...FabricText.ownDefaults };\n }\n\n constructor(text: string, options?: Props) {\n super();\n Object.assign(this, FabricText.ownDefaults);\n this.setOptions(options);\n if (!this.styles) {\n this.styles = {};\n }\n this.text = text;\n this.initialized = true;\n if (this.path) {\n this.setPathInfo();\n }\n this.initDimensions();\n this.setCoords();\n }\n\n /**\n * If text has a path, it will add the extra information needed\n * for path and text calculations\n */\n setPathInfo() {\n const path = this.path;\n if (path) {\n path.segmentsInfo = getPathSegmentsInfo(path.path);\n }\n }\n\n /**\n * @private\n * Divides text into lines of text and lines of graphemes.\n */\n _splitText(): TextLinesInfo {\n const newLines = this._splitTextIntoLines(this.text);\n this.textLines = newLines.lines;\n this._textLines = newLines.graphemeLines;\n this._unwrappedTextLines = newLines._unwrappedLines;\n this._text = newLines.graphemeText;\n return newLines;\n }\n\n /**\n * Initialize or update text dimensions.\n * Updates this.width and this.height with the proper values.\n * Does not return dimensions.\n */\n initDimensions() {\n this._splitText();\n this._clearCache();\n this.dirty = true;\n if (this.path) {\n this.width = this.path.width;\n this.height = this.path.height;\n } else {\n this.width =\n this.calcTextWidth() || this.cursorWidth || this.MIN_TEXT_WIDTH;\n this.height = this.calcTextHeight();\n }\n if (this.textAlign.includes(JUSTIFY)) {\n // once text is measured we need to make space fatter to make justified text.\n this.enlargeSpaces();\n }\n }\n\n /**\n * Enlarge space boxes and shift the others\n */\n enlargeSpaces() {\n let diffSpace,\n currentLineWidth,\n numberOfSpaces,\n accumulatedSpace,\n line,\n charBound,\n spaces;\n for (let i = 0, len = this._textLines.length; i < len; i++) {\n if (\n this.textAlign !== JUSTIFY &&\n (i === len - 1 || this.isEndOfWrapping(i))\n ) {\n continue;\n }\n accumulatedSpace = 0;\n line = this._textLines[i];\n currentLineWidth = this.getLineWidth(i);\n if (\n currentLineWidth < this.width &&\n (spaces = this.textLines[i].match(this._reSpacesAndTabs))\n ) {\n numberOfSpaces = spaces.length;\n diffSpace = (this.width - currentLineWidth) / numberOfSpaces;\n for (let j = 0; j <= line.length; j++) {\n charBound = this.__charBounds[i][j];\n if (this._reSpaceAndTab.test(line[j])) {\n charBound.width += diffSpace;\n charBound.kernedWidth += diffSpace;\n charBound.left += accumulatedSpace;\n accumulatedSpace += diffSpace;\n } else {\n charBound.left += accumulatedSpace;\n }\n }\n }\n }\n }\n\n /**\n * Detect if the text line is ended with an hard break\n * text and itext do not have wrapping, return false\n * @return {Boolean}\n */\n isEndOfWrapping(lineIndex: number): boolean {\n return lineIndex === this._textLines.length - 1;\n }\n\n /**\n * Detect if a line has a linebreak and so we need to account for it when moving\n * and counting style.\n * It return always 1 for text and Itext. Textbox has its own implementation\n * @return Number\n */\n missingNewlineOffset(lineIndex: number, skipWrapping?: boolean): 0 | 1;\n missingNewlineOffset(_lineIndex: number): 1 {\n return 1;\n }\n\n /**\n * Returns 2d representation (lineIndex and charIndex) of cursor\n * @param {Number} selectionStart\n * @param {Boolean} [skipWrapping] consider the location for unwrapped lines. useful to manage styles.\n */\n get2DCursorLocation(selectionStart: number, skipWrapping?: boolean) {\n const lines = skipWrapping ? this._unwrappedTextLines : this._textLines;\n let i: number;\n for (i = 0; i < lines.length; i++) {\n if (selectionStart <= lines[i].length) {\n return {\n lineIndex: i,\n charIndex: selectionStart,\n };\n }\n selectionStart -=\n lines[i].length + this.missingNewlineOffset(i, skipWrapping);\n }\n return {\n lineIndex: i - 1,\n charIndex:\n lines[i - 1].length < selectionStart\n ? lines[i - 1].length\n : selectionStart,\n };\n }\n\n /**\n * Returns string representation of an instance\n * @return {String} String representation of text object\n */\n toString(): string {\n return `#`;\n }\n\n /**\n * Return the dimension and the zoom level needed to create a cache canvas\n * big enough to host the object to be cached.\n * @private\n * @param {Object} dim.x width of object to be cached\n * @param {Object} dim.y height of object to be cached\n * @return {Object}.width width of canvas\n * @return {Object}.height height of canvas\n * @return {Object}.zoomX zoomX zoom value to unscale the canvas before drawing cache\n * @return {Object}.zoomY zoomY zoom value to unscale the canvas before drawing cache\n */\n _getCacheCanvasDimensions(): TCacheCanvasDimensions {\n const dims = super._getCacheCanvasDimensions();\n const fontSize = this.fontSize;\n dims.width += fontSize * dims.zoomX;\n dims.height += fontSize * dims.zoomY;\n return dims;\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _render(ctx: CanvasRenderingContext2D) {\n const path = this.path;\n path && !path.isNotVisible() && path._render(ctx);\n this._setTextStyles(ctx);\n this._renderTextLinesBackground(ctx);\n this._renderTextDecoration(ctx, 'underline');\n this._renderText(ctx);\n this._renderTextDecoration(ctx, 'overline');\n this._renderTextDecoration(ctx, 'linethrough');\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _renderText(ctx: CanvasRenderingContext2D) {\n if (this.paintFirst === STROKE) {\n this._renderTextStroke(ctx);\n this._renderTextFill(ctx);\n } else {\n this._renderTextFill(ctx);\n this._renderTextStroke(ctx);\n }\n }\n\n /**\n * Set the font parameter of the context with the object properties or with charStyle\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n * @param {Object} [charStyle] object with font style properties\n * @param {String} [charStyle.fontFamily] Font Family\n * @param {Number} [charStyle.fontSize] Font size in pixels. ( without px suffix )\n * @param {String} [charStyle.fontWeight] Font weight\n * @param {String} [charStyle.fontStyle] Font style (italic|normal)\n */\n _setTextStyles(\n ctx: CanvasRenderingContext2D,\n charStyle?: any,\n forMeasuring?: boolean,\n ) {\n ctx.textBaseline = 'alphabetic';\n if (this.path) {\n switch (this.pathAlign) {\n case CENTER:\n ctx.textBaseline = 'middle';\n break;\n case 'ascender':\n ctx.textBaseline = TOP;\n break;\n case 'descender':\n ctx.textBaseline = BOTTOM;\n break;\n }\n }\n ctx.font = this._getFontDeclaration(charStyle, forMeasuring);\n }\n\n /**\n * calculate and return the text Width measuring each line.\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n * @return {Number} Maximum width of Text object\n */\n calcTextWidth(): number {\n let maxWidth = this.getLineWidth(0);\n\n for (let i = 1, len = this._textLines.length; i < len; i++) {\n const currentLineWidth = this.getLineWidth(i);\n if (currentLineWidth > maxWidth) {\n maxWidth = currentLineWidth;\n }\n }\n return maxWidth;\n }\n\n /**\n * @private\n * @param {String} method Method name (\"fillText\" or \"strokeText\")\n * @param {CanvasRenderingContext2D} ctx Context to render on\n * @param {String} line Text to render\n * @param {Number} left Left position of text\n * @param {Number} top Top position of text\n * @param {Number} lineIndex Index of a line in a text\n */\n _renderTextLine(\n method: 'fillText' | 'strokeText',\n ctx: CanvasRenderingContext2D,\n line: string[],\n left: number,\n top: number,\n lineIndex: number,\n ) {\n this._renderChars(method, ctx, line, left, top, lineIndex);\n }\n\n /**\n * Renders the text background for lines, taking care of style\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _renderTextLinesBackground(ctx: CanvasRenderingContext2D) {\n if (!this.textBackgroundColor && !this.styleHas('textBackgroundColor')) {\n return;\n }\n const originalFill = ctx.fillStyle,\n leftOffset = this._getLeftOffset();\n let lineTopOffset = this._getTopOffset();\n\n for (let i = 0, len = this._textLines.length; i < len; i++) {\n const heightOfLine = this.getHeightOfLine(i);\n if (\n !this.textBackgroundColor &&\n !this.styleHas('textBackgroundColor', i)\n ) {\n lineTopOffset += heightOfLine;\n continue;\n }\n const jlen = this._textLines[i].length;\n const lineLeftOffset = this._getLineLeftOffset(i);\n let boxWidth = 0;\n let boxStart = 0;\n let drawStart;\n let currentColor;\n let lastColor = this.getValueOfPropertyAt(i, 0, 'textBackgroundColor');\n for (let j = 0; j < jlen; j++) {\n // at this point charbox are either standard or full with pathInfo if there is a path.\n const charBox = this.__charBounds[i][j] as Required;\n currentColor = this.getValueOfPropertyAt(i, j, 'textBackgroundColor');\n if (this.path) {\n ctx.save();\n ctx.translate(charBox.renderLeft, charBox.renderTop);\n ctx.rotate(charBox.angle);\n ctx.fillStyle = currentColor;\n currentColor &&\n ctx.fillRect(\n -charBox.width / 2,\n (-heightOfLine / this.lineHeight) * (1 - this._fontSizeFraction),\n charBox.width,\n heightOfLine / this.lineHeight,\n );\n ctx.restore();\n } else if (currentColor !== lastColor) {\n drawStart = leftOffset + lineLeftOffset + boxStart;\n if (this.direction === 'rtl') {\n drawStart = this.width - drawStart - boxWidth;\n }\n ctx.fillStyle = lastColor;\n lastColor &&\n ctx.fillRect(\n drawStart,\n lineTopOffset,\n boxWidth,\n heightOfLine / this.lineHeight,\n );\n boxStart = charBox.left;\n boxWidth = charBox.width;\n lastColor = currentColor;\n } else {\n boxWidth += charBox.kernedWidth;\n }\n }\n if (currentColor && !this.path) {\n drawStart = leftOffset + lineLeftOffset + boxStart;\n if (this.direction === 'rtl') {\n drawStart = this.width - drawStart - boxWidth;\n }\n ctx.fillStyle = currentColor;\n ctx.fillRect(\n drawStart,\n lineTopOffset,\n boxWidth,\n heightOfLine / this.lineHeight,\n );\n }\n lineTopOffset += heightOfLine;\n }\n ctx.fillStyle = originalFill;\n // if there is text background color no\n // other shadows should be casted\n this._removeShadow(ctx);\n }\n\n /**\n * measure and return the width of a single character.\n * possibly overridden to accommodate different measure logic or\n * to hook some external lib for character measurement\n * @private\n * @param {String} _char, char to be measured\n * @param {Object} charStyle style of char to be measured\n * @param {String} [previousChar] previous char\n * @param {Object} [prevCharStyle] style of previous char\n */\n _measureChar(\n _char: string,\n charStyle: CompleteTextStyleDeclaration,\n previousChar: string | undefined,\n prevCharStyle: CompleteTextStyleDeclaration | Record,\n ) {\n const fontCache = cache.getFontCache(charStyle),\n fontDeclaration = this._getFontDeclaration(charStyle),\n couple = previousChar + _char,\n stylesAreEqual =\n previousChar &&\n fontDeclaration === this._getFontDeclaration(prevCharStyle),\n fontMultiplier = charStyle.fontSize / this.CACHE_FONT_SIZE;\n let width: number | undefined,\n coupleWidth: number | undefined,\n previousWidth: number | undefined,\n kernedWidth: number | undefined;\n\n if (previousChar && fontCache[previousChar] !== undefined) {\n previousWidth = fontCache[previousChar];\n }\n if (fontCache[_char] !== undefined) {\n kernedWidth = width = fontCache[_char];\n }\n if (stylesAreEqual && fontCache[couple] !== undefined) {\n coupleWidth = fontCache[couple];\n kernedWidth = coupleWidth - previousWidth!;\n }\n if (\n width === undefined ||\n previousWidth === undefined ||\n coupleWidth === undefined\n ) {\n const ctx = getMeasuringContext()!;\n // send a TRUE to specify measuring font size CACHE_FONT_SIZE\n this._setTextStyles(ctx, charStyle, true);\n if (width === undefined) {\n kernedWidth = width = ctx.measureText(_char).width;\n fontCache[_char] = width;\n }\n if (previousWidth === undefined && stylesAreEqual && previousChar) {\n previousWidth = ctx.measureText(previousChar).width;\n fontCache[previousChar] = previousWidth;\n }\n if (stylesAreEqual && coupleWidth === undefined) {\n // we can measure the kerning couple and subtract the width of the previous character\n coupleWidth = ctx.measureText(couple).width;\n fontCache[couple] = coupleWidth;\n // safe to use the non-null since if undefined we defined it before.\n kernedWidth = coupleWidth - previousWidth!;\n }\n }\n return {\n width: width * fontMultiplier,\n kernedWidth: kernedWidth! * fontMultiplier,\n };\n }\n\n /**\n * Computes height of character at given position\n * @param {Number} line the line index number\n * @param {Number} _char the character index number\n * @return {Number} fontSize of the character\n */\n getHeightOfChar(line: number, _char: number): number {\n return this.getValueOfPropertyAt(line, _char, 'fontSize');\n }\n\n /**\n * measure a text line measuring all characters.\n * @param {Number} lineIndex line number\n */\n measureLine(lineIndex: number) {\n const lineInfo = this._measureLine(lineIndex);\n if (this.charSpacing !== 0) {\n lineInfo.width -= this._getWidthOfCharSpacing();\n }\n if (lineInfo.width < 0) {\n lineInfo.width = 0;\n }\n return lineInfo;\n }\n\n /**\n * measure every grapheme of a line, populating __charBounds\n * @param {Number} lineIndex\n * @return {Object} object.width total width of characters\n * @return {Object} object.numOfSpaces length of chars that match this._reSpacesAndTabs\n */\n _measureLine(lineIndex: number) {\n let width = 0,\n prevGrapheme: string | undefined,\n graphemeInfo: GraphemeBBox | undefined;\n\n const reverse = this.pathSide === RIGHT,\n path = this.path,\n line = this._textLines[lineIndex],\n llength = line.length,\n lineBounds = new Array(llength);\n\n this.__charBounds[lineIndex] = lineBounds;\n for (let i = 0; i < llength; i++) {\n const grapheme = line[i];\n graphemeInfo = this._getGraphemeBox(grapheme, lineIndex, i, prevGrapheme);\n lineBounds[i] = graphemeInfo;\n width += graphemeInfo.kernedWidth;\n prevGrapheme = grapheme;\n }\n // this latest bound box represent the last character of the line\n // to simplify cursor handling in interactive mode.\n lineBounds[llength] = {\n left: graphemeInfo ? graphemeInfo.left + graphemeInfo.width : 0,\n width: 0,\n kernedWidth: 0,\n height: this.fontSize,\n deltaY: 0,\n } as GraphemeBBox;\n if (path && path.segmentsInfo) {\n let positionInPath = 0;\n const totalPathLength =\n path.segmentsInfo[path.segmentsInfo.length - 1].length;\n switch (this.textAlign) {\n case LEFT:\n positionInPath = reverse ? totalPathLength - width : 0;\n break;\n case CENTER:\n positionInPath = (totalPathLength - width) / 2;\n break;\n case RIGHT:\n positionInPath = reverse ? 0 : totalPathLength - width;\n break;\n //todo - add support for justify\n }\n positionInPath += this.pathStartOffset * (reverse ? -1 : 1);\n for (\n let i = reverse ? llength - 1 : 0;\n reverse ? i >= 0 : i < llength;\n reverse ? i-- : i++\n ) {\n graphemeInfo = lineBounds[i];\n if (positionInPath > totalPathLength) {\n positionInPath %= totalPathLength;\n } else if (positionInPath < 0) {\n positionInPath += totalPathLength;\n }\n // it would probably much faster to send all the grapheme position for a line\n // and calculate path position/angle at once.\n this._setGraphemeOnPath(positionInPath, graphemeInfo);\n positionInPath += graphemeInfo.kernedWidth;\n }\n }\n return { width: width, numOfSpaces: 0 };\n }\n\n /**\n * Calculate the angle and the left,top position of the char that follow a path.\n * It appends it to graphemeInfo to be reused later at rendering\n * @private\n * @param {Number} positionInPath to be measured\n * @param {GraphemeBBox} graphemeInfo current grapheme box information\n * @param {Object} startingPoint position of the point\n */\n _setGraphemeOnPath(positionInPath: number, graphemeInfo: GraphemeBBox) {\n const centerPosition = positionInPath + graphemeInfo.kernedWidth / 2,\n path = this.path!;\n\n // we are at currentPositionOnPath. we want to know what point on the path is.\n const info = getPointOnPath(path.path, centerPosition, path.segmentsInfo)!;\n graphemeInfo.renderLeft = info.x - path.pathOffset.x;\n graphemeInfo.renderTop = info.y - path.pathOffset.y;\n graphemeInfo.angle = info.angle + (this.pathSide === RIGHT ? Math.PI : 0);\n }\n\n /**\n *\n * @param {String} grapheme to be measured\n * @param {Number} lineIndex index of the line where the char is\n * @param {Number} charIndex position in the line\n * @param {String} [prevGrapheme] character preceding the one to be measured\n * @returns {GraphemeBBox} grapheme bbox\n */\n _getGraphemeBox(\n grapheme: string,\n lineIndex: number,\n charIndex: number,\n prevGrapheme?: string,\n skipLeft?: boolean,\n ): GraphemeBBox {\n const style = this.getCompleteStyleDeclaration(lineIndex, charIndex),\n prevStyle = prevGrapheme\n ? this.getCompleteStyleDeclaration(lineIndex, charIndex - 1)\n : {},\n info = this._measureChar(grapheme, style, prevGrapheme, prevStyle);\n let kernedWidth = info.kernedWidth,\n width = info.width,\n charSpacing;\n\n if (this.charSpacing !== 0) {\n charSpacing = this._getWidthOfCharSpacing();\n width += charSpacing;\n kernedWidth += charSpacing;\n }\n\n const box: GraphemeBBox = {\n width,\n left: 0,\n height: style.fontSize,\n kernedWidth,\n deltaY: style.deltaY,\n };\n if (charIndex > 0 && !skipLeft) {\n const previousBox = this.__charBounds[lineIndex][charIndex - 1];\n box.left =\n previousBox.left + previousBox.width + info.kernedWidth - info.width;\n }\n return box;\n }\n\n /**\n * Calculate height of line at 'lineIndex'\n * @param {Number} lineIndex index of line to calculate\n * @return {Number}\n */\n getHeightOfLine(lineIndex: number): number {\n if (this.__lineHeights[lineIndex]) {\n return this.__lineHeights[lineIndex];\n }\n\n // char 0 is measured before the line cycle because it needs to char\n // emptylines\n let maxHeight = this.getHeightOfChar(lineIndex, 0);\n for (let i = 1, len = this._textLines[lineIndex].length; i < len; i++) {\n maxHeight = Math.max(this.getHeightOfChar(lineIndex, i), maxHeight);\n }\n\n return (this.__lineHeights[lineIndex] =\n maxHeight * this.lineHeight * this._fontSizeMult);\n }\n\n /**\n * Calculate text box height\n */\n calcTextHeight() {\n let lineHeight,\n height = 0;\n for (let i = 0, len = this._textLines.length; i < len; i++) {\n lineHeight = this.getHeightOfLine(i);\n height += i === len - 1 ? lineHeight / this.lineHeight : lineHeight;\n }\n return height;\n }\n\n /**\n * @private\n * @return {Number} Left offset\n */\n _getLeftOffset(): number {\n return this.direction === 'ltr' ? -this.width / 2 : this.width / 2;\n }\n\n /**\n * @private\n * @return {Number} Top offset\n */\n _getTopOffset(): number {\n return -this.height / 2;\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n * @param {String} method Method name (\"fillText\" or \"strokeText\")\n */\n _renderTextCommon(\n ctx: CanvasRenderingContext2D,\n method: 'fillText' | 'strokeText',\n ) {\n ctx.save();\n let lineHeights = 0;\n const left = this._getLeftOffset(),\n top = this._getTopOffset();\n for (let i = 0, len = this._textLines.length; i < len; i++) {\n const heightOfLine = this.getHeightOfLine(i),\n maxHeight = heightOfLine / this.lineHeight,\n leftOffset = this._getLineLeftOffset(i);\n this._renderTextLine(\n method,\n ctx,\n this._textLines[i],\n left + leftOffset,\n top + lineHeights + maxHeight,\n i,\n );\n lineHeights += heightOfLine;\n }\n ctx.restore();\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _renderTextFill(ctx: CanvasRenderingContext2D) {\n if (!this.fill && !this.styleHas(FILL)) {\n return;\n }\n\n this._renderTextCommon(ctx, 'fillText');\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _renderTextStroke(ctx: CanvasRenderingContext2D) {\n if ((!this.stroke || this.strokeWidth === 0) && this.isEmptyStyles()) {\n return;\n }\n\n if (this.shadow && !this.shadow.affectStroke) {\n this._removeShadow(ctx);\n }\n\n ctx.save();\n this._setLineDash(ctx, this.strokeDashArray);\n ctx.beginPath();\n this._renderTextCommon(ctx, 'strokeText');\n ctx.closePath();\n ctx.restore();\n }\n\n /**\n * @private\n * @param {String} method fillText or strokeText.\n * @param {CanvasRenderingContext2D} ctx Context to render on\n * @param {Array} line Content of the line, splitted in an array by grapheme\n * @param {Number} left\n * @param {Number} top\n * @param {Number} lineIndex\n */\n _renderChars(\n method: 'fillText' | 'strokeText',\n ctx: CanvasRenderingContext2D,\n line: Array,\n left: number,\n top: number,\n lineIndex: number,\n ) {\n const lineHeight = this.getHeightOfLine(lineIndex),\n isJustify = this.textAlign.includes(JUSTIFY),\n path = this.path,\n shortCut =\n !isJustify &&\n this.charSpacing === 0 &&\n this.isEmptyStyles(lineIndex) &&\n !path,\n isLtr = this.direction === 'ltr',\n sign = this.direction === 'ltr' ? 1 : -1,\n // this was changed in the PR #7674\n // currentDirection = ctx.canvas.getAttribute('dir');\n currentDirection = ctx.direction;\n\n let actualStyle,\n nextStyle,\n charsToRender = '',\n charBox,\n boxWidth = 0,\n timeToRender,\n drawingLeft;\n\n ctx.save();\n if (currentDirection !== this.direction) {\n ctx.canvas.setAttribute('dir', isLtr ? 'ltr' : 'rtl');\n ctx.direction = isLtr ? 'ltr' : 'rtl';\n ctx.textAlign = isLtr ? LEFT : RIGHT;\n }\n top -= (lineHeight * this._fontSizeFraction) / this.lineHeight;\n if (shortCut) {\n // render all the line in one pass without checking\n // drawingLeft = isLtr ? left : left - this.getLineWidth(lineIndex);\n this._renderChar(method, ctx, lineIndex, 0, line.join(''), left, top);\n ctx.restore();\n return;\n }\n for (let i = 0, len = line.length - 1; i <= len; i++) {\n timeToRender = i === len || this.charSpacing || path;\n charsToRender += line[i];\n charBox = this.__charBounds[lineIndex][i] as Required;\n if (boxWidth === 0) {\n left += sign * (charBox.kernedWidth - charBox.width);\n boxWidth += charBox.width;\n } else {\n boxWidth += charBox.kernedWidth;\n }\n if (isJustify && !timeToRender) {\n if (this._reSpaceAndTab.test(line[i])) {\n timeToRender = true;\n }\n }\n if (!timeToRender) {\n // if we have charSpacing, we render char by char\n actualStyle =\n actualStyle || this.getCompleteStyleDeclaration(lineIndex, i);\n nextStyle = this.getCompleteStyleDeclaration(lineIndex, i + 1);\n timeToRender = hasStyleChanged(actualStyle, nextStyle, false);\n }\n if (timeToRender) {\n if (path) {\n ctx.save();\n ctx.translate(charBox.renderLeft, charBox.renderTop);\n ctx.rotate(charBox.angle);\n this._renderChar(\n method,\n ctx,\n lineIndex,\n i,\n charsToRender,\n -boxWidth / 2,\n 0,\n );\n ctx.restore();\n } else {\n drawingLeft = left;\n this._renderChar(\n method,\n ctx,\n lineIndex,\n i,\n charsToRender,\n drawingLeft,\n top,\n );\n }\n charsToRender = '';\n actualStyle = nextStyle;\n left += sign * boxWidth;\n boxWidth = 0;\n }\n }\n ctx.restore();\n }\n\n /**\n * This function try to patch the missing gradientTransform on canvas gradients.\n * transforming a context to transform the gradient, is going to transform the stroke too.\n * we want to transform the gradient but not the stroke operation, so we create\n * a transformed gradient on a pattern and then we use the pattern instead of the gradient.\n * this method has drawbacks: is slow, is in low resolution, needs a patch for when the size\n * is limited.\n * @private\n * @param {TFiller} filler a fabric gradient instance\n * @return {CanvasPattern} a pattern to use as fill/stroke style\n */\n _applyPatternGradientTransformText(filler: TFiller) {\n // TODO: verify compatibility with strokeUniform\n const width = this.width + this.strokeWidth,\n height = this.height + this.strokeWidth,\n pCanvas = createCanvasElementFor({\n width,\n height,\n }),\n pCtx = pCanvas.getContext('2d')!;\n pCanvas.width = width;\n pCanvas.height = height;\n pCtx.beginPath();\n pCtx.moveTo(0, 0);\n pCtx.lineTo(width, 0);\n pCtx.lineTo(width, height);\n pCtx.lineTo(0, height);\n pCtx.closePath();\n pCtx.translate(width / 2, height / 2);\n pCtx.fillStyle = filler.toLive(pCtx)!;\n this._applyPatternGradientTransform(pCtx, filler);\n pCtx.fill();\n return pCtx.createPattern(pCanvas, 'no-repeat')!;\n }\n\n handleFiller(\n ctx: CanvasRenderingContext2D,\n property: `${T}Style`,\n filler: TFiller | string,\n ): { offsetX: number; offsetY: number } {\n let offsetX: number, offsetY: number;\n if (isFiller(filler)) {\n if (\n (filler as Gradient<'linear'>).gradientUnits === 'percentage' ||\n (filler as Gradient<'linear'>).gradientTransform ||\n (filler as Pattern).patternTransform\n ) {\n // need to transform gradient in a pattern.\n // this is a slow process. If you are hitting this codepath, and the object\n // is not using caching, you should consider switching it on.\n // we need a canvas as big as the current object caching canvas.\n offsetX = -this.width / 2;\n offsetY = -this.height / 2;\n ctx.translate(offsetX, offsetY);\n ctx[property] = this._applyPatternGradientTransformText(filler);\n return { offsetX, offsetY };\n } else {\n // is a simple gradient or pattern\n ctx[property] = filler.toLive(ctx)!;\n return this._applyPatternGradientTransform(ctx, filler);\n }\n } else {\n // is a color\n ctx[property] = filler;\n }\n return { offsetX: 0, offsetY: 0 };\n }\n\n /**\n * This function prepare the canvas for a stroke style, and stroke and strokeWidth\n * need to be sent in as defined\n * @param {CanvasRenderingContext2D} ctx\n * @param {CompleteTextStyleDeclaration} style with stroke and strokeWidth defined\n * @returns\n */\n _setStrokeStyles(\n ctx: CanvasRenderingContext2D,\n {\n stroke,\n strokeWidth,\n }: Pick,\n ) {\n ctx.lineWidth = strokeWidth;\n ctx.lineCap = this.strokeLineCap;\n ctx.lineDashOffset = this.strokeDashOffset;\n ctx.lineJoin = this.strokeLineJoin;\n ctx.miterLimit = this.strokeMiterLimit;\n return this.handleFiller(ctx, 'strokeStyle', stroke!);\n }\n\n /**\n * This function prepare the canvas for a ill style, and fill\n * need to be sent in as defined\n * @param {CanvasRenderingContext2D} ctx\n * @param {CompleteTextStyleDeclaration} style with ill defined\n * @returns\n */\n _setFillStyles(ctx: CanvasRenderingContext2D, { fill }: Pick) {\n return this.handleFiller(ctx, 'fillStyle', fill!);\n }\n\n /**\n * @private\n * @param {String} method\n * @param {CanvasRenderingContext2D} ctx Context to render on\n * @param {Number} lineIndex\n * @param {Number} charIndex\n * @param {String} _char\n * @param {Number} left Left coordinate\n * @param {Number} top Top coordinate\n * @param {Number} lineHeight Height of the line\n */\n _renderChar(\n method: 'fillText' | 'strokeText',\n ctx: CanvasRenderingContext2D,\n lineIndex: number,\n charIndex: number,\n _char: string,\n left: number,\n top: number,\n ) {\n const decl = this._getStyleDeclaration(lineIndex, charIndex),\n fullDecl = this.getCompleteStyleDeclaration(lineIndex, charIndex),\n shouldFill = method === 'fillText' && fullDecl.fill,\n shouldStroke =\n method === 'strokeText' && fullDecl.stroke && fullDecl.strokeWidth;\n\n if (!shouldStroke && !shouldFill) {\n return;\n }\n ctx.save();\n\n ctx.font = this._getFontDeclaration(fullDecl);\n\n if (decl.textBackgroundColor) {\n this._removeShadow(ctx);\n }\n if (decl.deltaY) {\n top += decl.deltaY;\n }\n\n if (shouldFill) {\n const fillOffsets = this._setFillStyles(ctx, fullDecl);\n ctx.fillText(\n _char,\n left - fillOffsets.offsetX,\n top - fillOffsets.offsetY,\n );\n }\n\n if (shouldStroke) {\n const strokeOffsets = this._setStrokeStyles(ctx, fullDecl);\n ctx.strokeText(\n _char,\n left - strokeOffsets.offsetX,\n top - strokeOffsets.offsetY,\n );\n }\n\n ctx.restore();\n }\n\n /**\n * Turns the character into a 'superior figure' (i.e. 'superscript')\n * @param {Number} start selection start\n * @param {Number} end selection end\n */\n setSuperscript(start: number, end: number) {\n this._setScript(start, end, this.superscript);\n }\n\n /**\n * Turns the character into an 'inferior figure' (i.e. 'subscript')\n * @param {Number} start selection start\n * @param {Number} end selection end\n */\n setSubscript(start: number, end: number) {\n this._setScript(start, end, this.subscript);\n }\n\n /**\n * Applies 'schema' at given position\n * @private\n * @param {Number} start selection start\n * @param {Number} end selection end\n * @param {Number} schema\n */\n protected _setScript(\n start: number,\n end: number,\n schema: {\n size: number;\n baseline: number;\n },\n ) {\n const loc = this.get2DCursorLocation(start, true),\n fontSize = this.getValueOfPropertyAt(\n loc.lineIndex,\n loc.charIndex,\n 'fontSize',\n ),\n dy = this.getValueOfPropertyAt(loc.lineIndex, loc.charIndex, 'deltaY'),\n style = {\n fontSize: fontSize * schema.size,\n deltaY: dy + fontSize * schema.baseline,\n };\n this.setSelectionStyles(style, start, end);\n }\n\n /**\n * @private\n * @param {Number} lineIndex index text line\n * @return {Number} Line left offset\n */\n _getLineLeftOffset(lineIndex: number): number {\n const lineWidth = this.getLineWidth(lineIndex),\n lineDiff = this.width - lineWidth,\n textAlign = this.textAlign,\n direction = this.direction,\n isEndOfWrapping = this.isEndOfWrapping(lineIndex);\n let leftOffset = 0;\n if (\n textAlign === JUSTIFY ||\n (textAlign === JUSTIFY_CENTER && !isEndOfWrapping) ||\n (textAlign === JUSTIFY_RIGHT && !isEndOfWrapping) ||\n (textAlign === JUSTIFY_LEFT && !isEndOfWrapping)\n ) {\n return 0;\n }\n if (textAlign === CENTER) {\n leftOffset = lineDiff / 2;\n }\n if (textAlign === RIGHT) {\n leftOffset = lineDiff;\n }\n if (textAlign === JUSTIFY_CENTER) {\n leftOffset = lineDiff / 2;\n }\n if (textAlign === JUSTIFY_RIGHT) {\n leftOffset = lineDiff;\n }\n if (direction === 'rtl') {\n if (\n textAlign === RIGHT ||\n textAlign === JUSTIFY ||\n textAlign === JUSTIFY_RIGHT\n ) {\n leftOffset = 0;\n } else if (textAlign === LEFT || textAlign === JUSTIFY_LEFT) {\n leftOffset = -lineDiff;\n } else if (textAlign === CENTER || textAlign === JUSTIFY_CENTER) {\n leftOffset = -lineDiff / 2;\n }\n }\n return leftOffset;\n }\n\n /**\n * @private\n */\n _clearCache() {\n this._forceClearCache = false;\n this.__lineWidths = [];\n this.__lineHeights = [];\n this.__charBounds = [];\n }\n\n /**\n * Measure a single line given its index. Used to calculate the initial\n * text bounding box. The values are calculated and stored in __lineWidths cache.\n * @private\n * @param {Number} lineIndex line number\n * @return {Number} Line width\n */\n getLineWidth(lineIndex: number): number {\n if (this.__lineWidths[lineIndex] !== undefined) {\n return this.__lineWidths[lineIndex];\n }\n\n const { width } = this.measureLine(lineIndex);\n this.__lineWidths[lineIndex] = width;\n return width;\n }\n\n _getWidthOfCharSpacing() {\n if (this.charSpacing !== 0) {\n return (this.fontSize * this.charSpacing) / 1000;\n }\n return 0;\n }\n\n /**\n * Retrieves the value of property at given character position\n * @param {Number} lineIndex the line number\n * @param {Number} charIndex the character number\n * @param {String} property the property name\n * @returns the value of 'property'\n */\n getValueOfPropertyAt(\n lineIndex: number,\n charIndex: number,\n property: T,\n ): this[T] {\n const charStyle = this._getStyleDeclaration(lineIndex, charIndex);\n return (charStyle[property] ?? this[property]) as this[T];\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _renderTextDecoration(\n ctx: CanvasRenderingContext2D,\n type: 'underline' | 'linethrough' | 'overline',\n ) {\n if (!this[type] && !this.styleHas(type)) {\n return;\n }\n let topOffset = this._getTopOffset();\n const leftOffset = this._getLeftOffset(),\n path = this.path,\n charSpacing = this._getWidthOfCharSpacing(),\n offsetAligner =\n type === 'linethrough' ? 0.5 : type === 'overline' ? 1 : 0,\n offsetY = this.offsets[type];\n for (let i = 0, len = this._textLines.length; i < len; i++) {\n const heightOfLine = this.getHeightOfLine(i);\n if (!this[type] && !this.styleHas(type, i)) {\n topOffset += heightOfLine;\n continue;\n }\n const line = this._textLines[i];\n const maxHeight = heightOfLine / this.lineHeight;\n const lineLeftOffset = this._getLineLeftOffset(i);\n let boxStart = 0;\n let boxWidth = 0;\n let lastDecoration = this.getValueOfPropertyAt(i, 0, type);\n let lastFill = this.getValueOfPropertyAt(i, 0, FILL);\n let lastTickness = this.getValueOfPropertyAt(\n i,\n 0,\n TEXT_DECORATION_THICKNESS,\n );\n let currentDecoration = lastDecoration;\n let currentFill = lastFill;\n let currentTickness = lastTickness;\n const top = topOffset + maxHeight * (1 - this._fontSizeFraction);\n let size = this.getHeightOfChar(i, 0);\n let dy = this.getValueOfPropertyAt(i, 0, 'deltaY');\n for (let j = 0, jlen = line.length; j < jlen; j++) {\n const charBox = this.__charBounds[i][j] as Required;\n currentDecoration = this.getValueOfPropertyAt(i, j, type);\n currentFill = this.getValueOfPropertyAt(i, j, FILL);\n currentTickness = this.getValueOfPropertyAt(\n i,\n j,\n TEXT_DECORATION_THICKNESS,\n );\n const currentSize = this.getHeightOfChar(i, j);\n const currentDy = this.getValueOfPropertyAt(i, j, 'deltaY');\n if (path && currentDecoration && currentFill) {\n const finalTickness = (this.fontSize * currentTickness) / 1000;\n ctx.save();\n // bug? verify lastFill is a valid fill here.\n ctx.fillStyle = lastFill as string;\n ctx.translate(charBox.renderLeft, charBox.renderTop);\n ctx.rotate(charBox.angle);\n ctx.fillRect(\n -charBox.kernedWidth / 2,\n offsetY * currentSize + currentDy - offsetAligner * finalTickness,\n charBox.kernedWidth,\n finalTickness,\n );\n ctx.restore();\n } else if (\n (currentDecoration !== lastDecoration ||\n currentFill !== lastFill ||\n currentSize !== size ||\n currentTickness !== lastTickness ||\n currentDy !== dy) &&\n boxWidth > 0\n ) {\n const finalTickness = (this.fontSize * lastTickness) / 1000;\n let drawStart = leftOffset + lineLeftOffset + boxStart;\n if (this.direction === 'rtl') {\n drawStart = this.width - drawStart - boxWidth;\n }\n if (lastDecoration && lastFill && lastTickness) {\n // bug? verify lastFill is a valid fill here.\n ctx.fillStyle = lastFill as string;\n ctx.fillRect(\n drawStart,\n top + offsetY * size + dy - offsetAligner * finalTickness,\n boxWidth,\n finalTickness,\n );\n }\n boxStart = charBox.left;\n boxWidth = charBox.width;\n lastDecoration = currentDecoration;\n lastTickness = currentTickness;\n lastFill = currentFill;\n size = currentSize;\n dy = currentDy;\n } else {\n boxWidth += charBox.kernedWidth;\n }\n }\n let drawStart = leftOffset + lineLeftOffset + boxStart;\n if (this.direction === 'rtl') {\n drawStart = this.width - drawStart - boxWidth;\n }\n ctx.fillStyle = currentFill as string;\n const finalTickness = (this.fontSize * currentTickness) / 1000;\n currentDecoration &&\n currentFill &&\n currentTickness &&\n ctx.fillRect(\n drawStart,\n top + offsetY * size + dy - offsetAligner * finalTickness,\n boxWidth - charSpacing,\n finalTickness,\n );\n topOffset += heightOfLine;\n }\n // if there is text background color no\n // other shadows should be casted\n this._removeShadow(ctx);\n }\n\n /**\n * return font declaration string for canvas context\n * @param {Object} [styleObject] object\n * @returns {String} font declaration formatted for canvas context.\n */\n _getFontDeclaration(\n {\n fontFamily = this.fontFamily,\n fontStyle = this.fontStyle,\n fontWeight = this.fontWeight,\n fontSize = this.fontSize,\n }: Partial<\n Pick<\n TextStyleDeclaration,\n 'fontFamily' | 'fontStyle' | 'fontWeight' | 'fontSize'\n >\n > = {},\n forMeasuring?: boolean,\n ): string {\n const parsedFontFamily =\n fontFamily.includes(\"'\") ||\n fontFamily.includes('\"') ||\n fontFamily.includes(',') ||\n FabricText.genericFonts.includes(fontFamily.toLowerCase())\n ? fontFamily\n : `\"${fontFamily}\"`;\n return [\n fontStyle,\n fontWeight,\n `${forMeasuring ? this.CACHE_FONT_SIZE : fontSize}px`,\n parsedFontFamily,\n ].join(' ');\n }\n\n /**\n * Renders text instance on a specified context\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n render(ctx: CanvasRenderingContext2D) {\n if (!this.visible) {\n return;\n }\n if (\n this.canvas &&\n this.canvas.skipOffscreen &&\n !this.group &&\n !this.isOnScreen()\n ) {\n return;\n }\n if (this._forceClearCache) {\n this.initDimensions();\n }\n super.render(ctx);\n }\n\n /**\n * Override this method to customize grapheme splitting\n * @todo the util `graphemeSplit` needs to be injectable in some way.\n * is more comfortable to inject the correct util rather than having to override text\n * in the middle of the prototype chain\n * @param {string} value\n * @returns {string[]} array of graphemes\n */\n graphemeSplit(value: string): string[] {\n return graphemeSplit(value);\n }\n\n /**\n * Returns the text as an array of lines.\n * @param {String} text text to split\n * @returns Lines in the text\n */\n _splitTextIntoLines(text: string): TextLinesInfo {\n const lines = text.split(this._reNewline),\n newLines = new Array(lines.length),\n newLine = ['\\n'];\n let newText: string[] = [];\n for (let i = 0; i < lines.length; i++) {\n newLines[i] = this.graphemeSplit(lines[i]);\n newText = newText.concat(newLines[i], newLine);\n }\n newText.pop();\n return {\n _unwrappedLines: newLines,\n lines: lines,\n graphemeText: newText,\n graphemeLines: newLines,\n };\n }\n\n /**\n * Returns object representation of an instance\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} Object representation of an instance\n */\n toObject<\n T extends Omit, keyof SProps>,\n K extends keyof T = never,\n >(propertiesToInclude: K[] = []): Pick & SProps {\n return {\n ...super.toObject([...additionalProps, ...propertiesToInclude] as K[]),\n styles: stylesToArray(this.styles, this.text),\n ...(this.path ? { path: this.path.toObject() } : {}),\n };\n }\n\n set(key: string | any, value?: any) {\n const { textLayoutProperties } = this.constructor as typeof FabricText;\n super.set(key, value);\n let needsDims = false;\n let isAddingPath = false;\n if (typeof key === 'object') {\n for (const _key in key) {\n if (_key === 'path') {\n this.setPathInfo();\n }\n needsDims = needsDims || textLayoutProperties.includes(_key);\n isAddingPath = isAddingPath || _key === 'path';\n }\n } else {\n needsDims = textLayoutProperties.includes(key);\n isAddingPath = key === 'path';\n }\n if (isAddingPath) {\n this.setPathInfo();\n }\n if (needsDims && this.initialized) {\n this.initDimensions();\n this.setCoords();\n }\n return this;\n }\n\n /**\n * Returns complexity of an instance\n * @return {Number} complexity\n */\n complexity(): number {\n return 1;\n }\n\n /**\n * List of generic font families\n * @see https://developer.mozilla.org/en-US/docs/Web/CSS/font-family#generic-name\n */\n static genericFonts = [\n 'serif',\n 'sans-serif',\n 'monospace',\n 'cursive',\n 'fantasy',\n 'system-ui',\n 'ui-serif',\n 'ui-sans-serif',\n 'ui-monospace',\n 'ui-rounded',\n 'math',\n 'emoji',\n 'fangsong',\n ];\n\n /* _FROM_SVG_START_ */\n\n /**\n * List of attribute names to account for when parsing SVG element (used by {@link FabricText.fromElement})\n * @see: http://www.w3.org/TR/SVG/text.html#TextElement\n */\n static ATTRIBUTE_NAMES = SHARED_ATTRIBUTES.concat(\n 'x',\n 'y',\n 'dx',\n 'dy',\n 'font-family',\n 'font-style',\n 'font-weight',\n 'font-size',\n 'letter-spacing',\n 'text-decoration',\n 'text-anchor',\n );\n\n /**\n * Returns FabricText instance from an SVG element (not yet implemented)\n * @param {HTMLElement} element Element to parse\n * @param {Object} [options] Options object\n */\n static async fromElement(\n element: HTMLElement | SVGElement,\n options?: Abortable,\n cssRules?: CSSRules,\n ) {\n const parsedAttributes = parseAttributes(\n element,\n FabricText.ATTRIBUTE_NAMES,\n cssRules,\n );\n\n const {\n textAnchor = LEFT as typeof LEFT | typeof CENTER | typeof RIGHT,\n textDecoration = '',\n dx = 0,\n dy = 0,\n top = 0,\n left = 0,\n fontSize = DEFAULT_SVG_FONT_SIZE,\n strokeWidth = 1,\n ...restOfOptions\n } = { ...options, ...parsedAttributes };\n\n const textContent = (element.textContent || '')\n .replace(/^\\s+|\\s+$|\\n+/g, '')\n .replace(/\\s+/g, ' ');\n\n // this code here is probably the usual issue for SVG center find\n // this can later looked at again and probably removed.\n\n const text = new this(textContent, {\n left: left + dx,\n top: top + dy,\n underline: textDecoration.includes('underline'),\n overline: textDecoration.includes('overline'),\n linethrough: textDecoration.includes('line-through'),\n // we initialize this as 0\n strokeWidth: 0,\n fontSize,\n ...restOfOptions,\n }),\n textHeightScaleFactor = text.getScaledHeight() / text.height,\n lineHeightDiff =\n (text.height + text.strokeWidth) * text.lineHeight - text.height,\n scaledDiff = lineHeightDiff * textHeightScaleFactor,\n textHeight = text.getScaledHeight() + scaledDiff;\n\n let offX = 0;\n /*\n Adjust positioning:\n x/y attributes in SVG correspond to the bottom-left corner of text bounding box\n fabric output by default at top, left.\n */\n if (textAnchor === CENTER) {\n offX = text.getScaledWidth() / 2;\n }\n if (textAnchor === RIGHT) {\n offX = text.getScaledWidth();\n }\n text.set({\n left: text.left - offX,\n top:\n text.top -\n (textHeight - text.fontSize * (0.07 + text._fontSizeFraction)) /\n text.lineHeight,\n strokeWidth,\n });\n return text;\n }\n\n /* _FROM_SVG_END_ */\n\n /**\n * Returns FabricText instance from an object representation\n * @param {Object} object plain js Object to create an instance from\n * @returns {Promise}\n */\n static fromObject<\n T extends TOptions,\n S extends FabricText,\n >(object: T) {\n return this._fromObject(\n {\n ...object,\n styles: stylesFromArray(object.styles || {}, object.text),\n },\n {\n extraParam: 'text',\n },\n );\n }\n}\n\napplyMixins(FabricText, [TextSVGExportMixin]);\nclassRegistry.setClass(FabricText);\nclassRegistry.setSVGClass(FabricText);\n","import type {\n DragEventData,\n DropEventData,\n TPointerEvent,\n} from '../../EventTypeDefs';\nimport { Point } from '../../Point';\nimport type { IText } from './IText';\nimport { setStyle } from '../../util/internals/dom_style';\nimport { cloneStyles } from '../../util/internals/cloneStyles';\nimport type { TextStyleDeclaration } from '../Text/StyledText';\nimport { getDocumentFromElement } from '../../util/dom_misc';\nimport { CHANGED, NONE } from '../../constants';\n\n/**\n * #### Dragging IText/Textbox Lifecycle\n * - {@link start} is called from `mousedown` {@link IText#_mouseDownHandler} and determines if dragging should start by testing {@link isPointerOverSelection}\n * - if true `mousedown` {@link IText#_mouseDownHandler} is blocked to keep selection\n * - if the pointer moves, canvas fires numerous mousemove {@link Canvas#_onMouseMove} that we make sure **aren't** prevented ({@link IText#shouldStartDragging}) in order for the window to start a drag session\n * - once/if the session starts canvas calls {@link onDragStart} on the active object to determine if dragging should occur\n * - canvas fires relevant drag events that are handled by the handlers defined in this scope\n * - {@link end} is called from `mouseup` {@link IText#mouseUpHandler}, blocking IText default click behavior\n * - in case the drag session didn't occur, {@link end} handles a click, since logic to do so was blocked during `mousedown`\n */\nexport class DraggableTextDelegate {\n readonly target: IText;\n private __mouseDownInPlace = false;\n private __dragStartFired = false;\n private __isDraggingOver = false;\n private __dragStartSelection?: {\n selectionStart: number;\n selectionEnd: number;\n };\n private __dragImageDisposer?: VoidFunction;\n private _dispose?: () => void;\n\n constructor(target: IText) {\n this.target = target;\n const disposers = [\n this.target.on('dragenter', this.dragEnterHandler.bind(this)),\n this.target.on('dragover', this.dragOverHandler.bind(this)),\n this.target.on('dragleave', this.dragLeaveHandler.bind(this)),\n this.target.on('dragend', this.dragEndHandler.bind(this)),\n this.target.on('drop', this.dropHandler.bind(this)),\n ];\n this._dispose = () => {\n disposers.forEach((d) => d());\n this._dispose = undefined;\n };\n }\n\n isPointerOverSelection(e: TPointerEvent) {\n const target = this.target;\n const newSelection = target.getSelectionStartFromPointer(e);\n return (\n target.isEditing &&\n newSelection >= target.selectionStart &&\n newSelection <= target.selectionEnd &&\n target.selectionStart < target.selectionEnd\n );\n }\n\n /**\n * @public override this method to disable dragging and default to mousedown logic\n */\n start(e: TPointerEvent) {\n return (this.__mouseDownInPlace = this.isPointerOverSelection(e));\n }\n\n /**\n * @public override this method to disable dragging without discarding selection\n */\n isActive() {\n return this.__mouseDownInPlace;\n }\n\n /**\n * Ends interaction and sets cursor in case of a click\n * @returns true if was active\n */\n end(e: TPointerEvent) {\n const active = this.isActive();\n if (active && !this.__dragStartFired) {\n // mousedown has been blocked since `active` is true => cursor has not been set.\n // `__dragStartFired` is false => dragging didn't occur, pointer didn't move and is over selection.\n // meaning this is actually a click, `active` is a false positive.\n this.target.setCursorByClick(e);\n this.target.initDelayedCursor(true);\n }\n this.__mouseDownInPlace = false;\n this.__dragStartFired = false;\n this.__isDraggingOver = false;\n return active;\n }\n\n getDragStartSelection() {\n return this.__dragStartSelection;\n }\n\n /**\n * Override to customize the drag image\n * https://developer.mozilla.org/en-US/docs/Web/API/DataTransfer/setDragImage\n */\n setDragImage(\n e: DragEvent,\n {\n selectionStart,\n selectionEnd,\n }: {\n selectionStart: number;\n selectionEnd: number;\n },\n ) {\n const target = this.target;\n const canvas = target.canvas!;\n const flipFactor = new Point(target.flipX ? -1 : 1, target.flipY ? -1 : 1);\n const boundaries = target._getCursorBoundaries(selectionStart);\n const selectionPosition = new Point(\n boundaries.left + boundaries.leftOffset,\n boundaries.top + boundaries.topOffset,\n ).multiply(flipFactor);\n const pos = selectionPosition.transform(target.calcTransformMatrix());\n const pointer = canvas.getScenePoint(e);\n const diff = pointer.subtract(pos);\n const retinaScaling = target.getCanvasRetinaScaling();\n const bbox = target.getBoundingRect();\n const correction = pos.subtract(new Point(bbox.left, bbox.top));\n const vpt = canvas.viewportTransform;\n const offset = correction.add(diff).transform(vpt, true);\n // prepare instance for drag image snapshot by making all non selected text invisible\n const bgc = target.backgroundColor;\n const styles = cloneStyles(target.styles);\n target.backgroundColor = '';\n const styleOverride = {\n stroke: 'transparent',\n fill: 'transparent',\n textBackgroundColor: 'transparent',\n };\n target.setSelectionStyles(styleOverride, 0, selectionStart);\n target.setSelectionStyles(styleOverride, selectionEnd, target.text.length);\n target.dirty = true;\n const dragImage = target.toCanvasElement({\n enableRetinaScaling: canvas.enableRetinaScaling,\n viewportTransform: true,\n });\n // restore values\n target.backgroundColor = bgc;\n target.styles = styles;\n target.dirty = true;\n // position drag image offscreen\n setStyle(dragImage, {\n position: 'fixed',\n left: `${-dragImage.width}px`,\n border: NONE,\n width: `${dragImage.width / retinaScaling}px`,\n height: `${dragImage.height / retinaScaling}px`,\n });\n this.__dragImageDisposer && this.__dragImageDisposer();\n this.__dragImageDisposer = () => {\n dragImage.remove();\n };\n getDocumentFromElement(\n (e.target || this.target.hiddenTextarea)! as HTMLElement,\n ).body.appendChild(dragImage);\n e.dataTransfer?.setDragImage(dragImage, offset.x, offset.y);\n }\n\n /**\n * @returns {boolean} determines whether {@link target} should/shouldn't become a drag source\n */\n onDragStart(e: DragEvent): boolean {\n this.__dragStartFired = true;\n const target = this.target;\n const active = this.isActive();\n if (active && e.dataTransfer) {\n const selection = (this.__dragStartSelection = {\n selectionStart: target.selectionStart,\n selectionEnd: target.selectionEnd,\n });\n const value = target._text\n .slice(selection.selectionStart, selection.selectionEnd)\n .join('');\n const data = { text: target.text, value, ...selection };\n e.dataTransfer.setData('text/plain', value);\n e.dataTransfer.setData(\n 'application/fabric',\n JSON.stringify({\n value: value,\n styles: target.getSelectionStyles(\n selection.selectionStart,\n selection.selectionEnd,\n true,\n ),\n }),\n );\n e.dataTransfer.effectAllowed = 'copyMove';\n this.setDragImage(e, data);\n }\n target.abortCursorAnimation();\n return active;\n }\n\n /**\n * use {@link targetCanDrop} to respect overriding\n * @returns {boolean} determines whether {@link target} should/shouldn't become a drop target\n */\n canDrop(e: DragEvent): boolean {\n if (\n this.target.editable &&\n !this.target.getActiveControl() &&\n !e.defaultPrevented\n ) {\n if (this.isActive() && this.__dragStartSelection) {\n // drag source trying to drop over itself\n // allow dropping only outside of drag start selection\n const index = this.target.getSelectionStartFromPointer(e);\n const dragStartSelection = this.__dragStartSelection;\n return (\n index < dragStartSelection.selectionStart ||\n index > dragStartSelection.selectionEnd\n );\n }\n return true;\n }\n return false;\n }\n\n /**\n * in order to respect overriding {@link IText#canDrop} we call that instead of calling {@link canDrop} directly\n */\n protected targetCanDrop(e: DragEvent) {\n return this.target.canDrop(e);\n }\n\n dragEnterHandler({ e }: DragEventData) {\n const canDrop = this.targetCanDrop(e);\n if (!this.__isDraggingOver && canDrop) {\n this.__isDraggingOver = true;\n }\n }\n\n dragOverHandler(ev: DragEventData) {\n const { e } = ev;\n const canDrop = this.targetCanDrop(e);\n if (!this.__isDraggingOver && canDrop) {\n this.__isDraggingOver = true;\n } else if (this.__isDraggingOver && !canDrop) {\n // drop state has changed\n this.__isDraggingOver = false;\n }\n if (this.__isDraggingOver) {\n // can be dropped, inform browser\n e.preventDefault();\n // inform event subscribers\n ev.canDrop = true;\n ev.dropTarget = this.target;\n }\n }\n\n dragLeaveHandler() {\n if (this.__isDraggingOver || this.isActive()) {\n this.__isDraggingOver = false;\n }\n }\n\n /**\n * Override the `text/plain | application/fabric` types of {@link DragEvent#dataTransfer}\n * in order to change the drop value or to customize styling respectively, by listening to the `drop:before` event\n * https://developer.mozilla.org/en-US/docs/Web/API/HTML_Drag_and_Drop_API/Drag_operations#performing_a_drop\n */\n dropHandler(ev: DropEventData) {\n const { e } = ev;\n const didDrop = e.defaultPrevented;\n this.__isDraggingOver = false;\n // inform browser that the drop has been accepted\n e.preventDefault();\n let insert = e.dataTransfer?.getData('text/plain');\n if (insert && !didDrop) {\n const target = this.target;\n const canvas = target.canvas!;\n let insertAt = target.getSelectionStartFromPointer(e);\n const { styles } = (\n e.dataTransfer!.types.includes('application/fabric')\n ? JSON.parse(e.dataTransfer!.getData('application/fabric'))\n : {}\n ) as { styles: TextStyleDeclaration[] };\n const trailing = insert[Math.max(0, insert.length - 1)];\n const selectionStartOffset = 0;\n // drag and drop in same instance\n if (this.__dragStartSelection) {\n const selectionStart = this.__dragStartSelection.selectionStart;\n const selectionEnd = this.__dragStartSelection.selectionEnd;\n if (insertAt > selectionStart && insertAt <= selectionEnd) {\n insertAt = selectionStart;\n } else if (insertAt > selectionEnd) {\n insertAt -= selectionEnd - selectionStart;\n }\n target.removeChars(selectionStart, selectionEnd);\n // prevent `dragend` from handling event\n delete this.__dragStartSelection;\n }\n // remove redundant line break\n if (\n target._reNewline.test(trailing) &&\n (target._reNewline.test(target._text[insertAt]) ||\n insertAt === target._text.length)\n ) {\n insert = insert.trimEnd();\n }\n // inform subscribers\n ev.didDrop = true;\n ev.dropTarget = target;\n // finalize\n target.insertChars(insert, styles, insertAt);\n // can this part be moved in an outside event? andrea to check.\n canvas.setActiveObject(target);\n target.enterEditing(e);\n target.selectionStart = Math.min(\n insertAt + selectionStartOffset,\n target._text.length,\n );\n target.selectionEnd = Math.min(\n target.selectionStart + insert.length,\n target._text.length,\n );\n target.hiddenTextarea!.value = target.text;\n target._updateTextarea();\n target.hiddenTextarea!.focus();\n target.fire(CHANGED, {\n index: insertAt + selectionStartOffset,\n action: 'drop',\n });\n canvas.fire('text:changed', { target });\n canvas.contextTopDirty = true;\n canvas.requestRenderAll();\n }\n }\n\n /**\n * fired only on the drag source after drop (if occurred)\n * handle changes to the drag source in case of a drop on another object or a cancellation\n * https://developer.mozilla.org/en-US/docs/Web/API/HTML_Drag_and_Drop_API/Drag_operations#finishing_a_drag\n */\n dragEndHandler({ e }: DragEventData) {\n if (this.isActive() && this.__dragStartFired) {\n // once the drop event finishes we check if we need to change the drag source\n // if the drag source received the drop we bail out since the drop handler has already handled logic\n if (this.__dragStartSelection) {\n const target = this.target;\n const canvas = this.target.canvas!;\n const { selectionStart, selectionEnd } = this.__dragStartSelection;\n const dropEffect = e.dataTransfer?.dropEffect || NONE;\n if (dropEffect === NONE) {\n // pointer is back over selection\n target.selectionStart = selectionStart;\n target.selectionEnd = selectionEnd;\n target._updateTextarea();\n target.hiddenTextarea!.focus();\n } else {\n target.clearContextTop();\n if (dropEffect === 'move') {\n target.removeChars(selectionStart, selectionEnd);\n target.selectionStart = target.selectionEnd = selectionStart;\n target.hiddenTextarea &&\n (target.hiddenTextarea.value = target.text);\n target._updateTextarea();\n target.fire(CHANGED, {\n index: selectionStart,\n action: 'dragend',\n });\n canvas.fire('text:changed', { target });\n canvas.requestRenderAll();\n }\n target.exitEditing();\n }\n }\n }\n\n this.__dragImageDisposer && this.__dragImageDisposer();\n delete this.__dragImageDisposer;\n delete this.__dragStartSelection;\n this.__isDraggingOver = false;\n }\n\n dispose() {\n this._dispose && this._dispose();\n }\n}\n","import type { ObjectEvents, TPointerEvent } from '../../EventTypeDefs';\nimport { Point } from '../../Point';\nimport type { FabricObject } from '../Object/FabricObject';\nimport { FabricText } from '../Text/Text';\nimport { animate } from '../../util/animation/animate';\nimport type { TOnAnimationChangeCallback } from '../../util/animation/types';\nimport type { ValueAnimation } from '../../util/animation/ValueAnimation';\nimport type { TextStyleDeclaration } from '../Text/StyledText';\nimport type { SerializedTextProps, TextProps } from '../Text/Text';\nimport type { TOptions } from '../../typedefs';\nimport { getDocumentFromElement } from '../../util/dom_misc';\nimport { LEFT, MODIFIED, RIGHT, reNewline } from '../../constants';\nimport type { IText } from './IText';\n\n/**\n * extend this regex to support non english languages\n *\n * - ` ` Matches a SPACE character (char code 32).\n * - `\\n` Matches a LINE FEED character (char code 10).\n * - `\\.` Matches a \".\" character (char code 46).\n * - `,` Matches a \",\" character (char code 44).\n * - `;` Matches a \";\" character (char code 59).\n * - `!` Matches a \"!\" character (char code 33).\n * - `\\?` Matches a \"?\" character (char code 63).\n * - `\\-` Matches a \"-\" character (char code 45).\n */\n// eslint-disable-next-line no-useless-escape\nconst reNonWord = /[ \\n\\.,;!\\?\\-]/;\n\nexport type ITextEvents = ObjectEvents & {\n 'selection:changed': never;\n changed: never | { index: number; action: string };\n 'editing:entered': never | { e: TPointerEvent };\n 'editing:exited': never;\n};\n\nexport abstract class ITextBehavior<\n Props extends TOptions = Partial,\n SProps extends SerializedTextProps = SerializedTextProps,\n EventSpec extends ITextEvents = ITextEvents,\n> extends FabricText {\n declare abstract isEditing: boolean;\n declare abstract cursorDelay: number;\n declare abstract selectionStart: number;\n declare abstract selectionEnd: number;\n declare abstract cursorDuration: number;\n declare abstract editable: boolean;\n declare abstract editingBorderColor: string;\n\n declare abstract compositionStart: number;\n declare abstract compositionEnd: number;\n\n declare abstract hiddenTextarea: HTMLTextAreaElement | null;\n\n /**\n * Helps determining when the text is in composition, so that the cursor\n * rendering is altered.\n */\n declare protected inCompositionMode: boolean;\n\n declare protected _reSpace: RegExp;\n declare private _currentTickState?: ValueAnimation;\n declare private _currentTickCompleteState?: ValueAnimation;\n protected _currentCursorOpacity = 1;\n declare private _textBeforeEdit: string;\n declare protected __selectionStartOnMouseDown: number;\n\n /**\n * Keeps track if the IText object was selected before the actual click.\n * This because we want to delay enter editing by a click.\n */\n declare protected selected: boolean;\n declare protected cursorOffsetCache: { left?: number; top?: number };\n declare protected _savedProps?: {\n hasControls: boolean;\n borderColor: string;\n lockMovementX: boolean;\n lockMovementY: boolean;\n selectable: boolean;\n hoverCursor: CSSStyleDeclaration['cursor'] | null;\n defaultCursor?: CSSStyleDeclaration['cursor'];\n moveCursor?: CSSStyleDeclaration['cursor'];\n };\n declare protected _selectionDirection: 'left' | 'right' | null;\n\n abstract initHiddenTextarea(): void;\n abstract _fireSelectionChanged(): void;\n abstract renderCursorOrSelection(): void;\n abstract getSelectionStartFromPointer(e: TPointerEvent): number;\n abstract _getCursorBoundaries(\n index: number,\n skipCaching?: boolean,\n ): {\n left: number;\n top: number;\n leftOffset: number;\n topOffset: number;\n };\n\n /**\n * Initializes all the interactive behavior of IText\n */\n initBehavior() {\n this._tick = this._tick.bind(this);\n this._onTickComplete = this._onTickComplete.bind(this);\n this.updateSelectionOnMouseMove =\n this.updateSelectionOnMouseMove.bind(this);\n }\n\n onDeselect(options?: { e?: TPointerEvent; object?: FabricObject }) {\n this.isEditing && this.exitEditing();\n this.selected = false;\n return super.onDeselect(options);\n }\n\n /**\n * @private\n */\n _animateCursor({\n toValue,\n duration,\n delay,\n onComplete,\n }: {\n toValue: number;\n duration: number;\n delay?: number;\n onComplete?: TOnAnimationChangeCallback;\n }) {\n return animate({\n startValue: this._currentCursorOpacity,\n endValue: toValue,\n duration,\n delay,\n onComplete,\n abort: () =>\n !this.canvas ||\n // we do not want to animate a selection, only cursor\n this.selectionStart !== this.selectionEnd,\n onChange: (value) => {\n this._currentCursorOpacity = value;\n this.renderCursorOrSelection();\n },\n });\n }\n\n /**\n * changes the cursor from visible to invisible\n */\n private _tick(delay?: number) {\n this._currentTickState = this._animateCursor({\n toValue: 0,\n duration: this.cursorDuration / 2,\n delay: Math.max(delay || 0, 100),\n onComplete: this._onTickComplete,\n });\n }\n\n /**\n * Changes the cursor from invisible to visible\n */\n private _onTickComplete() {\n this._currentTickCompleteState?.abort();\n this._currentTickCompleteState = this._animateCursor({\n toValue: 1,\n duration: this.cursorDuration,\n onComplete: this._tick,\n });\n }\n\n /**\n * Initializes delayed cursor\n */\n initDelayedCursor(restart?: boolean) {\n this.abortCursorAnimation();\n this._tick(restart ? 0 : this.cursorDelay);\n }\n\n /**\n * Aborts cursor animation, clears all timeouts and clear textarea context if necessary\n */\n abortCursorAnimation() {\n let shouldClear = false;\n [this._currentTickState, this._currentTickCompleteState].forEach(\n (cursorAnimation) => {\n if (cursorAnimation && !cursorAnimation.isDone()) {\n shouldClear = true;\n cursorAnimation.abort();\n }\n },\n );\n\n this._currentCursorOpacity = 1;\n\n // make sure we clear context even if instance is not editing\n if (shouldClear) {\n this.clearContextTop();\n }\n }\n\n /**\n * Restart tue cursor animation if either is in complete state ( between animations )\n * or if it never started before\n */\n restartCursorIfNeeded() {\n if (\n [this._currentTickState, this._currentTickCompleteState].some(\n (cursorAnimation) => !cursorAnimation || cursorAnimation.isDone(),\n )\n ) {\n this.initDelayedCursor();\n }\n }\n\n /**\n * Selects entire text\n */\n selectAll() {\n this.selectionStart = 0;\n this.selectionEnd = this._text.length;\n this._fireSelectionChanged();\n this._updateTextarea();\n return this;\n }\n\n /**\n * Selects entire text and updates the visual state\n */\n cmdAll() {\n this.selectAll();\n this.renderCursorOrSelection();\n }\n\n /**\n * Returns selected text\n * @return {String}\n */\n getSelectedText(): string {\n return this._text.slice(this.selectionStart, this.selectionEnd).join('');\n }\n\n /**\n * Find new selection index representing start of current word according to current selection index\n * @param {Number} startFrom Current selection index\n * @return {Number} New selection index\n */\n findWordBoundaryLeft(startFrom: number): number {\n let offset = 0,\n index = startFrom - 1;\n\n // remove space before cursor first\n if (this._reSpace.test(this._text[index])) {\n while (this._reSpace.test(this._text[index])) {\n offset++;\n index--;\n }\n }\n while (/\\S/.test(this._text[index]) && index > -1) {\n offset++;\n index--;\n }\n\n return startFrom - offset;\n }\n\n /**\n * Find new selection index representing end of current word according to current selection index\n * @param {Number} startFrom Current selection index\n * @return {Number} New selection index\n */\n findWordBoundaryRight(startFrom: number): number {\n let offset = 0,\n index = startFrom;\n\n // remove space after cursor first\n if (this._reSpace.test(this._text[index])) {\n while (this._reSpace.test(this._text[index])) {\n offset++;\n index++;\n }\n }\n while (/\\S/.test(this._text[index]) && index < this._text.length) {\n offset++;\n index++;\n }\n\n return startFrom + offset;\n }\n\n /**\n * Find new selection index representing start of current line according to current selection index\n * @param {Number} startFrom Current selection index\n * @return {Number} New selection index\n */\n findLineBoundaryLeft(startFrom: number): number {\n let offset = 0,\n index = startFrom - 1;\n\n while (!/\\n/.test(this._text[index]) && index > -1) {\n offset++;\n index--;\n }\n\n return startFrom - offset;\n }\n\n /**\n * Find new selection index representing end of current line according to current selection index\n * @param {Number} startFrom Current selection index\n * @return {Number} New selection index\n */\n findLineBoundaryRight(startFrom: number): number {\n let offset = 0,\n index = startFrom;\n\n while (!/\\n/.test(this._text[index]) && index < this._text.length) {\n offset++;\n index++;\n }\n\n return startFrom + offset;\n }\n\n /**\n * Finds index corresponding to beginning or end of a word\n * @param {Number} selectionStart Index of a character\n * @param {Number} direction 1 or -1\n * @return {Number} Index of the beginning or end of a word\n */\n searchWordBoundary(selectionStart: number, direction: 1 | -1): number {\n const text = this._text;\n // if we land on a space we move the cursor backwards\n // if we are searching boundary end we move the cursor backwards ONLY if we don't land on a line break\n let index =\n selectionStart > 0 &&\n this._reSpace.test(text[selectionStart]) &&\n (direction === -1 || !reNewline.test(text[selectionStart - 1]))\n ? selectionStart - 1\n : selectionStart,\n _char = text[index];\n while (index > 0 && index < text.length && !reNonWord.test(_char)) {\n index += direction;\n _char = text[index];\n }\n if (direction === -1 && reNonWord.test(_char)) {\n index++;\n }\n return index;\n }\n\n /**\n * Selects the word that contains the char at index selectionStart\n * @param {Number} selectionStart Index of a character\n */\n selectWord(selectionStart?: number) {\n selectionStart = selectionStart ?? this.selectionStart;\n // search backwards\n const newSelectionStart = this.searchWordBoundary(selectionStart, -1),\n // search forward\n newSelectionEnd = Math.max(\n newSelectionStart,\n this.searchWordBoundary(selectionStart, 1),\n );\n\n this.selectionStart = newSelectionStart;\n this.selectionEnd = newSelectionEnd;\n this._fireSelectionChanged();\n this._updateTextarea();\n // remove next major, for now it renders twice :(\n this.renderCursorOrSelection();\n }\n\n /**\n * Selects the line that contains selectionStart\n * @param {Number} selectionStart Index of a character\n */\n selectLine(selectionStart?: number) {\n selectionStart = selectionStart ?? this.selectionStart;\n const newSelectionStart = this.findLineBoundaryLeft(selectionStart),\n newSelectionEnd = this.findLineBoundaryRight(selectionStart);\n\n this.selectionStart = newSelectionStart;\n this.selectionEnd = newSelectionEnd;\n this._fireSelectionChanged();\n this._updateTextarea();\n }\n\n /**\n * Enters editing state\n */\n enterEditing(e?: TPointerEvent) {\n if (this.isEditing || !this.editable) {\n return;\n }\n this.enterEditingImpl();\n this.fire('editing:entered', e ? { e } : undefined);\n this._fireSelectionChanged();\n if (this.canvas) {\n this.canvas.fire('text:editing:entered', {\n target: this as unknown as IText,\n e,\n });\n this.canvas.requestRenderAll();\n }\n }\n\n /**\n * runs the actual logic that enter from editing state, see {@link enterEditing}\n */\n enterEditingImpl() {\n if (this.canvas) {\n this.canvas.calcOffset();\n this.canvas.textEditingManager.exitTextEditing();\n }\n\n this.isEditing = true;\n\n this.initHiddenTextarea();\n this.hiddenTextarea!.focus();\n this.hiddenTextarea!.value = this.text;\n this._updateTextarea();\n this._saveEditingProps();\n this._setEditingProps();\n this._textBeforeEdit = this.text;\n\n this._tick();\n }\n\n /**\n * called by {@link Canvas#textEditingManager}\n */\n updateSelectionOnMouseMove(e: TPointerEvent) {\n if (this.getActiveControl()) {\n return;\n }\n\n const el = this.hiddenTextarea!;\n // regain focus\n getDocumentFromElement(el).activeElement !== el && el.focus();\n\n const newSelectionStart = this.getSelectionStartFromPointer(e),\n currentStart = this.selectionStart,\n currentEnd = this.selectionEnd;\n if (\n (newSelectionStart !== this.__selectionStartOnMouseDown ||\n currentStart === currentEnd) &&\n (currentStart === newSelectionStart || currentEnd === newSelectionStart)\n ) {\n return;\n }\n if (newSelectionStart > this.__selectionStartOnMouseDown) {\n this.selectionStart = this.__selectionStartOnMouseDown;\n this.selectionEnd = newSelectionStart;\n } else {\n this.selectionStart = newSelectionStart;\n this.selectionEnd = this.__selectionStartOnMouseDown;\n }\n if (\n this.selectionStart !== currentStart ||\n this.selectionEnd !== currentEnd\n ) {\n this._fireSelectionChanged();\n this._updateTextarea();\n this.renderCursorOrSelection();\n }\n }\n\n /**\n * @private\n */\n _setEditingProps() {\n this.hoverCursor = 'text';\n\n if (this.canvas) {\n this.canvas.defaultCursor = this.canvas.moveCursor = 'text';\n }\n\n this.borderColor = this.editingBorderColor;\n this.hasControls = this.selectable = false;\n this.lockMovementX = this.lockMovementY = true;\n }\n\n /**\n * convert from textarea to grapheme indexes\n */\n fromStringToGraphemeSelection(start: number, end: number, text: string) {\n const smallerTextStart = text.slice(0, start),\n graphemeStart = this.graphemeSplit(smallerTextStart).length;\n if (start === end) {\n return { selectionStart: graphemeStart, selectionEnd: graphemeStart };\n }\n const smallerTextEnd = text.slice(start, end),\n graphemeEnd = this.graphemeSplit(smallerTextEnd).length;\n return {\n selectionStart: graphemeStart,\n selectionEnd: graphemeStart + graphemeEnd,\n };\n }\n\n /**\n * convert from fabric to textarea values\n */\n fromGraphemeToStringSelection(\n start: number,\n end: number,\n graphemes: string[],\n ) {\n const smallerTextStart = graphemes.slice(0, start),\n graphemeStart = smallerTextStart.join('').length;\n if (start === end) {\n return { selectionStart: graphemeStart, selectionEnd: graphemeStart };\n }\n const smallerTextEnd = graphemes.slice(start, end),\n graphemeEnd = smallerTextEnd.join('').length;\n return {\n selectionStart: graphemeStart,\n selectionEnd: graphemeStart + graphemeEnd,\n };\n }\n\n /**\n * @private\n */\n _updateTextarea() {\n this.cursorOffsetCache = {};\n if (!this.hiddenTextarea) {\n return;\n }\n if (!this.inCompositionMode) {\n const newSelection = this.fromGraphemeToStringSelection(\n this.selectionStart,\n this.selectionEnd,\n this._text,\n );\n this.hiddenTextarea.selectionStart = newSelection.selectionStart;\n this.hiddenTextarea.selectionEnd = newSelection.selectionEnd;\n }\n this.updateTextareaPosition();\n }\n\n /**\n * @private\n */\n updateFromTextArea() {\n if (!this.hiddenTextarea) {\n return;\n }\n this.cursorOffsetCache = {};\n const textarea = this.hiddenTextarea;\n this.text = textarea.value;\n this.set('dirty', true);\n this.initDimensions();\n this.setCoords();\n const newSelection = this.fromStringToGraphemeSelection(\n textarea.selectionStart,\n textarea.selectionEnd,\n textarea.value,\n );\n this.selectionEnd = this.selectionStart = newSelection.selectionEnd;\n if (!this.inCompositionMode) {\n this.selectionStart = newSelection.selectionStart;\n }\n this.updateTextareaPosition();\n }\n\n /**\n * @private\n */\n updateTextareaPosition() {\n if (this.selectionStart === this.selectionEnd) {\n const style = this._calcTextareaPosition();\n this.hiddenTextarea!.style.left = style.left;\n this.hiddenTextarea!.style.top = style.top;\n }\n }\n\n /**\n * @private\n * @return {Object} style contains style for hiddenTextarea\n */\n _calcTextareaPosition() {\n if (!this.canvas) {\n return { left: '1px', top: '1px' };\n }\n const desiredPosition = this.inCompositionMode\n ? this.compositionStart\n : this.selectionStart,\n boundaries = this._getCursorBoundaries(desiredPosition),\n cursorLocation = this.get2DCursorLocation(desiredPosition),\n lineIndex = cursorLocation.lineIndex,\n charIndex = cursorLocation.charIndex,\n charHeight =\n this.getValueOfPropertyAt(lineIndex, charIndex, 'fontSize') *\n this.lineHeight,\n leftOffset = boundaries.leftOffset,\n retinaScaling = this.getCanvasRetinaScaling(),\n upperCanvas = this.canvas.upperCanvasEl,\n upperCanvasWidth = upperCanvas.width / retinaScaling,\n upperCanvasHeight = upperCanvas.height / retinaScaling,\n maxWidth = upperCanvasWidth - charHeight,\n maxHeight = upperCanvasHeight - charHeight;\n\n const p = new Point(\n boundaries.left + leftOffset,\n boundaries.top + boundaries.topOffset + charHeight,\n )\n .transform(this.calcTransformMatrix())\n .transform(this.canvas.viewportTransform)\n .multiply(\n new Point(\n upperCanvas.clientWidth / upperCanvasWidth,\n upperCanvas.clientHeight / upperCanvasHeight,\n ),\n );\n\n if (p.x < 0) {\n p.x = 0;\n }\n if (p.x > maxWidth) {\n p.x = maxWidth;\n }\n if (p.y < 0) {\n p.y = 0;\n }\n if (p.y > maxHeight) {\n p.y = maxHeight;\n }\n\n // add canvas offset on document\n p.x += this.canvas._offset.left;\n p.y += this.canvas._offset.top;\n\n return {\n left: `${p.x}px`,\n top: `${p.y}px`,\n fontSize: `${charHeight}px`,\n charHeight: charHeight,\n };\n }\n\n /**\n * @private\n */\n _saveEditingProps() {\n this._savedProps = {\n hasControls: this.hasControls,\n borderColor: this.borderColor,\n lockMovementX: this.lockMovementX,\n lockMovementY: this.lockMovementY,\n hoverCursor: this.hoverCursor,\n selectable: this.selectable,\n defaultCursor: this.canvas && this.canvas.defaultCursor,\n moveCursor: this.canvas && this.canvas.moveCursor,\n };\n }\n\n /**\n * @private\n */\n _restoreEditingProps() {\n if (!this._savedProps) {\n return;\n }\n\n this.hoverCursor = this._savedProps.hoverCursor;\n this.hasControls = this._savedProps.hasControls;\n this.borderColor = this._savedProps.borderColor;\n this.selectable = this._savedProps.selectable;\n this.lockMovementX = this._savedProps.lockMovementX;\n this.lockMovementY = this._savedProps.lockMovementY;\n\n if (this.canvas) {\n this.canvas.defaultCursor =\n this._savedProps.defaultCursor || this.canvas.defaultCursor;\n this.canvas.moveCursor =\n this._savedProps.moveCursor || this.canvas.moveCursor;\n }\n\n delete this._savedProps;\n }\n\n /**\n * runs the actual logic that exits from editing state, see {@link exitEditing}\n * But it does not fire events\n */\n exitEditingImpl() {\n const hiddenTextarea = this.hiddenTextarea;\n this.selected = false;\n this.isEditing = false;\n\n if (hiddenTextarea) {\n hiddenTextarea.blur && hiddenTextarea.blur();\n hiddenTextarea.parentNode &&\n hiddenTextarea.parentNode.removeChild(hiddenTextarea);\n }\n this.hiddenTextarea = null;\n this.abortCursorAnimation();\n this.selectionStart !== this.selectionEnd && this.clearContextTop();\n this.selectionEnd = this.selectionStart;\n this._restoreEditingProps();\n if (this._forceClearCache) {\n this.initDimensions();\n this.setCoords();\n }\n }\n\n /**\n * Exits from editing state and fires relevant events\n */\n exitEditing() {\n const isTextChanged = this._textBeforeEdit !== this.text;\n this.exitEditingImpl();\n\n this.fire('editing:exited');\n isTextChanged && this.fire(MODIFIED);\n if (this.canvas) {\n this.canvas.fire('text:editing:exited', {\n target: this as unknown as IText,\n });\n // todo: evaluate add an action to this event\n isTextChanged && this.canvas.fire('object:modified', { target: this });\n }\n return this;\n }\n\n /**\n * @private\n */\n _removeExtraneousStyles() {\n for (const prop in this.styles) {\n if (!this._textLines[prop as unknown as number]) {\n delete this.styles[prop];\n }\n }\n }\n\n /**\n * remove and reflow a style block from start to end.\n * @param {Number} start linear start position for removal (included in removal)\n * @param {Number} end linear end position for removal ( excluded from removal )\n */\n removeStyleFromTo(start: number, end: number) {\n const { lineIndex: lineStart, charIndex: charStart } =\n this.get2DCursorLocation(start, true),\n { lineIndex: lineEnd, charIndex: charEnd } = this.get2DCursorLocation(\n end,\n true,\n );\n if (lineStart !== lineEnd) {\n // step1 remove the trailing of lineStart\n if (this.styles[lineStart]) {\n for (\n let i = charStart;\n i < this._unwrappedTextLines[lineStart].length;\n i++\n ) {\n delete this.styles[lineStart][i];\n }\n }\n // step2 move the trailing of lineEnd to lineStart if needed\n if (this.styles[lineEnd]) {\n for (\n let i = charEnd;\n i < this._unwrappedTextLines[lineEnd].length;\n i++\n ) {\n const styleObj = this.styles[lineEnd][i];\n if (styleObj) {\n this.styles[lineStart] || (this.styles[lineStart] = {});\n this.styles[lineStart][charStart + i - charEnd] = styleObj;\n }\n }\n }\n // step3 detects lines will be completely removed.\n for (let i = lineStart + 1; i <= lineEnd; i++) {\n delete this.styles[i];\n }\n // step4 shift remaining lines.\n this.shiftLineStyles(lineEnd, lineStart - lineEnd);\n } else {\n // remove and shift left on the same line\n if (this.styles[lineStart]) {\n const styleObj = this.styles[lineStart];\n const diff = charEnd - charStart;\n for (let i = charStart; i < charEnd; i++) {\n delete styleObj[i];\n }\n for (const char in this.styles[lineStart]) {\n const numericChar = parseInt(char, 10);\n if (numericChar >= charEnd) {\n styleObj[numericChar - diff] = styleObj[char];\n delete styleObj[char];\n }\n }\n }\n }\n }\n\n /**\n * Shifts line styles up or down\n * @param {Number} lineIndex Index of a line\n * @param {Number} offset Can any number?\n */\n shiftLineStyles(lineIndex: number, offset: number) {\n const clonedStyles = Object.assign({}, this.styles);\n for (const line in this.styles) {\n const numericLine = parseInt(line, 10);\n if (numericLine > lineIndex) {\n this.styles[numericLine + offset] = clonedStyles[numericLine];\n if (!clonedStyles[numericLine - offset]) {\n delete this.styles[numericLine];\n }\n }\n }\n }\n\n /**\n * Handle insertion of more consecutive style lines for when one or more\n * newlines gets added to the text. Since current style needs to be shifted\n * first we shift the current style of the number lines needed, then we add\n * new lines from the last to the first.\n * @param {Number} lineIndex Index of a line\n * @param {Number} charIndex Index of a char\n * @param {Number} qty number of lines to add\n * @param {Array} copiedStyle Array of objects styles\n */\n insertNewlineStyleObject(\n lineIndex: number,\n charIndex: number,\n qty: number,\n copiedStyle?: { [index: number]: TextStyleDeclaration },\n ) {\n const newLineStyles: { [index: number]: TextStyleDeclaration } = {};\n const originalLineLength = this._unwrappedTextLines[lineIndex].length;\n const isEndOfLine = originalLineLength === charIndex;\n\n let someStyleIsCarryingOver = false;\n qty || (qty = 1);\n this.shiftLineStyles(lineIndex, qty);\n const currentCharStyle = this.styles[lineIndex]\n ? this.styles[lineIndex][charIndex === 0 ? charIndex : charIndex - 1]\n : undefined;\n\n // we clone styles of all chars\n // after cursor onto the current line\n for (const index in this.styles[lineIndex]) {\n const numIndex = parseInt(index, 10);\n if (numIndex >= charIndex) {\n someStyleIsCarryingOver = true;\n newLineStyles[numIndex - charIndex] = this.styles[lineIndex][index];\n // remove lines from the previous line since they're on a new line now\n if (!(isEndOfLine && charIndex === 0)) {\n delete this.styles[lineIndex][index];\n }\n }\n }\n let styleCarriedOver = false;\n if (someStyleIsCarryingOver && !isEndOfLine) {\n // if is end of line, the extra style we copied\n // is probably not something we want\n this.styles[lineIndex + qty] = newLineStyles;\n styleCarriedOver = true;\n }\n if (styleCarriedOver || originalLineLength > charIndex) {\n // skip the last line of since we already prepared it.\n // or contains text without style that we don't want to style\n // just because it changed lines\n qty--;\n }\n // for the all the lines or all the other lines\n // we clone current char style onto the next (otherwise empty) line\n while (qty > 0) {\n if (copiedStyle && copiedStyle[qty - 1]) {\n this.styles[lineIndex + qty] = {\n 0: { ...copiedStyle[qty - 1] },\n };\n } else if (currentCharStyle) {\n this.styles[lineIndex + qty] = {\n 0: { ...currentCharStyle },\n };\n } else {\n delete this.styles[lineIndex + qty];\n }\n qty--;\n }\n this._forceClearCache = true;\n }\n\n /**\n * Inserts style object for a given line/char index\n * @param {Number} lineIndex Index of a line\n * @param {Number} charIndex Index of a char\n * @param {Number} quantity number Style object to insert, if given\n * @param {Array} copiedStyle array of style objects\n */\n insertCharStyleObject(\n lineIndex: number,\n charIndex: number,\n quantity: number,\n copiedStyle?: TextStyleDeclaration[],\n ) {\n if (!this.styles) {\n this.styles = {};\n }\n const currentLineStyles = this.styles[lineIndex],\n currentLineStylesCloned = currentLineStyles\n ? { ...currentLineStyles }\n : {};\n\n quantity || (quantity = 1);\n // shift all char styles by quantity forward\n // 0,1,2,3 -> (charIndex=2) -> 0,1,3,4 -> (insert 2) -> 0,1,2,3,4\n for (const index in currentLineStylesCloned) {\n const numericIndex = parseInt(index, 10);\n if (numericIndex >= charIndex) {\n currentLineStyles[numericIndex + quantity] =\n currentLineStylesCloned[numericIndex];\n // only delete the style if there was nothing moved there\n if (!currentLineStylesCloned[numericIndex - quantity]) {\n delete currentLineStyles[numericIndex];\n }\n }\n }\n this._forceClearCache = true;\n if (copiedStyle) {\n while (quantity--) {\n if (!Object.keys(copiedStyle[quantity]).length) {\n continue;\n }\n if (!this.styles[lineIndex]) {\n this.styles[lineIndex] = {};\n }\n this.styles[lineIndex][charIndex + quantity] = {\n ...copiedStyle[quantity],\n };\n }\n return;\n }\n if (!currentLineStyles) {\n return;\n }\n const newStyle = currentLineStyles[charIndex ? charIndex - 1 : 1];\n while (newStyle && quantity--) {\n this.styles[lineIndex][charIndex + quantity] = { ...newStyle };\n }\n }\n\n /**\n * Inserts style object(s)\n * @param {Array} insertedText Characters at the location where style is inserted\n * @param {Number} start cursor index for inserting style\n * @param {Array} [copiedStyle] array of style objects to insert.\n */\n insertNewStyleBlock(\n insertedText: string[],\n start: number,\n copiedStyle?: TextStyleDeclaration[],\n ) {\n const cursorLoc = this.get2DCursorLocation(start, true),\n addedLines = [0];\n let linesLength = 0;\n // get an array of how many char per lines are being added.\n for (let i = 0; i < insertedText.length; i++) {\n if (insertedText[i] === '\\n') {\n linesLength++;\n addedLines[linesLength] = 0;\n } else {\n addedLines[linesLength]++;\n }\n }\n // for the first line copy the style from the current char position.\n if (addedLines[0] > 0) {\n this.insertCharStyleObject(\n cursorLoc.lineIndex,\n cursorLoc.charIndex,\n addedLines[0],\n copiedStyle,\n );\n copiedStyle = copiedStyle && copiedStyle.slice(addedLines[0] + 1);\n }\n linesLength &&\n this.insertNewlineStyleObject(\n cursorLoc.lineIndex,\n cursorLoc.charIndex + addedLines[0],\n linesLength,\n );\n let i;\n for (i = 1; i < linesLength; i++) {\n if (addedLines[i] > 0) {\n this.insertCharStyleObject(\n cursorLoc.lineIndex + i,\n 0,\n addedLines[i],\n copiedStyle,\n );\n } else if (copiedStyle) {\n // this test is required in order to close #6841\n // when a pasted buffer begins with a newline then\n // this.styles[cursorLoc.lineIndex + i] and copiedStyle[0]\n // may be undefined for some reason\n if (this.styles[cursorLoc.lineIndex + i] && copiedStyle[0]) {\n this.styles[cursorLoc.lineIndex + i][0] = copiedStyle[0];\n }\n }\n copiedStyle = copiedStyle && copiedStyle.slice(addedLines[i] + 1);\n }\n if (addedLines[i] > 0) {\n this.insertCharStyleObject(\n cursorLoc.lineIndex + i,\n 0,\n addedLines[i],\n copiedStyle,\n );\n }\n }\n\n /**\n * Removes characters from start/end\n * start/end ar per grapheme position in _text array.\n *\n * @param {Number} start\n * @param {Number} end default to start + 1\n */\n removeChars(start: number, end: number = start + 1) {\n this.removeStyleFromTo(start, end);\n this._text.splice(start, end - start);\n this.text = this._text.join('');\n this.set('dirty', true);\n this.initDimensions();\n this.setCoords();\n this._removeExtraneousStyles();\n }\n\n /**\n * insert characters at start position, before start position.\n * start equal 1 it means the text get inserted between actual grapheme 0 and 1\n * if style array is provided, it must be as the same length of text in graphemes\n * if end is provided and is bigger than start, old text is replaced.\n * start/end ar per grapheme position in _text array.\n *\n * @param {String} text text to insert\n * @param {Array} style array of style objects\n * @param {Number} start\n * @param {Number} end default to start + 1\n */\n insertChars(\n text: string,\n style: TextStyleDeclaration[] | undefined,\n start: number,\n end: number = start,\n ) {\n if (end > start) {\n this.removeStyleFromTo(start, end);\n }\n const graphemes = this.graphemeSplit(text);\n this.insertNewStyleBlock(graphemes, start, style);\n this._text = [\n ...this._text.slice(0, start),\n ...graphemes,\n ...this._text.slice(end),\n ];\n this.text = this._text.join('');\n this.set('dirty', true);\n this.initDimensions();\n this.setCoords();\n this._removeExtraneousStyles();\n }\n\n /**\n * Set the selectionStart and selectionEnd according to the new position of cursor\n * mimic the key - mouse navigation when shift is pressed.\n */\n setSelectionStartEndWithShift(\n start: number,\n end: number,\n newSelection: number,\n ) {\n if (newSelection <= start) {\n if (end === start) {\n this._selectionDirection = LEFT;\n } else if (this._selectionDirection === RIGHT) {\n this._selectionDirection = LEFT;\n this.selectionEnd = start;\n }\n this.selectionStart = newSelection;\n } else if (newSelection > start && newSelection < end) {\n if (this._selectionDirection === RIGHT) {\n this.selectionEnd = newSelection;\n } else {\n this.selectionStart = newSelection;\n }\n } else {\n // newSelection is > selection start and end\n if (end === start) {\n this._selectionDirection = RIGHT;\n } else if (this._selectionDirection === LEFT) {\n this._selectionDirection = RIGHT;\n this.selectionStart = end;\n }\n this.selectionEnd = newSelection;\n }\n }\n}\n","import { config } from '../../config';\nimport { getFabricDocument, getEnv } from '../../env';\nimport { capValue } from '../../util/misc/capValue';\nimport type { ITextEvents } from './ITextBehavior';\nimport { ITextBehavior } from './ITextBehavior';\nimport type { TKeyMapIText } from './constants';\nimport type { TOptions } from '../../typedefs';\nimport type { TextProps, SerializedTextProps } from '../Text/Text';\nimport { getDocumentFromElement } from '../../util/dom_misc';\nimport { CHANGED, LEFT, RIGHT } from '../../constants';\nimport type { IText } from './IText';\nimport type { TextStyleDeclaration } from '../Text/StyledText';\n\nexport abstract class ITextKeyBehavior<\n Props extends TOptions = Partial,\n SProps extends SerializedTextProps = SerializedTextProps,\n EventSpec extends ITextEvents = ITextEvents,\n> extends ITextBehavior {\n /**\n * For functionalities on keyDown\n * Map a special key to a function of the instance/prototype\n * If you need different behavior for ESC or TAB or arrows, you have to change\n * this map setting the name of a function that you build on the IText or\n * your prototype.\n * the map change will affect all Instances unless you need for only some text Instances\n * in that case you have to clone this object and assign your Instance.\n * this.keysMap = Object.assign({}, this.keysMap);\n * The function must be in IText.prototype.myFunction And will receive event as args[0]\n */\n declare keysMap: TKeyMapIText;\n\n declare keysMapRtl: TKeyMapIText;\n\n /**\n * For functionalities on keyUp + ctrl || cmd\n */\n declare ctrlKeysMapUp: TKeyMapIText;\n\n /**\n * For functionalities on keyDown + ctrl || cmd\n */\n declare ctrlKeysMapDown: TKeyMapIText;\n\n declare hiddenTextarea: HTMLTextAreaElement | null;\n\n /**\n * DOM container to append the hiddenTextarea.\n * An alternative to attaching to the document.body.\n * Useful to reduce laggish redraw of the full document.body tree and\n * also with modals event capturing that won't let the textarea take focus.\n * @type HTMLElement\n */\n declare hiddenTextareaContainer?: HTMLElement | null;\n\n declare private _clickHandlerInitialized: boolean;\n declare private _copyDone: boolean;\n declare private fromPaste: boolean;\n\n /**\n * Initializes hidden textarea (needed to bring up keyboard in iOS)\n */\n initHiddenTextarea() {\n const doc =\n (this.canvas && getDocumentFromElement(this.canvas.getElement())) ||\n getFabricDocument();\n const textarea = doc.createElement('textarea');\n Object.entries({\n autocapitalize: 'off',\n autocorrect: 'off',\n autocomplete: 'off',\n spellcheck: 'false',\n 'data-fabric': 'textarea',\n wrap: 'off',\n name: 'fabricTextarea',\n }).map(([attribute, value]) => textarea.setAttribute(attribute, value));\n const { top, left, fontSize } = this._calcTextareaPosition();\n // line-height: 1px; was removed from the style to fix this:\n // https://bugs.chromium.org/p/chromium/issues/detail?id=870966\n textarea.style.cssText = `position: absolute; top: ${top}; left: ${left}; z-index: -999; opacity: 0; width: 1px; height: 1px; font-size: 1px; padding-top: ${fontSize};`;\n\n (this.hiddenTextareaContainer || doc.body).appendChild(textarea);\n\n Object.entries({\n blur: 'blur',\n keydown: 'onKeyDown',\n keyup: 'onKeyUp',\n input: 'onInput',\n copy: 'copy',\n cut: 'copy',\n paste: 'paste',\n compositionstart: 'onCompositionStart',\n compositionupdate: 'onCompositionUpdate',\n compositionend: 'onCompositionEnd',\n } as Record).map(([eventName, handler]) =>\n textarea.addEventListener(\n eventName,\n (this[handler] as EventListener).bind(this),\n ),\n );\n this.hiddenTextarea = textarea;\n }\n\n /**\n * Override this method to customize cursor behavior on textbox blur\n */\n blur() {\n this.abortCursorAnimation();\n }\n\n /**\n * Handles keydown event\n * only used for arrows and combination of modifier keys.\n * @param {KeyboardEvent} e Event object\n */\n onKeyDown(e: KeyboardEvent) {\n if (!this.isEditing) {\n return;\n }\n const keyMap = this.direction === 'rtl' ? this.keysMapRtl : this.keysMap;\n if (e.keyCode in keyMap) {\n (this[keyMap[e.keyCode] as keyof this] as (arg: KeyboardEvent) => void)(\n e,\n );\n } else if (e.keyCode in this.ctrlKeysMapDown && (e.ctrlKey || e.metaKey)) {\n (\n this[this.ctrlKeysMapDown[e.keyCode] as keyof this] as (\n arg: KeyboardEvent,\n ) => void\n )(e);\n } else {\n return;\n }\n e.stopImmediatePropagation();\n e.preventDefault();\n if (e.keyCode >= 33 && e.keyCode <= 40) {\n // if i press an arrow key just update selection\n this.inCompositionMode = false;\n this.clearContextTop();\n this.renderCursorOrSelection();\n } else {\n this.canvas && this.canvas.requestRenderAll();\n }\n }\n\n /**\n * Handles keyup event\n * We handle KeyUp because ie11 and edge have difficulties copy/pasting\n * if a copy/cut event fired, keyup is dismissed\n * @param {KeyboardEvent} e Event object\n */\n onKeyUp(e: KeyboardEvent) {\n if (!this.isEditing || this._copyDone || this.inCompositionMode) {\n this._copyDone = false;\n return;\n }\n if (e.keyCode in this.ctrlKeysMapUp && (e.ctrlKey || e.metaKey)) {\n (\n this[this.ctrlKeysMapUp[e.keyCode] as keyof this] as (\n arg: KeyboardEvent,\n ) => void\n )(e);\n } else {\n return;\n }\n e.stopImmediatePropagation();\n e.preventDefault();\n this.canvas && this.canvas.requestRenderAll();\n }\n\n /**\n * Handles onInput event\n * @param {Event} e Event object\n */\n onInput(this: this & { hiddenTextarea: HTMLTextAreaElement }, e: Event) {\n const fromPaste = this.fromPaste;\n const { value, selectionStart, selectionEnd } = this.hiddenTextarea;\n this.fromPaste = false;\n e && e.stopPropagation();\n if (!this.isEditing) {\n return;\n }\n const updateAndFire = () => {\n this.updateFromTextArea();\n this.fire(CHANGED);\n if (this.canvas) {\n this.canvas.fire('text:changed', { target: this as unknown as IText });\n this.canvas.requestRenderAll();\n }\n };\n if (this.hiddenTextarea.value === '') {\n this.styles = {};\n updateAndFire();\n return;\n }\n // decisions about style changes.\n const nextText = this._splitTextIntoLines(value).graphemeText,\n charCount = this._text.length,\n nextCharCount = nextText.length,\n _selectionStart = this.selectionStart,\n _selectionEnd = this.selectionEnd,\n selection = _selectionStart !== _selectionEnd;\n let copiedStyle: TextStyleDeclaration[] | undefined,\n removedText,\n charDiff = nextCharCount - charCount,\n removeFrom,\n removeTo;\n\n const textareaSelection = this.fromStringToGraphemeSelection(\n selectionStart,\n selectionEnd,\n value,\n );\n const backDelete = _selectionStart > textareaSelection.selectionStart;\n\n if (selection) {\n removedText = this._text.slice(_selectionStart, _selectionEnd);\n charDiff += _selectionEnd - _selectionStart;\n } else if (nextCharCount < charCount) {\n if (backDelete) {\n removedText = this._text.slice(_selectionEnd + charDiff, _selectionEnd);\n } else {\n removedText = this._text.slice(\n _selectionStart,\n _selectionStart - charDiff,\n );\n }\n }\n const insertedText = nextText.slice(\n textareaSelection.selectionEnd - charDiff,\n textareaSelection.selectionEnd,\n );\n if (removedText && removedText.length) {\n if (insertedText.length) {\n // let's copy some style before deleting.\n // we want to copy the style before the cursor OR the style at the cursor if selection\n // is bigger than 0.\n copiedStyle = this.getSelectionStyles(\n _selectionStart,\n _selectionStart + 1,\n false,\n );\n // now duplicate the style one for each inserted text.\n copiedStyle = insertedText.map(\n () =>\n // this return an array of references, but that is fine since we are\n // copying the style later.\n copiedStyle![0],\n );\n }\n if (selection) {\n removeFrom = _selectionStart;\n removeTo = _selectionEnd;\n } else if (backDelete) {\n // detect differences between forwardDelete and backDelete\n removeFrom = _selectionEnd - removedText.length;\n removeTo = _selectionEnd;\n } else {\n removeFrom = _selectionEnd;\n removeTo = _selectionEnd + removedText.length;\n }\n this.removeStyleFromTo(removeFrom, removeTo);\n }\n if (insertedText.length) {\n const { copyPasteData } = getEnv();\n if (\n fromPaste &&\n insertedText.join('') === copyPasteData.copiedText &&\n !config.disableStyleCopyPaste\n ) {\n copiedStyle = copyPasteData.copiedTextStyle;\n }\n this.insertNewStyleBlock(insertedText, _selectionStart, copiedStyle);\n }\n updateAndFire();\n }\n\n /**\n * Composition start\n */\n onCompositionStart() {\n this.inCompositionMode = true;\n }\n\n /**\n * Composition end\n */\n onCompositionEnd() {\n this.inCompositionMode = false;\n }\n\n onCompositionUpdate({ target }: CompositionEvent) {\n const { selectionStart, selectionEnd } = target as HTMLTextAreaElement;\n this.compositionStart = selectionStart;\n this.compositionEnd = selectionEnd;\n this.updateTextareaPosition();\n }\n\n /**\n * Copies selected text\n */\n copy() {\n if (this.selectionStart === this.selectionEnd) {\n //do not cut-copy if no selection\n return;\n }\n const { copyPasteData } = getEnv();\n copyPasteData.copiedText = this.getSelectedText();\n if (!config.disableStyleCopyPaste) {\n copyPasteData.copiedTextStyle = this.getSelectionStyles(\n this.selectionStart,\n this.selectionEnd,\n true,\n );\n } else {\n copyPasteData.copiedTextStyle = undefined;\n }\n this._copyDone = true;\n }\n\n /**\n * Pastes text\n */\n paste() {\n this.fromPaste = true;\n }\n\n /**\n * Finds the width in pixels before the cursor on the same line\n * @private\n * @param {Number} lineIndex\n * @param {Number} charIndex\n * @return {Number} widthBeforeCursor width before cursor\n */\n _getWidthBeforeCursor(lineIndex: number, charIndex: number): number {\n let widthBeforeCursor = this._getLineLeftOffset(lineIndex),\n bound;\n\n if (charIndex > 0) {\n bound = this.__charBounds[lineIndex][charIndex - 1];\n widthBeforeCursor += bound.left + bound.width;\n }\n return widthBeforeCursor;\n }\n\n /**\n * Gets start offset of a selection\n * @param {KeyboardEvent} e Event object\n * @param {Boolean} isRight\n * @return {Number}\n */\n getDownCursorOffset(e: KeyboardEvent, isRight: boolean): number {\n const selectionProp = this._getSelectionForOffset(e, isRight),\n cursorLocation = this.get2DCursorLocation(selectionProp),\n lineIndex = cursorLocation.lineIndex;\n // if on last line, down cursor goes to end of line\n if (\n lineIndex === this._textLines.length - 1 ||\n e.metaKey ||\n e.keyCode === 34\n ) {\n // move to the end of a text\n return this._text.length - selectionProp;\n }\n const charIndex = cursorLocation.charIndex,\n widthBeforeCursor = this._getWidthBeforeCursor(lineIndex, charIndex),\n indexOnOtherLine = this._getIndexOnLine(lineIndex + 1, widthBeforeCursor),\n textAfterCursor = this._textLines[lineIndex].slice(charIndex);\n return (\n textAfterCursor.length +\n indexOnOtherLine +\n 1 +\n this.missingNewlineOffset(lineIndex)\n );\n }\n\n /**\n * private\n * Helps finding if the offset should be counted from Start or End\n * @param {KeyboardEvent} e Event object\n * @param {Boolean} isRight\n * @return {Number}\n */\n _getSelectionForOffset(e: KeyboardEvent, isRight: boolean): number {\n if (e.shiftKey && this.selectionStart !== this.selectionEnd && isRight) {\n return this.selectionEnd;\n } else {\n return this.selectionStart;\n }\n }\n\n /**\n * @param {KeyboardEvent} e Event object\n * @param {Boolean} isRight\n * @return {Number}\n */\n getUpCursorOffset(e: KeyboardEvent, isRight: boolean): number {\n const selectionProp = this._getSelectionForOffset(e, isRight),\n cursorLocation = this.get2DCursorLocation(selectionProp),\n lineIndex = cursorLocation.lineIndex;\n if (lineIndex === 0 || e.metaKey || e.keyCode === 33) {\n // if on first line, up cursor goes to start of line\n return -selectionProp;\n }\n const charIndex = cursorLocation.charIndex,\n widthBeforeCursor = this._getWidthBeforeCursor(lineIndex, charIndex),\n indexOnOtherLine = this._getIndexOnLine(lineIndex - 1, widthBeforeCursor),\n textBeforeCursor = this._textLines[lineIndex].slice(0, charIndex),\n missingNewlineOffset = this.missingNewlineOffset(lineIndex - 1);\n // return a negative offset\n return (\n -this._textLines[lineIndex - 1].length +\n indexOnOtherLine -\n textBeforeCursor.length +\n (1 - missingNewlineOffset)\n );\n }\n\n /**\n * for a given width it founds the matching character.\n * @private\n */\n _getIndexOnLine(lineIndex: number, width: number) {\n const line = this._textLines[lineIndex],\n lineLeftOffset = this._getLineLeftOffset(lineIndex);\n let widthOfCharsOnLine = lineLeftOffset,\n indexOnLine = 0,\n charWidth,\n foundMatch;\n\n for (let j = 0, jlen = line.length; j < jlen; j++) {\n charWidth = this.__charBounds[lineIndex][j].width;\n widthOfCharsOnLine += charWidth;\n if (widthOfCharsOnLine > width) {\n foundMatch = true;\n const leftEdge = widthOfCharsOnLine - charWidth,\n rightEdge = widthOfCharsOnLine,\n offsetFromLeftEdge = Math.abs(leftEdge - width),\n offsetFromRightEdge = Math.abs(rightEdge - width);\n\n indexOnLine = offsetFromRightEdge < offsetFromLeftEdge ? j : j - 1;\n break;\n }\n }\n\n // reached end\n if (!foundMatch) {\n indexOnLine = line.length - 1;\n }\n\n return indexOnLine;\n }\n\n /**\n * Moves cursor down\n * @param {KeyboardEvent} e Event object\n */\n moveCursorDown(e: KeyboardEvent) {\n if (\n this.selectionStart >= this._text.length &&\n this.selectionEnd >= this._text.length\n ) {\n return;\n }\n this._moveCursorUpOrDown('Down', e);\n }\n\n /**\n * Moves cursor up\n * @param {KeyboardEvent} e Event object\n */\n moveCursorUp(e: KeyboardEvent) {\n if (this.selectionStart === 0 && this.selectionEnd === 0) {\n return;\n }\n this._moveCursorUpOrDown('Up', e);\n }\n\n /**\n * Moves cursor up or down, fires the events\n * @param {String} direction 'Up' or 'Down'\n * @param {KeyboardEvent} e Event object\n */\n _moveCursorUpOrDown(direction: 'Up' | 'Down', e: KeyboardEvent) {\n const offset = this[`get${direction}CursorOffset`](\n e,\n this._selectionDirection === RIGHT,\n );\n if (e.shiftKey) {\n this.moveCursorWithShift(offset);\n } else {\n this.moveCursorWithoutShift(offset);\n }\n if (offset !== 0) {\n const max = this.text.length;\n this.selectionStart = capValue(0, this.selectionStart, max);\n this.selectionEnd = capValue(0, this.selectionEnd, max);\n // TODO fix: abort and init should be an alternative depending\n // on selectionStart/End being equal or different\n this.abortCursorAnimation();\n this.initDelayedCursor();\n this._fireSelectionChanged();\n this._updateTextarea();\n }\n }\n\n /**\n * Moves cursor with shift\n * @param {Number} offset\n */\n moveCursorWithShift(offset: number) {\n const newSelection =\n this._selectionDirection === LEFT\n ? this.selectionStart + offset\n : this.selectionEnd + offset;\n this.setSelectionStartEndWithShift(\n this.selectionStart,\n this.selectionEnd,\n newSelection,\n );\n return offset !== 0;\n }\n\n /**\n * Moves cursor up without shift\n * @param {Number} offset\n */\n moveCursorWithoutShift(offset: number) {\n if (offset < 0) {\n this.selectionStart += offset;\n this.selectionEnd = this.selectionStart;\n } else {\n this.selectionEnd += offset;\n this.selectionStart = this.selectionEnd;\n }\n return offset !== 0;\n }\n\n /**\n * Moves cursor left\n * @param {KeyboardEvent} e Event object\n */\n moveCursorLeft(e: KeyboardEvent) {\n if (this.selectionStart === 0 && this.selectionEnd === 0) {\n return;\n }\n this._moveCursorLeftOrRight('Left', e);\n }\n\n /**\n * @private\n * @return {Boolean} true if a change happened\n *\n * @todo refactor not to use method name composition\n */\n _move(\n e: KeyboardEvent,\n prop: 'selectionStart' | 'selectionEnd',\n direction: 'Left' | 'Right',\n ): boolean {\n let newValue: number | undefined;\n if (e.altKey) {\n newValue = this[`findWordBoundary${direction}`](this[prop]);\n } else if (e.metaKey || e.keyCode === 35 || e.keyCode === 36) {\n newValue = this[`findLineBoundary${direction}`](this[prop]);\n } else {\n this[prop] += direction === 'Left' ? -1 : 1;\n return true;\n }\n if (typeof newValue !== 'undefined' && this[prop] !== newValue) {\n this[prop] = newValue;\n return true;\n }\n return false;\n }\n\n /**\n * @private\n */\n _moveLeft(e: KeyboardEvent, prop: 'selectionStart' | 'selectionEnd') {\n return this._move(e, prop, 'Left');\n }\n\n /**\n * @private\n */\n _moveRight(e: KeyboardEvent, prop: 'selectionStart' | 'selectionEnd') {\n return this._move(e, prop, 'Right');\n }\n\n /**\n * Moves cursor left without keeping selection\n * @param {KeyboardEvent} e\n */\n moveCursorLeftWithoutShift(e: KeyboardEvent) {\n let change = true;\n this._selectionDirection = LEFT;\n\n // only move cursor when there is no selection,\n // otherwise we discard it, and leave cursor on same place\n if (\n this.selectionEnd === this.selectionStart &&\n this.selectionStart !== 0\n ) {\n change = this._moveLeft(e, 'selectionStart');\n }\n this.selectionEnd = this.selectionStart;\n return change;\n }\n\n /**\n * Moves cursor left while keeping selection\n * @param {KeyboardEvent} e\n */\n moveCursorLeftWithShift(e: KeyboardEvent) {\n if (\n this._selectionDirection === RIGHT &&\n this.selectionStart !== this.selectionEnd\n ) {\n return this._moveLeft(e, 'selectionEnd');\n } else if (this.selectionStart !== 0) {\n this._selectionDirection = LEFT;\n return this._moveLeft(e, 'selectionStart');\n }\n }\n\n /**\n * Moves cursor right\n * @param {KeyboardEvent} e Event object\n */\n moveCursorRight(e: KeyboardEvent) {\n if (\n this.selectionStart >= this._text.length &&\n this.selectionEnd >= this._text.length\n ) {\n return;\n }\n this._moveCursorLeftOrRight('Right', e);\n }\n\n /**\n * Moves cursor right or Left, fires event\n * @param {String} direction 'Left', 'Right'\n * @param {KeyboardEvent} e Event object\n */\n _moveCursorLeftOrRight(direction: 'Left' | 'Right', e: KeyboardEvent) {\n const actionName = `moveCursor${direction}${\n e.shiftKey ? 'WithShift' : 'WithoutShift'\n }` as const;\n this._currentCursorOpacity = 1;\n if (this[actionName](e)) {\n // TODO fix: abort and init should be an alternative depending\n // on selectionStart/End being equal or different\n this.abortCursorAnimation();\n this.initDelayedCursor();\n this._fireSelectionChanged();\n this._updateTextarea();\n }\n }\n\n /**\n * Moves cursor right while keeping selection\n * @param {KeyboardEvent} e\n */\n moveCursorRightWithShift(e: KeyboardEvent) {\n if (\n this._selectionDirection === LEFT &&\n this.selectionStart !== this.selectionEnd\n ) {\n return this._moveRight(e, 'selectionStart');\n } else if (this.selectionEnd !== this._text.length) {\n this._selectionDirection = RIGHT;\n return this._moveRight(e, 'selectionEnd');\n }\n }\n\n /**\n * Moves cursor right without keeping selection\n * @param {KeyboardEvent} e Event object\n */\n moveCursorRightWithoutShift(e: KeyboardEvent) {\n let changed = true;\n this._selectionDirection = RIGHT;\n\n if (this.selectionStart === this.selectionEnd) {\n changed = this._moveRight(e, 'selectionStart');\n this.selectionEnd = this.selectionStart;\n } else {\n this.selectionStart = this.selectionEnd;\n }\n return changed;\n }\n}\n","import type {\n ObjectPointerEvents,\n TPointerEvent,\n TPointerEventInfo,\n} from '../../EventTypeDefs';\nimport { Point } from '../../Point';\nimport { invertTransform } from '../../util/misc/matrix';\nimport { DraggableTextDelegate } from './DraggableTextDelegate';\nimport type { ITextEvents } from './ITextBehavior';\nimport { ITextKeyBehavior } from './ITextKeyBehavior';\nimport type { TOptions } from '../../typedefs';\nimport type { TextProps, SerializedTextProps } from '../Text/Text';\nimport type { IText } from './IText';\n/**\n * `LEFT_CLICK === 0`\n */\nconst notALeftClick = (e: Event) => !!(e as MouseEvent).button;\n\nexport abstract class ITextClickBehavior<\n Props extends TOptions = Partial,\n SProps extends SerializedTextProps = SerializedTextProps,\n EventSpec extends ITextEvents = ITextEvents,\n> extends ITextKeyBehavior {\n protected draggableTextDelegate: DraggableTextDelegate;\n\n initBehavior() {\n // Initializes event handlers related to cursor or selection\n this.on('mousedown', this._mouseDownHandler);\n this.on('mouseup', this.mouseUpHandler);\n this.on('mousedblclick', this.doubleClickHandler);\n this.on('mousetripleclick', this.tripleClickHandler);\n\n this.draggableTextDelegate = new DraggableTextDelegate(\n this as unknown as IText,\n );\n\n super.initBehavior();\n }\n\n /**\n * If this method returns true a mouse move operation over a text selection\n * will not prevent the native mouse event allowing the browser to start a drag operation.\n * shouldStartDragging can be read 'do not prevent default for mouse move event'\n * To prevent drag and drop between objects both shouldStartDragging and onDragStart should return false\n * @returns\n */\n shouldStartDragging() {\n return this.draggableTextDelegate.isActive();\n }\n\n /**\n * @public override this method to control whether instance should/shouldn't become a drag source,\n * @see also {@link DraggableTextDelegate#isActive}\n * To prevent drag and drop between objects both shouldStartDragging and onDragStart should return false\n * @returns {boolean} should handle event\n */\n onDragStart(e: DragEvent) {\n return this.draggableTextDelegate.onDragStart(e);\n }\n\n /**\n * @public override this method to control whether instance should/shouldn't become a drop target\n */\n canDrop(e: DragEvent) {\n return this.draggableTextDelegate.canDrop(e);\n }\n\n /**\n * Default handler for double click, select a word\n */\n doubleClickHandler(options: TPointerEventInfo) {\n if (!this.isEditing) {\n return;\n }\n this.selectWord(this.getSelectionStartFromPointer(options.e));\n this.renderCursorOrSelection();\n }\n\n /**\n * Default handler for triple click, select a line\n */\n tripleClickHandler(options: TPointerEventInfo) {\n if (!this.isEditing) {\n return;\n }\n this.selectLine(this.getSelectionStartFromPointer(options.e));\n this.renderCursorOrSelection();\n }\n\n /**\n * Default event handler for the basic functionalities needed on _mouseDown\n * can be overridden to do something different.\n * Scope of this implementation is: find the click position, set selectionStart\n * find selectionEnd, initialize the drawing of either cursor or selection area\n * initializing a mousedDown on a text area will cancel fabricjs knowledge of\n * current compositionMode. It will be set to false.\n */\n _mouseDownHandler({ e, alreadySelected }: ObjectPointerEvents['mousedown']) {\n if (\n !this.canvas ||\n !this.editable ||\n notALeftClick(e) ||\n this.getActiveControl()\n ) {\n return;\n }\n\n if (this.draggableTextDelegate.start(e)) {\n return;\n }\n\n this.canvas.textEditingManager.register(this);\n\n if (alreadySelected) {\n this.inCompositionMode = false;\n this.setCursorByClick(e);\n }\n\n if (this.isEditing) {\n this.__selectionStartOnMouseDown = this.selectionStart;\n if (this.selectionStart === this.selectionEnd) {\n this.abortCursorAnimation();\n }\n this.renderCursorOrSelection();\n }\n this.selected ||= alreadySelected || this.isEditing;\n }\n\n /**\n * standard handler for mouse up, overridable\n * @private\n */\n mouseUpHandler({ e, transform }: ObjectPointerEvents['mouseup']) {\n const didDrag = this.draggableTextDelegate.end(e);\n\n if (this.canvas) {\n this.canvas.textEditingManager.unregister(this);\n\n const activeObject = this.canvas._activeObject;\n if (activeObject && activeObject !== this) {\n // avoid running this logic when there is an active object\n // this because is possible with shift click and fast clicks,\n // to rapidly deselect and reselect this object and trigger an enterEdit\n return;\n }\n }\n\n if (\n !this.editable ||\n (this.group && !this.group.interactive) ||\n (transform && transform.actionPerformed) ||\n notALeftClick(e) ||\n didDrag\n ) {\n return;\n }\n\n if (this.selected && !this.getActiveControl()) {\n this.enterEditing(e);\n if (this.selectionStart === this.selectionEnd) {\n this.initDelayedCursor(true);\n } else {\n this.renderCursorOrSelection();\n }\n }\n }\n\n /**\n * Changes cursor location in a text depending on passed pointer (x/y) object\n * @param {TPointerEvent} e Event object\n */\n setCursorByClick(e: TPointerEvent) {\n const newSelection = this.getSelectionStartFromPointer(e),\n start = this.selectionStart,\n end = this.selectionEnd;\n if (e.shiftKey) {\n this.setSelectionStartEndWithShift(start, end, newSelection);\n } else {\n this.selectionStart = newSelection;\n this.selectionEnd = newSelection;\n }\n if (this.isEditing) {\n this._fireSelectionChanged();\n this._updateTextarea();\n }\n }\n\n /**\n * Returns index of a character corresponding to where an object was clicked\n * @param {TPointerEvent} e Event object\n * @return {Number} Index of a character\n */\n getSelectionStartFromPointer(e: TPointerEvent): number {\n const mouseOffset = this.canvas!.getScenePoint(e)\n .transform(invertTransform(this.calcTransformMatrix()))\n .add(new Point(-this._getLeftOffset(), -this._getTopOffset()));\n let height = 0,\n charIndex = 0,\n lineIndex = 0;\n\n for (let i = 0; i < this._textLines.length; i++) {\n if (height <= mouseOffset.y) {\n height += this.getHeightOfLine(i);\n lineIndex = i;\n if (i > 0) {\n charIndex +=\n this._textLines[i - 1].length + this.missingNewlineOffset(i - 1);\n }\n } else {\n break;\n }\n }\n const lineLeftOffset = Math.abs(this._getLineLeftOffset(lineIndex));\n let width = lineLeftOffset;\n const charLength = this._textLines[lineIndex].length;\n const chars = this.__charBounds[lineIndex];\n for (let j = 0; j < charLength; j++) {\n // i removed something about flipX here, check.\n const charWidth = chars[j].kernedWidth;\n const widthAfter = width + charWidth;\n if (mouseOffset.x <= widthAfter) {\n // if the pointer is closer to the end of the char we increment charIndex\n // in order to position the cursor after the char\n if (\n Math.abs(mouseOffset.x - widthAfter) <=\n Math.abs(mouseOffset.x - width)\n ) {\n charIndex++;\n }\n break;\n }\n width = widthAfter;\n charIndex++;\n }\n\n return Math.min(\n // if object is horizontally flipped, mirror cursor location from the end\n this.flipX ? charLength - charIndex : charIndex,\n this._text.length,\n );\n }\n}\n","export type TKeyMapIText = Record<\n KeyboardEvent['keyCode'],\n CursorHandlingMethods\n>;\n\nexport type CursorHandlingMethods =\n | 'moveCursorUp'\n | 'moveCursorDown'\n | 'moveCursorLeft'\n | 'moveCursorRight'\n | 'exitEditing'\n | 'copy'\n | 'cut'\n | 'cmdAll';\n\nconst MOVE_CURSOR_UP: CursorHandlingMethods = 'moveCursorUp';\nconst MOVE_CURSOR_DOWN: CursorHandlingMethods = 'moveCursorDown';\nconst MOVE_CURSOR_LEFT: CursorHandlingMethods = 'moveCursorLeft';\nconst MOVE_CURSOR_RIGHT: CursorHandlingMethods = 'moveCursorRight';\nconst EXIT_EDITING: CursorHandlingMethods = 'exitEditing';\n\n// @TODO look into import { Key } from 'ts-key-enum';\n// and transition from keyCode to Key\n// also reduce string duplication\nexport const keysMap: TKeyMapIText = {\n 9: EXIT_EDITING,\n 27: EXIT_EDITING,\n 33: MOVE_CURSOR_UP,\n 34: MOVE_CURSOR_DOWN,\n 35: MOVE_CURSOR_RIGHT,\n 36: MOVE_CURSOR_LEFT,\n 37: MOVE_CURSOR_LEFT,\n 38: MOVE_CURSOR_UP,\n 39: MOVE_CURSOR_RIGHT,\n 40: MOVE_CURSOR_DOWN,\n};\n\nexport const keysMapRtl: TKeyMapIText = {\n 9: EXIT_EDITING,\n 27: EXIT_EDITING,\n 33: MOVE_CURSOR_UP,\n 34: MOVE_CURSOR_DOWN,\n 35: MOVE_CURSOR_LEFT,\n 36: MOVE_CURSOR_RIGHT,\n 37: MOVE_CURSOR_RIGHT,\n 38: MOVE_CURSOR_UP,\n 39: MOVE_CURSOR_LEFT,\n 40: MOVE_CURSOR_DOWN,\n};\n\n/**\n * For functionalities on keyUp + ctrl || cmd\n */\nexport const ctrlKeysMapUp: TKeyMapIText = {\n 67: 'copy',\n // there was a reason this wasn't deleted. for now leave it here\n 88: 'cut',\n};\n\n/**\n * For functionalities on keyDown + ctrl || cmd\n */\nexport const ctrlKeysMapDown: TKeyMapIText = {\n 65: 'cmdAll',\n};\n","import type { StaticCanvas } from '../../canvas/StaticCanvas';\n\n/**\n * Set the transform of the passed context to the same of a specific Canvas or StaticCanvas.\n * setTransform is used since this utility will RESET the ctx transform to the basic value\n * of retina scaling and viewport transform\n * It is not meant to be added to other transforms, it is used internally to preapre canvases to draw\n * @param ctx\n * @param canvas\n */\nexport const applyCanvasTransform = (\n ctx: CanvasRenderingContext2D,\n canvas: StaticCanvas,\n) => {\n const scale = canvas.getRetinaScaling();\n ctx.setTransform(scale, 0, 0, scale, 0, 0);\n const v = canvas.viewportTransform;\n ctx.transform(v[0], v[1], v[2], v[3], v[4], v[5]);\n};\n","import { Canvas } from '../../canvas/Canvas';\nimport type { ITextEvents } from './ITextBehavior';\nimport { ITextClickBehavior } from './ITextClickBehavior';\nimport {\n ctrlKeysMapDown,\n ctrlKeysMapUp,\n keysMap,\n keysMapRtl,\n} from './constants';\nimport type { TClassProperties, TFiller, TOptions } from '../../typedefs';\nimport { classRegistry } from '../../ClassRegistry';\nimport type { SerializedTextProps, TextProps } from '../Text/Text';\nimport {\n JUSTIFY,\n JUSTIFY_CENTER,\n JUSTIFY_LEFT,\n JUSTIFY_RIGHT,\n} from '../Text/constants';\nimport { CENTER, FILL, LEFT, RIGHT } from '../../constants';\nimport type { ObjectToCanvasElementOptions } from '../Object/Object';\nimport type { FabricObject } from '../Object/FabricObject';\nimport { createCanvasElementFor } from '../../util/misc/dom';\nimport { applyCanvasTransform } from '../../util/internals/applyCanvasTransform';\n\nexport type CursorBoundaries = {\n left: number;\n top: number;\n leftOffset: number;\n topOffset: number;\n};\n\nexport type CursorRenderingData = {\n color: string;\n opacity: number;\n left: number;\n top: number;\n width: number;\n height: number;\n};\n\n// Declare IText protected properties to workaround TS\nconst protectedDefaultValues = {\n _selectionDirection: null,\n _reSpace: /\\s|\\r?\\n/,\n inCompositionMode: false,\n};\n\nexport const iTextDefaultValues: Partial> = {\n selectionStart: 0,\n selectionEnd: 0,\n selectionColor: 'rgba(17,119,255,0.3)',\n isEditing: false,\n editable: true,\n editingBorderColor: 'rgba(102,153,255,0.25)',\n cursorWidth: 2,\n cursorColor: '',\n cursorDelay: 1000,\n cursorDuration: 600,\n caching: true,\n hiddenTextareaContainer: null,\n keysMap,\n keysMapRtl,\n ctrlKeysMapDown,\n ctrlKeysMapUp,\n ...protectedDefaultValues,\n};\n\n// @TODO this is not complete\ninterface UniqueITextProps {\n selectionStart: number;\n selectionEnd: number;\n}\n\nexport interface SerializedITextProps\n extends SerializedTextProps,\n UniqueITextProps {}\n\nexport interface ITextProps extends TextProps, UniqueITextProps {}\n\n/**\n * @fires changed\n * @fires selection:changed\n * @fires editing:entered\n * @fires editing:exited\n * @fires dragstart\n * @fires drag drag event firing on the drag source\n * @fires dragend\n * @fires copy\n * @fires cut\n * @fires paste\n *\n * #### Supported key combinations\n * ```\n * Move cursor: left, right, up, down\n * Select character: shift + left, shift + right\n * Select text vertically: shift + up, shift + down\n * Move cursor by word: alt + left, alt + right\n * Select words: shift + alt + left, shift + alt + right\n * Move cursor to line start/end: cmd + left, cmd + right or home, end\n * Select till start/end of line: cmd + shift + left, cmd + shift + right or shift + home, shift + end\n * Jump to start/end of text: cmd + up, cmd + down\n * Select till start/end of text: cmd + shift + up, cmd + shift + down or shift + pgUp, shift + pgDown\n * Delete character: backspace\n * Delete word: alt + backspace\n * Delete line: cmd + backspace\n * Forward delete: delete\n * Copy text: ctrl/cmd + c\n * Paste text: ctrl/cmd + v\n * Cut text: ctrl/cmd + x\n * Select entire text: ctrl/cmd + a\n * Quit editing tab or esc\n * ```\n *\n * #### Supported mouse/touch combination\n * ```\n * Position cursor: click/touch\n * Create selection: click/touch & drag\n * Create selection: click & shift + click\n * Select word: double click\n * Select line: triple click\n * ```\n */\nexport class IText<\n Props extends TOptions = Partial,\n SProps extends SerializedITextProps = SerializedITextProps,\n EventSpec extends ITextEvents = ITextEvents,\n >\n extends ITextClickBehavior\n implements UniqueITextProps\n{\n /**\n * Index where text selection starts (or where cursor is when there is no selection)\n * @type Number\n */\n declare selectionStart: number;\n\n /**\n * Index where text selection ends\n * @type Number\n */\n declare selectionEnd: number;\n\n declare compositionStart: number;\n\n declare compositionEnd: number;\n\n /**\n * Color of text selection\n * @type String\n */\n declare selectionColor: string;\n\n /**\n * Indicates whether text is in editing mode\n * @type Boolean\n */\n declare isEditing: boolean;\n\n /**\n * Indicates whether a text can be edited\n * @type Boolean\n */\n declare editable: boolean;\n\n /**\n * Border color of text object while it's in editing mode\n * @type String\n */\n declare editingBorderColor: string;\n\n /**\n * Width of cursor (in px)\n * @type Number\n */\n declare cursorWidth: number;\n\n /**\n * Color of text cursor color in editing mode.\n * if not set (default) will take color from the text.\n * if set to a color value that fabric can understand, it will\n * be used instead of the color of the text at the current position.\n * @type String\n */\n declare cursorColor: string;\n\n /**\n * Delay between cursor blink (in ms)\n * @type Number\n */\n declare cursorDelay: number;\n\n /**\n * Duration of cursor fade in (in ms)\n * @type Number\n */\n declare cursorDuration: number;\n\n declare compositionColor: string;\n\n /**\n * Indicates whether internal text char widths can be cached\n * @type Boolean\n */\n declare caching: boolean;\n\n static ownDefaults = iTextDefaultValues;\n\n static getDefaults(): Record {\n return { ...super.getDefaults(), ...IText.ownDefaults };\n }\n\n static type = 'IText';\n\n get type() {\n const type = super.type;\n // backward compatibility\n return type === 'itext' ? 'i-text' : type;\n }\n\n /**\n * Constructor\n * @param {String} text Text string\n * @param {Object} [options] Options object\n */\n constructor(text: string, options?: Props) {\n super(text, { ...IText.ownDefaults, ...options } as Props);\n this.initBehavior();\n }\n\n /**\n * While editing handle differently\n * @private\n * @param {string} key\n * @param {*} value\n */\n _set(key: string, value: any) {\n if (this.isEditing && this._savedProps && key in this._savedProps) {\n // @ts-expect-error irritating TS\n this._savedProps[key] = value;\n return this;\n }\n if (key === 'canvas') {\n this.canvas instanceof Canvas &&\n this.canvas.textEditingManager.remove(this);\n value instanceof Canvas && value.textEditingManager.add(this);\n }\n return super._set(key, value);\n }\n\n /**\n * Sets selection start (left boundary of a selection)\n * @param {Number} index Index to set selection start to\n */\n setSelectionStart(index: number) {\n index = Math.max(index, 0);\n this._updateAndFire('selectionStart', index);\n }\n\n /**\n * Sets selection end (right boundary of a selection)\n * @param {Number} index Index to set selection end to\n */\n setSelectionEnd(index: number) {\n index = Math.min(index, this.text.length);\n this._updateAndFire('selectionEnd', index);\n }\n\n /**\n * @private\n * @param {String} property 'selectionStart' or 'selectionEnd'\n * @param {Number} index new position of property\n */\n protected _updateAndFire(\n property: 'selectionStart' | 'selectionEnd',\n index: number,\n ) {\n if (this[property] !== index) {\n this._fireSelectionChanged();\n this[property] = index;\n }\n this._updateTextarea();\n }\n\n /**\n * Fires the even of selection changed\n * @private\n */\n _fireSelectionChanged() {\n this.fire('selection:changed');\n this.canvas && this.canvas.fire('text:selection:changed', { target: this });\n }\n\n /**\n * Initialize text dimensions. Render all text on given context\n * or on a offscreen canvas to get the text width with measureText.\n * Updates this.width and this.height with the proper values.\n * Does not return dimensions.\n * @private\n */\n initDimensions() {\n this.isEditing && this.initDelayedCursor();\n super.initDimensions();\n }\n\n /**\n * Gets style of a current selection/cursor (at the start position)\n * if startIndex or endIndex are not provided, selectionStart or selectionEnd will be used.\n * @param {Number} startIndex Start index to get styles at\n * @param {Number} endIndex End index to get styles at, if not specified selectionEnd or startIndex + 1\n * @param {Boolean} [complete] get full style or not\n * @return {Array} styles an array with one, zero or more Style objects\n */\n getSelectionStyles(\n startIndex: number = this.selectionStart || 0,\n endIndex: number = this.selectionEnd,\n complete?: boolean,\n ) {\n return super.getSelectionStyles(startIndex, endIndex, complete);\n }\n\n /**\n * Sets style of a current selection, if no selection exist, do not set anything.\n * @param {Object} [styles] Styles object\n * @param {Number} [startIndex] Start index to get styles at\n * @param {Number} [endIndex] End index to get styles at, if not specified selectionEnd or startIndex + 1\n */\n setSelectionStyles(\n styles: object,\n startIndex: number = this.selectionStart || 0,\n endIndex: number = this.selectionEnd,\n ) {\n return super.setSelectionStyles(styles, startIndex, endIndex);\n }\n\n /**\n * Returns 2d representation (lineIndex and charIndex) of cursor (or selection start)\n * @param {Number} [selectionStart] Optional index. When not given, current selectionStart is used.\n * @param {Boolean} [skipWrapping] consider the location for unwrapped lines. useful to manage styles.\n */\n get2DCursorLocation(\n selectionStart = this.selectionStart,\n skipWrapping?: boolean,\n ) {\n return super.get2DCursorLocation(selectionStart, skipWrapping);\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n render(ctx: CanvasRenderingContext2D) {\n super.render(ctx);\n // clear the cursorOffsetCache, so we ensure to calculate once per renderCursor\n // the correct position but not at every cursor animation.\n this.cursorOffsetCache = {};\n this.renderCursorOrSelection();\n }\n\n /**\n * @override block cursor/selection logic while rendering the exported canvas\n * @todo this workaround should be replaced with a more robust solution\n */\n toCanvasElement(options?: ObjectToCanvasElementOptions): HTMLCanvasElement {\n const isEditing = this.isEditing;\n this.isEditing = false;\n const canvas = super.toCanvasElement(options);\n this.isEditing = isEditing;\n return canvas;\n }\n\n /**\n * Renders cursor or selection (depending on what exists)\n * it does on the contextTop. If contextTop is not available, do nothing.\n */\n renderCursorOrSelection() {\n if (!this.isEditing || !this.canvas) {\n return;\n }\n const ctx = this.clearContextTop(true);\n if (!ctx) {\n return;\n }\n const boundaries = this._getCursorBoundaries();\n\n const ancestors = this.findAncestorsWithClipPath();\n const hasAncestorsWithClipping = ancestors.length > 0;\n let drawingCtx: CanvasRenderingContext2D = ctx;\n let drawingCanvas: HTMLCanvasElement | undefined = undefined;\n if (hasAncestorsWithClipping) {\n // we have some clipPath, we need to draw the selection on an intermediate layer.\n drawingCanvas = createCanvasElementFor(ctx.canvas);\n drawingCtx = drawingCanvas.getContext('2d')!;\n applyCanvasTransform(drawingCtx, this.canvas);\n const m = this.calcTransformMatrix();\n drawingCtx.transform(m[0], m[1], m[2], m[3], m[4], m[5]);\n }\n\n if (this.selectionStart === this.selectionEnd && !this.inCompositionMode) {\n this.renderCursor(drawingCtx, boundaries);\n } else {\n this.renderSelection(drawingCtx, boundaries);\n }\n\n if (hasAncestorsWithClipping) {\n // we need a neutral context.\n // this won't work for nested clippaths in which a clippath\n // has its own clippath\n for (const ancestor of ancestors) {\n const clipPath = ancestor.clipPath!;\n const clippingCanvas = createCanvasElementFor(ctx.canvas);\n const clippingCtx = clippingCanvas.getContext('2d')!;\n applyCanvasTransform(clippingCtx, this.canvas);\n // position the ctx in the center of the outer ancestor\n if (!clipPath.absolutePositioned) {\n const m = ancestor.calcTransformMatrix();\n clippingCtx.transform(m[0], m[1], m[2], m[3], m[4], m[5]);\n }\n clipPath.transform(clippingCtx);\n // we assign an empty drawing context, we don't plan to have this working for nested clippaths for now\n clipPath.drawObject(clippingCtx, true, {});\n this.drawClipPathOnCache(drawingCtx, clipPath, clippingCanvas);\n }\n }\n\n if (hasAncestorsWithClipping) {\n ctx.setTransform(1, 0, 0, 1, 0, 0);\n ctx.drawImage(drawingCanvas!, 0, 0);\n }\n\n this.canvas.contextTopDirty = true;\n ctx.restore();\n }\n\n /**\n * Finds and returns an array of clip paths that are applied to the parent\n * group(s) of the current FabricObject instance. The object's hierarchy is\n * traversed upwards (from the current object towards the root of the canvas),\n * checking each parent object for the presence of a `clipPath` that is not\n * absolutely positioned.\n */\n findAncestorsWithClipPath(): FabricObject[] {\n const clipPathAncestors: FabricObject[] = [];\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n let obj: FabricObject | undefined = this;\n while (obj) {\n if (obj.clipPath) {\n clipPathAncestors.push(obj);\n }\n obj = obj.parent;\n }\n\n return clipPathAncestors;\n }\n\n /**\n * Returns cursor boundaries (left, top, leftOffset, topOffset)\n * left/top are left/top of entire text box\n * leftOffset/topOffset are offset from that left/top point of a text box\n * @private\n * @param {number} [index] index from start\n * @param {boolean} [skipCaching]\n */\n _getCursorBoundaries(\n index: number = this.selectionStart,\n skipCaching?: boolean,\n ): CursorBoundaries {\n const left = this._getLeftOffset(),\n top = this._getTopOffset(),\n offsets = this._getCursorBoundariesOffsets(index, skipCaching);\n return {\n left: left,\n top: top,\n leftOffset: offsets.left,\n topOffset: offsets.top,\n };\n }\n\n /**\n * Caches and returns cursor left/top offset relative to instance's center point\n * @private\n * @param {number} index index from start\n * @param {boolean} [skipCaching]\n */\n _getCursorBoundariesOffsets(\n index: number,\n skipCaching?: boolean,\n ): { left: number; top: number } {\n if (skipCaching) {\n return this.__getCursorBoundariesOffsets(index);\n }\n if (this.cursorOffsetCache && 'top' in this.cursorOffsetCache) {\n return this.cursorOffsetCache as { left: number; top: number };\n }\n return (this.cursorOffsetCache = this.__getCursorBoundariesOffsets(index));\n }\n\n /**\n * Calculates cursor left/top offset relative to instance's center point\n * @private\n * @param {number} index index from start\n */\n __getCursorBoundariesOffsets(index: number) {\n let topOffset = 0,\n leftOffset = 0;\n const { charIndex, lineIndex } = this.get2DCursorLocation(index);\n\n for (let i = 0; i < lineIndex; i++) {\n topOffset += this.getHeightOfLine(i);\n }\n const lineLeftOffset = this._getLineLeftOffset(lineIndex);\n const bound = this.__charBounds[lineIndex][charIndex];\n bound && (leftOffset = bound.left);\n if (\n this.charSpacing !== 0 &&\n charIndex === this._textLines[lineIndex].length\n ) {\n leftOffset -= this._getWidthOfCharSpacing();\n }\n const boundaries = {\n top: topOffset,\n left: lineLeftOffset + (leftOffset > 0 ? leftOffset : 0),\n };\n if (this.direction === 'rtl') {\n if (\n this.textAlign === RIGHT ||\n this.textAlign === JUSTIFY ||\n this.textAlign === JUSTIFY_RIGHT\n ) {\n boundaries.left *= -1;\n } else if (this.textAlign === LEFT || this.textAlign === JUSTIFY_LEFT) {\n boundaries.left = lineLeftOffset - (leftOffset > 0 ? leftOffset : 0);\n } else if (\n this.textAlign === CENTER ||\n this.textAlign === JUSTIFY_CENTER\n ) {\n boundaries.left = lineLeftOffset - (leftOffset > 0 ? leftOffset : 0);\n }\n }\n return boundaries;\n }\n\n /**\n * Renders cursor on context Top, outside the animation cycle, on request\n * Used for the drag/drop effect.\n * If contextTop is not available, do nothing.\n */\n renderCursorAt(selectionStart: number) {\n this._renderCursor(\n this.canvas!.contextTop,\n this._getCursorBoundaries(selectionStart, true),\n selectionStart,\n );\n }\n\n /**\n * Renders cursor\n * @param {Object} boundaries\n * @param {CanvasRenderingContext2D} ctx transformed context to draw on\n */\n renderCursor(ctx: CanvasRenderingContext2D, boundaries: CursorBoundaries) {\n this._renderCursor(ctx, boundaries, this.selectionStart);\n }\n\n /**\n * Return the data needed to render the cursor for given selection start\n * The left,top are relative to the object, while width and height are prescaled\n * to look think with canvas zoom and object scaling,\n * so they depend on canvas and object scaling\n */\n getCursorRenderingData(\n selectionStart: number = this.selectionStart,\n boundaries: CursorBoundaries = this._getCursorBoundaries(selectionStart),\n ): CursorRenderingData {\n const cursorLocation = this.get2DCursorLocation(selectionStart),\n lineIndex = cursorLocation.lineIndex,\n charIndex =\n cursorLocation.charIndex > 0 ? cursorLocation.charIndex - 1 : 0,\n charHeight = this.getValueOfPropertyAt(lineIndex, charIndex, 'fontSize'),\n multiplier = this.getObjectScaling().x * this.canvas!.getZoom(),\n cursorWidth = this.cursorWidth / multiplier,\n dy = this.getValueOfPropertyAt(lineIndex, charIndex, 'deltaY'),\n topOffset =\n boundaries.topOffset +\n ((1 - this._fontSizeFraction) * this.getHeightOfLine(lineIndex)) /\n this.lineHeight -\n charHeight * (1 - this._fontSizeFraction);\n\n return {\n color:\n this.cursorColor ||\n (this.getValueOfPropertyAt(lineIndex, charIndex, 'fill') as string),\n opacity: this._currentCursorOpacity,\n left: boundaries.left + boundaries.leftOffset - cursorWidth / 2,\n top: topOffset + boundaries.top + dy,\n width: cursorWidth,\n height: charHeight,\n };\n }\n\n /**\n * Render the cursor at the given selectionStart.\n * @param {CanvasRenderingContext2D} ctx transformed context to draw on\n */\n _renderCursor(\n ctx: CanvasRenderingContext2D,\n boundaries: CursorBoundaries,\n selectionStart: number,\n ) {\n const { color, opacity, left, top, width, height } =\n this.getCursorRenderingData(selectionStart, boundaries);\n ctx.fillStyle = color;\n ctx.globalAlpha = opacity;\n ctx.fillRect(left, top, width, height);\n }\n\n /**\n * Renders text selection\n * @param {Object} boundaries Object with left/top/leftOffset/topOffset\n * @param {CanvasRenderingContext2D} ctx transformed context to draw on\n */\n renderSelection(ctx: CanvasRenderingContext2D, boundaries: CursorBoundaries) {\n const selection = {\n selectionStart: this.inCompositionMode\n ? this.hiddenTextarea!.selectionStart\n : this.selectionStart,\n selectionEnd: this.inCompositionMode\n ? this.hiddenTextarea!.selectionEnd\n : this.selectionEnd,\n };\n this._renderSelection(ctx, selection, boundaries);\n }\n\n /**\n * Renders drag start text selection\n */\n renderDragSourceEffect() {\n const dragStartSelection =\n this.draggableTextDelegate.getDragStartSelection()!;\n this._renderSelection(\n this.canvas!.contextTop,\n dragStartSelection,\n this._getCursorBoundaries(dragStartSelection.selectionStart, true),\n );\n }\n\n renderDropTargetEffect(e: DragEvent) {\n const dragSelection = this.getSelectionStartFromPointer(e);\n this.renderCursorAt(dragSelection);\n }\n\n /**\n * Renders text selection\n * @private\n * @param {{ selectionStart: number, selectionEnd: number }} selection\n * @param {Object} boundaries Object with left/top/leftOffset/topOffset\n * @param {CanvasRenderingContext2D} ctx transformed context to draw on\n */\n _renderSelection(\n ctx: CanvasRenderingContext2D,\n selection: { selectionStart: number; selectionEnd: number },\n boundaries: CursorBoundaries,\n ) {\n const selectionStart = selection.selectionStart,\n selectionEnd = selection.selectionEnd,\n isJustify = this.textAlign.includes(JUSTIFY),\n start = this.get2DCursorLocation(selectionStart),\n end = this.get2DCursorLocation(selectionEnd),\n startLine = start.lineIndex,\n endLine = end.lineIndex,\n startChar = start.charIndex < 0 ? 0 : start.charIndex,\n endChar = end.charIndex < 0 ? 0 : end.charIndex;\n\n for (let i = startLine; i <= endLine; i++) {\n const lineOffset = this._getLineLeftOffset(i) || 0;\n let lineHeight = this.getHeightOfLine(i),\n realLineHeight = 0,\n boxStart = 0,\n boxEnd = 0;\n\n if (i === startLine) {\n boxStart = this.__charBounds[startLine][startChar].left;\n }\n if (i >= startLine && i < endLine) {\n boxEnd =\n isJustify && !this.isEndOfWrapping(i)\n ? this.width\n : this.getLineWidth(i) || 5; // WTF is this 5?\n } else if (i === endLine) {\n if (endChar === 0) {\n boxEnd = this.__charBounds[endLine][endChar].left;\n } else {\n const charSpacing = this._getWidthOfCharSpacing();\n boxEnd =\n this.__charBounds[endLine][endChar - 1].left +\n this.__charBounds[endLine][endChar - 1].width -\n charSpacing;\n }\n }\n realLineHeight = lineHeight;\n if (this.lineHeight < 1 || (i === endLine && this.lineHeight > 1)) {\n lineHeight /= this.lineHeight;\n }\n let drawStart = boundaries.left + lineOffset + boxStart,\n drawHeight = lineHeight,\n extraTop = 0;\n const drawWidth = boxEnd - boxStart;\n if (this.inCompositionMode) {\n ctx.fillStyle = this.compositionColor || 'black';\n drawHeight = 1;\n extraTop = lineHeight;\n } else {\n ctx.fillStyle = this.selectionColor;\n }\n if (this.direction === 'rtl') {\n if (\n this.textAlign === RIGHT ||\n this.textAlign === JUSTIFY ||\n this.textAlign === JUSTIFY_RIGHT\n ) {\n drawStart = this.width - drawStart - drawWidth;\n } else if (this.textAlign === LEFT || this.textAlign === JUSTIFY_LEFT) {\n drawStart = boundaries.left + lineOffset - boxEnd;\n } else if (\n this.textAlign === CENTER ||\n this.textAlign === JUSTIFY_CENTER\n ) {\n drawStart = boundaries.left + lineOffset - boxEnd;\n }\n }\n ctx.fillRect(\n drawStart,\n boundaries.top + boundaries.topOffset + extraTop,\n drawWidth,\n drawHeight,\n );\n boundaries.topOffset += realLineHeight;\n }\n }\n\n /**\n * High level function to know the height of the cursor.\n * the currentChar is the one that precedes the cursor\n * Returns fontSize of char at the current cursor\n * Unused from the library, is for the end user\n * @return {Number} Character font size\n */\n getCurrentCharFontSize(): number {\n const cp = this._getCurrentCharIndex();\n return this.getValueOfPropertyAt(cp.l, cp.c, 'fontSize');\n }\n\n /**\n * High level function to know the color of the cursor.\n * the currentChar is the one that precedes the cursor\n * Returns color (fill) of char at the current cursor\n * if the text object has a pattern or gradient for filler, it will return that.\n * Unused by the library, is for the end user\n * @return {String | TFiller} Character color (fill)\n */\n getCurrentCharColor(): string | TFiller | null {\n const cp = this._getCurrentCharIndex();\n return this.getValueOfPropertyAt(cp.l, cp.c, FILL);\n }\n\n /**\n * Returns the cursor position for the getCurrent.. functions\n * @private\n */\n _getCurrentCharIndex() {\n const cursorPosition = this.get2DCursorLocation(this.selectionStart, true),\n charIndex =\n cursorPosition.charIndex > 0 ? cursorPosition.charIndex - 1 : 0;\n return { l: cursorPosition.lineIndex, c: charIndex };\n }\n\n dispose() {\n this.exitEditingImpl();\n this.draggableTextDelegate.dispose();\n super.dispose();\n }\n}\n\nclassRegistry.setClass(IText);\n// legacy\nclassRegistry.setClass(IText, 'i-text');\n","import type { TClassProperties, TOptions } from '../typedefs';\nimport { IText } from './IText/IText';\nimport { classRegistry } from '../ClassRegistry';\nimport { createTextboxDefaultControls } from '../controls/commonControls';\nimport { JUSTIFY } from './Text/constants';\nimport type { TextStyleDeclaration } from './Text/StyledText';\nimport type { SerializedITextProps, ITextProps } from './IText/IText';\nimport type { ITextEvents } from './IText/ITextBehavior';\nimport type { TextLinesInfo } from './Text/Text';\nimport type { Control } from '../controls/Control';\n\n// @TODO: Many things here are configuration related and shouldn't be on the class nor prototype\n// regexes, list of properties that are not suppose to change by instances, magic consts.\n// this will be a separated effort\nexport const textboxDefaultValues: Partial> = {\n minWidth: 20,\n dynamicMinWidth: 2,\n lockScalingFlip: true,\n noScaleCache: false,\n _wordJoiners: /[ \\t\\r]/,\n splitByGrapheme: false,\n};\n\nexport type GraphemeData = {\n wordsData: {\n word: string[];\n width: number;\n }[][];\n largestWordWidth: number;\n};\n\nexport type StyleMap = Record;\n\n// @TODO this is not complete\ninterface UniqueTextboxProps {\n minWidth: number;\n splitByGrapheme: boolean;\n dynamicMinWidth: number;\n _wordJoiners: RegExp;\n}\n\nexport interface SerializedTextboxProps\n extends SerializedITextProps,\n Pick {}\n\nexport interface TextboxProps extends ITextProps, UniqueTextboxProps {}\n\n/**\n * Textbox class, based on IText, allows the user to resize the text rectangle\n * and wraps lines automatically. Textboxes have their Y scaling locked, the\n * user can only change width. Height is adjusted automatically based on the\n * wrapping of lines.\n */\nexport class Textbox<\n Props extends TOptions = Partial,\n SProps extends SerializedTextboxProps = SerializedTextboxProps,\n EventSpec extends ITextEvents = ITextEvents,\n >\n extends IText\n implements UniqueTextboxProps\n{\n /**\n * Minimum width of textbox, in pixels.\n * @type Number\n */\n declare minWidth: number;\n\n /**\n * Minimum calculated width of a textbox, in pixels.\n * fixed to 2 so that an empty textbox cannot go to 0\n * and is still selectable without text.\n * @type Number\n */\n declare dynamicMinWidth: number;\n\n /**\n * Use this boolean property in order to split strings that have no white space concept.\n * this is a cheap way to help with chinese/japanese\n * @type Boolean\n * @since 2.6.0\n */\n declare splitByGrapheme: boolean;\n\n declare _wordJoiners: RegExp;\n\n declare _styleMap: StyleMap;\n\n declare isWrapping: boolean;\n\n static type = 'Textbox';\n\n static textLayoutProperties = [...IText.textLayoutProperties, 'width'];\n\n static ownDefaults = textboxDefaultValues;\n\n static getDefaults(): Record {\n return {\n ...super.getDefaults(),\n ...Textbox.ownDefaults,\n };\n }\n\n /**\n * Constructor\n * @param {String} text Text string\n * @param {Object} [options] Options object\n */\n constructor(text: string, options?: Props) {\n super(text, { ...Textbox.ownDefaults, ...options } as Props);\n }\n\n /**\n * Creates the default control object.\n * If you prefer to have on instance of controls shared among all objects\n * make this function return an empty object and add controls to the ownDefaults object\n */\n static createControls(): { controls: Record } {\n return { controls: createTextboxDefaultControls() };\n }\n\n /**\n * Unlike superclass's version of this function, Textbox does not update\n * its width.\n * @private\n * @override\n */\n initDimensions() {\n if (!this.initialized) {\n return;\n }\n this.isEditing && this.initDelayedCursor();\n this._clearCache();\n // clear dynamicMinWidth as it will be different after we re-wrap line\n this.dynamicMinWidth = 0;\n // wrap lines\n this._styleMap = this._generateStyleMap(this._splitText());\n // if after wrapping, the width is smaller than dynamicMinWidth, change the width and re-wrap\n if (this.dynamicMinWidth > this.width) {\n this._set('width', this.dynamicMinWidth);\n }\n if (this.textAlign.includes(JUSTIFY)) {\n // once text is measured we need to make space fatter to make justified text.\n this.enlargeSpaces();\n }\n // clear cache and re-calculate height\n this.height = this.calcTextHeight();\n }\n\n /**\n * Generate an object that translates the style object so that it is\n * broken up by visual lines (new lines and automatic wrapping).\n * The original text styles object is broken up by actual lines (new lines only),\n * which is only sufficient for Text / IText\n * @private\n */\n _generateStyleMap(textInfo: TextLinesInfo): StyleMap {\n let realLineCount = 0,\n realLineCharCount = 0,\n charCount = 0;\n const map: StyleMap = {};\n\n for (let i = 0; i < textInfo.graphemeLines.length; i++) {\n if (textInfo.graphemeText[charCount] === '\\n' && i > 0) {\n realLineCharCount = 0;\n charCount++;\n realLineCount++;\n } else if (\n !this.splitByGrapheme &&\n this._reSpaceAndTab.test(textInfo.graphemeText[charCount]) &&\n i > 0\n ) {\n // this case deals with space's that are removed from end of lines when wrapping\n realLineCharCount++;\n charCount++;\n }\n\n map[i] = { line: realLineCount, offset: realLineCharCount };\n\n charCount += textInfo.graphemeLines[i].length;\n realLineCharCount += textInfo.graphemeLines[i].length;\n }\n\n return map;\n }\n\n /**\n * Returns true if object has a style property or has it on a specified line\n * @param {Number} lineIndex\n * @return {Boolean}\n */\n styleHas(property: keyof TextStyleDeclaration, lineIndex: number): boolean {\n if (this._styleMap && !this.isWrapping) {\n const map = this._styleMap[lineIndex];\n if (map) {\n lineIndex = map.line;\n }\n }\n return super.styleHas(property, lineIndex);\n }\n\n /**\n * Returns true if object has no styling or no styling in a line\n * @param {Number} lineIndex , lineIndex is on wrapped lines.\n * @return {Boolean}\n */\n isEmptyStyles(lineIndex: number): boolean {\n if (!this.styles) {\n return true;\n }\n let offset = 0,\n nextLineIndex = lineIndex + 1,\n nextOffset: number,\n shouldLimit = false;\n const map = this._styleMap[lineIndex],\n mapNextLine = this._styleMap[lineIndex + 1];\n if (map) {\n lineIndex = map.line;\n offset = map.offset;\n }\n if (mapNextLine) {\n nextLineIndex = mapNextLine.line;\n shouldLimit = nextLineIndex === lineIndex;\n nextOffset = mapNextLine.offset;\n }\n const obj =\n typeof lineIndex === 'undefined'\n ? this.styles\n : { line: this.styles[lineIndex] };\n for (const p1 in obj) {\n for (const p2 in obj[p1]) {\n const p2Number = parseInt(p2, 10);\n if (p2Number >= offset && (!shouldLimit || p2Number < nextOffset!)) {\n for (const p3 in obj[p1][p2]) {\n return false;\n }\n }\n }\n }\n return true;\n }\n\n /**\n * @protected\n * @param {Number} lineIndex\n * @param {Number} charIndex\n * @return {TextStyleDeclaration} a style object reference to the existing one or a new empty object when undefined\n */\n _getStyleDeclaration(\n lineIndex: number,\n charIndex: number,\n ): TextStyleDeclaration {\n if (this._styleMap && !this.isWrapping) {\n const map = this._styleMap[lineIndex];\n if (!map) {\n return {};\n }\n lineIndex = map.line;\n charIndex = map.offset + charIndex;\n }\n return super._getStyleDeclaration(lineIndex, charIndex);\n }\n\n /**\n * @param {Number} lineIndex\n * @param {Number} charIndex\n * @param {Object} style\n * @private\n */\n protected _setStyleDeclaration(\n lineIndex: number,\n charIndex: number,\n style: object,\n ) {\n const map = this._styleMap[lineIndex];\n super._setStyleDeclaration(map.line, map.offset + charIndex, style);\n }\n\n /**\n * @param {Number} lineIndex\n * @param {Number} charIndex\n * @private\n */\n protected _deleteStyleDeclaration(lineIndex: number, charIndex: number) {\n const map = this._styleMap[lineIndex];\n super._deleteStyleDeclaration(map.line, map.offset + charIndex);\n }\n\n /**\n * probably broken need a fix\n * Returns the real style line that correspond to the wrapped lineIndex line\n * Used just to verify if the line does exist or not.\n * @param {Number} lineIndex\n * @returns {Boolean} if the line exists or not\n * @private\n */\n protected _getLineStyle(lineIndex: number): boolean {\n const map = this._styleMap[lineIndex];\n return !!this.styles[map.line];\n }\n\n /**\n * Set the line style to an empty object so that is initialized\n * @param {Number} lineIndex\n * @param {Object} style\n * @private\n */\n protected _setLineStyle(lineIndex: number) {\n const map = this._styleMap[lineIndex];\n super._setLineStyle(map.line);\n }\n\n /**\n * Wraps text using the 'width' property of Textbox. First this function\n * splits text on newlines, so we preserve newlines entered by the user.\n * Then it wraps each line using the width of the Textbox by calling\n * _wrapLine().\n * @param {Array} lines The string array of text that is split into lines\n * @param {Number} desiredWidth width you want to wrap to\n * @returns {Array} Array of lines\n */\n _wrapText(lines: string[], desiredWidth: number): string[][] {\n this.isWrapping = true;\n // extract all thewords and the widths to optimally wrap lines.\n const data = this.getGraphemeDataForRender(lines);\n const wrapped: string[][] = [];\n for (let i = 0; i < data.wordsData.length; i++) {\n wrapped.push(...this._wrapLine(i, desiredWidth, data));\n }\n this.isWrapping = false;\n return wrapped;\n }\n\n /**\n * For each line of text terminated by an hard line stop,\n * measure each word width and extract the largest word from all.\n * The returned words here are the one that at the end will be rendered.\n * @param {string[]} lines the lines we need to measure\n *\n */\n getGraphemeDataForRender(lines: string[]): GraphemeData {\n const splitByGrapheme = this.splitByGrapheme,\n infix = splitByGrapheme ? '' : ' ';\n\n let largestWordWidth = 0;\n\n const data = lines.map((line, lineIndex) => {\n let offset = 0;\n const wordsOrGraphemes = splitByGrapheme\n ? this.graphemeSplit(line)\n : this.wordSplit(line);\n\n if (wordsOrGraphemes.length === 0) {\n return [{ word: [], width: 0 }];\n }\n\n return wordsOrGraphemes.map((word: string) => {\n // if using splitByGrapheme words are already in graphemes.\n const graphemeArray = splitByGrapheme\n ? [word]\n : this.graphemeSplit(word);\n const width = this._measureWord(graphemeArray, lineIndex, offset);\n largestWordWidth = Math.max(width, largestWordWidth);\n offset += graphemeArray.length + infix.length;\n return { word: graphemeArray, width };\n });\n });\n\n return {\n wordsData: data,\n largestWordWidth,\n };\n }\n\n /**\n * Helper function to measure a string of text, given its lineIndex and charIndex offset\n * It gets called when charBounds are not available yet.\n * Override if necessary\n * Use with {@link Textbox#wordSplit}\n *\n * @param {CanvasRenderingContext2D} ctx\n * @param {String} text\n * @param {number} lineIndex\n * @param {number} charOffset\n * @returns {number}\n */\n _measureWord(word: string[], lineIndex: number, charOffset = 0): number {\n let width = 0,\n prevGrapheme;\n const skipLeft = true;\n for (let i = 0, len = word.length; i < len; i++) {\n const box = this._getGraphemeBox(\n word[i],\n lineIndex,\n i + charOffset,\n prevGrapheme,\n skipLeft,\n );\n width += box.kernedWidth;\n prevGrapheme = word[i];\n }\n return width;\n }\n\n /**\n * Override this method to customize word splitting\n * Use with {@link Textbox#_measureWord}\n * @param {string} value\n * @returns {string[]} array of words\n */\n wordSplit(value: string): string[] {\n return value.split(this._wordJoiners);\n }\n\n /**\n * Wraps a line of text using the width of the Textbox as desiredWidth\n * and leveraging the known width o words from GraphemeData\n * @private\n * @param {Number} lineIndex\n * @param {Number} desiredWidth width you want to wrap the line to\n * @param {GraphemeData} graphemeData an object containing all the lines' words width.\n * @param {Number} reservedSpace space to remove from wrapping for custom functionalities\n * @returns {Array} Array of line(s) into which the given text is wrapped\n * to.\n */\n _wrapLine(\n lineIndex: number,\n desiredWidth: number,\n { largestWordWidth, wordsData }: GraphemeData,\n reservedSpace = 0,\n ): string[][] {\n const additionalSpace = this._getWidthOfCharSpacing(),\n splitByGrapheme = this.splitByGrapheme,\n graphemeLines = [],\n infix = splitByGrapheme ? '' : ' ';\n\n let lineWidth = 0,\n line: string[] = [],\n // spaces in different languages?\n offset = 0,\n infixWidth = 0,\n lineJustStarted = true;\n\n desiredWidth -= reservedSpace;\n\n const maxWidth = Math.max(\n desiredWidth,\n largestWordWidth,\n this.dynamicMinWidth,\n );\n // layout words\n const data = wordsData[lineIndex];\n offset = 0;\n let i;\n for (i = 0; i < data.length; i++) {\n const { word, width: wordWidth } = data[i];\n offset += word.length;\n\n lineWidth += infixWidth + wordWidth - additionalSpace;\n if (lineWidth > maxWidth && !lineJustStarted) {\n graphemeLines.push(line);\n line = [];\n lineWidth = wordWidth;\n lineJustStarted = true;\n } else {\n lineWidth += additionalSpace;\n }\n\n if (!lineJustStarted && !splitByGrapheme) {\n line.push(infix);\n }\n line = line.concat(word);\n\n infixWidth = splitByGrapheme\n ? 0\n : this._measureWord([infix], lineIndex, offset);\n offset++;\n lineJustStarted = false;\n }\n\n i && graphemeLines.push(line);\n\n // TODO: this code is probably not necessary anymore.\n // it can be moved out of this function since largestWordWidth is now\n // known in advance\n if (largestWordWidth + reservedSpace > this.dynamicMinWidth) {\n this.dynamicMinWidth = largestWordWidth - additionalSpace + reservedSpace;\n }\n return graphemeLines;\n }\n\n /**\n * Detect if the text line is ended with an hard break\n * text and itext do not have wrapping, return false\n * @param {Number} lineIndex text to split\n * @return {Boolean}\n */\n isEndOfWrapping(lineIndex: number): boolean {\n if (!this._styleMap[lineIndex + 1]) {\n // is last line, return true;\n return true;\n }\n if (this._styleMap[lineIndex + 1].line !== this._styleMap[lineIndex].line) {\n // this is last line before a line break, return true;\n return true;\n }\n return false;\n }\n\n /**\n * Detect if a line has a linebreak and so we need to account for it when moving\n * and counting style.\n * This is important only for splitByGrapheme at the end of wrapping.\n * If we are not wrapping the offset is always 1\n * @return Number\n */\n missingNewlineOffset(lineIndex: number, skipWrapping?: boolean): 0 | 1 {\n if (this.splitByGrapheme && !skipWrapping) {\n return this.isEndOfWrapping(lineIndex) ? 1 : 0;\n }\n return 1;\n }\n\n /**\n * Gets lines of text to render in the Textbox. This function calculates\n * text wrapping on the fly every time it is called.\n * @param {String} text text to split\n * @returns {Array} Array of lines in the Textbox.\n * @override\n */\n _splitTextIntoLines(text: string) {\n const newText = super._splitTextIntoLines(text),\n graphemeLines = this._wrapText(newText.lines, this.width),\n lines = new Array(graphemeLines.length);\n for (let i = 0; i < graphemeLines.length; i++) {\n lines[i] = graphemeLines[i].join('');\n }\n newText.lines = lines;\n newText.graphemeLines = graphemeLines;\n return newText;\n }\n\n getMinWidth() {\n return Math.max(this.minWidth, this.dynamicMinWidth);\n }\n\n _removeExtraneousStyles() {\n const linesToKeep = new Map();\n for (const prop in this._styleMap) {\n const propNumber = parseInt(prop, 10);\n if (this._textLines[propNumber]) {\n const lineIndex = this._styleMap[prop].line;\n linesToKeep.set(`${lineIndex}`, true);\n }\n }\n for (const prop in this.styles) {\n if (!linesToKeep.has(prop)) {\n delete this.styles[prop];\n }\n }\n }\n\n /**\n * Returns object representation of an instance\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} object representation of an instance\n */\n toObject<\n T extends Omit, keyof SProps>,\n K extends keyof T = never,\n >(propertiesToInclude: K[] = []): Pick & SProps {\n return super.toObject([\n 'minWidth',\n 'splitByGrapheme',\n ...propertiesToInclude,\n ] as K[]);\n }\n}\n\nclassRegistry.setClass(Textbox);\n","import { Point } from '../../Point';\nimport type { FabricObject } from '../../shapes/Object/FabricObject';\nimport { makeBoundingBoxFromPoints } from '../../util/misc/boundingBoxFromPoints';\nimport { sendPointToPlane } from '../../util/misc/planeChange';\nimport type { LayoutStrategyResult, StrictLayoutContext } from '../types';\nimport { LayoutStrategy } from './LayoutStrategy';\nimport { getObjectBounds } from './utils';\nimport { classRegistry } from '../../ClassRegistry';\n\n/**\n * Layout will adjust the bounding box to match the clip path bounding box.\n */\nexport class ClipPathLayout extends LayoutStrategy {\n static readonly type = 'clip-path';\n\n shouldPerformLayout(context: StrictLayoutContext): boolean {\n return !!context.target.clipPath && super.shouldPerformLayout(context);\n }\n\n shouldLayoutClipPath() {\n return false;\n }\n\n calcLayoutResult(\n context: StrictLayoutContext,\n objects: FabricObject[],\n ): LayoutStrategyResult | undefined {\n const { target } = context;\n const { clipPath, group } = target;\n if (!clipPath || !this.shouldPerformLayout(context)) {\n return;\n }\n // TODO: remove stroke calculation from this case\n const { width, height } = makeBoundingBoxFromPoints(\n getObjectBounds(target, clipPath as FabricObject),\n );\n const size = new Point(width, height);\n if (clipPath.absolutePositioned) {\n // we want the center point to exist in group's containing plane\n const clipPathCenter = sendPointToPlane(\n clipPath.getRelativeCenterPoint(),\n undefined,\n group ? group.calcTransformMatrix() : undefined,\n );\n return {\n center: clipPathCenter,\n size,\n };\n } else {\n // we want the center point to exist in group's containing plane, so we send it upwards\n const clipPathCenter = clipPath\n .getRelativeCenterPoint()\n .transform(target.calcOwnMatrix(), true);\n if (this.shouldPerformLayout(context)) {\n // the clip path is positioned relative to the group's center which is affected by the bbox\n // so we first calculate the bbox\n const { center = new Point(), correction = new Point() } =\n this.calcBoundingBox(objects, context) || {};\n return {\n center: center.add(clipPathCenter),\n correction: correction.subtract(clipPathCenter),\n size,\n };\n } else {\n return {\n center: target.getRelativeCenterPoint().add(clipPathCenter),\n size,\n };\n }\n }\n }\n}\n\nclassRegistry.setClass(ClipPathLayout);\n","import { Point } from '../../Point';\nimport type {\n InitializationLayoutContext,\n LayoutStrategyResult,\n StrictLayoutContext,\n} from '../types';\nimport { LayoutStrategy } from './LayoutStrategy';\nimport { classRegistry } from '../../ClassRegistry';\n\n/**\n * Layout will keep target's initial size.\n */\nexport class FixedLayout extends LayoutStrategy {\n static readonly type = 'fixed';\n\n /**\n * @override respect target's initial size\n */\n getInitialSize(\n { target }: StrictLayoutContext & InitializationLayoutContext,\n { size }: Pick,\n ): Point {\n return new Point(target.width || size.x, target.height || size.y);\n }\n}\n\nclassRegistry.setClass(FixedLayout);\n","import { LayoutManager } from './LayoutManager';\nimport type { RegistrationContext, StrictLayoutContext } from './types';\nimport type { Group } from '../shapes/Group';\n\n/**\n * Today the LayoutManager class also takes care of subscribing event handlers\n * to update the group layout when the group is interactive and a transform is applied\n * to a child object.\n * The ActiveSelection is never interactive, but it could contain objects from\n * groups that are.\n * The standard LayoutManager would subscribe the children of the activeSelection to\n * perform layout changes to the active selection itself, what we need instead is that\n * the transformation applied to the active selection will trigger changes to the\n * original group of the children ( the one referenced under the parent property )\n * This subclass of the LayoutManager has a single duty to fill the gap of this difference.`\n */\nexport class ActiveSelectionLayoutManager extends LayoutManager {\n subscribeTargets(\n context: RegistrationContext & Partial,\n ): void {\n const activeSelection = context.target;\n const parents = context.targets.reduce((parents, target) => {\n target.parent && parents.add(target.parent);\n return parents;\n }, new Set());\n parents.forEach((parent) => {\n parent.layoutManager.subscribeTargets({\n target: parent,\n targets: [activeSelection],\n });\n });\n }\n\n /**\n * unsubscribe from parent only if all its children were deselected\n */\n unsubscribeTargets(\n context: RegistrationContext & Partial,\n ): void {\n const activeSelection = context.target;\n const selectedObjects = activeSelection.getObjects();\n const parents = context.targets.reduce((parents, target) => {\n target.parent && parents.add(target.parent);\n return parents;\n }, new Set());\n parents.forEach((parent) => {\n !selectedObjects.some((object) => object.parent === parent) &&\n parent.layoutManager.unsubscribeTargets({\n target: parent,\n targets: [activeSelection],\n });\n });\n }\n}\n","import type { ControlRenderingStyleOverride } from '../controls/controlRendering';\nimport { classRegistry } from '../ClassRegistry';\nimport type { GroupProps } from './Group';\nimport { Group } from './Group';\nimport type { FabricObject } from './Object/FabricObject';\nimport {\n LAYOUT_TYPE_ADDED,\n LAYOUT_TYPE_REMOVED,\n} from '../LayoutManager/constants';\nimport type { TClassProperties } from '../typedefs';\nimport { log } from '../util/internals/console';\nimport { ActiveSelectionLayoutManager } from '../LayoutManager/ActiveSelectionLayoutManager';\n\nexport type MultiSelectionStacking = 'canvas-stacking' | 'selection-order';\n\nexport interface ActiveSelectionOptions extends GroupProps {\n multiSelectionStacking: MultiSelectionStacking;\n}\n\nconst activeSelectionDefaultValues: Partial> =\n {\n multiSelectionStacking: 'canvas-stacking',\n };\n\n/**\n * Used by Canvas to manage selection.\n *\n * @example\n * class MyActiveSelection extends ActiveSelection {\n * ...\n * }\n *\n * // override the default `ActiveSelection` class\n * classRegistry.setClass(MyActiveSelection)\n */\nexport class ActiveSelection extends Group {\n static type = 'ActiveSelection';\n\n static ownDefaults: Record = activeSelectionDefaultValues;\n\n static getDefaults(): Record {\n return { ...super.getDefaults(), ...ActiveSelection.ownDefaults };\n }\n\n /**\n * The ActiveSelection needs to use the ActiveSelectionLayoutManager\n * or selections on interactive groups may be broken\n */\n declare layoutManager: ActiveSelectionLayoutManager;\n\n /**\n * controls how selected objects are added during a multiselection event\n * - `canvas-stacking` adds the selected object to the active selection while respecting canvas object stacking order\n * - `selection-order` adds the selected object to the top of the stack,\n * meaning that the stack is ordered by the order in which objects were selected\n * @default `canvas-stacking`\n */\n declare multiSelectionStacking: MultiSelectionStacking;\n\n constructor(\n objects: FabricObject[] = [],\n options: Partial = {},\n ) {\n super();\n Object.assign(this, ActiveSelection.ownDefaults);\n this.setOptions(options);\n const { left, top, layoutManager } = options;\n this.groupInit(objects, {\n left,\n top,\n layoutManager: layoutManager ?? new ActiveSelectionLayoutManager(),\n });\n }\n\n /**\n * @private\n */\n _shouldSetNestedCoords() {\n return true;\n }\n\n /**\n * @private\n * @override we don't want the selection monitor to be active\n */\n __objectSelectionMonitor() {\n // noop\n }\n\n /**\n * Adds objects with respect to {@link multiSelectionStacking}\n * @param targets object to add to selection\n */\n multiSelectAdd(...targets: FabricObject[]) {\n if (this.multiSelectionStacking === 'selection-order') {\n this.add(...targets);\n } else {\n // respect object stacking as it is on canvas\n // perf enhancement for large ActiveSelection: consider a binary search of `isInFrontOf`\n targets.forEach((target) => {\n const index = this._objects.findIndex((obj) => obj.isInFrontOf(target));\n const insertAt =\n index === -1\n ? // `target` is in front of all other objects\n this.size()\n : index;\n this.insertAt(insertAt, target);\n });\n }\n }\n\n /**\n * @override block ancestors/descendants of selected objects from being selected to prevent a circular object tree\n */\n canEnterGroup(object: FabricObject) {\n if (\n this.getObjects().some(\n (o) => o.isDescendantOf(object) || object.isDescendantOf(o),\n )\n ) {\n // prevent circular object tree\n log(\n 'error',\n 'ActiveSelection: circular object trees are not supported, this call has no effect',\n );\n return false;\n }\n\n return super.canEnterGroup(object);\n }\n\n /**\n * Change an object so that it can be part of an active selection.\n * this method is called by multiselectAdd from canvas code.\n * @private\n * @param {FabricObject} object\n * @param {boolean} [removeParentTransform] true if object is in canvas coordinate plane\n */\n enterGroup(object: FabricObject, removeParentTransform?: boolean) {\n // This condition check that the object has currently a group, and the group\n // is also its parent, meaning that is not in an active selection, but is\n // in a normal group.\n if (object.parent && object.parent === object.group) {\n // Disconnect the object from the group functionalities, but keep the ref parent intact\n // for later re-enter\n object.parent._exitGroup(object);\n // in this case the object is probably inside an active selection.\n } else if (object.group && object.parent !== object.group) {\n // in this case group.remove will also clear the old parent reference.\n object.group.remove(object);\n }\n // enter the active selection from a render perspective\n // the object will be in the objects array of both the ActiveSelection and the Group\n // but referenced in the group's _activeObjects so that it won't be rendered twice.\n this._enterGroup(object, removeParentTransform);\n }\n\n /**\n * we want objects to retain their canvas ref when exiting instance\n * @private\n * @param {FabricObject} object\n * @param {boolean} [removeParentTransform] true if object should exit group without applying group's transform to it\n */\n exitGroup(object: FabricObject, removeParentTransform?: boolean) {\n this._exitGroup(object, removeParentTransform);\n // return to parent\n object.parent && object.parent._enterGroup(object, true);\n }\n\n /**\n * @private\n * @param {'added'|'removed'} type\n * @param {FabricObject[]} targets\n */\n _onAfterObjectsChange(type: 'added' | 'removed', targets: FabricObject[]) {\n super._onAfterObjectsChange(type, targets);\n const groups = new Set();\n targets.forEach((object) => {\n const { parent } = object;\n parent && groups.add(parent);\n });\n if (type === LAYOUT_TYPE_REMOVED) {\n // invalidate groups' layout and mark as dirty\n groups.forEach((group) => {\n group._onAfterObjectsChange(LAYOUT_TYPE_ADDED, targets);\n });\n } else {\n // mark groups as dirty\n groups.forEach((group) => {\n group._set('dirty', true);\n });\n }\n }\n\n /**\n * @override remove all objects\n */\n onDeselect() {\n this.removeAll();\n return false;\n }\n\n /**\n * Returns string representation of a group\n * @return {String}\n */\n toString() {\n return `#`;\n }\n\n /**\n * Decide if the object should cache or not. The Active selection never caches\n * @return {Boolean}\n */\n shouldCache() {\n return false;\n }\n\n /**\n * Check if this group or its parent group are caching, recursively up\n * @return {Boolean}\n */\n isOnACache() {\n return false;\n }\n\n /**\n * Renders controls and borders for the object\n * @param {CanvasRenderingContext2D} ctx Context to render on\n * @param {Object} [styleOverride] properties to override the object style\n * @param {Object} [childrenOverride] properties to override the children overrides\n */\n _renderControls(\n ctx: CanvasRenderingContext2D,\n styleOverride?: ControlRenderingStyleOverride,\n childrenOverride?: ControlRenderingStyleOverride,\n ) {\n ctx.save();\n ctx.globalAlpha = this.isMoving ? this.borderOpacityWhenMoving : 1;\n const options = {\n hasControls: false,\n ...childrenOverride,\n forActiveSelection: true,\n };\n for (let i = 0; i < this._objects.length; i++) {\n this._objects[i]._renderControls(ctx, options);\n }\n super._renderControls(ctx, styleOverride);\n ctx.restore();\n }\n}\n\nclassRegistry.setClass(ActiveSelection);\nclassRegistry.setClass(ActiveSelection, 'activeSelection');\n","/**\n * Canvas 2D filter backend.\n */\nimport type { BaseFilter } from './BaseFilter';\nimport type { T2DPipelineState, TPipelineResources } from './typedefs';\n\nexport class Canvas2dFilterBackend {\n /**\n * Experimental. This object is a sort of repository of help layers used to avoid\n * of recreating them during frequent filtering. If you are previewing a filter with\n * a slider you probably do not want to create help layers every filter step.\n * in this object there will be appended some canvases, created once, resized sometimes\n * cleared never. Clearing is left to the developer.\n **/\n resources: TPipelineResources = {};\n\n /**\n * Apply a set of filters against a source image and draw the filtered output\n * to the provided destination canvas.\n *\n * @param {EnhancedFilter} filters The filter to apply.\n * @param {HTMLImageElement|HTMLCanvasElement} sourceElement The source to be filtered.\n * @param {Number} sourceWidth The width of the source input.\n * @param {Number} sourceHeight The height of the source input.\n * @param {HTMLCanvasElement} targetCanvas The destination for filtered output to be drawn.\n */\n applyFilters(\n filters: BaseFilter>[],\n sourceElement: CanvasImageSource,\n sourceWidth: number,\n sourceHeight: number,\n targetCanvas: HTMLCanvasElement,\n ): T2DPipelineState | void {\n const ctx = targetCanvas.getContext('2d', {\n willReadFrequently: true,\n desynchronized: true,\n });\n if (!ctx) {\n return;\n }\n ctx.drawImage(sourceElement, 0, 0, sourceWidth, sourceHeight);\n const imageData = ctx.getImageData(0, 0, sourceWidth, sourceHeight);\n const originalImageData = ctx.getImageData(0, 0, sourceWidth, sourceHeight);\n const pipelineState: T2DPipelineState = {\n sourceWidth,\n sourceHeight,\n imageData,\n originalEl: sourceElement,\n originalImageData,\n canvasEl: targetCanvas,\n ctx,\n filterBackend: this,\n };\n filters.forEach((filter) => {\n filter.applyTo(pipelineState);\n });\n const { imageData: imageDataPostFilter } = pipelineState;\n if (\n imageDataPostFilter.width !== sourceWidth ||\n imageDataPostFilter.height !== sourceHeight\n ) {\n targetCanvas.width = imageDataPostFilter.width;\n targetCanvas.height = imageDataPostFilter.height;\n }\n ctx.putImageData(imageDataPostFilter, 0, 0);\n return pipelineState;\n }\n}\n","import { config } from '../config';\nimport { createCanvasElementFor } from '../util/misc/dom';\nimport type {\n TWebGLPipelineState,\n TProgramCache,\n TTextureCache,\n TPipelineResources,\n} from './typedefs';\nimport type { BaseFilter } from './BaseFilter';\n\nexport class WebGLFilterBackend {\n declare tileSize: number;\n\n /**\n * Define ...\n **/\n aPosition: Float32Array = new Float32Array([0, 0, 0, 1, 1, 0, 1, 1]);\n\n /**\n * If GLPut data is the fastest operation, or if forced, this buffer will be used\n * to transfer the data back in the 2d logic\n **/\n declare imageBuffer?: ArrayBuffer;\n\n declare canvas: HTMLCanvasElement;\n\n /**\n * The Webgl context that will execute the operations for filtering\n **/\n declare gl: WebGLRenderingContext;\n\n /**\n * Keyed map for shader cache\n **/\n declare programCache: TProgramCache;\n\n /**\n * Keyed map for texture cache\n **/\n declare textureCache: TTextureCache;\n\n /**\n * Contains GPU info for debug\n **/\n declare gpuInfo: any;\n\n /**\n * Experimental. This object is a sort of repository of help layers used to avoid\n * of recreating them during frequent filtering. If you are previewing a filter with\n * a slider you probably do not want to create help layers every filter step.\n * in this object there will be appended some canvases, created once, resized sometimes\n * cleared never. Clearing is left to the developer.\n **/\n resources: TPipelineResources = {};\n\n constructor({ tileSize = config.textureSize } = {}) {\n this.tileSize = tileSize;\n this.setupGLContext(tileSize, tileSize);\n this.captureGPUInfo();\n }\n\n /**\n * Setup a WebGL context suitable for filtering, and bind any needed event handlers.\n */\n setupGLContext(width: number, height: number): void {\n this.dispose();\n this.createWebGLCanvas(width, height);\n }\n\n /**\n * Create a canvas element and associated WebGL context and attaches them as\n * class properties to the GLFilterBackend class.\n */\n createWebGLCanvas(width: number, height: number): void {\n const canvas = createCanvasElementFor({ width, height });\n const glOptions = {\n alpha: true,\n premultipliedAlpha: false,\n depth: false,\n stencil: false,\n antialias: false,\n },\n gl = canvas.getContext('webgl', glOptions) as WebGLRenderingContext;\n\n if (!gl) {\n return;\n }\n gl.clearColor(0, 0, 0, 0);\n // this canvas can fire webglcontextlost and webglcontextrestored\n this.canvas = canvas;\n this.gl = gl;\n }\n\n /**\n * Attempts to apply the requested filters to the source provided, drawing the filtered output\n * to the provided target canvas.\n *\n * @param {Array} filters The filters to apply.\n * @param {TexImageSource} source The source to be filtered.\n * @param {Number} width The width of the source input.\n * @param {Number} height The height of the source input.\n * @param {HTMLCanvasElement} targetCanvas The destination for filtered output to be drawn.\n * @param {String|undefined} cacheKey A key used to cache resources related to the source. If\n * omitted, caching will be skipped.\n */\n applyFilters(\n filters: BaseFilter>[],\n source: TexImageSource,\n width: number,\n height: number,\n targetCanvas: HTMLCanvasElement,\n cacheKey?: string,\n ): TWebGLPipelineState | undefined {\n const gl = this.gl;\n const ctx = targetCanvas.getContext('2d');\n if (!gl || !ctx) {\n return;\n }\n let cachedTexture;\n if (cacheKey) {\n cachedTexture = this.getCachedTexture(cacheKey, source);\n }\n const pipelineState: TWebGLPipelineState = {\n originalWidth:\n (source as HTMLImageElement).width ||\n (source as HTMLImageElement).naturalWidth ||\n 0,\n originalHeight:\n (source as HTMLImageElement).height ||\n (source as HTMLImageElement).naturalHeight ||\n 0,\n sourceWidth: width,\n sourceHeight: height,\n destinationWidth: width,\n destinationHeight: height,\n context: gl,\n sourceTexture: this.createTexture(\n gl,\n width,\n height,\n !cachedTexture ? source : undefined,\n ),\n targetTexture: this.createTexture(gl, width, height),\n originalTexture:\n cachedTexture ||\n this.createTexture(\n gl,\n width,\n height,\n !cachedTexture ? source : undefined,\n ),\n passes: filters.length,\n webgl: true,\n aPosition: this.aPosition,\n programCache: this.programCache,\n pass: 0,\n filterBackend: this,\n targetCanvas: targetCanvas,\n };\n const tempFbo = gl.createFramebuffer();\n gl.bindFramebuffer(gl.FRAMEBUFFER, tempFbo);\n filters.forEach((filter: any) => {\n filter && filter.applyTo(pipelineState);\n });\n resizeCanvasIfNeeded(pipelineState);\n this.copyGLTo2D(gl, pipelineState);\n gl.bindTexture(gl.TEXTURE_2D, null);\n gl.deleteTexture(pipelineState.sourceTexture);\n gl.deleteTexture(pipelineState.targetTexture);\n gl.deleteFramebuffer(tempFbo);\n ctx.setTransform(1, 0, 0, 1, 0, 0);\n return pipelineState;\n }\n\n /**\n * Detach event listeners, remove references, and clean up caches.\n */\n dispose() {\n if (this.canvas) {\n // we are disposing, we don't care about the fact\n // that the canvas shouldn't be null.\n // @ts-expect-error disposing\n this.canvas = null;\n // @ts-expect-error disposing\n this.gl = null;\n }\n this.clearWebGLCaches();\n }\n\n /**\n * Wipe out WebGL-related caches.\n */\n clearWebGLCaches() {\n this.programCache = {};\n this.textureCache = {};\n }\n\n /**\n * Create a WebGL texture object.\n *\n * Accepts specific dimensions to initialize the texture to or a source image.\n *\n * @param {WebGLRenderingContext} gl The GL context to use for creating the texture.\n * @param {number} width The width to initialize the texture at.\n * @param {number} height The height to initialize the texture.\n * @param {TexImageSource} textureImageSource A source for the texture data.\n * @param {number} filter gl.NEAREST default or gl.LINEAR filters for the texture.\n * This filter is very useful for LUTs filters. If you need interpolation use gl.LINEAR\n * @returns {WebGLTexture}\n */\n createTexture(\n gl: WebGLRenderingContext,\n width: number,\n height: number,\n textureImageSource?: TexImageSource,\n filter?:\n | WebGLRenderingContextBase['NEAREST']\n | WebGLRenderingContextBase['LINEAR'],\n ): WebGLTexture {\n const {\n NEAREST,\n TEXTURE_2D,\n RGBA,\n UNSIGNED_BYTE,\n CLAMP_TO_EDGE,\n TEXTURE_MAG_FILTER,\n TEXTURE_MIN_FILTER,\n TEXTURE_WRAP_S,\n TEXTURE_WRAP_T,\n } = gl;\n const texture = gl.createTexture();\n gl.bindTexture(TEXTURE_2D, texture);\n gl.texParameteri(TEXTURE_2D, TEXTURE_MAG_FILTER, filter || NEAREST);\n gl.texParameteri(TEXTURE_2D, TEXTURE_MIN_FILTER, filter || NEAREST);\n gl.texParameteri(TEXTURE_2D, TEXTURE_WRAP_S, CLAMP_TO_EDGE);\n gl.texParameteri(TEXTURE_2D, TEXTURE_WRAP_T, CLAMP_TO_EDGE);\n if (textureImageSource) {\n gl.texImage2D(\n TEXTURE_2D,\n 0,\n RGBA,\n RGBA,\n UNSIGNED_BYTE,\n textureImageSource,\n );\n } else {\n gl.texImage2D(\n TEXTURE_2D,\n 0,\n RGBA,\n width,\n height,\n 0,\n RGBA,\n UNSIGNED_BYTE,\n null,\n );\n }\n // disabled because website and issues with different typescript version\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion\n return texture!;\n }\n\n /**\n * Can be optionally used to get a texture from the cache array\n *\n * If an existing texture is not found, a new texture is created and cached.\n *\n * @param {String} uniqueId A cache key to use to find an existing texture.\n * @param {HTMLImageElement|HTMLCanvasElement} textureImageSource A source to use to create the\n * texture cache entry if one does not already exist.\n */\n getCachedTexture(\n uniqueId: string,\n textureImageSource: TexImageSource,\n filter?:\n | WebGLRenderingContextBase['NEAREST']\n | WebGLRenderingContextBase['LINEAR'],\n ): WebGLTexture | null {\n const { textureCache } = this;\n if (textureCache[uniqueId]) {\n return textureCache[uniqueId];\n } else {\n const texture = this.createTexture(\n this.gl,\n (textureImageSource as HTMLImageElement).width,\n (textureImageSource as HTMLImageElement).height,\n textureImageSource,\n filter,\n );\n if (texture) {\n textureCache[uniqueId] = texture;\n }\n return texture;\n }\n }\n\n /**\n * Clear out cached resources related to a source image that has been\n * filtered previously.\n *\n * @param {String} cacheKey The cache key provided when the source image was filtered.\n */\n evictCachesForKey(cacheKey: string) {\n if (this.textureCache[cacheKey]) {\n this.gl.deleteTexture(this.textureCache[cacheKey]);\n delete this.textureCache[cacheKey];\n }\n }\n\n /**\n * Copy an input WebGL canvas on to an output 2D canvas.\n *\n * The WebGL canvas is assumed to be upside down, with the top-left pixel of the\n * desired output image appearing in the bottom-left corner of the WebGL canvas.\n *\n * @param {WebGLRenderingContext} sourceContext The WebGL context to copy from.\n * @param {Object} pipelineState The 2D target canvas to copy on to.\n */\n copyGLTo2D(gl: WebGLRenderingContext, pipelineState: TWebGLPipelineState) {\n const glCanvas = gl.canvas,\n targetCanvas = pipelineState.targetCanvas,\n ctx = targetCanvas.getContext('2d');\n if (!ctx) {\n return;\n }\n ctx.translate(0, targetCanvas.height); // move it down again\n ctx.scale(1, -1); // vertical flip\n // where is my image on the big glcanvas?\n const sourceY = glCanvas.height - targetCanvas.height;\n ctx.drawImage(\n glCanvas,\n 0,\n sourceY,\n targetCanvas.width,\n targetCanvas.height,\n 0,\n 0,\n targetCanvas.width,\n targetCanvas.height,\n );\n }\n\n /**\n * Copy an input WebGL canvas on to an output 2D canvas using 2d canvas' putImageData\n * API. Measurably faster than using ctx.drawImage in Firefox (version 54 on OSX Sierra).\n *\n * @param {WebGLRenderingContext} sourceContext The WebGL context to copy from.\n * @param {HTMLCanvasElement} targetCanvas The 2D target canvas to copy on to.\n * @param {Object} pipelineState The 2D target canvas to copy on to.\n */\n copyGLTo2DPutImageData(\n this: Required,\n gl: WebGLRenderingContext,\n pipelineState: TWebGLPipelineState,\n ) {\n const targetCanvas = pipelineState.targetCanvas,\n ctx = targetCanvas.getContext('2d'),\n dWidth = pipelineState.destinationWidth,\n dHeight = pipelineState.destinationHeight,\n numBytes = dWidth * dHeight * 4;\n if (!ctx) {\n return;\n }\n const u8 = new Uint8Array(this.imageBuffer, 0, numBytes);\n const u8Clamped = new Uint8ClampedArray(this.imageBuffer, 0, numBytes);\n\n gl.readPixels(0, 0, dWidth, dHeight, gl.RGBA, gl.UNSIGNED_BYTE, u8);\n const imgData = new ImageData(u8Clamped, dWidth, dHeight);\n ctx.putImageData(imgData, 0, 0);\n }\n\n /**\n * Attempt to extract GPU information strings from a WebGL context.\n *\n * Useful information when debugging or blacklisting specific GPUs.\n *\n * @returns {Object} A GPU info object with renderer and vendor strings.\n */\n captureGPUInfo() {\n if (this.gpuInfo) {\n return this.gpuInfo;\n }\n const gl = this.gl,\n gpuInfo = { renderer: '', vendor: '' };\n if (!gl) {\n return gpuInfo;\n }\n const ext = gl.getExtension('WEBGL_debug_renderer_info');\n if (ext) {\n const renderer = gl.getParameter(ext.UNMASKED_RENDERER_WEBGL);\n const vendor = gl.getParameter(ext.UNMASKED_VENDOR_WEBGL);\n if (renderer) {\n gpuInfo.renderer = renderer.toLowerCase();\n }\n if (vendor) {\n gpuInfo.vendor = vendor.toLowerCase();\n }\n }\n this.gpuInfo = gpuInfo;\n return gpuInfo;\n }\n}\n\nfunction resizeCanvasIfNeeded(pipelineState: TWebGLPipelineState): void {\n const targetCanvas = pipelineState.targetCanvas,\n width = targetCanvas.width,\n height = targetCanvas.height,\n dWidth = pipelineState.destinationWidth,\n dHeight = pipelineState.destinationHeight;\n\n if (width !== dWidth || height !== dHeight) {\n targetCanvas.width = dWidth;\n targetCanvas.height = dHeight;\n }\n}\n","import { config } from '../config';\nimport { getEnv } from '../env';\nimport { createCanvasElement } from '../util/misc/dom';\nimport { Canvas2dFilterBackend } from './Canvas2dFilterBackend';\nimport { WebGLFilterBackend } from './WebGLFilterBackend';\n\nexport type FilterBackend = WebGLFilterBackend | Canvas2dFilterBackend;\n\nlet filterBackend: FilterBackend;\n\n/**\n * Verifies if it is possible to initialize webgl or fallback on a canvas2d filtering backend\n */\nexport function initFilterBackend(): FilterBackend {\n const { WebGLProbe } = getEnv();\n WebGLProbe.queryWebGL(createCanvasElement());\n if (config.enableGLFiltering && WebGLProbe.isSupported(config.textureSize)) {\n return new WebGLFilterBackend({ tileSize: config.textureSize });\n } else {\n return new Canvas2dFilterBackend();\n }\n}\n\n/**\n * Get the current fabricJS filter backend or initialize one if not available yet\n * @param [strict] pass `true` to create the backend if it wasn't created yet (default behavior),\n * pass `false` to get the backend ref without mutating it\n */\nexport function getFilterBackend(strict = true): FilterBackend {\n if (!filterBackend && strict) {\n filterBackend = initFilterBackend();\n }\n return filterBackend;\n}\n\nexport function setFilterBackend(backend: FilterBackend) {\n filterBackend = backend;\n}\n","import { getFabricDocument, getEnv } from '../env';\nimport type { BaseFilter } from '../filters/BaseFilter';\nimport { getFilterBackend } from '../filters/FilterBackend';\nimport { SHARED_ATTRIBUTES } from '../parser/attributes';\nimport { parseAttributes } from '../parser/parseAttributes';\nimport type {\n TClassProperties,\n TCrossOrigin,\n TSize,\n Abortable,\n TOptions,\n} from '../typedefs';\nimport { uid } from '../util/internals/uid';\nimport { createCanvasElementFor } from '../util/misc/dom';\nimport { findScaleToCover, findScaleToFit } from '../util/misc/findScaleTo';\nimport type { LoadImageOptions } from '../util/misc/objectEnlive';\nimport {\n enlivenObjectEnlivables,\n enlivenObjects,\n loadImage,\n} from '../util/misc/objectEnlive';\nimport { parsePreserveAspectRatioAttribute } from '../util/misc/svgParsing';\nimport { classRegistry } from '../ClassRegistry';\nimport { FabricObject, cacheProperties } from './Object/FabricObject';\nimport type { FabricObjectProps, SerializedObjectProps } from './Object/types';\nimport type { ObjectEvents } from '../EventTypeDefs';\nimport { WebGLFilterBackend } from '../filters/WebGLFilterBackend';\nimport { FILL, NONE } from '../constants';\nimport { getDocumentFromElement } from '../util/dom_misc';\nimport type { CSSRules } from '../parser/typedefs';\nimport type { Resize, ResizeSerializedProps } from '../filters/Resize';\nimport type { TCachedFabricObject } from './Object/Object';\nimport { log } from '../util/internals/console';\n\n// @todo Would be nice to have filtering code not imported directly.\n\nexport type ImageSource =\n | HTMLImageElement\n | HTMLVideoElement\n | HTMLCanvasElement;\n\ninterface UniqueImageProps {\n srcFromAttribute: boolean;\n minimumScaleTrigger: number;\n cropX: number;\n cropY: number;\n imageSmoothing: boolean;\n filters: BaseFilter>[];\n resizeFilter?: Resize;\n}\n\nexport const imageDefaultValues: Partial> = {\n strokeWidth: 0,\n srcFromAttribute: false,\n minimumScaleTrigger: 0.5,\n cropX: 0,\n cropY: 0,\n imageSmoothing: true,\n};\n\nexport interface SerializedImageProps extends SerializedObjectProps {\n src: string;\n crossOrigin: TCrossOrigin;\n filters: any[];\n resizeFilter?: ResizeSerializedProps;\n cropX: number;\n cropY: number;\n}\n\nexport interface ImageProps extends FabricObjectProps, UniqueImageProps {}\n\nconst IMAGE_PROPS = ['cropX', 'cropY'] as const;\n\n/**\n * @see {@link http://fabric5.fabricjs.com/fabric-intro-part-1#images}\n */\nexport class FabricImage<\n Props extends TOptions = Partial,\n SProps extends SerializedImageProps = SerializedImageProps,\n EventSpec extends ObjectEvents = ObjectEvents,\n >\n extends FabricObject\n implements ImageProps\n{\n /**\n * When calling {@link FabricImage.getSrc}, return value from element src with `element.getAttribute('src')`.\n * This allows for relative urls as image src.\n * @since 2.7.0\n * @type Boolean\n * @default false\n */\n declare srcFromAttribute: boolean;\n\n /**\n * private\n * contains last value of scaleX to detect\n * if the Image got resized after the last Render\n * @type Number\n */\n protected _lastScaleX = 1;\n\n /**\n * private\n * contains last value of scaleY to detect\n * if the Image got resized after the last Render\n * @type Number\n */\n protected _lastScaleY = 1;\n\n /**\n * private\n * contains last value of scaling applied by the apply filter chain\n * @type Number\n */\n protected _filterScalingX = 1;\n\n /**\n * private\n * contains last value of scaling applied by the apply filter chain\n * @type Number\n */\n protected _filterScalingY = 1;\n\n /**\n * minimum scale factor under which any resizeFilter is triggered to resize the image\n * 0 will disable the automatic resize. 1 will trigger automatically always.\n * number bigger than 1 are not implemented yet.\n * @type Number\n */\n declare minimumScaleTrigger: number;\n\n /**\n * key used to retrieve the texture representing this image\n * @since 2.0.0\n * @type String\n */\n declare cacheKey: string;\n\n /**\n * Image crop in pixels from original image size.\n * @since 2.0.0\n * @type Number\n */\n declare cropX: number;\n\n /**\n * Image crop in pixels from original image size.\n * @since 2.0.0\n * @type Number\n */\n declare cropY: number;\n\n /**\n * Indicates whether this canvas will use image smoothing when painting this image.\n * Also influence if the cacheCanvas for this image uses imageSmoothing\n * @since 4.0.0-beta.11\n * @type Boolean\n */\n declare imageSmoothing: boolean;\n\n declare preserveAspectRatio: string;\n\n declare protected src: string;\n\n declare filters: BaseFilter>[];\n declare resizeFilter: Resize;\n\n declare _element: ImageSource;\n declare _filteredEl?: HTMLCanvasElement;\n declare _originalElement: ImageSource;\n\n static type = 'Image';\n\n static cacheProperties = [...cacheProperties, ...IMAGE_PROPS];\n\n static ownDefaults = imageDefaultValues;\n\n static getDefaults(): Record {\n return {\n ...super.getDefaults(),\n ...FabricImage.ownDefaults,\n };\n }\n /**\n * Constructor\n * Image can be initialized with any canvas drawable or a string.\n * The string should be a url and will be loaded as an image.\n * Canvas and Image element work out of the box, while videos require extra code to work.\n * Please check video element events for seeking.\n * @param {ImageSource | string} element Image element\n * @param {Object} [options] Options object\n */\n constructor(elementId: string, options?: Props);\n constructor(element: ImageSource, options?: Props);\n constructor(arg0: ImageSource | string, options?: Props) {\n super();\n this.filters = [];\n Object.assign(this, FabricImage.ownDefaults);\n this.setOptions(options);\n this.cacheKey = `texture${uid()}`;\n this.setElement(\n typeof arg0 === 'string'\n ? ((\n (this.canvas && getDocumentFromElement(this.canvas.getElement())) ||\n getFabricDocument()\n ).getElementById(arg0) as ImageSource)\n : arg0,\n options,\n );\n }\n\n /**\n * Returns image element which this instance if based on\n */\n getElement() {\n return this._element;\n }\n\n /**\n * Sets image element for this instance to a specified one.\n * If filters defined they are applied to new image.\n * You might need to call `canvas.renderAll` and `object.setCoords` after replacing, to render new image and update controls area.\n * @param {HTMLImageElement} element\n * @param {Partial} [size] Options object\n */\n setElement(element: ImageSource, size: Partial = {}) {\n this.removeTexture(this.cacheKey);\n this.removeTexture(`${this.cacheKey}_filtered`);\n this._element = element;\n this._originalElement = element;\n this._setWidthHeight(size);\n if (this.filters.length !== 0) {\n this.applyFilters();\n }\n // resizeFilters work on the already filtered copy.\n // we need to apply resizeFilters AFTER normal filters.\n // applyResizeFilters is run more often than normal filters\n // and is triggered by user interactions rather than dev code\n if (this.resizeFilter) {\n this.applyResizeFilters();\n }\n }\n\n /**\n * Delete a single texture if in webgl mode\n */\n removeTexture(key: string) {\n const backend = getFilterBackend(false);\n if (backend instanceof WebGLFilterBackend) {\n backend.evictCachesForKey(key);\n }\n }\n\n /**\n * Delete textures, reference to elements and eventually JSDOM cleanup\n */\n dispose() {\n super.dispose();\n this.removeTexture(this.cacheKey);\n this.removeTexture(`${this.cacheKey}_filtered`);\n this._cacheContext = null;\n (\n ['_originalElement', '_element', '_filteredEl', '_cacheCanvas'] as const\n ).forEach((elementKey) => {\n const el = this[elementKey];\n el && getEnv().dispose(el);\n // @ts-expect-error disposing\n this[elementKey] = undefined;\n });\n }\n\n /**\n * Get the crossOrigin value (of the corresponding image element)\n */\n getCrossOrigin(): string | null {\n return (\n this._originalElement &&\n ((this._originalElement as any).crossOrigin || null)\n );\n }\n\n /**\n * Returns original size of an image\n */\n getOriginalSize() {\n const element = this.getElement() as any;\n if (!element) {\n return {\n width: 0,\n height: 0,\n };\n }\n return {\n width: element.naturalWidth || element.width,\n height: element.naturalHeight || element.height,\n };\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _stroke(ctx: CanvasRenderingContext2D) {\n if (!this.stroke || this.strokeWidth === 0) {\n return;\n }\n const w = this.width / 2,\n h = this.height / 2;\n ctx.beginPath();\n ctx.moveTo(-w, -h);\n ctx.lineTo(w, -h);\n ctx.lineTo(w, h);\n ctx.lineTo(-w, h);\n ctx.lineTo(-w, -h);\n ctx.closePath();\n }\n\n /**\n * Returns object representation of an instance\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} Object representation of an instance\n */\n toObject<\n T extends Omit, keyof SProps>,\n K extends keyof T = never,\n >(propertiesToInclude: K[] = []): Pick & SProps {\n const filters: Record[] = [];\n this.filters.forEach((filterObj) => {\n filterObj && filters.push(filterObj.toObject());\n });\n return {\n ...super.toObject([...IMAGE_PROPS, ...propertiesToInclude]),\n src: this.getSrc(),\n crossOrigin: this.getCrossOrigin(),\n filters,\n ...(this.resizeFilter\n ? { resizeFilter: this.resizeFilter.toObject() }\n : {}),\n };\n }\n\n /**\n * Returns true if an image has crop applied, inspecting values of cropX,cropY,width,height.\n * @return {Boolean}\n */\n hasCrop() {\n return (\n !!this.cropX ||\n !!this.cropY ||\n this.width < this._element.width ||\n this.height < this._element.height\n );\n }\n\n /**\n * Returns svg representation of an instance\n * @return {string[]} an array of strings with the specific svg representation\n * of the instance\n */\n _toSVG() {\n const imageMarkup: string[] = [],\n element = this._element,\n x = -this.width / 2,\n y = -this.height / 2;\n let svgString: string[] = [],\n strokeSvg: string[] = [],\n clipPath = '',\n imageRendering = '';\n if (!element) {\n return [];\n }\n if (this.hasCrop()) {\n const clipPathId = uid();\n svgString.push(\n '\\n',\n '\\t\\n',\n '\\n',\n );\n clipPath = ' clip-path=\"url(#imageCrop_' + clipPathId + ')\" ';\n }\n if (!this.imageSmoothing) {\n imageRendering = ' image-rendering=\"optimizeSpeed\"';\n }\n imageMarkup.push(\n '\\t element with actual transformation, then offsetting object to the top/left\n // so that object's center aligns with container's left/top\n }\" width=\"${\n element.width || (element as HTMLImageElement).naturalWidth\n }\" height=\"${\n element.height || (element as HTMLImageElement).naturalHeight\n }\"${imageRendering}${clipPath}>\\n`,\n );\n\n if (this.stroke || this.strokeDashArray) {\n const origFill = this.fill;\n this.fill = null;\n strokeSvg = [\n `\\t\\n`,\n ];\n this.fill = origFill;\n }\n if (this.paintFirst !== FILL) {\n svgString = svgString.concat(strokeSvg, imageMarkup);\n } else {\n svgString = svgString.concat(imageMarkup, strokeSvg);\n }\n return svgString;\n }\n\n /**\n * Returns source of an image\n * @param {Boolean} filtered indicates if the src is needed for svg\n * @return {String} Source of an image\n */\n getSrc(filtered?: boolean): string {\n const element = filtered ? this._element : this._originalElement;\n if (element) {\n if ((element as HTMLCanvasElement).toDataURL) {\n return (element as HTMLCanvasElement).toDataURL();\n }\n\n if (this.srcFromAttribute) {\n return element.getAttribute('src') || '';\n } else {\n return (element as HTMLImageElement).src;\n }\n } else {\n return this.src || '';\n }\n }\n\n /**\n * Alias for getSrc\n * @param filtered\n * @deprecated\n */\n getSvgSrc(filtered?: boolean) {\n return this.getSrc(filtered);\n }\n\n /**\n * Loads and sets source of an image\\\n * **IMPORTANT**: It is recommended to abort loading tasks before calling this method to prevent race conditions and unnecessary networking\n * @param {String} src Source string (URL)\n * @param {LoadImageOptions} [options] Options object\n */\n setSrc(src: string, { crossOrigin, signal }: LoadImageOptions = {}) {\n return loadImage(src, { crossOrigin, signal }).then((img) => {\n typeof crossOrigin !== 'undefined' && this.set({ crossOrigin });\n this.setElement(img);\n });\n }\n\n /**\n * Returns string representation of an instance\n * @return {String} String representation of an instance\n */\n toString() {\n return `#`;\n }\n\n applyResizeFilters() {\n const filter = this.resizeFilter,\n minimumScale = this.minimumScaleTrigger,\n objectScale = this.getTotalObjectScaling(),\n scaleX = objectScale.x,\n scaleY = objectScale.y,\n elementToFilter = this._filteredEl || this._originalElement;\n if (this.group) {\n this.set('dirty', true);\n }\n if (!filter || (scaleX > minimumScale && scaleY > minimumScale)) {\n this._element = elementToFilter;\n this._filterScalingX = 1;\n this._filterScalingY = 1;\n this._lastScaleX = scaleX;\n this._lastScaleY = scaleY;\n return;\n }\n const canvasEl = createCanvasElementFor(elementToFilter),\n { width, height } = elementToFilter;\n this._element = canvasEl;\n this._lastScaleX = filter.scaleX = scaleX;\n this._lastScaleY = filter.scaleY = scaleY;\n getFilterBackend().applyFilters(\n [filter],\n elementToFilter,\n width,\n height,\n this._element,\n );\n this._filterScalingX = canvasEl.width / this._originalElement.width;\n this._filterScalingY = canvasEl.height / this._originalElement.height;\n }\n\n /**\n * Applies filters assigned to this image (from \"filters\" array) or from filter param\n * @param {Array} filters to be applied\n * @param {Boolean} forResizing specify if the filter operation is a resize operation\n */\n applyFilters(\n filters: BaseFilter>[] = this.filters || [],\n ) {\n filters = filters.filter((filter) => filter && !filter.isNeutralState());\n this.set('dirty', true);\n\n // needs to clear out or WEBGL will not resize correctly\n this.removeTexture(`${this.cacheKey}_filtered`);\n\n if (filters.length === 0) {\n this._element = this._originalElement;\n // this is unsafe and needs to be rethinkend\n this._filteredEl = undefined;\n this._filterScalingX = 1;\n this._filterScalingY = 1;\n return;\n }\n\n const imgElement = this._originalElement,\n sourceWidth =\n (imgElement as HTMLImageElement).naturalWidth || imgElement.width,\n sourceHeight =\n (imgElement as HTMLImageElement).naturalHeight || imgElement.height;\n\n if (this._element === this._originalElement) {\n // if the _element a reference to _originalElement\n // we need to create a new element to host the filtered pixels\n const canvasEl = createCanvasElementFor({\n width: sourceWidth,\n height: sourceHeight,\n });\n this._element = canvasEl;\n this._filteredEl = canvasEl;\n } else if (this._filteredEl) {\n // if the _element is it own element,\n // and we also have a _filteredEl, then we clean up _filteredEl\n // and we assign it to _element.\n // in this way we invalidate the eventual old resize filtered element\n this._element = this._filteredEl;\n this._filteredEl\n .getContext('2d')!\n .clearRect(0, 0, sourceWidth, sourceHeight);\n // we also need to resize again at next renderAll, so remove saved _lastScaleX/Y\n this._lastScaleX = 1;\n this._lastScaleY = 1;\n }\n getFilterBackend().applyFilters(\n filters,\n this._originalElement,\n sourceWidth,\n sourceHeight,\n this._element as HTMLCanvasElement,\n this.cacheKey,\n );\n if (\n this._originalElement.width !== this._element.width ||\n this._originalElement.height !== this._element.height\n ) {\n this._filterScalingX = this._element.width / this._originalElement.width;\n this._filterScalingY =\n this._element.height / this._originalElement.height;\n }\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _render(ctx: CanvasRenderingContext2D) {\n ctx.imageSmoothingEnabled = this.imageSmoothing;\n if (this.isMoving !== true && this.resizeFilter && this._needsResize()) {\n this.applyResizeFilters();\n }\n this._stroke(ctx);\n this._renderPaintInOrder(ctx);\n }\n\n /**\n * Paint the cached copy of the object on the target context.\n * it will set the imageSmoothing for the draw operation\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n drawCacheOnCanvas(\n this: TCachedFabricObject,\n ctx: CanvasRenderingContext2D,\n ) {\n ctx.imageSmoothingEnabled = this.imageSmoothing;\n super.drawCacheOnCanvas(ctx);\n }\n\n /**\n * Decide if the FabricImage should cache or not. Create its own cache level\n * needsItsOwnCache should be used when the object drawing method requires\n * a cache step.\n * Generally you do not cache objects in groups because the group outside is cached.\n * This is the special Image version where we would like to avoid caching where possible.\n * Essentially images do not benefit from caching. They may require caching, and in that\n * case we do it. Also caching an image usually ends in a loss of details.\n * A full performance audit should be done.\n * @return {Boolean}\n */\n shouldCache() {\n return this.needsItsOwnCache();\n }\n\n _renderFill(ctx: CanvasRenderingContext2D) {\n const elementToDraw = this._element;\n if (!elementToDraw) {\n return;\n }\n const scaleX = this._filterScalingX,\n scaleY = this._filterScalingY,\n w = this.width,\n h = this.height,\n // crop values cannot be lesser than 0.\n cropX = Math.max(this.cropX, 0),\n cropY = Math.max(this.cropY, 0),\n elWidth =\n (elementToDraw as HTMLImageElement).naturalWidth || elementToDraw.width,\n elHeight =\n (elementToDraw as HTMLImageElement).naturalHeight ||\n elementToDraw.height,\n sX = cropX * scaleX,\n sY = cropY * scaleY,\n // the width height cannot exceed element width/height, starting from the crop offset.\n sW = Math.min(w * scaleX, elWidth - sX),\n sH = Math.min(h * scaleY, elHeight - sY),\n x = -w / 2,\n y = -h / 2,\n maxDestW = Math.min(w, elWidth / scaleX - cropX),\n maxDestH = Math.min(h, elHeight / scaleY - cropY);\n\n elementToDraw &&\n ctx.drawImage(elementToDraw, sX, sY, sW, sH, x, y, maxDestW, maxDestH);\n }\n\n /**\n * needed to check if image needs resize\n * @private\n */\n _needsResize() {\n const scale = this.getTotalObjectScaling();\n return scale.x !== this._lastScaleX || scale.y !== this._lastScaleY;\n }\n\n /**\n * @private\n * @deprecated unused\n */\n _resetWidthHeight() {\n this.set(this.getOriginalSize());\n }\n\n /**\n * @private\n * Set the width and the height of the image object, using the element or the\n * options.\n */\n _setWidthHeight({ width, height }: Partial = {}) {\n const size = this.getOriginalSize();\n this.width = width || size.width;\n this.height = height || size.height;\n }\n\n /**\n * Calculate offset for center and scale factor for the image in order to respect\n * the preserveAspectRatio attribute\n * @private\n */\n parsePreserveAspectRatioAttribute() {\n const pAR = parsePreserveAspectRatioAttribute(\n this.preserveAspectRatio || '',\n ),\n pWidth = this.width,\n pHeight = this.height,\n parsedAttributes = { width: pWidth, height: pHeight };\n let rWidth = this._element.width,\n rHeight = this._element.height,\n scaleX = 1,\n scaleY = 1,\n offsetLeft = 0,\n offsetTop = 0,\n cropX = 0,\n cropY = 0,\n offset;\n\n if (pAR && (pAR.alignX !== NONE || pAR.alignY !== NONE)) {\n if (pAR.meetOrSlice === 'meet') {\n scaleX = scaleY = findScaleToFit(this._element, parsedAttributes);\n offset = (pWidth - rWidth * scaleX) / 2;\n if (pAR.alignX === 'Min') {\n offsetLeft = -offset;\n }\n if (pAR.alignX === 'Max') {\n offsetLeft = offset;\n }\n offset = (pHeight - rHeight * scaleY) / 2;\n if (pAR.alignY === 'Min') {\n offsetTop = -offset;\n }\n if (pAR.alignY === 'Max') {\n offsetTop = offset;\n }\n }\n if (pAR.meetOrSlice === 'slice') {\n scaleX = scaleY = findScaleToCover(this._element, parsedAttributes);\n offset = rWidth - pWidth / scaleX;\n if (pAR.alignX === 'Mid') {\n cropX = offset / 2;\n }\n if (pAR.alignX === 'Max') {\n cropX = offset;\n }\n offset = rHeight - pHeight / scaleY;\n if (pAR.alignY === 'Mid') {\n cropY = offset / 2;\n }\n if (pAR.alignY === 'Max') {\n cropY = offset;\n }\n rWidth = pWidth / scaleX;\n rHeight = pHeight / scaleY;\n }\n } else {\n scaleX = pWidth / rWidth;\n scaleY = pHeight / rHeight;\n }\n return {\n width: rWidth,\n height: rHeight,\n scaleX,\n scaleY,\n offsetLeft,\n offsetTop,\n cropX,\n cropY,\n };\n }\n\n /**\n * List of attribute names to account for when parsing SVG element (used by {@link FabricImage.fromElement})\n * @see {@link http://www.w3.org/TR/SVG/struct.html#ImageElement}\n */\n static ATTRIBUTE_NAMES = [\n ...SHARED_ATTRIBUTES,\n 'x',\n 'y',\n 'width',\n 'height',\n 'preserveAspectRatio',\n 'xlink:href',\n 'href',\n 'crossOrigin',\n 'image-rendering',\n ];\n\n /**\n * Creates an instance of FabricImage from its object representation\n * @param {Object} object Object to create an instance from\n * @param {object} [options] Options object\n * @param {AbortSignal} [options.signal] handle aborting, see https://developer.mozilla.org/en-US/docs/Web/API/AbortController/signal\n * @returns {Promise}\n */\n static fromObject>(\n { filters: f, resizeFilter: rf, src, crossOrigin, type, ...object }: T,\n options?: Abortable,\n ) {\n return Promise.all([\n loadImage(src!, { ...options, crossOrigin }),\n f && enlivenObjects>(f, options),\n // redundant - handled by enlivenObjectEnlivables, but nicely explicit\n rf ? enlivenObjects([rf], options) : [],\n enlivenObjectEnlivables(object, options),\n ]).then(([el, filters = [], [resizeFilter], hydratedProps = {}]) => {\n return new this(el, {\n ...object,\n // TODO: passing src creates a difference between image creation and restoring from JSON\n src,\n filters,\n resizeFilter,\n ...hydratedProps,\n });\n });\n }\n\n /**\n * Creates an instance of Image from an URL string\n * @param {String} url URL to create an image from\n * @param {LoadImageOptions} [options] Options object\n * @returns {Promise}\n */\n static fromURL>(\n url: string,\n { crossOrigin = null, signal }: LoadImageOptions = {},\n imageOptions?: T,\n ): Promise {\n return loadImage(url, { crossOrigin, signal }).then(\n (img) => new this(img, imageOptions),\n );\n }\n\n /**\n * Returns {@link FabricImage} instance from an SVG element\n * @param {HTMLElement} element Element to parse\n * @param {Object} [options] Options object\n * @param {AbortSignal} [options.signal] handle aborting, see https://developer.mozilla.org/en-US/docs/Web/API/AbortController/signal\n * @param {Function} callback Callback to execute when Image object is created\n */\n static async fromElement(\n element: HTMLElement,\n options: Abortable = {},\n cssRules?: CSSRules,\n ) {\n const parsedAttributes = parseAttributes(\n element,\n this.ATTRIBUTE_NAMES,\n cssRules,\n );\n return this.fromURL(\n parsedAttributes['xlink:href'] || parsedAttributes['href'],\n options,\n parsedAttributes,\n ).catch((err) => {\n log('log', 'Unable to parse Image', err);\n return null;\n });\n }\n}\n\nclassRegistry.setClass(FabricImage);\nclassRegistry.setSVGClass(FabricImage);\n","import { svgNS } from './constants';\nimport {\n parsePreserveAspectRatioAttribute,\n parseUnit,\n} from '../util/misc/svgParsing';\nimport { svgViewBoxElementsRegEx, reViewBoxAttrValue } from './constants';\nimport { NONE } from '../constants';\n\nexport type ParsedViewboxTransform = Partial<{\n width: number;\n height: number;\n minX: number;\n minY: number;\n viewBoxWidth: number;\n viewBoxHeight: number;\n}>;\n\n/**\n * Add a element that envelop all child elements and makes the viewbox transformMatrix descend on all elements\n */\nexport function applyViewboxTransform(\n element: Element,\n): ParsedViewboxTransform {\n if (!svgViewBoxElementsRegEx.test(element.nodeName)) {\n return {};\n }\n const viewBoxAttr: string | null = element.getAttribute('viewBox');\n let scaleX = 1;\n let scaleY = 1;\n let minX = 0;\n let minY = 0;\n let matrix;\n let el;\n const widthAttr = element.getAttribute('width');\n const heightAttr = element.getAttribute('height');\n const x = element.getAttribute('x') || 0;\n const y = element.getAttribute('y') || 0;\n const goodViewbox = viewBoxAttr && reViewBoxAttrValue.test(viewBoxAttr);\n const missingViewBox = !goodViewbox;\n const missingDimAttr =\n !widthAttr || !heightAttr || widthAttr === '100%' || heightAttr === '100%';\n\n let translateMatrix = '';\n let widthDiff = 0;\n let heightDiff = 0;\n\n if (missingViewBox) {\n if (\n (x || y) &&\n element.parentNode &&\n element.parentNode.nodeName !== '#document'\n ) {\n translateMatrix =\n ' translate(' + parseUnit(x || '0') + ' ' + parseUnit(y || '0') + ') ';\n matrix = (element.getAttribute('transform') || '') + translateMatrix;\n element.setAttribute('transform', matrix);\n element.removeAttribute('x');\n element.removeAttribute('y');\n }\n }\n\n if (missingViewBox && missingDimAttr) {\n return {\n width: 0,\n height: 0,\n };\n }\n\n const parsedDim: ParsedViewboxTransform = {\n width: 0,\n height: 0,\n };\n\n if (missingViewBox) {\n parsedDim.width = parseUnit(widthAttr!);\n parsedDim.height = parseUnit(heightAttr!);\n // set a transform for elements that have x y and are inner(only) SVGs\n return parsedDim;\n }\n\n const pasedViewBox = viewBoxAttr.match(reViewBoxAttrValue)!;\n minX = -parseFloat(pasedViewBox[1]);\n minY = -parseFloat(pasedViewBox[2]);\n const viewBoxWidth = parseFloat(pasedViewBox[3]);\n const viewBoxHeight = parseFloat(pasedViewBox[4]);\n parsedDim.minX = minX;\n parsedDim.minY = minY;\n parsedDim.viewBoxWidth = viewBoxWidth;\n parsedDim.viewBoxHeight = viewBoxHeight;\n if (!missingDimAttr) {\n parsedDim.width = parseUnit(widthAttr);\n parsedDim.height = parseUnit(heightAttr);\n scaleX = parsedDim.width / viewBoxWidth;\n scaleY = parsedDim.height / viewBoxHeight;\n } else {\n parsedDim.width = viewBoxWidth;\n parsedDim.height = viewBoxHeight;\n }\n\n // default is to preserve aspect ratio\n const preserveAspectRatio = parsePreserveAspectRatioAttribute(\n element.getAttribute('preserveAspectRatio') || '',\n );\n if (preserveAspectRatio.alignX !== NONE) {\n //translate all container for the effect of Mid, Min, Max\n if (preserveAspectRatio.meetOrSlice === 'meet') {\n scaleY = scaleX = scaleX > scaleY ? scaleY : scaleX;\n // calculate additional translation to move the viewbox\n }\n if (preserveAspectRatio.meetOrSlice === 'slice') {\n scaleY = scaleX = scaleX > scaleY ? scaleX : scaleY;\n // calculate additional translation to move the viewbox\n }\n widthDiff = parsedDim.width - viewBoxWidth * scaleX;\n heightDiff = parsedDim.height - viewBoxHeight * scaleX;\n if (preserveAspectRatio.alignX === 'Mid') {\n widthDiff /= 2;\n }\n if (preserveAspectRatio.alignY === 'Mid') {\n heightDiff /= 2;\n }\n if (preserveAspectRatio.alignX === 'Min') {\n widthDiff = 0;\n }\n if (preserveAspectRatio.alignY === 'Min') {\n heightDiff = 0;\n }\n }\n\n if (\n scaleX === 1 &&\n scaleY === 1 &&\n minX === 0 &&\n minY === 0 &&\n x === 0 &&\n y === 0\n ) {\n return parsedDim;\n }\n if ((x || y) && element.parentNode!.nodeName !== '#document') {\n translateMatrix =\n ' translate(' + parseUnit(x || '0') + ' ' + parseUnit(y || '0') + ') ';\n }\n\n matrix =\n translateMatrix +\n ' matrix(' +\n scaleX +\n ' 0' +\n ' 0 ' +\n scaleY +\n ' ' +\n (minX * scaleX + widthDiff) +\n ' ' +\n (minY * scaleY + heightDiff) +\n ') ';\n // seems unused.\n // parsedDim.viewboxTransform = parseTransformAttribute(matrix);\n if (element.nodeName === 'svg') {\n el = element.ownerDocument.createElementNS(svgNS, 'g');\n // element.firstChild != null\n while (element.firstChild) {\n el.appendChild(element.firstChild);\n }\n element.appendChild(el);\n } else {\n el = element;\n el.removeAttribute('x');\n el.removeAttribute('y');\n matrix = el.getAttribute('transform') + matrix;\n }\n el.setAttribute('transform', matrix);\n return parsedDim;\n}\n","export const getTagName = (node: Element) => node.tagName.replace('svg:', '');\n","import { svgInvalidAncestors } from './constants';\nimport { getSvgRegex } from './getSvgRegex';\nimport { getTagName } from './getTagName';\n\nconst svgInvalidAncestorsRegEx = getSvgRegex(svgInvalidAncestors);\n\nexport function hasInvalidAncestor(element: Element) {\n let _element: Element | null = element;\n while (_element && (_element = _element.parentElement)) {\n if (\n _element &&\n _element.nodeName &&\n svgInvalidAncestorsRegEx.test(getTagName(_element)) &&\n !_element.getAttribute('instantiated_by_use')\n ) {\n return true;\n }\n }\n return false;\n}\n","export function getMultipleNodes(\n doc: Document,\n nodeNames: string[],\n): Element[] {\n let nodeName,\n nodeArray: Element[] = [],\n nodeList,\n i,\n len;\n for (i = 0, len = nodeNames.length; i < len; i++) {\n nodeName = nodeNames[i];\n nodeList = doc.getElementsByTagNameNS(\n 'http://www.w3.org/2000/svg',\n nodeName,\n );\n nodeArray = nodeArray.concat(Array.from(nodeList));\n }\n return nodeArray;\n}\n","import { svgNS } from './constants';\nimport { getMultipleNodes } from './getMultipleNodes';\nimport { applyViewboxTransform } from './applyViewboxTransform';\nimport { parseStyleString } from './parseStyleString';\n\nexport function parseUseDirectives(doc: Document) {\n const nodelist = getMultipleNodes(doc, ['use', 'svg:use']);\n const skipAttributes = ['x', 'y', 'xlink:href', 'href', 'transform'];\n\n for (const useElement of nodelist) {\n const useAttributes: NamedNodeMap = useElement.attributes;\n\n const useAttrMap: Record = {};\n for (const attr of useAttributes) {\n attr.value && (useAttrMap[attr.name] = attr.value);\n }\n\n const xlink = (useAttrMap['xlink:href'] || useAttrMap.href || '').slice(1);\n\n if (xlink === '') {\n return;\n }\n const referencedElement = doc.getElementById(xlink);\n if (referencedElement === null) {\n // if we can't find the target of the xlink, consider this use tag bad, similar to no xlink\n return;\n }\n let clonedOriginal = referencedElement.cloneNode(true) as Element;\n\n const originalAttributes: NamedNodeMap = clonedOriginal.attributes;\n\n const originalAttrMap: Record = {};\n for (const attr of originalAttributes) {\n attr.value && (originalAttrMap[attr.name] = attr.value);\n }\n\n // Transform attribute needs to be merged in a particular way\n const { x = 0, y = 0, transform = '' } = useAttrMap;\n const currentTrans = `${transform} ${\n originalAttrMap.transform || ''\n } translate(${x}, ${y})`;\n\n applyViewboxTransform(clonedOriginal);\n\n if (/^svg$/i.test(clonedOriginal.nodeName)) {\n // if is an SVG, create a group and apply all the attributes on top of it\n const el3 = clonedOriginal.ownerDocument.createElementNS(svgNS, 'g');\n Object.entries(originalAttrMap).forEach(([name, value]) =>\n el3.setAttributeNS(svgNS, name, value),\n );\n el3.append(...clonedOriginal.childNodes);\n clonedOriginal = el3;\n }\n\n for (const attr of useAttributes) {\n if (!attr) {\n continue;\n }\n const { name, value } = attr;\n if (skipAttributes.includes(name)) {\n continue;\n }\n\n if (name === 'style') {\n // when use has a style, merge the two styles, with the ref being priority (not use)\n // priority is by feature. an attribute for fill on the original element\n // will overwrite the fill in style or attribute for tha use\n const styleRecord: Record = {};\n parseStyleString(value, styleRecord);\n // cleanup styleRecord from attributes of original\n Object.entries(originalAttrMap).forEach(([name, value]) => {\n styleRecord[name] = value;\n });\n // now we can put in the style of the original that will overwrite the original attributes\n parseStyleString(originalAttrMap.style || '', styleRecord);\n const mergedStyles = Object.entries(styleRecord)\n .map((entry) => entry.join(':'))\n .join(';');\n clonedOriginal.setAttribute(name, mergedStyles);\n } else {\n // set the attribute from use element only if the original does not have it already\n !originalAttrMap[name] && clonedOriginal.setAttribute(name, value);\n }\n }\n\n clonedOriginal.setAttribute('transform', currentTrans);\n clonedOriginal.setAttribute('instantiated_by_use', '1');\n clonedOriginal.removeAttribute('id');\n useElement.parentNode!.replaceChild(clonedOriginal, useElement);\n }\n}\n","const gradientsAttrs = [\n 'gradientTransform',\n 'x1',\n 'x2',\n 'y1',\n 'y2',\n 'gradientUnits',\n 'cx',\n 'cy',\n 'r',\n 'fx',\n 'fy',\n];\nconst xlinkAttr = 'xlink:href';\n\nexport function recursivelyParseGradientsXlink(\n doc: Document,\n gradient: Element,\n) {\n const xLink = gradient.getAttribute(xlinkAttr)?.slice(1) || '',\n referencedGradient = doc.getElementById(xLink);\n if (referencedGradient && referencedGradient.getAttribute(xlinkAttr)) {\n recursivelyParseGradientsXlink(doc, referencedGradient as Element);\n }\n if (referencedGradient) {\n gradientsAttrs.forEach((attr) => {\n const value = referencedGradient.getAttribute(attr);\n if (!gradient.hasAttribute(attr) && value) {\n gradient.setAttribute(attr, value);\n }\n });\n if (!gradient.children.length) {\n const referenceClone = referencedGradient.cloneNode(true);\n while (referenceClone.firstChild) {\n gradient.appendChild(referenceClone.firstChild);\n }\n }\n }\n gradient.removeAttribute(xlinkAttr);\n}\n","import { getMultipleNodes } from './getMultipleNodes';\nimport { recursivelyParseGradientsXlink } from './recursivelyParseGradientsXlink';\n\nconst tagArray = [\n 'linearGradient',\n 'radialGradient',\n 'svg:linearGradient',\n 'svg:radialGradient',\n];\n\n/**\n * Parses an SVG document, returning all of the gradient declarations found in it\n * @param {SVGDocument} doc SVG document to parse\n * @return {Object} Gradient definitions; key corresponds to element id, value -- to gradient definition element\n */\nexport function getGradientDefs(\n doc: Document,\n): Record {\n const elList = getMultipleNodes(doc, tagArray);\n const gradientDefs: Record = {};\n let j = elList.length;\n while (j--) {\n const el = elList[j];\n if (el.getAttribute('xlink:href')) {\n recursivelyParseGradientsXlink(doc, el);\n }\n const id = el.getAttribute('id');\n if (id) {\n gradientDefs[id] = el as SVGGradientElement;\n }\n }\n return gradientDefs;\n}\n","import type { CSSRules } from './typedefs';\n\n/**\n * Returns CSS rules for a given SVG document\n * @param {HTMLElement} doc SVG document to parse\n * @return {Object} CSS rules of this document\n */\nexport function getCSSRules(doc: Document) {\n const styles = doc.getElementsByTagName('style');\n const allRules: CSSRules = {};\n\n // very crude parsing of style contents\n for (let i = 0; i < styles.length; i++) {\n const styleContents = (styles[i].textContent || '').replace(\n // remove comments\n /\\/\\*[\\s\\S]*?\\*\\//g,\n '',\n );\n\n if (styleContents.trim() === '') {\n continue;\n }\n // recovers all the rule in this form `body { style code... }`\n // rules = styleContents.match(/[^{]*\\{[\\s\\S]*?\\}/g);\n styleContents\n .split('}')\n // remove empty rules and remove everything if we didn't split in at least 2 pieces\n .filter((rule, index, array) => array.length > 1 && rule.trim())\n // at this point we have hopefully an array of rules `body { style code... `\n .forEach((rule) => {\n // if there is more than one opening bracket and the rule starts with '@', it is likely\n // a nested at-rule like @media, @supports, @scope, etc. Ignore these as the code below\n // can not handle it.\n if (\n (rule.match(/{/g) || []).length > 1 &&\n rule.trim().startsWith('@')\n ) {\n return;\n }\n\n const match = rule.split('{'),\n ruleObj: Record = {},\n declaration = match[1].trim(),\n propertyValuePairs = declaration.split(';').filter(function (pair) {\n return pair.trim();\n });\n\n for (let j = 0; j < propertyValuePairs.length; j++) {\n const pair = propertyValuePairs[j].split(':'),\n property = pair[0].trim(),\n value = pair[1].trim();\n ruleObj[property] = value;\n }\n rule = match[0].trim();\n rule.split(',').forEach((_rule) => {\n _rule = _rule.replace(/^svg/i, '').trim();\n if (_rule === '') {\n return;\n }\n allRules[_rule] = {\n ...(allRules[_rule] || {}),\n ...ruleObj,\n };\n });\n });\n }\n return allRules;\n}\n","import { Gradient } from '../gradient/Gradient';\nimport { Group } from '../shapes/Group';\nimport { FabricImage } from '../shapes/Image';\nimport { classRegistry } from '../ClassRegistry';\nimport {\n invertTransform,\n multiplyTransformMatrices,\n qrDecompose,\n} from '../util/misc/matrix';\nimport { removeTransformMatrixForSvgParsing } from '../util/transform_matrix_removal';\nimport type { FabricObject } from '../shapes/Object/FabricObject';\nimport { Point } from '../Point';\nimport { CENTER, FILL, STROKE } from '../constants';\nimport { getGradientDefs } from './getGradientDefs';\nimport { getCSSRules } from './getCSSRules';\nimport type { LoadImageOptions } from '../util';\nimport type { CSSRules, TSvgReviverCallback } from './typedefs';\nimport type { ParsedViewboxTransform } from './applyViewboxTransform';\nimport type { SVGOptions } from '../gradient';\nimport { getTagName } from './getTagName';\nimport { parseTransformAttribute } from './parseTransformAttribute';\n\nconst findTag = (el: Element) =>\n classRegistry.getSVGClass(getTagName(el).toLowerCase());\n\ntype StorageType = {\n fill: SVGGradientElement;\n stroke: SVGGradientElement;\n clipPath: Element[];\n};\n\ntype NotParsedFabricObject = FabricObject & {\n fill: string;\n stroke: string;\n clipPath?: string;\n clipRule?: CanvasFillRule;\n};\n\nexport class ElementsParser {\n declare elements: Element[];\n declare options: LoadImageOptions & ParsedViewboxTransform;\n declare reviver?: TSvgReviverCallback;\n declare regexUrl: RegExp;\n declare doc: Document;\n declare clipPaths: Record;\n declare gradientDefs: Record;\n declare cssRules: CSSRules;\n\n constructor(\n elements: Element[],\n options: LoadImageOptions & ParsedViewboxTransform,\n reviver: TSvgReviverCallback | undefined,\n doc: Document,\n clipPaths: Record,\n ) {\n this.elements = elements;\n this.options = options;\n this.reviver = reviver;\n this.regexUrl = /^url\\(['\"]?#([^'\"]+)['\"]?\\)/g;\n this.doc = doc;\n this.clipPaths = clipPaths;\n this.gradientDefs = getGradientDefs(doc);\n this.cssRules = getCSSRules(doc);\n }\n\n parse(): Promise> {\n return Promise.all(\n this.elements.map((element) => this.createObject(element)),\n );\n }\n\n async createObject(el: Element): Promise {\n const klass = findTag(el);\n if (klass) {\n const obj: NotParsedFabricObject = await klass.fromElement(\n el,\n this.options,\n this.cssRules,\n );\n this.resolveGradient(obj, el, FILL);\n this.resolveGradient(obj, el, STROKE);\n if (obj instanceof FabricImage && obj._originalElement) {\n removeTransformMatrixForSvgParsing(\n obj,\n obj.parsePreserveAspectRatioAttribute(),\n );\n } else {\n removeTransformMatrixForSvgParsing(obj);\n }\n await this.resolveClipPath(obj, el);\n this.reviver && this.reviver(el, obj);\n return obj;\n }\n return null;\n }\n\n extractPropertyDefinition(\n obj: NotParsedFabricObject,\n property: 'fill' | 'stroke' | 'clipPath',\n storage: Record,\n ): StorageType[typeof property] | undefined {\n const value = obj[property]!,\n regex = this.regexUrl;\n if (!regex.test(value)) {\n return undefined;\n }\n // verify: can we remove the 'g' flag? and remove lastIndex changes?\n regex.lastIndex = 0;\n // we passed the regex test, so we know is not null;\n const id = regex.exec(value)![1];\n regex.lastIndex = 0;\n // @todo fix this\n return storage[id];\n }\n\n resolveGradient(\n obj: NotParsedFabricObject,\n el: Element,\n property: 'fill' | 'stroke',\n ) {\n const gradientDef = this.extractPropertyDefinition(\n obj,\n property,\n this.gradientDefs,\n ) as SVGGradientElement;\n if (gradientDef) {\n const opacityAttr = el.getAttribute(property + '-opacity');\n const gradient = Gradient.fromElement(gradientDef, obj, {\n ...this.options,\n opacity: opacityAttr,\n } as SVGOptions);\n obj.set(property, gradient);\n }\n }\n\n // TODO: resolveClipPath could be run once per clippath with minor work per object.\n // is a refactor that i m not sure is worth on this code\n async resolveClipPath(\n obj: NotParsedFabricObject,\n usingElement: Element,\n exactOwner?: Element,\n ) {\n const clipPathElements = this.extractPropertyDefinition(\n obj,\n 'clipPath',\n this.clipPaths,\n ) as Element[];\n if (clipPathElements) {\n const objTransformInv = invertTransform(obj.calcTransformMatrix());\n const clipPathTag = clipPathElements[0].parentElement!;\n let clipPathOwner = usingElement;\n while (\n !exactOwner &&\n clipPathOwner.parentElement &&\n clipPathOwner.getAttribute('clip-path') !== obj.clipPath\n ) {\n clipPathOwner = clipPathOwner.parentElement;\n }\n // move the clipPath tag as sibling to the real element that is using it\n clipPathOwner.parentElement!.appendChild(clipPathTag);\n\n // this multiplication order could be opposite.\n // but i don't have an svg to test it\n // at the first SVG that has a transform on both places and is misplaced\n // try to invert this multiplication order\n const finalTransform = parseTransformAttribute(\n `${clipPathOwner.getAttribute('transform') || ''} ${\n clipPathTag.getAttribute('originalTransform') || ''\n }`,\n );\n\n clipPathTag.setAttribute(\n 'transform',\n `matrix(${finalTransform.join(',')})`,\n );\n\n const container = await Promise.all(\n clipPathElements.map((clipPathElement) => {\n return findTag(clipPathElement)\n .fromElement(clipPathElement, this.options, this.cssRules)\n .then((enlivedClippath: NotParsedFabricObject) => {\n removeTransformMatrixForSvgParsing(enlivedClippath);\n enlivedClippath.fillRule = enlivedClippath.clipRule!;\n delete enlivedClippath.clipRule;\n return enlivedClippath;\n });\n }),\n );\n const clipPath =\n container.length === 1 ? container[0] : new Group(container);\n const gTransform = multiplyTransformMatrices(\n objTransformInv,\n clipPath.calcTransformMatrix(),\n );\n if (clipPath.clipPath) {\n await this.resolveClipPath(\n clipPath,\n clipPathOwner,\n // this is tricky.\n // it tries to differentiate from when clipPaths are inherited by outside groups\n // or when are really clipPaths referencing other clipPaths\n clipPathTag.getAttribute('clip-path') ? clipPathOwner : undefined,\n );\n }\n const { scaleX, scaleY, angle, skewX, translateX, translateY } =\n qrDecompose(gTransform);\n clipPath.set({\n flipX: false,\n flipY: false,\n });\n clipPath.set({\n scaleX,\n scaleY,\n angle,\n skewX,\n skewY: 0,\n });\n clipPath.setPositionByOrigin(\n new Point(translateX, translateY),\n CENTER,\n CENTER,\n );\n obj.clipPath = clipPath;\n } else {\n // if clip-path does not resolve to any element, delete the property.\n delete obj.clipPath;\n return;\n }\n }\n}\n","import { applyViewboxTransform } from './applyViewboxTransform';\nimport { svgValidTagNamesRegEx } from './constants';\nimport { hasInvalidAncestor } from './hasInvalidAncestor';\nimport { parseUseDirectives } from './parseUseDirectives';\nimport type { SVGParsingOutput, TSvgReviverCallback } from './typedefs';\nimport type { LoadImageOptions } from '../util/misc/objectEnlive';\nimport { ElementsParser } from './elements_parser';\nimport { log, SignalAbortedError } from '../util/internals/console';\nimport { getTagName } from './getTagName';\n\nconst isValidSvgTag = (el: Element) =>\n svgValidTagNamesRegEx.test(getTagName(el));\n\nexport const createEmptyResponse = (): SVGParsingOutput => ({\n objects: [],\n elements: [],\n options: {},\n allElements: [],\n});\n\n/**\n * Parses an SVG document, converts it to an array of corresponding fabric.* instances and passes them to a callback\n * @param {HTMLElement} doc SVG document to parse\n * @param {TSvgParsedCallback} callback Invoked when the parsing is done, with null if parsing wasn't possible with the list of svg nodes.\n * @param {TSvgReviverCallback} [reviver] Extra callback for further parsing of SVG elements, called after each fabric object has been created.\n * Takes as input the original svg element and the generated `FabricObject` as arguments. Used to inspect extra properties not parsed by fabric,\n * or extra custom manipulation\n * @param {Object} [options] Object containing options for parsing\n * @param {String} [options.crossOrigin] crossOrigin setting to use for external resources\n * @param {AbortSignal} [options.signal] handle aborting, see https://developer.mozilla.org/en-US/docs/Web/API/AbortController/signal\n * @return {SVGParsingOutput}\n * {@link SVGParsingOutput} also receives `allElements` array as the last argument. This is the full list of svg nodes available in the document.\n * You may want to use it if you are trying to regroup the objects as they were originally grouped in the SVG. ( This was the reason why it was added )\n */\nexport async function parseSVGDocument(\n doc: Document,\n reviver?: TSvgReviverCallback,\n { crossOrigin, signal }: LoadImageOptions = {},\n): Promise {\n if (signal && signal.aborted) {\n log('log', new SignalAbortedError('parseSVGDocument'));\n // this is an unhappy path, we dont care about speed\n return createEmptyResponse();\n }\n const documentElement = doc.documentElement;\n parseUseDirectives(doc);\n\n const descendants = Array.from(documentElement.getElementsByTagName('*')),\n options = {\n ...applyViewboxTransform(documentElement),\n crossOrigin,\n signal,\n };\n const elements = descendants.filter((el) => {\n applyViewboxTransform(el);\n return isValidSvgTag(el) && !hasInvalidAncestor(el); // http://www.w3.org/TR/SVG/struct.html#DefsElement\n });\n if (!elements || (elements && !elements.length)) {\n return {\n ...createEmptyResponse(),\n options,\n allElements: descendants,\n };\n }\n const localClipPaths: Record = {};\n descendants\n .filter((el) => getTagName(el) === 'clipPath')\n .forEach((el) => {\n el.setAttribute('originalTransform', el.getAttribute('transform') || '');\n const id = el.getAttribute('id')!;\n localClipPaths[id] = Array.from(el.getElementsByTagName('*')).filter(\n (el) => isValidSvgTag(el),\n );\n });\n\n // Precedence of rules: style > class > attribute\n const elementParser = new ElementsParser(\n elements,\n options,\n reviver,\n doc,\n localClipPaths,\n );\n\n const instances = await elementParser.parse();\n\n return {\n objects: instances,\n elements,\n options,\n allElements: descendants,\n };\n}\n","import { getFabricWindow } from '../env';\nimport type { LoadImageOptions } from '../util/misc/objectEnlive';\nimport { parseSVGDocument } from './parseSVGDocument';\nimport type { SVGParsingOutput, TSvgReviverCallback } from './typedefs';\n\n/**\n * Takes string corresponding to an SVG document, and parses it into a set of fabric objects\n * @param {String} string representing the svg\n * @param {TSvgParsedCallback} callback Invoked when the parsing is done, with null if parsing wasn't possible with the list of svg nodes.\n * {@link TSvgParsedCallback} also receives `allElements` array as the last argument. This is the full list of svg nodes available in the document.\n * You may want to use it if you are trying to regroup the objects as they were originally grouped in the SVG. ( This was the reason why it was added )\n * @param {TSvgReviverCallback} [reviver] Extra callback for further parsing of SVG elements, called after each fabric object has been created.\n * Takes as input the original svg element and the generated `FabricObject` as arguments. Used to inspect extra properties not parsed by fabric,\n * or extra custom manipulation\n * @param {Object} [options] Object containing options for parsing\n * @param {String} [options.crossOrigin] crossOrigin setting to use for external resources\n * @param {AbortSignal} [options.signal] handle aborting, see https://developer.mozilla.org/en-US/docs/Web/API/AbortController/signal\n */\nexport function loadSVGFromString(\n string: string,\n reviver?: TSvgReviverCallback,\n options?: LoadImageOptions,\n): Promise {\n const parser = new (getFabricWindow().DOMParser)(),\n // should we use `image/svg+xml` here?\n doc = parser.parseFromString(string.trim(), 'text/xml');\n return parseSVGDocument(doc, reviver, options);\n}\n","import { createEmptyResponse } from './parseSVGDocument';\nimport { loadSVGFromString } from './loadSVGFromString';\nimport type { SVGParsingOutput, TSvgReviverCallback } from './typedefs';\nimport type { LoadImageOptions } from '../util/misc/objectEnlive';\nimport { FabricError } from '../util/internals/console';\n\n/**\n * Takes url corresponding to an SVG document, and parses it into a set of fabric objects.\n * Note that SVG is fetched via fetch API, so it needs to conform to SOP (Same Origin Policy)\n * @param {string} url where the SVG is\n * @param {TSvgParsedCallback} callback Invoked when the parsing is done, with null if parsing wasn't possible with the list of svg nodes.\n * {@link TSvgParsedCallback} also receives `allElements` array as the last argument. This is the full list of svg nodes available in the document.\n * You may want to use it if you are trying to regroup the objects as they were originally grouped in the SVG. ( This was the reason why it was added )\n * @param {TSvgReviverCallback} [reviver] Extra callback for further parsing of SVG elements, called after each fabric object has been created.\n * Takes as input the original svg element and the generated `FabricObject` as arguments. Used to inspect extra properties not parsed by fabric,\n * or extra custom manipulation\n * @param {Object} [options] Object containing options for parsing\n * @param {String} [options.crossOrigin] crossOrigin setting to use for external resources\n * @param {AbortSignal} [options.signal] handle aborting, see https://developer.mozilla.org/en-US/docs/Web/API/AbortController/signal\n */\nexport function loadSVGFromURL(\n url: string,\n reviver?: TSvgReviverCallback,\n options: LoadImageOptions = {},\n): Promise {\n return fetch(url.replace(/^\\n\\s*/, '').trim(), {\n signal: options.signal,\n })\n .then((response) => {\n if (!response.ok) {\n throw new FabricError(`HTTP error! status: ${response.status}`);\n }\n return response.text();\n })\n .then((svgText) => {\n return loadSVGFromString(svgText, reviver, options);\n })\n .catch(() => {\n // this is an unhappy path, we dont care about speed\n return createEmptyResponse();\n });\n}\n","import { Point } from '../Point';\nimport { Control } from './Control';\nimport type { TMat2D } from '../typedefs';\nimport type { Polyline } from '../shapes/Polyline';\nimport { multiplyTransformMatrices } from '../util/misc/matrix';\nimport type {\n TModificationEvents,\n TPointerEvent,\n Transform,\n TransformActionHandler,\n} from '../EventTypeDefs';\nimport { wrapWithFireEvent } from './wrapWithFireEvent';\nimport { sendPointToPlane } from '../util/misc/planeChange';\nimport { MODIFY_POLY } from '../constants';\n\nconst ACTION_NAME: TModificationEvents = MODIFY_POLY;\n\ntype TTransformAnchor = Transform & { pointIndex: number };\n\n/**\n * This function locates the controls.\n * It'll be used both for drawing and for interaction.\n */\nexport const createPolyPositionHandler = (pointIndex: number) => {\n return function (dim: Point, finalMatrix: TMat2D, polyObject: Polyline) {\n const { points, pathOffset } = polyObject;\n return new Point(points[pointIndex])\n .subtract(pathOffset)\n .transform(\n multiplyTransformMatrices(\n polyObject.getViewportTransform(),\n polyObject.calcTransformMatrix(),\n ),\n );\n };\n};\n\n/**\n * This function defines what the control does.\n * It'll be called on every mouse move after a control has been clicked and is being dragged.\n * The function receives as argument the mouse event, the current transform object\n * and the current position in canvas coordinate `transform.target` is a reference to the\n * current object being transformed.\n */\nexport const polyActionHandler = (\n eventData: TPointerEvent,\n transform: TTransformAnchor,\n x: number,\n y: number,\n) => {\n const { target, pointIndex } = transform;\n const poly = target as Polyline;\n const mouseLocalPosition = sendPointToPlane(\n new Point(x, y),\n undefined,\n poly.calcOwnMatrix(),\n );\n\n poly.points[pointIndex] = mouseLocalPosition.add(poly.pathOffset);\n poly.setDimensions();\n poly.set('dirty', true);\n return true;\n};\n\n/**\n * Keep the polygon in the same position when we change its `width`/`height`/`top`/`left`.\n */\nexport const factoryPolyActionHandler = (\n pointIndex: number,\n fn: TransformActionHandler,\n) => {\n return function (\n eventData: TPointerEvent,\n transform: Transform,\n x: number,\n y: number,\n ) {\n const poly = transform.target as Polyline,\n anchorPoint = new Point(\n poly.points[(pointIndex > 0 ? pointIndex : poly.points.length) - 1],\n ),\n anchorPointInParentPlane = anchorPoint\n .subtract(poly.pathOffset)\n .transform(poly.calcOwnMatrix()),\n actionPerformed = fn(eventData, { ...transform, pointIndex }, x, y);\n\n const newAnchorPointInParentPlane = anchorPoint\n .subtract(poly.pathOffset)\n .transform(poly.calcOwnMatrix());\n\n const diff = newAnchorPointInParentPlane.subtract(anchorPointInParentPlane);\n poly.left -= diff.x;\n poly.top -= diff.y;\n\n return actionPerformed;\n };\n};\n\nexport const createPolyActionHandler = (pointIndex: number) =>\n wrapWithFireEvent(\n ACTION_NAME,\n factoryPolyActionHandler(pointIndex, polyActionHandler),\n );\n\nexport function createPolyControls(\n poly: Polyline,\n options?: Partial,\n): Record;\nexport function createPolyControls(\n numOfControls: number,\n options?: Partial,\n): Record;\nexport function createPolyControls(\n arg0: number | Polyline,\n options: Partial = {},\n) {\n const controls = {} as Record;\n for (\n let idx = 0;\n idx < (typeof arg0 === 'number' ? arg0 : arg0.points.length);\n idx++\n ) {\n controls[`p${idx}`] = new Control({\n actionName: ACTION_NAME,\n positionHandler: createPolyPositionHandler(idx),\n actionHandler: createPolyActionHandler(idx),\n ...options,\n });\n }\n return controls;\n}\n","import { Point } from '../Point';\nimport { Control } from './Control';\nimport type { TMat2D } from '../typedefs';\nimport type { Path } from '../shapes/Path';\nimport { multiplyTransformMatrices } from '../util/misc/matrix';\nimport type {\n TModificationEvents,\n TPointerEvent,\n Transform,\n} from '../EventTypeDefs';\nimport { sendPointToPlane } from '../util/misc/planeChange';\nimport type { TSimpleParseCommandType } from '../util/path/typedefs';\nimport type { ControlRenderingStyleOverride } from './controlRendering';\nimport { fireEvent } from './fireEvent';\nimport { commonEventInfo } from './util';\n\nconst ACTION_NAME: TModificationEvents = 'modifyPath' as const;\n\ntype TTransformAnchor = Transform;\n\nexport type PathPointControlStyle = {\n controlFill?: string;\n controlStroke?: string;\n connectionDashArray?: number[];\n};\n\nconst calcPathPointPosition = (\n pathObject: Path,\n commandIndex: number,\n pointIndex: number,\n) => {\n const { path, pathOffset } = pathObject;\n const command = path[commandIndex];\n return new Point(\n (command[pointIndex] as number) - pathOffset.x,\n (command[pointIndex + 1] as number) - pathOffset.y,\n ).transform(\n multiplyTransformMatrices(\n pathObject.getViewportTransform(),\n pathObject.calcTransformMatrix(),\n ),\n );\n};\n\nconst movePathPoint = (\n pathObject: Path,\n x: number,\n y: number,\n commandIndex: number,\n pointIndex: number,\n) => {\n const { path, pathOffset } = pathObject;\n\n const anchorCommand =\n path[(commandIndex > 0 ? commandIndex : path.length) - 1];\n const anchorPoint = new Point(\n anchorCommand[pointIndex] as number,\n anchorCommand[pointIndex + 1] as number,\n );\n\n const anchorPointInParentPlane = anchorPoint\n .subtract(pathOffset)\n .transform(pathObject.calcOwnMatrix());\n\n const mouseLocalPosition = sendPointToPlane(\n new Point(x, y),\n undefined,\n pathObject.calcOwnMatrix(),\n );\n\n path[commandIndex][pointIndex] = mouseLocalPosition.x + pathOffset.x;\n path[commandIndex][pointIndex + 1] = mouseLocalPosition.y + pathOffset.y;\n pathObject.setDimensions();\n\n const newAnchorPointInParentPlane = anchorPoint\n .subtract(pathObject.pathOffset)\n .transform(pathObject.calcOwnMatrix());\n\n const diff = newAnchorPointInParentPlane.subtract(anchorPointInParentPlane);\n pathObject.left -= diff.x;\n pathObject.top -= diff.y;\n pathObject.set('dirty', true);\n return true;\n};\n\n/**\n * This function locates the controls.\n * It'll be used both for drawing and for interaction.\n */\nfunction pathPositionHandler(\n this: PathPointControl,\n dim: Point,\n finalMatrix: TMat2D,\n pathObject: Path,\n) {\n const { commandIndex, pointIndex } = this;\n return calcPathPointPosition(pathObject, commandIndex, pointIndex);\n}\n\n/**\n * This function defines what the control does.\n * It'll be called on every mouse move after a control has been clicked and is being dragged.\n * The function receives as argument the mouse event, the current transform object\n * and the current position in canvas coordinate `transform.target` is a reference to the\n * current object being transformed.\n */\nfunction pathActionHandler(\n this: PathPointControl,\n eventData: TPointerEvent,\n transform: TTransformAnchor,\n x: number,\n y: number,\n) {\n const { target } = transform;\n const { commandIndex, pointIndex } = this;\n const actionPerformed = movePathPoint(\n target as Path,\n x,\n y,\n commandIndex,\n pointIndex,\n );\n if (actionPerformed) {\n fireEvent(this.actionName as TModificationEvents, {\n ...commonEventInfo(eventData, transform, x, y),\n commandIndex,\n pointIndex,\n });\n }\n return actionPerformed;\n}\n\nconst indexFromPrevCommand = (previousCommandType: TSimpleParseCommandType) =>\n previousCommandType === 'C' ? 5 : previousCommandType === 'Q' ? 3 : 1;\n\nclass PathPointControl extends Control {\n declare commandIndex: number;\n declare pointIndex: number;\n declare controlFill: string;\n declare controlStroke: string;\n constructor(options?: Partial) {\n super(options);\n }\n\n render(\n ctx: CanvasRenderingContext2D,\n left: number,\n top: number,\n styleOverride: ControlRenderingStyleOverride | undefined,\n fabricObject: Path,\n ) {\n const overrides: ControlRenderingStyleOverride = {\n ...styleOverride,\n cornerColor: this.controlFill,\n cornerStrokeColor: this.controlStroke,\n transparentCorners: !this.controlFill,\n };\n super.render(ctx, left, top, overrides, fabricObject);\n }\n}\n\nclass PathControlPointControl extends PathPointControl {\n declare connectionDashArray?: number[];\n declare connectToCommandIndex: number;\n declare connectToPointIndex: number;\n constructor(options?: Partial) {\n super(options);\n }\n\n render(\n this: PathControlPointControl,\n ctx: CanvasRenderingContext2D,\n left: number,\n top: number,\n styleOverride: ControlRenderingStyleOverride | undefined,\n fabricObject: Path,\n ) {\n const { path } = fabricObject;\n const {\n commandIndex,\n pointIndex,\n connectToCommandIndex,\n connectToPointIndex,\n } = this;\n ctx.save();\n ctx.strokeStyle = this.controlStroke;\n if (this.connectionDashArray) {\n ctx.setLineDash(this.connectionDashArray);\n }\n const [commandType] = path[commandIndex];\n const point = calcPathPointPosition(\n fabricObject,\n connectToCommandIndex,\n connectToPointIndex,\n );\n\n if (commandType === 'Q') {\n // one control point connects to 2 points\n const point2 = calcPathPointPosition(\n fabricObject,\n commandIndex,\n pointIndex + 2,\n );\n ctx.moveTo(point2.x, point2.y);\n ctx.lineTo(left, top);\n } else {\n ctx.moveTo(left, top);\n }\n ctx.lineTo(point.x, point.y);\n ctx.stroke();\n ctx.restore();\n\n super.render(ctx, left, top, styleOverride, fabricObject);\n }\n}\n\nconst createControl = (\n commandIndexPos: number,\n pointIndexPos: number,\n isControlPoint: boolean,\n options: Partial & {\n controlPointStyle?: PathPointControlStyle;\n pointStyle?: PathPointControlStyle;\n },\n connectToCommandIndex?: number,\n connectToPointIndex?: number,\n) =>\n new (isControlPoint ? PathControlPointControl : PathPointControl)({\n commandIndex: commandIndexPos,\n pointIndex: pointIndexPos,\n actionName: ACTION_NAME,\n positionHandler: pathPositionHandler,\n actionHandler: pathActionHandler,\n connectToCommandIndex,\n connectToPointIndex,\n ...options,\n ...(isControlPoint ? options.controlPointStyle : options.pointStyle),\n } as Partial);\n\nexport function createPathControls(\n path: Path,\n options: Partial & {\n controlPointStyle?: PathPointControlStyle;\n pointStyle?: PathPointControlStyle;\n } = {},\n): Record {\n const controls = {} as Record;\n let previousCommandType: TSimpleParseCommandType = 'M';\n path.path.forEach((command, commandIndex) => {\n const commandType = command[0];\n\n if (commandType !== 'Z') {\n controls[`c_${commandIndex}_${commandType}`] = createControl(\n commandIndex,\n command.length - 2,\n false,\n options,\n );\n }\n switch (commandType) {\n case 'C':\n controls[`c_${commandIndex}_C_CP_1`] = createControl(\n commandIndex,\n 1,\n true,\n options,\n commandIndex - 1,\n indexFromPrevCommand(previousCommandType),\n );\n controls[`c_${commandIndex}_C_CP_2`] = createControl(\n commandIndex,\n 3,\n true,\n options,\n commandIndex,\n 5,\n );\n break;\n case 'Q':\n controls[`c_${commandIndex}_Q_CP_1`] = createControl(\n commandIndex,\n 1,\n true,\n options,\n commandIndex,\n 3,\n );\n break;\n }\n previousCommandType = commandType;\n });\n return controls;\n}\n","import { getFabricWindow } from '../env';\nimport { createCanvasElement, createCanvasElementFor } from '../util/misc/dom';\nimport { WebGLFilterBackend } from './WebGLFilterBackend';\nimport type { TWebGLPipelineState, T2DPipelineState } from './typedefs';\n\nexport const isWebGLPipelineState = (\n options: TWebGLPipelineState | T2DPipelineState,\n): options is TWebGLPipelineState => {\n return (options as TWebGLPipelineState).webgl !== undefined;\n};\n\n/**\n * Pick a method to copy data from GL context to 2d canvas. In some browsers using\n * drawImage should be faster, but is also bugged for a small combination of old hardware\n * and drivers.\n * putImageData is faster than drawImage for that specific operation.\n */\nexport const isPutImageFaster = (width: number, height: number): boolean => {\n const targetCanvas = createCanvasElementFor({ width, height });\n const sourceCanvas = createCanvasElement();\n const gl = sourceCanvas.getContext('webgl')!;\n // eslint-disable-next-line no-undef\n const imageBuffer = new ArrayBuffer(width * height * 4);\n\n const testContext = {\n imageBuffer: imageBuffer,\n } as unknown as Required;\n const testPipelineState = {\n destinationWidth: width,\n destinationHeight: height,\n targetCanvas: targetCanvas,\n } as unknown as TWebGLPipelineState;\n let startTime;\n\n startTime = getFabricWindow().performance.now();\n WebGLFilterBackend.prototype.copyGLTo2D.call(\n testContext,\n gl,\n testPipelineState,\n );\n const drawImageTime = getFabricWindow().performance.now() - startTime;\n\n startTime = getFabricWindow().performance.now();\n WebGLFilterBackend.prototype.copyGLTo2DPutImageData.call(\n testContext,\n gl,\n testPipelineState,\n );\n const putImageDataTime = getFabricWindow().performance.now() - startTime;\n\n return drawImageTime > putImageDataTime;\n};\n","export const highPsourceCode = `precision highp float`;\n\nexport const identityFragmentShader = `\n ${highPsourceCode};\n varying vec2 vTexCoord;\n uniform sampler2D uTexture;\n void main() {\n gl_FragColor = texture2D(uTexture, vTexCoord);\n }`;\n\nexport const vertexSource = `\n attribute vec2 aPosition;\n varying vec2 vTexCoord;\n void main() {\n vTexCoord = aPosition;\n gl_Position = vec4(aPosition * 2.0 - 1.0, 0.0, 1.0);\n }`;\n","import { getEnv } from '../env';\nimport type {\n T2DPipelineState,\n TWebGLAttributeLocationMap,\n TWebGLPipelineState,\n TWebGLProgramCacheItem,\n TWebGLUniformLocationMap,\n} from './typedefs';\nimport { isWebGLPipelineState } from './utils';\nimport {\n highPsourceCode,\n identityFragmentShader,\n vertexSource,\n} from './shaders/baseFilter';\nimport type { Abortable } from '../typedefs';\nimport { FabricError } from '../util/internals/console';\nimport { createCanvasElementFor } from '../util/misc/dom';\n\nconst regex = new RegExp(highPsourceCode, 'g');\n\nexport class BaseFilter<\n Name extends string,\n OwnProps extends Record = object,\n SerializedProps extends Record = OwnProps,\n> {\n /**\n * Filter type\n */\n get type(): Name {\n return (this.constructor as typeof BaseFilter).type as Name;\n }\n\n /**\n * The class type. Used to identify which class this is.\n * This is used for serialization purposes and internally it can be used\n * to identify classes. As a developer you could use `instance of Class`\n * but to avoid importing all the code and blocking tree shaking we try\n * to avoid doing that.\n */\n static type = 'BaseFilter';\n\n /**\n * Contains the uniform locations for the fragment shader.\n * uStepW and uStepH are handled by the BaseFilter, each filter class\n * needs to specify all the one that are needed\n */\n static uniformLocations: string[] = [];\n\n declare static defaults: Record;\n\n /**\n * Constructor\n * @param {Object} [options] Options object\n */\n constructor({\n type,\n ...options\n }: { type?: never } & Partial & Record = {}) {\n Object.assign(\n this,\n (this.constructor as typeof BaseFilter).defaults,\n options,\n );\n }\n\n protected getFragmentSource(): string {\n return identityFragmentShader;\n }\n\n getVertexSource(): string {\n return vertexSource;\n }\n\n /**\n * Compile this filter's shader program.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context to use for shader compilation.\n * @param {String} fragmentSource fragmentShader source for compilation\n * @param {String} vertexSource vertexShader source for compilation\n */\n createProgram(\n gl: WebGLRenderingContext,\n fragmentSource: string = this.getFragmentSource(),\n vertexSource: string = this.getVertexSource(),\n ) {\n const {\n WebGLProbe: { GLPrecision = 'highp' },\n } = getEnv();\n if (GLPrecision !== 'highp') {\n fragmentSource = fragmentSource.replace(\n regex,\n highPsourceCode.replace('highp', GLPrecision),\n );\n }\n const vertexShader = gl.createShader(gl.VERTEX_SHADER);\n const fragmentShader = gl.createShader(gl.FRAGMENT_SHADER);\n const program = gl.createProgram();\n\n if (!vertexShader || !fragmentShader || !program) {\n throw new FabricError(\n 'Vertex, fragment shader or program creation error',\n );\n }\n gl.shaderSource(vertexShader, vertexSource);\n gl.compileShader(vertexShader);\n if (!gl.getShaderParameter(vertexShader, gl.COMPILE_STATUS)) {\n throw new FabricError(\n `Vertex shader compile error for ${this.type}: ${gl.getShaderInfoLog(\n vertexShader,\n )}`,\n );\n }\n\n gl.shaderSource(fragmentShader, fragmentSource);\n gl.compileShader(fragmentShader);\n if (!gl.getShaderParameter(fragmentShader, gl.COMPILE_STATUS)) {\n throw new FabricError(\n `Fragment shader compile error for ${this.type}: ${gl.getShaderInfoLog(\n fragmentShader,\n )}`,\n );\n }\n\n gl.attachShader(program, vertexShader);\n gl.attachShader(program, fragmentShader);\n gl.linkProgram(program);\n if (!gl.getProgramParameter(program, gl.LINK_STATUS)) {\n throw new FabricError(\n `Shader link error for \"${this.type}\" ${gl.getProgramInfoLog(program)}`,\n );\n }\n\n const uniformLocations = this.getUniformLocations(gl, program) || {};\n uniformLocations.uStepW = gl.getUniformLocation(program, 'uStepW');\n uniformLocations.uStepH = gl.getUniformLocation(program, 'uStepH');\n\n return {\n program,\n attributeLocations: this.getAttributeLocations(gl, program),\n uniformLocations,\n };\n }\n\n /**\n * Return a map of attribute names to WebGLAttributeLocation objects.\n *\n * @param {WebGLRenderingContext} gl The canvas context used to compile the shader program.\n * @param {WebGLShaderProgram} program The shader program from which to take attribute locations.\n * @returns {Object} A map of attribute names to attribute locations.\n */\n getAttributeLocations(\n gl: WebGLRenderingContext,\n program: WebGLProgram,\n ): TWebGLAttributeLocationMap {\n return {\n aPosition: gl.getAttribLocation(program, 'aPosition'),\n };\n }\n\n /**\n * Return a map of uniform names to WebGLUniformLocation objects.\n *\n * @param {WebGLRenderingContext} gl The canvas context used to compile the shader program.\n * @param {WebGLShaderProgram} program The shader program from which to take uniform locations.\n * @returns {Object} A map of uniform names to uniform locations.\n */\n getUniformLocations(\n gl: WebGLRenderingContext,\n program: WebGLProgram,\n ): TWebGLUniformLocationMap {\n const locations = (this.constructor as unknown as typeof BaseFilter)\n .uniformLocations;\n\n const uniformLocations: Record = {};\n for (let i = 0; i < locations.length; i++) {\n uniformLocations[locations[i]] = gl.getUniformLocation(\n program,\n locations[i],\n );\n }\n return uniformLocations;\n }\n\n /**\n * Send attribute data from this filter to its shader program on the GPU.\n *\n * @param {WebGLRenderingContext} gl The canvas context used to compile the shader program.\n * @param {Object} attributeLocations A map of shader attribute names to their locations.\n */\n sendAttributeData(\n gl: WebGLRenderingContext,\n attributeLocations: Record,\n aPositionData: Float32Array,\n ) {\n const attributeLocation = attributeLocations.aPosition;\n const buffer = gl.createBuffer();\n gl.bindBuffer(gl.ARRAY_BUFFER, buffer);\n gl.enableVertexAttribArray(attributeLocation);\n gl.vertexAttribPointer(attributeLocation, 2, gl.FLOAT, false, 0, 0);\n gl.bufferData(gl.ARRAY_BUFFER, aPositionData, gl.STATIC_DRAW);\n }\n\n _setupFrameBuffer(options: TWebGLPipelineState) {\n const gl = options.context;\n if (options.passes > 1) {\n const width = options.destinationWidth;\n const height = options.destinationHeight;\n if (options.sourceWidth !== width || options.sourceHeight !== height) {\n gl.deleteTexture(options.targetTexture);\n options.targetTexture = options.filterBackend.createTexture(\n gl,\n width,\n height,\n );\n }\n gl.framebufferTexture2D(\n gl.FRAMEBUFFER,\n gl.COLOR_ATTACHMENT0,\n gl.TEXTURE_2D,\n options.targetTexture,\n 0,\n );\n } else {\n // draw last filter on canvas and not to framebuffer.\n gl.bindFramebuffer(gl.FRAMEBUFFER, null);\n gl.finish();\n }\n }\n\n _swapTextures(options: TWebGLPipelineState) {\n options.passes--;\n options.pass++;\n const temp = options.targetTexture;\n options.targetTexture = options.sourceTexture;\n options.sourceTexture = temp;\n }\n\n /**\n * Generic isNeutral implementation for one parameter based filters.\n * Used only in image applyFilters to discard filters that will not have an effect\n * on the image\n * Other filters may need their own version ( ColorMatrix, HueRotation, gamma, ComposedFilter )\n * @param {Object} options\n **/\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n isNeutralState(options?: any): boolean {\n return false;\n }\n\n /**\n * Apply this filter to the input image data provided.\n *\n * Determines whether to use WebGL or Canvas2D based on the options.webgl flag.\n *\n * @param {Object} options\n * @param {Number} options.passes The number of filters remaining to be executed\n * @param {Boolean} options.webgl Whether to use webgl to render the filter.\n * @param {WebGLTexture} options.sourceTexture The texture setup as the source to be filtered.\n * @param {WebGLTexture} options.targetTexture The texture where filtered output should be drawn.\n * @param {WebGLRenderingContext} options.context The GL context used for rendering.\n * @param {Object} options.programCache A map of compiled shader programs, keyed by filter type.\n */\n applyTo(options: TWebGLPipelineState | T2DPipelineState) {\n if (isWebGLPipelineState(options)) {\n this._setupFrameBuffer(options);\n this.applyToWebGL(options);\n this._swapTextures(options);\n } else {\n this.applyTo2d(options);\n }\n }\n\n applyTo2d(_options: T2DPipelineState): void {\n // override by subclass\n }\n\n /**\n * Returns a string that represent the current selected shader code for the filter.\n * Used to force recompilation when parameters change or to retrieve the shader from cache\n * @type string\n **/\n getCacheKey(): string {\n return this.type;\n }\n\n /**\n * Retrieves the cached shader.\n * @param {Object} options\n * @param {WebGLRenderingContext} options.context The GL context used for rendering.\n * @param {Object} options.programCache A map of compiled shader programs, keyed by filter type.\n * @return {WebGLProgram} the compiled program shader\n */\n retrieveShader(options: TWebGLPipelineState): TWebGLProgramCacheItem {\n const key = this.getCacheKey();\n if (!options.programCache[key]) {\n options.programCache[key] = this.createProgram(options.context);\n }\n return options.programCache[key];\n }\n\n /**\n * Apply this filter using webgl.\n *\n * @param {Object} options\n * @param {Number} options.passes The number of filters remaining to be executed\n * @param {Boolean} options.webgl Whether to use webgl to render the filter.\n * @param {WebGLTexture} options.originalTexture The texture of the original input image.\n * @param {WebGLTexture} options.sourceTexture The texture setup as the source to be filtered.\n * @param {WebGLTexture} options.targetTexture The texture where filtered output should be drawn.\n * @param {WebGLRenderingContext} options.context The GL context used for rendering.\n * @param {Object} options.programCache A map of compiled shader programs, keyed by filter type.\n */\n applyToWebGL(options: TWebGLPipelineState) {\n const gl = options.context;\n const shader = this.retrieveShader(options);\n if (options.pass === 0 && options.originalTexture) {\n gl.bindTexture(gl.TEXTURE_2D, options.originalTexture);\n } else {\n gl.bindTexture(gl.TEXTURE_2D, options.sourceTexture);\n }\n gl.useProgram(shader.program);\n this.sendAttributeData(gl, shader.attributeLocations, options.aPosition);\n\n gl.uniform1f(shader.uniformLocations.uStepW, 1 / options.sourceWidth);\n gl.uniform1f(shader.uniformLocations.uStepH, 1 / options.sourceHeight);\n\n this.sendUniformData(gl, shader.uniformLocations);\n gl.viewport(0, 0, options.destinationWidth, options.destinationHeight);\n gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4);\n }\n\n bindAdditionalTexture(\n gl: WebGLRenderingContext,\n texture: WebGLTexture,\n textureUnit: number,\n ) {\n gl.activeTexture(textureUnit);\n gl.bindTexture(gl.TEXTURE_2D, texture);\n // reset active texture to 0 as usual\n gl.activeTexture(gl.TEXTURE0);\n }\n\n unbindAdditionalTexture(gl: WebGLRenderingContext, textureUnit: number) {\n gl.activeTexture(textureUnit);\n gl.bindTexture(gl.TEXTURE_2D, null);\n gl.activeTexture(gl.TEXTURE0);\n }\n\n /**\n * Send uniform data from this filter to its shader program on the GPU.\n *\n * Intended to be overridden by subclasses.\n *\n * @param {WebGLRenderingContext} _gl The canvas context used to compile the shader program.\n * @param {Object} _uniformLocations A map of shader uniform names to their locations.\n */\n sendUniformData(\n _gl: WebGLRenderingContext,\n _uniformLocations: TWebGLUniformLocationMap,\n ): void {\n // override by subclass\n }\n\n /**\n * If needed by a 2d filter, this functions can create an helper canvas to be used\n * remember that options.targetCanvas is available for use till end of chain.\n */\n createHelpLayer(options: T2DPipelineState) {\n if (!options.helpLayer) {\n const { sourceWidth, sourceHeight } = options;\n const helpLayer = createCanvasElementFor({\n width: sourceWidth,\n height: sourceHeight,\n });\n options.helpLayer = helpLayer;\n }\n }\n\n /**\n * Returns object representation of an instance\n * It will automatically export the default values of a filter,\n * stored in the static defaults property.\n * @return {Object} Object representation of an instance\n */\n toObject(): { type: Name } & SerializedProps {\n const defaultKeys = Object.keys(\n (this.constructor as typeof BaseFilter).defaults || {},\n ) as (keyof SerializedProps)[];\n\n return {\n type: this.type,\n ...defaultKeys.reduce((acc, key) => {\n acc[key] = this[\n key as keyof this\n ] as unknown as (typeof acc)[typeof key];\n return acc;\n }, {} as SerializedProps),\n };\n }\n\n /**\n * Returns a JSON representation of an instance\n * @return {Object} JSON\n */\n toJSON() {\n // delegate, not alias\n return this.toObject();\n }\n\n static async fromObject(\n { type, ...filterOptions }: Record,\n _options?: Abortable,\n ): Promise> {\n return new this(filterOptions);\n }\n}\n","export const blendColorFragmentSource = {\n multiply: 'gl_FragColor.rgb *= uColor.rgb;\\n',\n screen:\n 'gl_FragColor.rgb = 1.0 - (1.0 - gl_FragColor.rgb) * (1.0 - uColor.rgb);\\n',\n add: 'gl_FragColor.rgb += uColor.rgb;\\n',\n difference: 'gl_FragColor.rgb = abs(gl_FragColor.rgb - uColor.rgb);\\n',\n subtract: 'gl_FragColor.rgb -= uColor.rgb;\\n',\n lighten: 'gl_FragColor.rgb = max(gl_FragColor.rgb, uColor.rgb);\\n',\n darken: 'gl_FragColor.rgb = min(gl_FragColor.rgb, uColor.rgb);\\n',\n exclusion:\n 'gl_FragColor.rgb += uColor.rgb - 2.0 * (uColor.rgb * gl_FragColor.rgb);\\n',\n overlay: `\n if (uColor.r < 0.5) {\n gl_FragColor.r *= 2.0 * uColor.r;\n } else {\n gl_FragColor.r = 1.0 - 2.0 * (1.0 - gl_FragColor.r) * (1.0 - uColor.r);\n }\n if (uColor.g < 0.5) {\n gl_FragColor.g *= 2.0 * uColor.g;\n } else {\n gl_FragColor.g = 1.0 - 2.0 * (1.0 - gl_FragColor.g) * (1.0 - uColor.g);\n }\n if (uColor.b < 0.5) {\n gl_FragColor.b *= 2.0 * uColor.b;\n } else {\n gl_FragColor.b = 1.0 - 2.0 * (1.0 - gl_FragColor.b) * (1.0 - uColor.b);\n }\n `,\n tint: `\n gl_FragColor.rgb *= (1.0 - uColor.a);\n gl_FragColor.rgb += uColor.rgb;\n `,\n} as const;\n","import { Color } from '../color/Color';\nimport { BaseFilter } from './BaseFilter';\nimport type { T2DPipelineState, TWebGLUniformLocationMap } from './typedefs';\nimport { classRegistry } from '../ClassRegistry';\nimport { blendColorFragmentSource } from './shaders/blendColor';\n\nexport type TBlendMode =\n | 'multiply'\n | 'add'\n | 'difference'\n | 'screen'\n | 'subtract'\n | 'darken'\n | 'lighten'\n | 'overlay'\n | 'exclusion'\n | 'tint';\n\ntype BlendColorOwnProps = {\n color: string;\n mode: TBlendMode;\n alpha: number;\n};\n\nexport const blendColorDefaultValues: BlendColorOwnProps = {\n color: '#F95C63',\n mode: 'multiply',\n alpha: 1,\n};\n\n/**\n * Color Blend filter class\n * @example\n * const filter = new BlendColor({\n * color: '#000',\n * mode: 'multiply'\n * });\n *\n * const filter = new BlendImage({\n * image: fabricImageObject,\n * mode: 'multiply'\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n * canvas.renderAll();\n */\nexport class BlendColor extends BaseFilter<'BlendColor', BlendColorOwnProps> {\n /**\n * Color to make the blend operation with. default to a reddish color since black or white\n * gives always strong result.\n * @type String\n **/\n declare color: BlendColorOwnProps['color'];\n\n /**\n * Blend mode for the filter: one of multiply, add, difference, screen, subtract,\n * darken, lighten, overlay, exclusion, tint.\n * @type String\n **/\n declare mode: BlendColorOwnProps['mode'];\n /**\n * alpha value. represent the strength of the blend color operation.\n * @type Number\n **/\n declare alpha: BlendColorOwnProps['alpha'];\n\n static defaults = blendColorDefaultValues;\n\n static type = 'BlendColor';\n\n static uniformLocations = ['uColor'];\n\n getCacheKey() {\n return `${this.type}_${this.mode}`;\n }\n\n protected getFragmentSource(): string {\n return `\n precision highp float;\n uniform sampler2D uTexture;\n uniform vec4 uColor;\n varying vec2 vTexCoord;\n void main() {\n vec4 color = texture2D(uTexture, vTexCoord);\n gl_FragColor = color;\n if (color.a > 0.0) {\n ${blendColorFragmentSource[this.mode]}\n }\n }\n `;\n }\n\n /**\n * Apply the Blend operation to a Uint8ClampedArray representing the pixels of an image.\n *\n * @param {Object} options\n * @param {ImageData} options.imageData The Uint8ClampedArray to be filtered.\n */\n applyTo2d({ imageData: { data } }: T2DPipelineState) {\n const source = new Color(this.color).getSource();\n const alpha = this.alpha;\n const tr = source[0] * alpha;\n const tg = source[1] * alpha;\n const tb = source[2] * alpha;\n const alpha1 = 1 - alpha;\n\n for (let i = 0; i < data.length; i += 4) {\n const r = data[i];\n const g = data[i + 1];\n const b = data[i + 2];\n let oR, oG, oB;\n switch (this.mode) {\n case 'multiply':\n oR = (r * tr) / 255;\n oG = (g * tg) / 255;\n oB = (b * tb) / 255;\n break;\n case 'screen':\n oR = 255 - ((255 - r) * (255 - tr)) / 255;\n oG = 255 - ((255 - g) * (255 - tg)) / 255;\n oB = 255 - ((255 - b) * (255 - tb)) / 255;\n break;\n case 'add':\n oR = r + tr;\n oG = g + tg;\n oB = b + tb;\n break;\n case 'difference':\n oR = Math.abs(r - tr);\n oG = Math.abs(g - tg);\n oB = Math.abs(b - tb);\n break;\n case 'subtract':\n oR = r - tr;\n oG = g - tg;\n oB = b - tb;\n break;\n case 'darken':\n oR = Math.min(r, tr);\n oG = Math.min(g, tg);\n oB = Math.min(b, tb);\n break;\n case 'lighten':\n oR = Math.max(r, tr);\n oG = Math.max(g, tg);\n oB = Math.max(b, tb);\n break;\n case 'overlay':\n oR =\n tr < 128\n ? (2 * r * tr) / 255\n : 255 - (2 * (255 - r) * (255 - tr)) / 255;\n oG =\n tg < 128\n ? (2 * g * tg) / 255\n : 255 - (2 * (255 - g) * (255 - tg)) / 255;\n oB =\n tb < 128\n ? (2 * b * tb) / 255\n : 255 - (2 * (255 - b) * (255 - tb)) / 255;\n break;\n case 'exclusion':\n oR = tr + r - (2 * tr * r) / 255;\n oG = tg + g - (2 * tg * g) / 255;\n oB = tb + b - (2 * tb * b) / 255;\n break;\n case 'tint':\n oR = tr + r * alpha1;\n oG = tg + g * alpha1;\n oB = tb + b * alpha1;\n }\n data[i] = oR;\n data[i + 1] = oG;\n data[i + 2] = oB;\n }\n }\n\n /**\n * Send data from this filter to its shader program's uniforms.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n */\n sendUniformData(\n gl: WebGLRenderingContext,\n uniformLocations: TWebGLUniformLocationMap,\n ) {\n const source = new Color(this.color).getSource();\n source[0] = (this.alpha * source[0]) / 255;\n source[1] = (this.alpha * source[1]) / 255;\n source[2] = (this.alpha * source[2]) / 255;\n source[3] = this.alpha;\n gl.uniform4fv(uniformLocations.uColor, source);\n }\n}\n\nclassRegistry.setClass(BlendColor);\n","import type { TBlendImageMode } from '../BlendImage';\n\nexport const fragmentSource: Record = {\n multiply: `\n precision highp float;\n uniform sampler2D uTexture;\n uniform sampler2D uImage;\n uniform vec4 uColor;\n varying vec2 vTexCoord;\n varying vec2 vTexCoord2;\n void main() {\n vec4 color = texture2D(uTexture, vTexCoord);\n vec4 color2 = texture2D(uImage, vTexCoord2);\n color.rgba *= color2.rgba;\n gl_FragColor = color;\n }\n `,\n mask: `\n precision highp float;\n uniform sampler2D uTexture;\n uniform sampler2D uImage;\n uniform vec4 uColor;\n varying vec2 vTexCoord;\n varying vec2 vTexCoord2;\n void main() {\n vec4 color = texture2D(uTexture, vTexCoord);\n vec4 color2 = texture2D(uImage, vTexCoord2);\n color.a = color2.a;\n gl_FragColor = color;\n }\n `,\n} as const;\n\nexport const vertexSource = `\n attribute vec2 aPosition;\n varying vec2 vTexCoord;\n varying vec2 vTexCoord2;\n uniform mat3 uTransformMatrix;\n void main() {\n vTexCoord = aPosition;\n vTexCoord2 = (uTransformMatrix * vec3(aPosition, 1.0)).xy;\n gl_Position = vec4(aPosition * 2.0 - 1.0, 0.0, 1.0);\n }\n ` as const;\n","import { FabricImage } from '../shapes/Image';\nimport { createCanvasElement } from '../util/misc/dom';\nimport { BaseFilter } from './BaseFilter';\nimport type {\n T2DPipelineState,\n TWebGLPipelineState,\n TWebGLUniformLocationMap,\n} from './typedefs';\nimport type { WebGLFilterBackend } from './WebGLFilterBackend';\nimport { classRegistry } from '../ClassRegistry';\nimport { fragmentSource, vertexSource } from './shaders/blendImage';\n\nexport type TBlendImageMode = 'multiply' | 'mask';\n\ntype BlendImageOwnProps = {\n mode: TBlendImageMode;\n alpha: number;\n};\n\nexport const blendImageDefaultValues: BlendImageOwnProps = {\n mode: 'multiply',\n alpha: 1,\n};\n\n/**\n * Image Blend filter class\n * @example\n * const filter = new filters.BlendColor({\n * color: '#000',\n * mode: 'multiply'\n * });\n *\n * const filter = new BlendImage({\n * image: fabricImageObject,\n * mode: 'multiply'\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n * canvas.renderAll();\n */\nexport class BlendImage extends BaseFilter<'BlendImage', BlendImageOwnProps> {\n /**\n * Image to make the blend operation with.\n **/\n declare image: FabricImage;\n\n /**\n * Blend mode for the filter: either 'multiply' or 'mask'. 'multiply' will\n * multiply the values of each channel (R, G, B, and A) of the filter image by\n * their corresponding values in the base image. 'mask' will only look at the\n * alpha channel of the filter image, and apply those values to the base\n * image's alpha channel.\n * @type String\n **/\n declare mode: BlendImageOwnProps['mode'];\n\n /**\n * alpha value. represent the strength of the blend image operation.\n * not implemented.\n **/\n declare alpha: BlendImageOwnProps['alpha'];\n\n static type = 'BlendImage';\n\n static defaults = blendImageDefaultValues;\n\n static uniformLocations = ['uTransformMatrix', 'uImage'];\n\n getCacheKey() {\n return `${this.type}_${this.mode}`;\n }\n\n getFragmentSource(): string {\n return fragmentSource[this.mode];\n }\n\n getVertexSource(): string {\n return vertexSource;\n }\n\n applyToWebGL(options: TWebGLPipelineState) {\n const gl = options.context,\n texture = this.createTexture(options.filterBackend, this.image);\n this.bindAdditionalTexture(gl, texture!, gl.TEXTURE1);\n super.applyToWebGL(options);\n this.unbindAdditionalTexture(gl, gl.TEXTURE1);\n }\n\n createTexture(backend: WebGLFilterBackend, image: FabricImage) {\n return backend.getCachedTexture(image.cacheKey, image.getElement());\n }\n\n /**\n * Calculate a transformMatrix to adapt the image to blend over\n * @param {Object} options\n * @param {WebGLRenderingContext} options.context The GL context used for rendering.\n * @param {Object} options.programCache A map of compiled shader programs, keyed by filter type.\n */\n calculateMatrix() {\n const image = this.image,\n { width, height } = image.getElement();\n return [\n 1 / image.scaleX,\n 0,\n 0,\n 0,\n 1 / image.scaleY,\n 0,\n -image.left / width,\n -image.top / height,\n 1,\n ];\n }\n\n /**\n * Apply the Blend operation to a Uint8ClampedArray representing the pixels of an image.\n *\n * @param {Object} options\n * @param {ImageData} options.imageData The Uint8ClampedArray to be filtered.\n */\n applyTo2d({\n imageData: { data, width, height },\n filterBackend: { resources },\n }: T2DPipelineState) {\n const image = this.image;\n if (!resources.blendImage) {\n resources.blendImage = createCanvasElement();\n }\n const canvas1 = resources.blendImage;\n const context = canvas1.getContext('2d')!;\n if (canvas1.width !== width || canvas1.height !== height) {\n canvas1.width = width;\n canvas1.height = height;\n } else {\n context.clearRect(0, 0, width, height);\n }\n context.setTransform(\n image.scaleX,\n 0,\n 0,\n image.scaleY,\n image.left,\n image.top,\n );\n context.drawImage(image.getElement(), 0, 0, width, height);\n const blendData = context.getImageData(0, 0, width, height).data;\n for (let i = 0; i < data.length; i += 4) {\n const r = data[i];\n const g = data[i + 1];\n const b = data[i + 2];\n const a = data[i + 3];\n\n const tr = blendData[i];\n const tg = blendData[i + 1];\n const tb = blendData[i + 2];\n const ta = blendData[i + 3];\n\n switch (this.mode) {\n case 'multiply':\n data[i] = (r * tr) / 255;\n data[i + 1] = (g * tg) / 255;\n data[i + 2] = (b * tb) / 255;\n data[i + 3] = (a * ta) / 255;\n break;\n case 'mask':\n data[i + 3] = ta;\n break;\n }\n }\n }\n\n /**\n * Send data from this filter to its shader program's uniforms.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n */\n sendUniformData(\n gl: WebGLRenderingContext,\n uniformLocations: TWebGLUniformLocationMap,\n ) {\n const matrix = this.calculateMatrix();\n gl.uniform1i(uniformLocations.uImage, 1); // texture unit 1.\n gl.uniformMatrix3fv(uniformLocations.uTransformMatrix, false, matrix);\n }\n\n /**\n * Returns object representation of an instance\n * TODO: Handle the possibility of missing image better.\n * As of now a BlendImage filter without image can't be used with fromObject\n * @return {Object} Object representation of an instance\n */\n toObject(): {\n type: 'BlendImage';\n image: ReturnType;\n } & BlendImageOwnProps {\n return {\n ...super.toObject(),\n image: this.image && this.image.toObject(),\n };\n }\n\n /**\n * Create filter instance from an object representation\n * @param {object} object Object to create an instance from\n * @param {object} [options]\n * @param {AbortSignal} [options.signal] handle aborting image loading, see https://developer.mozilla.org/en-US/docs/Web/API/AbortController/signal\n * @returns {Promise}\n */\n static async fromObject(\n { type, image, ...filterOptions }: Record,\n options: { signal: AbortSignal },\n ): Promise> {\n return FabricImage.fromObject(image, options).then(\n (enlivedImage) => new this({ ...filterOptions, image: enlivedImage }),\n );\n }\n}\n\nclassRegistry.setClass(BlendImage);\n","export const fragmentSource = `\n precision highp float;\n uniform sampler2D uTexture;\n uniform vec2 uDelta;\n varying vec2 vTexCoord;\n const float nSamples = 15.0;\n vec3 v3offset = vec3(12.9898, 78.233, 151.7182);\n float random(vec3 scale) {\n /* use the fragment position for a different seed per-pixel */\n return fract(sin(dot(gl_FragCoord.xyz, scale)) * 43758.5453);\n }\n void main() {\n vec4 color = vec4(0.0);\n float totalC = 0.0;\n float totalA = 0.0;\n float offset = random(v3offset);\n for (float t = -nSamples; t <= nSamples; t++) {\n float percent = (t + offset - 0.5) / nSamples;\n vec4 sample = texture2D(uTexture, vTexCoord + uDelta * percent);\n float weight = 1.0 - abs(percent);\n float alpha = weight * sample.a;\n color.rgb += sample.rgb * alpha;\n color.a += alpha;\n totalA += weight;\n totalC += alpha;\n }\n gl_FragColor.rgb = color.rgb / totalC;\n gl_FragColor.a = color.a / totalA;\n }\n ` as const;\n","import { BaseFilter } from './BaseFilter';\nimport type {\n TWebGLPipelineState,\n T2DPipelineState,\n TWebGLUniformLocationMap,\n} from './typedefs';\nimport { isWebGLPipelineState } from './utils';\nimport { classRegistry } from '../ClassRegistry';\nimport { fragmentSource } from './shaders/blur';\n\ntype BlurOwnProps = {\n blur: number;\n};\n\nexport const blurDefaultValues: BlurOwnProps = {\n blur: 0,\n};\n\n/**\n * Blur filter class\n * @example\n * const filter = new Blur({\n * blur: 0.5\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n * canvas.renderAll();\n */\nexport class Blur extends BaseFilter<'Blur', BlurOwnProps> {\n /**\n * blur value, in percentage of image dimensions.\n * specific to keep the image blur constant at different resolutions\n * range between 0 and 1.\n * @type Number\n */\n declare blur: BlurOwnProps['blur'];\n\n declare horizontal: boolean;\n declare aspectRatio: number;\n\n static type = 'Blur';\n\n static defaults = blurDefaultValues;\n\n static uniformLocations = ['uDelta'];\n\n getFragmentSource(): string {\n return fragmentSource;\n }\n\n applyTo(options: TWebGLPipelineState | T2DPipelineState) {\n if (isWebGLPipelineState(options)) {\n // this aspectRatio is used to give the same blur to vertical and horizontal\n this.aspectRatio = options.sourceWidth / options.sourceHeight;\n options.passes++;\n this._setupFrameBuffer(options);\n this.horizontal = true;\n this.applyToWebGL(options);\n this._swapTextures(options);\n this._setupFrameBuffer(options);\n this.horizontal = false;\n this.applyToWebGL(options);\n this._swapTextures(options);\n } else {\n this.applyTo2d(options);\n }\n }\n\n applyTo2d({ imageData: { data, width, height } }: T2DPipelineState) {\n // this code mimic the shader for output consistency\n // it samples 31 pixels across the image over a distance that depends from the blur value.\n this.aspectRatio = width / height;\n this.horizontal = true;\n let blurValue = this.getBlurValue() * width;\n const imageData = new Uint8ClampedArray(data);\n const samples = 15;\n const bytesInRow = 4 * width;\n for (let i = 0; i < data.length; i += 4) {\n let r = 0.0,\n g = 0.0,\n b = 0.0,\n a = 0.0,\n totalA = 0;\n const minIRow = i - (i % bytesInRow);\n const maxIRow = minIRow + bytesInRow;\n // for now let's keep noise out of the way\n // let pixelOffset = 0;\n // const offset = Math.random() * 3;\n // if (offset > 2) {\n // pixelOffset = 4;\n // } else if (offset < 1) {\n // pixelOffset = -4;\n // }\n for (let j = -samples + 1; j < samples; j++) {\n const percent = j / samples;\n const distance = Math.floor(blurValue * percent) * 4;\n const weight = 1 - Math.abs(percent);\n let sampledPixel = i + distance; // + pixelOffset;\n // try to implement edge mirroring\n if (sampledPixel < minIRow) {\n sampledPixel = minIRow;\n } else if (sampledPixel > maxIRow) {\n sampledPixel = maxIRow;\n }\n const localAlpha = data[sampledPixel + 3] * weight;\n r += data[sampledPixel] * localAlpha;\n g += data[sampledPixel + 1] * localAlpha;\n b += data[sampledPixel + 2] * localAlpha;\n a += localAlpha;\n totalA += weight;\n }\n imageData[i] = r / a;\n imageData[i + 1] = g / a;\n imageData[i + 2] = b / a;\n imageData[i + 3] = a / totalA;\n }\n this.horizontal = false;\n blurValue = this.getBlurValue() * height;\n for (let i = 0; i < imageData.length; i += 4) {\n let r = 0.0,\n g = 0.0,\n b = 0.0,\n a = 0.0,\n totalA = 0;\n const minIRow = i % bytesInRow;\n const maxIRow = imageData.length - bytesInRow + minIRow;\n // for now let's keep noise out of the way\n // let pixelOffset = 0;\n // const offset = Math.random() * 3;\n // if (offset > 2) {\n // pixelOffset = bytesInRow;\n // } else if (offset < 1) {\n // pixelOffset = -bytesInRow;\n // }\n for (let j = -samples + 1; j < samples; j++) {\n const percent = j / samples;\n const distance = Math.floor(blurValue * percent) * bytesInRow;\n const weight = 1 - Math.abs(percent);\n let sampledPixel = i + distance; // + pixelOffset;\n // try to implement edge mirroring\n if (sampledPixel < minIRow) {\n sampledPixel = minIRow;\n } else if (sampledPixel > maxIRow) {\n sampledPixel = maxIRow;\n }\n const localAlpha = imageData[sampledPixel + 3] * weight;\n r += imageData[sampledPixel] * localAlpha;\n g += imageData[sampledPixel + 1] * localAlpha;\n b += imageData[sampledPixel + 2] * localAlpha;\n a += localAlpha;\n totalA += weight;\n }\n data[i] = r / a;\n data[i + 1] = g / a;\n data[i + 2] = b / a;\n data[i + 3] = a / totalA;\n }\n }\n\n /**\n * Send data from this filter to its shader program's uniforms.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n */\n sendUniformData(\n gl: WebGLRenderingContext,\n uniformLocations: TWebGLUniformLocationMap,\n ) {\n const delta = this.chooseRightDelta();\n gl.uniform2fv(uniformLocations.uDelta, delta);\n }\n\n isNeutralState() {\n return this.blur === 0;\n }\n\n getBlurValue(): number {\n let blurScale = 1;\n const { horizontal, aspectRatio } = this;\n if (horizontal) {\n if (aspectRatio > 1) {\n // image is wide, i want to shrink radius horizontal\n blurScale = 1 / aspectRatio;\n }\n } else {\n if (aspectRatio < 1) {\n // image is tall, i want to shrink radius vertical\n blurScale = aspectRatio;\n }\n }\n return blurScale * this.blur * 0.12;\n }\n\n /**\n * choose right value of image percentage to blur with\n * @returns {Array} a numeric array with delta values\n */\n chooseRightDelta() {\n const blur = this.getBlurValue();\n return this.horizontal ? [blur, 0] : [0, blur];\n }\n}\n\nclassRegistry.setClass(Blur);\n","export const fragmentSource = `\n precision highp float;\n uniform sampler2D uTexture;\n uniform float uBrightness;\n varying vec2 vTexCoord;\n void main() {\n vec4 color = texture2D(uTexture, vTexCoord);\n color.rgb += uBrightness;\n gl_FragColor = color;\n }\n`;\n","import { BaseFilter } from './BaseFilter';\nimport type { T2DPipelineState, TWebGLUniformLocationMap } from './typedefs';\nimport { classRegistry } from '../ClassRegistry';\nimport { fragmentSource } from './shaders/brightness';\n\ntype BrightnessOwnProps = {\n brightness: number;\n};\n\nexport const brightnessDefaultValues: BrightnessOwnProps = {\n brightness: 0,\n};\n\n/**\n * Brightness filter class\n * @example\n * const filter = new Brightness({\n * brightness: 0.05\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n */\nexport class Brightness extends BaseFilter<'Brightness', BrightnessOwnProps> {\n /**\n * Brightness value, from -1 to 1.\n * translated to -255 to 255 for 2d\n * 0.0039215686 is the part of 1 that get translated to 1 in 2d\n * @param {Number} brightness\n */\n declare brightness: BrightnessOwnProps['brightness'];\n\n static type = 'Brightness';\n\n static defaults = brightnessDefaultValues;\n\n static uniformLocations = ['uBrightness'];\n\n getFragmentSource() {\n return fragmentSource;\n }\n\n /**\n * Apply the Brightness operation to a Uint8ClampedArray representing the pixels of an image.\n *\n * @param {Object} options\n * @param {ImageData} options.imageData The Uint8ClampedArray to be filtered.\n */\n applyTo2d({ imageData: { data } }: T2DPipelineState) {\n const brightness = Math.round(this.brightness * 255);\n for (let i = 0; i < data.length; i += 4) {\n data[i] += brightness;\n data[i + 1] += brightness;\n data[i + 2] += brightness;\n }\n }\n\n isNeutralState() {\n return this.brightness === 0;\n }\n\n /**\n * Send data from this filter to its shader program's uniforms.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n */\n sendUniformData(\n gl: WebGLRenderingContext,\n uniformLocations: TWebGLUniformLocationMap,\n ) {\n gl.uniform1f(uniformLocations.uBrightness, this.brightness);\n }\n}\n\nclassRegistry.setClass(Brightness);\n","export const fragmentSource = `\n precision highp float;\n uniform sampler2D uTexture;\n varying vec2 vTexCoord;\n uniform mat4 uColorMatrix;\n uniform vec4 uConstants;\n void main() {\n vec4 color = texture2D(uTexture, vTexCoord);\n color *= uColorMatrix;\n color += uConstants;\n gl_FragColor = color;\n }`;\n","import { BaseFilter } from './BaseFilter';\nimport type {\n T2DPipelineState,\n TMatColorMatrix,\n TWebGLUniformLocationMap,\n} from './typedefs';\nimport { classRegistry } from '../ClassRegistry';\nimport { fragmentSource } from './shaders/colorMatrix';\n\nexport type ColorMatrixOwnProps = {\n matrix: TMatColorMatrix;\n colorsOnly: boolean;\n};\n\nexport const colorMatrixDefaultValues: ColorMatrixOwnProps = {\n matrix: [1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0],\n colorsOnly: true,\n};\n\n/**\n * Color Matrix filter class\n * @see {@link http://fabric5.fabricjs.com/image-filters|ImageFilters demo}\n * @see {@link http://phoboslab.org/log/2013/11/fast-image-filters-with-webgl demo}\n * @example Kodachrome filter\n * const filter = new ColorMatrix({\n * matrix: [\n 1.1285582396593525, -0.3967382283601348, -0.03992559172921793, 0, 63.72958762196502,\n -0.16404339962244616, 1.0835251566291304, -0.05498805115633132, 0, 24.732407896706203,\n -0.16786010706155763, -0.5603416277695248, 1.6014850761964943, 0, 35.62982807460946,\n 0, 0, 0, 1, 0\n ]\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n */\nexport class ColorMatrix<\n Name extends string = 'ColorMatrix',\n OwnProps extends object = ColorMatrixOwnProps,\n SerializedProps extends object = ColorMatrixOwnProps,\n> extends BaseFilter {\n /**\n * Colormatrix for pixels.\n * array of 20 floats. Numbers in positions 4, 9, 14, 19 loose meaning\n * outside the -1, 1 range.\n * 0.0039215686 is the part of 1 that get translated to 1 in 2d\n * @param {Array} matrix array of 20 numbers.\n */\n declare matrix: ColorMatrixOwnProps['matrix'];\n\n /**\n * Lock the colormatrix on the color part, skipping alpha, mainly for non webgl scenario\n * to save some calculation\n * @type Boolean\n * @default true\n */\n declare colorsOnly: ColorMatrixOwnProps['colorsOnly'];\n\n static type = 'ColorMatrix';\n\n static defaults = colorMatrixDefaultValues;\n\n static uniformLocations = ['uColorMatrix', 'uConstants'];\n\n getFragmentSource(): string {\n return fragmentSource;\n }\n\n /**\n * Apply the ColorMatrix operation to a Uint8Array representing the pixels of an image.\n *\n * @param {Object} options\n * @param {ImageData} options.imageData The Uint8Array to be filtered.\n */\n applyTo2d(options: T2DPipelineState) {\n const imageData = options.imageData,\n data = imageData.data,\n m = this.matrix,\n colorsOnly = this.colorsOnly;\n\n for (let i = 0; i < data.length; i += 4) {\n const r = data[i];\n const g = data[i + 1];\n const b = data[i + 2];\n\n data[i] = r * m[0] + g * m[1] + b * m[2] + m[4] * 255;\n data[i + 1] = r * m[5] + g * m[6] + b * m[7] + m[9] * 255;\n data[i + 2] = r * m[10] + g * m[11] + b * m[12] + m[14] * 255;\n if (!colorsOnly) {\n const a = data[i + 3];\n data[i] += a * m[3];\n data[i + 1] += a * m[8];\n data[i + 2] += a * m[13];\n data[i + 3] =\n r * m[15] + g * m[16] + b * m[17] + a * m[18] + m[19] * 255;\n }\n }\n }\n\n /**\n * Send data from this filter to its shader program's uniforms.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n */\n sendUniformData(\n gl: WebGLRenderingContext,\n uniformLocations: TWebGLUniformLocationMap,\n ) {\n const m = this.matrix,\n matrix = [\n m[0],\n m[1],\n m[2],\n m[3],\n m[5],\n m[6],\n m[7],\n m[8],\n m[10],\n m[11],\n m[12],\n m[13],\n m[15],\n m[16],\n m[17],\n m[18],\n ],\n constants = [m[4], m[9], m[14], m[19]];\n gl.uniformMatrix4fv(uniformLocations.uColorMatrix, false, matrix);\n gl.uniform4fv(uniformLocations.uConstants, constants);\n }\n\n toObject(): { type: Name } & SerializedProps {\n return {\n ...super.toObject(),\n matrix: [...this.matrix] as TMatColorMatrix,\n };\n }\n}\n\nclassRegistry.setClass(ColorMatrix);\n","import { ColorMatrix } from './ColorMatrix';\nimport { classRegistry } from '../ClassRegistry';\nimport type { TMatColorMatrix } from './typedefs';\n\ntype FixedFiltersOwnProps = {\n colorsOnly: boolean;\n};\n\nexport function createColorMatrixFilter(key: string, matrix: TMatColorMatrix) {\n const newClass = class extends ColorMatrix<\n typeof key,\n FixedFiltersOwnProps,\n FixedFiltersOwnProps\n > {\n static type = key;\n\n static defaults = {\n colorsOnly: false,\n matrix,\n };\n\n toObject(): { type: string } & FixedFiltersOwnProps {\n return { type: this.type, colorsOnly: this.colorsOnly };\n }\n };\n classRegistry.setClass(newClass, key);\n return newClass as typeof ColorMatrix;\n}\n\nexport const Brownie = createColorMatrixFilter(\n 'Brownie',\n [\n 0.5997, 0.34553, -0.27082, 0, 0.186, -0.0377, 0.86095, 0.15059, 0, -0.1449,\n 0.24113, -0.07441, 0.44972, 0, -0.02965, 0, 0, 0, 1, 0,\n ],\n);\n\nexport const Vintage = createColorMatrixFilter(\n 'Vintage',\n [\n 0.62793, 0.32021, -0.03965, 0, 0.03784, 0.02578, 0.64411, 0.03259, 0,\n 0.02926, 0.0466, -0.08512, 0.52416, 0, 0.02023, 0, 0, 0, 1, 0,\n ],\n);\n\nexport const Kodachrome = createColorMatrixFilter(\n 'Kodachrome',\n [\n 1.12855, -0.39673, -0.03992, 0, 0.24991, -0.16404, 1.08352, -0.05498, 0,\n 0.09698, -0.16786, -0.56034, 1.60148, 0, 0.13972, 0, 0, 0, 1, 0,\n ],\n);\n\nexport const Technicolor = createColorMatrixFilter(\n 'Technicolor',\n [\n 1.91252, -0.85453, -0.09155, 0, 0.04624, -0.30878, 1.76589, -0.10601, 0,\n -0.27589, -0.2311, -0.75018, 1.84759, 0, 0.12137, 0, 0, 0, 1, 0,\n ],\n);\n\nexport const Polaroid = createColorMatrixFilter(\n 'Polaroid',\n [\n 1.438, -0.062, -0.062, 0, 0, -0.122, 1.378, -0.122, 0, 0, -0.016, -0.016,\n 1.483, 0, 0, 0, 0, 0, 1, 0,\n ],\n);\n\nexport const Sepia = createColorMatrixFilter(\n 'Sepia',\n [\n 0.393, 0.769, 0.189, 0, 0, 0.349, 0.686, 0.168, 0, 0, 0.272, 0.534, 0.131,\n 0, 0, 0, 0, 0, 1, 0,\n ],\n);\n\nexport const BlackWhite = createColorMatrixFilter(\n 'BlackWhite',\n [\n 1.5, 1.5, 1.5, 0, -1, 1.5, 1.5, 1.5, 0, -1, 1.5, 1.5, 1.5, 0, -1, 0, 0, 0,\n 1, 0,\n ],\n);\n","import { BaseFilter } from './BaseFilter';\nimport type { T2DPipelineState, TWebGLPipelineState } from './typedefs';\nimport { isWebGLPipelineState } from './utils';\nimport { classRegistry } from '../ClassRegistry';\n\ntype ComposedOwnProps = {\n subFilters: BaseFilter[];\n};\n\ntype ComposedSerializedProps = {\n subFilters: Record[];\n};\n\n/**\n * A container class that knows how to apply a sequence of filters to an input image.\n */\nexport class Composed extends BaseFilter<\n 'Composed',\n ComposedOwnProps,\n ComposedSerializedProps\n> {\n /**\n * A non sparse array of filters to apply\n */\n declare subFilters: ComposedOwnProps['subFilters'];\n\n static type = 'Composed';\n\n constructor(\n options: { subFilters?: BaseFilter[] } & Record = {},\n ) {\n super(options);\n this.subFilters = options.subFilters || [];\n }\n\n /**\n * Apply this container's filters to the input image provided.\n *\n * @param {Object} options\n * @param {Number} options.passes The number of filters remaining to be applied.\n */\n applyTo(options: TWebGLPipelineState | T2DPipelineState) {\n if (isWebGLPipelineState(options)) {\n options.passes += this.subFilters.length - 1;\n }\n this.subFilters.forEach((filter) => {\n filter.applyTo(options);\n });\n }\n\n /**\n * Serialize this filter into JSON.\n * @returns {Object} A JSON representation of this filter.\n */\n toObject() {\n return {\n type: this.type,\n subFilters: this.subFilters.map((filter) => filter.toObject()),\n };\n }\n\n isNeutralState() {\n return !this.subFilters.some((filter) => !filter.isNeutralState());\n }\n\n /**\n * Deserialize a JSON definition of a ComposedFilter into a concrete instance.\n * @param {oject} object Object to create an instance from\n * @param {object} [options]\n * @param {AbortSignal} [options.signal] handle aborting `BlendImage` filter loading, see https://developer.mozilla.org/en-US/docs/Web/API/AbortController/signal\n * @returns {Promise}\n */\n static fromObject(\n object: Record,\n options?: { signal: AbortSignal },\n ): Promise {\n return Promise.all(\n ((object.subFilters || []) as BaseFilter[]).map((filter) =>\n classRegistry\n .getClass(filter.type)\n .fromObject(filter, options),\n ),\n ).then((enlivedFilters) => new this({ subFilters: enlivedFilters }));\n }\n}\n\nclassRegistry.setClass(Composed);\n","export const fragmentSource = `\n precision highp float;\n uniform sampler2D uTexture;\n uniform float uContrast;\n varying vec2 vTexCoord;\n void main() {\n vec4 color = texture2D(uTexture, vTexCoord);\n float contrastF = 1.015 * (uContrast + 1.0) / (1.0 * (1.015 - uContrast));\n color.rgb = contrastF * (color.rgb - 0.5) + 0.5;\n gl_FragColor = color;\n }`;\n","import { BaseFilter } from './BaseFilter';\nimport type { T2DPipelineState, TWebGLUniformLocationMap } from './typedefs';\nimport { classRegistry } from '../ClassRegistry';\nimport { fragmentSource } from './shaders/constrast';\n\ntype ContrastOwnProps = {\n contrast: number;\n};\n\nexport const contrastDefaultValues: ContrastOwnProps = {\n contrast: 0,\n};\n\n/**\n * Contrast filter class\n * @example\n * const filter = new Contrast({\n * contrast: 0.25\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n */\nexport class Contrast extends BaseFilter<'Contrast', ContrastOwnProps> {\n /**\n * contrast value, range from -1 to 1.\n * @param {Number} contrast\n * @default 0\n */\n declare contrast: ContrastOwnProps['contrast'];\n\n static type = 'Contrast';\n\n static defaults = contrastDefaultValues;\n\n static uniformLocations = ['uContrast'];\n\n getFragmentSource() {\n return fragmentSource;\n }\n\n isNeutralState() {\n return this.contrast === 0;\n }\n\n /**\n * Apply the Contrast operation to a Uint8Array representing the pixels of an image.\n *\n * @param {Object} options\n * @param {ImageData} options.imageData The Uint8Array to be filtered.\n */\n applyTo2d({ imageData: { data } }: T2DPipelineState) {\n const contrast = Math.floor(this.contrast * 255),\n contrastF = (259 * (contrast + 255)) / (255 * (259 - contrast));\n\n for (let i = 0; i < data.length; i += 4) {\n data[i] = contrastF * (data[i] - 128) + 128;\n data[i + 1] = contrastF * (data[i + 1] - 128) + 128;\n data[i + 2] = contrastF * (data[i + 2] - 128) + 128;\n }\n }\n\n /**\n * Send data from this filter to its shader program's uniforms.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n */\n sendUniformData(\n gl: WebGLRenderingContext,\n uniformLocations: TWebGLUniformLocationMap,\n ) {\n gl.uniform1f(uniformLocations.uContrast, this.contrast);\n }\n}\n\nclassRegistry.setClass(Contrast);\n","export const fragmentSource = {\n Convolute_3_1: `\n precision highp float;\n uniform sampler2D uTexture;\n uniform float uMatrix[9];\n uniform float uStepW;\n uniform float uStepH;\n varying vec2 vTexCoord;\n void main() {\n vec4 color = vec4(0, 0, 0, 0);\n for (float h = 0.0; h < 3.0; h+=1.0) {\n for (float w = 0.0; w < 3.0; w+=1.0) {\n vec2 matrixPos = vec2(uStepW * (w - 1), uStepH * (h - 1));\n color += texture2D(uTexture, vTexCoord + matrixPos) * uMatrix[int(h * 3.0 + w)];\n }\n }\n gl_FragColor = color;\n }\n `,\n Convolute_3_0: `\n precision highp float;\n uniform sampler2D uTexture;\n uniform float uMatrix[9];\n uniform float uStepW;\n uniform float uStepH;\n varying vec2 vTexCoord;\n void main() {\n vec4 color = vec4(0, 0, 0, 1);\n for (float h = 0.0; h < 3.0; h+=1.0) {\n for (float w = 0.0; w < 3.0; w+=1.0) {\n vec2 matrixPos = vec2(uStepW * (w - 1.0), uStepH * (h - 1.0));\n color.rgb += texture2D(uTexture, vTexCoord + matrixPos).rgb * uMatrix[int(h * 3.0 + w)];\n }\n }\n float alpha = texture2D(uTexture, vTexCoord).a;\n gl_FragColor = color;\n gl_FragColor.a = alpha;\n }\n `,\n Convolute_5_1: `\n precision highp float;\n uniform sampler2D uTexture;\n uniform float uMatrix[25];\n uniform float uStepW;\n uniform float uStepH;\n varying vec2 vTexCoord;\n void main() {\n vec4 color = vec4(0, 0, 0, 0);\n for (float h = 0.0; h < 5.0; h+=1.0) {\n for (float w = 0.0; w < 5.0; w+=1.0) {\n vec2 matrixPos = vec2(uStepW * (w - 2.0), uStepH * (h - 2.0));\n color += texture2D(uTexture, vTexCoord + matrixPos) * uMatrix[int(h * 5.0 + w)];\n }\n }\n gl_FragColor = color;\n }\n `,\n Convolute_5_0: `\n precision highp float;\n uniform sampler2D uTexture;\n uniform float uMatrix[25];\n uniform float uStepW;\n uniform float uStepH;\n varying vec2 vTexCoord;\n void main() {\n vec4 color = vec4(0, 0, 0, 1);\n for (float h = 0.0; h < 5.0; h+=1.0) {\n for (float w = 0.0; w < 5.0; w+=1.0) {\n vec2 matrixPos = vec2(uStepW * (w - 2.0), uStepH * (h - 2.0));\n color.rgb += texture2D(uTexture, vTexCoord + matrixPos).rgb * uMatrix[int(h * 5.0 + w)];\n }\n }\n float alpha = texture2D(uTexture, vTexCoord).a;\n gl_FragColor = color;\n gl_FragColor.a = alpha;\n }\n `,\n Convolute_7_1: `\n precision highp float;\n uniform sampler2D uTexture;\n uniform float uMatrix[49];\n uniform float uStepW;\n uniform float uStepH;\n varying vec2 vTexCoord;\n void main() {\n vec4 color = vec4(0, 0, 0, 0);\n for (float h = 0.0; h < 7.0; h+=1.0) {\n for (float w = 0.0; w < 7.0; w+=1.0) {\n vec2 matrixPos = vec2(uStepW * (w - 3.0), uStepH * (h - 3.0));\n color += texture2D(uTexture, vTexCoord + matrixPos) * uMatrix[int(h * 7.0 + w)];\n }\n }\n gl_FragColor = color;\n }\n `,\n Convolute_7_0: `\n precision highp float;\n uniform sampler2D uTexture;\n uniform float uMatrix[49];\n uniform float uStepW;\n uniform float uStepH;\n varying vec2 vTexCoord;\n void main() {\n vec4 color = vec4(0, 0, 0, 1);\n for (float h = 0.0; h < 7.0; h+=1.0) {\n for (float w = 0.0; w < 7.0; w+=1.0) {\n vec2 matrixPos = vec2(uStepW * (w - 3.0), uStepH * (h - 3.0));\n color.rgb += texture2D(uTexture, vTexCoord + matrixPos).rgb * uMatrix[int(h * 7.0 + w)];\n }\n }\n float alpha = texture2D(uTexture, vTexCoord).a;\n gl_FragColor = color;\n gl_FragColor.a = alpha;\n }\n `,\n Convolute_9_1: `\n precision highp float;\n uniform sampler2D uTexture;\n uniform float uMatrix[81];\n uniform float uStepW;\n uniform float uStepH;\n varying vec2 vTexCoord;\n void main() {\n vec4 color = vec4(0, 0, 0, 0);\n for (float h = 0.0; h < 9.0; h+=1.0) {\n for (float w = 0.0; w < 9.0; w+=1.0) {\n vec2 matrixPos = vec2(uStepW * (w - 4.0), uStepH * (h - 4.0));\n color += texture2D(uTexture, vTexCoord + matrixPos) * uMatrix[int(h * 9.0 + w)];\n }\n }\n gl_FragColor = color;\n }\n `,\n Convolute_9_0: `\n precision highp float;\n uniform sampler2D uTexture;\n uniform float uMatrix[81];\n uniform float uStepW;\n uniform float uStepH;\n varying vec2 vTexCoord;\n void main() {\n vec4 color = vec4(0, 0, 0, 1);\n for (float h = 0.0; h < 9.0; h+=1.0) {\n for (float w = 0.0; w < 9.0; w+=1.0) {\n vec2 matrixPos = vec2(uStepW * (w - 4.0), uStepH * (h - 4.0));\n color.rgb += texture2D(uTexture, vTexCoord + matrixPos).rgb * uMatrix[int(h * 9.0 + w)];\n }\n }\n float alpha = texture2D(uTexture, vTexCoord).a;\n gl_FragColor = color;\n gl_FragColor.a = alpha;\n }\n `,\n};\n","import { BaseFilter } from './BaseFilter';\nimport type { T2DPipelineState, TWebGLUniformLocationMap } from './typedefs';\nimport { classRegistry } from '../ClassRegistry';\nimport { fragmentSource } from './shaders/convolute';\n\nexport type ConvoluteOwnProps = {\n opaque: boolean;\n matrix: number[];\n};\n\nexport const convoluteDefaultValues: ConvoluteOwnProps = {\n opaque: false,\n matrix: [0, 0, 0, 0, 1, 0, 0, 0, 0],\n};\n\n/**\n * Adapted from html5rocks article\n * @example Sharpen filter\n * const filter = new Convolute({\n * matrix: [ 0, -1, 0,\n * -1, 5, -1,\n * 0, -1, 0 ]\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n * canvas.renderAll();\n * @example Blur filter\n * const filter = new Convolute({\n * matrix: [ 1/9, 1/9, 1/9,\n * 1/9, 1/9, 1/9,\n * 1/9, 1/9, 1/9 ]\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n * canvas.renderAll();\n * @example Emboss filter\n * const filter = new Convolute({\n * matrix: [ 1, 1, 1,\n * 1, 0.7, -1,\n * -1, -1, -1 ]\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n * canvas.renderAll();\n * @example Emboss filter with opaqueness\n * const filter = new Convolute({\n * opaque: true,\n * matrix: [ 1, 1, 1,\n * 1, 0.7, -1,\n * -1, -1, -1 ]\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n * canvas.renderAll();\n */\nexport class Convolute extends BaseFilter<'Convolute', ConvoluteOwnProps> {\n /*\n * Opaque value (true/false)\n */\n declare opaque: ConvoluteOwnProps['opaque'];\n\n /*\n * matrix for the filter, max 9x9\n */\n declare matrix: ConvoluteOwnProps['matrix'];\n\n static type = 'Convolute';\n\n static defaults = convoluteDefaultValues;\n\n static uniformLocations = ['uMatrix', 'uOpaque', 'uHalfSize', 'uSize'];\n\n getCacheKey() {\n return `${this.type}_${Math.sqrt(this.matrix.length)}_${\n this.opaque ? 1 : 0\n }` as keyof typeof fragmentSource;\n }\n\n getFragmentSource() {\n return fragmentSource[this.getCacheKey()];\n }\n\n /**\n * Apply the Brightness operation to a Uint8ClampedArray representing the pixels of an image.\n *\n * @param {Object} options\n * @param {ImageData} options.imageData The Uint8ClampedArray to be filtered.\n */\n applyTo2d(options: T2DPipelineState) {\n const imageData = options.imageData,\n data = imageData.data,\n weights = this.matrix,\n side = Math.round(Math.sqrt(weights.length)),\n halfSide = Math.floor(side / 2),\n sw = imageData.width,\n sh = imageData.height,\n output = options.ctx.createImageData(sw, sh),\n dst = output.data,\n // go through the destination image pixels\n alphaFac = this.opaque ? 1 : 0;\n let r, g, b, a, dstOff, scx, scy, srcOff, wt, x, y, cx, cy;\n\n for (y = 0; y < sh; y++) {\n for (x = 0; x < sw; x++) {\n dstOff = (y * sw + x) * 4;\n // calculate the weighed sum of the source image pixels that\n // fall under the convolution matrix\n r = 0;\n g = 0;\n b = 0;\n a = 0;\n\n for (cy = 0; cy < side; cy++) {\n for (cx = 0; cx < side; cx++) {\n scy = y + cy - halfSide;\n scx = x + cx - halfSide;\n\n // eslint-disable-next-line max-depth\n if (scy < 0 || scy >= sh || scx < 0 || scx >= sw) {\n continue;\n }\n\n srcOff = (scy * sw + scx) * 4;\n wt = weights[cy * side + cx];\n\n r += data[srcOff] * wt;\n g += data[srcOff + 1] * wt;\n b += data[srcOff + 2] * wt;\n // eslint-disable-next-line max-depth\n if (!alphaFac) {\n a += data[srcOff + 3] * wt;\n }\n }\n }\n dst[dstOff] = r;\n dst[dstOff + 1] = g;\n dst[dstOff + 2] = b;\n if (!alphaFac) {\n dst[dstOff + 3] = a;\n } else {\n dst[dstOff + 3] = data[dstOff + 3];\n }\n }\n }\n options.imageData = output;\n }\n\n /**\n * Send data from this filter to its shader program's uniforms.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n */\n sendUniformData(\n gl: WebGLRenderingContext,\n uniformLocations: TWebGLUniformLocationMap,\n ) {\n gl.uniform1fv(uniformLocations.uMatrix, this.matrix);\n }\n\n /**\n * Returns object representation of an instance\n * @return {Object} Object representation of an instance\n */\n toObject() {\n return {\n ...super.toObject(),\n opaque: this.opaque,\n matrix: [...this.matrix],\n };\n }\n}\n\nclassRegistry.setClass(Convolute);\n","export const fragmentSource = `\n precision highp float;\n uniform sampler2D uTexture;\n uniform vec3 uGamma;\n varying vec2 vTexCoord;\n void main() {\n vec4 color = texture2D(uTexture, vTexCoord);\n vec3 correction = (1.0 / uGamma);\n color.r = pow(color.r, correction.r);\n color.g = pow(color.g, correction.g);\n color.b = pow(color.b, correction.b);\n gl_FragColor = color;\n gl_FragColor.rgb *= color.a;\n }\n`;\n","import { BaseFilter } from './BaseFilter';\nimport { classRegistry } from '../ClassRegistry';\nimport { fragmentSource } from './shaders/gamma';\nimport type { T2DPipelineState, TWebGLUniformLocationMap } from './typedefs';\n\nconst GAMMA = 'Gamma' as const;\n\nexport type GammaInput = [number, number, number];\n\nexport type GammaOwnProps = {\n gamma: GammaInput;\n};\n\nexport const gammaDefaultValues: GammaOwnProps = {\n gamma: [1, 1, 1],\n};\n\n/**\n * Gamma filter class\n * @example\n * const filter = new Gamma({\n * gamma: [1, 0.5, 2.1]\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n */\nexport class Gamma extends BaseFilter {\n /**\n * Gamma array value, from 0.01 to 2.2.\n * @param {Array} gamma\n */\n declare gamma: GammaOwnProps['gamma'];\n declare rgbValues?: {\n r: Uint8Array;\n g: Uint8Array;\n b: Uint8Array;\n };\n\n static type = GAMMA;\n\n static defaults = gammaDefaultValues;\n\n static uniformLocations = ['uGamma'];\n\n getFragmentSource() {\n return fragmentSource;\n }\n\n constructor(options: { gamma?: GammaInput } = {}) {\n super(options);\n this.gamma =\n options.gamma ||\n ((\n this.constructor as typeof Gamma\n ).defaults.gamma.concat() as GammaInput);\n }\n\n /**\n * Apply the Gamma operation to a Uint8Array representing the pixels of an image.\n *\n * @param {Object} options\n * @param {ImageData} options.imageData The Uint8Array to be filtered.\n */\n applyTo2d({ imageData: { data } }: T2DPipelineState) {\n const gamma = this.gamma,\n rInv = 1 / gamma[0],\n gInv = 1 / gamma[1],\n bInv = 1 / gamma[2];\n\n if (!this.rgbValues) {\n this.rgbValues = {\n r: new Uint8Array(256),\n g: new Uint8Array(256),\n b: new Uint8Array(256),\n };\n }\n\n // This is an optimization - pre-compute a look-up table for each color channel\n // instead of performing these pow calls for each pixel in the image.\n const rgb = this.rgbValues;\n for (let i = 0; i < 256; i++) {\n rgb.r[i] = Math.pow(i / 255, rInv) * 255;\n rgb.g[i] = Math.pow(i / 255, gInv) * 255;\n rgb.b[i] = Math.pow(i / 255, bInv) * 255;\n }\n for (let i = 0; i < data.length; i += 4) {\n data[i] = rgb.r[data[i]];\n data[i + 1] = rgb.g[data[i + 1]];\n data[i + 2] = rgb.b[data[i + 2]];\n }\n }\n\n /**\n * Send data from this filter to its shader program's uniforms.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n */\n sendUniformData(\n gl: WebGLRenderingContext,\n uniformLocations: TWebGLUniformLocationMap,\n ) {\n gl.uniform3fv(uniformLocations.uGamma, this.gamma);\n }\n\n isNeutralState() {\n const { gamma } = this;\n return gamma[0] === 1 && gamma[1] === 1 && gamma[2] === 1;\n }\n\n toObject(): { type: typeof GAMMA; gamma: GammaInput } {\n return {\n type: GAMMA,\n gamma: this.gamma.concat() as GammaInput,\n };\n }\n}\n\nclassRegistry.setClass(Gamma);\n","import type { TGrayscaleMode } from '../Grayscale';\n\nexport const fragmentSource: Record = {\n average: `\n precision highp float;\n uniform sampler2D uTexture;\n varying vec2 vTexCoord;\n void main() {\n vec4 color = texture2D(uTexture, vTexCoord);\n float average = (color.r + color.b + color.g) / 3.0;\n gl_FragColor = vec4(average, average, average, color.a);\n }\n `,\n lightness: `\n precision highp float;\n uniform sampler2D uTexture;\n uniform int uMode;\n varying vec2 vTexCoord;\n void main() {\n vec4 col = texture2D(uTexture, vTexCoord);\n float average = (max(max(col.r, col.g),col.b) + min(min(col.r, col.g),col.b)) / 2.0;\n gl_FragColor = vec4(average, average, average, col.a);\n }\n `,\n luminosity: `\n precision highp float;\n uniform sampler2D uTexture;\n uniform int uMode;\n varying vec2 vTexCoord;\n void main() {\n vec4 col = texture2D(uTexture, vTexCoord);\n float average = 0.21 * col.r + 0.72 * col.g + 0.07 * col.b;\n gl_FragColor = vec4(average, average, average, col.a);\n }\n `,\n};\n","import { BaseFilter } from './BaseFilter';\nimport type { T2DPipelineState, TWebGLUniformLocationMap } from './typedefs';\nimport { classRegistry } from '../ClassRegistry';\nimport { fragmentSource } from './shaders/grayscale';\n\nexport type TGrayscaleMode = 'average' | 'lightness' | 'luminosity';\n\ntype GrayscaleOwnProps = {\n mode: TGrayscaleMode;\n};\n\nexport const grayscaleDefaultValues: GrayscaleOwnProps = {\n mode: 'average',\n};\n\n/**\n * Grayscale image filter class\n * @example\n * const filter = new Grayscale();\n * object.filters.push(filter);\n * object.applyFilters();\n */\nexport class Grayscale extends BaseFilter<'Grayscale', GrayscaleOwnProps> {\n declare mode: TGrayscaleMode;\n\n static type = 'Grayscale';\n\n static defaults = grayscaleDefaultValues;\n\n static uniformLocations = ['uMode'];\n\n /**\n * Apply the Grayscale operation to a Uint8Array representing the pixels of an image.\n *\n * @param {Object} options\n * @param {ImageData} options.imageData The Uint8Array to be filtered.\n */\n applyTo2d({ imageData: { data } }: T2DPipelineState) {\n for (let i = 0, value: number; i < data.length; i += 4) {\n const r = data[i];\n const g = data[i + 1];\n const b = data[i + 2];\n switch (this.mode) {\n case 'average':\n value = (r + g + b) / 3;\n break;\n case 'lightness':\n value = (Math.min(r, g, b) + Math.max(r, g, b)) / 2;\n break;\n case 'luminosity':\n value = 0.21 * r + 0.72 * g + 0.07 * b;\n break;\n }\n\n data[i + 2] = data[i + 1] = data[i] = value;\n }\n }\n\n getCacheKey() {\n return `${this.type}_${this.mode}`;\n }\n\n getFragmentSource() {\n return fragmentSource[this.mode];\n }\n\n /**\n * Send data from this filter to its shader program's uniforms.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n */\n sendUniformData(\n gl: WebGLRenderingContext,\n uniformLocations: TWebGLUniformLocationMap,\n ) {\n const mode = 1;\n gl.uniform1i(uniformLocations.uMode, mode);\n }\n\n /**\n * Grayscale filter isNeutralState implementation\n * The filter is never neutral\n * on the image\n **/\n isNeutralState() {\n return false;\n }\n}\n\nclassRegistry.setClass(Grayscale);\n","import { cos } from '../util/misc/cos';\nimport { sin } from '../util/misc/sin';\nimport {\n ColorMatrix,\n type ColorMatrixOwnProps,\n colorMatrixDefaultValues,\n} from './ColorMatrix';\nimport type { TWebGLPipelineState, T2DPipelineState } from './typedefs';\nimport { classRegistry } from '../ClassRegistry';\n\nexport type HueRotationOwnProps = ColorMatrixOwnProps & {\n rotation: number;\n};\n\nexport type HueRotationSerializedProps = {\n rotation: number;\n};\n\nexport const hueRotationDefaultValues: HueRotationOwnProps = {\n ...colorMatrixDefaultValues,\n rotation: 0,\n};\n\n/**\n * HueRotation filter class\n * @example\n * const filter = new HueRotation({\n * rotation: -0.5\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n */\nexport class HueRotation extends ColorMatrix<\n 'HueRotation',\n HueRotationOwnProps,\n HueRotationSerializedProps\n> {\n /**\n * HueRotation value, from -1 to 1.\n */\n declare rotation: HueRotationOwnProps['rotation'];\n\n static type = 'HueRotation';\n\n static defaults = hueRotationDefaultValues;\n\n calculateMatrix() {\n const rad = this.rotation * Math.PI,\n cosine = cos(rad),\n sine = sin(rad),\n aThird = 1 / 3,\n aThirdSqtSin = Math.sqrt(aThird) * sine,\n OneMinusCos = 1 - cosine;\n this.matrix = [\n cosine + OneMinusCos / 3,\n aThird * OneMinusCos - aThirdSqtSin,\n aThird * OneMinusCos + aThirdSqtSin,\n 0,\n 0,\n aThird * OneMinusCos + aThirdSqtSin,\n cosine + aThird * OneMinusCos,\n aThird * OneMinusCos - aThirdSqtSin,\n 0,\n 0,\n aThird * OneMinusCos - aThirdSqtSin,\n aThird * OneMinusCos + aThirdSqtSin,\n cosine + aThird * OneMinusCos,\n 0,\n 0,\n 0,\n 0,\n 0,\n 1,\n 0,\n ];\n }\n\n isNeutralState() {\n return this.rotation === 0;\n }\n\n applyTo(options: TWebGLPipelineState | T2DPipelineState) {\n this.calculateMatrix();\n super.applyTo(options);\n }\n\n toObject() {\n return {\n type: this.type,\n rotation: this.rotation,\n };\n }\n}\n\nclassRegistry.setClass(HueRotation);\n","export const fragmentSource = `\n precision highp float;\n uniform sampler2D uTexture;\n uniform int uInvert;\n uniform int uAlpha;\n varying vec2 vTexCoord;\n void main() {\n vec4 color = texture2D(uTexture, vTexCoord);\n if (uInvert == 1) {\n if (uAlpha == 1) {\n gl_FragColor = vec4(1.0 - color.r,1.0 -color.g,1.0 -color.b,1.0 -color.a);\n } else {\n gl_FragColor = vec4(1.0 - color.r,1.0 -color.g,1.0 -color.b,color.a);\n }\n } else {\n gl_FragColor = color;\n }\n }\n`;\n","import { BaseFilter } from './BaseFilter';\nimport type { T2DPipelineState, TWebGLUniformLocationMap } from './typedefs';\nimport { classRegistry } from '../ClassRegistry';\nimport { fragmentSource } from './shaders/invert';\n\nexport type InvertOwnProps = {\n alpha: boolean;\n invert: boolean;\n};\n\nexport const invertDefaultValues: InvertOwnProps = {\n alpha: false,\n invert: true,\n};\n\n/**\n * @example\n * const filter = new Invert();\n * object.filters.push(filter);\n * object.applyFilters(canvas.renderAll.bind(canvas));\n */\nexport class Invert extends BaseFilter<'Invert', InvertOwnProps> {\n /**\n * Invert also alpha.\n * @param {Boolean} alpha\n **/\n declare alpha: InvertOwnProps['alpha'];\n\n /**\n * Filter invert. if false, does nothing\n * @param {Boolean} invert\n */\n declare invert: InvertOwnProps['invert'];\n\n static type = 'Invert';\n\n static defaults = invertDefaultValues;\n\n static uniformLocations = ['uInvert', 'uAlpha'];\n\n /**\n * Apply the Invert operation to a Uint8Array representing the pixels of an image.\n *\n * @param {Object} options\n * @param {ImageData} options.imageData The Uint8Array to be filtered.\n */\n applyTo2d({ imageData: { data } }: T2DPipelineState) {\n for (let i = 0; i < data.length; i += 4) {\n data[i] = 255 - data[i];\n data[i + 1] = 255 - data[i + 1];\n data[i + 2] = 255 - data[i + 2];\n\n if (this.alpha) {\n data[i + 3] = 255 - data[i + 3];\n }\n }\n }\n\n protected getFragmentSource(): string {\n return fragmentSource;\n }\n\n /**\n * Invert filter isNeutralState implementation\n * Used only in image applyFilters to discard filters that will not have an effect\n * on the image\n * @param {Object} options\n **/\n isNeutralState() {\n return !this.invert;\n }\n\n /**\n * Send data from this filter to its shader program's uniforms.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n */\n sendUniformData(\n gl: WebGLRenderingContext,\n uniformLocations: TWebGLUniformLocationMap,\n ) {\n gl.uniform1i(uniformLocations.uInvert, Number(this.invert));\n gl.uniform1i(uniformLocations.uAlpha, Number(this.alpha));\n }\n}\n\nclassRegistry.setClass(Invert);\n","export const fragmentSource = `\n precision highp float;\n uniform sampler2D uTexture;\n uniform float uStepH;\n uniform float uNoise;\n uniform float uSeed;\n varying vec2 vTexCoord;\n float rand(vec2 co, float seed, float vScale) {\n return fract(sin(dot(co.xy * vScale ,vec2(12.9898 , 78.233))) * 43758.5453 * (seed + 0.01) / 2.0);\n }\n void main() {\n vec4 color = texture2D(uTexture, vTexCoord);\n color.rgb += (0.5 - rand(vTexCoord, uSeed, 0.1 / uStepH)) * uNoise;\n gl_FragColor = color;\n }\n`;\n","import { BaseFilter } from './BaseFilter';\nimport type { T2DPipelineState, TWebGLUniformLocationMap } from './typedefs';\nimport { classRegistry } from '../ClassRegistry';\nimport { fragmentSource } from './shaders/noise';\n\nexport type NoiseOwnProps = {\n noise: number;\n};\n\nexport const noiseDefaultValues: NoiseOwnProps = {\n noise: 0,\n};\n\n/**\n * Noise filter class\n * @example\n * const filter = new Noise({\n * noise: 700\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n * canvas.renderAll();\n */\nexport class Noise extends BaseFilter<'Noise', NoiseOwnProps> {\n /**\n * Noise value, from\n * @param {Number} noise\n */\n declare noise: NoiseOwnProps['noise'];\n\n static type = 'Noise';\n\n static defaults = noiseDefaultValues;\n\n static uniformLocations = ['uNoise', 'uSeed'];\n\n getFragmentSource() {\n return fragmentSource;\n }\n\n /**\n * Apply the Brightness operation to a Uint8ClampedArray representing the pixels of an image.\n *\n * @param {Object} options\n * @param {ImageData} options.imageData The Uint8ClampedArray to be filtered.\n */\n applyTo2d({ imageData: { data } }: T2DPipelineState) {\n const noise = this.noise;\n for (let i = 0; i < data.length; i += 4) {\n const rand = (0.5 - Math.random()) * noise;\n data[i] += rand;\n data[i + 1] += rand;\n data[i + 2] += rand;\n }\n }\n\n /**\n * Send data from this filter to its shader program's uniforms.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n */\n sendUniformData(\n gl: WebGLRenderingContext,\n uniformLocations: TWebGLUniformLocationMap,\n ) {\n gl.uniform1f(uniformLocations.uNoise, this.noise / 255);\n gl.uniform1f(uniformLocations.uSeed, Math.random());\n }\n\n isNeutralState() {\n return this.noise === 0;\n }\n}\n\nclassRegistry.setClass(Noise);\n","export const fragmentSource = `\n precision highp float;\n uniform sampler2D uTexture;\n uniform float uBlocksize;\n uniform float uStepW;\n uniform float uStepH;\n varying vec2 vTexCoord;\n void main() {\n float blockW = uBlocksize * uStepW;\n float blockH = uBlocksize * uStepH;\n int posX = int(vTexCoord.x / blockW);\n int posY = int(vTexCoord.y / blockH);\n float fposX = float(posX);\n float fposY = float(posY);\n vec2 squareCoords = vec2(fposX * blockW, fposY * blockH);\n vec4 color = texture2D(uTexture, squareCoords);\n gl_FragColor = color;\n }\n`;\n","import { BaseFilter } from './BaseFilter';\nimport type { T2DPipelineState, TWebGLUniformLocationMap } from './typedefs';\nimport { classRegistry } from '../ClassRegistry';\nimport { fragmentSource } from './shaders/pixelate';\n\nexport type PixelateOwnProps = {\n blocksize: number;\n};\n\nexport const pixelateDefaultValues: PixelateOwnProps = {\n blocksize: 4,\n};\n\n/**\n * Pixelate filter class\n * @example\n * const filter = new Pixelate({\n * blocksize: 8\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n */\nexport class Pixelate extends BaseFilter<'Pixelate', PixelateOwnProps> {\n declare blocksize: PixelateOwnProps['blocksize'];\n\n static type = 'Pixelate';\n\n static defaults = pixelateDefaultValues;\n\n static uniformLocations = ['uBlocksize'];\n\n /**\n * Apply the Pixelate operation to a Uint8ClampedArray representing the pixels of an image.\n *\n * @param {Object} options\n * @param {ImageData} options.imageData The Uint8ClampedArray to be filtered.\n */\n applyTo2d({ imageData: { data, width, height } }: T2DPipelineState) {\n for (let i = 0; i < height; i += this.blocksize) {\n for (let j = 0; j < width; j += this.blocksize) {\n const index = i * 4 * width + j * 4;\n const r = data[index];\n const g = data[index + 1];\n const b = data[index + 2];\n const a = data[index + 3];\n\n for (let _i = i; _i < Math.min(i + this.blocksize, height); _i++) {\n for (let _j = j; _j < Math.min(j + this.blocksize, width); _j++) {\n const index = _i * 4 * width + _j * 4;\n data[index] = r;\n data[index + 1] = g;\n data[index + 2] = b;\n data[index + 3] = a;\n }\n }\n }\n }\n }\n\n /**\n * Indicate when the filter is not gonna apply changes to the image\n **/\n isNeutralState() {\n return this.blocksize === 1;\n }\n\n protected getFragmentSource(): string {\n return fragmentSource;\n }\n\n /**\n * Send data from this filter to its shader program's uniforms.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n */\n sendUniformData(\n gl: WebGLRenderingContext,\n uniformLocations: TWebGLUniformLocationMap,\n ) {\n gl.uniform1f(uniformLocations.uBlocksize, this.blocksize);\n }\n}\n\nclassRegistry.setClass(Pixelate);\n","export const fragmentShader = `\nprecision highp float;\nuniform sampler2D uTexture;\nuniform vec4 uLow;\nuniform vec4 uHigh;\nvarying vec2 vTexCoord;\nvoid main() {\n gl_FragColor = texture2D(uTexture, vTexCoord);\n if(all(greaterThan(gl_FragColor.rgb,uLow.rgb)) && all(greaterThan(uHigh.rgb,gl_FragColor.rgb))) {\n gl_FragColor.a = 0.0;\n }\n}\n`;\n","import { classRegistry } from '../ClassRegistry';\nimport { Color } from '../color/Color';\nimport { BaseFilter } from './BaseFilter';\nimport { fragmentShader } from './shaders/removeColor';\nimport type { T2DPipelineState, TWebGLUniformLocationMap } from './typedefs';\n\nexport type RemoveColorOwnProps = {\n color: string;\n distance: number;\n useAlpha: boolean;\n};\n\nexport const removeColorDefaultValues: RemoveColorOwnProps = {\n color: '#FFFFFF',\n distance: 0.02,\n useAlpha: false,\n};\n\n/**\n * Remove white filter class\n * @example\n * const filter = new RemoveColor({\n * threshold: 0.2,\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n * canvas.renderAll();\n */\nexport class RemoveColor extends BaseFilter<\n 'RemoveColor',\n RemoveColorOwnProps\n> {\n /**\n * Color to remove, in any format understood by {@link Color}.\n */\n declare color: RemoveColorOwnProps['color'];\n\n /**\n * distance to actual color, as value up or down from each r,g,b\n * between 0 and 1\n **/\n declare distance: RemoveColorOwnProps['distance'];\n\n /**\n * For color to remove inside distance, use alpha channel for a smoother deletion\n * NOT IMPLEMENTED YET\n **/\n declare useAlpha: RemoveColorOwnProps['useAlpha'];\n\n static type = 'RemoveColor';\n\n static defaults = removeColorDefaultValues;\n\n static uniformLocations = ['uLow', 'uHigh'];\n\n getFragmentSource() {\n return fragmentShader;\n }\n\n /**\n * Applies filter to canvas element\n * @param {Object} canvasEl Canvas element to apply filter to\n */\n applyTo2d({ imageData: { data } }: T2DPipelineState) {\n const distance = this.distance * 255,\n source = new Color(this.color).getSource(),\n lowC = [source[0] - distance, source[1] - distance, source[2] - distance],\n highC = [\n source[0] + distance,\n source[1] + distance,\n source[2] + distance,\n ];\n\n for (let i = 0; i < data.length; i += 4) {\n const r = data[i];\n const g = data[i + 1];\n const b = data[i + 2];\n\n if (\n r > lowC[0] &&\n g > lowC[1] &&\n b > lowC[2] &&\n r < highC[0] &&\n g < highC[1] &&\n b < highC[2]\n ) {\n data[i + 3] = 0;\n }\n }\n }\n\n /**\n * Send data from this filter to its shader program's uniforms.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n */\n sendUniformData(\n gl: WebGLRenderingContext,\n uniformLocations: TWebGLUniformLocationMap,\n ) {\n const source = new Color(this.color).getSource(),\n distance = this.distance,\n lowC = [\n 0 + source[0] / 255 - distance,\n 0 + source[1] / 255 - distance,\n 0 + source[2] / 255 - distance,\n 1,\n ],\n highC = [\n source[0] / 255 + distance,\n source[1] / 255 + distance,\n source[2] / 255 + distance,\n 1,\n ];\n gl.uniform4fv(uniformLocations.uLow, lowC);\n gl.uniform4fv(uniformLocations.uHigh, highC);\n }\n}\n\nclassRegistry.setClass(RemoveColor);\n","import { BaseFilter } from './BaseFilter';\nimport type {\n T2DPipelineState,\n TWebGLPipelineState,\n TWebGLUniformLocationMap,\n} from './typedefs';\nimport { isWebGLPipelineState } from './utils';\nimport { classRegistry } from '../ClassRegistry';\nimport { createCanvasElement } from '../util/misc/dom';\nimport type { XY } from '../Point';\n\nexport type TResizeType = 'bilinear' | 'hermite' | 'sliceHack' | 'lanczos';\n\nexport type ResizeOwnProps = {\n resizeType: TResizeType;\n scaleX: number;\n scaleY: number;\n lanczosLobes: number;\n};\n\nexport type ResizeSerializedProps = ResizeOwnProps;\n\nexport const resizeDefaultValues: ResizeOwnProps = {\n resizeType: 'hermite',\n scaleX: 1,\n scaleY: 1,\n lanczosLobes: 3,\n};\n\ntype ResizeDuring2DResize = Resize & {\n rcpScaleX: number;\n rcpScaleY: number;\n};\n\ntype ResizeDuringWEBGLResize = Resize & {\n rcpScaleX: number;\n rcpScaleY: number;\n horizontal: boolean;\n width: number;\n height: number;\n taps: number[];\n tempScale: number;\n dH: number;\n dW: number;\n};\n\n/**\n * Resize image filter class\n * @example\n * const filter = new Resize();\n * object.filters.push(filter);\n * object.applyFilters(canvas.renderAll.bind(canvas));\n */\nexport class Resize extends BaseFilter<'Resize', ResizeOwnProps> {\n /**\n * Resize type\n * for webgl resizeType is just lanczos, for canvas2d can be:\n * bilinear, hermite, sliceHack, lanczos.\n */\n declare resizeType: ResizeOwnProps['resizeType'];\n\n /**\n * Scale factor for resizing, x axis\n * @param {Number} scaleX\n */\n declare scaleX: ResizeOwnProps['scaleX'];\n\n /**\n * Scale factor for resizing, y axis\n * @param {Number} scaleY\n */\n declare scaleY: ResizeOwnProps['scaleY'];\n\n /**\n * LanczosLobes parameter for lanczos filter, valid for resizeType lanczos\n * @param {Number} lanczosLobes\n */\n declare lanczosLobes: ResizeOwnProps['lanczosLobes'];\n\n static type = 'Resize';\n\n static defaults = resizeDefaultValues;\n\n static uniformLocations = ['uDelta', 'uTaps'];\n\n /**\n * Send data from this filter to its shader program's uniforms.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n */\n sendUniformData(\n this: ResizeDuringWEBGLResize,\n gl: WebGLRenderingContext,\n uniformLocations: TWebGLUniformLocationMap,\n ) {\n gl.uniform2fv(\n uniformLocations.uDelta,\n this.horizontal ? [1 / this.width, 0] : [0, 1 / this.height],\n );\n gl.uniform1fv(uniformLocations.uTaps, this.taps);\n }\n\n getFilterWindow(this: ResizeDuringWEBGLResize) {\n const scale = this.tempScale;\n return Math.ceil(this.lanczosLobes / scale);\n }\n\n getCacheKey(this: ResizeDuringWEBGLResize): string {\n const filterWindow = this.getFilterWindow();\n return `${this.type}_${filterWindow}`;\n }\n\n getFragmentSource(this: ResizeDuringWEBGLResize): string {\n const filterWindow = this.getFilterWindow();\n return this.generateShader(filterWindow);\n }\n\n getTaps(this: ResizeDuringWEBGLResize) {\n const lobeFunction = this.lanczosCreate(this.lanczosLobes),\n scale = this.tempScale,\n filterWindow = this.getFilterWindow(),\n taps = new Array(filterWindow);\n for (let i = 1; i <= filterWindow; i++) {\n taps[i - 1] = lobeFunction(i * scale);\n }\n return taps;\n }\n\n /**\n * Generate vertex and shader sources from the necessary steps numbers\n * @param {Number} filterWindow\n */\n generateShader(filterWindow: number) {\n const offsets = new Array(filterWindow);\n for (let i = 1; i <= filterWindow; i++) {\n offsets[i - 1] = `${i}.0 * uDelta`;\n }\n return `\n precision highp float;\n uniform sampler2D uTexture;\n uniform vec2 uDelta;\n varying vec2 vTexCoord;\n uniform float uTaps[${filterWindow}];\n void main() {\n vec4 color = texture2D(uTexture, vTexCoord);\n float sum = 1.0;\n ${offsets\n .map(\n (offset, i) => `\n color += texture2D(uTexture, vTexCoord + ${offset}) * uTaps[${i}] + texture2D(uTexture, vTexCoord - ${offset}) * uTaps[${i}];\n sum += 2.0 * uTaps[${i}];\n `,\n )\n .join('\\n')}\n gl_FragColor = color / sum;\n }\n `;\n }\n\n applyToForWebgl(this: ResizeDuringWEBGLResize, options: TWebGLPipelineState) {\n options.passes++;\n this.width = options.sourceWidth;\n this.horizontal = true;\n this.dW = Math.round(this.width * this.scaleX);\n this.dH = options.sourceHeight;\n this.tempScale = this.dW / this.width;\n this.taps = this.getTaps();\n options.destinationWidth = this.dW;\n super.applyTo(options);\n options.sourceWidth = options.destinationWidth;\n\n this.height = options.sourceHeight;\n this.horizontal = false;\n this.dH = Math.round(this.height * this.scaleY);\n this.tempScale = this.dH / this.height;\n this.taps = this.getTaps();\n options.destinationHeight = this.dH;\n super.applyTo(options);\n options.sourceHeight = options.destinationHeight;\n }\n\n /**\n * Apply the resize filter to the image\n * Determines whether to use WebGL or Canvas2D based on the options.webgl flag.\n *\n * @param {Object} options\n * @param {Number} options.passes The number of filters remaining to be executed\n * @param {Boolean} options.webgl Whether to use webgl to render the filter.\n * @param {WebGLTexture} options.sourceTexture The texture setup as the source to be filtered.\n * @param {WebGLTexture} options.targetTexture The texture where filtered output should be drawn.\n * @param {WebGLRenderingContext} options.context The GL context used for rendering.\n * @param {Object} options.programCache A map of compiled shader programs, keyed by filter type.\n */\n applyTo(options: TWebGLPipelineState | T2DPipelineState) {\n if (isWebGLPipelineState(options)) {\n (this as unknown as ResizeDuringWEBGLResize).applyToForWebgl(options);\n } else {\n (this as unknown as ResizeDuring2DResize).applyTo2d(options);\n }\n }\n\n isNeutralState() {\n return this.scaleX === 1 && this.scaleY === 1;\n }\n\n lanczosCreate(lobes: number) {\n return (x: number) => {\n if (x >= lobes || x <= -lobes) {\n return 0.0;\n }\n if (x < 1.1920929e-7 && x > -1.1920929e-7) {\n return 1.0;\n }\n x *= Math.PI;\n const xx = x / lobes;\n return ((Math.sin(x) / x) * Math.sin(xx)) / xx;\n };\n }\n\n applyTo2d(this: ResizeDuring2DResize, options: T2DPipelineState) {\n const imageData = options.imageData,\n scaleX = this.scaleX,\n scaleY = this.scaleY;\n\n this.rcpScaleX = 1 / scaleX;\n this.rcpScaleY = 1 / scaleY;\n\n const oW = imageData.width;\n const oH = imageData.height;\n const dW = Math.round(oW * scaleX);\n const dH = Math.round(oH * scaleY);\n let newData: ImageData;\n\n if (this.resizeType === 'sliceHack') {\n newData = this.sliceByTwo(options, oW, oH, dW, dH);\n } else if (this.resizeType === 'hermite') {\n newData = this.hermiteFastResize(options, oW, oH, dW, dH);\n } else if (this.resizeType === 'bilinear') {\n newData = this.bilinearFiltering(options, oW, oH, dW, dH);\n } else if (this.resizeType === 'lanczos') {\n newData = this.lanczosResize(options, oW, oH, dW, dH);\n } else {\n // this should never trigger, is here just for safety net.\n newData = new ImageData(dW, dH);\n }\n options.imageData = newData;\n }\n\n /**\n * Filter sliceByTwo\n * @param {Object} canvasEl Canvas element to apply filter to\n * @param {Number} oW Original Width\n * @param {Number} oH Original Height\n * @param {Number} dW Destination Width\n * @param {Number} dH Destination Height\n * @returns {ImageData}\n */\n sliceByTwo(\n options: T2DPipelineState,\n oW: number,\n oH: number,\n dW: number,\n dH: number,\n ) {\n const imageData = options.imageData;\n const mult = 0.5;\n let doneW = false;\n let doneH = false;\n let stepW = oW * mult;\n let stepH = oH * mult;\n const resources = options.filterBackend.resources;\n let sX = 0;\n let sY = 0;\n const dX = oW;\n let dY = 0;\n if (!resources.sliceByTwo) {\n resources.sliceByTwo = createCanvasElement();\n }\n const tmpCanvas = resources.sliceByTwo;\n if (tmpCanvas.width < oW * 1.5 || tmpCanvas.height < oH) {\n tmpCanvas.width = oW * 1.5;\n tmpCanvas.height = oH;\n }\n const ctx = tmpCanvas.getContext('2d')!;\n ctx.clearRect(0, 0, oW * 1.5, oH);\n ctx.putImageData(imageData, 0, 0);\n\n dW = Math.floor(dW);\n dH = Math.floor(dH);\n\n while (!doneW || !doneH) {\n oW = stepW;\n oH = stepH;\n if (dW < Math.floor(stepW * mult)) {\n stepW = Math.floor(stepW * mult);\n } else {\n stepW = dW;\n doneW = true;\n }\n if (dH < Math.floor(stepH * mult)) {\n stepH = Math.floor(stepH * mult);\n } else {\n stepH = dH;\n doneH = true;\n }\n ctx.drawImage(tmpCanvas, sX, sY, oW, oH, dX, dY, stepW, stepH);\n sX = dX;\n sY = dY;\n dY += stepH;\n }\n return ctx.getImageData(sX, sY, dW, dH);\n }\n\n /**\n * Filter lanczosResize\n * @param {Object} canvasEl Canvas element to apply filter to\n * @param {Number} oW Original Width\n * @param {Number} oH Original Height\n * @param {Number} dW Destination Width\n * @param {Number} dH Destination Height\n * @returns {ImageData}\n */\n lanczosResize(\n this: ResizeDuring2DResize,\n options: T2DPipelineState,\n oW: number,\n oH: number,\n dW: number,\n dH: number,\n ): ImageData {\n function process(u: number): ImageData {\n let v, i, weight, idx, a, red, green, blue, alpha, fX, fY;\n center.x = (u + 0.5) * ratioX;\n icenter.x = Math.floor(center.x);\n for (v = 0; v < dH; v++) {\n center.y = (v + 0.5) * ratioY;\n icenter.y = Math.floor(center.y);\n a = 0;\n red = 0;\n green = 0;\n blue = 0;\n alpha = 0;\n for (i = icenter.x - range2X; i <= icenter.x + range2X; i++) {\n if (i < 0 || i >= oW) {\n continue;\n }\n fX = Math.floor(1000 * Math.abs(i - center.x));\n if (!cacheLanc[fX]) {\n cacheLanc[fX] = {};\n }\n for (let j = icenter.y - range2Y; j <= icenter.y + range2Y; j++) {\n if (j < 0 || j >= oH) {\n continue;\n }\n fY = Math.floor(1000 * Math.abs(j - center.y));\n if (!cacheLanc[fX][fY]) {\n cacheLanc[fX][fY] = lanczos(\n Math.sqrt(\n Math.pow(fX * rcpRatioX, 2) + Math.pow(fY * rcpRatioY, 2),\n ) / 1000,\n );\n }\n weight = cacheLanc[fX][fY];\n if (weight > 0) {\n idx = (j * oW + i) * 4;\n a += weight;\n red += weight * srcData[idx];\n green += weight * srcData[idx + 1];\n blue += weight * srcData[idx + 2];\n alpha += weight * srcData[idx + 3];\n }\n }\n }\n idx = (v * dW + u) * 4;\n destData[idx] = red / a;\n destData[idx + 1] = green / a;\n destData[idx + 2] = blue / a;\n destData[idx + 3] = alpha / a;\n }\n\n if (++u < dW) {\n return process(u);\n } else {\n return destImg;\n }\n }\n\n const srcData = options.imageData.data,\n destImg = options.ctx.createImageData(dW, dH),\n destData = destImg.data,\n lanczos = this.lanczosCreate(this.lanczosLobes),\n ratioX = this.rcpScaleX,\n ratioY = this.rcpScaleY,\n rcpRatioX = 2 / this.rcpScaleX,\n rcpRatioY = 2 / this.rcpScaleY,\n range2X = Math.ceil((ratioX * this.lanczosLobes) / 2),\n range2Y = Math.ceil((ratioY * this.lanczosLobes) / 2),\n cacheLanc: Record> = {},\n center: XY = { x: 0, y: 0 },\n icenter: XY = { x: 0, y: 0 };\n\n return process(0);\n }\n\n /**\n * bilinearFiltering\n * @param {Object} canvasEl Canvas element to apply filter to\n * @param {Number} oW Original Width\n * @param {Number} oH Original Height\n * @param {Number} dW Destination Width\n * @param {Number} dH Destination Height\n * @returns {ImageData}\n */\n bilinearFiltering(\n this: ResizeDuring2DResize,\n options: T2DPipelineState,\n oW: number,\n oH: number,\n dW: number,\n dH: number,\n ) {\n let a;\n let b;\n let c;\n let d;\n let x;\n let y;\n let i;\n let j;\n let xDiff;\n let yDiff;\n let chnl;\n let color;\n let offset = 0;\n let origPix;\n const ratioX = this.rcpScaleX;\n const ratioY = this.rcpScaleY;\n const w4 = 4 * (oW - 1);\n const img = options.imageData;\n const pixels = img.data;\n const destImage = options.ctx.createImageData(dW, dH);\n const destPixels = destImage.data;\n for (i = 0; i < dH; i++) {\n for (j = 0; j < dW; j++) {\n x = Math.floor(ratioX * j);\n y = Math.floor(ratioY * i);\n xDiff = ratioX * j - x;\n yDiff = ratioY * i - y;\n origPix = 4 * (y * oW + x);\n\n for (chnl = 0; chnl < 4; chnl++) {\n a = pixels[origPix + chnl];\n b = pixels[origPix + 4 + chnl];\n c = pixels[origPix + w4 + chnl];\n d = pixels[origPix + w4 + 4 + chnl];\n color =\n a * (1 - xDiff) * (1 - yDiff) +\n b * xDiff * (1 - yDiff) +\n c * yDiff * (1 - xDiff) +\n d * xDiff * yDiff;\n destPixels[offset++] = color;\n }\n }\n }\n return destImage;\n }\n\n /**\n * hermiteFastResize\n * @param {Object} canvasEl Canvas element to apply filter to\n * @param {Number} oW Original Width\n * @param {Number} oH Original Height\n * @param {Number} dW Destination Width\n * @param {Number} dH Destination Height\n * @returns {ImageData}\n */\n hermiteFastResize(\n this: ResizeDuring2DResize,\n options: T2DPipelineState,\n oW: number,\n oH: number,\n dW: number,\n dH: number,\n ) {\n const ratioW = this.rcpScaleX,\n ratioH = this.rcpScaleY,\n ratioWHalf = Math.ceil(ratioW / 2),\n ratioHHalf = Math.ceil(ratioH / 2),\n img = options.imageData,\n data = img.data,\n img2 = options.ctx.createImageData(dW, dH),\n data2 = img2.data;\n for (let j = 0; j < dH; j++) {\n for (let i = 0; i < dW; i++) {\n const x2 = (i + j * dW) * 4;\n let weight = 0;\n let weights = 0;\n let weightsAlpha = 0;\n let gxR = 0;\n let gxG = 0;\n let gxB = 0;\n let gxA = 0;\n const centerY = (j + 0.5) * ratioH;\n for (let yy = Math.floor(j * ratioH); yy < (j + 1) * ratioH; yy++) {\n const dy = Math.abs(centerY - (yy + 0.5)) / ratioHHalf,\n centerX = (i + 0.5) * ratioW,\n w0 = dy * dy;\n for (let xx = Math.floor(i * ratioW); xx < (i + 1) * ratioW; xx++) {\n let dx = Math.abs(centerX - (xx + 0.5)) / ratioWHalf;\n const w = Math.sqrt(w0 + dx * dx);\n /* eslint-disable max-depth */\n if (w > 1 && w < -1) {\n continue;\n }\n //hermite filter\n weight = 2 * w * w * w - 3 * w * w + 1;\n if (weight > 0) {\n dx = 4 * (xx + yy * oW);\n //alpha\n gxA += weight * data[dx + 3];\n weightsAlpha += weight;\n //colors\n if (data[dx + 3] < 255) {\n weight = (weight * data[dx + 3]) / 250;\n }\n gxR += weight * data[dx];\n gxG += weight * data[dx + 1];\n gxB += weight * data[dx + 2];\n weights += weight;\n }\n /* eslint-enable max-depth */\n }\n }\n data2[x2] = gxR / weights;\n data2[x2 + 1] = gxG / weights;\n data2[x2 + 2] = gxB / weights;\n data2[x2 + 3] = gxA / weightsAlpha;\n }\n }\n return img2;\n }\n}\n\nclassRegistry.setClass(Resize);\n","export const fragmentSource = `\n precision highp float;\n uniform sampler2D uTexture;\n uniform float uSaturation;\n varying vec2 vTexCoord;\n void main() {\n vec4 color = texture2D(uTexture, vTexCoord);\n float rgMax = max(color.r, color.g);\n float rgbMax = max(rgMax, color.b);\n color.r += rgbMax != color.r ? (rgbMax - color.r) * uSaturation : 0.00;\n color.g += rgbMax != color.g ? (rgbMax - color.g) * uSaturation : 0.00;\n color.b += rgbMax != color.b ? (rgbMax - color.b) * uSaturation : 0.00;\n gl_FragColor = color;\n }\n`;\n","import { BaseFilter } from './BaseFilter';\nimport type { T2DPipelineState, TWebGLUniformLocationMap } from './typedefs';\nimport { classRegistry } from '../ClassRegistry';\nimport { fragmentSource } from './shaders/saturation';\n\nexport type SaturationOwnProps = {\n saturation: number;\n};\n\nexport const saturationDefaultValues: SaturationOwnProps = {\n saturation: 0,\n};\n\n/**\n * Saturate filter class\n * @example\n * const filter = new Saturation({\n * saturation: 1\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n */\nexport class Saturation extends BaseFilter<'Saturation', SaturationOwnProps> {\n /**\n * Saturation value, from -1 to 1.\n * Increases/decreases the color saturation.\n * A value of 0 has no effect.\n *\n * @param {Number} saturation\n */\n declare saturation: SaturationOwnProps['saturation'];\n\n static type = 'Saturation';\n\n static defaults = saturationDefaultValues;\n\n static uniformLocations = ['uSaturation'];\n\n getFragmentSource() {\n return fragmentSource;\n }\n\n /**\n * Apply the Saturation operation to a Uint8ClampedArray representing the pixels of an image.\n *\n * @param {Object} options\n * @param {ImageData} options.imageData The Uint8ClampedArray to be filtered.\n */\n applyTo2d({ imageData: { data } }: T2DPipelineState) {\n const adjust = -this.saturation;\n for (let i = 0; i < data.length; i += 4) {\n const r = data[i];\n const g = data[i + 1];\n const b = data[i + 2];\n const max = Math.max(r, g, b);\n data[i] += max !== r ? (max - r) * adjust : 0;\n data[i + 1] += max !== g ? (max - g) * adjust : 0;\n data[i + 2] += max !== b ? (max - b) * adjust : 0;\n }\n }\n\n /**\n * Send data from this filter to its shader program's uniforms.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n */\n sendUniformData(\n gl: WebGLRenderingContext,\n uniformLocations: TWebGLUniformLocationMap,\n ) {\n gl.uniform1f(uniformLocations.uSaturation, -this.saturation);\n }\n\n isNeutralState() {\n return this.saturation === 0;\n }\n}\n\nclassRegistry.setClass(Saturation);\n","export const fragmentSource = `\n precision highp float;\n uniform sampler2D uTexture;\n uniform float uVibrance;\n varying vec2 vTexCoord;\n void main() {\n vec4 color = texture2D(uTexture, vTexCoord);\n float max = max(color.r, max(color.g, color.b));\n float avg = (color.r + color.g + color.b) / 3.0;\n float amt = (abs(max - avg) * 2.0) * uVibrance;\n color.r += max != color.r ? (max - color.r) * amt : 0.00;\n color.g += max != color.g ? (max - color.g) * amt : 0.00;\n color.b += max != color.b ? (max - color.b) * amt : 0.00;\n gl_FragColor = color;\n }\n`;\n","import { BaseFilter } from './BaseFilter';\nimport type { T2DPipelineState, TWebGLUniformLocationMap } from './typedefs';\nimport { classRegistry } from '../ClassRegistry';\nimport { fragmentSource } from './shaders/vibrance';\n\nexport type VibranceOwnProps = {\n vibrance: number;\n};\n\nexport const vibranceDefaultValues: VibranceOwnProps = {\n vibrance: 0,\n};\n\n/**\n * Vibrance filter class\n * @example\n * const filter = new Vibrance({\n * vibrance: 1\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n */\nexport class Vibrance extends BaseFilter<'Vibrance', VibranceOwnProps> {\n /**\n * Vibrance value, from -1 to 1.\n * Increases/decreases the saturation of more muted colors with less effect on saturated colors.\n * A value of 0 has no effect.\n *\n * @param {Number} vibrance\n */\n declare vibrance: VibranceOwnProps['vibrance'];\n\n static type = 'Vibrance';\n\n static defaults = vibranceDefaultValues;\n\n static uniformLocations = ['uVibrance'];\n\n getFragmentSource() {\n return fragmentSource;\n }\n\n /**\n * Apply the Vibrance operation to a Uint8ClampedArray representing the pixels of an image.\n *\n * @param {Object} options\n * @param {ImageData} options.imageData The Uint8ClampedArray to be filtered.\n */\n applyTo2d({ imageData: { data } }: T2DPipelineState) {\n const adjust = -this.vibrance;\n for (let i = 0; i < data.length; i += 4) {\n const r = data[i];\n const g = data[i + 1];\n const b = data[i + 2];\n const max = Math.max(r, g, b);\n const avg = (r + g + b) / 3;\n const amt = ((Math.abs(max - avg) * 2) / 255) * adjust;\n data[i] += max !== r ? (max - r) * amt : 0;\n data[i + 1] += max !== g ? (max - g) * amt : 0;\n data[i + 2] += max !== b ? (max - b) * amt : 0;\n }\n }\n\n /**\n * Send data from this filter to its shader program's uniforms.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {TWebGLUniformLocationMap} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n */\n sendUniformData(\n gl: WebGLRenderingContext,\n uniformLocations: TWebGLUniformLocationMap,\n ) {\n gl.uniform1f(uniformLocations.uVibrance, -this.vibrance);\n }\n\n isNeutralState() {\n return this.vibrance === 0;\n }\n}\n\nclassRegistry.setClass(Vibrance);\n"],"names":["BaseConfiguration","constructor","_defineProperty","window","devicePixelRatio","Configuration","config","configure","arguments","length","undefined","Object","assign","addFonts","paths","fontPaths","removeFonts","fontFamilys","forEach","fontFamily","clearFonts","restoreDefaults","keys","defaults","reduce","acc","key","log","severity","_len","optionalParams","Array","_key","console","FabricError","Error","message","options","SignalAbortedError","context","GLProbe","WebGLProbe","testPrecision","gl","precision","fragmentSource","fragmentShader","createShader","FRAGMENT_SHADER","shaderSource","compileShader","getShaderParameter","COMPILE_STATUS","queryWebGL","canvas","getContext","maxTextureSize","getParameter","MAX_TEXTURE_SIZE","GLPrecision","find","getExtension","loseContext","isSupported","textureSize","copyPasteData","getEnv","document","isTouchSupported","navigator","maxTouchPoints","dispose","env","setEnv","value","getBrowserEnv","getFabricDocument","getFabricWindow","getDevicePixelRatio","_config$devicePixelRa","Math","max","Cache","getFontCache","_ref","fontStyle","fontWeight","toLowerCase","charWidthsCache","fontCache","cacheKey","clearFontCache","limitDimsByArea","ar","perfLimitSizeTotal","roughWidth","sqrt","floor","cache","VERSION","version","noop","halfPI","PI","quarterPI","twoMathPi","PiBy180","iMatrix","freeze","DEFAULT_SVG_FONT_SIZE","ALIASING_LIMIT","kRect","CENTER","LEFT","TOP","BOTTOM","RIGHT","NONE","reNewline","MOVING","SCALING","ROTATING","ROTATE","SKEWING","RESIZING","MODIFY_POLY","MODIFY_PATH","CHANGED","SCALE","SCALE_X","SCALE_Y","SKEW_X","SKEW_Y","FILL","STROKE","MODIFIED","JSON","SVG","ClassRegistry","Map","has","classType","getClass","get","setClass","classConstructor","set","type","getSVGClass","SVGTagName","setSVGClass","classRegistry","AnimationRegistry","remove","index","indexOf","splice","cancelAll","animations","animation","abort","cancelByCanvas","filter","_animation$target","target","cancelByTarget","runningAnimations","Observable","on","arg0","handler","__eventListeners","entries","eventName","off","push","once","disposers","_ref2","d","disposer","onceHandler","args","call","_removeEventListener","eventListener","_ref3","fire","_this$__eventListener","listenersForEvent","concat","i","removeFromArray","array","idx","cos","angle","angleSlice","abs","sin","sign","Point","y","x","add","that","addEquals","scalarAdd","scalar","scalarAddEquals","subtract","subtractEquals","scalarSubtract","scalarSubtractEquals","multiply","scalarMultiply","scalarMultiplyEquals","divide","scalarDivide","scalarDivideEquals","eq","lt","lte","gt","gte","lerp","t","min","distanceFrom","dx","dy","midPointFrom","toString","setXY","setX","setY","setFromPoint","swap","clone","rotate","radians","origin","ZERO","sinus","cosinus","p","rotated","transform","ignoreOffset","isCollection","fabricObject","isArray","_objects","createCollectionMixin","Base","Collection","_onObjectAdded","object","_onObjectRemoved","_onStackOrderChanged","objects","size","insertAt","_len2","_key2","removed","_len3","_key3","forEachObject","callback","getObjects","_len4","types","_key4","o","isType","item","isEmpty","contains","deep","includes","some","obj","complexity","memo","current","sendObjectToBack","unshift","bringObjectToFront","sendObjectBackwards","intersecting","newIdx","findNewLowerIndex","bringObjectForward","findNewUpperIndex","moveObjectTo","isOverlapping","collectObjects","left","top","width","height","includeIntersecting","tl","br","selectable","visible","intersectsWithRect","isContainedWithinRect","containsPoint","CommonMethods","_setOptions","prop","_setObject","_set","toggle","property","requestAnimFrame","requestAnimationFrame","cancelAnimFrame","handle","cancelAnimationFrame","id","uid","createCanvasElement","element","createElement","createImage","copyCanvasElement","_newCanvas$getContext","newCanvas","createCanvasElementFor","drawImage","toDataURL","canvasEl","format","quality","isHTMLCanvas","toBlob","Promise","resolve","_","degreesToRadians","degrees","radiansToDegrees","isIdentityMatrix","mat","every","transformPoint","invertTransform","a","r","multiplyTransformMatrices","b","is2x2","multiplyTransformMatrixArray","matrices","reduceRight","product","curr","calcPlaneRotation","atan2","qrDecompose","denom","pow","scaleX","scaleY","skewX","skewY","translateX","translateY","createTranslateMatrix","createRotateMatrix","angleRadiant","cosValue","sinValue","createScaleMatrix","angleToSkew","tan","createSkewXMatrix","skewValue","createSkewYMatrix","calcDimensionsMatrix","flipX","flipY","matrix","composeMatrix","scaleMatrix","loadImage","url","signal","crossOrigin","reject","aborted","img","err","src","addEventListener","done","onload","onerror","removeEventListener","enlivenObjects","reviver","instances","all","map","fromObject","then","fabricInstance","catch","error","instance","finally","enlivenObjectEnlivables","serializedObject","promises","values","enlived","pick","source","pickBy","predicate","toFixed","number","fractionDigits","parseFloat","Number","matrixToSVG","NUM_FRACTION_DIGITS","join","isFiller","filler","toLive","isSerializableFiller","toObject","isPattern","offsetX","isTextObject","_renderText","isPath","_renderPathCommands","isActiveSelection","getScrollLeftTop","doc","getDocumentFromElement","elementLoop","docElement","documentElement","body","scrollLeft","scrollTop","parentNode","host","nodeType","style","position","el","ownerDocument","getWindowFromElement","_el$ownerDocument","defaultView","setCanvasDimensions","ctx","retinaScaling","setAttribute","scale","setCSSDimensions","getElementOffset","_getWindowFromElement","offset","elemStyle","getComputedStyle","parseInt","borderLeftWidth","borderTopWidth","paddingLeft","paddingTop","box","docElem","getBoundingClientRect","scrollLeftTop","clientLeft","clientTop","makeElementUnselectable","onselectstart","userSelect","StaticCanvasDOMManager","createLowerCanvas","lower","getElementById","hasAttribute","_originalCanvasStyle","cssText","classList","cleanupDOM","removeAttribute","setDimensions","calcOffset","staticCanvasDefaults","backgroundVpt","backgroundColor","overlayVpt","overlayColor","includeDefaultValues","svgViewportTransformation","renderOnAddRemove","skipOffscreen","enableRetinaScaling","imageSmoothingEnabled","controlsAboveOverlay","allowTouchScrolling","viewportTransform","StaticCanvas","lowerCanvasEl","_this$elements$lower","elements","contextContainer","_this$elements$lower2","getDefaults","ownDefaults","initElements","_setDimensionsImpl","skipControlsDrawing","calcViewportBoundaries","requestRenderAll","setCoords","getRetinaScaling","_offset","getWidth","getHeight","dimensions","cssOnly","backstoreOnly","hasLostContext","getZoom","setViewportTransform","vpt","zoomToPoint","point","before","newPoint","after","setZoom","absolutePan","relativePan","getElement","clearContext","clearRect","clear","backgroundImage","overlayImage","renderAll","cancelRequestedRender","destroyed","renderCanvas","renderAndReset","nextRenderHandle","disposed","iVpt","vptCoords","tr","bl","drawControls","_ctx","v","path","clipPath","patternQuality","_renderBackground","save","_renderObjects","restore","shouldCache","_transformDone","renderCache","forClipping","drawClipPathOnCanvas","_renderOverlay","__cleanupTask","globalCompositeOperation","zoomX","zoomY","_cacheCanvas","cacheTranslationX","cacheTranslationY","len","render","_renderBackgroundOrOverlay","fill","needsVpt","isAFiller","beginPath","moveTo","lineTo","closePath","fillStyle","offsetY","m","gradientTransform","patternTransform","getCenterPoint","centerObjectH","_centerObject","centerObjectV","centerObject","viewportCenterObject","getVpCenter","viewportCenterObjectH","viewportCenterObjectV","center","toDatalessJSON","propertiesToInclude","toDatalessObject","_toObjectMethod","toJSON","methodName","clipPathData","excludeFromExport","_toObject","__serializeBgOverlay","originalValue","data","bgImage","bgColor","background","overlay","toSVG","markup","_setSVGPreamble","_setSVGHeader","clipPathId","_setSVGBgOverlayColor","_setSVGBgOverlayImage","_setSVGObjects","suppressPreamble","encoding","optViewBox","viewBox","createSVGFontFacesMarkup","createSVGRefElementsMarkup","createSVGClipPathMarkup","toClipPathSVG","shouldTransform","additionalTransform","fontList","styles","styleRow","fontListMarkup","_setSVGObject","bgOrOverlay","repeat","finalWidth","finalHeight","shouldInvert","loadFromJSON","json","serialized","parse","enlivedMap","properties","cloneWithoutData","multiplier","finalMultiplier","toCanvasElement","scaledWidth","scaledHeight","zoom","originalWidth","originalHeight","originalSkipControlsDrawing","newZoom","vp","newVp","originalRetina","objectsToRender","task","destroy","kill","touchEvents","getTouchInfo","event","touchProp","changedTouches","getPointer","scroll","_evt","clientX","clientY","isTouchEvent","pointerType","stopEvent","e","preventDefault","stopPropagation","makeBoundingBoxFromPoints","points","removeTransformFromObject","inverted","finalTransform","calcOwnMatrix","applyTransformToObject","addTransformToObject","otherOptions","setPositionByOrigin","resetObjectTransform","saveObjectTransform","sizeAfterTransform","dimX","dimY","bbox","calcPlaneChangeMatrix","from","to","sendPointToPlane","sendVectorToPlane","sendObjectToPlane","fireEvent","_target$canvas","originOffset","bottom","right","resolveOrigin","originValue","unitVectorX","zero","rotateVector","vector","createVector","magnitude","calcAngleBetweenVectors","crossProduct","dotProduct","calcVectorRotation","getUnitVector","getOrthonormalVector","counterClockwise","isBetweenVectors","AxB","AxT","BxT","NOT_ALLOWED_CURSOR","getActionFromCorner","alreadySelected","corner","control","controls","getActionName","isTransformCentered","originX","originY","invertOrigin","isLocked","lockingKey","commonEventInfo","eventData","pointer","findCornerQuadrant","coord","round","normalizePoint","getRelativeCenterPoint","translateToGivenOrigin","p2","getLocalPoint","padding","localPoint","dragHandler","newLeft","newTop","moveX","moveY","ColorNameMap","aliceblue","antiquewhite","aqua","aquamarine","azure","beige","bisque","black","blanchedalmond","blue","blueviolet","brown","burlywood","cadetblue","chartreuse","chocolate","coral","cornflowerblue","cornsilk","crimson","cyan","darkblue","darkcyan","darkgoldenrod","darkgray","darkgrey","darkgreen","darkkhaki","darkmagenta","darkolivegreen","darkorange","darkorchid","darkred","darksalmon","darkseagreen","darkslateblue","darkslategray","darkslategrey","darkturquoise","darkviolet","deeppink","deepskyblue","dimgray","dimgrey","dodgerblue","firebrick","floralwhite","forestgreen","fuchsia","gainsboro","ghostwhite","gold","goldenrod","gray","grey","green","greenyellow","honeydew","hotpink","indianred","indigo","ivory","khaki","lavender","lavenderblush","lawngreen","lemonchiffon","lightblue","lightcoral","lightcyan","lightgoldenrodyellow","lightgray","lightgrey","lightgreen","lightpink","lightsalmon","lightseagreen","lightskyblue","lightslategray","lightslategrey","lightsteelblue","lightyellow","lime","limegreen","linen","magenta","maroon","mediumaquamarine","mediumblue","mediumorchid","mediumpurple","mediumseagreen","mediumslateblue","mediumspringgreen","mediumturquoise","mediumvioletred","midnightblue","mintcream","mistyrose","moccasin","navajowhite","navy","oldlace","olive","olivedrab","orange","orangered","orchid","palegoldenrod","palegreen","paleturquoise","palevioletred","papayawhip","peachpuff","peru","pink","plum","powderblue","purple","rebeccapurple","red","rosybrown","royalblue","saddlebrown","salmon","sandybrown","seagreen","seashell","sienna","silver","skyblue","slateblue","slategray","slategrey","snow","springgreen","steelblue","teal","thistle","tomato","turquoise","violet","wheat","white","whitesmoke","yellow","yellowgreen","reRGBa","reHSLa","reHex","hue2rgb","q","rgb2Hsl","g","maxValue","minValue","h","s","l","fromAlphaToFloat","endsWith","hexify","toUpperCase","padStart","greyAverage","avg","Color","color","setSource","_source","_tryParsingColor","sourceFromHex","sourceFromRgb","sourceFromHsl","isUnrecognised","getSource","toRgb","toRgba","toHsl","toHsla","toHex","fullHex","toHexa","slice","getAlpha","setAlpha","alpha","toGrayscale","toBlackWhite","threshold","average","bOrW","overlayWith","otherColor","otherAlpha","otherSource","R","G","B","fromRgb","fromRgba","match","parsedValue","fromHsl","fromHsla","match1degrees","parseAngletoDegrees","fromHex","isShortNotation","expandedValue","split","hex","hexCouple","lowercase","numeric","getSvgAttributes","commonAttributes","parseUnit","fontSize","unit","exec","dpi","DPI","parseAlign","align","parsePreserveAspectRatioAttribute","attribute","firstPart","secondPart","trim","alignX","alignY","meetOrSlice","colorPropToSVG","inlineStyle","colorValue","opacityValue","opacity","createSVGRect","svgColor","w","FabricObjectSVGExportMixin","getSvgStyles","skipShadow","fillRule","strokeWidth","strokeDashArray","strokeDashOffset","strokeLineCap","strokeLineJoin","strokeMiterLimit","visibility","getSvgFilter","stroke","shadow","getSvgCommons","getSvgTransform","full","calcTransformMatrix","svgTransform","_toSVG","_reviver","_createBaseSVGMarkup","_createBaseClipPathSVGMarkup","objectMarkup","commonPieces","noStyle","withShadow","styleInfo","shadowInfo","vectorEffect","strokeUniform","absoluteClipPath","absolutePositioned","clipPathMarkup","addPaintOrder","paintFirst","getSvgRegex","arr","RegExp","TEXT_DECORATION_THICKNESS","fontProperties","textDecorationProperties","textLayoutProperties","additionalProps","styleProperties","textDefaultValues","_reNewline","_reSpacesAndTabs","_reSpaceAndTab","_reWords","underline","overline","linethrough","textAlign","lineHeight","textBackgroundColor","pathStartOffset","pathSide","pathAlign","charSpacing","deltaY","direction","CACHE_FONT_SIZE","MIN_TEXT_WIDTH","superscript","baseline","subscript","_fontSizeFraction","offsets","_fontSizeMult","JUSTIFY","JUSTIFY_LEFT","JUSTIFY_RIGHT","JUSTIFY_CENTER","reNum","String","raw","viewportSeparator","svgNS","reFontDeclaration","svgValidTagNames","svgViewBoxElements","svgInvalidAncestors","svgValidParents","attributesMap","cx","cy","display","fSize","cPath","svgValidTagNamesRegEx","svgViewBoxElementsRegEx","svgValidParentsRegEx","reViewBoxAttrValue","shadowOffsetRegex","reOffsetsAndBlur","shadowDefaultValues","blur","affectStroke","nonScaling","Shadow","parseShadow","shadowStr","replace","BLUR_BOX","fBoxX","fBoxY","capValue","stateProperties","cacheProperties","fabricObjectDefaultValues","minScaleLimit","objectCaching","centeredRotation","centeredScaling","dirty","interactiveObjectDefaultValues","noScaleCache","lockMovementX","lockMovementY","lockRotation","lockScalingX","lockScalingY","lockSkewingX","lockSkewingY","lockScalingFlip","cornerSize","touchCornerSize","transparentCorners","cornerColor","cornerStrokeColor","cornerStyle","cornerDashArray","hasControls","borderColor","borderDashArray","borderOpacityWhenMoving","borderScaleFactor","hasBorders","selectionBackgroundColor","evented","perPixelTargetFind","activeOn","hoverCursor","moveCursor","normalize","c","asin","elastic","defaultEasing","easeInCubic","easeOutCubic","easeInOutCubic","easeInQuart","easeOutQuart","easeInOutQuart","easeInQuint","easeOutQuint","easeInOutQuint","easeInSine","easeOutSine","easeInOutSine","easeInExpo","easeOutExpo","easeInOutExpo","easeInCirc","easeOutCirc","easeInOutCirc","easeInElastic","normA","normS","normP","easeOutElastic","normC","easeInOutElastic","easeInBack","easeOutBack","easeInOutBack","easeOutBounce","easeInBounce","easeInOutBounce","easeInQuad","easeOutQuad","easeInOutQuad","defaultAbort","AnimationBase","startValue","byValue","duration","delay","easing","onStart","onChange","onComplete","tick","bind","_onStart","_onChange","_onComplete","_abort","endValue","calculate","state","_state","isDone","start","firstTick","timestamp","startTime","Date","register","setTimeout","durationMs","boundDurationMs","durationProgress","valueProgress","unregister","ValueAnimation","timeElapsed","ArrayAnimation","defaultColorEasing","wrapColorCallback","rgba","ColorAnimation","startColor","endColor","isArrayAnimation","animate","animateColor","Intersection","status","append","isPointContained","T","A","infinite","AB","AT","isPointInPolygon","other","hits","inter","intersectSegmentSegment","intersectLineLine","a1","a2","b1","b2","aInfinite","bInfinite","a2xa1x","a2ya1y","b2xb1x","b2yb1y","a1xb1x","a1yb1y","uaT","ubT","uB","ua","ub","segmentsCoincide","intersectSegmentLine","s1","s2","l1","l2","intersectLinePolygon","result","intersectSegmentPolygon","intersectPolygonPolygon","points1","points2","coincidences","intersectPolygonRectangle","r1","r2","topRight","bottomLeft","ObjectGeometry","getX","getXY","getY","getRelativeX","setRelativeX","getRelativeY","setRelativeY","relativePosition","getRelativeXY","group","setRelativeXY","isStrokeAccountedForInDimensions","getCoords","aCoords","calcACoords","coords","intersection","intersectsWithObject","isContainedWithinObject","getBoundingRect","isOnScreen","isPartiallyOnScreen","allPointsAreOutside","getScaledWidth","_getTransformedDimensions","getScaledHeight","scaleToWidth","boundingRectFactor","scaleToHeight","getCanvasRetinaScaling","_this$canvas","getTotalAngle","getViewportTransform","_this$canvas2","rotateMatrix","tMatrix","finalMatrix","dim","transformMatrixKey","skipGroup","prefix","matrixCache","ownMatrixCache","_getNonTransformedDimensions","_calculateCurrentDimensions","dimOptions","preScalingStrokeValue","postScalingStrokeValue","noSkew","finalDimensions","fromOriginX","fromOriginY","toOriginX","toOriginY","translateToCenterPoint","translateToOriginPoint","relCenter","getPointByOrigin","pos","_getLeftTopCoords","FabricObject","name","setOptions","_createCacheCanvas","_cacheContext","_updateCacheCanvas","_limitCacheSize","dims","maxCacheSideLimit","minCacheSideLimit","limX","limY","capped","_getCacheCanvasDimensions","objectScale","getTotalObjectScaling","neededX","neededY","ceil","dimensionsChanged","zoomChanged","shouldRedraw","setTransform","drawingWidth","drawingHeight","translate","needFullTransform","contextTop","getObjectScaling","retina","getObjectOpacity","_constrainScale","isChanged","parent","isNotVisible","_setupCompositeOperation","drawSelectionBackground","_setOpacity","_setShadow","drawCacheOnCanvas","_removeCacheCanvas","drawObject","isCacheDirty","parentClipPaths","hasStroke","hasFill","needsItsOwnCache","ownCaching","isOnACache","willDrawShadow","drawClipPathOnCache","canvasWithClipPath","originalFill","originalStroke","_setClippingProperties","_render","_drawClipPath","createClipPathLayer","prevClipPath","skipCanvas","fillRect","_removeShadow","globalAlpha","_setStrokeStyles","decl","lineWidth","lineCap","lineDashOffset","lineJoin","miterLimit","gradientUnits","_applyPatternForTransformedGradient","strokeStyle","_applyPatternGradientTransform","_setFillStyles","_setLineDash","dashArray","setLineDash","sx","sy","multX","multY","scaling","shadowColor","shadowBlur","browserShadowBlurConstant","shadowOffsetX","shadowOffsetY","_renderPaintInOrder","_renderStroke","_renderFill","_pCtx$createPattern","pCanvas","pCtx","createPattern","_findCenterFromElement","objectForm","cloneAsImage","ImageClass","origParams","originalGroup","originalShadow","canvasProvider","withoutTransform","withoutShadow","boundingRect","shadowOffset","originalCanvas","setOnGroup","animatable","_animate","propIsColor","colorProperties","animationOptions","isDescendantOf","getAncestors","ancestors","findCommonAncestors","fork","otherFork","common","otherAncestors","ancestor","j","hasCommonAncestors","commonAncestors","isInFrontOf","ancestorData","firstCommonAncestor","headOfFork","pop","headOfOtherFork","thisIndex","otherIndex","propertiesToSerialize","customProperties","toFixedBound","val","_removeDefaultValues","hasStaticDefaultValues","baseValues","getPrototypeOf","baseValue","_fromObject","serializedObjectOptions","extraParam","enlivedObjectOptions","wrapWithFireEvent","actionHandler","extraEventInfo","actionPerformed","wrapWithFixedAnchor","centerPoint","constraint","changeObjectWidth","strokePadding","oldWidth","newWidth","changeWidth","renderCircleControl","styleOverride","xSize","sizeX","ySize","sizeY","myLeft","myTop","arc","renderSquareControl","xSizeBy2","ySizeBy2","strokeRect","Control","shouldActivate","controlKey","_fabricObject$canvas","getActiveObject","isControlVisible","getActionHandler","getMouseDownHandler","mouseDownHandler","getMouseUpHandler","mouseUpHandler","cursorStyleHandler","cursorStyle","actionName","getVisibility","_fabricObject$_contro","_fabricObject$_contro2","_controlsVisibility","setVisibility","positionHandler","currentControl","calcCornerCoords","objectCornerSize","centerX","centerY","isTouch","touchSizeX","touchSizeY","rotationStyleHandler","rotateObjectWithSnapping","ex","ey","theta","pivotPoint","lastAngle","curAngle","snapAngle","snapThreshold","rightAngleLocked","leftAngleLocked","hasRotated","rotationWithSnapping","scaleIsProportional","uniformIsToggled","uniScaleKey","uniformScaling","scalingIsForbidden","by","scaleProportionally","lockX","lockY","scaleMap","scaleCursorStyleHandler","n","scaleObject","forbidScaling","signX","signY","gestureScale","distance","original","originalDistance","oldScaleX","oldScaleY","scaleObjectFromCorner","scaleObjectX","scaleObjectY","scalingEqually","scalingX","scalingY","AXIS_KEYS","counterAxis","skew","lockSkewing","flip","skewMap","skewCursorStyleHandler","skewObject","axis","skewingSide","skewKey","skewingBefore","skewingStart","shearingStart","shearing","skewing","atan","changed","dimBefore","dimAfter","compensationFactor","skewHandler","originKey","lockSkewingKey","flipKey","counterOriginKey","counterFlipKey","counterOriginFactor","skewingDirection","finalHandler","skewHandlerX","skewHandlerY","isAltAction","altActionKey","scaleOrSkewActionName","isAlternative","scaleSkewCursorStyleHandler","scalingXOrSkewingY","scalingYOrSkewingX","createObjectDefaultControls","ml","mr","mb","mt","mtr","withConnection","createResizeControls","createTextboxDefaultControls","InteractiveFabricObject","createControls","targetCanvas","_currentTransform","action","startsWith","getActiveControl","__corner","oCoords","findControl","forTouch","cornerEntries","touchCorner","calcOCoords","rMatrix","positionMatrix","startMatrix","transformOptions","forEachControl","_calcCornerCoords","fn","_activeObject","wh","strokeBorders","_drawBorders","drawControlsConnectingLines","_renderControls","styleOptions","shouldDrawBorders","shouldDrawControls","isMoving","drawBorders","forActiveSelection","shouldStroke","setControlVisible","setControlsVisibility","clearContextTop","restoreManually","onDeselect","_options","onSelect","shouldStartDragging","_e","onDragStart","canDrop","renderDragSourceEffect","renderDropTargetEffect","applyMixins","derivedCtor","constructors","baseCtor","getOwnPropertyNames","prototype","defineProperty","getOwnPropertyDescriptor","create","isTransparent","tolerance","getImageData","alphaChannel","findIndexRight","StrokeProjectionsBase","strokeProjectionMagnitude","strokeUniformScalar","createSideVector","projectOrthogonally","applySkew","calcOrthogonalProjection","isSkewed","scaleUnitVector","unitVector","zeroVector","StrokeLineJoinProjections","getOrthogonalRotationFactor","vector1","vector2","C","AC","bisector","orthogonalProjection","correctSide","projectBevel","projections","projectMiter","hypotUnitScalar","miterVector","projectRoundNoSkew","startCircle","endCircle","radiusOnAxisX","radiusOnAxisY","projectRoundWithSkew","circleRadius","newY","furthestY","newX","furthestX","projectRound","isStraightLine","newOrigin","proj0","proj1","comparisonVector","isProj0Start","projectPoints","project","originPoint","projectedPoint","StrokeLineCapProjections","projectButt","projection","projectSquare","strokePointingOut","projectedA","projectStrokeOnPoints","openPath","reduced","cloneStyles","newObj","keyInner","capitalize","string","firstLetterOnly","charAt","escapeXml","segmenter","getSegmenter","Intl","Segmenter","granularity","graphemeSplit","textstring","segments","segment","graphemeSplitImpl","graphemes","chr","getWholeChar","str","code","charCodeAt","isNaN","next","prev","hasStyleChanged","prevStyle","thisStyle","forTextSpans","textDecorationThickness","stylesToArray","text","textLines","stylesArray","charIndex","chars","end","stylesFromArray","stylesObject","styleIndex","SHARED_ATTRIBUTES","selectorMatches","selector","nodeName","classNames","getAttribute","azAz","matcher","splitClassNames","doesSomeParentMatch","selectors","parentMatching","parentElement","elementMatchesRule","firstMatching","getGlobalStylesForElement","cssRules","rule","normalizeAttr","attr","_attributesMap","regex","cleanupSvgAttribute","attributeValue","transforms","transformList","reTransformList","reTransform","reTransformAll","parseTransformAttribute","test","matchAll","transformMatch","matchedParams","operation","rawArgs","arg1","arg2","arg3","arg4","arg5","arg","normalizeValue","parentAttributes","parsed","ouputValue","transformMatrix","fillIndex","strokeIndex","parseFontDeclaration","oStyle","parseStyleObject","parseStyleString","chunk","parseStyleAttribute","colorAttributesMap","setStrokeFillOpacity","attributes","colorAttr","parseAttributes","parentFontSize","ownAttributes","normalizedStyle","normalizedAttr","normalizedValue","font","mergedAttrs","rectDefaultValues","rx","ry","RECT_PROPS","Rect","_initRxRy","isRounded","bezierCurveTo","fromElement","restOfparsedAttributes","ATTRIBUTE_NAMES","Boolean","LAYOUT_TYPE_INITIALIZATION","LAYOUT_TYPE_ADDED","LAYOUT_TYPE_REMOVED","LAYOUT_TYPE_IMPERATIVE","LAYOUT_TYPE_OBJECT_MODIFIED","LAYOUT_TYPE_OBJECT_MODIFYING","getObjectBounds","destinationGroup","currentGroup","objectCenter","accountForStroke","strokeUniformVector","scalingStrokeWidth","sizeVector","LayoutStrategy","calcLayoutResult","shouldPerformLayout","calcBoundingBox","prevStrategy","strategy","shouldLayoutClipPath","getInitialSize","overrides","bboxSize","bboxLeftTop","bboxCenter","actualSize","relativeCorrection","FitContentLayout","LAYOUT_MANAGER","LayoutManager","_subscriptions","performLayout","strictContext","bubbles","_prevLayoutStrategy","onBeforeLayout","layoutResult","getLayoutResult","commitLayout","onAfterLayout","attachHandlers","trigger","subscribe","unsubscribe","_context","delete","unsubscribeTargets","targets","subscribeTargets","tricklingContext","layoutManager","prevCenter","nextCenter","correction","layoutObjects","_context$x","_context$y","layoutObject","bubblingContext","NoopLayoutManager","groupDefaultValues","subTargetCheck","interactive","Group","groupInit","_options$layoutManage","__objectSelectionTracker","__objectSelectionMonitor","__objectSelectionDisposer","enterGroup","canEnterGroup","_filterObjectsBeforeEnteringGroup","allowedObjects","_onAfterObjectsChange","removeParentTransform","exitGroup","_shouldSetNestedCoords","removeAll","_activeObjects","selected","activeObjects","_watchObject","watch","_enterGroup","activeObject","_exitGroup","ownCache","preserveObjectStacking","triggerLayout","__serializeObjects","method","_includeDefaultValues","originalDefaults","_createSVGBgRect","fillStroke","commons","svgString","bg","abortable","hydratedOptions","layoutClass","strategyClass","groupSVGElements","findScaleToFit","destination","findScaleToCover","commaWsp","reArcCommandPoints","rePathCommand","repeatedCommands","M","segmentToBezier","theta1","theta2","cosTh","sinTh","cx1","cy1","mT","fromX","fromY","costh1","sinth1","costh2","sinth2","toX","toY","cp1X","cp1Y","cp2X","cp2Y","arcToSegments","large","sweep","rotateX","root","sinTheta","px","py","rx2","ry2","py2","px2","pl","_rx","_ry","mTheta","calcVectorAngle","dtheta","mDelta","th3","ux","uy","vx","vy","ta","tb","CB1","CB2","CB3","CB4","getBoundsOfCurve","begx","begy","cp1x","cp1y","cp2x","cp2y","endx","endy","argsString","cachesBoundsOfCurve","boundsOfCurveCache","tvalues","bounds","b2ac","sqrtb2ac","t1","t2","jlen","iterator","getPointOnCubicBezierIterator","fromArcToBeziers","fx","fy","rot","tx","ty","segsNorm","makePathSimpler","x1","y1","destinationPath","previous","controlX","controlY","parsedCommand","converted","calcLineLength","x2","y2","pct","c1","c2","c3","c4","QB1","QB2","QB3","getTangentCubicIterator","p1x","p1y","p2x","p2y","p3x","p3y","p4x","p4y","qb1","qb2","qb3","tangentX","tangentY","getPointOnQuadraticBezierIterator","getTangentQuadraticIterator","invT","pathIterator","tempP","tmpLen","perc","findPercentageForDistance","segInfo","nextLen","nextStep","lastPerc","angleFinder","getPathSegmentsInfo","totalLength","tempInfo","info","basicInfo","command","destX","destY","getPointOnPath","infos","segPercent","rePathCmdAll","regExpArcCommandPoints","reMyNum","commandLengths","parsePath","pathString","_pathString$match","chain","matchStr","commandLetter","commandLength","paramArr","lastIndex","out","newCommand","transformedCommand","getSmoothPathFromPoints","p1","multSignX","multSignY","manyPoints","midPoint","transformPath","pathOffset","pathSegment","newSegment","getRegularPolygonPath","numVertexes","radius","interiorAngle","rotationAdjustment","rad","joinPath","pathData","mergeClipPaths","_b$group","getRandomInt","random","_assignTransformMatrixProps","removeTransformMatrixForSvgParsing","preserveAspectRatioOptions","cropX","cropY","offsetLeft","offsetTop","setStyle","elementStyle","setProperty","CanvasDOMManager","containerClass","upperCanvasEl","createUpperCanvas","upper","applyCanvasStyle","container","createContainerElement","replaceChild","className","removeChild","canvasDefaults","centeredKey","selection","selectionKey","selectionColor","selectionDashArray","selectionBorderColor","selectionLineWidth","selectionFullyContained","defaultCursor","freeDrawingCursor","notAllowedCursor","targetFindTolerance","skipTargetFind","stopContextMenu","fireRightClick","fireMiddleClick","enablePointerEvents","SelectableCanvas","_this$elements$upper","_this$elements$upper2","wrapperEl","_objectsToRender","deselected","_discardActiveObject","_hoveredTarget","_hoveredTargets","_chooseObjectsToRender","contextTopDirty","_groupSelector","isDrawingMode","renderTopLayer","_isCurrentlyDrawing","freeDrawingBrush","_drawSelection","renderTop","setTargetFindTolerance","pixelFindCanvasEl","pixelFindContext","isTargetTransparent","selectionBgc","enhancedTolerance","_isSelectionKeyPressed","sKey","_shouldClearSelection","getActiveObjects","_shouldCenterTransform","modifierKeyPressed","centerTransform","_getOriginFromCorner","controlName","_setupCurrentTransform","_control$getActionHan","getScenePoint","altKey","lastX","lastY","shiftKey","setCursor","cursor","deltaX","extent","strokeOffset","minX","minY","maxX","maxY","dblClickLock","dblClickIsolateObject","isolatedObject","searchPossibleTargets","discardActiveObject","setSearchTargets","_searchTargets","getSearchTargets","findTarget","_targetInfo","subTargets","currentSubTargets","aObjects","targetInfo","currentContainer","currentTarget","fullTargetInfo","activeObjectTargetInfo","activeObjectControl","getViewportPoint","altSelectionKey","_pointIsInObjectSelectionArea","viewportZoom","angleRadians","cosP","sinP","cosPSinP","cosPMinusSinP","_checkTarget","isEditing","viewportPoint","_searchPossibleTargets","subTarget","_viewportPoint","_getPointerImpl","_scenePoint","fromViewport","boundsWidth","boundsHeight","cssScale","_resetTransformEventData","_setBrushStyles","willReadFrequently","getTopContext","getSelectionContext","getSelectionElement","active","_fireSelectionEvents","oldObjects","somethingChanged","invalidate","added","setActiveObject","currentActives","_setActiveObject","prevActiveObject","endCurrentTransform","discarded","_finalizeCurrentTransform","_scaling","originalProperties","_realizeGroupTransformOnObject","layoutProps","originalValues","TextEditingManager","cb","hiddenTextarea","focus","__disposer","exitTextEditing","exitEditing","onMouseMove","_this$target","updateSelectionOnMouseMove","addEventOptions","passive","getEventPoints","scenePoint","addListener","removeListener","syntheticEventConfig","mouse","in","targetIn","targetOut","canvasIn","canvasOut","drag","Canvas","eventHandler","addOrRemove","_getEventPrefix","functor","_eventjsFunctor","canvasElement","eventTypePrefix","_onResize","_onMouseDown","_onMouseMove","_onMouseOut","_onMouseEnter","_onMouseWheel","_onContextMenu","_onClick","_onDragStart","_onDragEnd","_onDragOver","_onDragEnter","_onDragLeave","_onDrop","_onTouchStart","removeListeners","_onMouseUp","_onTouchEnd","clearTimeout","_willAddMouseDown","_cacheTransformEventData","_handleEvent","shared","nestedTarget","_isClick","_dragSource","_onDragProgress","_renderDragEffects","dropTarget","_dropTarget","didDrop","dataTransfer","dropEffect","dragSource","_draggedoverTarget","eventType","_fireEnterLeaveEvents","_basicEventHandler","clicks","detail","_onDblClick","__onMouseDown","__onMouseUp","getPointerId","evt","identifier","pointerId","_isMainEvent","isPrimary","touches","mainTouchId","shouldPreventScrolling","currentActiveObject","__onMouseMove","_shouldRender","_this$_activeObject","isClick","button","_onMouseUpInDrawingMode","shouldRender","targetWasActive","handleSelection","found","originalControl","originalMouseUpHandler","_setCursorFromEvent","extraData","_onMouseDownInDrawingMode","onMouseDown","_onMouseMoveInDrawingMode","onMouseUp","grouped","handleMultiSelection","groupSelector","_fireOverOutEvents","_transformObject","textEditingManager","fireSyntheticInOutEvents","oldTarget","fireCanvas","draggedoverTarget","targetChanged","outOpt","nextTarget","inOpt","previousTarget","localPointer","_performTransformAction","activeSelection","reverse","_target","isAS","prevActiveObjects","multiSelectAdd","klass","newActiveSelection","point1","point2","collectedObjects","linearDefaultCoords","radialDefaultCoords","ifNaN","valueIfNaN","RE_PERCENT","isPercent","parsePercent","NaN","RE_KEY_VALUE_PAIRS","RE_KEY_VALUE","parseColorStop","opacityMultiplier","keyValuePairs","parseColorStops","opacityAttr","colorStops","colorStopEls","getElementsByTagName","parseType","parseGradientUnits","convertPercentUnitsToValues","valuesToConvert","finalValue","propValue","getValue","parseLinearCoords","parseRadialCoords","parseCoords","Gradient","addColorStop","colorStop","preTransform","sort","needsSwap","minRadius","maxRadius","percentageShift","gradient","createLinearGradient","createRadialGradient","svgOptions","viewBoxWidth","viewBoxHeight","Pattern","isImageSource","isCanvasSource","sourceToString","complete","naturalWidth","naturalHeight","patternSource","patternOffsetX","patternOffsetY","patternWidth","patternHeight","BaseBrush","_saveAndTransform","needsFullRender","_resetShadow","_isOutSideCanvas","Path","_setPath","adjustPosition","setBoundingBox","_calcBoundsFromPath","quadraticCurveTo","pathCmd","sourcePath","_getOffsetTransform","digits","_calcDimensions","subpathStartX","subpathStartY","parsedAttributes","isEmptySVGPath","PencilBrush","_points","_hasStraightLine","drawSegment","drawStraightLine","straightLineKey","_prepareForDrawing","_addPoint","limitedToCanvasSize","oldEnd","_finalizeAndAddPath","_reset","convertPointsToSVGPath","createPath","decimatePoints","lastPoint","cDistance","adjustedDistance","newPoints","decimate","CIRCLE_PROPS","circleDefaultValues","startAngle","endAngle","Circle","setRadius","getRadiusX","getRadiusY","startX","startY","endX","endY","largeFlag","sweepFlag","otherParsedAttributes","CircleBrush","drawDot","addPoint","dot","originalRenderOnAddRemove","circles","circle","pointerPoint","getUniqueRects","rects","uniqueRects","uniqueRectsArray","SprayBrush","sprayChunks","sprayChunk","addSprayChunk","renderChunck","chunck","rect","optimizeOverlapping","sprayChunck","density","dotWidthVariance","dotWidth","randomOpacity","PatternBrush","getPatternSrc","dotDistance","patternCanvas","patternCtx","getPattern","pattern","topLeft","coordProps","Line","_setWidthHeight","calcLinePoints","origStrokeStyle","_this$stroke","_x1","_x2","_y1","_y2","xMult","yMult","triangleDefaultValues","Triangle","widthBy2","heightBy2","ellipseDefaultValues","ELLIPSE_PROPS","Ellipse","getRx","getRy","parsePointsAttribute","pointsSplit","parsedPoints","polylineDefaultValues","exactBoundingBox","Polyline","initialized","isOpen","_projectStrokeOnPoints","strokeDiff","bboxNoStroke","layoutProperties","_options$width","_options$height","_options$width2","_options$height2","output","diffX","diffY","Polygon","StyledText","isEmptyStyles","lineIndex","line","p3","styleHas","cleanStyle","stylesCount","letterCount","stylePropertyValue","allStyleObjectPropertiesMatch","graphemeCount","styleObject","stylePropertyHasBeenSet","_textLines","removeStyle","lineNum","charNum","_extendStyles","get2DCursorLocation","_getLineStyle","_setLineStyle","newStyle","_getStyleDeclaration","_setStyleDeclaration","getSelectionStyles","startIndex","endIndex","getStyleAtPosition","getCompleteStyleDeclaration","setSelectionStyles","_forceClearCache","_lineStyle$charIndex","lineStyle","_styleProperties","_deleteStyleDeclaration","_deleteLineStyle","multipleSpacesRegex","dblQuoteRegex","createSVGInlineRect","TextSVGExportMixin","_getSVGLeftTopOffsets","textAndBg","_getSVGTextAndBg","textTop","textLeft","_wrapSVGTextAndBg","textSvg","lineTop","getHeightOfLine","textBgRects","textSpans","noShadow","textDecoration","getSvgTextDecoration","textTopOffset","textLeftOffset","lineOffset","_getLineLeftOffset","_setSVGTextLineBg","_setSVGTextLineText","_createTextCharSpan","char","styleDecl","charBox","numFractionDigit","styleProps","getSvgSpanStyles","fillStyles","dySpan","renderLeft","angleAttr","wBy2","renderPoint","isJustify","actualStyle","nextStyle","charsToRender","boxWidth","timeToRender","__charBounds","kernedWidth","leftOffset","heightOfLine","boxStart","currentColor","lastColor","getValueOfPropertyAt","useWhiteSpace","thickness","decoration","measuringContext","getMeasuringContext","FabricText","setPathInfo","initDimensions","segmentsInfo","_splitText","newLines","_splitTextIntoLines","lines","graphemeLines","_unwrappedTextLines","_unwrappedLines","_text","graphemeText","_clearCache","calcTextWidth","cursorWidth","calcTextHeight","enlargeSpaces","diffSpace","currentLineWidth","numberOfSpaces","accumulatedSpace","charBound","spaces","isEndOfWrapping","getLineWidth","missingNewlineOffset","_lineIndex","selectionStart","skipWrapping","_setTextStyles","_renderTextLinesBackground","_renderTextDecoration","_renderTextStroke","_renderTextFill","charStyle","forMeasuring","textBaseline","_getFontDeclaration","maxWidth","_renderTextLine","_renderChars","_getLeftOffset","lineTopOffset","_getTopOffset","lineLeftOffset","drawStart","_measureChar","_char","previousChar","prevCharStyle","fontDeclaration","couple","stylesAreEqual","fontMultiplier","coupleWidth","previousWidth","measureText","getHeightOfChar","measureLine","lineInfo","_measureLine","_getWidthOfCharSpacing","prevGrapheme","graphemeInfo","llength","lineBounds","grapheme","_getGraphemeBox","positionInPath","totalPathLength","_setGraphemeOnPath","numOfSpaces","centerPosition","skipLeft","previousBox","__lineHeights","maxHeight","_renderTextCommon","lineHeights","shortCut","isLtr","currentDirection","drawingLeft","_renderChar","_applyPatternGradientTransformText","handleFiller","fullDecl","shouldFill","fillOffsets","fillText","strokeOffsets","strokeText","setSuperscript","_setScript","setSubscript","schema","loc","lineDiff","__lineWidths","_charStyle$property","topOffset","offsetAligner","lastDecoration","lastFill","lastTickness","currentDecoration","currentFill","currentTickness","currentSize","currentDy","finalTickness","parsedFontFamily","genericFonts","newLine","newText","needsDims","isAddingPath","textAnchor","restOfOptions","textContent","textHeightScaleFactor","lineHeightDiff","scaledDiff","textHeight","offX","DraggableTextDelegate","dragEnterHandler","dragOverHandler","dragLeaveHandler","dragEndHandler","dropHandler","_dispose","isPointerOverSelection","newSelection","getSelectionStartFromPointer","selectionEnd","__mouseDownInPlace","isActive","__dragStartFired","setCursorByClick","initDelayedCursor","__isDraggingOver","getDragStartSelection","__dragStartSelection","setDragImage","_e$dataTransfer","flipFactor","boundaries","_getCursorBoundaries","selectionPosition","diff","bgc","dragImage","border","__dragImageDisposer","appendChild","setData","stringify","effectAllowed","abortCursorAnimation","editable","defaultPrevented","dragStartSelection","targetCanDrop","ev","_e$dataTransfer2","insert","getData","trailing","selectionStartOffset","removeChars","trimEnd","insertChars","enterEditing","_updateTextarea","_e$dataTransfer3","reNonWord","ITextBehavior","initBehavior","_tick","_onTickComplete","_animateCursor","toValue","_currentCursorOpacity","renderCursorOrSelection","_currentTickState","cursorDuration","_this$_currentTickCom","_currentTickCompleteState","restart","cursorDelay","shouldClear","cursorAnimation","restartCursorIfNeeded","selectAll","_fireSelectionChanged","cmdAll","getSelectedText","findWordBoundaryLeft","startFrom","_reSpace","findWordBoundaryRight","findLineBoundaryLeft","findLineBoundaryRight","searchWordBoundary","selectWord","newSelectionStart","newSelectionEnd","selectLine","enterEditingImpl","initHiddenTextarea","_saveEditingProps","_setEditingProps","_textBeforeEdit","activeElement","currentStart","currentEnd","__selectionStartOnMouseDown","editingBorderColor","fromStringToGraphemeSelection","smallerTextStart","graphemeStart","smallerTextEnd","graphemeEnd","fromGraphemeToStringSelection","cursorOffsetCache","inCompositionMode","updateTextareaPosition","updateFromTextArea","textarea","_calcTextareaPosition","desiredPosition","compositionStart","cursorLocation","charHeight","upperCanvas","upperCanvasWidth","upperCanvasHeight","clientWidth","clientHeight","_savedProps","_restoreEditingProps","exitEditingImpl","isTextChanged","_removeExtraneousStyles","removeStyleFromTo","lineStart","charStart","lineEnd","charEnd","styleObj","shiftLineStyles","numericChar","clonedStyles","numericLine","insertNewlineStyleObject","qty","copiedStyle","newLineStyles","originalLineLength","isEndOfLine","someStyleIsCarryingOver","currentCharStyle","numIndex","styleCarriedOver","insertCharStyleObject","quantity","currentLineStyles","currentLineStylesCloned","numericIndex","insertNewStyleBlock","insertedText","cursorLoc","addedLines","linesLength","setSelectionStartEndWithShift","_selectionDirection","ITextKeyBehavior","autocapitalize","autocorrect","autocomplete","spellcheck","wrap","hiddenTextareaContainer","keydown","keyup","input","copy","cut","paste","compositionstart","compositionupdate","compositionend","onKeyDown","keyMap","keysMapRtl","keysMap","keyCode","ctrlKeysMapDown","ctrlKey","metaKey","stopImmediatePropagation","onKeyUp","_copyDone","ctrlKeysMapUp","onInput","fromPaste","updateAndFire","nextText","charCount","nextCharCount","_selectionStart","_selectionEnd","removedText","charDiff","removeFrom","removeTo","textareaSelection","backDelete","copiedText","disableStyleCopyPaste","copiedTextStyle","onCompositionStart","onCompositionEnd","onCompositionUpdate","compositionEnd","_getWidthBeforeCursor","widthBeforeCursor","bound","getDownCursorOffset","isRight","selectionProp","_getSelectionForOffset","indexOnOtherLine","_getIndexOnLine","textAfterCursor","getUpCursorOffset","textBeforeCursor","widthOfCharsOnLine","indexOnLine","charWidth","foundMatch","leftEdge","rightEdge","offsetFromLeftEdge","offsetFromRightEdge","moveCursorDown","_moveCursorUpOrDown","moveCursorUp","moveCursorWithShift","moveCursorWithoutShift","moveCursorLeft","_moveCursorLeftOrRight","_move","newValue","_moveLeft","_moveRight","moveCursorLeftWithoutShift","change","moveCursorLeftWithShift","moveCursorRight","moveCursorRightWithShift","moveCursorRightWithoutShift","notALeftClick","ITextClickBehavior","_mouseDownHandler","doubleClickHandler","tripleClickHandler","draggableTextDelegate","didDrag","mouseOffset","charLength","widthAfter","MOVE_CURSOR_UP","MOVE_CURSOR_DOWN","MOVE_CURSOR_LEFT","MOVE_CURSOR_RIGHT","EXIT_EDITING","applyCanvasTransform","protectedDefaultValues","iTextDefaultValues","cursorColor","caching","IText","setSelectionStart","_updateAndFire","setSelectionEnd","findAncestorsWithClipPath","hasAncestorsWithClipping","drawingCtx","drawingCanvas","renderCursor","renderSelection","clippingCanvas","clippingCtx","clipPathAncestors","skipCaching","_getCursorBoundariesOffsets","__getCursorBoundariesOffsets","renderCursorAt","_renderCursor","getCursorRenderingData","_renderSelection","dragSelection","startLine","endLine","startChar","endChar","realLineHeight","boxEnd","drawHeight","extraTop","drawWidth","compositionColor","getCurrentCharFontSize","cp","_getCurrentCharIndex","getCurrentCharColor","cursorPosition","textboxDefaultValues","minWidth","dynamicMinWidth","_wordJoiners","splitByGrapheme","Textbox","_styleMap","_generateStyleMap","textInfo","realLineCount","realLineCharCount","isWrapping","nextLineIndex","nextOffset","shouldLimit","mapNextLine","p2Number","_wrapText","desiredWidth","getGraphemeDataForRender","wrapped","wordsData","_wrapLine","infix","largestWordWidth","wordsOrGraphemes","wordSplit","word","graphemeArray","_measureWord","charOffset","reservedSpace","additionalSpace","infixWidth","lineJustStarted","wordWidth","getMinWidth","linesToKeep","propNumber","ClipPathLayout","clipPathCenter","FixedLayout","ActiveSelectionLayoutManager","parents","Set","selectedObjects","activeSelectionDefaultValues","multiSelectionStacking","ActiveSelection","findIndex","groups","childrenOverride","Canvas2dFilterBackend","applyFilters","filters","sourceElement","sourceWidth","sourceHeight","desynchronized","imageData","originalImageData","pipelineState","originalEl","filterBackend","applyTo","imageDataPostFilter","putImageData","WebGLFilterBackend","tileSize","Float32Array","setupGLContext","captureGPUInfo","createWebGLCanvas","glOptions","premultipliedAlpha","depth","stencil","antialias","clearColor","cachedTexture","getCachedTexture","destinationWidth","destinationHeight","sourceTexture","createTexture","targetTexture","originalTexture","passes","webgl","aPosition","programCache","pass","tempFbo","createFramebuffer","bindFramebuffer","FRAMEBUFFER","resizeCanvasIfNeeded","copyGLTo2D","bindTexture","TEXTURE_2D","deleteTexture","deleteFramebuffer","clearWebGLCaches","textureCache","textureImageSource","NEAREST","RGBA","UNSIGNED_BYTE","CLAMP_TO_EDGE","TEXTURE_MAG_FILTER","TEXTURE_MIN_FILTER","TEXTURE_WRAP_S","TEXTURE_WRAP_T","texture","texParameteri","texImage2D","uniqueId","evictCachesForKey","glCanvas","sourceY","copyGLTo2DPutImageData","dWidth","dHeight","numBytes","u8","Uint8Array","imageBuffer","u8Clamped","Uint8ClampedArray","readPixels","imgData","ImageData","gpuInfo","renderer","vendor","ext","UNMASKED_RENDERER_WEBGL","UNMASKED_VENDOR_WEBGL","initFilterBackend","enableGLFiltering","getFilterBackend","strict","setFilterBackend","backend","imageDefaultValues","srcFromAttribute","minimumScaleTrigger","imageSmoothing","IMAGE_PROPS","FabricImage","setElement","_element","removeTexture","_originalElement","resizeFilter","applyResizeFilters","elementKey","getCrossOrigin","getOriginalSize","_stroke","filterObj","getSrc","hasCrop","imageMarkup","strokeSvg","imageRendering","getSvgSrc","origFill","filtered","setSrc","minimumScale","elementToFilter","_filteredEl","_filterScalingX","_filterScalingY","_lastScaleX","_lastScaleY","isNeutralState","imgElement","_needsResize","elementToDraw","elWidth","elHeight","sX","sY","sW","sH","maxDestW","maxDestH","_resetWidthHeight","pAR","preserveAspectRatio","pWidth","pHeight","rWidth","rHeight","f","rf","hydratedProps","fromURL","imageOptions","applyViewboxTransform","viewBoxAttr","widthAttr","heightAttr","goodViewbox","missingViewBox","missingDimAttr","translateMatrix","widthDiff","heightDiff","parsedDim","pasedViewBox","createElementNS","firstChild","getTagName","node","tagName","svgInvalidAncestorsRegEx","hasInvalidAncestor","getMultipleNodes","nodeNames","nodeArray","nodeList","getElementsByTagNameNS","parseUseDirectives","nodelist","skipAttributes","useElement","useAttributes","useAttrMap","xlink","href","referencedElement","clonedOriginal","cloneNode","originalAttributes","originalAttrMap","currentTrans","el3","setAttributeNS","childNodes","styleRecord","mergedStyles","entry","gradientsAttrs","xlinkAttr","recursivelyParseGradientsXlink","_gradient$getAttribut","xLink","referencedGradient","children","referenceClone","tagArray","getGradientDefs","elList","gradientDefs","getCSSRules","allRules","styleContents","ruleObj","declaration","propertyValuePairs","pair","_rule","findTag","ElementsParser","clipPaths","regexUrl","createObject","resolveGradient","resolveClipPath","extractPropertyDefinition","storage","gradientDef","usingElement","exactOwner","clipPathElements","objTransformInv","clipPathTag","clipPathOwner","clipPathElement","enlivedClippath","clipRule","gTransform","isValidSvgTag","createEmptyResponse","allElements","parseSVGDocument","descendants","localClipPaths","elementParser","loadSVGFromString","parser","DOMParser","parseFromString","loadSVGFromURL","fetch","response","ok","svgText","ACTION_NAME","createPolyPositionHandler","pointIndex","polyObject","polyActionHandler","poly","mouseLocalPosition","factoryPolyActionHandler","anchorPoint","anchorPointInParentPlane","newAnchorPointInParentPlane","createPolyActionHandler","createPolyControls","calcPathPointPosition","pathObject","commandIndex","movePathPoint","anchorCommand","pathPositionHandler","pathActionHandler","indexFromPrevCommand","previousCommandType","PathPointControl","controlFill","controlStroke","PathControlPointControl","connectToCommandIndex","connectToPointIndex","connectionDashArray","commandType","createControl","commandIndexPos","pointIndexPos","isControlPoint","controlPointStyle","pointStyle","createPathControls","isWebGLPipelineState","isPutImageFaster","sourceCanvas","ArrayBuffer","testContext","testPipelineState","performance","now","drawImageTime","putImageDataTime","highPsourceCode","identityFragmentShader","vertexSource","BaseFilter","getFragmentSource","getVertexSource","createProgram","vertexShader","VERTEX_SHADER","program","getShaderInfoLog","attachShader","linkProgram","getProgramParameter","LINK_STATUS","getProgramInfoLog","uniformLocations","getUniformLocations","uStepW","getUniformLocation","uStepH","attributeLocations","getAttributeLocations","getAttribLocation","locations","sendAttributeData","aPositionData","attributeLocation","buffer","createBuffer","bindBuffer","ARRAY_BUFFER","enableVertexAttribArray","vertexAttribPointer","FLOAT","bufferData","STATIC_DRAW","_setupFrameBuffer","framebufferTexture2D","COLOR_ATTACHMENT0","finish","_swapTextures","temp","applyToWebGL","applyTo2d","getCacheKey","retrieveShader","shader","useProgram","uniform1f","sendUniformData","viewport","drawArrays","TRIANGLE_STRIP","bindAdditionalTexture","textureUnit","activeTexture","TEXTURE0","unbindAdditionalTexture","_gl","_uniformLocations","createHelpLayer","helpLayer","defaultKeys","filterOptions","blendColorFragmentSource","screen","difference","lighten","darken","exclusion","tint","blendColorDefaultValues","mode","BlendColor","tg","alpha1","oR","oG","oB","uniform4fv","uColor","mask","blendImageDefaultValues","BlendImage","image","TEXTURE1","calculateMatrix","resources","blendImage","canvas1","blendData","uniform1i","uImage","uniformMatrix3fv","uTransformMatrix","enlivedImage","blurDefaultValues","Blur","aspectRatio","horizontal","blurValue","getBlurValue","samples","bytesInRow","totalA","minIRow","maxIRow","percent","weight","sampledPixel","localAlpha","delta","chooseRightDelta","uniform2fv","uDelta","blurScale","brightnessDefaultValues","brightness","Brightness","uBrightness","colorMatrixDefaultValues","colorsOnly","ColorMatrix","constants","uniformMatrix4fv","uColorMatrix","uConstants","createColorMatrixFilter","_Class","newClass","Brownie","Vintage","Kodachrome","Technicolor","Polaroid","Sepia","BlackWhite","Composed","subFilters","enlivedFilters","contrastDefaultValues","contrast","Contrast","contrastF","uContrast","Convolute_3_1","Convolute_3_0","Convolute_5_1","Convolute_5_0","Convolute_7_1","Convolute_7_0","Convolute_9_1","Convolute_9_0","convoluteDefaultValues","opaque","Convolute","weights","side","halfSide","sw","sh","createImageData","dst","alphaFac","dstOff","scx","scy","srcOff","wt","uniform1fv","uMatrix","GAMMA","gammaDefaultValues","gamma","Gamma","rInv","gInv","bInv","rgbValues","rgb","uniform3fv","uGamma","lightness","luminosity","grayscaleDefaultValues","Grayscale","uMode","hueRotationDefaultValues","rotation","HueRotation","cosine","sine","aThird","aThirdSqtSin","OneMinusCos","invertDefaultValues","invert","Invert","uInvert","uAlpha","noiseDefaultValues","noise","Noise","rand","uNoise","uSeed","pixelateDefaultValues","blocksize","Pixelate","_i","_j","uBlocksize","removeColorDefaultValues","useAlpha","RemoveColor","lowC","highC","uLow","uHigh","resizeDefaultValues","resizeType","lanczosLobes","Resize","uTaps","taps","getFilterWindow","tempScale","filterWindow","generateShader","getTaps","lobeFunction","lanczosCreate","applyToForWebgl","dW","dH","lobes","xx","rcpScaleX","rcpScaleY","oW","oH","newData","sliceByTwo","hermiteFastResize","bilinearFiltering","lanczosResize","mult","doneW","doneH","stepW","stepH","dX","dY","tmpCanvas","process","u","fX","fY","ratioX","icenter","ratioY","range2X","cacheLanc","range2Y","lanczos","rcpRatioX","rcpRatioY","srcData","destData","destImg","xDiff","yDiff","chnl","origPix","w4","pixels","destImage","destPixels","ratioW","ratioH","ratioWHalf","ratioHHalf","img2","data2","weightsAlpha","gxR","gxG","gxB","gxA","yy","w0","saturationDefaultValues","saturation","Saturation","adjust","uSaturation","vibranceDefaultValues","vibrance","Vibrance","amt","uVibrance"],"mappings":"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BC,EAAAA,KAAK,EAAE,SAAS;AAChBC,EAAAA,KAAK,EAAE,MAAM;AACbC,EAAAA,UAAU,EAAE,SAAS;AACrBC,EAAAA,MAAM,EAAE,MAAM;AACdC,EAAAA,WAAW,EAAE;AACf,CAAC;;ACzJD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,MAAMC,MAAM,GAAGA,MACpB,kJAAkJ;;AAEpJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,MAAMC,MAAM,GAAGA,MACpB,kKAAkK;;AAEpK;AACA;AACA;AACO,MAAMC,KAAK,GAAGA,MAAM,2CAA2C;;AC/GtE;AACA;AACA;AACA;AACA;AACA;AACO,MAAMC,OAAO,GAAGA,CAACtqB,CAAS,EAAEuqB,CAAS,EAAE1rB,CAAS,KAAa;EAClE,IAAIA,CAAC,GAAG,CAAC,EAAE;AACTA,IAAAA,CAAC,IAAI,CAAC;AACR,EAAA;EACA,IAAIA,CAAC,GAAG,CAAC,EAAE;AACTA,IAAAA,CAAC,IAAI,CAAC;AACR,EAAA;AACA,EAAA,IAAIA,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE;IACb,OAAOmB,CAAC,GAAG,CAACuqB,CAAC,GAAGvqB,CAAC,IAAI,CAAC,GAAGnB,CAAC;AAC5B,EAAA;AACA,EAAA,IAAIA,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE;AACb,IA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AC1BC,MAAAA,MAAM,GAAG,IAAI,CAACA,MAAM,GAAG,CAAC;AAC1BkK,IAAAA,GAAG,CAACqF,SAAS,CAAC,CAACxP,KAAK,GAAG,CAAC,EAAE,CAACC,MAAM,GAAG,CAAC,EAAED,KAAK,EAAEC,MAAM,CAAC;AAErDo2C,IAAAA,eAAe,IAAIlsC,GAAG,CAAC6G,OAAO,EAAE;AAChC,IAAA,OAAO7G,GAAG;AACZ,EAAA;;AAEA;AACF;AACA;AACA;AACA;AACA;AACA;AACA;EACEmsC,UAAUA,CAACC,QAGV,EAAW;AACV;AACA,IAAA,OAAO,KAAK;AACd,EAAA;;AAEA;AACF;AACA;AACA;AACA;AACA;EACEC,QAAQA,CAACD,QAAgC,EAAW;AAClD;AACA,IAAA,OAAO,KAAK;AACd,EAAA;;AAEA;AACF;AACA;AACA;AACA;EACEE,mBAAmBA,CAACC,EAAiB,EAAE;AACrC,IAAA,OAAO,KAAK;AACd,EAAA;;AAEA;AACF;AACA;AACA;AACA;EACEC,WAAWA,CAACD,EAAa,EAAE;AACzB,IAAA,OAAO,KAAK;AACd,EAAA;;AAEA;AACF;AACA;AACA;AACA;AACA;EACEE,OAAOA,CAACF,EAAa,EAAW;AAC9B,IAAA,OAAO,KAAK;AACd,EAAA;;AAEA;AACF;AACA;AACA;AACA;AACA;AACA;EACEG,sBAAsBA,CAACH,EAAa,EAAE;AACpC;AAAA,EAAA;;AAGF;AACF;AACA;AACA;AACA;AACA;AACA;AACA;EACEI,sBAAsBA,CAACJ,EAAa,EAAE;AACpC;AAAA,EAAA;AAEJ;AA9nBE;AACF;AACA;AACA;AACA;AACA;AAGE;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AAGE;AACF;AACA;AACA;AACA;AAGE;AACF;AACA;AACA;AAGE;AACF;AACA;AACA;AAGE;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AAPEppD,eAAA,CAnFW0mD,uBAAuB,EAAA,aAAA,EA+FblgB,8BAA8B,CAAA;;ACvIrD;AACA;AACA;AACO,SAASijB,WAAWA,CACzBC,WAAc,EACdC,YAAiB,EACjB;AACAA,EAAAA,YAA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A,UAAU,EAAE,MAAM;AAClBghC,EAAAA,aAAa,EAAE,SAAS;AACxBC,EAAAA,iBAAiB,EAAE,WAAW;AAC9BC,EAAAA,gBAAgB,EAAE,aAAa;AAE/BrhC,EAAAA,kBAAkB,EAAE,KAAK;AACzBshC,EAAAA,mBAAmB,EAAE,CAAC;AACtBC,EAAAA,cAAc,EAAE,KAAK;AAErBC,EAAAA,eAAe,EAAE,IAAI;AACrBC,EAAAA,cAAc,EAAE,IAAI;AACpBC,EAAAA,eAAe,EAAE,IAAI;AACrBC,EAAAA,mBAAmB,EAAE,KAAK;AAE1B3B,EAAAA,cAAc,EAAE,kBAAkB;AAClCjN,EAAAA,sBAAsB,EAAE;AAC1B,CAAC;;ACtND;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,MAAM6O,gBAAgB,SACnB9pD,YAAY,CAEtB;EAAAhgB,WAAAA,GAAA;AAAA,IAAA,KAAA,CAAA,GAAAO,SAAA,CAAA;AAGE;AAQA;AAUA;AASA;AAKA;AACF;AACA;AACA;AACA;AACA;AACA;AAKE;AACF;AACA;AACA;AACA;AAGE;AACF;AACA;AACA;AACA;IAJEN,eAAA,CAAA,IAAA,EAAA,gBAAA,EAAA,MAAA,CAAA;AAOA;AACF;AACA;AACA;AACA;IAJEA,eAAA,CAAA,IAAA,EAAA,gBAAA,EAAA,MAAA,CAAA;AAmBA;AACF;AACA;AACA;AACA;AAJ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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAA,CAAK;AACHC,EAAAA,aAAa,EAAE;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAA,CAAK;AACHC,EAAAA,aAAa,EAAE;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAA,CAAK;AACHC,EAAAA,aAAa,EAAE;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAA,CAAK;AACHC,EAAAA,aAAa,EAAE;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAA,CAAK;AACHC,EAAAA,aAAa,EAAE;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAA,CAAK;AACHC,EAAAA,aAAa,EAAE;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAA,CAAK;AACHC,EAAAA,aAAa,EAAE;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAA;AACA,CAAC;;AC/IM,MAAMC,sBAAyC,GAAG;AACvDC,EAAAA,MAAM,EAAE,KAAK;AACblsG,EAAAA,MAAM,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;AACpC,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA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"} \ No newline at end of file diff --git a/dist/index.node.mjs b/dist/index.node.mjs index bf06d4557a5..1b69f26d814 100644 --- a/dist/index.node.mjs +++ b/dist/index.node.mjs @@ -553,8 +553,8 @@ class AnimationRegistry extends Array { const runningAnimations = new AnimationRegistry(); /** - * @tutorial {@link http://fabricjs.com/fabric-intro-part-2#events} - * @see {@link http://fabricjs.com/events|Events demo} + * @see {@link http://fabric5.fabricjs.com/fabric-intro-part-2#events} + * @see {@link http://fabric5.fabricjs.com/events|Events demo} */ class Observable { constructor() { @@ -797,7 +797,6 @@ class Point { * Adds another point to this one * @param {XY} that * @return {Point} thisArg - * @chainable * @deprecated */ addEquals(that) { @@ -819,7 +818,6 @@ class Point { * Adds value to this point * @param {Number} scalar * @return {Point} thisArg - * @chainable * @deprecated */ scalarAddEquals(scalar) { @@ -841,7 +839,6 @@ class Point { * Subtracts another point from this point * @param {XY} that * @return {Point} thisArg - * @chainable * @deprecated */ subtractEquals(that) { @@ -863,7 +860,6 @@ class Point { * Subtracts value from this point * @param {Number} scalar * @return {Point} thisArg - * @chainable * @deprecated */ scalarSubtractEquals(scalar) { @@ -894,7 +890,6 @@ class Point { * Multiplies this point by a value * @param {Number} scalar * @return {Point} thisArg - * @chainable * @deprecated */ scalarMultiplyEquals(scalar) { @@ -925,7 +920,6 @@ class Point { * Divides this point by a value * @param {Number} scalar * @return {Point} thisArg - * @chainable * @deprecated */ scalarDivideEquals(scalar) { @@ -1041,7 +1035,6 @@ class Point { * Sets x/y of this point * @param {Number} x * @param {Number} y - * @chainable */ setXY(x, y) { this.x = x; @@ -1052,7 +1045,6 @@ class Point { /** * Sets x of this point * @param {Number} x - * @chainable */ setX(x) { this.x = x; @@ -1062,7 +1054,6 @@ class Point { /** * Sets y of this point * @param {Number} y - * @chainable */ setY(y) { this.y = y; @@ -1072,7 +1063,6 @@ class Point { /** * Sets x/y of this point from another point * @param {XY} that - * @chainable */ setFromPoint(that) { this.x = that.x; @@ -1644,7 +1634,7 @@ const invertTransform = t => { const multiplyTransformMatrices = (a, b, is2x2) => [a[0] * b[0] + a[2] * b[1], a[1] * b[0] + a[3] * b[1], a[0] * b[2] + a[2] * b[3], a[1] * b[2] + a[3] * b[3], is2x2 ? 0 : a[0] * b[4] + a[2] * b[5] + a[4], is2x2 ? 0 : a[1] * b[4] + a[3] * b[5] + a[5]]; /** - * Multiplies {@link matrices} such that a matrix defines the plane for the rest of the matrices **after** it + * Multiplies the matrices array such that a matrix defines the plane for the rest of the matrices **after** it * * `multiplyTransformMatrixArray([A, B, C, D])` is equivalent to `A(B(C(D)))` * @@ -1688,7 +1678,7 @@ const qrDecompose = a => { * [ 0 1 y ] * [ 0 0 1 ] * - * See @link https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/transform#translate for more details + * See {@link https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/transform#translate} for more details * * @param {number} x translation on X axis * @param {number} [y] translation on Y axis @@ -1734,7 +1724,7 @@ function createRotateMatrix() { * [0 y 0] * [0 0 1] * - * @link https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/transform#scale + * {@link https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/transform#scale} * * @param {number} x scale on X axis * @param {number} [y] scale on Y axis @@ -1754,7 +1744,7 @@ const angleToSkew = angle => Math.tan(degreesToRadians(angle)); * [0 1 0] * [0 0 1] * - * @link https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/transform#skewx + * {@link https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/transform#skewx} * * @param {TDegree} skewValue translation on X axis * @returns {TMat2D} matrix @@ -1769,7 +1759,7 @@ const createSkewXMatrix = skewValue => [1, 0, angleToSkew(skewValue), 1, 0, 0]; * [y 1 0] * [0 0 1] * - * @link https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/transform#skewy + * {@link https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/transform#skewy} * * @param {TDegree} skewValue translation on Y axis * @returns {TMat2D} matrix @@ -2258,7 +2248,7 @@ const staticCanvasDefaults = { /** * Static canvas class - * @see {@link http://fabricjs.com/static_canvas|StaticCanvas demo} + * @see {@link http://fabric5.fabricjs.com/static_canvas|StaticCanvas demo} * @fires before:render * @fires after:render * @fires canvas:cleared @@ -2884,7 +2874,7 @@ let StaticCanvas$1 = class StaticCanvas extends createCollectionMixin(CommonMeth * Having a toJSON method means you can do JSON.stringify(myCanvas) * JSON does not support additional properties because toJSON has its own signature * @return {Object} JSON compatible object - * @tutorial {@link http://fabricjs.com/fabric-intro-part-3#serialization} + * @see {@link http://fabric5.fabricjs.com/fabric-intro-part-3#serialization} * @see {@link http://jsfiddle.net/fabricjs/pec86/|jsFiddle demo} * @example JSON representation of canvas * const json = canvas.toJSON(); @@ -2973,7 +2963,6 @@ let StaticCanvas$1 = class StaticCanvas extends createCollectionMixin(CommonMeth /** * Returns SVG representation of canvas - * @function * @param {Object} [options] Options object for SVG output * @param {Boolean} [options.suppressPreamble=false] If true xml tag is not included * @param {Object} [options.viewBox] SVG viewbox object @@ -2986,7 +2975,7 @@ let StaticCanvas$1 = class StaticCanvas extends createCollectionMixin(CommonMeth * @param {String} [options.height] desired height of svg with or without units * @param {Function} [reviver] Method for further parsing of svg elements, called after each fabric object converted into svg representation. * @return {String} SVG string - * @tutorial {@link http://fabricjs.com/fabric-intro-part-3#serialization} + * @see {@link http://fabric5.fabricjs.com/fabric-intro-part-3#serialization} * @see {@link http://jsfiddle.net/fabricjs/jQ3ZZ/|jsFiddle demo} * @example Normal SVG output * var svg = canvas.toSVG(); @@ -3204,7 +3193,7 @@ let StaticCanvas$1 = class StaticCanvas extends createCollectionMixin(CommonMeth * @param {Object} [options] options * @param {AbortSignal} [options.signal] see https://developer.mozilla.org/en-US/docs/Web/API/AbortController/signal * @return {Promise} instance - * @tutorial {@link http://fabricjs.com/fabric-intro-part-3#deserialization} + * @see {@link http://fabric5.fabricjs.com/fabric-intro-part-3#deserialization} * @see {@link http://jsfiddle.net/fabricjs/fmgXt/|jsFiddle demo} * @example loadFromJSON * canvas.loadFromJSON(json).then((canvas) => canvas.requestRenderAll()); @@ -3227,9 +3216,11 @@ let StaticCanvas$1 = class StaticCanvas extends createCollectionMixin(CommonMeth } // parse json if it wasn't already - const serialized = typeof json === 'string' ? JSON.parse(json) : json; const { objects = [], + ...serialized + } = typeof json === 'string' ? JSON.parse(json) : json; + const { backgroundImage, background, overlayImage, @@ -4286,7 +4277,7 @@ const greyAverage = _ref => { /** * @class Color common color operations - * @tutorial {@link http://fabricjs.com/fabric-intro-part-2/#colors colors} + * @see {@link http://fabric5.fabricjs.com/fabric-intro-part-2#colors colors} */ class Color { /** @@ -4461,7 +4452,6 @@ class Color { /** * Returns new color object, when given a color in RGBA format - * @function * @param {String} color * @return {Color} */ @@ -4496,7 +4486,6 @@ class Color { /** * Returns new color object, when given a color in HSLA format - * @function * @param {String} color * @return {Color} */ @@ -5011,7 +5000,7 @@ const shadowDefaultValues = { }; class Shadow { /** - * @see {@link http://fabricjs.com/shadows|Shadow demo} + * @see {@link http://fabric5.fabricjs.com/shadows|Shadow demo} * @param {Object|String} [options] Options object with any of color, blur, offsetX, offsetY properties or string (e.g. "rgba(0,0,0,0.2) 2px 2px 10px") */ @@ -5820,7 +5809,6 @@ class Intersection { * Appends points of intersection * @param {...Point[]} points * @return {Intersection} thisArg - * @chainable */ append() { for (var _len = arguments.length, points = new Array(_len), _key = 0; _key < _len; _key++) { @@ -5868,7 +5856,7 @@ class Intersection { } /** - * Use the ray casting algorithm to determine if {@link point} is in the polygon defined by {@link points} + * Use the ray casting algorithm to determine if point is in the polygon defined by points * @see https://en.wikipedia.org/wiki/Point_in_polygon * @param point * @param points polygon points @@ -6080,35 +6068,35 @@ class ObjectGeometry extends CommonMethods { */ /** - * @returns {number} x position according to object's {@link originX} property in canvas coordinate plane + * @returns {number} x position according to object's originX property in canvas coordinate plane */ getX() { return this.getXY().x; } /** - * @param {number} value x position according to object's {@link originX} property in canvas coordinate plane + * @param {number} value x position according to object's originX property in canvas coordinate plane */ setX(value) { this.setXY(this.getXY().setX(value)); } /** - * @returns {number} y position according to object's {@link originY} property in canvas coordinate plane + * @returns {number} y position according to object's originY property in canvas coordinate plane */ getY() { return this.getXY().y; } /** - * @param {number} value y position according to object's {@link originY} property in canvas coordinate plane + * @param {number} value y position according to object's originY property in canvas coordinate plane */ setY(value) { this.setXY(this.getXY().setY(value)); } /** - * @returns {number} x position according to object's {@link originX} property in parent's coordinate plane\ + * @returns {number} x position according to object's originX property in parent's coordinate plane\ * if parent is canvas then this property is identical to {@link getX} */ getRelativeX() { @@ -6116,7 +6104,7 @@ class ObjectGeometry extends CommonMethods { } /** - * @param {number} value x position according to object's {@link originX} property in parent's coordinate plane\ + * @param {number} value x position according to object's originX property in parent's coordinate plane\ * if parent is canvas then this method is identical to {@link setX} */ setRelativeX(value) { @@ -6124,7 +6112,7 @@ class ObjectGeometry extends CommonMethods { } /** - * @returns {number} y position according to object's {@link originY} property in parent's coordinate plane\ + * @returns {number} y position according to object's originY property in parent's coordinate plane\ * if parent is canvas then this property is identical to {@link getY} */ getRelativeY() { @@ -6132,7 +6120,7 @@ class ObjectGeometry extends CommonMethods { } /** - * @param {number} value y position according to object's {@link originY} property in parent's coordinate plane\ + * @param {number} value y position according to object's originY property in parent's coordinate plane\ * if parent is canvas then this property is identical to {@link setY} */ setRelativeY(value) { @@ -6140,7 +6128,7 @@ class ObjectGeometry extends CommonMethods { } /** - * @returns {Point} x position according to object's {@link originX} {@link originY} properties in canvas coordinate plane + * @returns {Point} x position according to object's originX originY properties in canvas coordinate plane */ getXY() { const relativePosition = this.getRelativeXY(); @@ -6149,7 +6137,7 @@ class ObjectGeometry extends CommonMethods { /** * Set an object position to a particular point, the point is intended in absolute ( canvas ) coordinate. - * You can specify {@link originX} and {@link originY} values, + * You can specify originX and originY values, * that otherwise are the object's current values. * @example Set object's bottom left corner to point (5,5) on canvas * object.setXY(new Point(5, 5), 'left', 'bottom'). @@ -6165,7 +6153,7 @@ class ObjectGeometry extends CommonMethods { } /** - * @returns {Point} x,y position according to object's {@link originX} {@link originY} properties in parent's coordinate plane + * @returns {Point} x,y position according to object's originX originY properties in parent's coordinate plane */ getRelativeXY() { return new Point(this.left, this.top); @@ -6173,7 +6161,7 @@ class ObjectGeometry extends CommonMethods { /** * As {@link setXY}, but in current parent's coordinate plane (the current group if any or the canvas) - * @param {Point} point position according to object's {@link originX} {@link originY} properties in parent's coordinate plane + * @param {Point} point position according to object's originX originY properties in parent's coordinate plane * @param {TOriginX} [originX] Horizontal origin: 'left', 'center' or 'right' * @param {TOriginY} [originY] Vertical origin: 'top', 'center' or 'bottom' */ @@ -6209,7 +6197,7 @@ class ObjectGeometry extends CommonMethods { } /** - * Checks if object intersects with the scene rect formed by {@link tl} and {@link br} + * Checks if object intersects with the scene rect formed by tl and br */ intersectsWithRect(tl, br) { const intersection = Intersection.intersectPolygonRectangle(this.getCoords(), tl, br); @@ -6237,7 +6225,7 @@ class ObjectGeometry extends CommonMethods { } /** - * Checks if object is fully contained within the scene rect formed by {@link tl} and {@link br} + * Checks if object is fully contained within the scene rect formed by tl and br */ isContainedWithinRect(tl, br) { const { @@ -6430,7 +6418,7 @@ class ObjectGeometry extends CommonMethods { /** * Sets corner and controls position coordinates based on current angle, width and height, left and top. * aCoords are used to quickly find an object on the canvas. - * See {@link https://github.com/fabricjs/fabric.js/wiki/When-to-call-setCoords} and {@link http://fabricjs.com/fabric-gotchas} + * See {@link https://github.com/fabricjs/fabric.js/wiki/When-to-call-setCoords} and {@link http://fabric5.fabricjs.com/fabric-gotchas} */ setCoords() { this.aCoords = this.calcACoords(); @@ -6699,7 +6687,7 @@ class ObjectGeometry extends CommonMethods { /** * Root object class from which all 2d shape classes inherit from - * @tutorial {@link http://fabricjs.com/fabric-intro-part-1#objects} + * @see {@link http://fabric5.fabricjs.com/fabric-intro-part-1#objects} * * @fires added * @fires removed @@ -7811,7 +7799,7 @@ let FabricObject$1 = class FabricObject extends ObjectGeometry { * Animates object's properties * @param {Record} animatable map of keys and end values * @param {Partial>} options - * @tutorial {@link http://fabricjs.com/fabric-intro-part-2#animation} + * @see {@link http://fabric5.fabricjs.com/fabric-intro-part-2#animation} * @return {Record>} map of animation contexts * * As object — multiple properties @@ -9375,7 +9363,7 @@ class InteractiveFabricObject extends FabricObject$1 { /** * @override set controls' coordinates as well - * See {@link https://github.com/fabricjs/fabric.js/wiki/When-to-call-setCoords} and {@link http://fabricjs.com/fabric-gotchas} + * See {@link https://github.com/fabricjs/fabric.js/wiki/When-to-call-setCoords} and {@link https://fabric5.fabricjs.com/fabric-gotchas} * @return {void} */ setCoords() { @@ -10556,8 +10544,6 @@ const reTransformAll = new RegExp(transform, 'g'); /** * Parses "transform" attribute, returning an array of values - * @static - * @function * @param {String} attributeValue String containing attribute value * @return {TTransformMatrix} Array of 6 elements representing transformation matrix */ @@ -10673,8 +10659,6 @@ function normalizeValue(attr, value, parentAttributes, fontSize) { /** * Parses a short font declaration, building adding its properties to a style object - * @static - * @function * @param {String} value font declaration * @param {Object} oStyle definition */ @@ -10739,7 +10723,6 @@ function parseStyleString(style, oStyle) { /** * Parses "style" attribute, retuning an object with values - * @static * @param {SVGElement} element Element to parse * @return {Object} Objects with values parsed from style attribute of an element */ @@ -11970,7 +11953,6 @@ classRegistry.setClass(Group); /** * TODO experiment with different layout manager and svg results ( fixed fit content ) * Groups SVG elements (usually those retrieved from SVG document) - * @static * @param {FabricObject[]} elements FabricObject(s) parsed from svg, to group * @return {FabricObject | Group} */ @@ -13199,9 +13181,9 @@ const canvasDefaults = { perPixelTargetFind: false, targetFindTolerance: 0, skipTargetFind: false, - stopContextMenu: false, - fireRightClick: false, - fireMiddleClick: false, + stopContextMenu: true, + fireRightClick: true, + fireMiddleClick: true, enablePointerEvents: false, containerClass: 'canvas-container', preserveObjectStacking: true @@ -13211,7 +13193,7 @@ const canvasDefaults = { * Canvas class * @class Canvas * @extends StaticCanvas - * @tutorial {@link http://fabricjs.com/fabric-intro-part-1#canvas} + * @see {@link http://fabric5.fabricjs.com/fabric-intro-part-1#canvas} * * @fires object:modified at the end of a transform * @fires object:rotating while an object is being rotated from the control @@ -13312,27 +13294,32 @@ class SelectableCanvas extends StaticCanvas$1 { * When true, mouse events on canvas (mousedown/mousemove/mouseup) result in free drawing. * After mousedown, mousemove creates a shape, * and then mouseup finalizes it and adds an instance of `fabric.Path` onto canvas. - * @tutorial {@link http://fabricjs.com/fabric-intro-part-4#free_drawing} + * @see {@link http://fabric5.fabricjs.com/fabric-intro-part-4#free_drawing} * @type Boolean */ - // event config /** - * Keep track of the hovered target - * @type FabricObject | null - * @private + * 启用双击锁定组对象,锁定后只能选择对象的子节点,无论group中interative和subTargetCheck是否启用 + * @type Boolean + * @default */ /** - * hold the list of nested targets hovered - * @type FabricObject[] - * @private + * 双击锁定的节点, 目前只支持组节点 + * @type Group | null + * @default */ - _defineProperty(this, "_hoveredTargets", []); + _defineProperty(this, "isolatedObject", void 0); + /** + * 指定的搜索对象 + * @type Boolean + * @default null + */ + _defineProperty(this, "_searchTargets", void 0); /** - * hold the list of objects to render + * hold the list of nested targets hovered in the previous events * @type FabricObject[] * @private */ - _defineProperty(this, "_objectsToRender", void 0); + _defineProperty(this, "_hoveredTargets", []); /** * hold a reference to a data structure that contains information * on the current on going transform @@ -13721,9 +13708,57 @@ class SelectableCanvas extends StaticCanvas$1 { } /** - * This function is in charge of deciding which is the object that is the current target of an interaction event. - * For interaction event we mean a pointer related action on the canvas. - * Which is the + * 双击选择 + * @param e + * @returns + */ + dblClickLock(e) { + if (this.dblClickIsolateObject) { + const pointer = this.getScenePoint(e); + const objects = this.isolatedObject ? this.isolatedObject.getObjects() : this.getObjects(); + const obj = this.searchPossibleTargets(objects, pointer); + if (obj.target) { + if (obj.target instanceof Group) { + // 组才修改锁定 + this.isolatedObject = obj.target; + this.discardActiveObject(); + // 新创建的组对象,子节点coords初始化,否则无法选中 + obj.target._objects.forEach(o => { + o.setCoords(); + }); + } else { + // 非组对象不处理锁定,返回false继续对象自己的双击事件 + return false; + } + } else { + // 取消锁定 + this.isolatedObject = null; + this.discardActiveObject(); + } + return true; + } + return false; + } + + /** + * 设置搜索对象 + * 如当编辑path时,设置点为可搜索对象 + * @param objects + */ + setSearchTargets(objects) { + this._searchTargets = objects; + } + + /** + * 返回搜索对象 + * @returns + */ + getSearchTargets() { + return this._searchTargets || (this.isolatedObject ? this.isolatedObject._objects : this._objects); + } + + /** + * Method that determines what object we are clicking on * 11/09/2018 TODO: would be cool if findTarget could discern between being a full target * or the outside part of the corner. * @param {Event} e mouse event @@ -13744,7 +13779,7 @@ class SelectableCanvas extends StaticCanvas$1 { const pointer = this.getScenePoint(e), activeObject = this._activeObject, aObjects = this.getActiveObjects(), - targetInfo = this.searchPossibleTargets(this._objects, pointer); + targetInfo = this.searchPossibleTargets(this.getSearchTargets(), pointer); const { subTargets: currentSubTargets, container: currentContainer, @@ -13880,7 +13915,8 @@ class SelectableCanvas extends StaticCanvas$1 { while (i--) { const target = objects[i]; if (this._checkTarget(target, pointer)) { - if (isCollection(target) && target.subTargetCheck) { + // 没有开启双击锁定节点才搜索子节点 + if (!this.dblClickIsolateObject && isCollection(target) && target.subTargetCheck) { const { target: subTarget } = this._searchPossibleTargets(target._objects, pointer, subTargets); @@ -14542,7 +14578,9 @@ let Canvas$1 = class Canvas extends SelectableCanvas { functor(canvasElement, `${eventTypePrefix}move`, this._onMouseMove, addEventOptions); functor(canvasElement, `${eventTypePrefix}out`, this._onMouseOut); functor(canvasElement, `${eventTypePrefix}enter`, this._onMouseEnter); - functor(canvasElement, 'wheel', this._onMouseWheel); + functor(canvasElement, 'wheel', this._onMouseWheel, { + passive: false + }); functor(canvasElement, 'contextmenu', this._onContextMenu); functor(canvasElement, 'click', this._onClick); // decide if to remove in fabric 7.0 @@ -14909,11 +14947,26 @@ let Canvas$1 = class Canvas extends SelectableCanvas { const clicks = e.detail; if (clicks > 3 || clicks < 2) return; this._cacheTransformEventData(e); - clicks == 2 && e.type === 'dblclick' && this._handleEvent(e, 'dblclick'); + clicks == 2 && e.type === 'dblclick' && this._onDblClick(e); clicks == 3 && this._handleEvent(e, 'tripleclick'); this._resetTransformEventData(); } + /** + * 双击选择锁定组的子节点 + * @param e + */ + _onDblClick(e) { + if (this.dblClickLock(e)) { + // 锁定后立即选中点击子对象 + this._resetTransformEventData(); + this.__onMouseDown(e); + this.__onMouseUp(e); + return; + } + this._handleEvent(e, 'dblclick'); + } + /** * Return a the id of an event. * returns either the pointerId or the identifier or 0 for the mouse event @@ -15315,6 +15368,23 @@ let Canvas$1 = class Canvas extends SelectableCanvas { shouldRender = true; } else if (this._shouldClearSelection(e, target)) { this.discardActiveObject(e); + + // 锁定对象时且没有指定选中时,如果点击组外空白或对象,取消锁定 + if (this.isolatedObject && !this._searchTargets) { + this.setSearchTargets([this.isolatedObject]); + const { + target + } = this.findTarget(e); + // 没有选中任何对象,或者选中的是锁定对象以外的对象 + if (target !== this.isolatedObject) { + this.isolatedObject = null; + } + this.setSearchTargets(null); + // 在此执行__onMouseDown选中其他对象 + this._resetTransformEventData(); + this.__onMouseDown(e); + return; + } } // we start a group selector rectangle if // selection is enabled @@ -15429,8 +15499,10 @@ let Canvas$1 = class Canvas extends SelectableCanvas { * @private */ _fireOverOutEvents(e, target) { - const _hoveredTarget = this._hoveredTarget, - _hoveredTargets = this._hoveredTargets, + const { + _hoveredTarget, + _hoveredTargets + } = this, { subTargets } = this.findTarget(e), @@ -15442,6 +15514,9 @@ let Canvas$1 = class Canvas extends SelectableCanvas { fireCanvas: true }); for (let i = 0; i < length; i++) { + if (subTargets[i] === target || _hoveredTargets[i] && _hoveredTargets[i] === _hoveredTarget) { + continue; + } this.fireSyntheticInOutEvents('mouse', { e, target: subTargets[i], @@ -15925,7 +16000,7 @@ function parseCoords(el, size) { /** * Gradient class * @class Gradient - * @tutorial {@link http://fabricjs.com/fabric-intro-part-2#gradients} + * @see {@link http://fabric5.fabricjs.com/fabric-intro-part-2#gradients} */ class Gradient { constructor(options) { @@ -16236,8 +16311,8 @@ classRegistry.setClass(Gradient, 'linear'); classRegistry.setClass(Gradient, 'radial'); /** - * @see {@link http://fabricjs.com/patterns demo} - * @see {@link http://fabricjs.com/dynamic-patterns demo} + * @see {@link http://fabric5.fabricjs.com/patterns demo} + * @see {@link http://fabric5.fabricjs.com/dynamic-patterns demo} */ class Pattern { /** @@ -16407,7 +16482,7 @@ classRegistry.setClass(Pattern); classRegistry.setClass(Pattern, 'pattern'); /** - * @see {@link http://fabricjs.com/freedrawing|Freedrawing demo} + * @see {@link http://fabric5.fabricjs.com/freedrawing|Freedrawing demo} */ class BaseBrush { /** @@ -17749,7 +17824,6 @@ class Line extends FabricObject { /** * Returns object representation of an instance - * @method toObject * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output * @return {Object} object representation of an instance */ @@ -18076,7 +18150,6 @@ classRegistry.setSVGClass(Ellipse); /** * Parses "points" attribute, returning an array of values - * @static * @param {String} points points attribute string * @return {Array} array of points */ @@ -18986,7 +19059,7 @@ function getMeasuringContext() { /** * Text class - * @tutorial {@link http://fabricjs.com/fabric-intro-part-2#text} + * @see {@link http://fabric5.fabricjs.com/fabric-intro-part-2#text} */ class FabricText extends StyledText { static getDefaults() { @@ -21555,7 +21628,8 @@ class ITextKeyBehavior extends ITextBehavior { autocomplete: 'off', spellcheck: 'false', 'data-fabric': 'textarea', - wrap: 'off' + wrap: 'off', + name: 'fabricTextarea' }).map(_ref => { let [attribute, value] = _ref; return textarea.setAttribute(attribute, value); @@ -23469,7 +23543,6 @@ class Textbox extends IText { /** * Returns object representation of an instance - * @method toObject * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output * @return {Object} object representation of an instance */ @@ -24085,6 +24158,8 @@ class WebGLFilterBackend { } else { gl.texImage2D(TEXTURE_2D, 0, RGBA, width, height, 0, RGBA, UNSIGNED_BYTE, null); } + // disabled because website and issues with different typescript version + // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion return texture; } @@ -24266,7 +24341,7 @@ const imageDefaultValues = { const IMAGE_PROPS = ['cropX', 'cropY']; /** - * @tutorial {@link http://fabricjs.com/fabric-intro-part-1#images} + * @see {@link http://fabric5.fabricjs.com/fabric-intro-part-1#images} */ class FabricImage extends FabricObject { static getDefaults() { @@ -24595,7 +24670,6 @@ class FabricImage extends FabricObject { /** * Applies filters assigned to this image (from "filters" array) or from filter param - * @method applyFilters * @param {Array} filters to be applied * @param {Boolean} forResizing specify if the filter operation is a resize operation */ @@ -25366,8 +25440,6 @@ const createEmptyResponse = () => ({ /** * Parses an SVG document, converts it to an array of corresponding fabric.* instances and passes them to a callback - * @static - * @function * @param {HTMLElement} doc SVG document to parse * @param {TSvgParsedCallback} callback Invoked when the parsing is done, with null if parsing wasn't possible with the list of svg nodes. * @param {TSvgReviverCallback} [reviver] Extra callback for further parsing of SVG elements, called after each fabric object has been created. @@ -26825,8 +26897,8 @@ const colorMatrixDefaultValues = { /** * Color Matrix filter class - * @see {@link http://fabricjs.com/image-filters|ImageFilters demo} - * @see {@Link http://phoboslab.org/log/2013/11/fast-image-filters-with-webgl demo} + * @see {@link http://fabric5.fabricjs.com/image-filters|ImageFilters demo} + * @see {@link http://phoboslab.org/log/2013/11/fast-image-filters-with-webgl demo} * @example Kodachrome filter * const filter = new ColorMatrix({ * matrix: [ diff --git a/dist/index.node.mjs.map b/dist/index.node.mjs.map index ee57e7ad11a..0ee20d20c41 100644 --- a/dist/index.node.mjs.map +++ b/dist/index.node.mjs.map @@ -1 +1 @@ -{"version":3,"file":"index.node.mjs","sources":["../src/config.ts","../src/util/internals/console.ts","../src/filters/GLProbes/GLProbe.ts","../src/filters/GLProbes/WebGLProbe.ts","../src/env/browser.ts","../src/env/index.ts","../src/filters/GLProbes/NodeGLProbe.ts","../src/env/node.ts","../src/cache.ts","../src/constants.ts","../src/ClassRegistry.ts","../src/util/animation/AnimationRegistry.ts","../src/Observable.ts","../src/util/internals/removeFromArray.ts","../src/util/misc/cos.ts","../src/util/misc/sin.ts","../src/Point.ts","../src/Collection.ts","../src/CommonMethods.ts","../src/util/animation/AnimationFrameProvider.ts","../src/util/internals/uid.ts","../src/util/misc/dom.ts","../src/util/misc/radiansDegreesConversion.ts","../src/util/misc/matrix.ts","../src/util/misc/objectEnlive.ts","../src/util/misc/pick.ts","../src/util/misc/toFixed.ts","../src/util/misc/svgExport.ts","../src/util/typeAssertions.ts","../src/util/dom_misc.ts","../src/canvas/DOMManagers/util.ts","../src/canvas/DOMManagers/StaticCanvasDOMManager.ts","../src/canvas/StaticCanvasOptions.ts","../src/canvas/StaticCanvas.ts","../src/util/dom_event.ts","../src/util/misc/boundingBoxFromPoints.ts","../src/util/misc/objectTransforms.ts","../src/util/misc/planeChange.ts","../src/controls/fireEvent.ts","../src/util/misc/resolveOrigin.ts","../src/util/misc/vectors.ts","../src/controls/util.ts","../src/controls/drag.ts","../src/color/color_map.ts","../src/color/constants.ts","../src/color/util.ts","../src/color/Color.ts","../src/util/misc/svgParsing.ts","../src/shapes/Object/FabricObjectSVGExportMixin.ts","../src/parser/getSvgRegex.ts","../src/shapes/Text/constants.ts","../src/parser/constants.ts","../src/Shadow.ts","../src/util/misc/capValue.ts","../src/shapes/Object/defaultValues.ts","../src/util/animation/easing.ts","../src/util/animation/AnimationBase.ts","../src/util/animation/ValueAnimation.ts","../src/util/animation/ArrayAnimation.ts","../src/util/animation/ColorAnimation.ts","../src/util/animation/animate.ts","../src/Intersection.ts","../src/shapes/Object/ObjectGeometry.ts","../src/shapes/Object/Object.ts","../src/controls/wrapWithFireEvent.ts","../src/controls/wrapWithFixedAnchor.ts","../src/controls/changeWidth.ts","../src/controls/controlRendering.ts","../src/controls/Control.ts","../src/controls/rotate.ts","../src/controls/scale.ts","../src/controls/skew.ts","../src/controls/scaleSkew.ts","../src/controls/commonControls.ts","../src/shapes/Object/InteractiveObject.ts","../src/util/applyMixins.ts","../src/shapes/Object/FabricObject.ts","../src/util/misc/isTransparent.ts","../src/util/internals/findRight.ts","../src/util/misc/projectStroke/StrokeProjectionsBase.ts","../src/util/misc/projectStroke/StrokeLineJoinProjections.ts","../src/util/misc/projectStroke/StrokeLineCapProjections.ts","../src/util/misc/projectStroke/index.ts","../src/util/internals/cloneStyles.ts","../src/util/lang_string.ts","../src/util/misc/textStyles.ts","../src/parser/attributes.ts","../src/parser/selectorMatches.ts","../src/parser/doesSomeParentMatch.ts","../src/parser/elementMatchesRule.ts","../src/parser/getGlobalStylesForElement.ts","../src/parser/normalizeAttr.ts","../src/util/internals/cleanupSvgAttribute.ts","../src/parser/parseTransformAttribute.ts","../src/parser/normalizeValue.ts","../src/parser/parseFontDeclaration.ts","../src/parser/parseStyleObject.ts","../src/parser/parseStyleString.ts","../src/parser/parseStyleAttribute.ts","../src/parser/setStrokeFillOpacity.ts","../src/parser/parseAttributes.ts","../src/shapes/Rect.ts","../src/LayoutManager/constants.ts","../src/LayoutManager/LayoutStrategies/utils.ts","../src/LayoutManager/LayoutStrategies/LayoutStrategy.ts","../src/LayoutManager/LayoutStrategies/FitContentLayout.ts","../src/LayoutManager/LayoutManager.ts","../src/shapes/Group.ts","../src/util/misc/groupSVGElements.ts","../src/util/misc/findScaleTo.ts","../src/util/path/regex.ts","../src/util/path/index.ts","../src/util/misc/mergeClipPaths.ts","../src/util/internals/getRandomInt.ts","../src/util/transform_matrix_removal.ts","../src/util/internals/dom_style.ts","../src/canvas/DOMManagers/CanvasDOMManager.ts","../src/canvas/CanvasOptions.ts","../src/canvas/SelectableCanvas.ts","../src/canvas/TextEditingManager.ts","../src/canvas/Canvas.ts","../src/gradient/constants.ts","../src/util/internals/ifNaN.ts","../src/parser/percent.ts","../src/gradient/parser/parseColorStops.ts","../src/gradient/parser/misc.ts","../src/gradient/parser/parseCoords.ts","../src/gradient/Gradient.ts","../src/Pattern/Pattern.ts","../src/brushes/BaseBrush.ts","../src/shapes/Path.ts","../src/brushes/PencilBrush.ts","../src/shapes/Circle.ts","../src/brushes/CircleBrush.ts","../src/brushes/SprayBrush.ts","../src/brushes/PatternBrush.ts","../src/shapes/Line.ts","../src/shapes/Triangle.ts","../src/shapes/Ellipse.ts","../src/parser/parsePointsAttribute.ts","../src/shapes/Polyline.ts","../src/shapes/Polygon.ts","../src/shapes/Text/StyledText.ts","../src/shapes/Text/TextSVGExportMixin.ts","../src/shapes/Text/Text.ts","../src/shapes/IText/DraggableTextDelegate.ts","../src/shapes/IText/ITextBehavior.ts","../src/shapes/IText/ITextKeyBehavior.ts","../src/shapes/IText/ITextClickBehavior.ts","../src/shapes/IText/constants.ts","../src/util/internals/applyCanvasTransform.ts","../src/shapes/IText/IText.ts","../src/shapes/Textbox.ts","../src/LayoutManager/LayoutStrategies/ClipPathLayout.ts","../src/LayoutManager/LayoutStrategies/FixedLayout.ts","../src/LayoutManager/ActiveSelectionLayoutManager.ts","../src/shapes/ActiveSelection.ts","../src/filters/Canvas2dFilterBackend.ts","../src/filters/WebGLFilterBackend.ts","../src/filters/FilterBackend.ts","../src/shapes/Image.ts","../src/parser/applyViewboxTransform.ts","../src/parser/getTagName.ts","../src/parser/hasInvalidAncestor.ts","../src/parser/getMultipleNodes.ts","../src/parser/parseUseDirectives.ts","../src/parser/recursivelyParseGradientsXlink.ts","../src/parser/getGradientDefs.ts","../src/parser/getCSSRules.ts","../src/parser/elements_parser.ts","../src/parser/parseSVGDocument.ts","../src/parser/loadSVGFromString.ts","../src/parser/loadSVGFromURL.ts","../src/controls/polyControl.ts","../src/controls/pathControl.ts","../src/filters/utils.ts","../src/filters/shaders/baseFilter.ts","../src/filters/BaseFilter.ts","../src/filters/shaders/blendColor.ts","../src/filters/BlendColor.ts","../src/filters/shaders/blendImage.ts","../src/filters/BlendImage.ts","../src/filters/shaders/blur.ts","../src/filters/Blur.ts","../src/filters/shaders/brightness.ts","../src/filters/Brightness.ts","../src/filters/shaders/colorMatrix.ts","../src/filters/ColorMatrix.ts","../src/filters/ColorMatrixFilters.ts","../src/filters/Composed.ts","../src/filters/shaders/constrast.ts","../src/filters/Contrast.ts","../src/filters/shaders/convolute.ts","../src/filters/Convolute.ts","../src/filters/shaders/gamma.ts","../src/filters/Gamma.ts","../src/filters/shaders/grayscale.ts","../src/filters/Grayscale.ts","../src/filters/HueRotation.ts","../src/filters/shaders/invert.ts","../src/filters/Invert.ts","../src/filters/shaders/noise.ts","../src/filters/Noise.ts","../src/filters/shaders/pixelate.ts","../src/filters/Pixelate.ts","../src/filters/shaders/removeColor.ts","../src/filters/RemoveColor.ts","../src/filters/Resize.ts","../src/filters/shaders/saturation.ts","../src/filters/Saturation.ts","../src/filters/shaders/vibrance.ts","../src/filters/Vibrance.ts","../index.node.ts"],"sourcesContent":["export type TConfiguration = Partial;\n\nclass BaseConfiguration {\n /**\n * Browser-specific constant to adjust CanvasRenderingContext2D.shadowBlur value,\n * which is unitless and not rendered equally across browsers.\n *\n * Values that work quite well (as of October 2017) are:\n * - Chrome: 1.5\n * - Edge: 1.75\n * - Firefox: 0.9\n * - Safari: 0.95\n *\n * @since 2.0.0\n * @type Number\n * @default 1\n */\n browserShadowBlurConstant = 1;\n\n /**\n * Pixel per Inch as a default value set to 96. Can be changed for more realistic conversion.\n */\n DPI = 96;\n\n /**\n * Device Pixel Ratio\n * @see https://developer.apple.com/library/safari/documentation/AudioVideo/Conceptual/HTML-canvas-guide/SettingUptheCanvas/SettingUptheCanvas.html\n */\n devicePixelRatio =\n typeof window !== 'undefined' ? window.devicePixelRatio : 1; // eslint-disable-line no-restricted-globals\n\n /**\n * Pixel limit for cache canvases. 1Mpx , 4Mpx should be fine.\n * @since 1.7.14\n * @type Number\n */\n perfLimitSizeTotal = 2097152;\n\n /**\n * Pixel limit for cache canvases width or height. IE fixes the maximum at 5000\n * @since 1.7.14\n * @type Number\n */\n maxCacheSideLimit = 4096;\n\n /**\n * Lowest pixel limit for cache canvases, set at 256PX\n * @since 1.7.14\n * @type Number\n */\n minCacheSideLimit = 256;\n\n /**\n * When 'true', style information is not retained when copy/pasting text, making\n * pasted text use destination style.\n * Defaults to 'false'.\n * @type Boolean\n * @deprecated\n */\n disableStyleCopyPaste = false;\n\n /**\n * Enable webgl for filtering picture is available\n * A filtering backend will be initialized, this will both take memory and\n * time since a default 2048x2048 canvas will be created for the gl context\n * @since 2.0.0\n * @type Boolean\n */\n enableGLFiltering = true;\n\n /**\n * if webgl is enabled and available, textureSize will determine the size\n * of the canvas backend\n *\n * In order to support old hardware set to `2048` to avoid OOM\n *\n * @since 2.0.0\n * @type Number\n */\n textureSize = 4096;\n\n /**\n * Skip performance testing of setupGLContext and force the use of putImageData that seems to be the one that works best on\n * Chrome + old hardware. if your users are experiencing empty images after filtering you may try to force this to true\n * this has to be set before instantiating the filtering backend ( before filtering the first image )\n * @type Boolean\n * @default false\n */\n forceGLPutImageData = false;\n\n /**\n * If disabled boundsOfCurveCache is not used. For apps that make heavy usage of pencil drawing probably disabling it is better\n * With the standard behaviour of fabric to translate all curves in absolute commands and by not subtracting the starting point from\n * the curve is very hard to hit any cache.\n * Enable only if you know why it could be useful.\n * Candidate for removal/simplification\n * @default false\n */\n cachesBoundsOfCurve = false;\n\n /**\n * Map of font files\n * Map of font files\n */\n fontPaths: Record = {};\n\n /**\n * Defines the number of fraction digits to use when serializing object values.\n * Used in exporting methods (`toObject`, `toJSON`, `toSVG`)\n * You can use it to increase/decrease precision of such values like left, top, scaleX, scaleY, etc.\n */\n NUM_FRACTION_DIGITS = 4;\n}\n\nexport class Configuration extends BaseConfiguration {\n constructor(config?: TConfiguration) {\n super();\n this.configure(config);\n }\n\n configure(config: TConfiguration = {}) {\n Object.assign(this, config);\n }\n\n /**\n * Map of font files\n */\n addFonts(\n paths: Record = {},\n ) {\n this.fontPaths = {\n ...this.fontPaths,\n ...paths,\n };\n }\n\n removeFonts(fontFamilys: string[] = []) {\n fontFamilys.forEach((fontFamily) => {\n delete this.fontPaths[fontFamily];\n });\n }\n\n clearFonts() {\n this.fontPaths = {};\n }\n\n restoreDefaults(keys?: (keyof T)[]) {\n const defaults = new BaseConfiguration() as T;\n const config =\n keys?.reduce((acc, key) => {\n acc[key] = defaults[key];\n return acc;\n }, {} as T) || defaults;\n this.configure(config);\n }\n}\n\nexport const config = new Configuration();\n","export const log = (\n severity: 'log' | 'warn' | 'error',\n ...optionalParams: any[]\n) =>\n // eslint-disable-next-line no-restricted-syntax\n console[severity]('fabric', ...optionalParams);\n\nexport class FabricError extends Error {\n constructor(message?: string, options?: ErrorOptions) {\n super(`fabric: ${message}`, options);\n }\n}\n\nexport class SignalAbortedError extends FabricError {\n constructor(context: string) {\n super(`${context} 'options.signal' is in 'aborted' state`);\n }\n}\n","export type GLPrecision = 'lowp' | 'mediump' | 'highp';\n\nexport abstract class GLProbe {\n declare GLPrecision: GLPrecision | undefined;\n abstract queryWebGL(canvas: HTMLCanvasElement): void;\n abstract isSupported(textureSize: number): boolean;\n}\n","import { log } from '../../util/internals/console';\nimport { GLProbe } from './GLProbe';\nimport type { GLPrecision } from './GLProbe';\n\n/**\n * Lazy initialize WebGL constants\n */\nexport class WebGLProbe extends GLProbe {\n declare maxTextureSize?: number;\n\n /**\n * Tests if webgl supports certain precision\n * @param {WebGL} Canvas WebGL context to test on\n * @param {GLPrecision} Precision to test can be any of following\n * @returns {Boolean} Whether the user's browser WebGL supports given precision.\n */\n private testPrecision(\n gl: WebGLRenderingContext,\n precision: GLPrecision,\n ): boolean {\n const fragmentSource = `precision ${precision} float;\\nvoid main(){}`;\n const fragmentShader = gl.createShader(gl.FRAGMENT_SHADER);\n if (!fragmentShader) {\n return false;\n }\n gl.shaderSource(fragmentShader, fragmentSource);\n gl.compileShader(fragmentShader);\n return !!gl.getShaderParameter(fragmentShader, gl.COMPILE_STATUS);\n }\n\n /**\n * query browser for WebGL\n */\n queryWebGL(canvas: HTMLCanvasElement) {\n const gl = canvas.getContext('webgl');\n if (gl) {\n this.maxTextureSize = gl.getParameter(gl.MAX_TEXTURE_SIZE);\n this.GLPrecision = (['highp', 'mediump', 'lowp'] as const).find(\n (precision) => this.testPrecision(gl, precision),\n );\n gl.getExtension('WEBGL_lose_context')!.loseContext();\n log('log', `WebGL: max texture size ${this.maxTextureSize}`);\n }\n }\n\n isSupported(textureSize: number) {\n return !!this.maxTextureSize && this.maxTextureSize >= textureSize;\n }\n}\n","/* eslint-disable no-restricted-globals */\nimport { WebGLProbe } from '../filters/GLProbes/WebGLProbe';\nimport type { TCopyPasteData, TFabricEnv } from './types';\n\nconst copyPasteData: TCopyPasteData = {};\n\nexport const getEnv = (): TFabricEnv => {\n return {\n document,\n window,\n isTouchSupported:\n 'ontouchstart' in window ||\n 'ontouchstart' in document ||\n (window && window.navigator && window.navigator.maxTouchPoints > 0),\n WebGLProbe: new WebGLProbe(),\n dispose() {\n // noop\n },\n copyPasteData,\n };\n};\n","/**\n * This file is consumed by fabric.\n * The `./node` and `./browser` files define the env variable that is used by this module.\n * The `./browser` module is defined to be the default env and doesn't set the env at all.\n * This is done in order to support isomorphic usage for browser and node applications\n * since window and document aren't defined at time of import in SSR, we can't set env so we avoid it by deferring to the default env.\n */\n\nimport { config } from '../config';\nimport { getEnv as getBrowserEnv } from './browser';\nimport type { TFabricEnv } from './types';\nimport type { DOMWindow } from 'jsdom';\n\nlet env: TFabricEnv;\n\n/**\n * Sets the environment variables used by fabric.\\\n * This is exposed for special cases, such as configuring a test environment, and should be used with care.\n *\n * **CAUTION**: Must be called before using the package.\n *\n * @example\n * Passing `window` and `document` objects to fabric (in case they are mocked or something)\n * import { getEnv, setEnv } from 'fabric';\n * // we want fabric to use the `window` and `document` objects exposed by the environment we are running in.\n * setEnv({ ...getEnv(), window, document });\n * // done with setup, using fabric is now safe\n */\nexport const setEnv = (value: TFabricEnv) => {\n env = value;\n};\n\n/**\n * In order to support SSR we **MUST** access the browser env only after the window has loaded\n */\nexport const getEnv = () => env || (env = getBrowserEnv());\n\nexport const getFabricDocument = (): Document => getEnv().document;\n\nexport const getFabricWindow = (): (Window & typeof globalThis) | DOMWindow =>\n getEnv().window;\n\n/**\n * @returns the config value if defined, fallbacks to the environment value\n */\nexport const getDevicePixelRatio = () =>\n Math.max(config.devicePixelRatio ?? getFabricWindow().devicePixelRatio, 1);\n","import { GLProbe } from './GLProbe';\n\n/**\n * @todo GL rendering in node is possible:\n * - https://github.com/stackgl/headless-gl\n * - https://github.com/akira-cn/node-canvas-webgl\n */\nexport class NodeGLProbe extends GLProbe {\n queryWebGL() {\n // noop\n }\n isSupported() {\n return false;\n }\n}\n","/* eslint-disable no-restricted-globals */\nimport type { Canvas as NodeCanvas } from 'canvas';\nimport { JSDOM } from 'jsdom';\n// @ts-expect-error internal import\nimport utils from 'jsdom/lib/jsdom/living/generated/utils.js';\nimport { NodeGLProbe } from '../filters/GLProbes/NodeGLProbe';\nimport type { TCopyPasteData, TFabricEnv } from './types';\n\nconst { implForWrapper: jsdomImplForWrapper } = utils;\n\nconst copyPasteData: TCopyPasteData = {};\n\nconst { window: JSDOMWindow } = new JSDOM(\n decodeURIComponent(\n '%3C!DOCTYPE%20html%3E%3Chtml%3E%3Chead%3E%3C%2Fhead%3E%3Cbody%3E%3C%2Fbody%3E%3C%2Fhtml%3E',\n ),\n {\n resources: 'usable',\n // needed for `requestAnimationFrame`\n pretendToBeVisual: true,\n },\n);\n\nexport const getNodeCanvas = (canvasEl: HTMLCanvasElement) => {\n const impl = jsdomImplForWrapper(canvasEl);\n return (impl._canvas || impl._image) as NodeCanvas;\n};\n\nexport const dispose = (element: Element) => {\n const impl = jsdomImplForWrapper(element);\n if (impl) {\n impl._image = null;\n impl._canvas = null;\n // unsure if necessary\n impl._currentSrc = null;\n impl._attributes = null;\n impl._classList = null;\n }\n};\n\nexport const getEnv = (): TFabricEnv => {\n return {\n document: JSDOMWindow.document,\n window: JSDOMWindow,\n isTouchSupported: false,\n WebGLProbe: new NodeGLProbe(),\n dispose,\n copyPasteData,\n };\n};\n","import { config } from './config';\nimport type { TRectBounds } from './typedefs';\n\nexport class Cache {\n /**\n * Cache of widths of chars in text rendering.\n */\n charWidthsCache: Record<\n /** fontFamily */ string,\n Record<\n /** fontStyleCacheKey */ string,\n Record\n >\n > = {};\n\n /**\n * @return {Object} reference to cache\n */\n getFontCache({\n fontFamily,\n fontStyle,\n fontWeight,\n }: {\n fontFamily: string;\n fontStyle: string;\n fontWeight: string | number;\n }) {\n fontFamily = fontFamily.toLowerCase();\n if (!this.charWidthsCache[fontFamily]) {\n this.charWidthsCache[fontFamily] = {};\n }\n const fontCache = this.charWidthsCache[fontFamily];\n const cacheKey = `${fontStyle.toLowerCase()}_${(\n fontWeight + ''\n ).toLowerCase()}`;\n if (!fontCache[cacheKey]) {\n fontCache[cacheKey] = {};\n }\n return fontCache[cacheKey];\n }\n\n /**\n * Clear char widths cache for the given font family or all the cache if no\n * fontFamily is specified.\n * Use it if you know you are loading fonts in a lazy way and you are not waiting\n * for custom fonts to load properly when adding text objects to the canvas.\n * If a text object is added when its own font is not loaded yet, you will get wrong\n * measurement and so wrong bounding boxes.\n * After the font cache is cleared, either change the textObject text content or call\n * initDimensions() to trigger a recalculation\n * @param {String} [fontFamily] font family to clear\n */\n clearFontCache(fontFamily?: string) {\n fontFamily = (fontFamily || '').toLowerCase();\n if (!fontFamily) {\n this.charWidthsCache = {};\n } else if (this.charWidthsCache[fontFamily]) {\n delete this.charWidthsCache[fontFamily];\n }\n }\n\n /**\n * Given current aspect ratio, determines the max width and height that can\n * respect the total allowed area for the cache.\n * @param {number} ar aspect ratio\n * @return {number[]} Limited dimensions X and Y\n */\n limitDimsByArea(ar: number) {\n const { perfLimitSizeTotal } = config;\n const roughWidth = Math.sqrt(perfLimitSizeTotal * ar);\n // we are not returning a point on purpose, to avoid circular dependencies\n // this is an internal utility\n return [\n Math.floor(roughWidth),\n Math.floor(perfLimitSizeTotal / roughWidth),\n ];\n }\n\n /**\n * This object keeps the results of the boundsOfCurve calculation mapped by the joined arguments necessary to calculate it.\n * It does speed up calculation, if you parse and add always the same paths, but in case of heavy usage of freedrawing\n * you do not get any speed benefit and you get a big object in memory.\n * The object was a private variable before, while now is appended to the lib so that you have access to it and you\n * can eventually clear it.\n * It was an internal variable, is accessible since version 2.3.4\n */\n boundsOfCurveCache: Record = {};\n}\n\nexport const cache = new Cache();\n","import type { TMat2D } from './typedefs';\n// use this syntax so babel plugin see this import here\nimport { version } from '../package.json';\n\nexport const VERSION = version;\n// eslint-disable-next-line @typescript-eslint/no-empty-function\nexport function noop() {}\n\nexport const halfPI = Math.PI / 2;\nexport const quarterPI = Math.PI / 4;\nexport const twoMathPi = Math.PI * 2;\nexport const PiBy180 = Math.PI / 180;\n\nexport const iMatrix = Object.freeze([1, 0, 0, 1, 0, 0]) as TMat2D;\nexport const DEFAULT_SVG_FONT_SIZE = 16;\nexport const ALIASING_LIMIT = 2;\n\n/* \"magic number\" for bezier approximations of arcs (http://itc.ktu.lt/itc354/Riskus354.pdf) */\nexport const kRect = 1 - 0.5522847498;\n\nexport const CENTER = 'center';\nexport const LEFT = 'left';\nexport const TOP = 'top';\nexport const BOTTOM = 'bottom';\nexport const RIGHT = 'right';\nexport const NONE = 'none';\n\nexport const reNewline = /\\r?\\n/;\n\nexport const MOVING = 'moving';\nexport const SCALING = 'scaling';\nexport const ROTATING = 'rotating';\nexport const ROTATE = 'rotate';\nexport const SKEWING = 'skewing';\nexport const RESIZING = 'resizing';\nexport const MODIFY_POLY = 'modifyPoly';\nexport const MODIFY_PATH = 'modifyPath';\nexport const CHANGED = 'changed';\nexport const SCALE = 'scale';\nexport const SCALE_X = 'scaleX';\nexport const SCALE_Y = 'scaleY';\nexport const SKEW_X = 'skewX';\nexport const SKEW_Y = 'skewY';\nexport const FILL = 'fill';\nexport const STROKE = 'stroke';\nexport const MODIFIED = 'modified';\n","import { FabricError } from './util/internals/console';\n\n/*\n * This Map connects the objects type value with their\n * class implementation. It used from any object to understand which are\n * the classes to enlive when requesting a object.type = 'path' for example.\n * Objects uses it for clipPath, Canvas uses it for everything.\n * This is necessary for generic code to run and enlive instances from serialized representation.\n * You can customize which classes get enlived from SVG parsing using this classRegistry.\n * The Registry start empty and gets filled in depending which files you import.\n * If you want to be able to parse arbitrary SVGs or JSON representation of canvases, coming from\n * different sources you will need to import all fabric because you may need all classes.\n */\n\nexport const JSON = 'json';\nexport const SVG = 'svg';\n\nexport class ClassRegistry {\n declare [JSON]: Map;\n declare [SVG]: Map;\n\n constructor() {\n this[JSON] = new Map();\n this[SVG] = new Map();\n }\n\n has(classType: string): boolean {\n return this[JSON].has(classType);\n }\n\n getClass(classType: string): T {\n const constructor = this[JSON].get(classType);\n if (!constructor) {\n throw new FabricError(`No class registered for ${classType}`);\n }\n return constructor;\n }\n\n setClass(classConstructor: any, classType?: string) {\n if (classType) {\n this[JSON].set(classType, classConstructor);\n } else {\n this[JSON].set(classConstructor.type, classConstructor);\n // legacy\n // @TODO: needs to be removed in fabric 7 or 8\n this[JSON].set(classConstructor.type.toLowerCase(), classConstructor);\n }\n }\n\n getSVGClass(SVGTagName: string): any {\n return this[SVG].get(SVGTagName);\n }\n\n setSVGClass(classConstructor: any, SVGTagName?: string) {\n this[SVG].set(\n SVGTagName ?? classConstructor.type.toLowerCase(),\n classConstructor,\n );\n }\n}\n\nexport const classRegistry = new ClassRegistry();\n","import type { StaticCanvas } from '../../canvas/StaticCanvas';\nimport type { FabricObject } from '../../shapes/Object/FabricObject';\nimport type { AnimationBase } from './AnimationBase';\n\n/**\n * Array holding all running animations\n */\nclass AnimationRegistry extends Array {\n /**\n * Remove a single animation using an animation context\n * @param {AnimationBase} context\n */\n remove(context: AnimationBase) {\n const index = this.indexOf(context);\n index > -1 && this.splice(index, 1);\n }\n\n /**\n * Cancel all running animations on the next frame\n */\n cancelAll() {\n const animations = this.splice(0);\n animations.forEach((animation) => animation.abort());\n return animations;\n }\n\n /**\n * Cancel all running animations attached to a canvas on the next frame\n * @param {StaticCanvas} canvas\n */\n cancelByCanvas(canvas: StaticCanvas) {\n if (!canvas) {\n return [];\n }\n const animations = this.filter(\n (animation) =>\n animation.target === canvas ||\n (typeof animation.target === 'object' &&\n (animation.target as FabricObject)?.canvas === canvas),\n );\n animations.forEach((animation) => animation.abort());\n return animations;\n }\n\n /**\n * Cancel all running animations for target on the next frame\n * @param target\n */\n cancelByTarget(target: AnimationBase['target']) {\n if (!target) {\n return [];\n }\n const animations = this.filter((animation) => animation.target === target);\n animations.forEach((animation) => animation.abort());\n return animations;\n }\n}\n\nexport const runningAnimations = new AnimationRegistry();\n","export type TEventCallback = (options: T) => any;\n\ntype EventRegistryObject = {\n [K in keyof E]?: TEventCallback;\n};\n\n/**\n * @tutorial {@link http://fabricjs.com/fabric-intro-part-2#events}\n * @see {@link http://fabricjs.com/events|Events demo}\n */\nexport class Observable {\n private __eventListeners: Record =\n {} as Record;\n\n /**\n * Observes specified event\n * @alias on\n * @param {string} eventName Event name (eg. 'after:render')\n * @param {EventRegistryObject} handlers key/value pairs (eg. {'after:render': handler, 'selection:cleared': handler})\n * @param {Function} handler Function that receives a notification when an event of the specified type occurs\n * @return {Function} disposer\n */\n on(\n eventName: K,\n handler: TEventCallback,\n ): VoidFunction;\n on(handlers: EventRegistryObject): VoidFunction;\n on(\n arg0: K | EventRegistryObject,\n handler?: TEventCallback,\n ): VoidFunction {\n if (!this.__eventListeners) {\n this.__eventListeners = {} as Record;\n }\n if (typeof arg0 === 'object') {\n // one object with key/value pairs was passed\n Object.entries(arg0).forEach(([eventName, handler]) => {\n this.on(eventName as K, handler as TEventCallback);\n });\n return () => this.off(arg0);\n } else if (handler) {\n const eventName = arg0;\n if (!this.__eventListeners[eventName]) {\n this.__eventListeners[eventName] = [];\n }\n this.__eventListeners[eventName].push(handler);\n return () => this.off(eventName, handler);\n } else {\n // noop\n return () => false;\n }\n }\n\n /**\n * Observes specified event **once**\n * @alias once\n * @param {string} eventName Event name (eg. 'after:render')\n * @param {EventRegistryObject} handlers key/value pairs (eg. {'after:render': handler, 'selection:cleared': handler})\n * @param {Function} handler Function that receives a notification when an event of the specified type occurs\n * @return {Function} disposer\n */\n once(\n eventName: K,\n handler: TEventCallback,\n ): VoidFunction;\n once(handlers: EventRegistryObject): VoidFunction;\n once(\n arg0: K | EventRegistryObject,\n handler?: TEventCallback,\n ): VoidFunction {\n if (typeof arg0 === 'object') {\n // one object with key/value pairs was passed\n const disposers: VoidFunction[] = [];\n Object.entries(arg0).forEach(([eventName, handler]) => {\n disposers.push(this.once(eventName as K, handler as TEventCallback));\n });\n return () => disposers.forEach((d) => d());\n } else if (handler) {\n const disposer = this.on(\n arg0,\n function onceHandler(this: Observable, ...args) {\n handler.call(this, ...args);\n disposer();\n },\n );\n return disposer;\n } else {\n // noop\n return () => false;\n }\n }\n\n /**\n * @private\n * @param {string} eventName\n * @param {Function} [handler]\n */\n private _removeEventListener(\n eventName: K,\n handler?: TEventCallback,\n ) {\n if (!this.__eventListeners[eventName]) {\n return;\n }\n\n if (handler) {\n const eventListener = this.__eventListeners[eventName];\n const index = eventListener.indexOf(handler);\n index > -1 && eventListener.splice(index, 1);\n } else {\n this.__eventListeners[eventName] = [];\n }\n }\n\n /**\n * Unsubscribe all event listeners for eventname.\n * Do not use this pattern. You could kill internal fabricJS events.\n * We know we should have protected events for internal flows, but we don't have yet\n * @deprecated\n * @param {string} eventName event name (eg. 'after:render')\n */\n off(eventName: K): void;\n /**\n * unsubscribe an event listener\n * @param {string} eventName event name (eg. 'after:render')\n * @param {TEventCallback} handler event listener to unsubscribe\n */\n off(eventName: K, handler: TEventCallback): void;\n /**\n * unsubscribe event listeners\n * @param handlers handlers key/value pairs (eg. {'after:render': handler, 'selection:cleared': handler})\n */\n off(handlers: EventRegistryObject): void;\n /**\n * unsubscribe all event listeners\n */\n off(): void;\n off(\n arg0?: K | EventRegistryObject,\n handler?: TEventCallback,\n ) {\n if (!this.__eventListeners) {\n return;\n }\n\n // remove all key/value pairs (event name -> event handler)\n if (typeof arg0 === 'undefined') {\n for (const eventName in this.__eventListeners) {\n this._removeEventListener(eventName);\n }\n }\n // one object with key/value pairs was passed\n else if (typeof arg0 === 'object') {\n Object.entries(arg0).forEach(([eventName, handler]) => {\n this._removeEventListener(eventName as K, handler as TEventCallback);\n });\n } else {\n this._removeEventListener(arg0, handler);\n }\n }\n\n /**\n * Fires event with an optional options object\n * @param {String} eventName Event name to fire\n * @param {Object} [options] Options object\n */\n fire(eventName: K, options?: EventSpec[K]) {\n if (!this.__eventListeners) {\n return;\n }\n\n const listenersForEvent = this.__eventListeners[eventName]?.concat();\n if (listenersForEvent) {\n for (let i = 0; i < listenersForEvent.length; i++) {\n listenersForEvent[i].call(this, options || {});\n }\n }\n }\n}\n","/**\n * Removes value from an array.\n * Presence of value (and its position in an array) is determined via `Array.prototype.indexOf`\n * @param {Array} array\n * @param {*} value\n * @return {Array} original array\n */\nexport const removeFromArray = (array: T[], value: T): T[] => {\n const idx = array.indexOf(value);\n if (idx !== -1) {\n array.splice(idx, 1);\n }\n return array;\n};\n","import type { TRadian } from '../../typedefs';\nimport { halfPI } from '../../constants';\n\n/**\n * Calculate the cos of an angle, avoiding returning floats for known results\n * This function is here just to avoid getting 0.999999999999999 when dealing\n * with numbers that are really 1 or 0.\n * @param {TRadian} angle the angle\n * @return {Number} the cosin value for angle.\n */\nexport const cos = (angle: TRadian): number => {\n if (angle === 0) {\n return 1;\n }\n const angleSlice = Math.abs(angle) / halfPI;\n switch (angleSlice) {\n case 1:\n case 3:\n return 0;\n case 2:\n return -1;\n }\n return Math.cos(angle);\n};\n","import type { TRadian } from '../../typedefs';\nimport { halfPI } from '../../constants';\n\n/**\n * Calculate the cos of an angle, avoiding returning floats for known results\n * This function is here just to avoid getting 0.999999999999999 when dealing\n * with numbers that are really 1 or 0.\n * @param {TRadian} angle the angle\n * @return {Number} the sin value for angle.\n */\nexport const sin = (angle: TRadian): number => {\n if (angle === 0) {\n return 0;\n }\n const angleSlice = angle / halfPI;\n const value = Math.sign(angle);\n switch (angleSlice) {\n case 1:\n return value;\n case 2:\n return 0;\n case 3:\n return -value;\n }\n return Math.sin(angle);\n};\n","import type { TMat2D, TRadian } from './typedefs';\nimport { cos } from './util/misc/cos';\nimport { sin } from './util/misc/sin';\n\nexport interface XY {\n x: number;\n y: number;\n}\n\n/**\n * Adaptation of work of Kevin Lindsey(kevin@kevlindev.com)\n */\nexport class Point implements XY {\n declare x: number;\n\n declare y: number;\n\n constructor();\n constructor(x: number, y: number);\n constructor(point?: XY);\n constructor(arg0: number | XY = 0, y = 0) {\n if (typeof arg0 === 'object') {\n this.x = arg0.x;\n this.y = arg0.y;\n } else {\n this.x = arg0;\n this.y = y;\n }\n }\n\n /**\n * Adds another point to this one and returns a new one with the sum\n * @param {XY} that\n * @return {Point} new Point instance with added values\n */\n add(that: XY): Point {\n return new Point(this.x + that.x, this.y + that.y);\n }\n\n /**\n * Adds another point to this one\n * @param {XY} that\n * @return {Point} thisArg\n * @chainable\n * @deprecated\n */\n addEquals(that: XY): Point {\n this.x += that.x;\n this.y += that.y;\n return this;\n }\n\n /**\n * Adds value to this point and returns a new one\n * @param {Number} scalar\n * @return {Point} new Point with added value\n */\n scalarAdd(scalar: number): Point {\n return new Point(this.x + scalar, this.y + scalar);\n }\n\n /**\n * Adds value to this point\n * @param {Number} scalar\n * @return {Point} thisArg\n * @chainable\n * @deprecated\n */\n scalarAddEquals(scalar: number): Point {\n this.x += scalar;\n this.y += scalar;\n return this;\n }\n\n /**\n * Subtracts another point from this point and returns a new one\n * @param {XY} that\n * @return {Point} new Point object with subtracted values\n */\n subtract(that: XY): Point {\n return new Point(this.x - that.x, this.y - that.y);\n }\n\n /**\n * Subtracts another point from this point\n * @param {XY} that\n * @return {Point} thisArg\n * @chainable\n * @deprecated\n */\n subtractEquals(that: XY): Point {\n this.x -= that.x;\n this.y -= that.y;\n return this;\n }\n\n /**\n * Subtracts value from this point and returns a new one\n * @param {Number} scalar\n * @return {Point}\n */\n scalarSubtract(scalar: number): Point {\n return new Point(this.x - scalar, this.y - scalar);\n }\n\n /**\n * Subtracts value from this point\n * @param {Number} scalar\n * @return {Point} thisArg\n * @chainable\n * @deprecated\n */\n scalarSubtractEquals(scalar: number): Point {\n this.x -= scalar;\n this.y -= scalar;\n return this;\n }\n\n /**\n * Multiplies this point by another value and returns a new one\n * @param {XY} that\n * @return {Point}\n */\n multiply(that: XY): Point {\n return new Point(this.x * that.x, this.y * that.y);\n }\n\n /**\n * Multiplies this point by a value and returns a new one\n * @param {Number} scalar\n * @return {Point}\n */\n scalarMultiply(scalar: number): Point {\n return new Point(this.x * scalar, this.y * scalar);\n }\n\n /**\n * Multiplies this point by a value\n * @param {Number} scalar\n * @return {Point} thisArg\n * @chainable\n * @deprecated\n */\n scalarMultiplyEquals(scalar: number): Point {\n this.x *= scalar;\n this.y *= scalar;\n return this;\n }\n\n /**\n * Divides this point by another and returns a new one\n * @param {XY} that\n * @return {Point}\n */\n divide(that: XY): Point {\n return new Point(this.x / that.x, this.y / that.y);\n }\n\n /**\n * Divides this point by a value and returns a new one\n * @param {Number} scalar\n * @return {Point}\n */\n scalarDivide(scalar: number): Point {\n return new Point(this.x / scalar, this.y / scalar);\n }\n\n /**\n * Divides this point by a value\n * @param {Number} scalar\n * @return {Point} thisArg\n * @chainable\n * @deprecated\n */\n scalarDivideEquals(scalar: number): Point {\n this.x /= scalar;\n this.y /= scalar;\n return this;\n }\n\n /**\n * Returns true if this point is equal to another one\n * @param {XY} that\n * @return {Boolean}\n */\n eq(that: XY): boolean {\n return this.x === that.x && this.y === that.y;\n }\n\n /**\n * Returns true if this point is less than another one\n * @param {XY} that\n * @return {Boolean}\n */\n lt(that: XY): boolean {\n return this.x < that.x && this.y < that.y;\n }\n\n /**\n * Returns true if this point is less than or equal to another one\n * @param {XY} that\n * @return {Boolean}\n */\n lte(that: XY): boolean {\n return this.x <= that.x && this.y <= that.y;\n }\n\n /**\n\n * Returns true if this point is greater another one\n * @param {XY} that\n * @return {Boolean}\n */\n gt(that: XY): boolean {\n return this.x > that.x && this.y > that.y;\n }\n\n /**\n * Returns true if this point is greater than or equal to another one\n * @param {XY} that\n * @return {Boolean}\n */\n gte(that: XY): boolean {\n return this.x >= that.x && this.y >= that.y;\n }\n\n /**\n * Returns new point which is the result of linear interpolation with this one and another one\n * @param {XY} that\n * @param {Number} t , position of interpolation, between 0 and 1 default 0.5\n * @return {Point}\n */\n lerp(that: XY, t = 0.5): Point {\n t = Math.max(Math.min(1, t), 0);\n return new Point(\n this.x + (that.x - this.x) * t,\n this.y + (that.y - this.y) * t,\n );\n }\n\n /**\n * Returns distance from this point and another one\n * @param {XY} that\n * @return {Number}\n */\n distanceFrom(that: XY): number {\n const dx = this.x - that.x,\n dy = this.y - that.y;\n return Math.sqrt(dx * dx + dy * dy);\n }\n\n /**\n * Returns the point between this point and another one\n * @param {XY} that\n * @return {Point}\n */\n midPointFrom(that: XY): Point {\n return this.lerp(that);\n }\n\n /**\n * Returns a new point which is the min of this and another one\n * @param {XY} that\n * @return {Point}\n */\n min(that: XY): Point {\n return new Point(Math.min(this.x, that.x), Math.min(this.y, that.y));\n }\n\n /**\n * Returns a new point which is the max of this and another one\n * @param {XY} that\n * @return {Point}\n */\n max(that: XY): Point {\n return new Point(Math.max(this.x, that.x), Math.max(this.y, that.y));\n }\n\n /**\n * Returns string representation of this point\n * @return {String}\n */\n toString(): string {\n return `${this.x},${this.y}`;\n }\n\n /**\n * Sets x/y of this point\n * @param {Number} x\n * @param {Number} y\n * @chainable\n */\n setXY(x: number, y: number) {\n this.x = x;\n this.y = y;\n return this;\n }\n\n /**\n * Sets x of this point\n * @param {Number} x\n * @chainable\n */\n setX(x: number) {\n this.x = x;\n return this;\n }\n\n /**\n * Sets y of this point\n * @param {Number} y\n * @chainable\n */\n setY(y: number) {\n this.y = y;\n return this;\n }\n\n /**\n * Sets x/y of this point from another point\n * @param {XY} that\n * @chainable\n */\n setFromPoint(that: XY) {\n this.x = that.x;\n this.y = that.y;\n return this;\n }\n\n /**\n * Swaps x/y of this point and another point\n * @param {XY} that\n */\n swap(that: XY) {\n const x = this.x,\n y = this.y;\n this.x = that.x;\n this.y = that.y;\n that.x = x;\n that.y = y;\n }\n\n /**\n * return a cloned instance of the point\n * @return {Point}\n */\n clone(): Point {\n return new Point(this.x, this.y);\n }\n\n /**\n * Rotates `point` around `origin` with `radians`\n * @param {XY} origin The origin of the rotation\n * @param {TRadian} radians The radians of the angle for the rotation\n * @return {Point} The new rotated point\n */\n rotate(radians: TRadian, origin: XY = ZERO): Point {\n // TODO benchmark and verify the add and subtract how much cost\n // and then in case early return if no origin is passed\n const sinus = sin(radians),\n cosinus = cos(radians);\n const p = this.subtract(origin);\n const rotated = new Point(\n p.x * cosinus - p.y * sinus,\n p.x * sinus + p.y * cosinus,\n );\n return rotated.add(origin);\n }\n\n /**\n * Apply transform t to point p\n * @param {TMat2D} t The transform\n * @param {Boolean} [ignoreOffset] Indicates that the offset should not be applied\n * @return {Point} The transformed point\n */\n transform(t: TMat2D, ignoreOffset = false): Point {\n return new Point(\n t[0] * this.x + t[2] * this.y + (ignoreOffset ? 0 : t[4]),\n t[1] * this.x + t[3] * this.y + (ignoreOffset ? 0 : t[5]),\n );\n }\n}\n\nexport const ZERO = new Point(0, 0);\n","import type { Constructor, TBBox } from './typedefs';\nimport { removeFromArray } from './util/internals/removeFromArray';\nimport { Point } from './Point';\nimport type { ActiveSelection } from './shapes/ActiveSelection';\nimport type { Group } from './shapes/Group';\nimport type { InteractiveFabricObject } from './shapes/Object/InteractiveObject';\nimport type { FabricObject } from './shapes/Object/FabricObject';\n\nexport const isCollection = (\n fabricObject?: FabricObject,\n): fabricObject is Group | ActiveSelection => {\n return !!fabricObject && Array.isArray((fabricObject as Group)._objects);\n};\n\nexport function createCollectionMixin(Base: TBase) {\n class Collection extends Base {\n /**\n * @type {FabricObject[]}\n * @TODO needs to end up in the constructor too\n */\n _objects: FabricObject[] = [];\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n _onObjectAdded(object: FabricObject) {\n // subclasses should override this method\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n _onObjectRemoved(object: FabricObject) {\n // subclasses should override this method\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n _onStackOrderChanged(object: FabricObject) {\n // subclasses should override this method\n }\n\n /**\n * Adds objects to collection\n * Objects should be instances of (or inherit from) FabricObject\n * @param {...FabricObject[]} objects to add\n * @returns {number} new array length\n */\n add(...objects: FabricObject[]): number {\n const size = this._objects.push(...objects);\n objects.forEach((object) => this._onObjectAdded(object));\n return size;\n }\n\n /**\n * Inserts an object into collection at specified index\n * @param {number} index Index to insert object at\n * @param {...FabricObject[]} objects Object(s) to insert\n * @returns {number} new array length\n */\n insertAt(index: number, ...objects: FabricObject[]) {\n this._objects.splice(index, 0, ...objects);\n objects.forEach((object) => this._onObjectAdded(object));\n return this._objects.length;\n }\n\n /**\n * Removes objects from a collection, then renders canvas (if `renderOnAddRemove` is not `false`)\n * @private\n * @param {...FabricObject[]} objects objects to remove\n * @returns {FabricObject[]} removed objects\n */\n remove(...objects: FabricObject[]) {\n const array = this._objects,\n removed: FabricObject[] = [];\n objects.forEach((object) => {\n const index = array.indexOf(object);\n // only call onObjectRemoved if an object was actually removed\n if (index !== -1) {\n array.splice(index, 1);\n removed.push(object);\n this._onObjectRemoved(object);\n }\n });\n return removed;\n }\n\n /**\n * Executes given function for each object in this group\n * A simple shortcut for getObjects().forEach, before es6 was more complicated,\n * now is just a shortcut.\n * @param {Function} callback\n * Callback invoked with current object as first argument,\n * index - as second and an array of all objects - as third.\n */\n forEachObject(\n callback: (\n object: FabricObject,\n index: number,\n array: FabricObject[],\n ) => any,\n ) {\n this.getObjects().forEach((object, index, objects) =>\n callback(object, index, objects),\n );\n }\n\n /**\n * Returns an array of children objects of this instance\n * @param {...String} [types] When specified, only objects of these types are returned\n * @return {Array}\n */\n getObjects(...types: string[]) {\n if (types.length === 0) {\n return [...this._objects];\n }\n return this._objects.filter((o) => o.isType(...types));\n }\n\n /**\n * Returns object at specified index\n * @param {Number} index\n * @return {Object} object at index\n */\n item(index: number) {\n return this._objects[index];\n }\n\n /**\n * Returns true if collection contains no objects\n * @return {Boolean} true if collection is empty\n */\n isEmpty() {\n return this._objects.length === 0;\n }\n\n /**\n * Returns a size of a collection (i.e: length of an array containing its objects)\n * @return {Number} Collection size\n */\n size() {\n return this._objects.length;\n }\n\n /**\n * Returns true if collection contains an object.\\\n * **Prefer using {@link FabricObject#isDescendantOf} for performance reasons**\n * instead of `a.contains(b)` use `b.isDescendantOf(a)`\n * @param {Object} object Object to check against\n * @param {Boolean} [deep=false] `true` to check all descendants, `false` to check only `_objects`\n * @return {Boolean} `true` if collection contains an object\n */\n contains(object: FabricObject, deep?: boolean): boolean {\n if (this._objects.includes(object)) {\n return true;\n } else if (deep) {\n return this._objects.some(\n (obj) =>\n obj instanceof Collection &&\n (obj as unknown as Collection).contains(object, true),\n );\n }\n return false;\n }\n\n /**\n * Returns number representation of a collection complexity\n * @return {Number} complexity\n */\n complexity() {\n return this._objects.reduce((memo, current) => {\n memo += current.complexity ? current.complexity() : 0;\n return memo;\n }, 0);\n }\n\n /**\n * Moves an object or the objects of a multiple selection\n * to the bottom of the stack of drawn objects\n * @param {fabric.Object} object Object to send to back\n * @returns {boolean} true if change occurred\n */\n sendObjectToBack(object: FabricObject) {\n if (!object || object === this._objects[0]) {\n return false;\n }\n removeFromArray(this._objects, object);\n this._objects.unshift(object);\n this._onStackOrderChanged(object);\n return true;\n }\n\n /**\n * Moves an object or the objects of a multiple selection\n * to the top of the stack of drawn objects\n * @param {fabric.Object} object Object to send\n * @returns {boolean} true if change occurred\n */\n bringObjectToFront(object: FabricObject) {\n if (!object || object === this._objects[this._objects.length - 1]) {\n return false;\n }\n removeFromArray(this._objects, object);\n this._objects.push(object);\n this._onStackOrderChanged(object);\n return true;\n }\n\n /**\n * Moves an object or a selection down in stack of drawn objects\n * An optional parameter, `intersecting` allows to move the object in behind\n * the first intersecting object. Where intersection is calculated with\n * bounding box. If no intersection is found, there will not be change in the\n * stack.\n * @param {fabric.Object} object Object to send\n * @param {boolean} [intersecting] If `true`, send object behind next lower intersecting object\n * @returns {boolean} true if change occurred\n */\n sendObjectBackwards(object: FabricObject, intersecting?: boolean) {\n if (!object) {\n return false;\n }\n const idx = this._objects.indexOf(object);\n if (idx !== 0) {\n // if object is not on the bottom of stack\n const newIdx = this.findNewLowerIndex(object, idx, intersecting);\n removeFromArray(this._objects, object);\n this._objects.splice(newIdx, 0, object);\n this._onStackOrderChanged(object);\n return true;\n }\n return false;\n }\n\n /**\n * Moves an object or a selection up in stack of drawn objects\n * An optional parameter, intersecting allows to move the object in front\n * of the first intersecting object. Where intersection is calculated with\n * bounding box. If no intersection is found, there will not be change in the\n * stack.\n * @param {fabric.Object} object Object to send\n * @param {boolean} [intersecting] If `true`, send object in front of next upper intersecting object\n * @returns {boolean} true if change occurred\n */\n bringObjectForward(object: FabricObject, intersecting?: boolean) {\n if (!object) {\n return false;\n }\n const idx = this._objects.indexOf(object);\n if (idx !== this._objects.length - 1) {\n // if object is not on top of stack (last item in an array)\n const newIdx = this.findNewUpperIndex(object, idx, intersecting);\n removeFromArray(this._objects, object);\n this._objects.splice(newIdx, 0, object);\n this._onStackOrderChanged(object);\n return true;\n }\n return false;\n }\n\n /**\n * Moves an object to specified level in stack of drawn objects\n * @param {fabric.Object} object Object to send\n * @param {number} index Position to move to\n * @returns {boolean} true if change occurred\n */\n moveObjectTo(object: FabricObject, index: number) {\n if (object === this._objects[index]) {\n return false;\n }\n removeFromArray(this._objects, object);\n this._objects.splice(index, 0, object);\n this._onStackOrderChanged(object);\n return true;\n }\n\n findNewLowerIndex(\n object: FabricObject,\n idx: number,\n intersecting?: boolean,\n ) {\n let newIdx;\n\n if (intersecting) {\n newIdx = idx;\n // traverse down the stack looking for the nearest intersecting object\n for (let i = idx - 1; i >= 0; --i) {\n if (object.isOverlapping(this._objects[i])) {\n newIdx = i;\n break;\n }\n }\n } else {\n newIdx = idx - 1;\n }\n\n return newIdx;\n }\n\n findNewUpperIndex(\n object: FabricObject,\n idx: number,\n intersecting?: boolean,\n ) {\n let newIdx;\n\n if (intersecting) {\n newIdx = idx;\n // traverse up the stack looking for the nearest intersecting object\n for (let i = idx + 1; i < this._objects.length; ++i) {\n if (object.isOverlapping(this._objects[i])) {\n newIdx = i;\n break;\n }\n }\n } else {\n newIdx = idx + 1;\n }\n\n return newIdx;\n }\n\n /**\n * Given a bounding box, return all the objects of the collection that are contained in the bounding box.\n * If `includeIntersecting` is true, return also the objects that intersect the bounding box as well.\n * This is meant to work with selection. Is not a generic method.\n * @param {TBBox} bbox a bounding box in scene coordinates\n * @param {{ includeIntersecting?: boolean }} options an object with includeIntersecting\n * @returns array of objects contained in the bounding box, ordered from top to bottom stacking wise\n */\n collectObjects(\n { left, top, width, height }: TBBox,\n { includeIntersecting = true }: { includeIntersecting?: boolean } = {},\n ) {\n const objects: InteractiveFabricObject[] = [],\n tl = new Point(left, top),\n br = tl.add(new Point(width, height));\n\n // we iterate reverse order to collect top first in case of click.\n for (let i = this._objects.length - 1; i >= 0; i--) {\n const object = this._objects[i] as unknown as InteractiveFabricObject;\n if (\n object.selectable &&\n object.visible &&\n ((includeIntersecting && object.intersectsWithRect(tl, br)) ||\n object.isContainedWithinRect(tl, br) ||\n (includeIntersecting && object.containsPoint(tl)) ||\n (includeIntersecting && object.containsPoint(br)))\n ) {\n objects.push(object);\n }\n }\n\n return objects;\n }\n }\n\n // https://github.com/microsoft/TypeScript/issues/32080\n return Collection;\n}\n","import { Observable } from './Observable';\n\nexport class CommonMethods extends Observable {\n /**\n * Sets object's properties from options, for initialization only\n * @protected\n * @param {Object} [options] Options object\n */\n protected _setOptions(options: any = {}) {\n for (const prop in options) {\n this.set(prop, options[prop]);\n }\n }\n\n /**\n * @private\n */\n _setObject(obj: Record) {\n for (const prop in obj) {\n this._set(prop, obj[prop]);\n }\n }\n\n /**\n * Sets property to a given value. When changing position/dimension -related properties (left, top, scale, angle, etc.) `set` does not update position of object's borders/controls. If you need to update those, call `setCoords()`.\n * @param {String|Object} key Property name or object (if object, iterate over the object properties)\n * @param {Object|Function} value Property value (if function, the value is passed into it and its return value is used as a new one)\n */\n set(key: string | Record, value?: any) {\n if (typeof key === 'object') {\n this._setObject(key);\n } else {\n this._set(key, value);\n }\n return this;\n }\n\n _set(key: string, value: any) {\n this[key as keyof this] = value;\n }\n\n /**\n * Toggles specified property from `true` to `false` or from `false` to `true`\n * @param {String} property Property to toggle\n */\n toggle(property: string) {\n const value = this.get(property);\n if (typeof value === 'boolean') {\n this.set(property, !value);\n }\n return this;\n }\n\n /**\n * Basic getter\n * @param {String} property Property name\n * @return {*} value of a property\n */\n get(property: string): any {\n return this[property as keyof this];\n }\n}\n","import { getFabricWindow } from '../../env';\n\nexport function requestAnimFrame(callback: FrameRequestCallback): number {\n return getFabricWindow().requestAnimationFrame(callback);\n}\n\nexport function cancelAnimFrame(handle: number): void {\n return getFabricWindow().cancelAnimationFrame(handle);\n}\n","let id = 0;\n\nexport const uid = () => id++;\n","import { getFabricDocument } from '../../env';\nimport type { ImageFormat, TSize } from '../../typedefs';\nimport { FabricError } from '../internals/console';\n/**\n * Creates canvas element\n * @return {CanvasElement} initialized canvas element\n */\nexport const createCanvasElement = (): HTMLCanvasElement => {\n const element = getFabricDocument().createElement('canvas');\n if (!element || typeof element.getContext === 'undefined') {\n throw new FabricError('Failed to create `canvas` element');\n }\n return element;\n};\n\n/**\n * Creates image element (works on client and node)\n * @return {HTMLImageElement} HTML image element\n */\nexport const createImage = (): HTMLImageElement =>\n getFabricDocument().createElement('img');\n\n/**\n * Creates a canvas element that is a copy of another and is also painted\n * @param {CanvasElement} canvas to copy size and content of\n * @return {CanvasElement} initialized canvas element\n */\nexport const copyCanvasElement = (\n canvas: HTMLCanvasElement,\n): HTMLCanvasElement => {\n const newCanvas = createCanvasElementFor(canvas);\n newCanvas.getContext('2d')?.drawImage(canvas, 0, 0);\n return newCanvas;\n};\n\n/**\n * Creates a canvas element as big as another\n * @param {CanvasElement} canvas to copy size and content of\n * @return {CanvasElement} initialized canvas element\n */\nexport const createCanvasElementFor = (\n canvas: HTMLCanvasElement | ImageData | HTMLImageElement | TSize,\n): HTMLCanvasElement => {\n const newCanvas = createCanvasElement();\n newCanvas.width = canvas.width;\n newCanvas.height = canvas.height;\n return newCanvas;\n};\n\n/**\n * since 2.6.0 moved from canvas instance to utility.\n * possibly useless\n * @param {CanvasElement} canvasEl to copy size and content of\n * @param {String} format 'jpeg' or 'png', in some browsers 'webp' is ok too\n * @param {number} quality <= 1 and > 0\n * @return {String} data url\n */\nexport const toDataURL = (\n canvasEl: HTMLCanvasElement,\n format: ImageFormat,\n quality: number,\n) => canvasEl.toDataURL(`image/${format}`, quality);\n\nexport const isHTMLCanvas = (\n canvas?: HTMLCanvasElement | string,\n): canvas is HTMLCanvasElement => {\n return !!canvas && (canvas as HTMLCanvasElement).getContext !== undefined;\n};\n\nexport const toBlob = (\n canvasEl: HTMLCanvasElement,\n format?: ImageFormat,\n quality?: number,\n): Promise =>\n new Promise((resolve, _) => {\n canvasEl.toBlob(resolve, `image/${format}`, quality);\n });\n","import type { TRadian, TDegree } from '../../typedefs';\nimport { PiBy180 } from '../../constants';\n\n/**\n * Transforms degrees to radians.\n * @param {TDegree} degrees value in degrees\n * @return {TRadian} value in radians\n */\nexport const degreesToRadians = (degrees: TDegree): TRadian =>\n (degrees * PiBy180) as TRadian;\n\n/**\n * Transforms radians to degrees.\n * @param {TRadian} radians value in radians\n * @return {TDegree} value in degrees\n */\nexport const radiansToDegrees = (radians: TRadian): TDegree =>\n (radians / PiBy180) as TDegree;\n","import { iMatrix } from '../../constants';\nimport type { XY } from '../../Point';\nimport { Point } from '../../Point';\nimport type { TDegree, TRadian, TMat2D } from '../../typedefs';\nimport { cos } from './cos';\nimport { degreesToRadians, radiansToDegrees } from './radiansDegreesConversion';\nimport { sin } from './sin';\n\nexport type TRotateMatrixArgs = {\n angle?: TDegree;\n};\n\nexport type TTranslateMatrixArgs = {\n translateX?: number;\n translateY?: number;\n};\n\nexport type TScaleMatrixArgs = {\n scaleX?: number;\n scaleY?: number;\n flipX?: boolean;\n flipY?: boolean;\n skewX?: TDegree;\n skewY?: TDegree;\n};\n\nexport type TComposeMatrixArgs = TTranslateMatrixArgs &\n TRotateMatrixArgs &\n TScaleMatrixArgs;\n\nexport type TQrDecomposeOut = Required<\n Omit\n>;\n\nexport const isIdentityMatrix = (mat: TMat2D) =>\n mat.every((value, index) => value === iMatrix[index]);\n\n/**\n * Apply transform t to point p\n * @deprecated use {@link Point#transform}\n * @param {Point | XY} p The point to transform\n * @param {Array} t The transform\n * @param {Boolean} [ignoreOffset] Indicates that the offset should not be applied\n * @return {Point} The transformed point\n */\nexport const transformPoint = (\n p: XY,\n t: TMat2D,\n ignoreOffset?: boolean,\n): Point => new Point(p).transform(t, ignoreOffset);\n\n/**\n * Invert transformation t\n * @param {Array} t The transform\n * @return {Array} The inverted transform\n */\nexport const invertTransform = (t: TMat2D): TMat2D => {\n const a = 1 / (t[0] * t[3] - t[1] * t[2]),\n r = [a * t[3], -a * t[1], -a * t[2], a * t[0], 0, 0] as TMat2D,\n { x, y } = new Point(t[4], t[5]).transform(r, true);\n r[4] = -x;\n r[5] = -y;\n return r;\n};\n\n/**\n * Multiply matrix A by matrix B to nest transformations\n * @param {TMat2D} a First transformMatrix\n * @param {TMat2D} b Second transformMatrix\n * @param {Boolean} is2x2 flag to multiply matrices as 2x2 matrices\n * @return {TMat2D} The product of the two transform matrices\n */\nexport const multiplyTransformMatrices = (\n a: TMat2D,\n b: TMat2D,\n is2x2?: boolean,\n): TMat2D =>\n [\n a[0] * b[0] + a[2] * b[1],\n a[1] * b[0] + a[3] * b[1],\n a[0] * b[2] + a[2] * b[3],\n a[1] * b[2] + a[3] * b[3],\n is2x2 ? 0 : a[0] * b[4] + a[2] * b[5] + a[4],\n is2x2 ? 0 : a[1] * b[4] + a[3] * b[5] + a[5],\n ] as TMat2D;\n\n/**\n * Multiplies {@link matrices} such that a matrix defines the plane for the rest of the matrices **after** it\n *\n * `multiplyTransformMatrixArray([A, B, C, D])` is equivalent to `A(B(C(D)))`\n *\n * @param matrices an array of matrices\n * @param [is2x2] flag to multiply matrices as 2x2 matrices\n * @returns the multiplication product\n */\nexport const multiplyTransformMatrixArray = (\n matrices: (TMat2D | undefined | null | false)[],\n is2x2?: boolean,\n) =>\n matrices.reduceRight(\n (product: TMat2D, curr) =>\n curr && product\n ? multiplyTransformMatrices(curr, product, is2x2)\n : curr || product,\n undefined as unknown as TMat2D,\n ) || iMatrix.concat();\n\nexport const calcPlaneRotation = ([a, b]: TMat2D) =>\n Math.atan2(b, a) as TRadian;\n\n/**\n * Decomposes standard 2x3 matrix into transform components\n * @param {TMat2D} a transformMatrix\n * @return {Object} Components of transform\n */\nexport const qrDecompose = (a: TMat2D): TQrDecomposeOut => {\n const angle = calcPlaneRotation(a),\n denom = Math.pow(a[0], 2) + Math.pow(a[1], 2),\n scaleX = Math.sqrt(denom),\n scaleY = (a[0] * a[3] - a[2] * a[1]) / scaleX,\n skewX = Math.atan2(a[0] * a[2] + a[1] * a[3], denom);\n return {\n angle: radiansToDegrees(angle),\n scaleX,\n scaleY,\n skewX: radiansToDegrees(skewX),\n skewY: 0 as TDegree,\n translateX: a[4] || 0,\n translateY: a[5] || 0,\n };\n};\n\n/**\n * Generate a translation matrix\n *\n * A translation matrix in the form of\n * [ 1 0 x ]\n * [ 0 1 y ]\n * [ 0 0 1 ]\n *\n * See @link https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/transform#translate for more details\n *\n * @param {number} x translation on X axis\n * @param {number} [y] translation on Y axis\n * @returns {TMat2D} matrix\n */\nexport const createTranslateMatrix = (x: number, y = 0): TMat2D => [\n 1,\n 0,\n 0,\n 1,\n x,\n y,\n];\n\n/**\n * Generate a rotation matrix around around a point (x,y), defaulting to (0,0)\n *\n * A matrix in the form of\n * [cos(a) -sin(a) -x*cos(a)+y*sin(a)+x]\n * [sin(a) cos(a) -x*sin(a)-y*cos(a)+y]\n * [0 0 1 ]\n *\n *\n * @param {TDegree} angle rotation in degrees\n * @param {XY} [pivotPoint] pivot point to rotate around\n * @returns {TMat2D} matrix\n */\nexport function createRotateMatrix(\n { angle = 0 }: TRotateMatrixArgs = {},\n { x = 0, y = 0 }: Partial = {},\n): TMat2D {\n const angleRadiant = degreesToRadians(angle),\n cosValue = cos(angleRadiant),\n sinValue = sin(angleRadiant);\n return [\n cosValue,\n sinValue,\n -sinValue,\n cosValue,\n x ? x - (cosValue * x - sinValue * y) : 0,\n y ? y - (sinValue * x + cosValue * y) : 0,\n ];\n}\n\n/**\n * Generate a scale matrix around the point (0,0)\n *\n * A matrix in the form of\n * [x 0 0]\n * [0 y 0]\n * [0 0 1]\n *\n * @link https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/transform#scale\n *\n * @param {number} x scale on X axis\n * @param {number} [y] scale on Y axis\n * @returns {TMat2D} matrix\n */\nexport const createScaleMatrix = (x: number, y: number = x): TMat2D => [\n x,\n 0,\n 0,\n y,\n 0,\n 0,\n];\n\nexport const angleToSkew = (angle: TDegree) =>\n Math.tan(degreesToRadians(angle));\n\nexport const skewToAngle = (value: TRadian) =>\n radiansToDegrees(Math.atan(value));\n\n/**\n * Generate a skew matrix for the X axis\n *\n * A matrix in the form of\n * [1 x 0]\n * [0 1 0]\n * [0 0 1]\n *\n * @link https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/transform#skewx\n *\n * @param {TDegree} skewValue translation on X axis\n * @returns {TMat2D} matrix\n */\nexport const createSkewXMatrix = (skewValue: TDegree): TMat2D => [\n 1,\n 0,\n angleToSkew(skewValue),\n 1,\n 0,\n 0,\n];\n\n/**\n * Generate a skew matrix for the Y axis\n *\n * A matrix in the form of\n * [1 0 0]\n * [y 1 0]\n * [0 0 1]\n *\n * @link https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/transform#skewy\n *\n * @param {TDegree} skewValue translation on Y axis\n * @returns {TMat2D} matrix\n */\nexport const createSkewYMatrix = (skewValue: TDegree): TMat2D => [\n 1,\n angleToSkew(skewValue),\n 0,\n 1,\n 0,\n 0,\n];\n\n/**\n * Returns a transform matrix starting from an object of the same kind of\n * the one returned from qrDecompose, useful also if you want to calculate some\n * transformations from an object that is not enlived yet.\n * is called DimensionsTransformMatrix because those properties are the one that influence\n * the size of the resulting box of the object.\n * @param {Object} options\n * @param {Number} [options.scaleX]\n * @param {Number} [options.scaleY]\n * @param {Boolean} [options.flipX]\n * @param {Boolean} [options.flipY]\n * @param {Number} [options.skewX]\n * @param {Number} [options.skewY]\n * @return {Number[]} transform matrix\n */\nexport const calcDimensionsMatrix = ({\n scaleX = 1,\n scaleY = 1,\n flipX = false,\n flipY = false,\n skewX = 0 as TDegree,\n skewY = 0 as TDegree,\n}: TScaleMatrixArgs) => {\n let matrix = createScaleMatrix(\n flipX ? -scaleX : scaleX,\n flipY ? -scaleY : scaleY,\n );\n if (skewX) {\n matrix = multiplyTransformMatrices(matrix, createSkewXMatrix(skewX), true);\n }\n if (skewY) {\n matrix = multiplyTransformMatrices(matrix, createSkewYMatrix(skewY), true);\n }\n return matrix;\n};\n\n/**\n * Returns a transform matrix starting from an object of the same kind of\n * the one returned from qrDecompose, useful also if you want to calculate some\n * transformations from an object that is not enlived yet\n * Before changing this function look at: src/benchmarks/calcTransformMatrix.mjs\n * @param {Object} options\n * @param {Number} [options.angle]\n * @param {Number} [options.scaleX]\n * @param {Number} [options.scaleY]\n * @param {Boolean} [options.flipX]\n * @param {Boolean} [options.flipY]\n * @param {Number} [options.skewX]\n * @param {Number} [options.skewY]\n * @param {Number} [options.translateX]\n * @param {Number} [options.translateY]\n * @return {Number[]} transform matrix\n */\nexport const composeMatrix = (options: TComposeMatrixArgs): TMat2D => {\n const { translateX = 0, translateY = 0, angle = 0 as TDegree } = options;\n let matrix = createTranslateMatrix(translateX, translateY);\n if (angle) {\n matrix = multiplyTransformMatrices(matrix, createRotateMatrix({ angle }));\n }\n const scaleMatrix = calcDimensionsMatrix(options);\n if (!isIdentityMatrix(scaleMatrix)) {\n matrix = multiplyTransformMatrices(matrix, scaleMatrix);\n }\n return matrix;\n};\n","import { noop } from '../../constants';\nimport type { FabricObject } from '../../shapes/Object/FabricObject';\nimport type {\n Abortable,\n Constructor,\n TCrossOrigin,\n TFiller,\n} from '../../typedefs';\nimport { createImage } from './dom';\nimport { classRegistry } from '../../ClassRegistry';\nimport type { BaseFilter } from '../../filters/BaseFilter';\nimport type { FabricObject as BaseFabricObject } from '../../shapes/Object/Object';\nimport { FabricError, SignalAbortedError } from '../internals/console';\nimport type { Shadow } from '../../Shadow';\n\nexport type LoadImageOptions = Abortable & {\n /**\n * cors value for the image loading, default to anonymous\n */\n crossOrigin?: TCrossOrigin;\n};\n\n/**\n * Loads image element from given url and resolve it, or catch.\n * @param {String} url URL representing an image\n * @param {LoadImageOptions} [options] image loading options\n * @returns {Promise} the loaded image.\n */\nexport const loadImage = (\n url: string,\n { signal, crossOrigin = null }: LoadImageOptions = {},\n) =>\n new Promise(function (resolve, reject) {\n if (signal && signal.aborted) {\n return reject(new SignalAbortedError('loadImage'));\n }\n const img = createImage();\n let abort: EventListenerOrEventListenerObject;\n if (signal) {\n abort = function (err: Event) {\n img.src = '';\n reject(err);\n };\n signal.addEventListener('abort', abort, { once: true });\n }\n const done = function () {\n img.onload = img.onerror = null;\n abort && signal?.removeEventListener('abort', abort);\n resolve(img);\n };\n if (!url) {\n done();\n return;\n }\n img.onload = done;\n img.onerror = function () {\n abort && signal?.removeEventListener('abort', abort);\n reject(new FabricError(`Error loading ${img.src}`));\n };\n crossOrigin && (img.crossOrigin = crossOrigin);\n img.src = url;\n });\n\nexport type EnlivenObjectOptions = Abortable & {\n /**\n * Method for further parsing of object elements,\n * called after each fabric object created.\n */\n reviver?: <\n T extends\n | BaseFabricObject\n | FabricObject\n | BaseFilter\n | Shadow\n | TFiller,\n >(\n serializedObj: Record,\n instance: T,\n ) => void;\n};\n\n/**\n * @TODO type this correctly.\n * Creates corresponding fabric instances from their object representations\n * @param {Object[]} objects Objects to enliven\n * @param {EnlivenObjectOptions} [options]\n * @param {(serializedObj: object, instance: FabricObject) => any} [options.reviver] Method for further parsing of object elements,\n * called after each fabric object created.\n * @param {AbortSignal} [options.signal] handle aborting, see https://developer.mozilla.org/en-US/docs/Web/API/AbortController/signal\n * @returns {Promise}\n */\nexport const enlivenObjects = <\n T extends\n | BaseFabricObject\n | FabricObject\n | BaseFilter\n | Shadow\n | TFiller,\n>(\n objects: any[],\n { signal, reviver = noop }: EnlivenObjectOptions = {},\n) =>\n new Promise((resolve, reject) => {\n const instances: T[] = [];\n signal && signal.addEventListener('abort', reject, { once: true });\n Promise.all(\n objects.map((obj) =>\n classRegistry\n .getClass<\n Constructor & {\n fromObject(options: any, context: Abortable): Promise;\n }\n >(obj.type)\n .fromObject(obj, { signal })\n .then((fabricInstance) => {\n reviver(obj, fabricInstance);\n instances.push(fabricInstance);\n return fabricInstance;\n }),\n ),\n )\n .then(resolve)\n .catch((error) => {\n // cleanup\n instances.forEach((instance) => {\n (instance as FabricObject).dispose &&\n (instance as FabricObject).dispose();\n });\n reject(error);\n })\n .finally(() => {\n signal && signal.removeEventListener('abort', reject);\n });\n });\n\n/**\n * Creates corresponding fabric instances residing in an object, e.g. `clipPath`\n * @param {Object} object with properties to enlive ( fill, stroke, clipPath, path )\n * @param {object} [options]\n * @param {AbortSignal} [options.signal] handle aborting, see https://developer.mozilla.org/en-US/docs/Web/API/AbortController/signal\n * @returns {Promise>} the input object with enlived values\n */\nexport const enlivenObjectEnlivables = <\n R = Record,\n>(\n serializedObject: any,\n { signal }: Abortable = {},\n) =>\n new Promise((resolve, reject) => {\n const instances: (FabricObject | TFiller | Shadow)[] = [];\n signal && signal.addEventListener('abort', reject, { once: true });\n // enlive every possible property\n const promises = Object.values(serializedObject).map((value: any) => {\n if (!value) {\n return value;\n }\n /**\n * clipPath or shadow or gradient or text on a path or a pattern,\n * or the backgroundImage or overlayImage of canvas\n * If we have a type and there is a classe registered for it, we enlive it.\n * If there is no class registered for it we return the value as is\n * */\n if (value.type && classRegistry.has(value.type)) {\n return enlivenObjects([value], {\n signal,\n }).then(([enlived]) => {\n instances.push(enlived);\n return enlived;\n });\n }\n return value;\n });\n const keys = Object.keys(serializedObject);\n Promise.all(promises)\n .then((enlived) => {\n return enlived.reduce((acc, instance, index) => {\n acc[keys[index]] = instance;\n return acc;\n }, {});\n })\n .then(resolve)\n .catch((error) => {\n // cleanup\n instances.forEach((instance: any) => {\n instance.dispose && instance.dispose();\n });\n reject(error);\n })\n .finally(() => {\n signal && signal.removeEventListener('abort', reject);\n });\n });\n","/**\n * Populates an object with properties of another object\n * @param {Object} source Source object\n * @param {string[]} properties Properties names to include\n * @returns object populated with the picked keys\n */\nexport const pick = >(\n source: T,\n keys: (keyof T)[] = [],\n) => {\n return keys.reduce((o, key) => {\n if (key in source) {\n o[key] = source[key];\n }\n return o;\n }, {} as Partial);\n};\n\nexport const pickBy = >(\n source: T,\n predicate: (value: T[K], key: K, collection: T) => boolean,\n) => {\n return (Object.keys(source) as (keyof T)[]).reduce((o, key) => {\n if (predicate(source[key], key, source)) {\n o[key] = source[key];\n }\n return o;\n }, {} as Partial);\n};\n","/**\n * A wrapper around Number#toFixed, which contrary to native method returns number, not string.\n * @param {number|string} number number to operate on\n * @param {number} fractionDigits number of fraction digits to \"leave\"\n * @return {number}\n */\nexport const toFixed = (number: number | string, fractionDigits: number) =>\n parseFloat(Number(number).toFixed(fractionDigits));\n","import type { TMat2D } from '../../typedefs';\nimport { toFixed } from './toFixed';\nimport { config } from '../../config';\n\n/**\n * given an array of 6 number returns something like `\"matrix(...numbers)\"`\n * @param {TMat2D} transform an array with 6 numbers\n * @return {String} transform matrix for svg\n */\nexport const matrixToSVG = (transform: TMat2D) =>\n 'matrix(' +\n transform\n .map((value) => toFixed(value, config.NUM_FRACTION_DIGITS))\n .join(' ') +\n ')';\n","import type { FabricObject } from '../shapes/Object/Object';\nimport type { TFiller } from '../typedefs';\nimport type { FabricText } from '../shapes/Text/Text';\nimport type { Pattern } from '../Pattern';\nimport type { Path } from '../shapes/Path';\nimport type { ActiveSelection } from '../shapes/ActiveSelection';\n\nexport const isFiller = (\n filler: TFiller | string | null,\n): filler is TFiller => {\n return !!filler && (filler as TFiller).toLive !== undefined;\n};\n\nexport const isSerializableFiller = (\n filler: TFiller | string | null,\n): filler is TFiller => {\n return !!filler && typeof (filler as TFiller).toObject === 'function';\n};\n\nexport const isPattern = (filler: TFiller): filler is Pattern => {\n return (\n !!filler && (filler as Pattern).offsetX !== undefined && 'source' in filler\n );\n};\n\nexport const isTextObject = (\n fabricObject?: FabricObject,\n): fabricObject is FabricText => {\n return (\n !!fabricObject &&\n typeof (fabricObject as FabricText)._renderText === 'function'\n );\n};\n\nexport const isPath = (fabricObject?: FabricObject): fabricObject is Path => {\n // we could use instanceof but that would mean pulling in Text code for a simple check\n // @todo discuss what to do and how to do\n return (\n !!fabricObject &&\n typeof (fabricObject as Path)._renderPathCommands === 'function'\n );\n};\n\nexport const isActiveSelection = (\n fabricObject?: FabricObject,\n): fabricObject is ActiveSelection =>\n !!fabricObject && 'multiSelectionStacking' in fabricObject;\n","/**\n * Returns element scroll offsets\n * @param {HTMLElement} element Element to operate on\n * @return {Object} Object with left/top values\n */\nexport function getScrollLeftTop(element: HTMLElement | null) {\n const doc = element && getDocumentFromElement(element);\n let left = 0,\n top = 0;\n if (!element || !doc) {\n return { left, top };\n }\n let elementLoop: HTMLElement | Document | ShadowRoot = element;\n const docElement = doc.documentElement,\n body = doc.body || {\n scrollLeft: 0,\n scrollTop: 0,\n };\n // While loop checks (and then sets element to) .parentNode OR .host\n // to account for ShadowDOM. We still want to traverse up out of ShadowDOM,\n // but the .parentNode of a root ShadowDOM node will always be null, instead\n // it should be accessed through .host. See http://stackoverflow.com/a/24765528/4383938\n while (\n elementLoop &&\n (elementLoop.parentNode || (elementLoop as unknown as ShadowRoot).host)\n ) {\n elementLoop = (elementLoop.parentNode ||\n (elementLoop as unknown as ShadowRoot).host) as\n | HTMLElement\n | Document\n | ShadowRoot;\n if (elementLoop === doc) {\n left = body.scrollLeft || docElement.scrollLeft || 0;\n top = body.scrollTop || docElement.scrollTop || 0;\n } else {\n left += (elementLoop as HTMLElement).scrollLeft || 0;\n top += (elementLoop as HTMLElement).scrollTop || 0;\n }\n\n if (\n elementLoop.nodeType === 1 &&\n (elementLoop as HTMLElement).style.position === 'fixed'\n ) {\n break;\n }\n }\n\n return { left, top };\n}\n\nexport const getDocumentFromElement = (el: HTMLElement) =>\n el.ownerDocument || null;\n\nexport const getWindowFromElement = (el: HTMLElement) =>\n el.ownerDocument?.defaultView || null;\n","import { NONE } from '../../constants';\nimport type { TSize } from '../../typedefs';\nimport {\n getDocumentFromElement,\n getWindowFromElement,\n getScrollLeftTop,\n} from '../../util/dom_misc';\n\nexport const setCanvasDimensions = (\n el: HTMLCanvasElement,\n ctx: CanvasRenderingContext2D,\n { width, height }: TSize,\n retinaScaling = 1,\n) => {\n el.width = width;\n el.height = height;\n if (retinaScaling > 1) {\n el.setAttribute('width', (width * retinaScaling).toString());\n el.setAttribute('height', (height * retinaScaling).toString());\n ctx.scale(retinaScaling, retinaScaling);\n }\n};\n\nexport type CSSDimensions = {\n width: number | string;\n height: number | string;\n};\n\nexport const setCSSDimensions = (\n el: HTMLElement,\n { width, height }: Partial,\n) => {\n width && (el.style.width = typeof width === 'number' ? `${width}px` : width);\n height &&\n (el.style.height = typeof height === 'number' ? `${height}px` : height);\n};\n\n/**\n * Returns offset for a given element\n * @param {HTMLElement} element Element to get offset for\n * @return {Object} Object with \"left\" and \"top\" properties\n */\nexport function getElementOffset(element: HTMLElement) {\n const doc = element && getDocumentFromElement(element),\n offset = { left: 0, top: 0 };\n\n if (!doc) {\n return offset;\n }\n const elemStyle: CSSStyleDeclaration =\n getWindowFromElement(element)?.getComputedStyle(element, null) ||\n ({} as CSSStyleDeclaration);\n offset.left += parseInt(elemStyle.borderLeftWidth, 10) || 0;\n offset.top += parseInt(elemStyle.borderTopWidth, 10) || 0;\n offset.left += parseInt(elemStyle.paddingLeft, 10) || 0;\n offset.top += parseInt(elemStyle.paddingTop, 10) || 0;\n\n let box = { left: 0, top: 0 };\n\n const docElem = doc.documentElement;\n if (typeof element.getBoundingClientRect !== 'undefined') {\n box = element.getBoundingClientRect();\n }\n\n const scrollLeftTop = getScrollLeftTop(element);\n\n return {\n left:\n box.left + scrollLeftTop.left - (docElem.clientLeft || 0) + offset.left,\n top: box.top + scrollLeftTop.top - (docElem.clientTop || 0) + offset.top,\n };\n}\n\n/**\n * Makes element unselectable\n * @param {HTMLElement} element Element to make unselectable\n * @return {HTMLElement} Element that was passed in\n */\nexport function makeElementUnselectable(element: HTMLElement) {\n if (typeof element.onselectstart !== 'undefined') {\n element.onselectstart = () => false;\n }\n element.style.userSelect = NONE;\n return element;\n}\n","import { getEnv, getFabricDocument } from '../../env';\nimport type { TSize } from '../../typedefs';\nimport type { CSSDimensions } from './util';\nimport { setCSSDimensions, getElementOffset } from './util';\nimport { createCanvasElement, isHTMLCanvas } from '../../util/misc/dom';\nimport { setCanvasDimensions } from './util';\nimport { FabricError } from '../../util/internals/console';\n\nexport type CanvasItem = {\n el: HTMLCanvasElement;\n ctx: CanvasRenderingContext2D;\n};\n\nexport class StaticCanvasDOMManager {\n /**\n * Keeps a copy of the canvas style before setting retina scaling and other potions\n * in order to return it to original state on dispose\n * @type string\n */\n private _originalCanvasStyle?: string;\n\n lower: CanvasItem;\n\n constructor(arg0?: string | HTMLCanvasElement) {\n const el = this.createLowerCanvas(arg0);\n this.lower = { el, ctx: el.getContext('2d')! };\n }\n\n protected createLowerCanvas(arg0?: HTMLCanvasElement | string) {\n // canvasEl === 'HTMLCanvasElement' does not work on jsdom/node\n const el = isHTMLCanvas(arg0)\n ? arg0\n : (arg0 &&\n (getFabricDocument().getElementById(arg0) as HTMLCanvasElement)) ||\n createCanvasElement();\n if (el.hasAttribute('data-fabric')) {\n throw new FabricError(\n 'Trying to initialize a canvas that has already been initialized. Did you forget to dispose the canvas?',\n );\n }\n this._originalCanvasStyle = el.style.cssText;\n el.setAttribute('data-fabric', 'main');\n el.classList.add('lower-canvas');\n return el;\n }\n\n cleanupDOM({ width, height }: TSize) {\n const { el } = this.lower;\n // restore canvas style and attributes\n el.classList.remove('lower-canvas');\n el.removeAttribute('data-fabric');\n // restore canvas size to original size in case retina scaling was applied\n el.setAttribute('width', `${width}`);\n el.setAttribute('height', `${height}`);\n el.style.cssText = this._originalCanvasStyle || '';\n this._originalCanvasStyle = undefined;\n }\n\n setDimensions(size: TSize, retinaScaling: number) {\n const { el, ctx } = this.lower;\n setCanvasDimensions(el, ctx, size, retinaScaling);\n }\n\n setCSSDimensions(size: Partial) {\n setCSSDimensions(this.lower.el, size);\n }\n\n /**\n * Calculates canvas element offset relative to the document\n */\n calcOffset() {\n return getElementOffset(this.lower.el);\n }\n\n dispose() {\n getEnv().dispose(this.lower.el);\n // @ts-expect-error disposing\n delete this.lower;\n }\n}\n","import { iMatrix } from '../constants';\nimport type { FabricObject } from '../shapes/Object/FabricObject';\nimport type { TFiller, TMat2D, TOptions } from '../typedefs';\n\ninterface CanvasDrawableOptions {\n /**\n * if set to false background image is not affected by viewport transform\n * @since 1.6.3\n * @type Boolean\n * @todo we should really find a different way to do this\n */\n backgroundVpt: boolean;\n\n /**\n * Background color of canvas instance.\n * @type {(String|TFiller)}\n */\n backgroundColor: TFiller | string;\n\n /**\n * Background image of canvas instance.\n * since 2.4.0 image caching is active, please when putting an image as background, add to the\n * canvas property a reference to the canvas it is on. Otherwise the image cannot detect the zoom\n * vale. As an alternative you can disable image objectCaching\n * @type FabricObject\n */\n backgroundImage?: FabricObject;\n\n /**\n * if set to false overlay image is not affected by viewport transform\n * @since 1.6.3\n * @type Boolean\n * @todo we should really find a different way to do this\n */\n overlayVpt: boolean;\n\n /**\n * Overlay color of canvas instance.\n * @since 1.3.9\n * @type {(String|TFiller)}\n */\n overlayColor: TFiller | string;\n\n /**\n * Overlay image of canvas instance.\n * since 2.4.0 image caching is active, please when putting an image as overlay, add to the\n * canvas property a reference to the canvas it is on. Otherwise the image cannot detect the zoom\n * vale. As an alternative you can disable image objectCaching\n * @type FabricObject\n */\n overlayImage?: FabricObject;\n}\n\ninterface CanvasRenderingOptions {\n /**\n * Indicates whether {@link StaticCanvas#add}, {@link StaticCanvas#insertAt} and {@link StaticCanvas#remove},\n * {@link StaticCanvas#moveTo}, {@link StaticCanvas#clear} and many more, should also re-render canvas.\n * Disabling this option will not give a performance boost when adding/removing a lot of objects to/from canvas at once\n * since the renders are queued and executed one per frame.\n * Disabling is suggested anyway and managing the renders of the app manually is not a big effort ( canvas.requestRenderAll() )\n * Left default to true to do not break documentation and old app, fiddles.\n * @type Boolean\n */\n renderOnAddRemove: boolean;\n\n /**\n * Based on vptCoords and object.aCoords, skip rendering of objects that\n * are not included in current viewport.\n * May greatly help in applications with crowded canvas and use of zoom/pan\n * If One of the corner of the bounding box of the object is on the canvas\n * the objects get rendered.\n * @type Boolean\n * @default true\n */\n skipOffscreen: boolean;\n\n /**\n * When true, canvas is scaled by devicePixelRatio for better rendering on retina screens\n * @type Boolean\n */\n enableRetinaScaling: boolean;\n\n /**\n * Indicates whether this canvas will use image smoothing, this is on by default in browsers\n * @type Boolean\n */\n imageSmoothingEnabled: boolean;\n\n /**\n * a fabricObject that, without stroke define a clipping area with their shape. filled in black\n * the clipPath object gets used when the canvas has rendered, and the context is placed in the\n * top left corner of the canvas.\n * clipPath will clip away controls, if you do not want this to happen use controlsAboveOverlay = true\n * @type FabricObject\n */\n clipPath?: FabricObject;\n}\n\nexport interface CanvasExportOptions {\n /**\n * Indicates whether toObject/toDatalessObject should include default values\n * if set to false, takes precedence over the object value.\n * @type Boolean\n */\n includeDefaultValues: boolean;\n\n /**\n * When true, getSvgTransform() will apply the StaticCanvas.viewportTransform to the SVG transformation. When true,\n * a zoomed canvas will then produce zoomed SVG output.\n * @type Boolean\n */\n svgViewportTransformation: boolean;\n}\n\nexport interface StaticCanvasOptions\n extends CanvasDrawableOptions,\n CanvasRenderingOptions,\n CanvasExportOptions {\n /**\n * Width in virtual/logical pixels of the canvas.\n * The canvas can be larger than width if retina scaling is active\n * @type number\n */\n width: number;\n\n /**\n * Height in virtual/logical pixels of the canvas.\n * The canvas can be taller than width if retina scaling is active\n * @type height\n */\n height: number;\n\n /**\n * Indicates whether object controls (borders/controls) are rendered above overlay image\n * @type Boolean\n *\n * @todo move to Canvas\n */\n controlsAboveOverlay: boolean;\n\n /**\n * Indicates whether the browser can be scrolled when using a touchscreen and dragging on the canvas\n * It gives PRIORITY to DOM scrolling, it doesn't make it always possible.\n * If is true, when using a touch event on the canvas, the canvas will scroll if scroll is possible.\n * If we are in drawing mode or if we are selecting an object the canvas preventDefault and so it won't scroll\n * @type Boolean\n *\n * @todo move to Canvas\n */\n allowTouchScrolling: boolean;\n\n /**\n * The transformation (a Canvas 2D API transform matrix) which focuses the viewport\n * @type Array\n * @example Default transform\n * canvas.viewportTransform = [1, 0, 0, 1, 0, 0];\n * @example Scale by 70% and translate toward bottom-right by 50, without skewing\n * canvas.viewportTransform = [0.7, 0, 0, 0.7, 50, 50];\n */\n viewportTransform: TMat2D;\n}\n\nexport const staticCanvasDefaults: TOptions = {\n backgroundVpt: true,\n backgroundColor: '',\n overlayVpt: true,\n overlayColor: '',\n\n includeDefaultValues: true,\n svgViewportTransformation: true,\n\n renderOnAddRemove: true,\n skipOffscreen: true,\n enableRetinaScaling: true,\n imageSmoothingEnabled: true,\n\n /**\n * @todo move to Canvas\n */\n controlsAboveOverlay: false,\n /**\n * @todo move to Canvas\n */\n allowTouchScrolling: false,\n\n viewportTransform: [...iMatrix],\n};\n","import { config } from '../config';\nimport { CENTER, VERSION } from '../constants';\nimport type { CanvasEvents, StaticCanvasEvents } from '../EventTypeDefs';\nimport type { Gradient } from '../gradient/Gradient';\nimport { createCollectionMixin, isCollection } from '../Collection';\nimport { CommonMethods } from '../CommonMethods';\nimport type { Pattern } from '../Pattern';\nimport { Point } from '../Point';\nimport type { TCachedFabricObject } from '../shapes/Object/Object';\nimport type {\n Abortable,\n Constructor,\n TCornerPoint,\n TDataUrlOptions,\n TFiller,\n TMat2D,\n TSize,\n TSVGReviver,\n TToCanvasElementOptions,\n TValidToObjectMethod,\n TOptions,\n} from '../typedefs';\nimport {\n cancelAnimFrame,\n requestAnimFrame,\n} from '../util/animation/AnimationFrameProvider';\nimport { runningAnimations } from '../util/animation/AnimationRegistry';\nimport { uid } from '../util/internals/uid';\nimport { createCanvasElementFor, toBlob, toDataURL } from '../util/misc/dom';\nimport { invertTransform, transformPoint } from '../util/misc/matrix';\nimport type { EnlivenObjectOptions } from '../util/misc/objectEnlive';\nimport {\n enlivenObjectEnlivables,\n enlivenObjects,\n} from '../util/misc/objectEnlive';\nimport { pick } from '../util/misc/pick';\nimport { matrixToSVG } from '../util/misc/svgExport';\nimport { toFixed } from '../util/misc/toFixed';\nimport { isFiller, isPattern, isTextObject } from '../util/typeAssertions';\nimport { StaticCanvasDOMManager } from './DOMManagers/StaticCanvasDOMManager';\nimport type { CSSDimensions } from './DOMManagers/util';\nimport type { FabricObject } from '../shapes/Object/FabricObject';\nimport type { StaticCanvasOptions } from './StaticCanvasOptions';\nimport { staticCanvasDefaults } from './StaticCanvasOptions';\nimport { log, FabricError } from '../util/internals/console';\nimport { getDevicePixelRatio } from '../env';\n\n/**\n * Having both options in TCanvasSizeOptions set to true transform the call in a calcOffset\n * Better try to restrict with types to avoid confusion.\n */\nexport type TCanvasSizeOptions =\n | {\n backstoreOnly?: true;\n cssOnly?: false;\n }\n | {\n backstoreOnly?: false;\n cssOnly?: true;\n };\n\nexport type TSVGExportOptions = {\n suppressPreamble?: boolean;\n viewBox?: {\n x: number;\n y: number;\n width: number;\n height: number;\n };\n encoding?: 'UTF-8'; // test Encoding type and see what happens\n width?: string;\n height?: string;\n reviver?: TSVGReviver;\n};\n\n/**\n * Static canvas class\n * @see {@link http://fabricjs.com/static_canvas|StaticCanvas demo}\n * @fires before:render\n * @fires after:render\n * @fires canvas:cleared\n * @fires object:added\n * @fires object:removed\n */\n// TODO: fix `EventSpec` inheritance https://github.com/microsoft/TypeScript/issues/26154#issuecomment-1366616260\nexport class StaticCanvas<\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n EventSpec extends StaticCanvasEvents = StaticCanvasEvents,\n >\n extends createCollectionMixin(CommonMethods)\n implements StaticCanvasOptions\n{\n declare width: number;\n declare height: number;\n\n // background\n declare backgroundVpt: boolean;\n declare backgroundColor: TFiller | string;\n declare backgroundImage?: FabricObject;\n // overlay\n declare overlayVpt: boolean;\n declare overlayColor: TFiller | string;\n declare overlayImage?: FabricObject;\n\n declare clipPath?: FabricObject;\n\n declare includeDefaultValues: boolean;\n\n // rendering config\n declare renderOnAddRemove: boolean;\n declare skipOffscreen: boolean;\n declare enableRetinaScaling: boolean;\n declare imageSmoothingEnabled: boolean;\n\n /**\n * @todo move to Canvas\n */\n declare controlsAboveOverlay: boolean;\n\n /**\n * @todo move to Canvas\n */\n declare allowTouchScrolling: boolean;\n\n declare viewportTransform: TMat2D;\n\n /**\n * The viewport bounding box in scene plane coordinates, see {@link calcViewportBoundaries}\n */\n declare vptCoords: TCornerPoint;\n\n /**\n * A reference to the canvas actual HTMLCanvasElement.\n * Can be use to read the raw pixels, but never write or manipulate\n * @type HTMLCanvasElement\n */\n get lowerCanvasEl() {\n return this.elements.lower?.el;\n }\n\n get contextContainer() {\n return this.elements.lower?.ctx;\n }\n\n /**\n * If true the Canvas is in the process or has been disposed/destroyed.\n * No more rendering operation will be executed on this canvas.\n * @type boolean\n */\n declare destroyed?: boolean;\n\n /**\n * Started the process of disposing but not done yet.\n * WIll likely complete the render cycle already scheduled but stopping adding more.\n * @type boolean\n */\n declare disposed?: boolean;\n\n declare _offset: { left: number; top: number };\n declare protected hasLostContext: boolean;\n declare protected nextRenderHandle: number;\n\n declare elements: StaticCanvasDOMManager;\n\n /**\n * When true control drawing is skipped.\n * This boolean is used to avoid toDataURL to export controls.\n * Usage of this boolean to build up other flows and features is not supported\n * @type Boolean\n * @default false\n */\n declare protected skipControlsDrawing: boolean;\n\n static ownDefaults = staticCanvasDefaults;\n\n // reference to\n declare protected __cleanupTask?: {\n (): void;\n kill: (reason?: any) => void;\n };\n\n static getDefaults(): Record {\n return StaticCanvas.ownDefaults;\n }\n\n constructor(\n el?: string | HTMLCanvasElement,\n options: TOptions = {},\n ) {\n super();\n Object.assign(\n this,\n (this.constructor as typeof StaticCanvas).getDefaults(),\n );\n this.set(options);\n this.initElements(el);\n this._setDimensionsImpl({\n width: this.width || this.elements.lower.el.width || 0,\n height: this.height || this.elements.lower.el.height || 0,\n });\n this.skipControlsDrawing = false;\n this.viewportTransform = [...this.viewportTransform];\n this.calcViewportBoundaries();\n }\n\n protected initElements(el?: string | HTMLCanvasElement) {\n this.elements = new StaticCanvasDOMManager(el);\n }\n\n add(...objects: FabricObject[]) {\n const size = super.add(...objects);\n objects.length > 0 && this.renderOnAddRemove && this.requestRenderAll();\n return size;\n }\n\n insertAt(index: number, ...objects: FabricObject[]) {\n const size = super.insertAt(index, ...objects);\n objects.length > 0 && this.renderOnAddRemove && this.requestRenderAll();\n return size;\n }\n\n remove(...objects: FabricObject[]) {\n const removed = super.remove(...objects);\n removed.length > 0 && this.renderOnAddRemove && this.requestRenderAll();\n return removed;\n }\n\n _onObjectAdded(obj: FabricObject) {\n if (obj.canvas && (obj.canvas as StaticCanvas) !== this) {\n log(\n 'warn',\n 'Canvas is trying to add an object that belongs to a different canvas.\\n' +\n 'Resulting to default behavior: removing object from previous canvas and adding to new canvas',\n );\n obj.canvas.remove(obj);\n }\n obj._set('canvas', this);\n obj.setCoords();\n this.fire('object:added', { target: obj });\n obj.fire('added', { target: this });\n }\n\n _onObjectRemoved(obj: FabricObject) {\n obj._set('canvas', undefined);\n this.fire('object:removed', { target: obj });\n obj.fire('removed', { target: this });\n }\n\n _onStackOrderChanged() {\n this.renderOnAddRemove && this.requestRenderAll();\n }\n\n /**\n * @private\n * @see https://developer.apple.com/library/safari/documentation/AudioVideo/Conceptual/HTML-canvas-guide/SettingUptheCanvas/SettingUptheCanvas.html\n * @return {Number} retinaScaling if applied, otherwise 1;\n */\n getRetinaScaling() {\n return this.enableRetinaScaling ? getDevicePixelRatio() : 1;\n }\n\n /**\n * Calculates canvas element offset relative to the document\n * This method is also attached as \"resize\" event handler of window\n */\n calcOffset() {\n return (this._offset = this.elements.calcOffset());\n }\n\n /**\n * Returns canvas width (in px)\n * @return {Number}\n */\n getWidth(): number {\n return this.width;\n }\n\n /**\n * Returns canvas height (in px)\n * @return {Number}\n */\n getHeight(): number {\n return this.height;\n }\n\n /**\n * Internal use only\n * @protected\n */\n protected _setDimensionsImpl(\n dimensions: Partial,\n { cssOnly = false, backstoreOnly = false }: TCanvasSizeOptions = {},\n ) {\n if (!cssOnly) {\n const size = {\n width: this.width,\n height: this.height,\n ...(dimensions as Partial),\n };\n this.elements.setDimensions(size, this.getRetinaScaling());\n this.hasLostContext = true;\n this.width = size.width;\n this.height = size.height;\n }\n if (!backstoreOnly) {\n this.elements.setCSSDimensions(dimensions);\n }\n\n this.calcOffset();\n }\n\n /**\n * Sets dimensions (width, height) of this canvas instance. when options.cssOnly flag active you should also supply the unit of measure (px/%/em)\n * @param {Object} dimensions Object with width/height properties\n * @param {Number|String} [dimensions.width] Width of canvas element\n * @param {Number|String} [dimensions.height] Height of canvas element\n * @param {Object} [options] Options object\n * @param {Boolean} [options.backstoreOnly=false] Set the given dimensions only as canvas backstore dimensions\n * @param {Boolean} [options.cssOnly=false] Set the given dimensions only as css dimensions\n */\n setDimensions(\n dimensions: Partial,\n options?: { cssOnly?: true; backstoreOnly?: false },\n ): void;\n setDimensions(\n dimensions: Partial,\n options?: { backstoreOnly?: true; cssOnly?: false },\n ): void;\n setDimensions(dimensions: Partial, options?: never): void;\n setDimensions(\n dimensions: Partial,\n options?: TCanvasSizeOptions,\n ) {\n this._setDimensionsImpl(dimensions, options);\n if (!options || !options.cssOnly) {\n this.requestRenderAll();\n }\n }\n\n /**\n * Returns canvas zoom level\n * @return {Number}\n */\n getZoom() {\n return this.viewportTransform[0];\n }\n\n /**\n * Sets viewport transformation of this canvas instance\n * @param {Array} vpt a Canvas 2D API transform matrix\n */\n setViewportTransform(vpt: TMat2D) {\n this.viewportTransform = vpt;\n this.calcViewportBoundaries();\n this.renderOnAddRemove && this.requestRenderAll();\n }\n\n /**\n * Sets zoom level of this canvas instance, the zoom centered around point\n * meaning that following zoom to point with the same point will have the visual\n * effect of the zoom originating from that point. The point won't move.\n * It has nothing to do with canvas center or visual center of the viewport.\n * @param {Point} point to zoom with respect to\n * @param {Number} value to set zoom to, less than 1 zooms out\n */\n zoomToPoint(point: Point, value: number) {\n // TODO: just change the scale, preserve other transformations\n const before = point,\n vpt: TMat2D = [...this.viewportTransform];\n const newPoint = transformPoint(point, invertTransform(vpt));\n vpt[0] = value;\n vpt[3] = value;\n const after = transformPoint(newPoint, vpt);\n vpt[4] += before.x - after.x;\n vpt[5] += before.y - after.y;\n this.setViewportTransform(vpt);\n }\n\n /**\n * Sets zoom level of this canvas instance\n * @param {Number} value to set zoom to, less than 1 zooms out\n */\n setZoom(value: number) {\n this.zoomToPoint(new Point(0, 0), value);\n }\n\n /**\n * Pan viewport so as to place point at top left corner of canvas\n * @param {Point} point to move to\n */\n absolutePan(point: Point) {\n const vpt: TMat2D = [...this.viewportTransform];\n vpt[4] = -point.x;\n vpt[5] = -point.y;\n return this.setViewportTransform(vpt);\n }\n\n /**\n * Pans viewpoint relatively\n * @param {Point} point (position vector) to move by\n */\n relativePan(point: Point) {\n return this.absolutePan(\n new Point(\n -point.x - this.viewportTransform[4],\n -point.y - this.viewportTransform[5],\n ),\n );\n }\n\n /**\n * Returns <canvas> element corresponding to this instance\n * @return {HTMLCanvasElement}\n */\n getElement(): HTMLCanvasElement {\n return this.elements.lower.el;\n }\n\n /**\n * Clears specified context of canvas element\n * @param {CanvasRenderingContext2D} ctx Context to clear\n */\n clearContext(ctx: CanvasRenderingContext2D) {\n ctx.clearRect(0, 0, this.width, this.height);\n }\n\n /**\n * Returns context of canvas where objects are drawn\n * @return {CanvasRenderingContext2D}\n */\n getContext(): CanvasRenderingContext2D {\n return this.elements.lower.ctx;\n }\n\n /**\n * Clears all contexts (background, main, top) of an instance\n */\n clear() {\n this.remove(...this.getObjects());\n this.backgroundImage = undefined;\n this.overlayImage = undefined;\n this.backgroundColor = '';\n this.overlayColor = '';\n this.clearContext(this.getContext());\n this.fire('canvas:cleared');\n this.renderOnAddRemove && this.requestRenderAll();\n }\n\n /**\n * Renders the canvas\n */\n renderAll() {\n this.cancelRequestedRender();\n if (this.destroyed) {\n return;\n }\n this.renderCanvas(this.getContext(), this._objects);\n }\n\n /**\n * Function created to be instance bound at initialization\n * used in requestAnimationFrame rendering\n * Let the fabricJS call it. If you call it manually you could have more\n * animationFrame stacking on to of each other\n * for an imperative rendering, use canvas.renderAll\n * @private\n */\n renderAndReset() {\n this.nextRenderHandle = 0;\n this.renderAll();\n }\n\n /**\n * Append a renderAll request to next animation frame.\n * unless one is already in progress, in that case nothing is done\n * a boolean flag will avoid appending more.\n */\n requestRenderAll() {\n if (!this.nextRenderHandle && !this.disposed && !this.destroyed) {\n this.nextRenderHandle = requestAnimFrame(() => this.renderAndReset());\n }\n }\n\n /**\n * Calculate the position of the 4 corner of canvas with current viewportTransform.\n * helps to determinate when an object is in the current rendering viewport\n */\n calcViewportBoundaries(): TCornerPoint {\n const width = this.width,\n height = this.height,\n iVpt = invertTransform(this.viewportTransform),\n a = transformPoint({ x: 0, y: 0 }, iVpt),\n b = transformPoint({ x: width, y: height }, iVpt),\n // we don't support vpt flipping\n // but the code is robust enough to mostly work with flipping\n min = a.min(b),\n max = a.max(b);\n return (this.vptCoords = {\n tl: min,\n tr: new Point(max.x, min.y),\n bl: new Point(min.x, max.y),\n br: max,\n });\n }\n\n cancelRequestedRender() {\n if (this.nextRenderHandle) {\n cancelAnimFrame(this.nextRenderHandle);\n this.nextRenderHandle = 0;\n }\n }\n\n drawControls(_ctx: CanvasRenderingContext2D) {\n // Static canvas has no controls\n }\n\n /**\n * Renders background, objects, overlay and controls.\n * @param {CanvasRenderingContext2D} ctx\n * @param {Array} objects to render\n */\n renderCanvas(ctx: CanvasRenderingContext2D, objects: FabricObject[]) {\n if (this.destroyed) {\n return;\n }\n\n const v = this.viewportTransform,\n path = this.clipPath;\n this.calcViewportBoundaries();\n this.clearContext(ctx);\n ctx.imageSmoothingEnabled = this.imageSmoothingEnabled;\n // @ts-expect-error node-canvas stuff\n ctx.patternQuality = 'best';\n this.fire('before:render', { ctx });\n this._renderBackground(ctx);\n\n ctx.save();\n //apply viewport transform once for all rendering process\n ctx.transform(v[0], v[1], v[2], v[3], v[4], v[5]);\n this._renderObjects(ctx, objects);\n ctx.restore();\n if (!this.controlsAboveOverlay && !this.skipControlsDrawing) {\n this.drawControls(ctx);\n }\n if (path) {\n path._set('canvas', this);\n // needed to setup a couple of variables\n // todo migrate to the newer one\n path.shouldCache();\n path._transformDone = true;\n (path as TCachedFabricObject).renderCache({ forClipping: true });\n this.drawClipPathOnCanvas(ctx, path as TCachedFabricObject);\n }\n this._renderOverlay(ctx);\n if (this.controlsAboveOverlay && !this.skipControlsDrawing) {\n this.drawControls(ctx);\n }\n this.fire('after:render', { ctx });\n\n if (this.__cleanupTask) {\n this.__cleanupTask();\n this.__cleanupTask = undefined;\n }\n }\n\n /**\n * Paint the cached clipPath on the lowerCanvasEl\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n drawClipPathOnCanvas(\n ctx: CanvasRenderingContext2D,\n clipPath: TCachedFabricObject,\n ) {\n const v = this.viewportTransform;\n ctx.save();\n ctx.transform(...v);\n // DEBUG: uncomment this line, comment the following\n // ctx.globalAlpha = 0.4;\n ctx.globalCompositeOperation = 'destination-in';\n clipPath.transform(ctx);\n ctx.scale(1 / clipPath.zoomX, 1 / clipPath.zoomY);\n ctx.drawImage(\n clipPath._cacheCanvas,\n -clipPath.cacheTranslationX,\n -clipPath.cacheTranslationY,\n );\n ctx.restore();\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n * @param {Array} objects to render\n */\n _renderObjects(ctx: CanvasRenderingContext2D, objects: FabricObject[]) {\n for (let i = 0, len = objects.length; i < len; ++i) {\n objects[i] && objects[i].render(ctx);\n }\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n * @param {string} property 'background' or 'overlay'\n */\n _renderBackgroundOrOverlay(\n ctx: CanvasRenderingContext2D,\n property: 'background' | 'overlay',\n ) {\n const fill = this[`${property}Color`],\n object = this[`${property}Image`],\n v = this.viewportTransform,\n needsVpt = this[`${property}Vpt`];\n if (!fill && !object) {\n return;\n }\n const isAFiller = isFiller(fill);\n if (fill) {\n ctx.save();\n ctx.beginPath();\n ctx.moveTo(0, 0);\n ctx.lineTo(this.width, 0);\n ctx.lineTo(this.width, this.height);\n ctx.lineTo(0, this.height);\n ctx.closePath();\n ctx.fillStyle = isAFiller ? fill.toLive(ctx /* this */)! : fill;\n if (needsVpt) {\n ctx.transform(...v);\n }\n if (isAFiller) {\n ctx.transform(1, 0, 0, 1, fill.offsetX || 0, fill.offsetY || 0);\n const m = ((fill as Gradient<'linear'>).gradientTransform ||\n (fill as Pattern).patternTransform) as TMat2D;\n m && ctx.transform(...m);\n }\n ctx.fill();\n ctx.restore();\n }\n if (object) {\n ctx.save();\n const { skipOffscreen } = this;\n // if the object doesn't move with the viewport,\n // the offscreen concept does not apply;\n this.skipOffscreen = needsVpt;\n if (needsVpt) {\n ctx.transform(...v);\n }\n object.render(ctx);\n this.skipOffscreen = skipOffscreen;\n ctx.restore();\n }\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _renderBackground(ctx: CanvasRenderingContext2D) {\n this._renderBackgroundOrOverlay(ctx, 'background');\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _renderOverlay(ctx: CanvasRenderingContext2D) {\n this._renderBackgroundOrOverlay(ctx, 'overlay');\n }\n\n /**\n * Returns coordinates of a center of canvas.\n * @return {Point}\n */\n getCenterPoint() {\n return new Point(this.width / 2, this.height / 2);\n }\n\n /**\n * Centers object horizontally in the canvas\n */\n centerObjectH(object: FabricObject) {\n return this._centerObject(\n object,\n new Point(this.getCenterPoint().x, object.getCenterPoint().y),\n );\n }\n\n /**\n * Centers object vertically in the canvas\n * @param {FabricObject} object Object to center vertically\n */\n centerObjectV(object: FabricObject) {\n return this._centerObject(\n object,\n new Point(object.getCenterPoint().x, this.getCenterPoint().y),\n );\n }\n\n /**\n * Centers object vertically and horizontally in the canvas\n * @param {FabricObject} object Object to center vertically and horizontally\n */\n centerObject(object: FabricObject) {\n return this._centerObject(object, this.getCenterPoint());\n }\n\n /**\n * Centers object vertically and horizontally in the viewport\n * @param {FabricObject} object Object to center vertically and horizontally\n */\n viewportCenterObject(object: FabricObject) {\n return this._centerObject(object, this.getVpCenter());\n }\n\n /**\n * Centers object horizontally in the viewport, object.top is unchanged\n * @param {FabricObject} object Object to center vertically and horizontally\n */\n viewportCenterObjectH(object: FabricObject) {\n return this._centerObject(\n object,\n new Point(this.getVpCenter().x, object.getCenterPoint().y),\n );\n }\n\n /**\n * Centers object Vertically in the viewport, object.top is unchanged\n * @param {FabricObject} object Object to center vertically and horizontally\n */\n viewportCenterObjectV(object: FabricObject) {\n return this._centerObject(\n object,\n new Point(object.getCenterPoint().x, this.getVpCenter().y),\n );\n }\n\n /**\n * Calculate the point in canvas that correspond to the center of actual viewport.\n * @return {Point} vpCenter, viewport center\n */\n getVpCenter(): Point {\n return transformPoint(\n this.getCenterPoint(),\n invertTransform(this.viewportTransform),\n );\n }\n\n /**\n * @private\n * @param {FabricObject} object Object to center\n * @param {Point} center Center point\n */\n _centerObject(object: FabricObject, center: Point) {\n object.setXY(center, CENTER, CENTER);\n object.setCoords();\n this.renderOnAddRemove && this.requestRenderAll();\n }\n\n /**\n * Returns dataless JSON representation of canvas\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {String} json string\n */\n toDatalessJSON(propertiesToInclude?: string[]) {\n return this.toDatalessObject(propertiesToInclude);\n }\n\n /**\n * Returns object representation of canvas\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} object representation of an instance\n */\n toObject(propertiesToInclude?: string[]) {\n return this._toObjectMethod('toObject', propertiesToInclude);\n }\n\n /**\n * Returns Object representation of canvas\n * this alias is provided because if you call JSON.stringify on an instance,\n * the toJSON object will be invoked if it exists.\n * Having a toJSON method means you can do JSON.stringify(myCanvas)\n * JSON does not support additional properties because toJSON has its own signature\n * @return {Object} JSON compatible object\n * @tutorial {@link http://fabricjs.com/fabric-intro-part-3#serialization}\n * @see {@link http://jsfiddle.net/fabricjs/pec86/|jsFiddle demo}\n * @example JSON representation of canvas \n * const json = canvas.toJSON();\n * @example JSON representation of canvas \n * const json = JSON.stringify(canvas);\n */\n toJSON() {\n return this.toObject();\n }\n\n /**\n * Returns dataless object representation of canvas\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} object representation of an instance\n */\n toDatalessObject(propertiesToInclude?: string[]) {\n return this._toObjectMethod('toDatalessObject', propertiesToInclude);\n }\n\n /**\n * @private\n */\n _toObjectMethod(\n methodName: TValidToObjectMethod,\n propertiesToInclude?: string[],\n ) {\n const clipPath = this.clipPath;\n const clipPathData =\n clipPath && !clipPath.excludeFromExport\n ? this._toObject(clipPath, methodName, propertiesToInclude)\n : null;\n return {\n version: VERSION,\n ...pick(this, propertiesToInclude as (keyof this)[]),\n objects: this._objects\n .filter((object) => !object.excludeFromExport)\n .map((instance) =>\n this._toObject(instance, methodName, propertiesToInclude),\n ),\n ...this.__serializeBgOverlay(methodName, propertiesToInclude),\n ...(clipPathData ? { clipPath: clipPathData } : null),\n };\n }\n\n /**\n * @private\n */\n protected _toObject(\n instance: FabricObject,\n methodName: TValidToObjectMethod,\n propertiesToInclude?: string[],\n ) {\n let originalValue;\n\n if (!this.includeDefaultValues) {\n originalValue = instance.includeDefaultValues;\n instance.includeDefaultValues = false;\n }\n\n const object = instance[methodName](propertiesToInclude);\n if (!this.includeDefaultValues) {\n instance.includeDefaultValues = !!originalValue;\n }\n return object;\n }\n\n /**\n * @private\n */\n __serializeBgOverlay(\n methodName: TValidToObjectMethod,\n propertiesToInclude?: string[],\n ) {\n const data: any = {},\n bgImage = this.backgroundImage,\n overlayImage = this.overlayImage,\n bgColor = this.backgroundColor,\n overlayColor = this.overlayColor;\n\n if (isFiller(bgColor)) {\n if (!bgColor.excludeFromExport) {\n data.background = bgColor.toObject(propertiesToInclude);\n }\n } else if (bgColor) {\n data.background = bgColor;\n }\n\n if (isFiller(overlayColor)) {\n if (!overlayColor.excludeFromExport) {\n data.overlay = overlayColor.toObject(propertiesToInclude);\n }\n } else if (overlayColor) {\n data.overlay = overlayColor;\n }\n\n if (bgImage && !bgImage.excludeFromExport) {\n data.backgroundImage = this._toObject(\n bgImage,\n methodName,\n propertiesToInclude,\n );\n }\n if (overlayImage && !overlayImage.excludeFromExport) {\n data.overlayImage = this._toObject(\n overlayImage,\n methodName,\n propertiesToInclude,\n );\n }\n\n return data;\n }\n\n /* _TO_SVG_START_ */\n\n declare svgViewportTransformation: boolean;\n\n /**\n * Returns SVG representation of canvas\n * @function\n * @param {Object} [options] Options object for SVG output\n * @param {Boolean} [options.suppressPreamble=false] If true xml tag is not included\n * @param {Object} [options.viewBox] SVG viewbox object\n * @param {Number} [options.viewBox.x] x-coordinate of viewbox\n * @param {Number} [options.viewBox.y] y-coordinate of viewbox\n * @param {Number} [options.viewBox.width] Width of viewbox\n * @param {Number} [options.viewBox.height] Height of viewbox\n * @param {String} [options.encoding=UTF-8] Encoding of SVG output\n * @param {String} [options.width] desired width of svg with or without units\n * @param {String} [options.height] desired height of svg with or without units\n * @param {Function} [reviver] Method for further parsing of svg elements, called after each fabric object converted into svg representation.\n * @return {String} SVG string\n * @tutorial {@link http://fabricjs.com/fabric-intro-part-3#serialization}\n * @see {@link http://jsfiddle.net/fabricjs/jQ3ZZ/|jsFiddle demo}\n * @example Normal SVG output\n * var svg = canvas.toSVG();\n * @example SVG output without preamble (without <?xml ../>)\n * var svg = canvas.toSVG({suppressPreamble: true});\n * @example SVG output with viewBox attribute\n * var svg = canvas.toSVG({\n * viewBox: {\n * x: 100,\n * y: 100,\n * width: 200,\n * height: 300\n * }\n * });\n * @example SVG output with different encoding (default: UTF-8)\n * var svg = canvas.toSVG({encoding: 'ISO-8859-1'});\n * @example Modify SVG output with reviver function\n * var svg = canvas.toSVG(null, function(svg) {\n * return svg.replace('stroke-dasharray: ; stroke-linecap: butt; stroke-linejoin: miter; stroke-miterlimit: 10; ', '');\n * });\n */\n toSVG(options: TSVGExportOptions = {}, reviver?: TSVGReviver) {\n options.reviver = reviver;\n const markup: string[] = [];\n\n this._setSVGPreamble(markup, options);\n this._setSVGHeader(markup, options);\n if (this.clipPath) {\n markup.push(`\\n`);\n }\n this._setSVGBgOverlayColor(markup, 'background');\n this._setSVGBgOverlayImage(markup, 'backgroundImage', reviver);\n this._setSVGObjects(markup, reviver);\n if (this.clipPath) {\n markup.push('\\n');\n }\n this._setSVGBgOverlayColor(markup, 'overlay');\n this._setSVGBgOverlayImage(markup, 'overlayImage', reviver);\n\n markup.push('');\n\n return markup.join('');\n }\n\n /**\n * @private\n */\n _setSVGPreamble(markup: string[], options: TSVGExportOptions): void {\n if (options.suppressPreamble) {\n return;\n }\n markup.push(\n '\\n',\n '\\n',\n );\n }\n\n /**\n * @private\n */\n _setSVGHeader(markup: string[], options: TSVGExportOptions): void {\n const width = options.width || `${this.width}`,\n height = options.height || `${this.height}`,\n NUM_FRACTION_DIGITS = config.NUM_FRACTION_DIGITS,\n optViewBox = options.viewBox;\n let viewBox: string;\n if (optViewBox) {\n viewBox = `viewBox=\"${optViewBox.x} ${optViewBox.y} ${optViewBox.width} ${optViewBox.height}\" `;\n } else if (this.svgViewportTransformation) {\n const vpt = this.viewportTransform;\n viewBox = `viewBox=\"${toFixed(\n -vpt[4] / vpt[0],\n NUM_FRACTION_DIGITS,\n )} ${toFixed(-vpt[5] / vpt[3], NUM_FRACTION_DIGITS)} ${toFixed(\n this.width / vpt[0],\n NUM_FRACTION_DIGITS,\n )} ${toFixed(this.height / vpt[3], NUM_FRACTION_DIGITS)}\" `;\n } else {\n viewBox = `viewBox=\"0 0 ${this.width} ${this.height}\" `;\n }\n\n markup.push(\n '\\n',\n 'Created with Fabric.js ',\n VERSION,\n '\\n',\n '\\n',\n this.createSVGFontFacesMarkup(),\n this.createSVGRefElementsMarkup(),\n this.createSVGClipPathMarkup(options),\n '\\n',\n );\n }\n\n createSVGClipPathMarkup(options: TSVGExportOptions): string {\n const clipPath = this.clipPath;\n if (clipPath) {\n clipPath.clipPathId = `CLIPPATH_${uid()}`;\n return `\\n${clipPath.toClipPathSVG(\n options.reviver,\n )}\\n`;\n }\n return '';\n }\n\n /**\n * Creates markup containing SVG referenced elements like patterns, gradients etc.\n * @return {String}\n */\n createSVGRefElementsMarkup(): string {\n return (['background', 'overlay'] as const)\n .map((prop) => {\n const fill = this[`${prop}Color`];\n if (isFiller(fill)) {\n const shouldTransform = this[`${prop}Vpt`],\n vpt = this.viewportTransform,\n object = {\n // otherwise circular dependency\n isType: () => false,\n width: this.width / (shouldTransform ? vpt[0] : 1),\n height: this.height / (shouldTransform ? vpt[3] : 1),\n };\n return fill.toSVG(object as FabricObject, {\n additionalTransform: shouldTransform ? matrixToSVG(vpt) : '',\n });\n }\n })\n .join('');\n }\n\n /**\n * Creates markup containing SVG font faces,\n * font URLs for font faces must be collected by developers\n * and are not extracted from the DOM by fabricjs\n * @param {Array} objects Array of fabric objects\n * @return {String}\n */\n createSVGFontFacesMarkup(): string {\n const objects: FabricObject[] = [],\n fontList: Record = {},\n fontPaths = config.fontPaths;\n\n this._objects.forEach(function add(object) {\n objects.push(object);\n if (isCollection(object)) {\n object._objects.forEach(add);\n }\n });\n\n objects.forEach((obj) => {\n if (!isTextObject(obj)) {\n return;\n }\n const { styles, fontFamily } = obj;\n if (fontList[fontFamily] || !fontPaths[fontFamily]) {\n return;\n }\n fontList[fontFamily] = true;\n if (!styles) {\n return;\n }\n Object.values(styles).forEach((styleRow) => {\n Object.values(styleRow).forEach(({ fontFamily = '' }) => {\n if (!fontList[fontFamily] && fontPaths[fontFamily]) {\n fontList[fontFamily] = true;\n }\n });\n });\n });\n\n const fontListMarkup = Object.keys(fontList)\n .map(\n (fontFamily) =>\n `\\t\\t@font-face {\\n\\t\\t\\tfont-family: '${fontFamily}';\\n\\t\\t\\tsrc: url('${fontPaths[fontFamily]}');\\n\\t\\t}\\n`,\n )\n .join('');\n\n if (fontListMarkup) {\n return `\\t\\n`;\n }\n return '';\n }\n\n /**\n * @private\n */\n _setSVGObjects(markup: string[], reviver?: TSVGReviver) {\n this.forEachObject((fabricObject) => {\n if (fabricObject.excludeFromExport) {\n return;\n }\n this._setSVGObject(markup, fabricObject, reviver);\n });\n }\n\n /**\n * This is its own function because the Canvas ( non static ) requires extra code here\n * @private\n */\n _setSVGObject(\n markup: string[],\n instance: FabricObject,\n reviver?: TSVGReviver,\n ) {\n markup.push(instance.toSVG(reviver));\n }\n\n /**\n * @private\n */\n _setSVGBgOverlayImage(\n markup: string[],\n property: 'overlayImage' | 'backgroundImage',\n reviver?: TSVGReviver,\n ) {\n const bgOrOverlay = this[property];\n if (bgOrOverlay && !bgOrOverlay.excludeFromExport && bgOrOverlay.toSVG) {\n markup.push(bgOrOverlay.toSVG(reviver));\n }\n }\n\n /**\n * @TODO this seems to handle patterns but fail at gradients.\n * @private\n */\n _setSVGBgOverlayColor(markup: string[], property: 'background' | 'overlay') {\n const filler = this[`${property}Color`];\n if (!filler) {\n return;\n }\n if (isFiller(filler)) {\n const repeat = (filler as Pattern).repeat || '',\n finalWidth = this.width,\n finalHeight = this.height,\n shouldInvert = this[`${property}Vpt`],\n additionalTransform = shouldInvert\n ? matrixToSVG(invertTransform(this.viewportTransform))\n : '';\n markup.push(\n `\\n`,\n );\n } else {\n markup.push(\n '\\n',\n );\n }\n }\n /* _TO_SVG_END_ */\n\n /**\n * Populates canvas with data from the specified JSON.\n * JSON format must conform to the one of {@link fabric.Canvas#toJSON}\n *\n * **IMPORTANT**: It is recommended to abort loading tasks before calling this method to prevent race conditions and unnecessary networking\n *\n * @param {String|Object} json JSON string or object\n * @param {Function} [reviver] Method for further parsing of JSON elements, called after each fabric object created.\n * @param {Object} [options] options\n * @param {AbortSignal} [options.signal] see https://developer.mozilla.org/en-US/docs/Web/API/AbortController/signal\n * @return {Promise} instance\n * @tutorial {@link http://fabricjs.com/fabric-intro-part-3#deserialization}\n * @see {@link http://jsfiddle.net/fabricjs/fmgXt/|jsFiddle demo}\n * @example loadFromJSON\n * canvas.loadFromJSON(json).then((canvas) => canvas.requestRenderAll());\n * @example loadFromJSON with reviver\n * canvas.loadFromJSON(json, function(o, object) {\n * // `o` = json object\n * // `object` = fabric.Object instance\n * // ... do some stuff ...\n * }).then((canvas) => {\n * ... canvas is restored, add your code.\n * });\n *\n */\n loadFromJSON(\n json: string | Record,\n reviver?: EnlivenObjectOptions['reviver'],\n { signal }: Abortable = {},\n ): Promise {\n if (!json) {\n return Promise.reject(new FabricError('`json` is undefined'));\n }\n\n // parse json if it wasn't already\n const serialized = typeof json === 'string' ? JSON.parse(json) : json;\n const {\n objects = [],\n backgroundImage,\n background,\n overlayImage,\n overlay,\n clipPath,\n } = serialized;\n const renderOnAddRemove = this.renderOnAddRemove;\n this.renderOnAddRemove = false;\n\n return Promise.all([\n enlivenObjects(objects, {\n reviver,\n signal,\n }),\n enlivenObjectEnlivables(\n {\n backgroundImage,\n backgroundColor: background,\n overlayImage,\n overlayColor: overlay,\n clipPath,\n },\n { signal },\n ),\n ]).then(([enlived, enlivedMap]) => {\n this.clear();\n this.add(...enlived);\n this.set(serialized);\n this.set(enlivedMap);\n this.renderOnAddRemove = renderOnAddRemove;\n return this;\n });\n }\n\n /**\n * Clones canvas instance\n * @param {string[]} [properties] Array of properties to include in the cloned canvas and children\n */\n clone(properties: string[]) {\n const data = this.toObject(properties);\n const canvas = this.cloneWithoutData();\n return canvas.loadFromJSON(data);\n }\n\n /**\n * Clones canvas instance without cloning existing data.\n * This essentially copies canvas dimensions since loadFromJSON does not affect canvas size.\n */\n cloneWithoutData() {\n const el = createCanvasElementFor(this);\n return new (this.constructor as Constructor)(el);\n }\n\n /**\n * Exports canvas element to a dataurl image. Note that when multiplier is used, cropping is scaled appropriately\n * @param {Object} [options] Options object\n * @param {String} [options.format=png] The format of the output image. Either \"jpeg\" or \"png\"\n * @param {Number} [options.quality=1] Quality level (0..1). Only used for jpeg.\n * @param {Number} [options.multiplier=1] Multiplier to scale by, to have consistent\n * @param {Number} [options.left] Cropping left offset. Introduced in v1.2.14\n * @param {Number} [options.top] Cropping top offset. Introduced in v1.2.14\n * @param {Number} [options.width] Cropping width. Introduced in v1.2.14\n * @param {Number} [options.height] Cropping height. Introduced in v1.2.14\n * @param {Boolean} [options.enableRetinaScaling] Enable retina scaling for clone image. Introduce in 2.0.0\n * @param {(object: fabric.Object) => boolean} [options.filter] Function to filter objects.\n * @return {String} Returns a data: URL containing a representation of the object in the format specified by options.format\n * @see {@link https://jsfiddle.net/xsjua1rd/ demo}\n * @example Generate jpeg dataURL with lower quality\n * var dataURL = canvas.toDataURL({\n * format: 'jpeg',\n * quality: 0.8\n * });\n * @example Generate cropped png dataURL (clipping of canvas)\n * var dataURL = canvas.toDataURL({\n * format: 'png',\n * left: 100,\n * top: 100,\n * width: 200,\n * height: 200\n * });\n * @example Generate double scaled png dataURL\n * var dataURL = canvas.toDataURL({\n * format: 'png',\n * multiplier: 2\n * });\n * @example Generate dataURL with objects that overlap a specified object\n * var myObject;\n * var dataURL = canvas.toDataURL({\n * filter: (object) => object.isContainedWithinObject(myObject) || object.intersectsWithObject(myObject)\n * });\n */\n toDataURL(options = {} as TDataUrlOptions): string {\n const {\n format = 'png',\n quality = 1,\n multiplier = 1,\n enableRetinaScaling = false,\n } = options;\n const finalMultiplier =\n multiplier * (enableRetinaScaling ? this.getRetinaScaling() : 1);\n\n return toDataURL(\n this.toCanvasElement(finalMultiplier, options),\n format,\n quality,\n );\n }\n toBlob(options = {} as TDataUrlOptions): Promise {\n const {\n format = 'png',\n quality = 1,\n multiplier = 1,\n enableRetinaScaling = false,\n } = options;\n const finalMultiplier =\n multiplier * (enableRetinaScaling ? this.getRetinaScaling() : 1);\n\n return toBlob(\n this.toCanvasElement(finalMultiplier, options),\n format,\n quality,\n );\n }\n\n /**\n * Create a new HTMLCanvas element painted with the current canvas content.\n * No need to resize the actual one or repaint it.\n * Will transfer object ownership to a new canvas, paint it, and set everything back.\n * This is an intermediary step used to get to a dataUrl but also it is useful to\n * create quick image copies of a canvas without passing for the dataUrl string\n * @param {Number} [multiplier] a zoom factor.\n * @param {Object} [options] Cropping informations\n * @param {Number} [options.left] Cropping left offset.\n * @param {Number} [options.top] Cropping top offset.\n * @param {Number} [options.width] Cropping width.\n * @param {Number} [options.height] Cropping height.\n * @param {(object: fabric.Object) => boolean} [options.filter] Function to filter objects.\n */\n toCanvasElement(\n multiplier = 1,\n { width, height, left, top, filter } = {} as TToCanvasElementOptions,\n ): HTMLCanvasElement {\n const scaledWidth = (width || this.width) * multiplier,\n scaledHeight = (height || this.height) * multiplier,\n zoom = this.getZoom(),\n originalWidth = this.width,\n originalHeight = this.height,\n originalSkipControlsDrawing = this.skipControlsDrawing,\n newZoom = zoom * multiplier,\n vp = this.viewportTransform,\n translateX = (vp[4] - (left || 0)) * multiplier,\n translateY = (vp[5] - (top || 0)) * multiplier,\n newVp = [newZoom, 0, 0, newZoom, translateX, translateY] as TMat2D,\n originalRetina = this.enableRetinaScaling,\n canvasEl = createCanvasElementFor({\n width: scaledWidth,\n height: scaledHeight,\n }),\n objectsToRender = filter\n ? this._objects.filter((obj) => filter(obj))\n : this._objects;\n this.enableRetinaScaling = false;\n this.viewportTransform = newVp;\n this.width = scaledWidth;\n this.height = scaledHeight;\n this.skipControlsDrawing = true;\n this.calcViewportBoundaries();\n this.renderCanvas(canvasEl.getContext('2d')!, objectsToRender);\n this.viewportTransform = vp;\n this.width = originalWidth;\n this.height = originalHeight;\n this.calcViewportBoundaries();\n this.enableRetinaScaling = originalRetina;\n this.skipControlsDrawing = originalSkipControlsDrawing;\n return canvasEl;\n }\n\n /**\n * Waits until rendering has settled to destroy the canvas\n * @returns {Promise} a promise resolving to `true` once the canvas has been destroyed or to `false` if the canvas has was already destroyed\n * @throws if aborted by a consequent call\n */\n dispose() {\n !this.disposed &&\n this.elements.cleanupDOM({ width: this.width, height: this.height });\n runningAnimations.cancelByCanvas(this);\n this.disposed = true;\n return new Promise((resolve, reject) => {\n const task = () => {\n this.destroy();\n resolve(true);\n };\n task.kill = reject;\n if (this.__cleanupTask) {\n this.__cleanupTask.kill('aborted');\n }\n\n if (this.destroyed) {\n resolve(false);\n } else if (this.nextRenderHandle) {\n this.__cleanupTask = task;\n } else {\n task();\n }\n });\n }\n\n /**\n * Clears the canvas element, disposes objects and frees resources.\n *\n * Invoked as part of the **async** operation of {@link dispose}.\n *\n * **CAUTION**:\n *\n * This method is **UNSAFE**.\n * You may encounter a race condition using it if there's a requested render.\n * Call this method only if you are sure rendering has settled.\n * Consider using {@link dispose} as it is **SAFE**\n *\n * @private\n */\n destroy() {\n this.destroyed = true;\n this.cancelRequestedRender();\n this.forEachObject((object) => object.dispose());\n this._objects = [];\n if (this.backgroundImage) {\n this.backgroundImage.dispose();\n }\n this.backgroundImage = undefined;\n if (this.overlayImage) {\n this.overlayImage.dispose();\n }\n this.overlayImage = undefined;\n this.elements.dispose();\n }\n\n /**\n * Returns a string representation of an instance\n * @return {String} string representation of an instance\n */\n toString() {\n return `#`;\n }\n}\n","import type { TPointerEvent } from '../EventTypeDefs';\nimport { Point } from '../Point';\nimport { getScrollLeftTop } from './dom_misc';\n\nconst touchEvents = ['touchstart', 'touchmove', 'touchend'];\n\nfunction getTouchInfo(event: TouchEvent | MouseEvent): MouseEvent | Touch {\n const touchProp = (event as TouchEvent).changedTouches;\n if (touchProp && touchProp[0]) {\n return touchProp[0];\n }\n return event as MouseEvent;\n}\n\nexport const getPointer = (event: TPointerEvent): Point => {\n const element = event.target as HTMLElement,\n scroll = getScrollLeftTop(element),\n _evt = getTouchInfo(event);\n return new Point(_evt.clientX + scroll.left, _evt.clientY + scroll.top);\n};\n\nexport const isTouchEvent = (event: TPointerEvent) =>\n touchEvents.includes(event.type) ||\n (event as PointerEvent).pointerType === 'touch';\n\nexport const stopEvent = (e: Event) => {\n e.preventDefault();\n e.stopPropagation();\n};\n","import type { XY } from '../../Point';\nimport type { TBBox } from '../../typedefs';\n\n/**\n * Calculates bounding box (left, top, width, height) from given `points`\n * @param {XY[]} points\n * @return {Object} Object with left, top, width, height properties\n */\nexport const makeBoundingBoxFromPoints = (points: XY[]): TBBox => {\n let left = 0,\n top = 0,\n width = 0,\n height = 0;\n\n for (let i = 0, len = points.length; i < len; i++) {\n const { x, y } = points[i];\n if (x > width || !i) width = x;\n if (x < left || !i) left = x;\n if (y > height || !i) height = y;\n if (y < top || !i) top = y;\n }\n\n return {\n left,\n top,\n width: width - left,\n height: height - top,\n };\n};\n","import { Point } from '../../Point';\nimport { CENTER } from '../../constants';\nimport type { FabricObject } from '../../shapes/Object/Object';\nimport type { TMat2D } from '../../typedefs';\nimport { makeBoundingBoxFromPoints } from './boundingBoxFromPoints';\nimport {\n invertTransform,\n multiplyTransformMatrices,\n qrDecompose,\n} from './matrix';\n\n/**\n * given an object and a transform, apply the inverse transform to the object,\n * this is equivalent to remove from that object that transformation, so that\n * added in a space with the removed transform, the object will be the same as before.\n * Removing from an object a transform that scale by 2 is like scaling it by 1/2.\n * Removing from an object a transform that rotate by 30deg is like rotating by 30deg\n * in the opposite direction.\n * This util is used to add objects inside transformed groups or nested groups.\n * @param {FabricObject} object the object you want to transform\n * @param {TMat2D} transform the destination transform\n */\nexport const removeTransformFromObject = (\n object: FabricObject,\n transform: TMat2D,\n) => {\n const inverted = invertTransform(transform),\n finalTransform = multiplyTransformMatrices(\n inverted,\n object.calcOwnMatrix(),\n );\n applyTransformToObject(object, finalTransform);\n};\n\n/**\n * given an object and a transform, apply the transform to the object.\n * this is equivalent to change the space where the object is drawn.\n * Adding to an object a transform that scale by 2 is like scaling it by 2.\n * This is used when removing an object from an active selection for example.\n * @param {FabricObject} object the object you want to transform\n * @param {Array} transform the destination transform\n */\nexport const addTransformToObject = (object: FabricObject, transform: TMat2D) =>\n applyTransformToObject(\n object,\n multiplyTransformMatrices(transform, object.calcOwnMatrix()),\n );\n\n/**\n * discard an object transform state and apply the one from the matrix.\n * @param {FabricObject} object the object you want to transform\n * @param {Array} transform the destination transform\n */\nexport const applyTransformToObject = (\n object: FabricObject,\n transform: TMat2D,\n) => {\n const { translateX, translateY, scaleX, scaleY, ...otherOptions } =\n qrDecompose(transform),\n center = new Point(translateX, translateY);\n object.flipX = false;\n object.flipY = false;\n Object.assign(object, otherOptions);\n object.set({ scaleX, scaleY });\n object.setPositionByOrigin(center, CENTER, CENTER);\n};\n/**\n * reset an object transform state to neutral. Top and left are not accounted for\n * @param {FabricObject} target object to transform\n */\nexport const resetObjectTransform = (target: FabricObject) => {\n target.scaleX = 1;\n target.scaleY = 1;\n target.skewX = 0;\n target.skewY = 0;\n target.flipX = false;\n target.flipY = false;\n target.rotate(0);\n};\n\n/**\n * Extract Object transform values\n * @param {FabricObject} target object to read from\n * @return {Object} Components of transform\n */\nexport const saveObjectTransform = (target: FabricObject) => ({\n scaleX: target.scaleX,\n scaleY: target.scaleY,\n skewX: target.skewX,\n skewY: target.skewY,\n angle: target.angle,\n left: target.left,\n flipX: target.flipX,\n flipY: target.flipY,\n top: target.top,\n});\n\n/**\n * given a width and height, return the size of the bounding box\n * that can contains the box with width/height with applied transform.\n * Use to calculate the boxes around objects for controls.\n * @param {Number} width\n * @param {Number} height\n * @param {TMat2D} t\n * @returns {Point} size\n */\nexport const sizeAfterTransform = (\n width: number,\n height: number,\n t: TMat2D,\n) => {\n const dimX = width / 2,\n dimY = height / 2,\n points = [\n new Point(-dimX, -dimY),\n new Point(dimX, -dimY),\n new Point(-dimX, dimY),\n new Point(dimX, dimY),\n ].map((p) => p.transform(t)),\n bbox = makeBoundingBoxFromPoints(points);\n return new Point(bbox.width, bbox.height);\n};\n","import { iMatrix } from '../../constants';\nimport type { Point } from '../../Point';\nimport type { FabricObject } from '../../shapes/Object/Object';\nimport type { TMat2D } from '../../typedefs';\nimport { invertTransform, multiplyTransformMatrices } from './matrix';\nimport { applyTransformToObject } from './objectTransforms';\n\n/**\n * We are actually looking for the transformation from the destination plane to the source plane (change of basis matrix)\\\n * The object will exist on the destination plane and we want it to seem unchanged by it so we invert the destination matrix (`to`) and then apply the source matrix (`from`)\n * @param [from]\n * @param [to]\n * @returns\n */\nexport const calcPlaneChangeMatrix = (\n from: TMat2D = iMatrix,\n to: TMat2D = iMatrix,\n) => multiplyTransformMatrices(invertTransform(to), from);\n\n/**\n * Sends a point from the source coordinate plane to the destination coordinate plane.\\\n * From the canvas/viewer's perspective the point remains unchanged.\n *\n * @example Send point from canvas plane to group plane\n * var obj = new Rect({ left: 20, top: 20, width: 60, height: 60, strokeWidth: 0 });\n * var group = new Group([obj], { strokeWidth: 0 });\n * var sentPoint1 = sendPointToPlane(new Point(50, 50), undefined, group.calcTransformMatrix());\n * var sentPoint2 = sendPointToPlane(new Point(50, 50), iMatrix, group.calcTransformMatrix());\n * console.log(sentPoint1, sentPoint2) // both points print (0,0) which is the center of group\n *\n * @param {Point} point\n * @param {TMat2D} [from] plane matrix containing object. Passing `undefined` is equivalent to passing the identity matrix, which means `point` exists in the canvas coordinate plane.\n * @param {TMat2D} [to] destination plane matrix to contain object. Passing `undefined` means `point` should be sent to the canvas coordinate plane.\n * @returns {Point} transformed point\n */\nexport const sendPointToPlane = (\n point: Point,\n from: TMat2D = iMatrix,\n to: TMat2D = iMatrix,\n): Point => point.transform(calcPlaneChangeMatrix(from, to));\n\n/**\n * See {@link sendPointToPlane}\n */\nexport const sendVectorToPlane = (\n point: Point,\n from: TMat2D = iMatrix,\n to: TMat2D = iMatrix,\n): Point => point.transform(calcPlaneChangeMatrix(from, to), true);\n\n/**\n *\n * A util that abstracts applying transform to objects.\\\n * Sends `object` to the destination coordinate plane by applying the relevant transformations.\\\n * Changes the space/plane where `object` is drawn.\\\n * From the canvas/viewer's perspective `object` remains unchanged.\n *\n * @example Move clip path from one object to another while preserving it's appearance as viewed by canvas/viewer\n * let obj, obj2;\n * let clipPath = new Circle({ radius: 50 });\n * obj.clipPath = clipPath;\n * // render\n * sendObjectToPlane(clipPath, obj.calcTransformMatrix(), obj2.calcTransformMatrix());\n * obj.clipPath = undefined;\n * obj2.clipPath = clipPath;\n * // render, clipPath now clips obj2 but seems unchanged from the eyes of the viewer\n *\n * @example Clip an object's clip path with an existing object\n * let obj, existingObj;\n * let clipPath = new Circle({ radius: 50 });\n * obj.clipPath = clipPath;\n * let transformTo = multiplyTransformMatrices(obj.calcTransformMatrix(), clipPath.calcTransformMatrix());\n * sendObjectToPlane(existingObj, existingObj.group?.calcTransformMatrix(), transformTo);\n * clipPath.clipPath = existingObj;\n *\n * @param {FabricObject} object\n * @param {Matrix} [from] plane matrix containing object. Passing `undefined` is equivalent to passing the identity matrix, which means `object` is a direct child of canvas.\n * @param {Matrix} [to] destination plane matrix to contain object. Passing `undefined` means `object` should be sent to the canvas coordinate plane.\n * @returns {Matrix} the transform matrix that was applied to `object`\n */\nexport const sendObjectToPlane = (\n object: FabricObject,\n from?: TMat2D,\n to?: TMat2D,\n): TMat2D => {\n const t = calcPlaneChangeMatrix(from, to);\n applyTransformToObject(\n object,\n multiplyTransformMatrices(t, object.calcOwnMatrix()),\n );\n return t;\n};\n","import type {\n ObjectModificationEvents,\n TModificationEvents,\n} from '../EventTypeDefs';\n\nexport const fireEvent = (\n eventName: TModificationEvents,\n options: ObjectModificationEvents[typeof eventName],\n) => {\n const {\n transform: { target },\n } = options;\n target.canvas?.fire(`object:${eventName}`, {\n ...options,\n target,\n });\n target.fire(eventName, options);\n};\n","import type { TOriginX, TOriginY } from '../../typedefs';\n\nconst originOffset = {\n left: -0.5,\n top: -0.5,\n center: 0,\n bottom: 0.5,\n right: 0.5,\n};\n/**\n * Resolves origin value relative to center\n * @private\n * @param {TOriginX | TOriginY} originValue originX / originY\n * @returns number\n */\n\nexport const resolveOrigin = (\n originValue: TOriginX | TOriginY | number,\n): number =>\n typeof originValue === 'string'\n ? originOffset[originValue]\n : originValue - 0.5;\n","import type { XY } from '../../Point';\nimport { Point } from '../../Point';\nimport type { TRadian } from '../../typedefs';\n\nconst unitVectorX = new Point(1, 0);\nconst zero = new Point();\n\n/**\n * Rotates `vector` with `radians`\n * @param {Point} vector The vector to rotate (x and y)\n * @param {Number} radians The radians of the angle for the rotation\n * @return {Point} The new rotated point\n */\nexport const rotateVector = (vector: Point, radians: TRadian) =>\n vector.rotate(radians);\n\n/**\n * Creates a vector from points represented as a point\n *\n * @param {Point} from\n * @param {Point} to\n * @returns {Point} vector\n */\nexport const createVector = (from: XY, to: XY): Point =>\n new Point(to).subtract(from);\n\n/**\n * return the magnitude of a vector\n * @return {number}\n */\nexport const magnitude = (point: Point) => point.distanceFrom(zero);\n\n/**\n * Calculates the angle between 2 vectors\n * @param {Point} a\n * @param {Point} b\n * @returns the angle in radians from `a` to `b`\n */\nexport const calcAngleBetweenVectors = (a: Point, b: Point): TRadian =>\n Math.atan2(crossProduct(a, b), dotProduct(a, b)) as TRadian;\n\n/**\n * Calculates the angle between the x axis and the vector\n * @param {Point} v\n * @returns the angle in radians of `v`\n */\nexport const calcVectorRotation = (v: Point) =>\n calcAngleBetweenVectors(unitVectorX, v);\n\n/**\n * @param {Point} v\n * @returns {Point} vector representing the unit vector pointing to the direction of `v`\n */\nexport const getUnitVector = (v: Point): Point =>\n v.eq(zero) ? v : v.scalarDivide(magnitude(v));\n\n/**\n * @param {Point} v\n * @param {Boolean} [counterClockwise] the direction of the orthogonal vector, defaults to `true`\n * @returns {Point} the unit orthogonal vector\n */\nexport const getOrthonormalVector = (\n v: Point,\n counterClockwise = true,\n): Point =>\n getUnitVector(new Point(-v.y, v.x).scalarMultiply(counterClockwise ? 1 : -1));\n\n/**\n * Cross product of two vectors in 2D\n * @param {Point} a\n * @param {Point} b\n * @returns {number} the magnitude of Z vector\n */\nexport const crossProduct = (a: Point, b: Point): number =>\n a.x * b.y - a.y * b.x;\n\n/**\n * Dot product of two vectors in 2D\n * @param {Point} a\n * @param {Point} b\n * @returns {number}\n */\nexport const dotProduct = (a: Point, b: Point): number => a.x * b.x + a.y * b.y;\n\n/**\n * Checks if the vector is between two others. It is considered\n * to be inside when the vector to be tested is between the\n * initial vector and the final vector (included) in a counterclockwise direction.\n * @param {Point} t vector to be tested\n * @param {Point} a initial vector\n * @param {Point} b final vector\n * @returns {boolean} true if the vector is among the others\n */\nexport const isBetweenVectors = (t: Point, a: Point, b: Point): boolean => {\n if (t.eq(a) || t.eq(b)) return true;\n const AxB = crossProduct(a, b),\n AxT = crossProduct(a, t),\n BxT = crossProduct(b, t);\n return AxB >= 0 ? AxT >= 0 && BxT <= 0 : !(AxT <= 0 && BxT >= 0);\n};\n","import type {\n TPointerEvent,\n Transform,\n TransformAction,\n BasicTransformEvent,\n} from '../EventTypeDefs';\nimport { resolveOrigin } from '../util/misc/resolveOrigin';\nimport { Point } from '../Point';\nimport type { FabricObject } from '../shapes/Object/FabricObject';\nimport type { TOriginX, TOriginY } from '../typedefs';\nimport { degreesToRadians } from '../util/misc/radiansDegreesConversion';\nimport type { Control } from './Control';\nimport { CENTER, quarterPI, twoMathPi } from '../constants';\nimport { calcVectorRotation, createVector } from '../util/misc/vectors';\nimport type { TOCoord } from '../shapes/Object/InteractiveObject';\nimport { sendPointToPlane } from '../util/misc/planeChange';\n\nexport const NOT_ALLOWED_CURSOR = 'not-allowed';\n\n/**\n * @param {Boolean} alreadySelected true if target is already selected\n * @param {String} corner a string representing the corner ml, mr, tl ...\n * @param {Event} e Event object\n * @param {FabricObject} [target] inserted back to help overriding. Unused\n */\nexport const getActionFromCorner = (\n alreadySelected: boolean,\n corner: string | undefined,\n e: TPointerEvent,\n target: FabricObject,\n) => {\n if (!corner || !alreadySelected) {\n return 'drag';\n }\n const control = target.controls[corner];\n return control.getActionName(e, control, target);\n};\n\n/**\n * Checks if transform is centered\n * @param {Object} transform transform data\n * @return {Boolean} true if transform is centered\n */\nexport function isTransformCentered(transform: Transform) {\n return (\n resolveOrigin(transform.originX) === resolveOrigin(CENTER) &&\n resolveOrigin(transform.originY) === resolveOrigin(CENTER)\n );\n}\n\nexport function invertOrigin(origin: TOriginX | TOriginY) {\n return -resolveOrigin(origin) + 0.5;\n}\n\nexport const isLocked = (\n target: FabricObject,\n lockingKey:\n | 'lockMovementX'\n | 'lockMovementY'\n | 'lockRotation'\n | 'lockScalingX'\n | 'lockScalingY'\n | 'lockSkewingX'\n | 'lockSkewingY'\n | 'lockScalingFlip',\n) => target[lockingKey];\n\nexport const commonEventInfo: TransformAction<\n Transform,\n BasicTransformEvent\n> = (eventData, transform, x, y) => {\n return {\n e: eventData,\n transform,\n pointer: new Point(x, y),\n };\n};\n\n/**\n * Combine control position and object angle to find the control direction compared\n * to the object center.\n * @param {FabricObject} fabricObject the fabric object for which we are rendering controls\n * @param {Control} control the control class\n * @return {Number} 0 - 7 a quadrant number\n */\nexport function findCornerQuadrant(\n fabricObject: FabricObject,\n control: Control,\n coord: TOCoord,\n): number {\n const target = coord;\n const center = sendPointToPlane(\n fabricObject.getCenterPoint(),\n fabricObject.canvas!.viewportTransform,\n undefined,\n );\n const angle = calcVectorRotation(createVector(center, target)) + twoMathPi;\n return Math.round((angle % twoMathPi) / quarterPI);\n}\n\n/**\n * @returns the normalized point (rotated relative to center) in local coordinates\n */\nfunction normalizePoint(\n target: FabricObject,\n point: Point,\n originX: TOriginX,\n originY: TOriginY,\n): Point {\n const center = target.getRelativeCenterPoint(),\n p =\n typeof originX !== 'undefined' && typeof originY !== 'undefined'\n ? target.translateToGivenOrigin(\n center,\n CENTER,\n CENTER,\n originX,\n originY,\n )\n : new Point(target.left, target.top),\n p2 = target.angle\n ? point.rotate(-degreesToRadians(target.angle), center)\n : point;\n return p2.subtract(p);\n}\n\n/**\n * Transforms a point to the offset from the given origin\n * @param {Object} transform\n * @param {String} originX\n * @param {String} originY\n * @param {number} x\n * @param {number} y\n * @return {Fabric.Point} the normalized point\n */\nexport function getLocalPoint(\n { target, corner }: Transform,\n originX: TOriginX,\n originY: TOriginY,\n x: number,\n y: number,\n) {\n const control = target.controls[corner],\n zoom = target.canvas?.getZoom() || 1,\n padding = target.padding / zoom,\n localPoint = normalizePoint(target, new Point(x, y), originX, originY);\n if (localPoint.x >= padding) {\n localPoint.x -= padding;\n }\n if (localPoint.x <= -padding) {\n localPoint.x += padding;\n }\n if (localPoint.y >= padding) {\n localPoint.y -= padding;\n }\n if (localPoint.y <= padding) {\n localPoint.y += padding;\n }\n localPoint.x -= control.offsetX;\n localPoint.y -= control.offsetY;\n return localPoint;\n}\n","import type { TransformActionHandler } from '../EventTypeDefs';\nimport { LEFT, TOP, MOVING } from '../constants';\nimport { fireEvent } from './fireEvent';\nimport { commonEventInfo, isLocked } from './util';\n\n/**\n * Action handler\n * @private\n * @param {Event} eventData javascript event that is doing the transform\n * @param {Object} transform javascript object containing a series of information around the current transform\n * @param {number} x current mouse x position, canvas normalized\n * @param {number} y current mouse y position, canvas normalized\n * @return {Boolean} true if the translation occurred\n */\nexport const dragHandler: TransformActionHandler = (\n eventData,\n transform,\n x,\n y,\n) => {\n const { target, offsetX, offsetY } = transform,\n newLeft = x - offsetX,\n newTop = y - offsetY,\n moveX = !isLocked(target, 'lockMovementX') && target.left !== newLeft,\n moveY = !isLocked(target, 'lockMovementY') && target.top !== newTop;\n moveX && target.set(LEFT, newLeft);\n moveY && target.set(TOP, newTop);\n if (moveX || moveY) {\n fireEvent(MOVING, commonEventInfo(eventData, transform, x, y));\n }\n return moveX || moveY;\n};\n","/**\n * Map of the 148 color names with HEX code\n * @see: https://www.w3.org/TR/css3-color/#svg-color\n */\nexport const ColorNameMap = {\n aliceblue: '#F0F8FF',\n antiquewhite: '#FAEBD7',\n aqua: '#0FF',\n aquamarine: '#7FFFD4',\n azure: '#F0FFFF',\n beige: '#F5F5DC',\n bisque: '#FFE4C4',\n black: '#000',\n blanchedalmond: '#FFEBCD',\n blue: '#00F',\n blueviolet: '#8A2BE2',\n brown: '#A52A2A',\n burlywood: '#DEB887',\n cadetblue: '#5F9EA0',\n chartreuse: '#7FFF00',\n chocolate: '#D2691E',\n coral: '#FF7F50',\n cornflowerblue: '#6495ED',\n cornsilk: '#FFF8DC',\n crimson: '#DC143C',\n cyan: '#0FF',\n darkblue: '#00008B',\n darkcyan: '#008B8B',\n darkgoldenrod: '#B8860B',\n darkgray: '#A9A9A9',\n darkgrey: '#A9A9A9',\n darkgreen: '#006400',\n darkkhaki: '#BDB76B',\n darkmagenta: '#8B008B',\n darkolivegreen: '#556B2F',\n darkorange: '#FF8C00',\n darkorchid: '#9932CC',\n darkred: '#8B0000',\n darksalmon: '#E9967A',\n darkseagreen: '#8FBC8F',\n darkslateblue: '#483D8B',\n darkslategray: '#2F4F4F',\n darkslategrey: '#2F4F4F',\n darkturquoise: '#00CED1',\n darkviolet: '#9400D3',\n deeppink: '#FF1493',\n deepskyblue: '#00BFFF',\n dimgray: '#696969',\n dimgrey: '#696969',\n dodgerblue: '#1E90FF',\n firebrick: '#B22222',\n floralwhite: '#FFFAF0',\n forestgreen: '#228B22',\n fuchsia: '#F0F',\n gainsboro: '#DCDCDC',\n ghostwhite: '#F8F8FF',\n gold: '#FFD700',\n goldenrod: '#DAA520',\n gray: '#808080',\n grey: '#808080',\n green: '#008000',\n greenyellow: '#ADFF2F',\n honeydew: '#F0FFF0',\n hotpink: '#FF69B4',\n indianred: '#CD5C5C',\n indigo: '#4B0082',\n ivory: '#FFFFF0',\n khaki: '#F0E68C',\n lavender: '#E6E6FA',\n lavenderblush: '#FFF0F5',\n lawngreen: '#7CFC00',\n lemonchiffon: '#FFFACD',\n lightblue: '#ADD8E6',\n lightcoral: '#F08080',\n lightcyan: '#E0FFFF',\n lightgoldenrodyellow: '#FAFAD2',\n lightgray: '#D3D3D3',\n lightgrey: '#D3D3D3',\n lightgreen: '#90EE90',\n lightpink: '#FFB6C1',\n lightsalmon: '#FFA07A',\n lightseagreen: '#20B2AA',\n lightskyblue: '#87CEFA',\n lightslategray: '#789',\n lightslategrey: '#789',\n lightsteelblue: '#B0C4DE',\n lightyellow: '#FFFFE0',\n lime: '#0F0',\n limegreen: '#32CD32',\n linen: '#FAF0E6',\n magenta: '#F0F',\n maroon: '#800000',\n mediumaquamarine: '#66CDAA',\n mediumblue: '#0000CD',\n mediumorchid: '#BA55D3',\n mediumpurple: '#9370DB',\n mediumseagreen: '#3CB371',\n mediumslateblue: '#7B68EE',\n mediumspringgreen: '#00FA9A',\n mediumturquoise: '#48D1CC',\n mediumvioletred: '#C71585',\n midnightblue: '#191970',\n mintcream: '#F5FFFA',\n mistyrose: '#FFE4E1',\n moccasin: '#FFE4B5',\n navajowhite: '#FFDEAD',\n navy: '#000080',\n oldlace: '#FDF5E6',\n olive: '#808000',\n olivedrab: '#6B8E23',\n orange: '#FFA500',\n orangered: '#FF4500',\n orchid: '#DA70D6',\n palegoldenrod: '#EEE8AA',\n palegreen: '#98FB98',\n paleturquoise: '#AFEEEE',\n palevioletred: '#DB7093',\n papayawhip: '#FFEFD5',\n peachpuff: '#FFDAB9',\n peru: '#CD853F',\n pink: '#FFC0CB',\n plum: '#DDA0DD',\n powderblue: '#B0E0E6',\n purple: '#800080',\n rebeccapurple: '#639',\n red: '#F00',\n rosybrown: '#BC8F8F',\n royalblue: '#4169E1',\n saddlebrown: '#8B4513',\n salmon: '#FA8072',\n sandybrown: '#F4A460',\n seagreen: '#2E8B57',\n seashell: '#FFF5EE',\n sienna: '#A0522D',\n silver: '#C0C0C0',\n skyblue: '#87CEEB',\n slateblue: '#6A5ACD',\n slategray: '#708090',\n slategrey: '#708090',\n snow: '#FFFAFA',\n springgreen: '#00FF7F',\n steelblue: '#4682B4',\n tan: '#D2B48C',\n teal: '#008080',\n thistle: '#D8BFD8',\n tomato: '#FF6347',\n turquoise: '#40E0D0',\n violet: '#EE82EE',\n wheat: '#F5DEB3',\n white: '#FFF',\n whitesmoke: '#F5F5F5',\n yellow: '#FF0',\n yellowgreen: '#9ACD32',\n};\n","/**\n * Regex matching color in RGB or RGBA formats (ex: `rgb(0, 0, 0)`, `rgba(255, 100, 10, 0.5)`, `rgba( 255 , 100 , 10 , 0.5 )`, `rgb(1,1,1)`, `rgba(100%, 60%, 10%, 0.5)`)\n * Also matching rgba(r g b / a) as per new specs\n * https://developer.mozilla.org/en-US/docs/Web/CSS/color_value/rgb\n * Formal syntax at the time of writing:\n * =\n * rgb( [ | none ]{3} [ / [ | none ] ]? ) |\n * rgb( [ | none ]{3} [ / [ | none ] ]? )\n * = | \n *\n * For learners this is how you can read this regex\n * Regular expression for matching an rgba or rgb CSS color value\n *\n * /^ # Beginning of the string\n * rgba? # \"rgb\" or \"rgba\"\n * \\(\\s* # Opening parenthesis and optional whitespace\n * (\\d{0,3} # 0 to three digits R channel\n * (?:\\.\\d+)? # Optional decimal with one or more digits\n * ) # End of capturing group for the first color component\n * %? # Optional percent sign after the first color component\n * \\s* # Optional whitespace\n * [\\s|,] # Separator between color components can be a space or comma\n * \\s* # Optional whitespace\n * (\\d{0,3} # 0 to three digits G channel\n * (?:\\.\\d+)? # Optional decimal with one or more digits\n * ) # End of capturing group for the second color component\n * %? # Optional percent sign after the second color component\n * \\s* # Optional whitespace\n * [\\s|,] # Separator between color components can be a space or comma\n * \\s* # Optional whitespace\n * (\\d{0,3} # 0 to three digits B channel\n * (?:\\.\\d+)? # Optional decimal with one or more digits\n * ) # End of capturing group for the third color component\n * %? # Optional percent sign after the third color component\n * \\s* # Optional whitespace\n * (?: # Beginning of non-capturing group for alpha value\n * \\s* # Optional whitespace\n * [,/] # Comma or slash separator for alpha value\n * \\s* # Optional whitespace\n * (\\d{0,3} # Zero to three digits\n * (?:\\.\\d+)? # Optional decimal with one or more digits\n * ) # End of capturing group for alpha value\n * %? # Optional percent sign after alpha value\n * \\s* # Optional whitespace\n * )? # End of non-capturing group for alpha value (optional)\n * \\) # Closing parenthesis\n * $ # End of the string\n *\n * The alpha channel can be in the format 0.4 .7 or 1 or 73%\n *\n * WARNING this regex doesn't fail on off spec colors. it matches everything that could be a color.\n * So the spec does not allow for `rgba(30 , 45% 35, 49%)` but this will work anyways for us\n */\nexport const reRGBa = () =>\n /^rgba?\\(\\s*(\\d{0,3}(?:\\.\\d+)?%?)\\s*[\\s|,]\\s*(\\d{0,3}(?:\\.\\d+)?%?)\\s*[\\s|,]\\s*(\\d{0,3}(?:\\.\\d+)?%?)\\s*(?:\\s*[,/]\\s*(\\d{0,3}(?:\\.\\d+)?%?)\\s*)?\\)$/i;\n\n/**\n * Regex matching color in HSL or HSLA formats (ex: hsl(0, 0, 0), rgba(255, 100, 10, 0.5), rgba( 255 , 100 , 10 , 0.5 ), rgb(1,1,1), rgba(100%, 60%, 10%, 0.5))\n * Also matching rgba(r g b / a) as per new specs\n * https://developer.mozilla.org/en-US/docs/Web/CSS/color_value/hsl\n * Formal syntax at the time of writing:\n * =\n * hsl( [ | none ] [ | none ] [ | none ] [ / [ | none ] ]? )\n *\n * =\n * |\n * \n *\n * =\n * |\n * \n *\n * For learners this is how you can read this regex\n * Regular expression for matching an hsla or hsl CSS color value\n *\n * /^hsla?\\( // Matches the beginning of the string and the opening parenthesis of \"hsl\" or \"hsla\"\n * \\s* // Matches any whitespace characters (space, tab, etc.) zero or more times\n * (\\d{0,3} // Hue: 0 to three digits - start capture in a group\n * (?:\\.\\d+)? // Hue: Optional (non capture group) decimal with one or more digits.\n * (?:deg|turn|rad)? // Hue: Optionally include suffix deg or turn or rad\n * ) // Hue: End capture group\n * \\s* // Matches any whitespace characters zero or more times\n * [\\s|,] // Matches a space, tab or comma\n * \\s* // Matches any whitespace characters zero or more times\n * (\\d{0,3} // Saturation: 0 to three digits - start capture in a group\n * (?:\\.\\d+)? // Saturation: Optional decimal with one or more digits in a non-capturing group\n * %?) // Saturation: match optional % character and end capture group\n * \\s* // Matches any whitespace characters zero or more times\n * [\\s|,] // Matches a space, tab or comma\n * \\s* // Matches any whitespace characters zero or more times\n * (\\d{0,3} // Lightness: 0 to three digits - start capture in a group\n * (?:\\.\\d+)? // Lightness: Optional decimal with one or more digits in a non-capturing group\n * %?) // Lightness: match % character and end capture group\n * \\s* // Matches any whitespace characters zero or more times\n * (?: // Alpha: Begins a non-capturing group for the alpha value\n * \\s* // Matches any whitespace characters zero or more times\n * [,/] // Matches a comma or forward slash\n * \\s* // Matches any whitespace characters zero or more times\n * (\\d*(?:\\.\\d+)?%?) // Matches zero or more digits, optionally followed by a decimal point and one or more digits, followed by an optional percentage sign and captures it in a group\n * \\s* // Matches any whitespace characters zero or more times\n * )? // Makes the alpha value group optional\n * \\) // Matches the closing parenthesis\n * $/i // Matches the end of the string and sets the regular expression to case-insensitive mode\n *\n * WARNING this regex doesn't fail on off spec colors. It matches everything that could be a color.\n * So the spec does not allow `hsl(30 , 45% 35, 49%)` but this will work anyways for us.\n */\nexport const reHSLa = () =>\n /^hsla?\\(\\s*([+-]?\\d{0,3}(?:\\.\\d+)?(?:deg|turn|rad)?)\\s*[\\s|,]\\s*(\\d{0,3}(?:\\.\\d+)?%?)\\s*[\\s|,]\\s*(\\d{0,3}(?:\\.\\d+)?%?)\\s*(?:\\s*[,/]\\s*(\\d*(?:\\.\\d+)?%?)\\s*)?\\)$/i;\n\n/**\n * Regex matching color in HEX format (ex: #FF5544CC, #FF5555, 010155, aff)\n */\nexport const reHex = () => /^#?(([0-9a-f]){3,4}|([0-9a-f]{2}){3,4})$/i;\n","import type { TRGBAColorSource } from './typedefs';\n\n/**\n * @param {Number} p\n * @param {Number} q\n * @param {Number} t\n * @return {Number}\n */\nexport const hue2rgb = (p: number, q: number, t: number): number => {\n if (t < 0) {\n t += 1;\n }\n if (t > 1) {\n t -= 1;\n }\n if (t < 1 / 6) {\n return p + (q - p) * 6 * t;\n }\n if (t < 1 / 2) {\n return q;\n }\n if (t < 2 / 3) {\n return p + (q - p) * (2 / 3 - t) * 6;\n }\n return p;\n};\n\n/**\n * Adapted from {@link https://gist.github.com/mjackson/5311256 https://gist.github.com/mjackson}\n * @param {Number} r Red color value\n * @param {Number} g Green color value\n * @param {Number} b Blue color value\n * @param {Number} a Alpha color value pass through\n * @return {TRGBColorSource} Hsl color\n */\nexport const rgb2Hsl = (\n r: number,\n g: number,\n b: number,\n a: number,\n): TRGBAColorSource => {\n r /= 255;\n g /= 255;\n b /= 255;\n const maxValue = Math.max(r, g, b),\n minValue = Math.min(r, g, b);\n\n let h!: number, s: number;\n const l = (maxValue + minValue) / 2;\n\n if (maxValue === minValue) {\n h = s = 0; // achromatic\n } else {\n const d = maxValue - minValue;\n s = l > 0.5 ? d / (2 - maxValue - minValue) : d / (maxValue + minValue);\n switch (maxValue) {\n case r:\n h = (g - b) / d + (g < b ? 6 : 0);\n break;\n case g:\n h = (b - r) / d + 2;\n break;\n case b:\n h = (r - g) / d + 4;\n break;\n }\n h /= 6;\n }\n\n return [Math.round(h * 360), Math.round(s * 100), Math.round(l * 100), a];\n};\n\nexport const fromAlphaToFloat = (value = '1') =>\n parseFloat(value) / (value.endsWith('%') ? 100 : 1);\n\n/**\n * Convert a value in the inclusive range [0, 255] to hex\n */\nexport const hexify = (value: number) =>\n Math.min(Math.round(value), 255).toString(16).toUpperCase().padStart(2, '0');\n\n/**\n * Calculate the grey average value for rgb and pass through alpha\n */\nexport const greyAverage = ([\n r,\n g,\n b,\n a = 1,\n]: TRGBAColorSource): TRGBAColorSource => {\n const avg = Math.round(r * 0.3 + g * 0.59 + b * 0.11);\n return [avg, avg, avg, a];\n};\n","import { radiansToDegrees } from '../util/misc/radiansDegreesConversion';\nimport { ColorNameMap } from './color_map';\nimport { reHSLa, reHex, reRGBa } from './constants';\nimport type { TRGBAColorSource, TColorArg } from './typedefs';\nimport {\n hue2rgb,\n hexify,\n rgb2Hsl,\n fromAlphaToFloat,\n greyAverage,\n} from './util';\n\n/**\n * @class Color common color operations\n * @tutorial {@link http://fabricjs.com/fabric-intro-part-2/#colors colors}\n */\nexport class Color {\n declare private _source: TRGBAColorSource;\n isUnrecognised = false;\n\n /**\n *\n * @param {string} [color] optional in hex or rgb(a) or hsl format or from known color list\n */\n constructor(color?: TColorArg) {\n if (!color) {\n // we default to black as canvas does\n this.setSource([0, 0, 0, 1]);\n } else if (color instanceof Color) {\n this.setSource([...color._source]);\n } else if (Array.isArray(color)) {\n const [r, g, b, a = 1] = color;\n this.setSource([r, g, b, a]);\n } else {\n this.setSource(this._tryParsingColor(color));\n }\n }\n\n /**\n * @private\n * @param {string} [color] Color value to parse\n * @returns {TRGBAColorSource}\n */\n protected _tryParsingColor(color: string) {\n color = color.toLowerCase();\n if (color in ColorNameMap) {\n color = ColorNameMap[color as keyof typeof ColorNameMap];\n }\n return color === 'transparent'\n ? ([255, 255, 255, 0] as TRGBAColorSource)\n : Color.sourceFromHex(color) ||\n Color.sourceFromRgb(color) ||\n Color.sourceFromHsl(color) ||\n // color is not recognized\n // we default to black as canvas does\n // eslint-disable-next-line no-constant-binary-expression\n ((this.isUnrecognised = true) && ([0, 0, 0, 1] as TRGBAColorSource));\n }\n\n /**\n * Returns source of this color (where source is an array representation; ex: [200, 200, 100, 1])\n * @return {TRGBAColorSource}\n */\n getSource() {\n return this._source;\n }\n\n /**\n * Sets source of this color (where source is an array representation; ex: [200, 200, 100, 1])\n * @param {TRGBAColorSource} source\n */\n setSource(source: TRGBAColorSource) {\n this._source = source;\n }\n\n /**\n * Returns color representation in RGB format\n * @return {String} ex: rgb(0-255,0-255,0-255)\n */\n toRgb() {\n const [r, g, b] = this.getSource();\n return `rgb(${r},${g},${b})`;\n }\n\n /**\n * Returns color representation in RGBA format\n * @return {String} ex: rgba(0-255,0-255,0-255,0-1)\n */\n toRgba() {\n return `rgba(${this.getSource().join(',')})`;\n }\n\n /**\n * Returns color representation in HSL format\n * @return {String} ex: hsl(0-360,0%-100%,0%-100%)\n */\n toHsl() {\n const [h, s, l] = rgb2Hsl(...this.getSource());\n return `hsl(${h},${s}%,${l}%)`;\n }\n\n /**\n * Returns color representation in HSLA format\n * @return {String} ex: hsla(0-360,0%-100%,0%-100%,0-1)\n */\n toHsla() {\n const [h, s, l, a] = rgb2Hsl(...this.getSource());\n return `hsla(${h},${s}%,${l}%,${a})`;\n }\n\n /**\n * Returns color representation in HEX format\n * @return {String} ex: FF5555\n */\n toHex() {\n const fullHex = this.toHexa();\n return fullHex.slice(0, 6);\n }\n\n /**\n * Returns color representation in HEXA format\n * @return {String} ex: FF5555CC\n */\n toHexa() {\n const [r, g, b, a] = this.getSource();\n return `${hexify(r)}${hexify(g)}${hexify(b)}${hexify(Math.round(a * 255))}`;\n }\n\n /**\n * Gets value of alpha channel for this color\n * @return {Number} 0-1\n */\n getAlpha() {\n return this.getSource()[3];\n }\n\n /**\n * Sets value of alpha channel for this color\n * @param {Number} alpha Alpha value 0-1\n * @return {Color} thisArg\n */\n setAlpha(alpha: number) {\n this._source[3] = alpha;\n return this;\n }\n\n /**\n * Transforms color to its grayscale representation\n * @return {Color} thisArg\n */\n toGrayscale() {\n this.setSource(greyAverage(this.getSource()));\n return this;\n }\n\n /**\n * Transforms color to its black and white representation\n * @param {Number} threshold\n * @return {Color} thisArg\n */\n toBlackWhite(threshold: number) {\n const [average, , , a] = greyAverage(this.getSource()),\n bOrW = average < (threshold || 127) ? 0 : 255;\n this.setSource([bOrW, bOrW, bOrW, a]);\n return this;\n }\n\n /**\n * Overlays color with another color\n * @param {String|Color} otherColor\n * @return {Color} thisArg\n */\n overlayWith(otherColor: string | Color) {\n if (!(otherColor instanceof Color)) {\n otherColor = new Color(otherColor);\n }\n\n const source = this.getSource(),\n otherAlpha = 0.5,\n otherSource = otherColor.getSource(),\n [R, G, B] = source.map((value, index) =>\n Math.round(value * (1 - otherAlpha) + otherSource[index] * otherAlpha),\n );\n\n this.setSource([R, G, B, source[3]]);\n return this;\n }\n\n /**\n * Returns new color object, when given a color in RGB format\n * @param {String} color Color value ex: rgb(0-255,0-255,0-255)\n * @return {Color}\n */\n static fromRgb(color: string): Color {\n return Color.fromRgba(color);\n }\n\n /**\n * Returns new color object, when given a color in RGBA format\n * @function\n * @param {String} color\n * @return {Color}\n */\n static fromRgba(color: string): Color {\n return new Color(Color.sourceFromRgb(color));\n }\n\n /**\n * Returns array representation (ex: [100, 100, 200, 1]) of a color that's in RGB or RGBA format\n * @param {String} color Color value ex: rgb(0-255,0-255,0-255), rgb(0%-100%,0%-100%,0%-100%)\n * @return {TRGBAColorSource | undefined} source\n */\n static sourceFromRgb(color: string): TRGBAColorSource | undefined {\n const match = color.match(reRGBa());\n if (match) {\n const [r, g, b] = match.slice(1, 4).map((value) => {\n const parsedValue = parseFloat(value);\n return value.endsWith('%')\n ? Math.round(parsedValue * 2.55)\n : parsedValue;\n });\n return [r, g, b, fromAlphaToFloat(match[4])];\n }\n }\n\n /**\n * Returns new color object, when given a color in HSL format\n * @param {String} color Color value ex: hsl(0-260,0%-100%,0%-100%)\n * @return {Color}\n */\n static fromHsl(color: string): Color {\n return Color.fromHsla(color);\n }\n\n /**\n * Returns new color object, when given a color in HSLA format\n * @function\n * @param {String} color\n * @return {Color}\n */\n static fromHsla(color: string): Color {\n return new Color(Color.sourceFromHsl(color));\n }\n\n /**\n * Returns array representation (ex: [100, 100, 200, 1]) of a color that's in HSL or HSLA format.\n * Adapted from https://github.com/mjijackson\n * @param {String} color Color value ex: hsl(0-360,0%-100%,0%-100%) or hsla(0-360,0%-100%,0%-100%, 0-1)\n * @return {TRGBAColorSource | undefined} source\n * @see http://http://www.w3.org/TR/css3-color/#hsl-color\n */\n static sourceFromHsl(color: string): TRGBAColorSource | undefined {\n const match = color.match(reHSLa());\n if (!match) {\n return;\n }\n const match1degrees = Color.parseAngletoDegrees(match[1]);\n\n const h = (((match1degrees % 360) + 360) % 360) / 360,\n s = parseFloat(match[2]) / 100,\n l = parseFloat(match[3]) / 100;\n let r: number, g: number, b: number;\n\n if (s === 0) {\n r = g = b = l;\n } else {\n const q = l <= 0.5 ? l * (s + 1) : l + s - l * s,\n p = l * 2 - q;\n\n r = hue2rgb(p, q, h + 1 / 3);\n g = hue2rgb(p, q, h);\n b = hue2rgb(p, q, h - 1 / 3);\n }\n\n return [\n Math.round(r * 255),\n Math.round(g * 255),\n Math.round(b * 255),\n fromAlphaToFloat(match[4]),\n ];\n }\n\n /**\n * Returns new color object, when given a color in HEX format\n * @param {String} color Color value ex: FF5555\n * @return {Color}\n */\n static fromHex(color: string): Color {\n return new Color(Color.sourceFromHex(color));\n }\n\n /**\n * Returns array representation (ex: [100, 100, 200, 1]) of a color that's in HEX format\n * @param {String} color ex: FF5555 or FF5544CC (RGBa)\n * @return {TRGBAColorSource | undefined} source\n */\n static sourceFromHex(color: string): TRGBAColorSource | undefined {\n if (color.match(reHex())) {\n const value = color.slice(color.indexOf('#') + 1),\n isShortNotation = value.length <= 4;\n let expandedValue: string[];\n if (isShortNotation) {\n expandedValue = value.split('').map((hex) => hex + hex);\n } else {\n expandedValue = value.match(/.{2}/g)!;\n }\n const [r, g, b, a = 255] = expandedValue.map((hexCouple) =>\n parseInt(hexCouple, 16),\n );\n return [r, g, b, a / 255];\n }\n }\n\n /**\n * Converts a string that could be any angle notation (50deg, 0.5turn, 2rad)\n * into degrees without the 'deg' suffix\n * @param {String} value ex: 0deg, 0.5turn, 2rad\n * @return {Number} number in degrees or NaN if inputs are invalid\n */\n static parseAngletoDegrees(value: string): number {\n const lowercase = value.toLowerCase();\n const numeric = parseFloat(lowercase);\n\n if (lowercase.includes('rad')) {\n return radiansToDegrees(numeric);\n }\n\n if (lowercase.includes('turn')) {\n return numeric * 360;\n }\n\n // Value is probably just a number already in degrees eg '50'\n return numeric;\n }\n}\n","import { Color } from '../../color/Color';\nimport { config } from '../../config';\nimport { DEFAULT_SVG_FONT_SIZE, FILL, NONE } from '../../constants';\nimport type { TBBox, SVGElementName, SupportedSVGUnit } from '../../typedefs';\nimport { toFixed } from './toFixed';\n\n/**\n * Returns array of attributes for given svg that fabric parses\n * @param {SVGElementName} type Type of svg element (eg. 'circle')\n * @return {Array} string names of supported attributes\n */\nexport const getSvgAttributes = (type: SVGElementName) => {\n const commonAttributes = ['instantiated_by_use', 'style', 'id', 'class'];\n switch (type) {\n case 'linearGradient':\n return commonAttributes.concat([\n 'x1',\n 'y1',\n 'x2',\n 'y2',\n 'gradientUnits',\n 'gradientTransform',\n ]);\n case 'radialGradient':\n return commonAttributes.concat([\n 'gradientUnits',\n 'gradientTransform',\n 'cx',\n 'cy',\n 'r',\n 'fx',\n 'fy',\n 'fr',\n ]);\n case 'stop':\n return commonAttributes.concat(['offset', 'stop-color', 'stop-opacity']);\n }\n return commonAttributes;\n};\n\n/**\n * Converts from attribute value to pixel value if applicable.\n * Returns converted pixels or original value not converted.\n * @param {string} value number to operate on\n * @param {number} fontSize\n * @return {number}\n */\nexport const parseUnit = (value: string, fontSize = DEFAULT_SVG_FONT_SIZE) => {\n const unit = /\\D{0,2}$/.exec(value),\n number = parseFloat(value);\n const dpi = config.DPI;\n switch (unit?.[0] as SupportedSVGUnit) {\n case 'mm':\n return (number * dpi) / 25.4;\n\n case 'cm':\n return (number * dpi) / 2.54;\n\n case 'in':\n return number * dpi;\n\n case 'pt':\n return (number * dpi) / 72; // or * 4 / 3\n\n case 'pc':\n return ((number * dpi) / 72) * 12; // or * 16\n\n case 'em':\n return number * fontSize;\n\n default:\n return number;\n }\n};\n\nexport type MeetOrSlice = 'meet' | 'slice';\n\nexport type MinMidMax = 'Min' | 'Mid' | 'Max' | 'none';\n\nexport type TPreserveArParsed = {\n meetOrSlice: MeetOrSlice;\n alignX: MinMidMax;\n alignY: MinMidMax;\n};\n\n// align can be either none or undefined or a combination of mid/max\nconst parseAlign = (align: string): MinMidMax[] => {\n //divide align in alignX and alignY\n if (align && align !== NONE) {\n return [align.slice(1, 4) as MinMidMax, align.slice(5, 8) as MinMidMax];\n } else if (align === NONE) {\n return [align, align];\n }\n return ['Mid', 'Mid'];\n};\n\n/**\n * Parse preserveAspectRatio attribute from element\n * https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/preserveAspectRatio\n * @param {string} attribute to be parsed\n * @return {Object} an object containing align and meetOrSlice attribute\n */\nexport const parsePreserveAspectRatioAttribute = (\n attribute: string,\n): TPreserveArParsed => {\n const [firstPart, secondPart] = attribute.trim().split(' ') as [\n MinMidMax,\n MeetOrSlice | undefined,\n ];\n const [alignX, alignY] = parseAlign(firstPart);\n return {\n meetOrSlice: secondPart || 'meet',\n alignX,\n alignY,\n };\n};\n\n/**\n * Adobe Illustrator (at least CS5) is unable to render rgba()-based fill values\n * we work around it by \"moving\" alpha channel into opacity attribute and setting fill's alpha to 1\n * @param prop\n * @param value\n * @param {boolean} inlineStyle The default is inline style, the separator used is \":\", The other is \"=\"\n * @returns\n */\nexport const colorPropToSVG = (\n prop: string,\n value?: any,\n inlineStyle = true,\n) => {\n let colorValue;\n let opacityValue;\n if (!value) {\n colorValue = 'none';\n } else if (value.toLive) {\n colorValue = `url(#SVGID_${value.id})`;\n } else {\n const color = new Color(value),\n opacity = color.getAlpha();\n\n colorValue = color.toRgb();\n if (opacity !== 1) {\n opacityValue = opacity.toString();\n }\n }\n if (inlineStyle) {\n return `${prop}: ${colorValue}; ${\n opacityValue ? `${prop}-opacity: ${opacityValue}; ` : ''\n }`;\n } else {\n return `${prop}=\"${colorValue}\" ${\n opacityValue ? `${prop}-opacity=\"${opacityValue}\" ` : ''\n }`;\n }\n};\n\nexport const createSVGRect = (\n color: string,\n { left, top, width, height }: TBBox,\n precision = config.NUM_FRACTION_DIGITS,\n) => {\n const svgColor = colorPropToSVG(FILL, color, false);\n const [x, y, w, h] = [left, top, width, height].map((value) =>\n toFixed(value, precision),\n );\n return ``;\n};\n","import type { TSVGReviver } from '../../typedefs';\nimport { uid } from '../../util/internals/uid';\nimport { colorPropToSVG } from '../../util/misc/svgParsing';\nimport { FILL, NONE, STROKE } from '../../constants';\nimport type { FabricObject } from './FabricObject';\nimport { isFiller } from '../../util/typeAssertions';\nimport { matrixToSVG } from '../../util/misc/svgExport';\n\nexport class FabricObjectSVGExportMixin {\n /**\n * When an object is being exported as SVG as a clippath, a reference inside the SVG is needed.\n * This reference is a UID in the fabric namespace and is temporary stored here.\n * @type {String}\n */\n declare clipPathId?: string;\n\n /**\n * Returns styles-string for svg-export\n * @param {Boolean} skipShadow a boolean to skip shadow filter output\n * @return {String}\n */\n getSvgStyles(\n this: FabricObjectSVGExportMixin & FabricObject,\n skipShadow?: boolean,\n ) {\n const fillRule = this.fillRule ? this.fillRule : 'nonzero',\n strokeWidth = this.strokeWidth ? this.strokeWidth : '0',\n strokeDashArray = this.strokeDashArray\n ? this.strokeDashArray.join(' ')\n : NONE,\n strokeDashOffset = this.strokeDashOffset ? this.strokeDashOffset : '0',\n strokeLineCap = this.strokeLineCap ? this.strokeLineCap : 'butt',\n strokeLineJoin = this.strokeLineJoin ? this.strokeLineJoin : 'miter',\n strokeMiterLimit = this.strokeMiterLimit ? this.strokeMiterLimit : '4',\n opacity = typeof this.opacity !== 'undefined' ? this.opacity : '1',\n visibility = this.visible ? '' : ' visibility: hidden;',\n filter = skipShadow ? '' : this.getSvgFilter(),\n fill = colorPropToSVG(FILL, this.fill),\n stroke = colorPropToSVG(STROKE, this.stroke);\n\n return [\n stroke,\n 'stroke-width: ',\n strokeWidth,\n '; ',\n 'stroke-dasharray: ',\n strokeDashArray,\n '; ',\n 'stroke-linecap: ',\n strokeLineCap,\n '; ',\n 'stroke-dashoffset: ',\n strokeDashOffset,\n '; ',\n 'stroke-linejoin: ',\n strokeLineJoin,\n '; ',\n 'stroke-miterlimit: ',\n strokeMiterLimit,\n '; ',\n fill,\n 'fill-rule: ',\n fillRule,\n '; ',\n 'opacity: ',\n opacity,\n ';',\n filter,\n visibility,\n ].join('');\n }\n\n /**\n * Returns filter for svg shadow\n * @return {String}\n */\n getSvgFilter(this: FabricObjectSVGExportMixin & FabricObject) {\n return this.shadow ? `filter: url(#SVGID_${this.shadow.id});` : '';\n }\n\n /**\n * Returns id attribute for svg output\n * @return {String}\n */\n getSvgCommons(\n this: FabricObjectSVGExportMixin & FabricObject & { id?: string },\n ) {\n return [\n this.id ? `id=\"${this.id}\" ` : '',\n this.clipPath\n ? `clip-path=\"url(#${\n (this.clipPath as FabricObjectSVGExportMixin & FabricObject)\n .clipPathId\n })\" `\n : '',\n ].join('');\n }\n\n /**\n * Returns transform-string for svg-export\n * @param {Boolean} use the full transform or the single object one.\n * @return {String}\n */\n getSvgTransform(\n this: FabricObjectSVGExportMixin & FabricObject,\n full?: boolean,\n additionalTransform = '',\n ) {\n const transform = full ? this.calcTransformMatrix() : this.calcOwnMatrix(),\n svgTransform = `transform=\"${matrixToSVG(transform)}`;\n return `${svgTransform}${additionalTransform}\" `;\n }\n\n /**\n * Returns svg representation of an instance\n * This function is implemented in each subclass\n * This is just because typescript otherwise cryies all the time\n * @return {Array} an array of strings with the specific svg representation\n * of the instance\n */\n _toSVG(_reviver?: TSVGReviver): string[] {\n return [''];\n }\n\n /**\n * Returns svg representation of an instance\n * @param {TSVGReviver} [reviver] Method for further parsing of svg representation.\n * @return {String} svg representation of an instance\n */\n toSVG(\n this: FabricObjectSVGExportMixin & FabricObject,\n reviver?: TSVGReviver,\n ) {\n return this._createBaseSVGMarkup(this._toSVG(reviver), {\n reviver,\n });\n }\n\n /**\n * Returns svg clipPath representation of an instance\n * @param {TSVGReviver} [reviver] Method for further parsing of svg representation.\n * @return {String} svg representation of an instance\n */\n toClipPathSVG(\n this: FabricObjectSVGExportMixin & FabricObject,\n reviver?: TSVGReviver,\n ) {\n return (\n '\\t' +\n this._createBaseClipPathSVGMarkup(this._toSVG(reviver), {\n reviver,\n })\n );\n }\n\n /**\n * @private\n */\n _createBaseClipPathSVGMarkup(\n this: FabricObjectSVGExportMixin & FabricObject,\n objectMarkup: string[],\n {\n reviver,\n additionalTransform = '',\n }: { reviver?: TSVGReviver; additionalTransform?: string } = {},\n ) {\n const commonPieces = [\n this.getSvgTransform(true, additionalTransform),\n this.getSvgCommons(),\n ].join(''),\n // insert commons in the markup, style and svgCommons\n index = objectMarkup.indexOf('COMMON_PARTS');\n objectMarkup[index] = commonPieces;\n return reviver ? reviver(objectMarkup.join('')) : objectMarkup.join('');\n }\n\n /**\n * @private\n */\n _createBaseSVGMarkup(\n this: FabricObjectSVGExportMixin & FabricObject,\n objectMarkup: string[],\n {\n noStyle,\n reviver,\n withShadow,\n additionalTransform,\n }: {\n noStyle?: boolean;\n reviver?: TSVGReviver;\n withShadow?: boolean;\n additionalTransform?: string;\n } = {},\n ): string {\n const styleInfo = noStyle ? '' : `style=\"${this.getSvgStyles()}\" `,\n shadowInfo = withShadow ? `style=\"${this.getSvgFilter()}\" ` : '',\n clipPath = this.clipPath as FabricObjectSVGExportMixin & FabricObject,\n vectorEffect = this.strokeUniform\n ? 'vector-effect=\"non-scaling-stroke\" '\n : '',\n absoluteClipPath = clipPath && clipPath.absolutePositioned,\n stroke = this.stroke,\n fill = this.fill,\n shadow = this.shadow,\n markup = [],\n // insert commons in the markup, style and svgCommons\n index = objectMarkup.indexOf('COMMON_PARTS');\n let clipPathMarkup;\n if (clipPath) {\n clipPath.clipPathId = `CLIPPATH_${uid()}`;\n clipPathMarkup = `\\n${clipPath.toClipPathSVG(reviver)}\\n`;\n }\n if (absoluteClipPath) {\n markup.push('\\n');\n }\n markup.push(\n '\\n',\n );\n const commonPieces = [\n styleInfo,\n vectorEffect,\n noStyle ? '' : this.addPaintOrder(),\n ' ',\n additionalTransform ? `transform=\"${additionalTransform}\" ` : '',\n ].join('');\n objectMarkup[index] = commonPieces;\n if (isFiller(fill)) {\n markup.push(fill.toSVG(this));\n }\n if (isFiller(stroke)) {\n markup.push(stroke.toSVG(this));\n }\n if (shadow) {\n markup.push(shadow.toSVG(this));\n }\n if (clipPath) {\n markup.push(clipPathMarkup);\n }\n markup.push(objectMarkup.join(''));\n markup.push('\\n');\n absoluteClipPath && markup.push('\\n');\n return reviver ? reviver(markup.join('')) : markup.join('');\n }\n\n addPaintOrder(this: FabricObjectSVGExportMixin & FabricObject) {\n return this.paintFirst !== FILL ? ` paint-order=\"${this.paintFirst}\" ` : '';\n }\n}\n","export function getSvgRegex(arr: string[]) {\n return new RegExp('^(' + arr.join('|') + ')\\\\b', 'i');\n}\n","import { FILL, LEFT, STROKE, reNewline } from '../../constants';\nimport type { TClassProperties } from '../../typedefs';\nimport type { FabricText } from './Text';\n\nexport const TEXT_DECORATION_THICKNESS = 'textDecorationThickness';\n\nconst fontProperties = [\n 'fontSize',\n 'fontWeight',\n 'fontFamily',\n 'fontStyle',\n] as const;\n\nexport const textDecorationProperties = [\n 'underline',\n 'overline',\n 'linethrough',\n] as const;\n\nexport const textLayoutProperties: string[] = [\n ...fontProperties,\n 'lineHeight',\n 'text',\n 'charSpacing',\n 'textAlign',\n 'styles',\n 'path',\n 'pathStartOffset',\n 'pathSide',\n 'pathAlign',\n];\n\nexport const additionalProps = [\n ...textLayoutProperties,\n ...textDecorationProperties,\n 'textBackgroundColor',\n 'direction',\n TEXT_DECORATION_THICKNESS,\n] as const;\n\nexport type StylePropertiesType =\n | 'fill'\n | 'stroke'\n | 'strokeWidth'\n | 'fontSize'\n | 'fontFamily'\n | 'fontWeight'\n | 'fontStyle'\n | 'textBackgroundColor'\n | 'deltaY'\n | 'overline'\n | 'underline'\n | 'linethrough'\n | typeof TEXT_DECORATION_THICKNESS;\n\nexport const styleProperties: Readonly = [\n ...fontProperties,\n ...textDecorationProperties,\n STROKE,\n 'strokeWidth',\n FILL,\n 'deltaY',\n 'textBackgroundColor',\n TEXT_DECORATION_THICKNESS,\n] as const;\n\n// @TODO: Many things here are configuration related and shouldn't be on the class nor prototype\n// regexes, list of properties that are not suppose to change by instances, magic consts.\n// this will be a separated effort\nexport const textDefaultValues: Partial> = {\n _reNewline: reNewline,\n _reSpacesAndTabs: /[ \\t\\r]/g,\n _reSpaceAndTab: /[ \\t\\r]/,\n _reWords: /\\S+/g,\n fontSize: 40,\n fontWeight: 'normal',\n fontFamily: 'Times New Roman',\n underline: false,\n overline: false,\n linethrough: false,\n textAlign: LEFT,\n fontStyle: 'normal',\n lineHeight: 1.16,\n textBackgroundColor: '',\n stroke: null,\n shadow: null,\n path: undefined,\n pathStartOffset: 0,\n pathSide: LEFT,\n pathAlign: 'baseline',\n charSpacing: 0,\n deltaY: 0,\n direction: 'ltr',\n CACHE_FONT_SIZE: 400,\n MIN_TEXT_WIDTH: 2,\n // Text magic numbers\n superscript: {\n size: 0.6, // fontSize factor\n baseline: -0.35, // baseline-shift factor (upwards)\n },\n subscript: {\n size: 0.6, // fontSize factor\n baseline: 0.11, // baseline-shift factor (downwards)\n },\n _fontSizeFraction: 0.222,\n offsets: {\n underline: 0.1,\n linethrough: -0.28167, // added 1/30 to original number\n overline: -0.81333, // added 1/15 to original number\n },\n _fontSizeMult: 1.13,\n [TEXT_DECORATION_THICKNESS]: 66.667, // before implementation was 1/15\n};\n\nexport const JUSTIFY = 'justify';\nexport const JUSTIFY_LEFT = 'justify-left';\nexport const JUSTIFY_RIGHT = 'justify-right';\nexport const JUSTIFY_CENTER = 'justify-center';\n","import { getSvgRegex } from './getSvgRegex';\nimport { LEFT, TOP } from '../constants';\nimport { TEXT_DECORATION_THICKNESS } from '../shapes/Text/constants';\n\n// matches, e.g.: +14.56e-12, etc.\nexport const reNum = String.raw`[-+]?(?:\\d*\\.\\d+|\\d+\\.?)(?:[eE][-+]?\\d+)?`;\nexport const viewportSeparator = String.raw`(?:\\s*,?\\s+|\\s*,\\s*)`;\n\nexport const svgNS = 'http://www.w3.org/2000/svg';\n\nexport const reFontDeclaration = new RegExp(\n '(normal|italic)?\\\\s*(normal|small-caps)?\\\\s*' +\n '(normal|bold|bolder|lighter|100|200|300|400|500|600|700|800|900)?\\\\s*(' +\n reNum +\n '(?:px|cm|mm|em|pt|pc|in)*)(?:\\\\/(normal|' +\n reNum +\n '))?\\\\s+(.*)',\n);\n\nexport const svgValidTagNames = [\n 'path',\n 'circle',\n 'polygon',\n 'polyline',\n 'ellipse',\n 'rect',\n 'line',\n 'image',\n 'text',\n ],\n svgViewBoxElements = ['symbol', 'image', 'marker', 'pattern', 'view', 'svg'],\n svgInvalidAncestors = [\n 'pattern',\n 'defs',\n 'symbol',\n 'metadata',\n 'clipPath',\n 'mask',\n 'desc',\n ],\n svgValidParents = ['symbol', 'g', 'a', 'svg', 'clipPath', 'defs'],\n attributesMap = {\n cx: LEFT,\n x: LEFT,\n r: 'radius',\n cy: TOP,\n y: TOP,\n display: 'visible',\n visibility: 'visible',\n transform: 'transformMatrix',\n 'fill-opacity': 'fillOpacity',\n 'fill-rule': 'fillRule',\n 'font-family': 'fontFamily',\n 'font-size': 'fontSize',\n 'font-style': 'fontStyle',\n 'font-weight': 'fontWeight',\n 'letter-spacing': 'charSpacing',\n 'paint-order': 'paintFirst',\n 'stroke-dasharray': 'strokeDashArray',\n 'stroke-dashoffset': 'strokeDashOffset',\n 'stroke-linecap': 'strokeLineCap',\n 'stroke-linejoin': 'strokeLineJoin',\n 'stroke-miterlimit': 'strokeMiterLimit',\n 'stroke-opacity': 'strokeOpacity',\n 'stroke-width': 'strokeWidth',\n 'text-decoration': 'textDecoration',\n 'text-anchor': 'textAnchor',\n opacity: 'opacity',\n 'clip-path': 'clipPath',\n 'clip-rule': 'clipRule',\n 'vector-effect': 'strokeUniform',\n 'image-rendering': 'imageSmoothing',\n 'text-decoration-thickness': TEXT_DECORATION_THICKNESS,\n },\n fSize = 'font-size',\n cPath = 'clip-path';\n\nexport const svgValidTagNamesRegEx = getSvgRegex(svgValidTagNames);\n\nexport const svgViewBoxElementsRegEx = getSvgRegex(svgViewBoxElements);\n\nexport const svgValidParentsRegEx = getSvgRegex(svgValidParents);\n\n// http://www.w3.org/TR/SVG/coords.html#ViewBoxAttribute\n\nexport const reViewBoxAttrValue = new RegExp(\n String.raw`^\\s*(${reNum})${viewportSeparator}(${reNum})${viewportSeparator}(${reNum})${viewportSeparator}(${reNum})\\s*$`,\n);\n","import { classRegistry } from './ClassRegistry';\nimport { Color } from './color/Color';\nimport { config } from './config';\nimport { reNum } from './parser/constants';\nimport { Point } from './Point';\nimport type { FabricObject } from './shapes/Object/FabricObject';\nimport type { TClassProperties } from './typedefs';\nimport { uid } from './util/internals/uid';\nimport { pickBy } from './util/misc/pick';\nimport { degreesToRadians } from './util/misc/radiansDegreesConversion';\nimport { toFixed } from './util/misc/toFixed';\nimport { rotateVector } from './util/misc/vectors';\n\n/**\n * Regex matching shadow offsetX, offsetY and blur (ex: \"2px 2px 10px rgba(0,0,0,0.2)\", \"rgb(0,255,0) 2px 2px\")\n * - (?:\\s|^): This part captures either a whitespace character (\\s) or the beginning of a line (^). It's non-capturing (due to (?:...)), meaning it doesn't create a capturing group.\n * - (-?\\d+(?:\\.\\d*)?(?:px)?(?:\\s?|$))?: This captures the first component of the shadow, which is the horizontal offset. Breaking it down:\n * - (-?\\d+): Captures an optional minus sign followed by one or more digits (integer part of the number).\n * - (?:\\.\\d*)?: Optionally captures a decimal point followed by zero or more digits (decimal part of the number).\n * - (?:px)?: Optionally captures the \"px\" unit.\n * - (?:\\s?|$): Captures either an optional whitespace or the end of the line. This whole part is wrapped in a non-capturing group and marked as optional with ?.\n * - (-?\\d+(?:\\.\\d*)?(?:px)?(?:\\s?|$))?: Similar to the previous step, this captures the vertical offset.\n\n(\\d+(?:\\.\\d*)?(?:px)?)?: This captures the blur radius. It's similar to the horizontal offset but without the optional minus sign.\n\n(?:\\s+(-?\\d+(?:\\.\\d*)?(?:px)?(?:\\s?|$))?){0,1}: This captures an optional part for the color. It allows for whitespace followed by a component with an optional minus sign, digits, decimal point, and \"px\" unit.\n\n(?:$|\\s): This captures either the end of the line or a whitespace character. It ensures that the match ends either at the end of the string or with a whitespace character.\n */\n// eslint-disable-next-line max-len\n\nconst shadowOffsetRegex = '(-?\\\\d+(?:\\\\.\\\\d*)?(?:px)?(?:\\\\s?|$))?';\n\nconst reOffsetsAndBlur = new RegExp(\n '(?:\\\\s|^)' +\n shadowOffsetRegex +\n shadowOffsetRegex +\n '(' +\n reNum +\n '?(?:px)?)?(?:\\\\s?|$)(?:$|\\\\s)',\n);\n\nexport const shadowDefaultValues: Partial> = {\n color: 'rgb(0,0,0)',\n blur: 0,\n offsetX: 0,\n offsetY: 0,\n affectStroke: false,\n includeDefaultValues: true,\n nonScaling: false,\n};\n\nexport type SerializedShadowOptions = {\n color: string;\n blur: number;\n offsetX: number;\n offsetY: number;\n affectStroke: boolean;\n nonScaling: boolean;\n type: string;\n};\n\nexport class Shadow {\n /**\n * Shadow color\n * @type String\n */\n declare color: string;\n\n /**\n * Shadow blur\n * @type Number\n */\n declare blur: number;\n\n /**\n * Shadow horizontal offset\n * @type Number\n */\n declare offsetX: number;\n\n /**\n * Shadow vertical offset\n * @type Number\n */\n declare offsetY: number;\n\n /**\n * Whether the shadow should affect stroke operations\n * @type Boolean\n */\n declare affectStroke: boolean;\n\n /**\n * Indicates whether toObject should include default values\n * @type Boolean\n */\n declare includeDefaultValues: boolean;\n\n /**\n * When `false`, the shadow will scale with the object.\n * When `true`, the shadow's offsetX, offsetY, and blur will not be affected by the object's scale.\n * default to false\n * @type Boolean\n */\n declare nonScaling: boolean;\n\n declare id: number;\n\n static ownDefaults = shadowDefaultValues;\n\n static type = 'shadow';\n\n /**\n * @see {@link http://fabricjs.com/shadows|Shadow demo}\n * @param {Object|String} [options] Options object with any of color, blur, offsetX, offsetY properties or string (e.g. \"rgba(0,0,0,0.2) 2px 2px 10px\")\n */\n constructor(options?: Partial>);\n constructor(svgAttribute: string);\n constructor(arg0: string | Partial> = {}) {\n const options: Partial> =\n typeof arg0 === 'string' ? Shadow.parseShadow(arg0) : arg0;\n Object.assign(this, Shadow.ownDefaults, options);\n this.id = uid();\n }\n\n /**\n * @param {String} value Shadow value to parse\n * @return {Object} Shadow object with color, offsetX, offsetY and blur\n */\n static parseShadow(value: string) {\n const shadowStr = value.trim(),\n [, offsetX = 0, offsetY = 0, blur = 0] = (\n reOffsetsAndBlur.exec(shadowStr) || []\n ).map((value) => parseFloat(value) || 0),\n color = (shadowStr.replace(reOffsetsAndBlur, '') || 'rgb(0,0,0)').trim();\n\n return {\n color,\n offsetX,\n offsetY,\n blur,\n };\n }\n\n /**\n * Returns a string representation of an instance\n * @see http://www.w3.org/TR/css-text-decor-3/#text-shadow\n * @return {String} Returns CSS3 text-shadow declaration\n */\n toString() {\n return [this.offsetX, this.offsetY, this.blur, this.color].join('px ');\n }\n\n /**\n * Returns SVG representation of a shadow\n * @param {FabricObject} object\n * @return {String} SVG representation of a shadow\n */\n toSVG(object: FabricObject) {\n const offset = rotateVector(\n new Point(this.offsetX, this.offsetY),\n degreesToRadians(-object.angle),\n ),\n BLUR_BOX = 20,\n color = new Color(this.color);\n let fBoxX = 40,\n fBoxY = 40;\n\n if (object.width && object.height) {\n //http://www.w3.org/TR/SVG/filters.html#FilterEffectsRegion\n // we add some extra space to filter box to contain the blur ( 20 )\n fBoxX =\n toFixed(\n (Math.abs(offset.x) + this.blur) / object.width,\n config.NUM_FRACTION_DIGITS,\n ) *\n 100 +\n BLUR_BOX;\n fBoxY =\n toFixed(\n (Math.abs(offset.y) + this.blur) / object.height,\n config.NUM_FRACTION_DIGITS,\n ) *\n 100 +\n BLUR_BOX;\n }\n if (object.flipX) {\n offset.x *= -1;\n }\n if (object.flipY) {\n offset.y *= -1;\n }\n\n return `\\n\\t\\n\\t\\n\\t\\n\\t\\n\\t\\n\\t\\t\\n\\t\\t\\n\\t\\n\\n`;\n }\n\n /**\n * Returns object representation of a shadow\n * @return {Object} Object representation of a shadow instance\n */\n toObject() {\n const data: SerializedShadowOptions = {\n color: this.color,\n blur: this.blur,\n offsetX: this.offsetX,\n offsetY: this.offsetY,\n affectStroke: this.affectStroke,\n nonScaling: this.nonScaling,\n type: (this.constructor as typeof Shadow).type,\n };\n const defaults = Shadow.ownDefaults as SerializedShadowOptions;\n return !this.includeDefaultValues\n ? pickBy(data, (value, key) => value !== defaults[key])\n : data;\n }\n\n static async fromObject(options: Partial>) {\n return new this(options);\n }\n}\n\nclassRegistry.setClass(Shadow, 'shadow');\n","export const capValue = (min: number, value: number, max: number) =>\n Math.max(min, Math.min(value, max));\n","import {\n TOP,\n LEFT,\n SCALE_Y,\n SCALE_X,\n SKEW_X,\n SKEW_Y,\n FILL,\n STROKE,\n} from '../../constants';\nimport type { TClassProperties } from '../../typedefs';\nimport type { InteractiveFabricObject } from './InteractiveObject';\nimport type { FabricObject } from './Object';\n\nexport const stateProperties = [\n TOP,\n LEFT,\n SCALE_X,\n SCALE_Y,\n 'flipX',\n 'flipY',\n 'originX',\n 'originY',\n 'angle',\n 'opacity',\n 'globalCompositeOperation',\n 'shadow',\n 'visible',\n SKEW_X,\n SKEW_Y,\n];\n\nexport const cacheProperties = [\n FILL,\n STROKE,\n 'strokeWidth',\n 'strokeDashArray',\n 'width',\n 'height',\n 'paintFirst',\n 'strokeUniform',\n 'strokeLineCap',\n 'strokeDashOffset',\n 'strokeLineJoin',\n 'strokeMiterLimit',\n 'backgroundColor',\n 'clipPath',\n];\n\nexport const fabricObjectDefaultValues: Partial<\n TClassProperties\n> = {\n // see composeMatrix() to see order of transforms. First defaults listed based on this\n top: 0,\n left: 0,\n width: 0,\n height: 0,\n angle: 0,\n flipX: false,\n flipY: false,\n scaleX: 1,\n scaleY: 1,\n minScaleLimit: 0,\n skewX: 0,\n skewY: 0,\n originX: LEFT,\n originY: TOP,\n strokeWidth: 1,\n strokeUniform: false,\n padding: 0,\n opacity: 1,\n paintFirst: FILL,\n fill: 'rgb(0,0,0)',\n fillRule: 'nonzero',\n stroke: null,\n strokeDashArray: null,\n strokeDashOffset: 0,\n strokeLineCap: 'butt',\n strokeLineJoin: 'miter',\n strokeMiterLimit: 4,\n globalCompositeOperation: 'source-over',\n backgroundColor: '',\n shadow: null,\n visible: true,\n includeDefaultValues: true,\n excludeFromExport: false,\n objectCaching: true,\n clipPath: undefined,\n inverted: false,\n absolutePositioned: false,\n centeredRotation: true,\n centeredScaling: false,\n dirty: true,\n} as const;\n\nexport const interactiveObjectDefaultValues: Partial<\n TClassProperties\n> = {\n noScaleCache: true,\n lockMovementX: false,\n lockMovementY: false,\n lockRotation: false,\n lockScalingX: false,\n lockScalingY: false,\n lockSkewingX: false,\n lockSkewingY: false,\n lockScalingFlip: false,\n cornerSize: 13,\n touchCornerSize: 24,\n transparentCorners: true,\n cornerColor: 'rgb(178,204,255)',\n cornerStrokeColor: '',\n cornerStyle: 'rect',\n cornerDashArray: null,\n hasControls: true,\n borderColor: 'rgb(178,204,255)',\n borderDashArray: null,\n borderOpacityWhenMoving: 0.4,\n borderScaleFactor: 1,\n hasBorders: true,\n selectionBackgroundColor: '',\n selectable: true,\n evented: true,\n perPixelTargetFind: false,\n activeOn: 'down',\n hoverCursor: null,\n moveCursor: null,\n};\n","/**\n * Easing functions\n * @see {@link http://gizma.com/easing/ Easing Equations by Robert Penner}\n */\n\nimport { twoMathPi, halfPI } from '../../constants';\nimport type { TEasingFunction } from './types';\n\nconst normalize = (a: number, c: number, p: number, s: number) => {\n if (a < Math.abs(c)) {\n a = c;\n s = p / 4;\n } else {\n //handle the 0/0 case:\n if (c === 0 && a === 0) {\n s = (p / twoMathPi) * Math.asin(1);\n } else {\n s = (p / twoMathPi) * Math.asin(c / a);\n }\n }\n return { a, c, p, s };\n};\n\nconst elastic = (\n a: number,\n s: number,\n p: number,\n t: number,\n d: number,\n): number =>\n a * Math.pow(2, 10 * (t -= 1)) * Math.sin(((t * d - s) * twoMathPi) / p);\n\n/**\n * Default sinusoidal easing\n */\nexport const defaultEasing: TEasingFunction = (t, b, c, d) =>\n -c * Math.cos((t / d) * halfPI) + c + b;\n\n/**\n * Cubic easing in\n */\nexport const easeInCubic: TEasingFunction = (t, b, c, d) =>\n c * (t / d) ** 3 + b;\n\n/**\n * Cubic easing out\n */\nexport const easeOutCubic: TEasingFunction = (t, b, c, d) =>\n c * ((t / d - 1) ** 3 + 1) + b;\n\n/**\n * Cubic easing in and out\n */\nexport const easeInOutCubic: TEasingFunction = (t, b, c, d) => {\n t /= d / 2;\n if (t < 1) {\n return (c / 2) * t ** 3 + b;\n }\n return (c / 2) * ((t - 2) ** 3 + 2) + b;\n};\n\n/**\n * Quartic easing in\n */\nexport const easeInQuart: TEasingFunction = (t, b, c, d) =>\n c * (t /= d) * t ** 3 + b;\n\n/**\n * Quartic easing out\n */\nexport const easeOutQuart: TEasingFunction = (t, b, c, d) =>\n -c * ((t = t / d - 1) * t ** 3 - 1) + b;\n\n/**\n * Quartic easing in and out\n */\nexport const easeInOutQuart: TEasingFunction = (t, b, c, d) => {\n t /= d / 2;\n if (t < 1) {\n return (c / 2) * t ** 4 + b;\n }\n return (-c / 2) * ((t -= 2) * t ** 3 - 2) + b;\n};\n\n/**\n * Quintic easing in\n */\nexport const easeInQuint: TEasingFunction = (t, b, c, d) =>\n c * (t / d) ** 5 + b;\n\n/**\n * Quintic easing out\n */\nexport const easeOutQuint: TEasingFunction = (t, b, c, d) =>\n c * ((t / d - 1) ** 5 + 1) + b;\n\n/**\n * Quintic easing in and out\n */\nexport const easeInOutQuint: TEasingFunction = (t, b, c, d) => {\n t /= d / 2;\n if (t < 1) {\n return (c / 2) * t ** 5 + b;\n }\n return (c / 2) * ((t - 2) ** 5 + 2) + b;\n};\n\n/**\n * Sinusoidal easing in\n */\nexport const easeInSine: TEasingFunction = (t, b, c, d) =>\n -c * Math.cos((t / d) * halfPI) + c + b;\n\n/**\n * Sinusoidal easing out\n */\nexport const easeOutSine: TEasingFunction = (t, b, c, d) =>\n c * Math.sin((t / d) * halfPI) + b;\n\n/**\n * Sinusoidal easing in and out\n */\nexport const easeInOutSine: TEasingFunction = (t, b, c, d) =>\n (-c / 2) * (Math.cos((Math.PI * t) / d) - 1) + b;\n\n/**\n * Exponential easing in\n */\nexport const easeInExpo: TEasingFunction = (t, b, c, d) =>\n t === 0 ? b : c * 2 ** (10 * (t / d - 1)) + b;\n\n/**\n * Exponential easing out\n */\nexport const easeOutExpo: TEasingFunction = (t, b, c, d) =>\n t === d ? b + c : c * -(2 ** ((-10 * t) / d) + 1) + b;\n\n/**\n * Exponential easing in and out\n */\nexport const easeInOutExpo: TEasingFunction = (t, b, c, d) => {\n if (t === 0) {\n return b;\n }\n if (t === d) {\n return b + c;\n }\n t /= d / 2;\n if (t < 1) {\n return (c / 2) * 2 ** (10 * (t - 1)) + b;\n }\n return (c / 2) * -(2 ** (-10 * --t) + 2) + b;\n};\n\n/**\n * Circular easing in\n */\nexport const easeInCirc: TEasingFunction = (t, b, c, d) =>\n -c * (Math.sqrt(1 - (t /= d) * t) - 1) + b;\n\n/**\n * Circular easing out\n */\nexport const easeOutCirc: TEasingFunction = (t, b, c, d) =>\n c * Math.sqrt(1 - (t = t / d - 1) * t) + b;\n\n/**\n * Circular easing in and out\n */\nexport const easeInOutCirc: TEasingFunction = (t, b, c, d) => {\n t /= d / 2;\n if (t < 1) {\n return (-c / 2) * (Math.sqrt(1 - t ** 2) - 1) + b;\n }\n return (c / 2) * (Math.sqrt(1 - (t -= 2) * t) + 1) + b;\n};\n\n/**\n * Elastic easing in\n */\nexport const easeInElastic: TEasingFunction = (t, b, c, d) => {\n const s = 1.70158,\n a = c;\n let p = 0;\n if (t === 0) {\n return b;\n }\n t /= d;\n if (t === 1) {\n return b + c;\n }\n if (!p) {\n p = d * 0.3;\n }\n const { a: normA, s: normS, p: normP } = normalize(a, c, p, s);\n return -elastic(normA, normS, normP, t, d) + b;\n};\n\n/**\n * Elastic easing out\n */\nexport const easeOutElastic: TEasingFunction = (t, b, c, d) => {\n const s = 1.70158,\n a = c;\n let p = 0;\n if (t === 0) {\n return b;\n }\n t /= d;\n if (t === 1) {\n return b + c;\n }\n if (!p) {\n p = d * 0.3;\n }\n const { a: normA, s: normS, p: normP, c: normC } = normalize(a, c, p, s);\n return (\n normA * 2 ** (-10 * t) * Math.sin(((t * d - normS) * twoMathPi) / normP) +\n normC +\n b\n );\n};\n\n/**\n * Elastic easing in and out\n */\nexport const easeInOutElastic: TEasingFunction = (t, b, c, d) => {\n const s = 1.70158,\n a = c;\n let p = 0;\n if (t === 0) {\n return b;\n }\n t /= d / 2;\n if (t === 2) {\n return b + c;\n }\n if (!p) {\n p = d * (0.3 * 1.5);\n }\n const { a: normA, s: normS, p: normP, c: normC } = normalize(a, c, p, s);\n if (t < 1) {\n return -0.5 * elastic(normA, normS, normP, t, d) + b;\n }\n return (\n normA *\n Math.pow(2, -10 * (t -= 1)) *\n Math.sin(((t * d - normS) * twoMathPi) / normP) *\n 0.5 +\n normC +\n b\n );\n};\n\n/**\n * Backwards easing in\n */\nexport const easeInBack: TEasingFunction = (t, b, c, d, s = 1.70158) =>\n c * (t /= d) * t * ((s + 1) * t - s) + b;\n\n/**\n * Backwards easing out\n */\nexport const easeOutBack: TEasingFunction = (t, b, c, d, s = 1.70158) =>\n c * ((t = t / d - 1) * t * ((s + 1) * t + s) + 1) + b;\n\n/**\n * Backwards easing in and out\n */\nexport const easeInOutBack: TEasingFunction = (t, b, c, d, s = 1.70158) => {\n t /= d / 2;\n if (t < 1) {\n return (c / 2) * (t * t * (((s *= 1.525) + 1) * t - s)) + b;\n }\n return (c / 2) * ((t -= 2) * t * (((s *= 1.525) + 1) * t + s) + 2) + b;\n};\n\n/**\n * Bouncing easing out\n */\nexport const easeOutBounce: TEasingFunction = (t, b, c, d) => {\n if ((t /= d) < 1 / 2.75) {\n return c * (7.5625 * t * t) + b;\n } else if (t < 2 / 2.75) {\n return c * (7.5625 * (t -= 1.5 / 2.75) * t + 0.75) + b;\n } else if (t < 2.5 / 2.75) {\n return c * (7.5625 * (t -= 2.25 / 2.75) * t + 0.9375) + b;\n } else {\n return c * (7.5625 * (t -= 2.625 / 2.75) * t + 0.984375) + b;\n }\n};\n\n/**\n * Bouncing easing in\n */\nexport const easeInBounce: TEasingFunction = (t, b, c, d) =>\n c - easeOutBounce(d - t, 0, c, d) + b;\n\n/**\n * Bouncing easing in and out\n */\nexport const easeInOutBounce: TEasingFunction = (t, b, c, d) =>\n t < d / 2\n ? easeInBounce(t * 2, 0, c, d) * 0.5 + b\n : easeOutBounce(t * 2 - d, 0, c, d) * 0.5 + c * 0.5 + b;\n\n/**\n * Quadratic easing in\n */\nexport const easeInQuad: TEasingFunction = (t, b, c, d) => c * (t /= d) * t + b;\n\n/**\n * Quadratic easing out\n */\nexport const easeOutQuad: TEasingFunction = (t, b, c, d) =>\n -c * (t /= d) * (t - 2) + b;\n\n/**\n * Quadratic easing in and out\n */\nexport const easeInOutQuad: TEasingFunction = (t, b, c, d) => {\n t /= d / 2;\n if (t < 1) {\n return (c / 2) * t ** 2 + b;\n }\n return (-c / 2) * (--t * (t - 2) - 1) + b;\n};\n","import { noop } from '../../constants';\nimport { requestAnimFrame } from './AnimationFrameProvider';\nimport { runningAnimations } from './AnimationRegistry';\nimport { defaultEasing } from './easing';\nimport type {\n AnimationState,\n TAbortCallback,\n TBaseAnimationOptions,\n TEasingFunction,\n TOnAnimationChangeCallback,\n} from './types';\n\nconst defaultAbort = () => false;\n\nexport abstract class AnimationBase<\n T extends number | number[] = number | number[],\n> {\n declare readonly startValue: T;\n declare readonly endValue: T;\n declare readonly duration: number;\n declare readonly delay: number;\n\n declare protected readonly byValue: T;\n declare protected readonly easing: TEasingFunction;\n\n declare private readonly _onStart: VoidFunction;\n declare private readonly _onChange: TOnAnimationChangeCallback;\n declare private readonly _onComplete: TOnAnimationChangeCallback;\n declare private readonly _abort: TAbortCallback;\n\n /**\n * Used to register the animation to a target object\n * so that it can be cancelled within the object context\n */\n declare readonly target?: unknown;\n\n private _state: AnimationState = 'pending';\n /**\n * Time %, or the ratio of `timeElapsed / duration`\n * @see tick\n */\n durationProgress = 0;\n /**\n * Value %, or the ratio of `(currentValue - startValue) / (endValue - startValue)`\n */\n valueProgress = 0;\n /**\n * Current value\n */\n declare value: T;\n /**\n * Animation start time ms\n */\n declare private startTime: number;\n\n constructor({\n startValue,\n byValue,\n duration = 500,\n delay = 0,\n easing = defaultEasing,\n onStart = noop,\n onChange = noop,\n onComplete = noop,\n abort = defaultAbort,\n target,\n }: TBaseAnimationOptions) {\n this.tick = this.tick.bind(this);\n\n this.duration = duration;\n this.delay = delay;\n this.easing = easing;\n this._onStart = onStart;\n this._onChange = onChange;\n this._onComplete = onComplete;\n this._abort = abort;\n this.target = target;\n\n this.startValue = startValue;\n this.byValue = byValue;\n this.value = this.startValue;\n this.endValue = Object.freeze(this.calculate(this.duration).value);\n }\n\n get state() {\n return this._state;\n }\n\n isDone() {\n return this._state === 'aborted' || this._state === 'completed';\n }\n\n /**\n * Calculate the current value based on the easing parameters\n * @param timeElapsed in ms\n * @protected\n */\n protected abstract calculate(timeElapsed: number): {\n value: T;\n valueProgress: number;\n };\n\n start() {\n const firstTick: FrameRequestCallback = (timestamp) => {\n if (this._state !== 'pending') return;\n this.startTime = timestamp || +new Date();\n this._state = 'running';\n this._onStart();\n this.tick(this.startTime);\n };\n\n this.register();\n\n // setTimeout(cb, 0) will run cb on the next frame, causing a delay\n // we don't want that\n if (this.delay > 0) {\n setTimeout(() => requestAnimFrame(firstTick), this.delay);\n } else {\n requestAnimFrame(firstTick);\n }\n }\n\n private tick(t: number) {\n const durationMs = (t || +new Date()) - this.startTime;\n const boundDurationMs = Math.min(durationMs, this.duration);\n this.durationProgress = boundDurationMs / this.duration;\n const { value, valueProgress } = this.calculate(boundDurationMs);\n this.value = Object.freeze(value);\n this.valueProgress = valueProgress;\n\n if (this._state === 'aborted') {\n return;\n } else if (\n this._abort(this.value, this.valueProgress, this.durationProgress)\n ) {\n this._state = 'aborted';\n this.unregister();\n } else if (durationMs >= this.duration) {\n this.durationProgress = this.valueProgress = 1;\n this._onChange(this.endValue, this.valueProgress, this.durationProgress);\n this._state = 'completed';\n this._onComplete(\n this.endValue,\n this.valueProgress,\n this.durationProgress,\n );\n this.unregister();\n } else {\n this._onChange(this.value, this.valueProgress, this.durationProgress);\n requestAnimFrame(this.tick);\n }\n }\n\n private register() {\n runningAnimations.push(this as unknown as AnimationBase);\n }\n\n private unregister() {\n runningAnimations.remove(this as unknown as AnimationBase);\n }\n\n abort() {\n this._state = 'aborted';\n this.unregister();\n }\n}\n","import { AnimationBase } from './AnimationBase';\nimport type { ValueAnimationOptions } from './types';\n\nexport class ValueAnimation extends AnimationBase {\n constructor({\n startValue = 0,\n endValue = 100,\n ...otherOptions\n }: ValueAnimationOptions) {\n super({\n ...otherOptions,\n startValue,\n byValue: endValue - startValue,\n });\n }\n\n protected calculate(timeElapsed: number) {\n const value = this.easing(\n timeElapsed,\n this.startValue,\n this.byValue,\n this.duration,\n );\n return {\n value,\n valueProgress: Math.abs((value - this.startValue) / this.byValue),\n };\n }\n}\n","import { AnimationBase } from './AnimationBase';\nimport type { ArrayAnimationOptions } from './types';\n\nexport class ArrayAnimation extends AnimationBase {\n constructor({\n startValue = [0],\n endValue = [100],\n ...options\n }: ArrayAnimationOptions) {\n super({\n ...options,\n startValue,\n byValue: endValue.map((value, i) => value - startValue[i]),\n });\n }\n protected calculate(timeElapsed: number) {\n const values = this.startValue.map((value, i) =>\n this.easing(timeElapsed, value, this.byValue[i], this.duration, i),\n );\n return {\n value: values,\n valueProgress: Math.abs(\n (values[0] - this.startValue[0]) / this.byValue[0],\n ),\n };\n }\n}\n","import { Color } from '../../color/Color';\nimport type { TRGBAColorSource } from '../../color/typedefs';\nimport { halfPI } from '../../constants';\nimport { capValue } from '../misc/capValue';\nimport { AnimationBase } from './AnimationBase';\nimport type {\n ColorAnimationOptions,\n TEasingFunction,\n TOnAnimationChangeCallback,\n} from './types';\n\nconst defaultColorEasing: TEasingFunction = (\n timeElapsed,\n startValue,\n byValue,\n duration,\n) => {\n const durationProgress = 1 - Math.cos((timeElapsed / duration) * halfPI);\n return startValue + byValue * durationProgress;\n};\n\nconst wrapColorCallback = (\n callback?: TOnAnimationChangeCallback,\n) =>\n callback &&\n ((rgba: TRGBAColorSource, valueProgress: number, durationProgress: number) =>\n callback(new Color(rgba).toRgba(), valueProgress, durationProgress));\n\nexport class ColorAnimation extends AnimationBase {\n constructor({\n startValue,\n endValue,\n easing = defaultColorEasing,\n onChange,\n onComplete,\n abort,\n ...options\n }: ColorAnimationOptions) {\n const startColor = new Color(startValue).getSource();\n const endColor = new Color(endValue).getSource();\n super({\n ...options,\n startValue: startColor,\n byValue: endColor.map(\n (value, i) => value - startColor[i],\n ) as TRGBAColorSource,\n easing,\n onChange: wrapColorCallback(onChange),\n onComplete: wrapColorCallback(onComplete),\n abort: wrapColorCallback(abort),\n });\n }\n protected calculate(timeElapsed: number) {\n const [r, g, b, a] = this.startValue.map((value, i) =>\n this.easing(timeElapsed, value, this.byValue[i], this.duration, i),\n ) as TRGBAColorSource;\n const value = [\n ...[r, g, b].map(Math.round),\n capValue(0, a, 1),\n ] as TRGBAColorSource;\n return {\n value,\n valueProgress:\n // to correctly calculate the change ratio we must find a changed value\n value\n .map((p, i) =>\n this.byValue[i] !== 0\n ? Math.abs((p - this.startValue[i]) / this.byValue[i])\n : 0,\n )\n .find((p) => p !== 0) || 0,\n };\n }\n}\n","import { ValueAnimation } from './ValueAnimation';\nimport { ArrayAnimation } from './ArrayAnimation';\nimport { ColorAnimation } from './ColorAnimation';\nimport type {\n ValueAnimationOptions,\n ArrayAnimationOptions,\n ColorAnimationOptions,\n} from './types';\nimport type { TColorArg } from '../../color/typedefs';\n\nexport type TAnimation =\n T extends TColorArg\n ? ColorAnimation\n : T extends number[]\n ? ArrayAnimation\n : ValueAnimation;\n\nconst isArrayAnimation = (\n options: ArrayAnimationOptions | ValueAnimationOptions,\n): options is ArrayAnimationOptions => {\n return Array.isArray(options.startValue) || Array.isArray(options.endValue);\n};\n\n/**\n * Changes value(s) from startValue to endValue within a certain period of time,\n * invoking callbacks as the value(s) change.\n *\n * @example\n * animate({\n * startValue: 1,\n * endValue: 0,\n * onChange: (v) => {\n * obj.set('opacity', v);\n * // since we are running in a requested frame we should call `renderAll` and not `requestRenderAll`\n * canvas.renderAll();\n * }\n * });\n *\n * @example Using lists:\n * animate({\n * startValue: [1, 2, 3],\n * endValue: [2, 4, 6],\n * onChange: ([x, y, zoom]) => {\n * canvas.zoomToPoint(new Point(x, y), zoom);\n * canvas.renderAll();\n * }\n * });\n *\n */\nexport function animate(options: ArrayAnimationOptions): ArrayAnimation;\nexport function animate(options: ValueAnimationOptions): ValueAnimation;\nexport function animate<\n T extends ValueAnimationOptions | ArrayAnimationOptions,\n>(\n options: T,\n): T extends ArrayAnimationOptions ? ArrayAnimation : ValueAnimation;\nexport function animate<\n T extends ValueAnimationOptions | ArrayAnimationOptions,\n R extends T extends ArrayAnimationOptions ? ArrayAnimation : ValueAnimation,\n>(options: T): R {\n const animation = (\n isArrayAnimation(options)\n ? new ArrayAnimation(options)\n : new ValueAnimation(options)\n ) as R;\n animation.start();\n return animation;\n}\n\nexport function animateColor(options: ColorAnimationOptions) {\n const animation = new ColorAnimation(options);\n animation.start();\n return animation;\n}\n","import { Point } from './Point';\nimport { createVector } from './util/misc/vectors';\n\n/* Adaptation of work of Kevin Lindsey (kevin@kevlindev.com) */\n\nexport type IntersectionType = 'Intersection' | 'Coincident' | 'Parallel';\n\nexport class Intersection {\n declare points: Point[];\n\n declare status?: IntersectionType;\n\n constructor(status?: IntersectionType) {\n this.status = status;\n this.points = [];\n }\n\n /**\n * Used to verify if a point is alredy in the collection\n * @param {Point} point\n * @returns {boolean}\n */\n private includes(point: Point): boolean {\n return this.points.some((p) => p.eq(point));\n }\n\n /**\n * Appends points of intersection\n * @param {...Point[]} points\n * @return {Intersection} thisArg\n * @chainable\n */\n private append(...points: Point[]): Intersection {\n this.points = this.points.concat(\n points.filter((point) => {\n return !this.includes(point);\n }),\n );\n return this;\n }\n\n /**\n * check if point T is on the segment or line defined between A and B\n *\n * @param {Point} T the point we are checking for\n * @param {Point} A one extremity of the segment\n * @param {Point} B the other extremity of the segment\n * @param [infinite] if true checks if `T` is on the line defined by `A` and `B`\n * @returns true if `T` is contained\n */\n static isPointContained(T: Point, A: Point, B: Point, infinite = false) {\n if (A.eq(B)) {\n // Edge case: the segment is a point, we check for coincidence,\n // infinite param has no meaning because there are infinite lines to consider\n return T.eq(A);\n } else if (A.x === B.x) {\n // Edge case: horizontal line.\n // we first check if T.x has the same value, and then if T.y is contained between A.y and B.y\n return (\n T.x === A.x &&\n (infinite || (T.y >= Math.min(A.y, B.y) && T.y <= Math.max(A.y, B.y)))\n );\n } else if (A.y === B.y) {\n // Edge case: vertical line.\n // we first check if T.y has the same value, and then if T.x is contained between A.x and B.x\n return (\n T.y === A.y &&\n (infinite || (T.x >= Math.min(A.x, B.x) && T.x <= Math.max(A.x, B.x)))\n );\n } else {\n // Generic case: sloped line.\n // we check that AT has the same slope as AB\n // for the segment case we need both the vectors to have the same direction and for AT to be lte AB in size\n // for the infinite case we check the absolute value of the slope, since direction is meaningless\n const AB = createVector(A, B);\n const AT = createVector(A, T);\n const s = AT.divide(AB);\n return infinite\n ? Math.abs(s.x) === Math.abs(s.y)\n : s.x === s.y && s.x >= 0 && s.x <= 1;\n }\n }\n\n /**\n * Use the ray casting algorithm to determine if {@link point} is in the polygon defined by {@link points}\n * @see https://en.wikipedia.org/wiki/Point_in_polygon\n * @param point\n * @param points polygon points\n * @returns\n */\n static isPointInPolygon(point: Point, points: Point[]) {\n const other = new Point(point).setX(\n Math.min(point.x - 1, ...points.map((p) => p.x)),\n );\n let hits = 0;\n for (let index = 0; index < points.length; index++) {\n const inter = this.intersectSegmentSegment(\n // polygon side\n points[index],\n points[(index + 1) % points.length],\n // ray\n point,\n other,\n );\n if (inter.includes(point)) {\n // point is on the polygon side\n return true;\n }\n hits += Number(inter.status === 'Intersection');\n }\n return hits % 2 === 1;\n }\n\n /**\n * Checks if a line intersects another\n * @see {@link https://en.wikipedia.org/wiki/Line%E2%80%93line_intersection line intersection}\n * @see {@link https://en.wikipedia.org/wiki/Cramer%27s_rule Cramer's rule}\n * @param {Point} a1\n * @param {Point} a2\n * @param {Point} b1\n * @param {Point} b2\n * @param {boolean} [aInfinite=true] check segment intersection by passing `false`\n * @param {boolean} [bInfinite=true] check segment intersection by passing `false`\n * @return {Intersection}\n */\n static intersectLineLine(\n a1: Point,\n a2: Point,\n b1: Point,\n b2: Point,\n aInfinite = true,\n bInfinite = true,\n ): Intersection {\n const a2xa1x = a2.x - a1.x,\n a2ya1y = a2.y - a1.y,\n b2xb1x = b2.x - b1.x,\n b2yb1y = b2.y - b1.y,\n a1xb1x = a1.x - b1.x,\n a1yb1y = a1.y - b1.y,\n uaT = b2xb1x * a1yb1y - b2yb1y * a1xb1x,\n ubT = a2xa1x * a1yb1y - a2ya1y * a1xb1x,\n uB = b2yb1y * a2xa1x - b2xb1x * a2ya1y;\n if (uB !== 0) {\n const ua = uaT / uB,\n ub = ubT / uB;\n if (\n (aInfinite || (0 <= ua && ua <= 1)) &&\n (bInfinite || (0 <= ub && ub <= 1))\n ) {\n return new Intersection('Intersection').append(\n new Point(a1.x + ua * a2xa1x, a1.y + ua * a2ya1y),\n );\n } else {\n return new Intersection();\n }\n } else {\n if (uaT === 0 || ubT === 0) {\n const segmentsCoincide =\n aInfinite ||\n bInfinite ||\n Intersection.isPointContained(a1, b1, b2) ||\n Intersection.isPointContained(a2, b1, b2) ||\n Intersection.isPointContained(b1, a1, a2) ||\n Intersection.isPointContained(b2, a1, a2);\n return new Intersection(segmentsCoincide ? 'Coincident' : undefined);\n } else {\n return new Intersection('Parallel');\n }\n }\n }\n\n /**\n * Checks if a segment intersects a line\n * @see {@link intersectLineLine} for line intersection\n * @param {Point} s1 boundary point of segment\n * @param {Point} s2 other boundary point of segment\n * @param {Point} l1 point on line\n * @param {Point} l2 other point on line\n * @return {Intersection}\n */\n static intersectSegmentLine(\n s1: Point,\n s2: Point,\n l1: Point,\n l2: Point,\n ): Intersection {\n return Intersection.intersectLineLine(s1, s2, l1, l2, false, true);\n }\n\n /**\n * Checks if a segment intersects another\n * @see {@link intersectLineLine} for line intersection\n * @param {Point} a1 boundary point of segment\n * @param {Point} a2 other boundary point of segment\n * @param {Point} b1 boundary point of segment\n * @param {Point} b2 other boundary point of segment\n * @return {Intersection}\n */\n static intersectSegmentSegment(\n a1: Point,\n a2: Point,\n b1: Point,\n b2: Point,\n ): Intersection {\n return Intersection.intersectLineLine(a1, a2, b1, b2, false, false);\n }\n\n /**\n * Checks if line intersects polygon\n *\n * @todo account for stroke\n *\n * @see {@link intersectSegmentPolygon} for segment intersection\n * @param {Point} a1 point on line\n * @param {Point} a2 other point on line\n * @param {Point[]} points polygon points\n * @param {boolean} [infinite=true] check segment intersection by passing `false`\n * @return {Intersection}\n */\n static intersectLinePolygon(\n a1: Point,\n a2: Point,\n points: Point[],\n infinite = true,\n ): Intersection {\n const result = new Intersection();\n const length = points.length;\n\n for (let i = 0, b1, b2, inter; i < length; i++) {\n b1 = points[i];\n b2 = points[(i + 1) % length];\n inter = Intersection.intersectLineLine(a1, a2, b1, b2, infinite, false);\n if (inter.status === 'Coincident') {\n return inter;\n }\n result.append(...inter.points);\n }\n\n if (result.points.length > 0) {\n result.status = 'Intersection';\n }\n\n return result;\n }\n\n /**\n * Checks if segment intersects polygon\n * @see {@link intersectLinePolygon} for line intersection\n * @param {Point} a1 boundary point of segment\n * @param {Point} a2 other boundary point of segment\n * @param {Point[]} points polygon points\n * @return {Intersection}\n */\n static intersectSegmentPolygon(\n a1: Point,\n a2: Point,\n points: Point[],\n ): Intersection {\n return Intersection.intersectLinePolygon(a1, a2, points, false);\n }\n\n /**\n * Checks if polygon intersects another polygon\n *\n * @todo account for stroke\n *\n * @param {Point[]} points1\n * @param {Point[]} points2\n * @return {Intersection}\n */\n static intersectPolygonPolygon(\n points1: Point[],\n points2: Point[],\n ): Intersection {\n const result = new Intersection(),\n length = points1.length;\n const coincidences: Intersection[] = [];\n\n for (let i = 0; i < length; i++) {\n const a1 = points1[i],\n a2 = points1[(i + 1) % length],\n inter = Intersection.intersectSegmentPolygon(a1, a2, points2);\n if (inter.status === 'Coincident') {\n coincidences.push(inter);\n result.append(a1, a2);\n } else {\n result.append(...inter.points);\n }\n }\n\n if (coincidences.length > 0 && coincidences.length === points1.length) {\n return new Intersection('Coincident');\n } else if (result.points.length > 0) {\n result.status = 'Intersection';\n }\n\n return result;\n }\n\n /**\n * Checks if polygon intersects rectangle\n * @see {@link intersectPolygonPolygon} for polygon intersection\n * @param {Point[]} points polygon points\n * @param {Point} r1 top left point of rect\n * @param {Point} r2 bottom right point of rect\n * @return {Intersection}\n */\n static intersectPolygonRectangle(\n points: Point[],\n r1: Point,\n r2: Point,\n ): Intersection {\n const min = r1.min(r2),\n max = r1.max(r2),\n topRight = new Point(max.x, min.y),\n bottomLeft = new Point(min.x, max.y);\n\n return Intersection.intersectPolygonPolygon(points, [\n min,\n topRight,\n max,\n bottomLeft,\n ]);\n }\n}\n","import type {\n TBBox,\n TCornerPoint,\n TDegree,\n TMat2D,\n TOriginX,\n TOriginY,\n} from '../../typedefs';\nimport { SCALE_X, SCALE_Y, iMatrix } from '../../constants';\nimport { Intersection } from '../../Intersection';\nimport { Point } from '../../Point';\nimport { makeBoundingBoxFromPoints } from '../../util/misc/boundingBoxFromPoints';\nimport {\n createRotateMatrix,\n createTranslateMatrix,\n composeMatrix,\n invertTransform,\n multiplyTransformMatrices,\n transformPoint,\n calcPlaneRotation,\n} from '../../util/misc/matrix';\nimport { radiansToDegrees } from '../../util/misc/radiansDegreesConversion';\nimport type { Canvas } from '../../canvas/Canvas';\nimport type { StaticCanvas } from '../../canvas/StaticCanvas';\nimport type { ObjectEvents } from '../../EventTypeDefs';\nimport type { ControlProps } from './types/ControlProps';\nimport { resolveOrigin } from '../../util/misc/resolveOrigin';\nimport type { Group } from '../Group';\nimport { calcDimensionsMatrix } from '../../util/misc/matrix';\nimport { sizeAfterTransform } from '../../util/misc/objectTransforms';\nimport { degreesToRadians } from '../../util/misc/radiansDegreesConversion';\nimport { CommonMethods } from '../../CommonMethods';\nimport type { BaseProps } from './types/BaseProps';\nimport type { FillStrokeProps } from './types/FillStrokeProps';\nimport { CENTER, LEFT, TOP } from '../../constants';\n\ntype TMatrixCache = {\n key: number[];\n value: TMat2D;\n};\n\ntype TACoords = TCornerPoint;\n\nexport class ObjectGeometry\n extends CommonMethods\n implements\n Pick,\n BaseProps,\n Pick\n{\n // #region Geometry\n\n declare padding: number;\n\n /**\n * Describe object's corner position in scene coordinates.\n * The coordinates are derived from the following:\n * left, top, width, height, scaleX, scaleY, skewX, skewY, angle, strokeWidth.\n * The coordinates do not depend on viewport changes.\n * The coordinates get updated with {@link setCoords}.\n * You can calculate them without updating with {@link calcACoords()}\n */\n declare aCoords: TACoords;\n\n /**\n * storage cache for object transform matrix\n */\n declare ownMatrixCache?: TMatrixCache;\n\n /**\n * storage cache for object full transform matrix\n */\n declare matrixCache?: TMatrixCache;\n\n /**\n * A Reference of the Canvas where the object is actually added\n * @type StaticCanvas | Canvas;\n * @default undefined\n * @private\n */\n declare canvas?: StaticCanvas | Canvas;\n\n /**\n * @returns {number} x position according to object's {@link originX} property in canvas coordinate plane\n */\n getX(): number {\n return this.getXY().x;\n }\n\n /**\n * @param {number} value x position according to object's {@link originX} property in canvas coordinate plane\n */\n setX(value: number) {\n this.setXY(this.getXY().setX(value));\n }\n\n /**\n * @returns {number} y position according to object's {@link originY} property in canvas coordinate plane\n */\n getY(): number {\n return this.getXY().y;\n }\n\n /**\n * @param {number} value y position according to object's {@link originY} property in canvas coordinate plane\n */\n setY(value: number) {\n this.setXY(this.getXY().setY(value));\n }\n\n /**\n * @returns {number} x position according to object's {@link originX} property in parent's coordinate plane\\\n * if parent is canvas then this property is identical to {@link getX}\n */\n getRelativeX(): number {\n return this.left;\n }\n\n /**\n * @param {number} value x position according to object's {@link originX} property in parent's coordinate plane\\\n * if parent is canvas then this method is identical to {@link setX}\n */\n setRelativeX(value: number) {\n this.left = value;\n }\n\n /**\n * @returns {number} y position according to object's {@link originY} property in parent's coordinate plane\\\n * if parent is canvas then this property is identical to {@link getY}\n */\n getRelativeY(): number {\n return this.top;\n }\n\n /**\n * @param {number} value y position according to object's {@link originY} property in parent's coordinate plane\\\n * if parent is canvas then this property is identical to {@link setY}\n */\n setRelativeY(value: number) {\n this.top = value;\n }\n\n /**\n * @returns {Point} x position according to object's {@link originX} {@link originY} properties in canvas coordinate plane\n */\n getXY(): Point {\n const relativePosition = this.getRelativeXY();\n return this.group\n ? transformPoint(relativePosition, this.group.calcTransformMatrix())\n : relativePosition;\n }\n\n /**\n * Set an object position to a particular point, the point is intended in absolute ( canvas ) coordinate.\n * You can specify {@link originX} and {@link originY} values,\n * that otherwise are the object's current values.\n * @example Set object's bottom left corner to point (5,5) on canvas\n * object.setXY(new Point(5, 5), 'left', 'bottom').\n * @param {Point} point position in scene coordinate plane\n * @param {TOriginX} [originX] Horizontal origin: 'left', 'center' or 'right'\n * @param {TOriginY} [originY] Vertical origin: 'top', 'center' or 'bottom'\n */\n setXY(point: Point, originX?: TOriginX, originY?: TOriginY) {\n if (this.group) {\n point = transformPoint(\n point,\n invertTransform(this.group.calcTransformMatrix()),\n );\n }\n this.setRelativeXY(point, originX, originY);\n }\n\n /**\n * @returns {Point} x,y position according to object's {@link originX} {@link originY} properties in parent's coordinate plane\n */\n getRelativeXY(): Point {\n return new Point(this.left, this.top);\n }\n\n /**\n * As {@link setXY}, but in current parent's coordinate plane (the current group if any or the canvas)\n * @param {Point} point position according to object's {@link originX} {@link originY} properties in parent's coordinate plane\n * @param {TOriginX} [originX] Horizontal origin: 'left', 'center' or 'right'\n * @param {TOriginY} [originY] Vertical origin: 'top', 'center' or 'bottom'\n */\n setRelativeXY(\n point: Point,\n originX: TOriginX = this.originX,\n originY: TOriginY = this.originY,\n ) {\n this.setPositionByOrigin(point, originX, originY);\n }\n\n /**\n * @deprecated intermidiate method to be removed, do not use\n */\n protected isStrokeAccountedForInDimensions() {\n return false;\n }\n\n /**\n * @return {Point[]} [tl, tr, br, bl] in the scene plane\n */\n getCoords(): Point[] {\n const { tl, tr, br, bl } =\n this.aCoords || (this.aCoords = this.calcACoords());\n const coords = [tl, tr, br, bl];\n if (this.group) {\n const t = this.group.calcTransformMatrix();\n return coords.map((p) => transformPoint(p, t));\n }\n return coords;\n }\n\n /**\n * Checks if object intersects with the scene rect formed by {@link tl} and {@link br}\n */\n intersectsWithRect(tl: Point, br: Point): boolean {\n const intersection = Intersection.intersectPolygonRectangle(\n this.getCoords(),\n tl,\n br,\n );\n return intersection.status === 'Intersection';\n }\n\n /**\n * Checks if object intersects with another object\n * @param {Object} other Object to test\n * @return {Boolean} true if object intersects with another object\n */\n intersectsWithObject(other: ObjectGeometry): boolean {\n const intersection = Intersection.intersectPolygonPolygon(\n this.getCoords(),\n other.getCoords(),\n );\n\n return (\n intersection.status === 'Intersection' ||\n intersection.status === 'Coincident' ||\n other.isContainedWithinObject(this) ||\n this.isContainedWithinObject(other)\n );\n }\n\n /**\n * Checks if object is fully contained within area of another object\n * @param {Object} other Object to test\n * @return {Boolean} true if object is fully contained within area of another object\n */\n isContainedWithinObject(other: ObjectGeometry): boolean {\n const points = this.getCoords();\n return points.every((point) => other.containsPoint(point));\n }\n\n /**\n * Checks if object is fully contained within the scene rect formed by {@link tl} and {@link br}\n */\n isContainedWithinRect(tl: Point, br: Point): boolean {\n const { left, top, width, height } = this.getBoundingRect();\n return (\n left >= tl.x &&\n left + width <= br.x &&\n top >= tl.y &&\n top + height <= br.y\n );\n }\n\n isOverlapping(other: T): boolean {\n return (\n this.intersectsWithObject(other) ||\n this.isContainedWithinObject(other) ||\n other.isContainedWithinObject(this)\n );\n }\n\n /**\n * Checks if point is inside the object\n * @param {Point} point Point to check against\n * @return {Boolean} true if point is inside the object\n */\n containsPoint(point: Point): boolean {\n return Intersection.isPointInPolygon(point, this.getCoords());\n }\n\n /**\n * Checks if object is contained within the canvas with current viewportTransform\n * the check is done stopping at first point that appears on screen\n * @return {Boolean} true if object is fully or partially contained within canvas\n */\n isOnScreen(): boolean {\n if (!this.canvas) {\n return false;\n }\n const { tl, br } = this.canvas.vptCoords;\n const points = this.getCoords();\n // if some point is on screen, the object is on screen.\n if (\n points.some(\n (point) =>\n point.x <= br.x &&\n point.x >= tl.x &&\n point.y <= br.y &&\n point.y >= tl.y,\n )\n ) {\n return true;\n }\n // no points on screen, check intersection with absolute coordinates\n if (this.intersectsWithRect(tl, br)) {\n return true;\n }\n // check if the object is so big that it contains the entire viewport\n return this.containsPoint(tl.midPointFrom(br));\n }\n\n /**\n * Checks if object is partially contained within the canvas with current viewportTransform\n * @return {Boolean} true if object is partially contained within canvas\n */\n isPartiallyOnScreen(): boolean {\n if (!this.canvas) {\n return false;\n }\n const { tl, br } = this.canvas.vptCoords;\n if (this.intersectsWithRect(tl, br)) {\n return true;\n }\n const allPointsAreOutside = this.getCoords().every(\n (point) =>\n (point.x >= br.x || point.x <= tl.x) &&\n (point.y >= br.y || point.y <= tl.y),\n );\n // check if the object is so big that it contains the entire viewport\n return allPointsAreOutside && this.containsPoint(tl.midPointFrom(br));\n }\n\n /**\n * Returns coordinates of object's bounding rectangle (left, top, width, height)\n * the box is intended as aligned to axis of canvas.\n * @return {Object} Object with left, top, width, height properties\n */\n getBoundingRect(): TBBox {\n return makeBoundingBoxFromPoints(this.getCoords());\n }\n\n /**\n * Returns width of an object's bounding box counting transformations\n * @todo shouldn't this account for group transform and return the actual size in canvas coordinate plane?\n * @return {Number} width value\n */\n getScaledWidth(): number {\n return this._getTransformedDimensions().x;\n }\n\n /**\n * Returns height of an object bounding box counting transformations\n * @todo shouldn't this account for group transform and return the actual size in canvas coordinate plane?\n * @return {Number} height value\n */\n getScaledHeight(): number {\n return this._getTransformedDimensions().y;\n }\n\n /**\n * Scales an object (equally by x and y)\n * @param {Number} value Scale factor\n * @return {void}\n */\n scale(value: number): void {\n this._set(SCALE_X, value);\n this._set(SCALE_Y, value);\n this.setCoords();\n }\n\n /**\n * Scales an object to a given width, with respect to bounding box (scaling by x/y equally)\n * @param {Number} value New width value\n * @return {void}\n */\n scaleToWidth(value: number) {\n // adjust to bounding rect factor so that rotated shapes would fit as well\n const boundingRectFactor =\n this.getBoundingRect().width / this.getScaledWidth();\n return this.scale(value / this.width / boundingRectFactor);\n }\n\n /**\n * Scales an object to a given height, with respect to bounding box (scaling by x/y equally)\n * @param {Number} value New height value\n * @return {void}\n */\n scaleToHeight(value: number) {\n // adjust to bounding rect factor so that rotated shapes would fit as well\n const boundingRectFactor =\n this.getBoundingRect().height / this.getScaledHeight();\n return this.scale(value / this.height / boundingRectFactor);\n }\n\n getCanvasRetinaScaling() {\n return this.canvas?.getRetinaScaling() || 1;\n }\n\n /**\n * Returns the object angle relative to canvas counting also the group property\n * @returns {TDegree}\n */\n getTotalAngle(): TDegree {\n return this.group\n ? radiansToDegrees(calcPlaneRotation(this.calcTransformMatrix()))\n : this.angle;\n }\n\n /**\n * Retrieves viewportTransform from Object's canvas if available\n * @return {TMat2D}\n */\n getViewportTransform(): TMat2D {\n return this.canvas?.viewportTransform || (iMatrix.concat() as TMat2D);\n }\n\n /**\n * Calculates the coordinates of the 4 corner of the bbox, in absolute coordinates.\n * those never change with zoom or viewport changes.\n * @return {TCornerPoint}\n */\n calcACoords(): TCornerPoint {\n const rotateMatrix = createRotateMatrix({ angle: this.angle }),\n { x, y } = this.getRelativeCenterPoint(),\n tMatrix = createTranslateMatrix(x, y),\n finalMatrix = multiplyTransformMatrices(tMatrix, rotateMatrix),\n dim = this._getTransformedDimensions(),\n w = dim.x / 2,\n h = dim.y / 2;\n return {\n // corners\n tl: transformPoint({ x: -w, y: -h }, finalMatrix),\n tr: transformPoint({ x: w, y: -h }, finalMatrix),\n bl: transformPoint({ x: -w, y: h }, finalMatrix),\n br: transformPoint({ x: w, y: h }, finalMatrix),\n };\n }\n\n /**\n * Sets corner and controls position coordinates based on current angle, width and height, left and top.\n * aCoords are used to quickly find an object on the canvas.\n * See {@link https://github.com/fabricjs/fabric.js/wiki/When-to-call-setCoords} and {@link http://fabricjs.com/fabric-gotchas}\n */\n setCoords(): void {\n this.aCoords = this.calcACoords();\n }\n\n transformMatrixKey(skipGroup = false): number[] {\n let prefix: number[] = [];\n if (!skipGroup && this.group) {\n prefix = this.group.transformMatrixKey(skipGroup);\n }\n prefix.push(\n this.top,\n this.left,\n this.width,\n this.height,\n this.scaleX,\n this.scaleY,\n this.angle,\n this.strokeWidth,\n this.skewX,\n this.skewY,\n +this.flipX,\n +this.flipY,\n resolveOrigin(this.originX),\n resolveOrigin(this.originY),\n );\n\n return prefix;\n }\n\n /**\n * calculate transform matrix that represents the current transformations from the\n * object's properties.\n * @param {Boolean} [skipGroup] return transform matrix for object not counting parent transformations\n * There are some situation in which this is useful to avoid the fake rotation.\n * @return {TMat2D} transform matrix for the object\n */\n calcTransformMatrix(skipGroup = false): TMat2D {\n let matrix = this.calcOwnMatrix();\n if (skipGroup || !this.group) {\n return matrix;\n }\n const key = this.transformMatrixKey(skipGroup),\n cache = this.matrixCache;\n if (cache && cache.key.every((x, i) => x === key[i])) {\n return cache.value;\n }\n if (this.group) {\n matrix = multiplyTransformMatrices(\n this.group.calcTransformMatrix(false),\n matrix,\n );\n }\n this.matrixCache = {\n key,\n value: matrix,\n };\n return matrix;\n }\n\n /**\n * calculate transform matrix that represents the current transformations from the\n * object's properties, this matrix does not include the group transformation\n * @return {TMat2D} transform matrix for the object\n */\n calcOwnMatrix(): TMat2D {\n const key = this.transformMatrixKey(true),\n cache = this.ownMatrixCache;\n if (cache && cache.key === key) {\n return cache.value;\n }\n const center = this.getRelativeCenterPoint(),\n options = {\n angle: this.angle,\n translateX: center.x,\n translateY: center.y,\n scaleX: this.scaleX,\n scaleY: this.scaleY,\n skewX: this.skewX,\n skewY: this.skewY,\n flipX: this.flipX,\n flipY: this.flipY,\n },\n value = composeMatrix(options);\n this.ownMatrixCache = {\n key,\n value,\n };\n return value;\n }\n\n /**\n * Calculate object dimensions from its properties\n * @private\n * @returns {Point} dimensions\n */\n _getNonTransformedDimensions(): Point {\n return new Point(this.width, this.height).scalarAdd(this.strokeWidth);\n }\n\n /**\n * Calculate object dimensions for controls box, including padding and canvas zoom.\n * and active selection\n * @private\n * @param {object} [options] transform options\n * @returns {Point} dimensions\n */\n _calculateCurrentDimensions(options?: any): Point {\n return this._getTransformedDimensions(options)\n .transform(this.getViewportTransform(), true)\n .scalarAdd(2 * this.padding);\n }\n\n // #region Origin\n\n declare top: number;\n declare left: number;\n declare width: number;\n declare height: number;\n declare flipX: boolean;\n declare flipY: boolean;\n declare scaleX: number;\n declare scaleY: number;\n declare skewX: number;\n declare skewY: number;\n /**\n * @deprecated please use 'center' as value in new projects\n * */\n declare originX: TOriginX;\n /**\n * @deprecated please use 'center' as value in new projects\n * */\n declare originY: TOriginY;\n declare angle: TDegree;\n declare strokeWidth: number;\n declare strokeUniform: boolean;\n\n /**\n * Object containing this object.\n * can influence its size and position\n */\n declare group?: Group;\n\n /**\n * Calculate object bounding box dimensions from its properties scale, skew.\n * This bounding box is aligned with object angle and not with canvas axis or screen.\n * @param {Object} [options]\n * @param {Number} [options.scaleX]\n * @param {Number} [options.scaleY]\n * @param {Number} [options.skewX]\n * @param {Number} [options.skewY]\n * @private\n * @returns {Point} dimensions\n */\n _getTransformedDimensions(options: any = {}): Point {\n const dimOptions = {\n // if scaleX or scaleY are negative numbers,\n // this will return dimensions that are negative.\n // and this will break assumptions around the codebase\n scaleX: this.scaleX,\n scaleY: this.scaleY,\n skewX: this.skewX,\n skewY: this.skewY,\n width: this.width,\n height: this.height,\n strokeWidth: this.strokeWidth,\n // TODO remove this spread. is visible in the performance inspection\n ...options,\n };\n // stroke is applied before/after transformations are applied according to `strokeUniform`\n const strokeWidth = dimOptions.strokeWidth;\n let preScalingStrokeValue = strokeWidth,\n postScalingStrokeValue = 0;\n\n if (this.strokeUniform) {\n preScalingStrokeValue = 0;\n postScalingStrokeValue = strokeWidth;\n }\n const dimX = dimOptions.width + preScalingStrokeValue,\n dimY = dimOptions.height + preScalingStrokeValue,\n noSkew = dimOptions.skewX === 0 && dimOptions.skewY === 0;\n let finalDimensions;\n if (noSkew) {\n finalDimensions = new Point(\n dimX * dimOptions.scaleX,\n dimY * dimOptions.scaleY,\n );\n } else {\n finalDimensions = sizeAfterTransform(\n dimX,\n dimY,\n calcDimensionsMatrix(dimOptions),\n );\n }\n\n return finalDimensions.scalarAdd(postScalingStrokeValue);\n }\n\n /**\n * Translates the coordinates from a set of origin to another (based on the object's dimensions)\n * @param {Point} point The point which corresponds to the originX and originY params\n * @param {TOriginX} fromOriginX Horizontal origin: 'left', 'center' or 'right'\n * @param {TOriginY} fromOriginY Vertical origin: 'top', 'center' or 'bottom'\n * @param {TOriginX} toOriginX Horizontal origin: 'left', 'center' or 'right'\n * @param {TOriginY} toOriginY Vertical origin: 'top', 'center' or 'bottom'\n * @return {Point}\n */\n translateToGivenOrigin(\n point: Point,\n fromOriginX: TOriginX,\n fromOriginY: TOriginY,\n toOriginX: TOriginX,\n toOriginY: TOriginY,\n ): Point {\n let x = point.x,\n y = point.y;\n const offsetX = resolveOrigin(toOriginX) - resolveOrigin(fromOriginX),\n offsetY = resolveOrigin(toOriginY) - resolveOrigin(fromOriginY);\n\n if (offsetX || offsetY) {\n const dim = this._getTransformedDimensions();\n x += offsetX * dim.x;\n y += offsetY * dim.y;\n }\n\n return new Point(x, y);\n }\n\n /**\n * Translates the coordinates from origin to center coordinates (based on the object's dimensions)\n * @param {Point} point The point which corresponds to the originX and originY params\n * @param {TOriginX} originX Horizontal origin: 'left', 'center' or 'right'\n * @param {TOriginY} originY Vertical origin: 'top', 'center' or 'bottom'\n * @return {Point}\n */\n translateToCenterPoint(\n point: Point,\n originX: TOriginX,\n originY: TOriginY,\n ): Point {\n if (originX === CENTER && originY === CENTER) {\n return point;\n }\n const p = this.translateToGivenOrigin(\n point,\n originX,\n originY,\n CENTER,\n CENTER,\n );\n if (this.angle) {\n return p.rotate(degreesToRadians(this.angle), point);\n }\n return p;\n }\n\n /**\n * Translates the coordinates from center to origin coordinates (based on the object's dimensions)\n * @param {Point} center The point which corresponds to center of the object\n * @param {OriginX} originX Horizontal origin: 'left', 'center' or 'right'\n * @param {OriginY} originY Vertical origin: 'top', 'center' or 'bottom'\n * @return {Point}\n */\n translateToOriginPoint(\n center: Point,\n originX: TOriginX,\n originY: TOriginY,\n ): Point {\n const p = this.translateToGivenOrigin(\n center,\n CENTER,\n CENTER,\n originX,\n originY,\n );\n if (this.angle) {\n return p.rotate(degreesToRadians(this.angle), center);\n }\n return p;\n }\n\n /**\n * Returns the center coordinates of the object relative to canvas\n * @return {Point}\n */\n getCenterPoint(): Point {\n const relCenter = this.getRelativeCenterPoint();\n return this.group\n ? transformPoint(relCenter, this.group.calcTransformMatrix())\n : relCenter;\n }\n\n /**\n * Returns the center coordinates of the object relative to it's parent\n * @return {Point}\n */\n getRelativeCenterPoint(): Point {\n return this.translateToCenterPoint(\n new Point(this.left, this.top),\n this.originX,\n this.originY,\n );\n }\n\n /**\n * Returns the position of the object as if it has a different origin.\n * Take an object that has left, top set to 100, 100 with origin 'left', 'top'.\n * Return the values of left top ( wrapped in a point ) that you would need to keep\n * the same position if origin where different.\n * Alternatively you can use this to also find which point in the parent plane is a specific origin\n * ( where is the bottom right corner of my object? )\n * @param {TOriginX} originX Horizontal origin: 'left', 'center' or 'right'\n * @param {TOriginY} originY Vertical origin: 'top', 'center' or 'bottom'\n * @return {Point}\n */\n getPointByOrigin(originX: TOriginX, originY: TOriginY): Point {\n return this.translateToOriginPoint(\n this.getRelativeCenterPoint(),\n originX,\n originY,\n );\n }\n\n /**\n * Sets the position of the object taking into consideration the object's origin\n * @param {Point} pos The new position of the object\n * @param {TOriginX} originX Horizontal origin: 'left', 'center' or 'right'\n * @param {TOriginY} originY Vertical origin: 'top', 'center' or 'bottom'\n * @return {void}\n */\n setPositionByOrigin(pos: Point, originX: TOriginX, originY: TOriginY) {\n const center = this.translateToCenterPoint(pos, originX, originY),\n position = this.translateToOriginPoint(\n center,\n this.originX,\n this.originY,\n );\n this.set({ left: position.x, top: position.y });\n }\n\n /**\n * @private\n */\n _getLeftTopCoords() {\n return this.translateToOriginPoint(\n this.getRelativeCenterPoint(),\n LEFT,\n TOP,\n );\n }\n}\n","import { cache } from '../../cache';\nimport { config } from '../../config';\nimport {\n ALIASING_LIMIT,\n CENTER,\n iMatrix,\n LEFT,\n SCALE_X,\n SCALE_Y,\n STROKE,\n FILL,\n TOP,\n VERSION,\n} from '../../constants';\nimport type { ObjectEvents } from '../../EventTypeDefs';\nimport { Point } from '../../Point';\nimport { Shadow } from '../../Shadow';\nimport type {\n TDegree,\n TFiller,\n TSize,\n TCacheCanvasDimensions,\n Abortable,\n TOptions,\n ImageFormat,\n} from '../../typedefs';\nimport { classRegistry } from '../../ClassRegistry';\nimport { runningAnimations } from '../../util/animation/AnimationRegistry';\nimport { capValue } from '../../util/misc/capValue';\nimport {\n createCanvasElement,\n createCanvasElementFor,\n toDataURL,\n toBlob,\n} from '../../util/misc/dom';\nimport { invertTransform, qrDecompose } from '../../util/misc/matrix';\nimport { enlivenObjectEnlivables } from '../../util/misc/objectEnlive';\nimport {\n resetObjectTransform,\n saveObjectTransform,\n} from '../../util/misc/objectTransforms';\nimport { sendObjectToPlane } from '../../util/misc/planeChange';\nimport { pick, pickBy } from '../../util/misc/pick';\nimport { toFixed } from '../../util/misc/toFixed';\nimport type { Group } from '../Group';\nimport { StaticCanvas } from '../../canvas/StaticCanvas';\nimport { isFiller, isSerializableFiller } from '../../util/typeAssertions';\nimport type { FabricImage } from '../Image';\nimport {\n cacheProperties,\n fabricObjectDefaultValues,\n stateProperties,\n} from './defaultValues';\nimport type { Gradient } from '../../gradient/Gradient';\nimport type { Pattern } from '../../Pattern';\nimport type { Canvas } from '../../canvas/Canvas';\nimport type { SerializedObjectProps } from './types/SerializedObjectProps';\nimport type { ObjectProps } from './types/ObjectProps';\nimport { getDevicePixelRatio, getEnv } from '../../env';\nimport { log } from '../../util/internals/console';\nimport type { TColorArg } from '../../color/typedefs';\nimport type { TAnimation } from '../../util/animation/animate';\nimport { animate, animateColor } from '../../util/animation/animate';\nimport type {\n AnimationOptions,\n ArrayAnimationOptions,\n ColorAnimationOptions,\n ValueAnimationOptions,\n} from '../../util/animation/types';\nimport { ObjectGeometry } from './ObjectGeometry';\n\ntype TAncestor = FabricObject;\ntype TCollection = Group;\n\nexport type Ancestors =\n | [FabricObject | Group]\n | [FabricObject | Group, ...Group[]]\n | Group[];\n\nexport type AncestryComparison = {\n /**\n * common ancestors of `this` and`other`(may include`this` | `other`)\n */\n common: Ancestors;\n /**\n * ancestors that are of `this` only\n */\n fork: Ancestors;\n /**\n * ancestors that are of `other` only\n */\n otherFork: Ancestors;\n};\n\nexport type TCachedFabricObject = T &\n Required<\n Pick<\n T,\n | 'zoomX'\n | 'zoomY'\n | '_cacheCanvas'\n | '_cacheContext'\n | 'cacheTranslationX'\n | 'cacheTranslationY'\n >\n > & {\n _cacheContext: CanvasRenderingContext2D;\n };\n\nexport type ObjectToCanvasElementOptions = {\n format?: ImageFormat;\n /** Multiplier to scale by */\n multiplier?: number;\n /** Cropping left offset. Introduced in v1.2.14 */\n left?: number;\n /** Cropping top offset. Introduced in v1.2.14 */\n top?: number;\n /** Cropping width. Introduced in v1.2.14 */\n width?: number;\n /** Cropping height. Introduced in v1.2.14 */\n height?: number;\n /** Enable retina scaling for clone image. Introduce in 1.6.4 */\n enableRetinaScaling?: boolean;\n /** Remove current object transform ( no scale , no angle, no flip, no skew ). Introduced in 2.3.4 */\n withoutTransform?: boolean;\n /** Remove current object shadow. Introduced in 2.4.2 */\n withoutShadow?: boolean;\n /** Account for canvas viewport transform */\n viewportTransform?: boolean;\n /** Function to create the output canvas to export onto */\n canvasProvider?: (el?: HTMLCanvasElement) => T;\n};\n\ntype toDataURLOptions = ObjectToCanvasElementOptions & {\n quality?: number;\n};\n\nexport type DrawContext =\n | {\n parentClipPaths: FabricObject[];\n width: number;\n height: number;\n cacheTranslationX: number;\n cacheTranslationY: number;\n zoomX: number;\n zoomY: number;\n }\n | Record;\n\n/**\n * Root object class from which all 2d shape classes inherit from\n * @tutorial {@link http://fabricjs.com/fabric-intro-part-1#objects}\n *\n * @fires added\n * @fires removed\n *\n * @fires selected\n * @fires deselected\n *\n * @fires rotating\n * @fires scaling\n * @fires moving\n * @fires skewing\n * @fires modified\n *\n * @fires mousedown\n * @fires mouseup\n * @fires mouseover\n * @fires mouseout\n * @fires mousewheel\n * @fires mousedblclick\n *\n * @fires dragover\n * @fires dragenter\n * @fires dragleave\n * @fires drop\n */\nexport class FabricObject<\n Props extends TOptions = Partial,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n SProps extends SerializedObjectProps = SerializedObjectProps,\n EventSpec extends ObjectEvents = ObjectEvents,\n >\n extends ObjectGeometry\n implements ObjectProps\n{\n declare minScaleLimit: number;\n\n declare opacity: number;\n\n declare paintFirst: 'fill' | 'stroke';\n declare fill: string | TFiller | null;\n declare fillRule: CanvasFillRule;\n declare stroke: string | TFiller | null;\n declare strokeDashArray: number[] | null;\n declare strokeDashOffset: number;\n declare strokeLineCap: CanvasLineCap;\n declare strokeLineJoin: CanvasLineJoin;\n declare strokeMiterLimit: number;\n\n declare globalCompositeOperation: GlobalCompositeOperation;\n declare backgroundColor: string;\n\n declare shadow: Shadow | null;\n\n declare visible: boolean;\n\n declare includeDefaultValues: boolean;\n declare excludeFromExport: boolean;\n\n declare objectCaching: boolean;\n\n declare clipPath?: FabricObject;\n declare inverted: boolean;\n declare absolutePositioned: boolean;\n declare centeredRotation: boolean;\n declare centeredScaling: boolean;\n\n /**\n * This list of properties is used to check if the state of an object is changed.\n * This state change now is only used for children of groups to understand if a group\n * needs its cache regenerated during a .set call\n * @type Array\n */\n static stateProperties: string[] = stateProperties;\n\n /**\n * List of properties to consider when checking if cache needs refresh\n * Those properties are checked by\n * calls to Object.set(key, value). If the key is in this list, the object is marked as dirty\n * and refreshed at the next render\n * @type Array\n */\n static cacheProperties: string[] = cacheProperties;\n\n /**\n * When set to `true`, object's cache will be rerendered next render call.\n * since 1.7.0\n * @type Boolean\n * @default true\n */\n declare dirty: boolean;\n\n /**\n * Quick access for the _cacheCanvas rendering context\n * This is part of the objectCaching feature\n * since 1.7.0\n * @type boolean\n * @default undefined\n * @private\n */\n _cacheContext: CanvasRenderingContext2D | null = null;\n\n /**\n * A reference to the HTMLCanvasElement that is used to contain the cache of the object\n * this canvas element is resized and cleared as needed\n * Is marked private, you can read it, don't use it since it is handled by fabric\n * since 1.7.0\n * @type HTMLCanvasElement\n * @default undefined\n * @private\n */\n declare _cacheCanvas?: HTMLCanvasElement;\n\n /**\n * zoom level used on the cacheCanvas to draw the cache, X axe\n * since 1.7.0\n * @type number\n * @default undefined\n * @private\n */\n declare zoomX?: number;\n\n /**\n * zoom level used on the cacheCanvas to draw the cache, Y axe\n * since 1.7.0\n * @type number\n * @default undefined\n * @private\n */\n declare zoomY?: number;\n\n /**\n * zoom level used on the cacheCanvas to draw the cache, Y axe\n * since 1.7.0\n * @type number\n * @default undefined\n * @private\n */\n declare cacheTranslationX?: number;\n\n /**\n * translation of the cacheCanvas away from the center, for subpixel accuracy and crispness\n * since 1.7.0\n * @type number\n * @default undefined\n * @private\n */\n declare cacheTranslationY?: number;\n\n /**\n * A reference to the parent of the object, usually a Group\n * @type number\n * @default undefined\n * @private\n */\n declare group?: Group;\n\n /**\n * Indicate if the object is sitting on a cache dedicated to it\n * or is part of a larger cache for many object ( a group for example)\n * @type number\n * @default undefined\n * @private\n */\n declare ownCaching?: boolean;\n\n /**\n * Private. indicates if the object inside a group is on a transformed context or not\n * or is part of a larger cache for many object ( a group for example)\n * @type boolean\n * @default undefined\n * @private\n */\n declare _transformDone?: boolean;\n\n static ownDefaults = fabricObjectDefaultValues;\n\n static getDefaults(): Record {\n return FabricObject.ownDefaults;\n }\n\n /**\n * The class type.\n * This is used for serialization and deserialization purposes and internally it can be used\n * to identify classes.\n * When we transform a class in a plain JS object we need a way to recognize which class it was,\n * and the type is the way we do that. It has no other purposes and you should not give one.\n * Hard to reach on instances and please do not use to drive instance's logic (this.constructor.type).\n * To idenfity a class use instanceof class ( instanceof Rect ).\n * We do not do that in fabricJS code because we want to try to have code splitting possible.\n */\n static type = 'FabricObject';\n\n /**\n * Legacy identifier of the class. Prefer using utils like isType or instanceOf\n * Will be removed in fabric 7 or 8.\n * The setter exists to avoid type errors in old code and possibly current deserialization code.\n * DO NOT build new code around this type value\n * @TODO add sustainable warning message\n * @type string\n * @deprecated\n */\n get type() {\n const name = (this.constructor as typeof FabricObject).type;\n if (name === 'FabricObject') {\n return 'object';\n }\n return name.toLowerCase();\n }\n\n set type(value) {\n log('warn', 'Setting type has no effect', value);\n }\n\n /**\n * Constructor\n * @param {Object} [options] Options object\n */\n constructor(options?: Props) {\n super();\n Object.assign(this, FabricObject.ownDefaults);\n this.setOptions(options);\n }\n\n /**\n * Create a the canvas used to keep the cached copy of the object\n * @private\n */\n _createCacheCanvas() {\n this._cacheCanvas = createCanvasElement();\n this._cacheContext = this._cacheCanvas.getContext('2d');\n this._updateCacheCanvas();\n // if canvas gets created, is empty, so dirty.\n this.dirty = true;\n }\n\n /**\n * Limit the cache dimensions so that X * Y do not cross config.perfLimitSizeTotal\n * and each side do not cross fabric.cacheSideLimit\n * those numbers are configurable so that you can get as much detail as you want\n * making bargain with performances.\n * It mutates the input object dims.\n * @param {TCacheCanvasDimensions} dims\n * @return {TCacheCanvasDimensions} dims\n */\n _limitCacheSize(\n dims: TCacheCanvasDimensions & { capped?: boolean },\n ): TCacheCanvasDimensions & { capped?: boolean } {\n const width = dims.width,\n height = dims.height,\n max = config.maxCacheSideLimit,\n min = config.minCacheSideLimit;\n if (\n width <= max &&\n height <= max &&\n width * height <= config.perfLimitSizeTotal\n ) {\n if (width < min) {\n dims.width = min;\n }\n if (height < min) {\n dims.height = min;\n }\n return dims;\n }\n const ar = width / height,\n [limX, limY] = cache.limitDimsByArea(ar),\n x = capValue(min, limX, max),\n y = capValue(min, limY, max);\n if (width > x) {\n dims.zoomX /= width / x;\n dims.width = x;\n dims.capped = true;\n }\n if (height > y) {\n dims.zoomY /= height / y;\n dims.height = y;\n dims.capped = true;\n }\n return dims;\n }\n\n /**\n * Return the dimension and the zoom level needed to create a cache canvas\n * big enough to host the object to be cached.\n * @private\n * @return {TCacheCanvasDimensions} Informations about the object to be cached\n */\n _getCacheCanvasDimensions(): TCacheCanvasDimensions {\n const objectScale = this.getTotalObjectScaling(),\n // calculate dimensions without skewing\n dim = this._getTransformedDimensions({ skewX: 0, skewY: 0 }),\n neededX = (dim.x * objectScale.x) / this.scaleX,\n neededY = (dim.y * objectScale.y) / this.scaleY;\n return {\n // for sure this ALIASING_LIMIT is slightly creating problem\n // in situation in which the cache canvas gets an upper limit\n // also objectScale contains already scaleX and scaleY\n width: Math.ceil(neededX + ALIASING_LIMIT),\n height: Math.ceil(neededY + ALIASING_LIMIT),\n zoomX: objectScale.x,\n zoomY: objectScale.y,\n x: neededX,\n y: neededY,\n };\n }\n\n /**\n * Update width and height of the canvas for cache\n * returns true or false if canvas needed resize.\n * @private\n * @return {Boolean} true if the canvas has been resized\n */\n _updateCacheCanvas() {\n const canvas = this._cacheCanvas!,\n context = this._cacheContext,\n { width, height, zoomX, zoomY, x, y } = this._limitCacheSize(\n this._getCacheCanvasDimensions(),\n ),\n dimensionsChanged = width !== canvas.width || height !== canvas.height,\n zoomChanged = this.zoomX !== zoomX || this.zoomY !== zoomY;\n\n if (!canvas || !context) {\n return false;\n }\n\n const shouldRedraw = dimensionsChanged || zoomChanged;\n\n if (shouldRedraw) {\n if (width !== canvas.width || height !== canvas.height) {\n canvas.width = width;\n canvas.height = height;\n } else {\n context.setTransform(1, 0, 0, 1, 0, 0);\n context.clearRect(0, 0, canvas.width, canvas.height);\n }\n const drawingWidth = x / 2;\n const drawingHeight = y / 2;\n this.cacheTranslationX =\n Math.round(canvas.width / 2 - drawingWidth) + drawingWidth;\n this.cacheTranslationY =\n Math.round(canvas.height / 2 - drawingHeight) + drawingHeight;\n context.translate(this.cacheTranslationX, this.cacheTranslationY);\n context.scale(zoomX, zoomY);\n this.zoomX = zoomX;\n this.zoomY = zoomY;\n return true;\n }\n return false;\n }\n\n /**\n * Sets object's properties from options, for class constructor only.\n * Needs to be overridden for different defaults.\n * @protected\n * @param {Object} [options] Options object\n */\n protected setOptions(options: Record = {}) {\n this._setOptions(options);\n }\n\n /**\n * Transforms context when rendering an object\n * @param {CanvasRenderingContext2D} ctx Context\n */\n transform(ctx: CanvasRenderingContext2D) {\n const needFullTransform =\n (this.group && !this.group._transformDone) ||\n (this.group && this.canvas && ctx === (this.canvas as Canvas).contextTop);\n const m = this.calcTransformMatrix(!needFullTransform);\n ctx.transform(m[0], m[1], m[2], m[3], m[4], m[5]);\n }\n\n /**\n * Return the object scale factor counting also the group scaling\n * @return {Point}\n */\n getObjectScaling() {\n // if the object is a top level one, on the canvas, we go for simple aritmetic\n // otherwise the complex method with angles will return approximations and decimals\n // and will likely kill the cache when not needed\n // https://github.com/fabricjs/fabric.js/issues/7157\n if (!this.group) {\n return new Point(Math.abs(this.scaleX), Math.abs(this.scaleY));\n }\n // if we are inside a group total zoom calculation is complex, we defer to generic matrices\n const options = qrDecompose(this.calcTransformMatrix());\n return new Point(Math.abs(options.scaleX), Math.abs(options.scaleY));\n }\n\n /**\n * Return the object scale factor counting also the group scaling, zoom and retina\n * @return {Object} object with scaleX and scaleY properties\n */\n getTotalObjectScaling() {\n const scale = this.getObjectScaling();\n if (this.canvas) {\n const zoom = this.canvas.getZoom();\n const retina = this.getCanvasRetinaScaling();\n return scale.scalarMultiply(zoom * retina);\n }\n return scale;\n }\n\n /**\n * Return the object opacity counting also the group property\n * @return {Number}\n */\n getObjectOpacity() {\n let opacity = this.opacity;\n if (this.group) {\n opacity *= this.group.getObjectOpacity();\n }\n return opacity;\n }\n\n /**\n * Makes sure the scale is valid and modifies it if necessary\n * @todo: this is a control action issue, not a geometry one\n * @private\n * @param {Number} value, unconstrained\n * @return {Number} constrained value;\n */\n _constrainScale(value: number): number {\n if (Math.abs(value) < this.minScaleLimit) {\n if (value < 0) {\n return -this.minScaleLimit;\n } else {\n return this.minScaleLimit;\n }\n } else if (value === 0) {\n return 0.0001;\n }\n return value;\n }\n\n /**\n * Handles setting values on the instance and handling internal side effects\n * @protected\n * @param {String} key\n * @param {*} value\n */\n _set(key: string, value: any) {\n if (key === SCALE_X || key === SCALE_Y) {\n value = this._constrainScale(value);\n }\n if (key === SCALE_X && value < 0) {\n this.flipX = !this.flipX;\n value *= -1;\n } else if (key === 'scaleY' && value < 0) {\n this.flipY = !this.flipY;\n value *= -1;\n // i don't like this automatic initialization here\n } else if (key === 'shadow' && value && !(value instanceof Shadow)) {\n value = new Shadow(value);\n }\n\n const isChanged = this[key as keyof this] !== value;\n this[key as keyof this] = value;\n\n // invalidate caches\n if (\n isChanged &&\n (this.constructor as typeof FabricObject).cacheProperties.includes(key)\n ) {\n this.dirty = true;\n }\n // a dirty child makes the parent dirty.\n // but a non dirty child does not make the parent not dirty.\n // the parent could be dirty for some other reason.\n this.parent &&\n (this.dirty ||\n (isChanged &&\n (this.constructor as typeof FabricObject).stateProperties.includes(\n key,\n ))) &&\n this.parent._set('dirty', true);\n\n return this;\n }\n\n /**\n * return if the object would be visible in rendering\n * @return {Boolean}\n */\n isNotVisible() {\n return (\n this.opacity === 0 ||\n (!this.width && !this.height && this.strokeWidth === 0) ||\n !this.visible\n );\n }\n\n /**\n * Renders an object on a specified context\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n render(ctx: CanvasRenderingContext2D) {\n // do not render if width/height are zeros or object is not visible\n if (this.isNotVisible()) {\n return;\n }\n if (\n this.canvas &&\n this.canvas.skipOffscreen &&\n !this.group &&\n !this.isOnScreen()\n ) {\n return;\n }\n ctx.save();\n this._setupCompositeOperation(ctx);\n this.drawSelectionBackground(ctx);\n this.transform(ctx);\n this._setOpacity(ctx);\n this._setShadow(ctx);\n if (this.shouldCache()) {\n (this as TCachedFabricObject).renderCache();\n (this as TCachedFabricObject).drawCacheOnCanvas(ctx);\n } else {\n this._removeCacheCanvas();\n this.drawObject(ctx, false, {});\n this.dirty = false;\n }\n ctx.restore();\n }\n\n drawSelectionBackground(_ctx: CanvasRenderingContext2D) {\n /* no op */\n }\n\n renderCache(this: TCachedFabricObject, options?: any) {\n options = options || {};\n if (!this._cacheCanvas || !this._cacheContext) {\n this._createCacheCanvas();\n }\n if (this.isCacheDirty() && this._cacheContext) {\n const { zoomX, zoomY, cacheTranslationX, cacheTranslationY } = this;\n const { width, height } = this._cacheCanvas;\n this.drawObject(this._cacheContext, options.forClipping, {\n zoomX,\n zoomY,\n cacheTranslationX,\n cacheTranslationY,\n width,\n height,\n parentClipPaths: [],\n });\n this.dirty = false;\n }\n }\n\n /**\n * Remove cacheCanvas and its dimensions from the objects\n */\n _removeCacheCanvas() {\n this._cacheCanvas = undefined;\n this._cacheContext = null;\n }\n\n /**\n * return true if the object will draw a stroke\n * Does not consider text styles. This is just a shortcut used at rendering time\n * We want it to be an approximation and be fast.\n * wrote to avoid extra caching, it has to return true when stroke happens,\n * can guess when it will not happen at 100% chance, does not matter if it misses\n * some use case where the stroke is invisible.\n * @since 3.0.0\n * @returns Boolean\n */\n hasStroke(): boolean {\n return (\n !!this.stroke && this.stroke !== 'transparent' && this.strokeWidth !== 0\n );\n }\n\n /**\n * return true if the object will draw a fill\n * Does not consider text styles. This is just a shortcut used at rendering time\n * We want it to be an approximation and be fast.\n * wrote to avoid extra caching, it has to return true when fill happens,\n * can guess when it will not happen at 100% chance, does not matter if it misses\n * some use case where the fill is invisible.\n * @since 3.0.0\n * @returns Boolean\n */\n hasFill(): boolean {\n return !!this.fill && this.fill !== 'transparent';\n }\n\n /**\n * When returns `true`, force the object to have its own cache, even if it is inside a group\n * it may be needed when your object behave in a particular way on the cache and always needs\n * its own isolated canvas to render correctly.\n * Created to be overridden\n * since 1.7.12\n * @returns Boolean\n */\n needsItsOwnCache() {\n // TODO re-evaluate this shadow condition\n if (\n this.paintFirst === STROKE &&\n this.hasFill() &&\n this.hasStroke() &&\n !!this.shadow\n ) {\n return true;\n }\n if (this.clipPath) {\n return true;\n }\n return false;\n }\n\n /**\n * Decide if the object should cache or not. Create its own cache level\n * objectCaching is a global flag, wins over everything\n * needsItsOwnCache should be used when the object drawing method requires\n * a cache step.\n * Generally you do not cache objects in groups because the group outside is cached.\n * Read as: cache if is needed, or if the feature is enabled but we are not already caching.\n * @return {Boolean}\n */\n shouldCache() {\n this.ownCaching =\n (this.objectCaching && (!this.parent || !this.parent.isOnACache())) ||\n this.needsItsOwnCache();\n return this.ownCaching;\n }\n\n /**\n * Check if this object will cast a shadow with an offset.\n * used by Group.shouldCache to know if child has a shadow recursively\n * @return {Boolean}\n * @deprecated\n */\n willDrawShadow() {\n return (\n !!this.shadow && (this.shadow.offsetX !== 0 || this.shadow.offsetY !== 0)\n );\n }\n\n /**\n * Execute the drawing operation for an object clipPath\n * @param {CanvasRenderingContext2D} ctx Context to render on\n * @param {FabricObject} clipPath\n */\n drawClipPathOnCache(\n ctx: CanvasRenderingContext2D,\n clipPath: FabricObject,\n canvasWithClipPath: HTMLCanvasElement,\n ) {\n ctx.save();\n // DEBUG: uncomment this line, comment the following\n // ctx.globalAlpha = 0.4\n if (clipPath.inverted) {\n ctx.globalCompositeOperation = 'destination-out';\n } else {\n ctx.globalCompositeOperation = 'destination-in';\n }\n ctx.setTransform(1, 0, 0, 1, 0, 0);\n ctx.drawImage(canvasWithClipPath, 0, 0);\n ctx.restore();\n }\n\n /**\n * Execute the drawing operation for an object on a specified context\n * @param {CanvasRenderingContext2D} ctx Context to render on\n * @param {boolean} forClipping apply clipping styles\n * @param {DrawContext} context additional context for rendering\n */\n drawObject(\n ctx: CanvasRenderingContext2D,\n forClipping: boolean | undefined,\n context: DrawContext,\n ) {\n const originalFill = this.fill,\n originalStroke = this.stroke;\n if (forClipping) {\n this.fill = 'black';\n this.stroke = '';\n this._setClippingProperties(ctx);\n } else {\n this._renderBackground(ctx);\n }\n this._render(ctx);\n this._drawClipPath(ctx, this.clipPath, context);\n this.fill = originalFill;\n this.stroke = originalStroke;\n }\n\n private createClipPathLayer(\n this: TCachedFabricObject,\n clipPath: FabricObject,\n context: DrawContext,\n ) {\n const canvas = createCanvasElementFor(context as TSize);\n const ctx = canvas.getContext('2d')!;\n ctx.translate(context.cacheTranslationX, context.cacheTranslationY);\n ctx.scale(context.zoomX, context.zoomY);\n clipPath._cacheCanvas = canvas;\n context.parentClipPaths.forEach((prevClipPath) => {\n prevClipPath.transform(ctx);\n });\n context.parentClipPaths.push(clipPath);\n if (clipPath.absolutePositioned) {\n const m = invertTransform(this.calcTransformMatrix());\n ctx.transform(m[0], m[1], m[2], m[3], m[4], m[5]);\n }\n clipPath.transform(ctx);\n clipPath.drawObject(ctx, true, context);\n return canvas;\n }\n\n /**\n * Prepare clipPath state and cache and draw it on instance's cache\n * @param {CanvasRenderingContext2D} ctx\n * @param {FabricObject} clipPath\n */\n _drawClipPath(\n ctx: CanvasRenderingContext2D,\n clipPath: FabricObject | undefined,\n context: DrawContext,\n ) {\n if (!clipPath) {\n return;\n }\n // needed to setup _transformDone\n // TODO find a better solution?\n clipPath._transformDone = true;\n const canvas = (this as TCachedFabricObject).createClipPathLayer(\n clipPath,\n context,\n );\n this.drawClipPathOnCache(ctx, clipPath, canvas);\n }\n\n /**\n * Paint the cached copy of the object on the target context.\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n drawCacheOnCanvas(this: TCachedFabricObject, ctx: CanvasRenderingContext2D) {\n ctx.scale(1 / this.zoomX, 1 / this.zoomY);\n ctx.drawImage(\n this._cacheCanvas,\n -this.cacheTranslationX,\n -this.cacheTranslationY,\n );\n }\n\n /**\n * Check if cache is dirty and if is dirty clear the context.\n * This check has a big side effect, it changes the underlying cache canvas if necessary.\n * Do not call this method on your own to check if the cache is dirty, because if it is,\n * it is also going to wipe the cache. This is badly designed and needs to be fixed.\n * @param {Boolean} skipCanvas skip canvas checks because this object is painted\n * on parent canvas.\n */\n isCacheDirty(skipCanvas = false) {\n if (this.isNotVisible()) {\n return false;\n }\n const canvas = this._cacheCanvas;\n const ctx = this._cacheContext;\n if (canvas && ctx && !skipCanvas && this._updateCacheCanvas()) {\n // in this case the context is already cleared.\n return true;\n } else {\n if (this.dirty || (this.clipPath && this.clipPath.absolutePositioned)) {\n if (canvas && ctx && !skipCanvas) {\n ctx.save();\n ctx.setTransform(1, 0, 0, 1, 0, 0);\n ctx.clearRect(0, 0, canvas.width, canvas.height);\n ctx.restore();\n }\n return true;\n }\n }\n return false;\n }\n\n /**\n * Draws a background for the object big as its untransformed dimensions\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _renderBackground(ctx: CanvasRenderingContext2D) {\n if (!this.backgroundColor) {\n return;\n }\n const dim = this._getNonTransformedDimensions();\n ctx.fillStyle = this.backgroundColor;\n\n ctx.fillRect(-dim.x / 2, -dim.y / 2, dim.x, dim.y);\n // if there is background color no other shadows\n // should be casted\n this._removeShadow(ctx);\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _setOpacity(ctx: CanvasRenderingContext2D) {\n if (this.group && !this.group._transformDone) {\n ctx.globalAlpha = this.getObjectOpacity();\n } else {\n ctx.globalAlpha *= this.opacity;\n }\n }\n\n _setStrokeStyles(\n ctx: CanvasRenderingContext2D,\n decl: Pick<\n this,\n | 'stroke'\n | 'strokeWidth'\n | 'strokeLineCap'\n | 'strokeDashOffset'\n | 'strokeLineJoin'\n | 'strokeMiterLimit'\n >,\n ) {\n const stroke = decl.stroke;\n if (stroke) {\n ctx.lineWidth = decl.strokeWidth;\n ctx.lineCap = decl.strokeLineCap;\n ctx.lineDashOffset = decl.strokeDashOffset;\n ctx.lineJoin = decl.strokeLineJoin;\n ctx.miterLimit = decl.strokeMiterLimit;\n if (isFiller(stroke)) {\n if (\n (stroke as Gradient<'linear'>).gradientUnits === 'percentage' ||\n (stroke as Gradient<'linear'>).gradientTransform ||\n (stroke as Pattern).patternTransform\n ) {\n // need to transform gradient in a pattern.\n // this is a slow process. If you are hitting this codepath, and the object\n // is not using caching, you should consider switching it on.\n // we need a canvas as big as the current object caching canvas.\n this._applyPatternForTransformedGradient(ctx, stroke);\n } else {\n // is a simple gradient or pattern\n ctx.strokeStyle = stroke.toLive(ctx)!;\n this._applyPatternGradientTransform(ctx, stroke);\n }\n } else {\n // is a color\n ctx.strokeStyle = decl.stroke as string;\n }\n }\n }\n\n _setFillStyles(ctx: CanvasRenderingContext2D, { fill }: Pick) {\n if (fill) {\n if (isFiller(fill)) {\n ctx.fillStyle = fill.toLive(ctx)!;\n this._applyPatternGradientTransform(ctx, fill);\n } else {\n ctx.fillStyle = fill;\n }\n }\n }\n\n _setClippingProperties(ctx: CanvasRenderingContext2D) {\n ctx.globalAlpha = 1;\n ctx.strokeStyle = 'transparent';\n ctx.fillStyle = '#000000';\n }\n\n /**\n * @private\n * Sets line dash\n * @param {CanvasRenderingContext2D} ctx Context to set the dash line on\n * @param {Array} dashArray array representing dashes\n */\n _setLineDash(ctx: CanvasRenderingContext2D, dashArray?: number[] | null) {\n if (!dashArray || dashArray.length === 0) {\n return;\n }\n ctx.setLineDash(dashArray);\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _setShadow(ctx: CanvasRenderingContext2D) {\n if (!this.shadow) {\n return;\n }\n\n const shadow = this.shadow,\n canvas = this.canvas,\n retinaScaling = this.getCanvasRetinaScaling(),\n [sx, , , sy] = canvas?.viewportTransform || iMatrix,\n multX = sx * retinaScaling,\n multY = sy * retinaScaling,\n scaling = shadow.nonScaling ? new Point(1, 1) : this.getObjectScaling();\n ctx.shadowColor = shadow.color;\n ctx.shadowBlur =\n (shadow.blur *\n config.browserShadowBlurConstant *\n (multX + multY) *\n (scaling.x + scaling.y)) /\n 4;\n ctx.shadowOffsetX = shadow.offsetX * multX * scaling.x;\n ctx.shadowOffsetY = shadow.offsetY * multY * scaling.y;\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _removeShadow(ctx: CanvasRenderingContext2D) {\n if (!this.shadow) {\n return;\n }\n\n ctx.shadowColor = '';\n ctx.shadowBlur = ctx.shadowOffsetX = ctx.shadowOffsetY = 0;\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n * @param {TFiller} filler {@link Pattern} or {@link Gradient}\n */\n _applyPatternGradientTransform(\n ctx: CanvasRenderingContext2D,\n filler: TFiller,\n ) {\n if (!isFiller(filler)) {\n return { offsetX: 0, offsetY: 0 };\n }\n const t =\n (filler as Gradient<'linear'>).gradientTransform ||\n (filler as Pattern).patternTransform;\n const offsetX = -this.width / 2 + filler.offsetX || 0,\n offsetY = -this.height / 2 + filler.offsetY || 0;\n\n if ((filler as Gradient<'linear'>).gradientUnits === 'percentage') {\n ctx.transform(this.width, 0, 0, this.height, offsetX, offsetY);\n } else {\n ctx.transform(1, 0, 0, 1, offsetX, offsetY);\n }\n if (t) {\n ctx.transform(t[0], t[1], t[2], t[3], t[4], t[5]);\n }\n return { offsetX: offsetX, offsetY: offsetY };\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _renderPaintInOrder(ctx: CanvasRenderingContext2D) {\n if (this.paintFirst === STROKE) {\n this._renderStroke(ctx);\n this._renderFill(ctx);\n } else {\n this._renderFill(ctx);\n this._renderStroke(ctx);\n }\n }\n\n /**\n * @private\n * function that actually render something on the context.\n * empty here to allow Obects to work on tests to benchmark fabric functionalites\n * not related to rendering\n * @param {CanvasRenderingContext2D} _ctx Context to render on\n */\n _render(_ctx: CanvasRenderingContext2D) {\n // placeholder to be overridden\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _renderFill(ctx: CanvasRenderingContext2D) {\n if (!this.fill) {\n return;\n }\n\n ctx.save();\n this._setFillStyles(ctx, this);\n if (this.fillRule === 'evenodd') {\n ctx.fill('evenodd');\n } else {\n ctx.fill();\n }\n ctx.restore();\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _renderStroke(ctx: CanvasRenderingContext2D) {\n if (!this.stroke || this.strokeWidth === 0) {\n return;\n }\n\n if (this.shadow && !this.shadow.affectStroke) {\n this._removeShadow(ctx);\n }\n\n ctx.save();\n if (this.strokeUniform) {\n const scaling = this.getObjectScaling();\n ctx.scale(1 / scaling.x, 1 / scaling.y);\n }\n this._setLineDash(ctx, this.strokeDashArray);\n this._setStrokeStyles(ctx, this);\n ctx.stroke();\n ctx.restore();\n }\n\n /**\n * This function try to patch the missing gradientTransform on canvas gradients.\n * transforming a context to transform the gradient, is going to transform the stroke too.\n * we want to transform the gradient but not the stroke operation, so we create\n * a transformed gradient on a pattern and then we use the pattern instead of the gradient.\n * this method has drawbacks: is slow, is in low resolution, needs a patch for when the size\n * is limited.\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n * @param {Gradient} filler\n */\n _applyPatternForTransformedGradient(\n ctx: CanvasRenderingContext2D,\n filler: TFiller,\n ) {\n const dims = this._limitCacheSize(this._getCacheCanvasDimensions()),\n retinaScaling = this.getCanvasRetinaScaling(),\n width = dims.x / this.scaleX / retinaScaling,\n height = dims.y / this.scaleY / retinaScaling,\n pCanvas = createCanvasElementFor({\n // in case width and height are less than 1px, we have to round up.\n // since the pattern is no-repeat, this is fine\n width: Math.ceil(width),\n height: Math.ceil(height),\n });\n\n const pCtx = pCanvas.getContext('2d');\n if (!pCtx) {\n return;\n }\n pCtx.beginPath();\n pCtx.moveTo(0, 0);\n pCtx.lineTo(width, 0);\n pCtx.lineTo(width, height);\n pCtx.lineTo(0, height);\n pCtx.closePath();\n pCtx.translate(width / 2, height / 2);\n pCtx.scale(\n dims.zoomX / this.scaleX / retinaScaling,\n dims.zoomY / this.scaleY / retinaScaling,\n );\n this._applyPatternGradientTransform(pCtx, filler);\n pCtx.fillStyle = filler.toLive(ctx)!;\n pCtx.fill();\n ctx.translate(\n -this.width / 2 - this.strokeWidth / 2,\n -this.height / 2 - this.strokeWidth / 2,\n );\n ctx.scale(\n (retinaScaling * this.scaleX) / dims.zoomX,\n (retinaScaling * this.scaleY) / dims.zoomY,\n );\n ctx.strokeStyle = pCtx.createPattern(pCanvas, 'no-repeat') ?? '';\n }\n\n /**\n * This function is an helper for svg import. it returns the center of the object in the svg\n * untransformed coordinates\n * @private\n * @return {Point} center point from element coordinates\n */\n _findCenterFromElement() {\n return new Point(this.left + this.width / 2, this.top + this.height / 2);\n }\n\n /**\n * Clones an instance.\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @returns {Promise}\n */\n clone(propertiesToInclude?: string[]): Promise {\n const objectForm = this.toObject(propertiesToInclude);\n return (this.constructor as typeof FabricObject).fromObject(\n objectForm,\n ) as unknown as Promise;\n }\n\n /**\n * Creates an instance of Image out of an object\n * makes use of toCanvasElement.\n * Once this method was based on toDataUrl and loadImage, so it also had a quality\n * and format option. toCanvasElement is faster and produce no loss of quality.\n * If you need to get a real Jpeg or Png from an object, using toDataURL is the right way to do it.\n * toCanvasElement and then toBlob from the obtained canvas is also a good option.\n * @todo fix the export type, it could not be Image but the type that getClass return for 'image'.\n * @param {ObjectToCanvasElementOptions} [options] for clone as image, passed to toDataURL\n * @param {Number} [options.multiplier=1] Multiplier to scale by\n * @param {Number} [options.left] Cropping left offset. Introduced in v1.2.14\n * @param {Number} [options.top] Cropping top offset. Introduced in v1.2.14\n * @param {Number} [options.width] Cropping width. Introduced in v1.2.14\n * @param {Number} [options.height] Cropping height. Introduced in v1.2.14\n * @param {Boolean} [options.enableRetinaScaling] Enable retina scaling for clone image. Introduce in 1.6.4\n * @param {Boolean} [options.withoutTransform] Remove current object transform ( no scale , no angle, no flip, no skew ). Introduced in 2.3.4\n * @param {Boolean} [options.withoutShadow] Remove current object shadow. Introduced in 2.4.2\n * @return {FabricImage} Object cloned as image.\n */\n cloneAsImage(options: ObjectToCanvasElementOptions): FabricImage {\n const canvasEl = this.toCanvasElement(options);\n // TODO: how to import Image w/o an import cycle?\n const ImageClass = classRegistry.getClass('image');\n return new ImageClass(canvasEl);\n }\n\n /**\n * Converts an object into a HTMLCanvas element\n * @param {ObjectToCanvasElementOptions} options Options object\n * @param {Number} [options.multiplier=1] Multiplier to scale by\n * @param {Number} [options.left] Cropping left offset. Introduced in v1.2.14\n * @param {Number} [options.top] Cropping top offset. Introduced in v1.2.14\n * @param {Number} [options.width] Cropping width. Introduced in v1.2.14\n * @param {Number} [options.height] Cropping height. Introduced in v1.2.14\n * @param {Boolean} [options.enableRetinaScaling] Enable retina scaling for clone image. Introduce in 1.6.4\n * @param {Boolean} [options.withoutTransform] Remove current object transform ( no scale , no angle, no flip, no skew ). Introduced in 2.3.4\n * @param {Boolean} [options.withoutShadow] Remove current object shadow. Introduced in 2.4.2\n * @param {Boolean} [options.viewportTransform] Account for canvas viewport transform\n * @param {(el?: HTMLCanvasElement) => StaticCanvas} [options.canvasProvider] Create the output canvas\n * @return {HTMLCanvasElement} Returns DOM element with the FabricObject\n */\n toCanvasElement(options: ObjectToCanvasElementOptions = {}) {\n const origParams = saveObjectTransform(this),\n originalGroup = this.group,\n originalShadow = this.shadow,\n abs = Math.abs,\n retinaScaling = options.enableRetinaScaling ? getDevicePixelRatio() : 1,\n multiplier = (options.multiplier || 1) * retinaScaling,\n canvasProvider: (el: HTMLCanvasElement) => StaticCanvas =\n options.canvasProvider ||\n ((el: HTMLCanvasElement) =>\n new StaticCanvas(el, {\n enableRetinaScaling: false,\n renderOnAddRemove: false,\n skipOffscreen: false,\n }));\n delete this.group;\n if (options.withoutTransform) {\n resetObjectTransform(this);\n }\n if (options.withoutShadow) {\n this.shadow = null;\n }\n if (options.viewportTransform) {\n sendObjectToPlane(this, this.getViewportTransform());\n }\n\n this.setCoords();\n const el = createCanvasElement(),\n boundingRect = this.getBoundingRect(),\n shadow = this.shadow,\n shadowOffset = new Point();\n\n if (shadow) {\n const shadowBlur = shadow.blur;\n const scaling = shadow.nonScaling\n ? new Point(1, 1)\n : this.getObjectScaling();\n // consider non scaling shadow.\n shadowOffset.x =\n 2 * Math.round(abs(shadow.offsetX) + shadowBlur) * abs(scaling.x);\n shadowOffset.y =\n 2 * Math.round(abs(shadow.offsetY) + shadowBlur) * abs(scaling.y);\n }\n const width = boundingRect.width + shadowOffset.x,\n height = boundingRect.height + shadowOffset.y;\n // if the current width/height is not an integer\n // we need to make it so.\n el.width = Math.ceil(width);\n el.height = Math.ceil(height);\n const canvas = canvasProvider(el);\n if (options.format === 'jpeg') {\n canvas.backgroundColor = '#fff';\n }\n this.setPositionByOrigin(\n new Point(canvas.width / 2, canvas.height / 2),\n CENTER,\n CENTER,\n );\n const originalCanvas = this.canvas;\n // static canvas and canvas have both an array of InteractiveObjects\n // @ts-expect-error this needs to be fixed somehow, or ignored globally\n canvas._objects = [this];\n this.set('canvas', canvas);\n this.setCoords();\n const canvasEl = canvas.toCanvasElement(multiplier || 1, options);\n this.set('canvas', originalCanvas);\n this.shadow = originalShadow;\n if (originalGroup) {\n this.group = originalGroup;\n }\n this.set(origParams);\n this.setCoords();\n // canvas.dispose will call image.dispose that will nullify the elements\n // since this canvas is a simple element for the process, we remove references\n // to objects in this way in order to avoid object trashing.\n canvas._objects = [];\n // since render has settled it is safe to destroy canvas\n canvas.destroy();\n return canvasEl;\n }\n\n /**\n * Converts an object into a data-url-like string\n * @param {Object} options Options object\n * @param {String} [options.format=png] The format of the output image. Either \"jpeg\" or \"png\"\n * @param {Number} [options.quality=1] Quality level (0..1). Only used for jpeg.\n * @param {Number} [options.multiplier=1] Multiplier to scale by\n * @param {Number} [options.left] Cropping left offset. Introduced in v1.2.14\n * @param {Number} [options.top] Cropping top offset. Introduced in v1.2.14\n * @param {Number} [options.width] Cropping width. Introduced in v1.2.14\n * @param {Number} [options.height] Cropping height. Introduced in v1.2.14\n * @param {Boolean} [options.enableRetinaScaling] Enable retina scaling for clone image. Introduce in 1.6.4\n * @param {Boolean} [options.withoutTransform] Remove current object transform ( no scale , no angle, no flip, no skew ). Introduced in 2.3.4\n * @param {Boolean} [options.withoutShadow] Remove current object shadow. Introduced in 2.4.2\n * @return {String} Returns a data: URL containing a representation of the object in the format specified by options.format\n */\n toDataURL(options: toDataURLOptions = {}) {\n return toDataURL(\n this.toCanvasElement(options),\n options.format || 'png',\n options.quality || 1,\n );\n }\n toBlob(options: toDataURLOptions = {}) {\n return toBlob(\n this.toCanvasElement(options),\n options.format || 'png',\n options.quality || 1,\n );\n }\n\n /**\n * Checks if the instance is of any of the specified types.\n * We use this to filter a list of objects for the `getObjects` function.\n *\n * For detecting an instance type `instanceOf` is a better check,\n * but to avoid to make specific classes a dependency of generic code\n * internally we use this.\n *\n * This compares both the static class `type` and the instance's own `type` property\n * against the provided list of types.\n *\n * @param types - A list of type strings to check against.\n * @returns `true` if the object's type or class type matches any in the list, otherwise `false`.\n */\n isType(...types: string[]) {\n return (\n types.includes((this.constructor as typeof FabricObject).type) ||\n types.includes(this.type)\n );\n }\n\n /**\n * Returns complexity of an instance\n * @return {Number} complexity of this instance (is 1 unless subclassed)\n */\n complexity() {\n return 1;\n }\n\n /**\n * Returns a JSON representation of an instance\n * @return {Object} JSON\n */\n toJSON() {\n // delegate, not alias\n return this.toObject();\n }\n\n /**\n * Sets \"angle\" of an instance with centered rotation\n * @param {TDegree} angle Angle value (in degrees)\n */\n rotate(angle: TDegree) {\n const { centeredRotation, originX, originY } = this;\n\n if (centeredRotation) {\n const { x, y } = this.getRelativeCenterPoint();\n this.originX = CENTER;\n this.originY = CENTER;\n this.left = x;\n this.top = y;\n }\n\n this.set('angle', angle);\n\n if (centeredRotation) {\n const { x, y } = this.translateToOriginPoint(\n this.getRelativeCenterPoint(),\n originX,\n originY,\n );\n this.left = x;\n this.top = y;\n this.originX = originX;\n this.originY = originY;\n }\n }\n\n /**\n * This callback function is called by the parent group of an object every\n * time a non-delegated property changes on the group. It is passed the key\n * and value as parameters. Not adding in this function's signature to avoid\n * Travis build error about unused variables.\n */\n setOnGroup() {\n // implemented by sub-classes, as needed.\n }\n\n /**\n * Sets canvas globalCompositeOperation for specific object\n * custom composition operation for the particular object can be specified using globalCompositeOperation property\n * @param {CanvasRenderingContext2D} ctx Rendering canvas context\n */\n _setupCompositeOperation(ctx: CanvasRenderingContext2D) {\n if (this.globalCompositeOperation) {\n ctx.globalCompositeOperation = this.globalCompositeOperation;\n }\n }\n\n /**\n * cancel instance's running animations\n * override if necessary to dispose artifacts such as `clipPath`\n */\n dispose() {\n runningAnimations.cancelByTarget(this);\n this.off();\n this._set('canvas', undefined);\n // clear caches\n this._cacheCanvas && getEnv().dispose(this._cacheCanvas);\n this._cacheCanvas = undefined;\n this._cacheContext = null;\n }\n\n // #region Animation methods\n /**\n * List of properties to consider for animating colors.\n * @type String[]\n */\n static colorProperties: string[] = [FILL, STROKE, 'backgroundColor'];\n\n /**\n * Animates object's properties\n * @param {Record} animatable map of keys and end values\n * @param {Partial>} options\n * @tutorial {@link http://fabricjs.com/fabric-intro-part-2#animation}\n * @return {Record>} map of animation contexts\n *\n * As object — multiple properties\n *\n * object.animate({ left: ..., top: ... });\n * object.animate({ left: ..., top: ... }, { duration: ... });\n */\n animate(\n animatable: Record,\n options?: Partial>,\n ): Record> {\n return Object.entries(animatable).reduce(\n (acc, [key, endValue]) => {\n acc[key] = this._animate(key, endValue, options);\n return acc;\n },\n {} as Record>,\n );\n }\n\n /**\n * @private\n * @param {String} key Property to animate\n * @param {String} to Value to animate to\n * @param {Object} [options] Options object\n */\n _animate(\n key: string,\n endValue: T,\n options: Partial> = {},\n ): TAnimation {\n const path = key.split('.');\n const propIsColor = (\n this.constructor as typeof FabricObject\n ).colorProperties.includes(path[path.length - 1]);\n const { abort, startValue, onChange, onComplete } = options;\n const animationOptions = {\n ...options,\n target: this,\n // path.reduce... is the current value in case start value isn't provided\n startValue:\n startValue ?? path.reduce((deep: any, key) => deep[key], this),\n endValue,\n abort: abort?.bind(this),\n onChange: (\n value: number | number[] | string,\n valueProgress: number,\n durationProgress: number,\n ) => {\n path.reduce((deep: Record, key, index) => {\n if (index === path.length - 1) {\n deep[key] = value;\n }\n return deep[key];\n }, this);\n onChange &&\n // @ts-expect-error generic callback arg0 is wrong\n onChange(value, valueProgress, durationProgress);\n },\n onComplete: (\n value: number | number[] | string,\n valueProgress: number,\n durationProgress: number,\n ) => {\n this.setCoords();\n onComplete &&\n // @ts-expect-error generic callback arg0 is wrong\n onComplete(value, valueProgress, durationProgress);\n },\n } as AnimationOptions;\n\n return (\n propIsColor\n ? animateColor(animationOptions as ColorAnimationOptions)\n : animate(\n animationOptions as ValueAnimationOptions | ArrayAnimationOptions,\n )\n ) as TAnimation;\n }\n\n // #region Object stacking methods\n\n /**\n * A reference to the parent of the object\n * Used to keep the original parent ref when the object has been added to an ActiveSelection, hence loosing the `group` ref\n */\n declare parent?: Group;\n\n /**\n * Checks if object is descendant of target\n * Should be used instead of {@link Group.contains} or {@link StaticCanvas.contains} for performance reasons\n * @param {TAncestor} target\n * @returns {boolean}\n */\n isDescendantOf(target: TAncestor): boolean {\n const { parent, group } = this;\n return (\n parent === target ||\n group === target ||\n // walk up\n (!!parent && parent.isDescendantOf(target)) ||\n (!!group && group !== parent && group.isDescendantOf(target))\n );\n }\n\n /**\n * @returns {Ancestors} ancestors (excluding `ActiveSelection`) from bottom to top\n */\n getAncestors(): Ancestors {\n const ancestors: TAncestor[] = [];\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n let parent: TAncestor | undefined = this;\n do {\n parent = parent.parent;\n parent && ancestors.push(parent);\n } while (parent);\n return ancestors as Ancestors;\n }\n\n /**\n * Compare ancestors\n *\n * @param {StackedObject} other\n * @returns {AncestryComparison} an object that represent the ancestry situation.\n */\n findCommonAncestors(other: T): AncestryComparison {\n if (this === other) {\n return {\n fork: [],\n otherFork: [],\n common: [this, ...this.getAncestors()],\n } as AncestryComparison;\n }\n const ancestors = this.getAncestors();\n const otherAncestors = other.getAncestors();\n // if `this` has no ancestors and `this` is top ancestor of `other` we must handle the following case\n if (\n ancestors.length === 0 &&\n otherAncestors.length > 0 &&\n this === otherAncestors[otherAncestors.length - 1]\n ) {\n return {\n fork: [],\n otherFork: [\n other,\n ...otherAncestors.slice(0, otherAncestors.length - 1),\n ],\n common: [this],\n } as AncestryComparison;\n }\n // compare ancestors\n for (let i = 0, ancestor; i < ancestors.length; i++) {\n ancestor = ancestors[i];\n if (ancestor === other) {\n return {\n fork: [this, ...ancestors.slice(0, i)],\n otherFork: [],\n common: ancestors.slice(i),\n } as AncestryComparison;\n }\n for (let j = 0; j < otherAncestors.length; j++) {\n if (this === otherAncestors[j]) {\n return {\n fork: [],\n otherFork: [other, ...otherAncestors.slice(0, j)],\n common: [this, ...ancestors],\n } as AncestryComparison;\n }\n if (ancestor === otherAncestors[j]) {\n return {\n fork: [this, ...ancestors.slice(0, i)],\n otherFork: [other, ...otherAncestors.slice(0, j)],\n common: ancestors.slice(i),\n } as AncestryComparison;\n }\n }\n }\n // nothing shared\n return {\n fork: [this, ...ancestors],\n otherFork: [other, ...otherAncestors],\n common: [],\n } as AncestryComparison;\n }\n\n /**\n *\n * @param {StackedObject} other\n * @returns {boolean}\n */\n hasCommonAncestors(other: T): boolean {\n const commonAncestors = this.findCommonAncestors(other);\n return commonAncestors && !!commonAncestors.common.length;\n }\n\n /**\n *\n * @param {FabricObject} other object to compare against\n * @returns {boolean | undefined} if objects do not share a common ancestor or they are strictly equal it is impossible to determine which is in front of the other; in such cases the function returns `undefined`\n */\n isInFrontOf(other: T): boolean | undefined {\n if (this === other) {\n return undefined;\n }\n const ancestorData = this.findCommonAncestors(other);\n\n if (ancestorData.fork.includes(other as any)) {\n return true;\n }\n if (ancestorData.otherFork.includes(this as any)) {\n return false;\n }\n // if there isn't a common ancestor, we take the canvas.\n // if there is no canvas, there is nothing to compare\n const firstCommonAncestor = ancestorData.common[0] || this.canvas;\n if (!firstCommonAncestor) {\n return undefined;\n }\n const headOfFork = ancestorData.fork.pop(),\n headOfOtherFork = ancestorData.otherFork.pop(),\n thisIndex = (firstCommonAncestor as TCollection)._objects.indexOf(\n headOfFork as any,\n ),\n otherIndex = (firstCommonAncestor as TCollection)._objects.indexOf(\n headOfOtherFork as any,\n );\n return thisIndex > -1 && thisIndex > otherIndex;\n }\n\n // #region Serialization\n /**\n * Define a list of custom properties that will be serialized when\n * instance.toObject() gets called\n */\n static customProperties: string[] = [];\n\n /**\n * Returns an object representation of an instance\n * @param {string[]} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} Object representation of an instance\n */\n toObject(propertiesToInclude: any[] = []): any {\n const propertiesToSerialize = propertiesToInclude.concat(\n FabricObject.customProperties,\n (this.constructor as typeof FabricObject).customProperties || [],\n );\n let clipPathData: Partial | undefined;\n const NUM_FRACTION_DIGITS = config.NUM_FRACTION_DIGITS;\n const {\n clipPath,\n fill,\n stroke,\n shadow,\n strokeDashArray,\n left,\n top,\n originX,\n originY,\n width,\n height,\n strokeWidth,\n strokeLineCap,\n strokeDashOffset,\n strokeLineJoin,\n strokeUniform,\n strokeMiterLimit,\n scaleX,\n scaleY,\n angle,\n flipX,\n flipY,\n opacity,\n visible,\n backgroundColor,\n fillRule,\n paintFirst,\n globalCompositeOperation,\n skewX,\n skewY,\n } = this;\n if (clipPath && !clipPath.excludeFromExport) {\n clipPathData = clipPath.toObject(\n propertiesToSerialize.concat('inverted', 'absolutePositioned'),\n );\n }\n const toFixedBound = (val: number) => toFixed(val, NUM_FRACTION_DIGITS);\n const object = {\n ...pick(this, propertiesToSerialize as (keyof this)[]),\n type: (this.constructor as typeof FabricObject).type,\n version: VERSION,\n originX,\n originY,\n left: toFixedBound(left),\n top: toFixedBound(top),\n width: toFixedBound(width),\n height: toFixedBound(height),\n fill: isSerializableFiller(fill) ? fill.toObject() : fill,\n stroke: isSerializableFiller(stroke) ? stroke.toObject() : stroke,\n strokeWidth: toFixedBound(strokeWidth),\n strokeDashArray: strokeDashArray\n ? strokeDashArray.concat()\n : strokeDashArray,\n strokeLineCap,\n strokeDashOffset,\n strokeLineJoin,\n strokeUniform,\n strokeMiterLimit: toFixedBound(strokeMiterLimit),\n scaleX: toFixedBound(scaleX),\n scaleY: toFixedBound(scaleY),\n angle: toFixedBound(angle),\n flipX,\n flipY,\n opacity: toFixedBound(opacity),\n shadow: shadow ? shadow.toObject() : shadow,\n visible,\n backgroundColor,\n fillRule,\n paintFirst,\n globalCompositeOperation,\n skewX: toFixedBound(skewX),\n skewY: toFixedBound(skewY),\n ...(clipPathData ? { clipPath: clipPathData } : null),\n };\n\n return !this.includeDefaultValues\n ? this._removeDefaultValues(object)\n : object;\n }\n\n /**\n * Returns (dataless) object representation of an instance\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} Object representation of an instance\n */\n toDatalessObject(propertiesToInclude?: any[]): any {\n // will be overwritten by subclasses\n return this.toObject(propertiesToInclude);\n }\n\n /**\n * @private\n * @param {Object} object\n */\n _removeDefaultValues(object: T): Partial {\n // getDefaults() ( get from static ownDefaults ) should win over prototype since anyway they get assigned to instance\n // ownDefault vs prototype is swappable only if you change all the fabric objects consistently.\n const defaults = (this.constructor as typeof FabricObject).getDefaults();\n const hasStaticDefaultValues = Object.keys(defaults).length > 0;\n const baseValues = hasStaticDefaultValues\n ? defaults\n : Object.getPrototypeOf(this);\n\n return pickBy(object, (value, key) => {\n if (key === LEFT || key === TOP || key === 'type') {\n return true;\n }\n const baseValue = baseValues[key];\n return (\n value !== baseValue &&\n // basically a check for [] === []\n !(\n Array.isArray(value) &&\n Array.isArray(baseValue) &&\n value.length === 0 &&\n baseValue.length === 0\n )\n );\n });\n }\n\n /**\n * Returns a string representation of an instance\n * @return {String}\n */\n toString() {\n return `#<${(this.constructor as typeof FabricObject).type}>`;\n }\n\n /**\n *\n * @param {Function} klass\n * @param {object} object\n * @param {object} [options]\n * @param {string} [options.extraParam] property to pass as first argument to the constructor\n * @param {AbortSignal} [options.signal] handle aborting, see https://developer.mozilla.org/en-US/docs/Web/API/AbortController/signal\n * @returns {Promise}\n */\n static _fromObject(\n { type, ...serializedObjectOptions }: Record,\n { extraParam, ...options }: Abortable & { extraParam?: string } = {},\n ): Promise {\n return enlivenObjectEnlivables(serializedObjectOptions, options).then(\n (enlivedObjectOptions) => {\n // from the resulting enlived options, extract options.extraParam to arg0\n // to avoid accidental overrides later\n if (extraParam) {\n delete enlivedObjectOptions[extraParam];\n return new this(\n serializedObjectOptions[extraParam],\n // @ts-expect-error different signature\n enlivedObjectOptions,\n );\n } else {\n return new this(enlivedObjectOptions);\n }\n },\n ) as Promise;\n }\n\n /**\n *\n * @param {object} object\n * @param {object} [options]\n * @param {AbortSignal} [options.signal] handle aborting, see https://developer.mozilla.org/en-US/docs/Web/API/AbortController/signal\n * @returns {Promise}\n */\n static fromObject>(\n object: T,\n options?: Abortable,\n ) {\n return this._fromObject(object, options);\n }\n}\n\nclassRegistry.setClass(FabricObject);\nclassRegistry.setClass(FabricObject, 'object');\n","import type {\n TModificationEvents,\n Transform,\n TransformActionHandler,\n} from '../EventTypeDefs';\nimport { fireEvent } from './fireEvent';\nimport { commonEventInfo } from './util';\n\n/**\n * Wrap an action handler with firing an event if the action is performed\n * @param {TModificationEvents} eventName the event we want to fire\n * @param {TransformActionHandler} actionHandler the function to wrap\n * @param {object} extraEventInfo extra information to pas to the event handler\n * @return {TransformActionHandler} a function with an action handler signature\n */\nexport const wrapWithFireEvent = <\n T extends Transform,\n P extends object = Record,\n>(\n eventName: TModificationEvents,\n actionHandler: TransformActionHandler,\n extraEventInfo?: P,\n) => {\n return ((eventData, transform, x, y) => {\n const actionPerformed = actionHandler(eventData, transform, x, y);\n if (actionPerformed) {\n fireEvent(eventName, {\n ...commonEventInfo(eventData, transform, x, y),\n ...extraEventInfo,\n });\n }\n return actionPerformed;\n }) as TransformActionHandler;\n};\n","import type { Transform, TransformActionHandler } from '../EventTypeDefs';\n\n/**\n * Wrap an action handler with saving/restoring object position on the transform.\n * this is the code that permits to objects to keep their position while transforming.\n * @param {Function} actionHandler the function to wrap\n * @return {Function} a function with an action handler signature\n */\nexport function wrapWithFixedAnchor(\n actionHandler: TransformActionHandler,\n) {\n return ((eventData, transform, x, y) => {\n const { target, originX, originY } = transform,\n centerPoint = target.getRelativeCenterPoint(),\n constraint = target.translateToOriginPoint(centerPoint, originX, originY),\n actionPerformed = actionHandler(eventData, transform, x, y);\n // flipping requires to change the transform origin, so we read from the mutated transform\n // instead of leveraging the one destructured before\n target.setPositionByOrigin(\n constraint,\n transform.originX,\n transform.originY,\n );\n return actionPerformed;\n }) as TransformActionHandler;\n}\n","import type { TransformActionHandler } from '../EventTypeDefs';\nimport { CENTER, LEFT, RESIZING, RIGHT } from '../constants';\nimport { resolveOrigin } from '../util/misc/resolveOrigin';\nimport { getLocalPoint, isTransformCentered } from './util';\nimport { wrapWithFireEvent } from './wrapWithFireEvent';\nimport { wrapWithFixedAnchor } from './wrapWithFixedAnchor';\n\n/**\n * Action handler to change object's width\n * Needs to be wrapped with `wrapWithFixedAnchor` to be effective\n * @param {Event} eventData javascript event that is doing the transform\n * @param {Object} transform javascript object containing a series of information around the current transform\n * @param {number} x current mouse x position, canvas normalized\n * @param {number} y current mouse y position, canvas normalized\n * @return {Boolean} true if some change happened\n */\nexport const changeObjectWidth: TransformActionHandler = (\n eventData,\n transform,\n x,\n y,\n) => {\n const localPoint = getLocalPoint(\n transform,\n transform.originX,\n transform.originY,\n x,\n y,\n );\n // make sure the control changes width ONLY from it's side of target\n if (\n resolveOrigin(transform.originX) === resolveOrigin(CENTER) ||\n (resolveOrigin(transform.originX) === resolveOrigin(RIGHT) &&\n localPoint.x < 0) ||\n (resolveOrigin(transform.originX) === resolveOrigin(LEFT) &&\n localPoint.x > 0)\n ) {\n const { target } = transform,\n strokePadding =\n target.strokeWidth / (target.strokeUniform ? target.scaleX : 1),\n multiplier = isTransformCentered(transform) ? 2 : 1,\n oldWidth = target.width,\n newWidth =\n Math.abs((localPoint.x * multiplier) / target.scaleX) - strokePadding;\n target.set('width', Math.max(newWidth, 1));\n // check against actual target width in case `newWidth` was rejected\n return oldWidth !== target.width;\n }\n return false;\n};\n\nexport const changeWidth = wrapWithFireEvent(\n RESIZING,\n wrapWithFixedAnchor(changeObjectWidth),\n);\n","import { FILL, STROKE, twoMathPi } from '../constants';\nimport type { InteractiveFabricObject } from '../shapes/Object/InteractiveObject';\nimport { degreesToRadians } from '../util/misc/radiansDegreesConversion';\nimport type { Control } from './Control';\n\nexport type ControlRenderingStyleOverride = Partial<\n Pick<\n InteractiveFabricObject,\n | 'cornerStyle'\n | 'cornerSize'\n | 'cornerColor'\n | 'cornerStrokeColor'\n | 'cornerDashArray'\n | 'transparentCorners'\n >\n>;\n\nexport type ControlRenderer<\n O extends InteractiveFabricObject = InteractiveFabricObject,\n> = (\n ctx: CanvasRenderingContext2D,\n left: number,\n top: number,\n styleOverride: ControlRenderingStyleOverride,\n fabricObject: O,\n) => void;\n\n/**\n * Render a round control, as per fabric features.\n * This function is written to respect object properties like transparentCorners, cornerSize\n * cornerColor, cornerStrokeColor\n * plus the addition of offsetY and offsetX.\n * @param {CanvasRenderingContext2D} ctx context to render on\n * @param {Number} left x coordinate where the control center should be\n * @param {Number} top y coordinate where the control center should be\n * @param {Object} styleOverride override for FabricObject controls style\n * @param {FabricObject} fabricObject the fabric object for which we are rendering controls\n */\nexport function renderCircleControl(\n this: Control,\n ctx: CanvasRenderingContext2D,\n left: number,\n top: number,\n styleOverride: ControlRenderingStyleOverride,\n fabricObject: InteractiveFabricObject,\n) {\n styleOverride = styleOverride || {};\n const xSize =\n this.sizeX || styleOverride.cornerSize || fabricObject.cornerSize,\n ySize = this.sizeY || styleOverride.cornerSize || fabricObject.cornerSize,\n transparentCorners =\n typeof styleOverride.transparentCorners !== 'undefined'\n ? styleOverride.transparentCorners\n : fabricObject.transparentCorners,\n methodName = transparentCorners ? STROKE : FILL,\n stroke =\n !transparentCorners &&\n (styleOverride.cornerStrokeColor || fabricObject.cornerStrokeColor);\n let myLeft = left,\n myTop = top,\n size;\n ctx.save();\n ctx.fillStyle = styleOverride.cornerColor || fabricObject.cornerColor || '';\n ctx.strokeStyle =\n styleOverride.cornerStrokeColor || fabricObject.cornerStrokeColor || '';\n // TODO: use proper ellipse code.\n if (xSize > ySize) {\n size = xSize;\n ctx.scale(1.0, ySize / xSize);\n myTop = (top * xSize) / ySize;\n } else if (ySize > xSize) {\n size = ySize;\n ctx.scale(xSize / ySize, 1.0);\n myLeft = (left * ySize) / xSize;\n } else {\n size = xSize;\n }\n ctx.beginPath();\n ctx.arc(myLeft, myTop, size / 2, 0, twoMathPi, false);\n ctx[methodName]();\n if (stroke) {\n ctx.stroke();\n }\n ctx.restore();\n}\n\n/**\n * Render a square control, as per fabric features.\n * This function is written to respect object properties like transparentCorners, cornerSize\n * cornerColor, cornerStrokeColor\n * plus the addition of offsetY and offsetX.\n * @param {CanvasRenderingContext2D} ctx context to render on\n * @param {Number} left x coordinate where the control center should be\n * @param {Number} top y coordinate where the control center should be\n * @param {Object} styleOverride override for FabricObject controls style\n * @param {FabricObject} fabricObject the fabric object for which we are rendering controls\n */\nexport function renderSquareControl(\n this: Control,\n ctx: CanvasRenderingContext2D,\n left: number,\n top: number,\n styleOverride: ControlRenderingStyleOverride,\n fabricObject: InteractiveFabricObject,\n) {\n styleOverride = styleOverride || {};\n const xSize =\n this.sizeX || styleOverride.cornerSize || fabricObject.cornerSize,\n ySize = this.sizeY || styleOverride.cornerSize || fabricObject.cornerSize,\n transparentCorners =\n typeof styleOverride.transparentCorners !== 'undefined'\n ? styleOverride.transparentCorners\n : fabricObject.transparentCorners,\n methodName = transparentCorners ? STROKE : FILL,\n stroke =\n !transparentCorners &&\n (styleOverride.cornerStrokeColor || fabricObject.cornerStrokeColor),\n xSizeBy2 = xSize / 2,\n ySizeBy2 = ySize / 2;\n ctx.save();\n ctx.fillStyle = styleOverride.cornerColor || fabricObject.cornerColor || '';\n ctx.strokeStyle =\n styleOverride.cornerStrokeColor || fabricObject.cornerStrokeColor || '';\n ctx.translate(left, top);\n // angle is relative to canvas plane\n const angle = fabricObject.getTotalAngle();\n ctx.rotate(degreesToRadians(angle));\n // this does not work, and fixed with ( && ) does not make sense.\n // to have real transparent corners we need the controls on upperCanvas\n // transparentCorners || ctx.clearRect(-xSizeBy2, -ySizeBy2, xSize, ySize);\n ctx[`${methodName}Rect`](-xSizeBy2, -ySizeBy2, xSize, ySize);\n if (stroke) {\n ctx.strokeRect(-xSizeBy2, -ySizeBy2, xSize, ySize);\n }\n ctx.restore();\n}\n","/* eslint-disable @typescript-eslint/no-unused-vars */\nimport type {\n ControlActionHandler,\n TPointerEvent,\n TransformActionHandler,\n} from '../EventTypeDefs';\nimport { Intersection } from '../Intersection';\nimport { Point } from '../Point';\nimport { SCALE } from '../constants';\nimport type {\n InteractiveFabricObject,\n TOCoord,\n} from '../shapes/Object/InteractiveObject';\nimport type { TCornerPoint, TDegree, TMat2D } from '../typedefs';\nimport {\n createRotateMatrix,\n createScaleMatrix,\n createTranslateMatrix,\n multiplyTransformMatrixArray,\n} from '../util/misc/matrix';\nimport type { ControlRenderingStyleOverride } from './controlRendering';\nimport { renderCircleControl, renderSquareControl } from './controlRendering';\n\nexport class Control {\n /**\n * keep track of control visibility.\n * mainly for backward compatibility.\n * if you do not want to see a control, you can remove it\n * from the control set.\n * @type {Boolean}\n * @default true\n */\n visible = true;\n\n /**\n * Name of the action that the control will likely execute.\n * This is optional. FabricJS uses to identify what the user is doing for some\n * extra optimizations. If you are writing a custom control and you want to know\n * somewhere else in the code what is going on, you can use this string here.\n * you can also provide a custom getActionName if your control run multiple actions\n * depending on some external state.\n * default to scale since is the most common, used on 4 corners by default\n * @type {String}\n * @default 'scale'\n */\n actionName = SCALE;\n\n /**\n * Drawing angle of the control.\n * NOT used for now, but name marked as needed for internal logic\n * example: to reuse the same drawing function for different rotated controls\n * @type {Number}\n * @default 0\n */\n angle = 0;\n\n /**\n * Relative position of the control. X\n * 0,0 is the center of the Object, while -0.5 (left) or 0.5 (right) are the extremities\n * of the bounding box.\n * @type {Number}\n * @default 0\n */\n x = 0;\n\n /**\n * Relative position of the control. Y\n * 0,0 is the center of the Object, while -0.5 (top) or 0.5 (bottom) are the extremities\n * of the bounding box.\n * @type {Number}\n * @default 0\n */\n y = 0;\n\n /**\n * Horizontal offset of the control from the defined position. In pixels\n * Positive offset moves the control to the right, negative to the left.\n * It used when you want to have position of control that does not scale with\n * the bounding box. Example: rotation control is placed at x:0, y: 0.5 on\n * the boundind box, with an offset of 30 pixels vertically. Those 30 pixels will\n * stay 30 pixels no matter how the object is big. Another example is having 2\n * controls in the corner, that stay in the same position when the object scale.\n * of the bounding box.\n * @type {Number}\n * @default 0\n */\n offsetX = 0;\n\n /**\n * Vertical offset of the control from the defined position. In pixels\n * Positive offset moves the control to the bottom, negative to the top.\n * @type {Number}\n * @default 0\n */\n offsetY = 0;\n\n /**\n * Sets the length of the control. If null, defaults to object's cornerSize.\n * Expects both sizeX and sizeY to be set when set.\n * @type {?Number}\n * @default null\n */\n sizeX = 0;\n\n /**\n * Sets the height of the control. If null, defaults to object's cornerSize.\n * Expects both sizeX and sizeY to be set when set.\n * @type {?Number}\n * @default null\n */\n sizeY = 0;\n\n /**\n * Sets the length of the touch area of the control. If null, defaults to object's touchCornerSize.\n * Expects both touchSizeX and touchSizeY to be set when set.\n * @type {?Number}\n * @default null\n */\n touchSizeX = 0;\n\n /**\n * Sets the height of the touch area of the control. If null, defaults to object's touchCornerSize.\n * Expects both touchSizeX and touchSizeY to be set when set.\n * @type {?Number}\n * @default null\n */\n touchSizeY = 0;\n\n /**\n * Css cursor style to display when the control is hovered.\n * if the method `cursorStyleHandler` is provided, this property is ignored.\n * @type {String}\n * @default 'crosshair'\n */\n cursorStyle = 'crosshair';\n\n /**\n * If controls has an offsetY or offsetX, draw a line that connects\n * the control to the bounding box\n * @type {Boolean}\n * @default false\n */\n withConnection = false;\n\n constructor(options?: Partial) {\n Object.assign(this, options);\n }\n\n /**\n * The control actionHandler, provide one to handle action ( control being moved )\n * @param {Event} eventData the native mouse event\n * @param {Transform} transformData properties of the current transform\n * @param {Number} x x position of the cursor\n * @param {Number} y y position of the cursor\n * @return {Boolean} true if the action/event modified the object\n */\n declare actionHandler: TransformActionHandler;\n\n /**\n * The control handler for mouse down, provide one to handle mouse down on control\n * @param {Event} eventData the native mouse event\n * @param {Transform} transformData properties of the current transform\n * @param {Number} x x position of the cursor\n * @param {Number} y y position of the cursor\n * @return {Boolean} true if the action/event modified the object\n */\n declare mouseDownHandler?: ControlActionHandler;\n\n /**\n * The control mouseUpHandler, provide one to handle an effect on mouse up.\n * @param {Event} eventData the native mouse event\n * @param {Transform} transformData properties of the current transform\n * @param {Number} x x position of the cursor\n * @param {Number} y y position of the cursor\n * @return {Boolean} true if the action/event modified the object\n */\n declare mouseUpHandler?: ControlActionHandler;\n\n shouldActivate(\n controlKey: string,\n fabricObject: InteractiveFabricObject,\n pointer: Point,\n { tl, tr, br, bl }: TCornerPoint,\n ) {\n // TODO: locking logic can be handled here instead of in the control handler logic\n return (\n fabricObject.canvas?.getActiveObject() === fabricObject &&\n fabricObject.isControlVisible(controlKey) &&\n Intersection.isPointInPolygon(pointer, [tl, tr, br, bl])\n );\n }\n\n /**\n * Returns control actionHandler\n * @param {Event} eventData the native mouse event\n * @param {FabricObject} fabricObject on which the control is displayed\n * @param {Control} control control for which the action handler is being asked\n * @return {Function} the action handler\n */\n getActionHandler(\n eventData: TPointerEvent,\n fabricObject: InteractiveFabricObject,\n control: Control,\n ): TransformActionHandler | undefined {\n return this.actionHandler;\n }\n\n /**\n * Returns control mouseDown handler\n * @param {Event} eventData the native mouse event\n * @param {FabricObject} fabricObject on which the control is displayed\n * @param {Control} control control for which the action handler is being asked\n * @return {Function} the action handler\n */\n getMouseDownHandler(\n eventData: TPointerEvent,\n fabricObject: InteractiveFabricObject,\n control: Control,\n ): ControlActionHandler | undefined {\n return this.mouseDownHandler;\n }\n\n /**\n * Returns control mouseUp handler.\n * During actions the fabricObject or the control can be of different obj\n * @param {Event} eventData the native mouse event\n * @param {FabricObject} fabricObject on which the control is displayed\n * @param {Control} control control for which the action handler is being asked\n * @return {Function} the action handler\n */\n getMouseUpHandler(\n eventData: TPointerEvent,\n fabricObject: InteractiveFabricObject,\n control: Control,\n ): ControlActionHandler | undefined {\n return this.mouseUpHandler;\n }\n\n /**\n * Returns control cursorStyle for css using cursorStyle. If you need a more elaborate\n * function you can pass one in the constructor\n * the cursorStyle property\n * @param {Event} eventData the native mouse event\n * @param {Control} control the current control ( likely this)\n * @param {FabricObject} object on which the control is displayed\n * @return {String}\n */\n cursorStyleHandler(\n eventData: TPointerEvent,\n control: Control,\n fabricObject: InteractiveFabricObject,\n coord: TOCoord,\n ) {\n return control.cursorStyle;\n }\n\n /**\n * Returns the action name. The basic implementation just return the actionName property.\n * @param {Event} eventData the native mouse event\n * @param {Control} control the current control ( likely this)\n * @param {FabricObject} object on which the control is displayed\n * @return {String}\n */\n getActionName(\n eventData: TPointerEvent,\n control: Control,\n fabricObject: InteractiveFabricObject,\n ) {\n return control.actionName;\n }\n\n /**\n * Returns controls visibility\n * @param {FabricObject} object on which the control is displayed\n * @param {String} controlKey key where the control is memorized on the\n * @return {Boolean}\n */\n getVisibility(fabricObject: InteractiveFabricObject, controlKey: string) {\n return fabricObject._controlsVisibility?.[controlKey] ?? this.visible;\n }\n\n /**\n * Sets controls visibility\n * @param {Boolean} visibility for the object\n * @return {Void}\n */\n setVisibility(\n visibility: boolean,\n name?: string,\n fabricObject?: InteractiveFabricObject,\n ) {\n this.visible = visibility;\n }\n\n positionHandler(\n dim: Point,\n finalMatrix: TMat2D,\n fabricObject: InteractiveFabricObject,\n currentControl: Control,\n ) {\n return new Point(\n this.x * dim.x + this.offsetX,\n this.y * dim.y + this.offsetY,\n ).transform(finalMatrix);\n }\n\n /**\n * Returns the coords for this control based on object values.\n * @param {Number} objectAngle angle from the fabric object holding the control\n * @param {Number} objectCornerSize cornerSize from the fabric object holding the control (or touchCornerSize if\n * isTouch is true)\n * @param {Number} centerX x coordinate where the control center should be\n * @param {Number} centerY y coordinate where the control center should be\n * @param {boolean} isTouch true if touch corner, false if normal corner\n */\n calcCornerCoords(\n angle: TDegree,\n objectCornerSize: number,\n centerX: number,\n centerY: number,\n isTouch: boolean,\n fabricObject: InteractiveFabricObject,\n ) {\n const t = multiplyTransformMatrixArray([\n createTranslateMatrix(centerX, centerY),\n createRotateMatrix({ angle }),\n createScaleMatrix(\n (isTouch ? this.touchSizeX : this.sizeX) || objectCornerSize,\n (isTouch ? this.touchSizeY : this.sizeY) || objectCornerSize,\n ),\n ]);\n return {\n tl: new Point(-0.5, -0.5).transform(t),\n tr: new Point(0.5, -0.5).transform(t),\n br: new Point(0.5, 0.5).transform(t),\n bl: new Point(-0.5, 0.5).transform(t),\n };\n }\n\n /**\n * Render function for the control.\n * When this function runs the context is unscaled. unrotate. Just retina scaled.\n * all the functions will have to translate to the point left,top before starting Drawing\n * if they want to draw a control where the position is detected.\n * left and top are the result of the positionHandler function\n * @param {RenderingContext2D} ctx the context where the control will be drawn\n * @param {Number} left position of the canvas where we are about to render the control.\n * @param {Number} top position of the canvas where we are about to render the control.\n * @param {Object} styleOverride\n * @param {FabricObject} fabricObject the object where the control is about to be rendered\n */\n render(\n ctx: CanvasRenderingContext2D,\n left: number,\n top: number,\n styleOverride: ControlRenderingStyleOverride | undefined,\n fabricObject: InteractiveFabricObject,\n ) {\n styleOverride = styleOverride || {};\n switch (styleOverride.cornerStyle || fabricObject.cornerStyle) {\n case 'circle':\n renderCircleControl.call(\n this,\n ctx,\n left,\n top,\n styleOverride,\n fabricObject,\n );\n break;\n default:\n renderSquareControl.call(\n this,\n ctx,\n left,\n top,\n styleOverride,\n fabricObject,\n );\n }\n }\n}\n","import type {\n ControlCursorCallback,\n TransformActionHandler,\n} from '../EventTypeDefs';\nimport { ROTATING } from '../constants';\nimport { radiansToDegrees } from '../util/misc/radiansDegreesConversion';\nimport { isLocked, NOT_ALLOWED_CURSOR } from './util';\nimport { wrapWithFireEvent } from './wrapWithFireEvent';\nimport { wrapWithFixedAnchor } from './wrapWithFixedAnchor';\n\n/**\n * Find the correct style for the control that is used for rotation.\n * this function is very simple and it just take care of not-allowed or standard cursor\n * @param {Event} eventData the javascript event that is causing the scale\n * @param {Control} control the control that is interested in the action\n * @param {FabricObject} fabricObject the fabric object that is interested in the action\n * @return {String} a valid css string for the cursor\n */\nexport const rotationStyleHandler: ControlCursorCallback = (\n eventData,\n control,\n fabricObject,\n) => {\n if (fabricObject.lockRotation) {\n return NOT_ALLOWED_CURSOR;\n }\n return control.cursorStyle;\n};\n\n/**\n * Action handler for rotation and snapping, without anchor point.\n * Needs to be wrapped with `wrapWithFixedAnchor` to be effective\n * @param {Event} eventData javascript event that is doing the transform\n * @param {Object} transform javascript object containing a series of information around the current transform\n * @param {number} x current mouse x position, canvas normalized\n * @param {number} y current mouse y position, canvas normalized\n * @return {Boolean} true if some change happened\n * @private\n */\nconst rotateObjectWithSnapping: TransformActionHandler = (\n eventData,\n { target, ex, ey, theta, originX, originY },\n x,\n y,\n) => {\n const pivotPoint = target.translateToOriginPoint(\n target.getRelativeCenterPoint(),\n originX,\n originY,\n );\n\n if (isLocked(target, 'lockRotation')) {\n return false;\n }\n\n const lastAngle = Math.atan2(ey - pivotPoint.y, ex - pivotPoint.x),\n curAngle = Math.atan2(y - pivotPoint.y, x - pivotPoint.x);\n let angle = radiansToDegrees(curAngle - lastAngle + theta);\n\n if (target.snapAngle && target.snapAngle > 0) {\n const snapAngle = target.snapAngle,\n snapThreshold = target.snapThreshold || snapAngle,\n rightAngleLocked = Math.ceil(angle / snapAngle) * snapAngle,\n leftAngleLocked = Math.floor(angle / snapAngle) * snapAngle;\n\n if (Math.abs(angle - leftAngleLocked) < snapThreshold) {\n angle = leftAngleLocked;\n } else if (Math.abs(angle - rightAngleLocked) < snapThreshold) {\n angle = rightAngleLocked;\n }\n }\n\n // normalize angle to positive value\n if (angle < 0) {\n angle = 360 + angle;\n }\n angle %= 360;\n\n const hasRotated = target.angle !== angle;\n // TODO: why aren't we using set?\n target.angle = angle;\n return hasRotated;\n};\n\nexport const rotationWithSnapping = wrapWithFireEvent(\n ROTATING,\n wrapWithFixedAnchor(rotateObjectWithSnapping),\n);\n","import type {\n ControlCursorCallback,\n TPointerEvent,\n Transform,\n TransformActionHandler,\n} from '../EventTypeDefs';\nimport type { FabricObject } from '../shapes/Object/FabricObject';\nimport type { TAxis } from '../typedefs';\nimport type { Canvas } from '../canvas/Canvas';\nimport {\n findCornerQuadrant,\n getLocalPoint,\n invertOrigin,\n isLocked,\n isTransformCentered,\n NOT_ALLOWED_CURSOR,\n} from './util';\nimport { wrapWithFireEvent } from './wrapWithFireEvent';\nimport { wrapWithFixedAnchor } from './wrapWithFixedAnchor';\nimport { SCALE_X, SCALE_Y, SCALING } from '../constants';\n\ntype ScaleTransform = Transform & {\n gestureScale?: number;\n signX?: number;\n signY?: number;\n};\n\ntype ScaleBy = TAxis | 'equally' | '' | undefined;\n\n/**\n * Inspect event and fabricObject properties to understand if the scaling action\n * @param {Event} eventData from the user action\n * @param {FabricObject} fabricObject the fabric object about to scale\n * @return {Boolean} true if scale is proportional\n */\nexport function scaleIsProportional(\n eventData: TPointerEvent,\n fabricObject: FabricObject,\n): boolean {\n const canvas = fabricObject.canvas as Canvas,\n uniformIsToggled = eventData[canvas.uniScaleKey!];\n return (\n (canvas.uniformScaling && !uniformIsToggled) ||\n (!canvas.uniformScaling && uniformIsToggled)\n );\n}\n\n/**\n * Inspect fabricObject to understand if the current scaling action is allowed\n * @param {FabricObject} fabricObject the fabric object about to scale\n * @param {String} by 'x' or 'y' or ''\n * @param {Boolean} scaleProportionally true if we are trying to scale proportionally\n * @return {Boolean} true if scaling is not allowed at current conditions\n */\nexport function scalingIsForbidden(\n fabricObject: FabricObject,\n by: ScaleBy,\n scaleProportionally: boolean,\n) {\n const lockX = isLocked(fabricObject, 'lockScalingX'),\n lockY = isLocked(fabricObject, 'lockScalingY');\n if (lockX && lockY) {\n return true;\n }\n if (!by && (lockX || lockY) && scaleProportionally) {\n return true;\n }\n if (lockX && by === 'x') {\n return true;\n }\n if (lockY && by === 'y') {\n return true;\n }\n // code crashes because of a division by 0 if a 0 sized object is scaled\n // forbid to prevent scaling to happen. ISSUE-9475\n const { width, height, strokeWidth } = fabricObject;\n if (width === 0 && strokeWidth === 0 && by !== 'y') {\n return true;\n }\n if (height === 0 && strokeWidth === 0 && by !== 'x') {\n return true;\n }\n return false;\n}\n\nconst scaleMap = ['e', 'se', 's', 'sw', 'w', 'nw', 'n', 'ne', 'e'];\n\n/**\n * return the correct cursor style for the scale action\n * @param {Event} eventData the javascript event that is causing the scale\n * @param {Control} control the control that is interested in the action\n * @param {FabricObject} fabricObject the fabric object that is interested in the action\n * @return {String} a valid css string for the cursor\n */\nexport const scaleCursorStyleHandler: ControlCursorCallback = (\n eventData,\n control,\n fabricObject,\n coord,\n) => {\n const scaleProportionally = scaleIsProportional(eventData, fabricObject),\n by =\n control.x !== 0 && control.y === 0\n ? 'x'\n : control.x === 0 && control.y !== 0\n ? 'y'\n : '';\n if (scalingIsForbidden(fabricObject, by, scaleProportionally)) {\n return NOT_ALLOWED_CURSOR;\n }\n const n = findCornerQuadrant(fabricObject, control, coord);\n return `${scaleMap[n]}-resize`;\n};\n\n/**\n * Basic scaling logic, reused with different constrain for scaling X,Y, freely or equally.\n * Needs to be wrapped with `wrapWithFixedAnchor` to be effective\n * @param {Event} eventData javascript event that is doing the transform\n * @param {Object} transform javascript object containing a series of information around the current transform\n * @param {number} x current mouse x position, canvas normalized\n * @param {number} y current mouse y position, canvas normalized\n * @param {Object} options additional information for scaling\n * @param {String} options.by 'x', 'y', 'equally' or '' to indicate type of scaling\n * @return {Boolean} true if some change happened\n * @private\n */\nfunction scaleObject(\n eventData: TPointerEvent,\n transform: ScaleTransform,\n x: number,\n y: number,\n options: { by?: ScaleBy } = {},\n) {\n const target = transform.target,\n by = options.by,\n scaleProportionally = scaleIsProportional(eventData, target),\n forbidScaling = scalingIsForbidden(target, by, scaleProportionally);\n let newPoint, scaleX, scaleY, dim, signX, signY;\n\n if (forbidScaling) {\n return false;\n }\n if (transform.gestureScale) {\n scaleX = transform.scaleX * transform.gestureScale;\n scaleY = transform.scaleY * transform.gestureScale;\n } else {\n newPoint = getLocalPoint(\n transform,\n transform.originX,\n transform.originY,\n x,\n y,\n );\n // use of sign: We use sign to detect change of direction of an action. sign usually change when\n // we cross the origin point with the mouse. So a scale flip for example. There is an issue when scaling\n // by center and scaling using one middle control ( default: mr, mt, ml, mb), the mouse movement can easily\n // cross many time the origin point and flip the object. so we need a way to filter out the noise.\n // This ternary here should be ok to filter out X scaling when we want Y only and vice versa.\n signX = by !== 'y' ? Math.sign(newPoint.x || transform.signX || 1) : 1;\n signY = by !== 'x' ? Math.sign(newPoint.y || transform.signY || 1) : 1;\n if (!transform.signX) {\n transform.signX = signX;\n }\n if (!transform.signY) {\n transform.signY = signY;\n }\n\n if (\n isLocked(target, 'lockScalingFlip') &&\n (transform.signX !== signX || transform.signY !== signY)\n ) {\n return false;\n }\n\n dim = target._getTransformedDimensions();\n // missing detection of flip and logic to switch the origin\n if (scaleProportionally && !by) {\n // uniform scaling\n const distance = Math.abs(newPoint.x) + Math.abs(newPoint.y),\n { original } = transform,\n originalDistance =\n Math.abs((dim.x * original.scaleX) / target.scaleX) +\n Math.abs((dim.y * original.scaleY) / target.scaleY),\n scale = distance / originalDistance;\n scaleX = original.scaleX * scale;\n scaleY = original.scaleY * scale;\n } else {\n scaleX = Math.abs((newPoint.x * target.scaleX) / dim.x);\n scaleY = Math.abs((newPoint.y * target.scaleY) / dim.y);\n }\n // if we are scaling by center, we need to double the scale\n if (isTransformCentered(transform)) {\n scaleX *= 2;\n scaleY *= 2;\n }\n if (transform.signX !== signX && by !== 'y') {\n transform.originX = invertOrigin(transform.originX);\n scaleX *= -1;\n transform.signX = signX;\n }\n if (transform.signY !== signY && by !== 'x') {\n transform.originY = invertOrigin(transform.originY);\n scaleY *= -1;\n transform.signY = signY;\n }\n }\n // minScale is taken care of in the setter.\n const oldScaleX = target.scaleX,\n oldScaleY = target.scaleY;\n if (!by) {\n !isLocked(target, 'lockScalingX') && target.set(SCALE_X, scaleX);\n !isLocked(target, 'lockScalingY') && target.set(SCALE_Y, scaleY);\n } else {\n // forbidden cases already handled on top here.\n by === 'x' && target.set(SCALE_X, scaleX);\n by === 'y' && target.set(SCALE_Y, scaleY);\n }\n return oldScaleX !== target.scaleX || oldScaleY !== target.scaleY;\n}\n\n/**\n * Generic scaling logic, to scale from corners either equally or freely.\n * Needs to be wrapped with `wrapWithFixedAnchor` to be effective\n * @param {Event} eventData javascript event that is doing the transform\n * @param {Object} transform javascript object containing a series of information around the current transform\n * @param {number} x current mouse x position, canvas normalized\n * @param {number} y current mouse y position, canvas normalized\n * @return {Boolean} true if some change happened\n */\nexport const scaleObjectFromCorner: TransformActionHandler = (\n eventData,\n transform,\n x,\n y,\n) => {\n return scaleObject(eventData, transform, x, y);\n};\n\n/**\n * Scaling logic for the X axis.\n * Needs to be wrapped with `wrapWithFixedAnchor` to be effective\n * @param {Event} eventData javascript event that is doing the transform\n * @param {Object} transform javascript object containing a series of information around the current transform\n * @param {number} x current mouse x position, canvas normalized\n * @param {number} y current mouse y position, canvas normalized\n * @return {Boolean} true if some change happened\n */\nconst scaleObjectX: TransformActionHandler = (\n eventData,\n transform,\n x,\n y,\n) => {\n return scaleObject(eventData, transform, x, y, { by: 'x' });\n};\n\n/**\n * Scaling logic for the Y axis.\n * Needs to be wrapped with `wrapWithFixedAnchor` to be effective\n * @param {Event} eventData javascript event that is doing the transform\n * @param {Object} transform javascript object containing a series of information around the current transform\n * @param {number} x current mouse x position, canvas normalized\n * @param {number} y current mouse y position, canvas normalized\n * @return {Boolean} true if some change happened\n */\nconst scaleObjectY: TransformActionHandler = (\n eventData,\n transform,\n x,\n y,\n) => {\n return scaleObject(eventData, transform, x, y, { by: 'y' });\n};\n\nexport const scalingEqually = wrapWithFireEvent(\n SCALING,\n wrapWithFixedAnchor(scaleObjectFromCorner),\n);\n\nexport const scalingX = wrapWithFireEvent(\n SCALING,\n wrapWithFixedAnchor(scaleObjectX),\n);\n\nexport const scalingY = wrapWithFireEvent(\n SCALING,\n wrapWithFixedAnchor(scaleObjectY),\n);\n","import type {\n ControlCursorCallback,\n TPointerEvent,\n Transform,\n TransformActionHandler,\n} from '../EventTypeDefs';\nimport { resolveOrigin } from '../util/misc/resolveOrigin';\nimport { Point } from '../Point';\nimport type { TAxis, TAxisKey } from '../typedefs';\nimport {\n degreesToRadians,\n radiansToDegrees,\n} from '../util/misc/radiansDegreesConversion';\nimport {\n findCornerQuadrant,\n getLocalPoint,\n isLocked,\n NOT_ALLOWED_CURSOR,\n} from './util';\nimport { wrapWithFireEvent } from './wrapWithFireEvent';\nimport { wrapWithFixedAnchor } from './wrapWithFixedAnchor';\nimport {\n CENTER,\n SCALE_X,\n SCALE_Y,\n SKEWING,\n SKEW_X,\n SKEW_Y,\n} from '../constants';\n\nexport type SkewTransform = Transform & { skewingSide: -1 | 1 };\n\nconst AXIS_KEYS: Record<\n TAxis,\n {\n counterAxis: TAxis;\n scale: TAxisKey<'scale'>;\n skew: TAxisKey<'skew'>;\n lockSkewing: TAxisKey<'lockSkewing'>;\n origin: TAxisKey<'origin'>;\n flip: TAxisKey<'flip'>;\n }\n> = {\n x: {\n counterAxis: 'y',\n scale: SCALE_X,\n skew: SKEW_X,\n lockSkewing: 'lockSkewingX',\n origin: 'originX',\n flip: 'flipX',\n },\n y: {\n counterAxis: 'x',\n scale: SCALE_Y,\n skew: SKEW_Y,\n lockSkewing: 'lockSkewingY',\n origin: 'originY',\n flip: 'flipY',\n },\n};\n\nconst skewMap = ['ns', 'nesw', 'ew', 'nwse'];\n\n/**\n * return the correct cursor style for the skew action\n * @param {Event} eventData the javascript event that is causing the scale\n * @param {Control} control the control that is interested in the action\n * @param {FabricObject} fabricObject the fabric object that is interested in the action\n * @return {String} a valid css string for the cursor\n */\nexport const skewCursorStyleHandler: ControlCursorCallback = (\n eventData,\n control,\n fabricObject,\n coord,\n) => {\n if (control.x !== 0 && isLocked(fabricObject, 'lockSkewingY')) {\n return NOT_ALLOWED_CURSOR;\n }\n if (control.y !== 0 && isLocked(fabricObject, 'lockSkewingX')) {\n return NOT_ALLOWED_CURSOR;\n }\n const n = findCornerQuadrant(fabricObject, control, coord) % 4;\n return `${skewMap[n]}-resize`;\n};\n\n/**\n * Since skewing is applied before scaling, calculations are done in a scaleless plane\n * @see https://github.com/fabricjs/fabric.js/pull/8380\n */\nfunction skewObject(\n axis: TAxis,\n { target, ex, ey, skewingSide, ...transform }: SkewTransform,\n pointer: Point,\n) {\n const { skew: skewKey } = AXIS_KEYS[axis],\n offset = pointer\n .subtract(new Point(ex, ey))\n .divide(new Point(target.scaleX, target.scaleY))[axis],\n skewingBefore = target[skewKey],\n skewingStart = transform[skewKey],\n shearingStart = Math.tan(degreesToRadians(skewingStart)),\n // let a, b be the size of target\n // let a' be the value of a after applying skewing\n // then:\n // a' = a + b * skewA => skewA = (a' - a) / b\n // the value b is tricky since skewY is applied before skewX\n b =\n axis === 'y'\n ? target._getTransformedDimensions({\n scaleX: 1,\n scaleY: 1,\n // since skewY is applied before skewX, b (=width) is not affected by skewX\n skewX: 0,\n }).x\n : target._getTransformedDimensions({\n scaleX: 1,\n scaleY: 1,\n }).y;\n\n const shearing =\n (2 * offset * skewingSide) /\n // we max out fractions to safeguard from asymptotic behavior\n Math.max(b, 1) +\n // add starting state\n shearingStart;\n\n const skewing = radiansToDegrees(Math.atan(shearing));\n\n target.set(skewKey, skewing);\n const changed = skewingBefore !== target[skewKey];\n\n if (changed && axis === 'y') {\n // we don't want skewing to affect scaleX\n // so we factor it by the inverse skewing diff to make it seem unchanged to the viewer\n const { skewX, scaleX } = target,\n dimBefore = target._getTransformedDimensions({ skewY: skewingBefore }),\n dimAfter = target._getTransformedDimensions(),\n compensationFactor = skewX !== 0 ? dimBefore.x / dimAfter.x : 1;\n compensationFactor !== 1 &&\n target.set(SCALE_X, compensationFactor * scaleX);\n }\n\n return changed;\n}\n\n/**\n * Wrapped Action handler for skewing on a given axis, takes care of the\n * skew direction and determines the correct transform origin for the anchor point\n * @param {Event} eventData javascript event that is doing the transform\n * @param {Object} transform javascript object containing a series of information around the current transform\n * @param {number} x current mouse x position, canvas normalized\n * @param {number} y current mouse y position, canvas normalized\n * @return {Boolean} true if some change happened\n */\nfunction skewHandler(\n axis: TAxis,\n eventData: TPointerEvent,\n transform: Transform,\n x: number,\n y: number,\n) {\n const { target } = transform,\n {\n counterAxis,\n origin: originKey,\n lockSkewing: lockSkewingKey,\n skew: skewKey,\n flip: flipKey,\n } = AXIS_KEYS[axis];\n if (isLocked(target, lockSkewingKey)) {\n return false;\n }\n\n const { origin: counterOriginKey, flip: counterFlipKey } =\n AXIS_KEYS[counterAxis],\n counterOriginFactor =\n resolveOrigin(transform[counterOriginKey]) *\n (target[counterFlipKey] ? -1 : 1),\n // if the counter origin is top/left (= -0.5) then we are skewing x/y values on the bottom/right side of target respectively.\n // if the counter origin is bottom/right (= 0.5) then we are skewing x/y values on the top/left side of target respectively.\n // skewing direction on the top/left side of target is OPPOSITE to the direction of the movement of the pointer,\n // so we factor skewing direction by this value.\n skewingSide = (-Math.sign(counterOriginFactor) *\n (target[flipKey] ? -1 : 1)) as 1 | -1,\n skewingDirection =\n ((target[skewKey] === 0 &&\n // in case skewing equals 0 we use the pointer offset from target center to determine the direction of skewing\n getLocalPoint(transform, CENTER, CENTER, x, y)[axis] > 0) ||\n // in case target has skewing we use that as the direction\n target[skewKey] > 0\n ? 1\n : -1) * skewingSide,\n // anchor to the opposite side of the skewing direction\n // normalize value from [-1, 1] to origin value [0, 1]\n origin = -skewingDirection * 0.5 + 0.5;\n\n const finalHandler = wrapWithFireEvent(\n SKEWING,\n wrapWithFixedAnchor((eventData, transform, x, y) =>\n skewObject(axis, transform, new Point(x, y)),\n ),\n );\n\n return finalHandler(\n eventData,\n {\n ...transform,\n [originKey]: origin,\n skewingSide,\n },\n x,\n y,\n );\n}\n\n/**\n * Wrapped Action handler for skewing on the X axis, takes care of the\n * skew direction and determines the correct transform origin for the anchor point\n * @param {Event} eventData javascript event that is doing the transform\n * @param {Object} transform javascript object containing a series of information around the current transform\n * @param {number} x current mouse x position, canvas normalized\n * @param {number} y current mouse y position, canvas normalized\n * @return {Boolean} true if some change happened\n */\nexport const skewHandlerX: TransformActionHandler = (\n eventData,\n transform,\n x,\n y,\n) => {\n return skewHandler('x', eventData, transform, x, y);\n};\n\n/**\n * Wrapped Action handler for skewing on the Y axis, takes care of the\n * skew direction and determines the correct transform origin for the anchor point\n * @param {Event} eventData javascript event that is doing the transform\n * @param {Object} transform javascript object containing a series of information around the current transform\n * @param {number} x current mouse x position, canvas normalized\n * @param {number} y current mouse y position, canvas normalized\n * @return {Boolean} true if some change happened\n */\nexport const skewHandlerY: TransformActionHandler = (\n eventData,\n transform,\n x,\n y,\n) => {\n return skewHandler('y', eventData, transform, x, y);\n};\n","import type {\n ControlCallback,\n ControlCursorCallback,\n TPointerEvent,\n TransformActionHandler,\n} from '../EventTypeDefs';\nimport { SCALE_X, SCALE_Y, SKEW_X, SKEW_Y } from '../constants';\nimport type { FabricObject } from '../shapes/Object/FabricObject';\nimport type { TAxisKey } from '../typedefs';\nimport { scaleCursorStyleHandler, scalingX, scalingY } from './scale';\nimport { skewCursorStyleHandler, skewHandlerX, skewHandlerY } from './skew';\n\nfunction isAltAction(eventData: TPointerEvent, target: FabricObject) {\n return eventData[target.canvas!.altActionKey!];\n}\n\n/**\n * Inspect event, control and fabricObject to return the correct action name\n * @param {Event} eventData the javascript event that is causing the scale\n * @param {Control} control the control that is interested in the action\n * @param {FabricObject} fabricObject the fabric object that is interested in the action\n * @return {String} an action name\n */\nexport const scaleOrSkewActionName: ControlCallback<\n TAxisKey<'skew' | 'scale'> | ''\n> = (eventData, control, fabricObject) => {\n const isAlternative = isAltAction(eventData, fabricObject);\n if (control.x === 0) {\n // then is scaleY or skewX\n return isAlternative ? SKEW_X : SCALE_Y;\n }\n if (control.y === 0) {\n // then is scaleY or skewX\n return isAlternative ? SKEW_Y : SCALE_X;\n }\n return '';\n};\n\n/**\n * Combine skew and scale style handlers to cover fabric standard use case\n * @param {Event} eventData the javascript event that is causing the scale\n * @param {Control} control the control that is interested in the action\n * @param {FabricObject} fabricObject the fabric object that is interested in the action\n * @return {String} a valid css string for the cursor\n */\nexport const scaleSkewCursorStyleHandler: ControlCursorCallback = (\n eventData,\n control,\n fabricObject,\n coord,\n) => {\n return isAltAction(eventData, fabricObject)\n ? skewCursorStyleHandler(eventData, control, fabricObject, coord)\n : scaleCursorStyleHandler(eventData, control, fabricObject, coord);\n};\n/**\n * Composed action handler to either scale X or skew Y\n * Needs to be wrapped with `wrapWithFixedAnchor` to be effective\n * @param {Event} eventData javascript event that is doing the transform\n * @param {Object} transform javascript object containing a series of information around the current transform\n * @param {number} x current mouse x position, canvas normalized\n * @param {number} y current mouse y position, canvas normalized\n * @return {Boolean} true if some change happened\n */\nexport const scalingXOrSkewingY: TransformActionHandler = (\n eventData,\n transform,\n x,\n y,\n) => {\n return isAltAction(eventData, transform.target)\n ? skewHandlerY(eventData, transform, x, y)\n : scalingX(eventData, transform, x, y);\n};\n\n/**\n * Composed action handler to either scale Y or skew X\n * Needs to be wrapped with `wrapWithFixedAnchor` to be effective\n * @param {Event} eventData javascript event that is doing the transform\n * @param {Object} transform javascript object containing a series of information around the current transform\n * @param {number} x current mouse x position, canvas normalized\n * @param {number} y current mouse y position, canvas normalized\n * @return {Boolean} true if some change happened\n */\nexport const scalingYOrSkewingX: TransformActionHandler = (\n eventData,\n transform,\n x,\n y,\n) => {\n return isAltAction(eventData, transform.target)\n ? skewHandlerX(eventData, transform, x, y)\n : scalingY(eventData, transform, x, y);\n};\n","import { RESIZING, ROTATE } from '../constants';\nimport { changeWidth } from './changeWidth';\nimport { Control } from './Control';\nimport { rotationStyleHandler, rotationWithSnapping } from './rotate';\nimport { scaleCursorStyleHandler, scalingEqually } from './scale';\nimport {\n scaleOrSkewActionName,\n scaleSkewCursorStyleHandler,\n scalingXOrSkewingY,\n scalingYOrSkewingX,\n} from './scaleSkew';\n\n// use this function if you want to generate new controls for every instance\nexport const createObjectDefaultControls = () => ({\n ml: new Control({\n x: -0.5,\n y: 0,\n cursorStyleHandler: scaleSkewCursorStyleHandler,\n actionHandler: scalingXOrSkewingY,\n getActionName: scaleOrSkewActionName,\n }),\n\n mr: new Control({\n x: 0.5,\n y: 0,\n cursorStyleHandler: scaleSkewCursorStyleHandler,\n actionHandler: scalingXOrSkewingY,\n getActionName: scaleOrSkewActionName,\n }),\n\n mb: new Control({\n x: 0,\n y: 0.5,\n cursorStyleHandler: scaleSkewCursorStyleHandler,\n actionHandler: scalingYOrSkewingX,\n getActionName: scaleOrSkewActionName,\n }),\n\n mt: new Control({\n x: 0,\n y: -0.5,\n cursorStyleHandler: scaleSkewCursorStyleHandler,\n actionHandler: scalingYOrSkewingX,\n getActionName: scaleOrSkewActionName,\n }),\n\n tl: new Control({\n x: -0.5,\n y: -0.5,\n cursorStyleHandler: scaleCursorStyleHandler,\n actionHandler: scalingEqually,\n }),\n\n tr: new Control({\n x: 0.5,\n y: -0.5,\n cursorStyleHandler: scaleCursorStyleHandler,\n actionHandler: scalingEqually,\n }),\n\n bl: new Control({\n x: -0.5,\n y: 0.5,\n cursorStyleHandler: scaleCursorStyleHandler,\n actionHandler: scalingEqually,\n }),\n\n br: new Control({\n x: 0.5,\n y: 0.5,\n cursorStyleHandler: scaleCursorStyleHandler,\n actionHandler: scalingEqually,\n }),\n\n mtr: new Control({\n x: 0,\n y: -0.5,\n actionHandler: rotationWithSnapping,\n cursorStyleHandler: rotationStyleHandler,\n offsetY: -40,\n withConnection: true,\n actionName: ROTATE,\n }),\n});\n\nexport const createResizeControls = () => ({\n mr: new Control({\n x: 0.5,\n y: 0,\n actionHandler: changeWidth,\n cursorStyleHandler: scaleSkewCursorStyleHandler,\n actionName: RESIZING,\n }),\n ml: new Control({\n x: -0.5,\n y: 0,\n actionHandler: changeWidth,\n cursorStyleHandler: scaleSkewCursorStyleHandler,\n actionName: RESIZING,\n }),\n});\n\nexport const createTextboxDefaultControls = () => ({\n ...createObjectDefaultControls(),\n ...createResizeControls(),\n});\n","import { Point, ZERO } from '../../Point';\nimport type { TCornerPoint, TDegree } from '../../typedefs';\nimport { FabricObject } from './Object';\nimport { degreesToRadians } from '../../util/misc/radiansDegreesConversion';\nimport type { TQrDecomposeOut } from '../../util/misc/matrix';\nimport {\n calcDimensionsMatrix,\n createRotateMatrix,\n createTranslateMatrix,\n multiplyTransformMatrices,\n qrDecompose,\n} from '../../util/misc/matrix';\nimport type { Control } from '../../controls/Control';\nimport { sizeAfterTransform } from '../../util/misc/objectTransforms';\nimport type { ObjectEvents, TPointerEvent } from '../../EventTypeDefs';\nimport type { Canvas } from '../../canvas/Canvas';\nimport type { ControlRenderingStyleOverride } from '../../controls/controlRendering';\nimport type { FabricObjectProps } from './types/FabricObjectProps';\nimport type { TFabricObjectProps, SerializedObjectProps } from './types';\nimport { createObjectDefaultControls } from '../../controls/commonControls';\nimport { interactiveObjectDefaultValues } from './defaultValues';\nimport { SCALE } from '../../constants';\n\nexport type TOCoord = Point & {\n corner: TCornerPoint;\n touchCorner: TCornerPoint;\n};\n\nexport type TControlSet = Record;\n\nexport type TBorderRenderingStyleOverride = Partial<\n Pick\n>;\n\nexport type TStyleOverride = ControlRenderingStyleOverride &\n TBorderRenderingStyleOverride &\n Partial<\n Pick & {\n forActiveSelection: boolean;\n }\n >;\n\nexport class InteractiveFabricObject<\n Props extends TFabricObjectProps = Partial,\n SProps extends SerializedObjectProps = SerializedObjectProps,\n EventSpec extends ObjectEvents = ObjectEvents,\n >\n extends FabricObject\n implements FabricObjectProps\n{\n declare noScaleCache: boolean;\n\n declare snapAngle?: TDegree;\n declare snapThreshold?: TDegree;\n\n declare lockMovementX: boolean;\n declare lockMovementY: boolean;\n declare lockRotation: boolean;\n declare lockScalingX: boolean;\n declare lockScalingY: boolean;\n declare lockSkewingX: boolean;\n declare lockSkewingY: boolean;\n declare lockScalingFlip: boolean;\n\n declare cornerSize: number;\n declare touchCornerSize: number;\n declare transparentCorners: boolean;\n declare cornerColor: string;\n declare cornerStrokeColor: string;\n declare cornerStyle: 'rect' | 'circle';\n declare cornerDashArray: number[] | null;\n declare hasControls: boolean;\n\n declare borderColor: string;\n declare borderDashArray: number[] | null;\n declare borderOpacityWhenMoving: number;\n declare borderScaleFactor: number;\n declare hasBorders: boolean;\n declare selectionBackgroundColor: string;\n\n declare selectable: boolean;\n declare evented: boolean;\n declare perPixelTargetFind: boolean;\n declare activeOn: 'down' | 'up';\n\n declare hoverCursor: CSSStyleDeclaration['cursor'] | null;\n declare moveCursor: CSSStyleDeclaration['cursor'] | null;\n\n /**\n * The object's controls' position in viewport coordinates\n * Calculated by {@link Control#positionHandler} and {@link Control#calcCornerCoords}, depending on {@link padding}.\n * `corner/touchCorner` describe the 4 points forming the interactive area of the corner.\n * Used to draw and locate controls.\n */\n declare oCoords: Record;\n\n /**\n * keeps the value of the last hovered corner during mouse move.\n * 0 is no corner, or 'mt', 'ml', 'mtr' etc..\n * It should be private, but there is no harm in using it as\n * a read-only property.\n * this isn't cleaned automatically. Non selected objects may have wrong values\n * @type [string]\n */\n declare __corner?: string;\n\n /**\n * a map of control visibility for this object.\n * this was left when controls were introduced to not break the api too much\n * this takes priority over the generic control visibility\n */\n declare _controlsVisibility: Record;\n\n /**\n * holds the controls for the object.\n * controls are added by default_controls.js\n */\n declare controls: TControlSet;\n\n /**\n * internal boolean to signal the code that the object is\n * part of the move action.\n */\n declare isMoving?: boolean;\n\n /**\n * A boolean used from the gesture module to keep tracking of a scaling\n * action when there is no scaling transform in place.\n * This is an edge case and is used twice in all codebase.\n * Probably added to keep track of some performance issues\n * @TODO use git blame to investigate why it was added\n * DON'T USE IT. WE WILL TRY TO REMOVE IT\n */\n declare _scaling?: boolean;\n\n declare canvas?: Canvas;\n\n static ownDefaults = interactiveObjectDefaultValues;\n\n static getDefaults(): Record {\n return {\n ...super.getDefaults(),\n ...InteractiveFabricObject.ownDefaults,\n };\n }\n\n /**\n * Constructor\n * @param {Object} [options] Options object\n */\n constructor(options?: Props) {\n super();\n Object.assign(\n this,\n (this.constructor as typeof InteractiveFabricObject).createControls(),\n InteractiveFabricObject.ownDefaults,\n );\n this.setOptions(options);\n }\n\n /**\n * Creates the default control object.\n * If you prefer to have on instance of controls shared among all objects\n * make this function return an empty object and add controls to the ownDefaults\n * @param {Object} [options] Options object\n */\n static createControls(): { controls: Record } {\n return { controls: createObjectDefaultControls() };\n }\n\n /**\n * Update width and height of the canvas for cache\n * returns true or false if canvas needed resize.\n * @private\n * @return {Boolean} true if the canvas has been resized\n */\n _updateCacheCanvas() {\n const targetCanvas = this.canvas;\n if (this.noScaleCache && targetCanvas && targetCanvas._currentTransform) {\n const transform = targetCanvas._currentTransform,\n target = transform.target,\n action = transform.action;\n if (\n this === (target as unknown as this) &&\n action &&\n action.startsWith(SCALE)\n ) {\n return false;\n }\n }\n return super._updateCacheCanvas();\n }\n\n getActiveControl() {\n const key = this.__corner;\n return key\n ? {\n key,\n control: this.controls[key],\n coord: this.oCoords[key],\n }\n : undefined;\n }\n\n /**\n * Determines which corner is under the mouse cursor, represented by `pointer`.\n * This function returns a corner only if the object is the active one.\n * This is done to avoid selecting corner of non active object and activating transformations\n * rather than drag action. The default behavior of fabricJS is that if you want to transform\n * an object, first you select it to show the control set\n * @private\n * @param {Object} pointer The pointer indicating the mouse position\n * @param {boolean} forTouch indicates if we are looking for interaction area with a touch action\n * @return {String|Boolean} corner code (tl, tr, bl, br, etc.), or 0 if nothing is found.\n */\n findControl(\n pointer: Point,\n forTouch = false,\n ): { key: string; control: Control; coord: TOCoord } | undefined {\n if (!this.hasControls || !this.canvas) {\n return undefined;\n }\n\n this.__corner = undefined;\n const cornerEntries = Object.entries(this.oCoords);\n for (let i = cornerEntries.length - 1; i >= 0; i--) {\n const [key, corner] = cornerEntries[i];\n const control = this.controls[key];\n\n if (\n control.shouldActivate(\n key,\n this,\n pointer,\n forTouch ? corner.touchCorner : corner.corner,\n )\n ) {\n // this.canvas.contextTop.fillRect(pointer.x - 1, pointer.y - 1, 2, 2);\n this.__corner = key;\n\n return { key, control, coord: this.oCoords[key] };\n }\n }\n\n return undefined;\n }\n\n /**\n * Calculates the coordinates of the center of each control plus the corners of the control itself\n * This basically just delegates to each control positionHandler\n * WARNING: changing what is passed to positionHandler is a breaking change, since position handler\n * is a public api and should be done just if extremely necessary\n * @return {Record}\n */\n calcOCoords(): Record {\n const vpt = this.getViewportTransform(),\n center = this.getCenterPoint(),\n tMatrix = createTranslateMatrix(center.x, center.y),\n rMatrix = createRotateMatrix({\n angle: this.getTotalAngle() - (!!this.group && this.flipX ? 180 : 0),\n }),\n positionMatrix = multiplyTransformMatrices(tMatrix, rMatrix),\n startMatrix = multiplyTransformMatrices(vpt, positionMatrix),\n finalMatrix = multiplyTransformMatrices(startMatrix, [\n 1 / vpt[0],\n 0,\n 0,\n 1 / vpt[3],\n 0,\n 0,\n ]),\n transformOptions = this.group\n ? qrDecompose(this.calcTransformMatrix())\n : undefined;\n // decomposing could bring negative scaling and `_calculateCurrentDimensions` can't take it\n if (transformOptions) {\n transformOptions.scaleX = Math.abs(transformOptions.scaleX);\n transformOptions.scaleY = Math.abs(transformOptions.scaleY);\n }\n const dim = this._calculateCurrentDimensions(transformOptions),\n coords: Record = {};\n\n this.forEachControl((control, key) => {\n const position = control.positionHandler(dim, finalMatrix, this, control);\n // coords[key] are sometimes used as points. Those are points to which we add\n // the property corner and touchCorner from `_calcCornerCoords`.\n // don't remove this assign for an object spread.\n coords[key] = Object.assign(\n position,\n this._calcCornerCoords(control, position),\n );\n });\n\n // debug code\n /*\n const canvas = this.canvas;\n setTimeout(function () {\n if (!canvas) return;\n canvas.contextTop.clearRect(0, 0, 700, 700);\n canvas.contextTop.fillStyle = 'green';\n Object.keys(coords).forEach(function(key) {\n const control = coords[key];\n canvas.contextTop.fillRect(control.x, control.y, 3, 3);\n });\n } 50);\n */\n return coords;\n }\n\n /**\n * Sets the coordinates that determine the interaction area of each control\n * note: if we would switch to ROUND corner area, all of this would disappear.\n * everything would resolve to a single point and a pythagorean theorem for the distance\n * @todo evaluate simplification of code switching to circle interaction area at runtime\n * @private\n */\n private _calcCornerCoords(control: Control, position: Point) {\n const angle = this.getTotalAngle();\n const corner = control.calcCornerCoords(\n angle,\n this.cornerSize,\n position.x,\n position.y,\n false,\n this,\n );\n const touchCorner = control.calcCornerCoords(\n angle,\n this.touchCornerSize,\n position.x,\n position.y,\n true,\n this,\n );\n return { corner, touchCorner };\n }\n\n /**\n * @override set controls' coordinates as well\n * See {@link https://github.com/fabricjs/fabric.js/wiki/When-to-call-setCoords} and {@link http://fabricjs.com/fabric-gotchas}\n * @return {void}\n */\n setCoords(): void {\n super.setCoords();\n this.canvas && (this.oCoords = this.calcOCoords());\n }\n\n /**\n * Calls a function for each control. The function gets called,\n * with the control, the control's key and the object that is calling the iterator\n * @param {Function} fn function to iterate over the controls over\n */\n forEachControl(\n fn: (\n control: Control,\n key: string,\n fabricObject: InteractiveFabricObject,\n ) => any,\n ) {\n for (const i in this.controls) {\n fn(this.controls[i], i, this);\n }\n }\n\n /**\n * Draws a colored layer behind the object, inside its selection borders.\n * Requires public options: padding, selectionBackgroundColor\n * this function is called when the context is transformed\n * has checks to be skipped when the object is on a staticCanvas\n * @todo evaluate if make this disappear in favor of a pre-render hook for objects\n * this was added by Andrea Bogazzi to make possible some feature for work reasons\n * it seemed a good option, now is an edge case\n * @param {CanvasRenderingContext2D} ctx Context to draw on\n */\n drawSelectionBackground(ctx: CanvasRenderingContext2D): void {\n if (\n !this.selectionBackgroundColor ||\n (this.canvas && (this.canvas._activeObject as unknown as this) !== this)\n ) {\n return;\n }\n ctx.save();\n const center = this.getRelativeCenterPoint(),\n wh = this._calculateCurrentDimensions(),\n vpt = this.getViewportTransform();\n ctx.translate(center.x, center.y);\n ctx.scale(1 / vpt[0], 1 / vpt[3]);\n ctx.rotate(degreesToRadians(this.angle));\n ctx.fillStyle = this.selectionBackgroundColor;\n ctx.fillRect(-wh.x / 2, -wh.y / 2, wh.x, wh.y);\n ctx.restore();\n }\n\n /**\n * @public override this function in order to customize the drawing of the control box, e.g. rounded corners, different border style.\n * @param {CanvasRenderingContext2D} ctx ctx is rotated and translated so that (0,0) is at object's center\n * @param {Point} size the control box size used\n */\n strokeBorders(ctx: CanvasRenderingContext2D, size: Point): void {\n ctx.strokeRect(-size.x / 2, -size.y / 2, size.x, size.y);\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to draw on\n * @param {Point} size\n * @param {TStyleOverride} styleOverride object to override the object style\n */\n _drawBorders(\n ctx: CanvasRenderingContext2D,\n size: Point,\n styleOverride: TStyleOverride = {},\n ): void {\n const options = {\n hasControls: this.hasControls,\n borderColor: this.borderColor,\n borderDashArray: this.borderDashArray,\n ...styleOverride,\n };\n ctx.save();\n ctx.strokeStyle = options.borderColor;\n this._setLineDash(ctx, options.borderDashArray);\n this.strokeBorders(ctx, size);\n options.hasControls && this.drawControlsConnectingLines(ctx, size);\n ctx.restore();\n }\n\n /**\n * Renders controls and borders for the object\n * the context here is not transformed\n * @todo move to interactivity\n * @param {CanvasRenderingContext2D} ctx Context to render on\n * @param {TStyleOverride} [styleOverride] properties to override the object style\n */\n _renderControls(\n ctx: CanvasRenderingContext2D,\n styleOverride: TStyleOverride = {},\n ) {\n const { hasBorders, hasControls } = this;\n const styleOptions = {\n hasBorders,\n hasControls,\n ...styleOverride,\n };\n const vpt = this.getViewportTransform(),\n shouldDrawBorders = styleOptions.hasBorders,\n shouldDrawControls = styleOptions.hasControls;\n const matrix = multiplyTransformMatrices(vpt, this.calcTransformMatrix());\n const options = qrDecompose(matrix);\n ctx.save();\n ctx.translate(options.translateX, options.translateY);\n ctx.lineWidth = this.borderScaleFactor; // 1 * this.borderScaleFactor;\n // since interactive groups have been introduced, an object could be inside a group and needing controls\n // the following equality check `this.group === this.parent` covers:\n // object without a group ( undefined === undefined )\n // object inside a group\n // excludes object inside a group but multi selected since group and parent will differ in value\n if (this.group === this.parent) {\n ctx.globalAlpha = this.isMoving ? this.borderOpacityWhenMoving : 1;\n }\n if (this.flipX) {\n options.angle -= 180;\n }\n ctx.rotate(degreesToRadians(this.group ? options.angle : this.angle));\n shouldDrawBorders && this.drawBorders(ctx, options, styleOverride);\n shouldDrawControls && this.drawControls(ctx, styleOverride);\n ctx.restore();\n }\n\n /**\n * Draws borders of an object's bounding box.\n * Requires public properties: width, height\n * Requires public options: padding, borderColor\n * @param {CanvasRenderingContext2D} ctx Context to draw on\n * @param {object} options object representing current object parameters\n * @param {TStyleOverride} [styleOverride] object to override the object style\n */\n drawBorders(\n ctx: CanvasRenderingContext2D,\n options: TQrDecomposeOut,\n styleOverride: TStyleOverride,\n ): void {\n let size;\n if ((styleOverride && styleOverride.forActiveSelection) || this.group) {\n const bbox = sizeAfterTransform(\n this.width,\n this.height,\n calcDimensionsMatrix(options),\n ),\n stroke = !this.isStrokeAccountedForInDimensions()\n ? (this.strokeUniform\n ? new Point().scalarAdd(this.canvas ? this.canvas.getZoom() : 1)\n : // this is extremely confusing. options comes from the upper function\n // and is the qrDecompose of a matrix that takes in account zoom too\n new Point(options.scaleX, options.scaleY)\n ).scalarMultiply(this.strokeWidth)\n : ZERO;\n size = bbox\n .add(stroke)\n .scalarAdd(this.borderScaleFactor)\n .scalarAdd(this.padding * 2);\n } else {\n size = this._calculateCurrentDimensions().scalarAdd(\n this.borderScaleFactor,\n );\n }\n this._drawBorders(ctx, size, styleOverride);\n }\n\n /**\n * Draws lines from a borders of an object's bounding box to controls that have `withConnection` property set.\n * Requires public properties: width, height\n * Requires public options: padding, borderColor\n * @param {CanvasRenderingContext2D} ctx Context to draw on\n * @param {Point} size object size x = width, y = height\n */\n drawControlsConnectingLines(\n ctx: CanvasRenderingContext2D,\n size: Point,\n ): void {\n let shouldStroke = false;\n\n ctx.beginPath();\n this.forEachControl((control, key) => {\n // in this moment, the ctx is centered on the object.\n // width and height of the above function are the size of the bbox.\n if (control.withConnection && control.getVisibility(this, key)) {\n // reset movement for each control\n shouldStroke = true;\n ctx.moveTo(control.x * size.x, control.y * size.y);\n ctx.lineTo(\n control.x * size.x + control.offsetX,\n control.y * size.y + control.offsetY,\n );\n }\n });\n shouldStroke && ctx.stroke();\n }\n\n /**\n * Draws corners of an object's bounding box.\n * Requires public properties: width, height\n * Requires public options: cornerSize, padding\n * Be aware that since fabric 6.0 this function does not call setCoords anymore.\n * setCoords needs to be called manually if the object of which we are rendering controls\n * is outside the standard selection and transform process.\n * @param {CanvasRenderingContext2D} ctx Context to draw on\n * @param {ControlRenderingStyleOverride} styleOverride object to override the object style\n */\n drawControls(\n ctx: CanvasRenderingContext2D,\n styleOverride: ControlRenderingStyleOverride = {},\n ) {\n ctx.save();\n const retinaScaling = this.getCanvasRetinaScaling();\n const { cornerStrokeColor, cornerDashArray, cornerColor } = this;\n const options = {\n cornerStrokeColor,\n cornerDashArray,\n cornerColor,\n ...styleOverride,\n };\n ctx.setTransform(retinaScaling, 0, 0, retinaScaling, 0, 0);\n ctx.strokeStyle = ctx.fillStyle = options.cornerColor;\n if (!this.transparentCorners) {\n ctx.strokeStyle = options.cornerStrokeColor;\n }\n this._setLineDash(ctx, options.cornerDashArray);\n this.forEachControl((control, key) => {\n if (control.getVisibility(this, key)) {\n const p = this.oCoords[key];\n control.render(ctx, p.x, p.y, options, this);\n }\n });\n ctx.restore();\n }\n\n /**\n * Returns true if the specified control is visible, false otherwise.\n * @param {string} controlKey The key of the control. Possible values are usually 'tl', 'tr', 'br', 'bl', 'ml', 'mt', 'mr', 'mb', 'mtr',\n * but since the control api allow for any control name, can be any string.\n * @returns {boolean} true if the specified control is visible, false otherwise\n */\n isControlVisible(controlKey: string): boolean {\n return (\n this.controls[controlKey] &&\n this.controls[controlKey].getVisibility(this, controlKey)\n );\n }\n\n /**\n * Sets the visibility of the specified control.\n * please do not use.\n * @param {String} controlKey The key of the control. Possible values are 'tl', 'tr', 'br', 'bl', 'ml', 'mt', 'mr', 'mb', 'mtr'.\n * but since the control api allow for any control name, can be any string.\n * @param {Boolean} visible true to set the specified control visible, false otherwise\n * @todo discuss this overlap of priority here with the team. Andrea Bogazzi for details\n */\n setControlVisible(controlKey: string, visible: boolean) {\n if (!this._controlsVisibility) {\n this._controlsVisibility = {};\n }\n this._controlsVisibility[controlKey] = visible;\n }\n\n /**\n * Sets the visibility state of object controls, this is just a bulk option for setControlVisible;\n * @param {Record} [options] with an optional key per control\n * example: {Boolean} [options.bl] true to enable the bottom-left control, false to disable it\n */\n setControlsVisibility(options: Record = {}) {\n Object.entries(options).forEach(([controlKey, visibility]) =>\n this.setControlVisible(controlKey, visibility),\n );\n }\n\n /**\n * Clears the canvas.contextTop in a specific area that corresponds to the object's bounding box\n * that is in the canvas.contextContainer.\n * This function is used to clear pieces of contextTop where we render ephemeral effects on top of the object.\n * Example: blinking cursor text selection, drag effects.\n * @todo discuss swapping restoreManually with a renderCallback, but think of async issues\n * @param {Boolean} [restoreManually] When true won't restore the context after clear, in order to draw something else.\n * @return {CanvasRenderingContext2D|undefined} canvas.contextTop that is either still transformed\n * with the object transformMatrix, or restored to neutral transform\n */\n clearContextTop(\n restoreManually?: boolean,\n ): CanvasRenderingContext2D | undefined {\n if (!this.canvas) {\n return;\n }\n const ctx = this.canvas.contextTop;\n if (!ctx) {\n return;\n }\n const v = this.canvas.viewportTransform;\n ctx.save();\n ctx.transform(v[0], v[1], v[2], v[3], v[4], v[5]);\n this.transform(ctx);\n // we add 4 pixel, to be sure to do not leave any pixel out\n const width = this.width + 4,\n height = this.height + 4;\n ctx.clearRect(-width / 2, -height / 2, width, height);\n\n restoreManually || ctx.restore();\n return ctx;\n }\n\n /**\n * This callback function is called every time _discardActiveObject or _setActiveObject\n * try to to deselect this object. If the function returns true, the process is cancelled\n * @param {Object} [_options] options sent from the upper functions\n * @param {TPointerEvent} [options.e] event if the process is generated by an event\n * @param {FabricObject} [options.object] next object we are setting as active, and reason why\n * this is being deselected\n */\n onDeselect(_options?: {\n e?: TPointerEvent;\n object?: InteractiveFabricObject;\n }): boolean {\n // implemented by sub-classes, as needed.\n return false;\n }\n\n /**\n * This callback function is called every time _discardActiveObject or _setActiveObject\n * try to to select this object. If the function returns true, the process is cancelled\n * @param {Object} [_options] options sent from the upper functions\n * @param {Event} [_options.e] event if the process is generated by an event\n */\n onSelect(_options?: { e?: TPointerEvent }): boolean {\n // implemented by sub-classes, as needed.\n return false;\n }\n\n /**\n * Override to customize Drag behavior\n * Fired from {@link Canvas#_onMouseMove}\n * @returns true in order for the window to start a drag session\n */\n shouldStartDragging(_e: TPointerEvent) {\n return false;\n }\n\n /**\n * Override to customize Drag behavior\\\n * Fired once a drag session has started\n * @returns true to handle the drag event\n */\n onDragStart(_e: DragEvent) {\n return false;\n }\n\n /**\n * Override to customize drag and drop behavior\n * @public\n * @param {DragEvent} _e\n * @returns {boolean} true if the object currently dragged can be dropped on the target\n */\n canDrop(_e: DragEvent): boolean {\n return false;\n }\n\n /**\n * Override to customize drag and drop behavior\n * render a specific effect when an object is the source of a drag event\n * example: render the selection status for the part of text that is being dragged from a text object\n * @public\n * @param {DragEvent} _e\n */\n renderDragSourceEffect(_e: DragEvent) {\n // for subclasses\n }\n\n /**\n * Override to customize drag and drop behavior\n * render a specific effect when an object is the target of a drag event\n * used to show that the underly object can receive a drop, or to show how the\n * object will change when dropping. example: show the cursor where the text is about to be dropped\n * @public\n * @param {DragEvent} _e\n */\n renderDropTargetEffect(_e: DragEvent) {\n // for subclasses\n }\n}\n","import type { Constructor } from '../typedefs';\n\n/***\n * https://www.typescriptlang.org/docs/handbook/mixins.html#alternative-pattern\n */\nexport function applyMixins(\n derivedCtor: T,\n constructors: S[],\n) {\n constructors.forEach((baseCtor) => {\n Object.getOwnPropertyNames(baseCtor.prototype).forEach((name) => {\n name !== 'constructor' &&\n Object.defineProperty(\n derivedCtor.prototype,\n name,\n Object.getOwnPropertyDescriptor(baseCtor.prototype, name) ||\n Object.create(null),\n );\n });\n });\n return derivedCtor as T & { prototype: InstanceType };\n}\n","import type { ObjectEvents } from '../../EventTypeDefs';\nimport { FabricObjectSVGExportMixin } from './FabricObjectSVGExportMixin';\nimport { InteractiveFabricObject } from './InteractiveObject';\nimport { applyMixins } from '../../util/applyMixins';\nimport type { FabricObjectProps } from './types/FabricObjectProps';\nimport type { TFabricObjectProps, SerializedObjectProps } from './types';\nimport { classRegistry } from '../../ClassRegistry';\n\n// TODO somehow we have to make a tree-shakeable import\n\n// eslint-disable-next-line @typescript-eslint/no-empty-object-type\nexport interface FabricObject<\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n Props extends TFabricObjectProps = Partial,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n SProps extends SerializedObjectProps = SerializedObjectProps,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n EventSpec extends ObjectEvents = ObjectEvents,\n> extends FabricObjectSVGExportMixin {}\n\n// eslint-disable-next-line @typescript-eslint/no-unsafe-declaration-merging\nexport class FabricObject<\n Props extends TFabricObjectProps = Partial,\n SProps extends SerializedObjectProps = SerializedObjectProps,\n EventSpec extends ObjectEvents = ObjectEvents,\n> extends InteractiveFabricObject {}\n\napplyMixins(FabricObject, [FabricObjectSVGExportMixin]);\n\nclassRegistry.setClass(FabricObject);\nclassRegistry.setClass(FabricObject, 'object');\n\nexport { cacheProperties } from './defaultValues';\n","/**\n * Returns true if context has transparent pixel\n * at specified location (taking tolerance into account)\n * @param {CanvasRenderingContext2D} ctx context\n * @param {Number} x x coordinate in canvasElementCoordinate, not fabric space. integer\n * @param {Number} y y coordinate in canvasElementCoordinate, not fabric space. integer\n * @param {Number} tolerance Tolerance pixels around the point, not alpha tolerance, integer\n * @return {boolean} true if transparent\n */\nexport const isTransparent = (\n ctx: CanvasRenderingContext2D,\n x: number,\n y: number,\n tolerance: number,\n): boolean => {\n tolerance = Math.round(tolerance);\n const size = tolerance * 2 + 1;\n const { data } = ctx.getImageData(x - tolerance, y - tolerance, size, size);\n\n // Split image data - for tolerance > 1, pixelDataSize = 4;\n for (let i = 3; i < data.length; i += 4) {\n const alphaChannel = data[i];\n if (alphaChannel > 0) {\n return false;\n }\n }\n return true;\n};\n","export const findIndexRight = (\n array: T[],\n predicate: (value: T, index: number, array: T[]) => boolean,\n) => {\n for (let index = array.length - 1; index >= 0; index--) {\n if (predicate(array[index], index, array)) {\n return index;\n }\n }\n return -1;\n};\n","import type { XY } from '../../../Point';\nimport { Point } from '../../../Point';\nimport { degreesToRadians } from '../radiansDegreesConversion';\nimport { createVector } from '../vectors';\nimport type { TProjectStrokeOnPointsOptions, TProjection } from './types';\n\n/**\n * @see https://github.com/fabricjs/fabric.js/pull/8344\n * @todo consider removing skewing from points before calculating stroke projection,\n * see https://github.com/fabricjs/fabric.js/commit/494a10ee2f8c2278ae9a55b20bf50cf6ee25b064#commitcomment-94751537\n */\nexport abstract class StrokeProjectionsBase {\n declare options: TProjectStrokeOnPointsOptions;\n declare scale: Point;\n declare strokeUniformScalar: Point;\n declare strokeProjectionMagnitude: number;\n\n constructor(options: TProjectStrokeOnPointsOptions) {\n this.options = options;\n this.strokeProjectionMagnitude = this.options.strokeWidth / 2;\n this.scale = new Point(this.options.scaleX, this.options.scaleY);\n this.strokeUniformScalar = this.options.strokeUniform\n ? new Point(1 / this.options.scaleX, 1 / this.options.scaleY)\n : new Point(1, 1);\n }\n\n /**\n * When the stroke is uniform, scaling affects the arrangement of points. So we must take it into account.\n */\n protected createSideVector(from: XY, to: XY) {\n const v = createVector(from, to);\n return this.options.strokeUniform ? v.multiply(this.scale) : v;\n }\n\n protected abstract calcOrthogonalProjection(\n from: Point,\n to: Point,\n magnitude?: number,\n ): Point;\n\n protected projectOrthogonally(from: Point, to: Point, magnitude?: number) {\n return this.applySkew(\n from.add(this.calcOrthogonalProjection(from, to, magnitude)),\n );\n }\n\n protected isSkewed() {\n return this.options.skewX !== 0 || this.options.skewY !== 0;\n }\n\n protected applySkew(point: Point) {\n const p = new Point(point);\n // skewY must be applied before skewX as this distortion affects skewX calculation\n p.y += p.x * Math.tan(degreesToRadians(this.options.skewY));\n p.x += p.y * Math.tan(degreesToRadians(this.options.skewX));\n return p;\n }\n\n protected scaleUnitVector(unitVector: Point, scalar: number) {\n return unitVector.multiply(this.strokeUniformScalar).scalarMultiply(scalar);\n }\n\n protected abstract projectPoints(): Point[];\n\n public abstract project(): TProjection[];\n}\n","import type { XY } from '../../../Point';\nimport { Point } from '../../../Point';\nimport { halfPI, twoMathPi } from '../../../constants';\nimport type { TRadian } from '../../../typedefs';\nimport { degreesToRadians } from '../radiansDegreesConversion';\nimport {\n calcAngleBetweenVectors,\n calcVectorRotation,\n crossProduct,\n getOrthonormalVector,\n getUnitVector,\n isBetweenVectors,\n magnitude,\n rotateVector,\n} from '../vectors';\nimport { StrokeProjectionsBase } from './StrokeProjectionsBase';\nimport type { TProjection, TProjectStrokeOnPointsOptions } from './types';\n\nconst zeroVector = new Point();\n\n/**\n * class in charge of finding projections for each type of line join\n * @see {@link [Closed path projections at #8344](https://github.com/fabricjs/fabric.js/pull/8344#2-closed-path)}\n *\n * - MDN:\n * - https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/lineJoin\n * - https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/stroke-linejoin\n * - Spec: https://svgwg.org/svg2-draft/painting.html#StrokeLinejoinProperty\n * - Playground to understand how the line joins works: https://hypertolosana.github.io/efficient-webgl-stroking/index.html\n * - View the calculated projections for each of the control points: https://codesandbox.io/s/project-stroke-points-with-context-to-trace-b8jc4j?file=/src/index.js\n *\n */\nexport class StrokeLineJoinProjections extends StrokeProjectionsBase {\n /**\n * The point being projected (the angle ∠BAC)\n */\n declare A: Point;\n /**\n * The point before A\n */\n declare B: Point;\n /**\n * The point after A\n */\n declare C: Point;\n /**\n * The AB vector\n */\n AB: Point;\n /**\n * The AC vector\n */\n AC: Point;\n /**\n * The angle of A (∠BAC)\n */\n alpha: TRadian;\n /**\n * The bisector of A (∠BAC)\n */\n bisector: Point;\n\n static getOrthogonalRotationFactor(vector1: Point, vector2?: Point) {\n const angle = vector2\n ? calcAngleBetweenVectors(vector1, vector2)\n : calcVectorRotation(vector1);\n return Math.abs(angle) < halfPI ? -1 : 1;\n }\n\n constructor(A: XY, B: XY, C: XY, options: TProjectStrokeOnPointsOptions) {\n super(options);\n this.A = new Point(A);\n this.B = new Point(B);\n this.C = new Point(C);\n this.AB = this.createSideVector(this.A, this.B);\n this.AC = this.createSideVector(this.A, this.C);\n this.alpha = calcAngleBetweenVectors(this.AB, this.AC);\n this.bisector = getUnitVector(\n // if AC is also the zero vector nothing will be projected\n // in that case the next point will handle the projection\n rotateVector(this.AB.eq(zeroVector) ? this.AC : this.AB, this.alpha / 2),\n );\n }\n\n calcOrthogonalProjection(\n from: Point,\n to: Point,\n magnitude: number = this.strokeProjectionMagnitude,\n ) {\n const vector = this.createSideVector(from, to);\n const orthogonalProjection = getOrthonormalVector(vector);\n const correctSide = StrokeLineJoinProjections.getOrthogonalRotationFactor(\n orthogonalProjection,\n this.bisector,\n );\n return this.scaleUnitVector(orthogonalProjection, magnitude * correctSide);\n }\n\n /**\n * BEVEL\n * Calculation: the projection points are formed by the vector orthogonal to the vertex.\n *\n * @see https://github.com/fabricjs/fabric.js/pull/8344#2-2-bevel\n */\n projectBevel() {\n const projections: Point[] = [];\n // if `alpha` equals 0 or 2*PI, the projections are the same for `B` and `C`\n (this.alpha % twoMathPi === 0 ? [this.B] : [this.B, this.C]).forEach(\n (to) => {\n projections.push(this.projectOrthogonally(this.A, to));\n projections.push(\n this.projectOrthogonally(this.A, to, -this.strokeProjectionMagnitude),\n );\n },\n );\n return projections;\n }\n\n /**\n * MITER\n * Calculation: the corner is formed by extending the outer edges of the stroke\n * at the tangents of the path segments until they intersect.\n *\n * @see https://github.com/fabricjs/fabric.js/pull/8344#2-1-miter\n */\n projectMiter() {\n const projections: Point[] = [],\n alpha = Math.abs(this.alpha),\n hypotUnitScalar = 1 / Math.sin(alpha / 2),\n miterVector = this.scaleUnitVector(\n this.bisector,\n -this.strokeProjectionMagnitude * hypotUnitScalar,\n );\n\n // When two line segments meet at a sharp angle, it is possible for the join to extend,\n // far beyond the thickness of the line stroking the path. The stroke-miterlimit imposes\n // a limit on the extent of the line join.\n // MDN: https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/stroke-miterlimit\n // When the stroke is uniform, scaling changes the arrangement of points, this changes the miter-limit\n const strokeMiterLimit = this.options.strokeUniform\n ? magnitude(\n this.scaleUnitVector(this.bisector, this.options.strokeMiterLimit),\n )\n : this.options.strokeMiterLimit;\n\n if (\n magnitude(miterVector) / this.strokeProjectionMagnitude <=\n strokeMiterLimit\n ) {\n projections.push(this.applySkew(this.A.add(miterVector)));\n }\n /* when the miter-limit is reached, the stroke line join becomes of type bevel.\n We always need two orthogonal projections which are basically bevel-type projections,\n so regardless of whether the miter-limit was reached or not, we include these projections.\n */\n projections.push(...this.projectBevel());\n\n return projections;\n }\n\n /**\n * ROUND (without skew)\n * Calculation: the projections are the two vectors parallel to X and Y axes\n *\n * @see https://github.com/fabricjs/fabric.js/pull/8344#2-3-1-round-without-skew\n */\n private projectRoundNoSkew(startCircle: Point, endCircle: Point) {\n const projections: Point[] = [],\n // correctSide is used to only consider projecting for the outer side\n correctSide = new Point(\n StrokeLineJoinProjections.getOrthogonalRotationFactor(this.bisector),\n StrokeLineJoinProjections.getOrthogonalRotationFactor(\n new Point(this.bisector.y, this.bisector.x),\n ),\n ),\n radiusOnAxisX = new Point(1, 0)\n .scalarMultiply(this.strokeProjectionMagnitude)\n .multiply(this.strokeUniformScalar)\n .multiply(correctSide),\n radiusOnAxisY = new Point(0, 1)\n .scalarMultiply(this.strokeProjectionMagnitude)\n .multiply(this.strokeUniformScalar)\n .multiply(correctSide);\n\n [radiusOnAxisX, radiusOnAxisY].forEach((vector) => {\n if (isBetweenVectors(vector, startCircle, endCircle)) {\n projections.push(this.A.add(vector));\n }\n });\n return projections;\n }\n\n /**\n * ROUND (with skew)\n * Calculation: the projections are the points furthest from the vertex in\n * the direction of the X and Y axes after distortion.\n *\n * @see https://github.com/fabricjs/fabric.js/pull/8344#2-3-2-round-skew\n */\n private projectRoundWithSkew(startCircle: Point, endCircle: Point) {\n const projections: Point[] = [];\n\n const { skewX, skewY, scaleX, scaleY, strokeUniform } = this.options,\n shearing = new Point(\n Math.tan(degreesToRadians(skewX)),\n Math.tan(degreesToRadians(skewY)),\n );\n // The points furthest from the vertex in the direction of the X and Y axes after distortion\n const circleRadius = this.strokeProjectionMagnitude,\n newY = strokeUniform\n ? circleRadius /\n scaleY /\n Math.sqrt(1 / scaleY ** 2 + (1 / scaleX ** 2) * shearing.y ** 2)\n : circleRadius / Math.sqrt(1 + shearing.y ** 2),\n furthestY = new Point(\n // Safe guard due to floating point precision. In some situations the square root\n // was returning NaN because of a negative number close to zero.\n Math.sqrt(Math.max(circleRadius ** 2 - newY ** 2, 0)),\n newY,\n ),\n newX = strokeUniform\n ? circleRadius /\n Math.sqrt(\n 1 +\n (shearing.x ** 2 * (1 / scaleY) ** 2) /\n (1 / scaleX + (1 / scaleX) * shearing.x * shearing.y) ** 2,\n )\n : circleRadius /\n Math.sqrt(1 + shearing.x ** 2 / (1 + shearing.x * shearing.y) ** 2),\n furthestX = new Point(\n newX,\n Math.sqrt(Math.max(circleRadius ** 2 - newX ** 2, 0)),\n );\n\n [\n furthestX,\n furthestX.scalarMultiply(-1),\n furthestY,\n furthestY.scalarMultiply(-1),\n ]\n // We need to skew the vector here as this information is used to check if\n // it is between the start and end of the circle segment\n .map((vector) =>\n this.applySkew(\n strokeUniform ? vector.multiply(this.strokeUniformScalar) : vector,\n ),\n )\n .forEach((vector) => {\n if (isBetweenVectors(vector, startCircle, endCircle)) {\n projections.push(this.applySkew(this.A).add(vector));\n }\n });\n\n return projections;\n }\n\n projectRound() {\n const projections: Point[] = [];\n /* Include the start and end points of the circle segment, so that only\n the projections contained within it are included */\n // add the orthogonal projections (start and end points of circle segment)\n projections.push(...this.projectBevel());\n // let's determines which one of the orthogonal projection is the beginning and end of the circle segment.\n // when `alpha` equals 0 or 2*PI, we have a straight line, so the way to find the start/end is different.\n const isStraightLine = this.alpha % twoMathPi === 0,\n // change the origin of the projections to point A\n // so that the cross product calculation is correct\n newOrigin = this.applySkew(this.A),\n proj0 = projections[isStraightLine ? 0 : 2].subtract(newOrigin),\n proj1 = projections[isStraightLine ? 1 : 0].subtract(newOrigin),\n // when `isStraightLine` === true, we compare with the vector opposite AB, otherwise we compare with the bisector.\n comparisonVector = isStraightLine\n ? this.applySkew(this.AB.scalarMultiply(-1))\n : this.applySkew(\n this.bisector.multiply(this.strokeUniformScalar).scalarMultiply(-1),\n ),\n // the beginning of the circle segment is always to the right of the comparison vector (cross product > 0)\n isProj0Start = crossProduct(proj0, comparisonVector) > 0,\n startCircle = isProj0Start ? proj0 : proj1,\n endCircle = isProj0Start ? proj1 : proj0;\n if (!this.isSkewed()) {\n projections.push(...this.projectRoundNoSkew(startCircle, endCircle));\n } else {\n projections.push(...this.projectRoundWithSkew(startCircle, endCircle));\n }\n return projections;\n }\n\n /**\n * Project stroke width on points returning projections for each point as follows:\n * - `miter`: 1 point corresponding to the outer boundary. If the miter limit is exceeded, it will be 2 points (becomes bevel)\n * - `bevel`: 2 points corresponding to the bevel possible boundaries, orthogonal to the stroke.\n * - `round`: same as `bevel` when it has no skew, with skew are 4 points.\n */\n protected projectPoints() {\n switch (this.options.strokeLineJoin) {\n case 'miter':\n return this.projectMiter();\n case 'round':\n return this.projectRound();\n default:\n return this.projectBevel();\n }\n }\n\n public project(): TProjection[] {\n return this.projectPoints().map((point) => ({\n originPoint: this.A,\n projectedPoint: point,\n angle: this.alpha,\n bisector: this.bisector,\n }));\n }\n}\n","import type { XY } from '../../../Point';\nimport { Point } from '../../../Point';\nimport { getOrthonormalVector, getUnitVector } from '../vectors';\nimport { StrokeLineJoinProjections } from './StrokeLineJoinProjections';\nimport { StrokeProjectionsBase } from './StrokeProjectionsBase';\nimport type { TProjection, TProjectStrokeOnPointsOptions } from './types';\n\n/**\n * class in charge of finding projections for each type of line cap for start/end of an open path\n * @see {@link [Open path projections at #8344](https://github.com/fabricjs/fabric.js/pull/8344#1-open-path)}\n *\n * Reference:\n * - MDN:\n * - https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/lineCap\n * - https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/stroke-linecap\n * - Spec: https://html.spec.whatwg.org/multipage/canvas.html#dom-context-2d-linecap-dev\n * - Playground to understand how the line joins works: https://hypertolosana.github.io/efficient-webgl-stroking/index.html\n * - View the calculated projections for each of the control points: https://codesandbox.io/s/project-stroke-points-with-context-to-trace-b8jc4j?file=/src/index.js\n */\nexport class StrokeLineCapProjections extends StrokeProjectionsBase {\n /**\n * edge point\n */\n declare A: Point;\n /**\n * point next to edge point\n */\n declare T: Point;\n\n constructor(A: XY, T: XY, options: TProjectStrokeOnPointsOptions) {\n super(options);\n this.A = new Point(A);\n this.T = new Point(T);\n }\n\n calcOrthogonalProjection(\n from: Point,\n to: Point,\n magnitude: number = this.strokeProjectionMagnitude,\n ) {\n const vector = this.createSideVector(from, to);\n return this.scaleUnitVector(getOrthonormalVector(vector), magnitude);\n }\n\n /**\n * OPEN PATH START/END - Line cap: Butt\n * Calculation: to find the projections, just find the points orthogonal to the stroke\n *\n * @see https://github.com/fabricjs/fabric.js/pull/8344#1-1-butt\n */\n projectButt() {\n return [\n this.projectOrthogonally(this.A, this.T, this.strokeProjectionMagnitude),\n this.projectOrthogonally(this.A, this.T, -this.strokeProjectionMagnitude),\n ];\n }\n\n /**\n * OPEN PATH START/END - Line cap: Round\n * Calculation: same as stroke line join `round`\n *\n * @see https://github.com/fabricjs/fabric.js/pull/8344#1-2-round\n */\n projectRound() {\n const projections: Point[] = [];\n\n if (!this.isSkewed() && this.A.eq(this.T)) {\n /* 1 point case without `skew`\n When `strokeUniform` is true, scaling has no effect.\n So we divide by scale, to remove its effect.\n */\n const projection = new Point(1, 1)\n .scalarMultiply(this.strokeProjectionMagnitude)\n .multiply(this.strokeUniformScalar);\n projections.push(\n this.applySkew(this.A.add(projection)),\n this.applySkew(this.A.subtract(projection)),\n );\n } else {\n projections.push(\n ...new StrokeLineJoinProjections(\n this.A,\n this.T,\n this.T,\n this.options,\n ).projectRound(),\n );\n }\n\n return projections;\n }\n\n /**\n * OPEN PATH START/END - Line cap: Square\n * Calculation: project a rectangle of points on the stroke in the opposite direction of the vector `AT`\n *\n * @see https://github.com/fabricjs/fabric.js/pull/8344#1-3-square\n */\n projectSquare() {\n const projections: Point[] = [];\n\n if (this.A.eq(this.T)) {\n /* 1 point case without `skew`\n When `strokeUniform` is true, scaling has no effect.\n So we divide by scale, to remove its effect.\n */\n const projection = new Point(1, 1)\n .scalarMultiply(this.strokeProjectionMagnitude)\n .multiply(this.strokeUniformScalar);\n projections.push(this.A.add(projection), this.A.subtract(projection));\n } else {\n const orthogonalProjection = this.calcOrthogonalProjection(\n this.A,\n this.T,\n this.strokeProjectionMagnitude,\n );\n const strokePointingOut = this.scaleUnitVector(\n getUnitVector(this.createSideVector(this.A, this.T)),\n -this.strokeProjectionMagnitude,\n );\n const projectedA = this.A.add(strokePointingOut);\n projections.push(\n projectedA.add(orthogonalProjection),\n projectedA.subtract(orthogonalProjection),\n );\n }\n\n return projections.map((p) => this.applySkew(p));\n }\n\n protected projectPoints() {\n switch (this.options.strokeLineCap) {\n case 'round':\n return this.projectRound();\n case 'square':\n return this.projectSquare();\n default:\n return this.projectButt();\n }\n }\n\n public project(): TProjection[] {\n return this.projectPoints().map((point) => ({\n originPoint: this.A,\n projectedPoint: point,\n }));\n }\n}\n","import { Point, type XY } from '../../../Point';\nimport { findIndexRight } from '../../internals/findRight';\nimport { StrokeLineCapProjections } from './StrokeLineCapProjections';\nimport { StrokeLineJoinProjections } from './StrokeLineJoinProjections';\nimport type { TProjection, TProjectStrokeOnPointsOptions } from './types';\n\nexport type * from './types';\n\n/**\n *\n * Used to calculate object's bounding box\n *\n * @see https://github.com/fabricjs/fabric.js/pull/8344\n *\n */\nexport const projectStrokeOnPoints = (\n points: XY[],\n options: TProjectStrokeOnPointsOptions,\n openPath = false,\n): TProjection[] => {\n const projections: TProjection[] = [];\n\n if (points.length === 0) {\n return projections;\n }\n\n // first we remove duplicate neighboring points\n const reduced = points.reduce(\n (reduced, point) => {\n if (!reduced[reduced.length - 1].eq(point)) {\n reduced.push(new Point(point));\n }\n return reduced;\n },\n [new Point(points[0])],\n );\n\n if (reduced.length === 1) {\n openPath = true;\n } else if (!openPath) {\n // remove points from end in case they equal the first point\n // in order to correctly project the first point\n const start = reduced[0];\n const index = findIndexRight(reduced, (point) => !point.eq(start));\n reduced.splice(index + 1);\n }\n\n reduced.forEach((A, index, points) => {\n let B: XY, C: XY;\n if (index === 0) {\n C = points[1];\n B = openPath ? A : points[points.length - 1];\n } else if (index === points.length - 1) {\n B = points[index - 1];\n C = openPath ? A : points[0];\n } else {\n B = points[index - 1];\n C = points[index + 1];\n }\n\n if (openPath && points.length === 1) {\n projections.push(\n ...new StrokeLineCapProjections(A, A, options).project(),\n );\n } else if (openPath && (index === 0 || index === points.length - 1)) {\n projections.push(\n ...new StrokeLineCapProjections(\n A,\n index === 0 ? C : B,\n options,\n ).project(),\n );\n } else {\n projections.push(\n ...new StrokeLineJoinProjections(A, B, C, options).project(),\n );\n }\n });\n\n return projections;\n};\n","import type { TextStyle } from '../../shapes/Text/StyledText';\n\nexport const cloneStyles = (style: TextStyle): TextStyle => {\n const newObj: TextStyle = {};\n Object.keys(style).forEach((key) => {\n newObj[key] = {};\n Object.keys(style[key]).forEach((keyInner) => {\n newObj[key][keyInner] = { ...style[key][keyInner] };\n });\n });\n return newObj;\n};\n","import { getFabricWindow } from '../env';\n\n/**\n * Capitalizes a string\n * @param {String} string String to capitalize\n * @param {Boolean} [firstLetterOnly] If true only first letter is capitalized\n * and other letters stay untouched, if false first letter is capitalized\n * and other letters are converted to lowercase.\n * @return {String} Capitalized version of a string\n */\nexport const capitalize = (string: string, firstLetterOnly = false): string =>\n `${string.charAt(0).toUpperCase()}${\n firstLetterOnly ? string.slice(1) : string.slice(1).toLowerCase()\n }`;\n\n/**\n * Escapes XML in a string\n * @param {String} string String to escape\n * @return {String} Escaped version of a string\n */\nexport const escapeXml = (string: string): string =>\n string\n .replace(/&/g, '&')\n .replace(/\"/g, '"')\n .replace(/'/g, ''')\n .replace(//g, '>');\n\nlet segmenter: Intl.Segmenter | false;\n\nconst getSegmenter = () => {\n if (!segmenter) {\n segmenter =\n 'Intl' in getFabricWindow() &&\n 'Segmenter' in Intl &&\n new Intl.Segmenter(undefined, {\n granularity: 'grapheme',\n });\n }\n return segmenter;\n};\n\n/**\n * Divide a string in the user perceived single units\n * @param {String} textstring String to escape\n * @return {Array} array containing the graphemes\n */\nexport const graphemeSplit = (textstring: string): string[] => {\n segmenter || getSegmenter();\n if (segmenter) {\n const segments = segmenter.segment(textstring);\n return Array.from(segments).map(({ segment }) => segment);\n }\n\n //Fallback\n return graphemeSplitImpl(textstring);\n};\n\nconst graphemeSplitImpl = (textstring: string): string[] => {\n const graphemes: string[] = [];\n for (let i = 0, chr; i < textstring.length; i++) {\n if ((chr = getWholeChar(textstring, i)) === false) {\n continue;\n }\n graphemes.push(chr);\n }\n return graphemes;\n};\n\n// taken from mdn in the charAt doc page.\nconst getWholeChar = (str: string, i: number): string | false => {\n const code = str.charCodeAt(i);\n if (isNaN(code)) {\n return ''; // Position not found\n }\n if (code < 0xd800 || code > 0xdfff) {\n return str.charAt(i);\n }\n\n // High surrogate (could change last hex to 0xDB7F to treat high private\n // surrogates as single characters)\n if (0xd800 <= code && code <= 0xdbff) {\n if (str.length <= i + 1) {\n throw 'High surrogate without following low surrogate';\n }\n const next = str.charCodeAt(i + 1);\n if (0xdc00 > next || next > 0xdfff) {\n throw 'High surrogate without following low surrogate';\n }\n return str.charAt(i) + str.charAt(i + 1);\n }\n // Low surrogate (0xDC00 <= code && code <= 0xDFFF)\n if (i === 0) {\n throw 'Low surrogate without preceding high surrogate';\n }\n const prev = str.charCodeAt(i - 1);\n\n // (could change last hex to 0xDB7F to treat high private\n // surrogates as single characters)\n if (0xd800 > prev || prev > 0xdbff) {\n throw 'Low surrogate without preceding high surrogate';\n }\n // We can pass over low surrogates now as the second component\n // in a pair which we have already processed\n return false;\n};\n","import { reNewline } from '../../constants';\nimport type {\n TextStyle,\n TextStyleDeclaration,\n} from '../../shapes/Text/StyledText';\nimport { cloneStyles } from '../internals/cloneStyles';\nimport { graphemeSplit } from '../lang_string';\n\nexport type TextStyleArray = {\n start: number;\n end: number;\n style: TextStyleDeclaration;\n}[];\n\n/**\n * @param {Object} prevStyle first style to compare\n * @param {Object} thisStyle second style to compare\n * @param {boolean} forTextSpans whether to check overline, underline, and line-through properties\n * @return {boolean} true if the style changed\n */\nexport const hasStyleChanged = (\n prevStyle: TextStyleDeclaration,\n thisStyle: TextStyleDeclaration,\n forTextSpans = false,\n) =>\n prevStyle.fill !== thisStyle.fill ||\n prevStyle.stroke !== thisStyle.stroke ||\n prevStyle.strokeWidth !== thisStyle.strokeWidth ||\n prevStyle.fontSize !== thisStyle.fontSize ||\n prevStyle.fontFamily !== thisStyle.fontFamily ||\n prevStyle.fontWeight !== thisStyle.fontWeight ||\n prevStyle.fontStyle !== thisStyle.fontStyle ||\n prevStyle.textDecorationThickness !== thisStyle.textDecorationThickness ||\n prevStyle.textBackgroundColor !== thisStyle.textBackgroundColor ||\n prevStyle.deltaY !== thisStyle.deltaY ||\n (forTextSpans &&\n (prevStyle.overline !== thisStyle.overline ||\n prevStyle.underline !== thisStyle.underline ||\n prevStyle.linethrough !== thisStyle.linethrough));\n\n/**\n * Returns the array form of a text object's inline styles property with styles grouped in ranges\n * rather than per character. This format is less verbose, and is better suited for storage\n * so it is used in serialization (not during runtime).\n * @param {object} styles per character styles for a text object\n * @param {String} text the text string that the styles are applied to\n * @return {{start: number, end: number, style: object}[]}\n */\nexport const stylesToArray = (\n styles: TextStyle,\n text: string,\n): TextStyleArray => {\n const textLines = text.split('\\n'),\n stylesArray = [];\n let charIndex = -1,\n prevStyle = {};\n // clone style structure to prevent mutation\n styles = cloneStyles(styles);\n\n //loop through each textLine\n for (let i = 0; i < textLines.length; i++) {\n const chars = graphemeSplit(textLines[i]);\n if (!styles[i]) {\n //no styles exist for this line, so add the line's length to the charIndex total and reset prevStyle\n charIndex += chars.length;\n prevStyle = {};\n continue;\n }\n //loop through each character of the current line\n for (let c = 0; c < chars.length; c++) {\n charIndex++;\n const thisStyle = styles[i][c];\n //check if style exists for this character\n if (thisStyle && Object.keys(thisStyle).length > 0) {\n if (hasStyleChanged(prevStyle, thisStyle, true)) {\n stylesArray.push({\n start: charIndex,\n end: charIndex + 1,\n style: thisStyle,\n });\n } else {\n //if style is the same as previous character, increase end index\n stylesArray[stylesArray.length - 1].end++;\n }\n }\n prevStyle = thisStyle || {};\n }\n }\n return stylesArray;\n};\n\n/**\n * Returns the object form of the styles property with styles that are assigned per\n * character rather than grouped by range. This format is more verbose, and is\n * only used during runtime (not for serialization/storage)\n * @param {Array} styles the serialized form of a text object's styles\n * @param {String} text the text string that the styles are applied to\n * @return {Object}\n */\nexport const stylesFromArray = (\n styles: TextStyleArray | TextStyle,\n text: string,\n): TextStyle => {\n if (!Array.isArray(styles)) {\n // clone to prevent mutation\n return cloneStyles(styles);\n }\n const textLines = text.split(reNewline),\n stylesObject: TextStyle = {};\n let charIndex = -1,\n styleIndex = 0;\n //loop through each textLine\n for (let i = 0; i < textLines.length; i++) {\n const chars = graphemeSplit(textLines[i]);\n\n //loop through each character of the current line\n for (let c = 0; c < chars.length; c++) {\n charIndex++;\n //check if there's a style collection that includes the current character\n if (\n styles[styleIndex] &&\n styles[styleIndex].start <= charIndex &&\n charIndex < styles[styleIndex].end\n ) {\n //create object for line index if it doesn't exist\n stylesObject[i] = stylesObject[i] || {};\n //assign a style at this character's index\n stylesObject[i][c] = { ...styles[styleIndex].style };\n //if character is at the end of the current style collection, move to the next\n if (charIndex === styles[styleIndex].end - 1) {\n styleIndex++;\n }\n }\n }\n }\n return stylesObject;\n};\n","import { FILL, STROKE } from '../constants';\n\n/**\n * Attributes parsed from all SVG elements\n * @type array\n */\nexport const SHARED_ATTRIBUTES = [\n 'display',\n 'transform',\n FILL,\n 'fill-opacity',\n 'fill-rule',\n 'opacity',\n STROKE,\n 'stroke-dasharray',\n 'stroke-linecap',\n 'stroke-dashoffset',\n 'stroke-linejoin',\n 'stroke-miterlimit',\n 'stroke-opacity',\n 'stroke-width',\n 'id',\n 'paint-order',\n 'vector-effect',\n 'instantiated_by_use',\n 'clip-path',\n];\n","export function selectorMatches(\n element: HTMLElement | SVGElement,\n selector: string,\n) {\n const nodeName = element.nodeName;\n const classNames = element.getAttribute('class');\n const id = element.getAttribute('id');\n const azAz = '(?![a-zA-Z\\\\-]+)';\n let matcher;\n // i check if a selector matches slicing away part from it.\n // if i get empty string i should match\n matcher = new RegExp('^' + nodeName, 'i');\n selector = selector.replace(matcher, '');\n if (id && selector.length) {\n matcher = new RegExp('#' + id + azAz, 'i');\n selector = selector.replace(matcher, '');\n }\n if (classNames && selector.length) {\n const splitClassNames = classNames.split(' ');\n for (let i = splitClassNames.length; i--; ) {\n matcher = new RegExp('\\\\.' + splitClassNames[i] + azAz, 'i');\n selector = selector.replace(matcher, '');\n }\n }\n return selector.length === 0;\n}\n","import { selectorMatches } from './selectorMatches';\n\nexport function doesSomeParentMatch(\n element: HTMLElement | SVGElement,\n selectors: string[],\n) {\n let selector: string,\n parentMatching = true;\n while (\n element.parentElement &&\n element.parentElement.nodeType === 1 &&\n selectors.length\n ) {\n if (parentMatching) {\n selector = selectors.pop()!;\n }\n element = element.parentElement;\n parentMatching = selectorMatches(element, selector!);\n }\n return selectors.length === 0;\n}\n","import { selectorMatches } from './selectorMatches';\nimport { doesSomeParentMatch } from './doesSomeParentMatch';\n\n/**\n * @private\n */\n\nexport function elementMatchesRule(\n element: HTMLElement | SVGElement,\n selectors: string[],\n) {\n let parentMatching = true;\n // start from rightmost selector.\n const firstMatching = selectorMatches(element, selectors.pop()!);\n if (firstMatching && selectors.length) {\n parentMatching = doesSomeParentMatch(element, selectors);\n }\n return firstMatching && parentMatching && selectors.length === 0;\n}\n","import { elementMatchesRule } from './elementMatchesRule';\nimport type { CSSRules } from './typedefs';\n\n/**\n * @private\n */\n\nexport function getGlobalStylesForElement(\n element: HTMLElement | SVGElement,\n cssRules: CSSRules = {},\n) {\n let styles: Record = {};\n for (const rule in cssRules) {\n if (elementMatchesRule(element, rule.split(' '))) {\n styles = {\n ...styles,\n ...cssRules[rule],\n };\n }\n }\n return styles;\n}\n","import { attributesMap } from './constants';\n\nexport const normalizeAttr = (\n attr: keyof typeof attributesMap | string,\n): string => attributesMap[attr as keyof typeof attributesMap] ?? attr;\n","import { reNum } from '../../parser/constants';\n\nconst regex = new RegExp(`(${reNum})`, 'gi');\n\nexport const cleanupSvgAttribute = (attributeValue: string) =>\n attributeValue\n .replace(regex, ' $1 ')\n // replace annoying commas and arbitrary whitespace with single spaces\n .replace(/,/gi, ' ')\n .replace(/\\s+/gi, ' ');\n","import { ROTATE, SCALE, SKEW_X, SKEW_Y, iMatrix } from '../constants';\nimport { reNum } from './constants';\nimport type { TMat2D } from '../typedefs';\nimport { cleanupSvgAttribute } from '../util/internals/cleanupSvgAttribute';\nimport {\n createRotateMatrix,\n createScaleMatrix,\n createSkewXMatrix,\n createSkewYMatrix,\n createTranslateMatrix,\n multiplyTransformMatrixArray,\n} from '../util/misc/matrix';\n\n// == begin transform regexp\nconst p = `(${reNum})`;\nconst skewX = String.raw`(skewX)\\(${p}\\)`;\nconst skewY = String.raw`(skewY)\\(${p}\\)`;\nconst rotate = String.raw`(rotate)\\(${p}(?: ${p} ${p})?\\)`;\nconst scale = String.raw`(scale)\\(${p}(?: ${p})?\\)`;\nconst translate = String.raw`(translate)\\(${p}(?: ${p})?\\)`;\nconst matrix = String.raw`(matrix)\\(${p} ${p} ${p} ${p} ${p} ${p}\\)`;\nconst transform = `(?:${matrix}|${translate}|${rotate}|${scale}|${skewX}|${skewY})`;\nconst transforms = `(?:${transform}*)`;\nconst transformList = String.raw`^\\s*(?:${transforms}?)\\s*$`;\n// http://www.w3.org/TR/SVG/coords.html#TransformAttribute\nconst reTransformList = new RegExp(transformList);\nconst reTransform = new RegExp(transform);\nconst reTransformAll = new RegExp(transform, 'g');\n// == end transform regexp\n\n/**\n * Parses \"transform\" attribute, returning an array of values\n * @static\n * @function\n * @param {String} attributeValue String containing attribute value\n * @return {TTransformMatrix} Array of 6 elements representing transformation matrix\n */\nexport function parseTransformAttribute(attributeValue: string): TMat2D {\n // first we clean the string\n attributeValue = cleanupSvgAttribute(attributeValue)\n // remove spaces around front parentheses\n .replace(/\\s*([()])\\s*/gi, '$1');\n\n // start with identity matrix\n const matrices: TMat2D[] = [];\n\n // return if no argument was given or\n // an argument does not match transform attribute regexp\n if (\n !attributeValue ||\n (attributeValue && !reTransformList.test(attributeValue))\n ) {\n return [...iMatrix];\n }\n\n for (const match of attributeValue.matchAll(reTransformAll)) {\n const transformMatch = reTransform.exec(match[0]);\n if (!transformMatch) {\n continue;\n }\n let matrix: TMat2D = iMatrix;\n const matchedParams = transformMatch.filter((m) => !!m);\n const [, operation, ...rawArgs] = matchedParams;\n const [arg0, arg1, arg2, arg3, arg4, arg5] = rawArgs.map((arg) =>\n parseFloat(arg),\n );\n\n switch (operation) {\n case 'translate':\n matrix = createTranslateMatrix(arg0, arg1);\n break;\n case ROTATE:\n matrix = createRotateMatrix({ angle: arg0 }, { x: arg1, y: arg2 });\n break;\n case SCALE:\n matrix = createScaleMatrix(arg0, arg1);\n break;\n case SKEW_X:\n matrix = createSkewXMatrix(arg0);\n break;\n case SKEW_Y:\n matrix = createSkewYMatrix(arg0);\n break;\n case 'matrix':\n matrix = [arg0, arg1, arg2, arg3, arg4, arg5];\n break;\n }\n\n // snapshot current matrix into matrices array\n matrices.push(matrix);\n }\n\n return multiplyTransformMatrixArray(matrices);\n}\n","import { multiplyTransformMatrices } from '../util/misc/matrix';\nimport { parseUnit } from '../util/misc/svgParsing';\nimport { parseTransformAttribute } from './parseTransformAttribute';\nimport { CENTER, LEFT, RIGHT, NONE, FILL, STROKE } from '../constants';\nimport { TEXT_DECORATION_THICKNESS } from '../shapes/Text/constants';\n\nexport function normalizeValue(\n attr: string,\n value: any,\n parentAttributes: Record,\n fontSize: number,\n): string | null | boolean | number[] | number {\n const isArray = Array.isArray(value);\n let parsed: number | number[];\n let ouputValue: string | null | boolean | number[] | number = value;\n if ((attr === FILL || attr === STROKE) && value === NONE) {\n ouputValue = '';\n } else if (attr === 'strokeUniform') {\n return value === 'non-scaling-stroke';\n } else if (attr === 'strokeDashArray') {\n if (value === NONE) {\n ouputValue = null;\n } else {\n ouputValue = value.replace(/,/g, ' ').split(/\\s+/).map(parseFloat);\n }\n } else if (attr === 'transformMatrix') {\n if (parentAttributes && parentAttributes.transformMatrix) {\n ouputValue = multiplyTransformMatrices(\n parentAttributes.transformMatrix,\n parseTransformAttribute(value),\n );\n } else {\n ouputValue = parseTransformAttribute(value);\n }\n } else if (attr === 'visible') {\n ouputValue = value !== NONE && value !== 'hidden';\n // display=none on parent element always takes precedence over child element\n if (parentAttributes && parentAttributes.visible === false) {\n ouputValue = false;\n }\n } else if (attr === 'opacity') {\n ouputValue = parseFloat(value);\n if (parentAttributes && typeof parentAttributes.opacity !== 'undefined') {\n ouputValue *= parentAttributes.opacity as number;\n }\n } else if (attr === 'textAnchor' /* text-anchor */) {\n ouputValue = value === 'start' ? LEFT : value === 'end' ? RIGHT : CENTER;\n } else if (attr === 'charSpacing' || attr === TEXT_DECORATION_THICKNESS) {\n // parseUnit returns px and we convert it to em\n parsed = (parseUnit(value, fontSize) / fontSize) * 1000;\n } else if (attr === 'paintFirst') {\n const fillIndex = value.indexOf(FILL);\n const strokeIndex = value.indexOf(STROKE);\n ouputValue = FILL;\n if (fillIndex > -1 && strokeIndex > -1 && strokeIndex < fillIndex) {\n ouputValue = STROKE;\n } else if (fillIndex === -1 && strokeIndex > -1) {\n ouputValue = STROKE;\n }\n } else if (\n attr === 'href' ||\n attr === 'xlink:href' ||\n attr === 'font' ||\n attr === 'id'\n ) {\n return value;\n } else if (attr === 'imageSmoothing') {\n return value === 'optimizeQuality';\n } else {\n parsed = isArray\n ? (value as string[]).map(parseUnit)\n : parseUnit(value, fontSize);\n }\n\n return !isArray && isNaN(parsed! as number) ? ouputValue : parsed!;\n}\n","import { parseUnit } from '../util/misc/svgParsing';\nimport { reFontDeclaration } from './constants';\n\n/**\n * Parses a short font declaration, building adding its properties to a style object\n * @static\n * @function\n * @param {String} value font declaration\n * @param {Object} oStyle definition\n */\nexport function parseFontDeclaration(\n value: string,\n oStyle: Record,\n): void {\n const match = value.match(reFontDeclaration);\n\n if (!match) {\n return;\n }\n const fontStyle = match[1],\n // font variant is not used\n // fontVariant = match[2],\n fontWeight = match[3],\n fontSize = match[4],\n lineHeight = match[5],\n fontFamily = match[6];\n\n if (fontStyle) {\n oStyle.fontStyle = fontStyle;\n }\n if (fontWeight) {\n oStyle.fontWeight = isNaN(parseFloat(fontWeight))\n ? fontWeight\n : parseFloat(fontWeight);\n }\n if (fontSize) {\n oStyle.fontSize = parseUnit(fontSize);\n }\n if (fontFamily) {\n oStyle.fontFamily = fontFamily;\n }\n if (lineHeight) {\n oStyle.lineHeight = lineHeight === 'normal' ? 1 : lineHeight;\n }\n}\n","/**\n * Takes a style object and parses it in one that has only defined values\n * and lowercases properties\n * @param style\n * @param oStyle\n */\nexport function parseStyleObject(\n style: Record,\n oStyle: Record,\n): void {\n Object.entries(style).forEach(([prop, value]) => {\n if (value === undefined) {\n return;\n }\n oStyle[prop.toLowerCase()] = value;\n });\n}\n","/**\n * Takes a style string and parses it in one that has only defined values\n * and lowercases properties\n * @param style\n * @param oStyle\n */\nexport function parseStyleString(\n style: string,\n oStyle: Record,\n): void {\n style\n .replace(/;\\s*$/, '')\n .split(';')\n .forEach((chunk) => {\n if (!chunk) return;\n const [attr, value] = chunk.split(':');\n oStyle[attr.trim().toLowerCase()] = value.trim();\n });\n}\n","import { parseStyleObject } from './parseStyleObject';\nimport { parseStyleString } from './parseStyleString';\n\n/**\n * Parses \"style\" attribute, retuning an object with values\n * @static\n * @param {SVGElement} element Element to parse\n * @return {Object} Objects with values parsed from style attribute of an element\n */\nexport function parseStyleAttribute(\n element: HTMLElement | SVGElement,\n): Record {\n const oStyle: Record = {},\n style = element.getAttribute('style');\n\n if (!style) {\n return oStyle;\n }\n\n if (typeof style === 'string') {\n parseStyleString(style, oStyle);\n } else {\n parseStyleObject(style, oStyle);\n }\n\n return oStyle;\n}\n","import { Color } from '../color/Color';\nimport { toFixed } from '../util/misc/toFixed';\nimport { FabricObject } from '../shapes/Object/FabricObject';\n\nconst colorAttributesMap = {\n stroke: 'strokeOpacity',\n fill: 'fillOpacity',\n};\n\n/**\n * @private\n * @param {Object} attributes Array of attributes to parse\n */\n\nexport function setStrokeFillOpacity(\n attributes: Record,\n): Record {\n const defaults = FabricObject.getDefaults();\n Object.entries(colorAttributesMap).forEach(([attr, colorAttr]) => {\n if (\n typeof attributes[colorAttr] === 'undefined' ||\n attributes[attr] === ''\n ) {\n return;\n }\n if (typeof attributes[attr] === 'undefined') {\n if (!defaults[attr]) {\n return;\n }\n attributes[attr] = defaults[attr];\n }\n if (attributes[attr].indexOf('url(') === 0) {\n return;\n }\n const color = new Color(attributes[attr]);\n attributes[attr] = color\n .setAlpha(toFixed(color.getAlpha() * attributes[colorAttr], 2))\n .toRgba();\n });\n return attributes;\n}\n","import { DEFAULT_SVG_FONT_SIZE } from '../constants';\nimport { parseUnit } from '../util/misc/svgParsing';\nimport { cPath, fSize, svgValidParentsRegEx } from './constants';\nimport { getGlobalStylesForElement } from './getGlobalStylesForElement';\nimport { normalizeAttr } from './normalizeAttr';\nimport { normalizeValue } from './normalizeValue';\nimport { parseFontDeclaration } from './parseFontDeclaration';\nimport { parseStyleAttribute } from './parseStyleAttribute';\nimport { setStrokeFillOpacity } from './setStrokeFillOpacity';\nimport type { CSSRules } from './typedefs';\n\n/**\n * Returns an object of attributes' name/value, given element and an array of attribute names;\n * Parses parent \"g\" nodes recursively upwards.\n * @param {SVGElement | HTMLElement} element Element to parse\n * @param {Array} attributes Array of attributes to parse\n * @return {Object} object containing parsed attributes' names/values\n */\nexport function parseAttributes(\n element: HTMLElement | SVGElement | null,\n attributes: string[],\n cssRules?: CSSRules,\n): Record {\n if (!element) {\n return {};\n }\n\n let parentAttributes: Record = {},\n fontSize: number,\n parentFontSize = DEFAULT_SVG_FONT_SIZE;\n\n // if there's a parent container (`g` or `a` or `symbol` node), parse its attributes recursively upwards\n if (\n element.parentNode &&\n svgValidParentsRegEx.test(element.parentNode.nodeName)\n ) {\n parentAttributes = parseAttributes(\n element.parentElement,\n attributes,\n cssRules,\n );\n if (parentAttributes.fontSize) {\n fontSize = parentFontSize = parseUnit(parentAttributes.fontSize);\n }\n }\n\n const ownAttributes: Record = {\n ...attributes.reduce>((memo, attr) => {\n const value = element.getAttribute(attr);\n if (value) {\n memo[attr] = value;\n }\n return memo;\n }, {}),\n // add values parsed from style, which take precedence over attributes\n // (see: http://www.w3.org/TR/SVG/styling.html#UsingPresentationAttributes)\n ...getGlobalStylesForElement(element, cssRules),\n ...parseStyleAttribute(element),\n };\n\n if (ownAttributes[cPath]) {\n element.setAttribute(cPath, ownAttributes[cPath]);\n }\n if (ownAttributes[fSize]) {\n // looks like the minimum should be 9px when dealing with ems. this is what looks like in browsers.\n fontSize = parseUnit(ownAttributes[fSize], parentFontSize);\n ownAttributes[fSize] = `${fontSize}`;\n }\n\n // this should have its own complex type\n const normalizedStyle: Record<\n string,\n string | boolean | number | number[] | null\n > = {};\n for (const attr in ownAttributes) {\n const normalizedAttr = normalizeAttr(attr);\n const normalizedValue = normalizeValue(\n normalizedAttr,\n ownAttributes[attr],\n parentAttributes,\n fontSize!,\n );\n normalizedStyle[normalizedAttr] = normalizedValue;\n }\n if (normalizedStyle && normalizedStyle.font) {\n parseFontDeclaration(normalizedStyle.font as string, normalizedStyle);\n }\n const mergedAttrs = { ...parentAttributes, ...normalizedStyle };\n return svgValidParentsRegEx.test(element.nodeName)\n ? mergedAttrs\n : setStrokeFillOpacity(mergedAttrs);\n}\n","import { kRect } from '../constants';\nimport { SHARED_ATTRIBUTES } from '../parser/attributes';\nimport { parseAttributes } from '../parser/parseAttributes';\nimport type { Abortable, TClassProperties, TOptions } from '../typedefs';\nimport { classRegistry } from '../ClassRegistry';\nimport { FabricObject, cacheProperties } from './Object/FabricObject';\nimport type { FabricObjectProps, SerializedObjectProps } from './Object/types';\nimport type { ObjectEvents } from '../EventTypeDefs';\nimport type { CSSRules } from '../parser/typedefs';\n\nexport const rectDefaultValues: Partial> = {\n rx: 0,\n ry: 0,\n};\n\ninterface UniqueRectProps {\n rx: number;\n ry: number;\n}\n\nexport interface SerializedRectProps\n extends SerializedObjectProps,\n UniqueRectProps {}\n\nexport interface RectProps extends FabricObjectProps, UniqueRectProps {}\n\nconst RECT_PROPS = ['rx', 'ry'] as const;\n\nexport class Rect<\n Props extends TOptions = Partial,\n SProps extends SerializedRectProps = SerializedRectProps,\n EventSpec extends ObjectEvents = ObjectEvents,\n >\n extends FabricObject\n implements RectProps\n{\n /**\n * Horizontal border radius\n * @type Number\n */\n declare rx: number;\n\n /**\n * Vertical border radius\n * @type Number\n */\n declare ry: number;\n\n static type = 'Rect';\n\n static cacheProperties = [...cacheProperties, ...RECT_PROPS];\n\n static ownDefaults = rectDefaultValues;\n\n static getDefaults(): Record {\n return {\n ...super.getDefaults(),\n ...Rect.ownDefaults,\n };\n }\n\n /**\n * Constructor\n * @param {Object} [options] Options object\n */\n constructor(options?: Props) {\n super();\n Object.assign(this, Rect.ownDefaults);\n this.setOptions(options);\n this._initRxRy();\n }\n /**\n * Initializes rx/ry attributes\n * @private\n */\n _initRxRy() {\n const { rx, ry } = this;\n if (rx && !ry) {\n this.ry = rx;\n } else if (ry && !rx) {\n this.rx = ry;\n }\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _render(ctx: CanvasRenderingContext2D) {\n const { width: w, height: h } = this;\n const x = -w / 2;\n const y = -h / 2;\n const rx = this.rx ? Math.min(this.rx, w / 2) : 0;\n const ry = this.ry ? Math.min(this.ry, h / 2) : 0;\n const isRounded = rx !== 0 || ry !== 0;\n\n ctx.beginPath();\n\n ctx.moveTo(x + rx, y);\n\n ctx.lineTo(x + w - rx, y);\n isRounded &&\n ctx.bezierCurveTo(\n x + w - kRect * rx,\n y,\n x + w,\n y + kRect * ry,\n x + w,\n y + ry,\n );\n\n ctx.lineTo(x + w, y + h - ry);\n isRounded &&\n ctx.bezierCurveTo(\n x + w,\n y + h - kRect * ry,\n x + w - kRect * rx,\n y + h,\n x + w - rx,\n y + h,\n );\n\n ctx.lineTo(x + rx, y + h);\n isRounded &&\n ctx.bezierCurveTo(\n x + kRect * rx,\n y + h,\n x,\n y + h - kRect * ry,\n x,\n y + h - ry,\n );\n\n ctx.lineTo(x, y + ry);\n isRounded &&\n ctx.bezierCurveTo(x, y + kRect * ry, x + kRect * rx, y, x + rx, y);\n\n ctx.closePath();\n\n this._renderPaintInOrder(ctx);\n }\n\n /**\n * Returns object representation of an instance\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} object representation of an instance\n */\n toObject<\n T extends Omit, keyof SProps>,\n K extends keyof T = never,\n >(propertiesToInclude: K[] = []): Pick & SProps {\n return super.toObject([...RECT_PROPS, ...propertiesToInclude]);\n }\n\n /**\n * Returns svg representation of an instance\n * @return {Array} an array of strings with the specific svg representation\n * of the instance\n */\n _toSVG() {\n const { width, height, rx, ry } = this;\n return [\n '\\n`,\n ];\n }\n\n /**\n * List of attribute names to account for when parsing SVG element (used by `Rect.fromElement`)\n * @see: http://www.w3.org/TR/SVG/shapes.html#RectElement\n */\n static ATTRIBUTE_NAMES = [\n ...SHARED_ATTRIBUTES,\n 'x',\n 'y',\n 'rx',\n 'ry',\n 'width',\n 'height',\n ];\n\n /* _FROM_SVG_START_ */\n\n /**\n * Returns {@link Rect} instance from an SVG element\n * @param {HTMLElement} element Element to parse\n * @param {Object} [options] Options object\n */\n static async fromElement(\n element: HTMLElement | SVGElement,\n options?: Abortable,\n cssRules?: CSSRules,\n ) {\n const {\n left = 0,\n top = 0,\n width = 0,\n height = 0,\n visible = true,\n ...restOfparsedAttributes\n } = parseAttributes(element, this.ATTRIBUTE_NAMES, cssRules);\n\n return new this({\n ...options,\n ...restOfparsedAttributes,\n left,\n top,\n width,\n height,\n visible: Boolean(visible && width && height),\n });\n }\n\n /* _FROM_SVG_END_ */\n}\n\nclassRegistry.setClass(Rect);\nclassRegistry.setSVGClass(Rect);\n","export const LAYOUT_TYPE_INITIALIZATION = 'initialization';\nexport const LAYOUT_TYPE_ADDED = 'added';\nexport const LAYOUT_TYPE_REMOVED = 'removed';\nexport const LAYOUT_TYPE_IMPERATIVE = 'imperative';\nexport const LAYOUT_TYPE_OBJECT_MODIFIED = 'object_modified';\nexport const LAYOUT_TYPE_OBJECT_MODIFYING = 'object_modifying';\n","import { Point, ZERO } from '../../Point';\nimport type { Group } from '../../shapes/Group';\nimport type { FabricObject } from '../../shapes/Object/FabricObject';\nimport { multiplyTransformMatrixArray } from '../../util/misc/matrix';\nimport { sizeAfterTransform } from '../../util/misc/objectTransforms';\nimport {\n calcPlaneChangeMatrix,\n sendVectorToPlane,\n} from '../../util/misc/planeChange';\n\n/**\n * @returns 2 points, the tl and br corners of the non rotated bounding box of an object\n * in the {@link group} plane, taking into account objects that {@link group} is their parent\n * but also belong to the active selection.\n */\nexport const getObjectBounds = (\n destinationGroup: Group,\n object: FabricObject,\n): Point[] => {\n const {\n strokeUniform,\n strokeWidth,\n width,\n height,\n group: currentGroup,\n } = object;\n const t =\n currentGroup && currentGroup !== destinationGroup\n ? calcPlaneChangeMatrix(\n currentGroup.calcTransformMatrix(),\n destinationGroup.calcTransformMatrix(),\n )\n : null;\n const objectCenter = t\n ? object.getRelativeCenterPoint().transform(t)\n : object.getRelativeCenterPoint();\n const accountForStroke = !object['isStrokeAccountedForInDimensions']();\n const strokeUniformVector =\n strokeUniform && accountForStroke\n ? sendVectorToPlane(\n new Point(strokeWidth, strokeWidth),\n undefined,\n destinationGroup.calcTransformMatrix(),\n )\n : ZERO;\n const scalingStrokeWidth =\n !strokeUniform && accountForStroke ? strokeWidth : 0;\n const sizeVector = sizeAfterTransform(\n width + scalingStrokeWidth,\n height + scalingStrokeWidth,\n multiplyTransformMatrixArray([t, object.calcOwnMatrix()], true),\n )\n .add(strokeUniformVector)\n .scalarDivide(2);\n return [objectCenter.subtract(sizeVector), objectCenter.add(sizeVector)];\n};\n","import { Point } from '../../Point';\nimport type { FabricObject } from '../../shapes/Object/FabricObject';\nimport { makeBoundingBoxFromPoints } from '../../util/misc/boundingBoxFromPoints';\nimport {\n LAYOUT_TYPE_INITIALIZATION,\n LAYOUT_TYPE_IMPERATIVE,\n} from '../constants';\nimport type {\n InitializationLayoutContext,\n LayoutStrategyResult,\n StrictLayoutContext,\n} from '../types';\nimport { getObjectBounds } from './utils';\n\n/**\n * Exposes a main public method {@link calcLayoutResult} that is used by the `LayoutManager` to perform layout.\n * Returning `undefined` signals the `LayoutManager` to skip the layout.\n *\n * In charge of calculating the bounding box of the passed objects.\n */\nexport abstract class LayoutStrategy {\n /**\n * override by subclass for persistence (TS does not support `static abstract`)\n */\n static type = 'strategy';\n\n /**\n * Used by the `LayoutManager` to perform layout\n * @TODO/fix: if this method is calcResult, should calc unconditionally.\n * the condition to not calc should be evaluated by the layoutManager.\n * @returns layout result **OR** `undefined` to skip layout\n */\n public calcLayoutResult(\n context: StrictLayoutContext,\n objects: FabricObject[],\n ): LayoutStrategyResult | undefined {\n if (this.shouldPerformLayout(context)) {\n return this.calcBoundingBox(objects, context);\n }\n }\n\n shouldPerformLayout({ type, prevStrategy, strategy }: StrictLayoutContext) {\n return (\n type === LAYOUT_TYPE_INITIALIZATION ||\n type === LAYOUT_TYPE_IMPERATIVE ||\n (!!prevStrategy && strategy !== prevStrategy)\n );\n }\n\n shouldLayoutClipPath({ type, target: { clipPath } }: StrictLayoutContext) {\n return (\n type !== LAYOUT_TYPE_INITIALIZATION &&\n clipPath &&\n !clipPath.absolutePositioned\n );\n }\n\n getInitialSize(\n context: StrictLayoutContext & InitializationLayoutContext,\n result: Pick,\n ) {\n return result.size;\n }\n\n /**\n * Override this method to customize layout.\n */\n calcBoundingBox(\n objects: FabricObject[],\n context: StrictLayoutContext,\n ): LayoutStrategyResult | undefined {\n const { type, target } = context;\n if (type === LAYOUT_TYPE_IMPERATIVE && context.overrides) {\n return context.overrides;\n }\n if (objects.length === 0) {\n return;\n }\n const { left, top, width, height } = makeBoundingBoxFromPoints(\n objects\n .map((object) => getObjectBounds(target, object))\n .reduce((coords, curr) => coords.concat(curr), []),\n );\n const bboxSize = new Point(width, height);\n const bboxLeftTop = new Point(left, top);\n const bboxCenter = bboxLeftTop.add(bboxSize.scalarDivide(2));\n\n if (type === LAYOUT_TYPE_INITIALIZATION) {\n const actualSize = this.getInitialSize(context, {\n size: bboxSize,\n center: bboxCenter,\n });\n return {\n // in `initialization` we do not account for target's transformation matrix\n center: bboxCenter,\n // TODO: investigate if this is still necessary\n relativeCorrection: new Point(0, 0),\n size: actualSize,\n };\n } else {\n // we send `relativeCenter` up to group's containing plane\n const center = bboxCenter.transform(target.calcOwnMatrix());\n return {\n center,\n size: bboxSize,\n };\n }\n }\n}\n","import type { StrictLayoutContext } from '../types';\nimport { LayoutStrategy } from './LayoutStrategy';\nimport { classRegistry } from '../../ClassRegistry';\n\n/**\n * Layout will adjust the bounding box to fit target's objects.\n */\nexport class FitContentLayout extends LayoutStrategy {\n static readonly type = 'fit-content';\n\n /**\n * @override layout on all triggers\n * Override at will\n */\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n shouldPerformLayout(context: StrictLayoutContext) {\n return true;\n }\n}\n\nclassRegistry.setClass(FitContentLayout);\n","import { Point } from '../Point';\nimport {\n CENTER,\n CHANGED,\n MODIFIED,\n MODIFY_PATH,\n MODIFY_POLY,\n MOVING,\n RESIZING,\n ROTATING,\n SCALING,\n SKEWING,\n iMatrix,\n} from '../constants';\nimport type { Group } from '../shapes/Group';\nimport type { FabricObject } from '../shapes/Object/FabricObject';\nimport { invertTransform } from '../util/misc/matrix';\nimport { resolveOrigin } from '../util/misc/resolveOrigin';\nimport { FitContentLayout } from './LayoutStrategies/FitContentLayout';\nimport type { LayoutStrategy } from './LayoutStrategies/LayoutStrategy';\nimport {\n LAYOUT_TYPE_INITIALIZATION,\n LAYOUT_TYPE_ADDED,\n LAYOUT_TYPE_REMOVED,\n LAYOUT_TYPE_IMPERATIVE,\n LAYOUT_TYPE_OBJECT_MODIFIED,\n LAYOUT_TYPE_OBJECT_MODIFYING,\n} from './constants';\nimport type {\n LayoutContext,\n LayoutResult,\n RegistrationContext,\n StrictLayoutContext,\n} from './types';\nimport { classRegistry } from '../ClassRegistry';\nimport type { TModificationEvents } from '../EventTypeDefs';\n\nconst LAYOUT_MANAGER = 'layoutManager';\n\nexport type SerializedLayoutManager = {\n type: string;\n strategy: string;\n};\n\nexport class LayoutManager {\n declare private _prevLayoutStrategy?: LayoutStrategy;\n declare protected _subscriptions: Map;\n\n strategy: LayoutStrategy;\n\n constructor(strategy: LayoutStrategy = new FitContentLayout()) {\n this.strategy = strategy;\n this._subscriptions = new Map();\n }\n\n public performLayout(context: LayoutContext) {\n const strictContext: StrictLayoutContext = {\n bubbles: true,\n strategy: this.strategy,\n ...context,\n prevStrategy: this._prevLayoutStrategy,\n stopPropagation() {\n this.bubbles = false;\n },\n };\n\n this.onBeforeLayout(strictContext);\n\n const layoutResult = this.getLayoutResult(strictContext);\n if (layoutResult) {\n this.commitLayout(strictContext, layoutResult);\n }\n\n this.onAfterLayout(strictContext, layoutResult);\n this._prevLayoutStrategy = strictContext.strategy;\n }\n\n /**\n * Attach handlers for events that we know will invalidate the layout when\n * performed on child objects ( general transforms ).\n * Returns the disposers for later unsubscribing and cleanup\n * @param {FabricObject} object\n * @param {RegistrationContext & Partial} context\n * @returns {VoidFunction[]} disposers remove the handlers\n */\n protected attachHandlers(\n object: FabricObject,\n context: RegistrationContext & Partial,\n ): VoidFunction[] {\n const { target } = context;\n return (\n [\n MODIFIED,\n MOVING,\n RESIZING,\n ROTATING,\n SCALING,\n SKEWING,\n CHANGED,\n MODIFY_POLY,\n MODIFY_PATH,\n ] as (TModificationEvents & 'modified')[]\n ).map((key) =>\n object.on(key, (e) =>\n this.performLayout(\n key === MODIFIED\n ? {\n type: LAYOUT_TYPE_OBJECT_MODIFIED,\n trigger: key,\n e,\n target,\n }\n : {\n type: LAYOUT_TYPE_OBJECT_MODIFYING,\n trigger: key,\n e,\n target,\n },\n ),\n ),\n );\n }\n\n /**\n * Subscribe an object to transform events that will trigger a layout change on the parent\n * This is important only for interactive groups.\n * @param object\n * @param context\n */\n protected subscribe(\n object: FabricObject,\n context: RegistrationContext & Partial,\n ) {\n this.unsubscribe(object, context);\n const disposers = this.attachHandlers(object, context);\n this._subscriptions.set(object, disposers);\n }\n\n /**\n * unsubscribe object layout triggers\n */\n protected unsubscribe(\n object: FabricObject,\n _context?: RegistrationContext & Partial,\n ) {\n (this._subscriptions.get(object) || []).forEach((d) => d());\n this._subscriptions.delete(object);\n }\n\n unsubscribeTargets(\n context: RegistrationContext & Partial,\n ) {\n context.targets.forEach((object) => this.unsubscribe(object, context));\n }\n\n subscribeTargets(\n context: RegistrationContext & Partial,\n ) {\n context.targets.forEach((object) => this.subscribe(object, context));\n }\n\n protected onBeforeLayout(context: StrictLayoutContext) {\n const { target, type } = context;\n const { canvas } = target;\n // handle layout triggers subscription\n // @TODO: gate the registration when the group is interactive\n if (type === LAYOUT_TYPE_INITIALIZATION || type === LAYOUT_TYPE_ADDED) {\n this.subscribeTargets(context);\n } else if (type === LAYOUT_TYPE_REMOVED) {\n this.unsubscribeTargets(context);\n }\n // fire layout event (event will fire only for layouts after initialization layout)\n target.fire('layout:before', {\n context,\n });\n canvas &&\n canvas.fire('object:layout:before', {\n target,\n context,\n });\n\n if (type === LAYOUT_TYPE_IMPERATIVE && context.deep) {\n const { strategy: _, ...tricklingContext } = context;\n // traverse the tree\n target.forEachObject(\n (object) =>\n (object as Group).layoutManager &&\n (object as Group).layoutManager.performLayout({\n ...tricklingContext,\n bubbles: false,\n target: object as Group,\n }),\n );\n }\n }\n\n protected getLayoutResult(\n context: StrictLayoutContext,\n ): Required | undefined {\n const { target, strategy, type } = context;\n\n const result = strategy.calcLayoutResult(context, target.getObjects());\n\n if (!result) {\n return;\n }\n\n const prevCenter =\n type === LAYOUT_TYPE_INITIALIZATION\n ? new Point()\n : target.getRelativeCenterPoint();\n\n const {\n center: nextCenter,\n correction = new Point(),\n relativeCorrection = new Point(),\n } = result;\n const offset = prevCenter\n .subtract(nextCenter)\n .add(correction)\n .transform(\n // in `initialization` we do not account for target's transformation matrix\n type === LAYOUT_TYPE_INITIALIZATION\n ? iMatrix\n : invertTransform(target.calcOwnMatrix()),\n true,\n )\n .add(relativeCorrection);\n\n return {\n result,\n prevCenter,\n nextCenter,\n offset,\n };\n }\n\n protected commitLayout(\n context: StrictLayoutContext,\n layoutResult: Required,\n ) {\n const { target } = context;\n const {\n result: { size },\n nextCenter,\n } = layoutResult;\n // set dimensions\n target.set({ width: size.x, height: size.y });\n // layout descendants\n this.layoutObjects(context, layoutResult);\n // set position\n // in `initialization` we do not account for target's transformation matrix\n if (context.type === LAYOUT_TYPE_INITIALIZATION) {\n // TODO: what about strokeWidth?\n target.set({\n left:\n context.x ?? nextCenter.x + size.x * resolveOrigin(target.originX),\n top: context.y ?? nextCenter.y + size.y * resolveOrigin(target.originY),\n });\n } else {\n target.setPositionByOrigin(nextCenter, CENTER, CENTER);\n // invalidate\n target.setCoords();\n target.set('dirty', true);\n }\n }\n\n protected layoutObjects(\n context: StrictLayoutContext,\n layoutResult: Required,\n ) {\n const { target } = context;\n // adjust objects to account for new center\n target.forEachObject((object) => {\n object.group === target &&\n this.layoutObject(context, layoutResult, object);\n });\n // adjust clip path to account for new center\n context.strategy.shouldLayoutClipPath(context) &&\n this.layoutObject(context, layoutResult, target.clipPath as FabricObject);\n }\n\n /**\n * @param {FabricObject} object\n * @param {Point} offset\n */\n protected layoutObject(\n context: StrictLayoutContext,\n { offset }: Required,\n object: FabricObject,\n ) {\n // TODO: this is here for cache invalidation.\n // verify if this is necessary since we have explicit\n // cache invalidation at the end of commitLayout\n object.set({\n left: object.left + offset.x,\n top: object.top + offset.y,\n });\n }\n\n protected onAfterLayout(\n context: StrictLayoutContext,\n layoutResult?: LayoutResult,\n ) {\n const {\n target,\n strategy,\n bubbles,\n prevStrategy: _,\n ...bubblingContext\n } = context;\n const { canvas } = target;\n\n // fire layout event (event will fire only for layouts after initialization layout)\n target.fire('layout:after', {\n context,\n result: layoutResult,\n });\n canvas &&\n canvas.fire('object:layout:after', {\n context,\n result: layoutResult,\n target,\n });\n\n // bubble\n const parent = target.parent;\n if (bubbles && parent?.layoutManager) {\n // add target to context#path\n (bubblingContext.path || (bubblingContext.path = [])).push(target);\n // all parents should invalidate their layout\n parent.layoutManager.performLayout({\n ...bubblingContext,\n target: parent,\n });\n }\n target.set('dirty', true);\n }\n\n dispose() {\n const { _subscriptions } = this;\n _subscriptions.forEach((disposers) => disposers.forEach((d) => d()));\n _subscriptions.clear();\n }\n\n toObject() {\n return {\n type: LAYOUT_MANAGER,\n strategy: (this.strategy.constructor as typeof LayoutStrategy).type,\n };\n }\n\n toJSON() {\n return this.toObject();\n }\n}\n\nclassRegistry.setClass(LayoutManager, LAYOUT_MANAGER);\n","import type { CollectionEvents, ObjectEvents } from '../EventTypeDefs';\nimport { createCollectionMixin } from '../Collection';\nimport type {\n TClassProperties,\n TSVGReviver,\n TOptions,\n Abortable,\n} from '../typedefs';\nimport {\n invertTransform,\n multiplyTransformMatrices,\n} from '../util/misc/matrix';\nimport {\n enlivenObjectEnlivables,\n enlivenObjects,\n} from '../util/misc/objectEnlive';\nimport { applyTransformToObject } from '../util/misc/objectTransforms';\nimport { FabricObject } from './Object/FabricObject';\nimport { Rect } from './Rect';\nimport { classRegistry } from '../ClassRegistry';\nimport type { FabricObjectProps, SerializedObjectProps } from './Object/types';\nimport { log } from '../util/internals/console';\nimport type {\n ImperativeLayoutOptions,\n LayoutBeforeEvent,\n LayoutAfterEvent,\n} from '../LayoutManager/types';\nimport { LayoutManager } from '../LayoutManager/LayoutManager';\nimport {\n LAYOUT_TYPE_ADDED,\n LAYOUT_TYPE_IMPERATIVE,\n LAYOUT_TYPE_INITIALIZATION,\n LAYOUT_TYPE_REMOVED,\n} from '../LayoutManager/constants';\nimport type { SerializedLayoutManager } from '../LayoutManager/LayoutManager';\nimport type { FitContentLayout } from '../LayoutManager';\nimport type { DrawContext } from './Object/Object';\n\n/**\n * This class handles the specific case of creating a group using {@link Group#fromObject} and is not meant to be used in any other case.\n * We could have used a boolean in the constructor, as we did previously, but we think the boolean\n * would stay in the group's constructor interface and create confusion, therefore it was removed.\n * This layout manager doesn't do anything and therefore keeps the exact layout the group had when {@link Group#toObject} was called.\n */\nclass NoopLayoutManager extends LayoutManager {\n performLayout() {}\n}\n\nexport interface GroupEvents extends ObjectEvents, CollectionEvents {\n 'layout:before': LayoutBeforeEvent;\n 'layout:after': LayoutAfterEvent;\n}\n\nexport interface GroupOwnProps {\n subTargetCheck: boolean;\n interactive: boolean;\n}\n\nexport interface SerializedGroupProps\n extends SerializedObjectProps,\n GroupOwnProps {\n objects: SerializedObjectProps[];\n layoutManager: SerializedLayoutManager;\n}\n\nexport interface GroupProps extends FabricObjectProps, GroupOwnProps {\n layoutManager: LayoutManager;\n}\n\nexport const groupDefaultValues: Partial> = {\n strokeWidth: 0,\n subTargetCheck: false,\n interactive: false,\n};\n\n/**\n * @fires object:added\n * @fires object:removed\n * @fires layout:before\n * @fires layout:after\n */\nexport class Group\n extends createCollectionMixin(\n FabricObject,\n )\n implements GroupProps\n{\n /**\n * Used to optimize performance\n * set to `false` if you don't need contained objects to be targets of events\n * @type boolean\n */\n declare subTargetCheck: boolean;\n\n /**\n * Used to allow targeting of object inside groups.\n * set to true if you want to select an object inside a group.\\\n * **REQUIRES** `subTargetCheck` set to true\n * This will be not removed but slowly replaced with a method setInteractive\n * that will take care of enabling subTargetCheck and necessary object events.\n * There is too much attached to group interactivity to just be evaluated by a\n * boolean in the code\n * @deprecated\n * @type boolean\n */\n declare interactive: boolean;\n\n declare layoutManager: LayoutManager;\n\n /**\n * Used internally to optimize performance\n * Once an object is selected, instance is rendered without the selected object.\n * This way instance is cached only once for the entire interaction with the selected object.\n * @private\n */\n protected _activeObjects: FabricObject[] = [];\n\n static type = 'Group';\n\n static ownDefaults: Record = groupDefaultValues;\n private __objectSelectionTracker: (ev: ObjectEvents['selected']) => void;\n private __objectSelectionDisposer: (ev: ObjectEvents['deselected']) => void;\n\n static getDefaults(): Record {\n return {\n ...super.getDefaults(),\n ...Group.ownDefaults,\n };\n }\n\n /**\n * Constructor\n *\n * @param {FabricObject[]} [objects] instance objects\n * @param {Object} [options] Options object\n */\n constructor(objects: FabricObject[] = [], options: Partial = {}) {\n super();\n Object.assign(this, Group.ownDefaults);\n this.setOptions(options);\n this.groupInit(objects, options);\n }\n\n /**\n * Shared code between group and active selection\n * Meant to be used by the constructor.\n */\n protected groupInit(\n objects: FabricObject[],\n options: {\n layoutManager?: LayoutManager;\n top?: number;\n left?: number;\n },\n ) {\n this._objects = [...objects]; // Avoid unwanted mutations of Collection to affect the caller\n\n this.__objectSelectionTracker = this.__objectSelectionMonitor.bind(\n this,\n true,\n );\n this.__objectSelectionDisposer = this.__objectSelectionMonitor.bind(\n this,\n false,\n );\n\n this.forEachObject((object) => {\n this.enterGroup(object, false);\n });\n\n // perform initial layout\n this.layoutManager = options.layoutManager ?? new LayoutManager();\n this.layoutManager.performLayout({\n type: LAYOUT_TYPE_INITIALIZATION,\n target: this,\n targets: [...objects],\n // @TODO remove this concept from the layout manager.\n // Layout manager will calculate the correct position,\n // group options can override it later.\n x: options.left,\n y: options.top,\n });\n }\n\n /**\n * Checks if object can enter group and logs relevant warnings\n * @private\n * @param {FabricObject} object\n * @returns\n */\n canEnterGroup(object: FabricObject) {\n if (object === this || this.isDescendantOf(object)) {\n // prevent circular object tree\n log(\n 'error',\n 'Group: circular object trees are not supported, this call has no effect',\n );\n return false;\n } else if (this._objects.indexOf(object) !== -1) {\n // is already in the objects array\n log(\n 'error',\n 'Group: duplicate objects are not supported inside group, this call has no effect',\n );\n return false;\n }\n return true;\n }\n\n /**\n * Override this method to enhance performance (for groups with a lot of objects).\n * If Overriding, be sure not pass illegal objects to group - it will break your app.\n * @private\n */\n protected _filterObjectsBeforeEnteringGroup(objects: FabricObject[]) {\n return objects.filter((object, index, array) => {\n // can enter AND is the first occurrence of the object in the passed args (to prevent adding duplicates)\n return this.canEnterGroup(object) && array.indexOf(object) === index;\n });\n }\n\n /**\n * Add objects\n * @param {...FabricObject[]} objects\n */\n add(...objects: FabricObject[]) {\n const allowedObjects = this._filterObjectsBeforeEnteringGroup(objects);\n const size = super.add(...allowedObjects);\n this._onAfterObjectsChange(LAYOUT_TYPE_ADDED, allowedObjects);\n return size;\n }\n\n /**\n * Inserts an object into collection at specified index\n * @param {FabricObject[]} objects Object to insert\n * @param {Number} index Index to insert object at\n */\n insertAt(index: number, ...objects: FabricObject[]) {\n const allowedObjects = this._filterObjectsBeforeEnteringGroup(objects);\n const size = super.insertAt(index, ...allowedObjects);\n this._onAfterObjectsChange(LAYOUT_TYPE_ADDED, allowedObjects);\n return size;\n }\n\n /**\n * Remove objects\n * @param {...FabricObject[]} objects\n * @returns {FabricObject[]} removed objects\n */\n remove(...objects: FabricObject[]) {\n const removed = super.remove(...objects);\n this._onAfterObjectsChange(LAYOUT_TYPE_REMOVED, removed);\n return removed;\n }\n\n _onObjectAdded(object: FabricObject) {\n this.enterGroup(object, true);\n this.fire('object:added', { target: object });\n object.fire('added', { target: this });\n }\n\n /**\n * @private\n * @param {FabricObject} object\n * @param {boolean} [removeParentTransform] true if object should exit group without applying group's transform to it\n */\n _onObjectRemoved(object: FabricObject, removeParentTransform?: boolean) {\n this.exitGroup(object, removeParentTransform);\n this.fire('object:removed', { target: object });\n object.fire('removed', { target: this });\n }\n\n /**\n * @private\n * @param {'added'|'removed'} type\n * @param {FabricObject[]} targets\n */\n _onAfterObjectsChange(type: 'added' | 'removed', targets: FabricObject[]) {\n this.layoutManager.performLayout({\n type,\n targets,\n target: this,\n });\n }\n\n _onStackOrderChanged() {\n this._set('dirty', true);\n }\n\n /**\n * @private\n * @param {string} key\n * @param {*} value\n */\n _set(key: string, value: any) {\n const prev = this[key as keyof this];\n super._set(key, value);\n if (key === 'canvas' && prev !== value) {\n (this._objects || []).forEach((object) => {\n object._set(key, value);\n });\n }\n return this;\n }\n\n /**\n * @private\n */\n _shouldSetNestedCoords() {\n return this.subTargetCheck;\n }\n\n /**\n * Remove all objects\n * @returns {FabricObject[]} removed objects\n */\n removeAll() {\n this._activeObjects = [];\n return this.remove(...this._objects);\n }\n\n /**\n * keeps track of the selected objects\n * @private\n */\n __objectSelectionMonitor(\n selected: T,\n {\n target: object,\n }: ObjectEvents[T extends true ? 'selected' : 'deselected'],\n ) {\n const activeObjects = this._activeObjects;\n if (selected) {\n activeObjects.push(object);\n this._set('dirty', true);\n } else if (activeObjects.length > 0) {\n const index = activeObjects.indexOf(object);\n if (index > -1) {\n activeObjects.splice(index, 1);\n this._set('dirty', true);\n }\n }\n }\n\n /**\n * @private\n * @param {boolean} watch\n * @param {FabricObject} object\n */\n _watchObject(watch: boolean, object: FabricObject) {\n // make sure we listen only once\n watch && this._watchObject(false, object);\n if (watch) {\n object.on('selected', this.__objectSelectionTracker);\n object.on('deselected', this.__objectSelectionDisposer);\n } else {\n object.off('selected', this.__objectSelectionTracker);\n object.off('deselected', this.__objectSelectionDisposer);\n }\n }\n\n /**\n * @private\n * @param {FabricObject} object\n * @param {boolean} [removeParentTransform] true if object is in canvas coordinate plane\n */\n enterGroup(object: FabricObject, removeParentTransform?: boolean) {\n object.group && object.group.remove(object);\n object._set('parent', this);\n this._enterGroup(object, removeParentTransform);\n }\n\n /**\n * @private\n * @param {FabricObject} object\n * @param {boolean} [removeParentTransform] true if object is in canvas coordinate plane\n */\n _enterGroup(object: FabricObject, removeParentTransform?: boolean) {\n if (removeParentTransform) {\n // can this be converted to utils (sendObjectToPlane)?\n applyTransformToObject(\n object,\n multiplyTransformMatrices(\n invertTransform(this.calcTransformMatrix()),\n object.calcTransformMatrix(),\n ),\n );\n }\n this._shouldSetNestedCoords() && object.setCoords();\n object._set('group', this);\n object._set('canvas', this.canvas);\n this._watchObject(true, object);\n const activeObject =\n this.canvas &&\n this.canvas.getActiveObject &&\n this.canvas.getActiveObject();\n // if we are adding the activeObject in a group\n if (\n activeObject &&\n (activeObject === object || object.isDescendantOf(activeObject))\n ) {\n this._activeObjects.push(object);\n }\n }\n\n /**\n * @private\n * @param {FabricObject} object\n * @param {boolean} [removeParentTransform] true if object should exit group without applying group's transform to it\n */\n exitGroup(object: FabricObject, removeParentTransform?: boolean) {\n this._exitGroup(object, removeParentTransform);\n object._set('parent', undefined);\n object._set('canvas', undefined);\n }\n\n /**\n * Executes the inner fabric logic of exiting a group.\n * - Stop watching the object\n * - Remove the object from the optimization map this._activeObjects\n * - unset the group property of the object\n * @protected\n * @param {FabricObject} object\n * @param {boolean} [removeParentTransform] true if object should exit group without applying group's transform to it\n */\n _exitGroup(object: FabricObject, removeParentTransform?: boolean) {\n object._set('group', undefined);\n if (!removeParentTransform) {\n applyTransformToObject(\n object,\n multiplyTransformMatrices(\n this.calcTransformMatrix(),\n object.calcTransformMatrix(),\n ),\n );\n object.setCoords();\n }\n this._watchObject(false, object);\n const index =\n this._activeObjects.length > 0 ? this._activeObjects.indexOf(object) : -1;\n if (index > -1) {\n this._activeObjects.splice(index, 1);\n }\n }\n\n /**\n * Decide if the group should cache or not. Create its own cache level\n * needsItsOwnCache should be used when the object drawing method requires\n * a cache step.\n * Generally you do not cache objects in groups because the group is already cached.\n * @return {Boolean}\n */\n shouldCache() {\n const ownCache = FabricObject.prototype.shouldCache.call(this);\n if (ownCache) {\n for (let i = 0; i < this._objects.length; i++) {\n if (this._objects[i].willDrawShadow()) {\n this.ownCaching = false;\n return false;\n }\n }\n }\n return ownCache;\n }\n\n /**\n * Check if this object or a child object will cast a shadow\n * @return {Boolean}\n */\n willDrawShadow() {\n if (super.willDrawShadow()) {\n return true;\n }\n for (let i = 0; i < this._objects.length; i++) {\n if (this._objects[i].willDrawShadow()) {\n return true;\n }\n }\n return false;\n }\n\n /**\n * Check if instance or its group are caching, recursively up\n * @return {Boolean}\n */\n isOnACache(): boolean {\n return this.ownCaching || (!!this.parent && this.parent.isOnACache());\n }\n\n /**\n * Execute the drawing operation for an object on a specified context\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n drawObject(\n ctx: CanvasRenderingContext2D,\n forClipping: boolean | undefined,\n context: DrawContext,\n ) {\n this._renderBackground(ctx);\n for (let i = 0; i < this._objects.length; i++) {\n const obj = this._objects[i];\n // TODO: handle rendering edge case somehow\n if (this.canvas?.preserveObjectStacking && obj.group !== this) {\n ctx.save();\n ctx.transform(...invertTransform(this.calcTransformMatrix()));\n obj.render(ctx);\n ctx.restore();\n } else if (obj.group === this) {\n obj.render(ctx);\n }\n }\n this._drawClipPath(ctx, this.clipPath, context);\n }\n\n /**\n * @override\n * @return {Boolean}\n */\n setCoords() {\n super.setCoords();\n this._shouldSetNestedCoords() &&\n this.forEachObject((object) => object.setCoords());\n }\n\n triggerLayout(options: ImperativeLayoutOptions = {}) {\n this.layoutManager.performLayout({\n target: this,\n type: LAYOUT_TYPE_IMPERATIVE,\n ...options,\n });\n }\n\n /**\n * Renders instance on a given context\n * @param {CanvasRenderingContext2D} ctx context to render instance on\n */\n render(ctx: CanvasRenderingContext2D) {\n this._transformDone = true;\n super.render(ctx);\n this._transformDone = false;\n }\n\n /**\n *\n * @private\n * @param {'toObject'|'toDatalessObject'} [method]\n * @param {string[]} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @returns {FabricObject[]} serialized objects\n */\n __serializeObjects(\n method: 'toObject' | 'toDatalessObject',\n propertiesToInclude?: string[],\n ) {\n const _includeDefaultValues = this.includeDefaultValues;\n return this._objects\n .filter(function (obj) {\n return !obj.excludeFromExport;\n })\n .map(function (obj) {\n const originalDefaults = obj.includeDefaultValues;\n obj.includeDefaultValues = _includeDefaultValues;\n const data = obj[method || 'toObject'](propertiesToInclude);\n obj.includeDefaultValues = originalDefaults;\n // delete data.version;\n return data;\n });\n }\n\n /**\n * Returns object representation of an instance\n * @param {string[]} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} object representation of an instance\n */\n toObject<\n T extends Omit<\n GroupProps & TClassProperties,\n keyof SerializedGroupProps\n >,\n K extends keyof T = never,\n >(propertiesToInclude: K[] = []): Pick & SerializedGroupProps {\n const layoutManager = this.layoutManager.toObject();\n\n return {\n ...super.toObject([\n 'subTargetCheck',\n 'interactive',\n ...propertiesToInclude,\n ]),\n ...(layoutManager.strategy !== 'fit-content' || this.includeDefaultValues\n ? { layoutManager }\n : {}),\n objects: this.__serializeObjects(\n 'toObject',\n propertiesToInclude as string[],\n ),\n };\n }\n\n toString() {\n return `#`;\n }\n\n dispose() {\n this.layoutManager.unsubscribeTargets({\n targets: this.getObjects(),\n target: this,\n });\n this._activeObjects = [];\n this.forEachObject((object) => {\n this._watchObject(false, object);\n object.dispose();\n });\n super.dispose();\n }\n\n /**\n * @private\n */\n _createSVGBgRect(reviver?: TSVGReviver) {\n if (!this.backgroundColor) {\n return '';\n }\n const fillStroke = Rect.prototype._toSVG.call(this);\n const commons = fillStroke.indexOf('COMMON_PARTS');\n fillStroke[commons] = 'for=\"group\" ';\n const markup = fillStroke.join('');\n return reviver ? reviver(markup) : markup;\n }\n\n /**\n * Returns svg representation of an instance\n * @param {TSVGReviver} [reviver] Method for further parsing of svg representation.\n * @return {String} svg representation of an instance\n */\n _toSVG(reviver?: TSVGReviver) {\n const svgString = ['\\n'];\n const bg = this._createSVGBgRect(reviver);\n bg && svgString.push('\\t\\t', bg);\n for (let i = 0; i < this._objects.length; i++) {\n svgString.push('\\t\\t', this._objects[i].toSVG(reviver));\n }\n svgString.push('\\n');\n return svgString;\n }\n\n /**\n * Returns styles-string for svg-export, specific version for group\n * @return {String}\n */\n getSvgStyles(): string {\n const opacity =\n typeof this.opacity !== 'undefined' && this.opacity !== 1\n ? `opacity: ${this.opacity};`\n : '',\n visibility = this.visible ? '' : ' visibility: hidden;';\n return [opacity, this.getSvgFilter(), visibility].join('');\n }\n\n /**\n * Returns svg clipPath representation of an instance\n * @param {Function} [reviver] Method for further parsing of svg representation.\n * @return {String} svg representation of an instance\n */\n toClipPathSVG(reviver?: TSVGReviver): string {\n const svgString = [];\n const bg = this._createSVGBgRect(reviver);\n bg && svgString.push('\\t', bg);\n for (let i = 0; i < this._objects.length; i++) {\n svgString.push('\\t', this._objects[i].toClipPathSVG(reviver));\n }\n return this._createBaseClipPathSVGMarkup(svgString, {\n reviver,\n });\n }\n\n /**\n * @todo support loading from svg\n * @private\n * @param {Object} object Object to create a group from\n * @returns {Promise}\n */\n static fromObject>(\n { type, objects = [], layoutManager, ...options }: T,\n abortable?: Abortable,\n ) {\n return Promise.all([\n enlivenObjects(objects, abortable),\n enlivenObjectEnlivables(options, abortable),\n ]).then(([objects, hydratedOptions]) => {\n const group = new this(objects, {\n ...options,\n ...hydratedOptions,\n layoutManager: new NoopLayoutManager(),\n });\n if (layoutManager) {\n const layoutClass = classRegistry.getClass(\n layoutManager.type,\n );\n const strategyClass = classRegistry.getClass(\n layoutManager.strategy,\n );\n group.layoutManager = new layoutClass(new strategyClass());\n } else {\n group.layoutManager = new LayoutManager();\n }\n group.layoutManager.subscribeTargets({\n type: LAYOUT_TYPE_INITIALIZATION,\n target: group,\n targets: group.getObjects(),\n });\n group.setCoords();\n return group;\n });\n }\n}\n\nclassRegistry.setClass(Group);\n","import type { GroupProps } from '../../shapes/Group';\nimport { Group } from '../../shapes/Group';\nimport type { FabricObject } from '../../shapes/Object/FabricObject';\n\n/**\n * TODO experiment with different layout manager and svg results ( fixed fit content )\n * Groups SVG elements (usually those retrieved from SVG document)\n * @static\n * @param {FabricObject[]} elements FabricObject(s) parsed from svg, to group\n * @return {FabricObject | Group}\n */\nexport const groupSVGElements = (\n elements: FabricObject[],\n options?: Partial,\n) => {\n if (elements && elements.length === 1) {\n return elements[0];\n }\n return new Group(elements, options);\n};\n","import type { TSize } from '../../typedefs';\n\n/**\n * Finds the scale for the object source to fit inside the object destination,\n * keeping aspect ratio intact.\n * respect the total allowed area for the cache.\n * @param {TSize} source natural unscaled size of the object\n * @param {TSize} destination natural unscaled size of the object\n * @return {Number} scale factor to apply to source to fit into destination\n */\nexport const findScaleToFit = (source: TSize, destination: TSize) =>\n Math.min(\n destination.width / source.width,\n destination.height / source.height,\n );\n\n/**\n * Finds the scale for the object source to cover entirely the object destination,\n * keeping aspect ratio intact.\n * respect the total allowed area for the cache.\n * @param {TSize} source natural unscaled size of the object\n * @param {TSize} destination natural unscaled size of the object\n * @return {Number} scale factor to apply to source to cover destination\n */\nexport const findScaleToCover = (source: TSize, destination: TSize) =>\n Math.max(\n destination.width / source.width,\n destination.height / source.height,\n );\n","import { reNum } from '../../parser/constants';\n\nconst commaWsp = `\\\\s*,?\\\\s*`;\n\n/**\n * p for param\n * using \"bad naming\" here because it makes the regex much easier to read\n * p is a number that is preceded by an arbitary number of spaces, maybe 0,\n * a comma or not, and then possibly more spaces or not.\n */\nconst p = `${commaWsp}(${reNum})`;\n\n// const reMoveToCommand = `(M) ?(?:${p}${p} ?)+`;\n\n// const reLineCommand = `(L) ?(?:${p}${p} ?)+`;\n\n// const reHorizontalLineCommand = `(H) ?(?:${p} ?)+`;\n\n// const reVerticalLineCommand = `(V) ?(?:${p} ?)+`;\n\n// const reClosePathCommand = String.raw`(Z)\\s*`;\n\n// const reCubicCurveCommand = `(C) ?(?:${p}${p}${p}${p}${p}${p} ?)+`;\n\n// const reCubicCurveShortcutCommand = `(S) ?(?:${p}${p}${p}${p} ?)+`;\n\n// const reQuadraticCurveCommand = `(Q) ?(?:${p}${p}${p}${p} ?)+`;\n\n// const reQuadraticCurveShortcutCommand = `(T) ?(?:${p}${p} ?)+`;\n\nexport const reArcCommandPoints = `${p}${p}${p}${commaWsp}([01])${commaWsp}([01])${p}${p}`;\n// const reArcCommand = `(A) ?(?:${reArcCommandPoints} ?)+`;\n\n// export const rePathCommandGroups =\n// `(?:(?:${reMoveToCommand})` +\n// `|(?:${reLineCommand})` +\n// `|(?:${reHorizontalLineCommand})` +\n// `|(?:${reVerticalLineCommand})` +\n// `|(?:${reClosePathCommand})` +\n// `|(?:${reCubicCurveCommand})` +\n// `|(?:${reCubicCurveShortcutCommand})` +\n// `|(?:${reQuadraticCurveCommand})` +\n// `|(?:${reQuadraticCurveShortcutCommand})` +\n// `|(?:${reArcCommand}))`;\n\nexport const rePathCommand = '[mzlhvcsqta][^mzlhvcsqta]*';\n","import { cache } from '../../cache';\nimport { config } from '../../config';\nimport { halfPI, PiBy180 } from '../../constants';\nimport type { TMat2D, TRadian, TRectBounds } from '../../typedefs';\nimport { cos } from '../misc/cos';\nimport { multiplyTransformMatrices, transformPoint } from '../misc/matrix';\nimport { sin } from '../misc/sin';\nimport { toFixed } from '../misc/toFixed';\nimport type {\n TCurveInfo,\n TComplexPathData,\n TParsedAbsoluteCubicCurveCommand,\n TPathSegmentInfo,\n TPointAngle,\n TSimpleParsedCommand,\n TSimplePathData,\n TPathSegmentCommandInfo,\n TComplexParsedCommand,\n TPathSegmentInfoCommon,\n TEndPathInfo,\n TParsedArcCommand,\n TComplexParsedCommandType,\n} from './typedefs';\nimport type { XY } from '../../Point';\nimport { Point } from '../../Point';\nimport { reArcCommandPoints, rePathCommand } from './regex';\nimport { reNum } from '../../parser/constants';\n\n/**\n * Commands that may be repeated\n */\nconst repeatedCommands: Record = {\n m: 'l',\n M: 'L',\n};\n\n/**\n * Convert an arc of a rotated ellipse to a Bezier Curve\n * @param {TRadian} theta1 start of the arc\n * @param {TRadian} theta2 end of the arc\n * @param cosTh cosine of the angle of rotation\n * @param sinTh sine of the angle of rotation\n * @param rx x-axis radius (before rotation)\n * @param ry y-axis radius (before rotation)\n * @param cx1 center x of the ellipse\n * @param cy1 center y of the ellipse\n * @param mT\n * @param fromX starting point of arc x\n * @param fromY starting point of arc y\n */\nconst segmentToBezier = (\n theta1: TRadian,\n theta2: TRadian,\n cosTh: number,\n sinTh: number,\n rx: number,\n ry: number,\n cx1: number,\n cy1: number,\n mT: number,\n fromX: number,\n fromY: number,\n): TParsedAbsoluteCubicCurveCommand => {\n const costh1 = cos(theta1),\n sinth1 = sin(theta1),\n costh2 = cos(theta2),\n sinth2 = sin(theta2),\n toX = cosTh * rx * costh2 - sinTh * ry * sinth2 + cx1,\n toY = sinTh * rx * costh2 + cosTh * ry * sinth2 + cy1,\n cp1X = fromX + mT * (-cosTh * rx * sinth1 - sinTh * ry * costh1),\n cp1Y = fromY + mT * (-sinTh * rx * sinth1 + cosTh * ry * costh1),\n cp2X = toX + mT * (cosTh * rx * sinth2 + sinTh * ry * costh2),\n cp2Y = toY + mT * (sinTh * rx * sinth2 - cosTh * ry * costh2);\n\n return ['C', cp1X, cp1Y, cp2X, cp2Y, toX, toY];\n};\n\n/**\n * Adapted from {@link http://dxr.mozilla.org/mozilla-central/source/dom/svg/SVGPathDataParser.cpp}\n * by Andrea Bogazzi code is under MPL. if you don't have a copy of the license you can take it here\n * http://mozilla.org/MPL/2.0/\n * @param toX\n * @param toY\n * @param rx\n * @param ry\n * @param {number} large 0 or 1 flag\n * @param {number} sweep 0 or 1 flag\n * @param rotateX\n */\nconst arcToSegments = (\n toX: number,\n toY: number,\n rx: number,\n ry: number,\n large: number,\n sweep: number,\n rotateX: TRadian,\n): TParsedAbsoluteCubicCurveCommand[] => {\n if (rx === 0 || ry === 0) {\n return [];\n }\n let fromX = 0,\n fromY = 0,\n root = 0;\n const PI = Math.PI,\n theta = rotateX * PiBy180,\n sinTheta = sin(theta),\n cosTh = cos(theta),\n px = 0.5 * (-cosTh * toX - sinTheta * toY),\n py = 0.5 * (-cosTh * toY + sinTheta * toX),\n rx2 = rx ** 2,\n ry2 = ry ** 2,\n py2 = py ** 2,\n px2 = px ** 2,\n pl = rx2 * ry2 - rx2 * py2 - ry2 * px2;\n let _rx = Math.abs(rx);\n let _ry = Math.abs(ry);\n\n if (pl < 0) {\n const s = Math.sqrt(1 - pl / (rx2 * ry2));\n _rx *= s;\n _ry *= s;\n } else {\n root =\n (large === sweep ? -1.0 : 1.0) * Math.sqrt(pl / (rx2 * py2 + ry2 * px2));\n }\n\n const cx = (root * _rx * py) / _ry,\n cy = (-root * _ry * px) / _rx,\n cx1 = cosTh * cx - sinTheta * cy + toX * 0.5,\n cy1 = sinTheta * cx + cosTh * cy + toY * 0.5;\n let mTheta = calcVectorAngle(1, 0, (px - cx) / _rx, (py - cy) / _ry);\n let dtheta = calcVectorAngle(\n (px - cx) / _rx,\n (py - cy) / _ry,\n (-px - cx) / _rx,\n (-py - cy) / _ry,\n );\n\n if (sweep === 0 && dtheta > 0) {\n dtheta -= 2 * PI;\n } else if (sweep === 1 && dtheta < 0) {\n dtheta += 2 * PI;\n }\n\n // Convert into cubic bezier segments <= 90deg\n const segments = Math.ceil(Math.abs((dtheta / PI) * 2)),\n result = [],\n mDelta = dtheta / segments,\n mT =\n ((8 / 3) * Math.sin(mDelta / 4) * Math.sin(mDelta / 4)) /\n Math.sin(mDelta / 2);\n let th3 = mTheta + mDelta;\n\n for (let i = 0; i < segments; i++) {\n result[i] = segmentToBezier(\n mTheta,\n th3,\n cosTh,\n sinTheta,\n _rx,\n _ry,\n cx1,\n cy1,\n mT,\n fromX,\n fromY,\n );\n fromX = result[i][5];\n fromY = result[i][6];\n mTheta = th3;\n th3 += mDelta;\n }\n return result;\n};\n\n/**\n * @private\n * Calculate the angle between two vectors\n * @param ux u endpoint x\n * @param uy u endpoint y\n * @param vx v endpoint x\n * @param vy v endpoint y\n */\nconst calcVectorAngle = (\n ux: number,\n uy: number,\n vx: number,\n vy: number,\n): TRadian => {\n const ta = Math.atan2(uy, ux),\n tb = Math.atan2(vy, vx);\n if (tb >= ta) {\n return tb - ta;\n } else {\n return 2 * Math.PI - (ta - tb);\n }\n};\n\n// functions for the Cubic beizer\n// taken from: https://github.com/konvajs/konva/blob/7.0.5/src/shapes/Path.ts#L350\nconst CB1 = (t: number) => t ** 3;\nconst CB2 = (t: number) => 3 * t ** 2 * (1 - t);\nconst CB3 = (t: number) => 3 * t * (1 - t) ** 2;\nconst CB4 = (t: number) => (1 - t) ** 3;\n\n/**\n * Calculate bounding box of a cubic Bezier curve\n * Taken from http://jsbin.com/ivomiq/56/edit (no credits available)\n * TODO: can we normalize this with the starting points set at 0 and then translated the bbox?\n * @param {number} begx starting point\n * @param {number} begy\n * @param {number} cp1x first control point\n * @param {number} cp1y\n * @param {number} cp2x second control point\n * @param {number} cp2y\n * @param {number} endx end of bezier\n * @param {number} endy\n * @return {TRectBounds} the rectangular bounds\n */\nexport function getBoundsOfCurve(\n begx: number,\n begy: number,\n cp1x: number,\n cp1y: number,\n cp2x: number,\n cp2y: number,\n endx: number,\n endy: number,\n): TRectBounds {\n let argsString: string;\n if (config.cachesBoundsOfCurve) {\n // eslint-disable-next-line\n argsString = [...arguments].join();\n if (cache.boundsOfCurveCache[argsString]) {\n return cache.boundsOfCurveCache[argsString];\n }\n }\n\n const sqrt = Math.sqrt,\n abs = Math.abs,\n tvalues = [],\n bounds: [[x: number, y: number], [x: number, y: number]] = [\n [0, 0],\n [0, 0],\n ];\n\n let b = 6 * begx - 12 * cp1x + 6 * cp2x;\n let a = -3 * begx + 9 * cp1x - 9 * cp2x + 3 * endx;\n let c = 3 * cp1x - 3 * begx;\n\n for (let i = 0; i < 2; ++i) {\n if (i > 0) {\n b = 6 * begy - 12 * cp1y + 6 * cp2y;\n a = -3 * begy + 9 * cp1y - 9 * cp2y + 3 * endy;\n c = 3 * cp1y - 3 * begy;\n }\n\n if (abs(a) < 1e-12) {\n if (abs(b) < 1e-12) {\n continue;\n }\n const t = -c / b;\n if (0 < t && t < 1) {\n tvalues.push(t);\n }\n continue;\n }\n const b2ac = b * b - 4 * c * a;\n if (b2ac < 0) {\n continue;\n }\n const sqrtb2ac = sqrt(b2ac);\n const t1 = (-b + sqrtb2ac) / (2 * a);\n if (0 < t1 && t1 < 1) {\n tvalues.push(t1);\n }\n const t2 = (-b - sqrtb2ac) / (2 * a);\n if (0 < t2 && t2 < 1) {\n tvalues.push(t2);\n }\n }\n\n let j = tvalues.length;\n const jlen = j;\n const iterator = getPointOnCubicBezierIterator(\n begx,\n begy,\n cp1x,\n cp1y,\n cp2x,\n cp2y,\n endx,\n endy,\n );\n while (j--) {\n const { x, y } = iterator(tvalues[j]);\n bounds[0][j] = x;\n bounds[1][j] = y;\n }\n\n bounds[0][jlen] = begx;\n bounds[1][jlen] = begy;\n bounds[0][jlen + 1] = endx;\n bounds[1][jlen + 1] = endy;\n const result: TRectBounds = [\n new Point(Math.min(...bounds[0]), Math.min(...bounds[1])),\n new Point(Math.max(...bounds[0]), Math.max(...bounds[1])),\n ];\n if (config.cachesBoundsOfCurve) {\n cache.boundsOfCurveCache[argsString!] = result;\n }\n return result;\n}\n\n/**\n * Converts arc to a bunch of cubic Bezier curves\n * @param {number} fx starting point x\n * @param {number} fy starting point y\n * @param {TParsedArcCommand} coords Arc command\n */\nexport const fromArcToBeziers = (\n fx: number,\n fy: number,\n [_, rx, ry, rot, large, sweep, tx, ty]: TParsedArcCommand,\n): TParsedAbsoluteCubicCurveCommand[] => {\n const segsNorm = arcToSegments(tx - fx, ty - fy, rx, ry, large, sweep, rot);\n\n for (let i = 0, len = segsNorm.length; i < len; i++) {\n segsNorm[i][1] += fx;\n segsNorm[i][2] += fy;\n segsNorm[i][3] += fx;\n segsNorm[i][4] += fy;\n segsNorm[i][5] += fx;\n segsNorm[i][6] += fy;\n }\n return segsNorm;\n};\n\n/**\n * This function takes a parsed SVG path and makes it simpler for fabricJS logic.\n * Simplification consist of:\n * - All commands converted to absolute (lowercase to uppercase)\n * - S converted to C\n * - T converted to Q\n * - A converted to C\n * @param {TComplexPathData} path the array of commands of a parsed SVG path for `Path`\n * @return {TSimplePathData} the simplified array of commands of a parsed SVG path for `Path`\n * TODO: figure out how to remove the type assertions in a nice way\n */\nexport const makePathSimpler = (path: TComplexPathData): TSimplePathData => {\n // x and y represent the last point of the path, AKA the previous command point.\n // we add them to each relative command to make it an absolute comment.\n // we also swap the v V h H with L, because are easier to transform.\n let x = 0,\n y = 0;\n // x1 and y1 represent the last point of the subpath. the subpath is started with\n // m or M command. When a z or Z command is drawn, x and y need to be resetted to\n // the last x1 and y1.\n let x1 = 0,\n y1 = 0;\n // previous will host the letter of the previous command, to handle S and T.\n // controlX and controlY will host the previous reflected control point\n const destinationPath: TSimplePathData = [];\n let previous,\n // placeholders\n controlX = 0,\n controlY = 0;\n for (const parsedCommand of path) {\n const current: TComplexParsedCommand = [...parsedCommand];\n let converted: TSimpleParsedCommand | undefined;\n switch (\n current[0] // first letter\n ) {\n case 'l': // lineto, relative\n current[1] += x;\n current[2] += y;\n // falls through\n case 'L':\n x = current[1];\n y = current[2];\n converted = ['L', x, y];\n break;\n case 'h': // horizontal lineto, relative\n current[1] += x;\n // falls through\n case 'H':\n x = current[1];\n converted = ['L', x, y];\n break;\n case 'v': // vertical lineto, relative\n current[1] += y;\n // falls through\n case 'V':\n y = current[1];\n converted = ['L', x, y];\n break;\n case 'm': // moveTo, relative\n current[1] += x;\n current[2] += y;\n // falls through\n case 'M':\n x = current[1];\n y = current[2];\n x1 = current[1];\n y1 = current[2];\n converted = ['M', x, y];\n break;\n case 'c': // bezierCurveTo, relative\n current[1] += x;\n current[2] += y;\n current[3] += x;\n current[4] += y;\n current[5] += x;\n current[6] += y;\n // falls through\n case 'C':\n controlX = current[3];\n controlY = current[4];\n x = current[5];\n y = current[6];\n converted = ['C', current[1], current[2], controlX, controlY, x, y];\n break;\n case 's': // shorthand cubic bezierCurveTo, relative\n current[1] += x;\n current[2] += y;\n current[3] += x;\n current[4] += y;\n // falls through\n case 'S':\n // would be sScC but since we are swapping sSc for C, we check just that.\n if (previous === 'C') {\n // calculate reflection of previous control points\n controlX = 2 * x - controlX;\n controlY = 2 * y - controlY;\n } else {\n // If there is no previous command or if the previous command was not a C, c, S, or s,\n // the control point is coincident with the current point\n controlX = x;\n controlY = y;\n }\n x = current[3];\n y = current[4];\n converted = ['C', controlX, controlY, current[1], current[2], x, y];\n // converted[3] and converted[4] are NOW the second control point.\n // we keep it for the next reflection.\n controlX = converted[3];\n controlY = converted[4];\n break;\n case 'q': // quadraticCurveTo, relative\n current[1] += x;\n current[2] += y;\n current[3] += x;\n current[4] += y;\n // falls through\n case 'Q':\n controlX = current[1];\n controlY = current[2];\n x = current[3];\n y = current[4];\n converted = ['Q', controlX, controlY, x, y];\n break;\n case 't': // shorthand quadraticCurveTo, relative\n current[1] += x;\n current[2] += y;\n // falls through\n case 'T':\n if (previous === 'Q') {\n // calculate reflection of previous control point\n controlX = 2 * x - controlX;\n controlY = 2 * y - controlY;\n } else {\n // If there is no previous command or if the previous command was not a Q, q, T or t,\n // assume the control point is coincident with the current point\n controlX = x;\n controlY = y;\n }\n x = current[1];\n y = current[2];\n converted = ['Q', controlX, controlY, x, y];\n break;\n case 'a':\n current[6] += x;\n current[7] += y;\n // falls through\n case 'A':\n fromArcToBeziers(x, y, current).forEach((b) => destinationPath.push(b));\n x = current[6];\n y = current[7];\n break;\n case 'z':\n case 'Z':\n x = x1;\n y = y1;\n converted = ['Z'];\n break;\n default:\n }\n if (converted) {\n destinationPath.push(converted);\n previous = converted[0];\n } else {\n previous = '';\n }\n }\n return destinationPath;\n};\n\n// todo verify if we can just use the point class here\n/**\n * Calc length from point x1,y1 to x2,y2\n * @param {number} x1 starting point x\n * @param {number} y1 starting point y\n * @param {number} x2 starting point x\n * @param {number} y2 starting point y\n * @return {number} length of segment\n */\nconst calcLineLength = (\n x1: number,\n y1: number,\n x2: number,\n y2: number,\n): number => Math.sqrt((x2 - x1) ** 2 + (y2 - y1) ** 2);\n\n/**\n * Get an iterator that takes a percentage and returns a point\n * @param {number} begx\n * @param {number} begy\n * @param {number} cp1x\n * @param {number} cp1y\n * @param {number} cp2x\n * @param {number} cp2y\n * @param {number} endx\n * @param {number} endy\n */\nconst getPointOnCubicBezierIterator =\n (\n begx: number,\n begy: number,\n cp1x: number,\n cp1y: number,\n cp2x: number,\n cp2y: number,\n endx: number,\n endy: number,\n ) =>\n (pct: number) => {\n const c1 = CB1(pct),\n c2 = CB2(pct),\n c3 = CB3(pct),\n c4 = CB4(pct);\n return new Point(\n endx * c1 + cp2x * c2 + cp1x * c3 + begx * c4,\n endy * c1 + cp2y * c2 + cp1y * c3 + begy * c4,\n );\n };\n\nconst QB1 = (t: number) => t ** 2;\nconst QB2 = (t: number) => 2 * t * (1 - t);\nconst QB3 = (t: number) => (1 - t) ** 2;\n\nconst getTangentCubicIterator =\n (\n p1x: number,\n p1y: number,\n p2x: number,\n p2y: number,\n p3x: number,\n p3y: number,\n p4x: number,\n p4y: number,\n ) =>\n (pct: number) => {\n const qb1 = QB1(pct),\n qb2 = QB2(pct),\n qb3 = QB3(pct),\n tangentX =\n 3 * (qb3 * (p2x - p1x) + qb2 * (p3x - p2x) + qb1 * (p4x - p3x)),\n tangentY =\n 3 * (qb3 * (p2y - p1y) + qb2 * (p3y - p2y) + qb1 * (p4y - p3y));\n return Math.atan2(tangentY, tangentX);\n };\n\nconst getPointOnQuadraticBezierIterator =\n (\n p1x: number,\n p1y: number,\n p2x: number,\n p2y: number,\n p3x: number,\n p3y: number,\n ) =>\n (pct: number) => {\n const c1 = QB1(pct),\n c2 = QB2(pct),\n c3 = QB3(pct);\n return new Point(\n p3x * c1 + p2x * c2 + p1x * c3,\n p3y * c1 + p2y * c2 + p1y * c3,\n );\n };\n\nconst getTangentQuadraticIterator =\n (\n p1x: number,\n p1y: number,\n p2x: number,\n p2y: number,\n p3x: number,\n p3y: number,\n ) =>\n (pct: number) => {\n const invT = 1 - pct,\n tangentX = 2 * (invT * (p2x - p1x) + pct * (p3x - p2x)),\n tangentY = 2 * (invT * (p2y - p1y) + pct * (p3y - p2y));\n return Math.atan2(tangentY, tangentX);\n };\n\n// this will run over a path segment (a cubic or quadratic segment) and approximate it\n// with 100 segments. This will good enough to calculate the length of the curve\nconst pathIterator = (\n iterator: (pct: number) => Point,\n x1: number,\n y1: number,\n) => {\n let tempP = new Point(x1, y1),\n tmpLen = 0;\n for (let perc = 1; perc <= 100; perc += 1) {\n const p = iterator(perc / 100);\n tmpLen += calcLineLength(tempP.x, tempP.y, p.x, p.y);\n tempP = p;\n }\n return tmpLen;\n};\n\n/**\n * Given a pathInfo, and a distance in pixels, find the percentage from 0 to 1\n * that correspond to that pixels run over the path.\n * The percentage will be then used to find the correct point on the canvas for the path.\n * @param {Array} segInfo fabricJS collection of information on a parsed path\n * @param {number} distance from starting point, in pixels.\n * @return {TPointAngle} info object with x and y ( the point on canvas ) and angle, the tangent on that point;\n */\nconst findPercentageForDistance = (\n segInfo: TCurveInfo<'Q' | 'C'>,\n distance: number,\n): TPointAngle => {\n let perc = 0,\n tmpLen = 0,\n tempP: XY = { x: segInfo.x, y: segInfo.y },\n p: XY = { ...tempP },\n nextLen: number,\n nextStep = 0.01,\n lastPerc = 0;\n // nextStep > 0.0001 covers 0.00015625 that 1/64th of 1/100\n // the path\n const iterator = segInfo.iterator,\n angleFinder = segInfo.angleFinder;\n while (tmpLen < distance && nextStep > 0.0001) {\n p = iterator(perc);\n lastPerc = perc;\n nextLen = calcLineLength(tempP.x, tempP.y, p.x, p.y);\n // compare tmpLen each cycle with distance, decide next perc to test.\n if (nextLen + tmpLen > distance) {\n // we discard this step and we make smaller steps.\n perc -= nextStep;\n nextStep /= 2;\n } else {\n tempP = p;\n perc += nextStep;\n tmpLen += nextLen;\n }\n }\n return { ...p, angle: angleFinder(lastPerc) };\n};\n\n/**\n * Run over a parsed and simplified path and extract some information (length of each command and starting point)\n * @param {TSimplePathData} path parsed path commands\n * @return {TPathSegmentInfo[]} path commands information\n */\nexport const getPathSegmentsInfo = (\n path: TSimplePathData,\n): TPathSegmentInfo[] => {\n let totalLength = 0,\n //x2 and y2 are the coords of segment start\n //x1 and y1 are the coords of the current point\n x1 = 0,\n y1 = 0,\n x2 = 0,\n y2 = 0,\n iterator,\n tempInfo: TPathSegmentInfo;\n const info: TPathSegmentInfo[] = [];\n for (const current of path) {\n const basicInfo: TPathSegmentInfoCommon = {\n x: x1,\n y: y1,\n command: current[0],\n length: 0,\n };\n switch (\n current[0] //first letter\n ) {\n case 'M':\n tempInfo = >basicInfo;\n tempInfo.x = x2 = x1 = current[1];\n tempInfo.y = y2 = y1 = current[2];\n break;\n case 'L':\n tempInfo = >basicInfo;\n tempInfo.length = calcLineLength(x1, y1, current[1], current[2]);\n x1 = current[1];\n y1 = current[2];\n break;\n case 'C':\n iterator = getPointOnCubicBezierIterator(\n x1,\n y1,\n current[1],\n current[2],\n current[3],\n current[4],\n current[5],\n current[6],\n );\n tempInfo = >basicInfo;\n tempInfo.iterator = iterator;\n tempInfo.angleFinder = getTangentCubicIterator(\n x1,\n y1,\n current[1],\n current[2],\n current[3],\n current[4],\n current[5],\n current[6],\n );\n tempInfo.length = pathIterator(iterator, x1, y1);\n\n x1 = current[5];\n y1 = current[6];\n break;\n case 'Q':\n iterator = getPointOnQuadraticBezierIterator(\n x1,\n y1,\n current[1],\n current[2],\n current[3],\n current[4],\n );\n tempInfo = >basicInfo;\n tempInfo.iterator = iterator;\n tempInfo.angleFinder = getTangentQuadraticIterator(\n x1,\n y1,\n current[1],\n current[2],\n current[3],\n current[4],\n );\n tempInfo.length = pathIterator(iterator, x1, y1);\n x1 = current[3];\n y1 = current[4];\n break;\n case 'Z':\n // we add those in order to ease calculations later\n tempInfo = basicInfo;\n tempInfo.destX = x2;\n tempInfo.destY = y2;\n tempInfo.length = calcLineLength(x1, y1, x2, y2);\n x1 = x2;\n y1 = y2;\n break;\n }\n totalLength += tempInfo.length;\n info.push(tempInfo);\n }\n info.push({ length: totalLength, x: x1, y: y1 });\n return info;\n};\n\n/**\n * Get the point on the path that is distance along the path\n * @param path\n * @param distance\n * @param infos\n */\nexport const getPointOnPath = (\n path: TSimplePathData,\n distance: number,\n infos: TPathSegmentInfo[] = getPathSegmentsInfo(path),\n): TPointAngle | undefined => {\n let i = 0;\n while (distance - infos[i].length > 0 && i < infos.length - 2) {\n distance -= infos[i].length;\n i++;\n }\n const segInfo = infos[i],\n segPercent = distance / segInfo.length,\n segment = path[i];\n\n switch (segInfo.command) {\n case 'M':\n return { x: segInfo.x, y: segInfo.y, angle: 0 };\n case 'Z':\n return {\n ...new Point(segInfo.x, segInfo.y).lerp(\n new Point(segInfo.destX, segInfo.destY),\n segPercent,\n ),\n angle: Math.atan2(segInfo.destY - segInfo.y, segInfo.destX - segInfo.x),\n };\n case 'L':\n return {\n ...new Point(segInfo.x, segInfo.y).lerp(\n new Point(segment[1]!, segment[2]!),\n segPercent,\n ),\n angle: Math.atan2(segment[2]! - segInfo.y, segment[1]! - segInfo.x),\n };\n case 'C':\n return findPercentageForDistance(segInfo, distance);\n case 'Q':\n return findPercentageForDistance(segInfo, distance);\n default:\n // throw Error('Invalid command');\n }\n};\n\nconst rePathCmdAll = new RegExp(rePathCommand, 'gi');\nconst regExpArcCommandPoints = new RegExp(reArcCommandPoints, 'g');\nconst reMyNum = new RegExp(reNum, 'gi');\nconst commandLengths = {\n m: 2,\n l: 2,\n h: 1,\n v: 1,\n c: 6,\n s: 4,\n q: 4,\n t: 2,\n a: 7,\n} as const;\n/**\n *\n * @param {string} pathString\n * @return {TComplexPathData} An array of SVG path commands\n * @example Usage\n * parsePath('M 3 4 Q 3 5 2 1 4 0 Q 9 12 2 1 4 0') === [\n * ['M', 3, 4],\n * ['Q', 3, 5, 2, 1, 4, 0],\n * ['Q', 9, 12, 2, 1, 4, 0],\n * ];\n */\nexport const parsePath = (pathString: string): TComplexPathData => {\n const chain: TComplexPathData = [];\n const all = pathString.match(rePathCmdAll) ?? [];\n for (const matchStr of all) {\n // take match string and save the first letter as the command\n const commandLetter = matchStr[0] as TComplexParsedCommandType;\n // in case of Z we have very little to do\n if (commandLetter === 'z' || commandLetter === 'Z') {\n chain.push([commandLetter]);\n continue;\n }\n const commandLength =\n commandLengths[\n commandLetter.toLowerCase() as keyof typeof commandLengths\n ];\n\n let paramArr = [];\n if (commandLetter === 'a' || commandLetter === 'A') {\n // the arc command ha some peculariaties that requires a special regex other than numbers\n // it is possible to avoid using a space between the sweep and large arc flags, making them either\n // 00, 01, 10 or 11, making them identical to a plain number for the regex reMyNum\n // reset the regexp\n regExpArcCommandPoints.lastIndex = 0;\n for (let out = null; (out = regExpArcCommandPoints.exec(matchStr)); ) {\n paramArr.push(...out.slice(1));\n }\n } else {\n paramArr = matchStr.match(reMyNum) || [];\n }\n\n // inspect the length of paramArr, if is longer than commandLength\n // we are dealing with repeated commands\n for (let i = 0; i < paramArr.length; i += commandLength) {\n const newCommand = new Array(commandLength) as TComplexParsedCommand;\n const transformedCommand = repeatedCommands[commandLetter];\n newCommand[0] =\n i > 0 && transformedCommand ? transformedCommand : commandLetter;\n for (let j = 0; j < commandLength; j++) {\n newCommand[j + 1] = parseFloat(paramArr[i + j]);\n }\n chain.push(newCommand);\n }\n }\n return chain;\n};\n\n/**\n *\n * Converts points to a smooth SVG path\n * @param {XY[]} points Array of points\n * @param {number} [correction] Apply a correction to the path (usually we use `width / 1000`). If value is undefined 0 is used as the correction value.\n * @return {(string|number)[][]} An array of SVG path commands\n */\nexport const getSmoothPathFromPoints = (\n points: Point[],\n correction = 0,\n): TSimplePathData => {\n let p1 = new Point(points[0]),\n p2 = new Point(points[1]),\n multSignX = 1,\n multSignY = 0;\n const path: TSimplePathData = [],\n len = points.length,\n manyPoints = len > 2;\n\n if (manyPoints) {\n multSignX = points[2].x < p2.x ? -1 : points[2].x === p2.x ? 0 : 1;\n multSignY = points[2].y < p2.y ? -1 : points[2].y === p2.y ? 0 : 1;\n }\n path.push([\n 'M',\n p1.x - multSignX * correction,\n p1.y - multSignY * correction,\n ]);\n let i;\n for (i = 1; i < len; i++) {\n if (!p1.eq(p2)) {\n const midPoint = p1.midPointFrom(p2);\n // p1 is our bezier control point\n // midpoint is our endpoint\n // start point is p(i-1) value.\n path.push(['Q', p1.x, p1.y, midPoint.x, midPoint.y]);\n }\n p1 = points[i];\n if (i + 1 < points.length) {\n p2 = points[i + 1];\n }\n }\n if (manyPoints) {\n multSignX = p1.x > points[i - 2].x ? 1 : p1.x === points[i - 2].x ? 0 : -1;\n multSignY = p1.y > points[i - 2].y ? 1 : p1.y === points[i - 2].y ? 0 : -1;\n }\n path.push([\n 'L',\n p1.x + multSignX * correction,\n p1.y + multSignY * correction,\n ]);\n return path;\n};\n\n/**\n * Transform a path by transforming each segment.\n * it has to be a simplified path or it won't work.\n * WARNING: this depends from pathOffset for correct operation\n * @param {TSimplePathData} path fabricJS parsed and simplified path commands\n * @param {TMat2D} transform matrix that represent the transformation\n * @param {Point} [pathOffset] `Path.pathOffset`\n * @returns {TSimplePathData} the transformed path\n */\nexport const transformPath = (\n path: TSimplePathData,\n transform: TMat2D,\n pathOffset: Point,\n): TSimplePathData => {\n if (pathOffset) {\n transform = multiplyTransformMatrices(transform, [\n 1,\n 0,\n 0,\n 1,\n -pathOffset.x,\n -pathOffset.y,\n ]);\n }\n return path.map((pathSegment) => {\n const newSegment: TSimpleParsedCommand = [...pathSegment];\n for (let i = 1; i < pathSegment.length - 1; i += 2) {\n // TODO: is there a way to get around casting to any?\n const { x, y } = transformPoint(\n {\n x: pathSegment[i] as number,\n y: pathSegment[i + 1] as number,\n },\n transform,\n );\n newSegment[i] = x;\n newSegment[i + 1] = y;\n }\n return newSegment;\n });\n};\n\n/**\n * Returns an array of path commands to create a regular polygon\n * @param {number} numVertexes\n * @param {number} radius\n * @returns {TSimplePathData} An array of SVG path commands\n */\nexport const getRegularPolygonPath = (\n numVertexes: number,\n radius: number,\n): TSimplePathData => {\n const interiorAngle = (Math.PI * 2) / numVertexes;\n // rotationAdjustment rotates the path by 1/2 the interior angle so that the polygon always has a flat side on the bottom\n // This isn't strictly necessary, but it's how we tend to think of and expect polygons to be drawn\n let rotationAdjustment = -halfPI;\n if (numVertexes % 2 === 0) {\n rotationAdjustment += interiorAngle / 2;\n }\n const d = new Array(numVertexes + 1);\n for (let i = 0; i < numVertexes; i++) {\n const rad = i * interiorAngle + rotationAdjustment;\n const { x, y } = new Point(cos(rad), sin(rad)).scalarMultiply(radius);\n d[i] = [i === 0 ? 'M' : 'L', x, y];\n }\n d[numVertexes] = ['Z'];\n return d;\n};\n\n/**\n * Join path commands to go back to svg format\n * @param {TSimplePathData} pathData fabricJS parsed path commands\n * @param {number} fractionDigits number of fraction digits to \"leave\"\n * @return {String} joined path 'M 0 0 L 20 30'\n */\nexport const joinPath = (pathData: TSimplePathData, fractionDigits?: number) =>\n pathData\n .map((segment) => {\n return segment\n .map((arg, i) => {\n if (i === 0) return arg;\n return fractionDigits === undefined\n ? arg\n : toFixed(arg, fractionDigits);\n })\n .join(' ');\n })\n .join(' ');\n","import type { FabricObject } from '../../shapes/Object/FabricObject';\nimport { sendObjectToPlane } from './planeChange';\nimport { Group } from '../../shapes/Group';\n/**\n * Merges 2 clip paths into one visually equal clip path\n *\n * **IMPORTANT**:\\\n * Does **NOT** clone the arguments, clone them proir if necessary.\n *\n * Creates a wrapper (group) that contains one clip path and is clipped by the other so content is kept where both overlap.\n * Use this method if both the clip paths may have nested clip paths of their own, so assigning one to the other's clip path property is not possible.\n *\n * In order to handle the `inverted` property we follow logic described in the following cases:\\\n * **(1)** both clip paths are inverted - the clip paths pass the inverted prop to the wrapper and loose it themselves.\\\n * **(2)** one is inverted and the other isn't - the wrapper shouldn't become inverted and the inverted clip path must clip the non inverted one to produce an identical visual effect.\\\n * **(3)** both clip paths are not inverted - wrapper and clip paths remain unchanged.\n *\n * @param {fabric.Object} c1\n * @param {fabric.Object} c2\n * @returns {fabric.Object} merged clip path\n */\nexport const mergeClipPaths = (c1: FabricObject, c2: FabricObject) => {\n let a = c1,\n b = c2;\n if (a.inverted && !b.inverted) {\n // case (2)\n a = c2;\n b = c1;\n }\n // `b` becomes `a`'s clip path so we transform `b` to `a` coordinate plane\n sendObjectToPlane(b, b.group?.calcTransformMatrix(), a.calcTransformMatrix());\n // assign the `inverted` prop to the wrapping group\n const inverted = a.inverted && b.inverted;\n if (inverted) {\n // case (1)\n a.inverted = b.inverted = false;\n }\n return new Group([a], { clipPath: b, inverted });\n};\n","/**\n * Returns random number between 2 specified ones.\n * @param {Number} min lower limit\n * @param {Number} max upper limit\n * @return {Number} random value (between min and max)\n */\nexport const getRandomInt = (min: number, max: number): number =>\n Math.floor(Math.random() * (max - min + 1)) + min;\n","import { CENTER, SCALE_X, SCALE_Y } from '../constants';\nimport type { FabricImage } from '../shapes/Image';\nimport type { FabricObject } from '../shapes/Object/FabricObject';\nimport type { TMat2D } from '../typedefs';\nimport { qrDecompose } from './misc/matrix';\n\ntype FabricObjectWithTransformMatrix = FabricObject & {\n transformMatrix?: TMat2D;\n};\n\n/**\n * This function is an helper for svg import. it decompose the transformMatrix\n * and assign properties to object.\n * untransformed coordinates\n * @private\n */\nconst _assignTransformMatrixProps = (\n object: FabricObjectWithTransformMatrix,\n) => {\n if (object.transformMatrix) {\n const { scaleX, scaleY, angle, skewX } = qrDecompose(\n object.transformMatrix,\n );\n object.flipX = false;\n object.flipY = false;\n object.set(SCALE_X, scaleX);\n object.set(SCALE_Y, scaleY);\n object.angle = angle;\n object.skewX = skewX;\n object.skewY = 0;\n }\n};\n\n/**\n * This function is an helper for svg import. it removes the transform matrix\n * and set to object properties that fabricjs can handle\n * @private\n * @param {Object} preserveAspectRatioOptions\n */\nexport const removeTransformMatrixForSvgParsing = (\n object: FabricObjectWithTransformMatrix,\n preserveAspectRatioOptions?: any,\n) => {\n let center = object._findCenterFromElement();\n if (object.transformMatrix) {\n _assignTransformMatrixProps(object);\n center = center.transform(object.transformMatrix);\n }\n delete object.transformMatrix;\n if (preserveAspectRatioOptions) {\n object.scaleX *= preserveAspectRatioOptions.scaleX;\n object.scaleY *= preserveAspectRatioOptions.scaleY;\n (object as FabricImage).cropX = preserveAspectRatioOptions.cropX;\n (object as FabricImage).cropY = preserveAspectRatioOptions.cropY;\n center.x += preserveAspectRatioOptions.offsetLeft;\n center.y += preserveAspectRatioOptions.offsetTop;\n object.width = preserveAspectRatioOptions.width;\n object.height = preserveAspectRatioOptions.height;\n }\n object.setPositionByOrigin(center, CENTER, CENTER);\n};\n","// TODO this file needs to go away, cross browser style support is not fabricjs domain.\n\n/**\n * wrapper for setting element's style\n * @param {HTMLElement} element an HTMLElement\n * @param {Object} styles to apply to element\n */\nexport function setStyle(element: HTMLElement, styles: Record) {\n const elementStyle = element.style;\n if (!elementStyle) {\n return;\n }\n Object.entries(styles).forEach(([property, value]) =>\n elementStyle.setProperty(property, value),\n );\n}\n","import { getEnv, getFabricDocument } from '../../env';\nimport type { TSize } from '../../typedefs';\nimport { createCanvasElement } from '../../util/misc/dom';\nimport { setStyle } from '../../util/internals/dom_style';\nimport type { CSSDimensions } from './util';\nimport { makeElementUnselectable, setCSSDimensions } from './util';\nimport type { CanvasItem } from './StaticCanvasDOMManager';\nimport { StaticCanvasDOMManager } from './StaticCanvasDOMManager';\nimport { setCanvasDimensions } from './util';\nimport { NONE } from '../../constants';\n\nexport class CanvasDOMManager extends StaticCanvasDOMManager {\n upper: CanvasItem;\n container: HTMLDivElement;\n\n constructor(\n arg0?: string | HTMLCanvasElement,\n {\n allowTouchScrolling = false,\n containerClass = '',\n }: {\n allowTouchScrolling?: boolean;\n /**\n * @deprecated here only for backward compatibility\n */\n containerClass?: string;\n } = {},\n ) {\n super(arg0);\n const { el: lowerCanvasEl } = this.lower;\n const upperCanvasEl = this.createUpperCanvas();\n this.upper = { el: upperCanvasEl, ctx: upperCanvasEl.getContext('2d')! };\n this.applyCanvasStyle(lowerCanvasEl, {\n allowTouchScrolling,\n });\n this.applyCanvasStyle(upperCanvasEl, {\n allowTouchScrolling,\n styles: {\n position: 'absolute',\n left: '0',\n top: '0',\n },\n });\n const container = this.createContainerElement();\n container.classList.add(containerClass);\n if (lowerCanvasEl.parentNode) {\n lowerCanvasEl.parentNode.replaceChild(container, lowerCanvasEl);\n }\n container.append(lowerCanvasEl, upperCanvasEl);\n this.container = container;\n }\n\n protected createUpperCanvas() {\n const { el: lowerCanvasEl } = this.lower;\n const el = createCanvasElement();\n // we assign the same classname of the lowerCanvas\n el.className = lowerCanvasEl.className;\n // but then we remove the lower-canvas specific className\n el.classList.remove('lower-canvas');\n // we add the specific upper-canvas class\n el.classList.add('upper-canvas');\n el.setAttribute('data-fabric', 'top');\n el.style.cssText = lowerCanvasEl.style.cssText;\n el.setAttribute('draggable', 'true');\n return el;\n }\n\n protected createContainerElement() {\n const container = getFabricDocument().createElement('div');\n container.setAttribute('data-fabric', 'wrapper');\n setStyle(container, {\n position: 'relative',\n });\n makeElementUnselectable(container);\n return container;\n }\n\n /**\n * @private\n * @param {HTMLCanvasElement} element canvas element to apply styles on\n */\n protected applyCanvasStyle(\n element: HTMLCanvasElement,\n options: {\n allowTouchScrolling?: boolean;\n styles?: Record;\n },\n ) {\n const { styles, allowTouchScrolling } = options;\n setStyle(element, {\n ...styles,\n 'touch-action': allowTouchScrolling ? 'manipulation' : NONE,\n });\n makeElementUnselectable(element);\n }\n\n setDimensions(size: TSize, retinaScaling: number) {\n super.setDimensions(size, retinaScaling);\n const { el, ctx } = this.upper;\n setCanvasDimensions(el, ctx, size, retinaScaling);\n }\n\n setCSSDimensions(size: Partial): void {\n super.setCSSDimensions(size);\n setCSSDimensions(this.upper.el, size);\n setCSSDimensions(this.container, size);\n }\n\n cleanupDOM(size: TSize) {\n const container = this.container,\n { el: lowerCanvasEl } = this.lower,\n { el: upperCanvasEl } = this.upper;\n super.cleanupDOM(size);\n container.removeChild(upperCanvasEl);\n container.removeChild(lowerCanvasEl);\n if (container.parentNode) {\n container.parentNode.replaceChild(lowerCanvasEl, container);\n }\n }\n\n dispose() {\n super.dispose();\n getEnv().dispose(this.upper.el);\n // @ts-expect-error disposing\n delete this.upper;\n // @ts-expect-error disposing\n delete this.container;\n }\n}\n","import type { ModifierKey, TOptionalModifierKey } from '../EventTypeDefs';\nimport type { TOptions } from '../typedefs';\nimport type { StaticCanvasOptions } from './StaticCanvasOptions';\n\nexport interface CanvasTransformOptions {\n /**\n * When true, objects can be transformed by one side (unproportionately)\n * when dragged on the corners that normally would not do that.\n * @type Boolean\n * @since fabric 4.0 // changed name and default value\n */\n uniformScaling: boolean;\n\n /**\n * Indicates which key switches uniform scaling.\n * values: 'altKey', 'shiftKey', 'ctrlKey'.\n * If `null` or 'none' or any other string that is not a modifier key\n * feature is disabled.\n * totally wrong named. this sounds like `uniform scaling`\n * if Canvas.uniformScaling is true, pressing this will set it to false\n * and viceversa.\n * @since 1.6.2\n * @type ModifierKey\n */\n uniScaleKey: TOptionalModifierKey;\n\n /**\n * When true, objects use center point as the origin of scale transformation.\n * Backwards incompatibility note: This property replaces \"centerTransform\" (Boolean).\n * @since 1.3.4\n * @type Boolean\n */\n centeredScaling: boolean;\n\n /**\n * When true, objects use center point as the origin of rotate transformation.\n * Backwards incompatibility note: This property replaces \"centerTransform\" (Boolean).\n * @since 1.3.4\n * @type Boolean\n */\n centeredRotation: boolean;\n\n /**\n * Indicates which key enable centered Transform\n * values: 'altKey', 'shiftKey', 'ctrlKey'.\n * If `null` or 'none' or any other string that is not a modifier key\n * feature is disabled feature disabled.\n * @since 1.6.2\n * @type ModifierKey\n */\n centeredKey: TOptionalModifierKey;\n\n /**\n * Indicates which key enable alternate action on corner\n * values: 'altKey', 'shiftKey', 'ctrlKey'.\n * If `null` or 'none' or any other string that is not a modifier key\n * feature is disabled feature disabled.\n * @since 1.6.2\n * @type ModifierKey\n */\n altActionKey: TOptionalModifierKey;\n}\n\nexport interface CanvasSelectionOptions {\n /**\n * Indicates whether group selection should be enabled\n * @type Boolean\n */\n selection: boolean;\n\n /**\n * Indicates which key or keys enable multiple click selection\n * Pass value as a string or array of strings\n * values: 'altKey', 'shiftKey', 'ctrlKey'.\n * If `null` or empty or containing any other string that is not a modifier key\n * feature is disabled.\n * @since 1.6.2\n * @type ModifierKey|ModifierKey[]\n */\n selectionKey: TOptionalModifierKey | ModifierKey[];\n\n /**\n * Indicates which key enable alternative selection\n * in case of a target overlapping with active object and we don't want to loose the\n * active selection, we can press this modifier key and continue selecting the current\n * selected object also when is covered by another or many valid targets for selection.\n * values: 'altKey', 'shiftKey', 'ctrlKey'.\n * For a series of reason that come from the general expectations on how\n * things should work, this feature works only for preserveObjectStacking true.\n * If `null` or 'none' or any other string that is not a modifier key\n * feature is disabled.\n * @since 1.6.5\n * @type null|ModifierKey\n */\n altSelectionKey: TOptionalModifierKey;\n\n /**\n * Color of selection\n * @type String\n */\n selectionColor: string;\n\n /**\n * Default dash array pattern\n * If not empty the selection border is dashed\n * @type Array\n */\n selectionDashArray: number[];\n\n /**\n * Color of the border of selection (usually slightly darker than color of selection itself)\n * @type String\n */\n selectionBorderColor: string;\n\n /**\n * Width of a line used in object/group selection\n * @type Number\n */\n selectionLineWidth: number;\n\n /**\n * Select only shapes that are fully contained in the dragged selection rectangle.\n * @type Boolean\n */\n selectionFullyContained: boolean;\n}\n\nexport interface CanvasCursorOptions {\n /**\n * Default cursor value used when hovering over an object on canvas\n * @type CSSStyleDeclaration['cursor']\n * @default move\n */\n hoverCursor: CSSStyleDeclaration['cursor'];\n\n /**\n * Default cursor value used when moving an object on canvas\n * @type CSSStyleDeclaration['cursor']\n * @default move\n */\n moveCursor: CSSStyleDeclaration['cursor'];\n\n /**\n * Default cursor value used for the entire canvas\n * @type String\n * @default default\n */\n defaultCursor: CSSStyleDeclaration['cursor'];\n\n /**\n * Cursor value used during free drawing\n * @type String\n * @default crosshair\n */\n freeDrawingCursor: CSSStyleDeclaration['cursor'];\n\n /**\n * Cursor value used for disabled elements ( corners with disabled action )\n * @type String\n * @since 2.0.0\n * @default not-allowed\n */\n notAllowedCursor: CSSStyleDeclaration['cursor'];\n}\n\nexport interface TargetFindOptions {\n /**\n * When true, object detection happens on per-pixel basis rather than on per-bounding-box\n * @type Boolean\n */\n perPixelTargetFind: boolean;\n\n /**\n * Number of pixels around target pixel to tolerate (consider active) during object detection\n * @type Number\n */\n targetFindTolerance: number;\n\n /**\n * When true, target detection is skipped. Target detection will return always undefined.\n * click selection won't work anymore, events will fire with no targets.\n * if something is selected before setting it to true, it will be deselected at the first click.\n * area selection will still work. check the `selection` property too.\n * if you deactivate both, you should look into staticCanvas.\n * @type Boolean\n */\n skipTargetFind: boolean;\n}\n\nexport interface CanvasEventsOptions {\n /**\n * Indicates if the right click on canvas can output the context menu or not\n * @type Boolean\n * @since 1.6.5\n */\n stopContextMenu: boolean;\n\n /**\n * Indicates if the canvas can fire right click events\n * @type Boolean\n * @since 1.6.5\n */\n fireRightClick: boolean;\n\n /**\n * Indicates if the canvas can fire middle click events\n * @type Boolean\n * @since 1.7.8\n */\n fireMiddleClick: boolean;\n\n /**\n * When the option is enabled, PointerEvent is used instead of TPointerEvent.\n * @type Boolean\n */\n enablePointerEvents: boolean;\n}\n\nexport interface CanvasOptions\n extends StaticCanvasOptions,\n CanvasTransformOptions,\n CanvasSelectionOptions,\n CanvasCursorOptions,\n TargetFindOptions,\n CanvasEventsOptions {\n /**\n * Default element class that's given to wrapper (div) element of canvas\n * @type String\n * @deprecated customize {@link CanvasDOMManager} instead or access {@link elements} directly\n */\n containerClass: string;\n\n /**\n * Indicates whether objects should remain in current stack position when selected.\n * When false objects are brought to top and rendered as part of the selection group\n * @type Boolean\n * @default true\n */\n preserveObjectStacking: boolean;\n}\n\nexport type TCanvasOptions = TOptions;\n\nexport const canvasDefaults: TOptions = {\n uniformScaling: true,\n uniScaleKey: 'shiftKey',\n centeredScaling: false,\n centeredRotation: false,\n centeredKey: 'altKey',\n altActionKey: 'shiftKey',\n\n selection: true,\n selectionKey: 'shiftKey',\n selectionColor: 'rgba(100, 100, 255, 0.3)',\n selectionDashArray: [],\n selectionBorderColor: 'rgba(255, 255, 255, 0.3)',\n selectionLineWidth: 1,\n selectionFullyContained: false,\n\n hoverCursor: 'move',\n moveCursor: 'move',\n defaultCursor: 'default',\n freeDrawingCursor: 'crosshair',\n notAllowedCursor: 'not-allowed',\n\n perPixelTargetFind: false,\n targetFindTolerance: 0,\n skipTargetFind: false,\n\n stopContextMenu: false,\n fireRightClick: false,\n fireMiddleClick: false,\n enablePointerEvents: false,\n\n containerClass: 'canvas-container',\n preserveObjectStacking: true,\n};\n","import { dragHandler } from '../controls/drag';\nimport { getActionFromCorner } from '../controls/util';\nimport { Point } from '../Point';\nimport { FabricObject } from '../shapes/Object/FabricObject';\nimport type {\n CanvasEvents,\n ModifierKey,\n TOptionalModifierKey,\n TPointerEvent,\n Transform,\n} from '../EventTypeDefs';\nimport {\n addTransformToObject,\n saveObjectTransform,\n} from '../util/misc/objectTransforms';\nimport type { TCanvasSizeOptions } from './StaticCanvas';\nimport { StaticCanvas } from './StaticCanvas';\nimport { isCollection } from '../Collection';\nimport { isTransparent } from '../util/misc/isTransparent';\nimport type {\n TMat2D,\n TOriginX,\n TOriginY,\n TSize,\n TSVGReviver,\n} from '../typedefs';\nimport { degreesToRadians } from '../util/misc/radiansDegreesConversion';\nimport { getPointer, isTouchEvent } from '../util/dom_event';\nimport type { IText } from '../shapes/IText/IText';\nimport type { BaseBrush } from '../brushes/BaseBrush';\nimport { pick } from '../util/misc/pick';\nimport { sendPointToPlane } from '../util/misc/planeChange';\nimport { cos, createCanvasElement, sin } from '../util';\nimport { CanvasDOMManager } from './DOMManagers/CanvasDOMManager';\nimport {\n BOTTOM,\n CENTER,\n LEFT,\n MODIFIED,\n RESIZING,\n RIGHT,\n ROTATE,\n SCALE,\n SCALE_X,\n SCALE_Y,\n SKEW_X,\n SKEW_Y,\n TOP,\n} from '../constants';\nimport type { CanvasOptions } from './CanvasOptions';\nimport { canvasDefaults } from './CanvasOptions';\nimport { Intersection } from '../Intersection';\nimport { isActiveSelection } from '../util/typeAssertions';\n\nexport type TargetsInfo = {\n target?: FabricObject;\n subTargets: FabricObject[];\n};\n\nexport type TargetsInfoWithContainer = {\n // the target we think is the most continuing the selection action.\n // could be hoveredTarget or the currently selected object\n target?: FabricObject;\n // the nested targets under the pointer for container\n subTargets: FabricObject[];\n // the container for target, or target itself if there are no selectable nested targets\n container?: FabricObject;\n};\n\nexport type FullTargetsInfoWithContainer = TargetsInfoWithContainer & {\n // hoveredTarget\n currentTarget?: FabricObject;\n // the container for hoveredTarget, or container itself\n currentContainer?: FabricObject;\n // nested targets of current container\n currentSubTargets: FabricObject[];\n};\n\n/**\n * Canvas class\n * @class Canvas\n * @extends StaticCanvas\n * @tutorial {@link http://fabricjs.com/fabric-intro-part-1#canvas}\n *\n * @fires object:modified at the end of a transform\n * @fires object:rotating while an object is being rotated from the control\n * @fires object:scaling while an object is being scaled by controls\n * @fires object:moving while an object is being dragged\n * @fires object:skewing while an object is being skewed from the controls\n *\n * @fires before:transform before a transform is is started\n * @fires before:selection:cleared\n * @fires selection:cleared\n * @fires selection:updated\n * @fires selection:created\n *\n * @fires path:created after a drawing operation ends and the path is added\n * @fires mouse:down\n * @fires mouse:move\n * @fires mouse:up\n * @fires mouse:down:before on mouse down, before the inner fabric logic runs\n * @fires mouse:move:before on mouse move, before the inner fabric logic runs\n * @fires mouse:up:before on mouse up, before the inner fabric logic runs\n * @fires mouse:over\n * @fires mouse:out\n * @fires mouse:dblclick whenever a native dbl click event fires on the canvas.\n *\n * @fires dragover\n * @fires dragenter\n * @fires dragleave\n * @fires drag:enter object drag enter\n * @fires drag:leave object drag leave\n * @fires drop:before before drop event. Prepare for the drop event (same native event).\n * @fires drop\n * @fires drop:after after drop event. Run logic on canvas after event has been accepted/declined (same native event).\n * @example\n * let a: fabric.Object, b: fabric.Object;\n * let flag = false;\n * canvas.add(a, b);\n * a.on('drop:before', opt => {\n * // we want a to accept the drop even though it's below b in the stack\n * flag = this.canDrop(opt.e);\n * });\n * b.canDrop = function(e) {\n * !flag && this.draggableTextDelegate.canDrop(e);\n * }\n * b.on('dragover', opt => b.set('fill', opt.dropTarget === b ? 'pink' : 'black'));\n * a.on('drop', opt => {\n * opt.e.defaultPrevented // drop occurred\n * opt.didDrop // drop occurred on canvas\n * opt.target // drop target\n * opt.target !== a && a.set('text', 'I lost');\n * });\n * canvas.on('drop:after', opt => {\n * // inform user who won\n * if(!opt.e.defaultPrevented) {\n * // no winners\n * }\n * else if(!opt.didDrop) {\n * // my objects didn't win, some other lucky object\n * }\n * else {\n * // we have a winner it's opt.target!!\n * }\n * })\n *\n * @fires after:render at the end of the render process, receives the context in the callback\n * @fires before:render at start the render process, receives the context in the callback\n *\n * @fires contextmenu:before\n * @fires contextmenu\n * @example\n * let handler;\n * targets.forEach(target => {\n * target.on('contextmenu:before', opt => {\n * // decide which target should handle the event before canvas hijacks it\n * if (someCaseHappens && opt.targets.includes(target)) {\n * handler = target;\n * }\n * });\n * target.on('contextmenu', opt => {\n * // do something fantastic\n * });\n * });\n * canvas.on('contextmenu', opt => {\n * if (!handler) {\n * // no one takes responsibility, it's always left to me\n * // let's show them how it's done!\n * }\n * });\n *\n */\nexport class SelectableCanvas\n extends StaticCanvas\n implements Omit\n{\n declare _objects: FabricObject[];\n\n // transform config\n declare uniformScaling: boolean;\n declare uniScaleKey: TOptionalModifierKey;\n declare centeredScaling: boolean;\n declare centeredRotation: boolean;\n declare centeredKey: TOptionalModifierKey;\n declare altActionKey: TOptionalModifierKey;\n\n // selection config\n declare selection: boolean;\n declare selectionKey: TOptionalModifierKey | ModifierKey[];\n declare altSelectionKey: TOptionalModifierKey;\n declare selectionColor: string;\n declare selectionDashArray: number[];\n declare selectionBorderColor: string;\n declare selectionLineWidth: number;\n declare selectionFullyContained: boolean;\n\n // cursors\n declare hoverCursor: CSSStyleDeclaration['cursor'];\n declare moveCursor: CSSStyleDeclaration['cursor'];\n declare defaultCursor: CSSStyleDeclaration['cursor'];\n declare freeDrawingCursor: CSSStyleDeclaration['cursor'];\n declare notAllowedCursor: CSSStyleDeclaration['cursor'];\n\n declare containerClass: string;\n\n // target find config\n declare perPixelTargetFind: boolean;\n declare targetFindTolerance: number;\n declare skipTargetFind: boolean;\n\n /**\n * When true, mouse events on canvas (mousedown/mousemove/mouseup) result in free drawing.\n * After mousedown, mousemove creates a shape,\n * and then mouseup finalizes it and adds an instance of `fabric.Path` onto canvas.\n * @tutorial {@link http://fabricjs.com/fabric-intro-part-4#free_drawing}\n * @type Boolean\n */\n declare isDrawingMode: boolean;\n\n declare preserveObjectStacking: boolean;\n\n // event config\n declare stopContextMenu: boolean;\n declare fireRightClick: boolean;\n declare fireMiddleClick: boolean;\n\n /**\n * Keep track of the hovered target\n * @type FabricObject | null\n * @private\n */\n declare _hoveredTarget?: FabricObject;\n\n /**\n * hold the list of nested targets hovered\n * @type FabricObject[]\n * @private\n */\n _hoveredTargets: FabricObject[] = [];\n\n /**\n * hold the list of objects to render\n * @type FabricObject[]\n * @private\n */\n _objectsToRender?: FabricObject[];\n\n /**\n * hold a reference to a data structure that contains information\n * on the current on going transform\n * @type\n * @private\n */\n _currentTransform: Transform | null = null;\n\n /**\n * hold a reference to a data structure used to track the selection\n * box on canvas drag\n * on the current on going transform\n * x, y, deltaX and deltaY are in scene plane\n * @type\n * @private\n */\n protected _groupSelector: {\n x: number;\n y: number;\n deltaX: number;\n deltaY: number;\n } | null = null;\n\n /**\n * internal flag used to understand if the context top requires a cleanup\n * in case this is true, the contextTop will be cleared at the next render\n * @type boolean\n * @private\n */\n contextTopDirty = false;\n\n /**\n * During a mouse event we may need the pointer multiple times in multiple functions.\n * _scenePoint holds a reference to the pointer in fabricCanvas/design coordinates that is valid for the event\n * lifespan. Every fabricJS mouse event create and delete the cache every time\n * We do this because there are some HTML DOM inspection functions to get the actual pointer coordinates\n * @type {Point}\n */\n declare protected _scenePoint?: Point;\n\n /**\n * During a mouse event we may need the pointer multiple times in multiple functions.\n * _viewportPoint holds a reference to the pointer in html coordinates that is valid for the event\n * lifespan. Every fabricJS mouse event create and delete the cache every time\n * We do this because there are some HTML DOM inspection functions to get the actual pointer coordinates\n * @type {Point}\n */\n declare protected _viewportPoint?: Point;\n\n /**\n * Holds the informations we cache during an event lifespan\n * This data is needed many times during an event and we want to avoid to recalculate it\n * multuple times.\n */\n declare protected _targetInfo: FullTargetsInfoWithContainer | undefined;\n\n static ownDefaults = canvasDefaults;\n\n static getDefaults(): Record {\n return { ...super.getDefaults(), ...SelectableCanvas.ownDefaults };\n }\n\n declare elements: CanvasDOMManager;\n get upperCanvasEl() {\n return this.elements.upper?.el;\n }\n get contextTop() {\n return this.elements.upper?.ctx;\n }\n get wrapperEl() {\n return this.elements.container;\n }\n declare private pixelFindCanvasEl: HTMLCanvasElement;\n declare private pixelFindContext: CanvasRenderingContext2D;\n\n declare protected _isCurrentlyDrawing: boolean;\n declare freeDrawingBrush?: BaseBrush;\n declare _activeObject?: FabricObject;\n\n protected initElements(el?: string | HTMLCanvasElement) {\n this.elements = new CanvasDOMManager(el, {\n allowTouchScrolling: this.allowTouchScrolling,\n containerClass: this.containerClass,\n });\n this._createCacheCanvas();\n }\n\n /**\n * @private\n * @param {FabricObject} obj Object that was added\n */\n _onObjectAdded(obj: FabricObject) {\n this._objectsToRender = undefined;\n super._onObjectAdded(obj);\n }\n\n /**\n * @private\n * @param {FabricObject} obj Object that was removed\n */\n _onObjectRemoved(obj: FabricObject) {\n this._objectsToRender = undefined;\n // removing active object should fire \"selection:cleared\" events\n if (obj === this._activeObject) {\n this.fire('before:selection:cleared', { deselected: [obj] });\n this._discardActiveObject();\n this.fire('selection:cleared', { deselected: [obj] });\n obj.fire('deselected', {\n target: obj,\n });\n }\n if (obj === this._hoveredTarget) {\n this._hoveredTarget = undefined;\n this._hoveredTargets = [];\n }\n super._onObjectRemoved(obj);\n }\n\n _onStackOrderChanged() {\n this._objectsToRender = undefined;\n super._onStackOrderChanged();\n }\n\n /**\n * Divides objects in two groups, one to render immediately\n * and one to render as activeGroup.\n * @return {Array} objects to render immediately and pushes the other in the activeGroup.\n */\n _chooseObjectsToRender(): FabricObject[] {\n const activeObject = this._activeObject;\n return !this.preserveObjectStacking && activeObject\n ? this._objects\n .filter((object) => !object.group && object !== activeObject)\n .concat(activeObject)\n : this._objects;\n }\n\n /**\n * Renders both the top canvas and the secondary container canvas.\n */\n renderAll() {\n this.cancelRequestedRender();\n if (this.destroyed) {\n return;\n }\n if (this.contextTopDirty && !this._groupSelector && !this.isDrawingMode) {\n this.clearContext(this.contextTop);\n this.contextTopDirty = false;\n }\n if (this.hasLostContext) {\n this.renderTopLayer(this.contextTop);\n this.hasLostContext = false;\n }\n !this._objectsToRender &&\n (this._objectsToRender = this._chooseObjectsToRender());\n this.renderCanvas(this.getContext(), this._objectsToRender);\n }\n\n /**\n * text selection is rendered by the active text instance during the rendering cycle\n */\n renderTopLayer(ctx: CanvasRenderingContext2D): void {\n ctx.save();\n if (this.isDrawingMode && this._isCurrentlyDrawing) {\n this.freeDrawingBrush && this.freeDrawingBrush._render();\n this.contextTopDirty = true;\n }\n // we render the top context - last object\n if (this.selection && this._groupSelector) {\n this._drawSelection(ctx);\n this.contextTopDirty = true;\n }\n ctx.restore();\n }\n\n /**\n * Method to render only the top canvas.\n * Also used to render the group selection box.\n * Does not render text selection.\n */\n renderTop() {\n const ctx = this.contextTop;\n this.clearContext(ctx);\n this.renderTopLayer(ctx);\n // todo: how do i know if the after:render is for the top or normal contex?\n this.fire('after:render', { ctx });\n }\n\n /**\n * Set the canvas tolerance value for pixel taret find.\n * Use only integer numbers.\n * @private\n */\n setTargetFindTolerance(value: number) {\n value = Math.round(value);\n this.targetFindTolerance = value;\n const retina = this.getRetinaScaling();\n const size = Math.ceil((value * 2 + 1) * retina);\n this.pixelFindCanvasEl.width = this.pixelFindCanvasEl.height = size;\n this.pixelFindContext.scale(retina, retina);\n }\n\n /**\n * Returns true if object is transparent at a certain location\n * Clarification: this is `is target transparent at location X or are controls there`\n * @TODO this seems dumb that we treat controls with transparency. we can find controls\n * programmatically without painting them, the cache canvas optimization is always valid\n * @param {FabricObject} target Object to check\n * @param {Number} x Left coordinate in viewport space\n * @param {Number} y Top coordinate in viewport space\n * @return {Boolean}\n */\n isTargetTransparent(target: FabricObject, x: number, y: number): boolean {\n const tolerance = this.targetFindTolerance;\n const ctx = this.pixelFindContext;\n this.clearContext(ctx);\n ctx.save();\n ctx.translate(-x + tolerance, -y + tolerance);\n ctx.transform(...this.viewportTransform);\n const selectionBgc = target.selectionBackgroundColor;\n target.selectionBackgroundColor = '';\n target.render(ctx);\n target.selectionBackgroundColor = selectionBgc;\n ctx.restore();\n // our canvas is square, and made around tolerance.\n // so tolerance in this case also represent the center of the canvas.\n const enhancedTolerance = Math.round(tolerance * this.getRetinaScaling());\n return isTransparent(\n ctx,\n enhancedTolerance,\n enhancedTolerance,\n enhancedTolerance,\n );\n }\n\n /**\n * takes an event and determines if selection key has been pressed\n * @private\n * @param {TPointerEvent} e Event object\n */\n _isSelectionKeyPressed(e: TPointerEvent): boolean {\n const sKey = this.selectionKey;\n if (!sKey) {\n return false;\n }\n if (Array.isArray(sKey)) {\n return !!sKey.find((key) => !!key && e[key] === true);\n } else {\n return e[sKey];\n }\n }\n\n /**\n * @private\n * @param {TPointerEvent} e Event object\n * @param {FabricObject} target\n */\n _shouldClearSelection(\n e: TPointerEvent,\n target?: FabricObject,\n ): target is undefined {\n const activeObjects = this.getActiveObjects(),\n activeObject = this._activeObject;\n\n return !!(\n !target ||\n (target &&\n activeObject &&\n activeObjects.length > 1 &&\n activeObjects.indexOf(target) === -1 &&\n activeObject !== target &&\n !this._isSelectionKeyPressed(e)) ||\n (target && !target.evented) ||\n (target && !target.selectable && activeObject && activeObject !== target)\n );\n }\n\n /**\n * This method will take in consideration a modifier key pressed and the control we are\n * about to drag, and try to guess the anchor point ( origin ) of the transormation.\n * This should be really in the realm of controls, and we should remove specific code for legacy\n * embedded actions.\n * @TODO this probably deserve discussion/rediscovery and change/refactor\n * @private\n * @deprecated\n * @param {FabricObject} target\n * @param {string} action\n * @param {boolean} altKey\n * @returns {boolean} true if the transformation should be centered\n */\n private _shouldCenterTransform(\n target: FabricObject,\n action: string,\n modifierKeyPressed: boolean,\n ) {\n if (!target) {\n return;\n }\n\n let centerTransform;\n\n if (\n action === SCALE ||\n action === SCALE_X ||\n action === SCALE_Y ||\n action === RESIZING\n ) {\n centerTransform = this.centeredScaling || target.centeredScaling;\n } else if (action === ROTATE) {\n centerTransform = this.centeredRotation || target.centeredRotation;\n }\n\n return centerTransform ? !modifierKeyPressed : modifierKeyPressed;\n }\n\n /**\n * Given the control clicked, determine the origin of the transform.\n * This is bad because controls can totally have custom names\n * should disappear before release 4.0\n * @private\n * @deprecated\n */\n _getOriginFromCorner(\n target: FabricObject,\n controlName: string,\n ): { x: TOriginX; y: TOriginY } {\n const origin = {\n x: target.originX,\n y: target.originY,\n };\n\n if (!controlName) {\n return origin;\n }\n\n // is a left control ?\n if (['ml', 'tl', 'bl'].includes(controlName)) {\n origin.x = RIGHT;\n // is a right control ?\n } else if (['mr', 'tr', 'br'].includes(controlName)) {\n origin.x = LEFT;\n }\n // is a top control ?\n if (['tl', 'mt', 'tr'].includes(controlName)) {\n origin.y = BOTTOM;\n // is a bottom control ?\n } else if (['bl', 'mb', 'br'].includes(controlName)) {\n origin.y = TOP;\n }\n return origin;\n }\n\n /**\n * @private\n * @param {Event} e Event object\n * @param {FabricObject} target\n * @param {boolean} [alreadySelected] pass true to setup the active control\n */\n _setupCurrentTransform(\n e: TPointerEvent,\n target: FabricObject,\n alreadySelected: boolean,\n ): void {\n const pointer = target.group\n ? // transform pointer to target's containing coordinate plane\n sendPointToPlane(\n this.getScenePoint(e),\n undefined,\n target.group.calcTransformMatrix(),\n )\n : this.getScenePoint(e);\n const { key: corner = '', control } = target.getActiveControl() || {},\n actionHandler =\n alreadySelected && control\n ? control.getActionHandler(e, target, control)?.bind(control)\n : dragHandler,\n action = getActionFromCorner(alreadySelected, corner, e, target),\n altKey = e[this.centeredKey as ModifierKey],\n origin = this._shouldCenterTransform(target, action, altKey)\n ? ({ x: CENTER, y: CENTER } as const)\n : this._getOriginFromCorner(target, corner),\n /**\n * relative to target's containing coordinate plane\n * both agree on every point\n **/\n transform: Transform = {\n target: target,\n action,\n actionHandler,\n actionPerformed: false,\n corner,\n scaleX: target.scaleX,\n scaleY: target.scaleY,\n skewX: target.skewX,\n skewY: target.skewY,\n offsetX: pointer.x - target.left,\n offsetY: pointer.y - target.top,\n originX: origin.x,\n originY: origin.y,\n ex: pointer.x,\n ey: pointer.y,\n lastX: pointer.x,\n lastY: pointer.y,\n theta: degreesToRadians(target.angle),\n width: target.width,\n height: target.height,\n shiftKey: e.shiftKey,\n altKey,\n original: {\n ...saveObjectTransform(target),\n originX: origin.x,\n originY: origin.y,\n },\n };\n\n this._currentTransform = transform;\n\n this.fire('before:transform', {\n e,\n transform,\n });\n }\n\n /**\n * Set the cursor type of the canvas element\n * @param {String} value Cursor type of the canvas element.\n * @see http://www.w3.org/TR/css3-ui/#cursor\n */\n setCursor(value: CSSStyleDeclaration['cursor']): void {\n this.upperCanvasEl.style.cursor = value;\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx to draw the selection on\n */\n _drawSelection(ctx: CanvasRenderingContext2D): void {\n const { x, y, deltaX, deltaY } = this._groupSelector!,\n start = new Point(x, y).transform(this.viewportTransform),\n extent = new Point(x + deltaX, y + deltaY).transform(\n this.viewportTransform,\n ),\n strokeOffset = this.selectionLineWidth / 2;\n let minX = Math.min(start.x, extent.x),\n minY = Math.min(start.y, extent.y),\n maxX = Math.max(start.x, extent.x),\n maxY = Math.max(start.y, extent.y);\n\n if (this.selectionColor) {\n ctx.fillStyle = this.selectionColor;\n ctx.fillRect(minX, minY, maxX - minX, maxY - minY);\n }\n\n if (!this.selectionLineWidth || !this.selectionBorderColor) {\n return;\n }\n ctx.lineWidth = this.selectionLineWidth;\n ctx.strokeStyle = this.selectionBorderColor;\n\n minX += strokeOffset;\n minY += strokeOffset;\n maxX -= strokeOffset;\n maxY -= strokeOffset;\n // selection border\n // @TODO: is _setLineDash still necessary on modern canvas?\n FabricObject.prototype._setLineDash.call(\n this,\n ctx,\n this.selectionDashArray,\n );\n ctx.strokeRect(minX, minY, maxX - minX, maxY - minY);\n }\n\n /**\n * This function is in charge of deciding which is the object that is the current target of an interaction event.\n * For interaction event we mean a pointer related action on the canvas.\n * Which is the\n * 11/09/2018 TODO: would be cool if findTarget could discern between being a full target\n * or the outside part of the corner.\n * @param {Event} e mouse event\n * @return {TargetsInfoWithContainer} the target found\n */\n findTarget(e: TPointerEvent): FullTargetsInfoWithContainer {\n // this._targetInfo is cached by _cacheTransformEventData\n // and destroyed by _resetTransformEventData\n if (this._targetInfo) {\n return this._targetInfo;\n }\n\n if (this.skipTargetFind) {\n return {\n subTargets: [],\n currentSubTargets: [],\n };\n }\n\n const pointer = this.getScenePoint(e),\n activeObject = this._activeObject,\n aObjects = this.getActiveObjects(),\n targetInfo = this.searchPossibleTargets(this._objects, pointer);\n\n const {\n subTargets: currentSubTargets,\n container: currentContainer,\n target: currentTarget,\n } = targetInfo;\n\n const fullTargetInfo: FullTargetsInfoWithContainer = {\n ...targetInfo,\n currentSubTargets,\n currentContainer,\n currentTarget,\n };\n\n // simplest case no active object, return a new target\n if (!activeObject) {\n return fullTargetInfo;\n }\n\n // check pointer is over active selection and possibly perform `subTargetCheck`\n const activeObjectTargetInfo: FullTargetsInfoWithContainer = {\n ...this.searchPossibleTargets([activeObject], pointer),\n currentSubTargets,\n currentContainer,\n currentTarget,\n };\n\n const activeObjectControl = activeObject.findControl(\n this.getViewportPoint(e),\n isTouchEvent(e),\n );\n\n // we are clicking exactly the control of an active object, shortcut to that object.\n if (activeObjectControl) {\n return {\n ...activeObjectTargetInfo,\n target: activeObject, // we override target in case we are in the outside part of the corner.\n };\n }\n\n // in case we are over the active object\n if (activeObjectTargetInfo.target) {\n if (aObjects.length > 1) {\n // in case of active selection and target hit over the activeSelection, just exit\n // TODO Verify if we need to override target with container\n return activeObjectTargetInfo;\n }\n // from here onward not an active selection, just an activeOject that maybe is a group\n\n // preserveObjectStacking is false, so activeObject is drawn on top, just return activeObject\n if (!this.preserveObjectStacking) {\n // TODO Verify if we need to override target with container\n return activeObjectTargetInfo;\n }\n\n // In case we are in preserveObjectStacking ( selection in stack )\n // there is the possibility to force with `altSelectionKey` to return the activeObject\n // from any point in the stack, even if we have another object completely on top of it.\n if (\n this.preserveObjectStacking &&\n e[this.altSelectionKey as ModifierKey]\n ) {\n // TODO Verify if we need to override target with container\n return activeObjectTargetInfo;\n }\n }\n\n // we have an active object, but we ruled out it being our target in any way.\n return fullTargetInfo;\n }\n\n /**\n * Checks if the point is inside the object selection area including padding\n * @param {FabricObject} obj Object to test against\n * @param {Object} [pointer] point in scene coordinates\n * @return {Boolean} true if point is contained within an area of given object\n * @private\n */\n private _pointIsInObjectSelectionArea(obj: FabricObject, point: Point) {\n // getCoords will already take care of group de-nesting\n let coords = obj.getCoords();\n const viewportZoom = this.getZoom();\n const padding = obj.padding / viewportZoom;\n if (padding) {\n const [tl, tr, br, bl] = coords;\n // what is the angle of the object?\n // we could use getTotalAngle, but is way easier to look at it\n // from how coords are oriented, since if something went wrong\n // at least we are consistent.\n const angleRadians = Math.atan2(tr.y - tl.y, tr.x - tl.x),\n cosP = cos(angleRadians) * padding,\n sinP = sin(angleRadians) * padding,\n cosPSinP = cosP + sinP,\n cosPMinusSinP = cosP - sinP;\n\n coords = [\n new Point(tl.x - cosPMinusSinP, tl.y - cosPSinP),\n new Point(tr.x + cosPSinP, tr.y - cosPMinusSinP),\n new Point(br.x + cosPMinusSinP, br.y + cosPSinP),\n new Point(bl.x - cosPSinP, bl.y + cosPMinusSinP),\n ];\n // in case of padding we calculate the new coords on the fly.\n // otherwise we have to maintain 2 sets of coordinates for everything.\n // we can reiterate on storing them.\n // if this is slow, for now the semplification is large and doesn't impact\n // rendering.\n // the idea behind this is that outside target check we don't need ot know\n // where those coords are\n }\n return Intersection.isPointInPolygon(point, coords);\n }\n\n /**\n * Checks point is inside the object selection condition. Either area with padding\n * or over pixels if perPixelTargetFind is enabled\n * @param {FabricObject} obj Object to test against\n * @param {Point} pointer point from scene.\n * @return {Boolean} true if point is contained within an area of given object\n * @private\n */\n _checkTarget(obj: FabricObject, pointer: Point): boolean {\n if (\n obj &&\n obj.visible &&\n obj.evented &&\n this._pointIsInObjectSelectionArea(obj, pointer)\n ) {\n if (\n (this.perPixelTargetFind || obj.perPixelTargetFind) &&\n !(obj as unknown as IText).isEditing\n ) {\n const viewportPoint = pointer.transform(this.viewportTransform);\n if (!this.isTargetTransparent(obj, viewportPoint.x, viewportPoint.y)) {\n return true;\n }\n } else {\n return true;\n }\n }\n return false;\n }\n\n /**\n * Given an array of objects search possible targets under the pointer position\n * Returns an\n * @param {Array} objects objects array to look into\n * @param {Object} pointer x,y object of point of scene coordinates we want to check.\n * @param {Object} subTargets If passed, subtargets will be collected inside the array\n * @return {TargetsInfo} **top most object from given `objects`** that contains pointer\n * @private\n */\n _searchPossibleTargets(\n objects: FabricObject[],\n pointer: Point,\n subTargets: FabricObject[],\n ): TargetsInfo {\n let i = objects.length;\n // Do not check for currently grouped objects, since we check the parent group itself.\n // until we call this function specifically to search inside the activeGroup\n while (i--) {\n const target = objects[i];\n if (this._checkTarget(target, pointer)) {\n if (isCollection(target) && target.subTargetCheck) {\n const { target: subTarget } = this._searchPossibleTargets(\n target._objects,\n pointer,\n subTargets,\n );\n subTarget && subTargets.push(subTarget);\n }\n return {\n target,\n subTargets,\n };\n }\n }\n return {\n subTargets: [],\n };\n }\n\n /**\n * Search inside an objects array the fiurst object that contains pointer\n * Collect subTargets of that object inside the subTargets array passed as parameter\n * @param {FabricObject[]} objects objects array to look into\n * @param {Point} pointer coordinates from viewport to check.\n * @return {FabricObject} **top most object on screen** that contains pointer\n */\n searchPossibleTargets(\n objects: FabricObject[],\n pointer: Point,\n ): TargetsInfoWithContainer {\n const targetInfo: TargetsInfoWithContainer = this._searchPossibleTargets(\n objects,\n pointer,\n [],\n );\n\n // outermost target is the container.\n targetInfo.container = targetInfo.target;\n const { container, subTargets } = targetInfo;\n\n if (\n container &&\n isCollection(container) &&\n container.interactive &&\n subTargets[0]\n ) {\n /** subTargets[0] is the innermost nested target, but it could be inside non interactive groups\n * and so not a possible selection target.\n * We loop the array from the end that is outermost innertarget.\n */\n for (let i = subTargets.length - 1; i > 0; i--) {\n const t = subTargets[i];\n if (!(isCollection(t) && t.interactive)) {\n // one of the subtargets was not interactive. that is the last subtarget we can return.\n // we can't dig more deep;\n targetInfo.target = t;\n return targetInfo;\n }\n }\n targetInfo.target = subTargets[0];\n return targetInfo;\n }\n\n return targetInfo;\n }\n\n /**\n * @returns point existing in the same plane as the {@link HTMLCanvasElement},\n * `(0, 0)` being the top left corner of the {@link HTMLCanvasElement}.\n * This means that changes to the {@link viewportTransform} do not change the values of the point\n * and it remains unchanged from the viewer's perspective.\n *\n * @example\n * const scenePoint = sendPointToPlane(\n * this.getViewportPoint(e),\n * undefined,\n * canvas.viewportTransform\n * );\n *\n */\n getViewportPoint(e: TPointerEvent) {\n if (this._viewportPoint) {\n return this._viewportPoint;\n }\n return this._getPointerImpl(e, true);\n }\n\n /**\n * @returns point existing in the scene (the same plane as the plane {@link FabricObject#getCenterPoint} exists in).\n * This means that changes to the {@link viewportTransform} do not change the values of the point,\n * however, from the viewer's perspective, the point is changed.\n *\n * @example\n * const viewportPoint = sendPointToPlane(\n * this.getScenePoint(e),\n * canvas.viewportTransform\n * );\n *\n */\n getScenePoint(e: TPointerEvent) {\n if (this._scenePoint) {\n return this._scenePoint;\n }\n return this._getPointerImpl(e);\n }\n\n /**\n * Returns pointer relative to canvas.\n *\n * Use {@link getViewportPoint} or {@link getScenePoint} instead.\n *\n * @param {Event} e\n * @param {Boolean} [fromViewport] whether to return the point from the viewport or in the scene\n * @return {Point}\n */\n protected _getPointerImpl(e: TPointerEvent, fromViewport = false): Point {\n const upperCanvasEl = this.upperCanvasEl,\n bounds = upperCanvasEl.getBoundingClientRect();\n let pointer = getPointer(e),\n boundsWidth = bounds.width || 0,\n boundsHeight = bounds.height || 0;\n\n if (!boundsWidth || !boundsHeight) {\n if (TOP in bounds && BOTTOM in bounds) {\n boundsHeight = Math.abs(bounds.top - bounds.bottom);\n }\n if (RIGHT in bounds && LEFT in bounds) {\n boundsWidth = Math.abs(bounds.right - bounds.left);\n }\n }\n\n this.calcOffset();\n pointer.x = pointer.x - this._offset.left;\n pointer.y = pointer.y - this._offset.top;\n if (!fromViewport) {\n pointer = sendPointToPlane(pointer, undefined, this.viewportTransform);\n }\n\n const retinaScaling = this.getRetinaScaling();\n if (retinaScaling !== 1) {\n pointer.x /= retinaScaling;\n pointer.y /= retinaScaling;\n }\n\n // If bounds are not available (i.e. not visible), do not apply scale.\n const cssScale =\n boundsWidth === 0 || boundsHeight === 0\n ? new Point(1, 1)\n : new Point(\n upperCanvasEl.width / boundsWidth,\n upperCanvasEl.height / boundsHeight,\n );\n\n return pointer.multiply(cssScale);\n }\n\n /**\n * Internal use only\n * @protected\n */\n protected _setDimensionsImpl(\n dimensions: TSize,\n options?: TCanvasSizeOptions,\n ) {\n // @ts-expect-error this method exists in the subclass - should be moved or declared as abstract\n this._resetTransformEventData();\n super._setDimensionsImpl(dimensions, options);\n if (this._isCurrentlyDrawing) {\n this.freeDrawingBrush &&\n this.freeDrawingBrush._setBrushStyles(this.contextTop);\n }\n }\n\n protected _createCacheCanvas() {\n this.pixelFindCanvasEl = createCanvasElement();\n this.pixelFindContext = this.pixelFindCanvasEl.getContext('2d', {\n willReadFrequently: true,\n })!;\n this.setTargetFindTolerance(this.targetFindTolerance);\n }\n\n /**\n * Returns context of top canvas where interactions are drawn\n * @returns {CanvasRenderingContext2D}\n */\n getTopContext(): CanvasRenderingContext2D {\n return this.elements.upper.ctx;\n }\n\n /**\n * Returns context of canvas where object selection is drawn\n * @alias\n * @return {CanvasRenderingContext2D}\n */\n getSelectionContext(): CanvasRenderingContext2D {\n return this.elements.upper.ctx;\n }\n\n /**\n * Returns <canvas> element on which object selection is drawn\n * @return {HTMLCanvasElement}\n */\n getSelectionElement(): HTMLCanvasElement {\n return this.elements.upper.el;\n }\n\n /**\n * Returns currently active object\n * @return {FabricObject | null} active object\n */\n getActiveObject(): FabricObject | undefined {\n return this._activeObject;\n }\n\n /**\n * Returns an array with the current selected objects\n * @return {FabricObject[]} active objects array\n */\n getActiveObjects(): FabricObject[] {\n const active = this._activeObject;\n return isActiveSelection(active)\n ? active.getObjects()\n : active\n ? [active]\n : [];\n }\n\n /**\n * @private\n * Compares the old activeObject with the current one and fires correct events\n * @param {FabricObject[]} oldObjects old activeObject\n * @param {TPointerEvent} e mouse event triggering the selection events\n */\n _fireSelectionEvents(oldObjects: FabricObject[], e?: TPointerEvent) {\n let somethingChanged = false,\n invalidate = false;\n const objects = this.getActiveObjects(),\n added: FabricObject[] = [],\n removed: FabricObject[] = [];\n\n oldObjects.forEach((target) => {\n if (!objects.includes(target)) {\n somethingChanged = true;\n target.fire('deselected', {\n e,\n target,\n });\n removed.push(target);\n }\n });\n\n objects.forEach((target) => {\n if (!oldObjects.includes(target)) {\n somethingChanged = true;\n target.fire('selected', {\n e,\n target,\n });\n added.push(target);\n }\n });\n\n if (oldObjects.length > 0 && objects.length > 0) {\n invalidate = true;\n somethingChanged &&\n this.fire('selection:updated', {\n e,\n selected: added,\n deselected: removed,\n });\n } else if (objects.length > 0) {\n invalidate = true;\n this.fire('selection:created', {\n e,\n selected: added,\n });\n } else if (oldObjects.length > 0) {\n invalidate = true;\n this.fire('selection:cleared', {\n e,\n deselected: removed,\n });\n }\n invalidate && (this._objectsToRender = undefined);\n }\n\n /**\n * Sets given object as the only active object on canvas\n * @param {FabricObject} object Object to set as an active one\n * @param {TPointerEvent} [e] Event (passed along when firing \"object:selected\")\n * @return {Boolean} true if the object has been selected\n */\n setActiveObject(object: FabricObject, e?: TPointerEvent) {\n // we can't inline this, since _setActiveObject will change what getActiveObjects returns\n const currentActives = this.getActiveObjects();\n const selected = this._setActiveObject(object, e);\n this._fireSelectionEvents(currentActives, e);\n return selected;\n }\n\n /**\n * This is supposed to be equivalent to setActiveObject but without firing\n * any event. There is commitment to have this stay this way.\n * This is the functional part of setActiveObject.\n * @param {Object} object to set as active\n * @param {Event} [e] Event (passed along when firing \"object:selected\")\n * @return {Boolean} true if the object has been selected\n */\n _setActiveObject(object: FabricObject, e?: TPointerEvent) {\n const prevActiveObject = this._activeObject;\n if (prevActiveObject === object) {\n return false;\n }\n // after calling this._discardActiveObject, this,_activeObject could be undefined\n if (!this._discardActiveObject(e, object) && this._activeObject) {\n // refused to deselect\n return false;\n }\n if (object.onSelect({ e })) {\n return false;\n }\n\n this._activeObject = object;\n\n if (isActiveSelection(object) && prevActiveObject !== object) {\n object.set('canvas', this);\n }\n object.setCoords();\n\n return true;\n }\n\n /**\n * This is supposed to be equivalent to discardActiveObject but without firing\n * any selection events ( can still fire object transformation events ). There is commitment to have this stay this way.\n * This is the functional part of discardActiveObject.\n * @param {Event} [e] Event (passed along when firing \"object:deselected\")\n * @param {Object} object the next object to set as active, reason why we are discarding this\n * @return {Boolean} true if the active object has been discarded\n */\n _discardActiveObject(\n e?: TPointerEvent,\n object?: FabricObject,\n ): this is { _activeObject: undefined } {\n const obj = this._activeObject;\n if (obj) {\n // onDeselect return TRUE to cancel selection;\n if (obj.onDeselect({ e, object })) {\n return false;\n }\n if (this._currentTransform && this._currentTransform.target === obj) {\n this.endCurrentTransform(e);\n }\n if (isActiveSelection(obj) && obj === this._hoveredTarget) {\n this._hoveredTarget = undefined;\n }\n this._activeObject = undefined;\n return true;\n }\n return false;\n }\n\n /**\n * Discards currently active object and fire events. If the function is called by fabric\n * as a consequence of a mouse event, the event is passed as a parameter and\n * sent to the fire function for the custom events. When used as a method the\n * e param does not have any application.\n * @param {event} e\n * @return {Boolean} true if the active object has been discarded\n */\n discardActiveObject(e?: TPointerEvent): this is { _activeObject: undefined } {\n const currentActives = this.getActiveObjects(),\n activeObject = this.getActiveObject();\n if (currentActives.length) {\n this.fire('before:selection:cleared', {\n e,\n deselected: [activeObject!],\n });\n }\n const discarded = this._discardActiveObject(e);\n this._fireSelectionEvents(currentActives, e);\n return discarded;\n }\n\n /**\n * End the current transform.\n * You don't usually need to call this method unless you are interrupting a user initiated transform\n * because of some other event ( a press of key combination, or something that block the user UX )\n * @param {Event} [e] send the mouse event that generate the finalize down, so it can be used in the event\n */\n endCurrentTransform(e?: TPointerEvent) {\n const transform = this._currentTransform;\n this._finalizeCurrentTransform(e);\n if (transform && transform.target) {\n // this could probably go inside _finalizeCurrentTransform\n transform.target.isMoving = false;\n }\n this._currentTransform = null;\n }\n\n /**\n * @private\n * @param {Event} e send the mouse event that generate the finalize down, so it can be used in the event\n */\n _finalizeCurrentTransform(e?: TPointerEvent) {\n const transform = this._currentTransform!,\n target = transform.target,\n options = {\n e,\n target,\n transform,\n action: transform.action,\n };\n\n if (target._scaling) {\n target._scaling = false;\n }\n\n target.setCoords();\n\n if (transform.actionPerformed) {\n this.fire('object:modified', options);\n target.fire(MODIFIED, options);\n }\n }\n\n /**\n * Sets viewport transformation of this canvas instance\n * @param {Array} vpt a Canvas 2D API transform matrix\n */\n setViewportTransform(vpt: TMat2D) {\n super.setViewportTransform(vpt);\n const activeObject = this._activeObject;\n if (activeObject) {\n activeObject.setCoords();\n }\n }\n\n /**\n * @override clears active selection ref and interactive canvas elements and contexts\n */\n destroy() {\n // dispose of active selection\n const activeObject = this._activeObject;\n if (isActiveSelection(activeObject)) {\n activeObject.removeAll();\n activeObject.dispose();\n }\n\n delete this._activeObject;\n\n super.destroy();\n\n // free resources\n\n // pixel find canvas\n // @ts-expect-error disposing\n this.pixelFindContext = null;\n // @ts-expect-error disposing\n this.pixelFindCanvasEl = undefined;\n }\n\n /**\n * Clears all contexts (background, main, top) of an instance\n */\n clear() {\n // discard active object and fire events\n this.discardActiveObject();\n // make sure we clear the active object in case it refused to be discarded\n this._activeObject = undefined;\n this.clearContext(this.contextTop);\n super.clear();\n }\n\n /**\n * Draws objects' controls (borders/controls)\n * @param {CanvasRenderingContext2D} ctx Context to render controls on\n */\n drawControls(ctx: CanvasRenderingContext2D) {\n const activeObject = this._activeObject;\n\n if (activeObject) {\n activeObject._renderControls(ctx);\n }\n }\n\n /**\n * @private\n */\n protected _toObject(\n instance: FabricObject,\n methodName: 'toObject' | 'toDatalessObject',\n propertiesToInclude: string[],\n ): Record {\n // If the object is part of the current selection group, it should\n // be transformed appropriately\n // i.e. it should be serialised as it would appear if the selection group\n // were to be destroyed.\n const originalProperties = this._realizeGroupTransformOnObject(instance),\n object = super._toObject(instance, methodName, propertiesToInclude);\n //Undo the damage we did by changing all of its properties\n instance.set(originalProperties);\n return object;\n }\n\n /**\n * Realizes an object's group transformation on it\n * @private\n * @param {FabricObject} [instance] the object to transform (gets mutated)\n * @returns the original values of instance which were changed\n */\n private _realizeGroupTransformOnObject(\n instance: FabricObject,\n ): Partial {\n const { group } = instance;\n if (group && isActiveSelection(group) && this._activeObject === group) {\n const layoutProps = [\n 'angle',\n 'flipX',\n 'flipY',\n LEFT,\n SCALE_X,\n SCALE_Y,\n SKEW_X,\n SKEW_Y,\n TOP,\n ] as (keyof typeof instance)[];\n const originalValues = pick(instance, layoutProps);\n addTransformToObject(instance, group.calcOwnMatrix());\n return originalValues;\n } else {\n return {};\n }\n }\n\n /**\n * @private\n */\n _setSVGObject(\n markup: string[],\n instance: FabricObject,\n reviver?: TSVGReviver,\n ) {\n // If the object is in a selection group, simulate what would happen to that\n // object when the group is deselected\n const originalProperties = this._realizeGroupTransformOnObject(instance);\n super._setSVGObject(markup, instance, reviver);\n instance.set(originalProperties);\n }\n}\n","import type { TPointerEvent } from '../EventTypeDefs';\nimport type { ITextBehavior } from '../shapes/IText/ITextBehavior';\nimport { removeFromArray } from '../util/internals/removeFromArray';\nimport type { Canvas } from './Canvas';\n\n/**\n * In charge of synchronizing all interactive text instances of a canvas\n */\nexport class TextEditingManager {\n private targets: ITextBehavior[] = [];\n declare private target?: ITextBehavior;\n private __disposer: VoidFunction;\n\n constructor(canvas: Canvas) {\n const cb = () => {\n const { hiddenTextarea } =\n (canvas.getActiveObject() as ITextBehavior) || {};\n hiddenTextarea && hiddenTextarea.focus();\n };\n const el = canvas.upperCanvasEl;\n el.addEventListener('click', cb);\n this.__disposer = () => el.removeEventListener('click', cb);\n }\n\n exitTextEditing() {\n this.target = undefined;\n this.targets.forEach((target) => {\n if (target.isEditing) {\n target.exitEditing();\n }\n });\n }\n\n add(target: ITextBehavior) {\n this.targets.push(target);\n }\n\n remove(target: ITextBehavior) {\n this.unregister(target);\n removeFromArray(this.targets, target);\n }\n\n register(target: ITextBehavior) {\n this.target = target;\n }\n\n unregister(target: ITextBehavior) {\n if (target === this.target) {\n this.target = undefined;\n }\n }\n\n onMouseMove(e: TPointerEvent) {\n this.target?.isEditing && this.target.updateSelectionOnMouseMove(e);\n }\n\n clear() {\n this.targets = [];\n this.target = undefined;\n }\n\n dispose() {\n this.clear();\n this.__disposer();\n // @ts-expect-error disposing\n delete this.__disposer;\n }\n}\n","import { classRegistry } from '../ClassRegistry';\nimport { NONE } from '../constants';\nimport type {\n CanvasEvents,\n DragEventData,\n ObjectEvents,\n TEventsExtraData,\n TPointerEvent,\n TPointerEventNames,\n Transform,\n} from '../EventTypeDefs';\nimport { Point } from '../Point';\nimport type { ActiveSelection } from '../shapes/ActiveSelection';\nimport type { Group } from '../shapes/Group';\nimport type { IText } from '../shapes/IText/IText';\nimport type { FabricObject } from '../shapes/Object/FabricObject';\nimport { isTouchEvent, stopEvent } from '../util/dom_event';\nimport { getDocumentFromElement, getWindowFromElement } from '../util/dom_misc';\nimport { sendPointToPlane } from '../util/misc/planeChange';\nimport { isActiveSelection } from '../util/typeAssertions';\nimport type { CanvasOptions, TCanvasOptions } from './CanvasOptions';\nimport { SelectableCanvas } from './SelectableCanvas';\nimport { TextEditingManager } from './TextEditingManager';\n\nconst addEventOptions = { passive: false } as EventListenerOptions;\n\nconst getEventPoints = (canvas: Canvas, e: TPointerEvent) => {\n const viewportPoint = canvas.getViewportPoint(e);\n const scenePoint = canvas.getScenePoint(e);\n return {\n viewportPoint,\n scenePoint,\n };\n};\n\n// just to be clear, the utils are now deprecated and those are here exactly as minifier helpers\n// because el.addEventListener can't me be minified while a const yes and we use it 47 times in this file.\n// few bytes but why give it away.\nconst addListener = (\n el: HTMLElement | Document,\n ...args: Parameters\n) => el.addEventListener(...args);\nconst removeListener = (\n el: HTMLElement | Document,\n ...args: Parameters\n) => el.removeEventListener(...args);\n\nconst syntheticEventConfig = {\n mouse: {\n in: 'over',\n out: 'out',\n targetIn: 'mouseover',\n targetOut: 'mouseout',\n canvasIn: 'mouse:over',\n canvasOut: 'mouse:out',\n },\n drag: {\n in: 'enter',\n out: 'leave',\n targetIn: 'dragenter',\n targetOut: 'dragleave',\n canvasIn: 'drag:enter',\n canvasOut: 'drag:leave',\n },\n} as const;\n\ntype TSyntheticEventContext = {\n mouse: { e: TPointerEvent };\n drag: DragEventData;\n};\n\nexport class Canvas extends SelectableCanvas implements CanvasOptions {\n /**\n * Contains the id of the touch event that owns the fabric transform\n * @type Number\n * @private\n */\n declare mainTouchId?: number;\n\n declare enablePointerEvents: boolean;\n\n /**\n * Holds a reference to a setTimeout timer for event synchronization\n * @type number\n * @private\n */\n declare private _willAddMouseDown: number;\n\n /**\n * Holds a reference to an object on the canvas that is receiving the drag over event.\n * @type FabricObject\n * @private\n */\n declare private _draggedoverTarget?: FabricObject;\n\n /**\n * Holds a reference to an object on the canvas from where the drag operation started\n * @type FabricObject\n * @private\n */\n declare private _dragSource?: FabricObject;\n\n /**\n * Holds a reference to an object on the canvas that is the current drop target\n * May differ from {@link _draggedoverTarget}\n * @todo inspect whether {@link _draggedoverTarget} and {@link _dropTarget} should be merged somehow\n * @type FabricObject\n * @private\n */\n declare private _dropTarget: FabricObject | undefined;\n\n /**\n * a boolean that keeps track of the click state during a cycle of mouse down/up.\n * If a mouse move occurs it becomes false.\n * Is true by default, turns false on mouse move.\n * Used to determine if a mouseUp is a click\n */\n private _isClick: boolean;\n\n textEditingManager = new TextEditingManager(this);\n\n constructor(el?: string | HTMLCanvasElement, options: TCanvasOptions = {}) {\n super(el, options);\n // bind event handlers\n (\n [\n '_onMouseDown',\n '_onTouchStart',\n '_onMouseMove',\n '_onMouseUp',\n '_onTouchEnd',\n '_onResize',\n // '_onGesture',\n // '_onDrag',\n // '_onShake',\n // '_onLongPress',\n // '_onOrientationChange',\n '_onMouseWheel',\n '_onMouseOut',\n '_onMouseEnter',\n '_onContextMenu',\n '_onClick',\n '_onDragStart',\n '_onDragEnd',\n '_onDragProgress',\n '_onDragOver',\n '_onDragEnter',\n '_onDragLeave',\n '_onDrop',\n ] as (keyof this)[]\n ).forEach((eventHandler) => {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-function-type\n this[eventHandler] = (this[eventHandler] as Function).bind(this);\n });\n // register event handlers\n this.addOrRemove(addListener, 'add');\n }\n\n /**\n * return an event prefix pointer or mouse.\n * @private\n */\n private _getEventPrefix() {\n return this.enablePointerEvents ? 'pointer' : 'mouse';\n }\n\n addOrRemove(functor: any, _eventjsFunctor: 'add' | 'remove') {\n const canvasElement = this.upperCanvasEl,\n eventTypePrefix = this._getEventPrefix();\n functor(getWindowFromElement(canvasElement), 'resize', this._onResize);\n functor(canvasElement, eventTypePrefix + 'down', this._onMouseDown);\n functor(\n canvasElement,\n `${eventTypePrefix}move`,\n this._onMouseMove,\n addEventOptions,\n );\n functor(canvasElement, `${eventTypePrefix}out`, this._onMouseOut);\n functor(canvasElement, `${eventTypePrefix}enter`, this._onMouseEnter);\n functor(canvasElement, 'wheel', this._onMouseWheel);\n functor(canvasElement, 'contextmenu', this._onContextMenu);\n functor(canvasElement, 'click', this._onClick);\n // decide if to remove in fabric 7.0\n functor(canvasElement, 'dblclick', this._onClick);\n functor(canvasElement, 'dragstart', this._onDragStart);\n functor(canvasElement, 'dragend', this._onDragEnd);\n functor(canvasElement, 'dragover', this._onDragOver);\n functor(canvasElement, 'dragenter', this._onDragEnter);\n functor(canvasElement, 'dragleave', this._onDragLeave);\n functor(canvasElement, 'drop', this._onDrop);\n if (!this.enablePointerEvents) {\n functor(canvasElement, 'touchstart', this._onTouchStart, addEventOptions);\n }\n // if (typeof eventjs !== 'undefined' && eventjsFunctor in eventjs) {\n // eventjs[eventjsFunctor](canvasElement, 'gesture', this._onGesture);\n // eventjs[eventjsFunctor](canvasElement, 'drag', this._onDrag);\n // eventjs[eventjsFunctor](\n // canvasElement,\n // 'orientation',\n // this._onOrientationChange\n // );\n // eventjs[eventjsFunctor](canvasElement, 'shake', this._onShake);\n // eventjs[eventjsFunctor](canvasElement, 'longpress', this._onLongPress);\n // }\n }\n\n /**\n * Removes all event listeners, used when disposing the instance\n */\n removeListeners() {\n this.addOrRemove(removeListener, 'remove');\n // if you dispose on a mouseDown, before mouse up, you need to clean document to...\n const eventTypePrefix = this._getEventPrefix();\n const doc = getDocumentFromElement(this.upperCanvasEl);\n removeListener(\n doc,\n `${eventTypePrefix}up`,\n this._onMouseUp as EventListener,\n );\n removeListener(\n doc,\n 'touchend',\n this._onTouchEnd as EventListener,\n addEventOptions,\n );\n removeListener(\n doc,\n `${eventTypePrefix}move`,\n this._onMouseMove as EventListener,\n addEventOptions,\n );\n removeListener(\n doc,\n 'touchmove',\n this._onMouseMove as EventListener,\n addEventOptions,\n );\n clearTimeout(this._willAddMouseDown);\n }\n\n /**\n * @private\n * @param {Event} [e] Event object fired on wheel event\n */\n private _onMouseWheel(e: MouseEvent) {\n this._cacheTransformEventData(e);\n this._handleEvent(e, 'wheel');\n this._resetTransformEventData();\n }\n\n /**\n * @private\n * @param {Event} e Event object fired on mousedown\n */\n private _onMouseOut(e: TPointerEvent) {\n const target = this._hoveredTarget;\n const shared = {\n e,\n ...getEventPoints(this, e),\n };\n this.fire('mouse:out', { ...shared, target });\n this._hoveredTarget = undefined;\n target && target.fire('mouseout', { ...shared });\n this._hoveredTargets.forEach((nestedTarget) => {\n this.fire('mouse:out', { ...shared, target: nestedTarget });\n nestedTarget && nestedTarget.fire('mouseout', { ...shared });\n });\n this._hoveredTargets = [];\n }\n\n /**\n * @private\n * Used when the mouse cursor enter the canvas from outside\n * @param {Event} e Event object fired on mouseenter\n */\n private _onMouseEnter(e: TPointerEvent) {\n // This find target and consequent 'mouse:over' is used to\n // clear old instances on hovered target.\n // calling findTarget has the side effect of killing target.__corner.\n // as a short term fix we are not firing this if we are currently transforming.\n // as a long term fix we need to separate the action of finding a target with the\n // side effects we added to it.\n const { target } = this.findTarget(e);\n // we fire the event only when there is no target, if there is a target, the specific\n // target event will fire.\n if (!this._currentTransform && !target) {\n this.fire('mouse:over', {\n e,\n ...getEventPoints(this, e),\n });\n this._hoveredTarget = undefined;\n this._hoveredTargets = [];\n }\n }\n\n /**\n * supports native like text dragging\n * @private\n * @param {DragEvent} e\n */\n private _onDragStart(e: DragEvent) {\n this._isClick = false;\n const activeObject = this.getActiveObject();\n if (activeObject && activeObject.onDragStart(e)) {\n this._dragSource = activeObject;\n const options = { e, target: activeObject };\n this.fire('dragstart', options);\n activeObject.fire('dragstart', options);\n addListener(\n this.upperCanvasEl,\n 'drag',\n this._onDragProgress as EventListener,\n );\n return;\n }\n stopEvent(e);\n }\n\n /**\n * First we clear top context where the effects are being rendered.\n * Then we render the effects.\n * Doing so will render the correct effect for all cases including an overlap between `source` and `target`.\n * @private\n */\n private _renderDragEffects(\n e: DragEvent,\n source?: FabricObject,\n target?: FabricObject,\n ) {\n let dirty = false;\n // clear top context\n const dropTarget = this._dropTarget;\n if (dropTarget && dropTarget !== source && dropTarget !== target) {\n dropTarget.clearContextTop();\n dirty = true;\n }\n source?.clearContextTop();\n target !== source && target?.clearContextTop();\n // render effects\n const ctx = this.contextTop;\n ctx.save();\n ctx.transform(...this.viewportTransform);\n if (source) {\n ctx.save();\n source.transform(ctx);\n source.renderDragSourceEffect(e);\n ctx.restore();\n dirty = true;\n }\n if (target) {\n ctx.save();\n target.transform(ctx);\n target.renderDropTargetEffect(e);\n ctx.restore();\n dirty = true;\n }\n ctx.restore();\n dirty && (this.contextTopDirty = true);\n }\n\n /**\n * supports native like text dragging\n * https://developer.mozilla.org/en-US/docs/Web/API/HTML_Drag_and_Drop_API/Drag_operations#finishing_a_drag\n * @private\n * @param {DragEvent} e\n */\n private _onDragEnd(e: DragEvent) {\n const { currentSubTargets } = this.findTarget(e);\n const didDrop = !!e.dataTransfer && e.dataTransfer.dropEffect !== NONE,\n dropTarget = didDrop ? this._activeObject : undefined,\n options = {\n e,\n target: this._dragSource as FabricObject,\n subTargets: currentSubTargets,\n dragSource: this._dragSource as FabricObject,\n didDrop,\n dropTarget: dropTarget as FabricObject,\n };\n removeListener(\n this.upperCanvasEl,\n 'drag',\n this._onDragProgress as EventListener,\n );\n this.fire('dragend', options);\n this._dragSource && this._dragSource.fire('dragend', options);\n delete this._dragSource;\n // we need to call mouse up synthetically because the browser won't\n this._onMouseUp(e);\n }\n\n /**\n * fire `drag` event on canvas and drag source\n * @private\n * @param {DragEvent} e\n */\n private _onDragProgress(e: DragEvent) {\n const options = {\n e,\n target: this._dragSource,\n dragSource: this._dragSource,\n dropTarget: this._draggedoverTarget as FabricObject,\n };\n this.fire('drag', options);\n this._dragSource && this._dragSource.fire('drag', options);\n }\n\n /**\n * prevent default to allow drop event to be fired\n * https://developer.mozilla.org/en-US/docs/Web/API/HTML_Drag_and_Drop_API/Drag_operations#specifying_drop_targets\n * @private\n * @param {DragEvent} [e] Event object fired on Event.js shake\n */\n private _onDragOver(e: DragEvent) {\n const eventType = 'dragover';\n const { currentContainer: target, currentSubTargets } = this.findTarget(e);\n const dragSource = this._dragSource as FabricObject;\n const options = {\n e,\n target,\n subTargets: currentSubTargets,\n dragSource,\n canDrop: false,\n dropTarget: undefined,\n };\n let dropTarget;\n // fire on canvas\n this.fire(eventType, options);\n // make sure we fire dragenter events before dragover\n // if dragleave is needed, object will not fire dragover so we don't need to trouble ourselves with it\n this._fireEnterLeaveEvents(e, target, options);\n if (target) {\n if (target.canDrop(e)) {\n dropTarget = target;\n }\n target.fire(eventType, options);\n }\n // propagate the event to subtargets\n for (let i = 0; i < currentSubTargets.length; i++) {\n const subTarget = currentSubTargets[i];\n // accept event only if previous targets didn't (the accepting target calls `preventDefault` to inform that the event is taken)\n // TODO: verify if those should loop in inverse order then?\n // what is the order of subtargets?\n if (subTarget.canDrop(e)) {\n dropTarget = subTarget;\n }\n subTarget.fire(eventType, options);\n }\n // render drag effects now that relations between source and target is clear\n this._renderDragEffects(e, dragSource, dropTarget);\n this._dropTarget = dropTarget;\n }\n\n /**\n * fire `dragleave` on `dragover` targets\n * @private\n * @param {Event} [e] Event object fired on Event.js shake\n */\n private _onDragEnter(e: DragEvent) {\n const { currentContainer, currentSubTargets } = this.findTarget(e);\n const options = {\n e,\n target: currentContainer,\n subTargets: currentSubTargets,\n dragSource: this._dragSource,\n };\n this.fire('dragenter', options);\n // fire dragenter on targets\n this._fireEnterLeaveEvents(e, currentContainer, options);\n }\n\n /**\n * fire `dragleave` on `dragover` targets\n * @private\n * @param {Event} [e] Event object fired on Event.js shake\n */\n private _onDragLeave(e: DragEvent) {\n const { currentSubTargets } = this.findTarget(e);\n const options = {\n e,\n target: this._draggedoverTarget,\n subTargets: currentSubTargets,\n dragSource: this._dragSource,\n };\n this.fire('dragleave', options);\n\n // fire dragleave on targets\n this._fireEnterLeaveEvents(e, undefined, options);\n this._renderDragEffects(e, this._dragSource);\n this._dropTarget = undefined;\n this._hoveredTargets = [];\n }\n\n /**\n * `drop:before` is a an event that allows you to schedule logic\n * before the `drop` event. Prefer `drop` event always, but if you need\n * to run some drop-disabling logic on an event, since there is no way\n * to handle event handlers ordering, use `drop:before`\n * @private\n * @param {Event} e\n */\n private _onDrop(e: DragEvent) {\n const { currentContainer, currentSubTargets } = this.findTarget(e);\n const options = this._basicEventHandler('drop:before', {\n e,\n target: currentContainer,\n subTargets: currentSubTargets,\n dragSource: this._dragSource,\n ...getEventPoints(this, e),\n });\n // will be set by the drop target\n options.didDrop = false;\n // will be set by the drop target, used in case options.target refuses the drop\n options.dropTarget = undefined;\n // fire `drop`\n this._basicEventHandler('drop', options);\n // inform canvas of the drop\n // we do this because canvas was unaware of what happened at the time the `drop` event was fired on it\n // use for side effects\n this.fire('drop:after', options);\n }\n\n /**\n * @private\n * @param {Event} e Event object fired on mousedown\n */\n private _onContextMenu(e: TPointerEvent): false {\n const { target, subTargets } = this.findTarget(e);\n const options = this._basicEventHandler('contextmenu:before', {\n e,\n target,\n subTargets,\n });\n // TODO: this line is silly because the dev can subscribe to the event and prevent it themselves\n this.stopContextMenu && stopEvent(e);\n this._basicEventHandler('contextmenu', options);\n return false;\n }\n\n /**\n * @private\n * @param {Event} e Event object fired on mousedown\n */\n private _onClick(e: TPointerEvent) {\n const clicks = e.detail;\n if (clicks > 3 || clicks < 2) return;\n this._cacheTransformEventData(e);\n clicks == 2 && e.type === 'dblclick' && this._handleEvent(e, 'dblclick');\n clicks == 3 && this._handleEvent(e, 'tripleclick');\n this._resetTransformEventData();\n }\n\n /**\n * Return a the id of an event.\n * returns either the pointerId or the identifier or 0 for the mouse event\n * @private\n * @param {Event} evt Event object\n */\n getPointerId(evt: TouchEvent | PointerEvent): number {\n const changedTouches = (evt as TouchEvent).changedTouches;\n\n if (changedTouches) {\n return changedTouches[0] && changedTouches[0].identifier;\n }\n\n if (this.enablePointerEvents) {\n return (evt as PointerEvent).pointerId;\n }\n\n return -1;\n }\n\n /**\n * Determines if an event has the id of the event that is considered main\n * @private\n * @param {evt} event Event object\n */\n _isMainEvent(evt: TPointerEvent): boolean {\n if ((evt as PointerEvent).isPrimary === true) {\n return true;\n }\n if ((evt as PointerEvent).isPrimary === false) {\n return false;\n }\n if (evt.type === 'touchend' && (evt as TouchEvent).touches.length === 0) {\n return true;\n }\n if ((evt as TouchEvent).changedTouches) {\n return (\n (evt as TouchEvent).changedTouches[0].identifier === this.mainTouchId\n );\n }\n return true;\n }\n\n /**\n * @private\n * @param {Event} e Event object fired on mousedown\n */\n _onTouchStart(e: TouchEvent) {\n this._cacheTransformEventData(e);\n // we will prevent scrolling if allowTouchScrolling is not enabled and\n let shouldPreventScrolling = !this.allowTouchScrolling;\n const currentActiveObject = this._activeObject;\n if (this.mainTouchId === undefined) {\n this.mainTouchId = this.getPointerId(e);\n }\n this.__onMouseDown(e);\n const { target } = this.findTarget(e);\n // after executing fabric logic for mouse down let's see\n // if we didn't change target or if we are drawing\n // we want to prevent scrolling anyway\n if (\n this.isDrawingMode ||\n (currentActiveObject && target === currentActiveObject)\n ) {\n shouldPreventScrolling = true;\n }\n // prevent default, will block scrolling from start\n shouldPreventScrolling && e.preventDefault();\n const canvasElement = this.upperCanvasEl,\n eventTypePrefix = this._getEventPrefix();\n const doc = getDocumentFromElement(canvasElement);\n addListener(\n doc,\n 'touchend',\n this._onTouchEnd as EventListener,\n addEventOptions,\n );\n // if we scroll don't register the touch move event\n shouldPreventScrolling &&\n addListener(\n doc,\n 'touchmove',\n this._onMouseMove as EventListener,\n addEventOptions,\n );\n // Unbind mousedown to prevent double triggers from touch devices\n removeListener(\n canvasElement,\n `${eventTypePrefix}down`,\n this._onMouseDown as EventListener,\n );\n this._resetTransformEventData();\n }\n\n /**\n * @private\n * @param {Event} e Event object fired on mousedown\n */\n _onMouseDown(e: TPointerEvent) {\n this._cacheTransformEventData(e);\n this.__onMouseDown(e);\n const canvasElement = this.upperCanvasEl,\n eventTypePrefix = this._getEventPrefix();\n // switch from moving on the canvas element to moving on the document\n removeListener(\n canvasElement,\n `${eventTypePrefix}move`,\n this._onMouseMove as EventListener,\n addEventOptions,\n );\n const doc = getDocumentFromElement(canvasElement);\n addListener(doc, `${eventTypePrefix}up`, this._onMouseUp as EventListener);\n addListener(\n doc,\n `${eventTypePrefix}move`,\n this._onMouseMove as EventListener,\n addEventOptions,\n );\n this._resetTransformEventData();\n }\n\n /**\n * @private\n * @param {Event} e Event object fired on mousedown\n */\n _onTouchEnd(e: TouchEvent) {\n if (e.touches.length > 0) {\n // if there are still touches stop here\n return;\n }\n this._cacheTransformEventData(e);\n this.__onMouseUp(e);\n this._resetTransformEventData();\n delete this.mainTouchId;\n const eventTypePrefix = this._getEventPrefix();\n const doc = getDocumentFromElement(this.upperCanvasEl);\n removeListener(\n doc,\n 'touchend',\n this._onTouchEnd as EventListener,\n addEventOptions,\n );\n removeListener(\n doc,\n 'touchmove',\n this._onMouseMove as EventListener,\n addEventOptions,\n );\n if (this._willAddMouseDown) {\n clearTimeout(this._willAddMouseDown);\n }\n this._willAddMouseDown = setTimeout(() => {\n // Wait 400ms before rebinding mousedown to prevent double triggers\n // from touch devices\n addListener(\n this.upperCanvasEl,\n `${eventTypePrefix}down`,\n this._onMouseDown as EventListener,\n );\n this._willAddMouseDown = 0;\n }, 400) as unknown as number;\n }\n\n /**\n * @private\n * @param {Event} e Event object fired on mouseup\n */\n _onMouseUp(e: TPointerEvent) {\n this._cacheTransformEventData(e);\n this.__onMouseUp(e);\n const canvasElement = this.upperCanvasEl,\n eventTypePrefix = this._getEventPrefix();\n if (this._isMainEvent(e)) {\n const doc = getDocumentFromElement(this.upperCanvasEl);\n removeListener(\n doc,\n `${eventTypePrefix}up`,\n this._onMouseUp as EventListener,\n );\n removeListener(\n doc,\n `${eventTypePrefix}move`,\n this._onMouseMove as EventListener,\n addEventOptions,\n );\n addListener(\n canvasElement,\n `${eventTypePrefix}move`,\n this._onMouseMove as EventListener,\n addEventOptions,\n );\n }\n this._resetTransformEventData();\n }\n\n /**\n * @private\n * @param {Event} e Event object fired on mousemove\n */\n _onMouseMove(e: TPointerEvent) {\n this._cacheTransformEventData(e);\n\n const activeObject = this.getActiveObject();\n !this.allowTouchScrolling &&\n (!activeObject ||\n // a drag event sequence is started by the active object flagging itself on mousedown / mousedown:before\n // we must not prevent the event's default behavior in order for the window to start dragging\n !activeObject.shouldStartDragging(e)) &&\n e.preventDefault &&\n e.preventDefault();\n this.__onMouseMove(e);\n this._resetTransformEventData();\n }\n\n /**\n * @private\n */\n _onResize() {\n this.calcOffset();\n this._resetTransformEventData();\n }\n\n /**\n * Decides whether the canvas should be redrawn in mouseup and mousedown events.\n * @private\n * @param {Object} target\n */\n _shouldRender(target: FabricObject | undefined) {\n const activeObject = this.getActiveObject();\n // if just one of them is available or if they are both but are different objects\n // this covers: switch of target, from target to no target, selection of target\n // multiSelection with key and mouse\n return (\n !!activeObject !== !!target ||\n (activeObject && target && activeObject !== target)\n );\n }\n\n /**\n * Method that defines the actions when mouse is released on canvas.\n * The method resets the currentTransform parameters, store the image corner\n * position in the image object and render the canvas on top.\n * @private\n * @param {Event} e Event object fired on mouseup\n */\n __onMouseUp(e: TPointerEvent) {\n this._handleEvent(e, 'up:before');\n\n const transform = this._currentTransform;\n const isClick = this._isClick;\n const { target } = this.findTarget(e);\n\n // if right/middle click just fire events and return\n // target undefined will make the _handleEvent search the target\n const { button } = e as MouseEvent;\n if (button) {\n ((this.fireMiddleClick && button === 1) ||\n (this.fireRightClick && button === 2)) &&\n this._handleEvent(e, 'up');\n return;\n }\n\n if (this.isDrawingMode && this._isCurrentlyDrawing) {\n this._onMouseUpInDrawingMode(e);\n return;\n }\n\n if (!this._isMainEvent(e)) {\n return;\n }\n let shouldRender = false;\n if (transform) {\n this._finalizeCurrentTransform(e);\n shouldRender = transform.actionPerformed;\n }\n if (!isClick) {\n const targetWasActive = target === this._activeObject;\n this.handleSelection(e);\n if (!shouldRender) {\n shouldRender =\n this._shouldRender(target) ||\n (!targetWasActive && target === this._activeObject);\n }\n }\n let pointer, corner;\n if (target) {\n const found = target.findControl(\n this.getViewportPoint(e),\n isTouchEvent(e),\n );\n const { key, control } = found || {};\n corner = key;\n if (\n target.selectable &&\n target !== this._activeObject &&\n target.activeOn === 'up'\n ) {\n this.setActiveObject(target, e);\n shouldRender = true;\n } else if (control) {\n const mouseUpHandler = control.getMouseUpHandler(e, target, control);\n if (mouseUpHandler) {\n pointer = this.getScenePoint(e);\n mouseUpHandler.call(control, e, transform!, pointer.x, pointer.y);\n }\n }\n target.isMoving = false;\n }\n // if we are ending up a transform on a different control or a new object\n // fire the original mouse up from the corner that started the transform\n if (\n transform &&\n (transform.target !== target || transform.corner !== corner)\n ) {\n const originalControl =\n transform.target && transform.target.controls[transform.corner],\n originalMouseUpHandler =\n originalControl &&\n originalControl.getMouseUpHandler(\n e,\n transform.target,\n originalControl,\n );\n pointer = pointer || this.getScenePoint(e);\n originalMouseUpHandler &&\n originalMouseUpHandler.call(\n originalControl,\n e,\n transform,\n pointer.x,\n pointer.y,\n );\n }\n this._setCursorFromEvent(e, target);\n this._handleEvent(e, 'up');\n this._groupSelector = null;\n this._currentTransform = null;\n // reset the target information about which corner is selected\n target && (target.__corner = undefined);\n if (shouldRender) {\n this.requestRenderAll();\n } else if (!isClick && !(this._activeObject as IText)?.isEditing) {\n this.renderTop();\n }\n }\n\n _basicEventHandler(\n eventType: T,\n options: (CanvasEvents & ObjectEvents)[T],\n ) {\n const { target, subTargets = [] } = options as {\n target?: FabricObject;\n subTargets: FabricObject[];\n };\n this.fire(eventType, options);\n target && target.fire(eventType, options);\n for (let i = 0; i < subTargets.length; i++) {\n subTargets[i] !== target && subTargets[i].fire(eventType, options);\n }\n return options;\n }\n\n /**\n * @private\n * Handle event firing for target and subtargets\n * @param {TPointerEvent} e event from mouse\n * @param {TPointerEventNames} eventType\n */\n _handleEvent(\n e: TPointerEvent,\n eventType: T,\n extraData?: TEventsExtraData[T],\n ) {\n const { target, subTargets } = this.findTarget(e),\n options: CanvasEvents[`mouse:${T}`] = {\n e,\n target,\n subTargets,\n ...getEventPoints(this, e),\n transform: this._currentTransform,\n ...(eventType === 'down:before' || eventType === 'down'\n ? extraData\n : {}),\n } as CanvasEvents[`mouse:${T}`];\n if (eventType === 'up:before' || eventType === 'up') {\n (options as CanvasEvents[`mouse:up`]).isClick = this._isClick;\n }\n this.fire(`mouse:${eventType}`, options);\n // this may be a little be more complicated of what we want to handle\n target && target.fire(`mouse${eventType}`, options);\n for (let i = 0; i < subTargets.length; i++) {\n subTargets[i] !== target &&\n subTargets[i].fire(`mouse${eventType}`, options);\n }\n }\n\n /**\n * @private\n * @param {Event} e Event object fired on mousedown\n */\n _onMouseDownInDrawingMode(e: TPointerEvent) {\n this._isCurrentlyDrawing = true;\n if (this.getActiveObject()) {\n this.discardActiveObject(e);\n this.requestRenderAll();\n }\n // TODO: this is a scene point so it should be renamed\n const pointer = this.getScenePoint(e);\n this.freeDrawingBrush &&\n this.freeDrawingBrush.onMouseDown(pointer, { e, pointer });\n this._handleEvent(e, 'down', { alreadySelected: false });\n }\n\n /**\n * @private\n * @param {Event} e Event object fired on mousemove\n */\n _onMouseMoveInDrawingMode(e: TPointerEvent) {\n if (this._isCurrentlyDrawing) {\n const pointer = this.getScenePoint(e);\n this.freeDrawingBrush &&\n this.freeDrawingBrush.onMouseMove(pointer, {\n e,\n // this is an absolute pointer, the naming is wrong\n pointer,\n });\n }\n this.setCursor(this.freeDrawingCursor);\n this._handleEvent(e, 'move');\n }\n\n /**\n * @private\n * @param {Event} e Event object fired on mouseup\n */\n _onMouseUpInDrawingMode(e: TPointerEvent) {\n const pointer = this.getScenePoint(e);\n if (this.freeDrawingBrush) {\n this._isCurrentlyDrawing = !!this.freeDrawingBrush.onMouseUp({\n e: e,\n // this is an absolute pointer, the naming is wrong\n pointer,\n });\n } else {\n this._isCurrentlyDrawing = false;\n }\n this._handleEvent(e, 'up');\n }\n\n /**\n * Method that defines the actions when mouse is clicked on canvas.\n * The method inits the currentTransform parameters and renders all the\n * canvas so the current image can be placed on the top canvas and the rest\n * in on the container one.\n * @private\n * @param {Event} e Event object fired on mousedown\n */\n __onMouseDown(e: TPointerEvent) {\n this._isClick = true;\n this._handleEvent(e, 'down:before');\n\n let { target } = this.findTarget(e);\n let alreadySelected = !!target && target === this._activeObject;\n // if right/middle click just fire events\n const { button } = e as MouseEvent;\n if (button) {\n ((this.fireMiddleClick && button === 1) ||\n (this.fireRightClick && button === 2)) &&\n this._handleEvent(e, 'down', {\n alreadySelected,\n });\n return;\n }\n\n if (this.isDrawingMode) {\n this._onMouseDownInDrawingMode(e);\n return;\n }\n\n if (!this._isMainEvent(e)) {\n return;\n }\n\n // ignore if some object is being transformed at this moment\n if (this._currentTransform) {\n return;\n }\n\n let shouldRender = this._shouldRender(target);\n let grouped = false;\n if (this.handleMultiSelection(e, target)) {\n // active object might have changed while grouping\n target = this._activeObject;\n grouped = true;\n shouldRender = true;\n } else if (this._shouldClearSelection(e, target)) {\n this.discardActiveObject(e);\n }\n // we start a group selector rectangle if\n // selection is enabled\n // and there is no target, or the following 3 conditions are satisfied:\n // target is not selectable ( otherwise we selected it )\n // target is not editing\n // target is not already selected ( otherwise we drag )\n if (\n this.selection &&\n (!target ||\n (!target.selectable &&\n !(target as IText).isEditing &&\n target !== this._activeObject))\n ) {\n const p = this.getScenePoint(e);\n this._groupSelector = {\n x: p.x,\n y: p.y,\n deltaY: 0,\n deltaX: 0,\n };\n }\n\n // check again because things could have changed\n alreadySelected = !!target && target === this._activeObject;\n if (target) {\n if (target.selectable && target.activeOn === 'down') {\n this.setActiveObject(target, e);\n }\n const handle = target.findControl(\n this.getViewportPoint(e),\n isTouchEvent(e),\n );\n if (target === this._activeObject && (handle || !grouped)) {\n this._setupCurrentTransform(e, target, alreadySelected);\n const control = handle ? handle.control : undefined,\n pointer = this.getScenePoint(e),\n mouseDownHandler =\n control && control.getMouseDownHandler(e, target, control);\n mouseDownHandler &&\n mouseDownHandler.call(\n control,\n e,\n this._currentTransform!,\n pointer.x,\n pointer.y,\n );\n }\n }\n // we clear `_objectsToRender` in case of a change in order to repopulate it at rendering\n // run before firing the `down` event to give the dev a chance to populate it themselves\n shouldRender && (this._objectsToRender = undefined);\n this._handleEvent(e, 'down', { alreadySelected: alreadySelected });\n // we must renderAll so that we update the visuals\n shouldRender && this.requestRenderAll();\n }\n\n /**\n * reset cache form common information needed during event processing\n * @private\n */\n _resetTransformEventData() {\n this._targetInfo = this._viewportPoint = this._scenePoint = undefined;\n }\n\n /**\n * Cache common information needed during event processing\n * @private\n * @param {Event} e Event object fired on event\n */\n _cacheTransformEventData(e: TPointerEvent) {\n // reset in order to avoid stale caching\n this._resetTransformEventData();\n this._viewportPoint = this.getViewportPoint(e);\n this._scenePoint = sendPointToPlane(\n this._viewportPoint,\n undefined,\n this.viewportTransform,\n );\n this._targetInfo = this.findTarget(e);\n // TODO: investigate better if this can be made less implicit in the code\n if (this._currentTransform) {\n this._targetInfo.target = this._currentTransform.target;\n }\n }\n\n /**\n * Method that defines the actions when mouse is hovering the canvas.\n * The currentTransform parameter will define whether the user is rotating/scaling/translating\n * an image or neither of them (only hovering). A group selection is also possible and would cancel\n * all any other type of action.\n * In case of an image transformation only the top canvas will be rendered.\n * @private\n * @param {Event} e Event object fired on mousemove\n */\n __onMouseMove(e: TPointerEvent) {\n this._isClick = false;\n this._handleEvent(e, 'move:before');\n\n if (this.isDrawingMode) {\n this._onMouseMoveInDrawingMode(e);\n return;\n }\n\n if (!this._isMainEvent(e)) {\n return;\n }\n\n const groupSelector = this._groupSelector;\n\n // We initially clicked in an empty area, so we draw a box for multiple selection\n if (groupSelector) {\n const pointer = this.getScenePoint(e);\n\n groupSelector.deltaX = pointer.x - groupSelector.x;\n groupSelector.deltaY = pointer.y - groupSelector.y;\n\n this.renderTop();\n } else if (!this._currentTransform) {\n const { target } = this.findTarget(e);\n this._setCursorFromEvent(e, target);\n this._fireOverOutEvents(e, target);\n } else {\n this._transformObject(e);\n }\n this.textEditingManager.onMouseMove(e);\n this._handleEvent(e, 'move');\n }\n\n /**\n * Manage the mouseout, mouseover events for the fabric object on the canvas\n * @param {Fabric.Object} target the target where the target from the mousemove event\n * @param {Event} e Event object fired on mousemove\n * @private\n */\n _fireOverOutEvents(e: TPointerEvent, target?: FabricObject) {\n const _hoveredTarget = this._hoveredTarget,\n _hoveredTargets = this._hoveredTargets,\n { subTargets } = this.findTarget(e),\n length = Math.max(_hoveredTargets.length, subTargets.length);\n\n this.fireSyntheticInOutEvents('mouse', {\n e,\n target,\n oldTarget: _hoveredTarget,\n fireCanvas: true,\n });\n for (let i = 0; i < length; i++) {\n this.fireSyntheticInOutEvents('mouse', {\n e,\n target: subTargets[i],\n oldTarget: _hoveredTargets[i],\n });\n }\n this._hoveredTarget = target;\n this._hoveredTargets = subTargets;\n }\n\n /**\n * Manage the dragEnter, dragLeave events for the fabric objects on the canvas\n * @param {Fabric.Object} target the target where the target from the onDrag event\n * @param {Object} data Event object fired on dragover\n * @private\n */\n _fireEnterLeaveEvents(\n e: TPointerEvent,\n target: FabricObject | undefined,\n data: DragEventData,\n ) {\n const draggedoverTarget = this._draggedoverTarget,\n _hoveredTargets = this._hoveredTargets,\n { subTargets } = this.findTarget(e),\n length = Math.max(_hoveredTargets.length, subTargets.length);\n\n this.fireSyntheticInOutEvents('drag', {\n ...data,\n target,\n oldTarget: draggedoverTarget,\n fireCanvas: true,\n });\n for (let i = 0; i < length; i++) {\n this.fireSyntheticInOutEvents('drag', {\n ...data,\n target: subTargets[i],\n oldTarget: _hoveredTargets[i],\n });\n }\n this._draggedoverTarget = target;\n }\n\n /**\n * Manage the synthetic in/out events for the fabric objects on the canvas\n * @param {Fabric.Object} target the target where the target from the supported events\n * @param {Object} data Event object fired\n * @param {Object} config configuration for the function to work\n * @param {String} config.targetName property on the canvas where the old target is stored\n * @param {String} [config.canvasEvtOut] name of the event to fire at canvas level for out\n * @param {String} config.evtOut name of the event to fire for out\n * @param {String} [config.canvasEvtIn] name of the event to fire at canvas level for in\n * @param {String} config.evtIn name of the event to fire for in\n * @private\n */\n fireSyntheticInOutEvents(\n type: T,\n {\n target,\n oldTarget,\n fireCanvas,\n e,\n ...data\n }: TSyntheticEventContext[T] & {\n target?: FabricObject;\n oldTarget?: FabricObject;\n fireCanvas?: boolean;\n },\n ) {\n const { targetIn, targetOut, canvasIn, canvasOut } =\n syntheticEventConfig[type];\n const targetChanged = oldTarget !== target;\n\n if (oldTarget && targetChanged) {\n const outOpt: CanvasEvents[typeof canvasOut] = {\n ...data,\n e,\n target: oldTarget,\n nextTarget: target,\n ...getEventPoints(this, e),\n };\n fireCanvas && this.fire(canvasOut, outOpt);\n oldTarget.fire(targetOut, outOpt);\n }\n if (target && targetChanged) {\n const inOpt: CanvasEvents[typeof canvasIn] = {\n ...data,\n e,\n target,\n previousTarget: oldTarget,\n ...getEventPoints(this, e),\n };\n fireCanvas && this.fire(canvasIn, inOpt);\n target.fire(targetIn, inOpt);\n }\n }\n\n /**\n * @private\n * @param {Event} e Event fired on mousemove\n */\n _transformObject(e: TPointerEvent) {\n const scenePoint = this.getScenePoint(e),\n transform = this._currentTransform!,\n target = transform.target,\n // transform pointer to target's containing coordinate plane\n // both pointer and object should agree on every point\n localPointer = target.group\n ? sendPointToPlane(\n scenePoint,\n undefined,\n target.group.calcTransformMatrix(),\n )\n : scenePoint;\n transform.shiftKey = e.shiftKey;\n transform.altKey = !!this.centeredKey && e[this.centeredKey];\n\n this._performTransformAction(e, transform, localPointer);\n transform.actionPerformed && this.requestRenderAll();\n }\n\n /**\n * @private\n */\n _performTransformAction(\n e: TPointerEvent,\n transform: Transform,\n pointer: Point,\n ) {\n const { action, actionHandler, target } = transform;\n\n const actionPerformed =\n !!actionHandler && actionHandler(e, transform, pointer.x, pointer.y);\n actionPerformed && target.setCoords();\n\n // this object could be created from the function in the control handlers\n if (action === 'drag' && actionPerformed) {\n transform.target.isMoving = true;\n this.setCursor(transform.target.moveCursor || this.moveCursor);\n }\n transform.actionPerformed = transform.actionPerformed || actionPerformed;\n }\n\n /**\n * Sets the cursor depending on where the canvas is being hovered.\n * Note: very buggy in Opera\n * @param {Event} e Event object\n * @param {Object} target Object that the mouse is hovering, if so.\n */\n _setCursorFromEvent(e: TPointerEvent, target?: FabricObject) {\n if (!target) {\n this.setCursor(this.defaultCursor);\n return;\n }\n let hoverCursor = target.hoverCursor || this.hoverCursor;\n const activeSelection = isActiveSelection(this._activeObject)\n ? this._activeObject\n : null,\n // only show proper corner when group selection is not active\n corner =\n (!activeSelection || target.group !== activeSelection) &&\n // here we call findTargetCorner always with undefined for the touch parameter.\n // we assume that if you are using a cursor you do not need to interact with\n // the bigger touch area.\n target.findControl(this.getViewportPoint(e));\n\n if (!corner) {\n if ((target as Group).subTargetCheck) {\n // hoverCursor should come from top-most subTarget,\n // so we walk the array backwards\n const { subTargets } = this.findTarget(e);\n subTargets\n .concat()\n .reverse()\n .forEach((_target) => {\n hoverCursor = _target.hoverCursor || hoverCursor;\n });\n }\n this.setCursor(hoverCursor);\n } else {\n const { control, coord } = corner;\n this.setCursor(control.cursorStyleHandler(e, control, target, coord));\n }\n }\n\n /**\n * ## Handles multiple selection\n * - toggles `target` selection (selects/deselects `target` if it isn't/is selected respectively)\n * - sets the active object in case it is not set or in case there is a single active object left under active selection.\n * ---\n * - If the active object is the active selection we add/remove `target` from it\n * - If not, add the active object and `target` to the active selection and make it the active object.\n * @TODO rewrite this after find target is refactored\n * @private\n * @param {TPointerEvent} e Event object\n * @param {FabricObject} target target of event to select/deselect\n * @returns true if grouping occurred\n */\n protected handleMultiSelection(e: TPointerEvent, target?: FabricObject) {\n const activeObject = this._activeObject;\n const isAS = isActiveSelection(activeObject);\n if (\n // check if an active object exists on canvas and if the user is pressing the `selectionKey` while canvas supports multi selection.\n !!activeObject &&\n this._isSelectionKeyPressed(e) &&\n this.selection &&\n // on top of that the user also has to hit a target that is selectable.\n !!target &&\n target.selectable &&\n // group target and active object only if they are different objects\n // else we try to find a subtarget of `ActiveSelection`\n (activeObject !== target || isAS) &&\n // make sure `activeObject` and `target` aren't ancestors of each other in case `activeObject` is not `ActiveSelection`\n // if it is then we want to remove `target` from it\n (isAS ||\n (!target.isDescendantOf(activeObject) &&\n !activeObject.isDescendantOf(target))) &&\n // target accepts selection\n !target.onSelect({ e }) &&\n // make sure we are not on top of a control\n !activeObject.getActiveControl()\n ) {\n if (isAS) {\n const prevActiveObjects = activeObject.getObjects();\n let subTargets: FabricObject[] = [];\n // const { subTargets: testSubTargets } = this.findTarget(e);\n if (target === activeObject) {\n const pointer = this.getScenePoint(e);\n let targetInfo = this.searchPossibleTargets(\n prevActiveObjects,\n pointer,\n );\n // console.log(testSubTargets.includes(targetInfo.target));\n if (targetInfo.target) {\n target = targetInfo.target;\n subTargets = targetInfo.subTargets;\n } else {\n targetInfo = this.searchPossibleTargets(this._objects, pointer);\n target = targetInfo.target;\n subTargets = targetInfo.subTargets;\n }\n // if nothing is found bail out\n if (!target || !target.selectable) {\n return false;\n }\n }\n if (target.group === activeObject) {\n // `target` is part of active selection => remove it\n activeObject.remove(target);\n this._hoveredTarget = target;\n this._hoveredTargets = subTargets;\n // if after removing an object we are left with one only...\n if (activeObject.size() === 1) {\n // activate last remaining object\n // deselecting the active selection will remove the remaining object from it\n this._setActiveObject(activeObject.item(0), e);\n }\n } else {\n // `target` isn't part of active selection => add it\n activeObject.multiSelectAdd(target);\n this._hoveredTarget = activeObject;\n this._hoveredTargets = subTargets;\n }\n this._fireSelectionEvents(prevActiveObjects, e);\n } else {\n (activeObject as IText).isEditing &&\n (activeObject as IText).exitEditing();\n // add the active object and the target to the active selection and set it as the active object\n const klass =\n classRegistry.getClass('ActiveSelection');\n const newActiveSelection = new klass([], {\n /**\n * it is crucial to pass the canvas ref before calling {@link ActiveSelection#multiSelectAdd}\n * since it uses {@link FabricObject#isInFrontOf} which relies on the canvas ref\n */\n canvas: this,\n });\n newActiveSelection.multiSelectAdd(activeObject, target);\n this._hoveredTarget = newActiveSelection;\n // ISSUE 4115: should we consider subTargets here?\n // this._hoveredTargets = [];\n // this._hoveredTargets = this.targets.concat();\n this._setActiveObject(newActiveSelection, e);\n this._fireSelectionEvents([activeObject], e);\n }\n return true;\n }\n return false;\n }\n\n /**\n * ## Handles selection\n * - selects objects that are contained in (and possibly intersecting) the selection bounding box\n * - sets the active object\n * ---\n * runs on mouse up after a mouse move\n */\n protected handleSelection(e: TPointerEvent) {\n if (!this.selection || !this._groupSelector) {\n return false;\n }\n const { x, y, deltaX, deltaY } = this._groupSelector,\n point1 = new Point(x, y),\n point2 = point1.add(new Point(deltaX, deltaY)),\n tl = point1.min(point2),\n br = point1.max(point2),\n size = br.subtract(tl);\n\n const collectedObjects = this.collectObjects(\n {\n left: tl.x,\n top: tl.y,\n width: size.x,\n height: size.y,\n },\n { includeIntersecting: !this.selectionFullyContained },\n ) as FabricObject[];\n\n const objects =\n // though this method runs only after mouse move the pointer could do a mouse up on the same position as mouse down\n // should it be handled as is?\n point1.eq(point2)\n ? collectedObjects[0]\n ? [collectedObjects[0]]\n : []\n : collectedObjects.length > 1\n ? collectedObjects\n .filter((object) => !object.onSelect({ e }))\n .reverse()\n : // `setActiveObject` will call `onSelect(collectedObjects[0])` in this case\n collectedObjects;\n\n // set active object\n if (objects.length === 1) {\n // set as active object\n this.setActiveObject(objects[0], e);\n } else if (objects.length > 1) {\n // add to active selection and make it the active object\n const klass =\n classRegistry.getClass('ActiveSelection');\n this.setActiveObject(new klass(objects, { canvas: this }), e);\n }\n\n // cleanup\n this._groupSelector = null;\n return true;\n }\n\n /**\n * @override clear {@link textEditingManager}\n */\n clear() {\n this.textEditingManager.clear();\n super.clear();\n }\n\n /**\n * @override clear {@link textEditingManager}\n */\n destroy() {\n this.removeListeners();\n this.textEditingManager.dispose();\n super.destroy();\n }\n}\n","export const linearDefaultCoords = {\n x1: 0,\n y1: 0,\n x2: 0,\n y2: 0,\n};\n\nexport const radialDefaultCoords = {\n ...linearDefaultCoords,\n r1: 0,\n r2: 0,\n};\n","/**\n *\n * @param value value to check if NaN\n * @param [valueIfNaN]\n * @returns `fallback` is `value is NaN\n */\nexport const ifNaN = (value: number, valueIfNaN?: number) => {\n return isNaN(value) && typeof valueIfNaN === 'number' ? valueIfNaN : value;\n};\n","import { ifNaN } from '../util/internals/ifNaN';\nimport { capValue } from '../util/misc/capValue';\n\nconst RE_PERCENT = /^(\\d+\\.\\d+)%|(\\d+)%$/;\n\nexport function isPercent(value: string | null) {\n return value && RE_PERCENT.test(value);\n}\n\n/**\n *\n * @param value\n * @param valueIfNaN\n * @returns ∈ [0, 1]\n */\nexport function parsePercent(\n value: string | number | null | undefined,\n valueIfNaN?: number,\n) {\n const parsed =\n typeof value === 'number'\n ? value\n : typeof value === 'string'\n ? parseFloat(value) / (isPercent(value) ? 100 : 1)\n : NaN;\n return capValue(0, ifNaN(parsed, valueIfNaN), 1);\n}\n","import { Color } from '../../color/Color';\nimport { parsePercent } from '../../parser/percent';\nimport { ifNaN } from '../../util/internals/ifNaN';\nimport type { ColorStop } from '../typedefs';\n\nconst RE_KEY_VALUE_PAIRS = /\\s*;\\s*/;\nconst RE_KEY_VALUE = /\\s*:\\s*/;\n\nfunction parseColorStop(el: SVGStopElement, opacityMultiplier: number) {\n let colorValue, opacityValue;\n const style = el.getAttribute('style');\n if (style) {\n const keyValuePairs = style.split(RE_KEY_VALUE_PAIRS);\n\n if (keyValuePairs[keyValuePairs.length - 1] === '') {\n keyValuePairs.pop();\n }\n\n for (let i = keyValuePairs.length; i--; ) {\n const [key, value] = keyValuePairs[i]\n .split(RE_KEY_VALUE)\n .map((s) => s.trim());\n if (key === 'stop-color') {\n colorValue = value;\n } else if (key === 'stop-opacity') {\n opacityValue = value;\n }\n }\n }\n\n colorValue = colorValue || el.getAttribute('stop-color') || 'rgb(0,0,0)';\n opacityValue = ifNaN(\n parseFloat(opacityValue || el.getAttribute('stop-opacity') || ''),\n 1,\n );\n\n const color = new Color(colorValue);\n\n color.setAlpha(color.getAlpha() * opacityValue * opacityMultiplier);\n\n return {\n offset: parsePercent(el.getAttribute('offset'), 0),\n color: color.toRgba(),\n };\n}\n\nexport function parseColorStops(\n el: SVGGradientElement,\n opacityAttr: string | null,\n) {\n const colorStops: ColorStop[] = [],\n colorStopEls = el.getElementsByTagName('stop'),\n multiplier = parsePercent(opacityAttr, 1);\n for (let i = colorStopEls.length; i--; ) {\n colorStops.push(parseColorStop(colorStopEls[i], multiplier));\n }\n return colorStops;\n}\n","import type { GradientType, GradientUnits } from '../typedefs';\n\nexport function parseType(el: SVGGradientElement): GradientType {\n return el.nodeName === 'linearGradient' || el.nodeName === 'LINEARGRADIENT'\n ? 'linear'\n : 'radial';\n}\n\nexport function parseGradientUnits(el: SVGGradientElement): GradientUnits {\n return el.getAttribute('gradientUnits') === 'userSpaceOnUse'\n ? 'pixels'\n : 'percentage';\n}\n","import { isPercent } from '../../parser/percent';\nimport type { TSize } from '../../typedefs';\nimport type { GradientCoords, GradientType, GradientUnits } from '../typedefs';\nimport { parseGradientUnits, parseType } from './misc';\n\nfunction convertPercentUnitsToValues<\n T extends GradientType,\n K extends keyof GradientCoords,\n>(\n valuesToConvert: Record,\n { width, height, gradientUnits }: TSize & { gradientUnits: GradientUnits },\n) {\n let finalValue;\n return (Object.keys(valuesToConvert) as K[]).reduce(\n (acc, prop) => {\n const propValue = valuesToConvert[prop];\n if (propValue === 'Infinity') {\n finalValue = 1;\n } else if (propValue === '-Infinity') {\n finalValue = 0;\n } else {\n finalValue =\n typeof propValue === 'string' ? parseFloat(propValue) : propValue;\n if (typeof propValue === 'string' && isPercent(propValue)) {\n finalValue *= 0.01;\n if (gradientUnits === 'pixels') {\n // then we need to fix those percentages here in svg parsing\n if (prop === 'x1' || prop === 'x2' || prop === 'r2') {\n finalValue *= width;\n }\n if (prop === 'y1' || prop === 'y2') {\n finalValue *= height;\n }\n }\n }\n }\n acc[prop] = finalValue;\n return acc;\n },\n {} as Record,\n );\n}\n\nfunction getValue(el: SVGGradientElement, key: string) {\n return el.getAttribute(key);\n}\n\nexport function parseLinearCoords(el: SVGGradientElement) {\n return {\n x1: getValue(el, 'x1') || 0,\n y1: getValue(el, 'y1') || 0,\n x2: getValue(el, 'x2') || '100%',\n y2: getValue(el, 'y2') || 0,\n };\n}\n\nexport function parseRadialCoords(el: SVGGradientElement) {\n return {\n x1: getValue(el, 'fx') || getValue(el, 'cx') || '50%',\n y1: getValue(el, 'fy') || getValue(el, 'cy') || '50%',\n r1: 0,\n x2: getValue(el, 'cx') || '50%',\n y2: getValue(el, 'cy') || '50%',\n r2: getValue(el, 'r') || '50%',\n };\n}\n\nexport function parseCoords(el: SVGGradientElement, size: TSize) {\n return convertPercentUnitsToValues(\n parseType(el) === 'linear' ? parseLinearCoords(el) : parseRadialCoords(el),\n {\n ...size,\n gradientUnits: parseGradientUnits(el),\n },\n );\n}\n","import { iMatrix } from '../constants';\nimport { parseTransformAttribute } from '../parser/parseTransformAttribute';\nimport type { FabricObject } from '../shapes/Object/FabricObject';\nimport type { TMat2D } from '../typedefs';\nimport { uid } from '../util/internals/uid';\nimport { pick } from '../util/misc/pick';\nimport { matrixToSVG } from '../util/misc/svgExport';\nimport { linearDefaultCoords, radialDefaultCoords } from './constants';\nimport { parseColorStops } from './parser/parseColorStops';\nimport { parseCoords } from './parser/parseCoords';\nimport { parseType, parseGradientUnits } from './parser/misc';\nimport type {\n ColorStop,\n GradientCoords,\n GradientOptions,\n GradientType,\n GradientUnits,\n SVGOptions,\n SerializedGradientProps,\n} from './typedefs';\nimport { classRegistry } from '../ClassRegistry';\nimport { isPath } from '../util/typeAssertions';\n\n/**\n * Gradient class\n * @class Gradient\n * @tutorial {@link http://fabricjs.com/fabric-intro-part-2#gradients}\n */\nexport class Gradient<\n S,\n T extends GradientType = S extends GradientType ? S : 'linear',\n> {\n /**\n * Horizontal offset for aligning gradients coming from SVG when outside pathgroups\n * @type Number\n * @default 0\n */\n declare offsetX: number;\n\n /**\n * Vertical offset for aligning gradients coming from SVG when outside pathgroups\n * @type Number\n * @default 0\n */\n declare offsetY: number;\n\n /**\n * A transform matrix to apply to the gradient before painting.\n * Imported from svg gradients, is not applied with the current transform in the center.\n * Before this transform is applied, the origin point is at the top left corner of the object\n * plus the addition of offsetY and offsetX.\n * @type Number[]\n * @default null\n */\n declare gradientTransform?: TMat2D;\n\n /**\n * coordinates units for coords.\n * If `pixels`, the number of coords are in the same unit of width / height.\n * If set as `percentage` the coords are still a number, but 1 means 100% of width\n * for the X and 100% of the height for the y. It can be bigger than 1 and negative.\n * allowed values pixels or percentage.\n * @type GradientUnits\n * @default 'pixels'\n */\n declare gradientUnits: GradientUnits;\n\n /**\n * Gradient type linear or radial\n * @type GradientType\n * @default 'linear'\n */\n declare type: T;\n\n /**\n * Defines how the gradient is located in space and spread\n * @type GradientCoords\n */\n declare coords: GradientCoords;\n\n /**\n * Defines how many colors a gradient has and how they are located on the axis\n * defined by coords\n * @type GradientCoords\n */\n declare colorStops: ColorStop[];\n\n /**\n * If true, this object will not be exported during the serialization of a canvas\n * @type boolean\n */\n declare excludeFromExport?: boolean;\n\n /**\n * ID used for SVG export functionalities\n * @type number | string\n */\n declare readonly id: string | number;\n\n static type = 'Gradient';\n\n constructor(options: GradientOptions) {\n const {\n type = 'linear' as T,\n gradientUnits = 'pixels',\n coords = {},\n colorStops = [],\n offsetX = 0,\n offsetY = 0,\n gradientTransform,\n id,\n } = options || {};\n Object.assign(this, {\n type,\n gradientUnits,\n coords: {\n ...(type === 'radial' ? radialDefaultCoords : linearDefaultCoords),\n ...coords,\n },\n colorStops,\n offsetX,\n offsetY,\n gradientTransform,\n id: id ? `${id}_${uid()}` : uid(),\n });\n }\n\n /**\n * Adds another colorStop\n * @param {Record} colorStop Object with offset and color\n * @return {Gradient} thisArg\n */\n addColorStop(colorStops: Record) {\n for (const position in colorStops) {\n this.colorStops.push({\n offset: parseFloat(position),\n color: colorStops[position],\n });\n }\n return this;\n }\n\n /**\n * Returns object representation of a gradient\n * @param {string[]} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {object}\n */\n toObject(\n propertiesToInclude?: (keyof this | string)[],\n ): SerializedGradientProps {\n return {\n ...pick(this, propertiesToInclude as (keyof this)[]),\n type: this.type,\n coords: { ...this.coords },\n colorStops: this.colorStops.map((colorStop) => ({ ...colorStop })),\n offsetX: this.offsetX,\n offsetY: this.offsetY,\n gradientUnits: this.gradientUnits,\n gradientTransform: this.gradientTransform\n ? [...this.gradientTransform]\n : undefined,\n };\n }\n\n /* _TO_SVG_START_ */\n /**\n * Returns SVG representation of an gradient\n * @param {FabricObject} object Object to create a gradient for\n * @return {String} SVG representation of an gradient (linear/radial)\n */\n toSVG(\n object: FabricObject,\n {\n additionalTransform: preTransform,\n }: { additionalTransform?: string } = {},\n ) {\n const markup = [],\n transform = (\n this.gradientTransform\n ? this.gradientTransform.concat()\n : iMatrix.concat()\n ) as TMat2D,\n gradientUnits =\n this.gradientUnits === 'pixels'\n ? 'userSpaceOnUse'\n : 'objectBoundingBox';\n // colorStops must be sorted ascending, and guarded against deep mutations\n const colorStops = this.colorStops\n .map((colorStop) => ({ ...colorStop }))\n .sort((a, b) => {\n return a.offset - b.offset;\n });\n\n let offsetX = -this.offsetX,\n offsetY = -this.offsetY;\n if (gradientUnits === 'objectBoundingBox') {\n offsetX /= object.width;\n offsetY /= object.height;\n } else {\n offsetX += object.width / 2;\n offsetY += object.height / 2;\n }\n // todo what about polygon/polyline?\n if (isPath(object) && this.gradientUnits !== 'percentage') {\n offsetX -= object.pathOffset.x;\n offsetY -= object.pathOffset.y;\n }\n transform[4] -= offsetX;\n transform[5] -= offsetY;\n\n const commonAttributes = [\n `id=\"SVGID_${this.id}\"`,\n `gradientUnits=\"${gradientUnits}\"`,\n `gradientTransform=\"${\n preTransform ? preTransform + ' ' : ''\n }${matrixToSVG(transform)}\"`,\n '',\n ].join(' ');\n\n if (this.type === 'linear') {\n const { x1, y1, x2, y2 } = this.coords;\n markup.push(\n '\\n',\n );\n } else if (this.type === 'radial') {\n const { x1, y1, x2, y2, r1, r2 } = this\n .coords as GradientCoords<'radial'>;\n const needsSwap = r1 > r2;\n // svg radial gradient has just 1 radius. the biggest.\n markup.push(\n '\\n',\n );\n if (needsSwap) {\n // svg goes from internal to external radius. if radius are inverted, swap color stops.\n colorStops.reverse(); // mutates array\n colorStops.forEach((colorStop) => {\n colorStop.offset = 1 - colorStop.offset;\n });\n }\n const minRadius = Math.min(r1, r2);\n if (minRadius > 0) {\n // i have to shift all colorStops and add new one in 0.\n const maxRadius = Math.max(r1, r2),\n percentageShift = minRadius / maxRadius;\n colorStops.forEach((colorStop) => {\n colorStop.offset += percentageShift * (1 - colorStop.offset);\n });\n }\n }\n\n colorStops.forEach(({ color, offset }) => {\n markup.push(\n `\\n`,\n );\n });\n\n markup.push(\n this.type === 'linear' ? '' : '',\n '\\n',\n );\n\n return markup.join('');\n }\n /* _TO_SVG_END_ */\n\n /**\n * Returns an instance of CanvasGradient\n * @param {CanvasRenderingContext2D} ctx Context to render on\n * @return {CanvasGradient}\n */\n toLive(ctx: CanvasRenderingContext2D): CanvasGradient {\n const { x1, y1, x2, y2, r1, r2 } = this.coords as GradientCoords<'radial'>;\n const gradient =\n this.type === 'linear'\n ? ctx.createLinearGradient(x1, y1, x2, y2)\n : ctx.createRadialGradient(x1, y1, r1, x2, y2, r2);\n\n this.colorStops.forEach(({ color, offset }) => {\n gradient.addColorStop(offset, color);\n });\n\n return gradient;\n }\n\n static async fromObject(\n options: GradientOptions<'linear'>,\n ): Promise>;\n static async fromObject(\n options: GradientOptions<'radial'>,\n ): Promise>;\n static async fromObject(\n options: GradientOptions<'linear'> | GradientOptions<'radial'>,\n ) {\n const { colorStops, gradientTransform } = options;\n return new this({\n ...options,\n colorStops: colorStops\n ? colorStops.map((colorStop) => ({ ...colorStop }))\n : undefined,\n gradientTransform: gradientTransform ? [...gradientTransform] : undefined,\n });\n }\n\n /* _FROM_SVG_START_ */\n /**\n * Returns {@link Gradient} instance from an SVG element\n * @param {SVGGradientElement} el SVG gradient element\n * @param {FabricObject} instance\n * @param {String} opacity A fill-opacity or stroke-opacity attribute to multiply to each stop's opacity.\n * @param {SVGOptions} svgOptions an object containing the size of the SVG in order to parse correctly gradients\n * that uses gradientUnits as 'userSpaceOnUse' and percentages.\n * @return {Gradient} Gradient instance\n * @see http://www.w3.org/TR/SVG/pservers.html#LinearGradientElement\n * @see http://www.w3.org/TR/SVG/pservers.html#RadialGradientElement\n *\n * @example\n *\n * \n * \n * \n * \n *\n * OR\n *\n * \n * \n * \n * \n *\n * OR\n *\n * \n * \n * \n * \n * \n *\n * OR\n *\n * \n * \n * \n * \n * \n *\n */\n static fromElement(\n el: SVGGradientElement,\n instance: FabricObject,\n svgOptions: SVGOptions,\n ): Gradient {\n const gradientUnits = parseGradientUnits(el);\n const center = instance._findCenterFromElement();\n return new this({\n id: el.getAttribute('id') || undefined,\n type: parseType(el),\n coords: parseCoords(el, {\n width: svgOptions.viewBoxWidth || svgOptions.width,\n height: svgOptions.viewBoxHeight || svgOptions.height,\n }),\n colorStops: parseColorStops(el, svgOptions.opacity),\n gradientUnits,\n gradientTransform: parseTransformAttribute(\n el.getAttribute('gradientTransform') || '',\n ),\n ...(gradientUnits === 'pixels'\n ? {\n offsetX: instance.width / 2 - center.x,\n offsetY: instance.height / 2 - center.y,\n }\n : {\n offsetX: 0,\n offsetY: 0,\n }),\n });\n }\n /* _FROM_SVG_END_ */\n}\n\nclassRegistry.setClass(Gradient, 'gradient');\nclassRegistry.setClass(Gradient, 'linear');\nclassRegistry.setClass(Gradient, 'radial');\n","import { config } from '../config';\nimport type { Abortable, TCrossOrigin, TMat2D, TSize } from '../typedefs';\nimport { ifNaN } from '../util/internals/ifNaN';\nimport { uid } from '../util/internals/uid';\nimport { loadImage } from '../util/misc/objectEnlive';\nimport { pick } from '../util/misc/pick';\nimport { toFixed } from '../util/misc/toFixed';\nimport { classRegistry } from '../ClassRegistry';\nimport type {\n PatternRepeat,\n PatternOptions,\n SerializedPatternOptions,\n} from './types';\nimport { log } from '../util/internals/console';\n\n/**\n * @see {@link http://fabricjs.com/patterns demo}\n * @see {@link http://fabricjs.com/dynamic-patterns demo}\n */\nexport class Pattern {\n static type = 'Pattern';\n\n /**\n * Legacy identifier of the class. Prefer using this.constructor.type 'Pattern'\n * or utils like isPattern, or instance of to indentify a pattern in your code.\n * Will be removed in future versiones\n * @TODO add sustainable warning message\n * @type string\n * @deprecated\n */\n get type() {\n return 'pattern';\n }\n\n set type(value) {\n log('warn', 'Setting type has no effect', value);\n }\n\n /**\n * @type PatternRepeat\n * @defaults\n */\n repeat: PatternRepeat = 'repeat';\n\n /**\n * Pattern horizontal offset from object's left/top corner\n * @type Number\n */\n offsetX = 0;\n\n /**\n * Pattern vertical offset from object's left/top corner\n * @type Number\n */\n offsetY = 0;\n\n /**\n * @type TCrossOrigin\n */\n crossOrigin: TCrossOrigin = '';\n\n /**\n * transform matrix to change the pattern, imported from svgs.\n * @todo verify if using the identity matrix as default makes the rest of the code more easy\n * @type Array\n */\n declare patternTransform?: TMat2D;\n\n /**\n * The actual pixel source of the pattern\n */\n declare source: CanvasImageSource;\n\n /**\n * If true, this object will not be exported during the serialization of a canvas\n * @type boolean\n */\n declare excludeFromExport?: boolean;\n\n /**\n * ID used for SVG export functionalities\n * @type number\n */\n declare readonly id: number;\n\n /**\n * Constructor\n * @param {Object} [options] Options object\n * @param {option.source} [source] the pattern source, eventually empty or a drawable\n */\n constructor(options: PatternOptions) {\n this.id = uid();\n Object.assign(this, options);\n }\n\n /**\n * @returns true if {@link source} is an element\n */\n isImageSource(): this is { source: HTMLImageElement } {\n return (\n !!this.source && typeof (this.source as HTMLImageElement).src === 'string'\n );\n }\n\n /**\n * @returns true if {@link source} is a element\n */\n isCanvasSource(): this is { source: HTMLCanvasElement } {\n return !!this.source && !!(this.source as HTMLCanvasElement).toDataURL;\n }\n\n sourceToString(): string {\n return this.isImageSource()\n ? this.source.src\n : this.isCanvasSource()\n ? this.source.toDataURL()\n : '';\n }\n\n /**\n * Returns an instance of CanvasPattern\n * @param {CanvasRenderingContext2D} ctx Context to create pattern\n * @return {CanvasPattern}\n */\n toLive(ctx: CanvasRenderingContext2D): CanvasPattern | null {\n if (\n // if the image failed to load, return, and allow rest to continue loading\n !this.source ||\n // if an image\n (this.isImageSource() &&\n (!this.source.complete ||\n this.source.naturalWidth === 0 ||\n this.source.naturalHeight === 0))\n ) {\n return null;\n }\n\n return ctx.createPattern(this.source, this.repeat)!;\n }\n\n /**\n * Returns object representation of a pattern\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {object} Object representation of a pattern instance\n */\n toObject(propertiesToInclude: string[] = []): Record {\n const { repeat, crossOrigin } = this;\n return {\n ...pick(this, propertiesToInclude as (keyof this)[]),\n type: 'pattern',\n source: this.sourceToString(),\n repeat,\n crossOrigin,\n offsetX: toFixed(this.offsetX, config.NUM_FRACTION_DIGITS),\n offsetY: toFixed(this.offsetY, config.NUM_FRACTION_DIGITS),\n patternTransform: this.patternTransform\n ? [...this.patternTransform]\n : null,\n };\n }\n\n /* _TO_SVG_START_ */\n /**\n * Returns SVG representation of a pattern\n */\n toSVG({ width, height }: TSize): string {\n const { source: patternSource, repeat, id } = this,\n patternOffsetX = ifNaN(this.offsetX / width, 0),\n patternOffsetY = ifNaN(this.offsetY / height, 0),\n patternWidth =\n repeat === 'repeat-y' || repeat === 'no-repeat'\n ? 1 + Math.abs(patternOffsetX || 0)\n : ifNaN((patternSource as HTMLImageElement).width / width, 0),\n patternHeight =\n repeat === 'repeat-x' || repeat === 'no-repeat'\n ? 1 + Math.abs(patternOffsetY || 0)\n : ifNaN((patternSource as HTMLImageElement).height / height, 0);\n\n return [\n ``,\n ``,\n ``,\n '',\n ].join('\\n');\n }\n /* _TO_SVG_END_ */\n\n static async fromObject(\n {\n type,\n source,\n patternTransform,\n ...otherOptions\n }: SerializedPatternOptions,\n options?: Abortable,\n ): Promise {\n const img = await loadImage(source, {\n ...options,\n crossOrigin: otherOptions.crossOrigin,\n });\n return new this({\n ...otherOptions,\n patternTransform:\n patternTransform && (patternTransform.slice(0) as TMat2D),\n source: img,\n });\n }\n}\n\nclassRegistry.setClass(Pattern);\n// kept for compatibility reason\nclassRegistry.setClass(Pattern, 'pattern');\n","import { Color } from '../color/Color';\nimport type { Point } from '../Point';\nimport type { Shadow } from '../Shadow';\nimport type { Canvas } from '../canvas/Canvas';\nimport type { TBrushEventData } from './typedefs';\n\n/**\n * @see {@link http://fabricjs.com/freedrawing|Freedrawing demo}\n */\nexport abstract class BaseBrush {\n /**\n * Color of a brush\n * @type String\n */\n color = 'rgb(0, 0, 0)';\n\n /**\n * Width of a brush, has to be a Number, no string literals\n * @type Number\n */\n width = 1;\n\n /**\n * Shadow object representing shadow of this shape.\n * Backwards incompatibility note: This property replaces \"shadowColor\" (String), \"shadowOffsetX\" (Number),\n * \"shadowOffsetY\" (Number) and \"shadowBlur\" (Number) since v1.2.12\n * @type Shadow\n */\n shadow: Shadow | null = null;\n\n /**\n * Line endings style of a brush (one of \"butt\", \"round\", \"square\")\n * @type String\n */\n strokeLineCap: CanvasLineCap = 'round';\n\n /**\n * Corner style of a brush (one of \"bevel\", \"round\", \"miter\")\n * @type String\n */\n strokeLineJoin: CanvasLineJoin = 'round';\n\n /**\n * Maximum miter length (used for strokeLineJoin = \"miter\") of a brush's\n * @type Number\n */\n strokeMiterLimit = 10;\n\n /**\n * Stroke Dash Array.\n * @type Array\n */\n strokeDashArray: number[] | null = null;\n\n /**\n * When `true`, the free drawing is limited to the whiteboard size. Default to false.\n * @type Boolean\n * @default false\n */\n\n limitedToCanvasSize = false;\n\n /**\n * @todo add type\n */\n declare canvas: Canvas;\n\n constructor(canvas: Canvas) {\n this.canvas = canvas;\n }\n\n abstract _render(): void;\n abstract onMouseDown(pointer: Point, ev: TBrushEventData): void;\n abstract onMouseMove(pointer: Point, ev: TBrushEventData): void;\n /**\n * @returns true if brush should continue blocking interaction\n */\n abstract onMouseUp(ev: TBrushEventData): boolean | void;\n\n /**\n * Sets brush styles\n * @private\n * @param {CanvasRenderingContext2D} ctx\n */\n _setBrushStyles(ctx: CanvasRenderingContext2D) {\n ctx.strokeStyle = this.color;\n ctx.lineWidth = this.width;\n ctx.lineCap = this.strokeLineCap;\n ctx.miterLimit = this.strokeMiterLimit;\n ctx.lineJoin = this.strokeLineJoin;\n ctx.setLineDash(this.strokeDashArray || []);\n }\n\n /**\n * Sets the transformation on given context\n * @param {CanvasRenderingContext2D} ctx context to render on\n * @private\n */\n protected _saveAndTransform(ctx: CanvasRenderingContext2D) {\n const v = this.canvas.viewportTransform;\n ctx.save();\n ctx.transform(v[0], v[1], v[2], v[3], v[4], v[5]);\n }\n\n protected needsFullRender() {\n const color = new Color(this.color);\n return color.getAlpha() < 1 || !!this.shadow;\n }\n\n /**\n * Sets brush shadow styles\n * @private\n */\n protected _setShadow() {\n if (!this.shadow || !this.canvas) {\n return;\n }\n\n const canvas = this.canvas,\n shadow = this.shadow,\n ctx = canvas.contextTop,\n zoom = canvas.getZoom() * canvas.getRetinaScaling();\n\n ctx.shadowColor = shadow.color;\n ctx.shadowBlur = shadow.blur * zoom;\n ctx.shadowOffsetX = shadow.offsetX * zoom;\n ctx.shadowOffsetY = shadow.offsetY * zoom;\n }\n\n /**\n * Removes brush shadow styles\n * @private\n */\n protected _resetShadow() {\n const ctx = this.canvas.contextTop;\n\n ctx.shadowColor = '';\n ctx.shadowBlur = ctx.shadowOffsetX = ctx.shadowOffsetY = 0;\n }\n\n /**\n * Check is pointer is outside canvas boundaries\n * @param {Object} pointer\n * @private\n */\n protected _isOutSideCanvas(pointer: Point) {\n return (\n pointer.x < 0 ||\n pointer.x > this.canvas.getWidth() ||\n pointer.y < 0 ||\n pointer.y > this.canvas.getHeight()\n );\n }\n}\n","import { config } from '../config';\nimport { SHARED_ATTRIBUTES } from '../parser/attributes';\nimport { parseAttributes } from '../parser/parseAttributes';\nimport type { XY } from '../Point';\nimport { Point } from '../Point';\nimport { makeBoundingBoxFromPoints } from '../util/misc/boundingBoxFromPoints';\nimport { toFixed } from '../util/misc/toFixed';\nimport {\n getBoundsOfCurve,\n joinPath,\n makePathSimpler,\n parsePath,\n} from '../util/path';\nimport { classRegistry } from '../ClassRegistry';\nimport { FabricObject, cacheProperties } from './Object/FabricObject';\nimport type {\n TComplexPathData,\n TPathSegmentInfo,\n TSimplePathData,\n} from '../util/path/typedefs';\nimport type { FabricObjectProps, SerializedObjectProps } from './Object/types';\nimport type { ObjectEvents } from '../EventTypeDefs';\nimport type {\n TBBox,\n TClassProperties,\n TSVGReviver,\n TOptions,\n} from '../typedefs';\nimport { CENTER, LEFT, TOP } from '../constants';\nimport type { CSSRules } from '../parser/typedefs';\n\ninterface UniquePathProps {\n sourcePath?: string;\n path?: TSimplePathData;\n}\n\nexport interface SerializedPathProps\n extends SerializedObjectProps,\n UniquePathProps {}\n\nexport interface PathProps extends FabricObjectProps, UniquePathProps {}\n\nexport interface IPathBBox extends TBBox {\n left: number;\n top: number;\n pathOffset: Point;\n}\n\nexport class Path<\n Props extends TOptions = Partial,\n SProps extends SerializedPathProps = SerializedPathProps,\n EventSpec extends ObjectEvents = ObjectEvents,\n> extends FabricObject {\n /**\n * Array of path points\n * @type Array\n */\n declare path: TSimplePathData;\n\n declare pathOffset: Point;\n\n declare sourcePath?: string;\n\n declare segmentsInfo?: TPathSegmentInfo[];\n\n static type = 'Path';\n\n static cacheProperties = [...cacheProperties, 'path', 'fillRule'];\n\n /**\n * Constructor\n * @param {TComplexPathData} path Path data (sequence of coordinates and corresponding \"command\" tokens)\n * @param {Partial} [options] Options object\n * @return {Path} thisArg\n */\n constructor(\n path: TComplexPathData | string,\n // todo: evaluate this spread here\n { path: _, left, top, ...options }: Partial = {},\n ) {\n super();\n Object.assign(this, Path.ownDefaults);\n this.setOptions(options);\n this._setPath(path || [], true);\n typeof left === 'number' && this.set(LEFT, left);\n typeof top === 'number' && this.set(TOP, top);\n }\n\n /**\n * @private\n * @param {TComplexPathData | string} path Path data (sequence of coordinates and corresponding \"command\" tokens)\n * @param {boolean} [adjustPosition] pass true to reposition the object according to the bounding box\n * @returns {Point} top left position of the bounding box, useful for complementary positioning\n */\n _setPath(path: TComplexPathData | string, adjustPosition?: boolean) {\n this.path = makePathSimpler(Array.isArray(path) ? path : parsePath(path));\n this.setBoundingBox(adjustPosition);\n }\n\n /**\n * This function is an helper for svg import. it returns the center of the object in the svg\n * untransformed coordinates, by look at the polyline/polygon points.\n * @private\n * @return {Point} center point from element coordinates\n */\n _findCenterFromElement(): Point {\n const bbox = this._calcBoundsFromPath();\n return new Point(bbox.left + bbox.width / 2, bbox.top + bbox.height / 2);\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx context to render path on\n */\n _renderPathCommands(ctx: CanvasRenderingContext2D) {\n const l = -this.pathOffset.x,\n t = -this.pathOffset.y;\n\n ctx.beginPath();\n\n for (const command of this.path) {\n switch (\n command[0] // first letter\n ) {\n case 'L': // lineto, absolute\n ctx.lineTo(command[1] + l, command[2] + t);\n break;\n\n case 'M': // moveTo, absolute\n ctx.moveTo(command[1] + l, command[2] + t);\n break;\n\n case 'C': // bezierCurveTo, absolute\n ctx.bezierCurveTo(\n command[1] + l,\n command[2] + t,\n command[3] + l,\n command[4] + t,\n command[5] + l,\n command[6] + t,\n );\n break;\n\n case 'Q': // quadraticCurveTo, absolute\n ctx.quadraticCurveTo(\n command[1] + l,\n command[2] + t,\n command[3] + l,\n command[4] + t,\n );\n break;\n\n case 'Z':\n ctx.closePath();\n break;\n }\n }\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx context to render path on\n */\n _render(ctx: CanvasRenderingContext2D) {\n this._renderPathCommands(ctx);\n this._renderPaintInOrder(ctx);\n }\n\n /**\n * Returns string representation of an instance\n * @return {string} string representation of an instance\n */\n toString() {\n return `#`;\n }\n\n /**\n * Returns object representation of an instance\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} object representation of an instance\n */\n toObject<\n T extends Omit, keyof SProps>,\n K extends keyof T = never,\n >(propertiesToInclude: K[] = []): Pick & SProps {\n return {\n ...super.toObject(propertiesToInclude),\n path: this.path.map((pathCmd) => pathCmd.slice()),\n };\n }\n\n /**\n * Returns dataless object representation of an instance\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} object representation of an instance\n */\n toDatalessObject<\n T extends Omit, keyof SProps>,\n K extends keyof T = never,\n >(propertiesToInclude: K[] = []): Pick & SProps {\n const o = this.toObject(propertiesToInclude);\n if (this.sourcePath) {\n delete o.path;\n o.sourcePath = this.sourcePath;\n }\n return o;\n }\n\n /**\n * Returns svg representation of an instance\n * @return {Array} an array of strings with the specific svg representation\n * of the instance\n */\n _toSVG() {\n const path = joinPath(this.path, config.NUM_FRACTION_DIGITS);\n return [\n '\\n`,\n ];\n }\n\n /**\n * @private\n * @return the path command's translate transform attribute\n */\n _getOffsetTransform() {\n const digits = config.NUM_FRACTION_DIGITS;\n return ` translate(${toFixed(-this.pathOffset.x, digits)}, ${toFixed(\n -this.pathOffset.y,\n digits,\n )})`;\n }\n\n /**\n * Returns svg clipPath representation of an instance\n * @param {Function} [reviver] Method for further parsing of svg representation.\n * @return {string} svg representation of an instance\n */\n toClipPathSVG(reviver?: TSVGReviver): string {\n const additionalTransform = this._getOffsetTransform();\n return (\n '\\t' +\n this._createBaseClipPathSVGMarkup(this._toSVG(), {\n reviver,\n additionalTransform: additionalTransform,\n })\n );\n }\n\n /**\n * Returns svg representation of an instance\n * @param {Function} [reviver] Method for further parsing of svg representation.\n * @return {string} svg representation of an instance\n */\n toSVG(reviver?: TSVGReviver): string {\n const additionalTransform = this._getOffsetTransform();\n return this._createBaseSVGMarkup(this._toSVG(), {\n reviver,\n additionalTransform: additionalTransform,\n });\n }\n\n /**\n * Returns number representation of an instance complexity\n * @return {number} complexity of this instance\n */\n complexity() {\n return this.path.length;\n }\n\n setDimensions() {\n this.setBoundingBox();\n }\n\n setBoundingBox(adjustPosition?: boolean) {\n const { width, height, pathOffset } = this._calcDimensions();\n this.set({ width, height, pathOffset });\n // using pathOffset because it match the use case.\n // if pathOffset change here we need to use left + width/2 , top + height/2\n adjustPosition && this.setPositionByOrigin(pathOffset, CENTER, CENTER);\n }\n\n _calcBoundsFromPath(): TBBox {\n const bounds: XY[] = [];\n let subpathStartX = 0,\n subpathStartY = 0,\n x = 0, // current x\n y = 0; // current y\n\n for (const command of this.path) {\n // current instruction\n switch (\n command[0] // first letter\n ) {\n case 'L': // lineto, absolute\n x = command[1];\n y = command[2];\n bounds.push({ x: subpathStartX, y: subpathStartY }, { x, y });\n break;\n\n case 'M': // moveTo, absolute\n x = command[1];\n y = command[2];\n subpathStartX = x;\n subpathStartY = y;\n break;\n\n case 'C': // bezierCurveTo, absolute\n bounds.push(\n ...getBoundsOfCurve(\n x,\n y,\n command[1],\n command[2],\n command[3],\n command[4],\n command[5],\n command[6],\n ),\n );\n x = command[5];\n y = command[6];\n break;\n\n case 'Q': // quadraticCurveTo, absolute\n bounds.push(\n ...getBoundsOfCurve(\n x,\n y,\n command[1],\n command[2],\n command[1],\n command[2],\n command[3],\n command[4],\n ),\n );\n x = command[3];\n y = command[4];\n break;\n\n case 'Z':\n x = subpathStartX;\n y = subpathStartY;\n break;\n }\n }\n return makeBoundingBoxFromPoints(bounds);\n }\n\n /**\n * @private\n */\n _calcDimensions(): IPathBBox {\n const bbox = this._calcBoundsFromPath();\n\n return {\n ...bbox,\n pathOffset: new Point(\n bbox.left + bbox.width / 2,\n bbox.top + bbox.height / 2,\n ),\n };\n }\n\n /**\n * List of attribute names to account for when parsing SVG element (used by `Path.fromElement`)\n * @see http://www.w3.org/TR/SVG/paths.html#PathElement\n */\n static ATTRIBUTE_NAMES = [...SHARED_ATTRIBUTES, 'd'];\n\n /**\n * Creates an instance of Path from an object\n * @param {Object} object\n * @returns {Promise}\n */\n static fromObject>(object: T) {\n return this._fromObject(object, {\n extraParam: 'path',\n });\n }\n\n /**\n * Creates an instance of Path from an SVG element\n * @param {HTMLElement} element to parse\n * @param {Partial} [options] Options object\n */\n static async fromElement(\n element: HTMLElement | SVGElement,\n options?: Partial,\n cssRules?: CSSRules,\n ) {\n const { d, ...parsedAttributes } = parseAttributes(\n element,\n this.ATTRIBUTE_NAMES,\n cssRules,\n );\n return new this(d, {\n ...parsedAttributes,\n ...options,\n // we pass undefined to instruct the constructor to position the object using the bbox\n left: undefined,\n top: undefined,\n });\n }\n}\n\nclassRegistry.setClass(Path);\nclassRegistry.setSVGClass(Path);\n\n/* _FROM_SVG_START_ */\n","import type { ModifierKey, TEvent } from '../EventTypeDefs';\nimport type { Point } from '../Point';\nimport { Shadow } from '../Shadow';\nimport { Path } from '../shapes/Path';\nimport { getSmoothPathFromPoints, joinPath } from '../util/path';\nimport type { Canvas } from '../canvas/Canvas';\nimport { BaseBrush } from './BaseBrush';\nimport type { TSimplePathData } from '../util/path/typedefs';\n\n/**\n * @private\n * @param {TSimplePathData} pathData SVG path commands\n * @returns {boolean}\n */\nfunction isEmptySVGPath(pathData: TSimplePathData): boolean {\n return joinPath(pathData) === 'M 0 0 Q 0 0 0 0 L 0 0';\n}\n\nexport class PencilBrush extends BaseBrush {\n /**\n * Discard points that are less than `decimate` pixel distant from each other\n * @type Number\n * @default 0.4\n */\n decimate = 0.4;\n\n /**\n * Draws a straight line between last recorded point to current pointer\n * Used for `shift` functionality\n *\n * @type boolean\n * @default false\n */\n drawStraightLine = false;\n\n /**\n * The event modifier key that makes the brush draw a straight line.\n * If `null` or 'none' or any other string that is not a modifier key the feature is disabled.\n * @type {ModifierKey | undefined | null}\n */\n straightLineKey: ModifierKey | undefined | null = 'shiftKey';\n\n declare protected _points: Point[];\n declare protected _hasStraightLine: boolean;\n declare protected oldEnd?: Point;\n\n constructor(canvas: Canvas) {\n super(canvas);\n this._points = [];\n this._hasStraightLine = false;\n }\n\n needsFullRender() {\n return super.needsFullRender() || this._hasStraightLine;\n }\n\n static drawSegment(ctx: CanvasRenderingContext2D, p1: Point, p2: Point) {\n const midPoint = p1.midPointFrom(p2);\n ctx.quadraticCurveTo(p1.x, p1.y, midPoint.x, midPoint.y);\n return midPoint;\n }\n\n /**\n * Invoked on mouse down\n * @param {Point} pointer\n */\n onMouseDown(pointer: Point, { e }: TEvent) {\n if (!this.canvas._isMainEvent(e)) {\n return;\n }\n this.drawStraightLine = !!this.straightLineKey && e[this.straightLineKey];\n this._prepareForDrawing(pointer);\n // capture coordinates immediately\n // this allows to draw dots (when movement never occurs)\n this._addPoint(pointer);\n this._render();\n }\n\n /**\n * Invoked on mouse move\n * @param {Point} pointer\n */\n onMouseMove(pointer: Point, { e }: TEvent) {\n if (!this.canvas._isMainEvent(e)) {\n return;\n }\n this.drawStraightLine = !!this.straightLineKey && e[this.straightLineKey];\n if (this.limitedToCanvasSize === true && this._isOutSideCanvas(pointer)) {\n return;\n }\n if (this._addPoint(pointer) && this._points.length > 1) {\n if (this.needsFullRender()) {\n // redraw curve\n // clear top canvas\n this.canvas.clearContext(this.canvas.contextTop);\n this._render();\n } else {\n const points = this._points,\n length = points.length,\n ctx = this.canvas.contextTop;\n // draw the curve update\n this._saveAndTransform(ctx);\n if (this.oldEnd) {\n ctx.beginPath();\n ctx.moveTo(this.oldEnd.x, this.oldEnd.y);\n }\n this.oldEnd = PencilBrush.drawSegment(\n ctx,\n points[length - 2],\n points[length - 1],\n );\n ctx.stroke();\n ctx.restore();\n }\n }\n }\n\n /**\n * Invoked on mouse up\n */\n onMouseUp({ e }: TEvent) {\n if (!this.canvas._isMainEvent(e)) {\n return true;\n }\n this.drawStraightLine = false;\n this.oldEnd = undefined;\n this._finalizeAndAddPath();\n\n return false;\n }\n\n /**\n * @private\n * @param {Point} pointer Actual mouse position related to the canvas.\n */\n _prepareForDrawing(pointer: Point) {\n this._reset();\n this._addPoint(pointer);\n this.canvas.contextTop.moveTo(pointer.x, pointer.y);\n }\n\n /**\n * @private\n * @param {Point} point Point to be added to points array\n */\n _addPoint(point: Point) {\n if (\n this._points.length > 1 &&\n point.eq(this._points[this._points.length - 1])\n ) {\n return false;\n }\n if (this.drawStraightLine && this._points.length > 1) {\n this._hasStraightLine = true;\n this._points.pop();\n }\n this._points.push(point);\n return true;\n }\n\n /**\n * Clear points array and set contextTop canvas style.\n * @private\n */\n _reset() {\n this._points = [];\n this._setBrushStyles(this.canvas.contextTop);\n this._setShadow();\n this._hasStraightLine = false;\n }\n\n /**\n * Draw a smooth path on the topCanvas using quadraticCurveTo\n * @private\n * @param {CanvasRenderingContext2D} [ctx]\n */\n _render(ctx: CanvasRenderingContext2D = this.canvas.contextTop) {\n let p1 = this._points[0],\n p2 = this._points[1];\n this._saveAndTransform(ctx);\n ctx.beginPath();\n //if we only have 2 points in the path and they are the same\n //it means that the user only clicked the canvas without moving the mouse\n //then we should be drawing a dot. A path isn't drawn between two identical dots\n //that's why we set them apart a bit\n if (this._points.length === 2 && p1.x === p2.x && p1.y === p2.y) {\n const width = this.width / 1000;\n p1.x -= width;\n p2.x += width;\n }\n ctx.moveTo(p1.x, p1.y);\n\n for (let i = 1; i < this._points.length; i++) {\n // we pick the point between pi + 1 & pi + 2 as the\n // end point and p1 as our control point.\n PencilBrush.drawSegment(ctx, p1, p2);\n p1 = this._points[i];\n p2 = this._points[i + 1];\n }\n // Draw last line as a straight line while\n // we wait for the next point to be able to calculate\n // the bezier control point\n ctx.lineTo(p1.x, p1.y);\n ctx.stroke();\n ctx.restore();\n }\n\n /**\n * Converts points to SVG path\n * @param {Point[]} points Array of points\n * @return {TSimplePathData} SVG path commands\n */\n convertPointsToSVGPath(points: Point[]): TSimplePathData {\n const correction = this.width / 1000;\n return getSmoothPathFromPoints(points, correction);\n }\n\n /**\n * Creates a Path object to add on canvas\n * @param {TSimplePathData} pathData Path data\n * @return {Path} Path to add on canvas\n */\n createPath(pathData: TSimplePathData): Path {\n const path = new Path(pathData, {\n fill: null,\n stroke: this.color,\n strokeWidth: this.width,\n strokeLineCap: this.strokeLineCap,\n strokeMiterLimit: this.strokeMiterLimit,\n strokeLineJoin: this.strokeLineJoin,\n strokeDashArray: this.strokeDashArray,\n });\n if (this.shadow) {\n this.shadow.affectStroke = true;\n path.shadow = new Shadow(this.shadow);\n }\n\n return path;\n }\n\n /**\n * Decimate points array with the decimate value\n */\n decimatePoints(points: Point[], distance: number) {\n if (points.length <= 2) {\n return points;\n }\n let lastPoint = points[0],\n cDistance;\n const zoom = this.canvas.getZoom(),\n adjustedDistance = Math.pow(distance / zoom, 2),\n l = points.length - 1,\n newPoints = [lastPoint];\n // TODO investigate why this is not i < l\n for (let i = 1; i < l - 1; i++) {\n cDistance =\n Math.pow(lastPoint.x - points[i].x, 2) +\n Math.pow(lastPoint.y - points[i].y, 2);\n if (cDistance >= adjustedDistance) {\n lastPoint = points[i];\n newPoints.push(lastPoint);\n }\n }\n // Add the last point from the original line to the end of the array.\n // This ensures decimate doesn't delete the last point on the line, and ensures the line is > 1 point.\n newPoints.push(points[l]);\n return newPoints;\n }\n\n /**\n * On mouseup after drawing the path on contextTop canvas\n * we use the points captured to create an new Path object\n * and add it to the canvas.\n */\n _finalizeAndAddPath() {\n const ctx = this.canvas.contextTop;\n ctx.closePath();\n if (this.decimate) {\n this._points = this.decimatePoints(this._points, this.decimate);\n }\n const pathData = this.convertPointsToSVGPath(this._points);\n if (isEmptySVGPath(pathData)) {\n // do not create 0 width/height paths, as they are\n // rendered inconsistently across browsers\n // Firefox 4, for example, renders a dot,\n // whereas Chrome 10 renders nothing\n this.canvas.requestRenderAll();\n return;\n }\n\n const path = this.createPath(pathData);\n this.canvas.clearContext(this.canvas.contextTop);\n this.canvas.fire('before:path:created', { path: path });\n this.canvas.add(path);\n this.canvas.requestRenderAll();\n path.setCoords();\n this._resetShadow();\n\n // fire event 'path' created\n this.canvas.fire('path:created', { path: path });\n }\n}\n","import type { ObjectEvents } from '../EventTypeDefs';\nimport { SHARED_ATTRIBUTES } from '../parser/attributes';\nimport { parseAttributes } from '../parser/parseAttributes';\nimport { cos } from '../util/misc/cos';\nimport { degreesToRadians } from '../util/misc/radiansDegreesConversion';\nimport { sin } from '../util/misc/sin';\nimport { classRegistry } from '../ClassRegistry';\nimport { FabricObject, cacheProperties } from './Object/FabricObject';\nimport type { Abortable, TClassProperties, TOptions } from '../typedefs';\nimport type { FabricObjectProps, SerializedObjectProps } from './Object/types';\nimport type { CSSRules } from '../parser/typedefs';\nimport { SCALE_X, SCALE_Y } from '../constants';\n\ninterface UniqueCircleProps {\n /**\n * Radius of this circle\n * @type Number\n * @default 0\n */\n radius: number;\n\n /**\n * Angle for the start of the circle, in degrees.\n * @type TDegree 0 - 359\n * @default 0\n */\n startAngle: number;\n\n /**\n * Angle for the end of the circle, in degrees\n * @type TDegree 1 - 360\n * @default 360\n */\n endAngle: number;\n\n /**\n * Orientation for the direction of the circle.\n * Setting to true will switch the arc of the circle to traverse from startAngle to endAngle in a counter-clockwise direction.\n * Note: this will only change how the circle is drawn, and does not affect rotational transformation.\n * @default false\n */\n counterClockwise: boolean;\n}\n\nexport interface SerializedCircleProps\n extends SerializedObjectProps,\n UniqueCircleProps {}\n\nexport interface CircleProps extends FabricObjectProps, UniqueCircleProps {}\n\nconst CIRCLE_PROPS = [\n 'radius',\n 'startAngle',\n 'endAngle',\n 'counterClockwise',\n] as const;\n\nexport const circleDefaultValues: Partial> = {\n radius: 0,\n startAngle: 0,\n endAngle: 360,\n counterClockwise: false,\n};\n\nexport class Circle<\n Props extends TOptions = Partial,\n SProps extends SerializedCircleProps = SerializedCircleProps,\n EventSpec extends ObjectEvents = ObjectEvents,\n >\n extends FabricObject\n implements UniqueCircleProps\n{\n declare radius: number;\n declare startAngle: number;\n declare endAngle: number;\n declare counterClockwise: boolean;\n\n static type = 'Circle';\n\n static cacheProperties = [...cacheProperties, ...CIRCLE_PROPS];\n\n static ownDefaults = circleDefaultValues;\n\n static getDefaults(): Record {\n return {\n ...super.getDefaults(),\n ...Circle.ownDefaults,\n };\n }\n\n /**\n * Constructor\n * @param {Object} [options] Options object\n */\n constructor(options?: Props) {\n super();\n Object.assign(this, Circle.ownDefaults);\n this.setOptions(options);\n }\n\n /**\n * @private\n * @param {String} key\n * @param {*} value\n */\n _set(key: string, value: any) {\n super._set(key, value);\n\n if (key === 'radius') {\n this.setRadius(value);\n }\n\n return this;\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx context to render on\n */\n _render(ctx: CanvasRenderingContext2D) {\n ctx.beginPath();\n ctx.arc(\n 0,\n 0,\n this.radius,\n degreesToRadians(this.startAngle),\n degreesToRadians(this.endAngle),\n this.counterClockwise,\n );\n this._renderPaintInOrder(ctx);\n }\n\n /**\n * Returns horizontal radius of an object (according to how an object is scaled)\n * @return {Number}\n */\n getRadiusX(): number {\n return this.get('radius') * this.get(SCALE_X);\n }\n\n /**\n * Returns vertical radius of an object (according to how an object is scaled)\n * @return {Number}\n */\n getRadiusY(): number {\n return this.get('radius') * this.get(SCALE_Y);\n }\n\n /**\n * Sets radius of an object (and updates width accordingly)\n */\n setRadius(value: number) {\n this.radius = value;\n this.set({ width: value * 2, height: value * 2 });\n }\n\n /**\n * Returns object representation of an instance\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} object representation of an instance\n */\n toObject<\n T extends Omit, keyof SProps>,\n K extends keyof T = never,\n >(propertiesToInclude: K[] = []): Pick & SProps {\n return super.toObject([...CIRCLE_PROPS, ...propertiesToInclude]);\n }\n\n /* _TO_SVG_START_ */\n\n /**\n * Returns svg representation of an instance\n * @return {Array} an array of strings with the specific svg representation\n * of the instance\n */\n _toSVG(): string[] {\n const angle = (this.endAngle - this.startAngle) % 360;\n\n if (angle === 0) {\n return [\n '\\n',\n ];\n } else {\n const { radius } = this;\n const start = degreesToRadians(this.startAngle),\n end = degreesToRadians(this.endAngle),\n startX = cos(start) * radius,\n startY = sin(start) * radius,\n endX = cos(end) * radius,\n endY = sin(end) * radius,\n largeFlag = angle > 180 ? 1 : 0,\n sweepFlag = this.counterClockwise ? 0 : 1;\n return [\n `\\n',\n ];\n }\n }\n /* _TO_SVG_END_ */\n\n /* _FROM_SVG_START_ */\n /**\n * List of attribute names to account for when parsing SVG element (used by {@link Circle.fromElement})\n * @see: http://www.w3.org/TR/SVG/shapes.html#CircleElement\n */\n static ATTRIBUTE_NAMES = ['cx', 'cy', 'r', ...SHARED_ATTRIBUTES];\n\n /**\n * Returns {@link Circle} instance from an SVG element\n * @param {HTMLElement} element Element to parse\n * @param {Object} [options] Partial Circle object to default missing properties on the element.\n * @throws {Error} If value of `r` attribute is missing or invalid\n */\n static async fromElement(\n element: HTMLElement,\n options: Abortable,\n cssRules?: CSSRules,\n ): Promise {\n const {\n left = 0,\n top = 0,\n radius = 0,\n ...otherParsedAttributes\n } = parseAttributes(\n element,\n this.ATTRIBUTE_NAMES,\n cssRules,\n ) as Partial;\n\n // this probably requires to be fixed for default origins not being top/left.\n\n return new this({\n ...otherParsedAttributes,\n radius,\n left: left - radius,\n top: top - radius,\n });\n }\n\n /* _FROM_SVG_END_ */\n\n /**\n * @todo how do we declare this??\n */\n static fromObject>(object: T) {\n return super._fromObject(object);\n }\n}\n\nclassRegistry.setClass(Circle);\nclassRegistry.setSVGClass(Circle);\n","import { Color } from '../color/Color';\nimport type { Point } from '../Point';\nimport { Shadow } from '../Shadow';\nimport { Circle } from '../shapes/Circle';\nimport { Group } from '../shapes/Group';\nimport { getRandomInt } from '../util/internals/getRandomInt';\nimport type { Canvas } from '../canvas/Canvas';\nimport { BaseBrush } from './BaseBrush';\nimport type { CircleBrushPoint } from './typedefs';\nimport { CENTER } from '../constants';\n\nexport class CircleBrush extends BaseBrush {\n /**\n * Width of a brush\n * @type Number\n */\n width = 10;\n\n declare points: CircleBrushPoint[];\n\n constructor(canvas: Canvas) {\n super(canvas);\n this.points = [];\n }\n\n /**\n * Invoked inside on mouse down and mouse move\n * @param {Point} pointer\n */\n drawDot(pointer: Point) {\n const point = this.addPoint(pointer),\n ctx = this.canvas.contextTop;\n this._saveAndTransform(ctx);\n this.dot(ctx, point);\n ctx.restore();\n }\n\n dot(ctx: CanvasRenderingContext2D, point: CircleBrushPoint) {\n ctx.fillStyle = point.fill;\n ctx.beginPath();\n ctx.arc(point.x, point.y, point.radius, 0, Math.PI * 2, false);\n ctx.closePath();\n ctx.fill();\n }\n\n /**\n * Invoked on mouse down\n */\n onMouseDown(pointer: Point) {\n this.points = [];\n this.canvas.clearContext(this.canvas.contextTop);\n this._setShadow();\n this.drawDot(pointer);\n }\n\n /**\n * Render the full state of the brush\n * @private\n */\n _render() {\n const ctx = this.canvas.contextTop,\n points = this.points;\n this._saveAndTransform(ctx);\n for (let i = 0; i < points.length; i++) {\n this.dot(ctx, points[i]);\n }\n ctx.restore();\n }\n\n /**\n * Invoked on mouse move\n * @param {Point} pointer\n */\n onMouseMove(pointer: Point) {\n if (this.limitedToCanvasSize === true && this._isOutSideCanvas(pointer)) {\n return;\n }\n if (this.needsFullRender()) {\n this.canvas.clearContext(this.canvas.contextTop);\n this.addPoint(pointer);\n this._render();\n } else {\n this.drawDot(pointer);\n }\n }\n\n /**\n * Invoked on mouse up\n */\n onMouseUp() {\n const originalRenderOnAddRemove = this.canvas.renderOnAddRemove;\n this.canvas.renderOnAddRemove = false;\n\n const circles: Circle[] = [];\n\n for (let i = 0; i < this.points.length; i++) {\n const point = this.points[i],\n circle = new Circle({\n radius: point.radius,\n left: point.x,\n top: point.y,\n originX: CENTER,\n originY: CENTER,\n fill: point.fill,\n });\n\n this.shadow && (circle.shadow = new Shadow(this.shadow));\n\n circles.push(circle);\n }\n const group = new Group(circles, { canvas: this.canvas });\n\n this.canvas.fire('before:path:created', { path: group });\n this.canvas.add(group);\n this.canvas.fire('path:created', { path: group });\n\n this.canvas.clearContext(this.canvas.contextTop);\n this._resetShadow();\n this.canvas.renderOnAddRemove = originalRenderOnAddRemove;\n this.canvas.requestRenderAll();\n }\n\n /**\n * @param {Object} pointer\n * @return {Point} Just added pointer point\n */\n addPoint({ x, y }: Point) {\n const pointerPoint: CircleBrushPoint = {\n x,\n y,\n radius: getRandomInt(Math.max(0, this.width - 20), this.width + 20) / 2,\n fill: new Color(this.color).setAlpha(getRandomInt(0, 100) / 100).toRgba(),\n };\n\n this.points.push(pointerPoint);\n\n return pointerPoint;\n }\n}\n","import type { Point } from '../Point';\nimport { Group } from '../shapes/Group';\nimport { Shadow } from '../Shadow';\nimport { Rect } from '../shapes/Rect';\nimport { getRandomInt } from '../util/internals/getRandomInt';\nimport type { Canvas } from '../canvas/Canvas';\nimport { BaseBrush } from './BaseBrush';\nimport type { SprayBrushPoint } from './typedefs';\nimport { CENTER } from '../constants';\n\n/**\n *\n * @param rects\n * @returns\n */\nfunction getUniqueRects(rects: Rect[]) {\n const uniqueRects: Record = {};\n const uniqueRectsArray: Rect[] = [];\n\n for (let i = 0, key: string; i < rects.length; i++) {\n key = `${rects[i].left}${rects[i].top}`;\n if (!uniqueRects[key]) {\n uniqueRects[key] = true;\n uniqueRectsArray.push(rects[i]);\n }\n }\n\n return uniqueRectsArray;\n}\n\nexport class SprayBrush extends BaseBrush {\n /**\n * Width of a spray\n * @type Number\n */\n width = 10;\n\n /**\n * Density of a spray (number of dots per chunk)\n * @type Number\n */\n density = 20;\n\n /**\n * Width of spray dots\n * @type Number\n */\n dotWidth = 1;\n\n /**\n * Width variance of spray dots\n * @type Number\n */\n dotWidthVariance = 1;\n\n /**\n * Whether opacity of a dot should be random\n * @type Boolean\n */\n randomOpacity = false;\n\n /**\n * Whether overlapping dots (rectangles) should be removed (for performance reasons)\n * @type Boolean\n */\n optimizeOverlapping = true;\n\n declare private sprayChunks: SprayBrushPoint[][];\n\n declare private sprayChunk: SprayBrushPoint[];\n\n /**\n * Constructor\n * @param {Canvas} canvas\n * @return {SprayBrush} Instance of a spray brush\n */\n constructor(canvas: Canvas) {\n super(canvas);\n this.sprayChunks = [];\n this.sprayChunk = [];\n }\n\n /**\n * Invoked on mouse down\n * @param {Point} pointer\n */\n onMouseDown(pointer: Point) {\n this.sprayChunks = [];\n this.canvas.clearContext(this.canvas.contextTop);\n this._setShadow();\n\n this.addSprayChunk(pointer);\n this.renderChunck(this.sprayChunk);\n }\n\n /**\n * Invoked on mouse move\n * @param {Point} pointer\n */\n onMouseMove(pointer: Point) {\n if (this.limitedToCanvasSize === true && this._isOutSideCanvas(pointer)) {\n return;\n }\n this.addSprayChunk(pointer);\n this.renderChunck(this.sprayChunk);\n }\n\n /**\n * Invoked on mouse up\n */\n onMouseUp() {\n const originalRenderOnAddRemove = this.canvas.renderOnAddRemove;\n this.canvas.renderOnAddRemove = false;\n\n const rects: Rect[] = [];\n\n for (let i = 0; i < this.sprayChunks.length; i++) {\n const sprayChunk = this.sprayChunks[i];\n for (let j = 0; j < sprayChunk.length; j++) {\n const chunck = sprayChunk[j];\n const rect = new Rect({\n width: chunck.width,\n height: chunck.width,\n left: chunck.x + 1,\n top: chunck.y + 1,\n originX: CENTER,\n originY: CENTER,\n fill: this.color,\n });\n rects.push(rect);\n }\n }\n\n const group = new Group(\n this.optimizeOverlapping ? getUniqueRects(rects) : rects,\n {\n objectCaching: true,\n subTargetCheck: false,\n interactive: false,\n },\n );\n this.shadow && group.set('shadow', new Shadow(this.shadow));\n this.canvas.fire('before:path:created', { path: group });\n this.canvas.add(group);\n this.canvas.fire('path:created', { path: group });\n\n this.canvas.clearContext(this.canvas.contextTop);\n this._resetShadow();\n this.canvas.renderOnAddRemove = originalRenderOnAddRemove;\n this.canvas.requestRenderAll();\n }\n\n renderChunck(sprayChunck: SprayBrushPoint[]) {\n const ctx = this.canvas.contextTop;\n ctx.fillStyle = this.color;\n\n this._saveAndTransform(ctx);\n\n for (let i = 0; i < sprayChunck.length; i++) {\n const point = sprayChunck[i];\n ctx.globalAlpha = point.opacity;\n ctx.fillRect(point.x, point.y, point.width, point.width);\n }\n\n ctx.restore();\n }\n\n /**\n * Render all spray chunks\n */\n _render() {\n const ctx = this.canvas.contextTop;\n ctx.fillStyle = this.color;\n\n this._saveAndTransform(ctx);\n\n for (let i = 0; i < this.sprayChunks.length; i++) {\n this.renderChunck(this.sprayChunks[i]);\n }\n ctx.restore();\n }\n\n /**\n * @param {Point} pointer\n */\n addSprayChunk(pointer: Point) {\n this.sprayChunk = [];\n const radius = this.width / 2;\n\n for (let i = 0; i < this.density; i++) {\n this.sprayChunk.push({\n x: getRandomInt(pointer.x - radius, pointer.x + radius),\n y: getRandomInt(pointer.y - radius, pointer.y + radius),\n width: this.dotWidthVariance\n ? getRandomInt(\n // bottom clamp width to 1\n Math.max(1, this.dotWidth - this.dotWidthVariance),\n this.dotWidth + this.dotWidthVariance,\n )\n : this.dotWidth,\n opacity: this.randomOpacity ? getRandomInt(0, 100) / 100 : 1,\n });\n }\n\n this.sprayChunks.push(this.sprayChunk);\n }\n}\n","import { Pattern } from '../Pattern';\nimport { createCanvasElement } from '../util/misc/dom';\nimport type { Canvas } from '../canvas/Canvas';\nimport { PencilBrush } from './PencilBrush';\nimport type { TSimplePathData } from '../util/path/typedefs';\n\nexport class PatternBrush extends PencilBrush {\n declare source?: CanvasImageSource;\n\n constructor(canvas: Canvas) {\n super(canvas);\n }\n\n getPatternSrc() {\n const dotWidth = 20,\n dotDistance = 5,\n patternCanvas = createCanvasElement(),\n patternCtx = patternCanvas.getContext('2d');\n\n patternCanvas.width = patternCanvas.height = dotWidth + dotDistance;\n if (patternCtx) {\n patternCtx.fillStyle = this.color;\n patternCtx.beginPath();\n patternCtx.arc(\n dotWidth / 2,\n dotWidth / 2,\n dotWidth / 2,\n 0,\n Math.PI * 2,\n false,\n );\n patternCtx.closePath();\n patternCtx.fill();\n }\n return patternCanvas;\n }\n\n /**\n * Creates \"pattern\" instance property\n * @param {CanvasRenderingContext2D} ctx\n */\n getPattern(ctx: CanvasRenderingContext2D) {\n return ctx.createPattern(this.source || this.getPatternSrc(), 'repeat');\n }\n\n /**\n * Sets brush styles\n * @param {CanvasRenderingContext2D} ctx\n */\n _setBrushStyles(ctx: CanvasRenderingContext2D) {\n super._setBrushStyles(ctx);\n const pattern = this.getPattern(ctx);\n pattern && (ctx.strokeStyle = pattern);\n }\n\n /**\n * Creates path\n */\n createPath(pathData: TSimplePathData) {\n const path = super.createPath(pathData),\n topLeft = path._getLeftTopCoords().scalarAdd(path.strokeWidth / 2);\n\n path.stroke = new Pattern({\n source: this.source || this.getPatternSrc(),\n offsetX: -topLeft.x,\n offsetY: -topLeft.y,\n });\n return path;\n }\n}\n","import { SHARED_ATTRIBUTES } from '../parser/attributes';\nimport { parseAttributes } from '../parser/parseAttributes';\nimport type { Abortable, TClassProperties, TOptions } from '../typedefs';\nimport { classRegistry } from '../ClassRegistry';\nimport { FabricObject, cacheProperties } from './Object/FabricObject';\nimport { Point } from '../Point';\nimport { isFiller } from '../util/typeAssertions';\nimport type { FabricObjectProps, SerializedObjectProps } from './Object/types';\nimport type { ObjectEvents } from '../EventTypeDefs';\nimport { makeBoundingBoxFromPoints } from '../util';\nimport { CENTER, LEFT, TOP } from '../constants';\nimport type { CSSRules } from '../parser/typedefs';\n\n// @TODO this code is terrible and Line should be a special case of polyline.\n\nconst coordProps = ['x1', 'x2', 'y1', 'y2'] as const;\n\ninterface UniqueLineProps {\n x1: number;\n x2: number;\n y1: number;\n y2: number;\n}\n\nexport interface SerializedLineProps\n extends SerializedObjectProps,\n UniqueLineProps {}\n\n/**\n * A Class to draw a line\n * A bunch of methods will be added to Polyline to handle the line case\n * The line class is very strange to work with, is all special, it hardly aligns\n * to what a developer want everytime there is an angle\n * @deprecated\n */\nexport class Line<\n Props extends TOptions = Partial,\n SProps extends SerializedLineProps = SerializedLineProps,\n EventSpec extends ObjectEvents = ObjectEvents,\n >\n extends FabricObject\n implements UniqueLineProps\n{\n /**\n * x value or first line edge\n * @type number\n */\n declare x1: number;\n\n /**\n * y value or first line edge\n * @type number\n */\n declare y1: number;\n\n /**\n * x value or second line edge\n * @type number\n */\n declare x2: number;\n\n /**\n * y value or second line edge\n * @type number\n */\n declare y2: number;\n\n static type = 'Line';\n\n static cacheProperties = [...cacheProperties, ...coordProps];\n /**\n * Constructor\n * @param {Array} [points] Array of points\n * @param {Object} [options] Options object\n * @return {Line} thisArg\n */\n constructor([x1, y1, x2, y2] = [0, 0, 0, 0], options: Partial = {}) {\n super();\n Object.assign(this, Line.ownDefaults);\n this.setOptions(options);\n this.x1 = x1;\n this.x2 = x2;\n this.y1 = y1;\n this.y2 = y2;\n this._setWidthHeight();\n const { left, top } = options;\n typeof left === 'number' && this.set(LEFT, left);\n typeof top === 'number' && this.set(TOP, top);\n }\n\n /**\n * @private\n * @param {Object} [options] Options\n */\n _setWidthHeight() {\n const { x1, y1, x2, y2 } = this;\n this.width = Math.abs(x2 - x1);\n this.height = Math.abs(y2 - y1);\n const { left, top, width, height } = makeBoundingBoxFromPoints([\n { x: x1, y: y1 },\n { x: x2, y: y2 },\n ]);\n const position = new Point(left + width / 2, top + height / 2);\n this.setPositionByOrigin(position, CENTER, CENTER);\n }\n\n /**\n * @private\n * @param {String} key\n * @param {*} value\n */\n _set(key: string, value: any) {\n super._set(key, value);\n if (coordProps.includes(key as keyof UniqueLineProps)) {\n // this doesn't make sense very much, since setting x1 when top or left\n // are already set, is just going to show a strange result since the\n // line will move way more than the developer expect.\n // in fabric5 it worked only when the line didn't have extra transformations,\n // in fabric6 too. With extra transform they behave bad in different ways.\n // This needs probably a good rework or a tutorial if you have to create a dynamic line\n this._setWidthHeight();\n }\n return this;\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _render(ctx: CanvasRenderingContext2D) {\n ctx.beginPath();\n\n const p = this.calcLinePoints();\n ctx.moveTo(p.x1, p.y1);\n ctx.lineTo(p.x2, p.y2);\n\n ctx.lineWidth = this.strokeWidth;\n\n // TODO: test this\n // make sure setting \"fill\" changes color of a line\n // (by copying fillStyle to strokeStyle, since line is stroked, not filled)\n const origStrokeStyle = ctx.strokeStyle;\n if (isFiller(this.stroke)) {\n ctx.strokeStyle = this.stroke.toLive(ctx)!;\n } else {\n ctx.strokeStyle = this.stroke ?? ctx.fillStyle;\n }\n this.stroke && this._renderStroke(ctx);\n ctx.strokeStyle = origStrokeStyle;\n }\n\n /**\n * This function is an helper for svg import. it returns the center of the object in the svg\n * untransformed coordinates\n * @private\n * @return {Point} center point from element coordinates\n */\n _findCenterFromElement(): Point {\n return new Point((this.x1 + this.x2) / 2, (this.y1 + this.y2) / 2);\n }\n\n /**\n * Returns object representation of an instance\n * @method toObject\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} object representation of an instance\n */\n toObject<\n T extends Omit, keyof SProps>,\n K extends keyof T = never,\n >(propertiesToInclude: K[] = []): Pick & SProps {\n return {\n ...super.toObject(propertiesToInclude),\n ...this.calcLinePoints(),\n };\n }\n\n /*\n * Calculate object dimensions from its properties\n * @private\n */\n _getNonTransformedDimensions(): Point {\n const dim = super._getNonTransformedDimensions();\n if (this.strokeLineCap === 'butt') {\n if (this.width === 0) {\n dim.y -= this.strokeWidth;\n }\n if (this.height === 0) {\n dim.x -= this.strokeWidth;\n }\n }\n return dim;\n }\n\n /**\n * Recalculates line points given width and height\n * Those points are simply placed around the center,\n * This is not useful outside internal render functions and svg output\n * Is not meant to be for the developer.\n * @private\n */\n calcLinePoints(): UniqueLineProps {\n const { x1: _x1, x2: _x2, y1: _y1, y2: _y2, width, height } = this;\n const xMult = _x1 <= _x2 ? -1 : 1,\n yMult = _y1 <= _y2 ? -1 : 1,\n x1 = (xMult * width) / 2,\n y1 = (yMult * height) / 2,\n x2 = (xMult * -width) / 2,\n y2 = (yMult * -height) / 2;\n\n return {\n x1,\n x2,\n y1,\n y2,\n };\n }\n\n /* _FROM_SVG_START_ */\n\n /**\n * Returns svg representation of an instance\n * @return {Array} an array of strings with the specific svg representation\n * of the instance\n */\n _toSVG() {\n const { x1, x2, y1, y2 } = this.calcLinePoints();\n return [\n '\\n`,\n ];\n }\n\n /**\n * List of attribute names to account for when parsing SVG element (used by {@link Line.fromElement})\n * @see http://www.w3.org/TR/SVG/shapes.html#LineElement\n */\n static ATTRIBUTE_NAMES = SHARED_ATTRIBUTES.concat(coordProps);\n\n /**\n * Returns Line instance from an SVG element\n * @param {HTMLElement} element Element to parse\n * @param {Object} [options] Options object\n * @param {Function} [callback] callback function invoked after parsing\n */\n static async fromElement(\n element: HTMLElement,\n options?: Abortable,\n cssRules?: CSSRules,\n ) {\n const {\n x1 = 0,\n y1 = 0,\n x2 = 0,\n y2 = 0,\n ...parsedAttributes\n } = parseAttributes(element, this.ATTRIBUTE_NAMES, cssRules);\n return new this([x1, y1, x2, y2], parsedAttributes);\n }\n\n /* _FROM_SVG_END_ */\n\n /**\n * Returns Line instance from an object representation\n * @param {Object} object Object to create an instance from\n * @returns {Promise}\n */\n static fromObject>({\n x1,\n y1,\n x2,\n y2,\n ...object\n }: T) {\n return this._fromObject(\n {\n ...object,\n points: [x1, y1, x2, y2],\n },\n {\n extraParam: 'points',\n },\n );\n }\n}\n\nclassRegistry.setClass(Line);\nclassRegistry.setSVGClass(Line);\n","import { classRegistry } from '../ClassRegistry';\nimport { FabricObject } from './Object/FabricObject';\nimport type { FabricObjectProps, SerializedObjectProps } from './Object/types';\nimport type { TClassProperties, TOptions } from '../typedefs';\nimport type { ObjectEvents } from '../EventTypeDefs';\n\nexport const triangleDefaultValues: Partial> = {\n width: 100,\n height: 100,\n};\n\nexport class Triangle<\n Props extends TOptions = Partial,\n SProps extends SerializedObjectProps = SerializedObjectProps,\n EventSpec extends ObjectEvents = ObjectEvents,\n >\n extends FabricObject\n implements FabricObjectProps\n{\n static type = 'Triangle';\n\n static ownDefaults = triangleDefaultValues;\n\n static getDefaults(): Record {\n return { ...super.getDefaults(), ...Triangle.ownDefaults };\n }\n\n /**\n * Constructor\n * @param {Object} [options] Options object\n */\n constructor(options?: Props) {\n super();\n Object.assign(this, Triangle.ownDefaults);\n this.setOptions(options);\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _render(ctx: CanvasRenderingContext2D) {\n const widthBy2 = this.width / 2,\n heightBy2 = this.height / 2;\n\n ctx.beginPath();\n ctx.moveTo(-widthBy2, heightBy2);\n ctx.lineTo(0, -heightBy2);\n ctx.lineTo(widthBy2, heightBy2);\n ctx.closePath();\n\n this._renderPaintInOrder(ctx);\n }\n\n /**\n * Returns svg representation of an instance\n * @return {Array} an array of strings with the specific svg representation\n * of the instance\n */\n _toSVG() {\n const widthBy2 = this.width / 2,\n heightBy2 = this.height / 2,\n points = `${-widthBy2} ${heightBy2},0 ${-heightBy2},${widthBy2} ${heightBy2}`;\n return [''];\n }\n}\n\nclassRegistry.setClass(Triangle);\nclassRegistry.setSVGClass(Triangle);\n","import { SCALE_X, SCALE_Y, twoMathPi } from '../constants';\nimport { SHARED_ATTRIBUTES } from '../parser/attributes';\nimport { parseAttributes } from '../parser/parseAttributes';\nimport type { Abortable, TClassProperties, TOptions } from '../typedefs';\nimport { classRegistry } from '../ClassRegistry';\nimport { FabricObject, cacheProperties } from './Object/FabricObject';\nimport type { FabricObjectProps, SerializedObjectProps } from './Object/types';\nimport type { ObjectEvents } from '../EventTypeDefs';\nimport type { CSSRules } from '../parser/typedefs';\n\nexport const ellipseDefaultValues: Partial> = {\n rx: 0,\n ry: 0,\n};\n\ninterface UniqueEllipseProps {\n rx: number;\n ry: number;\n}\n\nexport interface SerializedEllipseProps\n extends SerializedObjectProps,\n UniqueEllipseProps {}\n\nexport interface EllipseProps extends FabricObjectProps, UniqueEllipseProps {}\n\nconst ELLIPSE_PROPS = ['rx', 'ry'] as const;\n\nexport class Ellipse<\n Props extends TOptions = Partial,\n SProps extends SerializedEllipseProps = SerializedEllipseProps,\n EventSpec extends ObjectEvents = ObjectEvents,\n >\n extends FabricObject\n implements EllipseProps\n{\n /**\n * Horizontal radius\n * @type Number\n */\n declare rx: number;\n\n /**\n * Vertical radius\n * @type Number\n */\n declare ry: number;\n\n static type = 'Ellipse';\n\n static cacheProperties = [...cacheProperties, ...ELLIPSE_PROPS];\n\n static ownDefaults = ellipseDefaultValues;\n\n static getDefaults(): Record {\n return {\n ...super.getDefaults(),\n ...Ellipse.ownDefaults,\n };\n }\n\n /**\n * Constructor\n * @param {Object} [options] Options object\n */\n constructor(options?: Props) {\n super();\n Object.assign(this, Ellipse.ownDefaults);\n this.setOptions(options);\n }\n\n /**\n * @private\n * @param {String} key\n * @param {*} value\n * @return {Ellipse} thisArg\n */\n _set(key: string, value: any) {\n super._set(key, value);\n switch (key) {\n case 'rx':\n this.rx = value;\n this.set('width', value * 2);\n break;\n\n case 'ry':\n this.ry = value;\n this.set('height', value * 2);\n break;\n }\n return this;\n }\n\n /**\n * Returns horizontal radius of an object (according to how an object is scaled)\n * @return {Number}\n */\n getRx() {\n return this.get('rx') * this.get(SCALE_X);\n }\n\n /**\n * Returns Vertical radius of an object (according to how an object is scaled)\n * @return {Number}\n */\n getRy() {\n return this.get('ry') * this.get(SCALE_Y);\n }\n\n /**\n * Returns object representation of an instance\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} object representation of an instance\n */\n toObject<\n T extends Omit, keyof SProps>,\n K extends keyof T = never,\n >(propertiesToInclude: K[] = []): Pick & SProps {\n return super.toObject([...ELLIPSE_PROPS, ...propertiesToInclude]);\n }\n\n /**\n * Returns svg representation of an instance\n * @return {Array} an array of strings with the specific svg representation\n * of the instance\n */\n _toSVG(): string[] {\n return [\n '\\n`,\n ];\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx context to render on\n */\n _render(ctx: CanvasRenderingContext2D) {\n ctx.beginPath();\n ctx.save();\n ctx.transform(1, 0, 0, this.ry / this.rx, 0, 0);\n ctx.arc(0, 0, this.rx, 0, twoMathPi, false);\n ctx.restore();\n this._renderPaintInOrder(ctx);\n }\n\n /* _FROM_SVG_START_ */\n\n /**\n * List of attribute names to account for when parsing SVG element (used by {@link Ellipse.fromElement})\n * @see http://www.w3.org/TR/SVG/shapes.html#EllipseElement\n */\n static ATTRIBUTE_NAMES = [...SHARED_ATTRIBUTES, 'cx', 'cy', 'rx', 'ry'];\n\n /**\n * Returns {@link Ellipse} instance from an SVG element\n * @param {HTMLElement} element Element to parse\n * @return {Ellipse}\n */\n static async fromElement(\n element: HTMLElement,\n options?: Abortable,\n cssRules?: CSSRules,\n ) {\n const parsedAttributes = parseAttributes(\n element,\n this.ATTRIBUTE_NAMES,\n cssRules,\n );\n\n parsedAttributes.left = (parsedAttributes.left || 0) - parsedAttributes.rx;\n parsedAttributes.top = (parsedAttributes.top || 0) - parsedAttributes.ry;\n return new this(parsedAttributes);\n }\n\n /* _FROM_SVG_END_ */\n}\n\nclassRegistry.setClass(Ellipse);\nclassRegistry.setSVGClass(Ellipse);\n","import type { XY } from '../Point';\n\n/**\n * Parses \"points\" attribute, returning an array of values\n * @static\n * @param {String} points points attribute string\n * @return {Array} array of points\n */\nexport function parsePointsAttribute(points: string | null): XY[] {\n // points attribute is required and must not be empty\n if (!points) {\n return [];\n }\n\n // replace commas with whitespace and remove bookending whitespace\n const pointsSplit: string[] = points.replace(/,/g, ' ').trim().split(/\\s+/);\n\n const parsedPoints = [];\n\n for (let i = 0; i < pointsSplit.length; i += 2) {\n parsedPoints.push({\n x: parseFloat(pointsSplit[i]),\n y: parseFloat(pointsSplit[i + 1]),\n });\n }\n\n // odd number of points is an error\n // if (parsedPoints.length % 2 !== 0) {\n // return null;\n // }\n return parsedPoints;\n}\n","import { config } from '../config';\nimport { SHARED_ATTRIBUTES } from '../parser/attributes';\nimport { parseAttributes } from '../parser/parseAttributes';\nimport { parsePointsAttribute } from '../parser/parsePointsAttribute';\nimport type { XY } from '../Point';\nimport { Point } from '../Point';\nimport type { Abortable, TClassProperties, TOptions } from '../typedefs';\nimport { classRegistry } from '../ClassRegistry';\nimport { makeBoundingBoxFromPoints } from '../util/misc/boundingBoxFromPoints';\nimport { calcDimensionsMatrix, transformPoint } from '../util/misc/matrix';\nimport { projectStrokeOnPoints } from '../util/misc/projectStroke';\nimport type { TProjectStrokeOnPointsOptions } from '../util/misc/projectStroke/types';\nimport { degreesToRadians } from '../util/misc/radiansDegreesConversion';\nimport { toFixed } from '../util/misc/toFixed';\nimport { FabricObject, cacheProperties } from './Object/FabricObject';\nimport type { FabricObjectProps, SerializedObjectProps } from './Object/types';\nimport type { ObjectEvents } from '../EventTypeDefs';\nimport {\n CENTER,\n LEFT,\n SCALE_X,\n SCALE_Y,\n SKEW_X,\n SKEW_Y,\n TOP,\n} from '../constants';\nimport type { CSSRules } from '../parser/typedefs';\n\nexport const polylineDefaultValues: Partial> = {\n /**\n * @deprecated transient option soon to be removed in favor of a different design\n */\n exactBoundingBox: false,\n};\n\nexport interface SerializedPolylineProps extends SerializedObjectProps {\n points: XY[];\n}\n\nexport class Polyline<\n Props extends TOptions = Partial,\n SProps extends SerializedPolylineProps = SerializedPolylineProps,\n EventSpec extends ObjectEvents = ObjectEvents,\n> extends FabricObject {\n /**\n * Points array\n * @type Array\n */\n declare points: XY[];\n\n /**\n * WARNING: Feature in progress\n * Calculate the exact bounding box taking in account strokeWidth on acute angles\n * this will be turned to true by default on fabric 6.0\n * maybe will be left in as an optimization since calculations may be slow\n * @deprecated transient option soon to be removed in favor of a different design\n * @type Boolean\n * @default false\n */\n declare exactBoundingBox: boolean;\n\n declare private initialized: true | undefined;\n\n static ownDefaults = polylineDefaultValues;\n\n static type = 'Polyline';\n\n static getDefaults(): Record {\n return {\n ...super.getDefaults(),\n ...Polyline.ownDefaults,\n };\n }\n\n /**\n * A list of properties that if changed trigger a recalculation of dimensions\n * @todo check if you really need to recalculate for all cases\n */\n static layoutProperties: (keyof Polyline)[] = [\n SKEW_X,\n SKEW_Y,\n 'strokeLineCap',\n 'strokeLineJoin',\n 'strokeMiterLimit',\n 'strokeWidth',\n 'strokeUniform',\n 'points',\n ];\n\n declare pathOffset: Point;\n\n declare strokeOffset: Point;\n\n static cacheProperties = [...cacheProperties, 'points'];\n\n strokeDiff: Point;\n\n /**\n * Constructor\n * @param {Array} points Array of points (where each point is an object with x and y)\n * @param {Object} [options] Options object\n * @return {Polyline} thisArg\n * @example\n * var poly = new Polyline([\n * { x: 10, y: 10 },\n * { x: 50, y: 30 },\n * { x: 40, y: 70 },\n * { x: 60, y: 50 },\n * { x: 100, y: 150 },\n * { x: 40, y: 100 }\n * ], {\n * stroke: 'red',\n * left: 100,\n * top: 100\n * });\n */\n constructor(points: XY[] = [], options: Props = {} as Props) {\n super();\n Object.assign(this, Polyline.ownDefaults);\n this.setOptions(options);\n this.points = points;\n const { left, top } = options;\n this.initialized = true;\n this.setBoundingBox(true);\n typeof left === 'number' && this.set(LEFT, left);\n typeof top === 'number' && this.set(TOP, top);\n }\n\n protected isOpen() {\n return true;\n }\n\n private _projectStrokeOnPoints(options: TProjectStrokeOnPointsOptions) {\n return projectStrokeOnPoints(this.points, options, this.isOpen());\n }\n\n /**\n * Calculate the polygon bounding box\n * @private\n */\n _calcDimensions(options?: Partial) {\n options = {\n scaleX: this.scaleX,\n scaleY: this.scaleY,\n skewX: this.skewX,\n skewY: this.skewY,\n strokeLineCap: this.strokeLineCap,\n strokeLineJoin: this.strokeLineJoin,\n strokeMiterLimit: this.strokeMiterLimit,\n strokeUniform: this.strokeUniform,\n strokeWidth: this.strokeWidth,\n ...(options || {}),\n };\n const points = this.exactBoundingBox\n ? this._projectStrokeOnPoints(\n options as TProjectStrokeOnPointsOptions,\n ).map((projection) => projection.projectedPoint)\n : this.points;\n if (points.length === 0) {\n return {\n left: 0,\n top: 0,\n width: 0,\n height: 0,\n pathOffset: new Point(),\n strokeOffset: new Point(),\n strokeDiff: new Point(),\n };\n }\n const bbox = makeBoundingBoxFromPoints(points),\n // Remove scale effect, since it's applied after\n matrix = calcDimensionsMatrix({ ...options, scaleX: 1, scaleY: 1 }),\n bboxNoStroke = makeBoundingBoxFromPoints(\n this.points.map((p) => transformPoint(p, matrix, true)),\n ),\n scale = new Point(this.scaleX, this.scaleY);\n let offsetX = bbox.left + bbox.width / 2,\n offsetY = bbox.top + bbox.height / 2;\n if (this.exactBoundingBox) {\n offsetX = offsetX - offsetY * Math.tan(degreesToRadians(this.skewX));\n // Order of those assignments is important.\n // offsetY relies on offsetX being already changed by the line above\n offsetY = offsetY - offsetX * Math.tan(degreesToRadians(this.skewY));\n }\n\n return {\n ...bbox,\n pathOffset: new Point(offsetX, offsetY),\n strokeOffset: new Point(bboxNoStroke.left, bboxNoStroke.top)\n .subtract(new Point(bbox.left, bbox.top))\n .multiply(scale),\n strokeDiff: new Point(bbox.width, bbox.height)\n .subtract(new Point(bboxNoStroke.width, bboxNoStroke.height))\n .multiply(scale),\n };\n }\n\n /**\n * This function is an helper for svg import. it returns the center of the object in the svg\n * untransformed coordinates, by look at the polyline/polygon points.\n * @private\n * @return {Point} center point from element coordinates\n */\n _findCenterFromElement(): Point {\n const bbox = makeBoundingBoxFromPoints(this.points);\n return new Point(bbox.left + bbox.width / 2, bbox.top + bbox.height / 2);\n }\n\n setDimensions() {\n this.setBoundingBox();\n }\n\n setBoundingBox(adjustPosition?: boolean) {\n const { left, top, width, height, pathOffset, strokeOffset, strokeDiff } =\n this._calcDimensions();\n this.set({ width, height, pathOffset, strokeOffset, strokeDiff });\n adjustPosition &&\n this.setPositionByOrigin(\n new Point(left + width / 2, top + height / 2),\n CENTER,\n CENTER,\n );\n }\n\n /**\n * @deprecated intermidiate method to be removed, do not use\n */\n protected isStrokeAccountedForInDimensions() {\n return this.exactBoundingBox;\n }\n\n /**\n * @override stroke is taken in account in size\n */\n _getNonTransformedDimensions() {\n return this.exactBoundingBox\n ? // TODO: fix this\n new Point(this.width, this.height)\n : super._getNonTransformedDimensions();\n }\n\n /**\n * @override stroke and skewing are taken into account when projecting stroke on points,\n * therefore we don't want the default calculation to account for skewing as well.\n * Though it is possible to pass `width` and `height` in `options`, doing so is very strange, use with discretion.\n *\n * @private\n */\n _getTransformedDimensions(options: any = {}) {\n if (this.exactBoundingBox) {\n let size: Point;\n /* When `strokeUniform = true`, any changes to the properties require recalculating the `width` and `height` because\n the stroke projections are affected.\n When `strokeUniform = false`, we don't need to recalculate for scale transformations, as the effect of scale on\n projections follows a linear function (e.g. scaleX of 2 just multiply width by 2)*/\n if (\n Object.keys(options).some(\n (key) =>\n this.strokeUniform ||\n (this.constructor as typeof Polyline).layoutProperties.includes(\n key as keyof TProjectStrokeOnPointsOptions,\n ),\n )\n ) {\n const { width, height } = this._calcDimensions(options);\n size = new Point(options.width ?? width, options.height ?? height);\n } else {\n size = new Point(\n options.width ?? this.width,\n options.height ?? this.height,\n );\n }\n return size.multiply(\n new Point(options.scaleX || this.scaleX, options.scaleY || this.scaleY),\n );\n } else {\n return super._getTransformedDimensions(options);\n }\n }\n\n /**\n * Recalculates dimensions when changing skew and scale\n * @private\n */\n _set(key: string, value: any) {\n const changed = this.initialized && this[key as keyof this] !== value;\n const output = super._set(key, value);\n if (\n this.exactBoundingBox &&\n changed &&\n (((key === SCALE_X || key === SCALE_Y) &&\n this.strokeUniform &&\n (this.constructor as typeof Polyline).layoutProperties.includes(\n 'strokeUniform',\n )) ||\n (this.constructor as typeof Polyline).layoutProperties.includes(\n key as keyof Polyline,\n ))\n ) {\n this.setDimensions();\n }\n return output;\n }\n\n /**\n * Returns object representation of an instance\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} Object representation of an instance\n */\n toObject<\n T extends Omit, keyof SProps>,\n K extends keyof T = never,\n >(propertiesToInclude: K[] = []): Pick & SProps {\n return {\n ...super.toObject(propertiesToInclude),\n points: this.points.map(({ x, y }) => ({ x, y })),\n };\n }\n\n /**\n * Returns svg representation of an instance\n * @return {Array} an array of strings with the specific svg representation\n * of the instance\n */\n _toSVG() {\n const points = [],\n diffX = this.pathOffset.x,\n diffY = this.pathOffset.y,\n NUM_FRACTION_DIGITS = config.NUM_FRACTION_DIGITS;\n\n for (let i = 0, len = this.points.length; i < len; i++) {\n points.push(\n toFixed(this.points[i].x - diffX, NUM_FRACTION_DIGITS),\n ',',\n toFixed(this.points[i].y - diffY, NUM_FRACTION_DIGITS),\n ' ',\n );\n }\n return [\n `<${\n (this.constructor as typeof Polyline).type.toLowerCase() as\n | 'polyline'\n | 'polygon'\n } `,\n 'COMMON_PARTS',\n `points=\"${points.join('')}\" />\\n`,\n ];\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _render(ctx: CanvasRenderingContext2D) {\n const len = this.points.length,\n x = this.pathOffset.x,\n y = this.pathOffset.y;\n\n if (!len || isNaN(this.points[len - 1].y)) {\n // do not draw if no points or odd points\n // NaN comes from parseFloat of a empty string in parser\n return;\n }\n ctx.beginPath();\n ctx.moveTo(this.points[0].x - x, this.points[0].y - y);\n for (let i = 0; i < len; i++) {\n const point = this.points[i];\n ctx.lineTo(point.x - x, point.y - y);\n }\n !this.isOpen() && ctx.closePath();\n this._renderPaintInOrder(ctx);\n }\n\n /**\n * Returns complexity of an instance\n * @return {Number} complexity of this instance\n */\n complexity(): number {\n return this.points.length;\n }\n\n /* _FROM_SVG_START_ */\n\n /**\n * List of attribute names to account for when parsing SVG element (used by {@link Polyline.fromElement})\n * @see: http://www.w3.org/TR/SVG/shapes.html#PolylineElement\n */\n static ATTRIBUTE_NAMES = [...SHARED_ATTRIBUTES];\n\n /**\n * Returns Polyline instance from an SVG element\n * @param {HTMLElement} element Element to parser\n * @param {Object} [options] Options object\n */\n static async fromElement(\n element: HTMLElement | SVGElement,\n options?: Abortable,\n cssRules?: CSSRules,\n ) {\n const points = parsePointsAttribute(element.getAttribute('points')),\n // we omit left and top to instruct the constructor to position the object using the bbox\n\n { left, top, ...parsedAttributes } = parseAttributes(\n element,\n this.ATTRIBUTE_NAMES,\n cssRules,\n );\n return new this(points, {\n ...parsedAttributes,\n ...options,\n });\n }\n\n /* _FROM_SVG_END_ */\n\n /**\n * Returns Polyline instance from an object representation\n * @param {Object} object Object to create an instance from\n * @returns {Promise}\n */\n static fromObject>(object: T) {\n return this._fromObject(object, {\n extraParam: 'points',\n });\n }\n}\n\nclassRegistry.setClass(Polyline);\nclassRegistry.setSVGClass(Polyline);\n","import { classRegistry } from '../ClassRegistry';\nimport { Polyline, polylineDefaultValues } from './Polyline';\n\nexport class Polygon extends Polyline {\n static ownDefaults = polylineDefaultValues;\n\n static type = 'Polygon';\n\n protected isOpen() {\n return false;\n }\n}\n\nclassRegistry.setClass(Polygon);\nclassRegistry.setSVGClass(Polygon);\n","import type { ObjectEvents } from '../../EventTypeDefs';\nimport type { FabricObjectProps, SerializedObjectProps } from '../Object/types';\nimport type { TOptions } from '../../typedefs';\nimport { FabricObject } from '../Object/FabricObject';\nimport { styleProperties } from './constants';\nimport type { StylePropertiesType } from './constants';\nimport type { FabricText } from './Text';\nimport { pick } from '../../util';\nimport { pickBy } from '../../util/misc/pick';\n\nexport type CompleteTextStyleDeclaration = Pick<\n FabricText,\n StylePropertiesType\n>;\n\nexport type TextStyleDeclaration = Partial;\n\nexport type TextStyle = {\n [line: number | string]: { [char: number | string]: TextStyleDeclaration };\n};\n\nexport abstract class StyledText<\n Props extends TOptions = Partial,\n SProps extends SerializedObjectProps = SerializedObjectProps,\n EventSpec extends ObjectEvents = ObjectEvents,\n> extends FabricObject {\n declare abstract styles: TextStyle;\n declare protected abstract _textLines: string[][];\n declare protected _forceClearCache: boolean;\n static _styleProperties: Readonly = styleProperties;\n abstract get2DCursorLocation(\n selectionStart: number,\n skipWrapping?: boolean,\n ): { charIndex: number; lineIndex: number };\n\n /**\n * Returns true if object has no styling or no styling in a line\n * @param {Number} lineIndex , lineIndex is on wrapped lines.\n * @return {Boolean}\n */\n isEmptyStyles(lineIndex?: number): boolean {\n if (!this.styles) {\n return true;\n }\n if (typeof lineIndex !== 'undefined' && !this.styles[lineIndex]) {\n return true;\n }\n const obj =\n typeof lineIndex === 'undefined'\n ? this.styles\n : { line: this.styles[lineIndex] };\n for (const p1 in obj) {\n for (const p2 in obj[p1]) {\n // eslint-disable-next-line no-unused-vars\n for (const p3 in obj[p1][p2]) {\n return false;\n }\n }\n }\n return true;\n }\n\n /**\n * Returns true if object has a style property or has it ina specified line\n * This function is used to detect if a text will use a particular property or not.\n * @param {String} property to check for\n * @param {Number} lineIndex to check the style on\n * @return {Boolean}\n */\n styleHas(property: keyof TextStyleDeclaration, lineIndex?: number): boolean {\n if (!this.styles) {\n return false;\n }\n if (typeof lineIndex !== 'undefined' && !this.styles[lineIndex]) {\n return false;\n }\n const obj =\n typeof lineIndex === 'undefined'\n ? this.styles\n : { 0: this.styles[lineIndex] };\n // eslint-disable-next-line\n for (const p1 in obj) {\n // eslint-disable-next-line\n for (const p2 in obj[p1]) {\n if (typeof obj[p1][p2][property] !== 'undefined') {\n return true;\n }\n }\n }\n return false;\n }\n\n /**\n * Check if characters in a text have a value for a property\n * whose value matches the textbox's value for that property. If so,\n * the character-level property is deleted. If the character\n * has no other properties, then it is also deleted. Finally,\n * if the line containing that character has no other characters\n * then it also is deleted.\n */\n cleanStyle(property: keyof TextStyleDeclaration) {\n if (!this.styles) {\n return false;\n }\n const obj = this.styles;\n let stylesCount = 0,\n letterCount,\n stylePropertyValue,\n allStyleObjectPropertiesMatch = true,\n graphemeCount = 0;\n for (const p1 in obj) {\n letterCount = 0;\n for (const p2 in obj[p1]) {\n const styleObject = obj[p1][p2] || {},\n stylePropertyHasBeenSet = styleObject[property] !== undefined;\n\n stylesCount++;\n\n if (stylePropertyHasBeenSet) {\n if (!stylePropertyValue) {\n stylePropertyValue = styleObject[property];\n } else if (styleObject[property] !== stylePropertyValue) {\n allStyleObjectPropertiesMatch = false;\n }\n\n if (styleObject[property] === this[property as keyof this]) {\n delete styleObject[property];\n }\n } else {\n allStyleObjectPropertiesMatch = false;\n }\n\n if (Object.keys(styleObject).length !== 0) {\n letterCount++;\n } else {\n delete obj[p1][p2];\n }\n }\n\n if (letterCount === 0) {\n delete obj[p1];\n }\n }\n // if every grapheme has the same style set then\n // delete those styles and set it on the parent\n for (let i = 0; i < this._textLines.length; i++) {\n graphemeCount += this._textLines[i].length;\n }\n if (allStyleObjectPropertiesMatch && stylesCount === graphemeCount) {\n this[property as keyof this] = stylePropertyValue as any;\n this.removeStyle(property);\n }\n }\n\n /**\n * Remove a style property or properties from all individual character styles\n * in a text object. Deletes the character style object if it contains no other style\n * props. Deletes a line style object if it contains no other character styles.\n *\n * @param {String} props The property to remove from character styles.\n */\n removeStyle(property: keyof TextStyleDeclaration) {\n if (!this.styles) {\n return;\n }\n const obj = this.styles;\n let line, lineNum, charNum;\n for (lineNum in obj) {\n line = obj[lineNum];\n for (charNum in line) {\n delete line[charNum][property];\n if (Object.keys(line[charNum]).length === 0) {\n delete line[charNum];\n }\n }\n if (Object.keys(line).length === 0) {\n delete obj[lineNum];\n }\n }\n }\n\n private _extendStyles(index: number, style: TextStyleDeclaration): void {\n const { lineIndex, charIndex } = this.get2DCursorLocation(index);\n\n if (!this._getLineStyle(lineIndex)) {\n this._setLineStyle(lineIndex);\n }\n\n const newStyle = pickBy(\n {\n // first create a new object that is a merge of existing and new\n ...this._getStyleDeclaration(lineIndex, charIndex),\n ...style,\n // use the predicate to discard undefined values\n },\n (value) => value !== undefined,\n );\n\n // finally assign to the old position the new style\n this._setStyleDeclaration(lineIndex, charIndex, newStyle);\n }\n\n /**\n * Gets style of a current selection/cursor (at the start position)\n * @param {Number} startIndex Start index to get styles at\n * @param {Number} endIndex End index to get styles at, if not specified startIndex + 1\n * @param {Boolean} [complete] get full style or not\n * @return {Array} styles an array with one, zero or more Style objects\n */\n getSelectionStyles(\n startIndex: number,\n endIndex?: number,\n complete?: boolean,\n ): TextStyleDeclaration[] {\n const styles: TextStyleDeclaration[] = [];\n for (let i = startIndex; i < (endIndex || startIndex); i++) {\n styles.push(this.getStyleAtPosition(i, complete));\n }\n return styles;\n }\n\n /**\n * Gets style of a current selection/cursor position\n * @param {Number} position to get styles at\n * @param {Boolean} [complete] full style if true\n * @return {Object} style Style object at a specified index\n * @private\n */\n getStyleAtPosition(position: number, complete?: boolean) {\n const { lineIndex, charIndex } = this.get2DCursorLocation(position);\n return complete\n ? this.getCompleteStyleDeclaration(lineIndex, charIndex)\n : this._getStyleDeclaration(lineIndex, charIndex);\n }\n\n /**\n * Sets style of a current selection, if no selection exist, do not set anything.\n * @param {Object} styles Styles object\n * @param {Number} startIndex Start index to get styles at\n * @param {Number} [endIndex] End index to get styles at, if not specified startIndex + 1\n */\n setSelectionStyles(styles: object, startIndex: number, endIndex?: number) {\n for (let i = startIndex; i < (endIndex || startIndex); i++) {\n this._extendStyles(i, styles);\n }\n /* not included in _extendStyles to avoid clearing cache more than once */\n this._forceClearCache = true;\n }\n\n /**\n * Get a reference, not a clone, to the style object for a given character,\n * if no style is set for a line or char, return a new empty object.\n * This is tricky and confusing because when you get an empty object you can't\n * determine if it is a reference or a new one.\n * @TODO this should always return a reference or always a clone or undefined when necessary.\n * @protected\n * @param {Number} lineIndex\n * @param {Number} charIndex\n * @return {TextStyleDeclaration} a style object reference to the existing one or a new empty object when undefined\n */\n _getStyleDeclaration(\n lineIndex: number,\n charIndex: number,\n ): TextStyleDeclaration {\n const lineStyle = this.styles && this.styles[lineIndex];\n return lineStyle ? (lineStyle[charIndex] ?? {}) : {};\n }\n\n /**\n * return a new object that contains all the style property for a character\n * the object returned is newly created\n * @param {Number} lineIndex of the line where the character is\n * @param {Number} charIndex position of the character on the line\n * @return {Object} style object\n */\n getCompleteStyleDeclaration(\n lineIndex: number,\n charIndex: number,\n ): CompleteTextStyleDeclaration {\n return {\n ...pick(\n this,\n (this.constructor as typeof StyledText)\n ._styleProperties as (keyof this)[],\n ),\n ...this._getStyleDeclaration(lineIndex, charIndex),\n } as CompleteTextStyleDeclaration;\n }\n\n /**\n * @param {Number} lineIndex\n * @param {Number} charIndex\n * @param {Object} style\n * @private\n */\n protected _setStyleDeclaration(\n lineIndex: number,\n charIndex: number,\n style: object,\n ) {\n this.styles[lineIndex][charIndex] = style;\n }\n\n /**\n *\n * @param {Number} lineIndex\n * @param {Number} charIndex\n * @private\n */\n protected _deleteStyleDeclaration(lineIndex: number, charIndex: number) {\n delete this.styles[lineIndex][charIndex];\n }\n\n /**\n * @param {Number} lineIndex\n * @return {Boolean} if the line exists or not\n * @private\n */\n protected _getLineStyle(lineIndex: number): boolean {\n return !!this.styles[lineIndex];\n }\n\n /**\n * Set the line style to an empty object so that is initialized\n * @param {Number} lineIndex\n * @private\n */\n protected _setLineStyle(lineIndex: number) {\n this.styles[lineIndex] = {};\n }\n\n protected _deleteLineStyle(lineIndex: number) {\n delete this.styles[lineIndex];\n }\n}\n","import { config } from '../../config';\nimport type { TSVGReviver } from '../../typedefs';\nimport { escapeXml } from '../../util/lang_string';\nimport { colorPropToSVG, createSVGRect } from '../../util/misc/svgParsing';\nimport { hasStyleChanged } from '../../util/misc/textStyles';\nimport { toFixed } from '../../util/misc/toFixed';\nimport { FabricObjectSVGExportMixin } from '../Object/FabricObjectSVGExportMixin';\nimport { type TextStyleDeclaration } from './StyledText';\nimport { JUSTIFY } from '../Text/constants';\nimport type { FabricText, GraphemeBBox } from './Text';\nimport { STROKE, FILL } from '../../constants';\nimport { createRotateMatrix } from '../../util/misc/matrix';\nimport { radiansToDegrees } from '../../util/misc/radiansDegreesConversion';\nimport { Point } from '../../Point';\nimport { matrixToSVG } from '../../util/misc/svgExport';\n\nconst multipleSpacesRegex = / +/g;\nconst dblQuoteRegex = /\"/g;\n\nfunction createSVGInlineRect(\n color: string,\n left: number,\n top: number,\n width: number,\n height: number,\n) {\n return `\\t\\t${createSVGRect(color, { left, top, width, height })}\\n`;\n}\n\nexport class TextSVGExportMixin extends FabricObjectSVGExportMixin {\n _toSVG(this: TextSVGExportMixin & FabricText): string[] {\n const offsets = this._getSVGLeftTopOffsets(),\n textAndBg = this._getSVGTextAndBg(offsets.textTop, offsets.textLeft);\n return this._wrapSVGTextAndBg(textAndBg);\n }\n\n toSVG(this: TextSVGExportMixin & FabricText, reviver?: TSVGReviver): string {\n const textSvg = this._createBaseSVGMarkup(this._toSVG(), {\n reviver,\n noStyle: true,\n withShadow: true,\n }),\n path = this.path;\n if (path) {\n return (\n textSvg +\n path._createBaseSVGMarkup(path._toSVG(), {\n reviver,\n withShadow: true,\n additionalTransform: matrixToSVG(this.calcOwnMatrix()),\n })\n );\n }\n return textSvg;\n }\n\n private _getSVGLeftTopOffsets(this: TextSVGExportMixin & FabricText) {\n return {\n textLeft: -this.width / 2,\n textTop: -this.height / 2,\n lineTop: this.getHeightOfLine(0),\n };\n }\n\n private _wrapSVGTextAndBg(\n this: TextSVGExportMixin & FabricText,\n {\n textBgRects,\n textSpans,\n }: {\n textSpans: string[];\n textBgRects: string[];\n },\n ) {\n const noShadow = true,\n textDecoration = this.getSvgTextDecoration(this);\n return [\n textBgRects.join(''),\n '\\t\\t',\n textSpans.join(''),\n '\\n',\n ];\n }\n\n /**\n * @private\n * @param {Number} textTopOffset Text top offset\n * @param {Number} textLeftOffset Text left offset\n * @return {Object}\n */\n private _getSVGTextAndBg(\n this: TextSVGExportMixin & FabricText,\n textTopOffset: number,\n textLeftOffset: number,\n ) {\n const textSpans: string[] = [],\n textBgRects: string[] = [];\n let height = textTopOffset,\n lineOffset;\n\n // bounding-box background\n this.backgroundColor &&\n textBgRects.push(\n ...createSVGInlineRect(\n this.backgroundColor,\n -this.width / 2,\n -this.height / 2,\n this.width,\n this.height,\n ),\n );\n\n // text and text-background\n for (let i = 0, len = this._textLines.length; i < len; i++) {\n lineOffset = this._getLineLeftOffset(i);\n if (this.direction === 'rtl') {\n lineOffset += this.width;\n }\n if (this.textBackgroundColor || this.styleHas('textBackgroundColor', i)) {\n this._setSVGTextLineBg(\n textBgRects,\n i,\n textLeftOffset + lineOffset,\n height,\n );\n }\n this._setSVGTextLineText(\n textSpans,\n i,\n textLeftOffset + lineOffset,\n height,\n );\n height += this.getHeightOfLine(i);\n }\n\n return {\n textSpans,\n textBgRects,\n };\n }\n\n private _createTextCharSpan(\n this: TextSVGExportMixin & FabricText,\n char: string,\n styleDecl: TextStyleDeclaration,\n left: number,\n top: number,\n charBox: GraphemeBBox,\n ) {\n const numFractionDigit = config.NUM_FRACTION_DIGITS;\n const styleProps = this.getSvgSpanStyles(\n styleDecl,\n char !== char.trim() || !!char.match(multipleSpacesRegex),\n ),\n fillStyles = styleProps ? `style=\"${styleProps}\"` : '',\n dy = styleDecl.deltaY,\n dySpan = dy ? ` dy=\"${toFixed(dy, numFractionDigit)}\" ` : '',\n { angle, renderLeft, renderTop, width } = charBox;\n let angleAttr = '';\n if (renderLeft !== undefined) {\n const wBy2 = width / 2;\n angle &&\n (angleAttr = ` rotate=\"${toFixed(radiansToDegrees(angle), numFractionDigit)}\"`);\n const m = createRotateMatrix({ angle: radiansToDegrees(angle!) });\n m[4] = renderLeft!;\n m[5] = renderTop!;\n const renderPoint = new Point(-wBy2, 0).transform(m);\n left = renderPoint.x;\n top = renderPoint.y;\n }\n\n return `${escapeXml(char)}`;\n }\n\n private _setSVGTextLineText(\n this: TextSVGExportMixin & FabricText,\n textSpans: string[],\n lineIndex: number,\n textLeftOffset: number,\n textTopOffset: number,\n ) {\n const lineHeight = this.getHeightOfLine(lineIndex),\n isJustify = this.textAlign.includes(JUSTIFY),\n line = this._textLines[lineIndex];\n let actualStyle,\n nextStyle,\n charsToRender = '',\n charBox,\n style,\n boxWidth = 0,\n timeToRender;\n\n textTopOffset +=\n (lineHeight * (1 - this._fontSizeFraction)) / this.lineHeight;\n for (let i = 0, len = line.length - 1; i <= len; i++) {\n timeToRender = i === len || this.charSpacing || this.path;\n charsToRender += line[i];\n charBox = this.__charBounds[lineIndex][i];\n if (boxWidth === 0) {\n textLeftOffset += charBox.kernedWidth - charBox.width;\n boxWidth += charBox.width;\n } else {\n boxWidth += charBox.kernedWidth;\n }\n if (isJustify && !timeToRender) {\n if (this._reSpaceAndTab.test(line[i])) {\n timeToRender = true;\n }\n }\n if (!timeToRender) {\n // if we have charSpacing or a path, we render char by char\n actualStyle =\n actualStyle || this.getCompleteStyleDeclaration(lineIndex, i);\n nextStyle = this.getCompleteStyleDeclaration(lineIndex, i + 1);\n timeToRender = hasStyleChanged(actualStyle, nextStyle, true);\n }\n if (timeToRender) {\n style = this._getStyleDeclaration(lineIndex, i);\n textSpans.push(\n this._createTextCharSpan(\n charsToRender,\n style,\n textLeftOffset,\n textTopOffset,\n charBox,\n ),\n );\n charsToRender = '';\n actualStyle = nextStyle;\n if (this.direction === 'rtl') {\n textLeftOffset -= boxWidth;\n } else {\n textLeftOffset += boxWidth;\n }\n boxWidth = 0;\n }\n }\n }\n\n private _setSVGTextLineBg(\n this: TextSVGExportMixin & FabricText,\n textBgRects: (string | number)[],\n i: number,\n leftOffset: number,\n textTopOffset: number,\n ) {\n const line = this._textLines[i],\n heightOfLine = this.getHeightOfLine(i) / this.lineHeight;\n let boxWidth = 0,\n boxStart = 0,\n currentColor,\n lastColor = this.getValueOfPropertyAt(i, 0, 'textBackgroundColor');\n for (let j = 0; j < line.length; j++) {\n const { left, width, kernedWidth } = this.__charBounds[i][j];\n currentColor = this.getValueOfPropertyAt(i, j, 'textBackgroundColor');\n if (currentColor !== lastColor) {\n lastColor &&\n textBgRects.push(\n ...createSVGInlineRect(\n lastColor,\n leftOffset + boxStart,\n textTopOffset,\n boxWidth,\n heightOfLine,\n ),\n );\n boxStart = left;\n boxWidth = width;\n lastColor = currentColor;\n } else {\n boxWidth += kernedWidth;\n }\n }\n currentColor &&\n textBgRects.push(\n ...createSVGInlineRect(\n lastColor,\n leftOffset + boxStart,\n textTopOffset,\n boxWidth,\n heightOfLine,\n ),\n );\n }\n\n /**\n * Returns styles-string for svg-export\n * @param {Boolean} skipShadow a boolean to skip shadow filter output\n * @return {String}\n */\n getSvgStyles(this: TextSVGExportMixin & FabricText, skipShadow?: boolean) {\n return `${super.getSvgStyles(skipShadow)} text-decoration-thickness: ${toFixed((this.textDecorationThickness * this.getObjectScaling().y) / 10, config.NUM_FRACTION_DIGITS)}%; white-space: pre;`;\n }\n\n /**\n * Returns styles-string for svg-export\n * @param {Object} style the object from which to retrieve style properties\n * @param {Boolean} useWhiteSpace a boolean to include an additional attribute in the style.\n * @return {String}\n */\n getSvgSpanStyles(\n this: TextSVGExportMixin & FabricText,\n style: TextStyleDeclaration,\n useWhiteSpace?: boolean,\n ) {\n const {\n fontFamily,\n strokeWidth,\n stroke,\n fill,\n fontSize,\n fontStyle,\n fontWeight,\n deltaY,\n textDecorationThickness,\n linethrough,\n overline,\n underline,\n } = style;\n\n const textDecoration = this.getSvgTextDecoration({\n underline: underline ?? this.underline,\n overline: overline ?? this.overline,\n linethrough: linethrough ?? this.linethrough,\n });\n const thickness = textDecorationThickness || this.textDecorationThickness;\n return [\n stroke ? colorPropToSVG(STROKE, stroke) : '',\n strokeWidth ? `stroke-width: ${strokeWidth}; ` : '',\n fontFamily\n ? `font-family: ${\n !fontFamily.includes(\"'\") && !fontFamily.includes('\"')\n ? `'${fontFamily}'`\n : fontFamily\n }; `\n : '',\n fontSize ? `font-size: ${fontSize}px; ` : '',\n fontStyle ? `font-style: ${fontStyle}; ` : '',\n fontWeight ? `font-weight: ${fontWeight}; ` : '',\n textDecoration\n ? `text-decoration: ${textDecoration}; text-decoration-thickness: ${toFixed((thickness * this.getObjectScaling().y) / 10, config.NUM_FRACTION_DIGITS)}%; `\n : '',\n fill ? colorPropToSVG(FILL, fill) : '',\n deltaY ? `baseline-shift: ${-deltaY}; ` : '',\n useWhiteSpace ? 'white-space: pre; ' : '',\n ].join('');\n }\n\n /**\n * Returns text-decoration property for svg-export\n * @param {Object} style the object from which to retrieve style properties\n * @return {String}\n */\n getSvgTextDecoration(\n this: TextSVGExportMixin & FabricText,\n style: TextStyleDeclaration,\n ) {\n return (['overline', 'underline', 'line-through'] as const)\n .filter(\n (decoration) =>\n style[\n decoration.replace('-', '') as\n | 'overline'\n | 'underline'\n | 'linethrough'\n ],\n )\n .join(' ');\n }\n}\n","import { cache } from '../../cache';\nimport { DEFAULT_SVG_FONT_SIZE, FILL, STROKE } from '../../constants';\nimport type { ObjectEvents } from '../../EventTypeDefs';\nimport type {\n CompleteTextStyleDeclaration,\n TextStyle,\n TextStyleDeclaration,\n} from './StyledText';\nimport { StyledText } from './StyledText';\nimport { SHARED_ATTRIBUTES } from '../../parser/attributes';\nimport { parseAttributes } from '../../parser/parseAttributes';\nimport type {\n Abortable,\n TCacheCanvasDimensions,\n TClassProperties,\n TFiller,\n TOptions,\n} from '../../typedefs';\nimport { classRegistry } from '../../ClassRegistry';\nimport { graphemeSplit } from '../../util/lang_string';\nimport { createCanvasElementFor } from '../../util/misc/dom';\nimport type { TextStyleArray } from '../../util/misc/textStyles';\nimport {\n hasStyleChanged,\n stylesFromArray,\n stylesToArray,\n} from '../../util/misc/textStyles';\nimport { getPathSegmentsInfo, getPointOnPath } from '../../util/path';\nimport { cacheProperties } from '../Object/FabricObject';\nimport type { Path } from '../Path';\nimport { TextSVGExportMixin } from './TextSVGExportMixin';\nimport { applyMixins } from '../../util/applyMixins';\nimport type { FabricObjectProps, SerializedObjectProps } from '../Object/types';\nimport type { StylePropertiesType } from './constants';\nimport {\n additionalProps,\n textDefaultValues,\n textLayoutProperties,\n JUSTIFY,\n JUSTIFY_CENTER,\n JUSTIFY_LEFT,\n JUSTIFY_RIGHT,\n TEXT_DECORATION_THICKNESS,\n} from './constants';\nimport { CENTER, LEFT, RIGHT, TOP, BOTTOM } from '../../constants';\nimport { isFiller } from '../../util/typeAssertions';\nimport type { Gradient } from '../../gradient/Gradient';\nimport type { Pattern } from '../../Pattern';\nimport type { CSSRules } from '../../parser/typedefs';\n\nlet measuringContext: CanvasRenderingContext2D | null;\n\n/**\n * Return a context for measurement of text string.\n * if created it gets stored for reuse\n */\nfunction getMeasuringContext() {\n if (!measuringContext) {\n const canvas = createCanvasElementFor({\n width: 0,\n height: 0,\n });\n measuringContext = canvas.getContext('2d');\n }\n return measuringContext;\n}\n\nexport type TPathSide = 'left' | 'right';\n\nexport type TPathAlign = 'baseline' | 'center' | 'ascender' | 'descender';\n\nexport type TextLinesInfo = {\n lines: string[];\n graphemeLines: string[][];\n graphemeText: string[];\n _unwrappedLines: string[][];\n};\n\n/**\n * Measure and return the info of a single grapheme.\n * needs the the info of previous graphemes already filled\n * Override to customize measuring\n */\nexport type GraphemeBBox = {\n width: number;\n height: number;\n kernedWidth: number;\n left: number;\n deltaY: number;\n renderLeft?: number;\n renderTop?: number;\n angle?: number;\n};\n\n// @TODO this is not complete\ninterface UniqueTextProps {\n charSpacing: number;\n lineHeight: number;\n fontSize: number;\n fontWeight: string | number;\n fontFamily: string;\n fontStyle: string;\n pathSide: TPathSide;\n pathAlign: TPathAlign;\n underline: boolean;\n overline: boolean;\n linethrough: boolean;\n textAlign: string;\n direction: CanvasDirection;\n path?: Path;\n textDecorationThickness: number;\n}\n\nexport interface SerializedTextProps\n extends SerializedObjectProps,\n UniqueTextProps {\n styles: TextStyleArray | TextStyle;\n}\n\nexport interface TextProps extends FabricObjectProps, UniqueTextProps {\n styles: TextStyle;\n}\n\n/**\n * Text class\n * @tutorial {@link http://fabricjs.com/fabric-intro-part-2#text}\n */\nexport class FabricText<\n Props extends TOptions = Partial,\n SProps extends SerializedTextProps = SerializedTextProps,\n EventSpec extends ObjectEvents = ObjectEvents,\n >\n extends StyledText\n implements UniqueTextProps\n{\n /**\n * Properties that requires a text layout recalculation when changed\n * @type string[]\n * @protected\n */\n static textLayoutProperties: string[] = textLayoutProperties;\n\n /**\n * @private\n */\n declare _reNewline: RegExp;\n\n /**\n * Use this regular expression to filter for whitespaces that is not a new line.\n * Mostly used when text is 'justify' aligned.\n * @private\n */\n declare _reSpacesAndTabs: RegExp;\n\n /**\n * Use this regular expression to filter for whitespace that is not a new line.\n * Mostly used when text is 'justify' aligned.\n * @private\n */\n declare _reSpaceAndTab: RegExp;\n\n /**\n * Use this regular expression to filter consecutive groups of non spaces.\n * Mostly used when text is 'justify' aligned.\n * @private\n */\n declare _reWords: RegExp;\n\n declare text: string;\n\n /**\n * Font size (in pixels)\n * @type Number\n */\n declare fontSize: number;\n\n /**\n * Font weight (e.g. bold, normal, 400, 600, 800)\n * @type {(Number|String)}\n */\n declare fontWeight: string | number;\n\n /**\n * Font family\n * @type String\n */\n declare fontFamily: string;\n\n /**\n * Text decoration underline.\n * @type Boolean\n */\n declare underline: boolean;\n\n /**\n * Text decoration overline.\n * @type Boolean\n */\n declare overline: boolean;\n\n /**\n * Text decoration linethrough.\n * @type Boolean\n */\n declare linethrough: boolean;\n\n /**\n * Text alignment. Possible values: \"left\", \"center\", \"right\", \"justify\",\n * \"justify-left\", \"justify-center\" or \"justify-right\".\n * @type String\n */\n declare textAlign: string;\n\n /**\n * Font style . Possible values: \"\", \"normal\", \"italic\" or \"oblique\".\n * @type String\n */\n declare fontStyle: string;\n\n /**\n * Line height\n * @type Number\n */\n declare lineHeight: number;\n\n /**\n * Superscript schema object (minimum overlap)\n */\n declare superscript: {\n /**\n * fontSize factor\n * @default 0.6\n */\n size: number;\n /**\n * baseline-shift factor (upwards)\n * @default -0.35\n */\n baseline: number;\n };\n\n /**\n * Subscript schema object (minimum overlap)\n */\n declare subscript: {\n /**\n * fontSize factor\n * @default 0.6\n */\n size: number;\n /**\n * baseline-shift factor (downwards)\n * @default 0.11\n */\n baseline: number;\n };\n\n /**\n * Background color of text lines\n * @type String\n */\n declare textBackgroundColor: string;\n\n declare styles: TextStyle;\n\n /**\n * Path that the text should follow.\n * since 4.6.0 the path will be drawn automatically.\n * if you want to make the path visible, give it a stroke and strokeWidth or fill value\n * if you want it to be hidden, assign visible = false to the path.\n * This feature is in BETA, and SVG import/export is not yet supported.\n * @type Path\n * @example\n * const textPath = new Text('Text on a path', {\n * top: 150,\n * left: 150,\n * textAlign: 'center',\n * charSpacing: -50,\n * path: new Path('M 0 0 C 50 -100 150 -100 200 0', {\n * strokeWidth: 1,\n * visible: false\n * }),\n * pathSide: 'left',\n * pathStartOffset: 0\n * });\n */\n declare path?: Path;\n\n /**\n * The text decoration tickness for underline, overline and strikethrough\n * The tickness is expressed in thousandths of fontSize ( em ).\n * The original value was 1/15 that translates to 66.6667 thousandths.\n * The choice of unit of measure is to align with charSpacing.\n * You can slim the tickness without issues, while large underline or overline may end up\n * outside the bounding box of the text. In order to fix that a bigger refactor of the code\n * is needed and is out of scope for now. If you need such large overline on the first line\n * of text or large underline on the last line of text, consider disabling caching as a\n * workaround\n * @default 66.667\n */\n declare textDecorationThickness: number;\n\n /**\n * Offset amount for text path starting position\n * Only used when text has a path\n */\n declare pathStartOffset: number;\n\n /**\n * Which side of the path the text should be drawn on.\n * Only used when text has a path\n * @type {TPathSide} 'left|right'\n */\n declare pathSide: TPathSide;\n\n /**\n * How text is aligned to the path. This property determines\n * the perpendicular position of each character relative to the path.\n * (one of \"baseline\", \"center\", \"ascender\", \"descender\")\n * This feature is in BETA, and its behavior may change\n * @type TPathAlign\n */\n declare pathAlign: TPathAlign;\n\n /**\n * @private\n */\n declare _fontSizeFraction: number;\n\n /**\n * @private\n */\n declare offsets: { underline: number; linethrough: number; overline: number };\n\n /**\n * Text Line proportion to font Size (in pixels)\n * @type Number\n */\n declare _fontSizeMult: number;\n\n /**\n * additional space between characters\n * expressed in thousands of em unit\n * @type Number\n */\n declare charSpacing: number;\n\n /**\n * Baseline shift, styles only, keep at 0 for the main text object\n * @type {Number}\n */\n declare deltaY: number;\n\n /**\n * WARNING: EXPERIMENTAL. NOT SUPPORTED YET\n * determine the direction of the text.\n * This has to be set manually together with textAlign and originX for proper\n * experience.\n * some interesting link for the future\n * https://www.w3.org/International/questions/qa-bidi-unicode-controls\n * @since 4.5.0\n * @type {CanvasDirection} 'ltr|rtl'\n */\n declare direction: CanvasDirection;\n\n /**\n * contains characters bounding boxes\n * This variable is considered to be protected.\n * But for how mixins are implemented right now, we can't leave it private\n * @protected\n */\n __charBounds: GraphemeBBox[][] = [];\n\n /**\n * use this size when measuring text. To avoid IE11 rounding errors\n * @type {Number}\n * @readonly\n * @private\n */\n declare CACHE_FONT_SIZE: number;\n\n /**\n * contains the min text width to avoid getting 0\n * @type {Number}\n */\n declare MIN_TEXT_WIDTH: number;\n\n /**\n * contains the the text of the object, divided in lines as they are displayed\n * on screen. Wrapping will divide the text independently of line breaks\n * @type {string[]}\n */\n declare textLines: string[];\n\n /**\n * same as textlines, but each line is an array of graphemes as split by splitByGrapheme\n * @type {string[]}\n */\n declare _textLines: string[][];\n\n declare _unwrappedTextLines: string[][];\n declare _text: string[];\n declare cursorWidth: number;\n declare __lineHeights: number[];\n declare __lineWidths: number[];\n declare initialized?: true;\n\n static cacheProperties = [...cacheProperties, ...additionalProps];\n\n static ownDefaults = textDefaultValues;\n\n static type = 'Text';\n\n static getDefaults(): Record {\n return { ...super.getDefaults(), ...FabricText.ownDefaults };\n }\n\n constructor(text: string, options?: Props) {\n super();\n Object.assign(this, FabricText.ownDefaults);\n this.setOptions(options);\n if (!this.styles) {\n this.styles = {};\n }\n this.text = text;\n this.initialized = true;\n if (this.path) {\n this.setPathInfo();\n }\n this.initDimensions();\n this.setCoords();\n }\n\n /**\n * If text has a path, it will add the extra information needed\n * for path and text calculations\n */\n setPathInfo() {\n const path = this.path;\n if (path) {\n path.segmentsInfo = getPathSegmentsInfo(path.path);\n }\n }\n\n /**\n * @private\n * Divides text into lines of text and lines of graphemes.\n */\n _splitText(): TextLinesInfo {\n const newLines = this._splitTextIntoLines(this.text);\n this.textLines = newLines.lines;\n this._textLines = newLines.graphemeLines;\n this._unwrappedTextLines = newLines._unwrappedLines;\n this._text = newLines.graphemeText;\n return newLines;\n }\n\n /**\n * Initialize or update text dimensions.\n * Updates this.width and this.height with the proper values.\n * Does not return dimensions.\n */\n initDimensions() {\n this._splitText();\n this._clearCache();\n this.dirty = true;\n if (this.path) {\n this.width = this.path.width;\n this.height = this.path.height;\n } else {\n this.width =\n this.calcTextWidth() || this.cursorWidth || this.MIN_TEXT_WIDTH;\n this.height = this.calcTextHeight();\n }\n if (this.textAlign.includes(JUSTIFY)) {\n // once text is measured we need to make space fatter to make justified text.\n this.enlargeSpaces();\n }\n }\n\n /**\n * Enlarge space boxes and shift the others\n */\n enlargeSpaces() {\n let diffSpace,\n currentLineWidth,\n numberOfSpaces,\n accumulatedSpace,\n line,\n charBound,\n spaces;\n for (let i = 0, len = this._textLines.length; i < len; i++) {\n if (\n this.textAlign !== JUSTIFY &&\n (i === len - 1 || this.isEndOfWrapping(i))\n ) {\n continue;\n }\n accumulatedSpace = 0;\n line = this._textLines[i];\n currentLineWidth = this.getLineWidth(i);\n if (\n currentLineWidth < this.width &&\n (spaces = this.textLines[i].match(this._reSpacesAndTabs))\n ) {\n numberOfSpaces = spaces.length;\n diffSpace = (this.width - currentLineWidth) / numberOfSpaces;\n for (let j = 0; j <= line.length; j++) {\n charBound = this.__charBounds[i][j];\n if (this._reSpaceAndTab.test(line[j])) {\n charBound.width += diffSpace;\n charBound.kernedWidth += diffSpace;\n charBound.left += accumulatedSpace;\n accumulatedSpace += diffSpace;\n } else {\n charBound.left += accumulatedSpace;\n }\n }\n }\n }\n }\n\n /**\n * Detect if the text line is ended with an hard break\n * text and itext do not have wrapping, return false\n * @return {Boolean}\n */\n isEndOfWrapping(lineIndex: number): boolean {\n return lineIndex === this._textLines.length - 1;\n }\n\n /**\n * Detect if a line has a linebreak and so we need to account for it when moving\n * and counting style.\n * It return always 1 for text and Itext. Textbox has its own implementation\n * @return Number\n */\n missingNewlineOffset(lineIndex: number, skipWrapping?: boolean): 0 | 1;\n missingNewlineOffset(_lineIndex: number): 1 {\n return 1;\n }\n\n /**\n * Returns 2d representation (lineIndex and charIndex) of cursor\n * @param {Number} selectionStart\n * @param {Boolean} [skipWrapping] consider the location for unwrapped lines. useful to manage styles.\n */\n get2DCursorLocation(selectionStart: number, skipWrapping?: boolean) {\n const lines = skipWrapping ? this._unwrappedTextLines : this._textLines;\n let i: number;\n for (i = 0; i < lines.length; i++) {\n if (selectionStart <= lines[i].length) {\n return {\n lineIndex: i,\n charIndex: selectionStart,\n };\n }\n selectionStart -=\n lines[i].length + this.missingNewlineOffset(i, skipWrapping);\n }\n return {\n lineIndex: i - 1,\n charIndex:\n lines[i - 1].length < selectionStart\n ? lines[i - 1].length\n : selectionStart,\n };\n }\n\n /**\n * Returns string representation of an instance\n * @return {String} String representation of text object\n */\n toString(): string {\n return `#`;\n }\n\n /**\n * Return the dimension and the zoom level needed to create a cache canvas\n * big enough to host the object to be cached.\n * @private\n * @param {Object} dim.x width of object to be cached\n * @param {Object} dim.y height of object to be cached\n * @return {Object}.width width of canvas\n * @return {Object}.height height of canvas\n * @return {Object}.zoomX zoomX zoom value to unscale the canvas before drawing cache\n * @return {Object}.zoomY zoomY zoom value to unscale the canvas before drawing cache\n */\n _getCacheCanvasDimensions(): TCacheCanvasDimensions {\n const dims = super._getCacheCanvasDimensions();\n const fontSize = this.fontSize;\n dims.width += fontSize * dims.zoomX;\n dims.height += fontSize * dims.zoomY;\n return dims;\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _render(ctx: CanvasRenderingContext2D) {\n const path = this.path;\n path && !path.isNotVisible() && path._render(ctx);\n this._setTextStyles(ctx);\n this._renderTextLinesBackground(ctx);\n this._renderTextDecoration(ctx, 'underline');\n this._renderText(ctx);\n this._renderTextDecoration(ctx, 'overline');\n this._renderTextDecoration(ctx, 'linethrough');\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _renderText(ctx: CanvasRenderingContext2D) {\n if (this.paintFirst === STROKE) {\n this._renderTextStroke(ctx);\n this._renderTextFill(ctx);\n } else {\n this._renderTextFill(ctx);\n this._renderTextStroke(ctx);\n }\n }\n\n /**\n * Set the font parameter of the context with the object properties or with charStyle\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n * @param {Object} [charStyle] object with font style properties\n * @param {String} [charStyle.fontFamily] Font Family\n * @param {Number} [charStyle.fontSize] Font size in pixels. ( without px suffix )\n * @param {String} [charStyle.fontWeight] Font weight\n * @param {String} [charStyle.fontStyle] Font style (italic|normal)\n */\n _setTextStyles(\n ctx: CanvasRenderingContext2D,\n charStyle?: any,\n forMeasuring?: boolean,\n ) {\n ctx.textBaseline = 'alphabetic';\n if (this.path) {\n switch (this.pathAlign) {\n case CENTER:\n ctx.textBaseline = 'middle';\n break;\n case 'ascender':\n ctx.textBaseline = TOP;\n break;\n case 'descender':\n ctx.textBaseline = BOTTOM;\n break;\n }\n }\n ctx.font = this._getFontDeclaration(charStyle, forMeasuring);\n }\n\n /**\n * calculate and return the text Width measuring each line.\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n * @return {Number} Maximum width of Text object\n */\n calcTextWidth(): number {\n let maxWidth = this.getLineWidth(0);\n\n for (let i = 1, len = this._textLines.length; i < len; i++) {\n const currentLineWidth = this.getLineWidth(i);\n if (currentLineWidth > maxWidth) {\n maxWidth = currentLineWidth;\n }\n }\n return maxWidth;\n }\n\n /**\n * @private\n * @param {String} method Method name (\"fillText\" or \"strokeText\")\n * @param {CanvasRenderingContext2D} ctx Context to render on\n * @param {String} line Text to render\n * @param {Number} left Left position of text\n * @param {Number} top Top position of text\n * @param {Number} lineIndex Index of a line in a text\n */\n _renderTextLine(\n method: 'fillText' | 'strokeText',\n ctx: CanvasRenderingContext2D,\n line: string[],\n left: number,\n top: number,\n lineIndex: number,\n ) {\n this._renderChars(method, ctx, line, left, top, lineIndex);\n }\n\n /**\n * Renders the text background for lines, taking care of style\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _renderTextLinesBackground(ctx: CanvasRenderingContext2D) {\n if (!this.textBackgroundColor && !this.styleHas('textBackgroundColor')) {\n return;\n }\n const originalFill = ctx.fillStyle,\n leftOffset = this._getLeftOffset();\n let lineTopOffset = this._getTopOffset();\n\n for (let i = 0, len = this._textLines.length; i < len; i++) {\n const heightOfLine = this.getHeightOfLine(i);\n if (\n !this.textBackgroundColor &&\n !this.styleHas('textBackgroundColor', i)\n ) {\n lineTopOffset += heightOfLine;\n continue;\n }\n const jlen = this._textLines[i].length;\n const lineLeftOffset = this._getLineLeftOffset(i);\n let boxWidth = 0;\n let boxStart = 0;\n let drawStart;\n let currentColor;\n let lastColor = this.getValueOfPropertyAt(i, 0, 'textBackgroundColor');\n for (let j = 0; j < jlen; j++) {\n // at this point charbox are either standard or full with pathInfo if there is a path.\n const charBox = this.__charBounds[i][j] as Required;\n currentColor = this.getValueOfPropertyAt(i, j, 'textBackgroundColor');\n if (this.path) {\n ctx.save();\n ctx.translate(charBox.renderLeft, charBox.renderTop);\n ctx.rotate(charBox.angle);\n ctx.fillStyle = currentColor;\n currentColor &&\n ctx.fillRect(\n -charBox.width / 2,\n (-heightOfLine / this.lineHeight) * (1 - this._fontSizeFraction),\n charBox.width,\n heightOfLine / this.lineHeight,\n );\n ctx.restore();\n } else if (currentColor !== lastColor) {\n drawStart = leftOffset + lineLeftOffset + boxStart;\n if (this.direction === 'rtl') {\n drawStart = this.width - drawStart - boxWidth;\n }\n ctx.fillStyle = lastColor;\n lastColor &&\n ctx.fillRect(\n drawStart,\n lineTopOffset,\n boxWidth,\n heightOfLine / this.lineHeight,\n );\n boxStart = charBox.left;\n boxWidth = charBox.width;\n lastColor = currentColor;\n } else {\n boxWidth += charBox.kernedWidth;\n }\n }\n if (currentColor && !this.path) {\n drawStart = leftOffset + lineLeftOffset + boxStart;\n if (this.direction === 'rtl') {\n drawStart = this.width - drawStart - boxWidth;\n }\n ctx.fillStyle = currentColor;\n ctx.fillRect(\n drawStart,\n lineTopOffset,\n boxWidth,\n heightOfLine / this.lineHeight,\n );\n }\n lineTopOffset += heightOfLine;\n }\n ctx.fillStyle = originalFill;\n // if there is text background color no\n // other shadows should be casted\n this._removeShadow(ctx);\n }\n\n /**\n * measure and return the width of a single character.\n * possibly overridden to accommodate different measure logic or\n * to hook some external lib for character measurement\n * @private\n * @param {String} _char, char to be measured\n * @param {Object} charStyle style of char to be measured\n * @param {String} [previousChar] previous char\n * @param {Object} [prevCharStyle] style of previous char\n */\n _measureChar(\n _char: string,\n charStyle: CompleteTextStyleDeclaration,\n previousChar: string | undefined,\n prevCharStyle: CompleteTextStyleDeclaration | Record,\n ) {\n const fontCache = cache.getFontCache(charStyle),\n fontDeclaration = this._getFontDeclaration(charStyle),\n couple = previousChar + _char,\n stylesAreEqual =\n previousChar &&\n fontDeclaration === this._getFontDeclaration(prevCharStyle),\n fontMultiplier = charStyle.fontSize / this.CACHE_FONT_SIZE;\n let width: number | undefined,\n coupleWidth: number | undefined,\n previousWidth: number | undefined,\n kernedWidth: number | undefined;\n\n if (previousChar && fontCache[previousChar] !== undefined) {\n previousWidth = fontCache[previousChar];\n }\n if (fontCache[_char] !== undefined) {\n kernedWidth = width = fontCache[_char];\n }\n if (stylesAreEqual && fontCache[couple] !== undefined) {\n coupleWidth = fontCache[couple];\n kernedWidth = coupleWidth - previousWidth!;\n }\n if (\n width === undefined ||\n previousWidth === undefined ||\n coupleWidth === undefined\n ) {\n const ctx = getMeasuringContext()!;\n // send a TRUE to specify measuring font size CACHE_FONT_SIZE\n this._setTextStyles(ctx, charStyle, true);\n if (width === undefined) {\n kernedWidth = width = ctx.measureText(_char).width;\n fontCache[_char] = width;\n }\n if (previousWidth === undefined && stylesAreEqual && previousChar) {\n previousWidth = ctx.measureText(previousChar).width;\n fontCache[previousChar] = previousWidth;\n }\n if (stylesAreEqual && coupleWidth === undefined) {\n // we can measure the kerning couple and subtract the width of the previous character\n coupleWidth = ctx.measureText(couple).width;\n fontCache[couple] = coupleWidth;\n // safe to use the non-null since if undefined we defined it before.\n kernedWidth = coupleWidth - previousWidth!;\n }\n }\n return {\n width: width * fontMultiplier,\n kernedWidth: kernedWidth! * fontMultiplier,\n };\n }\n\n /**\n * Computes height of character at given position\n * @param {Number} line the line index number\n * @param {Number} _char the character index number\n * @return {Number} fontSize of the character\n */\n getHeightOfChar(line: number, _char: number): number {\n return this.getValueOfPropertyAt(line, _char, 'fontSize');\n }\n\n /**\n * measure a text line measuring all characters.\n * @param {Number} lineIndex line number\n */\n measureLine(lineIndex: number) {\n const lineInfo = this._measureLine(lineIndex);\n if (this.charSpacing !== 0) {\n lineInfo.width -= this._getWidthOfCharSpacing();\n }\n if (lineInfo.width < 0) {\n lineInfo.width = 0;\n }\n return lineInfo;\n }\n\n /**\n * measure every grapheme of a line, populating __charBounds\n * @param {Number} lineIndex\n * @return {Object} object.width total width of characters\n * @return {Object} object.numOfSpaces length of chars that match this._reSpacesAndTabs\n */\n _measureLine(lineIndex: number) {\n let width = 0,\n prevGrapheme: string | undefined,\n graphemeInfo: GraphemeBBox | undefined;\n\n const reverse = this.pathSide === RIGHT,\n path = this.path,\n line = this._textLines[lineIndex],\n llength = line.length,\n lineBounds = new Array(llength);\n\n this.__charBounds[lineIndex] = lineBounds;\n for (let i = 0; i < llength; i++) {\n const grapheme = line[i];\n graphemeInfo = this._getGraphemeBox(grapheme, lineIndex, i, prevGrapheme);\n lineBounds[i] = graphemeInfo;\n width += graphemeInfo.kernedWidth;\n prevGrapheme = grapheme;\n }\n // this latest bound box represent the last character of the line\n // to simplify cursor handling in interactive mode.\n lineBounds[llength] = {\n left: graphemeInfo ? graphemeInfo.left + graphemeInfo.width : 0,\n width: 0,\n kernedWidth: 0,\n height: this.fontSize,\n deltaY: 0,\n } as GraphemeBBox;\n if (path && path.segmentsInfo) {\n let positionInPath = 0;\n const totalPathLength =\n path.segmentsInfo[path.segmentsInfo.length - 1].length;\n switch (this.textAlign) {\n case LEFT:\n positionInPath = reverse ? totalPathLength - width : 0;\n break;\n case CENTER:\n positionInPath = (totalPathLength - width) / 2;\n break;\n case RIGHT:\n positionInPath = reverse ? 0 : totalPathLength - width;\n break;\n //todo - add support for justify\n }\n positionInPath += this.pathStartOffset * (reverse ? -1 : 1);\n for (\n let i = reverse ? llength - 1 : 0;\n reverse ? i >= 0 : i < llength;\n reverse ? i-- : i++\n ) {\n graphemeInfo = lineBounds[i];\n if (positionInPath > totalPathLength) {\n positionInPath %= totalPathLength;\n } else if (positionInPath < 0) {\n positionInPath += totalPathLength;\n }\n // it would probably much faster to send all the grapheme position for a line\n // and calculate path position/angle at once.\n this._setGraphemeOnPath(positionInPath, graphemeInfo);\n positionInPath += graphemeInfo.kernedWidth;\n }\n }\n return { width: width, numOfSpaces: 0 };\n }\n\n /**\n * Calculate the angle and the left,top position of the char that follow a path.\n * It appends it to graphemeInfo to be reused later at rendering\n * @private\n * @param {Number} positionInPath to be measured\n * @param {GraphemeBBox} graphemeInfo current grapheme box information\n * @param {Object} startingPoint position of the point\n */\n _setGraphemeOnPath(positionInPath: number, graphemeInfo: GraphemeBBox) {\n const centerPosition = positionInPath + graphemeInfo.kernedWidth / 2,\n path = this.path!;\n\n // we are at currentPositionOnPath. we want to know what point on the path is.\n const info = getPointOnPath(path.path, centerPosition, path.segmentsInfo)!;\n graphemeInfo.renderLeft = info.x - path.pathOffset.x;\n graphemeInfo.renderTop = info.y - path.pathOffset.y;\n graphemeInfo.angle = info.angle + (this.pathSide === RIGHT ? Math.PI : 0);\n }\n\n /**\n *\n * @param {String} grapheme to be measured\n * @param {Number} lineIndex index of the line where the char is\n * @param {Number} charIndex position in the line\n * @param {String} [prevGrapheme] character preceding the one to be measured\n * @returns {GraphemeBBox} grapheme bbox\n */\n _getGraphemeBox(\n grapheme: string,\n lineIndex: number,\n charIndex: number,\n prevGrapheme?: string,\n skipLeft?: boolean,\n ): GraphemeBBox {\n const style = this.getCompleteStyleDeclaration(lineIndex, charIndex),\n prevStyle = prevGrapheme\n ? this.getCompleteStyleDeclaration(lineIndex, charIndex - 1)\n : {},\n info = this._measureChar(grapheme, style, prevGrapheme, prevStyle);\n let kernedWidth = info.kernedWidth,\n width = info.width,\n charSpacing;\n\n if (this.charSpacing !== 0) {\n charSpacing = this._getWidthOfCharSpacing();\n width += charSpacing;\n kernedWidth += charSpacing;\n }\n\n const box: GraphemeBBox = {\n width,\n left: 0,\n height: style.fontSize,\n kernedWidth,\n deltaY: style.deltaY,\n };\n if (charIndex > 0 && !skipLeft) {\n const previousBox = this.__charBounds[lineIndex][charIndex - 1];\n box.left =\n previousBox.left + previousBox.width + info.kernedWidth - info.width;\n }\n return box;\n }\n\n /**\n * Calculate height of line at 'lineIndex'\n * @param {Number} lineIndex index of line to calculate\n * @return {Number}\n */\n getHeightOfLine(lineIndex: number): number {\n if (this.__lineHeights[lineIndex]) {\n return this.__lineHeights[lineIndex];\n }\n\n // char 0 is measured before the line cycle because it needs to char\n // emptylines\n let maxHeight = this.getHeightOfChar(lineIndex, 0);\n for (let i = 1, len = this._textLines[lineIndex].length; i < len; i++) {\n maxHeight = Math.max(this.getHeightOfChar(lineIndex, i), maxHeight);\n }\n\n return (this.__lineHeights[lineIndex] =\n maxHeight * this.lineHeight * this._fontSizeMult);\n }\n\n /**\n * Calculate text box height\n */\n calcTextHeight() {\n let lineHeight,\n height = 0;\n for (let i = 0, len = this._textLines.length; i < len; i++) {\n lineHeight = this.getHeightOfLine(i);\n height += i === len - 1 ? lineHeight / this.lineHeight : lineHeight;\n }\n return height;\n }\n\n /**\n * @private\n * @return {Number} Left offset\n */\n _getLeftOffset(): number {\n return this.direction === 'ltr' ? -this.width / 2 : this.width / 2;\n }\n\n /**\n * @private\n * @return {Number} Top offset\n */\n _getTopOffset(): number {\n return -this.height / 2;\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n * @param {String} method Method name (\"fillText\" or \"strokeText\")\n */\n _renderTextCommon(\n ctx: CanvasRenderingContext2D,\n method: 'fillText' | 'strokeText',\n ) {\n ctx.save();\n let lineHeights = 0;\n const left = this._getLeftOffset(),\n top = this._getTopOffset();\n for (let i = 0, len = this._textLines.length; i < len; i++) {\n const heightOfLine = this.getHeightOfLine(i),\n maxHeight = heightOfLine / this.lineHeight,\n leftOffset = this._getLineLeftOffset(i);\n this._renderTextLine(\n method,\n ctx,\n this._textLines[i],\n left + leftOffset,\n top + lineHeights + maxHeight,\n i,\n );\n lineHeights += heightOfLine;\n }\n ctx.restore();\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _renderTextFill(ctx: CanvasRenderingContext2D) {\n if (!this.fill && !this.styleHas(FILL)) {\n return;\n }\n\n this._renderTextCommon(ctx, 'fillText');\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _renderTextStroke(ctx: CanvasRenderingContext2D) {\n if ((!this.stroke || this.strokeWidth === 0) && this.isEmptyStyles()) {\n return;\n }\n\n if (this.shadow && !this.shadow.affectStroke) {\n this._removeShadow(ctx);\n }\n\n ctx.save();\n this._setLineDash(ctx, this.strokeDashArray);\n ctx.beginPath();\n this._renderTextCommon(ctx, 'strokeText');\n ctx.closePath();\n ctx.restore();\n }\n\n /**\n * @private\n * @param {String} method fillText or strokeText.\n * @param {CanvasRenderingContext2D} ctx Context to render on\n * @param {Array} line Content of the line, splitted in an array by grapheme\n * @param {Number} left\n * @param {Number} top\n * @param {Number} lineIndex\n */\n _renderChars(\n method: 'fillText' | 'strokeText',\n ctx: CanvasRenderingContext2D,\n line: Array,\n left: number,\n top: number,\n lineIndex: number,\n ) {\n const lineHeight = this.getHeightOfLine(lineIndex),\n isJustify = this.textAlign.includes(JUSTIFY),\n path = this.path,\n shortCut =\n !isJustify &&\n this.charSpacing === 0 &&\n this.isEmptyStyles(lineIndex) &&\n !path,\n isLtr = this.direction === 'ltr',\n sign = this.direction === 'ltr' ? 1 : -1,\n // this was changed in the PR #7674\n // currentDirection = ctx.canvas.getAttribute('dir');\n currentDirection = ctx.direction;\n\n let actualStyle,\n nextStyle,\n charsToRender = '',\n charBox,\n boxWidth = 0,\n timeToRender,\n drawingLeft;\n\n ctx.save();\n if (currentDirection !== this.direction) {\n ctx.canvas.setAttribute('dir', isLtr ? 'ltr' : 'rtl');\n ctx.direction = isLtr ? 'ltr' : 'rtl';\n ctx.textAlign = isLtr ? LEFT : RIGHT;\n }\n top -= (lineHeight * this._fontSizeFraction) / this.lineHeight;\n if (shortCut) {\n // render all the line in one pass without checking\n // drawingLeft = isLtr ? left : left - this.getLineWidth(lineIndex);\n this._renderChar(method, ctx, lineIndex, 0, line.join(''), left, top);\n ctx.restore();\n return;\n }\n for (let i = 0, len = line.length - 1; i <= len; i++) {\n timeToRender = i === len || this.charSpacing || path;\n charsToRender += line[i];\n charBox = this.__charBounds[lineIndex][i] as Required;\n if (boxWidth === 0) {\n left += sign * (charBox.kernedWidth - charBox.width);\n boxWidth += charBox.width;\n } else {\n boxWidth += charBox.kernedWidth;\n }\n if (isJustify && !timeToRender) {\n if (this._reSpaceAndTab.test(line[i])) {\n timeToRender = true;\n }\n }\n if (!timeToRender) {\n // if we have charSpacing, we render char by char\n actualStyle =\n actualStyle || this.getCompleteStyleDeclaration(lineIndex, i);\n nextStyle = this.getCompleteStyleDeclaration(lineIndex, i + 1);\n timeToRender = hasStyleChanged(actualStyle, nextStyle, false);\n }\n if (timeToRender) {\n if (path) {\n ctx.save();\n ctx.translate(charBox.renderLeft, charBox.renderTop);\n ctx.rotate(charBox.angle);\n this._renderChar(\n method,\n ctx,\n lineIndex,\n i,\n charsToRender,\n -boxWidth / 2,\n 0,\n );\n ctx.restore();\n } else {\n drawingLeft = left;\n this._renderChar(\n method,\n ctx,\n lineIndex,\n i,\n charsToRender,\n drawingLeft,\n top,\n );\n }\n charsToRender = '';\n actualStyle = nextStyle;\n left += sign * boxWidth;\n boxWidth = 0;\n }\n }\n ctx.restore();\n }\n\n /**\n * This function try to patch the missing gradientTransform on canvas gradients.\n * transforming a context to transform the gradient, is going to transform the stroke too.\n * we want to transform the gradient but not the stroke operation, so we create\n * a transformed gradient on a pattern and then we use the pattern instead of the gradient.\n * this method has drawbacks: is slow, is in low resolution, needs a patch for when the size\n * is limited.\n * @private\n * @param {TFiller} filler a fabric gradient instance\n * @return {CanvasPattern} a pattern to use as fill/stroke style\n */\n _applyPatternGradientTransformText(filler: TFiller) {\n // TODO: verify compatibility with strokeUniform\n const width = this.width + this.strokeWidth,\n height = this.height + this.strokeWidth,\n pCanvas = createCanvasElementFor({\n width,\n height,\n }),\n pCtx = pCanvas.getContext('2d')!;\n pCanvas.width = width;\n pCanvas.height = height;\n pCtx.beginPath();\n pCtx.moveTo(0, 0);\n pCtx.lineTo(width, 0);\n pCtx.lineTo(width, height);\n pCtx.lineTo(0, height);\n pCtx.closePath();\n pCtx.translate(width / 2, height / 2);\n pCtx.fillStyle = filler.toLive(pCtx)!;\n this._applyPatternGradientTransform(pCtx, filler);\n pCtx.fill();\n return pCtx.createPattern(pCanvas, 'no-repeat')!;\n }\n\n handleFiller(\n ctx: CanvasRenderingContext2D,\n property: `${T}Style`,\n filler: TFiller | string,\n ): { offsetX: number; offsetY: number } {\n let offsetX: number, offsetY: number;\n if (isFiller(filler)) {\n if (\n (filler as Gradient<'linear'>).gradientUnits === 'percentage' ||\n (filler as Gradient<'linear'>).gradientTransform ||\n (filler as Pattern).patternTransform\n ) {\n // need to transform gradient in a pattern.\n // this is a slow process. If you are hitting this codepath, and the object\n // is not using caching, you should consider switching it on.\n // we need a canvas as big as the current object caching canvas.\n offsetX = -this.width / 2;\n offsetY = -this.height / 2;\n ctx.translate(offsetX, offsetY);\n ctx[property] = this._applyPatternGradientTransformText(filler);\n return { offsetX, offsetY };\n } else {\n // is a simple gradient or pattern\n ctx[property] = filler.toLive(ctx)!;\n return this._applyPatternGradientTransform(ctx, filler);\n }\n } else {\n // is a color\n ctx[property] = filler;\n }\n return { offsetX: 0, offsetY: 0 };\n }\n\n /**\n * This function prepare the canvas for a stroke style, and stroke and strokeWidth\n * need to be sent in as defined\n * @param {CanvasRenderingContext2D} ctx\n * @param {CompleteTextStyleDeclaration} style with stroke and strokeWidth defined\n * @returns\n */\n _setStrokeStyles(\n ctx: CanvasRenderingContext2D,\n {\n stroke,\n strokeWidth,\n }: Pick,\n ) {\n ctx.lineWidth = strokeWidth;\n ctx.lineCap = this.strokeLineCap;\n ctx.lineDashOffset = this.strokeDashOffset;\n ctx.lineJoin = this.strokeLineJoin;\n ctx.miterLimit = this.strokeMiterLimit;\n return this.handleFiller(ctx, 'strokeStyle', stroke!);\n }\n\n /**\n * This function prepare the canvas for a ill style, and fill\n * need to be sent in as defined\n * @param {CanvasRenderingContext2D} ctx\n * @param {CompleteTextStyleDeclaration} style with ill defined\n * @returns\n */\n _setFillStyles(ctx: CanvasRenderingContext2D, { fill }: Pick) {\n return this.handleFiller(ctx, 'fillStyle', fill!);\n }\n\n /**\n * @private\n * @param {String} method\n * @param {CanvasRenderingContext2D} ctx Context to render on\n * @param {Number} lineIndex\n * @param {Number} charIndex\n * @param {String} _char\n * @param {Number} left Left coordinate\n * @param {Number} top Top coordinate\n * @param {Number} lineHeight Height of the line\n */\n _renderChar(\n method: 'fillText' | 'strokeText',\n ctx: CanvasRenderingContext2D,\n lineIndex: number,\n charIndex: number,\n _char: string,\n left: number,\n top: number,\n ) {\n const decl = this._getStyleDeclaration(lineIndex, charIndex),\n fullDecl = this.getCompleteStyleDeclaration(lineIndex, charIndex),\n shouldFill = method === 'fillText' && fullDecl.fill,\n shouldStroke =\n method === 'strokeText' && fullDecl.stroke && fullDecl.strokeWidth;\n\n if (!shouldStroke && !shouldFill) {\n return;\n }\n ctx.save();\n\n ctx.font = this._getFontDeclaration(fullDecl);\n\n if (decl.textBackgroundColor) {\n this._removeShadow(ctx);\n }\n if (decl.deltaY) {\n top += decl.deltaY;\n }\n\n if (shouldFill) {\n const fillOffsets = this._setFillStyles(ctx, fullDecl);\n ctx.fillText(\n _char,\n left - fillOffsets.offsetX,\n top - fillOffsets.offsetY,\n );\n }\n\n if (shouldStroke) {\n const strokeOffsets = this._setStrokeStyles(ctx, fullDecl);\n ctx.strokeText(\n _char,\n left - strokeOffsets.offsetX,\n top - strokeOffsets.offsetY,\n );\n }\n\n ctx.restore();\n }\n\n /**\n * Turns the character into a 'superior figure' (i.e. 'superscript')\n * @param {Number} start selection start\n * @param {Number} end selection end\n */\n setSuperscript(start: number, end: number) {\n this._setScript(start, end, this.superscript);\n }\n\n /**\n * Turns the character into an 'inferior figure' (i.e. 'subscript')\n * @param {Number} start selection start\n * @param {Number} end selection end\n */\n setSubscript(start: number, end: number) {\n this._setScript(start, end, this.subscript);\n }\n\n /**\n * Applies 'schema' at given position\n * @private\n * @param {Number} start selection start\n * @param {Number} end selection end\n * @param {Number} schema\n */\n protected _setScript(\n start: number,\n end: number,\n schema: {\n size: number;\n baseline: number;\n },\n ) {\n const loc = this.get2DCursorLocation(start, true),\n fontSize = this.getValueOfPropertyAt(\n loc.lineIndex,\n loc.charIndex,\n 'fontSize',\n ),\n dy = this.getValueOfPropertyAt(loc.lineIndex, loc.charIndex, 'deltaY'),\n style = {\n fontSize: fontSize * schema.size,\n deltaY: dy + fontSize * schema.baseline,\n };\n this.setSelectionStyles(style, start, end);\n }\n\n /**\n * @private\n * @param {Number} lineIndex index text line\n * @return {Number} Line left offset\n */\n _getLineLeftOffset(lineIndex: number): number {\n const lineWidth = this.getLineWidth(lineIndex),\n lineDiff = this.width - lineWidth,\n textAlign = this.textAlign,\n direction = this.direction,\n isEndOfWrapping = this.isEndOfWrapping(lineIndex);\n let leftOffset = 0;\n if (\n textAlign === JUSTIFY ||\n (textAlign === JUSTIFY_CENTER && !isEndOfWrapping) ||\n (textAlign === JUSTIFY_RIGHT && !isEndOfWrapping) ||\n (textAlign === JUSTIFY_LEFT && !isEndOfWrapping)\n ) {\n return 0;\n }\n if (textAlign === CENTER) {\n leftOffset = lineDiff / 2;\n }\n if (textAlign === RIGHT) {\n leftOffset = lineDiff;\n }\n if (textAlign === JUSTIFY_CENTER) {\n leftOffset = lineDiff / 2;\n }\n if (textAlign === JUSTIFY_RIGHT) {\n leftOffset = lineDiff;\n }\n if (direction === 'rtl') {\n if (\n textAlign === RIGHT ||\n textAlign === JUSTIFY ||\n textAlign === JUSTIFY_RIGHT\n ) {\n leftOffset = 0;\n } else if (textAlign === LEFT || textAlign === JUSTIFY_LEFT) {\n leftOffset = -lineDiff;\n } else if (textAlign === CENTER || textAlign === JUSTIFY_CENTER) {\n leftOffset = -lineDiff / 2;\n }\n }\n return leftOffset;\n }\n\n /**\n * @private\n */\n _clearCache() {\n this._forceClearCache = false;\n this.__lineWidths = [];\n this.__lineHeights = [];\n this.__charBounds = [];\n }\n\n /**\n * Measure a single line given its index. Used to calculate the initial\n * text bounding box. The values are calculated and stored in __lineWidths cache.\n * @private\n * @param {Number} lineIndex line number\n * @return {Number} Line width\n */\n getLineWidth(lineIndex: number): number {\n if (this.__lineWidths[lineIndex] !== undefined) {\n return this.__lineWidths[lineIndex];\n }\n\n const { width } = this.measureLine(lineIndex);\n this.__lineWidths[lineIndex] = width;\n return width;\n }\n\n _getWidthOfCharSpacing() {\n if (this.charSpacing !== 0) {\n return (this.fontSize * this.charSpacing) / 1000;\n }\n return 0;\n }\n\n /**\n * Retrieves the value of property at given character position\n * @param {Number} lineIndex the line number\n * @param {Number} charIndex the character number\n * @param {String} property the property name\n * @returns the value of 'property'\n */\n getValueOfPropertyAt(\n lineIndex: number,\n charIndex: number,\n property: T,\n ): this[T] {\n const charStyle = this._getStyleDeclaration(lineIndex, charIndex);\n return (charStyle[property] ?? this[property]) as this[T];\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _renderTextDecoration(\n ctx: CanvasRenderingContext2D,\n type: 'underline' | 'linethrough' | 'overline',\n ) {\n if (!this[type] && !this.styleHas(type)) {\n return;\n }\n let topOffset = this._getTopOffset();\n const leftOffset = this._getLeftOffset(),\n path = this.path,\n charSpacing = this._getWidthOfCharSpacing(),\n offsetAligner =\n type === 'linethrough' ? 0.5 : type === 'overline' ? 1 : 0,\n offsetY = this.offsets[type];\n for (let i = 0, len = this._textLines.length; i < len; i++) {\n const heightOfLine = this.getHeightOfLine(i);\n if (!this[type] && !this.styleHas(type, i)) {\n topOffset += heightOfLine;\n continue;\n }\n const line = this._textLines[i];\n const maxHeight = heightOfLine / this.lineHeight;\n const lineLeftOffset = this._getLineLeftOffset(i);\n let boxStart = 0;\n let boxWidth = 0;\n let lastDecoration = this.getValueOfPropertyAt(i, 0, type);\n let lastFill = this.getValueOfPropertyAt(i, 0, FILL);\n let lastTickness = this.getValueOfPropertyAt(\n i,\n 0,\n TEXT_DECORATION_THICKNESS,\n );\n let currentDecoration = lastDecoration;\n let currentFill = lastFill;\n let currentTickness = lastTickness;\n const top = topOffset + maxHeight * (1 - this._fontSizeFraction);\n let size = this.getHeightOfChar(i, 0);\n let dy = this.getValueOfPropertyAt(i, 0, 'deltaY');\n for (let j = 0, jlen = line.length; j < jlen; j++) {\n const charBox = this.__charBounds[i][j] as Required;\n currentDecoration = this.getValueOfPropertyAt(i, j, type);\n currentFill = this.getValueOfPropertyAt(i, j, FILL);\n currentTickness = this.getValueOfPropertyAt(\n i,\n j,\n TEXT_DECORATION_THICKNESS,\n );\n const currentSize = this.getHeightOfChar(i, j);\n const currentDy = this.getValueOfPropertyAt(i, j, 'deltaY');\n if (path && currentDecoration && currentFill) {\n const finalTickness = (this.fontSize * currentTickness) / 1000;\n ctx.save();\n // bug? verify lastFill is a valid fill here.\n ctx.fillStyle = lastFill as string;\n ctx.translate(charBox.renderLeft, charBox.renderTop);\n ctx.rotate(charBox.angle);\n ctx.fillRect(\n -charBox.kernedWidth / 2,\n offsetY * currentSize + currentDy - offsetAligner * finalTickness,\n charBox.kernedWidth,\n finalTickness,\n );\n ctx.restore();\n } else if (\n (currentDecoration !== lastDecoration ||\n currentFill !== lastFill ||\n currentSize !== size ||\n currentTickness !== lastTickness ||\n currentDy !== dy) &&\n boxWidth > 0\n ) {\n const finalTickness = (this.fontSize * lastTickness) / 1000;\n let drawStart = leftOffset + lineLeftOffset + boxStart;\n if (this.direction === 'rtl') {\n drawStart = this.width - drawStart - boxWidth;\n }\n if (lastDecoration && lastFill && lastTickness) {\n // bug? verify lastFill is a valid fill here.\n ctx.fillStyle = lastFill as string;\n ctx.fillRect(\n drawStart,\n top + offsetY * size + dy - offsetAligner * finalTickness,\n boxWidth,\n finalTickness,\n );\n }\n boxStart = charBox.left;\n boxWidth = charBox.width;\n lastDecoration = currentDecoration;\n lastTickness = currentTickness;\n lastFill = currentFill;\n size = currentSize;\n dy = currentDy;\n } else {\n boxWidth += charBox.kernedWidth;\n }\n }\n let drawStart = leftOffset + lineLeftOffset + boxStart;\n if (this.direction === 'rtl') {\n drawStart = this.width - drawStart - boxWidth;\n }\n ctx.fillStyle = currentFill as string;\n const finalTickness = (this.fontSize * currentTickness) / 1000;\n currentDecoration &&\n currentFill &&\n currentTickness &&\n ctx.fillRect(\n drawStart,\n top + offsetY * size + dy - offsetAligner * finalTickness,\n boxWidth - charSpacing,\n finalTickness,\n );\n topOffset += heightOfLine;\n }\n // if there is text background color no\n // other shadows should be casted\n this._removeShadow(ctx);\n }\n\n /**\n * return font declaration string for canvas context\n * @param {Object} [styleObject] object\n * @returns {String} font declaration formatted for canvas context.\n */\n _getFontDeclaration(\n {\n fontFamily = this.fontFamily,\n fontStyle = this.fontStyle,\n fontWeight = this.fontWeight,\n fontSize = this.fontSize,\n }: Partial<\n Pick<\n TextStyleDeclaration,\n 'fontFamily' | 'fontStyle' | 'fontWeight' | 'fontSize'\n >\n > = {},\n forMeasuring?: boolean,\n ): string {\n const parsedFontFamily =\n fontFamily.includes(\"'\") ||\n fontFamily.includes('\"') ||\n fontFamily.includes(',') ||\n FabricText.genericFonts.includes(fontFamily.toLowerCase())\n ? fontFamily\n : `\"${fontFamily}\"`;\n return [\n fontStyle,\n fontWeight,\n `${forMeasuring ? this.CACHE_FONT_SIZE : fontSize}px`,\n parsedFontFamily,\n ].join(' ');\n }\n\n /**\n * Renders text instance on a specified context\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n render(ctx: CanvasRenderingContext2D) {\n if (!this.visible) {\n return;\n }\n if (\n this.canvas &&\n this.canvas.skipOffscreen &&\n !this.group &&\n !this.isOnScreen()\n ) {\n return;\n }\n if (this._forceClearCache) {\n this.initDimensions();\n }\n super.render(ctx);\n }\n\n /**\n * Override this method to customize grapheme splitting\n * @todo the util `graphemeSplit` needs to be injectable in some way.\n * is more comfortable to inject the correct util rather than having to override text\n * in the middle of the prototype chain\n * @param {string} value\n * @returns {string[]} array of graphemes\n */\n graphemeSplit(value: string): string[] {\n return graphemeSplit(value);\n }\n\n /**\n * Returns the text as an array of lines.\n * @param {String} text text to split\n * @returns Lines in the text\n */\n _splitTextIntoLines(text: string): TextLinesInfo {\n const lines = text.split(this._reNewline),\n newLines = new Array(lines.length),\n newLine = ['\\n'];\n let newText: string[] = [];\n for (let i = 0; i < lines.length; i++) {\n newLines[i] = this.graphemeSplit(lines[i]);\n newText = newText.concat(newLines[i], newLine);\n }\n newText.pop();\n return {\n _unwrappedLines: newLines,\n lines: lines,\n graphemeText: newText,\n graphemeLines: newLines,\n };\n }\n\n /**\n * Returns object representation of an instance\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} Object representation of an instance\n */\n toObject<\n T extends Omit, keyof SProps>,\n K extends keyof T = never,\n >(propertiesToInclude: K[] = []): Pick & SProps {\n return {\n ...super.toObject([...additionalProps, ...propertiesToInclude] as K[]),\n styles: stylesToArray(this.styles, this.text),\n ...(this.path ? { path: this.path.toObject() } : {}),\n };\n }\n\n set(key: string | any, value?: any) {\n const { textLayoutProperties } = this.constructor as typeof FabricText;\n super.set(key, value);\n let needsDims = false;\n let isAddingPath = false;\n if (typeof key === 'object') {\n for (const _key in key) {\n if (_key === 'path') {\n this.setPathInfo();\n }\n needsDims = needsDims || textLayoutProperties.includes(_key);\n isAddingPath = isAddingPath || _key === 'path';\n }\n } else {\n needsDims = textLayoutProperties.includes(key);\n isAddingPath = key === 'path';\n }\n if (isAddingPath) {\n this.setPathInfo();\n }\n if (needsDims && this.initialized) {\n this.initDimensions();\n this.setCoords();\n }\n return this;\n }\n\n /**\n * Returns complexity of an instance\n * @return {Number} complexity\n */\n complexity(): number {\n return 1;\n }\n\n /**\n * List of generic font families\n * @see https://developer.mozilla.org/en-US/docs/Web/CSS/font-family#generic-name\n */\n static genericFonts = [\n 'serif',\n 'sans-serif',\n 'monospace',\n 'cursive',\n 'fantasy',\n 'system-ui',\n 'ui-serif',\n 'ui-sans-serif',\n 'ui-monospace',\n 'ui-rounded',\n 'math',\n 'emoji',\n 'fangsong',\n ];\n\n /* _FROM_SVG_START_ */\n\n /**\n * List of attribute names to account for when parsing SVG element (used by {@link FabricText.fromElement})\n * @see: http://www.w3.org/TR/SVG/text.html#TextElement\n */\n static ATTRIBUTE_NAMES = SHARED_ATTRIBUTES.concat(\n 'x',\n 'y',\n 'dx',\n 'dy',\n 'font-family',\n 'font-style',\n 'font-weight',\n 'font-size',\n 'letter-spacing',\n 'text-decoration',\n 'text-anchor',\n );\n\n /**\n * Returns FabricText instance from an SVG element (not yet implemented)\n * @param {HTMLElement} element Element to parse\n * @param {Object} [options] Options object\n */\n static async fromElement(\n element: HTMLElement | SVGElement,\n options?: Abortable,\n cssRules?: CSSRules,\n ) {\n const parsedAttributes = parseAttributes(\n element,\n FabricText.ATTRIBUTE_NAMES,\n cssRules,\n );\n\n const {\n textAnchor = LEFT as typeof LEFT | typeof CENTER | typeof RIGHT,\n textDecoration = '',\n dx = 0,\n dy = 0,\n top = 0,\n left = 0,\n fontSize = DEFAULT_SVG_FONT_SIZE,\n strokeWidth = 1,\n ...restOfOptions\n } = { ...options, ...parsedAttributes };\n\n const textContent = (element.textContent || '')\n .replace(/^\\s+|\\s+$|\\n+/g, '')\n .replace(/\\s+/g, ' ');\n\n // this code here is probably the usual issue for SVG center find\n // this can later looked at again and probably removed.\n\n const text = new this(textContent, {\n left: left + dx,\n top: top + dy,\n underline: textDecoration.includes('underline'),\n overline: textDecoration.includes('overline'),\n linethrough: textDecoration.includes('line-through'),\n // we initialize this as 0\n strokeWidth: 0,\n fontSize,\n ...restOfOptions,\n }),\n textHeightScaleFactor = text.getScaledHeight() / text.height,\n lineHeightDiff =\n (text.height + text.strokeWidth) * text.lineHeight - text.height,\n scaledDiff = lineHeightDiff * textHeightScaleFactor,\n textHeight = text.getScaledHeight() + scaledDiff;\n\n let offX = 0;\n /*\n Adjust positioning:\n x/y attributes in SVG correspond to the bottom-left corner of text bounding box\n fabric output by default at top, left.\n */\n if (textAnchor === CENTER) {\n offX = text.getScaledWidth() / 2;\n }\n if (textAnchor === RIGHT) {\n offX = text.getScaledWidth();\n }\n text.set({\n left: text.left - offX,\n top:\n text.top -\n (textHeight - text.fontSize * (0.07 + text._fontSizeFraction)) /\n text.lineHeight,\n strokeWidth,\n });\n return text;\n }\n\n /* _FROM_SVG_END_ */\n\n /**\n * Returns FabricText instance from an object representation\n * @param {Object} object plain js Object to create an instance from\n * @returns {Promise}\n */\n static fromObject<\n T extends TOptions,\n S extends FabricText,\n >(object: T) {\n return this._fromObject(\n {\n ...object,\n styles: stylesFromArray(object.styles || {}, object.text),\n },\n {\n extraParam: 'text',\n },\n );\n }\n}\n\napplyMixins(FabricText, [TextSVGExportMixin]);\nclassRegistry.setClass(FabricText);\nclassRegistry.setSVGClass(FabricText);\n","import type {\n DragEventData,\n DropEventData,\n TPointerEvent,\n} from '../../EventTypeDefs';\nimport { Point } from '../../Point';\nimport type { IText } from './IText';\nimport { setStyle } from '../../util/internals/dom_style';\nimport { cloneStyles } from '../../util/internals/cloneStyles';\nimport type { TextStyleDeclaration } from '../Text/StyledText';\nimport { getDocumentFromElement } from '../../util/dom_misc';\nimport { CHANGED, NONE } from '../../constants';\n\n/**\n * #### Dragging IText/Textbox Lifecycle\n * - {@link start} is called from `mousedown` {@link IText#_mouseDownHandler} and determines if dragging should start by testing {@link isPointerOverSelection}\n * - if true `mousedown` {@link IText#_mouseDownHandler} is blocked to keep selection\n * - if the pointer moves, canvas fires numerous mousemove {@link Canvas#_onMouseMove} that we make sure **aren't** prevented ({@link IText#shouldStartDragging}) in order for the window to start a drag session\n * - once/if the session starts canvas calls {@link onDragStart} on the active object to determine if dragging should occur\n * - canvas fires relevant drag events that are handled by the handlers defined in this scope\n * - {@link end} is called from `mouseup` {@link IText#mouseUpHandler}, blocking IText default click behavior\n * - in case the drag session didn't occur, {@link end} handles a click, since logic to do so was blocked during `mousedown`\n */\nexport class DraggableTextDelegate {\n readonly target: IText;\n private __mouseDownInPlace = false;\n private __dragStartFired = false;\n private __isDraggingOver = false;\n private __dragStartSelection?: {\n selectionStart: number;\n selectionEnd: number;\n };\n private __dragImageDisposer?: VoidFunction;\n private _dispose?: () => void;\n\n constructor(target: IText) {\n this.target = target;\n const disposers = [\n this.target.on('dragenter', this.dragEnterHandler.bind(this)),\n this.target.on('dragover', this.dragOverHandler.bind(this)),\n this.target.on('dragleave', this.dragLeaveHandler.bind(this)),\n this.target.on('dragend', this.dragEndHandler.bind(this)),\n this.target.on('drop', this.dropHandler.bind(this)),\n ];\n this._dispose = () => {\n disposers.forEach((d) => d());\n this._dispose = undefined;\n };\n }\n\n isPointerOverSelection(e: TPointerEvent) {\n const target = this.target;\n const newSelection = target.getSelectionStartFromPointer(e);\n return (\n target.isEditing &&\n newSelection >= target.selectionStart &&\n newSelection <= target.selectionEnd &&\n target.selectionStart < target.selectionEnd\n );\n }\n\n /**\n * @public override this method to disable dragging and default to mousedown logic\n */\n start(e: TPointerEvent) {\n return (this.__mouseDownInPlace = this.isPointerOverSelection(e));\n }\n\n /**\n * @public override this method to disable dragging without discarding selection\n */\n isActive() {\n return this.__mouseDownInPlace;\n }\n\n /**\n * Ends interaction and sets cursor in case of a click\n * @returns true if was active\n */\n end(e: TPointerEvent) {\n const active = this.isActive();\n if (active && !this.__dragStartFired) {\n // mousedown has been blocked since `active` is true => cursor has not been set.\n // `__dragStartFired` is false => dragging didn't occur, pointer didn't move and is over selection.\n // meaning this is actually a click, `active` is a false positive.\n this.target.setCursorByClick(e);\n this.target.initDelayedCursor(true);\n }\n this.__mouseDownInPlace = false;\n this.__dragStartFired = false;\n this.__isDraggingOver = false;\n return active;\n }\n\n getDragStartSelection() {\n return this.__dragStartSelection;\n }\n\n /**\n * Override to customize the drag image\n * https://developer.mozilla.org/en-US/docs/Web/API/DataTransfer/setDragImage\n */\n setDragImage(\n e: DragEvent,\n {\n selectionStart,\n selectionEnd,\n }: {\n selectionStart: number;\n selectionEnd: number;\n },\n ) {\n const target = this.target;\n const canvas = target.canvas!;\n const flipFactor = new Point(target.flipX ? -1 : 1, target.flipY ? -1 : 1);\n const boundaries = target._getCursorBoundaries(selectionStart);\n const selectionPosition = new Point(\n boundaries.left + boundaries.leftOffset,\n boundaries.top + boundaries.topOffset,\n ).multiply(flipFactor);\n const pos = selectionPosition.transform(target.calcTransformMatrix());\n const pointer = canvas.getScenePoint(e);\n const diff = pointer.subtract(pos);\n const retinaScaling = target.getCanvasRetinaScaling();\n const bbox = target.getBoundingRect();\n const correction = pos.subtract(new Point(bbox.left, bbox.top));\n const vpt = canvas.viewportTransform;\n const offset = correction.add(diff).transform(vpt, true);\n // prepare instance for drag image snapshot by making all non selected text invisible\n const bgc = target.backgroundColor;\n const styles = cloneStyles(target.styles);\n target.backgroundColor = '';\n const styleOverride = {\n stroke: 'transparent',\n fill: 'transparent',\n textBackgroundColor: 'transparent',\n };\n target.setSelectionStyles(styleOverride, 0, selectionStart);\n target.setSelectionStyles(styleOverride, selectionEnd, target.text.length);\n target.dirty = true;\n const dragImage = target.toCanvasElement({\n enableRetinaScaling: canvas.enableRetinaScaling,\n viewportTransform: true,\n });\n // restore values\n target.backgroundColor = bgc;\n target.styles = styles;\n target.dirty = true;\n // position drag image offscreen\n setStyle(dragImage, {\n position: 'fixed',\n left: `${-dragImage.width}px`,\n border: NONE,\n width: `${dragImage.width / retinaScaling}px`,\n height: `${dragImage.height / retinaScaling}px`,\n });\n this.__dragImageDisposer && this.__dragImageDisposer();\n this.__dragImageDisposer = () => {\n dragImage.remove();\n };\n getDocumentFromElement(\n (e.target || this.target.hiddenTextarea)! as HTMLElement,\n ).body.appendChild(dragImage);\n e.dataTransfer?.setDragImage(dragImage, offset.x, offset.y);\n }\n\n /**\n * @returns {boolean} determines whether {@link target} should/shouldn't become a drag source\n */\n onDragStart(e: DragEvent): boolean {\n this.__dragStartFired = true;\n const target = this.target;\n const active = this.isActive();\n if (active && e.dataTransfer) {\n const selection = (this.__dragStartSelection = {\n selectionStart: target.selectionStart,\n selectionEnd: target.selectionEnd,\n });\n const value = target._text\n .slice(selection.selectionStart, selection.selectionEnd)\n .join('');\n const data = { text: target.text, value, ...selection };\n e.dataTransfer.setData('text/plain', value);\n e.dataTransfer.setData(\n 'application/fabric',\n JSON.stringify({\n value: value,\n styles: target.getSelectionStyles(\n selection.selectionStart,\n selection.selectionEnd,\n true,\n ),\n }),\n );\n e.dataTransfer.effectAllowed = 'copyMove';\n this.setDragImage(e, data);\n }\n target.abortCursorAnimation();\n return active;\n }\n\n /**\n * use {@link targetCanDrop} to respect overriding\n * @returns {boolean} determines whether {@link target} should/shouldn't become a drop target\n */\n canDrop(e: DragEvent): boolean {\n if (\n this.target.editable &&\n !this.target.getActiveControl() &&\n !e.defaultPrevented\n ) {\n if (this.isActive() && this.__dragStartSelection) {\n // drag source trying to drop over itself\n // allow dropping only outside of drag start selection\n const index = this.target.getSelectionStartFromPointer(e);\n const dragStartSelection = this.__dragStartSelection;\n return (\n index < dragStartSelection.selectionStart ||\n index > dragStartSelection.selectionEnd\n );\n }\n return true;\n }\n return false;\n }\n\n /**\n * in order to respect overriding {@link IText#canDrop} we call that instead of calling {@link canDrop} directly\n */\n protected targetCanDrop(e: DragEvent) {\n return this.target.canDrop(e);\n }\n\n dragEnterHandler({ e }: DragEventData) {\n const canDrop = this.targetCanDrop(e);\n if (!this.__isDraggingOver && canDrop) {\n this.__isDraggingOver = true;\n }\n }\n\n dragOverHandler(ev: DragEventData) {\n const { e } = ev;\n const canDrop = this.targetCanDrop(e);\n if (!this.__isDraggingOver && canDrop) {\n this.__isDraggingOver = true;\n } else if (this.__isDraggingOver && !canDrop) {\n // drop state has changed\n this.__isDraggingOver = false;\n }\n if (this.__isDraggingOver) {\n // can be dropped, inform browser\n e.preventDefault();\n // inform event subscribers\n ev.canDrop = true;\n ev.dropTarget = this.target;\n }\n }\n\n dragLeaveHandler() {\n if (this.__isDraggingOver || this.isActive()) {\n this.__isDraggingOver = false;\n }\n }\n\n /**\n * Override the `text/plain | application/fabric` types of {@link DragEvent#dataTransfer}\n * in order to change the drop value or to customize styling respectively, by listening to the `drop:before` event\n * https://developer.mozilla.org/en-US/docs/Web/API/HTML_Drag_and_Drop_API/Drag_operations#performing_a_drop\n */\n dropHandler(ev: DropEventData) {\n const { e } = ev;\n const didDrop = e.defaultPrevented;\n this.__isDraggingOver = false;\n // inform browser that the drop has been accepted\n e.preventDefault();\n let insert = e.dataTransfer?.getData('text/plain');\n if (insert && !didDrop) {\n const target = this.target;\n const canvas = target.canvas!;\n let insertAt = target.getSelectionStartFromPointer(e);\n const { styles } = (\n e.dataTransfer!.types.includes('application/fabric')\n ? JSON.parse(e.dataTransfer!.getData('application/fabric'))\n : {}\n ) as { styles: TextStyleDeclaration[] };\n const trailing = insert[Math.max(0, insert.length - 1)];\n const selectionStartOffset = 0;\n // drag and drop in same instance\n if (this.__dragStartSelection) {\n const selectionStart = this.__dragStartSelection.selectionStart;\n const selectionEnd = this.__dragStartSelection.selectionEnd;\n if (insertAt > selectionStart && insertAt <= selectionEnd) {\n insertAt = selectionStart;\n } else if (insertAt > selectionEnd) {\n insertAt -= selectionEnd - selectionStart;\n }\n target.removeChars(selectionStart, selectionEnd);\n // prevent `dragend` from handling event\n delete this.__dragStartSelection;\n }\n // remove redundant line break\n if (\n target._reNewline.test(trailing) &&\n (target._reNewline.test(target._text[insertAt]) ||\n insertAt === target._text.length)\n ) {\n insert = insert.trimEnd();\n }\n // inform subscribers\n ev.didDrop = true;\n ev.dropTarget = target;\n // finalize\n target.insertChars(insert, styles, insertAt);\n // can this part be moved in an outside event? andrea to check.\n canvas.setActiveObject(target);\n target.enterEditing(e);\n target.selectionStart = Math.min(\n insertAt + selectionStartOffset,\n target._text.length,\n );\n target.selectionEnd = Math.min(\n target.selectionStart + insert.length,\n target._text.length,\n );\n target.hiddenTextarea!.value = target.text;\n target._updateTextarea();\n target.hiddenTextarea!.focus();\n target.fire(CHANGED, {\n index: insertAt + selectionStartOffset,\n action: 'drop',\n });\n canvas.fire('text:changed', { target });\n canvas.contextTopDirty = true;\n canvas.requestRenderAll();\n }\n }\n\n /**\n * fired only on the drag source after drop (if occurred)\n * handle changes to the drag source in case of a drop on another object or a cancellation\n * https://developer.mozilla.org/en-US/docs/Web/API/HTML_Drag_and_Drop_API/Drag_operations#finishing_a_drag\n */\n dragEndHandler({ e }: DragEventData) {\n if (this.isActive() && this.__dragStartFired) {\n // once the drop event finishes we check if we need to change the drag source\n // if the drag source received the drop we bail out since the drop handler has already handled logic\n if (this.__dragStartSelection) {\n const target = this.target;\n const canvas = this.target.canvas!;\n const { selectionStart, selectionEnd } = this.__dragStartSelection;\n const dropEffect = e.dataTransfer?.dropEffect || NONE;\n if (dropEffect === NONE) {\n // pointer is back over selection\n target.selectionStart = selectionStart;\n target.selectionEnd = selectionEnd;\n target._updateTextarea();\n target.hiddenTextarea!.focus();\n } else {\n target.clearContextTop();\n if (dropEffect === 'move') {\n target.removeChars(selectionStart, selectionEnd);\n target.selectionStart = target.selectionEnd = selectionStart;\n target.hiddenTextarea &&\n (target.hiddenTextarea.value = target.text);\n target._updateTextarea();\n target.fire(CHANGED, {\n index: selectionStart,\n action: 'dragend',\n });\n canvas.fire('text:changed', { target });\n canvas.requestRenderAll();\n }\n target.exitEditing();\n }\n }\n }\n\n this.__dragImageDisposer && this.__dragImageDisposer();\n delete this.__dragImageDisposer;\n delete this.__dragStartSelection;\n this.__isDraggingOver = false;\n }\n\n dispose() {\n this._dispose && this._dispose();\n }\n}\n","import type { ObjectEvents, TPointerEvent } from '../../EventTypeDefs';\nimport { Point } from '../../Point';\nimport type { FabricObject } from '../Object/FabricObject';\nimport { FabricText } from '../Text/Text';\nimport { animate } from '../../util/animation/animate';\nimport type { TOnAnimationChangeCallback } from '../../util/animation/types';\nimport type { ValueAnimation } from '../../util/animation/ValueAnimation';\nimport type { TextStyleDeclaration } from '../Text/StyledText';\nimport type { SerializedTextProps, TextProps } from '../Text/Text';\nimport type { TOptions } from '../../typedefs';\nimport { getDocumentFromElement } from '../../util/dom_misc';\nimport { LEFT, MODIFIED, RIGHT, reNewline } from '../../constants';\nimport type { IText } from './IText';\n\n/**\n * extend this regex to support non english languages\n *\n * - ` ` Matches a SPACE character (char code 32).\n * - `\\n` Matches a LINE FEED character (char code 10).\n * - `\\.` Matches a \".\" character (char code 46).\n * - `,` Matches a \",\" character (char code 44).\n * - `;` Matches a \";\" character (char code 59).\n * - `!` Matches a \"!\" character (char code 33).\n * - `\\?` Matches a \"?\" character (char code 63).\n * - `\\-` Matches a \"-\" character (char code 45).\n */\n// eslint-disable-next-line no-useless-escape\nconst reNonWord = /[ \\n\\.,;!\\?\\-]/;\n\nexport type ITextEvents = ObjectEvents & {\n 'selection:changed': never;\n changed: never | { index: number; action: string };\n 'editing:entered': never | { e: TPointerEvent };\n 'editing:exited': never;\n};\n\nexport abstract class ITextBehavior<\n Props extends TOptions = Partial,\n SProps extends SerializedTextProps = SerializedTextProps,\n EventSpec extends ITextEvents = ITextEvents,\n> extends FabricText {\n declare abstract isEditing: boolean;\n declare abstract cursorDelay: number;\n declare abstract selectionStart: number;\n declare abstract selectionEnd: number;\n declare abstract cursorDuration: number;\n declare abstract editable: boolean;\n declare abstract editingBorderColor: string;\n\n declare abstract compositionStart: number;\n declare abstract compositionEnd: number;\n\n declare abstract hiddenTextarea: HTMLTextAreaElement | null;\n\n /**\n * Helps determining when the text is in composition, so that the cursor\n * rendering is altered.\n */\n declare protected inCompositionMode: boolean;\n\n declare protected _reSpace: RegExp;\n declare private _currentTickState?: ValueAnimation;\n declare private _currentTickCompleteState?: ValueAnimation;\n protected _currentCursorOpacity = 1;\n declare private _textBeforeEdit: string;\n declare protected __selectionStartOnMouseDown: number;\n\n /**\n * Keeps track if the IText object was selected before the actual click.\n * This because we want to delay enter editing by a click.\n */\n declare protected selected: boolean;\n declare protected cursorOffsetCache: { left?: number; top?: number };\n declare protected _savedProps?: {\n hasControls: boolean;\n borderColor: string;\n lockMovementX: boolean;\n lockMovementY: boolean;\n selectable: boolean;\n hoverCursor: CSSStyleDeclaration['cursor'] | null;\n defaultCursor?: CSSStyleDeclaration['cursor'];\n moveCursor?: CSSStyleDeclaration['cursor'];\n };\n declare protected _selectionDirection: 'left' | 'right' | null;\n\n abstract initHiddenTextarea(): void;\n abstract _fireSelectionChanged(): void;\n abstract renderCursorOrSelection(): void;\n abstract getSelectionStartFromPointer(e: TPointerEvent): number;\n abstract _getCursorBoundaries(\n index: number,\n skipCaching?: boolean,\n ): {\n left: number;\n top: number;\n leftOffset: number;\n topOffset: number;\n };\n\n /**\n * Initializes all the interactive behavior of IText\n */\n initBehavior() {\n this._tick = this._tick.bind(this);\n this._onTickComplete = this._onTickComplete.bind(this);\n this.updateSelectionOnMouseMove =\n this.updateSelectionOnMouseMove.bind(this);\n }\n\n onDeselect(options?: { e?: TPointerEvent; object?: FabricObject }) {\n this.isEditing && this.exitEditing();\n this.selected = false;\n return super.onDeselect(options);\n }\n\n /**\n * @private\n */\n _animateCursor({\n toValue,\n duration,\n delay,\n onComplete,\n }: {\n toValue: number;\n duration: number;\n delay?: number;\n onComplete?: TOnAnimationChangeCallback;\n }) {\n return animate({\n startValue: this._currentCursorOpacity,\n endValue: toValue,\n duration,\n delay,\n onComplete,\n abort: () =>\n !this.canvas ||\n // we do not want to animate a selection, only cursor\n this.selectionStart !== this.selectionEnd,\n onChange: (value) => {\n this._currentCursorOpacity = value;\n this.renderCursorOrSelection();\n },\n });\n }\n\n /**\n * changes the cursor from visible to invisible\n */\n private _tick(delay?: number) {\n this._currentTickState = this._animateCursor({\n toValue: 0,\n duration: this.cursorDuration / 2,\n delay: Math.max(delay || 0, 100),\n onComplete: this._onTickComplete,\n });\n }\n\n /**\n * Changes the cursor from invisible to visible\n */\n private _onTickComplete() {\n this._currentTickCompleteState?.abort();\n this._currentTickCompleteState = this._animateCursor({\n toValue: 1,\n duration: this.cursorDuration,\n onComplete: this._tick,\n });\n }\n\n /**\n * Initializes delayed cursor\n */\n initDelayedCursor(restart?: boolean) {\n this.abortCursorAnimation();\n this._tick(restart ? 0 : this.cursorDelay);\n }\n\n /**\n * Aborts cursor animation, clears all timeouts and clear textarea context if necessary\n */\n abortCursorAnimation() {\n let shouldClear = false;\n [this._currentTickState, this._currentTickCompleteState].forEach(\n (cursorAnimation) => {\n if (cursorAnimation && !cursorAnimation.isDone()) {\n shouldClear = true;\n cursorAnimation.abort();\n }\n },\n );\n\n this._currentCursorOpacity = 1;\n\n // make sure we clear context even if instance is not editing\n if (shouldClear) {\n this.clearContextTop();\n }\n }\n\n /**\n * Restart tue cursor animation if either is in complete state ( between animations )\n * or if it never started before\n */\n restartCursorIfNeeded() {\n if (\n [this._currentTickState, this._currentTickCompleteState].some(\n (cursorAnimation) => !cursorAnimation || cursorAnimation.isDone(),\n )\n ) {\n this.initDelayedCursor();\n }\n }\n\n /**\n * Selects entire text\n */\n selectAll() {\n this.selectionStart = 0;\n this.selectionEnd = this._text.length;\n this._fireSelectionChanged();\n this._updateTextarea();\n return this;\n }\n\n /**\n * Selects entire text and updates the visual state\n */\n cmdAll() {\n this.selectAll();\n this.renderCursorOrSelection();\n }\n\n /**\n * Returns selected text\n * @return {String}\n */\n getSelectedText(): string {\n return this._text.slice(this.selectionStart, this.selectionEnd).join('');\n }\n\n /**\n * Find new selection index representing start of current word according to current selection index\n * @param {Number} startFrom Current selection index\n * @return {Number} New selection index\n */\n findWordBoundaryLeft(startFrom: number): number {\n let offset = 0,\n index = startFrom - 1;\n\n // remove space before cursor first\n if (this._reSpace.test(this._text[index])) {\n while (this._reSpace.test(this._text[index])) {\n offset++;\n index--;\n }\n }\n while (/\\S/.test(this._text[index]) && index > -1) {\n offset++;\n index--;\n }\n\n return startFrom - offset;\n }\n\n /**\n * Find new selection index representing end of current word according to current selection index\n * @param {Number} startFrom Current selection index\n * @return {Number} New selection index\n */\n findWordBoundaryRight(startFrom: number): number {\n let offset = 0,\n index = startFrom;\n\n // remove space after cursor first\n if (this._reSpace.test(this._text[index])) {\n while (this._reSpace.test(this._text[index])) {\n offset++;\n index++;\n }\n }\n while (/\\S/.test(this._text[index]) && index < this._text.length) {\n offset++;\n index++;\n }\n\n return startFrom + offset;\n }\n\n /**\n * Find new selection index representing start of current line according to current selection index\n * @param {Number} startFrom Current selection index\n * @return {Number} New selection index\n */\n findLineBoundaryLeft(startFrom: number): number {\n let offset = 0,\n index = startFrom - 1;\n\n while (!/\\n/.test(this._text[index]) && index > -1) {\n offset++;\n index--;\n }\n\n return startFrom - offset;\n }\n\n /**\n * Find new selection index representing end of current line according to current selection index\n * @param {Number} startFrom Current selection index\n * @return {Number} New selection index\n */\n findLineBoundaryRight(startFrom: number): number {\n let offset = 0,\n index = startFrom;\n\n while (!/\\n/.test(this._text[index]) && index < this._text.length) {\n offset++;\n index++;\n }\n\n return startFrom + offset;\n }\n\n /**\n * Finds index corresponding to beginning or end of a word\n * @param {Number} selectionStart Index of a character\n * @param {Number} direction 1 or -1\n * @return {Number} Index of the beginning or end of a word\n */\n searchWordBoundary(selectionStart: number, direction: 1 | -1): number {\n const text = this._text;\n // if we land on a space we move the cursor backwards\n // if we are searching boundary end we move the cursor backwards ONLY if we don't land on a line break\n let index =\n selectionStart > 0 &&\n this._reSpace.test(text[selectionStart]) &&\n (direction === -1 || !reNewline.test(text[selectionStart - 1]))\n ? selectionStart - 1\n : selectionStart,\n _char = text[index];\n while (index > 0 && index < text.length && !reNonWord.test(_char)) {\n index += direction;\n _char = text[index];\n }\n if (direction === -1 && reNonWord.test(_char)) {\n index++;\n }\n return index;\n }\n\n /**\n * Selects the word that contains the char at index selectionStart\n * @param {Number} selectionStart Index of a character\n */\n selectWord(selectionStart?: number) {\n selectionStart = selectionStart ?? this.selectionStart;\n // search backwards\n const newSelectionStart = this.searchWordBoundary(selectionStart, -1),\n // search forward\n newSelectionEnd = Math.max(\n newSelectionStart,\n this.searchWordBoundary(selectionStart, 1),\n );\n\n this.selectionStart = newSelectionStart;\n this.selectionEnd = newSelectionEnd;\n this._fireSelectionChanged();\n this._updateTextarea();\n // remove next major, for now it renders twice :(\n this.renderCursorOrSelection();\n }\n\n /**\n * Selects the line that contains selectionStart\n * @param {Number} selectionStart Index of a character\n */\n selectLine(selectionStart?: number) {\n selectionStart = selectionStart ?? this.selectionStart;\n const newSelectionStart = this.findLineBoundaryLeft(selectionStart),\n newSelectionEnd = this.findLineBoundaryRight(selectionStart);\n\n this.selectionStart = newSelectionStart;\n this.selectionEnd = newSelectionEnd;\n this._fireSelectionChanged();\n this._updateTextarea();\n }\n\n /**\n * Enters editing state\n */\n enterEditing(e?: TPointerEvent) {\n if (this.isEditing || !this.editable) {\n return;\n }\n this.enterEditingImpl();\n this.fire('editing:entered', e ? { e } : undefined);\n this._fireSelectionChanged();\n if (this.canvas) {\n this.canvas.fire('text:editing:entered', {\n target: this as unknown as IText,\n e,\n });\n this.canvas.requestRenderAll();\n }\n }\n\n /**\n * runs the actual logic that enter from editing state, see {@link enterEditing}\n */\n enterEditingImpl() {\n if (this.canvas) {\n this.canvas.calcOffset();\n this.canvas.textEditingManager.exitTextEditing();\n }\n\n this.isEditing = true;\n\n this.initHiddenTextarea();\n this.hiddenTextarea!.focus();\n this.hiddenTextarea!.value = this.text;\n this._updateTextarea();\n this._saveEditingProps();\n this._setEditingProps();\n this._textBeforeEdit = this.text;\n\n this._tick();\n }\n\n /**\n * called by {@link Canvas#textEditingManager}\n */\n updateSelectionOnMouseMove(e: TPointerEvent) {\n if (this.getActiveControl()) {\n return;\n }\n\n const el = this.hiddenTextarea!;\n // regain focus\n getDocumentFromElement(el).activeElement !== el && el.focus();\n\n const newSelectionStart = this.getSelectionStartFromPointer(e),\n currentStart = this.selectionStart,\n currentEnd = this.selectionEnd;\n if (\n (newSelectionStart !== this.__selectionStartOnMouseDown ||\n currentStart === currentEnd) &&\n (currentStart === newSelectionStart || currentEnd === newSelectionStart)\n ) {\n return;\n }\n if (newSelectionStart > this.__selectionStartOnMouseDown) {\n this.selectionStart = this.__selectionStartOnMouseDown;\n this.selectionEnd = newSelectionStart;\n } else {\n this.selectionStart = newSelectionStart;\n this.selectionEnd = this.__selectionStartOnMouseDown;\n }\n if (\n this.selectionStart !== currentStart ||\n this.selectionEnd !== currentEnd\n ) {\n this._fireSelectionChanged();\n this._updateTextarea();\n this.renderCursorOrSelection();\n }\n }\n\n /**\n * @private\n */\n _setEditingProps() {\n this.hoverCursor = 'text';\n\n if (this.canvas) {\n this.canvas.defaultCursor = this.canvas.moveCursor = 'text';\n }\n\n this.borderColor = this.editingBorderColor;\n this.hasControls = this.selectable = false;\n this.lockMovementX = this.lockMovementY = true;\n }\n\n /**\n * convert from textarea to grapheme indexes\n */\n fromStringToGraphemeSelection(start: number, end: number, text: string) {\n const smallerTextStart = text.slice(0, start),\n graphemeStart = this.graphemeSplit(smallerTextStart).length;\n if (start === end) {\n return { selectionStart: graphemeStart, selectionEnd: graphemeStart };\n }\n const smallerTextEnd = text.slice(start, end),\n graphemeEnd = this.graphemeSplit(smallerTextEnd).length;\n return {\n selectionStart: graphemeStart,\n selectionEnd: graphemeStart + graphemeEnd,\n };\n }\n\n /**\n * convert from fabric to textarea values\n */\n fromGraphemeToStringSelection(\n start: number,\n end: number,\n graphemes: string[],\n ) {\n const smallerTextStart = graphemes.slice(0, start),\n graphemeStart = smallerTextStart.join('').length;\n if (start === end) {\n return { selectionStart: graphemeStart, selectionEnd: graphemeStart };\n }\n const smallerTextEnd = graphemes.slice(start, end),\n graphemeEnd = smallerTextEnd.join('').length;\n return {\n selectionStart: graphemeStart,\n selectionEnd: graphemeStart + graphemeEnd,\n };\n }\n\n /**\n * @private\n */\n _updateTextarea() {\n this.cursorOffsetCache = {};\n if (!this.hiddenTextarea) {\n return;\n }\n if (!this.inCompositionMode) {\n const newSelection = this.fromGraphemeToStringSelection(\n this.selectionStart,\n this.selectionEnd,\n this._text,\n );\n this.hiddenTextarea.selectionStart = newSelection.selectionStart;\n this.hiddenTextarea.selectionEnd = newSelection.selectionEnd;\n }\n this.updateTextareaPosition();\n }\n\n /**\n * @private\n */\n updateFromTextArea() {\n if (!this.hiddenTextarea) {\n return;\n }\n this.cursorOffsetCache = {};\n const textarea = this.hiddenTextarea;\n this.text = textarea.value;\n this.set('dirty', true);\n this.initDimensions();\n this.setCoords();\n const newSelection = this.fromStringToGraphemeSelection(\n textarea.selectionStart,\n textarea.selectionEnd,\n textarea.value,\n );\n this.selectionEnd = this.selectionStart = newSelection.selectionEnd;\n if (!this.inCompositionMode) {\n this.selectionStart = newSelection.selectionStart;\n }\n this.updateTextareaPosition();\n }\n\n /**\n * @private\n */\n updateTextareaPosition() {\n if (this.selectionStart === this.selectionEnd) {\n const style = this._calcTextareaPosition();\n this.hiddenTextarea!.style.left = style.left;\n this.hiddenTextarea!.style.top = style.top;\n }\n }\n\n /**\n * @private\n * @return {Object} style contains style for hiddenTextarea\n */\n _calcTextareaPosition() {\n if (!this.canvas) {\n return { left: '1px', top: '1px' };\n }\n const desiredPosition = this.inCompositionMode\n ? this.compositionStart\n : this.selectionStart,\n boundaries = this._getCursorBoundaries(desiredPosition),\n cursorLocation = this.get2DCursorLocation(desiredPosition),\n lineIndex = cursorLocation.lineIndex,\n charIndex = cursorLocation.charIndex,\n charHeight =\n this.getValueOfPropertyAt(lineIndex, charIndex, 'fontSize') *\n this.lineHeight,\n leftOffset = boundaries.leftOffset,\n retinaScaling = this.getCanvasRetinaScaling(),\n upperCanvas = this.canvas.upperCanvasEl,\n upperCanvasWidth = upperCanvas.width / retinaScaling,\n upperCanvasHeight = upperCanvas.height / retinaScaling,\n maxWidth = upperCanvasWidth - charHeight,\n maxHeight = upperCanvasHeight - charHeight;\n\n const p = new Point(\n boundaries.left + leftOffset,\n boundaries.top + boundaries.topOffset + charHeight,\n )\n .transform(this.calcTransformMatrix())\n .transform(this.canvas.viewportTransform)\n .multiply(\n new Point(\n upperCanvas.clientWidth / upperCanvasWidth,\n upperCanvas.clientHeight / upperCanvasHeight,\n ),\n );\n\n if (p.x < 0) {\n p.x = 0;\n }\n if (p.x > maxWidth) {\n p.x = maxWidth;\n }\n if (p.y < 0) {\n p.y = 0;\n }\n if (p.y > maxHeight) {\n p.y = maxHeight;\n }\n\n // add canvas offset on document\n p.x += this.canvas._offset.left;\n p.y += this.canvas._offset.top;\n\n return {\n left: `${p.x}px`,\n top: `${p.y}px`,\n fontSize: `${charHeight}px`,\n charHeight: charHeight,\n };\n }\n\n /**\n * @private\n */\n _saveEditingProps() {\n this._savedProps = {\n hasControls: this.hasControls,\n borderColor: this.borderColor,\n lockMovementX: this.lockMovementX,\n lockMovementY: this.lockMovementY,\n hoverCursor: this.hoverCursor,\n selectable: this.selectable,\n defaultCursor: this.canvas && this.canvas.defaultCursor,\n moveCursor: this.canvas && this.canvas.moveCursor,\n };\n }\n\n /**\n * @private\n */\n _restoreEditingProps() {\n if (!this._savedProps) {\n return;\n }\n\n this.hoverCursor = this._savedProps.hoverCursor;\n this.hasControls = this._savedProps.hasControls;\n this.borderColor = this._savedProps.borderColor;\n this.selectable = this._savedProps.selectable;\n this.lockMovementX = this._savedProps.lockMovementX;\n this.lockMovementY = this._savedProps.lockMovementY;\n\n if (this.canvas) {\n this.canvas.defaultCursor =\n this._savedProps.defaultCursor || this.canvas.defaultCursor;\n this.canvas.moveCursor =\n this._savedProps.moveCursor || this.canvas.moveCursor;\n }\n\n delete this._savedProps;\n }\n\n /**\n * runs the actual logic that exits from editing state, see {@link exitEditing}\n * But it does not fire events\n */\n exitEditingImpl() {\n const hiddenTextarea = this.hiddenTextarea;\n this.selected = false;\n this.isEditing = false;\n\n if (hiddenTextarea) {\n hiddenTextarea.blur && hiddenTextarea.blur();\n hiddenTextarea.parentNode &&\n hiddenTextarea.parentNode.removeChild(hiddenTextarea);\n }\n this.hiddenTextarea = null;\n this.abortCursorAnimation();\n this.selectionStart !== this.selectionEnd && this.clearContextTop();\n this.selectionEnd = this.selectionStart;\n this._restoreEditingProps();\n if (this._forceClearCache) {\n this.initDimensions();\n this.setCoords();\n }\n }\n\n /**\n * Exits from editing state and fires relevant events\n */\n exitEditing() {\n const isTextChanged = this._textBeforeEdit !== this.text;\n this.exitEditingImpl();\n\n this.fire('editing:exited');\n isTextChanged && this.fire(MODIFIED);\n if (this.canvas) {\n this.canvas.fire('text:editing:exited', {\n target: this as unknown as IText,\n });\n // todo: evaluate add an action to this event\n isTextChanged && this.canvas.fire('object:modified', { target: this });\n }\n return this;\n }\n\n /**\n * @private\n */\n _removeExtraneousStyles() {\n for (const prop in this.styles) {\n if (!this._textLines[prop as unknown as number]) {\n delete this.styles[prop];\n }\n }\n }\n\n /**\n * remove and reflow a style block from start to end.\n * @param {Number} start linear start position for removal (included in removal)\n * @param {Number} end linear end position for removal ( excluded from removal )\n */\n removeStyleFromTo(start: number, end: number) {\n const { lineIndex: lineStart, charIndex: charStart } =\n this.get2DCursorLocation(start, true),\n { lineIndex: lineEnd, charIndex: charEnd } = this.get2DCursorLocation(\n end,\n true,\n );\n if (lineStart !== lineEnd) {\n // step1 remove the trailing of lineStart\n if (this.styles[lineStart]) {\n for (\n let i = charStart;\n i < this._unwrappedTextLines[lineStart].length;\n i++\n ) {\n delete this.styles[lineStart][i];\n }\n }\n // step2 move the trailing of lineEnd to lineStart if needed\n if (this.styles[lineEnd]) {\n for (\n let i = charEnd;\n i < this._unwrappedTextLines[lineEnd].length;\n i++\n ) {\n const styleObj = this.styles[lineEnd][i];\n if (styleObj) {\n this.styles[lineStart] || (this.styles[lineStart] = {});\n this.styles[lineStart][charStart + i - charEnd] = styleObj;\n }\n }\n }\n // step3 detects lines will be completely removed.\n for (let i = lineStart + 1; i <= lineEnd; i++) {\n delete this.styles[i];\n }\n // step4 shift remaining lines.\n this.shiftLineStyles(lineEnd, lineStart - lineEnd);\n } else {\n // remove and shift left on the same line\n if (this.styles[lineStart]) {\n const styleObj = this.styles[lineStart];\n const diff = charEnd - charStart;\n for (let i = charStart; i < charEnd; i++) {\n delete styleObj[i];\n }\n for (const char in this.styles[lineStart]) {\n const numericChar = parseInt(char, 10);\n if (numericChar >= charEnd) {\n styleObj[numericChar - diff] = styleObj[char];\n delete styleObj[char];\n }\n }\n }\n }\n }\n\n /**\n * Shifts line styles up or down\n * @param {Number} lineIndex Index of a line\n * @param {Number} offset Can any number?\n */\n shiftLineStyles(lineIndex: number, offset: number) {\n const clonedStyles = Object.assign({}, this.styles);\n for (const line in this.styles) {\n const numericLine = parseInt(line, 10);\n if (numericLine > lineIndex) {\n this.styles[numericLine + offset] = clonedStyles[numericLine];\n if (!clonedStyles[numericLine - offset]) {\n delete this.styles[numericLine];\n }\n }\n }\n }\n\n /**\n * Handle insertion of more consecutive style lines for when one or more\n * newlines gets added to the text. Since current style needs to be shifted\n * first we shift the current style of the number lines needed, then we add\n * new lines from the last to the first.\n * @param {Number} lineIndex Index of a line\n * @param {Number} charIndex Index of a char\n * @param {Number} qty number of lines to add\n * @param {Array} copiedStyle Array of objects styles\n */\n insertNewlineStyleObject(\n lineIndex: number,\n charIndex: number,\n qty: number,\n copiedStyle?: { [index: number]: TextStyleDeclaration },\n ) {\n const newLineStyles: { [index: number]: TextStyleDeclaration } = {};\n const originalLineLength = this._unwrappedTextLines[lineIndex].length;\n const isEndOfLine = originalLineLength === charIndex;\n\n let someStyleIsCarryingOver = false;\n qty || (qty = 1);\n this.shiftLineStyles(lineIndex, qty);\n const currentCharStyle = this.styles[lineIndex]\n ? this.styles[lineIndex][charIndex === 0 ? charIndex : charIndex - 1]\n : undefined;\n\n // we clone styles of all chars\n // after cursor onto the current line\n for (const index in this.styles[lineIndex]) {\n const numIndex = parseInt(index, 10);\n if (numIndex >= charIndex) {\n someStyleIsCarryingOver = true;\n newLineStyles[numIndex - charIndex] = this.styles[lineIndex][index];\n // remove lines from the previous line since they're on a new line now\n if (!(isEndOfLine && charIndex === 0)) {\n delete this.styles[lineIndex][index];\n }\n }\n }\n let styleCarriedOver = false;\n if (someStyleIsCarryingOver && !isEndOfLine) {\n // if is end of line, the extra style we copied\n // is probably not something we want\n this.styles[lineIndex + qty] = newLineStyles;\n styleCarriedOver = true;\n }\n if (styleCarriedOver || originalLineLength > charIndex) {\n // skip the last line of since we already prepared it.\n // or contains text without style that we don't want to style\n // just because it changed lines\n qty--;\n }\n // for the all the lines or all the other lines\n // we clone current char style onto the next (otherwise empty) line\n while (qty > 0) {\n if (copiedStyle && copiedStyle[qty - 1]) {\n this.styles[lineIndex + qty] = {\n 0: { ...copiedStyle[qty - 1] },\n };\n } else if (currentCharStyle) {\n this.styles[lineIndex + qty] = {\n 0: { ...currentCharStyle },\n };\n } else {\n delete this.styles[lineIndex + qty];\n }\n qty--;\n }\n this._forceClearCache = true;\n }\n\n /**\n * Inserts style object for a given line/char index\n * @param {Number} lineIndex Index of a line\n * @param {Number} charIndex Index of a char\n * @param {Number} quantity number Style object to insert, if given\n * @param {Array} copiedStyle array of style objects\n */\n insertCharStyleObject(\n lineIndex: number,\n charIndex: number,\n quantity: number,\n copiedStyle?: TextStyleDeclaration[],\n ) {\n if (!this.styles) {\n this.styles = {};\n }\n const currentLineStyles = this.styles[lineIndex],\n currentLineStylesCloned = currentLineStyles\n ? { ...currentLineStyles }\n : {};\n\n quantity || (quantity = 1);\n // shift all char styles by quantity forward\n // 0,1,2,3 -> (charIndex=2) -> 0,1,3,4 -> (insert 2) -> 0,1,2,3,4\n for (const index in currentLineStylesCloned) {\n const numericIndex = parseInt(index, 10);\n if (numericIndex >= charIndex) {\n currentLineStyles[numericIndex + quantity] =\n currentLineStylesCloned[numericIndex];\n // only delete the style if there was nothing moved there\n if (!currentLineStylesCloned[numericIndex - quantity]) {\n delete currentLineStyles[numericIndex];\n }\n }\n }\n this._forceClearCache = true;\n if (copiedStyle) {\n while (quantity--) {\n if (!Object.keys(copiedStyle[quantity]).length) {\n continue;\n }\n if (!this.styles[lineIndex]) {\n this.styles[lineIndex] = {};\n }\n this.styles[lineIndex][charIndex + quantity] = {\n ...copiedStyle[quantity],\n };\n }\n return;\n }\n if (!currentLineStyles) {\n return;\n }\n const newStyle = currentLineStyles[charIndex ? charIndex - 1 : 1];\n while (newStyle && quantity--) {\n this.styles[lineIndex][charIndex + quantity] = { ...newStyle };\n }\n }\n\n /**\n * Inserts style object(s)\n * @param {Array} insertedText Characters at the location where style is inserted\n * @param {Number} start cursor index for inserting style\n * @param {Array} [copiedStyle] array of style objects to insert.\n */\n insertNewStyleBlock(\n insertedText: string[],\n start: number,\n copiedStyle?: TextStyleDeclaration[],\n ) {\n const cursorLoc = this.get2DCursorLocation(start, true),\n addedLines = [0];\n let linesLength = 0;\n // get an array of how many char per lines are being added.\n for (let i = 0; i < insertedText.length; i++) {\n if (insertedText[i] === '\\n') {\n linesLength++;\n addedLines[linesLength] = 0;\n } else {\n addedLines[linesLength]++;\n }\n }\n // for the first line copy the style from the current char position.\n if (addedLines[0] > 0) {\n this.insertCharStyleObject(\n cursorLoc.lineIndex,\n cursorLoc.charIndex,\n addedLines[0],\n copiedStyle,\n );\n copiedStyle = copiedStyle && copiedStyle.slice(addedLines[0] + 1);\n }\n linesLength &&\n this.insertNewlineStyleObject(\n cursorLoc.lineIndex,\n cursorLoc.charIndex + addedLines[0],\n linesLength,\n );\n let i;\n for (i = 1; i < linesLength; i++) {\n if (addedLines[i] > 0) {\n this.insertCharStyleObject(\n cursorLoc.lineIndex + i,\n 0,\n addedLines[i],\n copiedStyle,\n );\n } else if (copiedStyle) {\n // this test is required in order to close #6841\n // when a pasted buffer begins with a newline then\n // this.styles[cursorLoc.lineIndex + i] and copiedStyle[0]\n // may be undefined for some reason\n if (this.styles[cursorLoc.lineIndex + i] && copiedStyle[0]) {\n this.styles[cursorLoc.lineIndex + i][0] = copiedStyle[0];\n }\n }\n copiedStyle = copiedStyle && copiedStyle.slice(addedLines[i] + 1);\n }\n if (addedLines[i] > 0) {\n this.insertCharStyleObject(\n cursorLoc.lineIndex + i,\n 0,\n addedLines[i],\n copiedStyle,\n );\n }\n }\n\n /**\n * Removes characters from start/end\n * start/end ar per grapheme position in _text array.\n *\n * @param {Number} start\n * @param {Number} end default to start + 1\n */\n removeChars(start: number, end: number = start + 1) {\n this.removeStyleFromTo(start, end);\n this._text.splice(start, end - start);\n this.text = this._text.join('');\n this.set('dirty', true);\n this.initDimensions();\n this.setCoords();\n this._removeExtraneousStyles();\n }\n\n /**\n * insert characters at start position, before start position.\n * start equal 1 it means the text get inserted between actual grapheme 0 and 1\n * if style array is provided, it must be as the same length of text in graphemes\n * if end is provided and is bigger than start, old text is replaced.\n * start/end ar per grapheme position in _text array.\n *\n * @param {String} text text to insert\n * @param {Array} style array of style objects\n * @param {Number} start\n * @param {Number} end default to start + 1\n */\n insertChars(\n text: string,\n style: TextStyleDeclaration[] | undefined,\n start: number,\n end: number = start,\n ) {\n if (end > start) {\n this.removeStyleFromTo(start, end);\n }\n const graphemes = this.graphemeSplit(text);\n this.insertNewStyleBlock(graphemes, start, style);\n this._text = [\n ...this._text.slice(0, start),\n ...graphemes,\n ...this._text.slice(end),\n ];\n this.text = this._text.join('');\n this.set('dirty', true);\n this.initDimensions();\n this.setCoords();\n this._removeExtraneousStyles();\n }\n\n /**\n * Set the selectionStart and selectionEnd according to the new position of cursor\n * mimic the key - mouse navigation when shift is pressed.\n */\n setSelectionStartEndWithShift(\n start: number,\n end: number,\n newSelection: number,\n ) {\n if (newSelection <= start) {\n if (end === start) {\n this._selectionDirection = LEFT;\n } else if (this._selectionDirection === RIGHT) {\n this._selectionDirection = LEFT;\n this.selectionEnd = start;\n }\n this.selectionStart = newSelection;\n } else if (newSelection > start && newSelection < end) {\n if (this._selectionDirection === RIGHT) {\n this.selectionEnd = newSelection;\n } else {\n this.selectionStart = newSelection;\n }\n } else {\n // newSelection is > selection start and end\n if (end === start) {\n this._selectionDirection = RIGHT;\n } else if (this._selectionDirection === LEFT) {\n this._selectionDirection = RIGHT;\n this.selectionStart = end;\n }\n this.selectionEnd = newSelection;\n }\n }\n}\n","import { config } from '../../config';\nimport { getFabricDocument, getEnv } from '../../env';\nimport { capValue } from '../../util/misc/capValue';\nimport type { ITextEvents } from './ITextBehavior';\nimport { ITextBehavior } from './ITextBehavior';\nimport type { TKeyMapIText } from './constants';\nimport type { TOptions } from '../../typedefs';\nimport type { TextProps, SerializedTextProps } from '../Text/Text';\nimport { getDocumentFromElement } from '../../util/dom_misc';\nimport { CHANGED, LEFT, RIGHT } from '../../constants';\nimport type { IText } from './IText';\nimport type { TextStyleDeclaration } from '../Text/StyledText';\n\nexport abstract class ITextKeyBehavior<\n Props extends TOptions = Partial,\n SProps extends SerializedTextProps = SerializedTextProps,\n EventSpec extends ITextEvents = ITextEvents,\n> extends ITextBehavior {\n /**\n * For functionalities on keyDown\n * Map a special key to a function of the instance/prototype\n * If you need different behavior for ESC or TAB or arrows, you have to change\n * this map setting the name of a function that you build on the IText or\n * your prototype.\n * the map change will affect all Instances unless you need for only some text Instances\n * in that case you have to clone this object and assign your Instance.\n * this.keysMap = Object.assign({}, this.keysMap);\n * The function must be in IText.prototype.myFunction And will receive event as args[0]\n */\n declare keysMap: TKeyMapIText;\n\n declare keysMapRtl: TKeyMapIText;\n\n /**\n * For functionalities on keyUp + ctrl || cmd\n */\n declare ctrlKeysMapUp: TKeyMapIText;\n\n /**\n * For functionalities on keyDown + ctrl || cmd\n */\n declare ctrlKeysMapDown: TKeyMapIText;\n\n declare hiddenTextarea: HTMLTextAreaElement | null;\n\n /**\n * DOM container to append the hiddenTextarea.\n * An alternative to attaching to the document.body.\n * Useful to reduce laggish redraw of the full document.body tree and\n * also with modals event capturing that won't let the textarea take focus.\n * @type HTMLElement\n */\n declare hiddenTextareaContainer?: HTMLElement | null;\n\n declare private _clickHandlerInitialized: boolean;\n declare private _copyDone: boolean;\n declare private fromPaste: boolean;\n\n /**\n * Initializes hidden textarea (needed to bring up keyboard in iOS)\n */\n initHiddenTextarea() {\n const doc =\n (this.canvas && getDocumentFromElement(this.canvas.getElement())) ||\n getFabricDocument();\n const textarea = doc.createElement('textarea');\n Object.entries({\n autocapitalize: 'off',\n autocorrect: 'off',\n autocomplete: 'off',\n spellcheck: 'false',\n 'data-fabric': 'textarea',\n wrap: 'off',\n }).map(([attribute, value]) => textarea.setAttribute(attribute, value));\n const { top, left, fontSize } = this._calcTextareaPosition();\n // line-height: 1px; was removed from the style to fix this:\n // https://bugs.chromium.org/p/chromium/issues/detail?id=870966\n textarea.style.cssText = `position: absolute; top: ${top}; left: ${left}; z-index: -999; opacity: 0; width: 1px; height: 1px; font-size: 1px; padding-top: ${fontSize};`;\n\n (this.hiddenTextareaContainer || doc.body).appendChild(textarea);\n\n Object.entries({\n blur: 'blur',\n keydown: 'onKeyDown',\n keyup: 'onKeyUp',\n input: 'onInput',\n copy: 'copy',\n cut: 'copy',\n paste: 'paste',\n compositionstart: 'onCompositionStart',\n compositionupdate: 'onCompositionUpdate',\n compositionend: 'onCompositionEnd',\n } as Record).map(([eventName, handler]) =>\n textarea.addEventListener(\n eventName,\n (this[handler] as EventListener).bind(this),\n ),\n );\n this.hiddenTextarea = textarea;\n }\n\n /**\n * Override this method to customize cursor behavior on textbox blur\n */\n blur() {\n this.abortCursorAnimation();\n }\n\n /**\n * Handles keydown event\n * only used for arrows and combination of modifier keys.\n * @param {KeyboardEvent} e Event object\n */\n onKeyDown(e: KeyboardEvent) {\n if (!this.isEditing) {\n return;\n }\n const keyMap = this.direction === 'rtl' ? this.keysMapRtl : this.keysMap;\n if (e.keyCode in keyMap) {\n (this[keyMap[e.keyCode] as keyof this] as (arg: KeyboardEvent) => void)(\n e,\n );\n } else if (e.keyCode in this.ctrlKeysMapDown && (e.ctrlKey || e.metaKey)) {\n (\n this[this.ctrlKeysMapDown[e.keyCode] as keyof this] as (\n arg: KeyboardEvent,\n ) => void\n )(e);\n } else {\n return;\n }\n e.stopImmediatePropagation();\n e.preventDefault();\n if (e.keyCode >= 33 && e.keyCode <= 40) {\n // if i press an arrow key just update selection\n this.inCompositionMode = false;\n this.clearContextTop();\n this.renderCursorOrSelection();\n } else {\n this.canvas && this.canvas.requestRenderAll();\n }\n }\n\n /**\n * Handles keyup event\n * We handle KeyUp because ie11 and edge have difficulties copy/pasting\n * if a copy/cut event fired, keyup is dismissed\n * @param {KeyboardEvent} e Event object\n */\n onKeyUp(e: KeyboardEvent) {\n if (!this.isEditing || this._copyDone || this.inCompositionMode) {\n this._copyDone = false;\n return;\n }\n if (e.keyCode in this.ctrlKeysMapUp && (e.ctrlKey || e.metaKey)) {\n (\n this[this.ctrlKeysMapUp[e.keyCode] as keyof this] as (\n arg: KeyboardEvent,\n ) => void\n )(e);\n } else {\n return;\n }\n e.stopImmediatePropagation();\n e.preventDefault();\n this.canvas && this.canvas.requestRenderAll();\n }\n\n /**\n * Handles onInput event\n * @param {Event} e Event object\n */\n onInput(this: this & { hiddenTextarea: HTMLTextAreaElement }, e: Event) {\n const fromPaste = this.fromPaste;\n const { value, selectionStart, selectionEnd } = this.hiddenTextarea;\n this.fromPaste = false;\n e && e.stopPropagation();\n if (!this.isEditing) {\n return;\n }\n const updateAndFire = () => {\n this.updateFromTextArea();\n this.fire(CHANGED);\n if (this.canvas) {\n this.canvas.fire('text:changed', { target: this as unknown as IText });\n this.canvas.requestRenderAll();\n }\n };\n if (this.hiddenTextarea.value === '') {\n this.styles = {};\n updateAndFire();\n return;\n }\n // decisions about style changes.\n const nextText = this._splitTextIntoLines(value).graphemeText,\n charCount = this._text.length,\n nextCharCount = nextText.length,\n _selectionStart = this.selectionStart,\n _selectionEnd = this.selectionEnd,\n selection = _selectionStart !== _selectionEnd;\n let copiedStyle: TextStyleDeclaration[] | undefined,\n removedText,\n charDiff = nextCharCount - charCount,\n removeFrom,\n removeTo;\n\n const textareaSelection = this.fromStringToGraphemeSelection(\n selectionStart,\n selectionEnd,\n value,\n );\n const backDelete = _selectionStart > textareaSelection.selectionStart;\n\n if (selection) {\n removedText = this._text.slice(_selectionStart, _selectionEnd);\n charDiff += _selectionEnd - _selectionStart;\n } else if (nextCharCount < charCount) {\n if (backDelete) {\n removedText = this._text.slice(_selectionEnd + charDiff, _selectionEnd);\n } else {\n removedText = this._text.slice(\n _selectionStart,\n _selectionStart - charDiff,\n );\n }\n }\n const insertedText = nextText.slice(\n textareaSelection.selectionEnd - charDiff,\n textareaSelection.selectionEnd,\n );\n if (removedText && removedText.length) {\n if (insertedText.length) {\n // let's copy some style before deleting.\n // we want to copy the style before the cursor OR the style at the cursor if selection\n // is bigger than 0.\n copiedStyle = this.getSelectionStyles(\n _selectionStart,\n _selectionStart + 1,\n false,\n );\n // now duplicate the style one for each inserted text.\n copiedStyle = insertedText.map(\n () =>\n // this return an array of references, but that is fine since we are\n // copying the style later.\n copiedStyle![0],\n );\n }\n if (selection) {\n removeFrom = _selectionStart;\n removeTo = _selectionEnd;\n } else if (backDelete) {\n // detect differences between forwardDelete and backDelete\n removeFrom = _selectionEnd - removedText.length;\n removeTo = _selectionEnd;\n } else {\n removeFrom = _selectionEnd;\n removeTo = _selectionEnd + removedText.length;\n }\n this.removeStyleFromTo(removeFrom, removeTo);\n }\n if (insertedText.length) {\n const { copyPasteData } = getEnv();\n if (\n fromPaste &&\n insertedText.join('') === copyPasteData.copiedText &&\n !config.disableStyleCopyPaste\n ) {\n copiedStyle = copyPasteData.copiedTextStyle;\n }\n this.insertNewStyleBlock(insertedText, _selectionStart, copiedStyle);\n }\n updateAndFire();\n }\n\n /**\n * Composition start\n */\n onCompositionStart() {\n this.inCompositionMode = true;\n }\n\n /**\n * Composition end\n */\n onCompositionEnd() {\n this.inCompositionMode = false;\n }\n\n onCompositionUpdate({ target }: CompositionEvent) {\n const { selectionStart, selectionEnd } = target as HTMLTextAreaElement;\n this.compositionStart = selectionStart;\n this.compositionEnd = selectionEnd;\n this.updateTextareaPosition();\n }\n\n /**\n * Copies selected text\n */\n copy() {\n if (this.selectionStart === this.selectionEnd) {\n //do not cut-copy if no selection\n return;\n }\n const { copyPasteData } = getEnv();\n copyPasteData.copiedText = this.getSelectedText();\n if (!config.disableStyleCopyPaste) {\n copyPasteData.copiedTextStyle = this.getSelectionStyles(\n this.selectionStart,\n this.selectionEnd,\n true,\n );\n } else {\n copyPasteData.copiedTextStyle = undefined;\n }\n this._copyDone = true;\n }\n\n /**\n * Pastes text\n */\n paste() {\n this.fromPaste = true;\n }\n\n /**\n * Finds the width in pixels before the cursor on the same line\n * @private\n * @param {Number} lineIndex\n * @param {Number} charIndex\n * @return {Number} widthBeforeCursor width before cursor\n */\n _getWidthBeforeCursor(lineIndex: number, charIndex: number): number {\n let widthBeforeCursor = this._getLineLeftOffset(lineIndex),\n bound;\n\n if (charIndex > 0) {\n bound = this.__charBounds[lineIndex][charIndex - 1];\n widthBeforeCursor += bound.left + bound.width;\n }\n return widthBeforeCursor;\n }\n\n /**\n * Gets start offset of a selection\n * @param {KeyboardEvent} e Event object\n * @param {Boolean} isRight\n * @return {Number}\n */\n getDownCursorOffset(e: KeyboardEvent, isRight: boolean): number {\n const selectionProp = this._getSelectionForOffset(e, isRight),\n cursorLocation = this.get2DCursorLocation(selectionProp),\n lineIndex = cursorLocation.lineIndex;\n // if on last line, down cursor goes to end of line\n if (\n lineIndex === this._textLines.length - 1 ||\n e.metaKey ||\n e.keyCode === 34\n ) {\n // move to the end of a text\n return this._text.length - selectionProp;\n }\n const charIndex = cursorLocation.charIndex,\n widthBeforeCursor = this._getWidthBeforeCursor(lineIndex, charIndex),\n indexOnOtherLine = this._getIndexOnLine(lineIndex + 1, widthBeforeCursor),\n textAfterCursor = this._textLines[lineIndex].slice(charIndex);\n return (\n textAfterCursor.length +\n indexOnOtherLine +\n 1 +\n this.missingNewlineOffset(lineIndex)\n );\n }\n\n /**\n * private\n * Helps finding if the offset should be counted from Start or End\n * @param {KeyboardEvent} e Event object\n * @param {Boolean} isRight\n * @return {Number}\n */\n _getSelectionForOffset(e: KeyboardEvent, isRight: boolean): number {\n if (e.shiftKey && this.selectionStart !== this.selectionEnd && isRight) {\n return this.selectionEnd;\n } else {\n return this.selectionStart;\n }\n }\n\n /**\n * @param {KeyboardEvent} e Event object\n * @param {Boolean} isRight\n * @return {Number}\n */\n getUpCursorOffset(e: KeyboardEvent, isRight: boolean): number {\n const selectionProp = this._getSelectionForOffset(e, isRight),\n cursorLocation = this.get2DCursorLocation(selectionProp),\n lineIndex = cursorLocation.lineIndex;\n if (lineIndex === 0 || e.metaKey || e.keyCode === 33) {\n // if on first line, up cursor goes to start of line\n return -selectionProp;\n }\n const charIndex = cursorLocation.charIndex,\n widthBeforeCursor = this._getWidthBeforeCursor(lineIndex, charIndex),\n indexOnOtherLine = this._getIndexOnLine(lineIndex - 1, widthBeforeCursor),\n textBeforeCursor = this._textLines[lineIndex].slice(0, charIndex),\n missingNewlineOffset = this.missingNewlineOffset(lineIndex - 1);\n // return a negative offset\n return (\n -this._textLines[lineIndex - 1].length +\n indexOnOtherLine -\n textBeforeCursor.length +\n (1 - missingNewlineOffset)\n );\n }\n\n /**\n * for a given width it founds the matching character.\n * @private\n */\n _getIndexOnLine(lineIndex: number, width: number) {\n const line = this._textLines[lineIndex],\n lineLeftOffset = this._getLineLeftOffset(lineIndex);\n let widthOfCharsOnLine = lineLeftOffset,\n indexOnLine = 0,\n charWidth,\n foundMatch;\n\n for (let j = 0, jlen = line.length; j < jlen; j++) {\n charWidth = this.__charBounds[lineIndex][j].width;\n widthOfCharsOnLine += charWidth;\n if (widthOfCharsOnLine > width) {\n foundMatch = true;\n const leftEdge = widthOfCharsOnLine - charWidth,\n rightEdge = widthOfCharsOnLine,\n offsetFromLeftEdge = Math.abs(leftEdge - width),\n offsetFromRightEdge = Math.abs(rightEdge - width);\n\n indexOnLine = offsetFromRightEdge < offsetFromLeftEdge ? j : j - 1;\n break;\n }\n }\n\n // reached end\n if (!foundMatch) {\n indexOnLine = line.length - 1;\n }\n\n return indexOnLine;\n }\n\n /**\n * Moves cursor down\n * @param {KeyboardEvent} e Event object\n */\n moveCursorDown(e: KeyboardEvent) {\n if (\n this.selectionStart >= this._text.length &&\n this.selectionEnd >= this._text.length\n ) {\n return;\n }\n this._moveCursorUpOrDown('Down', e);\n }\n\n /**\n * Moves cursor up\n * @param {KeyboardEvent} e Event object\n */\n moveCursorUp(e: KeyboardEvent) {\n if (this.selectionStart === 0 && this.selectionEnd === 0) {\n return;\n }\n this._moveCursorUpOrDown('Up', e);\n }\n\n /**\n * Moves cursor up or down, fires the events\n * @param {String} direction 'Up' or 'Down'\n * @param {KeyboardEvent} e Event object\n */\n _moveCursorUpOrDown(direction: 'Up' | 'Down', e: KeyboardEvent) {\n const offset = this[`get${direction}CursorOffset`](\n e,\n this._selectionDirection === RIGHT,\n );\n if (e.shiftKey) {\n this.moveCursorWithShift(offset);\n } else {\n this.moveCursorWithoutShift(offset);\n }\n if (offset !== 0) {\n const max = this.text.length;\n this.selectionStart = capValue(0, this.selectionStart, max);\n this.selectionEnd = capValue(0, this.selectionEnd, max);\n // TODO fix: abort and init should be an alternative depending\n // on selectionStart/End being equal or different\n this.abortCursorAnimation();\n this.initDelayedCursor();\n this._fireSelectionChanged();\n this._updateTextarea();\n }\n }\n\n /**\n * Moves cursor with shift\n * @param {Number} offset\n */\n moveCursorWithShift(offset: number) {\n const newSelection =\n this._selectionDirection === LEFT\n ? this.selectionStart + offset\n : this.selectionEnd + offset;\n this.setSelectionStartEndWithShift(\n this.selectionStart,\n this.selectionEnd,\n newSelection,\n );\n return offset !== 0;\n }\n\n /**\n * Moves cursor up without shift\n * @param {Number} offset\n */\n moveCursorWithoutShift(offset: number) {\n if (offset < 0) {\n this.selectionStart += offset;\n this.selectionEnd = this.selectionStart;\n } else {\n this.selectionEnd += offset;\n this.selectionStart = this.selectionEnd;\n }\n return offset !== 0;\n }\n\n /**\n * Moves cursor left\n * @param {KeyboardEvent} e Event object\n */\n moveCursorLeft(e: KeyboardEvent) {\n if (this.selectionStart === 0 && this.selectionEnd === 0) {\n return;\n }\n this._moveCursorLeftOrRight('Left', e);\n }\n\n /**\n * @private\n * @return {Boolean} true if a change happened\n *\n * @todo refactor not to use method name composition\n */\n _move(\n e: KeyboardEvent,\n prop: 'selectionStart' | 'selectionEnd',\n direction: 'Left' | 'Right',\n ): boolean {\n let newValue: number | undefined;\n if (e.altKey) {\n newValue = this[`findWordBoundary${direction}`](this[prop]);\n } else if (e.metaKey || e.keyCode === 35 || e.keyCode === 36) {\n newValue = this[`findLineBoundary${direction}`](this[prop]);\n } else {\n this[prop] += direction === 'Left' ? -1 : 1;\n return true;\n }\n if (typeof newValue !== 'undefined' && this[prop] !== newValue) {\n this[prop] = newValue;\n return true;\n }\n return false;\n }\n\n /**\n * @private\n */\n _moveLeft(e: KeyboardEvent, prop: 'selectionStart' | 'selectionEnd') {\n return this._move(e, prop, 'Left');\n }\n\n /**\n * @private\n */\n _moveRight(e: KeyboardEvent, prop: 'selectionStart' | 'selectionEnd') {\n return this._move(e, prop, 'Right');\n }\n\n /**\n * Moves cursor left without keeping selection\n * @param {KeyboardEvent} e\n */\n moveCursorLeftWithoutShift(e: KeyboardEvent) {\n let change = true;\n this._selectionDirection = LEFT;\n\n // only move cursor when there is no selection,\n // otherwise we discard it, and leave cursor on same place\n if (\n this.selectionEnd === this.selectionStart &&\n this.selectionStart !== 0\n ) {\n change = this._moveLeft(e, 'selectionStart');\n }\n this.selectionEnd = this.selectionStart;\n return change;\n }\n\n /**\n * Moves cursor left while keeping selection\n * @param {KeyboardEvent} e\n */\n moveCursorLeftWithShift(e: KeyboardEvent) {\n if (\n this._selectionDirection === RIGHT &&\n this.selectionStart !== this.selectionEnd\n ) {\n return this._moveLeft(e, 'selectionEnd');\n } else if (this.selectionStart !== 0) {\n this._selectionDirection = LEFT;\n return this._moveLeft(e, 'selectionStart');\n }\n }\n\n /**\n * Moves cursor right\n * @param {KeyboardEvent} e Event object\n */\n moveCursorRight(e: KeyboardEvent) {\n if (\n this.selectionStart >= this._text.length &&\n this.selectionEnd >= this._text.length\n ) {\n return;\n }\n this._moveCursorLeftOrRight('Right', e);\n }\n\n /**\n * Moves cursor right or Left, fires event\n * @param {String} direction 'Left', 'Right'\n * @param {KeyboardEvent} e Event object\n */\n _moveCursorLeftOrRight(direction: 'Left' | 'Right', e: KeyboardEvent) {\n const actionName = `moveCursor${direction}${\n e.shiftKey ? 'WithShift' : 'WithoutShift'\n }` as const;\n this._currentCursorOpacity = 1;\n if (this[actionName](e)) {\n // TODO fix: abort and init should be an alternative depending\n // on selectionStart/End being equal or different\n this.abortCursorAnimation();\n this.initDelayedCursor();\n this._fireSelectionChanged();\n this._updateTextarea();\n }\n }\n\n /**\n * Moves cursor right while keeping selection\n * @param {KeyboardEvent} e\n */\n moveCursorRightWithShift(e: KeyboardEvent) {\n if (\n this._selectionDirection === LEFT &&\n this.selectionStart !== this.selectionEnd\n ) {\n return this._moveRight(e, 'selectionStart');\n } else if (this.selectionEnd !== this._text.length) {\n this._selectionDirection = RIGHT;\n return this._moveRight(e, 'selectionEnd');\n }\n }\n\n /**\n * Moves cursor right without keeping selection\n * @param {KeyboardEvent} e Event object\n */\n moveCursorRightWithoutShift(e: KeyboardEvent) {\n let changed = true;\n this._selectionDirection = RIGHT;\n\n if (this.selectionStart === this.selectionEnd) {\n changed = this._moveRight(e, 'selectionStart');\n this.selectionEnd = this.selectionStart;\n } else {\n this.selectionStart = this.selectionEnd;\n }\n return changed;\n }\n}\n","import type {\n ObjectPointerEvents,\n TPointerEvent,\n TPointerEventInfo,\n} from '../../EventTypeDefs';\nimport { Point } from '../../Point';\nimport { invertTransform } from '../../util/misc/matrix';\nimport { DraggableTextDelegate } from './DraggableTextDelegate';\nimport type { ITextEvents } from './ITextBehavior';\nimport { ITextKeyBehavior } from './ITextKeyBehavior';\nimport type { TOptions } from '../../typedefs';\nimport type { TextProps, SerializedTextProps } from '../Text/Text';\nimport type { IText } from './IText';\n/**\n * `LEFT_CLICK === 0`\n */\nconst notALeftClick = (e: Event) => !!(e as MouseEvent).button;\n\nexport abstract class ITextClickBehavior<\n Props extends TOptions = Partial,\n SProps extends SerializedTextProps = SerializedTextProps,\n EventSpec extends ITextEvents = ITextEvents,\n> extends ITextKeyBehavior {\n protected draggableTextDelegate: DraggableTextDelegate;\n\n initBehavior() {\n // Initializes event handlers related to cursor or selection\n this.on('mousedown', this._mouseDownHandler);\n this.on('mouseup', this.mouseUpHandler);\n this.on('mousedblclick', this.doubleClickHandler);\n this.on('mousetripleclick', this.tripleClickHandler);\n\n this.draggableTextDelegate = new DraggableTextDelegate(\n this as unknown as IText,\n );\n\n super.initBehavior();\n }\n\n /**\n * If this method returns true a mouse move operation over a text selection\n * will not prevent the native mouse event allowing the browser to start a drag operation.\n * shouldStartDragging can be read 'do not prevent default for mouse move event'\n * To prevent drag and drop between objects both shouldStartDragging and onDragStart should return false\n * @returns\n */\n shouldStartDragging() {\n return this.draggableTextDelegate.isActive();\n }\n\n /**\n * @public override this method to control whether instance should/shouldn't become a drag source,\n * @see also {@link DraggableTextDelegate#isActive}\n * To prevent drag and drop between objects both shouldStartDragging and onDragStart should return false\n * @returns {boolean} should handle event\n */\n onDragStart(e: DragEvent) {\n return this.draggableTextDelegate.onDragStart(e);\n }\n\n /**\n * @public override this method to control whether instance should/shouldn't become a drop target\n */\n canDrop(e: DragEvent) {\n return this.draggableTextDelegate.canDrop(e);\n }\n\n /**\n * Default handler for double click, select a word\n */\n doubleClickHandler(options: TPointerEventInfo) {\n if (!this.isEditing) {\n return;\n }\n this.selectWord(this.getSelectionStartFromPointer(options.e));\n this.renderCursorOrSelection();\n }\n\n /**\n * Default handler for triple click, select a line\n */\n tripleClickHandler(options: TPointerEventInfo) {\n if (!this.isEditing) {\n return;\n }\n this.selectLine(this.getSelectionStartFromPointer(options.e));\n this.renderCursorOrSelection();\n }\n\n /**\n * Default event handler for the basic functionalities needed on _mouseDown\n * can be overridden to do something different.\n * Scope of this implementation is: find the click position, set selectionStart\n * find selectionEnd, initialize the drawing of either cursor or selection area\n * initializing a mousedDown on a text area will cancel fabricjs knowledge of\n * current compositionMode. It will be set to false.\n */\n _mouseDownHandler({ e, alreadySelected }: ObjectPointerEvents['mousedown']) {\n if (\n !this.canvas ||\n !this.editable ||\n notALeftClick(e) ||\n this.getActiveControl()\n ) {\n return;\n }\n\n if (this.draggableTextDelegate.start(e)) {\n return;\n }\n\n this.canvas.textEditingManager.register(this);\n\n if (alreadySelected) {\n this.inCompositionMode = false;\n this.setCursorByClick(e);\n }\n\n if (this.isEditing) {\n this.__selectionStartOnMouseDown = this.selectionStart;\n if (this.selectionStart === this.selectionEnd) {\n this.abortCursorAnimation();\n }\n this.renderCursorOrSelection();\n }\n this.selected ||= alreadySelected || this.isEditing;\n }\n\n /**\n * standard handler for mouse up, overridable\n * @private\n */\n mouseUpHandler({ e, transform }: ObjectPointerEvents['mouseup']) {\n const didDrag = this.draggableTextDelegate.end(e);\n\n if (this.canvas) {\n this.canvas.textEditingManager.unregister(this);\n\n const activeObject = this.canvas._activeObject;\n if (activeObject && activeObject !== this) {\n // avoid running this logic when there is an active object\n // this because is possible with shift click and fast clicks,\n // to rapidly deselect and reselect this object and trigger an enterEdit\n return;\n }\n }\n\n if (\n !this.editable ||\n (this.group && !this.group.interactive) ||\n (transform && transform.actionPerformed) ||\n notALeftClick(e) ||\n didDrag\n ) {\n return;\n }\n\n if (this.selected && !this.getActiveControl()) {\n this.enterEditing(e);\n if (this.selectionStart === this.selectionEnd) {\n this.initDelayedCursor(true);\n } else {\n this.renderCursorOrSelection();\n }\n }\n }\n\n /**\n * Changes cursor location in a text depending on passed pointer (x/y) object\n * @param {TPointerEvent} e Event object\n */\n setCursorByClick(e: TPointerEvent) {\n const newSelection = this.getSelectionStartFromPointer(e),\n start = this.selectionStart,\n end = this.selectionEnd;\n if (e.shiftKey) {\n this.setSelectionStartEndWithShift(start, end, newSelection);\n } else {\n this.selectionStart = newSelection;\n this.selectionEnd = newSelection;\n }\n if (this.isEditing) {\n this._fireSelectionChanged();\n this._updateTextarea();\n }\n }\n\n /**\n * Returns index of a character corresponding to where an object was clicked\n * @param {TPointerEvent} e Event object\n * @return {Number} Index of a character\n */\n getSelectionStartFromPointer(e: TPointerEvent): number {\n const mouseOffset = this.canvas!.getScenePoint(e)\n .transform(invertTransform(this.calcTransformMatrix()))\n .add(new Point(-this._getLeftOffset(), -this._getTopOffset()));\n let height = 0,\n charIndex = 0,\n lineIndex = 0;\n\n for (let i = 0; i < this._textLines.length; i++) {\n if (height <= mouseOffset.y) {\n height += this.getHeightOfLine(i);\n lineIndex = i;\n if (i > 0) {\n charIndex +=\n this._textLines[i - 1].length + this.missingNewlineOffset(i - 1);\n }\n } else {\n break;\n }\n }\n const lineLeftOffset = Math.abs(this._getLineLeftOffset(lineIndex));\n let width = lineLeftOffset;\n const charLength = this._textLines[lineIndex].length;\n const chars = this.__charBounds[lineIndex];\n for (let j = 0; j < charLength; j++) {\n // i removed something about flipX here, check.\n const charWidth = chars[j].kernedWidth;\n const widthAfter = width + charWidth;\n if (mouseOffset.x <= widthAfter) {\n // if the pointer is closer to the end of the char we increment charIndex\n // in order to position the cursor after the char\n if (\n Math.abs(mouseOffset.x - widthAfter) <=\n Math.abs(mouseOffset.x - width)\n ) {\n charIndex++;\n }\n break;\n }\n width = widthAfter;\n charIndex++;\n }\n\n return Math.min(\n // if object is horizontally flipped, mirror cursor location from the end\n this.flipX ? charLength - charIndex : charIndex,\n this._text.length,\n );\n }\n}\n","export type TKeyMapIText = Record<\n KeyboardEvent['keyCode'],\n CursorHandlingMethods\n>;\n\nexport type CursorHandlingMethods =\n | 'moveCursorUp'\n | 'moveCursorDown'\n | 'moveCursorLeft'\n | 'moveCursorRight'\n | 'exitEditing'\n | 'copy'\n | 'cut'\n | 'cmdAll';\n\nconst MOVE_CURSOR_UP: CursorHandlingMethods = 'moveCursorUp';\nconst MOVE_CURSOR_DOWN: CursorHandlingMethods = 'moveCursorDown';\nconst MOVE_CURSOR_LEFT: CursorHandlingMethods = 'moveCursorLeft';\nconst MOVE_CURSOR_RIGHT: CursorHandlingMethods = 'moveCursorRight';\nconst EXIT_EDITING: CursorHandlingMethods = 'exitEditing';\n\n// @TODO look into import { Key } from 'ts-key-enum';\n// and transition from keyCode to Key\n// also reduce string duplication\nexport const keysMap: TKeyMapIText = {\n 9: EXIT_EDITING,\n 27: EXIT_EDITING,\n 33: MOVE_CURSOR_UP,\n 34: MOVE_CURSOR_DOWN,\n 35: MOVE_CURSOR_RIGHT,\n 36: MOVE_CURSOR_LEFT,\n 37: MOVE_CURSOR_LEFT,\n 38: MOVE_CURSOR_UP,\n 39: MOVE_CURSOR_RIGHT,\n 40: MOVE_CURSOR_DOWN,\n};\n\nexport const keysMapRtl: TKeyMapIText = {\n 9: EXIT_EDITING,\n 27: EXIT_EDITING,\n 33: MOVE_CURSOR_UP,\n 34: MOVE_CURSOR_DOWN,\n 35: MOVE_CURSOR_LEFT,\n 36: MOVE_CURSOR_RIGHT,\n 37: MOVE_CURSOR_RIGHT,\n 38: MOVE_CURSOR_UP,\n 39: MOVE_CURSOR_LEFT,\n 40: MOVE_CURSOR_DOWN,\n};\n\n/**\n * For functionalities on keyUp + ctrl || cmd\n */\nexport const ctrlKeysMapUp: TKeyMapIText = {\n 67: 'copy',\n // there was a reason this wasn't deleted. for now leave it here\n 88: 'cut',\n};\n\n/**\n * For functionalities on keyDown + ctrl || cmd\n */\nexport const ctrlKeysMapDown: TKeyMapIText = {\n 65: 'cmdAll',\n};\n","import type { StaticCanvas } from '../../canvas/StaticCanvas';\n\n/**\n * Set the transform of the passed context to the same of a specific Canvas or StaticCanvas.\n * setTransform is used since this utility will RESET the ctx transform to the basic value\n * of retina scaling and viewport transform\n * It is not meant to be added to other transforms, it is used internally to preapre canvases to draw\n * @param ctx\n * @param canvas\n */\nexport const applyCanvasTransform = (\n ctx: CanvasRenderingContext2D,\n canvas: StaticCanvas,\n) => {\n const scale = canvas.getRetinaScaling();\n ctx.setTransform(scale, 0, 0, scale, 0, 0);\n const v = canvas.viewportTransform;\n ctx.transform(v[0], v[1], v[2], v[3], v[4], v[5]);\n};\n","import { Canvas } from '../../canvas/Canvas';\nimport type { ITextEvents } from './ITextBehavior';\nimport { ITextClickBehavior } from './ITextClickBehavior';\nimport {\n ctrlKeysMapDown,\n ctrlKeysMapUp,\n keysMap,\n keysMapRtl,\n} from './constants';\nimport type { TClassProperties, TFiller, TOptions } from '../../typedefs';\nimport { classRegistry } from '../../ClassRegistry';\nimport type { SerializedTextProps, TextProps } from '../Text/Text';\nimport {\n JUSTIFY,\n JUSTIFY_CENTER,\n JUSTIFY_LEFT,\n JUSTIFY_RIGHT,\n} from '../Text/constants';\nimport { CENTER, FILL, LEFT, RIGHT } from '../../constants';\nimport type { ObjectToCanvasElementOptions } from '../Object/Object';\nimport type { FabricObject } from '../Object/FabricObject';\nimport { createCanvasElementFor } from '../../util/misc/dom';\nimport { applyCanvasTransform } from '../../util/internals/applyCanvasTransform';\n\nexport type CursorBoundaries = {\n left: number;\n top: number;\n leftOffset: number;\n topOffset: number;\n};\n\nexport type CursorRenderingData = {\n color: string;\n opacity: number;\n left: number;\n top: number;\n width: number;\n height: number;\n};\n\n// Declare IText protected properties to workaround TS\nconst protectedDefaultValues = {\n _selectionDirection: null,\n _reSpace: /\\s|\\r?\\n/,\n inCompositionMode: false,\n};\n\nexport const iTextDefaultValues: Partial> = {\n selectionStart: 0,\n selectionEnd: 0,\n selectionColor: 'rgba(17,119,255,0.3)',\n isEditing: false,\n editable: true,\n editingBorderColor: 'rgba(102,153,255,0.25)',\n cursorWidth: 2,\n cursorColor: '',\n cursorDelay: 1000,\n cursorDuration: 600,\n caching: true,\n hiddenTextareaContainer: null,\n keysMap,\n keysMapRtl,\n ctrlKeysMapDown,\n ctrlKeysMapUp,\n ...protectedDefaultValues,\n};\n\n// @TODO this is not complete\ninterface UniqueITextProps {\n selectionStart: number;\n selectionEnd: number;\n}\n\nexport interface SerializedITextProps\n extends SerializedTextProps,\n UniqueITextProps {}\n\nexport interface ITextProps extends TextProps, UniqueITextProps {}\n\n/**\n * @fires changed\n * @fires selection:changed\n * @fires editing:entered\n * @fires editing:exited\n * @fires dragstart\n * @fires drag drag event firing on the drag source\n * @fires dragend\n * @fires copy\n * @fires cut\n * @fires paste\n *\n * #### Supported key combinations\n * ```\n * Move cursor: left, right, up, down\n * Select character: shift + left, shift + right\n * Select text vertically: shift + up, shift + down\n * Move cursor by word: alt + left, alt + right\n * Select words: shift + alt + left, shift + alt + right\n * Move cursor to line start/end: cmd + left, cmd + right or home, end\n * Select till start/end of line: cmd + shift + left, cmd + shift + right or shift + home, shift + end\n * Jump to start/end of text: cmd + up, cmd + down\n * Select till start/end of text: cmd + shift + up, cmd + shift + down or shift + pgUp, shift + pgDown\n * Delete character: backspace\n * Delete word: alt + backspace\n * Delete line: cmd + backspace\n * Forward delete: delete\n * Copy text: ctrl/cmd + c\n * Paste text: ctrl/cmd + v\n * Cut text: ctrl/cmd + x\n * Select entire text: ctrl/cmd + a\n * Quit editing tab or esc\n * ```\n *\n * #### Supported mouse/touch combination\n * ```\n * Position cursor: click/touch\n * Create selection: click/touch & drag\n * Create selection: click & shift + click\n * Select word: double click\n * Select line: triple click\n * ```\n */\nexport class IText<\n Props extends TOptions = Partial,\n SProps extends SerializedITextProps = SerializedITextProps,\n EventSpec extends ITextEvents = ITextEvents,\n >\n extends ITextClickBehavior\n implements UniqueITextProps\n{\n /**\n * Index where text selection starts (or where cursor is when there is no selection)\n * @type Number\n */\n declare selectionStart: number;\n\n /**\n * Index where text selection ends\n * @type Number\n */\n declare selectionEnd: number;\n\n declare compositionStart: number;\n\n declare compositionEnd: number;\n\n /**\n * Color of text selection\n * @type String\n */\n declare selectionColor: string;\n\n /**\n * Indicates whether text is in editing mode\n * @type Boolean\n */\n declare isEditing: boolean;\n\n /**\n * Indicates whether a text can be edited\n * @type Boolean\n */\n declare editable: boolean;\n\n /**\n * Border color of text object while it's in editing mode\n * @type String\n */\n declare editingBorderColor: string;\n\n /**\n * Width of cursor (in px)\n * @type Number\n */\n declare cursorWidth: number;\n\n /**\n * Color of text cursor color in editing mode.\n * if not set (default) will take color from the text.\n * if set to a color value that fabric can understand, it will\n * be used instead of the color of the text at the current position.\n * @type String\n */\n declare cursorColor: string;\n\n /**\n * Delay between cursor blink (in ms)\n * @type Number\n */\n declare cursorDelay: number;\n\n /**\n * Duration of cursor fade in (in ms)\n * @type Number\n */\n declare cursorDuration: number;\n\n declare compositionColor: string;\n\n /**\n * Indicates whether internal text char widths can be cached\n * @type Boolean\n */\n declare caching: boolean;\n\n static ownDefaults = iTextDefaultValues;\n\n static getDefaults(): Record {\n return { ...super.getDefaults(), ...IText.ownDefaults };\n }\n\n static type = 'IText';\n\n get type() {\n const type = super.type;\n // backward compatibility\n return type === 'itext' ? 'i-text' : type;\n }\n\n /**\n * Constructor\n * @param {String} text Text string\n * @param {Object} [options] Options object\n */\n constructor(text: string, options?: Props) {\n super(text, { ...IText.ownDefaults, ...options } as Props);\n this.initBehavior();\n }\n\n /**\n * While editing handle differently\n * @private\n * @param {string} key\n * @param {*} value\n */\n _set(key: string, value: any) {\n if (this.isEditing && this._savedProps && key in this._savedProps) {\n // @ts-expect-error irritating TS\n this._savedProps[key] = value;\n return this;\n }\n if (key === 'canvas') {\n this.canvas instanceof Canvas &&\n this.canvas.textEditingManager.remove(this);\n value instanceof Canvas && value.textEditingManager.add(this);\n }\n return super._set(key, value);\n }\n\n /**\n * Sets selection start (left boundary of a selection)\n * @param {Number} index Index to set selection start to\n */\n setSelectionStart(index: number) {\n index = Math.max(index, 0);\n this._updateAndFire('selectionStart', index);\n }\n\n /**\n * Sets selection end (right boundary of a selection)\n * @param {Number} index Index to set selection end to\n */\n setSelectionEnd(index: number) {\n index = Math.min(index, this.text.length);\n this._updateAndFire('selectionEnd', index);\n }\n\n /**\n * @private\n * @param {String} property 'selectionStart' or 'selectionEnd'\n * @param {Number} index new position of property\n */\n protected _updateAndFire(\n property: 'selectionStart' | 'selectionEnd',\n index: number,\n ) {\n if (this[property] !== index) {\n this._fireSelectionChanged();\n this[property] = index;\n }\n this._updateTextarea();\n }\n\n /**\n * Fires the even of selection changed\n * @private\n */\n _fireSelectionChanged() {\n this.fire('selection:changed');\n this.canvas && this.canvas.fire('text:selection:changed', { target: this });\n }\n\n /**\n * Initialize text dimensions. Render all text on given context\n * or on a offscreen canvas to get the text width with measureText.\n * Updates this.width and this.height with the proper values.\n * Does not return dimensions.\n * @private\n */\n initDimensions() {\n this.isEditing && this.initDelayedCursor();\n super.initDimensions();\n }\n\n /**\n * Gets style of a current selection/cursor (at the start position)\n * if startIndex or endIndex are not provided, selectionStart or selectionEnd will be used.\n * @param {Number} startIndex Start index to get styles at\n * @param {Number} endIndex End index to get styles at, if not specified selectionEnd or startIndex + 1\n * @param {Boolean} [complete] get full style or not\n * @return {Array} styles an array with one, zero or more Style objects\n */\n getSelectionStyles(\n startIndex: number = this.selectionStart || 0,\n endIndex: number = this.selectionEnd,\n complete?: boolean,\n ) {\n return super.getSelectionStyles(startIndex, endIndex, complete);\n }\n\n /**\n * Sets style of a current selection, if no selection exist, do not set anything.\n * @param {Object} [styles] Styles object\n * @param {Number} [startIndex] Start index to get styles at\n * @param {Number} [endIndex] End index to get styles at, if not specified selectionEnd or startIndex + 1\n */\n setSelectionStyles(\n styles: object,\n startIndex: number = this.selectionStart || 0,\n endIndex: number = this.selectionEnd,\n ) {\n return super.setSelectionStyles(styles, startIndex, endIndex);\n }\n\n /**\n * Returns 2d representation (lineIndex and charIndex) of cursor (or selection start)\n * @param {Number} [selectionStart] Optional index. When not given, current selectionStart is used.\n * @param {Boolean} [skipWrapping] consider the location for unwrapped lines. useful to manage styles.\n */\n get2DCursorLocation(\n selectionStart = this.selectionStart,\n skipWrapping?: boolean,\n ) {\n return super.get2DCursorLocation(selectionStart, skipWrapping);\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n render(ctx: CanvasRenderingContext2D) {\n super.render(ctx);\n // clear the cursorOffsetCache, so we ensure to calculate once per renderCursor\n // the correct position but not at every cursor animation.\n this.cursorOffsetCache = {};\n this.renderCursorOrSelection();\n }\n\n /**\n * @override block cursor/selection logic while rendering the exported canvas\n * @todo this workaround should be replaced with a more robust solution\n */\n toCanvasElement(options?: ObjectToCanvasElementOptions): HTMLCanvasElement {\n const isEditing = this.isEditing;\n this.isEditing = false;\n const canvas = super.toCanvasElement(options);\n this.isEditing = isEditing;\n return canvas;\n }\n\n /**\n * Renders cursor or selection (depending on what exists)\n * it does on the contextTop. If contextTop is not available, do nothing.\n */\n renderCursorOrSelection() {\n if (!this.isEditing || !this.canvas) {\n return;\n }\n const ctx = this.clearContextTop(true);\n if (!ctx) {\n return;\n }\n const boundaries = this._getCursorBoundaries();\n\n const ancestors = this.findAncestorsWithClipPath();\n const hasAncestorsWithClipping = ancestors.length > 0;\n let drawingCtx: CanvasRenderingContext2D = ctx;\n let drawingCanvas: HTMLCanvasElement | undefined = undefined;\n if (hasAncestorsWithClipping) {\n // we have some clipPath, we need to draw the selection on an intermediate layer.\n drawingCanvas = createCanvasElementFor(ctx.canvas);\n drawingCtx = drawingCanvas.getContext('2d')!;\n applyCanvasTransform(drawingCtx, this.canvas);\n const m = this.calcTransformMatrix();\n drawingCtx.transform(m[0], m[1], m[2], m[3], m[4], m[5]);\n }\n\n if (this.selectionStart === this.selectionEnd && !this.inCompositionMode) {\n this.renderCursor(drawingCtx, boundaries);\n } else {\n this.renderSelection(drawingCtx, boundaries);\n }\n\n if (hasAncestorsWithClipping) {\n // we need a neutral context.\n // this won't work for nested clippaths in which a clippath\n // has its own clippath\n for (const ancestor of ancestors) {\n const clipPath = ancestor.clipPath!;\n const clippingCanvas = createCanvasElementFor(ctx.canvas);\n const clippingCtx = clippingCanvas.getContext('2d')!;\n applyCanvasTransform(clippingCtx, this.canvas);\n // position the ctx in the center of the outer ancestor\n if (!clipPath.absolutePositioned) {\n const m = ancestor.calcTransformMatrix();\n clippingCtx.transform(m[0], m[1], m[2], m[3], m[4], m[5]);\n }\n clipPath.transform(clippingCtx);\n // we assign an empty drawing context, we don't plan to have this working for nested clippaths for now\n clipPath.drawObject(clippingCtx, true, {});\n this.drawClipPathOnCache(drawingCtx, clipPath, clippingCanvas);\n }\n }\n\n if (hasAncestorsWithClipping) {\n ctx.setTransform(1, 0, 0, 1, 0, 0);\n ctx.drawImage(drawingCanvas!, 0, 0);\n }\n\n this.canvas.contextTopDirty = true;\n ctx.restore();\n }\n\n /**\n * Finds and returns an array of clip paths that are applied to the parent\n * group(s) of the current FabricObject instance. The object's hierarchy is\n * traversed upwards (from the current object towards the root of the canvas),\n * checking each parent object for the presence of a `clipPath` that is not\n * absolutely positioned.\n */\n findAncestorsWithClipPath(): FabricObject[] {\n const clipPathAncestors: FabricObject[] = [];\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n let obj: FabricObject | undefined = this;\n while (obj) {\n if (obj.clipPath) {\n clipPathAncestors.push(obj);\n }\n obj = obj.parent;\n }\n\n return clipPathAncestors;\n }\n\n /**\n * Returns cursor boundaries (left, top, leftOffset, topOffset)\n * left/top are left/top of entire text box\n * leftOffset/topOffset are offset from that left/top point of a text box\n * @private\n * @param {number} [index] index from start\n * @param {boolean} [skipCaching]\n */\n _getCursorBoundaries(\n index: number = this.selectionStart,\n skipCaching?: boolean,\n ): CursorBoundaries {\n const left = this._getLeftOffset(),\n top = this._getTopOffset(),\n offsets = this._getCursorBoundariesOffsets(index, skipCaching);\n return {\n left: left,\n top: top,\n leftOffset: offsets.left,\n topOffset: offsets.top,\n };\n }\n\n /**\n * Caches and returns cursor left/top offset relative to instance's center point\n * @private\n * @param {number} index index from start\n * @param {boolean} [skipCaching]\n */\n _getCursorBoundariesOffsets(\n index: number,\n skipCaching?: boolean,\n ): { left: number; top: number } {\n if (skipCaching) {\n return this.__getCursorBoundariesOffsets(index);\n }\n if (this.cursorOffsetCache && 'top' in this.cursorOffsetCache) {\n return this.cursorOffsetCache as { left: number; top: number };\n }\n return (this.cursorOffsetCache = this.__getCursorBoundariesOffsets(index));\n }\n\n /**\n * Calculates cursor left/top offset relative to instance's center point\n * @private\n * @param {number} index index from start\n */\n __getCursorBoundariesOffsets(index: number) {\n let topOffset = 0,\n leftOffset = 0;\n const { charIndex, lineIndex } = this.get2DCursorLocation(index);\n\n for (let i = 0; i < lineIndex; i++) {\n topOffset += this.getHeightOfLine(i);\n }\n const lineLeftOffset = this._getLineLeftOffset(lineIndex);\n const bound = this.__charBounds[lineIndex][charIndex];\n bound && (leftOffset = bound.left);\n if (\n this.charSpacing !== 0 &&\n charIndex === this._textLines[lineIndex].length\n ) {\n leftOffset -= this._getWidthOfCharSpacing();\n }\n const boundaries = {\n top: topOffset,\n left: lineLeftOffset + (leftOffset > 0 ? leftOffset : 0),\n };\n if (this.direction === 'rtl') {\n if (\n this.textAlign === RIGHT ||\n this.textAlign === JUSTIFY ||\n this.textAlign === JUSTIFY_RIGHT\n ) {\n boundaries.left *= -1;\n } else if (this.textAlign === LEFT || this.textAlign === JUSTIFY_LEFT) {\n boundaries.left = lineLeftOffset - (leftOffset > 0 ? leftOffset : 0);\n } else if (\n this.textAlign === CENTER ||\n this.textAlign === JUSTIFY_CENTER\n ) {\n boundaries.left = lineLeftOffset - (leftOffset > 0 ? leftOffset : 0);\n }\n }\n return boundaries;\n }\n\n /**\n * Renders cursor on context Top, outside the animation cycle, on request\n * Used for the drag/drop effect.\n * If contextTop is not available, do nothing.\n */\n renderCursorAt(selectionStart: number) {\n this._renderCursor(\n this.canvas!.contextTop,\n this._getCursorBoundaries(selectionStart, true),\n selectionStart,\n );\n }\n\n /**\n * Renders cursor\n * @param {Object} boundaries\n * @param {CanvasRenderingContext2D} ctx transformed context to draw on\n */\n renderCursor(ctx: CanvasRenderingContext2D, boundaries: CursorBoundaries) {\n this._renderCursor(ctx, boundaries, this.selectionStart);\n }\n\n /**\n * Return the data needed to render the cursor for given selection start\n * The left,top are relative to the object, while width and height are prescaled\n * to look think with canvas zoom and object scaling,\n * so they depend on canvas and object scaling\n */\n getCursorRenderingData(\n selectionStart: number = this.selectionStart,\n boundaries: CursorBoundaries = this._getCursorBoundaries(selectionStart),\n ): CursorRenderingData {\n const cursorLocation = this.get2DCursorLocation(selectionStart),\n lineIndex = cursorLocation.lineIndex,\n charIndex =\n cursorLocation.charIndex > 0 ? cursorLocation.charIndex - 1 : 0,\n charHeight = this.getValueOfPropertyAt(lineIndex, charIndex, 'fontSize'),\n multiplier = this.getObjectScaling().x * this.canvas!.getZoom(),\n cursorWidth = this.cursorWidth / multiplier,\n dy = this.getValueOfPropertyAt(lineIndex, charIndex, 'deltaY'),\n topOffset =\n boundaries.topOffset +\n ((1 - this._fontSizeFraction) * this.getHeightOfLine(lineIndex)) /\n this.lineHeight -\n charHeight * (1 - this._fontSizeFraction);\n\n return {\n color:\n this.cursorColor ||\n (this.getValueOfPropertyAt(lineIndex, charIndex, 'fill') as string),\n opacity: this._currentCursorOpacity,\n left: boundaries.left + boundaries.leftOffset - cursorWidth / 2,\n top: topOffset + boundaries.top + dy,\n width: cursorWidth,\n height: charHeight,\n };\n }\n\n /**\n * Render the cursor at the given selectionStart.\n * @param {CanvasRenderingContext2D} ctx transformed context to draw on\n */\n _renderCursor(\n ctx: CanvasRenderingContext2D,\n boundaries: CursorBoundaries,\n selectionStart: number,\n ) {\n const { color, opacity, left, top, width, height } =\n this.getCursorRenderingData(selectionStart, boundaries);\n ctx.fillStyle = color;\n ctx.globalAlpha = opacity;\n ctx.fillRect(left, top, width, height);\n }\n\n /**\n * Renders text selection\n * @param {Object} boundaries Object with left/top/leftOffset/topOffset\n * @param {CanvasRenderingContext2D} ctx transformed context to draw on\n */\n renderSelection(ctx: CanvasRenderingContext2D, boundaries: CursorBoundaries) {\n const selection = {\n selectionStart: this.inCompositionMode\n ? this.hiddenTextarea!.selectionStart\n : this.selectionStart,\n selectionEnd: this.inCompositionMode\n ? this.hiddenTextarea!.selectionEnd\n : this.selectionEnd,\n };\n this._renderSelection(ctx, selection, boundaries);\n }\n\n /**\n * Renders drag start text selection\n */\n renderDragSourceEffect() {\n const dragStartSelection =\n this.draggableTextDelegate.getDragStartSelection()!;\n this._renderSelection(\n this.canvas!.contextTop,\n dragStartSelection,\n this._getCursorBoundaries(dragStartSelection.selectionStart, true),\n );\n }\n\n renderDropTargetEffect(e: DragEvent) {\n const dragSelection = this.getSelectionStartFromPointer(e);\n this.renderCursorAt(dragSelection);\n }\n\n /**\n * Renders text selection\n * @private\n * @param {{ selectionStart: number, selectionEnd: number }} selection\n * @param {Object} boundaries Object with left/top/leftOffset/topOffset\n * @param {CanvasRenderingContext2D} ctx transformed context to draw on\n */\n _renderSelection(\n ctx: CanvasRenderingContext2D,\n selection: { selectionStart: number; selectionEnd: number },\n boundaries: CursorBoundaries,\n ) {\n const selectionStart = selection.selectionStart,\n selectionEnd = selection.selectionEnd,\n isJustify = this.textAlign.includes(JUSTIFY),\n start = this.get2DCursorLocation(selectionStart),\n end = this.get2DCursorLocation(selectionEnd),\n startLine = start.lineIndex,\n endLine = end.lineIndex,\n startChar = start.charIndex < 0 ? 0 : start.charIndex,\n endChar = end.charIndex < 0 ? 0 : end.charIndex;\n\n for (let i = startLine; i <= endLine; i++) {\n const lineOffset = this._getLineLeftOffset(i) || 0;\n let lineHeight = this.getHeightOfLine(i),\n realLineHeight = 0,\n boxStart = 0,\n boxEnd = 0;\n\n if (i === startLine) {\n boxStart = this.__charBounds[startLine][startChar].left;\n }\n if (i >= startLine && i < endLine) {\n boxEnd =\n isJustify && !this.isEndOfWrapping(i)\n ? this.width\n : this.getLineWidth(i) || 5; // WTF is this 5?\n } else if (i === endLine) {\n if (endChar === 0) {\n boxEnd = this.__charBounds[endLine][endChar].left;\n } else {\n const charSpacing = this._getWidthOfCharSpacing();\n boxEnd =\n this.__charBounds[endLine][endChar - 1].left +\n this.__charBounds[endLine][endChar - 1].width -\n charSpacing;\n }\n }\n realLineHeight = lineHeight;\n if (this.lineHeight < 1 || (i === endLine && this.lineHeight > 1)) {\n lineHeight /= this.lineHeight;\n }\n let drawStart = boundaries.left + lineOffset + boxStart,\n drawHeight = lineHeight,\n extraTop = 0;\n const drawWidth = boxEnd - boxStart;\n if (this.inCompositionMode) {\n ctx.fillStyle = this.compositionColor || 'black';\n drawHeight = 1;\n extraTop = lineHeight;\n } else {\n ctx.fillStyle = this.selectionColor;\n }\n if (this.direction === 'rtl') {\n if (\n this.textAlign === RIGHT ||\n this.textAlign === JUSTIFY ||\n this.textAlign === JUSTIFY_RIGHT\n ) {\n drawStart = this.width - drawStart - drawWidth;\n } else if (this.textAlign === LEFT || this.textAlign === JUSTIFY_LEFT) {\n drawStart = boundaries.left + lineOffset - boxEnd;\n } else if (\n this.textAlign === CENTER ||\n this.textAlign === JUSTIFY_CENTER\n ) {\n drawStart = boundaries.left + lineOffset - boxEnd;\n }\n }\n ctx.fillRect(\n drawStart,\n boundaries.top + boundaries.topOffset + extraTop,\n drawWidth,\n drawHeight,\n );\n boundaries.topOffset += realLineHeight;\n }\n }\n\n /**\n * High level function to know the height of the cursor.\n * the currentChar is the one that precedes the cursor\n * Returns fontSize of char at the current cursor\n * Unused from the library, is for the end user\n * @return {Number} Character font size\n */\n getCurrentCharFontSize(): number {\n const cp = this._getCurrentCharIndex();\n return this.getValueOfPropertyAt(cp.l, cp.c, 'fontSize');\n }\n\n /**\n * High level function to know the color of the cursor.\n * the currentChar is the one that precedes the cursor\n * Returns color (fill) of char at the current cursor\n * if the text object has a pattern or gradient for filler, it will return that.\n * Unused by the library, is for the end user\n * @return {String | TFiller} Character color (fill)\n */\n getCurrentCharColor(): string | TFiller | null {\n const cp = this._getCurrentCharIndex();\n return this.getValueOfPropertyAt(cp.l, cp.c, FILL);\n }\n\n /**\n * Returns the cursor position for the getCurrent.. functions\n * @private\n */\n _getCurrentCharIndex() {\n const cursorPosition = this.get2DCursorLocation(this.selectionStart, true),\n charIndex =\n cursorPosition.charIndex > 0 ? cursorPosition.charIndex - 1 : 0;\n return { l: cursorPosition.lineIndex, c: charIndex };\n }\n\n dispose() {\n this.exitEditingImpl();\n this.draggableTextDelegate.dispose();\n super.dispose();\n }\n}\n\nclassRegistry.setClass(IText);\n// legacy\nclassRegistry.setClass(IText, 'i-text');\n","import type { TClassProperties, TOptions } from '../typedefs';\nimport { IText } from './IText/IText';\nimport { classRegistry } from '../ClassRegistry';\nimport { createTextboxDefaultControls } from '../controls/commonControls';\nimport { JUSTIFY } from './Text/constants';\nimport type { TextStyleDeclaration } from './Text/StyledText';\nimport type { SerializedITextProps, ITextProps } from './IText/IText';\nimport type { ITextEvents } from './IText/ITextBehavior';\nimport type { TextLinesInfo } from './Text/Text';\nimport type { Control } from '../controls/Control';\n\n// @TODO: Many things here are configuration related and shouldn't be on the class nor prototype\n// regexes, list of properties that are not suppose to change by instances, magic consts.\n// this will be a separated effort\nexport const textboxDefaultValues: Partial> = {\n minWidth: 20,\n dynamicMinWidth: 2,\n lockScalingFlip: true,\n noScaleCache: false,\n _wordJoiners: /[ \\t\\r]/,\n splitByGrapheme: false,\n};\n\nexport type GraphemeData = {\n wordsData: {\n word: string[];\n width: number;\n }[][];\n largestWordWidth: number;\n};\n\nexport type StyleMap = Record;\n\n// @TODO this is not complete\ninterface UniqueTextboxProps {\n minWidth: number;\n splitByGrapheme: boolean;\n dynamicMinWidth: number;\n _wordJoiners: RegExp;\n}\n\nexport interface SerializedTextboxProps\n extends SerializedITextProps,\n Pick {}\n\nexport interface TextboxProps extends ITextProps, UniqueTextboxProps {}\n\n/**\n * Textbox class, based on IText, allows the user to resize the text rectangle\n * and wraps lines automatically. Textboxes have their Y scaling locked, the\n * user can only change width. Height is adjusted automatically based on the\n * wrapping of lines.\n */\nexport class Textbox<\n Props extends TOptions = Partial,\n SProps extends SerializedTextboxProps = SerializedTextboxProps,\n EventSpec extends ITextEvents = ITextEvents,\n >\n extends IText\n implements UniqueTextboxProps\n{\n /**\n * Minimum width of textbox, in pixels.\n * @type Number\n */\n declare minWidth: number;\n\n /**\n * Minimum calculated width of a textbox, in pixels.\n * fixed to 2 so that an empty textbox cannot go to 0\n * and is still selectable without text.\n * @type Number\n */\n declare dynamicMinWidth: number;\n\n /**\n * Use this boolean property in order to split strings that have no white space concept.\n * this is a cheap way to help with chinese/japanese\n * @type Boolean\n * @since 2.6.0\n */\n declare splitByGrapheme: boolean;\n\n declare _wordJoiners: RegExp;\n\n declare _styleMap: StyleMap;\n\n declare isWrapping: boolean;\n\n static type = 'Textbox';\n\n static textLayoutProperties = [...IText.textLayoutProperties, 'width'];\n\n static ownDefaults = textboxDefaultValues;\n\n static getDefaults(): Record {\n return {\n ...super.getDefaults(),\n ...Textbox.ownDefaults,\n };\n }\n\n /**\n * Constructor\n * @param {String} text Text string\n * @param {Object} [options] Options object\n */\n constructor(text: string, options?: Props) {\n super(text, { ...Textbox.ownDefaults, ...options } as Props);\n }\n\n /**\n * Creates the default control object.\n * If you prefer to have on instance of controls shared among all objects\n * make this function return an empty object and add controls to the ownDefaults object\n */\n static createControls(): { controls: Record } {\n return { controls: createTextboxDefaultControls() };\n }\n\n /**\n * Unlike superclass's version of this function, Textbox does not update\n * its width.\n * @private\n * @override\n */\n initDimensions() {\n if (!this.initialized) {\n return;\n }\n this.isEditing && this.initDelayedCursor();\n this._clearCache();\n // clear dynamicMinWidth as it will be different after we re-wrap line\n this.dynamicMinWidth = 0;\n // wrap lines\n this._styleMap = this._generateStyleMap(this._splitText());\n // if after wrapping, the width is smaller than dynamicMinWidth, change the width and re-wrap\n if (this.dynamicMinWidth > this.width) {\n this._set('width', this.dynamicMinWidth);\n }\n if (this.textAlign.includes(JUSTIFY)) {\n // once text is measured we need to make space fatter to make justified text.\n this.enlargeSpaces();\n }\n // clear cache and re-calculate height\n this.height = this.calcTextHeight();\n }\n\n /**\n * Generate an object that translates the style object so that it is\n * broken up by visual lines (new lines and automatic wrapping).\n * The original text styles object is broken up by actual lines (new lines only),\n * which is only sufficient for Text / IText\n * @private\n */\n _generateStyleMap(textInfo: TextLinesInfo): StyleMap {\n let realLineCount = 0,\n realLineCharCount = 0,\n charCount = 0;\n const map: StyleMap = {};\n\n for (let i = 0; i < textInfo.graphemeLines.length; i++) {\n if (textInfo.graphemeText[charCount] === '\\n' && i > 0) {\n realLineCharCount = 0;\n charCount++;\n realLineCount++;\n } else if (\n !this.splitByGrapheme &&\n this._reSpaceAndTab.test(textInfo.graphemeText[charCount]) &&\n i > 0\n ) {\n // this case deals with space's that are removed from end of lines when wrapping\n realLineCharCount++;\n charCount++;\n }\n\n map[i] = { line: realLineCount, offset: realLineCharCount };\n\n charCount += textInfo.graphemeLines[i].length;\n realLineCharCount += textInfo.graphemeLines[i].length;\n }\n\n return map;\n }\n\n /**\n * Returns true if object has a style property or has it on a specified line\n * @param {Number} lineIndex\n * @return {Boolean}\n */\n styleHas(property: keyof TextStyleDeclaration, lineIndex: number): boolean {\n if (this._styleMap && !this.isWrapping) {\n const map = this._styleMap[lineIndex];\n if (map) {\n lineIndex = map.line;\n }\n }\n return super.styleHas(property, lineIndex);\n }\n\n /**\n * Returns true if object has no styling or no styling in a line\n * @param {Number} lineIndex , lineIndex is on wrapped lines.\n * @return {Boolean}\n */\n isEmptyStyles(lineIndex: number): boolean {\n if (!this.styles) {\n return true;\n }\n let offset = 0,\n nextLineIndex = lineIndex + 1,\n nextOffset: number,\n shouldLimit = false;\n const map = this._styleMap[lineIndex],\n mapNextLine = this._styleMap[lineIndex + 1];\n if (map) {\n lineIndex = map.line;\n offset = map.offset;\n }\n if (mapNextLine) {\n nextLineIndex = mapNextLine.line;\n shouldLimit = nextLineIndex === lineIndex;\n nextOffset = mapNextLine.offset;\n }\n const obj =\n typeof lineIndex === 'undefined'\n ? this.styles\n : { line: this.styles[lineIndex] };\n for (const p1 in obj) {\n for (const p2 in obj[p1]) {\n const p2Number = parseInt(p2, 10);\n if (p2Number >= offset && (!shouldLimit || p2Number < nextOffset!)) {\n for (const p3 in obj[p1][p2]) {\n return false;\n }\n }\n }\n }\n return true;\n }\n\n /**\n * @protected\n * @param {Number} lineIndex\n * @param {Number} charIndex\n * @return {TextStyleDeclaration} a style object reference to the existing one or a new empty object when undefined\n */\n _getStyleDeclaration(\n lineIndex: number,\n charIndex: number,\n ): TextStyleDeclaration {\n if (this._styleMap && !this.isWrapping) {\n const map = this._styleMap[lineIndex];\n if (!map) {\n return {};\n }\n lineIndex = map.line;\n charIndex = map.offset + charIndex;\n }\n return super._getStyleDeclaration(lineIndex, charIndex);\n }\n\n /**\n * @param {Number} lineIndex\n * @param {Number} charIndex\n * @param {Object} style\n * @private\n */\n protected _setStyleDeclaration(\n lineIndex: number,\n charIndex: number,\n style: object,\n ) {\n const map = this._styleMap[lineIndex];\n super._setStyleDeclaration(map.line, map.offset + charIndex, style);\n }\n\n /**\n * @param {Number} lineIndex\n * @param {Number} charIndex\n * @private\n */\n protected _deleteStyleDeclaration(lineIndex: number, charIndex: number) {\n const map = this._styleMap[lineIndex];\n super._deleteStyleDeclaration(map.line, map.offset + charIndex);\n }\n\n /**\n * probably broken need a fix\n * Returns the real style line that correspond to the wrapped lineIndex line\n * Used just to verify if the line does exist or not.\n * @param {Number} lineIndex\n * @returns {Boolean} if the line exists or not\n * @private\n */\n protected _getLineStyle(lineIndex: number): boolean {\n const map = this._styleMap[lineIndex];\n return !!this.styles[map.line];\n }\n\n /**\n * Set the line style to an empty object so that is initialized\n * @param {Number} lineIndex\n * @param {Object} style\n * @private\n */\n protected _setLineStyle(lineIndex: number) {\n const map = this._styleMap[lineIndex];\n super._setLineStyle(map.line);\n }\n\n /**\n * Wraps text using the 'width' property of Textbox. First this function\n * splits text on newlines, so we preserve newlines entered by the user.\n * Then it wraps each line using the width of the Textbox by calling\n * _wrapLine().\n * @param {Array} lines The string array of text that is split into lines\n * @param {Number} desiredWidth width you want to wrap to\n * @returns {Array} Array of lines\n */\n _wrapText(lines: string[], desiredWidth: number): string[][] {\n this.isWrapping = true;\n // extract all thewords and the widths to optimally wrap lines.\n const data = this.getGraphemeDataForRender(lines);\n const wrapped: string[][] = [];\n for (let i = 0; i < data.wordsData.length; i++) {\n wrapped.push(...this._wrapLine(i, desiredWidth, data));\n }\n this.isWrapping = false;\n return wrapped;\n }\n\n /**\n * For each line of text terminated by an hard line stop,\n * measure each word width and extract the largest word from all.\n * The returned words here are the one that at the end will be rendered.\n * @param {string[]} lines the lines we need to measure\n *\n */\n getGraphemeDataForRender(lines: string[]): GraphemeData {\n const splitByGrapheme = this.splitByGrapheme,\n infix = splitByGrapheme ? '' : ' ';\n\n let largestWordWidth = 0;\n\n const data = lines.map((line, lineIndex) => {\n let offset = 0;\n const wordsOrGraphemes = splitByGrapheme\n ? this.graphemeSplit(line)\n : this.wordSplit(line);\n\n if (wordsOrGraphemes.length === 0) {\n return [{ word: [], width: 0 }];\n }\n\n return wordsOrGraphemes.map((word: string) => {\n // if using splitByGrapheme words are already in graphemes.\n const graphemeArray = splitByGrapheme\n ? [word]\n : this.graphemeSplit(word);\n const width = this._measureWord(graphemeArray, lineIndex, offset);\n largestWordWidth = Math.max(width, largestWordWidth);\n offset += graphemeArray.length + infix.length;\n return { word: graphemeArray, width };\n });\n });\n\n return {\n wordsData: data,\n largestWordWidth,\n };\n }\n\n /**\n * Helper function to measure a string of text, given its lineIndex and charIndex offset\n * It gets called when charBounds are not available yet.\n * Override if necessary\n * Use with {@link Textbox#wordSplit}\n *\n * @param {CanvasRenderingContext2D} ctx\n * @param {String} text\n * @param {number} lineIndex\n * @param {number} charOffset\n * @returns {number}\n */\n _measureWord(word: string[], lineIndex: number, charOffset = 0): number {\n let width = 0,\n prevGrapheme;\n const skipLeft = true;\n for (let i = 0, len = word.length; i < len; i++) {\n const box = this._getGraphemeBox(\n word[i],\n lineIndex,\n i + charOffset,\n prevGrapheme,\n skipLeft,\n );\n width += box.kernedWidth;\n prevGrapheme = word[i];\n }\n return width;\n }\n\n /**\n * Override this method to customize word splitting\n * Use with {@link Textbox#_measureWord}\n * @param {string} value\n * @returns {string[]} array of words\n */\n wordSplit(value: string): string[] {\n return value.split(this._wordJoiners);\n }\n\n /**\n * Wraps a line of text using the width of the Textbox as desiredWidth\n * and leveraging the known width o words from GraphemeData\n * @private\n * @param {Number} lineIndex\n * @param {Number} desiredWidth width you want to wrap the line to\n * @param {GraphemeData} graphemeData an object containing all the lines' words width.\n * @param {Number} reservedSpace space to remove from wrapping for custom functionalities\n * @returns {Array} Array of line(s) into which the given text is wrapped\n * to.\n */\n _wrapLine(\n lineIndex: number,\n desiredWidth: number,\n { largestWordWidth, wordsData }: GraphemeData,\n reservedSpace = 0,\n ): string[][] {\n const additionalSpace = this._getWidthOfCharSpacing(),\n splitByGrapheme = this.splitByGrapheme,\n graphemeLines = [],\n infix = splitByGrapheme ? '' : ' ';\n\n let lineWidth = 0,\n line: string[] = [],\n // spaces in different languages?\n offset = 0,\n infixWidth = 0,\n lineJustStarted = true;\n\n desiredWidth -= reservedSpace;\n\n const maxWidth = Math.max(\n desiredWidth,\n largestWordWidth,\n this.dynamicMinWidth,\n );\n // layout words\n const data = wordsData[lineIndex];\n offset = 0;\n let i;\n for (i = 0; i < data.length; i++) {\n const { word, width: wordWidth } = data[i];\n offset += word.length;\n\n lineWidth += infixWidth + wordWidth - additionalSpace;\n if (lineWidth > maxWidth && !lineJustStarted) {\n graphemeLines.push(line);\n line = [];\n lineWidth = wordWidth;\n lineJustStarted = true;\n } else {\n lineWidth += additionalSpace;\n }\n\n if (!lineJustStarted && !splitByGrapheme) {\n line.push(infix);\n }\n line = line.concat(word);\n\n infixWidth = splitByGrapheme\n ? 0\n : this._measureWord([infix], lineIndex, offset);\n offset++;\n lineJustStarted = false;\n }\n\n i && graphemeLines.push(line);\n\n // TODO: this code is probably not necessary anymore.\n // it can be moved out of this function since largestWordWidth is now\n // known in advance\n if (largestWordWidth + reservedSpace > this.dynamicMinWidth) {\n this.dynamicMinWidth = largestWordWidth - additionalSpace + reservedSpace;\n }\n return graphemeLines;\n }\n\n /**\n * Detect if the text line is ended with an hard break\n * text and itext do not have wrapping, return false\n * @param {Number} lineIndex text to split\n * @return {Boolean}\n */\n isEndOfWrapping(lineIndex: number): boolean {\n if (!this._styleMap[lineIndex + 1]) {\n // is last line, return true;\n return true;\n }\n if (this._styleMap[lineIndex + 1].line !== this._styleMap[lineIndex].line) {\n // this is last line before a line break, return true;\n return true;\n }\n return false;\n }\n\n /**\n * Detect if a line has a linebreak and so we need to account for it when moving\n * and counting style.\n * This is important only for splitByGrapheme at the end of wrapping.\n * If we are not wrapping the offset is always 1\n * @return Number\n */\n missingNewlineOffset(lineIndex: number, skipWrapping?: boolean): 0 | 1 {\n if (this.splitByGrapheme && !skipWrapping) {\n return this.isEndOfWrapping(lineIndex) ? 1 : 0;\n }\n return 1;\n }\n\n /**\n * Gets lines of text to render in the Textbox. This function calculates\n * text wrapping on the fly every time it is called.\n * @param {String} text text to split\n * @returns {Array} Array of lines in the Textbox.\n * @override\n */\n _splitTextIntoLines(text: string) {\n const newText = super._splitTextIntoLines(text),\n graphemeLines = this._wrapText(newText.lines, this.width),\n lines = new Array(graphemeLines.length);\n for (let i = 0; i < graphemeLines.length; i++) {\n lines[i] = graphemeLines[i].join('');\n }\n newText.lines = lines;\n newText.graphemeLines = graphemeLines;\n return newText;\n }\n\n getMinWidth() {\n return Math.max(this.minWidth, this.dynamicMinWidth);\n }\n\n _removeExtraneousStyles() {\n const linesToKeep = new Map();\n for (const prop in this._styleMap) {\n const propNumber = parseInt(prop, 10);\n if (this._textLines[propNumber]) {\n const lineIndex = this._styleMap[prop].line;\n linesToKeep.set(`${lineIndex}`, true);\n }\n }\n for (const prop in this.styles) {\n if (!linesToKeep.has(prop)) {\n delete this.styles[prop];\n }\n }\n }\n\n /**\n * Returns object representation of an instance\n * @method toObject\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} object representation of an instance\n */\n toObject<\n T extends Omit, keyof SProps>,\n K extends keyof T = never,\n >(propertiesToInclude: K[] = []): Pick & SProps {\n return super.toObject([\n 'minWidth',\n 'splitByGrapheme',\n ...propertiesToInclude,\n ] as K[]);\n }\n}\n\nclassRegistry.setClass(Textbox);\n","import { Point } from '../../Point';\nimport type { FabricObject } from '../../shapes/Object/FabricObject';\nimport { makeBoundingBoxFromPoints } from '../../util/misc/boundingBoxFromPoints';\nimport { sendPointToPlane } from '../../util/misc/planeChange';\nimport type { LayoutStrategyResult, StrictLayoutContext } from '../types';\nimport { LayoutStrategy } from './LayoutStrategy';\nimport { getObjectBounds } from './utils';\nimport { classRegistry } from '../../ClassRegistry';\n\n/**\n * Layout will adjust the bounding box to match the clip path bounding box.\n */\nexport class ClipPathLayout extends LayoutStrategy {\n static readonly type = 'clip-path';\n\n shouldPerformLayout(context: StrictLayoutContext): boolean {\n return !!context.target.clipPath && super.shouldPerformLayout(context);\n }\n\n shouldLayoutClipPath() {\n return false;\n }\n\n calcLayoutResult(\n context: StrictLayoutContext,\n objects: FabricObject[],\n ): LayoutStrategyResult | undefined {\n const { target } = context;\n const { clipPath, group } = target;\n if (!clipPath || !this.shouldPerformLayout(context)) {\n return;\n }\n // TODO: remove stroke calculation from this case\n const { width, height } = makeBoundingBoxFromPoints(\n getObjectBounds(target, clipPath as FabricObject),\n );\n const size = new Point(width, height);\n if (clipPath.absolutePositioned) {\n // we want the center point to exist in group's containing plane\n const clipPathCenter = sendPointToPlane(\n clipPath.getRelativeCenterPoint(),\n undefined,\n group ? group.calcTransformMatrix() : undefined,\n );\n return {\n center: clipPathCenter,\n size,\n };\n } else {\n // we want the center point to exist in group's containing plane, so we send it upwards\n const clipPathCenter = clipPath\n .getRelativeCenterPoint()\n .transform(target.calcOwnMatrix(), true);\n if (this.shouldPerformLayout(context)) {\n // the clip path is positioned relative to the group's center which is affected by the bbox\n // so we first calculate the bbox\n const { center = new Point(), correction = new Point() } =\n this.calcBoundingBox(objects, context) || {};\n return {\n center: center.add(clipPathCenter),\n correction: correction.subtract(clipPathCenter),\n size,\n };\n } else {\n return {\n center: target.getRelativeCenterPoint().add(clipPathCenter),\n size,\n };\n }\n }\n }\n}\n\nclassRegistry.setClass(ClipPathLayout);\n","import { Point } from '../../Point';\nimport type {\n InitializationLayoutContext,\n LayoutStrategyResult,\n StrictLayoutContext,\n} from '../types';\nimport { LayoutStrategy } from './LayoutStrategy';\nimport { classRegistry } from '../../ClassRegistry';\n\n/**\n * Layout will keep target's initial size.\n */\nexport class FixedLayout extends LayoutStrategy {\n static readonly type = 'fixed';\n\n /**\n * @override respect target's initial size\n */\n getInitialSize(\n { target }: StrictLayoutContext & InitializationLayoutContext,\n { size }: Pick,\n ): Point {\n return new Point(target.width || size.x, target.height || size.y);\n }\n}\n\nclassRegistry.setClass(FixedLayout);\n","import { LayoutManager } from './LayoutManager';\nimport type { RegistrationContext, StrictLayoutContext } from './types';\nimport type { Group } from '../shapes/Group';\n\n/**\n * Today the LayoutManager class also takes care of subscribing event handlers\n * to update the group layout when the group is interactive and a transform is applied\n * to a child object.\n * The ActiveSelection is never interactive, but it could contain objects from\n * groups that are.\n * The standard LayoutManager would subscribe the children of the activeSelection to\n * perform layout changes to the active selection itself, what we need instead is that\n * the transformation applied to the active selection will trigger changes to the\n * original group of the children ( the one referenced under the parent property )\n * This subclass of the LayoutManager has a single duty to fill the gap of this difference.`\n */\nexport class ActiveSelectionLayoutManager extends LayoutManager {\n subscribeTargets(\n context: RegistrationContext & Partial,\n ): void {\n const activeSelection = context.target;\n const parents = context.targets.reduce((parents, target) => {\n target.parent && parents.add(target.parent);\n return parents;\n }, new Set());\n parents.forEach((parent) => {\n parent.layoutManager.subscribeTargets({\n target: parent,\n targets: [activeSelection],\n });\n });\n }\n\n /**\n * unsubscribe from parent only if all its children were deselected\n */\n unsubscribeTargets(\n context: RegistrationContext & Partial,\n ): void {\n const activeSelection = context.target;\n const selectedObjects = activeSelection.getObjects();\n const parents = context.targets.reduce((parents, target) => {\n target.parent && parents.add(target.parent);\n return parents;\n }, new Set());\n parents.forEach((parent) => {\n !selectedObjects.some((object) => object.parent === parent) &&\n parent.layoutManager.unsubscribeTargets({\n target: parent,\n targets: [activeSelection],\n });\n });\n }\n}\n","import type { ControlRenderingStyleOverride } from '../controls/controlRendering';\nimport { classRegistry } from '../ClassRegistry';\nimport type { GroupProps } from './Group';\nimport { Group } from './Group';\nimport type { FabricObject } from './Object/FabricObject';\nimport {\n LAYOUT_TYPE_ADDED,\n LAYOUT_TYPE_REMOVED,\n} from '../LayoutManager/constants';\nimport type { TClassProperties } from '../typedefs';\nimport { log } from '../util/internals/console';\nimport { ActiveSelectionLayoutManager } from '../LayoutManager/ActiveSelectionLayoutManager';\n\nexport type MultiSelectionStacking = 'canvas-stacking' | 'selection-order';\n\nexport interface ActiveSelectionOptions extends GroupProps {\n multiSelectionStacking: MultiSelectionStacking;\n}\n\nconst activeSelectionDefaultValues: Partial> =\n {\n multiSelectionStacking: 'canvas-stacking',\n };\n\n/**\n * Used by Canvas to manage selection.\n *\n * @example\n * class MyActiveSelection extends ActiveSelection {\n * ...\n * }\n *\n * // override the default `ActiveSelection` class\n * classRegistry.setClass(MyActiveSelection)\n */\nexport class ActiveSelection extends Group {\n static type = 'ActiveSelection';\n\n static ownDefaults: Record = activeSelectionDefaultValues;\n\n static getDefaults(): Record {\n return { ...super.getDefaults(), ...ActiveSelection.ownDefaults };\n }\n\n /**\n * The ActiveSelection needs to use the ActiveSelectionLayoutManager\n * or selections on interactive groups may be broken\n */\n declare layoutManager: ActiveSelectionLayoutManager;\n\n /**\n * controls how selected objects are added during a multiselection event\n * - `canvas-stacking` adds the selected object to the active selection while respecting canvas object stacking order\n * - `selection-order` adds the selected object to the top of the stack,\n * meaning that the stack is ordered by the order in which objects were selected\n * @default `canvas-stacking`\n */\n declare multiSelectionStacking: MultiSelectionStacking;\n\n constructor(\n objects: FabricObject[] = [],\n options: Partial = {},\n ) {\n super();\n Object.assign(this, ActiveSelection.ownDefaults);\n this.setOptions(options);\n const { left, top, layoutManager } = options;\n this.groupInit(objects, {\n left,\n top,\n layoutManager: layoutManager ?? new ActiveSelectionLayoutManager(),\n });\n }\n\n /**\n * @private\n */\n _shouldSetNestedCoords() {\n return true;\n }\n\n /**\n * @private\n * @override we don't want the selection monitor to be active\n */\n __objectSelectionMonitor() {\n // noop\n }\n\n /**\n * Adds objects with respect to {@link multiSelectionStacking}\n * @param targets object to add to selection\n */\n multiSelectAdd(...targets: FabricObject[]) {\n if (this.multiSelectionStacking === 'selection-order') {\n this.add(...targets);\n } else {\n // respect object stacking as it is on canvas\n // perf enhancement for large ActiveSelection: consider a binary search of `isInFrontOf`\n targets.forEach((target) => {\n const index = this._objects.findIndex((obj) => obj.isInFrontOf(target));\n const insertAt =\n index === -1\n ? // `target` is in front of all other objects\n this.size()\n : index;\n this.insertAt(insertAt, target);\n });\n }\n }\n\n /**\n * @override block ancestors/descendants of selected objects from being selected to prevent a circular object tree\n */\n canEnterGroup(object: FabricObject) {\n if (\n this.getObjects().some(\n (o) => o.isDescendantOf(object) || object.isDescendantOf(o),\n )\n ) {\n // prevent circular object tree\n log(\n 'error',\n 'ActiveSelection: circular object trees are not supported, this call has no effect',\n );\n return false;\n }\n\n return super.canEnterGroup(object);\n }\n\n /**\n * Change an object so that it can be part of an active selection.\n * this method is called by multiselectAdd from canvas code.\n * @private\n * @param {FabricObject} object\n * @param {boolean} [removeParentTransform] true if object is in canvas coordinate plane\n */\n enterGroup(object: FabricObject, removeParentTransform?: boolean) {\n // This condition check that the object has currently a group, and the group\n // is also its parent, meaning that is not in an active selection, but is\n // in a normal group.\n if (object.parent && object.parent === object.group) {\n // Disconnect the object from the group functionalities, but keep the ref parent intact\n // for later re-enter\n object.parent._exitGroup(object);\n // in this case the object is probably inside an active selection.\n } else if (object.group && object.parent !== object.group) {\n // in this case group.remove will also clear the old parent reference.\n object.group.remove(object);\n }\n // enter the active selection from a render perspective\n // the object will be in the objects array of both the ActiveSelection and the Group\n // but referenced in the group's _activeObjects so that it won't be rendered twice.\n this._enterGroup(object, removeParentTransform);\n }\n\n /**\n * we want objects to retain their canvas ref when exiting instance\n * @private\n * @param {FabricObject} object\n * @param {boolean} [removeParentTransform] true if object should exit group without applying group's transform to it\n */\n exitGroup(object: FabricObject, removeParentTransform?: boolean) {\n this._exitGroup(object, removeParentTransform);\n // return to parent\n object.parent && object.parent._enterGroup(object, true);\n }\n\n /**\n * @private\n * @param {'added'|'removed'} type\n * @param {FabricObject[]} targets\n */\n _onAfterObjectsChange(type: 'added' | 'removed', targets: FabricObject[]) {\n super._onAfterObjectsChange(type, targets);\n const groups = new Set();\n targets.forEach((object) => {\n const { parent } = object;\n parent && groups.add(parent);\n });\n if (type === LAYOUT_TYPE_REMOVED) {\n // invalidate groups' layout and mark as dirty\n groups.forEach((group) => {\n group._onAfterObjectsChange(LAYOUT_TYPE_ADDED, targets);\n });\n } else {\n // mark groups as dirty\n groups.forEach((group) => {\n group._set('dirty', true);\n });\n }\n }\n\n /**\n * @override remove all objects\n */\n onDeselect() {\n this.removeAll();\n return false;\n }\n\n /**\n * Returns string representation of a group\n * @return {String}\n */\n toString() {\n return `#`;\n }\n\n /**\n * Decide if the object should cache or not. The Active selection never caches\n * @return {Boolean}\n */\n shouldCache() {\n return false;\n }\n\n /**\n * Check if this group or its parent group are caching, recursively up\n * @return {Boolean}\n */\n isOnACache() {\n return false;\n }\n\n /**\n * Renders controls and borders for the object\n * @param {CanvasRenderingContext2D} ctx Context to render on\n * @param {Object} [styleOverride] properties to override the object style\n * @param {Object} [childrenOverride] properties to override the children overrides\n */\n _renderControls(\n ctx: CanvasRenderingContext2D,\n styleOverride?: ControlRenderingStyleOverride,\n childrenOverride?: ControlRenderingStyleOverride,\n ) {\n ctx.save();\n ctx.globalAlpha = this.isMoving ? this.borderOpacityWhenMoving : 1;\n const options = {\n hasControls: false,\n ...childrenOverride,\n forActiveSelection: true,\n };\n for (let i = 0; i < this._objects.length; i++) {\n this._objects[i]._renderControls(ctx, options);\n }\n super._renderControls(ctx, styleOverride);\n ctx.restore();\n }\n}\n\nclassRegistry.setClass(ActiveSelection);\nclassRegistry.setClass(ActiveSelection, 'activeSelection');\n","/**\n * Canvas 2D filter backend.\n */\nimport type { BaseFilter } from './BaseFilter';\nimport type { T2DPipelineState, TPipelineResources } from './typedefs';\n\nexport class Canvas2dFilterBackend {\n /**\n * Experimental. This object is a sort of repository of help layers used to avoid\n * of recreating them during frequent filtering. If you are previewing a filter with\n * a slider you probably do not want to create help layers every filter step.\n * in this object there will be appended some canvases, created once, resized sometimes\n * cleared never. Clearing is left to the developer.\n **/\n resources: TPipelineResources = {};\n\n /**\n * Apply a set of filters against a source image and draw the filtered output\n * to the provided destination canvas.\n *\n * @param {EnhancedFilter} filters The filter to apply.\n * @param {HTMLImageElement|HTMLCanvasElement} sourceElement The source to be filtered.\n * @param {Number} sourceWidth The width of the source input.\n * @param {Number} sourceHeight The height of the source input.\n * @param {HTMLCanvasElement} targetCanvas The destination for filtered output to be drawn.\n */\n applyFilters(\n filters: BaseFilter>[],\n sourceElement: CanvasImageSource,\n sourceWidth: number,\n sourceHeight: number,\n targetCanvas: HTMLCanvasElement,\n ): T2DPipelineState | void {\n const ctx = targetCanvas.getContext('2d', {\n willReadFrequently: true,\n desynchronized: true,\n });\n if (!ctx) {\n return;\n }\n ctx.drawImage(sourceElement, 0, 0, sourceWidth, sourceHeight);\n const imageData = ctx.getImageData(0, 0, sourceWidth, sourceHeight);\n const originalImageData = ctx.getImageData(0, 0, sourceWidth, sourceHeight);\n const pipelineState: T2DPipelineState = {\n sourceWidth,\n sourceHeight,\n imageData,\n originalEl: sourceElement,\n originalImageData,\n canvasEl: targetCanvas,\n ctx,\n filterBackend: this,\n };\n filters.forEach((filter) => {\n filter.applyTo(pipelineState);\n });\n const { imageData: imageDataPostFilter } = pipelineState;\n if (\n imageDataPostFilter.width !== sourceWidth ||\n imageDataPostFilter.height !== sourceHeight\n ) {\n targetCanvas.width = imageDataPostFilter.width;\n targetCanvas.height = imageDataPostFilter.height;\n }\n ctx.putImageData(imageDataPostFilter, 0, 0);\n return pipelineState;\n }\n}\n","import { config } from '../config';\nimport { createCanvasElementFor } from '../util/misc/dom';\nimport type {\n TWebGLPipelineState,\n TProgramCache,\n TTextureCache,\n TPipelineResources,\n} from './typedefs';\nimport type { BaseFilter } from './BaseFilter';\n\nexport class WebGLFilterBackend {\n declare tileSize: number;\n\n /**\n * Define ...\n **/\n aPosition: Float32Array = new Float32Array([0, 0, 0, 1, 1, 0, 1, 1]);\n\n /**\n * If GLPut data is the fastest operation, or if forced, this buffer will be used\n * to transfer the data back in the 2d logic\n **/\n declare imageBuffer?: ArrayBuffer;\n\n declare canvas: HTMLCanvasElement;\n\n /**\n * The Webgl context that will execute the operations for filtering\n **/\n declare gl: WebGLRenderingContext;\n\n /**\n * Keyed map for shader cache\n **/\n declare programCache: TProgramCache;\n\n /**\n * Keyed map for texture cache\n **/\n declare textureCache: TTextureCache;\n\n /**\n * Contains GPU info for debug\n **/\n declare gpuInfo: any;\n\n /**\n * Experimental. This object is a sort of repository of help layers used to avoid\n * of recreating them during frequent filtering. If you are previewing a filter with\n * a slider you probably do not want to create help layers every filter step.\n * in this object there will be appended some canvases, created once, resized sometimes\n * cleared never. Clearing is left to the developer.\n **/\n resources: TPipelineResources = {};\n\n constructor({ tileSize = config.textureSize } = {}) {\n this.tileSize = tileSize;\n this.setupGLContext(tileSize, tileSize);\n this.captureGPUInfo();\n }\n\n /**\n * Setup a WebGL context suitable for filtering, and bind any needed event handlers.\n */\n setupGLContext(width: number, height: number): void {\n this.dispose();\n this.createWebGLCanvas(width, height);\n }\n\n /**\n * Create a canvas element and associated WebGL context and attaches them as\n * class properties to the GLFilterBackend class.\n */\n createWebGLCanvas(width: number, height: number): void {\n const canvas = createCanvasElementFor({ width, height });\n const glOptions = {\n alpha: true,\n premultipliedAlpha: false,\n depth: false,\n stencil: false,\n antialias: false,\n },\n gl = canvas.getContext('webgl', glOptions) as WebGLRenderingContext;\n\n if (!gl) {\n return;\n }\n gl.clearColor(0, 0, 0, 0);\n // this canvas can fire webglcontextlost and webglcontextrestored\n this.canvas = canvas;\n this.gl = gl;\n }\n\n /**\n * Attempts to apply the requested filters to the source provided, drawing the filtered output\n * to the provided target canvas.\n *\n * @param {Array} filters The filters to apply.\n * @param {TexImageSource} source The source to be filtered.\n * @param {Number} width The width of the source input.\n * @param {Number} height The height of the source input.\n * @param {HTMLCanvasElement} targetCanvas The destination for filtered output to be drawn.\n * @param {String|undefined} cacheKey A key used to cache resources related to the source. If\n * omitted, caching will be skipped.\n */\n applyFilters(\n filters: BaseFilter>[],\n source: TexImageSource,\n width: number,\n height: number,\n targetCanvas: HTMLCanvasElement,\n cacheKey?: string,\n ): TWebGLPipelineState | undefined {\n const gl = this.gl;\n const ctx = targetCanvas.getContext('2d');\n if (!gl || !ctx) {\n return;\n }\n let cachedTexture;\n if (cacheKey) {\n cachedTexture = this.getCachedTexture(cacheKey, source);\n }\n const pipelineState: TWebGLPipelineState = {\n originalWidth:\n (source as HTMLImageElement).width ||\n (source as HTMLImageElement).naturalWidth ||\n 0,\n originalHeight:\n (source as HTMLImageElement).height ||\n (source as HTMLImageElement).naturalHeight ||\n 0,\n sourceWidth: width,\n sourceHeight: height,\n destinationWidth: width,\n destinationHeight: height,\n context: gl,\n sourceTexture: this.createTexture(\n gl,\n width,\n height,\n !cachedTexture ? source : undefined,\n ),\n targetTexture: this.createTexture(gl, width, height),\n originalTexture:\n cachedTexture ||\n this.createTexture(\n gl,\n width,\n height,\n !cachedTexture ? source : undefined,\n ),\n passes: filters.length,\n webgl: true,\n aPosition: this.aPosition,\n programCache: this.programCache,\n pass: 0,\n filterBackend: this,\n targetCanvas: targetCanvas,\n };\n const tempFbo = gl.createFramebuffer();\n gl.bindFramebuffer(gl.FRAMEBUFFER, tempFbo);\n filters.forEach((filter: any) => {\n filter && filter.applyTo(pipelineState);\n });\n resizeCanvasIfNeeded(pipelineState);\n this.copyGLTo2D(gl, pipelineState);\n gl.bindTexture(gl.TEXTURE_2D, null);\n gl.deleteTexture(pipelineState.sourceTexture);\n gl.deleteTexture(pipelineState.targetTexture);\n gl.deleteFramebuffer(tempFbo);\n ctx.setTransform(1, 0, 0, 1, 0, 0);\n return pipelineState;\n }\n\n /**\n * Detach event listeners, remove references, and clean up caches.\n */\n dispose() {\n if (this.canvas) {\n // we are disposing, we don't care about the fact\n // that the canvas shouldn't be null.\n // @ts-expect-error disposing\n this.canvas = null;\n // @ts-expect-error disposing\n this.gl = null;\n }\n this.clearWebGLCaches();\n }\n\n /**\n * Wipe out WebGL-related caches.\n */\n clearWebGLCaches() {\n this.programCache = {};\n this.textureCache = {};\n }\n\n /**\n * Create a WebGL texture object.\n *\n * Accepts specific dimensions to initialize the texture to or a source image.\n *\n * @param {WebGLRenderingContext} gl The GL context to use for creating the texture.\n * @param {number} width The width to initialize the texture at.\n * @param {number} height The height to initialize the texture.\n * @param {TexImageSource} textureImageSource A source for the texture data.\n * @param {number} filter gl.NEAREST default or gl.LINEAR filters for the texture.\n * This filter is very useful for LUTs filters. If you need interpolation use gl.LINEAR\n * @returns {WebGLTexture}\n */\n createTexture(\n gl: WebGLRenderingContext,\n width: number,\n height: number,\n textureImageSource?: TexImageSource,\n filter?:\n | WebGLRenderingContextBase['NEAREST']\n | WebGLRenderingContextBase['LINEAR'],\n ) {\n const {\n NEAREST,\n TEXTURE_2D,\n RGBA,\n UNSIGNED_BYTE,\n CLAMP_TO_EDGE,\n TEXTURE_MAG_FILTER,\n TEXTURE_MIN_FILTER,\n TEXTURE_WRAP_S,\n TEXTURE_WRAP_T,\n } = gl;\n const texture = gl.createTexture();\n gl.bindTexture(TEXTURE_2D, texture);\n gl.texParameteri(TEXTURE_2D, TEXTURE_MAG_FILTER, filter || NEAREST);\n gl.texParameteri(TEXTURE_2D, TEXTURE_MIN_FILTER, filter || NEAREST);\n gl.texParameteri(TEXTURE_2D, TEXTURE_WRAP_S, CLAMP_TO_EDGE);\n gl.texParameteri(TEXTURE_2D, TEXTURE_WRAP_T, CLAMP_TO_EDGE);\n if (textureImageSource) {\n gl.texImage2D(\n TEXTURE_2D,\n 0,\n RGBA,\n RGBA,\n UNSIGNED_BYTE,\n textureImageSource,\n );\n } else {\n gl.texImage2D(\n TEXTURE_2D,\n 0,\n RGBA,\n width,\n height,\n 0,\n RGBA,\n UNSIGNED_BYTE,\n null,\n );\n }\n return texture;\n }\n\n /**\n * Can be optionally used to get a texture from the cache array\n *\n * If an existing texture is not found, a new texture is created and cached.\n *\n * @param {String} uniqueId A cache key to use to find an existing texture.\n * @param {HTMLImageElement|HTMLCanvasElement} textureImageSource A source to use to create the\n * texture cache entry if one does not already exist.\n */\n getCachedTexture(\n uniqueId: string,\n textureImageSource: TexImageSource,\n filter?:\n | WebGLRenderingContextBase['NEAREST']\n | WebGLRenderingContextBase['LINEAR'],\n ): WebGLTexture | null {\n const { textureCache } = this;\n if (textureCache[uniqueId]) {\n return textureCache[uniqueId];\n } else {\n const texture = this.createTexture(\n this.gl,\n (textureImageSource as HTMLImageElement).width,\n (textureImageSource as HTMLImageElement).height,\n textureImageSource,\n filter,\n );\n if (texture) {\n textureCache[uniqueId] = texture;\n }\n return texture;\n }\n }\n\n /**\n * Clear out cached resources related to a source image that has been\n * filtered previously.\n *\n * @param {String} cacheKey The cache key provided when the source image was filtered.\n */\n evictCachesForKey(cacheKey: string) {\n if (this.textureCache[cacheKey]) {\n this.gl.deleteTexture(this.textureCache[cacheKey]);\n delete this.textureCache[cacheKey];\n }\n }\n\n /**\n * Copy an input WebGL canvas on to an output 2D canvas.\n *\n * The WebGL canvas is assumed to be upside down, with the top-left pixel of the\n * desired output image appearing in the bottom-left corner of the WebGL canvas.\n *\n * @param {WebGLRenderingContext} sourceContext The WebGL context to copy from.\n * @param {Object} pipelineState The 2D target canvas to copy on to.\n */\n copyGLTo2D(gl: WebGLRenderingContext, pipelineState: TWebGLPipelineState) {\n const glCanvas = gl.canvas,\n targetCanvas = pipelineState.targetCanvas,\n ctx = targetCanvas.getContext('2d');\n if (!ctx) {\n return;\n }\n ctx.translate(0, targetCanvas.height); // move it down again\n ctx.scale(1, -1); // vertical flip\n // where is my image on the big glcanvas?\n const sourceY = glCanvas.height - targetCanvas.height;\n ctx.drawImage(\n glCanvas,\n 0,\n sourceY,\n targetCanvas.width,\n targetCanvas.height,\n 0,\n 0,\n targetCanvas.width,\n targetCanvas.height,\n );\n }\n\n /**\n * Copy an input WebGL canvas on to an output 2D canvas using 2d canvas' putImageData\n * API. Measurably faster than using ctx.drawImage in Firefox (version 54 on OSX Sierra).\n *\n * @param {WebGLRenderingContext} sourceContext The WebGL context to copy from.\n * @param {HTMLCanvasElement} targetCanvas The 2D target canvas to copy on to.\n * @param {Object} pipelineState The 2D target canvas to copy on to.\n */\n copyGLTo2DPutImageData(\n this: Required,\n gl: WebGLRenderingContext,\n pipelineState: TWebGLPipelineState,\n ) {\n const targetCanvas = pipelineState.targetCanvas,\n ctx = targetCanvas.getContext('2d'),\n dWidth = pipelineState.destinationWidth,\n dHeight = pipelineState.destinationHeight,\n numBytes = dWidth * dHeight * 4;\n if (!ctx) {\n return;\n }\n const u8 = new Uint8Array(this.imageBuffer, 0, numBytes);\n const u8Clamped = new Uint8ClampedArray(this.imageBuffer, 0, numBytes);\n\n gl.readPixels(0, 0, dWidth, dHeight, gl.RGBA, gl.UNSIGNED_BYTE, u8);\n const imgData = new ImageData(u8Clamped, dWidth, dHeight);\n ctx.putImageData(imgData, 0, 0);\n }\n\n /**\n * Attempt to extract GPU information strings from a WebGL context.\n *\n * Useful information when debugging or blacklisting specific GPUs.\n *\n * @returns {Object} A GPU info object with renderer and vendor strings.\n */\n captureGPUInfo() {\n if (this.gpuInfo) {\n return this.gpuInfo;\n }\n const gl = this.gl,\n gpuInfo = { renderer: '', vendor: '' };\n if (!gl) {\n return gpuInfo;\n }\n const ext = gl.getExtension('WEBGL_debug_renderer_info');\n if (ext) {\n const renderer = gl.getParameter(ext.UNMASKED_RENDERER_WEBGL);\n const vendor = gl.getParameter(ext.UNMASKED_VENDOR_WEBGL);\n if (renderer) {\n gpuInfo.renderer = renderer.toLowerCase();\n }\n if (vendor) {\n gpuInfo.vendor = vendor.toLowerCase();\n }\n }\n this.gpuInfo = gpuInfo;\n return gpuInfo;\n }\n}\n\nfunction resizeCanvasIfNeeded(pipelineState: TWebGLPipelineState): void {\n const targetCanvas = pipelineState.targetCanvas,\n width = targetCanvas.width,\n height = targetCanvas.height,\n dWidth = pipelineState.destinationWidth,\n dHeight = pipelineState.destinationHeight;\n\n if (width !== dWidth || height !== dHeight) {\n targetCanvas.width = dWidth;\n targetCanvas.height = dHeight;\n }\n}\n","import { config } from '../config';\nimport { getEnv } from '../env';\nimport { createCanvasElement } from '../util/misc/dom';\nimport { Canvas2dFilterBackend } from './Canvas2dFilterBackend';\nimport { WebGLFilterBackend } from './WebGLFilterBackend';\n\nexport type FilterBackend = WebGLFilterBackend | Canvas2dFilterBackend;\n\nlet filterBackend: FilterBackend;\n\n/**\n * Verifies if it is possible to initialize webgl or fallback on a canvas2d filtering backend\n */\nexport function initFilterBackend(): FilterBackend {\n const { WebGLProbe } = getEnv();\n WebGLProbe.queryWebGL(createCanvasElement());\n if (config.enableGLFiltering && WebGLProbe.isSupported(config.textureSize)) {\n return new WebGLFilterBackend({ tileSize: config.textureSize });\n } else {\n return new Canvas2dFilterBackend();\n }\n}\n\n/**\n * Get the current fabricJS filter backend or initialize one if not available yet\n * @param [strict] pass `true` to create the backend if it wasn't created yet (default behavior),\n * pass `false` to get the backend ref without mutating it\n */\nexport function getFilterBackend(strict = true): FilterBackend {\n if (!filterBackend && strict) {\n filterBackend = initFilterBackend();\n }\n return filterBackend;\n}\n\nexport function setFilterBackend(backend: FilterBackend) {\n filterBackend = backend;\n}\n","import { getFabricDocument, getEnv } from '../env';\nimport type { BaseFilter } from '../filters/BaseFilter';\nimport { getFilterBackend } from '../filters/FilterBackend';\nimport { SHARED_ATTRIBUTES } from '../parser/attributes';\nimport { parseAttributes } from '../parser/parseAttributes';\nimport type {\n TClassProperties,\n TCrossOrigin,\n TSize,\n Abortable,\n TOptions,\n} from '../typedefs';\nimport { uid } from '../util/internals/uid';\nimport { createCanvasElementFor } from '../util/misc/dom';\nimport { findScaleToCover, findScaleToFit } from '../util/misc/findScaleTo';\nimport type { LoadImageOptions } from '../util/misc/objectEnlive';\nimport {\n enlivenObjectEnlivables,\n enlivenObjects,\n loadImage,\n} from '../util/misc/objectEnlive';\nimport { parsePreserveAspectRatioAttribute } from '../util/misc/svgParsing';\nimport { classRegistry } from '../ClassRegistry';\nimport { FabricObject, cacheProperties } from './Object/FabricObject';\nimport type { FabricObjectProps, SerializedObjectProps } from './Object/types';\nimport type { ObjectEvents } from '../EventTypeDefs';\nimport { WebGLFilterBackend } from '../filters/WebGLFilterBackend';\nimport { FILL, NONE } from '../constants';\nimport { getDocumentFromElement } from '../util/dom_misc';\nimport type { CSSRules } from '../parser/typedefs';\nimport type { Resize, ResizeSerializedProps } from '../filters/Resize';\nimport type { TCachedFabricObject } from './Object/Object';\nimport { log } from '../util/internals/console';\n\n// @todo Would be nice to have filtering code not imported directly.\n\nexport type ImageSource =\n | HTMLImageElement\n | HTMLVideoElement\n | HTMLCanvasElement;\n\ninterface UniqueImageProps {\n srcFromAttribute: boolean;\n minimumScaleTrigger: number;\n cropX: number;\n cropY: number;\n imageSmoothing: boolean;\n filters: BaseFilter>[];\n resizeFilter?: Resize;\n}\n\nexport const imageDefaultValues: Partial> = {\n strokeWidth: 0,\n srcFromAttribute: false,\n minimumScaleTrigger: 0.5,\n cropX: 0,\n cropY: 0,\n imageSmoothing: true,\n};\n\nexport interface SerializedImageProps extends SerializedObjectProps {\n src: string;\n crossOrigin: TCrossOrigin;\n filters: any[];\n resizeFilter?: ResizeSerializedProps;\n cropX: number;\n cropY: number;\n}\n\nexport interface ImageProps extends FabricObjectProps, UniqueImageProps {}\n\nconst IMAGE_PROPS = ['cropX', 'cropY'] as const;\n\n/**\n * @tutorial {@link http://fabricjs.com/fabric-intro-part-1#images}\n */\nexport class FabricImage<\n Props extends TOptions = Partial,\n SProps extends SerializedImageProps = SerializedImageProps,\n EventSpec extends ObjectEvents = ObjectEvents,\n >\n extends FabricObject\n implements ImageProps\n{\n /**\n * When calling {@link FabricImage.getSrc}, return value from element src with `element.getAttribute('src')`.\n * This allows for relative urls as image src.\n * @since 2.7.0\n * @type Boolean\n * @default false\n */\n declare srcFromAttribute: boolean;\n\n /**\n * private\n * contains last value of scaleX to detect\n * if the Image got resized after the last Render\n * @type Number\n */\n protected _lastScaleX = 1;\n\n /**\n * private\n * contains last value of scaleY to detect\n * if the Image got resized after the last Render\n * @type Number\n */\n protected _lastScaleY = 1;\n\n /**\n * private\n * contains last value of scaling applied by the apply filter chain\n * @type Number\n */\n protected _filterScalingX = 1;\n\n /**\n * private\n * contains last value of scaling applied by the apply filter chain\n * @type Number\n */\n protected _filterScalingY = 1;\n\n /**\n * minimum scale factor under which any resizeFilter is triggered to resize the image\n * 0 will disable the automatic resize. 1 will trigger automatically always.\n * number bigger than 1 are not implemented yet.\n * @type Number\n */\n declare minimumScaleTrigger: number;\n\n /**\n * key used to retrieve the texture representing this image\n * @since 2.0.0\n * @type String\n */\n declare cacheKey: string;\n\n /**\n * Image crop in pixels from original image size.\n * @since 2.0.0\n * @type Number\n */\n declare cropX: number;\n\n /**\n * Image crop in pixels from original image size.\n * @since 2.0.0\n * @type Number\n */\n declare cropY: number;\n\n /**\n * Indicates whether this canvas will use image smoothing when painting this image.\n * Also influence if the cacheCanvas for this image uses imageSmoothing\n * @since 4.0.0-beta.11\n * @type Boolean\n */\n declare imageSmoothing: boolean;\n\n declare preserveAspectRatio: string;\n\n declare protected src: string;\n\n declare filters: BaseFilter>[];\n declare resizeFilter: Resize;\n\n declare _element: ImageSource;\n declare _filteredEl?: HTMLCanvasElement;\n declare _originalElement: ImageSource;\n\n static type = 'Image';\n\n static cacheProperties = [...cacheProperties, ...IMAGE_PROPS];\n\n static ownDefaults = imageDefaultValues;\n\n static getDefaults(): Record {\n return {\n ...super.getDefaults(),\n ...FabricImage.ownDefaults,\n };\n }\n /**\n * Constructor\n * Image can be initialized with any canvas drawable or a string.\n * The string should be a url and will be loaded as an image.\n * Canvas and Image element work out of the box, while videos require extra code to work.\n * Please check video element events for seeking.\n * @param {ImageSource | string} element Image element\n * @param {Object} [options] Options object\n */\n constructor(elementId: string, options?: Props);\n constructor(element: ImageSource, options?: Props);\n constructor(arg0: ImageSource | string, options?: Props) {\n super();\n this.filters = [];\n Object.assign(this, FabricImage.ownDefaults);\n this.setOptions(options);\n this.cacheKey = `texture${uid()}`;\n this.setElement(\n typeof arg0 === 'string'\n ? ((\n (this.canvas && getDocumentFromElement(this.canvas.getElement())) ||\n getFabricDocument()\n ).getElementById(arg0) as ImageSource)\n : arg0,\n options,\n );\n }\n\n /**\n * Returns image element which this instance if based on\n */\n getElement() {\n return this._element;\n }\n\n /**\n * Sets image element for this instance to a specified one.\n * If filters defined they are applied to new image.\n * You might need to call `canvas.renderAll` and `object.setCoords` after replacing, to render new image and update controls area.\n * @param {HTMLImageElement} element\n * @param {Partial} [size] Options object\n */\n setElement(element: ImageSource, size: Partial = {}) {\n this.removeTexture(this.cacheKey);\n this.removeTexture(`${this.cacheKey}_filtered`);\n this._element = element;\n this._originalElement = element;\n this._setWidthHeight(size);\n if (this.filters.length !== 0) {\n this.applyFilters();\n }\n // resizeFilters work on the already filtered copy.\n // we need to apply resizeFilters AFTER normal filters.\n // applyResizeFilters is run more often than normal filters\n // and is triggered by user interactions rather than dev code\n if (this.resizeFilter) {\n this.applyResizeFilters();\n }\n }\n\n /**\n * Delete a single texture if in webgl mode\n */\n removeTexture(key: string) {\n const backend = getFilterBackend(false);\n if (backend instanceof WebGLFilterBackend) {\n backend.evictCachesForKey(key);\n }\n }\n\n /**\n * Delete textures, reference to elements and eventually JSDOM cleanup\n */\n dispose() {\n super.dispose();\n this.removeTexture(this.cacheKey);\n this.removeTexture(`${this.cacheKey}_filtered`);\n this._cacheContext = null;\n (\n ['_originalElement', '_element', '_filteredEl', '_cacheCanvas'] as const\n ).forEach((elementKey) => {\n const el = this[elementKey];\n el && getEnv().dispose(el);\n // @ts-expect-error disposing\n this[elementKey] = undefined;\n });\n }\n\n /**\n * Get the crossOrigin value (of the corresponding image element)\n */\n getCrossOrigin(): string | null {\n return (\n this._originalElement &&\n ((this._originalElement as any).crossOrigin || null)\n );\n }\n\n /**\n * Returns original size of an image\n */\n getOriginalSize() {\n const element = this.getElement() as any;\n if (!element) {\n return {\n width: 0,\n height: 0,\n };\n }\n return {\n width: element.naturalWidth || element.width,\n height: element.naturalHeight || element.height,\n };\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _stroke(ctx: CanvasRenderingContext2D) {\n if (!this.stroke || this.strokeWidth === 0) {\n return;\n }\n const w = this.width / 2,\n h = this.height / 2;\n ctx.beginPath();\n ctx.moveTo(-w, -h);\n ctx.lineTo(w, -h);\n ctx.lineTo(w, h);\n ctx.lineTo(-w, h);\n ctx.lineTo(-w, -h);\n ctx.closePath();\n }\n\n /**\n * Returns object representation of an instance\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} Object representation of an instance\n */\n toObject<\n T extends Omit, keyof SProps>,\n K extends keyof T = never,\n >(propertiesToInclude: K[] = []): Pick & SProps {\n const filters: Record[] = [];\n this.filters.forEach((filterObj) => {\n filterObj && filters.push(filterObj.toObject());\n });\n return {\n ...super.toObject([...IMAGE_PROPS, ...propertiesToInclude]),\n src: this.getSrc(),\n crossOrigin: this.getCrossOrigin(),\n filters,\n ...(this.resizeFilter\n ? { resizeFilter: this.resizeFilter.toObject() }\n : {}),\n };\n }\n\n /**\n * Returns true if an image has crop applied, inspecting values of cropX,cropY,width,height.\n * @return {Boolean}\n */\n hasCrop() {\n return (\n !!this.cropX ||\n !!this.cropY ||\n this.width < this._element.width ||\n this.height < this._element.height\n );\n }\n\n /**\n * Returns svg representation of an instance\n * @return {string[]} an array of strings with the specific svg representation\n * of the instance\n */\n _toSVG() {\n const imageMarkup: string[] = [],\n element = this._element,\n x = -this.width / 2,\n y = -this.height / 2;\n let svgString: string[] = [],\n strokeSvg: string[] = [],\n clipPath = '',\n imageRendering = '';\n if (!element) {\n return [];\n }\n if (this.hasCrop()) {\n const clipPathId = uid();\n svgString.push(\n '\\n',\n '\\t\\n',\n '\\n',\n );\n clipPath = ' clip-path=\"url(#imageCrop_' + clipPathId + ')\" ';\n }\n if (!this.imageSmoothing) {\n imageRendering = ' image-rendering=\"optimizeSpeed\"';\n }\n imageMarkup.push(\n '\\t element with actual transformation, then offsetting object to the top/left\n // so that object's center aligns with container's left/top\n }\" width=\"${\n element.width || (element as HTMLImageElement).naturalWidth\n }\" height=\"${\n element.height || (element as HTMLImageElement).naturalHeight\n }\"${imageRendering}${clipPath}>\\n`,\n );\n\n if (this.stroke || this.strokeDashArray) {\n const origFill = this.fill;\n this.fill = null;\n strokeSvg = [\n `\\t\\n`,\n ];\n this.fill = origFill;\n }\n if (this.paintFirst !== FILL) {\n svgString = svgString.concat(strokeSvg, imageMarkup);\n } else {\n svgString = svgString.concat(imageMarkup, strokeSvg);\n }\n return svgString;\n }\n\n /**\n * Returns source of an image\n * @param {Boolean} filtered indicates if the src is needed for svg\n * @return {String} Source of an image\n */\n getSrc(filtered?: boolean): string {\n const element = filtered ? this._element : this._originalElement;\n if (element) {\n if ((element as HTMLCanvasElement).toDataURL) {\n return (element as HTMLCanvasElement).toDataURL();\n }\n\n if (this.srcFromAttribute) {\n return element.getAttribute('src') || '';\n } else {\n return (element as HTMLImageElement).src;\n }\n } else {\n return this.src || '';\n }\n }\n\n /**\n * Alias for getSrc\n * @param filtered\n * @deprecated\n */\n getSvgSrc(filtered?: boolean) {\n return this.getSrc(filtered);\n }\n\n /**\n * Loads and sets source of an image\\\n * **IMPORTANT**: It is recommended to abort loading tasks before calling this method to prevent race conditions and unnecessary networking\n * @param {String} src Source string (URL)\n * @param {LoadImageOptions} [options] Options object\n */\n setSrc(src: string, { crossOrigin, signal }: LoadImageOptions = {}) {\n return loadImage(src, { crossOrigin, signal }).then((img) => {\n typeof crossOrigin !== 'undefined' && this.set({ crossOrigin });\n this.setElement(img);\n });\n }\n\n /**\n * Returns string representation of an instance\n * @return {String} String representation of an instance\n */\n toString() {\n return `#`;\n }\n\n applyResizeFilters() {\n const filter = this.resizeFilter,\n minimumScale = this.minimumScaleTrigger,\n objectScale = this.getTotalObjectScaling(),\n scaleX = objectScale.x,\n scaleY = objectScale.y,\n elementToFilter = this._filteredEl || this._originalElement;\n if (this.group) {\n this.set('dirty', true);\n }\n if (!filter || (scaleX > minimumScale && scaleY > minimumScale)) {\n this._element = elementToFilter;\n this._filterScalingX = 1;\n this._filterScalingY = 1;\n this._lastScaleX = scaleX;\n this._lastScaleY = scaleY;\n return;\n }\n const canvasEl = createCanvasElementFor(elementToFilter),\n { width, height } = elementToFilter;\n this._element = canvasEl;\n this._lastScaleX = filter.scaleX = scaleX;\n this._lastScaleY = filter.scaleY = scaleY;\n getFilterBackend().applyFilters(\n [filter],\n elementToFilter,\n width,\n height,\n this._element,\n );\n this._filterScalingX = canvasEl.width / this._originalElement.width;\n this._filterScalingY = canvasEl.height / this._originalElement.height;\n }\n\n /**\n * Applies filters assigned to this image (from \"filters\" array) or from filter param\n * @method applyFilters\n * @param {Array} filters to be applied\n * @param {Boolean} forResizing specify if the filter operation is a resize operation\n */\n applyFilters(\n filters: BaseFilter>[] = this.filters || [],\n ) {\n filters = filters.filter((filter) => filter && !filter.isNeutralState());\n this.set('dirty', true);\n\n // needs to clear out or WEBGL will not resize correctly\n this.removeTexture(`${this.cacheKey}_filtered`);\n\n if (filters.length === 0) {\n this._element = this._originalElement;\n // this is unsafe and needs to be rethinkend\n this._filteredEl = undefined;\n this._filterScalingX = 1;\n this._filterScalingY = 1;\n return;\n }\n\n const imgElement = this._originalElement,\n sourceWidth =\n (imgElement as HTMLImageElement).naturalWidth || imgElement.width,\n sourceHeight =\n (imgElement as HTMLImageElement).naturalHeight || imgElement.height;\n\n if (this._element === this._originalElement) {\n // if the _element a reference to _originalElement\n // we need to create a new element to host the filtered pixels\n const canvasEl = createCanvasElementFor({\n width: sourceWidth,\n height: sourceHeight,\n });\n this._element = canvasEl;\n this._filteredEl = canvasEl;\n } else if (this._filteredEl) {\n // if the _element is it own element,\n // and we also have a _filteredEl, then we clean up _filteredEl\n // and we assign it to _element.\n // in this way we invalidate the eventual old resize filtered element\n this._element = this._filteredEl;\n this._filteredEl\n .getContext('2d')!\n .clearRect(0, 0, sourceWidth, sourceHeight);\n // we also need to resize again at next renderAll, so remove saved _lastScaleX/Y\n this._lastScaleX = 1;\n this._lastScaleY = 1;\n }\n getFilterBackend().applyFilters(\n filters,\n this._originalElement,\n sourceWidth,\n sourceHeight,\n this._element as HTMLCanvasElement,\n this.cacheKey,\n );\n if (\n this._originalElement.width !== this._element.width ||\n this._originalElement.height !== this._element.height\n ) {\n this._filterScalingX = this._element.width / this._originalElement.width;\n this._filterScalingY =\n this._element.height / this._originalElement.height;\n }\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _render(ctx: CanvasRenderingContext2D) {\n ctx.imageSmoothingEnabled = this.imageSmoothing;\n if (this.isMoving !== true && this.resizeFilter && this._needsResize()) {\n this.applyResizeFilters();\n }\n this._stroke(ctx);\n this._renderPaintInOrder(ctx);\n }\n\n /**\n * Paint the cached copy of the object on the target context.\n * it will set the imageSmoothing for the draw operation\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n drawCacheOnCanvas(\n this: TCachedFabricObject,\n ctx: CanvasRenderingContext2D,\n ) {\n ctx.imageSmoothingEnabled = this.imageSmoothing;\n super.drawCacheOnCanvas(ctx);\n }\n\n /**\n * Decide if the FabricImage should cache or not. Create its own cache level\n * needsItsOwnCache should be used when the object drawing method requires\n * a cache step.\n * Generally you do not cache objects in groups because the group outside is cached.\n * This is the special Image version where we would like to avoid caching where possible.\n * Essentially images do not benefit from caching. They may require caching, and in that\n * case we do it. Also caching an image usually ends in a loss of details.\n * A full performance audit should be done.\n * @return {Boolean}\n */\n shouldCache() {\n return this.needsItsOwnCache();\n }\n\n _renderFill(ctx: CanvasRenderingContext2D) {\n const elementToDraw = this._element;\n if (!elementToDraw) {\n return;\n }\n const scaleX = this._filterScalingX,\n scaleY = this._filterScalingY,\n w = this.width,\n h = this.height,\n // crop values cannot be lesser than 0.\n cropX = Math.max(this.cropX, 0),\n cropY = Math.max(this.cropY, 0),\n elWidth =\n (elementToDraw as HTMLImageElement).naturalWidth || elementToDraw.width,\n elHeight =\n (elementToDraw as HTMLImageElement).naturalHeight ||\n elementToDraw.height,\n sX = cropX * scaleX,\n sY = cropY * scaleY,\n // the width height cannot exceed element width/height, starting from the crop offset.\n sW = Math.min(w * scaleX, elWidth - sX),\n sH = Math.min(h * scaleY, elHeight - sY),\n x = -w / 2,\n y = -h / 2,\n maxDestW = Math.min(w, elWidth / scaleX - cropX),\n maxDestH = Math.min(h, elHeight / scaleY - cropY);\n\n elementToDraw &&\n ctx.drawImage(elementToDraw, sX, sY, sW, sH, x, y, maxDestW, maxDestH);\n }\n\n /**\n * needed to check if image needs resize\n * @private\n */\n _needsResize() {\n const scale = this.getTotalObjectScaling();\n return scale.x !== this._lastScaleX || scale.y !== this._lastScaleY;\n }\n\n /**\n * @private\n * @deprecated unused\n */\n _resetWidthHeight() {\n this.set(this.getOriginalSize());\n }\n\n /**\n * @private\n * Set the width and the height of the image object, using the element or the\n * options.\n */\n _setWidthHeight({ width, height }: Partial = {}) {\n const size = this.getOriginalSize();\n this.width = width || size.width;\n this.height = height || size.height;\n }\n\n /**\n * Calculate offset for center and scale factor for the image in order to respect\n * the preserveAspectRatio attribute\n * @private\n */\n parsePreserveAspectRatioAttribute() {\n const pAR = parsePreserveAspectRatioAttribute(\n this.preserveAspectRatio || '',\n ),\n pWidth = this.width,\n pHeight = this.height,\n parsedAttributes = { width: pWidth, height: pHeight };\n let rWidth = this._element.width,\n rHeight = this._element.height,\n scaleX = 1,\n scaleY = 1,\n offsetLeft = 0,\n offsetTop = 0,\n cropX = 0,\n cropY = 0,\n offset;\n\n if (pAR && (pAR.alignX !== NONE || pAR.alignY !== NONE)) {\n if (pAR.meetOrSlice === 'meet') {\n scaleX = scaleY = findScaleToFit(this._element, parsedAttributes);\n offset = (pWidth - rWidth * scaleX) / 2;\n if (pAR.alignX === 'Min') {\n offsetLeft = -offset;\n }\n if (pAR.alignX === 'Max') {\n offsetLeft = offset;\n }\n offset = (pHeight - rHeight * scaleY) / 2;\n if (pAR.alignY === 'Min') {\n offsetTop = -offset;\n }\n if (pAR.alignY === 'Max') {\n offsetTop = offset;\n }\n }\n if (pAR.meetOrSlice === 'slice') {\n scaleX = scaleY = findScaleToCover(this._element, parsedAttributes);\n offset = rWidth - pWidth / scaleX;\n if (pAR.alignX === 'Mid') {\n cropX = offset / 2;\n }\n if (pAR.alignX === 'Max') {\n cropX = offset;\n }\n offset = rHeight - pHeight / scaleY;\n if (pAR.alignY === 'Mid') {\n cropY = offset / 2;\n }\n if (pAR.alignY === 'Max') {\n cropY = offset;\n }\n rWidth = pWidth / scaleX;\n rHeight = pHeight / scaleY;\n }\n } else {\n scaleX = pWidth / rWidth;\n scaleY = pHeight / rHeight;\n }\n return {\n width: rWidth,\n height: rHeight,\n scaleX,\n scaleY,\n offsetLeft,\n offsetTop,\n cropX,\n cropY,\n };\n }\n\n /**\n * List of attribute names to account for when parsing SVG element (used by {@link FabricImage.fromElement})\n * @see {@link http://www.w3.org/TR/SVG/struct.html#ImageElement}\n */\n static ATTRIBUTE_NAMES = [\n ...SHARED_ATTRIBUTES,\n 'x',\n 'y',\n 'width',\n 'height',\n 'preserveAspectRatio',\n 'xlink:href',\n 'href',\n 'crossOrigin',\n 'image-rendering',\n ];\n\n /**\n * Creates an instance of FabricImage from its object representation\n * @param {Object} object Object to create an instance from\n * @param {object} [options] Options object\n * @param {AbortSignal} [options.signal] handle aborting, see https://developer.mozilla.org/en-US/docs/Web/API/AbortController/signal\n * @returns {Promise}\n */\n static fromObject>(\n { filters: f, resizeFilter: rf, src, crossOrigin, type, ...object }: T,\n options?: Abortable,\n ) {\n return Promise.all([\n loadImage(src!, { ...options, crossOrigin }),\n f && enlivenObjects>(f, options),\n // redundant - handled by enlivenObjectEnlivables, but nicely explicit\n rf ? enlivenObjects([rf], options) : [],\n enlivenObjectEnlivables(object, options),\n ]).then(([el, filters = [], [resizeFilter], hydratedProps = {}]) => {\n return new this(el, {\n ...object,\n // TODO: passing src creates a difference between image creation and restoring from JSON\n src,\n filters,\n resizeFilter,\n ...hydratedProps,\n });\n });\n }\n\n /**\n * Creates an instance of Image from an URL string\n * @param {String} url URL to create an image from\n * @param {LoadImageOptions} [options] Options object\n * @returns {Promise}\n */\n static fromURL>(\n url: string,\n { crossOrigin = null, signal }: LoadImageOptions = {},\n imageOptions?: T,\n ): Promise {\n return loadImage(url, { crossOrigin, signal }).then(\n (img) => new this(img, imageOptions),\n );\n }\n\n /**\n * Returns {@link FabricImage} instance from an SVG element\n * @param {HTMLElement} element Element to parse\n * @param {Object} [options] Options object\n * @param {AbortSignal} [options.signal] handle aborting, see https://developer.mozilla.org/en-US/docs/Web/API/AbortController/signal\n * @param {Function} callback Callback to execute when Image object is created\n */\n static async fromElement(\n element: HTMLElement,\n options: Abortable = {},\n cssRules?: CSSRules,\n ) {\n const parsedAttributes = parseAttributes(\n element,\n this.ATTRIBUTE_NAMES,\n cssRules,\n );\n return this.fromURL(\n parsedAttributes['xlink:href'] || parsedAttributes['href'],\n options,\n parsedAttributes,\n ).catch((err) => {\n log('log', 'Unable to parse Image', err);\n return null;\n });\n }\n}\n\nclassRegistry.setClass(FabricImage);\nclassRegistry.setSVGClass(FabricImage);\n","import { svgNS } from './constants';\nimport {\n parsePreserveAspectRatioAttribute,\n parseUnit,\n} from '../util/misc/svgParsing';\nimport { svgViewBoxElementsRegEx, reViewBoxAttrValue } from './constants';\nimport { NONE } from '../constants';\n\nexport type ParsedViewboxTransform = Partial<{\n width: number;\n height: number;\n minX: number;\n minY: number;\n viewBoxWidth: number;\n viewBoxHeight: number;\n}>;\n\n/**\n * Add a element that envelop all child elements and makes the viewbox transformMatrix descend on all elements\n */\nexport function applyViewboxTransform(\n element: Element,\n): ParsedViewboxTransform {\n if (!svgViewBoxElementsRegEx.test(element.nodeName)) {\n return {};\n }\n const viewBoxAttr: string | null = element.getAttribute('viewBox');\n let scaleX = 1;\n let scaleY = 1;\n let minX = 0;\n let minY = 0;\n let matrix;\n let el;\n const widthAttr = element.getAttribute('width');\n const heightAttr = element.getAttribute('height');\n const x = element.getAttribute('x') || 0;\n const y = element.getAttribute('y') || 0;\n const goodViewbox = viewBoxAttr && reViewBoxAttrValue.test(viewBoxAttr);\n const missingViewBox = !goodViewbox;\n const missingDimAttr =\n !widthAttr || !heightAttr || widthAttr === '100%' || heightAttr === '100%';\n\n let translateMatrix = '';\n let widthDiff = 0;\n let heightDiff = 0;\n\n if (missingViewBox) {\n if (\n (x || y) &&\n element.parentNode &&\n element.parentNode.nodeName !== '#document'\n ) {\n translateMatrix =\n ' translate(' + parseUnit(x || '0') + ' ' + parseUnit(y || '0') + ') ';\n matrix = (element.getAttribute('transform') || '') + translateMatrix;\n element.setAttribute('transform', matrix);\n element.removeAttribute('x');\n element.removeAttribute('y');\n }\n }\n\n if (missingViewBox && missingDimAttr) {\n return {\n width: 0,\n height: 0,\n };\n }\n\n const parsedDim: ParsedViewboxTransform = {\n width: 0,\n height: 0,\n };\n\n if (missingViewBox) {\n parsedDim.width = parseUnit(widthAttr!);\n parsedDim.height = parseUnit(heightAttr!);\n // set a transform for elements that have x y and are inner(only) SVGs\n return parsedDim;\n }\n\n const pasedViewBox = viewBoxAttr.match(reViewBoxAttrValue)!;\n minX = -parseFloat(pasedViewBox[1]);\n minY = -parseFloat(pasedViewBox[2]);\n const viewBoxWidth = parseFloat(pasedViewBox[3]);\n const viewBoxHeight = parseFloat(pasedViewBox[4]);\n parsedDim.minX = minX;\n parsedDim.minY = minY;\n parsedDim.viewBoxWidth = viewBoxWidth;\n parsedDim.viewBoxHeight = viewBoxHeight;\n if (!missingDimAttr) {\n parsedDim.width = parseUnit(widthAttr);\n parsedDim.height = parseUnit(heightAttr);\n scaleX = parsedDim.width / viewBoxWidth;\n scaleY = parsedDim.height / viewBoxHeight;\n } else {\n parsedDim.width = viewBoxWidth;\n parsedDim.height = viewBoxHeight;\n }\n\n // default is to preserve aspect ratio\n const preserveAspectRatio = parsePreserveAspectRatioAttribute(\n element.getAttribute('preserveAspectRatio') || '',\n );\n if (preserveAspectRatio.alignX !== NONE) {\n //translate all container for the effect of Mid, Min, Max\n if (preserveAspectRatio.meetOrSlice === 'meet') {\n scaleY = scaleX = scaleX > scaleY ? scaleY : scaleX;\n // calculate additional translation to move the viewbox\n }\n if (preserveAspectRatio.meetOrSlice === 'slice') {\n scaleY = scaleX = scaleX > scaleY ? scaleX : scaleY;\n // calculate additional translation to move the viewbox\n }\n widthDiff = parsedDim.width - viewBoxWidth * scaleX;\n heightDiff = parsedDim.height - viewBoxHeight * scaleX;\n if (preserveAspectRatio.alignX === 'Mid') {\n widthDiff /= 2;\n }\n if (preserveAspectRatio.alignY === 'Mid') {\n heightDiff /= 2;\n }\n if (preserveAspectRatio.alignX === 'Min') {\n widthDiff = 0;\n }\n if (preserveAspectRatio.alignY === 'Min') {\n heightDiff = 0;\n }\n }\n\n if (\n scaleX === 1 &&\n scaleY === 1 &&\n minX === 0 &&\n minY === 0 &&\n x === 0 &&\n y === 0\n ) {\n return parsedDim;\n }\n if ((x || y) && element.parentNode!.nodeName !== '#document') {\n translateMatrix =\n ' translate(' + parseUnit(x || '0') + ' ' + parseUnit(y || '0') + ') ';\n }\n\n matrix =\n translateMatrix +\n ' matrix(' +\n scaleX +\n ' 0' +\n ' 0 ' +\n scaleY +\n ' ' +\n (minX * scaleX + widthDiff) +\n ' ' +\n (minY * scaleY + heightDiff) +\n ') ';\n // seems unused.\n // parsedDim.viewboxTransform = parseTransformAttribute(matrix);\n if (element.nodeName === 'svg') {\n el = element.ownerDocument.createElementNS(svgNS, 'g');\n // element.firstChild != null\n while (element.firstChild) {\n el.appendChild(element.firstChild);\n }\n element.appendChild(el);\n } else {\n el = element;\n el.removeAttribute('x');\n el.removeAttribute('y');\n matrix = el.getAttribute('transform') + matrix;\n }\n el.setAttribute('transform', matrix);\n return parsedDim;\n}\n","export const getTagName = (node: Element) => node.tagName.replace('svg:', '');\n","import { svgInvalidAncestors } from './constants';\nimport { getSvgRegex } from './getSvgRegex';\nimport { getTagName } from './getTagName';\n\nconst svgInvalidAncestorsRegEx = getSvgRegex(svgInvalidAncestors);\n\nexport function hasInvalidAncestor(element: Element) {\n let _element: Element | null = element;\n while (_element && (_element = _element.parentElement)) {\n if (\n _element &&\n _element.nodeName &&\n svgInvalidAncestorsRegEx.test(getTagName(_element)) &&\n !_element.getAttribute('instantiated_by_use')\n ) {\n return true;\n }\n }\n return false;\n}\n","export function getMultipleNodes(\n doc: Document,\n nodeNames: string[],\n): Element[] {\n let nodeName,\n nodeArray: Element[] = [],\n nodeList,\n i,\n len;\n for (i = 0, len = nodeNames.length; i < len; i++) {\n nodeName = nodeNames[i];\n nodeList = doc.getElementsByTagNameNS(\n 'http://www.w3.org/2000/svg',\n nodeName,\n );\n nodeArray = nodeArray.concat(Array.from(nodeList));\n }\n return nodeArray;\n}\n","import { svgNS } from './constants';\nimport { getMultipleNodes } from './getMultipleNodes';\nimport { applyViewboxTransform } from './applyViewboxTransform';\nimport { parseStyleString } from './parseStyleString';\n\nexport function parseUseDirectives(doc: Document) {\n const nodelist = getMultipleNodes(doc, ['use', 'svg:use']);\n const skipAttributes = ['x', 'y', 'xlink:href', 'href', 'transform'];\n\n for (const useElement of nodelist) {\n const useAttributes: NamedNodeMap = useElement.attributes;\n\n const useAttrMap: Record = {};\n for (const attr of useAttributes) {\n attr.value && (useAttrMap[attr.name] = attr.value);\n }\n\n const xlink = (useAttrMap['xlink:href'] || useAttrMap.href || '').slice(1);\n\n if (xlink === '') {\n return;\n }\n const referencedElement = doc.getElementById(xlink);\n if (referencedElement === null) {\n // if we can't find the target of the xlink, consider this use tag bad, similar to no xlink\n return;\n }\n let clonedOriginal = referencedElement.cloneNode(true) as Element;\n\n const originalAttributes: NamedNodeMap = clonedOriginal.attributes;\n\n const originalAttrMap: Record = {};\n for (const attr of originalAttributes) {\n attr.value && (originalAttrMap[attr.name] = attr.value);\n }\n\n // Transform attribute needs to be merged in a particular way\n const { x = 0, y = 0, transform = '' } = useAttrMap;\n const currentTrans = `${transform} ${\n originalAttrMap.transform || ''\n } translate(${x}, ${y})`;\n\n applyViewboxTransform(clonedOriginal);\n\n if (/^svg$/i.test(clonedOriginal.nodeName)) {\n // if is an SVG, create a group and apply all the attributes on top of it\n const el3 = clonedOriginal.ownerDocument.createElementNS(svgNS, 'g');\n Object.entries(originalAttrMap).forEach(([name, value]) =>\n el3.setAttributeNS(svgNS, name, value),\n );\n el3.append(...clonedOriginal.childNodes);\n clonedOriginal = el3;\n }\n\n for (const attr of useAttributes) {\n if (!attr) {\n continue;\n }\n const { name, value } = attr;\n if (skipAttributes.includes(name)) {\n continue;\n }\n\n if (name === 'style') {\n // when use has a style, merge the two styles, with the ref being priority (not use)\n // priority is by feature. an attribute for fill on the original element\n // will overwrite the fill in style or attribute for tha use\n const styleRecord: Record = {};\n parseStyleString(value, styleRecord);\n // cleanup styleRecord from attributes of original\n Object.entries(originalAttrMap).forEach(([name, value]) => {\n styleRecord[name] = value;\n });\n // now we can put in the style of the original that will overwrite the original attributes\n parseStyleString(originalAttrMap.style || '', styleRecord);\n const mergedStyles = Object.entries(styleRecord)\n .map((entry) => entry.join(':'))\n .join(';');\n clonedOriginal.setAttribute(name, mergedStyles);\n } else {\n // set the attribute from use element only if the original does not have it already\n !originalAttrMap[name] && clonedOriginal.setAttribute(name, value);\n }\n }\n\n clonedOriginal.setAttribute('transform', currentTrans);\n clonedOriginal.setAttribute('instantiated_by_use', '1');\n clonedOriginal.removeAttribute('id');\n useElement.parentNode!.replaceChild(clonedOriginal, useElement);\n }\n}\n","const gradientsAttrs = [\n 'gradientTransform',\n 'x1',\n 'x2',\n 'y1',\n 'y2',\n 'gradientUnits',\n 'cx',\n 'cy',\n 'r',\n 'fx',\n 'fy',\n];\nconst xlinkAttr = 'xlink:href';\n\nexport function recursivelyParseGradientsXlink(\n doc: Document,\n gradient: Element,\n) {\n const xLink = gradient.getAttribute(xlinkAttr)?.slice(1) || '',\n referencedGradient = doc.getElementById(xLink);\n if (referencedGradient && referencedGradient.getAttribute(xlinkAttr)) {\n recursivelyParseGradientsXlink(doc, referencedGradient as Element);\n }\n if (referencedGradient) {\n gradientsAttrs.forEach((attr) => {\n const value = referencedGradient.getAttribute(attr);\n if (!gradient.hasAttribute(attr) && value) {\n gradient.setAttribute(attr, value);\n }\n });\n if (!gradient.children.length) {\n const referenceClone = referencedGradient.cloneNode(true);\n while (referenceClone.firstChild) {\n gradient.appendChild(referenceClone.firstChild);\n }\n }\n }\n gradient.removeAttribute(xlinkAttr);\n}\n","import { getMultipleNodes } from './getMultipleNodes';\nimport { recursivelyParseGradientsXlink } from './recursivelyParseGradientsXlink';\n\nconst tagArray = [\n 'linearGradient',\n 'radialGradient',\n 'svg:linearGradient',\n 'svg:radialGradient',\n];\n\n/**\n * Parses an SVG document, returning all of the gradient declarations found in it\n * @param {SVGDocument} doc SVG document to parse\n * @return {Object} Gradient definitions; key corresponds to element id, value -- to gradient definition element\n */\nexport function getGradientDefs(\n doc: Document,\n): Record {\n const elList = getMultipleNodes(doc, tagArray);\n const gradientDefs: Record = {};\n let j = elList.length;\n while (j--) {\n const el = elList[j];\n if (el.getAttribute('xlink:href')) {\n recursivelyParseGradientsXlink(doc, el);\n }\n const id = el.getAttribute('id');\n if (id) {\n gradientDefs[id] = el as SVGGradientElement;\n }\n }\n return gradientDefs;\n}\n","import type { CSSRules } from './typedefs';\n\n/**\n * Returns CSS rules for a given SVG document\n * @param {HTMLElement} doc SVG document to parse\n * @return {Object} CSS rules of this document\n */\nexport function getCSSRules(doc: Document) {\n const styles = doc.getElementsByTagName('style');\n const allRules: CSSRules = {};\n\n // very crude parsing of style contents\n for (let i = 0; i < styles.length; i++) {\n const styleContents = (styles[i].textContent || '').replace(\n // remove comments\n /\\/\\*[\\s\\S]*?\\*\\//g,\n '',\n );\n\n if (styleContents.trim() === '') {\n continue;\n }\n // recovers all the rule in this form `body { style code... }`\n // rules = styleContents.match(/[^{]*\\{[\\s\\S]*?\\}/g);\n styleContents\n .split('}')\n // remove empty rules and remove everything if we didn't split in at least 2 pieces\n .filter((rule, index, array) => array.length > 1 && rule.trim())\n // at this point we have hopefully an array of rules `body { style code... `\n .forEach((rule) => {\n // if there is more than one opening bracket and the rule starts with '@', it is likely\n // a nested at-rule like @media, @supports, @scope, etc. Ignore these as the code below\n // can not handle it.\n if (\n (rule.match(/{/g) || []).length > 1 &&\n rule.trim().startsWith('@')\n ) {\n return;\n }\n\n const match = rule.split('{'),\n ruleObj: Record = {},\n declaration = match[1].trim(),\n propertyValuePairs = declaration.split(';').filter(function (pair) {\n return pair.trim();\n });\n\n for (let j = 0; j < propertyValuePairs.length; j++) {\n const pair = propertyValuePairs[j].split(':'),\n property = pair[0].trim(),\n value = pair[1].trim();\n ruleObj[property] = value;\n }\n rule = match[0].trim();\n rule.split(',').forEach((_rule) => {\n _rule = _rule.replace(/^svg/i, '').trim();\n if (_rule === '') {\n return;\n }\n allRules[_rule] = {\n ...(allRules[_rule] || {}),\n ...ruleObj,\n };\n });\n });\n }\n return allRules;\n}\n","import { Gradient } from '../gradient/Gradient';\nimport { Group } from '../shapes/Group';\nimport { FabricImage } from '../shapes/Image';\nimport { classRegistry } from '../ClassRegistry';\nimport {\n invertTransform,\n multiplyTransformMatrices,\n qrDecompose,\n} from '../util/misc/matrix';\nimport { removeTransformMatrixForSvgParsing } from '../util/transform_matrix_removal';\nimport type { FabricObject } from '../shapes/Object/FabricObject';\nimport { Point } from '../Point';\nimport { CENTER, FILL, STROKE } from '../constants';\nimport { getGradientDefs } from './getGradientDefs';\nimport { getCSSRules } from './getCSSRules';\nimport type { LoadImageOptions } from '../util';\nimport type { CSSRules, TSvgReviverCallback } from './typedefs';\nimport type { ParsedViewboxTransform } from './applyViewboxTransform';\nimport type { SVGOptions } from '../gradient';\nimport { getTagName } from './getTagName';\nimport { parseTransformAttribute } from './parseTransformAttribute';\n\nconst findTag = (el: Element) =>\n classRegistry.getSVGClass(getTagName(el).toLowerCase());\n\ntype StorageType = {\n fill: SVGGradientElement;\n stroke: SVGGradientElement;\n clipPath: Element[];\n};\n\ntype NotParsedFabricObject = FabricObject & {\n fill: string;\n stroke: string;\n clipPath?: string;\n clipRule?: CanvasFillRule;\n};\n\nexport class ElementsParser {\n declare elements: Element[];\n declare options: LoadImageOptions & ParsedViewboxTransform;\n declare reviver?: TSvgReviverCallback;\n declare regexUrl: RegExp;\n declare doc: Document;\n declare clipPaths: Record;\n declare gradientDefs: Record;\n declare cssRules: CSSRules;\n\n constructor(\n elements: Element[],\n options: LoadImageOptions & ParsedViewboxTransform,\n reviver: TSvgReviverCallback | undefined,\n doc: Document,\n clipPaths: Record,\n ) {\n this.elements = elements;\n this.options = options;\n this.reviver = reviver;\n this.regexUrl = /^url\\(['\"]?#([^'\"]+)['\"]?\\)/g;\n this.doc = doc;\n this.clipPaths = clipPaths;\n this.gradientDefs = getGradientDefs(doc);\n this.cssRules = getCSSRules(doc);\n }\n\n parse(): Promise> {\n return Promise.all(\n this.elements.map((element) => this.createObject(element)),\n );\n }\n\n async createObject(el: Element): Promise {\n const klass = findTag(el);\n if (klass) {\n const obj: NotParsedFabricObject = await klass.fromElement(\n el,\n this.options,\n this.cssRules,\n );\n this.resolveGradient(obj, el, FILL);\n this.resolveGradient(obj, el, STROKE);\n if (obj instanceof FabricImage && obj._originalElement) {\n removeTransformMatrixForSvgParsing(\n obj,\n obj.parsePreserveAspectRatioAttribute(),\n );\n } else {\n removeTransformMatrixForSvgParsing(obj);\n }\n await this.resolveClipPath(obj, el);\n this.reviver && this.reviver(el, obj);\n return obj;\n }\n return null;\n }\n\n extractPropertyDefinition(\n obj: NotParsedFabricObject,\n property: 'fill' | 'stroke' | 'clipPath',\n storage: Record,\n ): StorageType[typeof property] | undefined {\n const value = obj[property]!,\n regex = this.regexUrl;\n if (!regex.test(value)) {\n return undefined;\n }\n // verify: can we remove the 'g' flag? and remove lastIndex changes?\n regex.lastIndex = 0;\n // we passed the regex test, so we know is not null;\n const id = regex.exec(value)![1];\n regex.lastIndex = 0;\n // @todo fix this\n return storage[id];\n }\n\n resolveGradient(\n obj: NotParsedFabricObject,\n el: Element,\n property: 'fill' | 'stroke',\n ) {\n const gradientDef = this.extractPropertyDefinition(\n obj,\n property,\n this.gradientDefs,\n ) as SVGGradientElement;\n if (gradientDef) {\n const opacityAttr = el.getAttribute(property + '-opacity');\n const gradient = Gradient.fromElement(gradientDef, obj, {\n ...this.options,\n opacity: opacityAttr,\n } as SVGOptions);\n obj.set(property, gradient);\n }\n }\n\n // TODO: resolveClipPath could be run once per clippath with minor work per object.\n // is a refactor that i m not sure is worth on this code\n async resolveClipPath(\n obj: NotParsedFabricObject,\n usingElement: Element,\n exactOwner?: Element,\n ) {\n const clipPathElements = this.extractPropertyDefinition(\n obj,\n 'clipPath',\n this.clipPaths,\n ) as Element[];\n if (clipPathElements) {\n const objTransformInv = invertTransform(obj.calcTransformMatrix());\n const clipPathTag = clipPathElements[0].parentElement!;\n let clipPathOwner = usingElement;\n while (\n !exactOwner &&\n clipPathOwner.parentElement &&\n clipPathOwner.getAttribute('clip-path') !== obj.clipPath\n ) {\n clipPathOwner = clipPathOwner.parentElement;\n }\n // move the clipPath tag as sibling to the real element that is using it\n clipPathOwner.parentElement!.appendChild(clipPathTag);\n\n // this multiplication order could be opposite.\n // but i don't have an svg to test it\n // at the first SVG that has a transform on both places and is misplaced\n // try to invert this multiplication order\n const finalTransform = parseTransformAttribute(\n `${clipPathOwner.getAttribute('transform') || ''} ${\n clipPathTag.getAttribute('originalTransform') || ''\n }`,\n );\n\n clipPathTag.setAttribute(\n 'transform',\n `matrix(${finalTransform.join(',')})`,\n );\n\n const container = await Promise.all(\n clipPathElements.map((clipPathElement) => {\n return findTag(clipPathElement)\n .fromElement(clipPathElement, this.options, this.cssRules)\n .then((enlivedClippath: NotParsedFabricObject) => {\n removeTransformMatrixForSvgParsing(enlivedClippath);\n enlivedClippath.fillRule = enlivedClippath.clipRule!;\n delete enlivedClippath.clipRule;\n return enlivedClippath;\n });\n }),\n );\n const clipPath =\n container.length === 1 ? container[0] : new Group(container);\n const gTransform = multiplyTransformMatrices(\n objTransformInv,\n clipPath.calcTransformMatrix(),\n );\n if (clipPath.clipPath) {\n await this.resolveClipPath(\n clipPath,\n clipPathOwner,\n // this is tricky.\n // it tries to differentiate from when clipPaths are inherited by outside groups\n // or when are really clipPaths referencing other clipPaths\n clipPathTag.getAttribute('clip-path') ? clipPathOwner : undefined,\n );\n }\n const { scaleX, scaleY, angle, skewX, translateX, translateY } =\n qrDecompose(gTransform);\n clipPath.set({\n flipX: false,\n flipY: false,\n });\n clipPath.set({\n scaleX,\n scaleY,\n angle,\n skewX,\n skewY: 0,\n });\n clipPath.setPositionByOrigin(\n new Point(translateX, translateY),\n CENTER,\n CENTER,\n );\n obj.clipPath = clipPath;\n } else {\n // if clip-path does not resolve to any element, delete the property.\n delete obj.clipPath;\n return;\n }\n }\n}\n","import { applyViewboxTransform } from './applyViewboxTransform';\nimport { svgValidTagNamesRegEx } from './constants';\nimport { hasInvalidAncestor } from './hasInvalidAncestor';\nimport { parseUseDirectives } from './parseUseDirectives';\nimport type { SVGParsingOutput, TSvgReviverCallback } from './typedefs';\nimport type { LoadImageOptions } from '../util/misc/objectEnlive';\nimport { ElementsParser } from './elements_parser';\nimport { log, SignalAbortedError } from '../util/internals/console';\nimport { getTagName } from './getTagName';\n\nconst isValidSvgTag = (el: Element) =>\n svgValidTagNamesRegEx.test(getTagName(el));\n\nexport const createEmptyResponse = (): SVGParsingOutput => ({\n objects: [],\n elements: [],\n options: {},\n allElements: [],\n});\n\n/**\n * Parses an SVG document, converts it to an array of corresponding fabric.* instances and passes them to a callback\n * @static\n * @function\n * @param {HTMLElement} doc SVG document to parse\n * @param {TSvgParsedCallback} callback Invoked when the parsing is done, with null if parsing wasn't possible with the list of svg nodes.\n * @param {TSvgReviverCallback} [reviver] Extra callback for further parsing of SVG elements, called after each fabric object has been created.\n * Takes as input the original svg element and the generated `FabricObject` as arguments. Used to inspect extra properties not parsed by fabric,\n * or extra custom manipulation\n * @param {Object} [options] Object containing options for parsing\n * @param {String} [options.crossOrigin] crossOrigin setting to use for external resources\n * @param {AbortSignal} [options.signal] handle aborting, see https://developer.mozilla.org/en-US/docs/Web/API/AbortController/signal\n * @return {SVGParsingOutput}\n * {@link SVGParsingOutput} also receives `allElements` array as the last argument. This is the full list of svg nodes available in the document.\n * You may want to use it if you are trying to regroup the objects as they were originally grouped in the SVG. ( This was the reason why it was added )\n */\nexport async function parseSVGDocument(\n doc: Document,\n reviver?: TSvgReviverCallback,\n { crossOrigin, signal }: LoadImageOptions = {},\n): Promise {\n if (signal && signal.aborted) {\n log('log', new SignalAbortedError('parseSVGDocument'));\n // this is an unhappy path, we dont care about speed\n return createEmptyResponse();\n }\n const documentElement = doc.documentElement;\n parseUseDirectives(doc);\n\n const descendants = Array.from(documentElement.getElementsByTagName('*')),\n options = {\n ...applyViewboxTransform(documentElement),\n crossOrigin,\n signal,\n };\n const elements = descendants.filter((el) => {\n applyViewboxTransform(el);\n return isValidSvgTag(el) && !hasInvalidAncestor(el); // http://www.w3.org/TR/SVG/struct.html#DefsElement\n });\n if (!elements || (elements && !elements.length)) {\n return {\n ...createEmptyResponse(),\n options,\n allElements: descendants,\n };\n }\n const localClipPaths: Record = {};\n descendants\n .filter((el) => getTagName(el) === 'clipPath')\n .forEach((el) => {\n el.setAttribute('originalTransform', el.getAttribute('transform') || '');\n const id = el.getAttribute('id')!;\n localClipPaths[id] = Array.from(el.getElementsByTagName('*')).filter(\n (el) => isValidSvgTag(el),\n );\n });\n\n // Precedence of rules: style > class > attribute\n const elementParser = new ElementsParser(\n elements,\n options,\n reviver,\n doc,\n localClipPaths,\n );\n\n const instances = await elementParser.parse();\n\n return {\n objects: instances,\n elements,\n options,\n allElements: descendants,\n };\n}\n","import { getFabricWindow } from '../env';\nimport type { LoadImageOptions } from '../util/misc/objectEnlive';\nimport { parseSVGDocument } from './parseSVGDocument';\nimport type { SVGParsingOutput, TSvgReviverCallback } from './typedefs';\n\n/**\n * Takes string corresponding to an SVG document, and parses it into a set of fabric objects\n * @param {String} string representing the svg\n * @param {TSvgParsedCallback} callback Invoked when the parsing is done, with null if parsing wasn't possible with the list of svg nodes.\n * {@link TSvgParsedCallback} also receives `allElements` array as the last argument. This is the full list of svg nodes available in the document.\n * You may want to use it if you are trying to regroup the objects as they were originally grouped in the SVG. ( This was the reason why it was added )\n * @param {TSvgReviverCallback} [reviver] Extra callback for further parsing of SVG elements, called after each fabric object has been created.\n * Takes as input the original svg element and the generated `FabricObject` as arguments. Used to inspect extra properties not parsed by fabric,\n * or extra custom manipulation\n * @param {Object} [options] Object containing options for parsing\n * @param {String} [options.crossOrigin] crossOrigin setting to use for external resources\n * @param {AbortSignal} [options.signal] handle aborting, see https://developer.mozilla.org/en-US/docs/Web/API/AbortController/signal\n */\nexport function loadSVGFromString(\n string: string,\n reviver?: TSvgReviverCallback,\n options?: LoadImageOptions,\n): Promise {\n const parser = new (getFabricWindow().DOMParser)(),\n // should we use `image/svg+xml` here?\n doc = parser.parseFromString(string.trim(), 'text/xml');\n return parseSVGDocument(doc, reviver, options);\n}\n","import { createEmptyResponse } from './parseSVGDocument';\nimport { loadSVGFromString } from './loadSVGFromString';\nimport type { SVGParsingOutput, TSvgReviverCallback } from './typedefs';\nimport type { LoadImageOptions } from '../util/misc/objectEnlive';\nimport { FabricError } from '../util/internals/console';\n\n/**\n * Takes url corresponding to an SVG document, and parses it into a set of fabric objects.\n * Note that SVG is fetched via fetch API, so it needs to conform to SOP (Same Origin Policy)\n * @param {string} url where the SVG is\n * @param {TSvgParsedCallback} callback Invoked when the parsing is done, with null if parsing wasn't possible with the list of svg nodes.\n * {@link TSvgParsedCallback} also receives `allElements` array as the last argument. This is the full list of svg nodes available in the document.\n * You may want to use it if you are trying to regroup the objects as they were originally grouped in the SVG. ( This was the reason why it was added )\n * @param {TSvgReviverCallback} [reviver] Extra callback for further parsing of SVG elements, called after each fabric object has been created.\n * Takes as input the original svg element and the generated `FabricObject` as arguments. Used to inspect extra properties not parsed by fabric,\n * or extra custom manipulation\n * @param {Object} [options] Object containing options for parsing\n * @param {String} [options.crossOrigin] crossOrigin setting to use for external resources\n * @param {AbortSignal} [options.signal] handle aborting, see https://developer.mozilla.org/en-US/docs/Web/API/AbortController/signal\n */\nexport function loadSVGFromURL(\n url: string,\n reviver?: TSvgReviverCallback,\n options: LoadImageOptions = {},\n): Promise {\n return fetch(url.replace(/^\\n\\s*/, '').trim(), {\n signal: options.signal,\n })\n .then((response) => {\n if (!response.ok) {\n throw new FabricError(`HTTP error! status: ${response.status}`);\n }\n return response.text();\n })\n .then((svgText) => {\n return loadSVGFromString(svgText, reviver, options);\n })\n .catch(() => {\n // this is an unhappy path, we dont care about speed\n return createEmptyResponse();\n });\n}\n","import { Point } from '../Point';\nimport { Control } from './Control';\nimport type { TMat2D } from '../typedefs';\nimport type { Polyline } from '../shapes/Polyline';\nimport { multiplyTransformMatrices } from '../util/misc/matrix';\nimport type {\n TModificationEvents,\n TPointerEvent,\n Transform,\n TransformActionHandler,\n} from '../EventTypeDefs';\nimport { wrapWithFireEvent } from './wrapWithFireEvent';\nimport { sendPointToPlane } from '../util/misc/planeChange';\nimport { MODIFY_POLY } from '../constants';\n\nconst ACTION_NAME: TModificationEvents = MODIFY_POLY;\n\ntype TTransformAnchor = Transform & { pointIndex: number };\n\n/**\n * This function locates the controls.\n * It'll be used both for drawing and for interaction.\n */\nexport const createPolyPositionHandler = (pointIndex: number) => {\n return function (dim: Point, finalMatrix: TMat2D, polyObject: Polyline) {\n const { points, pathOffset } = polyObject;\n return new Point(points[pointIndex])\n .subtract(pathOffset)\n .transform(\n multiplyTransformMatrices(\n polyObject.getViewportTransform(),\n polyObject.calcTransformMatrix(),\n ),\n );\n };\n};\n\n/**\n * This function defines what the control does.\n * It'll be called on every mouse move after a control has been clicked and is being dragged.\n * The function receives as argument the mouse event, the current transform object\n * and the current position in canvas coordinate `transform.target` is a reference to the\n * current object being transformed.\n */\nexport const polyActionHandler = (\n eventData: TPointerEvent,\n transform: TTransformAnchor,\n x: number,\n y: number,\n) => {\n const { target, pointIndex } = transform;\n const poly = target as Polyline;\n const mouseLocalPosition = sendPointToPlane(\n new Point(x, y),\n undefined,\n poly.calcOwnMatrix(),\n );\n\n poly.points[pointIndex] = mouseLocalPosition.add(poly.pathOffset);\n poly.setDimensions();\n poly.set('dirty', true);\n return true;\n};\n\n/**\n * Keep the polygon in the same position when we change its `width`/`height`/`top`/`left`.\n */\nexport const factoryPolyActionHandler = (\n pointIndex: number,\n fn: TransformActionHandler,\n) => {\n return function (\n eventData: TPointerEvent,\n transform: Transform,\n x: number,\n y: number,\n ) {\n const poly = transform.target as Polyline,\n anchorPoint = new Point(\n poly.points[(pointIndex > 0 ? pointIndex : poly.points.length) - 1],\n ),\n anchorPointInParentPlane = anchorPoint\n .subtract(poly.pathOffset)\n .transform(poly.calcOwnMatrix()),\n actionPerformed = fn(eventData, { ...transform, pointIndex }, x, y);\n\n const newAnchorPointInParentPlane = anchorPoint\n .subtract(poly.pathOffset)\n .transform(poly.calcOwnMatrix());\n\n const diff = newAnchorPointInParentPlane.subtract(anchorPointInParentPlane);\n poly.left -= diff.x;\n poly.top -= diff.y;\n\n return actionPerformed;\n };\n};\n\nexport const createPolyActionHandler = (pointIndex: number) =>\n wrapWithFireEvent(\n ACTION_NAME,\n factoryPolyActionHandler(pointIndex, polyActionHandler),\n );\n\nexport function createPolyControls(\n poly: Polyline,\n options?: Partial,\n): Record;\nexport function createPolyControls(\n numOfControls: number,\n options?: Partial,\n): Record;\nexport function createPolyControls(\n arg0: number | Polyline,\n options: Partial = {},\n) {\n const controls = {} as Record;\n for (\n let idx = 0;\n idx < (typeof arg0 === 'number' ? arg0 : arg0.points.length);\n idx++\n ) {\n controls[`p${idx}`] = new Control({\n actionName: ACTION_NAME,\n positionHandler: createPolyPositionHandler(idx),\n actionHandler: createPolyActionHandler(idx),\n ...options,\n });\n }\n return controls;\n}\n","import { Point } from '../Point';\nimport { Control } from './Control';\nimport type { TMat2D } from '../typedefs';\nimport type { Path } from '../shapes/Path';\nimport { multiplyTransformMatrices } from '../util/misc/matrix';\nimport type {\n TModificationEvents,\n TPointerEvent,\n Transform,\n} from '../EventTypeDefs';\nimport { sendPointToPlane } from '../util/misc/planeChange';\nimport type { TSimpleParseCommandType } from '../util/path/typedefs';\nimport type { ControlRenderingStyleOverride } from './controlRendering';\nimport { fireEvent } from './fireEvent';\nimport { commonEventInfo } from './util';\n\nconst ACTION_NAME: TModificationEvents = 'modifyPath' as const;\n\ntype TTransformAnchor = Transform;\n\nexport type PathPointControlStyle = {\n controlFill?: string;\n controlStroke?: string;\n connectionDashArray?: number[];\n};\n\nconst calcPathPointPosition = (\n pathObject: Path,\n commandIndex: number,\n pointIndex: number,\n) => {\n const { path, pathOffset } = pathObject;\n const command = path[commandIndex];\n return new Point(\n (command[pointIndex] as number) - pathOffset.x,\n (command[pointIndex + 1] as number) - pathOffset.y,\n ).transform(\n multiplyTransformMatrices(\n pathObject.getViewportTransform(),\n pathObject.calcTransformMatrix(),\n ),\n );\n};\n\nconst movePathPoint = (\n pathObject: Path,\n x: number,\n y: number,\n commandIndex: number,\n pointIndex: number,\n) => {\n const { path, pathOffset } = pathObject;\n\n const anchorCommand =\n path[(commandIndex > 0 ? commandIndex : path.length) - 1];\n const anchorPoint = new Point(\n anchorCommand[pointIndex] as number,\n anchorCommand[pointIndex + 1] as number,\n );\n\n const anchorPointInParentPlane = anchorPoint\n .subtract(pathOffset)\n .transform(pathObject.calcOwnMatrix());\n\n const mouseLocalPosition = sendPointToPlane(\n new Point(x, y),\n undefined,\n pathObject.calcOwnMatrix(),\n );\n\n path[commandIndex][pointIndex] = mouseLocalPosition.x + pathOffset.x;\n path[commandIndex][pointIndex + 1] = mouseLocalPosition.y + pathOffset.y;\n pathObject.setDimensions();\n\n const newAnchorPointInParentPlane = anchorPoint\n .subtract(pathObject.pathOffset)\n .transform(pathObject.calcOwnMatrix());\n\n const diff = newAnchorPointInParentPlane.subtract(anchorPointInParentPlane);\n pathObject.left -= diff.x;\n pathObject.top -= diff.y;\n pathObject.set('dirty', true);\n return true;\n};\n\n/**\n * This function locates the controls.\n * It'll be used both for drawing and for interaction.\n */\nfunction pathPositionHandler(\n this: PathPointControl,\n dim: Point,\n finalMatrix: TMat2D,\n pathObject: Path,\n) {\n const { commandIndex, pointIndex } = this;\n return calcPathPointPosition(pathObject, commandIndex, pointIndex);\n}\n\n/**\n * This function defines what the control does.\n * It'll be called on every mouse move after a control has been clicked and is being dragged.\n * The function receives as argument the mouse event, the current transform object\n * and the current position in canvas coordinate `transform.target` is a reference to the\n * current object being transformed.\n */\nfunction pathActionHandler(\n this: PathPointControl,\n eventData: TPointerEvent,\n transform: TTransformAnchor,\n x: number,\n y: number,\n) {\n const { target } = transform;\n const { commandIndex, pointIndex } = this;\n const actionPerformed = movePathPoint(\n target as Path,\n x,\n y,\n commandIndex,\n pointIndex,\n );\n if (actionPerformed) {\n fireEvent(this.actionName as TModificationEvents, {\n ...commonEventInfo(eventData, transform, x, y),\n commandIndex,\n pointIndex,\n });\n }\n return actionPerformed;\n}\n\nconst indexFromPrevCommand = (previousCommandType: TSimpleParseCommandType) =>\n previousCommandType === 'C' ? 5 : previousCommandType === 'Q' ? 3 : 1;\n\nclass PathPointControl extends Control {\n declare commandIndex: number;\n declare pointIndex: number;\n declare controlFill: string;\n declare controlStroke: string;\n constructor(options?: Partial) {\n super(options);\n }\n\n render(\n ctx: CanvasRenderingContext2D,\n left: number,\n top: number,\n styleOverride: ControlRenderingStyleOverride | undefined,\n fabricObject: Path,\n ) {\n const overrides: ControlRenderingStyleOverride = {\n ...styleOverride,\n cornerColor: this.controlFill,\n cornerStrokeColor: this.controlStroke,\n transparentCorners: !this.controlFill,\n };\n super.render(ctx, left, top, overrides, fabricObject);\n }\n}\n\nclass PathControlPointControl extends PathPointControl {\n declare connectionDashArray?: number[];\n declare connectToCommandIndex: number;\n declare connectToPointIndex: number;\n constructor(options?: Partial) {\n super(options);\n }\n\n render(\n this: PathControlPointControl,\n ctx: CanvasRenderingContext2D,\n left: number,\n top: number,\n styleOverride: ControlRenderingStyleOverride | undefined,\n fabricObject: Path,\n ) {\n const { path } = fabricObject;\n const {\n commandIndex,\n pointIndex,\n connectToCommandIndex,\n connectToPointIndex,\n } = this;\n ctx.save();\n ctx.strokeStyle = this.controlStroke;\n if (this.connectionDashArray) {\n ctx.setLineDash(this.connectionDashArray);\n }\n const [commandType] = path[commandIndex];\n const point = calcPathPointPosition(\n fabricObject,\n connectToCommandIndex,\n connectToPointIndex,\n );\n\n if (commandType === 'Q') {\n // one control point connects to 2 points\n const point2 = calcPathPointPosition(\n fabricObject,\n commandIndex,\n pointIndex + 2,\n );\n ctx.moveTo(point2.x, point2.y);\n ctx.lineTo(left, top);\n } else {\n ctx.moveTo(left, top);\n }\n ctx.lineTo(point.x, point.y);\n ctx.stroke();\n ctx.restore();\n\n super.render(ctx, left, top, styleOverride, fabricObject);\n }\n}\n\nconst createControl = (\n commandIndexPos: number,\n pointIndexPos: number,\n isControlPoint: boolean,\n options: Partial & {\n controlPointStyle?: PathPointControlStyle;\n pointStyle?: PathPointControlStyle;\n },\n connectToCommandIndex?: number,\n connectToPointIndex?: number,\n) =>\n new (isControlPoint ? PathControlPointControl : PathPointControl)({\n commandIndex: commandIndexPos,\n pointIndex: pointIndexPos,\n actionName: ACTION_NAME,\n positionHandler: pathPositionHandler,\n actionHandler: pathActionHandler,\n connectToCommandIndex,\n connectToPointIndex,\n ...options,\n ...(isControlPoint ? options.controlPointStyle : options.pointStyle),\n } as Partial);\n\nexport function createPathControls(\n path: Path,\n options: Partial & {\n controlPointStyle?: PathPointControlStyle;\n pointStyle?: PathPointControlStyle;\n } = {},\n): Record {\n const controls = {} as Record;\n let previousCommandType: TSimpleParseCommandType = 'M';\n path.path.forEach((command, commandIndex) => {\n const commandType = command[0];\n\n if (commandType !== 'Z') {\n controls[`c_${commandIndex}_${commandType}`] = createControl(\n commandIndex,\n command.length - 2,\n false,\n options,\n );\n }\n switch (commandType) {\n case 'C':\n controls[`c_${commandIndex}_C_CP_1`] = createControl(\n commandIndex,\n 1,\n true,\n options,\n commandIndex - 1,\n indexFromPrevCommand(previousCommandType),\n );\n controls[`c_${commandIndex}_C_CP_2`] = createControl(\n commandIndex,\n 3,\n true,\n options,\n commandIndex,\n 5,\n );\n break;\n case 'Q':\n controls[`c_${commandIndex}_Q_CP_1`] = createControl(\n commandIndex,\n 1,\n true,\n options,\n commandIndex,\n 3,\n );\n break;\n }\n previousCommandType = commandType;\n });\n return controls;\n}\n","import { getFabricWindow } from '../env';\nimport { createCanvasElement, createCanvasElementFor } from '../util/misc/dom';\nimport { WebGLFilterBackend } from './WebGLFilterBackend';\nimport type { TWebGLPipelineState, T2DPipelineState } from './typedefs';\n\nexport const isWebGLPipelineState = (\n options: TWebGLPipelineState | T2DPipelineState,\n): options is TWebGLPipelineState => {\n return (options as TWebGLPipelineState).webgl !== undefined;\n};\n\n/**\n * Pick a method to copy data from GL context to 2d canvas. In some browsers using\n * drawImage should be faster, but is also bugged for a small combination of old hardware\n * and drivers.\n * putImageData is faster than drawImage for that specific operation.\n */\nexport const isPutImageFaster = (width: number, height: number): boolean => {\n const targetCanvas = createCanvasElementFor({ width, height });\n const sourceCanvas = createCanvasElement();\n const gl = sourceCanvas.getContext('webgl')!;\n // eslint-disable-next-line no-undef\n const imageBuffer = new ArrayBuffer(width * height * 4);\n\n const testContext = {\n imageBuffer: imageBuffer,\n } as unknown as Required;\n const testPipelineState = {\n destinationWidth: width,\n destinationHeight: height,\n targetCanvas: targetCanvas,\n } as unknown as TWebGLPipelineState;\n let startTime;\n\n startTime = getFabricWindow().performance.now();\n WebGLFilterBackend.prototype.copyGLTo2D.call(\n testContext,\n gl,\n testPipelineState,\n );\n const drawImageTime = getFabricWindow().performance.now() - startTime;\n\n startTime = getFabricWindow().performance.now();\n WebGLFilterBackend.prototype.copyGLTo2DPutImageData.call(\n testContext,\n gl,\n testPipelineState,\n );\n const putImageDataTime = getFabricWindow().performance.now() - startTime;\n\n return drawImageTime > putImageDataTime;\n};\n","export const highPsourceCode = `precision highp float`;\n\nexport const identityFragmentShader = `\n ${highPsourceCode};\n varying vec2 vTexCoord;\n uniform sampler2D uTexture;\n void main() {\n gl_FragColor = texture2D(uTexture, vTexCoord);\n }`;\n\nexport const vertexSource = `\n attribute vec2 aPosition;\n varying vec2 vTexCoord;\n void main() {\n vTexCoord = aPosition;\n gl_Position = vec4(aPosition * 2.0 - 1.0, 0.0, 1.0);\n }`;\n","import { getEnv } from '../env';\nimport type {\n T2DPipelineState,\n TWebGLAttributeLocationMap,\n TWebGLPipelineState,\n TWebGLProgramCacheItem,\n TWebGLUniformLocationMap,\n} from './typedefs';\nimport { isWebGLPipelineState } from './utils';\nimport {\n highPsourceCode,\n identityFragmentShader,\n vertexSource,\n} from './shaders/baseFilter';\nimport type { Abortable } from '../typedefs';\nimport { FabricError } from '../util/internals/console';\nimport { createCanvasElementFor } from '../util/misc/dom';\n\nconst regex = new RegExp(highPsourceCode, 'g');\n\nexport class BaseFilter<\n Name extends string,\n OwnProps extends Record = object,\n SerializedProps extends Record = OwnProps,\n> {\n /**\n * Filter type\n */\n get type(): Name {\n return (this.constructor as typeof BaseFilter).type as Name;\n }\n\n /**\n * The class type. Used to identify which class this is.\n * This is used for serialization purposes and internally it can be used\n * to identify classes. As a developer you could use `instance of Class`\n * but to avoid importing all the code and blocking tree shaking we try\n * to avoid doing that.\n */\n static type = 'BaseFilter';\n\n /**\n * Contains the uniform locations for the fragment shader.\n * uStepW and uStepH are handled by the BaseFilter, each filter class\n * needs to specify all the one that are needed\n */\n static uniformLocations: string[] = [];\n\n declare static defaults: Record;\n\n /**\n * Constructor\n * @param {Object} [options] Options object\n */\n constructor({\n type,\n ...options\n }: { type?: never } & Partial & Record = {}) {\n Object.assign(\n this,\n (this.constructor as typeof BaseFilter).defaults,\n options,\n );\n }\n\n protected getFragmentSource(): string {\n return identityFragmentShader;\n }\n\n getVertexSource(): string {\n return vertexSource;\n }\n\n /**\n * Compile this filter's shader program.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context to use for shader compilation.\n * @param {String} fragmentSource fragmentShader source for compilation\n * @param {String} vertexSource vertexShader source for compilation\n */\n createProgram(\n gl: WebGLRenderingContext,\n fragmentSource: string = this.getFragmentSource(),\n vertexSource: string = this.getVertexSource(),\n ) {\n const {\n WebGLProbe: { GLPrecision = 'highp' },\n } = getEnv();\n if (GLPrecision !== 'highp') {\n fragmentSource = fragmentSource.replace(\n regex,\n highPsourceCode.replace('highp', GLPrecision),\n );\n }\n const vertexShader = gl.createShader(gl.VERTEX_SHADER);\n const fragmentShader = gl.createShader(gl.FRAGMENT_SHADER);\n const program = gl.createProgram();\n\n if (!vertexShader || !fragmentShader || !program) {\n throw new FabricError(\n 'Vertex, fragment shader or program creation error',\n );\n }\n gl.shaderSource(vertexShader, vertexSource);\n gl.compileShader(vertexShader);\n if (!gl.getShaderParameter(vertexShader, gl.COMPILE_STATUS)) {\n throw new FabricError(\n `Vertex shader compile error for ${this.type}: ${gl.getShaderInfoLog(\n vertexShader,\n )}`,\n );\n }\n\n gl.shaderSource(fragmentShader, fragmentSource);\n gl.compileShader(fragmentShader);\n if (!gl.getShaderParameter(fragmentShader, gl.COMPILE_STATUS)) {\n throw new FabricError(\n `Fragment shader compile error for ${this.type}: ${gl.getShaderInfoLog(\n fragmentShader,\n )}`,\n );\n }\n\n gl.attachShader(program, vertexShader);\n gl.attachShader(program, fragmentShader);\n gl.linkProgram(program);\n if (!gl.getProgramParameter(program, gl.LINK_STATUS)) {\n throw new FabricError(\n `Shader link error for \"${this.type}\" ${gl.getProgramInfoLog(program)}`,\n );\n }\n\n const uniformLocations = this.getUniformLocations(gl, program) || {};\n uniformLocations.uStepW = gl.getUniformLocation(program, 'uStepW');\n uniformLocations.uStepH = gl.getUniformLocation(program, 'uStepH');\n\n return {\n program,\n attributeLocations: this.getAttributeLocations(gl, program),\n uniformLocations,\n };\n }\n\n /**\n * Return a map of attribute names to WebGLAttributeLocation objects.\n *\n * @param {WebGLRenderingContext} gl The canvas context used to compile the shader program.\n * @param {WebGLShaderProgram} program The shader program from which to take attribute locations.\n * @returns {Object} A map of attribute names to attribute locations.\n */\n getAttributeLocations(\n gl: WebGLRenderingContext,\n program: WebGLProgram,\n ): TWebGLAttributeLocationMap {\n return {\n aPosition: gl.getAttribLocation(program, 'aPosition'),\n };\n }\n\n /**\n * Return a map of uniform names to WebGLUniformLocation objects.\n *\n * @param {WebGLRenderingContext} gl The canvas context used to compile the shader program.\n * @param {WebGLShaderProgram} program The shader program from which to take uniform locations.\n * @returns {Object} A map of uniform names to uniform locations.\n */\n getUniformLocations(\n gl: WebGLRenderingContext,\n program: WebGLProgram,\n ): TWebGLUniformLocationMap {\n const locations = (this.constructor as unknown as typeof BaseFilter)\n .uniformLocations;\n\n const uniformLocations: Record = {};\n for (let i = 0; i < locations.length; i++) {\n uniformLocations[locations[i]] = gl.getUniformLocation(\n program,\n locations[i],\n );\n }\n return uniformLocations;\n }\n\n /**\n * Send attribute data from this filter to its shader program on the GPU.\n *\n * @param {WebGLRenderingContext} gl The canvas context used to compile the shader program.\n * @param {Object} attributeLocations A map of shader attribute names to their locations.\n */\n sendAttributeData(\n gl: WebGLRenderingContext,\n attributeLocations: Record,\n aPositionData: Float32Array,\n ) {\n const attributeLocation = attributeLocations.aPosition;\n const buffer = gl.createBuffer();\n gl.bindBuffer(gl.ARRAY_BUFFER, buffer);\n gl.enableVertexAttribArray(attributeLocation);\n gl.vertexAttribPointer(attributeLocation, 2, gl.FLOAT, false, 0, 0);\n gl.bufferData(gl.ARRAY_BUFFER, aPositionData, gl.STATIC_DRAW);\n }\n\n _setupFrameBuffer(options: TWebGLPipelineState) {\n const gl = options.context;\n if (options.passes > 1) {\n const width = options.destinationWidth;\n const height = options.destinationHeight;\n if (options.sourceWidth !== width || options.sourceHeight !== height) {\n gl.deleteTexture(options.targetTexture);\n options.targetTexture = options.filterBackend.createTexture(\n gl,\n width,\n height,\n );\n }\n gl.framebufferTexture2D(\n gl.FRAMEBUFFER,\n gl.COLOR_ATTACHMENT0,\n gl.TEXTURE_2D,\n options.targetTexture,\n 0,\n );\n } else {\n // draw last filter on canvas and not to framebuffer.\n gl.bindFramebuffer(gl.FRAMEBUFFER, null);\n gl.finish();\n }\n }\n\n _swapTextures(options: TWebGLPipelineState) {\n options.passes--;\n options.pass++;\n const temp = options.targetTexture;\n options.targetTexture = options.sourceTexture;\n options.sourceTexture = temp;\n }\n\n /**\n * Generic isNeutral implementation for one parameter based filters.\n * Used only in image applyFilters to discard filters that will not have an effect\n * on the image\n * Other filters may need their own version ( ColorMatrix, HueRotation, gamma, ComposedFilter )\n * @param {Object} options\n **/\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n isNeutralState(options?: any): boolean {\n return false;\n }\n\n /**\n * Apply this filter to the input image data provided.\n *\n * Determines whether to use WebGL or Canvas2D based on the options.webgl flag.\n *\n * @param {Object} options\n * @param {Number} options.passes The number of filters remaining to be executed\n * @param {Boolean} options.webgl Whether to use webgl to render the filter.\n * @param {WebGLTexture} options.sourceTexture The texture setup as the source to be filtered.\n * @param {WebGLTexture} options.targetTexture The texture where filtered output should be drawn.\n * @param {WebGLRenderingContext} options.context The GL context used for rendering.\n * @param {Object} options.programCache A map of compiled shader programs, keyed by filter type.\n */\n applyTo(options: TWebGLPipelineState | T2DPipelineState) {\n if (isWebGLPipelineState(options)) {\n this._setupFrameBuffer(options);\n this.applyToWebGL(options);\n this._swapTextures(options);\n } else {\n this.applyTo2d(options);\n }\n }\n\n applyTo2d(_options: T2DPipelineState): void {\n // override by subclass\n }\n\n /**\n * Returns a string that represent the current selected shader code for the filter.\n * Used to force recompilation when parameters change or to retrieve the shader from cache\n * @type string\n **/\n getCacheKey(): string {\n return this.type;\n }\n\n /**\n * Retrieves the cached shader.\n * @param {Object} options\n * @param {WebGLRenderingContext} options.context The GL context used for rendering.\n * @param {Object} options.programCache A map of compiled shader programs, keyed by filter type.\n * @return {WebGLProgram} the compiled program shader\n */\n retrieveShader(options: TWebGLPipelineState): TWebGLProgramCacheItem {\n const key = this.getCacheKey();\n if (!options.programCache[key]) {\n options.programCache[key] = this.createProgram(options.context);\n }\n return options.programCache[key];\n }\n\n /**\n * Apply this filter using webgl.\n *\n * @param {Object} options\n * @param {Number} options.passes The number of filters remaining to be executed\n * @param {Boolean} options.webgl Whether to use webgl to render the filter.\n * @param {WebGLTexture} options.originalTexture The texture of the original input image.\n * @param {WebGLTexture} options.sourceTexture The texture setup as the source to be filtered.\n * @param {WebGLTexture} options.targetTexture The texture where filtered output should be drawn.\n * @param {WebGLRenderingContext} options.context The GL context used for rendering.\n * @param {Object} options.programCache A map of compiled shader programs, keyed by filter type.\n */\n applyToWebGL(options: TWebGLPipelineState) {\n const gl = options.context;\n const shader = this.retrieveShader(options);\n if (options.pass === 0 && options.originalTexture) {\n gl.bindTexture(gl.TEXTURE_2D, options.originalTexture);\n } else {\n gl.bindTexture(gl.TEXTURE_2D, options.sourceTexture);\n }\n gl.useProgram(shader.program);\n this.sendAttributeData(gl, shader.attributeLocations, options.aPosition);\n\n gl.uniform1f(shader.uniformLocations.uStepW, 1 / options.sourceWidth);\n gl.uniform1f(shader.uniformLocations.uStepH, 1 / options.sourceHeight);\n\n this.sendUniformData(gl, shader.uniformLocations);\n gl.viewport(0, 0, options.destinationWidth, options.destinationHeight);\n gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4);\n }\n\n bindAdditionalTexture(\n gl: WebGLRenderingContext,\n texture: WebGLTexture,\n textureUnit: number,\n ) {\n gl.activeTexture(textureUnit);\n gl.bindTexture(gl.TEXTURE_2D, texture);\n // reset active texture to 0 as usual\n gl.activeTexture(gl.TEXTURE0);\n }\n\n unbindAdditionalTexture(gl: WebGLRenderingContext, textureUnit: number) {\n gl.activeTexture(textureUnit);\n gl.bindTexture(gl.TEXTURE_2D, null);\n gl.activeTexture(gl.TEXTURE0);\n }\n\n /**\n * Send uniform data from this filter to its shader program on the GPU.\n *\n * Intended to be overridden by subclasses.\n *\n * @param {WebGLRenderingContext} _gl The canvas context used to compile the shader program.\n * @param {Object} _uniformLocations A map of shader uniform names to their locations.\n */\n sendUniformData(\n _gl: WebGLRenderingContext,\n _uniformLocations: TWebGLUniformLocationMap,\n ): void {\n // override by subclass\n }\n\n /**\n * If needed by a 2d filter, this functions can create an helper canvas to be used\n * remember that options.targetCanvas is available for use till end of chain.\n */\n createHelpLayer(options: T2DPipelineState) {\n if (!options.helpLayer) {\n const { sourceWidth, sourceHeight } = options;\n const helpLayer = createCanvasElementFor({\n width: sourceWidth,\n height: sourceHeight,\n });\n options.helpLayer = helpLayer;\n }\n }\n\n /**\n * Returns object representation of an instance\n * It will automatically export the default values of a filter,\n * stored in the static defaults property.\n * @return {Object} Object representation of an instance\n */\n toObject(): { type: Name } & SerializedProps {\n const defaultKeys = Object.keys(\n (this.constructor as typeof BaseFilter).defaults || {},\n ) as (keyof SerializedProps)[];\n\n return {\n type: this.type,\n ...defaultKeys.reduce((acc, key) => {\n acc[key] = this[\n key as keyof this\n ] as unknown as (typeof acc)[typeof key];\n return acc;\n }, {} as SerializedProps),\n };\n }\n\n /**\n * Returns a JSON representation of an instance\n * @return {Object} JSON\n */\n toJSON() {\n // delegate, not alias\n return this.toObject();\n }\n\n static async fromObject(\n { type, ...filterOptions }: Record,\n _options?: Abortable,\n ): Promise> {\n return new this(filterOptions);\n }\n}\n","export const blendColorFragmentSource = {\n multiply: 'gl_FragColor.rgb *= uColor.rgb;\\n',\n screen:\n 'gl_FragColor.rgb = 1.0 - (1.0 - gl_FragColor.rgb) * (1.0 - uColor.rgb);\\n',\n add: 'gl_FragColor.rgb += uColor.rgb;\\n',\n difference: 'gl_FragColor.rgb = abs(gl_FragColor.rgb - uColor.rgb);\\n',\n subtract: 'gl_FragColor.rgb -= uColor.rgb;\\n',\n lighten: 'gl_FragColor.rgb = max(gl_FragColor.rgb, uColor.rgb);\\n',\n darken: 'gl_FragColor.rgb = min(gl_FragColor.rgb, uColor.rgb);\\n',\n exclusion:\n 'gl_FragColor.rgb += uColor.rgb - 2.0 * (uColor.rgb * gl_FragColor.rgb);\\n',\n overlay: `\n if (uColor.r < 0.5) {\n gl_FragColor.r *= 2.0 * uColor.r;\n } else {\n gl_FragColor.r = 1.0 - 2.0 * (1.0 - gl_FragColor.r) * (1.0 - uColor.r);\n }\n if (uColor.g < 0.5) {\n gl_FragColor.g *= 2.0 * uColor.g;\n } else {\n gl_FragColor.g = 1.0 - 2.0 * (1.0 - gl_FragColor.g) * (1.0 - uColor.g);\n }\n if (uColor.b < 0.5) {\n gl_FragColor.b *= 2.0 * uColor.b;\n } else {\n gl_FragColor.b = 1.0 - 2.0 * (1.0 - gl_FragColor.b) * (1.0 - uColor.b);\n }\n `,\n tint: `\n gl_FragColor.rgb *= (1.0 - uColor.a);\n gl_FragColor.rgb += uColor.rgb;\n `,\n} as const;\n","import { Color } from '../color/Color';\nimport { BaseFilter } from './BaseFilter';\nimport type { T2DPipelineState, TWebGLUniformLocationMap } from './typedefs';\nimport { classRegistry } from '../ClassRegistry';\nimport { blendColorFragmentSource } from './shaders/blendColor';\n\nexport type TBlendMode =\n | 'multiply'\n | 'add'\n | 'difference'\n | 'screen'\n | 'subtract'\n | 'darken'\n | 'lighten'\n | 'overlay'\n | 'exclusion'\n | 'tint';\n\ntype BlendColorOwnProps = {\n color: string;\n mode: TBlendMode;\n alpha: number;\n};\n\nexport const blendColorDefaultValues: BlendColorOwnProps = {\n color: '#F95C63',\n mode: 'multiply',\n alpha: 1,\n};\n\n/**\n * Color Blend filter class\n * @example\n * const filter = new BlendColor({\n * color: '#000',\n * mode: 'multiply'\n * });\n *\n * const filter = new BlendImage({\n * image: fabricImageObject,\n * mode: 'multiply'\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n * canvas.renderAll();\n */\nexport class BlendColor extends BaseFilter<'BlendColor', BlendColorOwnProps> {\n /**\n * Color to make the blend operation with. default to a reddish color since black or white\n * gives always strong result.\n * @type String\n **/\n declare color: BlendColorOwnProps['color'];\n\n /**\n * Blend mode for the filter: one of multiply, add, difference, screen, subtract,\n * darken, lighten, overlay, exclusion, tint.\n * @type String\n **/\n declare mode: BlendColorOwnProps['mode'];\n /**\n * alpha value. represent the strength of the blend color operation.\n * @type Number\n **/\n declare alpha: BlendColorOwnProps['alpha'];\n\n static defaults = blendColorDefaultValues;\n\n static type = 'BlendColor';\n\n static uniformLocations = ['uColor'];\n\n getCacheKey() {\n return `${this.type}_${this.mode}`;\n }\n\n protected getFragmentSource(): string {\n return `\n precision highp float;\n uniform sampler2D uTexture;\n uniform vec4 uColor;\n varying vec2 vTexCoord;\n void main() {\n vec4 color = texture2D(uTexture, vTexCoord);\n gl_FragColor = color;\n if (color.a > 0.0) {\n ${blendColorFragmentSource[this.mode]}\n }\n }\n `;\n }\n\n /**\n * Apply the Blend operation to a Uint8ClampedArray representing the pixels of an image.\n *\n * @param {Object} options\n * @param {ImageData} options.imageData The Uint8ClampedArray to be filtered.\n */\n applyTo2d({ imageData: { data } }: T2DPipelineState) {\n const source = new Color(this.color).getSource();\n const alpha = this.alpha;\n const tr = source[0] * alpha;\n const tg = source[1] * alpha;\n const tb = source[2] * alpha;\n const alpha1 = 1 - alpha;\n\n for (let i = 0; i < data.length; i += 4) {\n const r = data[i];\n const g = data[i + 1];\n const b = data[i + 2];\n let oR, oG, oB;\n switch (this.mode) {\n case 'multiply':\n oR = (r * tr) / 255;\n oG = (g * tg) / 255;\n oB = (b * tb) / 255;\n break;\n case 'screen':\n oR = 255 - ((255 - r) * (255 - tr)) / 255;\n oG = 255 - ((255 - g) * (255 - tg)) / 255;\n oB = 255 - ((255 - b) * (255 - tb)) / 255;\n break;\n case 'add':\n oR = r + tr;\n oG = g + tg;\n oB = b + tb;\n break;\n case 'difference':\n oR = Math.abs(r - tr);\n oG = Math.abs(g - tg);\n oB = Math.abs(b - tb);\n break;\n case 'subtract':\n oR = r - tr;\n oG = g - tg;\n oB = b - tb;\n break;\n case 'darken':\n oR = Math.min(r, tr);\n oG = Math.min(g, tg);\n oB = Math.min(b, tb);\n break;\n case 'lighten':\n oR = Math.max(r, tr);\n oG = Math.max(g, tg);\n oB = Math.max(b, tb);\n break;\n case 'overlay':\n oR =\n tr < 128\n ? (2 * r * tr) / 255\n : 255 - (2 * (255 - r) * (255 - tr)) / 255;\n oG =\n tg < 128\n ? (2 * g * tg) / 255\n : 255 - (2 * (255 - g) * (255 - tg)) / 255;\n oB =\n tb < 128\n ? (2 * b * tb) / 255\n : 255 - (2 * (255 - b) * (255 - tb)) / 255;\n break;\n case 'exclusion':\n oR = tr + r - (2 * tr * r) / 255;\n oG = tg + g - (2 * tg * g) / 255;\n oB = tb + b - (2 * tb * b) / 255;\n break;\n case 'tint':\n oR = tr + r * alpha1;\n oG = tg + g * alpha1;\n oB = tb + b * alpha1;\n }\n data[i] = oR;\n data[i + 1] = oG;\n data[i + 2] = oB;\n }\n }\n\n /**\n * Send data from this filter to its shader program's uniforms.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n */\n sendUniformData(\n gl: WebGLRenderingContext,\n uniformLocations: TWebGLUniformLocationMap,\n ) {\n const source = new Color(this.color).getSource();\n source[0] = (this.alpha * source[0]) / 255;\n source[1] = (this.alpha * source[1]) / 255;\n source[2] = (this.alpha * source[2]) / 255;\n source[3] = this.alpha;\n gl.uniform4fv(uniformLocations.uColor, source);\n }\n}\n\nclassRegistry.setClass(BlendColor);\n","import type { TBlendImageMode } from '../BlendImage';\n\nexport const fragmentSource: Record = {\n multiply: `\n precision highp float;\n uniform sampler2D uTexture;\n uniform sampler2D uImage;\n uniform vec4 uColor;\n varying vec2 vTexCoord;\n varying vec2 vTexCoord2;\n void main() {\n vec4 color = texture2D(uTexture, vTexCoord);\n vec4 color2 = texture2D(uImage, vTexCoord2);\n color.rgba *= color2.rgba;\n gl_FragColor = color;\n }\n `,\n mask: `\n precision highp float;\n uniform sampler2D uTexture;\n uniform sampler2D uImage;\n uniform vec4 uColor;\n varying vec2 vTexCoord;\n varying vec2 vTexCoord2;\n void main() {\n vec4 color = texture2D(uTexture, vTexCoord);\n vec4 color2 = texture2D(uImage, vTexCoord2);\n color.a = color2.a;\n gl_FragColor = color;\n }\n `,\n} as const;\n\nexport const vertexSource = `\n attribute vec2 aPosition;\n varying vec2 vTexCoord;\n varying vec2 vTexCoord2;\n uniform mat3 uTransformMatrix;\n void main() {\n vTexCoord = aPosition;\n vTexCoord2 = (uTransformMatrix * vec3(aPosition, 1.0)).xy;\n gl_Position = vec4(aPosition * 2.0 - 1.0, 0.0, 1.0);\n }\n ` as const;\n","import { FabricImage } from '../shapes/Image';\nimport { createCanvasElement } from '../util/misc/dom';\nimport { BaseFilter } from './BaseFilter';\nimport type {\n T2DPipelineState,\n TWebGLPipelineState,\n TWebGLUniformLocationMap,\n} from './typedefs';\nimport type { WebGLFilterBackend } from './WebGLFilterBackend';\nimport { classRegistry } from '../ClassRegistry';\nimport { fragmentSource, vertexSource } from './shaders/blendImage';\n\nexport type TBlendImageMode = 'multiply' | 'mask';\n\ntype BlendImageOwnProps = {\n mode: TBlendImageMode;\n alpha: number;\n};\n\nexport const blendImageDefaultValues: BlendImageOwnProps = {\n mode: 'multiply',\n alpha: 1,\n};\n\n/**\n * Image Blend filter class\n * @example\n * const filter = new filters.BlendColor({\n * color: '#000',\n * mode: 'multiply'\n * });\n *\n * const filter = new BlendImage({\n * image: fabricImageObject,\n * mode: 'multiply'\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n * canvas.renderAll();\n */\nexport class BlendImage extends BaseFilter<'BlendImage', BlendImageOwnProps> {\n /**\n * Image to make the blend operation with.\n **/\n declare image: FabricImage;\n\n /**\n * Blend mode for the filter: either 'multiply' or 'mask'. 'multiply' will\n * multiply the values of each channel (R, G, B, and A) of the filter image by\n * their corresponding values in the base image. 'mask' will only look at the\n * alpha channel of the filter image, and apply those values to the base\n * image's alpha channel.\n * @type String\n **/\n declare mode: BlendImageOwnProps['mode'];\n\n /**\n * alpha value. represent the strength of the blend image operation.\n * not implemented.\n **/\n declare alpha: BlendImageOwnProps['alpha'];\n\n static type = 'BlendImage';\n\n static defaults = blendImageDefaultValues;\n\n static uniformLocations = ['uTransformMatrix', 'uImage'];\n\n getCacheKey() {\n return `${this.type}_${this.mode}`;\n }\n\n getFragmentSource(): string {\n return fragmentSource[this.mode];\n }\n\n getVertexSource(): string {\n return vertexSource;\n }\n\n applyToWebGL(options: TWebGLPipelineState) {\n const gl = options.context,\n texture = this.createTexture(options.filterBackend, this.image);\n this.bindAdditionalTexture(gl, texture!, gl.TEXTURE1);\n super.applyToWebGL(options);\n this.unbindAdditionalTexture(gl, gl.TEXTURE1);\n }\n\n createTexture(backend: WebGLFilterBackend, image: FabricImage) {\n return backend.getCachedTexture(image.cacheKey, image.getElement());\n }\n\n /**\n * Calculate a transformMatrix to adapt the image to blend over\n * @param {Object} options\n * @param {WebGLRenderingContext} options.context The GL context used for rendering.\n * @param {Object} options.programCache A map of compiled shader programs, keyed by filter type.\n */\n calculateMatrix() {\n const image = this.image,\n { width, height } = image.getElement();\n return [\n 1 / image.scaleX,\n 0,\n 0,\n 0,\n 1 / image.scaleY,\n 0,\n -image.left / width,\n -image.top / height,\n 1,\n ];\n }\n\n /**\n * Apply the Blend operation to a Uint8ClampedArray representing the pixels of an image.\n *\n * @param {Object} options\n * @param {ImageData} options.imageData The Uint8ClampedArray to be filtered.\n */\n applyTo2d({\n imageData: { data, width, height },\n filterBackend: { resources },\n }: T2DPipelineState) {\n const image = this.image;\n if (!resources.blendImage) {\n resources.blendImage = createCanvasElement();\n }\n const canvas1 = resources.blendImage;\n const context = canvas1.getContext('2d')!;\n if (canvas1.width !== width || canvas1.height !== height) {\n canvas1.width = width;\n canvas1.height = height;\n } else {\n context.clearRect(0, 0, width, height);\n }\n context.setTransform(\n image.scaleX,\n 0,\n 0,\n image.scaleY,\n image.left,\n image.top,\n );\n context.drawImage(image.getElement(), 0, 0, width, height);\n const blendData = context.getImageData(0, 0, width, height).data;\n for (let i = 0; i < data.length; i += 4) {\n const r = data[i];\n const g = data[i + 1];\n const b = data[i + 2];\n const a = data[i + 3];\n\n const tr = blendData[i];\n const tg = blendData[i + 1];\n const tb = blendData[i + 2];\n const ta = blendData[i + 3];\n\n switch (this.mode) {\n case 'multiply':\n data[i] = (r * tr) / 255;\n data[i + 1] = (g * tg) / 255;\n data[i + 2] = (b * tb) / 255;\n data[i + 3] = (a * ta) / 255;\n break;\n case 'mask':\n data[i + 3] = ta;\n break;\n }\n }\n }\n\n /**\n * Send data from this filter to its shader program's uniforms.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n */\n sendUniformData(\n gl: WebGLRenderingContext,\n uniformLocations: TWebGLUniformLocationMap,\n ) {\n const matrix = this.calculateMatrix();\n gl.uniform1i(uniformLocations.uImage, 1); // texture unit 1.\n gl.uniformMatrix3fv(uniformLocations.uTransformMatrix, false, matrix);\n }\n\n /**\n * Returns object representation of an instance\n * TODO: Handle the possibility of missing image better.\n * As of now a BlendImage filter without image can't be used with fromObject\n * @return {Object} Object representation of an instance\n */\n toObject(): {\n type: 'BlendImage';\n image: ReturnType;\n } & BlendImageOwnProps {\n return {\n ...super.toObject(),\n image: this.image && this.image.toObject(),\n };\n }\n\n /**\n * Create filter instance from an object representation\n * @param {object} object Object to create an instance from\n * @param {object} [options]\n * @param {AbortSignal} [options.signal] handle aborting image loading, see https://developer.mozilla.org/en-US/docs/Web/API/AbortController/signal\n * @returns {Promise}\n */\n static async fromObject(\n { type, image, ...filterOptions }: Record,\n options: { signal: AbortSignal },\n ): Promise> {\n return FabricImage.fromObject(image, options).then(\n (enlivedImage) => new this({ ...filterOptions, image: enlivedImage }),\n );\n }\n}\n\nclassRegistry.setClass(BlendImage);\n","export const fragmentSource = `\n precision highp float;\n uniform sampler2D uTexture;\n uniform vec2 uDelta;\n varying vec2 vTexCoord;\n const float nSamples = 15.0;\n vec3 v3offset = vec3(12.9898, 78.233, 151.7182);\n float random(vec3 scale) {\n /* use the fragment position for a different seed per-pixel */\n return fract(sin(dot(gl_FragCoord.xyz, scale)) * 43758.5453);\n }\n void main() {\n vec4 color = vec4(0.0);\n float totalC = 0.0;\n float totalA = 0.0;\n float offset = random(v3offset);\n for (float t = -nSamples; t <= nSamples; t++) {\n float percent = (t + offset - 0.5) / nSamples;\n vec4 sample = texture2D(uTexture, vTexCoord + uDelta * percent);\n float weight = 1.0 - abs(percent);\n float alpha = weight * sample.a;\n color.rgb += sample.rgb * alpha;\n color.a += alpha;\n totalA += weight;\n totalC += alpha;\n }\n gl_FragColor.rgb = color.rgb / totalC;\n gl_FragColor.a = color.a / totalA;\n }\n ` as const;\n","import { BaseFilter } from './BaseFilter';\nimport type {\n TWebGLPipelineState,\n T2DPipelineState,\n TWebGLUniformLocationMap,\n} from './typedefs';\nimport { isWebGLPipelineState } from './utils';\nimport { classRegistry } from '../ClassRegistry';\nimport { fragmentSource } from './shaders/blur';\n\ntype BlurOwnProps = {\n blur: number;\n};\n\nexport const blurDefaultValues: BlurOwnProps = {\n blur: 0,\n};\n\n/**\n * Blur filter class\n * @example\n * const filter = new Blur({\n * blur: 0.5\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n * canvas.renderAll();\n */\nexport class Blur extends BaseFilter<'Blur', BlurOwnProps> {\n /**\n * blur value, in percentage of image dimensions.\n * specific to keep the image blur constant at different resolutions\n * range between 0 and 1.\n * @type Number\n */\n declare blur: BlurOwnProps['blur'];\n\n declare horizontal: boolean;\n declare aspectRatio: number;\n\n static type = 'Blur';\n\n static defaults = blurDefaultValues;\n\n static uniformLocations = ['uDelta'];\n\n getFragmentSource(): string {\n return fragmentSource;\n }\n\n applyTo(options: TWebGLPipelineState | T2DPipelineState) {\n if (isWebGLPipelineState(options)) {\n // this aspectRatio is used to give the same blur to vertical and horizontal\n this.aspectRatio = options.sourceWidth / options.sourceHeight;\n options.passes++;\n this._setupFrameBuffer(options);\n this.horizontal = true;\n this.applyToWebGL(options);\n this._swapTextures(options);\n this._setupFrameBuffer(options);\n this.horizontal = false;\n this.applyToWebGL(options);\n this._swapTextures(options);\n } else {\n this.applyTo2d(options);\n }\n }\n\n applyTo2d({ imageData: { data, width, height } }: T2DPipelineState) {\n // this code mimic the shader for output consistency\n // it samples 31 pixels across the image over a distance that depends from the blur value.\n this.aspectRatio = width / height;\n this.horizontal = true;\n let blurValue = this.getBlurValue() * width;\n const imageData = new Uint8ClampedArray(data);\n const samples = 15;\n const bytesInRow = 4 * width;\n for (let i = 0; i < data.length; i += 4) {\n let r = 0.0,\n g = 0.0,\n b = 0.0,\n a = 0.0,\n totalA = 0;\n const minIRow = i - (i % bytesInRow);\n const maxIRow = minIRow + bytesInRow;\n // for now let's keep noise out of the way\n // let pixelOffset = 0;\n // const offset = Math.random() * 3;\n // if (offset > 2) {\n // pixelOffset = 4;\n // } else if (offset < 1) {\n // pixelOffset = -4;\n // }\n for (let j = -samples + 1; j < samples; j++) {\n const percent = j / samples;\n const distance = Math.floor(blurValue * percent) * 4;\n const weight = 1 - Math.abs(percent);\n let sampledPixel = i + distance; // + pixelOffset;\n // try to implement edge mirroring\n if (sampledPixel < minIRow) {\n sampledPixel = minIRow;\n } else if (sampledPixel > maxIRow) {\n sampledPixel = maxIRow;\n }\n const localAlpha = data[sampledPixel + 3] * weight;\n r += data[sampledPixel] * localAlpha;\n g += data[sampledPixel + 1] * localAlpha;\n b += data[sampledPixel + 2] * localAlpha;\n a += localAlpha;\n totalA += weight;\n }\n imageData[i] = r / a;\n imageData[i + 1] = g / a;\n imageData[i + 2] = b / a;\n imageData[i + 3] = a / totalA;\n }\n this.horizontal = false;\n blurValue = this.getBlurValue() * height;\n for (let i = 0; i < imageData.length; i += 4) {\n let r = 0.0,\n g = 0.0,\n b = 0.0,\n a = 0.0,\n totalA = 0;\n const minIRow = i % bytesInRow;\n const maxIRow = imageData.length - bytesInRow + minIRow;\n // for now let's keep noise out of the way\n // let pixelOffset = 0;\n // const offset = Math.random() * 3;\n // if (offset > 2) {\n // pixelOffset = bytesInRow;\n // } else if (offset < 1) {\n // pixelOffset = -bytesInRow;\n // }\n for (let j = -samples + 1; j < samples; j++) {\n const percent = j / samples;\n const distance = Math.floor(blurValue * percent) * bytesInRow;\n const weight = 1 - Math.abs(percent);\n let sampledPixel = i + distance; // + pixelOffset;\n // try to implement edge mirroring\n if (sampledPixel < minIRow) {\n sampledPixel = minIRow;\n } else if (sampledPixel > maxIRow) {\n sampledPixel = maxIRow;\n }\n const localAlpha = imageData[sampledPixel + 3] * weight;\n r += imageData[sampledPixel] * localAlpha;\n g += imageData[sampledPixel + 1] * localAlpha;\n b += imageData[sampledPixel + 2] * localAlpha;\n a += localAlpha;\n totalA += weight;\n }\n data[i] = r / a;\n data[i + 1] = g / a;\n data[i + 2] = b / a;\n data[i + 3] = a / totalA;\n }\n }\n\n /**\n * Send data from this filter to its shader program's uniforms.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n */\n sendUniformData(\n gl: WebGLRenderingContext,\n uniformLocations: TWebGLUniformLocationMap,\n ) {\n const delta = this.chooseRightDelta();\n gl.uniform2fv(uniformLocations.uDelta, delta);\n }\n\n isNeutralState() {\n return this.blur === 0;\n }\n\n getBlurValue(): number {\n let blurScale = 1;\n const { horizontal, aspectRatio } = this;\n if (horizontal) {\n if (aspectRatio > 1) {\n // image is wide, i want to shrink radius horizontal\n blurScale = 1 / aspectRatio;\n }\n } else {\n if (aspectRatio < 1) {\n // image is tall, i want to shrink radius vertical\n blurScale = aspectRatio;\n }\n }\n return blurScale * this.blur * 0.12;\n }\n\n /**\n * choose right value of image percentage to blur with\n * @returns {Array} a numeric array with delta values\n */\n chooseRightDelta() {\n const blur = this.getBlurValue();\n return this.horizontal ? [blur, 0] : [0, blur];\n }\n}\n\nclassRegistry.setClass(Blur);\n","export const fragmentSource = `\n precision highp float;\n uniform sampler2D uTexture;\n uniform float uBrightness;\n varying vec2 vTexCoord;\n void main() {\n vec4 color = texture2D(uTexture, vTexCoord);\n color.rgb += uBrightness;\n gl_FragColor = color;\n }\n`;\n","import { BaseFilter } from './BaseFilter';\nimport type { T2DPipelineState, TWebGLUniformLocationMap } from './typedefs';\nimport { classRegistry } from '../ClassRegistry';\nimport { fragmentSource } from './shaders/brightness';\n\ntype BrightnessOwnProps = {\n brightness: number;\n};\n\nexport const brightnessDefaultValues: BrightnessOwnProps = {\n brightness: 0,\n};\n\n/**\n * Brightness filter class\n * @example\n * const filter = new Brightness({\n * brightness: 0.05\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n */\nexport class Brightness extends BaseFilter<'Brightness', BrightnessOwnProps> {\n /**\n * Brightness value, from -1 to 1.\n * translated to -255 to 255 for 2d\n * 0.0039215686 is the part of 1 that get translated to 1 in 2d\n * @param {Number} brightness\n */\n declare brightness: BrightnessOwnProps['brightness'];\n\n static type = 'Brightness';\n\n static defaults = brightnessDefaultValues;\n\n static uniformLocations = ['uBrightness'];\n\n getFragmentSource() {\n return fragmentSource;\n }\n\n /**\n * Apply the Brightness operation to a Uint8ClampedArray representing the pixels of an image.\n *\n * @param {Object} options\n * @param {ImageData} options.imageData The Uint8ClampedArray to be filtered.\n */\n applyTo2d({ imageData: { data } }: T2DPipelineState) {\n const brightness = Math.round(this.brightness * 255);\n for (let i = 0; i < data.length; i += 4) {\n data[i] += brightness;\n data[i + 1] += brightness;\n data[i + 2] += brightness;\n }\n }\n\n isNeutralState() {\n return this.brightness === 0;\n }\n\n /**\n * Send data from this filter to its shader program's uniforms.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n */\n sendUniformData(\n gl: WebGLRenderingContext,\n uniformLocations: TWebGLUniformLocationMap,\n ) {\n gl.uniform1f(uniformLocations.uBrightness, this.brightness);\n }\n}\n\nclassRegistry.setClass(Brightness);\n","export const fragmentSource = `\n precision highp float;\n uniform sampler2D uTexture;\n varying vec2 vTexCoord;\n uniform mat4 uColorMatrix;\n uniform vec4 uConstants;\n void main() {\n vec4 color = texture2D(uTexture, vTexCoord);\n color *= uColorMatrix;\n color += uConstants;\n gl_FragColor = color;\n }`;\n","import { BaseFilter } from './BaseFilter';\nimport type {\n T2DPipelineState,\n TMatColorMatrix,\n TWebGLUniformLocationMap,\n} from './typedefs';\nimport { classRegistry } from '../ClassRegistry';\nimport { fragmentSource } from './shaders/colorMatrix';\n\nexport type ColorMatrixOwnProps = {\n matrix: TMatColorMatrix;\n colorsOnly: boolean;\n};\n\nexport const colorMatrixDefaultValues: ColorMatrixOwnProps = {\n matrix: [1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0],\n colorsOnly: true,\n};\n\n/**\n * Color Matrix filter class\n * @see {@link http://fabricjs.com/image-filters|ImageFilters demo}\n * @see {@Link http://phoboslab.org/log/2013/11/fast-image-filters-with-webgl demo}\n * @example Kodachrome filter\n * const filter = new ColorMatrix({\n * matrix: [\n 1.1285582396593525, -0.3967382283601348, -0.03992559172921793, 0, 63.72958762196502,\n -0.16404339962244616, 1.0835251566291304, -0.05498805115633132, 0, 24.732407896706203,\n -0.16786010706155763, -0.5603416277695248, 1.6014850761964943, 0, 35.62982807460946,\n 0, 0, 0, 1, 0\n ]\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n */\nexport class ColorMatrix<\n Name extends string = 'ColorMatrix',\n OwnProps extends object = ColorMatrixOwnProps,\n SerializedProps extends object = ColorMatrixOwnProps,\n> extends BaseFilter {\n /**\n * Colormatrix for pixels.\n * array of 20 floats. Numbers in positions 4, 9, 14, 19 loose meaning\n * outside the -1, 1 range.\n * 0.0039215686 is the part of 1 that get translated to 1 in 2d\n * @param {Array} matrix array of 20 numbers.\n */\n declare matrix: ColorMatrixOwnProps['matrix'];\n\n /**\n * Lock the colormatrix on the color part, skipping alpha, mainly for non webgl scenario\n * to save some calculation\n * @type Boolean\n * @default true\n */\n declare colorsOnly: ColorMatrixOwnProps['colorsOnly'];\n\n static type = 'ColorMatrix';\n\n static defaults = colorMatrixDefaultValues;\n\n static uniformLocations = ['uColorMatrix', 'uConstants'];\n\n getFragmentSource(): string {\n return fragmentSource;\n }\n\n /**\n * Apply the ColorMatrix operation to a Uint8Array representing the pixels of an image.\n *\n * @param {Object} options\n * @param {ImageData} options.imageData The Uint8Array to be filtered.\n */\n applyTo2d(options: T2DPipelineState) {\n const imageData = options.imageData,\n data = imageData.data,\n m = this.matrix,\n colorsOnly = this.colorsOnly;\n\n for (let i = 0; i < data.length; i += 4) {\n const r = data[i];\n const g = data[i + 1];\n const b = data[i + 2];\n\n data[i] = r * m[0] + g * m[1] + b * m[2] + m[4] * 255;\n data[i + 1] = r * m[5] + g * m[6] + b * m[7] + m[9] * 255;\n data[i + 2] = r * m[10] + g * m[11] + b * m[12] + m[14] * 255;\n if (!colorsOnly) {\n const a = data[i + 3];\n data[i] += a * m[3];\n data[i + 1] += a * m[8];\n data[i + 2] += a * m[13];\n data[i + 3] =\n r * m[15] + g * m[16] + b * m[17] + a * m[18] + m[19] * 255;\n }\n }\n }\n\n /**\n * Send data from this filter to its shader program's uniforms.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n */\n sendUniformData(\n gl: WebGLRenderingContext,\n uniformLocations: TWebGLUniformLocationMap,\n ) {\n const m = this.matrix,\n matrix = [\n m[0],\n m[1],\n m[2],\n m[3],\n m[5],\n m[6],\n m[7],\n m[8],\n m[10],\n m[11],\n m[12],\n m[13],\n m[15],\n m[16],\n m[17],\n m[18],\n ],\n constants = [m[4], m[9], m[14], m[19]];\n gl.uniformMatrix4fv(uniformLocations.uColorMatrix, false, matrix);\n gl.uniform4fv(uniformLocations.uConstants, constants);\n }\n\n toObject(): { type: Name } & SerializedProps {\n return {\n ...super.toObject(),\n matrix: [...this.matrix] as TMatColorMatrix,\n };\n }\n}\n\nclassRegistry.setClass(ColorMatrix);\n","import { ColorMatrix } from './ColorMatrix';\nimport { classRegistry } from '../ClassRegistry';\nimport type { TMatColorMatrix } from './typedefs';\n\ntype FixedFiltersOwnProps = {\n colorsOnly: boolean;\n};\n\nexport function createColorMatrixFilter(key: string, matrix: TMatColorMatrix) {\n const newClass = class extends ColorMatrix<\n typeof key,\n FixedFiltersOwnProps,\n FixedFiltersOwnProps\n > {\n static type = key;\n\n static defaults = {\n colorsOnly: false,\n matrix,\n };\n\n toObject(): { type: string } & FixedFiltersOwnProps {\n return { type: this.type, colorsOnly: this.colorsOnly };\n }\n };\n classRegistry.setClass(newClass, key);\n return newClass as typeof ColorMatrix;\n}\n\nexport const Brownie = createColorMatrixFilter(\n 'Brownie',\n [\n 0.5997, 0.34553, -0.27082, 0, 0.186, -0.0377, 0.86095, 0.15059, 0, -0.1449,\n 0.24113, -0.07441, 0.44972, 0, -0.02965, 0, 0, 0, 1, 0,\n ],\n);\n\nexport const Vintage = createColorMatrixFilter(\n 'Vintage',\n [\n 0.62793, 0.32021, -0.03965, 0, 0.03784, 0.02578, 0.64411, 0.03259, 0,\n 0.02926, 0.0466, -0.08512, 0.52416, 0, 0.02023, 0, 0, 0, 1, 0,\n ],\n);\n\nexport const Kodachrome = createColorMatrixFilter(\n 'Kodachrome',\n [\n 1.12855, -0.39673, -0.03992, 0, 0.24991, -0.16404, 1.08352, -0.05498, 0,\n 0.09698, -0.16786, -0.56034, 1.60148, 0, 0.13972, 0, 0, 0, 1, 0,\n ],\n);\n\nexport const Technicolor = createColorMatrixFilter(\n 'Technicolor',\n [\n 1.91252, -0.85453, -0.09155, 0, 0.04624, -0.30878, 1.76589, -0.10601, 0,\n -0.27589, -0.2311, -0.75018, 1.84759, 0, 0.12137, 0, 0, 0, 1, 0,\n ],\n);\n\nexport const Polaroid = createColorMatrixFilter(\n 'Polaroid',\n [\n 1.438, -0.062, -0.062, 0, 0, -0.122, 1.378, -0.122, 0, 0, -0.016, -0.016,\n 1.483, 0, 0, 0, 0, 0, 1, 0,\n ],\n);\n\nexport const Sepia = createColorMatrixFilter(\n 'Sepia',\n [\n 0.393, 0.769, 0.189, 0, 0, 0.349, 0.686, 0.168, 0, 0, 0.272, 0.534, 0.131,\n 0, 0, 0, 0, 0, 1, 0,\n ],\n);\n\nexport const BlackWhite = createColorMatrixFilter(\n 'BlackWhite',\n [\n 1.5, 1.5, 1.5, 0, -1, 1.5, 1.5, 1.5, 0, -1, 1.5, 1.5, 1.5, 0, -1, 0, 0, 0,\n 1, 0,\n ],\n);\n","import { BaseFilter } from './BaseFilter';\nimport type { T2DPipelineState, TWebGLPipelineState } from './typedefs';\nimport { isWebGLPipelineState } from './utils';\nimport { classRegistry } from '../ClassRegistry';\n\ntype ComposedOwnProps = {\n subFilters: BaseFilter[];\n};\n\ntype ComposedSerializedProps = {\n subFilters: Record[];\n};\n\n/**\n * A container class that knows how to apply a sequence of filters to an input image.\n */\nexport class Composed extends BaseFilter<\n 'Composed',\n ComposedOwnProps,\n ComposedSerializedProps\n> {\n /**\n * A non sparse array of filters to apply\n */\n declare subFilters: ComposedOwnProps['subFilters'];\n\n static type = 'Composed';\n\n constructor(\n options: { subFilters?: BaseFilter[] } & Record = {},\n ) {\n super(options);\n this.subFilters = options.subFilters || [];\n }\n\n /**\n * Apply this container's filters to the input image provided.\n *\n * @param {Object} options\n * @param {Number} options.passes The number of filters remaining to be applied.\n */\n applyTo(options: TWebGLPipelineState | T2DPipelineState) {\n if (isWebGLPipelineState(options)) {\n options.passes += this.subFilters.length - 1;\n }\n this.subFilters.forEach((filter) => {\n filter.applyTo(options);\n });\n }\n\n /**\n * Serialize this filter into JSON.\n * @returns {Object} A JSON representation of this filter.\n */\n toObject() {\n return {\n type: this.type,\n subFilters: this.subFilters.map((filter) => filter.toObject()),\n };\n }\n\n isNeutralState() {\n return !this.subFilters.some((filter) => !filter.isNeutralState());\n }\n\n /**\n * Deserialize a JSON definition of a ComposedFilter into a concrete instance.\n * @param {oject} object Object to create an instance from\n * @param {object} [options]\n * @param {AbortSignal} [options.signal] handle aborting `BlendImage` filter loading, see https://developer.mozilla.org/en-US/docs/Web/API/AbortController/signal\n * @returns {Promise}\n */\n static fromObject(\n object: Record,\n options?: { signal: AbortSignal },\n ): Promise {\n return Promise.all(\n ((object.subFilters || []) as BaseFilter[]).map((filter) =>\n classRegistry\n .getClass(filter.type)\n .fromObject(filter, options),\n ),\n ).then((enlivedFilters) => new this({ subFilters: enlivedFilters }));\n }\n}\n\nclassRegistry.setClass(Composed);\n","export const fragmentSource = `\n precision highp float;\n uniform sampler2D uTexture;\n uniform float uContrast;\n varying vec2 vTexCoord;\n void main() {\n vec4 color = texture2D(uTexture, vTexCoord);\n float contrastF = 1.015 * (uContrast + 1.0) / (1.0 * (1.015 - uContrast));\n color.rgb = contrastF * (color.rgb - 0.5) + 0.5;\n gl_FragColor = color;\n }`;\n","import { BaseFilter } from './BaseFilter';\nimport type { T2DPipelineState, TWebGLUniformLocationMap } from './typedefs';\nimport { classRegistry } from '../ClassRegistry';\nimport { fragmentSource } from './shaders/constrast';\n\ntype ContrastOwnProps = {\n contrast: number;\n};\n\nexport const contrastDefaultValues: ContrastOwnProps = {\n contrast: 0,\n};\n\n/**\n * Contrast filter class\n * @example\n * const filter = new Contrast({\n * contrast: 0.25\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n */\nexport class Contrast extends BaseFilter<'Contrast', ContrastOwnProps> {\n /**\n * contrast value, range from -1 to 1.\n * @param {Number} contrast\n * @default 0\n */\n declare contrast: ContrastOwnProps['contrast'];\n\n static type = 'Contrast';\n\n static defaults = contrastDefaultValues;\n\n static uniformLocations = ['uContrast'];\n\n getFragmentSource() {\n return fragmentSource;\n }\n\n isNeutralState() {\n return this.contrast === 0;\n }\n\n /**\n * Apply the Contrast operation to a Uint8Array representing the pixels of an image.\n *\n * @param {Object} options\n * @param {ImageData} options.imageData The Uint8Array to be filtered.\n */\n applyTo2d({ imageData: { data } }: T2DPipelineState) {\n const contrast = Math.floor(this.contrast * 255),\n contrastF = (259 * (contrast + 255)) / (255 * (259 - contrast));\n\n for (let i = 0; i < data.length; i += 4) {\n data[i] = contrastF * (data[i] - 128) + 128;\n data[i + 1] = contrastF * (data[i + 1] - 128) + 128;\n data[i + 2] = contrastF * (data[i + 2] - 128) + 128;\n }\n }\n\n /**\n * Send data from this filter to its shader program's uniforms.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n */\n sendUniformData(\n gl: WebGLRenderingContext,\n uniformLocations: TWebGLUniformLocationMap,\n ) {\n gl.uniform1f(uniformLocations.uContrast, this.contrast);\n }\n}\n\nclassRegistry.setClass(Contrast);\n","export const fragmentSource = {\n Convolute_3_1: `\n precision highp float;\n uniform sampler2D uTexture;\n uniform float uMatrix[9];\n uniform float uStepW;\n uniform float uStepH;\n varying vec2 vTexCoord;\n void main() {\n vec4 color = vec4(0, 0, 0, 0);\n for (float h = 0.0; h < 3.0; h+=1.0) {\n for (float w = 0.0; w < 3.0; w+=1.0) {\n vec2 matrixPos = vec2(uStepW * (w - 1), uStepH * (h - 1));\n color += texture2D(uTexture, vTexCoord + matrixPos) * uMatrix[int(h * 3.0 + w)];\n }\n }\n gl_FragColor = color;\n }\n `,\n Convolute_3_0: `\n precision highp float;\n uniform sampler2D uTexture;\n uniform float uMatrix[9];\n uniform float uStepW;\n uniform float uStepH;\n varying vec2 vTexCoord;\n void main() {\n vec4 color = vec4(0, 0, 0, 1);\n for (float h = 0.0; h < 3.0; h+=1.0) {\n for (float w = 0.0; w < 3.0; w+=1.0) {\n vec2 matrixPos = vec2(uStepW * (w - 1.0), uStepH * (h - 1.0));\n color.rgb += texture2D(uTexture, vTexCoord + matrixPos).rgb * uMatrix[int(h * 3.0 + w)];\n }\n }\n float alpha = texture2D(uTexture, vTexCoord).a;\n gl_FragColor = color;\n gl_FragColor.a = alpha;\n }\n `,\n Convolute_5_1: `\n precision highp float;\n uniform sampler2D uTexture;\n uniform float uMatrix[25];\n uniform float uStepW;\n uniform float uStepH;\n varying vec2 vTexCoord;\n void main() {\n vec4 color = vec4(0, 0, 0, 0);\n for (float h = 0.0; h < 5.0; h+=1.0) {\n for (float w = 0.0; w < 5.0; w+=1.0) {\n vec2 matrixPos = vec2(uStepW * (w - 2.0), uStepH * (h - 2.0));\n color += texture2D(uTexture, vTexCoord + matrixPos) * uMatrix[int(h * 5.0 + w)];\n }\n }\n gl_FragColor = color;\n }\n `,\n Convolute_5_0: `\n precision highp float;\n uniform sampler2D uTexture;\n uniform float uMatrix[25];\n uniform float uStepW;\n uniform float uStepH;\n varying vec2 vTexCoord;\n void main() {\n vec4 color = vec4(0, 0, 0, 1);\n for (float h = 0.0; h < 5.0; h+=1.0) {\n for (float w = 0.0; w < 5.0; w+=1.0) {\n vec2 matrixPos = vec2(uStepW * (w - 2.0), uStepH * (h - 2.0));\n color.rgb += texture2D(uTexture, vTexCoord + matrixPos).rgb * uMatrix[int(h * 5.0 + w)];\n }\n }\n float alpha = texture2D(uTexture, vTexCoord).a;\n gl_FragColor = color;\n gl_FragColor.a = alpha;\n }\n `,\n Convolute_7_1: `\n precision highp float;\n uniform sampler2D uTexture;\n uniform float uMatrix[49];\n uniform float uStepW;\n uniform float uStepH;\n varying vec2 vTexCoord;\n void main() {\n vec4 color = vec4(0, 0, 0, 0);\n for (float h = 0.0; h < 7.0; h+=1.0) {\n for (float w = 0.0; w < 7.0; w+=1.0) {\n vec2 matrixPos = vec2(uStepW * (w - 3.0), uStepH * (h - 3.0));\n color += texture2D(uTexture, vTexCoord + matrixPos) * uMatrix[int(h * 7.0 + w)];\n }\n }\n gl_FragColor = color;\n }\n `,\n Convolute_7_0: `\n precision highp float;\n uniform sampler2D uTexture;\n uniform float uMatrix[49];\n uniform float uStepW;\n uniform float uStepH;\n varying vec2 vTexCoord;\n void main() {\n vec4 color = vec4(0, 0, 0, 1);\n for (float h = 0.0; h < 7.0; h+=1.0) {\n for (float w = 0.0; w < 7.0; w+=1.0) {\n vec2 matrixPos = vec2(uStepW * (w - 3.0), uStepH * (h - 3.0));\n color.rgb += texture2D(uTexture, vTexCoord + matrixPos).rgb * uMatrix[int(h * 7.0 + w)];\n }\n }\n float alpha = texture2D(uTexture, vTexCoord).a;\n gl_FragColor = color;\n gl_FragColor.a = alpha;\n }\n `,\n Convolute_9_1: `\n precision highp float;\n uniform sampler2D uTexture;\n uniform float uMatrix[81];\n uniform float uStepW;\n uniform float uStepH;\n varying vec2 vTexCoord;\n void main() {\n vec4 color = vec4(0, 0, 0, 0);\n for (float h = 0.0; h < 9.0; h+=1.0) {\n for (float w = 0.0; w < 9.0; w+=1.0) {\n vec2 matrixPos = vec2(uStepW * (w - 4.0), uStepH * (h - 4.0));\n color += texture2D(uTexture, vTexCoord + matrixPos) * uMatrix[int(h * 9.0 + w)];\n }\n }\n gl_FragColor = color;\n }\n `,\n Convolute_9_0: `\n precision highp float;\n uniform sampler2D uTexture;\n uniform float uMatrix[81];\n uniform float uStepW;\n uniform float uStepH;\n varying vec2 vTexCoord;\n void main() {\n vec4 color = vec4(0, 0, 0, 1);\n for (float h = 0.0; h < 9.0; h+=1.0) {\n for (float w = 0.0; w < 9.0; w+=1.0) {\n vec2 matrixPos = vec2(uStepW * (w - 4.0), uStepH * (h - 4.0));\n color.rgb += texture2D(uTexture, vTexCoord + matrixPos).rgb * uMatrix[int(h * 9.0 + w)];\n }\n }\n float alpha = texture2D(uTexture, vTexCoord).a;\n gl_FragColor = color;\n gl_FragColor.a = alpha;\n }\n `,\n};\n","import { BaseFilter } from './BaseFilter';\nimport type { T2DPipelineState, TWebGLUniformLocationMap } from './typedefs';\nimport { classRegistry } from '../ClassRegistry';\nimport { fragmentSource } from './shaders/convolute';\n\nexport type ConvoluteOwnProps = {\n opaque: boolean;\n matrix: number[];\n};\n\nexport const convoluteDefaultValues: ConvoluteOwnProps = {\n opaque: false,\n matrix: [0, 0, 0, 0, 1, 0, 0, 0, 0],\n};\n\n/**\n * Adapted from html5rocks article\n * @example Sharpen filter\n * const filter = new Convolute({\n * matrix: [ 0, -1, 0,\n * -1, 5, -1,\n * 0, -1, 0 ]\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n * canvas.renderAll();\n * @example Blur filter\n * const filter = new Convolute({\n * matrix: [ 1/9, 1/9, 1/9,\n * 1/9, 1/9, 1/9,\n * 1/9, 1/9, 1/9 ]\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n * canvas.renderAll();\n * @example Emboss filter\n * const filter = new Convolute({\n * matrix: [ 1, 1, 1,\n * 1, 0.7, -1,\n * -1, -1, -1 ]\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n * canvas.renderAll();\n * @example Emboss filter with opaqueness\n * const filter = new Convolute({\n * opaque: true,\n * matrix: [ 1, 1, 1,\n * 1, 0.7, -1,\n * -1, -1, -1 ]\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n * canvas.renderAll();\n */\nexport class Convolute extends BaseFilter<'Convolute', ConvoluteOwnProps> {\n /*\n * Opaque value (true/false)\n */\n declare opaque: ConvoluteOwnProps['opaque'];\n\n /*\n * matrix for the filter, max 9x9\n */\n declare matrix: ConvoluteOwnProps['matrix'];\n\n static type = 'Convolute';\n\n static defaults = convoluteDefaultValues;\n\n static uniformLocations = ['uMatrix', 'uOpaque', 'uHalfSize', 'uSize'];\n\n getCacheKey() {\n return `${this.type}_${Math.sqrt(this.matrix.length)}_${\n this.opaque ? 1 : 0\n }` as keyof typeof fragmentSource;\n }\n\n getFragmentSource() {\n return fragmentSource[this.getCacheKey()];\n }\n\n /**\n * Apply the Brightness operation to a Uint8ClampedArray representing the pixels of an image.\n *\n * @param {Object} options\n * @param {ImageData} options.imageData The Uint8ClampedArray to be filtered.\n */\n applyTo2d(options: T2DPipelineState) {\n const imageData = options.imageData,\n data = imageData.data,\n weights = this.matrix,\n side = Math.round(Math.sqrt(weights.length)),\n halfSide = Math.floor(side / 2),\n sw = imageData.width,\n sh = imageData.height,\n output = options.ctx.createImageData(sw, sh),\n dst = output.data,\n // go through the destination image pixels\n alphaFac = this.opaque ? 1 : 0;\n let r, g, b, a, dstOff, scx, scy, srcOff, wt, x, y, cx, cy;\n\n for (y = 0; y < sh; y++) {\n for (x = 0; x < sw; x++) {\n dstOff = (y * sw + x) * 4;\n // calculate the weighed sum of the source image pixels that\n // fall under the convolution matrix\n r = 0;\n g = 0;\n b = 0;\n a = 0;\n\n for (cy = 0; cy < side; cy++) {\n for (cx = 0; cx < side; cx++) {\n scy = y + cy - halfSide;\n scx = x + cx - halfSide;\n\n // eslint-disable-next-line max-depth\n if (scy < 0 || scy >= sh || scx < 0 || scx >= sw) {\n continue;\n }\n\n srcOff = (scy * sw + scx) * 4;\n wt = weights[cy * side + cx];\n\n r += data[srcOff] * wt;\n g += data[srcOff + 1] * wt;\n b += data[srcOff + 2] * wt;\n // eslint-disable-next-line max-depth\n if (!alphaFac) {\n a += data[srcOff + 3] * wt;\n }\n }\n }\n dst[dstOff] = r;\n dst[dstOff + 1] = g;\n dst[dstOff + 2] = b;\n if (!alphaFac) {\n dst[dstOff + 3] = a;\n } else {\n dst[dstOff + 3] = data[dstOff + 3];\n }\n }\n }\n options.imageData = output;\n }\n\n /**\n * Send data from this filter to its shader program's uniforms.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n */\n sendUniformData(\n gl: WebGLRenderingContext,\n uniformLocations: TWebGLUniformLocationMap,\n ) {\n gl.uniform1fv(uniformLocations.uMatrix, this.matrix);\n }\n\n /**\n * Returns object representation of an instance\n * @return {Object} Object representation of an instance\n */\n toObject() {\n return {\n ...super.toObject(),\n opaque: this.opaque,\n matrix: [...this.matrix],\n };\n }\n}\n\nclassRegistry.setClass(Convolute);\n","export const fragmentSource = `\n precision highp float;\n uniform sampler2D uTexture;\n uniform vec3 uGamma;\n varying vec2 vTexCoord;\n void main() {\n vec4 color = texture2D(uTexture, vTexCoord);\n vec3 correction = (1.0 / uGamma);\n color.r = pow(color.r, correction.r);\n color.g = pow(color.g, correction.g);\n color.b = pow(color.b, correction.b);\n gl_FragColor = color;\n gl_FragColor.rgb *= color.a;\n }\n`;\n","import { BaseFilter } from './BaseFilter';\nimport { classRegistry } from '../ClassRegistry';\nimport { fragmentSource } from './shaders/gamma';\nimport type { T2DPipelineState, TWebGLUniformLocationMap } from './typedefs';\n\nconst GAMMA = 'Gamma' as const;\n\nexport type GammaInput = [number, number, number];\n\nexport type GammaOwnProps = {\n gamma: GammaInput;\n};\n\nexport const gammaDefaultValues: GammaOwnProps = {\n gamma: [1, 1, 1],\n};\n\n/**\n * Gamma filter class\n * @example\n * const filter = new Gamma({\n * gamma: [1, 0.5, 2.1]\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n */\nexport class Gamma extends BaseFilter {\n /**\n * Gamma array value, from 0.01 to 2.2.\n * @param {Array} gamma\n */\n declare gamma: GammaOwnProps['gamma'];\n declare rgbValues?: {\n r: Uint8Array;\n g: Uint8Array;\n b: Uint8Array;\n };\n\n static type = GAMMA;\n\n static defaults = gammaDefaultValues;\n\n static uniformLocations = ['uGamma'];\n\n getFragmentSource() {\n return fragmentSource;\n }\n\n constructor(options: { gamma?: GammaInput } = {}) {\n super(options);\n this.gamma =\n options.gamma ||\n ((\n this.constructor as typeof Gamma\n ).defaults.gamma.concat() as GammaInput);\n }\n\n /**\n * Apply the Gamma operation to a Uint8Array representing the pixels of an image.\n *\n * @param {Object} options\n * @param {ImageData} options.imageData The Uint8Array to be filtered.\n */\n applyTo2d({ imageData: { data } }: T2DPipelineState) {\n const gamma = this.gamma,\n rInv = 1 / gamma[0],\n gInv = 1 / gamma[1],\n bInv = 1 / gamma[2];\n\n if (!this.rgbValues) {\n this.rgbValues = {\n r: new Uint8Array(256),\n g: new Uint8Array(256),\n b: new Uint8Array(256),\n };\n }\n\n // This is an optimization - pre-compute a look-up table for each color channel\n // instead of performing these pow calls for each pixel in the image.\n const rgb = this.rgbValues;\n for (let i = 0; i < 256; i++) {\n rgb.r[i] = Math.pow(i / 255, rInv) * 255;\n rgb.g[i] = Math.pow(i / 255, gInv) * 255;\n rgb.b[i] = Math.pow(i / 255, bInv) * 255;\n }\n for (let i = 0; i < data.length; i += 4) {\n data[i] = rgb.r[data[i]];\n data[i + 1] = rgb.g[data[i + 1]];\n data[i + 2] = rgb.b[data[i + 2]];\n }\n }\n\n /**\n * Send data from this filter to its shader program's uniforms.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n */\n sendUniformData(\n gl: WebGLRenderingContext,\n uniformLocations: TWebGLUniformLocationMap,\n ) {\n gl.uniform3fv(uniformLocations.uGamma, this.gamma);\n }\n\n isNeutralState() {\n const { gamma } = this;\n return gamma[0] === 1 && gamma[1] === 1 && gamma[2] === 1;\n }\n\n toObject(): { type: typeof GAMMA; gamma: GammaInput } {\n return {\n type: GAMMA,\n gamma: this.gamma.concat() as GammaInput,\n };\n }\n}\n\nclassRegistry.setClass(Gamma);\n","import type { TGrayscaleMode } from '../Grayscale';\n\nexport const fragmentSource: Record = {\n average: `\n precision highp float;\n uniform sampler2D uTexture;\n varying vec2 vTexCoord;\n void main() {\n vec4 color = texture2D(uTexture, vTexCoord);\n float average = (color.r + color.b + color.g) / 3.0;\n gl_FragColor = vec4(average, average, average, color.a);\n }\n `,\n lightness: `\n precision highp float;\n uniform sampler2D uTexture;\n uniform int uMode;\n varying vec2 vTexCoord;\n void main() {\n vec4 col = texture2D(uTexture, vTexCoord);\n float average = (max(max(col.r, col.g),col.b) + min(min(col.r, col.g),col.b)) / 2.0;\n gl_FragColor = vec4(average, average, average, col.a);\n }\n `,\n luminosity: `\n precision highp float;\n uniform sampler2D uTexture;\n uniform int uMode;\n varying vec2 vTexCoord;\n void main() {\n vec4 col = texture2D(uTexture, vTexCoord);\n float average = 0.21 * col.r + 0.72 * col.g + 0.07 * col.b;\n gl_FragColor = vec4(average, average, average, col.a);\n }\n `,\n};\n","import { BaseFilter } from './BaseFilter';\nimport type { T2DPipelineState, TWebGLUniformLocationMap } from './typedefs';\nimport { classRegistry } from '../ClassRegistry';\nimport { fragmentSource } from './shaders/grayscale';\n\nexport type TGrayscaleMode = 'average' | 'lightness' | 'luminosity';\n\ntype GrayscaleOwnProps = {\n mode: TGrayscaleMode;\n};\n\nexport const grayscaleDefaultValues: GrayscaleOwnProps = {\n mode: 'average',\n};\n\n/**\n * Grayscale image filter class\n * @example\n * const filter = new Grayscale();\n * object.filters.push(filter);\n * object.applyFilters();\n */\nexport class Grayscale extends BaseFilter<'Grayscale', GrayscaleOwnProps> {\n declare mode: TGrayscaleMode;\n\n static type = 'Grayscale';\n\n static defaults = grayscaleDefaultValues;\n\n static uniformLocations = ['uMode'];\n\n /**\n * Apply the Grayscale operation to a Uint8Array representing the pixels of an image.\n *\n * @param {Object} options\n * @param {ImageData} options.imageData The Uint8Array to be filtered.\n */\n applyTo2d({ imageData: { data } }: T2DPipelineState) {\n for (let i = 0, value: number; i < data.length; i += 4) {\n const r = data[i];\n const g = data[i + 1];\n const b = data[i + 2];\n switch (this.mode) {\n case 'average':\n value = (r + g + b) / 3;\n break;\n case 'lightness':\n value = (Math.min(r, g, b) + Math.max(r, g, b)) / 2;\n break;\n case 'luminosity':\n value = 0.21 * r + 0.72 * g + 0.07 * b;\n break;\n }\n\n data[i + 2] = data[i + 1] = data[i] = value;\n }\n }\n\n getCacheKey() {\n return `${this.type}_${this.mode}`;\n }\n\n getFragmentSource() {\n return fragmentSource[this.mode];\n }\n\n /**\n * Send data from this filter to its shader program's uniforms.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n */\n sendUniformData(\n gl: WebGLRenderingContext,\n uniformLocations: TWebGLUniformLocationMap,\n ) {\n const mode = 1;\n gl.uniform1i(uniformLocations.uMode, mode);\n }\n\n /**\n * Grayscale filter isNeutralState implementation\n * The filter is never neutral\n * on the image\n **/\n isNeutralState() {\n return false;\n }\n}\n\nclassRegistry.setClass(Grayscale);\n","import { cos } from '../util/misc/cos';\nimport { sin } from '../util/misc/sin';\nimport {\n ColorMatrix,\n type ColorMatrixOwnProps,\n colorMatrixDefaultValues,\n} from './ColorMatrix';\nimport type { TWebGLPipelineState, T2DPipelineState } from './typedefs';\nimport { classRegistry } from '../ClassRegistry';\n\nexport type HueRotationOwnProps = ColorMatrixOwnProps & {\n rotation: number;\n};\n\nexport type HueRotationSerializedProps = {\n rotation: number;\n};\n\nexport const hueRotationDefaultValues: HueRotationOwnProps = {\n ...colorMatrixDefaultValues,\n rotation: 0,\n};\n\n/**\n * HueRotation filter class\n * @example\n * const filter = new HueRotation({\n * rotation: -0.5\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n */\nexport class HueRotation extends ColorMatrix<\n 'HueRotation',\n HueRotationOwnProps,\n HueRotationSerializedProps\n> {\n /**\n * HueRotation value, from -1 to 1.\n */\n declare rotation: HueRotationOwnProps['rotation'];\n\n static type = 'HueRotation';\n\n static defaults = hueRotationDefaultValues;\n\n calculateMatrix() {\n const rad = this.rotation * Math.PI,\n cosine = cos(rad),\n sine = sin(rad),\n aThird = 1 / 3,\n aThirdSqtSin = Math.sqrt(aThird) * sine,\n OneMinusCos = 1 - cosine;\n this.matrix = [\n cosine + OneMinusCos / 3,\n aThird * OneMinusCos - aThirdSqtSin,\n aThird * OneMinusCos + aThirdSqtSin,\n 0,\n 0,\n aThird * OneMinusCos + aThirdSqtSin,\n cosine + aThird * OneMinusCos,\n aThird * OneMinusCos - aThirdSqtSin,\n 0,\n 0,\n aThird * OneMinusCos - aThirdSqtSin,\n aThird * OneMinusCos + aThirdSqtSin,\n cosine + aThird * OneMinusCos,\n 0,\n 0,\n 0,\n 0,\n 0,\n 1,\n 0,\n ];\n }\n\n isNeutralState() {\n return this.rotation === 0;\n }\n\n applyTo(options: TWebGLPipelineState | T2DPipelineState) {\n this.calculateMatrix();\n super.applyTo(options);\n }\n\n toObject() {\n return {\n type: this.type,\n rotation: this.rotation,\n };\n }\n}\n\nclassRegistry.setClass(HueRotation);\n","export const fragmentSource = `\n precision highp float;\n uniform sampler2D uTexture;\n uniform int uInvert;\n uniform int uAlpha;\n varying vec2 vTexCoord;\n void main() {\n vec4 color = texture2D(uTexture, vTexCoord);\n if (uInvert == 1) {\n if (uAlpha == 1) {\n gl_FragColor = vec4(1.0 - color.r,1.0 -color.g,1.0 -color.b,1.0 -color.a);\n } else {\n gl_FragColor = vec4(1.0 - color.r,1.0 -color.g,1.0 -color.b,color.a);\n }\n } else {\n gl_FragColor = color;\n }\n }\n`;\n","import { BaseFilter } from './BaseFilter';\nimport type { T2DPipelineState, TWebGLUniformLocationMap } from './typedefs';\nimport { classRegistry } from '../ClassRegistry';\nimport { fragmentSource } from './shaders/invert';\n\nexport type InvertOwnProps = {\n alpha: boolean;\n invert: boolean;\n};\n\nexport const invertDefaultValues: InvertOwnProps = {\n alpha: false,\n invert: true,\n};\n\n/**\n * @example\n * const filter = new Invert();\n * object.filters.push(filter);\n * object.applyFilters(canvas.renderAll.bind(canvas));\n */\nexport class Invert extends BaseFilter<'Invert', InvertOwnProps> {\n /**\n * Invert also alpha.\n * @param {Boolean} alpha\n **/\n declare alpha: InvertOwnProps['alpha'];\n\n /**\n * Filter invert. if false, does nothing\n * @param {Boolean} invert\n */\n declare invert: InvertOwnProps['invert'];\n\n static type = 'Invert';\n\n static defaults = invertDefaultValues;\n\n static uniformLocations = ['uInvert', 'uAlpha'];\n\n /**\n * Apply the Invert operation to a Uint8Array representing the pixels of an image.\n *\n * @param {Object} options\n * @param {ImageData} options.imageData The Uint8Array to be filtered.\n */\n applyTo2d({ imageData: { data } }: T2DPipelineState) {\n for (let i = 0; i < data.length; i += 4) {\n data[i] = 255 - data[i];\n data[i + 1] = 255 - data[i + 1];\n data[i + 2] = 255 - data[i + 2];\n\n if (this.alpha) {\n data[i + 3] = 255 - data[i + 3];\n }\n }\n }\n\n protected getFragmentSource(): string {\n return fragmentSource;\n }\n\n /**\n * Invert filter isNeutralState implementation\n * Used only in image applyFilters to discard filters that will not have an effect\n * on the image\n * @param {Object} options\n **/\n isNeutralState() {\n return !this.invert;\n }\n\n /**\n * Send data from this filter to its shader program's uniforms.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n */\n sendUniformData(\n gl: WebGLRenderingContext,\n uniformLocations: TWebGLUniformLocationMap,\n ) {\n gl.uniform1i(uniformLocations.uInvert, Number(this.invert));\n gl.uniform1i(uniformLocations.uAlpha, Number(this.alpha));\n }\n}\n\nclassRegistry.setClass(Invert);\n","export const fragmentSource = `\n precision highp float;\n uniform sampler2D uTexture;\n uniform float uStepH;\n uniform float uNoise;\n uniform float uSeed;\n varying vec2 vTexCoord;\n float rand(vec2 co, float seed, float vScale) {\n return fract(sin(dot(co.xy * vScale ,vec2(12.9898 , 78.233))) * 43758.5453 * (seed + 0.01) / 2.0);\n }\n void main() {\n vec4 color = texture2D(uTexture, vTexCoord);\n color.rgb += (0.5 - rand(vTexCoord, uSeed, 0.1 / uStepH)) * uNoise;\n gl_FragColor = color;\n }\n`;\n","import { BaseFilter } from './BaseFilter';\nimport type { T2DPipelineState, TWebGLUniformLocationMap } from './typedefs';\nimport { classRegistry } from '../ClassRegistry';\nimport { fragmentSource } from './shaders/noise';\n\nexport type NoiseOwnProps = {\n noise: number;\n};\n\nexport const noiseDefaultValues: NoiseOwnProps = {\n noise: 0,\n};\n\n/**\n * Noise filter class\n * @example\n * const filter = new Noise({\n * noise: 700\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n * canvas.renderAll();\n */\nexport class Noise extends BaseFilter<'Noise', NoiseOwnProps> {\n /**\n * Noise value, from\n * @param {Number} noise\n */\n declare noise: NoiseOwnProps['noise'];\n\n static type = 'Noise';\n\n static defaults = noiseDefaultValues;\n\n static uniformLocations = ['uNoise', 'uSeed'];\n\n getFragmentSource() {\n return fragmentSource;\n }\n\n /**\n * Apply the Brightness operation to a Uint8ClampedArray representing the pixels of an image.\n *\n * @param {Object} options\n * @param {ImageData} options.imageData The Uint8ClampedArray to be filtered.\n */\n applyTo2d({ imageData: { data } }: T2DPipelineState) {\n const noise = this.noise;\n for (let i = 0; i < data.length; i += 4) {\n const rand = (0.5 - Math.random()) * noise;\n data[i] += rand;\n data[i + 1] += rand;\n data[i + 2] += rand;\n }\n }\n\n /**\n * Send data from this filter to its shader program's uniforms.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n */\n sendUniformData(\n gl: WebGLRenderingContext,\n uniformLocations: TWebGLUniformLocationMap,\n ) {\n gl.uniform1f(uniformLocations.uNoise, this.noise / 255);\n gl.uniform1f(uniformLocations.uSeed, Math.random());\n }\n\n isNeutralState() {\n return this.noise === 0;\n }\n}\n\nclassRegistry.setClass(Noise);\n","export const fragmentSource = `\n precision highp float;\n uniform sampler2D uTexture;\n uniform float uBlocksize;\n uniform float uStepW;\n uniform float uStepH;\n varying vec2 vTexCoord;\n void main() {\n float blockW = uBlocksize * uStepW;\n float blockH = uBlocksize * uStepH;\n int posX = int(vTexCoord.x / blockW);\n int posY = int(vTexCoord.y / blockH);\n float fposX = float(posX);\n float fposY = float(posY);\n vec2 squareCoords = vec2(fposX * blockW, fposY * blockH);\n vec4 color = texture2D(uTexture, squareCoords);\n gl_FragColor = color;\n }\n`;\n","import { BaseFilter } from './BaseFilter';\nimport type { T2DPipelineState, TWebGLUniformLocationMap } from './typedefs';\nimport { classRegistry } from '../ClassRegistry';\nimport { fragmentSource } from './shaders/pixelate';\n\nexport type PixelateOwnProps = {\n blocksize: number;\n};\n\nexport const pixelateDefaultValues: PixelateOwnProps = {\n blocksize: 4,\n};\n\n/**\n * Pixelate filter class\n * @example\n * const filter = new Pixelate({\n * blocksize: 8\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n */\nexport class Pixelate extends BaseFilter<'Pixelate', PixelateOwnProps> {\n declare blocksize: PixelateOwnProps['blocksize'];\n\n static type = 'Pixelate';\n\n static defaults = pixelateDefaultValues;\n\n static uniformLocations = ['uBlocksize'];\n\n /**\n * Apply the Pixelate operation to a Uint8ClampedArray representing the pixels of an image.\n *\n * @param {Object} options\n * @param {ImageData} options.imageData The Uint8ClampedArray to be filtered.\n */\n applyTo2d({ imageData: { data, width, height } }: T2DPipelineState) {\n for (let i = 0; i < height; i += this.blocksize) {\n for (let j = 0; j < width; j += this.blocksize) {\n const index = i * 4 * width + j * 4;\n const r = data[index];\n const g = data[index + 1];\n const b = data[index + 2];\n const a = data[index + 3];\n\n for (let _i = i; _i < Math.min(i + this.blocksize, height); _i++) {\n for (let _j = j; _j < Math.min(j + this.blocksize, width); _j++) {\n const index = _i * 4 * width + _j * 4;\n data[index] = r;\n data[index + 1] = g;\n data[index + 2] = b;\n data[index + 3] = a;\n }\n }\n }\n }\n }\n\n /**\n * Indicate when the filter is not gonna apply changes to the image\n **/\n isNeutralState() {\n return this.blocksize === 1;\n }\n\n protected getFragmentSource(): string {\n return fragmentSource;\n }\n\n /**\n * Send data from this filter to its shader program's uniforms.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n */\n sendUniformData(\n gl: WebGLRenderingContext,\n uniformLocations: TWebGLUniformLocationMap,\n ) {\n gl.uniform1f(uniformLocations.uBlocksize, this.blocksize);\n }\n}\n\nclassRegistry.setClass(Pixelate);\n","export const fragmentShader = `\nprecision highp float;\nuniform sampler2D uTexture;\nuniform vec4 uLow;\nuniform vec4 uHigh;\nvarying vec2 vTexCoord;\nvoid main() {\n gl_FragColor = texture2D(uTexture, vTexCoord);\n if(all(greaterThan(gl_FragColor.rgb,uLow.rgb)) && all(greaterThan(uHigh.rgb,gl_FragColor.rgb))) {\n gl_FragColor.a = 0.0;\n }\n}\n`;\n","import { classRegistry } from '../ClassRegistry';\nimport { Color } from '../color/Color';\nimport { BaseFilter } from './BaseFilter';\nimport { fragmentShader } from './shaders/removeColor';\nimport type { T2DPipelineState, TWebGLUniformLocationMap } from './typedefs';\n\nexport type RemoveColorOwnProps = {\n color: string;\n distance: number;\n useAlpha: boolean;\n};\n\nexport const removeColorDefaultValues: RemoveColorOwnProps = {\n color: '#FFFFFF',\n distance: 0.02,\n useAlpha: false,\n};\n\n/**\n * Remove white filter class\n * @example\n * const filter = new RemoveColor({\n * threshold: 0.2,\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n * canvas.renderAll();\n */\nexport class RemoveColor extends BaseFilter<\n 'RemoveColor',\n RemoveColorOwnProps\n> {\n /**\n * Color to remove, in any format understood by {@link Color}.\n */\n declare color: RemoveColorOwnProps['color'];\n\n /**\n * distance to actual color, as value up or down from each r,g,b\n * between 0 and 1\n **/\n declare distance: RemoveColorOwnProps['distance'];\n\n /**\n * For color to remove inside distance, use alpha channel for a smoother deletion\n * NOT IMPLEMENTED YET\n **/\n declare useAlpha: RemoveColorOwnProps['useAlpha'];\n\n static type = 'RemoveColor';\n\n static defaults = removeColorDefaultValues;\n\n static uniformLocations = ['uLow', 'uHigh'];\n\n getFragmentSource() {\n return fragmentShader;\n }\n\n /**\n * Applies filter to canvas element\n * @param {Object} canvasEl Canvas element to apply filter to\n */\n applyTo2d({ imageData: { data } }: T2DPipelineState) {\n const distance = this.distance * 255,\n source = new Color(this.color).getSource(),\n lowC = [source[0] - distance, source[1] - distance, source[2] - distance],\n highC = [\n source[0] + distance,\n source[1] + distance,\n source[2] + distance,\n ];\n\n for (let i = 0; i < data.length; i += 4) {\n const r = data[i];\n const g = data[i + 1];\n const b = data[i + 2];\n\n if (\n r > lowC[0] &&\n g > lowC[1] &&\n b > lowC[2] &&\n r < highC[0] &&\n g < highC[1] &&\n b < highC[2]\n ) {\n data[i + 3] = 0;\n }\n }\n }\n\n /**\n * Send data from this filter to its shader program's uniforms.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n */\n sendUniformData(\n gl: WebGLRenderingContext,\n uniformLocations: TWebGLUniformLocationMap,\n ) {\n const source = new Color(this.color).getSource(),\n distance = this.distance,\n lowC = [\n 0 + source[0] / 255 - distance,\n 0 + source[1] / 255 - distance,\n 0 + source[2] / 255 - distance,\n 1,\n ],\n highC = [\n source[0] / 255 + distance,\n source[1] / 255 + distance,\n source[2] / 255 + distance,\n 1,\n ];\n gl.uniform4fv(uniformLocations.uLow, lowC);\n gl.uniform4fv(uniformLocations.uHigh, highC);\n }\n}\n\nclassRegistry.setClass(RemoveColor);\n","import { BaseFilter } from './BaseFilter';\nimport type {\n T2DPipelineState,\n TWebGLPipelineState,\n TWebGLUniformLocationMap,\n} from './typedefs';\nimport { isWebGLPipelineState } from './utils';\nimport { classRegistry } from '../ClassRegistry';\nimport { createCanvasElement } from '../util/misc/dom';\nimport type { XY } from '../Point';\n\nexport type TResizeType = 'bilinear' | 'hermite' | 'sliceHack' | 'lanczos';\n\nexport type ResizeOwnProps = {\n resizeType: TResizeType;\n scaleX: number;\n scaleY: number;\n lanczosLobes: number;\n};\n\nexport type ResizeSerializedProps = ResizeOwnProps;\n\nexport const resizeDefaultValues: ResizeOwnProps = {\n resizeType: 'hermite',\n scaleX: 1,\n scaleY: 1,\n lanczosLobes: 3,\n};\n\ntype ResizeDuring2DResize = Resize & {\n rcpScaleX: number;\n rcpScaleY: number;\n};\n\ntype ResizeDuringWEBGLResize = Resize & {\n rcpScaleX: number;\n rcpScaleY: number;\n horizontal: boolean;\n width: number;\n height: number;\n taps: number[];\n tempScale: number;\n dH: number;\n dW: number;\n};\n\n/**\n * Resize image filter class\n * @example\n * const filter = new Resize();\n * object.filters.push(filter);\n * object.applyFilters(canvas.renderAll.bind(canvas));\n */\nexport class Resize extends BaseFilter<'Resize', ResizeOwnProps> {\n /**\n * Resize type\n * for webgl resizeType is just lanczos, for canvas2d can be:\n * bilinear, hermite, sliceHack, lanczos.\n */\n declare resizeType: ResizeOwnProps['resizeType'];\n\n /**\n * Scale factor for resizing, x axis\n * @param {Number} scaleX\n */\n declare scaleX: ResizeOwnProps['scaleX'];\n\n /**\n * Scale factor for resizing, y axis\n * @param {Number} scaleY\n */\n declare scaleY: ResizeOwnProps['scaleY'];\n\n /**\n * LanczosLobes parameter for lanczos filter, valid for resizeType lanczos\n * @param {Number} lanczosLobes\n */\n declare lanczosLobes: ResizeOwnProps['lanczosLobes'];\n\n static type = 'Resize';\n\n static defaults = resizeDefaultValues;\n\n static uniformLocations = ['uDelta', 'uTaps'];\n\n /**\n * Send data from this filter to its shader program's uniforms.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n */\n sendUniformData(\n this: ResizeDuringWEBGLResize,\n gl: WebGLRenderingContext,\n uniformLocations: TWebGLUniformLocationMap,\n ) {\n gl.uniform2fv(\n uniformLocations.uDelta,\n this.horizontal ? [1 / this.width, 0] : [0, 1 / this.height],\n );\n gl.uniform1fv(uniformLocations.uTaps, this.taps);\n }\n\n getFilterWindow(this: ResizeDuringWEBGLResize) {\n const scale = this.tempScale;\n return Math.ceil(this.lanczosLobes / scale);\n }\n\n getCacheKey(this: ResizeDuringWEBGLResize): string {\n const filterWindow = this.getFilterWindow();\n return `${this.type}_${filterWindow}`;\n }\n\n getFragmentSource(this: ResizeDuringWEBGLResize): string {\n const filterWindow = this.getFilterWindow();\n return this.generateShader(filterWindow);\n }\n\n getTaps(this: ResizeDuringWEBGLResize) {\n const lobeFunction = this.lanczosCreate(this.lanczosLobes),\n scale = this.tempScale,\n filterWindow = this.getFilterWindow(),\n taps = new Array(filterWindow);\n for (let i = 1; i <= filterWindow; i++) {\n taps[i - 1] = lobeFunction(i * scale);\n }\n return taps;\n }\n\n /**\n * Generate vertex and shader sources from the necessary steps numbers\n * @param {Number} filterWindow\n */\n generateShader(filterWindow: number) {\n const offsets = new Array(filterWindow);\n for (let i = 1; i <= filterWindow; i++) {\n offsets[i - 1] = `${i}.0 * uDelta`;\n }\n return `\n precision highp float;\n uniform sampler2D uTexture;\n uniform vec2 uDelta;\n varying vec2 vTexCoord;\n uniform float uTaps[${filterWindow}];\n void main() {\n vec4 color = texture2D(uTexture, vTexCoord);\n float sum = 1.0;\n ${offsets\n .map(\n (offset, i) => `\n color += texture2D(uTexture, vTexCoord + ${offset}) * uTaps[${i}] + texture2D(uTexture, vTexCoord - ${offset}) * uTaps[${i}];\n sum += 2.0 * uTaps[${i}];\n `,\n )\n .join('\\n')}\n gl_FragColor = color / sum;\n }\n `;\n }\n\n applyToForWebgl(this: ResizeDuringWEBGLResize, options: TWebGLPipelineState) {\n options.passes++;\n this.width = options.sourceWidth;\n this.horizontal = true;\n this.dW = Math.round(this.width * this.scaleX);\n this.dH = options.sourceHeight;\n this.tempScale = this.dW / this.width;\n this.taps = this.getTaps();\n options.destinationWidth = this.dW;\n super.applyTo(options);\n options.sourceWidth = options.destinationWidth;\n\n this.height = options.sourceHeight;\n this.horizontal = false;\n this.dH = Math.round(this.height * this.scaleY);\n this.tempScale = this.dH / this.height;\n this.taps = this.getTaps();\n options.destinationHeight = this.dH;\n super.applyTo(options);\n options.sourceHeight = options.destinationHeight;\n }\n\n /**\n * Apply the resize filter to the image\n * Determines whether to use WebGL or Canvas2D based on the options.webgl flag.\n *\n * @param {Object} options\n * @param {Number} options.passes The number of filters remaining to be executed\n * @param {Boolean} options.webgl Whether to use webgl to render the filter.\n * @param {WebGLTexture} options.sourceTexture The texture setup as the source to be filtered.\n * @param {WebGLTexture} options.targetTexture The texture where filtered output should be drawn.\n * @param {WebGLRenderingContext} options.context The GL context used for rendering.\n * @param {Object} options.programCache A map of compiled shader programs, keyed by filter type.\n */\n applyTo(options: TWebGLPipelineState | T2DPipelineState) {\n if (isWebGLPipelineState(options)) {\n (this as unknown as ResizeDuringWEBGLResize).applyToForWebgl(options);\n } else {\n (this as unknown as ResizeDuring2DResize).applyTo2d(options);\n }\n }\n\n isNeutralState() {\n return this.scaleX === 1 && this.scaleY === 1;\n }\n\n lanczosCreate(lobes: number) {\n return (x: number) => {\n if (x >= lobes || x <= -lobes) {\n return 0.0;\n }\n if (x < 1.1920929e-7 && x > -1.1920929e-7) {\n return 1.0;\n }\n x *= Math.PI;\n const xx = x / lobes;\n return ((Math.sin(x) / x) * Math.sin(xx)) / xx;\n };\n }\n\n applyTo2d(this: ResizeDuring2DResize, options: T2DPipelineState) {\n const imageData = options.imageData,\n scaleX = this.scaleX,\n scaleY = this.scaleY;\n\n this.rcpScaleX = 1 / scaleX;\n this.rcpScaleY = 1 / scaleY;\n\n const oW = imageData.width;\n const oH = imageData.height;\n const dW = Math.round(oW * scaleX);\n const dH = Math.round(oH * scaleY);\n let newData: ImageData;\n\n if (this.resizeType === 'sliceHack') {\n newData = this.sliceByTwo(options, oW, oH, dW, dH);\n } else if (this.resizeType === 'hermite') {\n newData = this.hermiteFastResize(options, oW, oH, dW, dH);\n } else if (this.resizeType === 'bilinear') {\n newData = this.bilinearFiltering(options, oW, oH, dW, dH);\n } else if (this.resizeType === 'lanczos') {\n newData = this.lanczosResize(options, oW, oH, dW, dH);\n } else {\n // this should never trigger, is here just for safety net.\n newData = new ImageData(dW, dH);\n }\n options.imageData = newData;\n }\n\n /**\n * Filter sliceByTwo\n * @param {Object} canvasEl Canvas element to apply filter to\n * @param {Number} oW Original Width\n * @param {Number} oH Original Height\n * @param {Number} dW Destination Width\n * @param {Number} dH Destination Height\n * @returns {ImageData}\n */\n sliceByTwo(\n options: T2DPipelineState,\n oW: number,\n oH: number,\n dW: number,\n dH: number,\n ) {\n const imageData = options.imageData;\n const mult = 0.5;\n let doneW = false;\n let doneH = false;\n let stepW = oW * mult;\n let stepH = oH * mult;\n const resources = options.filterBackend.resources;\n let sX = 0;\n let sY = 0;\n const dX = oW;\n let dY = 0;\n if (!resources.sliceByTwo) {\n resources.sliceByTwo = createCanvasElement();\n }\n const tmpCanvas = resources.sliceByTwo;\n if (tmpCanvas.width < oW * 1.5 || tmpCanvas.height < oH) {\n tmpCanvas.width = oW * 1.5;\n tmpCanvas.height = oH;\n }\n const ctx = tmpCanvas.getContext('2d')!;\n ctx.clearRect(0, 0, oW * 1.5, oH);\n ctx.putImageData(imageData, 0, 0);\n\n dW = Math.floor(dW);\n dH = Math.floor(dH);\n\n while (!doneW || !doneH) {\n oW = stepW;\n oH = stepH;\n if (dW < Math.floor(stepW * mult)) {\n stepW = Math.floor(stepW * mult);\n } else {\n stepW = dW;\n doneW = true;\n }\n if (dH < Math.floor(stepH * mult)) {\n stepH = Math.floor(stepH * mult);\n } else {\n stepH = dH;\n doneH = true;\n }\n ctx.drawImage(tmpCanvas, sX, sY, oW, oH, dX, dY, stepW, stepH);\n sX = dX;\n sY = dY;\n dY += stepH;\n }\n return ctx.getImageData(sX, sY, dW, dH);\n }\n\n /**\n * Filter lanczosResize\n * @param {Object} canvasEl Canvas element to apply filter to\n * @param {Number} oW Original Width\n * @param {Number} oH Original Height\n * @param {Number} dW Destination Width\n * @param {Number} dH Destination Height\n * @returns {ImageData}\n */\n lanczosResize(\n this: ResizeDuring2DResize,\n options: T2DPipelineState,\n oW: number,\n oH: number,\n dW: number,\n dH: number,\n ): ImageData {\n function process(u: number): ImageData {\n let v, i, weight, idx, a, red, green, blue, alpha, fX, fY;\n center.x = (u + 0.5) * ratioX;\n icenter.x = Math.floor(center.x);\n for (v = 0; v < dH; v++) {\n center.y = (v + 0.5) * ratioY;\n icenter.y = Math.floor(center.y);\n a = 0;\n red = 0;\n green = 0;\n blue = 0;\n alpha = 0;\n for (i = icenter.x - range2X; i <= icenter.x + range2X; i++) {\n if (i < 0 || i >= oW) {\n continue;\n }\n fX = Math.floor(1000 * Math.abs(i - center.x));\n if (!cacheLanc[fX]) {\n cacheLanc[fX] = {};\n }\n for (let j = icenter.y - range2Y; j <= icenter.y + range2Y; j++) {\n if (j < 0 || j >= oH) {\n continue;\n }\n fY = Math.floor(1000 * Math.abs(j - center.y));\n if (!cacheLanc[fX][fY]) {\n cacheLanc[fX][fY] = lanczos(\n Math.sqrt(\n Math.pow(fX * rcpRatioX, 2) + Math.pow(fY * rcpRatioY, 2),\n ) / 1000,\n );\n }\n weight = cacheLanc[fX][fY];\n if (weight > 0) {\n idx = (j * oW + i) * 4;\n a += weight;\n red += weight * srcData[idx];\n green += weight * srcData[idx + 1];\n blue += weight * srcData[idx + 2];\n alpha += weight * srcData[idx + 3];\n }\n }\n }\n idx = (v * dW + u) * 4;\n destData[idx] = red / a;\n destData[idx + 1] = green / a;\n destData[idx + 2] = blue / a;\n destData[idx + 3] = alpha / a;\n }\n\n if (++u < dW) {\n return process(u);\n } else {\n return destImg;\n }\n }\n\n const srcData = options.imageData.data,\n destImg = options.ctx.createImageData(dW, dH),\n destData = destImg.data,\n lanczos = this.lanczosCreate(this.lanczosLobes),\n ratioX = this.rcpScaleX,\n ratioY = this.rcpScaleY,\n rcpRatioX = 2 / this.rcpScaleX,\n rcpRatioY = 2 / this.rcpScaleY,\n range2X = Math.ceil((ratioX * this.lanczosLobes) / 2),\n range2Y = Math.ceil((ratioY * this.lanczosLobes) / 2),\n cacheLanc: Record> = {},\n center: XY = { x: 0, y: 0 },\n icenter: XY = { x: 0, y: 0 };\n\n return process(0);\n }\n\n /**\n * bilinearFiltering\n * @param {Object} canvasEl Canvas element to apply filter to\n * @param {Number} oW Original Width\n * @param {Number} oH Original Height\n * @param {Number} dW Destination Width\n * @param {Number} dH Destination Height\n * @returns {ImageData}\n */\n bilinearFiltering(\n this: ResizeDuring2DResize,\n options: T2DPipelineState,\n oW: number,\n oH: number,\n dW: number,\n dH: number,\n ) {\n let a;\n let b;\n let c;\n let d;\n let x;\n let y;\n let i;\n let j;\n let xDiff;\n let yDiff;\n let chnl;\n let color;\n let offset = 0;\n let origPix;\n const ratioX = this.rcpScaleX;\n const ratioY = this.rcpScaleY;\n const w4 = 4 * (oW - 1);\n const img = options.imageData;\n const pixels = img.data;\n const destImage = options.ctx.createImageData(dW, dH);\n const destPixels = destImage.data;\n for (i = 0; i < dH; i++) {\n for (j = 0; j < dW; j++) {\n x = Math.floor(ratioX * j);\n y = Math.floor(ratioY * i);\n xDiff = ratioX * j - x;\n yDiff = ratioY * i - y;\n origPix = 4 * (y * oW + x);\n\n for (chnl = 0; chnl < 4; chnl++) {\n a = pixels[origPix + chnl];\n b = pixels[origPix + 4 + chnl];\n c = pixels[origPix + w4 + chnl];\n d = pixels[origPix + w4 + 4 + chnl];\n color =\n a * (1 - xDiff) * (1 - yDiff) +\n b * xDiff * (1 - yDiff) +\n c * yDiff * (1 - xDiff) +\n d * xDiff * yDiff;\n destPixels[offset++] = color;\n }\n }\n }\n return destImage;\n }\n\n /**\n * hermiteFastResize\n * @param {Object} canvasEl Canvas element to apply filter to\n * @param {Number} oW Original Width\n * @param {Number} oH Original Height\n * @param {Number} dW Destination Width\n * @param {Number} dH Destination Height\n * @returns {ImageData}\n */\n hermiteFastResize(\n this: ResizeDuring2DResize,\n options: T2DPipelineState,\n oW: number,\n oH: number,\n dW: number,\n dH: number,\n ) {\n const ratioW = this.rcpScaleX,\n ratioH = this.rcpScaleY,\n ratioWHalf = Math.ceil(ratioW / 2),\n ratioHHalf = Math.ceil(ratioH / 2),\n img = options.imageData,\n data = img.data,\n img2 = options.ctx.createImageData(dW, dH),\n data2 = img2.data;\n for (let j = 0; j < dH; j++) {\n for (let i = 0; i < dW; i++) {\n const x2 = (i + j * dW) * 4;\n let weight = 0;\n let weights = 0;\n let weightsAlpha = 0;\n let gxR = 0;\n let gxG = 0;\n let gxB = 0;\n let gxA = 0;\n const centerY = (j + 0.5) * ratioH;\n for (let yy = Math.floor(j * ratioH); yy < (j + 1) * ratioH; yy++) {\n const dy = Math.abs(centerY - (yy + 0.5)) / ratioHHalf,\n centerX = (i + 0.5) * ratioW,\n w0 = dy * dy;\n for (let xx = Math.floor(i * ratioW); xx < (i + 1) * ratioW; xx++) {\n let dx = Math.abs(centerX - (xx + 0.5)) / ratioWHalf;\n const w = Math.sqrt(w0 + dx * dx);\n /* eslint-disable max-depth */\n if (w > 1 && w < -1) {\n continue;\n }\n //hermite filter\n weight = 2 * w * w * w - 3 * w * w + 1;\n if (weight > 0) {\n dx = 4 * (xx + yy * oW);\n //alpha\n gxA += weight * data[dx + 3];\n weightsAlpha += weight;\n //colors\n if (data[dx + 3] < 255) {\n weight = (weight * data[dx + 3]) / 250;\n }\n gxR += weight * data[dx];\n gxG += weight * data[dx + 1];\n gxB += weight * data[dx + 2];\n weights += weight;\n }\n /* eslint-enable max-depth */\n }\n }\n data2[x2] = gxR / weights;\n data2[x2 + 1] = gxG / weights;\n data2[x2 + 2] = gxB / weights;\n data2[x2 + 3] = gxA / weightsAlpha;\n }\n }\n return img2;\n }\n}\n\nclassRegistry.setClass(Resize);\n","export const fragmentSource = `\n precision highp float;\n uniform sampler2D uTexture;\n uniform float uSaturation;\n varying vec2 vTexCoord;\n void main() {\n vec4 color = texture2D(uTexture, vTexCoord);\n float rgMax = max(color.r, color.g);\n float rgbMax = max(rgMax, color.b);\n color.r += rgbMax != color.r ? (rgbMax - color.r) * uSaturation : 0.00;\n color.g += rgbMax != color.g ? (rgbMax - color.g) * uSaturation : 0.00;\n color.b += rgbMax != color.b ? (rgbMax - color.b) * uSaturation : 0.00;\n gl_FragColor = color;\n }\n`;\n","import { BaseFilter } from './BaseFilter';\nimport type { T2DPipelineState, TWebGLUniformLocationMap } from './typedefs';\nimport { classRegistry } from '../ClassRegistry';\nimport { fragmentSource } from './shaders/saturation';\n\nexport type SaturationOwnProps = {\n saturation: number;\n};\n\nexport const saturationDefaultValues: SaturationOwnProps = {\n saturation: 0,\n};\n\n/**\n * Saturate filter class\n * @example\n * const filter = new Saturation({\n * saturation: 1\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n */\nexport class Saturation extends BaseFilter<'Saturation', SaturationOwnProps> {\n /**\n * Saturation value, from -1 to 1.\n * Increases/decreases the color saturation.\n * A value of 0 has no effect.\n *\n * @param {Number} saturation\n */\n declare saturation: SaturationOwnProps['saturation'];\n\n static type = 'Saturation';\n\n static defaults = saturationDefaultValues;\n\n static uniformLocations = ['uSaturation'];\n\n getFragmentSource() {\n return fragmentSource;\n }\n\n /**\n * Apply the Saturation operation to a Uint8ClampedArray representing the pixels of an image.\n *\n * @param {Object} options\n * @param {ImageData} options.imageData The Uint8ClampedArray to be filtered.\n */\n applyTo2d({ imageData: { data } }: T2DPipelineState) {\n const adjust = -this.saturation;\n for (let i = 0; i < data.length; i += 4) {\n const r = data[i];\n const g = data[i + 1];\n const b = data[i + 2];\n const max = Math.max(r, g, b);\n data[i] += max !== r ? (max - r) * adjust : 0;\n data[i + 1] += max !== g ? (max - g) * adjust : 0;\n data[i + 2] += max !== b ? (max - b) * adjust : 0;\n }\n }\n\n /**\n * Send data from this filter to its shader program's uniforms.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n */\n sendUniformData(\n gl: WebGLRenderingContext,\n uniformLocations: TWebGLUniformLocationMap,\n ) {\n gl.uniform1f(uniformLocations.uSaturation, -this.saturation);\n }\n\n isNeutralState() {\n return this.saturation === 0;\n }\n}\n\nclassRegistry.setClass(Saturation);\n","export const fragmentSource = `\n precision highp float;\n uniform sampler2D uTexture;\n uniform float uVibrance;\n varying vec2 vTexCoord;\n void main() {\n vec4 color = texture2D(uTexture, vTexCoord);\n float max = max(color.r, max(color.g, color.b));\n float avg = (color.r + color.g + color.b) / 3.0;\n float amt = (abs(max - avg) * 2.0) * uVibrance;\n color.r += max != color.r ? (max - color.r) * amt : 0.00;\n color.g += max != color.g ? (max - color.g) * amt : 0.00;\n color.b += max != color.b ? (max - color.b) * amt : 0.00;\n gl_FragColor = color;\n }\n`;\n","import { BaseFilter } from './BaseFilter';\nimport type { T2DPipelineState, TWebGLUniformLocationMap } from './typedefs';\nimport { classRegistry } from '../ClassRegistry';\nimport { fragmentSource } from './shaders/vibrance';\n\nexport type VibranceOwnProps = {\n vibrance: number;\n};\n\nexport const vibranceDefaultValues: VibranceOwnProps = {\n vibrance: 0,\n};\n\n/**\n * Vibrance filter class\n * @example\n * const filter = new Vibrance({\n * vibrance: 1\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n */\nexport class Vibrance extends BaseFilter<'Vibrance', VibranceOwnProps> {\n /**\n * Vibrance value, from -1 to 1.\n * Increases/decreases the saturation of more muted colors with less effect on saturated colors.\n * A value of 0 has no effect.\n *\n * @param {Number} vibrance\n */\n declare vibrance: VibranceOwnProps['vibrance'];\n\n static type = 'Vibrance';\n\n static defaults = vibranceDefaultValues;\n\n static uniformLocations = ['uVibrance'];\n\n getFragmentSource() {\n return fragmentSource;\n }\n\n /**\n * Apply the Vibrance operation to a Uint8ClampedArray representing the pixels of an image.\n *\n * @param {Object} options\n * @param {ImageData} options.imageData The Uint8ClampedArray to be filtered.\n */\n applyTo2d({ imageData: { data } }: T2DPipelineState) {\n const adjust = -this.vibrance;\n for (let i = 0; i < data.length; i += 4) {\n const r = data[i];\n const g = data[i + 1];\n const b = data[i + 2];\n const max = Math.max(r, g, b);\n const avg = (r + g + b) / 3;\n const amt = ((Math.abs(max - avg) * 2) / 255) * adjust;\n data[i] += max !== r ? (max - r) * amt : 0;\n data[i + 1] += max !== g ? (max - g) * amt : 0;\n data[i + 2] += max !== b ? (max - b) * amt : 0;\n }\n }\n\n /**\n * Send data from this filter to its shader program's uniforms.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {TWebGLUniformLocationMap} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n */\n sendUniformData(\n gl: WebGLRenderingContext,\n uniformLocations: TWebGLUniformLocationMap,\n ) {\n gl.uniform1f(uniformLocations.uVibrance, -this.vibrance);\n }\n\n isNeutralState() {\n return this.vibrance === 0;\n }\n}\n\nclassRegistry.setClass(Vibrance);\n","// First we set the env variable\n\nimport { setEnv } from './src/env';\nimport { getEnv, getNodeCanvas } from './src/env/node';\n\nsetEnv(getEnv());\n\n// After the env is set we can export everything and expose specific node functionality\n\nimport type { JpegConfig, PngConfig } from 'canvas';\nimport {\n Canvas as CanvasBase,\n StaticCanvas as StaticCanvasBase,\n} from './fabric';\nimport { FabricObject } from './src/shapes/Object/Object';\n\nFabricObject.ownDefaults.objectCaching = false;\n\nexport * from './fabric';\n\nexport class StaticCanvas extends StaticCanvasBase {\n getNodeCanvas() {\n return getNodeCanvas(this.getElement());\n }\n createPNGStream(opts?: PngConfig) {\n return this.getNodeCanvas().createPNGStream(opts);\n }\n createJPEGStream(opts?: JpegConfig) {\n return this.getNodeCanvas().createJPEGStream(opts);\n }\n}\n\n/**\n * **NOTICE**:\n * {@link Canvas} is designed for interactivity.\n * Therefore, using it in node has no benefit.\n * Use {@link StaticCanvas} instead.\n */\nexport class Canvas extends CanvasBase {\n getNodeCanvas() {\n return getNodeCanvas(this.getElement());\n }\n createPNGStream(opts?: PngConfig) {\n return this.getNodeCanvas().createPNGStream(opts);\n }\n createJPEGStream(opts?: JpegConfig) {\n return this.getNodeCanvas().createJPEGStream(opts);\n }\n}\n"],"names":["BaseConfiguration","constructor","_defineProperty","window","devicePixelRatio","Configuration","config","configure","arguments","length","undefined","Object","assign","addFonts","paths","fontPaths","removeFonts","fontFamilys","forEach","fontFamily","clearFonts","restoreDefaults","keys","defaults","reduce","acc","key","log","severity","_len","optionalParams","Array","_key","console","FabricError","Error","message","options","SignalAbortedError","context","GLProbe","WebGLProbe","testPrecision","gl","precision","fragmentSource","fragmentShader","createShader","FRAGMENT_SHADER","shaderSource","compileShader","getShaderParameter","COMPILE_STATUS","queryWebGL","canvas","getContext","maxTextureSize","getParameter","MAX_TEXTURE_SIZE","GLPrecision","find","getExtension","loseContext","isSupported","textureSize","copyPasteData","getEnv","document","isTouchSupported","navigator","maxTouchPoints","dispose","env","setEnv","value","getBrowserEnv","getFabricDocument","getFabricWindow","getDevicePixelRatio","_config$devicePixelRa","Math","max","NodeGLProbe","implForWrapper","jsdomImplForWrapper","utils","JSDOMWindow","JSDOM","decodeURIComponent","resources","pretendToBeVisual","getNodeCanvas","canvasEl","impl","_canvas","_image","element","_currentSrc","_attributes","_classList","Cache","getFontCache","_ref","fontStyle","fontWeight","toLowerCase","charWidthsCache","fontCache","cacheKey","clearFontCache","limitDimsByArea","ar","perfLimitSizeTotal","roughWidth","sqrt","floor","cache","VERSION","version","noop","halfPI","PI","quarterPI","twoMathPi","PiBy180","iMatrix","freeze","DEFAULT_SVG_FONT_SIZE","ALIASING_LIMIT","kRect","CENTER","LEFT","TOP","BOTTOM","RIGHT","NONE","reNewline","MOVING","SCALING","ROTATING","ROTATE","SKEWING","RESIZING","MODIFY_POLY","MODIFY_PATH","CHANGED","SCALE","SCALE_X","SCALE_Y","SKEW_X","SKEW_Y","FILL","STROKE","MODIFIED","JSON","SVG","ClassRegistry","Map","has","classType","getClass","get","setClass","classConstructor","set","type","getSVGClass","SVGTagName","setSVGClass","classRegistry","AnimationRegistry","remove","index","indexOf","splice","cancelAll","animations","animation","abort","cancelByCanvas","filter","_animation$target","target","cancelByTarget","runningAnimations","Observable","on","arg0","handler","__eventListeners","entries","eventName","off","push","once","disposers","_ref2","d","disposer","onceHandler","args","call","_removeEventListener","eventListener","_ref3","fire","_this$__eventListener","listenersForEvent","concat","i","removeFromArray","array","idx","cos","angle","angleSlice","abs","sin","sign","Point","y","x","add","that","addEquals","scalarAdd","scalar","scalarAddEquals","subtract","subtractEquals","scalarSubtract","scalarSubtractEquals","multiply","scalarMultiply","scalarMultiplyEquals","divide","scalarDivide","scalarDivideEquals","eq","lt","lte","gt","gte","lerp","t","min","distanceFrom","dx","dy","midPointFrom","toString","setXY","setX","setY","setFromPoint","swap","clone","rotate","radians","origin","ZERO","sinus","cosinus","p","rotated","transform","ignoreOffset","isCollection","fabricObject","isArray","_objects","createCollectionMixin","Base","Collection","_onObjectAdded","object","_onObjectRemoved","_onStackOrderChanged","objects","size","insertAt","_len2","_key2","removed","_len3","_key3","forEachObject","callback","getObjects","_len4","types","_key4","o","isType","item","isEmpty","contains","deep","includes","some","obj","complexity","memo","current","sendObjectToBack","unshift","bringObjectToFront","sendObjectBackwards","intersecting","newIdx","findNewLowerIndex","bringObjectForward","findNewUpperIndex","moveObjectTo","isOverlapping","collectObjects","left","top","width","height","includeIntersecting","tl","br","selectable","visible","intersectsWithRect","isContainedWithinRect","containsPoint","CommonMethods","_setOptions","prop","_setObject","_set","toggle","property","requestAnimFrame","requestAnimationFrame","cancelAnimFrame","handle","cancelAnimationFrame","id","uid","createCanvasElement","createElement","createImage","copyCanvasElement","_newCanvas$getContext","newCanvas","createCanvasElementFor","drawImage","toDataURL","format","quality","isHTMLCanvas","toBlob","Promise","resolve","_","degreesToRadians","degrees","radiansToDegrees","isIdentityMatrix","mat","every","transformPoint","invertTransform","a","r","multiplyTransformMatrices","b","is2x2","multiplyTransformMatrixArray","matrices","reduceRight","product","curr","calcPlaneRotation","atan2","qrDecompose","denom","pow","scaleX","scaleY","skewX","skewY","translateX","translateY","createTranslateMatrix","createRotateMatrix","angleRadiant","cosValue","sinValue","createScaleMatrix","angleToSkew","tan","createSkewXMatrix","skewValue","createSkewYMatrix","calcDimensionsMatrix","flipX","flipY","matrix","composeMatrix","scaleMatrix","loadImage","url","signal","crossOrigin","reject","aborted","img","err","src","addEventListener","done","onload","onerror","removeEventListener","enlivenObjects","reviver","instances","all","map","fromObject","then","fabricInstance","catch","error","instance","finally","enlivenObjectEnlivables","serializedObject","promises","values","enlived","pick","source","pickBy","predicate","toFixed","number","fractionDigits","parseFloat","Number","matrixToSVG","NUM_FRACTION_DIGITS","join","isFiller","filler","toLive","isSerializableFiller","toObject","isPattern","offsetX","isTextObject","_renderText","isPath","_renderPathCommands","isActiveSelection","getScrollLeftTop","doc","getDocumentFromElement","elementLoop","docElement","documentElement","body","scrollLeft","scrollTop","parentNode","host","nodeType","style","position","el","ownerDocument","getWindowFromElement","_el$ownerDocument","defaultView","setCanvasDimensions","ctx","retinaScaling","setAttribute","scale","setCSSDimensions","getElementOffset","_getWindowFromElement","offset","elemStyle","getComputedStyle","parseInt","borderLeftWidth","borderTopWidth","paddingLeft","paddingTop","box","docElem","getBoundingClientRect","scrollLeftTop","clientLeft","clientTop","makeElementUnselectable","onselectstart","userSelect","StaticCanvasDOMManager","createLowerCanvas","lower","getElementById","hasAttribute","_originalCanvasStyle","cssText","classList","cleanupDOM","removeAttribute","setDimensions","calcOffset","staticCanvasDefaults","backgroundVpt","backgroundColor","overlayVpt","overlayColor","includeDefaultValues","svgViewportTransformation","renderOnAddRemove","skipOffscreen","enableRetinaScaling","imageSmoothingEnabled","controlsAboveOverlay","allowTouchScrolling","viewportTransform","StaticCanvas","lowerCanvasEl","_this$elements$lower","elements","contextContainer","_this$elements$lower2","getDefaults","ownDefaults","initElements","_setDimensionsImpl","skipControlsDrawing","calcViewportBoundaries","requestRenderAll","setCoords","getRetinaScaling","_offset","getWidth","getHeight","dimensions","cssOnly","backstoreOnly","hasLostContext","getZoom","setViewportTransform","vpt","zoomToPoint","point","before","newPoint","after","setZoom","absolutePan","relativePan","getElement","clearContext","clearRect","clear","backgroundImage","overlayImage","renderAll","cancelRequestedRender","destroyed","renderCanvas","renderAndReset","nextRenderHandle","disposed","iVpt","vptCoords","tr","bl","drawControls","_ctx","v","path","clipPath","patternQuality","_renderBackground","save","_renderObjects","restore","shouldCache","_transformDone","renderCache","forClipping","drawClipPathOnCanvas","_renderOverlay","__cleanupTask","globalCompositeOperation","zoomX","zoomY","_cacheCanvas","cacheTranslationX","cacheTranslationY","len","render","_renderBackgroundOrOverlay","fill","needsVpt","isAFiller","beginPath","moveTo","lineTo","closePath","fillStyle","offsetY","m","gradientTransform","patternTransform","getCenterPoint","centerObjectH","_centerObject","centerObjectV","centerObject","viewportCenterObject","getVpCenter","viewportCenterObjectH","viewportCenterObjectV","center","toDatalessJSON","propertiesToInclude","toDatalessObject","_toObjectMethod","toJSON","methodName","clipPathData","excludeFromExport","_toObject","__serializeBgOverlay","originalValue","data","bgImage","bgColor","background","overlay","toSVG","markup","_setSVGPreamble","_setSVGHeader","clipPathId","_setSVGBgOverlayColor","_setSVGBgOverlayImage","_setSVGObjects","suppressPreamble","encoding","optViewBox","viewBox","createSVGFontFacesMarkup","createSVGRefElementsMarkup","createSVGClipPathMarkup","toClipPathSVG","shouldTransform","additionalTransform","fontList","styles","styleRow","fontListMarkup","_setSVGObject","bgOrOverlay","repeat","finalWidth","finalHeight","shouldInvert","loadFromJSON","json","serialized","parse","enlivedMap","properties","cloneWithoutData","multiplier","finalMultiplier","toCanvasElement","scaledWidth","scaledHeight","zoom","originalWidth","originalHeight","originalSkipControlsDrawing","newZoom","vp","newVp","originalRetina","objectsToRender","task","destroy","kill","touchEvents","getTouchInfo","event","touchProp","changedTouches","getPointer","scroll","_evt","clientX","clientY","isTouchEvent","pointerType","stopEvent","e","preventDefault","stopPropagation","makeBoundingBoxFromPoints","points","removeTransformFromObject","inverted","finalTransform","calcOwnMatrix","applyTransformToObject","addTransformToObject","otherOptions","setPositionByOrigin","resetObjectTransform","saveObjectTransform","sizeAfterTransform","dimX","dimY","bbox","calcPlaneChangeMatrix","from","to","sendPointToPlane","sendVectorToPlane","sendObjectToPlane","fireEvent","_target$canvas","originOffset","bottom","right","resolveOrigin","originValue","unitVectorX","zero","rotateVector","vector","createVector","magnitude","calcAngleBetweenVectors","crossProduct","dotProduct","calcVectorRotation","getUnitVector","getOrthonormalVector","counterClockwise","isBetweenVectors","AxB","AxT","BxT","NOT_ALLOWED_CURSOR","getActionFromCorner","alreadySelected","corner","control","controls","getActionName","isTransformCentered","originX","originY","invertOrigin","isLocked","lockingKey","commonEventInfo","eventData","pointer","findCornerQuadrant","coord","round","normalizePoint","getRelativeCenterPoint","translateToGivenOrigin","p2","getLocalPoint","padding","localPoint","dragHandler","newLeft","newTop","moveX","moveY","ColorNameMap","aliceblue","antiquewhite","aqua","aquamarine","azure","beige","bisque","black","blanchedalmond","blue","blueviolet","brown","burlywood","cadetblue","chartreuse","chocolate","coral","cornflowerblue","cornsilk","crimson","cyan","darkblue","darkcyan","darkgoldenrod","darkgray","darkgrey","darkgreen","darkkhaki","darkmagenta","darkolivegreen","darkorange","darkorchid","darkred","darksalmon","darkseagreen","darkslateblue","darkslategray","darkslategrey","darkturquoise","darkviolet","deeppink","deepskyblue","dimgray","dimgrey","dodgerblue","firebrick","floralwhite","forestgreen","fuchsia","gainsboro","ghostwhite","gold","goldenrod","gray","grey","green","greenyellow","honeydew","hotpink","indianred","indigo","ivory","khaki","lavender","lavenderblush","lawngreen","lemonchiffon","lightblue","lightcoral","lightcyan","lightgoldenrodyellow","lightgray","lightgrey","lightgreen","lightpink","lightsalmon","lightseagreen","lightskyblue","lightslategray","lightslategrey","lightsteelblue","lightyellow","lime","limegreen","linen","magenta","maroon","mediumaquamarine","mediumblue","mediumorchid","mediumpurple","mediumseagreen","mediumslateblue","mediumspringgreen","mediumturquoise","mediumvioletred","midnightblue","mintcream","mistyrose","moccasin","navajowhite","navy","oldlace","olive","olivedrab","orange","orangered","orchid","palegoldenrod","palegreen","paleturquoise","palevioletred","papayawhip","peachpuff","peru","pink","plum","powderblue","purple","rebeccapurple","red","rosybrown","royalblue","saddlebrown","salmon","sandybrown","seagreen","seashell","sienna","silver","skyblue","slateblue","slategray","slategrey","snow","springgreen","steelblue","teal","thistle","tomato","turquoise","violet","wheat","white","whitesmoke","yellow","yellowgreen","reRGBa","reHSLa","reHex","hue2rgb","q","rgb2Hsl","g","maxValue","minValue","h","s","l","fromAlphaToFloat","endsWith","hexify","toUpperCase","padStart","greyAverage","avg","Color","color","setSource","_source","_tryParsingColor","sourceFromHex","sourceFromRgb","sourceFromHsl","isUnrecognised","getSource","toRgb","toRgba","toHsl","toHsla","toHex","fullHex","toHexa","slice","getAlpha","setAlpha","alpha","toGrayscale","toBlackWhite","threshold","average","bOrW","overlayWith","otherColor","otherAlpha","otherSource","R","G","B","fromRgb","fromRgba","match","parsedValue","fromHsl","fromHsla","match1degrees","parseAngletoDegrees","fromHex","isShortNotation","expandedValue","split","hex","hexCouple","lowercase","numeric","getSvgAttributes","commonAttributes","parseUnit","fontSize","unit","exec","dpi","DPI","parseAlign","align","parsePreserveAspectRatioAttribute","attribute","firstPart","secondPart","trim","alignX","alignY","meetOrSlice","colorPropToSVG","inlineStyle","colorValue","opacityValue","opacity","createSVGRect","svgColor","w","FabricObjectSVGExportMixin","getSvgStyles","skipShadow","fillRule","strokeWidth","strokeDashArray","strokeDashOffset","strokeLineCap","strokeLineJoin","strokeMiterLimit","visibility","getSvgFilter","stroke","shadow","getSvgCommons","getSvgTransform","full","calcTransformMatrix","svgTransform","_toSVG","_reviver","_createBaseSVGMarkup","_createBaseClipPathSVGMarkup","objectMarkup","commonPieces","noStyle","withShadow","styleInfo","shadowInfo","vectorEffect","strokeUniform","absoluteClipPath","absolutePositioned","clipPathMarkup","addPaintOrder","paintFirst","getSvgRegex","arr","RegExp","TEXT_DECORATION_THICKNESS","fontProperties","textDecorationProperties","textLayoutProperties","additionalProps","styleProperties","textDefaultValues","_reNewline","_reSpacesAndTabs","_reSpaceAndTab","_reWords","underline","overline","linethrough","textAlign","lineHeight","textBackgroundColor","pathStartOffset","pathSide","pathAlign","charSpacing","deltaY","direction","CACHE_FONT_SIZE","MIN_TEXT_WIDTH","superscript","baseline","subscript","_fontSizeFraction","offsets","_fontSizeMult","JUSTIFY","JUSTIFY_LEFT","JUSTIFY_RIGHT","JUSTIFY_CENTER","reNum","String","raw","viewportSeparator","svgNS","reFontDeclaration","svgValidTagNames","svgViewBoxElements","svgInvalidAncestors","svgValidParents","attributesMap","cx","cy","display","fSize","cPath","svgValidTagNamesRegEx","svgViewBoxElementsRegEx","svgValidParentsRegEx","reViewBoxAttrValue","shadowOffsetRegex","reOffsetsAndBlur","shadowDefaultValues","blur","affectStroke","nonScaling","Shadow","parseShadow","shadowStr","replace","BLUR_BOX","fBoxX","fBoxY","capValue","stateProperties","cacheProperties","fabricObjectDefaultValues","minScaleLimit","objectCaching","centeredRotation","centeredScaling","dirty","interactiveObjectDefaultValues","noScaleCache","lockMovementX","lockMovementY","lockRotation","lockScalingX","lockScalingY","lockSkewingX","lockSkewingY","lockScalingFlip","cornerSize","touchCornerSize","transparentCorners","cornerColor","cornerStrokeColor","cornerStyle","cornerDashArray","hasControls","borderColor","borderDashArray","borderOpacityWhenMoving","borderScaleFactor","hasBorders","selectionBackgroundColor","evented","perPixelTargetFind","activeOn","hoverCursor","moveCursor","normalize","c","asin","elastic","defaultEasing","easeInCubic","easeOutCubic","easeInOutCubic","easeInQuart","easeOutQuart","easeInOutQuart","easeInQuint","easeOutQuint","easeInOutQuint","easeInSine","easeOutSine","easeInOutSine","easeInExpo","easeOutExpo","easeInOutExpo","easeInCirc","easeOutCirc","easeInOutCirc","easeInElastic","normA","normS","normP","easeOutElastic","normC","easeInOutElastic","easeInBack","easeOutBack","easeInOutBack","easeOutBounce","easeInBounce","easeInOutBounce","easeInQuad","easeOutQuad","easeInOutQuad","defaultAbort","AnimationBase","startValue","byValue","duration","delay","easing","onStart","onChange","onComplete","tick","bind","_onStart","_onChange","_onComplete","_abort","endValue","calculate","state","_state","isDone","start","firstTick","timestamp","startTime","Date","register","setTimeout","durationMs","boundDurationMs","durationProgress","valueProgress","unregister","ValueAnimation","timeElapsed","ArrayAnimation","defaultColorEasing","wrapColorCallback","rgba","ColorAnimation","startColor","endColor","isArrayAnimation","animate","animateColor","Intersection","status","append","isPointContained","T","A","infinite","AB","AT","isPointInPolygon","other","hits","inter","intersectSegmentSegment","intersectLineLine","a1","a2","b1","b2","aInfinite","bInfinite","a2xa1x","a2ya1y","b2xb1x","b2yb1y","a1xb1x","a1yb1y","uaT","ubT","uB","ua","ub","segmentsCoincide","intersectSegmentLine","s1","s2","l1","l2","intersectLinePolygon","result","intersectSegmentPolygon","intersectPolygonPolygon","points1","points2","coincidences","intersectPolygonRectangle","r1","r2","topRight","bottomLeft","ObjectGeometry","getX","getXY","getY","getRelativeX","setRelativeX","getRelativeY","setRelativeY","relativePosition","getRelativeXY","group","setRelativeXY","isStrokeAccountedForInDimensions","getCoords","aCoords","calcACoords","coords","intersection","intersectsWithObject","isContainedWithinObject","getBoundingRect","isOnScreen","isPartiallyOnScreen","allPointsAreOutside","getScaledWidth","_getTransformedDimensions","getScaledHeight","scaleToWidth","boundingRectFactor","scaleToHeight","getCanvasRetinaScaling","_this$canvas","getTotalAngle","getViewportTransform","_this$canvas2","rotateMatrix","tMatrix","finalMatrix","dim","transformMatrixKey","skipGroup","prefix","matrixCache","ownMatrixCache","_getNonTransformedDimensions","_calculateCurrentDimensions","dimOptions","preScalingStrokeValue","postScalingStrokeValue","noSkew","finalDimensions","fromOriginX","fromOriginY","toOriginX","toOriginY","translateToCenterPoint","translateToOriginPoint","relCenter","getPointByOrigin","pos","_getLeftTopCoords","FabricObject","name","setOptions","_createCacheCanvas","_cacheContext","_updateCacheCanvas","_limitCacheSize","dims","maxCacheSideLimit","minCacheSideLimit","limX","limY","capped","_getCacheCanvasDimensions","objectScale","getTotalObjectScaling","neededX","neededY","ceil","dimensionsChanged","zoomChanged","shouldRedraw","setTransform","drawingWidth","drawingHeight","translate","needFullTransform","contextTop","getObjectScaling","retina","getObjectOpacity","_constrainScale","isChanged","parent","isNotVisible","_setupCompositeOperation","drawSelectionBackground","_setOpacity","_setShadow","drawCacheOnCanvas","_removeCacheCanvas","drawObject","isCacheDirty","parentClipPaths","hasStroke","hasFill","needsItsOwnCache","ownCaching","isOnACache","willDrawShadow","drawClipPathOnCache","canvasWithClipPath","originalFill","originalStroke","_setClippingProperties","_render","_drawClipPath","createClipPathLayer","prevClipPath","skipCanvas","fillRect","_removeShadow","globalAlpha","_setStrokeStyles","decl","lineWidth","lineCap","lineDashOffset","lineJoin","miterLimit","gradientUnits","_applyPatternForTransformedGradient","strokeStyle","_applyPatternGradientTransform","_setFillStyles","_setLineDash","dashArray","setLineDash","sx","sy","multX","multY","scaling","shadowColor","shadowBlur","browserShadowBlurConstant","shadowOffsetX","shadowOffsetY","_renderPaintInOrder","_renderStroke","_renderFill","_pCtx$createPattern","pCanvas","pCtx","createPattern","_findCenterFromElement","objectForm","cloneAsImage","ImageClass","origParams","originalGroup","originalShadow","canvasProvider","withoutTransform","withoutShadow","boundingRect","shadowOffset","originalCanvas","setOnGroup","animatable","_animate","propIsColor","colorProperties","animationOptions","isDescendantOf","getAncestors","ancestors","findCommonAncestors","fork","otherFork","common","otherAncestors","ancestor","j","hasCommonAncestors","commonAncestors","isInFrontOf","ancestorData","firstCommonAncestor","headOfFork","pop","headOfOtherFork","thisIndex","otherIndex","propertiesToSerialize","customProperties","toFixedBound","val","_removeDefaultValues","hasStaticDefaultValues","baseValues","getPrototypeOf","baseValue","_fromObject","serializedObjectOptions","extraParam","enlivedObjectOptions","wrapWithFireEvent","actionHandler","extraEventInfo","actionPerformed","wrapWithFixedAnchor","centerPoint","constraint","changeObjectWidth","strokePadding","oldWidth","newWidth","changeWidth","renderCircleControl","styleOverride","xSize","sizeX","ySize","sizeY","myLeft","myTop","arc","renderSquareControl","xSizeBy2","ySizeBy2","strokeRect","Control","shouldActivate","controlKey","_fabricObject$canvas","getActiveObject","isControlVisible","getActionHandler","getMouseDownHandler","mouseDownHandler","getMouseUpHandler","mouseUpHandler","cursorStyleHandler","cursorStyle","actionName","getVisibility","_fabricObject$_contro","_fabricObject$_contro2","_controlsVisibility","setVisibility","positionHandler","currentControl","calcCornerCoords","objectCornerSize","centerX","centerY","isTouch","touchSizeX","touchSizeY","rotationStyleHandler","rotateObjectWithSnapping","ex","ey","theta","pivotPoint","lastAngle","curAngle","snapAngle","snapThreshold","rightAngleLocked","leftAngleLocked","hasRotated","rotationWithSnapping","scaleIsProportional","uniformIsToggled","uniScaleKey","uniformScaling","scalingIsForbidden","by","scaleProportionally","lockX","lockY","scaleMap","scaleCursorStyleHandler","n","scaleObject","forbidScaling","signX","signY","gestureScale","distance","original","originalDistance","oldScaleX","oldScaleY","scaleObjectFromCorner","scaleObjectX","scaleObjectY","scalingEqually","scalingX","scalingY","AXIS_KEYS","counterAxis","skew","lockSkewing","flip","skewMap","skewCursorStyleHandler","skewObject","axis","skewingSide","skewKey","skewingBefore","skewingStart","shearingStart","shearing","skewing","atan","changed","dimBefore","dimAfter","compensationFactor","skewHandler","originKey","lockSkewingKey","flipKey","counterOriginKey","counterFlipKey","counterOriginFactor","skewingDirection","finalHandler","skewHandlerX","skewHandlerY","isAltAction","altActionKey","scaleOrSkewActionName","isAlternative","scaleSkewCursorStyleHandler","scalingXOrSkewingY","scalingYOrSkewingX","createObjectDefaultControls","ml","mr","mb","mt","mtr","withConnection","createResizeControls","createTextboxDefaultControls","InteractiveFabricObject","createControls","targetCanvas","_currentTransform","action","startsWith","getActiveControl","__corner","oCoords","findControl","forTouch","cornerEntries","touchCorner","calcOCoords","rMatrix","positionMatrix","startMatrix","transformOptions","forEachControl","_calcCornerCoords","fn","_activeObject","wh","strokeBorders","_drawBorders","drawControlsConnectingLines","_renderControls","styleOptions","shouldDrawBorders","shouldDrawControls","isMoving","drawBorders","forActiveSelection","shouldStroke","setControlVisible","setControlsVisibility","clearContextTop","restoreManually","onDeselect","_options","onSelect","shouldStartDragging","_e","onDragStart","canDrop","renderDragSourceEffect","renderDropTargetEffect","applyMixins","derivedCtor","constructors","baseCtor","getOwnPropertyNames","prototype","defineProperty","getOwnPropertyDescriptor","create","isTransparent","tolerance","getImageData","alphaChannel","findIndexRight","StrokeProjectionsBase","strokeProjectionMagnitude","strokeUniformScalar","createSideVector","projectOrthogonally","applySkew","calcOrthogonalProjection","isSkewed","scaleUnitVector","unitVector","zeroVector","StrokeLineJoinProjections","getOrthogonalRotationFactor","vector1","vector2","C","AC","bisector","orthogonalProjection","correctSide","projectBevel","projections","projectMiter","hypotUnitScalar","miterVector","projectRoundNoSkew","startCircle","endCircle","radiusOnAxisX","radiusOnAxisY","projectRoundWithSkew","circleRadius","newY","furthestY","newX","furthestX","projectRound","isStraightLine","newOrigin","proj0","proj1","comparisonVector","isProj0Start","projectPoints","project","originPoint","projectedPoint","StrokeLineCapProjections","projectButt","projection","projectSquare","strokePointingOut","projectedA","projectStrokeOnPoints","openPath","reduced","cloneStyles","newObj","keyInner","capitalize","string","firstLetterOnly","charAt","escapeXml","segmenter","getSegmenter","Intl","Segmenter","granularity","graphemeSplit","textstring","segments","segment","graphemeSplitImpl","graphemes","chr","getWholeChar","str","code","charCodeAt","isNaN","next","prev","hasStyleChanged","prevStyle","thisStyle","forTextSpans","textDecorationThickness","stylesToArray","text","textLines","stylesArray","charIndex","chars","end","stylesFromArray","stylesObject","styleIndex","SHARED_ATTRIBUTES","selectorMatches","selector","nodeName","classNames","getAttribute","azAz","matcher","splitClassNames","doesSomeParentMatch","selectors","parentMatching","parentElement","elementMatchesRule","firstMatching","getGlobalStylesForElement","cssRules","rule","normalizeAttr","attr","_attributesMap","regex","cleanupSvgAttribute","attributeValue","transforms","transformList","reTransformList","reTransform","reTransformAll","parseTransformAttribute","test","matchAll","transformMatch","matchedParams","operation","rawArgs","arg1","arg2","arg3","arg4","arg5","arg","normalizeValue","parentAttributes","parsed","ouputValue","transformMatrix","fillIndex","strokeIndex","parseFontDeclaration","oStyle","parseStyleObject","parseStyleString","chunk","parseStyleAttribute","colorAttributesMap","setStrokeFillOpacity","attributes","colorAttr","parseAttributes","parentFontSize","ownAttributes","normalizedStyle","normalizedAttr","normalizedValue","font","mergedAttrs","rectDefaultValues","rx","ry","RECT_PROPS","Rect","_initRxRy","isRounded","bezierCurveTo","fromElement","restOfparsedAttributes","ATTRIBUTE_NAMES","Boolean","LAYOUT_TYPE_INITIALIZATION","LAYOUT_TYPE_ADDED","LAYOUT_TYPE_REMOVED","LAYOUT_TYPE_IMPERATIVE","LAYOUT_TYPE_OBJECT_MODIFIED","LAYOUT_TYPE_OBJECT_MODIFYING","getObjectBounds","destinationGroup","currentGroup","objectCenter","accountForStroke","strokeUniformVector","scalingStrokeWidth","sizeVector","LayoutStrategy","calcLayoutResult","shouldPerformLayout","calcBoundingBox","prevStrategy","strategy","shouldLayoutClipPath","getInitialSize","overrides","bboxSize","bboxLeftTop","bboxCenter","actualSize","relativeCorrection","FitContentLayout","LAYOUT_MANAGER","LayoutManager","_subscriptions","performLayout","strictContext","bubbles","_prevLayoutStrategy","onBeforeLayout","layoutResult","getLayoutResult","commitLayout","onAfterLayout","attachHandlers","trigger","subscribe","unsubscribe","_context","delete","unsubscribeTargets","targets","subscribeTargets","tricklingContext","layoutManager","prevCenter","nextCenter","correction","layoutObjects","_context$x","_context$y","layoutObject","bubblingContext","NoopLayoutManager","groupDefaultValues","subTargetCheck","interactive","Group","groupInit","_options$layoutManage","__objectSelectionTracker","__objectSelectionMonitor","__objectSelectionDisposer","enterGroup","canEnterGroup","_filterObjectsBeforeEnteringGroup","allowedObjects","_onAfterObjectsChange","removeParentTransform","exitGroup","_shouldSetNestedCoords","removeAll","_activeObjects","selected","activeObjects","_watchObject","watch","_enterGroup","activeObject","_exitGroup","ownCache","preserveObjectStacking","triggerLayout","__serializeObjects","method","_includeDefaultValues","originalDefaults","_createSVGBgRect","fillStroke","commons","svgString","bg","abortable","hydratedOptions","layoutClass","strategyClass","groupSVGElements","findScaleToFit","destination","findScaleToCover","commaWsp","reArcCommandPoints","rePathCommand","repeatedCommands","M","segmentToBezier","theta1","theta2","cosTh","sinTh","cx1","cy1","mT","fromX","fromY","costh1","sinth1","costh2","sinth2","toX","toY","cp1X","cp1Y","cp2X","cp2Y","arcToSegments","large","sweep","rotateX","root","sinTheta","px","py","rx2","ry2","py2","px2","pl","_rx","_ry","mTheta","calcVectorAngle","dtheta","mDelta","th3","ux","uy","vx","vy","ta","tb","CB1","CB2","CB3","CB4","getBoundsOfCurve","begx","begy","cp1x","cp1y","cp2x","cp2y","endx","endy","argsString","cachesBoundsOfCurve","boundsOfCurveCache","tvalues","bounds","b2ac","sqrtb2ac","t1","t2","jlen","iterator","getPointOnCubicBezierIterator","fromArcToBeziers","fx","fy","rot","tx","ty","segsNorm","makePathSimpler","x1","y1","destinationPath","previous","controlX","controlY","parsedCommand","converted","calcLineLength","x2","y2","pct","c1","c2","c3","c4","QB1","QB2","QB3","getTangentCubicIterator","p1x","p1y","p2x","p2y","p3x","p3y","p4x","p4y","qb1","qb2","qb3","tangentX","tangentY","getPointOnQuadraticBezierIterator","getTangentQuadraticIterator","invT","pathIterator","tempP","tmpLen","perc","findPercentageForDistance","segInfo","nextLen","nextStep","lastPerc","angleFinder","getPathSegmentsInfo","totalLength","tempInfo","info","basicInfo","command","destX","destY","getPointOnPath","infos","segPercent","rePathCmdAll","regExpArcCommandPoints","reMyNum","commandLengths","parsePath","pathString","_pathString$match","chain","matchStr","commandLetter","commandLength","paramArr","lastIndex","out","newCommand","transformedCommand","getSmoothPathFromPoints","p1","multSignX","multSignY","manyPoints","midPoint","transformPath","pathOffset","pathSegment","newSegment","getRegularPolygonPath","numVertexes","radius","interiorAngle","rotationAdjustment","rad","joinPath","pathData","mergeClipPaths","_b$group","getRandomInt","random","_assignTransformMatrixProps","removeTransformMatrixForSvgParsing","preserveAspectRatioOptions","cropX","cropY","offsetLeft","offsetTop","setStyle","elementStyle","setProperty","CanvasDOMManager","containerClass","upperCanvasEl","createUpperCanvas","upper","applyCanvasStyle","container","createContainerElement","replaceChild","className","removeChild","canvasDefaults","centeredKey","selection","selectionKey","selectionColor","selectionDashArray","selectionBorderColor","selectionLineWidth","selectionFullyContained","defaultCursor","freeDrawingCursor","notAllowedCursor","targetFindTolerance","skipTargetFind","stopContextMenu","fireRightClick","fireMiddleClick","enablePointerEvents","SelectableCanvas","_this$elements$upper","_this$elements$upper2","wrapperEl","_objectsToRender","deselected","_discardActiveObject","_hoveredTarget","_hoveredTargets","_chooseObjectsToRender","contextTopDirty","_groupSelector","isDrawingMode","renderTopLayer","_isCurrentlyDrawing","freeDrawingBrush","_drawSelection","renderTop","setTargetFindTolerance","pixelFindCanvasEl","pixelFindContext","isTargetTransparent","selectionBgc","enhancedTolerance","_isSelectionKeyPressed","sKey","_shouldClearSelection","getActiveObjects","_shouldCenterTransform","modifierKeyPressed","centerTransform","_getOriginFromCorner","controlName","_setupCurrentTransform","_control$getActionHan","getScenePoint","altKey","lastX","lastY","shiftKey","setCursor","cursor","deltaX","extent","strokeOffset","minX","minY","maxX","maxY","findTarget","_targetInfo","subTargets","currentSubTargets","aObjects","targetInfo","searchPossibleTargets","currentContainer","currentTarget","fullTargetInfo","activeObjectTargetInfo","activeObjectControl","getViewportPoint","altSelectionKey","_pointIsInObjectSelectionArea","viewportZoom","angleRadians","cosP","sinP","cosPSinP","cosPMinusSinP","_checkTarget","isEditing","viewportPoint","_searchPossibleTargets","subTarget","_viewportPoint","_getPointerImpl","_scenePoint","fromViewport","boundsWidth","boundsHeight","cssScale","_resetTransformEventData","_setBrushStyles","willReadFrequently","getTopContext","getSelectionContext","getSelectionElement","active","_fireSelectionEvents","oldObjects","somethingChanged","invalidate","added","setActiveObject","currentActives","_setActiveObject","prevActiveObject","endCurrentTransform","discardActiveObject","discarded","_finalizeCurrentTransform","_scaling","originalProperties","_realizeGroupTransformOnObject","layoutProps","originalValues","TextEditingManager","cb","hiddenTextarea","focus","__disposer","exitTextEditing","exitEditing","onMouseMove","_this$target","updateSelectionOnMouseMove","addEventOptions","passive","getEventPoints","scenePoint","addListener","removeListener","syntheticEventConfig","mouse","in","targetIn","targetOut","canvasIn","canvasOut","drag","Canvas","eventHandler","addOrRemove","_getEventPrefix","functor","_eventjsFunctor","canvasElement","eventTypePrefix","_onResize","_onMouseDown","_onMouseMove","_onMouseOut","_onMouseEnter","_onMouseWheel","_onContextMenu","_onClick","_onDragStart","_onDragEnd","_onDragOver","_onDragEnter","_onDragLeave","_onDrop","_onTouchStart","removeListeners","_onMouseUp","_onTouchEnd","clearTimeout","_willAddMouseDown","_cacheTransformEventData","_handleEvent","shared","nestedTarget","_isClick","_dragSource","_onDragProgress","_renderDragEffects","dropTarget","_dropTarget","didDrop","dataTransfer","dropEffect","dragSource","_draggedoverTarget","eventType","_fireEnterLeaveEvents","_basicEventHandler","clicks","detail","getPointerId","evt","identifier","pointerId","_isMainEvent","isPrimary","touches","mainTouchId","shouldPreventScrolling","currentActiveObject","__onMouseDown","__onMouseUp","__onMouseMove","_shouldRender","_this$_activeObject","isClick","button","_onMouseUpInDrawingMode","shouldRender","targetWasActive","handleSelection","found","originalControl","originalMouseUpHandler","_setCursorFromEvent","extraData","_onMouseDownInDrawingMode","onMouseDown","_onMouseMoveInDrawingMode","onMouseUp","grouped","handleMultiSelection","groupSelector","_fireOverOutEvents","_transformObject","textEditingManager","fireSyntheticInOutEvents","oldTarget","fireCanvas","draggedoverTarget","targetChanged","outOpt","nextTarget","inOpt","previousTarget","localPointer","_performTransformAction","activeSelection","reverse","_target","isAS","prevActiveObjects","multiSelectAdd","klass","newActiveSelection","point1","point2","collectedObjects","linearDefaultCoords","radialDefaultCoords","ifNaN","valueIfNaN","RE_PERCENT","isPercent","parsePercent","NaN","RE_KEY_VALUE_PAIRS","RE_KEY_VALUE","parseColorStop","opacityMultiplier","keyValuePairs","parseColorStops","opacityAttr","colorStops","colorStopEls","getElementsByTagName","parseType","parseGradientUnits","convertPercentUnitsToValues","valuesToConvert","finalValue","propValue","getValue","parseLinearCoords","parseRadialCoords","parseCoords","Gradient","addColorStop","colorStop","preTransform","sort","needsSwap","minRadius","maxRadius","percentageShift","gradient","createLinearGradient","createRadialGradient","svgOptions","viewBoxWidth","viewBoxHeight","Pattern","isImageSource","isCanvasSource","sourceToString","complete","naturalWidth","naturalHeight","patternSource","patternOffsetX","patternOffsetY","patternWidth","patternHeight","BaseBrush","_saveAndTransform","needsFullRender","_resetShadow","_isOutSideCanvas","Path","_setPath","adjustPosition","setBoundingBox","_calcBoundsFromPath","quadraticCurveTo","pathCmd","sourcePath","_getOffsetTransform","digits","_calcDimensions","subpathStartX","subpathStartY","parsedAttributes","isEmptySVGPath","PencilBrush","_points","_hasStraightLine","drawSegment","drawStraightLine","straightLineKey","_prepareForDrawing","_addPoint","limitedToCanvasSize","oldEnd","_finalizeAndAddPath","_reset","convertPointsToSVGPath","createPath","decimatePoints","lastPoint","cDistance","adjustedDistance","newPoints","decimate","CIRCLE_PROPS","circleDefaultValues","startAngle","endAngle","Circle","setRadius","getRadiusX","getRadiusY","startX","startY","endX","endY","largeFlag","sweepFlag","otherParsedAttributes","CircleBrush","drawDot","addPoint","dot","originalRenderOnAddRemove","circles","circle","pointerPoint","getUniqueRects","rects","uniqueRects","uniqueRectsArray","SprayBrush","sprayChunks","sprayChunk","addSprayChunk","renderChunck","chunck","rect","optimizeOverlapping","sprayChunck","density","dotWidthVariance","dotWidth","randomOpacity","PatternBrush","getPatternSrc","dotDistance","patternCanvas","patternCtx","getPattern","pattern","topLeft","coordProps","Line","_setWidthHeight","calcLinePoints","origStrokeStyle","_this$stroke","_x1","_x2","_y1","_y2","xMult","yMult","triangleDefaultValues","Triangle","widthBy2","heightBy2","ellipseDefaultValues","ELLIPSE_PROPS","Ellipse","getRx","getRy","parsePointsAttribute","pointsSplit","parsedPoints","polylineDefaultValues","exactBoundingBox","Polyline","initialized","isOpen","_projectStrokeOnPoints","strokeDiff","bboxNoStroke","layoutProperties","_options$width","_options$height","_options$width2","_options$height2","output","diffX","diffY","Polygon","StyledText","isEmptyStyles","lineIndex","line","p3","styleHas","cleanStyle","stylesCount","letterCount","stylePropertyValue","allStyleObjectPropertiesMatch","graphemeCount","styleObject","stylePropertyHasBeenSet","_textLines","removeStyle","lineNum","charNum","_extendStyles","get2DCursorLocation","_getLineStyle","_setLineStyle","newStyle","_getStyleDeclaration","_setStyleDeclaration","getSelectionStyles","startIndex","endIndex","getStyleAtPosition","getCompleteStyleDeclaration","setSelectionStyles","_forceClearCache","_lineStyle$charIndex","lineStyle","_styleProperties","_deleteStyleDeclaration","_deleteLineStyle","multipleSpacesRegex","dblQuoteRegex","createSVGInlineRect","TextSVGExportMixin","_getSVGLeftTopOffsets","textAndBg","_getSVGTextAndBg","textTop","textLeft","_wrapSVGTextAndBg","textSvg","lineTop","getHeightOfLine","textBgRects","textSpans","noShadow","textDecoration","getSvgTextDecoration","textTopOffset","textLeftOffset","lineOffset","_getLineLeftOffset","_setSVGTextLineBg","_setSVGTextLineText","_createTextCharSpan","char","styleDecl","charBox","numFractionDigit","styleProps","getSvgSpanStyles","fillStyles","dySpan","renderLeft","angleAttr","wBy2","renderPoint","isJustify","actualStyle","nextStyle","charsToRender","boxWidth","timeToRender","__charBounds","kernedWidth","leftOffset","heightOfLine","boxStart","currentColor","lastColor","getValueOfPropertyAt","useWhiteSpace","thickness","decoration","measuringContext","getMeasuringContext","FabricText","setPathInfo","initDimensions","segmentsInfo","_splitText","newLines","_splitTextIntoLines","lines","graphemeLines","_unwrappedTextLines","_unwrappedLines","_text","graphemeText","_clearCache","calcTextWidth","cursorWidth","calcTextHeight","enlargeSpaces","diffSpace","currentLineWidth","numberOfSpaces","accumulatedSpace","charBound","spaces","isEndOfWrapping","getLineWidth","missingNewlineOffset","_lineIndex","selectionStart","skipWrapping","_setTextStyles","_renderTextLinesBackground","_renderTextDecoration","_renderTextStroke","_renderTextFill","charStyle","forMeasuring","textBaseline","_getFontDeclaration","maxWidth","_renderTextLine","_renderChars","_getLeftOffset","lineTopOffset","_getTopOffset","lineLeftOffset","drawStart","_measureChar","_char","previousChar","prevCharStyle","fontDeclaration","couple","stylesAreEqual","fontMultiplier","coupleWidth","previousWidth","measureText","getHeightOfChar","measureLine","lineInfo","_measureLine","_getWidthOfCharSpacing","prevGrapheme","graphemeInfo","llength","lineBounds","grapheme","_getGraphemeBox","positionInPath","totalPathLength","_setGraphemeOnPath","numOfSpaces","centerPosition","skipLeft","previousBox","__lineHeights","maxHeight","_renderTextCommon","lineHeights","shortCut","isLtr","currentDirection","drawingLeft","_renderChar","_applyPatternGradientTransformText","handleFiller","fullDecl","shouldFill","fillOffsets","fillText","strokeOffsets","strokeText","setSuperscript","_setScript","setSubscript","schema","loc","lineDiff","__lineWidths","_charStyle$property","topOffset","offsetAligner","lastDecoration","lastFill","lastTickness","currentDecoration","currentFill","currentTickness","currentSize","currentDy","finalTickness","parsedFontFamily","genericFonts","newLine","newText","needsDims","isAddingPath","textAnchor","restOfOptions","textContent","textHeightScaleFactor","lineHeightDiff","scaledDiff","textHeight","offX","DraggableTextDelegate","dragEnterHandler","dragOverHandler","dragLeaveHandler","dragEndHandler","dropHandler","_dispose","isPointerOverSelection","newSelection","getSelectionStartFromPointer","selectionEnd","__mouseDownInPlace","isActive","__dragStartFired","setCursorByClick","initDelayedCursor","__isDraggingOver","getDragStartSelection","__dragStartSelection","setDragImage","_e$dataTransfer","flipFactor","boundaries","_getCursorBoundaries","selectionPosition","diff","bgc","dragImage","border","__dragImageDisposer","appendChild","setData","stringify","effectAllowed","abortCursorAnimation","editable","defaultPrevented","dragStartSelection","targetCanDrop","ev","_e$dataTransfer2","insert","getData","trailing","selectionStartOffset","removeChars","trimEnd","insertChars","enterEditing","_updateTextarea","_e$dataTransfer3","reNonWord","ITextBehavior","initBehavior","_tick","_onTickComplete","_animateCursor","toValue","_currentCursorOpacity","renderCursorOrSelection","_currentTickState","cursorDuration","_this$_currentTickCom","_currentTickCompleteState","restart","cursorDelay","shouldClear","cursorAnimation","restartCursorIfNeeded","selectAll","_fireSelectionChanged","cmdAll","getSelectedText","findWordBoundaryLeft","startFrom","_reSpace","findWordBoundaryRight","findLineBoundaryLeft","findLineBoundaryRight","searchWordBoundary","selectWord","newSelectionStart","newSelectionEnd","selectLine","enterEditingImpl","initHiddenTextarea","_saveEditingProps","_setEditingProps","_textBeforeEdit","activeElement","currentStart","currentEnd","__selectionStartOnMouseDown","editingBorderColor","fromStringToGraphemeSelection","smallerTextStart","graphemeStart","smallerTextEnd","graphemeEnd","fromGraphemeToStringSelection","cursorOffsetCache","inCompositionMode","updateTextareaPosition","updateFromTextArea","textarea","_calcTextareaPosition","desiredPosition","compositionStart","cursorLocation","charHeight","upperCanvas","upperCanvasWidth","upperCanvasHeight","clientWidth","clientHeight","_savedProps","_restoreEditingProps","exitEditingImpl","isTextChanged","_removeExtraneousStyles","removeStyleFromTo","lineStart","charStart","lineEnd","charEnd","styleObj","shiftLineStyles","numericChar","clonedStyles","numericLine","insertNewlineStyleObject","qty","copiedStyle","newLineStyles","originalLineLength","isEndOfLine","someStyleIsCarryingOver","currentCharStyle","numIndex","styleCarriedOver","insertCharStyleObject","quantity","currentLineStyles","currentLineStylesCloned","numericIndex","insertNewStyleBlock","insertedText","cursorLoc","addedLines","linesLength","setSelectionStartEndWithShift","_selectionDirection","ITextKeyBehavior","autocapitalize","autocorrect","autocomplete","spellcheck","wrap","hiddenTextareaContainer","keydown","keyup","input","copy","cut","paste","compositionstart","compositionupdate","compositionend","onKeyDown","keyMap","keysMapRtl","keysMap","keyCode","ctrlKeysMapDown","ctrlKey","metaKey","stopImmediatePropagation","onKeyUp","_copyDone","ctrlKeysMapUp","onInput","fromPaste","updateAndFire","nextText","charCount","nextCharCount","_selectionStart","_selectionEnd","removedText","charDiff","removeFrom","removeTo","textareaSelection","backDelete","copiedText","disableStyleCopyPaste","copiedTextStyle","onCompositionStart","onCompositionEnd","onCompositionUpdate","compositionEnd","_getWidthBeforeCursor","widthBeforeCursor","bound","getDownCursorOffset","isRight","selectionProp","_getSelectionForOffset","indexOnOtherLine","_getIndexOnLine","textAfterCursor","getUpCursorOffset","textBeforeCursor","widthOfCharsOnLine","indexOnLine","charWidth","foundMatch","leftEdge","rightEdge","offsetFromLeftEdge","offsetFromRightEdge","moveCursorDown","_moveCursorUpOrDown","moveCursorUp","moveCursorWithShift","moveCursorWithoutShift","moveCursorLeft","_moveCursorLeftOrRight","_move","newValue","_moveLeft","_moveRight","moveCursorLeftWithoutShift","change","moveCursorLeftWithShift","moveCursorRight","moveCursorRightWithShift","moveCursorRightWithoutShift","notALeftClick","ITextClickBehavior","_mouseDownHandler","doubleClickHandler","tripleClickHandler","draggableTextDelegate","didDrag","mouseOffset","charLength","widthAfter","MOVE_CURSOR_UP","MOVE_CURSOR_DOWN","MOVE_CURSOR_LEFT","MOVE_CURSOR_RIGHT","EXIT_EDITING","applyCanvasTransform","protectedDefaultValues","iTextDefaultValues","cursorColor","caching","IText","setSelectionStart","_updateAndFire","setSelectionEnd","findAncestorsWithClipPath","hasAncestorsWithClipping","drawingCtx","drawingCanvas","renderCursor","renderSelection","clippingCanvas","clippingCtx","clipPathAncestors","skipCaching","_getCursorBoundariesOffsets","__getCursorBoundariesOffsets","renderCursorAt","_renderCursor","getCursorRenderingData","_renderSelection","dragSelection","startLine","endLine","startChar","endChar","realLineHeight","boxEnd","drawHeight","extraTop","drawWidth","compositionColor","getCurrentCharFontSize","cp","_getCurrentCharIndex","getCurrentCharColor","cursorPosition","textboxDefaultValues","minWidth","dynamicMinWidth","_wordJoiners","splitByGrapheme","Textbox","_styleMap","_generateStyleMap","textInfo","realLineCount","realLineCharCount","isWrapping","nextLineIndex","nextOffset","shouldLimit","mapNextLine","p2Number","_wrapText","desiredWidth","getGraphemeDataForRender","wrapped","wordsData","_wrapLine","infix","largestWordWidth","wordsOrGraphemes","wordSplit","word","graphemeArray","_measureWord","charOffset","reservedSpace","additionalSpace","infixWidth","lineJustStarted","wordWidth","getMinWidth","linesToKeep","propNumber","ClipPathLayout","clipPathCenter","FixedLayout","ActiveSelectionLayoutManager","parents","Set","selectedObjects","activeSelectionDefaultValues","multiSelectionStacking","ActiveSelection","findIndex","groups","childrenOverride","Canvas2dFilterBackend","applyFilters","filters","sourceElement","sourceWidth","sourceHeight","desynchronized","imageData","originalImageData","pipelineState","originalEl","filterBackend","applyTo","imageDataPostFilter","putImageData","WebGLFilterBackend","tileSize","Float32Array","setupGLContext","captureGPUInfo","createWebGLCanvas","glOptions","premultipliedAlpha","depth","stencil","antialias","clearColor","cachedTexture","getCachedTexture","destinationWidth","destinationHeight","sourceTexture","createTexture","targetTexture","originalTexture","passes","webgl","aPosition","programCache","pass","tempFbo","createFramebuffer","bindFramebuffer","FRAMEBUFFER","resizeCanvasIfNeeded","copyGLTo2D","bindTexture","TEXTURE_2D","deleteTexture","deleteFramebuffer","clearWebGLCaches","textureCache","textureImageSource","NEAREST","RGBA","UNSIGNED_BYTE","CLAMP_TO_EDGE","TEXTURE_MAG_FILTER","TEXTURE_MIN_FILTER","TEXTURE_WRAP_S","TEXTURE_WRAP_T","texture","texParameteri","texImage2D","uniqueId","evictCachesForKey","glCanvas","sourceY","copyGLTo2DPutImageData","dWidth","dHeight","numBytes","u8","Uint8Array","imageBuffer","u8Clamped","Uint8ClampedArray","readPixels","imgData","ImageData","gpuInfo","renderer","vendor","ext","UNMASKED_RENDERER_WEBGL","UNMASKED_VENDOR_WEBGL","initFilterBackend","enableGLFiltering","getFilterBackend","strict","setFilterBackend","backend","imageDefaultValues","srcFromAttribute","minimumScaleTrigger","imageSmoothing","IMAGE_PROPS","FabricImage","setElement","_element","removeTexture","_originalElement","resizeFilter","applyResizeFilters","elementKey","getCrossOrigin","getOriginalSize","_stroke","filterObj","getSrc","hasCrop","imageMarkup","strokeSvg","imageRendering","getSvgSrc","origFill","filtered","setSrc","minimumScale","elementToFilter","_filteredEl","_filterScalingX","_filterScalingY","_lastScaleX","_lastScaleY","isNeutralState","imgElement","_needsResize","elementToDraw","elWidth","elHeight","sX","sY","sW","sH","maxDestW","maxDestH","_resetWidthHeight","pAR","preserveAspectRatio","pWidth","pHeight","rWidth","rHeight","f","rf","hydratedProps","fromURL","imageOptions","applyViewboxTransform","viewBoxAttr","widthAttr","heightAttr","goodViewbox","missingViewBox","missingDimAttr","translateMatrix","widthDiff","heightDiff","parsedDim","pasedViewBox","createElementNS","firstChild","getTagName","node","tagName","svgInvalidAncestorsRegEx","hasInvalidAncestor","getMultipleNodes","nodeNames","nodeArray","nodeList","getElementsByTagNameNS","parseUseDirectives","nodelist","skipAttributes","useElement","useAttributes","useAttrMap","xlink","href","referencedElement","clonedOriginal","cloneNode","originalAttributes","originalAttrMap","currentTrans","el3","setAttributeNS","childNodes","styleRecord","mergedStyles","entry","gradientsAttrs","xlinkAttr","recursivelyParseGradientsXlink","_gradient$getAttribut","xLink","referencedGradient","children","referenceClone","tagArray","getGradientDefs","elList","gradientDefs","getCSSRules","allRules","styleContents","ruleObj","declaration","propertyValuePairs","pair","_rule","findTag","ElementsParser","clipPaths","regexUrl","createObject","resolveGradient","resolveClipPath","extractPropertyDefinition","storage","gradientDef","usingElement","exactOwner","clipPathElements","objTransformInv","clipPathTag","clipPathOwner","clipPathElement","enlivedClippath","clipRule","gTransform","isValidSvgTag","createEmptyResponse","allElements","parseSVGDocument","descendants","localClipPaths","elementParser","loadSVGFromString","parser","DOMParser","parseFromString","loadSVGFromURL","fetch","response","ok","svgText","ACTION_NAME","createPolyPositionHandler","pointIndex","polyObject","polyActionHandler","poly","mouseLocalPosition","factoryPolyActionHandler","anchorPoint","anchorPointInParentPlane","newAnchorPointInParentPlane","createPolyActionHandler","createPolyControls","calcPathPointPosition","pathObject","commandIndex","movePathPoint","anchorCommand","pathPositionHandler","pathActionHandler","indexFromPrevCommand","previousCommandType","PathPointControl","controlFill","controlStroke","PathControlPointControl","connectToCommandIndex","connectToPointIndex","connectionDashArray","commandType","createControl","commandIndexPos","pointIndexPos","isControlPoint","controlPointStyle","pointStyle","createPathControls","isWebGLPipelineState","isPutImageFaster","sourceCanvas","ArrayBuffer","testContext","testPipelineState","performance","now","drawImageTime","putImageDataTime","highPsourceCode","identityFragmentShader","vertexSource","BaseFilter","getFragmentSource","getVertexSource","createProgram","vertexShader","VERTEX_SHADER","program","getShaderInfoLog","attachShader","linkProgram","getProgramParameter","LINK_STATUS","getProgramInfoLog","uniformLocations","getUniformLocations","uStepW","getUniformLocation","uStepH","attributeLocations","getAttributeLocations","getAttribLocation","locations","sendAttributeData","aPositionData","attributeLocation","buffer","createBuffer","bindBuffer","ARRAY_BUFFER","enableVertexAttribArray","vertexAttribPointer","FLOAT","bufferData","STATIC_DRAW","_setupFrameBuffer","framebufferTexture2D","COLOR_ATTACHMENT0","finish","_swapTextures","temp","applyToWebGL","applyTo2d","getCacheKey","retrieveShader","shader","useProgram","uniform1f","sendUniformData","viewport","drawArrays","TRIANGLE_STRIP","bindAdditionalTexture","textureUnit","activeTexture","TEXTURE0","unbindAdditionalTexture","_gl","_uniformLocations","createHelpLayer","helpLayer","defaultKeys","filterOptions","blendColorFragmentSource","screen","difference","lighten","darken","exclusion","tint","blendColorDefaultValues","mode","BlendColor","tg","alpha1","oR","oG","oB","uniform4fv","uColor","mask","blendImageDefaultValues","BlendImage","image","TEXTURE1","calculateMatrix","blendImage","canvas1","blendData","uniform1i","uImage","uniformMatrix3fv","uTransformMatrix","enlivedImage","blurDefaultValues","Blur","aspectRatio","horizontal","blurValue","getBlurValue","samples","bytesInRow","totalA","minIRow","maxIRow","percent","weight","sampledPixel","localAlpha","delta","chooseRightDelta","uniform2fv","uDelta","blurScale","brightnessDefaultValues","brightness","Brightness","uBrightness","colorMatrixDefaultValues","colorsOnly","ColorMatrix","constants","uniformMatrix4fv","uColorMatrix","uConstants","createColorMatrixFilter","_Class","newClass","Brownie","Vintage","Kodachrome","Technicolor","Polaroid","Sepia","BlackWhite","Composed","subFilters","enlivedFilters","contrastDefaultValues","contrast","Contrast","contrastF","uContrast","Convolute_3_1","Convolute_3_0","Convolute_5_1","Convolute_5_0","Convolute_7_1","Convolute_7_0","Convolute_9_1","Convolute_9_0","convoluteDefaultValues","opaque","Convolute","weights","side","halfSide","sw","sh","createImageData","dst","alphaFac","dstOff","scx","scy","srcOff","wt","uniform1fv","uMatrix","GAMMA","gammaDefaultValues","gamma","Gamma","rInv","gInv","bInv","rgbValues","rgb","uniform3fv","uGamma","lightness","luminosity","grayscaleDefaultValues","Grayscale","uMode","hueRotationDefaultValues","rotation","HueRotation","cosine","sine","aThird","aThirdSqtSin","OneMinusCos","invertDefaultValues","invert","Invert","uInvert","uAlpha","noiseDefaultValues","noise","Noise","rand","uNoise","uSeed","pixelateDefaultValues","blocksize","Pixelate","_i","_j","uBlocksize","removeColorDefaultValues","useAlpha","RemoveColor","lowC","highC","uLow","uHigh","resizeDefaultValues","resizeType","lanczosLobes","Resize","uTaps","taps","getFilterWindow","tempScale","filterWindow","generateShader","getTaps","lobeFunction","lanczosCreate","applyToForWebgl","dW","dH","lobes","xx","rcpScaleX","rcpScaleY","oW","oH","newData","sliceByTwo","hermiteFastResize","bilinearFiltering","lanczosResize","mult","doneW","doneH","stepW","stepH","dX","dY","tmpCanvas","process","u","fX","fY","ratioX","icenter","ratioY","range2X","cacheLanc","range2Y","lanczos","rcpRatioX","rcpRatioY","srcData","destData","destImg","xDiff","yDiff","chnl","origPix","w4","pixels","destImage","destPixels","ratioW","ratioH","ratioWHalf","ratioHHalf","img2","data2","weightsAlpha","gxR","gxG","gxB","gxA","yy","w0","saturationDefaultValues","saturation","Saturation","adjust","uSaturation","vibranceDefaultValues","vibrance","Vibrance","amt","uVibrance","StaticCanvasBase","createPNGStream","opts","createJPEGStream","CanvasBase"],"mappings":"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S;AACjBC,EAAAA,UAAU,EAAE,SAAS;AACrBC,EAAAA,QAAQ,EAAE,SAAS;AACnBC,EAAAA,QAAQ,EAAE,SAAS;AACnBC,EAAAA,MAAM,EAAE,SAAS;AACjBC,EAAAA,MAAM,EAAE,SAAS;AACjBC,EAAAA,OAAO,EAAE,SAAS;AAClBC,EAAAA,SAAS,EAAE,SAAS;AACpBC,EAAAA,SAAS,EAAE,SAAS;AACpBC,EAAAA,SAAS,EAAE,SAAS;AACpBC,EAAAA,IAAI,EAAE,SAAS;AACfC,EAAAA,WAAW,EAAE,SAAS;AACtBC,EAAAA,SAAS,EAAE,SAAS;AACpBnhB,EAAAA,GAAG,EAAE,SAAS;AACdohB,EAAAA,IAAI,EAAE,SAAS;AACfC,EAAAA,OAAO,EAAE,SAAS;AAClBC,EAAAA,MAAM,EAAE,SAAS;AACjBC,EAAAA,SAAS,EAAE,SAAS;AACpBC,EAAAA,MAAM,EAAE,SAAS;AACjBC,EAAAA,KAAK,EAAE,SAAS;AAChBC,EAAAA,KAAK,EAAE,MAAM;AACbC,EAAAA,UAAU,EAAE,SAAS;AACrBC,EAAAA,MAAM,EAAE,MAAM;AACdC,EAAAA,WAAW,EAAE;AACf,CAAC;;ACzJD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,MAAMC,MAAM,GAAGA,MACpB,kJAAkJ;;AAEpJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A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hhC,EAAAA,WAAW,EAAE,MAAM;AACnBC,EAAAA,UAAU,EAAE,MAAM;AAClBghC,EAAAA,aAAa,EAAE,SAAS;AACxBC,EAAAA,iBAAiB,EAAE,WAAW;AAC9BC,EAAAA,gBAAgB,EAAE,aAAa;AAE/BrhC,EAAAA,kBAAkB,EAAE,KAAK;AACzBshC,EAAAA,mBAAmB,EAAE,CAAC;AACtBC,EAAAA,cAAc,EAAE,KAAK;AAErBC,EAAAA,eAAe,EAAE,KAAK;AACtBC,EAAAA,cAAc,EAAE,KAAK;AACrBC,EAAAA,eAAe,EAAE,KAAK;AACtBC,EAAAA,mBAAmB,EAAE,KAAK;AAE1B3B,EAAAA,cAAc,EAAE,kBAAkB;AAClCjN,EAAAA,sBAAsB,EAAE;AAC1B,CAAC;;ACvMD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,MAAM6O,gBAAgB,SACnB9pD,cAAY,CAEtB;EAAAhhB,WAAAA,GAAA;AAAA,IAAA,KAAA,CAAA,GAAAO,SAAA,CAAA;AAGE;AAQA;AAUA;AASA;AAKA;AACF;AACA;AACA;AACA;AACA;AACA;AAKE;AAKA;AACF;AACA;AACA;AACA;AAGE;AACF;AACA;AACA;AACA;AAJEN,IAAAA,eAAA,0BAKkC,EAAE,CAAA;AAEpC;AACF;AACA;AACA;AACA;IAJEA,eAAA,CAAA,IAAA,EAAA,kBAAA,EAAA,MAAA,CAAA;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Aa,EAAE;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAA,CAAK;AACHC,EAAAA,aAAa,EAAE;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAA,CAAK;AACHC,EAAAA,aAAa,EAAE;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAA,CAAK;AACHC,EAAAA,aAAa,EAAE;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAA,CAAK;AACHC,EAAAA,aAAa,EAAE;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAA,CAAK;AACHC,EAAAA,aAAa,EAAE;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAA,CAAK;AACHC,EAAAA,aAAa,EAAE;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAA,CAAK;AACHC,EAAAA,aAAa,EAAE;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAA;AACA,CAAC;;AC/IM,MAAMC,sBAAyC,GAAG;AACvDC,EAAAA,MAAM,EAAE,KAAK;AACb1rG,EAAAA,MAAM,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;AACpC,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A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"} \ No newline at end of file +{"version":3,"file":"index.node.mjs","sources":["../src/config.ts","../src/util/internals/console.ts","../src/filters/GLProbes/GLProbe.ts","../src/filters/GLProbes/WebGLProbe.ts","../src/env/browser.ts","../src/env/index.ts","../src/filters/GLProbes/NodeGLProbe.ts","../src/env/node.ts","../src/cache.ts","../src/constants.ts","../src/ClassRegistry.ts","../src/util/animation/AnimationRegistry.ts","../src/Observable.ts","../src/util/internals/removeFromArray.ts","../src/util/misc/cos.ts","../src/util/misc/sin.ts","../src/Point.ts","../src/Collection.ts","../src/CommonMethods.ts","../src/util/animation/AnimationFrameProvider.ts","../src/util/internals/uid.ts","../src/util/misc/dom.ts","../src/util/misc/radiansDegreesConversion.ts","../src/util/misc/matrix.ts","../src/util/misc/objectEnlive.ts","../src/util/misc/pick.ts","../src/util/misc/toFixed.ts","../src/util/misc/svgExport.ts","../src/util/typeAssertions.ts","../src/util/dom_misc.ts","../src/canvas/DOMManagers/util.ts","../src/canvas/DOMManagers/StaticCanvasDOMManager.ts","../src/canvas/StaticCanvasOptions.ts","../src/canvas/StaticCanvas.ts","../src/util/dom_event.ts","../src/util/misc/boundingBoxFromPoints.ts","../src/util/misc/objectTransforms.ts","../src/util/misc/planeChange.ts","../src/controls/fireEvent.ts","../src/util/misc/resolveOrigin.ts","../src/util/misc/vectors.ts","../src/controls/util.ts","../src/controls/drag.ts","../src/color/color_map.ts","../src/color/constants.ts","../src/color/util.ts","../src/color/Color.ts","../src/util/misc/svgParsing.ts","../src/shapes/Object/FabricObjectSVGExportMixin.ts","../src/parser/getSvgRegex.ts","../src/shapes/Text/constants.ts","../src/parser/constants.ts","../src/Shadow.ts","../src/util/misc/capValue.ts","../src/shapes/Object/defaultValues.ts","../src/util/animation/easing.ts","../src/util/animation/AnimationBase.ts","../src/util/animation/ValueAnimation.ts","../src/util/animation/ArrayAnimation.ts","../src/util/animation/ColorAnimation.ts","../src/util/animation/animate.ts","../src/Intersection.ts","../src/shapes/Object/ObjectGeometry.ts","../src/shapes/Object/Object.ts","../src/controls/wrapWithFireEvent.ts","../src/controls/wrapWithFixedAnchor.ts","../src/controls/changeWidth.ts","../src/controls/controlRendering.ts","../src/controls/Control.ts","../src/controls/rotate.ts","../src/controls/scale.ts","../src/controls/skew.ts","../src/controls/scaleSkew.ts","../src/controls/commonControls.ts","../src/shapes/Object/InteractiveObject.ts","../src/util/applyMixins.ts","../src/shapes/Object/FabricObject.ts","../src/util/misc/isTransparent.ts","../src/util/internals/findRight.ts","../src/util/misc/projectStroke/StrokeProjectionsBase.ts","../src/util/misc/projectStroke/StrokeLineJoinProjections.ts","../src/util/misc/projectStroke/StrokeLineCapProjections.ts","../src/util/misc/projectStroke/index.ts","../src/util/internals/cloneStyles.ts","../src/util/lang_string.ts","../src/util/misc/textStyles.ts","../src/parser/attributes.ts","../src/parser/selectorMatches.ts","../src/parser/doesSomeParentMatch.ts","../src/parser/elementMatchesRule.ts","../src/parser/getGlobalStylesForElement.ts","../src/parser/normalizeAttr.ts","../src/util/internals/cleanupSvgAttribute.ts","../src/parser/parseTransformAttribute.ts","../src/parser/normalizeValue.ts","../src/parser/parseFontDeclaration.ts","../src/parser/parseStyleObject.ts","../src/parser/parseStyleString.ts","../src/parser/parseStyleAttribute.ts","../src/parser/setStrokeFillOpacity.ts","../src/parser/parseAttributes.ts","../src/shapes/Rect.ts","../src/LayoutManager/constants.ts","../src/LayoutManager/LayoutStrategies/utils.ts","../src/LayoutManager/LayoutStrategies/LayoutStrategy.ts","../src/LayoutManager/LayoutStrategies/FitContentLayout.ts","../src/LayoutManager/LayoutManager.ts","../src/shapes/Group.ts","../src/util/misc/groupSVGElements.ts","../src/util/misc/findScaleTo.ts","../src/util/path/regex.ts","../src/util/path/index.ts","../src/util/misc/mergeClipPaths.ts","../src/util/internals/getRandomInt.ts","../src/util/transform_matrix_removal.ts","../src/util/internals/dom_style.ts","../src/canvas/DOMManagers/CanvasDOMManager.ts","../src/canvas/CanvasOptions.ts","../src/canvas/SelectableCanvas.ts","../src/canvas/TextEditingManager.ts","../src/canvas/Canvas.ts","../src/gradient/constants.ts","../src/util/internals/ifNaN.ts","../src/parser/percent.ts","../src/gradient/parser/parseColorStops.ts","../src/gradient/parser/misc.ts","../src/gradient/parser/parseCoords.ts","../src/gradient/Gradient.ts","../src/Pattern/Pattern.ts","../src/brushes/BaseBrush.ts","../src/shapes/Path.ts","../src/brushes/PencilBrush.ts","../src/shapes/Circle.ts","../src/brushes/CircleBrush.ts","../src/brushes/SprayBrush.ts","../src/brushes/PatternBrush.ts","../src/shapes/Line.ts","../src/shapes/Triangle.ts","../src/shapes/Ellipse.ts","../src/parser/parsePointsAttribute.ts","../src/shapes/Polyline.ts","../src/shapes/Polygon.ts","../src/shapes/Text/StyledText.ts","../src/shapes/Text/TextSVGExportMixin.ts","../src/shapes/Text/Text.ts","../src/shapes/IText/DraggableTextDelegate.ts","../src/shapes/IText/ITextBehavior.ts","../src/shapes/IText/ITextKeyBehavior.ts","../src/shapes/IText/ITextClickBehavior.ts","../src/shapes/IText/constants.ts","../src/util/internals/applyCanvasTransform.ts","../src/shapes/IText/IText.ts","../src/shapes/Textbox.ts","../src/LayoutManager/LayoutStrategies/ClipPathLayout.ts","../src/LayoutManager/LayoutStrategies/FixedLayout.ts","../src/LayoutManager/ActiveSelectionLayoutManager.ts","../src/shapes/ActiveSelection.ts","../src/filters/Canvas2dFilterBackend.ts","../src/filters/WebGLFilterBackend.ts","../src/filters/FilterBackend.ts","../src/shapes/Image.ts","../src/parser/applyViewboxTransform.ts","../src/parser/getTagName.ts","../src/parser/hasInvalidAncestor.ts","../src/parser/getMultipleNodes.ts","../src/parser/parseUseDirectives.ts","../src/parser/recursivelyParseGradientsXlink.ts","../src/parser/getGradientDefs.ts","../src/parser/getCSSRules.ts","../src/parser/elements_parser.ts","../src/parser/parseSVGDocument.ts","../src/parser/loadSVGFromString.ts","../src/parser/loadSVGFromURL.ts","../src/controls/polyControl.ts","../src/controls/pathControl.ts","../src/filters/utils.ts","../src/filters/shaders/baseFilter.ts","../src/filters/BaseFilter.ts","../src/filters/shaders/blendColor.ts","../src/filters/BlendColor.ts","../src/filters/shaders/blendImage.ts","../src/filters/BlendImage.ts","../src/filters/shaders/blur.ts","../src/filters/Blur.ts","../src/filters/shaders/brightness.ts","../src/filters/Brightness.ts","../src/filters/shaders/colorMatrix.ts","../src/filters/ColorMatrix.ts","../src/filters/ColorMatrixFilters.ts","../src/filters/Composed.ts","../src/filters/shaders/constrast.ts","../src/filters/Contrast.ts","../src/filters/shaders/convolute.ts","../src/filters/Convolute.ts","../src/filters/shaders/gamma.ts","../src/filters/Gamma.ts","../src/filters/shaders/grayscale.ts","../src/filters/Grayscale.ts","../src/filters/HueRotation.ts","../src/filters/shaders/invert.ts","../src/filters/Invert.ts","../src/filters/shaders/noise.ts","../src/filters/Noise.ts","../src/filters/shaders/pixelate.ts","../src/filters/Pixelate.ts","../src/filters/shaders/removeColor.ts","../src/filters/RemoveColor.ts","../src/filters/Resize.ts","../src/filters/shaders/saturation.ts","../src/filters/Saturation.ts","../src/filters/shaders/vibrance.ts","../src/filters/Vibrance.ts","../index.node.ts"],"sourcesContent":["export type TConfiguration = Partial;\n\nclass BaseConfiguration {\n /**\n * Browser-specific constant to adjust CanvasRenderingContext2D.shadowBlur value,\n * which is unitless and not rendered equally across browsers.\n *\n * Values that work quite well (as of October 2017) are:\n * - Chrome: 1.5\n * - Edge: 1.75\n * - Firefox: 0.9\n * - Safari: 0.95\n *\n * @since 2.0.0\n * @type Number\n * @default 1\n */\n browserShadowBlurConstant = 1;\n\n /**\n * Pixel per Inch as a default value set to 96. Can be changed for more realistic conversion.\n */\n DPI = 96;\n\n /**\n * Device Pixel Ratio\n * @see https://developer.apple.com/library/safari/documentation/AudioVideo/Conceptual/HTML-canvas-guide/SettingUptheCanvas/SettingUptheCanvas.html\n */\n devicePixelRatio =\n typeof window !== 'undefined' ? window.devicePixelRatio : 1; // eslint-disable-line no-restricted-globals\n\n /**\n * Pixel limit for cache canvases. 1Mpx , 4Mpx should be fine.\n * @since 1.7.14\n * @type Number\n */\n perfLimitSizeTotal = 2097152;\n\n /**\n * Pixel limit for cache canvases width or height. IE fixes the maximum at 5000\n * @since 1.7.14\n * @type Number\n */\n maxCacheSideLimit = 4096;\n\n /**\n * Lowest pixel limit for cache canvases, set at 256PX\n * @since 1.7.14\n * @type Number\n */\n minCacheSideLimit = 256;\n\n /**\n * When 'true', style information is not retained when copy/pasting text, making\n * pasted text use destination style.\n * Defaults to 'false'.\n * @type Boolean\n * @deprecated\n */\n disableStyleCopyPaste = false;\n\n /**\n * Enable webgl for filtering picture is available\n * A filtering backend will be initialized, this will both take memory and\n * time since a default 2048x2048 canvas will be created for the gl context\n * @since 2.0.0\n * @type Boolean\n */\n enableGLFiltering = true;\n\n /**\n * if webgl is enabled and available, textureSize will determine the size\n * of the canvas backend\n *\n * In order to support old hardware set to `2048` to avoid OOM\n *\n * @since 2.0.0\n * @type Number\n */\n textureSize = 4096;\n\n /**\n * Skip performance testing of setupGLContext and force the use of putImageData that seems to be the one that works best on\n * Chrome + old hardware. if your users are experiencing empty images after filtering you may try to force this to true\n * this has to be set before instantiating the filtering backend ( before filtering the first image )\n * @type Boolean\n * @default false\n */\n forceGLPutImageData = false;\n\n /**\n * If disabled boundsOfCurveCache is not used. For apps that make heavy usage of pencil drawing probably disabling it is better\n * With the standard behaviour of fabric to translate all curves in absolute commands and by not subtracting the starting point from\n * the curve is very hard to hit any cache.\n * Enable only if you know why it could be useful.\n * Candidate for removal/simplification\n * @default false\n */\n cachesBoundsOfCurve = false;\n\n /**\n * Map of font files\n * Map of font files\n */\n fontPaths: Record = {};\n\n /**\n * Defines the number of fraction digits to use when serializing object values.\n * Used in exporting methods (`toObject`, `toJSON`, `toSVG`)\n * You can use it to increase/decrease precision of such values like left, top, scaleX, scaleY, etc.\n */\n NUM_FRACTION_DIGITS = 4;\n}\n\nexport class Configuration extends BaseConfiguration {\n constructor(config?: TConfiguration) {\n super();\n this.configure(config);\n }\n\n configure(config: TConfiguration = {}) {\n Object.assign(this, config);\n }\n\n /**\n * Map of font files\n */\n addFonts(\n paths: Record = {},\n ) {\n this.fontPaths = {\n ...this.fontPaths,\n ...paths,\n };\n }\n\n removeFonts(fontFamilys: string[] = []) {\n fontFamilys.forEach((fontFamily) => {\n delete this.fontPaths[fontFamily];\n });\n }\n\n clearFonts() {\n this.fontPaths = {};\n }\n\n restoreDefaults(keys?: (keyof T)[]) {\n const defaults = new BaseConfiguration() as T;\n const config =\n keys?.reduce((acc, key) => {\n acc[key] = defaults[key];\n return acc;\n }, {} as T) || defaults;\n this.configure(config);\n }\n}\n\nexport const config = new Configuration();\n","export const log = (\n severity: 'log' | 'warn' | 'error',\n ...optionalParams: any[]\n) =>\n // eslint-disable-next-line no-restricted-syntax\n console[severity]('fabric', ...optionalParams);\n\nexport class FabricError extends Error {\n constructor(message?: string, options?: ErrorOptions) {\n super(`fabric: ${message}`, options);\n }\n}\n\nexport class SignalAbortedError extends FabricError {\n constructor(context: string) {\n super(`${context} 'options.signal' is in 'aborted' state`);\n }\n}\n","export type GLPrecision = 'lowp' | 'mediump' | 'highp';\n\nexport abstract class GLProbe {\n declare GLPrecision: GLPrecision | undefined;\n abstract queryWebGL(canvas: HTMLCanvasElement): void;\n abstract isSupported(textureSize: number): boolean;\n}\n","import { log } from '../../util/internals/console';\nimport { GLProbe } from './GLProbe';\nimport type { GLPrecision } from './GLProbe';\n\n/**\n * Lazy initialize WebGL constants\n */\nexport class WebGLProbe extends GLProbe {\n declare maxTextureSize?: number;\n\n /**\n * Tests if webgl supports certain precision\n * @param {WebGL} Canvas WebGL context to test on\n * @param {GLPrecision} Precision to test can be any of following\n * @returns {Boolean} Whether the user's browser WebGL supports given precision.\n */\n private testPrecision(\n gl: WebGLRenderingContext,\n precision: GLPrecision,\n ): boolean {\n const fragmentSource = `precision ${precision} float;\\nvoid main(){}`;\n const fragmentShader = gl.createShader(gl.FRAGMENT_SHADER);\n if (!fragmentShader) {\n return false;\n }\n gl.shaderSource(fragmentShader, fragmentSource);\n gl.compileShader(fragmentShader);\n return !!gl.getShaderParameter(fragmentShader, gl.COMPILE_STATUS);\n }\n\n /**\n * query browser for WebGL\n */\n queryWebGL(canvas: HTMLCanvasElement) {\n const gl = canvas.getContext('webgl');\n if (gl) {\n this.maxTextureSize = gl.getParameter(gl.MAX_TEXTURE_SIZE);\n this.GLPrecision = (['highp', 'mediump', 'lowp'] as const).find(\n (precision) => this.testPrecision(gl, precision),\n );\n gl.getExtension('WEBGL_lose_context')!.loseContext();\n log('log', `WebGL: max texture size ${this.maxTextureSize}`);\n }\n }\n\n isSupported(textureSize: number) {\n return !!this.maxTextureSize && this.maxTextureSize >= textureSize;\n }\n}\n","/* eslint-disable no-restricted-globals */\nimport { WebGLProbe } from '../filters/GLProbes/WebGLProbe';\nimport type { TCopyPasteData, TFabricEnv } from './types';\n\nconst copyPasteData: TCopyPasteData = {};\n\nexport const getEnv = (): TFabricEnv => {\n return {\n document,\n window,\n isTouchSupported:\n 'ontouchstart' in window ||\n 'ontouchstart' in document ||\n (window && window.navigator && window.navigator.maxTouchPoints > 0),\n WebGLProbe: new WebGLProbe(),\n dispose() {\n // noop\n },\n copyPasteData,\n };\n};\n","/**\n * This file is consumed by fabric.\n * The `./node` and `./browser` files define the env variable that is used by this module.\n * The `./browser` module is defined to be the default env and doesn't set the env at all.\n * This is done in order to support isomorphic usage for browser and node applications\n * since window and document aren't defined at time of import in SSR, we can't set env so we avoid it by deferring to the default env.\n */\n\nimport { config } from '../config';\nimport { getEnv as getBrowserEnv } from './browser';\nimport type { TFabricEnv } from './types';\nimport type { DOMWindow } from 'jsdom';\n\nlet env: TFabricEnv;\n\n/**\n * Sets the environment variables used by fabric.\\\n * This is exposed for special cases, such as configuring a test environment, and should be used with care.\n *\n * **CAUTION**: Must be called before using the package.\n *\n * @example\n * Passing `window` and `document` objects to fabric (in case they are mocked or something)\n * import { getEnv, setEnv } from 'fabric';\n * // we want fabric to use the `window` and `document` objects exposed by the environment we are running in.\n * setEnv({ ...getEnv(), window, document });\n * // done with setup, using fabric is now safe\n */\nexport const setEnv = (value: TFabricEnv) => {\n env = value;\n};\n\n/**\n * In order to support SSR we **MUST** access the browser env only after the window has loaded\n */\nexport const getEnv = () => env || (env = getBrowserEnv());\n\nexport const getFabricDocument = (): Document => getEnv().document;\n\nexport const getFabricWindow = (): (Window & typeof globalThis) | DOMWindow =>\n getEnv().window;\n\n/**\n * @returns the config value if defined, fallbacks to the environment value\n */\nexport const getDevicePixelRatio = () =>\n Math.max(config.devicePixelRatio ?? getFabricWindow().devicePixelRatio, 1);\n","import { GLProbe } from './GLProbe';\n\n/**\n * @todo GL rendering in node is possible:\n * - https://github.com/stackgl/headless-gl\n * - https://github.com/akira-cn/node-canvas-webgl\n */\nexport class NodeGLProbe extends GLProbe {\n queryWebGL() {\n // noop\n }\n isSupported() {\n return false;\n }\n}\n","/* eslint-disable no-restricted-globals */\nimport type { Canvas as NodeCanvas } from 'canvas';\nimport { JSDOM } from 'jsdom';\n// @ts-expect-error internal import\nimport utils from 'jsdom/lib/jsdom/living/generated/utils.js';\nimport { NodeGLProbe } from '../filters/GLProbes/NodeGLProbe';\nimport type { TCopyPasteData, TFabricEnv } from './types';\n\nconst { implForWrapper: jsdomImplForWrapper } = utils;\n\nconst copyPasteData: TCopyPasteData = {};\n\nconst { window: JSDOMWindow } = new JSDOM(\n decodeURIComponent(\n '%3C!DOCTYPE%20html%3E%3Chtml%3E%3Chead%3E%3C%2Fhead%3E%3Cbody%3E%3C%2Fbody%3E%3C%2Fhtml%3E',\n ),\n {\n resources: 'usable',\n // needed for `requestAnimationFrame`\n pretendToBeVisual: true,\n },\n);\n\nexport const getNodeCanvas = (canvasEl: HTMLCanvasElement) => {\n const impl = jsdomImplForWrapper(canvasEl);\n return (impl._canvas || impl._image) as NodeCanvas;\n};\n\nexport const dispose = (element: Element) => {\n const impl = jsdomImplForWrapper(element);\n if (impl) {\n impl._image = null;\n impl._canvas = null;\n // unsure if necessary\n impl._currentSrc = null;\n impl._attributes = null;\n impl._classList = null;\n }\n};\n\nexport const getEnv = (): TFabricEnv => {\n return {\n document: JSDOMWindow.document,\n window: JSDOMWindow,\n isTouchSupported: false,\n WebGLProbe: new NodeGLProbe(),\n dispose,\n copyPasteData,\n };\n};\n","import { config } from './config';\nimport type { TRectBounds } from './typedefs';\n\nexport class Cache {\n /**\n * Cache of widths of chars in text rendering.\n */\n charWidthsCache: Record<\n /** fontFamily */ string,\n Record<\n /** fontStyleCacheKey */ string,\n Record\n >\n > = {};\n\n /**\n * @return {Object} reference to cache\n */\n getFontCache({\n fontFamily,\n fontStyle,\n fontWeight,\n }: {\n fontFamily: string;\n fontStyle: string;\n fontWeight: string | number;\n }) {\n fontFamily = fontFamily.toLowerCase();\n if (!this.charWidthsCache[fontFamily]) {\n this.charWidthsCache[fontFamily] = {};\n }\n const fontCache = this.charWidthsCache[fontFamily];\n const cacheKey = `${fontStyle.toLowerCase()}_${(\n fontWeight + ''\n ).toLowerCase()}`;\n if (!fontCache[cacheKey]) {\n fontCache[cacheKey] = {};\n }\n return fontCache[cacheKey];\n }\n\n /**\n * Clear char widths cache for the given font family or all the cache if no\n * fontFamily is specified.\n * Use it if you know you are loading fonts in a lazy way and you are not waiting\n * for custom fonts to load properly when adding text objects to the canvas.\n * If a text object is added when its own font is not loaded yet, you will get wrong\n * measurement and so wrong bounding boxes.\n * After the font cache is cleared, either change the textObject text content or call\n * initDimensions() to trigger a recalculation\n * @param {String} [fontFamily] font family to clear\n */\n clearFontCache(fontFamily?: string) {\n fontFamily = (fontFamily || '').toLowerCase();\n if (!fontFamily) {\n this.charWidthsCache = {};\n } else if (this.charWidthsCache[fontFamily]) {\n delete this.charWidthsCache[fontFamily];\n }\n }\n\n /**\n * Given current aspect ratio, determines the max width and height that can\n * respect the total allowed area for the cache.\n * @param {number} ar aspect ratio\n * @return {number[]} Limited dimensions X and Y\n */\n limitDimsByArea(ar: number) {\n const { perfLimitSizeTotal } = config;\n const roughWidth = Math.sqrt(perfLimitSizeTotal * ar);\n // we are not returning a point on purpose, to avoid circular dependencies\n // this is an internal utility\n return [\n Math.floor(roughWidth),\n Math.floor(perfLimitSizeTotal / roughWidth),\n ];\n }\n\n /**\n * This object keeps the results of the boundsOfCurve calculation mapped by the joined arguments necessary to calculate it.\n * It does speed up calculation, if you parse and add always the same paths, but in case of heavy usage of freedrawing\n * you do not get any speed benefit and you get a big object in memory.\n * The object was a private variable before, while now is appended to the lib so that you have access to it and you\n * can eventually clear it.\n * It was an internal variable, is accessible since version 2.3.4\n */\n boundsOfCurveCache: Record = {};\n}\n\nexport const cache = new Cache();\n","import type { TMat2D } from './typedefs';\n// use this syntax so babel plugin see this import here\nimport { version } from '../package.json';\n\nexport const VERSION = version;\n// eslint-disable-next-line @typescript-eslint/no-empty-function\nexport function noop() {}\n\nexport const halfPI = Math.PI / 2;\nexport const quarterPI = Math.PI / 4;\nexport const twoMathPi = Math.PI * 2;\nexport const PiBy180 = Math.PI / 180;\n\nexport const iMatrix = Object.freeze([1, 0, 0, 1, 0, 0]) as TMat2D;\nexport const DEFAULT_SVG_FONT_SIZE = 16;\nexport const ALIASING_LIMIT = 2;\n\n/* \"magic number\" for bezier approximations of arcs (http://itc.ktu.lt/itc354/Riskus354.pdf) */\nexport const kRect = 1 - 0.5522847498;\n\nexport const CENTER = 'center';\nexport const LEFT = 'left';\nexport const TOP = 'top';\nexport const BOTTOM = 'bottom';\nexport const RIGHT = 'right';\nexport const NONE = 'none';\n\nexport const reNewline = /\\r?\\n/;\n\nexport const MOVING = 'moving';\nexport const SCALING = 'scaling';\nexport const ROTATING = 'rotating';\nexport const ROTATE = 'rotate';\nexport const SKEWING = 'skewing';\nexport const RESIZING = 'resizing';\nexport const MODIFY_POLY = 'modifyPoly';\nexport const MODIFY_PATH = 'modifyPath';\nexport const CHANGED = 'changed';\nexport const SCALE = 'scale';\nexport const SCALE_X = 'scaleX';\nexport const SCALE_Y = 'scaleY';\nexport const SKEW_X = 'skewX';\nexport const SKEW_Y = 'skewY';\nexport const FILL = 'fill';\nexport const STROKE = 'stroke';\nexport const MODIFIED = 'modified';\n","import { FabricError } from './util/internals/console';\n\n/*\n * This Map connects the objects type value with their\n * class implementation. It used from any object to understand which are\n * the classes to enlive when requesting a object.type = 'path' for example.\n * Objects uses it for clipPath, Canvas uses it for everything.\n * This is necessary for generic code to run and enlive instances from serialized representation.\n * You can customize which classes get enlived from SVG parsing using this classRegistry.\n * The Registry start empty and gets filled in depending which files you import.\n * If you want to be able to parse arbitrary SVGs or JSON representation of canvases, coming from\n * different sources you will need to import all fabric because you may need all classes.\n */\n\nexport const JSON = 'json';\nexport const SVG = 'svg';\n\nexport class ClassRegistry {\n declare [JSON]: Map;\n declare [SVG]: Map;\n\n constructor() {\n this[JSON] = new Map();\n this[SVG] = new Map();\n }\n\n has(classType: string): boolean {\n return this[JSON].has(classType);\n }\n\n getClass(classType: string): T {\n const constructor = this[JSON].get(classType);\n if (!constructor) {\n throw new FabricError(`No class registered for ${classType}`);\n }\n return constructor;\n }\n\n setClass(classConstructor: any, classType?: string) {\n if (classType) {\n this[JSON].set(classType, classConstructor);\n } else {\n this[JSON].set(classConstructor.type, classConstructor);\n // legacy\n // @TODO: needs to be removed in fabric 7 or 8\n this[JSON].set(classConstructor.type.toLowerCase(), classConstructor);\n }\n }\n\n getSVGClass(SVGTagName: string): any {\n return this[SVG].get(SVGTagName);\n }\n\n setSVGClass(classConstructor: any, SVGTagName?: string) {\n this[SVG].set(\n SVGTagName ?? classConstructor.type.toLowerCase(),\n classConstructor,\n );\n }\n}\n\nexport const classRegistry = new ClassRegistry();\n","import type { StaticCanvas } from '../../canvas/StaticCanvas';\nimport type { FabricObject } from '../../shapes/Object/FabricObject';\nimport type { AnimationBase } from './AnimationBase';\n\n/**\n * Array holding all running animations\n */\nclass AnimationRegistry extends Array {\n /**\n * Remove a single animation using an animation context\n * @param {AnimationBase} context\n */\n remove(context: AnimationBase) {\n const index = this.indexOf(context);\n index > -1 && this.splice(index, 1);\n }\n\n /**\n * Cancel all running animations on the next frame\n */\n cancelAll() {\n const animations = this.splice(0);\n animations.forEach((animation) => animation.abort());\n return animations;\n }\n\n /**\n * Cancel all running animations attached to a canvas on the next frame\n * @param {StaticCanvas} canvas\n */\n cancelByCanvas(canvas: StaticCanvas) {\n if (!canvas) {\n return [];\n }\n const animations = this.filter(\n (animation) =>\n animation.target === canvas ||\n (typeof animation.target === 'object' &&\n (animation.target as FabricObject)?.canvas === canvas),\n );\n animations.forEach((animation) => animation.abort());\n return animations;\n }\n\n /**\n * Cancel all running animations for target on the next frame\n * @param target\n */\n cancelByTarget(target: AnimationBase['target']) {\n if (!target) {\n return [];\n }\n const animations = this.filter((animation) => animation.target === target);\n animations.forEach((animation) => animation.abort());\n return animations;\n }\n}\n\nexport const runningAnimations = new AnimationRegistry();\n","export type TEventCallback = (options: T) => any;\n\ntype EventRegistryObject = {\n [K in keyof E]?: TEventCallback;\n};\n\n/**\n * @see {@link http://fabric5.fabricjs.com/fabric-intro-part-2#events}\n * @see {@link http://fabric5.fabricjs.com/events|Events demo}\n */\nexport class Observable {\n private __eventListeners: Record =\n {} as Record;\n\n /**\n * Observes specified event\n * @alias on\n * @param {string} eventName Event name (eg. 'after:render')\n * @param {EventRegistryObject} handlers key/value pairs (eg. {'after:render': handler, 'selection:cleared': handler})\n * @param {Function} handler Function that receives a notification when an event of the specified type occurs\n * @return {Function} disposer\n */\n on(\n eventName: K,\n handler: TEventCallback,\n ): VoidFunction;\n on(handlers: EventRegistryObject): VoidFunction;\n on(\n arg0: K | EventRegistryObject,\n handler?: TEventCallback,\n ): VoidFunction {\n if (!this.__eventListeners) {\n this.__eventListeners = {} as Record;\n }\n if (typeof arg0 === 'object') {\n // one object with key/value pairs was passed\n Object.entries(arg0).forEach(([eventName, handler]) => {\n this.on(eventName as K, handler as TEventCallback);\n });\n return () => this.off(arg0);\n } else if (handler) {\n const eventName = arg0;\n if (!this.__eventListeners[eventName]) {\n this.__eventListeners[eventName] = [];\n }\n this.__eventListeners[eventName].push(handler);\n return () => this.off(eventName, handler);\n } else {\n // noop\n return () => false;\n }\n }\n\n /**\n * Observes specified event **once**\n * @alias once\n * @param {string} eventName Event name (eg. 'after:render')\n * @param {EventRegistryObject} handlers key/value pairs (eg. {'after:render': handler, 'selection:cleared': handler})\n * @param {Function} handler Function that receives a notification when an event of the specified type occurs\n * @return {Function} disposer\n */\n once(\n eventName: K,\n handler: TEventCallback,\n ): VoidFunction;\n once(handlers: EventRegistryObject): VoidFunction;\n once(\n arg0: K | EventRegistryObject,\n handler?: TEventCallback,\n ): VoidFunction {\n if (typeof arg0 === 'object') {\n // one object with key/value pairs was passed\n const disposers: VoidFunction[] = [];\n Object.entries(arg0).forEach(([eventName, handler]) => {\n disposers.push(this.once(eventName as K, handler as TEventCallback));\n });\n return () => disposers.forEach((d) => d());\n } else if (handler) {\n const disposer = this.on(\n arg0,\n function onceHandler(this: Observable, ...args) {\n handler.call(this, ...args);\n disposer();\n },\n );\n return disposer;\n } else {\n // noop\n return () => false;\n }\n }\n\n /**\n * @private\n * @param {string} eventName\n * @param {Function} [handler]\n */\n private _removeEventListener(\n eventName: K,\n handler?: TEventCallback,\n ) {\n if (!this.__eventListeners[eventName]) {\n return;\n }\n\n if (handler) {\n const eventListener = this.__eventListeners[eventName];\n const index = eventListener.indexOf(handler);\n index > -1 && eventListener.splice(index, 1);\n } else {\n this.__eventListeners[eventName] = [];\n }\n }\n\n /**\n * Unsubscribe all event listeners for eventname.\n * Do not use this pattern. You could kill internal fabricJS events.\n * We know we should have protected events for internal flows, but we don't have yet\n * @deprecated\n * @param {string} eventName event name (eg. 'after:render')\n */\n off(eventName: K): void;\n /**\n * unsubscribe an event listener\n * @param {string} eventName event name (eg. 'after:render')\n * @param {TEventCallback} handler event listener to unsubscribe\n */\n off(eventName: K, handler: TEventCallback): void;\n /**\n * unsubscribe event listeners\n * @param handlers handlers key/value pairs (eg. {'after:render': handler, 'selection:cleared': handler})\n */\n off(handlers: EventRegistryObject): void;\n /**\n * unsubscribe all event listeners\n */\n off(): void;\n off(\n arg0?: K | EventRegistryObject,\n handler?: TEventCallback,\n ) {\n if (!this.__eventListeners) {\n return;\n }\n\n // remove all key/value pairs (event name -> event handler)\n if (typeof arg0 === 'undefined') {\n for (const eventName in this.__eventListeners) {\n this._removeEventListener(eventName);\n }\n }\n // one object with key/value pairs was passed\n else if (typeof arg0 === 'object') {\n Object.entries(arg0).forEach(([eventName, handler]) => {\n this._removeEventListener(eventName as K, handler as TEventCallback);\n });\n } else {\n this._removeEventListener(arg0, handler);\n }\n }\n\n /**\n * Fires event with an optional options object\n * @param {String} eventName Event name to fire\n * @param {Object} [options] Options object\n */\n fire(eventName: K, options?: EventSpec[K]) {\n if (!this.__eventListeners) {\n return;\n }\n\n const listenersForEvent = this.__eventListeners[eventName]?.concat();\n if (listenersForEvent) {\n for (let i = 0; i < listenersForEvent.length; i++) {\n listenersForEvent[i].call(this, options || {});\n }\n }\n }\n}\n","/**\n * Removes value from an array.\n * Presence of value (and its position in an array) is determined via `Array.prototype.indexOf`\n * @param {Array} array\n * @param {*} value\n * @return {Array} original array\n */\nexport const removeFromArray = (array: T[], value: T): T[] => {\n const idx = array.indexOf(value);\n if (idx !== -1) {\n array.splice(idx, 1);\n }\n return array;\n};\n","import type { TRadian } from '../../typedefs';\nimport { halfPI } from '../../constants';\n\n/**\n * Calculate the cos of an angle, avoiding returning floats for known results\n * This function is here just to avoid getting 0.999999999999999 when dealing\n * with numbers that are really 1 or 0.\n * @param {TRadian} angle the angle\n * @return {Number} the cosin value for angle.\n */\nexport const cos = (angle: TRadian): number => {\n if (angle === 0) {\n return 1;\n }\n const angleSlice = Math.abs(angle) / halfPI;\n switch (angleSlice) {\n case 1:\n case 3:\n return 0;\n case 2:\n return -1;\n }\n return Math.cos(angle);\n};\n","import type { TRadian } from '../../typedefs';\nimport { halfPI } from '../../constants';\n\n/**\n * Calculate the cos of an angle, avoiding returning floats for known results\n * This function is here just to avoid getting 0.999999999999999 when dealing\n * with numbers that are really 1 or 0.\n * @param {TRadian} angle the angle\n * @return {Number} the sin value for angle.\n */\nexport const sin = (angle: TRadian): number => {\n if (angle === 0) {\n return 0;\n }\n const angleSlice = angle / halfPI;\n const value = Math.sign(angle);\n switch (angleSlice) {\n case 1:\n return value;\n case 2:\n return 0;\n case 3:\n return -value;\n }\n return Math.sin(angle);\n};\n","import type { TMat2D, TRadian } from './typedefs';\nimport { cos } from './util/misc/cos';\nimport { sin } from './util/misc/sin';\n\nexport interface XY {\n x: number;\n y: number;\n}\n\n/**\n * Adaptation of work of Kevin Lindsey(kevin@kevlindev.com)\n */\nexport class Point implements XY {\n declare x: number;\n\n declare y: number;\n\n constructor();\n constructor(x: number, y: number);\n constructor(point?: XY);\n constructor(arg0: number | XY = 0, y = 0) {\n if (typeof arg0 === 'object') {\n this.x = arg0.x;\n this.y = arg0.y;\n } else {\n this.x = arg0;\n this.y = y;\n }\n }\n\n /**\n * Adds another point to this one and returns a new one with the sum\n * @param {XY} that\n * @return {Point} new Point instance with added values\n */\n add(that: XY): Point {\n return new Point(this.x + that.x, this.y + that.y);\n }\n\n /**\n * Adds another point to this one\n * @param {XY} that\n * @return {Point} thisArg\n * @deprecated\n */\n addEquals(that: XY): Point {\n this.x += that.x;\n this.y += that.y;\n return this;\n }\n\n /**\n * Adds value to this point and returns a new one\n * @param {Number} scalar\n * @return {Point} new Point with added value\n */\n scalarAdd(scalar: number): Point {\n return new Point(this.x + scalar, this.y + scalar);\n }\n\n /**\n * Adds value to this point\n * @param {Number} scalar\n * @return {Point} thisArg\n * @deprecated\n */\n scalarAddEquals(scalar: number): Point {\n this.x += scalar;\n this.y += scalar;\n return this;\n }\n\n /**\n * Subtracts another point from this point and returns a new one\n * @param {XY} that\n * @return {Point} new Point object with subtracted values\n */\n subtract(that: XY): Point {\n return new Point(this.x - that.x, this.y - that.y);\n }\n\n /**\n * Subtracts another point from this point\n * @param {XY} that\n * @return {Point} thisArg\n * @deprecated\n */\n subtractEquals(that: XY): Point {\n this.x -= that.x;\n this.y -= that.y;\n return this;\n }\n\n /**\n * Subtracts value from this point and returns a new one\n * @param {Number} scalar\n * @return {Point}\n */\n scalarSubtract(scalar: number): Point {\n return new Point(this.x - scalar, this.y - scalar);\n }\n\n /**\n * Subtracts value from this point\n * @param {Number} scalar\n * @return {Point} thisArg\n * @deprecated\n */\n scalarSubtractEquals(scalar: number): Point {\n this.x -= scalar;\n this.y -= scalar;\n return this;\n }\n\n /**\n * Multiplies this point by another value and returns a new one\n * @param {XY} that\n * @return {Point}\n */\n multiply(that: XY): Point {\n return new Point(this.x * that.x, this.y * that.y);\n }\n\n /**\n * Multiplies this point by a value and returns a new one\n * @param {Number} scalar\n * @return {Point}\n */\n scalarMultiply(scalar: number): Point {\n return new Point(this.x * scalar, this.y * scalar);\n }\n\n /**\n * Multiplies this point by a value\n * @param {Number} scalar\n * @return {Point} thisArg\n * @deprecated\n */\n scalarMultiplyEquals(scalar: number): Point {\n this.x *= scalar;\n this.y *= scalar;\n return this;\n }\n\n /**\n * Divides this point by another and returns a new one\n * @param {XY} that\n * @return {Point}\n */\n divide(that: XY): Point {\n return new Point(this.x / that.x, this.y / that.y);\n }\n\n /**\n * Divides this point by a value and returns a new one\n * @param {Number} scalar\n * @return {Point}\n */\n scalarDivide(scalar: number): Point {\n return new Point(this.x / scalar, this.y / scalar);\n }\n\n /**\n * Divides this point by a value\n * @param {Number} scalar\n * @return {Point} thisArg\n * @deprecated\n */\n scalarDivideEquals(scalar: number): Point {\n this.x /= scalar;\n this.y /= scalar;\n return this;\n }\n\n /**\n * Returns true if this point is equal to another one\n * @param {XY} that\n * @return {Boolean}\n */\n eq(that: XY): boolean {\n return this.x === that.x && this.y === that.y;\n }\n\n /**\n * Returns true if this point is less than another one\n * @param {XY} that\n * @return {Boolean}\n */\n lt(that: XY): boolean {\n return this.x < that.x && this.y < that.y;\n }\n\n /**\n * Returns true if this point is less than or equal to another one\n * @param {XY} that\n * @return {Boolean}\n */\n lte(that: XY): boolean {\n return this.x <= that.x && this.y <= that.y;\n }\n\n /**\n\n * Returns true if this point is greater another one\n * @param {XY} that\n * @return {Boolean}\n */\n gt(that: XY): boolean {\n return this.x > that.x && this.y > that.y;\n }\n\n /**\n * Returns true if this point is greater than or equal to another one\n * @param {XY} that\n * @return {Boolean}\n */\n gte(that: XY): boolean {\n return this.x >= that.x && this.y >= that.y;\n }\n\n /**\n * Returns new point which is the result of linear interpolation with this one and another one\n * @param {XY} that\n * @param {Number} t , position of interpolation, between 0 and 1 default 0.5\n * @return {Point}\n */\n lerp(that: XY, t = 0.5): Point {\n t = Math.max(Math.min(1, t), 0);\n return new Point(\n this.x + (that.x - this.x) * t,\n this.y + (that.y - this.y) * t,\n );\n }\n\n /**\n * Returns distance from this point and another one\n * @param {XY} that\n * @return {Number}\n */\n distanceFrom(that: XY): number {\n const dx = this.x - that.x,\n dy = this.y - that.y;\n return Math.sqrt(dx * dx + dy * dy);\n }\n\n /**\n * Returns the point between this point and another one\n * @param {XY} that\n * @return {Point}\n */\n midPointFrom(that: XY): Point {\n return this.lerp(that);\n }\n\n /**\n * Returns a new point which is the min of this and another one\n * @param {XY} that\n * @return {Point}\n */\n min(that: XY): Point {\n return new Point(Math.min(this.x, that.x), Math.min(this.y, that.y));\n }\n\n /**\n * Returns a new point which is the max of this and another one\n * @param {XY} that\n * @return {Point}\n */\n max(that: XY): Point {\n return new Point(Math.max(this.x, that.x), Math.max(this.y, that.y));\n }\n\n /**\n * Returns string representation of this point\n * @return {String}\n */\n toString(): string {\n return `${this.x},${this.y}`;\n }\n\n /**\n * Sets x/y of this point\n * @param {Number} x\n * @param {Number} y\n */\n setXY(x: number, y: number) {\n this.x = x;\n this.y = y;\n return this;\n }\n\n /**\n * Sets x of this point\n * @param {Number} x\n */\n setX(x: number) {\n this.x = x;\n return this;\n }\n\n /**\n * Sets y of this point\n * @param {Number} y\n */\n setY(y: number) {\n this.y = y;\n return this;\n }\n\n /**\n * Sets x/y of this point from another point\n * @param {XY} that\n */\n setFromPoint(that: XY) {\n this.x = that.x;\n this.y = that.y;\n return this;\n }\n\n /**\n * Swaps x/y of this point and another point\n * @param {XY} that\n */\n swap(that: XY) {\n const x = this.x,\n y = this.y;\n this.x = that.x;\n this.y = that.y;\n that.x = x;\n that.y = y;\n }\n\n /**\n * return a cloned instance of the point\n * @return {Point}\n */\n clone(): Point {\n return new Point(this.x, this.y);\n }\n\n /**\n * Rotates `point` around `origin` with `radians`\n * @param {XY} origin The origin of the rotation\n * @param {TRadian} radians The radians of the angle for the rotation\n * @return {Point} The new rotated point\n */\n rotate(radians: TRadian, origin: XY = ZERO): Point {\n // TODO benchmark and verify the add and subtract how much cost\n // and then in case early return if no origin is passed\n const sinus = sin(radians),\n cosinus = cos(radians);\n const p = this.subtract(origin);\n const rotated = new Point(\n p.x * cosinus - p.y * sinus,\n p.x * sinus + p.y * cosinus,\n );\n return rotated.add(origin);\n }\n\n /**\n * Apply transform t to point p\n * @param {TMat2D} t The transform\n * @param {Boolean} [ignoreOffset] Indicates that the offset should not be applied\n * @return {Point} The transformed point\n */\n transform(t: TMat2D, ignoreOffset = false): Point {\n return new Point(\n t[0] * this.x + t[2] * this.y + (ignoreOffset ? 0 : t[4]),\n t[1] * this.x + t[3] * this.y + (ignoreOffset ? 0 : t[5]),\n );\n }\n}\n\nexport const ZERO = new Point(0, 0);\n","import type { Constructor, TBBox } from './typedefs';\nimport { removeFromArray } from './util/internals/removeFromArray';\nimport { Point } from './Point';\nimport type { ActiveSelection } from './shapes/ActiveSelection';\nimport type { Group } from './shapes/Group';\nimport type { InteractiveFabricObject } from './shapes/Object/InteractiveObject';\nimport type { FabricObject } from './shapes/Object/FabricObject';\n\nexport const isCollection = (\n fabricObject?: FabricObject,\n): fabricObject is Group | ActiveSelection => {\n return !!fabricObject && Array.isArray((fabricObject as Group)._objects);\n};\n\nexport function createCollectionMixin(Base: TBase) {\n class Collection extends Base {\n /**\n * @type {FabricObject[]}\n * @TODO needs to end up in the constructor too\n */\n _objects: FabricObject[] = [];\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n _onObjectAdded(object: FabricObject) {\n // subclasses should override this method\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n _onObjectRemoved(object: FabricObject) {\n // subclasses should override this method\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n _onStackOrderChanged(object: FabricObject) {\n // subclasses should override this method\n }\n\n /**\n * Adds objects to collection\n * Objects should be instances of (or inherit from) FabricObject\n * @param {...FabricObject[]} objects to add\n * @returns {number} new array length\n */\n add(...objects: FabricObject[]): number {\n const size = this._objects.push(...objects);\n objects.forEach((object) => this._onObjectAdded(object));\n return size;\n }\n\n /**\n * Inserts an object into collection at specified index\n * @param {number} index Index to insert object at\n * @param {...FabricObject[]} objects Object(s) to insert\n * @returns {number} new array length\n */\n insertAt(index: number, ...objects: FabricObject[]) {\n this._objects.splice(index, 0, ...objects);\n objects.forEach((object) => this._onObjectAdded(object));\n return this._objects.length;\n }\n\n /**\n * Removes objects from a collection, then renders canvas (if `renderOnAddRemove` is not `false`)\n * @private\n * @param {...FabricObject[]} objects objects to remove\n * @returns {FabricObject[]} removed objects\n */\n remove(...objects: FabricObject[]) {\n const array = this._objects,\n removed: FabricObject[] = [];\n objects.forEach((object) => {\n const index = array.indexOf(object);\n // only call onObjectRemoved if an object was actually removed\n if (index !== -1) {\n array.splice(index, 1);\n removed.push(object);\n this._onObjectRemoved(object);\n }\n });\n return removed;\n }\n\n /**\n * Executes given function for each object in this group\n * A simple shortcut for getObjects().forEach, before es6 was more complicated,\n * now is just a shortcut.\n * @param {Function} callback\n * Callback invoked with current object as first argument,\n * index - as second and an array of all objects - as third.\n */\n forEachObject(\n callback: (\n object: FabricObject,\n index: number,\n array: FabricObject[],\n ) => any,\n ) {\n this.getObjects().forEach((object, index, objects) =>\n callback(object, index, objects),\n );\n }\n\n /**\n * Returns an array of children objects of this instance\n * @param {...String} [types] When specified, only objects of these types are returned\n * @return {Array}\n */\n getObjects(...types: string[]) {\n if (types.length === 0) {\n return [...this._objects];\n }\n return this._objects.filter((o) => o.isType(...types));\n }\n\n /**\n * Returns object at specified index\n * @param {Number} index\n * @return {Object} object at index\n */\n item(index: number) {\n return this._objects[index];\n }\n\n /**\n * Returns true if collection contains no objects\n * @return {Boolean} true if collection is empty\n */\n isEmpty() {\n return this._objects.length === 0;\n }\n\n /**\n * Returns a size of a collection (i.e: length of an array containing its objects)\n * @return {Number} Collection size\n */\n size() {\n return this._objects.length;\n }\n\n /**\n * Returns true if collection contains an object.\\\n * **Prefer using {@link FabricObject#isDescendantOf} for performance reasons**\n * instead of `a.contains(b)` use `b.isDescendantOf(a)`\n * @param {Object} object Object to check against\n * @param {Boolean} [deep=false] `true` to check all descendants, `false` to check only `_objects`\n * @return {Boolean} `true` if collection contains an object\n */\n contains(object: FabricObject, deep?: boolean): boolean {\n if (this._objects.includes(object)) {\n return true;\n } else if (deep) {\n return this._objects.some(\n (obj) =>\n obj instanceof Collection &&\n (obj as unknown as Collection).contains(object, true),\n );\n }\n return false;\n }\n\n /**\n * Returns number representation of a collection complexity\n * @return {Number} complexity\n */\n complexity() {\n return this._objects.reduce((memo, current) => {\n memo += current.complexity ? current.complexity() : 0;\n return memo;\n }, 0);\n }\n\n /**\n * Moves an object or the objects of a multiple selection\n * to the bottom of the stack of drawn objects\n * @param {fabric.Object} object Object to send to back\n * @returns {boolean} true if change occurred\n */\n sendObjectToBack(object: FabricObject) {\n if (!object || object === this._objects[0]) {\n return false;\n }\n removeFromArray(this._objects, object);\n this._objects.unshift(object);\n this._onStackOrderChanged(object);\n return true;\n }\n\n /**\n * Moves an object or the objects of a multiple selection\n * to the top of the stack of drawn objects\n * @param {fabric.Object} object Object to send\n * @returns {boolean} true if change occurred\n */\n bringObjectToFront(object: FabricObject) {\n if (!object || object === this._objects[this._objects.length - 1]) {\n return false;\n }\n removeFromArray(this._objects, object);\n this._objects.push(object);\n this._onStackOrderChanged(object);\n return true;\n }\n\n /**\n * Moves an object or a selection down in stack of drawn objects\n * An optional parameter, `intersecting` allows to move the object in behind\n * the first intersecting object. Where intersection is calculated with\n * bounding box. If no intersection is found, there will not be change in the\n * stack.\n * @param {fabric.Object} object Object to send\n * @param {boolean} [intersecting] If `true`, send object behind next lower intersecting object\n * @returns {boolean} true if change occurred\n */\n sendObjectBackwards(object: FabricObject, intersecting?: boolean) {\n if (!object) {\n return false;\n }\n const idx = this._objects.indexOf(object);\n if (idx !== 0) {\n // if object is not on the bottom of stack\n const newIdx = this.findNewLowerIndex(object, idx, intersecting);\n removeFromArray(this._objects, object);\n this._objects.splice(newIdx, 0, object);\n this._onStackOrderChanged(object);\n return true;\n }\n return false;\n }\n\n /**\n * Moves an object or a selection up in stack of drawn objects\n * An optional parameter, intersecting allows to move the object in front\n * of the first intersecting object. Where intersection is calculated with\n * bounding box. If no intersection is found, there will not be change in the\n * stack.\n * @param {fabric.Object} object Object to send\n * @param {boolean} [intersecting] If `true`, send object in front of next upper intersecting object\n * @returns {boolean} true if change occurred\n */\n bringObjectForward(object: FabricObject, intersecting?: boolean) {\n if (!object) {\n return false;\n }\n const idx = this._objects.indexOf(object);\n if (idx !== this._objects.length - 1) {\n // if object is not on top of stack (last item in an array)\n const newIdx = this.findNewUpperIndex(object, idx, intersecting);\n removeFromArray(this._objects, object);\n this._objects.splice(newIdx, 0, object);\n this._onStackOrderChanged(object);\n return true;\n }\n return false;\n }\n\n /**\n * Moves an object to specified level in stack of drawn objects\n * @param {fabric.Object} object Object to send\n * @param {number} index Position to move to\n * @returns {boolean} true if change occurred\n */\n moveObjectTo(object: FabricObject, index: number) {\n if (object === this._objects[index]) {\n return false;\n }\n removeFromArray(this._objects, object);\n this._objects.splice(index, 0, object);\n this._onStackOrderChanged(object);\n return true;\n }\n\n findNewLowerIndex(\n object: FabricObject,\n idx: number,\n intersecting?: boolean,\n ) {\n let newIdx;\n\n if (intersecting) {\n newIdx = idx;\n // traverse down the stack looking for the nearest intersecting object\n for (let i = idx - 1; i >= 0; --i) {\n if (object.isOverlapping(this._objects[i])) {\n newIdx = i;\n break;\n }\n }\n } else {\n newIdx = idx - 1;\n }\n\n return newIdx;\n }\n\n findNewUpperIndex(\n object: FabricObject,\n idx: number,\n intersecting?: boolean,\n ) {\n let newIdx;\n\n if (intersecting) {\n newIdx = idx;\n // traverse up the stack looking for the nearest intersecting object\n for (let i = idx + 1; i < this._objects.length; ++i) {\n if (object.isOverlapping(this._objects[i])) {\n newIdx = i;\n break;\n }\n }\n } else {\n newIdx = idx + 1;\n }\n\n return newIdx;\n }\n\n /**\n * Given a bounding box, return all the objects of the collection that are contained in the bounding box.\n * If `includeIntersecting` is true, return also the objects that intersect the bounding box as well.\n * This is meant to work with selection. Is not a generic method.\n * @param {TBBox} bbox a bounding box in scene coordinates\n * @param {{ includeIntersecting?: boolean }} options an object with includeIntersecting\n * @returns array of objects contained in the bounding box, ordered from top to bottom stacking wise\n */\n collectObjects(\n { left, top, width, height }: TBBox,\n { includeIntersecting = true }: { includeIntersecting?: boolean } = {},\n ) {\n const objects: InteractiveFabricObject[] = [],\n tl = new Point(left, top),\n br = tl.add(new Point(width, height));\n\n // we iterate reverse order to collect top first in case of click.\n for (let i = this._objects.length - 1; i >= 0; i--) {\n const object = this._objects[i] as unknown as InteractiveFabricObject;\n if (\n object.selectable &&\n object.visible &&\n ((includeIntersecting && object.intersectsWithRect(tl, br)) ||\n object.isContainedWithinRect(tl, br) ||\n (includeIntersecting && object.containsPoint(tl)) ||\n (includeIntersecting && object.containsPoint(br)))\n ) {\n objects.push(object);\n }\n }\n\n return objects;\n }\n }\n\n // https://github.com/microsoft/TypeScript/issues/32080\n return Collection;\n}\n","import { Observable } from './Observable';\n\nexport class CommonMethods extends Observable {\n /**\n * Sets object's properties from options, for initialization only\n * @protected\n * @param {Object} [options] Options object\n */\n protected _setOptions(options: any = {}) {\n for (const prop in options) {\n this.set(prop, options[prop]);\n }\n }\n\n /**\n * @private\n */\n _setObject(obj: Record) {\n for (const prop in obj) {\n this._set(prop, obj[prop]);\n }\n }\n\n /**\n * Sets property to a given value. When changing position/dimension -related properties (left, top, scale, angle, etc.) `set` does not update position of object's borders/controls. If you need to update those, call `setCoords()`.\n * @param {String|Object} key Property name or object (if object, iterate over the object properties)\n * @param {Object|Function} value Property value (if function, the value is passed into it and its return value is used as a new one)\n */\n set(key: string | Record, value?: any) {\n if (typeof key === 'object') {\n this._setObject(key);\n } else {\n this._set(key, value);\n }\n return this;\n }\n\n _set(key: string, value: any) {\n this[key as keyof this] = value;\n }\n\n /**\n * Toggles specified property from `true` to `false` or from `false` to `true`\n * @param {String} property Property to toggle\n */\n toggle(property: string) {\n const value = this.get(property);\n if (typeof value === 'boolean') {\n this.set(property, !value);\n }\n return this;\n }\n\n /**\n * Basic getter\n * @param {String} property Property name\n * @return {*} value of a property\n */\n get(property: string): any {\n return this[property as keyof this];\n }\n}\n","import { getFabricWindow } from '../../env';\n\nexport function requestAnimFrame(callback: FrameRequestCallback): number {\n return getFabricWindow().requestAnimationFrame(callback);\n}\n\nexport function cancelAnimFrame(handle: number): void {\n return getFabricWindow().cancelAnimationFrame(handle);\n}\n","let id = 0;\n\nexport const uid = () => id++;\n","import { getFabricDocument } from '../../env';\nimport type { ImageFormat, TSize } from '../../typedefs';\nimport { FabricError } from '../internals/console';\n/**\n * Creates canvas element\n * @return {CanvasElement} initialized canvas element\n */\nexport const createCanvasElement = (): HTMLCanvasElement => {\n const element = getFabricDocument().createElement('canvas');\n if (!element || typeof element.getContext === 'undefined') {\n throw new FabricError('Failed to create `canvas` element');\n }\n return element;\n};\n\n/**\n * Creates image element (works on client and node)\n * @return {HTMLImageElement} HTML image element\n */\nexport const createImage = (): HTMLImageElement =>\n getFabricDocument().createElement('img');\n\n/**\n * Creates a canvas element that is a copy of another and is also painted\n * @param {CanvasElement} canvas to copy size and content of\n * @return {CanvasElement} initialized canvas element\n */\nexport const copyCanvasElement = (\n canvas: HTMLCanvasElement,\n): HTMLCanvasElement => {\n const newCanvas = createCanvasElementFor(canvas);\n newCanvas.getContext('2d')?.drawImage(canvas, 0, 0);\n return newCanvas;\n};\n\n/**\n * Creates a canvas element as big as another\n * @param {CanvasElement} canvas to copy size and content of\n * @return {CanvasElement} initialized canvas element\n */\nexport const createCanvasElementFor = (\n canvas: HTMLCanvasElement | ImageData | HTMLImageElement | TSize,\n): HTMLCanvasElement => {\n const newCanvas = createCanvasElement();\n newCanvas.width = canvas.width;\n newCanvas.height = canvas.height;\n return newCanvas;\n};\n\n/**\n * since 2.6.0 moved from canvas instance to utility.\n * possibly useless\n * @param {CanvasElement} canvasEl to copy size and content of\n * @param {String} format 'jpeg' or 'png', in some browsers 'webp' is ok too\n * @param {number} quality <= 1 and > 0\n * @return {String} data url\n */\nexport const toDataURL = (\n canvasEl: HTMLCanvasElement,\n format: ImageFormat,\n quality: number,\n) => canvasEl.toDataURL(`image/${format}`, quality);\n\nexport const isHTMLCanvas = (\n canvas?: HTMLCanvasElement | string,\n): canvas is HTMLCanvasElement => {\n return !!canvas && (canvas as HTMLCanvasElement).getContext !== undefined;\n};\n\nexport const toBlob = (\n canvasEl: HTMLCanvasElement,\n format?: ImageFormat,\n quality?: number,\n): Promise =>\n new Promise((resolve, _) => {\n canvasEl.toBlob(resolve, `image/${format}`, quality);\n });\n","import type { TRadian, TDegree } from '../../typedefs';\nimport { PiBy180 } from '../../constants';\n\n/**\n * Transforms degrees to radians.\n * @param {TDegree} degrees value in degrees\n * @return {TRadian} value in radians\n */\nexport const degreesToRadians = (degrees: TDegree): TRadian =>\n (degrees * PiBy180) as TRadian;\n\n/**\n * Transforms radians to degrees.\n * @param {TRadian} radians value in radians\n * @return {TDegree} value in degrees\n */\nexport const radiansToDegrees = (radians: TRadian): TDegree =>\n (radians / PiBy180) as TDegree;\n","import { iMatrix } from '../../constants';\nimport type { XY } from '../../Point';\nimport { Point } from '../../Point';\nimport type { TDegree, TRadian, TMat2D } from '../../typedefs';\nimport { cos } from './cos';\nimport { degreesToRadians, radiansToDegrees } from './radiansDegreesConversion';\nimport { sin } from './sin';\n\nexport type TRotateMatrixArgs = {\n angle?: TDegree;\n};\n\nexport type TTranslateMatrixArgs = {\n translateX?: number;\n translateY?: number;\n};\n\nexport type TScaleMatrixArgs = {\n scaleX?: number;\n scaleY?: number;\n flipX?: boolean;\n flipY?: boolean;\n skewX?: TDegree;\n skewY?: TDegree;\n};\n\nexport type TComposeMatrixArgs = TTranslateMatrixArgs &\n TRotateMatrixArgs &\n TScaleMatrixArgs;\n\nexport type TQrDecomposeOut = Required<\n Omit\n>;\n\nexport const isIdentityMatrix = (mat: TMat2D) =>\n mat.every((value, index) => value === iMatrix[index]);\n\n/**\n * Apply transform t to point p\n * @deprecated use {@link Point#transform}\n * @param {Point | XY} p The point to transform\n * @param {Array} t The transform\n * @param {Boolean} [ignoreOffset] Indicates that the offset should not be applied\n * @return {Point} The transformed point\n */\nexport const transformPoint = (\n p: XY,\n t: TMat2D,\n ignoreOffset?: boolean,\n): Point => new Point(p).transform(t, ignoreOffset);\n\n/**\n * Invert transformation t\n * @param {Array} t The transform\n * @return {Array} The inverted transform\n */\nexport const invertTransform = (t: TMat2D): TMat2D => {\n const a = 1 / (t[0] * t[3] - t[1] * t[2]),\n r = [a * t[3], -a * t[1], -a * t[2], a * t[0], 0, 0] as TMat2D,\n { x, y } = new Point(t[4], t[5]).transform(r, true);\n r[4] = -x;\n r[5] = -y;\n return r;\n};\n\n/**\n * Multiply matrix A by matrix B to nest transformations\n * @param {TMat2D} a First transformMatrix\n * @param {TMat2D} b Second transformMatrix\n * @param {Boolean} is2x2 flag to multiply matrices as 2x2 matrices\n * @return {TMat2D} The product of the two transform matrices\n */\nexport const multiplyTransformMatrices = (\n a: TMat2D,\n b: TMat2D,\n is2x2?: boolean,\n): TMat2D =>\n [\n a[0] * b[0] + a[2] * b[1],\n a[1] * b[0] + a[3] * b[1],\n a[0] * b[2] + a[2] * b[3],\n a[1] * b[2] + a[3] * b[3],\n is2x2 ? 0 : a[0] * b[4] + a[2] * b[5] + a[4],\n is2x2 ? 0 : a[1] * b[4] + a[3] * b[5] + a[5],\n ] as TMat2D;\n\n/**\n * Multiplies the matrices array such that a matrix defines the plane for the rest of the matrices **after** it\n *\n * `multiplyTransformMatrixArray([A, B, C, D])` is equivalent to `A(B(C(D)))`\n *\n * @param matrices an array of matrices\n * @param [is2x2] flag to multiply matrices as 2x2 matrices\n * @returns the multiplication product\n */\nexport const multiplyTransformMatrixArray = (\n matrices: (TMat2D | undefined | null | false)[],\n is2x2?: boolean,\n) =>\n matrices.reduceRight(\n (product: TMat2D, curr) =>\n curr && product\n ? multiplyTransformMatrices(curr, product, is2x2)\n : curr || product,\n undefined as unknown as TMat2D,\n ) || iMatrix.concat();\n\nexport const calcPlaneRotation = ([a, b]: TMat2D) =>\n Math.atan2(b, a) as TRadian;\n\n/**\n * Decomposes standard 2x3 matrix into transform components\n * @param {TMat2D} a transformMatrix\n * @return {Object} Components of transform\n */\nexport const qrDecompose = (a: TMat2D): TQrDecomposeOut => {\n const angle = calcPlaneRotation(a),\n denom = Math.pow(a[0], 2) + Math.pow(a[1], 2),\n scaleX = Math.sqrt(denom),\n scaleY = (a[0] * a[3] - a[2] * a[1]) / scaleX,\n skewX = Math.atan2(a[0] * a[2] + a[1] * a[3], denom);\n return {\n angle: radiansToDegrees(angle),\n scaleX,\n scaleY,\n skewX: radiansToDegrees(skewX),\n skewY: 0 as TDegree,\n translateX: a[4] || 0,\n translateY: a[5] || 0,\n };\n};\n\n/**\n * Generate a translation matrix\n *\n * A translation matrix in the form of\n * [ 1 0 x ]\n * [ 0 1 y ]\n * [ 0 0 1 ]\n *\n * See {@link https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/transform#translate} for more details\n *\n * @param {number} x translation on X axis\n * @param {number} [y] translation on Y axis\n * @returns {TMat2D} matrix\n */\nexport const createTranslateMatrix = (x: number, y = 0): TMat2D => [\n 1,\n 0,\n 0,\n 1,\n x,\n y,\n];\n\n/**\n * Generate a rotation matrix around around a point (x,y), defaulting to (0,0)\n *\n * A matrix in the form of\n * [cos(a) -sin(a) -x*cos(a)+y*sin(a)+x]\n * [sin(a) cos(a) -x*sin(a)-y*cos(a)+y]\n * [0 0 1 ]\n *\n *\n * @param {TDegree} angle rotation in degrees\n * @param {XY} [pivotPoint] pivot point to rotate around\n * @returns {TMat2D} matrix\n */\nexport function createRotateMatrix(\n { angle = 0 }: TRotateMatrixArgs = {},\n { x = 0, y = 0 }: Partial = {},\n): TMat2D {\n const angleRadiant = degreesToRadians(angle),\n cosValue = cos(angleRadiant),\n sinValue = sin(angleRadiant);\n return [\n cosValue,\n sinValue,\n -sinValue,\n cosValue,\n x ? x - (cosValue * x - sinValue * y) : 0,\n y ? y - (sinValue * x + cosValue * y) : 0,\n ];\n}\n\n/**\n * Generate a scale matrix around the point (0,0)\n *\n * A matrix in the form of\n * [x 0 0]\n * [0 y 0]\n * [0 0 1]\n *\n * {@link https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/transform#scale}\n *\n * @param {number} x scale on X axis\n * @param {number} [y] scale on Y axis\n * @returns {TMat2D} matrix\n */\nexport const createScaleMatrix = (x: number, y: number = x): TMat2D => [\n x,\n 0,\n 0,\n y,\n 0,\n 0,\n];\n\nexport const angleToSkew = (angle: TDegree) =>\n Math.tan(degreesToRadians(angle));\n\nexport const skewToAngle = (value: TRadian) =>\n radiansToDegrees(Math.atan(value));\n\n/**\n * Generate a skew matrix for the X axis\n *\n * A matrix in the form of\n * [1 x 0]\n * [0 1 0]\n * [0 0 1]\n *\n * {@link https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/transform#skewx}\n *\n * @param {TDegree} skewValue translation on X axis\n * @returns {TMat2D} matrix\n */\nexport const createSkewXMatrix = (skewValue: TDegree): TMat2D => [\n 1,\n 0,\n angleToSkew(skewValue),\n 1,\n 0,\n 0,\n];\n\n/**\n * Generate a skew matrix for the Y axis\n *\n * A matrix in the form of\n * [1 0 0]\n * [y 1 0]\n * [0 0 1]\n *\n * {@link https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/transform#skewy}\n *\n * @param {TDegree} skewValue translation on Y axis\n * @returns {TMat2D} matrix\n */\nexport const createSkewYMatrix = (skewValue: TDegree): TMat2D => [\n 1,\n angleToSkew(skewValue),\n 0,\n 1,\n 0,\n 0,\n];\n\n/**\n * Returns a transform matrix starting from an object of the same kind of\n * the one returned from qrDecompose, useful also if you want to calculate some\n * transformations from an object that is not enlived yet.\n * is called DimensionsTransformMatrix because those properties are the one that influence\n * the size of the resulting box of the object.\n * @param {Object} options\n * @param {Number} [options.scaleX]\n * @param {Number} [options.scaleY]\n * @param {Boolean} [options.flipX]\n * @param {Boolean} [options.flipY]\n * @param {Number} [options.skewX]\n * @param {Number} [options.skewY]\n * @return {Number[]} transform matrix\n */\nexport const calcDimensionsMatrix = ({\n scaleX = 1,\n scaleY = 1,\n flipX = false,\n flipY = false,\n skewX = 0 as TDegree,\n skewY = 0 as TDegree,\n}: TScaleMatrixArgs) => {\n let matrix = createScaleMatrix(\n flipX ? -scaleX : scaleX,\n flipY ? -scaleY : scaleY,\n );\n if (skewX) {\n matrix = multiplyTransformMatrices(matrix, createSkewXMatrix(skewX), true);\n }\n if (skewY) {\n matrix = multiplyTransformMatrices(matrix, createSkewYMatrix(skewY), true);\n }\n return matrix;\n};\n\n/**\n * Returns a transform matrix starting from an object of the same kind of\n * the one returned from qrDecompose, useful also if you want to calculate some\n * transformations from an object that is not enlived yet\n * Before changing this function look at: src/benchmarks/calcTransformMatrix.mjs\n * @param {Object} options\n * @param {Number} [options.angle]\n * @param {Number} [options.scaleX]\n * @param {Number} [options.scaleY]\n * @param {Boolean} [options.flipX]\n * @param {Boolean} [options.flipY]\n * @param {Number} [options.skewX]\n * @param {Number} [options.skewY]\n * @param {Number} [options.translateX]\n * @param {Number} [options.translateY]\n * @return {Number[]} transform matrix\n */\nexport const composeMatrix = (options: TComposeMatrixArgs): TMat2D => {\n const { translateX = 0, translateY = 0, angle = 0 as TDegree } = options;\n let matrix = createTranslateMatrix(translateX, translateY);\n if (angle) {\n matrix = multiplyTransformMatrices(matrix, createRotateMatrix({ angle }));\n }\n const scaleMatrix = calcDimensionsMatrix(options);\n if (!isIdentityMatrix(scaleMatrix)) {\n matrix = multiplyTransformMatrices(matrix, scaleMatrix);\n }\n return matrix;\n};\n","import { noop } from '../../constants';\nimport type { FabricObject } from '../../shapes/Object/FabricObject';\nimport type {\n Abortable,\n Constructor,\n TCrossOrigin,\n TFiller,\n} from '../../typedefs';\nimport { createImage } from './dom';\nimport { classRegistry } from '../../ClassRegistry';\nimport type { BaseFilter } from '../../filters/BaseFilter';\nimport type { FabricObject as BaseFabricObject } from '../../shapes/Object/Object';\nimport { FabricError, SignalAbortedError } from '../internals/console';\nimport type { Shadow } from '../../Shadow';\n\nexport type LoadImageOptions = Abortable & {\n /**\n * cors value for the image loading, default to anonymous\n */\n crossOrigin?: TCrossOrigin;\n};\n\n/**\n * Loads image element from given url and resolve it, or catch.\n * @param {String} url URL representing an image\n * @param {LoadImageOptions} [options] image loading options\n * @returns {Promise} the loaded image.\n */\nexport const loadImage = (\n url: string,\n { signal, crossOrigin = null }: LoadImageOptions = {},\n) =>\n new Promise(function (resolve, reject) {\n if (signal && signal.aborted) {\n return reject(new SignalAbortedError('loadImage'));\n }\n const img = createImage();\n let abort: EventListenerOrEventListenerObject;\n if (signal) {\n abort = function (err: Event) {\n img.src = '';\n reject(err);\n };\n signal.addEventListener('abort', abort, { once: true });\n }\n const done = function () {\n img.onload = img.onerror = null;\n abort && signal?.removeEventListener('abort', abort);\n resolve(img);\n };\n if (!url) {\n done();\n return;\n }\n img.onload = done;\n img.onerror = function () {\n abort && signal?.removeEventListener('abort', abort);\n reject(new FabricError(`Error loading ${img.src}`));\n };\n crossOrigin && (img.crossOrigin = crossOrigin);\n img.src = url;\n });\n\nexport type EnlivenObjectOptions = Abortable & {\n /**\n * Method for further parsing of object elements,\n * called after each fabric object created.\n */\n reviver?: <\n T extends\n | BaseFabricObject\n | FabricObject\n | BaseFilter\n | Shadow\n | TFiller,\n >(\n serializedObj: Record,\n instance: T,\n ) => void;\n};\n\n/**\n * @TODO type this correctly.\n * Creates corresponding fabric instances from their object representations\n * @param {Object[]} objects Objects to enliven\n * @param {EnlivenObjectOptions} [options]\n * @param {(serializedObj: object, instance: FabricObject) => any} [options.reviver] Method for further parsing of object elements,\n * called after each fabric object created.\n * @param {AbortSignal} [options.signal] handle aborting, see https://developer.mozilla.org/en-US/docs/Web/API/AbortController/signal\n * @returns {Promise}\n */\nexport const enlivenObjects = <\n T extends\n | BaseFabricObject\n | FabricObject\n | BaseFilter\n | Shadow\n | TFiller,\n>(\n objects: any[],\n { signal, reviver = noop }: EnlivenObjectOptions = {},\n) =>\n new Promise((resolve, reject) => {\n const instances: T[] = [];\n signal && signal.addEventListener('abort', reject, { once: true });\n Promise.all(\n objects.map((obj) =>\n classRegistry\n .getClass<\n Constructor & {\n fromObject(options: any, context: Abortable): Promise;\n }\n >(obj.type)\n .fromObject(obj, { signal })\n .then((fabricInstance) => {\n reviver(obj, fabricInstance);\n instances.push(fabricInstance);\n return fabricInstance;\n }),\n ),\n )\n .then(resolve)\n .catch((error) => {\n // cleanup\n instances.forEach((instance) => {\n (instance as FabricObject).dispose &&\n (instance as FabricObject).dispose();\n });\n reject(error);\n })\n .finally(() => {\n signal && signal.removeEventListener('abort', reject);\n });\n });\n\n/**\n * Creates corresponding fabric instances residing in an object, e.g. `clipPath`\n * @param {Object} object with properties to enlive ( fill, stroke, clipPath, path )\n * @param {object} [options]\n * @param {AbortSignal} [options.signal] handle aborting, see https://developer.mozilla.org/en-US/docs/Web/API/AbortController/signal\n * @returns {Promise>} the input object with enlived values\n */\nexport const enlivenObjectEnlivables = <\n R = Record,\n>(\n serializedObject: any,\n { signal }: Abortable = {},\n) =>\n new Promise((resolve, reject) => {\n const instances: (FabricObject | TFiller | Shadow)[] = [];\n signal && signal.addEventListener('abort', reject, { once: true });\n // enlive every possible property\n const promises = Object.values(serializedObject).map((value: any) => {\n if (!value) {\n return value;\n }\n /**\n * clipPath or shadow or gradient or text on a path or a pattern,\n * or the backgroundImage or overlayImage of canvas\n * If we have a type and there is a classe registered for it, we enlive it.\n * If there is no class registered for it we return the value as is\n * */\n if (value.type && classRegistry.has(value.type)) {\n return enlivenObjects([value], {\n signal,\n }).then(([enlived]) => {\n instances.push(enlived);\n return enlived;\n });\n }\n return value;\n });\n const keys = Object.keys(serializedObject);\n Promise.all(promises)\n .then((enlived) => {\n return enlived.reduce((acc, instance, index) => {\n acc[keys[index]] = instance;\n return acc;\n }, {});\n })\n .then(resolve)\n .catch((error) => {\n // cleanup\n instances.forEach((instance: any) => {\n instance.dispose && instance.dispose();\n });\n reject(error);\n })\n .finally(() => {\n signal && signal.removeEventListener('abort', reject);\n });\n });\n","/**\n * Populates an object with properties of another object\n * @param {Object} source Source object\n * @param {string[]} properties Properties names to include\n * @returns object populated with the picked keys\n */\nexport const pick = >(\n source: T,\n keys: (keyof T)[] = [],\n) => {\n return keys.reduce((o, key) => {\n if (key in source) {\n o[key] = source[key];\n }\n return o;\n }, {} as Partial);\n};\n\nexport const pickBy = >(\n source: T,\n predicate: (value: T[K], key: K, collection: T) => boolean,\n) => {\n return (Object.keys(source) as (keyof T)[]).reduce((o, key) => {\n if (predicate(source[key], key, source)) {\n o[key] = source[key];\n }\n return o;\n }, {} as Partial);\n};\n","/**\n * A wrapper around Number#toFixed, which contrary to native method returns number, not string.\n * @param {number|string} number number to operate on\n * @param {number} fractionDigits number of fraction digits to \"leave\"\n * @return {number}\n */\nexport const toFixed = (number: number | string, fractionDigits: number) =>\n parseFloat(Number(number).toFixed(fractionDigits));\n","import type { TMat2D } from '../../typedefs';\nimport { toFixed } from './toFixed';\nimport { config } from '../../config';\n\n/**\n * given an array of 6 number returns something like `\"matrix(...numbers)\"`\n * @param {TMat2D} transform an array with 6 numbers\n * @return {String} transform matrix for svg\n */\nexport const matrixToSVG = (transform: TMat2D) =>\n 'matrix(' +\n transform\n .map((value) => toFixed(value, config.NUM_FRACTION_DIGITS))\n .join(' ') +\n ')';\n","import type { FabricObject } from '../shapes/Object/Object';\nimport type { TFiller } from '../typedefs';\nimport type { FabricText } from '../shapes/Text/Text';\nimport type { Pattern } from '../Pattern';\nimport type { Path } from '../shapes/Path';\nimport type { ActiveSelection } from '../shapes/ActiveSelection';\n\nexport const isFiller = (\n filler: TFiller | string | null,\n): filler is TFiller => {\n return !!filler && (filler as TFiller).toLive !== undefined;\n};\n\nexport const isSerializableFiller = (\n filler: TFiller | string | null,\n): filler is TFiller => {\n return !!filler && typeof (filler as TFiller).toObject === 'function';\n};\n\nexport const isPattern = (filler: TFiller): filler is Pattern => {\n return (\n !!filler && (filler as Pattern).offsetX !== undefined && 'source' in filler\n );\n};\n\nexport const isTextObject = (\n fabricObject?: FabricObject,\n): fabricObject is FabricText => {\n return (\n !!fabricObject &&\n typeof (fabricObject as FabricText)._renderText === 'function'\n );\n};\n\nexport const isPath = (fabricObject?: FabricObject): fabricObject is Path => {\n // we could use instanceof but that would mean pulling in Text code for a simple check\n // @todo discuss what to do and how to do\n return (\n !!fabricObject &&\n typeof (fabricObject as Path)._renderPathCommands === 'function'\n );\n};\n\nexport const isActiveSelection = (\n fabricObject?: FabricObject,\n): fabricObject is ActiveSelection =>\n !!fabricObject && 'multiSelectionStacking' in fabricObject;\n","/**\n * Returns element scroll offsets\n * @param {HTMLElement} element Element to operate on\n * @return {Object} Object with left/top values\n */\nexport function getScrollLeftTop(element: HTMLElement | null) {\n const doc = element && getDocumentFromElement(element);\n let left = 0,\n top = 0;\n if (!element || !doc) {\n return { left, top };\n }\n let elementLoop: HTMLElement | Document | ShadowRoot = element;\n const docElement = doc.documentElement,\n body = doc.body || {\n scrollLeft: 0,\n scrollTop: 0,\n };\n // While loop checks (and then sets element to) .parentNode OR .host\n // to account for ShadowDOM. We still want to traverse up out of ShadowDOM,\n // but the .parentNode of a root ShadowDOM node will always be null, instead\n // it should be accessed through .host. See http://stackoverflow.com/a/24765528/4383938\n while (\n elementLoop &&\n (elementLoop.parentNode || (elementLoop as unknown as ShadowRoot).host)\n ) {\n elementLoop = (elementLoop.parentNode ||\n (elementLoop as unknown as ShadowRoot).host) as\n | HTMLElement\n | Document\n | ShadowRoot;\n if (elementLoop === doc) {\n left = body.scrollLeft || docElement.scrollLeft || 0;\n top = body.scrollTop || docElement.scrollTop || 0;\n } else {\n left += (elementLoop as HTMLElement).scrollLeft || 0;\n top += (elementLoop as HTMLElement).scrollTop || 0;\n }\n\n if (\n elementLoop.nodeType === 1 &&\n (elementLoop as HTMLElement).style.position === 'fixed'\n ) {\n break;\n }\n }\n\n return { left, top };\n}\n\nexport const getDocumentFromElement = (el: HTMLElement) =>\n el.ownerDocument || null;\n\nexport const getWindowFromElement = (el: HTMLElement) =>\n el.ownerDocument?.defaultView || null;\n","import { NONE } from '../../constants';\nimport type { TSize } from '../../typedefs';\nimport {\n getDocumentFromElement,\n getWindowFromElement,\n getScrollLeftTop,\n} from '../../util/dom_misc';\n\nexport const setCanvasDimensions = (\n el: HTMLCanvasElement,\n ctx: CanvasRenderingContext2D,\n { width, height }: TSize,\n retinaScaling = 1,\n) => {\n el.width = width;\n el.height = height;\n if (retinaScaling > 1) {\n el.setAttribute('width', (width * retinaScaling).toString());\n el.setAttribute('height', (height * retinaScaling).toString());\n ctx.scale(retinaScaling, retinaScaling);\n }\n};\n\nexport type CSSDimensions = {\n width: number | string;\n height: number | string;\n};\n\nexport const setCSSDimensions = (\n el: HTMLElement,\n { width, height }: Partial,\n) => {\n width && (el.style.width = typeof width === 'number' ? `${width}px` : width);\n height &&\n (el.style.height = typeof height === 'number' ? `${height}px` : height);\n};\n\n/**\n * Returns offset for a given element\n * @param {HTMLElement} element Element to get offset for\n * @return {Object} Object with \"left\" and \"top\" properties\n */\nexport function getElementOffset(element: HTMLElement) {\n const doc = element && getDocumentFromElement(element),\n offset = { left: 0, top: 0 };\n\n if (!doc) {\n return offset;\n }\n const elemStyle: CSSStyleDeclaration =\n getWindowFromElement(element)?.getComputedStyle(element, null) ||\n ({} as CSSStyleDeclaration);\n offset.left += parseInt(elemStyle.borderLeftWidth, 10) || 0;\n offset.top += parseInt(elemStyle.borderTopWidth, 10) || 0;\n offset.left += parseInt(elemStyle.paddingLeft, 10) || 0;\n offset.top += parseInt(elemStyle.paddingTop, 10) || 0;\n\n let box = { left: 0, top: 0 };\n\n const docElem = doc.documentElement;\n if (typeof element.getBoundingClientRect !== 'undefined') {\n box = element.getBoundingClientRect();\n }\n\n const scrollLeftTop = getScrollLeftTop(element);\n\n return {\n left:\n box.left + scrollLeftTop.left - (docElem.clientLeft || 0) + offset.left,\n top: box.top + scrollLeftTop.top - (docElem.clientTop || 0) + offset.top,\n };\n}\n\n/**\n * Makes element unselectable\n * @param {HTMLElement} element Element to make unselectable\n * @return {HTMLElement} Element that was passed in\n */\nexport function makeElementUnselectable(element: HTMLElement) {\n if (typeof element.onselectstart !== 'undefined') {\n element.onselectstart = () => false;\n }\n element.style.userSelect = NONE;\n return element;\n}\n","import { getEnv, getFabricDocument } from '../../env';\nimport type { TSize } from '../../typedefs';\nimport type { CSSDimensions } from './util';\nimport { setCSSDimensions, getElementOffset } from './util';\nimport { createCanvasElement, isHTMLCanvas } from '../../util/misc/dom';\nimport { setCanvasDimensions } from './util';\nimport { FabricError } from '../../util/internals/console';\n\nexport type CanvasItem = {\n el: HTMLCanvasElement;\n ctx: CanvasRenderingContext2D;\n};\n\nexport class StaticCanvasDOMManager {\n /**\n * Keeps a copy of the canvas style before setting retina scaling and other potions\n * in order to return it to original state on dispose\n * @type string\n */\n private _originalCanvasStyle?: string;\n\n lower: CanvasItem;\n\n constructor(arg0?: string | HTMLCanvasElement) {\n const el = this.createLowerCanvas(arg0);\n this.lower = { el, ctx: el.getContext('2d')! };\n }\n\n protected createLowerCanvas(arg0?: HTMLCanvasElement | string) {\n // canvasEl === 'HTMLCanvasElement' does not work on jsdom/node\n const el = isHTMLCanvas(arg0)\n ? arg0\n : (arg0 &&\n (getFabricDocument().getElementById(arg0) as HTMLCanvasElement)) ||\n createCanvasElement();\n if (el.hasAttribute('data-fabric')) {\n throw new FabricError(\n 'Trying to initialize a canvas that has already been initialized. Did you forget to dispose the canvas?',\n );\n }\n this._originalCanvasStyle = el.style.cssText;\n el.setAttribute('data-fabric', 'main');\n el.classList.add('lower-canvas');\n return el;\n }\n\n cleanupDOM({ width, height }: TSize) {\n const { el } = this.lower;\n // restore canvas style and attributes\n el.classList.remove('lower-canvas');\n el.removeAttribute('data-fabric');\n // restore canvas size to original size in case retina scaling was applied\n el.setAttribute('width', `${width}`);\n el.setAttribute('height', `${height}`);\n el.style.cssText = this._originalCanvasStyle || '';\n this._originalCanvasStyle = undefined;\n }\n\n setDimensions(size: TSize, retinaScaling: number) {\n const { el, ctx } = this.lower;\n setCanvasDimensions(el, ctx, size, retinaScaling);\n }\n\n setCSSDimensions(size: Partial) {\n setCSSDimensions(this.lower.el, size);\n }\n\n /**\n * Calculates canvas element offset relative to the document\n */\n calcOffset() {\n return getElementOffset(this.lower.el);\n }\n\n dispose() {\n getEnv().dispose(this.lower.el);\n // @ts-expect-error disposing\n delete this.lower;\n }\n}\n","import { iMatrix } from '../constants';\nimport type { FabricObject } from '../shapes/Object/FabricObject';\nimport type { TFiller, TMat2D, TOptions } from '../typedefs';\n\ninterface CanvasDrawableOptions {\n /**\n * if set to false background image is not affected by viewport transform\n * @since 1.6.3\n * @type Boolean\n * @todo we should really find a different way to do this\n */\n backgroundVpt: boolean;\n\n /**\n * Background color of canvas instance.\n * @type {(String|TFiller)}\n */\n backgroundColor: TFiller | string;\n\n /**\n * Background image of canvas instance.\n * since 2.4.0 image caching is active, please when putting an image as background, add to the\n * canvas property a reference to the canvas it is on. Otherwise the image cannot detect the zoom\n * vale. As an alternative you can disable image objectCaching\n * @type FabricObject\n */\n backgroundImage?: FabricObject;\n\n /**\n * if set to false overlay image is not affected by viewport transform\n * @since 1.6.3\n * @type Boolean\n * @todo we should really find a different way to do this\n */\n overlayVpt: boolean;\n\n /**\n * Overlay color of canvas instance.\n * @since 1.3.9\n * @type {(String|TFiller)}\n */\n overlayColor: TFiller | string;\n\n /**\n * Overlay image of canvas instance.\n * since 2.4.0 image caching is active, please when putting an image as overlay, add to the\n * canvas property a reference to the canvas it is on. Otherwise the image cannot detect the zoom\n * vale. As an alternative you can disable image objectCaching\n * @type FabricObject\n */\n overlayImage?: FabricObject;\n}\n\ninterface CanvasRenderingOptions {\n /**\n * Indicates whether {@link StaticCanvas#add}, {@link StaticCanvas#insertAt} and {@link StaticCanvas#remove},\n * {@link StaticCanvas#moveTo}, {@link StaticCanvas#clear} and many more, should also re-render canvas.\n * Disabling this option will not give a performance boost when adding/removing a lot of objects to/from canvas at once\n * since the renders are queued and executed one per frame.\n * Disabling is suggested anyway and managing the renders of the app manually is not a big effort ( canvas.requestRenderAll() )\n * Left default to true to do not break documentation and old app, fiddles.\n * @type Boolean\n */\n renderOnAddRemove: boolean;\n\n /**\n * Based on vptCoords and object.aCoords, skip rendering of objects that\n * are not included in current viewport.\n * May greatly help in applications with crowded canvas and use of zoom/pan\n * If One of the corner of the bounding box of the object is on the canvas\n * the objects get rendered.\n * @type Boolean\n * @default true\n */\n skipOffscreen: boolean;\n\n /**\n * When true, canvas is scaled by devicePixelRatio for better rendering on retina screens\n * @type Boolean\n */\n enableRetinaScaling: boolean;\n\n /**\n * Indicates whether this canvas will use image smoothing, this is on by default in browsers\n * @type Boolean\n */\n imageSmoothingEnabled: boolean;\n\n /**\n * a fabricObject that, without stroke define a clipping area with their shape. filled in black\n * the clipPath object gets used when the canvas has rendered, and the context is placed in the\n * top left corner of the canvas.\n * clipPath will clip away controls, if you do not want this to happen use controlsAboveOverlay = true\n * @type FabricObject\n */\n clipPath?: FabricObject;\n}\n\nexport interface CanvasExportOptions {\n /**\n * Indicates whether toObject/toDatalessObject should include default values\n * if set to false, takes precedence over the object value.\n * @type Boolean\n */\n includeDefaultValues: boolean;\n\n /**\n * When true, getSvgTransform() will apply the StaticCanvas.viewportTransform to the SVG transformation. When true,\n * a zoomed canvas will then produce zoomed SVG output.\n * @type Boolean\n */\n svgViewportTransformation: boolean;\n}\n\nexport interface StaticCanvasOptions\n extends CanvasDrawableOptions,\n CanvasRenderingOptions,\n CanvasExportOptions {\n /**\n * Width in virtual/logical pixels of the canvas.\n * The canvas can be larger than width if retina scaling is active\n * @type number\n */\n width: number;\n\n /**\n * Height in virtual/logical pixels of the canvas.\n * The canvas can be taller than width if retina scaling is active\n * @type height\n */\n height: number;\n\n /**\n * Indicates whether object controls (borders/controls) are rendered above overlay image\n * @type Boolean\n *\n * @todo move to Canvas\n */\n controlsAboveOverlay: boolean;\n\n /**\n * Indicates whether the browser can be scrolled when using a touchscreen and dragging on the canvas\n * It gives PRIORITY to DOM scrolling, it doesn't make it always possible.\n * If is true, when using a touch event on the canvas, the canvas will scroll if scroll is possible.\n * If we are in drawing mode or if we are selecting an object the canvas preventDefault and so it won't scroll\n * @type Boolean\n *\n * @todo move to Canvas\n */\n allowTouchScrolling: boolean;\n\n /**\n * The transformation (a Canvas 2D API transform matrix) which focuses the viewport\n * @type Array\n * @example Default transform\n * canvas.viewportTransform = [1, 0, 0, 1, 0, 0];\n * @example Scale by 70% and translate toward bottom-right by 50, without skewing\n * canvas.viewportTransform = [0.7, 0, 0, 0.7, 50, 50];\n */\n viewportTransform: TMat2D;\n}\n\nexport const staticCanvasDefaults: TOptions = {\n backgroundVpt: true,\n backgroundColor: '',\n overlayVpt: true,\n overlayColor: '',\n\n includeDefaultValues: true,\n svgViewportTransformation: true,\n\n renderOnAddRemove: true,\n skipOffscreen: true,\n enableRetinaScaling: true,\n imageSmoothingEnabled: true,\n\n /**\n * @todo move to Canvas\n */\n controlsAboveOverlay: false,\n /**\n * @todo move to Canvas\n */\n allowTouchScrolling: false,\n\n viewportTransform: [...iMatrix],\n};\n","import { config } from '../config';\nimport { CENTER, VERSION } from '../constants';\nimport type { CanvasEvents, StaticCanvasEvents } from '../EventTypeDefs';\nimport type { Gradient } from '../gradient/Gradient';\nimport { createCollectionMixin, isCollection } from '../Collection';\nimport { CommonMethods } from '../CommonMethods';\nimport type { Pattern } from '../Pattern';\nimport { Point } from '../Point';\nimport type { TCachedFabricObject } from '../shapes/Object/Object';\nimport type {\n Abortable,\n Constructor,\n TCornerPoint,\n TDataUrlOptions,\n TFiller,\n TMat2D,\n TSize,\n TSVGReviver,\n TToCanvasElementOptions,\n TValidToObjectMethod,\n TOptions,\n} from '../typedefs';\nimport {\n cancelAnimFrame,\n requestAnimFrame,\n} from '../util/animation/AnimationFrameProvider';\nimport { runningAnimations } from '../util/animation/AnimationRegistry';\nimport { uid } from '../util/internals/uid';\nimport { createCanvasElementFor, toBlob, toDataURL } from '../util/misc/dom';\nimport { invertTransform, transformPoint } from '../util/misc/matrix';\nimport type { EnlivenObjectOptions } from '../util/misc/objectEnlive';\nimport {\n enlivenObjectEnlivables,\n enlivenObjects,\n} from '../util/misc/objectEnlive';\nimport { pick } from '../util/misc/pick';\nimport { matrixToSVG } from '../util/misc/svgExport';\nimport { toFixed } from '../util/misc/toFixed';\nimport { isFiller, isPattern, isTextObject } from '../util/typeAssertions';\nimport { StaticCanvasDOMManager } from './DOMManagers/StaticCanvasDOMManager';\nimport type { CSSDimensions } from './DOMManagers/util';\nimport type { FabricObject } from '../shapes/Object/FabricObject';\nimport type { StaticCanvasOptions } from './StaticCanvasOptions';\nimport { staticCanvasDefaults } from './StaticCanvasOptions';\nimport { log, FabricError } from '../util/internals/console';\nimport { getDevicePixelRatio } from '../env';\n\n/**\n * Having both options in TCanvasSizeOptions set to true transform the call in a calcOffset\n * Better try to restrict with types to avoid confusion.\n */\nexport type TCanvasSizeOptions =\n | {\n backstoreOnly?: true;\n cssOnly?: false;\n }\n | {\n backstoreOnly?: false;\n cssOnly?: true;\n };\n\nexport type TSVGExportOptions = {\n suppressPreamble?: boolean;\n viewBox?: {\n x: number;\n y: number;\n width: number;\n height: number;\n };\n encoding?: 'UTF-8'; // test Encoding type and see what happens\n width?: string;\n height?: string;\n reviver?: TSVGReviver;\n};\n\n/**\n * Static canvas class\n * @see {@link http://fabric5.fabricjs.com/static_canvas|StaticCanvas demo}\n * @fires before:render\n * @fires after:render\n * @fires canvas:cleared\n * @fires object:added\n * @fires object:removed\n */\n// TODO: fix `EventSpec` inheritance https://github.com/microsoft/TypeScript/issues/26154#issuecomment-1366616260\nexport class StaticCanvas<\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n EventSpec extends StaticCanvasEvents = StaticCanvasEvents,\n >\n extends createCollectionMixin(CommonMethods)\n implements StaticCanvasOptions\n{\n declare width: number;\n declare height: number;\n\n // background\n declare backgroundVpt: boolean;\n declare backgroundColor: TFiller | string;\n declare backgroundImage?: FabricObject;\n // overlay\n declare overlayVpt: boolean;\n declare overlayColor: TFiller | string;\n declare overlayImage?: FabricObject;\n\n declare clipPath?: FabricObject;\n\n declare includeDefaultValues: boolean;\n\n // rendering config\n declare renderOnAddRemove: boolean;\n declare skipOffscreen: boolean;\n declare enableRetinaScaling: boolean;\n declare imageSmoothingEnabled: boolean;\n\n /**\n * @todo move to Canvas\n */\n declare controlsAboveOverlay: boolean;\n\n /**\n * @todo move to Canvas\n */\n declare allowTouchScrolling: boolean;\n\n declare viewportTransform: TMat2D;\n\n /**\n * The viewport bounding box in scene plane coordinates, see {@link calcViewportBoundaries}\n */\n declare vptCoords: TCornerPoint;\n\n /**\n * A reference to the canvas actual HTMLCanvasElement.\n * Can be use to read the raw pixels, but never write or manipulate\n * @type HTMLCanvasElement\n */\n get lowerCanvasEl() {\n return this.elements.lower?.el;\n }\n\n get contextContainer() {\n return this.elements.lower?.ctx;\n }\n\n /**\n * If true the Canvas is in the process or has been disposed/destroyed.\n * No more rendering operation will be executed on this canvas.\n * @type boolean\n */\n declare destroyed?: boolean;\n\n /**\n * Started the process of disposing but not done yet.\n * WIll likely complete the render cycle already scheduled but stopping adding more.\n * @type boolean\n */\n declare disposed?: boolean;\n\n declare _offset: { left: number; top: number };\n declare protected hasLostContext: boolean;\n declare protected nextRenderHandle: number;\n\n declare elements: StaticCanvasDOMManager;\n\n /**\n * When true control drawing is skipped.\n * This boolean is used to avoid toDataURL to export controls.\n * Usage of this boolean to build up other flows and features is not supported\n * @type Boolean\n * @default false\n */\n declare protected skipControlsDrawing: boolean;\n\n static ownDefaults = staticCanvasDefaults;\n\n // reference to\n declare protected __cleanupTask?: {\n (): void;\n kill: (reason?: any) => void;\n };\n\n static getDefaults(): Record {\n return StaticCanvas.ownDefaults;\n }\n\n constructor(\n el?: string | HTMLCanvasElement,\n options: TOptions = {},\n ) {\n super();\n Object.assign(\n this,\n (this.constructor as typeof StaticCanvas).getDefaults(),\n );\n this.set(options);\n this.initElements(el);\n this._setDimensionsImpl({\n width: this.width || this.elements.lower.el.width || 0,\n height: this.height || this.elements.lower.el.height || 0,\n });\n this.skipControlsDrawing = false;\n this.viewportTransform = [...this.viewportTransform];\n this.calcViewportBoundaries();\n }\n\n protected initElements(el?: string | HTMLCanvasElement) {\n this.elements = new StaticCanvasDOMManager(el);\n }\n\n add(...objects: FabricObject[]) {\n const size = super.add(...objects);\n objects.length > 0 && this.renderOnAddRemove && this.requestRenderAll();\n return size;\n }\n\n insertAt(index: number, ...objects: FabricObject[]) {\n const size = super.insertAt(index, ...objects);\n objects.length > 0 && this.renderOnAddRemove && this.requestRenderAll();\n return size;\n }\n\n remove(...objects: FabricObject[]) {\n const removed = super.remove(...objects);\n removed.length > 0 && this.renderOnAddRemove && this.requestRenderAll();\n return removed;\n }\n\n _onObjectAdded(obj: FabricObject) {\n if (obj.canvas && (obj.canvas as StaticCanvas) !== this) {\n log(\n 'warn',\n 'Canvas is trying to add an object that belongs to a different canvas.\\n' +\n 'Resulting to default behavior: removing object from previous canvas and adding to new canvas',\n );\n obj.canvas.remove(obj);\n }\n obj._set('canvas', this);\n obj.setCoords();\n this.fire('object:added', { target: obj });\n obj.fire('added', { target: this });\n }\n\n _onObjectRemoved(obj: FabricObject) {\n obj._set('canvas', undefined);\n this.fire('object:removed', { target: obj });\n obj.fire('removed', { target: this });\n }\n\n _onStackOrderChanged() {\n this.renderOnAddRemove && this.requestRenderAll();\n }\n\n /**\n * @private\n * @see https://developer.apple.com/library/safari/documentation/AudioVideo/Conceptual/HTML-canvas-guide/SettingUptheCanvas/SettingUptheCanvas.html\n * @return {Number} retinaScaling if applied, otherwise 1;\n */\n getRetinaScaling() {\n return this.enableRetinaScaling ? getDevicePixelRatio() : 1;\n }\n\n /**\n * Calculates canvas element offset relative to the document\n * This method is also attached as \"resize\" event handler of window\n */\n calcOffset() {\n return (this._offset = this.elements.calcOffset());\n }\n\n /**\n * Returns canvas width (in px)\n * @return {Number}\n */\n getWidth(): number {\n return this.width;\n }\n\n /**\n * Returns canvas height (in px)\n * @return {Number}\n */\n getHeight(): number {\n return this.height;\n }\n\n /**\n * Internal use only\n * @protected\n */\n protected _setDimensionsImpl(\n dimensions: Partial,\n { cssOnly = false, backstoreOnly = false }: TCanvasSizeOptions = {},\n ) {\n if (!cssOnly) {\n const size = {\n width: this.width,\n height: this.height,\n ...(dimensions as Partial),\n };\n this.elements.setDimensions(size, this.getRetinaScaling());\n this.hasLostContext = true;\n this.width = size.width;\n this.height = size.height;\n }\n if (!backstoreOnly) {\n this.elements.setCSSDimensions(dimensions);\n }\n\n this.calcOffset();\n }\n\n /**\n * Sets dimensions (width, height) of this canvas instance. when options.cssOnly flag active you should also supply the unit of measure (px/%/em)\n * @param {Object} dimensions Object with width/height properties\n * @param {Number|String} [dimensions.width] Width of canvas element\n * @param {Number|String} [dimensions.height] Height of canvas element\n * @param {Object} [options] Options object\n * @param {Boolean} [options.backstoreOnly=false] Set the given dimensions only as canvas backstore dimensions\n * @param {Boolean} [options.cssOnly=false] Set the given dimensions only as css dimensions\n */\n setDimensions(\n dimensions: Partial,\n options?: { cssOnly?: true; backstoreOnly?: false },\n ): void;\n setDimensions(\n dimensions: Partial,\n options?: { backstoreOnly?: true; cssOnly?: false },\n ): void;\n setDimensions(dimensions: Partial, options?: never): void;\n setDimensions(\n dimensions: Partial,\n options?: TCanvasSizeOptions,\n ) {\n this._setDimensionsImpl(dimensions, options);\n if (!options || !options.cssOnly) {\n this.requestRenderAll();\n }\n }\n\n /**\n * Returns canvas zoom level\n * @return {Number}\n */\n getZoom() {\n return this.viewportTransform[0];\n }\n\n /**\n * Sets viewport transformation of this canvas instance\n * @param {Array} vpt a Canvas 2D API transform matrix\n */\n setViewportTransform(vpt: TMat2D) {\n this.viewportTransform = vpt;\n this.calcViewportBoundaries();\n this.renderOnAddRemove && this.requestRenderAll();\n }\n\n /**\n * Sets zoom level of this canvas instance, the zoom centered around point\n * meaning that following zoom to point with the same point will have the visual\n * effect of the zoom originating from that point. The point won't move.\n * It has nothing to do with canvas center or visual center of the viewport.\n * @param {Point} point to zoom with respect to\n * @param {Number} value to set zoom to, less than 1 zooms out\n */\n zoomToPoint(point: Point, value: number) {\n // TODO: just change the scale, preserve other transformations\n const before = point,\n vpt: TMat2D = [...this.viewportTransform];\n const newPoint = transformPoint(point, invertTransform(vpt));\n vpt[0] = value;\n vpt[3] = value;\n const after = transformPoint(newPoint, vpt);\n vpt[4] += before.x - after.x;\n vpt[5] += before.y - after.y;\n this.setViewportTransform(vpt);\n }\n\n /**\n * Sets zoom level of this canvas instance\n * @param {Number} value to set zoom to, less than 1 zooms out\n */\n setZoom(value: number) {\n this.zoomToPoint(new Point(0, 0), value);\n }\n\n /**\n * Pan viewport so as to place point at top left corner of canvas\n * @param {Point} point to move to\n */\n absolutePan(point: Point) {\n const vpt: TMat2D = [...this.viewportTransform];\n vpt[4] = -point.x;\n vpt[5] = -point.y;\n return this.setViewportTransform(vpt);\n }\n\n /**\n * Pans viewpoint relatively\n * @param {Point} point (position vector) to move by\n */\n relativePan(point: Point) {\n return this.absolutePan(\n new Point(\n -point.x - this.viewportTransform[4],\n -point.y - this.viewportTransform[5],\n ),\n );\n }\n\n /**\n * Returns <canvas> element corresponding to this instance\n * @return {HTMLCanvasElement}\n */\n getElement(): HTMLCanvasElement {\n return this.elements.lower.el;\n }\n\n /**\n * Clears specified context of canvas element\n * @param {CanvasRenderingContext2D} ctx Context to clear\n */\n clearContext(ctx: CanvasRenderingContext2D) {\n ctx.clearRect(0, 0, this.width, this.height);\n }\n\n /**\n * Returns context of canvas where objects are drawn\n * @return {CanvasRenderingContext2D}\n */\n getContext(): CanvasRenderingContext2D {\n return this.elements.lower.ctx;\n }\n\n /**\n * Clears all contexts (background, main, top) of an instance\n */\n clear() {\n this.remove(...this.getObjects());\n this.backgroundImage = undefined;\n this.overlayImage = undefined;\n this.backgroundColor = '';\n this.overlayColor = '';\n this.clearContext(this.getContext());\n this.fire('canvas:cleared');\n this.renderOnAddRemove && this.requestRenderAll();\n }\n\n /**\n * Renders the canvas\n */\n renderAll() {\n this.cancelRequestedRender();\n if (this.destroyed) {\n return;\n }\n this.renderCanvas(this.getContext(), this._objects);\n }\n\n /**\n * Function created to be instance bound at initialization\n * used in requestAnimationFrame rendering\n * Let the fabricJS call it. If you call it manually you could have more\n * animationFrame stacking on to of each other\n * for an imperative rendering, use canvas.renderAll\n * @private\n */\n renderAndReset() {\n this.nextRenderHandle = 0;\n this.renderAll();\n }\n\n /**\n * Append a renderAll request to next animation frame.\n * unless one is already in progress, in that case nothing is done\n * a boolean flag will avoid appending more.\n */\n requestRenderAll() {\n if (!this.nextRenderHandle && !this.disposed && !this.destroyed) {\n this.nextRenderHandle = requestAnimFrame(() => this.renderAndReset());\n }\n }\n\n /**\n * Calculate the position of the 4 corner of canvas with current viewportTransform.\n * helps to determinate when an object is in the current rendering viewport\n */\n calcViewportBoundaries(): TCornerPoint {\n const width = this.width,\n height = this.height,\n iVpt = invertTransform(this.viewportTransform),\n a = transformPoint({ x: 0, y: 0 }, iVpt),\n b = transformPoint({ x: width, y: height }, iVpt),\n // we don't support vpt flipping\n // but the code is robust enough to mostly work with flipping\n min = a.min(b),\n max = a.max(b);\n return (this.vptCoords = {\n tl: min,\n tr: new Point(max.x, min.y),\n bl: new Point(min.x, max.y),\n br: max,\n });\n }\n\n cancelRequestedRender() {\n if (this.nextRenderHandle) {\n cancelAnimFrame(this.nextRenderHandle);\n this.nextRenderHandle = 0;\n }\n }\n\n drawControls(_ctx: CanvasRenderingContext2D) {\n // Static canvas has no controls\n }\n\n /**\n * Renders background, objects, overlay and controls.\n * @param {CanvasRenderingContext2D} ctx\n * @param {Array} objects to render\n */\n renderCanvas(ctx: CanvasRenderingContext2D, objects: FabricObject[]) {\n if (this.destroyed) {\n return;\n }\n\n const v = this.viewportTransform,\n path = this.clipPath;\n this.calcViewportBoundaries();\n this.clearContext(ctx);\n ctx.imageSmoothingEnabled = this.imageSmoothingEnabled;\n // @ts-expect-error node-canvas stuff\n ctx.patternQuality = 'best';\n this.fire('before:render', { ctx });\n this._renderBackground(ctx);\n\n ctx.save();\n //apply viewport transform once for all rendering process\n ctx.transform(v[0], v[1], v[2], v[3], v[4], v[5]);\n this._renderObjects(ctx, objects);\n ctx.restore();\n if (!this.controlsAboveOverlay && !this.skipControlsDrawing) {\n this.drawControls(ctx);\n }\n if (path) {\n path._set('canvas', this);\n // needed to setup a couple of variables\n // todo migrate to the newer one\n path.shouldCache();\n path._transformDone = true;\n (path as TCachedFabricObject).renderCache({ forClipping: true });\n this.drawClipPathOnCanvas(ctx, path as TCachedFabricObject);\n }\n this._renderOverlay(ctx);\n if (this.controlsAboveOverlay && !this.skipControlsDrawing) {\n this.drawControls(ctx);\n }\n this.fire('after:render', { ctx });\n\n if (this.__cleanupTask) {\n this.__cleanupTask();\n this.__cleanupTask = undefined;\n }\n }\n\n /**\n * Paint the cached clipPath on the lowerCanvasEl\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n drawClipPathOnCanvas(\n ctx: CanvasRenderingContext2D,\n clipPath: TCachedFabricObject,\n ) {\n const v = this.viewportTransform;\n ctx.save();\n ctx.transform(...v);\n // DEBUG: uncomment this line, comment the following\n // ctx.globalAlpha = 0.4;\n ctx.globalCompositeOperation = 'destination-in';\n clipPath.transform(ctx);\n ctx.scale(1 / clipPath.zoomX, 1 / clipPath.zoomY);\n ctx.drawImage(\n clipPath._cacheCanvas,\n -clipPath.cacheTranslationX,\n -clipPath.cacheTranslationY,\n );\n ctx.restore();\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n * @param {Array} objects to render\n */\n _renderObjects(ctx: CanvasRenderingContext2D, objects: FabricObject[]) {\n for (let i = 0, len = objects.length; i < len; ++i) {\n objects[i] && objects[i].render(ctx);\n }\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n * @param {string} property 'background' or 'overlay'\n */\n _renderBackgroundOrOverlay(\n ctx: CanvasRenderingContext2D,\n property: 'background' | 'overlay',\n ) {\n const fill = this[`${property}Color`],\n object = this[`${property}Image`],\n v = this.viewportTransform,\n needsVpt = this[`${property}Vpt`];\n if (!fill && !object) {\n return;\n }\n const isAFiller = isFiller(fill);\n if (fill) {\n ctx.save();\n ctx.beginPath();\n ctx.moveTo(0, 0);\n ctx.lineTo(this.width, 0);\n ctx.lineTo(this.width, this.height);\n ctx.lineTo(0, this.height);\n ctx.closePath();\n ctx.fillStyle = isAFiller ? fill.toLive(ctx /* this */)! : fill;\n if (needsVpt) {\n ctx.transform(...v);\n }\n if (isAFiller) {\n ctx.transform(1, 0, 0, 1, fill.offsetX || 0, fill.offsetY || 0);\n const m = ((fill as Gradient<'linear'>).gradientTransform ||\n (fill as Pattern).patternTransform) as TMat2D;\n m && ctx.transform(...m);\n }\n ctx.fill();\n ctx.restore();\n }\n if (object) {\n ctx.save();\n const { skipOffscreen } = this;\n // if the object doesn't move with the viewport,\n // the offscreen concept does not apply;\n this.skipOffscreen = needsVpt;\n if (needsVpt) {\n ctx.transform(...v);\n }\n object.render(ctx);\n this.skipOffscreen = skipOffscreen;\n ctx.restore();\n }\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _renderBackground(ctx: CanvasRenderingContext2D) {\n this._renderBackgroundOrOverlay(ctx, 'background');\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _renderOverlay(ctx: CanvasRenderingContext2D) {\n this._renderBackgroundOrOverlay(ctx, 'overlay');\n }\n\n /**\n * Returns coordinates of a center of canvas.\n * @return {Point}\n */\n getCenterPoint() {\n return new Point(this.width / 2, this.height / 2);\n }\n\n /**\n * Centers object horizontally in the canvas\n */\n centerObjectH(object: FabricObject) {\n return this._centerObject(\n object,\n new Point(this.getCenterPoint().x, object.getCenterPoint().y),\n );\n }\n\n /**\n * Centers object vertically in the canvas\n * @param {FabricObject} object Object to center vertically\n */\n centerObjectV(object: FabricObject) {\n return this._centerObject(\n object,\n new Point(object.getCenterPoint().x, this.getCenterPoint().y),\n );\n }\n\n /**\n * Centers object vertically and horizontally in the canvas\n * @param {FabricObject} object Object to center vertically and horizontally\n */\n centerObject(object: FabricObject) {\n return this._centerObject(object, this.getCenterPoint());\n }\n\n /**\n * Centers object vertically and horizontally in the viewport\n * @param {FabricObject} object Object to center vertically and horizontally\n */\n viewportCenterObject(object: FabricObject) {\n return this._centerObject(object, this.getVpCenter());\n }\n\n /**\n * Centers object horizontally in the viewport, object.top is unchanged\n * @param {FabricObject} object Object to center vertically and horizontally\n */\n viewportCenterObjectH(object: FabricObject) {\n return this._centerObject(\n object,\n new Point(this.getVpCenter().x, object.getCenterPoint().y),\n );\n }\n\n /**\n * Centers object Vertically in the viewport, object.top is unchanged\n * @param {FabricObject} object Object to center vertically and horizontally\n */\n viewportCenterObjectV(object: FabricObject) {\n return this._centerObject(\n object,\n new Point(object.getCenterPoint().x, this.getVpCenter().y),\n );\n }\n\n /**\n * Calculate the point in canvas that correspond to the center of actual viewport.\n * @return {Point} vpCenter, viewport center\n */\n getVpCenter(): Point {\n return transformPoint(\n this.getCenterPoint(),\n invertTransform(this.viewportTransform),\n );\n }\n\n /**\n * @private\n * @param {FabricObject} object Object to center\n * @param {Point} center Center point\n */\n _centerObject(object: FabricObject, center: Point) {\n object.setXY(center, CENTER, CENTER);\n object.setCoords();\n this.renderOnAddRemove && this.requestRenderAll();\n }\n\n /**\n * Returns dataless JSON representation of canvas\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {String} json string\n */\n toDatalessJSON(propertiesToInclude?: string[]) {\n return this.toDatalessObject(propertiesToInclude);\n }\n\n /**\n * Returns object representation of canvas\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} object representation of an instance\n */\n toObject(propertiesToInclude?: string[]) {\n return this._toObjectMethod('toObject', propertiesToInclude);\n }\n\n /**\n * Returns Object representation of canvas\n * this alias is provided because if you call JSON.stringify on an instance,\n * the toJSON object will be invoked if it exists.\n * Having a toJSON method means you can do JSON.stringify(myCanvas)\n * JSON does not support additional properties because toJSON has its own signature\n * @return {Object} JSON compatible object\n * @see {@link http://fabric5.fabricjs.com/fabric-intro-part-3#serialization}\n * @see {@link http://jsfiddle.net/fabricjs/pec86/|jsFiddle demo}\n * @example JSON representation of canvas \n * const json = canvas.toJSON();\n * @example JSON representation of canvas \n * const json = JSON.stringify(canvas);\n */\n toJSON() {\n return this.toObject();\n }\n\n /**\n * Returns dataless object representation of canvas\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} object representation of an instance\n */\n toDatalessObject(propertiesToInclude?: string[]) {\n return this._toObjectMethod('toDatalessObject', propertiesToInclude);\n }\n\n /**\n * @private\n */\n _toObjectMethod(\n methodName: TValidToObjectMethod,\n propertiesToInclude?: string[],\n ) {\n const clipPath = this.clipPath;\n const clipPathData =\n clipPath && !clipPath.excludeFromExport\n ? this._toObject(clipPath, methodName, propertiesToInclude)\n : null;\n return {\n version: VERSION,\n ...pick(this, propertiesToInclude as (keyof this)[]),\n objects: this._objects\n .filter((object) => !object.excludeFromExport)\n .map((instance) =>\n this._toObject(instance, methodName, propertiesToInclude),\n ),\n ...this.__serializeBgOverlay(methodName, propertiesToInclude),\n ...(clipPathData ? { clipPath: clipPathData } : null),\n };\n }\n\n /**\n * @private\n */\n protected _toObject(\n instance: FabricObject,\n methodName: TValidToObjectMethod,\n propertiesToInclude?: string[],\n ) {\n let originalValue;\n\n if (!this.includeDefaultValues) {\n originalValue = instance.includeDefaultValues;\n instance.includeDefaultValues = false;\n }\n\n const object = instance[methodName](propertiesToInclude);\n if (!this.includeDefaultValues) {\n instance.includeDefaultValues = !!originalValue;\n }\n return object;\n }\n\n /**\n * @private\n */\n __serializeBgOverlay(\n methodName: TValidToObjectMethod,\n propertiesToInclude?: string[],\n ) {\n const data: any = {},\n bgImage = this.backgroundImage,\n overlayImage = this.overlayImage,\n bgColor = this.backgroundColor,\n overlayColor = this.overlayColor;\n\n if (isFiller(bgColor)) {\n if (!bgColor.excludeFromExport) {\n data.background = bgColor.toObject(propertiesToInclude);\n }\n } else if (bgColor) {\n data.background = bgColor;\n }\n\n if (isFiller(overlayColor)) {\n if (!overlayColor.excludeFromExport) {\n data.overlay = overlayColor.toObject(propertiesToInclude);\n }\n } else if (overlayColor) {\n data.overlay = overlayColor;\n }\n\n if (bgImage && !bgImage.excludeFromExport) {\n data.backgroundImage = this._toObject(\n bgImage,\n methodName,\n propertiesToInclude,\n );\n }\n if (overlayImage && !overlayImage.excludeFromExport) {\n data.overlayImage = this._toObject(\n overlayImage,\n methodName,\n propertiesToInclude,\n );\n }\n\n return data;\n }\n\n /* _TO_SVG_START_ */\n\n declare svgViewportTransformation: boolean;\n\n /**\n * Returns SVG representation of canvas\n * @param {Object} [options] Options object for SVG output\n * @param {Boolean} [options.suppressPreamble=false] If true xml tag is not included\n * @param {Object} [options.viewBox] SVG viewbox object\n * @param {Number} [options.viewBox.x] x-coordinate of viewbox\n * @param {Number} [options.viewBox.y] y-coordinate of viewbox\n * @param {Number} [options.viewBox.width] Width of viewbox\n * @param {Number} [options.viewBox.height] Height of viewbox\n * @param {String} [options.encoding=UTF-8] Encoding of SVG output\n * @param {String} [options.width] desired width of svg with or without units\n * @param {String} [options.height] desired height of svg with or without units\n * @param {Function} [reviver] Method for further parsing of svg elements, called after each fabric object converted into svg representation.\n * @return {String} SVG string\n * @see {@link http://fabric5.fabricjs.com/fabric-intro-part-3#serialization}\n * @see {@link http://jsfiddle.net/fabricjs/jQ3ZZ/|jsFiddle demo}\n * @example Normal SVG output\n * var svg = canvas.toSVG();\n * @example SVG output without preamble (without <?xml ../>)\n * var svg = canvas.toSVG({suppressPreamble: true});\n * @example SVG output with viewBox attribute\n * var svg = canvas.toSVG({\n * viewBox: {\n * x: 100,\n * y: 100,\n * width: 200,\n * height: 300\n * }\n * });\n * @example SVG output with different encoding (default: UTF-8)\n * var svg = canvas.toSVG({encoding: 'ISO-8859-1'});\n * @example Modify SVG output with reviver function\n * var svg = canvas.toSVG(null, function(svg) {\n * return svg.replace('stroke-dasharray: ; stroke-linecap: butt; stroke-linejoin: miter; stroke-miterlimit: 10; ', '');\n * });\n */\n toSVG(options: TSVGExportOptions = {}, reviver?: TSVGReviver) {\n options.reviver = reviver;\n const markup: string[] = [];\n\n this._setSVGPreamble(markup, options);\n this._setSVGHeader(markup, options);\n if (this.clipPath) {\n markup.push(`\\n`);\n }\n this._setSVGBgOverlayColor(markup, 'background');\n this._setSVGBgOverlayImage(markup, 'backgroundImage', reviver);\n this._setSVGObjects(markup, reviver);\n if (this.clipPath) {\n markup.push('\\n');\n }\n this._setSVGBgOverlayColor(markup, 'overlay');\n this._setSVGBgOverlayImage(markup, 'overlayImage', reviver);\n\n markup.push('');\n\n return markup.join('');\n }\n\n /**\n * @private\n */\n _setSVGPreamble(markup: string[], options: TSVGExportOptions): void {\n if (options.suppressPreamble) {\n return;\n }\n markup.push(\n '\\n',\n '\\n',\n );\n }\n\n /**\n * @private\n */\n _setSVGHeader(markup: string[], options: TSVGExportOptions): void {\n const width = options.width || `${this.width}`,\n height = options.height || `${this.height}`,\n NUM_FRACTION_DIGITS = config.NUM_FRACTION_DIGITS,\n optViewBox = options.viewBox;\n let viewBox: string;\n if (optViewBox) {\n viewBox = `viewBox=\"${optViewBox.x} ${optViewBox.y} ${optViewBox.width} ${optViewBox.height}\" `;\n } else if (this.svgViewportTransformation) {\n const vpt = this.viewportTransform;\n viewBox = `viewBox=\"${toFixed(\n -vpt[4] / vpt[0],\n NUM_FRACTION_DIGITS,\n )} ${toFixed(-vpt[5] / vpt[3], NUM_FRACTION_DIGITS)} ${toFixed(\n this.width / vpt[0],\n NUM_FRACTION_DIGITS,\n )} ${toFixed(this.height / vpt[3], NUM_FRACTION_DIGITS)}\" `;\n } else {\n viewBox = `viewBox=\"0 0 ${this.width} ${this.height}\" `;\n }\n\n markup.push(\n '\\n',\n 'Created with Fabric.js ',\n VERSION,\n '\\n',\n '\\n',\n this.createSVGFontFacesMarkup(),\n this.createSVGRefElementsMarkup(),\n this.createSVGClipPathMarkup(options),\n '\\n',\n );\n }\n\n createSVGClipPathMarkup(options: TSVGExportOptions): string {\n const clipPath = this.clipPath;\n if (clipPath) {\n clipPath.clipPathId = `CLIPPATH_${uid()}`;\n return `\\n${clipPath.toClipPathSVG(\n options.reviver,\n )}\\n`;\n }\n return '';\n }\n\n /**\n * Creates markup containing SVG referenced elements like patterns, gradients etc.\n * @return {String}\n */\n createSVGRefElementsMarkup(): string {\n return (['background', 'overlay'] as const)\n .map((prop) => {\n const fill = this[`${prop}Color`];\n if (isFiller(fill)) {\n const shouldTransform = this[`${prop}Vpt`],\n vpt = this.viewportTransform,\n object = {\n // otherwise circular dependency\n isType: () => false,\n width: this.width / (shouldTransform ? vpt[0] : 1),\n height: this.height / (shouldTransform ? vpt[3] : 1),\n };\n return fill.toSVG(object as FabricObject, {\n additionalTransform: shouldTransform ? matrixToSVG(vpt) : '',\n });\n }\n })\n .join('');\n }\n\n /**\n * Creates markup containing SVG font faces,\n * font URLs for font faces must be collected by developers\n * and are not extracted from the DOM by fabricjs\n * @param {Array} objects Array of fabric objects\n * @return {String}\n */\n createSVGFontFacesMarkup(): string {\n const objects: FabricObject[] = [],\n fontList: Record = {},\n fontPaths = config.fontPaths;\n\n this._objects.forEach(function add(object) {\n objects.push(object);\n if (isCollection(object)) {\n object._objects.forEach(add);\n }\n });\n\n objects.forEach((obj) => {\n if (!isTextObject(obj)) {\n return;\n }\n const { styles, fontFamily } = obj;\n if (fontList[fontFamily] || !fontPaths[fontFamily]) {\n return;\n }\n fontList[fontFamily] = true;\n if (!styles) {\n return;\n }\n Object.values(styles).forEach((styleRow) => {\n Object.values(styleRow).forEach(({ fontFamily = '' }) => {\n if (!fontList[fontFamily] && fontPaths[fontFamily]) {\n fontList[fontFamily] = true;\n }\n });\n });\n });\n\n const fontListMarkup = Object.keys(fontList)\n .map(\n (fontFamily) =>\n `\\t\\t@font-face {\\n\\t\\t\\tfont-family: '${fontFamily}';\\n\\t\\t\\tsrc: url('${fontPaths[fontFamily]}');\\n\\t\\t}\\n`,\n )\n .join('');\n\n if (fontListMarkup) {\n return `\\t\\n`;\n }\n return '';\n }\n\n /**\n * @private\n */\n _setSVGObjects(markup: string[], reviver?: TSVGReviver) {\n this.forEachObject((fabricObject) => {\n if (fabricObject.excludeFromExport) {\n return;\n }\n this._setSVGObject(markup, fabricObject, reviver);\n });\n }\n\n /**\n * This is its own function because the Canvas ( non static ) requires extra code here\n * @private\n */\n _setSVGObject(\n markup: string[],\n instance: FabricObject,\n reviver?: TSVGReviver,\n ) {\n markup.push(instance.toSVG(reviver));\n }\n\n /**\n * @private\n */\n _setSVGBgOverlayImage(\n markup: string[],\n property: 'overlayImage' | 'backgroundImage',\n reviver?: TSVGReviver,\n ) {\n const bgOrOverlay = this[property];\n if (bgOrOverlay && !bgOrOverlay.excludeFromExport && bgOrOverlay.toSVG) {\n markup.push(bgOrOverlay.toSVG(reviver));\n }\n }\n\n /**\n * @TODO this seems to handle patterns but fail at gradients.\n * @private\n */\n _setSVGBgOverlayColor(markup: string[], property: 'background' | 'overlay') {\n const filler = this[`${property}Color`];\n if (!filler) {\n return;\n }\n if (isFiller(filler)) {\n const repeat = (filler as Pattern).repeat || '',\n finalWidth = this.width,\n finalHeight = this.height,\n shouldInvert = this[`${property}Vpt`],\n additionalTransform = shouldInvert\n ? matrixToSVG(invertTransform(this.viewportTransform))\n : '';\n markup.push(\n `\\n`,\n );\n } else {\n markup.push(\n '\\n',\n );\n }\n }\n /* _TO_SVG_END_ */\n\n /**\n * Populates canvas with data from the specified JSON.\n * JSON format must conform to the one of {@link fabric.Canvas#toJSON}\n *\n * **IMPORTANT**: It is recommended to abort loading tasks before calling this method to prevent race conditions and unnecessary networking\n *\n * @param {String|Object} json JSON string or object\n * @param {Function} [reviver] Method for further parsing of JSON elements, called after each fabric object created.\n * @param {Object} [options] options\n * @param {AbortSignal} [options.signal] see https://developer.mozilla.org/en-US/docs/Web/API/AbortController/signal\n * @return {Promise} instance\n * @see {@link http://fabric5.fabricjs.com/fabric-intro-part-3#deserialization}\n * @see {@link http://jsfiddle.net/fabricjs/fmgXt/|jsFiddle demo}\n * @example loadFromJSON\n * canvas.loadFromJSON(json).then((canvas) => canvas.requestRenderAll());\n * @example loadFromJSON with reviver\n * canvas.loadFromJSON(json, function(o, object) {\n * // `o` = json object\n * // `object` = fabric.Object instance\n * // ... do some stuff ...\n * }).then((canvas) => {\n * ... canvas is restored, add your code.\n * });\n *\n */\n loadFromJSON(\n json: string | Record,\n reviver?: EnlivenObjectOptions['reviver'],\n { signal }: Abortable = {},\n ): Promise {\n if (!json) {\n return Promise.reject(new FabricError('`json` is undefined'));\n }\n\n // parse json if it wasn't already\n const { objects = [], ...serialized } =\n typeof json === 'string' ? JSON.parse(json) : json;\n const { backgroundImage, background, overlayImage, overlay, clipPath } =\n serialized;\n const renderOnAddRemove = this.renderOnAddRemove;\n this.renderOnAddRemove = false;\n\n return Promise.all([\n enlivenObjects(objects, {\n reviver,\n signal,\n }),\n enlivenObjectEnlivables(\n {\n backgroundImage,\n backgroundColor: background,\n overlayImage,\n overlayColor: overlay,\n clipPath,\n },\n { signal },\n ),\n ]).then(([enlived, enlivedMap]) => {\n this.clear();\n this.add(...enlived);\n this.set(serialized);\n this.set(enlivedMap);\n this.renderOnAddRemove = renderOnAddRemove;\n return this;\n });\n }\n\n /**\n * Clones canvas instance\n * @param {string[]} [properties] Array of properties to include in the cloned canvas and children\n */\n clone(properties: string[]) {\n const data = this.toObject(properties);\n const canvas = this.cloneWithoutData();\n return canvas.loadFromJSON(data);\n }\n\n /**\n * Clones canvas instance without cloning existing data.\n * This essentially copies canvas dimensions since loadFromJSON does not affect canvas size.\n */\n cloneWithoutData() {\n const el = createCanvasElementFor(this);\n return new (this.constructor as Constructor)(el);\n }\n\n /**\n * Exports canvas element to a dataurl image. Note that when multiplier is used, cropping is scaled appropriately\n * @param {Object} [options] Options object\n * @param {String} [options.format=png] The format of the output image. Either \"jpeg\" or \"png\"\n * @param {Number} [options.quality=1] Quality level (0..1). Only used for jpeg.\n * @param {Number} [options.multiplier=1] Multiplier to scale by, to have consistent\n * @param {Number} [options.left] Cropping left offset. Introduced in v1.2.14\n * @param {Number} [options.top] Cropping top offset. Introduced in v1.2.14\n * @param {Number} [options.width] Cropping width. Introduced in v1.2.14\n * @param {Number} [options.height] Cropping height. Introduced in v1.2.14\n * @param {Boolean} [options.enableRetinaScaling] Enable retina scaling for clone image. Introduce in 2.0.0\n * @param {(object: fabric.Object) => boolean} [options.filter] Function to filter objects.\n * @return {String} Returns a data: URL containing a representation of the object in the format specified by options.format\n * @see {@link https://jsfiddle.net/xsjua1rd/ demo}\n * @example Generate jpeg dataURL with lower quality\n * var dataURL = canvas.toDataURL({\n * format: 'jpeg',\n * quality: 0.8\n * });\n * @example Generate cropped png dataURL (clipping of canvas)\n * var dataURL = canvas.toDataURL({\n * format: 'png',\n * left: 100,\n * top: 100,\n * width: 200,\n * height: 200\n * });\n * @example Generate double scaled png dataURL\n * var dataURL = canvas.toDataURL({\n * format: 'png',\n * multiplier: 2\n * });\n * @example Generate dataURL with objects that overlap a specified object\n * var myObject;\n * var dataURL = canvas.toDataURL({\n * filter: (object) => object.isContainedWithinObject(myObject) || object.intersectsWithObject(myObject)\n * });\n */\n toDataURL(options = {} as TDataUrlOptions): string {\n const {\n format = 'png',\n quality = 1,\n multiplier = 1,\n enableRetinaScaling = false,\n } = options;\n const finalMultiplier =\n multiplier * (enableRetinaScaling ? this.getRetinaScaling() : 1);\n\n return toDataURL(\n this.toCanvasElement(finalMultiplier, options),\n format,\n quality,\n );\n }\n toBlob(options = {} as TDataUrlOptions): Promise {\n const {\n format = 'png',\n quality = 1,\n multiplier = 1,\n enableRetinaScaling = false,\n } = options;\n const finalMultiplier =\n multiplier * (enableRetinaScaling ? this.getRetinaScaling() : 1);\n\n return toBlob(\n this.toCanvasElement(finalMultiplier, options),\n format,\n quality,\n );\n }\n\n /**\n * Create a new HTMLCanvas element painted with the current canvas content.\n * No need to resize the actual one or repaint it.\n * Will transfer object ownership to a new canvas, paint it, and set everything back.\n * This is an intermediary step used to get to a dataUrl but also it is useful to\n * create quick image copies of a canvas without passing for the dataUrl string\n * @param {Number} [multiplier] a zoom factor.\n * @param {Object} [options] Cropping informations\n * @param {Number} [options.left] Cropping left offset.\n * @param {Number} [options.top] Cropping top offset.\n * @param {Number} [options.width] Cropping width.\n * @param {Number} [options.height] Cropping height.\n * @param {(object: fabric.Object) => boolean} [options.filter] Function to filter objects.\n */\n toCanvasElement(\n multiplier = 1,\n { width, height, left, top, filter } = {} as TToCanvasElementOptions,\n ): HTMLCanvasElement {\n const scaledWidth = (width || this.width) * multiplier,\n scaledHeight = (height || this.height) * multiplier,\n zoom = this.getZoom(),\n originalWidth = this.width,\n originalHeight = this.height,\n originalSkipControlsDrawing = this.skipControlsDrawing,\n newZoom = zoom * multiplier,\n vp = this.viewportTransform,\n translateX = (vp[4] - (left || 0)) * multiplier,\n translateY = (vp[5] - (top || 0)) * multiplier,\n newVp = [newZoom, 0, 0, newZoom, translateX, translateY] as TMat2D,\n originalRetina = this.enableRetinaScaling,\n canvasEl = createCanvasElementFor({\n width: scaledWidth,\n height: scaledHeight,\n }),\n objectsToRender = filter\n ? this._objects.filter((obj) => filter(obj))\n : this._objects;\n this.enableRetinaScaling = false;\n this.viewportTransform = newVp;\n this.width = scaledWidth;\n this.height = scaledHeight;\n this.skipControlsDrawing = true;\n this.calcViewportBoundaries();\n this.renderCanvas(canvasEl.getContext('2d')!, objectsToRender);\n this.viewportTransform = vp;\n this.width = originalWidth;\n this.height = originalHeight;\n this.calcViewportBoundaries();\n this.enableRetinaScaling = originalRetina;\n this.skipControlsDrawing = originalSkipControlsDrawing;\n return canvasEl;\n }\n\n /**\n * Waits until rendering has settled to destroy the canvas\n * @returns {Promise} a promise resolving to `true` once the canvas has been destroyed or to `false` if the canvas has was already destroyed\n * @throws if aborted by a consequent call\n */\n dispose() {\n !this.disposed &&\n this.elements.cleanupDOM({ width: this.width, height: this.height });\n runningAnimations.cancelByCanvas(this);\n this.disposed = true;\n return new Promise((resolve, reject) => {\n const task = () => {\n this.destroy();\n resolve(true);\n };\n task.kill = reject;\n if (this.__cleanupTask) {\n this.__cleanupTask.kill('aborted');\n }\n\n if (this.destroyed) {\n resolve(false);\n } else if (this.nextRenderHandle) {\n this.__cleanupTask = task;\n } else {\n task();\n }\n });\n }\n\n /**\n * Clears the canvas element, disposes objects and frees resources.\n *\n * Invoked as part of the **async** operation of {@link dispose}.\n *\n * **CAUTION**:\n *\n * This method is **UNSAFE**.\n * You may encounter a race condition using it if there's a requested render.\n * Call this method only if you are sure rendering has settled.\n * Consider using {@link dispose} as it is **SAFE**\n *\n * @private\n */\n destroy() {\n this.destroyed = true;\n this.cancelRequestedRender();\n this.forEachObject((object) => object.dispose());\n this._objects = [];\n if (this.backgroundImage) {\n this.backgroundImage.dispose();\n }\n this.backgroundImage = undefined;\n if (this.overlayImage) {\n this.overlayImage.dispose();\n }\n this.overlayImage = undefined;\n this.elements.dispose();\n }\n\n /**\n * Returns a string representation of an instance\n * @return {String} string representation of an instance\n */\n toString() {\n return `#`;\n }\n}\n","import type { TPointerEvent } from '../EventTypeDefs';\nimport { Point } from '../Point';\nimport { getScrollLeftTop } from './dom_misc';\n\nconst touchEvents = ['touchstart', 'touchmove', 'touchend'];\n\nfunction getTouchInfo(event: TouchEvent | MouseEvent): MouseEvent | Touch {\n const touchProp = (event as TouchEvent).changedTouches;\n if (touchProp && touchProp[0]) {\n return touchProp[0];\n }\n return event as MouseEvent;\n}\n\nexport const getPointer = (event: TPointerEvent): Point => {\n const element = event.target as HTMLElement,\n scroll = getScrollLeftTop(element),\n _evt = getTouchInfo(event);\n return new Point(_evt.clientX + scroll.left, _evt.clientY + scroll.top);\n};\n\nexport const isTouchEvent = (event: TPointerEvent) =>\n touchEvents.includes(event.type) ||\n (event as PointerEvent).pointerType === 'touch';\n\nexport const stopEvent = (e: Event) => {\n e.preventDefault();\n e.stopPropagation();\n};\n","import type { XY } from '../../Point';\nimport type { TBBox } from '../../typedefs';\n\n/**\n * Calculates bounding box (left, top, width, height) from given `points`\n * @param {XY[]} points\n * @return {Object} Object with left, top, width, height properties\n */\nexport const makeBoundingBoxFromPoints = (points: XY[]): TBBox => {\n let left = 0,\n top = 0,\n width = 0,\n height = 0;\n\n for (let i = 0, len = points.length; i < len; i++) {\n const { x, y } = points[i];\n if (x > width || !i) width = x;\n if (x < left || !i) left = x;\n if (y > height || !i) height = y;\n if (y < top || !i) top = y;\n }\n\n return {\n left,\n top,\n width: width - left,\n height: height - top,\n };\n};\n","import { Point } from '../../Point';\nimport { CENTER } from '../../constants';\nimport type { FabricObject } from '../../shapes/Object/Object';\nimport type { TMat2D } from '../../typedefs';\nimport { makeBoundingBoxFromPoints } from './boundingBoxFromPoints';\nimport {\n invertTransform,\n multiplyTransformMatrices,\n qrDecompose,\n} from './matrix';\n\n/**\n * given an object and a transform, apply the inverse transform to the object,\n * this is equivalent to remove from that object that transformation, so that\n * added in a space with the removed transform, the object will be the same as before.\n * Removing from an object a transform that scale by 2 is like scaling it by 1/2.\n * Removing from an object a transform that rotate by 30deg is like rotating by 30deg\n * in the opposite direction.\n * This util is used to add objects inside transformed groups or nested groups.\n * @param {FabricObject} object the object you want to transform\n * @param {TMat2D} transform the destination transform\n */\nexport const removeTransformFromObject = (\n object: FabricObject,\n transform: TMat2D,\n) => {\n const inverted = invertTransform(transform),\n finalTransform = multiplyTransformMatrices(\n inverted,\n object.calcOwnMatrix(),\n );\n applyTransformToObject(object, finalTransform);\n};\n\n/**\n * given an object and a transform, apply the transform to the object.\n * this is equivalent to change the space where the object is drawn.\n * Adding to an object a transform that scale by 2 is like scaling it by 2.\n * This is used when removing an object from an active selection for example.\n * @param {FabricObject} object the object you want to transform\n * @param {Array} transform the destination transform\n */\nexport const addTransformToObject = (object: FabricObject, transform: TMat2D) =>\n applyTransformToObject(\n object,\n multiplyTransformMatrices(transform, object.calcOwnMatrix()),\n );\n\n/**\n * discard an object transform state and apply the one from the matrix.\n * @param {FabricObject} object the object you want to transform\n * @param {Array} transform the destination transform\n */\nexport const applyTransformToObject = (\n object: FabricObject,\n transform: TMat2D,\n) => {\n const { translateX, translateY, scaleX, scaleY, ...otherOptions } =\n qrDecompose(transform),\n center = new Point(translateX, translateY);\n object.flipX = false;\n object.flipY = false;\n Object.assign(object, otherOptions);\n object.set({ scaleX, scaleY });\n object.setPositionByOrigin(center, CENTER, CENTER);\n};\n/**\n * reset an object transform state to neutral. Top and left are not accounted for\n * @param {FabricObject} target object to transform\n */\nexport const resetObjectTransform = (target: FabricObject) => {\n target.scaleX = 1;\n target.scaleY = 1;\n target.skewX = 0;\n target.skewY = 0;\n target.flipX = false;\n target.flipY = false;\n target.rotate(0);\n};\n\n/**\n * Extract Object transform values\n * @param {FabricObject} target object to read from\n * @return {Object} Components of transform\n */\nexport const saveObjectTransform = (target: FabricObject) => ({\n scaleX: target.scaleX,\n scaleY: target.scaleY,\n skewX: target.skewX,\n skewY: target.skewY,\n angle: target.angle,\n left: target.left,\n flipX: target.flipX,\n flipY: target.flipY,\n top: target.top,\n});\n\n/**\n * given a width and height, return the size of the bounding box\n * that can contains the box with width/height with applied transform.\n * Use to calculate the boxes around objects for controls.\n * @param {Number} width\n * @param {Number} height\n * @param {TMat2D} t\n * @returns {Point} size\n */\nexport const sizeAfterTransform = (\n width: number,\n height: number,\n t: TMat2D,\n) => {\n const dimX = width / 2,\n dimY = height / 2,\n points = [\n new Point(-dimX, -dimY),\n new Point(dimX, -dimY),\n new Point(-dimX, dimY),\n new Point(dimX, dimY),\n ].map((p) => p.transform(t)),\n bbox = makeBoundingBoxFromPoints(points);\n return new Point(bbox.width, bbox.height);\n};\n","import { iMatrix } from '../../constants';\nimport type { Point } from '../../Point';\nimport type { FabricObject } from '../../shapes/Object/Object';\nimport type { TMat2D } from '../../typedefs';\nimport { invertTransform, multiplyTransformMatrices } from './matrix';\nimport { applyTransformToObject } from './objectTransforms';\n\n/**\n * We are actually looking for the transformation from the destination plane to the source plane (change of basis matrix)\\\n * The object will exist on the destination plane and we want it to seem unchanged by it so we invert the destination matrix (`to`) and then apply the source matrix (`from`)\n * @param [from]\n * @param [to]\n * @returns\n */\nexport const calcPlaneChangeMatrix = (\n from: TMat2D = iMatrix,\n to: TMat2D = iMatrix,\n) => multiplyTransformMatrices(invertTransform(to), from);\n\n/**\n * Sends a point from the source coordinate plane to the destination coordinate plane.\\\n * From the canvas/viewer's perspective the point remains unchanged.\n *\n * @example Send point from canvas plane to group plane\n * var obj = new Rect({ left: 20, top: 20, width: 60, height: 60, strokeWidth: 0 });\n * var group = new Group([obj], { strokeWidth: 0 });\n * var sentPoint1 = sendPointToPlane(new Point(50, 50), undefined, group.calcTransformMatrix());\n * var sentPoint2 = sendPointToPlane(new Point(50, 50), iMatrix, group.calcTransformMatrix());\n * console.log(sentPoint1, sentPoint2) // both points print (0,0) which is the center of group\n *\n * @param {Point} point\n * @param {TMat2D} [from] plane matrix containing object. Passing `undefined` is equivalent to passing the identity matrix, which means `point` exists in the canvas coordinate plane.\n * @param {TMat2D} [to] destination plane matrix to contain object. Passing `undefined` means `point` should be sent to the canvas coordinate plane.\n * @returns {Point} transformed point\n */\nexport const sendPointToPlane = (\n point: Point,\n from: TMat2D = iMatrix,\n to: TMat2D = iMatrix,\n): Point => point.transform(calcPlaneChangeMatrix(from, to));\n\n/**\n * See {@link sendPointToPlane}\n */\nexport const sendVectorToPlane = (\n point: Point,\n from: TMat2D = iMatrix,\n to: TMat2D = iMatrix,\n): Point => point.transform(calcPlaneChangeMatrix(from, to), true);\n\n/**\n *\n * A util that abstracts applying transform to objects.\\\n * Sends `object` to the destination coordinate plane by applying the relevant transformations.\\\n * Changes the space/plane where `object` is drawn.\\\n * From the canvas/viewer's perspective `object` remains unchanged.\n *\n * @example Move clip path from one object to another while preserving it's appearance as viewed by canvas/viewer\n * let obj, obj2;\n * let clipPath = new Circle({ radius: 50 });\n * obj.clipPath = clipPath;\n * // render\n * sendObjectToPlane(clipPath, obj.calcTransformMatrix(), obj2.calcTransformMatrix());\n * obj.clipPath = undefined;\n * obj2.clipPath = clipPath;\n * // render, clipPath now clips obj2 but seems unchanged from the eyes of the viewer\n *\n * @example Clip an object's clip path with an existing object\n * let obj, existingObj;\n * let clipPath = new Circle({ radius: 50 });\n * obj.clipPath = clipPath;\n * let transformTo = multiplyTransformMatrices(obj.calcTransformMatrix(), clipPath.calcTransformMatrix());\n * sendObjectToPlane(existingObj, existingObj.group?.calcTransformMatrix(), transformTo);\n * clipPath.clipPath = existingObj;\n *\n * @param {FabricObject} object\n * @param {Matrix} [from] plane matrix containing object. Passing `undefined` is equivalent to passing the identity matrix, which means `object` is a direct child of canvas.\n * @param {Matrix} [to] destination plane matrix to contain object. Passing `undefined` means `object` should be sent to the canvas coordinate plane.\n * @returns {Matrix} the transform matrix that was applied to `object`\n */\nexport const sendObjectToPlane = (\n object: FabricObject,\n from?: TMat2D,\n to?: TMat2D,\n): TMat2D => {\n const t = calcPlaneChangeMatrix(from, to);\n applyTransformToObject(\n object,\n multiplyTransformMatrices(t, object.calcOwnMatrix()),\n );\n return t;\n};\n","import type {\n ObjectModificationEvents,\n TModificationEvents,\n} from '../EventTypeDefs';\n\nexport const fireEvent = (\n eventName: TModificationEvents,\n options: ObjectModificationEvents[typeof eventName],\n) => {\n const {\n transform: { target },\n } = options;\n target.canvas?.fire(`object:${eventName}`, {\n ...options,\n target,\n });\n target.fire(eventName, options);\n};\n","import type { TOriginX, TOriginY } from '../../typedefs';\n\nconst originOffset = {\n left: -0.5,\n top: -0.5,\n center: 0,\n bottom: 0.5,\n right: 0.5,\n};\n/**\n * Resolves origin value relative to center\n * @private\n * @param {TOriginX | TOriginY} originValue originX / originY\n * @returns number\n */\n\nexport const resolveOrigin = (\n originValue: TOriginX | TOriginY | number,\n): number =>\n typeof originValue === 'string'\n ? originOffset[originValue]\n : originValue - 0.5;\n","import type { XY } from '../../Point';\nimport { Point } from '../../Point';\nimport type { TRadian } from '../../typedefs';\n\nconst unitVectorX = new Point(1, 0);\nconst zero = new Point();\n\n/**\n * Rotates `vector` with `radians`\n * @param {Point} vector The vector to rotate (x and y)\n * @param {Number} radians The radians of the angle for the rotation\n * @return {Point} The new rotated point\n */\nexport const rotateVector = (vector: Point, radians: TRadian) =>\n vector.rotate(radians);\n\n/**\n * Creates a vector from points represented as a point\n *\n * @param {Point} from\n * @param {Point} to\n * @returns {Point} vector\n */\nexport const createVector = (from: XY, to: XY): Point =>\n new Point(to).subtract(from);\n\n/**\n * return the magnitude of a vector\n * @return {number}\n */\nexport const magnitude = (point: Point) => point.distanceFrom(zero);\n\n/**\n * Calculates the angle between 2 vectors\n * @param {Point} a\n * @param {Point} b\n * @returns the angle in radians from `a` to `b`\n */\nexport const calcAngleBetweenVectors = (a: Point, b: Point): TRadian =>\n Math.atan2(crossProduct(a, b), dotProduct(a, b)) as TRadian;\n\n/**\n * Calculates the angle between the x axis and the vector\n * @param {Point} v\n * @returns the angle in radians of `v`\n */\nexport const calcVectorRotation = (v: Point) =>\n calcAngleBetweenVectors(unitVectorX, v);\n\n/**\n * @param {Point} v\n * @returns {Point} vector representing the unit vector pointing to the direction of `v`\n */\nexport const getUnitVector = (v: Point): Point =>\n v.eq(zero) ? v : v.scalarDivide(magnitude(v));\n\n/**\n * @param {Point} v\n * @param {Boolean} [counterClockwise] the direction of the orthogonal vector, defaults to `true`\n * @returns {Point} the unit orthogonal vector\n */\nexport const getOrthonormalVector = (\n v: Point,\n counterClockwise = true,\n): Point =>\n getUnitVector(new Point(-v.y, v.x).scalarMultiply(counterClockwise ? 1 : -1));\n\n/**\n * Cross product of two vectors in 2D\n * @param {Point} a\n * @param {Point} b\n * @returns {number} the magnitude of Z vector\n */\nexport const crossProduct = (a: Point, b: Point): number =>\n a.x * b.y - a.y * b.x;\n\n/**\n * Dot product of two vectors in 2D\n * @param {Point} a\n * @param {Point} b\n * @returns {number}\n */\nexport const dotProduct = (a: Point, b: Point): number => a.x * b.x + a.y * b.y;\n\n/**\n * Checks if the vector is between two others. It is considered\n * to be inside when the vector to be tested is between the\n * initial vector and the final vector (included) in a counterclockwise direction.\n * @param {Point} t vector to be tested\n * @param {Point} a initial vector\n * @param {Point} b final vector\n * @returns {boolean} true if the vector is among the others\n */\nexport const isBetweenVectors = (t: Point, a: Point, b: Point): boolean => {\n if (t.eq(a) || t.eq(b)) return true;\n const AxB = crossProduct(a, b),\n AxT = crossProduct(a, t),\n BxT = crossProduct(b, t);\n return AxB >= 0 ? AxT >= 0 && BxT <= 0 : !(AxT <= 0 && BxT >= 0);\n};\n","import type {\n TPointerEvent,\n Transform,\n TransformAction,\n BasicTransformEvent,\n} from '../EventTypeDefs';\nimport { resolveOrigin } from '../util/misc/resolveOrigin';\nimport { Point } from '../Point';\nimport type { FabricObject } from '../shapes/Object/FabricObject';\nimport type { TOriginX, TOriginY } from '../typedefs';\nimport { degreesToRadians } from '../util/misc/radiansDegreesConversion';\nimport type { Control } from './Control';\nimport { CENTER, quarterPI, twoMathPi } from '../constants';\nimport { calcVectorRotation, createVector } from '../util/misc/vectors';\nimport type { TOCoord } from '../shapes/Object/InteractiveObject';\nimport { sendPointToPlane } from '../util/misc/planeChange';\n\nexport const NOT_ALLOWED_CURSOR = 'not-allowed';\n\n/**\n * @param {Boolean} alreadySelected true if target is already selected\n * @param {String} corner a string representing the corner ml, mr, tl ...\n * @param {Event} e Event object\n * @param {FabricObject} [target] inserted back to help overriding. Unused\n */\nexport const getActionFromCorner = (\n alreadySelected: boolean,\n corner: string | undefined,\n e: TPointerEvent,\n target: FabricObject,\n) => {\n if (!corner || !alreadySelected) {\n return 'drag';\n }\n const control = target.controls[corner];\n return control.getActionName(e, control, target);\n};\n\n/**\n * Checks if transform is centered\n * @param {Object} transform transform data\n * @return {Boolean} true if transform is centered\n */\nexport function isTransformCentered(transform: Transform) {\n return (\n resolveOrigin(transform.originX) === resolveOrigin(CENTER) &&\n resolveOrigin(transform.originY) === resolveOrigin(CENTER)\n );\n}\n\nexport function invertOrigin(origin: TOriginX | TOriginY) {\n return -resolveOrigin(origin) + 0.5;\n}\n\nexport const isLocked = (\n target: FabricObject,\n lockingKey:\n | 'lockMovementX'\n | 'lockMovementY'\n | 'lockRotation'\n | 'lockScalingX'\n | 'lockScalingY'\n | 'lockSkewingX'\n | 'lockSkewingY'\n | 'lockScalingFlip',\n) => target[lockingKey];\n\nexport const commonEventInfo: TransformAction<\n Transform,\n BasicTransformEvent\n> = (eventData, transform, x, y) => {\n return {\n e: eventData,\n transform,\n pointer: new Point(x, y),\n };\n};\n\n/**\n * Combine control position and object angle to find the control direction compared\n * to the object center.\n * @param {FabricObject} fabricObject the fabric object for which we are rendering controls\n * @param {Control} control the control class\n * @return {Number} 0 - 7 a quadrant number\n */\nexport function findCornerQuadrant(\n fabricObject: FabricObject,\n control: Control,\n coord: TOCoord,\n): number {\n const target = coord;\n const center = sendPointToPlane(\n fabricObject.getCenterPoint(),\n fabricObject.canvas!.viewportTransform,\n undefined,\n );\n const angle = calcVectorRotation(createVector(center, target)) + twoMathPi;\n return Math.round((angle % twoMathPi) / quarterPI);\n}\n\n/**\n * @returns the normalized point (rotated relative to center) in local coordinates\n */\nfunction normalizePoint(\n target: FabricObject,\n point: Point,\n originX: TOriginX,\n originY: TOriginY,\n): Point {\n const center = target.getRelativeCenterPoint(),\n p =\n typeof originX !== 'undefined' && typeof originY !== 'undefined'\n ? target.translateToGivenOrigin(\n center,\n CENTER,\n CENTER,\n originX,\n originY,\n )\n : new Point(target.left, target.top),\n p2 = target.angle\n ? point.rotate(-degreesToRadians(target.angle), center)\n : point;\n return p2.subtract(p);\n}\n\n/**\n * Transforms a point to the offset from the given origin\n * @param {Object} transform\n * @param {String} originX\n * @param {String} originY\n * @param {number} x\n * @param {number} y\n * @return {Fabric.Point} the normalized point\n */\nexport function getLocalPoint(\n { target, corner }: Transform,\n originX: TOriginX,\n originY: TOriginY,\n x: number,\n y: number,\n) {\n const control = target.controls[corner],\n zoom = target.canvas?.getZoom() || 1,\n padding = target.padding / zoom,\n localPoint = normalizePoint(target, new Point(x, y), originX, originY);\n if (localPoint.x >= padding) {\n localPoint.x -= padding;\n }\n if (localPoint.x <= -padding) {\n localPoint.x += padding;\n }\n if (localPoint.y >= padding) {\n localPoint.y -= padding;\n }\n if (localPoint.y <= padding) {\n localPoint.y += padding;\n }\n localPoint.x -= control.offsetX;\n localPoint.y -= control.offsetY;\n return localPoint;\n}\n","import type { TransformActionHandler } from '../EventTypeDefs';\nimport { LEFT, TOP, MOVING } from '../constants';\nimport { fireEvent } from './fireEvent';\nimport { commonEventInfo, isLocked } from './util';\n\n/**\n * Action handler\n * @private\n * @param {Event} eventData javascript event that is doing the transform\n * @param {Object} transform javascript object containing a series of information around the current transform\n * @param {number} x current mouse x position, canvas normalized\n * @param {number} y current mouse y position, canvas normalized\n * @return {Boolean} true if the translation occurred\n */\nexport const dragHandler: TransformActionHandler = (\n eventData,\n transform,\n x,\n y,\n) => {\n const { target, offsetX, offsetY } = transform,\n newLeft = x - offsetX,\n newTop = y - offsetY,\n moveX = !isLocked(target, 'lockMovementX') && target.left !== newLeft,\n moveY = !isLocked(target, 'lockMovementY') && target.top !== newTop;\n moveX && target.set(LEFT, newLeft);\n moveY && target.set(TOP, newTop);\n if (moveX || moveY) {\n fireEvent(MOVING, commonEventInfo(eventData, transform, x, y));\n }\n return moveX || moveY;\n};\n","/**\n * Map of the 148 color names with HEX code\n * @see: https://www.w3.org/TR/css3-color/#svg-color\n */\nexport const ColorNameMap = {\n aliceblue: '#F0F8FF',\n antiquewhite: '#FAEBD7',\n aqua: '#0FF',\n aquamarine: '#7FFFD4',\n azure: '#F0FFFF',\n beige: '#F5F5DC',\n bisque: '#FFE4C4',\n black: '#000',\n blanchedalmond: '#FFEBCD',\n blue: '#00F',\n blueviolet: '#8A2BE2',\n brown: '#A52A2A',\n burlywood: '#DEB887',\n cadetblue: '#5F9EA0',\n chartreuse: '#7FFF00',\n chocolate: '#D2691E',\n coral: '#FF7F50',\n cornflowerblue: '#6495ED',\n cornsilk: '#FFF8DC',\n crimson: '#DC143C',\n cyan: '#0FF',\n darkblue: '#00008B',\n darkcyan: '#008B8B',\n darkgoldenrod: '#B8860B',\n darkgray: '#A9A9A9',\n darkgrey: '#A9A9A9',\n darkgreen: '#006400',\n darkkhaki: '#BDB76B',\n darkmagenta: '#8B008B',\n darkolivegreen: '#556B2F',\n darkorange: '#FF8C00',\n darkorchid: '#9932CC',\n darkred: '#8B0000',\n darksalmon: '#E9967A',\n darkseagreen: '#8FBC8F',\n darkslateblue: '#483D8B',\n darkslategray: '#2F4F4F',\n darkslategrey: '#2F4F4F',\n darkturquoise: '#00CED1',\n darkviolet: '#9400D3',\n deeppink: '#FF1493',\n deepskyblue: '#00BFFF',\n dimgray: '#696969',\n dimgrey: '#696969',\n dodgerblue: '#1E90FF',\n firebrick: '#B22222',\n floralwhite: '#FFFAF0',\n forestgreen: '#228B22',\n fuchsia: '#F0F',\n gainsboro: '#DCDCDC',\n ghostwhite: '#F8F8FF',\n gold: '#FFD700',\n goldenrod: '#DAA520',\n gray: '#808080',\n grey: '#808080',\n green: '#008000',\n greenyellow: '#ADFF2F',\n honeydew: '#F0FFF0',\n hotpink: '#FF69B4',\n indianred: '#CD5C5C',\n indigo: '#4B0082',\n ivory: '#FFFFF0',\n khaki: '#F0E68C',\n lavender: '#E6E6FA',\n lavenderblush: '#FFF0F5',\n lawngreen: '#7CFC00',\n lemonchiffon: '#FFFACD',\n lightblue: '#ADD8E6',\n lightcoral: '#F08080',\n lightcyan: '#E0FFFF',\n lightgoldenrodyellow: '#FAFAD2',\n lightgray: '#D3D3D3',\n lightgrey: '#D3D3D3',\n lightgreen: '#90EE90',\n lightpink: '#FFB6C1',\n lightsalmon: '#FFA07A',\n lightseagreen: '#20B2AA',\n lightskyblue: '#87CEFA',\n lightslategray: '#789',\n lightslategrey: '#789',\n lightsteelblue: '#B0C4DE',\n lightyellow: '#FFFFE0',\n lime: '#0F0',\n limegreen: '#32CD32',\n linen: '#FAF0E6',\n magenta: '#F0F',\n maroon: '#800000',\n mediumaquamarine: '#66CDAA',\n mediumblue: '#0000CD',\n mediumorchid: '#BA55D3',\n mediumpurple: '#9370DB',\n mediumseagreen: '#3CB371',\n mediumslateblue: '#7B68EE',\n mediumspringgreen: '#00FA9A',\n mediumturquoise: '#48D1CC',\n mediumvioletred: '#C71585',\n midnightblue: '#191970',\n mintcream: '#F5FFFA',\n mistyrose: '#FFE4E1',\n moccasin: '#FFE4B5',\n navajowhite: '#FFDEAD',\n navy: '#000080',\n oldlace: '#FDF5E6',\n olive: '#808000',\n olivedrab: '#6B8E23',\n orange: '#FFA500',\n orangered: '#FF4500',\n orchid: '#DA70D6',\n palegoldenrod: '#EEE8AA',\n palegreen: '#98FB98',\n paleturquoise: '#AFEEEE',\n palevioletred: '#DB7093',\n papayawhip: '#FFEFD5',\n peachpuff: '#FFDAB9',\n peru: '#CD853F',\n pink: '#FFC0CB',\n plum: '#DDA0DD',\n powderblue: '#B0E0E6',\n purple: '#800080',\n rebeccapurple: '#639',\n red: '#F00',\n rosybrown: '#BC8F8F',\n royalblue: '#4169E1',\n saddlebrown: '#8B4513',\n salmon: '#FA8072',\n sandybrown: '#F4A460',\n seagreen: '#2E8B57',\n seashell: '#FFF5EE',\n sienna: '#A0522D',\n silver: '#C0C0C0',\n skyblue: '#87CEEB',\n slateblue: '#6A5ACD',\n slategray: '#708090',\n slategrey: '#708090',\n snow: '#FFFAFA',\n springgreen: '#00FF7F',\n steelblue: '#4682B4',\n tan: '#D2B48C',\n teal: '#008080',\n thistle: '#D8BFD8',\n tomato: '#FF6347',\n turquoise: '#40E0D0',\n violet: '#EE82EE',\n wheat: '#F5DEB3',\n white: '#FFF',\n whitesmoke: '#F5F5F5',\n yellow: '#FF0',\n yellowgreen: '#9ACD32',\n};\n","/**\n * Regex matching color in RGB or RGBA formats (ex: `rgb(0, 0, 0)`, `rgba(255, 100, 10, 0.5)`, `rgba( 255 , 100 , 10 , 0.5 )`, `rgb(1,1,1)`, `rgba(100%, 60%, 10%, 0.5)`)\n * Also matching rgba(r g b / a) as per new specs\n * https://developer.mozilla.org/en-US/docs/Web/CSS/color_value/rgb\n * Formal syntax at the time of writing:\n * =\n * rgb( [ | none ]{3} [ / [ | none ] ]? ) |\n * rgb( [ | none ]{3} [ / [ | none ] ]? )\n * = | \n *\n * For learners this is how you can read this regex\n * Regular expression for matching an rgba or rgb CSS color value\n *\n * /^ # Beginning of the string\n * rgba? # \"rgb\" or \"rgba\"\n * \\(\\s* # Opening parenthesis and optional whitespace\n * (\\d{0,3} # 0 to three digits R channel\n * (?:\\.\\d+)? # Optional decimal with one or more digits\n * ) # End of capturing group for the first color component\n * %? # Optional percent sign after the first color component\n * \\s* # Optional whitespace\n * [\\s|,] # Separator between color components can be a space or comma\n * \\s* # Optional whitespace\n * (\\d{0,3} # 0 to three digits G channel\n * (?:\\.\\d+)? # Optional decimal with one or more digits\n * ) # End of capturing group for the second color component\n * %? # Optional percent sign after the second color component\n * \\s* # Optional whitespace\n * [\\s|,] # Separator between color components can be a space or comma\n * \\s* # Optional whitespace\n * (\\d{0,3} # 0 to three digits B channel\n * (?:\\.\\d+)? # Optional decimal with one or more digits\n * ) # End of capturing group for the third color component\n * %? # Optional percent sign after the third color component\n * \\s* # Optional whitespace\n * (?: # Beginning of non-capturing group for alpha value\n * \\s* # Optional whitespace\n * [,/] # Comma or slash separator for alpha value\n * \\s* # Optional whitespace\n * (\\d{0,3} # Zero to three digits\n * (?:\\.\\d+)? # Optional decimal with one or more digits\n * ) # End of capturing group for alpha value\n * %? # Optional percent sign after alpha value\n * \\s* # Optional whitespace\n * )? # End of non-capturing group for alpha value (optional)\n * \\) # Closing parenthesis\n * $ # End of the string\n *\n * The alpha channel can be in the format 0.4 .7 or 1 or 73%\n *\n * WARNING this regex doesn't fail on off spec colors. it matches everything that could be a color.\n * So the spec does not allow for `rgba(30 , 45% 35, 49%)` but this will work anyways for us\n */\nexport const reRGBa = () =>\n /^rgba?\\(\\s*(\\d{0,3}(?:\\.\\d+)?%?)\\s*[\\s|,]\\s*(\\d{0,3}(?:\\.\\d+)?%?)\\s*[\\s|,]\\s*(\\d{0,3}(?:\\.\\d+)?%?)\\s*(?:\\s*[,/]\\s*(\\d{0,3}(?:\\.\\d+)?%?)\\s*)?\\)$/i;\n\n/**\n * Regex matching color in HSL or HSLA formats (ex: hsl(0, 0, 0), rgba(255, 100, 10, 0.5), rgba( 255 , 100 , 10 , 0.5 ), rgb(1,1,1), rgba(100%, 60%, 10%, 0.5))\n * Also matching rgba(r g b / a) as per new specs\n * https://developer.mozilla.org/en-US/docs/Web/CSS/color_value/hsl\n * Formal syntax at the time of writing:\n * =\n * hsl( [ | none ] [ | none ] [ | none ] [ / [ | none ] ]? )\n *\n * =\n * |\n * \n *\n * =\n * |\n * \n *\n * For learners this is how you can read this regex\n * Regular expression for matching an hsla or hsl CSS color value\n *\n * /^hsla?\\( // Matches the beginning of the string and the opening parenthesis of \"hsl\" or \"hsla\"\n * \\s* // Matches any whitespace characters (space, tab, etc.) zero or more times\n * (\\d{0,3} // Hue: 0 to three digits - start capture in a group\n * (?:\\.\\d+)? // Hue: Optional (non capture group) decimal with one or more digits.\n * (?:deg|turn|rad)? // Hue: Optionally include suffix deg or turn or rad\n * ) // Hue: End capture group\n * \\s* // Matches any whitespace characters zero or more times\n * [\\s|,] // Matches a space, tab or comma\n * \\s* // Matches any whitespace characters zero or more times\n * (\\d{0,3} // Saturation: 0 to three digits - start capture in a group\n * (?:\\.\\d+)? // Saturation: Optional decimal with one or more digits in a non-capturing group\n * %?) // Saturation: match optional % character and end capture group\n * \\s* // Matches any whitespace characters zero or more times\n * [\\s|,] // Matches a space, tab or comma\n * \\s* // Matches any whitespace characters zero or more times\n * (\\d{0,3} // Lightness: 0 to three digits - start capture in a group\n * (?:\\.\\d+)? // Lightness: Optional decimal with one or more digits in a non-capturing group\n * %?) // Lightness: match % character and end capture group\n * \\s* // Matches any whitespace characters zero or more times\n * (?: // Alpha: Begins a non-capturing group for the alpha value\n * \\s* // Matches any whitespace characters zero or more times\n * [,/] // Matches a comma or forward slash\n * \\s* // Matches any whitespace characters zero or more times\n * (\\d*(?:\\.\\d+)?%?) // Matches zero or more digits, optionally followed by a decimal point and one or more digits, followed by an optional percentage sign and captures it in a group\n * \\s* // Matches any whitespace characters zero or more times\n * )? // Makes the alpha value group optional\n * \\) // Matches the closing parenthesis\n * $/i // Matches the end of the string and sets the regular expression to case-insensitive mode\n *\n * WARNING this regex doesn't fail on off spec colors. It matches everything that could be a color.\n * So the spec does not allow `hsl(30 , 45% 35, 49%)` but this will work anyways for us.\n */\nexport const reHSLa = () =>\n /^hsla?\\(\\s*([+-]?\\d{0,3}(?:\\.\\d+)?(?:deg|turn|rad)?)\\s*[\\s|,]\\s*(\\d{0,3}(?:\\.\\d+)?%?)\\s*[\\s|,]\\s*(\\d{0,3}(?:\\.\\d+)?%?)\\s*(?:\\s*[,/]\\s*(\\d*(?:\\.\\d+)?%?)\\s*)?\\)$/i;\n\n/**\n * Regex matching color in HEX format (ex: #FF5544CC, #FF5555, 010155, aff)\n */\nexport const reHex = () => /^#?(([0-9a-f]){3,4}|([0-9a-f]{2}){3,4})$/i;\n","import type { TRGBAColorSource } from './typedefs';\n\n/**\n * @param {Number} p\n * @param {Number} q\n * @param {Number} t\n * @return {Number}\n */\nexport const hue2rgb = (p: number, q: number, t: number): number => {\n if (t < 0) {\n t += 1;\n }\n if (t > 1) {\n t -= 1;\n }\n if (t < 1 / 6) {\n return p + (q - p) * 6 * t;\n }\n if (t < 1 / 2) {\n return q;\n }\n if (t < 2 / 3) {\n return p + (q - p) * (2 / 3 - t) * 6;\n }\n return p;\n};\n\n/**\n * Adapted from {@link https://gist.github.com/mjackson/5311256 https://gist.github.com/mjackson}\n * @param {Number} r Red color value\n * @param {Number} g Green color value\n * @param {Number} b Blue color value\n * @param {Number} a Alpha color value pass through\n * @return {TRGBColorSource} Hsl color\n */\nexport const rgb2Hsl = (\n r: number,\n g: number,\n b: number,\n a: number,\n): TRGBAColorSource => {\n r /= 255;\n g /= 255;\n b /= 255;\n const maxValue = Math.max(r, g, b),\n minValue = Math.min(r, g, b);\n\n let h!: number, s: number;\n const l = (maxValue + minValue) / 2;\n\n if (maxValue === minValue) {\n h = s = 0; // achromatic\n } else {\n const d = maxValue - minValue;\n s = l > 0.5 ? d / (2 - maxValue - minValue) : d / (maxValue + minValue);\n switch (maxValue) {\n case r:\n h = (g - b) / d + (g < b ? 6 : 0);\n break;\n case g:\n h = (b - r) / d + 2;\n break;\n case b:\n h = (r - g) / d + 4;\n break;\n }\n h /= 6;\n }\n\n return [Math.round(h * 360), Math.round(s * 100), Math.round(l * 100), a];\n};\n\nexport const fromAlphaToFloat = (value = '1') =>\n parseFloat(value) / (value.endsWith('%') ? 100 : 1);\n\n/**\n * Convert a value in the inclusive range [0, 255] to hex\n */\nexport const hexify = (value: number) =>\n Math.min(Math.round(value), 255).toString(16).toUpperCase().padStart(2, '0');\n\n/**\n * Calculate the grey average value for rgb and pass through alpha\n */\nexport const greyAverage = ([\n r,\n g,\n b,\n a = 1,\n]: TRGBAColorSource): TRGBAColorSource => {\n const avg = Math.round(r * 0.3 + g * 0.59 + b * 0.11);\n return [avg, avg, avg, a];\n};\n","import { radiansToDegrees } from '../util/misc/radiansDegreesConversion';\nimport { ColorNameMap } from './color_map';\nimport { reHSLa, reHex, reRGBa } from './constants';\nimport type { TRGBAColorSource, TColorArg } from './typedefs';\nimport {\n hue2rgb,\n hexify,\n rgb2Hsl,\n fromAlphaToFloat,\n greyAverage,\n} from './util';\n\n/**\n * @class Color common color operations\n * @see {@link http://fabric5.fabricjs.com/fabric-intro-part-2#colors colors}\n */\nexport class Color {\n declare private _source: TRGBAColorSource;\n isUnrecognised = false;\n\n /**\n *\n * @param {string} [color] optional in hex or rgb(a) or hsl format or from known color list\n */\n constructor(color?: TColorArg) {\n if (!color) {\n // we default to black as canvas does\n this.setSource([0, 0, 0, 1]);\n } else if (color instanceof Color) {\n this.setSource([...color._source]);\n } else if (Array.isArray(color)) {\n const [r, g, b, a = 1] = color;\n this.setSource([r, g, b, a]);\n } else {\n this.setSource(this._tryParsingColor(color));\n }\n }\n\n /**\n * @private\n * @param {string} [color] Color value to parse\n * @returns {TRGBAColorSource}\n */\n protected _tryParsingColor(color: string) {\n color = color.toLowerCase();\n if (color in ColorNameMap) {\n color = ColorNameMap[color as keyof typeof ColorNameMap];\n }\n return color === 'transparent'\n ? ([255, 255, 255, 0] as TRGBAColorSource)\n : Color.sourceFromHex(color) ||\n Color.sourceFromRgb(color) ||\n Color.sourceFromHsl(color) ||\n // color is not recognized\n // we default to black as canvas does\n // eslint-disable-next-line no-constant-binary-expression\n ((this.isUnrecognised = true) && ([0, 0, 0, 1] as TRGBAColorSource));\n }\n\n /**\n * Returns source of this color (where source is an array representation; ex: [200, 200, 100, 1])\n * @return {TRGBAColorSource}\n */\n getSource() {\n return this._source;\n }\n\n /**\n * Sets source of this color (where source is an array representation; ex: [200, 200, 100, 1])\n * @param {TRGBAColorSource} source\n */\n setSource(source: TRGBAColorSource) {\n this._source = source;\n }\n\n /**\n * Returns color representation in RGB format\n * @return {String} ex: rgb(0-255,0-255,0-255)\n */\n toRgb() {\n const [r, g, b] = this.getSource();\n return `rgb(${r},${g},${b})`;\n }\n\n /**\n * Returns color representation in RGBA format\n * @return {String} ex: rgba(0-255,0-255,0-255,0-1)\n */\n toRgba() {\n return `rgba(${this.getSource().join(',')})`;\n }\n\n /**\n * Returns color representation in HSL format\n * @return {String} ex: hsl(0-360,0%-100%,0%-100%)\n */\n toHsl() {\n const [h, s, l] = rgb2Hsl(...this.getSource());\n return `hsl(${h},${s}%,${l}%)`;\n }\n\n /**\n * Returns color representation in HSLA format\n * @return {String} ex: hsla(0-360,0%-100%,0%-100%,0-1)\n */\n toHsla() {\n const [h, s, l, a] = rgb2Hsl(...this.getSource());\n return `hsla(${h},${s}%,${l}%,${a})`;\n }\n\n /**\n * Returns color representation in HEX format\n * @return {String} ex: FF5555\n */\n toHex() {\n const fullHex = this.toHexa();\n return fullHex.slice(0, 6);\n }\n\n /**\n * Returns color representation in HEXA format\n * @return {String} ex: FF5555CC\n */\n toHexa() {\n const [r, g, b, a] = this.getSource();\n return `${hexify(r)}${hexify(g)}${hexify(b)}${hexify(Math.round(a * 255))}`;\n }\n\n /**\n * Gets value of alpha channel for this color\n * @return {Number} 0-1\n */\n getAlpha() {\n return this.getSource()[3];\n }\n\n /**\n * Sets value of alpha channel for this color\n * @param {Number} alpha Alpha value 0-1\n * @return {Color} thisArg\n */\n setAlpha(alpha: number) {\n this._source[3] = alpha;\n return this;\n }\n\n /**\n * Transforms color to its grayscale representation\n * @return {Color} thisArg\n */\n toGrayscale() {\n this.setSource(greyAverage(this.getSource()));\n return this;\n }\n\n /**\n * Transforms color to its black and white representation\n * @param {Number} threshold\n * @return {Color} thisArg\n */\n toBlackWhite(threshold: number) {\n const [average, , , a] = greyAverage(this.getSource()),\n bOrW = average < (threshold || 127) ? 0 : 255;\n this.setSource([bOrW, bOrW, bOrW, a]);\n return this;\n }\n\n /**\n * Overlays color with another color\n * @param {String|Color} otherColor\n * @return {Color} thisArg\n */\n overlayWith(otherColor: string | Color) {\n if (!(otherColor instanceof Color)) {\n otherColor = new Color(otherColor);\n }\n\n const source = this.getSource(),\n otherAlpha = 0.5,\n otherSource = otherColor.getSource(),\n [R, G, B] = source.map((value, index) =>\n Math.round(value * (1 - otherAlpha) + otherSource[index] * otherAlpha),\n );\n\n this.setSource([R, G, B, source[3]]);\n return this;\n }\n\n /**\n * Returns new color object, when given a color in RGB format\n * @param {String} color Color value ex: rgb(0-255,0-255,0-255)\n * @return {Color}\n */\n static fromRgb(color: string): Color {\n return Color.fromRgba(color);\n }\n\n /**\n * Returns new color object, when given a color in RGBA format\n * @param {String} color\n * @return {Color}\n */\n static fromRgba(color: string): Color {\n return new Color(Color.sourceFromRgb(color));\n }\n\n /**\n * Returns array representation (ex: [100, 100, 200, 1]) of a color that's in RGB or RGBA format\n * @param {String} color Color value ex: rgb(0-255,0-255,0-255), rgb(0%-100%,0%-100%,0%-100%)\n * @return {TRGBAColorSource | undefined} source\n */\n static sourceFromRgb(color: string): TRGBAColorSource | undefined {\n const match = color.match(reRGBa());\n if (match) {\n const [r, g, b] = match.slice(1, 4).map((value) => {\n const parsedValue = parseFloat(value);\n return value.endsWith('%')\n ? Math.round(parsedValue * 2.55)\n : parsedValue;\n });\n return [r, g, b, fromAlphaToFloat(match[4])];\n }\n }\n\n /**\n * Returns new color object, when given a color in HSL format\n * @param {String} color Color value ex: hsl(0-260,0%-100%,0%-100%)\n * @return {Color}\n */\n static fromHsl(color: string): Color {\n return Color.fromHsla(color);\n }\n\n /**\n * Returns new color object, when given a color in HSLA format\n * @param {String} color\n * @return {Color}\n */\n static fromHsla(color: string): Color {\n return new Color(Color.sourceFromHsl(color));\n }\n\n /**\n * Returns array representation (ex: [100, 100, 200, 1]) of a color that's in HSL or HSLA format.\n * Adapted from https://github.com/mjijackson\n * @param {String} color Color value ex: hsl(0-360,0%-100%,0%-100%) or hsla(0-360,0%-100%,0%-100%, 0-1)\n * @return {TRGBAColorSource | undefined} source\n * @see http://http://www.w3.org/TR/css3-color/#hsl-color\n */\n static sourceFromHsl(color: string): TRGBAColorSource | undefined {\n const match = color.match(reHSLa());\n if (!match) {\n return;\n }\n const match1degrees = Color.parseAngletoDegrees(match[1]);\n\n const h = (((match1degrees % 360) + 360) % 360) / 360,\n s = parseFloat(match[2]) / 100,\n l = parseFloat(match[3]) / 100;\n let r: number, g: number, b: number;\n\n if (s === 0) {\n r = g = b = l;\n } else {\n const q = l <= 0.5 ? l * (s + 1) : l + s - l * s,\n p = l * 2 - q;\n\n r = hue2rgb(p, q, h + 1 / 3);\n g = hue2rgb(p, q, h);\n b = hue2rgb(p, q, h - 1 / 3);\n }\n\n return [\n Math.round(r * 255),\n Math.round(g * 255),\n Math.round(b * 255),\n fromAlphaToFloat(match[4]),\n ];\n }\n\n /**\n * Returns new color object, when given a color in HEX format\n * @param {String} color Color value ex: FF5555\n * @return {Color}\n */\n static fromHex(color: string): Color {\n return new Color(Color.sourceFromHex(color));\n }\n\n /**\n * Returns array representation (ex: [100, 100, 200, 1]) of a color that's in HEX format\n * @param {String} color ex: FF5555 or FF5544CC (RGBa)\n * @return {TRGBAColorSource | undefined} source\n */\n static sourceFromHex(color: string): TRGBAColorSource | undefined {\n if (color.match(reHex())) {\n const value = color.slice(color.indexOf('#') + 1),\n isShortNotation = value.length <= 4;\n let expandedValue: string[];\n if (isShortNotation) {\n expandedValue = value.split('').map((hex) => hex + hex);\n } else {\n expandedValue = value.match(/.{2}/g)!;\n }\n const [r, g, b, a = 255] = expandedValue.map((hexCouple) =>\n parseInt(hexCouple, 16),\n );\n return [r, g, b, a / 255];\n }\n }\n\n /**\n * Converts a string that could be any angle notation (50deg, 0.5turn, 2rad)\n * into degrees without the 'deg' suffix\n * @param {String} value ex: 0deg, 0.5turn, 2rad\n * @return {Number} number in degrees or NaN if inputs are invalid\n */\n static parseAngletoDegrees(value: string): number {\n const lowercase = value.toLowerCase();\n const numeric = parseFloat(lowercase);\n\n if (lowercase.includes('rad')) {\n return radiansToDegrees(numeric);\n }\n\n if (lowercase.includes('turn')) {\n return numeric * 360;\n }\n\n // Value is probably just a number already in degrees eg '50'\n return numeric;\n }\n}\n","import { Color } from '../../color/Color';\nimport { config } from '../../config';\nimport { DEFAULT_SVG_FONT_SIZE, FILL, NONE } from '../../constants';\nimport type { TBBox, SVGElementName, SupportedSVGUnit } from '../../typedefs';\nimport { toFixed } from './toFixed';\n\n/**\n * Returns array of attributes for given svg that fabric parses\n * @param {SVGElementName} type Type of svg element (eg. 'circle')\n * @return {Array} string names of supported attributes\n */\nexport const getSvgAttributes = (type: SVGElementName) => {\n const commonAttributes = ['instantiated_by_use', 'style', 'id', 'class'];\n switch (type) {\n case 'linearGradient':\n return commonAttributes.concat([\n 'x1',\n 'y1',\n 'x2',\n 'y2',\n 'gradientUnits',\n 'gradientTransform',\n ]);\n case 'radialGradient':\n return commonAttributes.concat([\n 'gradientUnits',\n 'gradientTransform',\n 'cx',\n 'cy',\n 'r',\n 'fx',\n 'fy',\n 'fr',\n ]);\n case 'stop':\n return commonAttributes.concat(['offset', 'stop-color', 'stop-opacity']);\n }\n return commonAttributes;\n};\n\n/**\n * Converts from attribute value to pixel value if applicable.\n * Returns converted pixels or original value not converted.\n * @param {string} value number to operate on\n * @param {number} fontSize\n * @return {number}\n */\nexport const parseUnit = (value: string, fontSize = DEFAULT_SVG_FONT_SIZE) => {\n const unit = /\\D{0,2}$/.exec(value),\n number = parseFloat(value);\n const dpi = config.DPI;\n switch (unit?.[0] as SupportedSVGUnit) {\n case 'mm':\n return (number * dpi) / 25.4;\n\n case 'cm':\n return (number * dpi) / 2.54;\n\n case 'in':\n return number * dpi;\n\n case 'pt':\n return (number * dpi) / 72; // or * 4 / 3\n\n case 'pc':\n return ((number * dpi) / 72) * 12; // or * 16\n\n case 'em':\n return number * fontSize;\n\n default:\n return number;\n }\n};\n\nexport type MeetOrSlice = 'meet' | 'slice';\n\nexport type MinMidMax = 'Min' | 'Mid' | 'Max' | 'none';\n\nexport type TPreserveArParsed = {\n meetOrSlice: MeetOrSlice;\n alignX: MinMidMax;\n alignY: MinMidMax;\n};\n\n// align can be either none or undefined or a combination of mid/max\nconst parseAlign = (align: string): MinMidMax[] => {\n //divide align in alignX and alignY\n if (align && align !== NONE) {\n return [align.slice(1, 4) as MinMidMax, align.slice(5, 8) as MinMidMax];\n } else if (align === NONE) {\n return [align, align];\n }\n return ['Mid', 'Mid'];\n};\n\n/**\n * Parse preserveAspectRatio attribute from element\n * https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/preserveAspectRatio\n * @param {string} attribute to be parsed\n * @return {Object} an object containing align and meetOrSlice attribute\n */\nexport const parsePreserveAspectRatioAttribute = (\n attribute: string,\n): TPreserveArParsed => {\n const [firstPart, secondPart] = attribute.trim().split(' ') as [\n MinMidMax,\n MeetOrSlice | undefined,\n ];\n const [alignX, alignY] = parseAlign(firstPart);\n return {\n meetOrSlice: secondPart || 'meet',\n alignX,\n alignY,\n };\n};\n\n/**\n * Adobe Illustrator (at least CS5) is unable to render rgba()-based fill values\n * we work around it by \"moving\" alpha channel into opacity attribute and setting fill's alpha to 1\n * @param prop\n * @param value\n * @param {boolean} inlineStyle The default is inline style, the separator used is \":\", The other is \"=\"\n * @returns\n */\nexport const colorPropToSVG = (\n prop: string,\n value?: any,\n inlineStyle = true,\n) => {\n let colorValue;\n let opacityValue;\n if (!value) {\n colorValue = 'none';\n } else if (value.toLive) {\n colorValue = `url(#SVGID_${value.id})`;\n } else {\n const color = new Color(value),\n opacity = color.getAlpha();\n\n colorValue = color.toRgb();\n if (opacity !== 1) {\n opacityValue = opacity.toString();\n }\n }\n if (inlineStyle) {\n return `${prop}: ${colorValue}; ${\n opacityValue ? `${prop}-opacity: ${opacityValue}; ` : ''\n }`;\n } else {\n return `${prop}=\"${colorValue}\" ${\n opacityValue ? `${prop}-opacity=\"${opacityValue}\" ` : ''\n }`;\n }\n};\n\nexport const createSVGRect = (\n color: string,\n { left, top, width, height }: TBBox,\n precision = config.NUM_FRACTION_DIGITS,\n) => {\n const svgColor = colorPropToSVG(FILL, color, false);\n const [x, y, w, h] = [left, top, width, height].map((value) =>\n toFixed(value, precision),\n );\n return ``;\n};\n","import type { TSVGReviver } from '../../typedefs';\nimport { uid } from '../../util/internals/uid';\nimport { colorPropToSVG } from '../../util/misc/svgParsing';\nimport { FILL, NONE, STROKE } from '../../constants';\nimport type { FabricObject } from './FabricObject';\nimport { isFiller } from '../../util/typeAssertions';\nimport { matrixToSVG } from '../../util/misc/svgExport';\n\nexport class FabricObjectSVGExportMixin {\n /**\n * When an object is being exported as SVG as a clippath, a reference inside the SVG is needed.\n * This reference is a UID in the fabric namespace and is temporary stored here.\n * @type {String}\n */\n declare clipPathId?: string;\n\n /**\n * Returns styles-string for svg-export\n * @param {Boolean} skipShadow a boolean to skip shadow filter output\n * @return {String}\n */\n getSvgStyles(\n this: FabricObjectSVGExportMixin & FabricObject,\n skipShadow?: boolean,\n ) {\n const fillRule = this.fillRule ? this.fillRule : 'nonzero',\n strokeWidth = this.strokeWidth ? this.strokeWidth : '0',\n strokeDashArray = this.strokeDashArray\n ? this.strokeDashArray.join(' ')\n : NONE,\n strokeDashOffset = this.strokeDashOffset ? this.strokeDashOffset : '0',\n strokeLineCap = this.strokeLineCap ? this.strokeLineCap : 'butt',\n strokeLineJoin = this.strokeLineJoin ? this.strokeLineJoin : 'miter',\n strokeMiterLimit = this.strokeMiterLimit ? this.strokeMiterLimit : '4',\n opacity = typeof this.opacity !== 'undefined' ? this.opacity : '1',\n visibility = this.visible ? '' : ' visibility: hidden;',\n filter = skipShadow ? '' : this.getSvgFilter(),\n fill = colorPropToSVG(FILL, this.fill),\n stroke = colorPropToSVG(STROKE, this.stroke);\n\n return [\n stroke,\n 'stroke-width: ',\n strokeWidth,\n '; ',\n 'stroke-dasharray: ',\n strokeDashArray,\n '; ',\n 'stroke-linecap: ',\n strokeLineCap,\n '; ',\n 'stroke-dashoffset: ',\n strokeDashOffset,\n '; ',\n 'stroke-linejoin: ',\n strokeLineJoin,\n '; ',\n 'stroke-miterlimit: ',\n strokeMiterLimit,\n '; ',\n fill,\n 'fill-rule: ',\n fillRule,\n '; ',\n 'opacity: ',\n opacity,\n ';',\n filter,\n visibility,\n ].join('');\n }\n\n /**\n * Returns filter for svg shadow\n * @return {String}\n */\n getSvgFilter(this: FabricObjectSVGExportMixin & FabricObject) {\n return this.shadow ? `filter: url(#SVGID_${this.shadow.id});` : '';\n }\n\n /**\n * Returns id attribute for svg output\n * @return {String}\n */\n getSvgCommons(\n this: FabricObjectSVGExportMixin & FabricObject & { id?: string },\n ) {\n return [\n this.id ? `id=\"${this.id}\" ` : '',\n this.clipPath\n ? `clip-path=\"url(#${\n (this.clipPath as FabricObjectSVGExportMixin & FabricObject)\n .clipPathId\n })\" `\n : '',\n ].join('');\n }\n\n /**\n * Returns transform-string for svg-export\n * @param {Boolean} use the full transform or the single object one.\n * @return {String}\n */\n getSvgTransform(\n this: FabricObjectSVGExportMixin & FabricObject,\n full?: boolean,\n additionalTransform = '',\n ) {\n const transform = full ? this.calcTransformMatrix() : this.calcOwnMatrix(),\n svgTransform = `transform=\"${matrixToSVG(transform)}`;\n return `${svgTransform}${additionalTransform}\" `;\n }\n\n /**\n * Returns svg representation of an instance\n * This function is implemented in each subclass\n * This is just because typescript otherwise cryies all the time\n * @return {Array} an array of strings with the specific svg representation\n * of the instance\n */\n _toSVG(_reviver?: TSVGReviver): string[] {\n return [''];\n }\n\n /**\n * Returns svg representation of an instance\n * @param {TSVGReviver} [reviver] Method for further parsing of svg representation.\n * @return {String} svg representation of an instance\n */\n toSVG(\n this: FabricObjectSVGExportMixin & FabricObject,\n reviver?: TSVGReviver,\n ) {\n return this._createBaseSVGMarkup(this._toSVG(reviver), {\n reviver,\n });\n }\n\n /**\n * Returns svg clipPath representation of an instance\n * @param {TSVGReviver} [reviver] Method for further parsing of svg representation.\n * @return {String} svg representation of an instance\n */\n toClipPathSVG(\n this: FabricObjectSVGExportMixin & FabricObject,\n reviver?: TSVGReviver,\n ) {\n return (\n '\\t' +\n this._createBaseClipPathSVGMarkup(this._toSVG(reviver), {\n reviver,\n })\n );\n }\n\n /**\n * @private\n */\n _createBaseClipPathSVGMarkup(\n this: FabricObjectSVGExportMixin & FabricObject,\n objectMarkup: string[],\n {\n reviver,\n additionalTransform = '',\n }: { reviver?: TSVGReviver; additionalTransform?: string } = {},\n ) {\n const commonPieces = [\n this.getSvgTransform(true, additionalTransform),\n this.getSvgCommons(),\n ].join(''),\n // insert commons in the markup, style and svgCommons\n index = objectMarkup.indexOf('COMMON_PARTS');\n objectMarkup[index] = commonPieces;\n return reviver ? reviver(objectMarkup.join('')) : objectMarkup.join('');\n }\n\n /**\n * @private\n */\n _createBaseSVGMarkup(\n this: FabricObjectSVGExportMixin & FabricObject,\n objectMarkup: string[],\n {\n noStyle,\n reviver,\n withShadow,\n additionalTransform,\n }: {\n noStyle?: boolean;\n reviver?: TSVGReviver;\n withShadow?: boolean;\n additionalTransform?: string;\n } = {},\n ): string {\n const styleInfo = noStyle ? '' : `style=\"${this.getSvgStyles()}\" `,\n shadowInfo = withShadow ? `style=\"${this.getSvgFilter()}\" ` : '',\n clipPath = this.clipPath as FabricObjectSVGExportMixin & FabricObject,\n vectorEffect = this.strokeUniform\n ? 'vector-effect=\"non-scaling-stroke\" '\n : '',\n absoluteClipPath = clipPath && clipPath.absolutePositioned,\n stroke = this.stroke,\n fill = this.fill,\n shadow = this.shadow,\n markup = [],\n // insert commons in the markup, style and svgCommons\n index = objectMarkup.indexOf('COMMON_PARTS');\n let clipPathMarkup;\n if (clipPath) {\n clipPath.clipPathId = `CLIPPATH_${uid()}`;\n clipPathMarkup = `\\n${clipPath.toClipPathSVG(reviver)}\\n`;\n }\n if (absoluteClipPath) {\n markup.push('\\n');\n }\n markup.push(\n '\\n',\n );\n const commonPieces = [\n styleInfo,\n vectorEffect,\n noStyle ? '' : this.addPaintOrder(),\n ' ',\n additionalTransform ? `transform=\"${additionalTransform}\" ` : '',\n ].join('');\n objectMarkup[index] = commonPieces;\n if (isFiller(fill)) {\n markup.push(fill.toSVG(this));\n }\n if (isFiller(stroke)) {\n markup.push(stroke.toSVG(this));\n }\n if (shadow) {\n markup.push(shadow.toSVG(this));\n }\n if (clipPath) {\n markup.push(clipPathMarkup);\n }\n markup.push(objectMarkup.join(''));\n markup.push('\\n');\n absoluteClipPath && markup.push('\\n');\n return reviver ? reviver(markup.join('')) : markup.join('');\n }\n\n addPaintOrder(this: FabricObjectSVGExportMixin & FabricObject) {\n return this.paintFirst !== FILL ? ` paint-order=\"${this.paintFirst}\" ` : '';\n }\n}\n","export function getSvgRegex(arr: string[]) {\n return new RegExp('^(' + arr.join('|') + ')\\\\b', 'i');\n}\n","import { FILL, LEFT, STROKE, reNewline } from '../../constants';\nimport type { TClassProperties } from '../../typedefs';\nimport type { FabricText } from './Text';\n\nexport const TEXT_DECORATION_THICKNESS = 'textDecorationThickness';\n\nconst fontProperties = [\n 'fontSize',\n 'fontWeight',\n 'fontFamily',\n 'fontStyle',\n] as const;\n\nexport const textDecorationProperties = [\n 'underline',\n 'overline',\n 'linethrough',\n] as const;\n\nexport const textLayoutProperties: string[] = [\n ...fontProperties,\n 'lineHeight',\n 'text',\n 'charSpacing',\n 'textAlign',\n 'styles',\n 'path',\n 'pathStartOffset',\n 'pathSide',\n 'pathAlign',\n];\n\nexport const additionalProps = [\n ...textLayoutProperties,\n ...textDecorationProperties,\n 'textBackgroundColor',\n 'direction',\n TEXT_DECORATION_THICKNESS,\n] as const;\n\nexport type StylePropertiesType =\n | 'fill'\n | 'stroke'\n | 'strokeWidth'\n | 'fontSize'\n | 'fontFamily'\n | 'fontWeight'\n | 'fontStyle'\n | 'textBackgroundColor'\n | 'deltaY'\n | 'overline'\n | 'underline'\n | 'linethrough'\n | typeof TEXT_DECORATION_THICKNESS;\n\nexport const styleProperties: Readonly = [\n ...fontProperties,\n ...textDecorationProperties,\n STROKE,\n 'strokeWidth',\n FILL,\n 'deltaY',\n 'textBackgroundColor',\n TEXT_DECORATION_THICKNESS,\n] as const;\n\n// @TODO: Many things here are configuration related and shouldn't be on the class nor prototype\n// regexes, list of properties that are not suppose to change by instances, magic consts.\n// this will be a separated effort\nexport const textDefaultValues: Partial> = {\n _reNewline: reNewline,\n _reSpacesAndTabs: /[ \\t\\r]/g,\n _reSpaceAndTab: /[ \\t\\r]/,\n _reWords: /\\S+/g,\n fontSize: 40,\n fontWeight: 'normal',\n fontFamily: 'Times New Roman',\n underline: false,\n overline: false,\n linethrough: false,\n textAlign: LEFT,\n fontStyle: 'normal',\n lineHeight: 1.16,\n textBackgroundColor: '',\n stroke: null,\n shadow: null,\n path: undefined,\n pathStartOffset: 0,\n pathSide: LEFT,\n pathAlign: 'baseline',\n charSpacing: 0,\n deltaY: 0,\n direction: 'ltr',\n CACHE_FONT_SIZE: 400,\n MIN_TEXT_WIDTH: 2,\n // Text magic numbers\n superscript: {\n size: 0.6, // fontSize factor\n baseline: -0.35, // baseline-shift factor (upwards)\n },\n subscript: {\n size: 0.6, // fontSize factor\n baseline: 0.11, // baseline-shift factor (downwards)\n },\n _fontSizeFraction: 0.222,\n offsets: {\n underline: 0.1,\n linethrough: -0.28167, // added 1/30 to original number\n overline: -0.81333, // added 1/15 to original number\n },\n _fontSizeMult: 1.13,\n [TEXT_DECORATION_THICKNESS]: 66.667, // before implementation was 1/15\n};\n\nexport const JUSTIFY = 'justify';\nexport const JUSTIFY_LEFT = 'justify-left';\nexport const JUSTIFY_RIGHT = 'justify-right';\nexport const JUSTIFY_CENTER = 'justify-center';\n","import { getSvgRegex } from './getSvgRegex';\nimport { LEFT, TOP } from '../constants';\nimport { TEXT_DECORATION_THICKNESS } from '../shapes/Text/constants';\n\n// matches, e.g.: +14.56e-12, etc.\nexport const reNum = String.raw`[-+]?(?:\\d*\\.\\d+|\\d+\\.?)(?:[eE][-+]?\\d+)?`;\nexport const viewportSeparator = String.raw`(?:\\s*,?\\s+|\\s*,\\s*)`;\n\nexport const svgNS = 'http://www.w3.org/2000/svg';\n\nexport const reFontDeclaration = new RegExp(\n '(normal|italic)?\\\\s*(normal|small-caps)?\\\\s*' +\n '(normal|bold|bolder|lighter|100|200|300|400|500|600|700|800|900)?\\\\s*(' +\n reNum +\n '(?:px|cm|mm|em|pt|pc|in)*)(?:\\\\/(normal|' +\n reNum +\n '))?\\\\s+(.*)',\n);\n\nexport const svgValidTagNames = [\n 'path',\n 'circle',\n 'polygon',\n 'polyline',\n 'ellipse',\n 'rect',\n 'line',\n 'image',\n 'text',\n ],\n svgViewBoxElements = ['symbol', 'image', 'marker', 'pattern', 'view', 'svg'],\n svgInvalidAncestors = [\n 'pattern',\n 'defs',\n 'symbol',\n 'metadata',\n 'clipPath',\n 'mask',\n 'desc',\n ],\n svgValidParents = ['symbol', 'g', 'a', 'svg', 'clipPath', 'defs'],\n attributesMap = {\n cx: LEFT,\n x: LEFT,\n r: 'radius',\n cy: TOP,\n y: TOP,\n display: 'visible',\n visibility: 'visible',\n transform: 'transformMatrix',\n 'fill-opacity': 'fillOpacity',\n 'fill-rule': 'fillRule',\n 'font-family': 'fontFamily',\n 'font-size': 'fontSize',\n 'font-style': 'fontStyle',\n 'font-weight': 'fontWeight',\n 'letter-spacing': 'charSpacing',\n 'paint-order': 'paintFirst',\n 'stroke-dasharray': 'strokeDashArray',\n 'stroke-dashoffset': 'strokeDashOffset',\n 'stroke-linecap': 'strokeLineCap',\n 'stroke-linejoin': 'strokeLineJoin',\n 'stroke-miterlimit': 'strokeMiterLimit',\n 'stroke-opacity': 'strokeOpacity',\n 'stroke-width': 'strokeWidth',\n 'text-decoration': 'textDecoration',\n 'text-anchor': 'textAnchor',\n opacity: 'opacity',\n 'clip-path': 'clipPath',\n 'clip-rule': 'clipRule',\n 'vector-effect': 'strokeUniform',\n 'image-rendering': 'imageSmoothing',\n 'text-decoration-thickness': TEXT_DECORATION_THICKNESS,\n },\n fSize = 'font-size',\n cPath = 'clip-path';\n\nexport const svgValidTagNamesRegEx = getSvgRegex(svgValidTagNames);\n\nexport const svgViewBoxElementsRegEx = getSvgRegex(svgViewBoxElements);\n\nexport const svgValidParentsRegEx = getSvgRegex(svgValidParents);\n\n// http://www.w3.org/TR/SVG/coords.html#ViewBoxAttribute\n\nexport const reViewBoxAttrValue = new RegExp(\n String.raw`^\\s*(${reNum})${viewportSeparator}(${reNum})${viewportSeparator}(${reNum})${viewportSeparator}(${reNum})\\s*$`,\n);\n","import { classRegistry } from './ClassRegistry';\nimport { Color } from './color/Color';\nimport { config } from './config';\nimport { reNum } from './parser/constants';\nimport { Point } from './Point';\nimport type { FabricObject } from './shapes/Object/FabricObject';\nimport type { TClassProperties } from './typedefs';\nimport { uid } from './util/internals/uid';\nimport { pickBy } from './util/misc/pick';\nimport { degreesToRadians } from './util/misc/radiansDegreesConversion';\nimport { toFixed } from './util/misc/toFixed';\nimport { rotateVector } from './util/misc/vectors';\n\n/**\n * Regex matching shadow offsetX, offsetY and blur (ex: \"2px 2px 10px rgba(0,0,0,0.2)\", \"rgb(0,255,0) 2px 2px\")\n * - (?:\\s|^): This part captures either a whitespace character (\\s) or the beginning of a line (^). It's non-capturing (due to (?:...)), meaning it doesn't create a capturing group.\n * - (-?\\d+(?:\\.\\d*)?(?:px)?(?:\\s?|$))?: This captures the first component of the shadow, which is the horizontal offset. Breaking it down:\n * - (-?\\d+): Captures an optional minus sign followed by one or more digits (integer part of the number).\n * - (?:\\.\\d*)?: Optionally captures a decimal point followed by zero or more digits (decimal part of the number).\n * - (?:px)?: Optionally captures the \"px\" unit.\n * - (?:\\s?|$): Captures either an optional whitespace or the end of the line. This whole part is wrapped in a non-capturing group and marked as optional with ?.\n * - (-?\\d+(?:\\.\\d*)?(?:px)?(?:\\s?|$))?: Similar to the previous step, this captures the vertical offset.\n\n(\\d+(?:\\.\\d*)?(?:px)?)?: This captures the blur radius. It's similar to the horizontal offset but without the optional minus sign.\n\n(?:\\s+(-?\\d+(?:\\.\\d*)?(?:px)?(?:\\s?|$))?){0,1}: This captures an optional part for the color. It allows for whitespace followed by a component with an optional minus sign, digits, decimal point, and \"px\" unit.\n\n(?:$|\\s): This captures either the end of the line or a whitespace character. It ensures that the match ends either at the end of the string or with a whitespace character.\n */\n// eslint-disable-next-line max-len\n\nconst shadowOffsetRegex = '(-?\\\\d+(?:\\\\.\\\\d*)?(?:px)?(?:\\\\s?|$))?';\n\nconst reOffsetsAndBlur = new RegExp(\n '(?:\\\\s|^)' +\n shadowOffsetRegex +\n shadowOffsetRegex +\n '(' +\n reNum +\n '?(?:px)?)?(?:\\\\s?|$)(?:$|\\\\s)',\n);\n\nexport const shadowDefaultValues: Partial> = {\n color: 'rgb(0,0,0)',\n blur: 0,\n offsetX: 0,\n offsetY: 0,\n affectStroke: false,\n includeDefaultValues: true,\n nonScaling: false,\n};\n\nexport type SerializedShadowOptions = {\n color: string;\n blur: number;\n offsetX: number;\n offsetY: number;\n affectStroke: boolean;\n nonScaling: boolean;\n type: string;\n};\n\nexport class Shadow {\n /**\n * Shadow color\n * @type String\n */\n declare color: string;\n\n /**\n * Shadow blur\n * @type Number\n */\n declare blur: number;\n\n /**\n * Shadow horizontal offset\n * @type Number\n */\n declare offsetX: number;\n\n /**\n * Shadow vertical offset\n * @type Number\n */\n declare offsetY: number;\n\n /**\n * Whether the shadow should affect stroke operations\n * @type Boolean\n */\n declare affectStroke: boolean;\n\n /**\n * Indicates whether toObject should include default values\n * @type Boolean\n */\n declare includeDefaultValues: boolean;\n\n /**\n * When `false`, the shadow will scale with the object.\n * When `true`, the shadow's offsetX, offsetY, and blur will not be affected by the object's scale.\n * default to false\n * @type Boolean\n */\n declare nonScaling: boolean;\n\n declare id: number;\n\n static ownDefaults = shadowDefaultValues;\n\n static type = 'shadow';\n\n /**\n * @see {@link http://fabric5.fabricjs.com/shadows|Shadow demo}\n * @param {Object|String} [options] Options object with any of color, blur, offsetX, offsetY properties or string (e.g. \"rgba(0,0,0,0.2) 2px 2px 10px\")\n */\n constructor(options?: Partial>);\n constructor(svgAttribute: string);\n constructor(arg0: string | Partial> = {}) {\n const options: Partial> =\n typeof arg0 === 'string' ? Shadow.parseShadow(arg0) : arg0;\n Object.assign(this, Shadow.ownDefaults, options);\n this.id = uid();\n }\n\n /**\n * @param {String} value Shadow value to parse\n * @return {Object} Shadow object with color, offsetX, offsetY and blur\n */\n static parseShadow(value: string) {\n const shadowStr = value.trim(),\n [, offsetX = 0, offsetY = 0, blur = 0] = (\n reOffsetsAndBlur.exec(shadowStr) || []\n ).map((value) => parseFloat(value) || 0),\n color = (shadowStr.replace(reOffsetsAndBlur, '') || 'rgb(0,0,0)').trim();\n\n return {\n color,\n offsetX,\n offsetY,\n blur,\n };\n }\n\n /**\n * Returns a string representation of an instance\n * @see http://www.w3.org/TR/css-text-decor-3/#text-shadow\n * @return {String} Returns CSS3 text-shadow declaration\n */\n toString() {\n return [this.offsetX, this.offsetY, this.blur, this.color].join('px ');\n }\n\n /**\n * Returns SVG representation of a shadow\n * @param {FabricObject} object\n * @return {String} SVG representation of a shadow\n */\n toSVG(object: FabricObject) {\n const offset = rotateVector(\n new Point(this.offsetX, this.offsetY),\n degreesToRadians(-object.angle),\n ),\n BLUR_BOX = 20,\n color = new Color(this.color);\n let fBoxX = 40,\n fBoxY = 40;\n\n if (object.width && object.height) {\n //http://www.w3.org/TR/SVG/filters.html#FilterEffectsRegion\n // we add some extra space to filter box to contain the blur ( 20 )\n fBoxX =\n toFixed(\n (Math.abs(offset.x) + this.blur) / object.width,\n config.NUM_FRACTION_DIGITS,\n ) *\n 100 +\n BLUR_BOX;\n fBoxY =\n toFixed(\n (Math.abs(offset.y) + this.blur) / object.height,\n config.NUM_FRACTION_DIGITS,\n ) *\n 100 +\n BLUR_BOX;\n }\n if (object.flipX) {\n offset.x *= -1;\n }\n if (object.flipY) {\n offset.y *= -1;\n }\n\n return `\\n\\t\\n\\t\\n\\t\\n\\t\\n\\t\\n\\t\\t\\n\\t\\t\\n\\t\\n\\n`;\n }\n\n /**\n * Returns object representation of a shadow\n * @return {Object} Object representation of a shadow instance\n */\n toObject() {\n const data: SerializedShadowOptions = {\n color: this.color,\n blur: this.blur,\n offsetX: this.offsetX,\n offsetY: this.offsetY,\n affectStroke: this.affectStroke,\n nonScaling: this.nonScaling,\n type: (this.constructor as typeof Shadow).type,\n };\n const defaults = Shadow.ownDefaults as SerializedShadowOptions;\n return !this.includeDefaultValues\n ? pickBy(data, (value, key) => value !== defaults[key])\n : data;\n }\n\n static async fromObject(options: Partial>) {\n return new this(options);\n }\n}\n\nclassRegistry.setClass(Shadow, 'shadow');\n","export const capValue = (min: number, value: number, max: number) =>\n Math.max(min, Math.min(value, max));\n","import {\n TOP,\n LEFT,\n SCALE_Y,\n SCALE_X,\n SKEW_X,\n SKEW_Y,\n FILL,\n STROKE,\n} from '../../constants';\nimport type { TClassProperties } from '../../typedefs';\nimport type { InteractiveFabricObject } from './InteractiveObject';\nimport type { FabricObject } from './Object';\n\nexport const stateProperties = [\n TOP,\n LEFT,\n SCALE_X,\n SCALE_Y,\n 'flipX',\n 'flipY',\n 'originX',\n 'originY',\n 'angle',\n 'opacity',\n 'globalCompositeOperation',\n 'shadow',\n 'visible',\n SKEW_X,\n SKEW_Y,\n];\n\nexport const cacheProperties = [\n FILL,\n STROKE,\n 'strokeWidth',\n 'strokeDashArray',\n 'width',\n 'height',\n 'paintFirst',\n 'strokeUniform',\n 'strokeLineCap',\n 'strokeDashOffset',\n 'strokeLineJoin',\n 'strokeMiterLimit',\n 'backgroundColor',\n 'clipPath',\n];\n\nexport const fabricObjectDefaultValues: Partial<\n TClassProperties\n> = {\n // see composeMatrix() to see order of transforms. First defaults listed based on this\n top: 0,\n left: 0,\n width: 0,\n height: 0,\n angle: 0,\n flipX: false,\n flipY: false,\n scaleX: 1,\n scaleY: 1,\n minScaleLimit: 0,\n skewX: 0,\n skewY: 0,\n originX: LEFT,\n originY: TOP,\n strokeWidth: 1,\n strokeUniform: false,\n padding: 0,\n opacity: 1,\n paintFirst: FILL,\n fill: 'rgb(0,0,0)',\n fillRule: 'nonzero',\n stroke: null,\n strokeDashArray: null,\n strokeDashOffset: 0,\n strokeLineCap: 'butt',\n strokeLineJoin: 'miter',\n strokeMiterLimit: 4,\n globalCompositeOperation: 'source-over',\n backgroundColor: '',\n shadow: null,\n visible: true,\n includeDefaultValues: true,\n excludeFromExport: false,\n objectCaching: true,\n clipPath: undefined,\n inverted: false,\n absolutePositioned: false,\n centeredRotation: true,\n centeredScaling: false,\n dirty: true,\n} as const;\n\nexport const interactiveObjectDefaultValues: Partial<\n TClassProperties\n> = {\n noScaleCache: true,\n lockMovementX: false,\n lockMovementY: false,\n lockRotation: false,\n lockScalingX: false,\n lockScalingY: false,\n lockSkewingX: false,\n lockSkewingY: false,\n lockScalingFlip: false,\n cornerSize: 13,\n touchCornerSize: 24,\n transparentCorners: true,\n cornerColor: 'rgb(178,204,255)',\n cornerStrokeColor: '',\n cornerStyle: 'rect',\n cornerDashArray: null,\n hasControls: true,\n borderColor: 'rgb(178,204,255)',\n borderDashArray: null,\n borderOpacityWhenMoving: 0.4,\n borderScaleFactor: 1,\n hasBorders: true,\n selectionBackgroundColor: '',\n selectable: true,\n evented: true,\n perPixelTargetFind: false,\n activeOn: 'down',\n hoverCursor: null,\n moveCursor: null,\n};\n","/**\n * Easing functions\n * @see {@link http://gizma.com/easing/ Easing Equations by Robert Penner}\n */\n\nimport { twoMathPi, halfPI } from '../../constants';\nimport type { TEasingFunction } from './types';\n\nconst normalize = (a: number, c: number, p: number, s: number) => {\n if (a < Math.abs(c)) {\n a = c;\n s = p / 4;\n } else {\n //handle the 0/0 case:\n if (c === 0 && a === 0) {\n s = (p / twoMathPi) * Math.asin(1);\n } else {\n s = (p / twoMathPi) * Math.asin(c / a);\n }\n }\n return { a, c, p, s };\n};\n\nconst elastic = (\n a: number,\n s: number,\n p: number,\n t: number,\n d: number,\n): number =>\n a * Math.pow(2, 10 * (t -= 1)) * Math.sin(((t * d - s) * twoMathPi) / p);\n\n/**\n * Default sinusoidal easing\n */\nexport const defaultEasing: TEasingFunction = (t, b, c, d) =>\n -c * Math.cos((t / d) * halfPI) + c + b;\n\n/**\n * Cubic easing in\n */\nexport const easeInCubic: TEasingFunction = (t, b, c, d) =>\n c * (t / d) ** 3 + b;\n\n/**\n * Cubic easing out\n */\nexport const easeOutCubic: TEasingFunction = (t, b, c, d) =>\n c * ((t / d - 1) ** 3 + 1) + b;\n\n/**\n * Cubic easing in and out\n */\nexport const easeInOutCubic: TEasingFunction = (t, b, c, d) => {\n t /= d / 2;\n if (t < 1) {\n return (c / 2) * t ** 3 + b;\n }\n return (c / 2) * ((t - 2) ** 3 + 2) + b;\n};\n\n/**\n * Quartic easing in\n */\nexport const easeInQuart: TEasingFunction = (t, b, c, d) =>\n c * (t /= d) * t ** 3 + b;\n\n/**\n * Quartic easing out\n */\nexport const easeOutQuart: TEasingFunction = (t, b, c, d) =>\n -c * ((t = t / d - 1) * t ** 3 - 1) + b;\n\n/**\n * Quartic easing in and out\n */\nexport const easeInOutQuart: TEasingFunction = (t, b, c, d) => {\n t /= d / 2;\n if (t < 1) {\n return (c / 2) * t ** 4 + b;\n }\n return (-c / 2) * ((t -= 2) * t ** 3 - 2) + b;\n};\n\n/**\n * Quintic easing in\n */\nexport const easeInQuint: TEasingFunction = (t, b, c, d) =>\n c * (t / d) ** 5 + b;\n\n/**\n * Quintic easing out\n */\nexport const easeOutQuint: TEasingFunction = (t, b, c, d) =>\n c * ((t / d - 1) ** 5 + 1) + b;\n\n/**\n * Quintic easing in and out\n */\nexport const easeInOutQuint: TEasingFunction = (t, b, c, d) => {\n t /= d / 2;\n if (t < 1) {\n return (c / 2) * t ** 5 + b;\n }\n return (c / 2) * ((t - 2) ** 5 + 2) + b;\n};\n\n/**\n * Sinusoidal easing in\n */\nexport const easeInSine: TEasingFunction = (t, b, c, d) =>\n -c * Math.cos((t / d) * halfPI) + c + b;\n\n/**\n * Sinusoidal easing out\n */\nexport const easeOutSine: TEasingFunction = (t, b, c, d) =>\n c * Math.sin((t / d) * halfPI) + b;\n\n/**\n * Sinusoidal easing in and out\n */\nexport const easeInOutSine: TEasingFunction = (t, b, c, d) =>\n (-c / 2) * (Math.cos((Math.PI * t) / d) - 1) + b;\n\n/**\n * Exponential easing in\n */\nexport const easeInExpo: TEasingFunction = (t, b, c, d) =>\n t === 0 ? b : c * 2 ** (10 * (t / d - 1)) + b;\n\n/**\n * Exponential easing out\n */\nexport const easeOutExpo: TEasingFunction = (t, b, c, d) =>\n t === d ? b + c : c * -(2 ** ((-10 * t) / d) + 1) + b;\n\n/**\n * Exponential easing in and out\n */\nexport const easeInOutExpo: TEasingFunction = (t, b, c, d) => {\n if (t === 0) {\n return b;\n }\n if (t === d) {\n return b + c;\n }\n t /= d / 2;\n if (t < 1) {\n return (c / 2) * 2 ** (10 * (t - 1)) + b;\n }\n return (c / 2) * -(2 ** (-10 * --t) + 2) + b;\n};\n\n/**\n * Circular easing in\n */\nexport const easeInCirc: TEasingFunction = (t, b, c, d) =>\n -c * (Math.sqrt(1 - (t /= d) * t) - 1) + b;\n\n/**\n * Circular easing out\n */\nexport const easeOutCirc: TEasingFunction = (t, b, c, d) =>\n c * Math.sqrt(1 - (t = t / d - 1) * t) + b;\n\n/**\n * Circular easing in and out\n */\nexport const easeInOutCirc: TEasingFunction = (t, b, c, d) => {\n t /= d / 2;\n if (t < 1) {\n return (-c / 2) * (Math.sqrt(1 - t ** 2) - 1) + b;\n }\n return (c / 2) * (Math.sqrt(1 - (t -= 2) * t) + 1) + b;\n};\n\n/**\n * Elastic easing in\n */\nexport const easeInElastic: TEasingFunction = (t, b, c, d) => {\n const s = 1.70158,\n a = c;\n let p = 0;\n if (t === 0) {\n return b;\n }\n t /= d;\n if (t === 1) {\n return b + c;\n }\n if (!p) {\n p = d * 0.3;\n }\n const { a: normA, s: normS, p: normP } = normalize(a, c, p, s);\n return -elastic(normA, normS, normP, t, d) + b;\n};\n\n/**\n * Elastic easing out\n */\nexport const easeOutElastic: TEasingFunction = (t, b, c, d) => {\n const s = 1.70158,\n a = c;\n let p = 0;\n if (t === 0) {\n return b;\n }\n t /= d;\n if (t === 1) {\n return b + c;\n }\n if (!p) {\n p = d * 0.3;\n }\n const { a: normA, s: normS, p: normP, c: normC } = normalize(a, c, p, s);\n return (\n normA * 2 ** (-10 * t) * Math.sin(((t * d - normS) * twoMathPi) / normP) +\n normC +\n b\n );\n};\n\n/**\n * Elastic easing in and out\n */\nexport const easeInOutElastic: TEasingFunction = (t, b, c, d) => {\n const s = 1.70158,\n a = c;\n let p = 0;\n if (t === 0) {\n return b;\n }\n t /= d / 2;\n if (t === 2) {\n return b + c;\n }\n if (!p) {\n p = d * (0.3 * 1.5);\n }\n const { a: normA, s: normS, p: normP, c: normC } = normalize(a, c, p, s);\n if (t < 1) {\n return -0.5 * elastic(normA, normS, normP, t, d) + b;\n }\n return (\n normA *\n Math.pow(2, -10 * (t -= 1)) *\n Math.sin(((t * d - normS) * twoMathPi) / normP) *\n 0.5 +\n normC +\n b\n );\n};\n\n/**\n * Backwards easing in\n */\nexport const easeInBack: TEasingFunction = (t, b, c, d, s = 1.70158) =>\n c * (t /= d) * t * ((s + 1) * t - s) + b;\n\n/**\n * Backwards easing out\n */\nexport const easeOutBack: TEasingFunction = (t, b, c, d, s = 1.70158) =>\n c * ((t = t / d - 1) * t * ((s + 1) * t + s) + 1) + b;\n\n/**\n * Backwards easing in and out\n */\nexport const easeInOutBack: TEasingFunction = (t, b, c, d, s = 1.70158) => {\n t /= d / 2;\n if (t < 1) {\n return (c / 2) * (t * t * (((s *= 1.525) + 1) * t - s)) + b;\n }\n return (c / 2) * ((t -= 2) * t * (((s *= 1.525) + 1) * t + s) + 2) + b;\n};\n\n/**\n * Bouncing easing out\n */\nexport const easeOutBounce: TEasingFunction = (t, b, c, d) => {\n if ((t /= d) < 1 / 2.75) {\n return c * (7.5625 * t * t) + b;\n } else if (t < 2 / 2.75) {\n return c * (7.5625 * (t -= 1.5 / 2.75) * t + 0.75) + b;\n } else if (t < 2.5 / 2.75) {\n return c * (7.5625 * (t -= 2.25 / 2.75) * t + 0.9375) + b;\n } else {\n return c * (7.5625 * (t -= 2.625 / 2.75) * t + 0.984375) + b;\n }\n};\n\n/**\n * Bouncing easing in\n */\nexport const easeInBounce: TEasingFunction = (t, b, c, d) =>\n c - easeOutBounce(d - t, 0, c, d) + b;\n\n/**\n * Bouncing easing in and out\n */\nexport const easeInOutBounce: TEasingFunction = (t, b, c, d) =>\n t < d / 2\n ? easeInBounce(t * 2, 0, c, d) * 0.5 + b\n : easeOutBounce(t * 2 - d, 0, c, d) * 0.5 + c * 0.5 + b;\n\n/**\n * Quadratic easing in\n */\nexport const easeInQuad: TEasingFunction = (t, b, c, d) => c * (t /= d) * t + b;\n\n/**\n * Quadratic easing out\n */\nexport const easeOutQuad: TEasingFunction = (t, b, c, d) =>\n -c * (t /= d) * (t - 2) + b;\n\n/**\n * Quadratic easing in and out\n */\nexport const easeInOutQuad: TEasingFunction = (t, b, c, d) => {\n t /= d / 2;\n if (t < 1) {\n return (c / 2) * t ** 2 + b;\n }\n return (-c / 2) * (--t * (t - 2) - 1) + b;\n};\n","import { noop } from '../../constants';\nimport { requestAnimFrame } from './AnimationFrameProvider';\nimport { runningAnimations } from './AnimationRegistry';\nimport { defaultEasing } from './easing';\nimport type {\n AnimationState,\n TAbortCallback,\n TBaseAnimationOptions,\n TEasingFunction,\n TOnAnimationChangeCallback,\n} from './types';\n\nconst defaultAbort = () => false;\n\nexport abstract class AnimationBase<\n T extends number | number[] = number | number[],\n> {\n declare readonly startValue: T;\n declare readonly endValue: T;\n declare readonly duration: number;\n declare readonly delay: number;\n\n declare protected readonly byValue: T;\n declare protected readonly easing: TEasingFunction;\n\n declare private readonly _onStart: VoidFunction;\n declare private readonly _onChange: TOnAnimationChangeCallback;\n declare private readonly _onComplete: TOnAnimationChangeCallback;\n declare private readonly _abort: TAbortCallback;\n\n /**\n * Used to register the animation to a target object\n * so that it can be cancelled within the object context\n */\n declare readonly target?: unknown;\n\n private _state: AnimationState = 'pending';\n /**\n * Time %, or the ratio of `timeElapsed / duration`\n * @see tick\n */\n durationProgress = 0;\n /**\n * Value %, or the ratio of `(currentValue - startValue) / (endValue - startValue)`\n */\n valueProgress = 0;\n /**\n * Current value\n */\n declare value: T;\n /**\n * Animation start time ms\n */\n declare private startTime: number;\n\n constructor({\n startValue,\n byValue,\n duration = 500,\n delay = 0,\n easing = defaultEasing,\n onStart = noop,\n onChange = noop,\n onComplete = noop,\n abort = defaultAbort,\n target,\n }: TBaseAnimationOptions) {\n this.tick = this.tick.bind(this);\n\n this.duration = duration;\n this.delay = delay;\n this.easing = easing;\n this._onStart = onStart;\n this._onChange = onChange;\n this._onComplete = onComplete;\n this._abort = abort;\n this.target = target;\n\n this.startValue = startValue;\n this.byValue = byValue;\n this.value = this.startValue;\n this.endValue = Object.freeze(this.calculate(this.duration).value);\n }\n\n get state() {\n return this._state;\n }\n\n isDone() {\n return this._state === 'aborted' || this._state === 'completed';\n }\n\n /**\n * Calculate the current value based on the easing parameters\n * @param timeElapsed in ms\n * @protected\n */\n protected abstract calculate(timeElapsed: number): {\n value: T;\n valueProgress: number;\n };\n\n start() {\n const firstTick: FrameRequestCallback = (timestamp) => {\n if (this._state !== 'pending') return;\n this.startTime = timestamp || +new Date();\n this._state = 'running';\n this._onStart();\n this.tick(this.startTime);\n };\n\n this.register();\n\n // setTimeout(cb, 0) will run cb on the next frame, causing a delay\n // we don't want that\n if (this.delay > 0) {\n setTimeout(() => requestAnimFrame(firstTick), this.delay);\n } else {\n requestAnimFrame(firstTick);\n }\n }\n\n private tick(t: number) {\n const durationMs = (t || +new Date()) - this.startTime;\n const boundDurationMs = Math.min(durationMs, this.duration);\n this.durationProgress = boundDurationMs / this.duration;\n const { value, valueProgress } = this.calculate(boundDurationMs);\n this.value = Object.freeze(value);\n this.valueProgress = valueProgress;\n\n if (this._state === 'aborted') {\n return;\n } else if (\n this._abort(this.value, this.valueProgress, this.durationProgress)\n ) {\n this._state = 'aborted';\n this.unregister();\n } else if (durationMs >= this.duration) {\n this.durationProgress = this.valueProgress = 1;\n this._onChange(this.endValue, this.valueProgress, this.durationProgress);\n this._state = 'completed';\n this._onComplete(\n this.endValue,\n this.valueProgress,\n this.durationProgress,\n );\n this.unregister();\n } else {\n this._onChange(this.value, this.valueProgress, this.durationProgress);\n requestAnimFrame(this.tick);\n }\n }\n\n private register() {\n runningAnimations.push(this as unknown as AnimationBase);\n }\n\n private unregister() {\n runningAnimations.remove(this as unknown as AnimationBase);\n }\n\n abort() {\n this._state = 'aborted';\n this.unregister();\n }\n}\n","import { AnimationBase } from './AnimationBase';\nimport type { ValueAnimationOptions } from './types';\n\nexport class ValueAnimation extends AnimationBase {\n constructor({\n startValue = 0,\n endValue = 100,\n ...otherOptions\n }: ValueAnimationOptions) {\n super({\n ...otherOptions,\n startValue,\n byValue: endValue - startValue,\n });\n }\n\n protected calculate(timeElapsed: number) {\n const value = this.easing(\n timeElapsed,\n this.startValue,\n this.byValue,\n this.duration,\n );\n return {\n value,\n valueProgress: Math.abs((value - this.startValue) / this.byValue),\n };\n }\n}\n","import { AnimationBase } from './AnimationBase';\nimport type { ArrayAnimationOptions } from './types';\n\nexport class ArrayAnimation extends AnimationBase {\n constructor({\n startValue = [0],\n endValue = [100],\n ...options\n }: ArrayAnimationOptions) {\n super({\n ...options,\n startValue,\n byValue: endValue.map((value, i) => value - startValue[i]),\n });\n }\n protected calculate(timeElapsed: number) {\n const values = this.startValue.map((value, i) =>\n this.easing(timeElapsed, value, this.byValue[i], this.duration, i),\n );\n return {\n value: values,\n valueProgress: Math.abs(\n (values[0] - this.startValue[0]) / this.byValue[0],\n ),\n };\n }\n}\n","import { Color } from '../../color/Color';\nimport type { TRGBAColorSource } from '../../color/typedefs';\nimport { halfPI } from '../../constants';\nimport { capValue } from '../misc/capValue';\nimport { AnimationBase } from './AnimationBase';\nimport type {\n ColorAnimationOptions,\n TEasingFunction,\n TOnAnimationChangeCallback,\n} from './types';\n\nconst defaultColorEasing: TEasingFunction = (\n timeElapsed,\n startValue,\n byValue,\n duration,\n) => {\n const durationProgress = 1 - Math.cos((timeElapsed / duration) * halfPI);\n return startValue + byValue * durationProgress;\n};\n\nconst wrapColorCallback = (\n callback?: TOnAnimationChangeCallback,\n) =>\n callback &&\n ((rgba: TRGBAColorSource, valueProgress: number, durationProgress: number) =>\n callback(new Color(rgba).toRgba(), valueProgress, durationProgress));\n\nexport class ColorAnimation extends AnimationBase {\n constructor({\n startValue,\n endValue,\n easing = defaultColorEasing,\n onChange,\n onComplete,\n abort,\n ...options\n }: ColorAnimationOptions) {\n const startColor = new Color(startValue).getSource();\n const endColor = new Color(endValue).getSource();\n super({\n ...options,\n startValue: startColor,\n byValue: endColor.map(\n (value, i) => value - startColor[i],\n ) as TRGBAColorSource,\n easing,\n onChange: wrapColorCallback(onChange),\n onComplete: wrapColorCallback(onComplete),\n abort: wrapColorCallback(abort),\n });\n }\n protected calculate(timeElapsed: number) {\n const [r, g, b, a] = this.startValue.map((value, i) =>\n this.easing(timeElapsed, value, this.byValue[i], this.duration, i),\n ) as TRGBAColorSource;\n const value = [\n ...[r, g, b].map(Math.round),\n capValue(0, a, 1),\n ] as TRGBAColorSource;\n return {\n value,\n valueProgress:\n // to correctly calculate the change ratio we must find a changed value\n value\n .map((p, i) =>\n this.byValue[i] !== 0\n ? Math.abs((p - this.startValue[i]) / this.byValue[i])\n : 0,\n )\n .find((p) => p !== 0) || 0,\n };\n }\n}\n","import { ValueAnimation } from './ValueAnimation';\nimport { ArrayAnimation } from './ArrayAnimation';\nimport { ColorAnimation } from './ColorAnimation';\nimport type {\n ValueAnimationOptions,\n ArrayAnimationOptions,\n ColorAnimationOptions,\n} from './types';\nimport type { TColorArg } from '../../color/typedefs';\n\nexport type TAnimation =\n T extends TColorArg\n ? ColorAnimation\n : T extends number[]\n ? ArrayAnimation\n : ValueAnimation;\n\nconst isArrayAnimation = (\n options: ArrayAnimationOptions | ValueAnimationOptions,\n): options is ArrayAnimationOptions => {\n return Array.isArray(options.startValue) || Array.isArray(options.endValue);\n};\n\n/**\n * Changes value(s) from startValue to endValue within a certain period of time,\n * invoking callbacks as the value(s) change.\n *\n * @example\n * animate({\n * startValue: 1,\n * endValue: 0,\n * onChange: (v) => {\n * obj.set('opacity', v);\n * // since we are running in a requested frame we should call `renderAll` and not `requestRenderAll`\n * canvas.renderAll();\n * }\n * });\n *\n * @example Using lists:\n * animate({\n * startValue: [1, 2, 3],\n * endValue: [2, 4, 6],\n * onChange: ([x, y, zoom]) => {\n * canvas.zoomToPoint(new Point(x, y), zoom);\n * canvas.renderAll();\n * }\n * });\n *\n */\nexport function animate(options: ArrayAnimationOptions): ArrayAnimation;\nexport function animate(options: ValueAnimationOptions): ValueAnimation;\nexport function animate<\n T extends ValueAnimationOptions | ArrayAnimationOptions,\n>(\n options: T,\n): T extends ArrayAnimationOptions ? ArrayAnimation : ValueAnimation;\nexport function animate<\n T extends ValueAnimationOptions | ArrayAnimationOptions,\n R extends T extends ArrayAnimationOptions ? ArrayAnimation : ValueAnimation,\n>(options: T): R {\n const animation = (\n isArrayAnimation(options)\n ? new ArrayAnimation(options)\n : new ValueAnimation(options)\n ) as R;\n animation.start();\n return animation;\n}\n\nexport function animateColor(options: ColorAnimationOptions) {\n const animation = new ColorAnimation(options);\n animation.start();\n return animation;\n}\n","import { Point } from './Point';\nimport { createVector } from './util/misc/vectors';\n\n/* Adaptation of work of Kevin Lindsey (kevin@kevlindev.com) */\n\nexport type IntersectionType = 'Intersection' | 'Coincident' | 'Parallel';\n\nexport class Intersection {\n declare points: Point[];\n\n declare status?: IntersectionType;\n\n constructor(status?: IntersectionType) {\n this.status = status;\n this.points = [];\n }\n\n /**\n * Used to verify if a point is alredy in the collection\n * @param {Point} point\n * @returns {boolean}\n */\n private includes(point: Point): boolean {\n return this.points.some((p) => p.eq(point));\n }\n\n /**\n * Appends points of intersection\n * @param {...Point[]} points\n * @return {Intersection} thisArg\n */\n private append(...points: Point[]): Intersection {\n this.points = this.points.concat(\n points.filter((point) => {\n return !this.includes(point);\n }),\n );\n return this;\n }\n\n /**\n * check if point T is on the segment or line defined between A and B\n *\n * @param {Point} T the point we are checking for\n * @param {Point} A one extremity of the segment\n * @param {Point} B the other extremity of the segment\n * @param [infinite] if true checks if `T` is on the line defined by `A` and `B`\n * @returns true if `T` is contained\n */\n static isPointContained(T: Point, A: Point, B: Point, infinite = false) {\n if (A.eq(B)) {\n // Edge case: the segment is a point, we check for coincidence,\n // infinite param has no meaning because there are infinite lines to consider\n return T.eq(A);\n } else if (A.x === B.x) {\n // Edge case: horizontal line.\n // we first check if T.x has the same value, and then if T.y is contained between A.y and B.y\n return (\n T.x === A.x &&\n (infinite || (T.y >= Math.min(A.y, B.y) && T.y <= Math.max(A.y, B.y)))\n );\n } else if (A.y === B.y) {\n // Edge case: vertical line.\n // we first check if T.y has the same value, and then if T.x is contained between A.x and B.x\n return (\n T.y === A.y &&\n (infinite || (T.x >= Math.min(A.x, B.x) && T.x <= Math.max(A.x, B.x)))\n );\n } else {\n // Generic case: sloped line.\n // we check that AT has the same slope as AB\n // for the segment case we need both the vectors to have the same direction and for AT to be lte AB in size\n // for the infinite case we check the absolute value of the slope, since direction is meaningless\n const AB = createVector(A, B);\n const AT = createVector(A, T);\n const s = AT.divide(AB);\n return infinite\n ? Math.abs(s.x) === Math.abs(s.y)\n : s.x === s.y && s.x >= 0 && s.x <= 1;\n }\n }\n\n /**\n * Use the ray casting algorithm to determine if point is in the polygon defined by points\n * @see https://en.wikipedia.org/wiki/Point_in_polygon\n * @param point\n * @param points polygon points\n * @returns\n */\n static isPointInPolygon(point: Point, points: Point[]) {\n const other = new Point(point).setX(\n Math.min(point.x - 1, ...points.map((p) => p.x)),\n );\n let hits = 0;\n for (let index = 0; index < points.length; index++) {\n const inter = this.intersectSegmentSegment(\n // polygon side\n points[index],\n points[(index + 1) % points.length],\n // ray\n point,\n other,\n );\n if (inter.includes(point)) {\n // point is on the polygon side\n return true;\n }\n hits += Number(inter.status === 'Intersection');\n }\n return hits % 2 === 1;\n }\n\n /**\n * Checks if a line intersects another\n * @see {@link https://en.wikipedia.org/wiki/Line%E2%80%93line_intersection line intersection}\n * @see {@link https://en.wikipedia.org/wiki/Cramer%27s_rule Cramer's rule}\n * @param {Point} a1\n * @param {Point} a2\n * @param {Point} b1\n * @param {Point} b2\n * @param {boolean} [aInfinite=true] check segment intersection by passing `false`\n * @param {boolean} [bInfinite=true] check segment intersection by passing `false`\n * @return {Intersection}\n */\n static intersectLineLine(\n a1: Point,\n a2: Point,\n b1: Point,\n b2: Point,\n aInfinite = true,\n bInfinite = true,\n ): Intersection {\n const a2xa1x = a2.x - a1.x,\n a2ya1y = a2.y - a1.y,\n b2xb1x = b2.x - b1.x,\n b2yb1y = b2.y - b1.y,\n a1xb1x = a1.x - b1.x,\n a1yb1y = a1.y - b1.y,\n uaT = b2xb1x * a1yb1y - b2yb1y * a1xb1x,\n ubT = a2xa1x * a1yb1y - a2ya1y * a1xb1x,\n uB = b2yb1y * a2xa1x - b2xb1x * a2ya1y;\n if (uB !== 0) {\n const ua = uaT / uB,\n ub = ubT / uB;\n if (\n (aInfinite || (0 <= ua && ua <= 1)) &&\n (bInfinite || (0 <= ub && ub <= 1))\n ) {\n return new Intersection('Intersection').append(\n new Point(a1.x + ua * a2xa1x, a1.y + ua * a2ya1y),\n );\n } else {\n return new Intersection();\n }\n } else {\n if (uaT === 0 || ubT === 0) {\n const segmentsCoincide =\n aInfinite ||\n bInfinite ||\n Intersection.isPointContained(a1, b1, b2) ||\n Intersection.isPointContained(a2, b1, b2) ||\n Intersection.isPointContained(b1, a1, a2) ||\n Intersection.isPointContained(b2, a1, a2);\n return new Intersection(segmentsCoincide ? 'Coincident' : undefined);\n } else {\n return new Intersection('Parallel');\n }\n }\n }\n\n /**\n * Checks if a segment intersects a line\n * @see {@link intersectLineLine} for line intersection\n * @param {Point} s1 boundary point of segment\n * @param {Point} s2 other boundary point of segment\n * @param {Point} l1 point on line\n * @param {Point} l2 other point on line\n * @return {Intersection}\n */\n static intersectSegmentLine(\n s1: Point,\n s2: Point,\n l1: Point,\n l2: Point,\n ): Intersection {\n return Intersection.intersectLineLine(s1, s2, l1, l2, false, true);\n }\n\n /**\n * Checks if a segment intersects another\n * @see {@link intersectLineLine} for line intersection\n * @param {Point} a1 boundary point of segment\n * @param {Point} a2 other boundary point of segment\n * @param {Point} b1 boundary point of segment\n * @param {Point} b2 other boundary point of segment\n * @return {Intersection}\n */\n static intersectSegmentSegment(\n a1: Point,\n a2: Point,\n b1: Point,\n b2: Point,\n ): Intersection {\n return Intersection.intersectLineLine(a1, a2, b1, b2, false, false);\n }\n\n /**\n * Checks if line intersects polygon\n *\n * @todo account for stroke\n *\n * @see {@link intersectSegmentPolygon} for segment intersection\n * @param {Point} a1 point on line\n * @param {Point} a2 other point on line\n * @param {Point[]} points polygon points\n * @param {boolean} [infinite=true] check segment intersection by passing `false`\n * @return {Intersection}\n */\n static intersectLinePolygon(\n a1: Point,\n a2: Point,\n points: Point[],\n infinite = true,\n ): Intersection {\n const result = new Intersection();\n const length = points.length;\n\n for (let i = 0, b1, b2, inter; i < length; i++) {\n b1 = points[i];\n b2 = points[(i + 1) % length];\n inter = Intersection.intersectLineLine(a1, a2, b1, b2, infinite, false);\n if (inter.status === 'Coincident') {\n return inter;\n }\n result.append(...inter.points);\n }\n\n if (result.points.length > 0) {\n result.status = 'Intersection';\n }\n\n return result;\n }\n\n /**\n * Checks if segment intersects polygon\n * @see {@link intersectLinePolygon} for line intersection\n * @param {Point} a1 boundary point of segment\n * @param {Point} a2 other boundary point of segment\n * @param {Point[]} points polygon points\n * @return {Intersection}\n */\n static intersectSegmentPolygon(\n a1: Point,\n a2: Point,\n points: Point[],\n ): Intersection {\n return Intersection.intersectLinePolygon(a1, a2, points, false);\n }\n\n /**\n * Checks if polygon intersects another polygon\n *\n * @todo account for stroke\n *\n * @param {Point[]} points1\n * @param {Point[]} points2\n * @return {Intersection}\n */\n static intersectPolygonPolygon(\n points1: Point[],\n points2: Point[],\n ): Intersection {\n const result = new Intersection(),\n length = points1.length;\n const coincidences: Intersection[] = [];\n\n for (let i = 0; i < length; i++) {\n const a1 = points1[i],\n a2 = points1[(i + 1) % length],\n inter = Intersection.intersectSegmentPolygon(a1, a2, points2);\n if (inter.status === 'Coincident') {\n coincidences.push(inter);\n result.append(a1, a2);\n } else {\n result.append(...inter.points);\n }\n }\n\n if (coincidences.length > 0 && coincidences.length === points1.length) {\n return new Intersection('Coincident');\n } else if (result.points.length > 0) {\n result.status = 'Intersection';\n }\n\n return result;\n }\n\n /**\n * Checks if polygon intersects rectangle\n * @see {@link intersectPolygonPolygon} for polygon intersection\n * @param {Point[]} points polygon points\n * @param {Point} r1 top left point of rect\n * @param {Point} r2 bottom right point of rect\n * @return {Intersection}\n */\n static intersectPolygonRectangle(\n points: Point[],\n r1: Point,\n r2: Point,\n ): Intersection {\n const min = r1.min(r2),\n max = r1.max(r2),\n topRight = new Point(max.x, min.y),\n bottomLeft = new Point(min.x, max.y);\n\n return Intersection.intersectPolygonPolygon(points, [\n min,\n topRight,\n max,\n bottomLeft,\n ]);\n }\n}\n","import type {\n TBBox,\n TCornerPoint,\n TDegree,\n TMat2D,\n TOriginX,\n TOriginY,\n} from '../../typedefs';\nimport { SCALE_X, SCALE_Y, iMatrix } from '../../constants';\nimport { Intersection } from '../../Intersection';\nimport { Point } from '../../Point';\nimport { makeBoundingBoxFromPoints } from '../../util/misc/boundingBoxFromPoints';\nimport {\n createRotateMatrix,\n createTranslateMatrix,\n composeMatrix,\n invertTransform,\n multiplyTransformMatrices,\n transformPoint,\n calcPlaneRotation,\n} from '../../util/misc/matrix';\nimport { radiansToDegrees } from '../../util/misc/radiansDegreesConversion';\nimport type { Canvas } from '../../canvas/Canvas';\nimport type { StaticCanvas } from '../../canvas/StaticCanvas';\nimport type { ObjectEvents } from '../../EventTypeDefs';\nimport type { ControlProps } from './types/ControlProps';\nimport { resolveOrigin } from '../../util/misc/resolveOrigin';\nimport type { Group } from '../Group';\nimport { calcDimensionsMatrix } from '../../util/misc/matrix';\nimport { sizeAfterTransform } from '../../util/misc/objectTransforms';\nimport { degreesToRadians } from '../../util/misc/radiansDegreesConversion';\nimport { CommonMethods } from '../../CommonMethods';\nimport type { BaseProps } from './types/BaseProps';\nimport type { FillStrokeProps } from './types/FillStrokeProps';\nimport { CENTER, LEFT, TOP } from '../../constants';\n\ntype TMatrixCache = {\n key: number[];\n value: TMat2D;\n};\n\ntype TACoords = TCornerPoint;\n\nexport class ObjectGeometry\n extends CommonMethods\n implements\n Pick,\n BaseProps,\n Pick\n{\n // #region Geometry\n\n declare padding: number;\n\n /**\n * Describe object's corner position in scene coordinates.\n * The coordinates are derived from the following:\n * left, top, width, height, scaleX, scaleY, skewX, skewY, angle, strokeWidth.\n * The coordinates do not depend on viewport changes.\n * The coordinates get updated with {@link setCoords}.\n * You can calculate them without updating with {@link calcACoords()}\n */\n declare aCoords: TACoords;\n\n /**\n * storage cache for object transform matrix\n */\n declare ownMatrixCache?: TMatrixCache;\n\n /**\n * storage cache for object full transform matrix\n */\n declare matrixCache?: TMatrixCache;\n\n /**\n * A Reference of the Canvas where the object is actually added\n * @type StaticCanvas | Canvas;\n * @default undefined\n * @private\n */\n declare canvas?: StaticCanvas | Canvas;\n\n /**\n * @returns {number} x position according to object's originX property in canvas coordinate plane\n */\n getX(): number {\n return this.getXY().x;\n }\n\n /**\n * @param {number} value x position according to object's originX property in canvas coordinate plane\n */\n setX(value: number) {\n this.setXY(this.getXY().setX(value));\n }\n\n /**\n * @returns {number} y position according to object's originY property in canvas coordinate plane\n */\n getY(): number {\n return this.getXY().y;\n }\n\n /**\n * @param {number} value y position according to object's originY property in canvas coordinate plane\n */\n setY(value: number) {\n this.setXY(this.getXY().setY(value));\n }\n\n /**\n * @returns {number} x position according to object's originX property in parent's coordinate plane\\\n * if parent is canvas then this property is identical to {@link getX}\n */\n getRelativeX(): number {\n return this.left;\n }\n\n /**\n * @param {number} value x position according to object's originX property in parent's coordinate plane\\\n * if parent is canvas then this method is identical to {@link setX}\n */\n setRelativeX(value: number) {\n this.left = value;\n }\n\n /**\n * @returns {number} y position according to object's originY property in parent's coordinate plane\\\n * if parent is canvas then this property is identical to {@link getY}\n */\n getRelativeY(): number {\n return this.top;\n }\n\n /**\n * @param {number} value y position according to object's originY property in parent's coordinate plane\\\n * if parent is canvas then this property is identical to {@link setY}\n */\n setRelativeY(value: number) {\n this.top = value;\n }\n\n /**\n * @returns {Point} x position according to object's originX originY properties in canvas coordinate plane\n */\n getXY(): Point {\n const relativePosition = this.getRelativeXY();\n return this.group\n ? transformPoint(relativePosition, this.group.calcTransformMatrix())\n : relativePosition;\n }\n\n /**\n * Set an object position to a particular point, the point is intended in absolute ( canvas ) coordinate.\n * You can specify originX and originY values,\n * that otherwise are the object's current values.\n * @example Set object's bottom left corner to point (5,5) on canvas\n * object.setXY(new Point(5, 5), 'left', 'bottom').\n * @param {Point} point position in scene coordinate plane\n * @param {TOriginX} [originX] Horizontal origin: 'left', 'center' or 'right'\n * @param {TOriginY} [originY] Vertical origin: 'top', 'center' or 'bottom'\n */\n setXY(point: Point, originX?: TOriginX, originY?: TOriginY) {\n if (this.group) {\n point = transformPoint(\n point,\n invertTransform(this.group.calcTransformMatrix()),\n );\n }\n this.setRelativeXY(point, originX, originY);\n }\n\n /**\n * @returns {Point} x,y position according to object's originX originY properties in parent's coordinate plane\n */\n getRelativeXY(): Point {\n return new Point(this.left, this.top);\n }\n\n /**\n * As {@link setXY}, but in current parent's coordinate plane (the current group if any or the canvas)\n * @param {Point} point position according to object's originX originY properties in parent's coordinate plane\n * @param {TOriginX} [originX] Horizontal origin: 'left', 'center' or 'right'\n * @param {TOriginY} [originY] Vertical origin: 'top', 'center' or 'bottom'\n */\n setRelativeXY(\n point: Point,\n originX: TOriginX = this.originX,\n originY: TOriginY = this.originY,\n ) {\n this.setPositionByOrigin(point, originX, originY);\n }\n\n /**\n * @deprecated intermidiate method to be removed, do not use\n */\n protected isStrokeAccountedForInDimensions() {\n return false;\n }\n\n /**\n * @return {Point[]} [tl, tr, br, bl] in the scene plane\n */\n getCoords(): Point[] {\n const { tl, tr, br, bl } =\n this.aCoords || (this.aCoords = this.calcACoords());\n const coords = [tl, tr, br, bl];\n if (this.group) {\n const t = this.group.calcTransformMatrix();\n return coords.map((p) => transformPoint(p, t));\n }\n return coords;\n }\n\n /**\n * Checks if object intersects with the scene rect formed by tl and br\n */\n intersectsWithRect(tl: Point, br: Point): boolean {\n const intersection = Intersection.intersectPolygonRectangle(\n this.getCoords(),\n tl,\n br,\n );\n return intersection.status === 'Intersection';\n }\n\n /**\n * Checks if object intersects with another object\n * @param {Object} other Object to test\n * @return {Boolean} true if object intersects with another object\n */\n intersectsWithObject(other: ObjectGeometry): boolean {\n const intersection = Intersection.intersectPolygonPolygon(\n this.getCoords(),\n other.getCoords(),\n );\n\n return (\n intersection.status === 'Intersection' ||\n intersection.status === 'Coincident' ||\n other.isContainedWithinObject(this) ||\n this.isContainedWithinObject(other)\n );\n }\n\n /**\n * Checks if object is fully contained within area of another object\n * @param {Object} other Object to test\n * @return {Boolean} true if object is fully contained within area of another object\n */\n isContainedWithinObject(other: ObjectGeometry): boolean {\n const points = this.getCoords();\n return points.every((point) => other.containsPoint(point));\n }\n\n /**\n * Checks if object is fully contained within the scene rect formed by tl and br\n */\n isContainedWithinRect(tl: Point, br: Point): boolean {\n const { left, top, width, height } = this.getBoundingRect();\n return (\n left >= tl.x &&\n left + width <= br.x &&\n top >= tl.y &&\n top + height <= br.y\n );\n }\n\n isOverlapping(other: T): boolean {\n return (\n this.intersectsWithObject(other) ||\n this.isContainedWithinObject(other) ||\n other.isContainedWithinObject(this)\n );\n }\n\n /**\n * Checks if point is inside the object\n * @param {Point} point Point to check against\n * @return {Boolean} true if point is inside the object\n */\n containsPoint(point: Point): boolean {\n return Intersection.isPointInPolygon(point, this.getCoords());\n }\n\n /**\n * Checks if object is contained within the canvas with current viewportTransform\n * the check is done stopping at first point that appears on screen\n * @return {Boolean} true if object is fully or partially contained within canvas\n */\n isOnScreen(): boolean {\n if (!this.canvas) {\n return false;\n }\n const { tl, br } = this.canvas.vptCoords;\n const points = this.getCoords();\n // if some point is on screen, the object is on screen.\n if (\n points.some(\n (point) =>\n point.x <= br.x &&\n point.x >= tl.x &&\n point.y <= br.y &&\n point.y >= tl.y,\n )\n ) {\n return true;\n }\n // no points on screen, check intersection with absolute coordinates\n if (this.intersectsWithRect(tl, br)) {\n return true;\n }\n // check if the object is so big that it contains the entire viewport\n return this.containsPoint(tl.midPointFrom(br));\n }\n\n /**\n * Checks if object is partially contained within the canvas with current viewportTransform\n * @return {Boolean} true if object is partially contained within canvas\n */\n isPartiallyOnScreen(): boolean {\n if (!this.canvas) {\n return false;\n }\n const { tl, br } = this.canvas.vptCoords;\n if (this.intersectsWithRect(tl, br)) {\n return true;\n }\n const allPointsAreOutside = this.getCoords().every(\n (point) =>\n (point.x >= br.x || point.x <= tl.x) &&\n (point.y >= br.y || point.y <= tl.y),\n );\n // check if the object is so big that it contains the entire viewport\n return allPointsAreOutside && this.containsPoint(tl.midPointFrom(br));\n }\n\n /**\n * Returns coordinates of object's bounding rectangle (left, top, width, height)\n * the box is intended as aligned to axis of canvas.\n * @return {Object} Object with left, top, width, height properties\n */\n getBoundingRect(): TBBox {\n return makeBoundingBoxFromPoints(this.getCoords());\n }\n\n /**\n * Returns width of an object's bounding box counting transformations\n * @todo shouldn't this account for group transform and return the actual size in canvas coordinate plane?\n * @return {Number} width value\n */\n getScaledWidth(): number {\n return this._getTransformedDimensions().x;\n }\n\n /**\n * Returns height of an object bounding box counting transformations\n * @todo shouldn't this account for group transform and return the actual size in canvas coordinate plane?\n * @return {Number} height value\n */\n getScaledHeight(): number {\n return this._getTransformedDimensions().y;\n }\n\n /**\n * Scales an object (equally by x and y)\n * @param {Number} value Scale factor\n * @return {void}\n */\n scale(value: number): void {\n this._set(SCALE_X, value);\n this._set(SCALE_Y, value);\n this.setCoords();\n }\n\n /**\n * Scales an object to a given width, with respect to bounding box (scaling by x/y equally)\n * @param {Number} value New width value\n * @return {void}\n */\n scaleToWidth(value: number) {\n // adjust to bounding rect factor so that rotated shapes would fit as well\n const boundingRectFactor =\n this.getBoundingRect().width / this.getScaledWidth();\n return this.scale(value / this.width / boundingRectFactor);\n }\n\n /**\n * Scales an object to a given height, with respect to bounding box (scaling by x/y equally)\n * @param {Number} value New height value\n * @return {void}\n */\n scaleToHeight(value: number) {\n // adjust to bounding rect factor so that rotated shapes would fit as well\n const boundingRectFactor =\n this.getBoundingRect().height / this.getScaledHeight();\n return this.scale(value / this.height / boundingRectFactor);\n }\n\n getCanvasRetinaScaling() {\n return this.canvas?.getRetinaScaling() || 1;\n }\n\n /**\n * Returns the object angle relative to canvas counting also the group property\n * @returns {TDegree}\n */\n getTotalAngle(): TDegree {\n return this.group\n ? radiansToDegrees(calcPlaneRotation(this.calcTransformMatrix()))\n : this.angle;\n }\n\n /**\n * Retrieves viewportTransform from Object's canvas if available\n * @return {TMat2D}\n */\n getViewportTransform(): TMat2D {\n return this.canvas?.viewportTransform || (iMatrix.concat() as TMat2D);\n }\n\n /**\n * Calculates the coordinates of the 4 corner of the bbox, in absolute coordinates.\n * those never change with zoom or viewport changes.\n * @return {TCornerPoint}\n */\n calcACoords(): TCornerPoint {\n const rotateMatrix = createRotateMatrix({ angle: this.angle }),\n { x, y } = this.getRelativeCenterPoint(),\n tMatrix = createTranslateMatrix(x, y),\n finalMatrix = multiplyTransformMatrices(tMatrix, rotateMatrix),\n dim = this._getTransformedDimensions(),\n w = dim.x / 2,\n h = dim.y / 2;\n return {\n // corners\n tl: transformPoint({ x: -w, y: -h }, finalMatrix),\n tr: transformPoint({ x: w, y: -h }, finalMatrix),\n bl: transformPoint({ x: -w, y: h }, finalMatrix),\n br: transformPoint({ x: w, y: h }, finalMatrix),\n };\n }\n\n /**\n * Sets corner and controls position coordinates based on current angle, width and height, left and top.\n * aCoords are used to quickly find an object on the canvas.\n * See {@link https://github.com/fabricjs/fabric.js/wiki/When-to-call-setCoords} and {@link http://fabric5.fabricjs.com/fabric-gotchas}\n */\n setCoords(): void {\n this.aCoords = this.calcACoords();\n }\n\n transformMatrixKey(skipGroup = false): number[] {\n let prefix: number[] = [];\n if (!skipGroup && this.group) {\n prefix = this.group.transformMatrixKey(skipGroup);\n }\n prefix.push(\n this.top,\n this.left,\n this.width,\n this.height,\n this.scaleX,\n this.scaleY,\n this.angle,\n this.strokeWidth,\n this.skewX,\n this.skewY,\n +this.flipX,\n +this.flipY,\n resolveOrigin(this.originX),\n resolveOrigin(this.originY),\n );\n\n return prefix;\n }\n\n /**\n * calculate transform matrix that represents the current transformations from the\n * object's properties.\n * @param {Boolean} [skipGroup] return transform matrix for object not counting parent transformations\n * There are some situation in which this is useful to avoid the fake rotation.\n * @return {TMat2D} transform matrix for the object\n */\n calcTransformMatrix(skipGroup = false): TMat2D {\n let matrix = this.calcOwnMatrix();\n if (skipGroup || !this.group) {\n return matrix;\n }\n const key = this.transformMatrixKey(skipGroup),\n cache = this.matrixCache;\n if (cache && cache.key.every((x, i) => x === key[i])) {\n return cache.value;\n }\n if (this.group) {\n matrix = multiplyTransformMatrices(\n this.group.calcTransformMatrix(false),\n matrix,\n );\n }\n this.matrixCache = {\n key,\n value: matrix,\n };\n return matrix;\n }\n\n /**\n * calculate transform matrix that represents the current transformations from the\n * object's properties, this matrix does not include the group transformation\n * @return {TMat2D} transform matrix for the object\n */\n calcOwnMatrix(): TMat2D {\n const key = this.transformMatrixKey(true),\n cache = this.ownMatrixCache;\n if (cache && cache.key === key) {\n return cache.value;\n }\n const center = this.getRelativeCenterPoint(),\n options = {\n angle: this.angle,\n translateX: center.x,\n translateY: center.y,\n scaleX: this.scaleX,\n scaleY: this.scaleY,\n skewX: this.skewX,\n skewY: this.skewY,\n flipX: this.flipX,\n flipY: this.flipY,\n },\n value = composeMatrix(options);\n this.ownMatrixCache = {\n key,\n value,\n };\n return value;\n }\n\n /**\n * Calculate object dimensions from its properties\n * @private\n * @returns {Point} dimensions\n */\n _getNonTransformedDimensions(): Point {\n return new Point(this.width, this.height).scalarAdd(this.strokeWidth);\n }\n\n /**\n * Calculate object dimensions for controls box, including padding and canvas zoom.\n * and active selection\n * @private\n * @param {object} [options] transform options\n * @returns {Point} dimensions\n */\n _calculateCurrentDimensions(options?: any): Point {\n return this._getTransformedDimensions(options)\n .transform(this.getViewportTransform(), true)\n .scalarAdd(2 * this.padding);\n }\n\n // #region Origin\n\n declare top: number;\n declare left: number;\n declare width: number;\n declare height: number;\n declare flipX: boolean;\n declare flipY: boolean;\n declare scaleX: number;\n declare scaleY: number;\n declare skewX: number;\n declare skewY: number;\n /**\n * @deprecated please use 'center' as value in new projects\n * */\n declare originX: TOriginX;\n /**\n * @deprecated please use 'center' as value in new projects\n * */\n declare originY: TOriginY;\n declare angle: TDegree;\n declare strokeWidth: number;\n declare strokeUniform: boolean;\n\n /**\n * Object containing this object.\n * can influence its size and position\n */\n declare group?: Group;\n\n /**\n * Calculate object bounding box dimensions from its properties scale, skew.\n * This bounding box is aligned with object angle and not with canvas axis or screen.\n * @param {Object} [options]\n * @param {Number} [options.scaleX]\n * @param {Number} [options.scaleY]\n * @param {Number} [options.skewX]\n * @param {Number} [options.skewY]\n * @private\n * @returns {Point} dimensions\n */\n _getTransformedDimensions(options: any = {}): Point {\n const dimOptions = {\n // if scaleX or scaleY are negative numbers,\n // this will return dimensions that are negative.\n // and this will break assumptions around the codebase\n scaleX: this.scaleX,\n scaleY: this.scaleY,\n skewX: this.skewX,\n skewY: this.skewY,\n width: this.width,\n height: this.height,\n strokeWidth: this.strokeWidth,\n // TODO remove this spread. is visible in the performance inspection\n ...options,\n };\n // stroke is applied before/after transformations are applied according to `strokeUniform`\n const strokeWidth = dimOptions.strokeWidth;\n let preScalingStrokeValue = strokeWidth,\n postScalingStrokeValue = 0;\n\n if (this.strokeUniform) {\n preScalingStrokeValue = 0;\n postScalingStrokeValue = strokeWidth;\n }\n const dimX = dimOptions.width + preScalingStrokeValue,\n dimY = dimOptions.height + preScalingStrokeValue,\n noSkew = dimOptions.skewX === 0 && dimOptions.skewY === 0;\n let finalDimensions;\n if (noSkew) {\n finalDimensions = new Point(\n dimX * dimOptions.scaleX,\n dimY * dimOptions.scaleY,\n );\n } else {\n finalDimensions = sizeAfterTransform(\n dimX,\n dimY,\n calcDimensionsMatrix(dimOptions),\n );\n }\n\n return finalDimensions.scalarAdd(postScalingStrokeValue);\n }\n\n /**\n * Translates the coordinates from a set of origin to another (based on the object's dimensions)\n * @param {Point} point The point which corresponds to the originX and originY params\n * @param {TOriginX} fromOriginX Horizontal origin: 'left', 'center' or 'right'\n * @param {TOriginY} fromOriginY Vertical origin: 'top', 'center' or 'bottom'\n * @param {TOriginX} toOriginX Horizontal origin: 'left', 'center' or 'right'\n * @param {TOriginY} toOriginY Vertical origin: 'top', 'center' or 'bottom'\n * @return {Point}\n */\n translateToGivenOrigin(\n point: Point,\n fromOriginX: TOriginX,\n fromOriginY: TOriginY,\n toOriginX: TOriginX,\n toOriginY: TOriginY,\n ): Point {\n let x = point.x,\n y = point.y;\n const offsetX = resolveOrigin(toOriginX) - resolveOrigin(fromOriginX),\n offsetY = resolveOrigin(toOriginY) - resolveOrigin(fromOriginY);\n\n if (offsetX || offsetY) {\n const dim = this._getTransformedDimensions();\n x += offsetX * dim.x;\n y += offsetY * dim.y;\n }\n\n return new Point(x, y);\n }\n\n /**\n * Translates the coordinates from origin to center coordinates (based on the object's dimensions)\n * @param {Point} point The point which corresponds to the originX and originY params\n * @param {TOriginX} originX Horizontal origin: 'left', 'center' or 'right'\n * @param {TOriginY} originY Vertical origin: 'top', 'center' or 'bottom'\n * @return {Point}\n */\n translateToCenterPoint(\n point: Point,\n originX: TOriginX,\n originY: TOriginY,\n ): Point {\n if (originX === CENTER && originY === CENTER) {\n return point;\n }\n const p = this.translateToGivenOrigin(\n point,\n originX,\n originY,\n CENTER,\n CENTER,\n );\n if (this.angle) {\n return p.rotate(degreesToRadians(this.angle), point);\n }\n return p;\n }\n\n /**\n * Translates the coordinates from center to origin coordinates (based on the object's dimensions)\n * @param {Point} center The point which corresponds to center of the object\n * @param {OriginX} originX Horizontal origin: 'left', 'center' or 'right'\n * @param {OriginY} originY Vertical origin: 'top', 'center' or 'bottom'\n * @return {Point}\n */\n translateToOriginPoint(\n center: Point,\n originX: TOriginX,\n originY: TOriginY,\n ): Point {\n const p = this.translateToGivenOrigin(\n center,\n CENTER,\n CENTER,\n originX,\n originY,\n );\n if (this.angle) {\n return p.rotate(degreesToRadians(this.angle), center);\n }\n return p;\n }\n\n /**\n * Returns the center coordinates of the object relative to canvas\n * @return {Point}\n */\n getCenterPoint(): Point {\n const relCenter = this.getRelativeCenterPoint();\n return this.group\n ? transformPoint(relCenter, this.group.calcTransformMatrix())\n : relCenter;\n }\n\n /**\n * Returns the center coordinates of the object relative to it's parent\n * @return {Point}\n */\n getRelativeCenterPoint(): Point {\n return this.translateToCenterPoint(\n new Point(this.left, this.top),\n this.originX,\n this.originY,\n );\n }\n\n /**\n * Returns the position of the object as if it has a different origin.\n * Take an object that has left, top set to 100, 100 with origin 'left', 'top'.\n * Return the values of left top ( wrapped in a point ) that you would need to keep\n * the same position if origin where different.\n * Alternatively you can use this to also find which point in the parent plane is a specific origin\n * ( where is the bottom right corner of my object? )\n * @param {TOriginX} originX Horizontal origin: 'left', 'center' or 'right'\n * @param {TOriginY} originY Vertical origin: 'top', 'center' or 'bottom'\n * @return {Point}\n */\n getPointByOrigin(originX: TOriginX, originY: TOriginY): Point {\n return this.translateToOriginPoint(\n this.getRelativeCenterPoint(),\n originX,\n originY,\n );\n }\n\n /**\n * Sets the position of the object taking into consideration the object's origin\n * @param {Point} pos The new position of the object\n * @param {TOriginX} originX Horizontal origin: 'left', 'center' or 'right'\n * @param {TOriginY} originY Vertical origin: 'top', 'center' or 'bottom'\n * @return {void}\n */\n setPositionByOrigin(pos: Point, originX: TOriginX, originY: TOriginY) {\n const center = this.translateToCenterPoint(pos, originX, originY),\n position = this.translateToOriginPoint(\n center,\n this.originX,\n this.originY,\n );\n this.set({ left: position.x, top: position.y });\n }\n\n /**\n * @private\n */\n _getLeftTopCoords() {\n return this.translateToOriginPoint(\n this.getRelativeCenterPoint(),\n LEFT,\n TOP,\n );\n }\n}\n","import { cache } from '../../cache';\nimport { config } from '../../config';\nimport {\n ALIASING_LIMIT,\n CENTER,\n iMatrix,\n LEFT,\n SCALE_X,\n SCALE_Y,\n STROKE,\n FILL,\n TOP,\n VERSION,\n} from '../../constants';\nimport type { ObjectEvents } from '../../EventTypeDefs';\nimport { Point } from '../../Point';\nimport { Shadow } from '../../Shadow';\nimport type {\n TDegree,\n TFiller,\n TSize,\n TCacheCanvasDimensions,\n Abortable,\n TOptions,\n ImageFormat,\n} from '../../typedefs';\nimport { classRegistry } from '../../ClassRegistry';\nimport { runningAnimations } from '../../util/animation/AnimationRegistry';\nimport { capValue } from '../../util/misc/capValue';\nimport {\n createCanvasElement,\n createCanvasElementFor,\n toDataURL,\n toBlob,\n} from '../../util/misc/dom';\nimport { invertTransform, qrDecompose } from '../../util/misc/matrix';\nimport { enlivenObjectEnlivables } from '../../util/misc/objectEnlive';\nimport {\n resetObjectTransform,\n saveObjectTransform,\n} from '../../util/misc/objectTransforms';\nimport { sendObjectToPlane } from '../../util/misc/planeChange';\nimport { pick, pickBy } from '../../util/misc/pick';\nimport { toFixed } from '../../util/misc/toFixed';\nimport type { Group } from '../Group';\nimport { StaticCanvas } from '../../canvas/StaticCanvas';\nimport { isFiller, isSerializableFiller } from '../../util/typeAssertions';\nimport type { FabricImage } from '../Image';\nimport {\n cacheProperties,\n fabricObjectDefaultValues,\n stateProperties,\n} from './defaultValues';\nimport type { Gradient } from '../../gradient/Gradient';\nimport type { Pattern } from '../../Pattern';\nimport type { Canvas } from '../../canvas/Canvas';\nimport type { SerializedObjectProps } from './types/SerializedObjectProps';\nimport type { ObjectProps } from './types/ObjectProps';\nimport { getDevicePixelRatio, getEnv } from '../../env';\nimport { log } from '../../util/internals/console';\nimport type { TColorArg } from '../../color/typedefs';\nimport type { TAnimation } from '../../util/animation/animate';\nimport { animate, animateColor } from '../../util/animation/animate';\nimport type {\n AnimationOptions,\n ArrayAnimationOptions,\n ColorAnimationOptions,\n ValueAnimationOptions,\n} from '../../util/animation/types';\nimport { ObjectGeometry } from './ObjectGeometry';\n\ntype TAncestor = FabricObject;\ntype TCollection = Group;\n\nexport type Ancestors =\n | [FabricObject | Group]\n | [FabricObject | Group, ...Group[]]\n | Group[];\n\nexport type AncestryComparison = {\n /**\n * common ancestors of `this` and`other`(may include`this` | `other`)\n */\n common: Ancestors;\n /**\n * ancestors that are of `this` only\n */\n fork: Ancestors;\n /**\n * ancestors that are of `other` only\n */\n otherFork: Ancestors;\n};\n\nexport type TCachedFabricObject = T &\n Required<\n Pick<\n T,\n | 'zoomX'\n | 'zoomY'\n | '_cacheCanvas'\n | '_cacheContext'\n | 'cacheTranslationX'\n | 'cacheTranslationY'\n >\n > & {\n _cacheContext: CanvasRenderingContext2D;\n };\n\nexport type ObjectToCanvasElementOptions = {\n format?: ImageFormat;\n /** Multiplier to scale by */\n multiplier?: number;\n /** Cropping left offset. Introduced in v1.2.14 */\n left?: number;\n /** Cropping top offset. Introduced in v1.2.14 */\n top?: number;\n /** Cropping width. Introduced in v1.2.14 */\n width?: number;\n /** Cropping height. Introduced in v1.2.14 */\n height?: number;\n /** Enable retina scaling for clone image. Introduce in 1.6.4 */\n enableRetinaScaling?: boolean;\n /** Remove current object transform ( no scale , no angle, no flip, no skew ). Introduced in 2.3.4 */\n withoutTransform?: boolean;\n /** Remove current object shadow. Introduced in 2.4.2 */\n withoutShadow?: boolean;\n /** Account for canvas viewport transform */\n viewportTransform?: boolean;\n /** Function to create the output canvas to export onto */\n canvasProvider?: (el?: HTMLCanvasElement) => T;\n};\n\ntype toDataURLOptions = ObjectToCanvasElementOptions & {\n quality?: number;\n};\n\nexport type DrawContext =\n | {\n parentClipPaths: FabricObject[];\n width: number;\n height: number;\n cacheTranslationX: number;\n cacheTranslationY: number;\n zoomX: number;\n zoomY: number;\n }\n | Record;\n\n/**\n * Root object class from which all 2d shape classes inherit from\n * @see {@link http://fabric5.fabricjs.com/fabric-intro-part-1#objects}\n *\n * @fires added\n * @fires removed\n *\n * @fires selected\n * @fires deselected\n *\n * @fires rotating\n * @fires scaling\n * @fires moving\n * @fires skewing\n * @fires modified\n *\n * @fires mousedown\n * @fires mouseup\n * @fires mouseover\n * @fires mouseout\n * @fires mousewheel\n * @fires mousedblclick\n *\n * @fires dragover\n * @fires dragenter\n * @fires dragleave\n * @fires drop\n */\nexport class FabricObject<\n Props extends TOptions = Partial,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n SProps extends SerializedObjectProps = SerializedObjectProps,\n EventSpec extends ObjectEvents = ObjectEvents,\n >\n extends ObjectGeometry\n implements ObjectProps\n{\n declare minScaleLimit: number;\n\n declare opacity: number;\n\n declare paintFirst: 'fill' | 'stroke';\n declare fill: string | TFiller | null;\n declare fillRule: CanvasFillRule;\n declare stroke: string | TFiller | null;\n declare strokeDashArray: number[] | null;\n declare strokeDashOffset: number;\n declare strokeLineCap: CanvasLineCap;\n declare strokeLineJoin: CanvasLineJoin;\n declare strokeMiterLimit: number;\n\n declare globalCompositeOperation: GlobalCompositeOperation;\n declare backgroundColor: string;\n\n declare shadow: Shadow | null;\n\n declare visible: boolean;\n\n declare includeDefaultValues: boolean;\n declare excludeFromExport: boolean;\n\n declare objectCaching: boolean;\n\n declare clipPath?: FabricObject;\n declare inverted: boolean;\n declare absolutePositioned: boolean;\n declare centeredRotation: boolean;\n declare centeredScaling: boolean;\n\n /**\n * This list of properties is used to check if the state of an object is changed.\n * This state change now is only used for children of groups to understand if a group\n * needs its cache regenerated during a .set call\n * @type Array\n */\n static stateProperties: string[] = stateProperties;\n\n /**\n * List of properties to consider when checking if cache needs refresh\n * Those properties are checked by\n * calls to Object.set(key, value). If the key is in this list, the object is marked as dirty\n * and refreshed at the next render\n * @type Array\n */\n static cacheProperties: string[] = cacheProperties;\n\n /**\n * When set to `true`, object's cache will be rerendered next render call.\n * since 1.7.0\n * @type Boolean\n * @default true\n */\n declare dirty: boolean;\n\n /**\n * Quick access for the _cacheCanvas rendering context\n * This is part of the objectCaching feature\n * since 1.7.0\n * @type boolean\n * @default undefined\n * @private\n */\n _cacheContext: CanvasRenderingContext2D | null = null;\n\n /**\n * A reference to the HTMLCanvasElement that is used to contain the cache of the object\n * this canvas element is resized and cleared as needed\n * Is marked private, you can read it, don't use it since it is handled by fabric\n * since 1.7.0\n * @type HTMLCanvasElement\n * @default undefined\n * @private\n */\n declare _cacheCanvas?: HTMLCanvasElement;\n\n /**\n * zoom level used on the cacheCanvas to draw the cache, X axe\n * since 1.7.0\n * @type number\n * @default undefined\n * @private\n */\n declare zoomX?: number;\n\n /**\n * zoom level used on the cacheCanvas to draw the cache, Y axe\n * since 1.7.0\n * @type number\n * @default undefined\n * @private\n */\n declare zoomY?: number;\n\n /**\n * zoom level used on the cacheCanvas to draw the cache, Y axe\n * since 1.7.0\n * @type number\n * @default undefined\n * @private\n */\n declare cacheTranslationX?: number;\n\n /**\n * translation of the cacheCanvas away from the center, for subpixel accuracy and crispness\n * since 1.7.0\n * @type number\n * @default undefined\n * @private\n */\n declare cacheTranslationY?: number;\n\n /**\n * A reference to the parent of the object, usually a Group\n * @type number\n * @default undefined\n * @private\n */\n declare group?: Group;\n\n /**\n * Indicate if the object is sitting on a cache dedicated to it\n * or is part of a larger cache for many object ( a group for example)\n * @type number\n * @default undefined\n * @private\n */\n declare ownCaching?: boolean;\n\n /**\n * Private. indicates if the object inside a group is on a transformed context or not\n * or is part of a larger cache for many object ( a group for example)\n * @type boolean\n * @default undefined\n * @private\n */\n declare _transformDone?: boolean;\n\n static ownDefaults = fabricObjectDefaultValues;\n\n static getDefaults(): Record {\n return FabricObject.ownDefaults;\n }\n\n /**\n * The class type.\n * This is used for serialization and deserialization purposes and internally it can be used\n * to identify classes.\n * When we transform a class in a plain JS object we need a way to recognize which class it was,\n * and the type is the way we do that. It has no other purposes and you should not give one.\n * Hard to reach on instances and please do not use to drive instance's logic (this.constructor.type).\n * To idenfity a class use instanceof class ( instanceof Rect ).\n * We do not do that in fabricJS code because we want to try to have code splitting possible.\n */\n static type = 'FabricObject';\n\n /**\n * Legacy identifier of the class. Prefer using utils like isType or instanceOf\n * Will be removed in fabric 7 or 8.\n * The setter exists to avoid type errors in old code and possibly current deserialization code.\n * DO NOT build new code around this type value\n * @TODO add sustainable warning message\n * @type string\n * @deprecated\n */\n get type() {\n const name = (this.constructor as typeof FabricObject).type;\n if (name === 'FabricObject') {\n return 'object';\n }\n return name.toLowerCase();\n }\n\n set type(value) {\n log('warn', 'Setting type has no effect', value);\n }\n\n /**\n * Constructor\n * @param {Object} [options] Options object\n */\n constructor(options?: Props) {\n super();\n Object.assign(this, FabricObject.ownDefaults);\n this.setOptions(options);\n }\n\n /**\n * Create a the canvas used to keep the cached copy of the object\n * @private\n */\n _createCacheCanvas() {\n this._cacheCanvas = createCanvasElement();\n this._cacheContext = this._cacheCanvas.getContext('2d');\n this._updateCacheCanvas();\n // if canvas gets created, is empty, so dirty.\n this.dirty = true;\n }\n\n /**\n * Limit the cache dimensions so that X * Y do not cross config.perfLimitSizeTotal\n * and each side do not cross fabric.cacheSideLimit\n * those numbers are configurable so that you can get as much detail as you want\n * making bargain with performances.\n * It mutates the input object dims.\n * @param {TCacheCanvasDimensions} dims\n * @return {TCacheCanvasDimensions} dims\n */\n _limitCacheSize(\n dims: TCacheCanvasDimensions & { capped?: boolean },\n ): TCacheCanvasDimensions & { capped?: boolean } {\n const width = dims.width,\n height = dims.height,\n max = config.maxCacheSideLimit,\n min = config.minCacheSideLimit;\n if (\n width <= max &&\n height <= max &&\n width * height <= config.perfLimitSizeTotal\n ) {\n if (width < min) {\n dims.width = min;\n }\n if (height < min) {\n dims.height = min;\n }\n return dims;\n }\n const ar = width / height,\n [limX, limY] = cache.limitDimsByArea(ar),\n x = capValue(min, limX, max),\n y = capValue(min, limY, max);\n if (width > x) {\n dims.zoomX /= width / x;\n dims.width = x;\n dims.capped = true;\n }\n if (height > y) {\n dims.zoomY /= height / y;\n dims.height = y;\n dims.capped = true;\n }\n return dims;\n }\n\n /**\n * Return the dimension and the zoom level needed to create a cache canvas\n * big enough to host the object to be cached.\n * @private\n * @return {TCacheCanvasDimensions} Informations about the object to be cached\n */\n _getCacheCanvasDimensions(): TCacheCanvasDimensions {\n const objectScale = this.getTotalObjectScaling(),\n // calculate dimensions without skewing\n dim = this._getTransformedDimensions({ skewX: 0, skewY: 0 }),\n neededX = (dim.x * objectScale.x) / this.scaleX,\n neededY = (dim.y * objectScale.y) / this.scaleY;\n return {\n // for sure this ALIASING_LIMIT is slightly creating problem\n // in situation in which the cache canvas gets an upper limit\n // also objectScale contains already scaleX and scaleY\n width: Math.ceil(neededX + ALIASING_LIMIT),\n height: Math.ceil(neededY + ALIASING_LIMIT),\n zoomX: objectScale.x,\n zoomY: objectScale.y,\n x: neededX,\n y: neededY,\n };\n }\n\n /**\n * Update width and height of the canvas for cache\n * returns true or false if canvas needed resize.\n * @private\n * @return {Boolean} true if the canvas has been resized\n */\n _updateCacheCanvas() {\n const canvas = this._cacheCanvas!,\n context = this._cacheContext,\n { width, height, zoomX, zoomY, x, y } = this._limitCacheSize(\n this._getCacheCanvasDimensions(),\n ),\n dimensionsChanged = width !== canvas.width || height !== canvas.height,\n zoomChanged = this.zoomX !== zoomX || this.zoomY !== zoomY;\n\n if (!canvas || !context) {\n return false;\n }\n\n const shouldRedraw = dimensionsChanged || zoomChanged;\n\n if (shouldRedraw) {\n if (width !== canvas.width || height !== canvas.height) {\n canvas.width = width;\n canvas.height = height;\n } else {\n context.setTransform(1, 0, 0, 1, 0, 0);\n context.clearRect(0, 0, canvas.width, canvas.height);\n }\n const drawingWidth = x / 2;\n const drawingHeight = y / 2;\n this.cacheTranslationX =\n Math.round(canvas.width / 2 - drawingWidth) + drawingWidth;\n this.cacheTranslationY =\n Math.round(canvas.height / 2 - drawingHeight) + drawingHeight;\n context.translate(this.cacheTranslationX, this.cacheTranslationY);\n context.scale(zoomX, zoomY);\n this.zoomX = zoomX;\n this.zoomY = zoomY;\n return true;\n }\n return false;\n }\n\n /**\n * Sets object's properties from options, for class constructor only.\n * Needs to be overridden for different defaults.\n * @protected\n * @param {Object} [options] Options object\n */\n protected setOptions(options: Record = {}) {\n this._setOptions(options);\n }\n\n /**\n * Transforms context when rendering an object\n * @param {CanvasRenderingContext2D} ctx Context\n */\n transform(ctx: CanvasRenderingContext2D) {\n const needFullTransform =\n (this.group && !this.group._transformDone) ||\n (this.group && this.canvas && ctx === (this.canvas as Canvas).contextTop);\n const m = this.calcTransformMatrix(!needFullTransform);\n ctx.transform(m[0], m[1], m[2], m[3], m[4], m[5]);\n }\n\n /**\n * Return the object scale factor counting also the group scaling\n * @return {Point}\n */\n getObjectScaling() {\n // if the object is a top level one, on the canvas, we go for simple aritmetic\n // otherwise the complex method with angles will return approximations and decimals\n // and will likely kill the cache when not needed\n // https://github.com/fabricjs/fabric.js/issues/7157\n if (!this.group) {\n return new Point(Math.abs(this.scaleX), Math.abs(this.scaleY));\n }\n // if we are inside a group total zoom calculation is complex, we defer to generic matrices\n const options = qrDecompose(this.calcTransformMatrix());\n return new Point(Math.abs(options.scaleX), Math.abs(options.scaleY));\n }\n\n /**\n * Return the object scale factor counting also the group scaling, zoom and retina\n * @return {Object} object with scaleX and scaleY properties\n */\n getTotalObjectScaling() {\n const scale = this.getObjectScaling();\n if (this.canvas) {\n const zoom = this.canvas.getZoom();\n const retina = this.getCanvasRetinaScaling();\n return scale.scalarMultiply(zoom * retina);\n }\n return scale;\n }\n\n /**\n * Return the object opacity counting also the group property\n * @return {Number}\n */\n getObjectOpacity() {\n let opacity = this.opacity;\n if (this.group) {\n opacity *= this.group.getObjectOpacity();\n }\n return opacity;\n }\n\n /**\n * Makes sure the scale is valid and modifies it if necessary\n * @todo: this is a control action issue, not a geometry one\n * @private\n * @param {Number} value, unconstrained\n * @return {Number} constrained value;\n */\n _constrainScale(value: number): number {\n if (Math.abs(value) < this.minScaleLimit) {\n if (value < 0) {\n return -this.minScaleLimit;\n } else {\n return this.minScaleLimit;\n }\n } else if (value === 0) {\n return 0.0001;\n }\n return value;\n }\n\n /**\n * Handles setting values on the instance and handling internal side effects\n * @protected\n * @param {String} key\n * @param {*} value\n */\n _set(key: string, value: any) {\n if (key === SCALE_X || key === SCALE_Y) {\n value = this._constrainScale(value);\n }\n if (key === SCALE_X && value < 0) {\n this.flipX = !this.flipX;\n value *= -1;\n } else if (key === 'scaleY' && value < 0) {\n this.flipY = !this.flipY;\n value *= -1;\n // i don't like this automatic initialization here\n } else if (key === 'shadow' && value && !(value instanceof Shadow)) {\n value = new Shadow(value);\n }\n\n const isChanged = this[key as keyof this] !== value;\n this[key as keyof this] = value;\n\n // invalidate caches\n if (\n isChanged &&\n (this.constructor as typeof FabricObject).cacheProperties.includes(key)\n ) {\n this.dirty = true;\n }\n // a dirty child makes the parent dirty.\n // but a non dirty child does not make the parent not dirty.\n // the parent could be dirty for some other reason.\n this.parent &&\n (this.dirty ||\n (isChanged &&\n (this.constructor as typeof FabricObject).stateProperties.includes(\n key,\n ))) &&\n this.parent._set('dirty', true);\n\n return this;\n }\n\n /**\n * return if the object would be visible in rendering\n * @return {Boolean}\n */\n isNotVisible() {\n return (\n this.opacity === 0 ||\n (!this.width && !this.height && this.strokeWidth === 0) ||\n !this.visible\n );\n }\n\n /**\n * Renders an object on a specified context\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n render(ctx: CanvasRenderingContext2D) {\n // do not render if width/height are zeros or object is not visible\n if (this.isNotVisible()) {\n return;\n }\n if (\n this.canvas &&\n this.canvas.skipOffscreen &&\n !this.group &&\n !this.isOnScreen()\n ) {\n return;\n }\n ctx.save();\n this._setupCompositeOperation(ctx);\n this.drawSelectionBackground(ctx);\n this.transform(ctx);\n this._setOpacity(ctx);\n this._setShadow(ctx);\n if (this.shouldCache()) {\n (this as TCachedFabricObject).renderCache();\n (this as TCachedFabricObject).drawCacheOnCanvas(ctx);\n } else {\n this._removeCacheCanvas();\n this.drawObject(ctx, false, {});\n this.dirty = false;\n }\n ctx.restore();\n }\n\n drawSelectionBackground(_ctx: CanvasRenderingContext2D) {\n /* no op */\n }\n\n renderCache(this: TCachedFabricObject, options?: any) {\n options = options || {};\n if (!this._cacheCanvas || !this._cacheContext) {\n this._createCacheCanvas();\n }\n if (this.isCacheDirty() && this._cacheContext) {\n const { zoomX, zoomY, cacheTranslationX, cacheTranslationY } = this;\n const { width, height } = this._cacheCanvas;\n this.drawObject(this._cacheContext, options.forClipping, {\n zoomX,\n zoomY,\n cacheTranslationX,\n cacheTranslationY,\n width,\n height,\n parentClipPaths: [],\n });\n this.dirty = false;\n }\n }\n\n /**\n * Remove cacheCanvas and its dimensions from the objects\n */\n _removeCacheCanvas() {\n this._cacheCanvas = undefined;\n this._cacheContext = null;\n }\n\n /**\n * return true if the object will draw a stroke\n * Does not consider text styles. This is just a shortcut used at rendering time\n * We want it to be an approximation and be fast.\n * wrote to avoid extra caching, it has to return true when stroke happens,\n * can guess when it will not happen at 100% chance, does not matter if it misses\n * some use case where the stroke is invisible.\n * @since 3.0.0\n * @returns Boolean\n */\n hasStroke(): boolean {\n return (\n !!this.stroke && this.stroke !== 'transparent' && this.strokeWidth !== 0\n );\n }\n\n /**\n * return true if the object will draw a fill\n * Does not consider text styles. This is just a shortcut used at rendering time\n * We want it to be an approximation and be fast.\n * wrote to avoid extra caching, it has to return true when fill happens,\n * can guess when it will not happen at 100% chance, does not matter if it misses\n * some use case where the fill is invisible.\n * @since 3.0.0\n * @returns Boolean\n */\n hasFill(): boolean {\n return !!this.fill && this.fill !== 'transparent';\n }\n\n /**\n * When returns `true`, force the object to have its own cache, even if it is inside a group\n * it may be needed when your object behave in a particular way on the cache and always needs\n * its own isolated canvas to render correctly.\n * Created to be overridden\n * since 1.7.12\n * @returns Boolean\n */\n needsItsOwnCache() {\n // TODO re-evaluate this shadow condition\n if (\n this.paintFirst === STROKE &&\n this.hasFill() &&\n this.hasStroke() &&\n !!this.shadow\n ) {\n return true;\n }\n if (this.clipPath) {\n return true;\n }\n return false;\n }\n\n /**\n * Decide if the object should cache or not. Create its own cache level\n * objectCaching is a global flag, wins over everything\n * needsItsOwnCache should be used when the object drawing method requires\n * a cache step.\n * Generally you do not cache objects in groups because the group outside is cached.\n * Read as: cache if is needed, or if the feature is enabled but we are not already caching.\n * @return {Boolean}\n */\n shouldCache() {\n this.ownCaching =\n (this.objectCaching && (!this.parent || !this.parent.isOnACache())) ||\n this.needsItsOwnCache();\n return this.ownCaching;\n }\n\n /**\n * Check if this object will cast a shadow with an offset.\n * used by Group.shouldCache to know if child has a shadow recursively\n * @return {Boolean}\n * @deprecated\n */\n willDrawShadow() {\n return (\n !!this.shadow && (this.shadow.offsetX !== 0 || this.shadow.offsetY !== 0)\n );\n }\n\n /**\n * Execute the drawing operation for an object clipPath\n * @param {CanvasRenderingContext2D} ctx Context to render on\n * @param {FabricObject} clipPath\n */\n drawClipPathOnCache(\n ctx: CanvasRenderingContext2D,\n clipPath: FabricObject,\n canvasWithClipPath: HTMLCanvasElement,\n ) {\n ctx.save();\n // DEBUG: uncomment this line, comment the following\n // ctx.globalAlpha = 0.4\n if (clipPath.inverted) {\n ctx.globalCompositeOperation = 'destination-out';\n } else {\n ctx.globalCompositeOperation = 'destination-in';\n }\n ctx.setTransform(1, 0, 0, 1, 0, 0);\n ctx.drawImage(canvasWithClipPath, 0, 0);\n ctx.restore();\n }\n\n /**\n * Execute the drawing operation for an object on a specified context\n * @param {CanvasRenderingContext2D} ctx Context to render on\n * @param {boolean} forClipping apply clipping styles\n * @param {DrawContext} context additional context for rendering\n */\n drawObject(\n ctx: CanvasRenderingContext2D,\n forClipping: boolean | undefined,\n context: DrawContext,\n ) {\n const originalFill = this.fill,\n originalStroke = this.stroke;\n if (forClipping) {\n this.fill = 'black';\n this.stroke = '';\n this._setClippingProperties(ctx);\n } else {\n this._renderBackground(ctx);\n }\n this._render(ctx);\n this._drawClipPath(ctx, this.clipPath, context);\n this.fill = originalFill;\n this.stroke = originalStroke;\n }\n\n private createClipPathLayer(\n this: TCachedFabricObject,\n clipPath: FabricObject,\n context: DrawContext,\n ) {\n const canvas = createCanvasElementFor(context as TSize);\n const ctx = canvas.getContext('2d')!;\n ctx.translate(context.cacheTranslationX, context.cacheTranslationY);\n ctx.scale(context.zoomX, context.zoomY);\n clipPath._cacheCanvas = canvas;\n context.parentClipPaths.forEach((prevClipPath) => {\n prevClipPath.transform(ctx);\n });\n context.parentClipPaths.push(clipPath);\n if (clipPath.absolutePositioned) {\n const m = invertTransform(this.calcTransformMatrix());\n ctx.transform(m[0], m[1], m[2], m[3], m[4], m[5]);\n }\n clipPath.transform(ctx);\n clipPath.drawObject(ctx, true, context);\n return canvas;\n }\n\n /**\n * Prepare clipPath state and cache and draw it on instance's cache\n * @param {CanvasRenderingContext2D} ctx\n * @param {FabricObject} clipPath\n */\n _drawClipPath(\n ctx: CanvasRenderingContext2D,\n clipPath: FabricObject | undefined,\n context: DrawContext,\n ) {\n if (!clipPath) {\n return;\n }\n // needed to setup _transformDone\n // TODO find a better solution?\n clipPath._transformDone = true;\n const canvas = (this as TCachedFabricObject).createClipPathLayer(\n clipPath,\n context,\n );\n this.drawClipPathOnCache(ctx, clipPath, canvas);\n }\n\n /**\n * Paint the cached copy of the object on the target context.\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n drawCacheOnCanvas(this: TCachedFabricObject, ctx: CanvasRenderingContext2D) {\n ctx.scale(1 / this.zoomX, 1 / this.zoomY);\n ctx.drawImage(\n this._cacheCanvas,\n -this.cacheTranslationX,\n -this.cacheTranslationY,\n );\n }\n\n /**\n * Check if cache is dirty and if is dirty clear the context.\n * This check has a big side effect, it changes the underlying cache canvas if necessary.\n * Do not call this method on your own to check if the cache is dirty, because if it is,\n * it is also going to wipe the cache. This is badly designed and needs to be fixed.\n * @param {Boolean} skipCanvas skip canvas checks because this object is painted\n * on parent canvas.\n */\n isCacheDirty(skipCanvas = false) {\n if (this.isNotVisible()) {\n return false;\n }\n const canvas = this._cacheCanvas;\n const ctx = this._cacheContext;\n if (canvas && ctx && !skipCanvas && this._updateCacheCanvas()) {\n // in this case the context is already cleared.\n return true;\n } else {\n if (this.dirty || (this.clipPath && this.clipPath.absolutePositioned)) {\n if (canvas && ctx && !skipCanvas) {\n ctx.save();\n ctx.setTransform(1, 0, 0, 1, 0, 0);\n ctx.clearRect(0, 0, canvas.width, canvas.height);\n ctx.restore();\n }\n return true;\n }\n }\n return false;\n }\n\n /**\n * Draws a background for the object big as its untransformed dimensions\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _renderBackground(ctx: CanvasRenderingContext2D) {\n if (!this.backgroundColor) {\n return;\n }\n const dim = this._getNonTransformedDimensions();\n ctx.fillStyle = this.backgroundColor;\n\n ctx.fillRect(-dim.x / 2, -dim.y / 2, dim.x, dim.y);\n // if there is background color no other shadows\n // should be casted\n this._removeShadow(ctx);\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _setOpacity(ctx: CanvasRenderingContext2D) {\n if (this.group && !this.group._transformDone) {\n ctx.globalAlpha = this.getObjectOpacity();\n } else {\n ctx.globalAlpha *= this.opacity;\n }\n }\n\n _setStrokeStyles(\n ctx: CanvasRenderingContext2D,\n decl: Pick<\n this,\n | 'stroke'\n | 'strokeWidth'\n | 'strokeLineCap'\n | 'strokeDashOffset'\n | 'strokeLineJoin'\n | 'strokeMiterLimit'\n >,\n ) {\n const stroke = decl.stroke;\n if (stroke) {\n ctx.lineWidth = decl.strokeWidth;\n ctx.lineCap = decl.strokeLineCap;\n ctx.lineDashOffset = decl.strokeDashOffset;\n ctx.lineJoin = decl.strokeLineJoin;\n ctx.miterLimit = decl.strokeMiterLimit;\n if (isFiller(stroke)) {\n if (\n (stroke as Gradient<'linear'>).gradientUnits === 'percentage' ||\n (stroke as Gradient<'linear'>).gradientTransform ||\n (stroke as Pattern).patternTransform\n ) {\n // need to transform gradient in a pattern.\n // this is a slow process. If you are hitting this codepath, and the object\n // is not using caching, you should consider switching it on.\n // we need a canvas as big as the current object caching canvas.\n this._applyPatternForTransformedGradient(ctx, stroke);\n } else {\n // is a simple gradient or pattern\n ctx.strokeStyle = stroke.toLive(ctx)!;\n this._applyPatternGradientTransform(ctx, stroke);\n }\n } else {\n // is a color\n ctx.strokeStyle = decl.stroke as string;\n }\n }\n }\n\n _setFillStyles(ctx: CanvasRenderingContext2D, { fill }: Pick) {\n if (fill) {\n if (isFiller(fill)) {\n ctx.fillStyle = fill.toLive(ctx)!;\n this._applyPatternGradientTransform(ctx, fill);\n } else {\n ctx.fillStyle = fill;\n }\n }\n }\n\n _setClippingProperties(ctx: CanvasRenderingContext2D) {\n ctx.globalAlpha = 1;\n ctx.strokeStyle = 'transparent';\n ctx.fillStyle = '#000000';\n }\n\n /**\n * @private\n * Sets line dash\n * @param {CanvasRenderingContext2D} ctx Context to set the dash line on\n * @param {Array} dashArray array representing dashes\n */\n _setLineDash(ctx: CanvasRenderingContext2D, dashArray?: number[] | null) {\n if (!dashArray || dashArray.length === 0) {\n return;\n }\n ctx.setLineDash(dashArray);\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _setShadow(ctx: CanvasRenderingContext2D) {\n if (!this.shadow) {\n return;\n }\n\n const shadow = this.shadow,\n canvas = this.canvas,\n retinaScaling = this.getCanvasRetinaScaling(),\n [sx, , , sy] = canvas?.viewportTransform || iMatrix,\n multX = sx * retinaScaling,\n multY = sy * retinaScaling,\n scaling = shadow.nonScaling ? new Point(1, 1) : this.getObjectScaling();\n ctx.shadowColor = shadow.color;\n ctx.shadowBlur =\n (shadow.blur *\n config.browserShadowBlurConstant *\n (multX + multY) *\n (scaling.x + scaling.y)) /\n 4;\n ctx.shadowOffsetX = shadow.offsetX * multX * scaling.x;\n ctx.shadowOffsetY = shadow.offsetY * multY * scaling.y;\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _removeShadow(ctx: CanvasRenderingContext2D) {\n if (!this.shadow) {\n return;\n }\n\n ctx.shadowColor = '';\n ctx.shadowBlur = ctx.shadowOffsetX = ctx.shadowOffsetY = 0;\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n * @param {TFiller} filler {@link Pattern} or {@link Gradient}\n */\n _applyPatternGradientTransform(\n ctx: CanvasRenderingContext2D,\n filler: TFiller,\n ) {\n if (!isFiller(filler)) {\n return { offsetX: 0, offsetY: 0 };\n }\n const t =\n (filler as Gradient<'linear'>).gradientTransform ||\n (filler as Pattern).patternTransform;\n const offsetX = -this.width / 2 + filler.offsetX || 0,\n offsetY = -this.height / 2 + filler.offsetY || 0;\n\n if ((filler as Gradient<'linear'>).gradientUnits === 'percentage') {\n ctx.transform(this.width, 0, 0, this.height, offsetX, offsetY);\n } else {\n ctx.transform(1, 0, 0, 1, offsetX, offsetY);\n }\n if (t) {\n ctx.transform(t[0], t[1], t[2], t[3], t[4], t[5]);\n }\n return { offsetX: offsetX, offsetY: offsetY };\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _renderPaintInOrder(ctx: CanvasRenderingContext2D) {\n if (this.paintFirst === STROKE) {\n this._renderStroke(ctx);\n this._renderFill(ctx);\n } else {\n this._renderFill(ctx);\n this._renderStroke(ctx);\n }\n }\n\n /**\n * @private\n * function that actually render something on the context.\n * empty here to allow Obects to work on tests to benchmark fabric functionalites\n * not related to rendering\n * @param {CanvasRenderingContext2D} _ctx Context to render on\n */\n _render(_ctx: CanvasRenderingContext2D) {\n // placeholder to be overridden\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _renderFill(ctx: CanvasRenderingContext2D) {\n if (!this.fill) {\n return;\n }\n\n ctx.save();\n this._setFillStyles(ctx, this);\n if (this.fillRule === 'evenodd') {\n ctx.fill('evenodd');\n } else {\n ctx.fill();\n }\n ctx.restore();\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _renderStroke(ctx: CanvasRenderingContext2D) {\n if (!this.stroke || this.strokeWidth === 0) {\n return;\n }\n\n if (this.shadow && !this.shadow.affectStroke) {\n this._removeShadow(ctx);\n }\n\n ctx.save();\n if (this.strokeUniform) {\n const scaling = this.getObjectScaling();\n ctx.scale(1 / scaling.x, 1 / scaling.y);\n }\n this._setLineDash(ctx, this.strokeDashArray);\n this._setStrokeStyles(ctx, this);\n ctx.stroke();\n ctx.restore();\n }\n\n /**\n * This function try to patch the missing gradientTransform on canvas gradients.\n * transforming a context to transform the gradient, is going to transform the stroke too.\n * we want to transform the gradient but not the stroke operation, so we create\n * a transformed gradient on a pattern and then we use the pattern instead of the gradient.\n * this method has drawbacks: is slow, is in low resolution, needs a patch for when the size\n * is limited.\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n * @param {Gradient} filler\n */\n _applyPatternForTransformedGradient(\n ctx: CanvasRenderingContext2D,\n filler: TFiller,\n ) {\n const dims = this._limitCacheSize(this._getCacheCanvasDimensions()),\n retinaScaling = this.getCanvasRetinaScaling(),\n width = dims.x / this.scaleX / retinaScaling,\n height = dims.y / this.scaleY / retinaScaling,\n pCanvas = createCanvasElementFor({\n // in case width and height are less than 1px, we have to round up.\n // since the pattern is no-repeat, this is fine\n width: Math.ceil(width),\n height: Math.ceil(height),\n });\n\n const pCtx = pCanvas.getContext('2d');\n if (!pCtx) {\n return;\n }\n pCtx.beginPath();\n pCtx.moveTo(0, 0);\n pCtx.lineTo(width, 0);\n pCtx.lineTo(width, height);\n pCtx.lineTo(0, height);\n pCtx.closePath();\n pCtx.translate(width / 2, height / 2);\n pCtx.scale(\n dims.zoomX / this.scaleX / retinaScaling,\n dims.zoomY / this.scaleY / retinaScaling,\n );\n this._applyPatternGradientTransform(pCtx, filler);\n pCtx.fillStyle = filler.toLive(ctx)!;\n pCtx.fill();\n ctx.translate(\n -this.width / 2 - this.strokeWidth / 2,\n -this.height / 2 - this.strokeWidth / 2,\n );\n ctx.scale(\n (retinaScaling * this.scaleX) / dims.zoomX,\n (retinaScaling * this.scaleY) / dims.zoomY,\n );\n ctx.strokeStyle = pCtx.createPattern(pCanvas, 'no-repeat') ?? '';\n }\n\n /**\n * This function is an helper for svg import. it returns the center of the object in the svg\n * untransformed coordinates\n * @private\n * @return {Point} center point from element coordinates\n */\n _findCenterFromElement() {\n return new Point(this.left + this.width / 2, this.top + this.height / 2);\n }\n\n /**\n * Clones an instance.\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @returns {Promise}\n */\n clone(propertiesToInclude?: string[]): Promise {\n const objectForm = this.toObject(propertiesToInclude);\n return (this.constructor as typeof FabricObject).fromObject(\n objectForm,\n ) as unknown as Promise;\n }\n\n /**\n * Creates an instance of Image out of an object\n * makes use of toCanvasElement.\n * Once this method was based on toDataUrl and loadImage, so it also had a quality\n * and format option. toCanvasElement is faster and produce no loss of quality.\n * If you need to get a real Jpeg or Png from an object, using toDataURL is the right way to do it.\n * toCanvasElement and then toBlob from the obtained canvas is also a good option.\n * @todo fix the export type, it could not be Image but the type that getClass return for 'image'.\n * @param {ObjectToCanvasElementOptions} [options] for clone as image, passed to toDataURL\n * @param {Number} [options.multiplier=1] Multiplier to scale by\n * @param {Number} [options.left] Cropping left offset. Introduced in v1.2.14\n * @param {Number} [options.top] Cropping top offset. Introduced in v1.2.14\n * @param {Number} [options.width] Cropping width. Introduced in v1.2.14\n * @param {Number} [options.height] Cropping height. Introduced in v1.2.14\n * @param {Boolean} [options.enableRetinaScaling] Enable retina scaling for clone image. Introduce in 1.6.4\n * @param {Boolean} [options.withoutTransform] Remove current object transform ( no scale , no angle, no flip, no skew ). Introduced in 2.3.4\n * @param {Boolean} [options.withoutShadow] Remove current object shadow. Introduced in 2.4.2\n * @return {FabricImage} Object cloned as image.\n */\n cloneAsImage(options: ObjectToCanvasElementOptions): FabricImage {\n const canvasEl = this.toCanvasElement(options);\n // TODO: how to import Image w/o an import cycle?\n const ImageClass = classRegistry.getClass('image');\n return new ImageClass(canvasEl);\n }\n\n /**\n * Converts an object into a HTMLCanvas element\n * @param {ObjectToCanvasElementOptions} options Options object\n * @param {Number} [options.multiplier=1] Multiplier to scale by\n * @param {Number} [options.left] Cropping left offset. Introduced in v1.2.14\n * @param {Number} [options.top] Cropping top offset. Introduced in v1.2.14\n * @param {Number} [options.width] Cropping width. Introduced in v1.2.14\n * @param {Number} [options.height] Cropping height. Introduced in v1.2.14\n * @param {Boolean} [options.enableRetinaScaling] Enable retina scaling for clone image. Introduce in 1.6.4\n * @param {Boolean} [options.withoutTransform] Remove current object transform ( no scale , no angle, no flip, no skew ). Introduced in 2.3.4\n * @param {Boolean} [options.withoutShadow] Remove current object shadow. Introduced in 2.4.2\n * @param {Boolean} [options.viewportTransform] Account for canvas viewport transform\n * @param {(el?: HTMLCanvasElement) => StaticCanvas} [options.canvasProvider] Create the output canvas\n * @return {HTMLCanvasElement} Returns DOM element with the FabricObject\n */\n toCanvasElement(options: ObjectToCanvasElementOptions = {}) {\n const origParams = saveObjectTransform(this),\n originalGroup = this.group,\n originalShadow = this.shadow,\n abs = Math.abs,\n retinaScaling = options.enableRetinaScaling ? getDevicePixelRatio() : 1,\n multiplier = (options.multiplier || 1) * retinaScaling,\n canvasProvider: (el: HTMLCanvasElement) => StaticCanvas =\n options.canvasProvider ||\n ((el: HTMLCanvasElement) =>\n new StaticCanvas(el, {\n enableRetinaScaling: false,\n renderOnAddRemove: false,\n skipOffscreen: false,\n }));\n delete this.group;\n if (options.withoutTransform) {\n resetObjectTransform(this);\n }\n if (options.withoutShadow) {\n this.shadow = null;\n }\n if (options.viewportTransform) {\n sendObjectToPlane(this, this.getViewportTransform());\n }\n\n this.setCoords();\n const el = createCanvasElement(),\n boundingRect = this.getBoundingRect(),\n shadow = this.shadow,\n shadowOffset = new Point();\n\n if (shadow) {\n const shadowBlur = shadow.blur;\n const scaling = shadow.nonScaling\n ? new Point(1, 1)\n : this.getObjectScaling();\n // consider non scaling shadow.\n shadowOffset.x =\n 2 * Math.round(abs(shadow.offsetX) + shadowBlur) * abs(scaling.x);\n shadowOffset.y =\n 2 * Math.round(abs(shadow.offsetY) + shadowBlur) * abs(scaling.y);\n }\n const width = boundingRect.width + shadowOffset.x,\n height = boundingRect.height + shadowOffset.y;\n // if the current width/height is not an integer\n // we need to make it so.\n el.width = Math.ceil(width);\n el.height = Math.ceil(height);\n const canvas = canvasProvider(el);\n if (options.format === 'jpeg') {\n canvas.backgroundColor = '#fff';\n }\n this.setPositionByOrigin(\n new Point(canvas.width / 2, canvas.height / 2),\n CENTER,\n CENTER,\n );\n const originalCanvas = this.canvas;\n // static canvas and canvas have both an array of InteractiveObjects\n // @ts-expect-error this needs to be fixed somehow, or ignored globally\n canvas._objects = [this];\n this.set('canvas', canvas);\n this.setCoords();\n const canvasEl = canvas.toCanvasElement(multiplier || 1, options);\n this.set('canvas', originalCanvas);\n this.shadow = originalShadow;\n if (originalGroup) {\n this.group = originalGroup;\n }\n this.set(origParams);\n this.setCoords();\n // canvas.dispose will call image.dispose that will nullify the elements\n // since this canvas is a simple element for the process, we remove references\n // to objects in this way in order to avoid object trashing.\n canvas._objects = [];\n // since render has settled it is safe to destroy canvas\n canvas.destroy();\n return canvasEl;\n }\n\n /**\n * Converts an object into a data-url-like string\n * @param {Object} options Options object\n * @param {String} [options.format=png] The format of the output image. Either \"jpeg\" or \"png\"\n * @param {Number} [options.quality=1] Quality level (0..1). Only used for jpeg.\n * @param {Number} [options.multiplier=1] Multiplier to scale by\n * @param {Number} [options.left] Cropping left offset. Introduced in v1.2.14\n * @param {Number} [options.top] Cropping top offset. Introduced in v1.2.14\n * @param {Number} [options.width] Cropping width. Introduced in v1.2.14\n * @param {Number} [options.height] Cropping height. Introduced in v1.2.14\n * @param {Boolean} [options.enableRetinaScaling] Enable retina scaling for clone image. Introduce in 1.6.4\n * @param {Boolean} [options.withoutTransform] Remove current object transform ( no scale , no angle, no flip, no skew ). Introduced in 2.3.4\n * @param {Boolean} [options.withoutShadow] Remove current object shadow. Introduced in 2.4.2\n * @return {String} Returns a data: URL containing a representation of the object in the format specified by options.format\n */\n toDataURL(options: toDataURLOptions = {}) {\n return toDataURL(\n this.toCanvasElement(options),\n options.format || 'png',\n options.quality || 1,\n );\n }\n toBlob(options: toDataURLOptions = {}) {\n return toBlob(\n this.toCanvasElement(options),\n options.format || 'png',\n options.quality || 1,\n );\n }\n\n /**\n * Checks if the instance is of any of the specified types.\n * We use this to filter a list of objects for the `getObjects` function.\n *\n * For detecting an instance type `instanceOf` is a better check,\n * but to avoid to make specific classes a dependency of generic code\n * internally we use this.\n *\n * This compares both the static class `type` and the instance's own `type` property\n * against the provided list of types.\n *\n * @param types - A list of type strings to check against.\n * @returns `true` if the object's type or class type matches any in the list, otherwise `false`.\n */\n isType(...types: string[]) {\n return (\n types.includes((this.constructor as typeof FabricObject).type) ||\n types.includes(this.type)\n );\n }\n\n /**\n * Returns complexity of an instance\n * @return {Number} complexity of this instance (is 1 unless subclassed)\n */\n complexity() {\n return 1;\n }\n\n /**\n * Returns a JSON representation of an instance\n * @return {Object} JSON\n */\n toJSON() {\n // delegate, not alias\n return this.toObject();\n }\n\n /**\n * Sets \"angle\" of an instance with centered rotation\n * @param {TDegree} angle Angle value (in degrees)\n */\n rotate(angle: TDegree) {\n const { centeredRotation, originX, originY } = this;\n\n if (centeredRotation) {\n const { x, y } = this.getRelativeCenterPoint();\n this.originX = CENTER;\n this.originY = CENTER;\n this.left = x;\n this.top = y;\n }\n\n this.set('angle', angle);\n\n if (centeredRotation) {\n const { x, y } = this.translateToOriginPoint(\n this.getRelativeCenterPoint(),\n originX,\n originY,\n );\n this.left = x;\n this.top = y;\n this.originX = originX;\n this.originY = originY;\n }\n }\n\n /**\n * This callback function is called by the parent group of an object every\n * time a non-delegated property changes on the group. It is passed the key\n * and value as parameters. Not adding in this function's signature to avoid\n * Travis build error about unused variables.\n */\n setOnGroup() {\n // implemented by sub-classes, as needed.\n }\n\n /**\n * Sets canvas globalCompositeOperation for specific object\n * custom composition operation for the particular object can be specified using globalCompositeOperation property\n * @param {CanvasRenderingContext2D} ctx Rendering canvas context\n */\n _setupCompositeOperation(ctx: CanvasRenderingContext2D) {\n if (this.globalCompositeOperation) {\n ctx.globalCompositeOperation = this.globalCompositeOperation;\n }\n }\n\n /**\n * cancel instance's running animations\n * override if necessary to dispose artifacts such as `clipPath`\n */\n dispose() {\n runningAnimations.cancelByTarget(this);\n this.off();\n this._set('canvas', undefined);\n // clear caches\n this._cacheCanvas && getEnv().dispose(this._cacheCanvas);\n this._cacheCanvas = undefined;\n this._cacheContext = null;\n }\n\n // #region Animation methods\n /**\n * List of properties to consider for animating colors.\n * @type String[]\n */\n static colorProperties: string[] = [FILL, STROKE, 'backgroundColor'];\n\n /**\n * Animates object's properties\n * @param {Record} animatable map of keys and end values\n * @param {Partial>} options\n * @see {@link http://fabric5.fabricjs.com/fabric-intro-part-2#animation}\n * @return {Record>} map of animation contexts\n *\n * As object — multiple properties\n *\n * object.animate({ left: ..., top: ... });\n * object.animate({ left: ..., top: ... }, { duration: ... });\n */\n animate(\n animatable: Record,\n options?: Partial>,\n ): Record> {\n return Object.entries(animatable).reduce(\n (acc, [key, endValue]) => {\n acc[key] = this._animate(key, endValue, options);\n return acc;\n },\n {} as Record>,\n );\n }\n\n /**\n * @private\n * @param {String} key Property to animate\n * @param {String} to Value to animate to\n * @param {Object} [options] Options object\n */\n _animate(\n key: string,\n endValue: T,\n options: Partial> = {},\n ): TAnimation {\n const path = key.split('.');\n const propIsColor = (\n this.constructor as typeof FabricObject\n ).colorProperties.includes(path[path.length - 1]);\n const { abort, startValue, onChange, onComplete } = options;\n const animationOptions = {\n ...options,\n target: this,\n // path.reduce... is the current value in case start value isn't provided\n startValue:\n startValue ?? path.reduce((deep: any, key) => deep[key], this),\n endValue,\n abort: abort?.bind(this),\n onChange: (\n value: number | number[] | string,\n valueProgress: number,\n durationProgress: number,\n ) => {\n path.reduce((deep: Record, key, index) => {\n if (index === path.length - 1) {\n deep[key] = value;\n }\n return deep[key];\n }, this);\n onChange &&\n // @ts-expect-error generic callback arg0 is wrong\n onChange(value, valueProgress, durationProgress);\n },\n onComplete: (\n value: number | number[] | string,\n valueProgress: number,\n durationProgress: number,\n ) => {\n this.setCoords();\n onComplete &&\n // @ts-expect-error generic callback arg0 is wrong\n onComplete(value, valueProgress, durationProgress);\n },\n } as AnimationOptions;\n\n return (\n propIsColor\n ? animateColor(animationOptions as ColorAnimationOptions)\n : animate(\n animationOptions as ValueAnimationOptions | ArrayAnimationOptions,\n )\n ) as TAnimation;\n }\n\n // #region Object stacking methods\n\n /**\n * A reference to the parent of the object\n * Used to keep the original parent ref when the object has been added to an ActiveSelection, hence loosing the `group` ref\n */\n declare parent?: Group;\n\n /**\n * Checks if object is descendant of target\n * Should be used instead of {@link Group.contains} or {@link StaticCanvas.contains} for performance reasons\n * @param {TAncestor} target\n * @returns {boolean}\n */\n isDescendantOf(target: TAncestor): boolean {\n const { parent, group } = this;\n return (\n parent === target ||\n group === target ||\n // walk up\n (!!parent && parent.isDescendantOf(target)) ||\n (!!group && group !== parent && group.isDescendantOf(target))\n );\n }\n\n /**\n * @returns {Ancestors} ancestors (excluding `ActiveSelection`) from bottom to top\n */\n getAncestors(): Ancestors {\n const ancestors: TAncestor[] = [];\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n let parent: TAncestor | undefined = this;\n do {\n parent = parent.parent;\n parent && ancestors.push(parent);\n } while (parent);\n return ancestors as Ancestors;\n }\n\n /**\n * Compare ancestors\n *\n * @param {StackedObject} other\n * @returns {AncestryComparison} an object that represent the ancestry situation.\n */\n findCommonAncestors(other: T): AncestryComparison {\n if (this === other) {\n return {\n fork: [],\n otherFork: [],\n common: [this, ...this.getAncestors()],\n } as AncestryComparison;\n }\n const ancestors = this.getAncestors();\n const otherAncestors = other.getAncestors();\n // if `this` has no ancestors and `this` is top ancestor of `other` we must handle the following case\n if (\n ancestors.length === 0 &&\n otherAncestors.length > 0 &&\n this === otherAncestors[otherAncestors.length - 1]\n ) {\n return {\n fork: [],\n otherFork: [\n other,\n ...otherAncestors.slice(0, otherAncestors.length - 1),\n ],\n common: [this],\n } as AncestryComparison;\n }\n // compare ancestors\n for (let i = 0, ancestor; i < ancestors.length; i++) {\n ancestor = ancestors[i];\n if (ancestor === other) {\n return {\n fork: [this, ...ancestors.slice(0, i)],\n otherFork: [],\n common: ancestors.slice(i),\n } as AncestryComparison;\n }\n for (let j = 0; j < otherAncestors.length; j++) {\n if (this === otherAncestors[j]) {\n return {\n fork: [],\n otherFork: [other, ...otherAncestors.slice(0, j)],\n common: [this, ...ancestors],\n } as AncestryComparison;\n }\n if (ancestor === otherAncestors[j]) {\n return {\n fork: [this, ...ancestors.slice(0, i)],\n otherFork: [other, ...otherAncestors.slice(0, j)],\n common: ancestors.slice(i),\n } as AncestryComparison;\n }\n }\n }\n // nothing shared\n return {\n fork: [this, ...ancestors],\n otherFork: [other, ...otherAncestors],\n common: [],\n } as AncestryComparison;\n }\n\n /**\n *\n * @param {StackedObject} other\n * @returns {boolean}\n */\n hasCommonAncestors(other: T): boolean {\n const commonAncestors = this.findCommonAncestors(other);\n return commonAncestors && !!commonAncestors.common.length;\n }\n\n /**\n *\n * @param {FabricObject} other object to compare against\n * @returns {boolean | undefined} if objects do not share a common ancestor or they are strictly equal it is impossible to determine which is in front of the other; in such cases the function returns `undefined`\n */\n isInFrontOf(other: T): boolean | undefined {\n if (this === other) {\n return undefined;\n }\n const ancestorData = this.findCommonAncestors(other);\n\n if (ancestorData.fork.includes(other as any)) {\n return true;\n }\n if (ancestorData.otherFork.includes(this as any)) {\n return false;\n }\n // if there isn't a common ancestor, we take the canvas.\n // if there is no canvas, there is nothing to compare\n const firstCommonAncestor = ancestorData.common[0] || this.canvas;\n if (!firstCommonAncestor) {\n return undefined;\n }\n const headOfFork = ancestorData.fork.pop(),\n headOfOtherFork = ancestorData.otherFork.pop(),\n thisIndex = (firstCommonAncestor as TCollection)._objects.indexOf(\n headOfFork as any,\n ),\n otherIndex = (firstCommonAncestor as TCollection)._objects.indexOf(\n headOfOtherFork as any,\n );\n return thisIndex > -1 && thisIndex > otherIndex;\n }\n\n // #region Serialization\n /**\n * Define a list of custom properties that will be serialized when\n * instance.toObject() gets called\n */\n static customProperties: string[] = [];\n\n /**\n * Returns an object representation of an instance\n * @param {string[]} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} Object representation of an instance\n */\n toObject(propertiesToInclude: any[] = []): any {\n const propertiesToSerialize = propertiesToInclude.concat(\n FabricObject.customProperties,\n (this.constructor as typeof FabricObject).customProperties || [],\n );\n let clipPathData: Partial | undefined;\n const NUM_FRACTION_DIGITS = config.NUM_FRACTION_DIGITS;\n const {\n clipPath,\n fill,\n stroke,\n shadow,\n strokeDashArray,\n left,\n top,\n originX,\n originY,\n width,\n height,\n strokeWidth,\n strokeLineCap,\n strokeDashOffset,\n strokeLineJoin,\n strokeUniform,\n strokeMiterLimit,\n scaleX,\n scaleY,\n angle,\n flipX,\n flipY,\n opacity,\n visible,\n backgroundColor,\n fillRule,\n paintFirst,\n globalCompositeOperation,\n skewX,\n skewY,\n } = this;\n if (clipPath && !clipPath.excludeFromExport) {\n clipPathData = clipPath.toObject(\n propertiesToSerialize.concat('inverted', 'absolutePositioned'),\n );\n }\n const toFixedBound = (val: number) => toFixed(val, NUM_FRACTION_DIGITS);\n const object = {\n ...pick(this, propertiesToSerialize as (keyof this)[]),\n type: (this.constructor as typeof FabricObject).type,\n version: VERSION,\n originX,\n originY,\n left: toFixedBound(left),\n top: toFixedBound(top),\n width: toFixedBound(width),\n height: toFixedBound(height),\n fill: isSerializableFiller(fill) ? fill.toObject() : fill,\n stroke: isSerializableFiller(stroke) ? stroke.toObject() : stroke,\n strokeWidth: toFixedBound(strokeWidth),\n strokeDashArray: strokeDashArray\n ? strokeDashArray.concat()\n : strokeDashArray,\n strokeLineCap,\n strokeDashOffset,\n strokeLineJoin,\n strokeUniform,\n strokeMiterLimit: toFixedBound(strokeMiterLimit),\n scaleX: toFixedBound(scaleX),\n scaleY: toFixedBound(scaleY),\n angle: toFixedBound(angle),\n flipX,\n flipY,\n opacity: toFixedBound(opacity),\n shadow: shadow ? shadow.toObject() : shadow,\n visible,\n backgroundColor,\n fillRule,\n paintFirst,\n globalCompositeOperation,\n skewX: toFixedBound(skewX),\n skewY: toFixedBound(skewY),\n ...(clipPathData ? { clipPath: clipPathData } : null),\n };\n\n return !this.includeDefaultValues\n ? this._removeDefaultValues(object)\n : object;\n }\n\n /**\n * Returns (dataless) object representation of an instance\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} Object representation of an instance\n */\n toDatalessObject(propertiesToInclude?: any[]): any {\n // will be overwritten by subclasses\n return this.toObject(propertiesToInclude);\n }\n\n /**\n * @private\n * @param {Object} object\n */\n _removeDefaultValues(object: T): Partial {\n // getDefaults() ( get from static ownDefaults ) should win over prototype since anyway they get assigned to instance\n // ownDefault vs prototype is swappable only if you change all the fabric objects consistently.\n const defaults = (this.constructor as typeof FabricObject).getDefaults();\n const hasStaticDefaultValues = Object.keys(defaults).length > 0;\n const baseValues = hasStaticDefaultValues\n ? defaults\n : Object.getPrototypeOf(this);\n\n return pickBy(object, (value, key) => {\n if (key === LEFT || key === TOP || key === 'type') {\n return true;\n }\n const baseValue = baseValues[key];\n return (\n value !== baseValue &&\n // basically a check for [] === []\n !(\n Array.isArray(value) &&\n Array.isArray(baseValue) &&\n value.length === 0 &&\n baseValue.length === 0\n )\n );\n });\n }\n\n /**\n * Returns a string representation of an instance\n * @return {String}\n */\n toString() {\n return `#<${(this.constructor as typeof FabricObject).type}>`;\n }\n\n /**\n *\n * @param {Function} klass\n * @param {object} object\n * @param {object} [options]\n * @param {string} [options.extraParam] property to pass as first argument to the constructor\n * @param {AbortSignal} [options.signal] handle aborting, see https://developer.mozilla.org/en-US/docs/Web/API/AbortController/signal\n * @returns {Promise}\n */\n static _fromObject(\n { type, ...serializedObjectOptions }: Record,\n { extraParam, ...options }: Abortable & { extraParam?: string } = {},\n ): Promise {\n return enlivenObjectEnlivables(serializedObjectOptions, options).then(\n (enlivedObjectOptions) => {\n // from the resulting enlived options, extract options.extraParam to arg0\n // to avoid accidental overrides later\n if (extraParam) {\n delete enlivedObjectOptions[extraParam];\n return new this(\n serializedObjectOptions[extraParam],\n // @ts-expect-error different signature\n enlivedObjectOptions,\n );\n } else {\n return new this(enlivedObjectOptions);\n }\n },\n ) as Promise;\n }\n\n /**\n *\n * @param {object} object\n * @param {object} [options]\n * @param {AbortSignal} [options.signal] handle aborting, see https://developer.mozilla.org/en-US/docs/Web/API/AbortController/signal\n * @returns {Promise}\n */\n static fromObject>(\n object: T,\n options?: Abortable,\n ) {\n return this._fromObject(object, options);\n }\n}\n\nclassRegistry.setClass(FabricObject);\nclassRegistry.setClass(FabricObject, 'object');\n","import type {\n TModificationEvents,\n Transform,\n TransformActionHandler,\n} from '../EventTypeDefs';\nimport { fireEvent } from './fireEvent';\nimport { commonEventInfo } from './util';\n\n/**\n * Wrap an action handler with firing an event if the action is performed\n * @param {TModificationEvents} eventName the event we want to fire\n * @param {TransformActionHandler} actionHandler the function to wrap\n * @param {object} extraEventInfo extra information to pas to the event handler\n * @return {TransformActionHandler} a function with an action handler signature\n */\nexport const wrapWithFireEvent = <\n T extends Transform,\n P extends object = Record,\n>(\n eventName: TModificationEvents,\n actionHandler: TransformActionHandler,\n extraEventInfo?: P,\n) => {\n return ((eventData, transform, x, y) => {\n const actionPerformed = actionHandler(eventData, transform, x, y);\n if (actionPerformed) {\n fireEvent(eventName, {\n ...commonEventInfo(eventData, transform, x, y),\n ...extraEventInfo,\n });\n }\n return actionPerformed;\n }) as TransformActionHandler;\n};\n","import type { Transform, TransformActionHandler } from '../EventTypeDefs';\n\n/**\n * Wrap an action handler with saving/restoring object position on the transform.\n * this is the code that permits to objects to keep their position while transforming.\n * @param {Function} actionHandler the function to wrap\n * @return {Function} a function with an action handler signature\n */\nexport function wrapWithFixedAnchor(\n actionHandler: TransformActionHandler,\n) {\n return ((eventData, transform, x, y) => {\n const { target, originX, originY } = transform,\n centerPoint = target.getRelativeCenterPoint(),\n constraint = target.translateToOriginPoint(centerPoint, originX, originY),\n actionPerformed = actionHandler(eventData, transform, x, y);\n // flipping requires to change the transform origin, so we read from the mutated transform\n // instead of leveraging the one destructured before\n target.setPositionByOrigin(\n constraint,\n transform.originX,\n transform.originY,\n );\n return actionPerformed;\n }) as TransformActionHandler;\n}\n","import type { TransformActionHandler } from '../EventTypeDefs';\nimport { CENTER, LEFT, RESIZING, RIGHT } from '../constants';\nimport { resolveOrigin } from '../util/misc/resolveOrigin';\nimport { getLocalPoint, isTransformCentered } from './util';\nimport { wrapWithFireEvent } from './wrapWithFireEvent';\nimport { wrapWithFixedAnchor } from './wrapWithFixedAnchor';\n\n/**\n * Action handler to change object's width\n * Needs to be wrapped with `wrapWithFixedAnchor` to be effective\n * @param {Event} eventData javascript event that is doing the transform\n * @param {Object} transform javascript object containing a series of information around the current transform\n * @param {number} x current mouse x position, canvas normalized\n * @param {number} y current mouse y position, canvas normalized\n * @return {Boolean} true if some change happened\n */\nexport const changeObjectWidth: TransformActionHandler = (\n eventData,\n transform,\n x,\n y,\n) => {\n const localPoint = getLocalPoint(\n transform,\n transform.originX,\n transform.originY,\n x,\n y,\n );\n // make sure the control changes width ONLY from it's side of target\n if (\n resolveOrigin(transform.originX) === resolveOrigin(CENTER) ||\n (resolveOrigin(transform.originX) === resolveOrigin(RIGHT) &&\n localPoint.x < 0) ||\n (resolveOrigin(transform.originX) === resolveOrigin(LEFT) &&\n localPoint.x > 0)\n ) {\n const { target } = transform,\n strokePadding =\n target.strokeWidth / (target.strokeUniform ? target.scaleX : 1),\n multiplier = isTransformCentered(transform) ? 2 : 1,\n oldWidth = target.width,\n newWidth =\n Math.abs((localPoint.x * multiplier) / target.scaleX) - strokePadding;\n target.set('width', Math.max(newWidth, 1));\n // check against actual target width in case `newWidth` was rejected\n return oldWidth !== target.width;\n }\n return false;\n};\n\nexport const changeWidth = wrapWithFireEvent(\n RESIZING,\n wrapWithFixedAnchor(changeObjectWidth),\n);\n","import { FILL, STROKE, twoMathPi } from '../constants';\nimport type { InteractiveFabricObject } from '../shapes/Object/InteractiveObject';\nimport { degreesToRadians } from '../util/misc/radiansDegreesConversion';\nimport type { Control } from './Control';\n\nexport type ControlRenderingStyleOverride = Partial<\n Pick<\n InteractiveFabricObject,\n | 'cornerStyle'\n | 'cornerSize'\n | 'cornerColor'\n | 'cornerStrokeColor'\n | 'cornerDashArray'\n | 'transparentCorners'\n >\n>;\n\nexport type ControlRenderer<\n O extends InteractiveFabricObject = InteractiveFabricObject,\n> = (\n ctx: CanvasRenderingContext2D,\n left: number,\n top: number,\n styleOverride: ControlRenderingStyleOverride,\n fabricObject: O,\n) => void;\n\n/**\n * Render a round control, as per fabric features.\n * This function is written to respect object properties like transparentCorners, cornerSize\n * cornerColor, cornerStrokeColor\n * plus the addition of offsetY and offsetX.\n * @param {CanvasRenderingContext2D} ctx context to render on\n * @param {Number} left x coordinate where the control center should be\n * @param {Number} top y coordinate where the control center should be\n * @param {Object} styleOverride override for FabricObject controls style\n * @param {FabricObject} fabricObject the fabric object for which we are rendering controls\n */\nexport function renderCircleControl(\n this: Control,\n ctx: CanvasRenderingContext2D,\n left: number,\n top: number,\n styleOverride: ControlRenderingStyleOverride,\n fabricObject: InteractiveFabricObject,\n) {\n styleOverride = styleOverride || {};\n const xSize =\n this.sizeX || styleOverride.cornerSize || fabricObject.cornerSize,\n ySize = this.sizeY || styleOverride.cornerSize || fabricObject.cornerSize,\n transparentCorners =\n typeof styleOverride.transparentCorners !== 'undefined'\n ? styleOverride.transparentCorners\n : fabricObject.transparentCorners,\n methodName = transparentCorners ? STROKE : FILL,\n stroke =\n !transparentCorners &&\n (styleOverride.cornerStrokeColor || fabricObject.cornerStrokeColor);\n let myLeft = left,\n myTop = top,\n size;\n ctx.save();\n ctx.fillStyle = styleOverride.cornerColor || fabricObject.cornerColor || '';\n ctx.strokeStyle =\n styleOverride.cornerStrokeColor || fabricObject.cornerStrokeColor || '';\n // TODO: use proper ellipse code.\n if (xSize > ySize) {\n size = xSize;\n ctx.scale(1.0, ySize / xSize);\n myTop = (top * xSize) / ySize;\n } else if (ySize > xSize) {\n size = ySize;\n ctx.scale(xSize / ySize, 1.0);\n myLeft = (left * ySize) / xSize;\n } else {\n size = xSize;\n }\n ctx.beginPath();\n ctx.arc(myLeft, myTop, size / 2, 0, twoMathPi, false);\n ctx[methodName]();\n if (stroke) {\n ctx.stroke();\n }\n ctx.restore();\n}\n\n/**\n * Render a square control, as per fabric features.\n * This function is written to respect object properties like transparentCorners, cornerSize\n * cornerColor, cornerStrokeColor\n * plus the addition of offsetY and offsetX.\n * @param {CanvasRenderingContext2D} ctx context to render on\n * @param {Number} left x coordinate where the control center should be\n * @param {Number} top y coordinate where the control center should be\n * @param {Object} styleOverride override for FabricObject controls style\n * @param {FabricObject} fabricObject the fabric object for which we are rendering controls\n */\nexport function renderSquareControl(\n this: Control,\n ctx: CanvasRenderingContext2D,\n left: number,\n top: number,\n styleOverride: ControlRenderingStyleOverride,\n fabricObject: InteractiveFabricObject,\n) {\n styleOverride = styleOverride || {};\n const xSize =\n this.sizeX || styleOverride.cornerSize || fabricObject.cornerSize,\n ySize = this.sizeY || styleOverride.cornerSize || fabricObject.cornerSize,\n transparentCorners =\n typeof styleOverride.transparentCorners !== 'undefined'\n ? styleOverride.transparentCorners\n : fabricObject.transparentCorners,\n methodName = transparentCorners ? STROKE : FILL,\n stroke =\n !transparentCorners &&\n (styleOverride.cornerStrokeColor || fabricObject.cornerStrokeColor),\n xSizeBy2 = xSize / 2,\n ySizeBy2 = ySize / 2;\n ctx.save();\n ctx.fillStyle = styleOverride.cornerColor || fabricObject.cornerColor || '';\n ctx.strokeStyle =\n styleOverride.cornerStrokeColor || fabricObject.cornerStrokeColor || '';\n ctx.translate(left, top);\n // angle is relative to canvas plane\n const angle = fabricObject.getTotalAngle();\n ctx.rotate(degreesToRadians(angle));\n // this does not work, and fixed with ( && ) does not make sense.\n // to have real transparent corners we need the controls on upperCanvas\n // transparentCorners || ctx.clearRect(-xSizeBy2, -ySizeBy2, xSize, ySize);\n ctx[`${methodName}Rect`](-xSizeBy2, -ySizeBy2, xSize, ySize);\n if (stroke) {\n ctx.strokeRect(-xSizeBy2, -ySizeBy2, xSize, ySize);\n }\n ctx.restore();\n}\n","/* eslint-disable @typescript-eslint/no-unused-vars */\nimport type {\n ControlActionHandler,\n TPointerEvent,\n TransformActionHandler,\n} from '../EventTypeDefs';\nimport { Intersection } from '../Intersection';\nimport { Point } from '../Point';\nimport { SCALE } from '../constants';\nimport type {\n InteractiveFabricObject,\n TOCoord,\n} from '../shapes/Object/InteractiveObject';\nimport type { TCornerPoint, TDegree, TMat2D } from '../typedefs';\nimport {\n createRotateMatrix,\n createScaleMatrix,\n createTranslateMatrix,\n multiplyTransformMatrixArray,\n} from '../util/misc/matrix';\nimport type { ControlRenderingStyleOverride } from './controlRendering';\nimport { renderCircleControl, renderSquareControl } from './controlRendering';\n\nexport class Control {\n /**\n * keep track of control visibility.\n * mainly for backward compatibility.\n * if you do not want to see a control, you can remove it\n * from the control set.\n * @type {Boolean}\n * @default true\n */\n visible = true;\n\n /**\n * Name of the action that the control will likely execute.\n * This is optional. FabricJS uses to identify what the user is doing for some\n * extra optimizations. If you are writing a custom control and you want to know\n * somewhere else in the code what is going on, you can use this string here.\n * you can also provide a custom getActionName if your control run multiple actions\n * depending on some external state.\n * default to scale since is the most common, used on 4 corners by default\n * @type {String}\n * @default 'scale'\n */\n actionName = SCALE;\n\n /**\n * Drawing angle of the control.\n * NOT used for now, but name marked as needed for internal logic\n * example: to reuse the same drawing function for different rotated controls\n * @type {Number}\n * @default 0\n */\n angle = 0;\n\n /**\n * Relative position of the control. X\n * 0,0 is the center of the Object, while -0.5 (left) or 0.5 (right) are the extremities\n * of the bounding box.\n * @type {Number}\n * @default 0\n */\n x = 0;\n\n /**\n * Relative position of the control. Y\n * 0,0 is the center of the Object, while -0.5 (top) or 0.5 (bottom) are the extremities\n * of the bounding box.\n * @type {Number}\n * @default 0\n */\n y = 0;\n\n /**\n * Horizontal offset of the control from the defined position. In pixels\n * Positive offset moves the control to the right, negative to the left.\n * It used when you want to have position of control that does not scale with\n * the bounding box. Example: rotation control is placed at x:0, y: 0.5 on\n * the boundind box, with an offset of 30 pixels vertically. Those 30 pixels will\n * stay 30 pixels no matter how the object is big. Another example is having 2\n * controls in the corner, that stay in the same position when the object scale.\n * of the bounding box.\n * @type {Number}\n * @default 0\n */\n offsetX = 0;\n\n /**\n * Vertical offset of the control from the defined position. In pixels\n * Positive offset moves the control to the bottom, negative to the top.\n * @type {Number}\n * @default 0\n */\n offsetY = 0;\n\n /**\n * Sets the length of the control. If null, defaults to object's cornerSize.\n * Expects both sizeX and sizeY to be set when set.\n * @type {?Number}\n * @default null\n */\n sizeX = 0;\n\n /**\n * Sets the height of the control. If null, defaults to object's cornerSize.\n * Expects both sizeX and sizeY to be set when set.\n * @type {?Number}\n * @default null\n */\n sizeY = 0;\n\n /**\n * Sets the length of the touch area of the control. If null, defaults to object's touchCornerSize.\n * Expects both touchSizeX and touchSizeY to be set when set.\n * @type {?Number}\n * @default null\n */\n touchSizeX = 0;\n\n /**\n * Sets the height of the touch area of the control. If null, defaults to object's touchCornerSize.\n * Expects both touchSizeX and touchSizeY to be set when set.\n * @type {?Number}\n * @default null\n */\n touchSizeY = 0;\n\n /**\n * Css cursor style to display when the control is hovered.\n * if the method `cursorStyleHandler` is provided, this property is ignored.\n * @type {String}\n * @default 'crosshair'\n */\n cursorStyle = 'crosshair';\n\n /**\n * If controls has an offsetY or offsetX, draw a line that connects\n * the control to the bounding box\n * @type {Boolean}\n * @default false\n */\n withConnection = false;\n\n constructor(options?: Partial) {\n Object.assign(this, options);\n }\n\n /**\n * The control actionHandler, provide one to handle action ( control being moved )\n * @param {Event} eventData the native mouse event\n * @param {Transform} transformData properties of the current transform\n * @param {Number} x x position of the cursor\n * @param {Number} y y position of the cursor\n * @return {Boolean} true if the action/event modified the object\n */\n declare actionHandler: TransformActionHandler;\n\n /**\n * The control handler for mouse down, provide one to handle mouse down on control\n * @param {Event} eventData the native mouse event\n * @param {Transform} transformData properties of the current transform\n * @param {Number} x x position of the cursor\n * @param {Number} y y position of the cursor\n * @return {Boolean} true if the action/event modified the object\n */\n declare mouseDownHandler?: ControlActionHandler;\n\n /**\n * The control mouseUpHandler, provide one to handle an effect on mouse up.\n * @param {Event} eventData the native mouse event\n * @param {Transform} transformData properties of the current transform\n * @param {Number} x x position of the cursor\n * @param {Number} y y position of the cursor\n * @return {Boolean} true if the action/event modified the object\n */\n declare mouseUpHandler?: ControlActionHandler;\n\n shouldActivate(\n controlKey: string,\n fabricObject: InteractiveFabricObject,\n pointer: Point,\n { tl, tr, br, bl }: TCornerPoint,\n ) {\n // TODO: locking logic can be handled here instead of in the control handler logic\n return (\n fabricObject.canvas?.getActiveObject() === fabricObject &&\n fabricObject.isControlVisible(controlKey) &&\n Intersection.isPointInPolygon(pointer, [tl, tr, br, bl])\n );\n }\n\n /**\n * Returns control actionHandler\n * @param {Event} eventData the native mouse event\n * @param {FabricObject} fabricObject on which the control is displayed\n * @param {Control} control control for which the action handler is being asked\n * @return {Function} the action handler\n */\n getActionHandler(\n eventData: TPointerEvent,\n fabricObject: InteractiveFabricObject,\n control: Control,\n ): TransformActionHandler | undefined {\n return this.actionHandler;\n }\n\n /**\n * Returns control mouseDown handler\n * @param {Event} eventData the native mouse event\n * @param {FabricObject} fabricObject on which the control is displayed\n * @param {Control} control control for which the action handler is being asked\n * @return {Function} the action handler\n */\n getMouseDownHandler(\n eventData: TPointerEvent,\n fabricObject: InteractiveFabricObject,\n control: Control,\n ): ControlActionHandler | undefined {\n return this.mouseDownHandler;\n }\n\n /**\n * Returns control mouseUp handler.\n * During actions the fabricObject or the control can be of different obj\n * @param {Event} eventData the native mouse event\n * @param {FabricObject} fabricObject on which the control is displayed\n * @param {Control} control control for which the action handler is being asked\n * @return {Function} the action handler\n */\n getMouseUpHandler(\n eventData: TPointerEvent,\n fabricObject: InteractiveFabricObject,\n control: Control,\n ): ControlActionHandler | undefined {\n return this.mouseUpHandler;\n }\n\n /**\n * Returns control cursorStyle for css using cursorStyle. If you need a more elaborate\n * function you can pass one in the constructor\n * the cursorStyle property\n * @param {Event} eventData the native mouse event\n * @param {Control} control the current control ( likely this)\n * @param {FabricObject} object on which the control is displayed\n * @return {String}\n */\n cursorStyleHandler(\n eventData: TPointerEvent,\n control: Control,\n fabricObject: InteractiveFabricObject,\n coord: TOCoord,\n ) {\n return control.cursorStyle;\n }\n\n /**\n * Returns the action name. The basic implementation just return the actionName property.\n * @param {Event} eventData the native mouse event\n * @param {Control} control the current control ( likely this)\n * @param {FabricObject} object on which the control is displayed\n * @return {String}\n */\n getActionName(\n eventData: TPointerEvent,\n control: Control,\n fabricObject: InteractiveFabricObject,\n ) {\n return control.actionName;\n }\n\n /**\n * Returns controls visibility\n * @param {FabricObject} object on which the control is displayed\n * @param {String} controlKey key where the control is memorized on the\n * @return {Boolean}\n */\n getVisibility(fabricObject: InteractiveFabricObject, controlKey: string) {\n return fabricObject._controlsVisibility?.[controlKey] ?? this.visible;\n }\n\n /**\n * Sets controls visibility\n * @param {Boolean} visibility for the object\n * @return {Void}\n */\n setVisibility(\n visibility: boolean,\n name?: string,\n fabricObject?: InteractiveFabricObject,\n ) {\n this.visible = visibility;\n }\n\n positionHandler(\n dim: Point,\n finalMatrix: TMat2D,\n fabricObject: InteractiveFabricObject,\n currentControl: Control,\n ) {\n return new Point(\n this.x * dim.x + this.offsetX,\n this.y * dim.y + this.offsetY,\n ).transform(finalMatrix);\n }\n\n /**\n * Returns the coords for this control based on object values.\n * @param {Number} objectAngle angle from the fabric object holding the control\n * @param {Number} objectCornerSize cornerSize from the fabric object holding the control (or touchCornerSize if\n * isTouch is true)\n * @param {Number} centerX x coordinate where the control center should be\n * @param {Number} centerY y coordinate where the control center should be\n * @param {boolean} isTouch true if touch corner, false if normal corner\n */\n calcCornerCoords(\n angle: TDegree,\n objectCornerSize: number,\n centerX: number,\n centerY: number,\n isTouch: boolean,\n fabricObject: InteractiveFabricObject,\n ) {\n const t = multiplyTransformMatrixArray([\n createTranslateMatrix(centerX, centerY),\n createRotateMatrix({ angle }),\n createScaleMatrix(\n (isTouch ? this.touchSizeX : this.sizeX) || objectCornerSize,\n (isTouch ? this.touchSizeY : this.sizeY) || objectCornerSize,\n ),\n ]);\n return {\n tl: new Point(-0.5, -0.5).transform(t),\n tr: new Point(0.5, -0.5).transform(t),\n br: new Point(0.5, 0.5).transform(t),\n bl: new Point(-0.5, 0.5).transform(t),\n };\n }\n\n /**\n * Render function for the control.\n * When this function runs the context is unscaled. unrotate. Just retina scaled.\n * all the functions will have to translate to the point left,top before starting Drawing\n * if they want to draw a control where the position is detected.\n * left and top are the result of the positionHandler function\n * @param {RenderingContext2D} ctx the context where the control will be drawn\n * @param {Number} left position of the canvas where we are about to render the control.\n * @param {Number} top position of the canvas where we are about to render the control.\n * @param {Object} styleOverride\n * @param {FabricObject} fabricObject the object where the control is about to be rendered\n */\n render(\n ctx: CanvasRenderingContext2D,\n left: number,\n top: number,\n styleOverride: ControlRenderingStyleOverride | undefined,\n fabricObject: InteractiveFabricObject,\n ) {\n styleOverride = styleOverride || {};\n switch (styleOverride.cornerStyle || fabricObject.cornerStyle) {\n case 'circle':\n renderCircleControl.call(\n this,\n ctx,\n left,\n top,\n styleOverride,\n fabricObject,\n );\n break;\n default:\n renderSquareControl.call(\n this,\n ctx,\n left,\n top,\n styleOverride,\n fabricObject,\n );\n }\n }\n}\n","import type {\n ControlCursorCallback,\n TransformActionHandler,\n} from '../EventTypeDefs';\nimport { ROTATING } from '../constants';\nimport { radiansToDegrees } from '../util/misc/radiansDegreesConversion';\nimport { isLocked, NOT_ALLOWED_CURSOR } from './util';\nimport { wrapWithFireEvent } from './wrapWithFireEvent';\nimport { wrapWithFixedAnchor } from './wrapWithFixedAnchor';\n\n/**\n * Find the correct style for the control that is used for rotation.\n * this function is very simple and it just take care of not-allowed or standard cursor\n * @param {Event} eventData the javascript event that is causing the scale\n * @param {Control} control the control that is interested in the action\n * @param {FabricObject} fabricObject the fabric object that is interested in the action\n * @return {String} a valid css string for the cursor\n */\nexport const rotationStyleHandler: ControlCursorCallback = (\n eventData,\n control,\n fabricObject,\n) => {\n if (fabricObject.lockRotation) {\n return NOT_ALLOWED_CURSOR;\n }\n return control.cursorStyle;\n};\n\n/**\n * Action handler for rotation and snapping, without anchor point.\n * Needs to be wrapped with `wrapWithFixedAnchor` to be effective\n * @param {Event} eventData javascript event that is doing the transform\n * @param {Object} transform javascript object containing a series of information around the current transform\n * @param {number} x current mouse x position, canvas normalized\n * @param {number} y current mouse y position, canvas normalized\n * @return {Boolean} true if some change happened\n * @private\n */\nconst rotateObjectWithSnapping: TransformActionHandler = (\n eventData,\n { target, ex, ey, theta, originX, originY },\n x,\n y,\n) => {\n const pivotPoint = target.translateToOriginPoint(\n target.getRelativeCenterPoint(),\n originX,\n originY,\n );\n\n if (isLocked(target, 'lockRotation')) {\n return false;\n }\n\n const lastAngle = Math.atan2(ey - pivotPoint.y, ex - pivotPoint.x),\n curAngle = Math.atan2(y - pivotPoint.y, x - pivotPoint.x);\n let angle = radiansToDegrees(curAngle - lastAngle + theta);\n\n if (target.snapAngle && target.snapAngle > 0) {\n const snapAngle = target.snapAngle,\n snapThreshold = target.snapThreshold || snapAngle,\n rightAngleLocked = Math.ceil(angle / snapAngle) * snapAngle,\n leftAngleLocked = Math.floor(angle / snapAngle) * snapAngle;\n\n if (Math.abs(angle - leftAngleLocked) < snapThreshold) {\n angle = leftAngleLocked;\n } else if (Math.abs(angle - rightAngleLocked) < snapThreshold) {\n angle = rightAngleLocked;\n }\n }\n\n // normalize angle to positive value\n if (angle < 0) {\n angle = 360 + angle;\n }\n angle %= 360;\n\n const hasRotated = target.angle !== angle;\n // TODO: why aren't we using set?\n target.angle = angle;\n return hasRotated;\n};\n\nexport const rotationWithSnapping = wrapWithFireEvent(\n ROTATING,\n wrapWithFixedAnchor(rotateObjectWithSnapping),\n);\n","import type {\n ControlCursorCallback,\n TPointerEvent,\n Transform,\n TransformActionHandler,\n} from '../EventTypeDefs';\nimport type { FabricObject } from '../shapes/Object/FabricObject';\nimport type { TAxis } from '../typedefs';\nimport type { Canvas } from '../canvas/Canvas';\nimport {\n findCornerQuadrant,\n getLocalPoint,\n invertOrigin,\n isLocked,\n isTransformCentered,\n NOT_ALLOWED_CURSOR,\n} from './util';\nimport { wrapWithFireEvent } from './wrapWithFireEvent';\nimport { wrapWithFixedAnchor } from './wrapWithFixedAnchor';\nimport { SCALE_X, SCALE_Y, SCALING } from '../constants';\n\ntype ScaleTransform = Transform & {\n gestureScale?: number;\n signX?: number;\n signY?: number;\n};\n\ntype ScaleBy = TAxis | 'equally' | '' | undefined;\n\n/**\n * Inspect event and fabricObject properties to understand if the scaling action\n * @param {Event} eventData from the user action\n * @param {FabricObject} fabricObject the fabric object about to scale\n * @return {Boolean} true if scale is proportional\n */\nexport function scaleIsProportional(\n eventData: TPointerEvent,\n fabricObject: FabricObject,\n): boolean {\n const canvas = fabricObject.canvas as Canvas,\n uniformIsToggled = eventData[canvas.uniScaleKey!];\n return (\n (canvas.uniformScaling && !uniformIsToggled) ||\n (!canvas.uniformScaling && uniformIsToggled)\n );\n}\n\n/**\n * Inspect fabricObject to understand if the current scaling action is allowed\n * @param {FabricObject} fabricObject the fabric object about to scale\n * @param {String} by 'x' or 'y' or ''\n * @param {Boolean} scaleProportionally true if we are trying to scale proportionally\n * @return {Boolean} true if scaling is not allowed at current conditions\n */\nexport function scalingIsForbidden(\n fabricObject: FabricObject,\n by: ScaleBy,\n scaleProportionally: boolean,\n) {\n const lockX = isLocked(fabricObject, 'lockScalingX'),\n lockY = isLocked(fabricObject, 'lockScalingY');\n if (lockX && lockY) {\n return true;\n }\n if (!by && (lockX || lockY) && scaleProportionally) {\n return true;\n }\n if (lockX && by === 'x') {\n return true;\n }\n if (lockY && by === 'y') {\n return true;\n }\n // code crashes because of a division by 0 if a 0 sized object is scaled\n // forbid to prevent scaling to happen. ISSUE-9475\n const { width, height, strokeWidth } = fabricObject;\n if (width === 0 && strokeWidth === 0 && by !== 'y') {\n return true;\n }\n if (height === 0 && strokeWidth === 0 && by !== 'x') {\n return true;\n }\n return false;\n}\n\nconst scaleMap = ['e', 'se', 's', 'sw', 'w', 'nw', 'n', 'ne', 'e'];\n\n/**\n * return the correct cursor style for the scale action\n * @param {Event} eventData the javascript event that is causing the scale\n * @param {Control} control the control that is interested in the action\n * @param {FabricObject} fabricObject the fabric object that is interested in the action\n * @return {String} a valid css string for the cursor\n */\nexport const scaleCursorStyleHandler: ControlCursorCallback = (\n eventData,\n control,\n fabricObject,\n coord,\n) => {\n const scaleProportionally = scaleIsProportional(eventData, fabricObject),\n by =\n control.x !== 0 && control.y === 0\n ? 'x'\n : control.x === 0 && control.y !== 0\n ? 'y'\n : '';\n if (scalingIsForbidden(fabricObject, by, scaleProportionally)) {\n return NOT_ALLOWED_CURSOR;\n }\n const n = findCornerQuadrant(fabricObject, control, coord);\n return `${scaleMap[n]}-resize`;\n};\n\n/**\n * Basic scaling logic, reused with different constrain for scaling X,Y, freely or equally.\n * Needs to be wrapped with `wrapWithFixedAnchor` to be effective\n * @param {Event} eventData javascript event that is doing the transform\n * @param {Object} transform javascript object containing a series of information around the current transform\n * @param {number} x current mouse x position, canvas normalized\n * @param {number} y current mouse y position, canvas normalized\n * @param {Object} options additional information for scaling\n * @param {String} options.by 'x', 'y', 'equally' or '' to indicate type of scaling\n * @return {Boolean} true if some change happened\n * @private\n */\nfunction scaleObject(\n eventData: TPointerEvent,\n transform: ScaleTransform,\n x: number,\n y: number,\n options: { by?: ScaleBy } = {},\n) {\n const target = transform.target,\n by = options.by,\n scaleProportionally = scaleIsProportional(eventData, target),\n forbidScaling = scalingIsForbidden(target, by, scaleProportionally);\n let newPoint, scaleX, scaleY, dim, signX, signY;\n\n if (forbidScaling) {\n return false;\n }\n if (transform.gestureScale) {\n scaleX = transform.scaleX * transform.gestureScale;\n scaleY = transform.scaleY * transform.gestureScale;\n } else {\n newPoint = getLocalPoint(\n transform,\n transform.originX,\n transform.originY,\n x,\n y,\n );\n // use of sign: We use sign to detect change of direction of an action. sign usually change when\n // we cross the origin point with the mouse. So a scale flip for example. There is an issue when scaling\n // by center and scaling using one middle control ( default: mr, mt, ml, mb), the mouse movement can easily\n // cross many time the origin point and flip the object. so we need a way to filter out the noise.\n // This ternary here should be ok to filter out X scaling when we want Y only and vice versa.\n signX = by !== 'y' ? Math.sign(newPoint.x || transform.signX || 1) : 1;\n signY = by !== 'x' ? Math.sign(newPoint.y || transform.signY || 1) : 1;\n if (!transform.signX) {\n transform.signX = signX;\n }\n if (!transform.signY) {\n transform.signY = signY;\n }\n\n if (\n isLocked(target, 'lockScalingFlip') &&\n (transform.signX !== signX || transform.signY !== signY)\n ) {\n return false;\n }\n\n dim = target._getTransformedDimensions();\n // missing detection of flip and logic to switch the origin\n if (scaleProportionally && !by) {\n // uniform scaling\n const distance = Math.abs(newPoint.x) + Math.abs(newPoint.y),\n { original } = transform,\n originalDistance =\n Math.abs((dim.x * original.scaleX) / target.scaleX) +\n Math.abs((dim.y * original.scaleY) / target.scaleY),\n scale = distance / originalDistance;\n scaleX = original.scaleX * scale;\n scaleY = original.scaleY * scale;\n } else {\n scaleX = Math.abs((newPoint.x * target.scaleX) / dim.x);\n scaleY = Math.abs((newPoint.y * target.scaleY) / dim.y);\n }\n // if we are scaling by center, we need to double the scale\n if (isTransformCentered(transform)) {\n scaleX *= 2;\n scaleY *= 2;\n }\n if (transform.signX !== signX && by !== 'y') {\n transform.originX = invertOrigin(transform.originX);\n scaleX *= -1;\n transform.signX = signX;\n }\n if (transform.signY !== signY && by !== 'x') {\n transform.originY = invertOrigin(transform.originY);\n scaleY *= -1;\n transform.signY = signY;\n }\n }\n // minScale is taken care of in the setter.\n const oldScaleX = target.scaleX,\n oldScaleY = target.scaleY;\n if (!by) {\n !isLocked(target, 'lockScalingX') && target.set(SCALE_X, scaleX);\n !isLocked(target, 'lockScalingY') && target.set(SCALE_Y, scaleY);\n } else {\n // forbidden cases already handled on top here.\n by === 'x' && target.set(SCALE_X, scaleX);\n by === 'y' && target.set(SCALE_Y, scaleY);\n }\n return oldScaleX !== target.scaleX || oldScaleY !== target.scaleY;\n}\n\n/**\n * Generic scaling logic, to scale from corners either equally or freely.\n * Needs to be wrapped with `wrapWithFixedAnchor` to be effective\n * @param {Event} eventData javascript event that is doing the transform\n * @param {Object} transform javascript object containing a series of information around the current transform\n * @param {number} x current mouse x position, canvas normalized\n * @param {number} y current mouse y position, canvas normalized\n * @return {Boolean} true if some change happened\n */\nexport const scaleObjectFromCorner: TransformActionHandler = (\n eventData,\n transform,\n x,\n y,\n) => {\n return scaleObject(eventData, transform, x, y);\n};\n\n/**\n * Scaling logic for the X axis.\n * Needs to be wrapped with `wrapWithFixedAnchor` to be effective\n * @param {Event} eventData javascript event that is doing the transform\n * @param {Object} transform javascript object containing a series of information around the current transform\n * @param {number} x current mouse x position, canvas normalized\n * @param {number} y current mouse y position, canvas normalized\n * @return {Boolean} true if some change happened\n */\nconst scaleObjectX: TransformActionHandler = (\n eventData,\n transform,\n x,\n y,\n) => {\n return scaleObject(eventData, transform, x, y, { by: 'x' });\n};\n\n/**\n * Scaling logic for the Y axis.\n * Needs to be wrapped with `wrapWithFixedAnchor` to be effective\n * @param {Event} eventData javascript event that is doing the transform\n * @param {Object} transform javascript object containing a series of information around the current transform\n * @param {number} x current mouse x position, canvas normalized\n * @param {number} y current mouse y position, canvas normalized\n * @return {Boolean} true if some change happened\n */\nconst scaleObjectY: TransformActionHandler = (\n eventData,\n transform,\n x,\n y,\n) => {\n return scaleObject(eventData, transform, x, y, { by: 'y' });\n};\n\nexport const scalingEqually = wrapWithFireEvent(\n SCALING,\n wrapWithFixedAnchor(scaleObjectFromCorner),\n);\n\nexport const scalingX = wrapWithFireEvent(\n SCALING,\n wrapWithFixedAnchor(scaleObjectX),\n);\n\nexport const scalingY = wrapWithFireEvent(\n SCALING,\n wrapWithFixedAnchor(scaleObjectY),\n);\n","import type {\n ControlCursorCallback,\n TPointerEvent,\n Transform,\n TransformActionHandler,\n} from '../EventTypeDefs';\nimport { resolveOrigin } from '../util/misc/resolveOrigin';\nimport { Point } from '../Point';\nimport type { TAxis, TAxisKey } from '../typedefs';\nimport {\n degreesToRadians,\n radiansToDegrees,\n} from '../util/misc/radiansDegreesConversion';\nimport {\n findCornerQuadrant,\n getLocalPoint,\n isLocked,\n NOT_ALLOWED_CURSOR,\n} from './util';\nimport { wrapWithFireEvent } from './wrapWithFireEvent';\nimport { wrapWithFixedAnchor } from './wrapWithFixedAnchor';\nimport {\n CENTER,\n SCALE_X,\n SCALE_Y,\n SKEWING,\n SKEW_X,\n SKEW_Y,\n} from '../constants';\n\nexport type SkewTransform = Transform & { skewingSide: -1 | 1 };\n\nconst AXIS_KEYS: Record<\n TAxis,\n {\n counterAxis: TAxis;\n scale: TAxisKey<'scale'>;\n skew: TAxisKey<'skew'>;\n lockSkewing: TAxisKey<'lockSkewing'>;\n origin: TAxisKey<'origin'>;\n flip: TAxisKey<'flip'>;\n }\n> = {\n x: {\n counterAxis: 'y',\n scale: SCALE_X,\n skew: SKEW_X,\n lockSkewing: 'lockSkewingX',\n origin: 'originX',\n flip: 'flipX',\n },\n y: {\n counterAxis: 'x',\n scale: SCALE_Y,\n skew: SKEW_Y,\n lockSkewing: 'lockSkewingY',\n origin: 'originY',\n flip: 'flipY',\n },\n};\n\nconst skewMap = ['ns', 'nesw', 'ew', 'nwse'];\n\n/**\n * return the correct cursor style for the skew action\n * @param {Event} eventData the javascript event that is causing the scale\n * @param {Control} control the control that is interested in the action\n * @param {FabricObject} fabricObject the fabric object that is interested in the action\n * @return {String} a valid css string for the cursor\n */\nexport const skewCursorStyleHandler: ControlCursorCallback = (\n eventData,\n control,\n fabricObject,\n coord,\n) => {\n if (control.x !== 0 && isLocked(fabricObject, 'lockSkewingY')) {\n return NOT_ALLOWED_CURSOR;\n }\n if (control.y !== 0 && isLocked(fabricObject, 'lockSkewingX')) {\n return NOT_ALLOWED_CURSOR;\n }\n const n = findCornerQuadrant(fabricObject, control, coord) % 4;\n return `${skewMap[n]}-resize`;\n};\n\n/**\n * Since skewing is applied before scaling, calculations are done in a scaleless plane\n * @see https://github.com/fabricjs/fabric.js/pull/8380\n */\nfunction skewObject(\n axis: TAxis,\n { target, ex, ey, skewingSide, ...transform }: SkewTransform,\n pointer: Point,\n) {\n const { skew: skewKey } = AXIS_KEYS[axis],\n offset = pointer\n .subtract(new Point(ex, ey))\n .divide(new Point(target.scaleX, target.scaleY))[axis],\n skewingBefore = target[skewKey],\n skewingStart = transform[skewKey],\n shearingStart = Math.tan(degreesToRadians(skewingStart)),\n // let a, b be the size of target\n // let a' be the value of a after applying skewing\n // then:\n // a' = a + b * skewA => skewA = (a' - a) / b\n // the value b is tricky since skewY is applied before skewX\n b =\n axis === 'y'\n ? target._getTransformedDimensions({\n scaleX: 1,\n scaleY: 1,\n // since skewY is applied before skewX, b (=width) is not affected by skewX\n skewX: 0,\n }).x\n : target._getTransformedDimensions({\n scaleX: 1,\n scaleY: 1,\n }).y;\n\n const shearing =\n (2 * offset * skewingSide) /\n // we max out fractions to safeguard from asymptotic behavior\n Math.max(b, 1) +\n // add starting state\n shearingStart;\n\n const skewing = radiansToDegrees(Math.atan(shearing));\n\n target.set(skewKey, skewing);\n const changed = skewingBefore !== target[skewKey];\n\n if (changed && axis === 'y') {\n // we don't want skewing to affect scaleX\n // so we factor it by the inverse skewing diff to make it seem unchanged to the viewer\n const { skewX, scaleX } = target,\n dimBefore = target._getTransformedDimensions({ skewY: skewingBefore }),\n dimAfter = target._getTransformedDimensions(),\n compensationFactor = skewX !== 0 ? dimBefore.x / dimAfter.x : 1;\n compensationFactor !== 1 &&\n target.set(SCALE_X, compensationFactor * scaleX);\n }\n\n return changed;\n}\n\n/**\n * Wrapped Action handler for skewing on a given axis, takes care of the\n * skew direction and determines the correct transform origin for the anchor point\n * @param {Event} eventData javascript event that is doing the transform\n * @param {Object} transform javascript object containing a series of information around the current transform\n * @param {number} x current mouse x position, canvas normalized\n * @param {number} y current mouse y position, canvas normalized\n * @return {Boolean} true if some change happened\n */\nfunction skewHandler(\n axis: TAxis,\n eventData: TPointerEvent,\n transform: Transform,\n x: number,\n y: number,\n) {\n const { target } = transform,\n {\n counterAxis,\n origin: originKey,\n lockSkewing: lockSkewingKey,\n skew: skewKey,\n flip: flipKey,\n } = AXIS_KEYS[axis];\n if (isLocked(target, lockSkewingKey)) {\n return false;\n }\n\n const { origin: counterOriginKey, flip: counterFlipKey } =\n AXIS_KEYS[counterAxis],\n counterOriginFactor =\n resolveOrigin(transform[counterOriginKey]) *\n (target[counterFlipKey] ? -1 : 1),\n // if the counter origin is top/left (= -0.5) then we are skewing x/y values on the bottom/right side of target respectively.\n // if the counter origin is bottom/right (= 0.5) then we are skewing x/y values on the top/left side of target respectively.\n // skewing direction on the top/left side of target is OPPOSITE to the direction of the movement of the pointer,\n // so we factor skewing direction by this value.\n skewingSide = (-Math.sign(counterOriginFactor) *\n (target[flipKey] ? -1 : 1)) as 1 | -1,\n skewingDirection =\n ((target[skewKey] === 0 &&\n // in case skewing equals 0 we use the pointer offset from target center to determine the direction of skewing\n getLocalPoint(transform, CENTER, CENTER, x, y)[axis] > 0) ||\n // in case target has skewing we use that as the direction\n target[skewKey] > 0\n ? 1\n : -1) * skewingSide,\n // anchor to the opposite side of the skewing direction\n // normalize value from [-1, 1] to origin value [0, 1]\n origin = -skewingDirection * 0.5 + 0.5;\n\n const finalHandler = wrapWithFireEvent(\n SKEWING,\n wrapWithFixedAnchor((eventData, transform, x, y) =>\n skewObject(axis, transform, new Point(x, y)),\n ),\n );\n\n return finalHandler(\n eventData,\n {\n ...transform,\n [originKey]: origin,\n skewingSide,\n },\n x,\n y,\n );\n}\n\n/**\n * Wrapped Action handler for skewing on the X axis, takes care of the\n * skew direction and determines the correct transform origin for the anchor point\n * @param {Event} eventData javascript event that is doing the transform\n * @param {Object} transform javascript object containing a series of information around the current transform\n * @param {number} x current mouse x position, canvas normalized\n * @param {number} y current mouse y position, canvas normalized\n * @return {Boolean} true if some change happened\n */\nexport const skewHandlerX: TransformActionHandler = (\n eventData,\n transform,\n x,\n y,\n) => {\n return skewHandler('x', eventData, transform, x, y);\n};\n\n/**\n * Wrapped Action handler for skewing on the Y axis, takes care of the\n * skew direction and determines the correct transform origin for the anchor point\n * @param {Event} eventData javascript event that is doing the transform\n * @param {Object} transform javascript object containing a series of information around the current transform\n * @param {number} x current mouse x position, canvas normalized\n * @param {number} y current mouse y position, canvas normalized\n * @return {Boolean} true if some change happened\n */\nexport const skewHandlerY: TransformActionHandler = (\n eventData,\n transform,\n x,\n y,\n) => {\n return skewHandler('y', eventData, transform, x, y);\n};\n","import type {\n ControlCallback,\n ControlCursorCallback,\n TPointerEvent,\n TransformActionHandler,\n} from '../EventTypeDefs';\nimport { SCALE_X, SCALE_Y, SKEW_X, SKEW_Y } from '../constants';\nimport type { FabricObject } from '../shapes/Object/FabricObject';\nimport type { TAxisKey } from '../typedefs';\nimport { scaleCursorStyleHandler, scalingX, scalingY } from './scale';\nimport { skewCursorStyleHandler, skewHandlerX, skewHandlerY } from './skew';\n\nfunction isAltAction(eventData: TPointerEvent, target: FabricObject) {\n return eventData[target.canvas!.altActionKey!];\n}\n\n/**\n * Inspect event, control and fabricObject to return the correct action name\n * @param {Event} eventData the javascript event that is causing the scale\n * @param {Control} control the control that is interested in the action\n * @param {FabricObject} fabricObject the fabric object that is interested in the action\n * @return {String} an action name\n */\nexport const scaleOrSkewActionName: ControlCallback<\n TAxisKey<'skew' | 'scale'> | ''\n> = (eventData, control, fabricObject) => {\n const isAlternative = isAltAction(eventData, fabricObject);\n if (control.x === 0) {\n // then is scaleY or skewX\n return isAlternative ? SKEW_X : SCALE_Y;\n }\n if (control.y === 0) {\n // then is scaleY or skewX\n return isAlternative ? SKEW_Y : SCALE_X;\n }\n return '';\n};\n\n/**\n * Combine skew and scale style handlers to cover fabric standard use case\n * @param {Event} eventData the javascript event that is causing the scale\n * @param {Control} control the control that is interested in the action\n * @param {FabricObject} fabricObject the fabric object that is interested in the action\n * @return {String} a valid css string for the cursor\n */\nexport const scaleSkewCursorStyleHandler: ControlCursorCallback = (\n eventData,\n control,\n fabricObject,\n coord,\n) => {\n return isAltAction(eventData, fabricObject)\n ? skewCursorStyleHandler(eventData, control, fabricObject, coord)\n : scaleCursorStyleHandler(eventData, control, fabricObject, coord);\n};\n/**\n * Composed action handler to either scale X or skew Y\n * Needs to be wrapped with `wrapWithFixedAnchor` to be effective\n * @param {Event} eventData javascript event that is doing the transform\n * @param {Object} transform javascript object containing a series of information around the current transform\n * @param {number} x current mouse x position, canvas normalized\n * @param {number} y current mouse y position, canvas normalized\n * @return {Boolean} true if some change happened\n */\nexport const scalingXOrSkewingY: TransformActionHandler = (\n eventData,\n transform,\n x,\n y,\n) => {\n return isAltAction(eventData, transform.target)\n ? skewHandlerY(eventData, transform, x, y)\n : scalingX(eventData, transform, x, y);\n};\n\n/**\n * Composed action handler to either scale Y or skew X\n * Needs to be wrapped with `wrapWithFixedAnchor` to be effective\n * @param {Event} eventData javascript event that is doing the transform\n * @param {Object} transform javascript object containing a series of information around the current transform\n * @param {number} x current mouse x position, canvas normalized\n * @param {number} y current mouse y position, canvas normalized\n * @return {Boolean} true if some change happened\n */\nexport const scalingYOrSkewingX: TransformActionHandler = (\n eventData,\n transform,\n x,\n y,\n) => {\n return isAltAction(eventData, transform.target)\n ? skewHandlerX(eventData, transform, x, y)\n : scalingY(eventData, transform, x, y);\n};\n","import { RESIZING, ROTATE } from '../constants';\nimport { changeWidth } from './changeWidth';\nimport { Control } from './Control';\nimport { rotationStyleHandler, rotationWithSnapping } from './rotate';\nimport { scaleCursorStyleHandler, scalingEqually } from './scale';\nimport {\n scaleOrSkewActionName,\n scaleSkewCursorStyleHandler,\n scalingXOrSkewingY,\n scalingYOrSkewingX,\n} from './scaleSkew';\n\n// use this function if you want to generate new controls for every instance\nexport const createObjectDefaultControls = () => ({\n ml: new Control({\n x: -0.5,\n y: 0,\n cursorStyleHandler: scaleSkewCursorStyleHandler,\n actionHandler: scalingXOrSkewingY,\n getActionName: scaleOrSkewActionName,\n }),\n\n mr: new Control({\n x: 0.5,\n y: 0,\n cursorStyleHandler: scaleSkewCursorStyleHandler,\n actionHandler: scalingXOrSkewingY,\n getActionName: scaleOrSkewActionName,\n }),\n\n mb: new Control({\n x: 0,\n y: 0.5,\n cursorStyleHandler: scaleSkewCursorStyleHandler,\n actionHandler: scalingYOrSkewingX,\n getActionName: scaleOrSkewActionName,\n }),\n\n mt: new Control({\n x: 0,\n y: -0.5,\n cursorStyleHandler: scaleSkewCursorStyleHandler,\n actionHandler: scalingYOrSkewingX,\n getActionName: scaleOrSkewActionName,\n }),\n\n tl: new Control({\n x: -0.5,\n y: -0.5,\n cursorStyleHandler: scaleCursorStyleHandler,\n actionHandler: scalingEqually,\n }),\n\n tr: new Control({\n x: 0.5,\n y: -0.5,\n cursorStyleHandler: scaleCursorStyleHandler,\n actionHandler: scalingEqually,\n }),\n\n bl: new Control({\n x: -0.5,\n y: 0.5,\n cursorStyleHandler: scaleCursorStyleHandler,\n actionHandler: scalingEqually,\n }),\n\n br: new Control({\n x: 0.5,\n y: 0.5,\n cursorStyleHandler: scaleCursorStyleHandler,\n actionHandler: scalingEqually,\n }),\n\n mtr: new Control({\n x: 0,\n y: -0.5,\n actionHandler: rotationWithSnapping,\n cursorStyleHandler: rotationStyleHandler,\n offsetY: -40,\n withConnection: true,\n actionName: ROTATE,\n }),\n});\n\nexport const createResizeControls = () => ({\n mr: new Control({\n x: 0.5,\n y: 0,\n actionHandler: changeWidth,\n cursorStyleHandler: scaleSkewCursorStyleHandler,\n actionName: RESIZING,\n }),\n ml: new Control({\n x: -0.5,\n y: 0,\n actionHandler: changeWidth,\n cursorStyleHandler: scaleSkewCursorStyleHandler,\n actionName: RESIZING,\n }),\n});\n\nexport const createTextboxDefaultControls = () => ({\n ...createObjectDefaultControls(),\n ...createResizeControls(),\n});\n","import { Point, ZERO } from '../../Point';\nimport type { TCornerPoint, TDegree } from '../../typedefs';\nimport { FabricObject } from './Object';\nimport { degreesToRadians } from '../../util/misc/radiansDegreesConversion';\nimport type { TQrDecomposeOut } from '../../util/misc/matrix';\nimport {\n calcDimensionsMatrix,\n createRotateMatrix,\n createTranslateMatrix,\n multiplyTransformMatrices,\n qrDecompose,\n} from '../../util/misc/matrix';\nimport type { Control } from '../../controls/Control';\nimport { sizeAfterTransform } from '../../util/misc/objectTransforms';\nimport type { ObjectEvents, TPointerEvent } from '../../EventTypeDefs';\nimport type { Canvas } from '../../canvas/Canvas';\nimport type { ControlRenderingStyleOverride } from '../../controls/controlRendering';\nimport type { FabricObjectProps } from './types/FabricObjectProps';\nimport type { TFabricObjectProps, SerializedObjectProps } from './types';\nimport { createObjectDefaultControls } from '../../controls/commonControls';\nimport { interactiveObjectDefaultValues } from './defaultValues';\nimport { SCALE } from '../../constants';\n\nexport type TOCoord = Point & {\n corner: TCornerPoint;\n touchCorner: TCornerPoint;\n};\n\nexport type TControlSet = Record;\n\nexport type TBorderRenderingStyleOverride = Partial<\n Pick\n>;\n\nexport type TStyleOverride = ControlRenderingStyleOverride &\n TBorderRenderingStyleOverride &\n Partial<\n Pick & {\n forActiveSelection: boolean;\n }\n >;\n\nexport class InteractiveFabricObject<\n Props extends TFabricObjectProps = Partial,\n SProps extends SerializedObjectProps = SerializedObjectProps,\n EventSpec extends ObjectEvents = ObjectEvents,\n >\n extends FabricObject\n implements FabricObjectProps\n{\n declare noScaleCache: boolean;\n\n declare snapAngle?: TDegree;\n declare snapThreshold?: TDegree;\n\n declare lockMovementX: boolean;\n declare lockMovementY: boolean;\n declare lockRotation: boolean;\n declare lockScalingX: boolean;\n declare lockScalingY: boolean;\n declare lockSkewingX: boolean;\n declare lockSkewingY: boolean;\n declare lockScalingFlip: boolean;\n\n declare cornerSize: number;\n declare touchCornerSize: number;\n declare transparentCorners: boolean;\n declare cornerColor: string;\n declare cornerStrokeColor: string;\n declare cornerStyle: 'rect' | 'circle';\n declare cornerDashArray: number[] | null;\n declare hasControls: boolean;\n\n declare borderColor: string;\n declare borderDashArray: number[] | null;\n declare borderOpacityWhenMoving: number;\n declare borderScaleFactor: number;\n declare hasBorders: boolean;\n declare selectionBackgroundColor: string;\n\n declare selectable: boolean;\n declare evented: boolean;\n declare perPixelTargetFind: boolean;\n declare activeOn: 'down' | 'up';\n\n declare hoverCursor: CSSStyleDeclaration['cursor'] | null;\n declare moveCursor: CSSStyleDeclaration['cursor'] | null;\n\n /**\n * The object's controls' position in viewport coordinates\n * Calculated by {@link Control#positionHandler} and {@link Control#calcCornerCoords}, depending on {@link padding}.\n * `corner/touchCorner` describe the 4 points forming the interactive area of the corner.\n * Used to draw and locate controls.\n */\n declare oCoords: Record;\n\n /**\n * keeps the value of the last hovered corner during mouse move.\n * 0 is no corner, or 'mt', 'ml', 'mtr' etc..\n * It should be private, but there is no harm in using it as\n * a read-only property.\n * this isn't cleaned automatically. Non selected objects may have wrong values\n * @type [string]\n */\n declare __corner?: string;\n\n /**\n * a map of control visibility for this object.\n * this was left when controls were introduced to not break the api too much\n * this takes priority over the generic control visibility\n */\n declare _controlsVisibility: Record;\n\n /**\n * holds the controls for the object.\n * controls are added by default_controls.js\n */\n declare controls: TControlSet;\n\n /**\n * internal boolean to signal the code that the object is\n * part of the move action.\n */\n declare isMoving?: boolean;\n\n /**\n * A boolean used from the gesture module to keep tracking of a scaling\n * action when there is no scaling transform in place.\n * This is an edge case and is used twice in all codebase.\n * Probably added to keep track of some performance issues\n * @TODO use git blame to investigate why it was added\n * DON'T USE IT. WE WILL TRY TO REMOVE IT\n */\n declare _scaling?: boolean;\n\n declare canvas?: Canvas;\n\n static ownDefaults = interactiveObjectDefaultValues;\n\n static getDefaults(): Record {\n return {\n ...super.getDefaults(),\n ...InteractiveFabricObject.ownDefaults,\n };\n }\n\n /**\n * Constructor\n * @param {Object} [options] Options object\n */\n constructor(options?: Props) {\n super();\n Object.assign(\n this,\n (this.constructor as typeof InteractiveFabricObject).createControls(),\n InteractiveFabricObject.ownDefaults,\n );\n this.setOptions(options);\n }\n\n /**\n * Creates the default control object.\n * If you prefer to have on instance of controls shared among all objects\n * make this function return an empty object and add controls to the ownDefaults\n * @param {Object} [options] Options object\n */\n static createControls(): { controls: Record } {\n return { controls: createObjectDefaultControls() };\n }\n\n /**\n * Update width and height of the canvas for cache\n * returns true or false if canvas needed resize.\n * @private\n * @return {Boolean} true if the canvas has been resized\n */\n _updateCacheCanvas() {\n const targetCanvas = this.canvas;\n if (this.noScaleCache && targetCanvas && targetCanvas._currentTransform) {\n const transform = targetCanvas._currentTransform,\n target = transform.target,\n action = transform.action;\n if (\n this === (target as unknown as this) &&\n action &&\n action.startsWith(SCALE)\n ) {\n return false;\n }\n }\n return super._updateCacheCanvas();\n }\n\n getActiveControl() {\n const key = this.__corner;\n return key\n ? {\n key,\n control: this.controls[key],\n coord: this.oCoords[key],\n }\n : undefined;\n }\n\n /**\n * Determines which corner is under the mouse cursor, represented by `pointer`.\n * This function returns a corner only if the object is the active one.\n * This is done to avoid selecting corner of non active object and activating transformations\n * rather than drag action. The default behavior of fabricJS is that if you want to transform\n * an object, first you select it to show the control set\n * @private\n * @param {Object} pointer The pointer indicating the mouse position\n * @param {boolean} forTouch indicates if we are looking for interaction area with a touch action\n * @return {String|Boolean} corner code (tl, tr, bl, br, etc.), or 0 if nothing is found.\n */\n findControl(\n pointer: Point,\n forTouch = false,\n ): { key: string; control: Control; coord: TOCoord } | undefined {\n if (!this.hasControls || !this.canvas) {\n return undefined;\n }\n\n this.__corner = undefined;\n const cornerEntries = Object.entries(this.oCoords);\n for (let i = cornerEntries.length - 1; i >= 0; i--) {\n const [key, corner] = cornerEntries[i];\n const control = this.controls[key];\n\n if (\n control.shouldActivate(\n key,\n this,\n pointer,\n forTouch ? corner.touchCorner : corner.corner,\n )\n ) {\n // this.canvas.contextTop.fillRect(pointer.x - 1, pointer.y - 1, 2, 2);\n this.__corner = key;\n\n return { key, control, coord: this.oCoords[key] };\n }\n }\n\n return undefined;\n }\n\n /**\n * Calculates the coordinates of the center of each control plus the corners of the control itself\n * This basically just delegates to each control positionHandler\n * WARNING: changing what is passed to positionHandler is a breaking change, since position handler\n * is a public api and should be done just if extremely necessary\n * @return {Record}\n */\n calcOCoords(): Record {\n const vpt = this.getViewportTransform(),\n center = this.getCenterPoint(),\n tMatrix = createTranslateMatrix(center.x, center.y),\n rMatrix = createRotateMatrix({\n angle: this.getTotalAngle() - (!!this.group && this.flipX ? 180 : 0),\n }),\n positionMatrix = multiplyTransformMatrices(tMatrix, rMatrix),\n startMatrix = multiplyTransformMatrices(vpt, positionMatrix),\n finalMatrix = multiplyTransformMatrices(startMatrix, [\n 1 / vpt[0],\n 0,\n 0,\n 1 / vpt[3],\n 0,\n 0,\n ]),\n transformOptions = this.group\n ? qrDecompose(this.calcTransformMatrix())\n : undefined;\n // decomposing could bring negative scaling and `_calculateCurrentDimensions` can't take it\n if (transformOptions) {\n transformOptions.scaleX = Math.abs(transformOptions.scaleX);\n transformOptions.scaleY = Math.abs(transformOptions.scaleY);\n }\n const dim = this._calculateCurrentDimensions(transformOptions),\n coords: Record = {};\n\n this.forEachControl((control, key) => {\n const position = control.positionHandler(dim, finalMatrix, this, control);\n // coords[key] are sometimes used as points. Those are points to which we add\n // the property corner and touchCorner from `_calcCornerCoords`.\n // don't remove this assign for an object spread.\n coords[key] = Object.assign(\n position,\n this._calcCornerCoords(control, position),\n );\n });\n\n // debug code\n /*\n const canvas = this.canvas;\n setTimeout(function () {\n if (!canvas) return;\n canvas.contextTop.clearRect(0, 0, 700, 700);\n canvas.contextTop.fillStyle = 'green';\n Object.keys(coords).forEach(function(key) {\n const control = coords[key];\n canvas.contextTop.fillRect(control.x, control.y, 3, 3);\n });\n } 50);\n */\n return coords;\n }\n\n /**\n * Sets the coordinates that determine the interaction area of each control\n * note: if we would switch to ROUND corner area, all of this would disappear.\n * everything would resolve to a single point and a pythagorean theorem for the distance\n * @todo evaluate simplification of code switching to circle interaction area at runtime\n * @private\n */\n private _calcCornerCoords(control: Control, position: Point) {\n const angle = this.getTotalAngle();\n const corner = control.calcCornerCoords(\n angle,\n this.cornerSize,\n position.x,\n position.y,\n false,\n this,\n );\n const touchCorner = control.calcCornerCoords(\n angle,\n this.touchCornerSize,\n position.x,\n position.y,\n true,\n this,\n );\n return { corner, touchCorner };\n }\n\n /**\n * @override set controls' coordinates as well\n * See {@link https://github.com/fabricjs/fabric.js/wiki/When-to-call-setCoords} and {@link https://fabric5.fabricjs.com/fabric-gotchas}\n * @return {void}\n */\n setCoords(): void {\n super.setCoords();\n this.canvas && (this.oCoords = this.calcOCoords());\n }\n\n /**\n * Calls a function for each control. The function gets called,\n * with the control, the control's key and the object that is calling the iterator\n * @param {Function} fn function to iterate over the controls over\n */\n forEachControl(\n fn: (\n control: Control,\n key: string,\n fabricObject: InteractiveFabricObject,\n ) => any,\n ) {\n for (const i in this.controls) {\n fn(this.controls[i], i, this);\n }\n }\n\n /**\n * Draws a colored layer behind the object, inside its selection borders.\n * Requires public options: padding, selectionBackgroundColor\n * this function is called when the context is transformed\n * has checks to be skipped when the object is on a staticCanvas\n * @todo evaluate if make this disappear in favor of a pre-render hook for objects\n * this was added by Andrea Bogazzi to make possible some feature for work reasons\n * it seemed a good option, now is an edge case\n * @param {CanvasRenderingContext2D} ctx Context to draw on\n */\n drawSelectionBackground(ctx: CanvasRenderingContext2D): void {\n if (\n !this.selectionBackgroundColor ||\n (this.canvas && (this.canvas._activeObject as unknown as this) !== this)\n ) {\n return;\n }\n ctx.save();\n const center = this.getRelativeCenterPoint(),\n wh = this._calculateCurrentDimensions(),\n vpt = this.getViewportTransform();\n ctx.translate(center.x, center.y);\n ctx.scale(1 / vpt[0], 1 / vpt[3]);\n ctx.rotate(degreesToRadians(this.angle));\n ctx.fillStyle = this.selectionBackgroundColor;\n ctx.fillRect(-wh.x / 2, -wh.y / 2, wh.x, wh.y);\n ctx.restore();\n }\n\n /**\n * @public override this function in order to customize the drawing of the control box, e.g. rounded corners, different border style.\n * @param {CanvasRenderingContext2D} ctx ctx is rotated and translated so that (0,0) is at object's center\n * @param {Point} size the control box size used\n */\n strokeBorders(ctx: CanvasRenderingContext2D, size: Point): void {\n ctx.strokeRect(-size.x / 2, -size.y / 2, size.x, size.y);\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to draw on\n * @param {Point} size\n * @param {TStyleOverride} styleOverride object to override the object style\n */\n _drawBorders(\n ctx: CanvasRenderingContext2D,\n size: Point,\n styleOverride: TStyleOverride = {},\n ): void {\n const options = {\n hasControls: this.hasControls,\n borderColor: this.borderColor,\n borderDashArray: this.borderDashArray,\n ...styleOverride,\n };\n ctx.save();\n ctx.strokeStyle = options.borderColor;\n this._setLineDash(ctx, options.borderDashArray);\n this.strokeBorders(ctx, size);\n options.hasControls && this.drawControlsConnectingLines(ctx, size);\n ctx.restore();\n }\n\n /**\n * Renders controls and borders for the object\n * the context here is not transformed\n * @todo move to interactivity\n * @param {CanvasRenderingContext2D} ctx Context to render on\n * @param {TStyleOverride} [styleOverride] properties to override the object style\n */\n _renderControls(\n ctx: CanvasRenderingContext2D,\n styleOverride: TStyleOverride = {},\n ) {\n const { hasBorders, hasControls } = this;\n const styleOptions = {\n hasBorders,\n hasControls,\n ...styleOverride,\n };\n const vpt = this.getViewportTransform(),\n shouldDrawBorders = styleOptions.hasBorders,\n shouldDrawControls = styleOptions.hasControls;\n const matrix = multiplyTransformMatrices(vpt, this.calcTransformMatrix());\n const options = qrDecompose(matrix);\n ctx.save();\n ctx.translate(options.translateX, options.translateY);\n ctx.lineWidth = this.borderScaleFactor; // 1 * this.borderScaleFactor;\n // since interactive groups have been introduced, an object could be inside a group and needing controls\n // the following equality check `this.group === this.parent` covers:\n // object without a group ( undefined === undefined )\n // object inside a group\n // excludes object inside a group but multi selected since group and parent will differ in value\n if (this.group === this.parent) {\n ctx.globalAlpha = this.isMoving ? this.borderOpacityWhenMoving : 1;\n }\n if (this.flipX) {\n options.angle -= 180;\n }\n ctx.rotate(degreesToRadians(this.group ? options.angle : this.angle));\n shouldDrawBorders && this.drawBorders(ctx, options, styleOverride);\n shouldDrawControls && this.drawControls(ctx, styleOverride);\n ctx.restore();\n }\n\n /**\n * Draws borders of an object's bounding box.\n * Requires public properties: width, height\n * Requires public options: padding, borderColor\n * @param {CanvasRenderingContext2D} ctx Context to draw on\n * @param {object} options object representing current object parameters\n * @param {TStyleOverride} [styleOverride] object to override the object style\n */\n drawBorders(\n ctx: CanvasRenderingContext2D,\n options: TQrDecomposeOut,\n styleOverride: TStyleOverride,\n ): void {\n let size;\n if ((styleOverride && styleOverride.forActiveSelection) || this.group) {\n const bbox = sizeAfterTransform(\n this.width,\n this.height,\n calcDimensionsMatrix(options),\n ),\n stroke = !this.isStrokeAccountedForInDimensions()\n ? (this.strokeUniform\n ? new Point().scalarAdd(this.canvas ? this.canvas.getZoom() : 1)\n : // this is extremely confusing. options comes from the upper function\n // and is the qrDecompose of a matrix that takes in account zoom too\n new Point(options.scaleX, options.scaleY)\n ).scalarMultiply(this.strokeWidth)\n : ZERO;\n size = bbox\n .add(stroke)\n .scalarAdd(this.borderScaleFactor)\n .scalarAdd(this.padding * 2);\n } else {\n size = this._calculateCurrentDimensions().scalarAdd(\n this.borderScaleFactor,\n );\n }\n this._drawBorders(ctx, size, styleOverride);\n }\n\n /**\n * Draws lines from a borders of an object's bounding box to controls that have `withConnection` property set.\n * Requires public properties: width, height\n * Requires public options: padding, borderColor\n * @param {CanvasRenderingContext2D} ctx Context to draw on\n * @param {Point} size object size x = width, y = height\n */\n drawControlsConnectingLines(\n ctx: CanvasRenderingContext2D,\n size: Point,\n ): void {\n let shouldStroke = false;\n\n ctx.beginPath();\n this.forEachControl((control, key) => {\n // in this moment, the ctx is centered on the object.\n // width and height of the above function are the size of the bbox.\n if (control.withConnection && control.getVisibility(this, key)) {\n // reset movement for each control\n shouldStroke = true;\n ctx.moveTo(control.x * size.x, control.y * size.y);\n ctx.lineTo(\n control.x * size.x + control.offsetX,\n control.y * size.y + control.offsetY,\n );\n }\n });\n shouldStroke && ctx.stroke();\n }\n\n /**\n * Draws corners of an object's bounding box.\n * Requires public properties: width, height\n * Requires public options: cornerSize, padding\n * Be aware that since fabric 6.0 this function does not call setCoords anymore.\n * setCoords needs to be called manually if the object of which we are rendering controls\n * is outside the standard selection and transform process.\n * @param {CanvasRenderingContext2D} ctx Context to draw on\n * @param {ControlRenderingStyleOverride} styleOverride object to override the object style\n */\n drawControls(\n ctx: CanvasRenderingContext2D,\n styleOverride: ControlRenderingStyleOverride = {},\n ) {\n ctx.save();\n const retinaScaling = this.getCanvasRetinaScaling();\n const { cornerStrokeColor, cornerDashArray, cornerColor } = this;\n const options = {\n cornerStrokeColor,\n cornerDashArray,\n cornerColor,\n ...styleOverride,\n };\n ctx.setTransform(retinaScaling, 0, 0, retinaScaling, 0, 0);\n ctx.strokeStyle = ctx.fillStyle = options.cornerColor;\n if (!this.transparentCorners) {\n ctx.strokeStyle = options.cornerStrokeColor;\n }\n this._setLineDash(ctx, options.cornerDashArray);\n this.forEachControl((control, key) => {\n if (control.getVisibility(this, key)) {\n const p = this.oCoords[key];\n control.render(ctx, p.x, p.y, options, this);\n }\n });\n ctx.restore();\n }\n\n /**\n * Returns true if the specified control is visible, false otherwise.\n * @param {string} controlKey The key of the control. Possible values are usually 'tl', 'tr', 'br', 'bl', 'ml', 'mt', 'mr', 'mb', 'mtr',\n * but since the control api allow for any control name, can be any string.\n * @returns {boolean} true if the specified control is visible, false otherwise\n */\n isControlVisible(controlKey: string): boolean {\n return (\n this.controls[controlKey] &&\n this.controls[controlKey].getVisibility(this, controlKey)\n );\n }\n\n /**\n * Sets the visibility of the specified control.\n * please do not use.\n * @param {String} controlKey The key of the control. Possible values are 'tl', 'tr', 'br', 'bl', 'ml', 'mt', 'mr', 'mb', 'mtr'.\n * but since the control api allow for any control name, can be any string.\n * @param {Boolean} visible true to set the specified control visible, false otherwise\n * @todo discuss this overlap of priority here with the team. Andrea Bogazzi for details\n */\n setControlVisible(controlKey: string, visible: boolean) {\n if (!this._controlsVisibility) {\n this._controlsVisibility = {};\n }\n this._controlsVisibility[controlKey] = visible;\n }\n\n /**\n * Sets the visibility state of object controls, this is just a bulk option for setControlVisible;\n * @param {Record} [options] with an optional key per control\n * example: {Boolean} [options.bl] true to enable the bottom-left control, false to disable it\n */\n setControlsVisibility(options: Record = {}) {\n Object.entries(options).forEach(([controlKey, visibility]) =>\n this.setControlVisible(controlKey, visibility),\n );\n }\n\n /**\n * Clears the canvas.contextTop in a specific area that corresponds to the object's bounding box\n * that is in the canvas.contextContainer.\n * This function is used to clear pieces of contextTop where we render ephemeral effects on top of the object.\n * Example: blinking cursor text selection, drag effects.\n * @todo discuss swapping restoreManually with a renderCallback, but think of async issues\n * @param {Boolean} [restoreManually] When true won't restore the context after clear, in order to draw something else.\n * @return {CanvasRenderingContext2D|undefined} canvas.contextTop that is either still transformed\n * with the object transformMatrix, or restored to neutral transform\n */\n clearContextTop(\n restoreManually?: boolean,\n ): CanvasRenderingContext2D | undefined {\n if (!this.canvas) {\n return;\n }\n const ctx = this.canvas.contextTop;\n if (!ctx) {\n return;\n }\n const v = this.canvas.viewportTransform;\n ctx.save();\n ctx.transform(v[0], v[1], v[2], v[3], v[4], v[5]);\n this.transform(ctx);\n // we add 4 pixel, to be sure to do not leave any pixel out\n const width = this.width + 4,\n height = this.height + 4;\n ctx.clearRect(-width / 2, -height / 2, width, height);\n\n restoreManually || ctx.restore();\n return ctx;\n }\n\n /**\n * This callback function is called every time _discardActiveObject or _setActiveObject\n * try to to deselect this object. If the function returns true, the process is cancelled\n * @param {Object} [_options] options sent from the upper functions\n * @param {TPointerEvent} [options.e] event if the process is generated by an event\n * @param {FabricObject} [options.object] next object we are setting as active, and reason why\n * this is being deselected\n */\n onDeselect(_options?: {\n e?: TPointerEvent;\n object?: InteractiveFabricObject;\n }): boolean {\n // implemented by sub-classes, as needed.\n return false;\n }\n\n /**\n * This callback function is called every time _discardActiveObject or _setActiveObject\n * try to to select this object. If the function returns true, the process is cancelled\n * @param {Object} [_options] options sent from the upper functions\n * @param {Event} [_options.e] event if the process is generated by an event\n */\n onSelect(_options?: { e?: TPointerEvent }): boolean {\n // implemented by sub-classes, as needed.\n return false;\n }\n\n /**\n * Override to customize Drag behavior\n * Fired from {@link Canvas#_onMouseMove}\n * @returns true in order for the window to start a drag session\n */\n shouldStartDragging(_e: TPointerEvent) {\n return false;\n }\n\n /**\n * Override to customize Drag behavior\\\n * Fired once a drag session has started\n * @returns true to handle the drag event\n */\n onDragStart(_e: DragEvent) {\n return false;\n }\n\n /**\n * Override to customize drag and drop behavior\n * @public\n * @param {DragEvent} _e\n * @returns {boolean} true if the object currently dragged can be dropped on the target\n */\n canDrop(_e: DragEvent): boolean {\n return false;\n }\n\n /**\n * Override to customize drag and drop behavior\n * render a specific effect when an object is the source of a drag event\n * example: render the selection status for the part of text that is being dragged from a text object\n * @public\n * @param {DragEvent} _e\n */\n renderDragSourceEffect(_e: DragEvent) {\n // for subclasses\n }\n\n /**\n * Override to customize drag and drop behavior\n * render a specific effect when an object is the target of a drag event\n * used to show that the underly object can receive a drop, or to show how the\n * object will change when dropping. example: show the cursor where the text is about to be dropped\n * @public\n * @param {DragEvent} _e\n */\n renderDropTargetEffect(_e: DragEvent) {\n // for subclasses\n }\n}\n","import type { Constructor } from '../typedefs';\n\n/***\n * https://www.typescriptlang.org/docs/handbook/mixins.html#alternative-pattern\n */\nexport function applyMixins(\n derivedCtor: T,\n constructors: S[],\n) {\n constructors.forEach((baseCtor) => {\n Object.getOwnPropertyNames(baseCtor.prototype).forEach((name) => {\n name !== 'constructor' &&\n Object.defineProperty(\n derivedCtor.prototype,\n name,\n Object.getOwnPropertyDescriptor(baseCtor.prototype, name) ||\n Object.create(null),\n );\n });\n });\n return derivedCtor as T & { prototype: InstanceType };\n}\n","import type { ObjectEvents } from '../../EventTypeDefs';\nimport { FabricObjectSVGExportMixin } from './FabricObjectSVGExportMixin';\nimport { InteractiveFabricObject } from './InteractiveObject';\nimport { applyMixins } from '../../util/applyMixins';\nimport type { FabricObjectProps } from './types/FabricObjectProps';\nimport type { TFabricObjectProps, SerializedObjectProps } from './types';\nimport { classRegistry } from '../../ClassRegistry';\n\n// TODO somehow we have to make a tree-shakeable import\n\n// eslint-disable-next-line @typescript-eslint/no-empty-object-type\nexport interface FabricObject<\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n Props extends TFabricObjectProps = Partial,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n SProps extends SerializedObjectProps = SerializedObjectProps,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n EventSpec extends ObjectEvents = ObjectEvents,\n> extends FabricObjectSVGExportMixin {}\n\n// eslint-disable-next-line @typescript-eslint/no-unsafe-declaration-merging\nexport class FabricObject<\n Props extends TFabricObjectProps = Partial,\n SProps extends SerializedObjectProps = SerializedObjectProps,\n EventSpec extends ObjectEvents = ObjectEvents,\n> extends InteractiveFabricObject {}\n\napplyMixins(FabricObject, [FabricObjectSVGExportMixin]);\n\nclassRegistry.setClass(FabricObject);\nclassRegistry.setClass(FabricObject, 'object');\n\nexport { cacheProperties } from './defaultValues';\n","/**\n * Returns true if context has transparent pixel\n * at specified location (taking tolerance into account)\n * @param {CanvasRenderingContext2D} ctx context\n * @param {Number} x x coordinate in canvasElementCoordinate, not fabric space. integer\n * @param {Number} y y coordinate in canvasElementCoordinate, not fabric space. integer\n * @param {Number} tolerance Tolerance pixels around the point, not alpha tolerance, integer\n * @return {boolean} true if transparent\n */\nexport const isTransparent = (\n ctx: CanvasRenderingContext2D,\n x: number,\n y: number,\n tolerance: number,\n): boolean => {\n tolerance = Math.round(tolerance);\n const size = tolerance * 2 + 1;\n const { data } = ctx.getImageData(x - tolerance, y - tolerance, size, size);\n\n // Split image data - for tolerance > 1, pixelDataSize = 4;\n for (let i = 3; i < data.length; i += 4) {\n const alphaChannel = data[i];\n if (alphaChannel > 0) {\n return false;\n }\n }\n return true;\n};\n","export const findIndexRight = (\n array: T[],\n predicate: (value: T, index: number, array: T[]) => boolean,\n) => {\n for (let index = array.length - 1; index >= 0; index--) {\n if (predicate(array[index], index, array)) {\n return index;\n }\n }\n return -1;\n};\n","import type { XY } from '../../../Point';\nimport { Point } from '../../../Point';\nimport { degreesToRadians } from '../radiansDegreesConversion';\nimport { createVector } from '../vectors';\nimport type { TProjectStrokeOnPointsOptions, TProjection } from './types';\n\n/**\n * @see https://github.com/fabricjs/fabric.js/pull/8344\n * @todo consider removing skewing from points before calculating stroke projection,\n * see https://github.com/fabricjs/fabric.js/commit/494a10ee2f8c2278ae9a55b20bf50cf6ee25b064#commitcomment-94751537\n */\nexport abstract class StrokeProjectionsBase {\n declare options: TProjectStrokeOnPointsOptions;\n declare scale: Point;\n declare strokeUniformScalar: Point;\n declare strokeProjectionMagnitude: number;\n\n constructor(options: TProjectStrokeOnPointsOptions) {\n this.options = options;\n this.strokeProjectionMagnitude = this.options.strokeWidth / 2;\n this.scale = new Point(this.options.scaleX, this.options.scaleY);\n this.strokeUniformScalar = this.options.strokeUniform\n ? new Point(1 / this.options.scaleX, 1 / this.options.scaleY)\n : new Point(1, 1);\n }\n\n /**\n * When the stroke is uniform, scaling affects the arrangement of points. So we must take it into account.\n */\n protected createSideVector(from: XY, to: XY) {\n const v = createVector(from, to);\n return this.options.strokeUniform ? v.multiply(this.scale) : v;\n }\n\n protected abstract calcOrthogonalProjection(\n from: Point,\n to: Point,\n magnitude?: number,\n ): Point;\n\n protected projectOrthogonally(from: Point, to: Point, magnitude?: number) {\n return this.applySkew(\n from.add(this.calcOrthogonalProjection(from, to, magnitude)),\n );\n }\n\n protected isSkewed() {\n return this.options.skewX !== 0 || this.options.skewY !== 0;\n }\n\n protected applySkew(point: Point) {\n const p = new Point(point);\n // skewY must be applied before skewX as this distortion affects skewX calculation\n p.y += p.x * Math.tan(degreesToRadians(this.options.skewY));\n p.x += p.y * Math.tan(degreesToRadians(this.options.skewX));\n return p;\n }\n\n protected scaleUnitVector(unitVector: Point, scalar: number) {\n return unitVector.multiply(this.strokeUniformScalar).scalarMultiply(scalar);\n }\n\n protected abstract projectPoints(): Point[];\n\n public abstract project(): TProjection[];\n}\n","import type { XY } from '../../../Point';\nimport { Point } from '../../../Point';\nimport { halfPI, twoMathPi } from '../../../constants';\nimport type { TRadian } from '../../../typedefs';\nimport { degreesToRadians } from '../radiansDegreesConversion';\nimport {\n calcAngleBetweenVectors,\n calcVectorRotation,\n crossProduct,\n getOrthonormalVector,\n getUnitVector,\n isBetweenVectors,\n magnitude,\n rotateVector,\n} from '../vectors';\nimport { StrokeProjectionsBase } from './StrokeProjectionsBase';\nimport type { TProjection, TProjectStrokeOnPointsOptions } from './types';\n\nconst zeroVector = new Point();\n\n/**\n * class in charge of finding projections for each type of line join\n * @see {@link [Closed path projections at #8344](https://github.com/fabricjs/fabric.js/pull/8344#2-closed-path)}\n *\n * - MDN:\n * - https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/lineJoin\n * - https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/stroke-linejoin\n * - Spec: https://svgwg.org/svg2-draft/painting.html#StrokeLinejoinProperty\n * - Playground to understand how the line joins works: https://hypertolosana.github.io/efficient-webgl-stroking/index.html\n * - View the calculated projections for each of the control points: https://codesandbox.io/s/project-stroke-points-with-context-to-trace-b8jc4j?file=/src/index.js\n *\n */\nexport class StrokeLineJoinProjections extends StrokeProjectionsBase {\n /**\n * The point being projected (the angle ∠BAC)\n */\n declare A: Point;\n /**\n * The point before A\n */\n declare B: Point;\n /**\n * The point after A\n */\n declare C: Point;\n /**\n * The AB vector\n */\n AB: Point;\n /**\n * The AC vector\n */\n AC: Point;\n /**\n * The angle of A (∠BAC)\n */\n alpha: TRadian;\n /**\n * The bisector of A (∠BAC)\n */\n bisector: Point;\n\n static getOrthogonalRotationFactor(vector1: Point, vector2?: Point) {\n const angle = vector2\n ? calcAngleBetweenVectors(vector1, vector2)\n : calcVectorRotation(vector1);\n return Math.abs(angle) < halfPI ? -1 : 1;\n }\n\n constructor(A: XY, B: XY, C: XY, options: TProjectStrokeOnPointsOptions) {\n super(options);\n this.A = new Point(A);\n this.B = new Point(B);\n this.C = new Point(C);\n this.AB = this.createSideVector(this.A, this.B);\n this.AC = this.createSideVector(this.A, this.C);\n this.alpha = calcAngleBetweenVectors(this.AB, this.AC);\n this.bisector = getUnitVector(\n // if AC is also the zero vector nothing will be projected\n // in that case the next point will handle the projection\n rotateVector(this.AB.eq(zeroVector) ? this.AC : this.AB, this.alpha / 2),\n );\n }\n\n calcOrthogonalProjection(\n from: Point,\n to: Point,\n magnitude: number = this.strokeProjectionMagnitude,\n ) {\n const vector = this.createSideVector(from, to);\n const orthogonalProjection = getOrthonormalVector(vector);\n const correctSide = StrokeLineJoinProjections.getOrthogonalRotationFactor(\n orthogonalProjection,\n this.bisector,\n );\n return this.scaleUnitVector(orthogonalProjection, magnitude * correctSide);\n }\n\n /**\n * BEVEL\n * Calculation: the projection points are formed by the vector orthogonal to the vertex.\n *\n * @see https://github.com/fabricjs/fabric.js/pull/8344#2-2-bevel\n */\n projectBevel() {\n const projections: Point[] = [];\n // if `alpha` equals 0 or 2*PI, the projections are the same for `B` and `C`\n (this.alpha % twoMathPi === 0 ? [this.B] : [this.B, this.C]).forEach(\n (to) => {\n projections.push(this.projectOrthogonally(this.A, to));\n projections.push(\n this.projectOrthogonally(this.A, to, -this.strokeProjectionMagnitude),\n );\n },\n );\n return projections;\n }\n\n /**\n * MITER\n * Calculation: the corner is formed by extending the outer edges of the stroke\n * at the tangents of the path segments until they intersect.\n *\n * @see https://github.com/fabricjs/fabric.js/pull/8344#2-1-miter\n */\n projectMiter() {\n const projections: Point[] = [],\n alpha = Math.abs(this.alpha),\n hypotUnitScalar = 1 / Math.sin(alpha / 2),\n miterVector = this.scaleUnitVector(\n this.bisector,\n -this.strokeProjectionMagnitude * hypotUnitScalar,\n );\n\n // When two line segments meet at a sharp angle, it is possible for the join to extend,\n // far beyond the thickness of the line stroking the path. The stroke-miterlimit imposes\n // a limit on the extent of the line join.\n // MDN: https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/stroke-miterlimit\n // When the stroke is uniform, scaling changes the arrangement of points, this changes the miter-limit\n const strokeMiterLimit = this.options.strokeUniform\n ? magnitude(\n this.scaleUnitVector(this.bisector, this.options.strokeMiterLimit),\n )\n : this.options.strokeMiterLimit;\n\n if (\n magnitude(miterVector) / this.strokeProjectionMagnitude <=\n strokeMiterLimit\n ) {\n projections.push(this.applySkew(this.A.add(miterVector)));\n }\n /* when the miter-limit is reached, the stroke line join becomes of type bevel.\n We always need two orthogonal projections which are basically bevel-type projections,\n so regardless of whether the miter-limit was reached or not, we include these projections.\n */\n projections.push(...this.projectBevel());\n\n return projections;\n }\n\n /**\n * ROUND (without skew)\n * Calculation: the projections are the two vectors parallel to X and Y axes\n *\n * @see https://github.com/fabricjs/fabric.js/pull/8344#2-3-1-round-without-skew\n */\n private projectRoundNoSkew(startCircle: Point, endCircle: Point) {\n const projections: Point[] = [],\n // correctSide is used to only consider projecting for the outer side\n correctSide = new Point(\n StrokeLineJoinProjections.getOrthogonalRotationFactor(this.bisector),\n StrokeLineJoinProjections.getOrthogonalRotationFactor(\n new Point(this.bisector.y, this.bisector.x),\n ),\n ),\n radiusOnAxisX = new Point(1, 0)\n .scalarMultiply(this.strokeProjectionMagnitude)\n .multiply(this.strokeUniformScalar)\n .multiply(correctSide),\n radiusOnAxisY = new Point(0, 1)\n .scalarMultiply(this.strokeProjectionMagnitude)\n .multiply(this.strokeUniformScalar)\n .multiply(correctSide);\n\n [radiusOnAxisX, radiusOnAxisY].forEach((vector) => {\n if (isBetweenVectors(vector, startCircle, endCircle)) {\n projections.push(this.A.add(vector));\n }\n });\n return projections;\n }\n\n /**\n * ROUND (with skew)\n * Calculation: the projections are the points furthest from the vertex in\n * the direction of the X and Y axes after distortion.\n *\n * @see https://github.com/fabricjs/fabric.js/pull/8344#2-3-2-round-skew\n */\n private projectRoundWithSkew(startCircle: Point, endCircle: Point) {\n const projections: Point[] = [];\n\n const { skewX, skewY, scaleX, scaleY, strokeUniform } = this.options,\n shearing = new Point(\n Math.tan(degreesToRadians(skewX)),\n Math.tan(degreesToRadians(skewY)),\n );\n // The points furthest from the vertex in the direction of the X and Y axes after distortion\n const circleRadius = this.strokeProjectionMagnitude,\n newY = strokeUniform\n ? circleRadius /\n scaleY /\n Math.sqrt(1 / scaleY ** 2 + (1 / scaleX ** 2) * shearing.y ** 2)\n : circleRadius / Math.sqrt(1 + shearing.y ** 2),\n furthestY = new Point(\n // Safe guard due to floating point precision. In some situations the square root\n // was returning NaN because of a negative number close to zero.\n Math.sqrt(Math.max(circleRadius ** 2 - newY ** 2, 0)),\n newY,\n ),\n newX = strokeUniform\n ? circleRadius /\n Math.sqrt(\n 1 +\n (shearing.x ** 2 * (1 / scaleY) ** 2) /\n (1 / scaleX + (1 / scaleX) * shearing.x * shearing.y) ** 2,\n )\n : circleRadius /\n Math.sqrt(1 + shearing.x ** 2 / (1 + shearing.x * shearing.y) ** 2),\n furthestX = new Point(\n newX,\n Math.sqrt(Math.max(circleRadius ** 2 - newX ** 2, 0)),\n );\n\n [\n furthestX,\n furthestX.scalarMultiply(-1),\n furthestY,\n furthestY.scalarMultiply(-1),\n ]\n // We need to skew the vector here as this information is used to check if\n // it is between the start and end of the circle segment\n .map((vector) =>\n this.applySkew(\n strokeUniform ? vector.multiply(this.strokeUniformScalar) : vector,\n ),\n )\n .forEach((vector) => {\n if (isBetweenVectors(vector, startCircle, endCircle)) {\n projections.push(this.applySkew(this.A).add(vector));\n }\n });\n\n return projections;\n }\n\n projectRound() {\n const projections: Point[] = [];\n /* Include the start and end points of the circle segment, so that only\n the projections contained within it are included */\n // add the orthogonal projections (start and end points of circle segment)\n projections.push(...this.projectBevel());\n // let's determines which one of the orthogonal projection is the beginning and end of the circle segment.\n // when `alpha` equals 0 or 2*PI, we have a straight line, so the way to find the start/end is different.\n const isStraightLine = this.alpha % twoMathPi === 0,\n // change the origin of the projections to point A\n // so that the cross product calculation is correct\n newOrigin = this.applySkew(this.A),\n proj0 = projections[isStraightLine ? 0 : 2].subtract(newOrigin),\n proj1 = projections[isStraightLine ? 1 : 0].subtract(newOrigin),\n // when `isStraightLine` === true, we compare with the vector opposite AB, otherwise we compare with the bisector.\n comparisonVector = isStraightLine\n ? this.applySkew(this.AB.scalarMultiply(-1))\n : this.applySkew(\n this.bisector.multiply(this.strokeUniformScalar).scalarMultiply(-1),\n ),\n // the beginning of the circle segment is always to the right of the comparison vector (cross product > 0)\n isProj0Start = crossProduct(proj0, comparisonVector) > 0,\n startCircle = isProj0Start ? proj0 : proj1,\n endCircle = isProj0Start ? proj1 : proj0;\n if (!this.isSkewed()) {\n projections.push(...this.projectRoundNoSkew(startCircle, endCircle));\n } else {\n projections.push(...this.projectRoundWithSkew(startCircle, endCircle));\n }\n return projections;\n }\n\n /**\n * Project stroke width on points returning projections for each point as follows:\n * - `miter`: 1 point corresponding to the outer boundary. If the miter limit is exceeded, it will be 2 points (becomes bevel)\n * - `bevel`: 2 points corresponding to the bevel possible boundaries, orthogonal to the stroke.\n * - `round`: same as `bevel` when it has no skew, with skew are 4 points.\n */\n protected projectPoints() {\n switch (this.options.strokeLineJoin) {\n case 'miter':\n return this.projectMiter();\n case 'round':\n return this.projectRound();\n default:\n return this.projectBevel();\n }\n }\n\n public project(): TProjection[] {\n return this.projectPoints().map((point) => ({\n originPoint: this.A,\n projectedPoint: point,\n angle: this.alpha,\n bisector: this.bisector,\n }));\n }\n}\n","import type { XY } from '../../../Point';\nimport { Point } from '../../../Point';\nimport { getOrthonormalVector, getUnitVector } from '../vectors';\nimport { StrokeLineJoinProjections } from './StrokeLineJoinProjections';\nimport { StrokeProjectionsBase } from './StrokeProjectionsBase';\nimport type { TProjection, TProjectStrokeOnPointsOptions } from './types';\n\n/**\n * class in charge of finding projections for each type of line cap for start/end of an open path\n * @see {@link [Open path projections at #8344](https://github.com/fabricjs/fabric.js/pull/8344#1-open-path)}\n *\n * Reference:\n * - MDN:\n * - https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/lineCap\n * - https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/stroke-linecap\n * - Spec: https://html.spec.whatwg.org/multipage/canvas.html#dom-context-2d-linecap-dev\n * - Playground to understand how the line joins works: https://hypertolosana.github.io/efficient-webgl-stroking/index.html\n * - View the calculated projections for each of the control points: https://codesandbox.io/s/project-stroke-points-with-context-to-trace-b8jc4j?file=/src/index.js\n */\nexport class StrokeLineCapProjections extends StrokeProjectionsBase {\n /**\n * edge point\n */\n declare A: Point;\n /**\n * point next to edge point\n */\n declare T: Point;\n\n constructor(A: XY, T: XY, options: TProjectStrokeOnPointsOptions) {\n super(options);\n this.A = new Point(A);\n this.T = new Point(T);\n }\n\n calcOrthogonalProjection(\n from: Point,\n to: Point,\n magnitude: number = this.strokeProjectionMagnitude,\n ) {\n const vector = this.createSideVector(from, to);\n return this.scaleUnitVector(getOrthonormalVector(vector), magnitude);\n }\n\n /**\n * OPEN PATH START/END - Line cap: Butt\n * Calculation: to find the projections, just find the points orthogonal to the stroke\n *\n * @see https://github.com/fabricjs/fabric.js/pull/8344#1-1-butt\n */\n projectButt() {\n return [\n this.projectOrthogonally(this.A, this.T, this.strokeProjectionMagnitude),\n this.projectOrthogonally(this.A, this.T, -this.strokeProjectionMagnitude),\n ];\n }\n\n /**\n * OPEN PATH START/END - Line cap: Round\n * Calculation: same as stroke line join `round`\n *\n * @see https://github.com/fabricjs/fabric.js/pull/8344#1-2-round\n */\n projectRound() {\n const projections: Point[] = [];\n\n if (!this.isSkewed() && this.A.eq(this.T)) {\n /* 1 point case without `skew`\n When `strokeUniform` is true, scaling has no effect.\n So we divide by scale, to remove its effect.\n */\n const projection = new Point(1, 1)\n .scalarMultiply(this.strokeProjectionMagnitude)\n .multiply(this.strokeUniformScalar);\n projections.push(\n this.applySkew(this.A.add(projection)),\n this.applySkew(this.A.subtract(projection)),\n );\n } else {\n projections.push(\n ...new StrokeLineJoinProjections(\n this.A,\n this.T,\n this.T,\n this.options,\n ).projectRound(),\n );\n }\n\n return projections;\n }\n\n /**\n * OPEN PATH START/END - Line cap: Square\n * Calculation: project a rectangle of points on the stroke in the opposite direction of the vector `AT`\n *\n * @see https://github.com/fabricjs/fabric.js/pull/8344#1-3-square\n */\n projectSquare() {\n const projections: Point[] = [];\n\n if (this.A.eq(this.T)) {\n /* 1 point case without `skew`\n When `strokeUniform` is true, scaling has no effect.\n So we divide by scale, to remove its effect.\n */\n const projection = new Point(1, 1)\n .scalarMultiply(this.strokeProjectionMagnitude)\n .multiply(this.strokeUniformScalar);\n projections.push(this.A.add(projection), this.A.subtract(projection));\n } else {\n const orthogonalProjection = this.calcOrthogonalProjection(\n this.A,\n this.T,\n this.strokeProjectionMagnitude,\n );\n const strokePointingOut = this.scaleUnitVector(\n getUnitVector(this.createSideVector(this.A, this.T)),\n -this.strokeProjectionMagnitude,\n );\n const projectedA = this.A.add(strokePointingOut);\n projections.push(\n projectedA.add(orthogonalProjection),\n projectedA.subtract(orthogonalProjection),\n );\n }\n\n return projections.map((p) => this.applySkew(p));\n }\n\n protected projectPoints() {\n switch (this.options.strokeLineCap) {\n case 'round':\n return this.projectRound();\n case 'square':\n return this.projectSquare();\n default:\n return this.projectButt();\n }\n }\n\n public project(): TProjection[] {\n return this.projectPoints().map((point) => ({\n originPoint: this.A,\n projectedPoint: point,\n }));\n }\n}\n","import { Point, type XY } from '../../../Point';\nimport { findIndexRight } from '../../internals/findRight';\nimport { StrokeLineCapProjections } from './StrokeLineCapProjections';\nimport { StrokeLineJoinProjections } from './StrokeLineJoinProjections';\nimport type { TProjection, TProjectStrokeOnPointsOptions } from './types';\n\nexport type * from './types';\n\n/**\n *\n * Used to calculate object's bounding box\n *\n * @see https://github.com/fabricjs/fabric.js/pull/8344\n *\n */\nexport const projectStrokeOnPoints = (\n points: XY[],\n options: TProjectStrokeOnPointsOptions,\n openPath = false,\n): TProjection[] => {\n const projections: TProjection[] = [];\n\n if (points.length === 0) {\n return projections;\n }\n\n // first we remove duplicate neighboring points\n const reduced = points.reduce(\n (reduced, point) => {\n if (!reduced[reduced.length - 1].eq(point)) {\n reduced.push(new Point(point));\n }\n return reduced;\n },\n [new Point(points[0])],\n );\n\n if (reduced.length === 1) {\n openPath = true;\n } else if (!openPath) {\n // remove points from end in case they equal the first point\n // in order to correctly project the first point\n const start = reduced[0];\n const index = findIndexRight(reduced, (point) => !point.eq(start));\n reduced.splice(index + 1);\n }\n\n reduced.forEach((A, index, points) => {\n let B: XY, C: XY;\n if (index === 0) {\n C = points[1];\n B = openPath ? A : points[points.length - 1];\n } else if (index === points.length - 1) {\n B = points[index - 1];\n C = openPath ? A : points[0];\n } else {\n B = points[index - 1];\n C = points[index + 1];\n }\n\n if (openPath && points.length === 1) {\n projections.push(\n ...new StrokeLineCapProjections(A, A, options).project(),\n );\n } else if (openPath && (index === 0 || index === points.length - 1)) {\n projections.push(\n ...new StrokeLineCapProjections(\n A,\n index === 0 ? C : B,\n options,\n ).project(),\n );\n } else {\n projections.push(\n ...new StrokeLineJoinProjections(A, B, C, options).project(),\n );\n }\n });\n\n return projections;\n};\n","import type { TextStyle } from '../../shapes/Text/StyledText';\n\nexport const cloneStyles = (style: TextStyle): TextStyle => {\n const newObj: TextStyle = {};\n Object.keys(style).forEach((key) => {\n newObj[key] = {};\n Object.keys(style[key]).forEach((keyInner) => {\n newObj[key][keyInner] = { ...style[key][keyInner] };\n });\n });\n return newObj;\n};\n","import { getFabricWindow } from '../env';\n\n/**\n * Capitalizes a string\n * @param {String} string String to capitalize\n * @param {Boolean} [firstLetterOnly] If true only first letter is capitalized\n * and other letters stay untouched, if false first letter is capitalized\n * and other letters are converted to lowercase.\n * @return {String} Capitalized version of a string\n */\nexport const capitalize = (string: string, firstLetterOnly = false): string =>\n `${string.charAt(0).toUpperCase()}${\n firstLetterOnly ? string.slice(1) : string.slice(1).toLowerCase()\n }`;\n\n/**\n * Escapes XML in a string\n * @param {String} string String to escape\n * @return {String} Escaped version of a string\n */\nexport const escapeXml = (string: string): string =>\n string\n .replace(/&/g, '&')\n .replace(/\"/g, '"')\n .replace(/'/g, ''')\n .replace(//g, '>');\n\nlet segmenter: Intl.Segmenter | false;\n\nconst getSegmenter = () => {\n if (!segmenter) {\n segmenter =\n 'Intl' in getFabricWindow() &&\n 'Segmenter' in Intl &&\n new Intl.Segmenter(undefined, {\n granularity: 'grapheme',\n });\n }\n return segmenter;\n};\n\n/**\n * Divide a string in the user perceived single units\n * @param {String} textstring String to escape\n * @return {Array} array containing the graphemes\n */\nexport const graphemeSplit = (textstring: string): string[] => {\n segmenter || getSegmenter();\n if (segmenter) {\n const segments = segmenter.segment(textstring);\n return Array.from(segments).map(({ segment }) => segment);\n }\n\n //Fallback\n return graphemeSplitImpl(textstring);\n};\n\nconst graphemeSplitImpl = (textstring: string): string[] => {\n const graphemes: string[] = [];\n for (let i = 0, chr; i < textstring.length; i++) {\n if ((chr = getWholeChar(textstring, i)) === false) {\n continue;\n }\n graphemes.push(chr);\n }\n return graphemes;\n};\n\n// taken from mdn in the charAt doc page.\nconst getWholeChar = (str: string, i: number): string | false => {\n const code = str.charCodeAt(i);\n if (isNaN(code)) {\n return ''; // Position not found\n }\n if (code < 0xd800 || code > 0xdfff) {\n return str.charAt(i);\n }\n\n // High surrogate (could change last hex to 0xDB7F to treat high private\n // surrogates as single characters)\n if (0xd800 <= code && code <= 0xdbff) {\n if (str.length <= i + 1) {\n throw 'High surrogate without following low surrogate';\n }\n const next = str.charCodeAt(i + 1);\n if (0xdc00 > next || next > 0xdfff) {\n throw 'High surrogate without following low surrogate';\n }\n return str.charAt(i) + str.charAt(i + 1);\n }\n // Low surrogate (0xDC00 <= code && code <= 0xDFFF)\n if (i === 0) {\n throw 'Low surrogate without preceding high surrogate';\n }\n const prev = str.charCodeAt(i - 1);\n\n // (could change last hex to 0xDB7F to treat high private\n // surrogates as single characters)\n if (0xd800 > prev || prev > 0xdbff) {\n throw 'Low surrogate without preceding high surrogate';\n }\n // We can pass over low surrogates now as the second component\n // in a pair which we have already processed\n return false;\n};\n","import { reNewline } from '../../constants';\nimport type {\n TextStyle,\n TextStyleDeclaration,\n} from '../../shapes/Text/StyledText';\nimport { cloneStyles } from '../internals/cloneStyles';\nimport { graphemeSplit } from '../lang_string';\n\nexport type TextStyleArray = {\n start: number;\n end: number;\n style: TextStyleDeclaration;\n}[];\n\n/**\n * @param {Object} prevStyle first style to compare\n * @param {Object} thisStyle second style to compare\n * @param {boolean} forTextSpans whether to check overline, underline, and line-through properties\n * @return {boolean} true if the style changed\n */\nexport const hasStyleChanged = (\n prevStyle: TextStyleDeclaration,\n thisStyle: TextStyleDeclaration,\n forTextSpans = false,\n) =>\n prevStyle.fill !== thisStyle.fill ||\n prevStyle.stroke !== thisStyle.stroke ||\n prevStyle.strokeWidth !== thisStyle.strokeWidth ||\n prevStyle.fontSize !== thisStyle.fontSize ||\n prevStyle.fontFamily !== thisStyle.fontFamily ||\n prevStyle.fontWeight !== thisStyle.fontWeight ||\n prevStyle.fontStyle !== thisStyle.fontStyle ||\n prevStyle.textDecorationThickness !== thisStyle.textDecorationThickness ||\n prevStyle.textBackgroundColor !== thisStyle.textBackgroundColor ||\n prevStyle.deltaY !== thisStyle.deltaY ||\n (forTextSpans &&\n (prevStyle.overline !== thisStyle.overline ||\n prevStyle.underline !== thisStyle.underline ||\n prevStyle.linethrough !== thisStyle.linethrough));\n\n/**\n * Returns the array form of a text object's inline styles property with styles grouped in ranges\n * rather than per character. This format is less verbose, and is better suited for storage\n * so it is used in serialization (not during runtime).\n * @param {object} styles per character styles for a text object\n * @param {String} text the text string that the styles are applied to\n * @return {{start: number, end: number, style: object}[]}\n */\nexport const stylesToArray = (\n styles: TextStyle,\n text: string,\n): TextStyleArray => {\n const textLines = text.split('\\n'),\n stylesArray = [];\n let charIndex = -1,\n prevStyle = {};\n // clone style structure to prevent mutation\n styles = cloneStyles(styles);\n\n //loop through each textLine\n for (let i = 0; i < textLines.length; i++) {\n const chars = graphemeSplit(textLines[i]);\n if (!styles[i]) {\n //no styles exist for this line, so add the line's length to the charIndex total and reset prevStyle\n charIndex += chars.length;\n prevStyle = {};\n continue;\n }\n //loop through each character of the current line\n for (let c = 0; c < chars.length; c++) {\n charIndex++;\n const thisStyle = styles[i][c];\n //check if style exists for this character\n if (thisStyle && Object.keys(thisStyle).length > 0) {\n if (hasStyleChanged(prevStyle, thisStyle, true)) {\n stylesArray.push({\n start: charIndex,\n end: charIndex + 1,\n style: thisStyle,\n });\n } else {\n //if style is the same as previous character, increase end index\n stylesArray[stylesArray.length - 1].end++;\n }\n }\n prevStyle = thisStyle || {};\n }\n }\n return stylesArray;\n};\n\n/**\n * Returns the object form of the styles property with styles that are assigned per\n * character rather than grouped by range. This format is more verbose, and is\n * only used during runtime (not for serialization/storage)\n * @param {Array} styles the serialized form of a text object's styles\n * @param {String} text the text string that the styles are applied to\n * @return {Object}\n */\nexport const stylesFromArray = (\n styles: TextStyleArray | TextStyle,\n text: string,\n): TextStyle => {\n if (!Array.isArray(styles)) {\n // clone to prevent mutation\n return cloneStyles(styles);\n }\n const textLines = text.split(reNewline),\n stylesObject: TextStyle = {};\n let charIndex = -1,\n styleIndex = 0;\n //loop through each textLine\n for (let i = 0; i < textLines.length; i++) {\n const chars = graphemeSplit(textLines[i]);\n\n //loop through each character of the current line\n for (let c = 0; c < chars.length; c++) {\n charIndex++;\n //check if there's a style collection that includes the current character\n if (\n styles[styleIndex] &&\n styles[styleIndex].start <= charIndex &&\n charIndex < styles[styleIndex].end\n ) {\n //create object for line index if it doesn't exist\n stylesObject[i] = stylesObject[i] || {};\n //assign a style at this character's index\n stylesObject[i][c] = { ...styles[styleIndex].style };\n //if character is at the end of the current style collection, move to the next\n if (charIndex === styles[styleIndex].end - 1) {\n styleIndex++;\n }\n }\n }\n }\n return stylesObject;\n};\n","import { FILL, STROKE } from '../constants';\n\n/**\n * Attributes parsed from all SVG elements\n * @type array\n */\nexport const SHARED_ATTRIBUTES = [\n 'display',\n 'transform',\n FILL,\n 'fill-opacity',\n 'fill-rule',\n 'opacity',\n STROKE,\n 'stroke-dasharray',\n 'stroke-linecap',\n 'stroke-dashoffset',\n 'stroke-linejoin',\n 'stroke-miterlimit',\n 'stroke-opacity',\n 'stroke-width',\n 'id',\n 'paint-order',\n 'vector-effect',\n 'instantiated_by_use',\n 'clip-path',\n];\n","export function selectorMatches(\n element: HTMLElement | SVGElement,\n selector: string,\n) {\n const nodeName = element.nodeName;\n const classNames = element.getAttribute('class');\n const id = element.getAttribute('id');\n const azAz = '(?![a-zA-Z\\\\-]+)';\n let matcher;\n // i check if a selector matches slicing away part from it.\n // if i get empty string i should match\n matcher = new RegExp('^' + nodeName, 'i');\n selector = selector.replace(matcher, '');\n if (id && selector.length) {\n matcher = new RegExp('#' + id + azAz, 'i');\n selector = selector.replace(matcher, '');\n }\n if (classNames && selector.length) {\n const splitClassNames = classNames.split(' ');\n for (let i = splitClassNames.length; i--; ) {\n matcher = new RegExp('\\\\.' + splitClassNames[i] + azAz, 'i');\n selector = selector.replace(matcher, '');\n }\n }\n return selector.length === 0;\n}\n","import { selectorMatches } from './selectorMatches';\n\nexport function doesSomeParentMatch(\n element: HTMLElement | SVGElement,\n selectors: string[],\n) {\n let selector: string,\n parentMatching = true;\n while (\n element.parentElement &&\n element.parentElement.nodeType === 1 &&\n selectors.length\n ) {\n if (parentMatching) {\n selector = selectors.pop()!;\n }\n element = element.parentElement;\n parentMatching = selectorMatches(element, selector!);\n }\n return selectors.length === 0;\n}\n","import { selectorMatches } from './selectorMatches';\nimport { doesSomeParentMatch } from './doesSomeParentMatch';\n\n/**\n * @private\n */\n\nexport function elementMatchesRule(\n element: HTMLElement | SVGElement,\n selectors: string[],\n) {\n let parentMatching = true;\n // start from rightmost selector.\n const firstMatching = selectorMatches(element, selectors.pop()!);\n if (firstMatching && selectors.length) {\n parentMatching = doesSomeParentMatch(element, selectors);\n }\n return firstMatching && parentMatching && selectors.length === 0;\n}\n","import { elementMatchesRule } from './elementMatchesRule';\nimport type { CSSRules } from './typedefs';\n\n/**\n * @private\n */\n\nexport function getGlobalStylesForElement(\n element: HTMLElement | SVGElement,\n cssRules: CSSRules = {},\n) {\n let styles: Record = {};\n for (const rule in cssRules) {\n if (elementMatchesRule(element, rule.split(' '))) {\n styles = {\n ...styles,\n ...cssRules[rule],\n };\n }\n }\n return styles;\n}\n","import { attributesMap } from './constants';\n\nexport const normalizeAttr = (\n attr: keyof typeof attributesMap | string,\n): string => attributesMap[attr as keyof typeof attributesMap] ?? attr;\n","import { reNum } from '../../parser/constants';\n\nconst regex = new RegExp(`(${reNum})`, 'gi');\n\nexport const cleanupSvgAttribute = (attributeValue: string) =>\n attributeValue\n .replace(regex, ' $1 ')\n // replace annoying commas and arbitrary whitespace with single spaces\n .replace(/,/gi, ' ')\n .replace(/\\s+/gi, ' ');\n","import { ROTATE, SCALE, SKEW_X, SKEW_Y, iMatrix } from '../constants';\nimport { reNum } from './constants';\nimport type { TMat2D } from '../typedefs';\nimport { cleanupSvgAttribute } from '../util/internals/cleanupSvgAttribute';\nimport {\n createRotateMatrix,\n createScaleMatrix,\n createSkewXMatrix,\n createSkewYMatrix,\n createTranslateMatrix,\n multiplyTransformMatrixArray,\n} from '../util/misc/matrix';\n\n// == begin transform regexp\nconst p = `(${reNum})`;\nconst skewX = String.raw`(skewX)\\(${p}\\)`;\nconst skewY = String.raw`(skewY)\\(${p}\\)`;\nconst rotate = String.raw`(rotate)\\(${p}(?: ${p} ${p})?\\)`;\nconst scale = String.raw`(scale)\\(${p}(?: ${p})?\\)`;\nconst translate = String.raw`(translate)\\(${p}(?: ${p})?\\)`;\nconst matrix = String.raw`(matrix)\\(${p} ${p} ${p} ${p} ${p} ${p}\\)`;\nconst transform = `(?:${matrix}|${translate}|${rotate}|${scale}|${skewX}|${skewY})`;\nconst transforms = `(?:${transform}*)`;\nconst transformList = String.raw`^\\s*(?:${transforms}?)\\s*$`;\n// http://www.w3.org/TR/SVG/coords.html#TransformAttribute\nconst reTransformList = new RegExp(transformList);\nconst reTransform = new RegExp(transform);\nconst reTransformAll = new RegExp(transform, 'g');\n// == end transform regexp\n\n/**\n * Parses \"transform\" attribute, returning an array of values\n * @param {String} attributeValue String containing attribute value\n * @return {TTransformMatrix} Array of 6 elements representing transformation matrix\n */\nexport function parseTransformAttribute(attributeValue: string): TMat2D {\n // first we clean the string\n attributeValue = cleanupSvgAttribute(attributeValue)\n // remove spaces around front parentheses\n .replace(/\\s*([()])\\s*/gi, '$1');\n\n // start with identity matrix\n const matrices: TMat2D[] = [];\n\n // return if no argument was given or\n // an argument does not match transform attribute regexp\n if (\n !attributeValue ||\n (attributeValue && !reTransformList.test(attributeValue))\n ) {\n return [...iMatrix];\n }\n\n for (const match of attributeValue.matchAll(reTransformAll)) {\n const transformMatch = reTransform.exec(match[0]);\n if (!transformMatch) {\n continue;\n }\n let matrix: TMat2D = iMatrix;\n const matchedParams = transformMatch.filter((m) => !!m);\n const [, operation, ...rawArgs] = matchedParams;\n const [arg0, arg1, arg2, arg3, arg4, arg5] = rawArgs.map((arg) =>\n parseFloat(arg),\n );\n\n switch (operation) {\n case 'translate':\n matrix = createTranslateMatrix(arg0, arg1);\n break;\n case ROTATE:\n matrix = createRotateMatrix({ angle: arg0 }, { x: arg1, y: arg2 });\n break;\n case SCALE:\n matrix = createScaleMatrix(arg0, arg1);\n break;\n case SKEW_X:\n matrix = createSkewXMatrix(arg0);\n break;\n case SKEW_Y:\n matrix = createSkewYMatrix(arg0);\n break;\n case 'matrix':\n matrix = [arg0, arg1, arg2, arg3, arg4, arg5];\n break;\n }\n\n // snapshot current matrix into matrices array\n matrices.push(matrix);\n }\n\n return multiplyTransformMatrixArray(matrices);\n}\n","import { multiplyTransformMatrices } from '../util/misc/matrix';\nimport { parseUnit } from '../util/misc/svgParsing';\nimport { parseTransformAttribute } from './parseTransformAttribute';\nimport { CENTER, LEFT, RIGHT, NONE, FILL, STROKE } from '../constants';\nimport { TEXT_DECORATION_THICKNESS } from '../shapes/Text/constants';\n\nexport function normalizeValue(\n attr: string,\n value: any,\n parentAttributes: Record,\n fontSize: number,\n): string | null | boolean | number[] | number {\n const isArray = Array.isArray(value);\n let parsed: number | number[];\n let ouputValue: string | null | boolean | number[] | number = value;\n if ((attr === FILL || attr === STROKE) && value === NONE) {\n ouputValue = '';\n } else if (attr === 'strokeUniform') {\n return value === 'non-scaling-stroke';\n } else if (attr === 'strokeDashArray') {\n if (value === NONE) {\n ouputValue = null;\n } else {\n ouputValue = value.replace(/,/g, ' ').split(/\\s+/).map(parseFloat);\n }\n } else if (attr === 'transformMatrix') {\n if (parentAttributes && parentAttributes.transformMatrix) {\n ouputValue = multiplyTransformMatrices(\n parentAttributes.transformMatrix,\n parseTransformAttribute(value),\n );\n } else {\n ouputValue = parseTransformAttribute(value);\n }\n } else if (attr === 'visible') {\n ouputValue = value !== NONE && value !== 'hidden';\n // display=none on parent element always takes precedence over child element\n if (parentAttributes && parentAttributes.visible === false) {\n ouputValue = false;\n }\n } else if (attr === 'opacity') {\n ouputValue = parseFloat(value);\n if (parentAttributes && typeof parentAttributes.opacity !== 'undefined') {\n ouputValue *= parentAttributes.opacity as number;\n }\n } else if (attr === 'textAnchor' /* text-anchor */) {\n ouputValue = value === 'start' ? LEFT : value === 'end' ? RIGHT : CENTER;\n } else if (attr === 'charSpacing' || attr === TEXT_DECORATION_THICKNESS) {\n // parseUnit returns px and we convert it to em\n parsed = (parseUnit(value, fontSize) / fontSize) * 1000;\n } else if (attr === 'paintFirst') {\n const fillIndex = value.indexOf(FILL);\n const strokeIndex = value.indexOf(STROKE);\n ouputValue = FILL;\n if (fillIndex > -1 && strokeIndex > -1 && strokeIndex < fillIndex) {\n ouputValue = STROKE;\n } else if (fillIndex === -1 && strokeIndex > -1) {\n ouputValue = STROKE;\n }\n } else if (\n attr === 'href' ||\n attr === 'xlink:href' ||\n attr === 'font' ||\n attr === 'id'\n ) {\n return value;\n } else if (attr === 'imageSmoothing') {\n return value === 'optimizeQuality';\n } else {\n parsed = isArray\n ? (value as string[]).map(parseUnit)\n : parseUnit(value, fontSize);\n }\n\n return !isArray && isNaN(parsed! as number) ? ouputValue : parsed!;\n}\n","import { parseUnit } from '../util/misc/svgParsing';\nimport { reFontDeclaration } from './constants';\n\n/**\n * Parses a short font declaration, building adding its properties to a style object\n * @param {String} value font declaration\n * @param {Object} oStyle definition\n */\nexport function parseFontDeclaration(\n value: string,\n oStyle: Record,\n): void {\n const match = value.match(reFontDeclaration);\n\n if (!match) {\n return;\n }\n const fontStyle = match[1],\n // font variant is not used\n // fontVariant = match[2],\n fontWeight = match[3],\n fontSize = match[4],\n lineHeight = match[5],\n fontFamily = match[6];\n\n if (fontStyle) {\n oStyle.fontStyle = fontStyle;\n }\n if (fontWeight) {\n oStyle.fontWeight = isNaN(parseFloat(fontWeight))\n ? fontWeight\n : parseFloat(fontWeight);\n }\n if (fontSize) {\n oStyle.fontSize = parseUnit(fontSize);\n }\n if (fontFamily) {\n oStyle.fontFamily = fontFamily;\n }\n if (lineHeight) {\n oStyle.lineHeight = lineHeight === 'normal' ? 1 : lineHeight;\n }\n}\n","/**\n * Takes a style object and parses it in one that has only defined values\n * and lowercases properties\n * @param style\n * @param oStyle\n */\nexport function parseStyleObject(\n style: Record,\n oStyle: Record,\n): void {\n Object.entries(style).forEach(([prop, value]) => {\n if (value === undefined) {\n return;\n }\n oStyle[prop.toLowerCase()] = value;\n });\n}\n","/**\n * Takes a style string and parses it in one that has only defined values\n * and lowercases properties\n * @param style\n * @param oStyle\n */\nexport function parseStyleString(\n style: string,\n oStyle: Record,\n): void {\n style\n .replace(/;\\s*$/, '')\n .split(';')\n .forEach((chunk) => {\n if (!chunk) return;\n const [attr, value] = chunk.split(':');\n oStyle[attr.trim().toLowerCase()] = value.trim();\n });\n}\n","import { parseStyleObject } from './parseStyleObject';\nimport { parseStyleString } from './parseStyleString';\n\n/**\n * Parses \"style\" attribute, retuning an object with values\n * @param {SVGElement} element Element to parse\n * @return {Object} Objects with values parsed from style attribute of an element\n */\nexport function parseStyleAttribute(\n element: HTMLElement | SVGElement,\n): Record {\n const oStyle: Record = {},\n style = element.getAttribute('style');\n\n if (!style) {\n return oStyle;\n }\n\n if (typeof style === 'string') {\n parseStyleString(style, oStyle);\n } else {\n parseStyleObject(style, oStyle);\n }\n\n return oStyle;\n}\n","import { Color } from '../color/Color';\nimport { toFixed } from '../util/misc/toFixed';\nimport { FabricObject } from '../shapes/Object/FabricObject';\n\nconst colorAttributesMap = {\n stroke: 'strokeOpacity',\n fill: 'fillOpacity',\n};\n\n/**\n * @private\n * @param {Object} attributes Array of attributes to parse\n */\n\nexport function setStrokeFillOpacity(\n attributes: Record,\n): Record {\n const defaults = FabricObject.getDefaults();\n Object.entries(colorAttributesMap).forEach(([attr, colorAttr]) => {\n if (\n typeof attributes[colorAttr] === 'undefined' ||\n attributes[attr] === ''\n ) {\n return;\n }\n if (typeof attributes[attr] === 'undefined') {\n if (!defaults[attr]) {\n return;\n }\n attributes[attr] = defaults[attr];\n }\n if (attributes[attr].indexOf('url(') === 0) {\n return;\n }\n const color = new Color(attributes[attr]);\n attributes[attr] = color\n .setAlpha(toFixed(color.getAlpha() * attributes[colorAttr], 2))\n .toRgba();\n });\n return attributes;\n}\n","import { DEFAULT_SVG_FONT_SIZE } from '../constants';\nimport { parseUnit } from '../util/misc/svgParsing';\nimport { cPath, fSize, svgValidParentsRegEx } from './constants';\nimport { getGlobalStylesForElement } from './getGlobalStylesForElement';\nimport { normalizeAttr } from './normalizeAttr';\nimport { normalizeValue } from './normalizeValue';\nimport { parseFontDeclaration } from './parseFontDeclaration';\nimport { parseStyleAttribute } from './parseStyleAttribute';\nimport { setStrokeFillOpacity } from './setStrokeFillOpacity';\nimport type { CSSRules } from './typedefs';\n\n/**\n * Returns an object of attributes' name/value, given element and an array of attribute names;\n * Parses parent \"g\" nodes recursively upwards.\n * @param {SVGElement | HTMLElement} element Element to parse\n * @param {Array} attributes Array of attributes to parse\n * @return {Object} object containing parsed attributes' names/values\n */\nexport function parseAttributes(\n element: HTMLElement | SVGElement | null,\n attributes: string[],\n cssRules?: CSSRules,\n): Record {\n if (!element) {\n return {};\n }\n\n let parentAttributes: Record = {},\n fontSize: number,\n parentFontSize = DEFAULT_SVG_FONT_SIZE;\n\n // if there's a parent container (`g` or `a` or `symbol` node), parse its attributes recursively upwards\n if (\n element.parentNode &&\n svgValidParentsRegEx.test(element.parentNode.nodeName)\n ) {\n parentAttributes = parseAttributes(\n element.parentElement,\n attributes,\n cssRules,\n );\n if (parentAttributes.fontSize) {\n fontSize = parentFontSize = parseUnit(parentAttributes.fontSize);\n }\n }\n\n const ownAttributes: Record = {\n ...attributes.reduce>((memo, attr) => {\n const value = element.getAttribute(attr);\n if (value) {\n memo[attr] = value;\n }\n return memo;\n }, {}),\n // add values parsed from style, which take precedence over attributes\n // (see: http://www.w3.org/TR/SVG/styling.html#UsingPresentationAttributes)\n ...getGlobalStylesForElement(element, cssRules),\n ...parseStyleAttribute(element),\n };\n\n if (ownAttributes[cPath]) {\n element.setAttribute(cPath, ownAttributes[cPath]);\n }\n if (ownAttributes[fSize]) {\n // looks like the minimum should be 9px when dealing with ems. this is what looks like in browsers.\n fontSize = parseUnit(ownAttributes[fSize], parentFontSize);\n ownAttributes[fSize] = `${fontSize}`;\n }\n\n // this should have its own complex type\n const normalizedStyle: Record<\n string,\n string | boolean | number | number[] | null\n > = {};\n for (const attr in ownAttributes) {\n const normalizedAttr = normalizeAttr(attr);\n const normalizedValue = normalizeValue(\n normalizedAttr,\n ownAttributes[attr],\n parentAttributes,\n fontSize!,\n );\n normalizedStyle[normalizedAttr] = normalizedValue;\n }\n if (normalizedStyle && normalizedStyle.font) {\n parseFontDeclaration(normalizedStyle.font as string, normalizedStyle);\n }\n const mergedAttrs = { ...parentAttributes, ...normalizedStyle };\n return svgValidParentsRegEx.test(element.nodeName)\n ? mergedAttrs\n : setStrokeFillOpacity(mergedAttrs);\n}\n","import { kRect } from '../constants';\nimport { SHARED_ATTRIBUTES } from '../parser/attributes';\nimport { parseAttributes } from '../parser/parseAttributes';\nimport type { Abortable, TClassProperties, TOptions } from '../typedefs';\nimport { classRegistry } from '../ClassRegistry';\nimport { FabricObject, cacheProperties } from './Object/FabricObject';\nimport type { FabricObjectProps, SerializedObjectProps } from './Object/types';\nimport type { ObjectEvents } from '../EventTypeDefs';\nimport type { CSSRules } from '../parser/typedefs';\n\nexport const rectDefaultValues: Partial> = {\n rx: 0,\n ry: 0,\n};\n\ninterface UniqueRectProps {\n rx: number;\n ry: number;\n}\n\nexport interface SerializedRectProps\n extends SerializedObjectProps,\n UniqueRectProps {}\n\nexport interface RectProps extends FabricObjectProps, UniqueRectProps {}\n\nconst RECT_PROPS = ['rx', 'ry'] as const;\n\nexport class Rect<\n Props extends TOptions = Partial,\n SProps extends SerializedRectProps = SerializedRectProps,\n EventSpec extends ObjectEvents = ObjectEvents,\n >\n extends FabricObject\n implements RectProps\n{\n /**\n * Horizontal border radius\n * @type Number\n */\n declare rx: number;\n\n /**\n * Vertical border radius\n * @type Number\n */\n declare ry: number;\n\n static type = 'Rect';\n\n static cacheProperties = [...cacheProperties, ...RECT_PROPS];\n\n static ownDefaults = rectDefaultValues;\n\n static getDefaults(): Record {\n return {\n ...super.getDefaults(),\n ...Rect.ownDefaults,\n };\n }\n\n /**\n * Constructor\n * @param {Object} [options] Options object\n */\n constructor(options?: Props) {\n super();\n Object.assign(this, Rect.ownDefaults);\n this.setOptions(options);\n this._initRxRy();\n }\n /**\n * Initializes rx/ry attributes\n * @private\n */\n _initRxRy() {\n const { rx, ry } = this;\n if (rx && !ry) {\n this.ry = rx;\n } else if (ry && !rx) {\n this.rx = ry;\n }\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _render(ctx: CanvasRenderingContext2D) {\n const { width: w, height: h } = this;\n const x = -w / 2;\n const y = -h / 2;\n const rx = this.rx ? Math.min(this.rx, w / 2) : 0;\n const ry = this.ry ? Math.min(this.ry, h / 2) : 0;\n const isRounded = rx !== 0 || ry !== 0;\n\n ctx.beginPath();\n\n ctx.moveTo(x + rx, y);\n\n ctx.lineTo(x + w - rx, y);\n isRounded &&\n ctx.bezierCurveTo(\n x + w - kRect * rx,\n y,\n x + w,\n y + kRect * ry,\n x + w,\n y + ry,\n );\n\n ctx.lineTo(x + w, y + h - ry);\n isRounded &&\n ctx.bezierCurveTo(\n x + w,\n y + h - kRect * ry,\n x + w - kRect * rx,\n y + h,\n x + w - rx,\n y + h,\n );\n\n ctx.lineTo(x + rx, y + h);\n isRounded &&\n ctx.bezierCurveTo(\n x + kRect * rx,\n y + h,\n x,\n y + h - kRect * ry,\n x,\n y + h - ry,\n );\n\n ctx.lineTo(x, y + ry);\n isRounded &&\n ctx.bezierCurveTo(x, y + kRect * ry, x + kRect * rx, y, x + rx, y);\n\n ctx.closePath();\n\n this._renderPaintInOrder(ctx);\n }\n\n /**\n * Returns object representation of an instance\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} object representation of an instance\n */\n toObject<\n T extends Omit, keyof SProps>,\n K extends keyof T = never,\n >(propertiesToInclude: K[] = []): Pick & SProps {\n return super.toObject([...RECT_PROPS, ...propertiesToInclude]);\n }\n\n /**\n * Returns svg representation of an instance\n * @return {Array} an array of strings with the specific svg representation\n * of the instance\n */\n _toSVG() {\n const { width, height, rx, ry } = this;\n return [\n '\\n`,\n ];\n }\n\n /**\n * List of attribute names to account for when parsing SVG element (used by `Rect.fromElement`)\n * @see: http://www.w3.org/TR/SVG/shapes.html#RectElement\n */\n static ATTRIBUTE_NAMES = [\n ...SHARED_ATTRIBUTES,\n 'x',\n 'y',\n 'rx',\n 'ry',\n 'width',\n 'height',\n ];\n\n /* _FROM_SVG_START_ */\n\n /**\n * Returns {@link Rect} instance from an SVG element\n * @param {HTMLElement} element Element to parse\n * @param {Object} [options] Options object\n */\n static async fromElement(\n element: HTMLElement | SVGElement,\n options?: Abortable,\n cssRules?: CSSRules,\n ) {\n const {\n left = 0,\n top = 0,\n width = 0,\n height = 0,\n visible = true,\n ...restOfparsedAttributes\n } = parseAttributes(element, this.ATTRIBUTE_NAMES, cssRules);\n\n return new this({\n ...options,\n ...restOfparsedAttributes,\n left,\n top,\n width,\n height,\n visible: Boolean(visible && width && height),\n });\n }\n\n /* _FROM_SVG_END_ */\n}\n\nclassRegistry.setClass(Rect);\nclassRegistry.setSVGClass(Rect);\n","export const LAYOUT_TYPE_INITIALIZATION = 'initialization';\nexport const LAYOUT_TYPE_ADDED = 'added';\nexport const LAYOUT_TYPE_REMOVED = 'removed';\nexport const LAYOUT_TYPE_IMPERATIVE = 'imperative';\nexport const LAYOUT_TYPE_OBJECT_MODIFIED = 'object_modified';\nexport const LAYOUT_TYPE_OBJECT_MODIFYING = 'object_modifying';\n","import { Point, ZERO } from '../../Point';\nimport type { Group } from '../../shapes/Group';\nimport type { FabricObject } from '../../shapes/Object/FabricObject';\nimport { multiplyTransformMatrixArray } from '../../util/misc/matrix';\nimport { sizeAfterTransform } from '../../util/misc/objectTransforms';\nimport {\n calcPlaneChangeMatrix,\n sendVectorToPlane,\n} from '../../util/misc/planeChange';\n\n/**\n * @returns 2 points, the tl and br corners of the non rotated bounding box of an object\n * in the {@link group} plane, taking into account objects that {@link group} is their parent\n * but also belong to the active selection.\n */\nexport const getObjectBounds = (\n destinationGroup: Group,\n object: FabricObject,\n): Point[] => {\n const {\n strokeUniform,\n strokeWidth,\n width,\n height,\n group: currentGroup,\n } = object;\n const t =\n currentGroup && currentGroup !== destinationGroup\n ? calcPlaneChangeMatrix(\n currentGroup.calcTransformMatrix(),\n destinationGroup.calcTransformMatrix(),\n )\n : null;\n const objectCenter = t\n ? object.getRelativeCenterPoint().transform(t)\n : object.getRelativeCenterPoint();\n const accountForStroke = !object['isStrokeAccountedForInDimensions']();\n const strokeUniformVector =\n strokeUniform && accountForStroke\n ? sendVectorToPlane(\n new Point(strokeWidth, strokeWidth),\n undefined,\n destinationGroup.calcTransformMatrix(),\n )\n : ZERO;\n const scalingStrokeWidth =\n !strokeUniform && accountForStroke ? strokeWidth : 0;\n const sizeVector = sizeAfterTransform(\n width + scalingStrokeWidth,\n height + scalingStrokeWidth,\n multiplyTransformMatrixArray([t, object.calcOwnMatrix()], true),\n )\n .add(strokeUniformVector)\n .scalarDivide(2);\n return [objectCenter.subtract(sizeVector), objectCenter.add(sizeVector)];\n};\n","import { Point } from '../../Point';\nimport type { FabricObject } from '../../shapes/Object/FabricObject';\nimport { makeBoundingBoxFromPoints } from '../../util/misc/boundingBoxFromPoints';\nimport {\n LAYOUT_TYPE_INITIALIZATION,\n LAYOUT_TYPE_IMPERATIVE,\n} from '../constants';\nimport type {\n InitializationLayoutContext,\n LayoutStrategyResult,\n StrictLayoutContext,\n} from '../types';\nimport { getObjectBounds } from './utils';\n\n/**\n * Exposes a main public method {@link calcLayoutResult} that is used by the `LayoutManager` to perform layout.\n * Returning `undefined` signals the `LayoutManager` to skip the layout.\n *\n * In charge of calculating the bounding box of the passed objects.\n */\nexport abstract class LayoutStrategy {\n /**\n * override by subclass for persistence (TS does not support `static abstract`)\n */\n static type = 'strategy';\n\n /**\n * Used by the `LayoutManager` to perform layout\n * @TODO/fix: if this method is calcResult, should calc unconditionally.\n * the condition to not calc should be evaluated by the layoutManager.\n * @returns layout result **OR** `undefined` to skip layout\n */\n public calcLayoutResult(\n context: StrictLayoutContext,\n objects: FabricObject[],\n ): LayoutStrategyResult | undefined {\n if (this.shouldPerformLayout(context)) {\n return this.calcBoundingBox(objects, context);\n }\n }\n\n shouldPerformLayout({ type, prevStrategy, strategy }: StrictLayoutContext) {\n return (\n type === LAYOUT_TYPE_INITIALIZATION ||\n type === LAYOUT_TYPE_IMPERATIVE ||\n (!!prevStrategy && strategy !== prevStrategy)\n );\n }\n\n shouldLayoutClipPath({ type, target: { clipPath } }: StrictLayoutContext) {\n return (\n type !== LAYOUT_TYPE_INITIALIZATION &&\n clipPath &&\n !clipPath.absolutePositioned\n );\n }\n\n getInitialSize(\n context: StrictLayoutContext & InitializationLayoutContext,\n result: Pick,\n ) {\n return result.size;\n }\n\n /**\n * Override this method to customize layout.\n */\n calcBoundingBox(\n objects: FabricObject[],\n context: StrictLayoutContext,\n ): LayoutStrategyResult | undefined {\n const { type, target } = context;\n if (type === LAYOUT_TYPE_IMPERATIVE && context.overrides) {\n return context.overrides;\n }\n if (objects.length === 0) {\n return;\n }\n const { left, top, width, height } = makeBoundingBoxFromPoints(\n objects\n .map((object) => getObjectBounds(target, object))\n .reduce((coords, curr) => coords.concat(curr), []),\n );\n const bboxSize = new Point(width, height);\n const bboxLeftTop = new Point(left, top);\n const bboxCenter = bboxLeftTop.add(bboxSize.scalarDivide(2));\n\n if (type === LAYOUT_TYPE_INITIALIZATION) {\n const actualSize = this.getInitialSize(context, {\n size: bboxSize,\n center: bboxCenter,\n });\n return {\n // in `initialization` we do not account for target's transformation matrix\n center: bboxCenter,\n // TODO: investigate if this is still necessary\n relativeCorrection: new Point(0, 0),\n size: actualSize,\n };\n } else {\n // we send `relativeCenter` up to group's containing plane\n const center = bboxCenter.transform(target.calcOwnMatrix());\n return {\n center,\n size: bboxSize,\n };\n }\n }\n}\n","import type { StrictLayoutContext } from '../types';\nimport { LayoutStrategy } from './LayoutStrategy';\nimport { classRegistry } from '../../ClassRegistry';\n\n/**\n * Layout will adjust the bounding box to fit target's objects.\n */\nexport class FitContentLayout extends LayoutStrategy {\n static readonly type = 'fit-content';\n\n /**\n * @override layout on all triggers\n * Override at will\n */\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n shouldPerformLayout(context: StrictLayoutContext) {\n return true;\n }\n}\n\nclassRegistry.setClass(FitContentLayout);\n","import { Point } from '../Point';\nimport {\n CENTER,\n CHANGED,\n MODIFIED,\n MODIFY_PATH,\n MODIFY_POLY,\n MOVING,\n RESIZING,\n ROTATING,\n SCALING,\n SKEWING,\n iMatrix,\n} from '../constants';\nimport type { Group } from '../shapes/Group';\nimport type { FabricObject } from '../shapes/Object/FabricObject';\nimport { invertTransform } from '../util/misc/matrix';\nimport { resolveOrigin } from '../util/misc/resolveOrigin';\nimport { FitContentLayout } from './LayoutStrategies/FitContentLayout';\nimport type { LayoutStrategy } from './LayoutStrategies/LayoutStrategy';\nimport {\n LAYOUT_TYPE_INITIALIZATION,\n LAYOUT_TYPE_ADDED,\n LAYOUT_TYPE_REMOVED,\n LAYOUT_TYPE_IMPERATIVE,\n LAYOUT_TYPE_OBJECT_MODIFIED,\n LAYOUT_TYPE_OBJECT_MODIFYING,\n} from './constants';\nimport type {\n LayoutContext,\n LayoutResult,\n RegistrationContext,\n StrictLayoutContext,\n} from './types';\nimport { classRegistry } from '../ClassRegistry';\nimport type { TModificationEvents } from '../EventTypeDefs';\n\nconst LAYOUT_MANAGER = 'layoutManager';\n\nexport type SerializedLayoutManager = {\n type: string;\n strategy: string;\n};\n\nexport class LayoutManager {\n declare private _prevLayoutStrategy?: LayoutStrategy;\n declare protected _subscriptions: Map;\n\n strategy: LayoutStrategy;\n\n constructor(strategy: LayoutStrategy = new FitContentLayout()) {\n this.strategy = strategy;\n this._subscriptions = new Map();\n }\n\n public performLayout(context: LayoutContext) {\n const strictContext: StrictLayoutContext = {\n bubbles: true,\n strategy: this.strategy,\n ...context,\n prevStrategy: this._prevLayoutStrategy,\n stopPropagation() {\n this.bubbles = false;\n },\n };\n\n this.onBeforeLayout(strictContext);\n\n const layoutResult = this.getLayoutResult(strictContext);\n if (layoutResult) {\n this.commitLayout(strictContext, layoutResult);\n }\n\n this.onAfterLayout(strictContext, layoutResult);\n this._prevLayoutStrategy = strictContext.strategy;\n }\n\n /**\n * Attach handlers for events that we know will invalidate the layout when\n * performed on child objects ( general transforms ).\n * Returns the disposers for later unsubscribing and cleanup\n * @param {FabricObject} object\n * @param {RegistrationContext & Partial} context\n * @returns {VoidFunction[]} disposers remove the handlers\n */\n protected attachHandlers(\n object: FabricObject,\n context: RegistrationContext & Partial,\n ): VoidFunction[] {\n const { target } = context;\n return (\n [\n MODIFIED,\n MOVING,\n RESIZING,\n ROTATING,\n SCALING,\n SKEWING,\n CHANGED,\n MODIFY_POLY,\n MODIFY_PATH,\n ] as (TModificationEvents & 'modified')[]\n ).map((key) =>\n object.on(key, (e) =>\n this.performLayout(\n key === MODIFIED\n ? {\n type: LAYOUT_TYPE_OBJECT_MODIFIED,\n trigger: key,\n e,\n target,\n }\n : {\n type: LAYOUT_TYPE_OBJECT_MODIFYING,\n trigger: key,\n e,\n target,\n },\n ),\n ),\n );\n }\n\n /**\n * Subscribe an object to transform events that will trigger a layout change on the parent\n * This is important only for interactive groups.\n * @param object\n * @param context\n */\n protected subscribe(\n object: FabricObject,\n context: RegistrationContext & Partial,\n ) {\n this.unsubscribe(object, context);\n const disposers = this.attachHandlers(object, context);\n this._subscriptions.set(object, disposers);\n }\n\n /**\n * unsubscribe object layout triggers\n */\n protected unsubscribe(\n object: FabricObject,\n _context?: RegistrationContext & Partial,\n ) {\n (this._subscriptions.get(object) || []).forEach((d) => d());\n this._subscriptions.delete(object);\n }\n\n unsubscribeTargets(\n context: RegistrationContext & Partial,\n ) {\n context.targets.forEach((object) => this.unsubscribe(object, context));\n }\n\n subscribeTargets(\n context: RegistrationContext & Partial,\n ) {\n context.targets.forEach((object) => this.subscribe(object, context));\n }\n\n protected onBeforeLayout(context: StrictLayoutContext) {\n const { target, type } = context;\n const { canvas } = target;\n // handle layout triggers subscription\n // @TODO: gate the registration when the group is interactive\n if (type === LAYOUT_TYPE_INITIALIZATION || type === LAYOUT_TYPE_ADDED) {\n this.subscribeTargets(context);\n } else if (type === LAYOUT_TYPE_REMOVED) {\n this.unsubscribeTargets(context);\n }\n // fire layout event (event will fire only for layouts after initialization layout)\n target.fire('layout:before', {\n context,\n });\n canvas &&\n canvas.fire('object:layout:before', {\n target,\n context,\n });\n\n if (type === LAYOUT_TYPE_IMPERATIVE && context.deep) {\n const { strategy: _, ...tricklingContext } = context;\n // traverse the tree\n target.forEachObject(\n (object) =>\n (object as Group).layoutManager &&\n (object as Group).layoutManager.performLayout({\n ...tricklingContext,\n bubbles: false,\n target: object as Group,\n }),\n );\n }\n }\n\n protected getLayoutResult(\n context: StrictLayoutContext,\n ): Required | undefined {\n const { target, strategy, type } = context;\n\n const result = strategy.calcLayoutResult(context, target.getObjects());\n\n if (!result) {\n return;\n }\n\n const prevCenter =\n type === LAYOUT_TYPE_INITIALIZATION\n ? new Point()\n : target.getRelativeCenterPoint();\n\n const {\n center: nextCenter,\n correction = new Point(),\n relativeCorrection = new Point(),\n } = result;\n const offset = prevCenter\n .subtract(nextCenter)\n .add(correction)\n .transform(\n // in `initialization` we do not account for target's transformation matrix\n type === LAYOUT_TYPE_INITIALIZATION\n ? iMatrix\n : invertTransform(target.calcOwnMatrix()),\n true,\n )\n .add(relativeCorrection);\n\n return {\n result,\n prevCenter,\n nextCenter,\n offset,\n };\n }\n\n protected commitLayout(\n context: StrictLayoutContext,\n layoutResult: Required,\n ) {\n const { target } = context;\n const {\n result: { size },\n nextCenter,\n } = layoutResult;\n // set dimensions\n target.set({ width: size.x, height: size.y });\n // layout descendants\n this.layoutObjects(context, layoutResult);\n // set position\n // in `initialization` we do not account for target's transformation matrix\n if (context.type === LAYOUT_TYPE_INITIALIZATION) {\n // TODO: what about strokeWidth?\n target.set({\n left:\n context.x ?? nextCenter.x + size.x * resolveOrigin(target.originX),\n top: context.y ?? nextCenter.y + size.y * resolveOrigin(target.originY),\n });\n } else {\n target.setPositionByOrigin(nextCenter, CENTER, CENTER);\n // invalidate\n target.setCoords();\n target.set('dirty', true);\n }\n }\n\n protected layoutObjects(\n context: StrictLayoutContext,\n layoutResult: Required,\n ) {\n const { target } = context;\n // adjust objects to account for new center\n target.forEachObject((object) => {\n object.group === target &&\n this.layoutObject(context, layoutResult, object);\n });\n // adjust clip path to account for new center\n context.strategy.shouldLayoutClipPath(context) &&\n this.layoutObject(context, layoutResult, target.clipPath as FabricObject);\n }\n\n /**\n * @param {FabricObject} object\n * @param {Point} offset\n */\n protected layoutObject(\n context: StrictLayoutContext,\n { offset }: Required,\n object: FabricObject,\n ) {\n // TODO: this is here for cache invalidation.\n // verify if this is necessary since we have explicit\n // cache invalidation at the end of commitLayout\n object.set({\n left: object.left + offset.x,\n top: object.top + offset.y,\n });\n }\n\n protected onAfterLayout(\n context: StrictLayoutContext,\n layoutResult?: LayoutResult,\n ) {\n const {\n target,\n strategy,\n bubbles,\n prevStrategy: _,\n ...bubblingContext\n } = context;\n const { canvas } = target;\n\n // fire layout event (event will fire only for layouts after initialization layout)\n target.fire('layout:after', {\n context,\n result: layoutResult,\n });\n canvas &&\n canvas.fire('object:layout:after', {\n context,\n result: layoutResult,\n target,\n });\n\n // bubble\n const parent = target.parent;\n if (bubbles && parent?.layoutManager) {\n // add target to context#path\n (bubblingContext.path || (bubblingContext.path = [])).push(target);\n // all parents should invalidate their layout\n parent.layoutManager.performLayout({\n ...bubblingContext,\n target: parent,\n });\n }\n target.set('dirty', true);\n }\n\n dispose() {\n const { _subscriptions } = this;\n _subscriptions.forEach((disposers) => disposers.forEach((d) => d()));\n _subscriptions.clear();\n }\n\n toObject() {\n return {\n type: LAYOUT_MANAGER,\n strategy: (this.strategy.constructor as typeof LayoutStrategy).type,\n };\n }\n\n toJSON() {\n return this.toObject();\n }\n}\n\nclassRegistry.setClass(LayoutManager, LAYOUT_MANAGER);\n","import type { CollectionEvents, ObjectEvents } from '../EventTypeDefs';\nimport { createCollectionMixin } from '../Collection';\nimport type {\n TClassProperties,\n TSVGReviver,\n TOptions,\n Abortable,\n} from '../typedefs';\nimport {\n invertTransform,\n multiplyTransformMatrices,\n} from '../util/misc/matrix';\nimport {\n enlivenObjectEnlivables,\n enlivenObjects,\n} from '../util/misc/objectEnlive';\nimport { applyTransformToObject } from '../util/misc/objectTransforms';\nimport { FabricObject } from './Object/FabricObject';\nimport { Rect } from './Rect';\nimport { classRegistry } from '../ClassRegistry';\nimport type { FabricObjectProps, SerializedObjectProps } from './Object/types';\nimport { log } from '../util/internals/console';\nimport type {\n ImperativeLayoutOptions,\n LayoutBeforeEvent,\n LayoutAfterEvent,\n} from '../LayoutManager/types';\nimport { LayoutManager } from '../LayoutManager/LayoutManager';\nimport {\n LAYOUT_TYPE_ADDED,\n LAYOUT_TYPE_IMPERATIVE,\n LAYOUT_TYPE_INITIALIZATION,\n LAYOUT_TYPE_REMOVED,\n} from '../LayoutManager/constants';\nimport type { SerializedLayoutManager } from '../LayoutManager/LayoutManager';\nimport type { FitContentLayout } from '../LayoutManager';\nimport type { DrawContext } from './Object/Object';\n\n/**\n * This class handles the specific case of creating a group using {@link Group#fromObject} and is not meant to be used in any other case.\n * We could have used a boolean in the constructor, as we did previously, but we think the boolean\n * would stay in the group's constructor interface and create confusion, therefore it was removed.\n * This layout manager doesn't do anything and therefore keeps the exact layout the group had when {@link Group#toObject} was called.\n */\nclass NoopLayoutManager extends LayoutManager {\n performLayout() {}\n}\n\nexport interface GroupEvents extends ObjectEvents, CollectionEvents {\n 'layout:before': LayoutBeforeEvent;\n 'layout:after': LayoutAfterEvent;\n}\n\nexport interface GroupOwnProps {\n subTargetCheck: boolean;\n interactive: boolean;\n}\n\nexport interface SerializedGroupProps\n extends SerializedObjectProps,\n GroupOwnProps {\n objects: SerializedObjectProps[];\n layoutManager: SerializedLayoutManager;\n}\n\nexport interface GroupProps extends FabricObjectProps, GroupOwnProps {\n layoutManager: LayoutManager;\n}\n\nexport const groupDefaultValues: Partial> = {\n strokeWidth: 0,\n subTargetCheck: false,\n interactive: false,\n};\n\n/**\n * @fires object:added\n * @fires object:removed\n * @fires layout:before\n * @fires layout:after\n */\nexport class Group\n extends createCollectionMixin(\n FabricObject,\n )\n implements GroupProps\n{\n /**\n * Used to optimize performance\n * set to `false` if you don't need contained objects to be targets of events\n * @type boolean\n */\n declare subTargetCheck: boolean;\n\n /**\n * Used to allow targeting of object inside groups.\n * set to true if you want to select an object inside a group.\\\n * **REQUIRES** `subTargetCheck` set to true\n * This will be not removed but slowly replaced with a method setInteractive\n * that will take care of enabling subTargetCheck and necessary object events.\n * There is too much attached to group interactivity to just be evaluated by a\n * boolean in the code\n * @deprecated\n * @type boolean\n */\n declare interactive: boolean;\n\n declare layoutManager: LayoutManager;\n\n /**\n * Used internally to optimize performance\n * Once an object is selected, instance is rendered without the selected object.\n * This way instance is cached only once for the entire interaction with the selected object.\n * @private\n */\n protected _activeObjects: FabricObject[] = [];\n\n static type = 'Group';\n\n static ownDefaults: Record = groupDefaultValues;\n private __objectSelectionTracker: (ev: ObjectEvents['selected']) => void;\n private __objectSelectionDisposer: (ev: ObjectEvents['deselected']) => void;\n\n static getDefaults(): Record {\n return {\n ...super.getDefaults(),\n ...Group.ownDefaults,\n };\n }\n\n /**\n * Constructor\n *\n * @param {FabricObject[]} [objects] instance objects\n * @param {Object} [options] Options object\n */\n constructor(objects: FabricObject[] = [], options: Partial = {}) {\n super();\n Object.assign(this, Group.ownDefaults);\n this.setOptions(options);\n this.groupInit(objects, options);\n }\n\n /**\n * Shared code between group and active selection\n * Meant to be used by the constructor.\n */\n protected groupInit(\n objects: FabricObject[],\n options: {\n layoutManager?: LayoutManager;\n top?: number;\n left?: number;\n },\n ) {\n this._objects = [...objects]; // Avoid unwanted mutations of Collection to affect the caller\n\n this.__objectSelectionTracker = this.__objectSelectionMonitor.bind(\n this,\n true,\n );\n this.__objectSelectionDisposer = this.__objectSelectionMonitor.bind(\n this,\n false,\n );\n\n this.forEachObject((object) => {\n this.enterGroup(object, false);\n });\n\n // perform initial layout\n this.layoutManager = options.layoutManager ?? new LayoutManager();\n this.layoutManager.performLayout({\n type: LAYOUT_TYPE_INITIALIZATION,\n target: this,\n targets: [...objects],\n // @TODO remove this concept from the layout manager.\n // Layout manager will calculate the correct position,\n // group options can override it later.\n x: options.left,\n y: options.top,\n });\n }\n\n /**\n * Checks if object can enter group and logs relevant warnings\n * @private\n * @param {FabricObject} object\n * @returns\n */\n canEnterGroup(object: FabricObject) {\n if (object === this || this.isDescendantOf(object)) {\n // prevent circular object tree\n log(\n 'error',\n 'Group: circular object trees are not supported, this call has no effect',\n );\n return false;\n } else if (this._objects.indexOf(object) !== -1) {\n // is already in the objects array\n log(\n 'error',\n 'Group: duplicate objects are not supported inside group, this call has no effect',\n );\n return false;\n }\n return true;\n }\n\n /**\n * Override this method to enhance performance (for groups with a lot of objects).\n * If Overriding, be sure not pass illegal objects to group - it will break your app.\n * @private\n */\n protected _filterObjectsBeforeEnteringGroup(objects: FabricObject[]) {\n return objects.filter((object, index, array) => {\n // can enter AND is the first occurrence of the object in the passed args (to prevent adding duplicates)\n return this.canEnterGroup(object) && array.indexOf(object) === index;\n });\n }\n\n /**\n * Add objects\n * @param {...FabricObject[]} objects\n */\n add(...objects: FabricObject[]) {\n const allowedObjects = this._filterObjectsBeforeEnteringGroup(objects);\n const size = super.add(...allowedObjects);\n this._onAfterObjectsChange(LAYOUT_TYPE_ADDED, allowedObjects);\n return size;\n }\n\n /**\n * Inserts an object into collection at specified index\n * @param {FabricObject[]} objects Object to insert\n * @param {Number} index Index to insert object at\n */\n insertAt(index: number, ...objects: FabricObject[]) {\n const allowedObjects = this._filterObjectsBeforeEnteringGroup(objects);\n const size = super.insertAt(index, ...allowedObjects);\n this._onAfterObjectsChange(LAYOUT_TYPE_ADDED, allowedObjects);\n return size;\n }\n\n /**\n * Remove objects\n * @param {...FabricObject[]} objects\n * @returns {FabricObject[]} removed objects\n */\n remove(...objects: FabricObject[]) {\n const removed = super.remove(...objects);\n this._onAfterObjectsChange(LAYOUT_TYPE_REMOVED, removed);\n return removed;\n }\n\n _onObjectAdded(object: FabricObject) {\n this.enterGroup(object, true);\n this.fire('object:added', { target: object });\n object.fire('added', { target: this });\n }\n\n /**\n * @private\n * @param {FabricObject} object\n * @param {boolean} [removeParentTransform] true if object should exit group without applying group's transform to it\n */\n _onObjectRemoved(object: FabricObject, removeParentTransform?: boolean) {\n this.exitGroup(object, removeParentTransform);\n this.fire('object:removed', { target: object });\n object.fire('removed', { target: this });\n }\n\n /**\n * @private\n * @param {'added'|'removed'} type\n * @param {FabricObject[]} targets\n */\n _onAfterObjectsChange(type: 'added' | 'removed', targets: FabricObject[]) {\n this.layoutManager.performLayout({\n type,\n targets,\n target: this,\n });\n }\n\n _onStackOrderChanged() {\n this._set('dirty', true);\n }\n\n /**\n * @private\n * @param {string} key\n * @param {*} value\n */\n _set(key: string, value: any) {\n const prev = this[key as keyof this];\n super._set(key, value);\n if (key === 'canvas' && prev !== value) {\n (this._objects || []).forEach((object) => {\n object._set(key, value);\n });\n }\n return this;\n }\n\n /**\n * @private\n */\n _shouldSetNestedCoords() {\n return this.subTargetCheck;\n }\n\n /**\n * Remove all objects\n * @returns {FabricObject[]} removed objects\n */\n removeAll() {\n this._activeObjects = [];\n return this.remove(...this._objects);\n }\n\n /**\n * keeps track of the selected objects\n * @private\n */\n __objectSelectionMonitor(\n selected: T,\n {\n target: object,\n }: ObjectEvents[T extends true ? 'selected' : 'deselected'],\n ) {\n const activeObjects = this._activeObjects;\n if (selected) {\n activeObjects.push(object);\n this._set('dirty', true);\n } else if (activeObjects.length > 0) {\n const index = activeObjects.indexOf(object);\n if (index > -1) {\n activeObjects.splice(index, 1);\n this._set('dirty', true);\n }\n }\n }\n\n /**\n * @private\n * @param {boolean} watch\n * @param {FabricObject} object\n */\n _watchObject(watch: boolean, object: FabricObject) {\n // make sure we listen only once\n watch && this._watchObject(false, object);\n if (watch) {\n object.on('selected', this.__objectSelectionTracker);\n object.on('deselected', this.__objectSelectionDisposer);\n } else {\n object.off('selected', this.__objectSelectionTracker);\n object.off('deselected', this.__objectSelectionDisposer);\n }\n }\n\n /**\n * @private\n * @param {FabricObject} object\n * @param {boolean} [removeParentTransform] true if object is in canvas coordinate plane\n */\n enterGroup(object: FabricObject, removeParentTransform?: boolean) {\n object.group && object.group.remove(object);\n object._set('parent', this);\n this._enterGroup(object, removeParentTransform);\n }\n\n /**\n * @private\n * @param {FabricObject} object\n * @param {boolean} [removeParentTransform] true if object is in canvas coordinate plane\n */\n _enterGroup(object: FabricObject, removeParentTransform?: boolean) {\n if (removeParentTransform) {\n // can this be converted to utils (sendObjectToPlane)?\n applyTransformToObject(\n object,\n multiplyTransformMatrices(\n invertTransform(this.calcTransformMatrix()),\n object.calcTransformMatrix(),\n ),\n );\n }\n this._shouldSetNestedCoords() && object.setCoords();\n object._set('group', this);\n object._set('canvas', this.canvas);\n this._watchObject(true, object);\n const activeObject =\n this.canvas &&\n this.canvas.getActiveObject &&\n this.canvas.getActiveObject();\n // if we are adding the activeObject in a group\n if (\n activeObject &&\n (activeObject === object || object.isDescendantOf(activeObject))\n ) {\n this._activeObjects.push(object);\n }\n }\n\n /**\n * @private\n * @param {FabricObject} object\n * @param {boolean} [removeParentTransform] true if object should exit group without applying group's transform to it\n */\n exitGroup(object: FabricObject, removeParentTransform?: boolean) {\n this._exitGroup(object, removeParentTransform);\n object._set('parent', undefined);\n object._set('canvas', undefined);\n }\n\n /**\n * Executes the inner fabric logic of exiting a group.\n * - Stop watching the object\n * - Remove the object from the optimization map this._activeObjects\n * - unset the group property of the object\n * @protected\n * @param {FabricObject} object\n * @param {boolean} [removeParentTransform] true if object should exit group without applying group's transform to it\n */\n _exitGroup(object: FabricObject, removeParentTransform?: boolean) {\n object._set('group', undefined);\n if (!removeParentTransform) {\n applyTransformToObject(\n object,\n multiplyTransformMatrices(\n this.calcTransformMatrix(),\n object.calcTransformMatrix(),\n ),\n );\n object.setCoords();\n }\n this._watchObject(false, object);\n const index =\n this._activeObjects.length > 0 ? this._activeObjects.indexOf(object) : -1;\n if (index > -1) {\n this._activeObjects.splice(index, 1);\n }\n }\n\n /**\n * Decide if the group should cache or not. Create its own cache level\n * needsItsOwnCache should be used when the object drawing method requires\n * a cache step.\n * Generally you do not cache objects in groups because the group is already cached.\n * @return {Boolean}\n */\n shouldCache() {\n const ownCache = FabricObject.prototype.shouldCache.call(this);\n if (ownCache) {\n for (let i = 0; i < this._objects.length; i++) {\n if (this._objects[i].willDrawShadow()) {\n this.ownCaching = false;\n return false;\n }\n }\n }\n return ownCache;\n }\n\n /**\n * Check if this object or a child object will cast a shadow\n * @return {Boolean}\n */\n willDrawShadow() {\n if (super.willDrawShadow()) {\n return true;\n }\n for (let i = 0; i < this._objects.length; i++) {\n if (this._objects[i].willDrawShadow()) {\n return true;\n }\n }\n return false;\n }\n\n /**\n * Check if instance or its group are caching, recursively up\n * @return {Boolean}\n */\n isOnACache(): boolean {\n return this.ownCaching || (!!this.parent && this.parent.isOnACache());\n }\n\n /**\n * Execute the drawing operation for an object on a specified context\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n drawObject(\n ctx: CanvasRenderingContext2D,\n forClipping: boolean | undefined,\n context: DrawContext,\n ) {\n this._renderBackground(ctx);\n for (let i = 0; i < this._objects.length; i++) {\n const obj = this._objects[i];\n // TODO: handle rendering edge case somehow\n if (this.canvas?.preserveObjectStacking && obj.group !== this) {\n ctx.save();\n ctx.transform(...invertTransform(this.calcTransformMatrix()));\n obj.render(ctx);\n ctx.restore();\n } else if (obj.group === this) {\n obj.render(ctx);\n }\n }\n this._drawClipPath(ctx, this.clipPath, context);\n }\n\n /**\n * @override\n * @return {Boolean}\n */\n setCoords() {\n super.setCoords();\n this._shouldSetNestedCoords() &&\n this.forEachObject((object) => object.setCoords());\n }\n\n triggerLayout(options: ImperativeLayoutOptions = {}) {\n this.layoutManager.performLayout({\n target: this,\n type: LAYOUT_TYPE_IMPERATIVE,\n ...options,\n });\n }\n\n /**\n * Renders instance on a given context\n * @param {CanvasRenderingContext2D} ctx context to render instance on\n */\n render(ctx: CanvasRenderingContext2D) {\n this._transformDone = true;\n super.render(ctx);\n this._transformDone = false;\n }\n\n /**\n *\n * @private\n * @param {'toObject'|'toDatalessObject'} [method]\n * @param {string[]} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @returns {FabricObject[]} serialized objects\n */\n __serializeObjects(\n method: 'toObject' | 'toDatalessObject',\n propertiesToInclude?: string[],\n ) {\n const _includeDefaultValues = this.includeDefaultValues;\n return this._objects\n .filter(function (obj) {\n return !obj.excludeFromExport;\n })\n .map(function (obj) {\n const originalDefaults = obj.includeDefaultValues;\n obj.includeDefaultValues = _includeDefaultValues;\n const data = obj[method || 'toObject'](propertiesToInclude);\n obj.includeDefaultValues = originalDefaults;\n // delete data.version;\n return data;\n });\n }\n\n /**\n * Returns object representation of an instance\n * @param {string[]} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} object representation of an instance\n */\n toObject<\n T extends Omit<\n GroupProps & TClassProperties,\n keyof SerializedGroupProps\n >,\n K extends keyof T = never,\n >(propertiesToInclude: K[] = []): Pick & SerializedGroupProps {\n const layoutManager = this.layoutManager.toObject();\n\n return {\n ...super.toObject([\n 'subTargetCheck',\n 'interactive',\n ...propertiesToInclude,\n ]),\n ...(layoutManager.strategy !== 'fit-content' || this.includeDefaultValues\n ? { layoutManager }\n : {}),\n objects: this.__serializeObjects(\n 'toObject',\n propertiesToInclude as string[],\n ),\n };\n }\n\n toString() {\n return `#`;\n }\n\n dispose() {\n this.layoutManager.unsubscribeTargets({\n targets: this.getObjects(),\n target: this,\n });\n this._activeObjects = [];\n this.forEachObject((object) => {\n this._watchObject(false, object);\n object.dispose();\n });\n super.dispose();\n }\n\n /**\n * @private\n */\n _createSVGBgRect(reviver?: TSVGReviver) {\n if (!this.backgroundColor) {\n return '';\n }\n const fillStroke = Rect.prototype._toSVG.call(this);\n const commons = fillStroke.indexOf('COMMON_PARTS');\n fillStroke[commons] = 'for=\"group\" ';\n const markup = fillStroke.join('');\n return reviver ? reviver(markup) : markup;\n }\n\n /**\n * Returns svg representation of an instance\n * @param {TSVGReviver} [reviver] Method for further parsing of svg representation.\n * @return {String} svg representation of an instance\n */\n _toSVG(reviver?: TSVGReviver) {\n const svgString = ['\\n'];\n const bg = this._createSVGBgRect(reviver);\n bg && svgString.push('\\t\\t', bg);\n for (let i = 0; i < this._objects.length; i++) {\n svgString.push('\\t\\t', this._objects[i].toSVG(reviver));\n }\n svgString.push('\\n');\n return svgString;\n }\n\n /**\n * Returns styles-string for svg-export, specific version for group\n * @return {String}\n */\n getSvgStyles(): string {\n const opacity =\n typeof this.opacity !== 'undefined' && this.opacity !== 1\n ? `opacity: ${this.opacity};`\n : '',\n visibility = this.visible ? '' : ' visibility: hidden;';\n return [opacity, this.getSvgFilter(), visibility].join('');\n }\n\n /**\n * Returns svg clipPath representation of an instance\n * @param {Function} [reviver] Method for further parsing of svg representation.\n * @return {String} svg representation of an instance\n */\n toClipPathSVG(reviver?: TSVGReviver): string {\n const svgString = [];\n const bg = this._createSVGBgRect(reviver);\n bg && svgString.push('\\t', bg);\n for (let i = 0; i < this._objects.length; i++) {\n svgString.push('\\t', this._objects[i].toClipPathSVG(reviver));\n }\n return this._createBaseClipPathSVGMarkup(svgString, {\n reviver,\n });\n }\n\n /**\n * @todo support loading from svg\n * @private\n * @param {Object} object Object to create a group from\n * @returns {Promise}\n */\n static fromObject>(\n { type, objects = [], layoutManager, ...options }: T,\n abortable?: Abortable,\n ) {\n return Promise.all([\n enlivenObjects(objects, abortable),\n enlivenObjectEnlivables(options, abortable),\n ]).then(([objects, hydratedOptions]) => {\n const group = new this(objects, {\n ...options,\n ...hydratedOptions,\n layoutManager: new NoopLayoutManager(),\n });\n if (layoutManager) {\n const layoutClass = classRegistry.getClass(\n layoutManager.type,\n );\n const strategyClass = classRegistry.getClass(\n layoutManager.strategy,\n );\n group.layoutManager = new layoutClass(new strategyClass());\n } else {\n group.layoutManager = new LayoutManager();\n }\n group.layoutManager.subscribeTargets({\n type: LAYOUT_TYPE_INITIALIZATION,\n target: group,\n targets: group.getObjects(),\n });\n group.setCoords();\n return group;\n });\n }\n}\n\nclassRegistry.setClass(Group);\n","import type { GroupProps } from '../../shapes/Group';\nimport { Group } from '../../shapes/Group';\nimport type { FabricObject } from '../../shapes/Object/FabricObject';\n\n/**\n * TODO experiment with different layout manager and svg results ( fixed fit content )\n * Groups SVG elements (usually those retrieved from SVG document)\n * @param {FabricObject[]} elements FabricObject(s) parsed from svg, to group\n * @return {FabricObject | Group}\n */\nexport const groupSVGElements = (\n elements: FabricObject[],\n options?: Partial,\n) => {\n if (elements && elements.length === 1) {\n return elements[0];\n }\n return new Group(elements, options);\n};\n","import type { TSize } from '../../typedefs';\n\n/**\n * Finds the scale for the object source to fit inside the object destination,\n * keeping aspect ratio intact.\n * respect the total allowed area for the cache.\n * @param {TSize} source natural unscaled size of the object\n * @param {TSize} destination natural unscaled size of the object\n * @return {Number} scale factor to apply to source to fit into destination\n */\nexport const findScaleToFit = (source: TSize, destination: TSize) =>\n Math.min(\n destination.width / source.width,\n destination.height / source.height,\n );\n\n/**\n * Finds the scale for the object source to cover entirely the object destination,\n * keeping aspect ratio intact.\n * respect the total allowed area for the cache.\n * @param {TSize} source natural unscaled size of the object\n * @param {TSize} destination natural unscaled size of the object\n * @return {Number} scale factor to apply to source to cover destination\n */\nexport const findScaleToCover = (source: TSize, destination: TSize) =>\n Math.max(\n destination.width / source.width,\n destination.height / source.height,\n );\n","import { reNum } from '../../parser/constants';\n\nconst commaWsp = `\\\\s*,?\\\\s*`;\n\n/**\n * p for param\n * using \"bad naming\" here because it makes the regex much easier to read\n * p is a number that is preceded by an arbitary number of spaces, maybe 0,\n * a comma or not, and then possibly more spaces or not.\n */\nconst p = `${commaWsp}(${reNum})`;\n\n// const reMoveToCommand = `(M) ?(?:${p}${p} ?)+`;\n\n// const reLineCommand = `(L) ?(?:${p}${p} ?)+`;\n\n// const reHorizontalLineCommand = `(H) ?(?:${p} ?)+`;\n\n// const reVerticalLineCommand = `(V) ?(?:${p} ?)+`;\n\n// const reClosePathCommand = String.raw`(Z)\\s*`;\n\n// const reCubicCurveCommand = `(C) ?(?:${p}${p}${p}${p}${p}${p} ?)+`;\n\n// const reCubicCurveShortcutCommand = `(S) ?(?:${p}${p}${p}${p} ?)+`;\n\n// const reQuadraticCurveCommand = `(Q) ?(?:${p}${p}${p}${p} ?)+`;\n\n// const reQuadraticCurveShortcutCommand = `(T) ?(?:${p}${p} ?)+`;\n\nexport const reArcCommandPoints = `${p}${p}${p}${commaWsp}([01])${commaWsp}([01])${p}${p}`;\n// const reArcCommand = `(A) ?(?:${reArcCommandPoints} ?)+`;\n\n// export const rePathCommandGroups =\n// `(?:(?:${reMoveToCommand})` +\n// `|(?:${reLineCommand})` +\n// `|(?:${reHorizontalLineCommand})` +\n// `|(?:${reVerticalLineCommand})` +\n// `|(?:${reClosePathCommand})` +\n// `|(?:${reCubicCurveCommand})` +\n// `|(?:${reCubicCurveShortcutCommand})` +\n// `|(?:${reQuadraticCurveCommand})` +\n// `|(?:${reQuadraticCurveShortcutCommand})` +\n// `|(?:${reArcCommand}))`;\n\nexport const rePathCommand = '[mzlhvcsqta][^mzlhvcsqta]*';\n","import { cache } from '../../cache';\nimport { config } from '../../config';\nimport { halfPI, PiBy180 } from '../../constants';\nimport type { TMat2D, TRadian, TRectBounds } from '../../typedefs';\nimport { cos } from '../misc/cos';\nimport { multiplyTransformMatrices, transformPoint } from '../misc/matrix';\nimport { sin } from '../misc/sin';\nimport { toFixed } from '../misc/toFixed';\nimport type {\n TCurveInfo,\n TComplexPathData,\n TParsedAbsoluteCubicCurveCommand,\n TPathSegmentInfo,\n TPointAngle,\n TSimpleParsedCommand,\n TSimplePathData,\n TPathSegmentCommandInfo,\n TComplexParsedCommand,\n TPathSegmentInfoCommon,\n TEndPathInfo,\n TParsedArcCommand,\n TComplexParsedCommandType,\n} from './typedefs';\nimport type { XY } from '../../Point';\nimport { Point } from '../../Point';\nimport { reArcCommandPoints, rePathCommand } from './regex';\nimport { reNum } from '../../parser/constants';\n\n/**\n * Commands that may be repeated\n */\nconst repeatedCommands: Record = {\n m: 'l',\n M: 'L',\n};\n\n/**\n * Convert an arc of a rotated ellipse to a Bezier Curve\n * @param {TRadian} theta1 start of the arc\n * @param {TRadian} theta2 end of the arc\n * @param cosTh cosine of the angle of rotation\n * @param sinTh sine of the angle of rotation\n * @param rx x-axis radius (before rotation)\n * @param ry y-axis radius (before rotation)\n * @param cx1 center x of the ellipse\n * @param cy1 center y of the ellipse\n * @param mT\n * @param fromX starting point of arc x\n * @param fromY starting point of arc y\n */\nconst segmentToBezier = (\n theta1: TRadian,\n theta2: TRadian,\n cosTh: number,\n sinTh: number,\n rx: number,\n ry: number,\n cx1: number,\n cy1: number,\n mT: number,\n fromX: number,\n fromY: number,\n): TParsedAbsoluteCubicCurveCommand => {\n const costh1 = cos(theta1),\n sinth1 = sin(theta1),\n costh2 = cos(theta2),\n sinth2 = sin(theta2),\n toX = cosTh * rx * costh2 - sinTh * ry * sinth2 + cx1,\n toY = sinTh * rx * costh2 + cosTh * ry * sinth2 + cy1,\n cp1X = fromX + mT * (-cosTh * rx * sinth1 - sinTh * ry * costh1),\n cp1Y = fromY + mT * (-sinTh * rx * sinth1 + cosTh * ry * costh1),\n cp2X = toX + mT * (cosTh * rx * sinth2 + sinTh * ry * costh2),\n cp2Y = toY + mT * (sinTh * rx * sinth2 - cosTh * ry * costh2);\n\n return ['C', cp1X, cp1Y, cp2X, cp2Y, toX, toY];\n};\n\n/**\n * Adapted from {@link http://dxr.mozilla.org/mozilla-central/source/dom/svg/SVGPathDataParser.cpp}\n * by Andrea Bogazzi code is under MPL. if you don't have a copy of the license you can take it here\n * http://mozilla.org/MPL/2.0/\n * @param toX\n * @param toY\n * @param rx\n * @param ry\n * @param {number} large 0 or 1 flag\n * @param {number} sweep 0 or 1 flag\n * @param rotateX\n */\nconst arcToSegments = (\n toX: number,\n toY: number,\n rx: number,\n ry: number,\n large: number,\n sweep: number,\n rotateX: TRadian,\n): TParsedAbsoluteCubicCurveCommand[] => {\n if (rx === 0 || ry === 0) {\n return [];\n }\n let fromX = 0,\n fromY = 0,\n root = 0;\n const PI = Math.PI,\n theta = rotateX * PiBy180,\n sinTheta = sin(theta),\n cosTh = cos(theta),\n px = 0.5 * (-cosTh * toX - sinTheta * toY),\n py = 0.5 * (-cosTh * toY + sinTheta * toX),\n rx2 = rx ** 2,\n ry2 = ry ** 2,\n py2 = py ** 2,\n px2 = px ** 2,\n pl = rx2 * ry2 - rx2 * py2 - ry2 * px2;\n let _rx = Math.abs(rx);\n let _ry = Math.abs(ry);\n\n if (pl < 0) {\n const s = Math.sqrt(1 - pl / (rx2 * ry2));\n _rx *= s;\n _ry *= s;\n } else {\n root =\n (large === sweep ? -1.0 : 1.0) * Math.sqrt(pl / (rx2 * py2 + ry2 * px2));\n }\n\n const cx = (root * _rx * py) / _ry,\n cy = (-root * _ry * px) / _rx,\n cx1 = cosTh * cx - sinTheta * cy + toX * 0.5,\n cy1 = sinTheta * cx + cosTh * cy + toY * 0.5;\n let mTheta = calcVectorAngle(1, 0, (px - cx) / _rx, (py - cy) / _ry);\n let dtheta = calcVectorAngle(\n (px - cx) / _rx,\n (py - cy) / _ry,\n (-px - cx) / _rx,\n (-py - cy) / _ry,\n );\n\n if (sweep === 0 && dtheta > 0) {\n dtheta -= 2 * PI;\n } else if (sweep === 1 && dtheta < 0) {\n dtheta += 2 * PI;\n }\n\n // Convert into cubic bezier segments <= 90deg\n const segments = Math.ceil(Math.abs((dtheta / PI) * 2)),\n result = [],\n mDelta = dtheta / segments,\n mT =\n ((8 / 3) * Math.sin(mDelta / 4) * Math.sin(mDelta / 4)) /\n Math.sin(mDelta / 2);\n let th3 = mTheta + mDelta;\n\n for (let i = 0; i < segments; i++) {\n result[i] = segmentToBezier(\n mTheta,\n th3,\n cosTh,\n sinTheta,\n _rx,\n _ry,\n cx1,\n cy1,\n mT,\n fromX,\n fromY,\n );\n fromX = result[i][5];\n fromY = result[i][6];\n mTheta = th3;\n th3 += mDelta;\n }\n return result;\n};\n\n/**\n * @private\n * Calculate the angle between two vectors\n * @param ux u endpoint x\n * @param uy u endpoint y\n * @param vx v endpoint x\n * @param vy v endpoint y\n */\nconst calcVectorAngle = (\n ux: number,\n uy: number,\n vx: number,\n vy: number,\n): TRadian => {\n const ta = Math.atan2(uy, ux),\n tb = Math.atan2(vy, vx);\n if (tb >= ta) {\n return tb - ta;\n } else {\n return 2 * Math.PI - (ta - tb);\n }\n};\n\n// functions for the Cubic beizer\n// taken from: https://github.com/konvajs/konva/blob/7.0.5/src/shapes/Path.ts#L350\nconst CB1 = (t: number) => t ** 3;\nconst CB2 = (t: number) => 3 * t ** 2 * (1 - t);\nconst CB3 = (t: number) => 3 * t * (1 - t) ** 2;\nconst CB4 = (t: number) => (1 - t) ** 3;\n\n/**\n * Calculate bounding box of a cubic Bezier curve\n * Taken from http://jsbin.com/ivomiq/56/edit (no credits available)\n * TODO: can we normalize this with the starting points set at 0 and then translated the bbox?\n * @param {number} begx starting point\n * @param {number} begy\n * @param {number} cp1x first control point\n * @param {number} cp1y\n * @param {number} cp2x second control point\n * @param {number} cp2y\n * @param {number} endx end of bezier\n * @param {number} endy\n * @return {TRectBounds} the rectangular bounds\n */\nexport function getBoundsOfCurve(\n begx: number,\n begy: number,\n cp1x: number,\n cp1y: number,\n cp2x: number,\n cp2y: number,\n endx: number,\n endy: number,\n): TRectBounds {\n let argsString: string;\n if (config.cachesBoundsOfCurve) {\n // eslint-disable-next-line\n argsString = [...arguments].join();\n if (cache.boundsOfCurveCache[argsString]) {\n return cache.boundsOfCurveCache[argsString];\n }\n }\n\n const sqrt = Math.sqrt,\n abs = Math.abs,\n tvalues = [],\n bounds: [[x: number, y: number], [x: number, y: number]] = [\n [0, 0],\n [0, 0],\n ];\n\n let b = 6 * begx - 12 * cp1x + 6 * cp2x;\n let a = -3 * begx + 9 * cp1x - 9 * cp2x + 3 * endx;\n let c = 3 * cp1x - 3 * begx;\n\n for (let i = 0; i < 2; ++i) {\n if (i > 0) {\n b = 6 * begy - 12 * cp1y + 6 * cp2y;\n a = -3 * begy + 9 * cp1y - 9 * cp2y + 3 * endy;\n c = 3 * cp1y - 3 * begy;\n }\n\n if (abs(a) < 1e-12) {\n if (abs(b) < 1e-12) {\n continue;\n }\n const t = -c / b;\n if (0 < t && t < 1) {\n tvalues.push(t);\n }\n continue;\n }\n const b2ac = b * b - 4 * c * a;\n if (b2ac < 0) {\n continue;\n }\n const sqrtb2ac = sqrt(b2ac);\n const t1 = (-b + sqrtb2ac) / (2 * a);\n if (0 < t1 && t1 < 1) {\n tvalues.push(t1);\n }\n const t2 = (-b - sqrtb2ac) / (2 * a);\n if (0 < t2 && t2 < 1) {\n tvalues.push(t2);\n }\n }\n\n let j = tvalues.length;\n const jlen = j;\n const iterator = getPointOnCubicBezierIterator(\n begx,\n begy,\n cp1x,\n cp1y,\n cp2x,\n cp2y,\n endx,\n endy,\n );\n while (j--) {\n const { x, y } = iterator(tvalues[j]);\n bounds[0][j] = x;\n bounds[1][j] = y;\n }\n\n bounds[0][jlen] = begx;\n bounds[1][jlen] = begy;\n bounds[0][jlen + 1] = endx;\n bounds[1][jlen + 1] = endy;\n const result: TRectBounds = [\n new Point(Math.min(...bounds[0]), Math.min(...bounds[1])),\n new Point(Math.max(...bounds[0]), Math.max(...bounds[1])),\n ];\n if (config.cachesBoundsOfCurve) {\n cache.boundsOfCurveCache[argsString!] = result;\n }\n return result;\n}\n\n/**\n * Converts arc to a bunch of cubic Bezier curves\n * @param {number} fx starting point x\n * @param {number} fy starting point y\n * @param {TParsedArcCommand} coords Arc command\n */\nexport const fromArcToBeziers = (\n fx: number,\n fy: number,\n [_, rx, ry, rot, large, sweep, tx, ty]: TParsedArcCommand,\n): TParsedAbsoluteCubicCurveCommand[] => {\n const segsNorm = arcToSegments(tx - fx, ty - fy, rx, ry, large, sweep, rot);\n\n for (let i = 0, len = segsNorm.length; i < len; i++) {\n segsNorm[i][1] += fx;\n segsNorm[i][2] += fy;\n segsNorm[i][3] += fx;\n segsNorm[i][4] += fy;\n segsNorm[i][5] += fx;\n segsNorm[i][6] += fy;\n }\n return segsNorm;\n};\n\n/**\n * This function takes a parsed SVG path and makes it simpler for fabricJS logic.\n * Simplification consist of:\n * - All commands converted to absolute (lowercase to uppercase)\n * - S converted to C\n * - T converted to Q\n * - A converted to C\n * @param {TComplexPathData} path the array of commands of a parsed SVG path for `Path`\n * @return {TSimplePathData} the simplified array of commands of a parsed SVG path for `Path`\n * TODO: figure out how to remove the type assertions in a nice way\n */\nexport const makePathSimpler = (path: TComplexPathData): TSimplePathData => {\n // x and y represent the last point of the path, AKA the previous command point.\n // we add them to each relative command to make it an absolute comment.\n // we also swap the v V h H with L, because are easier to transform.\n let x = 0,\n y = 0;\n // x1 and y1 represent the last point of the subpath. the subpath is started with\n // m or M command. When a z or Z command is drawn, x and y need to be resetted to\n // the last x1 and y1.\n let x1 = 0,\n y1 = 0;\n // previous will host the letter of the previous command, to handle S and T.\n // controlX and controlY will host the previous reflected control point\n const destinationPath: TSimplePathData = [];\n let previous,\n // placeholders\n controlX = 0,\n controlY = 0;\n for (const parsedCommand of path) {\n const current: TComplexParsedCommand = [...parsedCommand];\n let converted: TSimpleParsedCommand | undefined;\n switch (\n current[0] // first letter\n ) {\n case 'l': // lineto, relative\n current[1] += x;\n current[2] += y;\n // falls through\n case 'L':\n x = current[1];\n y = current[2];\n converted = ['L', x, y];\n break;\n case 'h': // horizontal lineto, relative\n current[1] += x;\n // falls through\n case 'H':\n x = current[1];\n converted = ['L', x, y];\n break;\n case 'v': // vertical lineto, relative\n current[1] += y;\n // falls through\n case 'V':\n y = current[1];\n converted = ['L', x, y];\n break;\n case 'm': // moveTo, relative\n current[1] += x;\n current[2] += y;\n // falls through\n case 'M':\n x = current[1];\n y = current[2];\n x1 = current[1];\n y1 = current[2];\n converted = ['M', x, y];\n break;\n case 'c': // bezierCurveTo, relative\n current[1] += x;\n current[2] += y;\n current[3] += x;\n current[4] += y;\n current[5] += x;\n current[6] += y;\n // falls through\n case 'C':\n controlX = current[3];\n controlY = current[4];\n x = current[5];\n y = current[6];\n converted = ['C', current[1], current[2], controlX, controlY, x, y];\n break;\n case 's': // shorthand cubic bezierCurveTo, relative\n current[1] += x;\n current[2] += y;\n current[3] += x;\n current[4] += y;\n // falls through\n case 'S':\n // would be sScC but since we are swapping sSc for C, we check just that.\n if (previous === 'C') {\n // calculate reflection of previous control points\n controlX = 2 * x - controlX;\n controlY = 2 * y - controlY;\n } else {\n // If there is no previous command or if the previous command was not a C, c, S, or s,\n // the control point is coincident with the current point\n controlX = x;\n controlY = y;\n }\n x = current[3];\n y = current[4];\n converted = ['C', controlX, controlY, current[1], current[2], x, y];\n // converted[3] and converted[4] are NOW the second control point.\n // we keep it for the next reflection.\n controlX = converted[3];\n controlY = converted[4];\n break;\n case 'q': // quadraticCurveTo, relative\n current[1] += x;\n current[2] += y;\n current[3] += x;\n current[4] += y;\n // falls through\n case 'Q':\n controlX = current[1];\n controlY = current[2];\n x = current[3];\n y = current[4];\n converted = ['Q', controlX, controlY, x, y];\n break;\n case 't': // shorthand quadraticCurveTo, relative\n current[1] += x;\n current[2] += y;\n // falls through\n case 'T':\n if (previous === 'Q') {\n // calculate reflection of previous control point\n controlX = 2 * x - controlX;\n controlY = 2 * y - controlY;\n } else {\n // If there is no previous command or if the previous command was not a Q, q, T or t,\n // assume the control point is coincident with the current point\n controlX = x;\n controlY = y;\n }\n x = current[1];\n y = current[2];\n converted = ['Q', controlX, controlY, x, y];\n break;\n case 'a':\n current[6] += x;\n current[7] += y;\n // falls through\n case 'A':\n fromArcToBeziers(x, y, current).forEach((b) => destinationPath.push(b));\n x = current[6];\n y = current[7];\n break;\n case 'z':\n case 'Z':\n x = x1;\n y = y1;\n converted = ['Z'];\n break;\n default:\n }\n if (converted) {\n destinationPath.push(converted);\n previous = converted[0];\n } else {\n previous = '';\n }\n }\n return destinationPath;\n};\n\n// todo verify if we can just use the point class here\n/**\n * Calc length from point x1,y1 to x2,y2\n * @param {number} x1 starting point x\n * @param {number} y1 starting point y\n * @param {number} x2 starting point x\n * @param {number} y2 starting point y\n * @return {number} length of segment\n */\nconst calcLineLength = (\n x1: number,\n y1: number,\n x2: number,\n y2: number,\n): number => Math.sqrt((x2 - x1) ** 2 + (y2 - y1) ** 2);\n\n/**\n * Get an iterator that takes a percentage and returns a point\n * @param {number} begx\n * @param {number} begy\n * @param {number} cp1x\n * @param {number} cp1y\n * @param {number} cp2x\n * @param {number} cp2y\n * @param {number} endx\n * @param {number} endy\n */\nconst getPointOnCubicBezierIterator =\n (\n begx: number,\n begy: number,\n cp1x: number,\n cp1y: number,\n cp2x: number,\n cp2y: number,\n endx: number,\n endy: number,\n ) =>\n (pct: number) => {\n const c1 = CB1(pct),\n c2 = CB2(pct),\n c3 = CB3(pct),\n c4 = CB4(pct);\n return new Point(\n endx * c1 + cp2x * c2 + cp1x * c3 + begx * c4,\n endy * c1 + cp2y * c2 + cp1y * c3 + begy * c4,\n );\n };\n\nconst QB1 = (t: number) => t ** 2;\nconst QB2 = (t: number) => 2 * t * (1 - t);\nconst QB3 = (t: number) => (1 - t) ** 2;\n\nconst getTangentCubicIterator =\n (\n p1x: number,\n p1y: number,\n p2x: number,\n p2y: number,\n p3x: number,\n p3y: number,\n p4x: number,\n p4y: number,\n ) =>\n (pct: number) => {\n const qb1 = QB1(pct),\n qb2 = QB2(pct),\n qb3 = QB3(pct),\n tangentX =\n 3 * (qb3 * (p2x - p1x) + qb2 * (p3x - p2x) + qb1 * (p4x - p3x)),\n tangentY =\n 3 * (qb3 * (p2y - p1y) + qb2 * (p3y - p2y) + qb1 * (p4y - p3y));\n return Math.atan2(tangentY, tangentX);\n };\n\nconst getPointOnQuadraticBezierIterator =\n (\n p1x: number,\n p1y: number,\n p2x: number,\n p2y: number,\n p3x: number,\n p3y: number,\n ) =>\n (pct: number) => {\n const c1 = QB1(pct),\n c2 = QB2(pct),\n c3 = QB3(pct);\n return new Point(\n p3x * c1 + p2x * c2 + p1x * c3,\n p3y * c1 + p2y * c2 + p1y * c3,\n );\n };\n\nconst getTangentQuadraticIterator =\n (\n p1x: number,\n p1y: number,\n p2x: number,\n p2y: number,\n p3x: number,\n p3y: number,\n ) =>\n (pct: number) => {\n const invT = 1 - pct,\n tangentX = 2 * (invT * (p2x - p1x) + pct * (p3x - p2x)),\n tangentY = 2 * (invT * (p2y - p1y) + pct * (p3y - p2y));\n return Math.atan2(tangentY, tangentX);\n };\n\n// this will run over a path segment (a cubic or quadratic segment) and approximate it\n// with 100 segments. This will good enough to calculate the length of the curve\nconst pathIterator = (\n iterator: (pct: number) => Point,\n x1: number,\n y1: number,\n) => {\n let tempP = new Point(x1, y1),\n tmpLen = 0;\n for (let perc = 1; perc <= 100; perc += 1) {\n const p = iterator(perc / 100);\n tmpLen += calcLineLength(tempP.x, tempP.y, p.x, p.y);\n tempP = p;\n }\n return tmpLen;\n};\n\n/**\n * Given a pathInfo, and a distance in pixels, find the percentage from 0 to 1\n * that correspond to that pixels run over the path.\n * The percentage will be then used to find the correct point on the canvas for the path.\n * @param {Array} segInfo fabricJS collection of information on a parsed path\n * @param {number} distance from starting point, in pixels.\n * @return {TPointAngle} info object with x and y ( the point on canvas ) and angle, the tangent on that point;\n */\nconst findPercentageForDistance = (\n segInfo: TCurveInfo<'Q' | 'C'>,\n distance: number,\n): TPointAngle => {\n let perc = 0,\n tmpLen = 0,\n tempP: XY = { x: segInfo.x, y: segInfo.y },\n p: XY = { ...tempP },\n nextLen: number,\n nextStep = 0.01,\n lastPerc = 0;\n // nextStep > 0.0001 covers 0.00015625 that 1/64th of 1/100\n // the path\n const iterator = segInfo.iterator,\n angleFinder = segInfo.angleFinder;\n while (tmpLen < distance && nextStep > 0.0001) {\n p = iterator(perc);\n lastPerc = perc;\n nextLen = calcLineLength(tempP.x, tempP.y, p.x, p.y);\n // compare tmpLen each cycle with distance, decide next perc to test.\n if (nextLen + tmpLen > distance) {\n // we discard this step and we make smaller steps.\n perc -= nextStep;\n nextStep /= 2;\n } else {\n tempP = p;\n perc += nextStep;\n tmpLen += nextLen;\n }\n }\n return { ...p, angle: angleFinder(lastPerc) };\n};\n\n/**\n * Run over a parsed and simplified path and extract some information (length of each command and starting point)\n * @param {TSimplePathData} path parsed path commands\n * @return {TPathSegmentInfo[]} path commands information\n */\nexport const getPathSegmentsInfo = (\n path: TSimplePathData,\n): TPathSegmentInfo[] => {\n let totalLength = 0,\n //x2 and y2 are the coords of segment start\n //x1 and y1 are the coords of the current point\n x1 = 0,\n y1 = 0,\n x2 = 0,\n y2 = 0,\n iterator,\n tempInfo: TPathSegmentInfo;\n const info: TPathSegmentInfo[] = [];\n for (const current of path) {\n const basicInfo: TPathSegmentInfoCommon = {\n x: x1,\n y: y1,\n command: current[0],\n length: 0,\n };\n switch (\n current[0] //first letter\n ) {\n case 'M':\n tempInfo = >basicInfo;\n tempInfo.x = x2 = x1 = current[1];\n tempInfo.y = y2 = y1 = current[2];\n break;\n case 'L':\n tempInfo = >basicInfo;\n tempInfo.length = calcLineLength(x1, y1, current[1], current[2]);\n x1 = current[1];\n y1 = current[2];\n break;\n case 'C':\n iterator = getPointOnCubicBezierIterator(\n x1,\n y1,\n current[1],\n current[2],\n current[3],\n current[4],\n current[5],\n current[6],\n );\n tempInfo = >basicInfo;\n tempInfo.iterator = iterator;\n tempInfo.angleFinder = getTangentCubicIterator(\n x1,\n y1,\n current[1],\n current[2],\n current[3],\n current[4],\n current[5],\n current[6],\n );\n tempInfo.length = pathIterator(iterator, x1, y1);\n\n x1 = current[5];\n y1 = current[6];\n break;\n case 'Q':\n iterator = getPointOnQuadraticBezierIterator(\n x1,\n y1,\n current[1],\n current[2],\n current[3],\n current[4],\n );\n tempInfo = >basicInfo;\n tempInfo.iterator = iterator;\n tempInfo.angleFinder = getTangentQuadraticIterator(\n x1,\n y1,\n current[1],\n current[2],\n current[3],\n current[4],\n );\n tempInfo.length = pathIterator(iterator, x1, y1);\n x1 = current[3];\n y1 = current[4];\n break;\n case 'Z':\n // we add those in order to ease calculations later\n tempInfo = basicInfo;\n tempInfo.destX = x2;\n tempInfo.destY = y2;\n tempInfo.length = calcLineLength(x1, y1, x2, y2);\n x1 = x2;\n y1 = y2;\n break;\n }\n totalLength += tempInfo.length;\n info.push(tempInfo);\n }\n info.push({ length: totalLength, x: x1, y: y1 });\n return info;\n};\n\n/**\n * Get the point on the path that is distance along the path\n * @param path\n * @param distance\n * @param infos\n */\nexport const getPointOnPath = (\n path: TSimplePathData,\n distance: number,\n infos: TPathSegmentInfo[] = getPathSegmentsInfo(path),\n): TPointAngle | undefined => {\n let i = 0;\n while (distance - infos[i].length > 0 && i < infos.length - 2) {\n distance -= infos[i].length;\n i++;\n }\n const segInfo = infos[i],\n segPercent = distance / segInfo.length,\n segment = path[i];\n\n switch (segInfo.command) {\n case 'M':\n return { x: segInfo.x, y: segInfo.y, angle: 0 };\n case 'Z':\n return {\n ...new Point(segInfo.x, segInfo.y).lerp(\n new Point(segInfo.destX, segInfo.destY),\n segPercent,\n ),\n angle: Math.atan2(segInfo.destY - segInfo.y, segInfo.destX - segInfo.x),\n };\n case 'L':\n return {\n ...new Point(segInfo.x, segInfo.y).lerp(\n new Point(segment[1]!, segment[2]!),\n segPercent,\n ),\n angle: Math.atan2(segment[2]! - segInfo.y, segment[1]! - segInfo.x),\n };\n case 'C':\n return findPercentageForDistance(segInfo, distance);\n case 'Q':\n return findPercentageForDistance(segInfo, distance);\n default:\n // throw Error('Invalid command');\n }\n};\n\nconst rePathCmdAll = new RegExp(rePathCommand, 'gi');\nconst regExpArcCommandPoints = new RegExp(reArcCommandPoints, 'g');\nconst reMyNum = new RegExp(reNum, 'gi');\nconst commandLengths = {\n m: 2,\n l: 2,\n h: 1,\n v: 1,\n c: 6,\n s: 4,\n q: 4,\n t: 2,\n a: 7,\n} as const;\n/**\n *\n * @param {string} pathString\n * @return {TComplexPathData} An array of SVG path commands\n * @example Usage\n * parsePath('M 3 4 Q 3 5 2 1 4 0 Q 9 12 2 1 4 0') === [\n * ['M', 3, 4],\n * ['Q', 3, 5, 2, 1, 4, 0],\n * ['Q', 9, 12, 2, 1, 4, 0],\n * ];\n */\nexport const parsePath = (pathString: string): TComplexPathData => {\n const chain: TComplexPathData = [];\n const all = pathString.match(rePathCmdAll) ?? [];\n for (const matchStr of all) {\n // take match string and save the first letter as the command\n const commandLetter = matchStr[0] as TComplexParsedCommandType;\n // in case of Z we have very little to do\n if (commandLetter === 'z' || commandLetter === 'Z') {\n chain.push([commandLetter]);\n continue;\n }\n const commandLength =\n commandLengths[\n commandLetter.toLowerCase() as keyof typeof commandLengths\n ];\n\n let paramArr = [];\n if (commandLetter === 'a' || commandLetter === 'A') {\n // the arc command ha some peculariaties that requires a special regex other than numbers\n // it is possible to avoid using a space between the sweep and large arc flags, making them either\n // 00, 01, 10 or 11, making them identical to a plain number for the regex reMyNum\n // reset the regexp\n regExpArcCommandPoints.lastIndex = 0;\n for (let out = null; (out = regExpArcCommandPoints.exec(matchStr)); ) {\n paramArr.push(...out.slice(1));\n }\n } else {\n paramArr = matchStr.match(reMyNum) || [];\n }\n\n // inspect the length of paramArr, if is longer than commandLength\n // we are dealing with repeated commands\n for (let i = 0; i < paramArr.length; i += commandLength) {\n const newCommand = new Array(commandLength) as TComplexParsedCommand;\n const transformedCommand = repeatedCommands[commandLetter];\n newCommand[0] =\n i > 0 && transformedCommand ? transformedCommand : commandLetter;\n for (let j = 0; j < commandLength; j++) {\n newCommand[j + 1] = parseFloat(paramArr[i + j]);\n }\n chain.push(newCommand);\n }\n }\n return chain;\n};\n\n/**\n *\n * Converts points to a smooth SVG path\n * @param {XY[]} points Array of points\n * @param {number} [correction] Apply a correction to the path (usually we use `width / 1000`). If value is undefined 0 is used as the correction value.\n * @return {(string|number)[][]} An array of SVG path commands\n */\nexport const getSmoothPathFromPoints = (\n points: Point[],\n correction = 0,\n): TSimplePathData => {\n let p1 = new Point(points[0]),\n p2 = new Point(points[1]),\n multSignX = 1,\n multSignY = 0;\n const path: TSimplePathData = [],\n len = points.length,\n manyPoints = len > 2;\n\n if (manyPoints) {\n multSignX = points[2].x < p2.x ? -1 : points[2].x === p2.x ? 0 : 1;\n multSignY = points[2].y < p2.y ? -1 : points[2].y === p2.y ? 0 : 1;\n }\n path.push([\n 'M',\n p1.x - multSignX * correction,\n p1.y - multSignY * correction,\n ]);\n let i;\n for (i = 1; i < len; i++) {\n if (!p1.eq(p2)) {\n const midPoint = p1.midPointFrom(p2);\n // p1 is our bezier control point\n // midpoint is our endpoint\n // start point is p(i-1) value.\n path.push(['Q', p1.x, p1.y, midPoint.x, midPoint.y]);\n }\n p1 = points[i];\n if (i + 1 < points.length) {\n p2 = points[i + 1];\n }\n }\n if (manyPoints) {\n multSignX = p1.x > points[i - 2].x ? 1 : p1.x === points[i - 2].x ? 0 : -1;\n multSignY = p1.y > points[i - 2].y ? 1 : p1.y === points[i - 2].y ? 0 : -1;\n }\n path.push([\n 'L',\n p1.x + multSignX * correction,\n p1.y + multSignY * correction,\n ]);\n return path;\n};\n\n/**\n * Transform a path by transforming each segment.\n * it has to be a simplified path or it won't work.\n * WARNING: this depends from pathOffset for correct operation\n * @param {TSimplePathData} path fabricJS parsed and simplified path commands\n * @param {TMat2D} transform matrix that represent the transformation\n * @param {Point} [pathOffset] `Path.pathOffset`\n * @returns {TSimplePathData} the transformed path\n */\nexport const transformPath = (\n path: TSimplePathData,\n transform: TMat2D,\n pathOffset: Point,\n): TSimplePathData => {\n if (pathOffset) {\n transform = multiplyTransformMatrices(transform, [\n 1,\n 0,\n 0,\n 1,\n -pathOffset.x,\n -pathOffset.y,\n ]);\n }\n return path.map((pathSegment) => {\n const newSegment: TSimpleParsedCommand = [...pathSegment];\n for (let i = 1; i < pathSegment.length - 1; i += 2) {\n // TODO: is there a way to get around casting to any?\n const { x, y } = transformPoint(\n {\n x: pathSegment[i] as number,\n y: pathSegment[i + 1] as number,\n },\n transform,\n );\n newSegment[i] = x;\n newSegment[i + 1] = y;\n }\n return newSegment;\n });\n};\n\n/**\n * Returns an array of path commands to create a regular polygon\n * @param {number} numVertexes\n * @param {number} radius\n * @returns {TSimplePathData} An array of SVG path commands\n */\nexport const getRegularPolygonPath = (\n numVertexes: number,\n radius: number,\n): TSimplePathData => {\n const interiorAngle = (Math.PI * 2) / numVertexes;\n // rotationAdjustment rotates the path by 1/2 the interior angle so that the polygon always has a flat side on the bottom\n // This isn't strictly necessary, but it's how we tend to think of and expect polygons to be drawn\n let rotationAdjustment = -halfPI;\n if (numVertexes % 2 === 0) {\n rotationAdjustment += interiorAngle / 2;\n }\n const d = new Array(numVertexes + 1);\n for (let i = 0; i < numVertexes; i++) {\n const rad = i * interiorAngle + rotationAdjustment;\n const { x, y } = new Point(cos(rad), sin(rad)).scalarMultiply(radius);\n d[i] = [i === 0 ? 'M' : 'L', x, y];\n }\n d[numVertexes] = ['Z'];\n return d;\n};\n\n/**\n * Join path commands to go back to svg format\n * @param {TSimplePathData} pathData fabricJS parsed path commands\n * @param {number} fractionDigits number of fraction digits to \"leave\"\n * @return {String} joined path 'M 0 0 L 20 30'\n */\nexport const joinPath = (pathData: TSimplePathData, fractionDigits?: number) =>\n pathData\n .map((segment) => {\n return segment\n .map((arg, i) => {\n if (i === 0) return arg;\n return fractionDigits === undefined\n ? arg\n : toFixed(arg, fractionDigits);\n })\n .join(' ');\n })\n .join(' ');\n","import type { FabricObject } from '../../shapes/Object/FabricObject';\nimport { sendObjectToPlane } from './planeChange';\nimport { Group } from '../../shapes/Group';\n/**\n * Merges 2 clip paths into one visually equal clip path\n *\n * **IMPORTANT**:\\\n * Does **NOT** clone the arguments, clone them proir if necessary.\n *\n * Creates a wrapper (group) that contains one clip path and is clipped by the other so content is kept where both overlap.\n * Use this method if both the clip paths may have nested clip paths of their own, so assigning one to the other's clip path property is not possible.\n *\n * In order to handle the `inverted` property we follow logic described in the following cases:\\\n * **(1)** both clip paths are inverted - the clip paths pass the inverted prop to the wrapper and loose it themselves.\\\n * **(2)** one is inverted and the other isn't - the wrapper shouldn't become inverted and the inverted clip path must clip the non inverted one to produce an identical visual effect.\\\n * **(3)** both clip paths are not inverted - wrapper and clip paths remain unchanged.\n *\n * @param {fabric.Object} c1\n * @param {fabric.Object} c2\n * @returns {fabric.Object} merged clip path\n */\nexport const mergeClipPaths = (c1: FabricObject, c2: FabricObject) => {\n let a = c1,\n b = c2;\n if (a.inverted && !b.inverted) {\n // case (2)\n a = c2;\n b = c1;\n }\n // `b` becomes `a`'s clip path so we transform `b` to `a` coordinate plane\n sendObjectToPlane(b, b.group?.calcTransformMatrix(), a.calcTransformMatrix());\n // assign the `inverted` prop to the wrapping group\n const inverted = a.inverted && b.inverted;\n if (inverted) {\n // case (1)\n a.inverted = b.inverted = false;\n }\n return new Group([a], { clipPath: b, inverted });\n};\n","/**\n * Returns random number between 2 specified ones.\n * @param {Number} min lower limit\n * @param {Number} max upper limit\n * @return {Number} random value (between min and max)\n */\nexport const getRandomInt = (min: number, max: number): number =>\n Math.floor(Math.random() * (max - min + 1)) + min;\n","import { CENTER, SCALE_X, SCALE_Y } from '../constants';\nimport type { FabricImage } from '../shapes/Image';\nimport type { FabricObject } from '../shapes/Object/FabricObject';\nimport type { TMat2D } from '../typedefs';\nimport { qrDecompose } from './misc/matrix';\n\ntype FabricObjectWithTransformMatrix = FabricObject & {\n transformMatrix?: TMat2D;\n};\n\n/**\n * This function is an helper for svg import. it decompose the transformMatrix\n * and assign properties to object.\n * untransformed coordinates\n * @private\n */\nconst _assignTransformMatrixProps = (\n object: FabricObjectWithTransformMatrix,\n) => {\n if (object.transformMatrix) {\n const { scaleX, scaleY, angle, skewX } = qrDecompose(\n object.transformMatrix,\n );\n object.flipX = false;\n object.flipY = false;\n object.set(SCALE_X, scaleX);\n object.set(SCALE_Y, scaleY);\n object.angle = angle;\n object.skewX = skewX;\n object.skewY = 0;\n }\n};\n\n/**\n * This function is an helper for svg import. it removes the transform matrix\n * and set to object properties that fabricjs can handle\n * @private\n * @param {Object} preserveAspectRatioOptions\n */\nexport const removeTransformMatrixForSvgParsing = (\n object: FabricObjectWithTransformMatrix,\n preserveAspectRatioOptions?: any,\n) => {\n let center = object._findCenterFromElement();\n if (object.transformMatrix) {\n _assignTransformMatrixProps(object);\n center = center.transform(object.transformMatrix);\n }\n delete object.transformMatrix;\n if (preserveAspectRatioOptions) {\n object.scaleX *= preserveAspectRatioOptions.scaleX;\n object.scaleY *= preserveAspectRatioOptions.scaleY;\n (object as FabricImage).cropX = preserveAspectRatioOptions.cropX;\n (object as FabricImage).cropY = preserveAspectRatioOptions.cropY;\n center.x += preserveAspectRatioOptions.offsetLeft;\n center.y += preserveAspectRatioOptions.offsetTop;\n object.width = preserveAspectRatioOptions.width;\n object.height = preserveAspectRatioOptions.height;\n }\n object.setPositionByOrigin(center, CENTER, CENTER);\n};\n","// TODO this file needs to go away, cross browser style support is not fabricjs domain.\n\n/**\n * wrapper for setting element's style\n * @param {HTMLElement} element an HTMLElement\n * @param {Object} styles to apply to element\n */\nexport function setStyle(element: HTMLElement, styles: Record) {\n const elementStyle = element.style;\n if (!elementStyle) {\n return;\n }\n Object.entries(styles).forEach(([property, value]) =>\n elementStyle.setProperty(property, value),\n );\n}\n","import { getEnv, getFabricDocument } from '../../env';\nimport type { TSize } from '../../typedefs';\nimport { createCanvasElement } from '../../util/misc/dom';\nimport { setStyle } from '../../util/internals/dom_style';\nimport type { CSSDimensions } from './util';\nimport { makeElementUnselectable, setCSSDimensions } from './util';\nimport type { CanvasItem } from './StaticCanvasDOMManager';\nimport { StaticCanvasDOMManager } from './StaticCanvasDOMManager';\nimport { setCanvasDimensions } from './util';\nimport { NONE } from '../../constants';\n\nexport class CanvasDOMManager extends StaticCanvasDOMManager {\n upper: CanvasItem;\n container: HTMLDivElement;\n\n constructor(\n arg0?: string | HTMLCanvasElement,\n {\n allowTouchScrolling = false,\n containerClass = '',\n }: {\n allowTouchScrolling?: boolean;\n /**\n * @deprecated here only for backward compatibility\n */\n containerClass?: string;\n } = {},\n ) {\n super(arg0);\n const { el: lowerCanvasEl } = this.lower;\n const upperCanvasEl = this.createUpperCanvas();\n this.upper = { el: upperCanvasEl, ctx: upperCanvasEl.getContext('2d')! };\n this.applyCanvasStyle(lowerCanvasEl, {\n allowTouchScrolling,\n });\n this.applyCanvasStyle(upperCanvasEl, {\n allowTouchScrolling,\n styles: {\n position: 'absolute',\n left: '0',\n top: '0',\n },\n });\n const container = this.createContainerElement();\n container.classList.add(containerClass);\n if (lowerCanvasEl.parentNode) {\n lowerCanvasEl.parentNode.replaceChild(container, lowerCanvasEl);\n }\n container.append(lowerCanvasEl, upperCanvasEl);\n this.container = container;\n }\n\n protected createUpperCanvas() {\n const { el: lowerCanvasEl } = this.lower;\n const el = createCanvasElement();\n // we assign the same classname of the lowerCanvas\n el.className = lowerCanvasEl.className;\n // but then we remove the lower-canvas specific className\n el.classList.remove('lower-canvas');\n // we add the specific upper-canvas class\n el.classList.add('upper-canvas');\n el.setAttribute('data-fabric', 'top');\n el.style.cssText = lowerCanvasEl.style.cssText;\n el.setAttribute('draggable', 'true');\n return el;\n }\n\n protected createContainerElement() {\n const container = getFabricDocument().createElement('div');\n container.setAttribute('data-fabric', 'wrapper');\n setStyle(container, {\n position: 'relative',\n });\n makeElementUnselectable(container);\n return container;\n }\n\n /**\n * @private\n * @param {HTMLCanvasElement} element canvas element to apply styles on\n */\n protected applyCanvasStyle(\n element: HTMLCanvasElement,\n options: {\n allowTouchScrolling?: boolean;\n styles?: Record;\n },\n ) {\n const { styles, allowTouchScrolling } = options;\n setStyle(element, {\n ...styles,\n 'touch-action': allowTouchScrolling ? 'manipulation' : NONE,\n });\n makeElementUnselectable(element);\n }\n\n setDimensions(size: TSize, retinaScaling: number) {\n super.setDimensions(size, retinaScaling);\n const { el, ctx } = this.upper;\n setCanvasDimensions(el, ctx, size, retinaScaling);\n }\n\n setCSSDimensions(size: Partial): void {\n super.setCSSDimensions(size);\n setCSSDimensions(this.upper.el, size);\n setCSSDimensions(this.container, size);\n }\n\n cleanupDOM(size: TSize) {\n const container = this.container,\n { el: lowerCanvasEl } = this.lower,\n { el: upperCanvasEl } = this.upper;\n super.cleanupDOM(size);\n container.removeChild(upperCanvasEl);\n container.removeChild(lowerCanvasEl);\n if (container.parentNode) {\n container.parentNode.replaceChild(lowerCanvasEl, container);\n }\n }\n\n dispose() {\n super.dispose();\n getEnv().dispose(this.upper.el);\n // @ts-expect-error disposing\n delete this.upper;\n // @ts-expect-error disposing\n delete this.container;\n }\n}\n","import type { ModifierKey, TOptionalModifierKey } from '../EventTypeDefs';\nimport type { TOptions } from '../typedefs';\nimport type { StaticCanvasOptions } from './StaticCanvasOptions';\n\nexport interface CanvasTransformOptions {\n /**\n * When true, objects can be transformed by one side (unproportionately)\n * when dragged on the corners that normally would not do that.\n * @type Boolean\n * @since fabric 4.0 // changed name and default value\n */\n uniformScaling: boolean;\n\n /**\n * Indicates which key switches uniform scaling.\n * values: 'altKey', 'shiftKey', 'ctrlKey'.\n * If `null` or 'none' or any other string that is not a modifier key\n * feature is disabled.\n * totally wrong named. this sounds like `uniform scaling`\n * if Canvas.uniformScaling is true, pressing this will set it to false\n * and viceversa.\n * @since 1.6.2\n * @type ModifierKey\n */\n uniScaleKey: TOptionalModifierKey;\n\n /**\n * When true, objects use center point as the origin of scale transformation.\n * Backwards incompatibility note: This property replaces \"centerTransform\" (Boolean).\n * @since 1.3.4\n * @type Boolean\n */\n centeredScaling: boolean;\n\n /**\n * When true, objects use center point as the origin of rotate transformation.\n * Backwards incompatibility note: This property replaces \"centerTransform\" (Boolean).\n * @since 1.3.4\n * @type Boolean\n */\n centeredRotation: boolean;\n\n /**\n * Indicates which key enable centered Transform\n * values: 'altKey', 'shiftKey', 'ctrlKey'.\n * If `null` or 'none' or any other string that is not a modifier key\n * feature is disabled feature disabled.\n * @since 1.6.2\n * @type ModifierKey\n */\n centeredKey: TOptionalModifierKey;\n\n /**\n * Indicates which key enable alternate action on corner\n * values: 'altKey', 'shiftKey', 'ctrlKey'.\n * If `null` or 'none' or any other string that is not a modifier key\n * feature is disabled feature disabled.\n * @since 1.6.2\n * @type ModifierKey\n */\n altActionKey: TOptionalModifierKey;\n}\n\nexport interface CanvasSelectionOptions {\n /**\n * Indicates whether group selection should be enabled\n * @type Boolean\n */\n selection: boolean;\n\n /**\n * Indicates which key or keys enable multiple click selection\n * Pass value as a string or array of strings\n * values: 'altKey', 'shiftKey', 'ctrlKey'.\n * If `null` or empty or containing any other string that is not a modifier key\n * feature is disabled.\n * @since 1.6.2\n * @type ModifierKey|ModifierKey[]\n */\n selectionKey: TOptionalModifierKey | ModifierKey[];\n\n /**\n * Indicates which key enable alternative selection\n * in case of a target overlapping with active object and we don't want to loose the\n * active selection, we can press this modifier key and continue selecting the current\n * selected object also when is covered by another or many valid targets for selection.\n * values: 'altKey', 'shiftKey', 'ctrlKey'.\n * For a series of reason that come from the general expectations on how\n * things should work, this feature works only for preserveObjectStacking true.\n * If `null` or 'none' or any other string that is not a modifier key\n * feature is disabled.\n * @since 1.6.5\n * @type null|ModifierKey\n */\n altSelectionKey: TOptionalModifierKey;\n\n /**\n * Color of selection\n * @type String\n */\n selectionColor: string;\n\n /**\n * Default dash array pattern\n * If not empty the selection border is dashed\n * @type Array\n */\n selectionDashArray: number[];\n\n /**\n * Color of the border of selection (usually slightly darker than color of selection itself)\n * @type String\n */\n selectionBorderColor: string;\n\n /**\n * Width of a line used in object/group selection\n * @type Number\n */\n selectionLineWidth: number;\n\n /**\n * Select only shapes that are fully contained in the dragged selection rectangle.\n * @type Boolean\n */\n selectionFullyContained: boolean;\n}\n\nexport interface CanvasCursorOptions {\n /**\n * Default cursor value used when hovering over an object on canvas\n * @type CSSStyleDeclaration['cursor']\n * @default move\n */\n hoverCursor: CSSStyleDeclaration['cursor'];\n\n /**\n * Default cursor value used when moving an object on canvas\n * @type CSSStyleDeclaration['cursor']\n * @default move\n */\n moveCursor: CSSStyleDeclaration['cursor'];\n\n /**\n * Default cursor value used for the entire canvas\n * @type String\n * @default default\n */\n defaultCursor: CSSStyleDeclaration['cursor'];\n\n /**\n * Cursor value used during free drawing\n * @type String\n * @default crosshair\n */\n freeDrawingCursor: CSSStyleDeclaration['cursor'];\n\n /**\n * Cursor value used for disabled elements ( corners with disabled action )\n * @type String\n * @since 2.0.0\n * @default not-allowed\n */\n notAllowedCursor: CSSStyleDeclaration['cursor'];\n}\n\nexport interface TargetFindOptions {\n /**\n * When true, object detection happens on per-pixel basis rather than on per-bounding-box\n * @type Boolean\n */\n perPixelTargetFind: boolean;\n\n /**\n * Number of pixels around target pixel to tolerate (consider active) during object detection\n * @type Number\n */\n targetFindTolerance: number;\n\n /**\n * When true, target detection is skipped. Target detection will return always undefined.\n * click selection won't work anymore, events will fire with no targets.\n * if something is selected before setting it to true, it will be deselected at the first click.\n * area selection will still work. check the `selection` property too.\n * if you deactivate both, you should look into staticCanvas.\n * @type Boolean\n */\n skipTargetFind: boolean;\n}\n\nexport interface CanvasEventsOptions {\n /**\n * Indicates if the right click on canvas can output the context menu or not\n * The default value changed from false to true in Fabric 7.0\n * @see https://fabricjs.com/docs/upgrading/upgrading-to-fabric-70/\n * @deprecated since 7.0, Will be removed in Fabric 8.0\n * @type Boolean\n * @since 1.6.5\n */\n stopContextMenu: boolean;\n\n /**\n * Indicates if the canvas can fire right click events\n * The default value changed from false to true in Fabric 7.0\n * @see https://fabricjs.com/docs/upgrading/upgrading-to-fabric-70/\n * @deprecated since 7.0, Will be removed in Fabric 8.0\n * @type Boolean\n * @since 1.6.5\n */\n fireRightClick: boolean;\n\n /**\n * Indicates if the canvas can fire middle click events\n * The default value changed from false to true in Fabric 7.0\n * @see https://fabricjs.com/docs/upgrading/upgrading-to-fabric-70/\n * @deprecated since 7.0, Will be removed in Fabric 8.0\n * @type Boolean\n * @since 1.7.8\n */\n fireMiddleClick: boolean;\n\n /**\n * When the option is enabled, PointerEvent is used instead of TPointerEvent.\n * @type Boolean\n */\n enablePointerEvents: boolean;\n}\n\nexport interface CanvasOptions\n extends StaticCanvasOptions,\n CanvasTransformOptions,\n CanvasSelectionOptions,\n CanvasCursorOptions,\n TargetFindOptions,\n CanvasEventsOptions {\n /**\n * Default element class that's given to wrapper (div) element of canvas\n * @type String\n * @deprecated customize {@link CanvasDOMManager} instead or access {@link elements} directly\n */\n containerClass: string;\n\n /**\n * Indicates whether objects should remain in current stack position when selected.\n * When false objects are brought to top and rendered as part of the selection group\n * @type Boolean\n * @default true\n */\n preserveObjectStacking: boolean;\n\n /**\n * 启用双击锁定组节点,锁定后可选择组节点中的子节点,无论group中interative和subTargetCheck是否启用\n * @type Boolean\n * @default\n */\n dblClickIsolateObject: boolean;\n}\n\nexport type TCanvasOptions = TOptions;\n\nexport const canvasDefaults: TOptions = {\n uniformScaling: true,\n uniScaleKey: 'shiftKey',\n centeredScaling: false,\n centeredRotation: false,\n centeredKey: 'altKey',\n altActionKey: 'shiftKey',\n\n selection: true,\n selectionKey: 'shiftKey',\n selectionColor: 'rgba(100, 100, 255, 0.3)',\n selectionDashArray: [],\n selectionBorderColor: 'rgba(255, 255, 255, 0.3)',\n selectionLineWidth: 1,\n selectionFullyContained: false,\n\n hoverCursor: 'move',\n moveCursor: 'move',\n defaultCursor: 'default',\n freeDrawingCursor: 'crosshair',\n notAllowedCursor: 'not-allowed',\n\n perPixelTargetFind: false,\n targetFindTolerance: 0,\n skipTargetFind: false,\n\n stopContextMenu: true,\n fireRightClick: true,\n fireMiddleClick: true,\n enablePointerEvents: false,\n\n containerClass: 'canvas-container',\n preserveObjectStacking: true,\n};\n","import { dragHandler } from '../controls/drag';\nimport { getActionFromCorner } from '../controls/util';\nimport { Point } from '../Point';\nimport { FabricObject } from '../shapes/Object/FabricObject';\nimport type {\n CanvasEvents,\n ModifierKey,\n TOptionalModifierKey,\n TPointerEvent,\n Transform,\n} from '../EventTypeDefs';\nimport {\n addTransformToObject,\n saveObjectTransform,\n} from '../util/misc/objectTransforms';\nimport type { TCanvasSizeOptions } from './StaticCanvas';\nimport { StaticCanvas } from './StaticCanvas';\nimport { isCollection } from '../Collection';\nimport { isTransparent } from '../util/misc/isTransparent';\nimport type {\n TMat2D,\n TOriginX,\n TOriginY,\n TSize,\n TSVGReviver,\n} from '../typedefs';\nimport { degreesToRadians } from '../util/misc/radiansDegreesConversion';\nimport { getPointer, isTouchEvent } from '../util/dom_event';\nimport type { IText } from '../shapes/IText/IText';\nimport type { BaseBrush } from '../brushes/BaseBrush';\nimport { pick } from '../util/misc/pick';\nimport { sendPointToPlane } from '../util/misc/planeChange';\nimport { cos, createCanvasElement, sin } from '../util';\nimport { CanvasDOMManager } from './DOMManagers/CanvasDOMManager';\nimport {\n BOTTOM,\n CENTER,\n LEFT,\n MODIFIED,\n RESIZING,\n RIGHT,\n ROTATE,\n SCALE,\n SCALE_X,\n SCALE_Y,\n SKEW_X,\n SKEW_Y,\n TOP,\n} from '../constants';\nimport type { CanvasOptions } from './CanvasOptions';\nimport { canvasDefaults } from './CanvasOptions';\nimport { Intersection } from '../Intersection';\nimport { isActiveSelection } from '../util/typeAssertions';\nimport { Group } from '../shapes/Group';\n\nexport type TargetsInfo = {\n target?: FabricObject;\n subTargets: FabricObject[];\n};\n\nexport type TargetsInfoWithContainer = {\n // the target we think is the most continuing the selection action.\n // could be hoveredTarget or the currently selected object\n target?: FabricObject;\n // the nested targets under the pointer for container\n subTargets: FabricObject[];\n // the container for target, or target itself if there are no selectable nested targets\n container?: FabricObject;\n};\n\nexport type FullTargetsInfoWithContainer = TargetsInfoWithContainer & {\n // hoveredTarget\n currentTarget?: FabricObject;\n // the container for hoveredTarget, or container itself\n currentContainer?: FabricObject;\n // nested targets of current container\n currentSubTargets: FabricObject[];\n};\n\n/**\n * Canvas class\n * @class Canvas\n * @extends StaticCanvas\n * @see {@link http://fabric5.fabricjs.com/fabric-intro-part-1#canvas}\n *\n * @fires object:modified at the end of a transform\n * @fires object:rotating while an object is being rotated from the control\n * @fires object:scaling while an object is being scaled by controls\n * @fires object:moving while an object is being dragged\n * @fires object:skewing while an object is being skewed from the controls\n *\n * @fires before:transform before a transform is is started\n * @fires before:selection:cleared\n * @fires selection:cleared\n * @fires selection:updated\n * @fires selection:created\n *\n * @fires path:created after a drawing operation ends and the path is added\n * @fires mouse:down\n * @fires mouse:move\n * @fires mouse:up\n * @fires mouse:down:before on mouse down, before the inner fabric logic runs\n * @fires mouse:move:before on mouse move, before the inner fabric logic runs\n * @fires mouse:up:before on mouse up, before the inner fabric logic runs\n * @fires mouse:over\n * @fires mouse:out\n * @fires mouse:dblclick whenever a native dbl click event fires on the canvas.\n *\n * @fires dragover\n * @fires dragenter\n * @fires dragleave\n * @fires drag:enter object drag enter\n * @fires drag:leave object drag leave\n * @fires drop:before before drop event. Prepare for the drop event (same native event).\n * @fires drop\n * @fires drop:after after drop event. Run logic on canvas after event has been accepted/declined (same native event).\n * @example\n * let a: fabric.Object, b: fabric.Object;\n * let flag = false;\n * canvas.add(a, b);\n * a.on('drop:before', opt => {\n * // we want a to accept the drop even though it's below b in the stack\n * flag = this.canDrop(opt.e);\n * });\n * b.canDrop = function(e) {\n * !flag && this.draggableTextDelegate.canDrop(e);\n * }\n * b.on('dragover', opt => b.set('fill', opt.dropTarget === b ? 'pink' : 'black'));\n * a.on('drop', opt => {\n * opt.e.defaultPrevented // drop occurred\n * opt.didDrop // drop occurred on canvas\n * opt.target // drop target\n * opt.target !== a && a.set('text', 'I lost');\n * });\n * canvas.on('drop:after', opt => {\n * // inform user who won\n * if(!opt.e.defaultPrevented) {\n * // no winners\n * }\n * else if(!opt.didDrop) {\n * // my objects didn't win, some other lucky object\n * }\n * else {\n * // we have a winner it's opt.target!!\n * }\n * })\n *\n * @fires after:render at the end of the render process, receives the context in the callback\n * @fires before:render at start the render process, receives the context in the callback\n *\n * @fires contextmenu:before\n * @fires contextmenu\n * @example\n * let handler;\n * targets.forEach(target => {\n * target.on('contextmenu:before', opt => {\n * // decide which target should handle the event before canvas hijacks it\n * if (someCaseHappens && opt.targets.includes(target)) {\n * handler = target;\n * }\n * });\n * target.on('contextmenu', opt => {\n * // do something fantastic\n * });\n * });\n * canvas.on('contextmenu', opt => {\n * if (!handler) {\n * // no one takes responsibility, it's always left to me\n * // let's show them how it's done!\n * }\n * });\n *\n */\nexport class SelectableCanvas\n extends StaticCanvas\n implements Omit\n{\n declare _objects: FabricObject[];\n\n // transform config\n declare uniformScaling: boolean;\n declare uniScaleKey: TOptionalModifierKey;\n declare centeredScaling: boolean;\n declare centeredRotation: boolean;\n declare centeredKey: TOptionalModifierKey;\n declare altActionKey: TOptionalModifierKey;\n\n // selection config\n declare selection: boolean;\n declare selectionKey: TOptionalModifierKey | ModifierKey[];\n declare altSelectionKey: TOptionalModifierKey;\n declare selectionColor: string;\n declare selectionDashArray: number[];\n declare selectionBorderColor: string;\n declare selectionLineWidth: number;\n declare selectionFullyContained: boolean;\n\n // cursors\n declare hoverCursor: CSSStyleDeclaration['cursor'];\n declare moveCursor: CSSStyleDeclaration['cursor'];\n declare defaultCursor: CSSStyleDeclaration['cursor'];\n declare freeDrawingCursor: CSSStyleDeclaration['cursor'];\n declare notAllowedCursor: CSSStyleDeclaration['cursor'];\n\n declare containerClass: string;\n\n // target find config\n declare perPixelTargetFind: boolean;\n declare targetFindTolerance: number;\n declare skipTargetFind: boolean;\n\n /**\n * When true, mouse events on canvas (mousedown/mousemove/mouseup) result in free drawing.\n * After mousedown, mousemove creates a shape,\n * and then mouseup finalizes it and adds an instance of `fabric.Path` onto canvas.\n * @see {@link http://fabric5.fabricjs.com/fabric-intro-part-4#free_drawing}\n * @type Boolean\n */\n declare isDrawingMode: boolean;\n\n declare preserveObjectStacking: boolean;\n\n /**\n * 启用双击锁定组对象,锁定后只能选择对象的子节点,无论group中interative和subTargetCheck是否启用\n * @type Boolean\n * @default\n */\n declare dblClickIsolateObject: boolean;\n\n /**\n * 双击锁定的节点, 目前只支持组节点\n * @type Group | null\n * @default\n */\n isolatedObject: Group | null;\n\n /**\n * 指定的搜索对象\n * @type Boolean\n * @default null\n */\n _searchTargets: FabricObject[] | null;\n\n // event config\n declare stopContextMenu: boolean;\n declare fireRightClick: boolean;\n declare fireMiddleClick: boolean;\n\n /**\n * Keep track of the hovered target in the previous event\n * @type FabricObject | null\n * @private\n */\n declare _hoveredTarget?: FabricObject;\n\n /**\n * hold the list of nested targets hovered in the previous events\n * @type FabricObject[]\n * @private\n */\n _hoveredTargets: FabricObject[] = [];\n\n /**\n * hold the list of objects to render\n * @type FabricObject[]\n * @private\n */\n declare _objectsToRender?: FabricObject[];\n\n /**\n * hold a reference to a data structure that contains information\n * on the current on going transform\n * @type\n * @private\n */\n _currentTransform: Transform | null = null;\n\n /**\n * hold a reference to a data structure used to track the selection\n * box on canvas drag\n * on the current on going transform\n * x, y, deltaX and deltaY are in scene plane\n * @type\n * @private\n */\n protected _groupSelector: {\n x: number;\n y: number;\n deltaX: number;\n deltaY: number;\n } | null = null;\n\n /**\n * internal flag used to understand if the context top requires a cleanup\n * in case this is true, the contextTop will be cleared at the next render\n * @type boolean\n * @private\n */\n contextTopDirty = false;\n\n /**\n * During a mouse event we may need the pointer multiple times in multiple functions.\n * _scenePoint holds a reference to the pointer in fabricCanvas/design coordinates that is valid for the event\n * lifespan. Every fabricJS mouse event create and delete the cache every time\n * We do this because there are some HTML DOM inspection functions to get the actual pointer coordinates\n * @type {Point}\n */\n protected declare _scenePoint?: Point;\n\n /**\n * During a mouse event we may need the pointer multiple times in multiple functions.\n * _viewportPoint holds a reference to the pointer in html coordinates that is valid for the event\n * lifespan. Every fabricJS mouse event create and delete the cache every time\n * We do this because there are some HTML DOM inspection functions to get the actual pointer coordinates\n * @type {Point}\n */\n protected declare _viewportPoint?: Point;\n\n /**\n * Holds the informations we cache during an event lifespan\n * This data is needed many times during an event and we want to avoid to recalculate it\n * multuple times.\n */\n protected declare _targetInfo: FullTargetsInfoWithContainer | undefined;\n\n static ownDefaults = canvasDefaults;\n\n static getDefaults(): Record {\n return { ...super.getDefaults(), ...SelectableCanvas.ownDefaults };\n }\n\n declare elements: CanvasDOMManager;\n get upperCanvasEl() {\n return this.elements.upper?.el;\n }\n get contextTop() {\n return this.elements.upper?.ctx;\n }\n get wrapperEl() {\n return this.elements.container;\n }\n private declare pixelFindCanvasEl: HTMLCanvasElement;\n private declare pixelFindContext: CanvasRenderingContext2D;\n\n protected declare _isCurrentlyDrawing: boolean;\n declare freeDrawingBrush?: BaseBrush;\n declare _activeObject?: FabricObject;\n\n protected initElements(el?: string | HTMLCanvasElement) {\n this.elements = new CanvasDOMManager(el, {\n allowTouchScrolling: this.allowTouchScrolling,\n containerClass: this.containerClass,\n });\n this._createCacheCanvas();\n }\n\n /**\n * @private\n * @param {FabricObject} obj Object that was added\n */\n _onObjectAdded(obj: FabricObject) {\n this._objectsToRender = undefined;\n super._onObjectAdded(obj);\n }\n\n /**\n * @private\n * @param {FabricObject} obj Object that was removed\n */\n _onObjectRemoved(obj: FabricObject) {\n this._objectsToRender = undefined;\n // removing active object should fire \"selection:cleared\" events\n if (obj === this._activeObject) {\n this.fire('before:selection:cleared', { deselected: [obj] });\n this._discardActiveObject();\n this.fire('selection:cleared', { deselected: [obj] });\n obj.fire('deselected', {\n target: obj,\n });\n }\n if (obj === this._hoveredTarget) {\n this._hoveredTarget = undefined;\n this._hoveredTargets = [];\n }\n super._onObjectRemoved(obj);\n }\n\n _onStackOrderChanged() {\n this._objectsToRender = undefined;\n super._onStackOrderChanged();\n }\n\n /**\n * Divides objects in two groups, one to render immediately\n * and one to render as activeGroup.\n * @return {Array} objects to render immediately and pushes the other in the activeGroup.\n */\n _chooseObjectsToRender(): FabricObject[] {\n const activeObject = this._activeObject;\n return !this.preserveObjectStacking && activeObject\n ? this._objects\n .filter((object) => !object.group && object !== activeObject)\n .concat(activeObject)\n : this._objects;\n }\n\n /**\n * Renders both the top canvas and the secondary container canvas.\n */\n renderAll() {\n this.cancelRequestedRender();\n if (this.destroyed) {\n return;\n }\n if (this.contextTopDirty && !this._groupSelector && !this.isDrawingMode) {\n this.clearContext(this.contextTop);\n this.contextTopDirty = false;\n }\n if (this.hasLostContext) {\n this.renderTopLayer(this.contextTop);\n this.hasLostContext = false;\n }\n !this._objectsToRender &&\n (this._objectsToRender = this._chooseObjectsToRender());\n this.renderCanvas(this.getContext(), this._objectsToRender);\n }\n\n /**\n * text selection is rendered by the active text instance during the rendering cycle\n */\n renderTopLayer(ctx: CanvasRenderingContext2D): void {\n ctx.save();\n if (this.isDrawingMode && this._isCurrentlyDrawing) {\n this.freeDrawingBrush && this.freeDrawingBrush._render();\n this.contextTopDirty = true;\n }\n // we render the top context - last object\n if (this.selection && this._groupSelector) {\n this._drawSelection(ctx);\n this.contextTopDirty = true;\n }\n ctx.restore();\n }\n\n /**\n * Method to render only the top canvas.\n * Also used to render the group selection box.\n * Does not render text selection.\n */\n renderTop() {\n const ctx = this.contextTop;\n this.clearContext(ctx);\n this.renderTopLayer(ctx);\n // todo: how do i know if the after:render is for the top or normal contex?\n this.fire('after:render', { ctx });\n }\n\n /**\n * Set the canvas tolerance value for pixel taret find.\n * Use only integer numbers.\n * @private\n */\n setTargetFindTolerance(value: number) {\n value = Math.round(value);\n this.targetFindTolerance = value;\n const retina = this.getRetinaScaling();\n const size = Math.ceil((value * 2 + 1) * retina);\n this.pixelFindCanvasEl.width = this.pixelFindCanvasEl.height = size;\n this.pixelFindContext.scale(retina, retina);\n }\n\n /**\n * Returns true if object is transparent at a certain location\n * Clarification: this is `is target transparent at location X or are controls there`\n * @TODO this seems dumb that we treat controls with transparency. we can find controls\n * programmatically without painting them, the cache canvas optimization is always valid\n * @param {FabricObject} target Object to check\n * @param {Number} x Left coordinate in viewport space\n * @param {Number} y Top coordinate in viewport space\n * @return {Boolean}\n */\n isTargetTransparent(target: FabricObject, x: number, y: number): boolean {\n const tolerance = this.targetFindTolerance;\n const ctx = this.pixelFindContext;\n this.clearContext(ctx);\n ctx.save();\n ctx.translate(-x + tolerance, -y + tolerance);\n ctx.transform(...this.viewportTransform);\n const selectionBgc = target.selectionBackgroundColor;\n target.selectionBackgroundColor = '';\n target.render(ctx);\n target.selectionBackgroundColor = selectionBgc;\n ctx.restore();\n // our canvas is square, and made around tolerance.\n // so tolerance in this case also represent the center of the canvas.\n const enhancedTolerance = Math.round(tolerance * this.getRetinaScaling());\n return isTransparent(\n ctx,\n enhancedTolerance,\n enhancedTolerance,\n enhancedTolerance,\n );\n }\n\n /**\n * takes an event and determines if selection key has been pressed\n * @private\n * @param {TPointerEvent} e Event object\n */\n _isSelectionKeyPressed(e: TPointerEvent): boolean {\n const sKey = this.selectionKey;\n if (!sKey) {\n return false;\n }\n if (Array.isArray(sKey)) {\n return !!sKey.find((key) => !!key && e[key] === true);\n } else {\n return e[sKey];\n }\n }\n\n /**\n * @private\n * @param {TPointerEvent} e Event object\n * @param {FabricObject} target\n */\n _shouldClearSelection(\n e: TPointerEvent,\n target?: FabricObject,\n ): target is undefined {\n const activeObjects = this.getActiveObjects(),\n activeObject = this._activeObject;\n\n return !!(\n !target ||\n (target &&\n activeObject &&\n activeObjects.length > 1 &&\n activeObjects.indexOf(target) === -1 &&\n activeObject !== target &&\n !this._isSelectionKeyPressed(e)) ||\n (target && !target.evented) ||\n (target && !target.selectable && activeObject && activeObject !== target)\n );\n }\n\n /**\n * This method will take in consideration a modifier key pressed and the control we are\n * about to drag, and try to guess the anchor point ( origin ) of the transormation.\n * This should be really in the realm of controls, and we should remove specific code for legacy\n * embedded actions.\n * @TODO this probably deserve discussion/rediscovery and change/refactor\n * @private\n * @deprecated\n * @param {FabricObject} target\n * @param {string} action\n * @param {boolean} altKey\n * @returns {boolean} true if the transformation should be centered\n */\n private _shouldCenterTransform(\n target: FabricObject,\n action: string,\n modifierKeyPressed: boolean,\n ) {\n if (!target) {\n return;\n }\n\n let centerTransform;\n\n if (\n action === SCALE ||\n action === SCALE_X ||\n action === SCALE_Y ||\n action === RESIZING\n ) {\n centerTransform = this.centeredScaling || target.centeredScaling;\n } else if (action === ROTATE) {\n centerTransform = this.centeredRotation || target.centeredRotation;\n }\n\n return centerTransform ? !modifierKeyPressed : modifierKeyPressed;\n }\n\n /**\n * Given the control clicked, determine the origin of the transform.\n * This is bad because controls can totally have custom names\n * should disappear before release 4.0\n * @private\n * @deprecated\n */\n _getOriginFromCorner(\n target: FabricObject,\n controlName: string,\n ): { x: TOriginX; y: TOriginY } {\n const origin = {\n x: target.originX,\n y: target.originY,\n };\n\n if (!controlName) {\n return origin;\n }\n\n // is a left control ?\n if (['ml', 'tl', 'bl'].includes(controlName)) {\n origin.x = RIGHT;\n // is a right control ?\n } else if (['mr', 'tr', 'br'].includes(controlName)) {\n origin.x = LEFT;\n }\n // is a top control ?\n if (['tl', 'mt', 'tr'].includes(controlName)) {\n origin.y = BOTTOM;\n // is a bottom control ?\n } else if (['bl', 'mb', 'br'].includes(controlName)) {\n origin.y = TOP;\n }\n return origin;\n }\n\n /**\n * @private\n * @param {Event} e Event object\n * @param {FabricObject} target\n * @param {boolean} [alreadySelected] pass true to setup the active control\n */\n _setupCurrentTransform(\n e: TPointerEvent,\n target: FabricObject,\n alreadySelected: boolean,\n ): void {\n const pointer = target.group\n ? // transform pointer to target's containing coordinate plane\n sendPointToPlane(\n this.getScenePoint(e),\n undefined,\n target.group.calcTransformMatrix(),\n )\n : this.getScenePoint(e);\n const { key: corner = '', control } = target.getActiveControl() || {},\n actionHandler =\n alreadySelected && control\n ? control.getActionHandler(e, target, control)?.bind(control)\n : dragHandler,\n action = getActionFromCorner(alreadySelected, corner, e, target),\n altKey = e[this.centeredKey as ModifierKey],\n origin = this._shouldCenterTransform(target, action, altKey)\n ? ({ x: CENTER, y: CENTER } as const)\n : this._getOriginFromCorner(target, corner),\n /**\n * relative to target's containing coordinate plane\n * both agree on every point\n **/\n transform: Transform = {\n target: target,\n action,\n actionHandler,\n actionPerformed: false,\n corner,\n scaleX: target.scaleX,\n scaleY: target.scaleY,\n skewX: target.skewX,\n skewY: target.skewY,\n offsetX: pointer.x - target.left,\n offsetY: pointer.y - target.top,\n originX: origin.x,\n originY: origin.y,\n ex: pointer.x,\n ey: pointer.y,\n lastX: pointer.x,\n lastY: pointer.y,\n theta: degreesToRadians(target.angle),\n width: target.width,\n height: target.height,\n shiftKey: e.shiftKey,\n altKey,\n original: {\n ...saveObjectTransform(target),\n originX: origin.x,\n originY: origin.y,\n },\n };\n\n this._currentTransform = transform;\n\n this.fire('before:transform', {\n e,\n transform,\n });\n }\n\n /**\n * Set the cursor type of the canvas element\n * @param {String} value Cursor type of the canvas element.\n * @see http://www.w3.org/TR/css3-ui/#cursor\n */\n setCursor(value: CSSStyleDeclaration['cursor']): void {\n this.upperCanvasEl.style.cursor = value;\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx to draw the selection on\n */\n _drawSelection(ctx: CanvasRenderingContext2D): void {\n const { x, y, deltaX, deltaY } = this._groupSelector!,\n start = new Point(x, y).transform(this.viewportTransform),\n extent = new Point(x + deltaX, y + deltaY).transform(\n this.viewportTransform,\n ),\n strokeOffset = this.selectionLineWidth / 2;\n let minX = Math.min(start.x, extent.x),\n minY = Math.min(start.y, extent.y),\n maxX = Math.max(start.x, extent.x),\n maxY = Math.max(start.y, extent.y);\n\n if (this.selectionColor) {\n ctx.fillStyle = this.selectionColor;\n ctx.fillRect(minX, minY, maxX - minX, maxY - minY);\n }\n\n if (!this.selectionLineWidth || !this.selectionBorderColor) {\n return;\n }\n ctx.lineWidth = this.selectionLineWidth;\n ctx.strokeStyle = this.selectionBorderColor;\n\n minX += strokeOffset;\n minY += strokeOffset;\n maxX -= strokeOffset;\n maxY -= strokeOffset;\n // selection border\n // @TODO: is _setLineDash still necessary on modern canvas?\n FabricObject.prototype._setLineDash.call(\n this,\n ctx,\n this.selectionDashArray,\n );\n ctx.strokeRect(minX, minY, maxX - minX, maxY - minY);\n }\n\n /**\n * 双击选择\n * @param e\n * @returns\n */\n dblClickLock(e: TPointerEvent): boolean {\n if (this.dblClickIsolateObject) {\n const pointer = this.getScenePoint(e);\n const objects = this.isolatedObject\n ? this.isolatedObject.getObjects()\n : this.getObjects();\n const obj = this.searchPossibleTargets(objects, pointer);\n if (obj.target) {\n if (obj.target instanceof Group) {\n // 组才修改锁定\n this.isolatedObject = obj.target;\n this.discardActiveObject();\n // 新创建的组对象,子节点coords初始化,否则无法选中\n obj.target._objects.forEach((o) => {\n o.setCoords();\n });\n } else {\n // 非组对象不处理锁定,返回false继续对象自己的双击事件\n return false;\n }\n } else {\n // 取消锁定\n this.isolatedObject = null;\n this.discardActiveObject();\n }\n return true;\n }\n return false;\n }\n\n /**\n * 设置搜索对象\n * 如当编辑path时,设置点为可搜索对象\n * @param objects\n */\n setSearchTargets(objects: FabricObject[] | null) {\n this._searchTargets = objects;\n }\n\n /**\n * 返回搜索对象\n * @returns\n */\n getSearchTargets() {\n return (\n this._searchTargets ||\n (this.isolatedObject ? this.isolatedObject._objects : this._objects)\n );\n }\n\n /**\n * Method that determines what object we are clicking on\n * 11/09/2018 TODO: would be cool if findTarget could discern between being a full target\n * or the outside part of the corner.\n * @param {Event} e mouse event\n * @return {TargetsInfoWithContainer} the target found\n */\n findTarget(e: TPointerEvent): FullTargetsInfoWithContainer {\n // this._targetInfo is cached by _cacheTransformEventData\n // and destroyed by _resetTransformEventData\n if (this._targetInfo) {\n return this._targetInfo;\n }\n\n if (this.skipTargetFind) {\n return {\n subTargets: [],\n currentSubTargets: [],\n };\n }\n\n const pointer = this.getScenePoint(e),\n activeObject = this._activeObject,\n aObjects = this.getActiveObjects(),\n targetInfo = this.searchPossibleTargets(this.getSearchTargets(), pointer);\n\n const {\n subTargets: currentSubTargets,\n container: currentContainer,\n target: currentTarget,\n } = targetInfo;\n\n const fullTargetInfo: FullTargetsInfoWithContainer = {\n ...targetInfo,\n currentSubTargets,\n currentContainer,\n currentTarget,\n };\n\n // simplest case no active object, return a new target\n if (!activeObject) {\n return fullTargetInfo;\n }\n\n // check pointer is over active selection and possibly perform `subTargetCheck`\n const activeObjectTargetInfo: FullTargetsInfoWithContainer = {\n ...this.searchPossibleTargets([activeObject], pointer),\n currentSubTargets,\n currentContainer,\n currentTarget,\n };\n\n const activeObjectControl = activeObject.findControl(\n this.getViewportPoint(e),\n isTouchEvent(e),\n );\n\n // we are clicking exactly the control of an active object, shortcut to that object.\n if (activeObjectControl) {\n return {\n ...activeObjectTargetInfo,\n target: activeObject, // we override target in case we are in the outside part of the corner.\n };\n }\n\n // in case we are over the active object\n if (activeObjectTargetInfo.target) {\n if (aObjects.length > 1) {\n // in case of active selection and target hit over the activeSelection, just exit\n // TODO Verify if we need to override target with container\n return activeObjectTargetInfo;\n }\n // from here onward not an active selection, just an activeOject that maybe is a group\n\n // preserveObjectStacking is false, so activeObject is drawn on top, just return activeObject\n if (!this.preserveObjectStacking) {\n // TODO Verify if we need to override target with container\n return activeObjectTargetInfo;\n }\n\n // In case we are in preserveObjectStacking ( selection in stack )\n // there is the possibility to force with `altSelectionKey` to return the activeObject\n // from any point in the stack, even if we have another object completely on top of it.\n if (\n this.preserveObjectStacking &&\n e[this.altSelectionKey as ModifierKey]\n ) {\n // TODO Verify if we need to override target with container\n return activeObjectTargetInfo;\n }\n }\n\n // we have an active object, but we ruled out it being our target in any way.\n return fullTargetInfo;\n }\n\n /**\n * Checks if the point is inside the object selection area including padding\n * @param {FabricObject} obj Object to test against\n * @param {Object} [pointer] point in scene coordinates\n * @return {Boolean} true if point is contained within an area of given object\n * @private\n */\n private _pointIsInObjectSelectionArea(obj: FabricObject, point: Point) {\n // getCoords will already take care of group de-nesting\n let coords = obj.getCoords();\n const viewportZoom = this.getZoom();\n const padding = obj.padding / viewportZoom;\n if (padding) {\n const [tl, tr, br, bl] = coords;\n // what is the angle of the object?\n // we could use getTotalAngle, but is way easier to look at it\n // from how coords are oriented, since if something went wrong\n // at least we are consistent.\n const angleRadians = Math.atan2(tr.y - tl.y, tr.x - tl.x),\n cosP = cos(angleRadians) * padding,\n sinP = sin(angleRadians) * padding,\n cosPSinP = cosP + sinP,\n cosPMinusSinP = cosP - sinP;\n\n coords = [\n new Point(tl.x - cosPMinusSinP, tl.y - cosPSinP),\n new Point(tr.x + cosPSinP, tr.y - cosPMinusSinP),\n new Point(br.x + cosPMinusSinP, br.y + cosPSinP),\n new Point(bl.x - cosPSinP, bl.y + cosPMinusSinP),\n ];\n // in case of padding we calculate the new coords on the fly.\n // otherwise we have to maintain 2 sets of coordinates for everything.\n // we can reiterate on storing them.\n // if this is slow, for now the semplification is large and doesn't impact\n // rendering.\n // the idea behind this is that outside target check we don't need ot know\n // where those coords are\n }\n return Intersection.isPointInPolygon(point, coords);\n }\n\n /**\n * Checks point is inside the object selection condition. Either area with padding\n * or over pixels if perPixelTargetFind is enabled\n * @param {FabricObject} obj Object to test against\n * @param {Point} pointer point from scene.\n * @return {Boolean} true if point is contained within an area of given object\n * @private\n */\n _checkTarget(obj: FabricObject, pointer: Point): boolean {\n if (\n obj &&\n obj.visible &&\n obj.evented &&\n this._pointIsInObjectSelectionArea(obj, pointer)\n ) {\n if (\n (this.perPixelTargetFind || obj.perPixelTargetFind) &&\n !(obj as unknown as IText).isEditing\n ) {\n const viewportPoint = pointer.transform(this.viewportTransform);\n if (!this.isTargetTransparent(obj, viewportPoint.x, viewportPoint.y)) {\n return true;\n }\n } else {\n return true;\n }\n }\n return false;\n }\n\n /**\n * Given an array of objects search possible targets under the pointer position\n * Returns an\n * @param {Array} objects objects array to look into\n * @param {Object} pointer x,y object of point of scene coordinates we want to check.\n * @param {Object} subTargets If passed, subtargets will be collected inside the array\n * @return {TargetsInfo} **top most object from given `objects`** that contains pointer\n * @private\n */\n _searchPossibleTargets(\n objects: FabricObject[],\n pointer: Point,\n subTargets: FabricObject[],\n ): TargetsInfo {\n let i = objects.length;\n // Do not check for currently grouped objects, since we check the parent group itself.\n // until we call this function specifically to search inside the activeGroup\n while (i--) {\n const target = objects[i];\n if (this._checkTarget(target, pointer)) {\n // 没有开启双击锁定节点才搜索子节点\n if (\n !this.dblClickIsolateObject &&\n isCollection(target) &&\n target.subTargetCheck\n ) {\n const { target: subTarget } = this._searchPossibleTargets(\n target._objects,\n pointer,\n subTargets,\n );\n subTarget && subTargets.push(subTarget);\n }\n return {\n target,\n subTargets,\n };\n }\n }\n return {\n subTargets: [],\n };\n }\n\n /**\n * Search inside an objects array the fiurst object that contains pointer\n * Collect subTargets of that object inside the subTargets array passed as parameter\n * @param {FabricObject[]} objects objects array to look into\n * @param {Point} pointer coordinates from viewport to check.\n * @return {FabricObject} **top most object on screen** that contains pointer\n */\n searchPossibleTargets(\n objects: FabricObject[],\n pointer: Point,\n ): TargetsInfoWithContainer {\n const targetInfo: TargetsInfoWithContainer = this._searchPossibleTargets(\n objects,\n pointer,\n [],\n );\n\n // outermost target is the container.\n targetInfo.container = targetInfo.target;\n const { container, subTargets } = targetInfo;\n\n if (\n container &&\n isCollection(container) &&\n container.interactive &&\n subTargets[0]\n ) {\n /** subTargets[0] is the innermost nested target, but it could be inside non interactive groups\n * and so not a possible selection target.\n * We loop the array from the end that is outermost innertarget.\n */\n for (let i = subTargets.length - 1; i > 0; i--) {\n const t = subTargets[i];\n if (!(isCollection(t) && t.interactive)) {\n // one of the subtargets was not interactive. that is the last subtarget we can return.\n // we can't dig more deep;\n targetInfo.target = t;\n return targetInfo;\n }\n }\n targetInfo.target = subTargets[0];\n return targetInfo;\n }\n\n return targetInfo;\n }\n\n /**\n * @returns point existing in the same plane as the {@link HTMLCanvasElement},\n * `(0, 0)` being the top left corner of the {@link HTMLCanvasElement}.\n * This means that changes to the {@link viewportTransform} do not change the values of the point\n * and it remains unchanged from the viewer's perspective.\n *\n * @example\n * const scenePoint = sendPointToPlane(\n * this.getViewportPoint(e),\n * undefined,\n * canvas.viewportTransform\n * );\n *\n */\n getViewportPoint(e: TPointerEvent) {\n if (this._viewportPoint) {\n return this._viewportPoint;\n }\n return this._getPointerImpl(e, true);\n }\n\n /**\n * @returns point existing in the scene (the same plane as the plane {@link FabricObject#getCenterPoint} exists in).\n * This means that changes to the {@link viewportTransform} do not change the values of the point,\n * however, from the viewer's perspective, the point is changed.\n *\n * @example\n * const viewportPoint = sendPointToPlane(\n * this.getScenePoint(e),\n * canvas.viewportTransform\n * );\n *\n */\n getScenePoint(e: TPointerEvent) {\n if (this._scenePoint) {\n return this._scenePoint;\n }\n return this._getPointerImpl(e);\n }\n\n /**\n * Returns pointer relative to canvas.\n *\n * Use {@link getViewportPoint} or {@link getScenePoint} instead.\n *\n * @param {Event} e\n * @param {Boolean} [fromViewport] whether to return the point from the viewport or in the scene\n * @return {Point}\n */\n protected _getPointerImpl(e: TPointerEvent, fromViewport = false): Point {\n const upperCanvasEl = this.upperCanvasEl,\n bounds = upperCanvasEl.getBoundingClientRect();\n let pointer = getPointer(e),\n boundsWidth = bounds.width || 0,\n boundsHeight = bounds.height || 0;\n\n if (!boundsWidth || !boundsHeight) {\n if (TOP in bounds && BOTTOM in bounds) {\n boundsHeight = Math.abs(bounds.top - bounds.bottom);\n }\n if (RIGHT in bounds && LEFT in bounds) {\n boundsWidth = Math.abs(bounds.right - bounds.left);\n }\n }\n\n this.calcOffset();\n pointer.x = pointer.x - this._offset.left;\n pointer.y = pointer.y - this._offset.top;\n if (!fromViewport) {\n pointer = sendPointToPlane(pointer, undefined, this.viewportTransform);\n }\n\n const retinaScaling = this.getRetinaScaling();\n if (retinaScaling !== 1) {\n pointer.x /= retinaScaling;\n pointer.y /= retinaScaling;\n }\n\n // If bounds are not available (i.e. not visible), do not apply scale.\n const cssScale =\n boundsWidth === 0 || boundsHeight === 0\n ? new Point(1, 1)\n : new Point(\n upperCanvasEl.width / boundsWidth,\n upperCanvasEl.height / boundsHeight,\n );\n\n return pointer.multiply(cssScale);\n }\n\n /**\n * Internal use only\n * @protected\n */\n protected _setDimensionsImpl(\n dimensions: TSize,\n options?: TCanvasSizeOptions,\n ) {\n // @ts-expect-error this method exists in the subclass - should be moved or declared as abstract\n this._resetTransformEventData();\n super._setDimensionsImpl(dimensions, options);\n if (this._isCurrentlyDrawing) {\n this.freeDrawingBrush &&\n this.freeDrawingBrush._setBrushStyles(this.contextTop);\n }\n }\n\n protected _createCacheCanvas() {\n this.pixelFindCanvasEl = createCanvasElement();\n this.pixelFindContext = this.pixelFindCanvasEl.getContext('2d', {\n willReadFrequently: true,\n })!;\n this.setTargetFindTolerance(this.targetFindTolerance);\n }\n\n /**\n * Returns context of top canvas where interactions are drawn\n * @returns {CanvasRenderingContext2D}\n */\n getTopContext(): CanvasRenderingContext2D {\n return this.elements.upper.ctx;\n }\n\n /**\n * Returns context of canvas where object selection is drawn\n * @alias\n * @return {CanvasRenderingContext2D}\n */\n getSelectionContext(): CanvasRenderingContext2D {\n return this.elements.upper.ctx;\n }\n\n /**\n * Returns <canvas> element on which object selection is drawn\n * @return {HTMLCanvasElement}\n */\n getSelectionElement(): HTMLCanvasElement {\n return this.elements.upper.el;\n }\n\n /**\n * Returns currently active object\n * @return {FabricObject | null} active object\n */\n getActiveObject(): FabricObject | undefined {\n return this._activeObject;\n }\n\n /**\n * Returns an array with the current selected objects\n * @return {FabricObject[]} active objects array\n */\n getActiveObjects(): FabricObject[] {\n const active = this._activeObject;\n return isActiveSelection(active)\n ? active.getObjects()\n : active\n ? [active]\n : [];\n }\n\n /**\n * @private\n * Compares the old activeObject with the current one and fires correct events\n * @param {FabricObject[]} oldObjects old activeObject\n * @param {TPointerEvent} e mouse event triggering the selection events\n */\n _fireSelectionEvents(oldObjects: FabricObject[], e?: TPointerEvent) {\n let somethingChanged = false,\n invalidate = false;\n const objects = this.getActiveObjects(),\n added: FabricObject[] = [],\n removed: FabricObject[] = [];\n\n oldObjects.forEach((target) => {\n if (!objects.includes(target)) {\n somethingChanged = true;\n target.fire('deselected', {\n e,\n target,\n });\n removed.push(target);\n }\n });\n\n objects.forEach((target) => {\n if (!oldObjects.includes(target)) {\n somethingChanged = true;\n target.fire('selected', {\n e,\n target,\n });\n added.push(target);\n }\n });\n\n if (oldObjects.length > 0 && objects.length > 0) {\n invalidate = true;\n somethingChanged &&\n this.fire('selection:updated', {\n e,\n selected: added,\n deselected: removed,\n });\n } else if (objects.length > 0) {\n invalidate = true;\n this.fire('selection:created', {\n e,\n selected: added,\n });\n } else if (oldObjects.length > 0) {\n invalidate = true;\n this.fire('selection:cleared', {\n e,\n deselected: removed,\n });\n }\n invalidate && (this._objectsToRender = undefined);\n }\n\n /**\n * Sets given object as the only active object on canvas\n * @param {FabricObject} object Object to set as an active one\n * @param {TPointerEvent} [e] Event (passed along when firing \"object:selected\")\n * @return {Boolean} true if the object has been selected\n */\n setActiveObject(object: FabricObject, e?: TPointerEvent) {\n // we can't inline this, since _setActiveObject will change what getActiveObjects returns\n const currentActives = this.getActiveObjects();\n const selected = this._setActiveObject(object, e);\n this._fireSelectionEvents(currentActives, e);\n return selected;\n }\n\n /**\n * This is supposed to be equivalent to setActiveObject but without firing\n * any event. There is commitment to have this stay this way.\n * This is the functional part of setActiveObject.\n * @param {Object} object to set as active\n * @param {Event} [e] Event (passed along when firing \"object:selected\")\n * @return {Boolean} true if the object has been selected\n */\n _setActiveObject(object: FabricObject, e?: TPointerEvent) {\n const prevActiveObject = this._activeObject;\n if (prevActiveObject === object) {\n return false;\n }\n // after calling this._discardActiveObject, this,_activeObject could be undefined\n if (!this._discardActiveObject(e, object) && this._activeObject) {\n // refused to deselect\n return false;\n }\n if (object.onSelect({ e })) {\n return false;\n }\n\n this._activeObject = object;\n\n if (isActiveSelection(object) && prevActiveObject !== object) {\n object.set('canvas', this);\n }\n object.setCoords();\n\n return true;\n }\n\n /**\n * This is supposed to be equivalent to discardActiveObject but without firing\n * any selection events ( can still fire object transformation events ). There is commitment to have this stay this way.\n * This is the functional part of discardActiveObject.\n * @param {Event} [e] Event (passed along when firing \"object:deselected\")\n * @param {Object} object the next object to set as active, reason why we are discarding this\n * @return {Boolean} true if the active object has been discarded\n */\n _discardActiveObject(\n e?: TPointerEvent,\n object?: FabricObject,\n ): this is { _activeObject: undefined } {\n const obj = this._activeObject;\n if (obj) {\n // onDeselect return TRUE to cancel selection;\n if (obj.onDeselect({ e, object })) {\n return false;\n }\n if (this._currentTransform && this._currentTransform.target === obj) {\n this.endCurrentTransform(e);\n }\n if (isActiveSelection(obj) && obj === this._hoveredTarget) {\n this._hoveredTarget = undefined;\n }\n this._activeObject = undefined;\n return true;\n }\n return false;\n }\n\n /**\n * Discards currently active object and fire events. If the function is called by fabric\n * as a consequence of a mouse event, the event is passed as a parameter and\n * sent to the fire function for the custom events. When used as a method the\n * e param does not have any application.\n * @param {event} e\n * @return {Boolean} true if the active object has been discarded\n */\n discardActiveObject(e?: TPointerEvent): this is { _activeObject: undefined } {\n const currentActives = this.getActiveObjects(),\n activeObject = this.getActiveObject();\n if (currentActives.length) {\n this.fire('before:selection:cleared', {\n e,\n deselected: [activeObject!],\n });\n }\n const discarded = this._discardActiveObject(e);\n this._fireSelectionEvents(currentActives, e);\n return discarded;\n }\n\n /**\n * End the current transform.\n * You don't usually need to call this method unless you are interrupting a user initiated transform\n * because of some other event ( a press of key combination, or something that block the user UX )\n * @param {Event} [e] send the mouse event that generate the finalize down, so it can be used in the event\n */\n endCurrentTransform(e?: TPointerEvent) {\n const transform = this._currentTransform;\n this._finalizeCurrentTransform(e);\n if (transform && transform.target) {\n // this could probably go inside _finalizeCurrentTransform\n transform.target.isMoving = false;\n }\n this._currentTransform = null;\n }\n\n /**\n * @private\n * @param {Event} e send the mouse event that generate the finalize down, so it can be used in the event\n */\n _finalizeCurrentTransform(e?: TPointerEvent) {\n const transform = this._currentTransform!,\n target = transform.target,\n options = {\n e,\n target,\n transform,\n action: transform.action,\n };\n\n if (target._scaling) {\n target._scaling = false;\n }\n\n target.setCoords();\n\n if (transform.actionPerformed) {\n this.fire('object:modified', options);\n target.fire(MODIFIED, options);\n }\n }\n\n /**\n * Sets viewport transformation of this canvas instance\n * @param {Array} vpt a Canvas 2D API transform matrix\n */\n setViewportTransform(vpt: TMat2D) {\n super.setViewportTransform(vpt);\n const activeObject = this._activeObject;\n if (activeObject) {\n activeObject.setCoords();\n }\n }\n\n /**\n * @override clears active selection ref and interactive canvas elements and contexts\n */\n destroy() {\n // dispose of active selection\n const activeObject = this._activeObject;\n if (isActiveSelection(activeObject)) {\n activeObject.removeAll();\n activeObject.dispose();\n }\n\n delete this._activeObject;\n\n super.destroy();\n\n // free resources\n\n // pixel find canvas\n // @ts-expect-error disposing\n this.pixelFindContext = null;\n // @ts-expect-error disposing\n this.pixelFindCanvasEl = undefined;\n }\n\n /**\n * Clears all contexts (background, main, top) of an instance\n */\n clear() {\n // discard active object and fire events\n this.discardActiveObject();\n // make sure we clear the active object in case it refused to be discarded\n this._activeObject = undefined;\n this.clearContext(this.contextTop);\n super.clear();\n }\n\n /**\n * Draws objects' controls (borders/controls)\n * @param {CanvasRenderingContext2D} ctx Context to render controls on\n */\n drawControls(ctx: CanvasRenderingContext2D) {\n const activeObject = this._activeObject;\n\n if (activeObject) {\n activeObject._renderControls(ctx);\n }\n }\n\n /**\n * @private\n */\n protected _toObject(\n instance: FabricObject,\n methodName: 'toObject' | 'toDatalessObject',\n propertiesToInclude: string[],\n ): Record {\n // If the object is part of the current selection group, it should\n // be transformed appropriately\n // i.e. it should be serialised as it would appear if the selection group\n // were to be destroyed.\n const originalProperties = this._realizeGroupTransformOnObject(instance),\n object = super._toObject(instance, methodName, propertiesToInclude);\n //Undo the damage we did by changing all of its properties\n instance.set(originalProperties);\n return object;\n }\n\n /**\n * Realizes an object's group transformation on it\n * @private\n * @param {FabricObject} [instance] the object to transform (gets mutated)\n * @returns the original values of instance which were changed\n */\n private _realizeGroupTransformOnObject(\n instance: FabricObject,\n ): Partial {\n const { group } = instance;\n if (group && isActiveSelection(group) && this._activeObject === group) {\n const layoutProps = [\n 'angle',\n 'flipX',\n 'flipY',\n LEFT,\n SCALE_X,\n SCALE_Y,\n SKEW_X,\n SKEW_Y,\n TOP,\n ] as (keyof typeof instance)[];\n const originalValues = pick(instance, layoutProps);\n addTransformToObject(instance, group.calcOwnMatrix());\n return originalValues;\n } else {\n return {};\n }\n }\n\n /**\n * @private\n */\n _setSVGObject(\n markup: string[],\n instance: FabricObject,\n reviver?: TSVGReviver,\n ) {\n // If the object is in a selection group, simulate what would happen to that\n // object when the group is deselected\n const originalProperties = this._realizeGroupTransformOnObject(instance);\n super._setSVGObject(markup, instance, reviver);\n instance.set(originalProperties);\n }\n}\n","import type { TPointerEvent } from '../EventTypeDefs';\nimport type { ITextBehavior } from '../shapes/IText/ITextBehavior';\nimport { removeFromArray } from '../util/internals/removeFromArray';\nimport type { Canvas } from './Canvas';\n\n/**\n * In charge of synchronizing all interactive text instances of a canvas\n */\nexport class TextEditingManager {\n private targets: ITextBehavior[] = [];\n declare private target?: ITextBehavior;\n private __disposer: VoidFunction;\n\n constructor(canvas: Canvas) {\n const cb = () => {\n const { hiddenTextarea } =\n (canvas.getActiveObject() as ITextBehavior) || {};\n hiddenTextarea && hiddenTextarea.focus();\n };\n const el = canvas.upperCanvasEl;\n el.addEventListener('click', cb);\n this.__disposer = () => el.removeEventListener('click', cb);\n }\n\n exitTextEditing() {\n this.target = undefined;\n this.targets.forEach((target) => {\n if (target.isEditing) {\n target.exitEditing();\n }\n });\n }\n\n add(target: ITextBehavior) {\n this.targets.push(target);\n }\n\n remove(target: ITextBehavior) {\n this.unregister(target);\n removeFromArray(this.targets, target);\n }\n\n register(target: ITextBehavior) {\n this.target = target;\n }\n\n unregister(target: ITextBehavior) {\n if (target === this.target) {\n this.target = undefined;\n }\n }\n\n onMouseMove(e: TPointerEvent) {\n this.target?.isEditing && this.target.updateSelectionOnMouseMove(e);\n }\n\n clear() {\n this.targets = [];\n this.target = undefined;\n }\n\n dispose() {\n this.clear();\n this.__disposer();\n // @ts-expect-error disposing\n delete this.__disposer;\n }\n}\n","import { classRegistry } from '../ClassRegistry';\nimport { NONE } from '../constants';\nimport type {\n CanvasEvents,\n DragEventData,\n ObjectEvents,\n TEventsExtraData,\n TPointerEvent,\n TPointerEventNames,\n Transform,\n} from '../EventTypeDefs';\nimport { Point } from '../Point';\nimport type { ActiveSelection } from '../shapes/ActiveSelection';\nimport type { Group } from '../shapes/Group';\nimport type { IText } from '../shapes/IText/IText';\nimport type { FabricObject } from '../shapes/Object/FabricObject';\nimport { isTouchEvent, stopEvent } from '../util/dom_event';\nimport { getDocumentFromElement, getWindowFromElement } from '../util/dom_misc';\nimport { sendPointToPlane } from '../util/misc/planeChange';\nimport { isActiveSelection } from '../util/typeAssertions';\nimport type { CanvasOptions, TCanvasOptions } from './CanvasOptions';\nimport { SelectableCanvas } from './SelectableCanvas';\nimport { TextEditingManager } from './TextEditingManager';\n\nconst addEventOptions = { passive: false } as EventListenerOptions;\n\nconst getEventPoints = (canvas: Canvas, e: TPointerEvent) => {\n const viewportPoint = canvas.getViewportPoint(e);\n const scenePoint = canvas.getScenePoint(e);\n return {\n viewportPoint,\n scenePoint,\n };\n};\n\n// just to be clear, the utils are now deprecated and those are here exactly as minifier helpers\n// because el.addEventListener can't me be minified while a const yes and we use it 47 times in this file.\n// few bytes but why give it away.\nconst addListener = (\n el: HTMLElement | Document,\n ...args: Parameters\n) => el.addEventListener(...args);\nconst removeListener = (\n el: HTMLElement | Document,\n ...args: Parameters\n) => el.removeEventListener(...args);\n\nconst syntheticEventConfig = {\n mouse: {\n in: 'over',\n out: 'out',\n targetIn: 'mouseover',\n targetOut: 'mouseout',\n canvasIn: 'mouse:over',\n canvasOut: 'mouse:out',\n },\n drag: {\n in: 'enter',\n out: 'leave',\n targetIn: 'dragenter',\n targetOut: 'dragleave',\n canvasIn: 'drag:enter',\n canvasOut: 'drag:leave',\n },\n} as const;\n\ntype TSyntheticEventContext = {\n mouse: { e: TPointerEvent };\n drag: DragEventData;\n};\n\nexport class Canvas extends SelectableCanvas implements CanvasOptions {\n /**\n * Contains the id of the touch event that owns the fabric transform\n * @type Number\n * @private\n */\n declare mainTouchId?: number;\n\n declare enablePointerEvents: boolean;\n\n /**\n * Holds a reference to a setTimeout timer for event synchronization\n * @type number\n * @private\n */\n private declare _willAddMouseDown: number;\n\n /**\n * Holds a reference to an object on the canvas that is receiving the drag over event.\n * @type FabricObject\n * @private\n */\n private declare _draggedoverTarget?: FabricObject;\n\n /**\n * Holds a reference to an object on the canvas from where the drag operation started\n * @type FabricObject\n * @private\n */\n private declare _dragSource?: FabricObject;\n\n /**\n * Holds a reference to an object on the canvas that is the current drop target\n * May differ from {@link _draggedoverTarget}\n * @todo inspect whether {@link _draggedoverTarget} and {@link _dropTarget} should be merged somehow\n * @type FabricObject\n * @private\n */\n private declare _dropTarget: FabricObject | undefined;\n\n /**\n * a boolean that keeps track of the click state during a cycle of mouse down/up.\n * If a mouse move occurs it becomes false.\n * Is true by default, turns false on mouse move.\n * Used to determine if a mouseUp is a click\n */\n private _isClick: boolean;\n\n textEditingManager = new TextEditingManager(this);\n\n constructor(el?: string | HTMLCanvasElement, options: TCanvasOptions = {}) {\n super(el, options);\n // bind event handlers\n (\n [\n '_onMouseDown',\n '_onTouchStart',\n '_onMouseMove',\n '_onMouseUp',\n '_onTouchEnd',\n '_onResize',\n // '_onGesture',\n // '_onDrag',\n // '_onShake',\n // '_onLongPress',\n // '_onOrientationChange',\n '_onMouseWheel',\n '_onMouseOut',\n '_onMouseEnter',\n '_onContextMenu',\n '_onClick',\n '_onDragStart',\n '_onDragEnd',\n '_onDragProgress',\n '_onDragOver',\n '_onDragEnter',\n '_onDragLeave',\n '_onDrop',\n ] as (keyof this)[]\n ).forEach((eventHandler) => {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-function-type\n this[eventHandler] = (this[eventHandler] as Function).bind(this);\n });\n // register event handlers\n this.addOrRemove(addListener, 'add');\n }\n\n /**\n * return an event prefix pointer or mouse.\n * @private\n */\n private _getEventPrefix() {\n return this.enablePointerEvents ? 'pointer' : 'mouse';\n }\n\n addOrRemove(functor: any, _eventjsFunctor: 'add' | 'remove') {\n const canvasElement = this.upperCanvasEl,\n eventTypePrefix = this._getEventPrefix();\n functor(getWindowFromElement(canvasElement), 'resize', this._onResize);\n functor(canvasElement, eventTypePrefix + 'down', this._onMouseDown);\n functor(\n canvasElement,\n `${eventTypePrefix}move`,\n this._onMouseMove,\n addEventOptions,\n );\n functor(canvasElement, `${eventTypePrefix}out`, this._onMouseOut);\n functor(canvasElement, `${eventTypePrefix}enter`, this._onMouseEnter);\n functor(canvasElement, 'wheel', this._onMouseWheel, { passive: false });\n functor(canvasElement, 'contextmenu', this._onContextMenu);\n functor(canvasElement, 'click', this._onClick);\n // decide if to remove in fabric 7.0\n functor(canvasElement, 'dblclick', this._onClick);\n functor(canvasElement, 'dragstart', this._onDragStart);\n functor(canvasElement, 'dragend', this._onDragEnd);\n functor(canvasElement, 'dragover', this._onDragOver);\n functor(canvasElement, 'dragenter', this._onDragEnter);\n functor(canvasElement, 'dragleave', this._onDragLeave);\n functor(canvasElement, 'drop', this._onDrop);\n if (!this.enablePointerEvents) {\n functor(canvasElement, 'touchstart', this._onTouchStart, addEventOptions);\n }\n // if (typeof eventjs !== 'undefined' && eventjsFunctor in eventjs) {\n // eventjs[eventjsFunctor](canvasElement, 'gesture', this._onGesture);\n // eventjs[eventjsFunctor](canvasElement, 'drag', this._onDrag);\n // eventjs[eventjsFunctor](\n // canvasElement,\n // 'orientation',\n // this._onOrientationChange\n // );\n // eventjs[eventjsFunctor](canvasElement, 'shake', this._onShake);\n // eventjs[eventjsFunctor](canvasElement, 'longpress', this._onLongPress);\n // }\n }\n\n /**\n * Removes all event listeners, used when disposing the instance\n */\n removeListeners() {\n this.addOrRemove(removeListener, 'remove');\n // if you dispose on a mouseDown, before mouse up, you need to clean document to...\n const eventTypePrefix = this._getEventPrefix();\n const doc = getDocumentFromElement(this.upperCanvasEl);\n removeListener(\n doc,\n `${eventTypePrefix}up`,\n this._onMouseUp as EventListener,\n );\n removeListener(\n doc,\n 'touchend',\n this._onTouchEnd as EventListener,\n addEventOptions,\n );\n removeListener(\n doc,\n `${eventTypePrefix}move`,\n this._onMouseMove as EventListener,\n addEventOptions,\n );\n removeListener(\n doc,\n 'touchmove',\n this._onMouseMove as EventListener,\n addEventOptions,\n );\n clearTimeout(this._willAddMouseDown);\n }\n\n /**\n * @private\n * @param {Event} [e] Event object fired on wheel event\n */\n private _onMouseWheel(e: MouseEvent) {\n this._cacheTransformEventData(e);\n this._handleEvent(e, 'wheel');\n this._resetTransformEventData();\n }\n\n /**\n * @private\n * @param {Event} e Event object fired on mousedown\n */\n private _onMouseOut(e: TPointerEvent) {\n const target = this._hoveredTarget;\n const shared = {\n e,\n ...getEventPoints(this, e),\n };\n this.fire('mouse:out', { ...shared, target });\n this._hoveredTarget = undefined;\n target && target.fire('mouseout', { ...shared });\n this._hoveredTargets.forEach((nestedTarget) => {\n this.fire('mouse:out', { ...shared, target: nestedTarget });\n nestedTarget && nestedTarget.fire('mouseout', { ...shared });\n });\n this._hoveredTargets = [];\n }\n\n /**\n * @private\n * Used when the mouse cursor enter the canvas from outside\n * @param {Event} e Event object fired on mouseenter\n */\n private _onMouseEnter(e: TPointerEvent) {\n // This find target and consequent 'mouse:over' is used to\n // clear old instances on hovered target.\n // calling findTarget has the side effect of killing target.__corner.\n // as a short term fix we are not firing this if we are currently transforming.\n // as a long term fix we need to separate the action of finding a target with the\n // side effects we added to it.\n const { target } = this.findTarget(e);\n // we fire the event only when there is no target, if there is a target, the specific\n // target event will fire.\n if (!this._currentTransform && !target) {\n this.fire('mouse:over', {\n e,\n ...getEventPoints(this, e),\n });\n this._hoveredTarget = undefined;\n this._hoveredTargets = [];\n }\n }\n\n /**\n * supports native like text dragging\n * @private\n * @param {DragEvent} e\n */\n private _onDragStart(e: DragEvent) {\n this._isClick = false;\n const activeObject = this.getActiveObject();\n if (activeObject && activeObject.onDragStart(e)) {\n this._dragSource = activeObject;\n const options = { e, target: activeObject };\n this.fire('dragstart', options);\n activeObject.fire('dragstart', options);\n addListener(\n this.upperCanvasEl,\n 'drag',\n this._onDragProgress as EventListener,\n );\n return;\n }\n stopEvent(e);\n }\n\n /**\n * First we clear top context where the effects are being rendered.\n * Then we render the effects.\n * Doing so will render the correct effect for all cases including an overlap between `source` and `target`.\n * @private\n */\n private _renderDragEffects(\n e: DragEvent,\n source?: FabricObject,\n target?: FabricObject,\n ) {\n let dirty = false;\n // clear top context\n const dropTarget = this._dropTarget;\n if (dropTarget && dropTarget !== source && dropTarget !== target) {\n dropTarget.clearContextTop();\n dirty = true;\n }\n source?.clearContextTop();\n target !== source && target?.clearContextTop();\n // render effects\n const ctx = this.contextTop;\n ctx.save();\n ctx.transform(...this.viewportTransform);\n if (source) {\n ctx.save();\n source.transform(ctx);\n source.renderDragSourceEffect(e);\n ctx.restore();\n dirty = true;\n }\n if (target) {\n ctx.save();\n target.transform(ctx);\n target.renderDropTargetEffect(e);\n ctx.restore();\n dirty = true;\n }\n ctx.restore();\n dirty && (this.contextTopDirty = true);\n }\n\n /**\n * supports native like text dragging\n * https://developer.mozilla.org/en-US/docs/Web/API/HTML_Drag_and_Drop_API/Drag_operations#finishing_a_drag\n * @private\n * @param {DragEvent} e\n */\n private _onDragEnd(e: DragEvent) {\n const { currentSubTargets } = this.findTarget(e);\n const didDrop = !!e.dataTransfer && e.dataTransfer.dropEffect !== NONE,\n dropTarget = didDrop ? this._activeObject : undefined,\n options = {\n e,\n target: this._dragSource as FabricObject,\n subTargets: currentSubTargets,\n dragSource: this._dragSource as FabricObject,\n didDrop,\n dropTarget: dropTarget as FabricObject,\n };\n removeListener(\n this.upperCanvasEl,\n 'drag',\n this._onDragProgress as EventListener,\n );\n this.fire('dragend', options);\n this._dragSource && this._dragSource.fire('dragend', options);\n delete this._dragSource;\n // we need to call mouse up synthetically because the browser won't\n this._onMouseUp(e);\n }\n\n /**\n * fire `drag` event on canvas and drag source\n * @private\n * @param {DragEvent} e\n */\n private _onDragProgress(e: DragEvent) {\n const options = {\n e,\n target: this._dragSource,\n dragSource: this._dragSource,\n dropTarget: this._draggedoverTarget as FabricObject,\n };\n this.fire('drag', options);\n this._dragSource && this._dragSource.fire('drag', options);\n }\n\n /**\n * prevent default to allow drop event to be fired\n * https://developer.mozilla.org/en-US/docs/Web/API/HTML_Drag_and_Drop_API/Drag_operations#specifying_drop_targets\n * @private\n * @param {DragEvent} [e] Event object fired on Event.js shake\n */\n private _onDragOver(e: DragEvent) {\n const eventType = 'dragover';\n const { currentContainer: target, currentSubTargets } = this.findTarget(e);\n const dragSource = this._dragSource as FabricObject;\n const options = {\n e,\n target,\n subTargets: currentSubTargets,\n dragSource,\n canDrop: false,\n dropTarget: undefined,\n };\n let dropTarget;\n // fire on canvas\n this.fire(eventType, options);\n // make sure we fire dragenter events before dragover\n // if dragleave is needed, object will not fire dragover so we don't need to trouble ourselves with it\n this._fireEnterLeaveEvents(e, target, options);\n if (target) {\n if (target.canDrop(e)) {\n dropTarget = target;\n }\n target.fire(eventType, options);\n }\n // propagate the event to subtargets\n for (let i = 0; i < currentSubTargets.length; i++) {\n const subTarget = currentSubTargets[i];\n // accept event only if previous targets didn't (the accepting target calls `preventDefault` to inform that the event is taken)\n // TODO: verify if those should loop in inverse order then?\n // what is the order of subtargets?\n if (subTarget.canDrop(e)) {\n dropTarget = subTarget;\n }\n subTarget.fire(eventType, options);\n }\n // render drag effects now that relations between source and target is clear\n this._renderDragEffects(e, dragSource, dropTarget);\n this._dropTarget = dropTarget;\n }\n\n /**\n * fire `dragleave` on `dragover` targets\n * @private\n * @param {Event} [e] Event object fired on Event.js shake\n */\n private _onDragEnter(e: DragEvent) {\n const { currentContainer, currentSubTargets } = this.findTarget(e);\n const options = {\n e,\n target: currentContainer,\n subTargets: currentSubTargets,\n dragSource: this._dragSource,\n };\n this.fire('dragenter', options);\n // fire dragenter on targets\n this._fireEnterLeaveEvents(e, currentContainer, options);\n }\n\n /**\n * fire `dragleave` on `dragover` targets\n * @private\n * @param {Event} [e] Event object fired on Event.js shake\n */\n private _onDragLeave(e: DragEvent) {\n const { currentSubTargets } = this.findTarget(e);\n const options = {\n e,\n target: this._draggedoverTarget,\n subTargets: currentSubTargets,\n dragSource: this._dragSource,\n };\n this.fire('dragleave', options);\n\n // fire dragleave on targets\n this._fireEnterLeaveEvents(e, undefined, options);\n this._renderDragEffects(e, this._dragSource);\n this._dropTarget = undefined;\n this._hoveredTargets = [];\n }\n\n /**\n * `drop:before` is a an event that allows you to schedule logic\n * before the `drop` event. Prefer `drop` event always, but if you need\n * to run some drop-disabling logic on an event, since there is no way\n * to handle event handlers ordering, use `drop:before`\n * @private\n * @param {Event} e\n */\n private _onDrop(e: DragEvent) {\n const { currentContainer, currentSubTargets } = this.findTarget(e);\n const options = this._basicEventHandler('drop:before', {\n e,\n target: currentContainer,\n subTargets: currentSubTargets,\n dragSource: this._dragSource,\n ...getEventPoints(this, e),\n });\n // will be set by the drop target\n options.didDrop = false;\n // will be set by the drop target, used in case options.target refuses the drop\n options.dropTarget = undefined;\n // fire `drop`\n this._basicEventHandler('drop', options);\n // inform canvas of the drop\n // we do this because canvas was unaware of what happened at the time the `drop` event was fired on it\n // use for side effects\n this.fire('drop:after', options);\n }\n\n /**\n * @private\n * @param {Event} e Event object fired on mousedown\n */\n private _onContextMenu(e: TPointerEvent): false {\n const { target, subTargets } = this.findTarget(e);\n const options = this._basicEventHandler('contextmenu:before', {\n e,\n target,\n subTargets,\n });\n // TODO: this line is silly because the dev can subscribe to the event and prevent it themselves\n this.stopContextMenu && stopEvent(e);\n this._basicEventHandler('contextmenu', options);\n return false;\n }\n\n /**\n * @private\n * @param {Event} e Event object fired on mousedown\n */\n private _onClick(e: TPointerEvent) {\n const clicks = e.detail;\n if (clicks > 3 || clicks < 2) return;\n this._cacheTransformEventData(e);\n clicks == 2 && e.type === 'dblclick' && this._onDblClick(e);\n clicks == 3 && this._handleEvent(e, 'tripleclick');\n this._resetTransformEventData();\n }\n\n /**\n * 双击选择锁定组的子节点\n * @param e\n */\n private _onDblClick(e: TPointerEvent) {\n if (this.dblClickLock(e)) {\n // 锁定后立即选中点击子对象\n this._resetTransformEventData();\n this.__onMouseDown(e);\n this.__onMouseUp(e);\n return;\n }\n this._handleEvent(e, 'dblclick');\n }\n\n /**\n * Return a the id of an event.\n * returns either the pointerId or the identifier or 0 for the mouse event\n * @private\n * @param {Event} evt Event object\n */\n getPointerId(evt: TouchEvent | PointerEvent): number {\n const changedTouches = (evt as TouchEvent).changedTouches;\n\n if (changedTouches) {\n return changedTouches[0] && changedTouches[0].identifier;\n }\n\n if (this.enablePointerEvents) {\n return (evt as PointerEvent).pointerId;\n }\n\n return -1;\n }\n\n /**\n * Determines if an event has the id of the event that is considered main\n * @private\n * @param {evt} event Event object\n */\n _isMainEvent(evt: TPointerEvent): boolean {\n if ((evt as PointerEvent).isPrimary === true) {\n return true;\n }\n if ((evt as PointerEvent).isPrimary === false) {\n return false;\n }\n if (evt.type === 'touchend' && (evt as TouchEvent).touches.length === 0) {\n return true;\n }\n if ((evt as TouchEvent).changedTouches) {\n return (\n (evt as TouchEvent).changedTouches[0].identifier === this.mainTouchId\n );\n }\n return true;\n }\n\n /**\n * @private\n * @param {Event} e Event object fired on mousedown\n */\n _onTouchStart(e: TouchEvent) {\n this._cacheTransformEventData(e);\n // we will prevent scrolling if allowTouchScrolling is not enabled and\n let shouldPreventScrolling = !this.allowTouchScrolling;\n const currentActiveObject = this._activeObject;\n if (this.mainTouchId === undefined) {\n this.mainTouchId = this.getPointerId(e);\n }\n this.__onMouseDown(e);\n const { target } = this.findTarget(e);\n // after executing fabric logic for mouse down let's see\n // if we didn't change target or if we are drawing\n // we want to prevent scrolling anyway\n if (\n this.isDrawingMode ||\n (currentActiveObject && target === currentActiveObject)\n ) {\n shouldPreventScrolling = true;\n }\n // prevent default, will block scrolling from start\n shouldPreventScrolling && e.preventDefault();\n const canvasElement = this.upperCanvasEl,\n eventTypePrefix = this._getEventPrefix();\n const doc = getDocumentFromElement(canvasElement);\n addListener(\n doc,\n 'touchend',\n this._onTouchEnd as EventListener,\n addEventOptions,\n );\n // if we scroll don't register the touch move event\n shouldPreventScrolling &&\n addListener(\n doc,\n 'touchmove',\n this._onMouseMove as EventListener,\n addEventOptions,\n );\n // Unbind mousedown to prevent double triggers from touch devices\n removeListener(\n canvasElement,\n `${eventTypePrefix}down`,\n this._onMouseDown as EventListener,\n );\n this._resetTransformEventData();\n }\n\n /**\n * @private\n * @param {Event} e Event object fired on mousedown\n */\n _onMouseDown(e: TPointerEvent) {\n this._cacheTransformEventData(e);\n this.__onMouseDown(e);\n const canvasElement = this.upperCanvasEl,\n eventTypePrefix = this._getEventPrefix();\n // switch from moving on the canvas element to moving on the document\n removeListener(\n canvasElement,\n `${eventTypePrefix}move`,\n this._onMouseMove as EventListener,\n addEventOptions,\n );\n const doc = getDocumentFromElement(canvasElement);\n addListener(doc, `${eventTypePrefix}up`, this._onMouseUp as EventListener);\n addListener(\n doc,\n `${eventTypePrefix}move`,\n this._onMouseMove as EventListener,\n addEventOptions,\n );\n this._resetTransformEventData();\n }\n\n /**\n * @private\n * @param {Event} e Event object fired on mousedown\n */\n _onTouchEnd(e: TouchEvent) {\n if (e.touches.length > 0) {\n // if there are still touches stop here\n return;\n }\n this._cacheTransformEventData(e);\n this.__onMouseUp(e);\n this._resetTransformEventData();\n delete this.mainTouchId;\n const eventTypePrefix = this._getEventPrefix();\n const doc = getDocumentFromElement(this.upperCanvasEl);\n removeListener(\n doc,\n 'touchend',\n this._onTouchEnd as EventListener,\n addEventOptions,\n );\n removeListener(\n doc,\n 'touchmove',\n this._onMouseMove as EventListener,\n addEventOptions,\n );\n if (this._willAddMouseDown) {\n clearTimeout(this._willAddMouseDown);\n }\n this._willAddMouseDown = setTimeout(() => {\n // Wait 400ms before rebinding mousedown to prevent double triggers\n // from touch devices\n addListener(\n this.upperCanvasEl,\n `${eventTypePrefix}down`,\n this._onMouseDown as EventListener,\n );\n this._willAddMouseDown = 0;\n }, 400) as unknown as number;\n }\n\n /**\n * @private\n * @param {Event} e Event object fired on mouseup\n */\n _onMouseUp(e: TPointerEvent) {\n this._cacheTransformEventData(e);\n this.__onMouseUp(e);\n const canvasElement = this.upperCanvasEl,\n eventTypePrefix = this._getEventPrefix();\n if (this._isMainEvent(e)) {\n const doc = getDocumentFromElement(this.upperCanvasEl);\n removeListener(\n doc,\n `${eventTypePrefix}up`,\n this._onMouseUp as EventListener,\n );\n removeListener(\n doc,\n `${eventTypePrefix}move`,\n this._onMouseMove as EventListener,\n addEventOptions,\n );\n addListener(\n canvasElement,\n `${eventTypePrefix}move`,\n this._onMouseMove as EventListener,\n addEventOptions,\n );\n }\n this._resetTransformEventData();\n }\n\n /**\n * @private\n * @param {Event} e Event object fired on mousemove\n */\n _onMouseMove(e: TPointerEvent) {\n this._cacheTransformEventData(e);\n\n const activeObject = this.getActiveObject();\n !this.allowTouchScrolling &&\n (!activeObject ||\n // a drag event sequence is started by the active object flagging itself on mousedown / mousedown:before\n // we must not prevent the event's default behavior in order for the window to start dragging\n !activeObject.shouldStartDragging(e)) &&\n e.preventDefault &&\n e.preventDefault();\n this.__onMouseMove(e);\n this._resetTransformEventData();\n }\n\n /**\n * @private\n */\n _onResize() {\n this.calcOffset();\n this._resetTransformEventData();\n }\n\n /**\n * Decides whether the canvas should be redrawn in mouseup and mousedown events.\n * @private\n * @param {Object} target\n */\n _shouldRender(target: FabricObject | undefined) {\n const activeObject = this.getActiveObject();\n // if just one of them is available or if they are both but are different objects\n // this covers: switch of target, from target to no target, selection of target\n // multiSelection with key and mouse\n return (\n !!activeObject !== !!target ||\n (activeObject && target && activeObject !== target)\n );\n }\n\n /**\n * Method that defines the actions when mouse is released on canvas.\n * The method resets the currentTransform parameters, store the image corner\n * position in the image object and render the canvas on top.\n * @private\n * @param {Event} e Event object fired on mouseup\n */\n __onMouseUp(e: TPointerEvent) {\n this._handleEvent(e, 'up:before');\n\n const transform = this._currentTransform;\n const isClick = this._isClick;\n const { target } = this.findTarget(e);\n\n // if right/middle click just fire events and return\n // target undefined will make the _handleEvent search the target\n const { button } = e as MouseEvent;\n if (button) {\n ((this.fireMiddleClick && button === 1) ||\n (this.fireRightClick && button === 2)) &&\n this._handleEvent(e, 'up');\n return;\n }\n\n if (this.isDrawingMode && this._isCurrentlyDrawing) {\n this._onMouseUpInDrawingMode(e);\n return;\n }\n\n if (!this._isMainEvent(e)) {\n return;\n }\n let shouldRender = false;\n if (transform) {\n this._finalizeCurrentTransform(e);\n shouldRender = transform.actionPerformed;\n }\n if (!isClick) {\n const targetWasActive = target === this._activeObject;\n this.handleSelection(e);\n if (!shouldRender) {\n shouldRender =\n this._shouldRender(target) ||\n (!targetWasActive && target === this._activeObject);\n }\n }\n let pointer, corner;\n if (target) {\n const found = target.findControl(\n this.getViewportPoint(e),\n isTouchEvent(e),\n );\n const { key, control } = found || {};\n corner = key;\n if (\n target.selectable &&\n target !== this._activeObject &&\n target.activeOn === 'up'\n ) {\n this.setActiveObject(target, e);\n shouldRender = true;\n } else if (control) {\n const mouseUpHandler = control.getMouseUpHandler(e, target, control);\n if (mouseUpHandler) {\n pointer = this.getScenePoint(e);\n mouseUpHandler.call(control, e, transform!, pointer.x, pointer.y);\n }\n }\n target.isMoving = false;\n }\n // if we are ending up a transform on a different control or a new object\n // fire the original mouse up from the corner that started the transform\n if (\n transform &&\n (transform.target !== target || transform.corner !== corner)\n ) {\n const originalControl =\n transform.target && transform.target.controls[transform.corner],\n originalMouseUpHandler =\n originalControl &&\n originalControl.getMouseUpHandler(\n e,\n transform.target,\n originalControl,\n );\n pointer = pointer || this.getScenePoint(e);\n originalMouseUpHandler &&\n originalMouseUpHandler.call(\n originalControl,\n e,\n transform,\n pointer.x,\n pointer.y,\n );\n }\n this._setCursorFromEvent(e, target);\n this._handleEvent(e, 'up');\n this._groupSelector = null;\n this._currentTransform = null;\n // reset the target information about which corner is selected\n target && (target.__corner = undefined);\n if (shouldRender) {\n this.requestRenderAll();\n } else if (!isClick && !(this._activeObject as IText)?.isEditing) {\n this.renderTop();\n }\n }\n\n _basicEventHandler(\n eventType: T,\n options: (CanvasEvents & ObjectEvents)[T],\n ) {\n const { target, subTargets = [] } = options as {\n target?: FabricObject;\n subTargets: FabricObject[];\n };\n this.fire(eventType, options);\n target && target.fire(eventType, options);\n for (let i = 0; i < subTargets.length; i++) {\n subTargets[i] !== target && subTargets[i].fire(eventType, options);\n }\n return options;\n }\n\n /**\n * @private\n * Handle event firing for target and subtargets\n * @param {TPointerEvent} e event from mouse\n * @param {TPointerEventNames} eventType\n */\n _handleEvent(\n e: TPointerEvent,\n eventType: T,\n extraData?: TEventsExtraData[T],\n ) {\n const { target, subTargets } = this.findTarget(e),\n options: CanvasEvents[`mouse:${T}`] = {\n e,\n target,\n subTargets,\n ...getEventPoints(this, e),\n transform: this._currentTransform,\n ...(eventType === 'down:before' || eventType === 'down'\n ? extraData\n : {}),\n } as CanvasEvents[`mouse:${T}`];\n if (eventType === 'up:before' || eventType === 'up') {\n (options as CanvasEvents[`mouse:up`]).isClick = this._isClick;\n }\n this.fire(`mouse:${eventType}`, options);\n // this may be a little be more complicated of what we want to handle\n target && target.fire(`mouse${eventType}`, options);\n for (let i = 0; i < subTargets.length; i++) {\n subTargets[i] !== target &&\n subTargets[i].fire(`mouse${eventType}`, options);\n }\n }\n\n /**\n * @private\n * @param {Event} e Event object fired on mousedown\n */\n _onMouseDownInDrawingMode(e: TPointerEvent) {\n this._isCurrentlyDrawing = true;\n if (this.getActiveObject()) {\n this.discardActiveObject(e);\n this.requestRenderAll();\n }\n // TODO: this is a scene point so it should be renamed\n const pointer = this.getScenePoint(e);\n this.freeDrawingBrush &&\n this.freeDrawingBrush.onMouseDown(pointer, { e, pointer });\n this._handleEvent(e, 'down', { alreadySelected: false });\n }\n\n /**\n * @private\n * @param {Event} e Event object fired on mousemove\n */\n _onMouseMoveInDrawingMode(e: TPointerEvent) {\n if (this._isCurrentlyDrawing) {\n const pointer = this.getScenePoint(e);\n this.freeDrawingBrush &&\n this.freeDrawingBrush.onMouseMove(pointer, {\n e,\n // this is an absolute pointer, the naming is wrong\n pointer,\n });\n }\n this.setCursor(this.freeDrawingCursor);\n this._handleEvent(e, 'move');\n }\n\n /**\n * @private\n * @param {Event} e Event object fired on mouseup\n */\n _onMouseUpInDrawingMode(e: TPointerEvent) {\n const pointer = this.getScenePoint(e);\n if (this.freeDrawingBrush) {\n this._isCurrentlyDrawing = !!this.freeDrawingBrush.onMouseUp({\n e: e,\n // this is an absolute pointer, the naming is wrong\n pointer,\n });\n } else {\n this._isCurrentlyDrawing = false;\n }\n this._handleEvent(e, 'up');\n }\n\n /**\n * Method that defines the actions when mouse is clicked on canvas.\n * The method inits the currentTransform parameters and renders all the\n * canvas so the current image can be placed on the top canvas and the rest\n * in on the container one.\n * @private\n * @param {Event} e Event object fired on mousedown\n */\n __onMouseDown(e: TPointerEvent) {\n this._isClick = true;\n this._handleEvent(e, 'down:before');\n\n let { target } = this.findTarget(e);\n let alreadySelected = !!target && target === this._activeObject;\n // if right/middle click just fire events\n const { button } = e as MouseEvent;\n if (button) {\n ((this.fireMiddleClick && button === 1) ||\n (this.fireRightClick && button === 2)) &&\n this._handleEvent(e, 'down', {\n alreadySelected,\n });\n return;\n }\n\n if (this.isDrawingMode) {\n this._onMouseDownInDrawingMode(e);\n return;\n }\n\n if (!this._isMainEvent(e)) {\n return;\n }\n\n // ignore if some object is being transformed at this moment\n if (this._currentTransform) {\n return;\n }\n\n let shouldRender = this._shouldRender(target);\n let grouped = false;\n if (this.handleMultiSelection(e, target)) {\n // active object might have changed while grouping\n target = this._activeObject;\n grouped = true;\n shouldRender = true;\n } else if (this._shouldClearSelection(e, target)) {\n this.discardActiveObject(e);\n\n // 锁定对象时且没有指定选中时,如果点击组外空白或对象,取消锁定\n if (this.isolatedObject && !this._searchTargets) {\n this.setSearchTargets([this.isolatedObject]);\n const { target } = this.findTarget(e);\n // 没有选中任何对象,或者选中的是锁定对象以外的对象\n if (target !== this.isolatedObject) {\n this.isolatedObject = null;\n }\n this.setSearchTargets(null);\n // 在此执行__onMouseDown选中其他对象\n this._resetTransformEventData();\n this.__onMouseDown(e);\n return;\n }\n }\n // we start a group selector rectangle if\n // selection is enabled\n // and there is no target, or the following 3 conditions are satisfied:\n // target is not selectable ( otherwise we selected it )\n // target is not editing\n // target is not already selected ( otherwise we drag )\n if (\n this.selection &&\n (!target ||\n (!target.selectable &&\n !(target as IText).isEditing &&\n target !== this._activeObject))\n ) {\n const p = this.getScenePoint(e);\n this._groupSelector = {\n x: p.x,\n y: p.y,\n deltaY: 0,\n deltaX: 0,\n };\n }\n\n // check again because things could have changed\n alreadySelected = !!target && target === this._activeObject;\n if (target) {\n if (target.selectable && target.activeOn === 'down') {\n this.setActiveObject(target, e);\n }\n const handle = target.findControl(\n this.getViewportPoint(e),\n isTouchEvent(e),\n );\n if (target === this._activeObject && (handle || !grouped)) {\n this._setupCurrentTransform(e, target, alreadySelected);\n const control = handle ? handle.control : undefined,\n pointer = this.getScenePoint(e),\n mouseDownHandler =\n control && control.getMouseDownHandler(e, target, control);\n mouseDownHandler &&\n mouseDownHandler.call(\n control,\n e,\n this._currentTransform!,\n pointer.x,\n pointer.y,\n );\n }\n }\n // we clear `_objectsToRender` in case of a change in order to repopulate it at rendering\n // run before firing the `down` event to give the dev a chance to populate it themselves\n shouldRender && (this._objectsToRender = undefined);\n this._handleEvent(e, 'down', { alreadySelected: alreadySelected });\n // we must renderAll so that we update the visuals\n shouldRender && this.requestRenderAll();\n }\n\n /**\n * reset cache form common information needed during event processing\n * @private\n */\n _resetTransformEventData() {\n this._targetInfo = this._viewportPoint = this._scenePoint = undefined;\n }\n\n /**\n * Cache common information needed during event processing\n * @private\n * @param {Event} e Event object fired on event\n */\n _cacheTransformEventData(e: TPointerEvent) {\n // reset in order to avoid stale caching\n this._resetTransformEventData();\n this._viewportPoint = this.getViewportPoint(e);\n this._scenePoint = sendPointToPlane(\n this._viewportPoint,\n undefined,\n this.viewportTransform,\n );\n this._targetInfo = this.findTarget(e);\n // TODO: investigate better if this can be made less implicit in the code\n if (this._currentTransform) {\n this._targetInfo.target = this._currentTransform.target;\n }\n }\n\n /**\n * Method that defines the actions when mouse is hovering the canvas.\n * The currentTransform parameter will define whether the user is rotating/scaling/translating\n * an image or neither of them (only hovering). A group selection is also possible and would cancel\n * all any other type of action.\n * In case of an image transformation only the top canvas will be rendered.\n * @private\n * @param {Event} e Event object fired on mousemove\n */\n __onMouseMove(e: TPointerEvent) {\n this._isClick = false;\n this._handleEvent(e, 'move:before');\n\n if (this.isDrawingMode) {\n this._onMouseMoveInDrawingMode(e);\n return;\n }\n\n if (!this._isMainEvent(e)) {\n return;\n }\n\n const groupSelector = this._groupSelector;\n\n // We initially clicked in an empty area, so we draw a box for multiple selection\n if (groupSelector) {\n const pointer = this.getScenePoint(e);\n\n groupSelector.deltaX = pointer.x - groupSelector.x;\n groupSelector.deltaY = pointer.y - groupSelector.y;\n\n this.renderTop();\n } else if (!this._currentTransform) {\n const { target } = this.findTarget(e);\n this._setCursorFromEvent(e, target);\n this._fireOverOutEvents(e, target);\n } else {\n this._transformObject(e);\n }\n this.textEditingManager.onMouseMove(e);\n this._handleEvent(e, 'move');\n }\n\n /**\n * Manage the mouseout, mouseover events for the fabric object on the canvas\n * @param {Fabric.Object} target the target where the target from the mousemove event\n * @param {Event} e Event object fired on mousemove\n * @private\n */\n _fireOverOutEvents(e: TPointerEvent, target?: FabricObject) {\n const { _hoveredTarget, _hoveredTargets } = this,\n { subTargets } = this.findTarget(e),\n length = Math.max(_hoveredTargets.length, subTargets.length);\n\n this.fireSyntheticInOutEvents('mouse', {\n e,\n target,\n oldTarget: _hoveredTarget,\n fireCanvas: true,\n });\n for (let i = 0; i < length; i++) {\n if (\n subTargets[i] === target ||\n (_hoveredTargets[i] && _hoveredTargets[i] === _hoveredTarget)\n ) {\n continue;\n }\n this.fireSyntheticInOutEvents('mouse', {\n e,\n target: subTargets[i],\n oldTarget: _hoveredTargets[i],\n });\n }\n this._hoveredTarget = target;\n this._hoveredTargets = subTargets;\n }\n\n /**\n * Manage the dragEnter, dragLeave events for the fabric objects on the canvas\n * @param {Fabric.Object} target the target where the target from the onDrag event\n * @param {Object} data Event object fired on dragover\n * @private\n */\n _fireEnterLeaveEvents(\n e: TPointerEvent,\n target: FabricObject | undefined,\n data: DragEventData,\n ) {\n const draggedoverTarget = this._draggedoverTarget,\n _hoveredTargets = this._hoveredTargets,\n { subTargets } = this.findTarget(e),\n length = Math.max(_hoveredTargets.length, subTargets.length);\n\n this.fireSyntheticInOutEvents('drag', {\n ...data,\n target,\n oldTarget: draggedoverTarget,\n fireCanvas: true,\n });\n for (let i = 0; i < length; i++) {\n this.fireSyntheticInOutEvents('drag', {\n ...data,\n target: subTargets[i],\n oldTarget: _hoveredTargets[i],\n });\n }\n this._draggedoverTarget = target;\n }\n\n /**\n * Manage the synthetic in/out events for the fabric objects on the canvas\n * @param {Fabric.Object} target the target where the target from the supported events\n * @param {Object} data Event object fired\n * @param {Object} config configuration for the function to work\n * @param {String} config.targetName property on the canvas where the old target is stored\n * @param {String} [config.canvasEvtOut] name of the event to fire at canvas level for out\n * @param {String} config.evtOut name of the event to fire for out\n * @param {String} [config.canvasEvtIn] name of the event to fire at canvas level for in\n * @param {String} config.evtIn name of the event to fire for in\n * @private\n */\n fireSyntheticInOutEvents(\n type: T,\n {\n target,\n oldTarget,\n fireCanvas,\n e,\n ...data\n }: TSyntheticEventContext[T] & {\n target?: FabricObject;\n oldTarget?: FabricObject;\n fireCanvas?: boolean;\n },\n ) {\n const { targetIn, targetOut, canvasIn, canvasOut } =\n syntheticEventConfig[type];\n const targetChanged = oldTarget !== target;\n\n if (oldTarget && targetChanged) {\n const outOpt: CanvasEvents[typeof canvasOut] = {\n ...data,\n e,\n target: oldTarget,\n nextTarget: target,\n ...getEventPoints(this, e),\n };\n fireCanvas && this.fire(canvasOut, outOpt);\n oldTarget.fire(targetOut, outOpt);\n }\n if (target && targetChanged) {\n const inOpt: CanvasEvents[typeof canvasIn] = {\n ...data,\n e,\n target,\n previousTarget: oldTarget,\n ...getEventPoints(this, e),\n };\n fireCanvas && this.fire(canvasIn, inOpt);\n target.fire(targetIn, inOpt);\n }\n }\n\n /**\n * @private\n * @param {Event} e Event fired on mousemove\n */\n _transformObject(e: TPointerEvent) {\n const scenePoint = this.getScenePoint(e),\n transform = this._currentTransform!,\n target = transform.target,\n // transform pointer to target's containing coordinate plane\n // both pointer and object should agree on every point\n localPointer = target.group\n ? sendPointToPlane(\n scenePoint,\n undefined,\n target.group.calcTransformMatrix(),\n )\n : scenePoint;\n transform.shiftKey = e.shiftKey;\n transform.altKey = !!this.centeredKey && e[this.centeredKey];\n\n this._performTransformAction(e, transform, localPointer);\n transform.actionPerformed && this.requestRenderAll();\n }\n\n /**\n * @private\n */\n _performTransformAction(\n e: TPointerEvent,\n transform: Transform,\n pointer: Point,\n ) {\n const { action, actionHandler, target } = transform;\n\n const actionPerformed =\n !!actionHandler && actionHandler(e, transform, pointer.x, pointer.y);\n actionPerformed && target.setCoords();\n\n // this object could be created from the function in the control handlers\n if (action === 'drag' && actionPerformed) {\n transform.target.isMoving = true;\n this.setCursor(transform.target.moveCursor || this.moveCursor);\n }\n transform.actionPerformed = transform.actionPerformed || actionPerformed;\n }\n\n /**\n * Sets the cursor depending on where the canvas is being hovered.\n * Note: very buggy in Opera\n * @param {Event} e Event object\n * @param {Object} target Object that the mouse is hovering, if so.\n */\n _setCursorFromEvent(e: TPointerEvent, target?: FabricObject) {\n if (!target) {\n this.setCursor(this.defaultCursor);\n return;\n }\n let hoverCursor = target.hoverCursor || this.hoverCursor;\n const activeSelection = isActiveSelection(this._activeObject)\n ? this._activeObject\n : null,\n // only show proper corner when group selection is not active\n corner =\n (!activeSelection || target.group !== activeSelection) &&\n // here we call findTargetCorner always with undefined for the touch parameter.\n // we assume that if you are using a cursor you do not need to interact with\n // the bigger touch area.\n target.findControl(this.getViewportPoint(e));\n\n if (!corner) {\n if ((target as Group).subTargetCheck) {\n // hoverCursor should come from top-most subTarget,\n // so we walk the array backwards\n const { subTargets } = this.findTarget(e);\n subTargets\n .concat()\n .reverse()\n .forEach((_target) => {\n hoverCursor = _target.hoverCursor || hoverCursor;\n });\n }\n this.setCursor(hoverCursor);\n } else {\n const { control, coord } = corner;\n this.setCursor(control.cursorStyleHandler(e, control, target, coord));\n }\n }\n\n /**\n * ## Handles multiple selection\n * - toggles `target` selection (selects/deselects `target` if it isn't/is selected respectively)\n * - sets the active object in case it is not set or in case there is a single active object left under active selection.\n * ---\n * - If the active object is the active selection we add/remove `target` from it\n * - If not, add the active object and `target` to the active selection and make it the active object.\n * @TODO rewrite this after find target is refactored\n * @private\n * @param {TPointerEvent} e Event object\n * @param {FabricObject} target target of event to select/deselect\n * @returns true if grouping occurred\n */\n protected handleMultiSelection(e: TPointerEvent, target?: FabricObject) {\n const activeObject = this._activeObject;\n const isAS = isActiveSelection(activeObject);\n if (\n // check if an active object exists on canvas and if the user is pressing the `selectionKey` while canvas supports multi selection.\n !!activeObject &&\n this._isSelectionKeyPressed(e) &&\n this.selection &&\n // on top of that the user also has to hit a target that is selectable.\n !!target &&\n target.selectable &&\n // group target and active object only if they are different objects\n // else we try to find a subtarget of `ActiveSelection`\n (activeObject !== target || isAS) &&\n // make sure `activeObject` and `target` aren't ancestors of each other in case `activeObject` is not `ActiveSelection`\n // if it is then we want to remove `target` from it\n (isAS ||\n (!target.isDescendantOf(activeObject) &&\n !activeObject.isDescendantOf(target))) &&\n // target accepts selection\n !target.onSelect({ e }) &&\n // make sure we are not on top of a control\n !activeObject.getActiveControl()\n ) {\n if (isAS) {\n const prevActiveObjects = activeObject.getObjects();\n let subTargets: FabricObject[] = [];\n // const { subTargets: testSubTargets } = this.findTarget(e);\n if (target === activeObject) {\n const pointer = this.getScenePoint(e);\n let targetInfo = this.searchPossibleTargets(\n prevActiveObjects,\n pointer,\n );\n // console.log(testSubTargets.includes(targetInfo.target));\n if (targetInfo.target) {\n target = targetInfo.target;\n subTargets = targetInfo.subTargets;\n } else {\n targetInfo = this.searchPossibleTargets(this._objects, pointer);\n target = targetInfo.target;\n subTargets = targetInfo.subTargets;\n }\n // if nothing is found bail out\n if (!target || !target.selectable) {\n return false;\n }\n }\n if (target.group === activeObject) {\n // `target` is part of active selection => remove it\n activeObject.remove(target);\n this._hoveredTarget = target;\n this._hoveredTargets = subTargets;\n // if after removing an object we are left with one only...\n if (activeObject.size() === 1) {\n // activate last remaining object\n // deselecting the active selection will remove the remaining object from it\n this._setActiveObject(activeObject.item(0), e);\n }\n } else {\n // `target` isn't part of active selection => add it\n activeObject.multiSelectAdd(target);\n this._hoveredTarget = activeObject;\n this._hoveredTargets = subTargets;\n }\n this._fireSelectionEvents(prevActiveObjects, e);\n } else {\n (activeObject as IText).isEditing &&\n (activeObject as IText).exitEditing();\n // add the active object and the target to the active selection and set it as the active object\n const klass =\n classRegistry.getClass('ActiveSelection');\n const newActiveSelection = new klass([], {\n /**\n * it is crucial to pass the canvas ref before calling {@link ActiveSelection#multiSelectAdd}\n * since it uses {@link FabricObject#isInFrontOf} which relies on the canvas ref\n */\n canvas: this,\n });\n newActiveSelection.multiSelectAdd(activeObject, target);\n this._hoveredTarget = newActiveSelection;\n // ISSUE 4115: should we consider subTargets here?\n // this._hoveredTargets = [];\n // this._hoveredTargets = this.targets.concat();\n this._setActiveObject(newActiveSelection, e);\n this._fireSelectionEvents([activeObject], e);\n }\n return true;\n }\n return false;\n }\n\n /**\n * ## Handles selection\n * - selects objects that are contained in (and possibly intersecting) the selection bounding box\n * - sets the active object\n * ---\n * runs on mouse up after a mouse move\n */\n protected handleSelection(e: TPointerEvent) {\n if (!this.selection || !this._groupSelector) {\n return false;\n }\n const { x, y, deltaX, deltaY } = this._groupSelector,\n point1 = new Point(x, y),\n point2 = point1.add(new Point(deltaX, deltaY)),\n tl = point1.min(point2),\n br = point1.max(point2),\n size = br.subtract(tl);\n\n const collectedObjects = this.collectObjects(\n {\n left: tl.x,\n top: tl.y,\n width: size.x,\n height: size.y,\n },\n { includeIntersecting: !this.selectionFullyContained },\n ) as FabricObject[];\n\n const objects =\n // though this method runs only after mouse move the pointer could do a mouse up on the same position as mouse down\n // should it be handled as is?\n point1.eq(point2)\n ? collectedObjects[0]\n ? [collectedObjects[0]]\n : []\n : collectedObjects.length > 1\n ? collectedObjects\n .filter((object) => !object.onSelect({ e }))\n .reverse()\n : // `setActiveObject` will call `onSelect(collectedObjects[0])` in this case\n collectedObjects;\n\n // set active object\n if (objects.length === 1) {\n // set as active object\n this.setActiveObject(objects[0], e);\n } else if (objects.length > 1) {\n // add to active selection and make it the active object\n const klass =\n classRegistry.getClass('ActiveSelection');\n this.setActiveObject(new klass(objects, { canvas: this }), e);\n }\n\n // cleanup\n this._groupSelector = null;\n return true;\n }\n\n /**\n * @override clear {@link textEditingManager}\n */\n clear() {\n this.textEditingManager.clear();\n super.clear();\n }\n\n /**\n * @override clear {@link textEditingManager}\n */\n destroy() {\n this.removeListeners();\n this.textEditingManager.dispose();\n super.destroy();\n }\n}\n","export const linearDefaultCoords = {\n x1: 0,\n y1: 0,\n x2: 0,\n y2: 0,\n};\n\nexport const radialDefaultCoords = {\n ...linearDefaultCoords,\n r1: 0,\n r2: 0,\n};\n","/**\n *\n * @param value value to check if NaN\n * @param [valueIfNaN]\n * @returns `fallback` is `value is NaN\n */\nexport const ifNaN = (value: number, valueIfNaN?: number) => {\n return isNaN(value) && typeof valueIfNaN === 'number' ? valueIfNaN : value;\n};\n","import { ifNaN } from '../util/internals/ifNaN';\nimport { capValue } from '../util/misc/capValue';\n\nconst RE_PERCENT = /^(\\d+\\.\\d+)%|(\\d+)%$/;\n\nexport function isPercent(value: string | null) {\n return value && RE_PERCENT.test(value);\n}\n\n/**\n *\n * @param value\n * @param valueIfNaN\n * @returns ∈ [0, 1]\n */\nexport function parsePercent(\n value: string | number | null | undefined,\n valueIfNaN?: number,\n) {\n const parsed =\n typeof value === 'number'\n ? value\n : typeof value === 'string'\n ? parseFloat(value) / (isPercent(value) ? 100 : 1)\n : NaN;\n return capValue(0, ifNaN(parsed, valueIfNaN), 1);\n}\n","import { Color } from '../../color/Color';\nimport { parsePercent } from '../../parser/percent';\nimport { ifNaN } from '../../util/internals/ifNaN';\nimport type { ColorStop } from '../typedefs';\n\nconst RE_KEY_VALUE_PAIRS = /\\s*;\\s*/;\nconst RE_KEY_VALUE = /\\s*:\\s*/;\n\nfunction parseColorStop(el: SVGStopElement, opacityMultiplier: number) {\n let colorValue, opacityValue;\n const style = el.getAttribute('style');\n if (style) {\n const keyValuePairs = style.split(RE_KEY_VALUE_PAIRS);\n\n if (keyValuePairs[keyValuePairs.length - 1] === '') {\n keyValuePairs.pop();\n }\n\n for (let i = keyValuePairs.length; i--; ) {\n const [key, value] = keyValuePairs[i]\n .split(RE_KEY_VALUE)\n .map((s) => s.trim());\n if (key === 'stop-color') {\n colorValue = value;\n } else if (key === 'stop-opacity') {\n opacityValue = value;\n }\n }\n }\n\n colorValue = colorValue || el.getAttribute('stop-color') || 'rgb(0,0,0)';\n opacityValue = ifNaN(\n parseFloat(opacityValue || el.getAttribute('stop-opacity') || ''),\n 1,\n );\n\n const color = new Color(colorValue);\n\n color.setAlpha(color.getAlpha() * opacityValue * opacityMultiplier);\n\n return {\n offset: parsePercent(el.getAttribute('offset'), 0),\n color: color.toRgba(),\n };\n}\n\nexport function parseColorStops(\n el: SVGGradientElement,\n opacityAttr: string | null,\n) {\n const colorStops: ColorStop[] = [],\n colorStopEls = el.getElementsByTagName('stop'),\n multiplier = parsePercent(opacityAttr, 1);\n for (let i = colorStopEls.length; i--; ) {\n colorStops.push(parseColorStop(colorStopEls[i], multiplier));\n }\n return colorStops;\n}\n","import type { GradientType, GradientUnits } from '../typedefs';\n\nexport function parseType(el: SVGGradientElement): GradientType {\n return el.nodeName === 'linearGradient' || el.nodeName === 'LINEARGRADIENT'\n ? 'linear'\n : 'radial';\n}\n\nexport function parseGradientUnits(el: SVGGradientElement): GradientUnits {\n return el.getAttribute('gradientUnits') === 'userSpaceOnUse'\n ? 'pixels'\n : 'percentage';\n}\n","import { isPercent } from '../../parser/percent';\nimport type { TSize } from '../../typedefs';\nimport type { GradientCoords, GradientType, GradientUnits } from '../typedefs';\nimport { parseGradientUnits, parseType } from './misc';\n\nfunction convertPercentUnitsToValues<\n T extends GradientType,\n K extends keyof GradientCoords,\n>(\n valuesToConvert: Record,\n { width, height, gradientUnits }: TSize & { gradientUnits: GradientUnits },\n) {\n let finalValue;\n return (Object.keys(valuesToConvert) as K[]).reduce(\n (acc, prop) => {\n const propValue = valuesToConvert[prop];\n if (propValue === 'Infinity') {\n finalValue = 1;\n } else if (propValue === '-Infinity') {\n finalValue = 0;\n } else {\n finalValue =\n typeof propValue === 'string' ? parseFloat(propValue) : propValue;\n if (typeof propValue === 'string' && isPercent(propValue)) {\n finalValue *= 0.01;\n if (gradientUnits === 'pixels') {\n // then we need to fix those percentages here in svg parsing\n if (prop === 'x1' || prop === 'x2' || prop === 'r2') {\n finalValue *= width;\n }\n if (prop === 'y1' || prop === 'y2') {\n finalValue *= height;\n }\n }\n }\n }\n acc[prop] = finalValue;\n return acc;\n },\n {} as Record,\n );\n}\n\nfunction getValue(el: SVGGradientElement, key: string) {\n return el.getAttribute(key);\n}\n\nexport function parseLinearCoords(el: SVGGradientElement) {\n return {\n x1: getValue(el, 'x1') || 0,\n y1: getValue(el, 'y1') || 0,\n x2: getValue(el, 'x2') || '100%',\n y2: getValue(el, 'y2') || 0,\n };\n}\n\nexport function parseRadialCoords(el: SVGGradientElement) {\n return {\n x1: getValue(el, 'fx') || getValue(el, 'cx') || '50%',\n y1: getValue(el, 'fy') || getValue(el, 'cy') || '50%',\n r1: 0,\n x2: getValue(el, 'cx') || '50%',\n y2: getValue(el, 'cy') || '50%',\n r2: getValue(el, 'r') || '50%',\n };\n}\n\nexport function parseCoords(el: SVGGradientElement, size: TSize) {\n return convertPercentUnitsToValues(\n parseType(el) === 'linear' ? parseLinearCoords(el) : parseRadialCoords(el),\n {\n ...size,\n gradientUnits: parseGradientUnits(el),\n },\n );\n}\n","import { iMatrix } from '../constants';\nimport { parseTransformAttribute } from '../parser/parseTransformAttribute';\nimport type { FabricObject } from '../shapes/Object/FabricObject';\nimport type { TMat2D } from '../typedefs';\nimport { uid } from '../util/internals/uid';\nimport { pick } from '../util/misc/pick';\nimport { matrixToSVG } from '../util/misc/svgExport';\nimport { linearDefaultCoords, radialDefaultCoords } from './constants';\nimport { parseColorStops } from './parser/parseColorStops';\nimport { parseCoords } from './parser/parseCoords';\nimport { parseType, parseGradientUnits } from './parser/misc';\nimport type {\n ColorStop,\n GradientCoords,\n GradientOptions,\n GradientType,\n GradientUnits,\n SVGOptions,\n SerializedGradientProps,\n} from './typedefs';\nimport { classRegistry } from '../ClassRegistry';\nimport { isPath } from '../util/typeAssertions';\n\n/**\n * Gradient class\n * @class Gradient\n * @see {@link http://fabric5.fabricjs.com/fabric-intro-part-2#gradients}\n */\nexport class Gradient<\n S,\n T extends GradientType = S extends GradientType ? S : 'linear',\n> {\n /**\n * Horizontal offset for aligning gradients coming from SVG when outside pathgroups\n * @type Number\n * @default 0\n */\n declare offsetX: number;\n\n /**\n * Vertical offset for aligning gradients coming from SVG when outside pathgroups\n * @type Number\n * @default 0\n */\n declare offsetY: number;\n\n /**\n * A transform matrix to apply to the gradient before painting.\n * Imported from svg gradients, is not applied with the current transform in the center.\n * Before this transform is applied, the origin point is at the top left corner of the object\n * plus the addition of offsetY and offsetX.\n * @type Number[]\n * @default null\n */\n declare gradientTransform?: TMat2D;\n\n /**\n * coordinates units for coords.\n * If `pixels`, the number of coords are in the same unit of width / height.\n * If set as `percentage` the coords are still a number, but 1 means 100% of width\n * for the X and 100% of the height for the y. It can be bigger than 1 and negative.\n * allowed values pixels or percentage.\n * @type GradientUnits\n * @default 'pixels'\n */\n declare gradientUnits: GradientUnits;\n\n /**\n * Gradient type linear or radial\n * @type GradientType\n * @default 'linear'\n */\n declare type: T;\n\n /**\n * Defines how the gradient is located in space and spread\n * @type GradientCoords\n */\n declare coords: GradientCoords;\n\n /**\n * Defines how many colors a gradient has and how they are located on the axis\n * defined by coords\n * @type GradientCoords\n */\n declare colorStops: ColorStop[];\n\n /**\n * If true, this object will not be exported during the serialization of a canvas\n * @type boolean\n */\n declare excludeFromExport?: boolean;\n\n /**\n * ID used for SVG export functionalities\n * @type number | string\n */\n declare readonly id: string | number;\n\n static type = 'Gradient';\n\n constructor(options: GradientOptions) {\n const {\n type = 'linear' as T,\n gradientUnits = 'pixels',\n coords = {},\n colorStops = [],\n offsetX = 0,\n offsetY = 0,\n gradientTransform,\n id,\n } = options || {};\n Object.assign(this, {\n type,\n gradientUnits,\n coords: {\n ...(type === 'radial' ? radialDefaultCoords : linearDefaultCoords),\n ...coords,\n },\n colorStops,\n offsetX,\n offsetY,\n gradientTransform,\n id: id ? `${id}_${uid()}` : uid(),\n });\n }\n\n /**\n * Adds another colorStop\n * @param {Record} colorStop Object with offset and color\n * @return {Gradient} thisArg\n */\n addColorStop(colorStops: Record) {\n for (const position in colorStops) {\n this.colorStops.push({\n offset: parseFloat(position),\n color: colorStops[position],\n });\n }\n return this;\n }\n\n /**\n * Returns object representation of a gradient\n * @param {string[]} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {object}\n */\n toObject(\n propertiesToInclude?: (keyof this | string)[],\n ): SerializedGradientProps {\n return {\n ...pick(this, propertiesToInclude as (keyof this)[]),\n type: this.type,\n coords: { ...this.coords },\n colorStops: this.colorStops.map((colorStop) => ({ ...colorStop })),\n offsetX: this.offsetX,\n offsetY: this.offsetY,\n gradientUnits: this.gradientUnits,\n gradientTransform: this.gradientTransform\n ? [...this.gradientTransform]\n : undefined,\n };\n }\n\n /* _TO_SVG_START_ */\n /**\n * Returns SVG representation of an gradient\n * @param {FabricObject} object Object to create a gradient for\n * @return {String} SVG representation of an gradient (linear/radial)\n */\n toSVG(\n object: FabricObject,\n {\n additionalTransform: preTransform,\n }: { additionalTransform?: string } = {},\n ) {\n const markup = [],\n transform = (\n this.gradientTransform\n ? this.gradientTransform.concat()\n : iMatrix.concat()\n ) as TMat2D,\n gradientUnits =\n this.gradientUnits === 'pixels'\n ? 'userSpaceOnUse'\n : 'objectBoundingBox';\n // colorStops must be sorted ascending, and guarded against deep mutations\n const colorStops = this.colorStops\n .map((colorStop) => ({ ...colorStop }))\n .sort((a, b) => {\n return a.offset - b.offset;\n });\n\n let offsetX = -this.offsetX,\n offsetY = -this.offsetY;\n if (gradientUnits === 'objectBoundingBox') {\n offsetX /= object.width;\n offsetY /= object.height;\n } else {\n offsetX += object.width / 2;\n offsetY += object.height / 2;\n }\n // todo what about polygon/polyline?\n if (isPath(object) && this.gradientUnits !== 'percentage') {\n offsetX -= object.pathOffset.x;\n offsetY -= object.pathOffset.y;\n }\n transform[4] -= offsetX;\n transform[5] -= offsetY;\n\n const commonAttributes = [\n `id=\"SVGID_${this.id}\"`,\n `gradientUnits=\"${gradientUnits}\"`,\n `gradientTransform=\"${\n preTransform ? preTransform + ' ' : ''\n }${matrixToSVG(transform)}\"`,\n '',\n ].join(' ');\n\n if (this.type === 'linear') {\n const { x1, y1, x2, y2 } = this.coords;\n markup.push(\n '\\n',\n );\n } else if (this.type === 'radial') {\n const { x1, y1, x2, y2, r1, r2 } = this\n .coords as GradientCoords<'radial'>;\n const needsSwap = r1 > r2;\n // svg radial gradient has just 1 radius. the biggest.\n markup.push(\n '\\n',\n );\n if (needsSwap) {\n // svg goes from internal to external radius. if radius are inverted, swap color stops.\n colorStops.reverse(); // mutates array\n colorStops.forEach((colorStop) => {\n colorStop.offset = 1 - colorStop.offset;\n });\n }\n const minRadius = Math.min(r1, r2);\n if (minRadius > 0) {\n // i have to shift all colorStops and add new one in 0.\n const maxRadius = Math.max(r1, r2),\n percentageShift = minRadius / maxRadius;\n colorStops.forEach((colorStop) => {\n colorStop.offset += percentageShift * (1 - colorStop.offset);\n });\n }\n }\n\n colorStops.forEach(({ color, offset }) => {\n markup.push(\n `\\n`,\n );\n });\n\n markup.push(\n this.type === 'linear' ? '' : '',\n '\\n',\n );\n\n return markup.join('');\n }\n /* _TO_SVG_END_ */\n\n /**\n * Returns an instance of CanvasGradient\n * @param {CanvasRenderingContext2D} ctx Context to render on\n * @return {CanvasGradient}\n */\n toLive(ctx: CanvasRenderingContext2D): CanvasGradient {\n const { x1, y1, x2, y2, r1, r2 } = this.coords as GradientCoords<'radial'>;\n const gradient =\n this.type === 'linear'\n ? ctx.createLinearGradient(x1, y1, x2, y2)\n : ctx.createRadialGradient(x1, y1, r1, x2, y2, r2);\n\n this.colorStops.forEach(({ color, offset }) => {\n gradient.addColorStop(offset, color);\n });\n\n return gradient;\n }\n\n static async fromObject(\n options: GradientOptions<'linear'>,\n ): Promise>;\n static async fromObject(\n options: GradientOptions<'radial'>,\n ): Promise>;\n static async fromObject(\n options: GradientOptions<'linear'> | GradientOptions<'radial'>,\n ) {\n const { colorStops, gradientTransform } = options;\n return new this({\n ...options,\n colorStops: colorStops\n ? colorStops.map((colorStop) => ({ ...colorStop }))\n : undefined,\n gradientTransform: gradientTransform ? [...gradientTransform] : undefined,\n });\n }\n\n /* _FROM_SVG_START_ */\n /**\n * Returns {@link Gradient} instance from an SVG element\n * @param {SVGGradientElement} el SVG gradient element\n * @param {FabricObject} instance\n * @param {String} opacity A fill-opacity or stroke-opacity attribute to multiply to each stop's opacity.\n * @param {SVGOptions} svgOptions an object containing the size of the SVG in order to parse correctly gradients\n * that uses gradientUnits as 'userSpaceOnUse' and percentages.\n * @return {Gradient} Gradient instance\n * @see http://www.w3.org/TR/SVG/pservers.html#LinearGradientElement\n * @see http://www.w3.org/TR/SVG/pservers.html#RadialGradientElement\n *\n * @example\n *\n * \n * \n * \n * \n *\n * OR\n *\n * \n * \n * \n * \n *\n * OR\n *\n * \n * \n * \n * \n * \n *\n * OR\n *\n * \n * \n * \n * \n * \n *\n */\n static fromElement(\n el: SVGGradientElement,\n instance: FabricObject,\n svgOptions: SVGOptions,\n ): Gradient {\n const gradientUnits = parseGradientUnits(el);\n const center = instance._findCenterFromElement();\n return new this({\n id: el.getAttribute('id') || undefined,\n type: parseType(el),\n coords: parseCoords(el, {\n width: svgOptions.viewBoxWidth || svgOptions.width,\n height: svgOptions.viewBoxHeight || svgOptions.height,\n }),\n colorStops: parseColorStops(el, svgOptions.opacity),\n gradientUnits,\n gradientTransform: parseTransformAttribute(\n el.getAttribute('gradientTransform') || '',\n ),\n ...(gradientUnits === 'pixels'\n ? {\n offsetX: instance.width / 2 - center.x,\n offsetY: instance.height / 2 - center.y,\n }\n : {\n offsetX: 0,\n offsetY: 0,\n }),\n });\n }\n /* _FROM_SVG_END_ */\n}\n\nclassRegistry.setClass(Gradient, 'gradient');\nclassRegistry.setClass(Gradient, 'linear');\nclassRegistry.setClass(Gradient, 'radial');\n","import { config } from '../config';\nimport type { Abortable, TCrossOrigin, TMat2D, TSize } from '../typedefs';\nimport { ifNaN } from '../util/internals/ifNaN';\nimport { uid } from '../util/internals/uid';\nimport { loadImage } from '../util/misc/objectEnlive';\nimport { pick } from '../util/misc/pick';\nimport { toFixed } from '../util/misc/toFixed';\nimport { classRegistry } from '../ClassRegistry';\nimport type {\n PatternRepeat,\n PatternOptions,\n SerializedPatternOptions,\n} from './types';\nimport { log } from '../util/internals/console';\n\n/**\n * @see {@link http://fabric5.fabricjs.com/patterns demo}\n * @see {@link http://fabric5.fabricjs.com/dynamic-patterns demo}\n */\nexport class Pattern {\n static type = 'Pattern';\n\n /**\n * Legacy identifier of the class. Prefer using this.constructor.type 'Pattern'\n * or utils like isPattern, or instance of to indentify a pattern in your code.\n * Will be removed in future versiones\n * @TODO add sustainable warning message\n * @type string\n * @deprecated\n */\n get type() {\n return 'pattern';\n }\n\n set type(value) {\n log('warn', 'Setting type has no effect', value);\n }\n\n /**\n * @type PatternRepeat\n * @defaults\n */\n repeat: PatternRepeat = 'repeat';\n\n /**\n * Pattern horizontal offset from object's left/top corner\n * @type Number\n */\n offsetX = 0;\n\n /**\n * Pattern vertical offset from object's left/top corner\n * @type Number\n */\n offsetY = 0;\n\n /**\n * @type TCrossOrigin\n */\n crossOrigin: TCrossOrigin = '';\n\n /**\n * transform matrix to change the pattern, imported from svgs.\n * @todo verify if using the identity matrix as default makes the rest of the code more easy\n * @type Array\n */\n declare patternTransform?: TMat2D;\n\n /**\n * The actual pixel source of the pattern\n */\n declare source: CanvasImageSource;\n\n /**\n * If true, this object will not be exported during the serialization of a canvas\n * @type boolean\n */\n declare excludeFromExport?: boolean;\n\n /**\n * ID used for SVG export functionalities\n * @type number\n */\n declare readonly id: number;\n\n /**\n * Constructor\n * @param {Object} [options] Options object\n * @param {option.source} [source] the pattern source, eventually empty or a drawable\n */\n constructor(options: PatternOptions) {\n this.id = uid();\n Object.assign(this, options);\n }\n\n /**\n * @returns true if {@link source} is an element\n */\n isImageSource(): this is { source: HTMLImageElement } {\n return (\n !!this.source && typeof (this.source as HTMLImageElement).src === 'string'\n );\n }\n\n /**\n * @returns true if {@link source} is a element\n */\n isCanvasSource(): this is { source: HTMLCanvasElement } {\n return !!this.source && !!(this.source as HTMLCanvasElement).toDataURL;\n }\n\n sourceToString(): string {\n return this.isImageSource()\n ? this.source.src\n : this.isCanvasSource()\n ? this.source.toDataURL()\n : '';\n }\n\n /**\n * Returns an instance of CanvasPattern\n * @param {CanvasRenderingContext2D} ctx Context to create pattern\n * @return {CanvasPattern}\n */\n toLive(ctx: CanvasRenderingContext2D): CanvasPattern | null {\n if (\n // if the image failed to load, return, and allow rest to continue loading\n !this.source ||\n // if an image\n (this.isImageSource() &&\n (!this.source.complete ||\n this.source.naturalWidth === 0 ||\n this.source.naturalHeight === 0))\n ) {\n return null;\n }\n\n return ctx.createPattern(this.source, this.repeat)!;\n }\n\n /**\n * Returns object representation of a pattern\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {object} Object representation of a pattern instance\n */\n toObject(propertiesToInclude: string[] = []): Record {\n const { repeat, crossOrigin } = this;\n return {\n ...pick(this, propertiesToInclude as (keyof this)[]),\n type: 'pattern',\n source: this.sourceToString(),\n repeat,\n crossOrigin,\n offsetX: toFixed(this.offsetX, config.NUM_FRACTION_DIGITS),\n offsetY: toFixed(this.offsetY, config.NUM_FRACTION_DIGITS),\n patternTransform: this.patternTransform\n ? [...this.patternTransform]\n : null,\n };\n }\n\n /* _TO_SVG_START_ */\n /**\n * Returns SVG representation of a pattern\n */\n toSVG({ width, height }: TSize): string {\n const { source: patternSource, repeat, id } = this,\n patternOffsetX = ifNaN(this.offsetX / width, 0),\n patternOffsetY = ifNaN(this.offsetY / height, 0),\n patternWidth =\n repeat === 'repeat-y' || repeat === 'no-repeat'\n ? 1 + Math.abs(patternOffsetX || 0)\n : ifNaN((patternSource as HTMLImageElement).width / width, 0),\n patternHeight =\n repeat === 'repeat-x' || repeat === 'no-repeat'\n ? 1 + Math.abs(patternOffsetY || 0)\n : ifNaN((patternSource as HTMLImageElement).height / height, 0);\n\n return [\n ``,\n ``,\n ``,\n '',\n ].join('\\n');\n }\n /* _TO_SVG_END_ */\n\n static async fromObject(\n {\n type,\n source,\n patternTransform,\n ...otherOptions\n }: SerializedPatternOptions,\n options?: Abortable,\n ): Promise {\n const img = await loadImage(source, {\n ...options,\n crossOrigin: otherOptions.crossOrigin,\n });\n return new this({\n ...otherOptions,\n patternTransform:\n patternTransform && (patternTransform.slice(0) as TMat2D),\n source: img,\n });\n }\n}\n\nclassRegistry.setClass(Pattern);\n// kept for compatibility reason\nclassRegistry.setClass(Pattern, 'pattern');\n","import { Color } from '../color/Color';\nimport type { Point } from '../Point';\nimport type { Shadow } from '../Shadow';\nimport type { Canvas } from '../canvas/Canvas';\nimport type { TBrushEventData } from './typedefs';\n\n/**\n * @see {@link http://fabric5.fabricjs.com/freedrawing|Freedrawing demo}\n */\nexport abstract class BaseBrush {\n /**\n * Color of a brush\n * @type String\n */\n color = 'rgb(0, 0, 0)';\n\n /**\n * Width of a brush, has to be a Number, no string literals\n * @type Number\n */\n width = 1;\n\n /**\n * Shadow object representing shadow of this shape.\n * Backwards incompatibility note: This property replaces \"shadowColor\" (String), \"shadowOffsetX\" (Number),\n * \"shadowOffsetY\" (Number) and \"shadowBlur\" (Number) since v1.2.12\n * @type Shadow\n */\n shadow: Shadow | null = null;\n\n /**\n * Line endings style of a brush (one of \"butt\", \"round\", \"square\")\n * @type String\n */\n strokeLineCap: CanvasLineCap = 'round';\n\n /**\n * Corner style of a brush (one of \"bevel\", \"round\", \"miter\")\n * @type String\n */\n strokeLineJoin: CanvasLineJoin = 'round';\n\n /**\n * Maximum miter length (used for strokeLineJoin = \"miter\") of a brush's\n * @type Number\n */\n strokeMiterLimit = 10;\n\n /**\n * Stroke Dash Array.\n * @type Array\n */\n strokeDashArray: number[] | null = null;\n\n /**\n * When `true`, the free drawing is limited to the whiteboard size. Default to false.\n * @type Boolean\n * @default false\n */\n\n limitedToCanvasSize = false;\n\n /**\n * @todo add type\n */\n declare canvas: Canvas;\n\n constructor(canvas: Canvas) {\n this.canvas = canvas;\n }\n\n abstract _render(): void;\n abstract onMouseDown(pointer: Point, ev: TBrushEventData): void;\n abstract onMouseMove(pointer: Point, ev: TBrushEventData): void;\n /**\n * @returns true if brush should continue blocking interaction\n */\n abstract onMouseUp(ev: TBrushEventData): boolean | void;\n\n /**\n * Sets brush styles\n * @private\n * @param {CanvasRenderingContext2D} ctx\n */\n _setBrushStyles(ctx: CanvasRenderingContext2D) {\n ctx.strokeStyle = this.color;\n ctx.lineWidth = this.width;\n ctx.lineCap = this.strokeLineCap;\n ctx.miterLimit = this.strokeMiterLimit;\n ctx.lineJoin = this.strokeLineJoin;\n ctx.setLineDash(this.strokeDashArray || []);\n }\n\n /**\n * Sets the transformation on given context\n * @param {CanvasRenderingContext2D} ctx context to render on\n * @private\n */\n protected _saveAndTransform(ctx: CanvasRenderingContext2D) {\n const v = this.canvas.viewportTransform;\n ctx.save();\n ctx.transform(v[0], v[1], v[2], v[3], v[4], v[5]);\n }\n\n protected needsFullRender() {\n const color = new Color(this.color);\n return color.getAlpha() < 1 || !!this.shadow;\n }\n\n /**\n * Sets brush shadow styles\n * @private\n */\n protected _setShadow() {\n if (!this.shadow || !this.canvas) {\n return;\n }\n\n const canvas = this.canvas,\n shadow = this.shadow,\n ctx = canvas.contextTop,\n zoom = canvas.getZoom() * canvas.getRetinaScaling();\n\n ctx.shadowColor = shadow.color;\n ctx.shadowBlur = shadow.blur * zoom;\n ctx.shadowOffsetX = shadow.offsetX * zoom;\n ctx.shadowOffsetY = shadow.offsetY * zoom;\n }\n\n /**\n * Removes brush shadow styles\n * @private\n */\n protected _resetShadow() {\n const ctx = this.canvas.contextTop;\n\n ctx.shadowColor = '';\n ctx.shadowBlur = ctx.shadowOffsetX = ctx.shadowOffsetY = 0;\n }\n\n /**\n * Check is pointer is outside canvas boundaries\n * @param {Object} pointer\n * @private\n */\n protected _isOutSideCanvas(pointer: Point) {\n return (\n pointer.x < 0 ||\n pointer.x > this.canvas.getWidth() ||\n pointer.y < 0 ||\n pointer.y > this.canvas.getHeight()\n );\n }\n}\n","import { config } from '../config';\nimport { SHARED_ATTRIBUTES } from '../parser/attributes';\nimport { parseAttributes } from '../parser/parseAttributes';\nimport type { XY } from '../Point';\nimport { Point } from '../Point';\nimport { makeBoundingBoxFromPoints } from '../util/misc/boundingBoxFromPoints';\nimport { toFixed } from '../util/misc/toFixed';\nimport {\n getBoundsOfCurve,\n joinPath,\n makePathSimpler,\n parsePath,\n} from '../util/path';\nimport { classRegistry } from '../ClassRegistry';\nimport { FabricObject, cacheProperties } from './Object/FabricObject';\nimport type {\n TComplexPathData,\n TPathSegmentInfo,\n TSimplePathData,\n} from '../util/path/typedefs';\nimport type { FabricObjectProps, SerializedObjectProps } from './Object/types';\nimport type { ObjectEvents } from '../EventTypeDefs';\nimport type {\n TBBox,\n TClassProperties,\n TSVGReviver,\n TOptions,\n} from '../typedefs';\nimport { CENTER, LEFT, TOP } from '../constants';\nimport type { CSSRules } from '../parser/typedefs';\n\ninterface UniquePathProps {\n sourcePath?: string;\n path?: TSimplePathData;\n}\n\nexport interface SerializedPathProps\n extends SerializedObjectProps,\n UniquePathProps {}\n\nexport interface PathProps extends FabricObjectProps, UniquePathProps {}\n\nexport interface IPathBBox extends TBBox {\n left: number;\n top: number;\n pathOffset: Point;\n}\n\nexport class Path<\n Props extends TOptions = Partial,\n SProps extends SerializedPathProps = SerializedPathProps,\n EventSpec extends ObjectEvents = ObjectEvents,\n> extends FabricObject {\n /**\n * Array of path points\n * @type Array\n */\n declare path: TSimplePathData;\n\n declare pathOffset: Point;\n\n declare sourcePath?: string;\n\n declare segmentsInfo?: TPathSegmentInfo[];\n\n static type = 'Path';\n\n static cacheProperties = [...cacheProperties, 'path', 'fillRule'];\n\n /**\n * Constructor\n * @param {TComplexPathData} path Path data (sequence of coordinates and corresponding \"command\" tokens)\n * @param {Partial} [options] Options object\n * @return {Path} thisArg\n */\n constructor(\n path: TComplexPathData | string,\n // todo: evaluate this spread here\n { path: _, left, top, ...options }: Partial = {},\n ) {\n super();\n Object.assign(this, Path.ownDefaults);\n this.setOptions(options);\n this._setPath(path || [], true);\n typeof left === 'number' && this.set(LEFT, left);\n typeof top === 'number' && this.set(TOP, top);\n }\n\n /**\n * @private\n * @param {TComplexPathData | string} path Path data (sequence of coordinates and corresponding \"command\" tokens)\n * @param {boolean} [adjustPosition] pass true to reposition the object according to the bounding box\n * @returns {Point} top left position of the bounding box, useful for complementary positioning\n */\n _setPath(path: TComplexPathData | string, adjustPosition?: boolean) {\n this.path = makePathSimpler(Array.isArray(path) ? path : parsePath(path));\n this.setBoundingBox(adjustPosition);\n }\n\n /**\n * This function is an helper for svg import. it returns the center of the object in the svg\n * untransformed coordinates, by look at the polyline/polygon points.\n * @private\n * @return {Point} center point from element coordinates\n */\n _findCenterFromElement(): Point {\n const bbox = this._calcBoundsFromPath();\n return new Point(bbox.left + bbox.width / 2, bbox.top + bbox.height / 2);\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx context to render path on\n */\n _renderPathCommands(ctx: CanvasRenderingContext2D) {\n const l = -this.pathOffset.x,\n t = -this.pathOffset.y;\n\n ctx.beginPath();\n\n for (const command of this.path) {\n switch (\n command[0] // first letter\n ) {\n case 'L': // lineto, absolute\n ctx.lineTo(command[1] + l, command[2] + t);\n break;\n\n case 'M': // moveTo, absolute\n ctx.moveTo(command[1] + l, command[2] + t);\n break;\n\n case 'C': // bezierCurveTo, absolute\n ctx.bezierCurveTo(\n command[1] + l,\n command[2] + t,\n command[3] + l,\n command[4] + t,\n command[5] + l,\n command[6] + t,\n );\n break;\n\n case 'Q': // quadraticCurveTo, absolute\n ctx.quadraticCurveTo(\n command[1] + l,\n command[2] + t,\n command[3] + l,\n command[4] + t,\n );\n break;\n\n case 'Z':\n ctx.closePath();\n break;\n }\n }\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx context to render path on\n */\n _render(ctx: CanvasRenderingContext2D) {\n this._renderPathCommands(ctx);\n this._renderPaintInOrder(ctx);\n }\n\n /**\n * Returns string representation of an instance\n * @return {string} string representation of an instance\n */\n toString() {\n return `#`;\n }\n\n /**\n * Returns object representation of an instance\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} object representation of an instance\n */\n toObject<\n T extends Omit, keyof SProps>,\n K extends keyof T = never,\n >(propertiesToInclude: K[] = []): Pick & SProps {\n return {\n ...super.toObject(propertiesToInclude),\n path: this.path.map((pathCmd) => pathCmd.slice()),\n };\n }\n\n /**\n * Returns dataless object representation of an instance\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} object representation of an instance\n */\n toDatalessObject<\n T extends Omit, keyof SProps>,\n K extends keyof T = never,\n >(propertiesToInclude: K[] = []): Pick & SProps {\n const o = this.toObject(propertiesToInclude);\n if (this.sourcePath) {\n delete o.path;\n o.sourcePath = this.sourcePath;\n }\n return o;\n }\n\n /**\n * Returns svg representation of an instance\n * @return {Array} an array of strings with the specific svg representation\n * of the instance\n */\n _toSVG() {\n const path = joinPath(this.path, config.NUM_FRACTION_DIGITS);\n return [\n '\\n`,\n ];\n }\n\n /**\n * @private\n * @return the path command's translate transform attribute\n */\n _getOffsetTransform() {\n const digits = config.NUM_FRACTION_DIGITS;\n return ` translate(${toFixed(-this.pathOffset.x, digits)}, ${toFixed(\n -this.pathOffset.y,\n digits,\n )})`;\n }\n\n /**\n * Returns svg clipPath representation of an instance\n * @param {Function} [reviver] Method for further parsing of svg representation.\n * @return {string} svg representation of an instance\n */\n toClipPathSVG(reviver?: TSVGReviver): string {\n const additionalTransform = this._getOffsetTransform();\n return (\n '\\t' +\n this._createBaseClipPathSVGMarkup(this._toSVG(), {\n reviver,\n additionalTransform: additionalTransform,\n })\n );\n }\n\n /**\n * Returns svg representation of an instance\n * @param {Function} [reviver] Method for further parsing of svg representation.\n * @return {string} svg representation of an instance\n */\n toSVG(reviver?: TSVGReviver): string {\n const additionalTransform = this._getOffsetTransform();\n return this._createBaseSVGMarkup(this._toSVG(), {\n reviver,\n additionalTransform: additionalTransform,\n });\n }\n\n /**\n * Returns number representation of an instance complexity\n * @return {number} complexity of this instance\n */\n complexity() {\n return this.path.length;\n }\n\n setDimensions() {\n this.setBoundingBox();\n }\n\n setBoundingBox(adjustPosition?: boolean) {\n const { width, height, pathOffset } = this._calcDimensions();\n this.set({ width, height, pathOffset });\n // using pathOffset because it match the use case.\n // if pathOffset change here we need to use left + width/2 , top + height/2\n adjustPosition && this.setPositionByOrigin(pathOffset, CENTER, CENTER);\n }\n\n _calcBoundsFromPath(): TBBox {\n const bounds: XY[] = [];\n let subpathStartX = 0,\n subpathStartY = 0,\n x = 0, // current x\n y = 0; // current y\n\n for (const command of this.path) {\n // current instruction\n switch (\n command[0] // first letter\n ) {\n case 'L': // lineto, absolute\n x = command[1];\n y = command[2];\n bounds.push({ x: subpathStartX, y: subpathStartY }, { x, y });\n break;\n\n case 'M': // moveTo, absolute\n x = command[1];\n y = command[2];\n subpathStartX = x;\n subpathStartY = y;\n break;\n\n case 'C': // bezierCurveTo, absolute\n bounds.push(\n ...getBoundsOfCurve(\n x,\n y,\n command[1],\n command[2],\n command[3],\n command[4],\n command[5],\n command[6],\n ),\n );\n x = command[5];\n y = command[6];\n break;\n\n case 'Q': // quadraticCurveTo, absolute\n bounds.push(\n ...getBoundsOfCurve(\n x,\n y,\n command[1],\n command[2],\n command[1],\n command[2],\n command[3],\n command[4],\n ),\n );\n x = command[3];\n y = command[4];\n break;\n\n case 'Z':\n x = subpathStartX;\n y = subpathStartY;\n break;\n }\n }\n return makeBoundingBoxFromPoints(bounds);\n }\n\n /**\n * @private\n */\n _calcDimensions(): IPathBBox {\n const bbox = this._calcBoundsFromPath();\n\n return {\n ...bbox,\n pathOffset: new Point(\n bbox.left + bbox.width / 2,\n bbox.top + bbox.height / 2,\n ),\n };\n }\n\n /**\n * List of attribute names to account for when parsing SVG element (used by `Path.fromElement`)\n * @see http://www.w3.org/TR/SVG/paths.html#PathElement\n */\n static ATTRIBUTE_NAMES = [...SHARED_ATTRIBUTES, 'd'];\n\n /**\n * Creates an instance of Path from an object\n * @param {Object} object\n * @returns {Promise}\n */\n static fromObject>(object: T) {\n return this._fromObject(object, {\n extraParam: 'path',\n });\n }\n\n /**\n * Creates an instance of Path from an SVG element\n * @param {HTMLElement} element to parse\n * @param {Partial} [options] Options object\n */\n static async fromElement(\n element: HTMLElement | SVGElement,\n options?: Partial,\n cssRules?: CSSRules,\n ) {\n const { d, ...parsedAttributes } = parseAttributes(\n element,\n this.ATTRIBUTE_NAMES,\n cssRules,\n );\n return new this(d, {\n ...parsedAttributes,\n ...options,\n // we pass undefined to instruct the constructor to position the object using the bbox\n left: undefined,\n top: undefined,\n });\n }\n}\n\nclassRegistry.setClass(Path);\nclassRegistry.setSVGClass(Path);\n\n/* _FROM_SVG_START_ */\n","import type { ModifierKey, TEvent } from '../EventTypeDefs';\nimport type { Point } from '../Point';\nimport { Shadow } from '../Shadow';\nimport { Path } from '../shapes/Path';\nimport { getSmoothPathFromPoints, joinPath } from '../util/path';\nimport type { Canvas } from '../canvas/Canvas';\nimport { BaseBrush } from './BaseBrush';\nimport type { TSimplePathData } from '../util/path/typedefs';\n\n/**\n * @private\n * @param {TSimplePathData} pathData SVG path commands\n * @returns {boolean}\n */\nfunction isEmptySVGPath(pathData: TSimplePathData): boolean {\n return joinPath(pathData) === 'M 0 0 Q 0 0 0 0 L 0 0';\n}\n\nexport class PencilBrush extends BaseBrush {\n /**\n * Discard points that are less than `decimate` pixel distant from each other\n * @type Number\n * @default 0.4\n */\n decimate = 0.4;\n\n /**\n * Draws a straight line between last recorded point to current pointer\n * Used for `shift` functionality\n *\n * @type boolean\n * @default false\n */\n drawStraightLine = false;\n\n /**\n * The event modifier key that makes the brush draw a straight line.\n * If `null` or 'none' or any other string that is not a modifier key the feature is disabled.\n * @type {ModifierKey | undefined | null}\n */\n straightLineKey: ModifierKey | undefined | null = 'shiftKey';\n\n declare protected _points: Point[];\n declare protected _hasStraightLine: boolean;\n declare protected oldEnd?: Point;\n\n constructor(canvas: Canvas) {\n super(canvas);\n this._points = [];\n this._hasStraightLine = false;\n }\n\n needsFullRender() {\n return super.needsFullRender() || this._hasStraightLine;\n }\n\n static drawSegment(ctx: CanvasRenderingContext2D, p1: Point, p2: Point) {\n const midPoint = p1.midPointFrom(p2);\n ctx.quadraticCurveTo(p1.x, p1.y, midPoint.x, midPoint.y);\n return midPoint;\n }\n\n /**\n * Invoked on mouse down\n * @param {Point} pointer\n */\n onMouseDown(pointer: Point, { e }: TEvent) {\n if (!this.canvas._isMainEvent(e)) {\n return;\n }\n this.drawStraightLine = !!this.straightLineKey && e[this.straightLineKey];\n this._prepareForDrawing(pointer);\n // capture coordinates immediately\n // this allows to draw dots (when movement never occurs)\n this._addPoint(pointer);\n this._render();\n }\n\n /**\n * Invoked on mouse move\n * @param {Point} pointer\n */\n onMouseMove(pointer: Point, { e }: TEvent) {\n if (!this.canvas._isMainEvent(e)) {\n return;\n }\n this.drawStraightLine = !!this.straightLineKey && e[this.straightLineKey];\n if (this.limitedToCanvasSize === true && this._isOutSideCanvas(pointer)) {\n return;\n }\n if (this._addPoint(pointer) && this._points.length > 1) {\n if (this.needsFullRender()) {\n // redraw curve\n // clear top canvas\n this.canvas.clearContext(this.canvas.contextTop);\n this._render();\n } else {\n const points = this._points,\n length = points.length,\n ctx = this.canvas.contextTop;\n // draw the curve update\n this._saveAndTransform(ctx);\n if (this.oldEnd) {\n ctx.beginPath();\n ctx.moveTo(this.oldEnd.x, this.oldEnd.y);\n }\n this.oldEnd = PencilBrush.drawSegment(\n ctx,\n points[length - 2],\n points[length - 1],\n );\n ctx.stroke();\n ctx.restore();\n }\n }\n }\n\n /**\n * Invoked on mouse up\n */\n onMouseUp({ e }: TEvent) {\n if (!this.canvas._isMainEvent(e)) {\n return true;\n }\n this.drawStraightLine = false;\n this.oldEnd = undefined;\n this._finalizeAndAddPath();\n\n return false;\n }\n\n /**\n * @private\n * @param {Point} pointer Actual mouse position related to the canvas.\n */\n _prepareForDrawing(pointer: Point) {\n this._reset();\n this._addPoint(pointer);\n this.canvas.contextTop.moveTo(pointer.x, pointer.y);\n }\n\n /**\n * @private\n * @param {Point} point Point to be added to points array\n */\n _addPoint(point: Point) {\n if (\n this._points.length > 1 &&\n point.eq(this._points[this._points.length - 1])\n ) {\n return false;\n }\n if (this.drawStraightLine && this._points.length > 1) {\n this._hasStraightLine = true;\n this._points.pop();\n }\n this._points.push(point);\n return true;\n }\n\n /**\n * Clear points array and set contextTop canvas style.\n * @private\n */\n _reset() {\n this._points = [];\n this._setBrushStyles(this.canvas.contextTop);\n this._setShadow();\n this._hasStraightLine = false;\n }\n\n /**\n * Draw a smooth path on the topCanvas using quadraticCurveTo\n * @private\n * @param {CanvasRenderingContext2D} [ctx]\n */\n _render(ctx: CanvasRenderingContext2D = this.canvas.contextTop) {\n let p1 = this._points[0],\n p2 = this._points[1];\n this._saveAndTransform(ctx);\n ctx.beginPath();\n //if we only have 2 points in the path and they are the same\n //it means that the user only clicked the canvas without moving the mouse\n //then we should be drawing a dot. A path isn't drawn between two identical dots\n //that's why we set them apart a bit\n if (this._points.length === 2 && p1.x === p2.x && p1.y === p2.y) {\n const width = this.width / 1000;\n p1.x -= width;\n p2.x += width;\n }\n ctx.moveTo(p1.x, p1.y);\n\n for (let i = 1; i < this._points.length; i++) {\n // we pick the point between pi + 1 & pi + 2 as the\n // end point and p1 as our control point.\n PencilBrush.drawSegment(ctx, p1, p2);\n p1 = this._points[i];\n p2 = this._points[i + 1];\n }\n // Draw last line as a straight line while\n // we wait for the next point to be able to calculate\n // the bezier control point\n ctx.lineTo(p1.x, p1.y);\n ctx.stroke();\n ctx.restore();\n }\n\n /**\n * Converts points to SVG path\n * @param {Point[]} points Array of points\n * @return {TSimplePathData} SVG path commands\n */\n convertPointsToSVGPath(points: Point[]): TSimplePathData {\n const correction = this.width / 1000;\n return getSmoothPathFromPoints(points, correction);\n }\n\n /**\n * Creates a Path object to add on canvas\n * @param {TSimplePathData} pathData Path data\n * @return {Path} Path to add on canvas\n */\n createPath(pathData: TSimplePathData): Path {\n const path = new Path(pathData, {\n fill: null,\n stroke: this.color,\n strokeWidth: this.width,\n strokeLineCap: this.strokeLineCap,\n strokeMiterLimit: this.strokeMiterLimit,\n strokeLineJoin: this.strokeLineJoin,\n strokeDashArray: this.strokeDashArray,\n });\n if (this.shadow) {\n this.shadow.affectStroke = true;\n path.shadow = new Shadow(this.shadow);\n }\n\n return path;\n }\n\n /**\n * Decimate points array with the decimate value\n */\n decimatePoints(points: Point[], distance: number) {\n if (points.length <= 2) {\n return points;\n }\n let lastPoint = points[0],\n cDistance;\n const zoom = this.canvas.getZoom(),\n adjustedDistance = Math.pow(distance / zoom, 2),\n l = points.length - 1,\n newPoints = [lastPoint];\n // TODO investigate why this is not i < l\n for (let i = 1; i < l - 1; i++) {\n cDistance =\n Math.pow(lastPoint.x - points[i].x, 2) +\n Math.pow(lastPoint.y - points[i].y, 2);\n if (cDistance >= adjustedDistance) {\n lastPoint = points[i];\n newPoints.push(lastPoint);\n }\n }\n // Add the last point from the original line to the end of the array.\n // This ensures decimate doesn't delete the last point on the line, and ensures the line is > 1 point.\n newPoints.push(points[l]);\n return newPoints;\n }\n\n /**\n * On mouseup after drawing the path on contextTop canvas\n * we use the points captured to create an new Path object\n * and add it to the canvas.\n */\n _finalizeAndAddPath() {\n const ctx = this.canvas.contextTop;\n ctx.closePath();\n if (this.decimate) {\n this._points = this.decimatePoints(this._points, this.decimate);\n }\n const pathData = this.convertPointsToSVGPath(this._points);\n if (isEmptySVGPath(pathData)) {\n // do not create 0 width/height paths, as they are\n // rendered inconsistently across browsers\n // Firefox 4, for example, renders a dot,\n // whereas Chrome 10 renders nothing\n this.canvas.requestRenderAll();\n return;\n }\n\n const path = this.createPath(pathData);\n this.canvas.clearContext(this.canvas.contextTop);\n this.canvas.fire('before:path:created', { path: path });\n this.canvas.add(path);\n this.canvas.requestRenderAll();\n path.setCoords();\n this._resetShadow();\n\n // fire event 'path' created\n this.canvas.fire('path:created', { path: path });\n }\n}\n","import type { ObjectEvents } from '../EventTypeDefs';\nimport { SHARED_ATTRIBUTES } from '../parser/attributes';\nimport { parseAttributes } from '../parser/parseAttributes';\nimport { cos } from '../util/misc/cos';\nimport { degreesToRadians } from '../util/misc/radiansDegreesConversion';\nimport { sin } from '../util/misc/sin';\nimport { classRegistry } from '../ClassRegistry';\nimport { FabricObject, cacheProperties } from './Object/FabricObject';\nimport type { Abortable, TClassProperties, TOptions } from '../typedefs';\nimport type { FabricObjectProps, SerializedObjectProps } from './Object/types';\nimport type { CSSRules } from '../parser/typedefs';\nimport { SCALE_X, SCALE_Y } from '../constants';\n\ninterface UniqueCircleProps {\n /**\n * Radius of this circle\n * @type Number\n * @default 0\n */\n radius: number;\n\n /**\n * Angle for the start of the circle, in degrees.\n * @type TDegree 0 - 359\n * @default 0\n */\n startAngle: number;\n\n /**\n * Angle for the end of the circle, in degrees\n * @type TDegree 1 - 360\n * @default 360\n */\n endAngle: number;\n\n /**\n * Orientation for the direction of the circle.\n * Setting to true will switch the arc of the circle to traverse from startAngle to endAngle in a counter-clockwise direction.\n * Note: this will only change how the circle is drawn, and does not affect rotational transformation.\n * @default false\n */\n counterClockwise: boolean;\n}\n\nexport interface SerializedCircleProps\n extends SerializedObjectProps,\n UniqueCircleProps {}\n\nexport interface CircleProps extends FabricObjectProps, UniqueCircleProps {}\n\nconst CIRCLE_PROPS = [\n 'radius',\n 'startAngle',\n 'endAngle',\n 'counterClockwise',\n] as const;\n\nexport const circleDefaultValues: Partial> = {\n radius: 0,\n startAngle: 0,\n endAngle: 360,\n counterClockwise: false,\n};\n\nexport class Circle<\n Props extends TOptions = Partial,\n SProps extends SerializedCircleProps = SerializedCircleProps,\n EventSpec extends ObjectEvents = ObjectEvents,\n >\n extends FabricObject\n implements UniqueCircleProps\n{\n declare radius: number;\n declare startAngle: number;\n declare endAngle: number;\n declare counterClockwise: boolean;\n\n static type = 'Circle';\n\n static cacheProperties = [...cacheProperties, ...CIRCLE_PROPS];\n\n static ownDefaults = circleDefaultValues;\n\n static getDefaults(): Record {\n return {\n ...super.getDefaults(),\n ...Circle.ownDefaults,\n };\n }\n\n /**\n * Constructor\n * @param {Object} [options] Options object\n */\n constructor(options?: Props) {\n super();\n Object.assign(this, Circle.ownDefaults);\n this.setOptions(options);\n }\n\n /**\n * @private\n * @param {String} key\n * @param {*} value\n */\n _set(key: string, value: any) {\n super._set(key, value);\n\n if (key === 'radius') {\n this.setRadius(value);\n }\n\n return this;\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx context to render on\n */\n _render(ctx: CanvasRenderingContext2D) {\n ctx.beginPath();\n ctx.arc(\n 0,\n 0,\n this.radius,\n degreesToRadians(this.startAngle),\n degreesToRadians(this.endAngle),\n this.counterClockwise,\n );\n this._renderPaintInOrder(ctx);\n }\n\n /**\n * Returns horizontal radius of an object (according to how an object is scaled)\n * @return {Number}\n */\n getRadiusX(): number {\n return this.get('radius') * this.get(SCALE_X);\n }\n\n /**\n * Returns vertical radius of an object (according to how an object is scaled)\n * @return {Number}\n */\n getRadiusY(): number {\n return this.get('radius') * this.get(SCALE_Y);\n }\n\n /**\n * Sets radius of an object (and updates width accordingly)\n */\n setRadius(value: number) {\n this.radius = value;\n this.set({ width: value * 2, height: value * 2 });\n }\n\n /**\n * Returns object representation of an instance\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} object representation of an instance\n */\n toObject<\n T extends Omit, keyof SProps>,\n K extends keyof T = never,\n >(propertiesToInclude: K[] = []): Pick & SProps {\n return super.toObject([...CIRCLE_PROPS, ...propertiesToInclude]);\n }\n\n /* _TO_SVG_START_ */\n\n /**\n * Returns svg representation of an instance\n * @return {Array} an array of strings with the specific svg representation\n * of the instance\n */\n _toSVG(): string[] {\n const angle = (this.endAngle - this.startAngle) % 360;\n\n if (angle === 0) {\n return [\n '\\n',\n ];\n } else {\n const { radius } = this;\n const start = degreesToRadians(this.startAngle),\n end = degreesToRadians(this.endAngle),\n startX = cos(start) * radius,\n startY = sin(start) * radius,\n endX = cos(end) * radius,\n endY = sin(end) * radius,\n largeFlag = angle > 180 ? 1 : 0,\n sweepFlag = this.counterClockwise ? 0 : 1;\n return [\n `\\n',\n ];\n }\n }\n /* _TO_SVG_END_ */\n\n /* _FROM_SVG_START_ */\n /**\n * List of attribute names to account for when parsing SVG element (used by {@link Circle.fromElement})\n * @see: http://www.w3.org/TR/SVG/shapes.html#CircleElement\n */\n static ATTRIBUTE_NAMES = ['cx', 'cy', 'r', ...SHARED_ATTRIBUTES];\n\n /**\n * Returns {@link Circle} instance from an SVG element\n * @param {HTMLElement} element Element to parse\n * @param {Object} [options] Partial Circle object to default missing properties on the element.\n * @throws {Error} If value of `r` attribute is missing or invalid\n */\n static async fromElement(\n element: HTMLElement,\n options: Abortable,\n cssRules?: CSSRules,\n ): Promise {\n const {\n left = 0,\n top = 0,\n radius = 0,\n ...otherParsedAttributes\n } = parseAttributes(\n element,\n this.ATTRIBUTE_NAMES,\n cssRules,\n ) as Partial;\n\n // this probably requires to be fixed for default origins not being top/left.\n\n return new this({\n ...otherParsedAttributes,\n radius,\n left: left - radius,\n top: top - radius,\n });\n }\n\n /* _FROM_SVG_END_ */\n\n /**\n * @todo how do we declare this??\n */\n static fromObject>(object: T) {\n return super._fromObject(object);\n }\n}\n\nclassRegistry.setClass(Circle);\nclassRegistry.setSVGClass(Circle);\n","import { Color } from '../color/Color';\nimport type { Point } from '../Point';\nimport { Shadow } from '../Shadow';\nimport { Circle } from '../shapes/Circle';\nimport { Group } from '../shapes/Group';\nimport { getRandomInt } from '../util/internals/getRandomInt';\nimport type { Canvas } from '../canvas/Canvas';\nimport { BaseBrush } from './BaseBrush';\nimport type { CircleBrushPoint } from './typedefs';\nimport { CENTER } from '../constants';\n\nexport class CircleBrush extends BaseBrush {\n /**\n * Width of a brush\n * @type Number\n */\n width = 10;\n\n declare points: CircleBrushPoint[];\n\n constructor(canvas: Canvas) {\n super(canvas);\n this.points = [];\n }\n\n /**\n * Invoked inside on mouse down and mouse move\n * @param {Point} pointer\n */\n drawDot(pointer: Point) {\n const point = this.addPoint(pointer),\n ctx = this.canvas.contextTop;\n this._saveAndTransform(ctx);\n this.dot(ctx, point);\n ctx.restore();\n }\n\n dot(ctx: CanvasRenderingContext2D, point: CircleBrushPoint) {\n ctx.fillStyle = point.fill;\n ctx.beginPath();\n ctx.arc(point.x, point.y, point.radius, 0, Math.PI * 2, false);\n ctx.closePath();\n ctx.fill();\n }\n\n /**\n * Invoked on mouse down\n */\n onMouseDown(pointer: Point) {\n this.points = [];\n this.canvas.clearContext(this.canvas.contextTop);\n this._setShadow();\n this.drawDot(pointer);\n }\n\n /**\n * Render the full state of the brush\n * @private\n */\n _render() {\n const ctx = this.canvas.contextTop,\n points = this.points;\n this._saveAndTransform(ctx);\n for (let i = 0; i < points.length; i++) {\n this.dot(ctx, points[i]);\n }\n ctx.restore();\n }\n\n /**\n * Invoked on mouse move\n * @param {Point} pointer\n */\n onMouseMove(pointer: Point) {\n if (this.limitedToCanvasSize === true && this._isOutSideCanvas(pointer)) {\n return;\n }\n if (this.needsFullRender()) {\n this.canvas.clearContext(this.canvas.contextTop);\n this.addPoint(pointer);\n this._render();\n } else {\n this.drawDot(pointer);\n }\n }\n\n /**\n * Invoked on mouse up\n */\n onMouseUp() {\n const originalRenderOnAddRemove = this.canvas.renderOnAddRemove;\n this.canvas.renderOnAddRemove = false;\n\n const circles: Circle[] = [];\n\n for (let i = 0; i < this.points.length; i++) {\n const point = this.points[i],\n circle = new Circle({\n radius: point.radius,\n left: point.x,\n top: point.y,\n originX: CENTER,\n originY: CENTER,\n fill: point.fill,\n });\n\n this.shadow && (circle.shadow = new Shadow(this.shadow));\n\n circles.push(circle);\n }\n const group = new Group(circles, { canvas: this.canvas });\n\n this.canvas.fire('before:path:created', { path: group });\n this.canvas.add(group);\n this.canvas.fire('path:created', { path: group });\n\n this.canvas.clearContext(this.canvas.contextTop);\n this._resetShadow();\n this.canvas.renderOnAddRemove = originalRenderOnAddRemove;\n this.canvas.requestRenderAll();\n }\n\n /**\n * @param {Object} pointer\n * @return {Point} Just added pointer point\n */\n addPoint({ x, y }: Point) {\n const pointerPoint: CircleBrushPoint = {\n x,\n y,\n radius: getRandomInt(Math.max(0, this.width - 20), this.width + 20) / 2,\n fill: new Color(this.color).setAlpha(getRandomInt(0, 100) / 100).toRgba(),\n };\n\n this.points.push(pointerPoint);\n\n return pointerPoint;\n }\n}\n","import type { Point } from '../Point';\nimport { Group } from '../shapes/Group';\nimport { Shadow } from '../Shadow';\nimport { Rect } from '../shapes/Rect';\nimport { getRandomInt } from '../util/internals/getRandomInt';\nimport type { Canvas } from '../canvas/Canvas';\nimport { BaseBrush } from './BaseBrush';\nimport type { SprayBrushPoint } from './typedefs';\nimport { CENTER } from '../constants';\n\n/**\n *\n * @param rects\n * @returns\n */\nfunction getUniqueRects(rects: Rect[]) {\n const uniqueRects: Record = {};\n const uniqueRectsArray: Rect[] = [];\n\n for (let i = 0, key: string; i < rects.length; i++) {\n key = `${rects[i].left}${rects[i].top}`;\n if (!uniqueRects[key]) {\n uniqueRects[key] = true;\n uniqueRectsArray.push(rects[i]);\n }\n }\n\n return uniqueRectsArray;\n}\n\nexport class SprayBrush extends BaseBrush {\n /**\n * Width of a spray\n * @type Number\n */\n width = 10;\n\n /**\n * Density of a spray (number of dots per chunk)\n * @type Number\n */\n density = 20;\n\n /**\n * Width of spray dots\n * @type Number\n */\n dotWidth = 1;\n\n /**\n * Width variance of spray dots\n * @type Number\n */\n dotWidthVariance = 1;\n\n /**\n * Whether opacity of a dot should be random\n * @type Boolean\n */\n randomOpacity = false;\n\n /**\n * Whether overlapping dots (rectangles) should be removed (for performance reasons)\n * @type Boolean\n */\n optimizeOverlapping = true;\n\n declare private sprayChunks: SprayBrushPoint[][];\n\n declare private sprayChunk: SprayBrushPoint[];\n\n /**\n * Constructor\n * @param {Canvas} canvas\n * @return {SprayBrush} Instance of a spray brush\n */\n constructor(canvas: Canvas) {\n super(canvas);\n this.sprayChunks = [];\n this.sprayChunk = [];\n }\n\n /**\n * Invoked on mouse down\n * @param {Point} pointer\n */\n onMouseDown(pointer: Point) {\n this.sprayChunks = [];\n this.canvas.clearContext(this.canvas.contextTop);\n this._setShadow();\n\n this.addSprayChunk(pointer);\n this.renderChunck(this.sprayChunk);\n }\n\n /**\n * Invoked on mouse move\n * @param {Point} pointer\n */\n onMouseMove(pointer: Point) {\n if (this.limitedToCanvasSize === true && this._isOutSideCanvas(pointer)) {\n return;\n }\n this.addSprayChunk(pointer);\n this.renderChunck(this.sprayChunk);\n }\n\n /**\n * Invoked on mouse up\n */\n onMouseUp() {\n const originalRenderOnAddRemove = this.canvas.renderOnAddRemove;\n this.canvas.renderOnAddRemove = false;\n\n const rects: Rect[] = [];\n\n for (let i = 0; i < this.sprayChunks.length; i++) {\n const sprayChunk = this.sprayChunks[i];\n for (let j = 0; j < sprayChunk.length; j++) {\n const chunck = sprayChunk[j];\n const rect = new Rect({\n width: chunck.width,\n height: chunck.width,\n left: chunck.x + 1,\n top: chunck.y + 1,\n originX: CENTER,\n originY: CENTER,\n fill: this.color,\n });\n rects.push(rect);\n }\n }\n\n const group = new Group(\n this.optimizeOverlapping ? getUniqueRects(rects) : rects,\n {\n objectCaching: true,\n subTargetCheck: false,\n interactive: false,\n },\n );\n this.shadow && group.set('shadow', new Shadow(this.shadow));\n this.canvas.fire('before:path:created', { path: group });\n this.canvas.add(group);\n this.canvas.fire('path:created', { path: group });\n\n this.canvas.clearContext(this.canvas.contextTop);\n this._resetShadow();\n this.canvas.renderOnAddRemove = originalRenderOnAddRemove;\n this.canvas.requestRenderAll();\n }\n\n renderChunck(sprayChunck: SprayBrushPoint[]) {\n const ctx = this.canvas.contextTop;\n ctx.fillStyle = this.color;\n\n this._saveAndTransform(ctx);\n\n for (let i = 0; i < sprayChunck.length; i++) {\n const point = sprayChunck[i];\n ctx.globalAlpha = point.opacity;\n ctx.fillRect(point.x, point.y, point.width, point.width);\n }\n\n ctx.restore();\n }\n\n /**\n * Render all spray chunks\n */\n _render() {\n const ctx = this.canvas.contextTop;\n ctx.fillStyle = this.color;\n\n this._saveAndTransform(ctx);\n\n for (let i = 0; i < this.sprayChunks.length; i++) {\n this.renderChunck(this.sprayChunks[i]);\n }\n ctx.restore();\n }\n\n /**\n * @param {Point} pointer\n */\n addSprayChunk(pointer: Point) {\n this.sprayChunk = [];\n const radius = this.width / 2;\n\n for (let i = 0; i < this.density; i++) {\n this.sprayChunk.push({\n x: getRandomInt(pointer.x - radius, pointer.x + radius),\n y: getRandomInt(pointer.y - radius, pointer.y + radius),\n width: this.dotWidthVariance\n ? getRandomInt(\n // bottom clamp width to 1\n Math.max(1, this.dotWidth - this.dotWidthVariance),\n this.dotWidth + this.dotWidthVariance,\n )\n : this.dotWidth,\n opacity: this.randomOpacity ? getRandomInt(0, 100) / 100 : 1,\n });\n }\n\n this.sprayChunks.push(this.sprayChunk);\n }\n}\n","import { Pattern } from '../Pattern';\nimport { createCanvasElement } from '../util/misc/dom';\nimport type { Canvas } from '../canvas/Canvas';\nimport { PencilBrush } from './PencilBrush';\nimport type { TSimplePathData } from '../util/path/typedefs';\n\nexport class PatternBrush extends PencilBrush {\n declare source?: CanvasImageSource;\n\n constructor(canvas: Canvas) {\n super(canvas);\n }\n\n getPatternSrc() {\n const dotWidth = 20,\n dotDistance = 5,\n patternCanvas = createCanvasElement(),\n patternCtx = patternCanvas.getContext('2d');\n\n patternCanvas.width = patternCanvas.height = dotWidth + dotDistance;\n if (patternCtx) {\n patternCtx.fillStyle = this.color;\n patternCtx.beginPath();\n patternCtx.arc(\n dotWidth / 2,\n dotWidth / 2,\n dotWidth / 2,\n 0,\n Math.PI * 2,\n false,\n );\n patternCtx.closePath();\n patternCtx.fill();\n }\n return patternCanvas;\n }\n\n /**\n * Creates \"pattern\" instance property\n * @param {CanvasRenderingContext2D} ctx\n */\n getPattern(ctx: CanvasRenderingContext2D) {\n return ctx.createPattern(this.source || this.getPatternSrc(), 'repeat');\n }\n\n /**\n * Sets brush styles\n * @param {CanvasRenderingContext2D} ctx\n */\n _setBrushStyles(ctx: CanvasRenderingContext2D) {\n super._setBrushStyles(ctx);\n const pattern = this.getPattern(ctx);\n pattern && (ctx.strokeStyle = pattern);\n }\n\n /**\n * Creates path\n */\n createPath(pathData: TSimplePathData) {\n const path = super.createPath(pathData),\n topLeft = path._getLeftTopCoords().scalarAdd(path.strokeWidth / 2);\n\n path.stroke = new Pattern({\n source: this.source || this.getPatternSrc(),\n offsetX: -topLeft.x,\n offsetY: -topLeft.y,\n });\n return path;\n }\n}\n","import { SHARED_ATTRIBUTES } from '../parser/attributes';\nimport { parseAttributes } from '../parser/parseAttributes';\nimport type { Abortable, TClassProperties, TOptions } from '../typedefs';\nimport { classRegistry } from '../ClassRegistry';\nimport { FabricObject, cacheProperties } from './Object/FabricObject';\nimport { Point } from '../Point';\nimport { isFiller } from '../util/typeAssertions';\nimport type { FabricObjectProps, SerializedObjectProps } from './Object/types';\nimport type { ObjectEvents } from '../EventTypeDefs';\nimport { makeBoundingBoxFromPoints } from '../util';\nimport { CENTER, LEFT, TOP } from '../constants';\nimport type { CSSRules } from '../parser/typedefs';\n\n// @TODO this code is terrible and Line should be a special case of polyline.\n\nconst coordProps = ['x1', 'x2', 'y1', 'y2'] as const;\n\ninterface UniqueLineProps {\n x1: number;\n x2: number;\n y1: number;\n y2: number;\n}\n\nexport interface SerializedLineProps\n extends SerializedObjectProps,\n UniqueLineProps {}\n\n/**\n * A Class to draw a line\n * A bunch of methods will be added to Polyline to handle the line case\n * The line class is very strange to work with, is all special, it hardly aligns\n * to what a developer want everytime there is an angle\n * @deprecated\n */\nexport class Line<\n Props extends TOptions = Partial,\n SProps extends SerializedLineProps = SerializedLineProps,\n EventSpec extends ObjectEvents = ObjectEvents,\n >\n extends FabricObject\n implements UniqueLineProps\n{\n /**\n * x value or first line edge\n * @type number\n */\n declare x1: number;\n\n /**\n * y value or first line edge\n * @type number\n */\n declare y1: number;\n\n /**\n * x value or second line edge\n * @type number\n */\n declare x2: number;\n\n /**\n * y value or second line edge\n * @type number\n */\n declare y2: number;\n\n static type = 'Line';\n\n static cacheProperties = [...cacheProperties, ...coordProps];\n /**\n * Constructor\n * @param {Array} [points] Array of points\n * @param {Object} [options] Options object\n * @return {Line} thisArg\n */\n constructor([x1, y1, x2, y2] = [0, 0, 0, 0], options: Partial = {}) {\n super();\n Object.assign(this, Line.ownDefaults);\n this.setOptions(options);\n this.x1 = x1;\n this.x2 = x2;\n this.y1 = y1;\n this.y2 = y2;\n this._setWidthHeight();\n const { left, top } = options;\n typeof left === 'number' && this.set(LEFT, left);\n typeof top === 'number' && this.set(TOP, top);\n }\n\n /**\n * @private\n * @param {Object} [options] Options\n */\n _setWidthHeight() {\n const { x1, y1, x2, y2 } = this;\n this.width = Math.abs(x2 - x1);\n this.height = Math.abs(y2 - y1);\n const { left, top, width, height } = makeBoundingBoxFromPoints([\n { x: x1, y: y1 },\n { x: x2, y: y2 },\n ]);\n const position = new Point(left + width / 2, top + height / 2);\n this.setPositionByOrigin(position, CENTER, CENTER);\n }\n\n /**\n * @private\n * @param {String} key\n * @param {*} value\n */\n _set(key: string, value: any) {\n super._set(key, value);\n if (coordProps.includes(key as keyof UniqueLineProps)) {\n // this doesn't make sense very much, since setting x1 when top or left\n // are already set, is just going to show a strange result since the\n // line will move way more than the developer expect.\n // in fabric5 it worked only when the line didn't have extra transformations,\n // in fabric6 too. With extra transform they behave bad in different ways.\n // This needs probably a good rework or a tutorial if you have to create a dynamic line\n this._setWidthHeight();\n }\n return this;\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _render(ctx: CanvasRenderingContext2D) {\n ctx.beginPath();\n\n const p = this.calcLinePoints();\n ctx.moveTo(p.x1, p.y1);\n ctx.lineTo(p.x2, p.y2);\n\n ctx.lineWidth = this.strokeWidth;\n\n // TODO: test this\n // make sure setting \"fill\" changes color of a line\n // (by copying fillStyle to strokeStyle, since line is stroked, not filled)\n const origStrokeStyle = ctx.strokeStyle;\n if (isFiller(this.stroke)) {\n ctx.strokeStyle = this.stroke.toLive(ctx)!;\n } else {\n ctx.strokeStyle = this.stroke ?? ctx.fillStyle;\n }\n this.stroke && this._renderStroke(ctx);\n ctx.strokeStyle = origStrokeStyle;\n }\n\n /**\n * This function is an helper for svg import. it returns the center of the object in the svg\n * untransformed coordinates\n * @private\n * @return {Point} center point from element coordinates\n */\n _findCenterFromElement(): Point {\n return new Point((this.x1 + this.x2) / 2, (this.y1 + this.y2) / 2);\n }\n\n /**\n * Returns object representation of an instance\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} object representation of an instance\n */\n toObject<\n T extends Omit, keyof SProps>,\n K extends keyof T = never,\n >(propertiesToInclude: K[] = []): Pick & SProps {\n return {\n ...super.toObject(propertiesToInclude),\n ...this.calcLinePoints(),\n };\n }\n\n /*\n * Calculate object dimensions from its properties\n * @private\n */\n _getNonTransformedDimensions(): Point {\n const dim = super._getNonTransformedDimensions();\n if (this.strokeLineCap === 'butt') {\n if (this.width === 0) {\n dim.y -= this.strokeWidth;\n }\n if (this.height === 0) {\n dim.x -= this.strokeWidth;\n }\n }\n return dim;\n }\n\n /**\n * Recalculates line points given width and height\n * Those points are simply placed around the center,\n * This is not useful outside internal render functions and svg output\n * Is not meant to be for the developer.\n * @private\n */\n calcLinePoints(): UniqueLineProps {\n const { x1: _x1, x2: _x2, y1: _y1, y2: _y2, width, height } = this;\n const xMult = _x1 <= _x2 ? -1 : 1,\n yMult = _y1 <= _y2 ? -1 : 1,\n x1 = (xMult * width) / 2,\n y1 = (yMult * height) / 2,\n x2 = (xMult * -width) / 2,\n y2 = (yMult * -height) / 2;\n\n return {\n x1,\n x2,\n y1,\n y2,\n };\n }\n\n /* _FROM_SVG_START_ */\n\n /**\n * Returns svg representation of an instance\n * @return {Array} an array of strings with the specific svg representation\n * of the instance\n */\n _toSVG() {\n const { x1, x2, y1, y2 } = this.calcLinePoints();\n return [\n '\\n`,\n ];\n }\n\n /**\n * List of attribute names to account for when parsing SVG element (used by {@link Line.fromElement})\n * @see http://www.w3.org/TR/SVG/shapes.html#LineElement\n */\n static ATTRIBUTE_NAMES = SHARED_ATTRIBUTES.concat(coordProps);\n\n /**\n * Returns Line instance from an SVG element\n * @param {HTMLElement} element Element to parse\n * @param {Object} [options] Options object\n * @param {Function} [callback] callback function invoked after parsing\n */\n static async fromElement(\n element: HTMLElement,\n options?: Abortable,\n cssRules?: CSSRules,\n ) {\n const {\n x1 = 0,\n y1 = 0,\n x2 = 0,\n y2 = 0,\n ...parsedAttributes\n } = parseAttributes(element, this.ATTRIBUTE_NAMES, cssRules);\n return new this([x1, y1, x2, y2], parsedAttributes);\n }\n\n /* _FROM_SVG_END_ */\n\n /**\n * Returns Line instance from an object representation\n * @param {Object} object Object to create an instance from\n * @returns {Promise}\n */\n static fromObject>({\n x1,\n y1,\n x2,\n y2,\n ...object\n }: T) {\n return this._fromObject(\n {\n ...object,\n points: [x1, y1, x2, y2],\n },\n {\n extraParam: 'points',\n },\n );\n }\n}\n\nclassRegistry.setClass(Line);\nclassRegistry.setSVGClass(Line);\n","import { classRegistry } from '../ClassRegistry';\nimport { FabricObject } from './Object/FabricObject';\nimport type { FabricObjectProps, SerializedObjectProps } from './Object/types';\nimport type { TClassProperties, TOptions } from '../typedefs';\nimport type { ObjectEvents } from '../EventTypeDefs';\n\nexport const triangleDefaultValues: Partial> = {\n width: 100,\n height: 100,\n};\n\nexport class Triangle<\n Props extends TOptions = Partial,\n SProps extends SerializedObjectProps = SerializedObjectProps,\n EventSpec extends ObjectEvents = ObjectEvents,\n >\n extends FabricObject\n implements FabricObjectProps\n{\n static type = 'Triangle';\n\n static ownDefaults = triangleDefaultValues;\n\n static getDefaults(): Record {\n return { ...super.getDefaults(), ...Triangle.ownDefaults };\n }\n\n /**\n * Constructor\n * @param {Object} [options] Options object\n */\n constructor(options?: Props) {\n super();\n Object.assign(this, Triangle.ownDefaults);\n this.setOptions(options);\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _render(ctx: CanvasRenderingContext2D) {\n const widthBy2 = this.width / 2,\n heightBy2 = this.height / 2;\n\n ctx.beginPath();\n ctx.moveTo(-widthBy2, heightBy2);\n ctx.lineTo(0, -heightBy2);\n ctx.lineTo(widthBy2, heightBy2);\n ctx.closePath();\n\n this._renderPaintInOrder(ctx);\n }\n\n /**\n * Returns svg representation of an instance\n * @return {Array} an array of strings with the specific svg representation\n * of the instance\n */\n _toSVG() {\n const widthBy2 = this.width / 2,\n heightBy2 = this.height / 2,\n points = `${-widthBy2} ${heightBy2},0 ${-heightBy2},${widthBy2} ${heightBy2}`;\n return [''];\n }\n}\n\nclassRegistry.setClass(Triangle);\nclassRegistry.setSVGClass(Triangle);\n","import { SCALE_X, SCALE_Y, twoMathPi } from '../constants';\nimport { SHARED_ATTRIBUTES } from '../parser/attributes';\nimport { parseAttributes } from '../parser/parseAttributes';\nimport type { Abortable, TClassProperties, TOptions } from '../typedefs';\nimport { classRegistry } from '../ClassRegistry';\nimport { FabricObject, cacheProperties } from './Object/FabricObject';\nimport type { FabricObjectProps, SerializedObjectProps } from './Object/types';\nimport type { ObjectEvents } from '../EventTypeDefs';\nimport type { CSSRules } from '../parser/typedefs';\n\nexport const ellipseDefaultValues: Partial> = {\n rx: 0,\n ry: 0,\n};\n\ninterface UniqueEllipseProps {\n rx: number;\n ry: number;\n}\n\nexport interface SerializedEllipseProps\n extends SerializedObjectProps,\n UniqueEllipseProps {}\n\nexport interface EllipseProps extends FabricObjectProps, UniqueEllipseProps {}\n\nconst ELLIPSE_PROPS = ['rx', 'ry'] as const;\n\nexport class Ellipse<\n Props extends TOptions = Partial,\n SProps extends SerializedEllipseProps = SerializedEllipseProps,\n EventSpec extends ObjectEvents = ObjectEvents,\n >\n extends FabricObject\n implements EllipseProps\n{\n /**\n * Horizontal radius\n * @type Number\n */\n declare rx: number;\n\n /**\n * Vertical radius\n * @type Number\n */\n declare ry: number;\n\n static type = 'Ellipse';\n\n static cacheProperties = [...cacheProperties, ...ELLIPSE_PROPS];\n\n static ownDefaults = ellipseDefaultValues;\n\n static getDefaults(): Record {\n return {\n ...super.getDefaults(),\n ...Ellipse.ownDefaults,\n };\n }\n\n /**\n * Constructor\n * @param {Object} [options] Options object\n */\n constructor(options?: Props) {\n super();\n Object.assign(this, Ellipse.ownDefaults);\n this.setOptions(options);\n }\n\n /**\n * @private\n * @param {String} key\n * @param {*} value\n * @return {Ellipse} thisArg\n */\n _set(key: string, value: any) {\n super._set(key, value);\n switch (key) {\n case 'rx':\n this.rx = value;\n this.set('width', value * 2);\n break;\n\n case 'ry':\n this.ry = value;\n this.set('height', value * 2);\n break;\n }\n return this;\n }\n\n /**\n * Returns horizontal radius of an object (according to how an object is scaled)\n * @return {Number}\n */\n getRx() {\n return this.get('rx') * this.get(SCALE_X);\n }\n\n /**\n * Returns Vertical radius of an object (according to how an object is scaled)\n * @return {Number}\n */\n getRy() {\n return this.get('ry') * this.get(SCALE_Y);\n }\n\n /**\n * Returns object representation of an instance\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} object representation of an instance\n */\n toObject<\n T extends Omit, keyof SProps>,\n K extends keyof T = never,\n >(propertiesToInclude: K[] = []): Pick & SProps {\n return super.toObject([...ELLIPSE_PROPS, ...propertiesToInclude]);\n }\n\n /**\n * Returns svg representation of an instance\n * @return {Array} an array of strings with the specific svg representation\n * of the instance\n */\n _toSVG(): string[] {\n return [\n '\\n`,\n ];\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx context to render on\n */\n _render(ctx: CanvasRenderingContext2D) {\n ctx.beginPath();\n ctx.save();\n ctx.transform(1, 0, 0, this.ry / this.rx, 0, 0);\n ctx.arc(0, 0, this.rx, 0, twoMathPi, false);\n ctx.restore();\n this._renderPaintInOrder(ctx);\n }\n\n /* _FROM_SVG_START_ */\n\n /**\n * List of attribute names to account for when parsing SVG element (used by {@link Ellipse.fromElement})\n * @see http://www.w3.org/TR/SVG/shapes.html#EllipseElement\n */\n static ATTRIBUTE_NAMES = [...SHARED_ATTRIBUTES, 'cx', 'cy', 'rx', 'ry'];\n\n /**\n * Returns {@link Ellipse} instance from an SVG element\n * @param {HTMLElement} element Element to parse\n * @return {Ellipse}\n */\n static async fromElement(\n element: HTMLElement,\n options?: Abortable,\n cssRules?: CSSRules,\n ) {\n const parsedAttributes = parseAttributes(\n element,\n this.ATTRIBUTE_NAMES,\n cssRules,\n );\n\n parsedAttributes.left = (parsedAttributes.left || 0) - parsedAttributes.rx;\n parsedAttributes.top = (parsedAttributes.top || 0) - parsedAttributes.ry;\n return new this(parsedAttributes);\n }\n\n /* _FROM_SVG_END_ */\n}\n\nclassRegistry.setClass(Ellipse);\nclassRegistry.setSVGClass(Ellipse);\n","import type { XY } from '../Point';\n\n/**\n * Parses \"points\" attribute, returning an array of values\n * @param {String} points points attribute string\n * @return {Array} array of points\n */\nexport function parsePointsAttribute(points: string | null): XY[] {\n // points attribute is required and must not be empty\n if (!points) {\n return [];\n }\n\n // replace commas with whitespace and remove bookending whitespace\n const pointsSplit: string[] = points.replace(/,/g, ' ').trim().split(/\\s+/);\n\n const parsedPoints = [];\n\n for (let i = 0; i < pointsSplit.length; i += 2) {\n parsedPoints.push({\n x: parseFloat(pointsSplit[i]),\n y: parseFloat(pointsSplit[i + 1]),\n });\n }\n\n // odd number of points is an error\n // if (parsedPoints.length % 2 !== 0) {\n // return null;\n // }\n return parsedPoints;\n}\n","import { config } from '../config';\nimport { SHARED_ATTRIBUTES } from '../parser/attributes';\nimport { parseAttributes } from '../parser/parseAttributes';\nimport { parsePointsAttribute } from '../parser/parsePointsAttribute';\nimport type { XY } from '../Point';\nimport { Point } from '../Point';\nimport type { Abortable, TClassProperties, TOptions } from '../typedefs';\nimport { classRegistry } from '../ClassRegistry';\nimport { makeBoundingBoxFromPoints } from '../util/misc/boundingBoxFromPoints';\nimport { calcDimensionsMatrix, transformPoint } from '../util/misc/matrix';\nimport { projectStrokeOnPoints } from '../util/misc/projectStroke';\nimport type { TProjectStrokeOnPointsOptions } from '../util/misc/projectStroke/types';\nimport { degreesToRadians } from '../util/misc/radiansDegreesConversion';\nimport { toFixed } from '../util/misc/toFixed';\nimport { FabricObject, cacheProperties } from './Object/FabricObject';\nimport type { FabricObjectProps, SerializedObjectProps } from './Object/types';\nimport type { ObjectEvents } from '../EventTypeDefs';\nimport {\n CENTER,\n LEFT,\n SCALE_X,\n SCALE_Y,\n SKEW_X,\n SKEW_Y,\n TOP,\n} from '../constants';\nimport type { CSSRules } from '../parser/typedefs';\n\nexport const polylineDefaultValues: Partial> = {\n /**\n * @deprecated transient option soon to be removed in favor of a different design\n */\n exactBoundingBox: false,\n};\n\nexport interface SerializedPolylineProps extends SerializedObjectProps {\n points: XY[];\n}\n\nexport class Polyline<\n Props extends TOptions = Partial,\n SProps extends SerializedPolylineProps = SerializedPolylineProps,\n EventSpec extends ObjectEvents = ObjectEvents,\n> extends FabricObject {\n /**\n * Points array\n * @type Array\n */\n declare points: XY[];\n\n /**\n * WARNING: Feature in progress\n * Calculate the exact bounding box taking in account strokeWidth on acute angles\n * this will be turned to true by default on fabric 6.0\n * maybe will be left in as an optimization since calculations may be slow\n * @deprecated transient option soon to be removed in favor of a different design\n * @type Boolean\n * @default false\n */\n declare exactBoundingBox: boolean;\n\n declare private initialized: true | undefined;\n\n static ownDefaults = polylineDefaultValues;\n\n static type = 'Polyline';\n\n static getDefaults(): Record {\n return {\n ...super.getDefaults(),\n ...Polyline.ownDefaults,\n };\n }\n\n /**\n * A list of properties that if changed trigger a recalculation of dimensions\n * @todo check if you really need to recalculate for all cases\n */\n static layoutProperties: (keyof Polyline)[] = [\n SKEW_X,\n SKEW_Y,\n 'strokeLineCap',\n 'strokeLineJoin',\n 'strokeMiterLimit',\n 'strokeWidth',\n 'strokeUniform',\n 'points',\n ];\n\n declare pathOffset: Point;\n\n declare strokeOffset: Point;\n\n static cacheProperties = [...cacheProperties, 'points'];\n\n strokeDiff: Point;\n\n /**\n * Constructor\n * @param {Array} points Array of points (where each point is an object with x and y)\n * @param {Object} [options] Options object\n * @return {Polyline} thisArg\n * @example\n * var poly = new Polyline([\n * { x: 10, y: 10 },\n * { x: 50, y: 30 },\n * { x: 40, y: 70 },\n * { x: 60, y: 50 },\n * { x: 100, y: 150 },\n * { x: 40, y: 100 }\n * ], {\n * stroke: 'red',\n * left: 100,\n * top: 100\n * });\n */\n constructor(points: XY[] = [], options: Props = {} as Props) {\n super();\n Object.assign(this, Polyline.ownDefaults);\n this.setOptions(options);\n this.points = points;\n const { left, top } = options;\n this.initialized = true;\n this.setBoundingBox(true);\n typeof left === 'number' && this.set(LEFT, left);\n typeof top === 'number' && this.set(TOP, top);\n }\n\n protected isOpen() {\n return true;\n }\n\n private _projectStrokeOnPoints(options: TProjectStrokeOnPointsOptions) {\n return projectStrokeOnPoints(this.points, options, this.isOpen());\n }\n\n /**\n * Calculate the polygon bounding box\n * @private\n */\n _calcDimensions(options?: Partial) {\n options = {\n scaleX: this.scaleX,\n scaleY: this.scaleY,\n skewX: this.skewX,\n skewY: this.skewY,\n strokeLineCap: this.strokeLineCap,\n strokeLineJoin: this.strokeLineJoin,\n strokeMiterLimit: this.strokeMiterLimit,\n strokeUniform: this.strokeUniform,\n strokeWidth: this.strokeWidth,\n ...(options || {}),\n };\n const points = this.exactBoundingBox\n ? this._projectStrokeOnPoints(\n options as TProjectStrokeOnPointsOptions,\n ).map((projection) => projection.projectedPoint)\n : this.points;\n if (points.length === 0) {\n return {\n left: 0,\n top: 0,\n width: 0,\n height: 0,\n pathOffset: new Point(),\n strokeOffset: new Point(),\n strokeDiff: new Point(),\n };\n }\n const bbox = makeBoundingBoxFromPoints(points),\n // Remove scale effect, since it's applied after\n matrix = calcDimensionsMatrix({ ...options, scaleX: 1, scaleY: 1 }),\n bboxNoStroke = makeBoundingBoxFromPoints(\n this.points.map((p) => transformPoint(p, matrix, true)),\n ),\n scale = new Point(this.scaleX, this.scaleY);\n let offsetX = bbox.left + bbox.width / 2,\n offsetY = bbox.top + bbox.height / 2;\n if (this.exactBoundingBox) {\n offsetX = offsetX - offsetY * Math.tan(degreesToRadians(this.skewX));\n // Order of those assignments is important.\n // offsetY relies on offsetX being already changed by the line above\n offsetY = offsetY - offsetX * Math.tan(degreesToRadians(this.skewY));\n }\n\n return {\n ...bbox,\n pathOffset: new Point(offsetX, offsetY),\n strokeOffset: new Point(bboxNoStroke.left, bboxNoStroke.top)\n .subtract(new Point(bbox.left, bbox.top))\n .multiply(scale),\n strokeDiff: new Point(bbox.width, bbox.height)\n .subtract(new Point(bboxNoStroke.width, bboxNoStroke.height))\n .multiply(scale),\n };\n }\n\n /**\n * This function is an helper for svg import. it returns the center of the object in the svg\n * untransformed coordinates, by look at the polyline/polygon points.\n * @private\n * @return {Point} center point from element coordinates\n */\n _findCenterFromElement(): Point {\n const bbox = makeBoundingBoxFromPoints(this.points);\n return new Point(bbox.left + bbox.width / 2, bbox.top + bbox.height / 2);\n }\n\n setDimensions() {\n this.setBoundingBox();\n }\n\n setBoundingBox(adjustPosition?: boolean) {\n const { left, top, width, height, pathOffset, strokeOffset, strokeDiff } =\n this._calcDimensions();\n this.set({ width, height, pathOffset, strokeOffset, strokeDiff });\n adjustPosition &&\n this.setPositionByOrigin(\n new Point(left + width / 2, top + height / 2),\n CENTER,\n CENTER,\n );\n }\n\n /**\n * @deprecated intermidiate method to be removed, do not use\n */\n protected isStrokeAccountedForInDimensions() {\n return this.exactBoundingBox;\n }\n\n /**\n * @override stroke is taken in account in size\n */\n _getNonTransformedDimensions() {\n return this.exactBoundingBox\n ? // TODO: fix this\n new Point(this.width, this.height)\n : super._getNonTransformedDimensions();\n }\n\n /**\n * @override stroke and skewing are taken into account when projecting stroke on points,\n * therefore we don't want the default calculation to account for skewing as well.\n * Though it is possible to pass `width` and `height` in `options`, doing so is very strange, use with discretion.\n *\n * @private\n */\n _getTransformedDimensions(options: any = {}) {\n if (this.exactBoundingBox) {\n let size: Point;\n /* When `strokeUniform = true`, any changes to the properties require recalculating the `width` and `height` because\n the stroke projections are affected.\n When `strokeUniform = false`, we don't need to recalculate for scale transformations, as the effect of scale on\n projections follows a linear function (e.g. scaleX of 2 just multiply width by 2)*/\n if (\n Object.keys(options).some(\n (key) =>\n this.strokeUniform ||\n (this.constructor as typeof Polyline).layoutProperties.includes(\n key as keyof TProjectStrokeOnPointsOptions,\n ),\n )\n ) {\n const { width, height } = this._calcDimensions(options);\n size = new Point(options.width ?? width, options.height ?? height);\n } else {\n size = new Point(\n options.width ?? this.width,\n options.height ?? this.height,\n );\n }\n return size.multiply(\n new Point(options.scaleX || this.scaleX, options.scaleY || this.scaleY),\n );\n } else {\n return super._getTransformedDimensions(options);\n }\n }\n\n /**\n * Recalculates dimensions when changing skew and scale\n * @private\n */\n _set(key: string, value: any) {\n const changed = this.initialized && this[key as keyof this] !== value;\n const output = super._set(key, value);\n if (\n this.exactBoundingBox &&\n changed &&\n (((key === SCALE_X || key === SCALE_Y) &&\n this.strokeUniform &&\n (this.constructor as typeof Polyline).layoutProperties.includes(\n 'strokeUniform',\n )) ||\n (this.constructor as typeof Polyline).layoutProperties.includes(\n key as keyof Polyline,\n ))\n ) {\n this.setDimensions();\n }\n return output;\n }\n\n /**\n * Returns object representation of an instance\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} Object representation of an instance\n */\n toObject<\n T extends Omit, keyof SProps>,\n K extends keyof T = never,\n >(propertiesToInclude: K[] = []): Pick & SProps {\n return {\n ...super.toObject(propertiesToInclude),\n points: this.points.map(({ x, y }) => ({ x, y })),\n };\n }\n\n /**\n * Returns svg representation of an instance\n * @return {Array} an array of strings with the specific svg representation\n * of the instance\n */\n _toSVG() {\n const points = [],\n diffX = this.pathOffset.x,\n diffY = this.pathOffset.y,\n NUM_FRACTION_DIGITS = config.NUM_FRACTION_DIGITS;\n\n for (let i = 0, len = this.points.length; i < len; i++) {\n points.push(\n toFixed(this.points[i].x - diffX, NUM_FRACTION_DIGITS),\n ',',\n toFixed(this.points[i].y - diffY, NUM_FRACTION_DIGITS),\n ' ',\n );\n }\n return [\n `<${\n (this.constructor as typeof Polyline).type.toLowerCase() as\n | 'polyline'\n | 'polygon'\n } `,\n 'COMMON_PARTS',\n `points=\"${points.join('')}\" />\\n`,\n ];\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _render(ctx: CanvasRenderingContext2D) {\n const len = this.points.length,\n x = this.pathOffset.x,\n y = this.pathOffset.y;\n\n if (!len || isNaN(this.points[len - 1].y)) {\n // do not draw if no points or odd points\n // NaN comes from parseFloat of a empty string in parser\n return;\n }\n ctx.beginPath();\n ctx.moveTo(this.points[0].x - x, this.points[0].y - y);\n for (let i = 0; i < len; i++) {\n const point = this.points[i];\n ctx.lineTo(point.x - x, point.y - y);\n }\n !this.isOpen() && ctx.closePath();\n this._renderPaintInOrder(ctx);\n }\n\n /**\n * Returns complexity of an instance\n * @return {Number} complexity of this instance\n */\n complexity(): number {\n return this.points.length;\n }\n\n /* _FROM_SVG_START_ */\n\n /**\n * List of attribute names to account for when parsing SVG element (used by {@link Polyline.fromElement})\n * @see: http://www.w3.org/TR/SVG/shapes.html#PolylineElement\n */\n static ATTRIBUTE_NAMES = [...SHARED_ATTRIBUTES];\n\n /**\n * Returns Polyline instance from an SVG element\n * @param {HTMLElement} element Element to parser\n * @param {Object} [options] Options object\n */\n static async fromElement(\n element: HTMLElement | SVGElement,\n options?: Abortable,\n cssRules?: CSSRules,\n ) {\n const points = parsePointsAttribute(element.getAttribute('points')),\n // we omit left and top to instruct the constructor to position the object using the bbox\n\n { left, top, ...parsedAttributes } = parseAttributes(\n element,\n this.ATTRIBUTE_NAMES,\n cssRules,\n );\n return new this(points, {\n ...parsedAttributes,\n ...options,\n });\n }\n\n /* _FROM_SVG_END_ */\n\n /**\n * Returns Polyline instance from an object representation\n * @param {Object} object Object to create an instance from\n * @returns {Promise}\n */\n static fromObject>(object: T) {\n return this._fromObject(object, {\n extraParam: 'points',\n });\n }\n}\n\nclassRegistry.setClass(Polyline);\nclassRegistry.setSVGClass(Polyline);\n","import { classRegistry } from '../ClassRegistry';\nimport { Polyline, polylineDefaultValues } from './Polyline';\n\nexport class Polygon extends Polyline {\n static ownDefaults = polylineDefaultValues;\n\n static type = 'Polygon';\n\n protected isOpen() {\n return false;\n }\n}\n\nclassRegistry.setClass(Polygon);\nclassRegistry.setSVGClass(Polygon);\n","import type { ObjectEvents } from '../../EventTypeDefs';\nimport type { FabricObjectProps, SerializedObjectProps } from '../Object/types';\nimport type { TOptions } from '../../typedefs';\nimport { FabricObject } from '../Object/FabricObject';\nimport { styleProperties } from './constants';\nimport type { StylePropertiesType } from './constants';\nimport type { FabricText } from './Text';\nimport { pick } from '../../util';\nimport { pickBy } from '../../util/misc/pick';\n\nexport type CompleteTextStyleDeclaration = Pick<\n FabricText,\n StylePropertiesType\n>;\n\nexport type TextStyleDeclaration = Partial;\n\nexport type TextStyle = {\n [line: number | string]: { [char: number | string]: TextStyleDeclaration };\n};\n\nexport abstract class StyledText<\n Props extends TOptions = Partial,\n SProps extends SerializedObjectProps = SerializedObjectProps,\n EventSpec extends ObjectEvents = ObjectEvents,\n> extends FabricObject {\n declare abstract styles: TextStyle;\n declare protected abstract _textLines: string[][];\n declare protected _forceClearCache: boolean;\n static _styleProperties: Readonly = styleProperties;\n abstract get2DCursorLocation(\n selectionStart: number,\n skipWrapping?: boolean,\n ): { charIndex: number; lineIndex: number };\n\n /**\n * Returns true if object has no styling or no styling in a line\n * @param {Number} lineIndex , lineIndex is on wrapped lines.\n * @return {Boolean}\n */\n isEmptyStyles(lineIndex?: number): boolean {\n if (!this.styles) {\n return true;\n }\n if (typeof lineIndex !== 'undefined' && !this.styles[lineIndex]) {\n return true;\n }\n const obj =\n typeof lineIndex === 'undefined'\n ? this.styles\n : { line: this.styles[lineIndex] };\n for (const p1 in obj) {\n for (const p2 in obj[p1]) {\n // eslint-disable-next-line no-unused-vars\n for (const p3 in obj[p1][p2]) {\n return false;\n }\n }\n }\n return true;\n }\n\n /**\n * Returns true if object has a style property or has it ina specified line\n * This function is used to detect if a text will use a particular property or not.\n * @param {String} property to check for\n * @param {Number} lineIndex to check the style on\n * @return {Boolean}\n */\n styleHas(property: keyof TextStyleDeclaration, lineIndex?: number): boolean {\n if (!this.styles) {\n return false;\n }\n if (typeof lineIndex !== 'undefined' && !this.styles[lineIndex]) {\n return false;\n }\n const obj =\n typeof lineIndex === 'undefined'\n ? this.styles\n : { 0: this.styles[lineIndex] };\n // eslint-disable-next-line\n for (const p1 in obj) {\n // eslint-disable-next-line\n for (const p2 in obj[p1]) {\n if (typeof obj[p1][p2][property] !== 'undefined') {\n return true;\n }\n }\n }\n return false;\n }\n\n /**\n * Check if characters in a text have a value for a property\n * whose value matches the textbox's value for that property. If so,\n * the character-level property is deleted. If the character\n * has no other properties, then it is also deleted. Finally,\n * if the line containing that character has no other characters\n * then it also is deleted.\n */\n cleanStyle(property: keyof TextStyleDeclaration) {\n if (!this.styles) {\n return false;\n }\n const obj = this.styles;\n let stylesCount = 0,\n letterCount,\n stylePropertyValue,\n allStyleObjectPropertiesMatch = true,\n graphemeCount = 0;\n for (const p1 in obj) {\n letterCount = 0;\n for (const p2 in obj[p1]) {\n const styleObject = obj[p1][p2] || {},\n stylePropertyHasBeenSet = styleObject[property] !== undefined;\n\n stylesCount++;\n\n if (stylePropertyHasBeenSet) {\n if (!stylePropertyValue) {\n stylePropertyValue = styleObject[property];\n } else if (styleObject[property] !== stylePropertyValue) {\n allStyleObjectPropertiesMatch = false;\n }\n\n if (styleObject[property] === this[property as keyof this]) {\n delete styleObject[property];\n }\n } else {\n allStyleObjectPropertiesMatch = false;\n }\n\n if (Object.keys(styleObject).length !== 0) {\n letterCount++;\n } else {\n delete obj[p1][p2];\n }\n }\n\n if (letterCount === 0) {\n delete obj[p1];\n }\n }\n // if every grapheme has the same style set then\n // delete those styles and set it on the parent\n for (let i = 0; i < this._textLines.length; i++) {\n graphemeCount += this._textLines[i].length;\n }\n if (allStyleObjectPropertiesMatch && stylesCount === graphemeCount) {\n this[property as keyof this] = stylePropertyValue as any;\n this.removeStyle(property);\n }\n }\n\n /**\n * Remove a style property or properties from all individual character styles\n * in a text object. Deletes the character style object if it contains no other style\n * props. Deletes a line style object if it contains no other character styles.\n *\n * @param {String} props The property to remove from character styles.\n */\n removeStyle(property: keyof TextStyleDeclaration) {\n if (!this.styles) {\n return;\n }\n const obj = this.styles;\n let line, lineNum, charNum;\n for (lineNum in obj) {\n line = obj[lineNum];\n for (charNum in line) {\n delete line[charNum][property];\n if (Object.keys(line[charNum]).length === 0) {\n delete line[charNum];\n }\n }\n if (Object.keys(line).length === 0) {\n delete obj[lineNum];\n }\n }\n }\n\n private _extendStyles(index: number, style: TextStyleDeclaration): void {\n const { lineIndex, charIndex } = this.get2DCursorLocation(index);\n\n if (!this._getLineStyle(lineIndex)) {\n this._setLineStyle(lineIndex);\n }\n\n const newStyle = pickBy(\n {\n // first create a new object that is a merge of existing and new\n ...this._getStyleDeclaration(lineIndex, charIndex),\n ...style,\n // use the predicate to discard undefined values\n },\n (value) => value !== undefined,\n );\n\n // finally assign to the old position the new style\n this._setStyleDeclaration(lineIndex, charIndex, newStyle);\n }\n\n /**\n * Gets style of a current selection/cursor (at the start position)\n * @param {Number} startIndex Start index to get styles at\n * @param {Number} endIndex End index to get styles at, if not specified startIndex + 1\n * @param {Boolean} [complete] get full style or not\n * @return {Array} styles an array with one, zero or more Style objects\n */\n getSelectionStyles(\n startIndex: number,\n endIndex?: number,\n complete?: boolean,\n ): TextStyleDeclaration[] {\n const styles: TextStyleDeclaration[] = [];\n for (let i = startIndex; i < (endIndex || startIndex); i++) {\n styles.push(this.getStyleAtPosition(i, complete));\n }\n return styles;\n }\n\n /**\n * Gets style of a current selection/cursor position\n * @param {Number} position to get styles at\n * @param {Boolean} [complete] full style if true\n * @return {Object} style Style object at a specified index\n * @private\n */\n getStyleAtPosition(position: number, complete?: boolean) {\n const { lineIndex, charIndex } = this.get2DCursorLocation(position);\n return complete\n ? this.getCompleteStyleDeclaration(lineIndex, charIndex)\n : this._getStyleDeclaration(lineIndex, charIndex);\n }\n\n /**\n * Sets style of a current selection, if no selection exist, do not set anything.\n * @param {Object} styles Styles object\n * @param {Number} startIndex Start index to get styles at\n * @param {Number} [endIndex] End index to get styles at, if not specified startIndex + 1\n */\n setSelectionStyles(styles: object, startIndex: number, endIndex?: number) {\n for (let i = startIndex; i < (endIndex || startIndex); i++) {\n this._extendStyles(i, styles);\n }\n /* not included in _extendStyles to avoid clearing cache more than once */\n this._forceClearCache = true;\n }\n\n /**\n * Get a reference, not a clone, to the style object for a given character,\n * if no style is set for a line or char, return a new empty object.\n * This is tricky and confusing because when you get an empty object you can't\n * determine if it is a reference or a new one.\n * @TODO this should always return a reference or always a clone or undefined when necessary.\n * @protected\n * @param {Number} lineIndex\n * @param {Number} charIndex\n * @return {TextStyleDeclaration} a style object reference to the existing one or a new empty object when undefined\n */\n _getStyleDeclaration(\n lineIndex: number,\n charIndex: number,\n ): TextStyleDeclaration {\n const lineStyle = this.styles && this.styles[lineIndex];\n return lineStyle ? (lineStyle[charIndex] ?? {}) : {};\n }\n\n /**\n * return a new object that contains all the style property for a character\n * the object returned is newly created\n * @param {Number} lineIndex of the line where the character is\n * @param {Number} charIndex position of the character on the line\n * @return {Object} style object\n */\n getCompleteStyleDeclaration(\n lineIndex: number,\n charIndex: number,\n ): CompleteTextStyleDeclaration {\n return {\n ...pick(\n this,\n (this.constructor as typeof StyledText)\n ._styleProperties as (keyof this)[],\n ),\n ...this._getStyleDeclaration(lineIndex, charIndex),\n } as CompleteTextStyleDeclaration;\n }\n\n /**\n * @param {Number} lineIndex\n * @param {Number} charIndex\n * @param {Object} style\n * @private\n */\n protected _setStyleDeclaration(\n lineIndex: number,\n charIndex: number,\n style: object,\n ) {\n this.styles[lineIndex][charIndex] = style;\n }\n\n /**\n *\n * @param {Number} lineIndex\n * @param {Number} charIndex\n * @private\n */\n protected _deleteStyleDeclaration(lineIndex: number, charIndex: number) {\n delete this.styles[lineIndex][charIndex];\n }\n\n /**\n * @param {Number} lineIndex\n * @return {Boolean} if the line exists or not\n * @private\n */\n protected _getLineStyle(lineIndex: number): boolean {\n return !!this.styles[lineIndex];\n }\n\n /**\n * Set the line style to an empty object so that is initialized\n * @param {Number} lineIndex\n * @private\n */\n protected _setLineStyle(lineIndex: number) {\n this.styles[lineIndex] = {};\n }\n\n protected _deleteLineStyle(lineIndex: number) {\n delete this.styles[lineIndex];\n }\n}\n","import { config } from '../../config';\nimport type { TSVGReviver } from '../../typedefs';\nimport { escapeXml } from '../../util/lang_string';\nimport { colorPropToSVG, createSVGRect } from '../../util/misc/svgParsing';\nimport { hasStyleChanged } from '../../util/misc/textStyles';\nimport { toFixed } from '../../util/misc/toFixed';\nimport { FabricObjectSVGExportMixin } from '../Object/FabricObjectSVGExportMixin';\nimport { type TextStyleDeclaration } from './StyledText';\nimport { JUSTIFY } from '../Text/constants';\nimport type { FabricText, GraphemeBBox } from './Text';\nimport { STROKE, FILL } from '../../constants';\nimport { createRotateMatrix } from '../../util/misc/matrix';\nimport { radiansToDegrees } from '../../util/misc/radiansDegreesConversion';\nimport { Point } from '../../Point';\nimport { matrixToSVG } from '../../util/misc/svgExport';\n\nconst multipleSpacesRegex = / +/g;\nconst dblQuoteRegex = /\"/g;\n\nfunction createSVGInlineRect(\n color: string,\n left: number,\n top: number,\n width: number,\n height: number,\n) {\n return `\\t\\t${createSVGRect(color, { left, top, width, height })}\\n`;\n}\n\nexport class TextSVGExportMixin extends FabricObjectSVGExportMixin {\n _toSVG(this: TextSVGExportMixin & FabricText): string[] {\n const offsets = this._getSVGLeftTopOffsets(),\n textAndBg = this._getSVGTextAndBg(offsets.textTop, offsets.textLeft);\n return this._wrapSVGTextAndBg(textAndBg);\n }\n\n toSVG(this: TextSVGExportMixin & FabricText, reviver?: TSVGReviver): string {\n const textSvg = this._createBaseSVGMarkup(this._toSVG(), {\n reviver,\n noStyle: true,\n withShadow: true,\n }),\n path = this.path;\n if (path) {\n return (\n textSvg +\n path._createBaseSVGMarkup(path._toSVG(), {\n reviver,\n withShadow: true,\n additionalTransform: matrixToSVG(this.calcOwnMatrix()),\n })\n );\n }\n return textSvg;\n }\n\n private _getSVGLeftTopOffsets(this: TextSVGExportMixin & FabricText) {\n return {\n textLeft: -this.width / 2,\n textTop: -this.height / 2,\n lineTop: this.getHeightOfLine(0),\n };\n }\n\n private _wrapSVGTextAndBg(\n this: TextSVGExportMixin & FabricText,\n {\n textBgRects,\n textSpans,\n }: {\n textSpans: string[];\n textBgRects: string[];\n },\n ) {\n const noShadow = true,\n textDecoration = this.getSvgTextDecoration(this);\n return [\n textBgRects.join(''),\n '\\t\\t',\n textSpans.join(''),\n '\\n',\n ];\n }\n\n /**\n * @private\n * @param {Number} textTopOffset Text top offset\n * @param {Number} textLeftOffset Text left offset\n * @return {Object}\n */\n private _getSVGTextAndBg(\n this: TextSVGExportMixin & FabricText,\n textTopOffset: number,\n textLeftOffset: number,\n ) {\n const textSpans: string[] = [],\n textBgRects: string[] = [];\n let height = textTopOffset,\n lineOffset;\n\n // bounding-box background\n this.backgroundColor &&\n textBgRects.push(\n ...createSVGInlineRect(\n this.backgroundColor,\n -this.width / 2,\n -this.height / 2,\n this.width,\n this.height,\n ),\n );\n\n // text and text-background\n for (let i = 0, len = this._textLines.length; i < len; i++) {\n lineOffset = this._getLineLeftOffset(i);\n if (this.direction === 'rtl') {\n lineOffset += this.width;\n }\n if (this.textBackgroundColor || this.styleHas('textBackgroundColor', i)) {\n this._setSVGTextLineBg(\n textBgRects,\n i,\n textLeftOffset + lineOffset,\n height,\n );\n }\n this._setSVGTextLineText(\n textSpans,\n i,\n textLeftOffset + lineOffset,\n height,\n );\n height += this.getHeightOfLine(i);\n }\n\n return {\n textSpans,\n textBgRects,\n };\n }\n\n private _createTextCharSpan(\n this: TextSVGExportMixin & FabricText,\n char: string,\n styleDecl: TextStyleDeclaration,\n left: number,\n top: number,\n charBox: GraphemeBBox,\n ) {\n const numFractionDigit = config.NUM_FRACTION_DIGITS;\n const styleProps = this.getSvgSpanStyles(\n styleDecl,\n char !== char.trim() || !!char.match(multipleSpacesRegex),\n ),\n fillStyles = styleProps ? `style=\"${styleProps}\"` : '',\n dy = styleDecl.deltaY,\n dySpan = dy ? ` dy=\"${toFixed(dy, numFractionDigit)}\" ` : '',\n { angle, renderLeft, renderTop, width } = charBox;\n let angleAttr = '';\n if (renderLeft !== undefined) {\n const wBy2 = width / 2;\n angle &&\n (angleAttr = ` rotate=\"${toFixed(radiansToDegrees(angle), numFractionDigit)}\"`);\n const m = createRotateMatrix({ angle: radiansToDegrees(angle!) });\n m[4] = renderLeft!;\n m[5] = renderTop!;\n const renderPoint = new Point(-wBy2, 0).transform(m);\n left = renderPoint.x;\n top = renderPoint.y;\n }\n\n return `${escapeXml(char)}`;\n }\n\n private _setSVGTextLineText(\n this: TextSVGExportMixin & FabricText,\n textSpans: string[],\n lineIndex: number,\n textLeftOffset: number,\n textTopOffset: number,\n ) {\n const lineHeight = this.getHeightOfLine(lineIndex),\n isJustify = this.textAlign.includes(JUSTIFY),\n line = this._textLines[lineIndex];\n let actualStyle,\n nextStyle,\n charsToRender = '',\n charBox,\n style,\n boxWidth = 0,\n timeToRender;\n\n textTopOffset +=\n (lineHeight * (1 - this._fontSizeFraction)) / this.lineHeight;\n for (let i = 0, len = line.length - 1; i <= len; i++) {\n timeToRender = i === len || this.charSpacing || this.path;\n charsToRender += line[i];\n charBox = this.__charBounds[lineIndex][i];\n if (boxWidth === 0) {\n textLeftOffset += charBox.kernedWidth - charBox.width;\n boxWidth += charBox.width;\n } else {\n boxWidth += charBox.kernedWidth;\n }\n if (isJustify && !timeToRender) {\n if (this._reSpaceAndTab.test(line[i])) {\n timeToRender = true;\n }\n }\n if (!timeToRender) {\n // if we have charSpacing or a path, we render char by char\n actualStyle =\n actualStyle || this.getCompleteStyleDeclaration(lineIndex, i);\n nextStyle = this.getCompleteStyleDeclaration(lineIndex, i + 1);\n timeToRender = hasStyleChanged(actualStyle, nextStyle, true);\n }\n if (timeToRender) {\n style = this._getStyleDeclaration(lineIndex, i);\n textSpans.push(\n this._createTextCharSpan(\n charsToRender,\n style,\n textLeftOffset,\n textTopOffset,\n charBox,\n ),\n );\n charsToRender = '';\n actualStyle = nextStyle;\n if (this.direction === 'rtl') {\n textLeftOffset -= boxWidth;\n } else {\n textLeftOffset += boxWidth;\n }\n boxWidth = 0;\n }\n }\n }\n\n private _setSVGTextLineBg(\n this: TextSVGExportMixin & FabricText,\n textBgRects: (string | number)[],\n i: number,\n leftOffset: number,\n textTopOffset: number,\n ) {\n const line = this._textLines[i],\n heightOfLine = this.getHeightOfLine(i) / this.lineHeight;\n let boxWidth = 0,\n boxStart = 0,\n currentColor,\n lastColor = this.getValueOfPropertyAt(i, 0, 'textBackgroundColor');\n for (let j = 0; j < line.length; j++) {\n const { left, width, kernedWidth } = this.__charBounds[i][j];\n currentColor = this.getValueOfPropertyAt(i, j, 'textBackgroundColor');\n if (currentColor !== lastColor) {\n lastColor &&\n textBgRects.push(\n ...createSVGInlineRect(\n lastColor,\n leftOffset + boxStart,\n textTopOffset,\n boxWidth,\n heightOfLine,\n ),\n );\n boxStart = left;\n boxWidth = width;\n lastColor = currentColor;\n } else {\n boxWidth += kernedWidth;\n }\n }\n currentColor &&\n textBgRects.push(\n ...createSVGInlineRect(\n lastColor,\n leftOffset + boxStart,\n textTopOffset,\n boxWidth,\n heightOfLine,\n ),\n );\n }\n\n /**\n * Returns styles-string for svg-export\n * @param {Boolean} skipShadow a boolean to skip shadow filter output\n * @return {String}\n */\n getSvgStyles(this: TextSVGExportMixin & FabricText, skipShadow?: boolean) {\n return `${super.getSvgStyles(skipShadow)} text-decoration-thickness: ${toFixed((this.textDecorationThickness * this.getObjectScaling().y) / 10, config.NUM_FRACTION_DIGITS)}%; white-space: pre;`;\n }\n\n /**\n * Returns styles-string for svg-export\n * @param {Object} style the object from which to retrieve style properties\n * @param {Boolean} useWhiteSpace a boolean to include an additional attribute in the style.\n * @return {String}\n */\n getSvgSpanStyles(\n this: TextSVGExportMixin & FabricText,\n style: TextStyleDeclaration,\n useWhiteSpace?: boolean,\n ) {\n const {\n fontFamily,\n strokeWidth,\n stroke,\n fill,\n fontSize,\n fontStyle,\n fontWeight,\n deltaY,\n textDecorationThickness,\n linethrough,\n overline,\n underline,\n } = style;\n\n const textDecoration = this.getSvgTextDecoration({\n underline: underline ?? this.underline,\n overline: overline ?? this.overline,\n linethrough: linethrough ?? this.linethrough,\n });\n const thickness = textDecorationThickness || this.textDecorationThickness;\n return [\n stroke ? colorPropToSVG(STROKE, stroke) : '',\n strokeWidth ? `stroke-width: ${strokeWidth}; ` : '',\n fontFamily\n ? `font-family: ${\n !fontFamily.includes(\"'\") && !fontFamily.includes('\"')\n ? `'${fontFamily}'`\n : fontFamily\n }; `\n : '',\n fontSize ? `font-size: ${fontSize}px; ` : '',\n fontStyle ? `font-style: ${fontStyle}; ` : '',\n fontWeight ? `font-weight: ${fontWeight}; ` : '',\n textDecoration\n ? `text-decoration: ${textDecoration}; text-decoration-thickness: ${toFixed((thickness * this.getObjectScaling().y) / 10, config.NUM_FRACTION_DIGITS)}%; `\n : '',\n fill ? colorPropToSVG(FILL, fill) : '',\n deltaY ? `baseline-shift: ${-deltaY}; ` : '',\n useWhiteSpace ? 'white-space: pre; ' : '',\n ].join('');\n }\n\n /**\n * Returns text-decoration property for svg-export\n * @param {Object} style the object from which to retrieve style properties\n * @return {String}\n */\n getSvgTextDecoration(\n this: TextSVGExportMixin & FabricText,\n style: TextStyleDeclaration,\n ) {\n return (['overline', 'underline', 'line-through'] as const)\n .filter(\n (decoration) =>\n style[\n decoration.replace('-', '') as\n | 'overline'\n | 'underline'\n | 'linethrough'\n ],\n )\n .join(' ');\n }\n}\n","import { cache } from '../../cache';\nimport { DEFAULT_SVG_FONT_SIZE, FILL, STROKE } from '../../constants';\nimport type { ObjectEvents } from '../../EventTypeDefs';\nimport type {\n CompleteTextStyleDeclaration,\n TextStyle,\n TextStyleDeclaration,\n} from './StyledText';\nimport { StyledText } from './StyledText';\nimport { SHARED_ATTRIBUTES } from '../../parser/attributes';\nimport { parseAttributes } from '../../parser/parseAttributes';\nimport type {\n Abortable,\n TCacheCanvasDimensions,\n TClassProperties,\n TFiller,\n TOptions,\n} from '../../typedefs';\nimport { classRegistry } from '../../ClassRegistry';\nimport { graphemeSplit } from '../../util/lang_string';\nimport { createCanvasElementFor } from '../../util/misc/dom';\nimport type { TextStyleArray } from '../../util/misc/textStyles';\nimport {\n hasStyleChanged,\n stylesFromArray,\n stylesToArray,\n} from '../../util/misc/textStyles';\nimport { getPathSegmentsInfo, getPointOnPath } from '../../util/path';\nimport { cacheProperties } from '../Object/FabricObject';\nimport type { Path } from '../Path';\nimport { TextSVGExportMixin } from './TextSVGExportMixin';\nimport { applyMixins } from '../../util/applyMixins';\nimport type { FabricObjectProps, SerializedObjectProps } from '../Object/types';\nimport type { StylePropertiesType } from './constants';\nimport {\n additionalProps,\n textDefaultValues,\n textLayoutProperties,\n JUSTIFY,\n JUSTIFY_CENTER,\n JUSTIFY_LEFT,\n JUSTIFY_RIGHT,\n TEXT_DECORATION_THICKNESS,\n} from './constants';\nimport { CENTER, LEFT, RIGHT, TOP, BOTTOM } from '../../constants';\nimport { isFiller } from '../../util/typeAssertions';\nimport type { Gradient } from '../../gradient/Gradient';\nimport type { Pattern } from '../../Pattern';\nimport type { CSSRules } from '../../parser/typedefs';\n\nlet measuringContext: CanvasRenderingContext2D | null;\n\n/**\n * Return a context for measurement of text string.\n * if created it gets stored for reuse\n */\nfunction getMeasuringContext() {\n if (!measuringContext) {\n const canvas = createCanvasElementFor({\n width: 0,\n height: 0,\n });\n measuringContext = canvas.getContext('2d');\n }\n return measuringContext;\n}\n\nexport type TPathSide = 'left' | 'right';\n\nexport type TPathAlign = 'baseline' | 'center' | 'ascender' | 'descender';\n\nexport type TextLinesInfo = {\n lines: string[];\n graphemeLines: string[][];\n graphemeText: string[];\n _unwrappedLines: string[][];\n};\n\n/**\n * Measure and return the info of a single grapheme.\n * needs the the info of previous graphemes already filled\n * Override to customize measuring\n */\nexport type GraphemeBBox = {\n width: number;\n height: number;\n kernedWidth: number;\n left: number;\n deltaY: number;\n renderLeft?: number;\n renderTop?: number;\n angle?: number;\n};\n\n// @TODO this is not complete\ninterface UniqueTextProps {\n charSpacing: number;\n lineHeight: number;\n fontSize: number;\n fontWeight: string | number;\n fontFamily: string;\n fontStyle: string;\n pathSide: TPathSide;\n pathAlign: TPathAlign;\n underline: boolean;\n overline: boolean;\n linethrough: boolean;\n textAlign: string;\n direction: CanvasDirection;\n path?: Path;\n textDecorationThickness: number;\n}\n\nexport interface SerializedTextProps\n extends SerializedObjectProps,\n UniqueTextProps {\n styles: TextStyleArray | TextStyle;\n}\n\nexport interface TextProps extends FabricObjectProps, UniqueTextProps {\n styles: TextStyle;\n}\n\n/**\n * Text class\n * @see {@link http://fabric5.fabricjs.com/fabric-intro-part-2#text}\n */\nexport class FabricText<\n Props extends TOptions = Partial,\n SProps extends SerializedTextProps = SerializedTextProps,\n EventSpec extends ObjectEvents = ObjectEvents,\n >\n extends StyledText\n implements UniqueTextProps\n{\n /**\n * Properties that requires a text layout recalculation when changed\n * @type string[]\n * @protected\n */\n static textLayoutProperties: string[] = textLayoutProperties;\n\n /**\n * @private\n */\n declare _reNewline: RegExp;\n\n /**\n * Use this regular expression to filter for whitespaces that is not a new line.\n * Mostly used when text is 'justify' aligned.\n * @private\n */\n declare _reSpacesAndTabs: RegExp;\n\n /**\n * Use this regular expression to filter for whitespace that is not a new line.\n * Mostly used when text is 'justify' aligned.\n * @private\n */\n declare _reSpaceAndTab: RegExp;\n\n /**\n * Use this regular expression to filter consecutive groups of non spaces.\n * Mostly used when text is 'justify' aligned.\n * @private\n */\n declare _reWords: RegExp;\n\n declare text: string;\n\n /**\n * Font size (in pixels)\n * @type Number\n */\n declare fontSize: number;\n\n /**\n * Font weight (e.g. bold, normal, 400, 600, 800)\n * @type {(Number|String)}\n */\n declare fontWeight: string | number;\n\n /**\n * Font family\n * @type String\n */\n declare fontFamily: string;\n\n /**\n * Text decoration underline.\n * @type Boolean\n */\n declare underline: boolean;\n\n /**\n * Text decoration overline.\n * @type Boolean\n */\n declare overline: boolean;\n\n /**\n * Text decoration linethrough.\n * @type Boolean\n */\n declare linethrough: boolean;\n\n /**\n * Text alignment. Possible values: \"left\", \"center\", \"right\", \"justify\",\n * \"justify-left\", \"justify-center\" or \"justify-right\".\n * @type String\n */\n declare textAlign: string;\n\n /**\n * Font style . Possible values: \"\", \"normal\", \"italic\" or \"oblique\".\n * @type String\n */\n declare fontStyle: string;\n\n /**\n * Line height\n * @type Number\n */\n declare lineHeight: number;\n\n /**\n * Superscript schema object (minimum overlap)\n */\n declare superscript: {\n /**\n * fontSize factor\n * @default 0.6\n */\n size: number;\n /**\n * baseline-shift factor (upwards)\n * @default -0.35\n */\n baseline: number;\n };\n\n /**\n * Subscript schema object (minimum overlap)\n */\n declare subscript: {\n /**\n * fontSize factor\n * @default 0.6\n */\n size: number;\n /**\n * baseline-shift factor (downwards)\n * @default 0.11\n */\n baseline: number;\n };\n\n /**\n * Background color of text lines\n * @type String\n */\n declare textBackgroundColor: string;\n\n declare styles: TextStyle;\n\n /**\n * Path that the text should follow.\n * since 4.6.0 the path will be drawn automatically.\n * if you want to make the path visible, give it a stroke and strokeWidth or fill value\n * if you want it to be hidden, assign visible = false to the path.\n * This feature is in BETA, and SVG import/export is not yet supported.\n * @type Path\n * @example\n * const textPath = new Text('Text on a path', {\n * top: 150,\n * left: 150,\n * textAlign: 'center',\n * charSpacing: -50,\n * path: new Path('M 0 0 C 50 -100 150 -100 200 0', {\n * strokeWidth: 1,\n * visible: false\n * }),\n * pathSide: 'left',\n * pathStartOffset: 0\n * });\n */\n declare path?: Path;\n\n /**\n * The text decoration tickness for underline, overline and strikethrough\n * The tickness is expressed in thousandths of fontSize ( em ).\n * The original value was 1/15 that translates to 66.6667 thousandths.\n * The choice of unit of measure is to align with charSpacing.\n * You can slim the tickness without issues, while large underline or overline may end up\n * outside the bounding box of the text. In order to fix that a bigger refactor of the code\n * is needed and is out of scope for now. If you need such large overline on the first line\n * of text or large underline on the last line of text, consider disabling caching as a\n * workaround\n * @default 66.667\n */\n declare textDecorationThickness: number;\n\n /**\n * Offset amount for text path starting position\n * Only used when text has a path\n */\n declare pathStartOffset: number;\n\n /**\n * Which side of the path the text should be drawn on.\n * Only used when text has a path\n * @type {TPathSide} 'left|right'\n */\n declare pathSide: TPathSide;\n\n /**\n * How text is aligned to the path. This property determines\n * the perpendicular position of each character relative to the path.\n * (one of \"baseline\", \"center\", \"ascender\", \"descender\")\n * This feature is in BETA, and its behavior may change\n * @type TPathAlign\n */\n declare pathAlign: TPathAlign;\n\n /**\n * @private\n */\n declare _fontSizeFraction: number;\n\n /**\n * @private\n */\n declare offsets: { underline: number; linethrough: number; overline: number };\n\n /**\n * Text Line proportion to font Size (in pixels)\n * @type Number\n */\n declare _fontSizeMult: number;\n\n /**\n * additional space between characters\n * expressed in thousands of em unit\n * @type Number\n */\n declare charSpacing: number;\n\n /**\n * Baseline shift, styles only, keep at 0 for the main text object\n * @type {Number}\n */\n declare deltaY: number;\n\n /**\n * WARNING: EXPERIMENTAL. NOT SUPPORTED YET\n * determine the direction of the text.\n * This has to be set manually together with textAlign and originX for proper\n * experience.\n * some interesting link for the future\n * https://www.w3.org/International/questions/qa-bidi-unicode-controls\n * @since 4.5.0\n * @type {CanvasDirection} 'ltr|rtl'\n */\n declare direction: CanvasDirection;\n\n /**\n * contains characters bounding boxes\n * This variable is considered to be protected.\n * But for how mixins are implemented right now, we can't leave it private\n * @protected\n */\n __charBounds: GraphemeBBox[][] = [];\n\n /**\n * use this size when measuring text. To avoid IE11 rounding errors\n * @type {Number}\n * @readonly\n * @private\n */\n declare CACHE_FONT_SIZE: number;\n\n /**\n * contains the min text width to avoid getting 0\n * @type {Number}\n */\n declare MIN_TEXT_WIDTH: number;\n\n /**\n * contains the the text of the object, divided in lines as they are displayed\n * on screen. Wrapping will divide the text independently of line breaks\n * @type {string[]}\n */\n declare textLines: string[];\n\n /**\n * same as textlines, but each line is an array of graphemes as split by splitByGrapheme\n * @type {string[]}\n */\n declare _textLines: string[][];\n\n declare _unwrappedTextLines: string[][];\n declare _text: string[];\n declare cursorWidth: number;\n declare __lineHeights: number[];\n declare __lineWidths: number[];\n declare initialized?: true;\n\n static cacheProperties = [...cacheProperties, ...additionalProps];\n\n static ownDefaults = textDefaultValues;\n\n static type = 'Text';\n\n static getDefaults(): Record {\n return { ...super.getDefaults(), ...FabricText.ownDefaults };\n }\n\n constructor(text: string, options?: Props) {\n super();\n Object.assign(this, FabricText.ownDefaults);\n this.setOptions(options);\n if (!this.styles) {\n this.styles = {};\n }\n this.text = text;\n this.initialized = true;\n if (this.path) {\n this.setPathInfo();\n }\n this.initDimensions();\n this.setCoords();\n }\n\n /**\n * If text has a path, it will add the extra information needed\n * for path and text calculations\n */\n setPathInfo() {\n const path = this.path;\n if (path) {\n path.segmentsInfo = getPathSegmentsInfo(path.path);\n }\n }\n\n /**\n * @private\n * Divides text into lines of text and lines of graphemes.\n */\n _splitText(): TextLinesInfo {\n const newLines = this._splitTextIntoLines(this.text);\n this.textLines = newLines.lines;\n this._textLines = newLines.graphemeLines;\n this._unwrappedTextLines = newLines._unwrappedLines;\n this._text = newLines.graphemeText;\n return newLines;\n }\n\n /**\n * Initialize or update text dimensions.\n * Updates this.width and this.height with the proper values.\n * Does not return dimensions.\n */\n initDimensions() {\n this._splitText();\n this._clearCache();\n this.dirty = true;\n if (this.path) {\n this.width = this.path.width;\n this.height = this.path.height;\n } else {\n this.width =\n this.calcTextWidth() || this.cursorWidth || this.MIN_TEXT_WIDTH;\n this.height = this.calcTextHeight();\n }\n if (this.textAlign.includes(JUSTIFY)) {\n // once text is measured we need to make space fatter to make justified text.\n this.enlargeSpaces();\n }\n }\n\n /**\n * Enlarge space boxes and shift the others\n */\n enlargeSpaces() {\n let diffSpace,\n currentLineWidth,\n numberOfSpaces,\n accumulatedSpace,\n line,\n charBound,\n spaces;\n for (let i = 0, len = this._textLines.length; i < len; i++) {\n if (\n this.textAlign !== JUSTIFY &&\n (i === len - 1 || this.isEndOfWrapping(i))\n ) {\n continue;\n }\n accumulatedSpace = 0;\n line = this._textLines[i];\n currentLineWidth = this.getLineWidth(i);\n if (\n currentLineWidth < this.width &&\n (spaces = this.textLines[i].match(this._reSpacesAndTabs))\n ) {\n numberOfSpaces = spaces.length;\n diffSpace = (this.width - currentLineWidth) / numberOfSpaces;\n for (let j = 0; j <= line.length; j++) {\n charBound = this.__charBounds[i][j];\n if (this._reSpaceAndTab.test(line[j])) {\n charBound.width += diffSpace;\n charBound.kernedWidth += diffSpace;\n charBound.left += accumulatedSpace;\n accumulatedSpace += diffSpace;\n } else {\n charBound.left += accumulatedSpace;\n }\n }\n }\n }\n }\n\n /**\n * Detect if the text line is ended with an hard break\n * text and itext do not have wrapping, return false\n * @return {Boolean}\n */\n isEndOfWrapping(lineIndex: number): boolean {\n return lineIndex === this._textLines.length - 1;\n }\n\n /**\n * Detect if a line has a linebreak and so we need to account for it when moving\n * and counting style.\n * It return always 1 for text and Itext. Textbox has its own implementation\n * @return Number\n */\n missingNewlineOffset(lineIndex: number, skipWrapping?: boolean): 0 | 1;\n missingNewlineOffset(_lineIndex: number): 1 {\n return 1;\n }\n\n /**\n * Returns 2d representation (lineIndex and charIndex) of cursor\n * @param {Number} selectionStart\n * @param {Boolean} [skipWrapping] consider the location for unwrapped lines. useful to manage styles.\n */\n get2DCursorLocation(selectionStart: number, skipWrapping?: boolean) {\n const lines = skipWrapping ? this._unwrappedTextLines : this._textLines;\n let i: number;\n for (i = 0; i < lines.length; i++) {\n if (selectionStart <= lines[i].length) {\n return {\n lineIndex: i,\n charIndex: selectionStart,\n };\n }\n selectionStart -=\n lines[i].length + this.missingNewlineOffset(i, skipWrapping);\n }\n return {\n lineIndex: i - 1,\n charIndex:\n lines[i - 1].length < selectionStart\n ? lines[i - 1].length\n : selectionStart,\n };\n }\n\n /**\n * Returns string representation of an instance\n * @return {String} String representation of text object\n */\n toString(): string {\n return `#`;\n }\n\n /**\n * Return the dimension and the zoom level needed to create a cache canvas\n * big enough to host the object to be cached.\n * @private\n * @param {Object} dim.x width of object to be cached\n * @param {Object} dim.y height of object to be cached\n * @return {Object}.width width of canvas\n * @return {Object}.height height of canvas\n * @return {Object}.zoomX zoomX zoom value to unscale the canvas before drawing cache\n * @return {Object}.zoomY zoomY zoom value to unscale the canvas before drawing cache\n */\n _getCacheCanvasDimensions(): TCacheCanvasDimensions {\n const dims = super._getCacheCanvasDimensions();\n const fontSize = this.fontSize;\n dims.width += fontSize * dims.zoomX;\n dims.height += fontSize * dims.zoomY;\n return dims;\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _render(ctx: CanvasRenderingContext2D) {\n const path = this.path;\n path && !path.isNotVisible() && path._render(ctx);\n this._setTextStyles(ctx);\n this._renderTextLinesBackground(ctx);\n this._renderTextDecoration(ctx, 'underline');\n this._renderText(ctx);\n this._renderTextDecoration(ctx, 'overline');\n this._renderTextDecoration(ctx, 'linethrough');\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _renderText(ctx: CanvasRenderingContext2D) {\n if (this.paintFirst === STROKE) {\n this._renderTextStroke(ctx);\n this._renderTextFill(ctx);\n } else {\n this._renderTextFill(ctx);\n this._renderTextStroke(ctx);\n }\n }\n\n /**\n * Set the font parameter of the context with the object properties or with charStyle\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n * @param {Object} [charStyle] object with font style properties\n * @param {String} [charStyle.fontFamily] Font Family\n * @param {Number} [charStyle.fontSize] Font size in pixels. ( without px suffix )\n * @param {String} [charStyle.fontWeight] Font weight\n * @param {String} [charStyle.fontStyle] Font style (italic|normal)\n */\n _setTextStyles(\n ctx: CanvasRenderingContext2D,\n charStyle?: any,\n forMeasuring?: boolean,\n ) {\n ctx.textBaseline = 'alphabetic';\n if (this.path) {\n switch (this.pathAlign) {\n case CENTER:\n ctx.textBaseline = 'middle';\n break;\n case 'ascender':\n ctx.textBaseline = TOP;\n break;\n case 'descender':\n ctx.textBaseline = BOTTOM;\n break;\n }\n }\n ctx.font = this._getFontDeclaration(charStyle, forMeasuring);\n }\n\n /**\n * calculate and return the text Width measuring each line.\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n * @return {Number} Maximum width of Text object\n */\n calcTextWidth(): number {\n let maxWidth = this.getLineWidth(0);\n\n for (let i = 1, len = this._textLines.length; i < len; i++) {\n const currentLineWidth = this.getLineWidth(i);\n if (currentLineWidth > maxWidth) {\n maxWidth = currentLineWidth;\n }\n }\n return maxWidth;\n }\n\n /**\n * @private\n * @param {String} method Method name (\"fillText\" or \"strokeText\")\n * @param {CanvasRenderingContext2D} ctx Context to render on\n * @param {String} line Text to render\n * @param {Number} left Left position of text\n * @param {Number} top Top position of text\n * @param {Number} lineIndex Index of a line in a text\n */\n _renderTextLine(\n method: 'fillText' | 'strokeText',\n ctx: CanvasRenderingContext2D,\n line: string[],\n left: number,\n top: number,\n lineIndex: number,\n ) {\n this._renderChars(method, ctx, line, left, top, lineIndex);\n }\n\n /**\n * Renders the text background for lines, taking care of style\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _renderTextLinesBackground(ctx: CanvasRenderingContext2D) {\n if (!this.textBackgroundColor && !this.styleHas('textBackgroundColor')) {\n return;\n }\n const originalFill = ctx.fillStyle,\n leftOffset = this._getLeftOffset();\n let lineTopOffset = this._getTopOffset();\n\n for (let i = 0, len = this._textLines.length; i < len; i++) {\n const heightOfLine = this.getHeightOfLine(i);\n if (\n !this.textBackgroundColor &&\n !this.styleHas('textBackgroundColor', i)\n ) {\n lineTopOffset += heightOfLine;\n continue;\n }\n const jlen = this._textLines[i].length;\n const lineLeftOffset = this._getLineLeftOffset(i);\n let boxWidth = 0;\n let boxStart = 0;\n let drawStart;\n let currentColor;\n let lastColor = this.getValueOfPropertyAt(i, 0, 'textBackgroundColor');\n for (let j = 0; j < jlen; j++) {\n // at this point charbox are either standard or full with pathInfo if there is a path.\n const charBox = this.__charBounds[i][j] as Required;\n currentColor = this.getValueOfPropertyAt(i, j, 'textBackgroundColor');\n if (this.path) {\n ctx.save();\n ctx.translate(charBox.renderLeft, charBox.renderTop);\n ctx.rotate(charBox.angle);\n ctx.fillStyle = currentColor;\n currentColor &&\n ctx.fillRect(\n -charBox.width / 2,\n (-heightOfLine / this.lineHeight) * (1 - this._fontSizeFraction),\n charBox.width,\n heightOfLine / this.lineHeight,\n );\n ctx.restore();\n } else if (currentColor !== lastColor) {\n drawStart = leftOffset + lineLeftOffset + boxStart;\n if (this.direction === 'rtl') {\n drawStart = this.width - drawStart - boxWidth;\n }\n ctx.fillStyle = lastColor;\n lastColor &&\n ctx.fillRect(\n drawStart,\n lineTopOffset,\n boxWidth,\n heightOfLine / this.lineHeight,\n );\n boxStart = charBox.left;\n boxWidth = charBox.width;\n lastColor = currentColor;\n } else {\n boxWidth += charBox.kernedWidth;\n }\n }\n if (currentColor && !this.path) {\n drawStart = leftOffset + lineLeftOffset + boxStart;\n if (this.direction === 'rtl') {\n drawStart = this.width - drawStart - boxWidth;\n }\n ctx.fillStyle = currentColor;\n ctx.fillRect(\n drawStart,\n lineTopOffset,\n boxWidth,\n heightOfLine / this.lineHeight,\n );\n }\n lineTopOffset += heightOfLine;\n }\n ctx.fillStyle = originalFill;\n // if there is text background color no\n // other shadows should be casted\n this._removeShadow(ctx);\n }\n\n /**\n * measure and return the width of a single character.\n * possibly overridden to accommodate different measure logic or\n * to hook some external lib for character measurement\n * @private\n * @param {String} _char, char to be measured\n * @param {Object} charStyle style of char to be measured\n * @param {String} [previousChar] previous char\n * @param {Object} [prevCharStyle] style of previous char\n */\n _measureChar(\n _char: string,\n charStyle: CompleteTextStyleDeclaration,\n previousChar: string | undefined,\n prevCharStyle: CompleteTextStyleDeclaration | Record,\n ) {\n const fontCache = cache.getFontCache(charStyle),\n fontDeclaration = this._getFontDeclaration(charStyle),\n couple = previousChar + _char,\n stylesAreEqual =\n previousChar &&\n fontDeclaration === this._getFontDeclaration(prevCharStyle),\n fontMultiplier = charStyle.fontSize / this.CACHE_FONT_SIZE;\n let width: number | undefined,\n coupleWidth: number | undefined,\n previousWidth: number | undefined,\n kernedWidth: number | undefined;\n\n if (previousChar && fontCache[previousChar] !== undefined) {\n previousWidth = fontCache[previousChar];\n }\n if (fontCache[_char] !== undefined) {\n kernedWidth = width = fontCache[_char];\n }\n if (stylesAreEqual && fontCache[couple] !== undefined) {\n coupleWidth = fontCache[couple];\n kernedWidth = coupleWidth - previousWidth!;\n }\n if (\n width === undefined ||\n previousWidth === undefined ||\n coupleWidth === undefined\n ) {\n const ctx = getMeasuringContext()!;\n // send a TRUE to specify measuring font size CACHE_FONT_SIZE\n this._setTextStyles(ctx, charStyle, true);\n if (width === undefined) {\n kernedWidth = width = ctx.measureText(_char).width;\n fontCache[_char] = width;\n }\n if (previousWidth === undefined && stylesAreEqual && previousChar) {\n previousWidth = ctx.measureText(previousChar).width;\n fontCache[previousChar] = previousWidth;\n }\n if (stylesAreEqual && coupleWidth === undefined) {\n // we can measure the kerning couple and subtract the width of the previous character\n coupleWidth = ctx.measureText(couple).width;\n fontCache[couple] = coupleWidth;\n // safe to use the non-null since if undefined we defined it before.\n kernedWidth = coupleWidth - previousWidth!;\n }\n }\n return {\n width: width * fontMultiplier,\n kernedWidth: kernedWidth! * fontMultiplier,\n };\n }\n\n /**\n * Computes height of character at given position\n * @param {Number} line the line index number\n * @param {Number} _char the character index number\n * @return {Number} fontSize of the character\n */\n getHeightOfChar(line: number, _char: number): number {\n return this.getValueOfPropertyAt(line, _char, 'fontSize');\n }\n\n /**\n * measure a text line measuring all characters.\n * @param {Number} lineIndex line number\n */\n measureLine(lineIndex: number) {\n const lineInfo = this._measureLine(lineIndex);\n if (this.charSpacing !== 0) {\n lineInfo.width -= this._getWidthOfCharSpacing();\n }\n if (lineInfo.width < 0) {\n lineInfo.width = 0;\n }\n return lineInfo;\n }\n\n /**\n * measure every grapheme of a line, populating __charBounds\n * @param {Number} lineIndex\n * @return {Object} object.width total width of characters\n * @return {Object} object.numOfSpaces length of chars that match this._reSpacesAndTabs\n */\n _measureLine(lineIndex: number) {\n let width = 0,\n prevGrapheme: string | undefined,\n graphemeInfo: GraphemeBBox | undefined;\n\n const reverse = this.pathSide === RIGHT,\n path = this.path,\n line = this._textLines[lineIndex],\n llength = line.length,\n lineBounds = new Array(llength);\n\n this.__charBounds[lineIndex] = lineBounds;\n for (let i = 0; i < llength; i++) {\n const grapheme = line[i];\n graphemeInfo = this._getGraphemeBox(grapheme, lineIndex, i, prevGrapheme);\n lineBounds[i] = graphemeInfo;\n width += graphemeInfo.kernedWidth;\n prevGrapheme = grapheme;\n }\n // this latest bound box represent the last character of the line\n // to simplify cursor handling in interactive mode.\n lineBounds[llength] = {\n left: graphemeInfo ? graphemeInfo.left + graphemeInfo.width : 0,\n width: 0,\n kernedWidth: 0,\n height: this.fontSize,\n deltaY: 0,\n } as GraphemeBBox;\n if (path && path.segmentsInfo) {\n let positionInPath = 0;\n const totalPathLength =\n path.segmentsInfo[path.segmentsInfo.length - 1].length;\n switch (this.textAlign) {\n case LEFT:\n positionInPath = reverse ? totalPathLength - width : 0;\n break;\n case CENTER:\n positionInPath = (totalPathLength - width) / 2;\n break;\n case RIGHT:\n positionInPath = reverse ? 0 : totalPathLength - width;\n break;\n //todo - add support for justify\n }\n positionInPath += this.pathStartOffset * (reverse ? -1 : 1);\n for (\n let i = reverse ? llength - 1 : 0;\n reverse ? i >= 0 : i < llength;\n reverse ? i-- : i++\n ) {\n graphemeInfo = lineBounds[i];\n if (positionInPath > totalPathLength) {\n positionInPath %= totalPathLength;\n } else if (positionInPath < 0) {\n positionInPath += totalPathLength;\n }\n // it would probably much faster to send all the grapheme position for a line\n // and calculate path position/angle at once.\n this._setGraphemeOnPath(positionInPath, graphemeInfo);\n positionInPath += graphemeInfo.kernedWidth;\n }\n }\n return { width: width, numOfSpaces: 0 };\n }\n\n /**\n * Calculate the angle and the left,top position of the char that follow a path.\n * It appends it to graphemeInfo to be reused later at rendering\n * @private\n * @param {Number} positionInPath to be measured\n * @param {GraphemeBBox} graphemeInfo current grapheme box information\n * @param {Object} startingPoint position of the point\n */\n _setGraphemeOnPath(positionInPath: number, graphemeInfo: GraphemeBBox) {\n const centerPosition = positionInPath + graphemeInfo.kernedWidth / 2,\n path = this.path!;\n\n // we are at currentPositionOnPath. we want to know what point on the path is.\n const info = getPointOnPath(path.path, centerPosition, path.segmentsInfo)!;\n graphemeInfo.renderLeft = info.x - path.pathOffset.x;\n graphemeInfo.renderTop = info.y - path.pathOffset.y;\n graphemeInfo.angle = info.angle + (this.pathSide === RIGHT ? Math.PI : 0);\n }\n\n /**\n *\n * @param {String} grapheme to be measured\n * @param {Number} lineIndex index of the line where the char is\n * @param {Number} charIndex position in the line\n * @param {String} [prevGrapheme] character preceding the one to be measured\n * @returns {GraphemeBBox} grapheme bbox\n */\n _getGraphemeBox(\n grapheme: string,\n lineIndex: number,\n charIndex: number,\n prevGrapheme?: string,\n skipLeft?: boolean,\n ): GraphemeBBox {\n const style = this.getCompleteStyleDeclaration(lineIndex, charIndex),\n prevStyle = prevGrapheme\n ? this.getCompleteStyleDeclaration(lineIndex, charIndex - 1)\n : {},\n info = this._measureChar(grapheme, style, prevGrapheme, prevStyle);\n let kernedWidth = info.kernedWidth,\n width = info.width,\n charSpacing;\n\n if (this.charSpacing !== 0) {\n charSpacing = this._getWidthOfCharSpacing();\n width += charSpacing;\n kernedWidth += charSpacing;\n }\n\n const box: GraphemeBBox = {\n width,\n left: 0,\n height: style.fontSize,\n kernedWidth,\n deltaY: style.deltaY,\n };\n if (charIndex > 0 && !skipLeft) {\n const previousBox = this.__charBounds[lineIndex][charIndex - 1];\n box.left =\n previousBox.left + previousBox.width + info.kernedWidth - info.width;\n }\n return box;\n }\n\n /**\n * Calculate height of line at 'lineIndex'\n * @param {Number} lineIndex index of line to calculate\n * @return {Number}\n */\n getHeightOfLine(lineIndex: number): number {\n if (this.__lineHeights[lineIndex]) {\n return this.__lineHeights[lineIndex];\n }\n\n // char 0 is measured before the line cycle because it needs to char\n // emptylines\n let maxHeight = this.getHeightOfChar(lineIndex, 0);\n for (let i = 1, len = this._textLines[lineIndex].length; i < len; i++) {\n maxHeight = Math.max(this.getHeightOfChar(lineIndex, i), maxHeight);\n }\n\n return (this.__lineHeights[lineIndex] =\n maxHeight * this.lineHeight * this._fontSizeMult);\n }\n\n /**\n * Calculate text box height\n */\n calcTextHeight() {\n let lineHeight,\n height = 0;\n for (let i = 0, len = this._textLines.length; i < len; i++) {\n lineHeight = this.getHeightOfLine(i);\n height += i === len - 1 ? lineHeight / this.lineHeight : lineHeight;\n }\n return height;\n }\n\n /**\n * @private\n * @return {Number} Left offset\n */\n _getLeftOffset(): number {\n return this.direction === 'ltr' ? -this.width / 2 : this.width / 2;\n }\n\n /**\n * @private\n * @return {Number} Top offset\n */\n _getTopOffset(): number {\n return -this.height / 2;\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n * @param {String} method Method name (\"fillText\" or \"strokeText\")\n */\n _renderTextCommon(\n ctx: CanvasRenderingContext2D,\n method: 'fillText' | 'strokeText',\n ) {\n ctx.save();\n let lineHeights = 0;\n const left = this._getLeftOffset(),\n top = this._getTopOffset();\n for (let i = 0, len = this._textLines.length; i < len; i++) {\n const heightOfLine = this.getHeightOfLine(i),\n maxHeight = heightOfLine / this.lineHeight,\n leftOffset = this._getLineLeftOffset(i);\n this._renderTextLine(\n method,\n ctx,\n this._textLines[i],\n left + leftOffset,\n top + lineHeights + maxHeight,\n i,\n );\n lineHeights += heightOfLine;\n }\n ctx.restore();\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _renderTextFill(ctx: CanvasRenderingContext2D) {\n if (!this.fill && !this.styleHas(FILL)) {\n return;\n }\n\n this._renderTextCommon(ctx, 'fillText');\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _renderTextStroke(ctx: CanvasRenderingContext2D) {\n if ((!this.stroke || this.strokeWidth === 0) && this.isEmptyStyles()) {\n return;\n }\n\n if (this.shadow && !this.shadow.affectStroke) {\n this._removeShadow(ctx);\n }\n\n ctx.save();\n this._setLineDash(ctx, this.strokeDashArray);\n ctx.beginPath();\n this._renderTextCommon(ctx, 'strokeText');\n ctx.closePath();\n ctx.restore();\n }\n\n /**\n * @private\n * @param {String} method fillText or strokeText.\n * @param {CanvasRenderingContext2D} ctx Context to render on\n * @param {Array} line Content of the line, splitted in an array by grapheme\n * @param {Number} left\n * @param {Number} top\n * @param {Number} lineIndex\n */\n _renderChars(\n method: 'fillText' | 'strokeText',\n ctx: CanvasRenderingContext2D,\n line: Array,\n left: number,\n top: number,\n lineIndex: number,\n ) {\n const lineHeight = this.getHeightOfLine(lineIndex),\n isJustify = this.textAlign.includes(JUSTIFY),\n path = this.path,\n shortCut =\n !isJustify &&\n this.charSpacing === 0 &&\n this.isEmptyStyles(lineIndex) &&\n !path,\n isLtr = this.direction === 'ltr',\n sign = this.direction === 'ltr' ? 1 : -1,\n // this was changed in the PR #7674\n // currentDirection = ctx.canvas.getAttribute('dir');\n currentDirection = ctx.direction;\n\n let actualStyle,\n nextStyle,\n charsToRender = '',\n charBox,\n boxWidth = 0,\n timeToRender,\n drawingLeft;\n\n ctx.save();\n if (currentDirection !== this.direction) {\n ctx.canvas.setAttribute('dir', isLtr ? 'ltr' : 'rtl');\n ctx.direction = isLtr ? 'ltr' : 'rtl';\n ctx.textAlign = isLtr ? LEFT : RIGHT;\n }\n top -= (lineHeight * this._fontSizeFraction) / this.lineHeight;\n if (shortCut) {\n // render all the line in one pass without checking\n // drawingLeft = isLtr ? left : left - this.getLineWidth(lineIndex);\n this._renderChar(method, ctx, lineIndex, 0, line.join(''), left, top);\n ctx.restore();\n return;\n }\n for (let i = 0, len = line.length - 1; i <= len; i++) {\n timeToRender = i === len || this.charSpacing || path;\n charsToRender += line[i];\n charBox = this.__charBounds[lineIndex][i] as Required;\n if (boxWidth === 0) {\n left += sign * (charBox.kernedWidth - charBox.width);\n boxWidth += charBox.width;\n } else {\n boxWidth += charBox.kernedWidth;\n }\n if (isJustify && !timeToRender) {\n if (this._reSpaceAndTab.test(line[i])) {\n timeToRender = true;\n }\n }\n if (!timeToRender) {\n // if we have charSpacing, we render char by char\n actualStyle =\n actualStyle || this.getCompleteStyleDeclaration(lineIndex, i);\n nextStyle = this.getCompleteStyleDeclaration(lineIndex, i + 1);\n timeToRender = hasStyleChanged(actualStyle, nextStyle, false);\n }\n if (timeToRender) {\n if (path) {\n ctx.save();\n ctx.translate(charBox.renderLeft, charBox.renderTop);\n ctx.rotate(charBox.angle);\n this._renderChar(\n method,\n ctx,\n lineIndex,\n i,\n charsToRender,\n -boxWidth / 2,\n 0,\n );\n ctx.restore();\n } else {\n drawingLeft = left;\n this._renderChar(\n method,\n ctx,\n lineIndex,\n i,\n charsToRender,\n drawingLeft,\n top,\n );\n }\n charsToRender = '';\n actualStyle = nextStyle;\n left += sign * boxWidth;\n boxWidth = 0;\n }\n }\n ctx.restore();\n }\n\n /**\n * This function try to patch the missing gradientTransform on canvas gradients.\n * transforming a context to transform the gradient, is going to transform the stroke too.\n * we want to transform the gradient but not the stroke operation, so we create\n * a transformed gradient on a pattern and then we use the pattern instead of the gradient.\n * this method has drawbacks: is slow, is in low resolution, needs a patch for when the size\n * is limited.\n * @private\n * @param {TFiller} filler a fabric gradient instance\n * @return {CanvasPattern} a pattern to use as fill/stroke style\n */\n _applyPatternGradientTransformText(filler: TFiller) {\n // TODO: verify compatibility with strokeUniform\n const width = this.width + this.strokeWidth,\n height = this.height + this.strokeWidth,\n pCanvas = createCanvasElementFor({\n width,\n height,\n }),\n pCtx = pCanvas.getContext('2d')!;\n pCanvas.width = width;\n pCanvas.height = height;\n pCtx.beginPath();\n pCtx.moveTo(0, 0);\n pCtx.lineTo(width, 0);\n pCtx.lineTo(width, height);\n pCtx.lineTo(0, height);\n pCtx.closePath();\n pCtx.translate(width / 2, height / 2);\n pCtx.fillStyle = filler.toLive(pCtx)!;\n this._applyPatternGradientTransform(pCtx, filler);\n pCtx.fill();\n return pCtx.createPattern(pCanvas, 'no-repeat')!;\n }\n\n handleFiller(\n ctx: CanvasRenderingContext2D,\n property: `${T}Style`,\n filler: TFiller | string,\n ): { offsetX: number; offsetY: number } {\n let offsetX: number, offsetY: number;\n if (isFiller(filler)) {\n if (\n (filler as Gradient<'linear'>).gradientUnits === 'percentage' ||\n (filler as Gradient<'linear'>).gradientTransform ||\n (filler as Pattern).patternTransform\n ) {\n // need to transform gradient in a pattern.\n // this is a slow process. If you are hitting this codepath, and the object\n // is not using caching, you should consider switching it on.\n // we need a canvas as big as the current object caching canvas.\n offsetX = -this.width / 2;\n offsetY = -this.height / 2;\n ctx.translate(offsetX, offsetY);\n ctx[property] = this._applyPatternGradientTransformText(filler);\n return { offsetX, offsetY };\n } else {\n // is a simple gradient or pattern\n ctx[property] = filler.toLive(ctx)!;\n return this._applyPatternGradientTransform(ctx, filler);\n }\n } else {\n // is a color\n ctx[property] = filler;\n }\n return { offsetX: 0, offsetY: 0 };\n }\n\n /**\n * This function prepare the canvas for a stroke style, and stroke and strokeWidth\n * need to be sent in as defined\n * @param {CanvasRenderingContext2D} ctx\n * @param {CompleteTextStyleDeclaration} style with stroke and strokeWidth defined\n * @returns\n */\n _setStrokeStyles(\n ctx: CanvasRenderingContext2D,\n {\n stroke,\n strokeWidth,\n }: Pick,\n ) {\n ctx.lineWidth = strokeWidth;\n ctx.lineCap = this.strokeLineCap;\n ctx.lineDashOffset = this.strokeDashOffset;\n ctx.lineJoin = this.strokeLineJoin;\n ctx.miterLimit = this.strokeMiterLimit;\n return this.handleFiller(ctx, 'strokeStyle', stroke!);\n }\n\n /**\n * This function prepare the canvas for a ill style, and fill\n * need to be sent in as defined\n * @param {CanvasRenderingContext2D} ctx\n * @param {CompleteTextStyleDeclaration} style with ill defined\n * @returns\n */\n _setFillStyles(ctx: CanvasRenderingContext2D, { fill }: Pick) {\n return this.handleFiller(ctx, 'fillStyle', fill!);\n }\n\n /**\n * @private\n * @param {String} method\n * @param {CanvasRenderingContext2D} ctx Context to render on\n * @param {Number} lineIndex\n * @param {Number} charIndex\n * @param {String} _char\n * @param {Number} left Left coordinate\n * @param {Number} top Top coordinate\n * @param {Number} lineHeight Height of the line\n */\n _renderChar(\n method: 'fillText' | 'strokeText',\n ctx: CanvasRenderingContext2D,\n lineIndex: number,\n charIndex: number,\n _char: string,\n left: number,\n top: number,\n ) {\n const decl = this._getStyleDeclaration(lineIndex, charIndex),\n fullDecl = this.getCompleteStyleDeclaration(lineIndex, charIndex),\n shouldFill = method === 'fillText' && fullDecl.fill,\n shouldStroke =\n method === 'strokeText' && fullDecl.stroke && fullDecl.strokeWidth;\n\n if (!shouldStroke && !shouldFill) {\n return;\n }\n ctx.save();\n\n ctx.font = this._getFontDeclaration(fullDecl);\n\n if (decl.textBackgroundColor) {\n this._removeShadow(ctx);\n }\n if (decl.deltaY) {\n top += decl.deltaY;\n }\n\n if (shouldFill) {\n const fillOffsets = this._setFillStyles(ctx, fullDecl);\n ctx.fillText(\n _char,\n left - fillOffsets.offsetX,\n top - fillOffsets.offsetY,\n );\n }\n\n if (shouldStroke) {\n const strokeOffsets = this._setStrokeStyles(ctx, fullDecl);\n ctx.strokeText(\n _char,\n left - strokeOffsets.offsetX,\n top - strokeOffsets.offsetY,\n );\n }\n\n ctx.restore();\n }\n\n /**\n * Turns the character into a 'superior figure' (i.e. 'superscript')\n * @param {Number} start selection start\n * @param {Number} end selection end\n */\n setSuperscript(start: number, end: number) {\n this._setScript(start, end, this.superscript);\n }\n\n /**\n * Turns the character into an 'inferior figure' (i.e. 'subscript')\n * @param {Number} start selection start\n * @param {Number} end selection end\n */\n setSubscript(start: number, end: number) {\n this._setScript(start, end, this.subscript);\n }\n\n /**\n * Applies 'schema' at given position\n * @private\n * @param {Number} start selection start\n * @param {Number} end selection end\n * @param {Number} schema\n */\n protected _setScript(\n start: number,\n end: number,\n schema: {\n size: number;\n baseline: number;\n },\n ) {\n const loc = this.get2DCursorLocation(start, true),\n fontSize = this.getValueOfPropertyAt(\n loc.lineIndex,\n loc.charIndex,\n 'fontSize',\n ),\n dy = this.getValueOfPropertyAt(loc.lineIndex, loc.charIndex, 'deltaY'),\n style = {\n fontSize: fontSize * schema.size,\n deltaY: dy + fontSize * schema.baseline,\n };\n this.setSelectionStyles(style, start, end);\n }\n\n /**\n * @private\n * @param {Number} lineIndex index text line\n * @return {Number} Line left offset\n */\n _getLineLeftOffset(lineIndex: number): number {\n const lineWidth = this.getLineWidth(lineIndex),\n lineDiff = this.width - lineWidth,\n textAlign = this.textAlign,\n direction = this.direction,\n isEndOfWrapping = this.isEndOfWrapping(lineIndex);\n let leftOffset = 0;\n if (\n textAlign === JUSTIFY ||\n (textAlign === JUSTIFY_CENTER && !isEndOfWrapping) ||\n (textAlign === JUSTIFY_RIGHT && !isEndOfWrapping) ||\n (textAlign === JUSTIFY_LEFT && !isEndOfWrapping)\n ) {\n return 0;\n }\n if (textAlign === CENTER) {\n leftOffset = lineDiff / 2;\n }\n if (textAlign === RIGHT) {\n leftOffset = lineDiff;\n }\n if (textAlign === JUSTIFY_CENTER) {\n leftOffset = lineDiff / 2;\n }\n if (textAlign === JUSTIFY_RIGHT) {\n leftOffset = lineDiff;\n }\n if (direction === 'rtl') {\n if (\n textAlign === RIGHT ||\n textAlign === JUSTIFY ||\n textAlign === JUSTIFY_RIGHT\n ) {\n leftOffset = 0;\n } else if (textAlign === LEFT || textAlign === JUSTIFY_LEFT) {\n leftOffset = -lineDiff;\n } else if (textAlign === CENTER || textAlign === JUSTIFY_CENTER) {\n leftOffset = -lineDiff / 2;\n }\n }\n return leftOffset;\n }\n\n /**\n * @private\n */\n _clearCache() {\n this._forceClearCache = false;\n this.__lineWidths = [];\n this.__lineHeights = [];\n this.__charBounds = [];\n }\n\n /**\n * Measure a single line given its index. Used to calculate the initial\n * text bounding box. The values are calculated and stored in __lineWidths cache.\n * @private\n * @param {Number} lineIndex line number\n * @return {Number} Line width\n */\n getLineWidth(lineIndex: number): number {\n if (this.__lineWidths[lineIndex] !== undefined) {\n return this.__lineWidths[lineIndex];\n }\n\n const { width } = this.measureLine(lineIndex);\n this.__lineWidths[lineIndex] = width;\n return width;\n }\n\n _getWidthOfCharSpacing() {\n if (this.charSpacing !== 0) {\n return (this.fontSize * this.charSpacing) / 1000;\n }\n return 0;\n }\n\n /**\n * Retrieves the value of property at given character position\n * @param {Number} lineIndex the line number\n * @param {Number} charIndex the character number\n * @param {String} property the property name\n * @returns the value of 'property'\n */\n getValueOfPropertyAt(\n lineIndex: number,\n charIndex: number,\n property: T,\n ): this[T] {\n const charStyle = this._getStyleDeclaration(lineIndex, charIndex);\n return (charStyle[property] ?? this[property]) as this[T];\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _renderTextDecoration(\n ctx: CanvasRenderingContext2D,\n type: 'underline' | 'linethrough' | 'overline',\n ) {\n if (!this[type] && !this.styleHas(type)) {\n return;\n }\n let topOffset = this._getTopOffset();\n const leftOffset = this._getLeftOffset(),\n path = this.path,\n charSpacing = this._getWidthOfCharSpacing(),\n offsetAligner =\n type === 'linethrough' ? 0.5 : type === 'overline' ? 1 : 0,\n offsetY = this.offsets[type];\n for (let i = 0, len = this._textLines.length; i < len; i++) {\n const heightOfLine = this.getHeightOfLine(i);\n if (!this[type] && !this.styleHas(type, i)) {\n topOffset += heightOfLine;\n continue;\n }\n const line = this._textLines[i];\n const maxHeight = heightOfLine / this.lineHeight;\n const lineLeftOffset = this._getLineLeftOffset(i);\n let boxStart = 0;\n let boxWidth = 0;\n let lastDecoration = this.getValueOfPropertyAt(i, 0, type);\n let lastFill = this.getValueOfPropertyAt(i, 0, FILL);\n let lastTickness = this.getValueOfPropertyAt(\n i,\n 0,\n TEXT_DECORATION_THICKNESS,\n );\n let currentDecoration = lastDecoration;\n let currentFill = lastFill;\n let currentTickness = lastTickness;\n const top = topOffset + maxHeight * (1 - this._fontSizeFraction);\n let size = this.getHeightOfChar(i, 0);\n let dy = this.getValueOfPropertyAt(i, 0, 'deltaY');\n for (let j = 0, jlen = line.length; j < jlen; j++) {\n const charBox = this.__charBounds[i][j] as Required;\n currentDecoration = this.getValueOfPropertyAt(i, j, type);\n currentFill = this.getValueOfPropertyAt(i, j, FILL);\n currentTickness = this.getValueOfPropertyAt(\n i,\n j,\n TEXT_DECORATION_THICKNESS,\n );\n const currentSize = this.getHeightOfChar(i, j);\n const currentDy = this.getValueOfPropertyAt(i, j, 'deltaY');\n if (path && currentDecoration && currentFill) {\n const finalTickness = (this.fontSize * currentTickness) / 1000;\n ctx.save();\n // bug? verify lastFill is a valid fill here.\n ctx.fillStyle = lastFill as string;\n ctx.translate(charBox.renderLeft, charBox.renderTop);\n ctx.rotate(charBox.angle);\n ctx.fillRect(\n -charBox.kernedWidth / 2,\n offsetY * currentSize + currentDy - offsetAligner * finalTickness,\n charBox.kernedWidth,\n finalTickness,\n );\n ctx.restore();\n } else if (\n (currentDecoration !== lastDecoration ||\n currentFill !== lastFill ||\n currentSize !== size ||\n currentTickness !== lastTickness ||\n currentDy !== dy) &&\n boxWidth > 0\n ) {\n const finalTickness = (this.fontSize * lastTickness) / 1000;\n let drawStart = leftOffset + lineLeftOffset + boxStart;\n if (this.direction === 'rtl') {\n drawStart = this.width - drawStart - boxWidth;\n }\n if (lastDecoration && lastFill && lastTickness) {\n // bug? verify lastFill is a valid fill here.\n ctx.fillStyle = lastFill as string;\n ctx.fillRect(\n drawStart,\n top + offsetY * size + dy - offsetAligner * finalTickness,\n boxWidth,\n finalTickness,\n );\n }\n boxStart = charBox.left;\n boxWidth = charBox.width;\n lastDecoration = currentDecoration;\n lastTickness = currentTickness;\n lastFill = currentFill;\n size = currentSize;\n dy = currentDy;\n } else {\n boxWidth += charBox.kernedWidth;\n }\n }\n let drawStart = leftOffset + lineLeftOffset + boxStart;\n if (this.direction === 'rtl') {\n drawStart = this.width - drawStart - boxWidth;\n }\n ctx.fillStyle = currentFill as string;\n const finalTickness = (this.fontSize * currentTickness) / 1000;\n currentDecoration &&\n currentFill &&\n currentTickness &&\n ctx.fillRect(\n drawStart,\n top + offsetY * size + dy - offsetAligner * finalTickness,\n boxWidth - charSpacing,\n finalTickness,\n );\n topOffset += heightOfLine;\n }\n // if there is text background color no\n // other shadows should be casted\n this._removeShadow(ctx);\n }\n\n /**\n * return font declaration string for canvas context\n * @param {Object} [styleObject] object\n * @returns {String} font declaration formatted for canvas context.\n */\n _getFontDeclaration(\n {\n fontFamily = this.fontFamily,\n fontStyle = this.fontStyle,\n fontWeight = this.fontWeight,\n fontSize = this.fontSize,\n }: Partial<\n Pick<\n TextStyleDeclaration,\n 'fontFamily' | 'fontStyle' | 'fontWeight' | 'fontSize'\n >\n > = {},\n forMeasuring?: boolean,\n ): string {\n const parsedFontFamily =\n fontFamily.includes(\"'\") ||\n fontFamily.includes('\"') ||\n fontFamily.includes(',') ||\n FabricText.genericFonts.includes(fontFamily.toLowerCase())\n ? fontFamily\n : `\"${fontFamily}\"`;\n return [\n fontStyle,\n fontWeight,\n `${forMeasuring ? this.CACHE_FONT_SIZE : fontSize}px`,\n parsedFontFamily,\n ].join(' ');\n }\n\n /**\n * Renders text instance on a specified context\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n render(ctx: CanvasRenderingContext2D) {\n if (!this.visible) {\n return;\n }\n if (\n this.canvas &&\n this.canvas.skipOffscreen &&\n !this.group &&\n !this.isOnScreen()\n ) {\n return;\n }\n if (this._forceClearCache) {\n this.initDimensions();\n }\n super.render(ctx);\n }\n\n /**\n * Override this method to customize grapheme splitting\n * @todo the util `graphemeSplit` needs to be injectable in some way.\n * is more comfortable to inject the correct util rather than having to override text\n * in the middle of the prototype chain\n * @param {string} value\n * @returns {string[]} array of graphemes\n */\n graphemeSplit(value: string): string[] {\n return graphemeSplit(value);\n }\n\n /**\n * Returns the text as an array of lines.\n * @param {String} text text to split\n * @returns Lines in the text\n */\n _splitTextIntoLines(text: string): TextLinesInfo {\n const lines = text.split(this._reNewline),\n newLines = new Array(lines.length),\n newLine = ['\\n'];\n let newText: string[] = [];\n for (let i = 0; i < lines.length; i++) {\n newLines[i] = this.graphemeSplit(lines[i]);\n newText = newText.concat(newLines[i], newLine);\n }\n newText.pop();\n return {\n _unwrappedLines: newLines,\n lines: lines,\n graphemeText: newText,\n graphemeLines: newLines,\n };\n }\n\n /**\n * Returns object representation of an instance\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} Object representation of an instance\n */\n toObject<\n T extends Omit, keyof SProps>,\n K extends keyof T = never,\n >(propertiesToInclude: K[] = []): Pick & SProps {\n return {\n ...super.toObject([...additionalProps, ...propertiesToInclude] as K[]),\n styles: stylesToArray(this.styles, this.text),\n ...(this.path ? { path: this.path.toObject() } : {}),\n };\n }\n\n set(key: string | any, value?: any) {\n const { textLayoutProperties } = this.constructor as typeof FabricText;\n super.set(key, value);\n let needsDims = false;\n let isAddingPath = false;\n if (typeof key === 'object') {\n for (const _key in key) {\n if (_key === 'path') {\n this.setPathInfo();\n }\n needsDims = needsDims || textLayoutProperties.includes(_key);\n isAddingPath = isAddingPath || _key === 'path';\n }\n } else {\n needsDims = textLayoutProperties.includes(key);\n isAddingPath = key === 'path';\n }\n if (isAddingPath) {\n this.setPathInfo();\n }\n if (needsDims && this.initialized) {\n this.initDimensions();\n this.setCoords();\n }\n return this;\n }\n\n /**\n * Returns complexity of an instance\n * @return {Number} complexity\n */\n complexity(): number {\n return 1;\n }\n\n /**\n * List of generic font families\n * @see https://developer.mozilla.org/en-US/docs/Web/CSS/font-family#generic-name\n */\n static genericFonts = [\n 'serif',\n 'sans-serif',\n 'monospace',\n 'cursive',\n 'fantasy',\n 'system-ui',\n 'ui-serif',\n 'ui-sans-serif',\n 'ui-monospace',\n 'ui-rounded',\n 'math',\n 'emoji',\n 'fangsong',\n ];\n\n /* _FROM_SVG_START_ */\n\n /**\n * List of attribute names to account for when parsing SVG element (used by {@link FabricText.fromElement})\n * @see: http://www.w3.org/TR/SVG/text.html#TextElement\n */\n static ATTRIBUTE_NAMES = SHARED_ATTRIBUTES.concat(\n 'x',\n 'y',\n 'dx',\n 'dy',\n 'font-family',\n 'font-style',\n 'font-weight',\n 'font-size',\n 'letter-spacing',\n 'text-decoration',\n 'text-anchor',\n );\n\n /**\n * Returns FabricText instance from an SVG element (not yet implemented)\n * @param {HTMLElement} element Element to parse\n * @param {Object} [options] Options object\n */\n static async fromElement(\n element: HTMLElement | SVGElement,\n options?: Abortable,\n cssRules?: CSSRules,\n ) {\n const parsedAttributes = parseAttributes(\n element,\n FabricText.ATTRIBUTE_NAMES,\n cssRules,\n );\n\n const {\n textAnchor = LEFT as typeof LEFT | typeof CENTER | typeof RIGHT,\n textDecoration = '',\n dx = 0,\n dy = 0,\n top = 0,\n left = 0,\n fontSize = DEFAULT_SVG_FONT_SIZE,\n strokeWidth = 1,\n ...restOfOptions\n } = { ...options, ...parsedAttributes };\n\n const textContent = (element.textContent || '')\n .replace(/^\\s+|\\s+$|\\n+/g, '')\n .replace(/\\s+/g, ' ');\n\n // this code here is probably the usual issue for SVG center find\n // this can later looked at again and probably removed.\n\n const text = new this(textContent, {\n left: left + dx,\n top: top + dy,\n underline: textDecoration.includes('underline'),\n overline: textDecoration.includes('overline'),\n linethrough: textDecoration.includes('line-through'),\n // we initialize this as 0\n strokeWidth: 0,\n fontSize,\n ...restOfOptions,\n }),\n textHeightScaleFactor = text.getScaledHeight() / text.height,\n lineHeightDiff =\n (text.height + text.strokeWidth) * text.lineHeight - text.height,\n scaledDiff = lineHeightDiff * textHeightScaleFactor,\n textHeight = text.getScaledHeight() + scaledDiff;\n\n let offX = 0;\n /*\n Adjust positioning:\n x/y attributes in SVG correspond to the bottom-left corner of text bounding box\n fabric output by default at top, left.\n */\n if (textAnchor === CENTER) {\n offX = text.getScaledWidth() / 2;\n }\n if (textAnchor === RIGHT) {\n offX = text.getScaledWidth();\n }\n text.set({\n left: text.left - offX,\n top:\n text.top -\n (textHeight - text.fontSize * (0.07 + text._fontSizeFraction)) /\n text.lineHeight,\n strokeWidth,\n });\n return text;\n }\n\n /* _FROM_SVG_END_ */\n\n /**\n * Returns FabricText instance from an object representation\n * @param {Object} object plain js Object to create an instance from\n * @returns {Promise}\n */\n static fromObject<\n T extends TOptions,\n S extends FabricText,\n >(object: T) {\n return this._fromObject(\n {\n ...object,\n styles: stylesFromArray(object.styles || {}, object.text),\n },\n {\n extraParam: 'text',\n },\n );\n }\n}\n\napplyMixins(FabricText, [TextSVGExportMixin]);\nclassRegistry.setClass(FabricText);\nclassRegistry.setSVGClass(FabricText);\n","import type {\n DragEventData,\n DropEventData,\n TPointerEvent,\n} from '../../EventTypeDefs';\nimport { Point } from '../../Point';\nimport type { IText } from './IText';\nimport { setStyle } from '../../util/internals/dom_style';\nimport { cloneStyles } from '../../util/internals/cloneStyles';\nimport type { TextStyleDeclaration } from '../Text/StyledText';\nimport { getDocumentFromElement } from '../../util/dom_misc';\nimport { CHANGED, NONE } from '../../constants';\n\n/**\n * #### Dragging IText/Textbox Lifecycle\n * - {@link start} is called from `mousedown` {@link IText#_mouseDownHandler} and determines if dragging should start by testing {@link isPointerOverSelection}\n * - if true `mousedown` {@link IText#_mouseDownHandler} is blocked to keep selection\n * - if the pointer moves, canvas fires numerous mousemove {@link Canvas#_onMouseMove} that we make sure **aren't** prevented ({@link IText#shouldStartDragging}) in order for the window to start a drag session\n * - once/if the session starts canvas calls {@link onDragStart} on the active object to determine if dragging should occur\n * - canvas fires relevant drag events that are handled by the handlers defined in this scope\n * - {@link end} is called from `mouseup` {@link IText#mouseUpHandler}, blocking IText default click behavior\n * - in case the drag session didn't occur, {@link end} handles a click, since logic to do so was blocked during `mousedown`\n */\nexport class DraggableTextDelegate {\n readonly target: IText;\n private __mouseDownInPlace = false;\n private __dragStartFired = false;\n private __isDraggingOver = false;\n private __dragStartSelection?: {\n selectionStart: number;\n selectionEnd: number;\n };\n private __dragImageDisposer?: VoidFunction;\n private _dispose?: () => void;\n\n constructor(target: IText) {\n this.target = target;\n const disposers = [\n this.target.on('dragenter', this.dragEnterHandler.bind(this)),\n this.target.on('dragover', this.dragOverHandler.bind(this)),\n this.target.on('dragleave', this.dragLeaveHandler.bind(this)),\n this.target.on('dragend', this.dragEndHandler.bind(this)),\n this.target.on('drop', this.dropHandler.bind(this)),\n ];\n this._dispose = () => {\n disposers.forEach((d) => d());\n this._dispose = undefined;\n };\n }\n\n isPointerOverSelection(e: TPointerEvent) {\n const target = this.target;\n const newSelection = target.getSelectionStartFromPointer(e);\n return (\n target.isEditing &&\n newSelection >= target.selectionStart &&\n newSelection <= target.selectionEnd &&\n target.selectionStart < target.selectionEnd\n );\n }\n\n /**\n * @public override this method to disable dragging and default to mousedown logic\n */\n start(e: TPointerEvent) {\n return (this.__mouseDownInPlace = this.isPointerOverSelection(e));\n }\n\n /**\n * @public override this method to disable dragging without discarding selection\n */\n isActive() {\n return this.__mouseDownInPlace;\n }\n\n /**\n * Ends interaction and sets cursor in case of a click\n * @returns true if was active\n */\n end(e: TPointerEvent) {\n const active = this.isActive();\n if (active && !this.__dragStartFired) {\n // mousedown has been blocked since `active` is true => cursor has not been set.\n // `__dragStartFired` is false => dragging didn't occur, pointer didn't move and is over selection.\n // meaning this is actually a click, `active` is a false positive.\n this.target.setCursorByClick(e);\n this.target.initDelayedCursor(true);\n }\n this.__mouseDownInPlace = false;\n this.__dragStartFired = false;\n this.__isDraggingOver = false;\n return active;\n }\n\n getDragStartSelection() {\n return this.__dragStartSelection;\n }\n\n /**\n * Override to customize the drag image\n * https://developer.mozilla.org/en-US/docs/Web/API/DataTransfer/setDragImage\n */\n setDragImage(\n e: DragEvent,\n {\n selectionStart,\n selectionEnd,\n }: {\n selectionStart: number;\n selectionEnd: number;\n },\n ) {\n const target = this.target;\n const canvas = target.canvas!;\n const flipFactor = new Point(target.flipX ? -1 : 1, target.flipY ? -1 : 1);\n const boundaries = target._getCursorBoundaries(selectionStart);\n const selectionPosition = new Point(\n boundaries.left + boundaries.leftOffset,\n boundaries.top + boundaries.topOffset,\n ).multiply(flipFactor);\n const pos = selectionPosition.transform(target.calcTransformMatrix());\n const pointer = canvas.getScenePoint(e);\n const diff = pointer.subtract(pos);\n const retinaScaling = target.getCanvasRetinaScaling();\n const bbox = target.getBoundingRect();\n const correction = pos.subtract(new Point(bbox.left, bbox.top));\n const vpt = canvas.viewportTransform;\n const offset = correction.add(diff).transform(vpt, true);\n // prepare instance for drag image snapshot by making all non selected text invisible\n const bgc = target.backgroundColor;\n const styles = cloneStyles(target.styles);\n target.backgroundColor = '';\n const styleOverride = {\n stroke: 'transparent',\n fill: 'transparent',\n textBackgroundColor: 'transparent',\n };\n target.setSelectionStyles(styleOverride, 0, selectionStart);\n target.setSelectionStyles(styleOverride, selectionEnd, target.text.length);\n target.dirty = true;\n const dragImage = target.toCanvasElement({\n enableRetinaScaling: canvas.enableRetinaScaling,\n viewportTransform: true,\n });\n // restore values\n target.backgroundColor = bgc;\n target.styles = styles;\n target.dirty = true;\n // position drag image offscreen\n setStyle(dragImage, {\n position: 'fixed',\n left: `${-dragImage.width}px`,\n border: NONE,\n width: `${dragImage.width / retinaScaling}px`,\n height: `${dragImage.height / retinaScaling}px`,\n });\n this.__dragImageDisposer && this.__dragImageDisposer();\n this.__dragImageDisposer = () => {\n dragImage.remove();\n };\n getDocumentFromElement(\n (e.target || this.target.hiddenTextarea)! as HTMLElement,\n ).body.appendChild(dragImage);\n e.dataTransfer?.setDragImage(dragImage, offset.x, offset.y);\n }\n\n /**\n * @returns {boolean} determines whether {@link target} should/shouldn't become a drag source\n */\n onDragStart(e: DragEvent): boolean {\n this.__dragStartFired = true;\n const target = this.target;\n const active = this.isActive();\n if (active && e.dataTransfer) {\n const selection = (this.__dragStartSelection = {\n selectionStart: target.selectionStart,\n selectionEnd: target.selectionEnd,\n });\n const value = target._text\n .slice(selection.selectionStart, selection.selectionEnd)\n .join('');\n const data = { text: target.text, value, ...selection };\n e.dataTransfer.setData('text/plain', value);\n e.dataTransfer.setData(\n 'application/fabric',\n JSON.stringify({\n value: value,\n styles: target.getSelectionStyles(\n selection.selectionStart,\n selection.selectionEnd,\n true,\n ),\n }),\n );\n e.dataTransfer.effectAllowed = 'copyMove';\n this.setDragImage(e, data);\n }\n target.abortCursorAnimation();\n return active;\n }\n\n /**\n * use {@link targetCanDrop} to respect overriding\n * @returns {boolean} determines whether {@link target} should/shouldn't become a drop target\n */\n canDrop(e: DragEvent): boolean {\n if (\n this.target.editable &&\n !this.target.getActiveControl() &&\n !e.defaultPrevented\n ) {\n if (this.isActive() && this.__dragStartSelection) {\n // drag source trying to drop over itself\n // allow dropping only outside of drag start selection\n const index = this.target.getSelectionStartFromPointer(e);\n const dragStartSelection = this.__dragStartSelection;\n return (\n index < dragStartSelection.selectionStart ||\n index > dragStartSelection.selectionEnd\n );\n }\n return true;\n }\n return false;\n }\n\n /**\n * in order to respect overriding {@link IText#canDrop} we call that instead of calling {@link canDrop} directly\n */\n protected targetCanDrop(e: DragEvent) {\n return this.target.canDrop(e);\n }\n\n dragEnterHandler({ e }: DragEventData) {\n const canDrop = this.targetCanDrop(e);\n if (!this.__isDraggingOver && canDrop) {\n this.__isDraggingOver = true;\n }\n }\n\n dragOverHandler(ev: DragEventData) {\n const { e } = ev;\n const canDrop = this.targetCanDrop(e);\n if (!this.__isDraggingOver && canDrop) {\n this.__isDraggingOver = true;\n } else if (this.__isDraggingOver && !canDrop) {\n // drop state has changed\n this.__isDraggingOver = false;\n }\n if (this.__isDraggingOver) {\n // can be dropped, inform browser\n e.preventDefault();\n // inform event subscribers\n ev.canDrop = true;\n ev.dropTarget = this.target;\n }\n }\n\n dragLeaveHandler() {\n if (this.__isDraggingOver || this.isActive()) {\n this.__isDraggingOver = false;\n }\n }\n\n /**\n * Override the `text/plain | application/fabric` types of {@link DragEvent#dataTransfer}\n * in order to change the drop value or to customize styling respectively, by listening to the `drop:before` event\n * https://developer.mozilla.org/en-US/docs/Web/API/HTML_Drag_and_Drop_API/Drag_operations#performing_a_drop\n */\n dropHandler(ev: DropEventData) {\n const { e } = ev;\n const didDrop = e.defaultPrevented;\n this.__isDraggingOver = false;\n // inform browser that the drop has been accepted\n e.preventDefault();\n let insert = e.dataTransfer?.getData('text/plain');\n if (insert && !didDrop) {\n const target = this.target;\n const canvas = target.canvas!;\n let insertAt = target.getSelectionStartFromPointer(e);\n const { styles } = (\n e.dataTransfer!.types.includes('application/fabric')\n ? JSON.parse(e.dataTransfer!.getData('application/fabric'))\n : {}\n ) as { styles: TextStyleDeclaration[] };\n const trailing = insert[Math.max(0, insert.length - 1)];\n const selectionStartOffset = 0;\n // drag and drop in same instance\n if (this.__dragStartSelection) {\n const selectionStart = this.__dragStartSelection.selectionStart;\n const selectionEnd = this.__dragStartSelection.selectionEnd;\n if (insertAt > selectionStart && insertAt <= selectionEnd) {\n insertAt = selectionStart;\n } else if (insertAt > selectionEnd) {\n insertAt -= selectionEnd - selectionStart;\n }\n target.removeChars(selectionStart, selectionEnd);\n // prevent `dragend` from handling event\n delete this.__dragStartSelection;\n }\n // remove redundant line break\n if (\n target._reNewline.test(trailing) &&\n (target._reNewline.test(target._text[insertAt]) ||\n insertAt === target._text.length)\n ) {\n insert = insert.trimEnd();\n }\n // inform subscribers\n ev.didDrop = true;\n ev.dropTarget = target;\n // finalize\n target.insertChars(insert, styles, insertAt);\n // can this part be moved in an outside event? andrea to check.\n canvas.setActiveObject(target);\n target.enterEditing(e);\n target.selectionStart = Math.min(\n insertAt + selectionStartOffset,\n target._text.length,\n );\n target.selectionEnd = Math.min(\n target.selectionStart + insert.length,\n target._text.length,\n );\n target.hiddenTextarea!.value = target.text;\n target._updateTextarea();\n target.hiddenTextarea!.focus();\n target.fire(CHANGED, {\n index: insertAt + selectionStartOffset,\n action: 'drop',\n });\n canvas.fire('text:changed', { target });\n canvas.contextTopDirty = true;\n canvas.requestRenderAll();\n }\n }\n\n /**\n * fired only on the drag source after drop (if occurred)\n * handle changes to the drag source in case of a drop on another object or a cancellation\n * https://developer.mozilla.org/en-US/docs/Web/API/HTML_Drag_and_Drop_API/Drag_operations#finishing_a_drag\n */\n dragEndHandler({ e }: DragEventData) {\n if (this.isActive() && this.__dragStartFired) {\n // once the drop event finishes we check if we need to change the drag source\n // if the drag source received the drop we bail out since the drop handler has already handled logic\n if (this.__dragStartSelection) {\n const target = this.target;\n const canvas = this.target.canvas!;\n const { selectionStart, selectionEnd } = this.__dragStartSelection;\n const dropEffect = e.dataTransfer?.dropEffect || NONE;\n if (dropEffect === NONE) {\n // pointer is back over selection\n target.selectionStart = selectionStart;\n target.selectionEnd = selectionEnd;\n target._updateTextarea();\n target.hiddenTextarea!.focus();\n } else {\n target.clearContextTop();\n if (dropEffect === 'move') {\n target.removeChars(selectionStart, selectionEnd);\n target.selectionStart = target.selectionEnd = selectionStart;\n target.hiddenTextarea &&\n (target.hiddenTextarea.value = target.text);\n target._updateTextarea();\n target.fire(CHANGED, {\n index: selectionStart,\n action: 'dragend',\n });\n canvas.fire('text:changed', { target });\n canvas.requestRenderAll();\n }\n target.exitEditing();\n }\n }\n }\n\n this.__dragImageDisposer && this.__dragImageDisposer();\n delete this.__dragImageDisposer;\n delete this.__dragStartSelection;\n this.__isDraggingOver = false;\n }\n\n dispose() {\n this._dispose && this._dispose();\n }\n}\n","import type { ObjectEvents, TPointerEvent } from '../../EventTypeDefs';\nimport { Point } from '../../Point';\nimport type { FabricObject } from '../Object/FabricObject';\nimport { FabricText } from '../Text/Text';\nimport { animate } from '../../util/animation/animate';\nimport type { TOnAnimationChangeCallback } from '../../util/animation/types';\nimport type { ValueAnimation } from '../../util/animation/ValueAnimation';\nimport type { TextStyleDeclaration } from '../Text/StyledText';\nimport type { SerializedTextProps, TextProps } from '../Text/Text';\nimport type { TOptions } from '../../typedefs';\nimport { getDocumentFromElement } from '../../util/dom_misc';\nimport { LEFT, MODIFIED, RIGHT, reNewline } from '../../constants';\nimport type { IText } from './IText';\n\n/**\n * extend this regex to support non english languages\n *\n * - ` ` Matches a SPACE character (char code 32).\n * - `\\n` Matches a LINE FEED character (char code 10).\n * - `\\.` Matches a \".\" character (char code 46).\n * - `,` Matches a \",\" character (char code 44).\n * - `;` Matches a \";\" character (char code 59).\n * - `!` Matches a \"!\" character (char code 33).\n * - `\\?` Matches a \"?\" character (char code 63).\n * - `\\-` Matches a \"-\" character (char code 45).\n */\n// eslint-disable-next-line no-useless-escape\nconst reNonWord = /[ \\n\\.,;!\\?\\-]/;\n\nexport type ITextEvents = ObjectEvents & {\n 'selection:changed': never;\n changed: never | { index: number; action: string };\n 'editing:entered': never | { e: TPointerEvent };\n 'editing:exited': never;\n};\n\nexport abstract class ITextBehavior<\n Props extends TOptions = Partial,\n SProps extends SerializedTextProps = SerializedTextProps,\n EventSpec extends ITextEvents = ITextEvents,\n> extends FabricText {\n declare abstract isEditing: boolean;\n declare abstract cursorDelay: number;\n declare abstract selectionStart: number;\n declare abstract selectionEnd: number;\n declare abstract cursorDuration: number;\n declare abstract editable: boolean;\n declare abstract editingBorderColor: string;\n\n declare abstract compositionStart: number;\n declare abstract compositionEnd: number;\n\n declare abstract hiddenTextarea: HTMLTextAreaElement | null;\n\n /**\n * Helps determining when the text is in composition, so that the cursor\n * rendering is altered.\n */\n declare protected inCompositionMode: boolean;\n\n declare protected _reSpace: RegExp;\n declare private _currentTickState?: ValueAnimation;\n declare private _currentTickCompleteState?: ValueAnimation;\n protected _currentCursorOpacity = 1;\n declare private _textBeforeEdit: string;\n declare protected __selectionStartOnMouseDown: number;\n\n /**\n * Keeps track if the IText object was selected before the actual click.\n * This because we want to delay enter editing by a click.\n */\n declare protected selected: boolean;\n declare protected cursorOffsetCache: { left?: number; top?: number };\n declare protected _savedProps?: {\n hasControls: boolean;\n borderColor: string;\n lockMovementX: boolean;\n lockMovementY: boolean;\n selectable: boolean;\n hoverCursor: CSSStyleDeclaration['cursor'] | null;\n defaultCursor?: CSSStyleDeclaration['cursor'];\n moveCursor?: CSSStyleDeclaration['cursor'];\n };\n declare protected _selectionDirection: 'left' | 'right' | null;\n\n abstract initHiddenTextarea(): void;\n abstract _fireSelectionChanged(): void;\n abstract renderCursorOrSelection(): void;\n abstract getSelectionStartFromPointer(e: TPointerEvent): number;\n abstract _getCursorBoundaries(\n index: number,\n skipCaching?: boolean,\n ): {\n left: number;\n top: number;\n leftOffset: number;\n topOffset: number;\n };\n\n /**\n * Initializes all the interactive behavior of IText\n */\n initBehavior() {\n this._tick = this._tick.bind(this);\n this._onTickComplete = this._onTickComplete.bind(this);\n this.updateSelectionOnMouseMove =\n this.updateSelectionOnMouseMove.bind(this);\n }\n\n onDeselect(options?: { e?: TPointerEvent; object?: FabricObject }) {\n this.isEditing && this.exitEditing();\n this.selected = false;\n return super.onDeselect(options);\n }\n\n /**\n * @private\n */\n _animateCursor({\n toValue,\n duration,\n delay,\n onComplete,\n }: {\n toValue: number;\n duration: number;\n delay?: number;\n onComplete?: TOnAnimationChangeCallback;\n }) {\n return animate({\n startValue: this._currentCursorOpacity,\n endValue: toValue,\n duration,\n delay,\n onComplete,\n abort: () =>\n !this.canvas ||\n // we do not want to animate a selection, only cursor\n this.selectionStart !== this.selectionEnd,\n onChange: (value) => {\n this._currentCursorOpacity = value;\n this.renderCursorOrSelection();\n },\n });\n }\n\n /**\n * changes the cursor from visible to invisible\n */\n private _tick(delay?: number) {\n this._currentTickState = this._animateCursor({\n toValue: 0,\n duration: this.cursorDuration / 2,\n delay: Math.max(delay || 0, 100),\n onComplete: this._onTickComplete,\n });\n }\n\n /**\n * Changes the cursor from invisible to visible\n */\n private _onTickComplete() {\n this._currentTickCompleteState?.abort();\n this._currentTickCompleteState = this._animateCursor({\n toValue: 1,\n duration: this.cursorDuration,\n onComplete: this._tick,\n });\n }\n\n /**\n * Initializes delayed cursor\n */\n initDelayedCursor(restart?: boolean) {\n this.abortCursorAnimation();\n this._tick(restart ? 0 : this.cursorDelay);\n }\n\n /**\n * Aborts cursor animation, clears all timeouts and clear textarea context if necessary\n */\n abortCursorAnimation() {\n let shouldClear = false;\n [this._currentTickState, this._currentTickCompleteState].forEach(\n (cursorAnimation) => {\n if (cursorAnimation && !cursorAnimation.isDone()) {\n shouldClear = true;\n cursorAnimation.abort();\n }\n },\n );\n\n this._currentCursorOpacity = 1;\n\n // make sure we clear context even if instance is not editing\n if (shouldClear) {\n this.clearContextTop();\n }\n }\n\n /**\n * Restart tue cursor animation if either is in complete state ( between animations )\n * or if it never started before\n */\n restartCursorIfNeeded() {\n if (\n [this._currentTickState, this._currentTickCompleteState].some(\n (cursorAnimation) => !cursorAnimation || cursorAnimation.isDone(),\n )\n ) {\n this.initDelayedCursor();\n }\n }\n\n /**\n * Selects entire text\n */\n selectAll() {\n this.selectionStart = 0;\n this.selectionEnd = this._text.length;\n this._fireSelectionChanged();\n this._updateTextarea();\n return this;\n }\n\n /**\n * Selects entire text and updates the visual state\n */\n cmdAll() {\n this.selectAll();\n this.renderCursorOrSelection();\n }\n\n /**\n * Returns selected text\n * @return {String}\n */\n getSelectedText(): string {\n return this._text.slice(this.selectionStart, this.selectionEnd).join('');\n }\n\n /**\n * Find new selection index representing start of current word according to current selection index\n * @param {Number} startFrom Current selection index\n * @return {Number} New selection index\n */\n findWordBoundaryLeft(startFrom: number): number {\n let offset = 0,\n index = startFrom - 1;\n\n // remove space before cursor first\n if (this._reSpace.test(this._text[index])) {\n while (this._reSpace.test(this._text[index])) {\n offset++;\n index--;\n }\n }\n while (/\\S/.test(this._text[index]) && index > -1) {\n offset++;\n index--;\n }\n\n return startFrom - offset;\n }\n\n /**\n * Find new selection index representing end of current word according to current selection index\n * @param {Number} startFrom Current selection index\n * @return {Number} New selection index\n */\n findWordBoundaryRight(startFrom: number): number {\n let offset = 0,\n index = startFrom;\n\n // remove space after cursor first\n if (this._reSpace.test(this._text[index])) {\n while (this._reSpace.test(this._text[index])) {\n offset++;\n index++;\n }\n }\n while (/\\S/.test(this._text[index]) && index < this._text.length) {\n offset++;\n index++;\n }\n\n return startFrom + offset;\n }\n\n /**\n * Find new selection index representing start of current line according to current selection index\n * @param {Number} startFrom Current selection index\n * @return {Number} New selection index\n */\n findLineBoundaryLeft(startFrom: number): number {\n let offset = 0,\n index = startFrom - 1;\n\n while (!/\\n/.test(this._text[index]) && index > -1) {\n offset++;\n index--;\n }\n\n return startFrom - offset;\n }\n\n /**\n * Find new selection index representing end of current line according to current selection index\n * @param {Number} startFrom Current selection index\n * @return {Number} New selection index\n */\n findLineBoundaryRight(startFrom: number): number {\n let offset = 0,\n index = startFrom;\n\n while (!/\\n/.test(this._text[index]) && index < this._text.length) {\n offset++;\n index++;\n }\n\n return startFrom + offset;\n }\n\n /**\n * Finds index corresponding to beginning or end of a word\n * @param {Number} selectionStart Index of a character\n * @param {Number} direction 1 or -1\n * @return {Number} Index of the beginning or end of a word\n */\n searchWordBoundary(selectionStart: number, direction: 1 | -1): number {\n const text = this._text;\n // if we land on a space we move the cursor backwards\n // if we are searching boundary end we move the cursor backwards ONLY if we don't land on a line break\n let index =\n selectionStart > 0 &&\n this._reSpace.test(text[selectionStart]) &&\n (direction === -1 || !reNewline.test(text[selectionStart - 1]))\n ? selectionStart - 1\n : selectionStart,\n _char = text[index];\n while (index > 0 && index < text.length && !reNonWord.test(_char)) {\n index += direction;\n _char = text[index];\n }\n if (direction === -1 && reNonWord.test(_char)) {\n index++;\n }\n return index;\n }\n\n /**\n * Selects the word that contains the char at index selectionStart\n * @param {Number} selectionStart Index of a character\n */\n selectWord(selectionStart?: number) {\n selectionStart = selectionStart ?? this.selectionStart;\n // search backwards\n const newSelectionStart = this.searchWordBoundary(selectionStart, -1),\n // search forward\n newSelectionEnd = Math.max(\n newSelectionStart,\n this.searchWordBoundary(selectionStart, 1),\n );\n\n this.selectionStart = newSelectionStart;\n this.selectionEnd = newSelectionEnd;\n this._fireSelectionChanged();\n this._updateTextarea();\n // remove next major, for now it renders twice :(\n this.renderCursorOrSelection();\n }\n\n /**\n * Selects the line that contains selectionStart\n * @param {Number} selectionStart Index of a character\n */\n selectLine(selectionStart?: number) {\n selectionStart = selectionStart ?? this.selectionStart;\n const newSelectionStart = this.findLineBoundaryLeft(selectionStart),\n newSelectionEnd = this.findLineBoundaryRight(selectionStart);\n\n this.selectionStart = newSelectionStart;\n this.selectionEnd = newSelectionEnd;\n this._fireSelectionChanged();\n this._updateTextarea();\n }\n\n /**\n * Enters editing state\n */\n enterEditing(e?: TPointerEvent) {\n if (this.isEditing || !this.editable) {\n return;\n }\n this.enterEditingImpl();\n this.fire('editing:entered', e ? { e } : undefined);\n this._fireSelectionChanged();\n if (this.canvas) {\n this.canvas.fire('text:editing:entered', {\n target: this as unknown as IText,\n e,\n });\n this.canvas.requestRenderAll();\n }\n }\n\n /**\n * runs the actual logic that enter from editing state, see {@link enterEditing}\n */\n enterEditingImpl() {\n if (this.canvas) {\n this.canvas.calcOffset();\n this.canvas.textEditingManager.exitTextEditing();\n }\n\n this.isEditing = true;\n\n this.initHiddenTextarea();\n this.hiddenTextarea!.focus();\n this.hiddenTextarea!.value = this.text;\n this._updateTextarea();\n this._saveEditingProps();\n this._setEditingProps();\n this._textBeforeEdit = this.text;\n\n this._tick();\n }\n\n /**\n * called by {@link Canvas#textEditingManager}\n */\n updateSelectionOnMouseMove(e: TPointerEvent) {\n if (this.getActiveControl()) {\n return;\n }\n\n const el = this.hiddenTextarea!;\n // regain focus\n getDocumentFromElement(el).activeElement !== el && el.focus();\n\n const newSelectionStart = this.getSelectionStartFromPointer(e),\n currentStart = this.selectionStart,\n currentEnd = this.selectionEnd;\n if (\n (newSelectionStart !== this.__selectionStartOnMouseDown ||\n currentStart === currentEnd) &&\n (currentStart === newSelectionStart || currentEnd === newSelectionStart)\n ) {\n return;\n }\n if (newSelectionStart > this.__selectionStartOnMouseDown) {\n this.selectionStart = this.__selectionStartOnMouseDown;\n this.selectionEnd = newSelectionStart;\n } else {\n this.selectionStart = newSelectionStart;\n this.selectionEnd = this.__selectionStartOnMouseDown;\n }\n if (\n this.selectionStart !== currentStart ||\n this.selectionEnd !== currentEnd\n ) {\n this._fireSelectionChanged();\n this._updateTextarea();\n this.renderCursorOrSelection();\n }\n }\n\n /**\n * @private\n */\n _setEditingProps() {\n this.hoverCursor = 'text';\n\n if (this.canvas) {\n this.canvas.defaultCursor = this.canvas.moveCursor = 'text';\n }\n\n this.borderColor = this.editingBorderColor;\n this.hasControls = this.selectable = false;\n this.lockMovementX = this.lockMovementY = true;\n }\n\n /**\n * convert from textarea to grapheme indexes\n */\n fromStringToGraphemeSelection(start: number, end: number, text: string) {\n const smallerTextStart = text.slice(0, start),\n graphemeStart = this.graphemeSplit(smallerTextStart).length;\n if (start === end) {\n return { selectionStart: graphemeStart, selectionEnd: graphemeStart };\n }\n const smallerTextEnd = text.slice(start, end),\n graphemeEnd = this.graphemeSplit(smallerTextEnd).length;\n return {\n selectionStart: graphemeStart,\n selectionEnd: graphemeStart + graphemeEnd,\n };\n }\n\n /**\n * convert from fabric to textarea values\n */\n fromGraphemeToStringSelection(\n start: number,\n end: number,\n graphemes: string[],\n ) {\n const smallerTextStart = graphemes.slice(0, start),\n graphemeStart = smallerTextStart.join('').length;\n if (start === end) {\n return { selectionStart: graphemeStart, selectionEnd: graphemeStart };\n }\n const smallerTextEnd = graphemes.slice(start, end),\n graphemeEnd = smallerTextEnd.join('').length;\n return {\n selectionStart: graphemeStart,\n selectionEnd: graphemeStart + graphemeEnd,\n };\n }\n\n /**\n * @private\n */\n _updateTextarea() {\n this.cursorOffsetCache = {};\n if (!this.hiddenTextarea) {\n return;\n }\n if (!this.inCompositionMode) {\n const newSelection = this.fromGraphemeToStringSelection(\n this.selectionStart,\n this.selectionEnd,\n this._text,\n );\n this.hiddenTextarea.selectionStart = newSelection.selectionStart;\n this.hiddenTextarea.selectionEnd = newSelection.selectionEnd;\n }\n this.updateTextareaPosition();\n }\n\n /**\n * @private\n */\n updateFromTextArea() {\n if (!this.hiddenTextarea) {\n return;\n }\n this.cursorOffsetCache = {};\n const textarea = this.hiddenTextarea;\n this.text = textarea.value;\n this.set('dirty', true);\n this.initDimensions();\n this.setCoords();\n const newSelection = this.fromStringToGraphemeSelection(\n textarea.selectionStart,\n textarea.selectionEnd,\n textarea.value,\n );\n this.selectionEnd = this.selectionStart = newSelection.selectionEnd;\n if (!this.inCompositionMode) {\n this.selectionStart = newSelection.selectionStart;\n }\n this.updateTextareaPosition();\n }\n\n /**\n * @private\n */\n updateTextareaPosition() {\n if (this.selectionStart === this.selectionEnd) {\n const style = this._calcTextareaPosition();\n this.hiddenTextarea!.style.left = style.left;\n this.hiddenTextarea!.style.top = style.top;\n }\n }\n\n /**\n * @private\n * @return {Object} style contains style for hiddenTextarea\n */\n _calcTextareaPosition() {\n if (!this.canvas) {\n return { left: '1px', top: '1px' };\n }\n const desiredPosition = this.inCompositionMode\n ? this.compositionStart\n : this.selectionStart,\n boundaries = this._getCursorBoundaries(desiredPosition),\n cursorLocation = this.get2DCursorLocation(desiredPosition),\n lineIndex = cursorLocation.lineIndex,\n charIndex = cursorLocation.charIndex,\n charHeight =\n this.getValueOfPropertyAt(lineIndex, charIndex, 'fontSize') *\n this.lineHeight,\n leftOffset = boundaries.leftOffset,\n retinaScaling = this.getCanvasRetinaScaling(),\n upperCanvas = this.canvas.upperCanvasEl,\n upperCanvasWidth = upperCanvas.width / retinaScaling,\n upperCanvasHeight = upperCanvas.height / retinaScaling,\n maxWidth = upperCanvasWidth - charHeight,\n maxHeight = upperCanvasHeight - charHeight;\n\n const p = new Point(\n boundaries.left + leftOffset,\n boundaries.top + boundaries.topOffset + charHeight,\n )\n .transform(this.calcTransformMatrix())\n .transform(this.canvas.viewportTransform)\n .multiply(\n new Point(\n upperCanvas.clientWidth / upperCanvasWidth,\n upperCanvas.clientHeight / upperCanvasHeight,\n ),\n );\n\n if (p.x < 0) {\n p.x = 0;\n }\n if (p.x > maxWidth) {\n p.x = maxWidth;\n }\n if (p.y < 0) {\n p.y = 0;\n }\n if (p.y > maxHeight) {\n p.y = maxHeight;\n }\n\n // add canvas offset on document\n p.x += this.canvas._offset.left;\n p.y += this.canvas._offset.top;\n\n return {\n left: `${p.x}px`,\n top: `${p.y}px`,\n fontSize: `${charHeight}px`,\n charHeight: charHeight,\n };\n }\n\n /**\n * @private\n */\n _saveEditingProps() {\n this._savedProps = {\n hasControls: this.hasControls,\n borderColor: this.borderColor,\n lockMovementX: this.lockMovementX,\n lockMovementY: this.lockMovementY,\n hoverCursor: this.hoverCursor,\n selectable: this.selectable,\n defaultCursor: this.canvas && this.canvas.defaultCursor,\n moveCursor: this.canvas && this.canvas.moveCursor,\n };\n }\n\n /**\n * @private\n */\n _restoreEditingProps() {\n if (!this._savedProps) {\n return;\n }\n\n this.hoverCursor = this._savedProps.hoverCursor;\n this.hasControls = this._savedProps.hasControls;\n this.borderColor = this._savedProps.borderColor;\n this.selectable = this._savedProps.selectable;\n this.lockMovementX = this._savedProps.lockMovementX;\n this.lockMovementY = this._savedProps.lockMovementY;\n\n if (this.canvas) {\n this.canvas.defaultCursor =\n this._savedProps.defaultCursor || this.canvas.defaultCursor;\n this.canvas.moveCursor =\n this._savedProps.moveCursor || this.canvas.moveCursor;\n }\n\n delete this._savedProps;\n }\n\n /**\n * runs the actual logic that exits from editing state, see {@link exitEditing}\n * But it does not fire events\n */\n exitEditingImpl() {\n const hiddenTextarea = this.hiddenTextarea;\n this.selected = false;\n this.isEditing = false;\n\n if (hiddenTextarea) {\n hiddenTextarea.blur && hiddenTextarea.blur();\n hiddenTextarea.parentNode &&\n hiddenTextarea.parentNode.removeChild(hiddenTextarea);\n }\n this.hiddenTextarea = null;\n this.abortCursorAnimation();\n this.selectionStart !== this.selectionEnd && this.clearContextTop();\n this.selectionEnd = this.selectionStart;\n this._restoreEditingProps();\n if (this._forceClearCache) {\n this.initDimensions();\n this.setCoords();\n }\n }\n\n /**\n * Exits from editing state and fires relevant events\n */\n exitEditing() {\n const isTextChanged = this._textBeforeEdit !== this.text;\n this.exitEditingImpl();\n\n this.fire('editing:exited');\n isTextChanged && this.fire(MODIFIED);\n if (this.canvas) {\n this.canvas.fire('text:editing:exited', {\n target: this as unknown as IText,\n });\n // todo: evaluate add an action to this event\n isTextChanged && this.canvas.fire('object:modified', { target: this });\n }\n return this;\n }\n\n /**\n * @private\n */\n _removeExtraneousStyles() {\n for (const prop in this.styles) {\n if (!this._textLines[prop as unknown as number]) {\n delete this.styles[prop];\n }\n }\n }\n\n /**\n * remove and reflow a style block from start to end.\n * @param {Number} start linear start position for removal (included in removal)\n * @param {Number} end linear end position for removal ( excluded from removal )\n */\n removeStyleFromTo(start: number, end: number) {\n const { lineIndex: lineStart, charIndex: charStart } =\n this.get2DCursorLocation(start, true),\n { lineIndex: lineEnd, charIndex: charEnd } = this.get2DCursorLocation(\n end,\n true,\n );\n if (lineStart !== lineEnd) {\n // step1 remove the trailing of lineStart\n if (this.styles[lineStart]) {\n for (\n let i = charStart;\n i < this._unwrappedTextLines[lineStart].length;\n i++\n ) {\n delete this.styles[lineStart][i];\n }\n }\n // step2 move the trailing of lineEnd to lineStart if needed\n if (this.styles[lineEnd]) {\n for (\n let i = charEnd;\n i < this._unwrappedTextLines[lineEnd].length;\n i++\n ) {\n const styleObj = this.styles[lineEnd][i];\n if (styleObj) {\n this.styles[lineStart] || (this.styles[lineStart] = {});\n this.styles[lineStart][charStart + i - charEnd] = styleObj;\n }\n }\n }\n // step3 detects lines will be completely removed.\n for (let i = lineStart + 1; i <= lineEnd; i++) {\n delete this.styles[i];\n }\n // step4 shift remaining lines.\n this.shiftLineStyles(lineEnd, lineStart - lineEnd);\n } else {\n // remove and shift left on the same line\n if (this.styles[lineStart]) {\n const styleObj = this.styles[lineStart];\n const diff = charEnd - charStart;\n for (let i = charStart; i < charEnd; i++) {\n delete styleObj[i];\n }\n for (const char in this.styles[lineStart]) {\n const numericChar = parseInt(char, 10);\n if (numericChar >= charEnd) {\n styleObj[numericChar - diff] = styleObj[char];\n delete styleObj[char];\n }\n }\n }\n }\n }\n\n /**\n * Shifts line styles up or down\n * @param {Number} lineIndex Index of a line\n * @param {Number} offset Can any number?\n */\n shiftLineStyles(lineIndex: number, offset: number) {\n const clonedStyles = Object.assign({}, this.styles);\n for (const line in this.styles) {\n const numericLine = parseInt(line, 10);\n if (numericLine > lineIndex) {\n this.styles[numericLine + offset] = clonedStyles[numericLine];\n if (!clonedStyles[numericLine - offset]) {\n delete this.styles[numericLine];\n }\n }\n }\n }\n\n /**\n * Handle insertion of more consecutive style lines for when one or more\n * newlines gets added to the text. Since current style needs to be shifted\n * first we shift the current style of the number lines needed, then we add\n * new lines from the last to the first.\n * @param {Number} lineIndex Index of a line\n * @param {Number} charIndex Index of a char\n * @param {Number} qty number of lines to add\n * @param {Array} copiedStyle Array of objects styles\n */\n insertNewlineStyleObject(\n lineIndex: number,\n charIndex: number,\n qty: number,\n copiedStyle?: { [index: number]: TextStyleDeclaration },\n ) {\n const newLineStyles: { [index: number]: TextStyleDeclaration } = {};\n const originalLineLength = this._unwrappedTextLines[lineIndex].length;\n const isEndOfLine = originalLineLength === charIndex;\n\n let someStyleIsCarryingOver = false;\n qty || (qty = 1);\n this.shiftLineStyles(lineIndex, qty);\n const currentCharStyle = this.styles[lineIndex]\n ? this.styles[lineIndex][charIndex === 0 ? charIndex : charIndex - 1]\n : undefined;\n\n // we clone styles of all chars\n // after cursor onto the current line\n for (const index in this.styles[lineIndex]) {\n const numIndex = parseInt(index, 10);\n if (numIndex >= charIndex) {\n someStyleIsCarryingOver = true;\n newLineStyles[numIndex - charIndex] = this.styles[lineIndex][index];\n // remove lines from the previous line since they're on a new line now\n if (!(isEndOfLine && charIndex === 0)) {\n delete this.styles[lineIndex][index];\n }\n }\n }\n let styleCarriedOver = false;\n if (someStyleIsCarryingOver && !isEndOfLine) {\n // if is end of line, the extra style we copied\n // is probably not something we want\n this.styles[lineIndex + qty] = newLineStyles;\n styleCarriedOver = true;\n }\n if (styleCarriedOver || originalLineLength > charIndex) {\n // skip the last line of since we already prepared it.\n // or contains text without style that we don't want to style\n // just because it changed lines\n qty--;\n }\n // for the all the lines or all the other lines\n // we clone current char style onto the next (otherwise empty) line\n while (qty > 0) {\n if (copiedStyle && copiedStyle[qty - 1]) {\n this.styles[lineIndex + qty] = {\n 0: { ...copiedStyle[qty - 1] },\n };\n } else if (currentCharStyle) {\n this.styles[lineIndex + qty] = {\n 0: { ...currentCharStyle },\n };\n } else {\n delete this.styles[lineIndex + qty];\n }\n qty--;\n }\n this._forceClearCache = true;\n }\n\n /**\n * Inserts style object for a given line/char index\n * @param {Number} lineIndex Index of a line\n * @param {Number} charIndex Index of a char\n * @param {Number} quantity number Style object to insert, if given\n * @param {Array} copiedStyle array of style objects\n */\n insertCharStyleObject(\n lineIndex: number,\n charIndex: number,\n quantity: number,\n copiedStyle?: TextStyleDeclaration[],\n ) {\n if (!this.styles) {\n this.styles = {};\n }\n const currentLineStyles = this.styles[lineIndex],\n currentLineStylesCloned = currentLineStyles\n ? { ...currentLineStyles }\n : {};\n\n quantity || (quantity = 1);\n // shift all char styles by quantity forward\n // 0,1,2,3 -> (charIndex=2) -> 0,1,3,4 -> (insert 2) -> 0,1,2,3,4\n for (const index in currentLineStylesCloned) {\n const numericIndex = parseInt(index, 10);\n if (numericIndex >= charIndex) {\n currentLineStyles[numericIndex + quantity] =\n currentLineStylesCloned[numericIndex];\n // only delete the style if there was nothing moved there\n if (!currentLineStylesCloned[numericIndex - quantity]) {\n delete currentLineStyles[numericIndex];\n }\n }\n }\n this._forceClearCache = true;\n if (copiedStyle) {\n while (quantity--) {\n if (!Object.keys(copiedStyle[quantity]).length) {\n continue;\n }\n if (!this.styles[lineIndex]) {\n this.styles[lineIndex] = {};\n }\n this.styles[lineIndex][charIndex + quantity] = {\n ...copiedStyle[quantity],\n };\n }\n return;\n }\n if (!currentLineStyles) {\n return;\n }\n const newStyle = currentLineStyles[charIndex ? charIndex - 1 : 1];\n while (newStyle && quantity--) {\n this.styles[lineIndex][charIndex + quantity] = { ...newStyle };\n }\n }\n\n /**\n * Inserts style object(s)\n * @param {Array} insertedText Characters at the location where style is inserted\n * @param {Number} start cursor index for inserting style\n * @param {Array} [copiedStyle] array of style objects to insert.\n */\n insertNewStyleBlock(\n insertedText: string[],\n start: number,\n copiedStyle?: TextStyleDeclaration[],\n ) {\n const cursorLoc = this.get2DCursorLocation(start, true),\n addedLines = [0];\n let linesLength = 0;\n // get an array of how many char per lines are being added.\n for (let i = 0; i < insertedText.length; i++) {\n if (insertedText[i] === '\\n') {\n linesLength++;\n addedLines[linesLength] = 0;\n } else {\n addedLines[linesLength]++;\n }\n }\n // for the first line copy the style from the current char position.\n if (addedLines[0] > 0) {\n this.insertCharStyleObject(\n cursorLoc.lineIndex,\n cursorLoc.charIndex,\n addedLines[0],\n copiedStyle,\n );\n copiedStyle = copiedStyle && copiedStyle.slice(addedLines[0] + 1);\n }\n linesLength &&\n this.insertNewlineStyleObject(\n cursorLoc.lineIndex,\n cursorLoc.charIndex + addedLines[0],\n linesLength,\n );\n let i;\n for (i = 1; i < linesLength; i++) {\n if (addedLines[i] > 0) {\n this.insertCharStyleObject(\n cursorLoc.lineIndex + i,\n 0,\n addedLines[i],\n copiedStyle,\n );\n } else if (copiedStyle) {\n // this test is required in order to close #6841\n // when a pasted buffer begins with a newline then\n // this.styles[cursorLoc.lineIndex + i] and copiedStyle[0]\n // may be undefined for some reason\n if (this.styles[cursorLoc.lineIndex + i] && copiedStyle[0]) {\n this.styles[cursorLoc.lineIndex + i][0] = copiedStyle[0];\n }\n }\n copiedStyle = copiedStyle && copiedStyle.slice(addedLines[i] + 1);\n }\n if (addedLines[i] > 0) {\n this.insertCharStyleObject(\n cursorLoc.lineIndex + i,\n 0,\n addedLines[i],\n copiedStyle,\n );\n }\n }\n\n /**\n * Removes characters from start/end\n * start/end ar per grapheme position in _text array.\n *\n * @param {Number} start\n * @param {Number} end default to start + 1\n */\n removeChars(start: number, end: number = start + 1) {\n this.removeStyleFromTo(start, end);\n this._text.splice(start, end - start);\n this.text = this._text.join('');\n this.set('dirty', true);\n this.initDimensions();\n this.setCoords();\n this._removeExtraneousStyles();\n }\n\n /**\n * insert characters at start position, before start position.\n * start equal 1 it means the text get inserted between actual grapheme 0 and 1\n * if style array is provided, it must be as the same length of text in graphemes\n * if end is provided and is bigger than start, old text is replaced.\n * start/end ar per grapheme position in _text array.\n *\n * @param {String} text text to insert\n * @param {Array} style array of style objects\n * @param {Number} start\n * @param {Number} end default to start + 1\n */\n insertChars(\n text: string,\n style: TextStyleDeclaration[] | undefined,\n start: number,\n end: number = start,\n ) {\n if (end > start) {\n this.removeStyleFromTo(start, end);\n }\n const graphemes = this.graphemeSplit(text);\n this.insertNewStyleBlock(graphemes, start, style);\n this._text = [\n ...this._text.slice(0, start),\n ...graphemes,\n ...this._text.slice(end),\n ];\n this.text = this._text.join('');\n this.set('dirty', true);\n this.initDimensions();\n this.setCoords();\n this._removeExtraneousStyles();\n }\n\n /**\n * Set the selectionStart and selectionEnd according to the new position of cursor\n * mimic the key - mouse navigation when shift is pressed.\n */\n setSelectionStartEndWithShift(\n start: number,\n end: number,\n newSelection: number,\n ) {\n if (newSelection <= start) {\n if (end === start) {\n this._selectionDirection = LEFT;\n } else if (this._selectionDirection === RIGHT) {\n this._selectionDirection = LEFT;\n this.selectionEnd = start;\n }\n this.selectionStart = newSelection;\n } else if (newSelection > start && newSelection < end) {\n if (this._selectionDirection === RIGHT) {\n this.selectionEnd = newSelection;\n } else {\n this.selectionStart = newSelection;\n }\n } else {\n // newSelection is > selection start and end\n if (end === start) {\n this._selectionDirection = RIGHT;\n } else if (this._selectionDirection === LEFT) {\n this._selectionDirection = RIGHT;\n this.selectionStart = end;\n }\n this.selectionEnd = newSelection;\n }\n }\n}\n","import { config } from '../../config';\nimport { getFabricDocument, getEnv } from '../../env';\nimport { capValue } from '../../util/misc/capValue';\nimport type { ITextEvents } from './ITextBehavior';\nimport { ITextBehavior } from './ITextBehavior';\nimport type { TKeyMapIText } from './constants';\nimport type { TOptions } from '../../typedefs';\nimport type { TextProps, SerializedTextProps } from '../Text/Text';\nimport { getDocumentFromElement } from '../../util/dom_misc';\nimport { CHANGED, LEFT, RIGHT } from '../../constants';\nimport type { IText } from './IText';\nimport type { TextStyleDeclaration } from '../Text/StyledText';\n\nexport abstract class ITextKeyBehavior<\n Props extends TOptions = Partial,\n SProps extends SerializedTextProps = SerializedTextProps,\n EventSpec extends ITextEvents = ITextEvents,\n> extends ITextBehavior {\n /**\n * For functionalities on keyDown\n * Map a special key to a function of the instance/prototype\n * If you need different behavior for ESC or TAB or arrows, you have to change\n * this map setting the name of a function that you build on the IText or\n * your prototype.\n * the map change will affect all Instances unless you need for only some text Instances\n * in that case you have to clone this object and assign your Instance.\n * this.keysMap = Object.assign({}, this.keysMap);\n * The function must be in IText.prototype.myFunction And will receive event as args[0]\n */\n declare keysMap: TKeyMapIText;\n\n declare keysMapRtl: TKeyMapIText;\n\n /**\n * For functionalities on keyUp + ctrl || cmd\n */\n declare ctrlKeysMapUp: TKeyMapIText;\n\n /**\n * For functionalities on keyDown + ctrl || cmd\n */\n declare ctrlKeysMapDown: TKeyMapIText;\n\n declare hiddenTextarea: HTMLTextAreaElement | null;\n\n /**\n * DOM container to append the hiddenTextarea.\n * An alternative to attaching to the document.body.\n * Useful to reduce laggish redraw of the full document.body tree and\n * also with modals event capturing that won't let the textarea take focus.\n * @type HTMLElement\n */\n declare hiddenTextareaContainer?: HTMLElement | null;\n\n declare private _clickHandlerInitialized: boolean;\n declare private _copyDone: boolean;\n declare private fromPaste: boolean;\n\n /**\n * Initializes hidden textarea (needed to bring up keyboard in iOS)\n */\n initHiddenTextarea() {\n const doc =\n (this.canvas && getDocumentFromElement(this.canvas.getElement())) ||\n getFabricDocument();\n const textarea = doc.createElement('textarea');\n Object.entries({\n autocapitalize: 'off',\n autocorrect: 'off',\n autocomplete: 'off',\n spellcheck: 'false',\n 'data-fabric': 'textarea',\n wrap: 'off',\n name: 'fabricTextarea',\n }).map(([attribute, value]) => textarea.setAttribute(attribute, value));\n const { top, left, fontSize } = this._calcTextareaPosition();\n // line-height: 1px; was removed from the style to fix this:\n // https://bugs.chromium.org/p/chromium/issues/detail?id=870966\n textarea.style.cssText = `position: absolute; top: ${top}; left: ${left}; z-index: -999; opacity: 0; width: 1px; height: 1px; font-size: 1px; padding-top: ${fontSize};`;\n\n (this.hiddenTextareaContainer || doc.body).appendChild(textarea);\n\n Object.entries({\n blur: 'blur',\n keydown: 'onKeyDown',\n keyup: 'onKeyUp',\n input: 'onInput',\n copy: 'copy',\n cut: 'copy',\n paste: 'paste',\n compositionstart: 'onCompositionStart',\n compositionupdate: 'onCompositionUpdate',\n compositionend: 'onCompositionEnd',\n } as Record).map(([eventName, handler]) =>\n textarea.addEventListener(\n eventName,\n (this[handler] as EventListener).bind(this),\n ),\n );\n this.hiddenTextarea = textarea;\n }\n\n /**\n * Override this method to customize cursor behavior on textbox blur\n */\n blur() {\n this.abortCursorAnimation();\n }\n\n /**\n * Handles keydown event\n * only used for arrows and combination of modifier keys.\n * @param {KeyboardEvent} e Event object\n */\n onKeyDown(e: KeyboardEvent) {\n if (!this.isEditing) {\n return;\n }\n const keyMap = this.direction === 'rtl' ? this.keysMapRtl : this.keysMap;\n if (e.keyCode in keyMap) {\n (this[keyMap[e.keyCode] as keyof this] as (arg: KeyboardEvent) => void)(\n e,\n );\n } else if (e.keyCode in this.ctrlKeysMapDown && (e.ctrlKey || e.metaKey)) {\n (\n this[this.ctrlKeysMapDown[e.keyCode] as keyof this] as (\n arg: KeyboardEvent,\n ) => void\n )(e);\n } else {\n return;\n }\n e.stopImmediatePropagation();\n e.preventDefault();\n if (e.keyCode >= 33 && e.keyCode <= 40) {\n // if i press an arrow key just update selection\n this.inCompositionMode = false;\n this.clearContextTop();\n this.renderCursorOrSelection();\n } else {\n this.canvas && this.canvas.requestRenderAll();\n }\n }\n\n /**\n * Handles keyup event\n * We handle KeyUp because ie11 and edge have difficulties copy/pasting\n * if a copy/cut event fired, keyup is dismissed\n * @param {KeyboardEvent} e Event object\n */\n onKeyUp(e: KeyboardEvent) {\n if (!this.isEditing || this._copyDone || this.inCompositionMode) {\n this._copyDone = false;\n return;\n }\n if (e.keyCode in this.ctrlKeysMapUp && (e.ctrlKey || e.metaKey)) {\n (\n this[this.ctrlKeysMapUp[e.keyCode] as keyof this] as (\n arg: KeyboardEvent,\n ) => void\n )(e);\n } else {\n return;\n }\n e.stopImmediatePropagation();\n e.preventDefault();\n this.canvas && this.canvas.requestRenderAll();\n }\n\n /**\n * Handles onInput event\n * @param {Event} e Event object\n */\n onInput(this: this & { hiddenTextarea: HTMLTextAreaElement }, e: Event) {\n const fromPaste = this.fromPaste;\n const { value, selectionStart, selectionEnd } = this.hiddenTextarea;\n this.fromPaste = false;\n e && e.stopPropagation();\n if (!this.isEditing) {\n return;\n }\n const updateAndFire = () => {\n this.updateFromTextArea();\n this.fire(CHANGED);\n if (this.canvas) {\n this.canvas.fire('text:changed', { target: this as unknown as IText });\n this.canvas.requestRenderAll();\n }\n };\n if (this.hiddenTextarea.value === '') {\n this.styles = {};\n updateAndFire();\n return;\n }\n // decisions about style changes.\n const nextText = this._splitTextIntoLines(value).graphemeText,\n charCount = this._text.length,\n nextCharCount = nextText.length,\n _selectionStart = this.selectionStart,\n _selectionEnd = this.selectionEnd,\n selection = _selectionStart !== _selectionEnd;\n let copiedStyle: TextStyleDeclaration[] | undefined,\n removedText,\n charDiff = nextCharCount - charCount,\n removeFrom,\n removeTo;\n\n const textareaSelection = this.fromStringToGraphemeSelection(\n selectionStart,\n selectionEnd,\n value,\n );\n const backDelete = _selectionStart > textareaSelection.selectionStart;\n\n if (selection) {\n removedText = this._text.slice(_selectionStart, _selectionEnd);\n charDiff += _selectionEnd - _selectionStart;\n } else if (nextCharCount < charCount) {\n if (backDelete) {\n removedText = this._text.slice(_selectionEnd + charDiff, _selectionEnd);\n } else {\n removedText = this._text.slice(\n _selectionStart,\n _selectionStart - charDiff,\n );\n }\n }\n const insertedText = nextText.slice(\n textareaSelection.selectionEnd - charDiff,\n textareaSelection.selectionEnd,\n );\n if (removedText && removedText.length) {\n if (insertedText.length) {\n // let's copy some style before deleting.\n // we want to copy the style before the cursor OR the style at the cursor if selection\n // is bigger than 0.\n copiedStyle = this.getSelectionStyles(\n _selectionStart,\n _selectionStart + 1,\n false,\n );\n // now duplicate the style one for each inserted text.\n copiedStyle = insertedText.map(\n () =>\n // this return an array of references, but that is fine since we are\n // copying the style later.\n copiedStyle![0],\n );\n }\n if (selection) {\n removeFrom = _selectionStart;\n removeTo = _selectionEnd;\n } else if (backDelete) {\n // detect differences between forwardDelete and backDelete\n removeFrom = _selectionEnd - removedText.length;\n removeTo = _selectionEnd;\n } else {\n removeFrom = _selectionEnd;\n removeTo = _selectionEnd + removedText.length;\n }\n this.removeStyleFromTo(removeFrom, removeTo);\n }\n if (insertedText.length) {\n const { copyPasteData } = getEnv();\n if (\n fromPaste &&\n insertedText.join('') === copyPasteData.copiedText &&\n !config.disableStyleCopyPaste\n ) {\n copiedStyle = copyPasteData.copiedTextStyle;\n }\n this.insertNewStyleBlock(insertedText, _selectionStart, copiedStyle);\n }\n updateAndFire();\n }\n\n /**\n * Composition start\n */\n onCompositionStart() {\n this.inCompositionMode = true;\n }\n\n /**\n * Composition end\n */\n onCompositionEnd() {\n this.inCompositionMode = false;\n }\n\n onCompositionUpdate({ target }: CompositionEvent) {\n const { selectionStart, selectionEnd } = target as HTMLTextAreaElement;\n this.compositionStart = selectionStart;\n this.compositionEnd = selectionEnd;\n this.updateTextareaPosition();\n }\n\n /**\n * Copies selected text\n */\n copy() {\n if (this.selectionStart === this.selectionEnd) {\n //do not cut-copy if no selection\n return;\n }\n const { copyPasteData } = getEnv();\n copyPasteData.copiedText = this.getSelectedText();\n if (!config.disableStyleCopyPaste) {\n copyPasteData.copiedTextStyle = this.getSelectionStyles(\n this.selectionStart,\n this.selectionEnd,\n true,\n );\n } else {\n copyPasteData.copiedTextStyle = undefined;\n }\n this._copyDone = true;\n }\n\n /**\n * Pastes text\n */\n paste() {\n this.fromPaste = true;\n }\n\n /**\n * Finds the width in pixels before the cursor on the same line\n * @private\n * @param {Number} lineIndex\n * @param {Number} charIndex\n * @return {Number} widthBeforeCursor width before cursor\n */\n _getWidthBeforeCursor(lineIndex: number, charIndex: number): number {\n let widthBeforeCursor = this._getLineLeftOffset(lineIndex),\n bound;\n\n if (charIndex > 0) {\n bound = this.__charBounds[lineIndex][charIndex - 1];\n widthBeforeCursor += bound.left + bound.width;\n }\n return widthBeforeCursor;\n }\n\n /**\n * Gets start offset of a selection\n * @param {KeyboardEvent} e Event object\n * @param {Boolean} isRight\n * @return {Number}\n */\n getDownCursorOffset(e: KeyboardEvent, isRight: boolean): number {\n const selectionProp = this._getSelectionForOffset(e, isRight),\n cursorLocation = this.get2DCursorLocation(selectionProp),\n lineIndex = cursorLocation.lineIndex;\n // if on last line, down cursor goes to end of line\n if (\n lineIndex === this._textLines.length - 1 ||\n e.metaKey ||\n e.keyCode === 34\n ) {\n // move to the end of a text\n return this._text.length - selectionProp;\n }\n const charIndex = cursorLocation.charIndex,\n widthBeforeCursor = this._getWidthBeforeCursor(lineIndex, charIndex),\n indexOnOtherLine = this._getIndexOnLine(lineIndex + 1, widthBeforeCursor),\n textAfterCursor = this._textLines[lineIndex].slice(charIndex);\n return (\n textAfterCursor.length +\n indexOnOtherLine +\n 1 +\n this.missingNewlineOffset(lineIndex)\n );\n }\n\n /**\n * private\n * Helps finding if the offset should be counted from Start or End\n * @param {KeyboardEvent} e Event object\n * @param {Boolean} isRight\n * @return {Number}\n */\n _getSelectionForOffset(e: KeyboardEvent, isRight: boolean): number {\n if (e.shiftKey && this.selectionStart !== this.selectionEnd && isRight) {\n return this.selectionEnd;\n } else {\n return this.selectionStart;\n }\n }\n\n /**\n * @param {KeyboardEvent} e Event object\n * @param {Boolean} isRight\n * @return {Number}\n */\n getUpCursorOffset(e: KeyboardEvent, isRight: boolean): number {\n const selectionProp = this._getSelectionForOffset(e, isRight),\n cursorLocation = this.get2DCursorLocation(selectionProp),\n lineIndex = cursorLocation.lineIndex;\n if (lineIndex === 0 || e.metaKey || e.keyCode === 33) {\n // if on first line, up cursor goes to start of line\n return -selectionProp;\n }\n const charIndex = cursorLocation.charIndex,\n widthBeforeCursor = this._getWidthBeforeCursor(lineIndex, charIndex),\n indexOnOtherLine = this._getIndexOnLine(lineIndex - 1, widthBeforeCursor),\n textBeforeCursor = this._textLines[lineIndex].slice(0, charIndex),\n missingNewlineOffset = this.missingNewlineOffset(lineIndex - 1);\n // return a negative offset\n return (\n -this._textLines[lineIndex - 1].length +\n indexOnOtherLine -\n textBeforeCursor.length +\n (1 - missingNewlineOffset)\n );\n }\n\n /**\n * for a given width it founds the matching character.\n * @private\n */\n _getIndexOnLine(lineIndex: number, width: number) {\n const line = this._textLines[lineIndex],\n lineLeftOffset = this._getLineLeftOffset(lineIndex);\n let widthOfCharsOnLine = lineLeftOffset,\n indexOnLine = 0,\n charWidth,\n foundMatch;\n\n for (let j = 0, jlen = line.length; j < jlen; j++) {\n charWidth = this.__charBounds[lineIndex][j].width;\n widthOfCharsOnLine += charWidth;\n if (widthOfCharsOnLine > width) {\n foundMatch = true;\n const leftEdge = widthOfCharsOnLine - charWidth,\n rightEdge = widthOfCharsOnLine,\n offsetFromLeftEdge = Math.abs(leftEdge - width),\n offsetFromRightEdge = Math.abs(rightEdge - width);\n\n indexOnLine = offsetFromRightEdge < offsetFromLeftEdge ? j : j - 1;\n break;\n }\n }\n\n // reached end\n if (!foundMatch) {\n indexOnLine = line.length - 1;\n }\n\n return indexOnLine;\n }\n\n /**\n * Moves cursor down\n * @param {KeyboardEvent} e Event object\n */\n moveCursorDown(e: KeyboardEvent) {\n if (\n this.selectionStart >= this._text.length &&\n this.selectionEnd >= this._text.length\n ) {\n return;\n }\n this._moveCursorUpOrDown('Down', e);\n }\n\n /**\n * Moves cursor up\n * @param {KeyboardEvent} e Event object\n */\n moveCursorUp(e: KeyboardEvent) {\n if (this.selectionStart === 0 && this.selectionEnd === 0) {\n return;\n }\n this._moveCursorUpOrDown('Up', e);\n }\n\n /**\n * Moves cursor up or down, fires the events\n * @param {String} direction 'Up' or 'Down'\n * @param {KeyboardEvent} e Event object\n */\n _moveCursorUpOrDown(direction: 'Up' | 'Down', e: KeyboardEvent) {\n const offset = this[`get${direction}CursorOffset`](\n e,\n this._selectionDirection === RIGHT,\n );\n if (e.shiftKey) {\n this.moveCursorWithShift(offset);\n } else {\n this.moveCursorWithoutShift(offset);\n }\n if (offset !== 0) {\n const max = this.text.length;\n this.selectionStart = capValue(0, this.selectionStart, max);\n this.selectionEnd = capValue(0, this.selectionEnd, max);\n // TODO fix: abort and init should be an alternative depending\n // on selectionStart/End being equal or different\n this.abortCursorAnimation();\n this.initDelayedCursor();\n this._fireSelectionChanged();\n this._updateTextarea();\n }\n }\n\n /**\n * Moves cursor with shift\n * @param {Number} offset\n */\n moveCursorWithShift(offset: number) {\n const newSelection =\n this._selectionDirection === LEFT\n ? this.selectionStart + offset\n : this.selectionEnd + offset;\n this.setSelectionStartEndWithShift(\n this.selectionStart,\n this.selectionEnd,\n newSelection,\n );\n return offset !== 0;\n }\n\n /**\n * Moves cursor up without shift\n * @param {Number} offset\n */\n moveCursorWithoutShift(offset: number) {\n if (offset < 0) {\n this.selectionStart += offset;\n this.selectionEnd = this.selectionStart;\n } else {\n this.selectionEnd += offset;\n this.selectionStart = this.selectionEnd;\n }\n return offset !== 0;\n }\n\n /**\n * Moves cursor left\n * @param {KeyboardEvent} e Event object\n */\n moveCursorLeft(e: KeyboardEvent) {\n if (this.selectionStart === 0 && this.selectionEnd === 0) {\n return;\n }\n this._moveCursorLeftOrRight('Left', e);\n }\n\n /**\n * @private\n * @return {Boolean} true if a change happened\n *\n * @todo refactor not to use method name composition\n */\n _move(\n e: KeyboardEvent,\n prop: 'selectionStart' | 'selectionEnd',\n direction: 'Left' | 'Right',\n ): boolean {\n let newValue: number | undefined;\n if (e.altKey) {\n newValue = this[`findWordBoundary${direction}`](this[prop]);\n } else if (e.metaKey || e.keyCode === 35 || e.keyCode === 36) {\n newValue = this[`findLineBoundary${direction}`](this[prop]);\n } else {\n this[prop] += direction === 'Left' ? -1 : 1;\n return true;\n }\n if (typeof newValue !== 'undefined' && this[prop] !== newValue) {\n this[prop] = newValue;\n return true;\n }\n return false;\n }\n\n /**\n * @private\n */\n _moveLeft(e: KeyboardEvent, prop: 'selectionStart' | 'selectionEnd') {\n return this._move(e, prop, 'Left');\n }\n\n /**\n * @private\n */\n _moveRight(e: KeyboardEvent, prop: 'selectionStart' | 'selectionEnd') {\n return this._move(e, prop, 'Right');\n }\n\n /**\n * Moves cursor left without keeping selection\n * @param {KeyboardEvent} e\n */\n moveCursorLeftWithoutShift(e: KeyboardEvent) {\n let change = true;\n this._selectionDirection = LEFT;\n\n // only move cursor when there is no selection,\n // otherwise we discard it, and leave cursor on same place\n if (\n this.selectionEnd === this.selectionStart &&\n this.selectionStart !== 0\n ) {\n change = this._moveLeft(e, 'selectionStart');\n }\n this.selectionEnd = this.selectionStart;\n return change;\n }\n\n /**\n * Moves cursor left while keeping selection\n * @param {KeyboardEvent} e\n */\n moveCursorLeftWithShift(e: KeyboardEvent) {\n if (\n this._selectionDirection === RIGHT &&\n this.selectionStart !== this.selectionEnd\n ) {\n return this._moveLeft(e, 'selectionEnd');\n } else if (this.selectionStart !== 0) {\n this._selectionDirection = LEFT;\n return this._moveLeft(e, 'selectionStart');\n }\n }\n\n /**\n * Moves cursor right\n * @param {KeyboardEvent} e Event object\n */\n moveCursorRight(e: KeyboardEvent) {\n if (\n this.selectionStart >= this._text.length &&\n this.selectionEnd >= this._text.length\n ) {\n return;\n }\n this._moveCursorLeftOrRight('Right', e);\n }\n\n /**\n * Moves cursor right or Left, fires event\n * @param {String} direction 'Left', 'Right'\n * @param {KeyboardEvent} e Event object\n */\n _moveCursorLeftOrRight(direction: 'Left' | 'Right', e: KeyboardEvent) {\n const actionName = `moveCursor${direction}${\n e.shiftKey ? 'WithShift' : 'WithoutShift'\n }` as const;\n this._currentCursorOpacity = 1;\n if (this[actionName](e)) {\n // TODO fix: abort and init should be an alternative depending\n // on selectionStart/End being equal or different\n this.abortCursorAnimation();\n this.initDelayedCursor();\n this._fireSelectionChanged();\n this._updateTextarea();\n }\n }\n\n /**\n * Moves cursor right while keeping selection\n * @param {KeyboardEvent} e\n */\n moveCursorRightWithShift(e: KeyboardEvent) {\n if (\n this._selectionDirection === LEFT &&\n this.selectionStart !== this.selectionEnd\n ) {\n return this._moveRight(e, 'selectionStart');\n } else if (this.selectionEnd !== this._text.length) {\n this._selectionDirection = RIGHT;\n return this._moveRight(e, 'selectionEnd');\n }\n }\n\n /**\n * Moves cursor right without keeping selection\n * @param {KeyboardEvent} e Event object\n */\n moveCursorRightWithoutShift(e: KeyboardEvent) {\n let changed = true;\n this._selectionDirection = RIGHT;\n\n if (this.selectionStart === this.selectionEnd) {\n changed = this._moveRight(e, 'selectionStart');\n this.selectionEnd = this.selectionStart;\n } else {\n this.selectionStart = this.selectionEnd;\n }\n return changed;\n }\n}\n","import type {\n ObjectPointerEvents,\n TPointerEvent,\n TPointerEventInfo,\n} from '../../EventTypeDefs';\nimport { Point } from '../../Point';\nimport { invertTransform } from '../../util/misc/matrix';\nimport { DraggableTextDelegate } from './DraggableTextDelegate';\nimport type { ITextEvents } from './ITextBehavior';\nimport { ITextKeyBehavior } from './ITextKeyBehavior';\nimport type { TOptions } from '../../typedefs';\nimport type { TextProps, SerializedTextProps } from '../Text/Text';\nimport type { IText } from './IText';\n/**\n * `LEFT_CLICK === 0`\n */\nconst notALeftClick = (e: Event) => !!(e as MouseEvent).button;\n\nexport abstract class ITextClickBehavior<\n Props extends TOptions = Partial,\n SProps extends SerializedTextProps = SerializedTextProps,\n EventSpec extends ITextEvents = ITextEvents,\n> extends ITextKeyBehavior {\n protected draggableTextDelegate: DraggableTextDelegate;\n\n initBehavior() {\n // Initializes event handlers related to cursor or selection\n this.on('mousedown', this._mouseDownHandler);\n this.on('mouseup', this.mouseUpHandler);\n this.on('mousedblclick', this.doubleClickHandler);\n this.on('mousetripleclick', this.tripleClickHandler);\n\n this.draggableTextDelegate = new DraggableTextDelegate(\n this as unknown as IText,\n );\n\n super.initBehavior();\n }\n\n /**\n * If this method returns true a mouse move operation over a text selection\n * will not prevent the native mouse event allowing the browser to start a drag operation.\n * shouldStartDragging can be read 'do not prevent default for mouse move event'\n * To prevent drag and drop between objects both shouldStartDragging and onDragStart should return false\n * @returns\n */\n shouldStartDragging() {\n return this.draggableTextDelegate.isActive();\n }\n\n /**\n * @public override this method to control whether instance should/shouldn't become a drag source,\n * @see also {@link DraggableTextDelegate#isActive}\n * To prevent drag and drop between objects both shouldStartDragging and onDragStart should return false\n * @returns {boolean} should handle event\n */\n onDragStart(e: DragEvent) {\n return this.draggableTextDelegate.onDragStart(e);\n }\n\n /**\n * @public override this method to control whether instance should/shouldn't become a drop target\n */\n canDrop(e: DragEvent) {\n return this.draggableTextDelegate.canDrop(e);\n }\n\n /**\n * Default handler for double click, select a word\n */\n doubleClickHandler(options: TPointerEventInfo) {\n if (!this.isEditing) {\n return;\n }\n this.selectWord(this.getSelectionStartFromPointer(options.e));\n this.renderCursorOrSelection();\n }\n\n /**\n * Default handler for triple click, select a line\n */\n tripleClickHandler(options: TPointerEventInfo) {\n if (!this.isEditing) {\n return;\n }\n this.selectLine(this.getSelectionStartFromPointer(options.e));\n this.renderCursorOrSelection();\n }\n\n /**\n * Default event handler for the basic functionalities needed on _mouseDown\n * can be overridden to do something different.\n * Scope of this implementation is: find the click position, set selectionStart\n * find selectionEnd, initialize the drawing of either cursor or selection area\n * initializing a mousedDown on a text area will cancel fabricjs knowledge of\n * current compositionMode. It will be set to false.\n */\n _mouseDownHandler({ e, alreadySelected }: ObjectPointerEvents['mousedown']) {\n if (\n !this.canvas ||\n !this.editable ||\n notALeftClick(e) ||\n this.getActiveControl()\n ) {\n return;\n }\n\n if (this.draggableTextDelegate.start(e)) {\n return;\n }\n\n this.canvas.textEditingManager.register(this);\n\n if (alreadySelected) {\n this.inCompositionMode = false;\n this.setCursorByClick(e);\n }\n\n if (this.isEditing) {\n this.__selectionStartOnMouseDown = this.selectionStart;\n if (this.selectionStart === this.selectionEnd) {\n this.abortCursorAnimation();\n }\n this.renderCursorOrSelection();\n }\n this.selected ||= alreadySelected || this.isEditing;\n }\n\n /**\n * standard handler for mouse up, overridable\n * @private\n */\n mouseUpHandler({ e, transform }: ObjectPointerEvents['mouseup']) {\n const didDrag = this.draggableTextDelegate.end(e);\n\n if (this.canvas) {\n this.canvas.textEditingManager.unregister(this);\n\n const activeObject = this.canvas._activeObject;\n if (activeObject && activeObject !== this) {\n // avoid running this logic when there is an active object\n // this because is possible with shift click and fast clicks,\n // to rapidly deselect and reselect this object and trigger an enterEdit\n return;\n }\n }\n\n if (\n !this.editable ||\n (this.group && !this.group.interactive) ||\n (transform && transform.actionPerformed) ||\n notALeftClick(e) ||\n didDrag\n ) {\n return;\n }\n\n if (this.selected && !this.getActiveControl()) {\n this.enterEditing(e);\n if (this.selectionStart === this.selectionEnd) {\n this.initDelayedCursor(true);\n } else {\n this.renderCursorOrSelection();\n }\n }\n }\n\n /**\n * Changes cursor location in a text depending on passed pointer (x/y) object\n * @param {TPointerEvent} e Event object\n */\n setCursorByClick(e: TPointerEvent) {\n const newSelection = this.getSelectionStartFromPointer(e),\n start = this.selectionStart,\n end = this.selectionEnd;\n if (e.shiftKey) {\n this.setSelectionStartEndWithShift(start, end, newSelection);\n } else {\n this.selectionStart = newSelection;\n this.selectionEnd = newSelection;\n }\n if (this.isEditing) {\n this._fireSelectionChanged();\n this._updateTextarea();\n }\n }\n\n /**\n * Returns index of a character corresponding to where an object was clicked\n * @param {TPointerEvent} e Event object\n * @return {Number} Index of a character\n */\n getSelectionStartFromPointer(e: TPointerEvent): number {\n const mouseOffset = this.canvas!.getScenePoint(e)\n .transform(invertTransform(this.calcTransformMatrix()))\n .add(new Point(-this._getLeftOffset(), -this._getTopOffset()));\n let height = 0,\n charIndex = 0,\n lineIndex = 0;\n\n for (let i = 0; i < this._textLines.length; i++) {\n if (height <= mouseOffset.y) {\n height += this.getHeightOfLine(i);\n lineIndex = i;\n if (i > 0) {\n charIndex +=\n this._textLines[i - 1].length + this.missingNewlineOffset(i - 1);\n }\n } else {\n break;\n }\n }\n const lineLeftOffset = Math.abs(this._getLineLeftOffset(lineIndex));\n let width = lineLeftOffset;\n const charLength = this._textLines[lineIndex].length;\n const chars = this.__charBounds[lineIndex];\n for (let j = 0; j < charLength; j++) {\n // i removed something about flipX here, check.\n const charWidth = chars[j].kernedWidth;\n const widthAfter = width + charWidth;\n if (mouseOffset.x <= widthAfter) {\n // if the pointer is closer to the end of the char we increment charIndex\n // in order to position the cursor after the char\n if (\n Math.abs(mouseOffset.x - widthAfter) <=\n Math.abs(mouseOffset.x - width)\n ) {\n charIndex++;\n }\n break;\n }\n width = widthAfter;\n charIndex++;\n }\n\n return Math.min(\n // if object is horizontally flipped, mirror cursor location from the end\n this.flipX ? charLength - charIndex : charIndex,\n this._text.length,\n );\n }\n}\n","export type TKeyMapIText = Record<\n KeyboardEvent['keyCode'],\n CursorHandlingMethods\n>;\n\nexport type CursorHandlingMethods =\n | 'moveCursorUp'\n | 'moveCursorDown'\n | 'moveCursorLeft'\n | 'moveCursorRight'\n | 'exitEditing'\n | 'copy'\n | 'cut'\n | 'cmdAll';\n\nconst MOVE_CURSOR_UP: CursorHandlingMethods = 'moveCursorUp';\nconst MOVE_CURSOR_DOWN: CursorHandlingMethods = 'moveCursorDown';\nconst MOVE_CURSOR_LEFT: CursorHandlingMethods = 'moveCursorLeft';\nconst MOVE_CURSOR_RIGHT: CursorHandlingMethods = 'moveCursorRight';\nconst EXIT_EDITING: CursorHandlingMethods = 'exitEditing';\n\n// @TODO look into import { Key } from 'ts-key-enum';\n// and transition from keyCode to Key\n// also reduce string duplication\nexport const keysMap: TKeyMapIText = {\n 9: EXIT_EDITING,\n 27: EXIT_EDITING,\n 33: MOVE_CURSOR_UP,\n 34: MOVE_CURSOR_DOWN,\n 35: MOVE_CURSOR_RIGHT,\n 36: MOVE_CURSOR_LEFT,\n 37: MOVE_CURSOR_LEFT,\n 38: MOVE_CURSOR_UP,\n 39: MOVE_CURSOR_RIGHT,\n 40: MOVE_CURSOR_DOWN,\n};\n\nexport const keysMapRtl: TKeyMapIText = {\n 9: EXIT_EDITING,\n 27: EXIT_EDITING,\n 33: MOVE_CURSOR_UP,\n 34: MOVE_CURSOR_DOWN,\n 35: MOVE_CURSOR_LEFT,\n 36: MOVE_CURSOR_RIGHT,\n 37: MOVE_CURSOR_RIGHT,\n 38: MOVE_CURSOR_UP,\n 39: MOVE_CURSOR_LEFT,\n 40: MOVE_CURSOR_DOWN,\n};\n\n/**\n * For functionalities on keyUp + ctrl || cmd\n */\nexport const ctrlKeysMapUp: TKeyMapIText = {\n 67: 'copy',\n // there was a reason this wasn't deleted. for now leave it here\n 88: 'cut',\n};\n\n/**\n * For functionalities on keyDown + ctrl || cmd\n */\nexport const ctrlKeysMapDown: TKeyMapIText = {\n 65: 'cmdAll',\n};\n","import type { StaticCanvas } from '../../canvas/StaticCanvas';\n\n/**\n * Set the transform of the passed context to the same of a specific Canvas or StaticCanvas.\n * setTransform is used since this utility will RESET the ctx transform to the basic value\n * of retina scaling and viewport transform\n * It is not meant to be added to other transforms, it is used internally to preapre canvases to draw\n * @param ctx\n * @param canvas\n */\nexport const applyCanvasTransform = (\n ctx: CanvasRenderingContext2D,\n canvas: StaticCanvas,\n) => {\n const scale = canvas.getRetinaScaling();\n ctx.setTransform(scale, 0, 0, scale, 0, 0);\n const v = canvas.viewportTransform;\n ctx.transform(v[0], v[1], v[2], v[3], v[4], v[5]);\n};\n","import { Canvas } from '../../canvas/Canvas';\nimport type { ITextEvents } from './ITextBehavior';\nimport { ITextClickBehavior } from './ITextClickBehavior';\nimport {\n ctrlKeysMapDown,\n ctrlKeysMapUp,\n keysMap,\n keysMapRtl,\n} from './constants';\nimport type { TClassProperties, TFiller, TOptions } from '../../typedefs';\nimport { classRegistry } from '../../ClassRegistry';\nimport type { SerializedTextProps, TextProps } from '../Text/Text';\nimport {\n JUSTIFY,\n JUSTIFY_CENTER,\n JUSTIFY_LEFT,\n JUSTIFY_RIGHT,\n} from '../Text/constants';\nimport { CENTER, FILL, LEFT, RIGHT } from '../../constants';\nimport type { ObjectToCanvasElementOptions } from '../Object/Object';\nimport type { FabricObject } from '../Object/FabricObject';\nimport { createCanvasElementFor } from '../../util/misc/dom';\nimport { applyCanvasTransform } from '../../util/internals/applyCanvasTransform';\n\nexport type CursorBoundaries = {\n left: number;\n top: number;\n leftOffset: number;\n topOffset: number;\n};\n\nexport type CursorRenderingData = {\n color: string;\n opacity: number;\n left: number;\n top: number;\n width: number;\n height: number;\n};\n\n// Declare IText protected properties to workaround TS\nconst protectedDefaultValues = {\n _selectionDirection: null,\n _reSpace: /\\s|\\r?\\n/,\n inCompositionMode: false,\n};\n\nexport const iTextDefaultValues: Partial> = {\n selectionStart: 0,\n selectionEnd: 0,\n selectionColor: 'rgba(17,119,255,0.3)',\n isEditing: false,\n editable: true,\n editingBorderColor: 'rgba(102,153,255,0.25)',\n cursorWidth: 2,\n cursorColor: '',\n cursorDelay: 1000,\n cursorDuration: 600,\n caching: true,\n hiddenTextareaContainer: null,\n keysMap,\n keysMapRtl,\n ctrlKeysMapDown,\n ctrlKeysMapUp,\n ...protectedDefaultValues,\n};\n\n// @TODO this is not complete\ninterface UniqueITextProps {\n selectionStart: number;\n selectionEnd: number;\n}\n\nexport interface SerializedITextProps\n extends SerializedTextProps,\n UniqueITextProps {}\n\nexport interface ITextProps extends TextProps, UniqueITextProps {}\n\n/**\n * @fires changed\n * @fires selection:changed\n * @fires editing:entered\n * @fires editing:exited\n * @fires dragstart\n * @fires drag drag event firing on the drag source\n * @fires dragend\n * @fires copy\n * @fires cut\n * @fires paste\n *\n * #### Supported key combinations\n * ```\n * Move cursor: left, right, up, down\n * Select character: shift + left, shift + right\n * Select text vertically: shift + up, shift + down\n * Move cursor by word: alt + left, alt + right\n * Select words: shift + alt + left, shift + alt + right\n * Move cursor to line start/end: cmd + left, cmd + right or home, end\n * Select till start/end of line: cmd + shift + left, cmd + shift + right or shift + home, shift + end\n * Jump to start/end of text: cmd + up, cmd + down\n * Select till start/end of text: cmd + shift + up, cmd + shift + down or shift + pgUp, shift + pgDown\n * Delete character: backspace\n * Delete word: alt + backspace\n * Delete line: cmd + backspace\n * Forward delete: delete\n * Copy text: ctrl/cmd + c\n * Paste text: ctrl/cmd + v\n * Cut text: ctrl/cmd + x\n * Select entire text: ctrl/cmd + a\n * Quit editing tab or esc\n * ```\n *\n * #### Supported mouse/touch combination\n * ```\n * Position cursor: click/touch\n * Create selection: click/touch & drag\n * Create selection: click & shift + click\n * Select word: double click\n * Select line: triple click\n * ```\n */\nexport class IText<\n Props extends TOptions = Partial,\n SProps extends SerializedITextProps = SerializedITextProps,\n EventSpec extends ITextEvents = ITextEvents,\n >\n extends ITextClickBehavior\n implements UniqueITextProps\n{\n /**\n * Index where text selection starts (or where cursor is when there is no selection)\n * @type Number\n */\n declare selectionStart: number;\n\n /**\n * Index where text selection ends\n * @type Number\n */\n declare selectionEnd: number;\n\n declare compositionStart: number;\n\n declare compositionEnd: number;\n\n /**\n * Color of text selection\n * @type String\n */\n declare selectionColor: string;\n\n /**\n * Indicates whether text is in editing mode\n * @type Boolean\n */\n declare isEditing: boolean;\n\n /**\n * Indicates whether a text can be edited\n * @type Boolean\n */\n declare editable: boolean;\n\n /**\n * Border color of text object while it's in editing mode\n * @type String\n */\n declare editingBorderColor: string;\n\n /**\n * Width of cursor (in px)\n * @type Number\n */\n declare cursorWidth: number;\n\n /**\n * Color of text cursor color in editing mode.\n * if not set (default) will take color from the text.\n * if set to a color value that fabric can understand, it will\n * be used instead of the color of the text at the current position.\n * @type String\n */\n declare cursorColor: string;\n\n /**\n * Delay between cursor blink (in ms)\n * @type Number\n */\n declare cursorDelay: number;\n\n /**\n * Duration of cursor fade in (in ms)\n * @type Number\n */\n declare cursorDuration: number;\n\n declare compositionColor: string;\n\n /**\n * Indicates whether internal text char widths can be cached\n * @type Boolean\n */\n declare caching: boolean;\n\n static ownDefaults = iTextDefaultValues;\n\n static getDefaults(): Record {\n return { ...super.getDefaults(), ...IText.ownDefaults };\n }\n\n static type = 'IText';\n\n get type() {\n const type = super.type;\n // backward compatibility\n return type === 'itext' ? 'i-text' : type;\n }\n\n /**\n * Constructor\n * @param {String} text Text string\n * @param {Object} [options] Options object\n */\n constructor(text: string, options?: Props) {\n super(text, { ...IText.ownDefaults, ...options } as Props);\n this.initBehavior();\n }\n\n /**\n * While editing handle differently\n * @private\n * @param {string} key\n * @param {*} value\n */\n _set(key: string, value: any) {\n if (this.isEditing && this._savedProps && key in this._savedProps) {\n // @ts-expect-error irritating TS\n this._savedProps[key] = value;\n return this;\n }\n if (key === 'canvas') {\n this.canvas instanceof Canvas &&\n this.canvas.textEditingManager.remove(this);\n value instanceof Canvas && value.textEditingManager.add(this);\n }\n return super._set(key, value);\n }\n\n /**\n * Sets selection start (left boundary of a selection)\n * @param {Number} index Index to set selection start to\n */\n setSelectionStart(index: number) {\n index = Math.max(index, 0);\n this._updateAndFire('selectionStart', index);\n }\n\n /**\n * Sets selection end (right boundary of a selection)\n * @param {Number} index Index to set selection end to\n */\n setSelectionEnd(index: number) {\n index = Math.min(index, this.text.length);\n this._updateAndFire('selectionEnd', index);\n }\n\n /**\n * @private\n * @param {String} property 'selectionStart' or 'selectionEnd'\n * @param {Number} index new position of property\n */\n protected _updateAndFire(\n property: 'selectionStart' | 'selectionEnd',\n index: number,\n ) {\n if (this[property] !== index) {\n this._fireSelectionChanged();\n this[property] = index;\n }\n this._updateTextarea();\n }\n\n /**\n * Fires the even of selection changed\n * @private\n */\n _fireSelectionChanged() {\n this.fire('selection:changed');\n this.canvas && this.canvas.fire('text:selection:changed', { target: this });\n }\n\n /**\n * Initialize text dimensions. Render all text on given context\n * or on a offscreen canvas to get the text width with measureText.\n * Updates this.width and this.height with the proper values.\n * Does not return dimensions.\n * @private\n */\n initDimensions() {\n this.isEditing && this.initDelayedCursor();\n super.initDimensions();\n }\n\n /**\n * Gets style of a current selection/cursor (at the start position)\n * if startIndex or endIndex are not provided, selectionStart or selectionEnd will be used.\n * @param {Number} startIndex Start index to get styles at\n * @param {Number} endIndex End index to get styles at, if not specified selectionEnd or startIndex + 1\n * @param {Boolean} [complete] get full style or not\n * @return {Array} styles an array with one, zero or more Style objects\n */\n getSelectionStyles(\n startIndex: number = this.selectionStart || 0,\n endIndex: number = this.selectionEnd,\n complete?: boolean,\n ) {\n return super.getSelectionStyles(startIndex, endIndex, complete);\n }\n\n /**\n * Sets style of a current selection, if no selection exist, do not set anything.\n * @param {Object} [styles] Styles object\n * @param {Number} [startIndex] Start index to get styles at\n * @param {Number} [endIndex] End index to get styles at, if not specified selectionEnd or startIndex + 1\n */\n setSelectionStyles(\n styles: object,\n startIndex: number = this.selectionStart || 0,\n endIndex: number = this.selectionEnd,\n ) {\n return super.setSelectionStyles(styles, startIndex, endIndex);\n }\n\n /**\n * Returns 2d representation (lineIndex and charIndex) of cursor (or selection start)\n * @param {Number} [selectionStart] Optional index. When not given, current selectionStart is used.\n * @param {Boolean} [skipWrapping] consider the location for unwrapped lines. useful to manage styles.\n */\n get2DCursorLocation(\n selectionStart = this.selectionStart,\n skipWrapping?: boolean,\n ) {\n return super.get2DCursorLocation(selectionStart, skipWrapping);\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n render(ctx: CanvasRenderingContext2D) {\n super.render(ctx);\n // clear the cursorOffsetCache, so we ensure to calculate once per renderCursor\n // the correct position but not at every cursor animation.\n this.cursorOffsetCache = {};\n this.renderCursorOrSelection();\n }\n\n /**\n * @override block cursor/selection logic while rendering the exported canvas\n * @todo this workaround should be replaced with a more robust solution\n */\n toCanvasElement(options?: ObjectToCanvasElementOptions): HTMLCanvasElement {\n const isEditing = this.isEditing;\n this.isEditing = false;\n const canvas = super.toCanvasElement(options);\n this.isEditing = isEditing;\n return canvas;\n }\n\n /**\n * Renders cursor or selection (depending on what exists)\n * it does on the contextTop. If contextTop is not available, do nothing.\n */\n renderCursorOrSelection() {\n if (!this.isEditing || !this.canvas) {\n return;\n }\n const ctx = this.clearContextTop(true);\n if (!ctx) {\n return;\n }\n const boundaries = this._getCursorBoundaries();\n\n const ancestors = this.findAncestorsWithClipPath();\n const hasAncestorsWithClipping = ancestors.length > 0;\n let drawingCtx: CanvasRenderingContext2D = ctx;\n let drawingCanvas: HTMLCanvasElement | undefined = undefined;\n if (hasAncestorsWithClipping) {\n // we have some clipPath, we need to draw the selection on an intermediate layer.\n drawingCanvas = createCanvasElementFor(ctx.canvas);\n drawingCtx = drawingCanvas.getContext('2d')!;\n applyCanvasTransform(drawingCtx, this.canvas);\n const m = this.calcTransformMatrix();\n drawingCtx.transform(m[0], m[1], m[2], m[3], m[4], m[5]);\n }\n\n if (this.selectionStart === this.selectionEnd && !this.inCompositionMode) {\n this.renderCursor(drawingCtx, boundaries);\n } else {\n this.renderSelection(drawingCtx, boundaries);\n }\n\n if (hasAncestorsWithClipping) {\n // we need a neutral context.\n // this won't work for nested clippaths in which a clippath\n // has its own clippath\n for (const ancestor of ancestors) {\n const clipPath = ancestor.clipPath!;\n const clippingCanvas = createCanvasElementFor(ctx.canvas);\n const clippingCtx = clippingCanvas.getContext('2d')!;\n applyCanvasTransform(clippingCtx, this.canvas);\n // position the ctx in the center of the outer ancestor\n if (!clipPath.absolutePositioned) {\n const m = ancestor.calcTransformMatrix();\n clippingCtx.transform(m[0], m[1], m[2], m[3], m[4], m[5]);\n }\n clipPath.transform(clippingCtx);\n // we assign an empty drawing context, we don't plan to have this working for nested clippaths for now\n clipPath.drawObject(clippingCtx, true, {});\n this.drawClipPathOnCache(drawingCtx, clipPath, clippingCanvas);\n }\n }\n\n if (hasAncestorsWithClipping) {\n ctx.setTransform(1, 0, 0, 1, 0, 0);\n ctx.drawImage(drawingCanvas!, 0, 0);\n }\n\n this.canvas.contextTopDirty = true;\n ctx.restore();\n }\n\n /**\n * Finds and returns an array of clip paths that are applied to the parent\n * group(s) of the current FabricObject instance. The object's hierarchy is\n * traversed upwards (from the current object towards the root of the canvas),\n * checking each parent object for the presence of a `clipPath` that is not\n * absolutely positioned.\n */\n findAncestorsWithClipPath(): FabricObject[] {\n const clipPathAncestors: FabricObject[] = [];\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n let obj: FabricObject | undefined = this;\n while (obj) {\n if (obj.clipPath) {\n clipPathAncestors.push(obj);\n }\n obj = obj.parent;\n }\n\n return clipPathAncestors;\n }\n\n /**\n * Returns cursor boundaries (left, top, leftOffset, topOffset)\n * left/top are left/top of entire text box\n * leftOffset/topOffset are offset from that left/top point of a text box\n * @private\n * @param {number} [index] index from start\n * @param {boolean} [skipCaching]\n */\n _getCursorBoundaries(\n index: number = this.selectionStart,\n skipCaching?: boolean,\n ): CursorBoundaries {\n const left = this._getLeftOffset(),\n top = this._getTopOffset(),\n offsets = this._getCursorBoundariesOffsets(index, skipCaching);\n return {\n left: left,\n top: top,\n leftOffset: offsets.left,\n topOffset: offsets.top,\n };\n }\n\n /**\n * Caches and returns cursor left/top offset relative to instance's center point\n * @private\n * @param {number} index index from start\n * @param {boolean} [skipCaching]\n */\n _getCursorBoundariesOffsets(\n index: number,\n skipCaching?: boolean,\n ): { left: number; top: number } {\n if (skipCaching) {\n return this.__getCursorBoundariesOffsets(index);\n }\n if (this.cursorOffsetCache && 'top' in this.cursorOffsetCache) {\n return this.cursorOffsetCache as { left: number; top: number };\n }\n return (this.cursorOffsetCache = this.__getCursorBoundariesOffsets(index));\n }\n\n /**\n * Calculates cursor left/top offset relative to instance's center point\n * @private\n * @param {number} index index from start\n */\n __getCursorBoundariesOffsets(index: number) {\n let topOffset = 0,\n leftOffset = 0;\n const { charIndex, lineIndex } = this.get2DCursorLocation(index);\n\n for (let i = 0; i < lineIndex; i++) {\n topOffset += this.getHeightOfLine(i);\n }\n const lineLeftOffset = this._getLineLeftOffset(lineIndex);\n const bound = this.__charBounds[lineIndex][charIndex];\n bound && (leftOffset = bound.left);\n if (\n this.charSpacing !== 0 &&\n charIndex === this._textLines[lineIndex].length\n ) {\n leftOffset -= this._getWidthOfCharSpacing();\n }\n const boundaries = {\n top: topOffset,\n left: lineLeftOffset + (leftOffset > 0 ? leftOffset : 0),\n };\n if (this.direction === 'rtl') {\n if (\n this.textAlign === RIGHT ||\n this.textAlign === JUSTIFY ||\n this.textAlign === JUSTIFY_RIGHT\n ) {\n boundaries.left *= -1;\n } else if (this.textAlign === LEFT || this.textAlign === JUSTIFY_LEFT) {\n boundaries.left = lineLeftOffset - (leftOffset > 0 ? leftOffset : 0);\n } else if (\n this.textAlign === CENTER ||\n this.textAlign === JUSTIFY_CENTER\n ) {\n boundaries.left = lineLeftOffset - (leftOffset > 0 ? leftOffset : 0);\n }\n }\n return boundaries;\n }\n\n /**\n * Renders cursor on context Top, outside the animation cycle, on request\n * Used for the drag/drop effect.\n * If contextTop is not available, do nothing.\n */\n renderCursorAt(selectionStart: number) {\n this._renderCursor(\n this.canvas!.contextTop,\n this._getCursorBoundaries(selectionStart, true),\n selectionStart,\n );\n }\n\n /**\n * Renders cursor\n * @param {Object} boundaries\n * @param {CanvasRenderingContext2D} ctx transformed context to draw on\n */\n renderCursor(ctx: CanvasRenderingContext2D, boundaries: CursorBoundaries) {\n this._renderCursor(ctx, boundaries, this.selectionStart);\n }\n\n /**\n * Return the data needed to render the cursor for given selection start\n * The left,top are relative to the object, while width and height are prescaled\n * to look think with canvas zoom and object scaling,\n * so they depend on canvas and object scaling\n */\n getCursorRenderingData(\n selectionStart: number = this.selectionStart,\n boundaries: CursorBoundaries = this._getCursorBoundaries(selectionStart),\n ): CursorRenderingData {\n const cursorLocation = this.get2DCursorLocation(selectionStart),\n lineIndex = cursorLocation.lineIndex,\n charIndex =\n cursorLocation.charIndex > 0 ? cursorLocation.charIndex - 1 : 0,\n charHeight = this.getValueOfPropertyAt(lineIndex, charIndex, 'fontSize'),\n multiplier = this.getObjectScaling().x * this.canvas!.getZoom(),\n cursorWidth = this.cursorWidth / multiplier,\n dy = this.getValueOfPropertyAt(lineIndex, charIndex, 'deltaY'),\n topOffset =\n boundaries.topOffset +\n ((1 - this._fontSizeFraction) * this.getHeightOfLine(lineIndex)) /\n this.lineHeight -\n charHeight * (1 - this._fontSizeFraction);\n\n return {\n color:\n this.cursorColor ||\n (this.getValueOfPropertyAt(lineIndex, charIndex, 'fill') as string),\n opacity: this._currentCursorOpacity,\n left: boundaries.left + boundaries.leftOffset - cursorWidth / 2,\n top: topOffset + boundaries.top + dy,\n width: cursorWidth,\n height: charHeight,\n };\n }\n\n /**\n * Render the cursor at the given selectionStart.\n * @param {CanvasRenderingContext2D} ctx transformed context to draw on\n */\n _renderCursor(\n ctx: CanvasRenderingContext2D,\n boundaries: CursorBoundaries,\n selectionStart: number,\n ) {\n const { color, opacity, left, top, width, height } =\n this.getCursorRenderingData(selectionStart, boundaries);\n ctx.fillStyle = color;\n ctx.globalAlpha = opacity;\n ctx.fillRect(left, top, width, height);\n }\n\n /**\n * Renders text selection\n * @param {Object} boundaries Object with left/top/leftOffset/topOffset\n * @param {CanvasRenderingContext2D} ctx transformed context to draw on\n */\n renderSelection(ctx: CanvasRenderingContext2D, boundaries: CursorBoundaries) {\n const selection = {\n selectionStart: this.inCompositionMode\n ? this.hiddenTextarea!.selectionStart\n : this.selectionStart,\n selectionEnd: this.inCompositionMode\n ? this.hiddenTextarea!.selectionEnd\n : this.selectionEnd,\n };\n this._renderSelection(ctx, selection, boundaries);\n }\n\n /**\n * Renders drag start text selection\n */\n renderDragSourceEffect() {\n const dragStartSelection =\n this.draggableTextDelegate.getDragStartSelection()!;\n this._renderSelection(\n this.canvas!.contextTop,\n dragStartSelection,\n this._getCursorBoundaries(dragStartSelection.selectionStart, true),\n );\n }\n\n renderDropTargetEffect(e: DragEvent) {\n const dragSelection = this.getSelectionStartFromPointer(e);\n this.renderCursorAt(dragSelection);\n }\n\n /**\n * Renders text selection\n * @private\n * @param {{ selectionStart: number, selectionEnd: number }} selection\n * @param {Object} boundaries Object with left/top/leftOffset/topOffset\n * @param {CanvasRenderingContext2D} ctx transformed context to draw on\n */\n _renderSelection(\n ctx: CanvasRenderingContext2D,\n selection: { selectionStart: number; selectionEnd: number },\n boundaries: CursorBoundaries,\n ) {\n const selectionStart = selection.selectionStart,\n selectionEnd = selection.selectionEnd,\n isJustify = this.textAlign.includes(JUSTIFY),\n start = this.get2DCursorLocation(selectionStart),\n end = this.get2DCursorLocation(selectionEnd),\n startLine = start.lineIndex,\n endLine = end.lineIndex,\n startChar = start.charIndex < 0 ? 0 : start.charIndex,\n endChar = end.charIndex < 0 ? 0 : end.charIndex;\n\n for (let i = startLine; i <= endLine; i++) {\n const lineOffset = this._getLineLeftOffset(i) || 0;\n let lineHeight = this.getHeightOfLine(i),\n realLineHeight = 0,\n boxStart = 0,\n boxEnd = 0;\n\n if (i === startLine) {\n boxStart = this.__charBounds[startLine][startChar].left;\n }\n if (i >= startLine && i < endLine) {\n boxEnd =\n isJustify && !this.isEndOfWrapping(i)\n ? this.width\n : this.getLineWidth(i) || 5; // WTF is this 5?\n } else if (i === endLine) {\n if (endChar === 0) {\n boxEnd = this.__charBounds[endLine][endChar].left;\n } else {\n const charSpacing = this._getWidthOfCharSpacing();\n boxEnd =\n this.__charBounds[endLine][endChar - 1].left +\n this.__charBounds[endLine][endChar - 1].width -\n charSpacing;\n }\n }\n realLineHeight = lineHeight;\n if (this.lineHeight < 1 || (i === endLine && this.lineHeight > 1)) {\n lineHeight /= this.lineHeight;\n }\n let drawStart = boundaries.left + lineOffset + boxStart,\n drawHeight = lineHeight,\n extraTop = 0;\n const drawWidth = boxEnd - boxStart;\n if (this.inCompositionMode) {\n ctx.fillStyle = this.compositionColor || 'black';\n drawHeight = 1;\n extraTop = lineHeight;\n } else {\n ctx.fillStyle = this.selectionColor;\n }\n if (this.direction === 'rtl') {\n if (\n this.textAlign === RIGHT ||\n this.textAlign === JUSTIFY ||\n this.textAlign === JUSTIFY_RIGHT\n ) {\n drawStart = this.width - drawStart - drawWidth;\n } else if (this.textAlign === LEFT || this.textAlign === JUSTIFY_LEFT) {\n drawStart = boundaries.left + lineOffset - boxEnd;\n } else if (\n this.textAlign === CENTER ||\n this.textAlign === JUSTIFY_CENTER\n ) {\n drawStart = boundaries.left + lineOffset - boxEnd;\n }\n }\n ctx.fillRect(\n drawStart,\n boundaries.top + boundaries.topOffset + extraTop,\n drawWidth,\n drawHeight,\n );\n boundaries.topOffset += realLineHeight;\n }\n }\n\n /**\n * High level function to know the height of the cursor.\n * the currentChar is the one that precedes the cursor\n * Returns fontSize of char at the current cursor\n * Unused from the library, is for the end user\n * @return {Number} Character font size\n */\n getCurrentCharFontSize(): number {\n const cp = this._getCurrentCharIndex();\n return this.getValueOfPropertyAt(cp.l, cp.c, 'fontSize');\n }\n\n /**\n * High level function to know the color of the cursor.\n * the currentChar is the one that precedes the cursor\n * Returns color (fill) of char at the current cursor\n * if the text object has a pattern or gradient for filler, it will return that.\n * Unused by the library, is for the end user\n * @return {String | TFiller} Character color (fill)\n */\n getCurrentCharColor(): string | TFiller | null {\n const cp = this._getCurrentCharIndex();\n return this.getValueOfPropertyAt(cp.l, cp.c, FILL);\n }\n\n /**\n * Returns the cursor position for the getCurrent.. functions\n * @private\n */\n _getCurrentCharIndex() {\n const cursorPosition = this.get2DCursorLocation(this.selectionStart, true),\n charIndex =\n cursorPosition.charIndex > 0 ? cursorPosition.charIndex - 1 : 0;\n return { l: cursorPosition.lineIndex, c: charIndex };\n }\n\n dispose() {\n this.exitEditingImpl();\n this.draggableTextDelegate.dispose();\n super.dispose();\n }\n}\n\nclassRegistry.setClass(IText);\n// legacy\nclassRegistry.setClass(IText, 'i-text');\n","import type { TClassProperties, TOptions } from '../typedefs';\nimport { IText } from './IText/IText';\nimport { classRegistry } from '../ClassRegistry';\nimport { createTextboxDefaultControls } from '../controls/commonControls';\nimport { JUSTIFY } from './Text/constants';\nimport type { TextStyleDeclaration } from './Text/StyledText';\nimport type { SerializedITextProps, ITextProps } from './IText/IText';\nimport type { ITextEvents } from './IText/ITextBehavior';\nimport type { TextLinesInfo } from './Text/Text';\nimport type { Control } from '../controls/Control';\n\n// @TODO: Many things here are configuration related and shouldn't be on the class nor prototype\n// regexes, list of properties that are not suppose to change by instances, magic consts.\n// this will be a separated effort\nexport const textboxDefaultValues: Partial> = {\n minWidth: 20,\n dynamicMinWidth: 2,\n lockScalingFlip: true,\n noScaleCache: false,\n _wordJoiners: /[ \\t\\r]/,\n splitByGrapheme: false,\n};\n\nexport type GraphemeData = {\n wordsData: {\n word: string[];\n width: number;\n }[][];\n largestWordWidth: number;\n};\n\nexport type StyleMap = Record;\n\n// @TODO this is not complete\ninterface UniqueTextboxProps {\n minWidth: number;\n splitByGrapheme: boolean;\n dynamicMinWidth: number;\n _wordJoiners: RegExp;\n}\n\nexport interface SerializedTextboxProps\n extends SerializedITextProps,\n Pick {}\n\nexport interface TextboxProps extends ITextProps, UniqueTextboxProps {}\n\n/**\n * Textbox class, based on IText, allows the user to resize the text rectangle\n * and wraps lines automatically. Textboxes have their Y scaling locked, the\n * user can only change width. Height is adjusted automatically based on the\n * wrapping of lines.\n */\nexport class Textbox<\n Props extends TOptions = Partial,\n SProps extends SerializedTextboxProps = SerializedTextboxProps,\n EventSpec extends ITextEvents = ITextEvents,\n >\n extends IText\n implements UniqueTextboxProps\n{\n /**\n * Minimum width of textbox, in pixels.\n * @type Number\n */\n declare minWidth: number;\n\n /**\n * Minimum calculated width of a textbox, in pixels.\n * fixed to 2 so that an empty textbox cannot go to 0\n * and is still selectable without text.\n * @type Number\n */\n declare dynamicMinWidth: number;\n\n /**\n * Use this boolean property in order to split strings that have no white space concept.\n * this is a cheap way to help with chinese/japanese\n * @type Boolean\n * @since 2.6.0\n */\n declare splitByGrapheme: boolean;\n\n declare _wordJoiners: RegExp;\n\n declare _styleMap: StyleMap;\n\n declare isWrapping: boolean;\n\n static type = 'Textbox';\n\n static textLayoutProperties = [...IText.textLayoutProperties, 'width'];\n\n static ownDefaults = textboxDefaultValues;\n\n static getDefaults(): Record {\n return {\n ...super.getDefaults(),\n ...Textbox.ownDefaults,\n };\n }\n\n /**\n * Constructor\n * @param {String} text Text string\n * @param {Object} [options] Options object\n */\n constructor(text: string, options?: Props) {\n super(text, { ...Textbox.ownDefaults, ...options } as Props);\n }\n\n /**\n * Creates the default control object.\n * If you prefer to have on instance of controls shared among all objects\n * make this function return an empty object and add controls to the ownDefaults object\n */\n static createControls(): { controls: Record } {\n return { controls: createTextboxDefaultControls() };\n }\n\n /**\n * Unlike superclass's version of this function, Textbox does not update\n * its width.\n * @private\n * @override\n */\n initDimensions() {\n if (!this.initialized) {\n return;\n }\n this.isEditing && this.initDelayedCursor();\n this._clearCache();\n // clear dynamicMinWidth as it will be different after we re-wrap line\n this.dynamicMinWidth = 0;\n // wrap lines\n this._styleMap = this._generateStyleMap(this._splitText());\n // if after wrapping, the width is smaller than dynamicMinWidth, change the width and re-wrap\n if (this.dynamicMinWidth > this.width) {\n this._set('width', this.dynamicMinWidth);\n }\n if (this.textAlign.includes(JUSTIFY)) {\n // once text is measured we need to make space fatter to make justified text.\n this.enlargeSpaces();\n }\n // clear cache and re-calculate height\n this.height = this.calcTextHeight();\n }\n\n /**\n * Generate an object that translates the style object so that it is\n * broken up by visual lines (new lines and automatic wrapping).\n * The original text styles object is broken up by actual lines (new lines only),\n * which is only sufficient for Text / IText\n * @private\n */\n _generateStyleMap(textInfo: TextLinesInfo): StyleMap {\n let realLineCount = 0,\n realLineCharCount = 0,\n charCount = 0;\n const map: StyleMap = {};\n\n for (let i = 0; i < textInfo.graphemeLines.length; i++) {\n if (textInfo.graphemeText[charCount] === '\\n' && i > 0) {\n realLineCharCount = 0;\n charCount++;\n realLineCount++;\n } else if (\n !this.splitByGrapheme &&\n this._reSpaceAndTab.test(textInfo.graphemeText[charCount]) &&\n i > 0\n ) {\n // this case deals with space's that are removed from end of lines when wrapping\n realLineCharCount++;\n charCount++;\n }\n\n map[i] = { line: realLineCount, offset: realLineCharCount };\n\n charCount += textInfo.graphemeLines[i].length;\n realLineCharCount += textInfo.graphemeLines[i].length;\n }\n\n return map;\n }\n\n /**\n * Returns true if object has a style property or has it on a specified line\n * @param {Number} lineIndex\n * @return {Boolean}\n */\n styleHas(property: keyof TextStyleDeclaration, lineIndex: number): boolean {\n if (this._styleMap && !this.isWrapping) {\n const map = this._styleMap[lineIndex];\n if (map) {\n lineIndex = map.line;\n }\n }\n return super.styleHas(property, lineIndex);\n }\n\n /**\n * Returns true if object has no styling or no styling in a line\n * @param {Number} lineIndex , lineIndex is on wrapped lines.\n * @return {Boolean}\n */\n isEmptyStyles(lineIndex: number): boolean {\n if (!this.styles) {\n return true;\n }\n let offset = 0,\n nextLineIndex = lineIndex + 1,\n nextOffset: number,\n shouldLimit = false;\n const map = this._styleMap[lineIndex],\n mapNextLine = this._styleMap[lineIndex + 1];\n if (map) {\n lineIndex = map.line;\n offset = map.offset;\n }\n if (mapNextLine) {\n nextLineIndex = mapNextLine.line;\n shouldLimit = nextLineIndex === lineIndex;\n nextOffset = mapNextLine.offset;\n }\n const obj =\n typeof lineIndex === 'undefined'\n ? this.styles\n : { line: this.styles[lineIndex] };\n for (const p1 in obj) {\n for (const p2 in obj[p1]) {\n const p2Number = parseInt(p2, 10);\n if (p2Number >= offset && (!shouldLimit || p2Number < nextOffset!)) {\n for (const p3 in obj[p1][p2]) {\n return false;\n }\n }\n }\n }\n return true;\n }\n\n /**\n * @protected\n * @param {Number} lineIndex\n * @param {Number} charIndex\n * @return {TextStyleDeclaration} a style object reference to the existing one or a new empty object when undefined\n */\n _getStyleDeclaration(\n lineIndex: number,\n charIndex: number,\n ): TextStyleDeclaration {\n if (this._styleMap && !this.isWrapping) {\n const map = this._styleMap[lineIndex];\n if (!map) {\n return {};\n }\n lineIndex = map.line;\n charIndex = map.offset + charIndex;\n }\n return super._getStyleDeclaration(lineIndex, charIndex);\n }\n\n /**\n * @param {Number} lineIndex\n * @param {Number} charIndex\n * @param {Object} style\n * @private\n */\n protected _setStyleDeclaration(\n lineIndex: number,\n charIndex: number,\n style: object,\n ) {\n const map = this._styleMap[lineIndex];\n super._setStyleDeclaration(map.line, map.offset + charIndex, style);\n }\n\n /**\n * @param {Number} lineIndex\n * @param {Number} charIndex\n * @private\n */\n protected _deleteStyleDeclaration(lineIndex: number, charIndex: number) {\n const map = this._styleMap[lineIndex];\n super._deleteStyleDeclaration(map.line, map.offset + charIndex);\n }\n\n /**\n * probably broken need a fix\n * Returns the real style line that correspond to the wrapped lineIndex line\n * Used just to verify if the line does exist or not.\n * @param {Number} lineIndex\n * @returns {Boolean} if the line exists or not\n * @private\n */\n protected _getLineStyle(lineIndex: number): boolean {\n const map = this._styleMap[lineIndex];\n return !!this.styles[map.line];\n }\n\n /**\n * Set the line style to an empty object so that is initialized\n * @param {Number} lineIndex\n * @param {Object} style\n * @private\n */\n protected _setLineStyle(lineIndex: number) {\n const map = this._styleMap[lineIndex];\n super._setLineStyle(map.line);\n }\n\n /**\n * Wraps text using the 'width' property of Textbox. First this function\n * splits text on newlines, so we preserve newlines entered by the user.\n * Then it wraps each line using the width of the Textbox by calling\n * _wrapLine().\n * @param {Array} lines The string array of text that is split into lines\n * @param {Number} desiredWidth width you want to wrap to\n * @returns {Array} Array of lines\n */\n _wrapText(lines: string[], desiredWidth: number): string[][] {\n this.isWrapping = true;\n // extract all thewords and the widths to optimally wrap lines.\n const data = this.getGraphemeDataForRender(lines);\n const wrapped: string[][] = [];\n for (let i = 0; i < data.wordsData.length; i++) {\n wrapped.push(...this._wrapLine(i, desiredWidth, data));\n }\n this.isWrapping = false;\n return wrapped;\n }\n\n /**\n * For each line of text terminated by an hard line stop,\n * measure each word width and extract the largest word from all.\n * The returned words here are the one that at the end will be rendered.\n * @param {string[]} lines the lines we need to measure\n *\n */\n getGraphemeDataForRender(lines: string[]): GraphemeData {\n const splitByGrapheme = this.splitByGrapheme,\n infix = splitByGrapheme ? '' : ' ';\n\n let largestWordWidth = 0;\n\n const data = lines.map((line, lineIndex) => {\n let offset = 0;\n const wordsOrGraphemes = splitByGrapheme\n ? this.graphemeSplit(line)\n : this.wordSplit(line);\n\n if (wordsOrGraphemes.length === 0) {\n return [{ word: [], width: 0 }];\n }\n\n return wordsOrGraphemes.map((word: string) => {\n // if using splitByGrapheme words are already in graphemes.\n const graphemeArray = splitByGrapheme\n ? [word]\n : this.graphemeSplit(word);\n const width = this._measureWord(graphemeArray, lineIndex, offset);\n largestWordWidth = Math.max(width, largestWordWidth);\n offset += graphemeArray.length + infix.length;\n return { word: graphemeArray, width };\n });\n });\n\n return {\n wordsData: data,\n largestWordWidth,\n };\n }\n\n /**\n * Helper function to measure a string of text, given its lineIndex and charIndex offset\n * It gets called when charBounds are not available yet.\n * Override if necessary\n * Use with {@link Textbox#wordSplit}\n *\n * @param {CanvasRenderingContext2D} ctx\n * @param {String} text\n * @param {number} lineIndex\n * @param {number} charOffset\n * @returns {number}\n */\n _measureWord(word: string[], lineIndex: number, charOffset = 0): number {\n let width = 0,\n prevGrapheme;\n const skipLeft = true;\n for (let i = 0, len = word.length; i < len; i++) {\n const box = this._getGraphemeBox(\n word[i],\n lineIndex,\n i + charOffset,\n prevGrapheme,\n skipLeft,\n );\n width += box.kernedWidth;\n prevGrapheme = word[i];\n }\n return width;\n }\n\n /**\n * Override this method to customize word splitting\n * Use with {@link Textbox#_measureWord}\n * @param {string} value\n * @returns {string[]} array of words\n */\n wordSplit(value: string): string[] {\n return value.split(this._wordJoiners);\n }\n\n /**\n * Wraps a line of text using the width of the Textbox as desiredWidth\n * and leveraging the known width o words from GraphemeData\n * @private\n * @param {Number} lineIndex\n * @param {Number} desiredWidth width you want to wrap the line to\n * @param {GraphemeData} graphemeData an object containing all the lines' words width.\n * @param {Number} reservedSpace space to remove from wrapping for custom functionalities\n * @returns {Array} Array of line(s) into which the given text is wrapped\n * to.\n */\n _wrapLine(\n lineIndex: number,\n desiredWidth: number,\n { largestWordWidth, wordsData }: GraphemeData,\n reservedSpace = 0,\n ): string[][] {\n const additionalSpace = this._getWidthOfCharSpacing(),\n splitByGrapheme = this.splitByGrapheme,\n graphemeLines = [],\n infix = splitByGrapheme ? '' : ' ';\n\n let lineWidth = 0,\n line: string[] = [],\n // spaces in different languages?\n offset = 0,\n infixWidth = 0,\n lineJustStarted = true;\n\n desiredWidth -= reservedSpace;\n\n const maxWidth = Math.max(\n desiredWidth,\n largestWordWidth,\n this.dynamicMinWidth,\n );\n // layout words\n const data = wordsData[lineIndex];\n offset = 0;\n let i;\n for (i = 0; i < data.length; i++) {\n const { word, width: wordWidth } = data[i];\n offset += word.length;\n\n lineWidth += infixWidth + wordWidth - additionalSpace;\n if (lineWidth > maxWidth && !lineJustStarted) {\n graphemeLines.push(line);\n line = [];\n lineWidth = wordWidth;\n lineJustStarted = true;\n } else {\n lineWidth += additionalSpace;\n }\n\n if (!lineJustStarted && !splitByGrapheme) {\n line.push(infix);\n }\n line = line.concat(word);\n\n infixWidth = splitByGrapheme\n ? 0\n : this._measureWord([infix], lineIndex, offset);\n offset++;\n lineJustStarted = false;\n }\n\n i && graphemeLines.push(line);\n\n // TODO: this code is probably not necessary anymore.\n // it can be moved out of this function since largestWordWidth is now\n // known in advance\n if (largestWordWidth + reservedSpace > this.dynamicMinWidth) {\n this.dynamicMinWidth = largestWordWidth - additionalSpace + reservedSpace;\n }\n return graphemeLines;\n }\n\n /**\n * Detect if the text line is ended with an hard break\n * text and itext do not have wrapping, return false\n * @param {Number} lineIndex text to split\n * @return {Boolean}\n */\n isEndOfWrapping(lineIndex: number): boolean {\n if (!this._styleMap[lineIndex + 1]) {\n // is last line, return true;\n return true;\n }\n if (this._styleMap[lineIndex + 1].line !== this._styleMap[lineIndex].line) {\n // this is last line before a line break, return true;\n return true;\n }\n return false;\n }\n\n /**\n * Detect if a line has a linebreak and so we need to account for it when moving\n * and counting style.\n * This is important only for splitByGrapheme at the end of wrapping.\n * If we are not wrapping the offset is always 1\n * @return Number\n */\n missingNewlineOffset(lineIndex: number, skipWrapping?: boolean): 0 | 1 {\n if (this.splitByGrapheme && !skipWrapping) {\n return this.isEndOfWrapping(lineIndex) ? 1 : 0;\n }\n return 1;\n }\n\n /**\n * Gets lines of text to render in the Textbox. This function calculates\n * text wrapping on the fly every time it is called.\n * @param {String} text text to split\n * @returns {Array} Array of lines in the Textbox.\n * @override\n */\n _splitTextIntoLines(text: string) {\n const newText = super._splitTextIntoLines(text),\n graphemeLines = this._wrapText(newText.lines, this.width),\n lines = new Array(graphemeLines.length);\n for (let i = 0; i < graphemeLines.length; i++) {\n lines[i] = graphemeLines[i].join('');\n }\n newText.lines = lines;\n newText.graphemeLines = graphemeLines;\n return newText;\n }\n\n getMinWidth() {\n return Math.max(this.minWidth, this.dynamicMinWidth);\n }\n\n _removeExtraneousStyles() {\n const linesToKeep = new Map();\n for (const prop in this._styleMap) {\n const propNumber = parseInt(prop, 10);\n if (this._textLines[propNumber]) {\n const lineIndex = this._styleMap[prop].line;\n linesToKeep.set(`${lineIndex}`, true);\n }\n }\n for (const prop in this.styles) {\n if (!linesToKeep.has(prop)) {\n delete this.styles[prop];\n }\n }\n }\n\n /**\n * Returns object representation of an instance\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} object representation of an instance\n */\n toObject<\n T extends Omit, keyof SProps>,\n K extends keyof T = never,\n >(propertiesToInclude: K[] = []): Pick & SProps {\n return super.toObject([\n 'minWidth',\n 'splitByGrapheme',\n ...propertiesToInclude,\n ] as K[]);\n }\n}\n\nclassRegistry.setClass(Textbox);\n","import { Point } from '../../Point';\nimport type { FabricObject } from '../../shapes/Object/FabricObject';\nimport { makeBoundingBoxFromPoints } from '../../util/misc/boundingBoxFromPoints';\nimport { sendPointToPlane } from '../../util/misc/planeChange';\nimport type { LayoutStrategyResult, StrictLayoutContext } from '../types';\nimport { LayoutStrategy } from './LayoutStrategy';\nimport { getObjectBounds } from './utils';\nimport { classRegistry } from '../../ClassRegistry';\n\n/**\n * Layout will adjust the bounding box to match the clip path bounding box.\n */\nexport class ClipPathLayout extends LayoutStrategy {\n static readonly type = 'clip-path';\n\n shouldPerformLayout(context: StrictLayoutContext): boolean {\n return !!context.target.clipPath && super.shouldPerformLayout(context);\n }\n\n shouldLayoutClipPath() {\n return false;\n }\n\n calcLayoutResult(\n context: StrictLayoutContext,\n objects: FabricObject[],\n ): LayoutStrategyResult | undefined {\n const { target } = context;\n const { clipPath, group } = target;\n if (!clipPath || !this.shouldPerformLayout(context)) {\n return;\n }\n // TODO: remove stroke calculation from this case\n const { width, height } = makeBoundingBoxFromPoints(\n getObjectBounds(target, clipPath as FabricObject),\n );\n const size = new Point(width, height);\n if (clipPath.absolutePositioned) {\n // we want the center point to exist in group's containing plane\n const clipPathCenter = sendPointToPlane(\n clipPath.getRelativeCenterPoint(),\n undefined,\n group ? group.calcTransformMatrix() : undefined,\n );\n return {\n center: clipPathCenter,\n size,\n };\n } else {\n // we want the center point to exist in group's containing plane, so we send it upwards\n const clipPathCenter = clipPath\n .getRelativeCenterPoint()\n .transform(target.calcOwnMatrix(), true);\n if (this.shouldPerformLayout(context)) {\n // the clip path is positioned relative to the group's center which is affected by the bbox\n // so we first calculate the bbox\n const { center = new Point(), correction = new Point() } =\n this.calcBoundingBox(objects, context) || {};\n return {\n center: center.add(clipPathCenter),\n correction: correction.subtract(clipPathCenter),\n size,\n };\n } else {\n return {\n center: target.getRelativeCenterPoint().add(clipPathCenter),\n size,\n };\n }\n }\n }\n}\n\nclassRegistry.setClass(ClipPathLayout);\n","import { Point } from '../../Point';\nimport type {\n InitializationLayoutContext,\n LayoutStrategyResult,\n StrictLayoutContext,\n} from '../types';\nimport { LayoutStrategy } from './LayoutStrategy';\nimport { classRegistry } from '../../ClassRegistry';\n\n/**\n * Layout will keep target's initial size.\n */\nexport class FixedLayout extends LayoutStrategy {\n static readonly type = 'fixed';\n\n /**\n * @override respect target's initial size\n */\n getInitialSize(\n { target }: StrictLayoutContext & InitializationLayoutContext,\n { size }: Pick,\n ): Point {\n return new Point(target.width || size.x, target.height || size.y);\n }\n}\n\nclassRegistry.setClass(FixedLayout);\n","import { LayoutManager } from './LayoutManager';\nimport type { RegistrationContext, StrictLayoutContext } from './types';\nimport type { Group } from '../shapes/Group';\n\n/**\n * Today the LayoutManager class also takes care of subscribing event handlers\n * to update the group layout when the group is interactive and a transform is applied\n * to a child object.\n * The ActiveSelection is never interactive, but it could contain objects from\n * groups that are.\n * The standard LayoutManager would subscribe the children of the activeSelection to\n * perform layout changes to the active selection itself, what we need instead is that\n * the transformation applied to the active selection will trigger changes to the\n * original group of the children ( the one referenced under the parent property )\n * This subclass of the LayoutManager has a single duty to fill the gap of this difference.`\n */\nexport class ActiveSelectionLayoutManager extends LayoutManager {\n subscribeTargets(\n context: RegistrationContext & Partial,\n ): void {\n const activeSelection = context.target;\n const parents = context.targets.reduce((parents, target) => {\n target.parent && parents.add(target.parent);\n return parents;\n }, new Set());\n parents.forEach((parent) => {\n parent.layoutManager.subscribeTargets({\n target: parent,\n targets: [activeSelection],\n });\n });\n }\n\n /**\n * unsubscribe from parent only if all its children were deselected\n */\n unsubscribeTargets(\n context: RegistrationContext & Partial,\n ): void {\n const activeSelection = context.target;\n const selectedObjects = activeSelection.getObjects();\n const parents = context.targets.reduce((parents, target) => {\n target.parent && parents.add(target.parent);\n return parents;\n }, new Set());\n parents.forEach((parent) => {\n !selectedObjects.some((object) => object.parent === parent) &&\n parent.layoutManager.unsubscribeTargets({\n target: parent,\n targets: [activeSelection],\n });\n });\n }\n}\n","import type { ControlRenderingStyleOverride } from '../controls/controlRendering';\nimport { classRegistry } from '../ClassRegistry';\nimport type { GroupProps } from './Group';\nimport { Group } from './Group';\nimport type { FabricObject } from './Object/FabricObject';\nimport {\n LAYOUT_TYPE_ADDED,\n LAYOUT_TYPE_REMOVED,\n} from '../LayoutManager/constants';\nimport type { TClassProperties } from '../typedefs';\nimport { log } from '../util/internals/console';\nimport { ActiveSelectionLayoutManager } from '../LayoutManager/ActiveSelectionLayoutManager';\n\nexport type MultiSelectionStacking = 'canvas-stacking' | 'selection-order';\n\nexport interface ActiveSelectionOptions extends GroupProps {\n multiSelectionStacking: MultiSelectionStacking;\n}\n\nconst activeSelectionDefaultValues: Partial> =\n {\n multiSelectionStacking: 'canvas-stacking',\n };\n\n/**\n * Used by Canvas to manage selection.\n *\n * @example\n * class MyActiveSelection extends ActiveSelection {\n * ...\n * }\n *\n * // override the default `ActiveSelection` class\n * classRegistry.setClass(MyActiveSelection)\n */\nexport class ActiveSelection extends Group {\n static type = 'ActiveSelection';\n\n static ownDefaults: Record = activeSelectionDefaultValues;\n\n static getDefaults(): Record {\n return { ...super.getDefaults(), ...ActiveSelection.ownDefaults };\n }\n\n /**\n * The ActiveSelection needs to use the ActiveSelectionLayoutManager\n * or selections on interactive groups may be broken\n */\n declare layoutManager: ActiveSelectionLayoutManager;\n\n /**\n * controls how selected objects are added during a multiselection event\n * - `canvas-stacking` adds the selected object to the active selection while respecting canvas object stacking order\n * - `selection-order` adds the selected object to the top of the stack,\n * meaning that the stack is ordered by the order in which objects were selected\n * @default `canvas-stacking`\n */\n declare multiSelectionStacking: MultiSelectionStacking;\n\n constructor(\n objects: FabricObject[] = [],\n options: Partial = {},\n ) {\n super();\n Object.assign(this, ActiveSelection.ownDefaults);\n this.setOptions(options);\n const { left, top, layoutManager } = options;\n this.groupInit(objects, {\n left,\n top,\n layoutManager: layoutManager ?? new ActiveSelectionLayoutManager(),\n });\n }\n\n /**\n * @private\n */\n _shouldSetNestedCoords() {\n return true;\n }\n\n /**\n * @private\n * @override we don't want the selection monitor to be active\n */\n __objectSelectionMonitor() {\n // noop\n }\n\n /**\n * Adds objects with respect to {@link multiSelectionStacking}\n * @param targets object to add to selection\n */\n multiSelectAdd(...targets: FabricObject[]) {\n if (this.multiSelectionStacking === 'selection-order') {\n this.add(...targets);\n } else {\n // respect object stacking as it is on canvas\n // perf enhancement for large ActiveSelection: consider a binary search of `isInFrontOf`\n targets.forEach((target) => {\n const index = this._objects.findIndex((obj) => obj.isInFrontOf(target));\n const insertAt =\n index === -1\n ? // `target` is in front of all other objects\n this.size()\n : index;\n this.insertAt(insertAt, target);\n });\n }\n }\n\n /**\n * @override block ancestors/descendants of selected objects from being selected to prevent a circular object tree\n */\n canEnterGroup(object: FabricObject) {\n if (\n this.getObjects().some(\n (o) => o.isDescendantOf(object) || object.isDescendantOf(o),\n )\n ) {\n // prevent circular object tree\n log(\n 'error',\n 'ActiveSelection: circular object trees are not supported, this call has no effect',\n );\n return false;\n }\n\n return super.canEnterGroup(object);\n }\n\n /**\n * Change an object so that it can be part of an active selection.\n * this method is called by multiselectAdd from canvas code.\n * @private\n * @param {FabricObject} object\n * @param {boolean} [removeParentTransform] true if object is in canvas coordinate plane\n */\n enterGroup(object: FabricObject, removeParentTransform?: boolean) {\n // This condition check that the object has currently a group, and the group\n // is also its parent, meaning that is not in an active selection, but is\n // in a normal group.\n if (object.parent && object.parent === object.group) {\n // Disconnect the object from the group functionalities, but keep the ref parent intact\n // for later re-enter\n object.parent._exitGroup(object);\n // in this case the object is probably inside an active selection.\n } else if (object.group && object.parent !== object.group) {\n // in this case group.remove will also clear the old parent reference.\n object.group.remove(object);\n }\n // enter the active selection from a render perspective\n // the object will be in the objects array of both the ActiveSelection and the Group\n // but referenced in the group's _activeObjects so that it won't be rendered twice.\n this._enterGroup(object, removeParentTransform);\n }\n\n /**\n * we want objects to retain their canvas ref when exiting instance\n * @private\n * @param {FabricObject} object\n * @param {boolean} [removeParentTransform] true if object should exit group without applying group's transform to it\n */\n exitGroup(object: FabricObject, removeParentTransform?: boolean) {\n this._exitGroup(object, removeParentTransform);\n // return to parent\n object.parent && object.parent._enterGroup(object, true);\n }\n\n /**\n * @private\n * @param {'added'|'removed'} type\n * @param {FabricObject[]} targets\n */\n _onAfterObjectsChange(type: 'added' | 'removed', targets: FabricObject[]) {\n super._onAfterObjectsChange(type, targets);\n const groups = new Set();\n targets.forEach((object) => {\n const { parent } = object;\n parent && groups.add(parent);\n });\n if (type === LAYOUT_TYPE_REMOVED) {\n // invalidate groups' layout and mark as dirty\n groups.forEach((group) => {\n group._onAfterObjectsChange(LAYOUT_TYPE_ADDED, targets);\n });\n } else {\n // mark groups as dirty\n groups.forEach((group) => {\n group._set('dirty', true);\n });\n }\n }\n\n /**\n * @override remove all objects\n */\n onDeselect() {\n this.removeAll();\n return false;\n }\n\n /**\n * Returns string representation of a group\n * @return {String}\n */\n toString() {\n return `#`;\n }\n\n /**\n * Decide if the object should cache or not. The Active selection never caches\n * @return {Boolean}\n */\n shouldCache() {\n return false;\n }\n\n /**\n * Check if this group or its parent group are caching, recursively up\n * @return {Boolean}\n */\n isOnACache() {\n return false;\n }\n\n /**\n * Renders controls and borders for the object\n * @param {CanvasRenderingContext2D} ctx Context to render on\n * @param {Object} [styleOverride] properties to override the object style\n * @param {Object} [childrenOverride] properties to override the children overrides\n */\n _renderControls(\n ctx: CanvasRenderingContext2D,\n styleOverride?: ControlRenderingStyleOverride,\n childrenOverride?: ControlRenderingStyleOverride,\n ) {\n ctx.save();\n ctx.globalAlpha = this.isMoving ? this.borderOpacityWhenMoving : 1;\n const options = {\n hasControls: false,\n ...childrenOverride,\n forActiveSelection: true,\n };\n for (let i = 0; i < this._objects.length; i++) {\n this._objects[i]._renderControls(ctx, options);\n }\n super._renderControls(ctx, styleOverride);\n ctx.restore();\n }\n}\n\nclassRegistry.setClass(ActiveSelection);\nclassRegistry.setClass(ActiveSelection, 'activeSelection');\n","/**\n * Canvas 2D filter backend.\n */\nimport type { BaseFilter } from './BaseFilter';\nimport type { T2DPipelineState, TPipelineResources } from './typedefs';\n\nexport class Canvas2dFilterBackend {\n /**\n * Experimental. This object is a sort of repository of help layers used to avoid\n * of recreating them during frequent filtering. If you are previewing a filter with\n * a slider you probably do not want to create help layers every filter step.\n * in this object there will be appended some canvases, created once, resized sometimes\n * cleared never. Clearing is left to the developer.\n **/\n resources: TPipelineResources = {};\n\n /**\n * Apply a set of filters against a source image and draw the filtered output\n * to the provided destination canvas.\n *\n * @param {EnhancedFilter} filters The filter to apply.\n * @param {HTMLImageElement|HTMLCanvasElement} sourceElement The source to be filtered.\n * @param {Number} sourceWidth The width of the source input.\n * @param {Number} sourceHeight The height of the source input.\n * @param {HTMLCanvasElement} targetCanvas The destination for filtered output to be drawn.\n */\n applyFilters(\n filters: BaseFilter>[],\n sourceElement: CanvasImageSource,\n sourceWidth: number,\n sourceHeight: number,\n targetCanvas: HTMLCanvasElement,\n ): T2DPipelineState | void {\n const ctx = targetCanvas.getContext('2d', {\n willReadFrequently: true,\n desynchronized: true,\n });\n if (!ctx) {\n return;\n }\n ctx.drawImage(sourceElement, 0, 0, sourceWidth, sourceHeight);\n const imageData = ctx.getImageData(0, 0, sourceWidth, sourceHeight);\n const originalImageData = ctx.getImageData(0, 0, sourceWidth, sourceHeight);\n const pipelineState: T2DPipelineState = {\n sourceWidth,\n sourceHeight,\n imageData,\n originalEl: sourceElement,\n originalImageData,\n canvasEl: targetCanvas,\n ctx,\n filterBackend: this,\n };\n filters.forEach((filter) => {\n filter.applyTo(pipelineState);\n });\n const { imageData: imageDataPostFilter } = pipelineState;\n if (\n imageDataPostFilter.width !== sourceWidth ||\n imageDataPostFilter.height !== sourceHeight\n ) {\n targetCanvas.width = imageDataPostFilter.width;\n targetCanvas.height = imageDataPostFilter.height;\n }\n ctx.putImageData(imageDataPostFilter, 0, 0);\n return pipelineState;\n }\n}\n","import { config } from '../config';\nimport { createCanvasElementFor } from '../util/misc/dom';\nimport type {\n TWebGLPipelineState,\n TProgramCache,\n TTextureCache,\n TPipelineResources,\n} from './typedefs';\nimport type { BaseFilter } from './BaseFilter';\n\nexport class WebGLFilterBackend {\n declare tileSize: number;\n\n /**\n * Define ...\n **/\n aPosition: Float32Array = new Float32Array([0, 0, 0, 1, 1, 0, 1, 1]);\n\n /**\n * If GLPut data is the fastest operation, or if forced, this buffer will be used\n * to transfer the data back in the 2d logic\n **/\n declare imageBuffer?: ArrayBuffer;\n\n declare canvas: HTMLCanvasElement;\n\n /**\n * The Webgl context that will execute the operations for filtering\n **/\n declare gl: WebGLRenderingContext;\n\n /**\n * Keyed map for shader cache\n **/\n declare programCache: TProgramCache;\n\n /**\n * Keyed map for texture cache\n **/\n declare textureCache: TTextureCache;\n\n /**\n * Contains GPU info for debug\n **/\n declare gpuInfo: any;\n\n /**\n * Experimental. This object is a sort of repository of help layers used to avoid\n * of recreating them during frequent filtering. If you are previewing a filter with\n * a slider you probably do not want to create help layers every filter step.\n * in this object there will be appended some canvases, created once, resized sometimes\n * cleared never. Clearing is left to the developer.\n **/\n resources: TPipelineResources = {};\n\n constructor({ tileSize = config.textureSize } = {}) {\n this.tileSize = tileSize;\n this.setupGLContext(tileSize, tileSize);\n this.captureGPUInfo();\n }\n\n /**\n * Setup a WebGL context suitable for filtering, and bind any needed event handlers.\n */\n setupGLContext(width: number, height: number): void {\n this.dispose();\n this.createWebGLCanvas(width, height);\n }\n\n /**\n * Create a canvas element and associated WebGL context and attaches them as\n * class properties to the GLFilterBackend class.\n */\n createWebGLCanvas(width: number, height: number): void {\n const canvas = createCanvasElementFor({ width, height });\n const glOptions = {\n alpha: true,\n premultipliedAlpha: false,\n depth: false,\n stencil: false,\n antialias: false,\n },\n gl = canvas.getContext('webgl', glOptions) as WebGLRenderingContext;\n\n if (!gl) {\n return;\n }\n gl.clearColor(0, 0, 0, 0);\n // this canvas can fire webglcontextlost and webglcontextrestored\n this.canvas = canvas;\n this.gl = gl;\n }\n\n /**\n * Attempts to apply the requested filters to the source provided, drawing the filtered output\n * to the provided target canvas.\n *\n * @param {Array} filters The filters to apply.\n * @param {TexImageSource} source The source to be filtered.\n * @param {Number} width The width of the source input.\n * @param {Number} height The height of the source input.\n * @param {HTMLCanvasElement} targetCanvas The destination for filtered output to be drawn.\n * @param {String|undefined} cacheKey A key used to cache resources related to the source. If\n * omitted, caching will be skipped.\n */\n applyFilters(\n filters: BaseFilter>[],\n source: TexImageSource,\n width: number,\n height: number,\n targetCanvas: HTMLCanvasElement,\n cacheKey?: string,\n ): TWebGLPipelineState | undefined {\n const gl = this.gl;\n const ctx = targetCanvas.getContext('2d');\n if (!gl || !ctx) {\n return;\n }\n let cachedTexture;\n if (cacheKey) {\n cachedTexture = this.getCachedTexture(cacheKey, source);\n }\n const pipelineState: TWebGLPipelineState = {\n originalWidth:\n (source as HTMLImageElement).width ||\n (source as HTMLImageElement).naturalWidth ||\n 0,\n originalHeight:\n (source as HTMLImageElement).height ||\n (source as HTMLImageElement).naturalHeight ||\n 0,\n sourceWidth: width,\n sourceHeight: height,\n destinationWidth: width,\n destinationHeight: height,\n context: gl,\n sourceTexture: this.createTexture(\n gl,\n width,\n height,\n !cachedTexture ? source : undefined,\n ),\n targetTexture: this.createTexture(gl, width, height),\n originalTexture:\n cachedTexture ||\n this.createTexture(\n gl,\n width,\n height,\n !cachedTexture ? source : undefined,\n ),\n passes: filters.length,\n webgl: true,\n aPosition: this.aPosition,\n programCache: this.programCache,\n pass: 0,\n filterBackend: this,\n targetCanvas: targetCanvas,\n };\n const tempFbo = gl.createFramebuffer();\n gl.bindFramebuffer(gl.FRAMEBUFFER, tempFbo);\n filters.forEach((filter: any) => {\n filter && filter.applyTo(pipelineState);\n });\n resizeCanvasIfNeeded(pipelineState);\n this.copyGLTo2D(gl, pipelineState);\n gl.bindTexture(gl.TEXTURE_2D, null);\n gl.deleteTexture(pipelineState.sourceTexture);\n gl.deleteTexture(pipelineState.targetTexture);\n gl.deleteFramebuffer(tempFbo);\n ctx.setTransform(1, 0, 0, 1, 0, 0);\n return pipelineState;\n }\n\n /**\n * Detach event listeners, remove references, and clean up caches.\n */\n dispose() {\n if (this.canvas) {\n // we are disposing, we don't care about the fact\n // that the canvas shouldn't be null.\n // @ts-expect-error disposing\n this.canvas = null;\n // @ts-expect-error disposing\n this.gl = null;\n }\n this.clearWebGLCaches();\n }\n\n /**\n * Wipe out WebGL-related caches.\n */\n clearWebGLCaches() {\n this.programCache = {};\n this.textureCache = {};\n }\n\n /**\n * Create a WebGL texture object.\n *\n * Accepts specific dimensions to initialize the texture to or a source image.\n *\n * @param {WebGLRenderingContext} gl The GL context to use for creating the texture.\n * @param {number} width The width to initialize the texture at.\n * @param {number} height The height to initialize the texture.\n * @param {TexImageSource} textureImageSource A source for the texture data.\n * @param {number} filter gl.NEAREST default or gl.LINEAR filters for the texture.\n * This filter is very useful for LUTs filters. If you need interpolation use gl.LINEAR\n * @returns {WebGLTexture}\n */\n createTexture(\n gl: WebGLRenderingContext,\n width: number,\n height: number,\n textureImageSource?: TexImageSource,\n filter?:\n | WebGLRenderingContextBase['NEAREST']\n | WebGLRenderingContextBase['LINEAR'],\n ): WebGLTexture {\n const {\n NEAREST,\n TEXTURE_2D,\n RGBA,\n UNSIGNED_BYTE,\n CLAMP_TO_EDGE,\n TEXTURE_MAG_FILTER,\n TEXTURE_MIN_FILTER,\n TEXTURE_WRAP_S,\n TEXTURE_WRAP_T,\n } = gl;\n const texture = gl.createTexture();\n gl.bindTexture(TEXTURE_2D, texture);\n gl.texParameteri(TEXTURE_2D, TEXTURE_MAG_FILTER, filter || NEAREST);\n gl.texParameteri(TEXTURE_2D, TEXTURE_MIN_FILTER, filter || NEAREST);\n gl.texParameteri(TEXTURE_2D, TEXTURE_WRAP_S, CLAMP_TO_EDGE);\n gl.texParameteri(TEXTURE_2D, TEXTURE_WRAP_T, CLAMP_TO_EDGE);\n if (textureImageSource) {\n gl.texImage2D(\n TEXTURE_2D,\n 0,\n RGBA,\n RGBA,\n UNSIGNED_BYTE,\n textureImageSource,\n );\n } else {\n gl.texImage2D(\n TEXTURE_2D,\n 0,\n RGBA,\n width,\n height,\n 0,\n RGBA,\n UNSIGNED_BYTE,\n null,\n );\n }\n // disabled because website and issues with different typescript version\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion\n return texture!;\n }\n\n /**\n * Can be optionally used to get a texture from the cache array\n *\n * If an existing texture is not found, a new texture is created and cached.\n *\n * @param {String} uniqueId A cache key to use to find an existing texture.\n * @param {HTMLImageElement|HTMLCanvasElement} textureImageSource A source to use to create the\n * texture cache entry if one does not already exist.\n */\n getCachedTexture(\n uniqueId: string,\n textureImageSource: TexImageSource,\n filter?:\n | WebGLRenderingContextBase['NEAREST']\n | WebGLRenderingContextBase['LINEAR'],\n ): WebGLTexture | null {\n const { textureCache } = this;\n if (textureCache[uniqueId]) {\n return textureCache[uniqueId];\n } else {\n const texture = this.createTexture(\n this.gl,\n (textureImageSource as HTMLImageElement).width,\n (textureImageSource as HTMLImageElement).height,\n textureImageSource,\n filter,\n );\n if (texture) {\n textureCache[uniqueId] = texture;\n }\n return texture;\n }\n }\n\n /**\n * Clear out cached resources related to a source image that has been\n * filtered previously.\n *\n * @param {String} cacheKey The cache key provided when the source image was filtered.\n */\n evictCachesForKey(cacheKey: string) {\n if (this.textureCache[cacheKey]) {\n this.gl.deleteTexture(this.textureCache[cacheKey]);\n delete this.textureCache[cacheKey];\n }\n }\n\n /**\n * Copy an input WebGL canvas on to an output 2D canvas.\n *\n * The WebGL canvas is assumed to be upside down, with the top-left pixel of the\n * desired output image appearing in the bottom-left corner of the WebGL canvas.\n *\n * @param {WebGLRenderingContext} sourceContext The WebGL context to copy from.\n * @param {Object} pipelineState The 2D target canvas to copy on to.\n */\n copyGLTo2D(gl: WebGLRenderingContext, pipelineState: TWebGLPipelineState) {\n const glCanvas = gl.canvas,\n targetCanvas = pipelineState.targetCanvas,\n ctx = targetCanvas.getContext('2d');\n if (!ctx) {\n return;\n }\n ctx.translate(0, targetCanvas.height); // move it down again\n ctx.scale(1, -1); // vertical flip\n // where is my image on the big glcanvas?\n const sourceY = glCanvas.height - targetCanvas.height;\n ctx.drawImage(\n glCanvas,\n 0,\n sourceY,\n targetCanvas.width,\n targetCanvas.height,\n 0,\n 0,\n targetCanvas.width,\n targetCanvas.height,\n );\n }\n\n /**\n * Copy an input WebGL canvas on to an output 2D canvas using 2d canvas' putImageData\n * API. Measurably faster than using ctx.drawImage in Firefox (version 54 on OSX Sierra).\n *\n * @param {WebGLRenderingContext} sourceContext The WebGL context to copy from.\n * @param {HTMLCanvasElement} targetCanvas The 2D target canvas to copy on to.\n * @param {Object} pipelineState The 2D target canvas to copy on to.\n */\n copyGLTo2DPutImageData(\n this: Required,\n gl: WebGLRenderingContext,\n pipelineState: TWebGLPipelineState,\n ) {\n const targetCanvas = pipelineState.targetCanvas,\n ctx = targetCanvas.getContext('2d'),\n dWidth = pipelineState.destinationWidth,\n dHeight = pipelineState.destinationHeight,\n numBytes = dWidth * dHeight * 4;\n if (!ctx) {\n return;\n }\n const u8 = new Uint8Array(this.imageBuffer, 0, numBytes);\n const u8Clamped = new Uint8ClampedArray(this.imageBuffer, 0, numBytes);\n\n gl.readPixels(0, 0, dWidth, dHeight, gl.RGBA, gl.UNSIGNED_BYTE, u8);\n const imgData = new ImageData(u8Clamped, dWidth, dHeight);\n ctx.putImageData(imgData, 0, 0);\n }\n\n /**\n * Attempt to extract GPU information strings from a WebGL context.\n *\n * Useful information when debugging or blacklisting specific GPUs.\n *\n * @returns {Object} A GPU info object with renderer and vendor strings.\n */\n captureGPUInfo() {\n if (this.gpuInfo) {\n return this.gpuInfo;\n }\n const gl = this.gl,\n gpuInfo = { renderer: '', vendor: '' };\n if (!gl) {\n return gpuInfo;\n }\n const ext = gl.getExtension('WEBGL_debug_renderer_info');\n if (ext) {\n const renderer = gl.getParameter(ext.UNMASKED_RENDERER_WEBGL);\n const vendor = gl.getParameter(ext.UNMASKED_VENDOR_WEBGL);\n if (renderer) {\n gpuInfo.renderer = renderer.toLowerCase();\n }\n if (vendor) {\n gpuInfo.vendor = vendor.toLowerCase();\n }\n }\n this.gpuInfo = gpuInfo;\n return gpuInfo;\n }\n}\n\nfunction resizeCanvasIfNeeded(pipelineState: TWebGLPipelineState): void {\n const targetCanvas = pipelineState.targetCanvas,\n width = targetCanvas.width,\n height = targetCanvas.height,\n dWidth = pipelineState.destinationWidth,\n dHeight = pipelineState.destinationHeight;\n\n if (width !== dWidth || height !== dHeight) {\n targetCanvas.width = dWidth;\n targetCanvas.height = dHeight;\n }\n}\n","import { config } from '../config';\nimport { getEnv } from '../env';\nimport { createCanvasElement } from '../util/misc/dom';\nimport { Canvas2dFilterBackend } from './Canvas2dFilterBackend';\nimport { WebGLFilterBackend } from './WebGLFilterBackend';\n\nexport type FilterBackend = WebGLFilterBackend | Canvas2dFilterBackend;\n\nlet filterBackend: FilterBackend;\n\n/**\n * Verifies if it is possible to initialize webgl or fallback on a canvas2d filtering backend\n */\nexport function initFilterBackend(): FilterBackend {\n const { WebGLProbe } = getEnv();\n WebGLProbe.queryWebGL(createCanvasElement());\n if (config.enableGLFiltering && WebGLProbe.isSupported(config.textureSize)) {\n return new WebGLFilterBackend({ tileSize: config.textureSize });\n } else {\n return new Canvas2dFilterBackend();\n }\n}\n\n/**\n * Get the current fabricJS filter backend or initialize one if not available yet\n * @param [strict] pass `true` to create the backend if it wasn't created yet (default behavior),\n * pass `false` to get the backend ref without mutating it\n */\nexport function getFilterBackend(strict = true): FilterBackend {\n if (!filterBackend && strict) {\n filterBackend = initFilterBackend();\n }\n return filterBackend;\n}\n\nexport function setFilterBackend(backend: FilterBackend) {\n filterBackend = backend;\n}\n","import { getFabricDocument, getEnv } from '../env';\nimport type { BaseFilter } from '../filters/BaseFilter';\nimport { getFilterBackend } from '../filters/FilterBackend';\nimport { SHARED_ATTRIBUTES } from '../parser/attributes';\nimport { parseAttributes } from '../parser/parseAttributes';\nimport type {\n TClassProperties,\n TCrossOrigin,\n TSize,\n Abortable,\n TOptions,\n} from '../typedefs';\nimport { uid } from '../util/internals/uid';\nimport { createCanvasElementFor } from '../util/misc/dom';\nimport { findScaleToCover, findScaleToFit } from '../util/misc/findScaleTo';\nimport type { LoadImageOptions } from '../util/misc/objectEnlive';\nimport {\n enlivenObjectEnlivables,\n enlivenObjects,\n loadImage,\n} from '../util/misc/objectEnlive';\nimport { parsePreserveAspectRatioAttribute } from '../util/misc/svgParsing';\nimport { classRegistry } from '../ClassRegistry';\nimport { FabricObject, cacheProperties } from './Object/FabricObject';\nimport type { FabricObjectProps, SerializedObjectProps } from './Object/types';\nimport type { ObjectEvents } from '../EventTypeDefs';\nimport { WebGLFilterBackend } from '../filters/WebGLFilterBackend';\nimport { FILL, NONE } from '../constants';\nimport { getDocumentFromElement } from '../util/dom_misc';\nimport type { CSSRules } from '../parser/typedefs';\nimport type { Resize, ResizeSerializedProps } from '../filters/Resize';\nimport type { TCachedFabricObject } from './Object/Object';\nimport { log } from '../util/internals/console';\n\n// @todo Would be nice to have filtering code not imported directly.\n\nexport type ImageSource =\n | HTMLImageElement\n | HTMLVideoElement\n | HTMLCanvasElement;\n\ninterface UniqueImageProps {\n srcFromAttribute: boolean;\n minimumScaleTrigger: number;\n cropX: number;\n cropY: number;\n imageSmoothing: boolean;\n filters: BaseFilter>[];\n resizeFilter?: Resize;\n}\n\nexport const imageDefaultValues: Partial> = {\n strokeWidth: 0,\n srcFromAttribute: false,\n minimumScaleTrigger: 0.5,\n cropX: 0,\n cropY: 0,\n imageSmoothing: true,\n};\n\nexport interface SerializedImageProps extends SerializedObjectProps {\n src: string;\n crossOrigin: TCrossOrigin;\n filters: any[];\n resizeFilter?: ResizeSerializedProps;\n cropX: number;\n cropY: number;\n}\n\nexport interface ImageProps extends FabricObjectProps, UniqueImageProps {}\n\nconst IMAGE_PROPS = ['cropX', 'cropY'] as const;\n\n/**\n * @see {@link http://fabric5.fabricjs.com/fabric-intro-part-1#images}\n */\nexport class FabricImage<\n Props extends TOptions = Partial,\n SProps extends SerializedImageProps = SerializedImageProps,\n EventSpec extends ObjectEvents = ObjectEvents,\n >\n extends FabricObject\n implements ImageProps\n{\n /**\n * When calling {@link FabricImage.getSrc}, return value from element src with `element.getAttribute('src')`.\n * This allows for relative urls as image src.\n * @since 2.7.0\n * @type Boolean\n * @default false\n */\n declare srcFromAttribute: boolean;\n\n /**\n * private\n * contains last value of scaleX to detect\n * if the Image got resized after the last Render\n * @type Number\n */\n protected _lastScaleX = 1;\n\n /**\n * private\n * contains last value of scaleY to detect\n * if the Image got resized after the last Render\n * @type Number\n */\n protected _lastScaleY = 1;\n\n /**\n * private\n * contains last value of scaling applied by the apply filter chain\n * @type Number\n */\n protected _filterScalingX = 1;\n\n /**\n * private\n * contains last value of scaling applied by the apply filter chain\n * @type Number\n */\n protected _filterScalingY = 1;\n\n /**\n * minimum scale factor under which any resizeFilter is triggered to resize the image\n * 0 will disable the automatic resize. 1 will trigger automatically always.\n * number bigger than 1 are not implemented yet.\n * @type Number\n */\n declare minimumScaleTrigger: number;\n\n /**\n * key used to retrieve the texture representing this image\n * @since 2.0.0\n * @type String\n */\n declare cacheKey: string;\n\n /**\n * Image crop in pixels from original image size.\n * @since 2.0.0\n * @type Number\n */\n declare cropX: number;\n\n /**\n * Image crop in pixels from original image size.\n * @since 2.0.0\n * @type Number\n */\n declare cropY: number;\n\n /**\n * Indicates whether this canvas will use image smoothing when painting this image.\n * Also influence if the cacheCanvas for this image uses imageSmoothing\n * @since 4.0.0-beta.11\n * @type Boolean\n */\n declare imageSmoothing: boolean;\n\n declare preserveAspectRatio: string;\n\n declare protected src: string;\n\n declare filters: BaseFilter>[];\n declare resizeFilter: Resize;\n\n declare _element: ImageSource;\n declare _filteredEl?: HTMLCanvasElement;\n declare _originalElement: ImageSource;\n\n static type = 'Image';\n\n static cacheProperties = [...cacheProperties, ...IMAGE_PROPS];\n\n static ownDefaults = imageDefaultValues;\n\n static getDefaults(): Record {\n return {\n ...super.getDefaults(),\n ...FabricImage.ownDefaults,\n };\n }\n /**\n * Constructor\n * Image can be initialized with any canvas drawable or a string.\n * The string should be a url and will be loaded as an image.\n * Canvas and Image element work out of the box, while videos require extra code to work.\n * Please check video element events for seeking.\n * @param {ImageSource | string} element Image element\n * @param {Object} [options] Options object\n */\n constructor(elementId: string, options?: Props);\n constructor(element: ImageSource, options?: Props);\n constructor(arg0: ImageSource | string, options?: Props) {\n super();\n this.filters = [];\n Object.assign(this, FabricImage.ownDefaults);\n this.setOptions(options);\n this.cacheKey = `texture${uid()}`;\n this.setElement(\n typeof arg0 === 'string'\n ? ((\n (this.canvas && getDocumentFromElement(this.canvas.getElement())) ||\n getFabricDocument()\n ).getElementById(arg0) as ImageSource)\n : arg0,\n options,\n );\n }\n\n /**\n * Returns image element which this instance if based on\n */\n getElement() {\n return this._element;\n }\n\n /**\n * Sets image element for this instance to a specified one.\n * If filters defined they are applied to new image.\n * You might need to call `canvas.renderAll` and `object.setCoords` after replacing, to render new image and update controls area.\n * @param {HTMLImageElement} element\n * @param {Partial} [size] Options object\n */\n setElement(element: ImageSource, size: Partial = {}) {\n this.removeTexture(this.cacheKey);\n this.removeTexture(`${this.cacheKey}_filtered`);\n this._element = element;\n this._originalElement = element;\n this._setWidthHeight(size);\n if (this.filters.length !== 0) {\n this.applyFilters();\n }\n // resizeFilters work on the already filtered copy.\n // we need to apply resizeFilters AFTER normal filters.\n // applyResizeFilters is run more often than normal filters\n // and is triggered by user interactions rather than dev code\n if (this.resizeFilter) {\n this.applyResizeFilters();\n }\n }\n\n /**\n * Delete a single texture if in webgl mode\n */\n removeTexture(key: string) {\n const backend = getFilterBackend(false);\n if (backend instanceof WebGLFilterBackend) {\n backend.evictCachesForKey(key);\n }\n }\n\n /**\n * Delete textures, reference to elements and eventually JSDOM cleanup\n */\n dispose() {\n super.dispose();\n this.removeTexture(this.cacheKey);\n this.removeTexture(`${this.cacheKey}_filtered`);\n this._cacheContext = null;\n (\n ['_originalElement', '_element', '_filteredEl', '_cacheCanvas'] as const\n ).forEach((elementKey) => {\n const el = this[elementKey];\n el && getEnv().dispose(el);\n // @ts-expect-error disposing\n this[elementKey] = undefined;\n });\n }\n\n /**\n * Get the crossOrigin value (of the corresponding image element)\n */\n getCrossOrigin(): string | null {\n return (\n this._originalElement &&\n ((this._originalElement as any).crossOrigin || null)\n );\n }\n\n /**\n * Returns original size of an image\n */\n getOriginalSize() {\n const element = this.getElement() as any;\n if (!element) {\n return {\n width: 0,\n height: 0,\n };\n }\n return {\n width: element.naturalWidth || element.width,\n height: element.naturalHeight || element.height,\n };\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _stroke(ctx: CanvasRenderingContext2D) {\n if (!this.stroke || this.strokeWidth === 0) {\n return;\n }\n const w = this.width / 2,\n h = this.height / 2;\n ctx.beginPath();\n ctx.moveTo(-w, -h);\n ctx.lineTo(w, -h);\n ctx.lineTo(w, h);\n ctx.lineTo(-w, h);\n ctx.lineTo(-w, -h);\n ctx.closePath();\n }\n\n /**\n * Returns object representation of an instance\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} Object representation of an instance\n */\n toObject<\n T extends Omit, keyof SProps>,\n K extends keyof T = never,\n >(propertiesToInclude: K[] = []): Pick & SProps {\n const filters: Record[] = [];\n this.filters.forEach((filterObj) => {\n filterObj && filters.push(filterObj.toObject());\n });\n return {\n ...super.toObject([...IMAGE_PROPS, ...propertiesToInclude]),\n src: this.getSrc(),\n crossOrigin: this.getCrossOrigin(),\n filters,\n ...(this.resizeFilter\n ? { resizeFilter: this.resizeFilter.toObject() }\n : {}),\n };\n }\n\n /**\n * Returns true if an image has crop applied, inspecting values of cropX,cropY,width,height.\n * @return {Boolean}\n */\n hasCrop() {\n return (\n !!this.cropX ||\n !!this.cropY ||\n this.width < this._element.width ||\n this.height < this._element.height\n );\n }\n\n /**\n * Returns svg representation of an instance\n * @return {string[]} an array of strings with the specific svg representation\n * of the instance\n */\n _toSVG() {\n const imageMarkup: string[] = [],\n element = this._element,\n x = -this.width / 2,\n y = -this.height / 2;\n let svgString: string[] = [],\n strokeSvg: string[] = [],\n clipPath = '',\n imageRendering = '';\n if (!element) {\n return [];\n }\n if (this.hasCrop()) {\n const clipPathId = uid();\n svgString.push(\n '\\n',\n '\\t\\n',\n '\\n',\n );\n clipPath = ' clip-path=\"url(#imageCrop_' + clipPathId + ')\" ';\n }\n if (!this.imageSmoothing) {\n imageRendering = ' image-rendering=\"optimizeSpeed\"';\n }\n imageMarkup.push(\n '\\t element with actual transformation, then offsetting object to the top/left\n // so that object's center aligns with container's left/top\n }\" width=\"${\n element.width || (element as HTMLImageElement).naturalWidth\n }\" height=\"${\n element.height || (element as HTMLImageElement).naturalHeight\n }\"${imageRendering}${clipPath}>\\n`,\n );\n\n if (this.stroke || this.strokeDashArray) {\n const origFill = this.fill;\n this.fill = null;\n strokeSvg = [\n `\\t\\n`,\n ];\n this.fill = origFill;\n }\n if (this.paintFirst !== FILL) {\n svgString = svgString.concat(strokeSvg, imageMarkup);\n } else {\n svgString = svgString.concat(imageMarkup, strokeSvg);\n }\n return svgString;\n }\n\n /**\n * Returns source of an image\n * @param {Boolean} filtered indicates if the src is needed for svg\n * @return {String} Source of an image\n */\n getSrc(filtered?: boolean): string {\n const element = filtered ? this._element : this._originalElement;\n if (element) {\n if ((element as HTMLCanvasElement).toDataURL) {\n return (element as HTMLCanvasElement).toDataURL();\n }\n\n if (this.srcFromAttribute) {\n return element.getAttribute('src') || '';\n } else {\n return (element as HTMLImageElement).src;\n }\n } else {\n return this.src || '';\n }\n }\n\n /**\n * Alias for getSrc\n * @param filtered\n * @deprecated\n */\n getSvgSrc(filtered?: boolean) {\n return this.getSrc(filtered);\n }\n\n /**\n * Loads and sets source of an image\\\n * **IMPORTANT**: It is recommended to abort loading tasks before calling this method to prevent race conditions and unnecessary networking\n * @param {String} src Source string (URL)\n * @param {LoadImageOptions} [options] Options object\n */\n setSrc(src: string, { crossOrigin, signal }: LoadImageOptions = {}) {\n return loadImage(src, { crossOrigin, signal }).then((img) => {\n typeof crossOrigin !== 'undefined' && this.set({ crossOrigin });\n this.setElement(img);\n });\n }\n\n /**\n * Returns string representation of an instance\n * @return {String} String representation of an instance\n */\n toString() {\n return `#`;\n }\n\n applyResizeFilters() {\n const filter = this.resizeFilter,\n minimumScale = this.minimumScaleTrigger,\n objectScale = this.getTotalObjectScaling(),\n scaleX = objectScale.x,\n scaleY = objectScale.y,\n elementToFilter = this._filteredEl || this._originalElement;\n if (this.group) {\n this.set('dirty', true);\n }\n if (!filter || (scaleX > minimumScale && scaleY > minimumScale)) {\n this._element = elementToFilter;\n this._filterScalingX = 1;\n this._filterScalingY = 1;\n this._lastScaleX = scaleX;\n this._lastScaleY = scaleY;\n return;\n }\n const canvasEl = createCanvasElementFor(elementToFilter),\n { width, height } = elementToFilter;\n this._element = canvasEl;\n this._lastScaleX = filter.scaleX = scaleX;\n this._lastScaleY = filter.scaleY = scaleY;\n getFilterBackend().applyFilters(\n [filter],\n elementToFilter,\n width,\n height,\n this._element,\n );\n this._filterScalingX = canvasEl.width / this._originalElement.width;\n this._filterScalingY = canvasEl.height / this._originalElement.height;\n }\n\n /**\n * Applies filters assigned to this image (from \"filters\" array) or from filter param\n * @param {Array} filters to be applied\n * @param {Boolean} forResizing specify if the filter operation is a resize operation\n */\n applyFilters(\n filters: BaseFilter>[] = this.filters || [],\n ) {\n filters = filters.filter((filter) => filter && !filter.isNeutralState());\n this.set('dirty', true);\n\n // needs to clear out or WEBGL will not resize correctly\n this.removeTexture(`${this.cacheKey}_filtered`);\n\n if (filters.length === 0) {\n this._element = this._originalElement;\n // this is unsafe and needs to be rethinkend\n this._filteredEl = undefined;\n this._filterScalingX = 1;\n this._filterScalingY = 1;\n return;\n }\n\n const imgElement = this._originalElement,\n sourceWidth =\n (imgElement as HTMLImageElement).naturalWidth || imgElement.width,\n sourceHeight =\n (imgElement as HTMLImageElement).naturalHeight || imgElement.height;\n\n if (this._element === this._originalElement) {\n // if the _element a reference to _originalElement\n // we need to create a new element to host the filtered pixels\n const canvasEl = createCanvasElementFor({\n width: sourceWidth,\n height: sourceHeight,\n });\n this._element = canvasEl;\n this._filteredEl = canvasEl;\n } else if (this._filteredEl) {\n // if the _element is it own element,\n // and we also have a _filteredEl, then we clean up _filteredEl\n // and we assign it to _element.\n // in this way we invalidate the eventual old resize filtered element\n this._element = this._filteredEl;\n this._filteredEl\n .getContext('2d')!\n .clearRect(0, 0, sourceWidth, sourceHeight);\n // we also need to resize again at next renderAll, so remove saved _lastScaleX/Y\n this._lastScaleX = 1;\n this._lastScaleY = 1;\n }\n getFilterBackend().applyFilters(\n filters,\n this._originalElement,\n sourceWidth,\n sourceHeight,\n this._element as HTMLCanvasElement,\n this.cacheKey,\n );\n if (\n this._originalElement.width !== this._element.width ||\n this._originalElement.height !== this._element.height\n ) {\n this._filterScalingX = this._element.width / this._originalElement.width;\n this._filterScalingY =\n this._element.height / this._originalElement.height;\n }\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _render(ctx: CanvasRenderingContext2D) {\n ctx.imageSmoothingEnabled = this.imageSmoothing;\n if (this.isMoving !== true && this.resizeFilter && this._needsResize()) {\n this.applyResizeFilters();\n }\n this._stroke(ctx);\n this._renderPaintInOrder(ctx);\n }\n\n /**\n * Paint the cached copy of the object on the target context.\n * it will set the imageSmoothing for the draw operation\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n drawCacheOnCanvas(\n this: TCachedFabricObject,\n ctx: CanvasRenderingContext2D,\n ) {\n ctx.imageSmoothingEnabled = this.imageSmoothing;\n super.drawCacheOnCanvas(ctx);\n }\n\n /**\n * Decide if the FabricImage should cache or not. Create its own cache level\n * needsItsOwnCache should be used when the object drawing method requires\n * a cache step.\n * Generally you do not cache objects in groups because the group outside is cached.\n * This is the special Image version where we would like to avoid caching where possible.\n * Essentially images do not benefit from caching. They may require caching, and in that\n * case we do it. Also caching an image usually ends in a loss of details.\n * A full performance audit should be done.\n * @return {Boolean}\n */\n shouldCache() {\n return this.needsItsOwnCache();\n }\n\n _renderFill(ctx: CanvasRenderingContext2D) {\n const elementToDraw = this._element;\n if (!elementToDraw) {\n return;\n }\n const scaleX = this._filterScalingX,\n scaleY = this._filterScalingY,\n w = this.width,\n h = this.height,\n // crop values cannot be lesser than 0.\n cropX = Math.max(this.cropX, 0),\n cropY = Math.max(this.cropY, 0),\n elWidth =\n (elementToDraw as HTMLImageElement).naturalWidth || elementToDraw.width,\n elHeight =\n (elementToDraw as HTMLImageElement).naturalHeight ||\n elementToDraw.height,\n sX = cropX * scaleX,\n sY = cropY * scaleY,\n // the width height cannot exceed element width/height, starting from the crop offset.\n sW = Math.min(w * scaleX, elWidth - sX),\n sH = Math.min(h * scaleY, elHeight - sY),\n x = -w / 2,\n y = -h / 2,\n maxDestW = Math.min(w, elWidth / scaleX - cropX),\n maxDestH = Math.min(h, elHeight / scaleY - cropY);\n\n elementToDraw &&\n ctx.drawImage(elementToDraw, sX, sY, sW, sH, x, y, maxDestW, maxDestH);\n }\n\n /**\n * needed to check if image needs resize\n * @private\n */\n _needsResize() {\n const scale = this.getTotalObjectScaling();\n return scale.x !== this._lastScaleX || scale.y !== this._lastScaleY;\n }\n\n /**\n * @private\n * @deprecated unused\n */\n _resetWidthHeight() {\n this.set(this.getOriginalSize());\n }\n\n /**\n * @private\n * Set the width and the height of the image object, using the element or the\n * options.\n */\n _setWidthHeight({ width, height }: Partial = {}) {\n const size = this.getOriginalSize();\n this.width = width || size.width;\n this.height = height || size.height;\n }\n\n /**\n * Calculate offset for center and scale factor for the image in order to respect\n * the preserveAspectRatio attribute\n * @private\n */\n parsePreserveAspectRatioAttribute() {\n const pAR = parsePreserveAspectRatioAttribute(\n this.preserveAspectRatio || '',\n ),\n pWidth = this.width,\n pHeight = this.height,\n parsedAttributes = { width: pWidth, height: pHeight };\n let rWidth = this._element.width,\n rHeight = this._element.height,\n scaleX = 1,\n scaleY = 1,\n offsetLeft = 0,\n offsetTop = 0,\n cropX = 0,\n cropY = 0,\n offset;\n\n if (pAR && (pAR.alignX !== NONE || pAR.alignY !== NONE)) {\n if (pAR.meetOrSlice === 'meet') {\n scaleX = scaleY = findScaleToFit(this._element, parsedAttributes);\n offset = (pWidth - rWidth * scaleX) / 2;\n if (pAR.alignX === 'Min') {\n offsetLeft = -offset;\n }\n if (pAR.alignX === 'Max') {\n offsetLeft = offset;\n }\n offset = (pHeight - rHeight * scaleY) / 2;\n if (pAR.alignY === 'Min') {\n offsetTop = -offset;\n }\n if (pAR.alignY === 'Max') {\n offsetTop = offset;\n }\n }\n if (pAR.meetOrSlice === 'slice') {\n scaleX = scaleY = findScaleToCover(this._element, parsedAttributes);\n offset = rWidth - pWidth / scaleX;\n if (pAR.alignX === 'Mid') {\n cropX = offset / 2;\n }\n if (pAR.alignX === 'Max') {\n cropX = offset;\n }\n offset = rHeight - pHeight / scaleY;\n if (pAR.alignY === 'Mid') {\n cropY = offset / 2;\n }\n if (pAR.alignY === 'Max') {\n cropY = offset;\n }\n rWidth = pWidth / scaleX;\n rHeight = pHeight / scaleY;\n }\n } else {\n scaleX = pWidth / rWidth;\n scaleY = pHeight / rHeight;\n }\n return {\n width: rWidth,\n height: rHeight,\n scaleX,\n scaleY,\n offsetLeft,\n offsetTop,\n cropX,\n cropY,\n };\n }\n\n /**\n * List of attribute names to account for when parsing SVG element (used by {@link FabricImage.fromElement})\n * @see {@link http://www.w3.org/TR/SVG/struct.html#ImageElement}\n */\n static ATTRIBUTE_NAMES = [\n ...SHARED_ATTRIBUTES,\n 'x',\n 'y',\n 'width',\n 'height',\n 'preserveAspectRatio',\n 'xlink:href',\n 'href',\n 'crossOrigin',\n 'image-rendering',\n ];\n\n /**\n * Creates an instance of FabricImage from its object representation\n * @param {Object} object Object to create an instance from\n * @param {object} [options] Options object\n * @param {AbortSignal} [options.signal] handle aborting, see https://developer.mozilla.org/en-US/docs/Web/API/AbortController/signal\n * @returns {Promise}\n */\n static fromObject>(\n { filters: f, resizeFilter: rf, src, crossOrigin, type, ...object }: T,\n options?: Abortable,\n ) {\n return Promise.all([\n loadImage(src!, { ...options, crossOrigin }),\n f && enlivenObjects>(f, options),\n // redundant - handled by enlivenObjectEnlivables, but nicely explicit\n rf ? enlivenObjects([rf], options) : [],\n enlivenObjectEnlivables(object, options),\n ]).then(([el, filters = [], [resizeFilter], hydratedProps = {}]) => {\n return new this(el, {\n ...object,\n // TODO: passing src creates a difference between image creation and restoring from JSON\n src,\n filters,\n resizeFilter,\n ...hydratedProps,\n });\n });\n }\n\n /**\n * Creates an instance of Image from an URL string\n * @param {String} url URL to create an image from\n * @param {LoadImageOptions} [options] Options object\n * @returns {Promise}\n */\n static fromURL>(\n url: string,\n { crossOrigin = null, signal }: LoadImageOptions = {},\n imageOptions?: T,\n ): Promise {\n return loadImage(url, { crossOrigin, signal }).then(\n (img) => new this(img, imageOptions),\n );\n }\n\n /**\n * Returns {@link FabricImage} instance from an SVG element\n * @param {HTMLElement} element Element to parse\n * @param {Object} [options] Options object\n * @param {AbortSignal} [options.signal] handle aborting, see https://developer.mozilla.org/en-US/docs/Web/API/AbortController/signal\n * @param {Function} callback Callback to execute when Image object is created\n */\n static async fromElement(\n element: HTMLElement,\n options: Abortable = {},\n cssRules?: CSSRules,\n ) {\n const parsedAttributes = parseAttributes(\n element,\n this.ATTRIBUTE_NAMES,\n cssRules,\n );\n return this.fromURL(\n parsedAttributes['xlink:href'] || parsedAttributes['href'],\n options,\n parsedAttributes,\n ).catch((err) => {\n log('log', 'Unable to parse Image', err);\n return null;\n });\n }\n}\n\nclassRegistry.setClass(FabricImage);\nclassRegistry.setSVGClass(FabricImage);\n","import { svgNS } from './constants';\nimport {\n parsePreserveAspectRatioAttribute,\n parseUnit,\n} from '../util/misc/svgParsing';\nimport { svgViewBoxElementsRegEx, reViewBoxAttrValue } from './constants';\nimport { NONE } from '../constants';\n\nexport type ParsedViewboxTransform = Partial<{\n width: number;\n height: number;\n minX: number;\n minY: number;\n viewBoxWidth: number;\n viewBoxHeight: number;\n}>;\n\n/**\n * Add a element that envelop all child elements and makes the viewbox transformMatrix descend on all elements\n */\nexport function applyViewboxTransform(\n element: Element,\n): ParsedViewboxTransform {\n if (!svgViewBoxElementsRegEx.test(element.nodeName)) {\n return {};\n }\n const viewBoxAttr: string | null = element.getAttribute('viewBox');\n let scaleX = 1;\n let scaleY = 1;\n let minX = 0;\n let minY = 0;\n let matrix;\n let el;\n const widthAttr = element.getAttribute('width');\n const heightAttr = element.getAttribute('height');\n const x = element.getAttribute('x') || 0;\n const y = element.getAttribute('y') || 0;\n const goodViewbox = viewBoxAttr && reViewBoxAttrValue.test(viewBoxAttr);\n const missingViewBox = !goodViewbox;\n const missingDimAttr =\n !widthAttr || !heightAttr || widthAttr === '100%' || heightAttr === '100%';\n\n let translateMatrix = '';\n let widthDiff = 0;\n let heightDiff = 0;\n\n if (missingViewBox) {\n if (\n (x || y) &&\n element.parentNode &&\n element.parentNode.nodeName !== '#document'\n ) {\n translateMatrix =\n ' translate(' + parseUnit(x || '0') + ' ' + parseUnit(y || '0') + ') ';\n matrix = (element.getAttribute('transform') || '') + translateMatrix;\n element.setAttribute('transform', matrix);\n element.removeAttribute('x');\n element.removeAttribute('y');\n }\n }\n\n if (missingViewBox && missingDimAttr) {\n return {\n width: 0,\n height: 0,\n };\n }\n\n const parsedDim: ParsedViewboxTransform = {\n width: 0,\n height: 0,\n };\n\n if (missingViewBox) {\n parsedDim.width = parseUnit(widthAttr!);\n parsedDim.height = parseUnit(heightAttr!);\n // set a transform for elements that have x y and are inner(only) SVGs\n return parsedDim;\n }\n\n const pasedViewBox = viewBoxAttr.match(reViewBoxAttrValue)!;\n minX = -parseFloat(pasedViewBox[1]);\n minY = -parseFloat(pasedViewBox[2]);\n const viewBoxWidth = parseFloat(pasedViewBox[3]);\n const viewBoxHeight = parseFloat(pasedViewBox[4]);\n parsedDim.minX = minX;\n parsedDim.minY = minY;\n parsedDim.viewBoxWidth = viewBoxWidth;\n parsedDim.viewBoxHeight = viewBoxHeight;\n if (!missingDimAttr) {\n parsedDim.width = parseUnit(widthAttr);\n parsedDim.height = parseUnit(heightAttr);\n scaleX = parsedDim.width / viewBoxWidth;\n scaleY = parsedDim.height / viewBoxHeight;\n } else {\n parsedDim.width = viewBoxWidth;\n parsedDim.height = viewBoxHeight;\n }\n\n // default is to preserve aspect ratio\n const preserveAspectRatio = parsePreserveAspectRatioAttribute(\n element.getAttribute('preserveAspectRatio') || '',\n );\n if (preserveAspectRatio.alignX !== NONE) {\n //translate all container for the effect of Mid, Min, Max\n if (preserveAspectRatio.meetOrSlice === 'meet') {\n scaleY = scaleX = scaleX > scaleY ? scaleY : scaleX;\n // calculate additional translation to move the viewbox\n }\n if (preserveAspectRatio.meetOrSlice === 'slice') {\n scaleY = scaleX = scaleX > scaleY ? scaleX : scaleY;\n // calculate additional translation to move the viewbox\n }\n widthDiff = parsedDim.width - viewBoxWidth * scaleX;\n heightDiff = parsedDim.height - viewBoxHeight * scaleX;\n if (preserveAspectRatio.alignX === 'Mid') {\n widthDiff /= 2;\n }\n if (preserveAspectRatio.alignY === 'Mid') {\n heightDiff /= 2;\n }\n if (preserveAspectRatio.alignX === 'Min') {\n widthDiff = 0;\n }\n if (preserveAspectRatio.alignY === 'Min') {\n heightDiff = 0;\n }\n }\n\n if (\n scaleX === 1 &&\n scaleY === 1 &&\n minX === 0 &&\n minY === 0 &&\n x === 0 &&\n y === 0\n ) {\n return parsedDim;\n }\n if ((x || y) && element.parentNode!.nodeName !== '#document') {\n translateMatrix =\n ' translate(' + parseUnit(x || '0') + ' ' + parseUnit(y || '0') + ') ';\n }\n\n matrix =\n translateMatrix +\n ' matrix(' +\n scaleX +\n ' 0' +\n ' 0 ' +\n scaleY +\n ' ' +\n (minX * scaleX + widthDiff) +\n ' ' +\n (minY * scaleY + heightDiff) +\n ') ';\n // seems unused.\n // parsedDim.viewboxTransform = parseTransformAttribute(matrix);\n if (element.nodeName === 'svg') {\n el = element.ownerDocument.createElementNS(svgNS, 'g');\n // element.firstChild != null\n while (element.firstChild) {\n el.appendChild(element.firstChild);\n }\n element.appendChild(el);\n } else {\n el = element;\n el.removeAttribute('x');\n el.removeAttribute('y');\n matrix = el.getAttribute('transform') + matrix;\n }\n el.setAttribute('transform', matrix);\n return parsedDim;\n}\n","export const getTagName = (node: Element) => node.tagName.replace('svg:', '');\n","import { svgInvalidAncestors } from './constants';\nimport { getSvgRegex } from './getSvgRegex';\nimport { getTagName } from './getTagName';\n\nconst svgInvalidAncestorsRegEx = getSvgRegex(svgInvalidAncestors);\n\nexport function hasInvalidAncestor(element: Element) {\n let _element: Element | null = element;\n while (_element && (_element = _element.parentElement)) {\n if (\n _element &&\n _element.nodeName &&\n svgInvalidAncestorsRegEx.test(getTagName(_element)) &&\n !_element.getAttribute('instantiated_by_use')\n ) {\n return true;\n }\n }\n return false;\n}\n","export function getMultipleNodes(\n doc: Document,\n nodeNames: string[],\n): Element[] {\n let nodeName,\n nodeArray: Element[] = [],\n nodeList,\n i,\n len;\n for (i = 0, len = nodeNames.length; i < len; i++) {\n nodeName = nodeNames[i];\n nodeList = doc.getElementsByTagNameNS(\n 'http://www.w3.org/2000/svg',\n nodeName,\n );\n nodeArray = nodeArray.concat(Array.from(nodeList));\n }\n return nodeArray;\n}\n","import { svgNS } from './constants';\nimport { getMultipleNodes } from './getMultipleNodes';\nimport { applyViewboxTransform } from './applyViewboxTransform';\nimport { parseStyleString } from './parseStyleString';\n\nexport function parseUseDirectives(doc: Document) {\n const nodelist = getMultipleNodes(doc, ['use', 'svg:use']);\n const skipAttributes = ['x', 'y', 'xlink:href', 'href', 'transform'];\n\n for (const useElement of nodelist) {\n const useAttributes: NamedNodeMap = useElement.attributes;\n\n const useAttrMap: Record = {};\n for (const attr of useAttributes) {\n attr.value && (useAttrMap[attr.name] = attr.value);\n }\n\n const xlink = (useAttrMap['xlink:href'] || useAttrMap.href || '').slice(1);\n\n if (xlink === '') {\n return;\n }\n const referencedElement = doc.getElementById(xlink);\n if (referencedElement === null) {\n // if we can't find the target of the xlink, consider this use tag bad, similar to no xlink\n return;\n }\n let clonedOriginal = referencedElement.cloneNode(true) as Element;\n\n const originalAttributes: NamedNodeMap = clonedOriginal.attributes;\n\n const originalAttrMap: Record = {};\n for (const attr of originalAttributes) {\n attr.value && (originalAttrMap[attr.name] = attr.value);\n }\n\n // Transform attribute needs to be merged in a particular way\n const { x = 0, y = 0, transform = '' } = useAttrMap;\n const currentTrans = `${transform} ${\n originalAttrMap.transform || ''\n } translate(${x}, ${y})`;\n\n applyViewboxTransform(clonedOriginal);\n\n if (/^svg$/i.test(clonedOriginal.nodeName)) {\n // if is an SVG, create a group and apply all the attributes on top of it\n const el3 = clonedOriginal.ownerDocument.createElementNS(svgNS, 'g');\n Object.entries(originalAttrMap).forEach(([name, value]) =>\n el3.setAttributeNS(svgNS, name, value),\n );\n el3.append(...clonedOriginal.childNodes);\n clonedOriginal = el3;\n }\n\n for (const attr of useAttributes) {\n if (!attr) {\n continue;\n }\n const { name, value } = attr;\n if (skipAttributes.includes(name)) {\n continue;\n }\n\n if (name === 'style') {\n // when use has a style, merge the two styles, with the ref being priority (not use)\n // priority is by feature. an attribute for fill on the original element\n // will overwrite the fill in style or attribute for tha use\n const styleRecord: Record = {};\n parseStyleString(value, styleRecord);\n // cleanup styleRecord from attributes of original\n Object.entries(originalAttrMap).forEach(([name, value]) => {\n styleRecord[name] = value;\n });\n // now we can put in the style of the original that will overwrite the original attributes\n parseStyleString(originalAttrMap.style || '', styleRecord);\n const mergedStyles = Object.entries(styleRecord)\n .map((entry) => entry.join(':'))\n .join(';');\n clonedOriginal.setAttribute(name, mergedStyles);\n } else {\n // set the attribute from use element only if the original does not have it already\n !originalAttrMap[name] && clonedOriginal.setAttribute(name, value);\n }\n }\n\n clonedOriginal.setAttribute('transform', currentTrans);\n clonedOriginal.setAttribute('instantiated_by_use', '1');\n clonedOriginal.removeAttribute('id');\n useElement.parentNode!.replaceChild(clonedOriginal, useElement);\n }\n}\n","const gradientsAttrs = [\n 'gradientTransform',\n 'x1',\n 'x2',\n 'y1',\n 'y2',\n 'gradientUnits',\n 'cx',\n 'cy',\n 'r',\n 'fx',\n 'fy',\n];\nconst xlinkAttr = 'xlink:href';\n\nexport function recursivelyParseGradientsXlink(\n doc: Document,\n gradient: Element,\n) {\n const xLink = gradient.getAttribute(xlinkAttr)?.slice(1) || '',\n referencedGradient = doc.getElementById(xLink);\n if (referencedGradient && referencedGradient.getAttribute(xlinkAttr)) {\n recursivelyParseGradientsXlink(doc, referencedGradient as Element);\n }\n if (referencedGradient) {\n gradientsAttrs.forEach((attr) => {\n const value = referencedGradient.getAttribute(attr);\n if (!gradient.hasAttribute(attr) && value) {\n gradient.setAttribute(attr, value);\n }\n });\n if (!gradient.children.length) {\n const referenceClone = referencedGradient.cloneNode(true);\n while (referenceClone.firstChild) {\n gradient.appendChild(referenceClone.firstChild);\n }\n }\n }\n gradient.removeAttribute(xlinkAttr);\n}\n","import { getMultipleNodes } from './getMultipleNodes';\nimport { recursivelyParseGradientsXlink } from './recursivelyParseGradientsXlink';\n\nconst tagArray = [\n 'linearGradient',\n 'radialGradient',\n 'svg:linearGradient',\n 'svg:radialGradient',\n];\n\n/**\n * Parses an SVG document, returning all of the gradient declarations found in it\n * @param {SVGDocument} doc SVG document to parse\n * @return {Object} Gradient definitions; key corresponds to element id, value -- to gradient definition element\n */\nexport function getGradientDefs(\n doc: Document,\n): Record {\n const elList = getMultipleNodes(doc, tagArray);\n const gradientDefs: Record = {};\n let j = elList.length;\n while (j--) {\n const el = elList[j];\n if (el.getAttribute('xlink:href')) {\n recursivelyParseGradientsXlink(doc, el);\n }\n const id = el.getAttribute('id');\n if (id) {\n gradientDefs[id] = el as SVGGradientElement;\n }\n }\n return gradientDefs;\n}\n","import type { CSSRules } from './typedefs';\n\n/**\n * Returns CSS rules for a given SVG document\n * @param {HTMLElement} doc SVG document to parse\n * @return {Object} CSS rules of this document\n */\nexport function getCSSRules(doc: Document) {\n const styles = doc.getElementsByTagName('style');\n const allRules: CSSRules = {};\n\n // very crude parsing of style contents\n for (let i = 0; i < styles.length; i++) {\n const styleContents = (styles[i].textContent || '').replace(\n // remove comments\n /\\/\\*[\\s\\S]*?\\*\\//g,\n '',\n );\n\n if (styleContents.trim() === '') {\n continue;\n }\n // recovers all the rule in this form `body { style code... }`\n // rules = styleContents.match(/[^{]*\\{[\\s\\S]*?\\}/g);\n styleContents\n .split('}')\n // remove empty rules and remove everything if we didn't split in at least 2 pieces\n .filter((rule, index, array) => array.length > 1 && rule.trim())\n // at this point we have hopefully an array of rules `body { style code... `\n .forEach((rule) => {\n // if there is more than one opening bracket and the rule starts with '@', it is likely\n // a nested at-rule like @media, @supports, @scope, etc. Ignore these as the code below\n // can not handle it.\n if (\n (rule.match(/{/g) || []).length > 1 &&\n rule.trim().startsWith('@')\n ) {\n return;\n }\n\n const match = rule.split('{'),\n ruleObj: Record = {},\n declaration = match[1].trim(),\n propertyValuePairs = declaration.split(';').filter(function (pair) {\n return pair.trim();\n });\n\n for (let j = 0; j < propertyValuePairs.length; j++) {\n const pair = propertyValuePairs[j].split(':'),\n property = pair[0].trim(),\n value = pair[1].trim();\n ruleObj[property] = value;\n }\n rule = match[0].trim();\n rule.split(',').forEach((_rule) => {\n _rule = _rule.replace(/^svg/i, '').trim();\n if (_rule === '') {\n return;\n }\n allRules[_rule] = {\n ...(allRules[_rule] || {}),\n ...ruleObj,\n };\n });\n });\n }\n return allRules;\n}\n","import { Gradient } from '../gradient/Gradient';\nimport { Group } from '../shapes/Group';\nimport { FabricImage } from '../shapes/Image';\nimport { classRegistry } from '../ClassRegistry';\nimport {\n invertTransform,\n multiplyTransformMatrices,\n qrDecompose,\n} from '../util/misc/matrix';\nimport { removeTransformMatrixForSvgParsing } from '../util/transform_matrix_removal';\nimport type { FabricObject } from '../shapes/Object/FabricObject';\nimport { Point } from '../Point';\nimport { CENTER, FILL, STROKE } from '../constants';\nimport { getGradientDefs } from './getGradientDefs';\nimport { getCSSRules } from './getCSSRules';\nimport type { LoadImageOptions } from '../util';\nimport type { CSSRules, TSvgReviverCallback } from './typedefs';\nimport type { ParsedViewboxTransform } from './applyViewboxTransform';\nimport type { SVGOptions } from '../gradient';\nimport { getTagName } from './getTagName';\nimport { parseTransformAttribute } from './parseTransformAttribute';\n\nconst findTag = (el: Element) =>\n classRegistry.getSVGClass(getTagName(el).toLowerCase());\n\ntype StorageType = {\n fill: SVGGradientElement;\n stroke: SVGGradientElement;\n clipPath: Element[];\n};\n\ntype NotParsedFabricObject = FabricObject & {\n fill: string;\n stroke: string;\n clipPath?: string;\n clipRule?: CanvasFillRule;\n};\n\nexport class ElementsParser {\n declare elements: Element[];\n declare options: LoadImageOptions & ParsedViewboxTransform;\n declare reviver?: TSvgReviverCallback;\n declare regexUrl: RegExp;\n declare doc: Document;\n declare clipPaths: Record;\n declare gradientDefs: Record;\n declare cssRules: CSSRules;\n\n constructor(\n elements: Element[],\n options: LoadImageOptions & ParsedViewboxTransform,\n reviver: TSvgReviverCallback | undefined,\n doc: Document,\n clipPaths: Record,\n ) {\n this.elements = elements;\n this.options = options;\n this.reviver = reviver;\n this.regexUrl = /^url\\(['\"]?#([^'\"]+)['\"]?\\)/g;\n this.doc = doc;\n this.clipPaths = clipPaths;\n this.gradientDefs = getGradientDefs(doc);\n this.cssRules = getCSSRules(doc);\n }\n\n parse(): Promise> {\n return Promise.all(\n this.elements.map((element) => this.createObject(element)),\n );\n }\n\n async createObject(el: Element): Promise {\n const klass = findTag(el);\n if (klass) {\n const obj: NotParsedFabricObject = await klass.fromElement(\n el,\n this.options,\n this.cssRules,\n );\n this.resolveGradient(obj, el, FILL);\n this.resolveGradient(obj, el, STROKE);\n if (obj instanceof FabricImage && obj._originalElement) {\n removeTransformMatrixForSvgParsing(\n obj,\n obj.parsePreserveAspectRatioAttribute(),\n );\n } else {\n removeTransformMatrixForSvgParsing(obj);\n }\n await this.resolveClipPath(obj, el);\n this.reviver && this.reviver(el, obj);\n return obj;\n }\n return null;\n }\n\n extractPropertyDefinition(\n obj: NotParsedFabricObject,\n property: 'fill' | 'stroke' | 'clipPath',\n storage: Record,\n ): StorageType[typeof property] | undefined {\n const value = obj[property]!,\n regex = this.regexUrl;\n if (!regex.test(value)) {\n return undefined;\n }\n // verify: can we remove the 'g' flag? and remove lastIndex changes?\n regex.lastIndex = 0;\n // we passed the regex test, so we know is not null;\n const id = regex.exec(value)![1];\n regex.lastIndex = 0;\n // @todo fix this\n return storage[id];\n }\n\n resolveGradient(\n obj: NotParsedFabricObject,\n el: Element,\n property: 'fill' | 'stroke',\n ) {\n const gradientDef = this.extractPropertyDefinition(\n obj,\n property,\n this.gradientDefs,\n ) as SVGGradientElement;\n if (gradientDef) {\n const opacityAttr = el.getAttribute(property + '-opacity');\n const gradient = Gradient.fromElement(gradientDef, obj, {\n ...this.options,\n opacity: opacityAttr,\n } as SVGOptions);\n obj.set(property, gradient);\n }\n }\n\n // TODO: resolveClipPath could be run once per clippath with minor work per object.\n // is a refactor that i m not sure is worth on this code\n async resolveClipPath(\n obj: NotParsedFabricObject,\n usingElement: Element,\n exactOwner?: Element,\n ) {\n const clipPathElements = this.extractPropertyDefinition(\n obj,\n 'clipPath',\n this.clipPaths,\n ) as Element[];\n if (clipPathElements) {\n const objTransformInv = invertTransform(obj.calcTransformMatrix());\n const clipPathTag = clipPathElements[0].parentElement!;\n let clipPathOwner = usingElement;\n while (\n !exactOwner &&\n clipPathOwner.parentElement &&\n clipPathOwner.getAttribute('clip-path') !== obj.clipPath\n ) {\n clipPathOwner = clipPathOwner.parentElement;\n }\n // move the clipPath tag as sibling to the real element that is using it\n clipPathOwner.parentElement!.appendChild(clipPathTag);\n\n // this multiplication order could be opposite.\n // but i don't have an svg to test it\n // at the first SVG that has a transform on both places and is misplaced\n // try to invert this multiplication order\n const finalTransform = parseTransformAttribute(\n `${clipPathOwner.getAttribute('transform') || ''} ${\n clipPathTag.getAttribute('originalTransform') || ''\n }`,\n );\n\n clipPathTag.setAttribute(\n 'transform',\n `matrix(${finalTransform.join(',')})`,\n );\n\n const container = await Promise.all(\n clipPathElements.map((clipPathElement) => {\n return findTag(clipPathElement)\n .fromElement(clipPathElement, this.options, this.cssRules)\n .then((enlivedClippath: NotParsedFabricObject) => {\n removeTransformMatrixForSvgParsing(enlivedClippath);\n enlivedClippath.fillRule = enlivedClippath.clipRule!;\n delete enlivedClippath.clipRule;\n return enlivedClippath;\n });\n }),\n );\n const clipPath =\n container.length === 1 ? container[0] : new Group(container);\n const gTransform = multiplyTransformMatrices(\n objTransformInv,\n clipPath.calcTransformMatrix(),\n );\n if (clipPath.clipPath) {\n await this.resolveClipPath(\n clipPath,\n clipPathOwner,\n // this is tricky.\n // it tries to differentiate from when clipPaths are inherited by outside groups\n // or when are really clipPaths referencing other clipPaths\n clipPathTag.getAttribute('clip-path') ? clipPathOwner : undefined,\n );\n }\n const { scaleX, scaleY, angle, skewX, translateX, translateY } =\n qrDecompose(gTransform);\n clipPath.set({\n flipX: false,\n flipY: false,\n });\n clipPath.set({\n scaleX,\n scaleY,\n angle,\n skewX,\n skewY: 0,\n });\n clipPath.setPositionByOrigin(\n new Point(translateX, translateY),\n CENTER,\n CENTER,\n );\n obj.clipPath = clipPath;\n } else {\n // if clip-path does not resolve to any element, delete the property.\n delete obj.clipPath;\n return;\n }\n }\n}\n","import { applyViewboxTransform } from './applyViewboxTransform';\nimport { svgValidTagNamesRegEx } from './constants';\nimport { hasInvalidAncestor } from './hasInvalidAncestor';\nimport { parseUseDirectives } from './parseUseDirectives';\nimport type { SVGParsingOutput, TSvgReviverCallback } from './typedefs';\nimport type { LoadImageOptions } from '../util/misc/objectEnlive';\nimport { ElementsParser } from './elements_parser';\nimport { log, SignalAbortedError } from '../util/internals/console';\nimport { getTagName } from './getTagName';\n\nconst isValidSvgTag = (el: Element) =>\n svgValidTagNamesRegEx.test(getTagName(el));\n\nexport const createEmptyResponse = (): SVGParsingOutput => ({\n objects: [],\n elements: [],\n options: {},\n allElements: [],\n});\n\n/**\n * Parses an SVG document, converts it to an array of corresponding fabric.* instances and passes them to a callback\n * @param {HTMLElement} doc SVG document to parse\n * @param {TSvgParsedCallback} callback Invoked when the parsing is done, with null if parsing wasn't possible with the list of svg nodes.\n * @param {TSvgReviverCallback} [reviver] Extra callback for further parsing of SVG elements, called after each fabric object has been created.\n * Takes as input the original svg element and the generated `FabricObject` as arguments. Used to inspect extra properties not parsed by fabric,\n * or extra custom manipulation\n * @param {Object} [options] Object containing options for parsing\n * @param {String} [options.crossOrigin] crossOrigin setting to use for external resources\n * @param {AbortSignal} [options.signal] handle aborting, see https://developer.mozilla.org/en-US/docs/Web/API/AbortController/signal\n * @return {SVGParsingOutput}\n * {@link SVGParsingOutput} also receives `allElements` array as the last argument. This is the full list of svg nodes available in the document.\n * You may want to use it if you are trying to regroup the objects as they were originally grouped in the SVG. ( This was the reason why it was added )\n */\nexport async function parseSVGDocument(\n doc: Document,\n reviver?: TSvgReviverCallback,\n { crossOrigin, signal }: LoadImageOptions = {},\n): Promise {\n if (signal && signal.aborted) {\n log('log', new SignalAbortedError('parseSVGDocument'));\n // this is an unhappy path, we dont care about speed\n return createEmptyResponse();\n }\n const documentElement = doc.documentElement;\n parseUseDirectives(doc);\n\n const descendants = Array.from(documentElement.getElementsByTagName('*')),\n options = {\n ...applyViewboxTransform(documentElement),\n crossOrigin,\n signal,\n };\n const elements = descendants.filter((el) => {\n applyViewboxTransform(el);\n return isValidSvgTag(el) && !hasInvalidAncestor(el); // http://www.w3.org/TR/SVG/struct.html#DefsElement\n });\n if (!elements || (elements && !elements.length)) {\n return {\n ...createEmptyResponse(),\n options,\n allElements: descendants,\n };\n }\n const localClipPaths: Record = {};\n descendants\n .filter((el) => getTagName(el) === 'clipPath')\n .forEach((el) => {\n el.setAttribute('originalTransform', el.getAttribute('transform') || '');\n const id = el.getAttribute('id')!;\n localClipPaths[id] = Array.from(el.getElementsByTagName('*')).filter(\n (el) => isValidSvgTag(el),\n );\n });\n\n // Precedence of rules: style > class > attribute\n const elementParser = new ElementsParser(\n elements,\n options,\n reviver,\n doc,\n localClipPaths,\n );\n\n const instances = await elementParser.parse();\n\n return {\n objects: instances,\n elements,\n options,\n allElements: descendants,\n };\n}\n","import { getFabricWindow } from '../env';\nimport type { LoadImageOptions } from '../util/misc/objectEnlive';\nimport { parseSVGDocument } from './parseSVGDocument';\nimport type { SVGParsingOutput, TSvgReviverCallback } from './typedefs';\n\n/**\n * Takes string corresponding to an SVG document, and parses it into a set of fabric objects\n * @param {String} string representing the svg\n * @param {TSvgParsedCallback} callback Invoked when the parsing is done, with null if parsing wasn't possible with the list of svg nodes.\n * {@link TSvgParsedCallback} also receives `allElements` array as the last argument. This is the full list of svg nodes available in the document.\n * You may want to use it if you are trying to regroup the objects as they were originally grouped in the SVG. ( This was the reason why it was added )\n * @param {TSvgReviverCallback} [reviver] Extra callback for further parsing of SVG elements, called after each fabric object has been created.\n * Takes as input the original svg element and the generated `FabricObject` as arguments. Used to inspect extra properties not parsed by fabric,\n * or extra custom manipulation\n * @param {Object} [options] Object containing options for parsing\n * @param {String} [options.crossOrigin] crossOrigin setting to use for external resources\n * @param {AbortSignal} [options.signal] handle aborting, see https://developer.mozilla.org/en-US/docs/Web/API/AbortController/signal\n */\nexport function loadSVGFromString(\n string: string,\n reviver?: TSvgReviverCallback,\n options?: LoadImageOptions,\n): Promise {\n const parser = new (getFabricWindow().DOMParser)(),\n // should we use `image/svg+xml` here?\n doc = parser.parseFromString(string.trim(), 'text/xml');\n return parseSVGDocument(doc, reviver, options);\n}\n","import { createEmptyResponse } from './parseSVGDocument';\nimport { loadSVGFromString } from './loadSVGFromString';\nimport type { SVGParsingOutput, TSvgReviverCallback } from './typedefs';\nimport type { LoadImageOptions } from '../util/misc/objectEnlive';\nimport { FabricError } from '../util/internals/console';\n\n/**\n * Takes url corresponding to an SVG document, and parses it into a set of fabric objects.\n * Note that SVG is fetched via fetch API, so it needs to conform to SOP (Same Origin Policy)\n * @param {string} url where the SVG is\n * @param {TSvgParsedCallback} callback Invoked when the parsing is done, with null if parsing wasn't possible with the list of svg nodes.\n * {@link TSvgParsedCallback} also receives `allElements` array as the last argument. This is the full list of svg nodes available in the document.\n * You may want to use it if you are trying to regroup the objects as they were originally grouped in the SVG. ( This was the reason why it was added )\n * @param {TSvgReviverCallback} [reviver] Extra callback for further parsing of SVG elements, called after each fabric object has been created.\n * Takes as input the original svg element and the generated `FabricObject` as arguments. Used to inspect extra properties not parsed by fabric,\n * or extra custom manipulation\n * @param {Object} [options] Object containing options for parsing\n * @param {String} [options.crossOrigin] crossOrigin setting to use for external resources\n * @param {AbortSignal} [options.signal] handle aborting, see https://developer.mozilla.org/en-US/docs/Web/API/AbortController/signal\n */\nexport function loadSVGFromURL(\n url: string,\n reviver?: TSvgReviverCallback,\n options: LoadImageOptions = {},\n): Promise {\n return fetch(url.replace(/^\\n\\s*/, '').trim(), {\n signal: options.signal,\n })\n .then((response) => {\n if (!response.ok) {\n throw new FabricError(`HTTP error! status: ${response.status}`);\n }\n return response.text();\n })\n .then((svgText) => {\n return loadSVGFromString(svgText, reviver, options);\n })\n .catch(() => {\n // this is an unhappy path, we dont care about speed\n return createEmptyResponse();\n });\n}\n","import { Point } from '../Point';\nimport { Control } from './Control';\nimport type { TMat2D } from '../typedefs';\nimport type { Polyline } from '../shapes/Polyline';\nimport { multiplyTransformMatrices } from '../util/misc/matrix';\nimport type {\n TModificationEvents,\n TPointerEvent,\n Transform,\n TransformActionHandler,\n} from '../EventTypeDefs';\nimport { wrapWithFireEvent } from './wrapWithFireEvent';\nimport { sendPointToPlane } from '../util/misc/planeChange';\nimport { MODIFY_POLY } from '../constants';\n\nconst ACTION_NAME: TModificationEvents = MODIFY_POLY;\n\ntype TTransformAnchor = Transform & { pointIndex: number };\n\n/**\n * This function locates the controls.\n * It'll be used both for drawing and for interaction.\n */\nexport const createPolyPositionHandler = (pointIndex: number) => {\n return function (dim: Point, finalMatrix: TMat2D, polyObject: Polyline) {\n const { points, pathOffset } = polyObject;\n return new Point(points[pointIndex])\n .subtract(pathOffset)\n .transform(\n multiplyTransformMatrices(\n polyObject.getViewportTransform(),\n polyObject.calcTransformMatrix(),\n ),\n );\n };\n};\n\n/**\n * This function defines what the control does.\n * It'll be called on every mouse move after a control has been clicked and is being dragged.\n * The function receives as argument the mouse event, the current transform object\n * and the current position in canvas coordinate `transform.target` is a reference to the\n * current object being transformed.\n */\nexport const polyActionHandler = (\n eventData: TPointerEvent,\n transform: TTransformAnchor,\n x: number,\n y: number,\n) => {\n const { target, pointIndex } = transform;\n const poly = target as Polyline;\n const mouseLocalPosition = sendPointToPlane(\n new Point(x, y),\n undefined,\n poly.calcOwnMatrix(),\n );\n\n poly.points[pointIndex] = mouseLocalPosition.add(poly.pathOffset);\n poly.setDimensions();\n poly.set('dirty', true);\n return true;\n};\n\n/**\n * Keep the polygon in the same position when we change its `width`/`height`/`top`/`left`.\n */\nexport const factoryPolyActionHandler = (\n pointIndex: number,\n fn: TransformActionHandler,\n) => {\n return function (\n eventData: TPointerEvent,\n transform: Transform,\n x: number,\n y: number,\n ) {\n const poly = transform.target as Polyline,\n anchorPoint = new Point(\n poly.points[(pointIndex > 0 ? pointIndex : poly.points.length) - 1],\n ),\n anchorPointInParentPlane = anchorPoint\n .subtract(poly.pathOffset)\n .transform(poly.calcOwnMatrix()),\n actionPerformed = fn(eventData, { ...transform, pointIndex }, x, y);\n\n const newAnchorPointInParentPlane = anchorPoint\n .subtract(poly.pathOffset)\n .transform(poly.calcOwnMatrix());\n\n const diff = newAnchorPointInParentPlane.subtract(anchorPointInParentPlane);\n poly.left -= diff.x;\n poly.top -= diff.y;\n\n return actionPerformed;\n };\n};\n\nexport const createPolyActionHandler = (pointIndex: number) =>\n wrapWithFireEvent(\n ACTION_NAME,\n factoryPolyActionHandler(pointIndex, polyActionHandler),\n );\n\nexport function createPolyControls(\n poly: Polyline,\n options?: Partial,\n): Record;\nexport function createPolyControls(\n numOfControls: number,\n options?: Partial,\n): Record;\nexport function createPolyControls(\n arg0: number | Polyline,\n options: Partial = {},\n) {\n const controls = {} as Record;\n for (\n let idx = 0;\n idx < (typeof arg0 === 'number' ? arg0 : arg0.points.length);\n idx++\n ) {\n controls[`p${idx}`] = new Control({\n actionName: ACTION_NAME,\n positionHandler: createPolyPositionHandler(idx),\n actionHandler: createPolyActionHandler(idx),\n ...options,\n });\n }\n return controls;\n}\n","import { Point } from '../Point';\nimport { Control } from './Control';\nimport type { TMat2D } from '../typedefs';\nimport type { Path } from '../shapes/Path';\nimport { multiplyTransformMatrices } from '../util/misc/matrix';\nimport type {\n TModificationEvents,\n TPointerEvent,\n Transform,\n} from '../EventTypeDefs';\nimport { sendPointToPlane } from '../util/misc/planeChange';\nimport type { TSimpleParseCommandType } from '../util/path/typedefs';\nimport type { ControlRenderingStyleOverride } from './controlRendering';\nimport { fireEvent } from './fireEvent';\nimport { commonEventInfo } from './util';\n\nconst ACTION_NAME: TModificationEvents = 'modifyPath' as const;\n\ntype TTransformAnchor = Transform;\n\nexport type PathPointControlStyle = {\n controlFill?: string;\n controlStroke?: string;\n connectionDashArray?: number[];\n};\n\nconst calcPathPointPosition = (\n pathObject: Path,\n commandIndex: number,\n pointIndex: number,\n) => {\n const { path, pathOffset } = pathObject;\n const command = path[commandIndex];\n return new Point(\n (command[pointIndex] as number) - pathOffset.x,\n (command[pointIndex + 1] as number) - pathOffset.y,\n ).transform(\n multiplyTransformMatrices(\n pathObject.getViewportTransform(),\n pathObject.calcTransformMatrix(),\n ),\n );\n};\n\nconst movePathPoint = (\n pathObject: Path,\n x: number,\n y: number,\n commandIndex: number,\n pointIndex: number,\n) => {\n const { path, pathOffset } = pathObject;\n\n const anchorCommand =\n path[(commandIndex > 0 ? commandIndex : path.length) - 1];\n const anchorPoint = new Point(\n anchorCommand[pointIndex] as number,\n anchorCommand[pointIndex + 1] as number,\n );\n\n const anchorPointInParentPlane = anchorPoint\n .subtract(pathOffset)\n .transform(pathObject.calcOwnMatrix());\n\n const mouseLocalPosition = sendPointToPlane(\n new Point(x, y),\n undefined,\n pathObject.calcOwnMatrix(),\n );\n\n path[commandIndex][pointIndex] = mouseLocalPosition.x + pathOffset.x;\n path[commandIndex][pointIndex + 1] = mouseLocalPosition.y + pathOffset.y;\n pathObject.setDimensions();\n\n const newAnchorPointInParentPlane = anchorPoint\n .subtract(pathObject.pathOffset)\n .transform(pathObject.calcOwnMatrix());\n\n const diff = newAnchorPointInParentPlane.subtract(anchorPointInParentPlane);\n pathObject.left -= diff.x;\n pathObject.top -= diff.y;\n pathObject.set('dirty', true);\n return true;\n};\n\n/**\n * This function locates the controls.\n * It'll be used both for drawing and for interaction.\n */\nfunction pathPositionHandler(\n this: PathPointControl,\n dim: Point,\n finalMatrix: TMat2D,\n pathObject: Path,\n) {\n const { commandIndex, pointIndex } = this;\n return calcPathPointPosition(pathObject, commandIndex, pointIndex);\n}\n\n/**\n * This function defines what the control does.\n * It'll be called on every mouse move after a control has been clicked and is being dragged.\n * The function receives as argument the mouse event, the current transform object\n * and the current position in canvas coordinate `transform.target` is a reference to the\n * current object being transformed.\n */\nfunction pathActionHandler(\n this: PathPointControl,\n eventData: TPointerEvent,\n transform: TTransformAnchor,\n x: number,\n y: number,\n) {\n const { target } = transform;\n const { commandIndex, pointIndex } = this;\n const actionPerformed = movePathPoint(\n target as Path,\n x,\n y,\n commandIndex,\n pointIndex,\n );\n if (actionPerformed) {\n fireEvent(this.actionName as TModificationEvents, {\n ...commonEventInfo(eventData, transform, x, y),\n commandIndex,\n pointIndex,\n });\n }\n return actionPerformed;\n}\n\nconst indexFromPrevCommand = (previousCommandType: TSimpleParseCommandType) =>\n previousCommandType === 'C' ? 5 : previousCommandType === 'Q' ? 3 : 1;\n\nclass PathPointControl extends Control {\n declare commandIndex: number;\n declare pointIndex: number;\n declare controlFill: string;\n declare controlStroke: string;\n constructor(options?: Partial) {\n super(options);\n }\n\n render(\n ctx: CanvasRenderingContext2D,\n left: number,\n top: number,\n styleOverride: ControlRenderingStyleOverride | undefined,\n fabricObject: Path,\n ) {\n const overrides: ControlRenderingStyleOverride = {\n ...styleOverride,\n cornerColor: this.controlFill,\n cornerStrokeColor: this.controlStroke,\n transparentCorners: !this.controlFill,\n };\n super.render(ctx, left, top, overrides, fabricObject);\n }\n}\n\nclass PathControlPointControl extends PathPointControl {\n declare connectionDashArray?: number[];\n declare connectToCommandIndex: number;\n declare connectToPointIndex: number;\n constructor(options?: Partial) {\n super(options);\n }\n\n render(\n this: PathControlPointControl,\n ctx: CanvasRenderingContext2D,\n left: number,\n top: number,\n styleOverride: ControlRenderingStyleOverride | undefined,\n fabricObject: Path,\n ) {\n const { path } = fabricObject;\n const {\n commandIndex,\n pointIndex,\n connectToCommandIndex,\n connectToPointIndex,\n } = this;\n ctx.save();\n ctx.strokeStyle = this.controlStroke;\n if (this.connectionDashArray) {\n ctx.setLineDash(this.connectionDashArray);\n }\n const [commandType] = path[commandIndex];\n const point = calcPathPointPosition(\n fabricObject,\n connectToCommandIndex,\n connectToPointIndex,\n );\n\n if (commandType === 'Q') {\n // one control point connects to 2 points\n const point2 = calcPathPointPosition(\n fabricObject,\n commandIndex,\n pointIndex + 2,\n );\n ctx.moveTo(point2.x, point2.y);\n ctx.lineTo(left, top);\n } else {\n ctx.moveTo(left, top);\n }\n ctx.lineTo(point.x, point.y);\n ctx.stroke();\n ctx.restore();\n\n super.render(ctx, left, top, styleOverride, fabricObject);\n }\n}\n\nconst createControl = (\n commandIndexPos: number,\n pointIndexPos: number,\n isControlPoint: boolean,\n options: Partial & {\n controlPointStyle?: PathPointControlStyle;\n pointStyle?: PathPointControlStyle;\n },\n connectToCommandIndex?: number,\n connectToPointIndex?: number,\n) =>\n new (isControlPoint ? PathControlPointControl : PathPointControl)({\n commandIndex: commandIndexPos,\n pointIndex: pointIndexPos,\n actionName: ACTION_NAME,\n positionHandler: pathPositionHandler,\n actionHandler: pathActionHandler,\n connectToCommandIndex,\n connectToPointIndex,\n ...options,\n ...(isControlPoint ? options.controlPointStyle : options.pointStyle),\n } as Partial);\n\nexport function createPathControls(\n path: Path,\n options: Partial & {\n controlPointStyle?: PathPointControlStyle;\n pointStyle?: PathPointControlStyle;\n } = {},\n): Record {\n const controls = {} as Record;\n let previousCommandType: TSimpleParseCommandType = 'M';\n path.path.forEach((command, commandIndex) => {\n const commandType = command[0];\n\n if (commandType !== 'Z') {\n controls[`c_${commandIndex}_${commandType}`] = createControl(\n commandIndex,\n command.length - 2,\n false,\n options,\n );\n }\n switch (commandType) {\n case 'C':\n controls[`c_${commandIndex}_C_CP_1`] = createControl(\n commandIndex,\n 1,\n true,\n options,\n commandIndex - 1,\n indexFromPrevCommand(previousCommandType),\n );\n controls[`c_${commandIndex}_C_CP_2`] = createControl(\n commandIndex,\n 3,\n true,\n options,\n commandIndex,\n 5,\n );\n break;\n case 'Q':\n controls[`c_${commandIndex}_Q_CP_1`] = createControl(\n commandIndex,\n 1,\n true,\n options,\n commandIndex,\n 3,\n );\n break;\n }\n previousCommandType = commandType;\n });\n return controls;\n}\n","import { getFabricWindow } from '../env';\nimport { createCanvasElement, createCanvasElementFor } from '../util/misc/dom';\nimport { WebGLFilterBackend } from './WebGLFilterBackend';\nimport type { TWebGLPipelineState, T2DPipelineState } from './typedefs';\n\nexport const isWebGLPipelineState = (\n options: TWebGLPipelineState | T2DPipelineState,\n): options is TWebGLPipelineState => {\n return (options as TWebGLPipelineState).webgl !== undefined;\n};\n\n/**\n * Pick a method to copy data from GL context to 2d canvas. In some browsers using\n * drawImage should be faster, but is also bugged for a small combination of old hardware\n * and drivers.\n * putImageData is faster than drawImage for that specific operation.\n */\nexport const isPutImageFaster = (width: number, height: number): boolean => {\n const targetCanvas = createCanvasElementFor({ width, height });\n const sourceCanvas = createCanvasElement();\n const gl = sourceCanvas.getContext('webgl')!;\n // eslint-disable-next-line no-undef\n const imageBuffer = new ArrayBuffer(width * height * 4);\n\n const testContext = {\n imageBuffer: imageBuffer,\n } as unknown as Required;\n const testPipelineState = {\n destinationWidth: width,\n destinationHeight: height,\n targetCanvas: targetCanvas,\n } as unknown as TWebGLPipelineState;\n let startTime;\n\n startTime = getFabricWindow().performance.now();\n WebGLFilterBackend.prototype.copyGLTo2D.call(\n testContext,\n gl,\n testPipelineState,\n );\n const drawImageTime = getFabricWindow().performance.now() - startTime;\n\n startTime = getFabricWindow().performance.now();\n WebGLFilterBackend.prototype.copyGLTo2DPutImageData.call(\n testContext,\n gl,\n testPipelineState,\n );\n const putImageDataTime = getFabricWindow().performance.now() - startTime;\n\n return drawImageTime > putImageDataTime;\n};\n","export const highPsourceCode = `precision highp float`;\n\nexport const identityFragmentShader = `\n ${highPsourceCode};\n varying vec2 vTexCoord;\n uniform sampler2D uTexture;\n void main() {\n gl_FragColor = texture2D(uTexture, vTexCoord);\n }`;\n\nexport const vertexSource = `\n attribute vec2 aPosition;\n varying vec2 vTexCoord;\n void main() {\n vTexCoord = aPosition;\n gl_Position = vec4(aPosition * 2.0 - 1.0, 0.0, 1.0);\n }`;\n","import { getEnv } from '../env';\nimport type {\n T2DPipelineState,\n TWebGLAttributeLocationMap,\n TWebGLPipelineState,\n TWebGLProgramCacheItem,\n TWebGLUniformLocationMap,\n} from './typedefs';\nimport { isWebGLPipelineState } from './utils';\nimport {\n highPsourceCode,\n identityFragmentShader,\n vertexSource,\n} from './shaders/baseFilter';\nimport type { Abortable } from '../typedefs';\nimport { FabricError } from '../util/internals/console';\nimport { createCanvasElementFor } from '../util/misc/dom';\n\nconst regex = new RegExp(highPsourceCode, 'g');\n\nexport class BaseFilter<\n Name extends string,\n OwnProps extends Record = object,\n SerializedProps extends Record = OwnProps,\n> {\n /**\n * Filter type\n */\n get type(): Name {\n return (this.constructor as typeof BaseFilter).type as Name;\n }\n\n /**\n * The class type. Used to identify which class this is.\n * This is used for serialization purposes and internally it can be used\n * to identify classes. As a developer you could use `instance of Class`\n * but to avoid importing all the code and blocking tree shaking we try\n * to avoid doing that.\n */\n static type = 'BaseFilter';\n\n /**\n * Contains the uniform locations for the fragment shader.\n * uStepW and uStepH are handled by the BaseFilter, each filter class\n * needs to specify all the one that are needed\n */\n static uniformLocations: string[] = [];\n\n declare static defaults: Record;\n\n /**\n * Constructor\n * @param {Object} [options] Options object\n */\n constructor({\n type,\n ...options\n }: { type?: never } & Partial & Record = {}) {\n Object.assign(\n this,\n (this.constructor as typeof BaseFilter).defaults,\n options,\n );\n }\n\n protected getFragmentSource(): string {\n return identityFragmentShader;\n }\n\n getVertexSource(): string {\n return vertexSource;\n }\n\n /**\n * Compile this filter's shader program.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context to use for shader compilation.\n * @param {String} fragmentSource fragmentShader source for compilation\n * @param {String} vertexSource vertexShader source for compilation\n */\n createProgram(\n gl: WebGLRenderingContext,\n fragmentSource: string = this.getFragmentSource(),\n vertexSource: string = this.getVertexSource(),\n ) {\n const {\n WebGLProbe: { GLPrecision = 'highp' },\n } = getEnv();\n if (GLPrecision !== 'highp') {\n fragmentSource = fragmentSource.replace(\n regex,\n highPsourceCode.replace('highp', GLPrecision),\n );\n }\n const vertexShader = gl.createShader(gl.VERTEX_SHADER);\n const fragmentShader = gl.createShader(gl.FRAGMENT_SHADER);\n const program = gl.createProgram();\n\n if (!vertexShader || !fragmentShader || !program) {\n throw new FabricError(\n 'Vertex, fragment shader or program creation error',\n );\n }\n gl.shaderSource(vertexShader, vertexSource);\n gl.compileShader(vertexShader);\n if (!gl.getShaderParameter(vertexShader, gl.COMPILE_STATUS)) {\n throw new FabricError(\n `Vertex shader compile error for ${this.type}: ${gl.getShaderInfoLog(\n vertexShader,\n )}`,\n );\n }\n\n gl.shaderSource(fragmentShader, fragmentSource);\n gl.compileShader(fragmentShader);\n if (!gl.getShaderParameter(fragmentShader, gl.COMPILE_STATUS)) {\n throw new FabricError(\n `Fragment shader compile error for ${this.type}: ${gl.getShaderInfoLog(\n fragmentShader,\n )}`,\n );\n }\n\n gl.attachShader(program, vertexShader);\n gl.attachShader(program, fragmentShader);\n gl.linkProgram(program);\n if (!gl.getProgramParameter(program, gl.LINK_STATUS)) {\n throw new FabricError(\n `Shader link error for \"${this.type}\" ${gl.getProgramInfoLog(program)}`,\n );\n }\n\n const uniformLocations = this.getUniformLocations(gl, program) || {};\n uniformLocations.uStepW = gl.getUniformLocation(program, 'uStepW');\n uniformLocations.uStepH = gl.getUniformLocation(program, 'uStepH');\n\n return {\n program,\n attributeLocations: this.getAttributeLocations(gl, program),\n uniformLocations,\n };\n }\n\n /**\n * Return a map of attribute names to WebGLAttributeLocation objects.\n *\n * @param {WebGLRenderingContext} gl The canvas context used to compile the shader program.\n * @param {WebGLShaderProgram} program The shader program from which to take attribute locations.\n * @returns {Object} A map of attribute names to attribute locations.\n */\n getAttributeLocations(\n gl: WebGLRenderingContext,\n program: WebGLProgram,\n ): TWebGLAttributeLocationMap {\n return {\n aPosition: gl.getAttribLocation(program, 'aPosition'),\n };\n }\n\n /**\n * Return a map of uniform names to WebGLUniformLocation objects.\n *\n * @param {WebGLRenderingContext} gl The canvas context used to compile the shader program.\n * @param {WebGLShaderProgram} program The shader program from which to take uniform locations.\n * @returns {Object} A map of uniform names to uniform locations.\n */\n getUniformLocations(\n gl: WebGLRenderingContext,\n program: WebGLProgram,\n ): TWebGLUniformLocationMap {\n const locations = (this.constructor as unknown as typeof BaseFilter)\n .uniformLocations;\n\n const uniformLocations: Record = {};\n for (let i = 0; i < locations.length; i++) {\n uniformLocations[locations[i]] = gl.getUniformLocation(\n program,\n locations[i],\n );\n }\n return uniformLocations;\n }\n\n /**\n * Send attribute data from this filter to its shader program on the GPU.\n *\n * @param {WebGLRenderingContext} gl The canvas context used to compile the shader program.\n * @param {Object} attributeLocations A map of shader attribute names to their locations.\n */\n sendAttributeData(\n gl: WebGLRenderingContext,\n attributeLocations: Record,\n aPositionData: Float32Array,\n ) {\n const attributeLocation = attributeLocations.aPosition;\n const buffer = gl.createBuffer();\n gl.bindBuffer(gl.ARRAY_BUFFER, buffer);\n gl.enableVertexAttribArray(attributeLocation);\n gl.vertexAttribPointer(attributeLocation, 2, gl.FLOAT, false, 0, 0);\n gl.bufferData(gl.ARRAY_BUFFER, aPositionData, gl.STATIC_DRAW);\n }\n\n _setupFrameBuffer(options: TWebGLPipelineState) {\n const gl = options.context;\n if (options.passes > 1) {\n const width = options.destinationWidth;\n const height = options.destinationHeight;\n if (options.sourceWidth !== width || options.sourceHeight !== height) {\n gl.deleteTexture(options.targetTexture);\n options.targetTexture = options.filterBackend.createTexture(\n gl,\n width,\n height,\n );\n }\n gl.framebufferTexture2D(\n gl.FRAMEBUFFER,\n gl.COLOR_ATTACHMENT0,\n gl.TEXTURE_2D,\n options.targetTexture,\n 0,\n );\n } else {\n // draw last filter on canvas and not to framebuffer.\n gl.bindFramebuffer(gl.FRAMEBUFFER, null);\n gl.finish();\n }\n }\n\n _swapTextures(options: TWebGLPipelineState) {\n options.passes--;\n options.pass++;\n const temp = options.targetTexture;\n options.targetTexture = options.sourceTexture;\n options.sourceTexture = temp;\n }\n\n /**\n * Generic isNeutral implementation for one parameter based filters.\n * Used only in image applyFilters to discard filters that will not have an effect\n * on the image\n * Other filters may need their own version ( ColorMatrix, HueRotation, gamma, ComposedFilter )\n * @param {Object} options\n **/\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n isNeutralState(options?: any): boolean {\n return false;\n }\n\n /**\n * Apply this filter to the input image data provided.\n *\n * Determines whether to use WebGL or Canvas2D based on the options.webgl flag.\n *\n * @param {Object} options\n * @param {Number} options.passes The number of filters remaining to be executed\n * @param {Boolean} options.webgl Whether to use webgl to render the filter.\n * @param {WebGLTexture} options.sourceTexture The texture setup as the source to be filtered.\n * @param {WebGLTexture} options.targetTexture The texture where filtered output should be drawn.\n * @param {WebGLRenderingContext} options.context The GL context used for rendering.\n * @param {Object} options.programCache A map of compiled shader programs, keyed by filter type.\n */\n applyTo(options: TWebGLPipelineState | T2DPipelineState) {\n if (isWebGLPipelineState(options)) {\n this._setupFrameBuffer(options);\n this.applyToWebGL(options);\n this._swapTextures(options);\n } else {\n this.applyTo2d(options);\n }\n }\n\n applyTo2d(_options: T2DPipelineState): void {\n // override by subclass\n }\n\n /**\n * Returns a string that represent the current selected shader code for the filter.\n * Used to force recompilation when parameters change or to retrieve the shader from cache\n * @type string\n **/\n getCacheKey(): string {\n return this.type;\n }\n\n /**\n * Retrieves the cached shader.\n * @param {Object} options\n * @param {WebGLRenderingContext} options.context The GL context used for rendering.\n * @param {Object} options.programCache A map of compiled shader programs, keyed by filter type.\n * @return {WebGLProgram} the compiled program shader\n */\n retrieveShader(options: TWebGLPipelineState): TWebGLProgramCacheItem {\n const key = this.getCacheKey();\n if (!options.programCache[key]) {\n options.programCache[key] = this.createProgram(options.context);\n }\n return options.programCache[key];\n }\n\n /**\n * Apply this filter using webgl.\n *\n * @param {Object} options\n * @param {Number} options.passes The number of filters remaining to be executed\n * @param {Boolean} options.webgl Whether to use webgl to render the filter.\n * @param {WebGLTexture} options.originalTexture The texture of the original input image.\n * @param {WebGLTexture} options.sourceTexture The texture setup as the source to be filtered.\n * @param {WebGLTexture} options.targetTexture The texture where filtered output should be drawn.\n * @param {WebGLRenderingContext} options.context The GL context used for rendering.\n * @param {Object} options.programCache A map of compiled shader programs, keyed by filter type.\n */\n applyToWebGL(options: TWebGLPipelineState) {\n const gl = options.context;\n const shader = this.retrieveShader(options);\n if (options.pass === 0 && options.originalTexture) {\n gl.bindTexture(gl.TEXTURE_2D, options.originalTexture);\n } else {\n gl.bindTexture(gl.TEXTURE_2D, options.sourceTexture);\n }\n gl.useProgram(shader.program);\n this.sendAttributeData(gl, shader.attributeLocations, options.aPosition);\n\n gl.uniform1f(shader.uniformLocations.uStepW, 1 / options.sourceWidth);\n gl.uniform1f(shader.uniformLocations.uStepH, 1 / options.sourceHeight);\n\n this.sendUniformData(gl, shader.uniformLocations);\n gl.viewport(0, 0, options.destinationWidth, options.destinationHeight);\n gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4);\n }\n\n bindAdditionalTexture(\n gl: WebGLRenderingContext,\n texture: WebGLTexture,\n textureUnit: number,\n ) {\n gl.activeTexture(textureUnit);\n gl.bindTexture(gl.TEXTURE_2D, texture);\n // reset active texture to 0 as usual\n gl.activeTexture(gl.TEXTURE0);\n }\n\n unbindAdditionalTexture(gl: WebGLRenderingContext, textureUnit: number) {\n gl.activeTexture(textureUnit);\n gl.bindTexture(gl.TEXTURE_2D, null);\n gl.activeTexture(gl.TEXTURE0);\n }\n\n /**\n * Send uniform data from this filter to its shader program on the GPU.\n *\n * Intended to be overridden by subclasses.\n *\n * @param {WebGLRenderingContext} _gl The canvas context used to compile the shader program.\n * @param {Object} _uniformLocations A map of shader uniform names to their locations.\n */\n sendUniformData(\n _gl: WebGLRenderingContext,\n _uniformLocations: TWebGLUniformLocationMap,\n ): void {\n // override by subclass\n }\n\n /**\n * If needed by a 2d filter, this functions can create an helper canvas to be used\n * remember that options.targetCanvas is available for use till end of chain.\n */\n createHelpLayer(options: T2DPipelineState) {\n if (!options.helpLayer) {\n const { sourceWidth, sourceHeight } = options;\n const helpLayer = createCanvasElementFor({\n width: sourceWidth,\n height: sourceHeight,\n });\n options.helpLayer = helpLayer;\n }\n }\n\n /**\n * Returns object representation of an instance\n * It will automatically export the default values of a filter,\n * stored in the static defaults property.\n * @return {Object} Object representation of an instance\n */\n toObject(): { type: Name } & SerializedProps {\n const defaultKeys = Object.keys(\n (this.constructor as typeof BaseFilter).defaults || {},\n ) as (keyof SerializedProps)[];\n\n return {\n type: this.type,\n ...defaultKeys.reduce((acc, key) => {\n acc[key] = this[\n key as keyof this\n ] as unknown as (typeof acc)[typeof key];\n return acc;\n }, {} as SerializedProps),\n };\n }\n\n /**\n * Returns a JSON representation of an instance\n * @return {Object} JSON\n */\n toJSON() {\n // delegate, not alias\n return this.toObject();\n }\n\n static async fromObject(\n { type, ...filterOptions }: Record,\n _options?: Abortable,\n ): Promise> {\n return new this(filterOptions);\n }\n}\n","export const blendColorFragmentSource = {\n multiply: 'gl_FragColor.rgb *= uColor.rgb;\\n',\n screen:\n 'gl_FragColor.rgb = 1.0 - (1.0 - gl_FragColor.rgb) * (1.0 - uColor.rgb);\\n',\n add: 'gl_FragColor.rgb += uColor.rgb;\\n',\n difference: 'gl_FragColor.rgb = abs(gl_FragColor.rgb - uColor.rgb);\\n',\n subtract: 'gl_FragColor.rgb -= uColor.rgb;\\n',\n lighten: 'gl_FragColor.rgb = max(gl_FragColor.rgb, uColor.rgb);\\n',\n darken: 'gl_FragColor.rgb = min(gl_FragColor.rgb, uColor.rgb);\\n',\n exclusion:\n 'gl_FragColor.rgb += uColor.rgb - 2.0 * (uColor.rgb * gl_FragColor.rgb);\\n',\n overlay: `\n if (uColor.r < 0.5) {\n gl_FragColor.r *= 2.0 * uColor.r;\n } else {\n gl_FragColor.r = 1.0 - 2.0 * (1.0 - gl_FragColor.r) * (1.0 - uColor.r);\n }\n if (uColor.g < 0.5) {\n gl_FragColor.g *= 2.0 * uColor.g;\n } else {\n gl_FragColor.g = 1.0 - 2.0 * (1.0 - gl_FragColor.g) * (1.0 - uColor.g);\n }\n if (uColor.b < 0.5) {\n gl_FragColor.b *= 2.0 * uColor.b;\n } else {\n gl_FragColor.b = 1.0 - 2.0 * (1.0 - gl_FragColor.b) * (1.0 - uColor.b);\n }\n `,\n tint: `\n gl_FragColor.rgb *= (1.0 - uColor.a);\n gl_FragColor.rgb += uColor.rgb;\n `,\n} as const;\n","import { Color } from '../color/Color';\nimport { BaseFilter } from './BaseFilter';\nimport type { T2DPipelineState, TWebGLUniformLocationMap } from './typedefs';\nimport { classRegistry } from '../ClassRegistry';\nimport { blendColorFragmentSource } from './shaders/blendColor';\n\nexport type TBlendMode =\n | 'multiply'\n | 'add'\n | 'difference'\n | 'screen'\n | 'subtract'\n | 'darken'\n | 'lighten'\n | 'overlay'\n | 'exclusion'\n | 'tint';\n\ntype BlendColorOwnProps = {\n color: string;\n mode: TBlendMode;\n alpha: number;\n};\n\nexport const blendColorDefaultValues: BlendColorOwnProps = {\n color: '#F95C63',\n mode: 'multiply',\n alpha: 1,\n};\n\n/**\n * Color Blend filter class\n * @example\n * const filter = new BlendColor({\n * color: '#000',\n * mode: 'multiply'\n * });\n *\n * const filter = new BlendImage({\n * image: fabricImageObject,\n * mode: 'multiply'\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n * canvas.renderAll();\n */\nexport class BlendColor extends BaseFilter<'BlendColor', BlendColorOwnProps> {\n /**\n * Color to make the blend operation with. default to a reddish color since black or white\n * gives always strong result.\n * @type String\n **/\n declare color: BlendColorOwnProps['color'];\n\n /**\n * Blend mode for the filter: one of multiply, add, difference, screen, subtract,\n * darken, lighten, overlay, exclusion, tint.\n * @type String\n **/\n declare mode: BlendColorOwnProps['mode'];\n /**\n * alpha value. represent the strength of the blend color operation.\n * @type Number\n **/\n declare alpha: BlendColorOwnProps['alpha'];\n\n static defaults = blendColorDefaultValues;\n\n static type = 'BlendColor';\n\n static uniformLocations = ['uColor'];\n\n getCacheKey() {\n return `${this.type}_${this.mode}`;\n }\n\n protected getFragmentSource(): string {\n return `\n precision highp float;\n uniform sampler2D uTexture;\n uniform vec4 uColor;\n varying vec2 vTexCoord;\n void main() {\n vec4 color = texture2D(uTexture, vTexCoord);\n gl_FragColor = color;\n if (color.a > 0.0) {\n ${blendColorFragmentSource[this.mode]}\n }\n }\n `;\n }\n\n /**\n * Apply the Blend operation to a Uint8ClampedArray representing the pixels of an image.\n *\n * @param {Object} options\n * @param {ImageData} options.imageData The Uint8ClampedArray to be filtered.\n */\n applyTo2d({ imageData: { data } }: T2DPipelineState) {\n const source = new Color(this.color).getSource();\n const alpha = this.alpha;\n const tr = source[0] * alpha;\n const tg = source[1] * alpha;\n const tb = source[2] * alpha;\n const alpha1 = 1 - alpha;\n\n for (let i = 0; i < data.length; i += 4) {\n const r = data[i];\n const g = data[i + 1];\n const b = data[i + 2];\n let oR, oG, oB;\n switch (this.mode) {\n case 'multiply':\n oR = (r * tr) / 255;\n oG = (g * tg) / 255;\n oB = (b * tb) / 255;\n break;\n case 'screen':\n oR = 255 - ((255 - r) * (255 - tr)) / 255;\n oG = 255 - ((255 - g) * (255 - tg)) / 255;\n oB = 255 - ((255 - b) * (255 - tb)) / 255;\n break;\n case 'add':\n oR = r + tr;\n oG = g + tg;\n oB = b + tb;\n break;\n case 'difference':\n oR = Math.abs(r - tr);\n oG = Math.abs(g - tg);\n oB = Math.abs(b - tb);\n break;\n case 'subtract':\n oR = r - tr;\n oG = g - tg;\n oB = b - tb;\n break;\n case 'darken':\n oR = Math.min(r, tr);\n oG = Math.min(g, tg);\n oB = Math.min(b, tb);\n break;\n case 'lighten':\n oR = Math.max(r, tr);\n oG = Math.max(g, tg);\n oB = Math.max(b, tb);\n break;\n case 'overlay':\n oR =\n tr < 128\n ? (2 * r * tr) / 255\n : 255 - (2 * (255 - r) * (255 - tr)) / 255;\n oG =\n tg < 128\n ? (2 * g * tg) / 255\n : 255 - (2 * (255 - g) * (255 - tg)) / 255;\n oB =\n tb < 128\n ? (2 * b * tb) / 255\n : 255 - (2 * (255 - b) * (255 - tb)) / 255;\n break;\n case 'exclusion':\n oR = tr + r - (2 * tr * r) / 255;\n oG = tg + g - (2 * tg * g) / 255;\n oB = tb + b - (2 * tb * b) / 255;\n break;\n case 'tint':\n oR = tr + r * alpha1;\n oG = tg + g * alpha1;\n oB = tb + b * alpha1;\n }\n data[i] = oR;\n data[i + 1] = oG;\n data[i + 2] = oB;\n }\n }\n\n /**\n * Send data from this filter to its shader program's uniforms.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n */\n sendUniformData(\n gl: WebGLRenderingContext,\n uniformLocations: TWebGLUniformLocationMap,\n ) {\n const source = new Color(this.color).getSource();\n source[0] = (this.alpha * source[0]) / 255;\n source[1] = (this.alpha * source[1]) / 255;\n source[2] = (this.alpha * source[2]) / 255;\n source[3] = this.alpha;\n gl.uniform4fv(uniformLocations.uColor, source);\n }\n}\n\nclassRegistry.setClass(BlendColor);\n","import type { TBlendImageMode } from '../BlendImage';\n\nexport const fragmentSource: Record = {\n multiply: `\n precision highp float;\n uniform sampler2D uTexture;\n uniform sampler2D uImage;\n uniform vec4 uColor;\n varying vec2 vTexCoord;\n varying vec2 vTexCoord2;\n void main() {\n vec4 color = texture2D(uTexture, vTexCoord);\n vec4 color2 = texture2D(uImage, vTexCoord2);\n color.rgba *= color2.rgba;\n gl_FragColor = color;\n }\n `,\n mask: `\n precision highp float;\n uniform sampler2D uTexture;\n uniform sampler2D uImage;\n uniform vec4 uColor;\n varying vec2 vTexCoord;\n varying vec2 vTexCoord2;\n void main() {\n vec4 color = texture2D(uTexture, vTexCoord);\n vec4 color2 = texture2D(uImage, vTexCoord2);\n color.a = color2.a;\n gl_FragColor = color;\n }\n `,\n} as const;\n\nexport const vertexSource = `\n attribute vec2 aPosition;\n varying vec2 vTexCoord;\n varying vec2 vTexCoord2;\n uniform mat3 uTransformMatrix;\n void main() {\n vTexCoord = aPosition;\n vTexCoord2 = (uTransformMatrix * vec3(aPosition, 1.0)).xy;\n gl_Position = vec4(aPosition * 2.0 - 1.0, 0.0, 1.0);\n }\n ` as const;\n","import { FabricImage } from '../shapes/Image';\nimport { createCanvasElement } from '../util/misc/dom';\nimport { BaseFilter } from './BaseFilter';\nimport type {\n T2DPipelineState,\n TWebGLPipelineState,\n TWebGLUniformLocationMap,\n} from './typedefs';\nimport type { WebGLFilterBackend } from './WebGLFilterBackend';\nimport { classRegistry } from '../ClassRegistry';\nimport { fragmentSource, vertexSource } from './shaders/blendImage';\n\nexport type TBlendImageMode = 'multiply' | 'mask';\n\ntype BlendImageOwnProps = {\n mode: TBlendImageMode;\n alpha: number;\n};\n\nexport const blendImageDefaultValues: BlendImageOwnProps = {\n mode: 'multiply',\n alpha: 1,\n};\n\n/**\n * Image Blend filter class\n * @example\n * const filter = new filters.BlendColor({\n * color: '#000',\n * mode: 'multiply'\n * });\n *\n * const filter = new BlendImage({\n * image: fabricImageObject,\n * mode: 'multiply'\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n * canvas.renderAll();\n */\nexport class BlendImage extends BaseFilter<'BlendImage', BlendImageOwnProps> {\n /**\n * Image to make the blend operation with.\n **/\n declare image: FabricImage;\n\n /**\n * Blend mode for the filter: either 'multiply' or 'mask'. 'multiply' will\n * multiply the values of each channel (R, G, B, and A) of the filter image by\n * their corresponding values in the base image. 'mask' will only look at the\n * alpha channel of the filter image, and apply those values to the base\n * image's alpha channel.\n * @type String\n **/\n declare mode: BlendImageOwnProps['mode'];\n\n /**\n * alpha value. represent the strength of the blend image operation.\n * not implemented.\n **/\n declare alpha: BlendImageOwnProps['alpha'];\n\n static type = 'BlendImage';\n\n static defaults = blendImageDefaultValues;\n\n static uniformLocations = ['uTransformMatrix', 'uImage'];\n\n getCacheKey() {\n return `${this.type}_${this.mode}`;\n }\n\n getFragmentSource(): string {\n return fragmentSource[this.mode];\n }\n\n getVertexSource(): string {\n return vertexSource;\n }\n\n applyToWebGL(options: TWebGLPipelineState) {\n const gl = options.context,\n texture = this.createTexture(options.filterBackend, this.image);\n this.bindAdditionalTexture(gl, texture!, gl.TEXTURE1);\n super.applyToWebGL(options);\n this.unbindAdditionalTexture(gl, gl.TEXTURE1);\n }\n\n createTexture(backend: WebGLFilterBackend, image: FabricImage) {\n return backend.getCachedTexture(image.cacheKey, image.getElement());\n }\n\n /**\n * Calculate a transformMatrix to adapt the image to blend over\n * @param {Object} options\n * @param {WebGLRenderingContext} options.context The GL context used for rendering.\n * @param {Object} options.programCache A map of compiled shader programs, keyed by filter type.\n */\n calculateMatrix() {\n const image = this.image,\n { width, height } = image.getElement();\n return [\n 1 / image.scaleX,\n 0,\n 0,\n 0,\n 1 / image.scaleY,\n 0,\n -image.left / width,\n -image.top / height,\n 1,\n ];\n }\n\n /**\n * Apply the Blend operation to a Uint8ClampedArray representing the pixels of an image.\n *\n * @param {Object} options\n * @param {ImageData} options.imageData The Uint8ClampedArray to be filtered.\n */\n applyTo2d({\n imageData: { data, width, height },\n filterBackend: { resources },\n }: T2DPipelineState) {\n const image = this.image;\n if (!resources.blendImage) {\n resources.blendImage = createCanvasElement();\n }\n const canvas1 = resources.blendImage;\n const context = canvas1.getContext('2d')!;\n if (canvas1.width !== width || canvas1.height !== height) {\n canvas1.width = width;\n canvas1.height = height;\n } else {\n context.clearRect(0, 0, width, height);\n }\n context.setTransform(\n image.scaleX,\n 0,\n 0,\n image.scaleY,\n image.left,\n image.top,\n );\n context.drawImage(image.getElement(), 0, 0, width, height);\n const blendData = context.getImageData(0, 0, width, height).data;\n for (let i = 0; i < data.length; i += 4) {\n const r = data[i];\n const g = data[i + 1];\n const b = data[i + 2];\n const a = data[i + 3];\n\n const tr = blendData[i];\n const tg = blendData[i + 1];\n const tb = blendData[i + 2];\n const ta = blendData[i + 3];\n\n switch (this.mode) {\n case 'multiply':\n data[i] = (r * tr) / 255;\n data[i + 1] = (g * tg) / 255;\n data[i + 2] = (b * tb) / 255;\n data[i + 3] = (a * ta) / 255;\n break;\n case 'mask':\n data[i + 3] = ta;\n break;\n }\n }\n }\n\n /**\n * Send data from this filter to its shader program's uniforms.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n */\n sendUniformData(\n gl: WebGLRenderingContext,\n uniformLocations: TWebGLUniformLocationMap,\n ) {\n const matrix = this.calculateMatrix();\n gl.uniform1i(uniformLocations.uImage, 1); // texture unit 1.\n gl.uniformMatrix3fv(uniformLocations.uTransformMatrix, false, matrix);\n }\n\n /**\n * Returns object representation of an instance\n * TODO: Handle the possibility of missing image better.\n * As of now a BlendImage filter without image can't be used with fromObject\n * @return {Object} Object representation of an instance\n */\n toObject(): {\n type: 'BlendImage';\n image: ReturnType;\n } & BlendImageOwnProps {\n return {\n ...super.toObject(),\n image: this.image && this.image.toObject(),\n };\n }\n\n /**\n * Create filter instance from an object representation\n * @param {object} object Object to create an instance from\n * @param {object} [options]\n * @param {AbortSignal} [options.signal] handle aborting image loading, see https://developer.mozilla.org/en-US/docs/Web/API/AbortController/signal\n * @returns {Promise}\n */\n static async fromObject(\n { type, image, ...filterOptions }: Record,\n options: { signal: AbortSignal },\n ): Promise> {\n return FabricImage.fromObject(image, options).then(\n (enlivedImage) => new this({ ...filterOptions, image: enlivedImage }),\n );\n }\n}\n\nclassRegistry.setClass(BlendImage);\n","export const fragmentSource = `\n precision highp float;\n uniform sampler2D uTexture;\n uniform vec2 uDelta;\n varying vec2 vTexCoord;\n const float nSamples = 15.0;\n vec3 v3offset = vec3(12.9898, 78.233, 151.7182);\n float random(vec3 scale) {\n /* use the fragment position for a different seed per-pixel */\n return fract(sin(dot(gl_FragCoord.xyz, scale)) * 43758.5453);\n }\n void main() {\n vec4 color = vec4(0.0);\n float totalC = 0.0;\n float totalA = 0.0;\n float offset = random(v3offset);\n for (float t = -nSamples; t <= nSamples; t++) {\n float percent = (t + offset - 0.5) / nSamples;\n vec4 sample = texture2D(uTexture, vTexCoord + uDelta * percent);\n float weight = 1.0 - abs(percent);\n float alpha = weight * sample.a;\n color.rgb += sample.rgb * alpha;\n color.a += alpha;\n totalA += weight;\n totalC += alpha;\n }\n gl_FragColor.rgb = color.rgb / totalC;\n gl_FragColor.a = color.a / totalA;\n }\n ` as const;\n","import { BaseFilter } from './BaseFilter';\nimport type {\n TWebGLPipelineState,\n T2DPipelineState,\n TWebGLUniformLocationMap,\n} from './typedefs';\nimport { isWebGLPipelineState } from './utils';\nimport { classRegistry } from '../ClassRegistry';\nimport { fragmentSource } from './shaders/blur';\n\ntype BlurOwnProps = {\n blur: number;\n};\n\nexport const blurDefaultValues: BlurOwnProps = {\n blur: 0,\n};\n\n/**\n * Blur filter class\n * @example\n * const filter = new Blur({\n * blur: 0.5\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n * canvas.renderAll();\n */\nexport class Blur extends BaseFilter<'Blur', BlurOwnProps> {\n /**\n * blur value, in percentage of image dimensions.\n * specific to keep the image blur constant at different resolutions\n * range between 0 and 1.\n * @type Number\n */\n declare blur: BlurOwnProps['blur'];\n\n declare horizontal: boolean;\n declare aspectRatio: number;\n\n static type = 'Blur';\n\n static defaults = blurDefaultValues;\n\n static uniformLocations = ['uDelta'];\n\n getFragmentSource(): string {\n return fragmentSource;\n }\n\n applyTo(options: TWebGLPipelineState | T2DPipelineState) {\n if (isWebGLPipelineState(options)) {\n // this aspectRatio is used to give the same blur to vertical and horizontal\n this.aspectRatio = options.sourceWidth / options.sourceHeight;\n options.passes++;\n this._setupFrameBuffer(options);\n this.horizontal = true;\n this.applyToWebGL(options);\n this._swapTextures(options);\n this._setupFrameBuffer(options);\n this.horizontal = false;\n this.applyToWebGL(options);\n this._swapTextures(options);\n } else {\n this.applyTo2d(options);\n }\n }\n\n applyTo2d({ imageData: { data, width, height } }: T2DPipelineState) {\n // this code mimic the shader for output consistency\n // it samples 31 pixels across the image over a distance that depends from the blur value.\n this.aspectRatio = width / height;\n this.horizontal = true;\n let blurValue = this.getBlurValue() * width;\n const imageData = new Uint8ClampedArray(data);\n const samples = 15;\n const bytesInRow = 4 * width;\n for (let i = 0; i < data.length; i += 4) {\n let r = 0.0,\n g = 0.0,\n b = 0.0,\n a = 0.0,\n totalA = 0;\n const minIRow = i - (i % bytesInRow);\n const maxIRow = minIRow + bytesInRow;\n // for now let's keep noise out of the way\n // let pixelOffset = 0;\n // const offset = Math.random() * 3;\n // if (offset > 2) {\n // pixelOffset = 4;\n // } else if (offset < 1) {\n // pixelOffset = -4;\n // }\n for (let j = -samples + 1; j < samples; j++) {\n const percent = j / samples;\n const distance = Math.floor(blurValue * percent) * 4;\n const weight = 1 - Math.abs(percent);\n let sampledPixel = i + distance; // + pixelOffset;\n // try to implement edge mirroring\n if (sampledPixel < minIRow) {\n sampledPixel = minIRow;\n } else if (sampledPixel > maxIRow) {\n sampledPixel = maxIRow;\n }\n const localAlpha = data[sampledPixel + 3] * weight;\n r += data[sampledPixel] * localAlpha;\n g += data[sampledPixel + 1] * localAlpha;\n b += data[sampledPixel + 2] * localAlpha;\n a += localAlpha;\n totalA += weight;\n }\n imageData[i] = r / a;\n imageData[i + 1] = g / a;\n imageData[i + 2] = b / a;\n imageData[i + 3] = a / totalA;\n }\n this.horizontal = false;\n blurValue = this.getBlurValue() * height;\n for (let i = 0; i < imageData.length; i += 4) {\n let r = 0.0,\n g = 0.0,\n b = 0.0,\n a = 0.0,\n totalA = 0;\n const minIRow = i % bytesInRow;\n const maxIRow = imageData.length - bytesInRow + minIRow;\n // for now let's keep noise out of the way\n // let pixelOffset = 0;\n // const offset = Math.random() * 3;\n // if (offset > 2) {\n // pixelOffset = bytesInRow;\n // } else if (offset < 1) {\n // pixelOffset = -bytesInRow;\n // }\n for (let j = -samples + 1; j < samples; j++) {\n const percent = j / samples;\n const distance = Math.floor(blurValue * percent) * bytesInRow;\n const weight = 1 - Math.abs(percent);\n let sampledPixel = i + distance; // + pixelOffset;\n // try to implement edge mirroring\n if (sampledPixel < minIRow) {\n sampledPixel = minIRow;\n } else if (sampledPixel > maxIRow) {\n sampledPixel = maxIRow;\n }\n const localAlpha = imageData[sampledPixel + 3] * weight;\n r += imageData[sampledPixel] * localAlpha;\n g += imageData[sampledPixel + 1] * localAlpha;\n b += imageData[sampledPixel + 2] * localAlpha;\n a += localAlpha;\n totalA += weight;\n }\n data[i] = r / a;\n data[i + 1] = g / a;\n data[i + 2] = b / a;\n data[i + 3] = a / totalA;\n }\n }\n\n /**\n * Send data from this filter to its shader program's uniforms.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n */\n sendUniformData(\n gl: WebGLRenderingContext,\n uniformLocations: TWebGLUniformLocationMap,\n ) {\n const delta = this.chooseRightDelta();\n gl.uniform2fv(uniformLocations.uDelta, delta);\n }\n\n isNeutralState() {\n return this.blur === 0;\n }\n\n getBlurValue(): number {\n let blurScale = 1;\n const { horizontal, aspectRatio } = this;\n if (horizontal) {\n if (aspectRatio > 1) {\n // image is wide, i want to shrink radius horizontal\n blurScale = 1 / aspectRatio;\n }\n } else {\n if (aspectRatio < 1) {\n // image is tall, i want to shrink radius vertical\n blurScale = aspectRatio;\n }\n }\n return blurScale * this.blur * 0.12;\n }\n\n /**\n * choose right value of image percentage to blur with\n * @returns {Array} a numeric array with delta values\n */\n chooseRightDelta() {\n const blur = this.getBlurValue();\n return this.horizontal ? [blur, 0] : [0, blur];\n }\n}\n\nclassRegistry.setClass(Blur);\n","export const fragmentSource = `\n precision highp float;\n uniform sampler2D uTexture;\n uniform float uBrightness;\n varying vec2 vTexCoord;\n void main() {\n vec4 color = texture2D(uTexture, vTexCoord);\n color.rgb += uBrightness;\n gl_FragColor = color;\n }\n`;\n","import { BaseFilter } from './BaseFilter';\nimport type { T2DPipelineState, TWebGLUniformLocationMap } from './typedefs';\nimport { classRegistry } from '../ClassRegistry';\nimport { fragmentSource } from './shaders/brightness';\n\ntype BrightnessOwnProps = {\n brightness: number;\n};\n\nexport const brightnessDefaultValues: BrightnessOwnProps = {\n brightness: 0,\n};\n\n/**\n * Brightness filter class\n * @example\n * const filter = new Brightness({\n * brightness: 0.05\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n */\nexport class Brightness extends BaseFilter<'Brightness', BrightnessOwnProps> {\n /**\n * Brightness value, from -1 to 1.\n * translated to -255 to 255 for 2d\n * 0.0039215686 is the part of 1 that get translated to 1 in 2d\n * @param {Number} brightness\n */\n declare brightness: BrightnessOwnProps['brightness'];\n\n static type = 'Brightness';\n\n static defaults = brightnessDefaultValues;\n\n static uniformLocations = ['uBrightness'];\n\n getFragmentSource() {\n return fragmentSource;\n }\n\n /**\n * Apply the Brightness operation to a Uint8ClampedArray representing the pixels of an image.\n *\n * @param {Object} options\n * @param {ImageData} options.imageData The Uint8ClampedArray to be filtered.\n */\n applyTo2d({ imageData: { data } }: T2DPipelineState) {\n const brightness = Math.round(this.brightness * 255);\n for (let i = 0; i < data.length; i += 4) {\n data[i] += brightness;\n data[i + 1] += brightness;\n data[i + 2] += brightness;\n }\n }\n\n isNeutralState() {\n return this.brightness === 0;\n }\n\n /**\n * Send data from this filter to its shader program's uniforms.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n */\n sendUniformData(\n gl: WebGLRenderingContext,\n uniformLocations: TWebGLUniformLocationMap,\n ) {\n gl.uniform1f(uniformLocations.uBrightness, this.brightness);\n }\n}\n\nclassRegistry.setClass(Brightness);\n","export const fragmentSource = `\n precision highp float;\n uniform sampler2D uTexture;\n varying vec2 vTexCoord;\n uniform mat4 uColorMatrix;\n uniform vec4 uConstants;\n void main() {\n vec4 color = texture2D(uTexture, vTexCoord);\n color *= uColorMatrix;\n color += uConstants;\n gl_FragColor = color;\n }`;\n","import { BaseFilter } from './BaseFilter';\nimport type {\n T2DPipelineState,\n TMatColorMatrix,\n TWebGLUniformLocationMap,\n} from './typedefs';\nimport { classRegistry } from '../ClassRegistry';\nimport { fragmentSource } from './shaders/colorMatrix';\n\nexport type ColorMatrixOwnProps = {\n matrix: TMatColorMatrix;\n colorsOnly: boolean;\n};\n\nexport const colorMatrixDefaultValues: ColorMatrixOwnProps = {\n matrix: [1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0],\n colorsOnly: true,\n};\n\n/**\n * Color Matrix filter class\n * @see {@link http://fabric5.fabricjs.com/image-filters|ImageFilters demo}\n * @see {@link http://phoboslab.org/log/2013/11/fast-image-filters-with-webgl demo}\n * @example Kodachrome filter\n * const filter = new ColorMatrix({\n * matrix: [\n 1.1285582396593525, -0.3967382283601348, -0.03992559172921793, 0, 63.72958762196502,\n -0.16404339962244616, 1.0835251566291304, -0.05498805115633132, 0, 24.732407896706203,\n -0.16786010706155763, -0.5603416277695248, 1.6014850761964943, 0, 35.62982807460946,\n 0, 0, 0, 1, 0\n ]\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n */\nexport class ColorMatrix<\n Name extends string = 'ColorMatrix',\n OwnProps extends object = ColorMatrixOwnProps,\n SerializedProps extends object = ColorMatrixOwnProps,\n> extends BaseFilter {\n /**\n * Colormatrix for pixels.\n * array of 20 floats. Numbers in positions 4, 9, 14, 19 loose meaning\n * outside the -1, 1 range.\n * 0.0039215686 is the part of 1 that get translated to 1 in 2d\n * @param {Array} matrix array of 20 numbers.\n */\n declare matrix: ColorMatrixOwnProps['matrix'];\n\n /**\n * Lock the colormatrix on the color part, skipping alpha, mainly for non webgl scenario\n * to save some calculation\n * @type Boolean\n * @default true\n */\n declare colorsOnly: ColorMatrixOwnProps['colorsOnly'];\n\n static type = 'ColorMatrix';\n\n static defaults = colorMatrixDefaultValues;\n\n static uniformLocations = ['uColorMatrix', 'uConstants'];\n\n getFragmentSource(): string {\n return fragmentSource;\n }\n\n /**\n * Apply the ColorMatrix operation to a Uint8Array representing the pixels of an image.\n *\n * @param {Object} options\n * @param {ImageData} options.imageData The Uint8Array to be filtered.\n */\n applyTo2d(options: T2DPipelineState) {\n const imageData = options.imageData,\n data = imageData.data,\n m = this.matrix,\n colorsOnly = this.colorsOnly;\n\n for (let i = 0; i < data.length; i += 4) {\n const r = data[i];\n const g = data[i + 1];\n const b = data[i + 2];\n\n data[i] = r * m[0] + g * m[1] + b * m[2] + m[4] * 255;\n data[i + 1] = r * m[5] + g * m[6] + b * m[7] + m[9] * 255;\n data[i + 2] = r * m[10] + g * m[11] + b * m[12] + m[14] * 255;\n if (!colorsOnly) {\n const a = data[i + 3];\n data[i] += a * m[3];\n data[i + 1] += a * m[8];\n data[i + 2] += a * m[13];\n data[i + 3] =\n r * m[15] + g * m[16] + b * m[17] + a * m[18] + m[19] * 255;\n }\n }\n }\n\n /**\n * Send data from this filter to its shader program's uniforms.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n */\n sendUniformData(\n gl: WebGLRenderingContext,\n uniformLocations: TWebGLUniformLocationMap,\n ) {\n const m = this.matrix,\n matrix = [\n m[0],\n m[1],\n m[2],\n m[3],\n m[5],\n m[6],\n m[7],\n m[8],\n m[10],\n m[11],\n m[12],\n m[13],\n m[15],\n m[16],\n m[17],\n m[18],\n ],\n constants = [m[4], m[9], m[14], m[19]];\n gl.uniformMatrix4fv(uniformLocations.uColorMatrix, false, matrix);\n gl.uniform4fv(uniformLocations.uConstants, constants);\n }\n\n toObject(): { type: Name } & SerializedProps {\n return {\n ...super.toObject(),\n matrix: [...this.matrix] as TMatColorMatrix,\n };\n }\n}\n\nclassRegistry.setClass(ColorMatrix);\n","import { ColorMatrix } from './ColorMatrix';\nimport { classRegistry } from '../ClassRegistry';\nimport type { TMatColorMatrix } from './typedefs';\n\ntype FixedFiltersOwnProps = {\n colorsOnly: boolean;\n};\n\nexport function createColorMatrixFilter(key: string, matrix: TMatColorMatrix) {\n const newClass = class extends ColorMatrix<\n typeof key,\n FixedFiltersOwnProps,\n FixedFiltersOwnProps\n > {\n static type = key;\n\n static defaults = {\n colorsOnly: false,\n matrix,\n };\n\n toObject(): { type: string } & FixedFiltersOwnProps {\n return { type: this.type, colorsOnly: this.colorsOnly };\n }\n };\n classRegistry.setClass(newClass, key);\n return newClass as typeof ColorMatrix;\n}\n\nexport const Brownie = createColorMatrixFilter(\n 'Brownie',\n [\n 0.5997, 0.34553, -0.27082, 0, 0.186, -0.0377, 0.86095, 0.15059, 0, -0.1449,\n 0.24113, -0.07441, 0.44972, 0, -0.02965, 0, 0, 0, 1, 0,\n ],\n);\n\nexport const Vintage = createColorMatrixFilter(\n 'Vintage',\n [\n 0.62793, 0.32021, -0.03965, 0, 0.03784, 0.02578, 0.64411, 0.03259, 0,\n 0.02926, 0.0466, -0.08512, 0.52416, 0, 0.02023, 0, 0, 0, 1, 0,\n ],\n);\n\nexport const Kodachrome = createColorMatrixFilter(\n 'Kodachrome',\n [\n 1.12855, -0.39673, -0.03992, 0, 0.24991, -0.16404, 1.08352, -0.05498, 0,\n 0.09698, -0.16786, -0.56034, 1.60148, 0, 0.13972, 0, 0, 0, 1, 0,\n ],\n);\n\nexport const Technicolor = createColorMatrixFilter(\n 'Technicolor',\n [\n 1.91252, -0.85453, -0.09155, 0, 0.04624, -0.30878, 1.76589, -0.10601, 0,\n -0.27589, -0.2311, -0.75018, 1.84759, 0, 0.12137, 0, 0, 0, 1, 0,\n ],\n);\n\nexport const Polaroid = createColorMatrixFilter(\n 'Polaroid',\n [\n 1.438, -0.062, -0.062, 0, 0, -0.122, 1.378, -0.122, 0, 0, -0.016, -0.016,\n 1.483, 0, 0, 0, 0, 0, 1, 0,\n ],\n);\n\nexport const Sepia = createColorMatrixFilter(\n 'Sepia',\n [\n 0.393, 0.769, 0.189, 0, 0, 0.349, 0.686, 0.168, 0, 0, 0.272, 0.534, 0.131,\n 0, 0, 0, 0, 0, 1, 0,\n ],\n);\n\nexport const BlackWhite = createColorMatrixFilter(\n 'BlackWhite',\n [\n 1.5, 1.5, 1.5, 0, -1, 1.5, 1.5, 1.5, 0, -1, 1.5, 1.5, 1.5, 0, -1, 0, 0, 0,\n 1, 0,\n ],\n);\n","import { BaseFilter } from './BaseFilter';\nimport type { T2DPipelineState, TWebGLPipelineState } from './typedefs';\nimport { isWebGLPipelineState } from './utils';\nimport { classRegistry } from '../ClassRegistry';\n\ntype ComposedOwnProps = {\n subFilters: BaseFilter[];\n};\n\ntype ComposedSerializedProps = {\n subFilters: Record[];\n};\n\n/**\n * A container class that knows how to apply a sequence of filters to an input image.\n */\nexport class Composed extends BaseFilter<\n 'Composed',\n ComposedOwnProps,\n ComposedSerializedProps\n> {\n /**\n * A non sparse array of filters to apply\n */\n declare subFilters: ComposedOwnProps['subFilters'];\n\n static type = 'Composed';\n\n constructor(\n options: { subFilters?: BaseFilter[] } & Record = {},\n ) {\n super(options);\n this.subFilters = options.subFilters || [];\n }\n\n /**\n * Apply this container's filters to the input image provided.\n *\n * @param {Object} options\n * @param {Number} options.passes The number of filters remaining to be applied.\n */\n applyTo(options: TWebGLPipelineState | T2DPipelineState) {\n if (isWebGLPipelineState(options)) {\n options.passes += this.subFilters.length - 1;\n }\n this.subFilters.forEach((filter) => {\n filter.applyTo(options);\n });\n }\n\n /**\n * Serialize this filter into JSON.\n * @returns {Object} A JSON representation of this filter.\n */\n toObject() {\n return {\n type: this.type,\n subFilters: this.subFilters.map((filter) => filter.toObject()),\n };\n }\n\n isNeutralState() {\n return !this.subFilters.some((filter) => !filter.isNeutralState());\n }\n\n /**\n * Deserialize a JSON definition of a ComposedFilter into a concrete instance.\n * @param {oject} object Object to create an instance from\n * @param {object} [options]\n * @param {AbortSignal} [options.signal] handle aborting `BlendImage` filter loading, see https://developer.mozilla.org/en-US/docs/Web/API/AbortController/signal\n * @returns {Promise}\n */\n static fromObject(\n object: Record,\n options?: { signal: AbortSignal },\n ): Promise {\n return Promise.all(\n ((object.subFilters || []) as BaseFilter[]).map((filter) =>\n classRegistry\n .getClass(filter.type)\n .fromObject(filter, options),\n ),\n ).then((enlivedFilters) => new this({ subFilters: enlivedFilters }));\n }\n}\n\nclassRegistry.setClass(Composed);\n","export const fragmentSource = `\n precision highp float;\n uniform sampler2D uTexture;\n uniform float uContrast;\n varying vec2 vTexCoord;\n void main() {\n vec4 color = texture2D(uTexture, vTexCoord);\n float contrastF = 1.015 * (uContrast + 1.0) / (1.0 * (1.015 - uContrast));\n color.rgb = contrastF * (color.rgb - 0.5) + 0.5;\n gl_FragColor = color;\n }`;\n","import { BaseFilter } from './BaseFilter';\nimport type { T2DPipelineState, TWebGLUniformLocationMap } from './typedefs';\nimport { classRegistry } from '../ClassRegistry';\nimport { fragmentSource } from './shaders/constrast';\n\ntype ContrastOwnProps = {\n contrast: number;\n};\n\nexport const contrastDefaultValues: ContrastOwnProps = {\n contrast: 0,\n};\n\n/**\n * Contrast filter class\n * @example\n * const filter = new Contrast({\n * contrast: 0.25\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n */\nexport class Contrast extends BaseFilter<'Contrast', ContrastOwnProps> {\n /**\n * contrast value, range from -1 to 1.\n * @param {Number} contrast\n * @default 0\n */\n declare contrast: ContrastOwnProps['contrast'];\n\n static type = 'Contrast';\n\n static defaults = contrastDefaultValues;\n\n static uniformLocations = ['uContrast'];\n\n getFragmentSource() {\n return fragmentSource;\n }\n\n isNeutralState() {\n return this.contrast === 0;\n }\n\n /**\n * Apply the Contrast operation to a Uint8Array representing the pixels of an image.\n *\n * @param {Object} options\n * @param {ImageData} options.imageData The Uint8Array to be filtered.\n */\n applyTo2d({ imageData: { data } }: T2DPipelineState) {\n const contrast = Math.floor(this.contrast * 255),\n contrastF = (259 * (contrast + 255)) / (255 * (259 - contrast));\n\n for (let i = 0; i < data.length; i += 4) {\n data[i] = contrastF * (data[i] - 128) + 128;\n data[i + 1] = contrastF * (data[i + 1] - 128) + 128;\n data[i + 2] = contrastF * (data[i + 2] - 128) + 128;\n }\n }\n\n /**\n * Send data from this filter to its shader program's uniforms.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n */\n sendUniformData(\n gl: WebGLRenderingContext,\n uniformLocations: TWebGLUniformLocationMap,\n ) {\n gl.uniform1f(uniformLocations.uContrast, this.contrast);\n }\n}\n\nclassRegistry.setClass(Contrast);\n","export const fragmentSource = {\n Convolute_3_1: `\n precision highp float;\n uniform sampler2D uTexture;\n uniform float uMatrix[9];\n uniform float uStepW;\n uniform float uStepH;\n varying vec2 vTexCoord;\n void main() {\n vec4 color = vec4(0, 0, 0, 0);\n for (float h = 0.0; h < 3.0; h+=1.0) {\n for (float w = 0.0; w < 3.0; w+=1.0) {\n vec2 matrixPos = vec2(uStepW * (w - 1), uStepH * (h - 1));\n color += texture2D(uTexture, vTexCoord + matrixPos) * uMatrix[int(h * 3.0 + w)];\n }\n }\n gl_FragColor = color;\n }\n `,\n Convolute_3_0: `\n precision highp float;\n uniform sampler2D uTexture;\n uniform float uMatrix[9];\n uniform float uStepW;\n uniform float uStepH;\n varying vec2 vTexCoord;\n void main() {\n vec4 color = vec4(0, 0, 0, 1);\n for (float h = 0.0; h < 3.0; h+=1.0) {\n for (float w = 0.0; w < 3.0; w+=1.0) {\n vec2 matrixPos = vec2(uStepW * (w - 1.0), uStepH * (h - 1.0));\n color.rgb += texture2D(uTexture, vTexCoord + matrixPos).rgb * uMatrix[int(h * 3.0 + w)];\n }\n }\n float alpha = texture2D(uTexture, vTexCoord).a;\n gl_FragColor = color;\n gl_FragColor.a = alpha;\n }\n `,\n Convolute_5_1: `\n precision highp float;\n uniform sampler2D uTexture;\n uniform float uMatrix[25];\n uniform float uStepW;\n uniform float uStepH;\n varying vec2 vTexCoord;\n void main() {\n vec4 color = vec4(0, 0, 0, 0);\n for (float h = 0.0; h < 5.0; h+=1.0) {\n for (float w = 0.0; w < 5.0; w+=1.0) {\n vec2 matrixPos = vec2(uStepW * (w - 2.0), uStepH * (h - 2.0));\n color += texture2D(uTexture, vTexCoord + matrixPos) * uMatrix[int(h * 5.0 + w)];\n }\n }\n gl_FragColor = color;\n }\n `,\n Convolute_5_0: `\n precision highp float;\n uniform sampler2D uTexture;\n uniform float uMatrix[25];\n uniform float uStepW;\n uniform float uStepH;\n varying vec2 vTexCoord;\n void main() {\n vec4 color = vec4(0, 0, 0, 1);\n for (float h = 0.0; h < 5.0; h+=1.0) {\n for (float w = 0.0; w < 5.0; w+=1.0) {\n vec2 matrixPos = vec2(uStepW * (w - 2.0), uStepH * (h - 2.0));\n color.rgb += texture2D(uTexture, vTexCoord + matrixPos).rgb * uMatrix[int(h * 5.0 + w)];\n }\n }\n float alpha = texture2D(uTexture, vTexCoord).a;\n gl_FragColor = color;\n gl_FragColor.a = alpha;\n }\n `,\n Convolute_7_1: `\n precision highp float;\n uniform sampler2D uTexture;\n uniform float uMatrix[49];\n uniform float uStepW;\n uniform float uStepH;\n varying vec2 vTexCoord;\n void main() {\n vec4 color = vec4(0, 0, 0, 0);\n for (float h = 0.0; h < 7.0; h+=1.0) {\n for (float w = 0.0; w < 7.0; w+=1.0) {\n vec2 matrixPos = vec2(uStepW * (w - 3.0), uStepH * (h - 3.0));\n color += texture2D(uTexture, vTexCoord + matrixPos) * uMatrix[int(h * 7.0 + w)];\n }\n }\n gl_FragColor = color;\n }\n `,\n Convolute_7_0: `\n precision highp float;\n uniform sampler2D uTexture;\n uniform float uMatrix[49];\n uniform float uStepW;\n uniform float uStepH;\n varying vec2 vTexCoord;\n void main() {\n vec4 color = vec4(0, 0, 0, 1);\n for (float h = 0.0; h < 7.0; h+=1.0) {\n for (float w = 0.0; w < 7.0; w+=1.0) {\n vec2 matrixPos = vec2(uStepW * (w - 3.0), uStepH * (h - 3.0));\n color.rgb += texture2D(uTexture, vTexCoord + matrixPos).rgb * uMatrix[int(h * 7.0 + w)];\n }\n }\n float alpha = texture2D(uTexture, vTexCoord).a;\n gl_FragColor = color;\n gl_FragColor.a = alpha;\n }\n `,\n Convolute_9_1: `\n precision highp float;\n uniform sampler2D uTexture;\n uniform float uMatrix[81];\n uniform float uStepW;\n uniform float uStepH;\n varying vec2 vTexCoord;\n void main() {\n vec4 color = vec4(0, 0, 0, 0);\n for (float h = 0.0; h < 9.0; h+=1.0) {\n for (float w = 0.0; w < 9.0; w+=1.0) {\n vec2 matrixPos = vec2(uStepW * (w - 4.0), uStepH * (h - 4.0));\n color += texture2D(uTexture, vTexCoord + matrixPos) * uMatrix[int(h * 9.0 + w)];\n }\n }\n gl_FragColor = color;\n }\n `,\n Convolute_9_0: `\n precision highp float;\n uniform sampler2D uTexture;\n uniform float uMatrix[81];\n uniform float uStepW;\n uniform float uStepH;\n varying vec2 vTexCoord;\n void main() {\n vec4 color = vec4(0, 0, 0, 1);\n for (float h = 0.0; h < 9.0; h+=1.0) {\n for (float w = 0.0; w < 9.0; w+=1.0) {\n vec2 matrixPos = vec2(uStepW * (w - 4.0), uStepH * (h - 4.0));\n color.rgb += texture2D(uTexture, vTexCoord + matrixPos).rgb * uMatrix[int(h * 9.0 + w)];\n }\n }\n float alpha = texture2D(uTexture, vTexCoord).a;\n gl_FragColor = color;\n gl_FragColor.a = alpha;\n }\n `,\n};\n","import { BaseFilter } from './BaseFilter';\nimport type { T2DPipelineState, TWebGLUniformLocationMap } from './typedefs';\nimport { classRegistry } from '../ClassRegistry';\nimport { fragmentSource } from './shaders/convolute';\n\nexport type ConvoluteOwnProps = {\n opaque: boolean;\n matrix: number[];\n};\n\nexport const convoluteDefaultValues: ConvoluteOwnProps = {\n opaque: false,\n matrix: [0, 0, 0, 0, 1, 0, 0, 0, 0],\n};\n\n/**\n * Adapted from html5rocks article\n * @example Sharpen filter\n * const filter = new Convolute({\n * matrix: [ 0, -1, 0,\n * -1, 5, -1,\n * 0, -1, 0 ]\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n * canvas.renderAll();\n * @example Blur filter\n * const filter = new Convolute({\n * matrix: [ 1/9, 1/9, 1/9,\n * 1/9, 1/9, 1/9,\n * 1/9, 1/9, 1/9 ]\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n * canvas.renderAll();\n * @example Emboss filter\n * const filter = new Convolute({\n * matrix: [ 1, 1, 1,\n * 1, 0.7, -1,\n * -1, -1, -1 ]\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n * canvas.renderAll();\n * @example Emboss filter with opaqueness\n * const filter = new Convolute({\n * opaque: true,\n * matrix: [ 1, 1, 1,\n * 1, 0.7, -1,\n * -1, -1, -1 ]\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n * canvas.renderAll();\n */\nexport class Convolute extends BaseFilter<'Convolute', ConvoluteOwnProps> {\n /*\n * Opaque value (true/false)\n */\n declare opaque: ConvoluteOwnProps['opaque'];\n\n /*\n * matrix for the filter, max 9x9\n */\n declare matrix: ConvoluteOwnProps['matrix'];\n\n static type = 'Convolute';\n\n static defaults = convoluteDefaultValues;\n\n static uniformLocations = ['uMatrix', 'uOpaque', 'uHalfSize', 'uSize'];\n\n getCacheKey() {\n return `${this.type}_${Math.sqrt(this.matrix.length)}_${\n this.opaque ? 1 : 0\n }` as keyof typeof fragmentSource;\n }\n\n getFragmentSource() {\n return fragmentSource[this.getCacheKey()];\n }\n\n /**\n * Apply the Brightness operation to a Uint8ClampedArray representing the pixels of an image.\n *\n * @param {Object} options\n * @param {ImageData} options.imageData The Uint8ClampedArray to be filtered.\n */\n applyTo2d(options: T2DPipelineState) {\n const imageData = options.imageData,\n data = imageData.data,\n weights = this.matrix,\n side = Math.round(Math.sqrt(weights.length)),\n halfSide = Math.floor(side / 2),\n sw = imageData.width,\n sh = imageData.height,\n output = options.ctx.createImageData(sw, sh),\n dst = output.data,\n // go through the destination image pixels\n alphaFac = this.opaque ? 1 : 0;\n let r, g, b, a, dstOff, scx, scy, srcOff, wt, x, y, cx, cy;\n\n for (y = 0; y < sh; y++) {\n for (x = 0; x < sw; x++) {\n dstOff = (y * sw + x) * 4;\n // calculate the weighed sum of the source image pixels that\n // fall under the convolution matrix\n r = 0;\n g = 0;\n b = 0;\n a = 0;\n\n for (cy = 0; cy < side; cy++) {\n for (cx = 0; cx < side; cx++) {\n scy = y + cy - halfSide;\n scx = x + cx - halfSide;\n\n // eslint-disable-next-line max-depth\n if (scy < 0 || scy >= sh || scx < 0 || scx >= sw) {\n continue;\n }\n\n srcOff = (scy * sw + scx) * 4;\n wt = weights[cy * side + cx];\n\n r += data[srcOff] * wt;\n g += data[srcOff + 1] * wt;\n b += data[srcOff + 2] * wt;\n // eslint-disable-next-line max-depth\n if (!alphaFac) {\n a += data[srcOff + 3] * wt;\n }\n }\n }\n dst[dstOff] = r;\n dst[dstOff + 1] = g;\n dst[dstOff + 2] = b;\n if (!alphaFac) {\n dst[dstOff + 3] = a;\n } else {\n dst[dstOff + 3] = data[dstOff + 3];\n }\n }\n }\n options.imageData = output;\n }\n\n /**\n * Send data from this filter to its shader program's uniforms.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n */\n sendUniformData(\n gl: WebGLRenderingContext,\n uniformLocations: TWebGLUniformLocationMap,\n ) {\n gl.uniform1fv(uniformLocations.uMatrix, this.matrix);\n }\n\n /**\n * Returns object representation of an instance\n * @return {Object} Object representation of an instance\n */\n toObject() {\n return {\n ...super.toObject(),\n opaque: this.opaque,\n matrix: [...this.matrix],\n };\n }\n}\n\nclassRegistry.setClass(Convolute);\n","export const fragmentSource = `\n precision highp float;\n uniform sampler2D uTexture;\n uniform vec3 uGamma;\n varying vec2 vTexCoord;\n void main() {\n vec4 color = texture2D(uTexture, vTexCoord);\n vec3 correction = (1.0 / uGamma);\n color.r = pow(color.r, correction.r);\n color.g = pow(color.g, correction.g);\n color.b = pow(color.b, correction.b);\n gl_FragColor = color;\n gl_FragColor.rgb *= color.a;\n }\n`;\n","import { BaseFilter } from './BaseFilter';\nimport { classRegistry } from '../ClassRegistry';\nimport { fragmentSource } from './shaders/gamma';\nimport type { T2DPipelineState, TWebGLUniformLocationMap } from './typedefs';\n\nconst GAMMA = 'Gamma' as const;\n\nexport type GammaInput = [number, number, number];\n\nexport type GammaOwnProps = {\n gamma: GammaInput;\n};\n\nexport const gammaDefaultValues: GammaOwnProps = {\n gamma: [1, 1, 1],\n};\n\n/**\n * Gamma filter class\n * @example\n * const filter = new Gamma({\n * gamma: [1, 0.5, 2.1]\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n */\nexport class Gamma extends BaseFilter {\n /**\n * Gamma array value, from 0.01 to 2.2.\n * @param {Array} gamma\n */\n declare gamma: GammaOwnProps['gamma'];\n declare rgbValues?: {\n r: Uint8Array;\n g: Uint8Array;\n b: Uint8Array;\n };\n\n static type = GAMMA;\n\n static defaults = gammaDefaultValues;\n\n static uniformLocations = ['uGamma'];\n\n getFragmentSource() {\n return fragmentSource;\n }\n\n constructor(options: { gamma?: GammaInput } = {}) {\n super(options);\n this.gamma =\n options.gamma ||\n ((\n this.constructor as typeof Gamma\n ).defaults.gamma.concat() as GammaInput);\n }\n\n /**\n * Apply the Gamma operation to a Uint8Array representing the pixels of an image.\n *\n * @param {Object} options\n * @param {ImageData} options.imageData The Uint8Array to be filtered.\n */\n applyTo2d({ imageData: { data } }: T2DPipelineState) {\n const gamma = this.gamma,\n rInv = 1 / gamma[0],\n gInv = 1 / gamma[1],\n bInv = 1 / gamma[2];\n\n if (!this.rgbValues) {\n this.rgbValues = {\n r: new Uint8Array(256),\n g: new Uint8Array(256),\n b: new Uint8Array(256),\n };\n }\n\n // This is an optimization - pre-compute a look-up table for each color channel\n // instead of performing these pow calls for each pixel in the image.\n const rgb = this.rgbValues;\n for (let i = 0; i < 256; i++) {\n rgb.r[i] = Math.pow(i / 255, rInv) * 255;\n rgb.g[i] = Math.pow(i / 255, gInv) * 255;\n rgb.b[i] = Math.pow(i / 255, bInv) * 255;\n }\n for (let i = 0; i < data.length; i += 4) {\n data[i] = rgb.r[data[i]];\n data[i + 1] = rgb.g[data[i + 1]];\n data[i + 2] = rgb.b[data[i + 2]];\n }\n }\n\n /**\n * Send data from this filter to its shader program's uniforms.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n */\n sendUniformData(\n gl: WebGLRenderingContext,\n uniformLocations: TWebGLUniformLocationMap,\n ) {\n gl.uniform3fv(uniformLocations.uGamma, this.gamma);\n }\n\n isNeutralState() {\n const { gamma } = this;\n return gamma[0] === 1 && gamma[1] === 1 && gamma[2] === 1;\n }\n\n toObject(): { type: typeof GAMMA; gamma: GammaInput } {\n return {\n type: GAMMA,\n gamma: this.gamma.concat() as GammaInput,\n };\n }\n}\n\nclassRegistry.setClass(Gamma);\n","import type { TGrayscaleMode } from '../Grayscale';\n\nexport const fragmentSource: Record = {\n average: `\n precision highp float;\n uniform sampler2D uTexture;\n varying vec2 vTexCoord;\n void main() {\n vec4 color = texture2D(uTexture, vTexCoord);\n float average = (color.r + color.b + color.g) / 3.0;\n gl_FragColor = vec4(average, average, average, color.a);\n }\n `,\n lightness: `\n precision highp float;\n uniform sampler2D uTexture;\n uniform int uMode;\n varying vec2 vTexCoord;\n void main() {\n vec4 col = texture2D(uTexture, vTexCoord);\n float average = (max(max(col.r, col.g),col.b) + min(min(col.r, col.g),col.b)) / 2.0;\n gl_FragColor = vec4(average, average, average, col.a);\n }\n `,\n luminosity: `\n precision highp float;\n uniform sampler2D uTexture;\n uniform int uMode;\n varying vec2 vTexCoord;\n void main() {\n vec4 col = texture2D(uTexture, vTexCoord);\n float average = 0.21 * col.r + 0.72 * col.g + 0.07 * col.b;\n gl_FragColor = vec4(average, average, average, col.a);\n }\n `,\n};\n","import { BaseFilter } from './BaseFilter';\nimport type { T2DPipelineState, TWebGLUniformLocationMap } from './typedefs';\nimport { classRegistry } from '../ClassRegistry';\nimport { fragmentSource } from './shaders/grayscale';\n\nexport type TGrayscaleMode = 'average' | 'lightness' | 'luminosity';\n\ntype GrayscaleOwnProps = {\n mode: TGrayscaleMode;\n};\n\nexport const grayscaleDefaultValues: GrayscaleOwnProps = {\n mode: 'average',\n};\n\n/**\n * Grayscale image filter class\n * @example\n * const filter = new Grayscale();\n * object.filters.push(filter);\n * object.applyFilters();\n */\nexport class Grayscale extends BaseFilter<'Grayscale', GrayscaleOwnProps> {\n declare mode: TGrayscaleMode;\n\n static type = 'Grayscale';\n\n static defaults = grayscaleDefaultValues;\n\n static uniformLocations = ['uMode'];\n\n /**\n * Apply the Grayscale operation to a Uint8Array representing the pixels of an image.\n *\n * @param {Object} options\n * @param {ImageData} options.imageData The Uint8Array to be filtered.\n */\n applyTo2d({ imageData: { data } }: T2DPipelineState) {\n for (let i = 0, value: number; i < data.length; i += 4) {\n const r = data[i];\n const g = data[i + 1];\n const b = data[i + 2];\n switch (this.mode) {\n case 'average':\n value = (r + g + b) / 3;\n break;\n case 'lightness':\n value = (Math.min(r, g, b) + Math.max(r, g, b)) / 2;\n break;\n case 'luminosity':\n value = 0.21 * r + 0.72 * g + 0.07 * b;\n break;\n }\n\n data[i + 2] = data[i + 1] = data[i] = value;\n }\n }\n\n getCacheKey() {\n return `${this.type}_${this.mode}`;\n }\n\n getFragmentSource() {\n return fragmentSource[this.mode];\n }\n\n /**\n * Send data from this filter to its shader program's uniforms.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n */\n sendUniformData(\n gl: WebGLRenderingContext,\n uniformLocations: TWebGLUniformLocationMap,\n ) {\n const mode = 1;\n gl.uniform1i(uniformLocations.uMode, mode);\n }\n\n /**\n * Grayscale filter isNeutralState implementation\n * The filter is never neutral\n * on the image\n **/\n isNeutralState() {\n return false;\n }\n}\n\nclassRegistry.setClass(Grayscale);\n","import { cos } from '../util/misc/cos';\nimport { sin } from '../util/misc/sin';\nimport {\n ColorMatrix,\n type ColorMatrixOwnProps,\n colorMatrixDefaultValues,\n} from './ColorMatrix';\nimport type { TWebGLPipelineState, T2DPipelineState } from './typedefs';\nimport { classRegistry } from '../ClassRegistry';\n\nexport type HueRotationOwnProps = ColorMatrixOwnProps & {\n rotation: number;\n};\n\nexport type HueRotationSerializedProps = {\n rotation: number;\n};\n\nexport const hueRotationDefaultValues: HueRotationOwnProps = {\n ...colorMatrixDefaultValues,\n rotation: 0,\n};\n\n/**\n * HueRotation filter class\n * @example\n * const filter = new HueRotation({\n * rotation: -0.5\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n */\nexport class HueRotation extends ColorMatrix<\n 'HueRotation',\n HueRotationOwnProps,\n HueRotationSerializedProps\n> {\n /**\n * HueRotation value, from -1 to 1.\n */\n declare rotation: HueRotationOwnProps['rotation'];\n\n static type = 'HueRotation';\n\n static defaults = hueRotationDefaultValues;\n\n calculateMatrix() {\n const rad = this.rotation * Math.PI,\n cosine = cos(rad),\n sine = sin(rad),\n aThird = 1 / 3,\n aThirdSqtSin = Math.sqrt(aThird) * sine,\n OneMinusCos = 1 - cosine;\n this.matrix = [\n cosine + OneMinusCos / 3,\n aThird * OneMinusCos - aThirdSqtSin,\n aThird * OneMinusCos + aThirdSqtSin,\n 0,\n 0,\n aThird * OneMinusCos + aThirdSqtSin,\n cosine + aThird * OneMinusCos,\n aThird * OneMinusCos - aThirdSqtSin,\n 0,\n 0,\n aThird * OneMinusCos - aThirdSqtSin,\n aThird * OneMinusCos + aThirdSqtSin,\n cosine + aThird * OneMinusCos,\n 0,\n 0,\n 0,\n 0,\n 0,\n 1,\n 0,\n ];\n }\n\n isNeutralState() {\n return this.rotation === 0;\n }\n\n applyTo(options: TWebGLPipelineState | T2DPipelineState) {\n this.calculateMatrix();\n super.applyTo(options);\n }\n\n toObject() {\n return {\n type: this.type,\n rotation: this.rotation,\n };\n }\n}\n\nclassRegistry.setClass(HueRotation);\n","export const fragmentSource = `\n precision highp float;\n uniform sampler2D uTexture;\n uniform int uInvert;\n uniform int uAlpha;\n varying vec2 vTexCoord;\n void main() {\n vec4 color = texture2D(uTexture, vTexCoord);\n if (uInvert == 1) {\n if (uAlpha == 1) {\n gl_FragColor = vec4(1.0 - color.r,1.0 -color.g,1.0 -color.b,1.0 -color.a);\n } else {\n gl_FragColor = vec4(1.0 - color.r,1.0 -color.g,1.0 -color.b,color.a);\n }\n } else {\n gl_FragColor = color;\n }\n }\n`;\n","import { BaseFilter } from './BaseFilter';\nimport type { T2DPipelineState, TWebGLUniformLocationMap } from './typedefs';\nimport { classRegistry } from '../ClassRegistry';\nimport { fragmentSource } from './shaders/invert';\n\nexport type InvertOwnProps = {\n alpha: boolean;\n invert: boolean;\n};\n\nexport const invertDefaultValues: InvertOwnProps = {\n alpha: false,\n invert: true,\n};\n\n/**\n * @example\n * const filter = new Invert();\n * object.filters.push(filter);\n * object.applyFilters(canvas.renderAll.bind(canvas));\n */\nexport class Invert extends BaseFilter<'Invert', InvertOwnProps> {\n /**\n * Invert also alpha.\n * @param {Boolean} alpha\n **/\n declare alpha: InvertOwnProps['alpha'];\n\n /**\n * Filter invert. if false, does nothing\n * @param {Boolean} invert\n */\n declare invert: InvertOwnProps['invert'];\n\n static type = 'Invert';\n\n static defaults = invertDefaultValues;\n\n static uniformLocations = ['uInvert', 'uAlpha'];\n\n /**\n * Apply the Invert operation to a Uint8Array representing the pixels of an image.\n *\n * @param {Object} options\n * @param {ImageData} options.imageData The Uint8Array to be filtered.\n */\n applyTo2d({ imageData: { data } }: T2DPipelineState) {\n for (let i = 0; i < data.length; i += 4) {\n data[i] = 255 - data[i];\n data[i + 1] = 255 - data[i + 1];\n data[i + 2] = 255 - data[i + 2];\n\n if (this.alpha) {\n data[i + 3] = 255 - data[i + 3];\n }\n }\n }\n\n protected getFragmentSource(): string {\n return fragmentSource;\n }\n\n /**\n * Invert filter isNeutralState implementation\n * Used only in image applyFilters to discard filters that will not have an effect\n * on the image\n * @param {Object} options\n **/\n isNeutralState() {\n return !this.invert;\n }\n\n /**\n * Send data from this filter to its shader program's uniforms.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n */\n sendUniformData(\n gl: WebGLRenderingContext,\n uniformLocations: TWebGLUniformLocationMap,\n ) {\n gl.uniform1i(uniformLocations.uInvert, Number(this.invert));\n gl.uniform1i(uniformLocations.uAlpha, Number(this.alpha));\n }\n}\n\nclassRegistry.setClass(Invert);\n","export const fragmentSource = `\n precision highp float;\n uniform sampler2D uTexture;\n uniform float uStepH;\n uniform float uNoise;\n uniform float uSeed;\n varying vec2 vTexCoord;\n float rand(vec2 co, float seed, float vScale) {\n return fract(sin(dot(co.xy * vScale ,vec2(12.9898 , 78.233))) * 43758.5453 * (seed + 0.01) / 2.0);\n }\n void main() {\n vec4 color = texture2D(uTexture, vTexCoord);\n color.rgb += (0.5 - rand(vTexCoord, uSeed, 0.1 / uStepH)) * uNoise;\n gl_FragColor = color;\n }\n`;\n","import { BaseFilter } from './BaseFilter';\nimport type { T2DPipelineState, TWebGLUniformLocationMap } from './typedefs';\nimport { classRegistry } from '../ClassRegistry';\nimport { fragmentSource } from './shaders/noise';\n\nexport type NoiseOwnProps = {\n noise: number;\n};\n\nexport const noiseDefaultValues: NoiseOwnProps = {\n noise: 0,\n};\n\n/**\n * Noise filter class\n * @example\n * const filter = new Noise({\n * noise: 700\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n * canvas.renderAll();\n */\nexport class Noise extends BaseFilter<'Noise', NoiseOwnProps> {\n /**\n * Noise value, from\n * @param {Number} noise\n */\n declare noise: NoiseOwnProps['noise'];\n\n static type = 'Noise';\n\n static defaults = noiseDefaultValues;\n\n static uniformLocations = ['uNoise', 'uSeed'];\n\n getFragmentSource() {\n return fragmentSource;\n }\n\n /**\n * Apply the Brightness operation to a Uint8ClampedArray representing the pixels of an image.\n *\n * @param {Object} options\n * @param {ImageData} options.imageData The Uint8ClampedArray to be filtered.\n */\n applyTo2d({ imageData: { data } }: T2DPipelineState) {\n const noise = this.noise;\n for (let i = 0; i < data.length; i += 4) {\n const rand = (0.5 - Math.random()) * noise;\n data[i] += rand;\n data[i + 1] += rand;\n data[i + 2] += rand;\n }\n }\n\n /**\n * Send data from this filter to its shader program's uniforms.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n */\n sendUniformData(\n gl: WebGLRenderingContext,\n uniformLocations: TWebGLUniformLocationMap,\n ) {\n gl.uniform1f(uniformLocations.uNoise, this.noise / 255);\n gl.uniform1f(uniformLocations.uSeed, Math.random());\n }\n\n isNeutralState() {\n return this.noise === 0;\n }\n}\n\nclassRegistry.setClass(Noise);\n","export const fragmentSource = `\n precision highp float;\n uniform sampler2D uTexture;\n uniform float uBlocksize;\n uniform float uStepW;\n uniform float uStepH;\n varying vec2 vTexCoord;\n void main() {\n float blockW = uBlocksize * uStepW;\n float blockH = uBlocksize * uStepH;\n int posX = int(vTexCoord.x / blockW);\n int posY = int(vTexCoord.y / blockH);\n float fposX = float(posX);\n float fposY = float(posY);\n vec2 squareCoords = vec2(fposX * blockW, fposY * blockH);\n vec4 color = texture2D(uTexture, squareCoords);\n gl_FragColor = color;\n }\n`;\n","import { BaseFilter } from './BaseFilter';\nimport type { T2DPipelineState, TWebGLUniformLocationMap } from './typedefs';\nimport { classRegistry } from '../ClassRegistry';\nimport { fragmentSource } from './shaders/pixelate';\n\nexport type PixelateOwnProps = {\n blocksize: number;\n};\n\nexport const pixelateDefaultValues: PixelateOwnProps = {\n blocksize: 4,\n};\n\n/**\n * Pixelate filter class\n * @example\n * const filter = new Pixelate({\n * blocksize: 8\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n */\nexport class Pixelate extends BaseFilter<'Pixelate', PixelateOwnProps> {\n declare blocksize: PixelateOwnProps['blocksize'];\n\n static type = 'Pixelate';\n\n static defaults = pixelateDefaultValues;\n\n static uniformLocations = ['uBlocksize'];\n\n /**\n * Apply the Pixelate operation to a Uint8ClampedArray representing the pixels of an image.\n *\n * @param {Object} options\n * @param {ImageData} options.imageData The Uint8ClampedArray to be filtered.\n */\n applyTo2d({ imageData: { data, width, height } }: T2DPipelineState) {\n for (let i = 0; i < height; i += this.blocksize) {\n for (let j = 0; j < width; j += this.blocksize) {\n const index = i * 4 * width + j * 4;\n const r = data[index];\n const g = data[index + 1];\n const b = data[index + 2];\n const a = data[index + 3];\n\n for (let _i = i; _i < Math.min(i + this.blocksize, height); _i++) {\n for (let _j = j; _j < Math.min(j + this.blocksize, width); _j++) {\n const index = _i * 4 * width + _j * 4;\n data[index] = r;\n data[index + 1] = g;\n data[index + 2] = b;\n data[index + 3] = a;\n }\n }\n }\n }\n }\n\n /**\n * Indicate when the filter is not gonna apply changes to the image\n **/\n isNeutralState() {\n return this.blocksize === 1;\n }\n\n protected getFragmentSource(): string {\n return fragmentSource;\n }\n\n /**\n * Send data from this filter to its shader program's uniforms.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n */\n sendUniformData(\n gl: WebGLRenderingContext,\n uniformLocations: TWebGLUniformLocationMap,\n ) {\n gl.uniform1f(uniformLocations.uBlocksize, this.blocksize);\n }\n}\n\nclassRegistry.setClass(Pixelate);\n","export const fragmentShader = `\nprecision highp float;\nuniform sampler2D uTexture;\nuniform vec4 uLow;\nuniform vec4 uHigh;\nvarying vec2 vTexCoord;\nvoid main() {\n gl_FragColor = texture2D(uTexture, vTexCoord);\n if(all(greaterThan(gl_FragColor.rgb,uLow.rgb)) && all(greaterThan(uHigh.rgb,gl_FragColor.rgb))) {\n gl_FragColor.a = 0.0;\n }\n}\n`;\n","import { classRegistry } from '../ClassRegistry';\nimport { Color } from '../color/Color';\nimport { BaseFilter } from './BaseFilter';\nimport { fragmentShader } from './shaders/removeColor';\nimport type { T2DPipelineState, TWebGLUniformLocationMap } from './typedefs';\n\nexport type RemoveColorOwnProps = {\n color: string;\n distance: number;\n useAlpha: boolean;\n};\n\nexport const removeColorDefaultValues: RemoveColorOwnProps = {\n color: '#FFFFFF',\n distance: 0.02,\n useAlpha: false,\n};\n\n/**\n * Remove white filter class\n * @example\n * const filter = new RemoveColor({\n * threshold: 0.2,\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n * canvas.renderAll();\n */\nexport class RemoveColor extends BaseFilter<\n 'RemoveColor',\n RemoveColorOwnProps\n> {\n /**\n * Color to remove, in any format understood by {@link Color}.\n */\n declare color: RemoveColorOwnProps['color'];\n\n /**\n * distance to actual color, as value up or down from each r,g,b\n * between 0 and 1\n **/\n declare distance: RemoveColorOwnProps['distance'];\n\n /**\n * For color to remove inside distance, use alpha channel for a smoother deletion\n * NOT IMPLEMENTED YET\n **/\n declare useAlpha: RemoveColorOwnProps['useAlpha'];\n\n static type = 'RemoveColor';\n\n static defaults = removeColorDefaultValues;\n\n static uniformLocations = ['uLow', 'uHigh'];\n\n getFragmentSource() {\n return fragmentShader;\n }\n\n /**\n * Applies filter to canvas element\n * @param {Object} canvasEl Canvas element to apply filter to\n */\n applyTo2d({ imageData: { data } }: T2DPipelineState) {\n const distance = this.distance * 255,\n source = new Color(this.color).getSource(),\n lowC = [source[0] - distance, source[1] - distance, source[2] - distance],\n highC = [\n source[0] + distance,\n source[1] + distance,\n source[2] + distance,\n ];\n\n for (let i = 0; i < data.length; i += 4) {\n const r = data[i];\n const g = data[i + 1];\n const b = data[i + 2];\n\n if (\n r > lowC[0] &&\n g > lowC[1] &&\n b > lowC[2] &&\n r < highC[0] &&\n g < highC[1] &&\n b < highC[2]\n ) {\n data[i + 3] = 0;\n }\n }\n }\n\n /**\n * Send data from this filter to its shader program's uniforms.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n */\n sendUniformData(\n gl: WebGLRenderingContext,\n uniformLocations: TWebGLUniformLocationMap,\n ) {\n const source = new Color(this.color).getSource(),\n distance = this.distance,\n lowC = [\n 0 + source[0] / 255 - distance,\n 0 + source[1] / 255 - distance,\n 0 + source[2] / 255 - distance,\n 1,\n ],\n highC = [\n source[0] / 255 + distance,\n source[1] / 255 + distance,\n source[2] / 255 + distance,\n 1,\n ];\n gl.uniform4fv(uniformLocations.uLow, lowC);\n gl.uniform4fv(uniformLocations.uHigh, highC);\n }\n}\n\nclassRegistry.setClass(RemoveColor);\n","import { BaseFilter } from './BaseFilter';\nimport type {\n T2DPipelineState,\n TWebGLPipelineState,\n TWebGLUniformLocationMap,\n} from './typedefs';\nimport { isWebGLPipelineState } from './utils';\nimport { classRegistry } from '../ClassRegistry';\nimport { createCanvasElement } from '../util/misc/dom';\nimport type { XY } from '../Point';\n\nexport type TResizeType = 'bilinear' | 'hermite' | 'sliceHack' | 'lanczos';\n\nexport type ResizeOwnProps = {\n resizeType: TResizeType;\n scaleX: number;\n scaleY: number;\n lanczosLobes: number;\n};\n\nexport type ResizeSerializedProps = ResizeOwnProps;\n\nexport const resizeDefaultValues: ResizeOwnProps = {\n resizeType: 'hermite',\n scaleX: 1,\n scaleY: 1,\n lanczosLobes: 3,\n};\n\ntype ResizeDuring2DResize = Resize & {\n rcpScaleX: number;\n rcpScaleY: number;\n};\n\ntype ResizeDuringWEBGLResize = Resize & {\n rcpScaleX: number;\n rcpScaleY: number;\n horizontal: boolean;\n width: number;\n height: number;\n taps: number[];\n tempScale: number;\n dH: number;\n dW: number;\n};\n\n/**\n * Resize image filter class\n * @example\n * const filter = new Resize();\n * object.filters.push(filter);\n * object.applyFilters(canvas.renderAll.bind(canvas));\n */\nexport class Resize extends BaseFilter<'Resize', ResizeOwnProps> {\n /**\n * Resize type\n * for webgl resizeType is just lanczos, for canvas2d can be:\n * bilinear, hermite, sliceHack, lanczos.\n */\n declare resizeType: ResizeOwnProps['resizeType'];\n\n /**\n * Scale factor for resizing, x axis\n * @param {Number} scaleX\n */\n declare scaleX: ResizeOwnProps['scaleX'];\n\n /**\n * Scale factor for resizing, y axis\n * @param {Number} scaleY\n */\n declare scaleY: ResizeOwnProps['scaleY'];\n\n /**\n * LanczosLobes parameter for lanczos filter, valid for resizeType lanczos\n * @param {Number} lanczosLobes\n */\n declare lanczosLobes: ResizeOwnProps['lanczosLobes'];\n\n static type = 'Resize';\n\n static defaults = resizeDefaultValues;\n\n static uniformLocations = ['uDelta', 'uTaps'];\n\n /**\n * Send data from this filter to its shader program's uniforms.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n */\n sendUniformData(\n this: ResizeDuringWEBGLResize,\n gl: WebGLRenderingContext,\n uniformLocations: TWebGLUniformLocationMap,\n ) {\n gl.uniform2fv(\n uniformLocations.uDelta,\n this.horizontal ? [1 / this.width, 0] : [0, 1 / this.height],\n );\n gl.uniform1fv(uniformLocations.uTaps, this.taps);\n }\n\n getFilterWindow(this: ResizeDuringWEBGLResize) {\n const scale = this.tempScale;\n return Math.ceil(this.lanczosLobes / scale);\n }\n\n getCacheKey(this: ResizeDuringWEBGLResize): string {\n const filterWindow = this.getFilterWindow();\n return `${this.type}_${filterWindow}`;\n }\n\n getFragmentSource(this: ResizeDuringWEBGLResize): string {\n const filterWindow = this.getFilterWindow();\n return this.generateShader(filterWindow);\n }\n\n getTaps(this: ResizeDuringWEBGLResize) {\n const lobeFunction = this.lanczosCreate(this.lanczosLobes),\n scale = this.tempScale,\n filterWindow = this.getFilterWindow(),\n taps = new Array(filterWindow);\n for (let i = 1; i <= filterWindow; i++) {\n taps[i - 1] = lobeFunction(i * scale);\n }\n return taps;\n }\n\n /**\n * Generate vertex and shader sources from the necessary steps numbers\n * @param {Number} filterWindow\n */\n generateShader(filterWindow: number) {\n const offsets = new Array(filterWindow);\n for (let i = 1; i <= filterWindow; i++) {\n offsets[i - 1] = `${i}.0 * uDelta`;\n }\n return `\n precision highp float;\n uniform sampler2D uTexture;\n uniform vec2 uDelta;\n varying vec2 vTexCoord;\n uniform float uTaps[${filterWindow}];\n void main() {\n vec4 color = texture2D(uTexture, vTexCoord);\n float sum = 1.0;\n ${offsets\n .map(\n (offset, i) => `\n color += texture2D(uTexture, vTexCoord + ${offset}) * uTaps[${i}] + texture2D(uTexture, vTexCoord - ${offset}) * uTaps[${i}];\n sum += 2.0 * uTaps[${i}];\n `,\n )\n .join('\\n')}\n gl_FragColor = color / sum;\n }\n `;\n }\n\n applyToForWebgl(this: ResizeDuringWEBGLResize, options: TWebGLPipelineState) {\n options.passes++;\n this.width = options.sourceWidth;\n this.horizontal = true;\n this.dW = Math.round(this.width * this.scaleX);\n this.dH = options.sourceHeight;\n this.tempScale = this.dW / this.width;\n this.taps = this.getTaps();\n options.destinationWidth = this.dW;\n super.applyTo(options);\n options.sourceWidth = options.destinationWidth;\n\n this.height = options.sourceHeight;\n this.horizontal = false;\n this.dH = Math.round(this.height * this.scaleY);\n this.tempScale = this.dH / this.height;\n this.taps = this.getTaps();\n options.destinationHeight = this.dH;\n super.applyTo(options);\n options.sourceHeight = options.destinationHeight;\n }\n\n /**\n * Apply the resize filter to the image\n * Determines whether to use WebGL or Canvas2D based on the options.webgl flag.\n *\n * @param {Object} options\n * @param {Number} options.passes The number of filters remaining to be executed\n * @param {Boolean} options.webgl Whether to use webgl to render the filter.\n * @param {WebGLTexture} options.sourceTexture The texture setup as the source to be filtered.\n * @param {WebGLTexture} options.targetTexture The texture where filtered output should be drawn.\n * @param {WebGLRenderingContext} options.context The GL context used for rendering.\n * @param {Object} options.programCache A map of compiled shader programs, keyed by filter type.\n */\n applyTo(options: TWebGLPipelineState | T2DPipelineState) {\n if (isWebGLPipelineState(options)) {\n (this as unknown as ResizeDuringWEBGLResize).applyToForWebgl(options);\n } else {\n (this as unknown as ResizeDuring2DResize).applyTo2d(options);\n }\n }\n\n isNeutralState() {\n return this.scaleX === 1 && this.scaleY === 1;\n }\n\n lanczosCreate(lobes: number) {\n return (x: number) => {\n if (x >= lobes || x <= -lobes) {\n return 0.0;\n }\n if (x < 1.1920929e-7 && x > -1.1920929e-7) {\n return 1.0;\n }\n x *= Math.PI;\n const xx = x / lobes;\n return ((Math.sin(x) / x) * Math.sin(xx)) / xx;\n };\n }\n\n applyTo2d(this: ResizeDuring2DResize, options: T2DPipelineState) {\n const imageData = options.imageData,\n scaleX = this.scaleX,\n scaleY = this.scaleY;\n\n this.rcpScaleX = 1 / scaleX;\n this.rcpScaleY = 1 / scaleY;\n\n const oW = imageData.width;\n const oH = imageData.height;\n const dW = Math.round(oW * scaleX);\n const dH = Math.round(oH * scaleY);\n let newData: ImageData;\n\n if (this.resizeType === 'sliceHack') {\n newData = this.sliceByTwo(options, oW, oH, dW, dH);\n } else if (this.resizeType === 'hermite') {\n newData = this.hermiteFastResize(options, oW, oH, dW, dH);\n } else if (this.resizeType === 'bilinear') {\n newData = this.bilinearFiltering(options, oW, oH, dW, dH);\n } else if (this.resizeType === 'lanczos') {\n newData = this.lanczosResize(options, oW, oH, dW, dH);\n } else {\n // this should never trigger, is here just for safety net.\n newData = new ImageData(dW, dH);\n }\n options.imageData = newData;\n }\n\n /**\n * Filter sliceByTwo\n * @param {Object} canvasEl Canvas element to apply filter to\n * @param {Number} oW Original Width\n * @param {Number} oH Original Height\n * @param {Number} dW Destination Width\n * @param {Number} dH Destination Height\n * @returns {ImageData}\n */\n sliceByTwo(\n options: T2DPipelineState,\n oW: number,\n oH: number,\n dW: number,\n dH: number,\n ) {\n const imageData = options.imageData;\n const mult = 0.5;\n let doneW = false;\n let doneH = false;\n let stepW = oW * mult;\n let stepH = oH * mult;\n const resources = options.filterBackend.resources;\n let sX = 0;\n let sY = 0;\n const dX = oW;\n let dY = 0;\n if (!resources.sliceByTwo) {\n resources.sliceByTwo = createCanvasElement();\n }\n const tmpCanvas = resources.sliceByTwo;\n if (tmpCanvas.width < oW * 1.5 || tmpCanvas.height < oH) {\n tmpCanvas.width = oW * 1.5;\n tmpCanvas.height = oH;\n }\n const ctx = tmpCanvas.getContext('2d')!;\n ctx.clearRect(0, 0, oW * 1.5, oH);\n ctx.putImageData(imageData, 0, 0);\n\n dW = Math.floor(dW);\n dH = Math.floor(dH);\n\n while (!doneW || !doneH) {\n oW = stepW;\n oH = stepH;\n if (dW < Math.floor(stepW * mult)) {\n stepW = Math.floor(stepW * mult);\n } else {\n stepW = dW;\n doneW = true;\n }\n if (dH < Math.floor(stepH * mult)) {\n stepH = Math.floor(stepH * mult);\n } else {\n stepH = dH;\n doneH = true;\n }\n ctx.drawImage(tmpCanvas, sX, sY, oW, oH, dX, dY, stepW, stepH);\n sX = dX;\n sY = dY;\n dY += stepH;\n }\n return ctx.getImageData(sX, sY, dW, dH);\n }\n\n /**\n * Filter lanczosResize\n * @param {Object} canvasEl Canvas element to apply filter to\n * @param {Number} oW Original Width\n * @param {Number} oH Original Height\n * @param {Number} dW Destination Width\n * @param {Number} dH Destination Height\n * @returns {ImageData}\n */\n lanczosResize(\n this: ResizeDuring2DResize,\n options: T2DPipelineState,\n oW: number,\n oH: number,\n dW: number,\n dH: number,\n ): ImageData {\n function process(u: number): ImageData {\n let v, i, weight, idx, a, red, green, blue, alpha, fX, fY;\n center.x = (u + 0.5) * ratioX;\n icenter.x = Math.floor(center.x);\n for (v = 0; v < dH; v++) {\n center.y = (v + 0.5) * ratioY;\n icenter.y = Math.floor(center.y);\n a = 0;\n red = 0;\n green = 0;\n blue = 0;\n alpha = 0;\n for (i = icenter.x - range2X; i <= icenter.x + range2X; i++) {\n if (i < 0 || i >= oW) {\n continue;\n }\n fX = Math.floor(1000 * Math.abs(i - center.x));\n if (!cacheLanc[fX]) {\n cacheLanc[fX] = {};\n }\n for (let j = icenter.y - range2Y; j <= icenter.y + range2Y; j++) {\n if (j < 0 || j >= oH) {\n continue;\n }\n fY = Math.floor(1000 * Math.abs(j - center.y));\n if (!cacheLanc[fX][fY]) {\n cacheLanc[fX][fY] = lanczos(\n Math.sqrt(\n Math.pow(fX * rcpRatioX, 2) + Math.pow(fY * rcpRatioY, 2),\n ) / 1000,\n );\n }\n weight = cacheLanc[fX][fY];\n if (weight > 0) {\n idx = (j * oW + i) * 4;\n a += weight;\n red += weight * srcData[idx];\n green += weight * srcData[idx + 1];\n blue += weight * srcData[idx + 2];\n alpha += weight * srcData[idx + 3];\n }\n }\n }\n idx = (v * dW + u) * 4;\n destData[idx] = red / a;\n destData[idx + 1] = green / a;\n destData[idx + 2] = blue / a;\n destData[idx + 3] = alpha / a;\n }\n\n if (++u < dW) {\n return process(u);\n } else {\n return destImg;\n }\n }\n\n const srcData = options.imageData.data,\n destImg = options.ctx.createImageData(dW, dH),\n destData = destImg.data,\n lanczos = this.lanczosCreate(this.lanczosLobes),\n ratioX = this.rcpScaleX,\n ratioY = this.rcpScaleY,\n rcpRatioX = 2 / this.rcpScaleX,\n rcpRatioY = 2 / this.rcpScaleY,\n range2X = Math.ceil((ratioX * this.lanczosLobes) / 2),\n range2Y = Math.ceil((ratioY * this.lanczosLobes) / 2),\n cacheLanc: Record> = {},\n center: XY = { x: 0, y: 0 },\n icenter: XY = { x: 0, y: 0 };\n\n return process(0);\n }\n\n /**\n * bilinearFiltering\n * @param {Object} canvasEl Canvas element to apply filter to\n * @param {Number} oW Original Width\n * @param {Number} oH Original Height\n * @param {Number} dW Destination Width\n * @param {Number} dH Destination Height\n * @returns {ImageData}\n */\n bilinearFiltering(\n this: ResizeDuring2DResize,\n options: T2DPipelineState,\n oW: number,\n oH: number,\n dW: number,\n dH: number,\n ) {\n let a;\n let b;\n let c;\n let d;\n let x;\n let y;\n let i;\n let j;\n let xDiff;\n let yDiff;\n let chnl;\n let color;\n let offset = 0;\n let origPix;\n const ratioX = this.rcpScaleX;\n const ratioY = this.rcpScaleY;\n const w4 = 4 * (oW - 1);\n const img = options.imageData;\n const pixels = img.data;\n const destImage = options.ctx.createImageData(dW, dH);\n const destPixels = destImage.data;\n for (i = 0; i < dH; i++) {\n for (j = 0; j < dW; j++) {\n x = Math.floor(ratioX * j);\n y = Math.floor(ratioY * i);\n xDiff = ratioX * j - x;\n yDiff = ratioY * i - y;\n origPix = 4 * (y * oW + x);\n\n for (chnl = 0; chnl < 4; chnl++) {\n a = pixels[origPix + chnl];\n b = pixels[origPix + 4 + chnl];\n c = pixels[origPix + w4 + chnl];\n d = pixels[origPix + w4 + 4 + chnl];\n color =\n a * (1 - xDiff) * (1 - yDiff) +\n b * xDiff * (1 - yDiff) +\n c * yDiff * (1 - xDiff) +\n d * xDiff * yDiff;\n destPixels[offset++] = color;\n }\n }\n }\n return destImage;\n }\n\n /**\n * hermiteFastResize\n * @param {Object} canvasEl Canvas element to apply filter to\n * @param {Number} oW Original Width\n * @param {Number} oH Original Height\n * @param {Number} dW Destination Width\n * @param {Number} dH Destination Height\n * @returns {ImageData}\n */\n hermiteFastResize(\n this: ResizeDuring2DResize,\n options: T2DPipelineState,\n oW: number,\n oH: number,\n dW: number,\n dH: number,\n ) {\n const ratioW = this.rcpScaleX,\n ratioH = this.rcpScaleY,\n ratioWHalf = Math.ceil(ratioW / 2),\n ratioHHalf = Math.ceil(ratioH / 2),\n img = options.imageData,\n data = img.data,\n img2 = options.ctx.createImageData(dW, dH),\n data2 = img2.data;\n for (let j = 0; j < dH; j++) {\n for (let i = 0; i < dW; i++) {\n const x2 = (i + j * dW) * 4;\n let weight = 0;\n let weights = 0;\n let weightsAlpha = 0;\n let gxR = 0;\n let gxG = 0;\n let gxB = 0;\n let gxA = 0;\n const centerY = (j + 0.5) * ratioH;\n for (let yy = Math.floor(j * ratioH); yy < (j + 1) * ratioH; yy++) {\n const dy = Math.abs(centerY - (yy + 0.5)) / ratioHHalf,\n centerX = (i + 0.5) * ratioW,\n w0 = dy * dy;\n for (let xx = Math.floor(i * ratioW); xx < (i + 1) * ratioW; xx++) {\n let dx = Math.abs(centerX - (xx + 0.5)) / ratioWHalf;\n const w = Math.sqrt(w0 + dx * dx);\n /* eslint-disable max-depth */\n if (w > 1 && w < -1) {\n continue;\n }\n //hermite filter\n weight = 2 * w * w * w - 3 * w * w + 1;\n if (weight > 0) {\n dx = 4 * (xx + yy * oW);\n //alpha\n gxA += weight * data[dx + 3];\n weightsAlpha += weight;\n //colors\n if (data[dx + 3] < 255) {\n weight = (weight * data[dx + 3]) / 250;\n }\n gxR += weight * data[dx];\n gxG += weight * data[dx + 1];\n gxB += weight * data[dx + 2];\n weights += weight;\n }\n /* eslint-enable max-depth */\n }\n }\n data2[x2] = gxR / weights;\n data2[x2 + 1] = gxG / weights;\n data2[x2 + 2] = gxB / weights;\n data2[x2 + 3] = gxA / weightsAlpha;\n }\n }\n return img2;\n }\n}\n\nclassRegistry.setClass(Resize);\n","export const fragmentSource = `\n precision highp float;\n uniform sampler2D uTexture;\n uniform float uSaturation;\n varying vec2 vTexCoord;\n void main() {\n vec4 color = texture2D(uTexture, vTexCoord);\n float rgMax = max(color.r, color.g);\n float rgbMax = max(rgMax, color.b);\n color.r += rgbMax != color.r ? (rgbMax - color.r) * uSaturation : 0.00;\n color.g += rgbMax != color.g ? (rgbMax - color.g) * uSaturation : 0.00;\n color.b += rgbMax != color.b ? (rgbMax - color.b) * uSaturation : 0.00;\n gl_FragColor = color;\n }\n`;\n","import { BaseFilter } from './BaseFilter';\nimport type { T2DPipelineState, TWebGLUniformLocationMap } from './typedefs';\nimport { classRegistry } from '../ClassRegistry';\nimport { fragmentSource } from './shaders/saturation';\n\nexport type SaturationOwnProps = {\n saturation: number;\n};\n\nexport const saturationDefaultValues: SaturationOwnProps = {\n saturation: 0,\n};\n\n/**\n * Saturate filter class\n * @example\n * const filter = new Saturation({\n * saturation: 1\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n */\nexport class Saturation extends BaseFilter<'Saturation', SaturationOwnProps> {\n /**\n * Saturation value, from -1 to 1.\n * Increases/decreases the color saturation.\n * A value of 0 has no effect.\n *\n * @param {Number} saturation\n */\n declare saturation: SaturationOwnProps['saturation'];\n\n static type = 'Saturation';\n\n static defaults = saturationDefaultValues;\n\n static uniformLocations = ['uSaturation'];\n\n getFragmentSource() {\n return fragmentSource;\n }\n\n /**\n * Apply the Saturation operation to a Uint8ClampedArray representing the pixels of an image.\n *\n * @param {Object} options\n * @param {ImageData} options.imageData The Uint8ClampedArray to be filtered.\n */\n applyTo2d({ imageData: { data } }: T2DPipelineState) {\n const adjust = -this.saturation;\n for (let i = 0; i < data.length; i += 4) {\n const r = data[i];\n const g = data[i + 1];\n const b = data[i + 2];\n const max = Math.max(r, g, b);\n data[i] += max !== r ? (max - r) * adjust : 0;\n data[i + 1] += max !== g ? (max - g) * adjust : 0;\n data[i + 2] += max !== b ? (max - b) * adjust : 0;\n }\n }\n\n /**\n * Send data from this filter to its shader program's uniforms.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n */\n sendUniformData(\n gl: WebGLRenderingContext,\n uniformLocations: TWebGLUniformLocationMap,\n ) {\n gl.uniform1f(uniformLocations.uSaturation, -this.saturation);\n }\n\n isNeutralState() {\n return this.saturation === 0;\n }\n}\n\nclassRegistry.setClass(Saturation);\n","export const fragmentSource = `\n precision highp float;\n uniform sampler2D uTexture;\n uniform float uVibrance;\n varying vec2 vTexCoord;\n void main() {\n vec4 color = texture2D(uTexture, vTexCoord);\n float max = max(color.r, max(color.g, color.b));\n float avg = (color.r + color.g + color.b) / 3.0;\n float amt = (abs(max - avg) * 2.0) * uVibrance;\n color.r += max != color.r ? (max - color.r) * amt : 0.00;\n color.g += max != color.g ? (max - color.g) * amt : 0.00;\n color.b += max != color.b ? (max - color.b) * amt : 0.00;\n gl_FragColor = color;\n }\n`;\n","import { BaseFilter } from './BaseFilter';\nimport type { T2DPipelineState, TWebGLUniformLocationMap } from './typedefs';\nimport { classRegistry } from '../ClassRegistry';\nimport { fragmentSource } from './shaders/vibrance';\n\nexport type VibranceOwnProps = {\n vibrance: number;\n};\n\nexport const vibranceDefaultValues: VibranceOwnProps = {\n vibrance: 0,\n};\n\n/**\n * Vibrance filter class\n * @example\n * const filter = new Vibrance({\n * vibrance: 1\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n */\nexport class Vibrance extends BaseFilter<'Vibrance', VibranceOwnProps> {\n /**\n * Vibrance value, from -1 to 1.\n * Increases/decreases the saturation of more muted colors with less effect on saturated colors.\n * A value of 0 has no effect.\n *\n * @param {Number} vibrance\n */\n declare vibrance: VibranceOwnProps['vibrance'];\n\n static type = 'Vibrance';\n\n static defaults = vibranceDefaultValues;\n\n static uniformLocations = ['uVibrance'];\n\n getFragmentSource() {\n return fragmentSource;\n }\n\n /**\n * Apply the Vibrance operation to a Uint8ClampedArray representing the pixels of an image.\n *\n * @param {Object} options\n * @param {ImageData} options.imageData The Uint8ClampedArray to be filtered.\n */\n applyTo2d({ imageData: { data } }: T2DPipelineState) {\n const adjust = -this.vibrance;\n for (let i = 0; i < data.length; i += 4) {\n const r = data[i];\n const g = data[i + 1];\n const b = data[i + 2];\n const max = Math.max(r, g, b);\n const avg = (r + g + b) / 3;\n const amt = ((Math.abs(max - avg) * 2) / 255) * adjust;\n data[i] += max !== r ? (max - r) * amt : 0;\n data[i + 1] += max !== g ? (max - g) * amt : 0;\n data[i + 2] += max !== b ? (max - b) * amt : 0;\n }\n }\n\n /**\n * Send data from this filter to its shader program's uniforms.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {TWebGLUniformLocationMap} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n */\n sendUniformData(\n gl: WebGLRenderingContext,\n uniformLocations: TWebGLUniformLocationMap,\n ) {\n gl.uniform1f(uniformLocations.uVibrance, -this.vibrance);\n }\n\n isNeutralState() {\n return this.vibrance === 0;\n }\n}\n\nclassRegistry.setClass(Vibrance);\n","// First we set the env variable\n\nimport { setEnv } from './src/env';\nimport { getEnv, getNodeCanvas } from './src/env/node';\n\nsetEnv(getEnv());\n\n// After the env is set we can export everything and expose specific node functionality\n\nimport type { JpegConfig, PngConfig } from 'canvas';\nimport {\n Canvas as CanvasBase,\n StaticCanvas as StaticCanvasBase,\n} from './fabric';\nimport { FabricObject } from './src/shapes/Object/Object';\n\nFabricObject.ownDefaults.objectCaching = false;\n\nexport * from './fabric';\n\nexport class StaticCanvas extends StaticCanvasBase {\n getNodeCanvas() {\n return getNodeCanvas(this.getElement());\n }\n createPNGStream(opts?: PngConfig) {\n return this.getNodeCanvas().createPNGStream(opts);\n }\n createJPEGStream(opts?: JpegConfig) {\n return this.getNodeCanvas().createJPEGStream(opts);\n }\n}\n\n/**\n * **NOTICE**:\n * {@link Canvas} is designed for interactivity.\n * Therefore, using it in node has no benefit.\n * Use {@link StaticCanvas} instead.\n */\nexport class Canvas extends CanvasBase {\n getNodeCanvas() {\n return getNodeCanvas(this.getElement());\n }\n createPNGStream(opts?: PngConfig) {\n return this.getNodeCanvas().createPNGStream(opts);\n }\n createJPEGStream(opts?: JpegConfig) {\n return this.getNodeCanvas().createJPEGStream(opts);\n }\n}\n"],"names":["BaseConfiguration","constructor","_defineProperty","window","devicePixelRatio","Configuration","config","configure","arguments","length","undefined","Object","assign","addFonts","paths","fontPaths","removeFonts","fontFamilys","forEach","fontFamily","clearFonts","restoreDefaults","keys","defaults","reduce","acc","key","log","severity","_len","optionalParams","Array","_key","console","FabricError","Error","message","options","SignalAbortedError","context","GLProbe","WebGLProbe","testPrecision","gl","precision","fragmentSource","fragmentShader","createShader","FRAGMENT_SHADER","shaderSource","compileShader","getShaderParameter","COMPILE_STATUS","queryWebGL","canvas","getContext","maxTextureSize","getParameter","MAX_TEXTURE_SIZE","GLPrecision","find","getExtension","loseContext","isSupported","textureSize","copyPasteData","getEnv","document","isTouchSupported","navigator","maxTouchPoints","dispose","env","setEnv","value","getBrowserEnv","getFabricDocument","getFabricWindow","getDevicePixelRatio","_config$devicePixelRa","Math","max","NodeGLProbe","implForWrapper","jsdomImplForWrapper","utils","JSDOMWindow","JSDOM","decodeURIComponent","resources","pretendToBeVisual","getNodeCanvas","canvasEl","impl","_canvas","_image","element","_currentSrc","_attributes","_classList","Cache","getFontCache","_ref","fontStyle","fontWeight","toLowerCase","charWidthsCache","fontCache","cacheKey","clearFontCache","limitDimsByArea","ar","perfLimitSizeTotal","roughWidth","sqrt","floor","cache","VERSION","version","noop","halfPI","PI","quarterPI","twoMathPi","PiBy180","iMatrix","freeze","DEFAULT_SVG_FONT_SIZE","ALIASING_LIMIT","kRect","CENTER","LEFT","TOP","BOTTOM","RIGHT","NONE","reNewline","MOVING","SCALING","ROTATING","ROTATE","SKEWING","RESIZING","MODIFY_POLY","MODIFY_PATH","CHANGED","SCALE","SCALE_X","SCALE_Y","SKEW_X","SKEW_Y","FILL","STROKE","MODIFIED","JSON","SVG","ClassRegistry","Map","has","classType","getClass","get","setClass","classConstructor","set","type","getSVGClass","SVGTagName","setSVGClass","classRegistry","AnimationRegistry","remove","index","indexOf","splice","cancelAll","animations","animation","abort","cancelByCanvas","filter","_animation$target","target","cancelByTarget","runningAnimations","Observable","on","arg0","handler","__eventListeners","entries","eventName","off","push","once","disposers","_ref2","d","disposer","onceHandler","args","call","_removeEventListener","eventListener","_ref3","fire","_this$__eventListener","listenersForEvent","concat","i","removeFromArray","array","idx","cos","angle","angleSlice","abs","sin","sign","Point","y","x","add","that","addEquals","scalarAdd","scalar","scalarAddEquals","subtract","subtractEquals","scalarSubtract","scalarSubtractEquals","multiply","scalarMultiply","scalarMultiplyEquals","divide","scalarDivide","scalarDivideEquals","eq","lt","lte","gt","gte","lerp","t","min","distanceFrom","dx","dy","midPointFrom","toString","setXY","setX","setY","setFromPoint","swap","clone","rotate","radians","origin","ZERO","sinus","cosinus","p","rotated","transform","ignoreOffset","isCollection","fabricObject","isArray","_objects","createCollectionMixin","Base","Collection","_onObjectAdded","object","_onObjectRemoved","_onStackOrderChanged","objects","size","insertAt","_len2","_key2","removed","_len3","_key3","forEachObject","callback","getObjects","_len4","types","_key4","o","isType","item","isEmpty","contains","deep","includes","some","obj","complexity","memo","current","sendObjectToBack","unshift","bringObjectToFront","sendObjectBackwards","intersecting","newIdx","findNewLowerIndex","bringObjectForward","findNewUpperIndex","moveObjectTo","isOverlapping","collectObjects","left","top","width","height","includeIntersecting","tl","br","selectable","visible","intersectsWithRect","isContainedWithinRect","containsPoint","CommonMethods","_setOptions","prop","_setObject","_set","toggle","property","requestAnimFrame","requestAnimationFrame","cancelAnimFrame","handle","cancelAnimationFrame","id","uid","createCanvasElement","createElement","createImage","copyCanvasElement","_newCanvas$getContext","newCanvas","createCanvasElementFor","drawImage","toDataURL","format","quality","isHTMLCanvas","toBlob","Promise","resolve","_","degreesToRadians","degrees","radiansToDegrees","isIdentityMatrix","mat","every","transformPoint","invertTransform","a","r","multiplyTransformMatrices","b","is2x2","multiplyTransformMatrixArray","matrices","reduceRight","product","curr","calcPlaneRotation","atan2","qrDecompose","denom","pow","scaleX","scaleY","skewX","skewY","translateX","translateY","createTranslateMatrix","createRotateMatrix","angleRadiant","cosValue","sinValue","createScaleMatrix","angleToSkew","tan","createSkewXMatrix","skewValue","createSkewYMatrix","calcDimensionsMatrix","flipX","flipY","matrix","composeMatrix","scaleMatrix","loadImage","url","signal","crossOrigin","reject","aborted","img","err","src","addEventListener","done","onload","onerror","removeEventListener","enlivenObjects","reviver","instances","all","map","fromObject","then","fabricInstance","catch","error","instance","finally","enlivenObjectEnlivables","serializedObject","promises","values","enlived","pick","source","pickBy","predicate","toFixed","number","fractionDigits","parseFloat","Number","matrixToSVG","NUM_FRACTION_DIGITS","join","isFiller","filler","toLive","isSerializableFiller","toObject","isPattern","offsetX","isTextObject","_renderText","isPath","_renderPathCommands","isActiveSelection","getScrollLeftTop","doc","getDocumentFromElement","elementLoop","docElement","documentElement","body","scrollLeft","scrollTop","parentNode","host","nodeType","style","position","el","ownerDocument","getWindowFromElement","_el$ownerDocument","defaultView","setCanvasDimensions","ctx","retinaScaling","setAttribute","scale","setCSSDimensions","getElementOffset","_getWindowFromElement","offset","elemStyle","getComputedStyle","parseInt","borderLeftWidth","borderTopWidth","paddingLeft","paddingTop","box","docElem","getBoundingClientRect","scrollLeftTop","clientLeft","clientTop","makeElementUnselectable","onselectstart","userSelect","StaticCanvasDOMManager","createLowerCanvas","lower","getElementById","hasAttribute","_originalCanvasStyle","cssText","classList","cleanupDOM","removeAttribute","setDimensions","calcOffset","staticCanvasDefaults","backgroundVpt","backgroundColor","overlayVpt","overlayColor","includeDefaultValues","svgViewportTransformation","renderOnAddRemove","skipOffscreen","enableRetinaScaling","imageSmoothingEnabled","controlsAboveOverlay","allowTouchScrolling","viewportTransform","StaticCanvas","lowerCanvasEl","_this$elements$lower","elements","contextContainer","_this$elements$lower2","getDefaults","ownDefaults","initElements","_setDimensionsImpl","skipControlsDrawing","calcViewportBoundaries","requestRenderAll","setCoords","getRetinaScaling","_offset","getWidth","getHeight","dimensions","cssOnly","backstoreOnly","hasLostContext","getZoom","setViewportTransform","vpt","zoomToPoint","point","before","newPoint","after","setZoom","absolutePan","relativePan","getElement","clearContext","clearRect","clear","backgroundImage","overlayImage","renderAll","cancelRequestedRender","destroyed","renderCanvas","renderAndReset","nextRenderHandle","disposed","iVpt","vptCoords","tr","bl","drawControls","_ctx","v","path","clipPath","patternQuality","_renderBackground","save","_renderObjects","restore","shouldCache","_transformDone","renderCache","forClipping","drawClipPathOnCanvas","_renderOverlay","__cleanupTask","globalCompositeOperation","zoomX","zoomY","_cacheCanvas","cacheTranslationX","cacheTranslationY","len","render","_renderBackgroundOrOverlay","fill","needsVpt","isAFiller","beginPath","moveTo","lineTo","closePath","fillStyle","offsetY","m","gradientTransform","patternTransform","getCenterPoint","centerObjectH","_centerObject","centerObjectV","centerObject","viewportCenterObject","getVpCenter","viewportCenterObjectH","viewportCenterObjectV","center","toDatalessJSON","propertiesToInclude","toDatalessObject","_toObjectMethod","toJSON","methodName","clipPathData","excludeFromExport","_toObject","__serializeBgOverlay","originalValue","data","bgImage","bgColor","background","overlay","toSVG","markup","_setSVGPreamble","_setSVGHeader","clipPathId","_setSVGBgOverlayColor","_setSVGBgOverlayImage","_setSVGObjects","suppressPreamble","encoding","optViewBox","viewBox","createSVGFontFacesMarkup","createSVGRefElementsMarkup","createSVGClipPathMarkup","toClipPathSVG","shouldTransform","additionalTransform","fontList","styles","styleRow","fontListMarkup","_setSVGObject","bgOrOverlay","repeat","finalWidth","finalHeight","shouldInvert","loadFromJSON","json","serialized","parse","enlivedMap","properties","cloneWithoutData","multiplier","finalMultiplier","toCanvasElement","scaledWidth","scaledHeight","zoom","originalWidth","originalHeight","originalSkipControlsDrawing","newZoom","vp","newVp","originalRetina","objectsToRender","task","destroy","kill","touchEvents","getTouchInfo","event","touchProp","changedTouches","getPointer","scroll","_evt","clientX","clientY","isTouchEvent","pointerType","stopEvent","e","preventDefault","stopPropagation","makeBoundingBoxFromPoints","points","removeTransformFromObject","inverted","finalTransform","calcOwnMatrix","applyTransformToObject","addTransformToObject","otherOptions","setPositionByOrigin","resetObjectTransform","saveObjectTransform","sizeAfterTransform","dimX","dimY","bbox","calcPlaneChangeMatrix","from","to","sendPointToPlane","sendVectorToPlane","sendObjectToPlane","fireEvent","_target$canvas","originOffset","bottom","right","resolveOrigin","originValue","unitVectorX","zero","rotateVector","vector","createVector","magnitude","calcAngleBetweenVectors","crossProduct","dotProduct","calcVectorRotation","getUnitVector","getOrthonormalVector","counterClockwise","isBetweenVectors","AxB","AxT","BxT","NOT_ALLOWED_CURSOR","getActionFromCorner","alreadySelected","corner","control","controls","getActionName","isTransformCentered","originX","originY","invertOrigin","isLocked","lockingKey","commonEventInfo","eventData","pointer","findCornerQuadrant","coord","round","normalizePoint","getRelativeCenterPoint","translateToGivenOrigin","p2","getLocalPoint","padding","localPoint","dragHandler","newLeft","newTop","moveX","moveY","ColorNameMap","aliceblue","antiquewhite","aqua","aquamarine","azure","beige","bisque","black","blanchedalmond","blue","blueviolet","brown","burlywood","cadetblue","chartreuse","chocolate","coral","cornflowerblue","cornsilk","crimson","cyan","darkblue","darkcyan","darkgoldenrod","darkgray","darkgrey","darkgreen","darkkhaki","darkmagenta","darkolivegreen","darkorange","darkorchid","darkred","darksalmon","darkseagreen","darkslateblue","darkslategray","darkslategrey","darkturquoise","darkviolet","deeppink","deepskyblue","dimgray","dimgrey","dodgerblue","firebrick","floralwhite","forestgreen","fuchsia","gainsboro","ghostwhite","gold","goldenrod","gray","grey","green","greenyellow","honeydew","hotpink","indianred","indigo","ivory","khaki","lavender","lavenderblush","lawngreen","lemonchiffon","lightblue","lightcoral","lightcyan","lightgoldenrodyellow","lightgray","lightgrey","lightgreen","lightpink","lightsalmon","lightseagreen","lightskyblue","lightslategray","lightslategrey","lightsteelblue","lightyellow","lime","limegreen","linen","magenta","maroon","mediumaquamarine","mediumblue","mediumorchid","mediumpurple","mediumseagreen","mediumslateblue","mediumspringgreen","mediumturquoise","mediumvioletred","midnightblue","mintcream","mistyrose","moccasin","navajowhite","navy","oldlace","olive","olivedrab","orange","orangered","orchid","palegoldenrod","palegreen","paleturquoise","palevioletred","papayawhip","peachpuff","peru","pink","plum","powderblue","purple","rebeccapurple","red","rosybrown","royalblue","saddlebrown","salmon","sandybrown","seagreen","seashell","sienna","silver","skyblue","slateblue","slategray","slategrey","snow","springgreen","steelblue","teal","thistle","tomato","turquoise","violet","wheat","white","whitesmoke","yellow","yellowgreen","reRGBa","reHSLa","reHex","hue2rgb","q","rgb2Hsl","g","maxValue","minValue","h","s","l","fromAlphaToFloat","endsWith","hexify","toUpperCase","padStart","greyAverage","avg","Color","color","setSource","_source","_tryParsingColor","sourceFromHex","sourceFromRgb","sourceFromHsl","isUnrecognised","getSource","toRgb","toRgba","toHsl","toHsla","toHex","fullHex","toHexa","slice","getAlpha","setAlpha","alpha","toGrayscale","toBlackWhite","threshold","average","bOrW","overlayWith","otherColor","otherAlpha","otherSource","R","G","B","fromRgb","fromRgba","match","parsedValue","fromHsl","fromHsla","match1degrees","parseAngletoDegrees","fromHex","isShortNotation","expandedValue","split","hex","hexCouple","lowercase","numeric","getSvgAttributes","commonAttributes","parseUnit","fontSize","unit","exec","dpi","DPI","parseAlign","align","parsePreserveAspectRatioAttribute","attribute","firstPart","secondPart","trim","alignX","alignY","meetOrSlice","colorPropToSVG","inlineStyle","colorValue","opacityValue","opacity","createSVGRect","svgColor","w","FabricObjectSVGExportMixin","getSvgStyles","skipShadow","fillRule","strokeWidth","strokeDashArray","strokeDashOffset","strokeLineCap","strokeLineJoin","strokeMiterLimit","visibility","getSvgFilter","stroke","shadow","getSvgCommons","getSvgTransform","full","calcTransformMatrix","svgTransform","_toSVG","_reviver","_createBaseSVGMarkup","_createBaseClipPathSVGMarkup","objectMarkup","commonPieces","noStyle","withShadow","styleInfo","shadowInfo","vectorEffect","strokeUniform","absoluteClipPath","absolutePositioned","clipPathMarkup","addPaintOrder","paintFirst","getSvgRegex","arr","RegExp","TEXT_DECORATION_THICKNESS","fontProperties","textDecorationProperties","textLayoutProperties","additionalProps","styleProperties","textDefaultValues","_reNewline","_reSpacesAndTabs","_reSpaceAndTab","_reWords","underline","overline","linethrough","textAlign","lineHeight","textBackgroundColor","pathStartOffset","pathSide","pathAlign","charSpacing","deltaY","direction","CACHE_FONT_SIZE","MIN_TEXT_WIDTH","superscript","baseline","subscript","_fontSizeFraction","offsets","_fontSizeMult","JUSTIFY","JUSTIFY_LEFT","JUSTIFY_RIGHT","JUSTIFY_CENTER","reNum","String","raw","viewportSeparator","svgNS","reFontDeclaration","svgValidTagNames","svgViewBoxElements","svgInvalidAncestors","svgValidParents","attributesMap","cx","cy","display","fSize","cPath","svgValidTagNamesRegEx","svgViewBoxElementsRegEx","svgValidParentsRegEx","reViewBoxAttrValue","shadowOffsetRegex","reOffsetsAndBlur","shadowDefaultValues","blur","affectStroke","nonScaling","Shadow","parseShadow","shadowStr","replace","BLUR_BOX","fBoxX","fBoxY","capValue","stateProperties","cacheProperties","fabricObjectDefaultValues","minScaleLimit","objectCaching","centeredRotation","centeredScaling","dirty","interactiveObjectDefaultValues","noScaleCache","lockMovementX","lockMovementY","lockRotation","lockScalingX","lockScalingY","lockSkewingX","lockSkewingY","lockScalingFlip","cornerSize","touchCornerSize","transparentCorners","cornerColor","cornerStrokeColor","cornerStyle","cornerDashArray","hasControls","borderColor","borderDashArray","borderOpacityWhenMoving","borderScaleFactor","hasBorders","selectionBackgroundColor","evented","perPixelTargetFind","activeOn","hoverCursor","moveCursor","normalize","c","asin","elastic","defaultEasing","easeInCubic","easeOutCubic","easeInOutCubic","easeInQuart","easeOutQuart","easeInOutQuart","easeInQuint","easeOutQuint","easeInOutQuint","easeInSine","easeOutSine","easeInOutSine","easeInExpo","easeOutExpo","easeInOutExpo","easeInCirc","easeOutCirc","easeInOutCirc","easeInElastic","normA","normS","normP","easeOutElastic","normC","easeInOutElastic","easeInBack","easeOutBack","easeInOutBack","easeOutBounce","easeInBounce","easeInOutBounce","easeInQuad","easeOutQuad","easeInOutQuad","defaultAbort","AnimationBase","startValue","byValue","duration","delay","easing","onStart","onChange","onComplete","tick","bind","_onStart","_onChange","_onComplete","_abort","endValue","calculate","state","_state","isDone","start","firstTick","timestamp","startTime","Date","register","setTimeout","durationMs","boundDurationMs","durationProgress","valueProgress","unregister","ValueAnimation","timeElapsed","ArrayAnimation","defaultColorEasing","wrapColorCallback","rgba","ColorAnimation","startColor","endColor","isArrayAnimation","animate","animateColor","Intersection","status","append","isPointContained","T","A","infinite","AB","AT","isPointInPolygon","other","hits","inter","intersectSegmentSegment","intersectLineLine","a1","a2","b1","b2","aInfinite","bInfinite","a2xa1x","a2ya1y","b2xb1x","b2yb1y","a1xb1x","a1yb1y","uaT","ubT","uB","ua","ub","segmentsCoincide","intersectSegmentLine","s1","s2","l1","l2","intersectLinePolygon","result","intersectSegmentPolygon","intersectPolygonPolygon","points1","points2","coincidences","intersectPolygonRectangle","r1","r2","topRight","bottomLeft","ObjectGeometry","getX","getXY","getY","getRelativeX","setRelativeX","getRelativeY","setRelativeY","relativePosition","getRelativeXY","group","setRelativeXY","isStrokeAccountedForInDimensions","getCoords","aCoords","calcACoords","coords","intersection","intersectsWithObject","isContainedWithinObject","getBoundingRect","isOnScreen","isPartiallyOnScreen","allPointsAreOutside","getScaledWidth","_getTransformedDimensions","getScaledHeight","scaleToWidth","boundingRectFactor","scaleToHeight","getCanvasRetinaScaling","_this$canvas","getTotalAngle","getViewportTransform","_this$canvas2","rotateMatrix","tMatrix","finalMatrix","dim","transformMatrixKey","skipGroup","prefix","matrixCache","ownMatrixCache","_getNonTransformedDimensions","_calculateCurrentDimensions","dimOptions","preScalingStrokeValue","postScalingStrokeValue","noSkew","finalDimensions","fromOriginX","fromOriginY","toOriginX","toOriginY","translateToCenterPoint","translateToOriginPoint","relCenter","getPointByOrigin","pos","_getLeftTopCoords","FabricObject","name","setOptions","_createCacheCanvas","_cacheContext","_updateCacheCanvas","_limitCacheSize","dims","maxCacheSideLimit","minCacheSideLimit","limX","limY","capped","_getCacheCanvasDimensions","objectScale","getTotalObjectScaling","neededX","neededY","ceil","dimensionsChanged","zoomChanged","shouldRedraw","setTransform","drawingWidth","drawingHeight","translate","needFullTransform","contextTop","getObjectScaling","retina","getObjectOpacity","_constrainScale","isChanged","parent","isNotVisible","_setupCompositeOperation","drawSelectionBackground","_setOpacity","_setShadow","drawCacheOnCanvas","_removeCacheCanvas","drawObject","isCacheDirty","parentClipPaths","hasStroke","hasFill","needsItsOwnCache","ownCaching","isOnACache","willDrawShadow","drawClipPathOnCache","canvasWithClipPath","originalFill","originalStroke","_setClippingProperties","_render","_drawClipPath","createClipPathLayer","prevClipPath","skipCanvas","fillRect","_removeShadow","globalAlpha","_setStrokeStyles","decl","lineWidth","lineCap","lineDashOffset","lineJoin","miterLimit","gradientUnits","_applyPatternForTransformedGradient","strokeStyle","_applyPatternGradientTransform","_setFillStyles","_setLineDash","dashArray","setLineDash","sx","sy","multX","multY","scaling","shadowColor","shadowBlur","browserShadowBlurConstant","shadowOffsetX","shadowOffsetY","_renderPaintInOrder","_renderStroke","_renderFill","_pCtx$createPattern","pCanvas","pCtx","createPattern","_findCenterFromElement","objectForm","cloneAsImage","ImageClass","origParams","originalGroup","originalShadow","canvasProvider","withoutTransform","withoutShadow","boundingRect","shadowOffset","originalCanvas","setOnGroup","animatable","_animate","propIsColor","colorProperties","animationOptions","isDescendantOf","getAncestors","ancestors","findCommonAncestors","fork","otherFork","common","otherAncestors","ancestor","j","hasCommonAncestors","commonAncestors","isInFrontOf","ancestorData","firstCommonAncestor","headOfFork","pop","headOfOtherFork","thisIndex","otherIndex","propertiesToSerialize","customProperties","toFixedBound","val","_removeDefaultValues","hasStaticDefaultValues","baseValues","getPrototypeOf","baseValue","_fromObject","serializedObjectOptions","extraParam","enlivedObjectOptions","wrapWithFireEvent","actionHandler","extraEventInfo","actionPerformed","wrapWithFixedAnchor","centerPoint","constraint","changeObjectWidth","strokePadding","oldWidth","newWidth","changeWidth","renderCircleControl","styleOverride","xSize","sizeX","ySize","sizeY","myLeft","myTop","arc","renderSquareControl","xSizeBy2","ySizeBy2","strokeRect","Control","shouldActivate","controlKey","_fabricObject$canvas","getActiveObject","isControlVisible","getActionHandler","getMouseDownHandler","mouseDownHandler","getMouseUpHandler","mouseUpHandler","cursorStyleHandler","cursorStyle","actionName","getVisibility","_fabricObject$_contro","_fabricObject$_contro2","_controlsVisibility","setVisibility","positionHandler","currentControl","calcCornerCoords","objectCornerSize","centerX","centerY","isTouch","touchSizeX","touchSizeY","rotationStyleHandler","rotateObjectWithSnapping","ex","ey","theta","pivotPoint","lastAngle","curAngle","snapAngle","snapThreshold","rightAngleLocked","leftAngleLocked","hasRotated","rotationWithSnapping","scaleIsProportional","uniformIsToggled","uniScaleKey","uniformScaling","scalingIsForbidden","by","scaleProportionally","lockX","lockY","scaleMap","scaleCursorStyleHandler","n","scaleObject","forbidScaling","signX","signY","gestureScale","distance","original","originalDistance","oldScaleX","oldScaleY","scaleObjectFromCorner","scaleObjectX","scaleObjectY","scalingEqually","scalingX","scalingY","AXIS_KEYS","counterAxis","skew","lockSkewing","flip","skewMap","skewCursorStyleHandler","skewObject","axis","skewingSide","skewKey","skewingBefore","skewingStart","shearingStart","shearing","skewing","atan","changed","dimBefore","dimAfter","compensationFactor","skewHandler","originKey","lockSkewingKey","flipKey","counterOriginKey","counterFlipKey","counterOriginFactor","skewingDirection","finalHandler","skewHandlerX","skewHandlerY","isAltAction","altActionKey","scaleOrSkewActionName","isAlternative","scaleSkewCursorStyleHandler","scalingXOrSkewingY","scalingYOrSkewingX","createObjectDefaultControls","ml","mr","mb","mt","mtr","withConnection","createResizeControls","createTextboxDefaultControls","InteractiveFabricObject","createControls","targetCanvas","_currentTransform","action","startsWith","getActiveControl","__corner","oCoords","findControl","forTouch","cornerEntries","touchCorner","calcOCoords","rMatrix","positionMatrix","startMatrix","transformOptions","forEachControl","_calcCornerCoords","fn","_activeObject","wh","strokeBorders","_drawBorders","drawControlsConnectingLines","_renderControls","styleOptions","shouldDrawBorders","shouldDrawControls","isMoving","drawBorders","forActiveSelection","shouldStroke","setControlVisible","setControlsVisibility","clearContextTop","restoreManually","onDeselect","_options","onSelect","shouldStartDragging","_e","onDragStart","canDrop","renderDragSourceEffect","renderDropTargetEffect","applyMixins","derivedCtor","constructors","baseCtor","getOwnPropertyNames","prototype","defineProperty","getOwnPropertyDescriptor","create","isTransparent","tolerance","getImageData","alphaChannel","findIndexRight","StrokeProjectionsBase","strokeProjectionMagnitude","strokeUniformScalar","createSideVector","projectOrthogonally","applySkew","calcOrthogonalProjection","isSkewed","scaleUnitVector","unitVector","zeroVector","StrokeLineJoinProjections","getOrthogonalRotationFactor","vector1","vector2","C","AC","bisector","orthogonalProjection","correctSide","projectBevel","projections","projectMiter","hypotUnitScalar","miterVector","projectRoundNoSkew","startCircle","endCircle","radiusOnAxisX","radiusOnAxisY","projectRoundWithSkew","circleRadius","newY","furthestY","newX","furthestX","projectRound","isStraightLine","newOrigin","proj0","proj1","comparisonVector","isProj0Start","projectPoints","project","originPoint","projectedPoint","StrokeLineCapProjections","projectButt","projection","projectSquare","strokePointingOut","projectedA","projectStrokeOnPoints","openPath","reduced","cloneStyles","newObj","keyInner","capitalize","string","firstLetterOnly","charAt","escapeXml","segmenter","getSegmenter","Intl","Segmenter","granularity","graphemeSplit","textstring","segments","segment","graphemeSplitImpl","graphemes","chr","getWholeChar","str","code","charCodeAt","isNaN","next","prev","hasStyleChanged","prevStyle","thisStyle","forTextSpans","textDecorationThickness","stylesToArray","text","textLines","stylesArray","charIndex","chars","end","stylesFromArray","stylesObject","styleIndex","SHARED_ATTRIBUTES","selectorMatches","selector","nodeName","classNames","getAttribute","azAz","matcher","splitClassNames","doesSomeParentMatch","selectors","parentMatching","parentElement","elementMatchesRule","firstMatching","getGlobalStylesForElement","cssRules","rule","normalizeAttr","attr","_attributesMap","regex","cleanupSvgAttribute","attributeValue","transforms","transformList","reTransformList","reTransform","reTransformAll","parseTransformAttribute","test","matchAll","transformMatch","matchedParams","operation","rawArgs","arg1","arg2","arg3","arg4","arg5","arg","normalizeValue","parentAttributes","parsed","ouputValue","transformMatrix","fillIndex","strokeIndex","parseFontDeclaration","oStyle","parseStyleObject","parseStyleString","chunk","parseStyleAttribute","colorAttributesMap","setStrokeFillOpacity","attributes","colorAttr","parseAttributes","parentFontSize","ownAttributes","normalizedStyle","normalizedAttr","normalizedValue","font","mergedAttrs","rectDefaultValues","rx","ry","RECT_PROPS","Rect","_initRxRy","isRounded","bezierCurveTo","fromElement","restOfparsedAttributes","ATTRIBUTE_NAMES","Boolean","LAYOUT_TYPE_INITIALIZATION","LAYOUT_TYPE_ADDED","LAYOUT_TYPE_REMOVED","LAYOUT_TYPE_IMPERATIVE","LAYOUT_TYPE_OBJECT_MODIFIED","LAYOUT_TYPE_OBJECT_MODIFYING","getObjectBounds","destinationGroup","currentGroup","objectCenter","accountForStroke","strokeUniformVector","scalingStrokeWidth","sizeVector","LayoutStrategy","calcLayoutResult","shouldPerformLayout","calcBoundingBox","prevStrategy","strategy","shouldLayoutClipPath","getInitialSize","overrides","bboxSize","bboxLeftTop","bboxCenter","actualSize","relativeCorrection","FitContentLayout","LAYOUT_MANAGER","LayoutManager","_subscriptions","performLayout","strictContext","bubbles","_prevLayoutStrategy","onBeforeLayout","layoutResult","getLayoutResult","commitLayout","onAfterLayout","attachHandlers","trigger","subscribe","unsubscribe","_context","delete","unsubscribeTargets","targets","subscribeTargets","tricklingContext","layoutManager","prevCenter","nextCenter","correction","layoutObjects","_context$x","_context$y","layoutObject","bubblingContext","NoopLayoutManager","groupDefaultValues","subTargetCheck","interactive","Group","groupInit","_options$layoutManage","__objectSelectionTracker","__objectSelectionMonitor","__objectSelectionDisposer","enterGroup","canEnterGroup","_filterObjectsBeforeEnteringGroup","allowedObjects","_onAfterObjectsChange","removeParentTransform","exitGroup","_shouldSetNestedCoords","removeAll","_activeObjects","selected","activeObjects","_watchObject","watch","_enterGroup","activeObject","_exitGroup","ownCache","preserveObjectStacking","triggerLayout","__serializeObjects","method","_includeDefaultValues","originalDefaults","_createSVGBgRect","fillStroke","commons","svgString","bg","abortable","hydratedOptions","layoutClass","strategyClass","groupSVGElements","findScaleToFit","destination","findScaleToCover","commaWsp","reArcCommandPoints","rePathCommand","repeatedCommands","M","segmentToBezier","theta1","theta2","cosTh","sinTh","cx1","cy1","mT","fromX","fromY","costh1","sinth1","costh2","sinth2","toX","toY","cp1X","cp1Y","cp2X","cp2Y","arcToSegments","large","sweep","rotateX","root","sinTheta","px","py","rx2","ry2","py2","px2","pl","_rx","_ry","mTheta","calcVectorAngle","dtheta","mDelta","th3","ux","uy","vx","vy","ta","tb","CB1","CB2","CB3","CB4","getBoundsOfCurve","begx","begy","cp1x","cp1y","cp2x","cp2y","endx","endy","argsString","cachesBoundsOfCurve","boundsOfCurveCache","tvalues","bounds","b2ac","sqrtb2ac","t1","t2","jlen","iterator","getPointOnCubicBezierIterator","fromArcToBeziers","fx","fy","rot","tx","ty","segsNorm","makePathSimpler","x1","y1","destinationPath","previous","controlX","controlY","parsedCommand","converted","calcLineLength","x2","y2","pct","c1","c2","c3","c4","QB1","QB2","QB3","getTangentCubicIterator","p1x","p1y","p2x","p2y","p3x","p3y","p4x","p4y","qb1","qb2","qb3","tangentX","tangentY","getPointOnQuadraticBezierIterator","getTangentQuadraticIterator","invT","pathIterator","tempP","tmpLen","perc","findPercentageForDistance","segInfo","nextLen","nextStep","lastPerc","angleFinder","getPathSegmentsInfo","totalLength","tempInfo","info","basicInfo","command","destX","destY","getPointOnPath","infos","segPercent","rePathCmdAll","regExpArcCommandPoints","reMyNum","commandLengths","parsePath","pathString","_pathString$match","chain","matchStr","commandLetter","commandLength","paramArr","lastIndex","out","newCommand","transformedCommand","getSmoothPathFromPoints","p1","multSignX","multSignY","manyPoints","midPoint","transformPath","pathOffset","pathSegment","newSegment","getRegularPolygonPath","numVertexes","radius","interiorAngle","rotationAdjustment","rad","joinPath","pathData","mergeClipPaths","_b$group","getRandomInt","random","_assignTransformMatrixProps","removeTransformMatrixForSvgParsing","preserveAspectRatioOptions","cropX","cropY","offsetLeft","offsetTop","setStyle","elementStyle","setProperty","CanvasDOMManager","containerClass","upperCanvasEl","createUpperCanvas","upper","applyCanvasStyle","container","createContainerElement","replaceChild","className","removeChild","canvasDefaults","centeredKey","selection","selectionKey","selectionColor","selectionDashArray","selectionBorderColor","selectionLineWidth","selectionFullyContained","defaultCursor","freeDrawingCursor","notAllowedCursor","targetFindTolerance","skipTargetFind","stopContextMenu","fireRightClick","fireMiddleClick","enablePointerEvents","SelectableCanvas","_this$elements$upper","_this$elements$upper2","wrapperEl","_objectsToRender","deselected","_discardActiveObject","_hoveredTarget","_hoveredTargets","_chooseObjectsToRender","contextTopDirty","_groupSelector","isDrawingMode","renderTopLayer","_isCurrentlyDrawing","freeDrawingBrush","_drawSelection","renderTop","setTargetFindTolerance","pixelFindCanvasEl","pixelFindContext","isTargetTransparent","selectionBgc","enhancedTolerance","_isSelectionKeyPressed","sKey","_shouldClearSelection","getActiveObjects","_shouldCenterTransform","modifierKeyPressed","centerTransform","_getOriginFromCorner","controlName","_setupCurrentTransform","_control$getActionHan","getScenePoint","altKey","lastX","lastY","shiftKey","setCursor","cursor","deltaX","extent","strokeOffset","minX","minY","maxX","maxY","dblClickLock","dblClickIsolateObject","isolatedObject","searchPossibleTargets","discardActiveObject","setSearchTargets","_searchTargets","getSearchTargets","findTarget","_targetInfo","subTargets","currentSubTargets","aObjects","targetInfo","currentContainer","currentTarget","fullTargetInfo","activeObjectTargetInfo","activeObjectControl","getViewportPoint","altSelectionKey","_pointIsInObjectSelectionArea","viewportZoom","angleRadians","cosP","sinP","cosPSinP","cosPMinusSinP","_checkTarget","isEditing","viewportPoint","_searchPossibleTargets","subTarget","_viewportPoint","_getPointerImpl","_scenePoint","fromViewport","boundsWidth","boundsHeight","cssScale","_resetTransformEventData","_setBrushStyles","willReadFrequently","getTopContext","getSelectionContext","getSelectionElement","active","_fireSelectionEvents","oldObjects","somethingChanged","invalidate","added","setActiveObject","currentActives","_setActiveObject","prevActiveObject","endCurrentTransform","discarded","_finalizeCurrentTransform","_scaling","originalProperties","_realizeGroupTransformOnObject","layoutProps","originalValues","TextEditingManager","cb","hiddenTextarea","focus","__disposer","exitTextEditing","exitEditing","onMouseMove","_this$target","updateSelectionOnMouseMove","addEventOptions","passive","getEventPoints","scenePoint","addListener","removeListener","syntheticEventConfig","mouse","in","targetIn","targetOut","canvasIn","canvasOut","drag","Canvas","eventHandler","addOrRemove","_getEventPrefix","functor","_eventjsFunctor","canvasElement","eventTypePrefix","_onResize","_onMouseDown","_onMouseMove","_onMouseOut","_onMouseEnter","_onMouseWheel","_onContextMenu","_onClick","_onDragStart","_onDragEnd","_onDragOver","_onDragEnter","_onDragLeave","_onDrop","_onTouchStart","removeListeners","_onMouseUp","_onTouchEnd","clearTimeout","_willAddMouseDown","_cacheTransformEventData","_handleEvent","shared","nestedTarget","_isClick","_dragSource","_onDragProgress","_renderDragEffects","dropTarget","_dropTarget","didDrop","dataTransfer","dropEffect","dragSource","_draggedoverTarget","eventType","_fireEnterLeaveEvents","_basicEventHandler","clicks","detail","_onDblClick","__onMouseDown","__onMouseUp","getPointerId","evt","identifier","pointerId","_isMainEvent","isPrimary","touches","mainTouchId","shouldPreventScrolling","currentActiveObject","__onMouseMove","_shouldRender","_this$_activeObject","isClick","button","_onMouseUpInDrawingMode","shouldRender","targetWasActive","handleSelection","found","originalControl","originalMouseUpHandler","_setCursorFromEvent","extraData","_onMouseDownInDrawingMode","onMouseDown","_onMouseMoveInDrawingMode","onMouseUp","grouped","handleMultiSelection","groupSelector","_fireOverOutEvents","_transformObject","textEditingManager","fireSyntheticInOutEvents","oldTarget","fireCanvas","draggedoverTarget","targetChanged","outOpt","nextTarget","inOpt","previousTarget","localPointer","_performTransformAction","activeSelection","reverse","_target","isAS","prevActiveObjects","multiSelectAdd","klass","newActiveSelection","point1","point2","collectedObjects","linearDefaultCoords","radialDefaultCoords","ifNaN","valueIfNaN","RE_PERCENT","isPercent","parsePercent","NaN","RE_KEY_VALUE_PAIRS","RE_KEY_VALUE","parseColorStop","opacityMultiplier","keyValuePairs","parseColorStops","opacityAttr","colorStops","colorStopEls","getElementsByTagName","parseType","parseGradientUnits","convertPercentUnitsToValues","valuesToConvert","finalValue","propValue","getValue","parseLinearCoords","parseRadialCoords","parseCoords","Gradient","addColorStop","colorStop","preTransform","sort","needsSwap","minRadius","maxRadius","percentageShift","gradient","createLinearGradient","createRadialGradient","svgOptions","viewBoxWidth","viewBoxHeight","Pattern","isImageSource","isCanvasSource","sourceToString","complete","naturalWidth","naturalHeight","patternSource","patternOffsetX","patternOffsetY","patternWidth","patternHeight","BaseBrush","_saveAndTransform","needsFullRender","_resetShadow","_isOutSideCanvas","Path","_setPath","adjustPosition","setBoundingBox","_calcBoundsFromPath","quadraticCurveTo","pathCmd","sourcePath","_getOffsetTransform","digits","_calcDimensions","subpathStartX","subpathStartY","parsedAttributes","isEmptySVGPath","PencilBrush","_points","_hasStraightLine","drawSegment","drawStraightLine","straightLineKey","_prepareForDrawing","_addPoint","limitedToCanvasSize","oldEnd","_finalizeAndAddPath","_reset","convertPointsToSVGPath","createPath","decimatePoints","lastPoint","cDistance","adjustedDistance","newPoints","decimate","CIRCLE_PROPS","circleDefaultValues","startAngle","endAngle","Circle","setRadius","getRadiusX","getRadiusY","startX","startY","endX","endY","largeFlag","sweepFlag","otherParsedAttributes","CircleBrush","drawDot","addPoint","dot","originalRenderOnAddRemove","circles","circle","pointerPoint","getUniqueRects","rects","uniqueRects","uniqueRectsArray","SprayBrush","sprayChunks","sprayChunk","addSprayChunk","renderChunck","chunck","rect","optimizeOverlapping","sprayChunck","density","dotWidthVariance","dotWidth","randomOpacity","PatternBrush","getPatternSrc","dotDistance","patternCanvas","patternCtx","getPattern","pattern","topLeft","coordProps","Line","_setWidthHeight","calcLinePoints","origStrokeStyle","_this$stroke","_x1","_x2","_y1","_y2","xMult","yMult","triangleDefaultValues","Triangle","widthBy2","heightBy2","ellipseDefaultValues","ELLIPSE_PROPS","Ellipse","getRx","getRy","parsePointsAttribute","pointsSplit","parsedPoints","polylineDefaultValues","exactBoundingBox","Polyline","initialized","isOpen","_projectStrokeOnPoints","strokeDiff","bboxNoStroke","layoutProperties","_options$width","_options$height","_options$width2","_options$height2","output","diffX","diffY","Polygon","StyledText","isEmptyStyles","lineIndex","line","p3","styleHas","cleanStyle","stylesCount","letterCount","stylePropertyValue","allStyleObjectPropertiesMatch","graphemeCount","styleObject","stylePropertyHasBeenSet","_textLines","removeStyle","lineNum","charNum","_extendStyles","get2DCursorLocation","_getLineStyle","_setLineStyle","newStyle","_getStyleDeclaration","_setStyleDeclaration","getSelectionStyles","startIndex","endIndex","getStyleAtPosition","getCompleteStyleDeclaration","setSelectionStyles","_forceClearCache","_lineStyle$charIndex","lineStyle","_styleProperties","_deleteStyleDeclaration","_deleteLineStyle","multipleSpacesRegex","dblQuoteRegex","createSVGInlineRect","TextSVGExportMixin","_getSVGLeftTopOffsets","textAndBg","_getSVGTextAndBg","textTop","textLeft","_wrapSVGTextAndBg","textSvg","lineTop","getHeightOfLine","textBgRects","textSpans","noShadow","textDecoration","getSvgTextDecoration","textTopOffset","textLeftOffset","lineOffset","_getLineLeftOffset","_setSVGTextLineBg","_setSVGTextLineText","_createTextCharSpan","char","styleDecl","charBox","numFractionDigit","styleProps","getSvgSpanStyles","fillStyles","dySpan","renderLeft","angleAttr","wBy2","renderPoint","isJustify","actualStyle","nextStyle","charsToRender","boxWidth","timeToRender","__charBounds","kernedWidth","leftOffset","heightOfLine","boxStart","currentColor","lastColor","getValueOfPropertyAt","useWhiteSpace","thickness","decoration","measuringContext","getMeasuringContext","FabricText","setPathInfo","initDimensions","segmentsInfo","_splitText","newLines","_splitTextIntoLines","lines","graphemeLines","_unwrappedTextLines","_unwrappedLines","_text","graphemeText","_clearCache","calcTextWidth","cursorWidth","calcTextHeight","enlargeSpaces","diffSpace","currentLineWidth","numberOfSpaces","accumulatedSpace","charBound","spaces","isEndOfWrapping","getLineWidth","missingNewlineOffset","_lineIndex","selectionStart","skipWrapping","_setTextStyles","_renderTextLinesBackground","_renderTextDecoration","_renderTextStroke","_renderTextFill","charStyle","forMeasuring","textBaseline","_getFontDeclaration","maxWidth","_renderTextLine","_renderChars","_getLeftOffset","lineTopOffset","_getTopOffset","lineLeftOffset","drawStart","_measureChar","_char","previousChar","prevCharStyle","fontDeclaration","couple","stylesAreEqual","fontMultiplier","coupleWidth","previousWidth","measureText","getHeightOfChar","measureLine","lineInfo","_measureLine","_getWidthOfCharSpacing","prevGrapheme","graphemeInfo","llength","lineBounds","grapheme","_getGraphemeBox","positionInPath","totalPathLength","_setGraphemeOnPath","numOfSpaces","centerPosition","skipLeft","previousBox","__lineHeights","maxHeight","_renderTextCommon","lineHeights","shortCut","isLtr","currentDirection","drawingLeft","_renderChar","_applyPatternGradientTransformText","handleFiller","fullDecl","shouldFill","fillOffsets","fillText","strokeOffsets","strokeText","setSuperscript","_setScript","setSubscript","schema","loc","lineDiff","__lineWidths","_charStyle$property","topOffset","offsetAligner","lastDecoration","lastFill","lastTickness","currentDecoration","currentFill","currentTickness","currentSize","currentDy","finalTickness","parsedFontFamily","genericFonts","newLine","newText","needsDims","isAddingPath","textAnchor","restOfOptions","textContent","textHeightScaleFactor","lineHeightDiff","scaledDiff","textHeight","offX","DraggableTextDelegate","dragEnterHandler","dragOverHandler","dragLeaveHandler","dragEndHandler","dropHandler","_dispose","isPointerOverSelection","newSelection","getSelectionStartFromPointer","selectionEnd","__mouseDownInPlace","isActive","__dragStartFired","setCursorByClick","initDelayedCursor","__isDraggingOver","getDragStartSelection","__dragStartSelection","setDragImage","_e$dataTransfer","flipFactor","boundaries","_getCursorBoundaries","selectionPosition","diff","bgc","dragImage","border","__dragImageDisposer","appendChild","setData","stringify","effectAllowed","abortCursorAnimation","editable","defaultPrevented","dragStartSelection","targetCanDrop","ev","_e$dataTransfer2","insert","getData","trailing","selectionStartOffset","removeChars","trimEnd","insertChars","enterEditing","_updateTextarea","_e$dataTransfer3","reNonWord","ITextBehavior","initBehavior","_tick","_onTickComplete","_animateCursor","toValue","_currentCursorOpacity","renderCursorOrSelection","_currentTickState","cursorDuration","_this$_currentTickCom","_currentTickCompleteState","restart","cursorDelay","shouldClear","cursorAnimation","restartCursorIfNeeded","selectAll","_fireSelectionChanged","cmdAll","getSelectedText","findWordBoundaryLeft","startFrom","_reSpace","findWordBoundaryRight","findLineBoundaryLeft","findLineBoundaryRight","searchWordBoundary","selectWord","newSelectionStart","newSelectionEnd","selectLine","enterEditingImpl","initHiddenTextarea","_saveEditingProps","_setEditingProps","_textBeforeEdit","activeElement","currentStart","currentEnd","__selectionStartOnMouseDown","editingBorderColor","fromStringToGraphemeSelection","smallerTextStart","graphemeStart","smallerTextEnd","graphemeEnd","fromGraphemeToStringSelection","cursorOffsetCache","inCompositionMode","updateTextareaPosition","updateFromTextArea","textarea","_calcTextareaPosition","desiredPosition","compositionStart","cursorLocation","charHeight","upperCanvas","upperCanvasWidth","upperCanvasHeight","clientWidth","clientHeight","_savedProps","_restoreEditingProps","exitEditingImpl","isTextChanged","_removeExtraneousStyles","removeStyleFromTo","lineStart","charStart","lineEnd","charEnd","styleObj","shiftLineStyles","numericChar","clonedStyles","numericLine","insertNewlineStyleObject","qty","copiedStyle","newLineStyles","originalLineLength","isEndOfLine","someStyleIsCarryingOver","currentCharStyle","numIndex","styleCarriedOver","insertCharStyleObject","quantity","currentLineStyles","currentLineStylesCloned","numericIndex","insertNewStyleBlock","insertedText","cursorLoc","addedLines","linesLength","setSelectionStartEndWithShift","_selectionDirection","ITextKeyBehavior","autocapitalize","autocorrect","autocomplete","spellcheck","wrap","hiddenTextareaContainer","keydown","keyup","input","copy","cut","paste","compositionstart","compositionupdate","compositionend","onKeyDown","keyMap","keysMapRtl","keysMap","keyCode","ctrlKeysMapDown","ctrlKey","metaKey","stopImmediatePropagation","onKeyUp","_copyDone","ctrlKeysMapUp","onInput","fromPaste","updateAndFire","nextText","charCount","nextCharCount","_selectionStart","_selectionEnd","removedText","charDiff","removeFrom","removeTo","textareaSelection","backDelete","copiedText","disableStyleCopyPaste","copiedTextStyle","onCompositionStart","onCompositionEnd","onCompositionUpdate","compositionEnd","_getWidthBeforeCursor","widthBeforeCursor","bound","getDownCursorOffset","isRight","selectionProp","_getSelectionForOffset","indexOnOtherLine","_getIndexOnLine","textAfterCursor","getUpCursorOffset","textBeforeCursor","widthOfCharsOnLine","indexOnLine","charWidth","foundMatch","leftEdge","rightEdge","offsetFromLeftEdge","offsetFromRightEdge","moveCursorDown","_moveCursorUpOrDown","moveCursorUp","moveCursorWithShift","moveCursorWithoutShift","moveCursorLeft","_moveCursorLeftOrRight","_move","newValue","_moveLeft","_moveRight","moveCursorLeftWithoutShift","change","moveCursorLeftWithShift","moveCursorRight","moveCursorRightWithShift","moveCursorRightWithoutShift","notALeftClick","ITextClickBehavior","_mouseDownHandler","doubleClickHandler","tripleClickHandler","draggableTextDelegate","didDrag","mouseOffset","charLength","widthAfter","MOVE_CURSOR_UP","MOVE_CURSOR_DOWN","MOVE_CURSOR_LEFT","MOVE_CURSOR_RIGHT","EXIT_EDITING","applyCanvasTransform","protectedDefaultValues","iTextDefaultValues","cursorColor","caching","IText","setSelectionStart","_updateAndFire","setSelectionEnd","findAncestorsWithClipPath","hasAncestorsWithClipping","drawingCtx","drawingCanvas","renderCursor","renderSelection","clippingCanvas","clippingCtx","clipPathAncestors","skipCaching","_getCursorBoundariesOffsets","__getCursorBoundariesOffsets","renderCursorAt","_renderCursor","getCursorRenderingData","_renderSelection","dragSelection","startLine","endLine","startChar","endChar","realLineHeight","boxEnd","drawHeight","extraTop","drawWidth","compositionColor","getCurrentCharFontSize","cp","_getCurrentCharIndex","getCurrentCharColor","cursorPosition","textboxDefaultValues","minWidth","dynamicMinWidth","_wordJoiners","splitByGrapheme","Textbox","_styleMap","_generateStyleMap","textInfo","realLineCount","realLineCharCount","isWrapping","nextLineIndex","nextOffset","shouldLimit","mapNextLine","p2Number","_wrapText","desiredWidth","getGraphemeDataForRender","wrapped","wordsData","_wrapLine","infix","largestWordWidth","wordsOrGraphemes","wordSplit","word","graphemeArray","_measureWord","charOffset","reservedSpace","additionalSpace","infixWidth","lineJustStarted","wordWidth","getMinWidth","linesToKeep","propNumber","ClipPathLayout","clipPathCenter","FixedLayout","ActiveSelectionLayoutManager","parents","Set","selectedObjects","activeSelectionDefaultValues","multiSelectionStacking","ActiveSelection","findIndex","groups","childrenOverride","Canvas2dFilterBackend","applyFilters","filters","sourceElement","sourceWidth","sourceHeight","desynchronized","imageData","originalImageData","pipelineState","originalEl","filterBackend","applyTo","imageDataPostFilter","putImageData","WebGLFilterBackend","tileSize","Float32Array","setupGLContext","captureGPUInfo","createWebGLCanvas","glOptions","premultipliedAlpha","depth","stencil","antialias","clearColor","cachedTexture","getCachedTexture","destinationWidth","destinationHeight","sourceTexture","createTexture","targetTexture","originalTexture","passes","webgl","aPosition","programCache","pass","tempFbo","createFramebuffer","bindFramebuffer","FRAMEBUFFER","resizeCanvasIfNeeded","copyGLTo2D","bindTexture","TEXTURE_2D","deleteTexture","deleteFramebuffer","clearWebGLCaches","textureCache","textureImageSource","NEAREST","RGBA","UNSIGNED_BYTE","CLAMP_TO_EDGE","TEXTURE_MAG_FILTER","TEXTURE_MIN_FILTER","TEXTURE_WRAP_S","TEXTURE_WRAP_T","texture","texParameteri","texImage2D","uniqueId","evictCachesForKey","glCanvas","sourceY","copyGLTo2DPutImageData","dWidth","dHeight","numBytes","u8","Uint8Array","imageBuffer","u8Clamped","Uint8ClampedArray","readPixels","imgData","ImageData","gpuInfo","renderer","vendor","ext","UNMASKED_RENDERER_WEBGL","UNMASKED_VENDOR_WEBGL","initFilterBackend","enableGLFiltering","getFilterBackend","strict","setFilterBackend","backend","imageDefaultValues","srcFromAttribute","minimumScaleTrigger","imageSmoothing","IMAGE_PROPS","FabricImage","setElement","_element","removeTexture","_originalElement","resizeFilter","applyResizeFilters","elementKey","getCrossOrigin","getOriginalSize","_stroke","filterObj","getSrc","hasCrop","imageMarkup","strokeSvg","imageRendering","getSvgSrc","origFill","filtered","setSrc","minimumScale","elementToFilter","_filteredEl","_filterScalingX","_filterScalingY","_lastScaleX","_lastScaleY","isNeutralState","imgElement","_needsResize","elementToDraw","elWidth","elHeight","sX","sY","sW","sH","maxDestW","maxDestH","_resetWidthHeight","pAR","preserveAspectRatio","pWidth","pHeight","rWidth","rHeight","f","rf","hydratedProps","fromURL","imageOptions","applyViewboxTransform","viewBoxAttr","widthAttr","heightAttr","goodViewbox","missingViewBox","missingDimAttr","translateMatrix","widthDiff","heightDiff","parsedDim","pasedViewBox","createElementNS","firstChild","getTagName","node","tagName","svgInvalidAncestorsRegEx","hasInvalidAncestor","getMultipleNodes","nodeNames","nodeArray","nodeList","getElementsByTagNameNS","parseUseDirectives","nodelist","skipAttributes","useElement","useAttributes","useAttrMap","xlink","href","referencedElement","clonedOriginal","cloneNode","originalAttributes","originalAttrMap","currentTrans","el3","setAttributeNS","childNodes","styleRecord","mergedStyles","entry","gradientsAttrs","xlinkAttr","recursivelyParseGradientsXlink","_gradient$getAttribut","xLink","referencedGradient","children","referenceClone","tagArray","getGradientDefs","elList","gradientDefs","getCSSRules","allRules","styleContents","ruleObj","declaration","propertyValuePairs","pair","_rule","findTag","ElementsParser","clipPaths","regexUrl","createObject","resolveGradient","resolveClipPath","extractPropertyDefinition","storage","gradientDef","usingElement","exactOwner","clipPathElements","objTransformInv","clipPathTag","clipPathOwner","clipPathElement","enlivedClippath","clipRule","gTransform","isValidSvgTag","createEmptyResponse","allElements","parseSVGDocument","descendants","localClipPaths","elementParser","loadSVGFromString","parser","DOMParser","parseFromString","loadSVGFromURL","fetch","response","ok","svgText","ACTION_NAME","createPolyPositionHandler","pointIndex","polyObject","polyActionHandler","poly","mouseLocalPosition","factoryPolyActionHandler","anchorPoint","anchorPointInParentPlane","newAnchorPointInParentPlane","createPolyActionHandler","createPolyControls","calcPathPointPosition","pathObject","commandIndex","movePathPoint","anchorCommand","pathPositionHandler","pathActionHandler","indexFromPrevCommand","previousCommandType","PathPointControl","controlFill","controlStroke","PathControlPointControl","connectToCommandIndex","connectToPointIndex","connectionDashArray","commandType","createControl","commandIndexPos","pointIndexPos","isControlPoint","controlPointStyle","pointStyle","createPathControls","isWebGLPipelineState","isPutImageFaster","sourceCanvas","ArrayBuffer","testContext","testPipelineState","performance","now","drawImageTime","putImageDataTime","highPsourceCode","identityFragmentShader","vertexSource","BaseFilter","getFragmentSource","getVertexSource","createProgram","vertexShader","VERTEX_SHADER","program","getShaderInfoLog","attachShader","linkProgram","getProgramParameter","LINK_STATUS","getProgramInfoLog","uniformLocations","getUniformLocations","uStepW","getUniformLocation","uStepH","attributeLocations","getAttributeLocations","getAttribLocation","locations","sendAttributeData","aPositionData","attributeLocation","buffer","createBuffer","bindBuffer","ARRAY_BUFFER","enableVertexAttribArray","vertexAttribPointer","FLOAT","bufferData","STATIC_DRAW","_setupFrameBuffer","framebufferTexture2D","COLOR_ATTACHMENT0","finish","_swapTextures","temp","applyToWebGL","applyTo2d","getCacheKey","retrieveShader","shader","useProgram","uniform1f","sendUniformData","viewport","drawArrays","TRIANGLE_STRIP","bindAdditionalTexture","textureUnit","activeTexture","TEXTURE0","unbindAdditionalTexture","_gl","_uniformLocations","createHelpLayer","helpLayer","defaultKeys","filterOptions","blendColorFragmentSource","screen","difference","lighten","darken","exclusion","tint","blendColorDefaultValues","mode","BlendColor","tg","alpha1","oR","oG","oB","uniform4fv","uColor","mask","blendImageDefaultValues","BlendImage","image","TEXTURE1","calculateMatrix","blendImage","canvas1","blendData","uniform1i","uImage","uniformMatrix3fv","uTransformMatrix","enlivedImage","blurDefaultValues","Blur","aspectRatio","horizontal","blurValue","getBlurValue","samples","bytesInRow","totalA","minIRow","maxIRow","percent","weight","sampledPixel","localAlpha","delta","chooseRightDelta","uniform2fv","uDelta","blurScale","brightnessDefaultValues","brightness","Brightness","uBrightness","colorMatrixDefaultValues","colorsOnly","ColorMatrix","constants","uniformMatrix4fv","uColorMatrix","uConstants","createColorMatrixFilter","_Class","newClass","Brownie","Vintage","Kodachrome","Technicolor","Polaroid","Sepia","BlackWhite","Composed","subFilters","enlivedFilters","contrastDefaultValues","contrast","Contrast","contrastF","uContrast","Convolute_3_1","Convolute_3_0","Convolute_5_1","Convolute_5_0","Convolute_7_1","Convolute_7_0","Convolute_9_1","Convolute_9_0","convoluteDefaultValues","opaque","Convolute","weights","side","halfSide","sw","sh","createImageData","dst","alphaFac","dstOff","scx","scy","srcOff","wt","uniform1fv","uMatrix","GAMMA","gammaDefaultValues","gamma","Gamma","rInv","gInv","bInv","rgbValues","rgb","uniform3fv","uGamma","lightness","luminosity","grayscaleDefaultValues","Grayscale","uMode","hueRotationDefaultValues","rotation","HueRotation","cosine","sine","aThird","aThirdSqtSin","OneMinusCos","invertDefaultValues","invert","Invert","uInvert","uAlpha","noiseDefaultValues","noise","Noise","rand","uNoise","uSeed","pixelateDefaultValues","blocksize","Pixelate","_i","_j","uBlocksize","removeColorDefaultValues","useAlpha","RemoveColor","lowC","highC","uLow","uHigh","resizeDefaultValues","resizeType","lanczosLobes","Resize","uTaps","taps","getFilterWindow","tempScale","filterWindow","generateShader","getTaps","lobeFunction","lanczosCreate","applyToForWebgl","dW","dH","lobes","xx","rcpScaleX","rcpScaleY","oW","oH","newData","sliceByTwo","hermiteFastResize","bilinearFiltering","lanczosResize","mult","doneW","doneH","stepW","stepH","dX","dY","tmpCanvas","process","u","fX","fY","ratioX","icenter","ratioY","range2X","cacheLanc","range2Y","lanczos","rcpRatioX","rcpRatioY","srcData","destData","destImg","xDiff","yDiff","chnl","origPix","w4","pixels","destImage","destPixels","ratioW","ratioH","ratioWHalf","ratioHHalf","img2","data2","weightsAlpha","gxR","gxG","gxB","gxA","yy","w0","saturationDefaultValues","saturation","Saturation","adjust","uSaturation","vibranceDefaultValues","vibrance","Vibrance","amt","uVibrance","StaticCanvasBase","createPNGStream","opts","createJPEGStream","CanvasBase"],"mappings":"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BC,EAAAA,MAAM,EAAE,MAAM;AACdC,EAAAA,WAAW,EAAE;AACf,CAAC;;ACzJD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,MAAMC,MAAM,GAAGA,MACpB,kJAAkJ;;AAEpJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,MAAMC,MAAM,GAAGA,MACpB,kKAAkK;;AAEpK;AACA;AACA;AACO,MAAMC,KAAK,GAAGA,MAAM,2CAA2C;;AC/GtE;AACA;AACA;AACA;AACA;AACA;AACO,MAAMC,OAAO,GAAGA,CAACpqB,CAAS,EAAEqqB,CAAS,EAAExrB,CAAS,KAAa;EAClE,IAAIA,CAAC,GAAG,CAAC,EAAE;AACTA,IAAAA,CAAC,IAAI,CAAC;AACR,EAAA;EACA,IAAIA,CAAC,GAAG,CAAC,EAAE;AACTA,IAAAA,CAAC,IAAI,CAAC;AACR,EAAA;AACA,EAAA,IAAIA,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE;IACb,OAAOmB,CAAC,GAAG,CAACqqB,CAAC,GAAGrqB,CAAC,IAAI,CAAC,GAAGnB,CAAC;AAC5B,EAAA;AACA,EAAA,IAAIA,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE;AACb,IAAA,OAAOwrB,CAAC;AACV,EAAA;AACA,EAAA,IAAIxrB,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE;AACb,IAAA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BAAiB,EAAE,WAAW;AAC9BC,EAAAA,gBAAgB,EAAE,aAAa;AAE/BrhC,EAAAA,kBAAkB,EAAE,KAAK;AACzBshC,EAAAA,mBAAmB,EAAE,CAAC;AACtBC,EAAAA,cAAc,EAAE,KAAK;AAErBC,EAAAA,eAAe,EAAE,IAAI;AACrBC,EAAAA,cAAc,EAAE,IAAI;AACpBC,EAAAA,eAAe,EAAE,IAAI;AACrBC,EAAAA,mBAAmB,EAAE,KAAK;AAE1B3B,EAAAA,cAAc,EAAE,kBAAkB;AAClCjN,EAAAA,sBAAsB,EAAE;AAC1B,CAAC;;ACtND;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,MAAM6O,gBAAgB,SACnB9pD,cAAY,CAEtB;EAAAhhB,WAAAA,GAAA;AAAA,IAAA,KAAA,CAAA,GAAAO,SAAA,CAAA;AAGE;AAQA;AAUA;AASA;AAKA;AACF;AACA;AACA;AACA;AACA;AACA;AAKE;AACF;AACA;AACA;AACA;AAGE;AACF;AACA;AACA;AACA;IAJEN,eAAA,CAAA,IAAA,EAAA,gBAAA,EAAA,MAAA,CAAA;AAOA;AACF;AACA;AACA;AACA;IAJEA,eAAA,CAAA,IAAA,EAAA,gBAAA,EAAA,MAAA,CAAA;AAmBA;AACF;AACA;AACA;AACA;AAJEA,IAAAA,eAAA,0BAKkC,EAAE,CAAA;AASpC;AACF;AACA;AACA;AACA;AACA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ACA,IAAA,CAAK;AACHC,EAAAA,aAAa,EAAE;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAA,CAAK;AACHC,EAAAA,aAAa,EAAE;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAA,CAAK;AACHC,EAAAA,aAAa,EAAE;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAA,CAAK;AACHC,EAAAA,aAAa,EAAE;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAA,CAAK;AACHC,EAAAA,aAAa,EAAE;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAA,CAAK;AACHC,EAAAA,aAAa,EAAE;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAA,CAAK;AACHC,EAAAA,aAAa,EAAE;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAA;AACA,CAAC;;AC/IM,MAAMC,sBAAyC,GAAG;AACvDC,EAAAA,MAAM,EAAE,KAAK;AACbjsG,EAAAA,MAAM,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;AACpC,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A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"} \ No newline at end of file diff --git a/src/canvas/Canvas.ts b/src/canvas/Canvas.ts index 78626937e97..7dedb845ac4 100644 --- a/src/canvas/Canvas.ts +++ b/src/canvas/Canvas.ts @@ -84,21 +84,21 @@ export class Canvas extends SelectableCanvas implements CanvasOptions { * @type number * @private */ - declare private _willAddMouseDown: number; + private declare _willAddMouseDown: number; /** * Holds a reference to an object on the canvas that is receiving the drag over event. * @type FabricObject * @private */ - declare private _draggedoverTarget?: FabricObject; + private declare _draggedoverTarget?: FabricObject; /** * Holds a reference to an object on the canvas from where the drag operation started * @type FabricObject * @private */ - declare private _dragSource?: FabricObject; + private declare _dragSource?: FabricObject; /** * Holds a reference to an object on the canvas that is the current drop target @@ -107,7 +107,7 @@ export class Canvas extends SelectableCanvas implements CanvasOptions { * @type FabricObject * @private */ - declare private _dropTarget: FabricObject | undefined; + private declare _dropTarget: FabricObject | undefined; /** * a boolean that keeps track of the click state during a cycle of mouse down/up. @@ -544,11 +544,26 @@ export class Canvas extends SelectableCanvas implements CanvasOptions { const clicks = e.detail; if (clicks > 3 || clicks < 2) return; this._cacheTransformEventData(e); - clicks == 2 && e.type === 'dblclick' && this._handleEvent(e, 'dblclick'); + clicks == 2 && e.type === 'dblclick' && this._onDblClick(e); clicks == 3 && this._handleEvent(e, 'tripleclick'); this._resetTransformEventData(); } + /** + * Double-click to select the child nodes of the locked group + * @param e + */ + private _onDblClick(e: TPointerEvent) { + if (this.dblClickLock(e)) { + // Immediately select the clicked child object after locking + this._resetTransformEventData(); + this.__onMouseDown(e); + this.__onMouseUp(e); + return; + } + this._handleEvent(e, 'dblclick'); + } + /** * Return a the id of an event. * returns either the pointerId or the identifier or 0 for the mouse event @@ -1046,6 +1061,20 @@ export class Canvas extends SelectableCanvas implements CanvasOptions { shouldRender = true; } else if (this._shouldClearSelection(e, target)) { this.discardActiveObject(e); + + if (this.isolatedObject && !this._searchTargets) { + this.setSearchTargets([this.isolatedObject]); + const { target } = this.findTarget(e); + // When an object is locked and no selection is specified, if you click on a blank space or object outside the group, the lock is canceled. + if (target !== this.isolatedObject) { + this.isolatedObject = null; + } + this.setSearchTargets(null); + // use __onMouseDown select other object immediately after unlocking + this._resetTransformEventData(); + this.__onMouseDown(e); + return; + } } // we start a group selector rectangle if // selection is enabled diff --git a/src/canvas/CanvasOptions.ts b/src/canvas/CanvasOptions.ts index fc0af62fe67..69f57d2bd7f 100644 --- a/src/canvas/CanvasOptions.ts +++ b/src/canvas/CanvasOptions.ts @@ -247,6 +247,15 @@ export interface CanvasOptions * @default true */ preserveObjectStacking: boolean; + + /** + * Enable double-click to lock the group node. After locking, + * you can select the child nodes in the group node, + * regardless of whether interative and subTargetCheck are enabled in the group. + * @type Boolean + * @default + */ + dblClickIsolateObject: boolean; } export type TCanvasOptions = TOptions; diff --git a/src/canvas/SelectableCanvas.ts b/src/canvas/SelectableCanvas.ts index b34a1208b12..2ed1c17384e 100644 --- a/src/canvas/SelectableCanvas.ts +++ b/src/canvas/SelectableCanvas.ts @@ -51,6 +51,7 @@ import type { CanvasOptions } from './CanvasOptions'; import { canvasDefaults } from './CanvasOptions'; import { Intersection } from '../Intersection'; import { isActiveSelection } from '../util/typeAssertions'; +import { Group } from '../shapes/Group'; export type TargetsInfo = { target?: FabricObject; @@ -219,6 +220,29 @@ export class SelectableCanvas declare preserveObjectStacking: boolean; + /** + * Enable double-click to lock the group node. After locking, + * you can select the child nodes in the group node, + * regardless of whether interative and subTargetCheck are enabled in the group. + * @type Boolean + * @default + */ + declare dblClickIsolateObject: boolean; + + /** + * Double-click the locked node. Currently only group nodes are supported. + * @type Group | null + * @default + */ + isolatedObject: Group | null; + + /** + * Specified search objects + * @type Boolean + * @default null + */ + _searchTargets: FabricObject[] | null; + // event config declare stopContextMenu: boolean; declare fireRightClick: boolean; @@ -283,7 +307,7 @@ export class SelectableCanvas * We do this because there are some HTML DOM inspection functions to get the actual pointer coordinates * @type {Point} */ - declare protected _scenePoint?: Point; + protected declare _scenePoint?: Point; /** * During a mouse event we may need the pointer multiple times in multiple functions. @@ -292,14 +316,14 @@ export class SelectableCanvas * We do this because there are some HTML DOM inspection functions to get the actual pointer coordinates * @type {Point} */ - declare protected _viewportPoint?: Point; + protected declare _viewportPoint?: Point; /** * Holds the informations we cache during an event lifespan * This data is needed many times during an event and we want to avoid to recalculate it * multuple times. */ - declare protected _targetInfo: FullTargetsInfoWithContainer | undefined; + protected declare _targetInfo: FullTargetsInfoWithContainer | undefined; static ownDefaults = canvasDefaults; @@ -317,10 +341,10 @@ export class SelectableCanvas get wrapperEl() { return this.elements.container; } - declare private pixelFindCanvasEl: HTMLCanvasElement; - declare private pixelFindContext: CanvasRenderingContext2D; + private declare pixelFindCanvasEl: HTMLCanvasElement; + private declare pixelFindContext: CanvasRenderingContext2D; - declare protected _isCurrentlyDrawing: boolean; + protected declare _isCurrentlyDrawing: boolean; declare freeDrawingBrush?: BaseBrush; declare _activeObject?: FabricObject; @@ -719,9 +743,60 @@ export class SelectableCanvas } /** - * This function is in charge of deciding which is the object that is the current target of an interaction event. - * For interaction event we mean a pointer related action on the canvas. - * Which is the + * Double-click to lock the group + * @param e + * @returns + */ + dblClickLock(e: TPointerEvent): boolean { + if (this.dblClickIsolateObject) { + const pointer = this.getScenePoint(e); + const objects = this.isolatedObject + ? this.isolatedObject.getObjects() + : this.getObjects(); + const obj = this.searchPossibleTargets(objects, pointer); + if (obj.target) { + if (obj.target instanceof Group) { + this.isolatedObject = obj.target; + this.discardActiveObject(); + // The newly created group object has its child node coords initialized, otherwise it cannot be selected. + obj.target._objects.forEach((o) => { + o.setCoords(); + }); + } else { + // Non-group objects do not handle locking, return false to continue the object's own double-click event + return false; + } + } else { + // cancel isolation + this.isolatedObject = null; + this.discardActiveObject(); + } + return true; + } + return false; + } + + /** + * Manually set the search object + * @param objects + */ + setSearchTargets(objects: FabricObject[] | null) { + this._searchTargets = objects; + } + + /** + * Returns the search object + * @returns + */ + getSearchTargets() { + return ( + this._searchTargets || + (this.isolatedObject ? this.isolatedObject._objects : this._objects) + ); + } + + /** + * Method that determines what object we are clicking on * 11/09/2018 TODO: would be cool if findTarget could discern between being a full target * or the outside part of the corner. * @param {Event} e mouse event @@ -744,7 +819,7 @@ export class SelectableCanvas const pointer = this.getScenePoint(e), activeObject = this._activeObject, aObjects = this.getActiveObjects(), - targetInfo = this.searchPossibleTargets(this._objects, pointer); + targetInfo = this.searchPossibleTargets(this.getSearchTargets(), pointer); const { subTargets: currentSubTargets, @@ -907,7 +982,12 @@ export class SelectableCanvas while (i--) { const target = objects[i]; if (this._checkTarget(target, pointer)) { - if (isCollection(target) && target.subTargetCheck) { + // Double-clicking to lock a node before searching for its child nodes is not enabled + if ( + !this.dblClickIsolateObject && + isCollection(target) && + target.subTargetCheck + ) { const { target: subTarget } = this._searchPossibleTargets( target._objects, pointer,